diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index c8b1258e..0625f2f9 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -72,5 +72,7 @@ "open-vscode", "slides-extended", "obsidian-file-link", - "smart-composer" + "smart-composer", + "unitade", + "text-extractor" ] \ No newline at end of file diff --git a/.obsidian/plugins/cubox-sync/data.json b/.obsidian/plugins/cubox-sync/data.json index 87a77c4c..984f5ee9 100644 --- a/.obsidian/plugins/cubox-sync/data.json +++ b/.obsidian/plugins/cubox-sync/data.json @@ -34,7 +34,7 @@ "contentTemplate": "# {{{title}}}\n\n{{{description}}}\n\n{{{article_title}}} //文章内容标题\n{{{content}}} //文章正文\n\n\n[Read in Cubox]({{{cubox_url}}}) \n[Read Original]({{{url}}}) \n\n---\n\n{{#highlights.length}}\n## Annotations \n\n{{#highlights}}\n> {{{text}}} \n\n{{#note}}\n{{{note}}}\n{{/note}}\n[Link️]({{{cubox_url}}}) \n\n{{/highlights}}\n{{/highlights.length}}", "highlightInContent": true, "dateFormat": "yyyy-MM-dd", - "lastSyncTime": 1757491208206, + "lastSyncTime": 1757494808108, "lastSyncCardId": "7365089645652083844", "lastCardUpdateTime": "2025-09-09T21:50:05.999+0800", "syncing": false diff --git a/.obsidian/plugins/recent-files-obsidian/data.json b/.obsidian/plugins/recent-files-obsidian/data.json index 5629d61b..6e7ae418 100644 --- a/.obsidian/plugins/recent-files-obsidian/data.json +++ b/.obsidian/plugins/recent-files-obsidian/data.json @@ -1,12 +1,36 @@ { "recentFiles": [ + { + "basename": "关于尹飞梅的快速会议的纪要", + "path": "08-Inbox/会议纪要/关于尹飞梅的快速会议的纪要.txt" + }, + { + "basename": "党员大会2025.9.10", + "path": "08-Inbox/会议纪要/党员大会2025.9.10.md" + }, { "basename": "2025-09-10", "path": "01-工作日记/2025-09-10.md" }, { - "basename": "党员大会2025.9.10", - "path": "08-Inbox/会议纪要/党员大会2025.9.10.md" + "basename": "sync text", + "path": "08-Inbox/sync text.txt" + }, + { + "basename": "mac 安装及使用docker_docker for mac-CSDN博客", + "path": "03-学习笔记/Docker/mac 安装及使用docker_docker for mac-CSDN博客.md" + }, + { + "basename": "滴滴出行行程报销单", + "path": "08-Inbox/滴滴出行行程报销单.pdf" + }, + { + "basename": "数据备份流程", + "path": "08-Inbox/数据备份流程.png" + }, + { + "basename": "数据备份实现流程", + "path": "08-Inbox/数据备份实现流程.smm" }, { "basename": "floating-status-bar", @@ -60,10 +84,6 @@ "basename": "AwesomeMarp_red", "path": "08-Inbox/marp/files/AwesomeMarp_red.md" }, - { - "basename": "滴滴出行行程报销单", - "path": "08-Inbox/滴滴出行行程报销单.pdf" - }, { "basename": "floating-status-bar", "path": "09-Templates/floating-status-bar.css" @@ -128,10 +148,6 @@ "basename": "Sample absolute path", "path": "08-Inbox/marp/samples/Sample absolute path.md" }, - { - "basename": "数据备份流程", - "path": "08-Inbox/数据备份流程.png" - }, { "basename": "数据备份流程", "path": "08-Inbox/数据备份流程.xmind" @@ -152,10 +168,6 @@ "basename": "Beamer", "path": "08-Inbox/marp/samples/Beamer.md" }, - { - "basename": "数据备份实现流程", - "path": "08-Inbox/数据备份实现流程.smm" - }, { "basename": "2025-07-04", "path": "08-Inbox/2025-07-04.md" @@ -187,18 +199,6 @@ { "basename": "2025年8月工作与技术实践总结", "path": "08-Inbox/2025年8月工作与技术实践总结.md" - }, - { - "basename": "2025-09 待办事宜", - "path": "00-待办计划/2025-09 待办事宜.md" - }, - { - "basename": "marp-ppt-test", - "path": "08-Inbox/marp-ppt-test.md" - }, - { - "basename": "关于面试+AI模拟-PPT", - "path": "07-个人事务/关于面试+AI模拟-PPT.md" } ], "omittedPaths": [], diff --git a/.obsidian/plugins/rss-reader/data.json b/.obsidian/plugins/rss-reader/data.json index baa1671e..54d948e6 100644 --- a/.obsidian/plugins/rss-reader/data.json +++ b/.obsidian/plugins/rss-reader/data.json @@ -1581,28 +1581,6 @@ "hash": "4c7ceef36fc19b180fc4279ebaaa5859", "highlights": [] }, - { - "title": "001FRONT - Japan PM Ishiba announces resignation", - "description": "

Japanese Prime Minister Shigeru Ishiba addresses a press conference where he announced his decision to resign, on Sunday in Tokyo, Japan.

\n

Japanese Prime Minister Shigeru Ishiba announced on Sunday that he will step down as the head of the Liberal Democratic Party, amid growing calls for him to take responsibility for the party-led ruling coalition's election setback in both houses of parliament.

\n

Addressing a news conference at the prime minister's office in Tokyo, Ishiba said he has "made the painful decision to resign despite still having unfinished tasks", emphasizing that the LDP must undergo genuine renewal and remain a tolerant and inclusive force.

\n

He added that he would not stand as a candidate in the expected LDP leadership election triggered by his resignation.

\n

Ishiba's announcement came a day before the LDP was scheduled to decide whether to hold an early party leadership election, which would essentially be demanding his resignation, according to Japanese media platform Nikkei Asia.

\n

It also followed a formal agreement reached on Thursday with the administration of United States President Donald Trump on 15 percent reciprocal tariffs on Japanese exports to the US.

\n

At Sunday's news conference, Ishiba said he had long considered tariff negotiations with the US a responsibility of his administration. With the signing of a memorandum of understanding last week, Ishiba said the negotiations reached a milestone, which made him decide to make way for his successor.

\n

In September 2024, Ishiba was elected president of the LDP for a term of three years. In October last year, the LDP and its junior coalition partner, the Komeito, lost their majority in the House of Representatives, the lower house of the National Diet of Japan. In July this year, the ruling coalition also lost its majority in the House of Councillors, or the upper house.

\n

In postwar Japan, the head of the LDP — the country's dominant political force since the party's founding in 1955 — has almost always become the prime minister, because the party commands the largest share of seats in the Diet. When an LDP president resigns or is replaced, the post of prime minister typically changes hands as well.

\n

According to the LDP's rules, a new leadership election can be held before the incumbent president's term expires. A majority of LDP members in the Diet and a majority of representatives in the LDP's prefectural branches can jointly request an election for a new president.

\n

Following Ishiba's formal resignation announcement, the LDP is expected to hold an extraordinary executive meeting on Monday morning, at which it will likely decide to cancel the submission of documents for an early party leadership election, according to TBS News, a commercial broadcasting company based in Tokyo.

\n

The Associated Press reported that the LDP is expected to set a date for a party leadership election, likely to be held in early October.

\n

Xinhua contributed to this story.

\n

houjunjie@chinadaily.com.cn

\n



获取更多RSS:
https://feedx.net
https://feedx.site
", - "content": "

Japanese Prime Minister Shigeru Ishiba addresses a press conference where he announced his decision to resign, on Sunday in Tokyo, Japan.

\n

Japanese Prime Minister Shigeru Ishiba announced on Sunday that he will step down as the head of the Liberal Democratic Party, amid growing calls for him to take responsibility for the party-led ruling coalition's election setback in both houses of parliament.

\n

Addressing a news conference at the prime minister's office in Tokyo, Ishiba said he has "made the painful decision to resign despite still having unfinished tasks", emphasizing that the LDP must undergo genuine renewal and remain a tolerant and inclusive force.

\n

He added that he would not stand as a candidate in the expected LDP leadership election triggered by his resignation.

\n

Ishiba's announcement came a day before the LDP was scheduled to decide whether to hold an early party leadership election, which would essentially be demanding his resignation, according to Japanese media platform Nikkei Asia.

\n

It also followed a formal agreement reached on Thursday with the administration of United States President Donald Trump on 15 percent reciprocal tariffs on Japanese exports to the US.

\n

At Sunday's news conference, Ishiba said he had long considered tariff negotiations with the US a responsibility of his administration. With the signing of a memorandum of understanding last week, Ishiba said the negotiations reached a milestone, which made him decide to make way for his successor.

\n

In September 2024, Ishiba was elected president of the LDP for a term of three years. In October last year, the LDP and its junior coalition partner, the Komeito, lost their majority in the House of Representatives, the lower house of the National Diet of Japan. In July this year, the ruling coalition also lost its majority in the House of Councillors, or the upper house.

\n

In postwar Japan, the head of the LDP — the country's dominant political force since the party's founding in 1955 — has almost always become the prime minister, because the party commands the largest share of seats in the Diet. When an LDP president resigns or is replaced, the post of prime minister typically changes hands as well.

\n

According to the LDP's rules, a new leadership election can be held before the incumbent president's term expires. A majority of LDP members in the Diet and a majority of representatives in the LDP's prefectural branches can jointly request an election for a new president.

\n

Following Ishiba's formal resignation announcement, the LDP is expected to hold an extraordinary executive meeting on Monday morning, at which it will likely decide to cancel the submission of documents for an early party leadership election, according to TBS News, a commercial broadcasting company based in Tokyo.

\n

The Associated Press reported that the LDP is expected to set a date for a party leadership election, likely to be held in early October.

\n

Xinhua contributed to this story.

\n

houjunjie@chinadaily.com.cn

\n



获取更多RSS:
https://feedx.net
https://feedx.site
", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/08/content_001_68bdf84aed50ccabe1518fda.htm#001FRONT", - "creator": "", - "pubDate": "Mon, 08 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "15c067199b647d77bd84ea83aa512c0a", - "highlights": [] - }, { "title": "Parallels Desktop 26 正式发布,全面适配 macOS 26 Tahoe|支持安装基于 Intel 芯片的 Windows 系统了", "description": "著名的 macOS 虚拟机软件 Parallels Desktop 26 正式发布,已经全面适配了新操作系统 macOS 26 Tahoe,并支持 Windows 11 25H,并且强化了企业级安全与 IT 管理功能。@Appinn 注:让 Apple 芯片的 Mac 设备安装 Intel 芯片的 ", @@ -9927,28 +9905,6 @@ "hash": "5f74af3509bb7119b65229e9a44505ee", "highlights": [] }, - { - "title": "001FRONT - SHANGHAI 'MODEL' SETS PACE FOR ROBOTAXI SERVICES", - "description": "

Online Scan the code to watch the video.

\n

A self-driving car in Shanghai during the World Artificial Intelligence Conference in Shanghai on July 28.

\n

A Pony.ai self-driving taxi arrives at Beijing Daxing International Airport on Feb 25.

\n

A Radish Run robotaxi drives in a street of Wuhan, Hubei province, on March 20.

\n

A passenger tries ride-hailing commercial service of a robotaxi in Shanghai.

\n

Shanghai teenager Tang Yuyang paid 21 yuan ($2.95) to ride 5.8 kilometers in a robotaxi for the simple joy of becoming a small part of the city's automotive history.

\n

On the morning of Aug 1, he booked a robotaxi ride at the entrance of Century Park, located within the designated operation zone of one of the commercial driverless taxi pilot services in Pudong New Area. Tang was one of the first passengers of the new service offered in Shanghai by the autonomous mobility service provider Pony.ai.

\n

The 16-year-old high school student described the trip as smooth, comfortable and safe, and "close to riding with a human driver, but with a touch of technology".

\n

"When the car arrived after a short wait, many elderly residents nearby stopped to watch with curiosity," he said.

\n

"I felt a little nervous when I got in, but mostly I was excited."

\n

Shanghai has joined Beijing and several other Chinese cities in offering commercial robotaxi services. But what sets the city's services apart is that they are operating in business areas with heavy populations.

\n

As part of the approvals granted for autonomous ride-hailing services in Shanghai, operators must team with traditional taxi companies to tap into their knowledge and experience.

\n

Pony.ai is among eight companies recently licensed to launch driverless commercial robotaxi services in the city.

\n

It has partnered with Jin Jiang International Holdings Co's taxi service arm to launch a regular robotaxi service in Shanghai's Jinqiao and Huamu areas. Operating Monday to Friday from 7:30 am to 9:30 pm, the routes cover key destinations such as the Pudong New Area government, Lalaport shopping mall, Century Park, and the Pudong Football Stadium metro station, linking workplaces, residential areas, and recreational spots.

\n

"Since the pilot service began on Aug 1, the robotaxis have been running at near full capacity, operating more than 10 hours a day with rides in high demand," said Shi Deming, deputy general manager of Jin Jiang's taxi service arm.

\n

The service area was chosen to match city traffic conditions and the requirements of the pilot program, Shi said. With its high population and commercial density, the district offers a good representative environment for testing different scenarios, he added.

\n

"Our long-term goal extends beyond this pilot phase; we are preparing for large-scale commercial deployment, aiming to drive the transformation and upgrading of traditional taxi operations through new quality productive forces," Shi said.

\n

Huang Jun, vice-president of Pony.ai, said: "The Jinqiao and Huamu areas were chosen as the starting point for driverless taxi services because they combine office buildings, upscale residences, and retail facilities, forming a complete urban community with diverse use scenarios."

\n

According to Huang, the selected area also has heavy foot traffic and strong demand for transportation, making it an ideal place to test the service in real-world conditions.

\n

"Looking ahead, we plan to gradually expand the network across Pudong, increase the size of the autonomous fleet, and add more pickup points so more residents can experience robotaxi travel," he said.

\n

Rise of new tech

\n

Shanghai issued its first eight demonstration operation permits for intelligent connected vehicles on July 26 during the 2025 World AI Conference& High-level Meeting on Global AI Governance.

\n

Apart from Pony.ai and Jin Jiang taxi, the recipients included SAIC AI Lab, Utopilot, Baidu Inc's autonomous ride-hailing platform Apollo Go, Shanghai Qiangsheng Holding Co, and Dazhong Transportation Group Co.

\n

On Aug 15, Qiangsheng Taxi and SAIC AI Lab launched their joint intelligent connected vehicle service in the Lin-gang Special Area, now operating as a commercial service.

\n

The service has 58 designated pickup and drop-off points across Lin-gang Special Area, and reaches key locations such as tourist attractions, commercial centers, residential neighborhoods, and public transit hubs. It operates between the peak travel periods of 8 am and 8 pm.

\n

On the same day, Dazhong Transportation Group and Apollo Go jointly launched a driverless vehicle pilot test in the Jinqiao area.

\n

Ge Lei, general manager of marketing with Dazhong's taxi arm, said the fleet includes five fifth-generation Apollo Go vehicles operating without in-vehicle safety operators.

\n

The service runs on weekdays from 9 am to 6 pm, covering an area of about 25 square kilometers, with plans to expand to nearby areas, Ge said. Rides can be booked via the Apollo Go app's mini-program, or through Dazhong's app.

\n

Unlike regular ride-hailing services, passengers must board and alight at designated stops. About 70 such stations are currently in operation in Jinqiao, with more to be added as the service grows.

\n

In April 2023, Dazhong and Apollo Go were given one of Shanghai's first permits for intelligent connected taxis in Jiading district, and conducted test rides with safety drivers onboard. "The experience gained there laid the groundwork for this fully driverless trial in Jinqiao," Ge said.

\n

On Aug 20, IM Motors and SAIC AI Lab jointly launched a driverless robotaxi service linking Shanghai Disney Resort and Shanghai Pudong International Airport.

\n

The service also offers short-distance connections between popular spots within the Shanghai International Resort area, reported the Shanghai Observer news portal. The spots include two hotels at Shanghai Disney Resort and train stations on the Airport Link Line.

\n

The Shanghai model

\n

Unlike other Chinese cities piloting robotaxis, Shanghai requires autonomous driving companies to partner with traditional taxi operators to run services jointly.

\n

"This model draws on the strengths of both sides and offers opportunities for conventional taxi operators to make a transition by minimizing risks," Ge said.

\n

While tech firms focus on self-driving systems, taxi companies bring operational experience, from handling unexpected traffic incidents to ensuring service quality. They also manage tasks such as vehicle cleaning, maintenance, inspections, and charging of new energy vehicles — all crucial for the passenger experience, Ge said.

\n

"As a familiar brand, Dazhong also provides greater public recognition and trust. We formed a strategic partnership with Baidu in October 2022 and secured one of Shanghai's first demonstration permits in April 2023," he said.

\n

"There are three phases throughout the robotaxi development procedure both for vehicles with and without safety operators, namely road testing without passengers, trial rides with safety drivers, and the third stage of paid pilot operations," Ge added.

\n

Fang Yinliang, a partner with consultancy McKinsey, said: "Shanghai's model may be the closest yet to a truly market-ready and commercialized approach for robotaxis. The service is seen as a complex ecosystem that involves technology firms, automakers, and operators — each with different strengths."

\n

Automakers excel at vehicle production and hardware integration, but they often lack the agility to quickly update software or manage daily operations, Fang said.

\n

Tech companies, on the other hand, bring innovation by using big data and algorithms to improve efficiency. However, they are less experienced in hardware manufacturing or managing vehicles and customer services, he said.

\n

"By combining their strengths, the companies can complement each other, identify risks more effectively, and continuously refine both technology and operations," Fang added.

\n

This ecosystem model is not only practical but also essential for robotaxis to reach large-scale deployment, experts said.

\n

Years of preparation

\n

As the Chinese saying goes, "constant dripping wears away the stone". The recent rollout of autonomous driving projects in Shanghai is the result of years of preparation.

\n

Huang, vice-president of Pony.ai, said the company began exploring new ways to integrate self-driving technology into traditional taxis in 2022, partnering with Jin Jiang taxi.

\n

In 2023, the two companies jointly received demonstration permits from the city and launched a pilot autonomous taxi service in Jiading district.

\n

Shi, from Jin Jiang's taxi service arm, said: "Over the years, we have explored various cooperation models with partners. The autonomous vehicle sector is still in its early stages. While many companies may enter the race, only a few are likely to remain long-term."

\n

Dazhong Transportation's Ge said the company first entered the autonomous driving field in 2021, exploring partnerships with several tech firms, including Baidu.

\n

"Eventually, we established a deeper collaboration with Baidu, signing a strategic cooperation agreement in October 2022 after both sides confirmed mutual alignment," he said.

\n

In the past two years, autonomous and intelligent driving technologies have advanced rapidly, and experts believe the industry is approaching a key takeoff point.

\n

"Apart from the technology leap, the rise of new-energy and smart vehicles has boosted consumer awareness of intelligent mobility in China, which means on the demand side, people increasingly believe that technology can deliver real convenience," said Fang from McKinsey.

\n

Fang said the intelligent mobility sector is a large ecosystem involving hardware firms, tech companies, automakers, and operators. Years of industry development have strengthened each player's capabilities, creating the conditions to accelerate the sector's growth.

\n

Nationwide expansion

\n

Derek Hong is a 32-year-old compliance chief at a multinational crypto assets company in Hong Kong.

\n

On Aug 15, he experienced a 10-km robotaxi ride provided by Pony.ai during a business visit to Nansha district in Guangzhou, Guangdong province.

\n

"The whole ride was smooth and steady. You hardly noticed it (the vehicle) was driverless," Hong said. "The in-car screen clearly detected motorcycles, pedestrians, and bicycles. It felt impressive."

\n

He added he had heard about robotaxi trials in a closed area of Hong Kong's New Territories and was eager to try them if given the chance.

\n

Robotaxi services have already expanded across multiple cities in China. Pony.ai, for example, launched the country's first autonomous ride service in Guangzhou in December 2018, initially with safety operators and free rides. In May 2020, the service started in Beijing, followed by Shanghai in July 2021 and Shenzhen in May 2022.

\n

By the second half of 2023, fully driverless commercial operations began in several cities.

\n

In August 2023, fully autonomous rides offered by Pony.ai were approved in Beijing. In December 2023, Nansha district approved the first driverless commercial mixed-traffic trial; in January 2024, Shenzhen's Bao'an district granted a commercial pilot license; and by July 2025, Shanghai issued its first demonstration permit for intelligent connected vehicles.

\n

In a May report on China's robotaxi market, Goldman Sachs estimated the country's Robotaxi TAM(Total Addressable Market) would reach $47 billion by 2035 versus $54 million in 2025, with the driving forces including decreasing costs of hardware and algorithms, and lower operating costs for fleet owners.

\n

"By 2035, we expect revenues per robotaxi in first-tier cities to reach $31,000, higher than current ride-hailing vehicles, due to longer operating hours and efficient route planning," said the report.

\n

Fang said China's robotaxi development is likely leading the world, and has benefited from advances in smart and electric vehicles. Autonomous driving relies on deep-learning AI, and China's vast and diverse market — with varied scenarios and regions — provides a rich environment for training and refining algorithms, which makes the country particularly well-suited for accelerating autonomous driving technology.

\n

"From a safety perspective, autonomous vehicles have a relatively low accident rate. Unlike human drivers, who can experience fatigue or be in a bad mood, self-driving systems remain consistent," said Shi.

\n

Insurance data from the latest coverage for driverless vehicles also reflects confidence in the technology, with premiums lower than those for traditional cars, he said.

\n

"From a business standpoint, full automation could reduce labor costs in the future. While the technology may temporarily affect drivers in the industry, it is also expected to create new roles, such as back-end monitoring staff and safety operators," Shi added.

\n

Contact the writers at wang_ying@chinadaily.com.cn

\n

", - "content": "

Online Scan the code to watch the video.

\n

A self-driving car in Shanghai during the World Artificial Intelligence Conference in Shanghai on July 28.

\n

A Pony.ai self-driving taxi arrives at Beijing Daxing International Airport on Feb 25.

\n

A Radish Run robotaxi drives in a street of Wuhan, Hubei province, on March 20.

\n

A passenger tries ride-hailing commercial service of a robotaxi in Shanghai.

\n

Shanghai teenager Tang Yuyang paid 21 yuan ($2.95) to ride 5.8 kilometers in a robotaxi for the simple joy of becoming a small part of the city's automotive history.

\n

On the morning of Aug 1, he booked a robotaxi ride at the entrance of Century Park, located within the designated operation zone of one of the commercial driverless taxi pilot services in Pudong New Area. Tang was one of the first passengers of the new service offered in Shanghai by the autonomous mobility service provider Pony.ai.

\n

The 16-year-old high school student described the trip as smooth, comfortable and safe, and "close to riding with a human driver, but with a touch of technology".

\n

"When the car arrived after a short wait, many elderly residents nearby stopped to watch with curiosity," he said.

\n

"I felt a little nervous when I got in, but mostly I was excited."

\n

Shanghai has joined Beijing and several other Chinese cities in offering commercial robotaxi services. But what sets the city's services apart is that they are operating in business areas with heavy populations.

\n

As part of the approvals granted for autonomous ride-hailing services in Shanghai, operators must team with traditional taxi companies to tap into their knowledge and experience.

\n

Pony.ai is among eight companies recently licensed to launch driverless commercial robotaxi services in the city.

\n

It has partnered with Jin Jiang International Holdings Co's taxi service arm to launch a regular robotaxi service in Shanghai's Jinqiao and Huamu areas. Operating Monday to Friday from 7:30 am to 9:30 pm, the routes cover key destinations such as the Pudong New Area government, Lalaport shopping mall, Century Park, and the Pudong Football Stadium metro station, linking workplaces, residential areas, and recreational spots.

\n

"Since the pilot service began on Aug 1, the robotaxis have been running at near full capacity, operating more than 10 hours a day with rides in high demand," said Shi Deming, deputy general manager of Jin Jiang's taxi service arm.

\n

The service area was chosen to match city traffic conditions and the requirements of the pilot program, Shi said. With its high population and commercial density, the district offers a good representative environment for testing different scenarios, he added.

\n

"Our long-term goal extends beyond this pilot phase; we are preparing for large-scale commercial deployment, aiming to drive the transformation and upgrading of traditional taxi operations through new quality productive forces," Shi said.

\n

Huang Jun, vice-president of Pony.ai, said: "The Jinqiao and Huamu areas were chosen as the starting point for driverless taxi services because they combine office buildings, upscale residences, and retail facilities, forming a complete urban community with diverse use scenarios."

\n

According to Huang, the selected area also has heavy foot traffic and strong demand for transportation, making it an ideal place to test the service in real-world conditions.

\n

"Looking ahead, we plan to gradually expand the network across Pudong, increase the size of the autonomous fleet, and add more pickup points so more residents can experience robotaxi travel," he said.

\n

Rise of new tech

\n

Shanghai issued its first eight demonstration operation permits for intelligent connected vehicles on July 26 during the 2025 World AI Conference& High-level Meeting on Global AI Governance.

\n

Apart from Pony.ai and Jin Jiang taxi, the recipients included SAIC AI Lab, Utopilot, Baidu Inc's autonomous ride-hailing platform Apollo Go, Shanghai Qiangsheng Holding Co, and Dazhong Transportation Group Co.

\n

On Aug 15, Qiangsheng Taxi and SAIC AI Lab launched their joint intelligent connected vehicle service in the Lin-gang Special Area, now operating as a commercial service.

\n

The service has 58 designated pickup and drop-off points across Lin-gang Special Area, and reaches key locations such as tourist attractions, commercial centers, residential neighborhoods, and public transit hubs. It operates between the peak travel periods of 8 am and 8 pm.

\n

On the same day, Dazhong Transportation Group and Apollo Go jointly launched a driverless vehicle pilot test in the Jinqiao area.

\n

Ge Lei, general manager of marketing with Dazhong's taxi arm, said the fleet includes five fifth-generation Apollo Go vehicles operating without in-vehicle safety operators.

\n

The service runs on weekdays from 9 am to 6 pm, covering an area of about 25 square kilometers, with plans to expand to nearby areas, Ge said. Rides can be booked via the Apollo Go app's mini-program, or through Dazhong's app.

\n

Unlike regular ride-hailing services, passengers must board and alight at designated stops. About 70 such stations are currently in operation in Jinqiao, with more to be added as the service grows.

\n

In April 2023, Dazhong and Apollo Go were given one of Shanghai's first permits for intelligent connected taxis in Jiading district, and conducted test rides with safety drivers onboard. "The experience gained there laid the groundwork for this fully driverless trial in Jinqiao," Ge said.

\n

On Aug 20, IM Motors and SAIC AI Lab jointly launched a driverless robotaxi service linking Shanghai Disney Resort and Shanghai Pudong International Airport.

\n

The service also offers short-distance connections between popular spots within the Shanghai International Resort area, reported the Shanghai Observer news portal. The spots include two hotels at Shanghai Disney Resort and train stations on the Airport Link Line.

\n

The Shanghai model

\n

Unlike other Chinese cities piloting robotaxis, Shanghai requires autonomous driving companies to partner with traditional taxi operators to run services jointly.

\n

"This model draws on the strengths of both sides and offers opportunities for conventional taxi operators to make a transition by minimizing risks," Ge said.

\n

While tech firms focus on self-driving systems, taxi companies bring operational experience, from handling unexpected traffic incidents to ensuring service quality. They also manage tasks such as vehicle cleaning, maintenance, inspections, and charging of new energy vehicles — all crucial for the passenger experience, Ge said.

\n

"As a familiar brand, Dazhong also provides greater public recognition and trust. We formed a strategic partnership with Baidu in October 2022 and secured one of Shanghai's first demonstration permits in April 2023," he said.

\n

"There are three phases throughout the robotaxi development procedure both for vehicles with and without safety operators, namely road testing without passengers, trial rides with safety drivers, and the third stage of paid pilot operations," Ge added.

\n

Fang Yinliang, a partner with consultancy McKinsey, said: "Shanghai's model may be the closest yet to a truly market-ready and commercialized approach for robotaxis. The service is seen as a complex ecosystem that involves technology firms, automakers, and operators — each with different strengths."

\n

Automakers excel at vehicle production and hardware integration, but they often lack the agility to quickly update software or manage daily operations, Fang said.

\n

Tech companies, on the other hand, bring innovation by using big data and algorithms to improve efficiency. However, they are less experienced in hardware manufacturing or managing vehicles and customer services, he said.

\n

"By combining their strengths, the companies can complement each other, identify risks more effectively, and continuously refine both technology and operations," Fang added.

\n

This ecosystem model is not only practical but also essential for robotaxis to reach large-scale deployment, experts said.

\n

Years of preparation

\n

As the Chinese saying goes, "constant dripping wears away the stone". The recent rollout of autonomous driving projects in Shanghai is the result of years of preparation.

\n

Huang, vice-president of Pony.ai, said the company began exploring new ways to integrate self-driving technology into traditional taxis in 2022, partnering with Jin Jiang taxi.

\n

In 2023, the two companies jointly received demonstration permits from the city and launched a pilot autonomous taxi service in Jiading district.

\n

Shi, from Jin Jiang's taxi service arm, said: "Over the years, we have explored various cooperation models with partners. The autonomous vehicle sector is still in its early stages. While many companies may enter the race, only a few are likely to remain long-term."

\n

Dazhong Transportation's Ge said the company first entered the autonomous driving field in 2021, exploring partnerships with several tech firms, including Baidu.

\n

"Eventually, we established a deeper collaboration with Baidu, signing a strategic cooperation agreement in October 2022 after both sides confirmed mutual alignment," he said.

\n

In the past two years, autonomous and intelligent driving technologies have advanced rapidly, and experts believe the industry is approaching a key takeoff point.

\n

"Apart from the technology leap, the rise of new-energy and smart vehicles has boosted consumer awareness of intelligent mobility in China, which means on the demand side, people increasingly believe that technology can deliver real convenience," said Fang from McKinsey.

\n

Fang said the intelligent mobility sector is a large ecosystem involving hardware firms, tech companies, automakers, and operators. Years of industry development have strengthened each player's capabilities, creating the conditions to accelerate the sector's growth.

\n

Nationwide expansion

\n

Derek Hong is a 32-year-old compliance chief at a multinational crypto assets company in Hong Kong.

\n

On Aug 15, he experienced a 10-km robotaxi ride provided by Pony.ai during a business visit to Nansha district in Guangzhou, Guangdong province.

\n

"The whole ride was smooth and steady. You hardly noticed it (the vehicle) was driverless," Hong said. "The in-car screen clearly detected motorcycles, pedestrians, and bicycles. It felt impressive."

\n

He added he had heard about robotaxi trials in a closed area of Hong Kong's New Territories and was eager to try them if given the chance.

\n

Robotaxi services have already expanded across multiple cities in China. Pony.ai, for example, launched the country's first autonomous ride service in Guangzhou in December 2018, initially with safety operators and free rides. In May 2020, the service started in Beijing, followed by Shanghai in July 2021 and Shenzhen in May 2022.

\n

By the second half of 2023, fully driverless commercial operations began in several cities.

\n

In August 2023, fully autonomous rides offered by Pony.ai were approved in Beijing. In December 2023, Nansha district approved the first driverless commercial mixed-traffic trial; in January 2024, Shenzhen's Bao'an district granted a commercial pilot license; and by July 2025, Shanghai issued its first demonstration permit for intelligent connected vehicles.

\n

In a May report on China's robotaxi market, Goldman Sachs estimated the country's Robotaxi TAM(Total Addressable Market) would reach $47 billion by 2035 versus $54 million in 2025, with the driving forces including decreasing costs of hardware and algorithms, and lower operating costs for fleet owners.

\n

"By 2035, we expect revenues per robotaxi in first-tier cities to reach $31,000, higher than current ride-hailing vehicles, due to longer operating hours and efficient route planning," said the report.

\n

Fang said China's robotaxi development is likely leading the world, and has benefited from advances in smart and electric vehicles. Autonomous driving relies on deep-learning AI, and China's vast and diverse market — with varied scenarios and regions — provides a rich environment for training and refining algorithms, which makes the country particularly well-suited for accelerating autonomous driving technology.

\n

"From a safety perspective, autonomous vehicles have a relatively low accident rate. Unlike human drivers, who can experience fatigue or be in a bad mood, self-driving systems remain consistent," said Shi.

\n

Insurance data from the latest coverage for driverless vehicles also reflects confidence in the technology, with premiums lower than those for traditional cars, he said.

\n

"From a business standpoint, full automation could reduce labor costs in the future. While the technology may temporarily affect drivers in the industry, it is also expected to create new roles, such as back-end monitoring staff and safety operators," Shi added.

\n

Contact the writers at wang_ying@chinadaily.com.cn

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/10/content_001_68c08e16ed50ccabe151922b.htm#001FRONT", - "creator": "", - "pubDate": "Wed, 10 Sep 2025 00:21:05 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "9fe80db8fb0d8faafa0a8eba7fb1e0f6", - "highlights": [] - }, { "title": "001FRONT - Rural teachers urged to raise capable youth", "description": "

Children present flowers to their teachers at a kindergarten in Zunhua, Hebei province, on Tuesday to celebrate the 41st Teachers' Day in China, which falls on Wednesday.

\n

President Xi Jinping has urged rural teachers to enhance their teaching skills and nurture more capable young people with sound moral grounding, intellectual ability, physical vigor, aesthetic sensibility and work skills needed to join and carry on the socialist cause.

\n

Xi, who is also general secretary of the Communist Party of China Central Committee and chairman of the Central Military Commission, sent his greetings to teachers and educators across the country ahead of the 41st Teachers' Day, which falls on Wednesday.

\n

In a reply letter to eight rural teachers who participated in the special-post teacher recruitment program, Xi said that many teachers involved in the program have actively devoted themselves to rural education. Rooted in their posts, they have dedicated their efforts to teaching with diligence and selfless commitment, demonstrating the profound sense of mission and responsibility of educators, he said.

\n

Xi emphasized that teachers are the foundation of education. He expressed the hope that educators will remain true to their original aspiration, continuously improve their teaching capabilities, and guide students with care and affection to ensure their healthy growth.

\n

Premier Li Qiang also made an instruction on the program. Li said that educators in the country should fully implement the fundamental task of fostering virtue and holistic development through education and teach in places where the motherland and the people need them the most, contributing more to building a leading country in education.

\n

Launched in 2006, the special-post teacher recruitment program is a central government-funded initiative aimed at recruiting college graduates to teach in rural primary and middle schools across China's central and western regions. Since its implementation, the program has employed a total of 1.18 million teachers, covering more than 30,000 rural schools in over 1,000 counties across 22 provincial-level regions.

\n

In their letter to Xi, eight representatives of the program reported on their experience working at the forefront of rural education, and reiterated their determination to stay committed to their mission and continue teaching in rural areas.

\n

China has adopted several other initiatives to promote rural education.

\n

In 2021, the "Outstanding Teachers Program" was launched to cultivate 10,000 teachers annually to serve high schools in the once-impoverished counties, as well as border counties, in the central and western regions.

\n

Policies aimed at improving teachers' livelihoods, including annual subsidies, salary hikes and the construction of dormitories, have made rural teaching more sustainable. As of last year, 76.23 percent of rural teachers held a bachelor's degree or higher, a dramatic increase compared with a decade ago.

\n

Ma Hongbing, deputy director of the Finance Ministry's Department of Science, Education and Culture, said the central government has invested 45 billion yuan ($6.3 billion) in the past five years to hire and train more high-quality teachers in the central and western regions.

\n

Liu Xiantao, a teacher in Zunyi, Guizhou province, who celebrated his 23rd birthday on Tuesday, said he became interested in the profession of teaching as a young boy because Teachers' Day falls right after his birthday.

\n

Liu, who recently earned a bachelor's degree in history from Beijing Normal University, is among the first group of graduates of the "Outstanding Teachers Program". He currently teaches history at Chacheng Senior High School in Meitan county, a former nationally designated poverty-stricken area in Zunyi.

\n

Liu's decision to return to his roots was deeply influenced by his own educational experience. Growing up in a remote town in Yuqing county of Zunyi, he had limited exposure to the wider world. His primary school Chinese teacher, Ms Li, opened his eyes to the power of knowledge and compassion, Liu said.

\n

Like many of his peers, Liu was tempted by the dynamic urban life in Beijing. But through volunteering and teaching practice in rural schools, he rediscovered his life's purpose.

\n

Chacheng Senior High School, where Liu now works, was recently established to serve students who do not score well in their high school entrance exams. For many, it represents a last chance to continue formal education before possibly turning to low-skilled work or early marriage, he said.

\n

"Every day here is a challenge, but also a gift," he said. "When parents thank me with their voice filled with sincerity, when my students and I win the first place in military training, when I see their eyes light up during a history lesson — these are the moments that make me the happiest, and they happen every day."

\n

This year, Liu's birthday wish is simple, yet profound. "May I become a better teacher over the next year, and may my students achieve satisfactory grades in the next three years and become someone noteworthy in life," he said.

\n

zoushuo@chinadaily.com.cn

\n

", @@ -9971,28 +9927,6 @@ "hash": "b0bdd55f599af4faf164481379198b84", "highlights": [] }, - { - "title": "004CHINA - Fighters and friendship", - "description": "

Models of the P-40 fighter (center) and the I-16 fighter (top right) are on display at the commemorative exhibition marking the 80th anniversary of the victory in the Chinese People's War of Resistance against Japanese Aggression and the World Anti-Fascist War. The exhibition was held at the National Museum of China in Beijing, on Tuesday.

\n

", - "content": "

Models of the P-40 fighter (center) and the I-16 fighter (top right) are on display at the commemorative exhibition marking the 80th anniversary of the victory in the Chinese People's War of Resistance against Japanese Aggression and the World Anti-Fascist War. The exhibition was held at the National Museum of China in Beijing, on Tuesday.

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/10/content_004_68c08e41ed50ccabe1519237.htm#004CHINA", - "creator": "", - "pubDate": "Wed, 10 Sep 2025 00:21:05 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "1d00fbe4fa1997b6ff82a8ebe98e552f", - "highlights": [] - }, { "title": "004CHINA - Evolving tastes drive innovation in watermelons", "description": "

As China's watermelon season draws to a close this year, farmers, consumers and professional testers are of the view that during this scorching summer, selection of the juicy fruit was determined less by weight and volume, and more by taste and quality.

\n

At a cooperative in Panggezhuang in Beijing's Daxing district, 27-year-old Zhang Linghui spent her days tapping, pressing and listening to thousands of melons at the peak of the harvest.

\n

Zhang is one of a growing number of professional "watermelon testers" — specialists hired to judge the fruit's ripeness, sugar levels and texture. With a quick knock, she can tell whether a watermelon is unripe, overripe or just right — and only the best make it to market.

\n

"Each watermelon has a different sound," Zhang said. "Unripe ones are hard, and the bounce hurts your fingers. Overripe melons sound dull and often crack inside. The best are nearly 80 percent ripe," she said.

\n

A skilled watermelon tester must not only have extensive knowledge of cultivation, including the fruit's growth cycle and varietal traits, but also draw on years of experience to accurately judge its quality, she added.

\n

Shang Ling, a 42-year-old Beijing resident, said picking a watermelon felt like opening a blind box. Although she would also tap the fruit to judge its quality before buying it at the supermarket, the result disappointed as often as it delighted.

\n

"But now, with professionals testing them, one is more likely to find a good one," she said.

\n

The emergence of the new trend indicates how consumer expectations are changing in one of the world's biggest watermelon markets. Once considered the luck of the draw, buying a watermelon is increasingly about quantifiable measures such as sweetness, texture and juiciness.

\n

China plants more than 1.33 million hectares of watermelon each year and harvests around 60 million metric tons, about 60 percent of the world's total, according to the United Nations Food and Agriculture Organization. On average, each Chinese consumer eats about 50 kilograms of the fruit annually.

\n

This summer, consumers favored thin-skinned, juicy and naturally ripened melons, according to a July report from the consumption and industry development research institute of JD, a Chinese e-commerce giant. Shoppers in their late 20s to mid-40s drove nearly 70 percent of sales, with younger buyers showing a strong appetite for new varieties, it said.

\n

Beijing's Daxing district, Zhongwei city in the Ningxia Hui autonomous region, the Guangxi Zhuang autonomous region, Dongtai city in Jiangsu province and Shanghai are among the top sources of sales growth, according to the report.

\n

Panggezhuang is the home of the famed Daxing watermelon, a certified geographical indication product known for its crisp sweetness. At the 2,667-hectare planting base, growers are shifting to smaller melons weighing 1 to 1.5 kg. The planting area for traditional large watermelons has already fallen to less than 66.7 hectares.

\n

Meanwhile, farmers are also planting colorful new varieties with orange and yellow flesh or black rind to meet diverse market demands.

\n

Song Shaotang, a local grower, is experimenting with new varieties to keep up with changing tastes. One standout is the Jingmei 3K, bred by the Beijing Academy of Agriculture and Forestry Sciences. The variety has oval-shaped fruit, deep red flesh and high sugar content, making it a hit with both farmers and consumers.

\n

"At our demonstration field, Jingmei 3K yields stayed at about 60 (metric) tons per hectare. Customers like its color and taste," Song said, adding that his cooperative is promoting the variety in larger fields.

\n

Xu Yong, who led the research team of the Jingmei series, said the new varieties are designed to cut breeding costs, resist disease and meet consumer preferences.

\n

"The change from big to small melons shows how production, branding and consumption are all adapting," Xu said.

\n

From bulk harvests of giant fruits to bite-sized melons selected by professional testers, China's watermelon industry is increasingly catering to the precise demands of summer shoppers in search of sweetness.

\n

zhaoyimeng@chinadaily.com.cn

\n

", @@ -10015,28 +9949,6 @@ "hash": "c79fe7c4ee1dcf3ad063876d3bf93ce6", "highlights": [] }, - { - "title": "005CHINA - Green tech to help fight climate change", - "description": "
\n

A national nonprofit academic organization launched a committee focused on green and low-carbon technologies in Beijing on Tuesday, aiming to promote and apply these technologies and contribute Chinese wisdom and solutions to the global green transformation.

\n

The Green and Low-Carbon Technology Application Committee, established by the Innovation Method Society under the auspices of the Ministry of Science and Technology, will focus on China's dual carbon goals to peak its carbon dioxide emissions before 2030 and achieve carbon neutrality before 2060.

\n

"Against the backdrop of global climate change and energy transition, low-carbon technologies have emerged as a pivotal force in driving sustainable economic and social development and achieving the dual carbon goals," said Zhu Junhao, director of the committee and CEO of Green Technology Bank (Shanghai) Co, at the launch ceremony.

\n

"However, the industrialization process of green and low-carbon technologies lags behind, with a technology transfer rate of less than 30 percent. Market applications face challenges of enthusiastic policy support but challenging implementation," Zhu noted.

\n

He added that a trilateral mechanism integrating government guidance, industrial collaboration and capital empowerment is needed to tackle bottlenecks in technology commercialization, and the committee serves as such a platform to pool industry expertise and drive innovation and development in low-carbon technologies.

\n

Liu Yanhua, former vice-minister of science and technology and honorary director of the national expert committee on climate change, said in a congratulatory letter that the establishment of the committee serves as "a rallying cry for advancing methodologies to combat climate change and a brand-new starting point where experts from various fields join hands to forge ahead with innovation and collaboration."

\n

"The issue of climate change is complex and ever-changing, and traditional solutions are insufficient to meet current demands," Liu said.

\n

"We need to boldly explore and analyze from various dimensions, including technological innovation, policy innovation and operational model innovation. This approach will provide a scientific foundation for policymaking and promote the country's energy transition and green revolution," he added.

\n

Zhu Xian, former vice-president of the New Development Bank, emphasized that the world is at "the most critical, most challenging and most perilous" moment in the fight against climate change.

\n

While concerns exist that rising energy demands driven by artificial intelligence might limit renewable energy to a supplementary role, Zhu said that disruptive technologies hold the key to addressing climate change effectively. He also noted that China's advancements in low-carbon technologies have significant potential to lead this transformative effort.

\n

Ji Tao, a member of China Daily's editorial board, said that China, as the world's largest developing country, has made significant strides in its low-carbon transition. It aims to move from peaking carbon dioxide emissions to achieving carbon neutrality faster than any country in history, a goal that demands ongoing, intensive efforts.

\n

"The specialized committee will focus on promoting innovation and application of low-carbon technologies, facilitating their research, development and commercialization, thereby driving China's low-carbon transition," Ji added.

\n

At the launch ceremony, China Daily also initiated the Green China International Communication Portal, leveraging its role as a key player in international communications to share stories, Chinese wisdom and solutions in green development globally through forums, reports and media coverage.

\n

The launch ceremony was hosted by the Innovation Method Society in coordination with China Daily, Green Technology Bank (Shanghai) Co, and Carbon Workshop (Beijing) Scientific.

\n

Contact the writers at limenghan@chinadaily.com.cn

\n



获取更多RSS:
https://feedx.net
https://feedx.site
", - "content": "
\n

A national nonprofit academic organization launched a committee focused on green and low-carbon technologies in Beijing on Tuesday, aiming to promote and apply these technologies and contribute Chinese wisdom and solutions to the global green transformation.

\n

The Green and Low-Carbon Technology Application Committee, established by the Innovation Method Society under the auspices of the Ministry of Science and Technology, will focus on China's dual carbon goals to peak its carbon dioxide emissions before 2030 and achieve carbon neutrality before 2060.

\n

"Against the backdrop of global climate change and energy transition, low-carbon technologies have emerged as a pivotal force in driving sustainable economic and social development and achieving the dual carbon goals," said Zhu Junhao, director of the committee and CEO of Green Technology Bank (Shanghai) Co, at the launch ceremony.

\n

"However, the industrialization process of green and low-carbon technologies lags behind, with a technology transfer rate of less than 30 percent. Market applications face challenges of enthusiastic policy support but challenging implementation," Zhu noted.

\n

He added that a trilateral mechanism integrating government guidance, industrial collaboration and capital empowerment is needed to tackle bottlenecks in technology commercialization, and the committee serves as such a platform to pool industry expertise and drive innovation and development in low-carbon technologies.

\n

Liu Yanhua, former vice-minister of science and technology and honorary director of the national expert committee on climate change, said in a congratulatory letter that the establishment of the committee serves as "a rallying cry for advancing methodologies to combat climate change and a brand-new starting point where experts from various fields join hands to forge ahead with innovation and collaboration."

\n

"The issue of climate change is complex and ever-changing, and traditional solutions are insufficient to meet current demands," Liu said.

\n

"We need to boldly explore and analyze from various dimensions, including technological innovation, policy innovation and operational model innovation. This approach will provide a scientific foundation for policymaking and promote the country's energy transition and green revolution," he added.

\n

Zhu Xian, former vice-president of the New Development Bank, emphasized that the world is at "the most critical, most challenging and most perilous" moment in the fight against climate change.

\n

While concerns exist that rising energy demands driven by artificial intelligence might limit renewable energy to a supplementary role, Zhu said that disruptive technologies hold the key to addressing climate change effectively. He also noted that China's advancements in low-carbon technologies have significant potential to lead this transformative effort.

\n

Ji Tao, a member of China Daily's editorial board, said that China, as the world's largest developing country, has made significant strides in its low-carbon transition. It aims to move from peaking carbon dioxide emissions to achieving carbon neutrality faster than any country in history, a goal that demands ongoing, intensive efforts.

\n

"The specialized committee will focus on promoting innovation and application of low-carbon technologies, facilitating their research, development and commercialization, thereby driving China's low-carbon transition," Ji added.

\n

At the launch ceremony, China Daily also initiated the Green China International Communication Portal, leveraging its role as a key player in international communications to share stories, Chinese wisdom and solutions in green development globally through forums, reports and media coverage.

\n

The launch ceremony was hosted by the Innovation Method Society in coordination with China Daily, Green Technology Bank (Shanghai) Co, and Carbon Workshop (Beijing) Scientific.

\n

Contact the writers at limenghan@chinadaily.com.cn

\n



获取更多RSS:
https://feedx.net
https://feedx.site
", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/10/content_005_68c08e52ed50ccabe151923b.htm#005CHINA", - "creator": "", - "pubDate": "Wed, 10 Sep 2025 00:21:05 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "c854e35f82f41773c56422aaa7a678e1", - "highlights": [] - }, { "title": "005CHINA - Remains of martyrs to be returned to motherland", "description": "

The remains of 30 Chinese soldiers who died during the War to Resist US Aggression and Aid Korea (1950-53) are scheduled to be returned to China from South Korea on Friday, according to the Ministry of Veterans Affairs.

\n

The ministry said in a brief news release on Tuesday that the latest repatriations are based on an agreement between itself and South Korea's Ministry of National Defense, noting the occasion will mark the 12th consecutive year of the handover of Chinese soldiers' remains between the two nations.

\n

A high-level Chinese delegation, a group of honor guards from the People's Liberation Army and a Chinese Y-20 aircraft are set to arrive in South Korea on Wednesday to carry out the handover mission, the ministry said.

\n

On Thursday, a ceremony will be held in the port city of Incheon, where the remains will be placed in Chinese caskets that will then be covered by Chinese flags. The handover documents will be signed at the ceremony.

\n

By Friday, the remains will be officially handed over to the Chinese delegation at Incheon International Airport. Chinese personnel will then hold a memorial ceremony before escorting the remains back to China.

\n

After the remains return to China, the government will organize grand ceremonies at the airport and cemetery to honor the fallen soldiers. Family members and war veterans will be invited to participate.

\n

The soldiers will be buried at the Chinese People's Volunteers Martyrs' Cemetery in Shenyang, capital of Liaoning province.

\n

Led by Peng Dehuai, commander-in-chief of the Chinese People's Volunteers, nearly 2.9 million Chinese soldiers fought in the War to Resist US Aggression and Aid Korea. More than 197,000 Chinese soldiers and civilians recruited by the CPV died in combat.

\n

South Korea began recovering the remains of fallen Chinese soldiers in 2000 and started returning them to China in 2014. To date, the two sides have conducted 11 handovers involving the remains and belongings of 981 CPV martyrs.

\n

zhaolei@chinadaily.com.cn

\n

", @@ -10059,28 +9971,6 @@ "hash": "241b6444e3558dc60cc0d1659a6dc770", "highlights": [] }, - { - "title": "005CHINA - Dior punished for data law breach", - "description": "

Chinese police have imposed an administrative penalty on Christian Dior's company in Shanghai for violating rules on data transmission, according to a government statement issued on Tuesday.

\n

Cybersecurity departments launched an investigation after news reports in May said Dior customers in China had received text messages about a data leak.

\n

Investigators found that the Shanghai unit transmitted customers' personal information to the luxury brand's headquarters in France without passing the safety assessment of the outbound transfer, signing a standard contract for the transfer and obtaining certification for personal information protection, the statement said.

\n

The company also failed to fully inform customers about how their information would be processed overseas and obtain their individual consent before sending the data abroad, it said. In addition, it did not encrypt or de-identify the personal information it collected.

\n

According to news reports, Dior sent Chinese customers text messages in May warning of a data breach. Online pictures of the messages show that on May 7, Dior discovered that part of its customer data had been accessed by unauthorized personnel outside the company.

\n

Dior said in the message that it was investigating the breach, taking measures in response to it and reporting it to regulators.

\n

The government statement urged personal information handlers to learn from the case and comply with the country's Personal Information Protection Law on processing and cross-border transfers of personal information.

\n

wangqingyun@chinadaily.com.cn

\n

", - "content": "

Chinese police have imposed an administrative penalty on Christian Dior's company in Shanghai for violating rules on data transmission, according to a government statement issued on Tuesday.

\n

Cybersecurity departments launched an investigation after news reports in May said Dior customers in China had received text messages about a data leak.

\n

Investigators found that the Shanghai unit transmitted customers' personal information to the luxury brand's headquarters in France without passing the safety assessment of the outbound transfer, signing a standard contract for the transfer and obtaining certification for personal information protection, the statement said.

\n

The company also failed to fully inform customers about how their information would be processed overseas and obtain their individual consent before sending the data abroad, it said. In addition, it did not encrypt or de-identify the personal information it collected.

\n

According to news reports, Dior sent Chinese customers text messages in May warning of a data breach. Online pictures of the messages show that on May 7, Dior discovered that part of its customer data had been accessed by unauthorized personnel outside the company.

\n

Dior said in the message that it was investigating the breach, taking measures in response to it and reporting it to regulators.

\n

The government statement urged personal information handlers to learn from the case and comply with the country's Personal Information Protection Law on processing and cross-border transfers of personal information.

\n

wangqingyun@chinadaily.com.cn

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/10/content_005_68c08e64ed50ccabe151923f.htm#005CHINA", - "creator": "", - "pubDate": "Wed, 10 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "c1b1eb409212e622937bef0592d864b6", - "highlights": [] - }, { "title": "007CHINA - Way found to quantify soil carbon changes", "description": "

From left: Qin Zhangcai (first from right) leads Wang Yijie (second from right) and two of his students from Sun Yat-sen University in Guangzhou, Guangdong province, to attend an international conference in Austria. Qin and Wang discuss how to improve their model in the university.

\n

To mitigate climate change, afforestation worldwide has the potential to sequester up to 5 billion metric tons of carbon dioxide annually, according to scientific research led by a team from the Sun Yat-sen University in Guangzhou, Guangdong province.

\n

Qin Zhangcai, a professor from the School of Atmospheric Sciences, Sun Yat-sen University, and his team published their findings, titled "Land Availability and Policy Commitments Limit Global Climate Mitigation from Forestation", in the international academic journal Science on Aug 29. The research quantified for the first time the carbon sequestration capacity of underground soil in the global forest restoration process.

\n

To "cool down" the planet, the world is in urgent need of reducing carbon dioxide emissions and enhancing the carbon sequestration capacity of ecosystems. As natural "carbon absorbers", forests serve as indispensable "green air conditioners" for climate regulation, and afforestation is widely regarded as one of the most cost-effective nature-based climate solutions.

\n

The research innovatively integrates three key factors — ecology, climate and policy — to redefine the potential of afforestation to mitigate climate change and provide "navigation" for future global afforestation.

\n

After years of collecting scarce global soil data, Qin's team has successfully developed a machine learning model capable of quantifying soil carbon changes resulting from afforestation. Leveraging international cooperation and integrating existing vegetation carbon estimates, the team has also created an "all-round detector" that can monitor carbon changes in both vegetation and soil.

\n

The team also took into account international environmental and socio-economic constraints related to afforestation, such as biodiversity, water resources, surface warming and national commitments. From the two dimensions of sustainable land "supply" and national policy "demand", the team has redeveloped a "navigation map" for future forest restoration.

\n

"However, when land sustainability and countries' willingness are taken into comprehensive consideration, the actual emission reduction potential of afforestation worldwide can decrease to 1.5 billion metric tons per year," warned Qin, adding that climate risks can stem from "empty talk", or "theoretical plans that lack implementation".

\n

According to Qin, there are huge discrepancies regarding how much carbon dioxide future afforestation can absorb, with the low estimate being less than 300 million tons and the high estimate exceeding three billion tons per year.

\n

Qin said the controversy mainly centers on two key challenges.

\n

While the carbon sequestration capacity of vegetation is relatively clear, changes in soil carbon remain difficult to detect accurately, he said.

\n

"Meanwhile, estimates on land area suitable for afforestation worldwide also differ by 10 times," he said, adding that more importantly, the significant gap between countries' afforestation commitments and their willingness to implement them has long been overlooked.

\n

Qin said there is a huge mismatch between countries' afforestation commitments and land potential. "Countries with land potential have made relatively few commitments, while those that have made more commitments — especially low-income countries — lack sufficient land and other resources to support their afforestation aspirations, he said.

\n

Qin said his team has proposed an Olympics-style goal for global afforestation in the future that is "faster, higher, stronger, and more united".

\n

"We hope the study will provide some scientific reference for global climate change cooperation, helping to clarify issues such as the asymmetry of forest resources among countries and the imbalance of rights and responsibilities between northern and southern countries," he said.

\n

Qin said his team will fully leverage the advantages of international cooperation to conduct research in the intersection of energy, nature, and carbon neutrality, with a focus on exploring feasible natural climate solutions in the years to come.

\n

The editor of Science said Qin's study has comprehensively considered multiple factors and provides a "more realistic" assessment of climate effects.

\n

With Wang Yijie, a doctoral student from the School of Atmospheric Sciences of the university, as the first author of the paper and Qin as the corresponding author, the study was conducted in collaboration with scientists from multiple countries around the world.

\n

China has long been committed to the restoration of forest resources. According to the Master Plan for Major Projects for the Protection and Restoration of Important National Key Ecosystems (2021-35), China has set the goal of achieving a forest coverage rate of 26 percent by 2035 for the 14th Five Year Plan (2021-25).

\n

The net absorption of carbon dioxide by forests around 2010 was approximately 455 million tons per year, and it is expected to further increase to 532-584 million tons per year between 2020 and 2040, reaching a peak of approximately 664-796 million tons per year between 2041 and 2060.

\n

Contact the writers at zhengcaixiong@chinadaily.com.cn

\n



获取更多RSS:
https://feedx.net
https://feedx.site
", @@ -10103,28 +9993,6 @@ "hash": "4e905cbcaf9c07502b22dee92efa89dc", "highlights": [] }, - { - "title": "007CHINA - How Tibetan script was integrated into digital life", - "description": "

LHASA — In Southwest China's Xizang autonomous region, the ancient Tibetan script, which dates back over 1,300 years, is now seamlessly integrated into modern digital life.

\n

Today, smartphone users exchange messages in flawless Tibetan script, temple visitors check opening hours via mobile apps and hospital patients complete registrations in their native language.

\n

All these are built on a research team's decades-long efforts.

\n

"These everyday digital operations make it easy to forget that the Tibetan script only became digitally processable some 30 years ago," said Nyima Tashi, a leading figure in Tibetan-language information technology and a member of the Chinese Academy of Engineering.

\n

In 1988, Nyima Tashi, then 24, graduated from the department of computer science at East China Normal University in Shanghai and was assigned to teach at Xizang University. At that time, Tibetan-language information technology was in its infancy, far from meeting societal needs.

\n

Four years later, he and his team developed the Tibetan, Chinese and English Information Processing System, the first practical Tibetan-language software approved by local authorities.

\n

Addressing the need of Tibetans in information technology, the software was widely used in government document processing, textbook compilation and the preservation of ancient books and documents, marking the beginning of Tibetan-language digitalization in the region.

\n

As the internet swept the globe in the 1990s, languages worldwide were establishing international encoding standards. From 1993 to 1997, Nyima Tashi led his team in drafting a proposal for a Tibetan script encoding standard, submitting it six times to the International Organization for Standardization.

\n

"Any country could compete for setting the Tibetan-language encoding standard. Back then, Britain, Ireland and others also submitted proposals," Nyima Tashi recalled.

\n

"But China is the birthplace of the Tibetan script, and it was our responsibility to ensure its international standardization."

\n

A scientifically sound encoding system had to capture linguistic nuances, avoid ambiguity and ensure correct information exchanges and sharing.

\n

To overcome technical challenges, Nyima Tashi and his team traveled to multiple countries, attending working meetings and academic discussions to improve their coding scheme.

\n

In July 1997, China's proposal for a Tibetan-language encoding standard was finally approved by the ISO, becoming part of the universal coded character set.

\n

This made Tibetan the first Chinese minority language with an international digital standard.

\n

It also signified that the ancient Tibetan script had officially stepped onto the world stage and entered the digital era.

\n

Based on the new standard, Nyima Tashi's team later established Xizang's first internet hub at Xizang University through the China Education and Research Network, launching the region's first web page.

\n

With the establishment of the coding standard, the operating systems of digital mobile phones and car phones have finally realized the accurate display of the Tibetan script.

\n

Even in today's era of artificial intelligence, it is precisely based on the researchers' years of efforts that Tibetan ancient books and documents can be digitally collected through scanning and identification, ensuring their digital protection and utilization.

\n

"Our systems are now applied in the regional library and in the digital protection of the Potala Palace's ancient books," said Yutso, a team member and professor at Xizang University.

\n

Nyima Tashi said, "Today, every mobile phone and computer worldwide that processes our Tibetan language relies on the standard China has established."

\n

", - "content": "

LHASA — In Southwest China's Xizang autonomous region, the ancient Tibetan script, which dates back over 1,300 years, is now seamlessly integrated into modern digital life.

\n

Today, smartphone users exchange messages in flawless Tibetan script, temple visitors check opening hours via mobile apps and hospital patients complete registrations in their native language.

\n

All these are built on a research team's decades-long efforts.

\n

"These everyday digital operations make it easy to forget that the Tibetan script only became digitally processable some 30 years ago," said Nyima Tashi, a leading figure in Tibetan-language information technology and a member of the Chinese Academy of Engineering.

\n

In 1988, Nyima Tashi, then 24, graduated from the department of computer science at East China Normal University in Shanghai and was assigned to teach at Xizang University. At that time, Tibetan-language information technology was in its infancy, far from meeting societal needs.

\n

Four years later, he and his team developed the Tibetan, Chinese and English Information Processing System, the first practical Tibetan-language software approved by local authorities.

\n

Addressing the need of Tibetans in information technology, the software was widely used in government document processing, textbook compilation and the preservation of ancient books and documents, marking the beginning of Tibetan-language digitalization in the region.

\n

As the internet swept the globe in the 1990s, languages worldwide were establishing international encoding standards. From 1993 to 1997, Nyima Tashi led his team in drafting a proposal for a Tibetan script encoding standard, submitting it six times to the International Organization for Standardization.

\n

"Any country could compete for setting the Tibetan-language encoding standard. Back then, Britain, Ireland and others also submitted proposals," Nyima Tashi recalled.

\n

"But China is the birthplace of the Tibetan script, and it was our responsibility to ensure its international standardization."

\n

A scientifically sound encoding system had to capture linguistic nuances, avoid ambiguity and ensure correct information exchanges and sharing.

\n

To overcome technical challenges, Nyima Tashi and his team traveled to multiple countries, attending working meetings and academic discussions to improve their coding scheme.

\n

In July 1997, China's proposal for a Tibetan-language encoding standard was finally approved by the ISO, becoming part of the universal coded character set.

\n

This made Tibetan the first Chinese minority language with an international digital standard.

\n

It also signified that the ancient Tibetan script had officially stepped onto the world stage and entered the digital era.

\n

Based on the new standard, Nyima Tashi's team later established Xizang's first internet hub at Xizang University through the China Education and Research Network, launching the region's first web page.

\n

With the establishment of the coding standard, the operating systems of digital mobile phones and car phones have finally realized the accurate display of the Tibetan script.

\n

Even in today's era of artificial intelligence, it is precisely based on the researchers' years of efforts that Tibetan ancient books and documents can be digitally collected through scanning and identification, ensuring their digital protection and utilization.

\n

"Our systems are now applied in the regional library and in the digital protection of the Potala Palace's ancient books," said Yutso, a team member and professor at Xizang University.

\n

Nyima Tashi said, "Today, every mobile phone and computer worldwide that processes our Tibetan language relies on the standard China has established."

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/10/content_007_68c08e81ed50ccabe1519246.htm#007CHINA", - "creator": "", - "pubDate": "Wed, 10 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "a46df987361c4eca6ccefb55ec1d582b", - "highlights": [] - }, { "title": "008COMMENT - Revision of foreign trade law necessary move", "description": "

In a move to bolster the legal framework underpinning China's opening-up, Chinese national lawmakers have commenced their review of a draft revision to the Foreign Trade Law. The revision aims to integrate a series of reform measures into the national legislation, reinforcing China's commitment to open trade while safeguarding national security amid the complex global trade environment.

\n

The draft revision seeks to codify some critical reform measures, such as the negative list system for cross-border trade in services.

\n

Comprising 80 articles, the draft revision consolidates previously scattered legal provisions into a systematic framework that aims to guarantee that foreign trade effectively contributes to China's development while safeguarding national security.

\n

The Foreign Trade Law, enacted in 1994 with a view to expanding the country's opening-up, has been instrumental in integrating the country into the global economy. Over the past three decades, the law has facilitated trade liberalization, helped maintain foreign trade order, and protected the legitimate rights and interests of trade entities.

\n

The law has markedly enhanced China's competitiveness in foreign trade, contributing to it becoming the world's largest goods trading nation and a major trading partner of more than 140 countries and regions, with its total trade volume reaching 43.85 trillion yuan ($5.98 trillion) in 2024.

\n

Yet the global trade dynamics have changed rapidly in recent years, particularly with the rise of protectionism and unilateralism, which has severely disrupted trade. This has made it a pressing task for Chinese lawmakers to revise the law to adapt to the changes.

\n

The draft revision seeks to enshrine multiple reform measures in the law, including a negative list system for managing cross-border trade in services, and measures for promoting new forms and models of foreign trade, and encouraging digital trade and the establishment of a green trade system. This will help align the country with high-standard international trade and economic rules, and put it in a better position to participate in the formulation of global trade regulations. In addition, to further optimize the foreign trade environment, the draft specifies enhanced intellectual property protection and improved IP compliance and risk management for trade entities, and the establishment of trade adjustment assistance to stabilize industry and supply chains.

\n

This is the first time the idea of establishing an assistance system for foreign trade enterprises has been raised in the legal framework, which has gained an increased sense of urgency given today's export challenges.

\n

Importantly, the draft includes stringent measures to counter threats to China's sovereignty, security and development interests. It allows for restrictive or prohibitive actions against such threats and specifies that no entity may support attempts to evade these measures, with violations subject to legal penalties. These measures, which serve to protect the country's sovereignty, security and development interests, align with international norms and are not unique to China, as similar frameworks exist in Europe and the United States. There is no doubt that China needs lawful counteractions against rising protectionism.

\n

Despite the complex external environment, China's foreign trade has maintained its growth momentum this year, with the total value of goods trade imports and exports reaching 3.87 trillion yuan in August, a year-on-year increase of 3.5 percent, according to the General Administration of Customs. Exports amounted to 2.3 trillion yuan and imports to 1.57 trillion yuan, up 4.8 percent and 1.7 percent year-on-year respectively, achieving double growth for three consecutive months.

\n

All this testifies to the resilience of China's foreign trade sector. As the country continues to navigate the complexities of the global trade landscape, the revision of the Foreign Trade Law is a key step to steady its foreign trade and protect its core interests.

\n

The revised law, which is poised to serve as a cornerstone for China's trade policy, aims to facilitate a more integrated, innovative and secure trading system that will reinforce the country's position as a key player in the global economy.

\n

", @@ -10147,28 +10015,6 @@ "hash": "86544047db34485f5d859bd15e3fbb22", "highlights": [] }, - { - "title": "008COMMENT - 'Freedom of speech' no excuse for opportunist's smearing profiteering", - "description": "

China's decision to impose sanctions on the China-born Japanese lawmaker Seki Hei, also known by his Chinese name Shi Ping, has drawn predictable protests from the Japanese government. Chief Cabinet Secretary Yoshimasa Hayashi called the move "an unacceptable attempt to stifle free expression", while Shi claimed China was "interfering in Japan's internal affairs" and "undermining universal values". But such excuses cannot obscure the truth: Shi has long spread fallacies about China to meet his own narrow ends.

\n

Once a Chinese citizen, Shi turned his back on his motherland after acquiring Japanese citizenship. Instead of respecting his roots, he began vilifying China, making political capital out of it. He has written books smearing China's development, spread lies about Taiwan, Xinjiang, Xizang, Hong Kong and the Diaoyu Islands, and even joined right-wing politicians of Japan during their visits to the notorious Yasukuni Shrine, which glorifies Japan's wartime militarism by honoring war criminals, including 14 convicted Class-A criminals. These are not mere "personal opinions", as his defenders in Tokyo claim, but conscious acts intended to damage China's sovereignty, dignity and unity.

\n

Shi has trampled upon the solemn commitments of the Joint Communique of the Government of Japan and the Government of the People's Republic of China signed in 1972 and the principles enshrined in the four political documents agreed between the two countries. He has also openly challenged the one-China principle, a political foundation of China-Japan diplomatic relations. These are not abstract issues of "free expression", but serious violations of trust, morality and international commitments.

\n

Foreign Ministry spokesperson Lin Jian's words capture the essence of Shi's conduct. Lin said that Shi has "betrayed his roots, sold his conscience, and colluded with anti-China forces".

\n

To many Chinese people, Shi's actions evoke a painful historical memory. During the Chinese People's War of Resistance Against Japanese Aggression (1931-45), some Chinese nationals shamefully placed short-term personal gain above the motherland and aided the invaders. Shi's words and actions rekindle similar resentment. Though the times are different, the essence is the same: a man who has abandoned his roots, and is trying to profit by taking up the cause of those hostile to his motherland.

\n

History has repeatedly proven that such acts bestow not honor, but disgrace on the practitioner.

\n

Japan's Foreign Ministry tries to dress Shi's actions in the cloak of "democracy" and "freedom of expression". But "freedom" cannot be a shield for spreading lies, nor can "democracy" be an excuse for undermining another country's sovereignty. Respecting history, honoring commitments and refraining from interference in another nation's internal affairs are exactly the values that Shi has trampled on. He has shown contempt for not only China but also historical justice and the peace that postwar Asia has struggled to preserve.

\n

China's countermeasures are entirely justified. As Lin emphasized, these measures are not just a punishment for Shi, but also a stern warning to anyone tempted to follow in his path of betrayal to the motherland.

\n

Given the nature of Shi's misdemeanor, the Japanese government should reflect on whether encouraging such provocations truly serves the Japanese people's long-term interests or regional stability.

\n

Shi may claim "legitimacy" as an elected politician in Japan, but history uses a different standard. Those who betray their conscience and collude with forces hostile to their motherland can never escape condemnation. Shi's political opportunism may win him temporary personal gain, but it will consign his name to the same ignominious dustbin of history where collaborators of the past have been thrown. Those who turn their backs on these truths will ultimately find themselves isolated, condemned and remembered not as "champions of democracy", but as traitors to justice.

\n

", - "content": "

China's decision to impose sanctions on the China-born Japanese lawmaker Seki Hei, also known by his Chinese name Shi Ping, has drawn predictable protests from the Japanese government. Chief Cabinet Secretary Yoshimasa Hayashi called the move "an unacceptable attempt to stifle free expression", while Shi claimed China was "interfering in Japan's internal affairs" and "undermining universal values". But such excuses cannot obscure the truth: Shi has long spread fallacies about China to meet his own narrow ends.

\n

Once a Chinese citizen, Shi turned his back on his motherland after acquiring Japanese citizenship. Instead of respecting his roots, he began vilifying China, making political capital out of it. He has written books smearing China's development, spread lies about Taiwan, Xinjiang, Xizang, Hong Kong and the Diaoyu Islands, and even joined right-wing politicians of Japan during their visits to the notorious Yasukuni Shrine, which glorifies Japan's wartime militarism by honoring war criminals, including 14 convicted Class-A criminals. These are not mere "personal opinions", as his defenders in Tokyo claim, but conscious acts intended to damage China's sovereignty, dignity and unity.

\n

Shi has trampled upon the solemn commitments of the Joint Communique of the Government of Japan and the Government of the People's Republic of China signed in 1972 and the principles enshrined in the four political documents agreed between the two countries. He has also openly challenged the one-China principle, a political foundation of China-Japan diplomatic relations. These are not abstract issues of "free expression", but serious violations of trust, morality and international commitments.

\n

Foreign Ministry spokesperson Lin Jian's words capture the essence of Shi's conduct. Lin said that Shi has "betrayed his roots, sold his conscience, and colluded with anti-China forces".

\n

To many Chinese people, Shi's actions evoke a painful historical memory. During the Chinese People's War of Resistance Against Japanese Aggression (1931-45), some Chinese nationals shamefully placed short-term personal gain above the motherland and aided the invaders. Shi's words and actions rekindle similar resentment. Though the times are different, the essence is the same: a man who has abandoned his roots, and is trying to profit by taking up the cause of those hostile to his motherland.

\n

History has repeatedly proven that such acts bestow not honor, but disgrace on the practitioner.

\n

Japan's Foreign Ministry tries to dress Shi's actions in the cloak of "democracy" and "freedom of expression". But "freedom" cannot be a shield for spreading lies, nor can "democracy" be an excuse for undermining another country's sovereignty. Respecting history, honoring commitments and refraining from interference in another nation's internal affairs are exactly the values that Shi has trampled on. He has shown contempt for not only China but also historical justice and the peace that postwar Asia has struggled to preserve.

\n

China's countermeasures are entirely justified. As Lin emphasized, these measures are not just a punishment for Shi, but also a stern warning to anyone tempted to follow in his path of betrayal to the motherland.

\n

Given the nature of Shi's misdemeanor, the Japanese government should reflect on whether encouraging such provocations truly serves the Japanese people's long-term interests or regional stability.

\n

Shi may claim "legitimacy" as an elected politician in Japan, but history uses a different standard. Those who betray their conscience and collude with forces hostile to their motherland can never escape condemnation. Shi's political opportunism may win him temporary personal gain, but it will consign his name to the same ignominious dustbin of history where collaborators of the past have been thrown. Those who turn their backs on these truths will ultimately find themselves isolated, condemned and remembered not as "champions of democracy", but as traitors to justice.

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/10/content_008_68c08e93ed50ccabe151924a.htm#008COMMENT", - "creator": "", - "pubDate": "Wed, 10 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "88067999cbcb77427bea35d9968bf0ec", - "highlights": [] - }, { "title": "009VIEWS - US 'Department of War' reflects its true role", "description": "
\n

When the US administration announced last week that the "Department of War" will be used as the "secondary title" for the Department of Defense, it was, for once, being honest.

\n

The administration offered two justifications for the White House's decision. First, it reminded Americans that when the department was still called the "Department of War", the United States won two world wars. The name, it suggested, carries a victorious aura. Second, it argued that "Defense" sounds too passive, whereas "War" better captures the US' military posture. One can hardly fault this candor.

\n

Asked about the move, China's Foreign Ministry spokesperson simply said that it is the US' internal matter.

\n

From George Washington to Harry Truman, US presidents maintained the Department of War for over 160 years. Through those years, the US transformed from a fragile republic into a global power. For the incumbent administration, which has pledged to "Make America Great Again", evoking that era makes political sense. By dusting off the old title, it taps into a collective memory of past glory, rekindling pride while fueling hopes of renewed greatness. That is an apt political move for the US, given its current belligerent posture.

\n

More important, restoring the title, "Department of War", makes it consistent with the institution's true character. Since 1949, when it was rebranded the "Department of Defense", the Pentagon has not followed a defensive defense policy. Its mission has remained that of the Department of War: planning, launching and sustaining conflicts across the globe.

\n

A "department of defense" should primarily safeguard national security. But in the eight decades since the end of World War II, the US' so-called Department of Defense has done the opposite. It has frequently used its military power abroad on pretexts not related to self-defense. Successive US administrations have exhibited one common behavior: even when no country posed a threat to the US' security, they have conjured up enemies and triggered conflicts. If there were no adversaries, they were invented.

\n

The rebranding of the US defense department did not temper US aggression. On the contrary, the US Department of Defense has proliferated wars. The record is long and bloody. The countries and regions scarred by US military action include the Korean Peninsula, Vietnam, Laos, Cambodia, Guatemala, Cuba, the Dominican Republic, Lebanon, Grenada, Panama, Somalia, Kosovo, Afghanistan, Iraq, Libya and Syria. The Pentagon's interventions are too numerous to catalogue. Suffice it to say that the department has been far busier using force than defending US soil.

\n

Even in 2025, only months into the current administration, airstrikes were carried out on Iran, and warships dispatched to Venezuelan waters under the guise of fighting drug cartels. If this is not the behavior of a "war department", what is?

\n

Seen in this light, restoring the old title is not a reckless but a "corrective" move. For decades, the US Department of Defense has acted under a misleading title. Now, at least, the name reflects reality. By admitting what everyone else can see — that the US is a country perpetually at war — the administration has indulged in an act of bureaucratic truth-telling.

\n

Of course, the Pentagon is not the only US institution misnamed. Other departments could use a dose of the same honesty.

\n

Take the Department of the Treasury. In practice, it often functions less as a steward of fiscal policy than the command center for economic sanctions. Why not rename it the "Department of Economic Punishment"? And the Department of Commerce, forever accusing other countries of "unfair trade", could be renamed the "Department of Trade Wars".

\n

Then there is the Department of Energy, which has largely treated oil and gas as the only energy sources worth mentioning. Renewables barely enter the picture. A more candid title for it may be the "Department of Petroleum". As for the Central Intelligence Agency, beyond intelligence-gathering, its well-documented history of political subversion and "color revolutions" abroad makes "Covert Action Agency" a more accurate name for it.

\n

Names matter. They reveal a department's priorities and intentions. For years, Washington has cloaked its aggressive posture in benign-sounding language — "defense", "freedom", "humanitarian intervention". Such euphemisms are meant to soften the reality of hard power. By reviving the title Department of War, the department has finally matched name with function.

\n

If the US insists on projecting force, let it at least do so under a name that admits as much. The recent renaming of the Pentagon is, then, a first step toward bureaucratic honesty. Whether future administrations will maintain this practice of linguistic candor remains to be seen.

\n

For now, though, the "Department of War" has returned. And for once, its name is exactly what it does.

\n

The views don't necessarily represent those of China Daily.

\n

", @@ -10191,28 +10037,6 @@ "hash": "1c7a539c0d9f3ec6ef1624c6b66579a4", "highlights": [] }, - { - "title": "009VIEWS - AI ascent calls for people to fasten seat belts", - "description": "

Zhou Shuchun

\n\n

A scene from the recently held world's first robot sports competition symbolizes the current state of artificial intelligence development: humanoid robots ran, fell, got up and continued to run until they reached the finish line. Such a spectacle might elicit a few laughs from the audience, but it undoubtedly pushes AI awareness to new heights.

\n

In another arena, AI stocks have surged relentlessly to record highs. Rising valuations indicate the capital market is generally optimistic about the prospects of AI development.

\n

At the policy level, embedding AI into broad production and daily life has become a rapidly unfolding national initiative in China. Late last month, the State Council, China's cabinet, issued a document on implementing the "AI+" action, with the aim of integrating AI with all industries and sectors, and accelerating the formation of new intelligent economic and social structures — in a panoramic blueprint for six major areas spread across three stages over the next 10 years.

\n

A survey published earlier this year showed 53.1 percent of the public are excited about, 26 percent are pleasantly surprised at, and 11 percent hold relatively negative views about AI development. Underlying this overall optimism is an empiricist belief that AI, like mobile internet, will be the next step in "technology transforming life".

\n

Since launching the "Internet+" initiative a decade ago, China has built a highly internet-developed society, with rapid internet penetration driving industrial upgrades, consumption shifts, and livelihood improvements.

\n

Of course, technological progress has always been a double-edged sword. Amid the AI wave, doubts persist. Beyond concerns about silicon-based "workers" displacing carbon-based ones, a pessimistic tech ethics view warns that as people increasingly rely on AI for cognition, uniquely human critical thinking and creativity may degenerate, leading to a divergent world where human intelligence declines while machine intelligence soars. A study by Massachusetts Institute of Technology found AI users had weaker neural connections, while those using no tools showed the strongest and most distributed neural links.

\n

More immediate worries revolve around "black boxes" and "model hallucinations". AI's deep learning relies on vast datasets, making it data-driven. Large language models generate text statistically, and lack humans' ability to correlate symbols with reality — rendering their outputs unpredictable, like a black box. And when fed with unverified "digital garbage", they may produce misleading hallucinations.

\n

Pessimism is not entirely unfounded; it serves as a caution for rational development. Yet as Cisco CEO Chuck Robbins put it: "Technical success often precedes ethical discussions." Robbins was apparently paraphrasing J. Robert Oppenheimer's quote which conveys the same idea. The "technical success comes first" proposition might be questionable, but it's true that technological progress has a way to march on regardless of human will.

\n

Despite possible bumps ahead, AI's advance will not pause. More crucially, as the continuation of IT revolutions and a vanguard of new tech-industrial transformations, AI has become a strategic high point in global competition. An innovation powerhouse would not allow hesitation to result in missed opportunities.

\n

Emerging technologies always cause uncertainty. As a revolutionary force, AI will profoundly reshape societal and economic logic. The need now is to fasten our seat belts while embracing the ascent. Reassuringly, the State Council's document prioritizes the principle of security and controllability, proposing enhanced safety measures — from model algorithms and data infrastructure to monitoring systems — especially against malicious misuse.

\n

History shows disruptive technologies, from steam engines to the internet, require long gestation periods. AI is no exception. Earlier this year, OpenAI's Sam Altman said AI has crossed the "event horizon", with the "gentle singularity" already here: "the singularity happens bit by bit, and the merge happens slowly".

\n

His view is echoed by a leading figure in China's AI field. According to Wang Xingxing, founder of Unitree Robotics, challenges at this critical stage will force the industry to shed hype, avoid low-level repetition, and embrace long-term scientific rigor to usher in the pivotal threshold.

\n

", - "content": "

Zhou Shuchun

\n\n

A scene from the recently held world's first robot sports competition symbolizes the current state of artificial intelligence development: humanoid robots ran, fell, got up and continued to run until they reached the finish line. Such a spectacle might elicit a few laughs from the audience, but it undoubtedly pushes AI awareness to new heights.

\n

In another arena, AI stocks have surged relentlessly to record highs. Rising valuations indicate the capital market is generally optimistic about the prospects of AI development.

\n

At the policy level, embedding AI into broad production and daily life has become a rapidly unfolding national initiative in China. Late last month, the State Council, China's cabinet, issued a document on implementing the "AI+" action, with the aim of integrating AI with all industries and sectors, and accelerating the formation of new intelligent economic and social structures — in a panoramic blueprint for six major areas spread across three stages over the next 10 years.

\n

A survey published earlier this year showed 53.1 percent of the public are excited about, 26 percent are pleasantly surprised at, and 11 percent hold relatively negative views about AI development. Underlying this overall optimism is an empiricist belief that AI, like mobile internet, will be the next step in "technology transforming life".

\n

Since launching the "Internet+" initiative a decade ago, China has built a highly internet-developed society, with rapid internet penetration driving industrial upgrades, consumption shifts, and livelihood improvements.

\n

Of course, technological progress has always been a double-edged sword. Amid the AI wave, doubts persist. Beyond concerns about silicon-based "workers" displacing carbon-based ones, a pessimistic tech ethics view warns that as people increasingly rely on AI for cognition, uniquely human critical thinking and creativity may degenerate, leading to a divergent world where human intelligence declines while machine intelligence soars. A study by Massachusetts Institute of Technology found AI users had weaker neural connections, while those using no tools showed the strongest and most distributed neural links.

\n

More immediate worries revolve around "black boxes" and "model hallucinations". AI's deep learning relies on vast datasets, making it data-driven. Large language models generate text statistically, and lack humans' ability to correlate symbols with reality — rendering their outputs unpredictable, like a black box. And when fed with unverified "digital garbage", they may produce misleading hallucinations.

\n

Pessimism is not entirely unfounded; it serves as a caution for rational development. Yet as Cisco CEO Chuck Robbins put it: "Technical success often precedes ethical discussions." Robbins was apparently paraphrasing J. Robert Oppenheimer's quote which conveys the same idea. The "technical success comes first" proposition might be questionable, but it's true that technological progress has a way to march on regardless of human will.

\n

Despite possible bumps ahead, AI's advance will not pause. More crucially, as the continuation of IT revolutions and a vanguard of new tech-industrial transformations, AI has become a strategic high point in global competition. An innovation powerhouse would not allow hesitation to result in missed opportunities.

\n

Emerging technologies always cause uncertainty. As a revolutionary force, AI will profoundly reshape societal and economic logic. The need now is to fasten our seat belts while embracing the ascent. Reassuringly, the State Council's document prioritizes the principle of security and controllability, proposing enhanced safety measures — from model algorithms and data infrastructure to monitoring systems — especially against malicious misuse.

\n

History shows disruptive technologies, from steam engines to the internet, require long gestation periods. AI is no exception. Earlier this year, OpenAI's Sam Altman said AI has crossed the "event horizon", with the "gentle singularity" already here: "the singularity happens bit by bit, and the merge happens slowly".

\n

His view is echoed by a leading figure in China's AI field. According to Wang Xingxing, founder of Unitree Robotics, challenges at this critical stage will force the industry to shed hype, avoid low-level repetition, and embrace long-term scientific rigor to usher in the pivotal threshold.

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/10/content_009_68c08ea4ed50ccabe151924e.htm#009VIEWS", - "creator": "", - "pubDate": "Wed, 10 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "2b8e5e2b01b7f574ef61304dd6658708", - "highlights": [] - }, { "title": "010WORLD - Nepal's prime minister quits after deadly protests kill 19", "description": "

KATHMANDU — Nepal's Prime Minister K.P. Sharma Oli resigned on Tuesday as anti-corruption demonstrators defied an indefinite curfew and clashed with police, a day after 19 people died in violent protests triggered by a social media ban.

\n

Oli's government lifted the social media shutdown after protests turned violent, killing 19 and injuring more than 100 after police fired tear gas and rubber bullets at protesters trying to storm the parliament on Monday.

\n

"I have resigned from the post of prime minister with effect from today ... in order to take further steps toward a political solution and resolution of the problems," Oli, 73, said in a letter to the president.

\n

Earlier on Tuesday, Oli had called a meeting of all political parties, saying violence is not in the interest of the nation and "we have to resort to peaceful dialogue to find solutions to any problem".

\n

However, anger against the government showed no signs of abating, as protesters gathered in front of parliament and other places in the capital Kathmandu, in defiance of an indefinite curfew imposed by authorities.

\n

The protesters set fire to tires on some roads, threw stones at police personnel in riot gear and chased them through narrow streets, while some looked on and shot videos of the clashes on their mobile phones as thick black smoke rose to the sky.

\n

Hundreds of people from some towns located near the India-Nepal border had started marching toward Kathmandu to support the protesters, one of the protesters told Reuters by phone.

\n

", @@ -10235,28 +10059,6 @@ "hash": "ce4879b131471b36875f6da87ccd9702", "highlights": [] }, - { - "title": "010WORLD - Winged Lion of Venice has Chinese origin: Study", - "description": "

The winged lion statue stands on a column at the St. Mark's Square in Venice, Italy, on Aug 23.

\n

The famous and mysterious Winged Lion of Venice statue, which has watched over the beautiful Italian water city for more than 700 years, was made in China, scientists have discovered.

\n

The ancient, 3,000-kilogram bronze lion that sits atop a granite column in Venice's iconic St. Mark's Square had long been thought to have been made in the "near East", likely in Syria or the Armenian Kingdom of Cilicia, around the year 300 BC.

\n

However, scientists at Italy's University of Padua, who have analyzed the metal it is made from, are now certain that the statue was created in China during the Tang Dynasty (618-907) for use as a tomb guardian and subsequently taken to Europe, where it was modified to fit European expectations.

\n

The startling discovery was revealed in a scientific study published in the latest edition of the journal Antiquity.

\n

"It is possible that Marco Polo's father and uncle, during the four years they spent at the court of Kublai Khan during their first journey, were responsible for the acquisition of the sculpture," the researchers said, noting that the trip by the European explorers to the court of the ruler — who was also known as Emperor Shizu of Yuan — likely took place between 1264 and 1268.

\n

In addition to deducing that components of the bronze were extracted from the Lower Yangtze River basin, the scientists observed that the 4-meter-long, 2.2-meter-tall statue originally featured horns and longer ears, with a nose resembling that of a Chinese lion statue rather than a European one.

\n

They said it looks as if the statue was "discreetly and laboriously refitted" to make it look more like the winged lion, the holy emblem of St. Mark, the patron saint of Venice.

\n

In addition, they said that the "puzzling absence of written information" about the statue's early years in Europe means "the intention and logistics behind its journey to Venice remain elusive and open to interpretation".

\n

"If the installation … was meant to send a strong, defensive political message, we can now also read it as a symbol of the impressive connectedness of the medieval world," they added.

\n

They speculated that the statue may have been transported more than 9,500 kilometers along the Silk Road trading route between Asia and Europe.

\n

"Venice is a city full of mysteries, but one has been solved," Massimo Vidale, from the University of Padua, told the Press Association.

\n

However, "when the sculpture arrived in Venice, where it was reworked, who did it, or when it was erected on the column where it is still visible today" remain unknown, he said.

\n

Despite the uncertainties, the scientists say that lead isotope analysis indicates there is no doubt the statue originated from China, and that it had the posture and features of a tomb guardian.

\n

earle@mail.chinadailyuk.com

\n

", - "content": "

The winged lion statue stands on a column at the St. Mark's Square in Venice, Italy, on Aug 23.

\n

The famous and mysterious Winged Lion of Venice statue, which has watched over the beautiful Italian water city for more than 700 years, was made in China, scientists have discovered.

\n

The ancient, 3,000-kilogram bronze lion that sits atop a granite column in Venice's iconic St. Mark's Square had long been thought to have been made in the "near East", likely in Syria or the Armenian Kingdom of Cilicia, around the year 300 BC.

\n

However, scientists at Italy's University of Padua, who have analyzed the metal it is made from, are now certain that the statue was created in China during the Tang Dynasty (618-907) for use as a tomb guardian and subsequently taken to Europe, where it was modified to fit European expectations.

\n

The startling discovery was revealed in a scientific study published in the latest edition of the journal Antiquity.

\n

"It is possible that Marco Polo's father and uncle, during the four years they spent at the court of Kublai Khan during their first journey, were responsible for the acquisition of the sculpture," the researchers said, noting that the trip by the European explorers to the court of the ruler — who was also known as Emperor Shizu of Yuan — likely took place between 1264 and 1268.

\n

In addition to deducing that components of the bronze were extracted from the Lower Yangtze River basin, the scientists observed that the 4-meter-long, 2.2-meter-tall statue originally featured horns and longer ears, with a nose resembling that of a Chinese lion statue rather than a European one.

\n

They said it looks as if the statue was "discreetly and laboriously refitted" to make it look more like the winged lion, the holy emblem of St. Mark, the patron saint of Venice.

\n

In addition, they said that the "puzzling absence of written information" about the statue's early years in Europe means "the intention and logistics behind its journey to Venice remain elusive and open to interpretation".

\n

"If the installation … was meant to send a strong, defensive political message, we can now also read it as a symbol of the impressive connectedness of the medieval world," they added.

\n

They speculated that the statue may have been transported more than 9,500 kilometers along the Silk Road trading route between Asia and Europe.

\n

"Venice is a city full of mysteries, but one has been solved," Massimo Vidale, from the University of Padua, told the Press Association.

\n

However, "when the sculpture arrived in Venice, where it was reworked, who did it, or when it was erected on the column where it is still visible today" remain unknown, he said.

\n

Despite the uncertainties, the scientists say that lead isotope analysis indicates there is no doubt the statue originated from China, and that it had the posture and features of a tomb guardian.

\n

earle@mail.chinadailyuk.com

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/10/content_010_68c08eb5ed50ccabe1519252.htm#010WORLD", - "creator": "", - "pubDate": "Wed, 10 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "d161edd5e23a24c0094ee80b4fff2cf1", - "highlights": [] - }, { "title": "011WORLD - Concerns aired as Israel readies for expanded operation in Gaza", "description": "

A man reads one of the leaflets dropped by the Israeli military in Gaza City, urging evacuation, on Tuesday.

\n

Palestinians are on a new catastrophic edge as Israel's military on Tuesday ordered Gaza City residents to evacuate ahead of a ground offensive to seize the enclave's largest urban center, part of a planned takeover stirring repeated international alarm.

\n

Taking over the city of 1 million people further complicates ceasefire efforts to end the nearly two-year conflict. Israel has taken control of nearly 75 percent of Gaza since Oct 7,2023.

\n

"To all residents of Gaza City …the defense forces are determined to defeat Hamas and will act with greater force in the Gaza City area," the military's Arabic-language spokesman Avichay Adraee said in a statement on X. "Evacuate immediately via the Al-Rashid axis."

\n

Over several days, Israel has destroyed 50 high-rise buildings in Gaza City, accusing Hamas of putting surveillance infrastructure in them.

\n

"All of this is just a prelude, just the opening, to the main intensified operation — the ground maneuver of our forces, who are now organizing and assembling to enter Gaza City," Israeli Prime Minister Benjamin Netanyahu said on Monday evening.

\n

The evacuation orders caused panic among Gaza City residents. Laila Saqr, 40, told AFP by telephone, "Israel destroys everything — even the memories. If they could, they would strip the very oxygen from the air."

\n

International critics say Israel's plan, which includes demilitarizing the whole strip as Israel takes security control of it, could deepen the humanitarian plight of the 2.2 million population, which is facing a critical risk of famine.

\n

Volker Turk, the United Nations high commissioner for human rights, on Monday accused Israel of committing "war crime upon war crime" and said the scale of devastation in Gaza was "shocking the conscience of the world".

\n

Phyllis Bennis, a fellow at the Washington-based Institute for Policy Studies, told Al Jazeera that Israel is intent on "ethnically cleansing Gaza".

\n

"Netanyahu shows no signs of changing his demand that Hamas simply surrender as the only answer he would accept, or he will otherwise go ahead with more devastation of Gaza City, and the destruction one by one of high-rise buildings, regardless of who's in them," she said.

\n

Mediation efforts by the United States, Qatar and Egypt have failed to bridge gaps between Israel and Hamas in order to secure a ceasefire and the release of remaining hostages.

\n

Hamas confirmed on Sunday that it had received the proposal from the US that included "some ideas "toward reaching a comprehensive ceasefire.

\n

But senior Hamas official Basem Naim later dismissed this as a trap, saying it amounted to an attempt to secure Hamas' rejection rather than to end the conflict.

\n

Meanwhile, Israeli army radio said Israel tried to attack Hamas officials in Qatar on Tuesday. Qatar's Al Jazeera television, citing a Hamas source, said the attack targeted Hamas Gaza ceasefire negotiators.

\n

Several blasts were heard in Qatar's Doha on Tuesday, Reuters witnesses said.

\n

Flotilla hit

\n

In another development, organizers of a Gaza-bound flotilla carrying aid and pro-Palestinian activists said on Tuesday that one of their boats was hit by a suspected drone off the coast of Tunisia, but authorities there said "no drones" had been detected.

\n

The UN's special rapporteur on the occupied Palestinian territories, Francesca Albanese, who was in Tunisia, told Reuters: "We do not know who carried out the attack, but we would not be surprised if it was Israel. If confirmed, it is an attack against Tunisian sovereignty."

\n

The Global Sumud Flotilla is an initiative seeking to break Israel's naval blockade and deliver humanitarian aid to Gaza using civilian boats. Sumud means "resilience" in Arabic.

\n

Meanwhile, over 1,800 actors, entertainers and producers, including actors Emma Stone, Mark Ruffalo and Tilda Swinton, signed a pledge released on Monday to not work with Israeli film institutions that they see as being complicit in the abuse of Palestinians by Israel.

\n

Agencies contributed to this story.

\n

cuihaipei@chinadaily.com.cn

\n

", @@ -10279,28 +10081,6 @@ "hash": "7e8328d0a705a759aaf6bfab4a8cf0ff", "highlights": [] }, - { - "title": "011WORLD - Labour wins 2nd term in Norway general election", - "description": "

OSLO — Norway's Labour Party, led by Prime Minister Jonas Gahr Store, has claimed victory in Monday's general election, with most votes now counted and with a narrow but clear win by the center-left block over the right-wing parties.

\n

Rapturous cheering erupted in Oslo on Monday night as Labour supporters gathered to celebrate a closely fought campaign in which the future of a wealth tax that dates to the late 19th century has been a central issue.

\n

Addressing the crowd, Store thanked his supporters and said the victory showed it's possible for Social Democratic parties to win elections even with right-wing forces on the rise in Europe, according to broadcaster VG.

\n

Norway should continue to explore oil and gas and remain a reliable energy supplier to Europe, the country's newly reelected prime minister said on Tuesday.

\n

"It's a good result. It's a clear result. It demonstrates that center-left social democrats can win elections even when there are winds blowing from the right," Store told reporters outside his official residence in Oslo.

\n

A short while earlier, Conservative leader Erna Solberg apologized for the dismal performance of her party, which fell to third place in parliament behind the right-wing Progress Party that saw its best result ever in a national election.

\n

Addressing supporters, Progress Party leader Sylvi Listhaug was pleased with her party's result but lamented what she called "four tough years ahead for people and businesses".

\n

About 4.3 million people in the Scandinavian nation were eligible to vote for the new 169-member parliament, known as the Storting. With almost all votes now counted, center-left parties have won just over 85 seats needed to form a majority.

\n

Final results were expected on Tuesday, and they are likely to be followed by weeks of negotiations to build a coalition and agree on Cabinet positions before King Harald can swear in a new government.

\n

Monday's result was never expected to have major implications for Norway's foreign policy. The country is a stalwart member of NATO and a strong supporter of Ukraine. It isn't a member of the European Union but has close economic ties with the 27-nation bloc.

\n

Norway is one of the richest countries in the world. It has a generous welfare state, sits on billions of barrels of oil and gas, and has one of the world's largest sovereign wealth funds, worth around 20 trillion kroner ($2 trillion).

\n

Gross domestic product per person is the sixth-highest in the world, one place above the US, according to the International Monetary Fund.

\n

"We will continue to be a reliable partner, but also to take forward technological steps, cut emissions and live up to our climate obligations," Store said.

\n

", - "content": "

OSLO — Norway's Labour Party, led by Prime Minister Jonas Gahr Store, has claimed victory in Monday's general election, with most votes now counted and with a narrow but clear win by the center-left block over the right-wing parties.

\n

Rapturous cheering erupted in Oslo on Monday night as Labour supporters gathered to celebrate a closely fought campaign in which the future of a wealth tax that dates to the late 19th century has been a central issue.

\n

Addressing the crowd, Store thanked his supporters and said the victory showed it's possible for Social Democratic parties to win elections even with right-wing forces on the rise in Europe, according to broadcaster VG.

\n

Norway should continue to explore oil and gas and remain a reliable energy supplier to Europe, the country's newly reelected prime minister said on Tuesday.

\n

"It's a good result. It's a clear result. It demonstrates that center-left social democrats can win elections even when there are winds blowing from the right," Store told reporters outside his official residence in Oslo.

\n

A short while earlier, Conservative leader Erna Solberg apologized for the dismal performance of her party, which fell to third place in parliament behind the right-wing Progress Party that saw its best result ever in a national election.

\n

Addressing supporters, Progress Party leader Sylvi Listhaug was pleased with her party's result but lamented what she called "four tough years ahead for people and businesses".

\n

About 4.3 million people in the Scandinavian nation were eligible to vote for the new 169-member parliament, known as the Storting. With almost all votes now counted, center-left parties have won just over 85 seats needed to form a majority.

\n

Final results were expected on Tuesday, and they are likely to be followed by weeks of negotiations to build a coalition and agree on Cabinet positions before King Harald can swear in a new government.

\n

Monday's result was never expected to have major implications for Norway's foreign policy. The country is a stalwart member of NATO and a strong supporter of Ukraine. It isn't a member of the European Union but has close economic ties with the 27-nation bloc.

\n

Norway is one of the richest countries in the world. It has a generous welfare state, sits on billions of barrels of oil and gas, and has one of the world's largest sovereign wealth funds, worth around 20 trillion kroner ($2 trillion).

\n

Gross domestic product per person is the sixth-highest in the world, one place above the US, according to the International Monetary Fund.

\n

"We will continue to be a reliable partner, but also to take forward technological steps, cut emissions and live up to our climate obligations," Store said.

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/10/content_011_68c08ec6ed50ccabe1519256.htm#011WORLD", - "creator": "", - "pubDate": "Wed, 10 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "83fda2eee16a1765af28fe2faa10ed20", - "highlights": [] - }, { "title": "011WORLD - Thai top court orders former PM Thaksin to return to prison", "description": "

Former Thai prime minister Thaksin Shinawatra (left) and his daughter Paetongtarn Shinawatra arrive at the Supreme Court in Bangkok, Thailand, on Tuesday.

\n

BANGKOK — Thailand's Supreme Court ruled on Tuesday that former prime minister Thaksin Shinawatra was unlawfully allowed to stay in hospital detention and should return to prison to complete his sentence.

\n

The court's Criminal Division for Holders of Political Positions concluded that Thaksin's six-month hospital stay cannot be counted as time served for a one-year sentence.

\n

"The time spent at a police hospital cannot be deducted as days of imprisonment," the court statement said.

\n

"The defendant knew the facts or was aware the situation was not a critical emergency. The defendant only had a chronic condition that could be treated as an outpatient and did not require hospitalization," it said.

\n

Thaksin arrived at the court for the ruling, scheduled at 10 am, with his youngest daughter and former prime minister Paetongtarn Shinawatra, along with other family members and his lawyer.

\n

In his social media post, Thaksin said he humbly accepted and was ready to enter the judicial process following the verdict.

\n

He acknowledged that, although all the cases arose after the 2006 military coup against his government, he wished to look forward and let everything in the past come to a resolution.

\n

Speaking outside the courthouse after the verdict, Paetongtarn sought to reassure the public about the good spirits of her father and their family while acknowledging the difficulty of the situation.

\n

She affirmed that her Pheu Thai Party would continue its work, moving forward as the opposition to scrutinize the government on behalf of the people.

\n

She added that morale within the party is high and thanked the public for standing by them throughout the ordeal.

\n

Thaksin returned to Thailand in August 2023 after over 15 years of self-imposed exile. Upon arrival, he was taken into custody to serve an eight-year sentence on three convictions involving corruption and abuse of power.

\n

After serving less than a day in jail, he was transferred from a Bangkok prison to the Police General Hospital, citing critical health concerns.

\n

Thaksin's prison sentence was later reduced to one year, following his request for a royal pardon. He was released on parole in February 2024, six months after his return to the country.

\n

The 76-year-old served as the Southern Asian nation's prime minister from 2001 to 2006.

\n

", @@ -10323,28 +10103,6 @@ "hash": "6f0e10185d6e08e7ecbc6e7f3b61a635", "highlights": [] }, - { - "title": "012WORLD - Briefly", - "description": "

DR CONGO

\n

More than 80 killed in overnight rebel attack

\n

At least 80 people were killed overnight from Monday to Tuesday in an attack blamed on Allied Democratic Forces rebels in eastern Democratic Republic of Congo, local authorities confirmed on Tuesday. The attack targeted a funeral gathering in the village of Ntoyo, said Colonel Alain Kiwewa, administrator of Lubero territory in the eastern North Kivu Province, putting the provisional death toll at around 80. The ADF, an Islamic State affiliate in Central Africa, has escalated assaults on villages in North Kivu and Ituri provinces in recent months, mainly targeting civilians.

\n

UNITED STATES

\n

Trump fails to overturn $83 million verdict

\n

A federal appeals court on Monday upheld a civil jury's finding that US President Donald Trump must pay $83.3 million to E. Jean Carroll for his repeated social media attacks and public statements against the longtime advice columnist after she accused him of sexual assault. The 2nd US Circuit Court of Appeals in Manhattan rejected Trump's argument that the verdict should be overturned because he deserved presidential immunity.

\n

EUROPE

\n

EU clamps down on food waste, fast fashion

\n

EU lawmakers gave a final green light on Tuesday to a law on slashing back food waste in Europe each year, and curbing the environmental impact of so-called fast fashion. Brussels estimates the 27-nation bloc generates around 130 kilograms of food waste per person each year — adding up to 60 million tons — as well as around 15 kg of textile waste. By 2030, EU countries will have to slash by 30 percent the food waste generated by households, retailers and restaurants, compared to 2021-23 levels.

\n

", - "content": "

DR CONGO

\n

More than 80 killed in overnight rebel attack

\n

At least 80 people were killed overnight from Monday to Tuesday in an attack blamed on Allied Democratic Forces rebels in eastern Democratic Republic of Congo, local authorities confirmed on Tuesday. The attack targeted a funeral gathering in the village of Ntoyo, said Colonel Alain Kiwewa, administrator of Lubero territory in the eastern North Kivu Province, putting the provisional death toll at around 80. The ADF, an Islamic State affiliate in Central Africa, has escalated assaults on villages in North Kivu and Ituri provinces in recent months, mainly targeting civilians.

\n

UNITED STATES

\n

Trump fails to overturn $83 million verdict

\n

A federal appeals court on Monday upheld a civil jury's finding that US President Donald Trump must pay $83.3 million to E. Jean Carroll for his repeated social media attacks and public statements against the longtime advice columnist after she accused him of sexual assault. The 2nd US Circuit Court of Appeals in Manhattan rejected Trump's argument that the verdict should be overturned because he deserved presidential immunity.

\n

EUROPE

\n

EU clamps down on food waste, fast fashion

\n

EU lawmakers gave a final green light on Tuesday to a law on slashing back food waste in Europe each year, and curbing the environmental impact of so-called fast fashion. Brussels estimates the 27-nation bloc generates around 130 kilograms of food waste per person each year — adding up to 60 million tons — as well as around 15 kg of textile waste. By 2030, EU countries will have to slash by 30 percent the food waste generated by households, retailers and restaurants, compared to 2021-23 levels.

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/10/content_012_68c08ed8ed50ccabe151925a.htm#012WORLD", - "creator": "", - "pubDate": "Wed, 10 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "33f77a7c846476b2a5e89693f9ce9508", - "highlights": [] - }, { "title": "013BUSINESS - Chinese tech firms wow at IFA 2025", "description": "

A view of TCL's booth during the IFA 2025, the world's leading trade fair for consumer electronics held in Berlin, Germany.

\n

Chinese technology companies are in the spotlight at IFA 2025, the world's leading trade fair for consumer electronics, held in Berlin, as they showcase their latest technological achievements, aiming to gain a wider presence in Europe and beyond.

\n

More than 700 Chinese enterprises, which account for over 30 percent of the total registered exhibitors worldwide, are participating in the event, which runs until Wednesday. They are displaying their latest products such as artificial intelligence-powered smart household appliances, new-generation displays, robotics and energy storage systems.

\n

Experts said this robust participation highlights Chinese companies' growing strengths and independent innovation capabilities in cutting-edge technologies, as well as their willingness to expand international cooperation.

\n

Chinese consumer electronics maker TCL Technology Group Corp is demonstrating a diverse range of innovative gadgets, such as QD-Mini LED TVs, mobile phones, tablets, augmented reality glasses, AI-enabled companion robots and home appliances.

\n

The company, being a participant at the event for 15 consecutive years, is stepping up efforts to expand its footprint in Europe by strengthening localized operations, which cover production, supply, marketing and after-sale services.

\n

In the first half, its sales of Mini LED TVs in the European market surged 91 percent year-on-year, while turnover of air conditioners increased 31.7 percent from a year earlier.

\n

Hisense Group, a major Chinese home appliances manufacturer, unveiled a 116-inch Mini LED TV equipped with its self-developed AI imaging chips, and innovative laser display technology, while showcasing intelligent energy solutions and humanoid robots at IFA 2025.

\n

The company witnessed strong business growth in Europe in the first six months, with the sales of laser TVs rising 77 percent and over 80 percent year-on-year in Germany and France, respectively. Hisense also announced that it will continue as an official sponsor of the FIFA World Cup, reinforcing its long-standing collaboration with FIFA since 2018.

\n

DJI, the world's largest commercial drone manufacturer by market share, is sporting a diverse portfolio of consumer-level and agricultural drones. Its panorama cameras, wireless microphones and portable power stations are being displayed at the event.

\n

Industry insiders said Chinese enterprises are constantly upgrading their products and technologies in an attempt to satisfy the increasingly diversified needs of European consumers and gain a bigger slice of the high-end overseas market.

\n

Zhu Keli, founding director of the China Institute of New Economy, said the strong presence of Chinese enterprises at IFA 2025 is a testament to China's rising technological prowess and competitiveness on the global stage, underscoring that Chinese firms' intensified push to bolster innovation is reshaping the global consumer electronics landscape.

\n

"In the past, most Chinese consumer electronics enterprises entered international markets through adopting the original equipment manufacturer (OEM) model or offering cost-effective products. However, nowadays they mainly focus on cutting-edge technologies and innovative products," Zhu said.

\n

He said that along with industrial upgrade and technological advancements, these companies are shifting their focus from providing a single product to systematic solutions targeting premium overseas markets, adding that the world's leading consumer electronics show has emerged as a key venue for Chinese firms looking to deepen their presence in Europe.

\n

Robots have gained a strong foothold during the five-day show. Chinese home cleaning appliance maker Dreame Technology showcased its robotic vacuum cleaners. Global sales of its robotic vacuum cleaners and floor-cleaning machines increased by 178 percent and 100 percent year-on-year, respectively, from January to May, ranking first in 18 countries and regions around the world.

\n

Hong Yong, an associate research fellow at the Chinese Academy of International Trade and Economic Cooperation, said Chinese companies are at the global forefront of technological innovation, and have made remarkable progress in tech frontiers, such as AI, AR and robotics.

\n

They are actively promoting the application of AI technology in intelligent terminal devices, such as AR glasses, robotic vacuum cleaners and smart home equipment, which will be conducive to boosting their own competitiveness on the global stage, and driving the transformation from "Made in China" to "Created in China", Hong said.

\n

fanfeifei@chinadaily.com.cn

\n

", @@ -10367,28 +10125,6 @@ "hash": "6b131944946ba1ca2e5c1a197cf408bb", "highlights": [] }, - { - "title": "013BUSINESS - Prevention principle", - "description": "

Staff members of Taiyuan North Railway Station in Shanxi province participate in a special fire-safety training drill to prevent fire and other hazards. The safe electricity use program seeks to improve their safety mindsets as well as practical skills, and aims to smooth railway transport.

\n

", - "content": "

Staff members of Taiyuan North Railway Station in Shanxi province participate in a special fire-safety training drill to prevent fire and other hazards. The safe electricity use program seeks to improve their safety mindsets as well as practical skills, and aims to smooth railway transport.

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/10/content_013_68c08ee9ed50ccabe151925e.htm#013BUSINESS", - "creator": "", - "pubDate": "Wed, 10 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "62d6329241410424b4334a0f1872636c", - "highlights": [] - }, { "title": "013BUSINESS - MoU inked to promote tourism in Sanya", "description": "

The Cambodia Tourism Board and China's Sanya Tourism Board have signed a memorandum of understanding to advance joint marketing and promotion, highlighting a significant push to increase two-way tourism and cultural exchanges between the popular leisure travel destinations.

\n

The agreement, signed on Tuesday, establishes a comprehensive framework for strategic cooperation focused on implementing joint tourism promotion campaigns.

\n

These efforts will showcase the diverse tourism products, rich heritage and cultural treasures of both Cambodia and Sanya, a tropical resort city on China's island province of Hainan.

\n

Minea Kim, CEO of the Cambodia Tourism Board, said the pact goes beyond a formal agreement. "It is a commitment to friendship, knowledge sharing and building long-term cooperation that will benefit tourism businesses, local vendors and travelers," Kim said.

\n

The Sanya Tourism Board is a Chinese institution responsible for promoting and developing Sanya as an international tourist destination. The board's purpose is to enhance Sanya's global reputation and boost tourism and consumption in the region.

\n

Wu Xiaolin, the board's deputy director general, described the collaboration as "a significant milestone" for tourism growth in both regions. "By combining our strengths, we aim to enhance traveler experiences while generating lasting economic and cultural benefits," Wu said.

\n

The strategic partnership will prioritize collaboration in traditional media, social media and other promotional modalities to increase global visibility. It also includes capacity-building initiatives such as training programs, knowledge exchange and sharing of best practices.

\n

The deal comes as tourist numbers between the two destinations boast robust growth. In the first seven months of this year, Cambodia welcomed more than 3.7 million international visitors, with about 690,000 coming from China — a nearly 50 percent increase from the same period last year.

\n

Angkor Archaeological Park, Cambodia's most famous tourist site, attracted 53,291 Chinese tourists in the January-July period, up 21 percent year-on-year, making China the fourth-largest source of international visitors to the park after the United States, the United Kingdom and France, according to a recent report from Angkor Enterprise.

\n

Meanwhile, Sanya recorded an increase of more than 80 percent in overnight visitors from Cambodia during the same January-July period.

\n

The strategic partnership aligns with the "Cambodia-China Tourism Year 2025" initiative launched earlier this year, which runs from May 2025 to May 2026. Officials said the collaboration will help enhance perceptions of safety and security, promote travel products, foster cross-cultural understanding and support sustainable economic growth and community development.

\n

chenbowen@chinadaily.com.cn

\n

", @@ -10411,28 +10147,6 @@ "hash": "1c86bf6368c603785d0f2a86d3145688", "highlights": [] }, - { - "title": "014BUSINESS - Local currency swaps to deepen monetary ties", - "description": "

China has renewed local currency swaps with three European central banks totaling 540 billion yuan ($75 billion), a move experts said highlights deepening monetary cooperation to safeguard financial stability and the renminbi's growing global role amid efforts to diversify from the dollar-based system.

\n

On the sidelines of the bimonthly meetings of governors held by the Bank for International Settlements from Sunday to Monday, People's Bank of China Governor Pan Gongsheng renewed bilateral local currency swap agreements with his counterparts at the European Central Bank, Swiss National Bank and Magyar Nemzeti Bank — the central bank of Hungary.

\n

Central banks' local currency swaps are agreements that allow two monetary authorities to exchange their currencies and provide liquidity support to each other.

\n

They allow cross-border trade and investment to be settled directly in local currencies, lowering costs and reducing exchange rate risks, while supplying offshore markets with liquidity and helping stabilize financial markets in times of stress.

\n

Zhang Liqing, director of the Center for International Finance Studies at the Central University of Finance and Economics, said that global financial safety nets have long suffered from insufficient resources and operational shortcomings. Bilateral swap agreements and liquidity arrangements, he said, are key components of such safety nets.

\n

"Facing an uncertain global economic and financial environment, appropriately expanding the scale of renminbi bilateral swap agreements and liquidity arrangements — based on reasonable assessment — can demonstrate China's willingness and capacity to safeguard global financial stability, while also advancing the internationalization of the renminbi," Zhang said.

\n

Under the renewed arrangements, the China-EU swap line has been set at 350 billion yuan/45 billion euros ($53 billion) for a three-year term, said China's central bank. The China-Switzerland deal covers 150 billion yuan/17 billion Swiss francs ($21 billion) over five years, while the China-Hungary line amounts to 40 billion yuan/1.9 trillion forints ($5.7 billion), also for five years.

\n

The size of the three swaps is unchanged from previous arrangements.

\n

The renewals came in as part of China's accelerated push to strengthen local currency swap cooperation with its trading partners, especially those participating in the Belt and Road Initiative.

\n

In August, the PBOC renewed its local currency swap agreement with the Reserve Bank of New Zealand, valued at 25 billion yuan and effective for five years. In the first half of the year, similar renewals were completed with Indonesia, Brazil, Turkiye and Sri Lanka.

\n

The central bank's second-quarter monetary policy report showed that, by the end of June, foreign monetary authorities had drawn 80.7 billion yuan under swap arrangements, while the PBOC had used foreign currencies equivalent to about 400 million yuan.

\n

These cooperations have facilitated bilateral trade and investment, supported the development of offshore renminbi markets and improved the overseas usage environment of the Chinese currency, according to the report.

\n

Zhang Lianqi, a member of the Standing Committee of the 14th National Committee of the Chinese People's Political Consultative Conference, said the internationalization of the renminbi is not only a strategic choice by China but also "an inevitable requirement of the multipolar development of the global economy".

\n

Renminbi internationalization helps reduce the externalities of the dollar-dominated system and improves the efficiency of resource allocation, said Zhang Lianqi, who is also chairman of the Enterprise Financial Management Association of China.

\n

"It offers a new path for building a fairer and more stable international financial order," he said, adding that it also represents a significant step in advancing the Global Governance Initiative.

\n

The PBOC has stepped up international engagement in recent weeks. On Thursday, the central bank said it had signed a memorandum of understanding with the Central Bank of the Republic of Azerbaijan to strengthen exchanges in areas including monetary policy, payments and financial technology.

\n

Contact the writers at zhoulanxv@chinadaily.com.cn

\n

", - "content": "

China has renewed local currency swaps with three European central banks totaling 540 billion yuan ($75 billion), a move experts said highlights deepening monetary cooperation to safeguard financial stability and the renminbi's growing global role amid efforts to diversify from the dollar-based system.

\n

On the sidelines of the bimonthly meetings of governors held by the Bank for International Settlements from Sunday to Monday, People's Bank of China Governor Pan Gongsheng renewed bilateral local currency swap agreements with his counterparts at the European Central Bank, Swiss National Bank and Magyar Nemzeti Bank — the central bank of Hungary.

\n

Central banks' local currency swaps are agreements that allow two monetary authorities to exchange their currencies and provide liquidity support to each other.

\n

They allow cross-border trade and investment to be settled directly in local currencies, lowering costs and reducing exchange rate risks, while supplying offshore markets with liquidity and helping stabilize financial markets in times of stress.

\n

Zhang Liqing, director of the Center for International Finance Studies at the Central University of Finance and Economics, said that global financial safety nets have long suffered from insufficient resources and operational shortcomings. Bilateral swap agreements and liquidity arrangements, he said, are key components of such safety nets.

\n

"Facing an uncertain global economic and financial environment, appropriately expanding the scale of renminbi bilateral swap agreements and liquidity arrangements — based on reasonable assessment — can demonstrate China's willingness and capacity to safeguard global financial stability, while also advancing the internationalization of the renminbi," Zhang said.

\n

Under the renewed arrangements, the China-EU swap line has been set at 350 billion yuan/45 billion euros ($53 billion) for a three-year term, said China's central bank. The China-Switzerland deal covers 150 billion yuan/17 billion Swiss francs ($21 billion) over five years, while the China-Hungary line amounts to 40 billion yuan/1.9 trillion forints ($5.7 billion), also for five years.

\n

The size of the three swaps is unchanged from previous arrangements.

\n

The renewals came in as part of China's accelerated push to strengthen local currency swap cooperation with its trading partners, especially those participating in the Belt and Road Initiative.

\n

In August, the PBOC renewed its local currency swap agreement with the Reserve Bank of New Zealand, valued at 25 billion yuan and effective for five years. In the first half of the year, similar renewals were completed with Indonesia, Brazil, Turkiye and Sri Lanka.

\n

The central bank's second-quarter monetary policy report showed that, by the end of June, foreign monetary authorities had drawn 80.7 billion yuan under swap arrangements, while the PBOC had used foreign currencies equivalent to about 400 million yuan.

\n

These cooperations have facilitated bilateral trade and investment, supported the development of offshore renminbi markets and improved the overseas usage environment of the Chinese currency, according to the report.

\n

Zhang Lianqi, a member of the Standing Committee of the 14th National Committee of the Chinese People's Political Consultative Conference, said the internationalization of the renminbi is not only a strategic choice by China but also "an inevitable requirement of the multipolar development of the global economy".

\n

Renminbi internationalization helps reduce the externalities of the dollar-dominated system and improves the efficiency of resource allocation, said Zhang Lianqi, who is also chairman of the Enterprise Financial Management Association of China.

\n

"It offers a new path for building a fairer and more stable international financial order," he said, adding that it also represents a significant step in advancing the Global Governance Initiative.

\n

The PBOC has stepped up international engagement in recent weeks. On Thursday, the central bank said it had signed a memorandum of understanding with the Central Bank of the Republic of Azerbaijan to strengthen exchanges in areas including monetary policy, payments and financial technology.

\n

Contact the writers at zhoulanxv@chinadaily.com.cn

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/10/content_014_68c08efaed50ccabe1519262.htm#014BUSINESS", - "creator": "", - "pubDate": "Wed, 10 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "c1040a22976854876ce6bd9b80cf77ce", - "highlights": [] - }, { "title": "014BUSINESS - SAMR vows fairer market environment", "description": "

China is looking to play a bigger role in shaping global antitrust rules, especially in the artificial intelligence era, as senior market regulator officials and renowned industry experts vowed to boost antitrust at home while expanding international cooperation.

\n

Speaking at the 11th International Forum on Fair Competition Policy of China in Beijing on Monday, Luo Wen, head of the State Administration for Market Regulation, said that China would continue to refine its antitrust and anti-unfair competition laws, build a unified national market and push for "transparent, stable and predictable" rules for businesses at home and abroad.

\n

Luo said China "actively participates in global fair competition governance", citing cooperation agreements signed with 37 jurisdictions and competition chapters in 19 free trade deals. "We will make China's market a stage for global innovation and win-win cooperation," he said.

\n

He added that Chinese authorities would improve the legal framework, enforce against cartels and abuse of dominance, and step up scrutiny of mergers, while eliminating local protectionism to accelerate the building of a unified national market.

\n

Wang Liming, a member of the expert advisory group of the State Council's anti-monopoly and anti-unfair competition commission, said powerful platforms are increasingly using algorithms to enable "millisecond-level price coordination" and to package price discrimination as personalized recommendations.

\n

"Although more than 60 countries and regions have introduced relevant regulations, there is still no coordinated governance framework," Wang said.

\n

He called for new global mechanisms under platforms such as the G20 and APEC, including common standards for algorithm transparency and data governance, a cross-border merger review system, and even international dispute resolution mechanisms to address competition policy conflicts.

\n

Wang warned that seemingly neutral rules such as technical standards or environmental requirements could become "invisible barriers" if used to exclude rivals.

\n

"Competition policy should be a bridge for global prosperity, not a weapon of conflict," he said.

\n

China has been beefing up antitrust efforts, following a major overhaul of its legal framework. SAMR Antitrust Chief Wang Tiehan said regulators have investigated 31 monopoly cases and more than 21,000 unfair competition cases since 2024, while reviewing over 1,100 merger filings.

\n

Wang said the revised anti-unfair competition law now includes provisions on abuses of data rights and digital platforms, and regulators have issued guidelines covering areas from standard-essential patents to pharmaceutical industry bribery risks.

\n

He said, "We will strictly investigate monopolistic and unfair practices that damage overall industry competitiveness and distort ecosystems, ensuring that good money wins the market."

\n

Wang pledged to crack down on local governments that abuse administrative power to block competition, calling the creation of a national unified market a "strategic move related to China's long-term development".

\n

Tech executives at the forum said China's regulatory stance had given them breathing space to innovate in AI.

\n

Wen Jia, head of public affairs at Alibaba Group, said that the company expects more AI-driven innovation to emerge, as AI was already transforming industries from entertainment to e-commerce.

\n

"China's top market regulator creates a friendly regulatory environment that allows companies to experiment. We have every reason to believe that under this innovative and friendly environment, more innovations, driven by AI, will continue to emerge, and the business environment will continue to improve," Wen said.

\n

chengyu@chinadaily.com.cn

\n

", @@ -10455,28 +10169,6 @@ "hash": "533b70dfe019c8376ffe42eff2d45d03", "highlights": [] }, - { - "title": "015BUSINESS - Chi Forest quenching customer thirst worldwide", - "description": "

Chi Forest enters Tesco stores in the United Kingdom in August.

\n

Chinese beverage brand Chi Forest recently debuted its sparkling water products in the United Kingdom's leading supermarket chain Tesco, with about 400 stores set to retail the products.

\n

This launch features two flavors, white peach and lychee, marking Chi Forest's first foray into the UK's mainstream retail channels.

\n

As one of the UK's and the world's leading grocery chains, Tesco has stringent selection criteria. Securing shelf space in Tesco indicates that Chi Forest's commitment to high-quality beverages has been recognized by British retailers and consumers, said the beverage producer.

\n

Tang Tang, head of international business at Chi Forest, said: "Our motivation for going overseas was to test the waters, let more consumers taste our drinks and compete globally, while adhering to higher health standards and building export expertise."

\n

The company has attributed its growing success overseas and its innovations and popularity in the beverage market globally to its "product-first principle".

\n

"Chi Forest always maintains active communication with consumers and listens carefully to their opinions," Tang said.

\n

Chi Forest has used online and offline channels to conduct rapid trials and fast iterations of new stock keeping units. Products are placed in stores, and social media followers are invited to vote on flavors.

\n

Feedback data from these campaigns are displayed in real time to the product and research and development teams, enabling quick flavor adjustments and shorter launch cycles.

\n

This principle also applies to its overseas expansion.

\n

In foreign markets, consumers generally prefer sparkling water with intense fruit flavors, according to their market research, said Tang.

\n

For example, Chi Forest conducts research and gives the voting power to users, based on the US consumers' actual needs and taste preferences. This process includes precise demand capture, deep user engagement and reverse product customization.

\n

It not only ensures the right flavors, but also strengthens user loyalty, laying a solid foundation for their overseas expansion, said the company.

\n

To meet global demand, Chi Forest launched its international expansion in 2019 and has now entered more than 40 countries and regions, completing its entry in mainstream supermarkets across North America and Southeast Asia.

\n

Last year, the beverage producer completed a nationwide rollout in Costco in the United States, entering 591 US warehouses as well as 109 Canadian Costco locations. It was also introduced to Coles supermarkets in Australia. The same year, it launched in South Korea's two leading retail chains, including 19 Costco stores and 35 Lotte department stores.

\n

This year, its sparkling water products landed in Costco Mexico, and its ice tea products debuted in Indonesia's Alfamart convenience chain. Ice tea is now the second product line to enter Indonesia's mainstream channels after sparkling water, with two flavors — white peach jasmine and grapefruit green tea — expected to reach nearly 20,000 Alfamart stores nationwide. Recently the company introduced a new flavor to its sparkling water products, bamboo grapefruit, in Indonesia.

\n

Indonesia is a market deeply rooted in tradition and Muslim consumer preferences. Therefore Indonesia imposes some of the toughest food and beverage import rules in Southeast Asia, the company said.

\n

For example, every single SKU and flavor must be registered with BPOM, which is their national food and drug authority, and any product sold through mainstream channels — primarily convenience stores and supermarkets — must also carry Halal certification from BPJPH.

\n

Halal certification requires that auditors inspect the factory, every raw material, the entire production flow and finished-product specifications. All food and beverage products must undergo strict regulations, including BPOM safety certification and halal validation.

\n

In November 2023, Chi Forest's Hubei province production facility secured halal certification from Indonesia's BPJPH — the second Chinese brand to earn such credentials.

\n

In 2020, Singapore's Health Promotion Board granted Chi Forest the Healthier Choice Symbol. Singapore maintains one of the planet's most stringent food-safety regimes, with tight limits on preservatives and additives.

\n

", - "content": "

Chi Forest enters Tesco stores in the United Kingdom in August.

\n

Chinese beverage brand Chi Forest recently debuted its sparkling water products in the United Kingdom's leading supermarket chain Tesco, with about 400 stores set to retail the products.

\n

This launch features two flavors, white peach and lychee, marking Chi Forest's first foray into the UK's mainstream retail channels.

\n

As one of the UK's and the world's leading grocery chains, Tesco has stringent selection criteria. Securing shelf space in Tesco indicates that Chi Forest's commitment to high-quality beverages has been recognized by British retailers and consumers, said the beverage producer.

\n

Tang Tang, head of international business at Chi Forest, said: "Our motivation for going overseas was to test the waters, let more consumers taste our drinks and compete globally, while adhering to higher health standards and building export expertise."

\n

The company has attributed its growing success overseas and its innovations and popularity in the beverage market globally to its "product-first principle".

\n

"Chi Forest always maintains active communication with consumers and listens carefully to their opinions," Tang said.

\n

Chi Forest has used online and offline channels to conduct rapid trials and fast iterations of new stock keeping units. Products are placed in stores, and social media followers are invited to vote on flavors.

\n

Feedback data from these campaigns are displayed in real time to the product and research and development teams, enabling quick flavor adjustments and shorter launch cycles.

\n

This principle also applies to its overseas expansion.

\n

In foreign markets, consumers generally prefer sparkling water with intense fruit flavors, according to their market research, said Tang.

\n

For example, Chi Forest conducts research and gives the voting power to users, based on the US consumers' actual needs and taste preferences. This process includes precise demand capture, deep user engagement and reverse product customization.

\n

It not only ensures the right flavors, but also strengthens user loyalty, laying a solid foundation for their overseas expansion, said the company.

\n

To meet global demand, Chi Forest launched its international expansion in 2019 and has now entered more than 40 countries and regions, completing its entry in mainstream supermarkets across North America and Southeast Asia.

\n

Last year, the beverage producer completed a nationwide rollout in Costco in the United States, entering 591 US warehouses as well as 109 Canadian Costco locations. It was also introduced to Coles supermarkets in Australia. The same year, it launched in South Korea's two leading retail chains, including 19 Costco stores and 35 Lotte department stores.

\n

This year, its sparkling water products landed in Costco Mexico, and its ice tea products debuted in Indonesia's Alfamart convenience chain. Ice tea is now the second product line to enter Indonesia's mainstream channels after sparkling water, with two flavors — white peach jasmine and grapefruit green tea — expected to reach nearly 20,000 Alfamart stores nationwide. Recently the company introduced a new flavor to its sparkling water products, bamboo grapefruit, in Indonesia.

\n

Indonesia is a market deeply rooted in tradition and Muslim consumer preferences. Therefore Indonesia imposes some of the toughest food and beverage import rules in Southeast Asia, the company said.

\n

For example, every single SKU and flavor must be registered with BPOM, which is their national food and drug authority, and any product sold through mainstream channels — primarily convenience stores and supermarkets — must also carry Halal certification from BPJPH.

\n

Halal certification requires that auditors inspect the factory, every raw material, the entire production flow and finished-product specifications. All food and beverage products must undergo strict regulations, including BPOM safety certification and halal validation.

\n

In November 2023, Chi Forest's Hubei province production facility secured halal certification from Indonesia's BPJPH — the second Chinese brand to earn such credentials.

\n

In 2020, Singapore's Health Promotion Board granted Chi Forest the Healthier Choice Symbol. Singapore maintains one of the planet's most stringent food-safety regimes, with tight limits on preservatives and additives.

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/10/content_015_68c08f0ced50ccabe1519266.htm#015BUSINESS", - "creator": "", - "pubDate": "Wed, 10 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "f36f98e91d703b77edb7a26f13a95339", - "highlights": [] - }, { "title": "019SPORTS - Tonali saves Italy's blushes, as Kosovo gets rare qualifier win", "description": "

Sweden's Alexander Isak (left) clashes with Kosovo's Fidan Aliti during their World Cup UEFA qualifying Group B match at Fadil Vokrri Stadium in Pristina, Kosovo, on Monday.

\n

Sandro Tonali's last-gasp winner edged Italy to a 5-4 victory over Israel in 2026 World Cup qualifying on Monday, while Kosovo beat Sweden, despite Alexander Isak making his first appearance of the season.

\n

After collapsing from leading 4-2 in the final two minutes to facing a 4-4 draw, Tonali's 91st-minute strike in the Hungarian city of Debrecen sent Italy above Israel and into the play-off spot in Group I.

\n

New coach Gennaro Gattuso's side trails leader Norway by three points and still has a chance of taking first place to claim the group's sole direct qualifying spot, as it seeks to avoid missing out on a third-consecutive World Cup finals appearance.

\n

"We'll take the win which was crucial for us, but we're completely nuts, nuts because we conceded some absurd goals," said Gattuso.

\n

"We need to work on that, because we're too fragile, we concede goals too easily. The boys know that, but this is my problem to fix."

\n

Israel, whose players donned black armbands in honor of the victims of Monday's deadly shooting at a bus stop in east Jerusalem, took an early lead through an own goal.

\n

Moise Kean wiped out the nominal host's lead on two occasions before Italy went 4-2 ahead on 81 minutes.

\n

A second Dor Peretz strike in the 88th minute and a clumsy Alessandro Bastoni own-goal two minutes later made it appear the four-time world champion was on course for a disastrous result.

\n

But, Tonali's speculative effort went through a sea of legs and into the net to spark wild celebrations as the topsy-turvy encounter held one last surprise.

\n

Israel has played its 'home' matches in Hungary since the country began its military offensive in Gaza in October 2023.

\n

'No playing time'

\n

Sweden's slow start to its qualifying campaign continued into matchday two, as it went down 2-0 to Kosovo in Pristina.

\n

The Swedes now sit on just one point after a last-gasp equalizer by Slovenia condemned them to a 2-2 draw on Friday.

\n

Goals in the first half from Elvis Rexhbecaj and Vedat Muriqi were enough to give Kosovo just a second-ever win in World Cup qualifying.

\n

Augsburg midfielder Rexhbecaj bundled the host ahead on 26 minutes after goalkeeper Robin Olsen saved his initial one-on-one effort.

\n

Kosovan captain Muriqi then doubled the lead three minutes before the interval with a powerful strike from the edge of the box.

\n

Premier League record signing Isak was sent on from the bench to try and salvage something for the Swedes inside the final 20 minutes.

\n

The Liverpool star had a chance to halve the deficit on 85 minutes, but was stoutly denied by Kosovo keeper Arijanet Muric as the host moved second in Group B, despite finishing the match with 10 men.

\n

" (Isak) had only done three training sessions with the team," Sweden boss Jon Dahl Tomasson told Nordic broadcaster Viaplay.

\n

"He had no pre-season with (his former club Newcastle), and of course no playing time," he added of the 25-year-old, who endured a turbulent transition from Tyneside to Anfield.

\n

Switzerland, which beat Kosovo 4-0 last week, stays top of the pool following a dominant first-half display against Slovenia in Basel.

\n

The home side ran out 3-0 winners after goals by Nico Elvedi, Breel Embolo and Dan Ndoye inside the first 40 minutes.

\n

Denmark won by the same margin in Greece, as it moved top of Group C on four points. It sits level with Scotland, which beat Belarus 2-0 in Zalaegerszeg, Hungary.

\n

Croatia took the lead in Group L with a 4-0 home victory over neighboring Montenegro.

\n

Kristijan Jakic opened the scoring in Zagreb, before Montenegro was reduced to 10 men when Andrija Bulatovic saw red.

\n

Andrej Kramaric went clear at the top of the qualification goal-scoring chart with his sixth goal of the campaign on 51 minutes, before a late Edvin Kuc own goal and an Ivan Perisic strike put gloss on the result.

\n

The 2018 World Cup runner-up leapfrogged the Czech Republic atop the table with both countries boasting 12 points, although Croatia has a match in hand.

\n

The Faroe Islands moved to third in the group with a 1-0 win over Gibraltar.

\n

", @@ -10499,28 +10191,6 @@ "hash": "6fcbbf5bf98f8906f6c2c088ac3a6c9f", "highlights": [] }, - { - "title": "020SPORTS - YAN THROWS DOWN THE GAUNTLET", - "description": "

\n

China shot putter Gong Lijiao is looking forward to returning to Tokyo, where she claimed her Olympic gold in 2021.

\n

Left: Veteran sprinter Xie Zhenye is full of confidence heading to Tokyo. Right: Asian triple jump recordholder Wu Ruiting also joins the Team China roster.

\n

With youngsters making their mark and veterans tuning up in good shape, the Beijing meet on World Athletics' continental circuit has the country's best well set up for the Tokyo worlds and beyond.

\n

Too young to enter the world championships right away in Tokyo, China's prodigy javelin thrower Yan Ziyi has emerged as one to watch in two years time when the track and field flagship championships return to Beijing, following her impressive debut on the Continental Tour Gold series, which is a step below the Diamond League, in the Chinese capital on Sunday.

\n

At 17 years old and in just her second season competing full-time in javelin, Yan has immediately thrust her name into the elite ranks, throwing 64.46 meters on her first attempt at Beijing's National Olympic Sports Center Stadium to claim her first title on World Athletics' second-tier circuit.

\n

Also an exceptional talent in shot put, Yan had dominated both disciplines at the junior level, underlined by her golden double at the U15 World School Sport Games in 2023, before she switched her focus entirely to javelin at the beginning of last year.

\n

Even throwing against an established field that included multiple world championships qualifiers, at the Beijing meet, Yan stole the show with her sheer power and composure, securing the win with her first attempt, which was the only 64m-plus effort on the night, backing up her medal credentials at what will be her worlds debut at the Bird's Nest in 2027.

\n

The biennial World Athletics Championships, the 2025 edition of which begin Saturday in Tokyo, cap the age limit for entries in all throwing disciplines at 18, and next time will again be held in Beijing, 12 years after the city hosted the 2015 edition.

\n

"Now that I've broken the 65m mark this year, my target will be cracking 66m next year and building toward the 2027 world championships at home," Yan said in the mixed zone after Sunday's final.

\n

"I didn't manage to do my best today, after messing up with my pace in the next few attempts following the first throw.

\n

"I know I can do better, and I am looking forward to proving it in 2027."

\n

Yan's season peaked early last month at the national championships in Quzhou, Zhejiang province, where, despite carrying a foot injury, she produced a personal best of 65.89m in her final attempt to secure a second straight senior national title while producing the world's third-best result so far this year.

\n

The throw could've won her gold at the 2024 Paris Olympics, surpassing the winning distance of Japan's Haruka Kitaguchi by nine centimeters, although Yan did it with her right foot sprained from her third attempt.

\n

She missed the Paris Games due to the same age limitations, while her coach Lu Xiurong understands patience is required for Yan's long-term development.

\n

"We do have regrets. If she were able to compete in Paris last year, it would be hard to predict the champion," Lu told Xinhua after the national meet.

\n

"On the other hand, we knew that it might be a little premature to let such a young girl participate on the Olympic stage, so we should keep training, step by step, to wait for our chance."

\n

Also shining at the Beijing meet on Sunday was China's veteran sprinter Xie Zhenye, who clocked a season best 10.21 seconds to finish fourth in the men's 100m final, which was won by Oman's Ali Al-Balushi in 10.09.

\n

Xie, a fourtime Olympian and a member of China's silver-winning 4x100m relay team at the 2015 worlds, said his time at the continental meet has built his confidence for what will be his sixth world championships.

\n

"To run a time like I did tonight, despite fatigue from a high-intensity training program, is a real confidence boost for me going to Tokyo," said the 32-year-old, who holds the Asian 200m record of 19.88 achieved in London in July 2019.

\n

Xie is among 73 Chinese athletes that have qualified for the Tokyo worlds, and will race side-by-side with the country's next generation of sprinters, such as 23-year-old Deng Xinrui, China's first 100m world championships racer born after 2000.

\n

Other notable leading lights on China's world championships roster include women's veteran shot put thrower Gong Lijiao, men's Asian triple jump record-holder Wu Ruiting and women's reigning Olympic champion race walker Yang Jiayu.

\n

Gong, who won her first Olympic gold medal at Tokyo 2020, said she looks forward to returning to her happy hunting ground with a more relaxed mindset this time around.

\n

"I am just enjoying my career at the moment and trying to represent my country at the highest level for as long as I can," said the 36-year-old, who won back-to-back worlds titles in 2017 and 2019.

\n

Despite Yan's absence in javelin, 17-year-old sprinter Chen Yujie is expected to step up to represent the nation's young talent, as the 100m and 200m runner looks to showcase the fast progress China's next generation of racers has made.

\n

"I am a bit nervous for my first world championships, which I think it's normal for a young athlete like me," said Chen, who is eligible to compete in Tokyo having met the 16-year-old age benchmark for track disciplines.

\n

"Supported by more advanced training methods, more scientifically effective rehab and a healthy competition with teammates, I expect to present the powerful and beautiful image of China's younger generation on the world stage," said Chen, who is set to run the 200m and 4x100m relay in Tokyo.

\n

sunxiaochen@chinadaily.com.cn

\n



获取更多RSS:
https://feedx.net
https://feedx.site
", - "content": "

\n

China shot putter Gong Lijiao is looking forward to returning to Tokyo, where she claimed her Olympic gold in 2021.

\n

Left: Veteran sprinter Xie Zhenye is full of confidence heading to Tokyo. Right: Asian triple jump recordholder Wu Ruiting also joins the Team China roster.

\n

With youngsters making their mark and veterans tuning up in good shape, the Beijing meet on World Athletics' continental circuit has the country's best well set up for the Tokyo worlds and beyond.

\n

Too young to enter the world championships right away in Tokyo, China's prodigy javelin thrower Yan Ziyi has emerged as one to watch in two years time when the track and field flagship championships return to Beijing, following her impressive debut on the Continental Tour Gold series, which is a step below the Diamond League, in the Chinese capital on Sunday.

\n

At 17 years old and in just her second season competing full-time in javelin, Yan has immediately thrust her name into the elite ranks, throwing 64.46 meters on her first attempt at Beijing's National Olympic Sports Center Stadium to claim her first title on World Athletics' second-tier circuit.

\n

Also an exceptional talent in shot put, Yan had dominated both disciplines at the junior level, underlined by her golden double at the U15 World School Sport Games in 2023, before she switched her focus entirely to javelin at the beginning of last year.

\n

Even throwing against an established field that included multiple world championships qualifiers, at the Beijing meet, Yan stole the show with her sheer power and composure, securing the win with her first attempt, which was the only 64m-plus effort on the night, backing up her medal credentials at what will be her worlds debut at the Bird's Nest in 2027.

\n

The biennial World Athletics Championships, the 2025 edition of which begin Saturday in Tokyo, cap the age limit for entries in all throwing disciplines at 18, and next time will again be held in Beijing, 12 years after the city hosted the 2015 edition.

\n

"Now that I've broken the 65m mark this year, my target will be cracking 66m next year and building toward the 2027 world championships at home," Yan said in the mixed zone after Sunday's final.

\n

"I didn't manage to do my best today, after messing up with my pace in the next few attempts following the first throw.

\n

"I know I can do better, and I am looking forward to proving it in 2027."

\n

Yan's season peaked early last month at the national championships in Quzhou, Zhejiang province, where, despite carrying a foot injury, she produced a personal best of 65.89m in her final attempt to secure a second straight senior national title while producing the world's third-best result so far this year.

\n

The throw could've won her gold at the 2024 Paris Olympics, surpassing the winning distance of Japan's Haruka Kitaguchi by nine centimeters, although Yan did it with her right foot sprained from her third attempt.

\n

She missed the Paris Games due to the same age limitations, while her coach Lu Xiurong understands patience is required for Yan's long-term development.

\n

"We do have regrets. If she were able to compete in Paris last year, it would be hard to predict the champion," Lu told Xinhua after the national meet.

\n

"On the other hand, we knew that it might be a little premature to let such a young girl participate on the Olympic stage, so we should keep training, step by step, to wait for our chance."

\n

Also shining at the Beijing meet on Sunday was China's veteran sprinter Xie Zhenye, who clocked a season best 10.21 seconds to finish fourth in the men's 100m final, which was won by Oman's Ali Al-Balushi in 10.09.

\n

Xie, a fourtime Olympian and a member of China's silver-winning 4x100m relay team at the 2015 worlds, said his time at the continental meet has built his confidence for what will be his sixth world championships.

\n

"To run a time like I did tonight, despite fatigue from a high-intensity training program, is a real confidence boost for me going to Tokyo," said the 32-year-old, who holds the Asian 200m record of 19.88 achieved in London in July 2019.

\n

Xie is among 73 Chinese athletes that have qualified for the Tokyo worlds, and will race side-by-side with the country's next generation of sprinters, such as 23-year-old Deng Xinrui, China's first 100m world championships racer born after 2000.

\n

Other notable leading lights on China's world championships roster include women's veteran shot put thrower Gong Lijiao, men's Asian triple jump record-holder Wu Ruiting and women's reigning Olympic champion race walker Yang Jiayu.

\n

Gong, who won her first Olympic gold medal at Tokyo 2020, said she looks forward to returning to her happy hunting ground with a more relaxed mindset this time around.

\n

"I am just enjoying my career at the moment and trying to represent my country at the highest level for as long as I can," said the 36-year-old, who won back-to-back worlds titles in 2017 and 2019.

\n

Despite Yan's absence in javelin, 17-year-old sprinter Chen Yujie is expected to step up to represent the nation's young talent, as the 100m and 200m runner looks to showcase the fast progress China's next generation of racers has made.

\n

"I am a bit nervous for my first world championships, which I think it's normal for a young athlete like me," said Chen, who is eligible to compete in Tokyo having met the 16-year-old age benchmark for track disciplines.

\n

"Supported by more advanced training methods, more scientifically effective rehab and a healthy competition with teammates, I expect to present the powerful and beautiful image of China's younger generation on the world stage," said Chen, who is set to run the 200m and 4x100m relay in Tokyo.

\n

sunxiaochen@chinadaily.com.cn

\n



获取更多RSS:
https://feedx.net
https://feedx.site
", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/10/content_020_68c08f37ed50ccabe1519270.htm#020SPORTS", - "creator": "", - "pubDate": "Wed, 10 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "fb4b94ff8a5107472aecdb0b882fbbac", - "highlights": [] - }, { "title": "001FRONT - Xi calls for defending multilateralism", "description": "

President Xi Jinping delivers a speech titled "Forging Ahead in Solidarity and Cooperation" while attending a virtual BRICS Summit via video link in Beijing on Monday.

\n

President Xi Jinping has called on the BRICS countries to jointly defend multilateralism and the multilateral trading system and advance greater BRICS cooperation, as trade and tariff wars waged by a certain country severely disrupt the world economy and undermine international trade rules.

\n

Xi made the remarks while participating in a virtual BRICS Summit from Beijing on Monday. He was joined by other leaders including Brazilian President Luiz Inacio Lula da Silva, Russian President Vladimir Putin and South African President Cyril Ramaphosa, as well as leaders from Egypt, Iran, Indonesia and the United Arab Emirates, and representatives from India and Ethiopia.

\n

Xi described BRICS countries as the forefront of the Global South amid rampant hegemonism, unilateralism and protectionism, saying that this is a critical juncture for them to act on the BRICS Spirit of openness, inclusiveness and win-win cooperation.

\n

Originally comprising Brazil, Russia, India, China and South Africa, BRICS has developed into a group of 11 full member countries and 10 partner countries.

\n

The BRICS cooperation mechanism is now considered to be an important platform for solidarity and cooperation among emerging markets and developing countries.

\n

Xi called for upholding multilateralism to defend international fairness and justice.

\n

"History tells us that multilateralism is the shared aspiration of the people and the overarching trend of our times. It provides an important underpinning for world peace and development," he said, noting that the Global Governance Initiative that he recently proposed is aimed at galvanizing joint global action for a more just and equitable global governance system.

\n

"We should follow the principle of extensive consultation and joint contribution for shared benefit, and safeguard the international system with the United Nations at its core and the international order based on international law, so as to cement the foundations of multilateralism," Xi said.

\n

He also called for efforts to actively promote greater democracy in international relations and increase the representation and voice of Global South countries.

\n

"We should improve the global governance system through reform so as to fully mobilize resources from all quarters and tackle more effectively the common challenges for humanity," Xi said.

\n

Noting that economic globalization is an irresistible trend of history, Xi stressed the need to uphold openness and win-win cooperation to safeguard the international economic and trade order.

\n

Countries cannot thrive without an international environment of open cooperation, and no country can afford to retreat into self-imposed isolation, he said.

\n

"No matter how the international landscape may evolve, we must stay committed to building an open global economy, so as to share opportunities and achieve win-win outcomes in openness," Xi said, calling for efforts to oppose all forms of protectionism.

\n

"We should promote a universally beneficial and inclusive economic globalization, place development at the heart of our international agenda, and ensure that Global South countries participate in international cooperation as equals and share in the fruits of development," he said.

\n

The Chinese president also emphasized the importance of BRICS countries managing their own affairs well in order to cope with external challenges.

\n

Accounting for nearly half of the world's population, around 30 percent of global economic output and one-fifth of global trade, the BRICS countries are also home to major natural resources, big manufacturers and vast markets, Xi said.

\n

"The more closely we work together, the more resilient, resourceful and effective we are in addressing external risks and challenges," he said, expressing China's readiness to work with fellow BRICS countries to implement the Global Development Initiative and advance high-quality Belt and Road cooperation.

\n

He also encouraged BRICS countries to leverage their respective strengths, deepen practical cooperation and produce more outcomes in such areas as trade and the economy, finance, science and technology, in order to deliver more practical benefits to their peoples.

\n

mojingxi@chinadaily.com.cn

\n

", @@ -10543,28 +10213,6 @@ "hash": "e4f58a6739853e5f0b0ce929977dc89a", "highlights": [] }, - { - "title": "001FRONT - Trade fair highlights broadened opening-up", - "description": "

President Xi Jinping reiterated on Monday China's firm commitment to expanding high-standard opening-up to inject more positive energy and greater certainty into global development.

\n

Xi made the remarks in a congratulatory message sent to the 25th China International Fair for Investment and Trade, which opened in Xiamen, Fujian province, on Monday.

\n

Xi noted that the CIFIT, with a permanent theme of "Further expanding bilateral investment, jointly facilitating global development", has played a positive role in promoting the building of an open world economy and has become an effective platform for global investors to deepen pragmatic cooperation.

\n

As a major contributor to and anchor of stability for global economic growth, China will unswervingly expand high-standard opening-up and promote the liberalization and facilitation of trade and investment and continue to share its development opportunities with the world, he said.

\n

Xi also expressed the country's willingness to work with all parties to promote universally beneficial and inclusive economic globalization and create a bright future of prosperity and development.

\n

Organized by the Ministry of Commerce, the four-day event has attracted delegations from more than 120 countries and regions. Nearly 100 multinational corporations from sectors including energy, chemicals, agriculture, pharmaceuticals and advanced manufacturing have sent senior executives.

\n

Addressing the opening ceremony of the event, Vice-Premier He Lifeng emphasized the rise of unilateralism and protectionism and the mounting instability and uncertainty in the global economy, which he said have posed new difficulties and challenges for international economic and trade cooperation.

\n

He called for upholding the liberalization and facilitation of global trade and investment, ensuring stable and unimpeded global industrial and supply chains, and maintaining an open and cooperative international environment.

\n

"The fundamentals of the Chinese economy are strong, with many advantages, strong resilience and vast potential. Partnering with China will bring more opportunities," he said, adding that China, with immense consumption potential, will create huge market opportunities for the world.

\n

China boasts the world's largest middle-income group, with per capita GDP of approximately 96,000 yuan ($13,465) in 2024. It is the world's second-largest consumption market and second-largest import market.

\n

Over the years, China has been steadfastly deepening reform on all fronts to build a new system for an open economy. A series of measures on the reform of foreign trade have been introduced in areas including taxation, finance, and trade and investment facilitation.

\n

Since 2017, the total number of items on the negative list of restricted sectors for foreign investment has been reduced from 93 to 29, with all access restrictions for the manufacturing sector removed.

\n

Vice-Minister of Commerce Ling Ji said at the opening ceremony that China is both a major destination for foreign investment and a leading global investor.

\n

By the end of 2024, Chinese enterprises had established more than 50,000 overseas companies in 190 countries and regions, with outbound flows and stock ranking among the world's top three, Ling said, adding that China's outbound direct investment reached $162.8 billion in 2024, up 10.1 percent from the previous year and marking 13 consecutive years in the global top three.

\n

"China's vast market, resilient supply chain and application of emerging technologies show that investing in China is investing in the future," Ling said.

\n

Sovereign wealth funds and international financial institutions are also represented at the event, with more than 70 financial institutions and listed firms participating in the dedicated Financial Capital Zone.

\n

More than 30 matchmaking sessions are scheduled, alongside a high-level multinational roundtable meeting. The exhibitions spotlight frontier industries such as smart robotics, low-altitude aviation and specialized cooperation of small and medium-sized enterprises, while a public road show zone, introduced for the first time, will host more than 100 presentations.

\n

Observers said that against the backdrop of weak global economic momentum, rising trade and investment barriers, and slowing cross-border investment, active participation in the event highlights China's appeal to foreign investors.

\n

Wide participation

\n

The United Kingdom, this year's guest country of honor, has brought its largest-ever delegation, comprising nearly 200 officials, business leaders and industry representatives.

\n

In a congratulatory letter sent to the CIFIT, UK Prime Minister Keir Starmer said Britain is committed to being a "predictable and pragmatic partner" with China, highlighting opportunities for mutual investment.

\n

The American Chamber of Commerce in South China sent a sizable delegation to the fair, with more than 50 US companies participating in industries such as artificial intelligence, infrastructure, consumer goods and renewable energy.

\n

Harley Seyedin, president and chairman of AmCham South China, said that US businesses view the CIFIT as "a proven platform" for exploring new opportunities in China, noting that the CIFIT has generated over $2 billion in contracts annually for the US companies participating in the event.

\n

He added that 76 percent of the chamber's member companies plan to reinvest in China, amounting to $14.5 billion in new projects over the next three to five years, underscoring their long-term confidence despite global headwinds.

\n

Contact the writers at caodesheng@chinadaily.com.cn

\n

", - "content": "

President Xi Jinping reiterated on Monday China's firm commitment to expanding high-standard opening-up to inject more positive energy and greater certainty into global development.

\n

Xi made the remarks in a congratulatory message sent to the 25th China International Fair for Investment and Trade, which opened in Xiamen, Fujian province, on Monday.

\n

Xi noted that the CIFIT, with a permanent theme of "Further expanding bilateral investment, jointly facilitating global development", has played a positive role in promoting the building of an open world economy and has become an effective platform for global investors to deepen pragmatic cooperation.

\n

As a major contributor to and anchor of stability for global economic growth, China will unswervingly expand high-standard opening-up and promote the liberalization and facilitation of trade and investment and continue to share its development opportunities with the world, he said.

\n

Xi also expressed the country's willingness to work with all parties to promote universally beneficial and inclusive economic globalization and create a bright future of prosperity and development.

\n

Organized by the Ministry of Commerce, the four-day event has attracted delegations from more than 120 countries and regions. Nearly 100 multinational corporations from sectors including energy, chemicals, agriculture, pharmaceuticals and advanced manufacturing have sent senior executives.

\n

Addressing the opening ceremony of the event, Vice-Premier He Lifeng emphasized the rise of unilateralism and protectionism and the mounting instability and uncertainty in the global economy, which he said have posed new difficulties and challenges for international economic and trade cooperation.

\n

He called for upholding the liberalization and facilitation of global trade and investment, ensuring stable and unimpeded global industrial and supply chains, and maintaining an open and cooperative international environment.

\n

"The fundamentals of the Chinese economy are strong, with many advantages, strong resilience and vast potential. Partnering with China will bring more opportunities," he said, adding that China, with immense consumption potential, will create huge market opportunities for the world.

\n

China boasts the world's largest middle-income group, with per capita GDP of approximately 96,000 yuan ($13,465) in 2024. It is the world's second-largest consumption market and second-largest import market.

\n

Over the years, China has been steadfastly deepening reform on all fronts to build a new system for an open economy. A series of measures on the reform of foreign trade have been introduced in areas including taxation, finance, and trade and investment facilitation.

\n

Since 2017, the total number of items on the negative list of restricted sectors for foreign investment has been reduced from 93 to 29, with all access restrictions for the manufacturing sector removed.

\n

Vice-Minister of Commerce Ling Ji said at the opening ceremony that China is both a major destination for foreign investment and a leading global investor.

\n

By the end of 2024, Chinese enterprises had established more than 50,000 overseas companies in 190 countries and regions, with outbound flows and stock ranking among the world's top three, Ling said, adding that China's outbound direct investment reached $162.8 billion in 2024, up 10.1 percent from the previous year and marking 13 consecutive years in the global top three.

\n

"China's vast market, resilient supply chain and application of emerging technologies show that investing in China is investing in the future," Ling said.

\n

Sovereign wealth funds and international financial institutions are also represented at the event, with more than 70 financial institutions and listed firms participating in the dedicated Financial Capital Zone.

\n

More than 30 matchmaking sessions are scheduled, alongside a high-level multinational roundtable meeting. The exhibitions spotlight frontier industries such as smart robotics, low-altitude aviation and specialized cooperation of small and medium-sized enterprises, while a public road show zone, introduced for the first time, will host more than 100 presentations.

\n

Observers said that against the backdrop of weak global economic momentum, rising trade and investment barriers, and slowing cross-border investment, active participation in the event highlights China's appeal to foreign investors.

\n

Wide participation

\n

The United Kingdom, this year's guest country of honor, has brought its largest-ever delegation, comprising nearly 200 officials, business leaders and industry representatives.

\n

In a congratulatory letter sent to the CIFIT, UK Prime Minister Keir Starmer said Britain is committed to being a "predictable and pragmatic partner" with China, highlighting opportunities for mutual investment.

\n

The American Chamber of Commerce in South China sent a sizable delegation to the fair, with more than 50 US companies participating in industries such as artificial intelligence, infrastructure, consumer goods and renewable energy.

\n

Harley Seyedin, president and chairman of AmCham South China, said that US businesses view the CIFIT as "a proven platform" for exploring new opportunities in China, noting that the CIFIT has generated over $2 billion in contracts annually for the US companies participating in the event.

\n

He added that 76 percent of the chamber's member companies plan to reinvest in China, amounting to $14.5 billion in new projects over the next three to five years, underscoring their long-term confidence despite global headwinds.

\n

Contact the writers at caodesheng@chinadaily.com.cn

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/09/content_001_68bf4144ed50ccabe151910f.htm#001FRONT", - "creator": "", - "pubDate": "Tue, 09 Sep 2025 00:21:05 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "d3c083c12fe7520951f701cbfbc0c48d", - "highlights": [] - }, { "title": "001FRONT - 'APRON MOM' URGED TO CUT STRINGS TO OUTDATED IMAGE", "description": "

The cast members of the film New Happy Dad and Son 5: My Alien Friend, the latest installment of the Big-Head Son and Small-Head Dad series, pose at the opening ceremony of the 12th Beijing International Film Festival on Aug 12, 2022.

\n

Xiao Yuman's husband reads a book with his daughter in Xi'an, Shaanxi province.

\n

Shao Chenting's daughters read a children's book together in Beijing.

\n

An instructor reads to children at a children's picture book library in Chongqing on April 22.

\n

Parents read books for their children in Aksu, Xinjiang Uygur autonomous region, on April 21.

\n

Portraying a three-member household, the award-winning animated series Big-Head Son and Small-Head Dad — first aired in 1995 — is back in the public eye, after sparking fiery debate about gender and family roles.

\n

At the center of the discussions is "Apron Mom", who many critics of the cartoon have pointed out appears to only exist to serve the interests of the father and son.

\n

Social media influencer "Maebo" got the ball rolling on the Red-Note platform in February with her post "Apron Mom, when can you take off your apron?" The post garnered over 47,000 likes, and the trending topic has since led to widespread online discussion about the issue.

\n

After her post went viral, Maebo said several netizens shared scenes from the cartoon that exemplified the problem of the outdated depiction of a mother's role. One of the most widely discussed clips shows Apron Mom fainting while Small-Head Dad rushes over and says: "Apron Mom, you can't die! Big-Head and I haven't had dinner yet!"

\n

"To place an individual's life below the urgency of whether or not dinner is served goes beyond gender," Maebo said, "it becomes a question of basic humanity."

\n

In another clip, Big-Head Son announces: "Today is International Women's Day. Let's let Apron Mom rest for one day." Maebo said "rest" is framed as an "exceptional reward "for Apron Mom, with the implication that "not resting is her default duty".

\n

Maebo's posts quickly drew a wide range of comments.

\n

Some pointed out that while the male characters are identified by their physical traits, the mother is defined by an apron, a symbol of domesticity. "It reinforces the idea that her identity is inseparable from her labor," Maebo said.

\n

One English teacher noted that during classroom exercises on occupations, students frequently associated fathers with prestigious jobs such as "doctor" or "engineer", while mothers were more often labeled "cook". The teacher began encouraging students to challenge these assumptions, reminding them that mothers can also be doctors.

\n

Whether humorous or serious, one netizen posted an observation about Big-Head Son's birth, saying, "his head is so large that it must have been a painful childbirth for Apron Mom."

\n

Unwelcome cliches

\n

Beijing mother Shao Chenting's epiphany on changing gender roles came one evening when she was reading a bedtime story to her two daughters, ages 8 and 5.

\n

Dressed in her pink pajamas and nestled between the two girls she opened the pages of No, David!. The main character, a 5-year-old boy, misbehaves all the time and on every page it is the mother who admonishes him. The story starts with the line: "David's mother always said — No, David!"

\n

Shao's question was: "Where's the dad in this family?"

\n

This moment forced her to look at the broader world of children's media her daughters were consuming.

\n

Her older girl's favorite picture book series from Japan, Butt Detective, talks about the protagonist's father, who is also a detective and often joins him in adventures. The mother is barely mentioned.

\n

In many other children's books Shao has bought, mothers were invariably shown wearing an apron, doing chores, and looking after the children when the fathers are absent.

\n

She also realized the same was true for cartoons. In the Japanese anime Crayon Shin-chan, the mother is portrayed as someone who "doesn't go to work and handles all kinds of housework every day".

\n

"Moms wearing aprons seemed normal to me," said Shao. "Maybe deep down, I still think women should take on more housework."

\n

Even though domestic chores and parenting are supposedly more equal today, Shao said, "if it's the dad wearing an apron, I might wonder if it's a single-parent household."

\n

She had primarily purchased foreign picture books for her children, and largely relied on recommendations from parenting groups without closely scrutinizing the content.

\n

Domestic 'servant'

\n

Xiao Yuman from Xi'an, Shaanxi province, has been reading both Chinese and foreign picture books to her 11-year-old daughter since the child was an infant.

\n

She says the very name "Apron Mom" ties the character to domestic labor, reducing her identity to that of a household servant. The father's professional identity as an engineer is frequently mentioned, while the mother's occupation is rarely, if ever, addressed.

\n

"This reinforced the traditional gender divide of men working outside and women staying inside," said Xiao.

\n

"Apron Mom shouldered nearly all household duties, while Small-Head Dad was often absent from housework due to work commitments, which hinted at a broader societal tolerance for low paternal involvement in child rearing."

\n

For Maebo, these strong responses toward this last-century cartoon point to wider social progress.

\n

"It's about how women's voices are growing stronger as they become more engaged in production in society," she said.

\n

"As a classic cartoon, the characters were familiar to almost every household, but looking at the story from Apron Mom's perspective feels like a fresh angle. It's the classic image of motherhood clashing with modern social thinking — that tension makes people pause."

\n

Maebo said in real life she had never encountered anyone like Apron Mom "an emotionless machine that silently performs unpaid domestic labor without resistance".

\n

Her awareness of gender roles began early in life. Her father took on more parenting responsibilities, while her mother focused on running a business.

\n

"As a child, I often felt confused. What I saw on television didn't match what I experienced at home," she said.

\n

Yang Yiyi, a Chinese PhD student in the United States, said straddling both Eastern and Western cultures had prompted her to reflect deeply on the gender dynamics in her family.

\n

Her mother is from Jilin province, and her father is from Shandong province. She recalls the stark division of labor during Chinese New Year celebrations.

\n

"The women would handle almost all the food preparation while the men sat around drinking and chatting," she said. "Even my uncle, known for being an excellent cook, still relied on the women in the family to assist him in the kitchen, while the other men remained uninvolved."

\n

Yang said family attitudes toward childbirth also differed. She found it strange to hear men — her father and his brothers — talk so casually about how "it's good to have children and how people should have more".

\n

"They're not the ones going through pregnancy. They don't have a uterus, yet they speak as if the physical and emotional burden on women doesn't matter," she said.

\n

'Idealized' devotion

\n

Xiao, from Xi'an, is concerned about the recurring portrayal of mothers as self-sacrificing figures in children's stories.

\n

She pointed to the popular traditional tale Meng Mu San Qian (Mencius' Mother Relocates Three Times) as an example. In the story, Mencius' mother moves home to ensure a good learning environment for her son, an example of how maternal devotion is often idealized.

\n

Xiao said such narratives risk turning mothers into "sacred instruments of sacrifice", defined by their dedication to their children.

\n

"Mencius' mother's greatness is undeniable," Xiao said.

\n

"But where is Mencius in the story? He comes across as a puppet shaped entirely by his environment. Shouldn't the child's choice matter too?"

\n

Xiao also expressed concern that glorifying unconditional maternal sacrifice, without any nuance, can obscure real-life emotional complexities — and in some cases, lead to unhealthy or even tragic outcomes.

\n

Living between two cultures, Yang believes that gender expectations around parenting are not unique to China. From conversations with peers in the US, particularly her Asian American classmates, she has found that similar dynamics persist in Western settings. Some of her American-born Chinese friends said their families still somehow manage to be "traditional".

\n

The imbalance in how mothers and fathers are portrayed and expected to behave, whether in children's books, cartoons, or real life, is a shared cultural issue, Yang believes.

\n

Importance of fathers

\n

Contrary to some stereotypes, the involvement of men in child raising and home life is crucial, according to at least one expert.

\n

Linda Nielsen is a professor of adolescent and educational psychology at Wake Forest University in North Carolina, and an expert on shared physical custody for children of divorce.

\n

She has been working on parenting issues for decades, and challenges the widespread belief that fathers are less capable than mothers in nurturing children's social and emotional development.

\n

"We have bought into negative stereotypes about fathers that do not reflect reality," said Nielsen. "We have embraced many demeaning, insulting beliefs about fathers that are baseless and run counter to the research and to national statistics."

\n

Citing decades of research, she explained that children who regularly engage in active, stimulating interactions with their fathers — especially during early childhood — tend to exhibit lower levels of aggression, better emotional regulation, and more advanced social skills compared with those who have less involved fathers.

\n

Nielsen also criticized the stereotype that men are inherently less empathetic or communicative than women.

\n

Men are just as capable as women in demonstrating empathy, cooperation, and emotional understanding, according to research in her book Myths and Lies about Dads: How They Hurt Us All. The differences within each gender far outweigh any consistent differences between men and women.

\n

She pointed out that children raised without fathers tend to score lower in empathy tests as adults, undermining the claim that women alone are responsible for teaching emotional intelligence.

\n

Nielsen believes there is no empirical basis for assuming mothers are better than fathers at fostering children's interpersonal and emotional skills.

\n

The belief that fathers are "less than" in this domain is a myth unsupported by science — and harmful to families and society.

\n

Shared responsibility

\n

In Shao's household, parenting is a shared responsibility. She and her husband have developed a system to rotate tasks — from bedtime routines to academic support.

\n

Each night, she and her husband alternate between which child they tuck into bed, ensuring the children receive attention from both parents. While Shao initially managed all aspects of the children's studies, she eventually found the emotional toll was too much. She and her husband then divided the subjects between them.

\n

"I told him, I'm tired from work too. It's not like there's only one earning money, right?" said Shao. "We both work, we're both exhausted. And this home doesn't belong to just me — it's our family's home, and both of us should contribute. It wasn't just my decision to have two kids, either."

\n

However, Xiao, the mother from Xi'an, believes contemporary Chinese picture books and animated films are reflecting growing awareness of the need to balance parental roles and challenge traditional stereotypes.

\n

She pointed to the recent Ne Zha movie adaptations as a clear example. In these versions, Ne Zha's mother is portrayed as both loving and willing to let go — supporting her child while respecting his individuality. Her character strikes a balance between warmth and boundaries, offering protection without overreach. This transcends the earlier portrayals of Ne Zha's mother.

\n

Looking ahead, she is looking forward to seeing more children's books and cartoons that are sincere, intelligent and colorful.

\n

Shao hopes that future children's media and picture books will emphasize a more balanced relationship between both parents — whether in terms of household responsibilities, professional identities, or individual value.

\n

Quality stories can encourage children to trust and communicate with both their mother and father when facing difficulties, she said.

\n

"For picture books about families, ideally both mom and dad should appear in the story," said Shao. "And when it comes to expressing family emotions, no matter what, mom and dad both always love you — let children understand this through the books."

\n

", @@ -10587,28 +10235,6 @@ "hash": "3d66d467b7d46194d862dfaaeed3be37", "highlights": [] }, - { - "title": "004CHINA - Surgical robot", - "description": "

Visitors watch a surgical robot called "Da Vinci" perform a simulated surgery procedure at the Jinhua Municipal Central Hospital in Zhejiang province, on Monday. The "operation" was part of an open day event organized by the hospital that allowed residents to try out advanced surgical equipment, with an aim to educate the public on modern medical technology, enhance understanding between doctors and patients, and expand the public's imagination of future healthcare.

\n



获取更多RSS:
https://feedx.net
https://feedx.site
", - "content": "

Visitors watch a surgical robot called "Da Vinci" perform a simulated surgery procedure at the Jinhua Municipal Central Hospital in Zhejiang province, on Monday. The "operation" was part of an open day event organized by the hospital that allowed residents to try out advanced surgical equipment, with an aim to educate the public on modern medical technology, enhance understanding between doctors and patients, and expand the public's imagination of future healthcare.

\n



获取更多RSS:
https://feedx.net
https://feedx.site
", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/09/content_004_68bf416bed50ccabe151911b.htm#004CHINA", - "creator": "", - "pubDate": "Tue, 09 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "142397803a4f08fc8c9153cddf63bf00", - "highlights": [] - }, { "title": "004CHINA - Justice Ministry aids national five-year plan", "description": "

The Ministry of Justice has provided robust legal support for the 14th Five-Year Plan (2021-25) over the past five years, officials announced on Monday.

\n

At a news conference, Minister of Justice He Rong said the ministry has strengthened the development of laws and regulations in critical areas, emerging fields and foreign-related domains to support high-quality development.

\n

Since the plan took effect in 2021, several significant laws and regulations have been enacted, including the Private Economy Promotion Law, the Food Safety Law, the Energy Law and interim regulations for unmanned aircraft flight management.

\n

The State Council, China's Cabinet, has submitted 53 legislative proposals to the Standing Committee of the National People's Congress for deliberation and has formulated or amended administrative regulations 150 times, He said.

\n

Vice-Minister of Justice Li Mingzheng said legislation has focused on addressing weaknesses and gaps.

\n

"We have strengthened legal frameworks and regulations for new technologies and emerging industries such as the digital economy, autonomous driving, artificial intelligence and the low-altitude economy," Li said.

\n

Since 2023, the ministry has stepped up efforts to address urgent legislative issues by leading or intervening in the drafting process, improving the efficiency of government legislation with broad public participation through legislative consultations and interpretations, Li said.

\n

The ministry has worked with other departments to promote the formulation and amendment of laws and regulations, including the Food Safety Law, the Preschool Education Law and the Regulations on the Protection of Minors Online, to enhance inclusive and fundamental legal protections for livelihood issues, according to He.

\n

China currently has 830,000 lawyers, 45,000 law firms, 67,000 arbitrators, 15,000 notaries, 40,000 forensic experts and 12,000 legal aid workers handling more than 40 million cases annually, according to the ministry.

\n

"Public legal services have become more balanced and accessible, actively addressing the legal service needs of groups such as migrant workers, people with disabilities, the elderly, youth, military personnel and their families," He said. "Over the past five years, more than 170 million legal consultations have been provided."

\n

The capacity for foreign-related legal services has also been enhanced as the country develops international first-class arbitration institutions and law firms, supporting the establishment of the Belt and Road Initiative legal service association. Chinese law firms have opened 207 branches in 37 countries and regions to assist citizens and enterprises in global ventures, He said.

\n

Over the past five years, 16,000 foreign-related arbitration cases have been handled, with the total amount in dispute reaching 730 billion yuan ($102 billion).

\n

In 2024 alone, more than 4,400 cases were accepted, an increase of 100 percent compared with 2020. In those cases, nearly 200 billion yuan was in dispute, up 136 percent from that year.

\n

"China has gradually become a preferred destination for international commercial arbitration," He said.

\n

lishangyi@chinadaily.com.cn

\n

", @@ -10631,28 +10257,6 @@ "hash": "be67217d1796196524596bc9b2f9d8a6", "highlights": [] }, - { - "title": "004CHINA - China takes intl lead in number of nanotech patents", - "description": "

Online See more by scanning the code.

\n

China has been a global leader in nanotechnology development in recent years, with the nation holding more than 464,000 related patents over the past 25 years, accounting for 43 percent of the world's total, according to a newly released white paper.

\n

From 2000 to May this year, the total number of globally granted nanotechnology patents surpassed 1.078 million. With nearly half a million of its own, China took the top spot, exceeding the combined total of the United States, Japan and South Korea, the paper said.

\n

The report was published by China's National Center for Nanoscience and Technology during the 10th International Conference on Nanoscience and Technology, China, which was held in Beijing from Aug 30 to Sept 1.

\n

Patent transfers and licenses in China accounted for about 8 percent of the global total from 2000 to this year. The annual volume has passed its peak and begun to decline, suggesting that enterprises are increasingly driving innovation themselves rather than acquiring technologies through purchases. Many nanotechnologies are entering large-scale industrialization with stable production processes, resulting in a decreased capacity to absorb new patents, according to the report.

\n

China's patents are primarily concentrated in key areas such as new building materials, advanced coating materials, catalytic chemistry and reaction engineering. The paper also cited significant progress in semiconductor devices and biomedicine.

\n

Nanotechnology enterprises in China have experienced explosive growth, with nearly half located in Jiangsu, Guangdong and Zhejiang provinces. The number of companies grew from 3,015 in 2000 to 35,000 by May, with an average annual growth rate of about 10 percent. Employment nearly doubled in that time, increasing from 5 million workers in 2000 to 9.92 million people by May, the paper said.

\n

"China has emerged as a significant contributor to global nanotechnology advancements and a major player in cutting-edge industrial applications," Bai Chunli, chair of the conference, said at the opening ceremony.

\n

Bai, an academician of the Chinese Academy of Sciences, said nanotechnology is propelling breakthroughs in strategic fields such as green energy, biomedicine and information technology, while accelerating the formation of new quality productive forces.

\n

He added that the rise of artificial intelligence has created revolutionary opportunities for the field, reshaping research paradigms. China will continue to solidify foundational research, strengthen application-oriented efforts and deepen international cooperation to leverage nanotechnology's role in global innovation and development, Bai said.

\n

Alan Rowan, director of the Australian Institute for Bioengineering and Nanotechnology at the University of Queensland, said nanoscience is the study of matter at the nanoscale, a realm 10,000 times smaller than a human hair. At this scale, materials exhibit unique quantum and surface effects, enabling scientists to design new properties and provide revolutionary solutions.

\n

"China has done an amazing job across the board in investment in science," Rowan said, attributing the country's advances in nanoscience to its emphasis on STEM education, infrastructure and young students' capacity for innovation.

\n

Yury Gogotsi, director of Drexel University's A.J. Drexel Nanomaterials Institute in the US, echoed Rowan's view and described China as "a technological leader" whose nanoscience industry is "enormous both in volume and quality".

\n

"Many breakthroughs from China were scientific and technological, with a fast translation to scaled-up manufacturing," Gogotsi said. "I think this is what is needed because, for nanotechnology, you not only need to do high-quality research, but also need to have mechanisms to transfer it into practice that will hopefully make the world a better place."

\n

He added that countries such as China, the US and Singapore are advancing rapidly in nanotechnology, each with its own strengths.

\n

"This dynamic fosters healthy competition in scientific and technological research and development," Gogotsi said. "In addition, when nations are at similar technological levels, it facilitates smoother international collaboration."

\n

limenghan@chinadaily.com.cn

\n

", - "content": "

Online See more by scanning the code.

\n

China has been a global leader in nanotechnology development in recent years, with the nation holding more than 464,000 related patents over the past 25 years, accounting for 43 percent of the world's total, according to a newly released white paper.

\n

From 2000 to May this year, the total number of globally granted nanotechnology patents surpassed 1.078 million. With nearly half a million of its own, China took the top spot, exceeding the combined total of the United States, Japan and South Korea, the paper said.

\n

The report was published by China's National Center for Nanoscience and Technology during the 10th International Conference on Nanoscience and Technology, China, which was held in Beijing from Aug 30 to Sept 1.

\n

Patent transfers and licenses in China accounted for about 8 percent of the global total from 2000 to this year. The annual volume has passed its peak and begun to decline, suggesting that enterprises are increasingly driving innovation themselves rather than acquiring technologies through purchases. Many nanotechnologies are entering large-scale industrialization with stable production processes, resulting in a decreased capacity to absorb new patents, according to the report.

\n

China's patents are primarily concentrated in key areas such as new building materials, advanced coating materials, catalytic chemistry and reaction engineering. The paper also cited significant progress in semiconductor devices and biomedicine.

\n

Nanotechnology enterprises in China have experienced explosive growth, with nearly half located in Jiangsu, Guangdong and Zhejiang provinces. The number of companies grew from 3,015 in 2000 to 35,000 by May, with an average annual growth rate of about 10 percent. Employment nearly doubled in that time, increasing from 5 million workers in 2000 to 9.92 million people by May, the paper said.

\n

"China has emerged as a significant contributor to global nanotechnology advancements and a major player in cutting-edge industrial applications," Bai Chunli, chair of the conference, said at the opening ceremony.

\n

Bai, an academician of the Chinese Academy of Sciences, said nanotechnology is propelling breakthroughs in strategic fields such as green energy, biomedicine and information technology, while accelerating the formation of new quality productive forces.

\n

He added that the rise of artificial intelligence has created revolutionary opportunities for the field, reshaping research paradigms. China will continue to solidify foundational research, strengthen application-oriented efforts and deepen international cooperation to leverage nanotechnology's role in global innovation and development, Bai said.

\n

Alan Rowan, director of the Australian Institute for Bioengineering and Nanotechnology at the University of Queensland, said nanoscience is the study of matter at the nanoscale, a realm 10,000 times smaller than a human hair. At this scale, materials exhibit unique quantum and surface effects, enabling scientists to design new properties and provide revolutionary solutions.

\n

"China has done an amazing job across the board in investment in science," Rowan said, attributing the country's advances in nanoscience to its emphasis on STEM education, infrastructure and young students' capacity for innovation.

\n

Yury Gogotsi, director of Drexel University's A.J. Drexel Nanomaterials Institute in the US, echoed Rowan's view and described China as "a technological leader" whose nanoscience industry is "enormous both in volume and quality".

\n

"Many breakthroughs from China were scientific and technological, with a fast translation to scaled-up manufacturing," Gogotsi said. "I think this is what is needed because, for nanotechnology, you not only need to do high-quality research, but also need to have mechanisms to transfer it into practice that will hopefully make the world a better place."

\n

He added that countries such as China, the US and Singapore are advancing rapidly in nanotechnology, each with its own strengths.

\n

"This dynamic fosters healthy competition in scientific and technological research and development," Gogotsi said. "In addition, when nations are at similar technological levels, it facilitates smoother international collaboration."

\n

limenghan@chinadaily.com.cn

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/09/content_004_68bf417ced50ccabe151911f.htm#004CHINA", - "creator": "", - "pubDate": "Tue, 09 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "433e88f4a8705553c7ab54eb04955819", - "highlights": [] - }, { "title": "005CHINA - Dolphin care", "description": "

Left: A volunteer observes the condition of the dolphin named Wanwan in Lingshui Li autonomous county, Hainan province, on Monday. The stranded dolphin was rescued in Wanning, Hainan, in June and has been under professional care for nearly three months. Experts have determined that Wanwan is fit to be released back into the wild. Right: A worker weighs food for Wanwan.

\n

", @@ -10675,28 +10279,6 @@ "hash": "f7e6d349203ed3719561e310c0d32356", "highlights": [] }, - { - "title": "005CHINA - Datong accelerates development in China's computing power sector", - "description": "

Liu Junyi

\n

Visitors tour the Shanxi booth showcasing its computational power development at the 2025 China Computational Power Conference, held from Aug 22 to 24, in Datong, Shanxi province.

\n

The city of Datong in Shanxi province is accelerating high-quality development in the computing power sector and is aiming to build a first-class base in China while advancing the digital economy, its mayor said.

\n

In recent years, Datong has focused on energy, computing power and culture, achieving significant progress in transforming its resource-based economy, Mayor Liu Junyi said. The city has seen strong momentum in the computing power industry.

\n

"Computing power, as a new quality productive force in the digital economy era, can directly drive industrial upgrading and innovation," Liu said. "So far, Datong's computing power industry has received a cumulative investment of 77.3 billion yuan ($10.8 billion), with 736,000 servers in operation."

\n

The city's computing power capacity has reached nearly 25,000 petaflops, Liu said. Its computing power center consumed 4.3 billion kilowatt-hours of electricity in 2024, a figure expected to exceed 6 billion kWh in 2025.

\n

As one of the first intelligent pilot cities in Shanxi, Datong has strengthened its digital foundation to provide more precise and efficient data support for urban governance and public services, he said. The city has aggregated more than 5.97 billion intelligent city data entries, empowering fields such as governance, culture, tourism, eldercare, government affairs, urban management and transportation.

\n

Datong is also promoting the localization of DeepSeek and has launched the DeepTong intelligent application, integrating large model applications into areas such as public resource transactions, the 12345 Datong government service convenience hotline and targeted investment attraction to improve government services, Liu said.

\n

China is a global leader in digital infrastructure in both scale and technological level. As of June, it had more than 4.55 million 5G base stations and about 226 million gigabit broadband users. Its total computing power scale ranks second globally, significantly driving socioeconomic development.

\n

Shanxi has established a capital-centered computing power cluster with Datong at the core. The China Comprehensive Computing Power Index (2025) shows Datong's urban computing power sub-index ranks third nationwide.

\n

"Datong will actively integrate into the national integrated computing power network and strengthen upstream and downstream industries such as data annotation and server manufacturing," Liu said. "We will explore areas such as computing-network integration, storage-computing integration and cross-regional computing power scheduling, aiming to build a nationally influential green data center cluster and computing power center city — shifting the economic growth model from producing coal and electricity to computing power and services."

\n

In the coming years, investment in intelligent and supercomputing centers by leading computing power enterprises is expected to surpass 100 billion yuan, according to city officials.

\n

The 2025 China Computational Power Conference, the country's top event in the field, was held in Datong in late August. Liu said the city's advantages — including location, climate, green electricity, fiber optics, power grid and industrial ecology — made it the right choice to host the conference.

\n

"Datong's computing power industry has formed a full-chain development pattern and is actively promoting the extension of the digital industry upstream and downstream," Liu said. Based on the construction of the Capital-Circling-Taihang Mountain computing power center cluster, the city has attracted several major server manufacturers. Downstream industries have established a national data annotation base, drawing 67 companies that have created over 30,000 jobs.

\n

Known for its computing power, Datong also offers a strong ecosystem for industrial development, Liu said.

\n

"Datong will fully showcase its comparative advantages to attract more domestic and international computing power companies and talent," he said. "We are striving to achieve greater breakthroughs in technological innovation, project construction and industrial applications, injecting strong momentum into the transformation and development of the resource-based economy."

\n

With a history and culture spanning 2,300 years, Datong is also seeing growth in its cultural and tourism market, boosting its international influence and appeal, Liu said.

\n

The domestic video game Black Myth: Wukong and the popular animated film Nobody incorporated many ancient architectural elements from the city.

\n

"Datong is fully leveraging the advantages of its computing power industry cluster, continuously strengthening the construction of cultural digital infrastructure and service platforms and focusing on creating new cultural digital consumption scenarios," Liu said.

\n

In cultural heritage, the digital Yungang Grottoes project has used high-precision 3D laser scanning, close-range photogrammetry and multispectral technologies to solve challenges in collecting high-relief grotto images. It has completed 80 percent of information collection at the Yungang Grottoes and two-thirds of archival data aggregation.

\n

"The 3D printing system and modular assembly of Yungang Grottoes have pioneered the world's first full-scale replication of extra-large cultural relics, extending cultural heritage from the grotto site to online platforms," Liu said. "The millennia-old grotto art is shining with new brilliance in the new era."

\n

Contact the writers at zhouhuiying@chinadaily.com.cn

\n



获取更多RSS:
https://feedx.net
https://feedx.site
", - "content": "

Liu Junyi

\n

Visitors tour the Shanxi booth showcasing its computational power development at the 2025 China Computational Power Conference, held from Aug 22 to 24, in Datong, Shanxi province.

\n

The city of Datong in Shanxi province is accelerating high-quality development in the computing power sector and is aiming to build a first-class base in China while advancing the digital economy, its mayor said.

\n

In recent years, Datong has focused on energy, computing power and culture, achieving significant progress in transforming its resource-based economy, Mayor Liu Junyi said. The city has seen strong momentum in the computing power industry.

\n

"Computing power, as a new quality productive force in the digital economy era, can directly drive industrial upgrading and innovation," Liu said. "So far, Datong's computing power industry has received a cumulative investment of 77.3 billion yuan ($10.8 billion), with 736,000 servers in operation."

\n

The city's computing power capacity has reached nearly 25,000 petaflops, Liu said. Its computing power center consumed 4.3 billion kilowatt-hours of electricity in 2024, a figure expected to exceed 6 billion kWh in 2025.

\n

As one of the first intelligent pilot cities in Shanxi, Datong has strengthened its digital foundation to provide more precise and efficient data support for urban governance and public services, he said. The city has aggregated more than 5.97 billion intelligent city data entries, empowering fields such as governance, culture, tourism, eldercare, government affairs, urban management and transportation.

\n

Datong is also promoting the localization of DeepSeek and has launched the DeepTong intelligent application, integrating large model applications into areas such as public resource transactions, the 12345 Datong government service convenience hotline and targeted investment attraction to improve government services, Liu said.

\n

China is a global leader in digital infrastructure in both scale and technological level. As of June, it had more than 4.55 million 5G base stations and about 226 million gigabit broadband users. Its total computing power scale ranks second globally, significantly driving socioeconomic development.

\n

Shanxi has established a capital-centered computing power cluster with Datong at the core. The China Comprehensive Computing Power Index (2025) shows Datong's urban computing power sub-index ranks third nationwide.

\n

"Datong will actively integrate into the national integrated computing power network and strengthen upstream and downstream industries such as data annotation and server manufacturing," Liu said. "We will explore areas such as computing-network integration, storage-computing integration and cross-regional computing power scheduling, aiming to build a nationally influential green data center cluster and computing power center city — shifting the economic growth model from producing coal and electricity to computing power and services."

\n

In the coming years, investment in intelligent and supercomputing centers by leading computing power enterprises is expected to surpass 100 billion yuan, according to city officials.

\n

The 2025 China Computational Power Conference, the country's top event in the field, was held in Datong in late August. Liu said the city's advantages — including location, climate, green electricity, fiber optics, power grid and industrial ecology — made it the right choice to host the conference.

\n

"Datong's computing power industry has formed a full-chain development pattern and is actively promoting the extension of the digital industry upstream and downstream," Liu said. Based on the construction of the Capital-Circling-Taihang Mountain computing power center cluster, the city has attracted several major server manufacturers. Downstream industries have established a national data annotation base, drawing 67 companies that have created over 30,000 jobs.

\n

Known for its computing power, Datong also offers a strong ecosystem for industrial development, Liu said.

\n

"Datong will fully showcase its comparative advantages to attract more domestic and international computing power companies and talent," he said. "We are striving to achieve greater breakthroughs in technological innovation, project construction and industrial applications, injecting strong momentum into the transformation and development of the resource-based economy."

\n

With a history and culture spanning 2,300 years, Datong is also seeing growth in its cultural and tourism market, boosting its international influence and appeal, Liu said.

\n

The domestic video game Black Myth: Wukong and the popular animated film Nobody incorporated many ancient architectural elements from the city.

\n

"Datong is fully leveraging the advantages of its computing power industry cluster, continuously strengthening the construction of cultural digital infrastructure and service platforms and focusing on creating new cultural digital consumption scenarios," Liu said.

\n

In cultural heritage, the digital Yungang Grottoes project has used high-precision 3D laser scanning, close-range photogrammetry and multispectral technologies to solve challenges in collecting high-relief grotto images. It has completed 80 percent of information collection at the Yungang Grottoes and two-thirds of archival data aggregation.

\n

"The 3D printing system and modular assembly of Yungang Grottoes have pioneered the world's first full-scale replication of extra-large cultural relics, extending cultural heritage from the grotto site to online platforms," Liu said. "The millennia-old grotto art is shining with new brilliance in the new era."

\n

Contact the writers at zhouhuiying@chinadaily.com.cn

\n



获取更多RSS:
https://feedx.net
https://feedx.site
", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/09/content_005_68bf418ded50ccabe1519123.htm#005CHINA", - "creator": "", - "pubDate": "Tue, 09 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "e637a0010dae18d716a116b579c6e779", - "highlights": [] - }, { "title": "006CHINA - People's Liberation Army battalion commander leads brethren by example", "description": "

Left: Zhang Cancan (right) operates a military drone during an exercise with his fellow soldiers. Center: Zhang heads his battalion in a battle cry during training. Right: Zhang gives the order to charge during an exercise.

\n

China has had many heroes and exemplary individuals in its military who have served the country during times of war, such as Huang Jiguang and Dong Cunrui, who sacrificed themselves for victory, inspiring generations to come.

\n

In times without conflict, however, China's armed forces are no less dedicated and diligent in their overriding mission of defending the motherland.

\n

One such individual is Zhang Cancan, who in July was named one of the 12 "most beautiful revolutionary soldiers of the new era" by the Publicity Department of the Communist Party of China Central Committee and the Political Work Department of the Central Military Commission.

\n

Since 2021, this designation has been awarded to outstanding members of the People's Liberation Army who are considered models of dedication, skills and service.

\n

In his 23-year career, Zhang has risen from being an ordinary soldier to a battalion commander in the PLA Ground Force's 76th combined corps. He's played an exemplary role in guiding his fellow troops and cultivating great soldiers, winning the trust of those under his command.

\n

Born in 1984, Zhang joined the army in 2002. He has taken part in a dozen major operations and missions, from earthquake rescue to large-scale military exercises.

\n

His name, Cancan, means "to shine" in Chinese, and he has done his name proud.

\n

Over the past 14 years as an officer, he has trained various skilled personnel, and fellow soldiers describe him as "sharp yet steady", a reflection of both his professional skills and personal character.

\n

One incident in 2020, in particular, left a deep impression on his unit. During a mission on a plateau more than 5,000 meters above sea level, a soldier fainted from acute altitude sickness. Vehicles were stuck in soft, melted snow, making it impossible to reach the stricken man by road, Zhang recalled.

\n

Faced with the urgent situation, Zhang decided he needed to deliver the oxygen himself. He took a 14-kilogram oxygen tank and ran 2.5 kilometers through a river valley at an altitude of 5,300 meters to reach the stricken soldier within 20 minutes. Zhang's actions saved the soldier's life.

\n

Wang Meng, 27, a soldier in Zhang's unit, said he treats his men like family. "He cares for his soldiers like an elder brother, shielding them from hardship like an umbrella," he said.

\n

One of Zhang's defining traits is his hands-on approach. During a training demonstration last year, when a soldier sustained a deep chin wound, he sprinted to summon an ambulance himself rather than leaving the task to others.

\n

Zhang said his understanding of soldiers' struggles comes from having walked the same path.

\n

"Though we live like brothers, I take training very seriously," he said.

\n

As a young recruit more than 20 years ago, he trained even during downtime, spurred on by a leader who saw his potential. At the time, the constant demands made little sense to him, but later he realized that overcoming hardship prepared him for success. He now shares those experiences with young soldiers when they feel exhausted.

\n

The transition from soldier to commander has only deepened his sense of responsibility. "As more people stand behind me, I have to work harder and set an example," he said.

\n

He Zhengcong, a 31-year-old soldier in Zhang's unit, said working under extreme exertion can take its toll. "His leadership style is absorbing pressure from superiors instead of passing it down, which has won respect among soldiers," said He. "When higher-ups criticize the whole unit, he shields us and offers constructive suggestions, even demonstrating the moves himself."

\n

Zhang's humility and willingness to learn have also impressed seasoned soldiers. When he was assigned to an artillery company as a commander, Tan Linlin, a 37-year-old soldier who has served in the Ground Force for some 20 years, doubted his ability.

\n

"He was completely new to our field when he became my leader," Tan said. "Confident in my own skills, I initially was not convinced by his abilities."

\n

But Zhang approached the role as a beginner, asking for advice and practicing diligently. Within two months, he achieved three direct hits in a live-fire drill, earning Tan's respect. Afterward, the two trained side by side, learning from each other, with Zhang emerging as a role model for Tan.

\n

"Combat readiness requires not only training but also the right mindset," Tan said. "With Zhang in charge, we feel reassured."

\n

In both this year and last, Zhang ranked first in the brigade's annual training assessment among officers. Despite harsh plateau conditions, he uses every opportunity to build upon his experience, from physical drills to equipment testing, and has pushed forward efforts to modernize combat readiness.

\n

"Our battalion carries the heritage of the Red Army," Zhang said. The battalion has participated in major historic battles, including the Chinese People's War of Resistance Against Japanese Aggression (1931-45) and the War to Resist US Aggression and Aid Korea (1950-53).

\n

"I want every soldier to feel that pride and live up to the honorable title," he said.

\n



获取更多RSS:
https://feedx.net
https://feedx.site
", @@ -10719,28 +10301,6 @@ "hash": "57e605f84bb6a1f90f78b1a5b9d91bf4", "highlights": [] }, - { - "title": "007CHINA - 'Dehua' saves parents' time, helps youngsters earn pocket money", - "description": "
\n

This summer in Xiamen, East China's Fujian province, a novel job opportunity called "Dehua" has emerged and quickly gained popularity.

\n

This innovative service provides much-needed childcare solutions for families while offering university students a way to earn money and gain valuable social experience.

\n

Dehua, a popular internet term in recent years, specifically refers to college students or young people who take on the responsibility of caring for their siblings' children during holidays. It originates from the character Jiang Dehua, known for her childcare role in the TV series Romance of Our Parents.

\n

A student from the College of Foreign Languages and Cultures at Xiamen University, surnamed Li, was among the first to embrace this opportunity. Through Zhipin.com, an online recruitment platform, she connected with families needing tutoring, playtime companionship, and school pick-up and drop-off services for children. Working four to six hours a week, she earns 50 yuan ($6.99) per hour.

\n

"I can earn some pocket money while gaining teaching experience," Li said.

\n

She added that this summer part-time job has provided her with a deeper understanding of the educator's role, which has been invaluable for her future career plans.

\n

While the job was rewarding, it came with its challenges. Li said she had to manage scheduling conflicts with her classes by coordinating with parents to find spare time.

\n

Motivating children who were less interested in studying was another hurdle, but she emphasized the importance of encouragement and keeping parents informed to boost the children's confidence.

\n

As the demand for Dehua services grew, a Xiamen-based housekeeping company introduced its own version, branded as Super Brother and Super Sister. "We developed the idea to free up parents' time, allowing them to enjoy more quality moments with their kids," said the company manager, surnamed Yang.

\n

Yang added that the initiative became a summer hit within 50 days of its launch, achieving a 98 percent customer satisfaction rate and boasting the highest repeat purchase rate among all the products on the platform.

\n

Yang explained that their rigorous hiring process, which includes psychological testing, background checks, and health screenings, ensures that only qualified university students join their team.

\n

The company also provides tailored one-to-one packages to meet diverse family needs. For younger children, the emphasis is on developing good learning habits through two hours of study and crafts each day. For those in Grade 3 and above, the service focuses on three hours of daily homework assistance.

\n

"Unlike traditional nannies, these college students can help my kid with summer homework and accompany her in completing assignments and playing," said one father, praising the program.

\n

He noted that Super Brother is well-liked by his child for being personable and responsible.

\n

Another client shared that her nine-year-old son, who previously needed repeated reminders to tidy his desk, now actively shows off his new skills, saying, "Look at the method I learned from Super Brother."

\n

Yang mentioned plans to extend the service beyond the summer season, aiming to transform it from a seasonal trend into a sustainable business by integrating standard training with specialized courses.

\n

Tan Xinni, a lawyer from the Fujian Far and Wide Law Firm, stressed the importance of safety and legal protection for students. She advised them to use reputable platforms for job searches and recommended having a written contract to clearly outline services, hours, and compensation.

\n

Contact the writers at dengrui@chinadaily.com.cn

\n

", - "content": "
\n

This summer in Xiamen, East China's Fujian province, a novel job opportunity called "Dehua" has emerged and quickly gained popularity.

\n

This innovative service provides much-needed childcare solutions for families while offering university students a way to earn money and gain valuable social experience.

\n

Dehua, a popular internet term in recent years, specifically refers to college students or young people who take on the responsibility of caring for their siblings' children during holidays. It originates from the character Jiang Dehua, known for her childcare role in the TV series Romance of Our Parents.

\n

A student from the College of Foreign Languages and Cultures at Xiamen University, surnamed Li, was among the first to embrace this opportunity. Through Zhipin.com, an online recruitment platform, she connected with families needing tutoring, playtime companionship, and school pick-up and drop-off services for children. Working four to six hours a week, she earns 50 yuan ($6.99) per hour.

\n

"I can earn some pocket money while gaining teaching experience," Li said.

\n

She added that this summer part-time job has provided her with a deeper understanding of the educator's role, which has been invaluable for her future career plans.

\n

While the job was rewarding, it came with its challenges. Li said she had to manage scheduling conflicts with her classes by coordinating with parents to find spare time.

\n

Motivating children who were less interested in studying was another hurdle, but she emphasized the importance of encouragement and keeping parents informed to boost the children's confidence.

\n

As the demand for Dehua services grew, a Xiamen-based housekeeping company introduced its own version, branded as Super Brother and Super Sister. "We developed the idea to free up parents' time, allowing them to enjoy more quality moments with their kids," said the company manager, surnamed Yang.

\n

Yang added that the initiative became a summer hit within 50 days of its launch, achieving a 98 percent customer satisfaction rate and boasting the highest repeat purchase rate among all the products on the platform.

\n

Yang explained that their rigorous hiring process, which includes psychological testing, background checks, and health screenings, ensures that only qualified university students join their team.

\n

The company also provides tailored one-to-one packages to meet diverse family needs. For younger children, the emphasis is on developing good learning habits through two hours of study and crafts each day. For those in Grade 3 and above, the service focuses on three hours of daily homework assistance.

\n

"Unlike traditional nannies, these college students can help my kid with summer homework and accompany her in completing assignments and playing," said one father, praising the program.

\n

He noted that Super Brother is well-liked by his child for being personable and responsible.

\n

Another client shared that her nine-year-old son, who previously needed repeated reminders to tidy his desk, now actively shows off his new skills, saying, "Look at the method I learned from Super Brother."

\n

Yang mentioned plans to extend the service beyond the summer season, aiming to transform it from a seasonal trend into a sustainable business by integrating standard training with specialized courses.

\n

Tan Xinni, a lawyer from the Fujian Far and Wide Law Firm, stressed the importance of safety and legal protection for students. She advised them to use reputable platforms for job searches and recommended having a written contract to clearly outline services, hours, and compensation.

\n

Contact the writers at dengrui@chinadaily.com.cn

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/09/content_007_68bf419fed50ccabe1519127.htm#007CHINA", - "creator": "", - "pubDate": "Tue, 09 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "fcce023d86c4150b746c166e40fb97d4", - "highlights": [] - }, { "title": "008COMMENT - BRICS promotes common development and a more equitable multipolar world", "description": "

The BRICS cooperation mechanism is a key platform for solidarity and collaboration between emerging markets and developing countries. In the face of rising hegemonism, unilateralism and protectionism, BRICS, as "the first echelon of the Global South", persists in promoting openness, inclusiveness, cooperation and win-win results to build a community with a shared future for humanity.

\n

So when the leaders of BRICS convened virtually on Monday, the gathering carried a resonance beyond the screens that connected the BRICS member states only. It was a reaffirmation of a vision for a more just and equitable global governance system.

\n

President Xi Jinping gave a speech and had in-depth exchanges with the other participating leaders on the current economic environment, the multilateral system, BRICS cooperation and important issues of mutual concern.

\n

Xi's remarks remind the world that BRICS is an emerging force representing the Global South that advocates fairness and justice in global governance. It is a grouping that seeks not dominance but cooperation, not confrontation but coordination, and aims not to challenge but to reform.

\n

He highlighted the need for BRICS to uphold multilateralism and safeguard international fairness and justice; uphold openness and win-win endeavors and maintain the international economic and trade order; and uphold unity and cooperation and build synergy for common development.

\n

To that end, China will continue to play a pivotal role. From proposing the "BRICS Plus" model, which has widened the circle of cooperation to more countries in the Global South, to championing the establishment of the New Development Bank, Beijing has consistently infused BRICS with ideas and institutions.

\n

Xi's proposals at the meeting are not abstract. In terms of BRICS cooperation, they will find concrete expression in real infrastructure, the powering of green energy transitions, and the strengthening of public health systems.

\n

In a world still struggling to address the climate emergency and supply-chain shocks caused by trade wars, the value of BRICS' practical, solidarity-based cooperation cannot be overstated.

\n

Xi's call for defending multilateralism comes at a critical time when that principle is under strain. International organizations designed to give voice to all nations have too often been hamstrung by unilateralists. Against this backdrop, BRICS represents an alternative ethos: one rooted in consultation, joint contributions and shared benefits.

\n

The substance of BRICS cooperation addresses the different needs of its members. Exemplifying how BRICS can harness cutting-edge innovation for inclusive growth, China has driven forward initiatives in technology, digital transformation and industrial modernization under the BRICS framework. The launch of the China-BRICS Artificial Intelligence Development and Cooperation Center and the BRICS Digital Ecosystem Cooperation Network signal that technological progress need not be monopolized by a handful of nations; instead, it can serve as a shared tool for narrowing development gaps.

\n

From Brazil's wind farms to South Africa's solar projects, BRICS collaboration — often with Chinese investment and expertise — has delivered tangible contributions to renewable energy and climate resilience. The New Development Bank's growing portfolio of green bonds further positions the bloc as a driver of low-carbon growth at a time when the planet desperately needs it.

\n

What emerged from the meeting is not a bloc set against another, but a community working toward what China has advocated — a shared future for humanity. It is an aspiration anchored in the belief that peace and prosperity are indivisible, that the problems of one region inevitably ripple outward, and that inclusive solutions are not only more just but also more effective.

\n

Skeptics will note that BRICS encompasses countries with diverse national conditions. Yet it is precisely this diversity that gives the mechanism its credibility. Its achievements — whether in financial cooperation, climate action or cultural exchanges — demonstrate that unity is possible without uniformity. The expansion of BRICS in recent years further underscores its openness: It welcomes those willing to collaborate, not on the basis of ideology but on the shared pursuit of development and dignity.

\n

China stands ready to work with other parties to further act on the BRICS spirit of openness, inclusiveness and win-win cooperation, and to jointly work for a more equitable and orderly multipolar world.

\n

", @@ -10763,28 +10323,6 @@ "hash": "9afe68144a657b59995e4ede52acf97d", "highlights": [] }, - { - "title": "008COMMENT - Picture news", - "description": "

\n

", - "content": "

\n

", - "category": "", - "link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/09/content_008_68bf41b0ed50ccabe151912b.htm#008COMMENT", - "creator": "", - "pubDate": "Tue, 09 Sep 2025 00:21:04 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "c655dd5696871b104fad499c9c8a8082", - "highlights": [] - }, { "title": "008COMMENT - Service consumption will drive future growth", "description": "

Editor's note: To unlock their consumption potential, Chinese cities have introduced new commercial formats that leverage their unique local features. Wang Wei, former director of the Institute of Market Economy under the Development Research Centre of the State Council, told Oriental Outlook magazine that the role of service consumption in supporting overall consumption continues to grow, particularly in areas such as tourism, performances and sports, where consumers are willing to pay higher prices for these experiences. Below are excerpts from the interview. The views don't necessarily represent those of China Daily.

\n

China's consumption market is upgrading from goods consumption to service consumption, a critical stage in crossing the high-income threshold. In recent years, travel, entertainment and sports have become the new pillars of service consumption.

\n

Of course, the rapid growth of service consumption does not mean that goods consumption has slowed down. The demand for quality goods is increasing, and will drive continuous upgrades in the functionality and quality of goods consumption.

\n

The two major growth areas for future consumption in China are the improvement in the quality of goods consumption and the expansion of service consumption. However, more incremental growth will come from service consumption.

\n

Yet, on the supply side, there are shortcomings in the innovation and development capabilities of service consumption, with a mismatch between supply and demand for mid-to-high-end quality service consumption. On the demand side, the public has varying perceptions of service consumption. A series of measures can help. First, greater efforts must be made to promote the opening-up of the service sector and attracting innovative resources and high-level services from across the world to improve the quality of life of the Chinese people.

\n

At the same time, it is necessary to further lower the threshold for private enterprises to enter the service sector.

\n

Second, not only should investment access be further liberalized, but the free flow of human resources should also be encouraged more. Opening up the service sector helps in better allocation of resources, attracts innovative resources and meets the public's demand for services.

\n

Third, most of the entities providing services in China are small and micro enterprises. Therefore, policies must provide targeted support to these enterprises.

\n

Fourth, laws and regulations related to consumer rights protection must be updated to keep pace with the times. Past laws were primarily aligned with goods consumption. However, the service consumption market is more prone to issues such as information asymmetry and unequal status between large entities and consumers, leading to inadequate protection of consumer rights. It is necessary to further improve regulatory standards for the service sector, and introduce and revise laws and regulations covering services such as housing, education, healthcare and finance, to enhance the growth of the service sector.

\n

Fifth, the paid annual leave system should be strictly implemented. The growth of service consumption requires more leisure time and a balance between work and rest. The paid annual leave system should be made more flexible to allow people to have more say in planning their holidays. For instance, they can combine paid annual leave with short holidays to achieve staggered vacations.

\n

At the same time, workers' rights must be legally protected.

\n

", diff --git a/.obsidian/plugins/text-extractor/data.json b/.obsidian/plugins/text-extractor/data.json new file mode 100644 index 00000000..a89e6d58 --- /dev/null +++ b/.obsidian/plugins/text-extractor/data.json @@ -0,0 +1,7 @@ +{ + "ocrLanguages": [ + "eng" + ], + "rightClickMenu": true, + "useSystemOCR": false +} \ No newline at end of file diff --git a/.obsidian/plugins/text-extractor/main.js b/.obsidian/plugins/text-extractor/main.js new file mode 100644 index 00000000..98ebefa9 --- /dev/null +++ b/.obsidian/plugins/text-extractor/main.js @@ -0,0 +1,5525 @@ +"use strict"; +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => TextExtractorPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian4 = require("obsidian"); + +// node_modules/.pnpm/svelte@3.59.2/node_modules/svelte/internal/index.mjs +function noop() { +} +var identity = (x2) => x2; +function assign(tar, src) { + for (const k2 in src) + tar[k2] = src[k2]; + return tar; +} +function run(fn) { + return fn(); +} +function blank_object() { + return /* @__PURE__ */ Object.create(null); +} +function run_all(fns) { + fns.forEach(run); +} +function is_function(thing) { + return typeof thing === "function"; +} +function safe_not_equal(a2, b2) { + return a2 != a2 ? b2 == b2 : a2 !== b2 || (a2 && typeof a2 === "object" || typeof a2 === "function"); +} +function is_empty(obj) { + return Object.keys(obj).length === 0; +} +function subscribe(store, ...callbacks) { + if (store == null) { + return noop; + } + const unsub = store.subscribe(...callbacks); + return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; +} +function component_subscribe(component, store, callback) { + component.$$.on_destroy.push(subscribe(store, callback)); +} +function create_slot(definition, ctx, $$scope, fn) { + if (definition) { + const slot_ctx = get_slot_context(definition, ctx, $$scope, fn); + return definition[0](slot_ctx); + } +} +function get_slot_context(definition, ctx, $$scope, fn) { + return definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx; +} +function get_slot_changes(definition, $$scope, dirty, fn) { + if (definition[2] && fn) { + const lets = definition[2](fn(dirty)); + if ($$scope.dirty === void 0) { + return lets; + } + if (typeof lets === "object") { + const merged = []; + const len = Math.max($$scope.dirty.length, lets.length); + for (let i2 = 0; i2 < len; i2 += 1) { + merged[i2] = $$scope.dirty[i2] | lets[i2]; + } + return merged; + } + return $$scope.dirty | lets; + } + return $$scope.dirty; +} +function update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) { + if (slot_changes) { + const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn); + slot.p(slot_context, slot_changes); + } +} +function get_all_dirty_from_scope($$scope) { + if ($$scope.ctx.length > 32) { + const dirty = []; + const length = $$scope.ctx.length / 32; + for (let i2 = 0; i2 < length; i2++) { + dirty[i2] = -1; + } + return dirty; + } + return -1; +} +function exclude_internal_props(props) { + const result = {}; + for (const k2 in props) + if (k2[0] !== "$") + result[k2] = props[k2]; + return result; +} +function null_to_empty(value) { + return value == null ? "" : value; +} +var is_client = typeof window !== "undefined"; +var now = is_client ? () => window.performance.now() : () => Date.now(); +var raf = is_client ? (cb) => requestAnimationFrame(cb) : noop; +var tasks = /* @__PURE__ */ new Set(); +function run_tasks(now2) { + tasks.forEach((task) => { + if (!task.c(now2)) { + tasks.delete(task); + task.f(); + } + }); + if (tasks.size !== 0) + raf(run_tasks); +} +function loop(callback) { + let task; + if (tasks.size === 0) + raf(run_tasks); + return { + promise: new Promise((fulfill) => { + tasks.add(task = { c: callback, f: fulfill }); + }), + abort() { + tasks.delete(task); + } + }; +} +var globals = typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : global; +var ResizeObserverSingleton = class { + constructor(options) { + this.options = options; + this._listeners = "WeakMap" in globals ? /* @__PURE__ */ new WeakMap() : void 0; + } + observe(element2, listener) { + this._listeners.set(element2, listener); + this._getObserver().observe(element2, this.options); + return () => { + this._listeners.delete(element2); + this._observer.unobserve(element2); + }; + } + _getObserver() { + var _a2; + return (_a2 = this._observer) !== null && _a2 !== void 0 ? _a2 : this._observer = new ResizeObserver((entries) => { + var _a3; + for (const entry of entries) { + ResizeObserverSingleton.entries.set(entry.target, entry); + (_a3 = this._listeners.get(entry.target)) === null || _a3 === void 0 ? void 0 : _a3(entry); + } + }); + } +}; +ResizeObserverSingleton.entries = "WeakMap" in globals ? /* @__PURE__ */ new WeakMap() : void 0; +var is_hydrating = false; +function start_hydrating() { + is_hydrating = true; +} +function end_hydrating() { + is_hydrating = false; +} +function append(target, node) { + target.appendChild(node); +} +function append_styles(target, style_sheet_id, styles) { + const append_styles_to = get_root_for_style(target); + if (!append_styles_to.getElementById(style_sheet_id)) { + const style = element("style"); + style.id = style_sheet_id; + style.textContent = styles; + append_stylesheet(append_styles_to, style); + } +} +function get_root_for_style(node) { + if (!node) + return document; + const root = node.getRootNode ? node.getRootNode() : node.ownerDocument; + if (root && root.host) { + return root; + } + return node.ownerDocument; +} +function append_empty_stylesheet(node) { + const style_element = element("style"); + append_stylesheet(get_root_for_style(node), style_element); + return style_element.sheet; +} +function append_stylesheet(node, style) { + append(node.head || node, style); + return style.sheet; +} +function insert(target, node, anchor) { + target.insertBefore(node, anchor || null); +} +function detach(node) { + if (node.parentNode) { + node.parentNode.removeChild(node); + } +} +function destroy_each(iterations, detaching) { + for (let i2 = 0; i2 < iterations.length; i2 += 1) { + if (iterations[i2]) + iterations[i2].d(detaching); + } +} +function element(name) { + return document.createElement(name); +} +function svg_element(name) { + return document.createElementNS("http://www.w3.org/2000/svg", name); +} +function text(data) { + return document.createTextNode(data); +} +function space() { + return text(" "); +} +function empty() { + return text(""); +} +function listen(node, event, handler, options) { + node.addEventListener(event, handler, options); + return () => node.removeEventListener(event, handler, options); +} +function prevent_default(fn) { + return function(event) { + event.preventDefault(); + return fn.call(this, event); + }; +} +function stop_propagation(fn) { + return function(event) { + event.stopPropagation(); + return fn.call(this, event); + }; +} +function self2(fn) { + return function(event) { + if (event.target === this) + fn.call(this, event); + }; +} +function attr(node, attribute, value) { + if (value == null) + node.removeAttribute(attribute); + else if (node.getAttribute(attribute) !== value) + node.setAttribute(attribute, value); +} +function set_svg_attributes(node, attributes) { + for (const key in attributes) { + attr(node, key, attributes[key]); + } +} +function children(element2) { + return Array.from(element2.childNodes); +} +function set_data(text2, data) { + data = "" + data; + if (text2.data === data) + return; + text2.data = data; +} +function set_input_value(input, value) { + input.value = value == null ? "" : value; +} +function set_style(node, key, value, important) { + if (value == null) { + node.style.removeProperty(key); + } else { + node.style.setProperty(key, value, important ? "important" : ""); + } +} +function toggle_class(element2, name, toggle) { + element2.classList[toggle ? "add" : "remove"](name); +} +function custom_event(type, detail, { bubbles = false, cancelable = false } = {}) { + const e2 = document.createEvent("CustomEvent"); + e2.initCustomEvent(type, bubbles, cancelable, detail); + return e2; +} +var HtmlTag = class { + constructor(is_svg = false) { + this.is_svg = false; + this.is_svg = is_svg; + this.e = this.n = null; + } + c(html) { + this.h(html); + } + m(html, target, anchor = null) { + if (!this.e) { + if (this.is_svg) + this.e = svg_element(target.nodeName); + else + this.e = element(target.nodeType === 11 ? "TEMPLATE" : target.nodeName); + this.t = target.tagName !== "TEMPLATE" ? target : target.content; + this.c(html); + } + this.i(anchor); + } + h(html) { + this.e.innerHTML = html; + this.n = Array.from(this.e.nodeName === "TEMPLATE" ? this.e.content.childNodes : this.e.childNodes); + } + i(anchor) { + for (let i2 = 0; i2 < this.n.length; i2 += 1) { + insert(this.t, this.n[i2], anchor); + } + } + p(html) { + this.d(); + this.h(html); + this.i(this.a); + } + d() { + this.n.forEach(detach); + } +}; +var managed_styles = /* @__PURE__ */ new Map(); +var active = 0; +function hash(str) { + let hash2 = 5381; + let i2 = str.length; + while (i2--) + hash2 = (hash2 << 5) - hash2 ^ str.charCodeAt(i2); + return hash2 >>> 0; +} +function create_style_information(doc, node) { + const info = { stylesheet: append_empty_stylesheet(node), rules: {} }; + managed_styles.set(doc, info); + return info; +} +function create_rule(node, a2, b2, duration, delay, ease, fn, uid = 0) { + const step = 16.666 / duration; + let keyframes = "{\n"; + for (let p2 = 0; p2 <= 1; p2 += step) { + const t2 = a2 + (b2 - a2) * ease(p2); + keyframes += p2 * 100 + `%{${fn(t2, 1 - t2)}} +`; + } + const rule = keyframes + `100% {${fn(b2, 1 - b2)}} +}`; + const name = `__svelte_${hash(rule)}_${uid}`; + const doc = get_root_for_style(node); + const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node); + if (!rules[name]) { + rules[name] = true; + stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length); + } + const animation = node.style.animation || ""; + node.style.animation = `${animation ? `${animation}, ` : ""}${name} ${duration}ms linear ${delay}ms 1 both`; + active += 1; + return name; +} +function delete_rule(node, name) { + const previous = (node.style.animation || "").split(", "); + const next = previous.filter(name ? (anim) => anim.indexOf(name) < 0 : (anim) => anim.indexOf("__svelte") === -1); + const deleted = previous.length - next.length; + if (deleted) { + node.style.animation = next.join(", "); + active -= deleted; + if (!active) + clear_rules(); + } +} +function clear_rules() { + raf(() => { + if (active) + return; + managed_styles.forEach((info) => { + const { ownerNode } = info.stylesheet; + if (ownerNode) + detach(ownerNode); + }); + managed_styles.clear(); + }); +} +function create_animation(node, from, fn, params) { + if (!from) + return noop; + const to = node.getBoundingClientRect(); + if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom) + return noop; + const { + delay = 0, + duration = 300, + easing = identity, + start: start_time = now() + delay, + end = start_time + duration, + tick: tick2 = noop, + css + } = fn(node, { from, to }, params); + let running = true; + let started = false; + let name; + function start() { + if (css) { + name = create_rule(node, 0, 1, duration, delay, easing, css); + } + if (!delay) { + started = true; + } + } + function stop() { + if (css) + delete_rule(node, name); + running = false; + } + loop((now2) => { + if (!started && now2 >= start_time) { + started = true; + } + if (started && now2 >= end) { + tick2(1, 0); + stop(); + } + if (!running) { + return false; + } + if (started) { + const p2 = now2 - start_time; + const t2 = 0 + 1 * easing(p2 / duration); + tick2(t2, 1 - t2); + } + return true; + }); + start(); + tick2(0, 1); + return stop; +} +function fix_position(node) { + const style = getComputedStyle(node); + if (style.position !== "absolute" && style.position !== "fixed") { + const { width, height } = style; + const a2 = node.getBoundingClientRect(); + node.style.position = "absolute"; + node.style.width = width; + node.style.height = height; + add_transform(node, a2); + } +} +function add_transform(node, a2) { + const b2 = node.getBoundingClientRect(); + if (a2.left !== b2.left || a2.top !== b2.top) { + const style = getComputedStyle(node); + const transform = style.transform === "none" ? "" : style.transform; + node.style.transform = `${transform} translate(${a2.left - b2.left}px, ${a2.top - b2.top}px)`; + } +} +var current_component; +function set_current_component(component) { + current_component = component; +} +function get_current_component() { + if (!current_component) + throw new Error("Function called outside component initialization"); + return current_component; +} +function createEventDispatcher() { + const component = get_current_component(); + return (type, detail, { cancelable = false } = {}) => { + const callbacks = component.$$.callbacks[type]; + if (callbacks) { + const event = custom_event(type, detail, { cancelable }); + callbacks.slice().forEach((fn) => { + fn.call(component, event); + }); + return !event.defaultPrevented; + } + return true; + }; +} +function bubble(component, event) { + const callbacks = component.$$.callbacks[event.type]; + if (callbacks) { + callbacks.slice().forEach((fn) => fn.call(this, event)); + } +} +var dirty_components = []; +var binding_callbacks = []; +var render_callbacks = []; +var flush_callbacks = []; +var resolved_promise = /* @__PURE__ */ Promise.resolve(); +var update_scheduled = false; +function schedule_update() { + if (!update_scheduled) { + update_scheduled = true; + resolved_promise.then(flush); + } +} +function tick() { + schedule_update(); + return resolved_promise; +} +function add_render_callback(fn) { + render_callbacks.push(fn); +} +function add_flush_callback(fn) { + flush_callbacks.push(fn); +} +var seen_callbacks = /* @__PURE__ */ new Set(); +var flushidx = 0; +function flush() { + if (flushidx !== 0) { + return; + } + const saved_component = current_component; + do { + try { + while (flushidx < dirty_components.length) { + const component = dirty_components[flushidx]; + flushidx++; + set_current_component(component); + update(component.$$); + } + } catch (e2) { + dirty_components.length = 0; + flushidx = 0; + throw e2; + } + set_current_component(null); + dirty_components.length = 0; + flushidx = 0; + while (binding_callbacks.length) + binding_callbacks.pop()(); + for (let i2 = 0; i2 < render_callbacks.length; i2 += 1) { + const callback = render_callbacks[i2]; + if (!seen_callbacks.has(callback)) { + seen_callbacks.add(callback); + callback(); + } + } + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + seen_callbacks.clear(); + set_current_component(saved_component); +} +function update($$) { + if ($$.fragment !== null) { + $$.update(); + run_all($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback); + } +} +function flush_render_callbacks(fns) { + const filtered = []; + const targets = []; + render_callbacks.forEach((c2) => fns.indexOf(c2) === -1 ? filtered.push(c2) : targets.push(c2)); + targets.forEach((c2) => c2()); + render_callbacks = filtered; +} +var outroing = /* @__PURE__ */ new Set(); +var outros; +function group_outros() { + outros = { + r: 0, + c: [], + p: outros + }; +} +function check_outros() { + if (!outros.r) { + run_all(outros.c); + } + outros = outros.p; +} +function transition_in(block, local) { + if (block && block.i) { + outroing.delete(block); + block.i(local); + } +} +function transition_out(block, local, detach2, callback) { + if (block && block.o) { + if (outroing.has(block)) + return; + outroing.add(block); + outros.c.push(() => { + outroing.delete(block); + if (callback) { + if (detach2) + block.d(1); + callback(); + } + }); + block.o(local); + } else if (callback) { + callback(); + } +} +function outro_and_destroy_block(block, lookup) { + transition_out(block, 1, 1, () => { + lookup.delete(block.key); + }); +} +function fix_and_outro_and_destroy_block(block, lookup) { + block.f(); + outro_and_destroy_block(block, lookup); +} +function update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block2, next, get_context) { + let o2 = old_blocks.length; + let n2 = list.length; + let i2 = o2; + const old_indexes = {}; + while (i2--) + old_indexes[old_blocks[i2].key] = i2; + const new_blocks = []; + const new_lookup = /* @__PURE__ */ new Map(); + const deltas = /* @__PURE__ */ new Map(); + const updates = []; + i2 = n2; + while (i2--) { + const child_ctx = get_context(ctx, list, i2); + const key = get_key(child_ctx); + let block = lookup.get(key); + if (!block) { + block = create_each_block2(key, child_ctx); + block.c(); + } else if (dynamic) { + updates.push(() => block.p(child_ctx, dirty)); + } + new_lookup.set(key, new_blocks[i2] = block); + if (key in old_indexes) + deltas.set(key, Math.abs(i2 - old_indexes[key])); + } + const will_move = /* @__PURE__ */ new Set(); + const did_move = /* @__PURE__ */ new Set(); + function insert2(block) { + transition_in(block, 1); + block.m(node, next); + lookup.set(block.key, block); + next = block.first; + n2--; + } + while (o2 && n2) { + const new_block = new_blocks[n2 - 1]; + const old_block = old_blocks[o2 - 1]; + const new_key = new_block.key; + const old_key = old_block.key; + if (new_block === old_block) { + next = new_block.first; + o2--; + n2--; + } else if (!new_lookup.has(old_key)) { + destroy(old_block, lookup); + o2--; + } else if (!lookup.has(new_key) || will_move.has(new_key)) { + insert2(new_block); + } else if (did_move.has(old_key)) { + o2--; + } else if (deltas.get(new_key) > deltas.get(old_key)) { + did_move.add(new_key); + insert2(new_block); + } else { + will_move.add(old_key); + o2--; + } + } + while (o2--) { + const old_block = old_blocks[o2]; + if (!new_lookup.has(old_block.key)) + destroy(old_block, lookup); + } + while (n2) + insert2(new_blocks[n2 - 1]); + run_all(updates); + return new_blocks; +} +function get_spread_update(levels, updates) { + const update2 = {}; + const to_null_out = {}; + const accounted_for = { $$scope: 1 }; + let i2 = levels.length; + while (i2--) { + const o2 = levels[i2]; + const n2 = updates[i2]; + if (n2) { + for (const key in o2) { + if (!(key in n2)) + to_null_out[key] = 1; + } + for (const key in n2) { + if (!accounted_for[key]) { + update2[key] = n2[key]; + accounted_for[key] = 1; + } + } + levels[i2] = n2; + } else { + for (const key in o2) { + accounted_for[key] = 1; + } + } + } + for (const key in to_null_out) { + if (!(key in update2)) + update2[key] = void 0; + } + return update2; +} +var _boolean_attributes = [ + "allowfullscreen", + "allowpaymentrequest", + "async", + "autofocus", + "autoplay", + "checked", + "controls", + "default", + "defer", + "disabled", + "formnovalidate", + "hidden", + "inert", + "ismap", + "loop", + "multiple", + "muted", + "nomodule", + "novalidate", + "open", + "playsinline", + "readonly", + "required", + "reversed", + "selected" +]; +var boolean_attributes = /* @__PURE__ */ new Set([..._boolean_attributes]); +function bind(component, name, callback) { + const index = component.$$.props[name]; + if (index !== void 0) { + component.$$.bound[index] = callback; + callback(component.$$.ctx[index]); + } +} +function create_component(block) { + block && block.c(); +} +function mount_component(component, target, anchor, customElement) { + const { fragment, after_update } = component.$$; + fragment && fragment.m(target, anchor); + if (!customElement) { + add_render_callback(() => { + const new_on_destroy = component.$$.on_mount.map(run).filter(is_function); + if (component.$$.on_destroy) { + component.$$.on_destroy.push(...new_on_destroy); + } else { + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + } + after_update.forEach(add_render_callback); +} +function destroy_component(component, detaching) { + const $$ = component.$$; + if ($$.fragment !== null) { + flush_render_callbacks($$.after_update); + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } +} +function make_dirty(component, i2) { + if (component.$$.dirty[0] === -1) { + dirty_components.push(component); + schedule_update(); + component.$$.dirty.fill(0); + } + component.$$.dirty[i2 / 31 | 0] |= 1 << i2 % 31; +} +function init(component, options, instance8, create_fragment8, not_equal, props, append_styles2, dirty = [-1]) { + const parent_component = current_component; + set_current_component(component); + const $$ = component.$$ = { + fragment: null, + ctx: [], + props, + update: noop, + not_equal, + bound: blank_object(), + on_mount: [], + on_destroy: [], + on_disconnect: [], + before_update: [], + after_update: [], + context: new Map(options.context || (parent_component ? parent_component.$$.context : [])), + callbacks: blank_object(), + dirty, + skip_bound: false, + root: options.target || parent_component.$$.root + }; + append_styles2 && append_styles2($$.root); + let ready = false; + $$.ctx = instance8 ? instance8(component, options.props || {}, (i2, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i2], $$.ctx[i2] = value)) { + if (!$$.skip_bound && $$.bound[i2]) + $$.bound[i2](value); + if (ready) + make_dirty(component, i2); + } + return ret; + }) : []; + $$.update(); + ready = true; + run_all($$.before_update); + $$.fragment = create_fragment8 ? create_fragment8($$.ctx) : false; + if (options.target) { + if (options.hydrate) { + start_hydrating(); + const nodes = children(options.target); + $$.fragment && $$.fragment.l(nodes); + nodes.forEach(detach); + } else { + $$.fragment && $$.fragment.c(); + } + if (options.intro) + transition_in(component.$$.fragment); + mount_component(component, options.target, options.anchor, options.customElement); + end_hydrating(); + flush(); + } + set_current_component(parent_component); +} +var SvelteElement; +if (typeof HTMLElement === "function") { + SvelteElement = class extends HTMLElement { + constructor() { + super(); + this.attachShadow({ mode: "open" }); + } + connectedCallback() { + const { on_mount } = this.$$; + this.$$.on_disconnect = on_mount.map(run).filter(is_function); + for (const key in this.$$.slotted) { + this.appendChild(this.$$.slotted[key]); + } + } + attributeChangedCallback(attr2, _oldValue, newValue) { + this[attr2] = newValue; + } + disconnectedCallback() { + run_all(this.$$.on_disconnect); + } + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + if (!is_function(callback)) { + return noop; + } + const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } + }; +} +var SvelteComponent = class { + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + if (!is_function(callback)) { + return noop; + } + const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } +}; + +// node_modules/.pnpm/svelte@3.59.2/node_modules/svelte/store/index.mjs +var subscriber_queue = []; +function writable(value, start = noop) { + let stop; + const subscribers = /* @__PURE__ */ new Set(); + function set(new_value) { + if (safe_not_equal(value, new_value)) { + value = new_value; + if (stop) { + const run_queue = !subscriber_queue.length; + for (const subscriber of subscribers) { + subscriber[1](); + subscriber_queue.push(subscriber, value); + } + if (run_queue) { + for (let i2 = 0; i2 < subscriber_queue.length; i2 += 2) { + subscriber_queue[i2][0](subscriber_queue[i2 + 1]); + } + subscriber_queue.length = 0; + } + } + } + } + function update2(fn) { + set(fn(value)); + } + function subscribe2(run2, invalidate = noop) { + const subscriber = [run2, invalidate]; + subscribers.add(subscriber); + if (subscribers.size === 1) { + stop = start(set) || noop; + } + run2(value); + return () => { + subscribers.delete(subscriber); + if (subscribers.size === 0 && stop) { + stop(); + stop = null; + } + }; + } + return { set, update: update2, subscribe: subscribe2 }; +} + +// src/settings.ts +var import_obsidian2 = require("obsidian"); + +// node_modules/.pnpm/svelte-multiselect@8.6.2/node_modules/svelte-multiselect/dist/CircleSpinner.svelte +function add_css(target) { + append_styles(target, "svelte-66wdl1", "div.svelte-66wdl1{display:inline-block;vertical-align:middle;margin:0 3pt;border-width:calc(1em / 5);border-style:solid;border-radius:50%;animation:var(--duration) infinite svelte-66wdl1-rotate}@keyframes svelte-66wdl1-rotate{100%{transform:rotate(360deg)}}"); +} +function create_fragment(ctx) { + let div; + let style_border_color = `${ctx[0]} transparent ${ctx[0]} + ${ctx[0]}`; + return { + c() { + div = element("div"); + set_style(div, "--duration", ctx[1]); + attr(div, "class", "svelte-66wdl1"); + set_style(div, "border-color", style_border_color); + set_style(div, "width", ctx[2]); + set_style(div, "height", ctx[2]); + }, + m(target, anchor) { + insert(target, div, anchor); + }, + p(ctx2, [dirty]) { + if (dirty & 2) { + set_style(div, "--duration", ctx2[1]); + } + const style_changed = dirty & 2; + if (style_changed || dirty & 3 && style_border_color !== (style_border_color = `${ctx2[0]} transparent ${ctx2[0]} + ${ctx2[0]}`)) { + set_style(div, "border-color", style_border_color); + } + if (style_changed || dirty & 6) { + set_style(div, "width", ctx2[2]); + } + if (style_changed || dirty & 6) { + set_style(div, "height", ctx2[2]); + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(div); + } + }; +} +function instance($$self, $$props, $$invalidate) { + let { color = `cornflowerblue` } = $$props; + let { duration = `1.5s` } = $$props; + let { size = `1em` } = $$props; + $$self.$$set = ($$props2) => { + if ("color" in $$props2) + $$invalidate(0, color = $$props2.color); + if ("duration" in $$props2) + $$invalidate(1, duration = $$props2.duration); + if ("size" in $$props2) + $$invalidate(2, size = $$props2.size); + }; + return [color, duration, size]; +} +var CircleSpinner = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal, { color: 0, duration: 1, size: 2 }, add_css); + } +}; +var CircleSpinner_default = CircleSpinner; + +// node_modules/.pnpm/svelte@3.59.2/node_modules/svelte/easing/index.mjs +function cubicOut(t2) { + const f2 = t2 - 1; + return f2 * f2 * f2 + 1; +} + +// node_modules/.pnpm/svelte@3.59.2/node_modules/svelte/animate/index.mjs +function flip(node, { from, to }, params = {}) { + const style = getComputedStyle(node); + const transform = style.transform === "none" ? "" : style.transform; + const [ox, oy] = style.transformOrigin.split(" ").map(parseFloat); + const dx = from.left + from.width * ox / to.width - (to.left + ox); + const dy = from.top + from.height * oy / to.height - (to.top + oy); + const { delay = 0, duration = (d2) => Math.sqrt(d2) * 120, easing = cubicOut } = params; + return { + delay, + duration: is_function(duration) ? duration(Math.sqrt(dx * dx + dy * dy)) : duration, + easing, + css: (t2, u2) => { + const x2 = u2 * dx; + const y2 = u2 * dy; + const sx = t2 + u2 * from.width / to.width; + const sy = t2 + u2 * from.height / to.height; + return `transform: ${transform} translate(${x2}px, ${y2}px) scale(${sx}, ${sy});`; + } + }; +} + +// node_modules/.pnpm/svelte@3.59.2/node_modules/svelte/motion/index.mjs +function is_date(obj) { + return Object.prototype.toString.call(obj) === "[object Date]"; +} +function tick_spring(ctx, last_value, current_value, target_value) { + if (typeof current_value === "number" || is_date(current_value)) { + const delta = target_value - current_value; + const velocity = (current_value - last_value) / (ctx.dt || 1 / 60); + const spring2 = ctx.opts.stiffness * delta; + const damper = ctx.opts.damping * velocity; + const acceleration = (spring2 - damper) * ctx.inv_mass; + const d2 = (velocity + acceleration) * ctx.dt; + if (Math.abs(d2) < ctx.opts.precision && Math.abs(delta) < ctx.opts.precision) { + return target_value; + } else { + ctx.settled = false; + return is_date(current_value) ? new Date(current_value.getTime() + d2) : current_value + d2; + } + } else if (Array.isArray(current_value)) { + return current_value.map((_2, i2) => tick_spring(ctx, last_value[i2], current_value[i2], target_value[i2])); + } else if (typeof current_value === "object") { + const next_value = {}; + for (const k2 in current_value) { + next_value[k2] = tick_spring(ctx, last_value[k2], current_value[k2], target_value[k2]); + } + return next_value; + } else { + throw new Error(`Cannot spring ${typeof current_value} values`); + } +} +function spring(value, opts = {}) { + const store = writable(value); + const { stiffness = 0.15, damping = 0.8, precision = 0.01 } = opts; + let last_time; + let task; + let current_token; + let last_value = value; + let target_value = value; + let inv_mass = 1; + let inv_mass_recovery_rate = 0; + let cancel_task = false; + function set(new_value, opts2 = {}) { + target_value = new_value; + const token = current_token = {}; + if (value == null || opts2.hard || spring2.stiffness >= 1 && spring2.damping >= 1) { + cancel_task = true; + last_time = now(); + last_value = new_value; + store.set(value = target_value); + return Promise.resolve(); + } else if (opts2.soft) { + const rate = opts2.soft === true ? 0.5 : +opts2.soft; + inv_mass_recovery_rate = 1 / (rate * 60); + inv_mass = 0; + } + if (!task) { + last_time = now(); + cancel_task = false; + task = loop((now2) => { + if (cancel_task) { + cancel_task = false; + task = null; + return false; + } + inv_mass = Math.min(inv_mass + inv_mass_recovery_rate, 1); + const ctx = { + inv_mass, + opts: spring2, + settled: true, + dt: (now2 - last_time) * 60 / 1e3 + }; + const next_value = tick_spring(ctx, last_value, value, target_value); + last_time = now2; + last_value = value; + store.set(value = next_value); + if (ctx.settled) { + task = null; + } + return !ctx.settled; + }); + } + return new Promise((fulfil) => { + task.promise.then(() => { + if (token === current_token) + fulfil(); + }); + }); + } + const spring2 = { + set, + update: (fn, opts2) => set(fn(target_value, value), opts2), + subscribe: store.subscribe, + stiffness, + damping, + precision + }; + return spring2; +} + +// node_modules/.pnpm/svelte-multiselect@8.6.2/node_modules/svelte-multiselect/dist/Wiggle.svelte +function create_fragment2(ctx) { + let span; + let style_transform = `rotate(${ctx[0].angle}deg) scale(${ctx[0].scale}) translate(${ctx[0].dx}px, + ${ctx[0].dy}px)`; + let current; + const default_slot_template = ctx[11].default; + const default_slot = create_slot(default_slot_template, ctx, ctx[10], null); + return { + c() { + span = element("span"); + if (default_slot) + default_slot.c(); + set_style(span, "transform", style_transform); + }, + m(target, anchor) { + insert(target, span, anchor); + if (default_slot) { + default_slot.m(span, null); + } + current = true; + }, + p(ctx2, [dirty]) { + if (default_slot) { + if (default_slot.p && (!current || dirty & 1024)) { + update_slot_base(default_slot, default_slot_template, ctx2, ctx2[10], !current ? get_all_dirty_from_scope(ctx2[10]) : get_slot_changes(default_slot_template, ctx2[10], dirty, null), null); + } + } + if (dirty & 1 && style_transform !== (style_transform = `rotate(${ctx2[0].angle}deg) scale(${ctx2[0].scale}) translate(${ctx2[0].dx}px, + ${ctx2[0].dy}px)`)) { + set_style(span, "transform", style_transform); + } + }, + i(local) { + if (current) + return; + transition_in(default_slot, local); + current = true; + }, + o(local) { + transition_out(default_slot, local); + current = false; + }, + d(detaching) { + if (detaching) + detach(span); + if (default_slot) + default_slot.d(detaching); + } + }; +} +function instance2($$self, $$props, $$invalidate) { + let $store; + let { $$slots: slots = {}, $$scope } = $$props; + let { wiggle = false } = $$props; + let { angle = 0 } = $$props; + let { scale = 1 } = $$props; + let { dx = 0 } = $$props; + let { dy = 0 } = $$props; + let { duration = 200 } = $$props; + let { stiffness = 0.05 } = $$props; + let { damping = 0.1 } = $$props; + let rest_state = { angle: 0, scale: 1, dx: 0, dy: 0 }; + let store = spring(rest_state, { stiffness, damping }); + component_subscribe($$self, store, (value) => $$invalidate(0, $store = value)); + $$self.$$set = ($$props2) => { + if ("wiggle" in $$props2) + $$invalidate(2, wiggle = $$props2.wiggle); + if ("angle" in $$props2) + $$invalidate(3, angle = $$props2.angle); + if ("scale" in $$props2) + $$invalidate(4, scale = $$props2.scale); + if ("dx" in $$props2) + $$invalidate(5, dx = $$props2.dx); + if ("dy" in $$props2) + $$invalidate(6, dy = $$props2.dy); + if ("duration" in $$props2) + $$invalidate(7, duration = $$props2.duration); + if ("stiffness" in $$props2) + $$invalidate(8, stiffness = $$props2.stiffness); + if ("damping" in $$props2) + $$invalidate(9, damping = $$props2.damping); + if ("$$scope" in $$props2) + $$invalidate(10, $$scope = $$props2.$$scope); + }; + $$self.$$.update = () => { + if ($$self.$$.dirty & 132) { + $: + if (wiggle) + setTimeout(() => $$invalidate(2, wiggle = false), duration); + } + if ($$self.$$.dirty & 124) { + $: + store.set(wiggle ? { scale, angle, dx, dy } : rest_state); + } + }; + return [ + $store, + store, + wiggle, + angle, + scale, + dx, + dy, + duration, + stiffness, + damping, + $$scope, + slots + ]; +} +var Wiggle = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance2, create_fragment2, safe_not_equal, { + wiggle: 2, + angle: 3, + scale: 4, + dx: 5, + dy: 6, + duration: 7, + stiffness: 8, + damping: 9 + }); + } +}; +var Wiggle_default = Wiggle; + +// node_modules/.pnpm/svelte-multiselect@8.6.2/node_modules/svelte-multiselect/dist/icons/ChevronExpand.svelte +function create_fragment3(ctx) { + let svg; + let path; + let svg_levels = [ctx[0], { fill: "currentColor" }, { viewBox: "0 0 16 16" }]; + let svg_data = {}; + for (let i2 = 0; i2 < svg_levels.length; i2 += 1) { + svg_data = assign(svg_data, svg_levels[i2]); + } + return { + c() { + svg = svg_element("svg"); + path = svg_element("path"); + attr(path, "d", "M3.646 9.146a.5.5 0 0 1 .708 0L8 12.793l3.646-3.647a.5.5 0 0 1 .708.708l-4 4a.5.5 0 0 1-.708 0l-4-4a.5.5 0 0 1 0-.708zm0-2.292a.5.5 0 0 0 .708 0L8 3.207l3.646 3.647a.5.5 0 0 0 .708-.708l-4-4a.5.5 0 0 0-.708 0l-4 4a.5.5 0 0 0 0 .708z"); + set_svg_attributes(svg, svg_data); + }, + m(target, anchor) { + insert(target, svg, anchor); + append(svg, path); + }, + p(ctx2, [dirty]) { + set_svg_attributes(svg, svg_data = get_spread_update(svg_levels, [ + dirty & 1 && ctx2[0], + { fill: "currentColor" }, + { viewBox: "0 0 16 16" } + ])); + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(svg); + } + }; +} +function instance3($$self, $$props, $$invalidate) { + $$self.$$set = ($$new_props) => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; + $$props = exclude_internal_props($$props); + return [$$props]; +} +var ChevronExpand = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance3, create_fragment3, safe_not_equal, {}); + } +}; +var ChevronExpand_default = ChevronExpand; + +// node_modules/.pnpm/svelte-multiselect@8.6.2/node_modules/svelte-multiselect/dist/icons/Cross.svelte +function create_fragment4(ctx) { + let svg; + let path; + let svg_levels = [ctx[0], { viewBox: "0 0 24 24" }, { fill: "currentColor" }]; + let svg_data = {}; + for (let i2 = 0; i2 < svg_levels.length; i2 += 1) { + svg_data = assign(svg_data, svg_levels[i2]); + } + return { + c() { + svg = svg_element("svg"); + path = svg_element("path"); + attr(path, "d", "M18.3 5.71a.996.996 0 0 0-1.41 0L12 10.59L7.11 5.7A.996.996 0 1 0 5.7 7.11L10.59 12L5.7 16.89a.996.996 0 1 0 1.41 1.41L12 13.41l4.89 4.89a.996.996 0 1 0 1.41-1.41L13.41 12l4.89-4.89c.38-.38.38-1.02 0-1.4z"); + set_svg_attributes(svg, svg_data); + }, + m(target, anchor) { + insert(target, svg, anchor); + append(svg, path); + }, + p(ctx2, [dirty]) { + set_svg_attributes(svg, svg_data = get_spread_update(svg_levels, [ + dirty & 1 && ctx2[0], + { viewBox: "0 0 24 24" }, + { fill: "currentColor" } + ])); + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(svg); + } + }; +} +function instance4($$self, $$props, $$invalidate) { + $$self.$$set = ($$new_props) => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; + $$props = exclude_internal_props($$props); + return [$$props]; +} +var Cross = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance4, create_fragment4, safe_not_equal, {}); + } +}; +var Cross_default = Cross; + +// node_modules/.pnpm/svelte-multiselect@8.6.2/node_modules/svelte-multiselect/dist/icons/Disabled.svelte +function create_fragment5(ctx) { + let svg; + let path; + let svg_levels = [ctx[0], { viewBox: "0 0 24 24" }, { fill: "currentColor" }]; + let svg_data = {}; + for (let i2 = 0; i2 < svg_levels.length; i2 += 1) { + svg_data = assign(svg_data, svg_levels[i2]); + } + return { + c() { + svg = svg_element("svg"); + path = svg_element("path"); + attr(path, "d", "M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2S2 6.477 2 12s4.477 10 10 10Zm-4.906-3.68L18.32 7.094A8 8 0 0 1 7.094 18.32ZM5.68 16.906A8 8 0 0 1 16.906 5.68L5.68 16.906Z"); + set_svg_attributes(svg, svg_data); + }, + m(target, anchor) { + insert(target, svg, anchor); + append(svg, path); + }, + p(ctx2, [dirty]) { + set_svg_attributes(svg, svg_data = get_spread_update(svg_levels, [ + dirty & 1 && ctx2[0], + { viewBox: "0 0 24 24" }, + { fill: "currentColor" } + ])); + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(svg); + } + }; +} +function instance5($$self, $$props, $$invalidate) { + $$self.$$set = ($$new_props) => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; + $$props = exclude_internal_props($$props); + return [$$props]; +} +var Disabled = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance5, create_fragment5, safe_not_equal, {}); + } +}; +var Disabled_default = Disabled; + +// node_modules/.pnpm/svelte-multiselect@8.6.2/node_modules/svelte-multiselect/dist/MultiSelect.svelte +var { Boolean: Boolean_1 } = globals; +function add_css2(target) { + append_styles(target, "svelte-1r2hsto", ".svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect){position:relative;align-items:center;display:flex;cursor:text;box-sizing:border-box;border:var(--sms-border, 1pt solid lightgray);border-radius:var(--sms-border-radius, 3pt);background:var(--sms-bg);width:var(--sms-width);max-width:var(--sms-max-width);padding:var(--sms-padding, 0 3pt);color:var(--sms-text-color);font-size:var(--sms-font-size, inherit);min-height:var(--sms-min-height, 22pt);margin:var(--sms-margin)}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect.open){z-index:var(--sms-open-z-index, 4)}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect:focus-within){border:var(--sms-focus-border, 1pt solid var(--sms-active-color, cornflowerblue))}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect.disabled){background:var(--sms-disabled-bg, lightgray);cursor:not-allowed}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect > ul.selected){display:flex;flex:1;padding:0;margin:0;flex-wrap:wrap}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect > ul.selected > li){align-items:center;border-radius:3pt;display:flex;margin:2pt;line-height:normal;transition:0.3s;white-space:nowrap;background:var(--sms-selected-bg, rgba(0, 0, 0, 0.15));padding:var(--sms-selected-li-padding, 1pt 5pt);color:var(--sms-selected-text-color, var(--sms-text-color))}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect > ul.selected > li[draggable='true']){cursor:grab}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect > ul.selected > li.active){background:var(--sms-li-active-bg, var(--sms-active-color, rgba(0, 0, 0, 0.15)))}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect button){border-radius:50%;display:flex;transition:0.2s;color:inherit;background:transparent;border:none;cursor:pointer;outline:none;padding:0;margin:0 0 0 3pt}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect button.remove-all){margin:0 3pt}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(ul.selected > li button:hover, button.remove-all:hover, button:focus){color:var(--sms-remove-btn-hover-color, lightskyblue);background:var(--sms-remove-btn-hover-bg, rgba(0, 0, 0, 0.2))}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect input){margin:auto 0;padding:0}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect > ul.selected > input){border:none;outline:none;background:none;flex:1;min-width:2em;color:var(--sms-text-color);font-size:inherit;cursor:inherit;border-radius:0}div.multiselect.svelte-1r2hsto>ul.selected.svelte-1r2hsto>input.svelte-1r2hsto::placeholder{padding-left:5pt;color:var(--sms-placeholder-color);opacity:var(--sms-placeholder-opacity)}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect > input.form-control){width:2em;position:absolute;background:transparent;border:none;outline:none;z-index:-1;opacity:0;pointer-events:none}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect > ul.options){list-style:none;top:100%;left:0;width:100%;position:absolute;overflow:auto;transition:all 0.2s;box-sizing:border-box;background:var(--sms-options-bg, white);max-height:var(--sms-options-max-height, 50vh);overscroll-behavior:var(--sms-options-overscroll, none);box-shadow:var(--sms-options-shadow, 0 0 14pt -8pt black);border:var(--sms-options-border);border-width:var(--sms-options-border-width);border-radius:var(--sms-options-border-radius, 1ex);padding:var(--sms-options-padding);margin:var(--sms-options-margin, inherit)}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect > ul.options.hidden){visibility:hidden;opacity:0;transform:translateY(50px)}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect > ul.options > li){padding:3pt 2ex;cursor:pointer;scroll-margin:var(--sms-options-scroll-margin, 100px)}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect > ul.options .user-msg){display:block;padding:3pt 2ex}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect > ul.options > li.selected){background:var(--sms-li-selected-bg);color:var(--sms-li-selected-color)}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect > ul.options > li.active){background:var(--sms-li-active-bg, var(--sms-active-color, rgba(0, 0, 0, 0.15)))}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(div.multiselect > ul.options > li.disabled){cursor:not-allowed;background:var(--sms-li-disabled-bg, #f5f5f6);color:var(--sms-li-disabled-text, #b8b8b8)}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto:where(span.max-select-msg){padding:0 3pt}.svelte-1r2hsto.svelte-1r2hsto.svelte-1r2hsto::highlight(sms-search-matches){color:mediumaquamarine}"); +} +function get_each_context(ctx, list, i2) { + const child_ctx = ctx.slice(); + child_ctx[110] = list[i2]; + child_ctx[117] = i2; + const constants_0 = child_ctx[110] instanceof Object ? child_ctx[110] : { label: child_ctx[110] }; + child_ctx[111] = constants_0.label; + child_ctx[42] = constants_0.disabled !== void 0 ? constants_0.disabled : null; + child_ctx[112] = constants_0.title !== void 0 ? constants_0.title : null; + child_ctx[113] = constants_0.selectedTitle !== void 0 ? constants_0.selectedTitle : null; + child_ctx[114] = constants_0.disabledTitle !== void 0 ? constants_0.disabledTitle : child_ctx[13]; + const constants_1 = child_ctx[0] === child_ctx[117]; + child_ctx[115] = constants_1; + return child_ctx; +} +var get_option_slot_changes = (dirty) => ({ option: dirty[0] & 2 }); +var get_option_slot_context = (ctx) => ({ + option: ctx[110], + idx: ctx[117] +}); +function get_else_ctx(ctx) { + const child_ctx = ctx.slice(); + const constants_0 = child_ctx[4].some((option) => child_ctx[15](option, child_ctx[3])); + child_ctx[118] = constants_0; + const constants_1 = !child_ctx[17] && child_ctx[118] ? child_ctx[16] : child_ctx[10]; + child_ctx[119] = constants_1; + return child_ctx; +} +var get_remove_icon_slot_changes_1 = (dirty) => ({}); +var get_remove_icon_slot_context_1 = (ctx) => ({}); +var get_disabled_icon_slot_changes = (dirty) => ({}); +var get_disabled_icon_slot_context = (ctx) => ({}); +var get_spinner_slot_changes = (dirty) => ({}); +var get_spinner_slot_context = (ctx) => ({}); +function get_each_context_1(ctx, list, i2) { + const child_ctx = ctx.slice(); + child_ctx[110] = list[i2]; + child_ctx[117] = i2; + return child_ctx; +} +var get_remove_icon_slot_changes = (dirty) => ({}); +var get_remove_icon_slot_context = (ctx) => ({}); +var get_selected_slot_changes = (dirty) => ({ + option: dirty[0] & 16, + idx: dirty[0] & 16 +}); +var get_selected_slot_context = (ctx) => ({ + option: ctx[110], + idx: ctx[117] +}); +var get_expand_icon_slot_changes = (dirty) => ({ open: dirty[0] & 256 }); +var get_expand_icon_slot_context = (ctx) => ({ open: ctx[8] }); +function fallback_block_6(ctx) { + let expandicon; + let current; + expandicon = new ChevronExpand_default({ + props: { + width: "15px", + style: "min-width: 1em; padding: 0 1pt; cursor: pointer;" + } + }); + return { + c() { + create_component(expandicon.$$.fragment); + }, + m(target, anchor) { + mount_component(expandicon, target, anchor); + current = true; + }, + p: noop, + i(local) { + if (current) + return; + transition_in(expandicon.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(expandicon.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(expandicon, detaching); + } + }; +} +function create_else_block_2(ctx) { + let t_value = ctx[41](ctx[110]) + ""; + let t2; + return { + c() { + t2 = text(t_value); + }, + m(target, anchor) { + insert(target, t2, anchor); + }, + p(ctx2, dirty) { + if (dirty[0] & 16 && t_value !== (t_value = ctx2[41](ctx2[110]) + "")) + set_data(t2, t_value); + }, + d(detaching) { + if (detaching) + detach(t2); + } + }; +} +function create_if_block_10(ctx) { + let html_tag; + let raw_value = ctx[41](ctx[110]) + ""; + let html_anchor; + return { + c() { + html_tag = new HtmlTag(false); + html_anchor = empty(); + html_tag.a = html_anchor; + }, + m(target, anchor) { + html_tag.m(raw_value, target, anchor); + insert(target, html_anchor, anchor); + }, + p(ctx2, dirty) { + if (dirty[0] & 16 && raw_value !== (raw_value = ctx2[41](ctx2[110]) + "")) + html_tag.p(raw_value); + }, + d(detaching) { + if (detaching) + detach(html_anchor); + if (detaching) + html_tag.d(); + } + }; +} +function fallback_block_5(ctx) { + let if_block_anchor; + function select_block_type(ctx2, dirty) { + if (ctx2[31]) + return create_if_block_10; + return create_else_block_2; + } + let current_block_type = select_block_type(ctx, [-1, -1, -1, -1]); + let if_block = current_block_type(ctx); + return { + c() { + if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + }, + p(ctx2, dirty) { + if (current_block_type === (current_block_type = select_block_type(ctx2, dirty)) && if_block) { + if_block.p(ctx2, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx2); + if (if_block) { + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } + }, + d(detaching) { + if_block.d(detaching); + if (detaching) + detach(if_block_anchor); + } + }; +} +function create_if_block_9(ctx) { + let button; + let button_title_value; + let current; + let mounted; + let dispose; + const remove_icon_slot_template = ctx[69]["remove-icon"]; + const remove_icon_slot = create_slot(remove_icon_slot_template, ctx, ctx[107], get_remove_icon_slot_context); + const remove_icon_slot_or_fallback = remove_icon_slot || fallback_block_4(ctx); + function mouseup_handler() { + return ctx[89](ctx[110]); + } + function keydown_handler_1() { + return ctx[90](ctx[110]); + } + return { + c() { + button = element("button"); + if (remove_icon_slot_or_fallback) + remove_icon_slot_or_fallback.c(); + attr(button, "type", "button"); + attr(button, "title", button_title_value = ctx[35] + " " + ctx[41](ctx[110])); + attr(button, "class", "remove svelte-1r2hsto"); + }, + m(target, anchor) { + insert(target, button, anchor); + if (remove_icon_slot_or_fallback) { + remove_icon_slot_or_fallback.m(button, null); + } + current = true; + if (!mounted) { + dispose = [ + listen(button, "mouseup", stop_propagation(mouseup_handler)), + listen(button, "keydown", function() { + if (is_function(ctx[54](keydown_handler_1))) + ctx[54](keydown_handler_1).apply(this, arguments); + }) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (remove_icon_slot) { + if (remove_icon_slot.p && (!current || dirty[3] & 16384)) { + update_slot_base(remove_icon_slot, remove_icon_slot_template, ctx, ctx[107], !current ? get_all_dirty_from_scope(ctx[107]) : get_slot_changes(remove_icon_slot_template, ctx[107], dirty, get_remove_icon_slot_changes), get_remove_icon_slot_context); + } + } + if (!current || dirty[0] & 16 | dirty[1] & 16 && button_title_value !== (button_title_value = ctx[35] + " " + ctx[41](ctx[110]))) { + attr(button, "title", button_title_value); + } + }, + i(local) { + if (current) + return; + transition_in(remove_icon_slot_or_fallback, local); + current = true; + }, + o(local) { + transition_out(remove_icon_slot_or_fallback, local); + current = false; + }, + d(detaching) { + if (detaching) + detach(button); + if (remove_icon_slot_or_fallback) + remove_icon_slot_or_fallback.d(detaching); + mounted = false; + run_all(dispose); + } + }; +} +function fallback_block_4(ctx) { + let crossicon; + let current; + crossicon = new Cross_default({ props: { width: "15px" } }); + return { + c() { + create_component(crossicon.$$.fragment); + }, + m(target, anchor) { + mount_component(crossicon, target, anchor); + current = true; + }, + p: noop, + i(local) { + if (current) + return; + transition_in(crossicon.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(crossicon.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(crossicon, detaching); + } + }; +} +function create_each_block_1(key_1, ctx) { + let li; + let t2; + let li_class_value; + let li_draggable_value; + let rect; + let stop_animation = noop; + let current; + let mounted; + let dispose; + const selected_slot_template = ctx[69].selected; + const selected_slot = create_slot(selected_slot_template, ctx, ctx[107], get_selected_slot_context); + const selected_slot_or_fallback = selected_slot || fallback_block_5(ctx); + let if_block = !ctx[42] && (ctx[36] === null || ctx[4].length > ctx[36]) && create_if_block_9(ctx); + function dragenter_handler() { + return ctx[91](ctx[117]); + } + return { + key: key_1, + first: null, + c() { + li = element("li"); + if (selected_slot_or_fallback) + selected_slot_or_fallback.c(); + t2 = space(); + if (if_block) + if_block.c(); + attr(li, "class", li_class_value = null_to_empty(ctx[23]) + " svelte-1r2hsto"); + attr(li, "draggable", li_draggable_value = ctx[38] && !ctx[42] && ctx[4].length > 1); + toggle_class(li, "active", ctx[46] === ctx[117]); + this.first = li; + }, + m(target, anchor) { + insert(target, li, anchor); + if (selected_slot_or_fallback) { + selected_slot_or_fallback.m(li, null); + } + append(li, t2); + if (if_block) + if_block.m(li, null); + current = true; + if (!mounted) { + dispose = [ + listen(li, "dragstart", function() { + if (is_function(ctx[57](ctx[117]))) + ctx[57](ctx[117]).apply(this, arguments); + }), + listen(li, "drop", prevent_default(function() { + if (is_function(ctx[56](ctx[117]))) + ctx[56](ctx[117]).apply(this, arguments); + })), + listen(li, "dragenter", dragenter_handler), + listen(li, "dragover", prevent_default(ctx[85])) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (selected_slot) { + if (selected_slot.p && (!current || dirty[0] & 16 | dirty[3] & 16384)) { + update_slot_base(selected_slot, selected_slot_template, ctx, ctx[107], !current ? get_all_dirty_from_scope(ctx[107]) : get_slot_changes(selected_slot_template, ctx[107], dirty, get_selected_slot_changes), get_selected_slot_context); + } + } else { + if (selected_slot_or_fallback && selected_slot_or_fallback.p && (!current || dirty[0] & 16 | dirty[1] & 1)) { + selected_slot_or_fallback.p(ctx, !current ? [-1, -1, -1, -1] : dirty); + } + } + if (!ctx[42] && (ctx[36] === null || ctx[4].length > ctx[36])) { + if (if_block) { + if_block.p(ctx, dirty); + if (dirty[0] & 16 | dirty[1] & 2080) { + transition_in(if_block, 1); + } + } else { + if_block = create_if_block_9(ctx); + if_block.c(); + transition_in(if_block, 1); + if_block.m(li, null); + } + } else if (if_block) { + group_outros(); + transition_out(if_block, 1, 1, () => { + if_block = null; + }); + check_outros(); + } + if (!current || dirty[0] & 8388608 && li_class_value !== (li_class_value = null_to_empty(ctx[23]) + " svelte-1r2hsto")) { + attr(li, "class", li_class_value); + } + if (!current || dirty[0] & 16 | dirty[1] & 2176 && li_draggable_value !== (li_draggable_value = ctx[38] && !ctx[42] && ctx[4].length > 1)) { + attr(li, "draggable", li_draggable_value); + } + if (!current || dirty[0] & 8388624 | dirty[1] & 32768) { + toggle_class(li, "active", ctx[46] === ctx[117]); + } + }, + r() { + rect = li.getBoundingClientRect(); + }, + f() { + fix_position(li); + stop_animation(); + }, + a() { + stop_animation(); + stop_animation = create_animation(li, rect, flip, { duration: 100 }); + }, + i(local) { + if (current) + return; + transition_in(selected_slot_or_fallback, local); + transition_in(if_block); + current = true; + }, + o(local) { + transition_out(selected_slot_or_fallback, local); + transition_out(if_block); + current = false; + }, + d(detaching) { + if (detaching) + detach(li); + if (selected_slot_or_fallback) + selected_slot_or_fallback.d(detaching); + if (if_block) + if_block.d(); + mounted = false; + run_all(dispose); + } + }; +} +function create_if_block_8(ctx) { + let current; + const spinner_slot_template = ctx[69].spinner; + const spinner_slot = create_slot(spinner_slot_template, ctx, ctx[107], get_spinner_slot_context); + const spinner_slot_or_fallback = spinner_slot || fallback_block_3(ctx); + return { + c() { + if (spinner_slot_or_fallback) + spinner_slot_or_fallback.c(); + }, + m(target, anchor) { + if (spinner_slot_or_fallback) { + spinner_slot_or_fallback.m(target, anchor); + } + current = true; + }, + p(ctx2, dirty) { + if (spinner_slot) { + if (spinner_slot.p && (!current || dirty[3] & 16384)) { + update_slot_base(spinner_slot, spinner_slot_template, ctx2, ctx2[107], !current ? get_all_dirty_from_scope(ctx2[107]) : get_slot_changes(spinner_slot_template, ctx2[107], dirty, get_spinner_slot_changes), get_spinner_slot_context); + } + } + }, + i(local) { + if (current) + return; + transition_in(spinner_slot_or_fallback, local); + current = true; + }, + o(local) { + transition_out(spinner_slot_or_fallback, local); + current = false; + }, + d(detaching) { + if (spinner_slot_or_fallback) + spinner_slot_or_fallback.d(detaching); + } + }; +} +function fallback_block_3(ctx) { + let circlespinner; + let current; + circlespinner = new CircleSpinner_default({}); + return { + c() { + create_component(circlespinner.$$.fragment); + }, + m(target, anchor) { + mount_component(circlespinner, target, anchor); + current = true; + }, + i(local) { + if (current) + return; + transition_in(circlespinner.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(circlespinner.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(circlespinner, detaching); + } + }; +} +function create_if_block_5(ctx) { + let t2; + let if_block1_anchor; + let current; + let if_block0 = ctx[25] && (ctx[25] > 1 || ctx[26]) && create_if_block_7(ctx); + let if_block1 = ctx[25] !== 1 && ctx[4].length > 1 && create_if_block_6(ctx); + return { + c() { + if (if_block0) + if_block0.c(); + t2 = space(); + if (if_block1) + if_block1.c(); + if_block1_anchor = empty(); + }, + m(target, anchor) { + if (if_block0) + if_block0.m(target, anchor); + insert(target, t2, anchor); + if (if_block1) + if_block1.m(target, anchor); + insert(target, if_block1_anchor, anchor); + current = true; + }, + p(ctx2, dirty) { + if (ctx2[25] && (ctx2[25] > 1 || ctx2[26])) { + if (if_block0) { + if_block0.p(ctx2, dirty); + if (dirty[0] & 100663296) { + transition_in(if_block0, 1); + } + } else { + if_block0 = create_if_block_7(ctx2); + if_block0.c(); + transition_in(if_block0, 1); + if_block0.m(t2.parentNode, t2); + } + } else if (if_block0) { + group_outros(); + transition_out(if_block0, 1, 1, () => { + if_block0 = null; + }); + check_outros(); + } + if (ctx2[25] !== 1 && ctx2[4].length > 1) { + if (if_block1) { + if_block1.p(ctx2, dirty); + if (dirty[0] & 33554448) { + transition_in(if_block1, 1); + } + } else { + if_block1 = create_if_block_6(ctx2); + if_block1.c(); + transition_in(if_block1, 1); + if_block1.m(if_block1_anchor.parentNode, if_block1_anchor); + } + } else if (if_block1) { + group_outros(); + transition_out(if_block1, 1, 1, () => { + if_block1 = null; + }); + check_outros(); + } + }, + i(local) { + if (current) + return; + transition_in(if_block0); + transition_in(if_block1); + current = true; + }, + o(local) { + transition_out(if_block0); + transition_out(if_block1); + current = false; + }, + d(detaching) { + if (if_block0) + if_block0.d(detaching); + if (detaching) + detach(t2); + if (if_block1) + if_block1.d(detaching); + if (detaching) + detach(if_block1_anchor); + } + }; +} +function create_if_block_4(ctx) { + let current; + const disabled_icon_slot_template = ctx[69]["disabled-icon"]; + const disabled_icon_slot = create_slot(disabled_icon_slot_template, ctx, ctx[107], get_disabled_icon_slot_context); + const disabled_icon_slot_or_fallback = disabled_icon_slot || fallback_block_1(ctx); + return { + c() { + if (disabled_icon_slot_or_fallback) + disabled_icon_slot_or_fallback.c(); + }, + m(target, anchor) { + if (disabled_icon_slot_or_fallback) { + disabled_icon_slot_or_fallback.m(target, anchor); + } + current = true; + }, + p(ctx2, dirty) { + if (disabled_icon_slot) { + if (disabled_icon_slot.p && (!current || dirty[3] & 16384)) { + update_slot_base(disabled_icon_slot, disabled_icon_slot_template, ctx2, ctx2[107], !current ? get_all_dirty_from_scope(ctx2[107]) : get_slot_changes(disabled_icon_slot_template, ctx2[107], dirty, get_disabled_icon_slot_changes), get_disabled_icon_slot_context); + } + } + }, + i(local) { + if (current) + return; + transition_in(disabled_icon_slot_or_fallback, local); + current = true; + }, + o(local) { + transition_out(disabled_icon_slot_or_fallback, local); + current = false; + }, + d(detaching) { + if (disabled_icon_slot_or_fallback) + disabled_icon_slot_or_fallback.d(detaching); + } + }; +} +function create_if_block_7(ctx) { + let wiggle_1; + let updating_wiggle; + let current; + function wiggle_1_wiggle_binding(value) { + ctx[94](value); + } + let wiggle_1_props = { + angle: 20, + $$slots: { default: [create_default_slot] }, + $$scope: { ctx } + }; + if (ctx[43] !== void 0) { + wiggle_1_props.wiggle = ctx[43]; + } + wiggle_1 = new Wiggle_default({ props: wiggle_1_props }); + binding_callbacks.push(() => bind(wiggle_1, "wiggle", wiggle_1_wiggle_binding)); + return { + c() { + create_component(wiggle_1.$$.fragment); + }, + m(target, anchor) { + mount_component(wiggle_1, target, anchor); + current = true; + }, + p(ctx2, dirty) { + const wiggle_1_changes = {}; + if (dirty[0] & 234881040 | dirty[3] & 16384) { + wiggle_1_changes.$$scope = { dirty, ctx: ctx2 }; + } + if (!updating_wiggle && dirty[1] & 4096) { + updating_wiggle = true; + wiggle_1_changes.wiggle = ctx2[43]; + add_flush_callback(() => updating_wiggle = false); + } + wiggle_1.$set(wiggle_1_changes); + }, + i(local) { + if (current) + return; + transition_in(wiggle_1.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(wiggle_1.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(wiggle_1, detaching); + } + }; +} +function create_default_slot(ctx) { + var _a2; + let span; + let t_value = ((_a2 = ctx[26]) == null ? void 0 : _a2.call(ctx, ctx[4].length, ctx[25])) + ""; + let t2; + let span_class_value; + return { + c() { + span = element("span"); + t2 = text(t_value); + attr(span, "class", span_class_value = "max-select-msg " + ctx[27] + " svelte-1r2hsto"); + }, + m(target, anchor) { + insert(target, span, anchor); + append(span, t2); + }, + p(ctx2, dirty) { + var _a3; + if (dirty[0] & 100663312 && t_value !== (t_value = ((_a3 = ctx2[26]) == null ? void 0 : _a3.call(ctx2, ctx2[4].length, ctx2[25])) + "")) + set_data(t2, t_value); + if (dirty[0] & 134217728 && span_class_value !== (span_class_value = "max-select-msg " + ctx2[27] + " svelte-1r2hsto")) { + attr(span, "class", span_class_value); + } + }, + d(detaching) { + if (detaching) + detach(span); + } + }; +} +function create_if_block_6(ctx) { + let button; + let current; + let mounted; + let dispose; + const remove_icon_slot_template = ctx[69]["remove-icon"]; + const remove_icon_slot = create_slot(remove_icon_slot_template, ctx, ctx[107], get_remove_icon_slot_context_1); + const remove_icon_slot_or_fallback = remove_icon_slot || fallback_block_2(ctx); + return { + c() { + button = element("button"); + if (remove_icon_slot_or_fallback) + remove_icon_slot_or_fallback.c(); + attr(button, "type", "button"); + attr(button, "class", "remove remove-all svelte-1r2hsto"); + attr(button, "title", ctx[34]); + }, + m(target, anchor) { + insert(target, button, anchor); + if (remove_icon_slot_or_fallback) { + remove_icon_slot_or_fallback.m(button, null); + } + current = true; + if (!mounted) { + dispose = [ + listen(button, "mouseup", stop_propagation(ctx[53])), + listen(button, "keydown", ctx[54](ctx[53])) + ]; + mounted = true; + } + }, + p(ctx2, dirty) { + if (remove_icon_slot) { + if (remove_icon_slot.p && (!current || dirty[3] & 16384)) { + update_slot_base(remove_icon_slot, remove_icon_slot_template, ctx2, ctx2[107], !current ? get_all_dirty_from_scope(ctx2[107]) : get_slot_changes(remove_icon_slot_template, ctx2[107], dirty, get_remove_icon_slot_changes_1), get_remove_icon_slot_context_1); + } + } + if (!current || dirty[1] & 8) { + attr(button, "title", ctx2[34]); + } + }, + i(local) { + if (current) + return; + transition_in(remove_icon_slot_or_fallback, local); + current = true; + }, + o(local) { + transition_out(remove_icon_slot_or_fallback, local); + current = false; + }, + d(detaching) { + if (detaching) + detach(button); + if (remove_icon_slot_or_fallback) + remove_icon_slot_or_fallback.d(detaching); + mounted = false; + run_all(dispose); + } + }; +} +function fallback_block_2(ctx) { + let crossicon; + let current; + crossicon = new Cross_default({ props: { width: "15px" } }); + return { + c() { + create_component(crossicon.$$.fragment); + }, + m(target, anchor) { + mount_component(crossicon, target, anchor); + current = true; + }, + p: noop, + i(local) { + if (current) + return; + transition_in(crossicon.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(crossicon.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(crossicon, detaching); + } + }; +} +function fallback_block_1(ctx) { + let disabledicon; + let current; + disabledicon = new Disabled_default({ + props: { + width: "14pt", + style: "margin: 0 2pt;", + "data-name": "disabled-icon" + } + }); + return { + c() { + create_component(disabledicon.$$.fragment); + }, + m(target, anchor) { + mount_component(disabledicon, target, anchor); + current = true; + }, + p: noop, + i(local) { + if (current) + return; + transition_in(disabledicon.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(disabledicon.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(disabledicon, detaching); + } + }; +} +function create_if_block(ctx) { + let ul; + let ul_class_value; + let current; + let each_value = ctx[1]; + let each_blocks = []; + for (let i2 = 0; i2 < each_value.length; i2 += 1) { + each_blocks[i2] = create_each_block(get_each_context(ctx, each_value, i2)); + } + const out = (i2) => transition_out(each_blocks[i2], 1, 1, () => { + each_blocks[i2] = null; + }); + let each_1_else = null; + if (!each_value.length) { + each_1_else = create_else_block_1(get_else_ctx(ctx)); + } + return { + c() { + ul = element("ul"); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].c(); + } + if (each_1_else) { + each_1_else.c(); + } + attr(ul, "class", ul_class_value = "options " + ctx[39] + " svelte-1r2hsto"); + toggle_class(ul, "hidden", !ctx[8]); + }, + m(target, anchor) { + insert(target, ul, anchor); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + if (each_blocks[i2]) { + each_blocks[i2].m(ul, null); + } + } + if (each_1_else) { + each_1_else.m(ul, null); + } + ctx[105](ul); + current = true; + }, + p(ctx2, dirty) { + if (dirty[0] & 543394843 | dirty[1] & 402433 | dirty[3] & 16384) { + each_value = ctx2[1]; + let i2; + for (i2 = 0; i2 < each_value.length; i2 += 1) { + const child_ctx = get_each_context(ctx2, each_value, i2); + if (each_blocks[i2]) { + each_blocks[i2].p(child_ctx, dirty); + transition_in(each_blocks[i2], 1); + } else { + each_blocks[i2] = create_each_block(child_ctx); + each_blocks[i2].c(); + transition_in(each_blocks[i2], 1); + each_blocks[i2].m(ul, null); + } + } + group_outros(); + for (i2 = each_value.length; i2 < each_blocks.length; i2 += 1) { + out(i2); + } + check_outros(); + if (!each_value.length && each_1_else) { + each_1_else.p(get_else_ctx(ctx2), dirty); + } else if (!each_value.length) { + each_1_else = create_else_block_1(get_else_ctx(ctx2)); + each_1_else.c(); + each_1_else.m(ul, null); + } else if (each_1_else) { + each_1_else.d(1); + each_1_else = null; + } + } + if (!current || dirty[1] & 256 && ul_class_value !== (ul_class_value = "options " + ctx2[39] + " svelte-1r2hsto")) { + attr(ul, "class", ul_class_value); + } + if (!current || dirty[0] & 256 | dirty[1] & 256) { + toggle_class(ul, "hidden", !ctx2[8]); + } + }, + i(local) { + if (current) + return; + for (let i2 = 0; i2 < each_value.length; i2 += 1) { + transition_in(each_blocks[i2]); + } + current = true; + }, + o(local) { + each_blocks = each_blocks.filter(Boolean_1); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + transition_out(each_blocks[i2]); + } + current = false; + }, + d(detaching) { + if (detaching) + detach(ul); + destroy_each(each_blocks, detaching); + if (each_1_else) + each_1_else.d(); + ctx[105](null); + } + }; +} +function create_else_block_1(ctx) { + let t2; + function select_block_type_3(ctx2, dirty) { + if (ctx2[11] && ctx2[3] && ctx2[119]) + return create_if_block_2; + if (ctx2[29]) + return create_if_block_3; + } + let current_block_type = select_block_type_3(ctx, [-1, -1, -1, -1]); + let if_block = current_block_type && current_block_type(ctx); + return { + c() { + if (if_block) + if_block.c(); + t2 = space(); + }, + m(target, anchor) { + if (if_block) + if_block.m(target, anchor); + insert(target, t2, anchor); + }, + p(ctx2, dirty) { + if (current_block_type === (current_block_type = select_block_type_3(ctx2, dirty)) && if_block) { + if_block.p(ctx2, dirty); + } else { + if (if_block) + if_block.d(1); + if_block = current_block_type && current_block_type(ctx2); + if (if_block) { + if_block.c(); + if_block.m(t2.parentNode, t2); + } + } + }, + d(detaching) { + if (if_block) { + if_block.d(detaching); + } + if (detaching) + detach(t2); + } + }; +} +function create_if_block_3(ctx) { + let span; + let t2; + return { + c() { + span = element("span"); + t2 = text(ctx[29]); + attr(span, "class", "user-msg svelte-1r2hsto"); + }, + m(target, anchor) { + insert(target, span, anchor); + append(span, t2); + }, + p(ctx2, dirty) { + if (dirty[0] & 536870912) + set_data(t2, ctx2[29]); + }, + d(detaching) { + if (detaching) + detach(span); + } + }; +} +function create_if_block_2(ctx) { + let li; + let t_value = ctx[119] + ""; + let t2; + let mounted; + let dispose; + return { + c() { + li = element("li"); + t2 = text(t_value); + attr(li, "title", ctx[10]); + attr(li, "class", "user-msg svelte-1r2hsto"); + toggle_class(li, "active", ctx[44]); + }, + m(target, anchor) { + insert(target, li, anchor); + append(li, t2); + if (!mounted) { + dispose = [ + listen(li, "mousedown", stop_propagation(ctx[71])), + listen(li, "mouseup", stop_propagation(ctx[100])), + listen(li, "mouseover", ctx[101]), + listen(li, "focus", ctx[102]), + listen(li, "mouseout", ctx[103]), + listen(li, "blur", ctx[104]) + ]; + mounted = true; + } + }, + p(ctx2, dirty) { + if (dirty[0] & 230424 && t_value !== (t_value = ctx2[119] + "")) + set_data(t2, t_value); + if (dirty[0] & 1024) { + attr(li, "title", ctx2[10]); + } + if (dirty[1] & 8192) { + toggle_class(li, "active", ctx2[44]); + } + }, + d(detaching) { + if (detaching) + detach(li); + mounted = false; + run_all(dispose); + } + }; +} +function create_else_block(ctx) { + let t_value = ctx[41](ctx[110]) + ""; + let t2; + return { + c() { + t2 = text(t_value); + }, + m(target, anchor) { + insert(target, t2, anchor); + }, + p(ctx2, dirty) { + if (dirty[0] & 2 && t_value !== (t_value = ctx2[41](ctx2[110]) + "")) + set_data(t2, t_value); + }, + d(detaching) { + if (detaching) + detach(t2); + } + }; +} +function create_if_block_1(ctx) { + let html_tag; + let raw_value = ctx[41](ctx[110]) + ""; + let html_anchor; + return { + c() { + html_tag = new HtmlTag(false); + html_anchor = empty(); + html_tag.a = html_anchor; + }, + m(target, anchor) { + html_tag.m(raw_value, target, anchor); + insert(target, html_anchor, anchor); + }, + p(ctx2, dirty) { + if (dirty[0] & 2 && raw_value !== (raw_value = ctx2[41](ctx2[110]) + "")) + html_tag.p(raw_value); + }, + d(detaching) { + if (detaching) + detach(html_anchor); + if (detaching) + html_tag.d(); + } + }; +} +function fallback_block(ctx) { + let if_block_anchor; + function select_block_type_2(ctx2, dirty) { + if (ctx2[31]) + return create_if_block_1; + return create_else_block; + } + let current_block_type = select_block_type_2(ctx, [-1, -1, -1, -1]); + let if_block = current_block_type(ctx); + return { + c() { + if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + }, + p(ctx2, dirty) { + if (current_block_type === (current_block_type = select_block_type_2(ctx2, dirty)) && if_block) { + if_block.p(ctx2, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx2); + if (if_block) { + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } + }, + d(detaching) { + if_block.d(detaching); + if (detaching) + detach(if_block_anchor); + } + }; +} +function create_each_block(ctx) { + let li; + let t2; + let li_title_value; + let li_class_value; + let current; + let mounted; + let dispose; + const option_slot_template = ctx[69].option; + const option_slot = create_slot(option_slot_template, ctx, ctx[107], get_option_slot_context); + const option_slot_or_fallback = option_slot || fallback_block(ctx); + function mouseup_handler_1(...args) { + return ctx[95](ctx[42], ctx[110], ...args); + } + function mouseover_handler() { + return ctx[96](ctx[42], ctx[117]); + } + function focus_handler_1() { + return ctx[97](ctx[42], ctx[117]); + } + return { + c() { + li = element("li"); + if (option_slot_or_fallback) + option_slot_or_fallback.c(); + t2 = space(); + attr(li, "title", li_title_value = ctx[42] ? ctx[114] : ctx[48](ctx[111]) && ctx[113] || ctx[112]); + attr(li, "class", li_class_value = ctx[22] + " " + (ctx[115] ? ctx[21] : ``) + " svelte-1r2hsto"); + toggle_class(li, "selected", ctx[48](ctx[111])); + toggle_class(li, "active", ctx[115]); + toggle_class(li, "disabled", ctx[42]); + }, + m(target, anchor) { + insert(target, li, anchor); + if (option_slot_or_fallback) { + option_slot_or_fallback.m(li, null); + } + append(li, t2); + current = true; + if (!mounted) { + dispose = [ + listen(li, "mousedown", stop_propagation(ctx[70])), + listen(li, "mouseup", stop_propagation(mouseup_handler_1)), + listen(li, "mouseover", mouseover_handler), + listen(li, "focus", focus_handler_1), + listen(li, "mouseout", ctx[98]), + listen(li, "blur", ctx[99]) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (option_slot) { + if (option_slot.p && (!current || dirty[0] & 2 | dirty[3] & 16384)) { + update_slot_base(option_slot, option_slot_template, ctx, ctx[107], !current ? get_all_dirty_from_scope(ctx[107]) : get_slot_changes(option_slot_template, ctx[107], dirty, get_option_slot_changes), get_option_slot_context); + } + } else { + if (option_slot_or_fallback && option_slot_or_fallback.p && (!current || dirty[0] & 2 | dirty[1] & 1)) { + option_slot_or_fallback.p(ctx, !current ? [-1, -1, -1, -1] : dirty); + } + } + if (!current || dirty[0] & 2 | dirty[1] & 131072 && li_title_value !== (li_title_value = ctx[42] ? ctx[114] : ctx[48](ctx[111]) && ctx[113] || ctx[112])) { + attr(li, "title", li_title_value); + } + if (!current || dirty[0] & 6291457 && li_class_value !== (li_class_value = ctx[22] + " " + (ctx[115] ? ctx[21] : ``) + " svelte-1r2hsto")) { + attr(li, "class", li_class_value); + } + if (!current || dirty[0] & 6291459 | dirty[1] & 131072) { + toggle_class(li, "selected", ctx[48](ctx[111])); + } + if (!current || dirty[0] & 6291457) { + toggle_class(li, "active", ctx[115]); + } + if (!current || dirty[0] & 6291459) { + toggle_class(li, "disabled", ctx[42]); + } + }, + i(local) { + if (current) + return; + transition_in(option_slot_or_fallback, local); + current = true; + }, + o(local) { + transition_out(option_slot_or_fallback, local); + current = false; + }, + d(detaching) { + if (detaching) + detach(li); + if (option_slot_or_fallback) + option_slot_or_fallback.d(detaching); + mounted = false; + run_all(dispose); + } + }; +} +function create_fragment6(ctx) { + var _a2; + let div; + let input0; + let input0_required_value; + let input0_value_value; + let t0; + let t1; + let ul; + let each_blocks = []; + let each_1_lookup = /* @__PURE__ */ new Map(); + let t2; + let input1; + let input1_class_value; + let input1_placeholder_value; + let input1_aria_invalid_value; + let ul_class_value; + let t3; + let t4; + let current_block_type_index; + let if_block1; + let t5; + let div_class_value; + let div_title_value; + let current; + let mounted; + let dispose; + add_render_callback(ctx[86]); + const expand_icon_slot_template = ctx[69]["expand-icon"]; + const expand_icon_slot = create_slot(expand_icon_slot_template, ctx, ctx[107], get_expand_icon_slot_context); + const expand_icon_slot_or_fallback = expand_icon_slot || fallback_block_6(ctx); + let each_value_1 = ctx[4]; + const get_key = (ctx2) => ctx2[110]; + for (let i2 = 0; i2 < each_value_1.length; i2 += 1) { + let child_ctx = get_each_context_1(ctx, each_value_1, i2); + let key = get_key(child_ctx); + each_1_lookup.set(key, each_blocks[i2] = create_each_block_1(key, child_ctx)); + } + let if_block0 = ctx[24] && create_if_block_8(ctx); + const if_block_creators = [create_if_block_4, create_if_block_5]; + const if_blocks = []; + function select_block_type_1(ctx2, dirty) { + if (ctx2[42]) + return 0; + if (ctx2[4].length > 0) + return 1; + return -1; + } + if (~(current_block_type_index = select_block_type_1(ctx, [-1, -1, -1, -1]))) { + if_block1 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + } + let if_block2 = (ctx[3] && ctx[29] || ((_a2 = ctx[2]) == null ? void 0 : _a2.length) > 0) && create_if_block(ctx); + return { + c() { + div = element("div"); + input0 = element("input"); + t0 = space(); + if (expand_icon_slot_or_fallback) + expand_icon_slot_or_fallback.c(); + t1 = space(); + ul = element("ul"); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].c(); + } + t2 = space(); + input1 = element("input"); + t3 = space(); + if (if_block0) + if_block0.c(); + t4 = space(); + if (if_block1) + if_block1.c(); + t5 = space(); + if (if_block2) + if_block2.c(); + attr(input0, "name", ctx[28]); + input0.required = input0_required_value = Boolean(ctx[37]); + input0.value = input0_value_value = ctx[4].length >= Number(ctx[37]) ? JSON.stringify(ctx[4]) : null; + attr(input0, "tabindex", "-1"); + attr(input0, "aria-hidden", "true"); + attr(input0, "aria-label", "ignore this, used only to prevent form submission if select is required but empty"); + attr(input0, "class", "form-control svelte-1r2hsto"); + attr(input1, "class", input1_class_value = null_to_empty(ctx[19]) + " svelte-1r2hsto"); + attr(input1, "id", ctx[18]); + input1.disabled = ctx[42]; + attr(input1, "autocomplete", ctx[12]); + attr(input1, "inputmode", ctx[20]); + attr(input1, "pattern", ctx[32]); + attr(input1, "placeholder", input1_placeholder_value = ctx[4].length == 0 ? ctx[33] : null); + attr(input1, "aria-invalid", input1_aria_invalid_value = ctx[7] ? `true` : null); + attr(input1, "ondrop", "return false"); + attr(ul, "class", ul_class_value = "selected " + ctx[40] + " svelte-1r2hsto"); + attr(ul, "aria-label", "selected options"); + attr(div, "class", div_class_value = "multiselect " + ctx[30] + " svelte-1r2hsto"); + attr(div, "title", div_title_value = ctx[42] ? ctx[14] : null); + attr(div, "data-id", ctx[18]); + toggle_class(div, "disabled", ctx[42]); + toggle_class(div, "single", ctx[25] === 1); + toggle_class(div, "open", ctx[8]); + toggle_class(div, "invalid", ctx[7]); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, input0); + ctx[87](input0); + append(div, t0); + if (expand_icon_slot_or_fallback) { + expand_icon_slot_or_fallback.m(div, null); + } + append(div, t1); + append(div, ul); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + if (each_blocks[i2]) { + each_blocks[i2].m(ul, null); + } + } + append(ul, t2); + append(ul, input1); + ctx[92](input1); + set_input_value(input1, ctx[3]); + append(div, t3); + if (if_block0) + if_block0.m(div, null); + append(div, t4); + if (~current_block_type_index) { + if_blocks[current_block_type_index].m(div, null); + } + append(div, t5); + if (if_block2) + if_block2.m(div, null); + ctx[106](div); + current = true; + if (!mounted) { + dispose = [ + listen(window, "click", ctx[55]), + listen(window, "touchstart", ctx[55]), + listen(window, "resize", ctx[86]), + listen(input0, "invalid", ctx[88]), + listen(input1, "input", ctx[93]), + listen(input1, "mouseup", self2(stop_propagation(ctx[51]))), + listen(input1, "keydown", stop_propagation(ctx[52])), + listen(input1, "focus", ctx[72]), + listen(input1, "focus", ctx[51]), + listen(input1, "input", ctx[58]), + listen(input1, "blur", ctx[73]), + listen(input1, "change", ctx[74]), + listen(input1, "click", ctx[75]), + listen(input1, "keydown", ctx[76]), + listen(input1, "keyup", ctx[77]), + listen(input1, "mousedown", ctx[78]), + listen(input1, "mouseenter", ctx[79]), + listen(input1, "mouseleave", ctx[80]), + listen(input1, "touchcancel", ctx[81]), + listen(input1, "touchend", ctx[82]), + listen(input1, "touchmove", ctx[83]), + listen(input1, "touchstart", ctx[84]), + listen(div, "mouseup", stop_propagation(ctx[51])) + ]; + mounted = true; + } + }, + p(ctx2, dirty) { + var _a3; + if (!current || dirty[0] & 268435456) { + attr(input0, "name", ctx2[28]); + } + if (!current || dirty[1] & 64 && input0_required_value !== (input0_required_value = Boolean(ctx2[37]))) { + input0.required = input0_required_value; + } + if (!current || dirty[0] & 16 | dirty[1] & 64 && input0_value_value !== (input0_value_value = ctx2[4].length >= Number(ctx2[37]) ? JSON.stringify(ctx2[4]) : null) && input0.value !== input0_value_value) { + input0.value = input0_value_value; + } + if (expand_icon_slot) { + if (expand_icon_slot.p && (!current || dirty[0] & 256 | dirty[3] & 16384)) { + update_slot_base(expand_icon_slot, expand_icon_slot_template, ctx2, ctx2[107], !current ? get_all_dirty_from_scope(ctx2[107]) : get_slot_changes(expand_icon_slot_template, ctx2[107], dirty, get_expand_icon_slot_changes), get_expand_icon_slot_context); + } + } + if (dirty[0] & 8388624 | dirty[1] & 109612209 | dirty[3] & 16384) { + each_value_1 = ctx2[4]; + group_outros(); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) + each_blocks[i2].r(); + each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx2, each_value_1, each_1_lookup, ul, fix_and_outro_and_destroy_block, create_each_block_1, t2, get_each_context_1); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) + each_blocks[i2].a(); + check_outros(); + } + if (!current || dirty[0] & 524288 && input1_class_value !== (input1_class_value = null_to_empty(ctx2[19]) + " svelte-1r2hsto")) { + attr(input1, "class", input1_class_value); + } + if (!current || dirty[0] & 262144) { + attr(input1, "id", ctx2[18]); + } + if (!current || dirty[1] & 2048) { + input1.disabled = ctx2[42]; + } + if (!current || dirty[0] & 4096) { + attr(input1, "autocomplete", ctx2[12]); + } + if (!current || dirty[0] & 1048576) { + attr(input1, "inputmode", ctx2[20]); + } + if (!current || dirty[1] & 2) { + attr(input1, "pattern", ctx2[32]); + } + if (!current || dirty[0] & 16 | dirty[1] & 4 && input1_placeholder_value !== (input1_placeholder_value = ctx2[4].length == 0 ? ctx2[33] : null)) { + attr(input1, "placeholder", input1_placeholder_value); + } + if (!current || dirty[0] & 128 && input1_aria_invalid_value !== (input1_aria_invalid_value = ctx2[7] ? `true` : null)) { + attr(input1, "aria-invalid", input1_aria_invalid_value); + } + if (dirty[0] & 8 && input1.value !== ctx2[3]) { + set_input_value(input1, ctx2[3]); + } + if (!current || dirty[1] & 512 && ul_class_value !== (ul_class_value = "selected " + ctx2[40] + " svelte-1r2hsto")) { + attr(ul, "class", ul_class_value); + } + if (ctx2[24]) { + if (if_block0) { + if_block0.p(ctx2, dirty); + if (dirty[0] & 16777216) { + transition_in(if_block0, 1); + } + } else { + if_block0 = create_if_block_8(ctx2); + if_block0.c(); + transition_in(if_block0, 1); + if_block0.m(div, t4); + } + } else if (if_block0) { + group_outros(); + transition_out(if_block0, 1, 1, () => { + if_block0 = null; + }); + check_outros(); + } + let previous_block_index = current_block_type_index; + current_block_type_index = select_block_type_1(ctx2, dirty); + if (current_block_type_index === previous_block_index) { + if (~current_block_type_index) { + if_blocks[current_block_type_index].p(ctx2, dirty); + } + } else { + if (if_block1) { + group_outros(); + transition_out(if_blocks[previous_block_index], 1, 1, () => { + if_blocks[previous_block_index] = null; + }); + check_outros(); + } + if (~current_block_type_index) { + if_block1 = if_blocks[current_block_type_index]; + if (!if_block1) { + if_block1 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2); + if_block1.c(); + } else { + if_block1.p(ctx2, dirty); + } + transition_in(if_block1, 1); + if_block1.m(div, t5); + } else { + if_block1 = null; + } + } + if (ctx2[3] && ctx2[29] || ((_a3 = ctx2[2]) == null ? void 0 : _a3.length) > 0) { + if (if_block2) { + if_block2.p(ctx2, dirty); + if (dirty[0] & 536870924) { + transition_in(if_block2, 1); + } + } else { + if_block2 = create_if_block(ctx2); + if_block2.c(); + transition_in(if_block2, 1); + if_block2.m(div, null); + } + } else if (if_block2) { + group_outros(); + transition_out(if_block2, 1, 1, () => { + if_block2 = null; + }); + check_outros(); + } + if (!current || dirty[0] & 1073741824 && div_class_value !== (div_class_value = "multiselect " + ctx2[30] + " svelte-1r2hsto")) { + attr(div, "class", div_class_value); + } + if (!current || dirty[0] & 16384 | dirty[1] & 2048 && div_title_value !== (div_title_value = ctx2[42] ? ctx2[14] : null)) { + attr(div, "title", div_title_value); + } + if (!current || dirty[0] & 262144) { + attr(div, "data-id", ctx2[18]); + } + if (!current || dirty[0] & 1073741824 | dirty[1] & 2048) { + toggle_class(div, "disabled", ctx2[42]); + } + if (!current || dirty[0] & 1107296256) { + toggle_class(div, "single", ctx2[25] === 1); + } + if (!current || dirty[0] & 1073742080) { + toggle_class(div, "open", ctx2[8]); + } + if (!current || dirty[0] & 1073741952) { + toggle_class(div, "invalid", ctx2[7]); + } + }, + i(local) { + if (current) + return; + transition_in(expand_icon_slot_or_fallback, local); + for (let i2 = 0; i2 < each_value_1.length; i2 += 1) { + transition_in(each_blocks[i2]); + } + transition_in(if_block0); + transition_in(if_block1); + transition_in(if_block2); + current = true; + }, + o(local) { + transition_out(expand_icon_slot_or_fallback, local); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + transition_out(each_blocks[i2]); + } + transition_out(if_block0); + transition_out(if_block1); + transition_out(if_block2); + current = false; + }, + d(detaching) { + if (detaching) + detach(div); + ctx[87](null); + if (expand_icon_slot_or_fallback) + expand_icon_slot_or_fallback.d(detaching); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].d(); + } + ctx[92](null); + if (if_block0) + if_block0.d(); + if (~current_block_type_index) { + if_blocks[current_block_type_index].d(); + } + if (if_block2) + if_block2.d(); + ctx[106](null); + mounted = false; + run_all(dispose); + } + }; +} +function instance6($$self, $$props, $$invalidate) { + var _a2; + let is_selected; + let { $$slots: slots = {}, $$scope } = $$props; + let { activeIndex = null } = $$props; + let { activeOption = null } = $$props; + let { createOptionMsg = `Create this option...` } = $$props; + let { allowUserOptions = false } = $$props; + let { allowEmpty = false } = $$props; + let { autocomplete = `off` } = $$props; + let { autoScroll = true } = $$props; + let { breakpoint = 800 } = $$props; + let { defaultDisabledTitle = `This option is disabled` } = $$props; + let { disabled = false } = $$props; + let { disabledInputTitle = `This input is disabled` } = $$props; + let { duplicateFunc = (op1, op2) => `${get_label(op1)}`.toLowerCase() === `${get_label(op2)}`.toLowerCase() } = $$props; + let { duplicateOptionMsg = `This option is already selected` } = $$props; + let { duplicates = false } = $$props; + let { filterFunc = (op, searchText2) => { + if (!searchText2) + return true; + return `${get_label(op)}`.toLowerCase().includes(searchText2.toLowerCase()); + } } = $$props; + let { focusInputOnSelect = `desktop` } = $$props; + let { form_input = null } = $$props; + let { highlightMatches = true } = $$props; + let { id = null } = $$props; + let { input = null } = $$props; + let { inputClass = `` } = $$props; + let { inputmode = null } = $$props; + let { invalid = false } = $$props; + let { liActiveOptionClass = `` } = $$props; + let { liOptionClass = `` } = $$props; + let { liSelectedClass = `` } = $$props; + let { loading = false } = $$props; + let { matchingOptions = [] } = $$props; + let { maxSelect = null } = $$props; + let { maxSelectMsg = (current, max) => max > 1 ? `${current}/${max}` : `` } = $$props; + let { maxSelectMsgClass = `` } = $$props; + let { name = null } = $$props; + let { noMatchingOptionsMsg = `No matching options` } = $$props; + let { open = false } = $$props; + let { options } = $$props; + let { outerDiv = null } = $$props; + let { outerDivClass = `` } = $$props; + let { parseLabelsAsHtml = false } = $$props; + let { pattern = null } = $$props; + let { placeholder = null } = $$props; + let { removeAllTitle = `Remove all` } = $$props; + let { removeBtnTitle = `Remove` } = $$props; + let { minSelect = null } = $$props; + let { required = false } = $$props; + let { resetFilterOnAdd = true } = $$props; + let { searchText = `` } = $$props; + let { selected = (_a2 = options == null ? void 0 : options.filter((op) => op instanceof Object && (op == null ? void 0 : op.preselected)).slice(0, maxSelect != null ? maxSelect : void 0)) != null ? _a2 : [] } = $$props; + let { sortSelected = false } = $$props; + let { selectedOptionsDraggable = !sortSelected } = $$props; + let { ulOptionsClass = `` } = $$props; + let { ulSelectedClass = `` } = $$props; + let { value = null } = $$props; + const get_label = (op) => { + if (op instanceof Object) { + if (op.label === void 0) { + console.error(`MultiSelect option ${JSON.stringify(op)} is an object but has no label key`); + } + return op.label; + } + return op; + }; + let wiggle = false; + if (!((options == null ? void 0 : options.length) > 0)) { + if (allowUserOptions || loading || disabled || allowEmpty) { + options = []; + } else { + console.error(`MultiSelect received no options`); + } + } + if (maxSelect !== null && maxSelect < 1) { + console.error(`MultiSelect's maxSelect must be null or positive integer, got ${maxSelect}`); + } + if (!Array.isArray(selected)) { + console.error(`MultiSelect's selected prop should always be an array, got ${selected}`); + } + if (maxSelect && typeof required === `number` && required > maxSelect) { + console.error(`MultiSelect maxSelect=${maxSelect} < required=${required}, makes it impossible for users to submit a valid form`); + } + if (parseLabelsAsHtml && allowUserOptions) { + console.warn(`Don't combine parseLabelsAsHtml and allowUserOptions. It's susceptible to XSS attacks!`); + } + if (sortSelected && selectedOptionsDraggable) { + console.warn(`MultiSelect's sortSelected and selectedOptionsDraggable should not be combined as any user re-orderings of selected options will be undone by sortSelected on component re-renders.`); + } + if (allowUserOptions && !createOptionMsg && createOptionMsg !== null) { + console.error(`MultiSelect has allowUserOptions=${allowUserOptions} but createOptionMsg=${createOptionMsg} is falsy. This prevents the "Add option" from showing up, resulting in a confusing user experience.`); + } + const dispatch = createEventDispatcher(); + let option_msg_is_active = false; + let window_width; + if (activeIndex !== null && !matchingOptions[activeIndex]) { + throw `Run time error, activeIndex=${activeIndex} is out of bounds, matchingOptions.length=${matchingOptions.length}`; + } + function add(option, event) { + if (maxSelect && maxSelect > 1 && selected.length >= maxSelect) + $$invalidate(43, wiggle = true); + if (!isNaN(Number(option)) && typeof selected.map(get_label)[0] === `number`) { + option = Number(option); + } + const is_duplicate = selected.some((op) => duplicateFunc(op, option)); + if ((maxSelect === null || maxSelect === 1 || selected.length < maxSelect) && (duplicates || !is_duplicate)) { + if (!options.includes(option) && [true, `append`].includes(allowUserOptions) && searchText.length > 0) { + if (typeof options[0] === `object`) { + option = { label: searchText }; + } else { + if ([`number`, `undefined`].includes(typeof options[0]) && !isNaN(Number(searchText))) { + option = Number(searchText); + } else { + option = searchText; + } + dispatch(`create`, { option }); + } + if (allowUserOptions === `append`) + $$invalidate(2, options = [...options, option]); + } + if (resetFilterOnAdd) + $$invalidate(3, searchText = ``); + if ([``, void 0, null].includes(option)) { + console.error(`MultiSelect: encountered falsy option ${option}`); + return; + } + if (maxSelect === 1) { + $$invalidate(4, selected = [option]); + } else { + $$invalidate(4, selected = [...selected, option]); + if (sortSelected === true) { + $$invalidate(4, selected = selected.sort((op1, op2) => { + const [label1, label2] = [get_label(op1), get_label(op2)]; + return `${label1}`.localeCompare(`${label2}`); + })); + } else if (typeof sortSelected === `function`) { + $$invalidate(4, selected = selected.sort(sortSelected)); + } + } + if (selected.length === maxSelect) + close_dropdown(event); + else if (focusInputOnSelect === true || focusInputOnSelect === `desktop` && window_width > breakpoint) { + input == null ? void 0 : input.focus(); + } + dispatch(`add`, { option }); + dispatch(`change`, { option, type: `add` }); + $$invalidate(7, invalid = false); + form_input == null ? void 0 : form_input.setCustomValidity(``); + } + } + function remove(to_remove) { + if (selected.length === 0) + return; + const idx = selected.findIndex((op) => JSON.stringify(op) === JSON.stringify(to_remove)); + let [option] = selected.splice(idx, 1); + if (option === void 0 && allowUserOptions) { + const other_ops_type = typeof options[0]; + option = other_ops_type ? { label: to_remove } : to_remove; + } + if (option === void 0) { + return console.error(`Multiselect can't remove selected option ${JSON.stringify(to_remove)}, not found in selected list`); + } + $$invalidate(4, selected = [...selected]); + $$invalidate(7, invalid = false); + form_input == null ? void 0 : form_input.setCustomValidity(``); + dispatch(`remove`, { option }); + dispatch(`change`, { option, type: `remove` }); + } + function open_dropdown(event) { + if (disabled) + return; + $$invalidate(8, open = true); + if (!(event instanceof FocusEvent)) { + input == null ? void 0 : input.focus(); + } + dispatch(`open`, { event }); + } + function close_dropdown(event) { + $$invalidate(8, open = false); + input == null ? void 0 : input.blur(); + $$invalidate(0, activeIndex = null); + dispatch(`close`, { event }); + } + async function handle_keydown(event) { + var _a3; + if (event.key === `Escape` || event.key === `Tab`) { + close_dropdown(event); + $$invalidate(3, searchText = ``); + } else if (event.key === `Enter`) { + event.preventDefault(); + if (activeOption) { + selected.includes(activeOption) ? remove(activeOption) : add(activeOption, event); + $$invalidate(3, searchText = ``); + } else if (allowUserOptions && searchText.length > 0) { + add(searchText, event); + } else + open_dropdown(event); + } else if ([`ArrowDown`, `ArrowUp`].includes(event.key)) { + if (activeIndex === null && matchingOptions.length > 0) { + $$invalidate(0, activeIndex = 0); + return; + } else if (allowUserOptions && !matchingOptions.length && searchText.length > 0) { + $$invalidate(44, option_msg_is_active = !option_msg_is_active); + return; + } else if (activeIndex === null) { + return; + } + event.preventDefault(); + const increment = event.key === `ArrowUp` ? -1 : 1; + $$invalidate(0, activeIndex = (activeIndex + increment) % matchingOptions.length); + if (activeIndex < 0) + $$invalidate(0, activeIndex = matchingOptions.length - 1); + if (autoScroll) { + await tick(); + const li = document.querySelector(`ul.options > li.active`); + if (li) + (_a3 = li.scrollIntoViewIfNeeded) == null ? void 0 : _a3.call(li); + } + } else if (event.key === `Backspace` && selected.length > 0 && !searchText) { + remove(selected.at(-1)); + } else if (matchingOptions.length > 0) { + $$invalidate(0, activeIndex = 0); + } + } + function remove_all() { + $$invalidate(4, selected = []); + $$invalidate(3, searchText = ``); + dispatch(`removeAll`, { options: selected }); + dispatch(`change`, { options: selected, type: `removeAll` }); + } + const if_enter_or_space = (handler) => (event) => { + if ([`Enter`, `Space`].includes(event.code)) { + event.preventDefault(); + handler(); + } + }; + function on_click_outside(event) { + if (outerDiv && !outerDiv.contains(event.target)) { + close_dropdown(event); + } + } + let drag_idx = null; + const drop = (target_idx) => (event) => { + if (!event.dataTransfer) + return; + event.dataTransfer.dropEffect = `move`; + const start_idx = parseInt(event.dataTransfer.getData(`text/plain`)); + const new_selected = [...selected]; + if (start_idx < target_idx) { + new_selected.splice(target_idx + 1, 0, new_selected[start_idx]); + new_selected.splice(start_idx, 1); + } else { + new_selected.splice(target_idx, 0, new_selected[start_idx]); + new_selected.splice(start_idx + 1, 1); + } + $$invalidate(4, selected = new_selected); + $$invalidate(46, drag_idx = null); + }; + const dragstart = (idx) => (event) => { + if (!event.dataTransfer) + return; + event.dataTransfer.effectAllowed = `move`; + event.dataTransfer.dropEffect = `move`; + event.dataTransfer.setData(`text/plain`, `${idx}`); + }; + let ul_options; + function highlight_matching_options(event) { + var _a3; + if (!highlightMatches || typeof CSS == `undefined` || !CSS.highlights) + return; + CSS.highlights.clear(); + const query = (_a3 = event == null ? void 0 : event.target) == null ? void 0 : _a3.value.trim().toLowerCase(); + if (!query) + return; + const tree_walker = document.createTreeWalker(ul_options, NodeFilter.SHOW_TEXT, { + acceptNode: (node) => { + if ((node == null ? void 0 : node.textContent) === noMatchingOptionsMsg) + return NodeFilter.FILTER_REJECT; + return NodeFilter.FILTER_ACCEPT; + } + }); + const text_nodes = []; + let current_node = tree_walker.nextNode(); + while (current_node) { + text_nodes.push(current_node); + current_node = tree_walker.nextNode(); + } + const ranges = text_nodes.map((el) => { + var _a4; + const text2 = (_a4 = el.textContent) == null ? void 0 : _a4.toLowerCase(); + const indices = []; + let start_pos = 0; + while (text2 && start_pos < text2.length) { + const index = text2.indexOf(query, start_pos); + if (index === -1) + break; + indices.push(index); + start_pos = index + query.length; + } + return indices.map((index) => { + const range = new Range(); + range.setStart(el, index); + range.setEnd(el, index + query.length); + return range; + }); + }); + CSS.highlights.set(`sms-search-matches`, new Highlight(...ranges.flat())); + } + function mousedown_handler_1(event) { + bubble.call(this, $$self, event); + } + function mousedown_handler_2(event) { + bubble.call(this, $$self, event); + } + function focus_handler(event) { + bubble.call(this, $$self, event); + } + function blur_handler(event) { + bubble.call(this, $$self, event); + } + function change_handler(event) { + bubble.call(this, $$self, event); + } + function click_handler(event) { + bubble.call(this, $$self, event); + } + function keydown_handler(event) { + bubble.call(this, $$self, event); + } + function keyup_handler(event) { + bubble.call(this, $$self, event); + } + function mousedown_handler(event) { + bubble.call(this, $$self, event); + } + function mouseenter_handler(event) { + bubble.call(this, $$self, event); + } + function mouseleave_handler(event) { + bubble.call(this, $$self, event); + } + function touchcancel_handler(event) { + bubble.call(this, $$self, event); + } + function touchend_handler(event) { + bubble.call(this, $$self, event); + } + function touchmove_handler(event) { + bubble.call(this, $$self, event); + } + function touchstart_handler(event) { + bubble.call(this, $$self, event); + } + function dragover_handler(event) { + bubble.call(this, $$self, event); + } + function onwindowresize() { + $$invalidate(45, window_width = window.innerWidth); + } + function input0_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + form_input = $$value; + $$invalidate(5, form_input); + }); + } + const invalid_handler = () => { + $$invalidate(7, invalid = true); + let msg; + if (maxSelect && maxSelect > 1 && Number(required) > 1) { + msg = `Please select between ${required} and ${maxSelect} options`; + } else if (Number(required) > 1) { + msg = `Please select at least ${required} options`; + } else { + msg = `Please select an option`; + } + form_input == null ? void 0 : form_input.setCustomValidity(msg); + }; + const mouseup_handler = (option) => remove(option); + const keydown_handler_1 = (option) => remove(option); + const dragenter_handler = (idx) => $$invalidate(46, drag_idx = idx); + function input1_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + input = $$value; + $$invalidate(6, input); + }); + } + function input1_input_handler() { + searchText = this.value; + $$invalidate(3, searchText); + } + function wiggle_1_wiggle_binding(value2) { + wiggle = value2; + $$invalidate(43, wiggle); + } + const mouseup_handler_1 = (disabled2, option, event) => { + if (!disabled2) + add(option, event); + }; + const mouseover_handler = (disabled2, idx) => { + if (!disabled2) + $$invalidate(0, activeIndex = idx); + }; + const focus_handler_1 = (disabled2, idx) => { + if (!disabled2) + $$invalidate(0, activeIndex = idx); + }; + const mouseout_handler = () => $$invalidate(0, activeIndex = null); + const blur_handler_1 = () => $$invalidate(0, activeIndex = null); + const mouseup_handler_2 = (event) => add(searchText, event); + const mouseover_handler_1 = () => $$invalidate(44, option_msg_is_active = true); + const focus_handler_2 = () => $$invalidate(44, option_msg_is_active = true); + const mouseout_handler_1 = () => $$invalidate(44, option_msg_is_active = false); + const blur_handler_2 = () => $$invalidate(44, option_msg_is_active = false); + function ul_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + ul_options = $$value; + $$invalidate(47, ul_options); + }); + } + function div_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + outerDiv = $$value; + $$invalidate(9, outerDiv); + }); + } + $$self.$$set = ($$props2) => { + if ("activeIndex" in $$props2) + $$invalidate(0, activeIndex = $$props2.activeIndex); + if ("activeOption" in $$props2) + $$invalidate(59, activeOption = $$props2.activeOption); + if ("createOptionMsg" in $$props2) + $$invalidate(10, createOptionMsg = $$props2.createOptionMsg); + if ("allowUserOptions" in $$props2) + $$invalidate(11, allowUserOptions = $$props2.allowUserOptions); + if ("allowEmpty" in $$props2) + $$invalidate(61, allowEmpty = $$props2.allowEmpty); + if ("autocomplete" in $$props2) + $$invalidate(12, autocomplete = $$props2.autocomplete); + if ("autoScroll" in $$props2) + $$invalidate(62, autoScroll = $$props2.autoScroll); + if ("breakpoint" in $$props2) + $$invalidate(63, breakpoint = $$props2.breakpoint); + if ("defaultDisabledTitle" in $$props2) + $$invalidate(13, defaultDisabledTitle = $$props2.defaultDisabledTitle); + if ("disabled" in $$props2) + $$invalidate(42, disabled = $$props2.disabled); + if ("disabledInputTitle" in $$props2) + $$invalidate(14, disabledInputTitle = $$props2.disabledInputTitle); + if ("duplicateFunc" in $$props2) + $$invalidate(15, duplicateFunc = $$props2.duplicateFunc); + if ("duplicateOptionMsg" in $$props2) + $$invalidate(16, duplicateOptionMsg = $$props2.duplicateOptionMsg); + if ("duplicates" in $$props2) + $$invalidate(17, duplicates = $$props2.duplicates); + if ("filterFunc" in $$props2) + $$invalidate(64, filterFunc = $$props2.filterFunc); + if ("focusInputOnSelect" in $$props2) + $$invalidate(65, focusInputOnSelect = $$props2.focusInputOnSelect); + if ("form_input" in $$props2) + $$invalidate(5, form_input = $$props2.form_input); + if ("highlightMatches" in $$props2) + $$invalidate(66, highlightMatches = $$props2.highlightMatches); + if ("id" in $$props2) + $$invalidate(18, id = $$props2.id); + if ("input" in $$props2) + $$invalidate(6, input = $$props2.input); + if ("inputClass" in $$props2) + $$invalidate(19, inputClass = $$props2.inputClass); + if ("inputmode" in $$props2) + $$invalidate(20, inputmode = $$props2.inputmode); + if ("invalid" in $$props2) + $$invalidate(7, invalid = $$props2.invalid); + if ("liActiveOptionClass" in $$props2) + $$invalidate(21, liActiveOptionClass = $$props2.liActiveOptionClass); + if ("liOptionClass" in $$props2) + $$invalidate(22, liOptionClass = $$props2.liOptionClass); + if ("liSelectedClass" in $$props2) + $$invalidate(23, liSelectedClass = $$props2.liSelectedClass); + if ("loading" in $$props2) + $$invalidate(24, loading = $$props2.loading); + if ("matchingOptions" in $$props2) + $$invalidate(1, matchingOptions = $$props2.matchingOptions); + if ("maxSelect" in $$props2) + $$invalidate(25, maxSelect = $$props2.maxSelect); + if ("maxSelectMsg" in $$props2) + $$invalidate(26, maxSelectMsg = $$props2.maxSelectMsg); + if ("maxSelectMsgClass" in $$props2) + $$invalidate(27, maxSelectMsgClass = $$props2.maxSelectMsgClass); + if ("name" in $$props2) + $$invalidate(28, name = $$props2.name); + if ("noMatchingOptionsMsg" in $$props2) + $$invalidate(29, noMatchingOptionsMsg = $$props2.noMatchingOptionsMsg); + if ("open" in $$props2) + $$invalidate(8, open = $$props2.open); + if ("options" in $$props2) + $$invalidate(2, options = $$props2.options); + if ("outerDiv" in $$props2) + $$invalidate(9, outerDiv = $$props2.outerDiv); + if ("outerDivClass" in $$props2) + $$invalidate(30, outerDivClass = $$props2.outerDivClass); + if ("parseLabelsAsHtml" in $$props2) + $$invalidate(31, parseLabelsAsHtml = $$props2.parseLabelsAsHtml); + if ("pattern" in $$props2) + $$invalidate(32, pattern = $$props2.pattern); + if ("placeholder" in $$props2) + $$invalidate(33, placeholder = $$props2.placeholder); + if ("removeAllTitle" in $$props2) + $$invalidate(34, removeAllTitle = $$props2.removeAllTitle); + if ("removeBtnTitle" in $$props2) + $$invalidate(35, removeBtnTitle = $$props2.removeBtnTitle); + if ("minSelect" in $$props2) + $$invalidate(36, minSelect = $$props2.minSelect); + if ("required" in $$props2) + $$invalidate(37, required = $$props2.required); + if ("resetFilterOnAdd" in $$props2) + $$invalidate(67, resetFilterOnAdd = $$props2.resetFilterOnAdd); + if ("searchText" in $$props2) + $$invalidate(3, searchText = $$props2.searchText); + if ("selected" in $$props2) + $$invalidate(4, selected = $$props2.selected); + if ("sortSelected" in $$props2) + $$invalidate(68, sortSelected = $$props2.sortSelected); + if ("selectedOptionsDraggable" in $$props2) + $$invalidate(38, selectedOptionsDraggable = $$props2.selectedOptionsDraggable); + if ("ulOptionsClass" in $$props2) + $$invalidate(39, ulOptionsClass = $$props2.ulOptionsClass); + if ("ulSelectedClass" in $$props2) + $$invalidate(40, ulSelectedClass = $$props2.ulSelectedClass); + if ("value" in $$props2) + $$invalidate(60, value = $$props2.value); + if ("$$scope" in $$props2) + $$invalidate(107, $$scope = $$props2.$$scope); + }; + $$self.$$.update = () => { + var _a3, _b; + if ($$self.$$.dirty[0] & 33554448) { + $: + $$invalidate(60, value = maxSelect === 1 ? (_a3 = selected[0]) != null ? _a3 : null : selected); + } + if ($$self.$$.dirty[0] & 28 | $$self.$$.dirty[2] & 4) { + $: + $$invalidate(1, matchingOptions = options.filter((op) => filterFunc(op, searchText) && !selected.includes(op))); + } + if ($$self.$$.dirty[0] & 3) { + $: + $$invalidate(59, activeOption = (_b = matchingOptions[activeIndex != null ? activeIndex : -1]) != null ? _b : null); + } + if ($$self.$$.dirty[0] & 16) { + $: + $$invalidate(48, is_selected = (label) => selected.map(get_label).includes(label)); + } + }; + return [ + activeIndex, + matchingOptions, + options, + searchText, + selected, + form_input, + input, + invalid, + open, + outerDiv, + createOptionMsg, + allowUserOptions, + autocomplete, + defaultDisabledTitle, + disabledInputTitle, + duplicateFunc, + duplicateOptionMsg, + duplicates, + id, + inputClass, + inputmode, + liActiveOptionClass, + liOptionClass, + liSelectedClass, + loading, + maxSelect, + maxSelectMsg, + maxSelectMsgClass, + name, + noMatchingOptionsMsg, + outerDivClass, + parseLabelsAsHtml, + pattern, + placeholder, + removeAllTitle, + removeBtnTitle, + minSelect, + required, + selectedOptionsDraggable, + ulOptionsClass, + ulSelectedClass, + get_label, + disabled, + wiggle, + option_msg_is_active, + window_width, + drag_idx, + ul_options, + is_selected, + add, + remove, + open_dropdown, + handle_keydown, + remove_all, + if_enter_or_space, + on_click_outside, + drop, + dragstart, + highlight_matching_options, + activeOption, + value, + allowEmpty, + autoScroll, + breakpoint, + filterFunc, + focusInputOnSelect, + highlightMatches, + resetFilterOnAdd, + sortSelected, + slots, + mousedown_handler_1, + mousedown_handler_2, + focus_handler, + blur_handler, + change_handler, + click_handler, + keydown_handler, + keyup_handler, + mousedown_handler, + mouseenter_handler, + mouseleave_handler, + touchcancel_handler, + touchend_handler, + touchmove_handler, + touchstart_handler, + dragover_handler, + onwindowresize, + input0_binding, + invalid_handler, + mouseup_handler, + keydown_handler_1, + dragenter_handler, + input1_binding, + input1_input_handler, + wiggle_1_wiggle_binding, + mouseup_handler_1, + mouseover_handler, + focus_handler_1, + mouseout_handler, + blur_handler_1, + mouseup_handler_2, + mouseover_handler_1, + focus_handler_2, + mouseout_handler_1, + blur_handler_2, + ul_binding, + div_binding, + $$scope + ]; +} +var MultiSelect = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance6, create_fragment6, safe_not_equal, { + activeIndex: 0, + activeOption: 59, + createOptionMsg: 10, + allowUserOptions: 11, + allowEmpty: 61, + autocomplete: 12, + autoScroll: 62, + breakpoint: 63, + defaultDisabledTitle: 13, + disabled: 42, + disabledInputTitle: 14, + duplicateFunc: 15, + duplicateOptionMsg: 16, + duplicates: 17, + filterFunc: 64, + focusInputOnSelect: 65, + form_input: 5, + highlightMatches: 66, + id: 18, + input: 6, + inputClass: 19, + inputmode: 20, + invalid: 7, + liActiveOptionClass: 21, + liOptionClass: 22, + liSelectedClass: 23, + loading: 24, + matchingOptions: 1, + maxSelect: 25, + maxSelectMsg: 26, + maxSelectMsgClass: 27, + name: 28, + noMatchingOptionsMsg: 29, + open: 8, + options: 2, + outerDiv: 9, + outerDivClass: 30, + parseLabelsAsHtml: 31, + pattern: 32, + placeholder: 33, + removeAllTitle: 34, + removeBtnTitle: 35, + minSelect: 36, + required: 37, + resetFilterOnAdd: 67, + searchText: 3, + selected: 4, + sortSelected: 68, + selectedOptionsDraggable: 38, + ulOptionsClass: 39, + ulSelectedClass: 40, + value: 60, + get_label: 41 + }, add_css2, [-1, -1, -1, -1]); + } + get get_label() { + return this.$$.ctx[41]; + } +}; +var MultiSelect_default = MultiSelect; + +// node_modules/.pnpm/svelte-multiselect@8.6.2/node_modules/svelte-multiselect/dist/index.js +function scroll_into_view_if_needed_polyfill(centerIfNeeded = true) { + const elem = this; + const observer = new IntersectionObserver(function([entry]) { + const ratio = entry.intersectionRatio; + if (ratio < 1) { + const place = ratio <= 0 && centerIfNeeded ? `center` : `nearest`; + elem.scrollIntoView({ + block: place, + inline: place + }); + } + this.disconnect(); + }); + observer.observe(elem); + return observer; +} +var _a; +if (typeof Element !== `undefined` && !((_a = Element.prototype) == null ? void 0 : _a.scrollIntoViewIfNeeded) && typeof IntersectionObserver !== `undefined`) { + Element.prototype.scrollIntoViewIfNeeded = scroll_into_view_if_needed_polyfill; +} + +// ../lib/dist/index.js +var import_obsidian = require("obsidian"); +function Q(U2, F2, Q2, B2) { + if (Q2 === "a" && !B2) + throw new TypeError("Private accessor was defined without a getter"); + if (typeof F2 == "function" ? U2 !== F2 || !B2 : !F2.has(U2)) + throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return Q2 === "m" ? B2 : Q2 === "a" ? B2.call(U2) : B2 ? B2.value : F2.get(U2); +} +function B(U2, F2, Q2, B2, R2) { + if (B2 === "m") + throw new TypeError("Private method is not writable"); + if (B2 === "a" && !R2) + throw new TypeError("Private accessor was defined without a setter"); + if (typeof F2 == "function" ? U2 !== F2 || !R2 : !F2.has(U2)) + throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return B2 === "a" ? R2.call(U2, Q2) : R2 ? R2.value = Q2 : F2.set(U2, Q2), Q2; +} +function R(U2, F2, Q2) { + var B2 = F2 === void 0 ? null : F2, R2 = function(U3, F3) { + var Q3 = atob(U3); + if (F3) { + for (var B3 = new Uint8Array(Q3.length), R3 = 0, V3 = Q3.length; R3 < V3; ++R3) + B3[R3] = Q3.charCodeAt(R3); + return String.fromCharCode.apply(null, new Uint16Array(B3.buffer)); + } + return Q3; + }(U2, Q2 !== void 0 && Q2), V2 = R2.indexOf("\n", 10) + 1, l2 = R2.substring(V2) + (B2 ? "//# sourceMappingURL=" + B2 : ""), Z2 = new Blob([l2], { type: "application/javascript" }); + return URL.createObjectURL(Z2); +} +var V; +var l; +var Z; +var d; +var W = (V = "Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7bGV0IEEsZz1udWxsO2Z1bmN0aW9uIEIoKXtyZXR1cm4gbnVsbCE9PWcmJjAhPT1nLmJ5dGVMZW5ndGh8fChnPW5ldyBVaW50OEFycmF5KEEubWVtb3J5LmJ1ZmZlcikpLGd9ZnVuY3Rpb24gSShnLEIpe3RyeXtyZXR1cm4gZy5hcHBseSh0aGlzLEIpfWNhdGNoKGcpe2NvbnN0IEI9ZnVuY3Rpb24oZyl7Y29uc3QgQj1BLl9fZXh0ZXJucmVmX3RhYmxlX2FsbG9jKCk7cmV0dXJuIEEuX193YmluZGdlbl9leHBvcnRfMi5zZXQoQixnKSxCfShnKTtBLl9fd2JpbmRnZW5fZXhuX3N0b3JlKEIpfX1jb25zdCBRPSJ1bmRlZmluZWQiIT10eXBlb2YgVGV4dERlY29kZXI/bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2lnbm9yZUJPTTohMCxmYXRhbDohMH0pOntkZWNvZGU6KCk9Pnt0aHJvdyBFcnJvcigiVGV4dERlY29kZXIgbm90IGF2YWlsYWJsZSIpfX07ZnVuY3Rpb24gQyhBLGcpe3JldHVybiBBPj4+PTAsUS5kZWNvZGUoQigpLnN1YmFycmF5KEEsQStnKSl9ZnVuY3Rpb24gRShnKXtsZXQgQixJO3RyeXtjb25zdCBEPUEuZXh0cmFjdF9wZGZfdGV4dChnKTt2YXIgUT1EWzBdLEU9RFsxXTtpZihEWzNdKXRocm93IFE9MCxFPTAsZnVuY3Rpb24oZyl7Y29uc3QgQj1BLl9fd2JpbmRnZW5fZXhwb3J0XzIuZ2V0KGcpO3JldHVybiBBLl9fZXh0ZXJucmVmX3RhYmxlX2RlYWxsb2MoZyksQn0oRFsyXSk7cmV0dXJuIEI9USxJPUUsQyhRLEUpfWZpbmFsbHl7QS5fX3diaW5kZ2VuX2ZyZWUoQixJLDEpfX1mdW5jdGlvbiBEKCl7Y29uc3QgZz17d2JnOnt9fTtyZXR1cm4gZy53YmcuX193YmdfYnVmZmVyXzYwOWNjM2VlZTUxZWQxNTg9ZnVuY3Rpb24oQSl7cmV0dXJuIEEuYnVmZmVyfSxnLndiZy5fX3diZ19nZXRSYW5kb21WYWx1ZXNfM2M5YzBkNTg2ZTU3NWExNj1mdW5jdGlvbigpe3JldHVybiBJKChmdW5jdGlvbihBLGcpe3ZhciBJLFE7Z2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKChJPUEsUT1nLEk+Pj49MCxCKCkuc3ViYXJyYXkoSS8xLEkvMStRKSkpfSksYXJndW1lbnRzKX0sZy53YmcuX193YmdfbGVuZ3RoX2E0NDYxOTNkYzIyYzEyZjg9ZnVuY3Rpb24oQSl7cmV0dXJuIEEubGVuZ3RofSxnLndiZy5fX3diZ19uZXdfYTEyMDAyYTdmOTFjNzViZT1mdW5jdGlvbihBKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQSl9LGcud2JnLl9fd2JnX3NldF82NTU5NWJkZDg2OGIzMDA5PWZ1bmN0aW9uKEEsZyxCKXtBLnNldChnLEI+Pj4wKX0sZy53YmcuX193YmluZGdlbl9lcnJvcl9uZXc9ZnVuY3Rpb24oQSxnKXtyZXR1cm4gbmV3IEVycm9yKEMoQSxnKSl9LGcud2JnLl9fd2JpbmRnZW5faW5pdF9leHRlcm5yZWZfdGFibGU9ZnVuY3Rpb24oKXtjb25zdCBnPUEuX193YmluZGdlbl9leHBvcnRfMixCPWcuZ3Jvdyg0KTtnLnNldCgwLHZvaWQgMCksZy5zZXQoQiswLHZvaWQgMCksZy5zZXQoQisxLG51bGwpLGcuc2V0KEIrMiwhMCksZy5zZXQoQiszLCExKX0sZy53YmcuX193YmluZGdlbl9tZW1vcnk9ZnVuY3Rpb24oKXtyZXR1cm4gQS5tZW1vcnl9LGcud2JnLl9fd2JpbmRnZW5fdGhyb3c9ZnVuY3Rpb24oQSxnKXt0aHJvdyBuZXcgRXJyb3IoQyhBLGcpKX0sZ31hc3luYyBmdW5jdGlvbiB3KEIpe2lmKHZvaWQgMCE9PUEpcmV0dXJuIEE7dm9pZCAwIT09QiYmKE9iamVjdC5nZXRQcm90b3R5cGVPZihCKT09PU9iamVjdC5wcm90b3R5cGU/KHttb2R1bGVfb3JfcGF0aDpCfT1CKTpjb25zb2xlLndhcm4oInVzaW5nIGRlcHJlY2F0ZWQgcGFyYW1ldGVycyBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uOyBwYXNzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIikpLHZvaWQgMD09PUImJihCPW5ldyBVUkwoIm9ic2lkaWFuX3RleHRfZXh0cmFjdF9iZy53YXNtIixkb2N1bWVudC5jdXJyZW50U2NyaXB0JiZkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY3x8bmV3IFVSTCgicGRmLXdvcmtlci5qcyIsZG9jdW1lbnQuYmFzZVVSSSkuaHJlZikpO2NvbnN0IEk9RCgpOygic3RyaW5nIj09dHlwZW9mIEJ8fCJmdW5jdGlvbiI9PXR5cGVvZiBSZXF1ZXN0JiZCIGluc3RhbmNlb2YgUmVxdWVzdHx8ImZ1bmN0aW9uIj09dHlwZW9mIFVSTCYmQiBpbnN0YW5jZW9mIFVSTCkmJihCPWZldGNoKEIpKTtjb25zdHtpbnN0YW5jZTpRLG1vZHVsZTpDfT1hd2FpdCBhc3luYyBmdW5jdGlvbihBLGcpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBSZXNwb25zZSYmQSBpbnN0YW5jZW9mIFJlc3BvbnNlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcpdHJ5e3JldHVybiBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhBLGcpfWNhdGNoKGcpe2lmKCJhcHBsaWNhdGlvbi93YXNtIj09QS5oZWFkZXJzLmdldCgiQ29udGVudC1UeXBlIikpdGhyb3cgZztjb25zb2xlLndhcm4oImBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ2AgZmFpbGVkIGJlY2F1c2UgeW91ciBzZXJ2ZXIgZG9lcyBub3Qgc2VydmUgV2FzbSB3aXRoIGBhcHBsaWNhdGlvbi93YXNtYCBNSU1FIHR5cGUuIEZhbGxpbmcgYmFjayB0byBgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVgIHdoaWNoIGlzIHNsb3dlci4gT3JpZ2luYWwgZXJyb3I6XG4iLGcpfWNvbnN0IEI9YXdhaXQgQS5hcnJheUJ1ZmZlcigpO3JldHVybiBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShCLGcpfXtjb25zdCBCPWF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKEEsZyk7cmV0dXJuIEIgaW5zdGFuY2VvZiBXZWJBc3NlbWJseS5JbnN0YW5jZT97aW5zdGFuY2U6Qixtb2R1bGU6QX06Qn19KGF3YWl0IEIsSSk7cmV0dXJuIGZ1bmN0aW9uKEIsSSl7cmV0dXJuIEE9Qi5leHBvcnRzLHcuX193YmluZGdlbl93YXNtX21vZHVsZT1JLGc9bnVsbCxBLl9fd2JpbmRnZW5fc3RhcnQoKSxBfShRLEMpfSJ1bmRlZmluZWQiIT10eXBlb2YgVGV4dERlY29kZXImJlEuZGVjb2RlKCk7Y29uc3QgTj1hdG9iKCJBR0Z6YlFFQUFBQUJzUU02WUFSL2YzOS9BR0FDZjM4QVlBTi9mMzhCZjJBQ2YzOEJmMkFCZndCZ0EzOS9md0JnQVg4QmYyQUZmMzkvZjM4QVlBWi9mMzkvZjM4QVlBQUJmMkFFZjM5L2Z3Ri9ZQU4vZjM4QmZtQUZmMzkvZjM4QmYyQUFBR0FIZjM5L2YzOS9md0JnQTM5L2ZnRi9ZQUovZndGOFlBSi9mZ0JnQm45L2YzOS9md0YvWUFSK2ZuOS9BWDVnQkg5L2YzNEFZQUZ2QVc5Z0NIOS9mMzkvZjM5L0FHQURmMzUrQUdBSGYzOS9mMzkvZndGL1lBRi9BWDVnQm45L2YzNS9md0JnQkg5L2ZuOEFZQU4rZm44QmZtQURmMzkrQUdBQUJIOS9mMzlnQVc4QmYyQUFBVzlnQTI5dmZ3QmdBbjkvQVc5Z0IzOS9mMzk4Zkg4QVlBZC9mbjkvZjM5L0FHQUdmMzUvZjM5L0FHQUpmMzkvZjM5L2ZuNStBR0FEZm45L0FYOWdCSDkvZjN3QVlBUi9mMzUvQVg5Z0MzOS9mMzkvZjM5L2YzOS9BWDlnQTM1K2ZnRitZQVIvZm41K0FHQUlmMzUrZm41K2ZuNEFZQVIrZm45L0FYOWdDbjkrZm41K2ZuNStmbjRBWUFSL2YzOS9BWDVnQVg4QmZHQUJid1IvZjM5L1lBVi9mMzEvZndCZ0JIOTlmMzhBWUFWL2YzeC9md0JnQkg5OGYzOEFZQVYvZjM1L2Z3QmdCSDkrZjM4QVlBSi9mZ0YrQXFnQ0NRTjNZbWNkWDE5M1ltZGZiR1Z1WjNSb1gyRTBORFl4T1ROa1l6SXlZekV5WmpnQUh3TjNZbWNSWDE5M1ltbHVaR2RsYmw5dFpXMXZjbmtBSUFOM1ltY2RYMTkzWW1kZlluVm1abVZ5WHpZd09XTmpNMlZsWlRVeFpXUXhOVGdBRlFOM1ltY2FYMTkzWW1kZmJtVjNYMkV4TWpBd01tRTNaamt4WXpjMVltVUFGUU4zWW1jYVgxOTNZbWRmYzJWMFh6WTFOVGsxWW1Sa09EWTRZak13TURrQUlRTjNZbWNVWDE5M1ltbHVaR2RsYmw5bGNuSnZjbDl1WlhjQUlnTjNZbWNtWDE5M1ltZGZaMlYwVW1GdVpHOXRWbUZzZFdWelh6TmpPV013WkRVNE5tVTFOelZoTVRZQUFRTjNZbWNRWDE5M1ltbHVaR2RsYmw5MGFISnZkd0FCQTNkaVp4OWZYM2RpYVc1a1oyVnVYMmx1YVhSZlpYaDBaWEp1Y21WbVgzUmhZbXhsQUEwRCtRbjNDUVVPRmlNRkFRVUlCUWNGQlJFR0J3RUZBUVVBQVFVSUNBZ0lDQ1FLQ0FnREJnRUZBUUVGQVFVRkFRY0hCd1VCQndjREFRVUpBUWtCRVFjSENBRUJBZ0VBQ2dNSUNBTUlBQVVGQUFvQkNnQUFBQU1GQVFFR0FRRUlKUUVCQkFVRkFRUUJBUUVCQVFjRUJBRUJBd0VBQUFFRkJRQUNBd01CQVFjRkVnUUNBUUVCRUFRRUFRRUVBd0VGQndVQkFRVUpDUU1UQlFrQkFRUVhGd2NCQVFFREFRRUFBZ0FBQkFBbUF3UUFBZ2NFQUFFRUFRQUZCUUFuQVFFREFBQUZCUUFEQWdFQkFBQUFBQUFBQUFBQUFBQUFBUUVIQUFVRkJSZ0FCUVVCQUFFQ0dRQUlDQUVGQUFFQkJBUUJDQVVCQUFBQkFBRUZBUVVCR2drb0JRQURBUUFBS1FnTUF3RUVBQm9CQUFBREF3QUFBQVVBQXdBQkNBVUZBUU1BQUFNQkF3QUhBUUVCQXdNT0FRQUFBd0VCQUFNRkFBTUFCQUFEQUFRRkJ3RUZBUVVJQlFFSUJRVUtBQVFFQWdVSEJ3VWJCUU1NQndFRUJBQUFBUUFaQndBQUFBQUFBQUFXQVFjQkFRMEhBUVVGQVFFS0FRVUFBQUVCQUFBQkJRRUFBQUFFQkFBU0NBRU9Cd0VGQUFjQkJTb0FCUUFEQ0FZSUFBRUFBQUVZQVFFRUFBQUNDZ1FCQlFBQUFBRUZCd0FGQXdFRkF3QUNDQUlBQXdBQUFBQUFBQVVBQXdFS0F3d0FEZ0FBQUFBQUFBQUtBUW9CQmdBQUNBRUZBZ0FUQUFBQUFBRUJBQUFBQUFBQUV3OERBQkFMQVFBQUFRRVBCd0FGQXdVRkJRQWNCUU1EQkFFQkJRUXJBQUFzQndFQ0FBQU9CQVFCTFE4Q0FRSU1BUUFHQkM0REFSRUxCd2t2QUFRQkNBVUJCQWNLQXdrQkJRQUZBUUVCQVFRRUhSd0RCQXdBQUFFQkJRVUdBQUFCQVFRRUJBZ0FDREFCQndRQUJnVUJBQUVBQVFNQkFRVUZCUUVFQlFFR0JBUUpCQU1EQlFFQUJRVUVBd1lGQlFFRUNRUUZBUVVBREFFSEJ3RUJBUU1CQVFRRkJBTUlBUVFEQVFFQkJnVVFCUWNKQUFFQUJRVUFBd2tHRkFBQkJBVUJCUVVGSFFFQ0NRRUVBZ2tCQWdjSEJBVVVCQXdIQlFFSEJ3RURGQVVGQVFjSERBRURBd01FQkFRQUNBVUJBUUVCQVFNQUFRRUJCd1VIQlFFRUFRTUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUFBQUFBQUFNREF3Z0RBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFVRkF3TUdCUUFGQlFRQUJRVUFCd2NCQWdFREF3TUhCd0VBQkFVQUN3QUdCQUFMQ1FBQkJBWUJDQXNKQlFVRUR3TU1CQVVCQlFVUEJBRUFCZ0FBQXdBREJRc0JBUUVCQUFBQUJRUU5BUVFFRFEwQkF3TURBQUFBQmdRQkFBQUtCQVFGQndjRkFBUURDZ2NBQndBQUFRY0pBUVlEQVFBSkJRY0JBQUFBQUFBQUFBQUVBQWNIQUFFeEFBQUVNZ1FEQ3dFSEd3c0FBd01FQ3dRQkJRRUJDQVFEQmdJRkJnTUZCUWNEQVFJQ0Fnb0JCd0VCQUFjS0JRUUFBUUVFQVFNQ0F3TUNBQW9CQ2dNREFRTUtDZ29CQVFRRUNna0pDUWtKQ1FBQUFBQUZCUUFGQUFBRUNnUUNBd1lTQlFRR0JnQUFBQUFBQUFjTU16VTNCQVE1QmdRRUFBQUFBQUFBQXdNRUFBUURCUVVFQkFNS0FnVUVDUVlEQWdRRUJRWUVDUWtFQmdrR0FBQURBd0VFQkFNREJBQUFCQU1FQlFNRUJBVUJCQU1EQkFNREF3TUVBd01EQVFJQkFRUUJCQVFCQkFRRUJRUUJBZ1FHQUFBQUFBQUFCQUFBQUFBQUFBWUpDUWtHQXdjQ0NnUUVCQUVBQUFBQUFBQUVBQUFBQUFBQUJRTURCQU1EQVFNQkFRRUJBd01EQVFFQkFRRUJBUUVCQVFBQUJBQUFBQTBGQlFVREJBVUVBUUlCQVFvQ0FRRUVBd01FQUFRQUFBUURBd01EQVFNQkJnTU5BUVVFQXdNR0NBRUJDQUVCQXdFREF3TURBd01EQVFFREF3TUJBUUVCQVFFQkFBRUdCZ01GQkFzQ2NBR2JBNXNEYndDQUFRVURBUUFYQmdrQmZ3RkJnSURBQUFzSHFnRUlCbTFsYlc5eWVRSUFFR1Y0ZEhKaFkzUmZjR1JtWDNSbGVIUUFwd2NVWDE5M1ltbHVaR2RsYmw5bGVHNWZjM1J2Y21VQTZ3Z1hYMTlsZUhSbGNtNXlaV1pmZEdGaWJHVmZZV3hzYjJNQW5BRVRYMTkzWW1sdVpHZGxibDlsZUhCdmNuUmZNZ0VCR1Y5ZlpYaDBaWEp1Y21WbVgzUmhZbXhsWDJSbFlXeHNiMk1BaXdVUFgxOTNZbWx1WkdkbGJsOW1jbVZsQU9vSUVGOWZkMkpwYm1SblpXNWZjM1JoY25RQUNBbXVCZ0VBUVFFTG1nUHZDQ2pQQ2RBSjVBZVpDWUlKM1FqY0Jkd0ptUW0rQk40RWROc0lpZ0s2Q2VnRjZnbkVBLzRKblFhOUJwWURtUW5SQ1pnSjBBWExCdTBFK2dYWkJxa0hxZ2UvQ05RSnNRS09CYTRHNFFlY0NaNEdmclVEandqWkE0NElqd2lEQ0xFSW9naU9DSTRJa0FpUkNKSUkxZ0tiQ2E0RzlRU0JCdDBHcmdlakFyc0h2d2pBQ0trSXhBZkFCNXNKbXduSENlY0pnZ2JsQ1prQnlBbm9DYzhGdXdQcENlOEdzQWFTQXRjSm1RTEFDS1FJOEFheEI0OEJyd2FtQWFBRXNBZUlCZTRHM1FteUE2UUo0Z2M2eFFhaUJlRUg0UWZ0QS9BSmt3S3dCS01Kc3dlekIvY0o4d20xQXBJRnhnbnRDS1VDM0FqS0NMSUo4UVhWQWMwSjN3S0dCdlVCclFqeENOQUJqZ21oQW93Si9BS1RCdWNEa1FtbUFwY0dpZ1NWQitJQzdnVzlBL2tGbkFTeUNZZ0lrUUtMQ1pBQytnbjZDZlFGd0FPSUJ1WUQ2Z1hvQS9NSTNRTHlDTndDaXdhUUJQZ0Y0Z1A4QmV3QjhBVlgrd1hhQkpZSDR3S2tCOElCN1FYZEE1Y0g1QUt3Q2ZnQ21BZmxBdkFJcVFHWkIrWUM5QWlWQS8wRnl3SEpCdGdHK0FPSkNORUIyZ2FqQTdFSnZRaWFCNE1EaWdpQ0FyTUp2Z2o0Q0kwQ3BRZkdBZllGNEFQckJid0Qxd2FyQTRzSXNnRzBDWVlEOHdXL0EvNEZ6QUdiQjhNQjd3WEpBL0lGdmdQM0JlRURoUWJsQTVnR1dad0g1d0w2Q1AwQyt3aWFBOGtHL0FqU0FiSUpqQWoyQWVRR3VnTzFDWTREL3dXa0E0MEl0d0tlQitnQytRaVZBdmNJdWdIc0Jla0Q5UVhmQTVrRy9nUDFDTEFDeXduc0JMZ0MvUW5vQnBvSit3blVCYzRKN2dTaENMY0Znd0xUQ01vSW9BSjh4UVhVQ0wwSm13bS9DUGNKblFuVkNmOEoxZ2lmQ1pjRHVRZllDS0VKbkFKaFROa0lvZ25pQ1U5TjF3aWdDZDhKZ0FiRENhVUN6Z0pPeVFtRUJvSUhsd2pyQ1lrQm9nYnhBcGdJN0FudkEvSUNzZ2Z0Q1pnRjZ3SDNCUEVKcFFuT0JjY0ptUWpUQVpBR3p3UGlCbzhFa1FiV0FZNEd6Z1BLQ2NjSW1naTJBWThKdEFLSkJzc0RsQWJOQVpZSmdRT01CczBEbFFiY0JJMEpuQVBNQ2NnSWxBbWRBNVlHemdHTkJ2SURsUW5VQVpzSStBR0tCc3dEaWdtc0Fad0l1d0tIQmxpU0J0QURuUWlGQXBNSnZRR1NDWmdDbmdpVUFvOEc4d1BqQnF3RC9BUzhBcW9EeVFnTUF1a01DcnFmSlBjSmd1UUlBUVIvSXdCQjBMZ0RheUlESkFBZ0EwRzY0UUE3QWN5NEF5QURRUW8yQXNpNEF5QURRYUQzelFBMkFzUzRBeUFEUWRyZ0FEc0J3TGdESUFOQkNqWUN2TGdESUFOQmx2Zk5BRFlDdUxnRElBTkJ0Z003QWJTNEF5QURRUWMyQXJDNEF5QURRWS8zelFBMkFxeTRBeUFEUVpBRk93R291QU1nQTBFT05nS2t1QU1nQTBHQjk4MEFOZ0tndUFNZ0EwRzF5UUE3QVp5NEF5QURRUVkyQXBpNEF5QURRZnYyelFBMkFwUzRBeUFEUWI3aEFEc0JrTGdESUFOQkNqWUNqTGdESUFOQjhmYk5BRFlDaUxnRElBTkIzdUFBT3dHRXVBTWdBMEVLTmdLQXVBTWdBMEhuOXMwQU5nTDh0d01nQTBIYS9nTTdBZmkzQXlBRFFRbzJBdlMzQXlBRFFkMzJ6UUEyQXZDM0F5QURRWlU5T3dIc3R3TWdBMEVLTmdMb3R3TWdBMEhUOXMwQU5nTGt0d01nQTBHdUN6c0I0TGNESUFOQkN6WUMzTGNESUFOQnlQYk5BRFlDMkxjRElBTkJ1T0VBT3dIVXR3TWdBMEVLTmdMUXR3TWdBMEcrOXMwQU5nTE10d01nQTBIWTRBQTdBY2kzQXlBRFFRbzJBc1MzQXlBRFFiVDJ6UUEyQXNDM0F5QURRZDBKT3dHOHR3TWdBMEVUTmdLNHR3TWdBMEdoOXMwQU5nSzB0d01nQTBHWENUc0JzTGNESUFOQkZEWUNyTGNESUFOQmpmYk5BRFlDcUxjRElBTkJ0Z2c3QWFTM0F5QURRUXMyQXFDM0F5QURRWUwyelFBMkFweTNBeUFEUWNJSk93R1l0d01nQTBFUU5nS1V0d01nQTBIeTljMEFOZ0tRdHdNZ0EwSHFDanNCakxjRElBTkJDellDaUxjRElBTkI1L1hOQURZQ2hMY0RJQU5CaytJQU93R0F0d01nQTBFS05nTDh0Z01nQTBIZDljMEFOZ0w0dGdNZ0EwRzJCenNCOUxZRElBTkJCRFlDOExZRElBTkI5Y1BQQURZQzdMWURJQU5CaThBQU93SG90Z01nQTBFT05nTGt0Z01nQTBIUDljMEFOZ0xndGdNZ0EwR013QUE3QWR5MkF5QURRUkkyQXRpMkF5QURRYjMxelFBMkF0UzJBeUFEUWYvOUF6c0IwTFlESUFOQkR6WUN6TFlESUFOQnJ2WE5BRFlDeUxZRElBTkIwQnc3QWNTMkF5QURRUWcyQXNDMkF5QURRYWIxelFBMkFyeTJBeUFEUWZEQUFEc0J1TFlESUFOQkREWUN0TFlESUFOQm12WE5BRFlDc0xZRElBTkI4QTA3QWF5MkF5QURRUXMyQXFpMkF5QURRWS8xelFBMkFxUzJBeUFEUWJEdUF6c0JvTFlESUFOQkREWUNuTFlESUFOQmcvWE5BRFlDbUxZRElBTkJrUDRET3dHVXRnTWdBMEVOTmdLUXRnTWdBMEgyOU0wQU5nS010Z01nQTBHQXdRQTdBWWkyQXlBRFFRdzJBb1MyQXlBRFFlcjB6UUEyQW9DMkF5QURRZUFNT3dIOHRRTWdBMEVPTmdMNHRRTWdBMEhjOU0wQU5nTDB0UU1nQTBIbUZEc0I4TFVESUFOQkREWUM3TFVESUFOQjBQVE5BRFlDNkxVRElBTkI1aFU3QWVTMUF5QURRUXcyQXVDMUF5QURRY1QwelFBMkF0eTFBeUFEUWVZU093SFl0UU1nQTBFSU5nTFV0UU1nQTBHODlNMEFOZ0xRdFFNZ0EwSG1FenNCekxVRElBTkJDellDeUxVRElBTkJzZlROQURZQ3hMVURJQU5CNEF3N0FjQzFBeUFEUVFvMkFyeTFBeUFEUWFmMHpRQTJBcmkxQXlBRFFUQTdBYlMxQXlBRFFRUTJBckMxQXlBRFFZMkF6Z0EyQXF5MUF5QURRYnpoQURzQnFMVURJQU5CQ2pZQ3BMVURJQU5CbmZUTkFEWUNvTFVESUFOQjNPQUFPd0djdFFNZ0EwRUtOZ0tZdFFNZ0EwR1Q5TTBBTmdLVXRRTWdBMEhmQ1RzQmtMVURJQU5CRWpZQ2pMVURJQU5CZ2ZUTkFEWUNpTFVESUFOQm1RazdBWVMxQXlBRFFSTTJBb0MxQXlBRFFlN3p6UUEyQXZ5MEF5QURRYmNJT3dINHRBTWdBMEVLTmdMMHRBTWdBMEhrODgwQU5nTHd0QU1nQTBHVFBUc0I3TFFESUFOQkNUWUM2TFFESUFOQjIvUE5BRFlDNUxRRElBTkIvQUk3QWVDMEF5QURRUW8yQXR5MEF5QURRWVdPemdBMkF0aTBBeUFEUWZ3Q093SFV0QU1nQTBFRU5nTFF0QU1nQTBIWDg4MEFOZ0xNdEFNZ0EwR1JCVHNCeUxRRElBTkJCVFlDeExRRElBTkIwdlBOQURZQ3dMUURJQU5Ca1QwN0FieTBBeUFEUVFzMkFyaTBBeUFEUWNmenpRQTJBclMwQXlBRFFlbkpBRHNCc0xRRElBTkJCellDckxRRElBTkJ3UFBOQURZQ3FMUURJQU5CL2dJN0FhUzBBeUFEUVFZMkFxQzBBeUFEUWYyT3pnQTJBcHkwQXlBRFFaZmlBRHNCbUxRRElBTkJDVFlDbExRRElBTkJ0L1BOQURZQ2tMUURJQU5CMWdzN0FZeTBBeUFEUVFzMkFvaTBBeUFEUWF6enpRQTJBb1MwQXlBRFFiYjJBenNCZ0xRRElBTkJFVFlDL0xNRElBTkJtL1BOQURZQytMTURJQU5CdHZZRE93SDBzd01nQTBFTE5nTHdzd01nQTBHUTg4MEFOZ0xzc3dNZ0EwSFdDenNCNkxNRElBTkJCVFlDNUxNRElBTkJpL1BOQURZQzRMTURJQU5CbUFzN0FkeXpBeUFEUVFzMkF0aXpBeUFEUVlEenpRQTJBdFN6QXlBRFFaUUxPd0hRc3dNZ0EwRVFOZ0xNc3dNZ0EwSHc4czBBTmdMSXN3TWdBMEdWQ3pzQnhMTURJQU5CRURZQ3dMTURJQU5CNFBMTkFEWUN2TE1ESUFOQnR1RUFPd0c0c3dNZ0EwRUtOZ0swc3dNZ0EwSFc4czBBTmdLd3N3TWdBMEd3L1FNN0FheXpBeUFEUVE4MkFxaXpBeUFEUWNmeXpRQTJBcVN6QXlBRFFiSU1Pd0dnc3dNZ0EwRUtOZ0tjc3dNZ0EwRzk4czBBTmdLWXN3TWdBMEhJL1FNN0FaU3pBeUFEUVE4MkFwQ3pBeUFEUWE3eXpRQTJBb3l6QXlBRFFkYmdBRHNCaUxNRElBTkJDallDaExNRElBTkJwUExOQURZQ2dMTURJQU5CeC8wRE93SDhzZ01nQTBFUU5nTDRzZ01nQTBHVThzMEFOZ0wwc2dNZ0EwSEcvUU03QWZDeUF5QURRUTQyQXV5eUF5QURRWWJ5elFBMkF1aXlBeUFEUWJnTU93SGtzZ01nQTBFSk5nTGdzZ01nQTBIOThjMEFOZ0xjc2dNZ0EwSGJGRHNCMkxJRElBTkJDallDMUxJRElBTkI4L0hOQURZQzBMSURJQU5CMnhJN0FjeXlBeUFEUVFZMkFzaXlBeUFEUWUzeHpRQTJBc1N5QXlBRFFmb0NPd0hBc2dNZ0EwRUdOZ0s4c2dNZ0EwSGJpczRBTmdLNHNnTWdBMEhtQ2pzQnRMSURJQU5CQ2pZQ3NMSURJQU5CNC9ITkFEWUNyTElESUFOQitnQTdBYWl5QXlBRFFRRTJBcVN5QXlBRFFjNkJ6Z0EyQXFDeUF5QURRZDhTT3dHY3NnTWdBMEVITmdLWXNnTWdBMEhjOGMwQU5nS1VzZ01nQTBIZkV6c0JrTElESUFOQkNqWUNqTElESUFOQjB2SE5BRFlDaUxJRElBTkJpdU1BT3dHRXNnTWdBMEVMTmdLQXNnTWdBMEhIOGMwQU5nTDhzUU1nQTBHTDR3QTdBZml4QXlBRFFRbzJBdlN4QXlBRFFiM3h6UUEyQXZDeEF5QURRZTMrQXpzQjdMRURJQU5CR0RZQzZMRURJQU5CcGZITkFEWUM1TEVESUFOQjVlRUFPd0hnc1FNZ0EwRVBOZ0xjc1FNZ0EwR1c4YzBBTmdMWXNRTWdBMEdGNFFBN0FkU3hBeUFEUVE4MkF0Q3hBeUFEUVlmeHpRQTJBc3l4QXlBRFFla0lPd0hJc1FNZ0EwRVpOZ0xFc1FNZ0EwSHU4TTBBTmdMQXNRTWdBMEhuQ0RzQnZMRURJQU5CRVRZQ3VMRURJQU5CM2ZETkFEWUN0TEVESUFOQjdRZzdBYkN4QXlBRFFSWTJBcXl4QXlBRFFjZnd6UUEyQXFpeEF5QURRZXNJT3dHa3NRTWdBMEVPTmdLZ3NRTWdBMEc1OE0wQU5nS2NzUU1nQTBIZzRnQTdBWml4QXlBRFFRZzJBcFN4QXlBRFFiSHd6UUEyQXBDeEF5QURRWlgvQXpzQmpMRURJQU5CRXpZQ2lMRURJQU5CbnZETkFEWUNoTEVESUFOQjV1RUFPd0dBc1FNZ0EwRUtOZ0w4c0FNZ0EwR1U4TTBBTmdMNHNBTWdBMEdNNHdBN0FmU3dBeUFEUVFrMkF2Q3dBeUFEUVl2d3pRQTJBdXl3QXlBRFFZYmhBRHNCNkxBRElBTkJDallDNUxBRElBTkJnZkROQURZQzRMQURJQU5CamdVN0FkeXdBeUFEUVFjMkF0aXdBeUFEUWZydnpRQTJBdFN3QXlBRFFmazlPd0hRc0FNZ0EwRUdOZ0xNc0FNZ0EwSDA3ODBBTmdMSXNBTWdBMEc0QlRzQnhMQURJQU5CQ1RZQ3dMQURJQU5CNisvTkFEWUN2TEFESUFOQm1UMDdBYml3QXlBRFFRVTJBclN3QXlBRFFlYnZ6UUEyQXJDd0F5QURRYVlET3dHc3NBTWdBMEVDTmdLb3NBTWdBMEhrNzgwQU5nS2tzQU1nQTBIRkJqc0JvTEFESUFOQkZUWUNuTEFESUFOQnorL05BRFlDbUxBRElBTkIrZ1k3QVpTd0F5QURRUTAyQXBDd0F5QURRY0x2elFBMkFveXdBeUFEUWJUSkFEc0JpTEFESUFOQkJqWUNoTEFESUFOQnZPL05BRFlDZ0xBRElBTkJqUnc3QWZ5dkF5QURRUW8yQXZpdkF5QURRYkx2elFBMkF2U3ZBeUFEUWFJY093SHdyd01nQTBFSk5nTHNyd01nQTBHcDc4MEFOZ0xvcndNZ0EwR0g0d0E3QWVTdkF5QURRUW8yQXVDdkF5QURRWi92elFBMkF0eXZBeUFEUVlqakFEc0IySzhESUFOQkN6WUMxSzhESUFOQmxPL05BRFlDMEs4RElBTkI4d2M3QWN5dkF5QURRUWcyQXNpdkF5QURRWXp2elFBMkFzU3ZBeUFEUWU3K0F6c0J3SzhESUFOQkdEWUN2SzhESUFOQjlPN05BRFlDdUs4RElBTkI1K0VBT3dHMHJ3TWdBMEVQTmdLd3J3TWdBMEhsN3MwQU5nS3Nyd01nQTBHSDRRQTdBYWl2QXlBRFFRODJBcVN2QXlBRFFkYnV6UUEyQXFDdkF5QURRZHZpQURzQm5LOERJQU5CQ0RZQ21LOERJQU5CenU3TkFEWUNsSzhESUFOQmx2OERPd0dRcndNZ0EwRVROZ0tNcndNZ0EwRzc3czBBTmdLSXJ3TWdBMEhvNFFBN0FZU3ZBeUFEUVFvMkFvQ3ZBeUFEUWJIdXpRQTJBdnl1QXlBRFFZbmpBRHNCK0s0RElBTkJDVFlDOUs0RElBTkJxTzdOQURZQzhLNERJQU5CaU9FQU93SHNyZ01nQTBFS05nTG9yZ01nQTBHZTdzMEFOZ0xrcmdNZ0EwR2Y5Z003QWVDdUF5QURRUkUyQXR5dUF5QURRWTN1elFBMkF0aXVBeUFEUWZJTE93SFVyZ01nQTBFTU5nTFFyZ01nQTBHQjdzMEFOZ0xNcmdNZ0EwSFpDenNCeUs0RElBTkJDVFlDeEs0RElBTkIrTzNOQURZQ3dLNERJQU5CdWZZRE93RzhyZ01nQTBFUE5nSzRyZ01nQTBIcDdjMEFOZ0swcmdNZ0EwRzU5Z003QWJDdUF5QURRUWsyQXF5dUF5QURRZUR0elFBMkFxaXVBeUFEUWRrTE93R2tyZ01nQTBFRE5nS2dyZ01nQTBIZDdjMEFOZ0tjcmdNZ0EwSFovZ003QVppdUF5QURRUW8yQXBTdUF5QURRZFB0elFBMkFwQ3VBeUFEUVlJTE93R01yZ01nQTBFTU5nS0lyZ01nQTBISDdjMEFOZ0tFcmdNZ0EwR3Z6QUE3QVlDdUF5QURRUWMyQXZ5dEF5QURRY0R0elFBMkF2aXRBeUFEUWVMaUFEc0I5SzBESUFOQkNEWUM4SzBESUFOQnVPM05BRFlDN0swRElBTkIxd2c3QWVpdEF5QURRUW8yQXVTdEF5QURRYTd0elFBMkF1Q3RBeUFEUWZVS093SGNyUU1nQTBFS05nTFlyUU1nQTBHazdjMEFOZ0xVclFNZ0EwSDNQVHNCMEswRElBTkJDallDekswRElBTkJtdTNOQURZQ3lLMERJQU5CdEFNN0FjU3RBeUFEUVFVMkFzQ3RBeUFEUVpYdHpRQTJBcnl0QXlBRFFmTTlPd0c0clFNZ0EwRUdOZ0swclFNZ0EwR1A3YzBBTmdLd3JRTWdBMEdhQ3pzQnJLMERJQU5CQ3pZQ3FLMERJQU5CaE8zTkFEWUNwSzBESUFOQmd1TUFPd0dnclFNZ0EwRVNOZ0tjclFNZ0EwSHk3TTBBTmdLWXJRTWdBMEdENHdBN0FaU3RBeUFEUVJVMkFwQ3RBeUFEUWQzc3pRQTJBb3l0QXlBRFFZSGpBRHNCaUswRElBTkJEallDaEswRElBTkJ6K3pOQURZQ2dLMERJQU5CK1FrN0FmeXNBeUFEUVJRMkF2aXNBeUFEUWJ2c3pRQTJBdlNzQXlBRFFjc0lPd0h3ckFNZ0EwRU1OZ0xzckFNZ0EwR3Y3TTBBTmdMb3JBTWdBMEdxQ3pzQjVLd0RJQU5CRmpZQzRLd0RJQU5CbWV6TkFEWUMzS3dESUFOQnFnczdBZGlzQXlBRFFSSTJBdFNzQXlBRFFZZnN6UUEyQXRDc0F5QURRWWJqQURzQnpLd0RJQU5CRVRZQ3lLd0RJQU5COXV2TkFEWUN4S3dESUFOQjFlSUFPd0hBckFNZ0EwRUpOZ0s4ckFNZ0EwSHQ2ODBBTmdLNHJBTWdBMEhsL3dNN0FiU3NBeUFEUVF3MkFyQ3NBeUFEUWVIcnpRQTJBcXlzQXlBRFFhVUJPd0dvckFNZ0EwRUROZ0trckFNZ0EwR05nczRBTmdLZ3JBTWdBMEhXNGdBN0FaeXNBeUFEUVFnMkFwaXNBeUFEUWRucnpRQTJBcFNzQXlBRFFkRU5Pd0dRckFNZ0EwRVhOZ0tNckFNZ0EwSEM2ODBBTmdLSXJBTWdBMEdVK1FNN0FZU3NBeUFEUVJJMkFvQ3NBeUFEUWJEcnpRQTJBdnlyQXlBRFFkajRBenNCK0tzRElBTkJGVFlDOUtzRElBTkJtK3ZOQURZQzhLc0RJQU5CM2ZrRE93SHNxd01nQTBFVU5nTG9xd01nQTBHSDY4MEFOZ0xrcXdNZ0EwSDAvUU03QWVDckF5QURRUTgyQXR5ckF5QURRZmpxelFBMkF0aXJBeUFEUWZQOUF6c0IxS3NESUFOQkVEWUMwS3NESUFOQjZPck5BRFlDektzRElBTkJqUDBET3dISXF3TWdBMEVaTmdMRXF3TWdBMEhQNnMwQU5nTEFxd01nQTBHTC9RTTdBYnlyQXlBRFFSbzJBcmlyQXlBRFFiWHF6UUEyQXJTckF5QURRWXI5QXpzQnNLc0RJQU5CR0RZQ3JLc0RJQU5CbmVyTkFEWUNxS3NESUFOQnBndzdBYVNyQXlBRFFSTTJBcUNyQXlBRFFZcnF6UUEyQXB5ckF5QURRZkw5QXpzQm1Lc0RJQU5CRGpZQ2xLc0RJQU5CL09uTkFEWUNrS3NESUFOQnIvY0RPd0dNcXdNZ0EwRVVOZ0tJcXdNZ0EwSG82YzBBTmdLRXF3TWdBMEhTRFRzQmdLc0RJQU5CRHpZQy9Lb0RJQU5CMmVuTkFEWUMrS29ESUFOQnlndzdBZlNxQXlBRFFRazJBdkNxQXlBRFFkRHB6UUEyQXV5cUF5QURRZlU5T3dIb3FnTWdBMEVKTmdMa3FnTWdBMEhINmMwQU5nTGdxZ01nQTBHUFBUc0IzS29ESUFOQkNqWUMyS29ESUFOQnZlbk5BRFlDMUtvRElBTkIvd0U3QWRDcUF5QURRUWsyQXN5cUF5QURRZVdJemdBMkFzaXFBeUFEUWZjQ093SEVxZ01nQTBFTE5nTEFxZ01nQTBHeTZjMEFOZ0s4cWdNZ0EwSG95UUE3QWJpcUF5QURRUWMyQXJTcUF5QURRYXZwelFBMkFyQ3FBeUFEUWVNSU93R3NxZ01nQTBFTE5nS29xZ01nQTBHZzZjMEFOZ0trcWdNZ0EwSHMvZ003QWFDcUF5QURRUmcyQXB5cUF5QURRWWpwelFBMkFwaXFBeUFEUWVQaEFEc0JsS29ESUFOQkR6WUNrS29ESUFOQitlak5BRFlDaktvRElBTkJnK0VBT3dHSXFnTWdBMEVQTmdLRXFnTWdBMEhxNk0wQU5nS0FxZ01nQTBIT0hEc0IvS2tESUFOQkREWUMrS2tESUFOQjN1ak5BRFlDOUtrRElBTkIwZUlBT3dId3FRTWdBMEVJTmdMc3FRTWdBMEhXNk0wQU5nTG9xUU1nQTBHVS93TTdBZVNwQXlBRFFSTTJBdUNwQXlBRFFjUG96UUEyQXR5cEF5QURRZVRoQURzQjJLa0RJQU5CQ2pZQzFLa0RJQU5CdWVqTkFEWUMwS2tESUFOQmhPRUFPd0hNcVFNZ0EwRUtOZ0xJcVFNZ0EwR3Y2TTBBTmdMRXFRTWdBMEd2RkRzQndLa0RJQU5CQ2pZQ3ZLa0RJQU5CcGVqTkFEWUN1S2tESUFOQnJ4VTdBYlNwQXlBRFFRbzJBckNwQXlBRFFadm96UUEyQXF5cEF5QURRZExpQURzQnFLa0RJQU5CQ1RZQ3BLa0RJQU5Ca3VqTkFEWUNvS2tESUFOQnJ4STdBWnlwQXlBRFFRWTJBcGlwQXlBRFFZem96UUEyQXBTcEF5QURRZjBCT3dHUXFRTWdBMEVHTmdLTXFRTWdBMEh0aGM0QU5nS0lxUU1nQTBHdkV6c0JoS2tESUFOQkNUWUNnS2tESUFOQmcrak5BRFlDL0tnRElBTkJ6dVlBT3dINHFBTWdBMEVMTmdMMHFBTWdBMEg0NTgwQU5nTHdxQU1nQTBINUFEc0I3S2dESUFOQkFUWUM2S2dESUFOQnpZSE9BRFlDNUtnRElBTkI0d1U3QWVDb0F5QURRUWsyQXR5b0F5QURRZS9uelFBMkF0aW9BeUFEUWJQSkFEc0IxS2dESUFOQkJqWUMwS2dESUFOQjZlZk5BRFlDektnRElBTkIyUDRET3dISXFBTWdBMEVLTmdMRXFBTWdBMEhmNTgwQU5nTEFxQU1nQTBHK0J6c0J2S2dESUFOQkFqWUN1S2dESUFOQjhNUFBBRFlDdEtnRElBTkI3UW83QWJDb0F5QURRUXMyQXF5b0F5QURRZFRuelFBMkFxaW9BeUFEUVlzOU93R2txQU1nQTBFS05nS2dxQU1nQTBISzU4MEFOZ0tjcUFNZ0EwR05QVHNCbUtnRElBTkJDVFlDbEtnRElBTkJ3ZWZOQURZQ2tLZ0RJQU5CNThrQU93R01xQU1nQTBFSE5nS0lxQU1nQTBHNjU4MEFOZ0tFcUFNZ0EwR1M0Z0E3QVlDb0F5QURRUWsyQXZ5bkF5QURRYkhuelFBMkF2aW5BeUFEUWIwR093SDBwd01nQTBFSk5nTHdwd01nQTBHbzU4MEFOZ0xzcHdNZ0EwSDRBRHNCNktjRElBTkJBVFlDNUtjRElBTkJ6SUhPQURZQzRLY0RJQU5CdndNN0FkeW5BeUFEUVFRMkF0aW5BeUFEUWFUbnpRQTJBdFNuQXlBRFFZMEZPd0hRcHdNZ0EwRUhOZ0xNcHdNZ0EwR2Q1ODBBTmdMSXB3TWdBMEczQlRzQnhLY0RJQU5CQ1RZQ3dLY0RJQU5CbE9mTkFEWUN2S2NESUFOQm1EMDdBYmluQXlBRFFRVTJBclNuQXlBRFFZL256UUEyQXJDbkF5QURRY0RFQURzQnJLY0RJQU5CRFRZQ3FLY0RJQU5CZ3VmTkFEWUNwS2NESUFOQnNza0FPd0dncHdNZ0EwRUdOZ0tjcHdNZ0EwSDg1czBBTmdLWXB3TWdBMEduSERzQmxLY0RJQU5CQ2pZQ2tLY0RJQU5COHViTkFEWUNqS2NESUFOQjV2OERPd0dJcHdNZ0EwRU1OZ0tFcHdNZ0EwSG01czBBTmdLQXB3TWdBMEdwd1FBN0FmeW1BeUFEUVFNMkF2aW1BeUFEUWVQbXpRQTJBdlNtQXlBRFFlYitBenNCOEtZRElBTkJFellDN0tZRElBTkIwT2JOQURZQzZLWURJQU5COHVFQU93SGtwZ01nQTBFS05nTGdwZ01nQTBIRzVzMEFOZ0xjcGdNZ0EwR1M0UUE3QWRpbUF5QURRUW8yQXRTbUF5QURRYnptelFBMkF0Q21BeUFEUWRmK0F6c0J6S1lESUFOQkNqWUN5S1lESUFOQnN1Yk5BRFlDeEtZRElBTkIzK0lBT3dIQXBnTWdBMEVJTmdLOHBnTWdBMEdxNXMwQU5nSzRwZ01nQTBIdzRRQTdBYlNtQXlBRFFRbzJBckNtQXlBRFFhRG16UUEyQXF5bUF5QURRWkRoQURzQnFLWURJQU5CQ2pZQ3BLWURJQU5CbHViTkFEWUNvS1lESUFOQnM4c0FPd0djcGdNZ0EwRVhOZ0tZcGdNZ0EwSC81YzBBTmdLVXBnTWdBMEcxeXdBN0FaQ21BeUFEUVJ3MkFveW1BeUFEUWVQbHpRQTJBb2ltQXlBRFFabmdBRHNCaEtZRElBTkJIallDZ0tZRElBTkJ4ZVhOQURZQy9LVURJQU5CbU9BQU93SDRwUU1nQTBFZE5nTDBwUU1nQTBHbzVjMEFOZ0x3cFFNZ0EwR1B6QUE3QWV5bEF5QURRUTQyQXVpbEF5QURRWnJselFBMkF1U2xBeUFEUVliTUFEc0I0S1VESUFOQkNUWUMzS1VESUFOQmtlWE5BRFlDMktVRElBTkJvY3NBT3dIVXBRTWdBMEVMTmdMUXBRTWdBMEdHNWMwQU5nTE1wUU1nQTBHNnpBQTdBY2lsQXlBRFFSQTJBc1NsQXlBRFFmYmt6UUEyQXNDbEF5QURRYXZMQURzQnZLVURJQU5CRURZQ3VLVURJQU5CNXVUTkFEWUN0S1VESUFOQnQ4c0FPd0d3cFFNZ0EwRWFOZ0tzcFFNZ0EwSE01TTBBTmdLb3BRTWdBMEc1eXdBN0FhU2xBeUFEUVI4MkFxQ2xBeUFEUWEza3pRQTJBcHlsQXlBRFFaZmdBRHNCbUtVRElBTkJHellDbEtVRElBTkJrdVROQURZQ2tLVURJQU5CbHVBQU93R01wUU1nQTBFYU5nS0lwUU1nQTBINDQ4MEFOZ0tFcFFNZ0EwSEJ5d0E3QVlDbEF5QURRUmsyQXZ5a0F5QURRZC9qelFBMkF2aWtBeUFEUWNQTEFEc0I5S1FESUFOQkhqWUM4S1FESUFOQndlUE5BRFlDN0tRRElBTkJ2Y3NBT3dIb3BBTWdBMEVaTmdMa3BBTWdBMEdvNDgwQU5nTGdwQU1nQTBHL3l3QTdBZHlrQXlBRFFSNDJBdGlrQXlBRFFZcmp6UUEyQXRTa0F5QURRY2pMQURzQjBLUURJQU5CSnpZQ3pLUURJQU5CNCtMTkFEWUN5S1FESUFOQng4c0FPd0hFcEFNZ0EwRU1OZ0xBcEFNZ0EwSFg0czBBTmdLOHBBTWdBMEhFL0FNN0FiaWtBeUFEUVI4MkFyU2tBeUFEUWJqaXpRQTJBckNrQXlBRFFZL2dBRHNCcktRRElBTkJGellDcUtRRElBTkJvZUxOQURZQ3BLUURJQU5Cdy93RE93R2dwQU1nQTBFZU5nS2NwQU1nQTBHRDRzMEFOZ0tZcEFNZ0EwR080QUE3QVpTa0F5QURRUlkyQXBDa0F5QURRZTNoelFBMkFveWtBeUFEUWRuTEFEc0JpS1FESUFOQkVqWUNoS1FESUFOQjIrSE5BRFlDZ0tRRElBTkJ5OHNBT3dIOG93TWdBMEVMTmdMNG93TWdBMEhRNGMwQU5nTDBvd01nQTBIbXl3QTdBZkNqQXlBRFFRczJBdXlqQXlBRFFjWGh6UUEyQXVpakF5QURRWUU5T3dIa293TWdBMEVHTmdMZ293TWdBMEcvNGMwQU5nTGNvd01nQTBIZDRnQTdBZGlqQXlBRFFRazJBdFNqQXlBRFFiYmh6UUEyQXRDakF5QURRZDdpQURzQnpLTURJQU5CQ0RZQ3lLTURJQU5CcnVITkFEWUN4S01ESUFOQjhlRUFPd0hBb3dNZ0EwRUtOZ0s4b3dNZ0EwR2s0YzBBTmdLNG93TWdBMEdZd2dBN0FiU2pBeUFEUVFzMkFyQ2pBeUFEUWJuRnp3QTJBcXlqQXlBRFFaSGhBRHNCcUtNRElBTkJDallDcEtNRElBTkJtdUhOQURZQ29LTURJQU5CaVQwN0FaeWpBeUFEUVFrMkFwaWpBeUFEUVpIaHpRQTJBcFNqQXlBRFFZYzlPd0dRb3dNZ0EwRUtOZ0tNb3dNZ0EwR0g0YzBBTmdLSW93TWdBMEdGUFRzQmhLTURJQU5CQ1RZQ2dLTURJQU5CL3VETkFEWUMvS0lESUFOQjlRSTdBZmlpQXlBRFFRczJBdlNpQXlBRFFmUGd6UUEyQXZDaUF5QURRZWJKQURzQjdLSURJQU5CQnpZQzZLSURJQU5CN09ETkFEWUM1S0lESUFOQjNlY0FPd0hnb2dNZ0EwRUlOZ0xjb2dNZ0EwSGs0TTBBTmdMWW9nTWdBMEdHL1FNN0FkU2lBeUFEUVJnMkF0Q2lBeUFEUWN6Z3pRQTJBc3lpQXlBRFFhUU1Pd0hJb2dNZ0EwRVROZ0xFb2dNZ0EwRzU0TTBBTmdMQW9nTWdBMEh1L1FNN0FieWlBeUFEUVE0MkFyaWlBeUFEUWF2Z3pRQTJBclNpQXlBRFFjZ01Pd0d3b2dNZ0EwRUpOZ0tzb2dNZ0EwR2k0TTBBTmdLb29nTWdBMEcwL0FNN0FhU2lBeUFEUVJZMkFxQ2lBeUFEUVl6Z3pRQTJBcHlpQXlBRFFaemdBRHNCbUtJRElBTkJDRFlDbEtJRElBTkJoT0ROQURZQ2tLSURJQU5CMStZQU93R01vZ01nQTBFTE5nS0lvZ01nQTBINTM4MEFOZ0tFb2dNZ0EwSHU0UUE3QVlDaUF5QURRUTgyQXZ5aEF5QURRZXJmelFBMkF2aWhBeUFEUVk3aEFEc0I5S0VESUFOQkR6WUM4S0VESUFOQjI5L05BRFlDN0tFRElBTkIyT0lBT3dIb29RTWdBMEVJTmdMa29RTWdBMEhUMzgwQU5nTGdvUU1nQTBHYy93TTdBZHloQXlBRFFSTTJBdGloQXlBRFFjRGZ6UUEyQXRTaEF5QURRZS9oQURzQjBLRURJQU5CQ2pZQ3pLRURJQU5CdHQvTkFEWUN5S0VESUFOQmorRUFPd0hFb1FNZ0EwRUtOZ0xBb1FNZ0EwR3MzODBBTmdLOG9RTWdBMEhaNGdBN0FiaWhBeUFEUVFrMkFyU2hBeUFEUWFQZnpRQTJBckNoQXlBRFFZTTlPd0dzb1FNZ0EwRUdOZ0tvb1FNZ0EwR2QzODBBTmdLa29RTWdBMEgzQURzQm9LRURJQU5CQVRZQ25LRURJQU5CeTRIT0FEWUNtS0VESUFOQjlPRUFPd0dVb1FNZ0EwRUtOZ0tRb1FNZ0EwR1QzODBBTmdLTW9RTWdBMEdVNFFBN0FZaWhBeUFEUVFvMkFvU2hBeUFEUVluZnpRQTJBb0NoQXlBRFFZd0ZPd0g4b0FNZ0EwRUhOZ0w0b0FNZ0EwR0MzODBBTmdMMG9BTWdBMEg5UERzQjhLQURJQU5CQmpZQzdLQURJQU5CL043TkFEWUM2S0FESUFOQnNja0FPd0hrb0FNZ0EwRUdOZ0xnb0FNZ0EwSDIzczBBTmdMY29BTWdBMEg2NFFBN0FkaWdBeUFEUVFvMkF0U2dBeUFEUWV6ZXpRQTJBdENnQXlBRFFaNy9BenNCektBRElBTkJGellDeUtBRElBTkIxZDdOQURZQ3hLQURJQU5CbStFQU93SEFvQU1nQTBFT05nSzhvQU1nQTBISDNzMEFOZ0s0b0FNZ0EwSCs0UUE3QWJTZ0F5QURRUmMyQXJDZ0F5QURRYkRlelFBMkFxeWdBeUFEUVo3aEFEc0JxS0FESUFOQkZ6WUNwS0FESUFOQm1kN05BRFlDb0tBRElBTkIrQW83QVp5Z0F5QURRUW8yQXBpZ0F5QURRWS9lelFBMkFwU2dBeUFEUWRiK0F6c0JrS0FESUFOQkNqWUNqS0FESUFOQmhkN05BRFlDaUtBRElBTkJvOGdBT3dHRW9BTWdBMEVMTmdLQW9BTWdBMEg2M2MwQU5nTDhud01nQTBHanlBQTdBZmlmQXlBRFFRdzJBdlNmQXlBRFFlN2R6UUEyQXZDZkF5QURRWU1WT3dIc253TWdBMEVQTmdMb253TWdBMEhmM2MwQU5nTGtud01nQTBHREVqc0I0SjhESUFOQkN6WUMzSjhESUFOQjFOM05BRFlDMko4RElBTkJneE03QWRTZkF5QURRUTQyQXRDZkF5QURRY2JkelFBMkFzeWZBeUFEUWMwVk93SElud01nQTBFT05nTEVud01nQTBHNDNjMEFOZ0xBbndNZ0EwSE5FanNCdko4RElBTkJDallDdUo4RElBTkJydDNOQURZQ3RKOERJQU5CelJNN0FiQ2ZBeUFEUVEwMkFxeWZBeUFEUWFIZHpRQTJBcWlmQXlBRFFmamhBRHNCcEo4RElBTkJDallDb0o4RElBTkJsOTNOQURZQ25KOERJQU5CaXdVN0FaaWZBeUFEUVFVMkFwU2ZBeUFEUVpMZHpRQTJBcENmQXlBRFFhUEVBRHNCako4RElBTkJEVFlDaUo4RElBTkJoZDNOQURZQ2hKOERJQU5CcGNRQU93R0Fud01nQTBFTk5nTDhuZ01nQTBINDNNMEFOZ0w0bmdNZ0EwSCtDanNCOUo0RElBTkJDellDOEo0RElBTkI3ZHpOQURZQzdKNERJQU5CeUFVN0FlaWVBeUFEUVE4MkF1U2VBeUFEUWQ3Y3pRQTJBdUNlQXlBRFFjd0ZPd0hjbmdNZ0EwRVNOZ0xZbmdNZ0EwSE0zTTBBTmdMVW5nTWdBMEdwQmpzQjBKNERJQU5CRkRZQ3pKNERJQU5CdU56TkFEWUN5SjRESUFOQmpRWTdBY1NlQXlBRFFSUTJBc0NlQXlBRFFhVGN6UUEyQXJ5ZUF5QURRZndBT3dHNG5nTWdBMEVMTmdLMG5nTWdBMEdaM00wQU5nS3duZ01nQTBIQXpBQTdBYXllQXlBRFFRVTJBcWllQXlBRFFaVGN6UUEyQXFTZUF5QURRZm5oQURzQm9KNERJQU5CQ2pZQ25KNERJQU5CaXR6TkFEWUNtSjRESUFOQjdmWURPd0dVbmdNZ0EwRVBOZ0tRbmdNZ0EwSDcyODBBTmdLTW5nTWdBMEhzOWdNN0FZaWVBeUFEUVJBMkFvU2VBeUFEUWV2YnpRQTJBb0NlQXlBRFFldjJBenNCL0owRElBTkJEallDK0owRElBTkIzZHZOQURZQzlKMERJQU5CcEEwN0FmQ2RBeUFEUVFrMkF1eWRBeUFEUWRUYnpRQTJBdWlkQXlBRFFiSUlPd0hrblFNZ0EwRUtOZ0xnblFNZ0EwSEsyODBBTmdMY25RTWdBMEhYd1FBN0FkaWRBeUFEUVFZMkF0U2RBeUFEUWNUYnpRQTJBdENkQXlBRFFmODhPd0hNblFNZ0EwRUpOZ0xJblFNZ0EwRzcyODBBTmdMRW5RTWdBMEhseVFBN0FjQ2RBeUFEUVFjMkFyeWRBeUFEUWJUYnpRQTJBcmlkQXlBRFFmRUxPd0cwblFNZ0EwRU1OZ0t3blFNZ0EwR28yODBBTmdLc25RTWdBMEh3Q3pzQnFKMERJQU5CRERZQ3BKMERJQU5Cbk52TkFEWUNvSjBESUFOQnkvWURPd0djblFNZ0EwRU9OZ0tZblFNZ0EwR08yODBBTmdLVW5RTWdBMEhMOWdNN0FaQ2RBeUFEUVFnMkFveWRBeUFEUVliYnpRQTJBb2lkQXlBRFFkVUxPd0dFblFNZ0EwRUpOZ0tBblFNZ0EwSDkyczBBTmdMOG5BTWdBMEcxOWdNN0FmaWNBeUFEUVE4MkF2U2NBeUFEUWU3YXpRQTJBdkNjQXlBRFFiWDJBenNCN0p3RElBTkJDellDNkp3RElBTkI0OXJOQURZQzVKd0RJQU5CdGZZRE93SGduQU1nQTBFSk5nTGNuQU1nQTBIYTJzMEFOZ0xZbkFNZ0EwSFZDenNCMUp3RElBTkJBellDMEp3RElBTkIxOXJOQURZQ3pKd0RJQU5COStFQU93SEluQU1nQTBFS05nTEVuQU1nQTBITjJzMEFOZ0xBbkFNZ0EwRzFGRHNCdkp3RElBTkJDallDdUp3RElBTkJ3OXJOQURZQ3RKd0RJQU5CdFJVN0FiQ2NBeUFEUVFvMkFxeWNBeUFEUWJuYXpRQTJBcWljQXlBRFFiVVNPd0drbkFNZ0EwRUdOZ0tnbkFNZ0EwR3oyczBBTmdLY25BTWdBMEgyQURzQm1Kd0RJQU5CQVRZQ2xKd0RJQU5CeW9IT0FEWUNrSndESUFOQndSVTdBWXljQXlBRFFSSTJBb2ljQXlBRFFhSGF6UUEyQW9TY0F5QURRY0VTT3dHQW5BTWdBMEVPTmdMOG13TWdBMEdUMnMwQU5nTDRtd01nQTBIQkV6c0I5SnNESUFOQkVUWUM4SnNESUFOQmd0ck5BRFlDN0pzRElBTkJ3aFU3QWVpYkF5QURRUk0yQXVTYkF5QURRZS9aelFBMkF1Q2JBeUFEUWNJU093SGNtd01nQTBFUE5nTFltd01nQTBIZzJjMEFOZ0xVbXdNZ0EwSENFenNCMEpzRElBTkJFallDekpzRElBTkJ6dG5OQURZQ3lKc0RJQU5Cd2hRN0FjU2JBeUFEUVE4MkFzQ2JBeUFEUWIvWnpRQTJBcnliQXlBRFFZb1VPd0c0bXdNZ0EwRUtOZ0swbXdNZ0EwRzEyYzBBTmdLd213TWdBMEdLRlRzQnJKc0RJQU5CQ2pZQ3FKc0RJQU5CcTluTkFEWUNwSnNESUFOQmloSTdBYUNiQXlBRFFRWTJBcHliQXlBRFFhWFp6UUEyQXBpYkF5QURRWW9UT3dHVW13TWdBMEVKTmdLUW13TWdBMEdjMmMwQU5nS01td01nQTBIMVBEc0JpSnNESUFOQkN6WUNoSnNESUFOQmtkbk5BRFlDZ0pzRElBTkIrVHc3QWZ5YUF5QURRUXMyQXZpYUF5QURRWWJaelFBMkF2U2FBeUFEUWVrQ093SHdtZ01nQTBFR05nTHNtZ01nQTBHQTJjMEFOZ0xvbWdNZ0EwR3hDVHNCNUpvRElBTkJGellDNEpvRElBTkI2ZGpOQURZQzNKb0RJQU5CcndrN0FkaWFBeUFEUVJFMkF0U2FBeUFEUWRqWXpRQTJBdENhQXlBRFFlbitBenNCekpvRElBTkJGellDeUpvRElBTkJ3ZGpOQURZQ3hKb0RJQU5CcGVFQU93SEFtZ01nQTBFT05nSzhtZ01nQTBHejJNMEFOZ0s0bWdNZ0EwSEY0QUE3QWJTYUF5QURRUTQyQXJDYUF5QURRYVhZelFBMkFxeWFBeUFEUWQ0SU93R29tZ01nQTBFT05nS2ttZ01nQTBHWDJNMEFOZ0tnbWdNZ0EwSHZBanNCbkpvRElBTkJCVFlDbUpvRElBTkJvb2pPQURZQ2xKb0RJQU5COHhRN0FaQ2FBeUFEUVFzMkFveWFBeUFEUVl6WXpRQTJBb2lhQXlBRFFkUUZPd0dFbWdNZ0EwRUpOZ0tBbWdNZ0EwR0QyTTBBTmdMOG1RTWdBMEdkQmpzQitKa0RJQU5CRGpZQzlKa0RJQU5COWRmTkFEWUM4SmtESUFOQitOTUFPd0hzbVFNZ0EwRUhOZ0xvbVFNZ0EwSHUxODBBTmdMa21RTWdBMEhOQnpzQjRKa0RJQU5CRERZQzNKa0RJQU5CNHRmTkFEWUMySmtESUFOQmlnVTdBZFNaQXlBRFFRdzJBdENaQXlBRFFkYlh6UUEyQXN5WkF5QURRYkFIT3dISW1RTWdBMEVVTmdMRW1RTWdBMEhDMTgwQU5nTEFtUU1nQTBITEJ6c0J2SmtESUFOQkR6WUN1SmtESUFOQnM5Zk5BRFlDdEprRElBTkI1dmpLQURZQ2tCOGdBMEVHTmdLVUh5QURRZWdET3dHWUh5QURRZXo0eWdBMkFwd2ZJQU5CQ0RZQ29COGdBMEcyQWpzQnBCOGdBMEgwK01vQU5nS29IeUFEUVFjMkFxd2ZJQU5Cd01rQU93R3dIeUFEUWZhTHpnQTJBclFmSUFOQkREWUN1QjhnQTBHMkFqc0J2QjhnQTBINytNb0FOZ0xBSHlBRFFRazJBc1FmSUFOQnNqdzdBY2dmSUFOQmhQbktBRFlDekI4Z0EwRUxOZ0xRSHlBRFFkUUtPd0hVSHlBRFFZLzV5Z0EyQXRnZklBTkJDellDM0I4Z0EwRy9DanNCNEI4Z0EwR2ErY29BTmdMa0h5QURRUXMyQXVnZklBTkJwUWc3QWV3ZklBTkJwZm5LQURZQzhCOGdBMEVLTmdMMEh5QURRZVlIT3dINEh5QURRYS81eWdBMkF2d2ZJQU5CQlRZQ2dDQWdBMEdZQXpzQmhDQWdBMEcwK2NvQU5nS0lJQ0FEUVFzMkFvd2dJQU5CakFnN0FaQWdJQU5Cdi9uS0FEWUNsQ0FnQTBFS05nS1lJQ0FEUWJROE93R2NJQ0FEUWNuNXlnQTJBcUFnSUFOQkNqWUNwQ0FnQTBHci9nTTdBYWdnSUFOQjAvbktBRFlDckNBZ0EwRU5OZ0t3SUNBRFFZQUpPd0cwSUNBRFFlRDV5Z0EyQXJnZ0lBTkJDallDdkNBZ0EwSGVCenNCd0NBZ0EwSHErY29BTmdMRUlDQURRUXMyQXNnZ0lBTkI3Z2c3QWN3Z0lBTkI5Zm5LQURZQzBDQWdBMEVHTmdMVUlDQURRZXZ1QXpzQjJDQWdBMEhvZ000QU5nTGNJQ0FEUVFFMkF1QWdJQU5CekFBN0FlUWdJQU5CKy9uS0FEWUM2Q0FnQTBFQ05nTHNJQ0FEUWNjRE93SHdJQ0FEUWYzNXlnQTJBdlFnSUFOQkFqWUMrQ0FnQTBHLzdRTTdBZndnSUFOQmdvek9BRFlDZ0NFZ0EwRUdOZ0tFSVNBRFFia0NPd0dJSVNBRFFiREN6d0EyQW93aElBTkJCallDa0NFZ0EwR2JCenNCbENFZ0EwR29qTTRBTmdLWUlTQURRUVkyQXB3aElBTkJ2UUk3QWFBaElBTkIvL25LQURZQ3BDRWdBMEVJTmdLb0lTQURRYnNDT3dHc0lTQURRWWY2eWdBMkFyQWhJQU5CQnpZQ3RDRWdBMEhCeVFBN0FiZ2hJQU5CanZyS0FEWUN2Q0VnQTBFUU5nTEFJU0FEUWJ3OE93SEVJU0FEUWVHTnpnQTJBc2doSUFOQkREWUN6Q0VnQTBHN0Fqc0IwQ0VnQTBHZStzb0FOZ0xVSVNBRFFRUTJBdGdoSUFOQnZ3STdBZHdoSUFOQm92cktBRFlDNENFZ0EwRUtOZ0xrSVNBRFFiOENPd0hvSVNBRFFhejZ5Z0EyQXV3aElBTkJDVFlDOENFZ0EwRzJQRHNCOUNFZ0EwRzErc29BTmdMNElTQURRUTgyQXZ3aElBTkJ1RHc3QVlBaUlBTkJ4UHJLQURZQ2hDSWdBMEVNTmdLSUlpQURRYndLT3dHTUlpQURRZEQ2eWdBMkFwQWlJQU5CQWpZQ2xDSWdBMEhJQXpzQm1DSWdBMEhTK3NvQU5nS2NJaUFEUVFzMkFxQWlJQU5CaVFnN0FhUWlJQU5CM2ZyS0FEWUNxQ0lnQTBFS05nS3NJaUFEUWJvOE93R3dJaUFEUWVmNnlnQTJBclFpSUFOQkNqWUN1Q0lnQTBHcy9nTTdBYndpSUFOQjJJVE9BRFlDd0NJZ0EwRUdOZ0xFSWlBRFFjRUNPd0hJSWlBRFFmSDZ5Z0EyQXN3aUlBTkJDellDMENJZ0EwSDU3UU03QWRRaUlBTkIvUHJLQURZQzJDSWdBMEVHTmdMY0lpQURRZXp1QXpzQjRDSWdBMEhwZ000QU5nTGtJaUFEUVFFMkF1Z2lJQU5CelFBN0Fld2lJQU5CZ3Z2S0FEWUM4Q0lnQTBFSU5nTDBJaUFEUVlibkFEc0IrQ0lnQTBHSys4b0FOZ0w4SWlBRFFRWTJBb0FqSUFOQjBPMERPd0dFSXlBRFFaRDd5Z0EyQW9naklBTkJDellDakNNZ0EwR3Y3d003QVpBaklBTkJtL3ZLQURZQ2xDTWdBMEVHTmdLWUl5QURRYjQ4T3dHY0l5QURRYUg3eWdBMkFxQWpJQU5CQnpZQ3BDTWdBMEhDeVFBN0FhZ2pJQU5CcVB2S0FEWUNyQ01nQTBFS05nS3dJeUFEUWNBOE93RzBJeUFEUWJMN3lnQTJBcmdqSUFOQkNUWUN2Q01nQTBIQ1BEc0J3Q01nQTBHNys4b0FOZ0xFSXlBRFFRczJBc2dqSUFOQnhBbzdBY3dqSUFOQnh2dktBRFlDMENNZ0EwRUtOZ0xVSXlBRFFhMytBenNCMkNNZ0EwSFErOG9BTmdMY0l5QURRUVkyQXVBaklBTkI3ZTRET3dIa0l5QURRZGI3eWdBMkF1Z2pJQU5CQnpZQzdDTWdBMEdjQXpzQjhDTWdBMEcyd3M4QU5nTDBJeUFEUVFJMkF2Z2pJQU5CbkFjN0Fmd2pJQU5CNm9ET0FEWUNnQ1FnQTBFQk5nS0VKQ0FEUWM0QU93R0lKQ0FEUWQzN3lnQTJBb3drSUFOQkFqWUNrQ1FnQTBIS0F6c0JsQ1FnQTBIdWlNNEFOZ0tZSkNBRFFRWTJBcHdrSUFOQnd3STdBYUFrSUFOQnI0bk9BRFlDcENRZ0EwRUdOZ0tvSkNBRFFjY0NPd0dzSkNBRFFkLzd5Z0EyQXJBa0lBTkJDRFlDdENRZ0EwSEZBanNCdUNRZ0EwSG4rOG9BTmdLOEpDQURRUWMyQXNBa0lBTkJ3OGtBT3dIRUpDQURRZTc3eWdBMkFzZ2tJQU5CRURZQ3pDUWdBMEhLUERzQjBDUWdBMEhoaHM0QU5nTFVKQ0FEUVF3MkF0Z2tJQU5CeFFJN0Fkd2tJQU5CL3Z2S0FEWUM0Q1FnQTBFS05nTGtKQ0FEUWNROE93SG9KQ0FEUVlqOHlnQTJBdXdrSUFOQkNUWUM4Q1FnQTBIR1BEc0I5Q1FnQTBHUi9Nb0FOZ0w0SkNBRFFRSTJBdndrSUFOQnlnSTdBWUFsSUFOQmsvektBRFlDaENVZ0EwRUpOZ0tJSlNBRFFaMERPd0dNSlNBRFFaejh5Z0EyQXBBbElBTkJDVFlDbENVZ0EwSG93Z0E3QVpnbElBTkJwZnpLQURZQ25DVWdBMEVDTmdLZ0pTQURRY3NET3dHa0pTQURRYWY4eWdBMkFxZ2xJQU5CQ3pZQ3JDVWdBMEdLQ0RzQnNDVWdBMEd5L01vQU5nSzBKU0FEUVFvMkFyZ2xJQU5CeUR3N0Fid2xJQU5CdlB6S0FEWUN3Q1VnQTBFS05nTEVKU0FEUWE3K0F6c0J5Q1VnQTBIRy9Nb0FOZ0xNSlNBRFFRczJBdEFsSUFOQnhnbzdBZFFsSUFOQjBmektBRFlDMkNVZ0EwRUdOZ0xjSlNBRFFlN3VBenNCNENVZ0EwSEpqYzRBTmdMa0pTQURRUVkyQXVnbElBTkIwUUU3QWV3bElBTkIxL3pLQURZQzhDVWdBMEVMTmdMMEpTQURRZkh2QXpzQitDVWdBMEc0d3M4QU5nTDhKU0FEUVFJMkFvQW1JQU5CblFjN0FZUW1JQU5CNjRET0FEWUNpQ1lnQTBFQk5nS01KaUFEUWM4QU93R1FKaUFEUWVTRXpnQTJBcFFtSUFOQkFqWUNtQ1lnQTBIU0Fqc0JuQ1lnQTBIaS9Nb0FOZ0tnSmlBRFFRYzJBcVFtSUFOQit1MERPd0dvSmlBRFFlaUt6Z0EyQXF3bUlBTkJCallDc0NZZ0EwSFRBVHNCdENZZ0EwSHAvTW9BTmdLNEppQURRUXMyQXJ3bUlBTkI4KzhET3dIQUppQURRZlQ4eWdBMkFzUW1JQU5CRHpZQ3lDWWdBMEhvQ1RzQnpDWWdBMEdEL2NvQU5nTFFKaUFEUVJjMkF0UW1JQU5CNmdrN0FkZ21JQU5CbXYzS0FEWUMzQ1lnQTBFR05nTGdKaUFEUWM0Q093SGtKaUFEUWFEOXlnQTJBdWdtSUFOQkJqWUM3Q1lnQTBIUkF6c0I4Q1lnQTBHbS9jb0FOZ0wwSmlBRFFRNDJBdmdtSUFOQm53TTdBZndtSUFOQnRQM0tBRFlDZ0NjZ0EwRUhOZ0tFSnlBRFFjVEpBRHNCaUNjZ0EwR0tpODRBTmdLTUp5QURRUXMyQXBBbklBTkIxQUU3QVpRbklBTkJ1LzNLQURZQ21DY2dBMEVRTmdLY0p5QURRZEE5T3dHZ0p5QURRY3Y5eWdBMkFxUW5JQU5CRXpZQ3FDY2dBMEhZUFRzQnJDY2dBMEhlL2NvQU5nS3dKeUFEUVJBMkFyUW5JQU5CMGowN0FiZ25JQU5CN3YzS0FEWUN2Q2NnQTBFVU5nTEFKeUFEUWRROU93SEVKeUFEUVlMK3lnQTJBc2duSUFOQkVEWUN6Q2NnQTBIMDd3TTdBZEFuSUFOQmt2N0tBRFlDMUNjZ0EwRVFOZ0xZSnlBRFFkWTlPd0hjSnlBRFFhTCt5Z0EyQXVBbklBTkJDVFlDNUNjZ0EwR2VDRHNCNkNjZ0EwR3Ivc29BTmdMc0p5QURRUWsyQXZBbklBTkIwQUk3QWZRbklBTkJ0UDdLQURZQytDY2dBMEVKTmdMOEp5QURRWXdFT3dHQUtDQURRYkNMemdBMkFvUW9JQU5CQ1RZQ2lDZ2dBMEhXQVRzQmpDZ2dBMEc5L3NvQU5nS1FLQ0FEUVJFMkFwUW9JQU5CNWdrN0FaZ29JQU5CenY3S0FEWUNuQ2dnQTBFT05nS2dLQ0FEUWZidkF6c0JwQ2dnQTBIYy9zb0FOZ0tvS0NBRFFRazJBcXdvSUFOQnpEMDdBYkFvSUFOQjVmN0tBRFlDdENnZ0EwRUxOZ0s0S0NBRFFmdnRBenNCdkNnZ0EwRzBpTTRBTmdMQUtDQURRUVkyQXNRb0lBTkIwZ0U3QWNnb0lBTkI4UDdLQURZQ3pDZ2dBMEVMTmdMUUtDQURRZkx2QXpzQjFDZ2dBMEg3L3NvQU5nTFlLQ0FEUVFvMkF0d29JQU5CMVFvN0FlQW9JQU5CaGYvS0FEWUM1Q2dnQTBFRE5nTG9LQ0FEUWFiQ0FEc0I3Q2dnQTBHSS84b0FOZ0x3S0NBRFFRbzJBdlFvSUFOQnpqMDdBZmdvSUFOQmt2L0tBRFlDL0NnZ0EwRUZOZ0tBS1NBRFFhQURPd0dFS1NBRFFaZi95Z0EyQW9ncElBTkJDallDakNrZ0EwSGFQVHNCa0NrZ0EwR2gvOG9BTmdLVUtTQURRUTAyQXBncElBTkI0ajA3QVp3cElBTkJydi9LQURZQ29Da2dBMEVLTmdLa0tTQURRZHc5T3dHb0tTQURRYmoveWdBMkFxd3BJQU5CRGpZQ3NDa2dBMEhlUFRzQnRDa2dBMEhHLzhvQU5nSzRLU0FEUVFvMkFyd3BJQU5CNEQwN0FjQXBJQU5CaTQzT0FEWUN4Q2tnQTBFTk5nTElLU0FEUWRBQ093SE1LU0FEUWREL3lnQTJBdEFwSUFOQkFqWUMxQ2tnQTBHaUF6c0IyQ2tnQTBIUy84b0FOZ0xjS1NBRFFRNDJBdUFwSUFOQmpnUTdBZVFwSUFOQmdvak9BRFlDNkNrZ0EwRUhOZ0xzS1NBRFFjd0NPd0h3S1NBRFFlRC95Z0EyQXZRcElBTkJERFlDK0NrZ0EwSFNQRHNCL0NrZ0EwSHMvOG9BTmdLQUtpQURRUXcyQW9RcUlBTkIwRHc3QVlncUlBTkI0TUxQQURZQ2pDb2dBMEVGTmdLUUtpQURRYWJDQURzQmxDb2dBMEg0LzhvQU5nS1lLaUFEUVEwMkFwd3FJQU5CNEFnN0FhQXFJQU5CaFlETEFEWUNwQ29nQTBFS05nS29LaUFEUWFrSE93R3NLaUFEUVkrQXl3QTJBckFxSUFOQkNEWUN0Q29nQTBHbndnQTdBYmdxSUFOQmw0RExBRFlDdkNvZ0EwRVNOZ0xBS2lBRFFmb0lPd0hFS2lBRFFhbUF5d0EyQXNncUlBTkJFallDekNvZ0EwSDhDRHNCMENvZ0EwRzdnTXNBTmdMVUtpQURRUW8yQXRncUlBTkJqd2M3QWR3cUlBTkJ1c0xQQURZQzRDb2dBMEVITmdMa0tpQURRWjhIT3dIb0tpQURRY1dBeXdBMkF1d3FJQU5CRERZQzhDb2dBMEdNQnpzQjlDb2dBMEhSZ01zQU5nTDRLaUFEUVFvMkF2d3FJQU5Cci80RE93R0FLeUFEUWR1QXl3QTJBb1FySUFOQkNEWUNpQ3NnQTBIZ3dnQTdBWXdySUFOQjQ0RExBRFlDa0NzZ0EwRUhOZ0tVS3lBRFFlb0RPd0dZS3lBRFFlcUF5d0EyQXB3cklBTkJEVFlDb0NzZ0EwSHNBenNCcENzZ0EwSDNnTXNBTmdLb0t5QURRUVUyQXF3cklBTkJoZ003QWJBcklBTkIzb1RPQURZQ3RDc2dBMEVHTmdLNEt5QURRZGdCT3dHOEt5QURRZnlBeXdBMkFzQXJJQU5CQ3pZQ3hDc2dBMEgrQXpzQnlDc2dBMEdIZ2NzQU5nTE1LeUFEUVFzMkF0QXJJQU5CK084RE93SFVLeUFEUVpLQnl3QTJBdGdySUFOQkJqWUMzQ3NnQTBIdjdnTTdBZUFySUFOQm1JSExBRFlDNUNzZ0EwRU1OZ0xvS3lBRFFmNERPd0hzS3lBRFFhU0J5d0EyQXZBcklBTkJDallDOUNzZ0EwSCtDRHNCK0NzZ0EwSC9qYzRBTmdMOEt5QURRUVkyQW9Bc0lBTkIxUUU3QVlRc0lBTkJyb0hMQURZQ2lDd2dBMEVMTmdLTUxDQURRY3c4T3dHUUxDQURRYm1CeXdBMkFwUXNJQU5CRGpZQ21Dd2dBMEhPUERzQm5Dd2dBMEhIZ2NzQU5nS2dMQ0FEUVFzMkFxUXNJQU5COWU4RE93R29MQ0FEUWV5QXpnQTJBcXdzSUFOQkFUWUNzQ3dnQTBIUUFEc0J0Q3dnQTBIU2djc0FOZ0s0TENBRFFRWTJBcndzSUFOQjFEdzdBY0FzSUFOQjJJSExBRFlDeEN3Z0EwRUhOZ0xJTENBRFFjWEpBRHNCekN3Z0EwSGZnY3NBTmdMUUxDQURRUW8yQXRRc0lBTkIxanc3QWRnc0lBTkI2WUhMQURZQzNDd2dBMEVLTmdMZ0xDQURRWjhJT3dIa0xDQURRZk9CeXdBMkF1Z3NJQU5CQ3pZQzdDd2dBMEhLQ2pzQjhDd2dBMEgrZ2NzQU5nTDBMQ0FEUVJRMkF2Z3NJQU5CcGdrN0Fmd3NJQU5CbHNMUEFEWUNnQzBnQTBFRE5nS0VMU0FEUWFZSE93R0lMU0FEUVpLQ3l3QTJBb3d0SUFOQkJUWUNrQzBnQTBHa0F6c0JsQzBnQTBIQndzOEFOZ0tZTFNBRFFRSTJBcHd0SUFOQm9BYzdBYUF0SUFOQmw0TExBRFlDcEMwZ0EwRU1OZ0tvTFNBRFFkTUtPd0dzTFNBRFFhT0N5d0EyQXJBdElBTkJDallDdEMwZ0EwR3cvZ003QWJndElBTkI1OExQQURZQ3ZDMGdBMEVETmdMQUxTQURRYWdIT3dIRUxTQURRYTJDeXdBMkFzZ3RJQU5CQ3pZQ3pDMGdBMEh3Q0RzQjBDMGdBMEc0Z3NzQU5nTFVMU0FEUVFZMkF0Z3RJQU5COE80RE93SGNMU0FEUWUyQXpnQTJBdUF0SUFOQkFUWUM1QzBnQTBIUkFEc0I2QzBnQTBHK2dzc0FOZ0xzTFNBRFFRYzJBdkF0SUFOQnhza0FPd0gwTFNBRFFjV0N5d0EyQXZndElBTkJDallDL0MwZ0EwR3gvZ003QVlBdUlBTkJ6NExMQURZQ2hDNGdBMEVHTmdLSUxpQURRZkh1QXpzQmpDNGdBMEh1Z000QU5nS1FMaUFEUVFFMkFwUXVJQU5CMGdBN0FaZ3VJQU5CMVlMTEFEWUNuQzRnQTBFS05nS2dMaUFEUWN3S093R2tMaUFEUVltSXpnQTJBcWd1SUFOQkJqWUNyQzRnQTBIVUFqc0JzQzRnQTBHMmg4NEFOZ0swTGlBRFFRWTJBcmd1SUFOQjJBSTdBYnd1SUFOQjM0TExBRFlDd0M0Z0EwRUlOZ0xFTGlBRFFkWUNPd0hJTGlBRFFlZUN5d0EyQXN3dUlBTkJCellDMEM0Z0EwSEh5UUE3QWRRdUlBTkIxWTNPQURZQzJDNGdBMEVNTmdMY0xpQURRZFlDT3dIZ0xpQURRZTZDeXdBMkF1UXVJQU5CQ1RZQzZDNGdBMEdRQkRzQjdDNGdBMEgzZ3NzQU5nTHdMaUFEUVFvMkF2UXVJQU5CMkR3N0FmZ3VJQU5CZ1lQTEFEWUMvQzRnQTBFSk5nS0FMeUFEUWRvOE93R0VMeUFEUVlxRHl3QTJBb2d2SUFOQkR6WUNqQzhnQTBIY1BEc0JrQzhnQTBHWmc4c0FOZ0tVTHlBRFFRczJBcGd2SUFOQjBBbzdBWnd2SUFOQnBJUExBRFlDb0M4Z0EwRUlOZ0trTHlBRFFaekNBRHNCcUM4Z0EwR3h4YzhBTmdLc0x5QURRUWcyQXJBdklBTkJuTUlBT3dHMEx5QURRY2pDendBMkFyZ3ZJQU5CQXpZQ3ZDOGdBMEdoQnpzQndDOGdBMEdzZzhzQU5nTEVMeUFEUVFrMkFzZ3ZJQU5CL08wRE93SE1MeUFEUWJXRHl3QTJBdEF2SUFOQkRqWUMxQzhnQTBHU0JEc0IyQzhnQTBIRGc4c0FOZ0xjTHlBRFFRbzJBdUF2SUFOQjNqdzdBZVF2SUFOQnpZUExBRFlDNkM4Z0EwRUtOZ0xzTHlBRFFiTCtBenNCOEM4Z0EwSFhnOHNBTmdMMEx5QURRUVkyQXZndklBTkI4dTRET3dIOEx5QURRZDJEeXdBMkFvQXdJQU5CRGpZQ2hEQWdBMEdCQlRzQmlEQWdBMEhyZzhzQU5nS01NQ0FEUVJZMkFwQXdJQU5CdGdVN0FaUXdJQU5CNzRET0FEWUNtREFnQTBFQk5nS2NNQ0FEUWRNQU93R2dNQ0FEUVlHRXl3QTJBcVF3SUFOQkNEWUNxREFnQTBHTXlnQTdBYXd3SUFOQmlZVExBRFlDc0RBZ0EwRUlOZ0swTUNBRFFaVEtBRHNCdURBZ0EwR1JoTXNBTmdLOE1DQURRUWcyQXNBd0lBTkJrTW9BT3dIRU1DQURRWm1FeXdBMkFzZ3dJQU5CQ0RZQ3pEQWdBMEdZeWdBN0FkQXdJQU5Cb1lUTEFEWUMxREFnQTBFSU5nTFlNQ0FEUWJ6S0FEc0IzREFnQTBHcGhNc0FOZ0xnTUNBRFFRZzJBdVF3SUFOQnJNb0FPd0hvTUNBRFFiR0V5d0EyQXV3d0lBTkJDRFlDOERBZ0EwRzB5Z0E3QWZRd0lBTkJ1WVRMQURZQytEQWdBMEVJTmdMOE1DQURRWnpLQURzQmdERWdBMEhCaE1zQU5nS0VNU0FEUVFnMkFvZ3hJQU5CcE1vQU93R01NU0FEUWNtRXl3QTJBcEF4SUFOQkNEWUNsREVnQTBHQXlnQTdBWmd4SUFOQjBZVExBRFlDbkRFZ0EwRUlOZ0tnTVNBRFFZTEtBRHNCcERFZ0EwSFpoTXNBTmdLb01TQURRUWcyQXF3eElBTkI0Y29BT3dHd01TQURRZUdFeXdBMkFyUXhJQU5CQ0RZQ3VERWdBMEhpeWdBN0Fid3hJQU5CNllUTEFEWUN3REVnQTBFSU5nTEVNU0FEUWRiS0FEc0J5REVnQTBIeGhNc0FOZ0xNTVNBRFFRZzJBdEF4SUFOQjFjb0FPd0hVTVNBRFFmbUV5d0EyQXRneElBTkJDRFlDM0RFZ0EwSGp5Z0E3QWVBeElBTkJnWVhMQURZQzVERWdBMEVJTmdMb01TQURRZEhLQURzQjdERWdBMEdKaGNzQU5nTHdNU0FEUVFnMkF2UXhJQU5CMThvQU93SDRNU0FEUVpHRnl3QTJBdnd4SUFOQkNEWUNnRElnQTBIZHlnQTdBWVF5SUFOQm1ZWExBRFlDaURJZ0EwRUlOZ0tNTWlBRFFkektBRHNCa0RJZ0EwR2hoY3NBTmdLVU1pQURRUWcyQXBneUlBTkIyOG9BT3dHY01pQURRYW1GeXdBMkFxQXlJQU5CQ0RZQ3BESWdBMEhleWdBN0FhZ3lJQU5Cc1lYTEFEWUNyRElnQTBFSU5nS3dNaUFEUWQvS0FEc0J0RElnQTBHNWhjc0FOZ0s0TWlBRFFRZzJBcnd5SUFOQjJzb0FPd0hBTWlBRFFjR0Z5d0EyQXNReUlBTkJDRFlDeURJZ0EwSFV5Z0E3QWN3eUlBTkJ5WVhMQURZQzBESWdBMEVJTmdMVU1pQURRZW5LQURzQjJESWdBMEhSaGNzQU5nTGNNaUFEUVFnMkF1QXlJQU5CNXNvQU93SGtNaUFEUWRtRnl3QTJBdWd5SUFOQkNEWUM3RElnQTBIZ3lnQTdBZkF5SUFOQjRZWExBRFlDOURJZ0EwRUlOZ0w0TWlBRFFkREtBRHNCL0RJZ0EwSHBoY3NBTmdLQU15QURRUWcyQW9ReklBTkI3TW9BT3dHSU15QURRZkdGeXdBMkFvd3pJQU5CQ0RZQ2tETWdBMEhueWdBN0FaUXpJQU5CK1lYTEFEWUNtRE1nQTBFSU5nS2NNeUFEUWVqS0FEc0JvRE1nQTBHQmhzc0FOZ0trTXlBRFFRZzJBcWd6SUFOQjVNb0FPd0dzTXlBRFFZbUd5d0EyQXJBeklBTkJDRFlDdERNZ0EwSGx5Z0E3QWJneklBTkJrWWJMQURZQ3ZETWdBMEVJTmdMQU15QURRZG5LQURzQnhETWdBMEdaaHNzQU5nTElNeUFEUVFnMkFzd3pJQU5CMk1vQU93SFFNeUFEUWFHR3l3QTJBdFF6SUFOQkNEWUMyRE1nQTBIU3lnQTdBZHd6SUFOQnFZYkxBRFlDNERNZ0EwRUlOZ0xrTXlBRFFkUEtBRHNCNkRNZ0EwR3hoc3NBTmdMc015QURRUWcyQXZBeklBTkI2OG9BT3dIME15QURRYm1HeXdBMkF2Z3pJQU5CQ0RZQy9ETWdBMEhxeWdBN0FZQTBJQU5Cd1liTEFEWUNoRFFnQTBFQ05nS0lOQ0FEUWRNQU93R01OQ0FEUWNPR3l3QTJBcEEwSUFOQkJ6WUNsRFFnQTBHRHNBTTdBWmcwSUFOQmo0ak9BRFlDbkRRZ0EwRUdOZ0tnTkNBRFFkb0NPd0drTkNBRFFjcUd5d0EyQXFnMElBTkJEellDckRRZ0EwSGtQRHNCc0RRZ0EwSFpoc3NBTmdLME5DQURRUW8yQXJnMElBTkI0QWM3QWJ3MElBTkIrWXpPQURZQ3dEUWdBMEVHTmdMRU5DQURRZUFDT3dISU5DQURRZU9HeXdBMkFzdzBJQU5CRHpZQzBEUWdBMEhtUERzQjFEUWdBMEh5aHNzQU5nTFlOQ0FEUVFzMkF0dzBJQU5CL2UwRE93SGdOQ0FEUWVpTHpnQTJBdVEwSUFOQkNEWUM2RFFnQTBIZUFqc0I3RFFnQTBIOWhzc0FOZ0x3TkNBRFFRVTJBdlEwSUFOQmp3TTdBZmcwSUFOQmdvZkxBRFlDL0RRZ0EwRU5OZ0tBTlNBRFFkZ0pPd0dFTlNBRFFZK0h5d0EyQW9nMUlBTkJGVFlDakRVZ0EwSGFDVHNCa0RVZ0EwR2toOHNBTmdLVU5TQURRUWMyQXBnMUlBTkJ5TWtBT3dHY05TQURRYXVIeXdBMkFxQTFJQU5CQ3pZQ3BEVWdBMEhjQWpzQnFEVWdBMEgvak00QU5nS3NOU0FEUVF3MkFyQTFJQU5CbUFRN0FiUTFJQU5CdG9mTEFEWUN1RFVnQTBFS05nSzhOU0FEUWVBOE93SEFOU0FEUWNDSHl3QTJBc1ExSUFOQkNUWUN5RFVnQTBIaVBEc0J6RFVnQTBISmg4c0FOZ0xRTlNBRFFSSTJBdFExSUFOQjZEdzdBZGcxSUFOQjI0ZkxBRFlDM0RVZ0EwRUxOZ0xnTlNBRFFjMEtPd0hrTlNBRFFlYUh5d0EyQXVnMUlBTkJDallDN0RVZ0EwSG13Z0E3QWZBMUlBTkI4SWZMQURZQzlEVWdBMEVMTmdMNE5TQURRY2NLT3dIOE5TQURRZnVIeXdBMkFvQTJJQU5CQ3pZQ2hEWWdBMEdvQ0RzQmlEWWdBMEdHaU1zQU5nS01OaUFEUVEwMkFwQTJJQU5CcVFnN0FaUTJJQU5CazRqTEFEWUNtRFlnQTBFS05nS2NOaUFEUWVJSE93R2dOaUFEUVoySXl3QTJBcVEySUFOQkREWUNxRFlnQTBHNkNUc0JyRFlnQTBHcGlNc0FOZ0t3TmlBRFFRczJBclEySUFOQjdBYzdBYmcySUFOQnk4TFBBRFlDdkRZZ0EwRUZOZ0xBTmlBRFFhTUhPd0hFTmlBRFFiU0l5d0EyQXNnMklBTkJDRFlDekRZZ0EwSGx3Z0E3QWRBMklBTkJ2SWpMQURZQzFEWWdBMEVLTmdMWU5pQURRYlArQXpzQjNEWWdBMEhHaU1zQU5nTGdOaUFEUVJBMkF1UTJJQU5CckFnN0FlZzJJQU5CMW9qTEFEWUM3RFlnQTBFR05nTHdOaUFEUWZQdUF6c0I5RFlnQTBIY2lNc0FOZ0w0TmlBRFFRczJBdncySUFOQjJnYzdBWUEzSUFOQjhJRE9BRFlDaERjZ0EwRUJOZ0tJTnlBRFFkUUFPd0dNTnlBRFFkREN6d0EyQXBBM0lBTkJBellDbERjZ0EwR2tCenNCbURjZ0EwSG5pTXNBTmdLY055QURRUVEyQXFBM0lBTkI1Z0k3QWFRM0lBTkIxSWpPQURZQ3FEY2dBMEVHTmdLc055QURRZVFDT3dHd055QURRZXVJeXdBMkFyUTNJQU5CQ0RZQ3VEY2dBMEhpQWpzQnZEY2dBMEh6aU1zQU5nTEFOeUFEUVFjMkFzUTNJQU5CeWNrQU93SElOeUFEUWZxSXl3QTJBc3czSUFOQkVEWUMwRGNnQTBId1BEc0IxRGNnQTBINWhzNEFOZ0xZTnlBRFFRdzJBdHczSUFOQjRnSTdBZUEzSUFOQmlvbkxBRFlDNURjZ0EwRUtOZ0xvTnlBRFFlbzhPd0hzTnlBRFFaU0p5d0EyQXZBM0lBTkJDVFlDOURjZ0EwSHNQRHNCK0RjZ0EwR2RpY3NBTmdMOE55QURRUW8yQW9BNElBTkJvZ2c3QVlRNElBTkJwNG5MQURZQ2lEZ2dBMEVUTmdLTU9DQURRYXdKT3dHUU9DQURRYnFKeXdBMkFwUTRJQU5CQ0RZQ21EZ2dBMEhwd2dBN0FadzRJQU5Cd29uTEFEWUNvRGdnQTBFTk5nS2tPQ0FEUWJRSk93R29PQ0FEUWNQQ3p3QTJBcXc0SUFOQkJUWUNzRGdnQTBHWUJ6c0J0RGdnQTBIUGljc0FOZ0s0T0NBRFFRVTJBcnc0SUFOQnJBTTdBY0E0SUFOQi9ZZk9BRFlDeERnZ0EwRUZOZ0xJT0NBRFFkNEJPd0hNT0NBRFFkU0p5d0EyQXRBNElBTkJDallDMURnZ0EwSCs3d003QWRnNElBTkIzb25MQURZQzNEZ2dBMEVLTmdMZ09DQURRZUxDQURzQjVEZ2dBMEhvaWNzQU5nTG9PQ0FEUVFvMkF1dzRJQU5CL3UwRE93SHdPQ0FEUWZLSnl3QTJBdlE0SUFOQkREWUMrRGdnQTBIUENqc0IvRGdnQTBIK2ljc0FOZ0tBT1NBRFFRbzJBb1E1SUFOQjdqdzdBWWc1SUFOQmlJckxBRFlDakRrZ0EwRUtOZ0tRT1NBRFFiVCtBenNCbERrZ0EwR1Npc3NBTmdLWU9TQURRUW8yQXB3NUlBTkJ1UW83QWFBNUlBTkJuSXJMQURZQ3BEa2dBMEVJTmdLb09TQURRYndET3dHc09TQURRYVNLeXdBMkFyQTVJQU5CQnpZQ3REa2dBMEdFQXpzQnVEa2dBMEdyaXNzQU5nSzhPU0FEUVFjMkFzQTVJQU5CcHdNN0FjUTVJQU5Cc29yTEFEWUN5RGtnQTBFT05nTE1PU0FEUWE0RE93SFFPU0FEUWNDS3l3QTJBdFE1SUFOQkN6WUMyRGtnQTBHbUNEc0IzRGtnQTBITGlzc0FOZ0xnT1NBRFFRdzJBdVE1SUFOQml3ZzdBZWc1SUFOQjE0ckxBRFlDN0RrZ0EwRUdOZ0x3T1NBRFFmVHVBenNCOURrZ0EwSGRpc3NBTmdMNE9TQURRUXMyQXZ3NUlBTkI2OElBT3dHQU9pQURRZWlLeXdBMkFvUTZJQU5CQ0RZQ2lEb2dBMEhod2dBN0FZdzZJQU5COFlET0FEWUNrRG9nQTBFQk5nS1VPaUFEUWRVQU93R1lPaUFEUVorR3pnQTJBcHc2SUFOQkJqWUNvRG9nQTBIYUFUc0JwRG9nQTBId2lzc0FOZ0tvT2lBRFFRczJBcXc2SUFOQit1OERPd0d3T2lBRFFmdUt5d0EyQXJRNklBTkJCallDdURvZ0EwSHNBanNCdkRvZ0EwR0JpOHNBTmdMQU9pQURRUVkyQXNRNklBTkIwd003QWNnNklBTkJoNHZMQURZQ3pEb2dBMEVITmdMUU9pQURRY3JKQURzQjFEb2dBMEhpaGM0QU5nTFlPaUFEUVFzMkF0dzZJQU5CMndFN0FlQTZJQU5Cam92TEFEWUM1RG9nQTBFUU5nTG9PaUFEUWZZOE93SHNPaUFEUVo2THl3QTJBdkE2SUFOQkVEWUM5RG9nQTBINzd3TTdBZmc2SUFOQnJvdkxBRFlDL0RvZ0EwRUpOZ0tBT3lBRFFhTUlPd0dFT3lBRFFiZUx5d0EyQW9nN0lBTkJDVFlDakRzZ0EwSHdBanNCa0RzZ0EwSEFpOHNBTmdLVU95QURRUWsyQXBnN0lBTkJsQVE3QVp3N0lBTkJqNGJPQURZQ29Ec2dBMEVKTmdLa095QURRZHdCT3dHb095QURRY21MeXdBMkFxdzdJQU5CRGpZQ3NEc2dBMEhYQXpzQnREc2dBMEhYaThzQU5nSzRPeUFEUVE0MkFydzdJQU5COGp3N0FjQTdJQU5CNVl2TEFEWUN4RHNnQTBFT05nTElPeUFEUWRrRE93SE1PeUFEUWZPTHl3QTJBdEE3SUFOQkVUWUMxRHNnQTBId0NUc0IyRHNnQTBHRWpNc0FOZ0xjT3lBRFFRNDJBdUE3SUFOQjJ3TTdBZVE3SUFOQmtvekxBRFlDNkRzZ0EwRVBOZ0xzT3lBRFFkVURPd0h3T3lBRFFhR015d0EyQXZRN0lBTkJEallDK0RzZ0EwSDg3d003QWZ3N0lBTkJyNHpMQURZQ2dEd2dBMEVKTmdLRVBDQURRZVE5T3dHSVBDQURRWldMemdBMkFvdzhJQU5CQmpZQ2tEd2dBMEhaQVRzQmxEd2dBMEc0ak1zQU5nS1lQQ0FEUVFzMkFwdzhJQU5CK2U4RE93R2dQQ0FEUWNPTXl3QTJBcVE4SUFOQkNqWUNxRHdnQTBIbVBUc0JyRHdnQTBITmpNc0FOZ0t3UENBRFFRVTJBclE4SUFOQnJ3TTdBYmc4SUFOQjBvekxBRFlDdkR3Z0EwRUtOZ0xBUENBRFFlZzlPd0hFUENBRFFkeU15d0EyQXNnOElBTkJEVFlDekR3Z0EwSHdQVHNCMER3Z0EwSHBqTXNBTmdMVVBDQURRUW8yQXRnOElBTkI2ajA3QWR3OElBTkI4NHpMQURZQzREd2dBMEVPTmdMa1BDQURRZXc5T3dIb1BDQURRWUdOeXdBMkF1dzhJQU5CQ2pZQzhEd2dBMEh1UFRzQjlEd2dBMEhQak00QU5nTDRQQ0FEUVEwMkF2dzhJQU5COEFJN0FZQTlJQU5CaTQzTEFEWUNoRDBnQTBFVk5nS0lQU0FEUWZJSk93R01QU0FEUWFDTnl3QTJBcEE5SUFOQkRqWUNsRDBnQTBHV0JEc0JtRDBnQTBHdWpjc0FOZ0tjUFNBRFFRbzJBcUE5SUFOQitBZzdBYVE5SUFOQm00ak9BRFlDcUQwZ0EwRUhOZ0tzUFNBRFFlb0NPd0d3UFNBRFFiaU55d0EyQXJROUlBTkJEellDdUQwZ0EwSHVDVHNCdkQwZ0EwSEhqY3NBTmdMQVBTQURRUTgyQXNROUlBTkIranc3QWNnOUlBTkIxbzNMQURZQ3pEMGdBMEVLTmdMUVBTQURRYlgrQXpzQjFEMGdBMEcvaXM0QU5nTFlQU0FEUVFjMkF0dzlJQU5COGdJN0FlQTlJQU5CMDhMUEFEWUM1RDBnQTBFSE5nTG9QU0FEUWFVSE93SHNQU0FEUVlERXp3QTJBdkE5SUFOQkNEWUM5RDBnQTBIU0J6c0IrRDBnQTBIZ2pjc0FOZ0w4UFNBRFFSczJBb0ErSUFOQjB3YzdBWVErSUFOQis0M0xBRFlDaUQ0Z0EwRU9OZ0tNUGlBRFFiRURPd0dRUGlBRFFZbU95d0EyQXBRK0lBTkJEellDbUQ0Z0EwR3JCenNCbkQ0Z0EwR1lqc3NBTmdLZ1BpQURRUjQyQXFRK0lBTkIxQWM3QWFnK0lBTkJ0bzdMQURZQ3JENGdBMEVSTmdLd1BpQURRZElIT3dHMFBpQURRY2VPeXdBMkFyZytJQU5CRERZQ3ZENGdBMEdPQnpzQndENGdBMEdLaHM0QU5nTEVQaUFEUVFVMkFzZytJQU5CN2dJN0FjdytJQU5CMDQ3TEFEWUMwRDRnQTBFT05nTFVQaUFEUVk0SU93SFlQaUFEUWVHT3l3QTJBdHcrSUFOQkJqWUM0RDRnQTBIMTdnTTdBZVErSUFOQjU0N0xBRFlDNkQ0Z0EwRVJOZ0xzUGlBRFFhNEpPd0h3UGlBRFFmaU95d0EyQXZRK0lBTkJGellDK0Q0Z0EwR3dDVHNCL0Q0Z0EwR1BqOHNBTmdLQVB5QURRUVkyQW9RL0lBTkI2QUk3QVlnL0lBTkJsWS9MQURZQ2pEOGdBMEVMTmdLUVB5QURRZmc4T3dHVVB5QURRYUNQeXdBMkFwZy9JQU5CQ3pZQ25EOGdBMEgwUERzQm9EOGdBMEh5Z000QU5nS2tQeUFEUVFFMkFxZy9JQU5CMWdBN0Fhdy9JQU5CcTQvTEFEWUNzRDhnQTBFSE5nSzBQeUFEUWN2SkFEc0J1RDhnQTBHeWo4c0FOZ0s4UHlBRFFRazJBc0EvSUFOQi9qdzdBY1EvSUFOQnU0L0xBRFlDeUQ4Z0EwRUtOZ0xNUHlBRFFaSUlPd0hRUHlBRFFjV1B5d0EyQXRRL0lBTkJDellDMkQ4Z0EwSE9DanNCM0Q4Z0EwSFFqOHNBTmdMZ1B5QURRUVUyQXVRL0lBTkJzZ003QWVnL0lBTkIxWS9MQURZQzdEOGdBMEVLTmdMd1B5QURRYmIrQXpzQjlEOGdBMEhmajhzQU5nTDRQeUFEUVFvMkF2dy9JQU5CeUFvN0FZQkFJQU5CNlkvTEFEWUNoRUFnQTBFR05nS0lRQ0FEUWZidUF6c0JqRUFnQTBIdmo4c0FOZ0tRUUNBRFFRWTJBcFJBSUFOQi9EdzdBWmhBSUFOQjg0RE9BRFlDbkVBZ0EwRUJOZ0tnUUNBRFFkY0FPd0drUUNBRFFmV1B5d0EyQXFoQUlBTkJCallDckVBZ0EwR0NQVHNCc0VBZ0EwSDdqOHNBTmdLMFFDQURRUWMyQXJoQUlBTkJ6TWtBT3dHOFFDQURRWUtReXdBMkFzQkFJQU5CQ3pZQ3hFQWdBMEgwQWpzQnlFQWdBMEdOa01zQU5nTE1RQ0FEUVFrMkF0QkFJQU5CaEQwN0FkUkFJQU5CbHBETEFEWUMyRUFnQTBFS05nTGNRQ0FEUVlZOU93SGdRQ0FEUWFDUXl3QTJBdVJBSUFOQkNUWUM2RUFnQTBHSVBUc0I3RUFnQTBHcGtNc0FOZ0x3UUNBRFFRWTJBdlJBSUFOQmdEMDdBZmhBSUFOQnI1RExBRFlDL0VBZ0EwRUtOZ0tBUVNBRFFiZitBenNCaEVFZ0EwRzVrTXNBTmdLSVFTQURRUVkyQW94QklBTkI5KzRET3dHUVFTQURRZlNBemdBMkFwUkJJQU5CQVRZQ21FRWdBMEhZQURzQm5FRWdBMEcva01zQU5nS2dRU0FEUVFjMkFxUkJJQU5CemNrQU93R29RU0FEUWNhUXl3QTJBcXhCSUFOQkNUWUNzRUVnQTBHTVBUc0J0RUVnQTBIUGtNc0FOZ0s0UVNBRFFRbzJBcnhCSUFOQmlqMDdBY0JCSUFOQjJaRExBRFlDeEVFZ0EwRUxOZ0xJUVNBRFFiMEtPd0hNUVNBRFFlWEN6d0EyQXRCQklBTkJBallDMUVFZ0EwR2VCenNCMkVFZ0EwSGtrTXNBTmdMY1FTQURRUW8yQXVCQklBTkJ1UDRET3dIa1FTQURRZTZReXdBMkF1aEJJQU5CQmpZQzdFRWdBMEg0N2dNN0FmQkJJQU5COVlET0FEWUM5RUVnQTBFQk5nTDRRU0FEUWRrQU93SDhRU0FEUWN1RnpnQTJBb0JDSUFOQkJqWUNoRUlnQTBIZEFUc0JpRUlnQTBIMGtNc0FOZ0tNUWlBRFFRczJBcEJDSUFOQi9lOERPd0dVUWlBRFFmK1F5d0EyQXBoQ0lBTkJDellDbkVJZ0EwSGlDRHNCb0VJZ0EwR0trY3NBTmdLa1FpQURRUWMyQXFoQ0lBTkJ6c2tBT3dHc1FpQURRWkdSeXdBMkFyQkNJQU5CQ3pZQ3RFSWdBMEgyQWpzQnVFSWdBMEc4aGM0QU5nSzhRaUFEUVFrMkFzQkNJQU5CK0FJN0FjUkNJQU5CbkpITEFEWUN5RUlnQTBFT05nTE1RaUFEUWYvdkF6c0IwRUlnQTBHcWtjc0FOZ0xVUWlBRFFRbzJBdGhDSUFOQmpqMDdBZHhDSUFOQnRKSExBRFlDNEVJZ0EwRUpOZ0xrUWlBRFFmUTlPd0hvUWlBRFFiMlJ5d0EyQXV4Q0lBTkJBellDOEVJZ0EwR2xBVHNCOUVJZ0EwSEFrY3NBTmdMNFFpQURRUXcyQXZ4Q0lBTkJxd2c3QVlCRElBTkJ6SkhMQURZQ2hFTWdBMEVVTmdLSVF5QURRZmdKT3dHTVF5QURRZUNSeXdBMkFwQkRJQU5CQmpZQ2xFTWdBMEh5UFRzQm1FTWdBMEhta2NzQU5nS2NReUFEUVFVMkFxQkRJQU5Cc3dNN0FhUkRJQU5CNjVITEFEWUNxRU1nQTBFS05nS3NReUFEUWZZOU93R3dReUFEUWZXUnl3QTJBclJESUFOQkNqWUN1RU1nQTBIRkNqc0J2RU1nQTBIL2tjc0FOZ0xBUXlBRFFRbzJBc1JESUFOQmh3ZzdBY2hESUFOQmlaTExBRFlDekVNZ0EwRU1OZ0xRUXlBRFFkSUtPd0hVUXlBRFFaV1N5d0EyQXRoRElBTkJDallDM0VNZ0EwRzUvZ003QWVCRElBTkJuNUxMQURZQzVFTWdBMEVHTmdMb1F5QURRZm51QXpzQjdFTWdBMEdsa3NzQU5nTHdReUFEUVFZMkF2UkRJQU5CK0QwN0FmaERJQU5CcTVMTEFEWUMvRU1nQTBFT05nS0FSQ0FEUWVvSU93R0VSQ0FEUWJtU3l3QTJBb2hFSUFOQkZqWUNqRVFnQTBIc0NEc0JrRVFnQTBIUGtzc0FOZ0tVUkNBRFFSRTJBcGhFSUFOQjVnZzdBWnhFSUFOQjRKTExBRFlDb0VRZ0EwRVpOZ0trUkNBRFFlZ0lPd0dvUkNBRFFmYUF6Z0EyQXF4RUlBTkJBVFlDc0VRZ0EwSGFBRHNCdEVRZ0EwSDVrc3NBTmdLNFJDQURRUW8yQXJ4RUlBTkJ0Z283QWNCRUlBTkJnNHJPQURZQ3hFUWdBMEVHTmdMSVJDQURRZmtDT3dITVJDQURRWW1LemdBMkF0QkVJQU5CQmpZQzFFUWdBMEg5QWpzQjJFUWdBMEdEazhzQU5nTGNSQ0FEUVFzMkF1QkVJQU5CLyswRE93SGtSQ0FEUVk2VHl3QTJBdWhFSUFOQkJ6WUM3RVFnQTBIUHlRQTdBZkJFSUFOQmxaUExBRFlDOUVRZ0EwRUxOZ0w0UkNBRFFaQTlPd0g4UkNBRFFhQ1R5d0EyQW9CRklBTkJCRFlDaEVVZ0EwSDdBanNCaUVVZ0EwSHpoODRBTmdLTVJTQURRUW8yQXBCRklBTkIrd0k3QVpSRklBTkJwSlBMQURZQ21FVWdBMEVKTmdLY1JTQURRWkk5T3dHZ1JTQURRYTJUeXdBMkFxUkZJQU5CQ2pZQ3FFVWdBMEdYQ0RzQnJFVWdBMEczazhzQU5nS3dSU0FEUVJNMkFyUkZJQU5CbUFrN0FiaEZJQU5CeXBQTEFEWUN2RVVnQTBFU05nTEFSU0FEUWQ0Sk93SEVSU0FEUWVyQ3p3QTJBc2hGSUFOQkJEWUN6RVVnQTBHV0J6c0IwRVVnQTBIY2s4c0FOZ0xVUlNBRFFRczJBdGhGSUFOQnVnbzdBZHhGSUFOQjU1UExBRFlDNEVVZ0EwRVFOZ0xrUlNBRFFjRUpPd0hvUlNBRFFmZVR5d0EyQXV4RklBTkJDellDOEVVZ0EwR1dDRHNCOUVVZ0EwR0NsTXNBTmdMNFJTQURRUlEyQXZ4RklBTkJsZ2s3QVlCR0lBTkJscFRMQURZQ2hFWWdBMEVUTmdLSVJpQURRZHdKT3dHTVJpQURRYW1VeXdBMkFwQkdJQU5CQ2pZQ2xFWWdBMEdVUFRzQm1FWWdBMEd6bE1zQU5nS2NSaUFEUVFvMkFxQkdJQU5CdXY0RE93R2tSaUFEUWIyVXl3QTJBcWhHSUFOQkJqWUNyRVlnQTBINjdnTTdBYkJHSUFOQnc1VExBRFlDdEVZZ0EwRUhOZ0s0UmlBRFFiVURPd0c4UmlBRFFiV0J6Z0EyQXNCR0lBTkJBVFlDeEVZZ0EwSGhBRHNCeUVZZ0EwSEtsTXNBTmdMTVJpQURRUWsyQXRCR0lBTkJoaE03QWRSR0lBTkIzSVhPQURZQzJFWWdBMEVHTmdMY1JpQURRZUVCT3dIZ1JpQURRZE9VeXdBMkF1UkdJQU5CQmpZQzZFWWdBMEdHRWpzQjdFWWdBMEhabE1zQU5nTHdSaUFEUVFvMkF2UkdJQU5CaGhVN0FmaEdJQU5CNDVUTEFEWUMvRVlnQTBFS05nS0FSeUFEUVlZVU93R0VSeUFEUWUyVXl3QTJBb2hISUFOQkR6WUNqRWNnQTBHK0ZEc0JrRWNnQTBIOGxNc0FOZ0tVUnlBRFFRbzJBcGhISUFOQmcrWUFPd0djUnlBRFFZYVZ5d0EyQXFCSElBTkJFallDcEVjZ0EwRytFenNCcUVjZ0EwR1lsY3NBTmdLc1J5QURRUTgyQXJCSElBTkJ2aEk3QWJSSElBTkJwNVhMQURZQ3VFY2dBMEVUTmdLOFJ5QURRYjRWT3dIQVJ5QURRYnFWeXdBMkFzUkhJQU5CR0RZQ3lFY2dBMEhmQ2pzQnpFY2dBMEhTbGNzQU5nTFFSeUFEUVJRMkF0UkhJQU5COEJJN0FkaEhJQU5CNXBYTEFEWUMzRWNnQTBFSU5nTGdSeUFEUVlVVE93SGtSeUFEUWU2Vnl3QTJBdWhISUFOQkNUWUM3RWNnQTBHYTRnQTdBZkJISUFOQm80WE9BRFlDOUVjZ0EwRUdOZ0w0UnlBRFFZTUNPd0g4UnlBRFFmZVZ5d0EyQW9CSUlBTkJDellDaEVnZ0EwR3ZQVHNCaUVnZ0EwR0Nsc3NBTmdLTVNDQURRUTQyQXBCSUlBTkIwUWs3QVpSSUlBTkJrSmJMQURZQ21FZ2dBMEVPTmdLY1NDQURRYmM5T3dHZ1NDQURRWjZXeXdBMkFxUklJQU5CQ3pZQ3FFZ2dBMEd4UFRzQnJFZ2dBMEdwbHNzQU5nS3dTQ0FEUVE4MkFyUklJQU5Cc3owN0FiaElJQU5CdUpiTEFEWUN2RWdnQTBFTE5nTEFTQ0FEUWJVOU93SEVTQ0FEUWNPV3l3QTJBc2hJSUFOQkJqWUN6RWdnQTBIT0F6c0IwRWdnQTBISmxzc0FOZ0xVU0NBRFFRYzJBdGhJSUFOQjBNa0FPd0hjU0NBRFFkT0h6Z0EyQXVCSUlBTkJDellDNUVnZ0EwSGlBVHNCNkVnZ0EwSFFsc3NBTmdMc1NDQURRUkEyQXZCSUlBTkJwVDA3QWZSSUlBTkI0SmJMQURZQytFZ2dBMEVUTmdMOFNDQURRYTA5T3dHQVNTQURRZk9XeXdBMkFvUkpJQU5CRURZQ2lFa2dBMEduUFRzQmpFa2dBMEdEbDhzQU5nS1FTU0FEUVJRMkFwUkpJQU5CcVQwN0FaaEpJQU5CbDVmTEFEWUNuRWtnQTBFUU5nS2dTU0FEUWFzOU93R2tTU0FEUWZPRHpnQTJBcWhKSUFOQkJUWUNyRWtnQTBHMEFUc0JzRWtnQTBHbmw4c0FOZ0swU1NBRFFRMDJBcmhKSUFOQmx3WTdBYnhKSUFOQnRKZkxBRFlDd0VrZ0EwRUlOZ0xFU1NBRFFZRUdPd0hJU1NBRFFieVh5d0EyQXN4SklBTkJDVFlDMEVrZ0EwR0JCanNCMUVrZ0EwSEZsOHNBTmdMWVNTQURRUWsyQXR4SklBTkIxQkk3QWVCSklBTkJ6cGZMQURZQzVFa2dBMEVMTmdMb1NTQURRYzhGT3dIc1NTQURRZG1YeXdBMkF2QkpJQU5CRERZQzlFa2dBMEhCQmpzQitFa2dBMEhsbDhzQU5nTDhTU0FEUVFrMkFvQktJQU5Cc0FnN0FZUktJQU5CN3BmTEFEWUNpRW9nQTBFSk5nS01TaUFEUVlFRU93R1FTaUFEUWZlWHl3QTJBcFJLSUFOQkRUWUNtRW9nQTBIeEZEc0JuRW9nQTBHRW1Nc0FOZ0tnU2lBRFFRVTJBcVJLSUFOQmhSSTdBYWhLSUFOQmlvbk9BRFlDckVvZ0EwRUpOZ0t3U2lBRFFlUUJPd0cwU2lBRFFZbVl5d0EyQXJoS0lBTkJFVFlDdkVvZ0EwSFRDVHNCd0VvZ0EwR2FtTXNBTmdMRVNpQURRUTgyQXNoS0lBTkIzd003QWN4S0lBTkJxWmpMQURZQzBFb2dBMEVKTmdMVVNpQURRYUU5T3dIWVNpQURRYktZeXdBMkF0eEtJQU5CQ2pZQzRFb2dBMEhoQXpzQjVFb2dBMEh5aE00QU5nTG9TaUFEUVFJMkF1eEtJQU5CNWdFN0FmQktJQU5CdkpqTEFEWUM5RW9nQTBFSE5nTDRTaUFEUWYwRE93SDhTaUFEUWNPWXl3QTJBb0JMSUFOQkNEWUNoRXNnQTBIUTRnQTdBWWhMSUFOQnk1akxBRFlDakVzZ0EwRUlOZ0tRU3lBRFFlTURPd0dVU3lBRFFkT1l5d0EyQXBoTElBTkJDVFlDbkVzZ0EwR1Z3QUE3QWFCTElBTkIzSmpMQURZQ3BFc2dBMEVKTmdLb1N5QURRYVRCQURzQnJFc2dBMEhsbU1zQU5nS3dTeUFEUVFrMkFyUkxJQU5Ca0FnN0FiaExJQU5CN3BqTEFEWUN2RXNnQTBFSk5nTEFTeUFEUVpFSU93SEVTeUFEUWZlWXl3QTJBc2hMSUFOQkNUWUN6RXNnQTBHU0NEc0IwRXNnQTBHQW1jc0FOZ0xVU3lBRFFRazJBdGhMSUFOQmt3ZzdBZHhMSUFOQmlabkxBRFlDNEVzZ0EwRUpOZ0xrU3lBRFFaUUlPd0hvU3lBRFFaS1p5d0EyQXV4TElBTkJDVFlDOEVzZ0EwR1ZDRHNCOUVzZ0EwR2JtY3NBTmdMNFN5QURRUWsyQXZ4TElBTkJnUWc3QVlCTUlBTkJwSm5MQURZQ2hFd2dBMEVKTmdLSVRDQURRWllJT3dHTVRDQURRYTJaeXdBMkFwQk1JQU5CQ1RZQ2xFd2dBMEdYQ0RzQm1Fd2dBMEcybWNzQU5nS2NUQ0FEUVFrMkFxQk1JQU5CbUFnN0FhUk1JQU5CdjVuTEFEWUNxRXdnQTBFSk5nS3NUQ0FEUVprSU93R3dUQ0FEUWNpWnl3QTJBclJNSUFOQkNUWUN1RXdnQTBHYUNEc0J2RXdnQTBIUm1jc0FOZ0xBVENBRFFRazJBc1JNSUFOQm13ZzdBY2hNSUFOQjJwbkxBRFlDekV3Z0EwRUpOZ0xRVENBRFFad0lPd0hVVENBRFFlT1p5d0EyQXRoTUlBTkJDVFlDM0V3Z0EwR2RDRHNCNEV3Z0EwSHNtY3NBTmdMa1RDQURRUWsyQXVoTUlBTkJuZ2c3QWV4TUlBTkI5Wm5MQURZQzhFd2dBMEVKTmdMMFRDQURRWjhJT3dINFRDQURRZjZaeXdBMkF2eE1JQU5CQ1RZQ2dFMGdBMEdnQ0RzQmhFMGdBMEdIbXNzQU5nS0lUU0FEUVFrMkFveE5JQU5Cb1FnN0FaQk5JQU5Ca0pyTEFEWUNsRTBnQTBFSk5nS1lUU0FEUWFJSU93R2NUU0FEUVptYXl3QTJBcUJOSUFOQkNUWUNwRTBnQTBHakNEc0JxRTBnQTBHaW1zc0FOZ0tzVFNBRFFRazJBckJOSUFOQnBBZzdBYlJOSUFOQnE1ckxBRFlDdUUwZ0EwRUpOZ0s4VFNBRFFhVUlPd0hBVFNBRFFiU2F5d0EyQXNSTklBTkJDVFlDeUUwZ0EwR21DRHNCekUwZ0EwRzltc3NBTmdMUVRTQURRUWsyQXRSTklBTkJwd2c3QWRoTklBTkJ4cHJMQURZQzNFMGdBMEVKTmdMZ1RTQURRYWdJT3dIa1RTQURRYytheXdBMkF1aE5JQU5CQ1RZQzdFMGdBMEdwQ0RzQjhFMGdBMEhZbXNzQU5nTDBUU0FEUVFrMkF2aE5JQU5CcWdnN0FmeE5JQU5CNFpyTEFEWUNnRTRnQTBFSk5nS0VUaUFEUWFzSU93R0lUaUFEUWVxYXl3QTJBb3hPSUFOQkNUWUNrRTRnQTBHc0NEc0JsRTRnQTBIem1zc0FOZ0tZVGlBRFFRazJBcHhPSUFOQnJRZzdBYUJPSUFOQi9KckxBRFlDcEU0Z0EwRUpOZ0tvVGlBRFFhNElPd0dzVGlBRFFZV2J5d0EyQXJCT0lBTkJDVFlDdEU0Z0EwR3ZDRHNCdUU0Z0EwR09tOHNBTmdLOFRpQURRUWsyQXNCT0lBTkJrQWs3QWNST0lBTkJsNXZMQURZQ3lFNGdBMEVKTmdMTVRpQURRWUlJT3dIUVRpQURRYUNieXdBMkF0Uk9JQU5CQ1RZQzJFNGdBMEdEQ0RzQjNFNGdBMEdwbThzQU5nTGdUaUFEUVFrMkF1Uk9JQU5CaEFnN0FlaE9JQU5Cc3B2TEFEWUM3RTRnQTBFSk5nTHdUaUFEUVlVSU93SDBUaUFEUWJ1Ynl3QTJBdmhPSUFOQkNUWUMvRTRnQTBHR0NEc0JnRThnQTBIRW04c0FOZ0tFVHlBRFFRazJBb2hQSUFOQmh3ZzdBWXhQSUFOQnpadkxBRFlDa0U4Z0EwRUpOZ0tVVHlBRFFZZ0lPd0dZVHlBRFFkYWJ5d0EyQXB4UElBTkJDVFlDb0U4Z0EwR0pDRHNCcEU4Z0EwSGZtOHNBTmdLb1R5QURRUWsyQXF4UElBTkJpZ2c3QWJCUElBTkI2SnZMQURZQ3RFOGdBMEVKTmdLNFR5QURRWXNJT3dHOFR5QURRZkdieXdBMkFzQlBJQU5CQ1RZQ3hFOGdBMEdNQ0RzQnlFOGdBMEg2bThzQU5nTE1UeUFEUVFrMkF0QlBJQU5CamdnN0FkUlBJQU5CZzV6TEFEWUMyRThnQTBFSk5nTGNUeUFEUWNUdEF6c0I0RThnQTBHTW5Nc0FOZ0xrVHlBRFFRazJBdWhQSUFOQnhlMERPd0hzVHlBRFFaV2N5d0EyQXZCUElBTkJDVFlDOUU4Z0EwR3dDRHNCK0U4Z0EwR2VuTXNBTmdMOFR5QURRUWsyQW9CUUlBTkJzUWc3QVlSUUlBTkJwNXpMQURZQ2lGQWdBMEVKTmdLTVVDQURRYklJT3dHUVVDQURRYkNjeXdBMkFwUlFJQU5CQ1RZQ21GQWdBMEd6Q0RzQm5GQWdBMEc1bk1zQU5nS2dVQ0FEUVFrMkFxUlFJQU5CdEFnN0FhaFFJQU5Cd3B6TEFEWUNyRkFnQTBFSk5nS3dVQ0FEUWJVSU93RzBVQ0FEUWN1Y3l3QTJBcmhRSUFOQkNUWUN2RkFnQTBIUkNEc0J3RkFnQTBIVW5Nc0FOZ0xFVUNBRFFRazJBc2hRSUFOQnRnZzdBY3hRSUFOQjNaekxBRFlDMEZBZ0EwRUpOZ0xVVUNBRFFiY0lPd0hZVUNBRFFlYWN5d0EyQXR4UUlBTkJDVFlDNEZBZ0EwRzRDRHNCNUZBZ0EwSHZuTXNBTmdMb1VDQURRUWsyQXV4UUlBTkJ1UWc3QWZCUUlBTkIrSnpMQURZQzlGQWdBMEVKTmdMNFVDQURRYm9JT3dIOFVDQURRWUdkeXdBMkFvQlJJQU5CQ1RZQ2hGRWdBMEc3Q0RzQmlGRWdBMEdLbmNzQU5nS01VU0FEUVFrMkFwQlJJQU5CdkFnN0FaUlJJQU5CazUzTEFEWUNtRkVnQTBFSk5nS2NVU0FEUWIwSU93R2dVU0FEUVp5ZHl3QTJBcVJSSUFOQkNUWUNxRkVnQTBHK0NEc0JyRkVnQTBHbG5jc0FOZ0t3VVNBRFFRazJBclJSSUFOQnZ3ZzdBYmhSSUFOQnJwM0xBRFlDdkZFZ0EwRUpOZ0xBVVNBRFFjQUlPd0hFVVNBRFFiZWR5d0EyQXNoUklBTkJDVFlDekZFZ0EwSEJDRHNCMEZFZ0EwSEFuY3NBTmdMVVVTQURRUWsyQXRoUklBTkJ3Z2c3QWR4UklBTkJ5WjNMQURZQzRGRWdBMEVKTmdMa1VTQURRY01JT3dIb1VTQURRZEtkeXdBMkF1eFJJQU5CQ1RZQzhGRWdBMEhFQ0RzQjlGRWdBMEhibmNzQU5nTDRVU0FEUVFrMkF2eFJJQU5CeFFnN0FZQlNJQU5CNUozTEFEWUNoRklnQTBFSk5nS0lVaUFEUWNZSU93R01VaUFEUWUyZHl3QTJBcEJTSUFOQkNUWUNsRklnQTBISENEc0JtRklnQTBIMm5jc0FOZ0tjVWlBRFFRazJBcUJTSUFOQnlBZzdBYVJTSUFOQi81M0xBRFlDcUZJZ0EwRUpOZ0tzVWlBRFFja0lPd0d3VWlBRFFZaWV5d0EyQXJSU0lBTkJDVFlDdUZJZ0EwSEtDRHNCdkZJZ0EwR1Juc3NBTmdMQVVpQURRUWsyQXNSU0lBTkJ5d2c3QWNoU0lBTkJtcDdMQURZQ3pGSWdBMEVKTmdMUVVpQURRY3dJT3dIVVVpQURRYU9leXdBMkF0aFNJQU5CQ1RZQzNGSWdBMEhOQ0RzQjRGSWdBMEdzbnNzQU5nTGtVaUFEUVFrMkF1aFNJQU5CemdnN0FleFNJQU5CdFo3TEFEWUM4RklnQTBFSk5nTDBVaUFEUWM4SU93SDRVaUFEUWI2ZXl3QTJBdnhTSUFOQkNUWUNnRk1nQTBHUkNUc0JoRk1nQTBISG5zc0FOZ0tJVXlBRFFRazJBb3hUSUFOQjBnZzdBWkJUSUFOQjBKN0xBRFlDbEZNZ0EwRUpOZ0tZVXlBRFFkTUlPd0djVXlBRFFkbWV5d0EyQXFCVElBTkJDVFlDcEZNZ0EwSFVDRHNCcUZNZ0EwSGluc3NBTmdLc1V5QURRUWsyQXJCVElBTkIxUWc3QWJSVElBTkI2NTdMQURZQ3VGTWdBMEVKTmdLOFV5QURRZFlJT3dIQVV5QURRZlNleXdBMkFzUlRJQU5CQ1RZQ3lGTWdBMEhYQ0RzQnpGTWdBMEg5bnNzQU5nTFFVeUFEUVFrMkF0UlRJQU5CMkFnN0FkaFRJQU5CaHAvTEFEWUMzRk1nQTBFSk5nTGdVeUFEUWRrSU93SGtVeUFEUVkrZnl3QTJBdWhUSUFOQkNUWUM3Rk1nQTBIYUNEc0I4Rk1nQTBHWW44c0FOZ0wwVXlBRFFRazJBdmhUSUFOQjJ3ZzdBZnhUSUFOQm9aL0xBRFlDZ0ZRZ0EwRUpOZ0tFVkNBRFFkd0lPd0dJVkNBRFFhcWZ5d0EyQW94VUlBTkJDVFlDa0ZRZ0EwSGVDRHNCbEZRZ0EwR3puOHNBTmdLWVZDQURRUWsyQXB4VUlBTkJqd2c3QWFCVUlBTkJ2Si9MQURZQ3BGUWdBMEVKTmdLb1ZDQURRZUlJT3dHc1ZDQURRY1dmeXdBMkFyQlVJQU5CQ1RZQ3RGUWdBMEh5Q0RzQnVGUWdBMEhPbjhzQU5nSzhWQ0FEUVFrMkFzQlVJQU5COUFnN0FjUlVJQU5CMTUvTEFEWUN5RlFnQTBFSk5nTE1WQ0FEUWNidEF6c0IwRlFnQTBIZ244c0FOZ0xVVkNBRFFRazJBdGhVSUFOQjN3ZzdBZHhVSUFOQjZaL0xBRFlDNEZRZ0EwRUpOZ0xrVkNBRFFlTUlPd0hvVkNBRFFmS2Z5d0EyQXV4VUlBTkJDVFlDOEZRZ0EwSHpDRHNCOUZRZ0EwSDduOHNBTmdMNFZDQURRUWsyQXZ4VUlBTkI5UWc3QVlCVklBTkJoS0RMQURZQ2hGVWdBMEVKTmdLSVZTQURRY2Z0QXpzQmpGVWdBMEdOb01zQU5nS1FWU0FEUVFrMkFwUlZJQU5CeU8wRE93R1lWU0FEUVphZ3l3QTJBcHhWSUFOQkNUWUNvRlVnQTBIWkNUc0JwRlVnQTBHZm9Nc0FOZ0tvVlNBRFFRYzJBcXhWSUFOQmpzQUFPd0d3VlNBRFFhYWd5d0EyQXJSVklBTkJCellDdUZVZ0EwR1B3QUE3QWJ4VklBTkJyYURMQURZQ3dGVWdBMEVITmdMRVZTQURRWTNBQURzQnlGVWdBMEcwb01zQU5nTE1WU0FEUVFrMkF0QlZJQU5CNmd3N0FkUlZJQU5CdmFETEFEWUMyRlVnQTBFSk5nTGNWU0FEUVl3TU93SGdWU0FEUWNhZ3l3QTJBdVJWSUFOQkNUWUM2RlVnQTBIZ0REc0I3RlVnQTBIUG9Nc0FOZ0x3VlNBRFFRazJBdlJWSUFOQjRRdzdBZmhWSUFOQjJLRExBRFlDL0ZVZ0EwRUpOZ0tBVmlBRFFlSU1Pd0dFVmlBRFFlR2d5d0EyQW9oV0lBTkJDVFlDakZZZ0EwSGpERHNCa0ZZZ0EwSHFvTXNBTmdLVVZpQURRUWsyQXBoV0lBTkI1QXc3QVp4V0lBTkI4NkRMQURZQ29GWWdBMEVKTmdLa1ZpQURRZVVNT3dHb1ZpQURRZnlneXdBMkFxeFdJQU5CQ1RZQ3NGWWdBMEhtRERzQnRGWWdBMEdGb2NzQU5nSzRWaUFEUVFrMkFyeFdJQU5CNXd3N0FjQldJQU5CanFITEFEWUN4RllnQTBFSk5nTElWaUFEUWVnTU93SE1WaUFEUVplaHl3QTJBdEJXSUFOQkNUWUMxRllnQTBIcEREc0IyRllnQTBHZ29jc0FOZ0xjVmlBRFFRazJBdUJXSUFOQm13dzdBZVJXSUFOQnFhSExBRFlDNkZZZ0EwRUpOZ0xzVmlBRFFaOE1Pd0h3VmlBRFFiS2h5d0EyQXZSV0lBTkJDVFlDK0ZZZ0EwR2hERHNCL0ZZZ0EwRzdvY3NBTmdLQVZ5QURRUWsyQW9SWElBTkJvZ3c3QVloWElBTkJ4S0hMQURZQ2pGY2dBMEVKTmdLUVZ5QURRYU1NT3dHVVZ5QURRYzJoeXdBMkFwaFhJQU5CQ1RZQ25GY2dBMEdrRERzQm9GY2dBMEhXb2NzQU5nS2tWeUFEUVFrMkFxaFhJQU5CcFF3N0FheFhJQU5CMzZITEFEWUNzRmNnQTBFSk5nSzBWeUFEUWFZTU93RzRWeUFEUWVpaHl3QTJBcnhYSUFOQkNUWUN3RmNnQTBHbkREc0J4RmNnQTBIeG9jc0FOZ0xJVnlBRFFRazJBc3hYSUFOQnFBdzdBZEJYSUFOQitxSExBRFlDMUZjZ0EwRUpOZ0xZVnlBRFFha01Pd0hjVnlBRFFZT2l5d0EyQXVCWElBTkJDVFlDNUZjZ0EwR3FERHNCNkZjZ0EwR01vc3NBTmdMc1Z5QURRUWsyQXZCWElBTkJxd3c3QWZSWElBTkJsYUxMQURZQytGY2dBMEVKTmdMOFZ5QURRYXdNT3dHQVdDQURRWjZpeXdBMkFvUllJQU5CQ1RZQ2lGZ2dBMEd0RERzQmpGZ2dBMEdub3NzQU5nS1FXQ0FEUVFrMkFwUllJQU5Ccmd3N0FaaFlJQU5Cc0tMTEFEWUNuRmdnQTBFSk5nS2dXQ0FEUWE4TU93R2tXQ0FEUWJtaXl3QTJBcWhZSUFOQkNUWUNyRmdnQTBHd0REc0JzRmdnQTBIQ29zc0FOZ0swV0NBRFFRazJBcmhZSUFOQnNRdzdBYnhZSUFOQnk2TExBRFlDd0ZnZ0EwRUpOZ0xFV0NBRFFiSU1Pd0hJV0NBRFFkU2l5d0EyQXN4WUlBTkJDVFlDMEZnZ0EwR3pERHNCMUZnZ0EwSGRvc3NBTmdMWVdDQURRUWsyQXR4WUlBTkJ0QXc3QWVCWUlBTkI1cUxMQURZQzVGZ2dBMEVKTmdMb1dDQURRYlVNT3dIc1dDQURRZStpeXdBMkF2QllJQU5CQ1RZQzlGZ2dBMEcyRERzQitGZ2dBMEg0b3NzQU5nTDhXQ0FEUVFrMkFvQlpJQU5CdHd3N0FZUlpJQU5CZ2FQTEFEWUNpRmtnQTBFSk5nS01XU0FEUWJnTU93R1FXU0FEUVlxanl3QTJBcFJaSUFOQkNUWUNtRmtnQTBHNUREc0JuRmtnQTBHVG84c0FOZ0tnV1NBRFFRazJBcVJaSUFOQnVndzdBYWhaSUFOQm5LUExBRFlDckZrZ0EwRUpOZ0t3V1NBRFFjQU1Pd0cwV1NBRFFhV2p5d0EyQXJoWklBTkJDVFlDdkZrZ0EwSEJERHNCd0ZrZ0EwR3VvOHNBTmdMRVdTQURRUWsyQXNoWklBTkJ3Z3c3QWN4WklBTkJ0NlBMQURZQzBGa2dBMEVKTmdMVVdTQURRY01NT3dIWVdTQURRY0NqeXdBMkF0eFpJQU5CQ1RZQzRGa2dBMEhFRERzQjVGa2dBMEhKbzhzQU5nTG9XU0FEUVFrMkF1eFpJQU5CeFF3N0FmQlpJQU5CMHFQTEFEWUM5RmtnQTBFSk5nTDRXU0FEUWNZTU93SDhXU0FEUWR1anl3QTJBb0JhSUFOQkNUWUNoRm9nQTBISUREc0JpRm9nQTBIa284c0FOZ0tNV2lBRFFRazJBcEJhSUFOQnlRdzdBWlJhSUFOQjdhUExBRFlDbUZvZ0EwRUpOZ0tjV2lBRFFjb01Pd0dnV2lBRFFmYWp5d0EyQXFSYUlBTkJDVFlDcUZvZ0EwSExERHNCckZvZ0EwSC9vOHNBTmdLd1dpQURRUWsyQXJSYUlBTkJ6QXc3QWJoYUlBTkJpS1RMQURZQ3ZGb2dBMEVKTmdMQVdpQURRYzBNT3dIRVdpQURRWkdreXdBMkFzaGFJQU5CQ1RZQ3pGb2dBMEhPRERzQjBGb2dBMEdhcE1zQU5nTFVXaUFEUVFrMkF0aGFJQU5Cend3N0FkeGFJQU5CbzZUTEFEWUM0Rm9nQTBFSk5nTGtXaUFEUWRBTU93SG9XaUFEUWF5a3l3QTJBdXhhSUFOQkNUWUM4Rm9nQTBIUkREc0I5Rm9nQTBHMXBNc0FOZ0w0V2lBRFFRazJBdnhhSUFOQjBndzdBWUJiSUFOQnZxVExBRFlDaEZzZ0EwRUpOZ0tJV3lBRFFjY01Pd0dNV3lBRFFjZWt5d0EyQXBCYklBTkJDVFlDbEZzZ0EwR2tEVHNCbUZzZ0EwSFFwTXNBTmdLY1d5QURRUWsyQXFCYklBTkIvZ3c3QWFSYklBTkIyYVRMQURZQ3FGc2dBMEVKTmdLc1d5QURRWVlOT3dHd1d5QURRZUtreXdBMkFyUmJJQU5CQ1RZQ3VGc2dBMEdZRFRzQnZGc2dBMEhycE1zQU5nTEFXeUFEUVFrMkFzUmJJQU5CcncwN0FjaGJJQU5COUtUTEFEWUN6RnNnQTBFSk5nTFFXeUFEUWZrTU93SFVXeUFEUWYya3l3QTJBdGhiSUFOQkNUWUMzRnNnQTBHSURUc0I0RnNnQTBHR3Bjc0FOZ0xrV3lBRFFRazJBdWhiSUFOQmtRMDdBZXhiSUFOQmo2WExBRFlDOEZzZ0EwRUpOZ0wwV3lBRFFib05Pd0g0V3lBRFFaaWx5d0EyQXZ4YklBTkJDVFlDZ0Z3Z0EwSFNEVHNCaEZ3Z0EwR2hwY3NBTmdLSVhDQURRUWsyQW94Y0lBTkIxUTA3QVpCY0lBTkJxcVhMQURZQ2xGd2dBMEVKTmdLWVhDQURRYXJCQURzQm5Gd2dBMEd6cGNzQU5nS2dYQ0FEUVFrMkFxUmNJQU5CdmdzN0FhaGNJQU5CdktYTEFEWUNyRndnQTBFSk5nS3dYQ0FEUWNNTE93RzBYQ0FEUWNXbHl3QTJBcmhjSUFOQkNUWUN2RndnQTBIUUN6c0J3RndnQTBIT3Bjc0FOZ0xFWENBRFFRazJBc2hjSUFOQjBRczdBY3hjSUFOQjE2WExBRFlDMEZ3Z0EwRUpOZ0xVWENBRFFkSUxPd0hZWENBRFFlQ2x5d0EyQXR4Y0lBTkJDVFlDNEZ3Z0EwSFRDenNCNUZ3Z0EwSHBwY3NBTmdMb1hDQURRUWsyQXV4Y0lBTkIxQXM3QWZCY0lBTkI4cVhMQURZQzlGd2dBMEVKTmdMNFhDQURRZFVMT3dIOFhDQURRZnVseXdBMkFvQmRJQU5CQ1RZQ2hGMGdBMEhXQ3pzQmlGMGdBMEdFcHNzQU5nS01YU0FEUVFrMkFwQmRJQU5CMXdzN0FaUmRJQU5CamFiTEFEWUNtRjBnQTBFSk5nS2NYU0FEUWRnTE93R2dYU0FEUVphbXl3QTJBcVJkSUFOQkNUWUNxRjBnQTBIWkN6c0JyRjBnQTBHZnBzc0FOZ0t3WFNBRFFRazJBclJkSUFOQjJnczdBYmhkSUFOQnFLYkxBRFlDdkYwZ0EwRUpOZ0xBWFNBRFFkc0xPd0hFWFNBRFFiR215d0EyQXNoZElBTkJDVFlDekYwZ0EwSGNDenNCMEYwZ0EwRzZwc3NBTmdMVVhTQURRUWsyQXRoZElBTkIzUXM3QWR4ZElBTkJ3NmJMQURZQzRGMGdBMEVKTmdMa1hTQURRZDRMT3dIb1hTQURRY3lteXdBMkF1eGRJQU5CQ1RZQzhGMGdBMEhmQ3pzQjlGMGdBMEhWcHNzQU5nTDRYU0FEUVFrMkF2eGRJQU5CNEFzN0FZQmVJQU5CM3FiTEFEWUNoRjRnQTBFSk5nS0lYaUFEUWVFTE93R01YaUFEUWVlbXl3QTJBcEJlSUFOQkNUWUNsRjRnQTBIaUN6c0JtRjRnQTBId3Bzc0FOZ0tjWGlBRFFRazJBcUJlSUFOQjR3czdBYVJlSUFOQithYkxBRFlDcUY0Z0EwRUpOZ0tzWGlBRFFlUUxPd0d3WGlBRFFZS255d0EyQXJSZUlBTkJDVFlDdUY0Z0EwSGxDenNCdkY0Z0EwR0xwOHNBTmdMQVhpQURRUWsyQXNSZUlBTkI1Z3M3QWNoZUlBTkJsS2ZMQURZQ3pGNGdBMEVKTmdMUVhpQURRZWNMT3dIVVhpQURRWjJueXdBMkF0aGVJQU5CQ1RZQzNGNGdBMEhvQ3pzQjRGNGdBMEdtcDhzQU5nTGtYaUFEUVFrMkF1aGVJQU5CNlFzN0FleGVJQU5CcjZmTEFEWUM4RjRnQTBFSk5nTDBYaUFEUWVvTE93SDRYaUFEUWJpbnl3QTJBdnhlSUFOQkNUWUNnRjhnQTBHcTlnTTdBWVJmSUFOQndhZkxBRFlDaUY4Z0EwRUpOZ0tNWHlBRFFhdjJBenNCa0Y4Z0EwSEtwOHNBTmdLVVh5QURRUWsyQXBoZklBTkJ5L1lET3dHY1h5QURRZE9ueXdBMkFxQmZJQU5CQ1RZQ3BGOGdBMEdmOWdNN0FhaGZJQU5CM0tmTEFEWUNyRjhnQTBFSk5nS3dYeUFEUWZBTE93RzBYeUFEUWVXbnl3QTJBcmhmSUFOQkNUWUN2RjhnQTBIeEN6c0J3RjhnQTBIdXA4c0FOZ0xFWHlBRFFRazJBc2hmSUFOQjhnczdBY3hmSUFOQjk2ZkxBRFlDMEY4Z0EwRUpOZ0xVWHlBRFFiWDJBenNCMkY4Z0EwR0FxTXNBTmdMY1h5QURRUWsyQXVCZklBTkJ0QXM3QWVSZklBTkJpYWpMQURZQzZGOGdBMEVKTmdMc1h5QURRYlVMT3dId1h5QURRWktveXdBMkF2UmZJQU5CQ1RZQytGOGdBMEcyQ3pzQi9GOGdBMEdicU1zQU5nS0FZQ0FEUVFrMkFvUmdJQU5CdXdzN0FZaGdJQU5CcEtqTEFEWUNqR0FnQTBFSk5nS1FZQ0FEUWJnTE93R1VZQ0FEUWEyb3l3QTJBcGhnSUFOQkNUWUNuR0FnQTBHM0N6c0JvR0FnQTBHMnFNc0FOZ0trWUNBRFFRazJBcWhnSUFOQnNBczdBYXhnSUFOQnY2akxBRFlDc0dBZ0EwRUpOZ0swWUNBRFFiSUxPd0c0WUNBRFFjaW95d0EyQXJ4Z0lBTkJDVFlDd0dBZ0EwR3hDenNCeEdBZ0EwSFJxTXNBTmdMSVlDQURRUWsyQXN4Z0lBTkJzd3M3QWRCZ0lBTkIycWpMQURZQzFHQWdBMEVKTmdMWVlDQURRY0lMT3dIY1lDQURRZU9veXdBMkF1QmdJQU5CQ1RZQzVHQWdBMEhCQ3pzQjZHQWdBMEhzcU1zQU5nTHNZQ0FEUVFrMkF2QmdJQU5CdVFzN0FmUmdJQU5COWFqTEFEWUMrR0FnQTBFSk5nTDhZQ0FEUWJ3TE93R0FZU0FEUWY2b3l3QTJBb1JoSUFOQkNUWUNpR0VnQTBHOUN6c0JqR0VnQTBHSHFjc0FOZ0tRWVNBRFFRazJBcFJoSUFOQnZ3czdBWmhoSUFOQmtLbkxBRFlDbkdFZ0EwRUpOZ0tnWVNBRFFjQUxPd0drWVNBRFFabXB5d0EyQXFoaElBTkJDVFlDckdFZ0EwRzhCVHNCc0dFZ0EwR2lxY3NBTmdLMFlTQURRUWsyQXJoaElBTkJoY0lBT3dHOFlTQURRYXVweXdBMkFzQmhJQU5CQ1RZQ3hHRWdBMEdUd2dBN0FjaGhJQU5CdEtuTEFEWUN6R0VnQTBFSk5nTFFZU0FEUVpiQ0FEc0IxR0VnQTBHOXFjc0FOZ0xZWVNBRFFRazJBdHhoSUFOQnJNQUFPd0hnWVNBRFFjYXB5d0EyQXVSaElBTkJDVFlDNkdFZ0EwR3R3QUE3QWV4aElBTkJ6Nm5MQURZQzhHRWdBMEVKTmdMMFlTQURRYTdBQURzQitHRWdBMEhZcWNzQU5nTDhZU0FEUVFrMkFvQmlJQU5Cak1BQU93R0VZaUFEUWVHcHl3QTJBb2hpSUFOQkNUWUNqR0lnQTBIdEREc0JrR0lnQTBIcXFjc0FOZ0tVWWlBRFFRazJBcGhpSUFOQnZRVTdBWnhpSUFOQjg0Yk9BRFlDb0dJZ0EwRUdOZ0trWWlBRFFlQUJPd0dvWWlBRFFmT3B5d0EyQXF4aUlBTkJDVFlDc0dJZ0EwR0ZGVHNCdEdJZ0EwSDhxY3NBTmdLNFlpQURRUWsyQXJ4aUlBTkJoUlE3QWNCaUlBTkJoYXJMQURZQ3hHSWdBMEVKTmdMSVlpQURRY0xnQURzQnpHSWdBMEdPcXNzQU5nTFFZaUFEUVFvMkF0UmlJQU5Cb3owN0FkaGlJQU5CbUtyTEFEWUMzR0lnQTBFSk5nTGdZaUFEUVpBVE93SGtZaUFEUWFHcXl3QTJBdWhpSUFOQkNqWUM3R0lnQTBHZTRnQTdBZkJpSUFOQnE2ckxBRFlDOUdJZ0EwRUdOZ0w0WWlBRFFaQVNPd0g4WWlBRFFiR3F5d0EyQW9CaklBTkJDellDaEdNZ0EwSFZDVHNCaUdNZ0EwRzhxc3NBTmdLTVl5QURRUW8yQXBCaklBTkJrQlU3QVpSaklBTkJ4cXJMQURZQ21HTWdBMEVLTmdLY1l5QURRWkFVT3dHZ1l5QURRZENxeXdBMkFxUmpJQU5CRHpZQ3FHTWdBMEhJRkRzQnJHTWdBMEhmcXNzQU5nS3dZeUFEUVFrMkFyUmpJQU5CdVF3N0FiaGpJQU5CNktyTEFEWUN2R01nQTBFT05nTEFZeUFEUWNyOUF6c0J4R01nQTBIMnFzc0FOZ0xJWXlBRFFSQTJBc3hqSUFOQnkvMERPd0hRWXlBRFFZYXJ5d0EyQXRSaklBTkJEellDMkdNZ0EwSE0vUU03QWR4aklBTkJsYXZMQURZQzRHTWdBMEVPTmdMa1l5QURRWU1FT3dIb1l5QURRYU9yeXdBMkF1eGpJQU5CRWpZQzhHTWdBMEhJRXpzQjlHTWdBMEcxcThzQU5nTDRZeUFEUVE4MkF2eGpJQU5CeUJJN0FZQmtJQU5CeEt2TEFEWUNoR1FnQTBFVE5nS0laQ0FEUWNnVk93R01aQ0FEUWRlcnl3QTJBcEJrSUFOQkNUWUNsR1FnQTBHaTRRQTdBWmhrSUFOQjRLdkxBRFlDbkdRZ0EwRVNOZ0tnWkNBRFFmSCtBenNCcEdRZ0EwSHlxOHNBTmdLb1pDQURRUWMyQXF4a0lBTkJ6K0lBT3dHd1pDQURRZm1yeXdBMkFyUmtJQU5CQkRZQ3VHUWdBMEhRQ3pzQnZHUWdBMEg5cThzQU5nTEFaQ0FEUVFvMkFzUmtJQU5CcHd3N0FjaGtJQU5CaDZ6TEFEWUN6R1FnQTBFUU5nTFFaQ0FEUWJEMkF6c0IxR1FnQTBHWHJNc0FOZ0xZWkNBRFFRODJBdHhrSUFOQmp2MERPd0hnWkNBRFFhYXN5d0EyQXVSa0lBTkJGRFlDNkdRZ0EwR2pERHNCN0dRZ0EwRzZyTXNBTmdMd1pDQURRUmsyQXZSa0lBTkJoUDBET3dINFpDQURRZE9zeXdBMkF2eGtJQU5CRkRZQ2dHVWdBMEdsRERzQmhHVWdBMEhuck1zQU5nS0laU0FEUVJrMkFveGxJQU5CaVAwRE93R1FaU0FEUVlDdHl3QTJBcFJsSUFOQkNqWUNtR1VnQTBIUUN6c0JuR1VnQTBHS3Jjc0FOZ0tnWlNBRFFRODJBcVJsSUFOQnovWURPd0dvWlNBRFFabXR5d0EyQXF4bElBTkJGRFlDc0dVZ0EwR2lERHNCdEdVZ0EwR3RyY3NBTmdLNFpTQURRUmsyQXJ4bElBTkJndjBET3dIQVpTQURRY2F0eXdBMkFzUmxJQU5CRVRZQ3lHVWdBMEhKRERzQnpHVWdBMEhYcmNzQU5nTFFaU0FEUVJZMkF0UmxJQU5COFAwRE93SFlaU0FEUWUydHl3QTJBdHhsSUFOQkdEWUM0R1VnQTBIei9RTTdBZVJsSUFOQmhhN0xBRFlDNkdVZ0EwRVhOZ0xzWlNBRFFmVDlBenNCOEdVZ0EwR2Nyc3NBTmdMMFpTQURRUTgyQXZobElBTkJydllET3dIOFpTQURRYXV1eXdBMkFvQm1JQU5CRURZQ2hHWWdBMEd2OWdNN0FZaG1JQU5CcE1YUEFEWUNqR1lnQTBFRk5nS1FaaUFEUWJYQ0FEc0JsR1lnQTBHN3Jzc0FOZ0tZWmlBRFFRZzJBcHhtSUFOQnpNUUFPd0dnWmlBRFFZM0R6d0EyQXFSbUlBTkJCVFlDcUdZZ0EwR3hCenNCckdZZ0EwSERyc3NBTmdLd1ppQURRUW8yQXJSbUlBTkJyQWM3QWJobUlBTkJ6YTdMQURZQ3ZHWWdBMEVMTmdMQVppQURRWUt3QXpzQnhHWWdBMEgwaXM0QU5nTElaaUFEUVFjMkFzeG1JQU5CZ1FJN0FkQm1JQU5CMks3TEFEWUMxR1lnQTBFS05nTFlaaUFEUWNIK0F6c0IzR1lnQTBIRi84MEFOZ0xnWmlBRFFRazJBdVJtSUFOQkpqc0I2R1lnQTBIaXJzc0FOZ0xzWmlBRFFSSTJBdkJtSUFOQmh2NERPd0gwWmlBRFFmU3V5d0EyQXZobUlBTkJEallDL0dZZ0EwR203Z003QVlCbklBTkJncS9MQURZQ2hHY2dBMEVJTmdLSVp5QURRY0xuQURzQmpHY2dBMEdLcjhzQU5nS1FaeUFEUVFvMkFwUm5JQU5Cb3VJQU93R1laeUFEUVpTdnl3QTJBcHhuSUFOQkN6WUNvR2NnQTBHazRnQTdBYVJuSUFOQm42L0xBRFlDcUdjZ0EwRU9OZ0tzWnlBRFFlalBBRHNCc0djZ0EwR3RyOHNBTmdLMFp5QURRUkUyQXJobklBTkJxY1lBT3dHOFp5QURRYjZ2eXdBMkFzQm5JQU5CRWpZQ3hHY2dBMEdweGdBN0FjaG5JQU5CMEsvTEFEWUN6R2NnQTBFUk5nTFFaeUFEUWFuR0FEc0IxR2NnQTBIaHI4c0FOZ0xZWnlBRFFSSTJBdHhuSUFOQnFjWUFPd0hnWnlBRFFmT3Z5d0EyQXVSbklBTkJEellDNkdjZ0EwSHB6d0E3QWV4bklBTkJnckRMQURZQzhHY2dBMEVTTmdMMFp5QURRYXJHQURzQitHY2dBMEdVc01zQU5nTDhaeUFEUVJNMkFvQm9JQU5CcXNZQU93R0VhQ0FEUWFld3l3QTJBb2hvSUFOQkVqWUNqR2dnQTBHcXhnQTdBWkJvSUFOQnViRExBRFlDbEdnZ0EwRVROZ0tZYUNBRFFhckdBRHNCbkdnZ0EwSE1zTXNBTmdLZ2FDQURRUTQyQXFSb0lBTkIyaHc3QWFob0lBTkJ3OGJQQURZQ3JHZ2dBMEVGTmdLd2FDQURRYURFQURzQnRHZ2dBMEhhc01zQU5nSzRhQ0FEUVJBMkFyeG9JQU5CaU9BQU93SEFhQ0FEUWVxd3l3QTJBc1JvSUFOQkdEWUN5R2dnQTBHLy9BTTdBY3hvSUFOQmdySExBRFlDMEdnZ0EwRVJOZ0xVYUNBRFFZbmdBRHNCMkdnZ0EwR1RzY3NBTmdMY2FDQURRUmsyQXVCb0lBTkJ3UHdET3dIa2FDQURRZFhIendBMkF1aG9JQU5CQ1RZQzdHZ2dBMEdweGdBN0FmQm9JQU5CckxITEFEWUM5R2dnQTBFTU5nTDRhQ0FEUWFuR0FEc0IvR2dnQTBHNHNjc0FOZ0tBYVNBRFFRMDJBb1JwSUFOQnFjWUFPd0dJYVNBRFFjV3h5d0EyQW94cElBTkJERFlDa0drZ0EwR3B4Z0E3QVpScElBTkIwYkhMQURZQ21Ha2dBMEVOTmdLY2FTQURRYW5HQURzQm9Ha2dBMEgxeU04QU5nS2thU0FEUVFvMkFxaHBJQU5CcXNZQU93R3NhU0FEUWQ2eHl3QTJBckJwSUFOQkRUWUN0R2tnQTBHcXhnQTdBYmhwSUFOQjY3SExBRFlDdkdrZ0EwRU9OZ0xBYVNBRFFhckdBRHNCeEdrZ0EwSDVzY3NBTmdMSWFTQURRUTAyQXN4cElBTkJxc1lBT3dIUWFTQURRWWF5eXdBMkF0UnBJQU5CRGpZQzJHa2dBMEdxeGdBN0FkeHBJQU5CbExMTEFEWUM0R2tnQTBFSU5nTGthU0FEUWF2Q0FEc0I2R2tnQTBHY3Nzc0FOZ0xzYVNBRFFRazJBdkJwSUFOQmh3YzdBZlJwSUFOQnBiTExBRFlDK0drZ0EwRU5OZ0w4YVNBRFFmTFBBRHNCZ0dvZ0EwR3lzc3NBTmdLRWFpQURRUXcyQW9ocUlBTkIwaEk3QVl4cUlBTkJ2ckxMQURZQ2tHb2dBMEVQTmdLVWFpQURRWUlUT3dHWWFpQURRYzJ5eXdBMkFweHFJQU5CRERZQ29Hb2dBMEdDRWpzQnBHb2dBMEhac3NzQU5nS29haUFEUVJBMkFxeHFJQU5CZ2hVN0FiQnFJQU5CbUliT0FEWUN0R29nQTBFSE5nSzRhaUFEUVlVQ093RzhhaUFEUWVteXl3QTJBc0JxSUFOQkREWUN4R29nQTBHQTVnQTdBY2hxSUFOQjliTExBRFlDekdvZ0EwRUdOZ0xRYWlBRFFaekpBRHNCMUdvZ0EwSDdzc3NBTmdMWWFpQURRUkkyQXR4cUlBTkIyZ283QWVCcUlBTkJqYlBMQURZQzVHb2dBMEVOTmdMb2FpQURRYndGT3dIc2FpQURRWmpLendBMkF2QnFJQU5CQlRZQzlHb2dBMEgvOFFNN0FmaHFJQU5CbXJQTEFEWUMvR29nQTBFS05nS0FheUFEUWRERUFEc0JoR3NnQTBIMHhNOEFOZ0tJYXlBRFFRczJBb3hySUFOQnlNUUFPd0dRYXlBRFFhU3p5d0EyQXBScklBTkJFallDbUdzZ0EwSFN4QUE3QVp4cklBTkJ0clBMQURZQ29Hc2dBMEVTTmdLa2F5QURRY1hFQURzQnFHc2dBMEhJczhzQU5nS3NheUFEUVEwMkFyQnJJQU5CeXNRQU93RzBheUFEUWRXenl3QTJBcmhySUFOQkREWUN2R3NnQTBHTzR3QTdBY0JySUFOQjRiUExBRFlDeEdzZ0EwRUxOZ0xJYXlBRFFZM2pBRHNCekdzZ0EwSHNzOHNBTmdMUWF5QURRUU0yQXRScklBTkJrc1lBT3dIWWF5QURRZSt6eXdBMkF0eHJJQU5CRERZQzRHc2dBMEcyd3dBN0FlUnJJQU5CKzdQTEFEWUM2R3NnQTBFTk5nTHNheUFEUWJmREFEc0I4R3NnQTBHSXRNc0FOZ0wwYXlBRFFRNDJBdmhySUFOQm1qMDdBZnhySUFOQjNJYk9BRFlDZ0d3Z0EwRUZOZ0tFYkNBRFFlVUJPd0dJYkNBRFFaYTB5d0EyQW94c0lBTkJDallDa0d3Z0EwSDdBenNCbEd3Z0EwR2d0TXNBTmdLWWJDQURRUW8yQXB4c0lBTkJnVHc3QWFCc0lBTkJxOFRQQURZQ3BHd2dBMEVKTmdLb2JDQURRWlREQURzQnJHd2dBMEdxdE1zQU5nS3diQ0FEUVFvMkFyUnNJQU5CbGNNQU93RzRiQ0FEUWJTMHl3QTJBcnhzSUFOQkJ6WUN3R3dnQTBHVHd3QTdBY1JzSUFOQnU3VExBRFlDeUd3Z0EwRU5OZ0xNYkNBRFFlUERBRHNCMEd3Z0EwSEl0TXNBTmdMVWJDQURRUTAyQXRoc0lBTkI0TU1BT3dIY2JDQURRZFcweXdBMkF1QnNJQU5CRGpZQzVHd2dBMEhpd3dBN0FlaHNJQU5CNDdUTEFEWUM3R3dnQTBFTE5nTHdiQ0FEUWVIREFEc0I5R3dnQTBHYXg4OEFOZ0w0YkNBRFFRdzJBdnhzSUFOQjFNTUFPd0dBYlNBRFFlNjB5d0EyQW9SdElBTkJEVFlDaUcwZ0EwSFZ3d0E3QVl4dElBTkJ5Y2ZQQURZQ2tHMGdBMEVNTmdLVWJTQURRZFBEQURzQm1HMGdBMEdteDg4QU5nS2NiU0FEUVF3MkFxQnRJQU5CME1NQU93R2tiU0FEUWJ6SHp3QTJBcWh0SUFOQkRUWUNyRzBnQTBIU3d3QTdBYkJ0SUFOQis3VExBRFlDdEcwZ0EwRUtOZ0s0YlNBRFFkSERBRHNCdkcwZ0EwR3l4ODhBTmdMQWJTQURRUW8yQXNSdElBTkIwY01BT3dISWJTQURRWVcxeXdBMkFzeHRJQU5CRGpZQzBHMGdBMEhWd3dBN0FkUnRJQU5CenNUUEFEWUMyRzBnQTBFSk5nTGNiU0FEUVpQREFEc0I0RzBnQTBHVHRjc0FOZ0xrYlNBRFFRMDJBdWh0SUFOQm1jTUFPd0hzYlNBRFFhQzF5d0EyQXZCdElBTkJEallDOUcwZ0EwR1l3d0E3QWZodElBTkJyclhMQURZQy9HMGdBMEVPTmdLQWJpQURRZW5EQURzQmhHNGdBMEc4dGNzQU5nS0liaUFEUVJBMkFveHVJQU5CeFFVN0FaQnVJQU5CekxYTEFEWUNsRzRnQTBFUU5nS1liaUFEUWNJRk93R2NiaUFEUWR5MXl3QTJBcUJ1SUFOQkVUWUNwRzRnQTBIREJUc0JxRzRnQTBIdHRjc0FOZ0tzYmlBRFFRNDJBckJ1SUFOQnhBVTdBYlJ1SUFOQis3WExBRFlDdUc0Z0EwRU5OZ0s4YmlBRFFhckRBRHNCd0c0Z0EwR0l0c3NBTmdMRWJpQURRUTQyQXNodUlBTkJxY01BT3dITWJpQURRWXJGendBMkF0QnVJQU5CRERZQzFHNGdBMEhuOFFNN0FkaHVJQU5CdE1UUEFEWUMzRzRnQTBFSk5nTGdiaUFEUVpEREFEc0I1RzRnQTBHV3Rzc0FOZ0xvYmlBRFFSQTJBdXh1SUFOQnZjTUFPd0h3YmlBRFFhYTJ5d0EyQXZSdUlBTkJERFlDK0c0Z0EwSFF3d0E3QWZ4dUlBTkJzcmJMQURZQ2dHOGdBMEVTTmdLRWJ5QURRYzNEQURzQmlHOGdBMEhFdHNzQU5nS01ieUFEUVJJMkFwQnZJQU5CeHNNQU93R1VieUFEUWRhMnl3QTJBcGh2SUFOQkVEWUNuRzhnQTBHOHd3QTdBYUJ2SUFOQjVyYkxBRFlDcEc4Z0EwRU9OZ0tvYnlBRFFlYkRBRHNCckc4Z0EwSDB0c3NBTmdLd2J5QURRUTQyQXJSdklBTkJsOE1BT3dHNGJ5QURRWUszeXdBMkFyeHZJQU5CRGpZQ3dHOGdBMEdXd3dBN0FjUnZJQU5Ca0xmTEFEWUN5RzhnQTBFU05nTE1ieUFEUWNiREFEc0IwRzhnQTBHaXQ4c0FOZ0xVYnlBRFFSSTJBdGh2SUFOQnhNTUFPd0hjYnlBRFFjVEV6d0EyQXVCdklBTkJDallDNUc4Z0EwR1N3d0E3QWVodklBTkJ0TGZMQURZQzdHOGdBMEVSTmdMd2J5QURRY0hEQURzQjlHOGdBMEhGdDhzQU5nTDRieUFEUVJNMkF2eHZJQU5CejhNQU93R0FjQ0FEUWRpM3l3QTJBb1J3SUFOQkR6WUNpSEFnQTBHZXp3QTdBWXh3SUFOQjU3ZkxBRFlDa0hBZ0EwRVNOZ0tVY0NBRFFjVERBRHNCbUhBZ0EwSDV0OHNBTmdLY2NDQURRUkUyQXFCd0lBTkJ3TU1BT3dHa2NDQURRWXE0eXdBMkFxaHdJQU5CRHpZQ3JIQWdBMEhvd3dBN0FiQndJQU5CbWJqTEFEWUN0SEFnQTBFT05nSzRjQ0FEUVpqREFEc0J2SEFnQTBHbnVNc0FOZ0xBY0NBRFFRNDJBc1J3SUFOQm1jTUFPd0hJY0NBRFFiVzR5d0EyQXN4d0lBTkJERFlDMEhBZ0EwSGt3d0E3QWRSd0lBTkJ3YmpMQURZQzJIQWdBMEVOTmdMY2NDQURRZVhEQURzQjRIQWdBMEhPdU1zQU5nTGtjQ0FEUVEwMkF1aHdJQU5Cb3NNQU93SHNjQ0FEUWR1NHl3QTJBdkJ3SUFOQkRqWUM5SEFnQTBHand3QTdBZmh3SUFOQjZiakxBRFlDL0hBZ0EwRUhOZ0tBY1NBRFFaSERBRHNCaEhFZ0EwSHd1TXNBTmdLSWNTQURRUTgyQW94eElBTkIyc01BT3dHUWNTQURRZis0eXdBMkFwUnhJQU5CRURZQ21IRWdBMEhid3dBN0FaeHhJQU5CdmNUUEFEWUNvSEVnQTBFSE5nS2tjU0FEUVpIREFEc0JxSEVnQTBHUHVjc0FOZ0tzY1NBRFFRazJBckJ4SUFOQmxjTUFPd0cwY1NBRFFaaTV5d0EyQXJoeElBTkJERFlDdkhFZ0EwR293d0E3QWNCeElBTkJwTG5MQURZQ3hIRWdBMEVQTmdMSWNTQURRYWpEQURzQnpIRWdBMEd6dWNzQU5nTFFjU0FEUVFzMkF0UnhJQU5CbHNNQU93SFljU0FEUWI2NXl3QTJBdHh4SUFOQkVUWUM0SEVnQTBIRnd3QTdBZVJ4SUFOQno3bkxBRFlDNkhFZ0EwRU1OZ0xzY1NBRFFaZkRBRHNCOEhFZ0EwSGJ1Y3NBTmdMMGNTQURRUXcyQXZoeElBTkI1OE1BT3dIOGNTQURRZi9FendBMkFvQnlJQU5CQ3pZQ2hISWdBMEhtOFFNN0FZaHlJQU5CNTduTEFEWUNqSElnQTBFVU5nS1FjaUFEUVlxd0F6c0JsSElnQTBHWGdjNEFOZ0tZY2lBRFFRczJBcHh5SUFOQjNnQTdBYUJ5SUFOQis3bkxBRFlDcEhJZ0EwRVVOZ0tvY2lBRFFiNytBenNCckhJZ0EwSGxnYzRBTmdLd2NpQURRUW8yQXJSeUlBTkIvZ0E3QWJoeUlBTkJqN3JMQURZQ3ZISWdBMEVUTmdMQWNpQURRZDcrQXpzQnhISWdBMEdpdXNzQU5nTEljaUFEUVFjMkFzeHlJQU5CMFFRN0FkQnlJQU5CcWJyTEFEWUMxSElnQTBFTk5nTFljaUFEUWRJRU93SGNjaUFEUWJhNnl3QTJBdUJ5SUFOQkRqWUM1SElnQTBIQjRBQTdBZWh5SUFOQnhMckxBRFlDN0hJZ0EwRU9OZ0x3Y2lBRFFhSGhBRHNCOUhJZ0EwSFN1c3NBTmdMNGNpQURRUmMyQXZ4eUlBTkI1LzRET3dHQWN5QURRZXYvelFBMkFvUnpJQU5CQ0RZQ2lITWdBMEVxT3dHTWN5QURRZW02eXdBMkFwQnpJQU5CRkRZQ2xITWdBMEh0RERzQm1ITWdBMEg5dXNzQU5nS2NjeUFEUVE0MkFxQnpJQU5CN1F3N0FhUnpJQU5CaTd2TEFEWUNxSE1nQTBFUU5nS3NjeUFEUVpmRUFEc0JzSE1nQTBIdXdjOEFOZ0swY3lBRFFRdzJBcmh6SUFOQmw4UUFPd0c4Y3lBRFFadTd5d0EyQXNCeklBTkJFVFlDeEhNZ0EwR0svZ003QWNoeklBTkJyTHZMQURZQ3pITWdBMEVOTmdMUWN5QURRZUg4QXpzQjFITWdBMEc1dThzQU5nTFljeUFEUVFnMkF0eHpJQU5Cd3NBQU93SGdjeUFEUWNHN3l3QTJBdVJ6SUFOQkNUWUM2SE1nQTBIcDdRTTdBZXh6SUFOQnlydkxBRFlDOEhNZ0EwRVROZ0wwY3lBRFFjUEVBRHNCK0hNZ0EwSGJnTTRBTmdMOGN5QURRUUkyQW9CMElBTkJ3QUE3QVlSMElBTkJpNGZPQURZQ2lIUWdBMEVHTmdLTWRDQURRZU1CT3dHUWRDQURRZDI3eXdBMkFwUjBJQU5CQ3pZQ21IUWdBMEdnL2dNN0FaeDBJQU5CNkx2TEFEWUNvSFFnQTBFSE5nS2tkQ0FEUWV2OEF6c0JxSFFnQTBIdnU4c0FOZ0tzZENBRFFRYzJBckIwSUFOQjBBUTdBYlIwSUFOQjlydkxBRFlDdUhRZ0EwRUpOZ0s4ZENBRFFaUVRPd0hBZENBRFFmKzd5d0EyQXNSMElBTkJDallDeUhRZ0EwR2c0Z0E3QWN4MElBTkJpYnpMQURZQzBIUWdBMEVHTmdMVWRDQURRWlFTT3dIWWRDQURRWSs4eXdBMkF0eDBJQU5CQ2pZQzRIUWdBMEdVRlRzQjVIUWdBMEdadk1zQU5nTG9kQ0FEUVFvMkF1eDBJQU5CbEJRN0FmQjBJQU5Cbzd6TEFEWUM5SFFnQTBFVE5nTDRkQ0FEUWRjVE93SDhkQ0FEUWJhOHl3QTJBb0IxSUFOQkR6WUNoSFVnQTBITUZEc0JpSFVnQTBIRnZNc0FOZ0tNZFNBRFFSSTJBcEIxSUFOQnpCTTdBWlIxSUFOQjE3ekxBRFlDbUhVZ0EwRVBOZ0tjZFNBRFFjd1NPd0dnZFNBRFFlYTh5d0EyQXFSMUlBTkJFellDcUhVZ0EwSE1GVHNCckhVZ0EwSDV2TXNBTmdLd2RTQURRUXcyQXJSMUlBTkJ2Ukk3QWJoMUlBTkJoYjNMQURZQ3ZIVWdBMEVMTmdMQWRTQURRZUVLT3dIRWRTQURRWkM5eXdBMkFzaDFJQU5CQkRZQ3pIVWdBMEhpQ3pzQjBIVWdBMEdVdmNzQU5nTFVkU0FEUVJBMkF0aDFJQU5Cb1BZRE93SGNkU0FEUWFTOXl3QTJBdUIxSUFOQkNqWUM1SFVnQTBIaUN6c0I2SFVnQTBHMmdjNEFOZ0xzZFNBRFFRRTJBdkIxSUFOQjRnQTdBZlIxSUFOQnJyM0xBRFlDK0hVZ0EwRUpOZ0w4ZFNBRFFhd1RPd0dBZGlBRFFZS0J6Z0EyQW9SMklBTkJDVFlDaUhZZ0EwSGNBRHNCakhZZ0EwRzN2Y3NBTmdLUWRpQURRUXcyQXBSMklBTkIzQUE3QVpoMklBTkJ3NzNMQURZQ25IWWdBMEVOTmdLZ2RpQURRZHdBT3dHa2RpQURRZEM5eXdBMkFxaDJJQU5CRERZQ3JIWWdBMEhjQURzQnNIWWdBMEhjdmNzQU5nSzBkaUFEUVEwMkFyaDJJQU5CM0FBN0FieDJJQU5CNmIzTEFEWUN3SFlnQTBFU05nTEVkaUFEUWJ6K0F6c0J5SFlnQTBIN3Zjc0FOZ0xNZGlBRFFRWTJBdEIySUFOQnJCSTdBZFIySUFOQmdiN0xBRFlDMkhZZ0EwRUtOZ0xjZGlBRFFhd1ZPd0hnZGlBRFFZdSt5d0EyQXVSMklBTkJDallDNkhZZ0EwR3NGRHNCN0hZZ0EwR1Z2c3NBTmdMd2RpQURRUW8yQXZSMklBTkI4T0FBT3dINGRpQURRWisreXdBMkF2eDJJQU5CQ0RZQ2dIY2dBMEcvSERzQmhIY2dBMEdudnNzQU5nS0lkeUFEUVFvMkFveDNJQU5CME9FQU93R1FkeUFEUWRpQnpnQTJBcFIzSUFOQkF6WUNtSGNnQTBIOEFEc0JuSGNnQTBHeHZzc0FOZ0tnZHlBRFFRWTJBcVIzSUFOQnBjUUFPd0dvZHlBRFFiZSt5d0EyQXF4M0lBTkJDRFlDc0hjZ0EwR1d3QUE3QWJSM0lBTkJ2NzdMQURZQ3VIY2dBMEVGTmdLOGR5QURRZndBT3dIQWR5QURRY1MreXdBMkFzUjNJQU5CRERZQ3lIY2dBMEhjL2dNN0FjeDNJQU5CMEw3TEFEWUMwSGNnQTBFSk5nTFVkeUFEUVlYaUFEc0IySGNnQTBIWnZzc0FOZ0xjZHlBRFFRYzJBdUIzSUFOQjBja0FPd0hrZHlBRFFlQyt5d0EyQXVoM0lBTkJDallDN0hjZ0EwR0RQRHNCOEhjZ0EwSHF2c3NBTmdMMGR5QURRUWsyQXZoM0lBTkJoVHc3QWZ4M0lBTkI4NzdMQURZQ2dIZ2dBMEVVTmdLRWVDQURRZXpNQURzQmlIZ2dBMEdIdjhzQU5nS01lQ0FEUVFjMkFwQjRJQU5CdGNRQU93R1VlQ0FEUVk2L3l3QTJBcGg0SUFOQkNqWUNuSGdnQTBHeENEc0JvSGdnQTBHWXY4c0FOZ0trZUNBRFFRazJBcWg0SUFOQnFBdzdBYXg0SUFOQm9iL0xBRFlDc0hnZ0EwRU9OZ0swZUNBRFFaRDlBenNCdUhnZ0EwR3Z2OHNBTmdLOGVDQURRUkEyQXNCNElBTkJrZjBET3dIRWVDQURRYisveXdBMkFzaDRJQU5CQ2pZQ3pIZ2dBMEg1NEFBN0FkQjRJQU5CeWIvTEFEWUMxSGdnQTBFUE5nTFllQ0FEUVpMOUF6c0IzSGdnQTBIWXY4c0FOZ0xnZUNBRFFSUTJBdVI0SUFOQm4va0RPd0hvZUNBRFFleS95d0EyQXV4NElBTkJGVFlDOEhnZ0EwR0krQU03QWZSNElBTkJnY0RMQURZQytIZ2dBMEVTTmdMOGVDQURRZTM0QXpzQmdIa2dBMEdUd01zQU5nS0VlU0FEUVFvMkFvaDVJQU5CMmVFQU93R01lU0FEUVozQXl3QTJBcEI1SUFOQkN6WUNsSGtnQTBIaUNqc0JtSGtnQTBHb3dNc0FOZ0tjZVNBRFFRTTJBcUI1SUFOQjBRczdBYVI1SUFOQmtzUFBBRFlDcUhrZ0EwRUVOZ0tzZVNBRFFiSUhPd0d3ZVNBRFFhdkF5d0EyQXJSNUlBTkJEellDdUhrZ0EwSFFCenNCdkhrZ0EwRzZ3TXNBTmdMQWVTQURRUWsyQXNSNUlBTkJzZllET3dISWVTQURRY1BBeXdBMkFzeDVJQU5CRHpZQzBIa2dBMEd4OWdNN0FkUjVJQU5CMHNETEFEWUMySGtnQTBFRU5nTGNlU0FEUWJiQ0FEc0I0SGtnQTBIV3dNc0FOZ0xrZVNBRFFRazJBdWg1SUFOQjBRczdBZXg1SUFOQjM4RExBRFlDOEhrZ0EwRU5OZ0wwZVNBRFFjejJBenNCK0hrZ0EwSHN3TXNBTmdMOGVTQURRUWMyQW9CNklBTkI3TVFBT3dHRWVpQURRZlBBeXdBMkFvaDZJQU5CQ2pZQ2pIb2dBMEd0RXpzQmtIb2dBMEg5d01zQU5nS1VlaUFEUVFjMkFwaDZJQU5CclJJN0FaeDZJQU5CaE1ITEFEWUNvSG9nQTBFTE5nS2tlaUFEUWEwVk93R29laUFEUVkvQnl3QTJBcXg2SUFOQkN6WUNzSG9nQTBHdEZEc0J0SG9nQTBHYXdjc0FOZ0s0ZWlBRFFRVTJBcng2SUFOQjB3UTdBY0I2SUFOQm44SExBRFlDeEhvZ0EwRUtOZ0xJZWlBRFFmUGdBRHNCekhvZ0EwR3B3Y3NBTmdMUWVpQURRUW8yQXRSNklBTkIwK0VBT3dIWWVpQURRYlBCeXdBMkF0eDZJQU5CRFRZQzRIb2dBMEdZQlRzQjVIb2dBMEhBd2NzQU5nTG9laUFEUVEwMkF1eDZJQU5CZ2hRN0FmQjZJQU5CemNITEFEWUM5SG9nQTBFS05nTDRlaUFEUWJIbUFEc0IvSG9nQTBIWHdjc0FOZ0tBZXlBRFFRczJBb1I3SUFOQno4c0FPd0dJZXlBRFFlTEJ5d0EyQW94N0lBTkJERFlDa0hzZ0EwSEd5d0E3QVpSN0lBTkI3c0hMQURZQ21Ic2dBMEVaTmdLY2V5QURRYnpMQURzQm9Ic2dBMEdId3NzQU5nS2tleUFEUVJnMkFxaDdJQU5CeE1zQU93R3NleUFEUVovQ3l3QTJBckI3SUFOQkdUWUN0SHNnQTBIQXl3QTdBYmg3SUFOQnVNTExBRFlDdkhzZ0EwRWFOZ0xBZXlBRFFaRGdBRHNCeEhzZ0EwSFN3c3NBTmdMSWV5QURRU0kyQXN4N0lBTkJ1L3dET3dIUWV5QURRZlRDeXdBMkF0UjdJQU5CR3pZQzJIc2dBMEdSNEFBN0FkeDdJQU5CajhQTEFEWUM0SHNnQTBFak5nTGtleUFEUWJ6OEF6c0I2SHNnQTBHeXc4c0FOZ0xzZXlBRFFSWTJBdkI3SUFOQjQ4c0FPd0gwZXlBRFFjakR5d0EyQXZoN0lBTkJGellDL0hzZ0EwSGl5d0E3QVlCOElBTkIzOFBMQURZQ2hId2dBMEVPTmdLSWZDQURRYXpMQURzQmpId2dBMEh0dzhzQU5nS1FmQ0FEUVJrMkFwUjhJQU5CdXNzQU93R1lmQ0FEUVliRXl3QTJBcHg4SUFOQkdqWUNvSHdnQTBHMnl3QTdBYVI4SUFOQm9NVExBRFlDcUh3Z0EwRVFOZ0tzZkNBRFFhckxBRHNCc0h3Z0EwR3d4TXNBTmdLMGZDQURRUkEyQXJoOElBTkJ1OHdBT3dHOGZDQURRY0RFeXdBMkFzQjhJQU5CQ3pZQ3hId2dBMEdneXdBN0FjaDhJQU5CeThUTEFEWUN6SHdnQTBFSk5nTFFmQ0FEUVlYTUFEc0IxSHdnQTBIVXhNc0FOZ0xZZkNBRFFSWTJBdHg4SUFOQjVNc0FPd0hnZkNBRFFlckV5d0EyQXVSOElBTkJGellDNkh3Z0EwSGx5d0E3QWV4OElBTkJnY1hMQURZQzhId2dBMEVjTmdMMGZDQURRYlRMQURzQitId2dBMEdkeGNzQU5nTDhmQ0FEUVJjMkFvQjlJQU5Cc3NzQU93R0VmU0FEUWJURnl3QTJBb2g5SUFOQkJUWUNqSDBnQTBHanlBQTdBWkI5SUFOQnVjWExBRFlDbEgwZ0EwRUtOZ0tZZlNBRFFZYzhPd0djZlNBRFFjUEZ5d0EyQXFCOUlBTkJCVFlDcEgwZ0EwR0l5d0E3QWFoOUlBTkJ5TVhMQURZQ3JIMGdBMEVLTmdLd2ZTQURRY0wrQXpzQnRIMGdBMEhTeGNzQU5nSzRmU0FEUVF3MkFyeDlJQU5CbWh3N0FjQjlJQU5CM3NYTEFEWUN4SDBnQTBFS05nTElmU0FEUWZ6Z0FEc0J6SDBnQTBIb3hjc0FOZ0xRZlNBRFFRbzJBdFI5SUFOQjNPRUFPd0hZZlNBRFFmTEZ5d0EyQXR4OUlBTkJCallDNEgwZ0EwR2R5UUE3QWVSOUlBTkIrTVhMQURZQzZIMGdBMEVJTmdMc2ZTQURRY1BuQURzQjhIMGdBMEh1eU04QU5nTDBmU0FEUVFjMkF2aDlJQU5COVBFRE93SDhmU0FEUVlER3l3QTJBb0IrSUFOQkVUWUNoSDRnQTBHMy9BTTdBWWgrSUFOQmtjYkxBRFlDakg0Z0EwRVNOZ0tRZmlBRFFiZjhBenNCbEg0Z0EwR2p4c3NBTmdLWWZpQURRUTgyQXB4K0lBTkJ1UHdET3dHZ2ZpQURRYkxHeXdBMkFxUitJQU5CRURZQ3FINGdBMEc0L0FNN0FheCtJQU5CejRIT0FEWUNzSDRnQTBFSk5nSzBmaUFEUWZzQU93RzRmaUFEUWNMR3l3QTJBcngrSUFOQkREWUN3SDRnQTBIN0FEc0J4SDRnQTBIT3hzc0FOZ0xJZmlBRFFRMDJBc3grSUFOQit3QTdBZEIrSUFOQjI4YkxBRFlDMUg0Z0EwRU1OZ0xZZmlBRFFmc0FPd0hjZmlBRFFlZkd5d0EyQXVCK0lBTkJEVFlDNUg0Z0EwSDdBRHNCNkg0Z0EwSGp5TThBTmdMc2ZpQURRUXMyQXZCK0lBTkI4L0VET3dIMGZpQURRZGZJendBMkF2aCtJQU5CRERZQy9INGdBMEh5OFFNN0FZQi9JQU5COU1iTEFEWUNoSDhnQTBFU05nS0lmeUFEUWR2K0F6c0JqSDhnQTBHR3g4c0FOZ0tRZnlBRFFRNDJBcFIvSUFOQjIvd0RPd0dZZnlBRFFjekl6d0EyQXB4L0lBTkJDellDb0g4Z0EwSHg4UU03QWFSL0lBTkJsTWZMQURZQ3FIOGdBMEVSTmdLc2Z5QURRYmY4QXpzQnNIOGdBMEhiZ2M0QU5nSzBmeUFEUVFvMkFyaC9JQU5CL1FBN0FieC9JQU5CcGNmTEFEWUN3SDhnQTBFTk5nTEVmeUFEUWYwQU93SElmeUFEUWJMSHl3QTJBc3gvSUFOQkRqWUMwSDhnQTBIOUFEc0IxSDhnQTBIQXg4c0FOZ0xZZnlBRFFRMDJBdHgvSUFOQi9RQTdBZUIvSUFOQnpjZkxBRFlDNUg4Z0EwRU9OZ0xvZnlBRFFmMEFPd0hzZnlBRFFZekt6d0EyQXZCL0lBTkJERFlDOUg4Z0EwSCs4UU03QWZoL0lBTkIvOG5QQURZQy9IOGdBMEVOTmdLQWdBRWdBMEg5OFFNN0FZU0FBU0FEUWR2SHl3QTJBb2lBQVNBRFFSTTJBb3lBQVNBRFFkMytBenNCa0lBQklBTkI3c2ZMQURZQ2xJQUJJQU5CRHpZQ21JQUJJQU5CM1B3RE93R2NnQUVnQTBIenljOEFOZ0tnZ0FFZ0EwRU1OZ0trZ0FFZ0EwSDg4UU03QWFpQUFTQURRZjNIeXdBMkFxeUFBU0FEUVJJMkFyQ0FBU0FEUWJqOEF6c0J0SUFCSUFOQjk0RE9BRFlDdUlBQklBTkJDellDdklBQklBTkIyd0E3QWNDQUFTQURRWS9JeXdBMkFzU0FBU0FEUVE0MkFzaUFBU0FEUWRzQU93SE1nQUVnQTBHZHlNc0FOZ0xRZ0FFZ0EwRVBOZ0xVZ0FFZ0EwSGJBRHNCMklBQklBTkJyTWpMQURZQzNJQUJJQU5CRGpZQzRJQUJJQU5CMndBN0FlU0FBU0FEUWJySXl3QTJBdWlBQVNBRFFRODJBdXlBQVNBRFFkc0FPd0h3Z0FFZ0EwRy95TThBTmdMMGdBRWdBMEVOTmdMNGdBRWdBMEh3OFFNN0FmeUFBU0FEUWJMSXp3QTJBb0NCQVNBRFFRMDJBb1NCQVNBRFFlL3hBenNCaUlFQklBTkJ5Y2pMQURZQ2pJRUJJQU5CRHpZQ2tJRUJJQU5CMndBN0FaU0JBU0FEUWRqSXl3QTJBcGlCQVNBRFFSUTJBcHlCQVNBRFFiditBenNCb0lFQklBTkJwY2pQQURZQ3BJRUJJQU5CRFRZQ3FJRUJJQU5CN3ZFRE93R3NnUUVnQTBHTGdjNEFOZ0t3Z1FFZ0EwRU1OZ0swZ1FFZ0EwSGRBRHNCdUlFQklBTkI3TWpMQURZQ3ZJRUJJQU5CRHpZQ3dJRUJJQU5CM1FBN0FjU0JBU0FEUWZ2SXl3QTJBc2lCQVNBRFFSQTJBc3lCQVNBRFFkMEFPd0hRZ1FFZ0EwR0x5Y3NBTmdMVWdRRWdBMEVQTmdMWWdRRWdBMEhkQURzQjNJRUJJQU5CbXNuTEFEWUM0SUVCSUFOQkVEWUM1SUVCSUFOQjNRQTdBZWlCQVNBRFFlWEp6d0EyQXV5QkFTQURRUTQyQXZDQkFTQURRZnZ4QXpzQjlJRUJJQU5CMThuUEFEWUMrSUVCSUFOQkRqWUMvSUVCSUFOQit2RURPd0dBZ2dFZ0EwR3F5Y3NBTmdLRWdnRWdBMEVRTmdLSWdnRWdBMEhkQURzQmpJSUJJQU5CdXNuTEFEWUNrSUlCSUFOQkZUWUNsSUlCSUFOQnZmNERPd0dZZ2dFZ0EwSEp5YzhBTmdLY2dnRWdBMEVPTmdLZ2dnRWdBMEg1OFFNN0FhU0NBU0FEUVkyRXpnQTJBcWlDQVNBRFFRVTJBcXlDQVNBRFFkZ0ZPd0d3Z2dFZ0EwSFB5Y3NBTmdLMGdnRWdBMEVOTmdLNGdnRWdBMEd1QmpzQnZJSUJJQU5CM01uTEFEWUN3SUlCSUFOQkNEWUN4SUlCSUFOQmhnWTdBY2lDQVNBRFFlVEp5d0EyQXN5Q0FTQURRUlUyQXRDQ0FTQURRYThHT3dIVWdnRWdBMEg1eWNzQU5nTFlnZ0VnQTBFUU5nTGNnZ0VnQTBHUkJqc0I0SUlCSUFOQmljckxBRFlDNUlJQklBTkJGallDNklJQklBTkI0UVk3QWV5Q0FTQURRWi9LeXdBMkF2Q0NBU0FEUVE0MkF2U0NBU0FEUWFvR093SDRnZ0VnQTBHdHlzc0FOZ0w4Z2dFZ0EwRVdOZ0tBZ3dFZ0EwRzZCanNCaElNQklBTkJ4SW5PQURZQ2lJTUJJQU5CQ1RZQ2pJTUJJQU5CcGdFN0FaQ0RBU0FEUWNQS3l3QTJBcFNEQVNBRFFRYzJBcGlEQVNBRFFZQURPd0djZ3dFZ0EwSEt5c3NBTmdLZ2d3RWdBMEVKTmdLa2d3RWdBMEhxN1FNN0FhaURBU0FEUWRQS3l3QTJBcXlEQVNBRFFRYzJBckNEQVNBRFFZTURPd0cwZ3dFZ0EwSGF5c3NBTmdLNGd3RWdBMEVLTmdLOGd3RWdBMEgyNEFBN0FjQ0RBU0FEUWVUS3l3QTJBc1NEQVNBRFFRbzJBc2lEQVNBRFFkYmhBRHNCeklNQklBTkJsSVBPQURZQzBJTUJJQU5CQmpZQzFJTUJJQU5Cb3NBQU93SFlnd0VnQTBIdXlzc0FOZ0xjZ3dFZ0EwRU5OZ0xnZ3dFZ0EwSFl5d0E3QWVTREFTQURRZnZLeXdBMkF1aURBU0FEUVE0MkF1eURBU0FEUVpuRUFEc0I4SU1CSUFOQmljdkxBRFlDOUlNQklBTkJDRFlDK0lNQklBTkJ6c3NBT3dIOGd3RWdBMEczZ2M0QU5nS0FoQUVnQTBFQk5nS0VoQUVnQTBIakFEc0JpSVFCSUFOQmtjdkxBRFlDaklRQklBTkJDallDa0lRQklBTkI3Z283QVpTRUFTQURRWnZMeXdBMkFwaUVBU0FEUVFrMkFweUVBU0FEUVpvVE93R2doQUVnQTBHY2ljNEFOZ0traEFFZ0EwRUdOZ0tvaEFFZ0EwR0hBanNCcklRQklBTkJwTXZMQURZQ3NJUUJJQU5CQmpZQ3RJUUJJQU5CbWhJN0FiaUVBU0FEUWFyTHl3QTJBcnlFQVNBRFFRbzJBc0NFQVNBRFFab1ZPd0hFaEFFZ0EwRzB5OHNBTmdMSWhBRWdBMEVLTmdMTWhBRWdBMEdhRkRzQjBJUUJJQU5CdnN2TEFEWUMxSVFCSUFOQkNUWUMySVFCSUFOQmlPY0FPd0hjaEFFZ0EwSEh5OHNBTmdMZ2hBRWdBMEVTTmdMa2hBRWdBMEdCRXpzQjZJUUJJQU5CMmN2TEFEWUM3SVFCSUFOQkRqWUM4SVFCSUFOQmtBWTdBZlNFQVNBRFFlZkx5d0EyQXZpRUFTQURRUTgyQXZ5RUFTQURRWUVTT3dHQWhRRWdBMEgyeThzQU5nS0VoUUVnQTBFVE5nS0loUUVnQTBHQkZUc0JqSVVCSUFOQmljekxBRFlDa0lVQklBTkJFellDbElVQklBTkJpYkFET3dHWWhRRWdBMEdjek1zQU5nS2NoUUVnQTBFSU5nS2doUUVnQTBIcXd3QTdBYVNGQVNBRFFhVE15d0EyQXFpRkFTQURRUVkyQXF5RkFTQURRWVhDQURzQnNJVUJJQU5Cd0lUT0FEWUN0SVVCSUFOQkJUWUN1SVVCSUFOQnh3VTdBYnlGQVNBRFFhck15d0EyQXNDRkFTQURRUTAyQXNTRkFTQURRYXdHT3dISWhRRWdBMEczek1zQU5nTE1oUUVnQTBFSU5nTFFoUUVnQTBHTUJqc0IxSVVCSUFOQmxzWFBBRFlDMklVQklBTkJEallDM0lVQklBTkJ0Y01BT3dIZ2hRRWdBMEcvek1zQU5nTGtoUUVnQTBFSk5nTG9oUUVnQTBHWTRnQTdBZXlGQVNBRFFkYUd6Z0EyQXZDRkFTQURRUVkyQXZTRkFTQURRWTBDT3dINGhRRWdBMEhyaDg0QU5nTDhoUUVnQTBFSU5nS0FoZ0VnQTBIbkFUc0JoSVlCSUFOQnlNekxBRFlDaUlZQklBTkJEVFlDaklZQklBTkJpVHc3QVpDR0FTQURRZFhNeXdBMkFwU0dBU0FEUVFjMkFwaUdBU0FEUWRMSkFEc0JuSVlCSUFOQjNNekxBRFlDb0lZQklBTkJDellDcElZQklBTkJpUUk3QWFpR0FTQURRZWZNeXdBMkFxeUdBU0FEUVFVMkFyQ0dBU0FEUWRVRU93RzBoZ0VnQTBIc3pNc0FOZ0s0aGdFZ0EwRUVOZ0s4aGdFZ0EwR0xBanNCd0lZQklBTkI4TXpMQURZQ3hJWUJJQU5CQ2pZQ3lJWUJJQU5CaXdJN0FjeUdBU0FEUWZyTXl3QTJBdENHQVNBRFFRZzJBdFNHQVNBRFFjWG5BRHNCMklZQklBTkJwNFRPQURZQzNJWUJJQU5CQnpZQzRJWUJJQU5CdUFFN0FlU0dBU0FEUVlMTnl3QTJBdWlHQVNBRFFRbzJBdXlHQVNBRFFhY0dPd0h3aGdFZ0EwR016Y3NBTmdMMGhnRWdBMEVMTmdMNGhnRWdBMEdJeGdBN0FmeUdBU0FEUVpmTnl3QTJBb0NIQVNBRFFRNDJBb1NIQVNBRFFZakdBRHNCaUljQklBTkJwYzNMQURZQ2pJY0JJQU5CRHpZQ2tJY0JJQU5CaU1ZQU93R1Vod0VnQTBHMHpjc0FOZ0tZaHdFZ0EwRU9OZ0tjaHdFZ0EwR0l4Z0E3QWFDSEFTQURRY0xOeXdBMkFxU0hBU0FEUVE4MkFxaUhBU0FEUVlqR0FEc0JySWNCSUFOQjBjM0xBRFlDc0ljQklBTkJERFlDdEljQklBTkJpY1lBT3dHNGh3RWdBMEhkemNzQU5nSzhod0VnQTBFUE5nTEFod0VnQTBHSnhnQTdBY1NIQVNBRFFlek55d0EyQXNpSEFTQURRUkEyQXN5SEFTQURRWW5HQURzQjBJY0JJQU5CL00zTEFEWUMxSWNCSUFOQkR6WUMySWNCSUFOQmljWUFPd0hjaHdFZ0EwR0x6c3NBTmdMZ2h3RWdBMEVRTmdMa2h3RWdBMEdKeGdBN0FlaUhBU0FEUWZtQnpnQTJBdXlIQVNBRFFRUTJBdkNIQVNBRFFhSUJPd0gwaHdFZ0EwR2J6c3NBTmdMNGh3RWdBMEVLTmdMOGh3RWdBMEdEd2dBN0FZQ0lBU0FEUWFYT3l3QTJBb1NJQVNBRFFRdzJBb2lJQVNBRFFkL3RBenNCaklnQklBTkJzYzdMQURZQ2tJZ0JJQU5CRFRZQ2xJZ0JJQU5CNFA4RE93R1lpQUVnQTBHK3pzc0FOZ0tjaUFFZ0EwRU1OZ0tnaUFFZ0EwR2k3d003QWFTSUFTQURRY3JPeXdBMkFxaUlBU0FEUVF3MkFxeUlBU0FEUWVEdEF6c0JzSWdCSUFOQjFzN0xBRFlDdElnQklBTkJDellDdUlnQklBTkIrUW83QWJ5SUFTQURRZUhPeXdBMkFzQ0lBU0FEUVFvMkFzU0lBU0FEUVpzVE93SElpQUVnQTBIcnpzc0FOZ0xNaUFFZ0EwRUhOZ0xRaUFFZ0EwR2JFanNCMUlnQklBTkI4czdMQURZQzJJZ0JJQU5CQ3pZQzNJZ0JJQU5CbXhVN0FlQ0lBU0FEUWYzT3l3QTJBdVNJQVNBRFFRczJBdWlJQVNBRFFac1VPd0hzaUFFZ0EwR0l6OHNBTmdMd2lBRWdBMEVLTmdMMGlBRWdBMEdVNGdBN0FmaUlBU0FEUVpMUHl3QTJBdnlJQVNBRFFSUTJBb0NKQVNBRFFiMEpPd0dFaVFFZ0EwR216OHNBTmdLSWlRRWdBMEVGTmdLTWlRRWdBMEdUemdBN0FaQ0pBU0FEUWF2UHl3QTJBcFNKQVNBRFFRazJBcGlKQVNBRFFaUE9BRHNCbklrQklBTkJ0TS9MQURZQ29Ja0JJQU5CQ3pZQ3BJa0JJQU5CeHdnN0FhaUpBU0FEUWIvUHl3QTJBcXlKQVNBRFFSMDJBckNKQVNBRFFiOEpPd0cwaVFFZ0EwSGN6OHNBTmdLNGlRRWdBMEVVTmdLOGlRRWdBMEczQ1RzQndJa0JJQU5COE0vTEFEWUN4SWtCSUFOQkV6WUN5SWtCSUFOQjlRazdBY3lKQVNBRFFZUFF5d0EyQXRDSkFTQURRUXcyQXRTSkFTQURRZk1LT3dIWWlRRWdBMEdQME1zQU5nTGNpUUVnQTBFVk5nTGdpUUVnQTBITUNUc0I1SWtCSUFOQnBORExBRFlDNklrQklBTkJHVFlDN0lrQklBTkJ1UWs3QWZDSkFTQURRWmJEendBMkF2U0pBU0FEUVFNMkF2aUpBU0FEUWNjSE93SDhpUUVnQTBHOTBNc0FOZ0tBaWdFZ0EwRVVOZ0tFaWdFZ0EwSDM1QUE3QVlpS0FTQURRZEhReXdBMkFveUtBU0FEUVJNMkFwQ0tBU0FEUVpma0FEc0JsSW9CSUFOQjVORExBRFlDbUlvQklBTkJFellDbklvQklBTkI2ZVFBT3dHZ2lnRWdBMEgzME1zQU5nS2tpZ0VnQTBFTk5nS29pZ0VnQTBISzRnQTdBYXlLQVNBRFFZVFJ5d0EyQXJDS0FTQURRUkkyQXJTS0FTQURRWW5rQURzQnVJb0JJQU5CbHRITEFEWUN2SW9CSUFOQkREWUN3SW9CSUFOQmlodzdBY1NLQVNBRFFhTFJ5d0EyQXNpS0FTQURRUXMyQXN5S0FTQURRWWdjT3dIUWlnRWdBMEd0MGNzQU5nTFVpZ0VnQTBFTU5nTFlpZ0VnQTBHSkhEc0IzSW9CSUFOQnVkSExBRFlDNElvQklBTkJDellDNUlvQklBTkJqQnc3QWVpS0FTQURRY1RSeXdBMkF1eUtBU0FEUVFVMkF2Q0tBU0FEUVlnRE93SDBpZ0VnQTBISjBjc0FOZ0w0aWdFZ0EwRVNOZ0w4aWdFZ0EwSDI1QUE3QVlDTEFTQURRZHZSeXdBMkFvU0xBU0FEUVJFMkFvaUxBU0FEUVpia0FEc0JqSXNCSUFOQjdOSExBRFlDa0lzQklBTkJFVFlDbElzQklBTkI2T1FBT3dHWWl3RWdBMEg5MGNzQU5nS2Npd0VnQTBFTE5nS2dpd0VnQTBISTRnQTdBYVNMQVNBRFFZalN5d0EyQXFpTEFTQURRUkEyQXF5TEFTQURRWWprQURzQnNJc0JJQU5CbU5MTEFEWUN0SXNCSUFOQkVUWUN1SXNCSUFOQm5PUUFPd0c4aXdFZ0EwR3Awc3NBTmdMQWl3RWdBMEVHTmdMRWl3RWdBMEhMeXdBN0FjaUxBU0FEUWEvU3l3QTJBc3lMQVNBRFFRYzJBdENMQVNBRFFhNEJPd0hVaXdFZ0EwRzIwc3NBTmdMWWl3RWdBMEVITmdMY2l3RWdBMEhJeVFBN0FlQ0xBU0FEUWIzU3l3QTJBdVNMQVNBRFFRNDJBdWlMQVNBRFFadkZBRHNCN0lzQklBTkJ5OUxMQURZQzhJc0JJQU5CRERZQzlJc0JJQU5CM2NFQU93SDRpd0VnQTBIWDBzc0FOZ0w4aXdFZ0EwRU1OZ0tBakFFZ0EwR1l4UUE3QVlTTUFTQURRZVBTeXdBMkFvaU1BU0FEUVFrMkFveU1BU0FEUVpuRkFEc0JrSXdCSUFOQjdOTExBRFlDbEl3QklBTkJFRFlDbUl3QklBTkJtY1VBT3dHY2pBRWdBMEg4MHNzQU5nS2dqQUVnQTBFTk5nS2tqQUVnQTBHWnhRQTdBYWlNQVNBRFFZblR5d0EyQXF5TUFTQURRUXMyQXJDTUFTQURRWnpGQURzQnRJd0JJQU5CbE5QTEFEWUN1SXdCSUFOQkN6WUN2SXdCSUFOQmxzVUFPd0hBakFFZ0EwSEV4YzhBTmdMRWpBRWdBMEVPTmdMSWpBRWdBMEdYeFFBN0FjeU1BU0FEUVovVHl3QTJBdENNQVNBRFFSVTJBdFNNQVNBRFFaZkZBRHNCMkl3QklBTkJ0TlBMQURZQzNJd0JJQU5CRWpZQzRJd0JJQU5CbDhVQU93SGtqQUVnQTBIRzA4c0FOZ0xvakFFZ0EwRUlOZ0xzakFFZ0EwR1p4UUE3QWZDTUFTQURRZExGendBMkF2U01BU0FEUVFvMkF2aU1BU0FEUVpYRkFEc0IvSXdCSUFOQnp0UExBRFlDZ0kwQklBTkJFVFlDaEkwQklBTkJsY1VBT3dHSWpRRWdBMEhmMDhzQU5nS01qUUVnQTBFT05nS1FqUUVnQTBHVnhRQTdBWlNOQVNBRFFlM1R5d0EyQXBpTkFTQURRUkEyQXB5TkFTQURRYmJnQURzQm9JMEJJQU5CL2RQTEFEWUNwSTBCSUFOQkNqWUNxSTBCSUFOQm1zVUFPd0dzalFFZ0EwR0gxTXNBTmdLd2pRRWdBMEVYTmdLMGpRRWdBMEhReXdBN0FiaU5BU0FEUVo3VXl3QTJBcnlOQVNBRFFSZzJBc0NOQVNBRFFkSExBRHNCeEkwQklBTkIrSVBPQURZQ3lJMEJJQU5CQ2pZQ3pJMEJJQU5CeGdVN0FkQ05BU0FEUWJiVXl3QTJBdFNOQVNBRFFSSTJBdGlOQVNBRFFhMEdPd0hjalFFZ0EwSEkxTXNBTmdMZ2pRRWdBMEVOTmdMa2pRRWdBMEdDQmpzQjZJMEJJQU5CMWRUTEFEWUM3STBCSUFOQkJUWUM4STBCSUFOQnA4WUFPd0gwalFFZ0EwSGExTXNBTmdMNGpRRWdBMEVOTmdMOGpRRWdBMEhDQXpzQmdJNEJJQU5CNTlUTEFEWUNoSTRCSUFOQkN6WUNpSTRCSUFOQndBTTdBWXlPQVNBRFFmTFV5d0EyQXBDT0FTQURRUXcyQXBTT0FTQURRY0VET3dHWWpnRWdBMEgrMU1zQU5nS2NqZ0VnQTBFT05nS2dqZ0VnQTBIREF6c0JwSTRCSUFOQmpOWExBRFlDcUk0QklBTkJDVFlDckk0QklBTkI4ODhBT3dHd2pnRWdBMEdXeE04QU5nSzBqZ0VnQTBFRU5nSzRqZ0VnQTBIanpBQTdBYnlPQVNBRFFaWFZ5d0EyQXNDT0FTQURRUTAyQXNTT0FTQURRZVBNQURzQnlJNEJJQU5Cb3RYTEFEWUN6STRCSUFOQkRUWUMwSTRCSUFOQjU4d0FPd0hVamdFZ0EwR3YxY3NBTmdMWWpnRWdBMEVOTmdMY2pnRWdBMEdrNXdBN0FlQ09BU0FEUWJ6Vnl3QTJBdVNPQVNBRFFRbzJBdWlPQVNBRFFjUCtBenNCN0k0QklBTkJ4dFhMQURZQzhJNEJJQU5CRHpZQzlJNEJJQU5Cb09jQU93SDRqZ0VnQTBIVjFjc0FOZ0w4amdFZ0EwRUtOZ0tBandFZ0EwR0JDenNCaEk4QklBTkJ0WURPQURZQ2lJOEJJQU5CQlRZQ2pJOEJJQU5CT2pzQmtJOEJJQU5CMzlYTEFEWUNsSThCSUFOQkRUWUNtSThCSUFOQm9jRUFPd0djandFZ0EwSHMxY3NBTmdLZ2p3RWdBMEVPTmdLa2p3RWdBMEdhL2dNN0FhaVBBU0FEUWZyVnl3QTJBcXlQQVNBRFFRazJBckNQQVNBRFFhSEJBRHNCdEk4QklBTkJnOWJMQURZQ3VJOEJJQU5CQ2pZQ3ZJOEJJQU5CMWZ3RE93SEFqd0VnQTBHTjFzc0FOZ0xFandFZ0EwRVdOZ0xJandFZ0EwSFJCVHNCekk4QklBTkJvOWJMQURZQzBJOEJJQU5CRWpZQzFJOEJJQU5CMEFVN0FkaVBBU0FEUWZmL3pRQTJBdHlQQVNBRFFRVTJBdUNQQVNBRFFTdzdBZVNQQVNBRFFiWFd5d0EyQXVpUEFTQURRUTAyQXV5UEFTQURRWk1HT3dId2p3RWdBMEhDMXNzQU5nTDBqd0VnQTBFU05nTDRqd0VnQTBHVkJqc0IvSThCSUFOQnU0Yk9BRFlDZ0pBQklBTkJDellDaEpBQklBTkJ3KzBET3dHSWtBRWdBMEhVMXNzQU5nS01rQUVnQTBFTE5nS1FrQUVnQTBHTUREc0JsSkFCSUFOQjM5YkxBRFlDbUpBQklBTkJEVFlDbkpBQklBTkIzUW83QWFDUUFTQURRZXpXeXdBMkFxU1FBU0FEUVEwMkFxaVFBU0FEUWVIdEF6c0JySkFCSUFOQitkYkxBRFlDc0pBQklBTkJEallDdEpBQklBTkJqUDRET3dHNGtBRWdBMEdIMThzQU5nSzhrQUVnQTBFVk5nTEFrQUVnQTBHVUJqc0J4SkFCSUFOQm5OZkxBRFlDeUpBQklBTkJFRFlDekpBQklBTkJ2UVU3QWRDUUFTQURRYXpYeXdBMkF0U1FBU0FEUVFvMkF0aVFBU0FEUWREOEF6c0IzSkFCSUFOQnR0ZkxBRFlDNEpBQklBTkJEVFlDNUpBQklBTkI0dTBET3dIb2tBRWdBMEhEMThzQU5nTHNrQUVnQTBFVE5nTHdrQUVnQTBHU0Jqc0I5SkFCSUFOQjF0ZkxBRFlDK0pBQklBTkJEallDL0pBQklBTkJ1d1U3QVlDUkFTQURRZVRYeXdBMkFvU1JBU0FEUVFjMkFvaVJBU0FEUWJ6TUFEc0JqSkVCSUFOQjY5ZkxBRFlDa0pFQklBTkJDallDbEpFQklBTkJnY1FBT3dHWWtRRWdBMEgxMThzQU5nS2NrUUVnQTBFTU5nS2drUUVnQTBHTXdBQTdBYVNSQVNBRFFmckJ6d0EyQXFpUkFTQURRUWsyQXF5UkFTQURRY1hFQURzQnNKRUJJQU5CZ2RqTEFEWUN0SkVCSUFOQkV6WUN1SkVCSUFOQnJzUUFPd0c4a1FFZ0EwR1UyTXNBTmdMQWtRRWdBMEVRTmdMRWtRRWdBMEd1eEFBN0FjaVJBU0FEUWFUWXl3QTJBc3lSQVNBRFFRODJBdENSQVNBRFFhN0VBRHNCMUpFQklBTkJzOWpMQURZQzJKRUJJQU5CQnpZQzNKRUJJQU5CZzhZQU93SGdrUUVnQTBHNjJNc0FOZ0xra1FFZ0EwRUtOZ0xva1FFZ0EwRUdPd0hza1FFZ0EwSEUyTXNBTmdMd2tRRWdBMEVLTmdMMGtRRWdBMEVIT3dINGtRRWdBMEhPMk1zQU5nTDhrUUVnQTBFSk5nS0FrZ0VnQTBFSU93R0VrZ0VnQTBIWDJNc0FOZ0tJa2dFZ0EwRUtOZ0tNa2dFZ0EwRVlPd0dRa2dFZ0EwSGgyTXNBTmdLVWtnRWdBMEVKTmdLWWtnRWdBMEVOT3dHY2tnRWdBMEhxMk1zQU5nS2drZ0VnQTBFS05nS2trZ0VnQTBFUk93R29rZ0VnQTBIMDJNc0FOZ0tza2dFZ0EwRUtOZ0t3a2dFZ0EwRVNPd0cwa2dFZ0EwSCsyTXNBTmdLNGtnRWdBMEVLTmdLOGtnRWdBMEVUT3dIQWtnRWdBMEdJMmNzQU5nTEVrZ0VnQTBFS05nTElrZ0VnQTBFVU93SE1rZ0VnQTBHUzJjc0FOZ0xRa2dFZ0EwRUtOZ0xVa2dFZ0EwSC9BRHNCMkpJQklBTkJuTm5MQURZQzNKSUJJQU5CQ2pZQzRKSUJJQU5CRURzQjVKSUJJQU5CcHRuTEFEWUM2SklCSUFOQkNUWUM3SklCSUFOQkdUc0I4SklCSUFOQnI5bkxBRFlDOUpJQklBTkJDallDK0pJQklBTkJCVHNCL0pJQklBTkJ1ZG5MQURZQ2dKTUJJQU5CQ2pZQ2hKTUJJQU5CQkRzQmlKTUJJQU5CdzluTEFEWUNqSk1CSUFOQkNqWUNrSk1CSUFOQkd6c0JsSk1CSUFOQnpkbkxBRFlDbUpNQklBTkJDallDbkpNQklBTkJGenNCb0pNQklBTkIxOW5MQURZQ3BKTUJJQU5CQ2pZQ3FKTUJJQU5CQXpzQnJKTUJJQU5CNGRuTEFEWUNzSk1CSUFOQkNUWUN0Sk1CSUFOQkREc0J1Sk1CSUFOQjZ0bkxBRFlDdkpNQklBTkJDVFlDd0pNQklBTkJIRHNCeEpNQklBTkI4OW5MQURZQ3lKTUJJQU5CQ1RZQ3pKTUJJQU5CSFRzQjBKTUJJQU5CL05uTEFEWUMxSk1CSUFOQkNUWUMySk1CSUFOQkNUc0IzSk1CSUFOQmhkckxBRFlDNEpNQklBTkJDVFlDNUpNQklBTkJDanNCNkpNQklBTkJqdHJMQURZQzdKTUJJQU5CQ2pZQzhKTUJJQU5CRlRzQjlKTUJJQU5CbU5yTEFEWUMrSk1CSUFOQkN6WUMvSk1CSUFOQkFEc0JnSlFCSUFOQm85ckxBRFlDaEpRQklBTkJDVFlDaUpRQklBTkJIanNCakpRQklBTkJyTnJMQURZQ2tKUUJJQU5CQ1RZQ2xKUUJJQU5CRHpzQm1KUUJJQU5CdGRyTEFEWUNuSlFCSUFOQkNUWUNvSlFCSUFOQkRqc0JwSlFCSUFOQnZ0ckxBRFlDcUpRQklBTkJDallDckpRQklBTkJBanNCc0pRQklBTkJ5TnJMQURZQ3RKUUJJQU5CQ2pZQ3VKUUJJQU5CQVRzQnZKUUJJQU5CMHRyTEFEWUN3SlFCSUFOQkNqWUN4SlFCSUFOQkdqc0J5SlFCSUFOQjNOckxBRFlDekpRQklBTkJDallDMEpRQklBTkJGanNCMUpRQklBTkI1dHJMQURZQzJKUUJJQU5CQ1RZQzNKUUJJQU5CSHpzQjRKUUJJQU5CNzlyTEFEWUM1SlFCSUFOQkNUWUM2SlFCSUFOQkN6c0I3SlFCSUFOQitOckxBRFlDOEpRQklBTkJDVFlDOUpRQklBTkJ2OVFBT3dINGxBRWdBMEdCMjhzQU5nTDhsQUVnQTBFUU5nS0FsUUVnQTBHUXhBQTdBWVNWQVNBRFFaSGJ5d0EyQW9pVkFTQURRUTAyQW95VkFTQURRWkRFQURzQmtKVUJJQU5CeG9iT0FEWUNsSlVCSUFOQkNUWUNtSlVCSUFOQnFRRTdBWnlWQVNBRFFlckh6d0EyQXFDVkFTQURRUTAyQXFTVkFTQURRZW54QXpzQnFKVUJJQU5CM2NiUEFEWUNySlVCSUFOQkRqWUNzSlVCSUFOQjJlMERPd0cwbFFFZ0EwR2UyOHNBTmdLNGxRRWdBMEVSTmdLOGxRRWdBMEdNNEFBN0FjQ1ZBU0FEUWEvYnl3QTJBc1NWQVNBRFFSbzJBc2lWQVNBRFFlTCtBenNCekpVQklBTkJ5ZHZMQURZQzBKVUJJQU5CR1RZQzFKVUJJQU5Cd2Z3RE93SFlsUUVnQTBIaTI4c0FOZ0xjbFFFZ0EwRVNOZ0xnbFFFZ0EwR040QUE3QWVTVkFTQURRZlRieXdBMkF1aVZBU0FEUVJzMkF1eVZBU0FEUWVQK0F6c0I4SlVCSUFOQmo5ekxBRFlDOUpVQklBTkJHallDK0pVQklBTkJ3dndET3dIOGxRRWdBMEdwM01zQU5nS0FsZ0VnQTBFUk5nS0VsZ0VnQTBILzVnQTdBWWlXQVNBRFFicmN5d0EyQW95V0FTQURRUWcyQXBDV0FTQURRY2ZuQURzQmxKWUJJQU5Cd3R6TEFEWUNtSllCSUFOQkRUWUNuSllCSUFOQnh1Y0FPd0dnbGdFZ0EwSFAzTXNBTmdLa2xnRWdBMEVHTmdLb2xnRWdBMEdleVFBN0FheVdBU0FEUWRYY3l3QTJBckNXQVNBRFFRZzJBclNXQVNBRFFhTEJBRHNCdUpZQklBTkIzZHpMQURZQ3ZKWUJJQU5CQ2pZQ3dKWUJJQU5CbHdVN0FjU1dBU0FEUWVmY3l3QTJBc2lXQVNBRFFRSTJBc3lXQVNBRFFlTUFPd0hRbGdFZ0EwSHAzTXNBTmdMVWxnRWdBMEVJTmdMWWxnRWdBMEhQeFFBN0FkeVdBU0FEUWZIY3l3QTJBdUNXQVNBRFFRazJBdVNXQVNBRFFhdkRBRHNCNkpZQklBTkIrdHpMQURZQzdKWUJJQU5CQnpZQzhKWUJJQU5CenNVQU93SDBsZ0VnQTBHQjNjc0FOZ0w0bGdFZ0EwRUtOZ0w4bGdFZ0EwR3N3d0E3QVlDWEFTQURRWjJDemdBMkFvU1hBU0FEUVFnMkFvaVhBU0FEUWFRQk93R01sd0VnQTBHTDNjc0FOZ0tRbHdFZ0EwRUROZ0tVbHdFZ0EwR013QUE3QVppWEFTQURRWTdkeXdBMkFweVhBU0FEUVFnMkFxQ1hBU0FEUWRIdEF6c0JwSmNCSUFOQmx0M0xBRFlDcUpjQklBTkJCellDckpjQklBTkIwdTBET3dHd2x3RWdBMEdkM2NzQU5nSzBsd0VnQTBFSU5nSzRsd0VnQTBIVTdRTTdBYnlYQVNBRFFhWGR5d0EyQXNDWEFTQURRUWMyQXNTWEFTQURRZFh0QXpzQnlKY0JJQU5CdUlIT0FEWUN6SmNCSUFOQkFUWUMwSmNCSUFOQjVBQTdBZFNYQVNBRFFhemR5d0EyQXRpWEFTQURRUW8yQXR5WEFTQURRZVFLT3dIZ2x3RWdBMEcyM2NzQU5nTGtsd0VnQTBFSk5nTG9sd0VnQTBHbUV6c0I3SmNCSUFOQnY5M0xBRFlDOEpjQklBTkJDVFlDOUpjQklBTkJ0Z3c3QWZpWEFTQURRY2pkeXdBMkF2eVhBU0FEUVFZMkFvQ1lBU0FEUWFZU093R0VtQUVnQTBITzNjc0FOZ0tJbUFFZ0EwRU9OZ0tNbUFFZ0EwRysvUU03QVpDWUFTQURRZHpkeXdBMkFwU1lBU0FEUVJBMkFwaVlBU0FEUWIvOUF6c0JuSmdCSUFOQjdOM0xBRFlDb0pnQklBTkJEellDcEpnQklBTkJ3UDBET3dHb21BRWdBMEg3M2NzQU5nS3NtQUVnQTBFR05nS3dtQUVnQTBHOEN6c0J0SmdCSUFOQmdkN0xBRFlDdUpnQklBTkJERFlDdkpnQklBTkJ2QXM3QWNDWUFTQURRZTZDemdBMkFzU1lBU0FEUVFZMkFzaVlBU0FEUWFEQUFEc0J6SmdCSUFOQjlJTE9BRFlDMEpnQklBTkJDVFlDMUpnQklBTkJvY0FBT3dIWW1BRWdBMEdOM3NzQU5nTGNtQUVnQTBFS05nTGdtQUVnQTBHbUZUc0I1SmdCSUFOQmw5N0xBRFlDNkpnQklBTkJDallDN0pnQklBTkJwaFE3QWZDWUFTQURRYUhleXdBMkF2U1lBU0FEUVFvMkF2aVlBU0FEUWVEZ0FEc0IvSmdCSUFOQnE5N0xBRFlDZ0prQklBTkJDallDaEprQklBTkJ3T0VBT3dHSW1RRWdBMEcxM3NzQU5nS01tUUVnQTBFSk5nS1FtUUVnQTBHdkREc0JsSmtCSUFOQnZ0N0xBRFlDbUprQklBTkJCVFlDbkprQklBTkIwd3M3QWFDWkFTQURRY1BleXdBMkFxU1pBU0FEUVFzMkFxaVpBU0FEUWJQMkF6c0JySmtCSUFOQnp0N0xBRFlDc0prQklBTkJFVFlDdEprQklBTkJzL1lET3dHNG1RRWdBMEhmM3NzQU5nSzhtUUVnQTBFR05nTEFtUUVnQTBHNHdnQTdBY1NaQVNBRFFlWGV5d0EyQXNpWkFTQURRUTgyQXN5WkFTQURRZE1MT3dIUW1RRWdBMEgwM3NzQU5nTFVtUUVnQTBFVk5nTFltUUVnQTBIVEN6c0IzSmtCSUFOQmlkL0xBRFlDNEprQklBTkJEellDNUprQklBTkIwd3M3QWVpWkFTQURRWmpmeXdBMkF1eVpBU0FEUVJVMkF2Q1pBU0FEUWRNTE93SDBtUUVnQTBHdDM4c0FOZ0w0bVFFZ0EwRUxOZ0w4bVFFZ0EwSFRDenNCZ0pvQklBTkJ1Ti9MQURZQ2hKb0JJQU5CQ2pZQ2lKb0JJQU5CMHdzN0FZeWFBU0FEUWNMZnl3QTJBcENhQVNBRFFSQTJBcFNhQVNBRFFkTUxPd0dZbWdFZ0EwSFMzOHNBTmdLY21nRWdBMEVLTmdLZ21nRWdBMEhUQ3pzQnBKb0JJQU5CM04vTEFEWUNxSm9CSUFOQkVEWUNySm9CSUFOQjB3czdBYkNhQVNBRFFlemZ5d0EyQXJTYUFTQURRUW8yQXJpYUFTQURRZE1MT3dHOG1nRWdBMEgyMzhzQU5nTEFtZ0VnQTBFUU5nTEVtZ0VnQTBIVEN6c0J5Sm9CSUFOQmh1RExBRFlDekpvQklBTkJDellDMEpvQklBTkIwd3M3QWRTYUFTQURRWkhneXdBMkF0aWFBU0FEUVJFMkF0eWFBU0FEUWRNTE93SGdtZ0VnQTBHaTRNc0FOZ0xrbWdFZ0EwRUxOZ0xvbWdFZ0EwSFRDenNCN0pvQklBTkJyZURMQURZQzhKb0JJQU5CRVRZQzlKb0JJQU5CMHdzN0FmaWFBU0FEUWI3Z3l3QTJBdnlhQVNBRFFRbzJBb0NiQVNBRFFkTUxPd0dFbXdFZ0EwSEk0TXNBTmdLSW13RWdBMEVRTmdLTW13RWdBMEhUQ3pzQmtKc0JJQU5CMk9ETEFEWUNsSnNCSUFOQkNqWUNtSnNCSUFOQjB3czdBWnliQVNBRFFlTGd5d0EyQXFDYkFTQURRUkEyQXFTYkFTQURRZE1MT3dHb213RWdBMEh5NE1zQU5nS3Ntd0VnQTBFS05nS3dtd0VnQTBIVEN6c0J0SnNCSUFOQi9PRExBRFlDdUpzQklBTkJFRFlDdkpzQklBTkIwd3M3QWNDYkFTQURRWXpoeXdBMkFzU2JBU0FEUVE0MkFzaWJBU0FEUWFyOUF6c0J6SnNCSUFOQm11SExBRFlDMEpzQklBTkJDellDMUpzQklBTkJ6d3c3QWRpYkFTQURRYVhoeXdBMkF0eWJBU0FEUVE0MkF1Q2JBU0FEUWM4TU93SGttd0VnQTBHejRjc0FOZ0xvbXdFZ0EwRVVOZ0xzbXdFZ0EwSE1ERHNCOEpzQklBTkJ4K0hMQURZQzlKc0JJQU5CRGpZQytKc0JJQU5CekF3N0FmeWJBU0FEUWRYaHl3QTJBb0NjQVNBRFFRVTJBb1NjQVNBRFFlUVNPd0dJbkFFZ0EwSGE0Y3NBTmdLTW5BRWdBMEVMTmdLUW5BRWdBMEduQ3pzQmxKd0JJQU5CNWVITEFEWUNtSndCSUFOQkR6WUNuSndCSUFOQnB3czdBYUNjQVNBRFFmVGh5d0EyQXFTY0FTQURRUmcyQXFpY0FTQURRWVVKT3dHc25BRWdBMEdNNHNzQU5nS3duQUVnQTBFRU5nSzBuQUVnQTBHUkFqc0J1SndCSUFOQmtPTExBRFlDdkp3QklBTkJDRFlDd0p3QklBTkIwKzBET3dIRW5BRWdBMEdZNHNzQU5nTEluQUVnQTBFVE5nTE1uQUVnQTBHSzRBQTdBZENjQVNBRFFhdml5d0EyQXRTY0FTQURRUnMyQXRpY0FTQURRYjM4QXpzQjNKd0JJQU5CeHVMTEFEWUM0SndCSUFOQkZEWUM1SndCSUFOQmkrQUFPd0hvbkFFZ0EwSGE0c3NBTmdMc25BRWdBMEVjTmdMd25BRWdBMEcrL0FNN0FmU2NBU0FEUWZiaXl3QTJBdmljQVNBRFFSYzJBdnljQVNBRFFhc0dPd0dBblFFZ0EwR040OHNBTmdLRW5RRWdBMEVMTmdLSW5RRWdBMEhLd3dBN0FZeWRBU0FEUVpqanl3QTJBcENkQVNBRFFSQTJBcFNkQVNBRFFaN0RBRHNCbUowQklBTkJxT1BMQURZQ25KMEJJQU5CRVRZQ29KMEJJQU5Cb01NQU93R2tuUUVnQTBHNTQ4c0FOZ0tvblFFZ0EwRU1OZ0tzblFFZ0EwSFV3d0E3QWJDZEFTQURRY1hqeXdBMkFyU2RBU0FEUVEwMkFyaWRBU0FEUWRMREFEc0J2SjBCSUFOQjB1UExBRFlDd0owQklBTkJDallDeEowQklBTkJ5TU1BT3dISW5RRWdBMEhjNDhzQU5nTE1uUUVnQTBFT05nTFFuUUVnQTBIbXp3QTdBZFNkQVNBRFFlcmp5d0EyQXRpZEFTQURRUTgyQXR5ZEFTQURRZWZQQURzQjRKMEJJQU5CK2VQTEFEWUM1SjBCSUFOQkNEWUM2SjBCSUFOQjVSSTdBZXlkQVNBRFFZSGt5d0EyQXZDZEFTQURRUWcyQXZTZEFTQURRZGJ0QXpzQitKMEJJQU5CaWVUTEFEWUMvSjBCSUFOQkN6WUNnSjRCSUFOQmp3WTdBWVNlQVNBRFFaVGt5d0EyQW9pZUFTQURRUXMyQW95ZUFTQURRYXpFQURzQmtKNEJJQU5CbitUTEFEWUNsSjRCSUFOQkNqWUNtSjRCSUFOQmw4QUFPd0djbmdFZ0EwR3A1TXNBTmdLZ25nRWdBMEVOTmdLa25nRWdBMEd6QmpzQnFKNEJJQU5CdHVUTEFEWUNySjRCSUFOQkRqWUNzSjRCSUFOQnZ3WTdBYlNlQVNBRFFjVGt5d0EyQXJpZUFTQURRUXMyQXJ5ZUFTQURRYm9GT3dIQW5nRWdBMEhQNU1zQU5nTEVuZ0VnQTBFT05nTEluZ0VnQTBHV3dBQTdBY3llQVNBRFFkM2t5d0EyQXRDZUFTQURRUmMyQXRTZUFTQURRWTRHT3dIWW5nRWdBMEgwNU1zQU5nTGNuZ0VnQTBFSk5nTGduZ0VnQTBHSjRnQTdBZVNlQVNBRFFmM2t5d0EyQXVpZUFTQURRUWcyQXV5ZUFTQURRY2puQURzQjhKNEJJQU5CbFlqT0FEWUM5SjRCSUFOQkJqWUMrSjRCSUFOQmp3STdBZnllQVNBRFFZWGx5d0EyQW9DZkFTQURRUWcyQW9TZkFTQURRWkU4T3dHSW53RWdBMEdONWNzQU5nS01ud0VnQTBFSE5nS1Fud0VnQTBIVHlRQTdBWlNmQVNBRFFaVGx5d0EyQXBpZkFTQURRUkEyQXB5ZkFTQURRWk04T3dHZ253RWdBMEhWaTg0QU5nS2tud0VnQTBFR05nS29ud0VnQTBHUkFqc0JySjhCSUFOQnBPWExBRFlDc0o4QklBTkJDallDdEo4QklBTkJvUk03QWJpZkFTQURRYTdseXdBMkFyeWZBU0FEUVFjMkFzQ2ZBU0FEUWFFU093SEVud0VnQTBHMTVjc0FOZ0xJbndFZ0EwRUxOZ0xNbndFZ0EwR2hGVHNCMEo4QklBTkJ3T1hMQURZQzFKOEJJQU5CQ3pZQzJKOEJJQU5Cb1JRN0FkeWZBU0FEUWN2bHl3QTJBdUNmQVNBRFFRbzJBdVNmQVNBRFFZZ05Pd0hvbndFZ0EwSFY1Y3NBTmdMc253RWdBMEVQTmdMd253RWdBMEdKOXdNN0FmU2ZBU0FEUWVUbHl3QTJBdmlmQVNBRFFRazJBdnlmQVNBRFFkd1NPd0dBb0FFZ0EwSHQ1Y3NBTmdLRW9BRWdBMEVMTmdLSW9BRWdBMEdpRXpzQmpLQUJJQU5CK09YTEFEWUNrS0FCSUFOQkNEWUNsS0FCSUFOQm9oSTdBWmlnQVNBRFFZRG15d0EyQXB5Z0FTQURRUXcyQXFDZ0FTQURRYUlWT3dHa29BRWdBMEdNNXNzQU5nS29vQUVnQTBFTU5nS3NvQUVnQTBHaUZEc0JzS0FCSUFOQm1PYkxBRFlDdEtBQklBTkJDallDdUtBQklBTkJpenc3QWJ5Z0FTQURRYUxteXdBMkFzQ2dBU0FEUVFrMkFzU2dBU0FEUVkwOE93SElvQUVnQTBHcjVzc0FOZ0xNb0FFZ0EwRVdOZ0xRb0FFZ0EwSHJERHNCMUtBQklBTkJ3ZWJMQURZQzJLQUJJQU5CRnpZQzNLQUJJQU5CNnd3N0FlQ2dBU0FEUWRqbXl3QTJBdVNnQVNBRFFRbzJBdWlnQVNBRFFiUUlPd0hzb0FFZ0EwSGk1c3NBTmdMd29BRWdBMEVITmdMMG9BRWdBMEhjeEFBN0FmaWdBU0FEUVppTnpnQTJBdnlnQVNBRFFRWTJBb0NoQVNBRFFiQUJPd0dFb1FFZ0EwSHA1c3NBTmdLSW9RRWdBMEVLTmdLTW9RRWdBMEd0Q3pzQmtLRUJJQU5COCtiTEFEWUNsS0VCSUFOQkNqWUNtS0VCSUFOQjUrQUFPd0djb1FFZ0EwSDk1c3NBTmdLZ29RRWdBMEVKTmdLa29RRWdBMEh2QnpzQnFLRUJJQU5CaHVmTEFEWUNyS0VCSUFOQkNqWUNzS0VCSUFOQngrRUFPd0cwb1FFZ0EwR1E1OHNBTmdLNG9RRWdBMEVLTmdLOG9RRWdBMEdyeGdBN0FjQ2hBU0FEUVpybnl3QTJBc1NoQVNBRFFRczJBc2loQVNBRFFhYkdBRHNCektFQklBTkJtY1BQQURZQzBLRUJJQU5CQlRZQzFLRUJJQU5CdEFjN0FkaWhBU0FEUWFYbnl3QTJBdHloQVNBRFFRczJBdUNoQVNBRFFZMERPd0hrb1FFZ0EwR3c1OHNBTmdMb29RRWdBMEVqTmdMc29RRWdBMEg0RXpzQjhLRUJJQU5CMCtmTEFEWUM5S0VCSUFOQkJEWUMrS0VCSUFOQnBBVTdBZnloQVNBRFFkZm55d0EyQW9DaUFTQURRUW8yQW9TaUFTQURRYWNUT3dHSW9nRWdBMEhoNThzQU5nS01vZ0VnQTBFSE5nS1FvZ0VnQTBHbkVqc0JsS0lCSUFOQjZPZkxBRFlDbUtJQklBTkJDellDbktJQklBTkJweFU3QWFDaUFTQURRZlBueXdBMkFxU2lBU0FEUVFzMkFxaWlBU0FEUWFjVU93R3NvZ0VnQTBIKzU4c0FOZ0t3b2dFZ0EwRUZOZ0swb2dFZ0EwSFhCRHNCdUtJQklBTkJnK2pMQURZQ3ZLSUJJQU5CRGpZQ3dLSUJJQU5CaFFjN0FjU2lBU0FEUVpIb3l3QTJBc2lpQVNBRFFSRTJBc3lpQVNBRFFjUUdPd0hRb2dFZ0EwR2F4TThBTmdMVW9nRWdBMEVITmdMWW9nRWdBMEhtekFBN0FkeWlBU0FEUWFMb3l3QTJBdUNpQVNBRFFRczJBdVNpQVNBRFFjVEZBRHNCNktJQklBTkJyZWpMQURZQzdLSUJJQU5CRERZQzhLSUJJQU5CNXN3QU93SDBvZ0VnQTBHNTZNc0FOZ0w0b2dFZ0EwRVFOZ0w4b2dFZ0EwSGl6QUE3QVlDakFTQURRWnVFemdBMkFvU2pBU0FEUVFnMkFvaWpBU0FEUWFnQk93R01vd0VnQTBISjZNc0FOZ0tRb3dFZ0EwRU5OZ0tVb3dFZ0EwSFg3UU03QVppakFTQURRZGJveXdBMkFweWpBU0FEUVJBMkFxQ2pBU0FEUWFRR093R2tvd0VnQTBIbTZNc0FOZ0tvb3dFZ0EwRUxOZ0tzb3dFZ0EwR0lCanNCc0tNQklBTkI4ZWpMQURZQ3RLTUJJQU5CRFRZQ3VLTUJJQU5CMk8wRE93Rzhvd0VnQTBIKzZNc0FOZ0xBb3dFZ0EwRU5OZ0xFb3dFZ0EwR0ZCenNCeUtNQklBTkJpK25MQURZQ3pLTUJJQU5CQ2pZQzBLTUJJQU5CejhRQU93SFVvd0VnQTBHVjZjc0FOZ0xZb3dFZ0EwRUtOZ0xjb3dFZ0EwSGk0QUE3QWVDakFTQURRWi9weXdBMkF1U2pBU0FEUVFvMkF1aWpBU0FEUWNMaEFEc0I3S01CSUFOQnFlbkxBRFlDOEtNQklBTkJDVFlDOUtNQklBTkJnK0FBT3dING93RWdBMEhGaGM0QU5nTDhvd0VnQTBFR05nS0FwQUVnQTBIM0FUc0JoS1FCSUFOQnN1bkxBRFlDaUtRQklBTkJEallDaktRQklBTkJ4OFVBT3dHUXBBRWdBMEhBNmNzQU5nS1VwQUVnQTBFSE5nS1lwQUVnQTBHanhBQTdBWnlrQVNBRFFjZnB5d0EyQXFDa0FTQURRUTAyQXFTa0FTQURRWlhFQURzQnFLUUJJQU5CMU9uTEFEWUNyS1FCSUFOQkN6WUNzS1FCSUFOQjBnZzdBYlNrQVNBRFFkL3B5d0EyQXJpa0FTQURRUWMyQXJ5a0FTQURRWlBMQURzQndLUUJJQU5CNXVuTEFEWUN4S1FCSUFOQkNqWUN5S1FCSUFOQmp6dzdBY3lrQVNBRFFmRHB5d0EyQXRDa0FTQURRUWcyQXRTa0FTQURRWmZuQURzQjJLUUJJQU5CK09uTEFEWUMzS1FCSUFOQkJ6WUM0S1FCSUFOQmtRSTdBZVNrQVNBRFFmL3B5d0EyQXVpa0FTQURRUW8yQXV5a0FTQURRY1QrQXpzQjhLUUJJQU5CaWVyTEFEWUM5S1FCSUFOQkJ6WUMrS1FCSUFOQmhNc0FPd0g4cEFFZ0EwR1E2c3NBTmdLQXBRRWdBMEVMTmdLRXBRRWdBMEdPSERzQmlLVUJJQU5CbStyTEFEWUNqS1VCSUFOQkNUWUNrS1VCSUFOQmxCdzdBWlNsQVNBRFFhVHF5d0EyQXBpbEFTQURRUW8yQXB5bEFTQURRZW5nQURzQm9LVUJJQU5CcnVyTEFEWUNwS1VCSUFOQkNqWUNxS1VCSUFOQnllRUFPd0dzcFFFZ0EwRzQvODBBTmdLd3BRRWdBMEVHTmdLMHBRRWdBMEVrT3dHNHBRRWdBMEc0NnNzQU5nSzhwUUVnQTBFT05nTEFwUUVnQTBIajdRTTdBY1NsQVNBRFFjYnF5d0EyQXNpbEFTQURRUTgyQXN5bEFTQURRWVQrQXpzQjBLVUJJQU5CMWVyTEFEWUMxS1VCSUFOQkRqWUMyS1VCSUFOQnBPNERPd0hjcFFFZ0EwSGo2c3NBTmdMZ3BRRWdBMEVMTmdMa3BRRWdBMEhwL0FNN0FlaWxBU0FEUWU3cXl3QTJBdXlsQVNBRFFRNDJBdkNsQVNBRFFlVHRBenNCOUtVQklBTkIvT3JMQURZQytLVUJJQU5CQkRZQy9LVUJJQU5CcThFQU93R0FwZ0VnQTBHQTY4c0FOZ0tFcGdFZ0EwRUtOZ0tJcGdFZ0EwR201Z0E3QVl5bUFTQURRWktFemdBMkFwQ21BU0FEUVFrMkFwU21BU0FEUWRrRk93R1lwZ0VnQTBHSzY4c0FOZ0tjcGdFZ0EwRU1OZ0tncGdFZ0EwR0hCanNCcEtZQklBTkJsdXZMQURZQ3FLWUJJQU5CQ3pZQ3JLWUJJQU5Cb3dZN0FiQ21BU0FEUWFIcnl3QTJBclNtQVNBRFFRdzJBcmltQVNBRFFhTUdPd0c4cGdFZ0EwR3Q2OHNBTmdMQXBnRWdBMEVMTmdMRXBnRWdBMEg3NFFBN0FjaW1BU0FEUWZTRXpnQTJBc3ltQVNBRFFRZzJBdENtQVNBRFFiRUNPd0hVcGdFZ0EwRzQ2OHNBTmdMWXBnRWdBMEVJTmdMY3BnRWdBMEcrN1FNN0FlQ21BU0FEUWNEcnl3QTJBdVNtQVNBRFFSSTJBdWltQVNBRFFZUUZPd0hzcGdFZ0EwR0F4ODhBTmdMd3BnRWdBMEVITmdMMHBnRWdBMEhGeFFBN0FmaW1BU0FEUWRMcnl3QTJBdnltQVNBRFFRYzJBb0NuQVNBRFFaVEVBRHNCaEtjQklBTkIyZXZMQURZQ2lLY0JJQU5CRERZQ2pLY0JJQU5Cek1zQU93R1Fwd0VnQTBIbDY4c0FOZ0tVcHdFZ0EwRU9OZ0tZcHdFZ0EwR2Y5Z003QVp5bkFTQURRZlByeXdBMkFxQ25BU0FEUVJRMkFxU25BU0FEUVovMkF6c0JxS2NCSUFOQmgrekxBRFlDcktjQklBTkJDRFlDc0tjQklBTkJ6c1VBT3dHMHB3RWdBMEdQN01zQU5nSzRwd0VnQTBFSk5nSzhwd0VnQTBINTB3QTdBY0NuQVNBRFFaanN5d0EyQXNTbkFTQURRUkEyQXNpbkFTQURRWjRHT3dITXB3RWdBMEdvN01zQU5nTFFwd0VnQTBFTE5nTFVwd0VnQTBIVkJUc0IyS2NCSUFOQnMrekxBRFlDM0tjQklBTkJCallDNEtjQklBTkJuOGtBT3dIa3B3RWdBMEc1N01zQU5nTG9wd0VnQTBFSk5nTHNwd0VnQTBIcjdRTTdBZkNuQVNBRFFjTHN5d0EyQXZTbkFTQURRUVUyQXZpbkFTQURRZFlFT3dIOHB3RWdBMEhIN01zQU5nS0FxQUVnQTBFSE5nS0VxQUVnQTBHTUF6c0JpS2dCSUFOQnp1ekxBRFlDaktnQklBTkJDallDa0tnQklBTkI1ZUFBT3dHVXFBRWdBMEhZN01zQU5nS1lxQUVnQTBFS05nS2NxQUVnQTBIRjRRQTdBYUNvQVNBRFFlTHN5d0EyQXFTb0FTQURRUUkyQXFpb0FTQURRZk1ET3dHc3FBRWdBMEhrN01zQU5nS3dxQUVnQTBFSU5nSzBxQUVnQTBHakJUc0J1S2dCSUFOQjdPekxBRFlDdktnQklBTkJCellDd0tnQklBTkJ4Z003QWNTb0FTQURRZlBzeXdBMkFzaW9BU0FEUVFZMkFzeW9BU0FEUWFVRk93SFFxQUVnQTBINTdNc0FOZ0xVcUFFZ0EwRVVOZ0xZcUFFZ0EwSGhDVHNCM0tnQklBTkJqZTNMQURZQzRLZ0JJQU5CQ3pZQzVLZ0JJQU5CMVFnN0FlaW9BU0FEUVpqdHl3QTJBdXlvQVNBRFFRdzJBdkNvQVNBRFFkOElPd0gwcUFFZ0EwRzVnYzRBTmdMNHFBRWdBMEVCTmdMOHFBRWdBMEhsQURzQmdLa0JJQU5CbllYT0FEWUNoS2tCSUFOQkJqWUNpS2tCSUFOQjZRRTdBWXlwQVNBRFFhVHR5d0EyQXBDcEFTQURRUVUyQXBTcEFTQURRY0hNQURzQm1La0JJQU5CcWUzTEFEWUNuS2tCSUFOQkNEWUNvS2tCSUFOQmp4TTdBYVNwQVNBRFFiSHR5d0EyQXFpcEFTQURRUWsyQXF5cEFTQURRWnppQURzQnNLa0JJQU5CdXUzTEFEWUN0S2tCSUFOQkJqWUN1S2tCSUFOQmxRSTdBYnlwQVNBRFFjRHR5d0EyQXNDcEFTQURRUXMyQXNTcEFTQURRWTBTT3dISXFRRWdBMEhMN2NzQU5nTE1xUUVnQTBFUE5nTFFxUUVnQTBHTkZUc0IxS2tCSUFOQjJ1M0xBRFlDMktrQklBTkJGRFlDM0trQklBTkJ4Ukk3QWVDcEFTQURRZTd0eXdBMkF1U3BBU0FEUVJnMkF1aXBBU0FEUWNVVk93SHNxUUVnQTBHMmhjNEFOZ0x3cVFFZ0EwRUdOZ0wwcVFFZ0EwR2JBanNCK0trQklBTkJodTdMQURZQy9La0JJQU5CRFRZQ2dLb0JJQU5CblR3N0FZU3FBU0FEUVpQdXl3QTJBb2lxQVNBRFFRczJBb3lxQVNBRFFlVUtPd0dRcWdFZ0EwR2U3c3NBTmdLVXFnRWdBMEVQTmdLWXFnRWdBMEdIQ3pzQm5Lb0JJQU5CcmU3TEFEWUNvS29CSUFOQkJ6WUNwS29CSUFOQjFNa0FPd0dvcWdFZ0EwSC9oYzRBTmdLc3FnRWdBMEVMTmdLd3FnRWdBMEhxQVRzQnRLb0JJQU5CdE83TEFEWUN1S29CSUFOQkVEWUN2S29CSUFOQnZ6MDdBY0NxQVNBRFFjVHV5d0EyQXNTcUFTQURRUkEyQXNpcUFTQURRWms4T3dITXFnRWdBMEhVN3NzQU5nTFFxZ0VnQTBFVE5nTFVxZ0VnQTBISFBUc0IyS29CSUFOQjUrN0xBRFlDM0tvQklBTkJFRFlDNEtvQklBTkJ3VDA3QWVTcUFTQURRZmZ1eXdBMkF1aXFBU0FEUVJRMkF1eXFBU0FEUWNNOU93SHdxZ0VnQTBHTDc4c0FOZ0wwcWdFZ0EwRVFOZ0w0cWdFZ0EwSEZQVHNCL0tvQklBTkJtKy9MQURZQ2dLc0JJQU5CQ1RZQ2hLc0JJQU5CMUFnN0FZaXJBU0FEUWFUdnl3QTJBb3lyQVNBRFFRazJBcENyQVNBRFFZVUVPd0dVcXdFZ0EwR3Q3OHNBTmdLWXF3RWdBMEVGTmdLY3F3RWdBMEdQRWpzQm9Lc0JJQU5CazRuT0FEWUNwS3NCSUFOQkNUWUNxS3NCSUFOQjZ3RTdBYXlyQVNBRFFiTHZ5d0EyQXJDckFTQURRUVEyQXJTckFTQURRWmNDT3dHNHF3RWdBMEdSak00QU5nSzhxd0VnQTBFS05nTEFxd0VnQTBHWEFqc0J4S3NCSUFOQnR1L0xBRFlDeUtzQklBTkJDVFlDektzQklBTkJ1VDA3QWRDckFTQURRYi92eXdBMkF0U3JBU0FEUVFvMkF0aXJBU0FEUVk4VU93SGNxd0VnQTBISjc4c0FOZ0xncXdFZ0EwRVBOZ0xrcXdFZ0EwSEhGRHNCNktzQklBTkIyTy9MQURZQzdLc0JJQU5CQ2pZQzhLc0JJQU5CeEFnN0FmU3JBU0FEUWRXS3pnQTJBdmlyQVNBRFFRWTJBdnlyQVNBRFFlZ0JPd0dBckFFZ0EwSGk3OHNBTmdLRXJBRWdBMEVKTmdLSXJBRWdBMEdQRlRzQmpLd0JJQU5CNisvTEFEWUNrS3dCSUFOQkNqWUNsS3dCSUFOQjV3bzdBWmlzQVNBRFFmWHZ5d0EyQXB5c0FTQURRUW8yQXFDc0FTQURRWjNpQURzQnBLd0JJQU5CLysvTEFEWUNxS3dCSUFOQkNUWUNyS3dCSUFOQnlPQUFPd0d3ckFFZ0EwR0k4TXNBTmdLMHJBRWdBMEVLTmdLNHJBRWdBMEc3UFRzQnZLd0JJQU5Ca3ZETEFEWUN3S3dCSUFOQkNqWUN4S3dCSUFOQm4rSUFPd0hJckFFZ0EwR3NnTTRBTmdMTXJBRWdBMEVGTmdMUXJBRWdBMEU0T3dIVXJBRWdBMEdjOE1zQU5nTFlyQUVnQTBFTE5nTGNyQUVnQTBIb0REc0I0S3dCSUFOQnAvRExBRFlDNUt3QklBTkJERFlDNkt3QklBTkI3aE03QWV5c0FTQURRYlB3eXdBMkF2Q3NBU0FEUVFzMkF2U3NBU0FEUWVmSUFEc0IrS3dCSUFOQnZ2RExBRFlDL0t3QklBTkJHellDZ0swQklBTkJrYzhBT3dHRXJRRWdBMEhaOE1zQU5nS0lyUUVnQTBFSk5nS01yUUVnQTBIdUVqc0JrSzBCSUFOQjR2RExBRFlDbEswQklBTkJEallDbUswQklBTkI4Y2dBT3dHY3JRRWdBMEh3OE1zQU5nS2dyUUVnQTBFTk5nS2tyUUVnQTBHRnlRQTdBYWl0QVNBRFFmM3d5d0EyQXF5dEFTQURRUTQyQXJDdEFTQURRWm5KQURzQnRLMEJJQU5CaS9ITEFEWUN1SzBCSUFOQkRUWUN2SzBCSUFOQjdoVTdBY0N0QVNBRFFaanh5d0EyQXNTdEFTQURRUTAyQXNpdEFTQURRZTRVT3dITXJRRWdBMEdsOGNzQU5nTFFyUUVnQTBFUE5nTFVyUUVnQTBIb0REc0IySzBCSUFOQnRQSExBRFlDM0swQklBTkJEVFlDNEswQklBTkJxT0FBT3dIa3JRRWdBMEhCOGNzQU5nTG9yUUVnQTBFUU5nTHNyUUVnQTBIcnpBQTdBZkN0QVNBRFFkSHh5d0EyQXZTdEFTQURRUlUyQXZpdEFTQURRYWZrQURzQi9LMEJJQU5CNXZITEFEWUNnSzRCSUFOQkRUWUNoSzRCSUFOQmlNRUFPd0dJcmdFZ0EwSHo4Y3NBTmdLTXJnRWdBMEVPTmdLUXJnRWdBMEdZL2dNN0FaU3VBU0FEUVlIeXl3QTJBcGl1QVNBRFFRMDJBcHl1QVNBRFFianVBenNCb0s0QklBTkJqdkxMQURZQ3BLNEJJQU5CQ2pZQ3FLNEJJQU5CKzhnQU93R3NyZ0VnQTBHWThzc0FOZ0t3cmdFZ0EwRUxOZ0swcmdFZ0EwR1B5UUE3QWJpdUFTQURRYVB5eXdBMkFyeXVBU0FEUVF3MkFzQ3VBU0FEUWZnTk93SEVyZ0VnQTBHdjhzc0FOZ0xJcmdFZ0EwRUtOZ0xNcmdFZ0EwSDN3Z0E3QWRDdUFTQURRYm55eXdBMkF0U3VBU0FEUVEwMkF0aXVBU0FEUWZqQUFEc0IzSzRCSUFOQnh2TExBRFlDNEs0QklBTkJDVFlDNUs0QklBTkIyQnc3QWVpdUFTQURRYy95eXdBMkF1eXVBU0FEUVE0MkF2Q3VBU0FEUVljRU93SDByZ0VnQTBIZDhzc0FOZ0w0cmdFZ0EwRVJOZ0w4cmdFZ0EwSGxDRHNCZ0s4QklBTkI3dkxMQURZQ2hLOEJJQU5CQ1RZQ2lLOEJJQU5CcU9FQU93R01yd0VnQTBIMzhzc0FOZ0tRcndFZ0EwRVNOZ0tVcndFZ0EwSDAvZ003QVppdkFTQURRWW56eXdBMkFweXZBU0FEUVE4MkFxQ3ZBU0FEUWZRVU93R2tyd0VnQTBHWTg4c0FOZ0tvcndFZ0EwRUhOZ0tzcndFZ0EwSFU0Z0E3QWJDdkFTQURRWi96eXdBMkFyU3ZBU0FEUVFvMkFyaXZBU0FEUWJzSU93Rzhyd0VnQTBHeXhzOEFOZ0xBcndFZ0EwRUhOZ0xFcndFZ0EwR0l4QUE3QWNpdkFTQURRYW56eXdBMkFzeXZBU0FEUVF3MkF0Q3ZBU0FEUWVySUFEc0IxSzhCSUFOQnRmUExBRFlDMks4QklBTkJDellDM0s4QklBTkIvc2dBT3dIZ3J3RWdBMEhBODhzQU5nTGtyd0VnQTBFTU5nTG9yd0VnQTBHU3lRQTdBZXl2QVNBRFFjenp5d0EyQXZDdkFTQURRUXMyQXZTdkFTQURRZnJDQURzQitLOEJJQU5CejRQT0FEWUMvSzhCSUFOQkNEWUNnTEFCSUFOQnBzQUFPd0dFc0FFZ0EwSFg4OHNBTmdLSXNBRWdBMEVRTmdLTXNBRWdBMEh1eFFBN0FaQ3dBU0FEUWVLTXpnQTJBcFN3QVNBRFFRYzJBcGl3QVNBRFFaTUNPd0djc0FFZ0EwSG44OHNBTmdLZ3NBRWdBMEVNTmdLa3NBRWdBMEdYUERzQnFMQUJJQU5COC9QTEFEWUNyTEFCSUFOQkREWUNzTEFCSUFOQmxUdzdBYlN3QVNBRFFmL3p5d0EyQXJpd0FTQURRUW8yQXJ5d0FTQURRYndJT3dIQXNBRWdBMEhGaE00QU5nTEVzQUVnQTBFR05nTElzQUVnQTBHVXdBQTdBY3l3QVNBRFFZbjB5d0EyQXRDd0FTQURRUTQyQXRTd0FTQURRYkg4QXpzQjJMQUJJQU5CbC9UTEFEWUMzTEFCSUFOQkNqWUM0TEFCSUFOQnhmNERPd0hrc0FFZ0EwR2g5TXNBTmdMb3NBRWdBMEVVTmdMc3NBRWdBMEhiQ2pzQjhMQUJJQU5CM01YUEFEWUM5TEFCSUFOQkNEWUMrTEFCSUFOQmhjUUFPd0g4c0FFZ0EwRzE5TXNBTmdLQXNRRWdBMEVKTmdLRXNRRWdBMEdCc0FNN0FZaXhBU0FEUWI3MHl3QTJBb3l4QVNBRFFRbzJBcEN4QVNBRFFhUGlBRHNCbExFQklBTkJ5UFRMQURZQ21MRUJJQU5CQ2pZQ25MRUJJQU5CdlFnN0FhQ3hBU0FEUWVpQ3pnQTJBcVN4QVNBRFFRWTJBcWl4QVNBRFFaUEFBRHNCckxFQklBTkIwdlRMQURZQ3NMRUJJQU5CRGpZQ3RMRUJJQU5Cc3Z3RE93RzRzUUVnQTBIZzlNc0FOZ0s4c1FFZ0EwRVROZ0xBc1FFZ0EwR2pDVHNCeExFQklBTkI4L1RMQURZQ3lMRUJJQU5CQXpZQ3pMRUJJQU5CeXdJN0FkQ3hBU0FEUWZiMHl3QTJBdFN4QVNBRFFRczJBdGl4QVNBRFFhWGlBRHNCM0xFQklBTkJnZlhMQURZQzRMRUJJQU5CRFRZQzVMRUJJQU5CcFFrN0FlaXhBU0FEUVk3MXl3QTJBdXl4QVNBRFFRNDJBdkN4QVNBRFFjZ0pPd0gwc1FFZ0EwR2M5Y3NBTmdMNHNRRWdBMEVITmdMOHNRRWdBMEdDd0FBN0FZQ3lBU0FEUWJpS3pnQTJBb1N5QVNBRFFRYzJBb2l5QVNBRFFaa0NPd0dNc2dFZ0EwR2o5Y3NBTmdLUXNnRWdBMEVJTmdLVXNnRWdBMEhUNGdBN0FaaXlBU0FEUWF2MXl3QTJBcHl5QVNBRFFRVTJBcUN5QVNBRFFkc0VPd0drc2dFZ0EwR3c5Y3NBTmdLb3NnRWdBMEVMTmdLc3NnRWdBMEdhQlRzQnNMSUJJQU5CdS9YTEFEWUN0TElCSUFOQkRUWUN1TElCSUFOQjNBUTdBYnl5QVNBRFFjajF5d0EyQXNDeUFTQURRUk0yQXNTeUFTQURRZDRFT3dISXNnRWdBMEhiOWNzQU5nTE1zZ0VnQTBFUk5nTFFzZ0VnQTBIZEJEc0IxTElCSUFOQjdQWExBRFlDMkxJQklBTkJCallDM0xJQklBTkJvTWtBT3dIZ3NnRWdBMEdldzg4QU5nTGtzZ0VnQTBFSE5nTG9zZ0VnQTBHMUJ6c0I3TElCSUFOQjh2WExBRFlDOExJQklBTkJDRFlDOUxJQklBTkI5UWM3QWZpeUFTQURRZnIxeXdBMkF2eXlBU0FEUVFvMkFvQ3pBU0FEUWZZSE93R0Vzd0VnQTBHRTlzc0FOZ0tJc3dFZ0EwRU1OZ0tNc3dFZ0EwR3RCenNCa0xNQklBTkJ4NERPQURZQ2xMTUJJQU5CQlRZQ21MTUJJQU5CUFRzQm5MTUJJQU5Ca1BiTEFEWUNvTE1CSUFOQkVUWUNwTE1CSUFOQjBzUUFPd0dvc3dFZ0EwR2g5c3NBTmdLc3N3RWdBMEVSTmdLd3N3RWdBMEhUeEFBN0FiU3pBU0FEUWJMMnl3QTJBcml6QVNBRFFRazJBcnl6QVNBRFFUMDdBY0N6QVNBRFFidjJ5d0EyQXNTekFTQURRUTQyQXNpekFTQURRWjMrQXpzQnpMTUJJQU5CeWZiTEFEWUMwTE1CSUFOQkRqWUMxTE1CSUFOQjM4VUFPd0hZc3dFZ0EwSFg5c3NBTmdMY3N3RWdBMEVPTmdMZ3N3RWdBMEdXMVFBN0FlU3pBU0FEUWVYMnl3QTJBdWl6QVNBRFFRczJBdXl6QVNBRFFaWFZBRHNCOExNQklBTkI4UGJMQURZQzlMTUJJQU5CRHpZQytMTUJJQU5CM3NVQU93SDhzd0VnQTBILzlzc0FOZ0tBdEFFZ0EwRU9OZ0tFdEFFZ0EwSEN4QUE3QVlpMEFTQURRWTMzeXdBMkFveTBBU0FEUVFvMkFwQzBBU0FEUWRIRUFEc0JsTFFCSUFOQmwvZkxBRFlDbUxRQklBTkJDallDbkxRQklBTkI1dndET3dHZ3RBRWdBMEdoOThzQU5nS2t0QUVnQTBFTk5nS290QUVnQTBIOHdBQTdBYXkwQVNBRFFlbkV6d0EyQXJDMEFTQURRUXMyQXJTMEFTQURRZUhFQURzQnVMUUJJQU5CcnZmTEFEWUN2TFFCSUFOQkR6WUN3TFFCSUFOQnpjUUFPd0hFdEFFZ0EwRzk5OHNBTmdMSXRBRWdBMEVLTmdMTXRBRWdBMEdtNGdBN0FkQzBBU0FEUWNmM3l3QTJBdFMwQVNBRFFRbzJBdGkwQVNBRFFjQUlPd0hjdEFFZ0EwSFI5OHNBTmdMZ3RBRWdBMEVKTmdMa3RBRWdBMEhZQkRzQjZMUUJJQU5CMnZmTEFEWUM3TFFCSUFOQkVUWUM4TFFCSUFOQnpRZzdBZlMwQVNBRFFldjN5d0EyQXZpMEFTQURRUW8yQXZ5MEFTQURRY0VJT3dHQXRRRWdBMEgxOThzQU5nS0V0UUVnQTBFVE5nS0l0UUVnQTBHckNUc0JqTFVCSUFOQmlQakxBRFlDa0xVQklBTkJBellDbExVQklBTkJnd1U3QVppMUFTQURRWXY0eXdBMkFweTFBU0FEUVFjMkFxQzFBU0FEUVlZRk93R2t0UUVnQTBHUytNc0FOZ0tvdFFFZ0EwRUtOZ0tzdFFFZ0EwR09FanNCc0xVQklBTkJuUGpMQURZQ3RMVUJJQU5CRXpZQ3VMVUJJQU5CeGhJN0FieTFBU0FEUWEvNHl3QTJBc0MxQVNBRFFRODJBc1MxQVNBRFFhb0RPd0hJdFFFZ0EwRysrTXNBTmdMTXRRRWdBMEVRTmdMUXRRRWdBMEdGQlRzQjFMVUJJQU5CenZqTEFEWUMyTFVCSUFOQkRqWUMzTFVCSUFOQngrQUFPd0hndFFFZ0EwSGMrTXNBTmdMa3RRRWdBMEVPTmdMb3RRRWdBMEduNFFBN0FleTFBU0FEUWVyNHl3QTJBdkMxQVNBRFFSYzJBdlMxQVNBRFFlcitBenNCK0xVQklBTkJnZm5MQURZQy9MVUJJQU5CQ1RZQ2dMWUJJQU5CcnNJQU93R0V0Z0VnQTBHSytjc0FOZ0tJdGdFZ0EwRUpOZ0tNdGdFZ0EwSHM3UU03QVpDMkFTQURRYTNEendBMkFwUzJBU0FEUVFNMkFwaTJBU0FEUWJjSE93R2N0Z0VnQTBHVCtjc0FOZ0tndGdFZ0EwRUtOZ0trdGdFZ0EwSG9DanNCcUxZQklBTkJuZm5MQURZQ3JMWUJJQU5CQ0RZQ3NMWUJJQU5CcmdjN0FiUzJBU0FEUWZxT3pnQTJBcmkyQVNBRFFRTTJBcnkyQVNBRFFmQUJPd0hBdGdFZ0EwR2wrY3NBTmdMRXRnRWdBMEVHTmdMSXRnRWdBMEc5UFRzQnpMWUJJQU5CcS9uTEFEWUMwTFlCSUFOQkN6WUMxTFlCSUFOQm16dzdBZGkyQVNBRFFiYjV5d0EyQXR5MkFTQURRUkkyQXVDMkFTQURRWkVMT3dIa3RnRWdBMEhJK2NzQU5nTG90Z0VnQTBFV05nTHN0Z0VnQTBHUkN6c0I4TFlCSUFOQjN2bkxBRFlDOUxZQklBTkJEVFlDK0xZQklBTkJrUXM3QWZ5MkFTQURRZXY1eXdBMkFvQzNBU0FEUVJFMkFvUzNBU0FEUVpFTE93R0l0d0VnQTBIOCtjc0FOZ0tNdHdFZ0EwRUhOZ0tRdHdFZ0EwSGRBenNCbExjQklBTkJnL3JMQURZQ21MY0JJQU5CQ0RZQ25MY0JJQU5CNGVJQU93R2d0d0VnQTBHTCtzc0FOZ0trdHdFZ0EwRUVOZ0tvdHdFZ0EwR3N3UUE3QWF5M0FTQURRWS82eXdBMkFyQzNBU0FEUVJFMkFyUzNBU0FEUWNjVE93RzR0d0VnQTBHZytzc0FOZ0s4dHdFZ0EwRU9OZ0xBdHdFZ0EwSEhFanNCeExjQklBTkJydnJMQURZQ3lMY0JJQU5CRWpZQ3pMY0JJQU5CeHhVN0FkQzNBU0FEUWFEL3pRQTJBdFMzQVNBRFFRWTJBdGkzQVNBRFFTRTdBZHkzQVNBRFFjRDZ5d0EyQXVDM0FTQURRUTQyQXVTM0FTQURRZHdLT3dIb3R3RWdBMEhPK3NzQU5nTHN0d0VnQTBFSk5nTHd0d0VnQTBHOHdBQTdBZlMzQVNBRFFlK0J6Z0EyQXZpM0FTQURRUW8yQXZ5M0FTQURRYUVCT3dHQXVBRWdBMEhYK3NzQU5nS0V1QUVnQTBFUE5nS0l1QUVnQTBHaDd3TTdBWXk0QVNBRFFlYjZ5d0EyQXBDNEFTQURRUTgyQXBTNEFTQURRWUgrQXpzQm1MZ0JJQU5COWZyTEFEWUNuTGdCSUFOQkN6WUNvTGdCSUFOQm9lNERPd0drdUFFZ0EwSGJ3YzhBTmdLb3VBRWdBMEVMTmdLc3VBRWdBMEdEeEFBN0FiQzRBU0FEUVlEN3l3QTJBclM0QVNBRFFRTTJBcmk0QVNBRFFaSUZPd0c4dUFFZ0EwR0QrOHNBTmdMQXVBRWdBMEVJTmdMRXVBRWdBMEh2QXpzQnlMZ0JJQU5CaS92TEFEWUN6TGdCSUFOQkJ6WUMwTGdCSUFOQmt3VTdBZFM0QVNBRFFaTDd5d0EyQXRpNEFTQURRUXMyQXR5NEFTQURRYmtET3dIZ3VBRWdBMEdkKzhzQU5nTGt1QUVnQTBFSE5nTG91QUVnQTBHNkF6c0I3TGdCSUFOQnVvSE9BRFlDOExnQklBTkJBVFlDOUxnQklBTkI1Z0E3QWZpNEFTQURRYVQ3eXdBMkF2eTRBU0FEUVFNMkFvQzVBU0FEUVlEMkF6c0JoTGtCSUFOQnAvdkxBRFlDaUxrQklBTkJCVFlDakxrQklBTkJnL1lET3dHUXVRRWdBMEdzKzhzQU5nS1V1UUVnQTBFRk5nS1l1UUVnQTBHRTlnTTdBWnk1QVNBRFFiSDd5d0EyQXFDNUFTQURRUU0yQXFTNUFTQURRWUgyQXpzQnFMa0JJQU5CdFB2TEFEWUNyTGtCSUFOQkF6WUNzTGtCSUFOQmd2WURPd0cwdVFFZ0EwRzMrOHNBTmdLNHVRRWdBMEVHTmdLOHVRRWdBMEhlRWpzQndMa0JJQU5CdmZ2TEFEWUN4TGtCSUFOQkNqWUN5TGtCSUFOQjNoUTdBY3k1QVNBRFFjZjd5d0EyQXRDNUFTQURRUW8yQXRTNUFTQURRWW5DQURzQjJMa0JJQU5CMGZ2TEFEWUMzTGtCSUFOQkN6WUM0TGtCSUFOQnpndzdBZVM1QVNBRFFkejd5d0EyQXVpNUFTQURRUTQyQXV5NUFTQURRYzRNT3dId3VRRWdBMEhxKzhzQU5nTDB1UUVnQTBFT05nTDR1UUVnQTBITEREc0IvTGtCSUFOQitQdkxBRFlDZ0xvQklBTkJDVFlDaExvQklBTkJpT0lBT3dHSXVnRWdBMEdCL01zQU5nS011Z0VnQTBFSE5nS1F1Z0VnQTBIVnlRQTdBWlM2QVNBRFFZajh5d0EyQXBpNkFTQURRUW8yQXB5NkFTQURRWjg4T3dHZ3VnRWdBMEdTL01zQU5nS2t1Z0VnQTBFSk5nS291Z0VnQTBIQkREc0JyTG9CSUFOQm0vekxBRFlDc0xvQklBTkJDellDdExvQklBTkJoZ3M3QWJpNkFTQURRYWI4eXdBMkFyeTZBU0FEUVE0MkFzQzZBU0FEUWRMOUF6c0J4TG9CSUFOQnRQekxBRFlDeUxvQklBTkJFRFlDekxvQklBTkIwLzBET3dIUXVnRWdBMEhFL01zQU5nTFV1Z0VnQTBFUE5nTFl1Z0VnQTBIVS9RTTdBZHk2QVNBRFFkUDh5d0EyQXVDNkFTQURRUWsyQXVTNkFTQURRZVVIT3dIb3VnRWdBMEhjL01zQU5nTHN1Z0VnQTBFR05nTHd1Z0VnQTBIQXpBQTdBZlM2QVNBRFFlTDh5d0EyQXZpNkFTQURRUUkyQXZ5NkFTQURRWUQyQXpzQmdMc0JJQU5CNVB6TEFEWUNoTHNCSUFOQkF6WUNpTHNCSUFOQmcvWURPd0dNdXdFZ0EwSG4vTXNBTmdLUXV3RWdBMEVETmdLVXV3RWdBMEdFOWdNN0FaaTdBU0FEUWVTQ3pnQTJBcHk3QVNBRFFRSTJBcUM3QVNBRFFZSDJBenNCcExzQklBTkI2dnpMQURZQ3FMc0JJQU5CRFRZQ3JMc0JJQU5CN3NnQU93R3d1d0VnQTBIMy9Nc0FOZ0swdXdFZ0EwRU1OZ0s0dXdFZ0EwR0N5UUE3QWJ5N0FTQURRWVA5eXdBMkFzQzdBU0FEUVEwMkFzUzdBU0FEUVpiSkFEc0J5THNCSUFOQmtQM0xBRFlDekxzQklBTkJDallDMExzQklBTkJrc0FBT3dIVXV3RWdBMEdhL2NzQU5nTFl1d0VnQTBFSk5nTGN1d0VnQTBHZ3l3QTdBZUM3QVNBRFFhUDl5d0EyQXVTN0FTQURRUW8yQXVpN0FTQURRYXpMQURzQjdMc0JJQU5CcmYzTEFEWUM4THNCSUFOQkNEWUM5THNCSUFOQjJnczdBZmk3QVNBRFFiWDl5d0EyQXZ5N0FTQURRUTQyQW9DOEFTQURRYnIyQXpzQmhMd0JJQU5Cdy8zTEFEWUNpTHdCSUFOQkZEWUNqTHdCSUFOQnV2WURPd0dRdkFFZ0EwSFgvY3NBTmdLVXZBRWdBMEVPTmdLWXZBRWdBMEhhQ3pzQm5Md0JJQU5CNWYzTEFEWUNvTHdCSUFOQkRqWUNwTHdCSUFOQjJnczdBYWk4QVNBRFFmUDl5d0EyQXF5OEFTQURRUlEyQXJDOEFTQURRZG9MT3dHMHZBRWdBMEdIL3NzQU5nSzR2QUVnQTBFTk5nSzh2QUVnQTBIYUN6c0J3THdCSUFOQmxQN0xBRFlDeEx3QklBTkJFellDeUx3QklBTkIyZ3M3QWN5OEFTQURRYWYreXdBMkF0QzhBU0FEUVFnMkF0UzhBU0FEUWQwTE93SFl2QUVnQTBHdi9zc0FOZ0xjdkFFZ0EwRU9OZ0xndkFFZ0EwSGRDenNCNUx3QklBTkJ2ZjdMQURZQzZMd0JJQU5CQ0RZQzdMd0JJQU5CM3dzN0FmQzhBU0FEUWNYK3l3QTJBdlM4QVNBRFFRNDJBdmk4QVNBRFFkOExPd0g4dkFFZ0EwSFQvc3NBTmdLQXZRRWdBMEVITmdLRXZRRWdBMEhqQ3pzQmlMMEJJQU5CMnY3TEFEWUNqTDBCSUFOQkRUWUNrTDBCSUFOQjR3czdBWlM5QVNBRFFlZit5d0EyQXBpOUFTQURRUW8yQXB5OUFTQURRZVVMT3dHZ3ZRRWdBMEh4L3NzQU5nS2t2UUVnQTBFUU5nS292UUVnQTBIbEN6c0JyTDBCSUFOQmdmL0xBRFlDc0wwQklBTkJFRFlDdEwwQklBTkJ5UVU3QWJpOUFTQURRWkgveXdBMkFyeTlBU0FEUVFjMkFzQzlBU0FEUWNuTEFEc0J4TDBCSUFOQm1QL0xBRFlDeUwwQklBTkJERFlDekwwQklBTkI4d2c3QWRDOUFTQURRYUNBemdBMkF0UzlBU0FEUVFRMkF0aTlBU0FEUVRVN0FkeTlBU0FEUWFUL3l3QTJBdUM5QVNBRFFRbzJBdVM5QVNBRFFlVU1Pd0hvdlFFZ0EwR3UvOHNBTmdMc3ZRRWdBMEVMTmdMd3ZRRWdBMEhyRXpzQjlMMEJJQU5CdWYvTEFEWUMrTDBCSUFOQkNqWUMvTDBCSUFOQjVNZ0FPd0dBdmdFZ0EwSEQvOHNBTmdLRXZnRWdBMEVhTmdLSXZnRWdBMEdPendBN0FZeStBU0FEUWQzL3l3QTJBcEMrQVNBRFFRZzJBcFMrQVNBRFFlc1NPd0dZdmdFZ0EwSGwvOHNBTmdLY3ZnRWdBMEVMTmdLZ3ZnRWdBMEhkd2dBN0FhUytBU0FEUWZEL3l3QTJBcWkrQVNBRFFRdzJBcXkrQVNBRFFlc1ZPd0d3dmdFZ0EwSDgvOHNBTmdLMHZnRWdBMEVNTmdLNHZnRWdBMEhyRkRzQnZMNEJJQU5CaUlETUFEWUN3TDRCSUFOQkRqWUN4TDRCSUFOQjVRdzdBY2krQVNBRFFaYUF6QUEyQXN5K0FTQURRUXcyQXRDK0FTQURRYVhnQURzQjFMNEJJQU5Cb29ETUFEWUMyTDRCSUFOQkZEWUMzTDRCSUFOQnBPUUFPd0hndmdFZ0EwRzJnTXdBTmdMa3ZnRWdBMEVNTmdMb3ZnRWdBMEdGd1FBN0FleStBU0FEUWNLQXpBQTJBdkMrQVNBRFFRMDJBdlMrQVNBRFFaWCtBenNCK0w0QklBTkJ6NERNQURZQy9MNEJJQU5CRERZQ2dMOEJJQU5CdGU0RE93R0V2d0VnQTBIYmdNd0FOZ0tJdndFZ0EwRUpOZ0tNdndFZ0EwSDR5QUE3QVpDL0FTQURRZVNBekFBMkFwUy9BU0FEUVFvMkFwaS9BU0FEUVl6SkFEc0JuTDhCSUFOQjdvRE1BRFlDb0w4QklBTkJDellDcEw4QklBTkI5UTA3QWFpL0FTQURRZm1BekFBMkFxeS9BU0FEUVFrMkFyQy9BU0FEUWZUQ0FEc0J0TDhCSUFOQmdvSE1BRFlDdUw4QklBTkJERFlDdkw4QklBTkI5Y0FBT3dIQXZ3RWdBMEdPZ2N3QU5nTEV2d0VnQTBFSU5nTEl2d0VnQTBIVkhEc0J6TDhCSUFOQjVvTE9BRFlDMEw4QklBTkJBallDMUw4QklBTkJndllET3dIWXZ3RWdBMEdXZ2N3QU5nTGN2d0VnQTBFRU5nTGd2d0VnQTBIdHpBQTdBZVMvQVNBRFFacUJ6QUEyQXVpL0FTQURRUWsyQXV5L0FTQURRWXJHQURzQjhMOEJJQU5CbzRITUFEWUM5TDhCSUFOQkREWUMrTDhCSUFOQmlzWUFPd0g4dndFZ0EwR3ZnY3dBTmdLQXdBRWdBMEVOTmdLRXdBRWdBMEdLeGdBN0FZakFBU0FEUWJ5QnpBQTJBb3pBQVNBRFFRdzJBcERBQVNBRFFZckdBRHNCbE1BQklBTkJ5SUhNQURZQ21NQUJJQU5CRFRZQ25NQUJJQU5CaXNZQU93R2d3QUVnQTBIVmdjd0FOZ0trd0FFZ0EwRUtOZ0tvd0FFZ0EwR0x4Z0E3QWF6QUFTQURRZCtCekFBMkFyREFBU0FEUVEwMkFyVEFBU0FEUVl2R0FEc0J1TUFCSUFOQjdJSE1BRFlDdk1BQklBTkJEallDd01BQklBTkJpOFlBT3dIRXdBRWdBMEg2Z2N3QU5nTEl3QUVnQTBFTk5nTE13QUVnQTBHTHhnQTdBZERBQVNBRFFZZUN6QUEyQXRUQUFTQURRUTQyQXRqQUFTQURRWXZHQURzQjNNQUJJQU5Ca0lMT0FEWUM0TUFCSUFOQkJqWUM1TUFCSUFOQmtnTTdBZWpBQVNBRFFaV0N6QUEyQXV6QUFTQURRUW8yQXZEQUFTQURRY2IrQXpzQjlNQUJJQU5CbjRMTUFEWUMrTUFCSUFOQkNEWUMvTUFCSUFOQm1lY0FPd0dBd1FFZ0EwR25nc3dBTmdLRXdRRWdBMEVKTmdLSXdRRWdBMEdmSERzQmpNRUJJQU5Cc0lMTUFEWUNrTUVCSUFOQkNEWUNsTUVCSUFOQm5SdzdBWmpCQVNBRFFiaUN6QUEyQXB6QkFTQURRUTgyQXFEQkFTQURRYnJWQURzQnBNRUJJQU5CeDRMTUFEWUNxTUVCSUFOQkVEWUNyTUVCSUFOQnR0VUFPd0d3d1FFZ0EwSFhnc3dBTmdLMHdRRWdBMEVSTmdLNHdRRWdBMEhweFFBN0FiekJBU0FEUWVpQ3pBQTJBc0RCQVNBRFFRYzJBc1RCQVNBRFFmdkVBRHNCeU1FQklBTkI3NExNQURZQ3pNRUJJQU5CRERZQzBNRUJJQU5CL2NRQU93SFV3UUVnQTBIN2dzd0FOZ0xZd1FFZ0EwRU9OZ0xjd1FFZ0EwSDl4QUE3QWVEQkFTQURRWW1EekFBMkF1VEJBU0FEUVE0MkF1akJBU0FEUWYvRUFEc0I3TUVCSUFOQmw0UE1BRFlDOE1FQklBTkJDellDOU1FQklBTkJ6eHc3QWZqQkFTQURRYUtEekFBMkF2ekJBU0FEUVFZMkFvRENBU0FEUVlERUFEc0JoTUlCSUFOQnFJUE1BRFlDaU1JQklBTkJCallDak1JQklBTkJxY1VBT3dHUXdnRWdBMEd1Zzh3QU5nS1V3Z0VnQTBFSk5nS1l3Z0VnQTBHcXhRQTdBWnpDQVNBRFFiZUR6QUEyQXFEQ0FTQURRUVEyQXFUQ0FTQURRZFRGQURzQnFNSUJJQU5CbklET0FEWUNyTUlCSUFOQkJEWUNzTUlCSUFOQk5Ec0J0TUlCSUFOQnU0UE1BRFlDdU1JQklBTkJDallDdk1JQklBTkI1QXc3QWNEQ0FTQURRY1dEekFBMkFzVENBU0FEUVFzMkFzakNBU0FEUWVvVE93SE13Z0VnQTBIUWc4d0FOZ0xRd2dFZ0EwRUtOZ0xVd2dFZ0EwSGp5QUE3QWRqQ0FTQURRZHFEekFBMkF0ekNBU0FEUVJvMkF1RENBU0FEUVkzUEFEc0I1TUlCSUFOQjlJUE1BRFlDNk1JQklBTkJDRFlDN01JQklBTkI2aEk3QWZEQ0FTQURRZnlEekFBMkF2VENBU0FEUVF3MkF2akNBU0FEUWVvVk93SDh3Z0VnQTBHSWhNd0FOZ0tBd3dFZ0EwRU1OZ0tFd3dFZ0EwSHFGRHNCaU1NQklBTkJsSVRNQURZQ2pNTUJJQU5CRGpZQ2tNTUJJQU5CNUF3N0FaVERBU0FEUWFLRXpBQTJBcGpEQVNBRFFRdzJBcHpEQVNBRFFhVGdBRHNCb01NQklBTkJyb1RNQURZQ3BNTUJJQU5CRkRZQ3FNTUJJQU5CbytRQU93R3N3d0VnQTBIQ2hNd0FOZ0t3d3dFZ0EwRU1OZ0swd3dFZ0EwR0V3UUE3QWJqREFTQURRYzZFekFBMkFyekRBU0FEUVEwMkFzRERBU0FEUVpUK0F6c0J4TU1CSUFOQjI0VE1BRFlDeU1NQklBTkJGRFlDek1NQklBTkI5eE03QWREREFTQURRZStFekFBMkF0VERBU0FEUVF3MkF0akRBU0FEUWJUdUF6c0IzTU1CSUFOQis0VE1BRFlDNE1NQklBTkJDVFlDNU1NQklBTkI5OGdBT3dIb3d3RWdBMEdFaGN3QU5nTHN3d0VnQTBFS05nTHd3d0VnQTBHTHlRQTdBZlREQVNBRFFZNkZ6QUEyQXZqREFTQURRUXMyQXZ6REFTQURRZlFOT3dHQXhBRWdBMEdaaGN3QU5nS0V4QUVnQTBFSk5nS0l4QUVnQTBIendnQTdBWXpFQVNBRFFhS0Z6QUEyQXBERUFTQURRUXcyQXBURUFTQURRZlRBQURzQm1NUUJJQU5Ccm9YTUFEWUNuTVFCSUFOQkRqWUNvTVFCSUFOQjdjZ0FPd0dreEFFZ0EwRzhoY3dBTmdLb3hBRWdBMEVOTmdLc3hBRWdBMEdCeVFBN0FiREVBU0FEUWNtRnpBQTJBclRFQVNBRFFRNDJBcmpFQVNBRFFaWEpBRHNCdk1RQklBTkIxNFhNQURZQ3dNUUJJQU5CQ0RZQ3hNUUJJQU5CMUJ3N0FjakVBU0FEUWQrRnpBQTJBc3pFQVNBRFFSRTJBdERFQVNBRFFjc0ZPd0hVeEFFZ0EwSHdoY3dBTmdMWXhBRWdBMEVHTmdMY3hBRWdBMEdoeVFBN0FlREVBU0FEUVlXQ3pnQTJBdVRFQVNBRFFRZzJBdWpFQVNBRFFjVEFBRHNCN01RQklBTkI5b1hNQURZQzhNUUJJQU5CQlRZQzlNUUJJQU5CbzhFQU93SDR4QUVnQTBIN2hjd0FOZ0w4eEFFZ0EwRUZOZ0tBeFFFZ0EwR2l4Z0E3QVlURkFTQURRYnVCemdBMkFvakZBU0FEUVFFMkFvekZBU0FEUWVjQU93R1F4UUVnQTBHQWhzd0FOZ0tVeFFFZ0EwRUpOZ0tZeFFFZ0EwR1hFenNCbk1VQklBTkJpWWJNQURZQ29NVUJJQU5CQmpZQ3BNVUJJQU5COVFNN0FhakZBU0FEUVkrR3pBQTJBcXpGQVNBRFFRWTJBckRGQVNBRFFaY1NPd0cweFFFZ0EwR1Zoc3dBTmdLNHhRRWdBMEVKTmdLOHhRRWdBMEd2RFRzQndNVUJJQU5Cbm9iTUFEWUN4TVVCSUFOQkRqWUN5TVVCSUFOQmsvY0RPd0hNeFFFZ0EwR3Noc3dBTmdMUXhRRWdBMEVRTmdMVXhRRWdBMEdVOXdNN0FkakZBU0FEUWJ5R3pBQTJBdHpGQVNBRFFRODJBdURGQVNBRFFaWDNBenNCNU1VQklBTkJ5NGJNQURZQzZNVUJJQU5CQ2pZQzdNVUJJQU5CbHhVN0FmREZBU0FEUWRXR3pBQTJBdlRGQVNBRFFRbzJBdmpGQVNBRFFaY1VPd0g4eFFFZ0EwSGZoc3dBTmdLQXhnRWdBMEVLTmdLRXhnRWdBMEhNNEFBN0FZakdBU0FEUWVtR3pBQTJBb3pHQVNBRFFRbzJBcERHQVNBRFFhemhBRHNCbE1ZQklBTkJxTVBQQURZQ21NWUJJQU5CQlRZQ25NWUJJQU5Cc3djN0FhREdBU0FEUWZPR3pBQTJBcVRHQVNBRFFRODJBcWpHQVNBRFFlTUVPd0dzeGdFZ0EwR0NoOHdBTmdLd3hnRWdBMEVOTmdLMHhnRWdBMEhnQlRzQnVNWUJJQU5CajRmTUFEWUN2TVlCSUFOQkREWUN3TVlCSUFOQjZ3YzdBY1RHQVNBRFFadUh6QUEyQXNqR0FTQURRUWsyQXN6R0FTQURRWTNpQURzQjBNWUJJQU5CNll6T0FEWUMxTVlCSUFOQkJqWUMyTVlCSUFOQm53STdBZHpHQVNBRFFhU0h6QUEyQXVER0FTQURRUVkyQXVUR0FTQURRZWNET3dIb3hnRWdBMEdxaDh3QU5nTHN4Z0VnQTBFSU5nTHd4Z0VnQTBHakFqc0I5TVlCSUFOQnNvZk1BRFlDK01ZQklBTkJCellDL01ZQklBTkIxc2tBT3dHQXh3RWdBMEc1aDh3QU5nS0V4d0VnQTBFTE5nS0l4d0VnQTBHZEFqc0JqTWNCSUFOQjdvN09BRFlDa01jQklBTkJERFlDbE1jQklBTkJvd0k3QVpqSEFTQURRY1NIekFBMkFwekhBU0FEUVFRMkFxREhBU0FEUWFFQ093R2t4d0VnQTBISWg4d0FOZ0tveHdFZ0EwRUtOZ0tzeHdFZ0EwR2hBanNCc01jQklBTkIwb2ZNQURZQ3RNY0JJQU5CQ2pZQ3VNY0JJQU5Cc3dnN0FiekhBU0FEUWR5SHpBQTJBc0RIQVNBRFFRbzJBc1RIQVNBRFFkTGdBRHNCeU1jQklBTkI1b2ZNQURZQ3pNY0JJQU5CQ2pZQzBNY0JJQU5Cc3VFQU93SFV4d0VnQTBId2g4d0FOZ0xZeHdFZ0EwRU9OZ0xjeHdFZ0EwSE94QUE3QWVESEFTQURRZjZIekFBMkF1VEhBU0FEUVJJMkF1akhBU0FEUWRIRUFEc0I3TWNCSUFOQmtJak1BRFlDOE1jQklBTkJFallDOU1jQklBTkJuQXM3QWZqSEFTQURRYUtJekFBMkF2ekhBU0FEUVF3MkFvRElBU0FEUWZNTE93R0V5QUVnQTBHdWlNd0FOZ0tJeUFFZ0EwRVNOZ0tNeUFFZ0EwR2RDenNCa01nQklBTkJpb1hPQURZQ2xNZ0JJQU5CQ2pZQ21NZ0JJQU5CM3dFN0FaeklBU0FEUWNDSXpBQTJBcURJQVNBRFFSVTJBcVRJQVNBRFFaNExPd0dveUFFZ0EwSFZpTXdBTmdLc3lBRWdBMEVQTmdLd3lBRWdBMEgwQ3pzQnRNZ0JJQU5CNUlqTUFEWUN1TWdCSUFOQkNEWUN2TWdCSUFOQmsrQUFPd0hBeUFFZ0EwSHNpTXdBTmdMRXlBRWdBMEVLTmdMSXlBRWdBMEdZRXpzQnpNZ0JJQU5COW9qTUFEWUMwTWdCSUFOQkREWUMxTWdCSUFOQjhnbzdBZGpJQVNBRFFZS0p6QUEyQXR6SUFTQURRUWMyQXVESUFTQURRWmdTT3dIa3lBRWdBMEdKaWN3QU5nTG95QUVnQTBFTE5nTHN5QUVnQTBHWUZUc0I4TWdCSUFOQmxJbk1BRFlDOU1nQklBTkJDellDK01nQklBTkJtQlE3QWZ6SUFTQURRWitKekFBMkFvREpBU0FEUVFzMkFvVEpBU0FEUWJvTU93R0l5UUVnQTBHcWljd0FOZ0tNeVFFZ0EwRVFOZ0tReVFFZ0EwSE8vUU03QVpUSkFTQURRYnFKekFBMkFwakpBU0FEUVJJMkFwekpBU0FEUWMvOUF6c0JvTWtCSUFOQnpJbk1BRFlDcE1rQklBTkJFVFlDcU1rQklBTkIwUDBET3dHc3lRRWdBMEhkaWN3QU5nS3d5UUVnQTBFVk5nSzB5UUVnQTBHVkNUc0J1TWtCSUFOQjhvbk1BRFlDdk1rQklBTkJFVFlDd01rQklBTkJrd2s3QWNUSkFTQURRWU9LekFBMkFzakpBU0FEUVJFMkFzekpBU0FEUVpFSk93SFF5UUVnQTBHVWlzd0FOZ0xVeVFFZ0EwRUlOZ0xZeVFFZ0EwSGFFanNCM01rQklBTkJuSXJNQURZQzRNa0JJQU5CRERZQzVNa0JJQU5CMmhRN0FlakpBU0FEUWFpS3pBQTJBdXpKQVNBRFFRVTJBdkRKQVNBRFFlQUVPd0gweVFFZ0EwR3Rpc3dBTmdMNHlRRWdBMEVKTmdMOHlRRWdBMEdUNXdBN0FZREtBU0FEUWJhS3pBQTJBb1RLQVNBRFFRbzJBb2pLQVNBRFFjN2dBRHNCak1vQklBTkJ3SXJNQURZQ2tNb0JJQU5CQ2pZQ2xNb0JJQU5CcnVFQU93R1l5Z0VnQTBIS2lzd0FOZ0tjeWdFZ0EwRUxOZ0tneWdFZ0EwSGpDanNCcE1vQklBTkIxWXJNQURZQ3FNb0JJQU5CQlRZQ3JNb0JJQU5CMGdzN0FiREtBU0FEUWRxS3pBQTJBclRLQVNBRFFRczJBcmpLQVNBRFFiTDJBenNCdk1vQklBTkI1WXJNQURZQ3dNb0JJQU5CRVRZQ3hNb0JJQU5Cc3ZZRE93SEl5Z0VnQTBIMmlzd0FOZ0xNeWdFZ0EwRUxOZ0xReWdFZ0EwSFNDenNCMU1vQklBTkJnWXZNQURZQzJNb0JJQU5CQ3pZQzNNb0JJQU5CMHdnN0FlREtBU0FEUVl5THpBQTJBdVRLQVNBRFFSVTJBdWpLQVNBRFFiNERPd0hzeWdFZ0EwR2hpOHdBTmdMd3lnRWdBMEVMTmdMMHlnRWdBMEdVQlRzQitNb0JJQU5Cckl2TUFEWUMvTW9CSUFOQkV6WUNnTXNCSUFOQmxnVTdBWVRMQVNBRFFiK0x6QUEyQW9qTEFTQURRUTQyQW96TEFTQURRY0FGT3dHUXl3RWdBMEhOaTh3QU5nS1V5d0VnQTBFVE5nS1l5d0VnQTBHVkJUc0JuTXNCSUFOQjRJdk1BRFlDb01zQklBTkJGallDcE1zQklBTkJ3UVU3QWFqTEFTQURRZmFMekFBMkFxekxBU0FEUVJzMkFyRExBU0FEUWVRRk93RzB5d0VnQTBHUmpNd0FOZ0s0eXdFZ0EwRVJOZ0s4eXdFZ0EwR2hCVHNCd01zQklBTkJvb3pNQURZQ3hNc0JJQU5CR1RZQ3lNc0JJQU5Cb2dVN0FjekxBU0FEUWJ1TXpBQTJBdERMQVNBRFFRYzJBdFRMQVNBRFFhRThPd0hZeXdFZ0EwSENqTXdBTmdMY3l3RWdBMEVLTmdMZ3l3RWdBMEhIL2dNN0FlVExBU0FEUWN5TXpBQTJBdWpMQVNBRFFRbzJBdXpMQVNBRFFkVGdBRHNCOE1zQklBTkIxb3pNQURZQzlNc0JJQU5CQ2pZQytNc0JJQU5CdE9FQU93SDh5d0VnQTBIZ2pNd0FOZ0tBekFFZ0EwRUdOZ0tFekFFZ0EwR2l5UUE3QVlqTUFTQURRZWFNekFBMkFvek1BU0FEUVFrMkFwRE1BU0FEUWF6bkFEc0JsTXdCSUFOQnlNYlBBRFlDbU13QklBTkJDRFlDbk13QklBTkJoOFFBT3dHZ3pBRWdBMEh1Zzg0QU5nS2t6QUVnQTBFRk5nS296QUVnQTBIZ0FEc0JyTXdCSUFOQjc0ek1BRFlDc013QklBTkJEVFlDdE13QklBTkJsZ1k3QWJqTUFTQURRZnlNekFBMkFyek1BU0FEUVFnMkFzRE1BU0FEUVlBR093SEV6QUVnQTBHRWpjd0FOZ0xJekFFZ0EwRUpOZ0xNekFFZ0EwR0FCanNCME13QklBTkJqWTNNQURZQzFNd0JJQU5CQ1RZQzJNd0JJQU5CMHhJN0Fkek1BU0FEUVphTnpBQTJBdURNQVNBRFFRczJBdVRNQVNBRFFjNEZPd0hvekFFZ0EwR2hqY3dBTmdMc3pBRWdBMEVPTmdMd3pBRWdBMEhBL2dNN0FmVE1BU0FEUWErTnpBQTJBdmpNQVNBRFFRdzJBdnpNQVNBRFFjQUdPd0dBelFFZ0EwSE1nTTRBTmdLRXpRRWdBMEVITmdLSXpRRWdBMEUrT3dHTXpRRWdBMEc3amN3QU5nS1F6UUVnQTBFUk5nS1V6UUVnQTBHTTFRQTdBWmpOQVNBRFFjeU56QUEyQXB6TkFTQURRUTgyQXFETkFTQURRZWZFQURzQnBNMEJJQU5CMjQzTUFEWUNxTTBCSUFOQkNqWUNyTTBCSUFOQjE4VUFPd0d3elFFZ0EwR1BpczRBTmdLMHpRRWdBMEVNTmdLNHpRRWdBMEhseEFBN0Fiek5BU0FEUWVXTnpBQTJBc0ROQVNBRFFSSTJBc1ROQVNBRFFkdkZBRHNCeU0wQklBTkI5NDNNQURZQ3pNMEJJQU5CRURZQzBNMEJJQU5CMjhVQU93SFV6UUVnQTBHSGpzd0FOZ0xZelFFZ0EwRVFOZ0xjelFFZ0EwR2UvZ003QWVETkFTQURRWmVPekFBMkF1VE5BU0FEUVFzMkF1ak5BU0FEUWV2RUFEc0I3TTBCSUFOQm9vN01BRFlDOE0wQklBTkJFallDOU0wQklBTkJpdFVBT3dINHpRRWdBMEcwanN3QU5nTDh6UUVnQTBFUE5nS0F6Z0VnQTBHSTFRQTdBWVRPQVNBRFFjT096QUEyQW9qT0FTQURRUkkyQW96T0FTQURRWWJWQURzQmtNNEJJQU5CMVk3TUFEWUNsTTRCSUFOQkV6WUNtTTRCSUFOQi90UUFPd0djemdFZ0EwSG9qc3dBTmdLZ3pnRWdBMEVUTmdLa3pnRWdBMEh6eEFBN0Fhak9BU0FEUWZ1T3pBQTJBcXpPQVNBRFFRMDJBckRPQVNBRFFmZkVBRHNCdE00QklBTkJpSS9NQURZQ3VNNEJJQU5CRWpZQ3ZNNEJJQU5CNmNRQU93SEF6Z0VnQTBHYWo4d0FOZ0xFemdFZ0EwRVJOZ0xJemdFZ0EwSHB4QUE3QWN6T0FTQURRYXVQekFBMkF0RE9BU0FEUVJBMkF0VE9BU0FEUWZQRUFEc0IyTTRCSUFOQnU0L01BRFlDM000QklBTkJFRFlDNE00QklBTkI1OFFBT3dIa3pnRWdBMEhMajh3QU5nTG96Z0VnQTBFTU5nTHN6Z0VnQTBIbC9BTTdBZkRPQVNBRFFkZVB6QUEyQXZUT0FTQURRUWMyQXZqT0FTQURRZUVFT3dIOHpnRWdBMEhlajh3QU5nS0F6d0VnQTBFSE5nS0V6d0VnQTBIbEF6c0JpTThCSUFOQjVZL01BRFlDak04QklBTkJDallDa004QklBTkIwT0FBT3dHVXp3RWdBMEc4Z3M0QU5nS1l6d0VnQTBFTk5nS2N6d0VnQTBHckFUc0JvTThCSUFOQndZUE9BRFlDcE04QklBTkJEallDcU04QklBTkJ1d0U3QWF6UEFTQURRY21DemdBMkFyRFBBU0FEUVEwMkFyVFBBU0FEUWJuQUFEc0J1TThCSUFOQjFvTE9BRFlDdk04QklBTkJEallDd004QklBTkJ1c0FBT3dIRXp3RWdBMEh2ajh3QU5nTEl6d0VnQTBFS05nTE16d0VnQTBHdzRRQTdBZERQQVNBRFFmbVB6QUEyQXRUUEFTQURRUXcyQXRqUEFTQURRWmptQURzQjNNOEJJQU5CaFpETUFEWUM0TThCSUFOQkNEWUM1TThCSUFOQnllY0FPd0hvendFZ0EwRzhnYzRBTmdMc3p3RWdBMEVCTmdMd3p3RWdBMEhvQURzQjlNOEJJQU5CalpETUFEWUMrTThCSUFOQkV6WUMvTThCSUFOQnFRazdBWURRQVNBRFFhQ1F6QUEyQW9UUUFTQURRUTQyQW9qUUFTQURRY0VOT3dHTTBBRWdBMEd1a013QU5nS1EwQUVnQTBFSk5nS1UwQUVnQTBHNUV6c0JtTkFCSUFOQnQ1RE1BRFlDbk5BQklBTkJFellDb05BQklBTkJzd2s3QWFUUUFTQURRY3FRekFBMkFxalFBU0FEUVFZMkFxelFBU0FEUWJrU093R3cwQUVnQTBIUWtNd0FOZ0swMEFFZ0EwRUtOZ0s0MEFFZ0EwRzVGVHNCdk5BQklBTkIycERNQURZQ3dOQUJJQU5CQ2pZQ3hOQUJJQU5CdVJRN0FjalFBU0FEUWVTUXpBQTJBc3pRQVNBRFFRazJBdERRQVNBRFFhME1Pd0hVMEFFZ0EwSHRrTXdBTmdMWTBBRWdBMEVPTmdMYzBBRWdBMEdpL1FNN0FlRFFBU0FEUWZ1UXpBQTJBdVRRQVNBRFFSQTJBdWpRQVNBRFFhUDlBenNCN05BQklBTkJpNUhNQURZQzhOQUJJQU5CQ2pZQzlOQUJJQU5CNytBQU93SDQwQUVnQTBHVmtjd0FOZ0w4MEFFZ0EwRVBOZ0tBMFFFZ0EwR2svUU03QVlUUkFTQURRYVNSekFBMkFvalJBU0FEUVFzMkFvelJBU0FEUWFybUFEc0JrTkVCSUFOQnI1SE1BRFlDbE5FQklBTkJDallDbU5FQklBTkJ6K0VBT3dHYzBRRWdBMEc1a2N3QU5nS2cwUUVnQTBFVE5nS2swUUVnQTBHSy93TTdBYWpSQVNBRFFjeVJ6QUEyQXF6UkFTQURRUTQyQXJEUkFTQURRYzBVT3dHMDBRRWdBMEhha2N3QU5nSzQwUUVnQTBFTE5nSzgwUUVnQTBHaEREc0J3TkVCSUFOQjVaSE1BRFlDeE5FQklBTkJFRFlDeU5FQklBTkJvUXc3QWN6UkFTQURRZldSekFBMkF0RFJBU0FEUVJNMkF0VFJBU0FEUWFFTU93SFkwUUVnQTBHSWtzd0FOZ0xjMFFFZ0EwRVFOZ0xnMFFFZ0EwR2hERHNCNU5FQklBTkJtSkxNQURZQzZORUJJQU5CRXpZQzdORUJJQU5Cb1F3N0FmRFJBU0FEUWF1U3pBQTJBdlRSQVNBRFFRNDJBdmpSQVNBRFFhRU1Pd0g4MFFFZ0EwRzVrc3dBTmdLQTBnRWdBMEVUTmdLRTBnRWdBMEdoRERzQmlOSUJJQU5CekpMTUFEWUNqTklCSUFOQkZqWUNrTklCSUFOQm9RdzdBWlRTQVNBRFFlS1N6QUEyQXBqU0FTQURRUkEyQXB6U0FTQURRYUVNT3dHZzBnRWdBMEh5a3N3QU5nS2swZ0VnQTBFTU5nS28wZ0VnQTBIazRnQTdBYXpTQVNBRFFmNlN6QUEyQXJEU0FTQURRUkEyQXJUU0FTQURRY29JT3dHNDBnRWdBMEdPazh3QU5nSzgwZ0VnQTBFUE5nTEEwZ0VnQTBIRHd3QTdBY1RTQVNBRFFaMlR6QUEyQXNqU0FTQURRUkEyQXN6U0FTQURRY0xEQURzQjBOSUJJQU5CclpQTUFEWUMxTklCSUFOQkVUWUMyTklCSUFOQnZNTUFPd0hjMGdFZ0EwRytrOHdBTmdMZzBnRWdBMEVQTmdMazBnRWdBMEc5d3dBN0FlalNBU0FEUWMyVHpBQTJBdXpTQVNBRFFSQTJBdkRTQVNBRFFjekRBRHNCOU5JQklBTkIzWlBNQURZQytOSUJJQU5CRFRZQy9OSUJJQU5Cdk1NQU93R0Ewd0VnQTBIcWs4d0FOZ0tFMHdFZ0EwRVNOZ0tJMHdFZ0EwSEF3d0E3QVl6VEFTQURRZnlUekFBMkFwRFRBU0FEUVJBMkFwVFRBU0FEUWNIREFEc0JtTk1CSUFOQmpKVE1BRFlDbk5NQklBTkJFRFlDb05NQklBTkJ5OE1BT3dHazB3RWdBMEdjbE13QU5nS28wd0VnQTBFT05nS3Mwd0VnQTBIQXd3QTdBYkRUQVNBRFFhcVV6QUEyQXJUVEFTQURRUTAyQXJqVEFTQURRYi9EQURzQnZOTUJJQU5CdDVUTUFEWUN3Tk1CSUFOQkRqWUN4Tk1CSUFOQnZzTUFPd0hJMHdFZ0EwSEZsTXdBTmdMTTB3RWdBMEVJTmdMUTB3RWdBMEhLNXdBN0FkVFRBU0FEUWMyVXpBQTJBdGpUQVNBRFFRbzJBdHpUQVNBRFFiSUxPd0hnMHdFZ0EwSFhsTXdBTmdMazB3RWdBMEVNTmdMbzB3RWdBMEd5Q3pzQjdOTUJJQU5CNDVUTUFEWUM4Tk1CSUFOQkREWUM5Tk1CSUFOQnNnczdBZmpUQVNBRFFlK1V6QUEyQXZ6VEFTQURRUXcyQW9EVUFTQURRYklMT3dHRTFBRWdBMEg3bE13QU5nS0kxQUVnQTBFUU5nS00xQUVnQTBHeUN6c0JrTlFCSUFOQmk1WE1BRFlDbE5RQklBTkJGallDbU5RQklBTkJzZ3M3QVp6VUFTQURRYUdWekFBMkFxRFVBU0FEUVJjMkFxVFVBU0FEUWJJTE93R28xQUVnQTBHNGxjd0FOZ0tzMUFFZ0EwRVVOZ0t3MUFFZ0EwR3lDenNCdE5RQklBTkJ6SlhNQURZQ3VOUUJJQU5CQ3pZQ3ZOUUJJQU5Cc3dzN0FjRFVBU0FEUWRlVnpBQTJBc1RVQVNBRFFRMDJBc2pVQVNBRFFiTUxPd0hNMUFFZ0EwSGtsY3dBTmdMUTFBRWdBMEVOTmdMVTFBRWdBMEd6Q3pzQjJOUUJJQU5COFpYTUFEWUMzTlFCSUFOQkRUWUM0TlFCSUFOQnN3czdBZVRVQVNBRFFmNlZ6QUEyQXVqVUFTQURRUkUyQXV6VUFTQURRYk1MT3dIdzFBRWdBMEdQbHN3QU5nTDAxQUVnQTBFWE5nTDQxQUVnQTBHekN6c0IvTlFCSUFOQnBwYk1BRFlDZ05VQklBTkJHRFlDaE5VQklBTkJzd3M3QVlqVkFTQURRYjZXekFBMkFvelZBU0FEUVJVMkFwRFZBU0FEUWJNTE93R1UxUUVnQTBIVGxzd0FOZ0tZMVFFZ0EwRUtOZ0tjMVFFZ0EwR3hDenNCb05VQklBTkIzWmJNQURZQ3BOVUJJQU5CRERZQ3FOVUJJQU5Cc1FzN0FhelZBU0FEUWVtV3pBQTJBckRWQVNBRFFRdzJBclRWQVNBRFFiRUxPd0c0MVFFZ0EwSDFsc3dBTmdLODFRRWdBMEVNTmdMQTFRRWdBMEd4Q3pzQnhOVUJJQU5CZ1pmTUFEWUN5TlVCSUFOQkVEWUN6TlVCSUFOQnNRczdBZERWQVNBRFFaR1h6QUEyQXRUVkFTQURRUlkyQXRqVkFTQURRYkVMT3dIYzFRRWdBMEdubDh3QU5nTGcxUUVnQTBFWE5nTGsxUUVnQTBHeEN6c0I2TlVCSUFOQnZwZk1BRFlDN05VQklBTkJGRFlDOE5VQklBTkJzUXM3QWZUVkFTQURRZEtYekFBMkF2alZBU0FEUVFjMkF2elZBU0FEUVlJR093R0ExZ0VnQTBIWmw4d0FOZ0tFMWdFZ0EwRUlOZ0tJMWdFZ0EwR0NCanNCak5ZQklBTkI0WmZNQURZQ2tOWUJJQU5CQ1RZQ2xOWUJJQU5CZ2dZN0FaaldBU0FEUWVxWHpBQTJBcHpXQVNBRFFRazJBcURXQVNBRFFZSUdPd0drMWdFZ0EwSHpsOHdBTmdLbzFnRWdBMEVFTmdLczFnRWdBMEduQWpzQnNOWUJJQU5COTVmTUFEWUN0TllCSUFOQkNUWUN1TllCSUFOQmorSUFPd0c4MWdFZ0EwR0FtTXdBTmdMQTFnRWdBMEVMTmdMRTFnRWdBMEdyUERzQnlOWUJJQU5CaTVqTUFEWUN6TllCSUFOQkNEWUMwTllCSUFOQnFUdzdBZFRXQVNBRFFaT1l6QUEyQXRqV0FTQURRUWMyQXR6V0FTQURRZGZKQURzQjROWUJJQU5CbXBqTUFEWUM1TllCSUFOQkN6WUM2TllCSUFOQnBRSTdBZXpXQVNBRFFhV1l6QUEyQXZEV0FTQURRUWsyQXZUV0FTQURRYWM4T3dINDFnRWdBMEd1bU13QU5nTDgxZ0VnQTBFS05nS0Exd0VnQTBHalBEc0JoTmNCSUFOQnVKak1BRFlDaU5jQklBTkJDVFlDak5jQklBTkJwVHc3QVpEWEFTQURRY0dZekFBMkFwVFhBU0FEUVFJMkFwalhBU0FEUWRRTE93R2Mxd0VnQTBHaHhNOEFOZ0tnMXdFZ0EwRUZOZ0trMXdFZ0EwSGx6QUE3QWFqWEFTQURRY09ZekFBMkFxelhBU0FEUVE0MkFyRFhBU0FEUWVYTUFEc0J0TmNCSUFOQjBaak1BRFlDdU5jQklBTkJEallDdk5jQklBTkI0Y3dBT3dIQTF3RWdBMEhmbU13QU5nTEUxd0VnQTBFSU5nTEkxd0VnQTBHMDlnTTdBY3pYQVNBRFFlZVl6QUEyQXREWEFTQURRUTQyQXRUWEFTQURRYlQyQXpzQjJOY0JJQU5COVpqTUFEWUMzTmNCSUFOQkR6WUM0TmNCSUFOQndRMDdBZVRYQVNBRFFZU1p6QUEyQXVqWEFTQURRUWsyQXV6WEFTQURRY2NNT3dIdzF3RWdBMEdObWN3QU5nTDAxd0VnQTBFSU5nTDQxd0VnQTBIVUN6c0IvTmNCSUFOQmxabk1BRFlDZ05nQklBTkJGRFlDaE5nQklBTkJwL2NET3dHSTJBRWdBMEdwbWN3QU5nS00yQUVnQTBFVU5nS1EyQUVnQTBIcS9RTTdBWlRZQVNBRFFiMlp6QUEyQXBqWUFTQURRUTQyQXB6WUFTQURRZXI5QXpzQm9OZ0JJQU5CeTVuTUFEWUNwTmdCSUFOQkdEWUNxTmdCSUFOQnBmY0RPd0dzMkFFZ0EwSGptY3dBTmdLdzJBRWdBMEViTmdLMDJBRWdBMEdrOXdNN0FiallBU0FEUWY2WnpBQTJBcnpZQVNBRFFSWTJBc0RZQVNBRFFhajNBenNCeE5nQklBTkJsSnJNQURZQ3lOZ0JJQU5CRURZQ3pOZ0JJQU5CNi8wRE93SFEyQUVnQTBHa21zd0FOZ0xVMkFFZ0EwRUtOZ0xZMkFFZ0EwSDQ0QUE3QWR6WUFTQURRYTZhekFBMkF1RFlBU0FEUVJVMkF1VFlBU0FEUWFuM0F6c0I2TmdCSUFOQnc1ck1BRFlDN05nQklBTkJEellDOE5nQklBTkI3UDBET3dIMDJBRWdBMEhTbXN3QU5nTDQyQUVnQTBFUE5nTDgyQUVnQTBINzVnQTdBWURaQVNBRFFlR2F6QUEyQW9UWkFTQURRUW8yQW9qWkFTQURRZGpoQURzQmpOa0JJQU5CNjVyTUFEWUNrTmtCSUFOQkV6WUNsTmtCSUFOQmpmOERPd0dZMlFFZ0EwSCttc3dBTmdLYzJRRWdBMEVQTmdLZzJRRWdBMEcyNWdBN0FhVFpBU0FEUVkyYnpBQTJBcWpaQVNBRFFRZzJBcXpaQVNBRFFlY0VPd0d3MlFFZ0EwR1ZtOHdBTmdLMDJRRWdBMEVNTmdLNDJRRWdBMEc1NWdBN0FielpBU0FEUWFHYnpBQTJBc0RaQVNBRFFRTTJBc1RaQVNBRFFkY0xPd0hJMlFFZ0EwR2ttOHdBTmdMTTJRRWdBMEVKTmdMUTJRRWdBMEhYQ3pzQjFOa0JJQU5Cclp2TUFEWUMyTmtCSUFOQkJUWUMzTmtCSUFOQjVnUTdBZURaQVNBRFFiS2J6QUEyQXVUWkFTQURRUTAyQXVqWkFTQURRYkVGT3dIczJRRWdBMEcvbTh3QU5nTHcyUUVnQTBFU05nTDAyUUVnQTBINzVBQTdBZmpaQVNBRFFkR2J6QUEyQXZ6WkFTQURRUkUyQW9EYUFTQURRWnZrQURzQmhOb0JJQU5CNHB2TUFEWUNpTm9CSUFOQkVUWUNqTm9CSUFOQjdlUUFPd0dRMmdFZ0EwSHptOHdBTmdLVTJnRWdBMEVMTmdLWTJnRWdBMEhPNGdBN0FaemFBU0FEUWY2YnpBQTJBcURhQVNBRFFSQTJBcVRhQVNBRFFZM2tBRHNCcU5vQklBTkJqcHpNQURZQ3JOb0JJQU5CQ2pZQ3NOb0JJQU5COHVBQU93RzAyZ0VnQTBHWW5Nd0FOZ0s0MmdFZ0EwRUtOZ0s4MmdFZ0EwSFM0UUE3QWNEYUFTQURRYUtjekFBMkFzVGFBU0FEUVJNMkFzamFBU0FEUVl2L0F6c0J6Tm9CSUFOQnRaek1BRFlDME5vQklBTkJCVFlDMU5vQklBTkJ0QXM3QWRqYUFTQURRYnFjekFBMkF0emFBU0FEUVFjMkF1RGFBU0FEUWJRTE93SGsyZ0VnQTBIQm5Nd0FOZ0xvMmdFZ0EwRUhOZ0xzMmdFZ0EwRzBDenNCOE5vQklBTkJ5SnpNQURZQzlOb0JJQU5CQnpZQytOb0JJQU5CdEFzN0FmemFBU0FEUWMrY3pBQTJBb0RiQVNBRFFRczJBb1RiQVNBRFFiUUxPd0dJMndFZ0EwSGFuTXdBTmdLTTJ3RWdBMEVSTmdLUTJ3RWdBMEcwQ3pzQmxOc0JJQU5CNjV6TUFEWUNtTnNCSUFOQkVqWUNuTnNCSUFOQnRBczdBYURiQVNBRFFmMmN6QUEyQXFUYkFTQURRUTgyQXFqYkFTQURRYlFMT3dHczJ3RWdBMEdNbmN3QU5nS3cyd0VnQTBFS05nSzAyd0VnQTBHV1BUc0J1TnNCSUFOQmxwM01BRFlDdk5zQklBTkJDallDd05zQklBTkJ5UDRET3dIRTJ3RWdBMEdnbmN3QU5nTEkyd0VnQTBFS05nTE0yd0VnQTBId0Nqc0IwTnNCSUFOQnFwM01BRFlDMU5zQklBTkJDVFlDMk5zQklBTkJxeHc3QWR6YkFTQURRYk9kekFBMkF1RGJBU0FEUVFvMkF1VGJBU0FEUWZ2Z0FEc0I2TnNCSUFOQnZaM01BRFlDN05zQklBTkJDallDOE5zQklBTkIyK0VBT3dIMDJ3RWdBMEhIbmN3QU5nTDQyd0VnQTBFVE5nTDgyd0VnQTBHTy93TTdBWURjQVNBRFFkcWR6QUEyQW9UY0FTQURRUVUyQW9qY0FTQURRYmtMT3dHTTNBRWdBMEhmbmN3QU5nS1EzQUVnQTBFSE5nS1UzQUVnQTBHNUN6c0JtTndCSUFOQjVwM01BRFlDbk53QklBTkJCellDb053QklBTkJ1UXM3QWFUY0FTQURRZTJkekFBMkFxamNBU0FEUVFjMkFxemNBU0FEUWJrTE93R3czQUVnQTBIMG5jd0FOZ0swM0FFZ0EwRUxOZ0s0M0FFZ0EwRzVDenNCdk53QklBTkIvNTNNQURZQ3dOd0JJQU5CRVRZQ3hOd0JJQU5CdVFzN0FjamNBU0FEUVpDZXpBQTJBc3pjQVNBRFFSSTJBdERjQVNBRFFia0xPd0hVM0FFZ0EwR2luc3dBTmdMWTNBRWdBMEVQTmdMYzNBRWdBMEc1Q3pzQjROd0JJQU5Cc1o3TUFEWUM1TndCSUFOQkREWUM2TndCSUFOQnJodzdBZXpjQVNBRFFiMmV6QUEyQXZEY0FTQURRUTAyQXZUY0FTQURRWWtHT3dINDNBRWdBMEhLbnN3QU5nTDgzQUVnQTBFSE5nS0EzUUVnQTBHSkJqc0JoTjBCSUFOQjBaN01BRFlDaU4wQklBTkJERFlDak4wQklBTkJxY01BT3dHUTNRRWdBMEhkbnN3QU5nS1UzUUVnQTBFWE5nS1kzUUVnQTBHaEJqc0JuTjBCSUFOQjlKN01BRFlDb04wQklBTkJGVFlDcE4wQklBTkJvZ1k3QWFqZEFTQURRWW1mekFBMkFxemRBU0FEUVEwMkFyRGRBU0FEUWFyREFEc0J0TjBCSUFOQmxwL01BRFlDdU4wQklBTkJDallDdk4wQklBTkJ3dVlBT3dIQTNRRWdBMEdnbjh3QU5nTEUzUUVnQTBFS05nTEkzUUVnQTBIcEJ6c0J6TjBCSUFOQnFwL01BRFlDME4wQklBTkJEVFlDMU4wQklBTkJsY0FBT3dIWTNRRWdBMEczbjh3QU5nTGMzUUVnQTBFSE5nTGczUUVnQTBHYkJqc0I1TjBCSUFOQnZwL01BRFlDNk4wQklBTkJDallDN04wQklBTkI2TXdBT3dIdzNRRWdBMEhJbjh3QU5nTDAzUUVnQTBFRk5nTDQzUUVnQTBHQ3hnQTdBZnpkQVNBRFFjMmZ6QUEyQW9EZUFTQURRUVkyQW9UZUFTQURRYVBKQURzQmlONEJJQU5CMDUvTUFEWUNqTjRCSUFOQkNUWUNrTjRCSUFOQnNBVTdBWlRlQVNBRFFkeWZ6QUEyQXBqZUFTQURRUWMyQXB6ZUFTQURRZVVFT3dHZzNnRWdBMEhqbjh3QU5nS2szZ0VnQTBFS05nS28zZ0VnQTBIMTRBQTdBYXplQVNBRFFlMmZ6QUEyQXJEZUFTQURRUXcyQXJUZUFTQURRYlBtQURzQnVONEJJQU5CK1ovTUFEWUN2TjRCSUFOQkNqWUN3TjRCSUFOQjFlRUFPd0hFM2dFZ0EwR0RvTXdBTmdMSTNnRWdBMEVUTmdMTTNnRWdBMEdNL3dNN0FkRGVBU0FEUWE2RXpnQTJBdFRlQVNBRFFRdzJBdGplQVNBRFFkMEZPd0hjM2dFZ0EwR1dvTXdBTmdMZzNnRWdBMEVQTmdMazNnRWdBMEdMQmpzQjZONEJJQU5CcGFETUFEWUM3TjRCSUFOQkFqWUM4TjRCSUFOQmxRTTdBZlRlQVNBRFFmei96UUEyQXZqZUFTQURRUVkyQXZ6ZUFTQURRUzA3QVlEZkFTQURRYWVnekFBMkFvVGZBU0FEUVFvMkFvamZBU0FEUVpEQUFEc0JqTjhCSUFOQnNhRE1BRFlDa044QklBTkJDallDbE44QklBTkJMVHNCbU44QklBTkJ1NkRNQURZQ25OOEJJQU5CRGpZQ29OOEJJQU5CNWUwRE93R2szd0VnQTBISm9Nd0FOZ0tvM3dFZ0EwRVBOZ0tzM3dFZ0EwR04vZ003QWJEZkFTQURRZGlnekFBMkFyVGZBU0FEUVFzMkFyamZBU0FEUWVQOEF6c0J2TjhCSUFOQjQ2RE1BRFlDd044QklBTkJEallDeE44QklBTkI1dTBET3dISTN3RWdBMEh4b013QU5nTE0zd0VnQTBFSk5nTFEzd0VnQTBHUXdBQTdBZFRmQVNBRFFiMkJ6Z0EyQXRqZkFTQURRUUUyQXR6ZkFTQURRZWtBT3dIZzN3RWdBMEdwaDg0QU5nTGszd0VnQTBFR05nTG8zd0VnQTBIdEFUc0I3TjhCSUFOQitxRE1BRFlDOE44QklBTkJDallDOU44QklBTkJ6d2c3QWZqZkFTQURRWVNoekFBMkF2emZBU0FEUVFnMkFvRGdBU0FEUVljVE93R0U0QUVnQTBHTW9jd0FOZ0tJNEFFZ0EwRUpOZ0tNNEFFZ0EwR240Z0E3QVpEZ0FTQURRWldoekFBMkFwVGdBU0FEUVFZMkFwamdBU0FEUWEwQ093R2M0QUVnQTBHYm9jd0FOZ0tnNEFFZ0EwRUdOZ0trNEFFZ0EwSFFBenNCcU9BQklBTkJvYUhNQURZQ3JPQUJJQU5CQnpZQ3NPQUJJQU5CMk1rQU93RzA0QUVnQTBIMGlNNEFOZ0s0NEFFZ0EwRUxOZ0s4NEFFZ0EwSHVBVHNCd09BQklBTkJxS0hNQURZQ3hPQUJJQU5CQ1RZQ3lPQUJJQU5CMWdnN0FjemdBU0FEUWJHaHpBQTJBdERnQVNBRFFRazJBdFRnQVNBRFFZa0VPd0hZNEFFZ0EwRzZvY3dBTmdMYzRBRWdBMEVVTmdMZzRBRWdBMEdQNVFBN0FlVGdBU0FEUWM2aHpBQTJBdWpnQVNBRFFSTTJBdXpnQVNBRFFZdmxBRHNCOE9BQklBTkI0YUhNQURZQzlPQUJJQU5CR0RZQytPQUJJQU5CditRQU93SDg0QUVnQTBINW9jd0FOZ0tBNFFFZ0EwRVVOZ0tFNFFFZ0EwRzY1QUE3QVlqaEFTQURRWTJpekFBMkFvemhBU0FEUVJjMkFwRGhBU0FEUWFYbEFEc0JsT0VCSUFOQnBLTE1BRFlDbU9FQklBTkJFRFlDbk9FQklBTkJodUFBT3dHZzRRRWdBMEcwb3N3QU5nS2s0UUVnQTBFUU5nS280UUVnQTBHQjRBQTdBYXpoQVNBRFFjU2l6QUEyQXJEaEFTQURRUlEyQXJUaEFTQURRZVQrQXpzQnVPRUJJQU5CMktMTUFEWUN2T0VCSUFOQkhqWUN3T0VCSUFOQnQrUUFPd0hFNFFFZ0EwSDJvc3dBTmdMSTRRRWdBMEVZTmdMTTRRRWdBMEdqNVFBN0FkRGhBU0FEUVk2anpBQTJBdFRoQVNBRFFSVTJBdGpoQVNBRFFhL2tBRHNCM09FQklBTkJvNlBNQURZQzRPRUJJQU5CR2pZQzVPRUJJQU5CdmVRQU93SG80UUVnQTBHOW84d0FOZ0xzNFFFZ0EwRWFOZ0x3NFFFZ0EwR2Q1UUE3QWZUaEFTQURRZGVqekFBMkF2amhBU0FEUVJnMkF2emhBU0FEUWNEa0FEc0JnT0lCSUFOQjc2UE1BRFlDaE9JQklBTkJHallDaU9JQklBTkJsdVVBT3dHTTRnRWdBMEdKcE13QU5nS1E0Z0VnQTBFWk5nS1U0Z0VnQTBHMjVBQTdBWmppQVNBRFFhS2t6QUEyQXB6aUFTQURRUlEyQXFEaUFTQURRYXZrQURzQnBPSUJJQU5CdHFUTUFEWUNxT0lCSUFOQkZEWUNyT0lCSUFOQnN1UUFPd0d3NGdFZ0EwSEtwTXdBTmdLMDRnRWdBMEVWTmdLNDRnRWdBMEdrNVFBN0FiemlBU0FEUWQra3pBQTJBc0RpQVNBRFFSZzJBc1RpQVNBRFFZWGdBRHNCeU9JQklBTkI5NlRNQURZQ3pPSUJJQU5CRmpZQzBPSUJJQU5CbU9VQU93SFU0Z0VnQTBHTnBjd0FOZ0xZNGdFZ0EwRVZOZ0xjNGdFZ0EwRzQ1QUE3QWVEaUFTQURRYUtsekFBMkF1VGlBU0FEUVJVMkF1amlBU0FEUWFmbEFEc0I3T0lCSUFOQnQ2WE1BRFlDOE9JQklBTkJGRFlDOU9JQklBTkJwdVVBT3dINDRnRWdBMEhMcGN3QU5nTDg0Z0VnQTBFWk5nS0E0d0VnQTBHcDVRQTdBWVRqQVNBRFFlU2x6QUEyQW9qakFTQURRUlUyQW96akFTQURRYTdrQURzQmtPTUJJQU5CK2FYTUFEWUNsT01CSUFOQkZEWUNtT01CSUFOQnF1UUFPd0djNHdFZ0EwR05wc3dBTmdLZzR3RWdBMEVVTmdLazR3RWdBMEcwNUFBN0FhampBU0FEUWFHbXpBQTJBcXpqQVNBRFFSRTJBckRqQVNBRFFZTGdBRHNCdE9NQklBTkJzcWJNQURZQ3VPTUJJQU5CRmpZQ3ZPTUJJQU5CbnVVQU93SEE0d0VnQTBISXBzd0FOZ0xFNHdFZ0EwRVZOZ0xJNHdFZ0EwSEQ1QUE3QWN6akFTQURRZDJtekFBMkF0RGpBU0FEUVJrMkF0VGpBU0FEUWJua0FEc0IyT01CSUFOQjlxYk1BRFlDM09NQklBTkJHRFlDNE9NQklBTkJ2dVFBT3dIazR3RWdBMEdPcDh3QU5nTG80d0VnQTBFV05nTHM0d0VnQTBHbzVRQTdBZkRqQVNBRFFhU256QUEyQXZUakFTQURRUmMyQXZqakFTQURRWm5sQURzQi9PTUJJQU5CdTZmTUFEWUNnT1FCSUFOQkZEWUNoT1FCSUFOQnd1UUFPd0dJNUFFZ0EwSFBwOHdBTmdLTTVBRWdBMEVYTmdLUTVBRWdBMEd6NUFBN0FaVGtBU0FEUWVhbnpBQTJBcGprQVNBRFFSQTJBcHprQVNBRFFZRGdBRHNCb09RQklBTkI5cWZNQURZQ3BPUUJJQU5CRnpZQ3FPUUJJQU5CdGVRQU93R3M1QUVnQTBHTnFNd0FOZ0t3NUFFZ0EwRVZOZ0swNUFFZ0EwR3g1QUE3QWJqa0FTQURRYUtvekFBMkFyemtBU0FEUVJVMkFzRGtBU0FEUWJ2a0FEc0J4T1FCSUFOQnQ2ak1BRFlDeU9RQklBTkJFellDek9RQklBTkJzT1FBT3dIUTVBRWdBMEhLcU13QU5nTFU1QUVnQTBFWk5nTFk1QUVnQTBHODVBQTdBZHprQVNBRFFlT296QUEyQXVEa0FTQURRUlUyQXVUa0FTQURRYXprQURzQjZPUUJJQU5CK0tqTUFEWUM3T1FCSUFOQkZEWUM4T1FCSUFOQnJlUUFPd0gwNUFFZ0EwR01xY3dBTmdMNDVBRWdBMEVQTmdMODVBRWdBMEdINEFBN0FZRGxBU0FEUVp1cHpBQTJBb1RsQVNBRFFSUTJBb2psQVNBRFFZN2xBRHNCak9VQklBTkJyNm5NQURZQ2tPVUJJQU5CRXpZQ2xPVUJJQU5CaXVVQU93R1k1UUVnQTBIQ3Fjd0FOZ0tjNVFFZ0EwRVROZ0tnNVFFZ0EwR1U1UUE3QWFUbEFTQURRZFdwekFBMkFxamxBU0FEUVJJMkFxemxBU0FEUVpEbEFEc0JzT1VCSUFOQjU2bk1BRFlDdE9VQklBTkJGRFlDdU9VQklBTkJqT1VBT3dHODVRRWdBMEg3cWN3QU5nTEE1UUVnQTBFVE5nTEU1UUVnQTBHTjVRQTdBY2psQVNBRFFZNnF6QUEyQXN6bEFTQURRUVUyQXREbEFTQURRWWNTT3dIVTVRRWdBMEdCaTg0QU5nTFk1UUVnQTBFSk5nTGM1UUVnQTBIdkFUc0I0T1VCSUFOQms2ck1BRFlDNU9VQklBTkJEallDNk9VQklBTkJyenc3QWV6bEFTQURRYUdxekFBMkF2RGxBU0FEUVJFMkF2VGxBU0FEUWVVSk93SDQ1UUVnQTBHeXFzd0FOZ0w4NVFFZ0EwRUpOZ0tBNWdFZ0EwSExQVHNCaE9ZQklBTkJ1NnJNQURZQ2lPWUJJQU5CRHpZQ2pPWUJJQU5CMXdrN0FaRG1BU0FEUWNxcXpBQTJBcFRtQVNBRFFRbzJBcGptQVNBRFFiVUlPd0djNWdFZ0EwSFVxc3dBTmdLZzVnRWdBMEVTTmdLazVnRWdBMEgxNUFBN0Fham1BU0FEUWVhcXpBQTJBcXptQVNBRFFSRTJBckRtQVNBRFFaWGtBRHNCdE9ZQklBTkI5NnJNQURZQ3VPWUJJQU5CRVRZQ3ZPWUJJQU5CNStRQU93SEE1Z0VnQTBHSXE4d0FOZ0xFNWdFZ0EwRUxOZ0xJNWdFZ0EwSEg0Z0E3QWN6bUFTQURRWk9yekFBMkF0RG1BU0FEUVJBMkF0VG1BU0FEUVlma0FEc0IyT1lCSUFOQnU0dk9BRFlDM09ZQklBTkJCallDNE9ZQklBTkI3QUU3QWVUbUFTQURRYU9yekFBMkF1am1BU0FEUVFrMkF1em1BU0FEUVljVk93SHc1Z0VnQTBHc3E4d0FOZ0wwNWdFZ0EwRUpOZ0w0NWdFZ0EwR0hGRHNCL09ZQklBTkJ0YXZNQURZQ2dPY0JJQU5CQ1RZQ2hPY0JJQU5CeE9BQU93R0k1d0VnQTBHK3E4d0FOZ0tNNXdFZ0EwRUtOZ0tRNXdFZ0EwSEpQVHNCbE9jQklBTkJ5S3ZNQURZQ21PY0JJQU5CQ1RZQ25PY0JJQU5CaUJNN0FhRG5BU0FEUWRHcnpBQTJBcVRuQVNBRFFRbzJBcWpuQVNBRFFiZ0lPd0dzNXdFZ0EwSGJxOHdBTmdLdzV3RWdBMEVHTmdLMDV3RWdBMEdJRWpzQnVPY0JJQU5CNGF2TUFEWUN2T2NCSUFOQkNqWUN3T2NCSUFOQmlCVTdBY1RuQVNBRFFldXJ6QUEyQXNqbkFTQURRUW8yQXN6bkFTQURRWWdVT3dIUTV3RWdBMEgxcTh3QU5nTFU1d0VnQTBFUE5nTFk1d0VnQTBIQUZEc0IzT2NCSUFOQmhLek1BRFlDNE9jQklBTkJEallDNU9jQklBTkJpd1E3QWVqbkFTQURRWktzekFBMkF1em5BU0FEUVE4MkF2RG5BU0FEUWJrSU93SDA1d0VnQTBHaHJNd0FOZ0w0NXdFZ0EwRVNOZ0w4NXdFZ0EwSEFFenNCZ09nQklBTkJzNnpNQURZQ2hPZ0JJQU5CRHpZQ2lPZ0JJQU5Cd0JJN0FZem9BU0FEUWNLc3pBQTJBcERvQVNBRFFSTTJBcFRvQVNBRFFjQVZPd0dZNkFFZ0EwSFZyTXdBTmdLYzZBRWdBMEVDTmdLZzZBRWdBMEd6QWpzQnBPZ0JJQU5CMTZ6TUFEWUNxT2dCSUFOQkNUWUNyT2dCSUFOQnBPRUFPd0d3NkFFZ0EwSGdyTXdBTmdLMDZBRWdBMEVTTmdLNDZBRWdBMEh5L2dNN0Fiem9BU0FEUWZLc3pBQTJBc0RvQVNBRFFRYzJBc1RvQVNBRFFlUGlBRHNCeU9nQklBTkIrYXpNQURZQ3pPZ0JJQU5CQkRZQzBPZ0JJQU5CM0FVN0FkVG9BU0FEUWYyc3pBQTJBdGpvQVNBRFFRbzJBdHpvQVNBRFFhd0xPd0hnNkFFZ0EwR2FqODRBTmdMazZBRWdBMEVITmdMbzZBRWdBMEdyQWpzQjdPZ0JJQU5CaDYzTUFEWUM4T2dCSUFOQkR6WUM5T2dCSUFOQjR3azdBZmpvQVNBRFFaYXR6QUEyQXZ6b0FTQURRUmsyQW9EcEFTQURRZFBFQURzQmhPa0JJQU5CcjYzTUFEWUNpT2tCSUFOQkRqWUNqT2tCSUFOQnZ4UTdBWkRwQVNBRFFiMnR6QUEyQXBUcEFTQURRUW8yQXBqcEFTQURRY24rQXpzQm5Pa0JJQU5CeDYzTUFEWUNvT2tCSUFOQkNUWUNwT2tCSUFOQmhzUUFPd0dvNlFFZ0EwR094TThBTmdLczZRRWdBMEVJTmdLdzZRRWdBMEdleEFBN0FiVHBBU0FEUWRDdHpBQTJBcmpwQVNBRFFRczJBcnpwQVNBRFFlc0tPd0hBNlFFZ0EwSGJyY3dBTmdMRTZRRWdBMEVOTmdMSTZRRWdBMEdXeEFBN0FjenBBU0FEUWYvSXp3QTJBdERwQVNBRFFRZzJBdFRwQVNBRFFhdkVBRHNCMk9rQklBTkI2SzNNQURZQzNPa0JJQU5CRGpZQzRPa0JJQU5Cb2NZQU93SGs2UUVnQTBHYnljOEFOZ0xvNlFFZ0EwRUtOZ0xzNlFFZ0EwR2h4Z0E3QWZEcEFTQURRZmF0ekFBMkF2VHBBU0FEUVE4MkF2anBBU0FEUWF2RUFEc0IvT2tCSUFOQmtjblBBRFlDZ09vQklBTkJDallDaE9vQklBTkI5ZkVET3dHSTZnRWdBMEdGcnN3QU5nS002Z0VnQTBFTU5nS1E2Z0VnQTBHcnhBQTdBWlRxQVNBRFFaR3V6QUEyQXBqcUFTQURRUXMyQXB6cUFTQURRYURHQURzQm9Pb0JJQU5CaDhuUEFEWUNwT29CSUFOQkNqWUNxT29CSUFOQm9NWUFPd0dzNmdFZ0EwR2Nyc3dBTmdLdzZnRWdBMEVJTmdLMDZnRWdBMEc2eFFBN0FianFBU0FEUWFTdXpBQTJBcnpxQVNBRFFRczJBc0RxQVNBRFFiM0FBRHNCeE9vQklBTkJyNjdNQURZQ3lPb0JJQU5CRHpZQ3pPb0JJQU5CaTdBRE93SFE2Z0VnQTBIa3hjOEFOZ0xVNmdFZ0EwRU1OZ0xZNmdFZ0EwR3B4QUE3QWR6cUFTQURRYjZ1ekFBMkF1RHFBU0FEUVE4MkF1VHFBU0FEUWRMRkFEc0I2T29CSUFOQnphN01BRFlDN09vQklBTkJFellDOE9vQklBTkJ3c1VBT3dIMDZnRWdBMEhncnN3QU5nTDQ2Z0VnQTBFT05nTDg2Z0VnQTBHVHhRQTdBWURyQVNBRFFlNnV6QUEyQW9UckFTQURRUkEyQW9qckFTQURRY0xGQURzQmpPc0JJQU5CL3E3TUFEWUNrT3NCSUFOQkNqWUNsT3NCSUFOQmhlWUFPd0dZNndFZ0EwR0lyOHdBTmdLYzZ3RWdBMEVKTmdLZzZ3RWdBMEhZeXdBN0FhVHJBU0FEUVpHdnpBQTJBcWpyQVNBRFFRazJBcXpyQVNBRFFkbkxBRHNCc09zQklBTkJtcS9NQURZQ3RPc0JJQU5CRERZQ3VPc0JJQU5CdTh3QU93Rzg2d0VnQTBHbXI4d0FOZ0xBNndFZ0EwRUtOZ0xFNndFZ0EwSFJDRHNCeU9zQklBTkI0WXJPQURZQ3pPc0JJQU5CQnpZQzBPc0JJQU5CcndJN0FkVHJBU0FEUWJERHp3QTJBdGpyQVNBRFFRUTJBdHpyQVNBRFFia0hPd0hnNndFZ0EwR3dyOHdBTmdMazZ3RWdBMEVNTmdMbzZ3RWdBMEhLQnpzQjdPc0JJQU5CdksvTUFEWUM4T3NCSUFOQkVUWUM5T3NCSUFOQmtBYzdBZmpyQVNBRFFjMnZ6QUEyQXZ6ckFTQURRUWsyQW9Ec0FTQURRZWtFT3dHRTdBRWdBMEhXcjh3QU5nS0k3QUVnQTBFSk5nS003QUVnQTBHdkJ6c0JrT3dCSUFOQjM2L01BRFlDbE93QklBTkJCallDbU93QklBTkJwTWtBT3dHYzdBRWdBMEhscjh3QU5nS2c3QUVnQTBFTE5nS2s3QUVnQTBIeUZEc0JxT3dCSUFOQjhLL01BRFlDck93QklBTkJEallDc093QklBTkJ3K0FBT3dHMDdBRWdBMEgrcjh3QU5nSzQ3QUVnQTBFT05nSzg3QUVnQTBHajRRQTdBY0RzQVNBRFFZeXd6QUEyQXNUc0FTQURRUmMyQXNqc0FTQURRZWorQXpzQnpPd0JJQU5CbzdETUFEWUMwT3dCSUFOQkRUWUMxT3dCSUFOQitoTTdBZGpzQVNBRFFiQ3d6QUEyQXR6c0FTQURRUWMyQXVEc0FTQURRZWdFT3dIazdBRWdBMEczc013QU5nTG83QUVnQTBFSk5nTHM3QUVnQTBIdDdRTTdBZkRzQVNBRFFjQ3d6QUEyQXZUc0FTQURRUkUyQXZqc0FTQURRWjNoQURzQi9Pd0JJQU5CMGJETUFEWUNnTzBCSUFOQkVUWUNoTzBCSUFOQi9lRUFPd0dJN1FFZ0EwSGlzTXdBTmdLTTdRRWdBMEVHTmdLUTdRRWdBMEdwQWpzQmxPMEJJQU5CNkxETUFEWUNtTzBCSUFOQkN6WUNuTzBCSUFOQnJUdzdBYUR0QVNBRFFmT3d6QUEyQXFUdEFTQURRUW8yQXFqdEFTQURRYW5pQURzQnJPMEJJQU5CL2JETUFEWUNzTzBCSUFOQkNqWUN0TzBCSUFOQnpnZzdBYmp0QVNBRFFZZXh6QUEyQXJ6dEFTQURRUkUyQXNEdEFTQURRYjhUT3dIRTdRRWdBMEdZc2N3QU5nTEk3UUVnQTBFT05nTE03UUVnQTBHL0Vqc0IwTzBCSUFOQnBySE1BRFlDMU8wQklBTkJFallDMk8wQklBTkJ2eFU3QWR6dEFTQURRYml4ekFBMkF1RHRBU0FEUVE4MkF1VHRBU0FEUWZVSU93SG83UUVnQTBISHNjd0FOZ0xzN1FFZ0EwRVhOZ0x3N1FFZ0EwSDNDRHNCOU8wQklBTkJ2b0hPQURZQytPMEJJQU5CQVRZQy9PMEJJQU5CNmdBN0FZRHVBU0FEUWQ2eHpBQTJBb1R1QVNBRFFRbzJBb2p1QVNBRFFmRUtPd0dNN2dFZ0EwSG9zY3dBTmdLUTdnRWdBMEVKTmdLVTdnRWdBMEdjRXpzQm1PNEJJQU5COGJITUFEWUNuTzRCSUFOQkJqWUNvTzRCSUFOQm5CSTdBYVR1QVNBRFFmZXh6QUEyQXFqdUFTQURRUW8yQXF6dUFTQURRWndWT3dHdzdnRWdBMEdCc3N3QU5nSzA3Z0VnQTBFS05nSzQ3Z0VnQTBHY0ZEc0J2TzRCSUFOQmk3TE1BRFlDd080QklBTkJDVFlDeE80QklBTkJrT0lBT3dISTdnRWdBMEdVc3N3QU5nTE03Z0VnQTBFR05nTFE3Z0VnQTBId0F6c0IxTzRCSUFOQm1yTE1BRFlDMk80QklBTkJCellDM080QklBTkIyY2tBT3dIZzdnRWdBMEdoc3N3QU5nTGs3Z0VnQTBFTE5nTG83Z0VnQTBHMUFqc0I3TzRCSUFOQnJMTE1BRFlDOE80QklBTkJERFlDOU80QklBTkJuUVU3QWZqdUFTQURRYml5ekFBMkF2enVBU0FEUVE0MkFvRHZBU0FEUWQ4RU93R0U3d0VnQTBIR3Nzd0FOZ0tJN3dFZ0EwRUtOZ0tNN3dFZ0EwSFlDRHNCa084QklBTkIwTExNQURZQ2xPOEJJQU5CQ2pZQ21POEJJQU5CckF3N0FaenZBU0FEUWRxeXpBQTJBcUR2QVNBRFFRODJBcVR2QVNBRFFaNzlBenNCcU84QklBTkI2YkxNQURZQ3JPOEJJQU5CRVRZQ3NPOEJJQU5Cbi8wRE93RzA3d0VnQTBINnNzd0FOZ0s0N3dFZ0EwRVFOZ0s4N3dFZ0EwR2cvUU03QWNEdkFTQURRWXF6ekFBMkFzVHZBU0FEUVFrMkFzanZBU0FEUVpnTk93SE03d0VnQTBHVHM4d0FOZ0xRN3dFZ0EwRU9OZ0xVN3dFZ0EwR0w5d003QWRqdkFTQURRYUd6ekFBMkF0enZBU0FEUVFvMkF1RHZBU0FEUVowVE93SGs3d0VnQTBHcnM4d0FOZ0xvN3dFZ0EwRUhOZ0xzN3dFZ0EwR2RFanNCOE84QklBTkJzclBNQURZQzlPOEJJQU5CQ3pZQytPOEJJQU5CblJVN0FmenZBU0FEUWIyenpBQTJBb0R3QVNBRFFRczJBb1R3QVNBRFFaMFVPd0dJOEFFZ0EwSElzOHdBTmdLTThBRWdBMEVNTmdLUThBRWdBMEg3Q2pzQmxQQUJJQU5CMUxQTUFEWUNtUEFCSUFOQkF6WUNuUEFCSUFOQmhPQUFPd0dnOEFFZ0EwSFhzOHdBTmdLazhBRWdBMEVLTmdLbzhBRWdBMEhLL2dNN0FhendBU0FEUWVHenpBQTJBckR3QVNBRFFRWTJBclR3QVNBRFFhWEpBRHNCdVBBQklBTkI1N1BNQURZQ3ZQQUJJQU5CQ1RZQ3dQQUJJQU5Cc2dVN0FjVHdBU0FEUWIrQnpnQTJBc2p3QVNBRFFRRTJBc3p3QVNBRFFlc0FPd0hROEFFZ0EwSHdzOHdBTmdMVThBRWdBMEVSTmdMWThBRWdBMEdoQ1RzQjNQQUJJQU5CZ2JUTUFEWUM0UEFCSUFOQkNUWUM1UEFCSUFOQmxSTTdBZWp3QVNBRFFZcTB6QUEyQXV6d0FTQURRUVkyQXZEd0FTQURRYkU4T3dIMDhBRWdBMEdRdE13QU5nTDQ4QUVnQTBFS05nTDg4QUVnQTBHNkNEc0JnUEVCSUFOQm1yVE1BRFlDaFBFQklBTkJFellDaVBFQklBTkJtd2s3QVl6eEFTQURRYTIwekFBMkFwRHhBU0FEUVFZMkFwVHhBU0FEUVpVU093R1k4UUVnQTBHenRNd0FOZ0tjOFFFZ0EwRUROZ0tnOFFFZ0EwSGJDenNCcFBFQklBTkJ0clRNQURZQ3FQRUJJQU5CQ1RZQ3JQRUJJQU5Cd3d3N0FiRHhBU0FEUWIrMHpBQTJBclR4QVNBRFFRazJBcmp4QVNBRFFidjJBenNCdlBFQklBTkJ5TFRNQURZQ3dQRUJJQU5CRHpZQ3hQRUJJQU5CdS9ZRE93SEk4UUVnQTBIWHRNd0FOZ0xNOFFFZ0EwRU9OZ0xROFFFZ0EwSGEvUU03QWRUeEFTQURRZVcwekFBMkF0anhBU0FEUVFrMkF0enhBU0FEUWRzTE93SGc4UUVnQTBIdXRNd0FOZ0xrOFFFZ0EwRVFOZ0xvOFFFZ0EwSGIvUU03QWV6eEFTQURRZjYwekFBMkF2RHhBU0FEUVE4MkF2VHhBU0FEUWR6OUF6c0IrUEVCSUFOQmpiWE1BRFlDL1BFQklBTkJEVFlDZ1BJQklBTkJ6ZllET3dHRThnRWdBMEdhdGN3QU5nS0k4Z0VnQTBFS05nS004Z0VnQTBHVkZUc0JrUElCSUFOQnBMWE1BRFlDbFBJQklBTkJDallDbVBJQklBTkJsUlE3QVp6eUFTQURRYTYxekFBMkFxRHlBU0FEUVFvMkFxVHlBU0FEUWN2Z0FEc0JxUElCSUFOQnVMWE1BRFlDclBJQklBTkJEallDc1BJQklBTkJ4QWs3QWJUeUFTQURRY2ExekFBMkFyanlBU0FEUVFvMkFyenlBU0FEUWF2aEFEc0J3UElCSUFOQjBMWE1BRFlDeFBJQklBTkJFellDeVBJQklBTkI5djRET3dITThnRWdBMEc0dzg4QU5nTFE4Z0VnQTBFRk5nTFU4Z0VnQTBHNkJ6c0IyUElCSUFOQjQ3WE1BRFlDM1BJQklBTkJFRFlDNFBJQklBTkI4QWM3QWVUeUFTQURRZk8xekFBMkF1anlBU0FEUVJNMkF1enlBU0FEUWZIaUFEc0I4UElCSUFOQmhyYk1BRFlDOVBJQklBTkJGVFlDK1BJQklBTkJoT01BT3dIODhnRWdBMEdidHN3QU5nS0E4d0VnQTBFVE5nS0U4d0VnQTBINDRnQTdBWWp6QVNBRFFhNjJ6QUEyQW96ekFTQURRUmcyQXBEekFTQURRZm5pQURzQmxQTUJJQU5CeHJiTUFEWUNtUE1CSUFOQkRUWUNuUE1CSUFOQmplWUFPd0dnOHdFZ0EwSFR0c3dBTmdLazh3RWdBMEVSTmdLbzh3RWdBMEhBRERzQnJQTUJJQU5CNUxiTUFEWUNzUE1CSUFOQkhqWUN0UE1CSUFOQndBdzdBYmp6QVNBRFFZSzN6QUEyQXJ6ekFTQURRUTgyQXNEekFTQURRZlhoQURzQnhQTUJJQU5Ca2JmTUFEWUN5UE1CSUFOQkNEWUN6UE1CSUFOQmhPY0FPd0hROHdFZ0EwR1p0OHdBTmdMVTh3RWdBMEVMTmdMWTh3RWdBMEhRRERzQjNQTUJJQU5CcExmTUFEWUM0UE1CSUFOQkRqWUM1UE1CSUFOQnpRdzdBZWp6QVNBRFFiSzN6QUEyQXV6ekFTQURRUkEyQXZEekFTQURRWjhKT3dIMDh3RWdBMEhDdDh3QU5nTDQ4d0VnQTBFY05nTDg4d0VnQTBIdy9nTTdBWUQwQVNBRFFkNjN6QUEyQW9UMEFTQURRUmcyQW9qMEFTQURRWjBKT3dHTTlBRWdBMEgydDh3QU5nS1E5QUVnQTBFSk5nS1U5QUVnQTBHTzRnQTdBWmowQVNBRFFmKzN6QUEyQXB6MEFTQURRUW8yQXFEMEFTQURRWW5uQURzQnBQUUJJQU5CaWJqTUFEWUNxUFFCSUFOQkJqWUNyUFFCSUFOQjZRTTdBYkQwQVNBRFFZKzR6QUEyQXJUMEFTQURRUWcyQXJqMEFTQURRYmNDT3dHODlBRWdBMEdYdU13QU5nTEE5QUVnQTBFSE5nTEU5QUVnQTBIYXlRQTdBY2owQVNBRFFaeU96Z0EyQXN6MEFTQURRUXcyQXREMEFTQURRYmNDT3dIVTlBRWdBMEdldU13QU5nTFk5QUVnQTBFSk5nTGM5QUVnQTBHelBEc0I0UFFCSUFOQnA3ak1BRFlDNVBRQklBTkJDellDNlBRQklBTkJoQXM3QWV6MEFTQURRYks0ekFBMkF2RDBBU0FEUVFvMkF2VDBBU0FEUWRIZ0FEc0IrUFFCSUFOQnZMak1BRFlDL1BRQklBTkJDallDZ1BVQklBTkJzZUVBT3dHRTlRRWdBMEhHdU13QU5nS0k5UUVnQTBFVE5nS005UUVnQTBINS9nTTdBWkQxQVNBRFFkbTR6QUEyQXBUMUFTQURRUXMyQXBqMUFTQURRZThLT3dHYzlRRWdBMEhrdU13QU5nS2c5UUVnQTBFUE5nS2s5UUVnQTBIMjRRQTdBYWoxQVNBRFFmTzR6QUEyQXF6MUFTQURRUXcyQXJEMUFTQURRYmdDT3dHMDlRRWdBMEgvdU13QU5nSzQ5UUVnQTBFS05nSzg5UUVnQTBHV0V6c0J3UFVCSUFOQmlibk1BRFlDeFBVQklBTkJDellDeVBVQklBTkJ4UWc3QWN6MUFTQURRWlM1ekFBMkF0RDFBU0FEUVFjMkF0VDFBU0FEUVpZU093SFk5UUVnQTBHYnVjd0FOZ0xjOVFFZ0EwRUxOZ0xnOVFFZ0EwR1dGVHNCNVBVQklBTkJwcm5NQURZQzZQVUJJQU5CQ3pZQzdQVUJJQU5CbGhRN0FmRDFBU0FEUWJHNXpBQTJBdlQxQVNBRFFRbzJBdmoxQVNBRFFhNE1Pd0g4OVFFZ0EwRzd1Y3dBTmdLQTlnRWdBMEVQTmdLRTlnRWdBMEdtL1FNN0FZajJBU0FEUWNxNXpBQTJBb3oyQVNBRFFSRTJBcEQyQVNBRFFhZjlBenNCbFBZQklBTkIyN25NQURZQ21QWUJJQU5CRURZQ25QWUJJQU5CcVAwRE93R2c5Z0VnQTBIcnVjd0FOZ0trOWdFZ0EwRUtOZ0tvOWdFZ0EwSG5CenNCclBZQklBTkI5Ym5NQURZQ3NQWUJJQU5CQ0RZQ3RQWUJJQU5CMlJJN0FiajJBU0FEUWYyNXpBQTJBcnoyQVNBRFFRdzJBc0QyQVNBRFFka1VPd0hFOWdFZ0EwR0p1c3dBTmdMSTlnRWdBMEVVTmdMTTlnRWdBMEg0NUFBN0FkRDJBU0FEUVoyNnpBQTJBdFQyQVNBRFFSTTJBdGoyQVNBRFFaamtBRHNCM1BZQklBTkJzTHJNQURZQzRQWUJJQU5CRXpZQzVQWUJJQU5CNnVRQU93SG85Z0VnQTBIRHVzd0FOZ0xzOWdFZ0EwRU5OZ0x3OWdFZ0EwSEw0Z0E3QWZUMkFTQURRZEM2ekFBMkF2ajJBU0FEUVJJMkF2ejJBU0FEUVlya0FEc0JnUGNCSUFOQjRyck1BRFlDaFBjQklBTkJDellDaVBjQklBTkJnaHc3QVl6M0FTQURRZTI2ekFBMkFwRDNBU0FEUVFzMkFwVDNBU0FEUVlVY093R1k5d0VnQTBINHVzd0FOZ0tjOXdFZ0EwRU1OZ0tnOXdFZ0EwR0RIRHNCcFBjQklBTkJoTHZNQURZQ3FQY0JJQU5CRERZQ3JQY0JJQU5CaEJ3N0FiRDNBU0FEUVpDN3pBQTJBclQzQVNBRFFRbzJBcmozQVNBRFFkc2NPd0c4OXdFZ0EwR2F1OHdBTmdMQTl3RWdBMEVGTmdMRTl3RWdBMEdaQXpzQnlQY0JJQU5Cbjd2TUFEWUN6UGNCSUFOQkRqWUMwUGNCSUFOQmhodzdBZFQzQVNBRFFhMjd6QUEyQXRqM0FTQURRUWsyQXR6M0FTQURRWkhuQURzQjRQY0JJQU5CdHJ2TUFEWUM1UGNCSUFOQkNqWUM2UGNCSUFOQnplQUFPd0hzOXdFZ0EwSEF1OHdBTmdMdzl3RWdBMEVLTmdMMDl3RWdBMEd0NFFBN0FmajNBU0FEUWNxN3pBQTJBdnozQVNBRFFSTTJBb0Q0QVNBRFFmZitBenNCaFBnQklBTkIzYnZNQURZQ2lQZ0JJQU5CRURZQ2pQZ0JJQU5CbGVZQU93R1ErQUVnQTBIdHU4d0FOZ0tVK0FFZ0EwRVJOZ0tZK0FFZ0EwR1c1Z0E3QVp6NEFTQURRZjY3ekFBMkFxRDRBU0FEUVFvMkFxVDRBU0FEUVpUbUFEc0JxUGdCSUFOQmlMek1BRFlDclBnQklBTkJFellDc1BnQklBTkI3dVFBT3dHMCtBRWdBMEdidk13QU5nSzQrQUVnQTBFU05nSzgrQUVnQTBHTzVBQTdBY0Q0QVNBRFFhMjh6QUEyQXNUNEFTQURRUkkyQXNqNEFTQURRZURrQURzQnpQZ0JJQU5Cdjd6TUFEWUMwUGdCSUFOQkREWUMxUGdCSUFOQnNlSUFPd0hZK0FFZ0EwSEx2TXdBTmdMYytBRWdBMEVSTmdMZytBRWdBMEdBNUFBN0FlVDRBU0FEUWR5OHpBQTJBdWo0QVNBRFFSQTJBdXo0QVNBRFFiUGlBRHNCOFBnQklBTkI3THpNQURZQzlQZ0JJQU5CQ3pZQytQZ0JJQU5CM0FnN0FmejRBU0FEUWZlOHpBQTJBb0Q1QVNBRFFRbzJBb1Q1QVNBRFFiVThPd0dJK1FFZ0EwR0J2Y3dBTmdLTStRRWdBMEVJTmdLUStRRWdBMEdZNXdBN0FaVDVBU0FEUVltOXpBQTJBcGo1QVNBRFFRMDJBcHo1QVNBRFFhYm5BRHNCb1BrQklBTkJscjNNQURZQ3BQa0JJQU5CQ2pZQ3FQa0JJQU5CeS80RE93R3MrUUVnQTBHZ3Zjd0FOZ0t3K1FFZ0EwRVBOZ0swK1FFZ0EwR2k1d0E3QWJqNUFTQURRYSs5ekFBMkFyejVBU0FEUVFvMkFzRDVBU0FEUWRQZ0FEc0J4UGtCSUFOQnViM01BRFlDeVBrQklBTkJDallDelBrQklBTkJ3T2NBT3dIUStRRWdBMEhEdmN3QU5nTFUrUUVnQTBFSk5nTFkrUUVnQTBHQkhEc0IzUGtCSUFOQnpMM01BRFlDNFBrQklBTkJDallDNVBrQklBTkJzK0VBT3dIbytRRWdBMEhXdmN3QU5nTHMrUUVnQTBFVE5nTHcrUUVnQTBINi9nTTdBZlQ1QVNBRFFlbTl6QUEyQXZqNUFTQURRUXMyQXZ6NUFTQURRWjdtQURzQmdQb0JJQU5COUwzTUFEWUNoUG9CSUFOQkRUWUNpUG9CSUFOQmdRazdBWXo2QVNBRFFZRyt6QUEyQXBENkFTQURRUlEyQXBUNkFTQURRZi9rQURzQm1Qb0JJQU5CbGI3TUFEWUNuUG9CSUFOQkNqWUNvUG9CSUFOQnd3WTdBYVQ2QVNBRFFaKyt6QUEyQXFqNkFTQURRUVkyQXF6NkFTQURRYWJKQURzQnNQb0JJQU5CcGI3TUFEWUN0UG9CSUFOQkNUWUN1UG9CSUFOQnF1Y0FPd0c4K2dFZ0EwR3V2c3dBTmdMQStnRWdBMEVMTmdMRStnRWdBMEh2Q0RzQnlQb0JJQU5CdWI3TUFEWUN6UG9CSUFOQkNEWUMwUG9CSUFOQnorY0FPd0hVK2dFZ0EwSEJ2c3dBTmdMWStnRWdBMEVITmdMYytnRWdBMEdlQlRzQjRQb0JJQU5CeUw3TUFEWUM1UG9CSUFOQkNqWUM2UG9CSUFOQnorQUFPd0hzK2dFZ0EwSFN2c3dBTmdMdytnRWdBMEVLTmdMMCtnRWdBMEd2NFFBN0FmajZBU0FEUWR5K3pBQTJBdno2QVNBRFFSTTJBb0Q3QVNBRFFmaitBenNCaFBzQklBTkI3NzdNQURZQ2lQc0JJQU5CQ0RZQ2pQc0JJQU5CdU9jQU93R1Erd0VnQTBIM3Zzd0FOZ0tVK3dFZ0EwRUlOZ0tZK3dFZ0EwRys1d0E3QVp6N0FTQURRY0NCemdBMkFxRDdBU0FEUVFFMkFxVDdBU0FEUWV3QU93R28rd0VnQTBIL3Zzd0FOZ0tzK3dFZ0EwRUpOZ0t3K3dFZ0EwR3lFenNCdFBzQklBTkI3WWJPQURZQ3VQc0JJQU5CQmpZQ3ZQc0JJQU5CdWdJN0FjRDdBU0FEUVlpL3pBQTJBc1Q3QVNBRFFRWTJBc2o3QVNBRFFiSVNPd0hNK3dFZ0EwR092OHdBTmdMUSt3RWdBMEVLTmdMVSt3RWdBMEd5RlRzQjJQc0JJQU5CbUwvTUFEWUMzUHNCSUFOQkNqWUM0UHNCSUFOQnNoUTdBZVQ3QVNBRFFhSy96QUEyQXVqN0FTQURRUTgyQXV6N0FTQURRY1VjT3dIdyt3RWdBMEd4djh3QU5nTDArd0VnQTBFU05nTDQrd0VnQTBIOC9RTTdBZno3QVNBRFFjTy96QUEyQW9EOEFTQURRUncyQW9UOEFTQURRZmo5QXpzQmlQd0JJQU5CMzcvTUFEWUNqUHdCSUFOQkh6WUNrUHdCSUFOQjkvMERPd0dVL0FFZ0EwSCt2OHdBTmdLWS9BRWdBMEVjTmdLYy9BRWdBMEg2L1FNN0FhRDhBU0FEUVpyQXpBQTJBcVQ4QVNBRFFSODJBcWo4QVNBRFFmbjlBenNCclB3QklBTkJ1Y0RNQURZQ3NQd0JJQU5CRlRZQ3RQd0JJQU5CKy8wRE93RzQvQUVnQTBIT3dNd0FOZ0s4L0FFZ0EwRWNOZ0xBL0FFZ0EwSDIvUU03QWNUOEFTQURRZXJBekFBMkFzajhBU0FEUVI4MkFzejhBU0FEUWZYOUF6c0IwUHdCSUFOQmljSE1BRFlDMVB3QklBTkJDVFlDMlB3QklBTkJ4QXc3QWR6OEFTQURRYjNEendBMkF1RDhBU0FEUVFZMkF1VDhBU0FEUWJzSE93SG8vQUVnQTBHU3djd0FOZ0xzL0FFZ0EwRU1OZ0x3L0FFZ0EwR2JBenNCOVB3QklBTkJuc0hNQURZQytQd0JJQU5CQlRZQy9Qd0JJQU5CM0FzN0FZRDlBU0FEUWFQQnpBQTJBb1Q5QVNBRFFRczJBb2o5QVNBRFFiejJBenNCalAwQklBTkJyc0hNQURZQ2tQMEJJQU5CRVRZQ2xQMEJJQU5CdlBZRE93R1kvUUVnQTBHL3djd0FOZ0tjL1FFZ0EwRUxOZ0tnL1FFZ0EwSGNDenNCcFAwQklBTkJ5c0hNQURZQ3FQMEJJQU5CQ2pZQ3JQMEJJQU5CM0FzN0FiRDlBU0FEUWRUQnpBQTJBclQ5QVNBRFFSQTJBcmo5QVNBRFFkd0xPd0c4L1FFZ0EwSGt3Y3dBTmdMQS9RRWdBMEVXTmdMRS9RRWdBMEhjQ3pzQnlQMEJJQU5CK3NITUFEWUN6UDBCSUFOQkVEWUMwUDBCSUFOQjNBczdBZFQ5QVNBRFFZckN6QUEyQXRqOUFTQURRUTQyQXR6OUFTQURRZDc5QXpzQjRQMEJJQU5CbU1MTUFEWUM1UDBCSUFOQkV6WUM2UDBCSUFOQnl2a0RPd0hzL1FFZ0EwR3J3c3dBTmdMdy9RRWdBMEVRTmdMMC9RRWdBMEhmL1FNN0FmajlBU0FEUWJ2Q3pBQTJBdno5QVNBRFFSUTJBb0QrQVNBRFFjbjVBenNCaFA0QklBTkJ6OExNQURZQ2lQNEJJQU5CRkRZQ2pQNEJJQU5CeS9rRE93R1EvZ0VnQTBIandzd0FOZ0tVL2dFZ0EwRVhOZ0tZL2dFZ0EwSHkrd003QVp6K0FTQURRZnJDekFBMkFxRCtBU0FEUVE4MkFxVCtBU0FEUWVEOUF6c0JxUDRCSUFOQmljUE1BRFlDclA0QklBTkJGellDc1A0QklBTkJpUHNET3dHMC9nRWdBMEdndzh3QU5nSzQvZ0VnQTBFVU5nSzgvZ0VnQTBITStRTTdBY0QrQVNBRFFiVER6QUEyQXNUK0FTQURRUmcyQXNqK0FTQURRZC85QXpzQnpQNEJJQU5Cek1QTUFEWUMwUDRCSUFOQkdEWUMxUDRCSUFOQjMvMERPd0hZL2dFZ0EwSGt3OHdBTmdMYy9nRWdBMEVMTmdMZy9nRWdBMEh2eXdBN0FlVCtBU0FEUWUvRHpBQTJBdWorQVNBRFFRbzJBdXorQVNBRFFhVEZBRHNCOFA0QklBTkIrY1BNQURZQzlQNEJJQU5CQkRZQytQNEJJQU5CbWdNN0FmeitBU0FEUWYzRHpBQTJBb0QvQVNBRFFRVTJBb1QvQVNBRFFld0VPd0dJL3dFZ0EwR0N4TXdBTmdLTS93RWdBMEVKTmdLUS93RWdBMEdNNGdBN0FaVC9BU0FEUWZDTHpnQTJBcGovQVNBRFFRWTJBcHovQVNBRFFiNENPd0dnL3dFZ0EwR0x4TXdBTmdLay93RWdBMEVJTmdLby93RWdBMEc4QWpzQnJQOEJJQU5CazhUTUFEWUNzUDhCSUFOQkJ6WUN0UDhCSUFOQjI4a0FPd0c0L3dFZ0EwR2F4TXdBTmdLOC93RWdBMEVRTmdMQS93RWdBMEc5UERzQnhQOEJJQU5CcG9yT0FEWUN5UDhCSUFOQkREWUN6UDhCSUFOQnZBSTdBZEQvQVNBRFFhckV6QUEyQXRUL0FTQURRUVEyQXRqL0FTQURRY0FDT3dIYy93RWdBMEd1eE13QU5nTGcvd0VnQTBFS05nTGsvd0VnQTBIQUFqc0I2UDhCSUFOQnVNVE1BRFlDN1A4QklBTkJDVFlDOFA4QklBTkJ0enc3QWZUL0FTQURRY0hFekFBMkF2ai9BU0FEUVE4MkF2ei9BU0FEUWJrOE93R0FnQUlnQTBIUXhNd0FOZ0tFZ0FJZ0EwRVJOZ0tJZ0FJZ0EwR2FCanNCaklBQ0lBTkI0Y1RNQURZQ2tJQUNJQU5CRURZQ2xJQUNJQU5CbUFZN0FaaUFBaUFEUWNPQXpnQTJBcHlBQWlBRFFRUTJBcUNBQWlBRFFUdzdBYVNBQWlBRFFmSEV6QUEyQXFpQUFpQURRUkUyQXF5QUFpQURRWXZWQURzQnNJQUNJQU5CZ3NYTUFEWUN0SUFDSUFOQkREWUN1SUFDSUFOQjVzUUFPd0c4Z0FJZ0EwR094Y3dBTmdMQWdBSWdBMEVITmdMRWdBSWdBMEhXeFFBN0FjaUFBaUFEUWJXTXpnQTJBc3lBQWlBRFFRazJBdENBQWlBRFFlVEVBRHNCMUlBQ0lBTkJsY1hNQURZQzJJQUNJQU5CRURZQzNJQUNJQU5CMnNVQU93SGdnQUlnQTBHbHhjd0FOZ0xrZ0FJZ0EwRVNOZ0xvZ0FJZ0EwSGF4UUE3QWV5QUFpQURRYmZGekFBMkF2Q0FBaUFEUVEwMkF2U0FBaUFEUVp6K0F6c0IrSUFDSUFOQnhNWE1BRFlDL0lBQ0lBTkJDRFlDZ0lFQ0lBTkI2c1FBT3dHRWdRSWdBMEhNeGN3QU5nS0lnUUlnQTBFUE5nS01nUUlnQTBHSjFRQTdBWkNCQWlBRFFkdkZ6QUEyQXBTQkFpQURRUXcyQXBpQkFpQURRWWZWQURzQm5JRUNJQU5CNThYTUFEWUNvSUVDSUFOQkR6WUNwSUVDSUFOQmhkVUFPd0dvZ1FJZ0EwSDJ4Y3dBTmdLc2dRSWdBMEVRTmdLd2dRSWdBMEg5MUFBN0FiU0JBaUFEUVliR3pBQTJBcmlCQWlBRFFSQTJBcnlCQWlBRFFmTEVBRHNCd0lFQ0lBTkJsc2JNQURZQ3hJRUNJQU5CRFRZQ3lJRUNJQU5COXNRQU93SE1nUUlnQTBHanhzd0FOZ0xRZ1FJZ0EwRVBOZ0xVZ1FJZ0EwSG94QUE3QWRpQkFpQURRYkxHekFBMkF0eUJBaUFEUVE0MkF1Q0JBaUFEUWVqRUFEc0I1SUVDSUFOQndNYk1BRFlDNklFQ0lBTkJEVFlDN0lFQ0lBTkI4c1FBT3dId2dRSWdBMEhOeHN3QU5nTDBnUUlnQTBFTk5nTDRnUUlnQTBIbXhBQTdBZnlCQWlBRFFkckd6QUEyQW9DQ0FpQURRUWsyQW9TQ0FpQURRZVQ4QXpzQmlJSUNJQU5CNDhiTUFEWUNqSUlDSUFOQkJEWUNrSUlDSUFOQjdnUTdBWlNDQWlBRFFlZkd6QUEyQXBpQ0FpQURRUWMyQXB5Q0FpQURRWXpMQURzQm9JSUNJQU5CN3NiTUFEWUNwSUlDSUFOQkRqWUNxSUlDSUFOQjdRUTdBYXlDQWlBRFFmekd6QUEyQXJDQ0FpQURRUVEyQXJTQ0FpQURRYVRCQURzQnVJSUNJQU5CZ01mTUFEWUN2SUlDSUFOQkREWUN3SUlDSUFOQjdBbzdBY1NDQWlBRFFZekh6QUEyQXNpQ0FpQURRUUkyQXN5Q0FpQURRY2tET3dIUWdnSWdBMEdPeDh3QU5nTFVnZ0lnQTBFTE5nTFlnZ0lnQTBIWkNEc0IzSUlDSUFOQm1jZk1BRFlDNElJQ0lBTkJBallDNUlJQ0lBTkJ3TzBET3dIb2dnSWdBMEdieDh3QU5nTHNnZ0lnQTBFSE5nTHdnZ0lnQTBHekVqc0I5SUlDSUFOQm9zZk1BRFlDK0lJQ0lBTkJDellDL0lJQ0lBTkJzeFU3QVlDREFpQURRYTNIekFBMkFvU0RBaUFEUVFvMkFvaURBaUFEUWJzOE93R01nd0lnQTBHM3g4d0FOZ0tRZ3dJZ0EwRUlOZ0tVZ3dJZ0EwRzBFanNCbUlNQ0lBTkJ2OGZNQURZQ25JTUNJQU5CRURZQ29JTUNJQU5CNFJNN0FhU0RBaUFEUWMvSHpBQTJBcWlEQWlBRFFRMDJBcXlEQWlBRFFlRVNPd0d3Z3dJZ0EwSGN4OHdBTmdLMGd3SWdBMEVaTmdLNGd3SWdBMEhqRXpzQnZJTUNJQU5COWNmTUFEWUN3SU1DSUFOQkZqWUN4SU1DSUFOQjR4STdBY2lEQWlBRFFZdkl6QUEyQXN5REFpQURRUXcyQXRDREFpQURRZXNFT3dIVWd3SWdBMEdYeU13QU5nTFlnd0lnQTBFS05nTGNnd0lnQTBITS9nTTdBZUNEQWlBRFFhSEl6QUEyQXVTREFpQURRUWcyQXVpREFpQURRZERuQURzQjdJTUNJQU5CcWNqTUFEWUM4SU1DSUFOQkN6WUM5SU1DSUFOQnJCdzdBZmlEQWlBRFFZZkh6d0EyQXZ5REFpQURRUW8yQW9DRUFpQURRYWZFQURzQmhJUUNJQU5CdE1qTUFEWUNpSVFDSUFOQkVUWUNqSVFDSUFOQndNVUFPd0dRaEFJZ0EwSEZ5TXdBTmdLVWhBSWdBMEVPTmdLWWhBSWdBMEhBeFFBN0FaeUVBaUFEUWNxT3pnQTJBcUNFQWlBRFFRbzJBcVNFQWlBRFFhd0JPd0dvaEFJZ0EwSFR5TXdBTmdLc2hBSWdBMEVTTmdLd2hBSWdBMEdReGdBN0FiU0VBaUFEUVpISHp3QTJBcmlFQWlBRFFRazJBcnlFQWlBRFFhakVBRHNCd0lRQ0lBTkI1Y2pNQURZQ3hJUUNJQU5CRURZQ3lJUUNJQU5Cd2NVQU93SE1oQUlnQTBIMXlNd0FOZ0xRaEFJZ0EwRU5OZ0xVaEFJZ0EwSEJ4UUE3QWRpRUFpQURRWUxKekFBMkF0eUVBaUFEUVFvMkF1Q0VBaUFEUWFVY093SGtoQUlnQTBHTXljd0FOZ0xvaEFJZ0EwRUlOZ0xzaEFJZ0EwSC9BanNCOElRQ0lBTkJsTW5NQURZQzlJUUNJQU5CQlRZQytJUUNJQU5CL3dJN0FmeUVBaUFEUVpuSnpBQTJBb0NGQWlBRFFRWTJBb1NGQWlBRFFmOENPd0dJaFFJZ0EwR2Z5Y3dBTmdLTWhRSWdBMEVHTmdLUWhRSWdBMEgvQWpzQmxJVUNJQU5CcGNuTUFEWUNtSVVDSUFOQkJqWUNuSVVDSUFOQi93STdBYUNGQWlBRFFhdkp6QUEyQXFTRkFpQURRUVkyQXFpRkFpQURRWVgyQXpzQnJJVUNJQU5Cc2NuTUFEWUNzSVVDSUFOQkVUWUN0SVVDSUFOQnp2d0RPd0c0aFFJZ0EwSEN5Y3dBTmdLOGhRSWdBMEVLTmdMQWhRSWdBMEd5QmpzQnhJVUNJQU5Cek1uTUFEWUN5SVVDSUFOQkRUWUN6SVVDSUFOQnpmd0RPd0hRaFFJZ0EwR3ZoODRBTmdMVWhRSWdBMEVITmdMWWhRSWdBMEhLeXdBN0FkeUZBaUFEUWRuSnpBQTJBdUNGQWlBRFFRWTJBdVNGQWlBRFFhZkpBRHNCNklVQ0lBTkIzOG5NQURZQzdJVUNJQU5CQnpZQzhJVUNJQU5CazhJQU93SDBoUUlnQTBIOGhNNEFOZ0w0aFFJZ0EwRUdOZ0w4aFFJZ0EwSENBanNCZ0lZQ0lBTkI1c25NQURZQ2hJWUNJQU5CQnpZQ2lJWUNJQU5CazhJQU93R01oZ0lnQTBIdHljd0FOZ0tRaGdJZ0EwRUpOZ0tVaGdJZ0EwSHU3UU03QVppR0FpQURRZmJKekFBMkFweUdBaUFEUVFjMkFxQ0dBaUFEUVpITEFEc0JwSVlDSUFOQi9jbk1BRFlDcUlZQ0lBTkJCallDcklZQ0lBTkJwaHc3QWJDR0FpQURRWVBLekFBMkFyU0dBaUFEUVE4MkFyaUdBaUFEUVl3VE93RzhoZ0lnQTBHU3lzd0FOZ0xBaGdJZ0EwRU1OZ0xFaGdJZ0EwR01FanNCeUlZQ0lBTkJuc3JNQURZQ3pJWUNJQU5CR0RZQzBJWUNJQU5CNGhNN0FkU0dBaUFEUWJiS3pBQTJBdGlHQWlBRFFSVTJBdHlHQWlBRFFlSVNPd0hnaGdJZ0EwSEx5c3dBTmdMa2hnSWdBMEVJTmdMb2hnSWdBMEhUNXdBN0FleUdBaUFEUWNHQnpnQTJBdkNHQWlBRFFRRTJBdlNHQWlBRFFlMEFPd0g0aGdJZ0EwSFR5c3dBTmdMOGhnSWdBMEVKTmdLQWh3SWdBMEd1RXpzQmhJY0NJQU5CaDRUT0FEWUNpSWNDSUFOQkJqWUNqSWNDSUFOQnJ3RTdBWkNIQWlBRFFkekt6QUEyQXBTSEFpQURRUTQyQXBpSEFpQURRYkVHT3dHY2h3SWdBMEhxeXN3QU5nS2dod0lnQTBFSk5nS2tod0lnQTBHRUJqc0JxSWNDSUFOQjg4ck1BRFlDckljQ0lBTkJERFlDc0ljQ0lBTkJ6UVU3QWJTSEFpQURRZi9LekFBMkFyaUhBaUFEUVE4MkFyeUhBaUFEUWVQL0F6c0J3SWNDSUFOQmpzdk1BRFlDeEljQ0lBTkJCallDeUljQ0lBTkJ2enc3QWN5SEFpQURRWlRMekFBMkF0Q0hBaUFEUVFZMkF0U0hBaUFEUWE0U093SFlod0lnQTBHYXk4d0FOZ0xjaHdJZ0EwRUtOZ0xnaHdJZ0EwR3VGVHNCNUljQ0lBTkJwTXZNQURZQzZJY0NJQU5CQ2pZQzdJY0NJQU5CcmhRN0FmQ0hBaUFEUWE3THpBQTJBdlNIQWlBRFFRNDJBdmlIQWlBRFFhUUxPd0g4aHdJZ0EwRzh5OHdBTmdLQWlBSWdBMEVTTmdLRWlBSWdBMEdrQ3pzQmlJZ0NJQU5CenN2TUFEWUNqSWdDSUFOQkNqWUNrSWdDSUFOQi91QUFPd0dVaUFJZ0EwSFl5OHdBTmdLWWlBSWdBMEVXTmdLY2lBSWdBMEdWOFFNN0FhQ0lBaUFEUWU3THpBQTJBcVNJQWlBRFFSYzJBcWlJQWlBRFFaVHhBenNCcklnQ0lBTkJoY3pNQURZQ3NJZ0NJQU5CRHpZQ3RJZ0NJQU5CeXh3N0FiaUlBaUFEUVpUTXpBQTJBcnlJQWlBRFFSZzJBc0NJQWlBRFFaUHhBenNCeElnQ0lBTkJyTXpNQURZQ3lJZ0NJQU5CRURZQ3pJZ0NJQU5CalBFRE93SFFpQUlnQTBHOHpNd0FOZ0xVaUFJZ0EwRVJOZ0xZaUFJZ0EwR0w4UU03QWR5SUFpQURRYzNNekFBMkF1Q0lBaUFEUVFrMkF1U0lBaUFEUWNnY093SG9pQUlnQTBIV3pNd0FOZ0xzaUFJZ0EwRVNOZ0x3aUFJZ0EwR0s4UU03QWZTSUFpQURRZWpNekFBMkF2aUlBaUFEUVJJMkF2eUlBaUFEUVlUeEF6c0JnSWtDSUFOQitzek1BRFlDaElrQ0lBTkJEallDaUlrQ0lBTkJzUnc3QVl5SkFpQURRWWpOekFBMkFwQ0pBaUFEUVJFMkFwU0pBaUFEUVlueEF6c0JtSWtDSUFOQm1jM01BRFlDbklrQ0lBTkJEVFlDb0lrQ0lBTkJ4eHc3QWFTSkFpQURRYWJOekFBMkFxaUpBaUFEUVJFMkFxeUpBaUFEUVkveEF6c0JzSWtDSUFOQnQ4M01BRFlDdElrQ0lBTkJFallDdUlrQ0lBTkJqdkVET3dHOGlRSWdBMEhKemN3QU5nTEFpUUlnQTBFS05nTEVpUUlnQTBISkhEc0J5SWtDSUFOQjA4M01BRFlDeklrQ0lBTkJFellDMElrQ0lBTkJqZkVET3dIVWlRSWdBMEhtemN3QU5nTFlpUUlnQTBFUk5nTGNpUUlnQTBHUzhRTTdBZUNKQWlBRFFmZk56QUEyQXVTSkFpQURRUkkyQXVpSkFpQURRWkh4QXpzQjdJa0NJQU5CaWM3TUFEWUM4SWtDSUFOQkNqWUM5SWtDSUFOQnlodzdBZmlKQWlBRFFaUE96QUEyQXZ5SkFpQURRUk0yQW9DS0FpQURRWkR4QXpzQmhJb0NJQU5CcHM3TUFEWUNpSW9DSUFOQkREWUNqSW9DSUFOQnhodzdBWkNLQWlBRFFiTE96QUEyQXBTS0FpQURRUW8yQXBpS0FpQURRZDdoQURzQm5Jb0NJQU5Cdk03TUFEWUNvSW9DSUFOQkV6WUNwSW9DSUFOQmovOERPd0dvaWdJZ0EwSFB6c3dBTmdLc2lnSWdBMEVFTmdLd2lnSWdBMEhDekFBN0FiU0tBaUFEUWRQT3pBQTJBcmlLQWlBRFFRdzJBcnlLQWlBRFFhRE9BRHNCd0lvQ0lBTkIzODdNQURZQ3hJb0NJQU5CRFRZQ3lJb0NJQU5CeCtZQU93SE1pZ0lnQTBIc3pzd0FOZ0xRaWdJZ0EwRUdOZ0xVaWdJZ0EwR213d0E3QWRpS0FpQURRZkxPekFBMkF0eUtBaUFEUVFzMkF1Q0tBaUFEUWI0TE93SGtpZ0lnQTBIOXpzd0FOZ0xvaWdJZ0EwRUVOZ0xzaWdJZ0EwSEN6QUE3QWZDS0FpQURRWUhQekFBMkF2U0tBaUFEUVJJMkF2aUtBaUFEUWE4TE93SDhpZ0lnQTBHVHo4d0FOZ0tBaXdJZ0EwRUlOZ0tFaXdJZ0EwR0Q1d0E3QVlpTEFpQURRWnZQekFBMkFveUxBaUFEUVFrMkFwQ0xBaUFEUVlmaUFEc0JsSXNDSUFOQnBNL01BRFlDbUlzQ0lBTkJDRFlDbklzQ0lBTkIxT2NBT3dHZ2l3SWdBMEdzejh3QU5nS2tpd0lnQTBFSE5nS29pd0lnQTBIY3lRQTdBYXlMQWlBRFFiUFB6QUEyQXJDTEFpQURRUXcyQXJTTEFpQURRYVhuQURzQnVJc0NJQU5CdjgvTUFEWUN2SXNDSUFOQkNqWUN3SXNDSUFOQndUdzdBY1NMQWlBRFFjblB6QUEyQXNpTEFpQURRUWsyQXN5TEFpQURRY004T3dIUWl3SWdBMEhTejh3QU5nTFVpd0lnQTBFTk5nTFlpd0lnQTBHaHhBQTdBZHlMQWlBRFFkL1B6QUEyQXVDTEFpQURRUW8yQXVTTEFpQURRY1VNT3dIb2l3SWdBMEhwejh3QU5nTHNpd0lnQTBFUE5nTHdpd0lnQTBIaS9RTTdBZlNMQWlBRFFmalB6QUEyQXZpTEFpQURRUkUyQXZ5TEFpQURRZVA5QXpzQmdJd0NJQU5CaWRETUFEWUNoSXdDSUFOQkVEWUNpSXdDSUFOQjVQMERPd0dNakFJZ0EwR1owTXdBTmdLUWpBSWdBMEVWTmdLVWpBSWdBMEhSK1FNN0FaaU1BaUFEUWE3UXpBQTJBcHlNQWlBRFFSWTJBcUNNQWlBRFFjajRBenNCcEl3Q0lBTkJ4TkRNQURZQ3FJd0NJQU5CRFRZQ3JJd0NJQU5CemVZQU93R3dqQUlnQTBIUjBNd0FOZ0swakFJZ0EwRUtOZ0s0akFJZ0EwR0I0UUE3QWJ5TUFpQURRZHZRekFBMkFzQ01BaUFEUVE0MkFzU01BaUFEUWY3bUFEc0J5SXdDSUFOQjZkRE1BRFlDekl3Q0lBTkJDallDMEl3Q0lBTkI0ZUVBT3dIVWpBSWdBMEh6ME13QU5nTFlqQUlnQTBFVE5nTGNqQUlnQTBHUy93TTdBZUNNQWlBRFFZYlJ6QUEyQXVTTUFpQURRUU0yQXVpTUFpQURRZDRMT3dIc2pBSWdBMEdKMGN3QU5nTHdqQUlnQTBFSk5nTDBqQUlnQTBHKzlnTTdBZmlNQWlBRFFaTFJ6QUEyQXZ5TUFpQURRUTgyQW9DTkFpQURRYjcyQXpzQmhJMENJQU5Cb2RITUFEWUNpSTBDSUFOQkNUWUNqSTBDSUFOQjNnczdBWkNOQWlBRFFhclJ6QUEyQXBTTkFpQURRUXMyQXBpTkFpQURRZlFLT3dHY2pRSWdBMEcxMGN3QU5nS2dqUUlnQTBFTU5nS2tqUUlnQTBHbEN6c0JxSTBDSUFOQndkSE1BRFlDckkwQ0lBTkJFallDc0kwQ0lBTkJwZ3M3QWJTTkFpQURRZFBSekFBMkFyaU5BaUFEUVJZMkFyeU5BaUFEUWFZTE93SEFqUUlnQTBIcDBjd0FOZ0xFalFJZ0EwRVFOZ0xJalFJZ0EwR2xDenNCekkwQ0lBTkIrZEhNQURZQzBJMENJQU5CQlRZQzFJMENJQU5COFFRN0FkaU5BaUFEUWY3UnpBQTJBdHlOQWlBRFFRazJBdUNOQWlBRFFaTG5BRHNCNUkwQ0lBTkJoOUxNQURZQzZJMENJQU5CR2pZQzdJMENJQU5CNWY0RE93SHdqUUlnQTBHaDBzd0FOZ0wwalFJZ0EwRUdOZ0w0alFJZ0EwRzNBVHNCL0kwQ0lBTkJwOUxNQURZQ2dJNENJQU5CRWpZQ2hJNENJQU5COHVRQU93R0lqZ0lnQTBHNTBzd0FOZ0tNamdJZ0EwRVJOZ0tRamdJZ0EwR1M1QUE3QVpTT0FpQURRY3JTekFBMkFwaU9BaUFEUVJFMkFweU9BaUFEUWVUa0FEc0JvSTRDSUFOQjI5TE1BRFlDcEk0Q0lBTkJDellDcUk0Q0lBTkJ3ZUlBT3dHc2pnSWdBMEhtMHN3QU5nS3dqZ0lnQTBFU05nSzBqZ0lnQTBIdzRnQTdBYmlPQWlBRFFmalN6QUEyQXJ5T0FpQURRUkEyQXNDT0FpQURRWVRrQURzQnhJNENJQU5CaU5QTUFEWUN5STRDSUFOQkVEWUN6STRDSUFOQjd1SUFPd0hRamdJZ0EwR1kwOHdBTmdMVWpnSWdBMEVQTmdMWWpnSWdBMEh2NGdBN0FkeU9BaUFEUWFmVHpBQTJBdUNPQWlBRFFRbzJBdVNPQWlBRFFmL2dBRHNCNkk0Q0lBTkJzZFBNQURZQzdJNENJQU5CQ2pZQzhJNENJQU5CMytFQU93SDBqZ0lnQTBHNzA4d0FOZ0w0amdJZ0EwRVROZ0w4amdJZ0EwR1Evd003QVlDUEFpQURRYWlPemdBMkFvU1BBaUFEUVFVMkFvaVBBaUFEUVpMRUFEc0JqSThDSUFOQnp0UE1BRFlDa0k4Q0lBTkJEVFlDbEk4Q0lBTkJvQVk3QVppUEFpQURRZHZUekFBMkFweVBBaUFEUVFzMkFxQ1BBaUFEUVpiRkFEc0JwSThDSUFOQjV0UE1BRFlDcUk4Q0lBTkJDRFlDckk4Q0lBTkIxd1U3QWJDUEFpQURRZTdUekFBMkFyU1BBaUFEUVFrMkFyaVBBaUFEUVpQRUFEc0J2SThDSUFOQmlNVFBBRFlDd0k4Q0lBTkJCallDeEk4Q0lBTkJzc0FBT3dISWp3SWdBMEgzMDh3QU5nTE1qd0lnQTBFUE5nTFFqd0lnQTBISzVnQTdBZFNQQWlBRFFZYlV6QUEyQXRpUEFpQURRUW8yQXR5UEFpQURRY25tQURzQjRJOENJQU5Ca05UTUFEWUM1SThDSUFOQkRqWUM2SThDSUFOQjhBUTdBZXlQQWlBRFFaN1V6QUEyQXZDUEFpQURRUWcyQXZTUEFpQURRWmJuQURzQitJOENJQU5CcHRUTUFEWUMvSThDSUFOQkRUWUNnSkFDSUFOQm8rY0FPd0dFa0FJZ0EwR3oxTXdBTmdLSWtBSWdBMEVLTmdLTWtBSWdBMEhOL2dNN0FaQ1FBaUFEUWIzVXpBQTJBcFNRQWlBRFFRODJBcGlRQWlBRFFaL25BRHNCbkpBQ0lBTkJ6TlRNQURZQ29KQUNJQU5CQ2pZQ3BKQUNJQU5CZ3VFQU93R29rQUlnQTBIVzFNd0FOZ0tza0FJZ0EwRUtOZ0t3a0FJZ0EwSEI1d0E3QWJTUUFpQURRZURVekFBMkFyaVFBaUFEUVFvMkFyeVFBaUFEUWVMaEFEc0J3SkFDSUFOQjZ0VE1BRFlDeEpBQ0lBTkJFellDeUpBQ0lBTkJrLzhET3dITWtBSWdBMEg5MU13QU5nTFFrQUlnQTBFSk5nTFVrQUlnQTBIVzV3QTdBZGlRQWlBRFFZYlZ6QUEyQXR5UUFpQURRUWcyQXVDUUFpQURRYUVjT3dIa2tBSWdBMEdPMWN3QU5nTG9rQUlnQTBFTU5nTHNrQUlnQTBHbjV3QTdBZkNRQWlBRFFaclZ6QUEyQXZTUUFpQURRUk0yQXZpUUFpQURRYWpuQURzQi9KQUNJQU5CcmRYTUFEWUNnSkVDSUFOQkJqWUNoSkVDSUFOQnFNa0FPd0dJa1FJZ0EwR3oxY3dBTmdLTWtRSWdBMEVKTmdLUWtRSWdBMEdyNXdBN0FaU1JBaUFEUWJ6VnpBQTJBcGlSQWlBRFFRZzJBcHlSQWlBRFFiUG5BRHNCb0pFQ0lBTkJ4TlhNQURZQ3BKRUNJQU5CQ1RZQ3FKRUNJQU5CNyswRE93R3NrUUlnQTBITjFjd0FOZ0t3a1FJZ0EwRUhOZ0swa1FJZ0EwSHZCRHNCdUpFQ0lBTkJ1WXZPQURZQ3ZKRUNJQU5CQWpZQ3dKRUNJQU5CdFFFN0FjU1JBaUFEUWRUVnpBQTJBc2lSQWlBRFFRTTJBc3lSQWlBRFFiVUJPd0hRa1FJZ0EwSFgxY3dBTmdMVWtRSWdBMEVKTmdMWWtRSWdBMEdDNXdBN0FkeVJBaUFEUWVEVnpBQTJBdUNSQWlBRFFRczJBdVNSQWlBRFFldkVBRHNCNkpFQ0lBTkI2OVhNQURZQzdKRUNJQU5CQ0RZQzhKRUNJQU5CNnNRQU93SDBrUUlnQTBIejFjd0FOZ0w0a1FJZ0EwRUpOZ0w4a1FJZ0EwR001d0E3QVlDU0FpQURRZnpWekFBMkFvU1NBaUFEUVFjMkFvaVNBaUFEUWJ3SE93R01rZ0lnQTBHRDFzd0FOZ0tRa2dJZ0EwRUpOZ0tVa2dJZ0EwR041d0E3QVppU0FpQURRWXpXekFBMkFweVNBaUFEUVFvMkFxQ1NBaUFEUVlEaEFEc0JwSklDSUFOQmx0Yk1BRFlDcUpJQ0lBTkJDallDckpJQ0lBTkI0T0VBT3dHd2tnSWdBMEdnMXN3QU5nSzBrZ0lnQTBFVE5nSzRrZ0lnQTBHUi93TTdBYnlTQWlBRFFiUFd6QUEyQXNDU0FpQURRUWsyQXNTU0FpQURRWlhuQURzQnlKSUNJQU5Cdk5iTUFEWUN6SklDSUFOQkRqWUMwSklDSUFOQnljVUFPd0hVa2dJZ0EwSEsxc3dBTmdMWWtnSWdBMEVQTmdMY2tnSWdBMEhLeFFBN0FlQ1NBaUFEUWRuV3pBQTJBdVNTQWlBRFFRZzJBdWlTQWlBRFFiakZBRHNCN0pJQ0lBTkI0ZGJNQURZQzhKSUNJQU5CRFRZQzlKSUNJQU5CeThVQU93SDRrZ0lnQTBIdTFzd0FOZ0w4a2dJZ0EwRU9OZ0tBa3dJZ0EwSE14UUE3QVlTVEFpQURRY2FJemdBMkFvaVRBaUFEUVFnMkFveVRBaUFEUWRjQk93R1Frd0lnQTBIODFzd0FOZ0tVa3dJZ0EwRUpOZ0tZa3dJZ0EwR2I1d0E3QVp5VEFpQURRWVhYekFBMkFxQ1RBaUFEUVFzMkFxU1RBaUFEUWFNTE93R29rd0lnQTBHUTE4d0FOZ0tza3dJZ0EwRVBOZ0t3a3dJZ0EwR2pDenNCdEpNQ0lBTkJuOWZNQURZQ3VKTUNJQU5CQ3pZQ3ZKTUNJQU5CNnN3QU93SEFrd0lnQTBHcTE4d0FOZ0xFa3dJZ0EwRU9OZ0xJa3dJZ0EwSHJ6QUE3QWN5VEFpQURRYmpYekFBMkF0Q1RBaUFEUVEwMkF0U1RBaUFEUWUzTUFEc0IySk1DSUFOQnhkZk1BRFlDM0pNQ0lBTkJEallDNEpNQ0lBTkI3OHdBT3dIa2t3SWdBMEhUMTh3QU5nTG9rd0lnQTBFSk5nTHNrd0lnQTBHeTV3QTdBZkNUQWlBRFFkelh6QUEyQXZTVEFpQURRUWsyQXZpVEFpQURRYmJuQURzQi9KTUNJQU5CNWRmTUFEWUNnSlFDSUFOQkNUWUNoSlFDSUFOQnZPY0FPd0dJbEFJZ0EwSHUxOHdBTmdLTWxBSWdBMEVNTmdLUWxBSWdBMEc1NXdBN0FaU1VBaUFEUWZyWHpBQTJBcGlVQWlBRFFRZzJBcHlVQWlBRFFiZm5BRHNCb0pRQ0lBTkJndGpNQURZQ3BKUUNJQU5CRERZQ3FKUUNJQU5CditjQU93R3NsQUlnQTBHTzJNd0FOZ0t3bEFJZ0EwRUlOZ0swbEFJZ0EwRzk1d0E3QWJpVUFpQURRY0tCemdBMkFyeVVBaUFEUVFFMkFzQ1VBaUFEUWU0QU93SEVsQUlnQTBHVzJNd0FOZ0xJbEFJZ0EwRUpOZ0xNbEFJZ0EwR29FenNCMEpRQ0lBTkJuOWpNQURZQzFKUUNJQU5CQlRZQzJKUUNJQU5CaDhRQU93SGNsQUlnQTBHaWljNEFOZ0xnbEFJZ0EwRUdOZ0xrbEFJZ0EwSEVBanNCNkpRQ0lBTkJwTmpNQURZQzdKUUNJQU5CQmpZQzhKUUNJQU5CcUJJN0FmU1VBaUFEUWFyWXpBQTJBdmlVQWlBRFFRbzJBdnlVQWlBRFFhZ1ZPd0dBbFFJZ0EwRzAyTXdBTmdLRWxRSWdBMEVLTmdLSWxRSWdBMEdvRkRzQmpKVUNJQU5CdnRqTUFEWUNrSlVDSUFOQkNqWUNsSlVDSUFOQjZ1QUFPd0dZbFFJZ0EwSEkyTXdBTmdLY2xRSWdBMEVLTmdLZ2xRSWdBMEhLNFFBN0FhU1ZBaUFEUWRMWXpBQTJBcWlWQWlBRFFSTTJBcXlWQWlBRFFZWC9BenNCc0pVQ0lBTkI1ZGpNQURZQ3RKVUNJQU5CQkRZQ3VKVUNJQU5Cdk1VQU93RzhsUUlnQTBIcDJNd0FOZ0xBbFFJZ0EwRUxOZ0xFbFFJZ0EwSEpBanNCeUpVQ0lBTkI5TmpNQURZQ3pKVUNJQU5CQ0RZQzBKVUNJQU5CZ2VjQU93SFVsUUlnQTBIODJNd0FOZ0xZbFFJZ0EwRUhOZ0xjbFFJZ0EwSHV6QUE3QWVDVkFpQURRWVBaekFBMkF1U1ZBaUFEUVFrMkF1aVZBaUFEUVl2aUFEc0I3SlVDSUFOQmpObk1BRFlDOEpVQ0lBTkJCellDOUpVQ0lBTkJvQUU3QWZpVkFpQURRYmlPemdBMkF2eVZBaUFEUVFZMkFvQ1dBaUFEUWNnQ093R0VsZ0lnQTBHVDJjd0FOZ0tJbGdJZ0EwRUlOZ0tNbGdJZ0EwSEdBanNCa0pZQ0lBTkJtOW5NQURZQ2xKWUNJQU5CQnpZQ21KWUNJQU5CM2NrQU93R2NsZ0lnQTBHaTJjd0FOZ0tnbGdJZ0EwRVFOZ0trbGdJZ0EwSExQRHNCcUpZQ0lBTkJnNC9PQURZQ3JKWUNJQU5CRERZQ3NKWUNJQU5CeGdJN0FiU1dBaUFEUWJMWnpBQTJBcmlXQWlBRFFRbzJBcnlXQWlBRFFjVThPd0hBbGdJZ0EwRzgyY3dBTmdMRWxnSWdBMEVKTmdMSWxnSWdBMEhIUERzQnpKWUNJQU5CeGRuTUFEWUMwSllDSUFOQkRUWUMxSllDSUFOQnVBWTdBZGlXQWlBRFFkTFp6QUEyQXR5V0FpQURRUW8yQXVDV0FpQURRZTNnQURzQjVKWUNJQU5CM05uTUFEWUM2SllDSUFOQkNqWUM3SllDSUFOQnplRUFPd0h3bGdJZ0EwSG0yY3dBTmdMMGxnSWdBMEVUTmdMNGxnSWdBMEdJL3dNN0FmeVdBaUFEUWZuWnpBQTJBb0NYQWlBRFFRMDJBb1NYQWlBRFFhckJBRHNCaUpjQ0lBTkJodHJNQURZQ2pKY0NJQU5CQ0RZQ2tKY0NJQU5CaStjQU93R1Vsd0lnQTBHTzJzd0FOZ0tZbHdJZ0EwRUNOZ0tjbHdJZ0EwSExBanNCb0pjQ0lBTkJrTnJNQURZQ3BKY0NJQU5CQ2pZQ3FKY0NJQU5CbVJNN0FheVhBaUFEUVpyYXpBQTJBckNYQWlBRFFRYzJBclNYQWlBRFFaa1NPd0c0bHdJZ0EwR2gyc3dBTmdLOGx3SWdBMEVMTmdMQWx3SWdBMEdaRlRzQnhKY0NJQU5Cck5yTUFEWUN5SmNDSUFOQkN6WUN6SmNDSUFOQm1SUTdBZENYQWlBRFFiZmF6QUEyQXRTWEFpQURRUW8yQXRpWEFpQURRWWNjT3dIY2x3SWdBMEhCMnN3QU5nTGdsd0lnQTBFSk5nTGtsd0lnQTBHVDRRQTdBZWlYQWlBRFFjcmF6QUEyQXV5WEFpQURRUWsyQXZDWEFpQURRZklFT3dIMGx3SWdBMEhUMnN3QU5nTDRsd0lnQTBFT05nTDhsd0lnQTBIekJEc0JnSmdDSUFOQjRkck1BRFlDaEpnQ0lBTkJFallDaUpnQ0lBTkI3K1FBT3dHTW1BSWdBMEh6MnN3QU5nS1FtQUlnQTBFUk5nS1VtQUlnQTBHUDVBQTdBWmlZQWlBRFFZVGJ6QUEyQXB5WUFpQURRUkEyQXFDWUFpQURRYlhpQURzQnBKZ0NJQU5CbE52TUFEWUNxSmdDSUFOQkVUWUNySmdDSUFOQjRlUUFPd0d3bUFJZ0EwR2wyOHdBTmdLMG1BSWdBMEVRTmdLNG1BSWdBMEcyNGdBN0FieVlBaUFEUWJYYnpBQTJBc0NZQWlBRFFRczJBc1NZQWlBRFFiVGlBRHNCeUpnQ0lBTkJ3TnZNQURZQ3pKZ0NJQU5CRWpZQzBKZ0NJQU5CNk9JQU93SFVtQUlnQTBIUzI4d0FOZ0xZbUFJZ0EwRVFOZ0xjbUFJZ0EwR0I1QUE3QWVDWUFpQURRZUxiekFBMkF1U1lBaUFEUVE4MkF1aVlBaUFEUWVmaUFEc0I3SmdDSUFOQjhkdk1BRFlDOEpnQ0lBTkJFVFlDOUpnQ0lBTkI1dUlBT3dING1BSWdBMEdDM013QU5nTDhtQUlnQTBFS05nS0FtUUlnQTBIcjRBQTdBWVNaQWlBRFFZemN6QUEyQW9pWkFpQURRUW8yQW95WkFpQURRY3ZoQURzQmtKa0NJQU5CbHR6TUFEWUNsSmtDSUFOQkV6WUNtSmtDSUFOQmh2OERPd0djbVFJZ0EwR3AzTXdBTmdLZ21RSWdBMEVRTmdLa21RSWdBMEdaOFFNN0FhaVpBaUFEUWJuY3pBQTJBcXlaQWlBRFFRdzJBckNaQWlBRFFjMGNPd0cwbVFJZ0EwR3hnTTRBTmdLNG1RSWdBMEVFTmdLOG1RSWdBMEU1T3dIQW1RSWdBMEhGM013QU5nTEVtUUlnQTBFS05nTEltUUlnQTBIcEREc0J6SmtDSUFOQno5ek1BRFlDMEprQ0lBTkJDellDMUprQ0lBTkI3eE03QWRpWkFpQURRZHJjekFBMkF0eVpBaUFEUVFvMkF1Q1pBaUFEUWVqSUFEc0I1SmtDSUFOQjVOek1BRFlDNkprQ0lBTkJHallDN0prQ0lBTkJrczhBT3dId21RSWdBMEgrM013QU5nTDBtUUlnQTBFSU5nTDRtUUlnQTBIdkVqc0IvSmtDSUFOQmh0M01BRFlDZ0pvQ0lBTkJERFlDaEpvQ0lBTkI3eFU3QVlpYUFpQURRWkxkekFBMkFveWFBaUFEUVF3MkFwQ2FBaUFEUWU4VU93R1VtZ0lnQTBHZTNjd0FOZ0tZbWdJZ0EwRU9OZ0tjbWdJZ0EwSHBERHNCb0pvQ0lBTkJyTjNNQURZQ3BKb0NJQU5CRERZQ3FKb0NJQU5CcWVBQU93R3NtZ0lnQTBHNDNjd0FOZ0t3bWdJZ0EwRVVOZ0swbWdJZ0EwR281QUE3QWJpYUFpQURRY3pkekFBMkFyeWFBaUFEUVF3MkFzQ2FBaUFEUVluQkFEc0J4Sm9DSUFOQjJOM01BRFlDeUpvQ0lBTkJEVFlDekpvQ0lBTkJtZjRET3dIUW1nSWdBMEhsM2N3QU5nTFVtZ0lnQTBFTU5nTFltZ0lnQTBHNTdnTTdBZHlhQWlBRFFmSGR6QUEyQXVDYUFpQURRUWsyQXVTYUFpQURRZnpJQURzQjZKb0NJQU5CK3QzTUFEWUM3Sm9DSUFOQkNqWUM4Sm9DSUFOQmtNa0FPd0gwbWdJZ0EwR0Uzc3dBTmdMNG1nSWdBMEVMTmdMOG1nSWdBMEg1RFRzQmdKc0NJQU5Cajk3TUFEWUNoSnNDSUFOQkNUWUNpSnNDSUFOQitNSUFPd0dNbXdJZ0EwR1kzc3dBTmdLUW13SWdBMEVNTmdLVW13SWdBMEg1d0FBN0FaaWJBaUFEUWFUZXpBQTJBcHliQWlBRFFRNDJBcUNiQWlBRFFmTElBRHNCcEpzQ0lBTkJzdDdNQURZQ3FKc0NJQU5CRFRZQ3JKc0NJQU5CaHNrQU93R3dtd0lnQTBHLzNzd0FOZ0swbXdJZ0EwRU9OZ0s0bXdJZ0EwR2F5UUE3QWJ5YkFpQURRYzNlekFBMkFzQ2JBaUFEUVFnMkFzU2JBaUFEUWRrY093SEltd0lnQTBIVjNzd0FOZ0xNbXdJZ0EwRUNOZ0xRbXdJZ0EwSE1BenNCMUpzQ0lBTkIxOTdNQURZQzJKc0NJQU5CQ3pZQzNKc0NJQU5CMmdnN0FlQ2JBaUFEUWVMZXpBQTJBdVNiQWlBRFFRazJBdWliQWlBRFFmUGhBRHNCN0pzQ0lBTkI2OTdNQURZQzhKc0NJQU5CRWpZQzlKc0NJQU5CbmY4RE93SDRtd0lnQTBIOTNzd0FOZ0w4bXdJZ0EwRU5OZ0tBbkFJZ0EwR2VBenNCaEp3Q0lBTkJpdC9NQURZQ2lKd0NJQU5CQ2pZQ2pKd0NJQU5CeVR3N0FaQ2NBaUFEUVpUZnpBQTJBcFNjQWlBRFFRbzJBcGljQWlBRFFjNytBenNCbkp3Q0lBTkJudC9NQURZQ29Kd0NJQU5CQ0RZQ3BKd0NJQU5CbXVjQU93R29uQUlnQTBHbTM4d0FOZ0tzbkFJZ0EwRUtOZ0t3bkFJZ0EwR2pFenNCdEp3Q0lBTkJzTi9NQURZQ3VKd0NJQU5CQnpZQ3ZKd0NJQU5Cb3hJN0FjQ2NBaUFEUWJmZnpBQTJBc1NjQWlBRFFRczJBc2ljQWlBRFFhTVZPd0hNbkFJZ0EwSEMzOHdBTmdMUW5BSWdBMEVMTmdMVW5BSWdBMEdqRkRzQjJKd0NJQU5CemQvTUFEWUMzSndDSUFOQkNEWUM0SndDSUFOQnFSSTdBZVNjQWlBRFFkWGZ6QUEyQXVpY0FpQURRUW8yQXV5Y0FpQURRZTdnQURzQjhKd0NJQU5CMzkvTUFEWUM5SndDSUFOQkNqWUMrSndDSUFOQnp1RUFPd0g4bkFJZ0EwSHAzOHdBTmdLQW5RSWdBMEVUTmdLRW5RSWdBMEdKL3dNN0FZaWRBaUFEUWZ6ZnpBQTJBb3lkQWlBRFFSQTJBcENkQWlBRFFhQUJPd0dVblFJZ0EwR000TXdBTmdLWW5RSWdBMEVKTmdLY25RSWdBMEdUSERzQm9KMENJQU5CbGVETUFEWUNwSjBDSUFOQkNEWUNxSjBDSUFOQm1SdzdBYXlkQWlBRFFaM2d6QUEyQXJDZEFpQURRUW8yQXJTZEFpQURRY1lNT3dHNG5RSWdBMEduNE13QU5nSzhuUUlnQTBFUE5nTEFuUUlnQTBIbS9RTTdBY1NkQWlBRFFiYmd6QUEyQXNpZEFpQURRUkEyQXN5ZEFpQURRYm9OT3dIUW5RSWdBMEhHNE13QU5nTFVuUUlnQTBFVk5nTFluUUlnQTBHZjl3TTdBZHlkQWlBRFFkdmd6QUEyQXVDZEFpQURRUlEyQXVTZEFpQURRZWY5QXpzQjZKMENJQU5CNytETUFEWUM3SjBDSUFOQkVUWUM4SjBDSUFOQjUvMERPd0gwblFJZ0EwR0E0Y3dBTmdMNG5RSWdBMEVWTmdMOG5RSWdBMEhTK1FNN0FZQ2VBaUFEUVpYaHpBQTJBb1NlQWlBRFFSWTJBb2llQWlBRFFjdjRBenNCako0Q0lBTkJxK0hNQURZQ2tKNENJQU5CRURZQ2xKNENJQU5CNlAwRE93R1luZ0lnQTBHNzRjd0FOZ0tjbmdJZ0EwRVZOZ0tnbmdJZ0EwSFYrUU03QWFTZUFpQURRZERoekFBMkFxaWVBaUFEUVJZMkFxeWVBaUFEUWM3NEF6c0JzSjRDSUFOQjV1SE1BRFlDdEo0Q0lBTkJFellDdUo0Q0lBTkJqZmtET3dHOG5nSWdBMEg1NGN3QU5nTEFuZ0lnQTBFT05nTEVuZ0lnQTBISHhBQTdBY2llQWlBRFFZZml6QUEyQXN5ZUFpQURRUXcyQXRDZUFpQURRYTdEQURzQjFKNENJQU5CaytMTUFEWUMySjRDSUFOQkREWUMzSjRDSUFOQm1zTUFPd0hnbmdJZ0EwR2Y0c3dBTmdMa25nSWdBMEVOTmdMb25nSWdBMEdid3dBN0FleWVBaUFEUWF6aXpBQTJBdkNlQWlBRFFRWTJBdlNlQWlBRFFhVEVBRHNCK0o0Q0lBTkJzdUxNQURZQy9KNENJQU5CQ3pZQ2dKOENJQU5Cak1RQU93R0Vud0lnQTBHOTRzd0FOZ0tJbndJZ0EwRVBOZ0tNbndJZ0EwSE93d0E3QVpDZkFpQURRY3ppekFBMkFwU2ZBaUFEUVE4MkFwaWZBaUFEUWMzREFEc0JuSjhDSUFOQjIrTE1BRFlDb0o4Q0lBTkJFRFlDcEo4Q0lBTkJ6OE1BT3dHb253SWdBMEc1eHM4QU5nS3Nud0lnQTBFS05nS3dud0lnQTBHSnhBQTdBYlNmQWlBRFFldml6QUEyQXJpZkFpQURRUXcyQXJ5ZkFpQURRWW5FQURzQndKOENJQU5CNW83T0FEWUN4SjhDSUFOQkNEWUN5SjhDSUFOQjRNUUFPd0hNbndJZ0EwSDM0c3dBTmdMUW53SWdBMEVPTmdMVW53SWdBMEdFeEFBN0FkaWZBaUFEUVlYanpBQTJBdHlmQWlBRFFRbzJBdUNmQWlBRFFZSEZBRHNCNUo4Q0lBTkJqK1BNQURZQzZKOENJQU5CRHpZQzdKOENJQU5Cc05VQU93SHdud0lnQTBHZTQ4d0FOZ0wwbndJZ0EwRUpOZ0w0bndJZ0EwR3V4UUE3QWZ5ZkFpQURRYWZqekFBMkFvQ2dBaUFEUVE0MkFvU2dBaUFEUWEvRkFEc0JpS0FDSUFOQnRlUE1BRFlDaktBQ0lBTkJDallDa0tBQ0lBTkI3OFFBT3dHVW9BSWdBMEcvNDh3QU5nS1lvQUlnQTBFU05nS2NvQUlnQTBIbnhBQTdBYUNnQWlBRFFkSGp6QUEyQXFTZ0FpQURRUTgyQXFpZ0FpQURRZkhFQURzQnJLQUNJQU5CNE9QTUFEWUNzS0FDSUFOQkVqWUN0S0FDSUFOQjhjUUFPd0c0b0FJZ0EwSHk0OHdBTmdLOG9BSWdBMEVSTmdMQW9BSWdBMEg1eEFBN0FjU2dBaUFEUVlQa3pBQTJBc2lnQWlBRFFSTTJBc3lnQWlBRFFmN1VBRHNCMEtBQ0lBTkJsdVRNQURZQzFLQUNJQU5CRERZQzJLQUNJQU5CNHNRQU93SGNvQUlnQTBHaTVNd0FOZ0xnb0FJZ0EwRUhOZ0xrb0FJZ0EwSHV4QUE3QWVpZ0FpQURRYW5rekFBMkF1eWdBaUFEUVE4MkF2Q2dBaUFEUWViRUFEc0I5S0FDSUFOQnVPVE1BRFlDK0tBQ0lBTkJERFlDL0tBQ0lBTkI4TVFBT3dHQW9RSWdBMEhFNU13QU5nS0VvUUlnQTBFUE5nS0lvUUlnQTBId3hBQTdBWXloQWlBRFFkUGt6QUEyQXBDaEFpQURRUkEyQXBTaEFpQURRZjNVQURzQm1LRUNJQU5CNCtUTUFEWUNuS0VDSUFOQkN6WUNvS0VDSUFOQnBzUUFPd0drb1FJZ0EwSHU1TXdBTmdLb29RSWdBMEVMTmdLc29RSWdBMEdBeFFBN0FiQ2hBaUFEUWZua3pBQTJBclNoQWlBRFFSQTJBcmloQWlBRFFhL1ZBRHNCdktFQ0lBTkJpZVhNQURZQ3dLRUNJQU5CRERZQ3hLRUNJQU5CcmNVQU93SElvUUlnQTBHVjVjd0FOZ0xNb1FJZ0EwRUtOZ0xRb1FJZ0EwSEJ4QUE3QWRTaEFpQURRWkhHendBMkF0aWhBaUFEUVFrMkF0eWhBaUFEUVlURkFEc0I0S0VDSUFOQm4rWE1BRFlDNUtFQ0lBTkJERFlDNktFQ0lBTkJpTVVBT3dIc29RSWdBMEdyNWN3QU5nTHdvUUlnQTBFUk5nTDBvUUlnQTBIRjFRQTdBZmloQWlBRFFiemx6QUEyQXZ5aEFpQURRUTQyQW9DaUFpQURRWXJGQURzQmhLSUNJQU5CeXVYTUFEWUNpS0lDSUFOQkN6WUNqS0lDSUFOQmdjVUFPd0dRb2dJZ0EwSFY1Y3dBTmdLVW9nSWdBMEVMTmdLWW9nSWdBMEdGeFFBN0FaeWlBaUFEUWVEbHpBQTJBcUNpQWlBRFFRNDJBcVNpQWlBRFFZbkZBRHNCcUtJQ0lBTkI3dVhNQURZQ3JLSUNJQU5CRXpZQ3NLSUNJQU5CeHRVQU93RzBvZ0lnQTBHQjVzd0FOZ0s0b2dJZ0EwRVFOZ0s4b2dJZ0EwR0x4UUE3QWNDaUFpQURRWkhtekFBMkFzU2lBaUFEUVJBMkFzaWlBaUFEUWV6RkFEc0J6S0lDSUFOQm9lYk1BRFlDMEtJQ0lBTkJFVFlDMUtJQ0lBTkI3Y1VBT3dIWW9nSWdBMEd5NXN3QU5nTGNvZ0lnQTBFUE5nTGdvZ0lnQTBIcXhRQTdBZVNpQWlBRFFjSG16QUEyQXVpaUFpQURRUkEyQXV5aUFpQURRZXZGQURzQjhLSUNJQU5CMGViTUFEWUM5S0lDSUFOQkREWUMrS0lDSUFOQnJNVUFPd0g4b2dJZ0EwSGQ1c3dBTmdLQW93SWdBMEVMTmdLRW93SWdBMEgyQ2pzQmlLTUNJQU5CNk9iTUFEWUNqS01DSUFOQkJqWUNrS01DSUFOQnFja0FPd0dVb3dJZ0EwSHU1c3dBTmdLWW93SWdBMEVJTmdLY293SWdBMEd4NXdBN0FhQ2pBaUFEUWZibXpBQTJBcVNqQWlBRFFRazJBcWlqQWlBRFFmL0FBRHNCcktNQ0lBTkJ5WXpPQURZQ3NLTUNJQU5CQmpZQ3RLTUNJQU5COFFFN0FiaWpBaUFEUWNQRHp3QTJBcnlqQWlBRFFRSTJBc0NqQWlBRFFiMEhPd0hFb3dJZ0EwSC81c3dBTmdMSW93SWdBMEVLTmdMTW93SWdBMEhzNEFBN0FkQ2pBaUFEUVlubnpBQTJBdFNqQWlBRFFRbzJBdGlqQWlBRFFjemhBRHNCM0tNQ0lBTkJrK2ZNQURZQzRLTUNJQU5CRXpZQzVLTUNJQU5CaC84RE93SG9vd0lnQTBHbTU4d0FOZ0xzb3dJZ0EwRU1OZ0x3b3dJZ0EwRzhFenNCOUtNQ0lBTkJzdWZNQURZQytLTUNJQU5CQ1RZQy9LTUNJQU5CdkJJN0FZQ2tBaUFEUWJ2bnpBQTJBb1NrQWlBRFFRMDJBb2lrQWlBRFFid1ZPd0dNcEFJZ0EwSEk1OHdBTmdLUXBBSWdBMEVOTmdLVXBBSWdBMEc4RkRzQm1LUUNJQU5CcnYvTkFEWUNuS1FDSUFOQkNqWUNvS1FDSUFOQkl6c0JwS1FDSUFOQjFlZk1BRFlDcUtRQ0lBTkJFellDcktRQ0lBTkJnLzRET3dHd3BBSWdBMEhvNTh3QU5nSzBwQUlnQTBFUE5nSzRwQUlnQTBIZi9BTTdBYnlrQWlBRFFmZm56QUEyQXNDa0FpQURRUkEyQXNTa0FpQURRZlFHT3dISXBBSWdBMEdINk13QU5nTE1wQUlnQTBFVk5nTFFwQUlnQTBIMUJqc0IxS1FDSUFOQm5Pak1BRFlDMktRQ0lBTkJCallDM0tRQ0lBTkJsc0lBT3dIZ3BBSWdBMEdpNk13QU5nTGtwQUlnQTBFRE5nTG9wQUlnQTBIZ0N6c0I3S1FDSUFOQnBlak1BRFlDOEtRQ0lBTkJDVFlDOUtRQ0lBTkJ3UFlET3dINHBBSWdBMEd1Nk13QU5nTDhwQUlnQTBFUE5nS0FwUUlnQTBIQTlnTTdBWVNsQWlBRFFiM296QUEyQW9pbEFpQURRUWsyQW95bEFpQURRZUFMT3dHUXBRSWdBMEhHNk13QU5nS1VwUUlnQTBFSU5nS1lwUUlnQTBHMTV3QTdBWnlsQWlBRFFjN296QUEyQXFDbEFpQURRUWcyQXFTbEFpQURRYnZuQURzQnFLVUNJQU5CMXVqTUFEWUNyS1VDSUFOQkNqWUNzS1VDSUFOQm5oTTdBYlNsQWlBRFFlRG96QUEyQXJpbEFpQURRUWMyQXJ5bEFpQURRWjRTT3dIQXBRSWdBMEhuNk13QU5nTEVwUUlnQTBFTE5nTElwUUlnQTBHZUZUc0J6S1VDSUFOQjh1ak1BRFlDMEtVQ0lBTkJDellDMUtVQ0lBTkJuaFE3QWRpbEFpQURRY09CemdBMkF0eWxBaUFEUVFFMkF1Q2xBaUFEUWU4QU93SGtwUUlnQTBIdWlzNEFOZ0xvcFFJZ0EwRUdOZ0xzcFFJZ0EwSHpBVHNCOEtVQ0lBTkIvZWpNQURZQzlLVUNJQU5CQ0RZQytLVUNJQU5CclJ3N0FmeWxBaUFEUVlYcHpBQTJBb0NtQWlBRFFRYzJBb1NtQWlBRFFmVUVPd0dJcGdJZ0EwR002Y3dBTmdLTXBnSWdBMEVQTmdLUXBnSWdBMEhwQ1RzQmxLWUNJQU5CbStuTUFEWUNtS1lDSUFOQkZ6WUNuS1lDSUFOQjZ3azdBYUNtQWlBRFFiTHB6QUEyQXFTbUFpQURRUWcyQXFpbUFpQURRWk1UT3dHc3BnSWdBMEc2NmN3QU5nS3dwZ0lnQTBFSk5nSzBwZ0lnQTBHYjRnQTdBYmltQWlBRFFjUHB6QUEyQXJ5bUFpQURRUVkyQXNDbUFpQURRYzhDT3dIRXBnSWdBMEhKNmN3QU5nTElwZ0lnQTBFTE5nTE1wZ0lnQTBHUkVqc0IwS1lDSUFOQjFPbk1BRFlDMUtZQ0lBTkJEellDMktZQ0lBTkJrUlU3QWR5bUFpQURRZVBwekFBMkF1Q21BaUFEUVJRMkF1U21BaUFEUWNrU093SG9wZ0lnQTBIMzZjd0FOZ0xzcGdJZ0EwRVlOZ0x3cGdJZ0EwSEpGVHNCOUtZQ0lBTkJqK3JNQURZQytLWUNJQU5CQmpZQy9LWUNJQU5CMGdNN0FZQ25BaUFEUVpYcXpBQTJBb1NuQWlBRFFRYzJBb2luQWlBRFFkN0pBRHNCaktjQ0lBTkJ2b3pPQURZQ2tLY0NJQU5CQ3pZQ2xLY0NJQU5COUFFN0FaaW5BaUFEUVp6cXpBQTJBcHluQWlBRFFSQTJBcUNuQWlBRFFkRTlPd0drcHdJZ0EwR3M2c3dBTmdLb3B3SWdBMEVUTmdLc3B3SWdBMEhaUFRzQnNLY0NJQU5CdityTUFEWUN0S2NDSUFOQkVEWUN1S2NDSUFOQjB6MDdBYnluQWlBRFFjL3F6QUEyQXNDbkFpQURRUlEyQXNTbkFpQURRZFU5T3dISXB3SWdBMEhqNnN3QU5nTE1wd0lnQTBFUU5nTFFwd0lnQTBIWFBUc0IxS2NDSUFOQjgrck1BRFlDMktjQ0lBTkJDVFlDM0tjQ0lBTkJ2Z2c3QWVDbkFpQURRZnpxekFBMkF1U25BaUFEUVFrMkF1aW5BaUFEUWRFQ093SHNwd0lnQTBHRjY4d0FOZ0x3cHdJZ0EwRUpOZ0wwcHdJZ0EwR05CRHNCK0tjQ0lBTkJqdXZNQURZQy9LY0NJQU5CQlRZQ2dLZ0NJQU5Ca3hJN0FZU29BaUFEUWRTT3pnQTJBb2lvQWlBRFFRazJBb3lvQWlBRFFmWUJPd0dRcUFJZ0EwR1Q2OHdBTmdLVXFBSWdBMEVSTmdLWXFBSWdBMEhuQ1RzQm5LZ0NJQU5CcE92TUFEWUNvS2dDSUFOQkNUWUNwS2dDSUFOQnpUMDdBYWlvQWlBRFFZaUZ6Z0EyQXF5b0FpQURRUUkyQXJDb0FpQURRZE1DT3dHMHFBSWdBMEd0Njh3QU5nSzRxQUlnQTBFSU5nSzhxQUlnQTBIYTRnQTdBY0NvQWlBRFFicUV6Z0EyQXNTb0FpQURRUVkyQXNpb0FpQURRZHNGT3dITXFBSWdBMEcxNjh3QU5nTFFxQUlnQTBFSk5nTFVxQUlnQTBHb0Jqc0IyS2dDSUFOQm5vM09BRFlDM0tnQ0lBTkJCallDNEtnQ0lBTkI4Z0U3QWVTb0FpQURRYjdyekFBMkF1aW9BaUFEUVFrMkF1eW9BaUFEUVpNVk93SHdxQUlnQTBISDY4d0FOZ0wwcUFJZ0EwRUtOZ0w0cUFJZ0EwR0ZDenNCL0tnQ0lBTkIwZXZNQURZQ2dLa0NJQU5CQ1RZQ2hLa0NJQU5CeXVBQU93R0lxUUlnQTBIYTY4d0FOZ0tNcVFJZ0EwRUtOZ0tRcVFJZ0EwSFBQVHNCbEtrQ0lBTkI1T3ZNQURZQ21La0NJQU5CQlRZQ25La0NJQU5Cb1FNN0FhQ3BBaUFEUWVucnpBQTJBcVNwQWlBRFFRbzJBcWlwQWlBRFFkczlPd0dzcVFJZ0EwSHo2OHdBTmdLd3FRSWdBMEVOTmdLMHFRSWdBMEhqUFRzQnVLa0NJQU5CZ096TUFEWUN2S2tDSUFOQkNqWUN3S2tDSUFOQjNUMDdBY1NwQWlBRFFZcnN6QUEyQXNpcEFpQURRUTQyQXN5cEFpQURRZDg5T3dIUXFRSWdBMEdZN013QU5nTFVxUUlnQTBFS05nTFlxUUlnQTBIaFBUc0IzS2tDSUFOQndZdk9BRFlDNEtrQ0lBTkJEVFlDNUtrQ0lBTkIwUUk3QWVpcEFpQURRYUxzekFBMkF1eXBBaUFEUVFJMkF2Q3BBaUFEUWFNRE93SDBxUUlnQTBHazdNd0FOZ0w0cVFJZ0EwRU9OZ0w4cVFJZ0EwR1BCRHNCZ0tvQ0lBTkJzdXpNQURZQ2hLb0NJQU5CQ1RZQ2lLb0NJQU5CcXVFQU93R01xZ0lnQTBHNzdNd0FOZ0tRcWdJZ0EwRVNOZ0tVcWdJZ0EwSDEvZ003QVppcUFpQURRYzNzekFBMkFweXFBaUFEUVFjMkFxQ3FBaUFEUWRmaUFEc0JwS29DSUFOQjFPek1BRFlDcUtvQ0lBTkJDVFlDcktvQ0lBTkJxd3M3QWJDcUFpQURRZnlKemdBMkFyU3FBaUFEUVFjMkFyaXFBaUFEUWMwQ093RzhxZ0lnQTBIZDdNd0FOZ0xBcWdJZ0EwRU1OZ0xFcWdJZ0EwSFRQRHNCeUtvQ0lBTkI2ZXpNQURZQ3pLb0NJQU5CRERZQzBLb0NJQU5CMFR3N0FkU3FBaUFEUWZYc3pBQTJBdGlxQWlBRFFRWTJBdHlxQWlBRFFkQVNPd0hncWdJZ0EwSHJ3ODhBTmdMa3FnSWdBMEVGTmdMb3FnSWdBMEhKQnpzQjdLb0NJQU5CNWNQUEFEWUM4S29DSUFOQkJqWUM5S29DSUFOQjFnYzdBZmlxQWlBRFFmdnN6QUEyQXZ5cUFpQURRUTAyQW9DckFpQURRZUVJT3dHRXF3SWdBMEdJN2N3QU5nS0lxd0lnQTBFUU5nS01xd0lnQTBIM0JEc0JrS3NDSUFOQm1PM01BRFlDbEtzQ0lBTkJFallDbUtzQ0lBTkIrd2c3QVp5ckFpQURRYXJ0ekFBMkFxQ3JBaUFEUVJJMkFxU3JBaUFEUWYwSU93R29xd0lnQTBHODdjd0FOZ0tzcXdJZ0EwRUtOZ0t3cXdJZ0EwSE9CenNCdEtzQ0lBTkJ4dTNNQURZQ3VLc0NJQU5CQ2pZQ3ZLc0NJQU5CMEJVN0FjQ3JBaUFEUWNYRHp3QTJBc1NyQWlBRFFRYzJBc2lyQWlBRFFiOEhPd0hNcXdJZ0EwSFE3Y3dBTmdMUXF3SWdBMEVNTmdMVXF3SWdBMEhNQnpzQjJLc0NJQU5CM08zTUFEWUMzS3NDSUFOQkNqWUM0S3NDSUFOQnovNERPd0hrcXdJZ0EwR1JnTTRBTmdMb3F3SWdBMEVETmdMc3F3SWdBMEV4T3dId3F3SWdBMEhtN2N3QU5nTDBxd0lnQTBFSk5nTDRxd0lnQTBIaEREc0IvS3NDSUFOQjcrM01BRFlDZ0t3Q0lBTkJDallDaEt3Q0lBTkI1eE03QVlpc0FpQURRZm50ekFBMkFveXNBaUFEUVFrMkFwQ3NBaUFEUWVESUFEc0JsS3dDSUFOQmd1N01BRFlDbUt3Q0lBTkJHVFlDbkt3Q0lBTkJpczhBT3dHZ3JBSWdBMEdiN3N3QU5nS2tyQUlnQTBFSE5nS29yQUlnQTBIbkVqc0JyS3dDSUFOQm91N01BRFlDc0t3Q0lBTkJEallDdEt3Q0lBTkJwTUFBT3dHNHJBSWdBMEd3N3N3QU5nSzhyQUlnQTBFSk5nTEFyQUlnQTBIYndnQTdBY1NzQWlBRFFibnV6QUEyQXNpc0FpQURRUWsyQXN5c0FpQURRZHp0QXpzQjBLd0NJQU5Cd3U3TUFEWUMxS3dDSUFOQkN6WUMyS3dDSUFOQjV4VTdBZHlzQWlBRFFjM3V6QUEyQXVDc0FpQURRUXMyQXVTc0FpQURRZWNVT3dIb3JBSWdBMEhZN3N3QU5nTHNyQUlnQTBFTk5nTHdyQUlnQTBIaEREc0I5S3dDSUFOQnJvek9BRFlDK0t3Q0lBTkJCellDL0t3Q0lBTkJ2UUU3QVlDdEFpQURRZVh1ekFBMkFvU3RBaUFEUVFzMkFvaXRBaUFEUWFIZ0FEc0JqSzBDSUFOQjhPN01BRFlDa0swQ0lBTkJFellDbEswQ0lBTkJvT1FBT3dHWXJRSWdBMEdENzh3QU5nS2NyUUlnQTBFTE5nS2dyUUlnQTBHQndRQTdBYVN0QWlBRFFZN3Z6QUEyQXFpdEFpQURRUXcyQXF5dEFpQURRWkgrQXpzQnNLMENJQU5CbXUvTUFEWUN0SzBDSUFOQkV6WUN1SzBDSUFOQjlCTTdBYnl0QWlBRFFhM3Z6QUEyQXNDdEFpQURRUXMyQXNTdEFpQURRYkh1QXpzQnlLMENJQU5CdU8vTUFEWUN6SzBDSUFOQkNEWUMwSzBDSUFOQjlNZ0FPd0hVclFJZ0EwSEE3OHdBTmdMWXJRSWdBMEVKTmdMY3JRSWdBMEdJeVFBN0FlQ3RBaUFEUWNudnpBQTJBdVN0QWlBRFFRbzJBdWl0QWlBRFFmRU5Pd0hzclFJZ0EwSHZqTTRBTmdMd3JRSWdBMEVLTmdMMHJRSWdBMEc4QVRzQitLMENJQU5CMCsvTUFEWUMvSzBDSUFOQkNEWUNnSzRDSUFOQjhNSUFPd0dFcmdJZ0EwR1BqODRBTmdLSXJnSWdBMEVMTmdLTXJnSWdBMEc1QVRzQmtLNENJQU5CMisvTUFEWUNsSzRDSUFOQkJ6WUNtSzRDSUFOQjBSdzdBWnl1QWlBRFFlTHZ6QUEyQXFDdUFpQURRUWcyQXFTdUFpQURRZFBDQURzQnFLNENJQU5CNnUvTUFEWUNySzRDSUFOQkJ6WUNzSzRDSUFOQjZ3TTdBYlN1QWlBRFFmSHZ6QUEyQXJpdUFpQURRUTAyQXJ5dUFpQURRZTBET3dIQXJnSWdBMEgrNzh3QU5nTEVyZ0lnQTBFS05nTElyZ0lnQTBHVEZEc0J6SzRDSUFOQmlQRE1BRFlDMEs0Q0lBTkJEellDMUs0Q0lBTkJ5eFE3QWRpdUFpQURRWmZ3ekFBMkF0eXVBaUFEUVFVMkF1Q3VBaUFEUWRRRU93SGtyZ0lnQTBHYzhNd0FOZ0xvcmdJZ0EwRUdOZ0xzcmdJZ0EwR3F5UUE3QWZDdUFpQURRYUx3ekFBMkF2U3VBaUFEUVFvMkF2aXVBaUFEUWViTEFEc0IvSzRDSUFOQnJQRE1BRFlDZ0s4Q0lBTkJCallDaEs4Q0lBTkJwY1lBT3dHSXJ3SWdBMEhOaE00QU5nS01yd0lnQTBFTE5nS1Fyd0lnQTBHcUFUc0JsSzhDSUFOQjVvVE9BRFlDbUs4Q0lBTkJERFlDbks4Q0lBTkJ1Z0U3QWFDdkFpQURRYkx3ekFBMkFxU3ZBaUFEUVFvMkFxaXZBaUFEUVovRUFEc0JySzhDSUFOQnZQRE1BRFlDc0s4Q0lBTkJERFlDdEs4Q0lBTkJ1OFVBT3dHNHJ3SWdBMEhJOE13QU5nSzhyd0lnQTBFS05nTEFyd0lnQTBHU0Vqc0J4SzhDSUFOQjB2RE1BRFlDeUs4Q0lBTkJFellDeks4Q0lBTkJ5aEk3QWRDdkFpQURRWUtGemdBMkF0U3ZBaUFEUVFZMkF0aXZBaUFEUWZnQk93SGNyd0lnQTBIbDhNd0FOZ0xncndJZ0EwRUxOZ0xrcndJZ0EwSC9BenNCNks4Q0lBTkI4UERNQURZQzdLOENJQU5CRGpZQzhLOENJQU5CeWVBQU93SDByd0lnQTBIKzhNd0FOZ0w0cndJZ0EwRU9OZ0w4cndJZ0EwR3A0UUE3QVlDd0FpQURRWXp4ekFBMkFvU3dBaUFEUVJjMkFvaXdBaUFEUWV2K0F6c0JqTEFDSUFOQm8vSE1BRFlDa0xBQ0lBTkJERFlDbExBQ0lBTkIvd003QVppd0FpQURRYS94ekFBMkFweXdBaUFEUVFrMkFxQ3dBaUFEUWZEdEF6c0JwTEFDSUFOQnVQSE1BRFlDcUxBQ0lBTkJDallDckxBQ0lBTkIvd2c3QWJDd0FpQURRYytOemdBMkFyU3dBaUFEUVFZMkFyaXdBaUFEUWZVQk93RzhzQUlnQTBIQzhjd0FOZ0xBc0FJZ0EwRUxOZ0xFc0FJZ0EwSE5QRHNCeUxBQ0lBTkJ6ZkhNQURZQ3pMQUNJQU5CRGpZQzBMQUNJQU5Cenp3N0FkU3dBaUFEUWR2eHpBQTJBdGl3QWlBRFFRbzJBdHl3QWlBRFFhSGlBRHNCNExBQ0lBTkI1ZkhNQURZQzVMQUNJQU5CQ0RZQzZMQUNJQU5CdnNBQU93SHNzQUlnQTBIdDhjd0FOZ0x3c0FJZ0EwRVNOZ0wwc0FJZ0EwSEsvQU03QWZpd0FpQURRZi94ekFBMkF2eXdBaUFEUVFzMkFvQ3hBaUFEUVlVR093R0VzUUlnQTBHSzhzd0FOZ0tJc1FJZ0EwRU9OZ0tNc1FJZ0EwSEovQU03QVpDeEFpQURRWmp5ekFBMkFwU3hBaUFEUVE4MkFwaXhBaUFEUWN6OEF6c0JuTEVDSUFOQnAvTE1BRFlDb0xFQ0lBTkJERFlDcExFQ0lBTkJ5L3dET3dHb3NRSWdBMEd6OHN3QU5nS3NzUUlnQTBFSk5nS3dzUUlnQTBHdkFUc0J0TEVDSUFOQnZQTE1BRFlDdUxFQ0lBTkJFVFlDdkxFQ0lBTkJ5eE03QWNDeEFpQURRYzN5ekFBMkFzU3hBaUFEUVE0MkFzaXhBaUFEUWNzU093SE1zUUlnQTBIYjhzd0FOZ0xRc1FJZ0EwRVNOZ0xVc1FJZ0EwSExGVHNCMkxFQ0lBTkI3ZkxNQURZQzNMRUNJQU5CQlRZQzRMRUNJQU5CaThRQU93SGtzUUlnQTBIRWdjNEFOZ0xvc1FJZ0EwRUJOZ0xzc1FJZ0EwSHdBRHNCOExFQ0lBTkI4dkxNQURZQzlMRUNJQU5CRERZQytMRUNJQU5CZ09jQU93SDhzUUlnQTBIKzhzd0FOZ0tBc2dJZ0EwRU9OZ0tFc2dJZ0EwR3I1Z0E3QVlpeUFpQURRWXp6ekFBMkFveXlBaUFEUVFrMkFwQ3lBaUFEUWFvVE93R1VzZ0lnQTBHVjg4d0FOZ0tZc2dJZ0EwRUdOZ0tjc2dJZ0EwSFZQRHNCb0xJQ0lBTkJtL1BNQURZQ3BMSUNJQU5CQmpZQ3FMSUNJQU5CcWhJN0FheXlBaUFEUWFIenpBQTJBckN5QWlBRFFRZzJBclN5QWlBRFFkL0RBRHNCdUxJQ0lBTkJxZlBNQURZQ3ZMSUNJQU5CQmpZQ3dMSUNJQU5CM3NNQU93SEVzZ0lnQTBHdjg4d0FOZ0xJc2dJZ0EwRUtOZ0xNc2dJZ0EwR3FGVHNCMExJQ0lBTkJ1ZlBNQURZQzFMSUNJQU5CQ2pZQzJMSUNJQU5CcWhRN0FkeXlBaUFEUWNQenpBQTJBdUN5QWlBRFFRbzJBdVN5QWlBRFFmSGdBRHNCNkxJQ0lBTkJ6ZlBNQURZQzdMSUNJQU5CRFRZQzhMSUNJQU5Ccnh3N0FmU3lBaUFEUWRyenpBQTJBdml5QWlBRFFRbzJBdnl5QWlBRFFkSGhBRHNCZ0xNQ0lBTkI1UFBNQURZQ2hMTUNJQU5CR1RZQ2lMTUNJQU5CaEFrN0FZeXpBaUFEUWYzenpBQTJBcEN6QWlBRFFSQTJBcFN6QWlBRFFjQUpPd0dZc3dJZ0EwR045TXdBTmdLY3N3SWdBMEVOTmdLZ3N3SWdBMEgvNGdBN0FhU3pBaUFEUVl1RHpnQTJBcWl6QWlBRFFRazJBcXl6QWlBRFFiWUJPd0d3c3dJZ0EwR2E5TXdBTmdLMHN3SWdBMEVJTmdLNHN3SWdBMEdseEFBN0FieXpBaUFEUWRqL3pRQTJBc0N6QWlBRFFRazJBc1N6QWlBRFFTZzdBY2l6QWlBRFFhTDB6QUEyQXN5ekFpQURRUXcyQXRDekFpQURRU2c3QWRTekFpQURRYTcwekFBMkF0aXpBaUFEUVEwMkF0eXpBaUFEUVNnN0FlQ3pBaUFEUWJ2MHpBQTJBdVN6QWlBRFFSVTJBdWl6QWlBRFFiNzZBenNCN0xNQ0lBTkIwUFRNQURZQzhMTUNJQU5CRERZQzlMTUNJQU5CS0RzQitMTUNJQU5CM1BUTUFEWUMvTE1DSUFOQkRUWUNnTFFDSUFOQktEc0JoTFFDSUFOQm1zalBBRFlDaUxRQ0lBTkJDellDakxRQ0lBTkI3ZkVET3dHUXRBSWdBMEdQeU04QU5nS1V0QUlnQTBFTE5nS1l0QUlnQTBIczhRTTdBWnkwQWlBRFFlbjB6QUEyQXFDMEFpQURRUkUyQXFTMEFpQURRWTNCQURzQnFMUUNJQU5CK3ZUTUFEWUNyTFFDSUFOQkRUWUNzTFFDSUFOQktEc0J0TFFDSUFOQmgvWE1BRFlDdUxRQ0lBTkJFallDdkxRQ0lBTkJpUDRET3dIQXRBSWdBMEdaOWN3QU5nTEV0QUlnQTBFT05nTEl0QUlnQTBIWi9BTTdBY3kwQWlBRFFhZjF6QUEyQXRDMEFpQURRUkUyQXRTMEFpQURRZjNBQURzQjJMUUNJQU5CaE1qUEFEWUMzTFFDSUFOQkN6WUM0TFFDSUFOQjYvRURPd0hrdEFJZ0EwRzQ5Y3dBTmdMb3RBSWdBMEVSTmdMc3RBSWdBMEcxL0FNN0FmQzBBaUFEUWVIL3pRQTJBdlMwQWlBRFFRbzJBdmkwQWlBRFFTazdBZnkwQWlBRFFjbjF6QUEyQW9DMUFpQURRUTAyQW9TMUFpQURRU2s3QVlpMUFpQURRZGIxekFBMkFveTFBaUFEUVE0MkFwQzFBaUFEUVNrN0FaUzFBaUFEUWVUMXpBQTJBcGkxQWlBRFFSWTJBcHkxQWlBRFFiLzZBenNCb0xVQ0lBTkIrdlhNQURZQ3BMVUNJQU5CRFRZQ3FMVUNJQU5CS1RzQnJMVUNJQU5CaC9iTUFEWUNzTFVDSUFOQkRqWUN0TFVDSUFOQktUc0J1TFVDSUFOQnZjblBBRFlDdkxVQ0lBTkJERFlDd0xVQ0lBTkIrUEVET3dIRXRRSWdBMEd4eWM4QU5nTEl0UUlnQTBFTU5nTE10UUlnQTBIMzhRTTdBZEMxQWlBRFFaWDJ6QUEyQXRTMUFpQURRUkkyQXRpMUFpQURRWTdCQURzQjNMVUNJQU5CcC9iTUFEWUM0TFVDSUFOQkRqWUM1TFVDSUFOQktUc0I2TFVDSUFOQnRmYk1BRFlDN0xVQ0lBTkJFellDOExVQ0lBTkJpZjRET3dIMHRRSWdBMEhJOXN3QU5nTDR0UUlnQTBFUE5nTDh0UUlnQTBIYS9BTTdBWUMyQWlBRFFkZjJ6QUEyQW9TMkFpQURRUkkyQW9pMkFpQURRZjdBQURzQmpMWUNJQU5CcGNuUEFEWUNrTFlDSUFOQkREWUNsTFlDSUFOQjl2RURPd0dZdGdJZ0EwSHA5c3dBTmdLY3RnSWdBMEVTTmdLZ3RnSWdBMEcyL0FNN0FhUzJBaUFEUWRxSXpnQTJBcWkyQWlBRFFRczJBcXkyQWlBRFFZTEVBRHNCc0xZQ0lBTkIrL2JNQURZQ3RMWUNJQU5CQ3pZQ3VMWUNJQU5Cd0FzN0FieTJBaUFEUVliM3pBQTJBc0MyQWlBRFFRdzJBc1MyQWlBRFFaa0xPd0hJdGdJZ0EwR1M5OHdBTmdMTXRnSWdBMEVJTmdMUXRnSWdBMEdwNXdBN0FkUzJBaUFEUVpyM3pBQTJBdGkyQWlBRFFRVTJBdHkyQWlBRFFiY0xPd0hndGdJZ0EwR2Y5OHdBTmdMa3RnSWdBMEVITmdMb3RnSWdBMEczQ3pzQjdMWUNJQU5CcHZmTUFEWUM4TFlDSUFOQkJ6WUM5TFlDSUFOQnR3czdBZmkyQWlBRFFhMzN6QUEyQXZ5MkFpQURRUWMyQW9DM0FpQURRYmNMT3dHRXR3SWdBMEcwOTh3QU5nS0l0d0lnQTBFTE5nS010d0lnQTBHM0N6c0JrTGNDSUFOQnYvZk1BRFlDbExjQ0lBTkJFVFlDbUxjQ0lBTkJ0d3M3QVp5M0FpQURRZEQzekFBMkFxQzNBaUFEUVJJMkFxUzNBaUFEUWJjTE93R290d0lnQTBIaTk4d0FOZ0tzdHdJZ0EwRVBOZ0t3dHdJZ0EwRzNDenNCdExjQ0lBTkI4ZmZNQURZQ3VMY0NJQU5CQ3pZQ3ZMY0NJQU5Cb1FzN0FjQzNBaUFEUWZ6M3pBQTJBc1MzQWlBRFFRazJBc2kzQWlBRFFZYmlBRHNCekxjQ0lBTkJoZmpNQURZQzBMY0NJQU5CQnpZQzFMY0NJQU5CMzhrQU93SFl0d0lnQTBHTStNd0FOZ0xjdHdJZ0EwRUtOZ0xndHdJZ0EwSFhQRHNCNUxjQ0lBTkJsdmpNQURZQzZMY0NJQU5CQWpZQzdMY0NJQU5CNUFzN0FmQzNBaUFEUVpqNHpBQTJBdlMzQWlBRFFRbzJBdmkzQWlBRFFiOElPd0g4dHdJZ0EwR2krTXdBTmdLQXVBSWdBMEVJTmdLRXVBSWdBMEhFOWdNN0FZaTRBaUFEUWFyNHpBQTJBb3k0QWlBRFFRNDJBcEM0QWlBRFFjVDJBenNCbExnQ0lBTkJ1UGpNQURZQ21MZ0NJQU5CQ3pZQ25MZ0NJQU5CdStZQU93R2d1QUlnQTBIRCtNd0FOZ0trdUFJZ0EwRVROZ0tvdUFJZ0EwSEQ5Z003QWF5NEFpQURRZGI0ekFBMkFyQzRBaUFEUVFrMkFyUzRBaUFEUWY0TU93RzR1QUlnQTBIZitNd0FOZ0s4dUFJZ0EwRUxOZ0xBdUFJZ0EwSDZDanNCeExnQ0lBTkI2dmpNQURZQ3lMZ0NJQU5CQ0RZQ3pMZ0NJQU5CNUFzN0FkQzRBaUFEUWZMNHpBQTJBdFM0QWlBRFFRNDJBdGk0QWlBRFFkZjJBenNCM0xnQ0lBTkJnUG5NQURZQzRMZ0NJQU5CRURZQzVMZ0NJQU5CMlBZRE93SG91QUlnQTBHUStjd0FOZ0xzdUFJZ0EwRUtOZ0x3dUFJZ0EwSDY0QUE3QWZTNEFpQURRWnI1ekFBMkF2aTRBaUFEUVE4MkF2eTRBaUFEUWRuMkF6c0JnTGtDSUFOQnFmbk1BRFlDaExrQ0lBTkJDallDaUxrQ0lBTkIydUVBT3dHTXVRSWdBMEd6K2N3QU5nS1F1UUlnQTBFVU5nS1V1UUlnQTBHbkNUc0JtTGtDSUFOQngvbk1BRFlDbkxrQ0lBTkJERFlDb0xrQ0lBTkJ6dllET3dHa3VRSWdBMEcrLzgwQU5nS291UUlnQTBFSE5nS3N1UUlnQTBFbE93R3d1UUlnQTBIVCtjd0FOZ0swdVFJZ0EwRU5OZ0s0dVFJZ0EwSHFERHNCdkxrQ0lBTkI0UG5NQURZQ3dMa0NJQU5CRURZQ3hMa0NJQU5CaGY0RE93SEl1UUlnQTBIdytjd0FOZ0xNdVFJZ0EwRU1OZ0xRdVFJZ0EwSHEvQU03QWRTNUFpQURRWUtBemdBMkF0aTVBaUFEUVFZMkF0eTVBaUFEUVM0N0FlQzVBaUFEUWZ6NXpBQTJBdVM1QWlBRFFRNDJBdWk1QWlBRFFZa0xPd0hzdVFJZ0EwSDlnczRBTmdMd3VRSWdBMEVPTmdMMHVRSWdBMEczQVRzQitMa0NJQU5CaXZyTUFEWUMvTGtDSUFOQkR6WUNnTG9DSUFOQjRmNERPd0dFdWdJZ0EwR1orc3dBTmdLSXVnSWdBMEVPTmdLTXVnSWdBMEhuN1FNN0FaQzZBaUFEUWFmNnpBQTJBcFM2QWlBRFFRODJBcGk2QWlBRFFZNytBenNCbkxvQ0lBTkJ0dnJNQURZQ29Mb0NJQU5CQ3pZQ3BMb0NJQU5CMHZ3RE93R291Z0lnQTBIQitzd0FOZ0tzdWdJZ0EwRU9OZ0t3dWdJZ0EwSG83UU03QWJTNkFpQURRYy82ekFBMkFyaTZBaUFEUVJNMkFyeTZBaUFEUWNJR093SEF1Z0lnQTBIaStzd0FOZ0xFdWdJZ0EwRU9OZ0xJdWdJZ0EwSGUxQUE3QWN5NkFpQURRZmZDendBMkF0QzZBaUFEUVEwMkF0UzZBaUFEUWFYRkFEc0IyTG9DSUFOQjhQck1BRFlDM0xvQ0lBTkJEallDNExvQ0lBTkJzY0FBT3dIa3VnSWdBMEhYZzg0QU5nTG91Z0lnQTBFTE5nTHN1Z0lnQTBHd3dBQTdBZkM2QWlBRFFmNzZ6QUEyQXZTNkFpQURRUVkyQXZpNkFpQURRYWZCQURzQi9Mb0NJQU5CaFB2TUFEWUNnTHNDSUFOQkNEWUNoTHNDSUFOQml1Y0FPd0dJdXdJZ0EwR00rOHdBTmdLTXV3SWdBMEVLTmdLUXV3SWdBMEdyRXpzQmxMc0NJQU5CbHZ2TUFEWUNtTHNDSUFOQkJ6WUNuTHNDSUFOQnF4STdBYUM3QWlBRFFaMzd6QUEyQXFTN0FpQURRUXMyQXFpN0FpQURRYXNWT3dHc3V3SWdBMEdvKzh3QU5nS3d1d0lnQTBFTE5nSzB1d0lnQTBHckZEc0J1THNDSUFOQnBjUFBBRFlDdkxzQ0lBTkJBellDd0xzQ0lBTkJ4Z2M3QWNTN0FpQURRYlREendBMkFzaTdBaUFEUVFRMkFzeTdBaUFEUWRVSE93SFF1d0lnQTBHeis4d0FOZ0xVdXdJZ0EwRVVOZ0xZdXdJZ0EwSDY1QUE3QWR5N0FpQURRY2Y3ekFBMkF1QzdBaUFEUVJNMkF1UzdBaUFEUVpya0FEc0I2THNDSUFOQjJ2dk1BRFlDN0xzQ0lBTkJFellDOExzQ0lBTkI3T1FBT3dIMHV3SWdBMEh0Kzh3QU5nTDR1d0lnQTBFTk5nTDh1d0lnQTBITjRnQTdBWUM4QWlBRFFmcjd6QUEyQW9TOEFpQURRUkkyQW9pOEFpQURRWXprQURzQmpMd0NJQU5CalB6TUFEWUNrTHdDSUFOQkNEWUNsTHdDSUFOQitBUTdBWmk4QWlBRFFaVDh6QUEyQXB5OEFpQURRUXMyQXFDOEFpQURRYm9jT3dHa3ZBSWdBMEdmL013QU5nS292QUlnQTBFT05nS3N2QUlnQTBIVkJ6c0JzTHdDSUFOQnJmek1BRFlDdEx3Q0lBTkJCVFlDdUx3Q0lBTkJwUU03QWJ5OEFpQURRYkw4ekFBMkFzQzhBaUFEUVFzMkFzUzhBaUFEUVo0Y093SEl2QUlnQTBHOS9Nd0FOZ0xNdkFJZ0EwRU1OZ0xRdkFJZ0EwR2NIRHNCMUx3Q0lBTkJ5ZnpNQURZQzJMd0NJQU5CRGpZQzNMd0NJQU5Cb0J3N0FlQzhBaUFEUWN6RHp3QTJBdVM4QWlBRFFRSTJBdWk4QWlBRFFjQUhPd0hzdkFJZ0EwSFgvTXdBTmdMd3ZBSWdBMEVETmdMMHZBSWdBMEhXQnpzQitMd0NJQU5CMnZ6TUFEWUMvTHdDSUFOQkVqWUNnTDBDSUFOQjgrUUFPd0dFdlFJZ0EwSHMvTXdBTmdLSXZRSWdBMEVSTmdLTXZRSWdBMEdUNUFBN0FaQzlBaUFEUWYzOHpBQTJBcFM5QWlBRFFSQTJBcGk5QWlBRFFmYmlBRHNCbkwwQ0lBTkJqZjNNQURZQ29MMENJQU5CRVRZQ3BMMENJQU5CNWVRQU93R292UUlnQTBHZS9jd0FOZ0tzdlFJZ0EwRVJOZ0t3dlFJZ0EwSHk0Z0E3QWJTOUFpQURRYS85ekFBMkFyaTlBaUFEUVFzMkFyeTlBaUFEUWNMaUFEc0J3TDBDSUFOQnV2M01BRFlDeEwwQ0lBTkJFRFlDeUwwQ0lBTkJoZVFBT3dITXZRSWdBMEhLL2N3QU5nTFF2UUlnQTBFVk5nTFV2UUlnQTBIMDRnQTdBZGk5QWlBRFFkLzl6QUEyQXR5OUFpQURRUTgyQXVDOUFpQURRY1RpQURzQjVMMENJQU5CN3YzTUFEWUM2TDBDSUFOQkZUWUM3TDBDSUFOQjllSUFPd0h3dlFJZ0EwR0Qvc3dBTmdMMHZRSWdBMEVTTmdMNHZRSWdBMEgzNGdBN0FmeTlBaUFEUVpYK3pBQTJBb0MrQWlBRFFSRTJBb1MrQWlBRFFmUGlBRHNCaUw0Q0lBTkJwdjdNQURZQ2pMNENJQU5CQ2pZQ2tMNENJQU5COU9BQU93R1V2Z0lnQTBHdy9zd0FOZ0tZdmdJZ0EwRUtOZ0tjdmdJZ0EwSFU0UUE3QWFDK0FpQURRYnIrekFBMkFxUytBaUFEUVEwMkFxaStBaUFEUWRZSE93R3N2Z0lnQTBISC9zd0FOZ0t3dmdJZ0EwRU1OZ0swdmdJZ0EwR0RDenNCdUw0Q0lBTkIwLzdNQURZQ3ZMNENJQU5CRFRZQ3dMNENJQU5CajhJQU93SEV2Z0lnQTBIZy9zd0FOZ0xJdmdJZ0EwRU9OZ0xNdmdJZ0EwR1B3Z0E3QWRDK0FpQURRZlAvelFBMkF0UytBaUFEUVFRMkF0aStBaUFEUVNzN0FkeStBaUFEUWU3K3pBQTJBdUMrQWlBRFFRdzJBdVMrQWlBRFFaOEdPd0hvdmdJZ0EwSDYvc3dBTmdMc3ZnSWdBMEVLTmdMd3ZnSWdBMEdWeFFBN0FmUytBaUFEUVlUL3pBQTJBdmkrQWlBRFFRZzJBdnkrQWlBRFFTczdBWUMvQWlBRFFidUp6Z0EyQW9TL0FpQURRUWsyQW9pL0FpQURRYkVCT3dHTXZ3SWdBMEdNLzh3QU5nS1F2d0lnQTBFSE5nS1V2d0lnQTBIV0JUc0JtTDhDSUFOQmsvL01BRFlDbkw4Q0lBTkJEVFlDb0w4Q0lBTkJpLzRET3dHa3Z3SWdBMEdnLzh3QU5nS292d0lnQTBFSk5nS3N2d0lnQTBIaS9BTTdBYkMvQWlBRFFhbi96QUEyQXJTL0FpQURRUXcyQXJpL0FpQURRZnJBQURzQnZMOENJQU5CdGYvTUFEWUN3TDhDSUFOQkNqWUN4TDhDSUFOQjBQNERPd0hJdndJZ0EwRy8vOHdBTmdMTXZ3SWdBMEVJTmdMUXZ3SWdBMEhZNXdBN0FkUy9BaUFEUWNmL3pBQTJBdGkvQWlBRFFRbzJBdHkvQWlBRFFmM2dBRHNCNEw4Q0lBTkIwZi9NQURZQzVMOENJQU5CRmpZQzZMOENJQU5Cbjh3QU93SHN2d0lnQTBIbi84d0FOZ0x3dndJZ0EwRVdOZ0wwdndJZ0EwR2N6QUE3QWZpL0FpQURRZjMvekFBMkF2eS9BaUFEUVJjMkFvREFBaUFEUVo3TUFEc0JoTUFDSUFOQmxJRE5BRFlDaU1BQ0lBTkJGRFlDak1BQ0lBTkJuY3dBT3dHUXdBSWdBMEdvZ00wQU5nS1V3QUlnQTBFS05nS1l3QUlnQTBIZDRRQTdBWnpBQWlBRFFiS0F6UUEyQXFEQUFpQURRUWsyQXFUQUFpQURRWnNjT3dHb3dBSWdBMEc3Z00wQU5nS3N3QUlnQTBFS05nS3d3QUlnQTBHUzRBQTdBYlRBQWlBRFFjV0F6UUEyQXJqQUFpQURRUTQyQXJ6QUFpQURRYURnQURzQndNQUNJQU5CMDRETkFEWUN4TUFDSUFOQkJqWUN5TUFDSUFOQnE4a0FPd0hNd0FJZ0EwSFpnTTBBTmdMUXdBSWdBMEVRTmdMVXdBSWdBMEc1MVFBN0FkakFBaUFEUWVtQXpRQTJBdHpBQWlBRFFSRTJBdURBQWlBRFFiWFZBRHNCNU1BQ0lBTkIrb0ROQURZQzZNQUNJQU5CRWpZQzdNQUNJQU5CNk1VQU93SHd3QUlnQTBHTWdjMEFOZ0wwd0FJZ0EwRUlOZ0w0d0FJZ0EwSDZ4QUE3QWZ6QUFpQURRWlNCelFBMkFvREJBaUFEUVEwMkFvVEJBaUFEUWZ6RUFEc0JpTUVDSUFOQm9ZSE5BRFlDak1FQ0lBTkJEellDa01FQ0lBTkIvTVFBT3dHVXdRSWdBMEd3Z2MwQU5nS1l3UUlnQTBFUE5nS2N3UUlnQTBIK3hBQTdBYURCQWlBRFFiK0J6UUEyQXFUQkFpQURRUXcyQXFqQkFpQURRWjdDQURzQnJNRUNJQU5CeTRITkFEWUNzTUVDSUFOQkJUWUN0TUVDSUFOQnNzQUFPd0c0d1FJZ0EwSFFnYzBBTmdLOHdRSWdBMEVJTmdMQXdRSWdBMEc1QlRzQnhNRUNJQU5CMklITkFEWUN5TUVDSUFOQkREWUN6TUVDSUFOQnRjQUFPd0hRd1FJZ0EwSGtnYzBBTmdMVXdRSWdBMEVOTmdMWXdRSWdBMEcxd0FBN0FkekJBaUFEUWZuR3p3QTJBdURCQWlBRFFRYzJBdVRCQWlBRFFZL0VBRHNCNk1FQ0lBTkI4WUhOQURZQzdNRUNJQU5CRGpZQzhNRUNJQU5CajhRQU93SDB3UUlnQTBIL2djMEFOZ0w0d1FJZ0EwRUxOZ0w4d1FJZ0EwR1B4QUE3QVlEQ0FpQURRWXFDelFBMkFvVENBaUFEUVFvMkFvakNBaUFEUVlYR0FEc0JqTUlDSUFOQmxJTE5BRFlDa01JQ0lBTkJEVFlDbE1JQ0lBTkIvT0VBT3dHWXdnSWdBMEdoZ3MwQU5nS2N3Z0lnQTBFSk5nS2d3Z0lnQTBHWXhnQTdBYVRDQWlBRFFackd6d0EyQXFqQ0FpQURRUXcyQXF6Q0FpQURRWUxGQURzQnNNSUNJQU5COWNYUEFEWUN0TUlDSUFOQkRqWUN1TUlDSUFOQmc4VUFPd0c4d2dJZ0EwR3FnczBBTmdMQXdnSWdBMEVLTmdMRXdnSWdBMEczeEFBN0FjakNBaUFEUWQzRXp3QTJBc3pDQWlBRFFRdzJBdERDQWlBRFFaM0VBRHNCMU1JQ0lBTkI4c1BQQURZQzJNSUNJQU5CQXpZQzNNSUNJQU5CeUFjN0FlRENBaUFEUWJTQ3pRQTJBdVRDQWlBRFFRczJBdWpDQWlBRFFmRUlPd0hzd2dJZ0EwRy9nczBBTmdMd3dnSWdBMEVZTmdMMHdnSWdBMEdHQ1RzQitNSUNJQU5CMTRMTkFEWUMvTUlDSUFOQkNEWUNnTU1DSUFOQnNPY0FPd0dFd3dJZ0EwSGZnczBBTmdLSXd3SWdBMEVLTmdLTXd3SWdBMEgzNEFBN0FaRERBaUFEUWVtQ3pRQTJBcFREQWlBRFFRbzJBcGpEQWlBRFFkZmhBRHNCbk1NQ0lBTkI4NExOQURZQ29NTUNJQU5CQ1RZQ3BNTUNJQU5CbE1BQU93R293d0lnQTBIOGdzMEFOZ0tzd3dJZ0EwRUlOZ0t3d3dJZ0EwRzA1d0E3QWJUREFpQURRWVNEelFBMkFyakRBaUFEUVFnMkFyekRBaUFEUWJybkFEc0J3TU1DSUFOQnhZSE9BRFlDeE1NQ0lBTkJBVFlDeU1NQ0lBTkI4UUE3QWN6REFpQURRWXlEelFBMkF0RERBaUFEUVFZMkF0VERBaUFEUWRnU093SFl3d0lnQTBHU2c4MEFOZ0xjd3dJZ0EwRUxOZ0xnd3dJZ0EwR29DenNCNU1NQ0lBTkJuWVBOQURZQzZNTUNJQU5CQ1RZQzdNTUNJQU5Cd2d3N0FmRERBaUFEUWFhRHpRQTJBdlREQWlBRFFRNDJBdmpEQWlBRFFkYjlBenNCL01NQ0lBTkJ0SVBOQURZQ2dNUUNJQU5CRURZQ2hNUUNJQU5CMS8wRE93R0l4QUlnQTBIRWc4MEFOZ0tNeEFJZ0EwRVBOZ0tReEFJZ0EwSFkvUU03QVpURUFpQURRZE9EelFBMkFwakVBaUFEUVFZMkFwekVBaUFEUWJnTE93R2d4QUlnQTBIWmc4MEFOZ0treEFJZ0EwRUlOZ0tveEFJZ0EwRzRDenNCck1RQ0lBTkI0WVBOQURZQ3NNUUNJQU5CQ0RZQ3RNUUNJQU5CdUFzN0FiakVBaUFEUWVtRHpRQTJBcnpFQWlBRFFRZzJBc0RFQWlBRFFiZ0xPd0hFeEFJZ0EwSHhnODBBTmdMSXhBSWdBMEVJTmdMTXhBSWdBMEc0Q3pzQjBNUUNJQU5CK1lQTkFEWUMxTVFDSUFOQkNEWUMyTVFDSUFOQnVBczdBZHpFQWlBRFFZR0V6UUEyQXVERUFpQURRUWcyQXVURUFpQURRYmdMT3dIb3hBSWdBMEdKaE0wQU5nTHN4QUlnQTBFSU5nTHd4QUlnQTBHNEN6c0I5TVFDSUFOQmtZVE5BRFlDK01RQ0lBTkJERFlDL01RQ0lBTkJ1QXM3QVlERkFpQURRWjJFelFBMkFvVEZBaUFEUVJJMkFvakZBaUFEUWJnTE93R014UUlnQTBHdmhNMEFOZ0tReFFJZ0EwRVJOZ0tVeFFJZ0EwRzRDenNCbU1VQ0lBTkJ3SVROQURZQ25NVUNJQU5CRnpZQ29NVUNJQU5CdUFzN0FhVEZBaUFEUWRlRXpRQTJBcWpGQWlBRFFSZzJBcXpGQWlBRFFiZ0xPd0d3eFFJZ0EwSHZoTTBBTmdLMHhRSWdBMEVWTmdLNHhRSWdBMEc0Q3pzQnZNVUNJQU5CaElYTkFEWUN3TVVDSUFOQkV6WUN4TVVDSUFOQnVBczdBY2pGQWlBRFFaZUZ6UUEyQXN6RkFpQURRUkEyQXRERkFpQURRYmdMT3dIVXhRSWdBMEduaGMwQU5nTFl4UUlnQTBFUU5nTGN4UUlnQTBHZkN6c0I0TVVDSUFOQnQ0WE5BRFlDNU1VQ0lBTkJDVFlDNk1VQ0lBTkJrZUlBT3dIc3hRSWdBMEhBaGMwQU5nTHd4UUlnQTBFSE5nTDB4UUlnQTBIZ3lRQTdBZmpGQWlBRFFjZUZ6UUEyQXZ6RkFpQURRUVUyQW9ER0FpQURRYUFGT3dHRXhnSWdBMEhNaGMwQU5nS0l4Z0lnQTBFS05nS014Z0lnQTBIUi9nTTdBWkRHQWlBRFFkYUZ6UUEyQXBUR0FpQURRUU0yQXBqR0FpQURRZWNMT3dHY3hnSWdBMEhaaGMwQU5nS2d4Z0lnQTBFSk5nS2t4Z0lnQTBISDlnTTdBYWpHQWlBRFFlS0Z6UUEyQXF6R0FpQURRUTgyQXJER0FpQURRY2YyQXpzQnRNWUNJQU5COFlYTkFEWUN1TVlDSUFOQkRUWUN2TVlDSUFOQjV3czdBY0RHQWlBRFFmNkZ6UUEyQXNUR0FpQURRUk0yQXNqR0FpQURRZWNMT3dITXhnSWdBMEdSaHMwQU5nTFF4Z0lnQTBFTk5nTFV4Z0lnQTBIbkN6c0IyTVlDSUFOQm5vYk5BRFlDM01ZQ0lBTkJFellDNE1ZQ0lBTkI1d3M3QWVUR0FpQURRYkdHelFBMkF1akdBaUFEUVFrMkF1ekdBaUFEUWVjTE93SHd4Z0lnQTBHNmhzMEFOZ0wweGdJZ0EwRUlOZ0w0eGdJZ0EwSG5DenNCL01ZQ0lBTkJ3b2JOQURZQ2dNY0NJQU5CRGpZQ2hNY0NJQU5CNXdzN0FZakhBaUFEUWRDR3pRQTJBb3pIQWlBRFFRZzJBcERIQWlBRFFlY0xPd0dVeHdJZ0EwSFloczBBTmdLWXh3SWdBMEVPTmdLY3h3SWdBMEhuQ3pzQm9NY0NJQU5CNW9iTkFEWUNwTWNDSUFOQkNEWUNxTWNDSUFOQjV3czdBYXpIQWlBRFFlNkd6UUEyQXJESEFpQURRUTQyQXJUSEFpQURRZWNMT3dHNHh3SWdBMEg4aHMwQU5nSzh4d0lnQTBFSk5nTEF4d0lnQTBIbkN6c0J4TWNDSUFOQmhZZk5BRFlDeU1jQ0lBTkJEellDek1jQ0lBTkI1d3M3QWRESEFpQURRWlNIelFBMkF0VEhBaUFEUVFrMkF0akhBaUFEUWVjTE93SGN4d0lnQTBHZGg4MEFOZ0xneHdJZ0EwRVBOZ0xreHdJZ0EwSG5DenNCNk1jQ0lBTkJySWZOQURZQzdNY0NJQU5CQ0RZQzhNY0NJQU5CNXdzN0FmVEhBaUFEUWJTSHpRQTJBdmpIQWlBRFFRNDJBdnpIQWlBRFFlY0xPd0dBeUFJZ0EwSENoODBBTmdLRXlBSWdBMEVJTmdLSXlBSWdBMEhuQ3pzQmpNZ0NJQU5CeW9mTkFEWUNrTWdDSUFOQkRqWUNsTWdDSUFOQjV3czdBWmpJQWlBRFFkaUh6UUEyQXB6SUFpQURRUWcyQXFESUFpQURRZWNMT3dHa3lBSWdBMEhnaDgwQU5nS295QUlnQTBFT05nS3N5QUlnQTBIbkN6c0JzTWdDSUFOQjdvZk5BRFlDdE1nQ0lBTkJCallDdU1nQ0lBTkJyTWtBT3dHOHlBSWdBMEgwaDgwQU5nTEF5QUlnQTBFTE5nTEV5QUlnQTBIcHpBQTdBY2pJQWlBRFFmK0h6UUEyQXN6SUFpQURRUVkyQXRESUFpQURRYnNMT3dIVXlBSWdBMEdGaU0wQU5nTFl5QUlnQTBFSU5nTGN5QUlnQTBHN0N6c0I0TWdDSUFOQmpZak5BRFlDNU1nQ0lBTkJDRFlDNk1nQ0lBTkJ1d3M3QWV6SUFpQURRWldJelFBMkF2RElBaUFEUVFnMkF2VElBaUFEUWJzTE93SDR5QUlnQTBHZGlNMEFOZ0w4eUFJZ0EwRU1OZ0tBeVFJZ0EwRzdDenNCaE1rQ0lBTkJxWWpOQURZQ2lNa0NJQU5CRWpZQ2pNa0NJQU5CdXdzN0FaREpBaUFEUWJ1SXpRQTJBcFRKQWlBRFFSTTJBcGpKQWlBRFFic0xPd0djeVFJZ0EwSE9pTTBBTmdLZ3lRSWdBMEVRTmdLa3lRSWdBMEc3Q3pzQnFNa0NJQU5CMDRET0FEWUNyTWtDSUFOQkNEWUNzTWtDSUFOQlB6c0J0TWtDSUFOQjNvak5BRFlDdU1rQ0lBTkJEallDdk1rQ0lBTkJud3c3QWNESkFpQURRZXlJelFBMkFzVEpBaUFEUVJBMkFzakpBaUFEUWQ0S093SE15UUlnQTBIaWc4NEFOZ0xReVFJZ0EwRU1OZ0xVeVFJZ0EwRy9BVHNCMk1rQ0lBTkIvSWpOQURZQzNNa0NJQU5CRVRZQzRNa0NJQU5Cdis4RE93SGt5UUlnQTBHTmljMEFOZ0xveVFJZ0EwRU5OZ0xzeVFJZ0EwSCtCanNCOE1rQ0lBTkJtb25OQURZQzlNa0NJQU5CRVRZQytNa0NJQU5Cbi80RE93SDh5UUlnQTBHcmljMEFOZ0tBeWdJZ0EwRU5OZ0tFeWdJZ0EwRy83Z003QVlqS0FpQURRYWIvelFBMkFvektBaUFEUVFnMkFwREtBaUFEUVNJN0FaVEtBaUFEUWFpRHpnQTJBcGpLQWlBRFFRdzJBcHpLQWlBRFFaN0FBRHNCb01vQ0lBTkJzSUxPQURZQ3BNb0NJQU5CRERZQ3FNb0NJQU5Cbk1BQU93R3N5Z0lnQTBHNGljMEFOZ0t3eWdJZ0EwRVJOZ0sweWdJZ0EwR0MvZ003QWJqS0FpQURRY21KelFBMkFyektBaUFEUVEwMkFzREtBaUFEUVo3Z0FEc0J4TW9DSUFOQjFvbk5BRFlDeU1vQ0lBTkJGVFlDek1vQ0lBTkJuZUFBT3dIUXlnSWdBMEcwZzg0QU5nTFV5Z0lnQTBFTk5nTFl5Z0lnQTBHZHdBQTdBZHpLQWlBRFFheUJ6Z0EyQXVES0FpQURRUWsyQXVUS0FpQURRWmpBQURzQjZNb0NJQU5CNjRuTkFEWUM3TW9DSUFOQkVUWUM4TW9DSUFOQm04QUFPd0gweWdJZ0EwSDhpYzBBTmdMNHlnSWdBMEVOTmdMOHlnSWdBMEdid0FBN0FZRExBaUFEUWM3L3pRQTJBb1RMQWlBRFFRbzJBb2pMQWlBRFFabkFBRHNCak1zQ0lBTkJpWXJOQURZQ2tNc0NJQU5CQ3pZQ2xNc0NJQU5CeVFJN0FaakxBaUFEUVpxRHpnQTJBcHpMQWlBRFFRNDJBcURMQWlBRFFackFBRHNCcE1zQ0lBTkJwWUxPQURZQ3FNc0NJQU5CQ3pZQ3JNc0NJQU5CSnpzQnNNc0NJQU5CbElyTkFEWUN0TXNDSUFOQkZEWUN1TXNDSUFOQmgvNERPd0c4eXdJZ0EwSEdnYzRBTmdMQXl3SWdBMEVCTmdMRXl3SWdBMEh5QURzQnlNc0NJQU5CcUlyTkFEWUN6TXNDSUFOQkNqWUMwTXNDSUFOQi9BbzdBZFRMQWlBRFFiS0t6UUEyQXRqTEFpQURRUWsyQXR6TEFpQURRYkFUT3dIZ3l3SWdBMEgyaWM0QU5nTGt5d0lnQTBFR05nTG95d0lnQTBIVkFqc0I3TXNDSUFOQnU0ck5BRFlDOE1zQ0lBTkJCallDOU1zQ0lBTkJzQkk3QWZqTEFpQURRYkNOemdBMkF2ekxBaUFEUVFjMkFvRE1BaUFEUVpyRUFEc0JoTXdDSUFOQndZck5BRFlDaU13Q0lBTkJDallDak13Q0lBTkJtc1FBT3dHUXpBSWdBMEhMaXMwQU5nS1V6QUlnQTBFTE5nS1l6QUlnQTBHYXhBQTdBWnpNQWlBRFFkYUt6UUEyQXFETUFpQURRUW8yQXFUTUFpQURRWnJFQURzQnFNd0NJQU5CNElyTkFEWUNyTXdDSUFOQkN6WUNzTXdDSUFOQm1zUUFPd0cwekFJZ0EwSHJpczBBTmdLNHpBSWdBMEVKTmdLOHpBSWdBMEdheEFBN0FjRE1BaUFEUVlURHp3QTJBc1RNQWlBRFFRazJBc2pNQWlBRFFlWHhBenNCek13Q0lBTkI5SXJOQURZQzBNd0NJQU5CQ1RZQzFNd0NJQU5CbXNRQU93SFl6QUlnQTBIOWlzMEFOZ0xjekFJZ0EwRU5OZ0xnekFJZ0EwR2F4QUE3QWVUTUFpQURRWXFMelFBMkF1ak1BaUFEUVE0MkF1ek1BaUFEUWE3bkFEc0I4TXdDSUFOQm1Jdk5BRFlDOU13Q0lBTkJGVFlDK013Q0lBTkJyK2NBT3dIOHpBSWdBMEd0aTgwQU5nS0F6UUlnQTBFSk5nS0V6UUlnQTBHdDV3QTdBWWpOQWlBRFFiYUx6UUEyQW96TkFpQURRUVEyQXBETkFpQURRYjhMT3dHVXpRSWdBMEc2aTgwQU5nS1l6UUlnQTBFS05nS2N6UUlnQTBHL0N6c0JvTTBDSUFOQnhJdk5BRFlDcE0wQ0lBTkJDallDcU0wQ0lBTkJzQlU3QWF6TkFpQURRYzZMelFBMkFyRE5BaUFEUVFvMkFyVE5BaUFEUWJBVU93RzR6UUlnQTBIWWk4MEFOZ0s4elFJZ0EwRUtOZ0xBelFJZ0EwR0o0UUE3QWNUTkFpQURRZUtMelFBMkFzak5BaUFEUVFvMkFzek5BaUFEUWVuaEFEc0IwTTBDSUFOQjdJdk5BRFlDMU0wQ0lBTkJFellDMk0wQ0lBTkJsLzhET3dIY3pRSWdBMEgvaTgwQU5nTGd6UUlnQTBFV05nTGt6UUlnQTBIeEV6c0I2TTBDSUFOQmxZek5BRFlDN00wQ0lBTkJGellDOE0wQ0lBTkI4Qk03QWZUTkFpQURRYXlNelFBMkF2ak5BaUFEUVFnMkF2ek5BaUFEUWVRRU93R0F6Z0lnQTBHMGpNMEFOZ0tFemdJZ0EwRUpOZ0tJemdJZ0EwR1R3QUE3QVl6T0FpQURRYjJNelFBMkFwRE9BaUFEUVFVMkFwVE9BaUFEUWJiRUFEc0JtTTRDSUFOQndvek5BRFlDbk00Q0lBTkJDVFlDb000Q0lBTkJsdUlBT3dHa3pnSWdBMEhsaDg0QU5nS296Z0lnQTBFR05nS3N6Z0lnQTBIWkFqc0JzTTRDSUFOQnk0ek5BRFlDdE00Q0lBTkJDRFlDdU00Q0lBTkIxd0k3QWJ6T0FpQURRZE9NelFBMkFzRE9BaUFEUVFjMkFzVE9BaUFEUWVISkFEc0J5TTRDSUFOQnZZM09BRFlDek00Q0lBTkJERFlDME00Q0lBTkIxd0k3QWRUT0FpQURRZHFNelFBMkF0ak9BaUFEUVFrMkF0ek9BaUFEUVpFRU93SGd6Z0lnQTBIampNMEFOZ0xremdJZ0EwRUtOZ0xvemdJZ0EwSFpQRHNCN000Q0lBTkI3WXpOQURZQzhNNENJQU5CQ1RZQzlNNENJQU5CMnp3N0Fmak9BaUFEUWZhTXpRQTJBdnpPQWlBRFFRODJBb0RQQWlBRFFkMDhPd0dFendJZ0EwR0ZqYzBBTmdLSXp3SWdBMEVOTmdLTXp3SWdBMEc3d0FBN0FaRFBBaUFEUWFiR3p3QTJBcFRQQWlBRFFRdzJBcGpQQWlBRFFZYkZBRHNCbk04Q0lBTkJnOGJQQURZQ29NOENJQU5CRGpZQ3BNOENJQU5CaDhVQU93R296d0lnQTBITmljNEFOZ0tzendJZ0EwRUtOZ0t3endJZ0EwR3VBVHNCdE04Q0lBTkIzc2ZQQURZQ3VNOENJQU5CRERZQ3ZNOENJQU5CNlBFRE93SEF6d0lnQTBIUXhzOEFOZ0xFendJZ0EwRU5OZ0xJendJZ0EwSGE3UU03QWN6UEFpQURRWktOelFBMkF0RFBBaUFEUVFrMkF0VFBBaUFEUWJFTU93SFl6d0lnQTBHYmpjMEFOZ0xjendJZ0EwRUxOZ0xnendJZ0EwR0FDenNCNU04Q0lBTkJwbzNOQURZQzZNOENJQU5CRGpZQzdNOENJQU5CcnYwRE93SHd6d0lnQTBHMGpjMEFOZ0wwendJZ0EwRUtOZ0w0endJZ0EwR000UUE3QWZ6UEFpQURRYjZOelFBMkFvRFFBaUFEUVJNMkFvVFFBaUFEUWJFTU93R0kwQUlnQTBIUmpjMEFOZ0tNMEFJZ0EwRUtOZ0tRMEFJZ0EwSHM0UUE3QVpUUUFpQURRZHVOelFBMkFwalFBaUFEUVJNMkFwelFBaUFEUVpyL0F6c0JvTkFDSUFOQjdvM05BRFlDcE5BQ0lBTkJCRFlDcU5BQ0lBTkI2QXM3QWF6UUFpQURRZktOelFBMkFyRFFBaUFEUVJBMkFyVFFBaUFEUWNqMkF6c0J1TkFDSUFOQmdvN05BRFlDdk5BQ0lBTkJEallDd05BQ0lBTkI2QXM3QWNUUUFpQURRWkNPelFBMkFzalFBaUFEUVJRMkFzelFBaUFEUWVnTE93SFEwQUlnQTBHa2pzMEFOZ0xVMEFJZ0EwRU9OZ0xZMEFJZ0EwSG9DenNCM05BQ0lBTkJzbzdOQURZQzROQUNJQU5CRkRZQzVOQUNJQU5CNkFzN0FlalFBaUFEUWNhT3pRQTJBdXpRQWlBRFFRbzJBdkRRQWlBRFFlZ0xPd0gwMEFJZ0EwSFFqczBBTmdMNDBBSWdBMEVKTmdMODBBSWdBMEhvQ3pzQmdORUNJQU5CMlk3TkFEWUNoTkVDSUFOQkR6WUNpTkVDSUFOQjZBczdBWXpSQWlBRFFlaU96UUEyQXBEUkFpQURRUWsyQXBUUkFpQURRZWdMT3dHWTBRSWdBMEh4anMwQU5nS2MwUUlnQTBFUE5nS2cwUUlnQTBIb0N6c0JwTkVDSUFOQmdJL05BRFlDcU5FQ0lBTkJDVFlDck5FQ0lBTkI2QXM3QWJEUkFpQURRWW1QelFBMkFyVFJBaUFEUVE4MkFyalJBaUFEUWVnTE93RzgwUUlnQTBHWWo4MEFOZ0xBMFFJZ0EwRUtOZ0xFMFFJZ0EwSG9DenNCeU5FQ0lBTkJvby9OQURZQ3pORUNJQU5CRURZQzBORUNJQU5CNkFzN0FkVFJBaUFEUWJLUHpRQTJBdGpSQWlBRFFRbzJBdHpSQWlBRFFlZ0xPd0hnMFFJZ0EwRzhqODBBTmdMazBRSWdBMEVRTmdMbzBRSWdBMEhvQ3pzQjdORUNJQU5CekkvTkFEWUM4TkVDSUFOQkNUWUM5TkVDSUFOQjZBczdBZmpSQWlBRFFkV1B6UUEyQXZ6UkFpQURRUTgyQW9EU0FpQURRZWdMT3dHRTBnSWdBMEhrajgwQU5nS0kwZ0lnQTBFSk5nS00wZ0lnQTBIb0N6c0JrTklDSUFOQjdZL05BRFlDbE5JQ0lBTkJEellDbU5JQ0lBTkI2QXM3QVp6U0FpQURRZnlQelFBMkFxRFNBaUFEUVFrMkFxVFNBaUFEUWVnTE93R28wZ0lnQTBHRmtNMEFOZ0tzMGdJZ0EwRVBOZ0t3MGdJZ0EwSG9DenNCdE5JQ0lBTkJsSkROQURZQ3VOSUNJQU5CRGpZQ3ZOSUNJQU5CemNVQU93SEEwZ0lnQTBHaWtNMEFOZ0xFMGdJZ0EwRU5OZ0xJMGdJZ0EwRzl4QUE3QWN6U0FpQURRYStRelFBMkF0RFNBaUFEUVFzMkF0VFNBaUFEUVpjTE93SFkwZ0lnQTBHNmtNMEFOZ0xjMGdJZ0EwRVNOZ0xnMGdJZ0EwR1hDenNCNU5JQ0lBTkJ6SkROQURZQzZOSUNJQU5CRFRZQzdOSUNJQU5Ca01ZQU93SHcwZ0lnQTBIWmtNMEFOZ0wwMGdJZ0EwRUtOZ0w0MGdJZ0EwRzl4QUE3QWZ6U0FpQURRZU9RelFBMkFvRFRBaUFEUVFrMkFvVFRBaUFEUWY0RU93R0kwd0lnQTBIc2tNMEFOZ0tNMHdJZ0EwRVJOZ0tRMHdJZ0EwSC9CRHNCbE5NQ0lBTkIvWkROQURZQ21OTUNJQU5CQ2pZQ25OTUNJQU5CM1JNN0FhRFRBaUFEUVllUnpRQTJBcVRUQWlBRFFRYzJBcWpUQWlBRFFkMFNPd0dzMHdJZ0EwSFR3ODhBTmdLdzB3SWdBMEVETmdLMDB3SWdBMEhCQnpzQnVOTUNJQU5CanBITkFEWUN2Tk1DSUFOQkJEWUN3Tk1DSUFOQjhRYzdBY1RUQWlBRFFaS1J6UUEyQXNqVEFpQURRUVUyQXN6VEFpQURRZjBFT3dIUTB3SWdBMEdYa2MwQU5nTFUwd0lnQTBFTE5nTFkwd0lnQTBIN0JEc0IzTk1DSUFOQm9wSE5BRFlDNE5NQ0lBTkJFellDNU5NQ0lBTkJ0UVU3QWVqVEFpQURRYldSelFBMkF1elRBaUFEUVE0MkF2RFRBaUFEUWZFSE93SDAwd0lnQTBIRGtjMEFOZ0w0MHdJZ0EwRU5OZ0w4MHdJZ0EwSGVCVHNCZ05RQ0lBTkIwSkhOQURZQ2hOUUNJQU5CRWpZQ2lOUUNJQU5COGVRQU93R00xQUlnQTBIaWtjMEFOZ0tRMUFJZ0EwRVJOZ0tVMUFJZ0EwR1I1QUE3QVpqVUFpQURRZk9SelFBMkFwelVBaUFEUVJFMkFxRFVBaUFEUWVQa0FEc0JwTlFDSUFOQmhKTE5BRFlDcU5RQ0lBTkJFRFlDck5RQ0lBTkJ3T0lBT3dHdzFBSWdBMEdVa3MwQU5nSzAxQUlnQTBFUk5nSzQxQUlnQTBHNjRnQTdBYnpVQWlBRFFhV1N6UUEyQXNEVUFpQURRUlUyQXNUVUFpQURRZW5pQURzQnlOUUNJQU5CdXBMTkFEWUN6TlFDSUFOQkN6WUMwTlFDSUFOQnVlSUFPd0hVMUFJZ0EwSEZrczBBTmdMWTFBSWdBMEVRTmdMYzFBSWdBMEc3NGdBN0FlRFVBaUFEUWRXU3pRQTJBdVRVQWlBRFFSSTJBdWpVQWlBRFFlemlBRHNCN05RQ0lBTkI1NUxOQURZQzhOUUNJQU5CRURZQzlOUUNJQU5CZytRQU93SDQxQUlnQTBIM2tzMEFOZ0w4MUFJZ0EwRVNOZ0tBMVFJZ0EwRy80Z0E3QVlUVkFpQURRWW1UelFBMkFvalZBaUFEUVJBMkFvelZBaUFEUWJ6aUFEc0JrTlVDSUFOQm1aUE5BRFlDbE5VQ0lBTkJGRFlDbU5VQ0lBTkI2K0lBT3dHYzFRSWdBMEd0azgwQU5nS2cxUUlnQTBFUE5nS2sxUUlnQTBHOTRnQTdBYWpWQWlBRFFieVR6UUEyQXF6VkFpQURRUkkyQXJEVkFpQURRYjdpQURzQnROVUNJQU5CenBQTkFEWUN1TlVDSUFOQkVUWUN2TlVDSUFOQjZ1SUFPd0hBMVFJZ0EwSGZrODBBTmdMRTFRSWdBMEVXTmdMSTFRSWdBMEh0NGdBN0FjelZBaUFEUWZXVHpRQTJBdERWQWlBRFFRbzJBdFRWQWlBRFFaL0VBRHNCMk5VQ0lBTkIvNVBOQURZQzNOVUNJQU5CRERZQzROVUNJQU5CbmNZQU93SGsxUUlnQTBHTGxNMEFOZ0xvMVFJZ0EwRU1OZ0xzMVFJZ0EwR2N4Z0E3QWZEVkFpQURRWmVVelFBMkF2VFZBaUFEUVF3MkF2alZBaUFEUVovR0FEc0IvTlVDSUFOQm81VE5BRFlDZ05ZQ0lBTkJERFlDaE5ZQ0lBTkJuc1lBT3dHSTFnSWdBMEd2bE0wQU5nS00xZ0lnQTBFUk5nS1ExZ0lnQTBHWkJqc0JsTllDSUFOQndKVE5BRFlDbU5ZQ0lBTkJEVFlDbk5ZQ0lBTkJ2OFVBT3dHZzFnSWdBMEhObE0wQU5nS2sxZ0lnQTBFS05nS28xZ0lnQTBHSzRRQTdBYXpXQWlBRFFkZVV6UUEyQXJEV0FpQURRUW8yQXJUV0FpQURRZXJoQURzQnVOWUNJQU5CNFpUTkFEWUN2TllDSUFOQkV6WUN3TllDSUFOQm1QOERPd0hFMWdJZ0EwR2poTTRBTmdMSTFnSWdBMEVFTmdMTTFnSWdBMEhhQlRzQjBOWUNJQU5COUpUTkFEWUMxTllDSUFOQkREWUMyTllDSUFOQnBRWTdBZHpXQWlBRFFZQ1Z6UUEyQXVEV0FpQURRUWMyQXVUV0FpQURRWW9HT3dIbzFnSWdBMEdIbGMwQU5nTHMxZ0lnQTBFS05nTHcxZ0lnQTBHTnNBTTdBZlRXQWlBRFFaR1Z6UUEyQXZqV0FpQURRUXcyQXZ6V0FpQURRYjhGT3dHQTF3SWdBMEdkbGMwQU5nS0Uxd0lnQTBFVU5nS0kxd0lnQTBIWkNqc0JqTmNDSUFOQnNaWE5BRFlDa05jQ0lBTkJGRFlDbE5jQ0lBTkJuQVk3QVpqWEFpQURRY1dWelFBMkFwelhBaUFEUVJRMkFxRFhBaUFEUWRNRk93R2sxd0lnQTBIWmxjMEFOZ0tvMXdJZ0EwRU5OZ0tzMXdJZ0EwRytCVHNCc05jQ0lBTkI1cFhOQURZQ3ROY0NJQU5CRlRZQ3VOY0NJQU5CdVFZN0FielhBaUFEUWZ1VnpRQTJBc0RYQWlBRFFSVTJBc1RYQWlBRFFkSUZPd0hJMXdJZ0EwR1FsczBBTmdMTTF3SWdBMEVMTmdMUTF3SWdBMEhXeEFBN0FkVFhBaUFEUVp1V3pRQTJBdGpYQWlBRFFRNDJBdHpYQWlBRFFaTUVPd0hnMXdJZ0EwR3BsczBBTmdMazF3SWdBMEVOTmdMbzF3SWdBMEhSNWdBN0FlelhBaUFEUWJhV3pRQTJBdkRYQWlBRFFRbzJBdlRYQWlBRFFkODhPd0g0MXdJZ0EwSEFsczBBTmdMODF3SWdBMEVJTmdLQTJBSWdBMEg4QkRzQmhOZ0NJQU5CeUpiTkFEWUNpTmdDSUFOQkRqWUNqTmdDSUFOQitnUTdBWkRZQWlBRFFkYVd6UUEyQXBUWUFpQURRUW8yQXBqWUFpQURRZEwrQXpzQm5OZ0NJQU5CNEpiTkFEWUNvTmdDSUFOQkNqWUNwTmdDSUFOQmplRUFPd0dvMkFJZ0EwSHFsczBBTmdLczJBSWdBMEVLTmdLdzJBSWdBMEh0NFFBN0FiVFlBaUFEUWZTV3pRQTJBcmpZQWlBRFFSTTJBcnpZQWlBRFFadi9BenNCd05nQ0lBTkJoNWZOQURZQ3hOZ0NJQU5CQ1RZQ3lOZ0NJQU5Cb3h3N0FjellBaUFEUVpDWHpRQTJBdERZQWlBRFFRWTJBdFRZQWlBRFFhM0pBRHNCMk5nQ0lBTkJscGZOQURZQzNOZ0NJQU5CQ2pZQzROZ0NJQU5CM0JNN0FlVFlBaUFEUWFDWHpRQTJBdWpZQWlBRFFRYzJBdXpZQWlBRFFiRVNPd0h3MkFJZ0EwR25sODBBTmdMMDJBSWdBMEVMTmdMNDJBSWdBMEhjRkRzQi9OZ0NJQU5Cc3BmTkFEWUNnTmtDSUFOQkNqWUNoTmtDSUFOQmtRMDdBWWpaQWlBRFFieVh6UUEyQW96WkFpQURRUTgyQXBEWkFpQURRWTMzQXpzQmxOa0NJQU5CeTVmTkFEWUNtTmtDSUFOQkVEWUNuTmtDSUFOQjRCTTdBYURaQWlBRFFkdVh6UUEyQXFUWkFpQURRUTAyQXFqWkFpQURRZUFTT3dHczJRSWdBMEhvbDgwQU5nS3cyUUlnQTBFUk5nSzAyUUlnQTBIZ0ZUc0J1TmtDSUFOQitaZk5BRFlDdk5rQ0lBTkJHVFlDd05rQ0lBTkJ4Qk03QWNUWkFpQURRWktZelFBMkFzalpBaUFEUVJZMkFzelpBaUFEUWNRU093SFEyUUlnQTBHb21NMEFOZ0xVMlFJZ0EwRWFOZ0xZMlFJZ0EwSEVGVHNCM05rQ0lBTkJ3cGpOQURZQzROa0NJQU5CQ1RZQzVOa0NJQU5COGUwRE93SG8yUUlnQTBITG1NMEFOZ0xzMlFJZ0EwRUhOZ0x3MlFJZ0EwR1F5d0E3QWZUWkFpQURRZEtZelFBMkF2alpBaUFEUVFjMkF2elpBaUFEUWZrRU93R0EyZ0lnQTBIWm1NMEFOZ0tFMmdJZ0EwRVBOZ0tJMmdJZ0EwRzBCVHNCak5vQ0lBTkI2SmpOQURZQ2tOb0NJQU5CQ2pZQ2xOb0NJQU5CaStFQU93R1kyZ0lnQTBIeW1NMEFOZ0tjMmdJZ0EwRUtOZ0tnMmdJZ0EwSHI0UUE3QWFUYUFpQURRZnlZelFBMkFxamFBaUFEUVJNMkFxemFBaUFEUVpuL0F6c0JzTm9DSUFOQmo1bk5BRFlDdE5vQ0lBTkJFRFlDdU5vQ0lBTkI4aE03QWJ6YUFpQURRWitaelFBMkFzRGFBaUFEUVJBMkFzVGFBaUFEUWZNVE93SEkyZ0lnQTBHdm1jMEFOZ0xNMmdJZ0EwRUdOZ0xRMmdJZ0EwSGQ3UU03QWRUYUFpQURRYldaelFBMkF0amFBaUFEUVFZMkF0emFBaUFEUWFRY093SGcyZ0lnQTBHN21jMEFOZ0xrMmdJZ0EwRVBOZ0xvMmdJZ0EwR0xFenNCN05vQ0lBTkJ5cG5OQURZQzhOb0NJQU5CRERZQzlOb0NJQU5CaXhJN0FmamFBaUFEUWRhWnpRQTJBdnphQWlBRFFSQTJBb0RiQWlBRFFZc1ZPd0dFMndJZ0EwSG1tYzBBTmdLSTJ3SWdBMEVZTmdLTTJ3SWdBMEhERXpzQmtOc0NJQU5CL3BuTkFEWUNsTnNDSUFOQkZUWUNtTnNDSUFOQnd4STdBWnpiQWlBRFFaT2F6UUEyQXFEYkFpQURRUmsyQXFUYkFpQURRY01WT3dHbzJ3SWdBMEhIZ2M0QU5nS3Myd0lnQTBFQk5nS3cyd0lnQTBIekFEc0J0TnNDSUFOQnJKck5BRFlDdU5zQ0lBTkJDVFlDdk5zQ0lBTkJ1Qk03QWNEYkFpQURRZnVLemdBMkFzVGJBaUFEUVFZMkFzamJBaUFEUWRzQ093SE0yd0lnQTBHMW1zMEFOZ0xRMndJZ0EwRVBOZ0xVMndJZ0EwSGxQRHNCMk5zQ0lBTkJ4SnJOQURZQzNOc0NJQU5CQ1RZQzROc0NJQU5CdFF3N0FlVGJBaUFEUWMyYXpRQTJBdWpiQWlBRFFRWTJBdXpiQWlBRFFiZ1NPd0h3MndJZ0EwSFRtczBBTmdMMDJ3SWdBMEVPTmdMNDJ3SWdBMEc2L1FNN0FmemJBaUFEUWVHYXpRQTJBb0RjQWlBRFFSQTJBb1RjQWlBRFFidjlBenNCaU53Q0lBTkI4WnJOQURZQ2pOd0NJQU5CRHpZQ2tOd0NJQU5CdlAwRE93R1UzQUlnQTBHQW04MEFOZ0tZM0FJZ0EwRUtOZ0tjM0FJZ0EwRzRGVHNCb053Q0lBTkJpcHZOQURZQ3BOd0NJQU5CQ2pZQ3FOd0NJQU5CdUJRN0FhemNBaUFEUVpTYnpRQTJBckRjQWlBRFFRbzJBclRjQWlBRFFkWGdBRHNCdU53Q0lBTkJucHZOQURZQ3ZOd0NJQU5CQ2pZQ3dOd0NJQU5CdGVFQU93SEUzQUlnQTBHb204MEFOZ0xJM0FJZ0EwRVROZ0xNM0FJZ0EwSDcvZ003QWREY0FpQURRYnVielFBMkF0VGNBaUFEUVI4MkF0amNBaUFEUWZyN0F6c0IzTndDSUFOQjJwdk5BRFlDNE53Q0lBTkJCallDNU53Q0lBTkI0UXM3QWVqY0FpQURRZUNielFBMkF1emNBaUFEUVF3MkF2RGNBaUFEUWNIMkF6c0I5TndDSUFOQjdKdk5BRFlDK053Q0lBTkJFallDL053Q0lBTkJ3ZllET3dHQTNRSWdBMEgrbTgwQU5nS0UzUUlnQTBFTU5nS0kzUUlnQTBIaEN6c0JqTjBDSUFOQmlwek5BRFlDa04wQ0lBTkJDallDbE4wQ0lBTkJzaHc3QVpqZEFpQURRWlNjelFBMkFwemRBaUFEUVFvMkFxRGRBaUFEUWNFY093R2szUUlnQTBHZW5NMEFOZ0tvM1FJZ0EwRVNOZ0tzM1FJZ0EwSEVIRHNCc04wQ0lBTkJzSnpOQURZQ3ROMENJQU5CRVRZQ3VOMENJQU5Cd3h3N0FiemRBaUFEUWNHY3pRQTJBc0RkQWlBRFFRbzJBc1RkQWlBRFFiTWNPd0hJM1FJZ0EwSExuTTBBTmdMTTNRSWdBMEVKTmdMUTNRSWdBMEd3SERzQjFOMENJQU5CMUp6TkFEWUMyTjBDSUFOQkNUWUMzTjBDSUFOQndCdzdBZURkQWlBRFFkMmN6UUEyQXVUZEFpQURRUTQyQXVqZEFpQURRWWJ4QXpzQjdOMENJQU5CNjV6TkFEWUM4TjBDSUFOQkNqWUM5TjBDSUFOQnRSdzdBZmpkQWlBRFFmV2N6UUEyQXZ6ZEFpQURRUTAyQW9EZUFpQURRWVh4QXpzQmhONENJQU5CZ3AzTkFEWUNpTjRDSUFOQkNUWUNqTjRDSUFOQnRCdzdBWkRlQWlBRFFZdWR6UUEyQXBUZUFpQURRUWsyQXBqZUFpQURRY0ljT3dHYzNnSWdBMEdVbmMwQU5nS2czZ0lnQTBFUE5nS2szZ0lnQTBHSThRTTdBYWplQWlBRFFhT2R6UUEyQXF6ZUFpQURRUXMyQXJEZUFpQURRYmNjT3dHMDNnSWdBMEd1bmMwQU5nSzQzZ0lnQTBFT05nSzgzZ0lnQTBHSDhRTTdBY0RlQWlBRFFieWR6UUEyQXNUZUFpQURRUW8yQXNqZUFpQURRYlljT3dITTNnSWdBMEhHbmMwQU5nTFEzZ0lnQTBFSk5nTFUzZ0lnQTBHNEhEc0IyTjRDSUFOQno1M05BRFlDM040Q0lBTkJDallDNE40Q0lBTkJ1Unc3QWVUZUFpQURRZG1kelFBMkF1amVBaUFEUVFrMkF1emVBaUFEUWFqRkFEc0I4TjRDSUFOQjRwM05BRFlDOU40Q0lBTkJDVFlDK040Q0lBTkJtZUlBT3dIODNnSWdBMEdiaDg0QU5nS0Ezd0lnQTBFR05nS0Uzd0lnQTBIaEFqc0JpTjhDSUFOQjY1M05BRFlDak44Q0lBTkJEellDa044Q0lBTkI1enc3QVpUZkFpQURRYUdIemdBMkFwamZBaUFEUVFnMkFwemZBaUFEUWQ4Q093R2czd0lnQTBINm5jMEFOZ0trM3dJZ0EwRUZOZ0tvM3dJZ0EwSFpCRHNCck44Q0lBTkIvNTNOQURZQ3NOOENJQU5CRFRZQ3ROOENJQU5CMlFrN0FiamZBaUFEUVl5ZXpRQTJBcnpmQWlBRFFSVTJBc0RmQWlBRFFkc0pPd0hFM3dJZ0EwR2huczBBTmdMSTN3SWdBMEVKTmdMTTN3SWdBMEhhQkRzQjBOOENJQU5CcXA3TkFEWUMxTjhDSUFOQkJ6WUMyTjhDSUFOQjRza0FPd0hjM3dJZ0EwR3huczBBTmdMZzN3SWdBMEVMTmdMazN3SWdBMEhkQWpzQjZOOENJQU5CODRYT0FEWUM3TjhDSUFOQkREWUM4TjhDSUFOQm1RUTdBZlRmQWlBRFFieWV6UUEyQXZqZkFpQURRUW8yQXZ6ZkFpQURRZUU4T3dHQTRBSWdBMEhHbnMwQU5nS0U0QUlnQTBFSk5nS0k0QUlnQTBIalBEc0JqT0FDSUFOQno1N05BRFlDa09BQ0lBTkJFallDbE9BQ0lBTkI2VHc3QVpqZ0FpQURRZUdlelFBMkFwemdBaUFEUVE4MkFxRGdBaUFEUWJ3R093R2s0QUlnQTBIWHhNOEFOZ0tvNEFJZ0EwRUdOZ0tzNEFJZ0EwR3p3QUE3QWJEZ0FpQURRZkNlelFBMkFyVGdBaUFEUVJFMkFyamdBaUFEUWNvRk93Rzg0QUlnQTBHV2dzNEFOZ0xBNEFJZ0EwRUhOZ0xFNEFJZ0EwR25BVHNCeU9BQ0lBTkJnWi9OQURZQ3pPQUNJQU5CQ2pZQzBPQUNJQU5Cc3d3N0FkVGdBaUFEUVl1ZnpRQTJBdGpnQWlBRFFRODJBdHpnQWlBRFFiTDlBenNCNE9BQ0lBTkJtcC9OQURZQzVPQUNJQU5CRVRZQzZPQUNJQU5Ccy8wRE93SHM0QUlnQTBHcm44MEFOZ0x3NEFJZ0EwRVFOZ0wwNEFJZ0EwRzAvUU03QWZqZ0FpQURRYnVmelFBMkF2emdBaUFEUVFVMkFvRGhBaUFEUWJZTE93R0U0UUlnQTBIQW44MEFOZ0tJNFFJZ0EwRUhOZ0tNNFFJZ0EwRzJDenNCa09FQ0lBTkJ4NS9OQURZQ2xPRUNJQU5CQnpZQ21PRUNJQU5CdGdzN0FaemhBaUFEUWM2ZnpRQTJBcURoQWlBRFFRYzJBcVRoQWlBRFFiWUxPd0dvNFFJZ0EwSFZuODBBTmdLczRRSWdBMEVMTmdLdzRRSWdBMEcyQ3pzQnRPRUNJQU5CNEovTkFEWUN1T0VDSUFOQkVUWUN2T0VDSUFOQnRnczdBY0RoQWlBRFFmR2Z6UUEyQXNUaEFpQURRUkkyQXNqaEFpQURRYllMT3dITTRRSWdBMEdEb00wQU5nTFE0UUlnQTBFTk5nTFU0UUlnQTBHU0N6c0IyT0VDSUFOQmtLRE5BRFlDM09FQ0lBTkJEellDNE9FQ0lBTkJ0Z3M3QWVUaEFpQURRWitnelFBMkF1amhBaUFEUVFzMkF1emhBaUFEUWYwS093SHc0UUlnQTBHcW9NMEFOZ0wwNFFJZ0EwRUtOZ0w0NFFJZ0EwSGI0QUE3QWZ6aEFpQURRYlNnelFBMkFvRGlBaUFEUVFvMkFvVGlBaUFEUWJ2aEFEc0JpT0lDSUFOQnZxRE5BRFlDak9JQ0lBTkJFellDa09JQ0lBTkIvdjRET3dHVTRnSWdBMEc2Z000QU5nS1k0Z0lnQTBFSk5nS2M0Z0lnQTBFN093R2c0Z0lnQTBIUm9NMEFOZ0trNGdJZ0EwRVBOZ0tvNGdJZ0EwR2JERHNCck9JQ0lBTkI0S0ROQURZQ3NPSUNJQU5CRWpZQ3RPSUNJQU5CbS80RE93RzQ0Z0lnQTBIeW9NMEFOZ0s4NGdJZ0EwRU9OZ0xBNGdJZ0EwSFUvQU03QWNUaUFpQURRWUNoelFBMkFzamlBaUFEUVJJMkFzemlBaUFEUVp6aEFEc0IwT0lDSUFOQmtxSE5BRFlDMU9JQ0lBTkJHellDMk9JQ0lBTkJuLzhET3dIYzRnSWdBMEd0b2MwQU5nTGc0Z0lnQTBFTE5nTGs0Z0lnQTBHaTVnQTdBZWppQWlBRFFiaWh6UUEyQXV6aUFpQURRUXMyQXZEaUFpQURRYVBtQURzQjlPSUNJQU5CcDRET0FEWUMrT0lDSUFOQkJUWUMvT0lDSUFOQk56c0JnT01DSUFOQnc2SE5BRFlDaE9NQ0lBTkJDellDaU9NQ0lBTkI1d3c3QVl6akFpQURRYzZoelFBMkFwRGpBaUFEUVF3MkFwVGpBaUFEUWUwVE93R1k0d0lnQTBIYW9jMEFOZ0tjNHdJZ0EwRUxOZ0tnNHdJZ0EwSG15QUE3QWFUakFpQURRZVdoelFBMkFxampBaUFEUVJzMkFxempBaUFEUVpEUEFEc0JzT01DSUFOQmdLTE5BRFlDdE9NQ0lBTkJDVFlDdU9NQ0lBTkI3Ukk3QWJ6akFpQURRWW1pelFBMkFzRGpBaUFEUVF3MkFzVGpBaUFEUWQ3Q0FEc0J5T01DSUFOQmxhTE5BRFlDek9NQ0lBTkJEVFlDME9NQ0lBTkI3UlU3QWRUakFpQURRYUtpelFBMkF0ampBaUFEUVEwMkF0empBaUFEUWUwVU93SGc0d0lnQTBHdm9zMEFOZ0xrNHdJZ0EwRVBOZ0xvNHdJZ0EwSG5ERHNCN09NQ0lBTkJ2cUxOQURZQzhPTUNJQU5CRFRZQzlPTUNJQU5CcCtBQU93SDQ0d0lnQTBITG9zMEFOZ0w4NHdJZ0EwRVZOZ0tBNUFJZ0EwR201QUE3QVlUa0FpQURRZUNpelFBMkFvamtBaUFEUVEwMkFvemtBaUFEUVlmQkFEc0JrT1FDSUFOQjdhTE5BRFlDbE9RQ0lBTkJEallDbU9RQ0lBTkJsLzRET3dHYzVBSWdBMEg3b3MwQU5nS2c1QUlnQTBFTk5nS2s1QUlnQTBHMzdnTTdBYWprQWlBRFFZaWp6UUEyQXF6a0FpQURRUW8yQXJEa0FpQURRZnJJQURzQnRPUUNJQU5Ca3FQTkFEWUN1T1FDSUFOQkN6WUN2T1FDSUFOQmpza0FPd0hBNUFJZ0EwR2RvODBBTmdMRTVBSWdBMEVNTmdMSTVBSWdBMEgzRFRzQnpPUUNJQU5CcWFQTkFEWUMwT1FDSUFOQkNqWUMxT1FDSUFOQjlzSUFPd0hZNUFJZ0EwR3pvODBBTmdMYzVBSWdBMEVOTmdMZzVBSWdBMEgzd0FBN0FlVGtBaUFEUWNDanpRQTJBdWprQWlBRFFRODJBdXprQWlBRFFmRElBRHNCOE9RQ0lBTkJ6NlBOQURZQzlPUUNJQU5CRGpZQytPUUNJQU5CaE1rQU93SDg1QUlnQTBIZG84MEFOZ0tBNVFJZ0EwRVBOZ0tFNVFJZ0EwR1l5UUE3QVlqbEFpQURRZXlqelFBMkFvemxBaUFEUVFrMkFwRGxBaUFEUWRjY093R1U1UUlnQTBIMW84MEFOZ0tZNVFJZ0EwRUpOZ0tjNVFJZ0EwR3RBVHNCb09VQ0lBTkIvcVBOQURZQ3BPVUNJQU5CQ3pZQ3FPVUNJQU5COXdvN0FhemxBaUFEUVlta3pRQTJBckRsQWlBRFFRbzJBclRsQWlBRFFiWVRPd0c0NVFJZ0EwR1RwTTBBTmdLODVRSWdBMEVMTmdMQTVRSWdBMEhJQ0RzQnhPVUNJQU5CbnFUTkFEWUN5T1VDSUFOQkREWUN6T1VDSUFOQjBRdzdBZERsQWlBRFFhcWt6UUEyQXRUbEFpQURRUkUyQXRqbEFpQURRZUg0QXpzQjNPVUNJQU5CdTZUTkFEWUM0T1VDSUFOQkZEWUM1T1VDSUFOQjN2Z0RPd0hvNVFJZ0EwSFBwTTBBTmdMczVRSWdBMEVSTmdMdzVRSWdBMEhnK0FNN0FmVGxBaUFEUWVDa3pRQTJBdmpsQWlBRFFSUTJBdnpsQWlBRFFkRU1Pd0dBNWdJZ0EwSDBwTTBBTmdLRTVnSWdBMEVSTmdLSTVnSWdBMEhpK0FNN0FZem1BaUFEUVlXbHpRQTJBcERtQWlBRFFSUTJBcFRtQWlBRFFkLzRBenNCbU9ZQ0lBTkJtYVhOQURZQ25PWUNJQU5CQlRZQ29PWUNJQU5Ca3NzQU93R2s1Z0lnQTBHZXBjMEFOZ0tvNWdJZ0EwRUpOZ0tzNWdJZ0EwR1R5d0E3QWJEbUFpQURRYWVselFBMkFyVG1BaUFEUVFvMkFyam1BaUFEUVpITEFEc0J2T1lDSUFOQnNhWE5BRFlDd09ZQ0lBTkJDellDeE9ZQ0lBTkJrc3NBT3dISTVnSWdBMEc4cGMwQU5nTE01Z0lnQTBFSE5nTFE1Z0lnQTBHMkVqc0IxT1lDSUFOQnc2WE5BRFlDMk9ZQ0lBTkJDellDM09ZQ0lBTkJ0aFU3QWVEbUFpQURRYzZselFBMkF1VG1BaUFEUVFzMkF1am1BaUFEUWJZVU93SHM1Z0lnQTBIWnBjMEFOZ0x3NWdJZ0EwRVFOZ0wwNWdJZ0EwR1RDenNCK09ZQ0lBTkI2YVhOQURZQy9PWUNJQU5CQlRZQ2dPY0NJQU5CNzh3QU93R0U1d0lnQTBIdXBjMEFOZ0tJNXdJZ0EwRUtOZ0tNNXdJZ0EwR1Y0Z0E3QVpEbkFpQURRZmlselFBMkFwVG5BaUFEUVEwMkFwam5BaUFEUWNrSU93R2M1d0lnQTBHRnBzMEFOZ0tnNXdJZ0EwRUxOZ0trNXdJZ0EwRzBERHNCcU9jQ0lBTkJrS2JOQURZQ3JPY0NJQU5CRURZQ3NPY0NJQU5CdHYwRE93RzA1d0lnQTBHZ3BzMEFOZ0s0NXdJZ0EwRVNOZ0s4NXdJZ0EwRzMvUU03QWNEbkFpQURRYkttelFBMkFzVG5BaUFEUVJFMkFzam5BaUFEUWJqOUF6c0J6T2NDSUFOQnc2Yk5BRFlDME9jQ0lBTkJDallDMU9jQ0lBTkI0d2M3QWRqbkFpQURRYzJtelFBMkF0em5BaUFEUVFZMkF1RG5BaUFEUWFyQkFEc0I1T2NDSUFOQjA2Yk5BRFlDNk9jQ0lBTkJERFlDN09jQ0lBTkJxc0VBT3dIdzV3SWdBMEhmcHMwQU5nTDA1d0lnQTBFRk5nTDQ1d0lnQTBHd0N6c0IvT2NDSUFOQjVLYk5BRFlDZ09nQ0lBTkJDRFlDaE9nQ0lBTkJzQXM3QVlqb0FpQURRZXltelFBMkFvem9BaUFEUVFjMkFwRG9BaUFEUWJBTE93R1U2QUlnQTBIenBzMEFOZ0tZNkFJZ0EwRUhOZ0tjNkFJZ0EwR3dDenNCb09nQ0lBTkIrcWJOQURZQ3BPZ0NJQU5CQnpZQ3FPZ0NJQU5Cc0FzN0Fhem9BaUFEUVlHbnpRQTJBckRvQWlBRFFRczJBclRvQWlBRFFiQUxPd0c0NkFJZ0EwR01wODBBTmdLODZBSWdBMEVSTmdMQTZBSWdBMEd3Q3pzQnhPZ0NJQU5CbmFmTkFEWUN5T2dDSUFOQkVqWUN6T2dDSUFOQnNBczdBZERvQWlBRFFhK256UUEyQXRUb0FpQURRUTgyQXRqb0FpQURRYkFMT3dIYzZBSWdBMEcrcDgwQU5nTGc2QUlnQTBFTU5nTGs2QUlnQTBHN0NUc0I2T2dDSUFOQnlxZk5BRFlDN09nQ0lBTkJDVFlDOE9nQ0lBTkJzTU1BT3dIMDZBSWdBMEhUcDgwQU5nTDQ2QUlnQTBFS05nTDg2QUlnQTBHeHd3QTdBWURwQWlBRFFkMm56UUEyQW9UcEFpQURRUXMyQW9qcEFpQURRZTBIT3dHTTZRSWdBMEhvcDgwQU5nS1E2UUlnQTBFRU5nS1U2UUlnQTBIcEN6c0JtT2tDSUFOQjdLZk5BRFlDbk9rQ0lBTkJDallDb09rQ0lBTkJ5ZllET3dHazZRSWdBMEgycDgwQU5nS282UUlnQTBFUU5nS3M2UUlnQTBISjlnTTdBYkRwQWlBRFFZYW96UUEyQXJUcEFpQURRUkUyQXJqcEFpQURRYXoyQXpzQnZPa0NJQU5CbDZqTkFEWUN3T2tDSUFOQkZ6WUN4T2tDSUFOQnJQWURPd0hJNlFJZ0EwR3VxTTBBTmdMTTZRSWdBMEVRTmdMUTZRSWdBMEd0OWdNN0FkVHBBaUFEUWI2b3pRQTJBdGpwQWlBRFFSWTJBdHpwQWlBRFFhMzJBenNCNE9rQ0lBTkIxS2pOQURZQzVPa0NJQU5CRFRZQzZPa0NJQU5Cd1FzN0FlenBBaUFEUWVHb3pRQTJBdkRwQWlBRFFRbzJBdlRwQWlBRFFla0xPd0g0NlFJZ0EwSHJxTTBBTmdMODZRSWdBMEVMTmdLQTZnSWdBMEdxOWdNN0FZVHFBaUFEUWZhb3pRQTJBb2pxQWlBRFFSRTJBb3pxQWlBRFFhcjJBenNCa09vQ0lBTkJoNm5OQURZQ2xPb0NJQU5CQ2pZQ21Pb0NJQU5CcS9ZRE93R2M2Z0lnQTBHUnFjMEFOZ0tnNmdJZ0EwRVFOZ0trNmdJZ0EwR3I5Z003QWFqcUFpQURRYUdwelFBMkFxenFBaUFEUVFVMkFyRHFBaUFEUVlJRk93RzA2Z0lnQTBIV3c4OEFOZ0s0NmdJZ0EwRUZOZ0s4NmdJZ0EwSERCenNCd09vQ0lBTkIyc0xQQURZQ3hPb0NJQU5CQmpZQ3lPb0NJQU5Cd2djN0FjenFBaUFEUWFhcHpRQTJBdERxQWlBRFFRbzJBdFRxQWlBRFFjSUhPd0hZNmdJZ0EwR3dxYzBBTmdMYzZnSWdBMEVXTmdMZzZnSWdBMEh5QnpzQjVPb0NJQU5CeHFuTkFEWUM2T29DSUFOQkNqWUM3T29DSUFOQjErQUFPd0h3NmdJZ0EwSFFxYzBBTmdMMDZnSWdBMEVLTmdMNDZnSWdBMEczNFFBN0FmenFBaUFEUWRxcHpRQTJBb0RyQWlBRFFSTTJBb1RyQWlBRFFmeitBenNCaU9zQ0lBTkI3YW5OQURZQ2pPc0NJQU5CQ3pZQ2tPc0NJQU5CdlFzN0FaVHJBaUFEUWZpcHpRQTJBcGpyQWlBRFFRODJBcHpyQWlBRFFiMExPd0dnNndJZ0EwSDV3ODhBTmdLazZ3SWdBMEVITmdLbzZ3SWdBMEc4eEFBN0FhenJBaUFEUVllcXpRQTJBckRyQWlBRFFRdzJBclRyQWlBRFFjUEVBRHNCdU9zQ0lBTkJrNnJOQURZQ3ZPc0NJQU5CRERZQ3dPc0NJQU5Cd2dzN0FjVHJBaUFEUVorcXpRQTJBc2pyQWlBRFFSRTJBc3pyQWlBRFFmVGtBRHNCME9zQ0lBTkJzS3JOQURZQzFPc0NJQU5CRURZQzJPc0NJQU5CbE9RQU93SGM2d0lnQTBIQXFzMEFOZ0xnNndJZ0EwRVBOZ0xrNndJZ0EwSCs0Z0E3QWVqckFpQURRYytxelFBMkF1enJBaUFEUVJBMkF2RHJBaUFEUWVia0FEc0I5T3NDSUFOQjM2ck5BRFlDK09zQ0lBTkJFRFlDL09zQ0lBTkIrdUlBT3dHQTdBSWdBMEh2cXMwQU5nS0U3QUlnQTBFS05nS0k3QUlnQTBIRjRnQTdBWXpzQWlBRFFmbXF6UUEyQXBEc0FpQURRUTgyQXBUc0FpQURRZnZpQURzQm1Pd0NJQU5CaUt2TkFEWUNuT3dDSUFOQkR6WUNvT3dDSUFOQmh1UUFPd0drN0FJZ0EwR1hxODBBTmdLbzdBSWdBMEVQTmdLczdBSWdBMEg5NGdBN0FiRHNBaUFEUWFhcnpRQTJBclRzQWlBRFFSQTJBcmpzQWlBRFFmemlBRHNCdk93Q0lBTkJwSURPQURZQ3dPd0NJQU5CQXpZQ3hPd0NJQU5CTmpzQnlPd0NJQU5CdHF2TkFEWUN6T3dDSUFOQkNUWUMwT3dDSUFOQjVndzdBZFRzQWlBRFFiK3J6UUEyQXRqc0FpQURRUW8yQXR6c0FpQURRZXdUT3dIZzdBSWdBMEhKcTgwQU5nTGs3QUlnQTBFSk5nTG83QUlnQTBIbHlBQTdBZXpzQWlBRFFkS3J6UUEyQXZEc0FpQURRUmsyQXZUc0FpQURRWS9QQURzQitPd0NJQU5CNjZ2TkFEWUMvT3dDSUFOQkJ6WUNnTzBDSUFOQjdCSTdBWVR0QWlBRFFmS3J6UUEyQW9qdEFpQURRUXMyQW96dEFpQURRZXdWT3dHUTdRSWdBMEg5cTgwQU5nS1U3UUlnQTBFTE5nS1k3UUlnQTBIc0ZEc0JuTzBDSUFOQmlLek5BRFlDb08wQ0lBTkJEVFlDcE8wQ0lBTkI1Z3c3QWFqdEFpQURRWldzelFBMkFxenRBaUFEUVFzMkFyRHRBaUFEUWFiZ0FEc0J0TzBDSUFOQm9Lek5BRFlDdU8wQ0lBTkJFellDdk8wQ0lBTkJwZVFBT3dIQTdRSWdBMEd6ck0wQU5nTEU3UUlnQTBFTE5nTEk3UUlnQTBHR3dRQTdBY3p0QWlBRFFiNnN6UUEyQXREdEFpQURRUXcyQXRUdEFpQURRWmIrQXpzQjJPMENJQU5CeXF6TkFEWUMzTzBDSUFOQkN6WUM0TzBDSUFOQnR1NERPd0hrN1FJZ0EwSFZyTTBBTmdMbzdRSWdBMEVJTmdMczdRSWdBMEg1eUFBN0FmRHRBaUFEUWQyc3pRQTJBdlR0QWlBRFFRazJBdmp0QWlBRFFZM0pBRHNCL08wQ0lBTkI1cXpOQURZQ2dPNENJQU5CQ2pZQ2hPNENJQU5COWcwN0FZanVBaUFEUWZDc3pRQTJBb3p1QWlBRFFRZzJBcER1QWlBRFFmWENBRHNCbE80Q0lBTkIrS3pOQURZQ21PNENJQU5CQ3pZQ25PNENJQU5COXNBQU93R2c3Z0lnQTBHRHJjMEFOZ0trN2dJZ0EwRU5OZ0tvN2dJZ0EwSHZ5QUE3QWF6dUFpQURRWkN0elFBMkFyRHVBaUFEUVNFMkFyVHVBaUFEUWZrVE93RzQ3Z0lnQTBHeHJjMEFOZ0s4N2dJZ0EwRU1OZ0xBN2dJZ0EwR0R5UUE3QWNUdUFpQURRYjJ0elFBMkFzanVBaUFEUVEwMkFzenVBaUFEUVpmSkFEc0IwTzRDSUFOQnlxM05BRFlDMU80Q0lBTkJCellDMk80Q0lBTkIxaHc3QWR6dUFpQURRWWlBemdBMkF1RHVBaUFEUVFVMkF1VHVBaUFEUVM4N0FlanVBaUFEUWRHdHpRQTJBdXp1QWlBRFFRZzJBdkR1QWlBRFFaWEVBRHNCOU80Q0lBTkIyYTNOQURZQytPNENJQU5CQ1RZQy9PNENJQU5CbGNRQU93R0E3d0lnQTBIaXJjMEFOZ0tFN3dJZ0EwRUlOZ0tJN3dJZ0EwR1Z4QUE3QVl6dkFpQURRZXF0elFBMkFwRHZBaUFEUVFrMkFwVHZBaUFEUVpYRUFEc0JtTzhDSUFOQjg2M05BRFlDbk84Q0lBTkJEallDb084Q0lBTkJqLzRET3dHazd3SWdBMEdCcnMwQU5nS283d0lnQTBFRk5nS3M3d0lnQTBIL0Fqc0JzTzhDSUFOQmhxN05BRFlDdE84Q0lBTkJEallDdU84Q0lBTkJtejA3QWJ6dkFpQURRWlN1elFBMkFzRHZBaUFEUVFrMkFzVHZBaUFEUWFMR0FEc0J5TzhDSUFOQm5hN05BRFlDek84Q0lBTkJDVFlDME84Q0lBTkJvOFlBT3dIVTd3SWdBMEdtcnMwQU5nTFk3d0lnQTBFRk5nTGM3d0lnQTBHanhnQTdBZUR2QWlBRFFhdXV6UUEyQXVUdkFpQURRUWsyQXVqdkFpQURRYnJNQURzQjdPOENJQU5CdEs3TkFEWUM4TzhDSUFOQkNqWUM5TzhDSUFOQjAvNERPd0g0N3dJZ0EwRytyczBBTmdMODd3SWdBMEVPTmdLQThBSWdBMEhEQ3pzQmhQQUNJQU5Ceks3TkFEWUNpUEFDSUFOQkNqWUNqUEFDSUFOQnJRRTdBWkR3QWlBRFFkYXV6UUEyQXBUd0FpQURRUkEyQXBqd0FpQURRY3dJT3dHYzhBSWdBMEhtcnMwQU5nS2c4QUlnQTBFS05nS2s4QUlnQTBIZDRBQTdBYWp3QWlBRFFmQ3V6UUEyQXF6d0FpQURRUW8yQXJEd0FpQURRYjNoQURzQnRQQUNJQU5CK3E3TkFEWUN1UEFDSUFOQkV6WUN2UEFDSUFOQi8vNERPd0hBOEFJZ0EwR05yODBBTmdMRThBSWdBMEVWTmdMSThBSWdBMEc0QmpzQnpQQUNJQU5Cb3EvTkFEWUMwUEFDSUFOQkZqWUMxUEFDSUFOQnR3WTdBZGp3QWlBRFFiaXZ6UUEyQXR6d0FpQURRUW8yQXVEd0FpQURRYWtjT3dIazhBSWdBMEhDcjgwQU5nTG84QUlnQTBFS05nTHM4QUlnQTBHb0hEc0I4UEFDSUFOQnpLL05BRFlDOVBBQ0lBTkJDRFlDK1BBQ0lBTkJpeHc3QWZ6d0FpQURRZFN2elFBMkFvRHhBaUFEUVFrMkFvVHhBaUFEUWFvY093R0k4UUlnQTBHYi84MEFOZ0tNOFFJZ0EwRUZOZ0tROFFJZ0EwRWdPd0dVOFFJZ0EwSGRyODBBTmdLWThRSWdBMEVQTmdLYzhRSWdBMEVnT3dHZzhRSWdBMEdteE04QU5nS2s4UUlnQTBFRk5nS284UUlnQTBIZ3pBQTdBYXp4QWlBRFFleXZ6UUEyQXJEeEFpQURRUTQyQXJUeEFpQURRZURNQURzQnVQRUNJQU5CK3EvTkFEWUN2UEVDSUFOQkRqWUN3UEVDSUFOQjVNd0FPd0hFOFFJZ0EwR0lzTTBBTmdMSThRSWdBMEVHTmdMTThRSWdBMEd1eVFBN0FkRHhBaUFEUVk2d3pRQTJBdFR4QWlBRFFRNDJBdGp4QWlBRFFhTEVBRHNCM1BFQ0lBTkJuTEROQURZQzRQRUNJQU5CQmpZQzVQRUNJQU5Cb2NzQU93SG84UUlnQTBHaXNNMEFOZ0xzOFFJZ0EwRU9OZ0x3OFFJZ0EwRzdCanNCOVBFQ0lBTkJzTEROQURZQytQRUNJQU5CQ0RZQy9QRUNJQU5CeE9jQU93R0E4Z0lnQTBHNHNNMEFOZ0tFOGdJZ0EwRUlOZ0tJOGdJZ0EwR2Q1d0E3QVl6eUFpQURRY0N3elFBMkFwRHlBaUFEUVJ3MkFwVHlBaUFEUWFuTEFEc0JtUElDSUFOQjNMRE5BRFlDblBJQ0lBTkJDVFlDb1BJQ0lBTkJvY1VBT3dHazhnSWdBMEhsc00wQU5nS284Z0lnQTBFVU5nS3M4Z0lnQTBHa3l3QTdBYkR5QWlBRFFmbXd6UUEyQXJUeUFpQURRUXMyQXJqeUFpQURRWS9GQURzQnZQSUNJQU5CaExITkFEWUN3UElDSUFOQkNEWUN4UElDSUFOQmorY0FPd0hJOGdJZ0EwR01zYzBBTmdMTThnSWdBMEVJTmdMUThnSWdBMEdlNXdBN0FkVHlBaUFEUVpTeHpRQTJBdGp5QWlBRFFRODJBdHp5QWlBRFFjN25BRHNCNFBJQ0lBTkJvN0hOQURZQzVQSUNJQU5CQ0RZQzZQSUNJQU5CMGVjQU93SHM4Z0lnQTBHcnNjMEFOZ0x3OGdJZ0EwRUpOZ0wwOGdJZ0EwSFM1d0E3QWZqeUFpQURRYlN4elFBMkF2enlBaUFEUVFnMkFvRHpBaUFEUVk3bkFEc0JoUE1DSUFOQnZMSE5BRFlDaVBNQ0lBTkJDVFlDalBNQ0lBTkIxZWNBT3dHUTh3SWdBMEhGc2MwQU5nS1U4d0lnQTBFTE5nS1k4d0lnQTBHZnhRQTdBWnp6QWlBRFFkQ3h6UUEyQXFEekFpQURRUWcyQXFUekFpQURRWnpuQURzQnFQTUNJQU5CMkxITkFEWUNyUE1DSUFOQkRqWUNzUE1DSUFOQm9lY0FPd0cwOHdJZ0EwSG1zYzBBTmdLNDh3SWdBMEVPTmdLODh3SWdBMEdneFFBN0FjRHpBaUFEUWZTeHpRQTJBc1R6QWlBRFFRNDJBc2p6QWlBRFFaREZBRHNCelBNQ0lBTkJnckxOQURZQzBQTUNJQU5CSGpZQzFQTUNJQU5CcHNzQU93SFk4d0lnQTBHZ3NzMEFOZ0xjOHdJZ0EwRUtOZ0xnOHdJZ0EwR2V4UUE3QWVUekFpQURRYXF5elFBMkF1anpBaUFEUVFzMkF1enpBaUFEUWFETEFEc0I4UE1DSUFOQnRiTE5BRFlDOVBNQ0lBTkJIellDK1BNQ0lBTkJwOHNBT3dIODh3SWdBMEhVc3MwQU5nS0E5QUlnQTBFZk5nS0U5QUlnQTBHb3l3QTdBWWowQWlBRFFmT3l6UUEyQW96MEFpQURRUkkyQXBEMEFpQURRYVhMQURzQmxQUUNJQU5CaGJQTkFEWUNtUFFDSUFOQkdUWUNuUFFDSUFOQm84c0FPd0dnOUFJZ0EwR2VzODBBTmdLazlBSWdBMEVSTmdLbzlBSWdBMEd0d3dBN0FhejBBaUFEUWErenpRQTJBckQwQWlBRFFRMDJBclQwQWlBRFFkM0RBRHNCdVBRQ0lBTkJ2TFBOQURZQ3ZQUUNJQU5CQ0RZQ3dQUUNJQU5CMitjQU93SEU5QUlnQTBIRXM4MEFOZ0xJOUFJZ0EwRUtOZ0xNOUFJZ0EwRzNFenNCMFBRQ0lBTkJ6clBOQURZQzFQUUNJQU5CQnpZQzJQUUNJQU5CdHhJN0FkejBBaUFEUWRXenpRQTJBdUQwQWlBRFFRczJBdVQwQWlBRFFiY1ZPd0hvOUFJZ0EwSGdzODBBTmdMczlBSWdBMEVRTmdMdzlBSWdBMEhKNGdBN0FmVDBBaUFEUWZDenpRQTJBdmowQWlBRFFSQTJBdnowQWlBRFFZWGpBRHNCZ1BVQ0lBTkJnTFROQURZQ2hQVUNJQU5CRURZQ2lQVUNJQU5CZ09NQU93R005UUlnQTBHUXRNMEFOZ0tROVFJZ0EwRVJOZ0tVOVFJZ0EwR3k0Z0E3QVpqMUFpQURRYUcwelFBMkFwejFBaUFEUVJBMkFxRDFBaUFEUWVYaUFEc0JwUFVDSUFOQnNiVE5BRFlDcVBVQ0lBTkJFRFlDclBVQ0lBTkJ3K0lBT3dHdzlRSWdBMEhCdE0wQU5nSzA5UUlnQTBFUE5nSzQ5UUlnQTBIRzRnQTdBYnoxQWlBRFFkQzB6UUEyQXNEMUFpQURRUkUyQXNUMUFpQURRYmppQURzQnlQVUNJQU5CNGJUTkFEWUN6UFVDSUFOQkNUWUMwUFVDSUFOQjh1MERPd0hVOVFJZ0EwSHF0TTBBTmdMWTlRSWdBMEVDTmdMYzlRSWdBMEdHOWdNN0FlRDFBaUFEUWV5MHpRQTJBdVQxQWlBRFFRUTJBdWoxQWlBRFFjYkZBRHNCN1BVQ0lBTkIvWUhPQURZQzhQVUNJQU5CQ0RZQzlQVUNJQU5Cb3dFN0FmajFBaUFEUWZDMHpRQTJBdnoxQWlBRFFSRTJBb0QyQWlBRFFlSC9BenNCaFBZQ0lBTkJnYlhOQURZQ2lQWUNJQU5CRkRZQ2pQWUNJQU5CdGdZN0FaRDJBaUFEUVpXMXpRQTJBcFQyQWlBRFFSVTJBcGoyQWlBRFFiVUdPd0djOWdJZ0EwR3F0YzBBTmdLZzlnSWdBMEVHTmdLazlnSWdBMEdDeFFBN0FhajJBaUFEUWJDMXpRQTJBcXoyQWlBRFFRazJBckQyQWlBRFFkREZBRHNCdFBZQ0lBTkJ1YlhOQURZQ3VQWUNJQU5CRGpZQ3ZQWUNJQU5CeGRVQU93SEE5Z0lnQTBISHRjMEFOZ0xFOWdJZ0EwRU1OZ0xJOWdJZ0EwR0t4UUE3QWN6MkFpQURRZE8xelFBMkF0RDJBaUFEUVE0MkF0VDJBaUFEUVlyRkFEc0IyUFlDSUFOQjRiWE5BRFlDM1BZQ0lBTkJEVFlDNFBZQ0lBTkJoc1VBT3dIazlnSWdBMEh1dGMwQU5nTG85Z0lnQTBFUk5nTHM5Z0lnQTBITDFRQTdBZkQyQWlBRFFmKzF6UUEyQXZUMkFpQURRUTAyQXZqMkFpQURRWkhGQURzQi9QWUNJQU5CakxiTkFEWUNnUGNDSUFOQkNEWUNoUGNDSUFOQis4UUFPd0dJOXdJZ0EwSG13YzhBTmdLTTl3SWdBMEVJTmdLUTl3SWdBMEdMeEFBN0FaVDNBaUFEUVpTMnpRQTJBcGozQWlBRFFRbzJBcHozQWlBRFFkbmdBRHNCb1BjQ0lBTkJucmJOQURZQ3BQY0NJQU5CQ2pZQ3FQY0NJQU5CdWVFQU93R3M5d0lnQTBHb3RzMEFOZ0t3OXdJZ0EwRVROZ0swOXdJZ0EwSDkvZ003QWJqM0FpQURRYnUyelFBMkFyejNBaUFEUVFzMkFzRDNBaUFEUWRJTU93SEU5d0lnQTBIbmljNEFOZ0xJOXdJZ0EwRUpOZ0xNOXdJZ0EwR1J4QUE3QWREM0FpQURRY2EyelFBMkF0VDNBaUFEUVJBMkF0ajNBaUFEUVpIRUFEc0IzUGNDSUFOQjFyYk5BRFlDNFBjQ0lBTkJEVFlDNVBjQ0lBTkJrY1FBT3dIbzl3SWdBMEhqdHMwQU5nTHM5d0lnQTBFRE5nTHc5d0lnQTBHOHpBQTdBZlQzQWlBRFFlYTJ6UUEyQXZqM0FpQURRUWcyQXZ6M0FpQURRWVBGQURzQmdQZ0NJQU5CN3JiTkFEWUNoUGdDSUFOQkN6WUNpUGdDSUFOQjBjVUFPd0dNK0FJZ0EwSDV0czBBTmdLUStBSWdBMEVRTmdLVStBSWdBMEhHMVFBN0FaajRBaUFEUVltM3pRQTJBcHo0QWlBRFFRNDJBcUQ0QWlBRFFZdkZBRHNCcFBnQ0lBTkJsN2ZOQURZQ3FQZ0NJQU5CRURZQ3JQZ0NJQU5CaThVQU93R3crQUlnQTBHbnQ4MEFOZ0swK0FJZ0EwRVBOZ0s0K0FJZ0EwR0h4UUE3QWJ6NEFpQURRYmEzelFBMkFzRDRBaUFEUVJNMkFzVDRBaUFEUWN6VkFEc0J5UGdDSUFOQnliZk5BRFlDelBnQ0lBTkJEellDMFBnQ0lBTkJrc1VBT3dIVStBSWdBMEhZdDgwQU5nTFkrQUlnQTBFSU5nTGMrQUlnQTBIYzV3QTdBZUQ0QWlBRFFlQzN6UUEyQXVUNEFpQURRUTgyQXVqNEFpQURRZnptQURzQjdQZ0NJQU5CeUlIT0FEWUM4UGdDSUFOQkFUWUM5UGdDSUFOQjlBQTdBZmo0QWlBRFFlKzN6UUEyQXZ6NEFpQURRUWsyQW9ENUFpQURRYVFUT3dHRStRSWdBMEg0dDgwQU5nS0krUUlnQTBFSU5nS00rUUlnQTBHa3hRQTdBWkQ1QWlBRFFZQzR6UUEyQXBUNUFpQURRUWcyQXBqNUFpQURRYVBGQURzQm5Qa0NJQU5CaUxqTkFEWUNvUGtDSUFOQkJqWUNwUGtDSUFOQnBCSTdBYWo1QWlBRFFZNjR6UUEyQXF6NUFpQURRUW8yQXJENUFpQURRYVFWT3dHMCtRSWdBMEdZdU0wQU5nSzQrUUlnQTBFS05nSzgrUUlnQTBHa0ZEc0J3UGtDSUFOQm9yak5BRFlDeFBrQ0lBTkJDVFlDeVBrQ0lBTkJ0d3c3QWN6NUFpQURRYXU0elFBMkF0RDVBaUFEUVE0MkF0VDVBaUFEUWNMOUF6c0IyUGtDSUFOQnViak5BRFlDM1BrQ0lBTkJFRFlDNFBrQ0lBTkJ3LzBET3dIaytRSWdBMEhKdU0wQU5nTG8rUUlnQTBFS05nTHMrUUlnQTBIZjRBQTdBZkQ1QWlBRFFkTzR6UUEyQXZUNUFpQURRUTgyQXZqNUFpQURRY1Q5QXpzQi9Qa0NJQU5CNHJqTkFEWUNnUG9DSUFOQkVEWUNoUG9DSUFOQi9lWUFPd0dJK2dJZ0EwSHl1TTBBTmdLTStnSWdBMEVLTmdLUStnSWdBMEcvNFFBN0FaVDZBaUFEUWZ5NHpRQTJBcGo2QWlBRFFSTTJBcHo2QWlBRFFZRC9BenNCb1BvQ0lBTkJqN25OQURZQ3BQb0NJQU5CRFRZQ3FQb0NJQU5Cd0F3N0FhejZBaUFEUWR2RHp3QTJBckQ2QWlBRFFRTTJBclQ2QWlBRFFjUUhPd0c0K2dJZ0EwR2N1YzBBTmdLOCtnSWdBMEVETmdMQStnSWdBMEhxQ3pzQnhQb0NJQU5CbjduTkFEWUN5UG9DSUFOQkNEWUN6UG9DSUFOQnl2WURPd0hRK2dJZ0EwR251YzBBTmdMVStnSWdBMEVKTmdMWStnSWdBMEhLOWdNN0FkejZBaUFEUWJDNXpRQTJBdUQ2QWlBRFFRODJBdVQ2QWlBRFFjcjJBenNCNlBvQ0lBTkJ2N25OQURZQzdQb0NJQU5CQ1RZQzhQb0NJQU5CNmdzN0FmVDZBaUFEUWNpNXpRQTJBdmo2QWlBRFFRUTJBdno2QWlBRFFlY0NPd0dBK3dJZ0EwSE11YzBBTmdLRSt3SWdBMEVKTmdLSSt3SWdBMEdLNGdBN0FZejdBaUFEUWJLS3pnQTJBcEQ3QWlBRFFRWTJBcFQ3QWlBRFFlVUNPd0dZK3dJZ0EwSFZ1YzBBTmdLYyt3SWdBMEVHTmdLZyt3SWdBMEdvQlRzQnBQc0NJQU5CMjduTkFEWUNxUHNDSUFOQkNEWUNyUHNDSUFOQjR3STdBYkQ3QWlBRFFlTzV6UUEyQXJUN0FpQURRUXMyQXJqN0FpQURRWVlOT3dHOCt3SWdBMEh1dWMwQU5nTEErd0lnQTBFUU5nTEUrd0lnQTBINzlnTTdBY2o3QWlBRFFmNjV6UUEyQXN6N0FpQURRUkkyQXREN0FpQURRZnoyQXpzQjFQc0NJQU5Ca0xyTkFEWUMyUHNDSUFOQkVUWUMzUHNDSUFOQi9mWURPd0hnK3dJZ0EwR2h1czBBTmdMayt3SWdBMEVXTmdMbyt3SWdBMEg4OWdNN0FlejdBaUFEUWJlNnpRQTJBdkQ3QWlBRFFRYzJBdlQ3QWlBRFFlUEpBRHNCK1BzQ0lBTkJ2cnJOQURZQy9Qc0NJQU5CRURZQ2dQd0NJQU5COFR3N0FZVDhBaUFEUWI2T3pnQTJBb2o4QWlBRFFRdzJBb3o4QWlBRFFlTUNPd0dRL0FJZ0EwSE91czBBTmdLVS9BSWdBMEVKTmdLWS9BSWdBMEdYUFRzQm5Qd0NJQU5CMTdyTkFEWUNvUHdDSUFOQkNqWUNwUHdDSUFOQjZ6dzdBYWo4QWlBRFFlRzZ6UUEyQXF6OEFpQURRUWsyQXJEOEFpQURRZTA4T3dHMC9BSWdBMEhxdXMwQU5nSzQvQUlnQTBFS05nSzgvQUlnQTBIQ0NEc0J3UHdDSUFOQjlMck5BRFlDeFB3Q0lBTkJFellDeVB3Q0lBTkJyUWs3QWN6OEFpQURRWWU3elFBMkF0RDhBaUFEUVFrMkF0VDhBaUFEUWFvTU93SFkvQUlnQTBHUXU4MEFOZ0xjL0FJZ0EwRU9OZ0xnL0FJZ0EwR1cvUU03QWVUOEFpQURRWjY3elFBMkF1ajhBaUFEUVJNMkF1ejhBaUFEUWFMNUF6c0I4UHdDSUFOQnNidk5BRFlDOVB3Q0lBTkJGRFlDK1B3Q0lBTkJqUGdET3dIOC9BSWdBMEhGdTgwQU5nS0EvUUlnQTBFUU5nS0UvUUlnQTBHWC9RTTdBWWo5QWlBRFFkVzd6UUEyQW96OUFpQURRUW8yQXBEOUFpQURRZWJnQURzQmxQMENJQU5CMzd2TkFEWUNtUDBDSUFOQkZEWUNuUDBDSUFOQm9ma0RPd0dnL1FJZ0EwSHp1ODBBTmdLay9RSWdBMEVWTmdLby9RSWdBMEdMK0FNN0FhejlBaUFEUVlpOHpRQTJBckQ5QWlBRFFSQTJBclQ5QWlBRFFha01Pd0c0L1FJZ0EwR1l2TTBBTmdLOC9RSWdBMEVWTmdMQS9RSWdBMEdVL1FNN0FjVDlBaUFEUWEyOHpRQTJBc2o5QWlBRFFRODJBc3o5QWlBRFFaajlBenNCMFAwQ0lBTkJ2THpOQURZQzFQMENJQU5CRkRZQzJQMENJQU5CcFBrRE93SGMvUUlnQTBIUXZNMEFOZ0xnL1FJZ0EwRVZOZ0xrL1FJZ0EwR08rQU03QWVqOUFpQURRZVc4elFBMkF1ejlBaUFEUVJJMkF2RDlBaUFEUWZQNEF6c0I5UDBDSUFOQjk3ek5BRFlDK1AwQ0lBTkJDallDL1AwQ0lBTkJ4dUVBT3dHQS9nSWdBMEdCdmMwQU5nS0UvZ0lnQTBFVE5nS0kvZ0lnQTBHRC93TTdBWXorQWlBRFFaUzl6UUEyQXBEK0FpQURRUWsyQXBUK0FpQURRYUhDQURzQm1QNENJQU5CbmIzTkFEWUNuUDRDSUFOQkRqWUNvUDRDSUFOQmpzd0FPd0drL2dJZ0EwR3J2YzBBTmdLby9nSWdBMEVUTmdLcy9nSWdBMEdnQ3pzQnNQNENJQU5CdnIzTkFEWUN0UDRDSUFOQkV6WUN1UDRDSUFOQnFRczdBYnorQWlBRFFkRzl6UUEyQXNEK0FpQURRUWsyQXNUK0FpQURRZW5JQURzQnlQNENJQU5CMnIzTkFEWUN6UDRDSUFOQkV6WUMwUDRDSUFOQnFlUUFPd0hVL2dJZ0EwSHR2YzBBTmdMWS9nSWdBMEVJTmdMYy9nSWdBMEg5eUFBN0FlRCtBaUFEUWZXOXpRQTJBdVQrQWlBRFFRazJBdWorQWlBRFFaSEpBRHNCN1A0Q0lBTkIvcjNOQURZQzhQNENJQU5CQ0RZQzlQNENJQU5CK2NJQU93SDQvZ0lnQTBHR3ZzMEFOZ0w4L2dJZ0EwRUVOZ0tBL3dJZ0EwR25CVHNCaFA4Q0lBTkJpcjdOQURZQ2lQOENJQU5CQXpZQ2pQOENJQU5CMkFzN0FaRC9BaUFEUVkyK3pRQTJBcFQvQWlBRFFRazJBcGovQWlBRFFiajJBenNCblA4Q0lBTkJscjdOQURZQ29QOENJQU5CRHpZQ3BQOENJQU5CdVBZRE93R28vd0lnQTBHbHZzMEFOZ0tzL3dJZ0EwRUpOZ0t3L3dJZ0EwSFlDenNCdFA4Q0lBTkJycjdOQURZQ3VQOENJQU5CRFRZQ3ZQOENJQU5CdFFrN0FjRC9BaUFEUWJ1K3pRQTJBc1QvQWlBRFFRczJBc2ovQWlBRFFac0xPd0hNL3dJZ0EwSEd2czBBTmdMUS93SWdBMEVQTmdMVS93SWdBMEdiQ3pzQjJQOENJQU5CMWI3TkFEWUMzUDhDSUFOQkNqWUM0UDhDSUFOQnBSTTdBZVQvQWlBRFFkKyt6UUEyQXVqL0FpQURRUWMyQXV6L0FpQURRYVVTT3dIdy93SWdBMEhtdnMwQU5nTDAvd0lnQTBFTE5nTDQvd0lnQTBHbEZUc0IvUDhDSUFOQjhiN05BRFlDZ0lBRElBTkJDellDaElBRElBTkJwUlE3QVlpQUF5QURRZnkrelFBMkFveUFBeUFEUVFvMkFwQ0FBeUFEUWJBTU93R1VnQU1nQTBHR3Y4MEFOZ0tZZ0FNZ0EwRVBOZ0tjZ0FNZ0EwR3MvUU03QWFDQUF5QURRWlcvelFBMkFxU0FBeUFEUVJZMkFxaUFBeUFEUVpqeEF6c0JySUFESUFOQnE3L05BRFlDc0lBRElBTkJGellDdElBRElBTkJsL0VET3dHNGdBTWdBMEhDdjgwQU5nSzhnQU1nQTBFUE5nTEFnQU1nQTBITUhEc0J4SUFESUFOQjBiL05BRFlDeUlBRElBTkJHRFlDeklBRElBTkJsdkVET3dIUWdBTWdBMEhwdjgwQU5nTFVnQU1nQTBFS05nTFlnQU1nQTBHckREc0IzSUFESUFOQjg3L05BRFlDNElBRElBTkJEellDNUlBRElBTkJtdjBET3dIb2dBTWdBMEdDd00wQU5nTHNnQU1nQTBFUk5nTHdnQU1nQTBHYi9RTTdBZlNBQXlBRFFaUEF6UUEyQXZpQUF5QURRUkEyQXZ5QUF5QURRWno5QXpzQmdJRURJQU5CbzhETkFEWUNoSUVESUFOQkN6WUNpSUVESUFOQmc4UUFPd0dNZ1FNZ0EwSHV3czhBTmdLUWdRTWdBMEVKTmdLVWdRTWdBMEcweEFBN0FaaUJBeUFEUWM3RHp3QTJBcHlCQXlBRFFRVTJBcUNCQXlBRFFiZ0hPd0drZ1FNZ0EwR2x3czhBTmdLb2dRTWdBMEVHTmdLc2dRTWdBMEhSQnpzQnNJRURJQU5CcnNETkFEWUN0SUVESUFOQkVEWUN1SUVESUFOQjBRYzdBYnlCQXlBRFFiN0F6UUEyQXNDQkF5QURRUlEyQXNTQkF5QURRZm5rQURzQnlJRURJQU5CMHNETkFEWUN6SUVESUFOQkV6WUMwSUVESUFOQm1lUUFPd0hVZ1FNZ0EwSGx3TTBBTmdMWWdRTWdBMEVUTmdMY2dRTWdBMEhyNUFBN0FlQ0JBeUFEUWZqQXpRQTJBdVNCQXlBRFFRMDJBdWlCQXlBRFFjemlBRHNCN0lFRElBTkJoY0hOQURZQzhJRURJQU5CRWpZQzlJRURJQU5CaStRQU93SDRnUU1nQTBHWHdjMEFOZ0w4Z1FNZ0EwRU9OZ0tBZ2dNZ0EwSHN5QUE3QVlTQ0F5QURRYVhCelFBMkFvaUNBeUFEUVEwMkFveUNBeUFEUVlESkFEc0JrSUlESUFOQnNzSE5BRFlDbElJRElBTkJEallDbUlJRElBTkJsTWtBT3dHY2dnTWdBMEhBd2MwQU5nS2dnZ01nQTBFUk5nS2tnZ01nQTBHUkhEc0JxSUlESUFOQjBjSE5BRFlDcklJRElBTkJCVFlDc0lJRElBTkJyUU03QWJTQ0F5QURRZGJCelFBMkFyaUNBeUFEUVE0MkFyeUNBeUFEUVpJY093SEFnZ01nQTBHZ2k4NEFOZ0xFZ2dNZ0EwRUZOZ0xJZ2dNZ0EwSCtBVHNCeklJRElBTkI1TUhOQURZQzBJSURJQU5CRFRZQzFJSURJQU5CbHh3N0FkaUNBeUFEUWZIQnpRQTJBdHlDQXlBRFFRczJBdUNDQXlBRFFaQWNPd0hrZ2dNZ0EwSDh3YzBBTmdMb2dnTWdBMEVNTmdMc2dnTWdBMEdZSERzQjhJSURJQU5CaU1MTkFEWUM5SUlESUFOQkREWUMrSUlESUFOQmxodzdBZnlDQXlBRFFaVEN6UUEyQW9DREF5QURRUkEyQW9TREF5QURRWUlKT3dHSWd3TWdBMEdrd3MwQU5nS01nd01nQTBFWU5nS1Fnd01nQTBIc0REc0JsSU1ESUFOQnZNTE5BRFlDbUlNRElBTkJHVFlDbklNRElBTkI3QXc3QWFDREF5QURRWmVBemdBMkFxU0RBeUFEUVFVMkFxaURBeUFEUVRNN0FheURBeUFEUWRYQ3pRQTJBckNEQXlBRFFRczJBclNEQXlBRFFlTU1Pd0c0Z3dNZ0EwSGd3czBBTmdLOGd3TWdBMEVNTmdMQWd3TWdBMEhwRXpzQnhJTURJQU5CN01MTkFEWUN5SU1ESUFOQkN6WUN6SU1ESUFOQjRzZ0FPd0hRZ3dNZ0EwSDN3czBBTmdMVWd3TWdBMEViTmdMWWd3TWdBMEdNendBN0FkeURBeUFEUVpMRHpRQTJBdUNEQXlBRFFRazJBdVNEQXlBRFFla1NPd0hvZ3dNZ0EwR2J3ODBBTmdMc2d3TWdBMEVNTmdMd2d3TWdBMEhjd2dBN0FmU0RBeUFEUWFmRHpRQTJBdmlEQXlBRFFRMDJBdnlEQXlBRFFla1ZPd0dBaEFNZ0EwRzB3ODBBTmdLRWhBTWdBMEVOTmdLSWhBTWdBMEhwRkRzQmpJUURJQU5Cd2NQTkFEWUNrSVFESUFOQkR6WUNsSVFESUFOQjR3dzdBWmlFQXlBRFFkRER6UUEyQXB5RUF5QURRUTAyQXFDRUF5QURRYVBnQURzQnBJUURJQU5CM2NQTkFEWUNxSVFESUFOQkZUWUNySVFESUFOQm91UUFPd0d3aEFNZ0EwSHl3ODBBTmdLMGhBTWdBMEVOTmdLNGhBTWdBMEdEd1FBN0FieUVBeUFEUWYvRHpRQTJBc0NFQXlBRFFRNDJBc1NFQXlBRFFaUCtBenNCeUlRRElBTkJqY1ROQURZQ3pJUURJQU5CRlRZQzBJUURJQU5COWhNN0FkU0VBeUFEUWFMRXpRQTJBdGlFQXlBRFFRMDJBdHlFQXlBRFFiUHVBenNCNElRRElBTkJyOFROQURZQzVJUURJQU5CQ2pZQzZJUURJQU5COXNnQU93SHNoQU1nQTBHNXhNMEFOZ0x3aEFNZ0EwRUxOZ0wwaEFNZ0EwR0t5UUE3QWZpRUF5QURRY1RFelFBMkF2eUVBeUFEUVF3MkFvQ0ZBeUFEUWZNTk93R0VoUU1nQTBIYmk4NEFOZ0tJaFFNZ0EwRU5OZ0tNaFFNZ0EwRytBVHNCa0lVRElBTkIwTVROQURZQ2xJVURJQU5CRXpZQ21JVURJQU5CM3UwRE93R2NoUU1nQTBIanhNMEFOZ0tnaFFNZ0EwRUtOZ0traFFNZ0EwSHl3Z0E3QWFpRkF5QURRYWVJemdBMkFxeUZBeUFEUVEwMkFyQ0ZBeUFEUWJNQk93RzBoUU1nQTBIdHhNMEFOZ0s0aFFNZ0EwRUpOZ0s4aFFNZ0EwSFRIRHNCd0lVRElBTkI5c1ROQURZQ3hJVURJQU5CQ1RZQ3lJVURJQU5CbE9jQU93SE1oUU1nQTBIL3hNMEFOZ0xRaFFNZ0EwRUROZ0xVaFFNZ0EwSEF3QUE3QWRpRkF5QURRWUxGelFBMkF0eUZBeUFEUVFvMkF1Q0ZBeUFEUWVIZ0FEc0I1SVVESUFOQmpNWE5BRFlDNklVRElBTkJDallDN0lVRElBTkJ3ZUVBT3dId2hRTWdBMEdXeGMwQU5nTDBoUU1nQTBFVE5nTDRoUU1nQTBHQi93TTdBZnlGQXlBRFFhbkZ6UUEyQW9DR0F5QURRUk0yQW9TR0F5QURRZkRrQURzQmlJWURJQU5Cdk1YTkFEWUNqSVlESUFOQkVqWUNrSVlESUFOQmtPUUFPd0dVaGdNZ0EwSE94YzBBTmdLWWhnTWdBMEVTTmdLY2hnTWdBMEhpNUFBN0FhQ0dBeUFEUWVERnpRQTJBcVNHQXlBRFFRdzJBcWlHQXlBRFFiZmlBRHNCcklZRElBTkI3TVhOQURZQ3NJWURJQU5CRVRZQ3RJWURJQU5CZ3VRQU93RzRoZ01nQTBHQ2hNNEFOZ0s4aGdNZ0EwRUZOZ0xBaGdNZ0EwSGNCVHNCeElZRElBTkIvY1hOQURZQ3lJWURJQU5CRFRZQ3pJWURJQU5Cc0FZN0FkQ0dBeUFEUVlyR3pRQTJBdFNHQXlBRFFRZzJBdGlHQXlBRFFZTUdPd0hjaGdNZ0EwR1N4czBBTmdMZ2hnTWdBMEVKTmdMa2hnTWdBMEdEQmpzQjZJWURJQU5CbThiTkFEWUM3SVlESUFOQkRqWUM4SVlESUFOQjRBWTdBZlNHQXlBRFFhbkd6UUEyQXZpR0F5QURRUTAyQXZ5R0F5QURRYnpFQURzQmdJY0RJQU5CdHNiTkFEWUNoSWNESUFOQkR6WUNpSWNESUFOQnRBWTdBWXlIQXlBRFFjWEd6UUEyQXBDSEF5QURRUkEyQXBTSEF5QURRYjRHT3dHWWh3TWdBMEhWeHMwQU5nS2Nod01nQTBFSk5nS2dod01nQTBHREJqc0JwSWNESUFOQjNzYk5BRFlDcUljRElBTkJDallDckljRElBTkJnd1k3QWJDSEF5QURRZWpHelFBMkFyU0hBeUFEUVFzMkFyaUhBeUFEUVlNR093Rzhod01nQTBIenhzMEFOZ0xBaHdNZ0EwRUxOZ0xFaHdNZ0EwSGNCVHNCeUljRElBTkIvc2JOQURZQ3pJY0RJQU5CQ3pZQzBJY0RJQU5CbDhVQU93SFVod01nQTBHSng4MEFOZ0xZaHdNZ0EwRU1OZ0xjaHdNZ0EwR1dDenNCNEljRElBTkJsY2ZOQURZQzVJY0RJQU5CRURZQzZJY0RJQU5CbGdzN0FleUhBeUFEUWFYSHpRQTJBdkNIQXlBRFFRMDJBdlNIQXlBRFFmQVVPd0g0aHdNZ0EwR3l4ODBBTmdMOGh3TWdBMEVRTmdLQWlBTWdBMEdEQ1RzQmhJZ0RJQU5Cd3NmTkFEWUNpSWdESUFOQkREWUNqSWdESUFOQi93bzdBWkNJQXlBRFFjN0h6UUEyQXBTSUF5QURRUW8yQXBpSUF5QURRZTg4T3dHY2lBTWdBMEhZeDgwQU5nS2dpQU1nQTBFS05nS2tpQU1nQTBIVS9nTTdBYWlJQXlBRFFlTEh6UUEyQXF5SUF5QURRUW8yQXJDSUF5QURRZWtLT3dHMGlBTWdBMEhzeDgwQU5nSzRpQU1nQTBFS05nSzhpQU1nQTBIbzRBQTdBY0NJQXlBRFFmYkh6UUEyQXNTSUF5QURRUW8yQXNpSUF5QURRY2poQURzQnpJZ0RJQU5CZ01qTkFEWUMwSWdESUFOQkV6WUMxSWdESUFOQmhQOERPd0hZaUFNZ0EwR1R5TTBBTmdMY2lBTWdBMEVUTmdMZ2lBTWdBMEhsQlRzQjVJZ0RJQU5CcHNqTkFEWUM2SWdESUFOQkVqWUM3SWdESUFOQjZRVTdBZkNJQXlBRFFiakl6UUEyQXZTSUF5QURRUTQyQXZpSUF5QURRZVlGT3dIOGlBTWdBMEhHeU0wQU5nS0FpUU1nQTBFTk5nS0VpUU1nQTBIb0JUc0JpSWtESUFOQjA4ak5BRFlDaklrRElBTkJEVFlDa0lrRElBTkI1d1U3QVpTSkF5QURRZURJelFBMkFwaUpBeUFEUVFnMkFweUpBeUFEUWIwRE93R2dpUU1nQTBIb3lNMEFOZ0traVFNZ0EwRUhOZ0tvaVFNZ0EwR0ZBenNCcklrRElBTkI3OGpOQURZQ3NJa0RJQU5CQnpZQ3RJa0RJQU5CcUFNN0FiaUpBeUFEUWZiSXpRQTJBcnlKQXlBRFFRVTJBc0NKQXlBRFFZUUhPd0hFaVFNZ0EwSDd5TTBBTmdMSWlRTWdBMEVKTmdMTWlRTWdBMEduNWdBN0FkQ0pBeUFEUVlUSnpRQTJBdFNKQXlBRFFRczJBdGlKQXlBRFFZOGNPd0hjaVFNZ0EwR1B5YzBBTmdMZ2lRTWdBMEVZTmdMa2lRTWdBMEdVNEFBN0FlaUpBeUFEUWFmSnpRQTJBdXlKQXlBRFFSMDJBdkNKQXlBRFFkMzhBenNCOUlrRElBTkJ4TW5OQURZQytJa0RJQU5CSURZQy9Ja0RJQU5CdWZ3RE93R0FpZ01nQTBIa3ljMEFOZ0tFaWdNZ0EwRVpOZ0tJaWdNZ0EwR1Y0QUE3QVl5S0F5QURRZjNKelFBMkFwQ0tBeUFEUVI0MkFwU0tBeUFEUWQ3OEF6c0JtSW9ESUFOQm04ck5BRFlDbklvRElBTkJJVFlDb0lvRElBTkJ1dndET3dHa2lnTWdBMEc4eXMwQU5nS29pZ01nQTBFSk5nS3NpZ01nQTBHVkhEc0JzSW9ESUFOQnhjck5BRFlDdElvRElBTkJERFlDdUlvRElBTkJxd003QWJ5S0F5QURRZEhLelFBMkFzQ0tBeUFEUVFZMkFzU0tBeUFEUWEvSkFEc0J5SW9ESUFOQmlJek9BRFlDeklvRElBTkJDVFlDMElvRElBTkJvc0lBT3dIVWlnTWdBMEgzeDg4QU5nTFlpZ01nQTBFTk5nTGNpZ01nQTBIcThRTTdBZUNLQXlBRFFldkd6d0EyQXVTS0F5QURRUTQyQXVpS0F5QURRZHZ0QXpzQjdJb0RJQU5CMThyTkFEWUM4SW9ESUFOQkRqWUM5SW9ESUFOQmlBVTdBZmlLQXlBRFFlWEt6UUEyQXZ5S0F5QURRUWMyQW9DTEF5QURRYnpMQURzQmhJc0RJQU5CN01yTkFEWUNpSXNESUFOQkJ6WUNqSXNESUFOQnhNc0FPd0dRaXdNZ0EwSHp5czBBTmdLVWl3TWdBMEVITmdLWWl3TWdBMEc2eXdBN0FaeUxBeUFEUWZyS3pRQTJBcUNMQXlBRFFRYzJBcVNMQXlBRFFiTExBRHNCcUlzRElBTkJnY3ZOQURZQ3JJc0RJQU5CQ0RZQ3NJc0RJQU5CczhzQU93RzBpd01nQTBHSnk4MEFOZ0s0aXdNZ0EwRVBOZ0s4aXdNZ0EwRzh5d0E3QWNDTEF5QURRWmpMelFBMkFzU0xBeUFEUVFzMkFzaUxBeUFEUWIzTEFEc0J6SXNESUFOQm84dk5BRFlDMElzRElBTkJERFlDMUlzRElBTkJ1Y3NBT3dIWWl3TWdBMEd2eTgwQU5nTGNpd01nQTBFUk5nTGdpd01nQTBHMHhRQTdBZVNMQXlBRFFjREx6UUEyQXVpTEF5QURRUTgyQXV5TEF5QURRY0RMQURzQjhJc0RJQU5Cejh2TkFEWUM5SXNESUFOQkRUWUMrSXNESUFOQnc4c0FPd0g4aXdNZ0EwSGN5ODBBTmdLQWpBTWdBMEVTTmdLRWpBTWdBMEcxeFFBN0FZaU1BeUFEUWU3THpRQTJBb3lNQXlBRFFSQTJBcENNQXlBRFFiYkxBRHNCbEl3RElBTkIvc3ZOQURZQ21Jd0RJQU5CRFRZQ25Jd0RJQU5Cc3NzQU93R2dqQU1nQTBHTHpNMEFOZ0trakFNZ0EwRUNOZ0tvakFNZ0EwR21CVHNCckl3RElBTkJqY3pOQURZQ3NJd0RJQU5CQlRZQ3RJd0RJQU5CNWdzN0FiaU1BeUFEUVpMTXpRQTJBcnlNQXlBRFFRczJBc0NNQXlBRFFjYjJBenNCeEl3RElBTkJuY3pOQURZQ3lJd0RJQU5CRVRZQ3pJd0RJQU5CeHZZRE93SFFqQU1nQTBHdXpNMEFOZ0xVakFNZ0EwRUxOZ0xZakFNZ0EwSG1DenNCM0l3RElBTkJ1Y3pOQURZQzRJd0RJQU5CQ3pZQzVJd0RJQU5CeGdnN0FlaU1BeUFEUWNUTXpRQTJBdXlNQXlBRFFRVTJBdkNNQXlBRFFiVUxPd0gwakFNZ0EwSEp6TTBBTmdMNGpBTWdBMEVITmdMOGpBTWdBMEcxQ3pzQmdJMERJQU5CME16TkFEWUNoSTBESUFOQkJ6WUNpSTBESUFOQnRRczdBWXlOQXlBRFFkZk16UUEyQXBDTkF5QURRUWMyQXBTTkF5QURRYlVMT3dHWWpRTWdBMEhlek0wQU5nS2NqUU1nQTBFTE5nS2dqUU1nQTBHMUN6c0JwSTBESUFOQjZjek5BRFlDcUkwRElBTkJFVFlDckkwRElBTkJ0UXM3QWJDTkF5QURRZnJNelFBMkFyU05BeUFEUVJJMkFyaU5BeUFEUWJVTE93RzhqUU1nQTBHTXpjMEFOZ0xBalFNZ0EwRVBOZ0xFalFNZ0EwRzFDenNCeUkwRElBTkJtODNOQURZQ3pJMERJQU5CRERZQzBJMERJQU5CMndnN0FkU05BeUFEUWFmTnpRQTJBdGlOQXlBRFFRazJBdHlOQXlBRFFmUHRBenNCNEkwRElBTkJzTTNOQURZQzVJMERJQU5CQ2pZQzZJMERJQU5CbnhNN0FleU5BeUFEUWJyTnpRQTJBdkNOQXlBRFFRYzJBdlNOQXlBRFFaOFNPd0g0alFNZ0EwSEJ6YzBBTmdMOGpRTWdBMEVMTmdLQWpnTWdBMEdmRlRzQmhJNERJQU5Cek0zTkFEWUNpSTRESUFOQkN6WUNqSTRESUFOQm54UTdBWkNPQXlBRFFkZk56UUEyQXBTT0F5QURRUW8yQXBpT0F5QURRZmtNT3dHY2pnTWdBMEhoemMwQU5nS2dqZ01nQTBFUE5nS2tqZ01nQTBIbjlnTTdBYWlPQXlBRFFmRE56UUEyQXF5T0F5QURRUkUyQXJDT0F5QURRZWoyQXpzQnRJNERJQU5CZ2M3TkFEWUN1STRESUFOQkVEWUN2STRESUFOQjZmWURPd0hBamdNZ0EwR1J6czBBTmdMRWpnTWdBMEVMTmdMSWpnTWdBMEdnRXpzQnpJNERJQU5Cbk03TkFEWUMwSTRESUFOQkNEWUMxSTRESUFOQm9CSTdBZGlPQXlBRFFhVE96UUEyQXR5T0F5QURRUXcyQXVDT0F5QURRYUFWT3dIa2pnTWdBMEd3enMwQU5nTG9qZ01nQTBFTU5nTHNqZ01nQTBHZ0ZEc0I4STRESUFOQnZNN05BRFlDOUk0RElBTkJCellDK0k0RElBTkJod1U3QWZ5T0F5QURRY1BPelFBMkFvQ1BBeUFEUVFvMkFvU1BBeUFEUWVUZ0FEc0JpSThESUFOQnpjN05BRFlDakk4RElBTkJDallDa0k4RElBTkJ4T0VBT3dHVWp3TWdBMEhYenMwQU5nS1lqd01nQTBFVE5nS2Nqd01nQTBHQy93TTdBYUNQQXlBRFFlck96UUEyQXFTUEF5QURRUTAyQXFpUEF5QURRYUxGQURzQnJJOERJQU5COTg3TkFEWUNzSThESUFOQkRqWUN0SThESUFOQm84VUFPd0c0andNZ0EwR0Z6ODBBTmdLOGp3TWdBMEVQTmdMQWp3TWdBMEhqNEFBN0FjU1BBeUFEUVpUUHpRQTJBc2lQQXlBRFFRODJBc3lQQXlBRFFjUGhBRHNCMEk4RElBTkJvOC9OQURZQzFJOERJQU5CR0RZQzJJOERJQU5CNy80RE93SGNqd01nQTBHN3o4MEFOZ0xnandNZ0EwRU1OZ0xrandNZ0EwSHJ5QUE3QWVpUEF5QURRY2ZQelFBMkF1eVBBeUFEUVFzMkF2Q1BBeUFEUWYvSUFEc0I5SThESUFOQjBzL05BRFlDK0k4RElBTkJERFlDL0k4RElBTkJrOGtBT3dHQWtBTWdBMEhlejgwQU5nS0VrQU1nQTBFTE5nS0lrQU1nQTBIN3dnQTdBWXlRQXlBRFFlblB6UUEyQXBDUUF5QURRUXMyQXBTUUF5QURRZDd0QXpzQm1KQURJQU5COU0vTkFEWUNuSkFESUFOQkREWUNvSkFESUFOQjg4Z0FPd0dra0FNZ0EwR0EwTTBBTmdLb2tBTWdBMEVPTmdLc2tBTWdBMEhFcGdFN0FiQ1FBeUFEUVk3UXpRQTJBclNRQXlBRFFRczJBcmlRQXlBRFFZZkpBRHNCdkpBRElBTkJtZEROQURZQ3dKQURJQU5CRERZQ3hKQURJQU5CbThrQU93SElrQU1nQTBHVWdNNEFOZ0xNa0FNZ0EwRUROZ0xRa0FNZ0EwRXlPd0hVa0FNZ0EwR2wwTTBBTmdMWWtBTWdBMEVKTmdMY2tBTWdBMEhpRERzQjRKQURJQU5CcnRETkFEWUM1SkFESUFOQkNqWUM2SkFESUFOQjZCTTdBZXlRQXlBRFFialF6UUEyQXZDUUF5QURRUWsyQXZTUUF5QURRZUhJQURzQitKQURJQU5Cd2RETkFEWUMvSkFESUFOQkdUWUNnSkVESUFOQmk4OEFPd0dFa1FNZ0EwSGEwTTBBTmdLSWtRTWdBMEVITmdLTWtRTWdBMEhvRWpzQmtKRURJQU5CNGRETkFEWUNsSkVESUFOQkRqWUNtSkVESUFOQnBjQUFPd0dja1FNZ0EwSHYwTTBBTmdLZ2tRTWdBMEVNTmdLa2tRTWdBMEdsd0FBN0FhaVJBeUFEUWZ2UXpRQTJBcXlSQXlBRFFSUTJBckNSQXlBRFFiRDhBenNCdEpFRElBTkJqOUhOQURZQ3VKRURJQU5CQ3pZQ3ZKRURJQU5CNkJVN0FjQ1JBeUFEUVpyUnpRQTJBc1NSQXlBRFFRczJBc2lSQXlBRFFlZ1VPd0hNa1FNZ0EwR2wwYzBBTmdMUWtRTWdBMEVOTmdMVWtRTWdBMEhpRERzQjJKRURJQU5Cc3RITkFEWUMzSkVESUFOQkN6WUM0SkVESUFOQm91QUFPd0hra1FNZ0EwRzkwYzBBTmdMb2tRTWdBMEVUTmdMc2tRTWdBMEdoNUFBN0FmQ1JBeUFEUWREUnpRQTJBdlNSQXlBRFFRczJBdmlSQXlBRFFZTEJBRHNCL0pFRElBTkIyOUhOQURZQ2dKSURJQU5CRERZQ2hKSURJQU5Ca3Y0RE93R0lrZ01nQTBIbjBjMEFOZ0tNa2dNZ0EwRVROZ0tRa2dNZ0EwSDFFenNCbEpJRElBTkIrdEhOQURZQ21KSURJQU5CQ3pZQ25KSURJQU5Cc3U0RE93R2drZ01nQTBHRjBzMEFOZ0tra2dNZ0EwRUlOZ0tva2dNZ0EwSDF5QUE3QWF5U0F5QURRWTNTelFBMkFyQ1NBeUFEUVFrMkFyU1NBeUFEUVluSkFEc0J1SklESUFOQmx0TE5BRFlDdkpJRElBTkJDallDd0pJRElBTkI4ZzA3QWNTU0F5QURRYURTelFBMkFzaVNBeUFEUVFnMkFzeVNBeUFEUWZIQ0FEc0IwSklESUFOQnFOTE5BRFlDMUpJRElBTkJDVFlDMkpJRElBTkJ1d003QWR5U0F5QURRYVdMemdBMkF1Q1NBeUFEUVFzMkF1U1NBeUFEUWJJQk93SG9rZ01nQTBHeDBzMEFOZ0xza2dNZ0EwRUhOZ0x3a2dNZ0EwSFNIRHNCOUpJRElBTkJ1TkxOQURZQytKSURJQU5CQ1RZQy9KSURJQU5CMU1JQU93R0Frd01nQTBISmdjNEFOZ0tFa3dNZ0EwRUJOZ0tJa3dNZ0EwSDFBRHNCakpNRElBTkJ6b2pPQURZQ2tKTURJQU5CQmpZQ2xKTURJQU5CK2dFN0FaaVRBeUFEUWNIU3pRQTJBcHlUQXlBRFFRUTJBcUNUQXlBRFFZa0ZPd0dra3dNZ0EwSEYwczBBTmdLb2t3TWdBMEVJTmdLc2t3TWdBMEdKRXpzQnNKTURJQU5CemRMTkFEWUN0Sk1ESUFOQkNUWUN1Sk1ESUFOQnFPSUFPd0c4a3dNZ0EwSFcwczBBTmdMQWt3TWdBMEVHTmdMRWt3TWdBMEh0QWpzQnlKTURJQU5CM05MTkFEWUN6Sk1ESUFOQkJqWUMwSk1ESUFOQjFBTTdBZFNUQXlBRFFlTFN6UUEyQXRpVEF5QURRUWMyQXR5VEF5QURRZVRKQURzQjRKTURJQU5CeUlmT0FEWUM1Sk1ESUFOQkN6WUM2Sk1ESUFOQit3RTdBZXlUQXlBRFFlblN6UUEyQXZDVEF5QURRUkEyQXZTVEF5QURRZmM4T3dINGt3TWdBMEg1MHMwQU5nTDhrd01nQTBFSk5nS0FsQU1nQTBIRENEc0JoSlFESUFOQmd0UE5BRFlDaUpRRElBTkJDallDakpRRElBTkIwUkk3QVpDVUF5QURRWXpUelFBMkFwU1VBeUFEUVFrMkFwaVVBeUFEUWZFQ093R2NsQU1nQTBHVjA4MEFOZ0tnbEFNZ0EwRUpOZ0trbEFNZ0EwR1ZCRHNCcUpRRElBTkJudFBOQURZQ3JKUURJQU5CQlRZQ3NKUURJQU5CaVJJN0FiU1VBeUFEUWQyT3pnQTJBcmlVQXlBRFFRazJBcnlVQXlBRFFmd0JPd0hBbEFNZ0EwR2owODBBTmdMRWxBTWdBMEVPTmdMSWxBTWdBMEhZQXpzQnpKUURJQU5Cc2RQTkFEWUMwSlFESUFOQkRqWUMxSlFESUFOQjh6dzdBZGlVQXlBRFFiL1R6UUEyQXR5VUF5QURRUTQyQXVDVUF5QURRZG9ET3dIa2xBTWdBMEhOMDgwQU5nTG9sQU1nQTBFUk5nTHNsQU1nQTBIeENUc0I4SlFESUFOQjN0UE5BRFlDOUpRRElBTkJEallDK0pRRElBTkIzQU03QWZ5VUF5QURRZXpUelFBMkFvQ1ZBeUFEUVE4MkFvU1ZBeUFEUWRZRE93R0lsUU1nQTBINzA4MEFOZ0tNbFFNZ0EwRUpOZ0tRbFFNZ0EwSGxQVHNCbEpVRElBTkJxbzNPQURZQ21KVURJQU5CQmpZQ25KVURJQU5CK1FFN0FhQ1ZBeUFEUVlUVXpRQTJBcVNWQXlBRFFRazJBcWlWQXlBRFFZa1ZPd0dzbFFNZ0EwR04xTTBBTmdLd2xRTWdBMEVKTmdLMGxRTWdBMEdKRkRzQnVKVURJQU5CbHRUTkFEWUN2SlVESUFOQkNUWUN3SlVESUFOQnh1QUFPd0hFbFFNZ0EwR2YxTTBBTmdMSWxRTWdBMEVLTmdMTWxRTWdBMEhuUFRzQjBKVURJQU5CcWRUTkFEWUMxSlVESUFOQkJUWUMySlVESUFOQnNBTTdBZHlWQXlBRFFhN1V6UUEyQXVDVkF5QURRUW8yQXVTVkF5QURRZWs5T3dIb2xRTWdBMEc0MU0wQU5nTHNsUU1nQTBFTk5nTHdsUU1nQTBIeFBUc0I5SlVESUFOQnhkVE5BRFlDK0pVRElBTkJDallDL0pVRElBTkI2ejA3QVlDV0F5QURRYy9VelFBMkFvU1dBeUFEUVE0MkFvaVdBeUFEUWUwOU93R01sZ01nQTBIZDFNMEFOZ0tRbGdNZ0EwRUtOZ0tVbGdNZ0EwSHZQVHNCbUpZRElBTkJxWVhPQURZQ25KWURJQU5CRFRZQ29KWURJQU5COFFJN0FhU1dBeUFEUWVmVXpRQTJBcWlXQXlBRFFSVTJBcXlXQXlBRFFmTUpPd0d3bGdNZ0EwSDgxTTBBTmdLMGxnTWdBMEVPTmdLNGxnTWdBMEdYQkRzQnZKWURJQU5CaXRYTkFEWUN3SllESUFOQkNUWUN4SllESUFOQnB1RUFPd0hJbGdNZ0EwR1QxYzBBTmdMTWxnTWdBMEVTTmdMUWxnTWdBMEh6L2dNN0FkU1dBeUFEUWFYVnpRQTJBdGlXQXlBRFFRbzJBdHlXQXlBRFFma0lPd0hnbGdNZ0EwR3YxYzBBTmdMa2xnTWdBMEVITmdMb2xnTWdBMEhjNGdBN0FleVdBeUFEUWFpSnpnQTJBdkNXQXlBRFFRYzJBdlNXQXlBRFFlc0NPd0g0bGdNZ0EwRzIxYzBBTmdMOGxnTWdBMEVQTmdLQWx3TWdBMEh2Q1RzQmhKY0RJQU5CeGRYTkFEWUNpSmNESUFOQkR6WUNqSmNESUFOQit6dzdBWkNYQXlBRFFkVFZ6UUEyQXBTWEF5QURRUTQyQXBpWEF5QURRY0VVT3dHY2x3TWdBMEhpMWMwQU5nS2dsd01nQTBFS05nS2tsd01nQTBIVi9nTTdBYWlYQXlBRFFhS0J6Z0EyQXF5WEF5QURRUW8yQXJDWEF5QURRZDhBT3dHMGx3TWdBMEhzMWMwQU5nSzRsd01nQTBFTk5nSzhsd01nQTBHWHdBQTdBY0NYQXlBRFFmblZ6UUEyQXNTWEF5QURRUk0yQXNpWEF5QURRYi8rQXpzQnpKY0RJQU5Cak5iTkFEWUMwSmNESUFOQkVqWUMxSmNESUFOQnMvd0RPd0hZbHdNZ0EwR2UxczBBTmdMY2x3TWdBMEVPTmdMZ2x3TWdBMEhQL0FNN0FlU1hBeUFEUWZERnp3QTJBdWlYQXlBRFFRVTJBdXlYQXlBRFFhckVBRHNCOEpjRElBTkJyTmJOQURZQzlKY0RJQU5CQ0RZQytKY0RJQU5CMDhVQU93SDhsd01nQTBHMDFzMEFOZ0tBbUFNZ0EwRU1OZ0tFbUFNZ0EwSER4UUE3QVlpWUF5QURRY0RXelFBMkFveVlBeUFEUVFvMkFwQ1lBeUFEUVk3RkFEc0JsSmdESUFOQnl0Yk5BRFlDbUpnRElBTkJFVFlDbkpnRElBTkJqc1VBT3dHZ21BTWdBMEhiMXMwQU5nS2ttQU1nQTBFT05nS29tQU1nQTBHT3hRQTdBYXlZQXlBRFFlbld6UUEyQXJDWUF5QURRUWMyQXJTWUF5QURRWlRGQURzQnVKZ0RJQU5COE5iTkFEWUN2SmdESUFOQkRqWUN3SmdESUFOQmxNVUFPd0hFbUFNZ0EwSCsxczBBTmdMSW1BTWdBMEVMTmdMTW1BTWdBMEdVeFFBN0FkQ1lBeUFEUVluWHpRQTJBdFNZQXlBRFFRazJBdGlZQXlBRFFjUEZBRHNCM0pnRElBTkIwc0hQQURZQzRKZ0RJQU5CQ1RZQzVKZ0RJQU5CZ01RQU93SG9tQU1nQTBHbGhzNEFOZ0xzbUFNZ0EwRUhOZ0x3bUFNZ0EwSHpBanNCOUpnRElBTkJrdGZOQURZQytKZ0RJQU5CQmpZQy9KZ0RJQU5Cc01rQU93R0FtUU1nQTBHWTE4MEFOZ0tFbVFNZ0EwRUhOZ0tJbVFNZ0EwR0F5d0E3QVl5WkF5QURRWi9YelFBMkFwQ1pBeUFEUVE0MkFwU1pBeUFEUWNRTE93R1ltUU1nQTBHdDE4MEFOZ0tjbVFNZ0EwRUdOZ0tnbVFNZ0EwSFB4UUE3QWFTWkF5QURRZDdEendBMkFxaVpBeUFEUVFjMkFxeVpBeUFEUWNVSE93R3dtUU1nQTBHY0NUc0JqQjhnQTBFWU5nS0lIeUFEUWM3NHlnQTJBb1FmSUFOQm5nazdBWUFmSUFOQkVEWUMvQjRnQTBHKytNb0FOZ0w0SGlBRFFab0hPd0gwSGlBRFFRVTJBdkFlSUFOQnE4TFBBRFlDN0I0Z0EwSERDVHNCNkI0Z0EwRU9OZ0xrSGlBRFFiRDR5Z0EyQXVBZUlBTkJtZ2s3QWR3ZUlBTkJFellDMkI0Z0EwR2QrTW9BTmdMVUhpQURRWm9JT3dIUUhpQURRUW8yQXN3ZUlBTkJrL2pLQURZQ3lCNGdBMEd3UERzQnhCNGdBMEVHTmdMQUhpQURRWTM0eWdBMkFyd2VJQU5Cb0FrN0FiZ2VJQU5CRVRZQ3RCNGdBMEg4OThvQU5nS3dIaUFEUWMzbkFEc0JyQjRnQTBFSU5nS29IaUFEUWZUM3lnQTJBcVFlSUFOQmhlY0FPd0dnSGlBRFFRZzJBcHdlSUFOQjdQZktBRFlDbUI0Z0EwSExBRHNCbEI0Z0EwRUJOZ0tRSGlBRFFlZUF6Z0EyQW93ZUlBTkI2dTRET3dHSUhpQURRUVkyQW9RZUlBTkI1dmZLQURZQ2dCNGdBMEdxL2dNN0Fmd2RJQU5CQ2pZQytCMGdBMEhjOThvQU5nTDBIU0FEUWNzS093SHdIU0FEUVF3MkF1d2RJQU5CMFBmS0FEWUM2QjBnQTBHSUNEc0I1QjBnQTBFS05nTGdIU0FEUWNiM3lnQTJBdHdkSUFOQnRBSTdBZGdkSUFOQkN6WUMxQjBnQTBHNzk4b0FOZ0xRSFNBRFFiL0pBRHNCekIwZ0EwRUhOZ0xJSFNBRFFiVDN5Z0EyQXNRZElBTkJ3UW83QWNBZElBTkJDallDdkIwZ0EwR3E5OG9BTmdLNEhTQURRY29BT3dHMEhTQURRUUUyQXJBZElBTkI1b0RPQURZQ3JCMGdBMEgyQ0RzQnFCMGdBMEVYTmdLa0hTQURRWlAzeWdBMkFxQWRJQU5COUFnN0Fad2RJQU5CRHpZQ21CMGdBMEdFOThvQU5nS1VIU0FEUWF3OE93R1FIU0FEUVFzMkFvd2RJQU5CK2ZiS0FEWUNpQjBnQTBHb0Fqc0JoQjBnQTBFR05nS0FIU0FEUWZQMnlnQTJBdndjSUFOQmx3TTdBZmdjSUFOQkJ6WUM5QndnQTBIczlzb0FOZ0x3SENBRFFlbnVBenNCN0J3Z0EwRUdOZ0xvSENBRFFlYjJ5Z0EyQXVRY0lBTkJpZ2M3QWVBY0lBTkJDVFlDM0J3Z0EwSGQ5c29BTmdMWUhDQURRYW9IT3dIVUhDQURRUXcyQXRBY0lBTkIwZmJLQURZQ3pCd2dBMEdXQXpzQnlCd2dBMEVMTmdMRUhDQURRY2IyeWdBMkFzQWNJQU5CbVFjN0Fid2NJQU5CQkRZQ3VCd2dBMEdod3M4QU5nSzBIQ0FEUWE0Q093R3dIQ0FEUVFjMkFxd2NJQU5CbFk3T0FEWUNxQndnQTBHQkNEc0JwQndnQTBFS05nS2dIQ0FEUWJ6MnlnQTJBcHdjSUFOQnV3bzdBWmdjSUFOQkN6WUNsQndnQTBHeDlzb0FOZ0tRSENBRFFhbitBenNCakJ3Z0EwRUtOZ0tJSENBRFFhZjJ5Z0EyQW9RY0lBTkI0Z2s3QVlBY0lBTkJEellDL0JzZ0EwR1k5c29BTmdMNEd5QURRYW9DT3dIMEd5QURRUWMyQXZBYklBTkJvWXpPQURZQzdCc2dBMEdaQ0RzQjZCc2dBMEVQTmdMa0d5QURRWW4yeWdBMkF1QWJJQU5CaWdRN0Fkd2JJQU5CRGpZQzJCc2dBMEg3OWNvQU5nTFVHeUFEUVpnSU93SFFHeUFEUVFvMkFzd2JJQU5COGZYS0FEWUN5QnNnQTBISVBUc0J4QnNnQTBFS05nTEFHeUFEUWVmMXlnQTJBcndiSUFOQjdPOERPd0c0R3lBRFFRczJBclFiSUFOQjNQWEtBRFlDc0JzZ0EwSE1BVHNCckJzZ0EwRUdOZ0tvR3lBRFFadU16Z0EyQXFRYklBTkJrY0lBT3dHZ0d5QURRUWcyQXB3YklBTkJxY1hQQURZQ21Cc2dBMEdSd2dBN0FaUWJJQU5CQ0RZQ2tCc2dBMEhVOWNvQU5nS01HeUFEUVpVSU93R0lHeUFEUVFvMkFvUWJJQU5CeXZYS0FEWUNnQnNnQTBIV0NUc0IvQm9nQTBFUE5nTDRHaUFEUWJ2MXlnQTJBdlFhSUFOQnlqMDdBZkFhSUFOQkNUWUM3Qm9nQTBHeTljb0FOZ0xvR2lBRFFiQUNPd0hrR2lBRFFRbzJBdUFhSUFOQjNZbk9BRFlDM0JvZ0EwR3dBanNCMkJvZ0EwRUVOZ0xVR2lBRFFhNzF5Z0EyQXRBYUlBTkI3KzhET3dITUdpQURRUTQyQXNnYUlBTkJvUFhLQURZQ3hCb2dBMEhrQ1RzQndCb2dBMEVSTmdLOEdpQURRWS8xeWdBMkFyZ2FJQU5Ccmp3N0FiUWFJQU5CRGpZQ3NCb2dBMEdCOWNvQU5nS3NHaUFEUWM4Qk93R29HaUFEUVFrMkFxUWFJQU5CbElYT0FEWUNvQm9nQTBHSUJEc0JuQm9nQTBFSk5nS1lHaUFEUWZqMHlnQTJBcFFhSUFOQmhnZzdBWkFhSUFOQkNUWUNqQm9nQTBIdjlNb0FOZ0tJR2lBRFFlN3ZBenNCaEJvZ0EwRVFOZ0tBR2lBRFFkLzB5Z0EyQXZ3WklBTkJ6Z0U3QWZnWklBTkJDellDOUJrZ0EwR3RqczRBTmdMd0dTQURRYjdKQURzQjdCa2dBMEVITmdMb0dTQURRZGoweWdBMkF1UVpJQU5CendNN0FlQVpJQU5CQmpZQzNCa2dBMEhTOU1vQU5nTFlHU0FEUWF3Q093SFVHU0FEUVFZMkF0QVpJQU5CelBUS0FEWUN6QmtnQTBIdDd3TTdBY2daSUFOQkN6WUN4QmtnQTBIQjlNb0FOZ0xBR1NBRFFjMEJPd0c4R1NBRFFRWTJBcmdaSUFOQnRZbk9BRFlDdEJrZ0EwR3VDRHNCc0JrZ0EwRUtOZ0tzR1NBRFFiZjB5Z0EyQXFnWklBTkJzZ0k3QWFRWklBTkJBallDb0JrZ0EwRzE5TW9BTmdLY0dTQURRYThJT3dHWUdTQURRUW8yQXBRWklBTkJxL1RLQURZQ2tCa2dBMEhKQURzQmpCa2dBMEVCTmdLSUdTQURRZVdBemdBMkFvUVpJQU5Ca09jQU93R0FHU0FEUVFnMkF2d1lJQU5Cby9US0FEWUMrQmdnQTBINDdRTTdBZlFZSUFOQkVUWUM4QmdnQTBHUzlNb0FOZ0xzR0NBRFFjL3RBenNCNkJnZ0EwRU1OZ0xrR0NBRFFZYjB5Z0EyQXVBWUlBTkI2TzRET3dIY0dDQURRUVkyQXRnWUlBTkJnUFRLQURZQzFCZ2dBMEhvQnpzQjBCZ2dBMEVLTmdMTUdDQURRZmJ6eWdBMkFzZ1lJQU5Cd0FvN0FjUVlJQU5CQ2pZQ3dCZ2dBMEhzODhvQU5nSzhHQ0FEUWFqK0F6c0J1QmdnQTBFS05nSzBHQ0FEUWVMenlnQTJBckFZSUFOQnBEdzdBYXdZSUFOQkNUWUNxQmdnQTBIWjg4b0FOZ0trR0NBRFFhSThPd0dnR0NBRFFRbzJBcHdZSUFOQnovUEtBRFlDbUJnZ0EwR21QRHNCbEJnZ0EwRUpOZ0tRR0NBRFFjYnp5Z0EyQW93WUlBTkJwQUk3QVlnWUlBTkJDellDaEJnZ0EwRzc4OG9BTmdLQUdDQURRYjNKQURzQi9CY2dBMEVITmdMNEZ5QURRYlR6eWdBMkF2UVhJQU5CcUR3N0FmQVhJQU5CQ0RZQzdCY2dBMEdzODhvQU5nTG9GeUFEUWFvOE93SGtGeUFEUVFzMkF1QVhJQU5Cb2ZQS0FEWUMzQmNnQTBHbUFqc0IyQmNnQTBFRU5nTFVGeUFEUVozenlnQTJBdEFYSUFOQnFnZzdBY3dYSUFOQkVEWUN5QmNnQTBHTjg4b0FOZ0xFRnlBRFFiSUpPd0hBRnlBRFFSTTJBcndYSUFOQit2TEtBRFlDdUJjZ0EwR29DVHNCdEJjZ0EwRVROZ0t3RnlBRFFlZnl5Z0EyQXF3WElBTkJ5K2NBT3dHb0Z5QURRUWcyQXFRWElBTkIzL0xLQURZQ29CY2dBMEdoeXdBN0Fad1hJQU5CQmpZQ21CY2dBMEhaOHNvQU5nS1VGeUFEUWF2TEFEc0JrQmNnQTBFR05nS01GeUFEUWRQeXlnQTJBb2dYSUFOQnFzc0FPd0dFRnlBRFFRWTJBb0FYSUFOQnpmTEtBRFlDL0JZZ0EwSFB5d0E3QWZnV0lBTkJCallDOUJZZ0EwSEg4c29BTmdMd0ZpQURRY2dBT3dIc0ZpQURRUUUyQXVnV0lBTkI1SURPQURZQzVCWWdBMEhrQXpzQjRCWWdBMEVITmdMY0ZpQURRY0R5eWdBMkF0Z1dJQU5CbXdVN0FkUVdJQU5CQ2pZQzBCWWdBMEcyOHNvQU5nTE1GaUFEUWVmdUF6c0J5QllnQTBFR05nTEVGaUFEUWJEeXlnQTJBc0FXSUFOQjRPNERPd0c4RmlBRFFRbzJBcmdXSUFOQnB2TEtBRFlDdEJZZ0EwSE83UU03QWJBV0lBTkJCVFlDckJZZ0EwR2g4c29BTmdLb0ZpQURRYWYrQXpzQnBCWWdBMEVLTmdLZ0ZpQURRWmZ5eWdBMkFwd1dJQU5Cd2NJQU93R1lGaUFEUVFRMkFwUVdJQU5Cay9MS0FEWUNrQllnQTBHZ1BEc0JqQllnQTBFSE5nS0lGaUFEUVl6eXlnQTJBb1FXSUFOQmd3ZzdBWUFXSUFOQkN6WUMvQlVnQTBHQjhzb0FOZ0w0RlNBRFFiTUtPd0gwRlNBRFFRczJBdkFWSUFOQjl2SEtBRFlDN0JVZ0EwR1RBenNCNkJVZ0EwRUZOZ0xrRlNBRFFmSHh5Z0EyQXVBVklBTkJrQWs3QWR3VklBTkJFVFlDMkJVZ0EwSGc4Y29BTmdMVUZTQURRWklKT3dIUUZTQURRUkUyQXN3VklBTkJ6L0hLQURZQ3lCVWdBMEdVQ1RzQnhCVWdBMEVWTmdMQUZTQURRYnJ4eWdBMkFyd1ZJQU5Cd2dvN0FiZ1ZJQU5CRERZQ3RCVWdBMEd1OGNvQU5nS3dGU0FEUVlPd0F6c0JyQlVnQTBFUE5nS29GU0FEUVoveHlnQTJBcVFWSUFOQm5qMDdBYUFWSUFOQkNqWUNuQlVnQTBHVjhjb0FOZ0tZRlNBRFFaTUlPd0dVRlNBRFFRbzJBcEFWSUFOQmkvSEtBRFlDakJVZ0EwR2dBanNCaUJVZ0EwRUtOZ0tFRlNBRFFZSHh5Z0EyQW9BVklBTkJvQUk3QWZ3VUlBTkJCRFlDK0JRZ0EwSDk4TW9BTmdMMEZDQURRYUlDT3dId0ZDQURRUXcyQXV3VUlBTkJ2SWZPQURZQzZCUWdBMEdjQWpzQjVCUWdBMEVMTmdMZ0ZDQURRZkx3eWdBMkF0d1VJQU5Cdk1rQU93SFlGQ0FEUVFjMkF0UVVJQU5CNi9ES0FEWUMwQlFnQTBHaUFqc0J6QlFnQTBFSU5nTElGQ0FEUWVQd3lnQTJBc1FVSUFOQjVnTTdBY0FVSUFOQkJqWUN2QlFnQTBIZDhNb0FOZ0s0RkNBRFFaNENPd0cwRkNBRFFRWTJBckFVSUFOQjE0bk9BRFlDckJRZ0EwSHFCenNCcUJRZ0EwRU1OZ0trRkNBRFFkSHd5Z0EyQXFBVUlBTkJsQU03QVp3VUlBTkJERFlDbUJRZ0EwSEY4TW9BTmdLVUZDQURRWk1IT3dHUUZDQURRUVUyQW93VUlBTkJtY0xQQURZQ2lCUWdBMEgwQXpzQmhCUWdBMEVHTmdLQUZDQURRYi93eWdBMkF2d1RJQU5CaCtjQU93SDRFeUFEUVFnMkF2UVRJQU5CdC9ES0FEWUM4Qk1nQTBISEFEc0I3Qk1nQTBFQk5nTG9FeUFEUWVPQXpnQTJBdVFUSUFOQjV1NERPd0hnRXlBRFFRWTJBdHdUSUFOQnNmREtBRFlDMkJNZ0EwSGp3Z0E3QWRRVElBTkJDVFlDMEJNZ0EwR284TW9BTmdMTUV5QURRYWIrQXpzQnlCTWdBMEVLTmdMRUV5QURRWjd3eWdBMkFzQVRJQU5CNU1JQU93RzhFeUFEUVFrMkFyZ1RJQU5CbGZES0FEWUN0Qk1nQTBIeUNEc0JzQk1nQTBFTU5nS3NFeUFEUVlud3lnQTJBcWdUSUFOQnNzSUFPd0drRXlBRFFRUTJBcUFUSUFOQmhmREtBRFlDbkJNZ0EwR1JBenNCbUJNZ0EwRUZOZ0tVRXlBRFFZRHd5Z0EyQXBBVElBTkI1QWM3QVl3VElBTkJDVFlDaUJNZ0EwSDM3OG9BTmdLRUV5QURRZFlLT3dHQUV5QURRUXMyQXZ3U0lBTkI3Ty9LQURZQytCSWdBMEdlUERzQjlCSWdBMEVLTmdMd0VpQURRZUx2eWdBMkF1d1NJQU5CdThrQU93SG9FaUFEUVFjMkF1UVNJQU5CMisvS0FEWUM0QklnQTBHR3NBTTdBZHdTSUFOQkJ6WUMyQklnQTBIVTc4b0FOZ0xVRWlBRFFZV3dBenNCMEJJZ0EwRUhOZ0xNRWlBRFFjM3Z5Z0EyQXNnU0lBTkJoTEFET3dIRUVpQURRUWMyQXNBU0lBTkJ4dS9LQURZQ3ZCSWdBMEdJc0FNN0FiZ1NJQU5CQ0RZQ3RCSWdBMEcrNzhvQU5nS3dFaUFEUVlld0F6c0JyQklnQTBFSU5nS29FaUFEUWJidnlnQTJBcVFTSUFOQnhnQTdBYUFTSUFOQkFUWUNuQklnQTBIaWdNNEFOZ0tZRWlBRFFiZ0RPd0dVRWlBRFFRczJBcEFTSUFOQnErL0tBRFlDakJJZ0EwSHVBenNCaUJJZ0EwRUlOZ0tFRWlBRFFhUHZ5Z0EyQW9BU0lBTkJ0d003QWZ3UklBTkJBellDK0JFZ0EwR2c3OG9BTmdMMEVTQURRYXpCQURzQjhCRWdBMEVFTmdMc0VTQURRYUdQemdBMkF1Z1JJQU5CbWp3N0FlUVJJQU5CQ3pZQzRCRWdBMEdWNzhvQU5nTGNFU0FEUWJ3OU93SFlFU0FEUVFZMkF0UVJJQU5CaisvS0FEWUMwQkVnQTBIdzd3TTdBY3dSSUFOQkNEWUN5QkVnQTBHSDc4b0FOZ0xFRVNBRFFkQUJPd0hBRVNBRFFRTTJBcndSSUFOQm00ck9BRFlDdUJFZ0EwR0pCenNCdEJFZ0EwRUlOZ0t3RVNBRFFmL3V5Z0EyQXF3UklBTkJ1QW83QWFnUklBTkJDallDcEJFZ0EwSDE3c29BTmdLZ0VTQURRWmNIT3dHY0VTQURRUU0yQXBnUklBTkJuc0xQQURZQ2xCRWdBMEhsN2dNN0FaQVJJQU5CQmpZQ2pCRWdBMEh2N3NvQU5nS0lFU0FEUWFrRE93R0VFU0FEUVFNMkFvQVJJQU5CN083S0FEWUMvQkFnQTBHcUNUc0IrQkFnQTBFVE5nTDBFQ0FEUWRudXlnQTJBdkFRSUFOQm9RZzdBZXdRSUFOQkNqWUM2QkFnQTBIUDdzb0FOZ0xrRUNBRFFhMElPd0hnRUNBRFFSRTJBdHdRSUFOQnZ1N0tBRFlDMkJBZ0EwR09BenNCMUJBZ0EwRUpOZ0xRRUNBRFFiWHV5Z0EyQXN3UUlBTkJvQWc3QWNnUUlBTkJDallDeEJBZ0EwR3I3c29BTmdMQUVDQURRWWdIT3dHOEVDQURRUXcyQXJnUUlBTkJuKzdLQURZQ3RCQWdBMEdWQnpzQnNCQWdBMEVITmdLc0VDQURRWS9DendBMkFxZ1FJQU5Ca0FNN0FhUVFJQU5CQlRZQ29CQWdBMEdhN3NvQU5nS2NFQ0FEUVpnQ093R1lFQ0FEUVFjMkFwUVFJQU5Cem92T0FEWUNrQkFnQTBISENUc0JqQkFnQTBFT05nS0lFQ0FEUVl6dXlnQTJBb1FRSUFOQnBBazdBWUFRSUFOQkRUWUMvQThnQTBILzdjb0FOZ0w0RHlBRFFjb0NPd0gwRHlBRFFRTTJBdkFQSUFOQi9PM0tBRFlDN0E4Z0EwR2lDVHNCNkE4Z0EwRVROZ0xrRHlBRFFlbnR5Z0EyQXVBUElBTkJuUWc3QWR3UElBTkJDallDMkE4Z0EwSGY3Y29BTmdMVUR5QURRYVgrQXpzQjBBOGdBMEVLTmdMTUR5QURRZFh0eWdBMkFzZ1BJQU5CbkFnN0FjUVBJQU5CQ2pZQ3dBOGdBMEhMN2NvQU5nSzhEeUFEUVpROE93RzREeUFEUVF3MkFyUVBJQU5CdiszS0FEWUNzQThnQTBHV1BEc0JyQThnQTBFTU5nS29EeUFEUWJQdHlnQTJBcVFQSUFOQmtnSTdBYUFQSUFOQkJ6WUNuQThnQTBIUGhzNEFOZ0tZRHlBRFFlckNBRHNCbEE4Z0EwRUxOZ0tRRHlBRFFhanR5Z0EyQW93UElBTkJtd2c3QVlnUElBTkJDallDaEE4Z0EwR2U3Y29BTmdLQUR5QURRZVFJT3dIOERpQURRUkUyQXZnT0lBTkJqZTNLQURZQzlBNGdBMEdHQkRzQjhBNGdBMEVPTmdMc0RpQURRZi9zeWdBMkF1Z09JQU5CNThJQU93SGtEaUFEUVFvMkF1QU9JQU5COWV6S0FEWUMzQTRnQTBHNlBUc0IyQTRnQTBFS05nTFVEaUFEUWV2c3lnQTJBdEFPSUFOQnR3bzdBY3dPSUFOQkNqWUN5QTRnQTBIaDdNb0FOZ0xFRGlBRFFlanZBenNCd0E0Z0EwRUxOZ0s4RGlBRFFkYnN5Z0EyQXJnT0lBTkJ5QUU3QWJRT0lBTkJCallDc0E0Z0EwSHdpYzRBTmdLc0RpQURRYVFJT3dHb0RpQURRUW8yQXFRT0lBTkJ6T3pLQURZQ29BNGdBMEc0UFRzQm5BNGdBMEVKTmdLWURpQURRY1BzeWdBMkFwUU9JQU5CbGdJN0FaQU9JQU5CQ2pZQ2pBNGdBMEdSaDg0QU5nS0lEaUFEUVpZQ093R0VEaUFEUVFRMkFvQU9JQU5Cdit6S0FEWUMvQTBnQTBIcjd3TTdBZmdOSUFOQkRqWUM5QTBnQTBHeDdNb0FOZ0x3RFNBRFFjc0JPd0hzRFNBRFFRazJBdWdOSUFOQnJJYk9BRFlDNUEwZ0EwR0VCRHNCNEEwZ0EwRUpOZ0xjRFNBRFFhanN5Z0EyQXRnTklBTkJoQWc3QWRRTklBTkJDVFlDMEEwZ0EwR2Y3TW9BTmdMTURTQURRY1E5T3dISURTQURRUkEyQXNRTklBTkJqK3pLQURZQ3dBMGdBMEhxN3dNN0Fid05JQU5CRURZQ3VBMGdBMEgvNjhvQU5nSzBEU0FEUWNJOU93R3dEU0FEUVJRMkFxd05JQU5CNit2S0FEWUNxQTBnQTBIQVBUc0JwQTBnQTBFUU5nS2dEU0FEUWR2cnlnQTJBcHdOSUFOQnhqMDdBWmdOSUFOQkV6WUNsQTBnQTBISTY4b0FOZ0tRRFNBRFFaZzhPd0dNRFNBRFFSQTJBb2dOSUFOQnVPdktBRFlDaEEwZ0EwRytQVHNCZ0EwZ0EwRVFOZ0w4RENBRFFhanJ5Z0EyQXZnTUlBTkJ5Z0U3QWZRTUlBTkJDellDOEF3Z0EwSC9pTTRBTmdMc0RDQURRYnJKQURzQjZBd2dBMEVITmdMa0RDQURRYUhyeWdBMkF1QU1JQU5CdFFvN0Fkd01JQU5CQ3pZQzJBd2dBMEdXNjhvQU5nTFVEQ0FEUVp3OE93SFFEQ0FEUVEwMkFzd01JQU5CaWV2S0FEWUN5QXdnQTBHYUFqc0J4QXdnQTBFR05nTEFEQ0FEUVkrT3pnQTJBcndNSUFOQmxBSTdBYmdNSUFOQkJqWUN0QXdnQTBHRDY4b0FOZ0t3RENBRFFlbnZBenNCckF3Z0EwRUxOZ0tvRENBRFFmanF5Z0EyQXFRTUlBTkJ5UUU3QWFBTUlBTkJCallDbkF3Z0EwSGNqTTRBTmdLWURDQURRY1VBT3dHVURDQURRUUUyQXBBTUlBTkI0WURPQURZQ2pBd2dBMEdQQ0RzQmlBd2dBMEVNTmdLRURDQURRZXpxeWdBMkFvQU1JQU5CaFFnN0Fmd0xJQU5CQ3pZQytBc2dBMEhoNnNvQU5nTDBDeUFEUWVBSk93SHdDeUFEUVJRMkF1d0xJQU5CemVyS0FEWUM2QXNnQTBIRkF6c0I1QXNnQTBFSE5nTGdDeUFEUWNicXlnQTJBdHdMSUFOQjhnTTdBZGdMSUFOQkFqWUMxQXNnQTBIRTZzb0FOZ0xRQ3lBRFFZc0RPd0hNQ3lBRFFRYzJBc2dMSUFOQnZlcktBRFlDeEFzZ0EwSGs3Z003QWNBTElBTkJCallDdkFzZ0EwRzM2c29BTmdLNEN5QURRWkFDT3dHMEN5QURRUVkyQXJBTElBTkJzZXJLQURZQ3JBc2dBMEgzN1FNN0FhZ0xJQU5CRGpZQ3BBc2dBMEdqNnNvQU5nS2dDeUFEUWFUK0F6c0JuQXNnQTBFS05nS1lDeUFEUVpucXlnQTJBcFFMSUFOQmpqdzdBWkFMSUFOQkNqWUNqQXNnQTBHUDZzb0FOZ0tJQ3lBRFFZSUlPd0dFQ3lBRFFRczJBb0FMSUFOQmhPcktBRFlDL0FvZ0EwSGNCenNCK0FvZ0EwRU1OZ0wwQ2lBRFFmanB5Z0EyQXZBS0lBTkIzUWM3QWV3S0lBTkJCellDNkFvZ0EwSHg2Y29BTmdMa0NpQURRYWp2QXpzQjRBb2dBMEVOTmdMY0NpQURRZVRweWdBMkF0Z0tJQU5CemUwRE93SFVDaUFEUVEwMkF0QUtJQU5CMStuS0FEWUN6QW9nQTBITTdRTTdBY2dLSUFOQkRUWUN4QW9nQTBISzZjb0FOZ0xBQ2lBRFFjdnRBenNCdkFvZ0EwRUlOZ0s0Q2lBRFFjTHB5Z0EyQXJRS0lBTkJpZ003QWJBS0lBTkJCVFlDckFvZ0EwRzk2Y29BTmdLb0NpQURRWlFIT3dHa0NpQURRUW8yQXFBS0lBTkJzK25LQURZQ25Bb2dBMEdHeEFBN0FaZ0tJQU5CQlRZQ2xBb2dBMEdiaTg0QU5nS1FDaUFEUWU0SE93R01DaUFEUVFrMkFvZ0tJQU5CcXVuS0FEWUNoQW9nQTBHVUNEc0JnQW9nQTBFS05nTDhDU0FEUWFEcHlnQTJBdmdKSUFOQmpEdzdBZlFKSUFOQkNUWUM4QWtnQTBHWDZjb0FOZ0xzQ1NBRFFZbzhPd0hvQ1NBRFFRbzJBdVFKSUFOQmplbktBRFlDNEFrZ0EwR1FBanNCM0FrZ0EwRUdOZ0xZQ1NBRFFiV0d6Z0EyQXRRSklBTkJranc3QWRBSklBTkJFRFlDekFrZ0EwSDk2TW9BTmdMSUNTQURRYm5KQURzQnhBa2dBMEVITmdMQUNTQURRZmJveWdBMkFyd0pJQU5Ca0R3N0FiZ0pJQU5CQ0RZQ3RBa2dBMEh1Nk1vQU5nS3dDU0FEUVk0Q093R3NDU0FEUVFZMkFxZ0pJQU5CdDQzT0FEWUNwQWtnQTBHUUFqc0JvQWtnQTBFRU5nS2NDU0FEUWVyb3lnQTJBcGdKSUFOQmlRTTdBWlFKSUFOQkNEWUNrQWtnQTBIaTZNb0FOZ0tNQ1NBRFFiUUtPd0dJQ1NBRFFRbzJBb1FKSUFOQjJPaktBRFlDZ0FrZ0EwSEVBenNCL0FnZ0EwRUhOZ0w0Q0NBRFFkSG95Z0EyQXZRSUlBTkI4UU03QWZBSUlBTkJBallDN0FnZ0EwSFA2TW9BTmdMb0NDQURRY1FBT3dIa0NDQURRUUUyQXVBSUlBTkI0SURPQURZQzNBZ2dBMEhqN2dNN0FkZ0lJQU5CQmpZQzFBZ2dBMEhKNk1vQU5nTFFDQ0FEUWRFS093SE1DQ0FEUVFvMkFzZ0lJQU5CditqS0FEWUN4QWdnQTBHai9nTTdBY0FJSUFOQkNqWUN2QWdnQTBHMTZNb0FOZ0s0Q0NBRFFmYnRBenNCdEFnZ0EwRVBOZ0t3Q0NBRFFhYm95Z0EyQXF3SUlBTkJod003QWFnSUlBTkJCVFlDcEFnZ0EwR2g2TW9BTmdLZ0NDQURRYWNIT3dHY0NDQURRUU0yQXBnSUlBTkJqTUxQQURZQ2xBZ2dBMEc0Q1RzQmtBZ2dBMEVaTmdLTUNDQURRWWpveWdBMkFvZ0lJQU5CeXdrN0FZUUlJQU5CRlRZQ2dBZ2dBMEh6NThvQU5nTDhCeUFEUWNNS093SDRCeUFEUVF3MkF2UUhJQU5CNStmS0FEWUM4QWNnQTBIMENUc0I3QWNnQTBFVE5nTG9CeUFEUWRUbnlnQTJBdVFISUFOQnRnazdBZUFISUFOQkZEWUMzQWNnQTBIQTU4b0FOZ0xZQnlBRFFiNEpPd0hVQnlBRFFSMDJBdEFISUFOQm8rZktBRFlDekFjZ0EwR25DRHNCeUFjZ0EwRUxOZ0xFQnlBRFFaam55Z0EyQXNBSElBTkJ2QWs3QWJ3SElBTkJGRFlDdUFjZ0EwR0U1OG9BTmdLMEJ5QURRY2tLT3dHd0J5QURRUXMyQXF3SElBTkIrZWJLQURZQ3FBY2dBMEc0N3dNN0FhUUhJQU5CRERZQ29BY2dBMEh0NXNvQU5nS2NCeUFEUVlvQ093R1lCeUFEUVFvMkFwUUhJQU5CNCtiS0FEWUNrQWNnQTBHS0Fqc0JqQWNnQTBFRU5nS0lCeUFEUWQvbXlnQTJBb1FISUFOQmlBSTdBWUFISUFOQkN6WUMvQVlnQTBIVTVzb0FOZ0w0QmlBRFFiakpBRHNCOUFZZ0EwRUhOZ0x3QmlBRFFjM215Z0EyQXV3R0lBTkI1KzhET3dIb0JpQURRUTAyQXVRR0lBTkJ3T2JLQURZQzRBWWdBMEdJUERzQjNBWWdBMEVOTmdMWUJpQURRYlBteWdBMkF0UUdJQU5CeHdFN0FkQUdJQU5CQ0RZQ3pBWWdBMEdlaXM0QU5nTElCaUFEUVl3Q093SEVCaUFEUVFZMkFzQUdJQU5CcEkzT0FEWUN2QVlnQTBIMTdRTTdBYmdHSUFOQkNqWUN0QVlnQTBHcDVzb0FOZ0t3QmlBRFFjcnRBenNCckFZZ0EwRUZOZ0tvQmlBRFFhVG15Z0EyQXFRR0lBTkJoZ0k3QWFBR0lBTkJCallDbkFZZ0EwR0ZoODRBTmdLWUJpQURRYjRLT3dHVUJpQURRUW8yQXBBR0lBTkJtdWJLQURZQ2pBWWdBMEhEQURzQmlBWWdBMEVCTmdLRUJpQURRZCtBemdBMkFvQUdJQU5CZ2dNN0Fmd0ZJQU5CQnpZQytBVWdBMEdUNXNvQU5nTDBCU0FEUWVMdUF6c0I4QVVnQTBFR05nTHNCU0FEUVkzbXlnQTJBdWdGSUFOQjlPMERPd0hrQlNBRFFRbzJBdUFGSUFOQmcrYktBRFlDM0FVZ0EwR2kvZ003QWRnRklBTkJDallDMUFVZ0EwSDU1Y29BTmdMUUJTQURRWVk4T3dITUJTQURRUW8yQXNnRklBTkI3K1hLQURZQ3hBVWdBMEdCQXpzQndBVWdBMEVGTmdLOEJTQURRZXJseWdBMkFyZ0ZJQU5Ca2djN0FiUUZJQU5CQkRZQ3NBVWdBMEdJd3M4QU5nS3NCU0FEUWJJS093R29CU0FEUVFzMkFxUUZJQU5CMytYS0FEWUNvQVVnQTBHUkNEc0JuQVVnQTBFS05nS1lCU0FEUWRYbHlnQTJBcFFGSUFOQmhEdzdBWkFGSUFOQkNUWUNqQVVnQTBITTVjb0FOZ0tJQlNBRFFZSThPd0dFQlNBRFFRbzJBb0FGSUFOQnd1WEtBRFlDL0FRZ0EwRzN5UUE3QWZnRUlBTkJCellDOUFRZ0EwRzc1Y29BTmdMd0JDQURRY0lBT3dIc0JDQURRUUUyQXVnRUlBTkIzb0RPQURZQzVBUWdBMEd4Q2pzQjRBUWdBMEVMTmdMY0JDQURRYkRseWdBMkF0Z0VJQU5CNCs4RE93SFVCQ0FEUVFzMkF0QUVJQU5CcGVYS0FEWUN6QVFnQTBIREFUc0J5QVFnQTBFR05nTEVCQ0FEUWUyTnpnQTJBc0FFSUFOQjRlNERPd0c4QkNBRFFRWTJBcmdFSUFOQm4rWEtBRFlDdEFRZ0EwSGw3d003QWJBRUlBTkJDallDckFRZ0EwR1Y1Y29BTmdLb0JDQURRWUE4T3dHa0JDQURRUW8yQXFBRUlBTkJpK1hLQURZQ25BUWdBMEg2QXpzQm1BUWdBMEVLTmdLVUJDQURRWUhseWdBMkFwQUVJQU5CeFFFN0FZd0VJQU5CQlRZQ2lBUWdBMEg2amM0QU5nS0VCQ0FEUVlRQ093R0FCQ0FEUVFjMkF2d0RJQU5CODQzT0FEWUMrQU1nQTBHaC9nTTdBZlFESUFOQkNqWUM4QU1nQTBIMzVNb0FOZ0xzQXlBRFFZQUNPd0hvQXlBRFFRYzJBdVFESUFOQjNvZk9BRFlDNEFNZ0EwR0dCenNCM0FNZ0EwRUtOZ0xZQXlBRFFlM2t5Z0EyQXRRRElBTkJrUWM3QWRBRElBTkJCVFlDekFNZ0EwR0R3czhBTmdMSUF5QURRWUlFT3dIRUF5QURRUTQyQXNBRElBTkIzK1RLQURZQ3ZBTWdBMEhVQ1RzQnVBTWdBMEVMTmdLMEF5QURRZFRreWdBMkFyQURJQU5Cb2owN0Fhd0RJQU5CQ2pZQ3FBTWdBMEhLNU1vQU5nS2tBeUFEUWVEdkF6c0JvQU1nQTBFTE5nS2NBeUFEUWIva3lnQTJBcGdESUFOQndBRTdBWlFESUFOQkJqWUNrQU1nQTBHNmlNNEFOZ0tNQXlBRFFlQURPd0dJQXlBRFFRbzJBb1FESUFOQnRlVEtBRFlDZ0FNZ0EwR2dQVHNCL0FJZ0EwRUpOZ0w0QWlBRFFhemt5Z0EyQXZRQ0lBTkI1TzhET3dId0FpQURRUTQyQXV3Q0lBTkJudVRLQURZQzZBSWdBMEhlQXpzQjVBSWdBMEVQTmdMZ0FpQURRWS9reWdBMkF0d0NJQU5CMGdrN0FkZ0NJQU5CRVRZQzFBSWdBMEgrNDhvQU5nTFFBaUFEUWNRQk93SE1BaUFEUVFrMkFzZ0NJQU5CeklyT0FEWUN4QUlnQTBHQUJEc0J3QUlnQTBFSk5nSzhBaUFEUWZYanlnQTJBcmdDSUFOQmtBZzdBYlFDSUFOQkNUWUNzQUlnQTBIczQ4b0FOZ0tzQWlBRFFiVHZBenNCcUFJZ0EwRUtOZ0trQWlBRFFlTGp5Z0EyQXFBQ0lBTkJ5ZTBET3dHY0FpQURRUVUyQXBnQ0lBTkIzZVBLQURZQ2xBSWdBMEdxUFRzQmtBSWdBMEVRTmdLTUFpQURRYzNqeWdBMkFvZ0NJQU5CNHU4RE93R0VBaUFEUVJBMkFvQUNJQU5CdmVQS0FEWUMvQUVnQTBHb1BUc0IrQUVnQTBFVU5nTDBBU0FEUWFuanlnQTJBdkFCSUFOQnBqMDdBZXdCSUFOQkVEWUM2QUVnQTBHWjQ4b0FOZ0xrQVNBRFFhdzlPd0hnQVNBRFFSTTJBdHdCSUFOQmh1UEtBRFlDMkFFZ0EwR2tQVHNCMUFFZ0EwRVFOZ0xRQVNBRFFmYml5Z0EyQXN3QklBTkJ3Z0U3QWNnQklBTkJDellDeEFFZ0EwSFJoYzRBTmdMQUFTQURRYmJKQURzQnZBRWdBMEVITmdLNEFTQURRZS9peWdBMkFyUUJJQU5CelFNN0FiQUJJQU5CQmpZQ3JBRWdBMEhwNHNvQU5nS29BU0FEUWJROU93R2tBU0FEUVFzMkFxQUJJQU5CM3VMS0FEWUNuQUVnQTBHeVBUc0JtQUVnQTBFUE5nS1VBU0FEUWMvaXlnQTJBcEFCSUFOQnNEMDdBWXdCSUFOQkN6WUNpQUVnQTBIRTRzb0FOZ0tFQVNBRFFiWTlPd0dBQVNBRFFRNDJBbndnQTBHMjRzb0FOZ0o0SUFOQjBBazdBWFFnQTBFT05nSndJQU5CcU9MS0FEWUNiQ0FEUWE0OU93Rm9JQU5CQ3pZQ1pDQURRWjNpeWdBMkFtQWdBMEdDQWpzQlhDQURRUVkyQWxnZ0EwSEFpTTRBTmdKVUlBTkI0ZThET3dGUUlBTkJDellDVENBRFFaTGl5Z0EyQWtnZ0EwSEJBVHNCUkNBRFFRWTJBa0FnQTBIR2lzNEFOZ0k4SUFOQjV1OERPd0U0SUFOQkJ6WUNOQ0FEUVl2aXlnQTJBakFnQTBIaUF6c0JMQ0FEUVFnMkFpZ2dBMEdENHNvQU5nSWtJQU5CL0FNN0FTQWdBMEVITmdJY0lBTkIvT0hLQURZQ0dDQURRY1lCT3dFVUlBTkJBallDRUNBRFFjdUV6Z0EyQWd3Z0EwSEJBRHNCQ0NBRFFRRTJBZ1JCM0NRaEJTQURRZDJBemdBMkFnQURRQ0FGUVFKSlJRUkFJQVFnQlVFQmRpSUdJQVJxSWdRZ0FTQUNJQU1nQkVFTWJHb2lCQ2dDQUNBRVFRUnFLQUlBRUlNSFFmOEJjVUVCUmhzaEJDQUZJQVpySVFVTUFRc0xBa0FnQVNBQ0lBTWdCRUVNYkdvaUFTZ0NBQ0FCUVFScUtBSUFFSU1IUWY4QmNTSUJCSDlCQUFVZ0JDQUJRZjhCUm1vaUFVSGNKRThOQVNBRElBRkJER3hxTHdFSUlRUkJBUXNoQlNBQUlBUTdBUUlnQUNBRk93RUFJQU5CMExnRGFpUUFEd3RCM0NSQjNDUkJrUGpOQUJER0JBQUw5ZDRCQVJWL0l3QkI4QUZySWcwa0FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQkxRQUFRUUZyRGdvS0NRZ0hCZ1VFQXdJQkFBc2dBU2dDQkNBTklBVTJBdWdCSUEwZ0JEWUM1QUVnQTBFQmF5RU1RWUFDYXlFUEEwQUNRQUpBQWtBQ1FBSkFBa0FnQXlBS1R3UkFJQVVnQzA4RVFDQUZJQXRySWdFZ0F5QUtheUlHSUFFZ0Jra2lEaHNoQVVFQUlRY2dCQ0FMYWlJSUlBSWdDbW9pQm5OQkEzRU5Ba0VBSUFaclFRTnhJaEJCQ0hJZ0FVc05BZ05BSUFjZ0VFWUVRQ0FCUVFocklSQURRQ0FHSUFkcUloRW9BZ0FoQ1NBSElBaHFJaEpCQkdvZ0VVRUVhaWdDQUNJUk5nSUFJQklnQ1RZQ0FDQVJRWUNCZ29SNGNTSVJJQWxCZ0lHQ2hIaHhJZ2x5QkVBZ0JpQUpCSDhnQ1doQkEzWUZJQkZvUVFOMlFRUnFDeUFIYWlJSGFpMEFBQ0VKREFjTElBZEJDR29pQnlBUVRRMEFDd3dFQ3lBR0lBZHFMQUFBSWdsQkFFZ05CQ0FISUFocUlBazZBQUFnQjBFQmFpRUhEQUFMQUFzZ0N5QUZRZnpzd1FBUXVRa0FDeUFLSUFOQjdPekJBQkM1Q1FBTElBY2dBU0FCSUFkSkd5RVFBMEFnQnlBUVJ3UkFJQVlnQjJvc0FBQWlDVUVBU0EwQ0lBY2dDR29nQ1RvQUFDQUhRUUZxSVFjTUFRc0xJQUVnQzJvaEN5QUJJQXBxSVFFTUFRc2dCeUFLYWlFQklBVWdCeUFMYWlJTFFRSnFUUVJBUVFFaERnd0JDeUFCUVFGcUlRb01BUXNnQUNBQk5nSUFJQUFnRFVIa0FXcEJnSUNBZUhFZ0RuSTJBZ1FNQVFzRFFDQVBJQWxCL3dGeFFRRjBhaThCQUNJSFJRUkFJQUJCQURvQUJpQUFRWUlDT3dFRUlBQWdDallDQUF3Q0N5QUVJQXRxSVFFQ2Z5QUhRWUFRVHdSQUlBRkJBbW9nQjBFL2NVR0FBWEk2QUFBZ0FTQUhRUXgyUWVBQmNqb0FBQ0FIUVFaMklRZEJBd3dCQ3lBQklBZEJCblpCd0FGeU9nQUFRUUlMSVE0Z0FVRUJhaUFIUVQ5eFFZQUJjam9BQUNBTElBNXFJUUVnQXlBS1RRUkFJQUFnQ2pZQ0FDQUFRUUE2QUFRZ0FTRUxEQUlMSUEwb0F1Z0JJZ1VnQVVFQ2FrMEVRQ0FBSUFvMkFnQWdBRUVCT2dBRUlBRWhDd3dDQ3lBQ0lBcHFJUWdnRENBS2F5RVFJQTBvQXVRQklnUWdBV29oRVVFQUlRY0NRQU5BSUFjZ0NHb3NBQUFpQ1VFQVNBMEJJQWNnRVdvZ0NUb0FBQ0FKUVR0TERRUWdCeUFRUmdSQUlBRWdCMnBCQVdvaEN5QUFJQU0yQWdBZ0FFRUFPZ0FFREFRTElBRWdCMEVCYWlJSGFpSUdRUUpxSUFWSkRRQUxJQUFnQnlBS2FqWUNBQ0FBUVFFNkFBUWdCaUVMREFJTElBRWdCMm9oQ3lBSElBcHFRUUZxSVFvTUFBc0FDeUFBSUFzMkFnZ01EQXNnQnlBS2FrRUJhaUVLSUFzZ0Rtb2dCMnBCQVdvaEN3d0FDd0FMQWtBQ1FDQUJMUUFIQkVBZ0JVRUNUUVJBREFJTEFuOGdBUzhCQkNJSFFZQUJUd1JBSUFkQmdCQlBCRUFnQkNBSFFUOXhRWUFCY2pvQUFpQUVJQWRCREhaQjRBRnlPZ0FBSUFRZ0IwRUdka0UvY1VHQUFYSTZBQUZCQXd3Q0N5QUVJQWRCUDNGQmdBRnlPZ0FCSUFRZ0IwRUdka0hBQVhJNkFBQkJBZ3dCQ3lBRUlBYzZBQUJCQVFzaERDQUJRUUE3QVFRZ0FVRUFPZ0FIQ3lBRVFRSnFJUmNnQkVFQmFpRVZJQUV0QUFJaEJ3TkFBa0FDUUFKQUFrQUNmd0pBSUFkQkFYRU5BQ0FCTHdFRURRQUNRQUpBQWtBQ1FBSkFBa0FnQXlBS1R3UkFJQUV0QUFZZ0RVSFlBV29nRENBRUlBVkJoUERCQUJDZkJ5QUNJQXBxSVJJZ0F5QUtheUVJSUEwb0F0d0JJUTRnRFNnQzJBRWhFUTBCSUFoQkFra05CMEVBSVF0QkFDRUhJQTVCQkVrTkJpQUlRUUYySWdkQkFXc2lDQ0FISUJJZ0NFRUJkR292QUFCQmdQZ0RjVUdBc0FOR0d5RVVJQTVCQTJzaEZrRUFJUk5CQUNFSkFrQURRQ0FKSUJSTERRRWdEVUhRQVdvZ0V5QVJJQTVCMU83QkFCQ2ZCeUFOS0FMVUFTSUhJQlFnQ1dzaUNDQUhJQWhKR3lFUElCSWdDVUVCZEdvaEMwRUFJUWNnRFNnQzBBRWhFQU5BSUFjZ0QwWU5DQ0FMTHdBQUlnaEIvd0JOQkVBZ0J5QVFhaUFJT2dBQUlBdEJBbW9oQ3lBSFFRRnFJUWNNQVFzTElBY2dDV29oQ3lBSElCTnFJZ2NnRms4TkNDQUxRUUZxSVFrQ1FBTkFBbjhDUUFKQUFrQUNRQUpBSUFoQmdOQUFha0gvL3dOeElndEIvdzlOQkVBZ0MwSC9CMHNnQ1NBVVQzSU5EU0FTSUFsQkFYUnFMd0FBSWc5QmdQZ0RjVUdBdUFOSERRMGdCeUFPVHcwQklBY2dFV29nQ0VILy93TnhRUXAwSUE5cVFZQzQveHBySWdoQkVuWkI4QUZ5T2dBQUlBZEJBV29pQ3lBT1R3MENJQXNnRVdvZ0NFRU1ka0UvY1VHQUFYSTZBQUFDUUNBT0lBZEJBbW9pQzBzRVFDQUxJQkZxSUFoQkJuWkJQM0ZCZ0FGeU9nQUFJQWRCQTJvaUVDQU9UdzBCUVFRaEV5QUpRUUZxREFnTElBc2dEa0dFNzhFQUVNWUVBQXNnRUNBT1FaVHZ3UUFReGdRQUN5QUlRZi8vQTNGQmdCQlBCRUFnQnlBT1R3MERJQWNnRVdvZ0NFR0E0QU54UVF4MlFlQUJjam9BQUFKQUlBNGdCMEVCYWlJTFN3UkFJQXNnRVdvZ0NFRUdka0UvY1VHQUFYSTZBQUFnQjBFQ2FpSVFJQTVQRFFGQkF5RVREQWNMSUFzZ0RrRzA3OEVBRU1ZRUFBc2dFQ0FPUWNUdndRQVF4Z1FBQ3lBSElBNUpEUU1nQnlBT1FkVHZ3UUFReGdRQUN5QUhJQTVCNU83QkFCREdCQUFMSUFzZ0RrSDA3c0VBRU1ZRUFBc2dCeUFPUWFUdndRQVF4Z1FBQ3lBSElCRnFJQWhCQm5aQndBRnlPZ0FBSUE0Z0IwRUJhaUlRU3dSQVFRSWhFd3dCQ3lBUUlBNUI1Ty9CQUJER0JBQUxJQWdoRHlBSkN5RUxJQkFnRVdvZ0QwRS9jVUdBQVhJNkFBQWdDeUFVUmlBSElCTnFJZ2NnRms5eURRb2dDeUFVVHcwQklBdEJBV29oQ1NBU0lBdEJBWFJxTHdBQUlnaEIvd0JMRFFBTElBY2dFV29nQ0RvQUFDQUhRUUZxSVJNTUFRc0xRZS90d1FCQkhrR1E3c0VBRUp3R0FBdEJvTzdCQUVFaVFjVHV3UUFRbkFZQUN5QUtJQU5COU8vQkFCQzVDUUFMSUFoQkFra05CVUVBSVFkQkFDRUpJQTVCQkVrTkFpQUlRUUYySWdkQkFXc2lDQ0FISUJJZ0NFRUJkR292QUFCQi9BRnhRZGdCUmhzaEV5QU9RUU5ySVJSQkFDRVBBa0FEUUNBSklCTkxEUUVnRFVISUFXb2dEeUFSSUE1QjFPN0JBQkNmQnlBTktBTE1BU0lISUJNZ0NXc2lDQ0FISUFoSkd5RVFJQklnQ1VFQmRHb2hDMEVBSVFjZ0RTZ0N5QUVoRmdOQUlBY2dFRVlOQkNBTEx3QUFJZ2hCQ0hRZ0NFRUlkbklpQ0VILy93TnhRZjhBVFFSQUlBY2dGbW9nQ0RvQUFDQUxRUUpxSVFzZ0IwRUJhaUVIREFFTEN5QUhJQWxxSVFrZ0J5QVBhaUlISUJSUERRUWdDVUVCYWlFSkFrQURRQUpBQWtBQ1FBSkFBa0FnQ0VHQTBBQnFRZi8vQTNFaUMwSC9EMDBFUUNBTFFmOEhTeUFKSUJOUGNnMEtJQklnQ1VFQmRHb3ZBQUFpQzBFSWRDQUxRUWgyY2lJTFFZRDRBM0ZCZ0xnRFJ3MEtJQWNnRGs4TkFTQUhJQkZxSUF0Qi8vOERjU0FJUWYvL0EzRkJDblJxUVlDNC94cHJJZ2hCRW5aQjhBRnlPZ0FBSUFkQkFXb2lEeUFPVHcwQ0lBOGdFV29nQ0VFTWRrRS9jVUdBQVhJNkFBQUNRQ0FPSUFkQkFtb2lEMHNFUUNBUElCRnFJQWhCQm5aQlAzRkJnQUZ5T2dBQUlBZEJBMm9pRHlBT1R3MEJJQWxCQVdvaENVRUVJUkFNQndzZ0R5QU9RWVR2d1FBUXhnUUFDeUFQSUE1QmxPL0JBQkRHQkFBTElBaEIvLzhEY1VHQUVFOEVRQ0FISUE1UERRTWdCeUFSYWlBSVFZRGdBM0ZCREhaQjRBRnlPZ0FBQWtBZ0RpQUhRUUZxSWd0TEJFQWdDeUFSYWlBSVFRWjJRVDl4UVlBQmNqb0FBQ0FIUVFKcUlnOGdEazhOQVVFRElSQWdDQ0VMREFjTElBc2dEa0cwNzhFQUVNWUVBQXNnRHlBT1FjVHZ3UUFReGdRQUN5QUhJQTVKRFFNZ0J5QU9RZFR2d1FBUXhnUUFDeUFISUE1QjVPN0JBQkRHQkFBTElBOGdEa0gwN3NFQUVNWUVBQXNnQnlBT1FhVHZ3UUFReGdRQUN5QUhJQkZxSUFoQkJuWkJ3QUZ5T2dBQUlBNGdCMEVCYWlJUFN3UkFRUUloRUNBSUlRc01BUXNnRHlBT1FlVHZ3UUFReGdRQUN5QVBJQkZxSUF0QlAzRkJnQUZ5T2dBQUlBa2dFMFlnQnlBUWFpSUhJQlJQY2cwR0lBa2dFMDhOQVNBSlFRRjBJQWxCQVdvaENTQVNhaThBQUNJSVFRaDBJQWhCQ0haeUlnaEIvLzhEY1VIL0FFc05BQXNnQnlBUmFpQUlPZ0FBSUFkQkFXb2hEd3dCQ3d0QjcrM0JBRUVlUVpEdXdRQVFuQVlBQzBHZzdzRUFRU0pCeE83QkFCQ2NCZ0FMSUFCQkFEb0FCaUFBUVlJRU93RUVJQWNnREdvaERDQUtJQWxCQVhScUlRY01EQXNnRHlBUWFpRUhJQWtnRUdvaENRc2dCeUFNYWlFTUlBb2dDVUVCZEdvTUF3c2dEeUFUYWlFSElBa2dEMm9oQ3dzZ0J5QU1haUVNSUFvZ0MwRUJkR29NQVFzZ0Nnc2lCeUFEVHdSQUlBWU5BUXdFQ3lBRklBeEJBMm9pQ0UwRVFDQUFRUUU2QUFRTUJ3c2dCMEVCYWlFS0lBSWdCMm90QUFBaEJ3SkFBa0FDUUNBQkxRQUNJZzVCQVVZRVFDQUJRUUE2QUFJZ0FTOEJCQ0VMSUFjZ0FTMEFBeUlIUVFoMGNpSUpJQWxCQ0hRZ0IzSWdBUzBBQmhzaUIwR0ErQU54SWdsQmdMQURSZzBCSUFsQmdMZ0RSdzBESUFzTkFpQUFRUUE2QUFZZ0FFR0NCRHNCQkNBS0lRY01DZ3NnQVNBSE9nQURJQUZCQVRvQUFnd0ZDeUFCSUFjN0FRUWdDMFVOQkNBQVFRSTZBQVlnQUVHQ0JEc0JCQ0FLSVFjTUNBc2dBVUVBT3dFRUlBUWdDR29nQjBFL2NVR0FBWEk2QUFBZ0JDQU1haUFIUWYvL0EzRWdDMEVLZEdwQmdMai9HbXNpQjBFU2RrSHdBWEk2QUFBZ0RDQVZhaUFIUVF4MlFUOXhRWUFCY2pvQUFDQU1JQmRxSUFkQkJuWkJQM0ZCZ0FGeU9nQUFJQXhCQkdvaERBd0RDeUFMUlEwQklBRkJBVG9BQnlBQklBYzdBUVFnQUVFQ09nQUdJQUJCZ2dRN0FRUWdDaUVIREFZTElBRXZBUVJGQkVBZ0FTMEFBa0VCUncwRElBeEJBbW9nQlU4TkJTQUFRUUE2QUFZZ0FFR0NBanNCQkNBQlFRQTZBQUlNQmdzQ1FDQU1RUUpxSUFWSkRRQU1CUXNnQVVFQU93RUVJQUV0QUFKQkFVWUVRQ0FBUVFBNkFBWWdBRUdDQmpzQkJDQUJRUUE2QUFJTUJnc2dBRUVBT2dBR0lBQkJnZ1E3QVFRTUJRc2dCQ0FNYWlFTElBZEIvLzhEY1NJSlFZQUJUd1JBSUFsQmdCQlBCRUFnRENBWGFpQUhRVDl4UVlBQmNqb0FBQ0FNSUJWcUlBZEJCblpCUDNGQmdBRnlPZ0FBSUFzZ0IwR0E0QU54UVF4MlFlQUJjam9BQUNBSUlRd01BZ3NnRENBVmFpQUhRVDl4UVlBQmNqb0FBQ0FMSUFkQkJuWkJ3QUZ5T2dBQUlBeEJBbW9oREF3QkN5QUxJQWM2QUFBZ0RFRUJhaUVNQ3lBT1FRRnpJUWNNQVFzTElBQkJBRG9BQkF3QkN5QUFRUUU2QUFSQkFDRUhRUUFoREFzZ0FDQU1OZ0lJSUFBZ0J6WUNBQXdKQ3dOQUFrQUNRQ0FESUFsR0JFQWdBeUVKREFFTElBZEJBbW9nQlVrTkFVRUJJUXdMSUFBZ0J6WUNDQ0FBSUFrMkFnQWdBQ0FNT2dBRURBb0xRUUVoQ0NBRUlBZHFJQUlnQ1dvc0FBQWlBVUVBU0FSL0lBUWdCMm9pQmtFQ2FpQUJRYjhCY1RvQUFDQUdRUUZxSUFGQndBRnhRUVoyUVp3QmNqb0FBRUVESVFoQjd3RUZJQUVMT2dBQUlBbEJBV29oQ1NBSElBaHFJUWNNQUFzQUN3SkFBa0FnQXdSQUlBRXRBQUZCQVhGRkRRRUxJQUJCQURvQUJBd0JDeUFGUVFOUEJFQWdBRUVBT2dBR0lBQkJnZ0k3QVFSQkFTRURJQUZCQVRvQUFRd0JDeUFBUVFFNkFBUkJBQ0VEQ3lBQVFRQTJBZ2dnQUNBRE5nSUFEQWNMSUEwZ0JUWUM2QUVnRFNBRU5nTGtBU0FCTFFBQkJFQWdBVUVBT2dBQkFuOENRQUpBQWtBQ1FBSkFJQU1FUUNBRlFRSk5CRUFnQUVFQU5nSUlJQUJCQURZQ0FDQUFRUUU2QUFRTUR3c2dBaXdBQUNFS0lBRXRBQUlpQjBFZlRRUkFJQXBCL3dCcVFmOEJjVUgrQUU4RVFDQUtRZUVBYTBIL0FYRkJHa2tOQXlBS1FjRUFheUlJUWY4QmNVRWFTUTBHSUFCQkFqb0FCQ0FLUVFCSUJFQWdBRUVBTmdJSUlBQkJBVFlDQUNBQVFRSTdBQVVNRVFzZ0FFRUFOZ0lJSUFCQkFEWUNBQ0FBUVFFN0FBVU1FQXNnQ2tITkFHc2hDQXdGQ3lBSFFTQnJJUTRnQ2tIZkFHb2lDRUgvQVhGQjNnQlBCRUFnQ2tIL0FHcEIvd0Z4UVNCUEJFQWdDa0hoQUd0Qi93RnhRUnBKRFFRZ0NrSEJBR3NpQ1VIL0FYRkJHa2tOQlNBQVFRSTZBQVFnQ2tFQVNBUkFJQUJCQURZQ0NDQUFRUUUyQWdBZ0FFRUNPd0FGREJFTElBQkJBRFlDQ0NBQVFRQTJBZ0FnQUVFQk93QUZEQkFMSUFwQnpRQnJJUWtNQkFzZ0NFSC9BWEVpQ0NJTElBNUIvd0Z4UWQ0QWJHb2lDa0dDQzJzaURrR3VFazhFUUNBS1FhVUJUd1JBSUFwQmpoNXJJZzVCbUNaUEJFQUNRQUpBQWtBZ0IwRW5SaUFJUVE5SmNVVUVRQ0FIUVNoR0lBaEJFRWx4RFFFZ0IwRWxSaUFJUWNRQVNYRU5BaUFLUWJ3QmF5SUtRWjhIU1EwRElBQkJBRG9BQmlBQVFZSUVPd0VFSUFCQkFEWUNDQ0FBUVFFMkFnQU1GUXRCQVNFSklBdEJBWFJCaXIzR0FHb3ZBUUFpQjBVRVFDQUFRUUE2QUFZZ0FFR0NCRHNCQkNBQVFRQTJBZ2dnQUVFQk5nSUFEQlVMSUFRZ0IwRUdka0hBQVhJNkFBQkJBZ3dNQzBFQklRa2dCQ0FMUVFGMFFhaTl4Z0JxTHdFQUlnZEJCblpCd0FGeU9nQUFRUUlNQ3dzZ0JDQUxRUUYwUWNpOXhnQnFMd0VBSWdkQkRIWkI0QUZ5T2dBQUlBUWdCMEVHZGtFL2NVR0FBWEk2QUFFTUNRc2dEVUd3QVdwQjBMN0dBRUhOQUNBS0VOY0RJQTBvQXJRQklRY0Nmd0pBSUEwb0FyQUJRUUZ4QkVBZ0IwRUJheUlIUWMwQVNRMEJJQWRCelFCQjNPUEJBQkRHQkFBTElBZEJ6QUJOQkVBZ0IwRUJkRUhzdjhZQWFpOEJBQXdDQ3lBSFFjMEFRY3pqd1FBUXhnUUFDeUFIUVFGMElnZEI3TC9HQUdvdkFRQWdCMEhRdnNZQWFpOEJBR3NnQ21vTElnZEIvLzhEY1NJS1FZQUJUd1JBSUFwQmdCQlBCRUFnQkVFQmFpQUhRUVoyUVQ5eFFZQUJjam9BQUNBRUlBZEJnT0FEY1VFTWRrSGdBWEk2QUFBTUNnc2dCQ0FIUVFaMlFjQUJjam9BQUVFQklRbEJBZ3dLQ3lBQVFRQTZBQVlnQUVHQ0JEc0JCQ0FBUVFBMkFnZ2dBRUVCTmdJQURCRUxJQVFnRGtFQmRFR1E3c1VBYWk4QkFDSUhRUXgyUWVBQmNqb0FBQ0FFSUFkQkJuWkJQM0ZCZ0FGeU9nQUJEQWNMUVFFaENTQUtRUUYwUWNDNnhnQnFMd0VBSWdkQmdCQlBCRUFnQkNBSFFReDJRZUFCY2pvQUFDQUVJQWRCQm5aQlAzRkJnQUZ5T2dBQkRBY0xJQVFnQjBFR2RrSEFBWEk2QUFCQkFnd0hDeUFFSUE1QkFYUkJ0TW5GQUdvdkFRQWlCMEVNZGtIZ0FYSTZBQUFnQkNBSFFRWjJRVDl4UVlBQmNqb0FBUXdGQ3lBR1JRUkFJQUJCQURZQ0NDQUFRUUEyQWdBZ0FFRUFPZ0FFREE0TElBQkJBRG9BQmlBQVFZSUNPd0VFSUFCQkFEWUNDQ0FBUVFBMkFnQU1EUXNnQ2tISEFHc2hDQXdDQ3lBS1FjY0FheUVKQ3dKQUlBNUIvd0Z4UWRRQWJDQUpRZjhCY1dvaUNFRzJHRThFUUNBQVFRSTZBQVFnQ2tFQVRnMEJJQUJCQURZQ0NDQUFRUUUyQWdBZ0FFRUNPd0FGREF3TElBMUJ1QUZxUWRpNHhRQkJsd1FnQ0JEWEF5QU5LQUs4QVNFSEFuOENRQ0FOS0FLNEFVRUJjUVJBSUFkQkFXc2lCMEdYQkVrTkFTQUhRWmNFUWR6andRQVF4Z1FBQ3lBSFFaWUVUUVJBSUFkQkFYUkJoc0hGQUdvdkFRQWlCMEVNZGlFSklBZEJCbllNQWdzZ0IwR1hCRUhNNDhFQUVNWUVBQXNnQ0NBSFFRRjBJZ2RCMkxqRkFHb3ZBUUJySUFkQmhzSEZBR292QVFCcUlnZEIvLzhEY1NJS1FReDJJUWtnQ2tFR2Rnc2hDQ0FFSUFsQjRBRnlPZ0FBSUFSQkFXb2dDRUUvY1VHQUFYSTZBQUFNQWdzZ0FFRUFOZ0lJSUFCQkFEWUNBQ0FBUVFFN0FBVU1DZ3NnRFVIQUFXcEIvSmJGQUVHM0NDQUhRYklCYkNBSVFmOEJjV29pQ2hEWEF5QU5LQUxFQVNFSEFuOENRQ0FOS0FMQUFVRUJjUVJBSUFkQkFXc2lCMEczQ0VrTkFTQUhRYmNJUWR6andRQVF4Z1FBQ3lBSFFiWUlUUVJBSUFkQkFYUkI2cWZGQUdvdkFRQWlCMEVNZGlFSklBZEJCbllNQWdzZ0IwRzNDRUhNNDhFQUVNWUVBQXNnQ2lBSFFRRjBJZ2RCL0piRkFHb3ZBUUJySUFkQjZxZkZBR292QVFCcUlnZEIvLzhEY1NJS1FReDJJUWtnQ2tFR2Rnc2hDQ0FFSUFsQjRBRnlPZ0FBSUFSQkFXb2dDRUUvY1VHQUFYSTZBQUFMUVFJaENVRURDeUVMSUFRZ0NXb2dCMEUvY1VHQUFYSTZBQUJCQVNFS0MwRUNJQU5ySVE4Z0FrRUJhaUVSQTBBQ1FBSkFBa0FDUUNBRElBcFBCRUFnQlNBTFR3UkFJQVVnQzJzaUJ5QURJQXBySWdnZ0J5QUlTU0lRR3lFSVFRQWhCeUFFSUF0cUlnd2dBaUFLYWlJT2MwRURjUTBDUVFBZ0RtdEJBM0VpRWtFSWNpQUlTdzBDQTBBZ0J5QVNSZ1JBSUFoQkNHc2hFZ05BSUFjZ0Rtb2lFeWdDQUNFSklBY2dER29pRkVFRWFpQVRRUVJxS0FJQUloTTJBZ0FnRkNBSk5nSUFJQk5CZ0lHQ2hIaHhJaE1nQ1VHQWdZS0VlSEVpQ1hJRVFDQU9JQWtFZnlBSmFFRURkZ1VnRTJoQkEzWkJCR29MSUFkcUlnZHFMUUFBSVFrTUJ3c2dCMEVJYWlJSElCSk5EUUFMREFRTElBY2dEbW9zQUFBaUNVRUFTQTBFSUFjZ0RHb2dDVG9BQUNBSFFRRnFJUWNNQUFzQUN5QUxJQVZCL096QkFCQzVDUUFMSUFvZ0EwSHM3TUVBRUxrSkFBc2dCeUFJSUFjZ0NFc2JJUklEUUNBSElCSkhCRUFnQnlBT2Fpd0FBQ0lKUVFCSURRSWdCeUFNYWlBSk9nQUFJQWRCQVdvaEJ3d0JDd3NnQ0NBTGFpRUhJQWdnQ21vaENBd0JDeUFISUFwcUlRZ2dCU0FISUF0cUlnZEJBbXBOQkVCQkFTRVFEQUVMSUFoQkFXb2hEQXdCQ3lBQUlBYzJBZ2dnQUNBSU5nSUFJQUFnRFVIa0FXcEJnSUNBZUhFZ0VISTJBZ1FNQ0FzRFFBSkFBa0FDZndKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQ1VIL0FHb2lCVUgvQVhFaUNFSDlBRTBFUUNBRElBeExEUUVnQmcwQ0lBRWdCVG9BQWlBQlFRRTZBQUVnQUVFQU9nQUVEQW9MSUFCQkFEb0FCaUFBUVlJQ093RUVEQWtMSUF4QkFXb2hDeUFDSUF4cUxBQUFJUVVnQ0VFZlRRUkFJQVZCL3dCcVFmOEJjVUgrQUU4RVFDQUZRZUVBYTBIL0FYRkJHa2tOQXlBRlFjRUFheUlKUWY4QmNVRWFTUTBISUFCQkFqb0FCQ0FGUVFCSUJFQWdBQ0FITmdJSUlBQWdDellDQUNBQVFRSTdBQVVNRlFzZ0FDQUhOZ0lJSUFBZ0REWUNBQ0FBUVFFN0FBVU1GQXNnQlVITkFHc2hDUXdHQ3lBSlFkOEFhaUVPSUFWQjN3QnFRZjhCY1NJS1FkNEFUd1JBSUFWQi93QnFRZjhCY1VFZ1R3UkFJQVZCNFFCclFmOEJjVUVhU1EwRUlBVkJ3UUJySWdwQi93RnhRUnBKRFFZZ0FFRUNPZ0FFSUFWQkFFZ0VRQ0FBSUFjMkFnZ2dBQ0FMTmdJQUlBQkJBanNBQlF3VkN5QUFJQWMyQWdnZ0FDQU1OZ0lBSUFCQkFUc0FCUXdVQ3lBRlFjMEFheUVLREFVTElBNUIvd0Z4UWQ0QWJDQUthaUlGUVlJTGF5SU9RYTRTVHdSQUlBVkJwUUZQQkVBZ0JVR09IbXNpRGtHWUprOEVRQUpBQWtBQ1FDQUlRU2RHSUFwQkQwbHhSUVJBSUFoQktFWWdDa0VRU1hFTkFTQUlRU1ZHSUFwQnhBQkpjUTBDSUFWQnZBRnJJZ3BCbndkSkRRTU1DZ3NnQ2tFQmRFR0t2Y1lBYWk4QkFDSUZSUVJBREFvTElBUWdCMm9pQkVFQmFpQUZRVDl4UVlBQmNqb0FBQ0FFSUFWQkJuWkJ3QUZ5T2dBQVFRSU1EUXNnQkNBSGFpSUVRUUZxSUFwQkFYUkJxTDNHQUdvdkFRQWlCVUUvY1VHQUFYSTZBQUFnQkNBRlFRWjJRY0FCY2pvQUFFRUNEQXdMSUFRZ0Iyb2lCRUVDYWlBS1FRRjBRY2k5eGdCcUx3RUFJZ1ZCUDNGQmdBRnlPZ0FBSUFRZ0JVRU1ka0hnQVhJNkFBQWdCRUVCYWlBRlFRWjJRVDl4UVlBQmNqb0FBQXdLQ3lBTlFaZ0Jha0hRdnNZQVFjMEFJQW9RMXdNZ0RTZ0NuQUVoQlFKL0FrQWdEU2dDbUFGQkFYRUVRQ0FGUVFGcklnVkJ6UUJKRFFFZ0JVSE5BRUhjNDhFQUVNWUVBQXNnQlVITUFFMEVRQ0FGUVFGMFFleS94Z0JxTHdFQURBSUxJQVZCelFCQnpPUEJBQkRHQkFBTElBVkJBWFFpQlVIc3Y4WUFhaThCQUNBRlFkQyt4Z0JxTHdFQWF5QUthZ3NpQ1VILy93TnhJZ1ZCZ0FGUEJFQWdCQ0FIYWlFRUlBVkJnQkJQQkVBZ0JFRUNhaUFKUVQ5eFFZQUJjam9BQUNBRVFRRnFJQWxCQm5aQlAzRkJnQUZ5T2dBQUlBUWdDVUdBNEFOeFFReDJRZUFCY2pvQUFBd0xDeUFFUVFGcUlBbEJQM0ZCZ0FGeU9nQUFJQVFnQ1VFR2RrSEFBWEk2QUFCQkFnd0xDd3dHQ3lBRUlBZHFJZ1JCQW1vZ0RrRUJkRUdRN3NVQWFpOEJBQ0lGUVQ5eFFZQUJjam9BQUNBRUlBVkJESFpCNEFGeU9nQUFJQVJCQVdvZ0JVRUdka0UvY1VHQUFYSTZBQUFNQ0FzZ0JDQUhhaUVLSUFkQkFXb2hDQ0FGUVFGMFFjQzZ4Z0JxTHdFQUlnVkJnQkJQQkVBZ0NpQUZRUXgyUWVBQmNqb0FBQ0FLUVFKcUlBVkJQM0ZCZ0FGeU9nQUFJQVFnQ0dvZ0JVRUdka0UvY1VHQUFYSTZBQUFNQ0FzZ0JDQUlhaUFGUVQ5eFFZQUJjam9BQUNBS0lBVkJCblpCd0FGeU9nQUFRUUlNQ0FzZ0JDQUhhaUlFUVFKcUlBNUJBWFJCdE1uRkFHb3ZBUUFpQlVFL2NVR0FBWEk2QUFBZ0JDQUZRUXgyUWVBQmNqb0FBQ0FFUVFGcUlBVkJCblpCUDNGQmdBRnlPZ0FBREFZTElBQkJBRG9BQmlBQVFZSUNPd0VFREFjTElBVkJ4d0JySVFrTUF3c2dCVUhIQUdzaENnd0JDeUFBUVFBNkFBWWdBRUdDQkRzQkJDQUFJQWMyQWdnZ0FDQUxOZ0lBREE0TEFrQWdEa0gvQVhGQjFBQnNJQXBCL3dGeGFpSUtRYllZVHdSQUlBQkJBam9BQkNBRlFRQk9EUUVnQUNBSE5nSUlJQUFnQ3pZQ0FDQUFRUUk3QUFVTUR3c2dEVUdnQVdwQjJMakZBRUdYQkNBS0VOY0RJQTBvQXFRQklRVUNmd0pBSUEwb0FxQUJRUUZ4QkVBZ0JVRUJheUlGUVpjRVNRMEJJQVZCbHdSQjNPUEJBQkRHQkFBTElBVkJsZ1JOQkVBZ0JVRUJkRUdHd2NVQWFpOEJBQ0lJUVF4MklRb2dDRUVHZGd3Q0N5QUZRWmNFUWN6andRQVF4Z1FBQ3lBS0lBVkJBWFFpQlVIWXVNVUFhaThCQUdzZ0JVR0d3Y1VBYWk4QkFHb2lDRUgvL3dOeElnVkJESFloQ2lBRlFRWjJDeUVGSUFRZ0Iyb2lCQ0FLUWVBQmNqb0FBQ0FFUVFKcUlBaEJQM0ZCZ0FGeU9nQUFJQVJCQVdvZ0JVRS9jVUdBQVhJNkFBQU1BZ3NnQUNBSE5nSUlJQUFnRERZQ0FDQUFRUUU3QUFVTURRc2dEVUdvQVdwQi9KYkZBRUczQ0NBSVFiSUJiQ0FKUWY4QmNXb2lDaERYQXlBTktBS3NBU0VGQW44Q1FDQU5LQUtvQVVFQmNRUkFJQVZCQVdzaUJVRzNDRWtOQVNBRlFiY0lRZHpqd1FBUXhnUUFDeUFGUWJZSVRRUkFJQVZCQVhSQjZxZkZBR292QVFBaUNFRU1kaUVLSUFoQkJuWU1BZ3NnQlVHM0NFSE00OEVBRU1ZRUFBc2dDaUFGUVFGMElnVkIvSmJGQUdvdkFRQnJJQVZCNnFmRkFHb3ZBUUJxSWdoQi8vOERjU0lGUVF4MklRb2dCVUVHZGdzaEJTQUVJQWRxSWdRZ0NrSGdBWEk2QUFBZ0JFRUNhaUFJUVQ5eFFZQUJjam9BQUNBRVFRRnFJQVZCUDNGQmdBRnlPZ0FBQzBFREN5QUhhaUVJSUFNZ0MwMEVRQ0FBSUFnMkFnZ2dBQ0FMTmdJQUlBQkJBRG9BQkF3TEN5QU5LQUxvQVNJRklBaEJBbXBOQkVBZ0FDQUlOZ0lJSUFBZ0N6WUNBQ0FBUVFFNkFBUU1Dd3NnRENBUGFpRU9JQXdnRVdvaEVDQU5LQUxrQVNJRUlBaHFJUkpCQUNFSEEwQWdCeUFNYWlFS0lBY2dFR29zQUFBaUNVRUFTQTBDSUFwQkFtb2hDaUFISUJKcUlBazZBQUFnQnlBSWFpSVRRUUZxSVFzZ0NVRTdTdzBFSUFjZ0RtcEZCRUFnQUNBTE5nSUlJQUFnQXpZQ0FDQUFRUUE2QUFRTURBc2dCU0FUUVFOcVRRUkFJQUFnQ3pZQ0NDQUFJQW8yQWdBZ0FFRUJPZ0FFREF3RklBZEJBV29oQnd3QkN3QUxBQXNnQUNBSE5nSUlJQUFnRERZQ0FBd0pDeUFISUFocUlRY2dDa0VDYWlFTURBQUxBQXNBQ3lBTlFRQTJBdXdCSUEwZ0JUWUM2QUVnRFNBRU5nTGtBU0FCTFFBQkJFQWdBVUVBT2dBQkFuOENRQUpBQWtBZ0F3UkFJQVZCQWswRVFDQUFRUUEyQWdnZ0FFRUFOZ0lBSUFCQkFUb0FCQXdNQ3lBQkxRQUNJZ3BCQVVZZ0Fpd0FBQ0lIUWVFQWFrSC9BWEZCMHdCSmNRMEJBa0FnQjBGQWFpSUlRZjhCY1VFK1N3UkFJQWRCZkVvTkFTQUhRY0VBYXlFSUN3SkFBa0FnQ2tFQ1JnUkFJQWhCL3dGeElndEIxZ0JKRFFFTElBcEJ2QUZzSUFoQi93RnhhaUlLUVlJTGF5SUlRWlVYVHcwQklBUWdDRUVCZEVINHFNUUFhaThCQUNJSFFReDJRZUFCY2pvQUFDQUVJQWRCQm5aQlAzRkJnQUZ5T2dBQkRBWUxJQVJCNHdFNkFBQWdCQ0FMUWFIaEFHb2lCMEVHZGtHSEFYRTZBQUVNQlFzZ0NrSENJbXNpQ0VHK0drOEVRQ0FLUWZqVEFHc2lDRUhvQWs4RVFDQUtRZERBQUdzaUNFSG9BazhFUUFKQUFrQUNRQ0FLUVlURkFHdEIyQTVQQkVBZ0RVR1FBV29nQ2hDZ0F5QU5Md0dRQVVFQmNRMEJRWkNXeFFBaENBTkFJQXhCTlVzTkJDQUtJQWd2QVFCcklnc2dDRUVDYWk4QkFFa05BeUFJUVFacUlRZ2dERUVEYWlFTURBQUxBQXNnQkNBS1FZU0ZBV3NpQjBFR2RrRS9jVUdBQVhJNkFBRWdCQ0FIUVlEZ0EzRkJESFpCNEFGeU9nQUFEQW9MSUEwdkFaSUJJZ2RCZ0JCUEJFQWdCQ0FIUVFaMlFUOXhRWUFCY2pvQUFTQUVJQWRCZ09BRGNVRU1ka0hnQVhJNkFBQU1DZ3NnQkNBSFFRWjJRY0FCY2pvQUFFRUJJUWxCQWd3S0N5QU1RUUpxSVFjZ0RFRTBUdzBIUVFFaENTQUhRUUYwUVpDV3hRQnFMd0VBSUF0cUlnZEIvLzhEY1VHQUVFOEVRQ0FFSUFkQkJuWkJQM0ZCZ0FGeU9nQUJJQVFnQjBHQTRBTnhRUXgyUWVBQmNqb0FBQXdKQ3lBRUlBZEJCblpCd0FGeU9nQUFRUUlNQ1FzZ0FFRUNPZ0FFSUFkQkFFZ0VRQ0FBUVFBMkFnZ2dBRUVCTmdJQUlBQkJBanNBQlF3UUN5QUFRUUEyQWdnZ0FFRUFOZ0lBSUFCQkFUc0FCUXdQQ3lBRUlBaEJBWFJCbm96RkFHb3ZBUUFpQjBFTWRrSGdBWEk2QUFBZ0JDQUhRUVoyUVQ5eFFZQUJjam9BQVF3R0N5QUVJQWhCQVhSQm5vekZBR292QVFBaUIwRU1ka0hnQVhJNkFBQWdCQ0FIUVFaMlFUOXhRWUFCY2pvQUFRd0ZDeUFFSUFoQkFYUkJvdGZFQUdvdkFRQWlCMEVNZGtIZ0FYSTZBQUFnQkNBSFFRWjJRVDl4UVlBQmNqb0FBUXdFQ3lBQVFRSTZBQVFnQjBFQVNBUkFJQUJCQURZQ0NDQUFRUUUyQWdBZ0FFRUNPd0FGREF3TElBQkJBRFlDQ0NBQVFRQTJBZ0FnQUVFQk93QUZEQXNMSUFaRkJFQWdBRUVBTmdJSUlBQkJBRFlDQUNBQVFRQTZBQVFNQ3dzZ0FFRUFPZ0FHSUFCQmdnSTdBUVFnQUVFQU5nSUlJQUJCQURZQ0FBd0tDeUFFUWVNQk9nQUFJQVFnQjBIZUFHc2lCMEhBQVhGQkJuWkJnQUZ5T2dBQkRBRUxJQWRCTmtITTdNRUFFTVlFQUF0QkFpRUpRUU1MSVFvZ0JDQUphaUFIUVQ5eFFZQUJjam9BQUVFQklRZ0xBMEFDUUFKQUFrQUNRQ0FESUFoUEJFQWdCU0FLVHdSQUlBVWdDbXNpQnlBRElBaHJJZ3NnQnlBTFNTSVFHeUVMUVFBaEJ5QUVJQXBxSWd3Z0FpQUlhaUlPYzBFRGNRMENRUUFnRG10QkEzRWlEMEVJY2lBTFN3MENBMEFnQnlBUFJnUkFJQXRCQ0dzaER3TkFJQWNnRG1vaUVTZ0NBQ0VKSUFjZ0RHb2lFa0VFYWlBUlFRUnFLQUlBSWhFMkFnQWdFaUFKTmdJQUlCRkJnSUdDaEhoeEloRWdDVUdBZ1lLRWVIRWlDWElFUUNBT0lBa0VmeUFKYUVFRGRnVWdFV2hCQTNaQkJHb0xJQWRxSWdkcUxRQUFJUWtNQndzZ0IwRUlhaUlISUE5TkRRQUxEQVFMSUFjZ0Rtb3NBQUFpQ1VFQVNBMEVJQWNnREdvZ0NUb0FBQ0FIUVFGcUlRY01BQXNBQ3lBS0lBVkIvT3pCQUJDNUNRQUxJQWdnQTBIczdNRUFFTGtKQUFzZ0J5QUxJQWNnQzBzYklROERRQ0FISUE5SEJFQWdCeUFPYWl3QUFDSUpRUUJJRFFJZ0J5QU1haUFKT2dBQUlBZEJBV29oQnd3QkN3c2dDaUFMYWlFSElBZ2dDMm9oQ0F3QkN5QUhJQWhxSVFnZ0J5QUthaUlIUVFKcUlBVkpEUUZCQVNFUUN5QUFJQWMyQWdnZ0FDQUlOZ0lBSUFBZ0RVSGtBV3BCZ0lDQWVIRWdFSEkyQWdRTUJ3c2dDRUVCYWlFSUEwQUNmd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FKUWY4QWFpSUtRZjhCY1VFZlR3UkFJQWxCQTJwQi93RnhRZU1CU1EwQklBbEJQMm9oQ2dzQ1FDQURJQWhOQkVBZ0JnMEJJQUVnQ2pvQUFpQUJRUUU2QUFFZ0FFRUFPZ0FFREFrTElBaEJBV29oREFKQUFrQUNRQUpBQWtBZ0NrSC9BWEVpQ2tFQlJpQUNJQWhxTEFBQUlnNUI0UUJxUWY4QmNVSFRBRWx4UlFSQUlBNUJRR29pQlVIL0FYRkJQa3NFUUNBT1FYeEtEUVlnRGtIQkFHc2hCUXNnQ2tFQ1JnUkFJQVZCL3dGeElndEIxZ0JKRFFrTElBcEJ2QUZzSUFWQi93RnhhaUlLUVlJTGF5SUxRWlVYU1EwSklBcEJ3aUpySWd0QnZocEpEUW9nQ2tINDB3QnJJZ3RCNkFKSkRRc2dDa0hRd0FCcklndEI2QUpKRFF3Z0NrR0V4UUJyUWRnT1NRMEJJQTFCaUFGcUlBb1FvQU1nRFM4QmlBRkJBWEVOQWtFQUlRdEJrSmJGQUNFRkEwQWdDMEUxU3cwRklBb2dCUzhCQUdzaUNTQUZRUUpxTHdFQVNRMEVJQVZCQm1vaEJTQUxRUU5xSVFzTUFBc0FDeUFOS0FMa0FTSUVJQWRxSWdWQjR3RTZBQUFnQlVFQ2FpQU9RZDRBYXlJS1FUOXhRWUFCY2pvQUFDQUZRUUZxSUFwQndBRnhRUVoyUVlBQmNqb0FBQXdPQ3lBTktBTGtBU0lFSUFkcUlnVkJBbW9nQ2tHRWhRRnJJZ3BCUDNGQmdBRnlPZ0FBSUFWQkFXb2dDa0VHZGtFL2NVR0FBWEk2QUFBZ0JTQUtRWURnQTNGQkRIWkI0QUZ5T2dBQURBMExJQWRCQVdvaENpQU5Md0dLQVNJRlFZQVFUd1JBSUEwb0F1UUJJZ1FnQjJvaUMwRUNhaUFGUVQ5eFFZQUJjam9BQUNBTElBVkJnT0FEY1VFTWRrSGdBWEk2QUFBZ0JDQUthaUFGUVFaMlFUOXhRWUFCY2pvQUFBd05DeUFOS0FMa0FTSUVJQWRxSUFWQkJuWkJ3QUZ5T2dBQUlBUWdDbW9nQlVFL2NVR0FBWEk2QUFCQkFnd05DeUFMUVFKcUlRVWdDMEUwVHcwSklBZEJBV29oQ2lBRlFRRjBRWkNXeFFCcUx3RUFJQWxxSWdWQi8vOERjVUdBRUU4RVFDQUVJQWRxSWd0QkFtb2dCVUUvY1VHQUFYSTZBQUFnQkNBS2FpQUZRUVoyUVQ5eFFZQUJjam9BQUNBTElBVkJnT0FEY1VFTWRrSGdBWEk2QUFBTURBc2dEU2dDNUFFaUJDQUhhaUFGUVFaMlFjQUJjam9BQUNBRUlBcHFJQVZCUDNGQmdBRnlPZ0FBUVFJTURBc2dBRUVDT2dBRUlBNUJBRWdFUUNBQUlBYzJBZ2dnQUNBTU5nSUFJQUJCQWpzQUJRd1VDeUFBSUFjMkFnZ2dBQ0FJTmdJQUlBQkJBVHNBQlF3VEN5QUFRUUk2QUFRZ0RrRUFTQVJBSUFBZ0J6WUNDQ0FBSUF3MkFnQWdBRUVDT3dBRkRCTUxJQUFnQnpZQ0NDQUFJQWcyQWdBZ0FFRUJPd0FGREJJTElBQkJBRG9BQmlBQVFZSUNPd0VFREFjTElBbEIzd0JxUWY4QmNTSUxRVDVOQkVBZ0RTZ0M1QUVpQkNBSGFpSUtRZThCT2dBQUlBcEJBbW9nQzBHZkFXc2lDMEUvY1VHQUFYSTZBQUFnQ2tFQmFpQUxRUVoyUWI4QmNUb0FBQ0FIUVFOcUlRb01Dd3NnQ1VIL0FYRkJnQUZHQkVBZ0RTZ0M1QUVpQkNBSGFrSENnUUk3QUFBZ0IwRUNhaUVLREFzTElBQkJBRG9BQmlBQVFZSUNPd0VFREFZTElBMG9BdVFCSWdRZ0Iyb2lCVUhqQVRvQUFDQUZRUUpxSUF0Qm9lRUFhaUlLUVQ5eFFZQUJjam9BQUNBRlFRRnFJQXBCQm5aQmh3RnhPZ0FBREFZTElBMG9BdVFCSWdRZ0Iyb2lCVUVDYWlBTFFRRjBRZmlveEFCcUx3RUFJZ3BCUDNGQmdBRnlPZ0FBSUFVZ0NrRU1ka0hnQVhJNkFBQWdCVUVCYWlBS1FRWjJRVDl4UVlBQmNqb0FBQXdGQ3lBTktBTGtBU0lFSUFkcUlnVkJBbW9nQzBFQmRFR2kxOFFBYWk4QkFDSUtRVDl4UVlBQmNqb0FBQ0FGSUFwQkRIWkI0QUZ5T2dBQUlBVkJBV29nQ2tFR2RrRS9jVUdBQVhJNkFBQU1CQXNnRFNnQzVBRWlCQ0FIYWlJRlFRSnFJQXRCQVhSQm5vekZBR292QVFBaUNrRS9jVUdBQVhJNkFBQWdCU0FLUVF4MlFlQUJjam9BQUNBRlFRRnFJQXBCQm5aQlAzRkJnQUZ5T2dBQURBTUxJQTBvQXVRQklnUWdCMm9pQlVFQ2FpQUxRUUYwUVo2TXhRQnFMd0VBSWdwQlAzRkJnQUZ5T2dBQUlBVWdDa0VNZGtIZ0FYSTZBQUFnQlVFQmFpQUtRUVoyUVQ5eFFZQUJjam9BQUF3Q0N5QUZRVFpCek96QkFCREdCQUFMSUFBZ0J6WUNDQ0FBSUFnMkFnQU1DUXRCQXdzZ0Iyb2hCeUFESUF4TkJFQWdBQ0FITmdJSUlBQWdERFlDQUNBQVFRQTZBQVFNQ0FzZ0RTZ0M2QUVpQlNBSFFRSnFUUVJBSUFBZ0J6WUNDQ0FBSUF3MkFnQWdBRUVCT2dBRURBZ0xJQWhCQW1vaENDQUNJQXhxTEFBQUlnbEJBRWdOQUFzZ0RTZ0M1QUVpQkNBSGFpQUpPZ0FBSUFkQkFXb2hDZ3dBQ3dBTEFrQUNmd0ovSUFFdEFBSkZCRUFnQVMwQUFTRVBJQUV0QUFNTUFRc2dCVUVDVFFSQUlBQkJBVG9BQkF3REN5QUJRUUE3QUFFQ1FBSkFBa0FDUUNBQkxRQURJZ3dPQkFFQkFnTUFDMEhBbE1rQVFTaEIzT3pCQUJDY0JnQUxJQVFnQVMwQUJUb0FBQ0FCUVFBNkFBVkJBUXdEQ3lBQkxRQUZJUWNnQVVFQU9nQUZJQVFnQjBFL2NVR0FBWEk2QUFJZ0JDQUhRY0FCYXlJSFFRWjJRVDl4UVlBQmNqb0FBU0FFSUFkQmdPQURjVUVNZGtIZ0FYSTZBQUJCQWlFTVFRTU1BZ3NnQVVFRU9nQURRUVFMSVF4QkFBc2hDQ0FFUVFGcUlSRWdBUzBBQlNFT1FRQWhCd0pBQTBBQ1FBSkFBa0FDUUFKL0FrQUNRQUpBQWtBQ1FBSkFBa0FnQXlBSFJnUkFJQVlOQVF3TUN5QUZJQWhCQW1vaUVFMEVRQ0FBUVFFNkFBUWdCeUVLREE4TElBZEJBV29oQ2lBQ0lBZHFMUUFBSWduQUlRc0NRQUpBQW44Q1FBSkFBa0FDUUFKQUFrQUNRQUpBSUF4Qi93RnhRUUZyRGdZREJBVUdBQUVDQ3lBSlFTUnJEZ1VHQ0FnSUJnZ0xJQXRCd2dCSElBNUIvd0Z4UVNoSGNnMElRUUFoREF3T0N5QUxRUnRHRFJJZ0FVRUFPZ0FCSUF0Qi9nRnhRUTVHSUF0QkFFaHlSUVJBSUFRZ0NHb2dDem9BQUNBSVFRRnFJUWhCQUNFTUlBb2hCMEVBSVE4TUZRc2dBRUVBT2dBR0lBQkJnZ0k3QVFRTUZnc2dDMEViUmcwUklBRkJBRG9BQVFKQUlBbEIvZ0JIQkVBZ0NVSGNBRWNOQVNBSUlCRnFRYVVCT2dBQUlBUWdDR3BCd2dFNkFBQkJBQ0VQUVFFTUVBc2dDQ0FSYWtHQUFUb0FBQ0FFSUFocVFlSUJPZ0FBSUFRZ0VHcEJ2Z0U2QUFBZ0NFRURhaUVJUVFBaEQwRUJJUXdnQ2lFSERCUUxJQXRCL2dGeFFRNUhJQXRCQUU1eFJRUkFJQUJCQURvQUJpQUFRWUlDT3dFRURCWUxJQVFnQ0dvZ0N6b0FBRUVCSVF3Z0NFRUJhaUVJUVFBaER5QUtJUWNNRXdzZ0MwRWJSZzBRSUFGQkFEb0FBU0FMUVNGclFmOEJjVUUvVHdSQUlBQkJBRG9BQmlBQVFZSUNPd0VFREJVTElBUWdDR3BCN3dFNkFBQWdCQ0FRYWlBTFFUOXhRWUFCY2pvQUFDQUlJQkZxSUF0QndQNEFha0VHZGtHL0FYRTZBQUFnQ0VFRGFpRUlRUUFoRDBFQ0lRd2dDaUVIREJJTElBdEJHMFlORHlBQlFRQTZBQUVnQzBFaGEwSC9BWEZCM2dCUEJFQWdBRUVBT2dBR0lBQkJnZ0k3QVFRTUZBc2dBVUVFT2dBRElBRWdDem9BQlVFQUlROUJCQXdDQ3lBTFFSdEdEUTBnQVVFRE9nQURJQTVCSVd0Qi93RnhJZ3hCQTBZZ0MwRWhhMEgvQVhFaUIwSFNBRTF4RFFVZ0RFRUVSaUFIUWRVQVRYRU5CaUFIUWQwQVN3MEhJQXhCM2dCc0lBZHFJZ3RCZ2d0cklnZEJsUmRQQkVBZ0MwSENJbXNpQjBHK0drOEVRQ0FMUWREQUFHc2lCMEhvQWs4RVFDQU5RWUFCYWlBTEVLQURBa0FDUUNBTkx3R0FBVUVCY1VVRVFFRUFJUWxCa0piRkFDRUhBMEFnQ1VFMVN3MERJQXNnQnk4QkFHc2lEQ0FIUVFKcUx3RUFTUTBDSUFkQkJtb2hCeUFKUVFOcUlRa01BQXNBQ3lBRUlBaHFJUXNnRFM4QmdnRWlCMEdBRUU4RVFDQUVJQkJxSUFkQlAzRkJnQUZ5T2dBQUlBZ2dFV29nQjBFR2RrRS9jVUdBQVhJNkFBQWdDeUFIUVlEZ0EzRkJESFpCNEFGeU9nQUFEQklMREE4TElBbEJBbW9oQnlBSlFUUlBEUXdnQkNBSWFpRUxJQWRCQVhSQmtKYkZBR292QVFBZ0RHb2lCMEgvL3dOeFFZQVFUd1JBSUFRZ0VHb2dCMEUvY1VHQUFYSTZBQUFnQ0NBUmFpQUhRUVoyUVQ5eFFZQUJjam9BQUNBTElBZEJnT0FEY1VFTWRrSGdBWEk2QUFBTUVRc01EZ3NnQUVFQU9nQUdJQUJCZ2dRN0FRUU1GUXNnQkNBSWFpQUhRUUYwUVo2TXhRQnFMd0VBSWdkQkRIWkI0QUZ5T2dBQUlBUWdFR29nQjBFL2NVR0FBWEk2QUFBZ0NDQVJhaUFIUVFaMlFUOXhRWUFCY2pvQUFBd09DeUFFSUFocUlBZEJBWFJCb3RmRUFHb3ZBUUFpQjBFTWRrSGdBWEk2QUFBZ0JDQVFhaUFIUVQ5eFFZQUJjam9BQUNBSUlCRnFJQWRCQm5aQlAzRkJnQUZ5T2dBQURBMExJQVFnQ0dvZ0IwRUJkRUg0cU1RQWFpOEJBQ0lIUVF4MlFlQUJjam9BQUNBRUlCQnFJQWRCUDNGQmdBRnlPZ0FBSUFnZ0VXb2dCMEVHZGtFL2NVR0FBWEk2QUFBTURBc2dBVUVHT2dBRElBRWdDem9BQlVFR0N5RU1JQXNoRGlBS0lRY01EZ3NnQVVFQU9nQUJJQUJCQURvQUJpQUFRWUlDT3dFRUlBRWdBUzBBQkRvQUF5QUhJUW9NRHdzZ0MwSEtBRWNnRGtIL0FYRkJLRWR5UlFSQVFRRWhEQXdHQ3lBTFFja0FSeUFPUWY4QmNVRW9SM0pGQkVCQkFpRU1EQVlMQWtBZ0RrSC9BWEZCSkVjTkFFRURJUXdnQ1VGQWFnNERCZ0FHQUFzZ0FVR0FBanNBQVNBQVFRRTZBQVlnQUVHQ0Fqc0JCQ0FCSUFFdEFBUTZBQU1nQnlFS0RBNExBa0FDUUNBTVFmOEJjVUVFYXc0REFBQUJEQXNnQUVFQU9nQUdJQUJCZ2dJN0FRUWdBU0FCTFFBRU9nQUREQTBMSUFGQkFUb0FBaUFBUVFFNkFBWWdBRUdDQWpzQkJDQUJJQUV0QUFRNkFBTU1EQXNnQkNBSWFrSGpBVG9BQUNBRUlCQnFJQXRCSUdvaUIwRS9jVUdBQVhJNkFBQWdDQ0FSYWlBSFFjQUJjVUVHZGtHQUFYSTZBQUJCQXlFTUlBaEJBMm9oQ0VFa0lRNGdDaUVIREFvTElBUWdDR3BCNHdFNkFBQWdDQ0FSYWlBSFFhSGhBR29pQjBFR2RrR0hBWEU2QUFBZ0JDQVFhaUFIUVQ5eFFZQUJjam9BQUVFRElRd2dDRUVEYWlFSVFTVWhEaUFLSVFjTUNRc2dBRUVBT2dBR0lBQkJnZ1E3QVFRTUNnc2dCMEUyUWN6c3dRQVF4Z1FBQ3lBQklBdzZBQVFnQVNBTU9nQURRUUFoRGlBQlFRQTZBQVVnQVVFQk9nQUJJQTlCQVhFZ0NpRUhRUUVoRDBVTkJpQUFRUU02QUFZZ0FFR0NCanNCQkF3SUN5QUlJQkZxSUFkQlAzRkJnQUZ5T2dBQUlBc2dCMEVHZGtIQUFYSTZBQUJCQXdzaERDQVFJUWdnQ2lFSERBUUxRUU1oRENBSVFRTnFJUWdnQ2lFSERBTUxJQUJCQVRvQUJpQUFRWUlDT3dFRUlBRkJCVG9BQXd3RUMwRUZJUXdnQVVFRk9nQURJQW9oQnd3QkN3c2dBRUVBT2dBRUN5QURJUW9MSUFBZ0NEWUNDQ0FBSUFvMkFnQU1CQXNnRFVFQU5nTHNBU0FOSUFVMkF1Z0JJQTBnQkRZQzVBRWdBUzBBQWlFT0lBRXRBQUVoREFOQUlBeEIvd0Z4SWc5RkJFQWdEU2dDNkFFaEN3SkFBMEFDUUFKQUFrQUNRQ0FESUFkUEJFQWdDU0FMVFFSQUlBc2dDV3NpQkNBRElBZHJJZ1VnQkNBRlNTSVFHeUVGUVFBaENDQU5LQUxrQVNJRUlBbHFJZzRnQWlBSGFpSUtjMEVEY1EwQ1FRQWdDbXRCQTNFaUQwRUljaUFGU3cwQ0EwQWdDQ0FQUmdSQUlBVkJDR3NoRHdOQUlBZ2dDbW9pRVNnQ0FDRU1JQWdnRG1vaUVrRUVhaUFSUVFScUtBSUFJaEUyQWdBZ0VpQU1OZ0lBSUJGQmdJR0NoSGh4SWhFZ0RFR0FnWUtFZUhFaURISUVRQ0FLSUF3RWZ5QU1hRUVEZGdVZ0VXaEJBM1pCQkdvTElBaHFJZ2hxTFFBQUlRd01Cd3NnQ0VFSWFpSUlJQTlORFFBTERBUUxJQWdnQ21vc0FBQWlERUVBU0EwRUlBZ2dEbW9nRERvQUFDQUlRUUZxSVFnTUFBc0FDeUFKSUF0Qi9PekJBQkM1Q1FBTElBY2dBMEhzN01FQUVMa0pBQXNnQ0NBRklBVWdDRWtiSVE4RFFDQUlJQTlIQkVBZ0NDQUthaXdBQUNJTVFRQklEUUlnQ0NBT2FpQU1PZ0FBSUFoQkFXb2hDQXdCQ3dzZ0JTQUphaUVKSUFVZ0Iyb2hCd3dCQ3lBTklBZ2dDV29pQ1RZQzdBRWdCeUFJYWlFSElBbEJBbW9nQzBrTkFVRUJJUkFMSUFBZ0NUWUNDQ0FBSUFjMkFnQWdBQ0FOUWVRQmFrR0FnSUI0Y1NBUWNqWUNCQXdJQ3lBSFFRRnFJUWNDUUFOQUFuOENRQUpBQWtBQ1FBSkFBa0FDUUNBTVFkOEFhaUlLUWY4QmNTSUZRZDRBVHdSQUFrQUNRQUpBQWtBQ1FBSkFJQXhCL3dGeFFZNEJhdzRDQWdBQkN3SkFJQU1nQjAwRVFDQUdEUUVnQUVFQU9nQUVJQUZCQWpvQUFRd1RDeUFIUVFGcUlRVWdBaUFIYWl3QUFDSUtRZDhBYWlJSVFmOEJjU0lMUWQwQVRRUkFBa0FDUUNBRElBVk5CRUFnQmcwQklBRWdDRG9BQWlBQlFRTTZBQUVnQUVFQU9nQUVEQUlMSUFkQkFtb2hDQ0FDSUFWcUxBQUFJZ2RCM3dCcVFmOEJjU0lLUWQwQVRRUkFJQXRCM2dCc0lBcHFJZ1ZCZ2d0cklnZEJxUzFKRFFjZ0RVSG9BR29nQlJDYkF5QU5Md0ZvUVFGeEJFQWdCQ0FKYWlFSElBbEJBV29oQ2lBTkx3RnFJZ1ZCZ0JCUEJFQWdCMEVDYWlBRlFUOXhRWUFCY2pvQUFDQUVJQXBxSUFWQkJuWkJQM0ZCZ0FGeU9nQUFJQWNnQlVHQTRBTnhRUXgyUWVBQmNqb0FBQXdUQ3lBRUlBcHFJQVZCUDNGQmdBRnlPZ0FBSUFjZ0JVRUdka0hBQVhJNkFBQkJBZ3dUQ3lBRlFkVUVheUlIUVF0SkRRc2dCVUdGQldzaUJVRUxUd1JBSUFCQkFEb0FCaUFBUVlJR093RUVEQlVMSUFRZ0NXb2lCMEhSQVRvQUFDQUhRUUZxSUFWQjdnQnJPZ0FBUVFJTUVnc2dBRUVDT2dBRUlBZEJBRWdFUUNBQUlBazJBZ2dnQUNBSU5nSUFJQUJCQXpzQUJRd2NDeUFBSUFrMkFnZ2dBQ0FGTmdJQUlBQkJBanNBQlF3YkN5QUFRUUE2QUFZZ0FFR0NCRHNCQkFzZ0FDQUpOZ0lJSUFBZ0JUWUNBQXdaQ3lBQVFRSTZBQVFnQ2tFQVNBUkFJQUFnQ1RZQ0NDQUFJQVUyQWdBZ0FFRUNPd0FGREJrTElBQWdDVFlDQ0NBQUlBYzJBZ0FnQUVFQk93QUZEQmdMSUFCQkFEb0FCaUFBUVlJQ093RUVEQkVMSUFCQkFEb0FCaUFBUVlJQ093RUVEQkFMSUFNZ0IwMEVRQ0FHRFFNZ0FFRUFPZ0FFSUFGQkJEb0FBUXdRQ3lBSFFRRnFJUWdnQWlBSGFpd0FBQ0lGUWQ4QWFrSC9BWEVpQ2tFK1N3MEJJQVFnQ1dvaUJVSHZBVG9BQUNBRlFRSnFJQXBCbndGcklnZEJQM0ZCZ0FGeU9nQUFJQVZCQVdvZ0IwRUdka0cvQVhFNkFBQU1DZ3NnQkNBSmFpSUZRUUpxSUFkQkFYUkJoc0hHQUdvdkFRQWlCMEUvY1VHQUFYSTZBQUFnQlNBSFFReDJRZUFCY2pvQUFDQUZRUUZxSUFkQkJuWkJQM0ZCZ0FGeU9nQUFEQWtMSUFCQkFqb0FCQ0FGUVFCSUJFQWdBQ0FKTmdJSUlBQWdDRFlDQUNBQVFRSTdBQVVNRkFzZ0FDQUpOZ0lJSUFBZ0J6WUNBQ0FBUVFFN0FBVU1Fd3NnQUVFQU9nQUdJQUJCZ2dJN0FRUU1EQXNDUUNBRElBZE5CRUFnQmcwQklBRWdDam9BQWlBQlFRRTZBQUVnQUVFQU9nQUVEQTBMSUFkQkFXb2hDQ0FGUVFOR0lBSWdCMm9zQUFBaUMwSGZBR29pQ2tIL0FYRWlEa0hUQUVseERRSWdCVUVFUmlBT1FkWUFTWEVOQXlBS1FmOEJjU0lLUWQwQVRRUkFJQVZCM2dCc0lBcHFJZ1ZCZ2d0cklnZEJsUmRKRFFVZ0JVSENJbXNpQjBHK0dra05CZ0pBQWtBQ1FDQUZRZERBQUdzaUIwSG9BazhFUUNBTlFlQUFhaUFGRUtBRElBMHZBV0JCQVhFTkFVRUFJUXhCa0piRkFDRUhBMEFnREVFMVN3MEVJQVVnQnk4QkFHc2lDeUFIUVFKcUx3RUFTUTBESUFkQkJtb2hCeUFNUVFOcUlRd01BQXNBQ3lBRUlBbHFJZ1ZCQW1vZ0IwRUJkRUdlak1VQWFpOEJBQ0lIUVQ5eFFZQUJjam9BQUNBRklBZEJESFpCNEFGeU9nQUFJQVZCQVdvZ0IwRUdka0UvY1VHQUFYSTZBQUFNQ3dzZ0JDQUphaUVISUFsQkFXb2hDaUFOTHdGaUlnVkJnQkJQQkVBZ0IwRUNhaUFGUVQ5eFFZQUJjam9BQUNBRUlBcHFJQVZCQm5aQlAzRkJnQUZ5T2dBQUlBY2dCVUdBNEFOeFFReDJRZUFCY2pvQUFBd0xDeUFFSUFwcUlBVkJQM0ZCZ0FGeU9nQUFJQWNnQlVFR2RrSEFBWEk2QUFCQkFnd0xDeUFNUVFKcUlRVWdERUUwVHcwSUlBUWdDV29oQnlBSlFRRnFJUW9nQlVFQmRFR1Fsc1VBYWk4QkFDQUxhaUlGUWYvL0EzRkJnQkJQQkVBZ0IwRUNhaUFGUVQ5eFFZQUJjam9BQUNBRUlBcHFJQVZCQm5aQlAzRkJnQUZ5T2dBQUlBY2dCVUdBNEFOeFFReDJRZUFCY2pvQUFBd0tDeUFFSUFwcUlBVkJQM0ZCZ0FGeU9nQUFJQWNnQlVFR2RrSEFBWEk2QUFCQkFnd0tDeUFBUVFBNkFBWWdBRUdDQkRzQkJBd0xDeUFBUVFJNkFBUWdDMEVBU0FSQUlBQWdDVFlDQ0NBQUlBZzJBZ0FnQUVFQ093QUZEQk1MSUFBZ0NUWUNDQ0FBSUFjMkFnQWdBRUVCT3dBRkRCSUxJQUJCQURvQUJpQUFRWUlDT3dFRURBc0xJQVFnQ1dvaUJVSFFBVG9BQUNBRlFRRnFJQWRCL2dCck9nQUFRUUlNQmdzZ0JDQUphaUlGUWVNQk9nQUFJQVZCQW1vZ0MwSGdBR3NpQjBFL2NVR0FBWEk2QUFBZ0JVRUJhaUFIUWNBQmNVRUdka0dBQVhJNkFBQU1CQXNnQkNBSmFpSUZRZU1CT2dBQUlBVkJBbW9nRGtHaDRRQnFJZ2RCUDNGQmdBRnlPZ0FBSUFWQkFXb2dCMEVHZGtHSEFYRTZBQUFNQXdzZ0JDQUphaUlGUVFKcUlBZEJBWFJCK0tqRUFHb3ZBUUFpQjBFL2NVR0FBWEk2QUFBZ0JTQUhRUXgyUWVBQmNqb0FBQ0FGUVFGcUlBZEJCblpCUDNGQmdBRnlPZ0FBREFJTElBUWdDV29pQlVFQ2FpQUhRUUYwUWFMWHhBQnFMd0VBSWdkQlAzRkJnQUZ5T2dBQUlBVWdCMEVNZGtIZ0FYSTZBQUFnQlVFQmFpQUhRUVoyUVQ5eFFZQUJjam9BQUF3QkN5QUZRVFpCek96QkFCREdCQUFMUVFNTElBbHFJUWtnQXlBSVRRUkFJQUFnQ1RZQ0NDQUFJQWcyQWdBZ0FFRUFPZ0FFREFvTElBMG9BdWdCSWdzZ0NVRUNhazBFUUNBQUlBazJBZ2dnQUNBSU5nSUFJQUJCQVRvQUJBd0tDeUFJUVFGcUlRY2dBaUFJYWl3QUFDSU1RUUJJRFFBTElBUWdDV29nRERvQUFDQU5JQWxCQVdvaUNUWUM3QUVNQVFzTElBQWdDVFlDQ0NBQUlBZzJBZ0FNQmdzZ0FDQUpOZ0lJSUFBZ0J6WUNBQXdGQ3dKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQXlBSFJnUkFJQVlOQVNBQUlBazJBZ2dnQUNBRE5nSUFJQUJCQURvQUJBd05DeUFGSUFsQkFtb2lDMDBFUUNBQUlBazJBZ2dnQUNBSE5nSUFJQUJCQVRvQUJBd05DeUFCUVFBNkFBRWdCMEVCYWlFS0lBSWdCMm9zQUFBaURFSGZBR29oQ0FKQUFrQUNRQUpBSUE5QkFtc09Bd0VDQXdBTElBNUIvd0Z4SWdSQkEwWWdDRUgvQVhFaUNFSFNBRTF4RFFRZ0JFRUVSaUFJUWRVQVRYRU5CU0FJUWQwQVRRUkFJQVJCM2dCc0lBaHFJZ1JCZ2d0cklnZEJsUmRQQkVBZ0JFSENJbXNpQjBHK0drOEVRQ0FFUWREQUFHc2lCMEhvQWs4RVFDQU5RZkFBYWlBRUVLQURBa0FDUUNBTkx3RndRUUZ4UlFSQVFRQWhDRUdRbHNVQUlRY0RRQ0FJUVRWTERRTWdCQ0FITHdFQWF5SU1JQWRCQW1vdkFRQkpEUUlnQjBFR2FpRUhJQWhCQTJvaENBd0FDd0FMSUFsQkFXb2hDQ0FOTHdGeUlnZEJnQkJQQkVBZ0RTZ0M1QUVpQkNBTGFpQUhRVDl4UVlBQmNqb0FBQ0FFSUFscUlBZEJnT0FEY1VFTWRrSGdBWEk2QUFBZ0JDQUlhaUFIUVFaMlFUOXhRWUFCY2pvQUFBd1BDeUFOS0FMa0FTSUVJQWxxSUFkQkJuWkJ3QUZ5T2dBQUlBUWdDR29nQjBFL2NVR0FBWEk2QUFBTUR3c2dDRUVDYWlFRUlBaEJORThOQ3lBSlFRRnFJUWdnQkVFQmRFR1Fsc1VBYWk4QkFDQU1haUlIUWYvL0EzRkJnQkJQQkVBZ0RTZ0M1QUVpQkNBTGFpQUhRVDl4UVlBQmNqb0FBQ0FFSUFscUlBZEJnT0FEY1VFTWRrSGdBWEk2QUFBZ0JDQUlhaUFIUVFaMlFUOXhRWUFCY2pvQUFBd09DeUFOS0FMa0FTSUVJQWxxSUFkQkJuWkJ3QUZ5T2dBQUlBUWdDR29nQjBFL2NVR0FBWEk2QUFBTURnc2dBRUVBT2dBR0lBQkJnZ1E3QVFRTURnc2dEU2dDNUFFaUJDQUphaUlJSUFkQkFYUkJub3pGQUdvdkFRQWlCMEVNZGtIZ0FYSTZBQUFnQkNBTGFpQUhRVDl4UVlBQmNqb0FBQ0FJUVFGcUlBZEJCblpCUDNGQmdBRnlPZ0FBREFzTElBMG9BdVFCSWdRZ0NXb2lDQ0FIUVFGMFFhTFh4QUJxTHdFQUlnZEJESFpCNEFGeU9nQUFJQVFnQzJvZ0IwRS9jVUdBQVhJNkFBQWdDRUVCYWlBSFFRWjJRVDl4UVlBQmNqb0FBQXdLQ3lBTktBTGtBU0lFSUFscUlnZ2dCMEVCZEVINHFNUUFhaThCQUNJSFFReDJRZUFCY2pvQUFDQUVJQXRxSUFkQlAzRkJnQUZ5T2dBQUlBaEJBV29nQjBFR2RrRS9jVUdBQVhJNkFBQU1DUXNnQUVFQ09nQUVJQXhCQUVnRVFDQUFJQWsyQWdnZ0FDQUtOZ0lBSUFCQkFqc0FCUXdRQ3lBQUlBazJBZ2dnQUNBSE5nSUFJQUJCQVRzQUJRd1BDeUFJUWY4QmNVSGRBRTBFUUNBQklBZzZBQUpCQXlFTUlBRkJBem9BQVNBSUlRNGdDaUVIREFzTElBQkJBam9BQkNBTVFRQklCRUFnQUNBSk5nSUlJQUFnQ2pZQ0FDQUFRUUk3QUFVTUR3c2dBQ0FKTmdJSUlBQWdCellDQUNBQVFRRTdBQVVNRGdzZ0NFSC9BWEVpQ0VIZEFFMEVRQ0FPUWY4QmNVSGVBR3dnQ0dvaUIwR0NDMnNpQ0VHcExVOEVRQ0FOUWZnQWFpQUhFSnNESUEwdkFYaEJBWEVFUUNBSlFRRnFJUWdnRFM4QmVpSUhRWUFRVHdSQUlBMG9BdVFCSWdRZ0Myb2dCMEUvY1VHQUFYSTZBQUFnQkNBSmFpQUhRWURnQTNGQkRIWkI0QUZ5T2dBQUlBUWdDR29nQjBFR2RrRS9jVUdBQVhJNkFBQU1DZ3NnRFNnQzVBRWlCQ0FKYWlBSFFRWjJRY0FCY2pvQUFDQUVJQWhxSUFkQlAzRkJnQUZ5T2dBQURBb0xJQWRCMVFScklnaEJDMGtOQnlBSFFZVUZheUlIUVF0UEJFQWdBRUVBT2dBR0lBQkJnZ1k3QVFRTUN3c2dCQ0FKYWlJSVFkRUJPZ0FBSUFoQkFXb2dCMEh1QUdzNkFBQU1DUXNnRFNnQzVBRWlCQ0FKYWlJTUlBaEJBWFJCaHNIR0FHb3ZBUUFpQjBFTWRrSGdBWEk2QUFBZ0JDQUxhaUFIUVQ5eFFZQUJjam9BQUNBTVFRRnFJQWRCQm5aQlAzRkJnQUZ5T2dBQURBY0xJQUJCQWpvQUJDQU1RUUJJQkVBZ0FDQUpOZ0lJSUFBZ0NqWUNBQ0FBUVFNN0FBVU1EZ3NnQUNBSk5nSUlJQUFnQnpZQ0FDQUFRUUk3QUFVTURRc0NRQ0FJUWY4QmNTSUlRVDVMRFFBZ0RTZ0M1QUVpQkNBSmFpSUhRZThCT2dBQUlBZEJBV29nQ0VHZkFXc2lCMEVHZGtHL0FYRTZBQUFnQkNBTGFpQUhRVDl4UVlBQmNqb0FBQXdHQ3lBQVFRSTZBQVFnREVFQVNBUkFJQUFnQ1RZQ0NDQUFJQW8yQWdBZ0FFRUNPd0FGREEwTElBQWdDVFlDQ0NBQUlBYzJBZ0FnQUVFQk93QUZEQXdMSUFCQkFEb0FCaUFBUVFJNkFBUWdBVUVBT2dBQklBQWdDVFlDQ0NBQUlBTTJBZ0FnQUVLQWdvU1FFQ0FNclVML0FZTkNBNGFJUEFBRkRBc0xJQTBvQXVRQklnUWdDV29pQjBIakFUb0FBQ0FFSUF0cUlBeEI0QUJySWdoQlAzRkJnQUZ5T2dBQUlBZEJBV29nQ0VIQUFYRkJCblpCZ0FGeU9nQUFRUU1oRGd3REN5QU5LQUxrQVNJRUlBbHFJZ2RCNHdFNkFBQWdCMEVCYWlBSVFhSGhBR29pQjBFR2RrR0hBWEU2QUFBZ0JDQUxhaUFIUVQ5eFFZQUJjam9BQUNBTklBbEJBMm9pQ1RZQzdBRkJBQ0VNUVFRaERpQUtJUWNNQlFzZ0JFRTJRY3pzd1FBUXhnUUFDeUFOS0FMa0FTSUVJQWxxSWdkQjBBRTZBQUFnQjBFQmFpQUlRZjRBYXpvQUFBd0JDeUFKUVFOcUlRa2dEU0FKTmdMc0FVRUFJUXdnQ2lFSERBSUxJQTBnQ3pZQzdBRkJBQ0VNSUFzaENTQUtJUWNNQVFzTElBQWdDVFlDQ0NBQUlBbzJBZ0FNQXdzZ0RTQUZOZ0xvQVNBTklBUTJBdVFCSUFFdEFBRUVRQ0FCUVFBNkFBRUNmd0pBQWtBQ1FDQURCRUFnQlVFRFRRUkFJQUJCQURZQ0NDQUFRUUEyQWdBZ0FFRUJPZ0FFREFrTEFrQUNRQ0FCTFFBQ1FaMEJiQ0FDTEFBQUlnZEJRR29pQ1VIL0FYRkJQMDhFZnlBSFFRRnFRZjhCY1VHaUFVa05BaUFIUWVJQWF3VWdDUXRCL3dGeGFpSUxRYTRIYXlJSVFaZVRBVTBFUUNBSVFRRjBRY2lDd2dCcUx3RUFJZ29OQVFzQ1FBSkFBa0FDUUFKQUFrQWdDMEh0Q0dzT0F3RUZBZ0FMSUF0QmpBbHJEZ01DQkFNRUN5QUVRY3dCT2dBQ0lBUkJ3NVVDT3dBQURBa0xJQVJCekFFNkFBSWdCRUhEbFFJN0FBQU1Cd3NnQkVITUFUb0FBaUFFUWNQVkFqc0FBQXdIQ3lBRVFjd0JPZ0FDSUFSQnc5VUNPd0FBREFVTElBQkJBam9BQkNBSFFRQklCRUFnQUVFQU5nSUlJQUJCQVRZQ0FDQUFRUUk3QUFVTUN3c2dBRUVBTmdJSUlBQkJBRFlDQUNBQVFRRTdBQVVNQ2d0QkF5RUhJQWhCQTNaQi9QLy8vd0Z4UVpUd3dRQnFLQUlBSUFoMlFRRnhSUTBDSUFSQjhBRTZBQUFnQkNBS1FReDJRYUFCY2pvQUFTQUVJQXBCQm5aQlAzRkJnQUZ5T2dBQ0lBcEJQM0ZCZ0g5eUlRbEJCQXdGQ3lBQVFRSTZBQVFnQjBFQVNBUkFJQUJCQURZQ0NDQUFRUUUyQWdBZ0FFRUNPd0FGREFrTElBQkJBRFlDQ0NBQVFRQTJBZ0FnQUVFQk93QUZEQWdMSUFaRkJFQWdBRUVBTmdJSUlBQkJBRFlDQUNBQVFRQTZBQVFNQ0FzZ0FFRUFPZ0FHSUFCQmdnSTdBUVFnQUVFQU5nSUlJQUJCQURZQ0FBd0hDeUFLUVlBUVR3UkFJQVFnQ2tFTWRrSGdBWEk2QUFBZ0JDQUtRUVoyUVQ5eFFZQUJjam9BQVNBS1FUOXhRWUIvY2lFSlFRSWhCMEVEREFNTElBUWdDa0VHZGtIQUFYSTZBQUFnQ2tFL2NVR0FmM0loQ1VFQklRZEJBZ3dDQzBHTUFTRUpRUU1oQjBFRURBRUxRWVFCSVFsQkF5RUhRUVFMSVFvZ0JDQUhhaUFKT2dBQVFRRWhDQXNEUUFKQUFrQUNRQUpBSUFNZ0NFOEVRQ0FGSUFwUEJFQWdCU0FLYXlJSElBTWdDR3NpQ3lBSElBdEpJaEFiSVF0QkFDRUhJQVFnQ21vaURDQUNJQWhxSWc1elFRTnhEUUpCQUNBT2EwRURjU0lQUVFoeUlBdExEUUlEUUNBSElBOUdCRUFnQzBFSWF5RVBBMEFnQnlBT2FpSVJLQUlBSVFrZ0J5QU1haUlTUVFScUlCRkJCR29vQWdBaUVUWUNBQ0FTSUFrMkFnQWdFVUdBZ1lLRWVIRWlFU0FKUVlDQmdvUjRjU0lKY2dSQUlBNGdDUVIvSUFsb1FRTjJCU0FSYUVFRGRrRUVhZ3NnQjJvaUIyb3RBQUFoQ1F3SEN5QUhRUWhxSWdjZ0QwME5BQXNNQkFzZ0J5QU9haXdBQUNJSlFRQklEUVFnQnlBTWFpQUpPZ0FBSUFkQkFXb2hCd3dBQ3dBTElBb2dCVUg4NDhFQUVMa0pBQXNnQ0NBRFFlemp3UUFRdVFrQUN5QUhJQXNnQnlBTFN4c2hEd05BSUFjZ0QwY0VRQ0FISUE1cUxBQUFJZ2xCQUVnTkFpQUhJQXhxSUFrNkFBQWdCMEVCYWlFSERBRUxDeUFLSUF0cUlRY2dDQ0FMYWlFSURBRUxJQWNnQ0dvaENDQUhJQXBxSWdkQkEyb2dCVWtOQVVFQklSQUxJQUFnQnpZQ0NDQUFJQWcyQWdBZ0FDQU5RZVFCYWtHQWdJQjRjU0FRY2pZQ0JBd0VDeUFJUVFGcUlRZ0NRQU5BQW44Q1FBSkFBa0FDUUNBSlFmOEFhaUlGUWY4QmNTSU9RZjBBVFFSQUlBTWdDRXNOQVNBR0RRSWdBU0FGT2dBQ0lBRkJBVG9BQVNBQVFRQTZBQVFNQndzZ0FFRUFPZ0FHSUFCQmdnSTdBUVFNQmdzZ0NFRUJhaUVLQWtBQ1FDQU9RWjBCYkNBQ0lBaHFJZ3dzQUFBaUMwRkFhaUlKUWY4QmNVRS9Ud1IvSUF0QkFXcEIvd0Z4UWFJQlNRMENJQXRCNGdCckJTQUpDMEgvQVhGcUlnbEJyZ2RySWc1Qmw1TUJUUVJBSUE1QkFYUkJ5SUxDQUdvdkFRQWlCUTBCQ3dKQUFrQUNRQUpBQWtBQ1FDQUpRZTBJYXc0REFRVUNBQXNnQ1VHTUNXc09Bd0lFQXdRTElBMG9BdVFCSWdRZ0IycEJ3NVd5cG5nMkFBQU1DQXNnRFNnQzVBRWlCQ0FIYWtIRGxiTG1lRFlBQUF3SEN5QU5LQUxrQVNJRUlBZHFRY1BWc3FaNE5nQUFEQVlMSUEwb0F1UUJJZ1FnQjJwQnc5V3k1bmcyQUFBTUJRc2dBRUVDT2dBRUlBdEJBRWdFUUNBQUlBYzJBZ2dnQUNBS05nSUFJQUJCQWpzQUJRd01DeUFBSUFjMkFnZ2dBQ0FJTmdJQUlBQkJBVHNBQlF3TEN5QU9RUU4yUWZ6Ly8vOEJjVUdVOE1FQWFpZ0NBQ0FPZGtFQmNVVU5BaUFFSUFkcUlndEI4QUU2QUFBZ0MwRURhaUFGUVQ5eFFZQUJjam9BQUNBTFFRRnFJQVZCREhaQm9BRnlPZ0FBSUF0QkFtb2dCVUVHZGtFL2NVR0FBWEk2QUFBTUF3c2dBRUVDT2dBRUlBdEJBRWdFUUNBQUlBYzJBZ2dnQUNBS05nSUFJQUJCQWpzQUJRd0tDeUFBSUFjMkFnZ2dBQ0FJTmdJQUlBQkJBVHNBQlF3SkN5QUFRUUE2QUFZZ0FFR0NBanNCQkF3RUN5QUhRUUZxSVFzZ0JVR0FFRThFUUNBTktBTGtBU0lFSUFkcUlnNGdCVUVNZGtIZ0FYSTZBQUFnRGtFQ2FpQUZRVDl4UVlBQmNqb0FBQ0FFSUF0cUlBVkJCblpCUDNGQmdBRnlPZ0FBUVFNTUFnc2dEU2dDNUFFaUJDQUhhaUFGUVFaMlFjQUJjam9BQUNBRUlBdHFJQVZCUDNGQmdBRnlPZ0FBUVFJTUFRdEJCQXNnQjJvaEJ5QURJQXBOQkVBZ0FDQUhOZ0lJSUFBZ0NqWUNBQ0FBUVFBNkFBUU1CZ3NnRFNnQzZBRWlCU0FIUVFOcVRRUkFJQUFnQnpZQ0NDQUFJQW8yQWdBZ0FFRUJPZ0FFREFZTElBaEJBbW9oQ0NBTVFRRnFMQUFBSWdsQkFFZ05BQXNnRFNnQzVBRWlCQ0FIYWlBSk9nQUFJQWRCQVdvaENnd0JDd3NnQUNBSE5nSUlJQUFnQ0RZQ0FBd0NDeUFOUVFBMkF1d0JJQTBnQlRZQzZBRWdEU0FFTmdMa0FRSkFJQUV0QUFkQkFVWUVRQ0FGUVFKTkJFQWdBRUVBTmdJQUlBQkJBVG9BQkF3Q0N5QUJRUUE2QUFjZ0JDQUJMUUFJT2dBQUlBMUJBVFlDN0FGQkFTRUlDeUFCTFFBS0loQkJ1T0lBYkNFUklCQkJ2Z0ZzSVJJZ0VFRWhhMEgvQVhGQjNnQnNJUk1nRUVFZ2EwSC9BWEZCNEFCc0lSUWdFRUV2YTBIL0FYRWlGVUc4QVd4QnJKTElBR29oRnlBUVFmY0FhMEgvQVhGQjNnQnNRY3c3YXlFV0lBRXRBQXdoRGlBQkxRQUxJUThnQVMwQUNTRUpJQkJCSDBzaEdDQVFRU1ZySVJrZ0VFRWdSaUVhSUJCQjlnQkxJUnNEUUNBSlFmOEJjU0lNUlFSQUlBMG9BdWdCSVFzRFFBSkFBa0FDUUFKQUlBTWdCMDhFUUNBSUlBdE5CRUFnQ3lBSWF5SUVJQU1nQjJzaUJTQUVJQVZKSWhBYklRVkJBQ0VKSUEwb0F1UUJJZ1FnQ0dvaURpQUNJQWRxSWdwelFRTnhEUUpCQUNBS2EwRURjU0lQUVFoeUlBVkxEUUlEUUNBSklBOUdCRUFnQlVFSWF5RVBBMEFnQ1NBS2FpSVJLQUlBSVF3Z0NTQU9haUlTUVFScUlCRkJCR29vQWdBaUVUWUNBQ0FTSUF3MkFnQWdFVUdBZ1lLRWVIRWlFU0FNUVlDQmdvUjRjU0lNY2dSQUlBb2dEQVIvSUF4b1FRTjJCU0FSYUVFRGRrRUVhZ3NnQ1dvaUNXb3RBQUFoREF3SEN5QUpRUWhxSWdrZ0QwME5BQXNNQkFzZ0NTQUthaXdBQUNJTVFRQklEUVFnQ1NBT2FpQU1PZ0FBSUFsQkFXb2hDUXdBQ3dBTElBZ2dDMEg4NDhFQUVMa0pBQXNnQnlBRFFlemp3UUFRdVFrQUN5QUpJQVVnQlNBSlNSc2hEd05BSUFrZ0QwY0VRQ0FKSUFwcUxBQUFJZ3hCQUVnTkFpQUpJQTVxSUF3NkFBQWdDVUVCYWlFSkRBRUxDeUFGSUFocUlRZ2dCU0FIYWlFSERBRUxJQTBnQ0NBSmFpSUlOZ0xzQVNBSElBbHFJUWNnQ0VFRGFpQUxTUTBCUVFFaEVBc2dBQ0FITmdJQUlBQWdEVUhrQVdwQmdJQ0FlSEVnRUhJMkFnUU1CQXNnQjBFQmFpRUhJQTBDZndOQUFuOENRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBeEIvd0JxSWc5Qi93RnhJZzVCL1FCTkJFQUNRQ0FESUFkTkJFQWdCZzBCSUFFZ0R6b0FDaUFCUVFFNkFBa2dBRUVBT2dBRURBTUxJQWRCQVdvaENTQUNJQWRxTEFBQUlnVkJNR3NpQ2tIL0FYRWlFRUVKVFFSQUFrQWdBeUFKVFFSQUlBWU5BU0FCSUFvNkFBc2dBU0FQT2dBS0lBRkJBam9BQ1NBQVFRQTZBQVFnQUNBSk5nSUFEQk1MSUFJZ0NXb3RBQUJCL3dCcUlndEIvd0Z4SWd4Qi9RQkxEUVVDUUNBRElBZEJBbW9pQlUwRVFDQUdEUUVnQVNBTE9nQU1JQUVnQ2pvQUN5QUJJQTg2QUFvZ0FVRURPZ0FKSUFCQkFEb0FCQ0FBSUFVMkFnQU1GQXNnQWlBRmFpMEFBRUV3YTBIL0FYRWlEMEVKU3cwSElBZEJBMm9oQ1NBUVFld0piQ0FPUWJqaUFHeHFJQXhCQ214cUlBOXFJZ1ZCL0xNQ1R3UkFJQVZCeU1RTGEwR0FnTUFBVHdSQUlBQkJBRG9BQmlBQVFZSUlPd0VFSUFBZ0NUWUNBQXdWQ3lBRUlBaHFJZ2RCQTJvZ0JVSEl4QWRySWdWQlAzRkJnQUZ5T2dBQUlBY2dCVUVTZGtId0FYSTZBQUFnQjBFQ2FpQUZRUVoyUVQ5eFFZQUJjam9BQUNBSFFRRnFJQVZCREhaQlAzRkJnQUZ5T2dBQVFRUU1EZ3NnQlVHaE9rWU5EQ0FOUVRCcVFlNy95QUJCemdFZ0JSRFhBeUFOS0FJMElRY0Nmd0pBSUEwb0FqQkJBWEVFUUNBSFFRRnJJZ2RCemdGSkRRRWdCMEhPQVVIYzQ4RUFFTVlFQUFzZ0IwSE5BVTBFUUNBSFFRRjBRWXFEeVFCcUx3RUFEQUlMSUFkQnpnRkJ6T1BCQUJER0JBQUxJQVVnQjBFQmRDSUZRWXFEeVFCcUx3RUFJQVZCN3YvSUFHb3ZBUUJyYWdzaEJ5QUVJQWhxSVFVZ0IwSC8vd054UVlBUVR3UkFJQVZCQW1vZ0IwRS9jVUdBQVhJNkFBQWdCVUVCYWlBSFFRWjJRVDl4UVlBQmNqb0FBQ0FGSUFkQmdPQURjVUVNZGtIZ0FYSTZBQUJCQXd3T0N5QUZRUUZxSUFkQlAzRkJnQUZ5T2dBQUlBVWdCMEVHZGtIQUFYSTZBQUFNQ3dzZ0FFRUFPZ0FHSUFCQmdnWTdBUVFnQUNBRk5nSUFEQklMSUFCQkFEb0FCaUFBUVlJRU93RUVJQUFnQ1RZQ0FBd1JDeUFPUVI5TkJFQUNRQ0FOUVNocVFaaWd4d0JCL0E0Z0RrRytBV3dnQlVGQWFpSU1RZjhCY1VFK1N3Ui9JQVZCZmtvTkFTQUZRY0VBYXdVZ0RBdEIvd0Z4YWlJSEVOY0RJQTBvQWl3aEJRSi9Ba0FnRFNnQ0tFRUJjUVJBSUFWQkFXc2lCVUg4RGtrTkFVRi9RZndPUWR6andRQVF4Z1FBQ3lBRlFmc09UUVJBSUFWQkFYUkJrTDdIQUdvdkFRQWlERUVNZGlFS0lBeEJCbllNQWd0Qi9BNUIvQTVCek9QQkFCREdCQUFMSUFjZ0JVRUJkQ0lGUVppZ3h3QnFMd0VBYXlBRlFaQyt4d0JxTHdFQWFpSU1RZi8vQTNFaUJVRU1kaUVLSUFWQkJuWUxJUVVnQkNBSWFpSUhJQXBCNEFGeU9nQUFJQWRCQW1vZ0RFRS9jVUdBQVhJNkFBQWdCMEVCYWlBRlFUOXhRWUFCY2pvQUFFRUREQXdMSUFCQkFqb0FCQ0FGUVFCSUJFQWdBQ0FKTmdJQUlBQkJBanNBQlF3U0N5QUFJQWMyQWdBZ0FFRUJPd0FGREJFTElBVkIzd0JxUWY4QmNTSUtRZDRBVHdSQUFrQUNRQUpBSUF4QjN3QnFRZjhCY1VIZ0FHd2dCVUZBYWlJS1FmOEJjVUUrU3dSL0lBVkJvSDlLRFFNZ0JVSEJBR3NGSUFvTFFmOEJjV29pQlVIZ0Jtc2lCMEg3UGs4RVFDQUZRZUFHU1EwQklBVkIyOFVBYXlJRlFlVUFUdzBDSUFRZ0NHb2lCMEVDYWlBRlFRRjBRZUtReUFCcUx3RUFJZ1ZCUDNGQmdBRnlPZ0FBSUFjZ0JVRU1ka0hnQVhJNkFBQWdCMEVCYWlBRlFRWjJRVDl4UVlBQmNqb0FBRUVEREE4TElBMUJHR3BCaU56SEFFSGJEQ0FIRU5jRElBMG9BaHdoQlFKL0FrQWdEU2dDR0VFQmNRUkFJQVZCQVdzaUJVSGJERWtOQVNBRlFkc01RZHpqd1FBUXhnUUFDeUFGUWRvTVRRUkFJQVZCQVhSQnZ2WEhBR292QVFBaURFRU1kaUVLSUF4QkJuWU1BZ3NnQlVIYkRFSE00OEVBRU1ZRUFBc2dCeUFGUVFGMElnVkJpTnpIQUdvdkFRQnJJQVZCdnZYSEFHb3ZBUUJxSWd4Qi8vOERjU0lGUVF4MklRb2dCVUVHZGdzaEJTQUVJQWhxSWdjZ0NrSGdBWEk2QUFBZ0IwRUNhaUFNUVQ5eFFZQUJjam9BQUNBSFFRRnFJQVZCUDNGQmdBRnlPZ0FBUVFNTURnc2dEVUVnYWtIMGpzZ0FRVHNnQlJEWEF5QU5LQUlrSVFjQ2Z3SkFJQTBvQWlCQkFYRUVRQ0FIUVFGcklnZEJPMGtOQVNBSFFUdEIzT1BCQUJER0JBQUxJQWRCT2swRVFDQUhRUUYwUWV5UHlBQnFMd0VBREFJTElBZEJPMEhNNDhFQUVNWUVBQXNnQlNBSFFRRjBJZ1ZCN0kvSUFHb3ZBUUFnQlVIMGpzZ0FhaThCQUd0cUN5RUhJQVFnQ0dvaEJTQUhRZi8vQTNGQmdCQlBCRUFnQlVFQ2FpQUhRVDl4UVlBQmNqb0FBQ0FGUVFGcUlBZEJCblpCUDNGQmdBRnlPZ0FBSUFVZ0IwR0E0QU54UVF4MlFlQUJjam9BQUVFRERBNExJQVZCQVdvZ0IwRS9jVUdBQVhJNkFBQWdCU0FIUVFaMlFjQUJjam9BQUF3TEN5QUZRZVVBUWJ6andRQVF4Z1FBQ3lBQVFRSTZBQVFnQlVFQVNBUkFJQUFnQ1RZQ0FDQUFRUUk3QUFVTUVnc2dBQ0FITmdJQUlBQkJBVHNBQlF3UkN3SkFBa0FDUUFKQUFrQWdERUhRQUdwQi93RnhJZ2RCeUFCUEJFQWdERUgvQVhFaUIwR21BV3NPQXdFREJBSUxJQVFnQ0dvaUJVRUNhaUFIUWJ3QmJDQUtRUUYwYWtHc2tzZ0FhaThCQUNJSFFUOXhRWUFCY2pvQUFDQUZJQWRCREhaQjRBRnlPZ0FBSUFWQkFXb2dCMEVHZGtFL2NVR0FBWEk2QUFCQkF3d1BDeUFGUVNCcVFmOEJjU0lGUVJWTERRTWdCQ0FJYWlFSElBaEJBV29oQ2lBRlFRRjBRY2o5eUFCcUx3RUFJZ1ZCZ0JCUEJFQWdCeUFGUVF4MlFlQUJjam9BQUNBSFFRSnFJQVZCUDNGQmdBRnlPZ0FBSUFRZ0Ntb2dCVUVHZGtFL2NVR0FBWEk2QUFCQkF3d1BDeUFFSUFwcUlBVkJQM0ZCZ0FGeU9nQUFJQWNnQlVFR2RrSEFBWEk2QUFBTURBc2dCMEdoQVVZTkNnc2dEa0gyQUUwTkFTQUVJQWhxSWdWQkFtb2dERUVJYWtIL0FYRkIzZ0JzSUFwcVFjdzdheUlIUVQ5eFFZQUJjam9BQUNBRlFRRnFJQWRCQm5aQnZ3RnhPZ0FBSUFVZ0IwR0E0QU54UVF4MlFlQUJjam9BQUVFRERBd0xJQXBCSUVrTkJ3c2dEVUVRYWtHMC9zZ0FRUzRnREVIZUFHcEIvd0Z4UWQ0QWJDQUthaUlIRU5jRElBMG9BaFFoQlFKL0FrQWdEU2dDRUVFQmNRUkFJQVZCQVdzaUJVRXVTUTBCSUFWQkxrSGM0OEVBRU1ZRUFBc2dCVUV0VFFSQUlBVkJBWFJCa3YvSUFHb3ZBUUFNQWdzZ0JVRXVRY3pqd1FBUXhnUUFDeUFGUVFGMElnVkJrdi9JQUdvdkFRQWdCVUcwL3NnQWFpOEJBR3NnQjJvTElRY2dCQ0FJYWlFRklBZEIvLzhEY1VHQUVFOEVRQ0FGUVFKcUlBZEJQM0ZCZ0FGeU9nQUFJQVZCQVdvZ0IwRUdka0UvY1VHQUFYSTZBQUFnQlNBSFFZRGdBM0ZCREhaQjRBRnlPZ0FBUVFNTUN3c2dCVUVCYWlBSFFUOXhRWUFCY2pvQUFDQUZJQWRCQm5aQndBRnlPZ0FBREFnTElBQkJBRG9BQmlBQVFZSUNPd0VFREFFTElBeEIvd0Z4UVlBQlJnMERJQUJCQURvQUJpQUFRWUlDT3dFRUN5QUFJQWMyQWdBTURRc2dBVUVCT2dBSElBQkJBVG9BQmlBQVFZSUNPd0VFSUFBZ0NUWUNBQ0FCSUFwQk1ISTZBQWdNREFzZ0FTQUxPZ0FLSUFGQkFUb0FDU0FCUVFFNkFBY2dBRUVDT2dBR0lBQkJnZ0k3QVFRZ0FDQUZOZ0lBSUFFZ0NrRXdjam9BQ0F3TEN5QUVJQWhxSWdSQjRvVUNPd0FBSUFSQkFtcEJyQUU2QUFBZ0NFRURhZ3dHQ3lBRUlBaHFJUWNnQ0VFQmFpRUxJQXBCQVhSQjlQM0lBR292QVFBaUJVR0FFRThFUUNBSElBVkJESFpCNEFGeU9nQUFJQWRCQW1vZ0JVRS9jVUdBQVhJNkFBQWdCQ0FMYWlBRlFRWjJRVDl4UVlBQmNqb0FBRUVEREFRTElBUWdDMm9nQlVFL2NVR0FBWEk2QUFBZ0J5QUZRUVoyUWNBQmNqb0FBQXdCQ3lBRUlBaHFJUWNnQ0VFQmFpRUxJQXBCQVhSQmpQeklBR292QVFBaUJVR0FFRThFUUNBSElBVkJESFpCNEFGeU9nQUFJQWRCQW1vZ0JVRS9jVUdBQVhJNkFBQWdCQ0FMYWlBRlFRWjJRVDl4UVlBQmNqb0FBRUVEREFNTElBUWdDMm9nQlVFL2NVR0FBWEk2QUFBZ0J5QUZRUVoyUWNBQmNqb0FBQXRCQWd3QkN5QUVJQWhxSWdWQjdyOENPd0FBSUFWQkFtcEJod0U2QUFCQkF3c2dDR29oQ0NBRElBbE5CRUFnQUNBSk5nSUFJQUJCQURvQUJBd0dDeUFOS0FMb0FTSUxJQWhCQTJwTkJFQWdBQ0FKTmdJQUlBQkJBVG9BQkF3R0N5QUpRUUZxSVFjZ0FpQUphaXdBQUNJTVFRQklEUUFMSUFRZ0NHb2dERG9BQUNBSVFRRnFDeUlJTmdMc0FRd0FDd0FMSUEwQ2Z3SkFBa0FDUUFKQUFrQUNRQUpBSUFNZ0IwWUVRQ0FHRFFFZ0FDQUROZ0lBSUFCQkFEb0FCQXdLQ3lBRklBaEJBMm9pQzAwRVFDQUFJQWMyQWdBZ0FFRUJPZ0FFREFvTElBRkJBRG9BQ1NBSFFRRnFJUW9nQWlBSGFpd0FBQ0VKQWtBQ1FBSkFJQXhCQW1zT0FnRUNBQXNnQ1VFd2F5SU1RZjhCY1VFSlRRUkFJQUVnRERvQUN5QUJJQkE2QUFwQkFpRUpJQUZCQWpvQUNTQU1JUThnQ2lFSERBc0xJQmhGQkVBQ1FDQU5RZGdBYWtHWW9NY0FRZndPSUJJZ0NVRkFhaUlNUWY4QmNVRStTd1IvSUFsQmZrb05BU0FKUWNFQWF3VWdEQXRCL3dGeGFpSUpFTmNESUEwb0Fsd2hCd0ovQWtBZ0RTZ0NXRUVCY1FSQUlBZEJBV3NpQjBIOERra05BVUYvUWZ3T1Fkemp3UUFReGdRQUN5QUhRZnNPVFFSQUlBZEJBWFJCa0w3SEFHb3ZBUUFpQ1VFTWRpRU1JQWxCQm5ZTUFndEIvQTVCL0E1QnpPUEJBQkRHQkFBTElBa2dCMEVCZENJSFFaaWd4d0JxTHdFQWF5QUhRWkMreHdCcUx3RUFhaUlKUWYvL0EzRWlCMEVNZGlFTUlBZEJCbllMSVFjZ0JDQUlhaUlJSUF4QjRBRnlPZ0FBSUFoQkFtb2dDVUUvY1VHQUFYSTZBQUFnQ0VFQmFpQUhRVDl4UVlBQmNqb0FBQXdKQ3lBQVFRSTZBQVFnQ1VFQVNBUkFJQUFnQ2pZQ0FDQUFRUUk3QUFVTURRc2dBQ0FITmdJQUlBQkJBVHNBQlF3TUN5QUpRZDhBYWtIL0FYRWlERUhlQUU4RVFBSkFBa0FDUUNBVUlBbEJRR29pREVIL0FYRkJQa3NFZnlBSlFhQi9TZzBESUFsQndRQnJCU0FNQzBIL0FYRnFJZ1JCNEFacklnZEIrejVQQkVBZ0JFSGdCa2tOQVNBRVFkdkZBR3NpQjBIbEFFOE5BaUFOS0FMa0FTSUVJQWhxSWdoQkFtb2dCMEVCZEVIaWtNZ0FhaThCQUNJSFFUOXhRWUFCY2pvQUFDQUlJQWRCREhaQjRBRnlPZ0FBSUFoQkFXb2dCMEVHZGtFL2NVR0FBWEk2QUFBTURBc2dEVUhJQUdwQmlOekhBRUhiRENBSEVOY0RJQTBvQWt3aEJBSi9Ba0FnRFNnQ1NFRUJjUVJBSUFSQkFXc2lCRUhiREVrTkFTQUVRZHNNUWR6andRQVF4Z1FBQ3lBRVFkb01UUVJBSUFSQkFYUkJ2dlhIQUdvdkFRQWlDVUVNZGlFTUlBbEJCbllNQWdzZ0JFSGJERUhNNDhFQUVNWUVBQXNnQnlBRVFRRjBJZ1JCaU56SEFHb3ZBUUJySUFSQnZ2WEhBR292QVFCcUlnbEIvLzhEY1NJRVFReDJJUXdnQkVFR2Rnc2hCeUFOS0FMa0FTSUVJQWhxSWdnZ0RFSGdBWEk2QUFBZ0NFRUNhaUFKUVQ5eFFZQUJjam9BQUNBSVFRRnFJQWRCUDNGQmdBRnlPZ0FBREFzTElBMUIwQUJxUWZTT3lBQkJPeUFFRU5jRElBMG9BbFFoQndKL0FrQWdEU2dDVUVFQmNRUkFJQWRCQVdzaUIwRTdTUTBCSUFkQk8wSGM0OEVBRU1ZRUFBc2dCMEU2VFFSQUlBZEJBWFJCN0kvSUFHb3ZBUUFNQWdzZ0IwRTdRY3pqd1FBUXhnUUFDeUFFSUFkQkFYUWlCRUhzajhnQWFpOEJBQ0FFUWZTT3lBQnFMd0VBYTJvTElnZEIvLzhEY1VHQUVFOEVRQ0FOS0FMa0FTSUVJQWhxSWdoQkFtb2dCMEUvY1VHQUFYSTZBQUFnQ0VFQmFpQUhRUVoyUVQ5eFFZQUJjam9BQUNBSUlBZEJnT0FEY1VFTWRrSGdBWEk2QUFBTUN3c2dEU2dDNUFFaUJDQUlhaUlMUVFGcUlBZEJQM0ZCZ0FGeU9nQUFJQXNnQjBFR2RrSEFBWEk2QUFBTUN3c2dCMEhsQUVHODQ4RUFFTVlFQUFzZ0FFRUNPZ0FFSUFsQkFFZ0VRQ0FBSUFvMkFnQWdBRUVDT3dBRkRBMExJQUFnQnpZQ0FDQUFRUUU3QUFVTURBc0NRQUpBQWtBQ1FBSkFJQlZCeUFCUEJFQWdHUTREQVFNRUFnc2dEU2dDNUFFaUJDQUlhaUlIUVFKcUlCY2dERUVCZEdvdkFRQWlDRUUvY1VHQUFYSTZBQUFnQnlBSVFReDJRZUFCY2pvQUFDQUhRUUZxSUFoQkJuWkJQM0ZCZ0FGeU9nQUFEQXdMSUFsQklHcEIvd0Z4SWdSQkZVc05BeUFJUVFGcUlRa2dCRUVCZEVISS9jZ0FhaThCQUNJSFFZQVFUd1JBSUEwb0F1UUJJZ1FnQ0dvaUNDQUhRUXgyUWVBQmNqb0FBQ0FJUVFKcUlBZEJQM0ZCZ0FGeU9nQUFJQVFnQ1dvZ0IwRUdka0UvY1VHQUFYSTZBQUFNREFzZ0RTZ0M1QUVpQkNBSWFpQUhRUVoyUWNBQmNqb0FBQ0FFSUFscUlBZEJQM0ZCZ0FGeU9nQUFEQXdMSUJvTkNRc2dHMFVOQVNBTktBTGtBU0lFSUFocUlnZEJBbW9nRENBV2FpSUlRVDl4UVlBQmNqb0FBQ0FIUVFGcUlBaEJCblpCUDNGQmdBRnlPZ0FBSUFjZ0NFR0E0QU54UVF4MlFlQUJjam9BQUF3SkN5QU1RU0JKRFFZTElBMUJRR3RCdFA3SUFFRXVJQXdnRTJvaUJ4RFhBeUFOS0FKRUlRUUNmd0pBSUEwb0FrQkJBWEVFUUNBRVFRRnJJZ1JCTGtrTkFTQUVRUzVCM09QQkFCREdCQUFMSUFSQkxVMEVRQ0FFUVFGMFFaTC95QUJxTHdFQURBSUxJQVJCTGtITTQ4RUFFTVlFQUFzZ0JFRUJkQ0lFUVpML3lBQnFMd0VBSUFSQnRQN0lBR292QVFCcklBZHFDeUlIUWYvL0EzRkJnQkJQQkVBZ0RTZ0M1QUVpQkNBSWFpSUlRUUpxSUFkQlAzRkJnQUZ5T2dBQUlBaEJBV29nQjBFR2RrRS9jVUdBQVhJNkFBQWdDQ0FIUVlEZ0EzRkJESFpCNEFGeU9nQUFEQWdMSUEwb0F1UUJJZ1FnQ0dvaUMwRUJhaUFIUVQ5eFFZQUJjam9BQUNBTElBZEJCblpCd0FGeU9nQUFEQWdMSUFsQi93QnFJZzVCL3dGeFFmMEFUUVJBSUFFZ0Rqb0FEQ0FCSUE4NkFBc2dBU0FRT2dBS1FRTWhDU0FCUVFNNkFBa2dDaUVIREFvTElBRkJBVG9BQnlBQVFRRTZBQVlnQUVHQ0Fqc0JCQ0FBSUFjMkFnQWdBU0FQUVRCcU9nQUlEQW9MSUFsQk1HdEIvd0Z4SWdSQkNVc05BU0FFSUJGcUlBOUIvd0Z4UWV3SmJHb2dEa0gvQVhGQkNteHFJZ2RCL0xNQ1R3UkFJQWRCeU1RTGEwR0FnTUFBVHdSQUlBQkJBRG9BQmlBQVFZSUlPd0VFSUFBZ0NqWUNBQXdMQ3lBTktBTGtBU0lFSUFocUlna2dCMEhJeEFkcklnZEJFblpCOEFGeU9nQUFJQVFnQzJvZ0IwRS9jVUdBQVhJNkFBQWdDVUVDYWlBSFFRWjJRVDl4UVlBQmNqb0FBQ0FKUVFGcUlBZEJESFpCUDNGQmdBRnlPZ0FBSUFoQkJHb01DQXNnQjBHaE9rWU5BaUFOUVRocVFlNy95QUJCemdFZ0J4RFhBeUFOS0FJOElRUUNmd0pBSUEwb0FqaEJBWEVFUUNBRVFRRnJJZ1JCemdGSkRRRWdCRUhPQVVIYzQ4RUFFTVlFQUFzZ0JFSE5BVTBFUUNBRVFRRjBRWXFEeVFCcUx3RUFEQUlMSUFSQnpnRkJ6T1BCQUJER0JBQUxJQVJCQVhRaUJFR0tnOGtBYWk4QkFDQUVRZTcveUFCcUx3RUFheUFIYWdzaUIwSC8vd054UVlBUVR3UkFJQTBvQXVRQklnUWdDR29pQ0VFQ2FpQUhRVDl4UVlBQmNqb0FBQ0FJUVFGcUlBZEJCblpCUDNGQmdBRnlPZ0FBSUFnZ0IwR0E0QU54UVF4MlFlQUJjam9BQUF3R0N5QU5LQUxrQVNJRUlBaHFJZ3RCQVdvZ0IwRS9jVUdBQVhJNkFBQWdDeUFIUVFaMlFjQUJjam9BQUF3R0N5QUFRUUE2QUFZZ0FDQUpPZ0FGSUFCQkFqb0FCQ0FCUVFBNkFBa2dBQ0FETmdJQURBZ0xJQUVnRGpvQUNpQUJRUUU2QUFrZ0FVRUJPZ0FISUFCQkFqb0FCaUFBUVlJQ093RUVJQUFnQnpZQ0FDQUJJQTlCTUdvNkFBZ01Cd3NnRFNnQzVBRWlCQ0FJYWlJSFFlNi9BanNBQUNBSFFRSnFRWWNCT2dBQURBSUxJQWhCQVdvaENTQU1RUUYwUWZUOXlBQnFMd0VBSWdkQmdCQlBCRUFnRFNnQzVBRWlCQ0FJYWlJSUlBZEJESFpCNEFGeU9nQUFJQWhCQW1vZ0IwRS9jVUdBQVhJNkFBQWdCQ0FKYWlBSFFRWjJRVDl4UVlBQmNqb0FBQXdDQ3lBTktBTGtBU0lFSUFocUlBZEJCblpCd0FGeU9nQUFJQVFnQ1dvZ0IwRS9jVUdBQVhJNkFBQU1BZ3NnQ0VFQmFpRUpJQXhCQVhSQmpQeklBR292QVFBaUIwR0FFRThFUUNBTktBTGtBU0lFSUFocUlnZ2dCMEVNZGtIZ0FYSTZBQUFnQ0VFQ2FpQUhRVDl4UVlBQmNqb0FBQ0FFSUFscUlBZEJCblpCUDNGQmdBRnlPZ0FBREFFTElBMG9BdVFCSWdRZ0NHb2dCMEVHZGtIQUFYSTZBQUFnQkNBSmFpQUhRVDl4UVlBQmNqb0FBQXdCQ3lBTklBczJBdXdCUVFBaENTQUxJUWdnQ2lFSERBSUxJQWhCQW1vTElnZzJBdXdCUVFBaENTQUtJUWNNQUFzQUN5QUFJQWcyQWdnTUFRc2dBU2dDREVVaEJ3TkFBa0FDUUFKQUFrQUNRQUpBSUFkQkFYRUVmeUFOUVFocUlBNGdBaUFEUWFUcndRQVFud2NnQlNBS1NRMEZJQTBvQWdnaEN5QUZJQXBySWhFZ0RTZ0NEQ0lTSUJFZ0Vra2JJUXdnQkNBS2FpRVVRUUFoRHdKQUFrQURRQ0FOSUE4Z0N5QU1RZVRxd1FBUW53ZEJBQ0VIQWtBQ1FDQU5LQUlFSWhOQkFDQU5LQUlBSWhCclFRTnhJZ2hCQ0hKSkRRQURRQ0FISUFoR0JFQWdFMEVJYXlFSklBZ2hCd05BSUFjZ0VHb2lDRUVFYWlnQ0FFR0FnWUtFZUhFaUZTQUlLQUlBUVlDQmdvUjRjU0lJY2dSQUlCQWdDQVIvSUFob1FRTjJCU0FWYUVFRGRrRUVhZ3NnQjJvaUIyb3RBQUFoQ1F3RkN5QUhRUWhxSWdjZ0NVME5BQXNNQWdzZ0J5QVFhaXdBQUNJSlFRQklEUUlnQjBFQmFpRUhEQUFMQUFzZ0V5QUhJQWNnRTBrYklRZ0RRQ0FISUFoR0RRUWdCeUFRYWl3QUFDSUpRUUJJRFFFZ0IwRUJhaUVIREFBTEFBc0NRQ0FISUE5cUlnZEJCR29nREVzTkFBTkFJQWNoQ0NBSlFUNXFRZjhCY1VFZVR3UkFJQWxCL3dGeElnOUI3d0ZOQkVBQ1FBTkFJQWxCL3dGeFFZRG93UUJxTFFBQUlBY2dDMm9pQ0VFQmFpMEFBRUdBNThFQWFpMEFBSEVnQ0VFQ2FpMEFBRUVHZG5KQkFrY0VRQ0FISVFnTUNBc2dCMEVIYWlBTVN3MEJJQWRCQTJvaEJ5QUlRUU5xTFFBQUlnakFJUWtnQ0VId0FYRkI0QUZHRFFBTElBbEJBRWdOQXlBSFFRRnFJUThNQlFzZ0IwRURhaUVIREFNTElBZ2dDMm9pQjBFRGFpMEFBRUhBQVhGQkFuUWdEMEdBNk1FQWFpMEFBQ0FIUVFGcUxRQUFRWURud1FCcUxRQUFjU0FIUVFKcUxRQUFRUVoyY25KQmdnUkhEUVFnQ0VFRWFpRUhJQWhCQ0dvZ0RFc05BaUFISUF0cUxBQUFJZ2xCQUVnTkFTQUlRUVZxSVE4TUF3c2dDQ0FMYWtFQmFpd0FBRUZBVGcwRElBaEJBbW9oQnlBSVFRWnFJQXhMRFFFZ0J5QUxhaXdBQUNJSlFRQklEUUFMSUFoQkEyb2hEd3dCQ3dzRFFDQUhJZ2dnREU4TkFRSkFBa0FnQnlBTGFpd0FBQ0lKUVFCSUJFQWdDVUUrYWtIL0FYRkJIazhFUUNBSlFYQlBEUVVnQjBFRGFpSVFJQXhMRFFVZ0IwRUJhaUlJSUF4UERRSWdEQ0FIUVFKcUlnOUxCRUFnRUNBSElBbEIvd0Z4UVlEb3dRQnFMUUFBSUFnZ0Myb3RBQUJCZ09mQkFHb3RBQUJ4SUFzZ0Qyb3RBQUJCQm5aeVFRSkdHeUVJREFZTElBOGdERUdFNjhFQUVNWUVBQXNnQ0VFQ2FpSUhJQXhORFFJTUJBc2dDRUVCYWlFSERBSUxJQWdnREVIMDZzRUFFTVlFQUFzZ0RDQUlRUUZxSWdsTEJFQWdDU0FMYWl3QUFFRkFTQTBCREFJTEN5QUpJQXhCbE92QkFCREdCQUFMSUFnZ0VVc05CQ0FJSUJKTERRVWdDQ0VNQ3lBTUJFQWdGQ0FMSUF6OENnQUFDeUFLSUF4cUlRb2dEQ0FPYWdVZ0Rnc2lCeUFEVHdSQUlBWUVRQ0FCS0FJTURRSUxJQUJCQURvQUJBd0NDeUFGSUFwQkEyb2lDRTBFUUNBQVFRRTZBQVFNQWdzZ0IwRUJhaUVPSUFJZ0Iyb3RBQUFoQ3dKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQVNnQ0RDSU1SUVJBSUF2QVFRQk9EUUVnQzBIQ0FVa05BaUFMUWVBQlNRMERJQXRCOEFGSkRRUWdDMEgxQVVrTkJTQUFRUUE2QUFZZ0FFR0NBanNCQkNBT0lRY01DZ3NnQVMwQUVDQUxUUVJBSUFzZ0FTMEFFVTBOQ0FzZ0FVRUFOZ0lNSUFGQmdQOENPd0VRSUFCQkFEb0FCaUFBUVFJNkFBUWdBUzBBQ0NFQ0lBRkNBRGNDQkNBQUlBSkJBV282QUFVTUNRc2dCQ0FLYWlBTE9nQUFRUUVoQnlBS1FRRnFJUW9NRFFzZ0FFRUFPZ0FHSUFCQmdnSTdBUVFnRGlFSERBY0xJQUZCQVRZQ0RDQUJJQXRCSDNFMkFnUkJBQ0VIREFzTElBdEI0QUZHRFFFZ0MwSHRBVWNOQWlBQlFaOEJPZ0FSREFJTEFrQUNRQ0FMUWZBQmF3NEZBQW9LQ2dFS0N5QUJRWkFCT2dBUURBa0xJQUZCandFNkFCRU1DQXNnQVVHZ0FUb0FFQXNnQVVFQ05nSU1JQUVnQzBFUGNUWUNCRUVBSVFjTUJ3c2dBVUdBL3dJN0FSQWdBU0FCS0FJSVFRRnFJaEUyQWdnZ0FTQUJLQUlFSWdsQkJuUWlEeUFMUVQ5eElndHlJaEEyQWdSQkFDRUhJQXdnRVVjTkJnSi9JQXhCQTBZRVFDQUVJQXBxSWdkQkEyb2dDMEdBQVhJNkFBQWdCMEVDYWlBSlFUOXhRWUFCY2pvQUFDQUhJQTlCRW5aQjhBRnlPZ0FBSUFkQkFXb2dEMEVNZGtFL2NVR0FBWEk2QUFBZ0NrRUVhZ3dCQ3lBUVFmLy9BM0ZCZ0JCUEJFQWdCQ0FLYWlJSFFRSnFJQXRCZ0FGeU9nQUFJQWRCQVdvZ0NVRS9jVUdBQVhJNkFBQWdCeUFRUVlEZ0EzRkJESFpCNEFGeU9nQUFJQWdNQVFzZ0JDQUthaUlISUFsQndBRnlPZ0FBSUFkQkFXb2dDMEdBQVhJNkFBQWdDa0VDYWdzaENpQUJRUUEyQWd3Z0FVSUFOd0lFUVFFaEJ3d0dDeUFCUVFBMkFnd2dBRUVBT2dBR0lBQkJBam9BQkNBQkxRQUlJUUlnQVVJQU53SUVJQUFnQWtFQmFqb0FCUXNnQUNBS05nSUlJQUFnQnpZQ0FBd0ZDeUFJSUJGQnhPdkJBQkM0Q1FBTElBZ2dFa0hVNjhFQUVMZ0pBQXNnQ2lBRlFiVHJ3UUFRdVFrQUN5QUJRUU0yQWd3Z0FTQUxRUWR4TmdJRVFRQWhCd3dBQ3dBTElBMUI4QUZxSkFBTHV6OEJISDhqQUVId0Ftc2lDQ1FBQWtBQ1FBSkFJQVVnQmtrTkFFRi9JQVZCQVdzaUNVRUFJQVVnQ1U4YklBZEJCSEVpRnhzaUUwRUJhaUllSUJOeERRQWdDQ0FETmdLb0FpQUlJQUkyQXFRQ0lBRXRBSUJTSVFrZ0NDQUdOZ0swQWlBSUlBVTJBckFDSUFnZ0JEWUNyQUlnQ0NBQkxRRHNVVG9BeUFJZ0NDQUJLQUxZVVRZQ3hBSWdDQ0FCS0FMVVVUWUN3QUlnQ0NBQktBTEFVVFlDdkFJZ0NDQUJLQUxjVVRZQ3VBSkJBVUVESUFkQkFYRWlHaHNoRkVFQlFYd2dCMEVDY1NJYkd5RVFJQUZCN2RFQWFpRWNJQUZCNE5FQWFpRWRJQUZCZ01ZQWFpRWZJQUZCZ0RacUlSZ2dBVUdnMFFCcUlTQWdBVUdBendCcUlSVWdBVUhrMFFCcUlTRWdBVUdBRkdvaElpQUJRWUFFYWlFUklBRkJnQzFxSVNNZ0FVR0FIV29oRmdOQVFRQWhEd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFuOENRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBbEIvd0Z4RGhrQUFRSUREaUFOSFJ3SkNCc0hCaG9aR0JjVkZBVUVFeElrQ2dzZ0FVS0JnSUNBRURjQ3pGRWdBVUlBTndMRVVTQUlRY2dDYWtFQU9nQUFJQWhCd0FKcVFnQTNBd0FnQ0VJQU53TzRBaUFVSVFrTUtnc2dDQ0FJUWFRQ2FoQ0pCU0FJTFFBQVJRMGNJQUVnQ0MwQUFUWUN4RkZCQWlFSkRDa0xJQWhCQ0dvZ0NFR2tBbW9RaVFVZ0NDMEFDRVVOR3lBQklBZ3RBQWtpQlRZQ3lGRWdBU2dDeEZFaUJFRVBjVUVJUnlBRVFRaDBJQVZ5UVI5d0lBVkJJSEZ5UVFCSGNpRUZJQVJCQkhaQkNHcEJIM0VoQkVFZFFSMUJBeUFGSUFVZ0hpQUVka1Z5SUJjYkd5QUVRUTlMR3lFSkRDZ0xJQWdvQXJ3Q0lnbEJDSEloQkNBSUtBSzRBaUVGQTBBZ0NVRURUd1JBSUFFZ0JVRUJjVG9BNmxFZ0FTQUZRUUYyUVFOeElnUTZBT3RSSUFnZ0NVRURhellDdkFJZ0NDQUZRUU4yTmdLNEFrRVpJUWtDUUFKQUlBUkJBV3NPQXdBb0t3RUxJQUZCb0lLQUFUWUM1RkVnQ0VFNGFpQVZRUUJCa0FGQjJQSEpBQkN4QmlBSUtBSThJUWtnQ0NnQ09DRUZBMEFnQ1FSQUlBVkJDRG9BQUNBSlFRRnJJUWtnQlVFQmFpRUZEQUVMQ3lBSVFUQnFJQlZCa0FGQmdBSkI2UEhKQUJDeEJpQUlLQUkwSVFrZ0NDZ0NNQ0VGQTBBZ0NRUkFJQVZCQ1RvQUFDQUpRUUZySVFrZ0JVRUJhaUVGREFFTEN5QUlRU2hxSUJWQmdBSkJtQUpCK1BISkFCQ3hCaUFJS0FJc0lRa2dDQ2dDS0NFRkEwQWdDUVJBSUFWQkJ6b0FBQ0FKUVFGcklRa2dCVUVCYWlFRkRBRUxDeUFJUVNCcUlCVkJtQUpCb0FKQmlQTEpBQkN4QmlBSUtBSWtJUWtnQ0NnQ0lDRUZBMEFnQ1FSQUlBVkJDRG9BQUNBSlFRRnJJUWtnQlVFQmFpRUZEQUVGUWFEUkFDRUpBMEFnQ1VIQTBRQkdSUVJBSUFFZ0NXcEJCVG9BQUNBSlFRRnFJUWtNQVFzTElBaEJHR29nQVNBSVFiZ0NhaEF4UWY4QklROGdDQzBBR1NFRkFrQUNRQ0FJTFFBWUlnbEJBbXNPQWdBbkFRdEJBeUVMRENNTElBVWhDUXdzQ3dBTEFBdEJCQ0VKRENrTElBaEJFR29nQ0VHa0Ftb1FpUVVnQ0MwQUVBUkFJQWd0QUJFZ0NYUWdCWEloQlNBRUlRa01BUVVnQ0NBSk5nSzhBaUFJSUFVMkFyZ0NRUU1oQ1NBYkRTQU1KQXNBQ3dBTElBZ2dDQ2dDeEFJaUJVSC9BM0VpQkRZQ3hBSkJGQ0VKSUFSQmdBSkdEU1pCSVNFSklBUkJuUUpMRFNZZ0NDQUZRUUZyUVI5eElnUkJBWFJCNFAvSkFHb3ZBUUEyQXNRQ0lBZ2dCRUhBLzhrQWFpMEFBQ0lFT2dESUFrRU9RUThnQkJzaENRd21DMEVESVFrZ0FTMEE2bEZGRFNVZ0NDQUlLQUs4QWlJRVFYaHhJQU1nQ0NnQ3FBSnJJZ1VnQkVFRGRpSUpJQVVnQ1VrYklnbEJBM1JySWdvMkFyd0NJQWdvQXJnQ0lRc2dDRUdRQW1vZ0JTQUpheUFDSUFOQnJJSEtBQkNmQnlBSUlBZ3BBNUFDTndLa0FpQUlRWDhnQ25SQmYzTWdDeUFFUVFkeGRuRTJBcmdDUVJnaENTQWFSUTBsSUFoQkFEWUN4QUpCRnlFSkRDVUxRUlVoQ1NBSUtBTEVBaUlFUWY4QlN3MGtJQWdvQXJBQ0lBZ29BclFDUmdSQVFRMGhDUXdRQ3lBSVFhd0NhaUFFRU1NR0RDTUxBa0FEUUFKQUFuOENRQUpBSUFnb0FxZ0NJZ1JCQkVrTkFDQUlLQUt3QWlJS0lBZ29BclFDSWcxcklnVkJBa2tOQUNBRlFZSUNTeUFFUVE1UGNVVUVRQUpBSUFnb0Fyd0NJZ2xCRDA4RVFDQUlLQUs0QWlFRkRBRUxJQWhCcEFKcUVKWUZRZi8vQTNFZ0NYUWdDQ2dDdUFKeUlRVWdDVUVRY2lFSkN5QUlRZUFCYWlBUklBVVEyQVFnQ0NBSUtBTGdBU0lFTmdMRUFpQUlJQWtnQ0NnQzVBRWlDV3NpQ2pZQ3ZBSWdDQ0FGSUFsMklnVTJBcmdDUVJVaENTQUVRWUFDY1EwcUlBcEJEazBOQWlBS0RBTUxJQWd0QU1nQ0lRNGdDQ2dDeEFJaERDQUlLQUxBQWlFU0lBZ29BcndDSVFRZ0NDZ0N1QUloQlFOQVFRQWhEMEVCSVJsQkRDRUpJQW9nRFd0Qmd3SkpEUVFnQ0NnQ3FBSkJEa2tOQkNBRVFRNUxCSDhnQkFVZ0NFR2tBbW9RbGdWQi8vOERjU0FFZENBRmNpRUZJQVJCRUhJTElBaEIwQUZxSUJFZ0JSRFlCQ0FJS0FMVUFTSUpheUVFSUFVZ0NYWWhCVUdBQWlFTEFrQWdDQ2dDMEFFaURFR0FBbkZGQkVBZ0JFRU9Td1IvSUFRRklBaEJwQUpxRUpZRlFmLy9BM0VnQkhRZ0JYSWhCU0FFUVJCeUN5QUlRY2dCYWlBUklBVVEyQVFnQ0NnQ3lBRWhDU0FJS0FMTUFTRUtJQWhCckFKcUlBd1F3d1lnQ21zaEJDQUZJQXAySVFVZ0NVR0FBbkZGRFFFZ0NTRU1DeUFNUWY4RGNTSUtRWUFDUmdSQVFSUWhDUXdJQzBIL0FTRVBRUUFoR1NBS1FaMENTd1JBUVNFaENTQUtJUXNNQ0FzZ0RFRUJhMEVmY1NJSlFjRC95UUJxTFFBQUlRNGdDVUVCZEVIZy84a0FhaThCQUNFTUFuOGdCRUVPU3dSL0lBUUZJQWhCcEFKcUVKWUZRZi8vQTNFZ0JIUWdCWEloQlNBRVFSQnlDeUlKSUE1RkRRQWFJQVVnRG5ZaENpQUZRWDhnRG5SQmYzTnhJQXhxSVF3Z0NTQU9heUlFUVE1TEJFQWdDaUVGSUFRTUFRc2dDRUdrQW1vUWxnVkIvLzhEY1NBRWRDQUtjaUVGSUFSQkVISUxJQWhCd0FGcUlCWWdCUkRZQkNBSUtBTEVBU0lKYXlFRUlBVWdDWFloQ2lBSUtBTEFBU0lGUWY4RGNTSUpRUjFMQkVCQklpRUpJQXdoQ3lBS0lRVU1DQXNnQlVIL0FYRWlCVUVCZGlJTFFRRnJJZzFCQUNBTElBMVBHeUVPSUFsQkFYUkJvSURLQUdvdkFRQWhFaUFGUVFSSkJIOGdDZ1VnQkVFT1N3Ui9JQVFGSUFoQnBBSnFFSllGUWYvL0EzRWdCSFFnQ25JaENpQUVRUkJ5Q3lBT2F5RUVJQXBCZnlBT2RFRi9jM0VnRW1vaEVpQUtJQTUyQ3lFRlFSNGhDU0FYUVFBZ0NDZ0N0QUlpQ3lBU1NSc05CU0FTSUFnb0FyQUNJZ3BMRFFVZ0NDZ0NyQUlnQ2lBTElCSWdEQ0FURUxnRElBZ2dDeUFNYWlJTk5nSzBBZ3dCQ3lBSVFhd0NhaUFKRU1NR0lBZ29BclFDSVEwZ0NDZ0NzQUloQ2d3QUN3QUxBa0FnQ0NnQ3ZBSWlCVUVQVHdSQUlBZ29BcmdDSVFRTUFRc2dCRUVCVFFSQUlBZ29BcmdDSVFRZ0JTRUtBMEFDUUFKQUlCRWdCRUgvQjNGQkFYUnFMZ0VBSWdWQkFFZ0VRRUVMSVFrZ0NrRUxTUTBDQTBBZ0JDQUpRUUZyZGtFQmNTQUZRWDl6YWlJRlFiOEVTdzB5SUNJZ0JVRUJkR291QVFBaUJVRUFUZzBDSUFvZ0NVRUJhaUlKVHcwQUN3d0NDeUFGUVlBRVNTQUtJQVZCQ1haSmNnMEJDeUFLSVFVTUF3c2dDRUc0QVdvZ0NFR2tBbW9RaVFVZ0NDMEF1QUZGQkVBZ0NDQUtOZ0s4QWlBSUlBUTJBcmdDUVF3aEN5QVFJUVVNSWdzZ0NDMEF1UUVnQ25RZ0JISWhCQ0FLUVFkSklBcEJDR29pQlNFS0RRQUxEQUVMSUFoQnBBSnFFSllGUWYvL0EzRWdCWFFnQ0NnQ3VBSnlJUVFnQlVFUWNpRUZDd0ovSUJFZ0JFSC9CM0ZCQVhScUxnRUFJZ2xCQUU0RVFDQUpRZjhEY1NFS0lBbEJDWFlNQVFzZ0NFR3dBV29nRVNBSklBUVF0QVFnQ0NnQ3NBRWhDaUFJS0FLMEFRc2hDU0FJSUFvMkFzUUNJQWdnQlNBSmF6WUN2QUlnQ0NBRUlBbDJOZ0s0QWtFTklRa01LQXNnQ0VHa0Ftb1FsZ1ZCLy84RGNTQUtkQ0FGY2lFRklBZ29Bc1FDSVFRZ0NrRVFjZ3NoRFNBSVFkZ0JhaUFSSUFVUTJBUWdDQ0FOSUFnb0F0d0JJZ3ByTmdLOEFpQUlJQVVnQ25ZMkFyZ0NJQWdvQXRnQklRVWdDRUdzQW1vZ0JCRERCaUFGUVlBQ2NRUkFJQWdnQlRZQ3hBSU1Kd1VnQ0VHc0Ftb2dCUkREQmd3Q0N3QUxDeUFNSVFzTElBZ2dEam9BeUFJZ0NDQUxOZ0xFQWlBSUlCSTJBc0FDSUFnZ0JEWUN2QUlnQ0NBRk5nSzRBaUFaRFNNTUhBc0RRQUpBQWtBQ1FBSkFBa0FnQ0NnQ3hBSWlDeUFCTHdIa1VTSUVJQUV2QWVaUmFpSUZUd1JBUVJvaENTQUZJQXRIRFNrZ0NFR1lBV29nQkNBVlFhQUNRZHlBeWdBUXNnWWdDQ2dDbUFFZ0NDZ0NuQUVnQVNBQkx3SGtVVUgvQTNGQjdJREtBQkNzQnlBQkx3SGtVU0VFSUFoQmtBRnFJQUV2QWVaUklnVkJIM0VnSUVFZ1FmeUF5Z0FRc2dZZ0JDQUZha0gvQTNFaUJTQUVRZjhEY1NJRVNRMEJJQWdvQXBBQklBZ29BcFFCSUFFZ0JHb2dCU0FFYTBHY2djb0FFS3dISUFFZ0FTMEE2MUZCQVdzNkFPdFJJQWhCaUFGcUlBRWdDRUc0QW1vUU1TQUlMUUNJQVNJRlFRTkhEUU5CQ2lFSkRBZ0xJQWdvQXJ3Q0lnbEJEMDhFUUNBSUtBSzRBaUVFREFRTElBZ29BcWdDUVFGTERRRWdDQ2dDdUFJaEJDQUpJUW9EUUFKQUFrQWdHQ0FFUWY4SGNVRUJkR291QVFBaUJVRUFTQVJBUVFzaENTQUtRUXRKRFFJRFFDQUVJQWxCQVd0MlFRRnhJQVZCZjNOcUlnVkJ2d1JMRFRBZ0h5QUZRUUYwYWk0QkFDSUZRUUJPRFFJZ0NpQUpRUUZxSWdsUERRQUxEQUlMSUFWQmdBUkpJQW9nQlVFSmRrbHlEUUVMSUFvaENRd0ZDeUFJUVlBQmFpQUlRYVFDYWhDSkJTQUlMUUNBQVVVRVFDQUlJQW8yQXJ3Q0lBZ2dCRFlDdUFKQkNpRUxJQkFoQlF3Z0N5QUlMUUNCQVNBS2RDQUVjaUVFSUFwQkIwa2dDa0VJYWlJSklRb05BQXNNQXdzZ0JDQUZRWXlCeWdBUXR3a0FDeUFJUWFRQ2FoQ1dCVUgvL3dOeElBbDBJQWdvQXJnQ2NpRUVJQWxCRUhJaENRd0JDeUFJTFFDSkFTRUpEQUVMSUFnZ0NRSi9JQmdnQkVIL0IzRkJBWFJxTGdFQUlncEJBRTRFUUNBS1FmOERjU0VGSUFwQkNYWU1BUXNnQ0VINEFHb2dHQ0FLSUFRUXRBUWdDQ2dDZUNFRklBZ29BbndMSWdwck5nSzhBaUFJSUFRZ0NuWTJBcmdDSUFnZ0JUWUN3QUlnQlVFUVR3UkFJQXRGQkVCQklDRUpJQVZCRUVZTkpnc2dDRUdDaGh3MkFPQUNJQWdnQ0VIZ0Ftb2dCVUVEY1dvdEFBQTZBTWdDUVFzaENRd2xDeUFCSUF0Qi93TnhhaUFGT2dBQUlBZ2dDMEVCYWpZQ3hBSkJBQ0VGQ3lBRlFRRnJEZ0lqQndBTEFBc0RRQUpBQWtBZ0NDZ0N4QUlpQ2lBQkx3SG9VVThFUUNBQlFSTTdBZWhSSUFoQjhBQnFJQUVnQ0VHNEFtb1FNU0FJTFFCd0lnVkJBMGNOQVVFSklRa01CQXNnQ0NnQ3ZBSWlDVUVJY2lFRUlBZ29BcmdDSVFVRFFDQUpRUU5QQkVBZ0NDQUpRUU5yTmdLOEFpQUlJQVZCQTNZMkFyZ0NJQXBCRWtzTkJpQUtRWUtEeWdCcUxRQUFJZ2xCRTA4TkJ5QUpJQnhxSUFWQkIzRTZBQUFnQ0NBS1FRRnFOZ0xFQWtFQUlRVU1Bd3NnQ0VIb0FHb2dDRUdrQW1vUWlRVWdDQzBBYUFSQUlBZ3RBR2tnQ1hRZ0JYSWhCU0FFSVFrTUFRc0xJQWdnQ1RZQ3ZBSWdDQ0FGTmdLNEFrRUpJUXNnRUNFRkRCb0xJQWd0QUhFaENRc2dCVUVCYXc0Q0lnY0FDd0FMUWY4QklROE1HUXNnQ2tFVFFaaUR5Z0FReGdRQUN5QUpRUk5CcUlQS0FCREdCQUFMUVJRaENTQUlLQUxFQWtVTkhVRUhJUWtnQ0NnQ3NBSWdDQ2dDdEFKSERSMUJCaUVKREFnTElBaEJBRFlDeEFJZ0NDQUlLQUs4QWlJRVFYaHhOZ0s4QWlBSUlBZ29BcmdDSUFSQkIzRjJOZ0s0QWtFRklRa01IQXRCQ2d3QkMwRUpDeUVMSUFraEJRd1BDMEVFSUFnb0FzUUNJZ29nQ2tFRVRSc2hDd05BUVJnaENTQUtJQXRHRFJrQ1FBSkFJQWdvQXJ3Q0lnbEZCRUFnQ0VHWUFtb2dDRUdrQW1vUWlRVWdDQzBBbUFKRkRRSWdDQzBBbVFJZ0FTZ0N6RkZCQ0hSeUlRa01BUXNnQ1VFSWNpRUVJQWdvQXJnQ0lRVURRQ0FKUVFoUEJFQWdDQ0FKUVFock5nSzhBaUFJSUFWQkNIWTJBcmdDSUFWQi93RnhJQUVvQXN4UlFRaDBjaUVKREFJTElBaEJvQUpxSUFoQnBBSnFFSWtGSUFndEFLQUNCRUFnQ0MwQW9RSWdDWFFnQlhJaEJTQUVJUWtNQVFzTElBZ2dDVFlDdkFJZ0NDQUZOZ0s0QWd3QkN5QUJJQWsyQXN4UklBZ2dDa0VCYWlJS05nTEVBZ3dCQ3d0QkZ5RUxJQkFoQlF3T0MwRWVJUWtnRjBFQUlBZ29BclFDSWdRZ0NDZ0N3QUlpQlVrYkRSY2dDQ2dDckFJZ0JTQUlLQUt3QWlJS1N3MFhBa0FnQ2lBSUtBTEVBaUlKSUFScUlneFBCRUFnRXlBRUlBVnJjU0lOSUFSSklBMGdCR3NnQ1U5eURRRUxRUk5CRENBSkd5RUpEQmdMSUFvZ0JDQUZJQWtnRXhDNEF5QUlJQXcyQXJRQ0RCWUxJQWdvQXF3Q0lRd2dDQ2dDd0FJaERTQUlLQUxFQWlFRklBZ29BclFDSVFrZ0NDZ0NzQUloQkFOQUlBUWdDVWNFUUNBTUlBUWdDU0FOYXlBVGNTQUpJQVVnQkNBSmF5SUtJQVVnQ2trYklnc2dFeEJFSUFrZ0Myb2hDU0FGSUFwTElBVWdDMnNoQlEwQkRCWUxDeUFJSUFVMkFzUUNJQWdnQkRZQ3RBSkJFeUVKREFFTElBZ29BckFDSUFnb0FyUUNSZ1JBUVJJaENRd0JDeUFJUWF3Q2FpQUlLQUxBQWhEREJpQUlLQUs4QWlFRUlBZ2dDQ2dDeEFKQkFXc2lCVFlDeEFKQkVVRUdJQVFiUVFZZ0JSc2hDUXdWQzBFQ0lROE1EUXNnQ0NnQ3ZBSWlDVUVJY2lFRUlBZ29BcmdDSVFVQ1FBTkFJQWxCQjAwRVFDQUlRWWdDYWlBSVFhUUNhaENKQlNBSUxRQ0lBa1VOQWlBSUxRQ0pBaUFKZENBRmNpRUZJQVFoQ1F3QkN3c2dDQ0FGUWY4QmNUWUN3QUlnQ0NBSlFRaHJOZ0s4QWlBSUlBVkJDSFkyQXJnQ1FSSWhDUXdVQ3lBSUlBazJBcndDSUFnZ0JUWUN1QUpCRVNFTElCQWhCUXdKQ3lBSUtBSzRBaUVGSUFnb0Fyd0NJUWtnQ0MwQXlBSWhCQUpBQTBBZ0JDQUpTd1JBSUFoQmdBSnFJQWhCcEFKcUVJa0ZJQWd0QUlBQ1JRMENJQWd0QUlFQ0lBbDBJQVZ5SVFVZ0NVRUlhaUVKREFFTEN5QUlJQWtnQkdzMkFyd0NJQWdnQlNBRWRqWUN1QUlnQ0NBSUtBTEFBaUFGUVg4Z0JIUkJmM054YWpZQ3dBSkJGaUVKREJNTElBZ2dDVFlDdkFJZ0NDQUZOZ0s0QWtFUUlRc2dFQ0VGREFnTEFrQWdDQ2dDdkFJaUNVRVBUd1JBSUFnb0FyZ0NJUVFNQVFzZ0NDZ0NxQUpCQVUwRVFDQUlLQUs0QWlFRUlBa2hDZ05BQWtBQ1FDQVdJQVJCL3dkeFFRRjBhaTRCQUNJRlFRQklCRUJCQ3lFSklBcEJDMGtOQWdOQUlBUWdDVUVCYTNaQkFYRWdCVUYvYzJvaUJVRy9CRXNOR3lBaklBVkJBWFJxTGdFQUlnVkJBRTROQWlBS0lBbEJBV29pQ1U4TkFBc01BZ3NnQlVHQUJFa2dDaUFGUVFsMlNYSU5BUXNnQ2lFSkRBTUxJQWhCK0FGcUlBaEJwQUpxRUlrRklBZ3RBUGdCQkVBZ0NDMEErUUVnQ25RZ0JISWhCQ0FLUVFkSklBcEJDR29pQ1NFS1JRMEREQUVMQ3lBSUlBbzJBcndDSUFnZ0JEWUN1QUpCRHlFTElCQWhCUXdKQ3lBSVFhUUNhaENXQlVILy93TnhJQWwwSUFnb0FyZ0NjaUVFSUFsQkVISWhDUXNnQ0NBSkFuOGdGaUFFUWY4SGNVRUJkR291QVFBaUNrRUFUZ1JBSUFwQi93TnhJUVVnQ2tFSmRnd0JDeUFJUWZBQmFpQVdJQW9nQkJDMEJDQUlLQUx3QVNFRklBZ29BdlFCQ3lJS2F6WUN2QUlnQ0NBRUlBcDJOZ0s0QWtFaUlRa2dCVUVkU3cwUklBZ2dCVUVCZEVHZ2dNb0FhaThCQURZQ3dBSWdDQ0FGUVFGMlFmOEFjU0lFUVFGcklnbEJBQ0FFSUFsUEd6b0F5QUpCRmtFUUlBVkJCRWtiSVFrTUVRc2dDQ2dDdUFJaEJTQUlLQUs4QWlFSklBZ3RBTWdDSVFRQ1FBTkFJQVFnQ1VzRVFDQUlRZWdCYWlBSVFhUUNhaENKQlNBSUxRRG9BVVVOQWlBSUxRRHBBU0FKZENBRmNpRUZJQWxCQ0dvaENRd0JDd3NnQ0NBSklBUnJOZ0s4QWlBSUlBVWdCSFkyQXJnQ0lBZ2dDQ2dDeEFJZ0JVRi9JQVIwUVg5emNXbzJBc1FDUVE4aENRd1JDeUFJSUFrMkFyd0NJQWdnQlRZQ3VBSkJEaUVMSUJBaEJRd0dDeUFJS0FLNEFpRUZJQWdvQXJ3Q0lRa2dDQzBBeUFJaENnSkFBMEFDUUNBSklBcFBCRUFnQ0NBSklBcHJOZ0s4QWlBSUlBVWdDblkyQXJnQ0lBaEJDellDNkFJZ0NFS0RnSUNBTURjQzRBSWdDRUhnQW1vZ0NDZ0N3QUlpQzBFQ2NVRUNkR29vQWdBaERFRUFJUVFnQ0NnQ3hBSWhDU0FMUVJCR0JFQWdBU0FKUVFGclFmOERjV290QUFBaEJBc2dDRUdvQVdvZ0NVSC9BM0VnQ1NBTUlBVkJmeUFLZEVGL2MzRnFhaUlLUWY4RGNTQUJRWUFFUWJpRHlnQVFnd1lnQ0NnQ3JBRWhDU0FJS0FLb0FTRUZBMEFnQ1VVTkFpQUZJQVE2QUFBZ0NVRUJheUVKSUFWQkFXb2hCUXdBQ3dBTElBaEJvQUZxSUFoQnBBSnFFSWtGSUFndEFLQUJSUTBDSUFndEFLRUJJQWwwSUFWeUlRVWdDVUVJYWlFSkRBRUxDeUFJSUFvMkFzUUNRUW9oQ1F3UUN5QUlJQWsyQXJ3Q0lBZ2dCVFlDdUFKQkN5RUxJQkFoQlF3RkMwRURJQWdvQXNRQ0lnb2dDa0VEVFJzaEN5QUlLQUs0QWlFRklBZ29BcndDSVFrQ1FBTkFJQW9nQzBjRVFDQUlRUVEyQXVnQ0lBaENoWUNBZ05BQU53TGdBaUFJUWVBQ2FpQUtRUUowYWlnQ0FDRUVBMEFnQkNBSlN3UkFJQWhCNEFCcUlBaEJwQUpxRUlrRklBZ3RBR0JGRFFRZ0NDMEFZU0FKZENBRmNpRUZJQWxCQ0dvaENRd0JDd3NnSVNBS1FRRjBJZ3hxSUF4Qi9JTEtBR292QVFBZ0JVRi9JQVIwUVg5emNXbzdBUUFnQ2tFQmFpRUtJQWtnQkdzaENTQUZJQVIySVFVTUFRc0xJQWdnQlRZQ3VBSWdDQ0FKTmdLOEFrRUFJUWtEUUNBSlFSTkdSUVJBSUFrZ0hHcEJBRG9BQUNBSlFRRnFJUWtNQVFzTElBaEJBRFlDeEFKQkcwRUpRUnNnQVM4QjVsRkJIMGtiSUFFdkFlUlJRWjhDVHhzaENRd1BDeUFJSUFrMkFyd0NJQWdnQlRZQ3VBSWdDQ0FLTmdMRUFrRUlJUWtnRzBVTkNRd0ZDeUFJS0FLb0FpSUVEUUVMSUFraEN5QVFJUVVNQWdzZ0NDZ0NwQUloQ1NBSVFkZ0FhaUFJS0FLMEFpSUtJQW9nQ0NnQ3hBSWlDeUFFSUFnb0FyQUNJZ3dnQ21zaUJTQUVJQVZKR3lJRklBVWdDMHNiSWdWcUlnb2dDQ2dDckFJZ0RFSE1nc29BRUlNR0lBZ29BbGdnQ0NnQ1hDQUpJQVZCM0lMS0FCQ3NCeUFJSUFvMkFyUUNJQWhCMEFCcUlBVWdDU0FFUWV5Q3lnQVFud2NnQ0NBTElBVnJOZ0xFQWlBSUlBZ3BBMUEzQXFRQ1FRWWhDUXdMQzBFRUlBZ29Bc1FDSWdvZ0NrRUVUUnNoQ3dOQUlBb2dDMFlFUUNBSUlBRXZBZUJSSWdRMkFzUUNRUjhoQ1NBQkx3SGlVU0FFYzBILy93TkhEUXhCRkNFSklBUkZEUXhCRVVFR0lBZ29BcndDR3lFSkRBd0xBa0FDUUFKQUlBZ29BcndDSWdrRVFDQUpRUWh5SVFRZ0NDZ0N1QUloQlFOQUlBbEJDRThFUUNBS0lCMXFJQVU2QUFBZ0NDQUpRUWhyTmdLOEFpQUlJQVZCQ0hZMkFyZ0NEQVVMSUFoQnlBQnFJQWhCcEFKcUVJa0ZJQWd0QUVnRVFDQUlMUUJKSUFsMElBVnlJUVVnQkNFSkRBRUxDeUFJSUFrMkFyd0NJQWdnQlRZQ3VBSU1BUXNnQ0VGQWF5QUlRYVFDYWhDSkJTQUlMUUJBRFFFTFFRVWhDeUFRSVFVTUF3c2dDaUFkYWlBSUxRQkJPZ0FBQ3lBSUlBcEJBV29pQ2pZQ3hBSU1BQXNBQ3lBRlFmOEJjU0lDUVFGSERRRWdDeUVKQzBFQUlSRWdDQ2dDc0FJZ0NDZ0N0QUpHRFFKQkFTRVBEQVFMSUFKQi9BRkhCRUFnQlNFUElBc2hDUXdCQzBFQUlSRWdDeUVKSUFVaER3d0RDeUFJSUFnb0Fyd0NJZ0lnQXlBSUtBS29BbXNpQkNBQ1FRTjJJZ0lnQWlBRVN4c2lFVUVEZEdzMkFyd0NEQUlMUVFGQkFpQUpRZjhCY1VFWFJoc2hEd3dCQzBIOEFTRVBRUUFoRVFzZ0FTQUpPZ0NBVWlBQklBZ29BcndDSWdJMkFzQlJJQUVnQ0NrRHdBSTNBdFJSSUFFZ0NDMEF5QUk2QU94UklBRWdDQ2dDdUFKQmZ5QUNkRUYvYzNFMkF0eFJJQWdvQXJRQ0lRVUNRQ0FIUVFseFJTQUhRVDlMY2tVZ0Q4QkJBRTV4UlFSQUlBVWdCbXNoRWd3QkN5QUZJQVpQQkVBZ0NDZ0NzQUlpQWlBRlR3UkFJQUVvQXRCUklnSkJFSFloRENBQ1FmLy9BM0VpRUVIQXJRRnNJUmhCQUNFSFFRQWhDMEVBSVFSQkFDRUtRUUFoRFVFQUlSUkJBQ0VPUVFBaEFpQUlLQUtzQWlBR2FpSVdJUk1nQlNBR2F5SVNRWHh4SWhVZ0ZVSEFyUUZ3SWhsckloY2hCZ05BQWtBZ0JrSEFyUUZQQkVCQkFDRUZBMEFnQlVIQXJRRkdEUUlnQlNBVGFpRUpJQVZCQkdvaEJTQUNJQWt0QUFCcUlnSWdEbW9oRGlBS0lBbEJBMm90QUFCcUlnb2dCMm9oQnlBTklBbEJBbW90QUFCcUlnMGdDMm9oQ3lBVUlBbEJBV290QUFCcUloUWdCR29oQkF3QUN3QUxJQmNnRldzaEJTQVdJQmRxSVFrRFFDQUZCRUFnQlVFRWFpRUZJQUlnQ1MwQUFHb2lBaUFPYWlFT0lBb2dDVUVEYWkwQUFHb2lDaUFIYWlFSElBMGdDVUVDYWkwQUFHb2lEU0FMYWlFTElCUWdDVUVCYWkwQUFHb2lGQ0FFYWlFRUlBbEJCR29oQ1F3QkN3c2dDQ0FDUWZIL0EzQTJBdEFDSUFnZ0RrSHgvd053UVFKME5nTGdBaUFJSUJSQjhmOERjQ0lDTmdMVUFpQUlJQVJCOGY4RGNFRUNkQ0FDYTBIeC93TnFOZ0xrQWlBSUlBcEI4ZjhEY0NJQ05nTGNBaUFJUWZIL0F5QUNhMEVEYkNBSFFmSC9BM0JCQW5ScU5nTHNBaUFJSUExQjhmOERjQ0lDTmdMWUFpQUlJQXRCOGY4RGNFRUNkQ0FDUVFGMGEwSGkvd2RxTmdMb0FrRUFJUWtnRUNFRkEwQWdDVUVRUmdSQUlBd2dFQ0FaYkdwQjhmOERjQ0VKUVFBaEJ3TkFJQWRCRUVaRkJFQWdDRUhnQW1vZ0Iyb29BZ0FnQ1dvaENTQUhRUVJxSVFjTUFRc0xJQkpCQTNFaEJ5QVZJQlpxSVFzRFFDQUhCRUFnQjBFQmF5RUhJQVVnQ3kwQUFHb2lCU0FKYWlFSklBdEJBV29oQ3d3QkN3c2dBU0FGUWZIL0EzQWdDVUh4L3dOd1FSQjBjaUlDTmdMUVVTQVBRZjhCY1EwR1FYNUJBQ0FDSUFFb0FzeFJSeHRCQUNBYUd5RVBEQVlGSUFoQjBBSnFJQWxxS0FJQUlBVnFJUVVnQ1VFRWFpRUpEQUVMQUFzQUN5QUhRZkgvQTNBaEJ5QUxRZkgvQTNBaEN5QUVRZkgvQTNBaEJDQU9RZkgvQTNBaERpQUtRZkgvQTNBaENpQU5RZkgvQTNBaERTQVVRZkgvQTNBaEZDQUNRZkgvQTNBaEFpQUdRY0N0QVdzaEJpQVRRY0N0QVdvaEV5QU1JQmhxUWZIL0EzQWhEQXdBQ3dBTElBVWdBa0c4Z2NvQUVMZ0pBQXNnQmlBRlFieUJ5Z0FRdHdrQUN5QUFJQTg2QUFRZ0FDQVNOZ0lJSUFBZ0F5QVJJQWdvQXFnQ2FtczJBZ0FNQlFzZ0NFRUFOZ0xFQWtFSUlRa01BZ3NnQ0NBRk5nTEVBaUFJSUFrMkFyUUNDMEVNSVFrTUFBc0FDeUFBUVFBMkFnZ2dBRUVBTmdJQUlBQkIvUUU2QUFRTElBaEI4QUpxSkFBUEN5QUZRY0FFUWNqeHlRQVF4Z1FBQy82MkFnUmJmd1YrRW53SmZTTUFRZkFNYXlJTEpBQWdBaWdDQkNFUElBSW9BZ2doRWlNQVFaQUhheUlJSkFBZ0NFRUJOZ0ljSUFoQ0VqY0NGQ0FJUWZTcnlRQTJBaEFnQ0NBU05nSU1JQWdnRHpZQ0NDQUlRY0FGYWlJU0lBaEJDR29RcVFJZ0MwSElBR29pV0FKL0FrQWdDQ2dDd0FWQkEwY05BQ0FJS0FMRUJTRVBJQWdvQXNnRklVUWdDQ2dDekFVaEtDQUlLQUxRQlNFcElBZ29BdFFGSVNvZ0NDZ0MyQVVoSWlBSVFRUkJCRUVZUWZTc3lRQVFtZ1VnQ0VHc0JHb2hXU0FJUWRnRmFpRkxJQWhCeUFGcVFRRnlJVjhnQ0VIVkJtb2hXaUFJUWZRRmFpRTJJQWhCeEFScUlUZ2dDRUhSQldvaFlDQUlRZEFGYWlGRklBaEI1QVZxSVRrZ0NFSDhCbW9oV3lBSVFla0dhaUZoSUFoQjJRWnFJVVlnQ0VITUJtb2hNQ0FJUWZ3RmFpRTdJQWhCNlFWcUlVd2dDRUhRQm1vaFBDQUlRZHdFYWlFOUlBaEJ5UVJxSVUwZ0NFSDhBMm9oUGlBSVFla0RhaUZPSUFoQjVBQnFJVDhnQ0VISUFHb2hUeUFJUWVBQWFpRUhJQWhCNUFOcUlSY2dDRUhNQTJvaFVDQUlRY1FEYWlGUklBaEI2QU5xSVVjZ0VrRUVjaUVhSUFoQnVBUnFJVndnQ0VHa0Ftb2hVaUFJUWV3RmFpRlRJQWhCekFGcUlTQWdDRUhJQldvaE9pQUlRYVFFYWlFaElBaEJ6QVZxSVYwZ0NDZ0NCQ0ZBSUFnb0FnQWhRU0FJUWVNR2FpRXJJQWhCNXdacUlWUWdDRUgzQm1vaFNDQUlRZmNGYWlFdElBaEI0d1ZxSVM0Q1FBTkFJRVFoRkFKL0FrQUNmd0pBQWtBRFFDQUlJQ0kyQXJRRUlBZ2dLallDc0FRZ0NDQXBOZ0tzQkNBSUlDZzJBcWdFSUFnZ0ZEWUNwQVFnQ0NBUE5nS2dCQ0FJUWNBRmFpQUlRYUFFYWhDUEFpQUlMUURZQlNJU1FUdEhCRUJCQWlBU1FUbHJJaElnRWtFQ1R4dEJBV3NPQWdVREFnc2dGQ0FJS0FMRUJTSVNSd1JBSUFnb0F0UUZJU0lnQ0NnQzBBVWhLaUFJS0FMTUJTRXBJQWdvQXNnRklTZ2dDQ2dDd0FVaER5QVNJUlFNQVFzTElCdEJnSDV4UVFoeUlSc2dEeUVTUVFFTUFnc2dDQ2dDd0FVaEVpQUpJU0lnRGlFcUlBb2hLU0FaSVNnZ0V5RVVRUUFNQVFzZ0NDZ0MyQVVoR3lBSUtBTFVCU0VpSUFnb0F0QUZJU29nQ0NnQ3pBVWhLU0FJS0FMSUJTRW9JQWdvQXNRRklSUWdDQ2dDd0FVaEVrRUNDeUVRUVFFaEdTQUlRU3hxSVI0Z0NFRXdhaUVjSUFoQk9Hb2hIeUFvSVF3Z0ZDRU5JQ2toQ2lBcUlTTWdJaUVKSUJzaERpQUlRVFJxREFFTElBZ2dJallDaEFFZ0NDQXFOZ0tBQVNBSUlDazJBbndnQ0NBb05nSjRJQWdnRkRZQ2RDQUlJQTgyQW5BZ0NFSEFCV29pREVIQ25ja0FRUUlnQ0VId0FHb1F2UUlnQ0VISUEyb2lTU0E2UVFocUloSXBBZ0EzQXdBZ0NDQTZLUUlBTndQQUF5QUlLQUxZQlNFSklBZ29Bc1FGSVJrQ2Z3SkFBa0FDUUNBSUFuOENRQUpBSUFnb0FzQUZJaEJCQTBZRVFDQWhJQWdwQThBRE53SUFJQ0ZCQ0dvZ1NTa0RBRGNDQUNBSUlCazJBcUFFSUFnZ0NUWUN0QVFnRENBSVFhQUVhaENwQWlCSklCSXBBZ0EzQXdBZ0NDQTZLUUlBTndQQUF5QUlLQUxZQlNFSklBZ29Bc1FGSVJrZ0NDZ0N3QVVpRUVFRFJnMEJDeUE4SUVrcEF3QTNBd0FnQ0NBSUtRUEFBemNEeUFZZ0NDZ0MzQVVoRGlBSVFhQUJhaUE4S1FNQU53TUFJQWdnQ0NrRHlBWTNBNWdCREFFTElBaEJ5QUpxSUVrcEF3QWlaVGNEQUNBSUlBZ3BBOEFESW1JM0E4QUNJQ0FnWWpjQ0FDQWdRUWhxSUdVM0FnQWdDQ0FaTmdMSUFTQUlJQWsyQXR3QklBaEJ3QVZxSUFoQnlBRnFFRDRDUUNBSUtBTG9CU0lKUVlDQWdJQjRSZ1JBSUZ3Z1N5a0RBQ0pqTndNQUlBaEJzQVJxSUVVcEF3QWlaRGNEQUNBSVFhZ0VhaUE2S1FNQUltVTNBd0FnQ0NBSUtRUEFCU0ppTndPZ0JDQlJRUmhxSUdNM0FnQWdVVUVRYWlCa053SUFJRkZCQ0dvZ1pUY0NBQ0JSSUdJM0FnQWdDQ2dDeUFNaEdTQUlLQUxFQXlFSkRBRUxJQWhCb0FScUlBaEJ3QVZxSWhKQktQd0tBQUFnVWtFWWFpQlRRUmhxS0FJQU5nSUFJRkpCRUdvZ1UwRVFhaWtDQURjQ0FDQlNRUWhxSUZOQkNHb3BBZ0EzQWdBZ1VpQlRLUUlBTndJQUlBaEIrQUpxSUFoQnFBUnFLUU1BTndNQUlBaEJnQU5xSUFoQnNBUnFLUU1BTndNQUlBaEJtQUpxSUZ4QkNHb3BBd0EzQXdBZ0NDQUlLUU9nQkRjRDhBSWdDQ0JjS1FNQU53T1FBaUFJSUFrMkFxQUNJQkpCbXI3SkFFRUNJQWhCOEFKcUVOOEJJQWdvQXVBRklRNGdDQ2tDMkFVaFpTQUlLUUxRQlNGaklBZ3BBc2dGSVdJZ0NDZ0N4QVVoQ1FKQUFrQWdDQ2dDd0FVaUVrVUVRQ0JpUWlDSXB5RVNJR0tuSVJrTUFRc2dDQ0JqTndLd0JDQUlJR0kzQXFnRUlBZ2dDVFlDcEFRZ0NDQVNOZ0tnQkNBSVFjQUZhaUFJUWFBRWFoQ3BBaUFJS1FMVUJTRmlJQWdwQXN3RklXTWdDQ2dDeUFVaEVpQUlLQUxFQlNFWklBZ29Bc0FGSWdsQkEwY0VRQ0FJS0FMY0JTRU9JR0loWlF3QkN5QVpEUUVnWTZjaEdTQVNJUWtnWTBJZ2lLY2hFaUJpSVdNTElBZ2dEallDNEFNZ0NDQmxOd0xZQXlBSUlHTTNBdEFESUFnZ0NUWUN4QU1nQ0NBWnJTQVNyVUlnaG9RM0FzZ0RJQWhCa0FKcUVPb0hEQUVMSUFoQndBSnFJQWhCa0FKcUloQkJNUHdLQUFBZ0NDQmlOd0xBQmlBSUlHTTNBcmdHSUFnZ0VqWUN0QVlnQ0NBWk5nS3dCaUFJUWNnR2FpSUtJQkJCODRET0FFRUJRY2FkeVFCQkJSQ1BCU0FJS0FMTUJpRUpBa0FDUUFKQUlBZ29Bc2dHSWc1Qm40Q0FnSGhIRFFBZ0NFSEFCV29pRENBSktBSUFJQWxCQ0dvcEF3QVF2QVFDUUNBSUtBTEFCVUVCUmcwQUlBZ29Bc2dGSVI4Z0NpQVFRZVNBemdCQkFVSExuY2tBUVFZUWp3VWdDQ2dDekFZaENTQUlLQUxJQmlJT1FaK0FnSUI0UncwQklBd2dDU2dDQUNBSlFRaHFLUU1BRUx3RUlBZ29Bc0FGUVFGR0RRQWdDQ2dDeUFVaEl5QUtJQkJCMFozSkFFRURRWVhTeVFCQkVCQ1BCU0FJS0FMTUJpRUpJQWdvQXNnR0lnNUJuNENBZ0hoSERRRWdEQ0FKS0FJQUlBbEJDR29wQXdBUXZBUWdDQ2dDd0FWQkFVWU5BQ0FJS0FMSUJTRU5JQXdnRUVHMjFjb0FRUUpCc003S0FFRUtFSThGSUFnb0FzUUZJUWtnQ0NnQ3dBVWlEa0dmZ0lDQWVFY0VRQ0FKUVFoMklSQWdDQ2dDMEFVaEhpQUlLQUxNQlNFY0lBZ29Bc2dGSVFvTUF3c2dDRUhJQm1vZ0NSQzVCQ0FJS0FMUUJpRUtJQWdvQXN3R0lRd2dDQ2dDeUFZaURrR2ZnSUNBZUVjRVFDQU1RUWgySVJBZ0NDZ0MyQVloSGlBSUtBTFVCaUVjSUF3aENRd0RDeUFLUVFOcklSTkJnSUNBZ0hnaERrRVlJUXBCbjU3SkFDRUpRYzhrSVJBQ2Z3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQVREZ2dGQVF3TUJnd0VBQXdMSUF3dEFBQkJ4QUJIRFFzZ0RDMEFBVUhsQUVjTkN5QU1MUUFDUWZZQVJ3MExJQXd0QUFOQjZRQkhEUXNnREMwQUJFSGpBRWNOQ3lBTUxRQUZRZVVBUncwTEFrQUNRQUpBSUF3dEFBWWlFMEhEQUdzT0JRSU9EZzRCQUFzZ0UwSFNBRWNORFNBTUxRQUhRY2NBUncwTklBd3RBQWhCd2dCSERRMGdEQzBBQ1VIQkFFY05EUXdKQ3lBTUxRQUhRZklBUncwTUlBd3RBQWhCNFFCSERRd2dEQzBBQ1VINUFFWU5BZ3dNQ3lBTUxRQUhRYzBBUncwTElBd3RBQWhCMlFCSERRc2dEQzBBQ1VITEFFWU5Cd3dMQ3dKQUFrQWdEQzBBQUNJVFFjTUFhdzRGQXd3TURBRUFDeUFUUWRJQVJ3MExJQXd0QUFGQnh3QkhEUXNnREMwQUFrSENBRWNOQ3lBTUxRQURRY0VBUmcwSERBc0xJQXd0QUFGQjhnQkhEUW9nREMwQUFrSGhBRWNOQ2lBTUxRQURRZmtBUncwS0MwRUJEQVlMSUF3dEFBRkJ6UUJIRFFnZ0RDMEFBa0haQUVjTkNDQU1MUUFEUWNzQVJnMEVEQWdMSUF3dEFBQkJ4QUJIRFFjZ0RDMEFBVUhsQUVjTkJ5QU1MUUFDUWZZQVJ3MEhJQXd0QUFOQjZRQkhEUWNnREMwQUJFSGpBRWNOQnlBTUxRQUZRZVVBUncwSElBd3RBQVpCMGdCSERRY2dEQzBBQjBISEFFY05CeUFNTFFBSVFjSUFSdzBIREFJTElBd3RBQUJCMGdCSERRWWdEQzBBQVVISEFFY05CaUFNTFFBQ1FjSUFSZzBCREFZTElBd3RBQUJCMEFCSERRVWdEQzBBQVVIaEFFY05CU0FNTFFBQ1FmUUFSdzBGSUF3dEFBTkI5QUJIRFFVZ0RDMEFCRUhsQUVjTkJTQU1MUUFGUWZJQVJ3MEZJQXd0QUFaQjdnQkhEUVVnQ0VIQUJXcEI3WjNKQUVFeUVLc0VJQWdvQXNBRklnbEJDSFloRUNBSUtBTElCU0VjSUFnb0FzUUZJUXBCaVlDQWdIZ2hEZ3dGQzBFRERBRUxRUVFMSVFrZ0NFSElCbW9nQ0VHUUFtcEI0b0RPQUVFQlFkYlV5UUJCQmhDUEJRSkFBa0FDUUNBSUtBTElCa0dmZ0lDQWVFY0VRRUdHZ0lDQWVDRU9RUUFoRUNBU0lBMGdIMndnQ1d4QkIycEJBM1lnSTJ3aURFa05BaUFJUWNBRmFpQUlRYkFHYWlJSklBd1EwQVlnU3lBSklBd1F0Z2NnQ0NnQ3dBVWlEQTBCREFJTFFSa2hDa0hVbmNrQUlRbEJ6aVFoRUFKQUlBZ29Bc3dHS0FJQUlneEJCbXNPQXdNQUF3QUxRUWdnREVFQ2F5SUpJQWxCQ2s4YlFRSjBJZ2xCMU5UYUFHb29BZ0FoSENBSlFhelUyZ0JxS0FJQUlSNUJnWUNBZ0hnaERrRU5JUXBCME5ESkFDRUpRZWdrSVJBTUFnc2dDQ2dDM0FVaERTQUlLQUxZQlNFVElBZ29BdFFGSVNNZ0NDZ0MwQVVoSGlBSUtBTE1CU0VjSUFnb0FzZ0ZJUW9nQ0NnQ3hBVWhDU0FJUWNnR2FpSVFJZzRReXdnZ0RpQUlRY0FDYWtFdy9Bb0FBQ0FJUVl3RGFpSU9JQk1nRFJDckJDQUlRY0FGYWlBUUlBNFF5QVVnQ0NnQ3dBVWhEaUFJUWFBRWFpQWFRY1FBL0FvQUFDQUpRUWgySVJBZ0RrRUNSZ1JBSUF3aERnd0dDeUFJSUF3MkF0QUdJQWdnWWpjRHlBWWdHaUFJUWFBRWFpSVNRY1FBL0FvQUFDQUlJQkE3QUswRElBaEJyd05xSUJCQkVIWTZBQUFnQ0NBak5nSzhBeUFJSUI0MkFyZ0RJQWdnSERZQ3RBTWdDQ0FLTmdLd0F5QUlJQWs2QUt3RElBZ2dEallDd0FVZ0NDQUlOUUxRQmo0Q3FBTWdFaUFJUWFnRGFoQ3BBaUFJS1FLMEJDRmxJQWdwQXF3RUlXTWdDQ2tDcEFRaFlnSkFBa0FnQ0NnQ29BUWlDVUVEUndSQUlHSkNJSWluSVFvZ0NDZ0N2QVFoRGlCaXB5RVpEQUVMSUFnZ1pUY0QwQUlnQ0NCak53UElBaUFJSUdJM0E4QUNJQWhCb0FScVFjU2R5UUJCQWlBSVFjQUNhaERmQVNBSUtBTEFCQ0VPSUFncEFyZ0VJV1VnQ0NrQ3NBUWhZeUFJS1FLb0JDRmlJQWdvQXFRRUlRa2dDQ2dDb0FRaUVrVUVRQ0JpUWlDSXB5RUtJR0tuSVJrTUFRc2dDQ0JqTndMWUJpQUlJR0kzQXRBR0lBZ2dDVFlDekFZZ0NDQVNOZ0xJQmlBSVFhQUVhaUFJUWNnR2FoQ3BBaUFJS1FLMEJDRmlJQWdwQXF3RUlXTWdDQ2dDcUFRaEVpQUlLQUtrQkNFUUlBZ29BcUFFSWdsQkEwY0VRQ0FJS0FLOEJDRU9JQkloQ2lBUUlSa2dZaUZsREFFTElCQU5BU0JqUWlDSXB5RUtJR09uSVJrZ0VpRUpJR0loWXdzZ0NDQU9OZ0xnQXlBSUlHVTNBdGdESUFnZ1l6Y0MwQU1nQ0NBSk5nTEVBeUFJSUJtdElBcXRRaUNHaERjQ3lBTWdDRUhBQldvUXdnZ01Cd3RCZ09EYUFDMEFBQnBCeUFBUUZpSUpSUVJBQUFzZ0NTQUlRY0FGYWtISUFQd0tBQUFnUjBIQ25ja0FRUUlRcXdSQkFTRWpJQWhCQVRZQzVBTWdDQ0FKTmdMZ0F5QUlRUUUyQXR3RElBZ2dZamNDMUFNZ0NDQmpOd0xNQXlBSUlCSTJBc2dESUFnZ0VEWUN4QU1nQ0VHZ0Eyb2lEeUJRUVFocUtRSUFOd01BSUFoQjZBRnFJZ3dnRjBFSWFpa0NBRGNEQUNBSUlGQXBBZ0EzQTVnRElBZ2dGeWtDQURjRDRBRWdDRUg0QVdvaUNpQVBLUU1BTndNQUlBZ2dDQ2tEbUFNM0EvQUJJQWhCd0FGcUlnOGdDaWtEQURjREFDQUlJQWdwQS9BQk53TzRBU0FISUFncEErQUJOd0lBSUFkQkNHb2dEQ2tEQURjQ0FDQUlRYkFCYWlJS0lBOHBBd0EzQXdBZ0NDQUlLUU80QVRjRHFBRWdDRUdnQVdvaUR5QUtLUU1BTndNQUlBZ2dDQ2tEcUFFM0E1Z0JJQWhCaUFKcUlnb2dEeWtEQURjREFDQUlJQWdwQTVnQk53T0FBaUJQUVFocUlBb3BBd0EzQWdBZ1R5QUlLUU9BQWpjQ0FDQUlJQWsyQWx3Z0NFRUJOZ0pZSUFnZ0VqWUNSQ0FJSUJBMkFrQWdDRUVBTmdJOElBZ29BbUFoRGlBSUtBSlVJUW9nQ0NnQ1VDRWVJQWdvQWt3aERDQUlLQUpJSVEwZ1B3d0lDMEVBSVFrTElBaEJ5QVpxRU1zSURBSUxJQWdvQXNnRklnbEJDSFloRUNBSUtBTFVCU0VlSUFnb0F0QUZJUndnQ0NnQ3pBVWhDaUFJS0FMRUJTRU9EQUVMSUFsQkNIWWhFQ0FJS0FMWUJpRWVJQWdvQXRRR0lSd2dDQ2dDMEFZaENnc2dDRUhBQW1vUTZnY0xJQWdnSGpZQzBBVWdDQ0FjTmdMTUJTQUlJQW8yQXNnRklBZ2dEallDd0FVZ0NDQUpRZjhCY1NBUVFRaDBjallDeEFVZ0NFSEFCV29RelFJZ0NFRTFPZ0RnQXlBSUlHSTNBdGdESUFnZ1l6Y0MwQU1nQ0NBU05nTE1BeUFJSUJrMkFzZ0RRUUVoQ1NBSVFRRTJBc1FEQ3dKL0lBbEZCRUFnQ0VINEFXb2dDRUdnQTJvcEF3QTNBd0FnQ0NBSUtRT1lBemNEOEFGQkFBd0JDeUFJUWFBRGFpQlFRUWhxS1FJQUltSTNBd0FnQ0VINEFXb2dZamNEQUNBSVFjQUJhaUJpTndNQUlBZ2dVQ2tDQUNKak53T1lBeUFJSUdNM0EvQUJJQWdnWXpjRHVBRWdDQ2dDM0FNaENTQUlLQUxnQXlFT1FRSUxJUkFnQ0VHZ0FXb2dDRUhBQVdvcEF3QTNBd0FnQ0NBSUtRTzRBVGNEbUFFTElCQUVRQ0FJUVlnQ2FpQUlRYUFCYWlrREFEY0RBQ0FJSUFncEE1Z0JOd09BQWdzZ1R5QUlLUU9BQWpjQ0FDQlBRUWhxSUFoQmlBSnFLUU1BTndJQUlBZ2dEallDWENBSUlBazJBbGdnQ0NBWk5nSkVJQWhCQVRZQ1BDQUlJQkEyQWtBQ2Z3SkFJQkJCQVVZRVFDQUlRZkFBYWhEQkJpQWlJUjRnS2lFY0lDa2hFeUFvSVI4Z0ZDRUpBa0FDUUFOQUlBZ2dIallDM0FZZ0NDQWNOZ0xZQmlBSUlCTTJBdFFHSUFnZ0h6WUMwQVlnQ0NBSk5nTE1CaUFJSUE4MkFzZ0dJQWhCd0FOcUlBaEJ5QVpxRUtRQ0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBZ29BdGdESWhKQkRFWUVRQ0FJS0FMY0F5SU1RUUZHRFFFZ0NDQk9LUUFBTndQd0FTQUlJRTVCQjJvb0FBQTJBUGNCSUFndkFQVURJQWhCOXdOcUxRQUFRUkIwY2lFTklBZ29BdmdESVJJZ0NDMEE5QU1oTENBSUxRRG9BeUVrSUFncEErQURJV1VNQWdzZ0NFRzRBMm9nQ0VIUUEyb3BBd0EzQXdBZ0NFR3dBMm9nU1NrREFEY0RBQ0FJSUFncEE4QUROd09vQXlBSUlFNHBBQUEzQS9BQklBZ2dUa0VIYWlnQUFEWUE5d0VnQ0VIM0Eyb3RBQUFoRGlBSUtBTGNBeUVLSUFncEErQURJV01nQ0MwQTZBTWhKQ0FJTFFEMEF5RWpJQWdvQXZnRElSa2dDQzhBOVFNZ0NFSEFBbW9nUGtFay9Bb0FBQ0FPUVJCMGNpRU9EQVlMSUFnZ0hqWUMzQVlnQ0NBY05nTFlCaUFJSUJNMkF0UUdJQWdnSHpZQzBBWWdDQ0FKTmdMTUJpQUlJQTgyQXNnR0lBaEJvQVJxSUFoQnlBWnFFRzBDUUNBSUtBSzRCQ0lTUVF4R0JFQWdDQ2dDdkFRaURFRUJSZzBCSUFnZ1RTa0FBRGNEOEFFZ0NDQk5RUWRxS0FBQU5nRDNBU0FJTHdEVkJDQUlRZGNFYWkwQUFFRVFkSEloRFNBSUtBTFlCQ0VTSUFndEFOUUVJU3dnQ0MwQXlBUWhKQ0FJS1FQQUJDRmxEQUlMSUFoQnVBTnFJQWhCc0FScUtRTUFOd01BSUFoQnNBTnFJQWhCcUFScUtRTUFOd01BSUFnZ0NDa0RvQVEzQTZnRElBZ2dUU2tBQURjRDhBRWdDQ0JOUVFkcUtBQUFOZ0QzQVNBSVFkY0VhaTBBQUNFT0lBZ29BcndFSVFvZ0NDa0R3QVFoWXlBSUxRRElCQ0VrSUFndEFOUUVJU01nQ0NnQzJBUWhHU0FJTHdEVkJDQUlRY0FDYWlBOVFTVDhDZ0FBSUE1QkVIUnlJUTRNQmdzZ0NDQWVOZ0xFQmlBSUlCdzJBc0FHSUFnZ0V6WUN2QVlnQ0NBZk5nSzRCaUFJSUFrMkFyUUdJQWdnRHpZQ3NBWWdDRUhJQm1vaUVDQUlRYkFHYWlJU0VEY2dDQ2dDeUFZaURFRURSZzBCSUFnZ1dpa0FBRGNEZ0FVZ0NDQmFRUWRxSWc0b0FBQTJBSWNGSUF4QkFVWUVRQ0FJSUI0MkFzUUdJQWdnSERZQ3dBWWdDQ0FUTmdLOEJpQUlJQjgyQXJnR0lBZ2dDVFlDdEFZZ0NDQVBOZ0t3QmlBUUlCSVFSaUFJS0FMSUJrRUJSdzBESUFnZ1Jpa0FBRGNEa0FVZ0NDQkdRUWRxSWdvb0FBQTJBSmNGQWtBQ1FBSkFJQWdvQXN3R0lneEJBVVlFUUNBSUlCNDJBc1FHSUFnZ0hEWUN3QVlnQ0NBVE5nSzhCaUFJSUI4MkFyZ0dJQWdnQ1RZQ3RBWWdDQ0FQTmdLd0JpQVFJQklRTEFKQUlBZ29Bc2dHUVFGR0JFQWdDQ0JHS1FBQU53T2dCU0FJSUFvb0FBQTJBS2NGSUFnb0Fzd0dJZ3hCQVVZTkFTQUlMd0RsQmlCVUxRQUFRUkIwY2lFTklBZ3RBTmdHSVNRZ0NDa0MwQVloWlNBSUxRRGtCaUVzSUFnb0F1Z0dJUklnQ0NBSUtBQ25CVFlBOXdFZ0NDQUlLUU9nQlRjRDhBRU1Cd3NnQ0VHNEEyb2dNRUVRYWlrQ0FEY0RBQ0FJUWJBRGFpQXdRUWhxS1FJQU53TUFJQWdnTUNrQ0FEY0RxQU1nQ0NnQzVBWWhDaUFJS1FMb0JpRmpRUVloRWd3TEN5QUlJQjQyQXNRR0lBZ2dIRFlDd0FZZ0NDQVROZ0s4QmlBSUlCODJBcmdHSUFnZ0NUWUN0QVlnQ0NBUE5nS3dCaUFJUWNnR2FpSVNJQWhCc0FacUVJd0JJQWdvQXNnR1FRRkhEUWdnQ0NCR0tRQUFOd093QlNBSUlBb29BQUEyQUxjRklBZ29Bc3dHSWd4QkFVY05BU0FJSUI0MkF0d0dJQWdnSERZQzJBWWdDQ0FUTmdMVUJpQUlJQjgyQXRBR0lBZ2dDVFlDekFZZ0NDQVBOZ0xJQmlBSVFjQUZhaUFTRUM4Q1FDQUlLQUxZQlNJU1FReEdCRUFnQ0NnQzNBVWlERUVCUmcwQklBZ2dUQ2tBQURjRDhBRWdDQ0JNUVFkcUtBQUFOZ0QzQVNBSUx3RDFCU0F0TFFBQVFSQjBjaUVOSUFnb0F2Z0ZJUklnQ0MwQTlBVWhMQ0FJTFFEb0JTRWtJQWdwQStBRklXVU1Cd3NnQ0VHNEEyb2dSU2tEQURjREFDQUlRYkFEYWlBNktRTUFOd01BSUFnZ0NDa0R3QVUzQTZnRElBZ2dUQ2tBQURjRDhBRWdDQ0JNUVFkcUtBQUFOZ0QzQVNBdExRQUFJUTRnQ0NnQzNBVWhDaUFJS1FQZ0JTRmpJQWd0QU9nRklTUWdDQzBBOUFVaEl5QUlLQUw0QlNFWklBZ3ZBUFVGSUFoQndBSnFJRHRCSlB3S0FBQWdEa0VRZEhJaERnd0xDeUFJSUI0MkFzUUdJQWdnSERZQ3dBWWdDQ0FUTmdLOEJpQUlJQjgyQXJnR0lBZ2dDVFlDdEFZZ0NDQVBOZ0t3QmlBSVFjZ0dhaUlRSUFoQnNBWnFJaElRT3lBSUtBTElCa0VCUncwSklBZ2dSaWtBQURjRG9BWWdDQ0FLS0FBQU5nQ25CaUFJTFFEWUJpRlZJQWdvQXN3R0lneEJBVWNOQWlBSUlCNDJBc1FHSUFnZ0hEWUN3QVlnQ0NBVE5nSzhCaUFJSUI4MkFyZ0dJQWdnQ1RZQ3RBWWdDQ0FQTmdLd0JpQVFJQklRWkNBSUtBTHdCa0dBZ0lDQWVFY05BeUFJSUZvcEFBQTNBNEFDSUFnZ0RpZ0FBRFlBaHdJZ0NDQUlLUU9BQWpjRDhBRWdDQ0FJS0FDSEFqWUE5d0VnQ0M4QTRRWWdLeTBBQUVFUWRISWhEU0FJTFFEVUJpRWtJQWdwQXN3R0lXVWdDQ2dDeUFZaERDQUlMUURnQmlFc0lBZ29BdVFHSVJJTUJRc2dDQzhBNVFZZ1ZDMEFBRUVRZEhJaERTQUlMUURZQmlFa0lBZ3BBOUFHSVdVZ0NDMEE1QVloTENBSUtBTG9CaUVTSUFnZ0NDZ0Fsd1UyQVBjQklBZ2dDQ2tEa0FVM0EvQUJEQVFMSUFndkFPVUdJRlF0QUFCQkVIUnlJUTBnQ0MwQTJBWWhKQ0FJS1FMUUJpRmxJQWd0QU9RR0lTd2dDQ2dDNkFZaEVpQUlJQWdvQUxjRk5nRDNBU0FJSUFncEE3QUZOd1B3QVF3REN5QUlMd0RsQmlCVUxRQUFRUkIwY2lFTklBZ3BBdEFHSVdVZ0NDMEE1QVloTENBSUtBTG9CaUVTSUFnZ0NDZ0Fwd1kyQVBjQklBZ2dDQ2tEb0FZM0EvQUJJRlVoSkF3Q0N5QUlRYmdEYWlBSVFkZ0dhaWtEQURjREFDQUlRYkFEYWlBOEtRTUFOd01BSUFoQnlBSnFJRnRCQ0dvcEFnQTNBd0FnQ0VIUUFtb2dXMEVRYWlnQ0FEWUNBQ0FJSUFncEE4Z0dOd09vQXlBSUlHRXBBQUEzQTRBQ0lBZ2dXeWtDQURjRHdBSWdDQ0JoUVFkcUtBQUFOZ0NIQWlCSUxRQUFJUXdnQ0NrRDRBWWhZeUFJTFFEb0JpRWtJQWd0QVBRR0lTTWdDQ2dDK0FZaEdTQUlMd0QxQmlBSUlBZ3BBNEFDTndQd0FTQUlJQWdvQUljQ05nRDNBU0FNUVJCMGNpRU9RUWtoRWd3R0N5QUlMd0RoQmlBckxRQUFRUkIwY2lFTklBZ3RBTlFHSVNRZ0NDa0N6QVloWlNBSUxRRGdCaUVzSUFnb0F1UUdJUklnQ0NBSUtBQ0hCVFlBOXdFZ0NDQUlLUU9BQlRjRDhBRUxJQWdnQ0NrRDhBRTNBK0FCSUFnZ0NDZ0E5d0UyQU9jQklGOGdDQ2tENEFFM0FBQWdYMEVIYWlBSUtBRG5BVFlBQUNBSUlDUTZBTWdCREFVTElBaEJ1QU5xSURCQkVHb3BBZ0EzQXdBZ0NFR3dBMm9nTUVFSWFpa0NBRGNEQUNBSUlEQXBBZ0EzQTZnRElBZ29BdVFHSVFwQkJTRVNEQU1MSUFoQnVBTnFJRHhCRUdvcEF3QTNBd0FnQ0VHd0Eyb2dQRUVJYWlrREFEY0RBQ0FJSUR3cEF3QTNBNmdESUFncEErZ0dJV05CQkNFU0RBSUxJQWhCdUFOcUlEQkJFR29wQWdBM0F3QWdDRUd3QTJvZ01FRUlhaWtDQURjREFDQUlJREFwQWdBM0E2Z0RJQWdvQXVRR0lRb2dDQ2tDNkFZaFkwRUhJUkpCQUNFa0RBRUxJQWhCdUFOcUlEQkJFR29wQWdBM0F3QkJDQ0VTSUFoQnNBTnFJREJCQ0dvcEFnQTNBd0FnQ0NBd0tRSUFOd09vQXlBSUtBTGtCaUVLSUFncEF1Z0dJV01nVlNFa0N5QUlJQWdwQS9BQk53UGdBU0FJSUFnb0FQY0JOZ0RuQVNBNUlBaEJ3QUpxUVNUOENnQUFJR0FnQ0NrRDRBRTNBQUFnWUVFSGFpQUlLQURuQVRZQUFDQUlJQTQ3QU4wRklBaEIzd1ZxSUE1QkVIWTZBQUFnQ0NBa09nRFFCU0FJSUJrMkF1QUZJQWdnSXpvQTNBVWdDQ0JqTndQSUJTQUlJQW8yQXNRRklBZ2dFallDd0FVZ0NFR2dCR29nQ0VHb0Eyb1FxUUlnQ0M4QXVRUWdDRUc3QkdvdEFBQkJFSFJ5SVEwZ0NDMEF1QVFoTENBSUtBSzBCQ0ZXSUFnb0FyQUVJVE1nQ0NnQ3JBUWhFQ0FJS1FLa0JDRmxJQWdvQXFBRUlneEJBMFlOQVNBSUlGWTJBdEFCSUFnZ016WUN6QUVnQ0NBUU5nTElBU0FJS0FLOEJDRVNJQWhCd0FWcUVQUUVDeUJscHlFS1FUa2hEa0VBSVJrZ0RDSVFJU01nRENFekFrQUNRQUpBSUF4QkFXc09BZ0FCQWd0Qk9pRU9RUUFoREVFQUlSQkJBQ0VqUVFBaE13d0JDeUFzSVJBZ0RVRUlkQ0VqSUJKQmdINXhJUXdnWlVJZ2lLY2hNeUFJS0FMSUFTRVpJQWdwQXN3QklXTWdFaUVPQzBFQ0lBNUJPV3RCL3dGeEloSWdFa0VDVHhzaUVrRUJhdzRDQXdJRkN5QUlRZEFCYWlJTUlFVkJDR29vQWdBMkFnQWdDQ0JGS1FNQU53UElBU0FJUVpBQ2FpSXhJQWhCd0FKcVFTVDhDZ0FBSUF3b0FnQWhNaUFJS1FQSUFTRmlJQWdnR1RZQ3dBUWdDQ0FqUWY4QmNTQU9RUWgwY2lJT05nSzhCQ0FJSURJMkFyZ0VJQWdnWWpjRHNBUWdDQ0JqUWlDSXB5SWpOZ0tzQkNBSUlHT25JbGMyQXFnRUlBZ2dDallDcEFRZ0NDQVNOZ0tnQkNBNElERkJKUHdLQUFBZ1pVSWdpS2NpRENBSlJ3UkFJRG9nQ0VINEFHb2lDU2dDQURZQ0FDQUlJQWdwQTNBM0E4QUZJQWdnR1RZQzhBVWdDQ0FPTmdMc0JTQUlJREkyQXVnRklBZ2dZamNENEFVZ0NDQWpOZ0xjQlNBSUlGYzJBdGdGSUFnZ0NqWUMxQVVnQ0NBU05nTFFCU0EySURGQkpQd0tBQUFnQ0VIQUJXb2dSUkN0QmlBSklEb29BZ0EyQWdBZ0NDQUlLUVBBQlRjRGNDQU5RUWgwSUN4eUlSNGdaYWNoRHlCV0lSd2dNeUVUSUJBaEh5QU1JUWtNQVFzTElBaEJvQVJxRUxzRVFRRWhFa0VJSVY0Z0hpRTNJQndoSnlBVElTWWdIeUVZSUFraEZpQVBJUW9NQXdzZ0RFRUlkaUUwSUF3Z0RuSWhYaUFRSUNOeUlUY2dZMElnaUtjaEp5QmpweUVtUVFJaEVpQVpJUmdnTXlFV0RBSUxJQWdvQW5RaVhrRUlkaUUwSUFnb0FuZ2hRaUFJS0FKd0lUY2dIaUVuSUJ3aEppQVRJUmdnSHlFV0lBa2hDaUFQSVJKQkFBd0NDeUFJS0FKUUlRb2dDQ2dDVENFTUlBZ29Ba2doRFNBWklSSWdDQ2dDVkF3R0N5QUlRZkFBYWhDR0NVRUJDeUJlUWY4QmNTQTBRUWgwY2lFT0JFQWdFaUVRSUFvaEVpQVdJUTBnR0NFTUlDWWhDaUEzSVFrZ0p3d0ZDeUFJSUVJMkFzZ0RJQWdnRGpZQ3hBTWdDQ0EzTmdMQUF5QUlJQ2MyQXJRRUlBZ2dKallDc0FRZ0NDQVlOZ0tzQkNBSUlCWTJBcWdFSUFnZ0NqWUNwQVFnQ0NBU05nS2dCRUVBSVE4Q2Z3SkFBa0FEUUNBS0lBOUdEUUVDUUNBUElCSnFMUUFBSWdsQjN3RnhRY0VBYTBIL0FYRkJHazhFUUVHUzBOSUFRUU1nQ1JDc0JrVU5BUXNnRDBFQmFpRVBEQUVMQ3lBUERRRkJKQ0VKUVFFaEVDQW5JUThnSmlFUklCZ2hGU0FXSVM4Z0NpRWREQVFMSUFwRkJFQkJBQ0VkUVNRaENVRUJJUkFnSnlFUElDWWhFU0FZSVJVZ0ZpRXZEQVFMSUFoQndBVnFJQWhCb0FScUlna2dDaERRQmlCTElBa2dDaERSQmlBSUx3RGhCU0F1TFFBQVFSQjBjZ3dCQ3lBSVFjQUZhaUFJUWFBRWFpSUpJQThRMEFZZ1N5QUpJQThRMFFZZ0NDOEE0UVVnTGkwQUFFRVFkSElMSVNVZ0NDMEE0QVVoQ1NBSUtBTGNCU0VQSUFnb0F0Z0ZJUXdnQ0NnQzFBVWhIeUFJS0FMUUJTRVpJQWdvQXN3RklSd2dDQ2dDeUFVaEV5QUlLQUxFQlNFUUlBZ29Bc0FGSWcxRkJFQWdFQVJBSUJNaEVpQU1JUkVnSHlFVklCa2hMeUFjSVIwTUF3c2dOVUVJZGlGS0lCTWhFZ3dFQ3lBSVFjQUZhaUl2SUF3Z0R4Qm5JQWxCL3dGeElDVkJDSFJ5SVRVZ0NFR2dCR29nTHhDaUJ5QUlLQUtnQkVHQWdJQ0FlRVlFUUVFQklRa2dKeUVQSUNZaEVTQVlJUlVnRmlFdklBb2hIVUVCSVJBTUF3c2dDQ0FmTmdLRUF5QUlJQmsyQW9BRElBZ2dIRFlDL0FJZ0NDQVROZ0w0QWlBSUlCQTJBdlFDSUFnZ0RUWUM4QUlnQ0NrRG9BUWhZeUFJSUFnb0FxZ0VOZ0swQkNBSUlHTkNJSWluSWc4MkFyQUVJQWdnWTZjaUNUWUNyQVFnQ0NCQ05nS29CQ0FJSUE0MkFxUUVJQWdnTnpZQ29BUWdDRUhBQldvZ0NFSHdBbW9RcVFJZ1kwSW9pS2NoU2lBSUtBTFlCU0V6SUFnb0F0UUZJUjRnQ0NnQzBBVWhDaUFJS0FMTUJTRU1JQWdvQXNnRklRMGdDQ2dDeEFVaEVpQUlLQUxBQlNJUVFRTkhCRUFnQ0NnQzNBVWhEaUFJUWFBRWFoQ0dDU0FKSUE4UXFRa2dFeUVkSUJ3aEx5QVpJUlVnSHlFUklETWhDU0FlREFVTElBaEJrQUZxSUZsQkNHb29BZ0EyQWdBZ0NDQlpLUUlBTndPSUFTQVRJUjBnSENFdklCa2hGU0FmSVJFZ0VpRVFJRGNoSXlBT0lRa2dEU0VTSUF3aERTQUtJUXdnTXlFS0lFSWhEaUFJUVlnQmFnc2lEeWdDQURZQ01DQUlJQThvQWdRMkFpd2dDQ0FlTmdJNElBOG9BZ2doRDBFQUlSa2dDRUVnYWlFZUlBaEJKR29oSENBSVFUUnFJUjhnQ0VFb2Fnd0VDeUFsSVVvZ0NVSC9BWEVnSlVFSWRISWlDU0UxQ3lBUHJTQktyVUlvaGlBSnJVTC9BWU5DSUlhRWhDRmpDeUJqUWlDSXB5RU9JQWhCd0FOcUVJWUpJR09uSVFrZ0hTRU5JQzhoRENBVklRb2dFUXNoSTBFQklSa2dDRUVzYWlFZUlBaEJNR29oSENBSVFUaHFJUjhnQ0VFMGFnc2dJellDQUNBZklBbzJBZ0FnSENBSk5nSUFJQjRnRGpZQ0FDQVpCRUJCT1NFVUFrQUNRQUpBSUJCQkFXc09BZ0FCQWd0Qk9pRVVEQUVMSUFndEFDd2hGQXRCQWlBVVFUbHJRZjhCY1NJU0lCSkJBazhiUVFGSERRSWdRVUdBZ0lDQWVFWU5BeUJZSUVFMkFnUWdXQ0JBclNCRHJVSWdob1EzQWdoQm40Q0FnSGdNQkFzZ0NDZ0NOQ0VlSUFnb0FqZ2hIQ0FJS0FJd0lSa2dDQ2dDTENFVElBZ29BaWdoRGlBSUtBSWtJUW9nQ0NBSUtBSWdJZ2syQXJRRUlBZ2dDallDc0FRZ0NDQU9OZ0tzQkNBSUlBODJBcWdFSUFnZ0V6WUNwQVFnQ0NBWk5nS2dCQ0FTSUVSSEJFQWdDQ0FKTmdMZ0JTQUlJQW8yQXR3RklBZ2dEallDMkFVZ0NDQVBOZ0xVQlNBSUlCTTJBdEFGSUFnZ0dUWUN6QVVnQ0NCQU5nTEVCU0FJSUVFMkFzQUZJQWdnUXpZQ3lBVWdRU0JEUmdSL0l3QkJFR3NpQ2lRQUlBcEJDR29nQ0VIQUJXb2lDU0FKS0FJQVFRRkJCRUVZRUlnQ0lBb29BZ2dpQ1VHQmdJQ0FlRWNFUUNBSklBb29BZ3hCaEszSkFCRE1DQUFMSUFwQkVHb2tBQ0FJS0FMRUJRVWdRQXNnUTBFWWJHb2lDU0JkS1FJQU53SUFJQWxCRUdvZ1hVRVFhaWtDQURjQ0FDQUpRUWhxSUYxQkNHb3BBZ0EzQWdBZ1EwRUJhaUZESUFnb0FzQUZJVUVnQ0NnQ3hBVWhRQ0FpSVFrZ0tpRU9JQ2toQ2lBb0lSa2dGQ0VUSUI0aElpQWNJU29nRENFcElBMGhLQ0FTSVVRZ0VDRVBEQUVMQ3lBWklCTVFxUWtnV1JDR0NRc2dRQ0JERU04R0lFRWdRQkRFQ1FzZ1dFRUJPZ0FFUVlhQWdJQjRDellDQUNBSVFaQUhhaVFBQWtBQ1FDQUxLQUpJUVorQWdJQjRSZ1JBSUFzb0Frd2hTaUFMS0FKUUlTOGdDeWdDVkNGWElBdEIrQVJxRU9ZR0lBdEJNR3BCK00vU0FDa0RBRGNEQUNBTFFmRFAwZ0FwQXdBM0F5Z2dDeUFMS1FPQUJUY0RRQ0FMSUFzcEEvZ0VOd000SUF0QitBSnFRZ0EzQXdBZ0MwR1FBMnBDQURjREFDQUxRYWdEYWtJQU53TUFJQXRCd0FOcVFnQTNBd0FnQzBISUEycEJBRFlDQUNBTFFlQURha0lBTndNQUlBdEIrQU5xUWdBM0F3QWdDMElBTndQd0FpQUxRb0NBZ0lDQWdJRDRQemNENkFJZ0MwSUFOd09JQXlBTFFvQ0FnSUNBZ0lENFB6Y0RnQU1nQzBJQU53T2dBeUFMUW9DQWdJQ0FnSUQ0UHpjRG1BTWdDMElBTndPNEF5QUxRb0NBZ0lDQWdJRDRQemNEc0FNZ0MwSUFOd1BZQXlBTFFvQ0FnSUNBZ0lEOC93QTNBOUFESUF0Q2dJQ0FnSUNBZ1BnL053UG9BeUFMUWdBM0EvQURJQXRDZ0lDQWdJQUJOd09JQkNBTFFZQ0FnSUI0TmdMSUFpQUxRUUEyQXBBRUlBdENDVGNEU0NBTFFvQ0FnSUNBQVRjQ2xBUWdDMEVBTmdLY0JDQUxRZ2szQThBQklBdENnSUNBZ0lDQWdQZy9Od09BQkNBTFFRQTJBcWdFSUF0Q2dJQ0FnSUFCTndLZ0JDQUxRUUEyQXJRRUlBdENnSUNBZ01BQU53S3NCQ0FMUWNnRWFrSUFOd01BSUF0QjRBUnFRZ0EzQXdBZ0MwSUFOd1BBQkNBTFFvQ0FnSUNBZ0lENFB6Y0R1QVFnQzBJQU53UFlCQ0FMUW9DQWdJQ0FnSUQ0UHpjRDBBUWdDMEVBTmdMd0JDQUxRb0NBZ0lDQUFUY0M2QVFnTHlCWFFSaHNhaUZXSUF0QmdBVnFJUzBnQzBIb0Jtb2hJeUFMUWNRSWFpRWtJQXRCOEFWcUlWVWdDMEc0Q0dvaE15QUxRZGdFYWlFN0lBdEJ3QVJxSVQwZ0MwSEFBV29oUnlBTFFiZ0NhaUUrSUF0Qm1BTnFJUzRnQzBIb0Ftb2hMQ0FMUVRocUlVUWdBU2dDbkFJaE5DQUJLQUtZQWlFMUlDOGhFZ05BSUZZZ0VpSUpSZ1JBUWFHQWdJQjRJUWtNQXdzZ0N5QUpOZ0wwQkNBSlFSaHFJUklDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKL0FrQUNmd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQWdDU2dDQkNJUUlBa29BZ2dpQ2tHdzFjb0FRUUlRN0FkRkJFQWdFQ0FLUWJMVnlnQkJBaERzQncwQklCQWdDa0cwMWNvQVFRSVE3QWNOQnlBUUlBcEJ0dFhLQUVFQ0VPd0hEUUlnRUNBS1FialZ5Z0JCQWhEc0J3MERJQkFnQ2tHNjFjb0FRUUlRN0FkRkJFQWdFQ0FLUWJ6VnlnQkJBeERzQjBVTkJRc2dDeWtEd0FGQ0RWSU5DRUVJSVJ0QkFDRUpRUUFNQ1FzZ1BVSUFOd01BSUR0Q0FEY0RBQ0E5UVFocVFnQTNBd0FnTzBFSWFrSUFOd01BSUF0Q2dJQ0FnSUNBZ1BnL053TzRCQ0FMUW9DQWdJQ0FnSUQ0UHpjRDBBUWdMaUFMUWJnRWFrRXcvQW9BQUF3ZUN5QTlRZ0EzQXdBZ08wSUFOd01BSUQxQkNHcENBRGNEQUNBN1FRaHFRZ0EzQXdBZ0MwS0FnSUNBZ0lDQStEODNBN2dFSUF0Q2dJQ0FnSUNBZ1BnL053UFFCQ0F1SUF0QnVBUnFRVEQ4Q2dBQURCMExJQXRCdUF4cUlBbEJFR29vQWdBZ0NVRVVhaWdDQUVFQVFaRGZ5Z0FRNVFjUXVRUWdDeWdDdUF4Qm40Q0FnSGhIRFFNZ0MwSDRCR29pQ1NBQklBc29BcndNSUFzb0FzQU1JQU1RRWlCSEVPOEJJRWNnQ1VINEFQd0tBQUFNSEFzZ0MwRzRER29nQ1VFUWFpZ0NBQ0FKUVJScUtBSUFRUUJCOE43S0FCRGxCeEM1QkNBTEtBSzRERUdmZ0lDQWVFY05BU0FMUWZnRWFpSUtJQUVnQ3lnQ3ZBd2dDeWdDd0F3Z0F4QVNJQXRCeUFCcUlna1E3d0VnQ1NBS1FmZ0EvQW9BQUF3YkN3SkFJQkFnQ2tHLzFjb0FRUUlRN0FkRkJFQWdFQ0FLUWNIVnlnQkJBeERzQjBVTkFRc2dDeWtEU0VJTlVnMEdRUWdoRzBFQUlRbEJBQXdIQ3lBUUlBcEI0NERPQUVFQkVPd0hEUm9nRUNBS1FidUJ6Z0JCQVJEc0J3MGFJQkFnQ2tIRTFjb0FRUUlRN0FjTkdpQVFJQXBCeHRYS0FFRUNFT3dIRFJvZ0VDQUtRZWVBemdCQkFSRHNCdzBhSUJBZ0NrRy9nYzRBUVFFUTdBY05HaUFRSUFwQnlOWEtBRUVDRU93SERRY2dFQ0FLUWNyVnlnQkJBaERzQncwSUlCQWdDa0hNMWNvQVFRSVE3QWRGQkVBZ0VDQUtRYzdWeWdCQkFoRHNCMFVFUUNBUUlBcEIwTlhLQUVFQ0VPd0hSUVJBSUJBZ0NrSFMxY29BUVFJUTdBZEZCRUFnRUNBS1FkVFZ5Z0JCQWhEc0IwVUVRQ0FRSUFwQjF0WEtBRUVDRU93SERSNGdFQ0FLUWRqVnlnQkJBaERzQncwT0lCQWdDa0hhMWNvQVFRSVE3QWNORHlBUUlBcEIzTlhLQUVFQ0VPd0hEUkFnRUNBS1FkN1Z5Z0JCQWhEc0IwVU5FU0FMS3dQd0F5Rm5JQzFDQURjREFDQXRRUWhxUWdBM0F3QWdDMEtBZ0lDQWdJQ0ErRDgzQS9nRUlBc2daNW81QTZBRklBdENBRGNEbUFVZ0MwS0FnSUNBZ0lDQStEODNBNUFGSUF0QnVBeHFJZ2tnQzBINEJHb2dDMEc0QkdvaUNoQ3BBeUFLSUFsQk1Qd0tBQUFnTGlBS1FURDhDZ0FBREI4TElEVWdOQ0FEUWF6ZHlnQkJCQkRBQkNFTUlBdEJ1QXhxSUFsQkVHb2lOeWdDQUNBSlFSUnFJaDRvQWdCQkFFR3czY29BRU9VSEVMa0VJQXNvQXJnTVFaK0FnSUI0UmdSQUlBc29BcndNSVVnZ0MwSDRCR29nQ3lnQ3dBd2lOa0VCUVFFUXNBTWdDeWdDL0FRaFB5QUxLQUw0QkVFQlJ3UkFJQXNvQW9BRklUZ2dOZ1JBSURnZ1NDQTIvQW9BQUFzZ0N5a0RPQ0FMS1FOQUlEZ2dOaENhQVNGbUlBc29BaXdpRGlCbXB5SVBjU0ViSUdaQ0dZaEMvd0NEUW9HQ2hJaVFvTUNBQVg0aFpVRUFJUkVnQ3lnQ0tDRUtBMEFnQ2lBYmFpa0FBQ0pqSUdXRkltSkNmNFVnWWtLQmdvU0lrS0RBZ0FGOWcwS0FnWUtFaUpDZ3dJQi9neUZpQWtBQ1FBSkFBMEFnWWxBTkFTQUtJR0o2cDBFRGRpQWJhaUFPY1VGc2JHb2lDVUVRYXlnQ0FDQUpRUXhyS0FJQUlEZ2dOaERzQjBVRVFDQmlRZ0Y5SUdLRElXSU1BUXNMSUQ4Z09CQ3BDU0FKSVE4TUFRc2dZeUJqUWdHR2cwS0FnWUtFaUpDZ3dJQi9nMUFOQVNBTEtBSXdSUVJBQWtBakFFRkFhaUlVSkFBZ0ZDQkVOZ0lNSUF0QktHb2lHQ2dDRENFYklCUWdGRUVNYWpZQ0VDQWJRWDlIQkVBQ2Z3SkFJQmdvQWdRaUNTQUpRUUZxUVFOMlFRZHNJQWxCQ0VrYklnbEJBWFlnRzAwRVFDQVVRVEJxUVJRZ0NTQWJJQWtnRzBzYlFRRnFFUDhDSUJRb0FqUWlGU0FVS0FJd0loWkZEUUlhSUJRb0FqZ2hFQ0FVSUJRb0FqdzJBaXdnRkNBUU5nSW9JQlFnRlRZQ0pDQVVJQlkyQWlBZ0ZFS1VnSUNBZ0FFM0FoZ2dGQ0FZUVJCcU5nSVVJQmdvQWdBaUppa0RBRUovaFVLQWdZS0VpSkNnd0lCL2d5RmlJQlJCSUdvaENrRUFJUndEUUNBYkJFQURRQ0JpVUFSQUlCeEJDR29oSENBbVFRaHFJaVlwQXdCQ2Y0VkNnSUdDaElpUW9NQ0FmNE1oWWd3QkN3c2dGQ0FXSUJVZ0ZFRVFhaUFZSUdKNnAwRURkaUFjYWlJSkVNVUdFTHdGSUJZZ0ZDZ0NBRUYvYzBFVWJHb2lEaUFZS0FJQUlBbEJmM05CRkd4cUlna3BBQUEzQUFBZ0RrRUlhaUFKUVFocUtRQUFOd0FBSUE1QkVHb2dDVUVRYWlnQUFEWUFBQ0FiUVFGcklSc2dZa0lCZlNCaWd5RmlEQUVMQ3lBVUlCZ29BZ3dpQ1RZQ0xDQVVJQkFnQ1dzMkFpZ2dHQ0FLRU5NSklCUkJGR29RcUFVTUFRc2dHQ0FVUVJCcVFlZ0FRUlFRZHd0QkFBc2FJQlJCUUdza0FBd0JDeERuQmdBTEN5QS9RWUNBZ0lCNFJnMEFJQXRCSUdvaFFpQTFJRFFnRENCSUlEWVF3QVFoSUVFQUlReEJBQ0VQUVFBaEUwSUFJV1JCQUNFVVFRQWhHRUVBSVJaQkFDRVZRZ0FoWTBFQUlURkNBQ0ZpUXdBQUFBQWhlVU1BQUFBQUlYdERBQUFBQUNGOFF3QUFBQUFoZlVNQUFBQUFJWDVEQUFBQUFDRi9Rd0FBQUFBaGdBRWpBRUh3Q1dzaUJ5UUFJQWRCdkFOcUlBRW9BcGdDSWhjZ0FTZ0NuQUlpR2lBZ1FmeU55Z0JCQnhEUkJBSi9Ba0FDUUFKQUFuOENRQUpBQWtBQ1FBSkFBa0FDUUNBSEtBTEFBeUlLSUFjb0FzUURJZ2xCZzQ3S0FFRUZFT3dIUlFSQUlBb2dDVUdJanNvQVFRVVE3QWRGRFFRZ0IwR2dCbW9nRnlBYUlDQVFIQ0FYSUJvZ0lFSFowdElBUVFnUXpBVWlDVVVOTXlBSktBSUFRUVpyRGdRQ016TUJNd3NnQjBHQUJXb2dGeUFhSUNCQmtML0tBRUVJRU5FRUlCY2dHaUFnUVl6SHlnQkJEeENCQlNJS0JFQWdCMEh3Qm1vaUNTQVhJQm9nQ2tFRWFpZ0NBQ0FLUVFocUtBSUFRUUJCeE1mS0FCRGxCeEM1QXhEWkJDQUpRZFRIeWdCQkVrSG94OG9BRUs4RUlSMGdCeUFYSUJvZ0lFSFowdElBUVFnUXlBTkIrTWZLQUVFZ1Faakl5Z0FRcWdnaUREWUNvQVFDUUFKQVFRZ2dEQ2dDQUVFQ2F5SUpJQWxCQ2s4YlFRUnJEZ1VIQUFBQUFRQUxJQWRCQVRZQzlBWWdCMEhJeU1vQU5nTHdCaUFIUWdFM0F2d0dJQWRCQ2pZQ3hBVWdCeUFIUWNBRmFqWUMrQVlnQnlBSFFhQUVhallDd0FVZ0IwSHdCbXBCOE1yS0FCQ3JCd0FMSUFkQm9BWnFJQXdReFFNZ0IwSHdCbW9pRENBSEtBS2tCaUlRSUFjb0FxZ0dJZ29RakFVZ0IwSEFCV29pQ1NBTUVKc0VJQWNvQXNBRlFZQ0FnSUI0UmdSQUlBY29Bc1FGSUFjb0FzZ0ZFUFVKSUF3Z0VDQUtFTkFDSUFrZ0RFR0FsY0FBRUlBRUlBZENCRGNDZ0FjZ0IwSUFOd0w0QmlBSFFvQ0FnSURBQURjQzhBWWdCMEg4Qm1vaElTQUhLQUxFQlNFUklBY29Bc2dGSVNJRFFDQVRJQ0pQQkVBZ0J5Z0NoQWNoSVNBSEtBS0FCeUVUSUFjb0F2d0dJUlVnQnlnQytBWWhHQ0FIS0FMMEJpRVdJQWNvQXZBR0RBc0xBa0FDUUNBUklDSWdFMEdRbGNBQUVPQUhJZ2t0QUFCQkJVY05BQUpBQWtBZ0NTZ0NDQ0lLSUFrb0Fnd2lDVUdnbGNBQVFSTVE3QWRGQkVBZ0NpQUpRYk9Wd0FCQkRSRHNCMFVOQXlBUklDSWdFMEVCYTBIQWxjQUFFT0FISWdrdEFBQkJBMFlOQVF3TkN5QVJJQ0lnRTBFQmEwSE1sc0FBRU9BSElna3RBQUJCQTBZTkFVRWZJUmhCM0piQUFDRVdEQTBMSUFrcEF3Z2lZa0lBSUdKQ0FGVWJJV1FnRTBFQmFpRVRBMEFnWkZBTkFrRWZJUmhCL0pYQUFDRVdJQkVnSWlBVFFleVZ3QUFRNEFjaURDMEFBQTBOSUJFZ0lpQVRRUUZxUVp5V3dBQVE0QWNpQ2kwQUFBME5JQkVnSWlBVFFRSnFJaE5CckpiQUFCRGdCeUlKTFFBQVFRTkhEUXdnRENnQ0NDQU1LQUlNRU5zR0lRd2dDaWdDQ0NBS0tBSU1FTnNHSVE4Z0NTZ0NDQ0VLSUFjb0FvUUhJZzRnQnlnQy9BWkdCRUFqQUVFUWF5SVdKQUFnRmtFSWFpQWhJQ0VvQWdCQkFVRUVRUXdReFFJZ0ZpZ0NDQ0lKUVlHQWdJQjRSd1JBSUFrZ0ZpZ0NERUc4bHNBQUVNd0lBQXNnRmtFUWFpUUFDeUFIS0FLQUJ5QU9RUXhzYWlJSklBbzJBZ2dnQ1NBUE5nSUVJQWtnRERZQ0FDQUhJQTVCQVdvMkFvUUhJR1JDQVgwaFpBd0FDd0FMUWdBaFpDQUpLUU1JSW1KQ0FDQmlRZ0JWR3lGaUlCTkJBV29oRXdOQUlHSWdaRkVOQVVFbElSaEJqSmZBQUNFV0lCRWdJaUFUUWZ5V3dBQVE0QWNpREMwQUFBME1JQkVnSWlBVFFRRnFRYlNYd0FBUTRBY2lDaTBBQUEwTUlBd29BZ3dpRkNBS0tBSU1SdzBDSUdSQ0FYd2haRUVBSVExQkFDRUpRUUFoRHdOQUlBMGdGRWNFUUNBTUtBSUlJQXdvQWd3Z0RVSGdsTUFBRVA0SExRQUFJQTlCQ0hSeUlROGdDaWdDQ0NBS0tBSU1JQTFCOEpUQUFCRCtCeTBBQUNBSlFRaDBjaUVKSUExQkFXb2hEUXdCQ3dzZ0J5Z0MrQVlpRENBSEtBTHdCa1lFUUNNQVFSQnJJZzRrQUNBT1FRaHFJQWRCOEFacUlnb2dDaWdDQUVFQlFRUkJEQkRGQWlBT0tBSUlJZ3BCZ1lDQWdIaEhCRUFnQ2lBT0tBSU1RY1NYd0FBUXpBZ0FDeUFPUVJCcUpBQUxJQWNvQXZRR0lBeEJER3hxSWdvZ0NUWUNDQ0FLSUE4MkFnUWdDaUFVUVFGMk5nSUFJQWNnREVFQmFqWUMrQVlnRTBFQ2FpRVREQUFMQUFzZ0UwRUJhaUVUREFFTEMwR1lsTUFBUVRaQjBKVEFBQkNjQmdBTElBZEJnQWRxSUFkQjBBVnFLQUlBTmdJQUlBZEIrQVpxSUFkQnlBVnFLUUlBTndNQUlBY2dCeWtDd0FVM0EvQUdRWURQMGdCQkt5QUhRZkFHYWtIZ2g4b0FRZURJeWdBUWpBUUFDMEdieDhvQVFSbEJ0TWZLQUJEOUJBQUxJQWRCRUdvZ0Z5QWFJQWxCQ0dvaUZSREJCQUpBSUFjb0FoQWlDUVJBSUFkQmdBVnFJQWtnQnlnQ0ZCQmJEQUVMSUFkQmdBVnFFSkVGQ3dKQUlCY2dHaUFWUWVEQXlnQkJDeENCQlNJSlJRMEFJQWxCQ0dvb0FnQkJ5QUJzSVFvZ0NVRUVhaWdDQUNFTklBY29BcUFHSVJBZ0J5Z0NpQVVoRGlBSEtBS0VCU0VNQTBBZ0NrVU5BUUorQWtBQ1FBSkFJQTBvQWdCQkJHc09Bd0VBQWdBTFFZeUgwZ0JCQ2hEdUNRQUxJQTFCQ0dvcEF3QU1BUXNnQjBId0Jtb2dEVUVJYWlnQ0FDQU5RUXhxS0FJQUVKRUJJQWRCQ0dvZ0J5Z0M5QVlpRHlBSEtBTDRCaEFKSUFjdkFRaEJBWEVFUUNBSEx3RUtJUWtnRENBT0lHU25RYnpEeWdBUTVnY2dDVHNCQUFzZ0VBUkFJQWNnWkQ0Q3dBVWdCMEdnQm1vZ0IwSEFCV29RckFJYUN5QUhLQUx3QmlBUEVQVUpJR1JDQVh3TElXUWdEVUhJQUdvaERTQUtRY2dBYXlFS0RBQUxBQXNnQjBId0Jtb2dGVUdRd3NvQVFRUVF6d0VDUUNBSEtBTHdCa0dmZ0lDQWVFY05BQ0FIS0FMMEJpSUpLQUlBUVFaSERRQWdCMEhBQldvZ0NTZ0NDQ0FKS0FJTUVKRUJJQWNvQXNBRklBY29Bc1FGRVBVSkN5QUhRYWdFYWlBSFFZZ0ZhaWdDQURZQ0FDQUhJQWNwQW9BRk53T2dCQ0FIUWZBR2FoRGlDQXdCQ3lBSFFmQUdhaUFKS0FJSUlBa29BZ3dRa1FFZ0J5Z0M4QVlnQnlnQzlBWVE5UWtnQjBHZ0JHb2dDU2dDQ0NBSktBSU1FRnNMSUNCQmxNTEtBRUVKRUtNRUlXTWdCeUFnUVozQ3lnQkJDQkNqQkNKbE53T3dCU0FIUVlBRmFpQUJJQ0JCcGNMS0FFRUdFUGNESUdPbklRb2dCMEhBQldvUXZRVWdCeWdDaUFVaUNVRURkQ0VQSUFtdElXSkJBQ0VOSUFjb0FvUUZJUXdnQnlnQ2dBVWhDUU5BSUEwZ0QwY0VRQ0FIUWZBR2FpQUhRY0FGYWlBS0lBd2dEV29yQXdBUWdBSWdDa0VCYWlFS0lBMUJDR29oRFF3QkN3c2dEQ0FKRVBrSklBY2dZaUJqZkVJQmZTSmlOd1BRQmlCaUlHVlJCRUFnQjBHb0Iyb2dCMEhZQldvcEF3QTNBd0FnQjBHZ0Iyb2dCMEhRQldvcEF3QTNBd0FnQjBHWUIyb2dCMEhJQldvcEF3QTNBd0FnQjBHSUJHb2lDU0FIUWFnRWFpZ0NBRFlDQUNBSFFmZ0dhaUFIUWFnR2Fpa0RBRGNEQUNBSFFZQUhhaUFIUWJBR2Fpa0RBRGNEQUNBSFFZZ0hhaUFIUWJnR2Fpa0RBRGNEQUNBSElBY3BBOEFGTndPUUJ5QUhJQWNwQTZBRU53T0FCQ0FISUFjcEE2QUdOd1B3QmtIZ0FCQzZDQ0lOUW9HQWdJQVFOd01BSUExQkNHb2dCMEh3Qm1wQndBRDhDZ0FBSUEwZ0FUWUNUQ0FOSUNBMkFrZ2dEU0FIS1FPQUJEY0RVQ0FOUWRnQWFpQUpLQUlBTmdJQVFheU95Z0FNQ1FzZ0IwRUFOZ0x3QmlBSFFkQUdhaUFIUWJBRmFpQUhRZkFHYWtIY3c4b0FFUEVHQUFzZ0IwSG9BMm9nRnlBYUlDQkJrTC9LQUVFSUVORUVJQWRCOUFOcUlCY2dHaUFnUWZ5TnlnQkJCeERSQkNBWElCb2dJRUhaMHRJQVFRZ1F6QVVoRUNBWElCb2dJRUdZdjhvQVFRNFF2Z1VoT1NBSFFRQTJBb0FFSUFkQkFEWUNvQVFDUUFKQUlEa0VRQUpBSUFjb0F2Z0RJZ2tnQnlnQy9BTWlDa0dtdjhvQVFRVVE3QWRGQkVBZ0NTQUtRYXUveWdCQkNCRHNCMFVOQVNBWElCb2dPVUd6djhvQVFRa1F5QU1pQ1VVTkFTQUpLQUlBUVFKclFRcEpEUUVnQjBId0Jtb2dDUkRGQXlBSEtBTHdCaUFIS0FMMEJoRDFDUXdCQ3lBWElCb2dPVUc4djhvQVFRZ1F5QU1pQ1VVTkFDQUpLQUlBUVFKclFRcEpEUUFnQjBHQUJXb2dDUkRGQXlBSEtRS0VCU0ZrUVNVUS9RZ2hDa0VFUVFRUW53Z2lDVUdRME5JQU5nSUFJQWRCc0FOcUlBb2dDVUdNdmRJQVFRQVFnQWhCN01uU0FCQ1FCeUFIS0FLd0F4QzFCU0VKUVFoQkJCQ2ZDQ0lQUWVTKzBnQTJBZ1FnRHlBSk5nSUFRY3pLMGdBZ0QwSDh4TklBRU1rSFFmVEkwZ0FRZ1FnaENoQ1JCeUVKUVJCQkJCQ2ZDQ0lQUWR6STBnQTJBZ3dnRHlBSk5nSUlJQTlCN01iU0FEWUNCQ0FQSUFvMkFnQVFQeUVKUVJCQkJCQ2ZDQ0lLUWJ6SjBnQTJBZ3dnQ2lBSk5nSUlJQXBCbk1yU0FEWUNCQ0FLSUE4MkFnQWdDa0hjdjlJQVFRRVFnQWdoQ1NBSFFRQTJBdmdHSUFjZ1pEY0M4QVlnQjBIQUJXb2lDaUFKSUFkQjhBWnFRY0RSMGdBUTB3RWdDUkN5Q1NBSlFReEJCQkRqQkFKQUFrQUNRQ0FIS0FMQUJVRUZSZ1JBSUFkQnFBWnFJZ2tnQjBITUJXb29BZ0EyQWdBZ0J5QUhLUUxFQlRjRG9BWWdDaERWQkNBSFFmZ0dha0g0ejlJQUtRTUFOd01BSUFkQjhNL1NBQ2tEQURjRDhBWWdCeUFIS1FQSUJUY0RpQWNnQnlBSEtRUEFCVGNEZ0FjZ0IwSDhCbW9oRHlBSFFZQUhhaUVZSUFrb0FnQWhDZ05BSUFjb0FxUUdJUTREUUNBTUlRMERRQ0FLSUExTkJFQWdCMEhJQldvZ0QwRUlhaWtDQURjREFDQUhRZEFGYWlBUFFSQnFLQUlBTmdJQUlBY2dEeWtDQURjRHdBVWdCeWdDK0FZaEZDQUhLQUwwQmlFVElBY29BdkFHSVF3TUJ3c0NRQ0FPSUFvZ0RVR0EwdElBRU9BSElna3RBQUJCQmtZRVFDQUpLQUlJSUFrb0FneEJrTkxTQUVFRkVPd0hEUUVMSUExQkFXb2hEUXdCQ3d0QkVpRVVRYWpTMGdBaEV5QU9JQW9nRFVFQmEwR1kwdElBRU9BSExRQUFRUU5IRFFRZ0RpQUtJQTFCQW10QnZOTFNBQkRnQnlJV0xRQUFRUUZIRFFNZ0RVRUJhaUVNSUJZb0FnZ2dGaWdDREVIWjB0SUFRUWdRN0FkRkRRQUxBMEFnRFVFQmFpSU1JQXBQRFFFQ1FDQUhLQUtrQmlJV0lBb2dERUhrMHRJQUVPQUhJZ2t0QUFCQkJrY05BQ0FKS0FJSUlnNGdDU2dDRENJSlFmVFMwZ0JCQXhEc0IwVUVRQ0FPSUFsQjk5TFNBRUVERU93SERRTU1BUXNnRmlBS0lBMUIvTkxTQUJEZ0J5SU1MUUFBUVFGSERRUWdGaUFLSUExQkFXdEJqTlBTQUJEZ0J5SUpMUUFBUVFOSERRVWdDU2dDQ0NFS0lBd29BZ2doQ1NBSFFhZ0RhaUFNS0FJTUloRkJsTmJTQUJDcEJTQUhLQUtvQXlFT0lBY29BcXdESVJZZ0VRUkFJQllnQ1NBUi9Bb0FBQXNnQnlBS05nS3dCU0FIS1FPQUJ5QUhLUU9JQnlBS0VQOERJV1FnQnlBSFFiQUZhallDMEFZZ0J5Z0MrQVpGQkVBZ0IwSHdCbW9nR0JDa0FRc2dCeUFIUWZBR2FqWUN4QVVnQnlBSFFkQUdhallDd0FVZ0IwR2dBMm9nQnlnQzhBWWdCeWdDOUFZZ1pDQUhRY0FGYWtFb0VJNENJQWNvQXFRRElSMGdCeWdDOEFZaEZRSkFJQWNvQXFBRFFRRnhCRUFnRlNBZGFpSUpMUUFBSVF3Z0J5Z0NzQVVoQ2lBSklHU25RUmwySWdrNkFBQWdGU0FIS0FMMEJpQWRRUWhyY1dwQkNHb2dDVG9BQUNBVklCMUJCSFJySWdsQkJHc2dFVFlDQUNBSlFRaHJJQlkyQWdBZ0NVRU1heUFPTmdJQUlBbEJFR3NnQ2pZQ0FDQUhJQWNvQXZ3R1FRRnFOZ0w4QmlBSElBY29BdmdHSUF4QkFYRnJOZ0w0Qmd3QkN5QVZJQjFCQkhScklneEJCR3NnRVRZQ0FDQU1RUWhySWdrb0FnQWhDaUFKSUJZMkFnQWdERUVNYXlJSktBSUFJUXdnQ1NBT05nSUFJQXhCZ0lDQWdIaEdEUUFnRENBS0VLNEpDeUFIS0FLb0JpRUtDeUFOUVFGcUlRME1BQXNBQ3dBTElBZEJnQWRxSUFkQjBBVnFLUUlBTndNQUlBZEIrQVpxSUFkQnlBVnFLUUlBTndNQUlBY2dCeWtDd0FVM0EvQUdRZURSMGdCQkR5QUhRZkFHYWtHQTBOSUFRZkRSMGdBUWpBUUFDMEhNMHRJQUlSTkJEU0VVQzBFQUlRd2dCeWdDOUFZaUZrVU5BQ0FIS0FMd0JpRUtBa0FnQnlnQy9BWWlEMFVOQUNBS1FRaHFJUTBnQ2lrREFFSi9oVUtBZ1lLRWlKQ2d3SUIvZ3lGa1FRRWhDUU5BQWtBZ0NRUkFBMEFnWkVJQVVnMENJQXBCZ0FGcklRb2dEU2tEQUVKL2hVS0FnWUtFaUpDZ3dJQi9neUZrSUExQkNHb2hEUXdBQ3dBTElBY29BdkFHSVFvTUFnc2dDaUJrZXFkQkFYUkI4QUZ4YXlJSlFReHJLQUlBSUFsQkNHc29BZ0FRcmdrZ1pFSUJmU0JrZ3lGa0lBOUJBV3NpRHlFSkRBQUxBQXNnQjBIQUJXcEJFRUVJSUJaQkFXb1E2Z01nQ2lBSEtBTElCV3NnQnlnQ3dBVWdCeWdDeEFVUTBBZ0xJQWRCb0FacUVJRUhJQWNvQXFBR0lBY29BcVFHRUt3SklBd0VRQ0FIUVlBSGFpSUpJQWRCMEFWcUtBSUFOZ0lBSUFkQitBWnFJZ29nQjBISUJXb3BBd0EzQXdBZ0J5QUhLUVBBQlRjRDhBWWdCeWdDZ0FRRVFDQUhRWUFFYWhDRUF3c2dCMEdVQkdvZ0Npa0RBRGNDQUNBSFFad0VhaUFKS0FJQU5nSUFJQWNnRkRZQ2lBUWdCeUFUTmdLRUJDQUhJQXcyQW9BRUlBY2dCeWtEOEFZM0Fvd0VJQWNvQW9BRklBY29Bb1FGRVBVSkRBRUxJQWNnRkRZQzlBWWdCeUFUTmdMd0JrSEV2OG9BUVFnZ0IwSHdCbXBCMElmS0FFSE12OG9BRUl3RUFBc0NRQ0FYSUJvZ09VSGN2OG9BUVFrUXpBVWlDVVVOQUNBSktBSUFRUUpyUVFsTkRRQWdCMEhFQkdvZ0Z5QWFJQWxCQ0dwQi9JM0tBRUVIRU5FRUlBZEIwQVJxSUFrUXhRTUNRQUpBSUFjb0FzZ0VJZzBnQnlnQ3pBUkI1Yi9LQUVFR0VPd0hSUTBBSUFjb0F0UUVJVElnQnlnQzJBUWhLeUFIUVFBMkFzZ0dJQWNnS3pZQ3hBWWdCeUF5TmdMQUJpQUhRWmdEYWlBSFFjQUdhaUlKRU1RRklBY3RBSmdEUlEwQklBY3RBSmtESUFjZ0J5Z0N5QVpCQVdvMkFzZ0dJQWRCa0FOcUlBa1F4QVVnQnkwQWtBTkZEUUVnQnkwQWtRTWhEQ0FISUFjb0FzZ0dRUUZxSWdrMkFzZ0dRUUZIRFFFZ0RFRUVTd1JBSUFjZ0NTQU1ha0VFYXpZQ3lBWUxJQWRCaUFOcUlBZEJ3QVpxSWc0UW9RUWdCeThCaUFOQkFYRkZEUUVnQnk4QmlnTWhDU01BUVNCckloVWtBQUovUVFFZ0NVVU5BQnBCQUNBT0VLUUZRZjhCY1NJTVJRMEFHaUFWUVFocUlBNGdDVUVCYWlBTWJCRGlCUUpBSUJVb0FnZ2lDa1VOQUNBVktBSU1JUWtnRlNBTU9nQWNJQlVnQ2pZQ0ZDQVZJQWsyQWhnZ0ZTQVZRUlJxRU9RRUlCVW9BZ0JCQVhGRkRRQWdEaUFPS0FJSUlCVW9BZ1JxTmdJSUN5QUtRUUJIQ3lBVlFTQnFKQUJGRFFFZ0IwSHdCbW9nRGhEWEJTQUhMUUNBQnlJSlJRMEJJQWRCcUFacUlBZEIrQVpxS1FJQU53TUFJQWRCc3dacUlBZEJnd2RxTFFBQU9nQUFJQWNnQnlrQzhBWTNBNkFHSUFjZ0J5OEFnUWM3QUxFR0lBY2dDVG9Bc0FaQkFDRU5JQWRCZ0FOcUlBZEJvQVpxUVFBUXNRTWdCeWdDZ0FNaUNVVU5BU0FIS0FLRUF5RU1BMEFnRFVHQUEwY0VRQ0FIUWZBR2FpQU5ha0lBTndNQUlBMUJDR29oRFF3QkN3dEJBQ0VhSUFkQkFEWUMxQVVnQnlBTU5nTEVCU0FISUFrMkFzQUZJQWRCQURzQjJBVWdCMEl3TndMTUJTQUhJQWRCOEFacU5nTElCVU52RW9NNklZRUJRMjhTZ3pvaGVrRUFJUWxCQUNFVlFRQWhDa0VBSVJkQkFDRVVBMEFDUUNBSFFmZ0NhaUFIUWNBRmFoRFlBU0FITHdINEFrRUJjVVVOQUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBSEx3SDZBaUlPUVE5ckRnUUJBZ2NEQUFzQ1FDQU9RZFFKYXc0Q0JRWUFDeUFPUWM0SlJnMERJQTVCdHdsR0RRY2dEa0VDUncwSklBZEJ3QVZxRUY1RkRRa2dCeWdDekFVaUV5QUhMd0hZQlNJT1R3MEpJQTRnRTBIZ3djQUFFTGdKQUFzZ0IwSG9BR29nQjBIQUJXb1E4QVFnQnlnQ2JDRVBJQWNvQW1naEZBd0lDeUFIUWZBQWFpQUhRY0FGYWhEd0JDQUhLQUowSVF3Z0J5Z0NjQ0VYREFjTFFRQWhDaUFIUWNBRmFpSU9FRjVGRFFZZ0IwR0FBV29nRGhDTUJ5QUhLQUtFQVVFQ1J3MEdJQWNvQW9BQkloTXJBd0Q4QWlJT1FRQklEUVlnRXlzRENQd0NJaE5CQUVnTkJpQVRyU0FPSUJOcXJVSWdob1FoWWtFQklRb01CZ3RCQVNFYURBVUxJQWRCa0FGcUlBZEJ3QVZxRVBBRUlBY29BcFFCSVJZZ0J5Z0NrQUVoRlF3RUN5QUhRWmdCYWlBSFFjQUZhaER3QkNBSEtBS2NBU0VZSUFjb0FwZ0JJVEVNQXdzZ0IwSDRBR29nQjBIQUJXb1E4QVFnQnlnQ2ZDRUpJQWNvQW5oQkFYRU5BZ3dFQ3lBSFFjQUZhaUlPRUY1RkRRTWdCMEdJQVdvZ0RoQ01CeUFIS0FLTUFVRUdSdzBCSUFjb0FvZ0JJZzRyQXlpMklYc2dEaXNESUxZaGZDQU9Ld01ZdGlHQkFTQU9Ld01RdGlGOUlBNHJBd2kySVg0Z0Rpc0RBTFloZWd3QkN3c2dDVVVOQVNBSFFmQUdhaUlOSUFkQndBWnFJZzRRMXdVZ0J5MEFnQWNpSDBVTkFTQUhRZGdHYWlBSFFmZ0dhaUlkS1FJQU53TUFJQWRCemdacUlBZEJnd2RxSWhNdEFBQTZBQUFnQnlBSEtRTHdCamNEMEFZZ0J5QUhMd0NCQnpzQnpBWWdEU0FPRU5jRklBY3RBSUFISWlkRkRRRWdCMEdJQldvZ0hTa0NBRGNEQUNBSFFlWUdhaUFUTFFBQU9nQUFJQWNnQnlrQzhBWTNBNEFGSUFjZ0J5OEFnUWM3QWVRR0lBa2dLMHNOQVNBSElESTJBc0FGSUFjZ0s2MGlaU0FKclVJZ2hvUTNBc1FGSUEwZ0IwSEFCV29pRFJEWEJTQUhMUUNBQnlJbFJRMEJJQWRCdUFWcUlCMG9BZ0EyQWdBZ0IwSHFCbW9nRXkwQUFEb0FBQ0FISUFjcEF2QUdOd093QlNBSElBY3ZBSUVIT3dIb0JrRUFJUWxCZ0lBRUlBY29BdndHSWhrZ0pXNGlFMEVCYXlJT1FRQWdEaUFUVFJzaURpQU9RWUNBQkU4YklodEIvLzhEY1VVTkFVRUJJUk1DUUNBVVFRRnhSUTBBSUE4aUNVRUNUUTBBSUFrZ0swc05BaUFISURJMkFzQUZJQWNnQ2ExQ0lJWWdaWVEzQXNRRklBZEI4QUpxSUEwUWxRVWdCeTBBOEFKRkRRSUNmd0pBQWtBQ1FBSkFJQWN0QVBFQ0RnTUFBUUlIQ3lBSEtBTElCU0lPSUJ0QkFYUkIvdjhIYWtIKy93ZHhJZzFxSWdrZ0Rra05CaUFKSUFjb0FzUUZTdzBHSUFjb0FzQUZJQTVxSVE1QkF3d0RDeUFIUWZnR2FpQUhRY2dGYWlnQ0FEWUNBQ0FISUFjcEFzQUZOd1B3QmlBYlFRRnJJUTFCQUNFSkEwQWdEVUgvL3dOeEloMUZCRUFnQ1VILy93TnhRUU5zSVExQkJDRWhEQU1MSUFjZ0J5Z0MrQVpCQW1vMkF2Z0dJQWRCNEFKcUlBZEI4QVpxRUpVRklBY3RBT0FDUlEwR0lCMGdCeTBBNFFJaURrME5CaUFKUVFGcUlRa2dEU0FPUVg5emFpRU5EQUFMQUFzZ0IwSDRCbW9nQjBISUJXb29BZ0EyQWdBZ0J5QUhLUUxBQlRjRDhBWWdHMEVCYXlFTlFRQWhDUU5BSUExQi8vOERjU0lkUlFSQUlBbEIvLzhEY1VFQ2RDRU5RUVVoSVF3Q0N5QUhJQWNvQXZnR1FRSnFOZ0w0QmlBSFFlZ0NhaUFIUWZBR2FoQ2hCQ0FITHdIb0FrRUJjVVVOQlNBZElBY3ZBZW9DSWc1TkRRVWdDVUVCYWlFSklBMGdEa0YvYzJvaERRd0FDd0FMSUFjb0FzZ0ZJZzRnRFdvaUNTQU9TU0FKSUFjb0FzUUZTM0lpQ1EwRElBY29Bc0FGSUE1cUlRNUJCaUFoSUFrYkN5RUpJQTZ0SUEydFFpQ0doQ0ZrQzBFQUlRNENRQ0FYUVFGeFJRUkFRUUFoREF3QkN5QU1RUUZORFFBZ0RDQXJTdzBDSUFjZ01qWUM4QVlnQnlBTXJVSWdoaUJsaERjQzlBWWdCMEhZQW1vZ0IwSHdCbW9pREJDVkJTQUhMUURZQWtVTkFpQUhMQURaQWlFVElBZEIwQUpxSUF3UWxRVWdCeTBBMEFKRkRRSWdCeTBBMFFJaEZ3Si9Ba0FDUUNBVFFmOEFjUTRDQUFFRkN5QVhJQWNvQXZnR0lnNXFJZ3dnRGtrTkJDQU1JQWNvQXZRR1N3MEVJQWNnRERZQytBWWdCeWdDOEFZZ0Rtb2hJVUVDREFFTElBY29BdmdHSWc0Z0YwRUJkRUgrQTNFaUYyb2lEQ0FPU1EwRElBd2dCeWdDOUFaTERRTWdCeUFNTmdMNEJpQUhLQUx3QmlBT2FpRWhRUU1MSVF3Q2Z5QVRRUUJPQkVCQkFDRU9RUUVNQVFzZ0IwSElBbW9nQjBId0Jtb1FsUVVnQnkwQXlBSkZEUU1nQnlnQytBWWlEU0FITFFESkFrRURiQ0lPYWlJVElBMUpEUU1nRXlBSEtBTDBCa3NOQXlBSEtBTHdCaUFOYWdzaEV5QWhyU0FYclVJZ2hvUWhZd3RCQVNFWEFuOENmd0pBSUJwRkJFQWdDa0VCY1VVRVFFRUFJUTlCQVNFVVFRRWhHRUVBREFNTElHSkNJSWluSWdvZ1lxY2lGVWtnQ2lBclMzSU5CU0FLSUJWcklRcEJBQ0VOQTBBZ0RVR0FBMGNFUUNBSFFmQUdhaUFOYWtJQU53TUFJQTFCQ0dvaERRd0JDd3RCQUNFTklBZEJBRFlDMUFVZ0J5QUtOZ0xFQlNBSFFRQTdBZGdGSUFkQ01EY0N6QVVnQnlBVklESnFOZ0xBQlNBSElBZEI4QVpxTmdMSUJVRUFJUXBCQUNFUEEwQUNRQ0FIUWNBQ2FpQUhRY0FGYWhEWUFTQUhMd0hBQWtFQmNVVU5BQUpBQWtBQ1FDQUhMd0hDQWtFVGF3NERBQUVDQkFzZ0IwRzRBbW9nQjBIQUJXb1E4QVFnQnlnQ3ZBSWhGQ0FIS0FLNEFpRVBEQU1MSUFkQm9BWnFJQWRCd0FWcUVKUUZJQWNvQXFBR0lRb2dCeXNEcUFhMklYOE1BZ3NnQjBHZ0Jtb2dCMEhBQldvUWxBVWdCeWdDb0FZaERTQUhLd09vQnJZaGVRd0JDd3NnZVVNQUFBQUFJQTFCQVhFYklZQUJJSDlEQUFBQUFDQUtRUUZ4R3lGNUlBOUJBWEZGRFFFZ0ZTQVVJQlZxSWdwTERRRWdDaUFyU3cwRklBZEJBRFlDeUFVZ0J5QXJJQXByTmdMRUJTQUhJQW9nTW1vMkFzQUZJQWRCOEFacUlBZEJ3QVZxRU5jRklBY3RBSUFISWhoRkRRVWdCMEh5QkdvZ0IwR0RCMm90QUFBNkFBQWdCeUFITHdDQkJ6c0I4QVFnQnlnQytBWWhGQ0FIS0FMMEJpRVBJQWNvQXZBR0lSY2dCeWdDL0FZTUFnc2dGRUVCY1VVZ0ZVRUJjVVZ5SURGQkFYRkZJQTlCQTBseWNpQVdJQ3RMY2cwRUlBY2dNallDd0FVZ0J5QVdyVUlnaGlCbGhEY0N4QVVnQjBId0Jtb2lGU0FIUWNBRmFoRFhCU0FITFFDQUJ5SUtSU0FZSUN0TGNnMEVJQWRCZ3dkcUxRQUFJUkVnQnk4QWdRY2dCeWdDL0FZaEZDQUhLQUw0QmlFUElBY29BdlFHSVJjZ0J5Z0M4QVloRmlBSElESTJBdkFHSUFjZ0dLMUNJSVlnWllRM0F2UUdJQWRCc0FKcUlCVVF4QVVnQnkwQXNBSkZEUVFDUUFKQUFrQWdCeTBBc1FJT0JBQUhCd0VIQ3lBSEtBTDRCaUlZSUJ0Qi8vOERjU0lWYWlJTklCaEpEUVpCQUNFaElBMGdCeWdDOUFaTERRWU1BUXNnQnlnQzlBWWlGU0FIS0FMNEJpSVlTUTBGSUJVZ0dHc2hGVUVCSVNFTElCRkJFSFJ5SVEwZ0J5Z0M4QVlnR0dvaE1VRUVEQUlMUVFBaEQwRUJJUlJCQVNFWVFRQUxJUW9nQjBIdUJtb2dCMEh5QkdvdEFBQTZBQUFnQnlBSEx3SHdCRHNCN0FZZ0NrRUlkaUVOSUdOQ0lJaW5JVEVnWTZjaElTQVRJUlVnRGlFV0lBd0xJUndnQjBISUJXb2lKaUFIUWRnR2Fpa0RBRGNEQUNBSFFlb0VhaUlvSUFkQnpnWnFMUUFBT2dBQUlBZEJxQVpxSWlrZ0IwR0lCV29wQXdBM0F3QWdCMEhtQkdvaUtpQUhRZVlHYWkwQUFEb0FBQ0FIUWFnRmFpSWlJQWRCdUFWcUtBSUFOZ0lBSUFjZ0J5a0QwQVkzQThBRklBY2dCeThCekFZN0FlZ0VJQWNnQnlrRGdBVTNBNkFHSUFjZ0J5OEI1QVk3QWVRRUlBY2dCeWtEc0FVM0E2QUZJQWRCNGdScUloRWdCMEhxQm1vdEFBQTZBQUFnQjBIdUJHb2lIU0FIUWU0R2FpMEFBRG9BQUNBSElBY3ZBZWdHT3dIZ0JDQUhJQWN2QWV3R093SHNCQ0FNUVFSR0RRRWdCeUFOT3dDbEJ5QUhRYWNIYWlBTlFSQjJPZ0FBSUFkQnF3ZHFJQjB0QUFBNkFBQWdCeUFZT2dDb0J5QUhJQW82QUtRSElBY2dGRFlDb0FjZ0J5QVBOZ0tjQnlBSElCYzJBcGdISUFjZ0ZqWUNsQWNnQnlBVk5nS1FCeUFISURFMkFvd0hJQWNnSVRZQ2lBY2dCeUFjTmdLRUJ5QUhJQTQyQW9BSElBY2dFellDL0FZZ0J5QmpOd0wwQmlBSElBdzJBdkFHSUFjZ0J5OEI3QVE3QUtrSElBZEJ5QWRxSUNZcEF3QTNBZ0FnQjBIVEIyb2dLQzBBQURvQUFDQUhRZHdIYWlBcEtRTUFOd0lBSUFjZ0NUWUN0QWNnQnlDQUFUZ0NzQWNnQnlCNU9BS3NCeUFISUI4NkFOQUhJQWNnSnpvQTVBY2dCeUFIS1FQQUJUY0N3QWNnQnlBSEx3SG9CRHNBMFFjZ0J5QUhLUU9nQmpjQzFBY2dCeUJrTndLNEJ5QUhRZWNIYWlBcUxRQUFPZ0FBSUFkQjhBZHFJQ0lvQWdBMkFnQWdCMEg3QjJvZ0VTMEFBRG9BQUNBSElDVTZBUGdISUFjZ0dUWUM5QWNnQnlBYk93R2NDQ0FISUhzNEFwZ0lJQWNnZkRnQ2xBZ2dCeUNCQVRnQ2tBZ2dCeUI5T0FLTUNDQUhJSDQ0QW9nSUlBY2dlamdDaEFnZ0J5QXJOZ0tBQ0NBSElESTJBdndISUFjZ0J5OEI1QVE3QU9VSElBY2dCeWtEb0FVM0F1Z0hJQWNnQnk4QjRBUTdBUGtISUFjZ0J5OEJnQVU3QVo0SUlHUkNJSWluSVJZZ1pLY2hGUUovQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFsQkFXc09CUUVDQXdRRkFBc2dCMEVBT2dDa0JpQUhRWUNBa0FjMkFhQUdJQWRCNEFGcVFlVUJRUUpCQWhDY0JTQUhRUUEyQXNnRklBY2dCeWtENEFFM0FzQUZJQWRCd0FWcUlBZEJvQVpxUWZqNHpRQVF5UUlnQnlnQ3lBVWhGeUFIS0FMRUJTRVlEQWNMSUFkQjZBRnFRYVlCUVFKQkFoQ2NCVUVBSVEwZ0IwRUFOZ0xJQlNBSElBY3BBK2dCTndMQUJTQUhRY0FGYWtHbUFSREtCeUFIS0FMSUJTSUpRYVlCYWlFWElBY29Bc1FGSWhnZ0NVRUJkR29oQ1FOQUlBa2dEV29nRFVIUXdzQUFhaThCQURzQkFDQU5RUUpxSWcxQnpBSkhEUUFMREFZTElBZEI4QUZxUWRjQVFRSkJBaENjQlVFQUlRMGdCMEVBTmdMSUJTQUhJQWNwQS9BQk53TEFCU0FIUWNBRmFrSFhBQkRLQnlBSEtBTElCU0lKUWRjQWFpRVhJQWNvQXNRRkloZ2dDVUVCZEdvaENRTkFJQWtnRFdvZ0RVR2N4Y0FBYWk4QkFEc0JBQ0FOUVFKcUlnMUJyZ0ZIRFFBTERBVUxRUUFoRnlBSFFRQTdBWWdGSUFjZ0ZqWUNoQVVnQnlBVk5nS0FCU0FIUVlnQ2FpQUhRWUFGYWhDcEJFRUNJUmhCQUNBSEx3R0lBa0VCY1VVTkJSb2dCeThCaWdJaENpQUhRWUFDYWtFRVFRSkJBaENjQlNBSEtBS0FBaUVKSUFjb0FvUUNJaGdnQ2pzQkFDQUhRUUUyQXFnR0lBY2dHRFlDcEFZZ0J5QUpOZ0tnQmlBSFFjZ0ZhaUFIUVlnRmFpZ0NBRFlDQUNBSElBY3BBb0FGTndQQUJVRUNJUTFCQVNFWEEwQWdCMEg0QVdvZ0IwSEFCV29RcVFRZ0J5OEIrQUZCQVhGRkRRUWdCeThCK2dFaENTQUhLQUtnQmlBWFJnUkFJQWRCb0FacVFRRVF5Z2NnQnlnQ3BBWWhHQXNnRFNBWWFpQUpPd0VBSUFjZ0YwRUJhaUlYTmdLb0JpQU5RUUpxSVEwTUFBc0FDeUFIUVFBMkFxZ0dJQWRDZ0lDQWdDQTNBcUFHSUJaQkEyNUIvLzhEY1NFUFFRQWhEUU5BSUExQi8vOERjU0lKSUE5UERRSWdDVUVEYkNJSlFRTnFJQlpMRFFJZ0IwSUROd0xFQlNBSElBa2dGV28yQXNBRklBZEJtQUpxSUFkQndBVnFJZzRRb1FRZ0J5OEJtQUpCQVhGRkRRSWdCeThCbWdJaERDQUhRWkFDYWlBT0VKVUZJQWN0QUpBQ1JRMENJQTFCQVdvaERTQUhMUUNSQWlFS0lBZEJvQVpxSWdrZ0RFR3N4OEFBRU53R0lBZEJBRG9BeEFVZ0J5QUtPd0hDQlNBSElBeEJBV283QWNBRklBa2dEa0c4eDhBQUVNa0NEQUFMQUFzZ0IwRUFOZ0tvQmlBSFFvQ0FnSUFnTndLZ0JpQmtRaUtJcDBILy93TnhJUTlCQUNFTkEwQWdEVUgvL3dOeElBOVBEUUVnRFVFQ2RFSDgvdzl4SWdsQkJHb2dGa3NOQVNBSFFnUTNBc1FGSUFjZ0NTQVZhallDd0FVZ0IwR29BbW9nQjBIQUJXb2lEaENoQkNBSEx3R29Ba0VCY1VVTkFTQUhMd0dxQWlFTUlBZEJvQUpxSUE0UW9RUWdCeThCb0FKQkFYRkZEUUVnRFVFQmFpRU5JQWN2QWFJQ0lRb2dCMEdnQm1vaUNTQU1RY3pId0FBUTNBWWdCMEVBT2dERUJTQUhJQW83QWNJRklBY2dERUVCYWpzQndBVWdDU0FPUWR6SHdBQVF5UUlNQUFzQUN5QUhLQUtvQmlFWElBY29BcVFHSVJnTElBY29BcUFHREFFTElBY29Bc0FGQ3lFZEFrQUNRQUpBQWtBQ1FBSkFBa0FnQnlnQzhBWkJBV3NPQXdFQ0F3QUxRWUFDSVEwZ0IwSEFCV3BCZ0FKQkFVRUJFSk1ESUFjb0FzUUZJUTRnQnlnQ3dBVkJBVVlOQlNBSEtBTElCU0lUUWV5OXdBQkJnQUw4Q2dBQURBUUxJd0JCSUdzaUFDUUFJQUJCQVRZQ0JDQUFRWVNQMGdBMkFnQWdBRUlCTndJTUlBQkN1UFRBZ09BQU53TVlJQUFnQUVFWWFqWUNDQ0FBUWREQXdBQVFxd2NBQ3lBSEtRTDBCaUZpUVFBaERTQUhRUUE3QVlnRklBY2dZamNDZ0FVZ0IwSElBV29nQjBHQUJXb1FuUVZCQVNFVFFRQWhEaUFITFFESUFVVU5BaUFITFFESkFTRUtJQWRCd0FGcVFRaEJBVUVCRUp3RklBY29Bc0FCSVFrZ0J5Z0N4QUVpRXlBS09nQUFJQWRCQVRZQ3FBWWdCeUFUTmdLa0JpQUhJQWsyQXFBR0lBZEJ5QVZxSUFkQmlBVnFLQUlBTmdJQUlBY2dCeWtDZ0FVM0E4QUZRUUVoRFFOQUlBZEJ1QUZxSUFkQndBVnFFSjBGSUFjdEFMZ0JSUTBDSUFjdEFMa0JJUWtnQnlnQ29BWWdEVVlFUUNBSFFhQUdhaUFOUVFGQkFVRUJFT01GSUFjb0FxUUdJUk1MSUEwZ0Uyb2dDVG9BQUNBSElBMUJBV29pRFRZQ3FBWU1BQXNBQzBFQUlSb2dCMEVBTmdLb0JpQUhRb0NBZ0lBUU53S2dCaUFIS0FMMEJpRVZJQWNvQXZnR0lnNUJBWFpCLy84RGNTRVBRUUVoRkVFQUlRMERRQUpBSUJwQi8vOERjU0FQVHcwQUlCcEJBWFJCL3Y4SGNTSUpRUUpxSUE1TERRQWdCMElDTndMRUJTQUhJQWtnRldvMkFzQUZJQWRCMkFGcUlBZEJ3QVZxSWdrUWxRVWdCeTBBMkFGRkRRQWdCeTBBMlFFaENpQUhRZEFCYWlBSkVKVUZJQWN0QU5BQlJRMEFJQnBCQVdvaEdrSC9BU0FITFFEUkFTQUtRZjhCY1dvaUNTQUpRZjhCVHhzaENVRUFJUXdEUUNBTVFRRnhEUUlnQ2tIL0FYRWlFeUFKUWY4QmNTSVdTdzBDSUJNZ0ZrOGhEQ0FIS0FLZ0JpQU5SZ1JBSUFkQm9BWnFRZURBd0FBUXJRTWdCeWdDcEFZaEZBc2dEU0FVYWlBS09nQUFJQWNnRFVFQmFpSU5OZ0tvQmlBVElCWkpJQXBxSVFvTUFBc0FDd3NnQnlnQ3BBWWhFd3NnQnlnQ29BWWhEZ3NnQjBIQUIyb2hGQ0FYSUEwZ0RTQVhTeHNoRmlBSFFhQUdhaEM5QlVFQUlRb2dHQ0VNQTBBQ1FBSkFBa0FDUUFKQUlBb2dGa2NFUUNBVElBMGdDa0g4djhvQUVQNEhJQW9nRjBZTkFTMEFBQ0VWSUFkQnFBRnFBbjhnREM4QkFDSUpRWVlEVFFSQUlBbEJBM1FpRDBHNHBjQUFhaWdDQUNFSklBOUJ0S1hBQUdvb0FnQU1BUXNnQjBHd0FXb2dGQ0FKUVljRGF4Q3hBeUFIS0FLd0FTSUpSUTBESUFkQndBVnFJQWtnQnlnQ3RBRVFaeUFIS0FMQUJVRUJSZzBESUFjb0FzZ0ZJUWtnQnlnQ3hBVUxJZzhnQ1JBSklBY3ZBYWdCUVFGeEJFQWdCeThCcWdFaENRd0VDeUFIUWFBQmFpQVBJQWtRRkNBSEx3R2dBVUVCY1VVTkJDQUhMd0dpQVNFSkRBTUxJQWRCMkFWcUlnOGdCMEc0Qm1vcEF3QTNBd0FnQjBIUUJXb2lDaUFIUWJBR2Fpa0RBRGNEQUNBSFFjZ0ZhaUlKSUFkQnFBWnFLUU1BTndNQUlBY2dCeWtEb0FZM0E4QUZJQWRCb0FScUVJZ0pJQWRCdUFScUlBOHBBd0EzQXdBZ0IwR3dCR29nQ2lrREFEY0RBQ0FIUWFnRWFpQUpLUU1BTndNQUlBY2dCeWtEd0FVM0E2QUVJQTRnRXhEMUNTQWRJQmhCQWtFQ0VNa0VJQUVvQXB3Q0lSb2dBU2dDbUFJaEZ5QUhLQUxJQkNFTkRBY0xJQmNnRjBHTXdNb0FFTVlFQUF0Qm5NREtBQkM3Q1FBTElBY2dDVHNCZ0FVZ0IwSEFCV29pQ1NBSFFZQUZha0VCRUhrZ0J5Z0N3QVZCZ0lDQWdIaEdEUUVnQjBINEJHb2dCMEhJQldvb0FnQTJBZ0FnQnlBSEtRTEFCVGNEOEFRZ0NTQUhRYUFHYWlBVklBZEI4QVJxRU9jQklBY29Bc0FGSUFjb0FzUUZFT0VJQ3lBS1FRRnFJUW9nREVFQ2FpRU1EQUVMQzBHQXo5SUFRU3NnQjBIc0JtcEI4SWZLQUVHc3dNb0FFSXdFQUFzZ0RpQUhLQUxJQlVHVTF0SUFFTXdJQUFzZ0J5Z0MwQVFnQnlnQzFBUVE5UWtnQnlnQ3hBUWdEUkQxQ1F3QkMwSHN2OG9BRUxzSkFBdEJnSUNBZ0hnaERRSkFJQmNnR2lBNVFiekF5Z0JCQnhESUF5SU1SUTBBSUF3b0FnQkJCMGNOQUNBSFFmQUdhaUFNS0FJSUlBd29BZ3dRa1FFZ0J5Z0M5QVloQ2lBSEtBTHdCaUVOQ3lBTklBb1E0UWdnQnlnQ29BUU5BUXNnQjBHQUJXb2dGeUFhSUNBUUhBd0JDeUFIUWJnR2FpQUhRYmdFYWlrREFEY0RBQ0FIUWJBR2FpQUhRYkFFYWlrREFEY0RBQ0FIUWFnR2FpQUhRYWdFYWlrREFEY0RBQ0FISUFjcEE2QUVOd09nQmlBSFFjQUZhaUFYSUJvZ0lCQWNJQWRCOEFacUlna1F2UVVDUUNBSEtBTEFCU0lOQkVBZ0J5Z0N6QVVoRENBSEtBTEVCU0VLSUFrUWhRTU1BUXNnQnlnQy9BWWhEQ0FIS0FMMEJpRUtJQWNvQXZBR0lRMExJQTFCQ0dvaERpQUtJQTFxUVFGcUlROGdEU2tEQUVKL2hVS0FnWUtFaUpDZ3dJQi9neUZpQW44Z0NrVUVRRUlBSVdOQkFBd0JDeUFIUWZBR2FrRVFRUWdnQ2tFQmFoRHFBeUFITlFMMEJpQU5JQWNvQXZnR2E2MUNJSWFFSVdNZ0J5Z0M4QVlMSVFrZ0IwR2dCbW9nREVFQmFrRUJkaUFNSUFjb0Fxd0dHeUFIUWJBR2FoQ3NDQ0FISUdNM0FwUUhJQWNnQ1RZQ2tBY2dCeUFNTmdLSUJ5QUhJQTAyQW9BSElBY2dEellDL0FZZ0J5QU9OZ0w0QmlBSElHSTNBL0FHSUFkQnhBVnFJUW9DUUFOQUlBeEZEUUVnQjBId0Jtb1FuUVFoRGlBSElBY29Bb2dIUVFGcklndzJBb2dISUE1QkRHc29BZ0FpQ1VHQWdJQ0FlRWNFUUNBT1FSQnJLQUlBSVE4Z0J5QU9RUWhyS1FJQU53TElCU0FISUFrMkFzUUZJQWNnRHpZQ3dBVWdCMEhRQm1vZ0IwR2dCbW9nRHlBS0VPY0JJQWNvQXRBR0lnbEJnSUNBZ0hoR0RRRWdDU0FIS0FMVUJoQ3BDUXdCQ3dzZ0RFVU5BQU5BSUFkQjhBWnFFSjBFSVFvZ0J5QUhLQUtJQjBFQmF5SUpOZ0tJQnlBS1FReHJLQUlBSUFwQkNHc29BZ0FRcVFrZ0NRMEFDd3NnQnlnQ2tBY2lDUVJBSUFjb0FwZ0hJQWtnQnlnQ2xBY1EwQWdMSUFkQmlBVnFJQWRCcUFacUtRTUFOd01BSUFkQmtBVnFJQWRCc0FacUtRTUFOd01BSUFkQm1BVnFJQWRCdUFacUtRTUFOd01BSUFjZ0J5a0RvQVkzQTRBRkN3SkFBa0FDUUFKQUFrQUNRQUpBSUJBRVFDQVFLQUlBUVFackRnUUJOallDTmdzZ0J5Z0NnQVFpRGtVTkFpQU9RUWhxSVF3Z0RpQUhLQUtFQkNJSmFrRUJhaUVQSUFjb0Fvd0VJUW9nQjBIUUJtb1FrUVVnRGlrREFFSi9oVUtBZ1lLRWlKQ2d3SUIvZ3lGaUFuOGdDVVVFUUVJQUlXTkJBQXdCQ3lBSFFmQUdha0VRUVFnZ0NVRUJhaERxQXlBSE5RTDBCaUFPSUFjb0F2Z0dhNjFDSUlhRUlXTWdCeWdDOEFZTElRa2dCeUJqTndLVUJ5QUhJQWsyQXBBSElBY2dDallDaUFjZ0J5QU9OZ0tBQnlBSElBODJBdndHSUFjZ0REWUMrQVlnQnlCaU53UHdCaUFIS0FMWUJpRU1JQWNvQXRRR0lSQURRQUpBQWtBQ1FDQUtSUTBBSUFkQjhBWnFFSjBFSVFrZ0J5QUhLQUtJQjBFQmF5SUtOZ0tJQnlBSlFReHJLQUlBSWhoQmdJQ0FnSGhIQkVBZ0NVRVFheWdDQUNFV0lBZEJ3QVZxSUFsQkNHc3BBZ0FpWXFjaUZDQmlRaUNJcHlJVkVKRUJJQWRCMEFCcUlBY29Bc1FGSWc0Z0J5Z0N5QVVRQ1NBSEx3RlNJUThnQnk4QlVDQUhLQUxBQlNBT0VQVUpRUUZ4UlEwQ0lCQWdEQ0FXUWNUQXlnQVE1Z2NnRHpzQkFBd0RDeUFLUlEwQUEwQWdCMEh3Qm1vUW5RUWhDaUFISUFjb0FvZ0hRUUZySWdrMkFvZ0hJQXBCREdzb0FnQWdDa0VJYXlnQ0FCQ3BDU0FKRFFBTEN5QUhLQUtRQnlJSkJFQWdCeWdDbUFjZ0NTQUhLQUtVQnhEUUNBdEJBU0V4SUFjb0F0QUdJU0VNQ1FzZ0IwSEFCV29nRkNBVkVKRUJJQWNvQXNBRklBY29Bc1FGRVBVSkN5QVlJQlFROVFrTUFBc0FDeUFIUWZBR2FpSUpJQkFvQWdnZ0VDZ0NEQkNSQVNBSEtBTHdCaUFIS0FMMEJoRDFDU0FKSUJBb0FnZ2dFQ2dDREJCYklBY29BdmdHSVF3Z0J5Z0M5QVloRUF3Q0N5QUhRZUFBYWlBWElCb2dFRUVJYWlJb0VNRUVBa0FnQnlnQ1lDSUpCRUFnQjBHZ0JXb2dDU0FIS0FKa0VGc01BUXNnQjBHZ0JXb1FrUVVMQWtBZ0Z5QWFJQ2hCNE1ES0FFRUxFSUVGSWdsRkRRQWdDVUVFYWlnQ0FDSVRJQWxCQ0dvb0FnQkJ5QUJzYWlFaUlBZEJvZ1pxSVNrZ0IwSHlCbW9oS2lBSFFmNEdhaUVaSUFkQnpnVnFJUndnQjBINEJtb2hHMElBSVdRRFFDQVRJQ0pHRFFFZ0J5QVhJQm9nRXhDNUF5SUpOZ0xRQkNBVFFjZ0FhaUVUQWtBQ1FBSkFJQWtvQWdCQkJHc09Bd0VBQWdBTElBZEJBVFlDOUFZZ0IwSDR3Y29BTmdMd0JpQUhRZ0UzQXZ3R0lBZEJDallDeEFVZ0J5QUhRY0FGYWpZQytBWWdCeUFIUWRBRWFqWUN3QVVnQjBId0JtcEJnTUxLQUJDckJ3QUxJQWtwQXdnaFpBd0JDeUFIUWNBR2FpQUpLQUlJSUFrb0Fnd1FrUUVnQjBIWUFHb2dCeWdDeEFZaUVTQUhLQUxJQmhBSkFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUhMd0ZZUVFGeEJFQWdCeThCV2lFSklBY29BcVFGSUFjb0FxZ0ZJR1NuSWdwQjdNREtBQkRtQnlBSk93RUFJQWNvQW9BRlJRME9JQWNnQ1RzQnhBUWdCMEd3QldvaUNTQUhRWUFGYWlBS0VKY0NJQWNvQXJ3RkJFQWdCMEh3Qm1vZ0IwSEVCR3BCQVJCNUlBY29BdkFHUVlDQWdJQjRSZzBDSUFkQnlBVnFJQnNvQWdBMkFnQWdCeUFIS1FMd0JqY0R3QVVnQ1NBSFFjQUZhaERUQXd3T0N5QUhLQUt3QlNFSklBZEI4QVpxSWhVZ0IwSEVCR29pRUVFQkVIa2dCeWdDOEFZaURrR0FnSUNBZUVZTkFpQUpRUWhySWd3b0FnQWdDVUVFYXlJUEtBSUFJQWNvQXZRR0lnb2dCeWdDK0FZUTdBY2dEaUFLRVBVSkRRMGdEeWdDQUNFSklBd29BZ0FoQ2lBcVFRaHFRZ0EzQVFBZ0trSUFOd0VBSUJ3Z0J5a0I4QVkzQVFBZ0hFRUlhaUFiS1FFQU53RUFJQnhCRUdvZ0IwR0FCMm92QVFBN0FRQWdCMEVCT2dDVUJpQUhRZ0EzQW93R0lBY2dDallDaEFZZ0IwRUFOZ0tBQmlBSFFRQTZBUHdGSUFkQkFEWUMrQVVnQjBFQU9nRDBCU0FIUVFBMkF2QUZJQWRCQURvQTdBVWdCMEVBTmdMb0JTQUhRUUE2QU9RRklBZEJBRHNCNEFVZ0IwRUFPd0hNQlNBSFFRQTJBc0FGSUFjZ0NTQUthallDaUFZZ0IwRUFPZ0NZQmlBSFFZQ0F4QUEyQXNnRklCVWdFRUVCRUhrZ0J5Z0M4QVlpQ2tHQWdJQ0FlRVlOQXlBSEtBTDRCaUVKSUFjb0F2UUdJUXdnS1VFSWFrSUFOd0VBSUNsQ0FEY0JBQ0FaUVJCcUlBZEJzQVpxTHdFQU93RUFJQmxCQ0dvZ0IwR29CbW9wQVFBM0FRQWdHU0FIS1FHZ0JqY0JBQ0FIUVFBNkFNZ0hJQWRCQVRvQXhBY2dCMElBTndLOEJ5QUhJQWtnREdvMkFyZ0hJQWNnRERZQ3RBY2dCMEVBTmdLd0J5QUhRUUE2QUt3SElBZEJBRFlDcUFjZ0IwRUFPZ0NrQnlBSFFRQTJBcUFISUFkQkFEb0FuQWNnQjBFQU5nS1lCeUFIUVFBNkFKUUhJQWRCQURzQmtBY2dCMEVBT3dIOEJpQUhRWUNBeEFBMkF2Z0dJQWRCQURZQzhBWURRQUpBSUFkQndBVnFFQ2toRHlBSFFmQUdhaEFwSUE5QmdJREVBRVlOQUNBUFJnMEJDd3NnQjBId0Jtb1E1UWdnQjBIQUJXb1E1UWdnQ2lBTUVQVUpEQTBMSUFjb0FvQUZSUTBOSUFjb0F1d0RJUjhDUUNBSEtBTHdBeUlsUVF4UEJFQkJBQ0VQUVFFaENVRUJJUXBCQUNFTlFRRWhFQU5BSUEwZ0Qyb2lGVUVLU3cwR0lBb2hEQUpBSUFsQnNNSEtBR290QUFBaURpQVZRYkRCeWdCcUxRQUFJZ2xKQkVBZ0NpQU5ha0VCYWlJS0lBOXJJUkJCQUNFTkRBRUxJQWtnRGtjRVFFRUJJUkFnREVFQmFpRUtRUUFoRFNBTUlROE1BUXRCQUNBTlFRRnFJZ29nQ2lBUVJpSUpHeUVOSUFwQkFDQUpHeUFNYWlFS0N5QUtJQTFxSWdsQkMwa05BQXRCQUNFVVFRRWhDVUVCSVFwQkFDRU5RUUVoRGdOQUlBMGdGR29pRmtFS1N3MEhJQW9oREFKQUlBbEJzTUhLQUdvdEFBQWlGU0FXUWJEQnlnQnFMUUFBSWdsTEJFQWdDaUFOYWtFQmFpSUtJQlJySVE1QkFDRU5EQUVMSUFrZ0ZVY0VRRUVCSVE0Z0RFRUJhaUVLUVFBaERTQU1JUlFNQVF0QkFDQU5RUUZxSWdvZ0NpQU9SaUlKR3lFTklBcEJBQ0FKR3lBTWFpRUtDeUFLSUExcUlnbEJDMGtOQUFzZ0R5QVVJQThnRkVzaUNSc2lGVUVNVHcwSElCQWdEaUFKR3lJS0lCVnFJZ2tnQ2trTkNDQUpRUXRMRFFrQ1FFR3d3Y29BSUFwQnNNSEtBR29nRlJDd0JTSVVCRUJCQ3lBVmF5SUpJQlVnQ1NBVlN4dEJBV29oQ2tGL0lReEN3b0NBZ0lDRXVNd0FJV01nRlNFSlFYOGhEd3dCQzBFQUlRMUJBU0VQUVFFaENVRUFJUkFEUUNBSklnd2dEV29pRmtFS1RRUkFJQWxCZjNNZ0RXc2lDVUVMYWlFT0lBbEJkVWtORFVFS0lBMGdFR3BySWdsQkMwOE5EZ0pBSUE1QnNNSEtBR290QUFBaURpQUpRYkRCeWdCcUxRQUFJZ2xKQkVBZ0ZrRUJhaUlKSUJCcklROUJBQ0VOREFFTElBa2dEa2NFUUNBTVFRRnFJUWxCQUNFTlFRRWhEeUFNSVJBTUFRdEJBQ0FOUVFGcUlnNGdEaUFQUmlJSkd5RU5JQTVCQUNBSkd5QU1haUVKQ3lBS0lBOUhEUUVMQzBFQUlRMUJBU0VQUVFFaENVRUFJUTREUUNBSklnd2dEV29pR0VFS1RRUkFJQWxCZjNNZ0RXc2lDVUVMYWlFV0lBbEJkVWtORDBFS0lBMGdEbXBySWdsQkMwOE5FQUpBSUJaQnNNSEtBR290QUFBaUZpQUpRYkRCeWdCcUxRQUFJZ2xMQkVBZ0dFRUJhaUlKSUE1cklROUJBQ0VOREFFTElBa2dGa2NFUUNBTVFRRnFJUWxCQUNFTlFRRWhEeUFNSVE0TUFRdEJBQ0FOUVFGcUloWWdEeUFXUmlJSkd5RU5JQlpCQUNBSkd5QU1haUVKQ3lBS0lBOUhEUUVMQzBFTElROUJDeUFPSUJBZ0RpQVFTeHRySVFrZ0NrVUVRRUlBSVdOQkFDRUtRUUFoREF3QkMwRUFJUXhDQUNGalFRQWhEUU5BUWdFZ0RVR3d3Y29BYWpFQUFJWWdZNFFoWXlBS0lBMUJBV29pRFVjTkFBc0xJQWRCQ3pZQ3JBY2dCMEd3d2NvQU5nS29CeUFISUNVMkFxUUhJQWNnSHpZQ29BY2dCeUFQTmdLWUJ5QUhJQXcyQXBRSElBY2dKVFlDa0FjZ0J5QUtOZ0tJQnlBSElBazJBb1FISUFjZ0ZUWUNnQWNnQnlCak53UDRCaUFIUVFFMkF2QUdJQWRCQURZQ2pBY2dCMEhBQldvaEppQVVRUUJISVNkQkN5QWJLQUlRSWgxcklRMGdHeWdDSENFSklCc29BZ2doRHlBYktRTUFJV0lnR3lnQ0ZDRU1BMEJCQUNBSklDY2JJUlJCQ3lBUElBa2dEeUFKSUE5TEd5QW5HeUlLSUFwQkMwMGJJUmdDUUNBYkFuOERRQ0FsSUF4QkNtb2lDVTBFUUNBYklDVTJBaFJCQUNFSkRBTUxJQnNDZnlCaUlBa2dIMm94QUFDSVFnR0RVRVVFUUNBTUlCOXFJUllnQ2lFSkFrQUNRQU5BSUFrZ0dFWUVRQ0FQSVFrQ1FBTkFJQWtnRkUwRVFDQWJJQXhCQzJvaUNUWUNGQ0FuUlFSQUlCdEJBRFlDSEFzZ0ppQUpOZ0lJSUNZZ0REWUNCRUVCSVFrTUN3c2dDVUVCYXlJSlFRdFBEUVVnSlNBSklBeHFJZzVMQkVBZ0NVR3d3Y29BYWkwQUFDQU9JQjlxTFFBQVJ3MENEQUVMQ3lBT0lDVkJvSWZLQUJER0JBQUxJQnNnRENBZGFpSU1OZ0lVSUNjTkJpQU5EQWNMSUFrZ0RHb2lGU0FsVHcwQklBa2dGbW9oRUNBSlFiREJ5Z0JxSUFsQkFXb2hDUzBBQUNBUUxRQUFSZzBBQ3lBVklBOXJRUUZxREFNTElDVWdDaUFNYWlJQUlBQWdKVWtiSUNWQnNJZktBQkRHQkFBTElBbEJDMEdRaDhvQUVNWUVBQXNnREVFTGFnc2lERFlDRkNBbkRRQUxRUUFMSWdrMkFod01BUXNMSUNZZ0NUWUNBQ0FIS0FMQUJRMEJEQTRMUWJEQnlnQkJDeUFmSUNVUTdBZEZEUTBMSUFkQjBBWnFJZ29nQjBHQUJXb2daS2NRbHdJZ0J5Z0MzQVlFUUNBSFFmQUdhaUlKUVFGQkFCQ1hCU0FLSUFrUTB3TU1EUXRCdThIS0FFRWZFTzRKQUF0QmdNL1NBRUVySUFkQjdBWnFRZkNIeWdCQm9NSEtBQkNNQkFBTFFZRFAwZ0JCS3lBSFFld0dha0h3aDhvQVFmekF5Z0FRakFRQUMwR0F6OUlBUVNzZ0IwSHNCbXBCOElmS0FFR013Y29BRUl3RUFBc2dGVUVMUWVUK3dBQVF4Z1FBQ3lBV1FRdEI1UDdBQUJER0JBQUxJQlZCQzBIRS9zQUFFTGdKQUFzZ0NpQUpRZFQrd0FBUXR3a0FDeUFKUVF0QjFQN0FBQkM0Q1FBTElBNUJDMEgwL3NBQUVNWUVBQXNnQ1VFTFFZVC93QUFReGdRQUN5QVdRUXRCOVA3QUFCREdCQUFMSUFsQkMwR0UvOEFBRU1ZRUFBc2dCeWdDZ0FWRkRRQWdCeUJrUGdMd0JpQUhRWUFGYWlBSFFmQUdhaENzQWhvTElBY29Bc0FHSUJFUTlRa2daRUlCZkNGa0RBQUxBQXNnQjBId0Jtb2dLRUdRd3NvQVFRUVF6d0VDUUNBSEtBTHdCa0dmZ0lDQWVFY0VRQ0FIUWRBRmFpQUhRWUFIYWlnQ0FEWUNBQ0FIUWNnRmFpQUhRZmdHYWlrQ0FEY0RBQ0FISUFjcEF2QUdOd1BBQlF3QkN5QUhRY0FGYWlBSEtBTDBCaEM1QkFzQ1FBSkFJQWNvQXNBRlFaK0FnSUI0UmdSQUlBZEI4QVpxUVFSeUlBY29Bc1FGSUFjb0FzZ0ZFSkVCSUFkQm40Q0FnSGcyQXZBR0lBY29BcWdGSVF3Z0J5Z0NwQVVoRUNBSEtBS2dCU0VoREFFTElBZEJnQWRxSUFkQjBBVnFLQUlBTmdJQUlBZEIrQVpxSUFkQnlBVnFLUU1BTndNQUlBY2dCeWtEd0FVaVlqY0Q4QVlnQnlnQ3FBVWhEQ0FIS0FLa0JTRVFJQWNvQXFBRklTRWdZcWRCbjRDQWdIaEhEUUVMSUFjb0F2UUdJQWNvQXZnR0VQVUpEQU1MSUFkQjhBWnFFTTRDREFJTElBY29BdmdESUFjb0F2d0RRYXUveWdCQkNCRHNCMFVFUUVFQUlURkJnSUNBZ0hnaElRd0VDeUFIUWNnQWFrR0FBa0VDUVFKQitQak5BQkNhQlNBSFFRQTJBdmdHSUFjZ0J5a0RTRGNDOEFZZ0IwSHdCbW9RMWdjZ0J5Z0M5QVlpRUNBSEtBTDRCaUlNUVFGMGFpRUtRWUJ3SVEwRFFDQUtJQTFCNUw3S0FHb29BZ0FpQ1FSL0lBZEJRR3NnQ1NBTlFlaSt5Z0JxS0FJQUVBa2dCeThCUUVFQmNVVU5CQ0FITHdGQ0JVRUFDenNCQUNBS1FRSnFJUW9nREVFQmFpRU1JQTFCQ0dvaURRMEFDd3NnQnlnQzhBWWhJUXRCQUNFeERBRUxRYmo5elFBUXV3a0FDeUFIUWNBRmFoQzlCU0FIUWZBR2FpSUtJQmNnR2lBZ1FaVEN5Z0JCQ1JERUJpQUhLUVA0QmlGa0lBY3BBL0FHSVdVZ0NpQVhJQm9nSUVHZHdzb0FRUWdReEFZZ0J5a0QrQVloWXlBSEtRUHdCaUZpSUJjZ0dpQWdRYVhDeWdCQkJoRElBeUlKQkg4Z0NpQUJJQWtRM1FFZ0J5Z0M4QVlGUVlDQWdJQjRDeUVkSUFjb0F2UUdJUk1DUUFKQUlHV25SU0JpVUhKRklCMUJnSUNBZ0hoSGNVVUVRQ0FIUVRocVFRUkIwQUlRaEFnZ0J5Z0NPQ0lSRFFFQUN5QUhLQUw0QmlFS0lBY2dZemNEMEFRZ0NrRURkQ0VKSUFxdElXSWdaS2NoQ2tFQUlRMERRQ0FKSUExSEJFQWdCMEh3Qm1vZ0IwSEFCV29nQ2lBTklCTnFLd01BRUlBQ0lBcEJBV29oQ2lBTlFRaHFJUTBNQVFzTElCTWdIUkQ1Q1NBSElHSWdaSHhDQVgwaVlqY0R3QVlnWWlCalVRMEJJQWRCQURZQzhBWWdCMEhBQm1vZ0IwSFFCR29nQjBId0JtcEJyTUxLQUJEeEJnQUxJQkZCeWdFMkFzd0NJQkZCb09EUkFEWUN5QUlnRVVFTU5nTEVBaUFSUWZidHp3QTJBc0FDSUJGQkREWUN2QUlnRVVHUWh0SUFOZ0s0QWlBUlFic0NOZ0swQWlBUlFkQ2YwUUEyQXJBQ0lCRkJGVFlDckFJZ0VVRzh5czRBTmdLb0FpQVJRUXMyQXFRQ0lCRkIyTnJSQURZQ29BSWdFVUc3QWpZQ25BSWdFVUc0NU5BQU5nS1lBaUFSUVJVMkFwUUNJQkZCdk1yT0FEWUNrQUlnRVVFTU5nS01BaUFSUWNDZjBRQTJBb2dDSUJGQnV3STJBb1FDSUJGQm9LblFBRFlDZ0FJZ0VVRVZOZ0w4QVNBUlFiekt6Z0EyQXZnQklCRkJFRFlDOUFFZ0VVR281TkFBTmdMd0FTQVJRYnNDTmdMc0FTQVJRWWp1endBMkF1Z0JJQkZCRlRZQzVBRWdFVUc4eXM0QU5nTGdBU0FSUVFvMkF0d0JJQkZCa0tuUUFEWUMyQUVnRVVHK0FUWUMxQUVnRVVHZ3lzOEFOZ0xRQVNBUlFRdzJBc3dCSUJGQjl1M1BBRFlDeUFFZ0VVRUdOZ0xFQVNBUlFmRHR6d0EyQXNBQklCRkJ1d0kyQXJ3QklCRkJzSWJQQURZQ3VBRWdFVUVWTmdLMEFTQVJRYnpLemdBMkFyQUJJQkZCQ1RZQ3JBRWdFVUhKd2M4QU5nS29BU0FSUWJzQ05nS2tBU0FSUWJDR3p3QTJBcUFCSUJGQkZUWUNuQUVnRVVHOHlzNEFOZ0tZQVNBUlFSRTJBcFFCSUJGQnVNSFBBRFlDa0FFZ0VVRzdBallDakFFZ0VVR0F5ODRBTmdLSUFTQVJRUlUyQW9RQklCRkJ2TXJPQURZQ2dBRWdFVUVWTmdKOElCRkJsb2JQQURZQ2VDQVJRYnNDTmdKMElCRkJnTXZPQURZQ2NDQVJRUlUyQW13Z0VVRzh5czRBTmdKb0lCRkJEallDWkNBUlFZaUd6d0EyQW1BZ0VVRzdBallDWENBUlFhaVB6Z0EyQWxnZ0VVRVZOZ0pVSUJGQnZNck9BRFlDVUNBUlFRYzJBa3dnRVVIenlzNEFOZ0pJSUJGQnV3STJBa1FnRVVHb2o4NEFOZ0pBSUJGQkZUWUNQQ0FSUWJ6S3pnQTJBamdnRVVFUE5nSTBJQkZCNU1yT0FEWUNNQ0FSUWJzQ05nSXNJQkZCcUkvT0FEWUNLQ0FSUVJVMkFpUWdFVUc4eXM0QU5nSWdJQkZCRXpZQ0hDQVJRZEhLemdBMkFoZ2dFVUc3QWpZQ0ZDQVJRYWlQemdBMkFoQWdFVUVWTmdJTUlCRkJ2TXJPQURZQ0NDQVJRUXcyQWdRZ0VVR3d5czRBTmdJQVFRQWhHaUFIS0FMd0F5RVVJQWNvQXV3RElSZ0NRQUpBQTBBZ0lVR0FnSUNBZUVZaEZnSkFBMEFnR2tIUUFrWU5CQ0FSSUJwcUlRMGdHa0VZYWlFYUlBMG9BZ0FnRFNnQ0JDQVlJQlFRN0FkRkRRQWdGZzBCSUEwb0FoQWlEeUFOS0FJVVFSaHNhaUVWQTBBZ0R5QVZSZzBCSUFkQk1Hb2dEeWdDRUNBUEtBSVVFQWtnQnk4Qk1FRUJjUVJBSUE5QkdHb2hDVUVBSVEwZ0J5OEJNaUVPSUJBaENnTkFJQXdnRFVZRVFDQUpJUThNQXdzZ0RpQUtMd0VBUmdSQUlBZEI4QVpxSUFkQndBVnFJQTBnRHlzRENCQ0FBZ3NnRFVFQmFpRU5JQXBCQW1vaENnd0FDd0FMQ3d0QnlNTEtBQkM3Q1FBTElBZEI4QVpxUVlBQ1FRRkJBa0VDRUk4RElBY29BdlFHSVE0Z0J5Z0M4QVpCQVVjRVFDQUhLQUw0QmlFVklBMG9BaFJCR0d3aERDQU5LQUlRSVFvRFFBSkFBbjhDUUFKQUlBd0VRQ0FISUFvMkF2QUdJQW9wQXdCQ2YxRU5CQ0FLUVJScUtBSUFJUThnQ2tFUWFpZ0NBQ0VKSUJnZ0ZFR1FodElBUVF3UTdBY05BaUFIUVNocUlBa2dEeEFKSUFjdkFTaEJBWEZGRFFFZ0J5OEJLZ3dEQ3lBTktBSVVRUmhzSVFvZ0RTZ0NFQ0VOQTBBZ0NnUkFJQWRCOEFacUlBZEJ3QVZxSUEwb0FnQWdEU3NEQ0JDQUFpQUtRUmhySVFvZ0RVRVlhaUVOREFFTEMwR0FBaUVNSUFkQkdHcEJnQUpCQWtFQ0VLRUZJQWNvQWhnaElTQUhLQUljSWhBZ0ZVR0FCUHdLQUFBZ0RpQVZFTzhKREFZTFFlakN5Z0FRdXdrQUN5QUhRU0JxSUFrZ0R4QVVJQWN2QVNCQkFYRkZEUVVnQnk4Qklnc2hDU0FWUVlBQ0lBb29BZ0JCK01MS0FCRG1CeUFKT3dFQUN5QUtRUmhxSVFvZ0RFRVlheUVNREFBTEFBc0xJQTRnQnlnQytBWkIyTUxLQUJETUNBQUxJd0JCSUdzaUFDUUFJQUJCQVRZQ0JDQUFRYVREeWdBMkFnQWdBRUlCTndJTUlBQkI3QUEyQWh3Z0FDQUhRZkFHYWpZQ0dDQUFJQUJCR0dvMkFnZ2dBRUdzdzhvQUVLc0hBQXNnRVVIUUFrRUVFT01FSUIxQmdJQ0FnSGhHRFFBZ0hTQVRFS2dKQ3lBSFFhQUdhaUFnUWJ6Q3lnQkJEQkRkQlNBSFFaZ0hhaUFIUWNnRmFpa0RBRGNEQUNBSFFhQUhhaUFIUWRBRmFpa0RBRGNEQUNBSFFhZ0hhaUFIUWRnRmFpa0RBRGNEQUNBSFFmZ0dhaUFIUVlnRmFpa0RBRGNEQUNBSFFZQUhhaUFIUVpBRmFpa0RBRGNEQUNBSFFZZ0hhaUFIUVpnRmFpa0RBRGNEQUNBSElBY3BBOEFGTndPUUJ5QUhJQWNwQTRBRk53UHdCaUFIS0FLZ0JpRUpJQWNyQTZnR0lXY2dNU0FIS0FLQUJFVnlSUVJBSUFkQmdBUnFFSVFEQ3lBSEtBTDBBeUFIS0FMNEF4RDFDU0FIS0FMb0F5QUhLQUxzQXhEMUNVSG9BQkM2Q0NJTlFvR0FnSUFRTndNQUlBMUJDR29nQjBId0JtcEJ3QUQ4Q2dBQUlBMGdERFlDWUNBTklCQTJBbHdnRFNBaE5nSllJQTBnQVRZQ1ZDQU5JQ0EyQWxBZ0RTQm5SQUFBQUFBQUFBQUFJQWtiT1FOSVFaQ095Z0FNQndzZ0IwSEFCV29pQ2lBTUtBSUlJQXdvQWd3UWtRRUNRQ0FIS0FMRUJTSU1JQWNvQXNnRklnbEIrY1RLQUVFS0VPd0hEUUFnRENBSlFhakl5Z0JCQ2hEc0J3MEFJQWRCQVRZQzlBWWdCMEhJeU1vQU5nTHdCaUFIUWdFM0F2d0dJQWRCeUFBMkFxUUdJQWNnQjBHZ0JtbzJBdmdHSUFjZ0NqWUNvQVlnQjBId0JtcEIwTWpLQUJDckJ3QUxRUXhCQkJDZkNDSVdRZi8vQXpZQ0NDQVdRZ0kzQWdCQkRFRUVFSjhJSWhOQkFEWUNDQ0FUUW9DQWdJRHcvejgzQWdBZ0J5Z0N3QVVnREJEMUNVRUJJUlZCQVNFaFFRRWhHRUVCSVE0TUF3dEIwSlhBQUNFV1FSa2hHQXNnQnlnQzhBWWdCeWdDOUFZUXJ3a2dCeWdDL0FZZ0J5Z0NnQWNRcndsQmdJQ0FnSGdMSVE0Z0IwSEFCV29ROWdnZ0RrR0FnSUNBZUVZTkFTQUhLQUtnQmlBUUVQVUpDeUFIUWNnRGFpQVhJQm9nSUJBY0lBZEI4QVpxSWdrZ0Z5QWFJQjFCbUwvS0FFRU9FTWdEUVlESnlnQkJDRUdJeWNvQUVLb0lFTmtFSUFsQm1NbktBRUVNUWFUSnlnQVFyd1FhSUFrZ0hVRzB5Y29BUVFJUXp3RkVBQUFBQUFCQWowQWhhQUpBSUFrUWxnZ2lDVVVOQUNBSktBSUFRUVJIRFFBZ0NTa0RDTGtoYUFzZ0IwSHdCbW9pQ2lBZFFmT0F6Z0JCQVJEUEFRSi9RWUNBZ0lCNElBb1FsZ2dpQ1VVTkFCb2dDaUFYSUJvZ0NSQzVBeERiQkFKQUFrQWdCeWdDOEFaQm40Q0FnSGhHQkVBZ0J5Z0M5QVlpQ1NnQ0JDRU5JQWNnQ1NnQ0NDSU1RUVJCQkVINCtNMEFFSm9GUVFBaENpQUhRUUEyQXFnR0lBY2dCeWdDQkNJVU5nS2tCaUFISUFjb0FnQWlDVFlDb0FZZ0IwSEFCV3BCQkhJaER3SkFBa0FnQ1NBTVNRUkFJQWRCb0FacVFRQWdERUVFUVFRUTRRVWdCeWdDcUFZaENpQUhLQUtrQmlFVURBRUxJQXhGRFFFTElBb2dER29nRkNBS1FRSjBhaUVLQTBBZ0NpQVhJQm9nRFJDNUF6WUNBQ0FOUWNnQWFpRU5JQXBCQkdvaENpQU1RUUZySWd3TkFBc2hDZ3NnRHlBSEtRS2dCamNDQUNBUFFRaHFJQW8yQWdBTUFRc2dCMEhRQldvZ0IwR0FCMm9vQWdBMkFnQWdCMEhJQldvZ0IwSDRCbW9wQWdBM0F3QWdCeUFIS1FMd0JpSmlOd1BBQlNCaXAwR2ZnSUNBZUVjTkFRc2dCeWdDekFVaER5QUhLQUxJQlNFVUlBY29Bc1FGREFFTElBZEJ3QVZxRU0wQ1FZQ0FnSUI0Q3lFZElBZEI4QVpxRUwwRklCMUJnSUNBZ0hoR0RRRkJBQ0VKQTBBZ0NTQVBUd1JBSUIwZ0ZFRUVRUVFReVFRTUF3VUNmeUFVSUE4Z0NVRUJha0c0eWNvQUVPY0hLQUlBSWhBb0FnQkJDRVlFUUNBSFFjQUZhaUlNSUJRZ0R5QUpRY2pKeWdBUTV3Y29BZ0FpQ2lnQ0FDQUtRUWhxS1FNQUVMd0VJQXhCMk1uS0FFRVFRZWpKeWdBUTBnU25JUW9nRUVFTWFpZ0NBRUhJQUd3aERTQVFRUWhxS0FJQUlRd0RRQ0FOQkVBZ0IwSEFCV29nQjBId0Jtb2dDaUFNRUtNSEVJQUNJQXBCQVdvaENpQU5RY2dBYXlFTklBeEJ5QUJxSVF3TUFRVkJBZ3dEQ3dBTEFBc2dCMEhBQldvaURDQVVJQThnQ1VINHljb0FFT2NIS0FJQUlnb29BZ0FnQ2tFSWFpa0RBQkM4QkNBTVFZakt5Z0JCRTBHY3lzb0FFTklFSVdVZ0RDQVVJQThnQ1VHc3lzb0FFT2NIS0FJQUlnb29BZ0FnQ2tFSWFpa0RBQkM4QkNCbElBeEJ2TXJLQUVFU1FkREt5Z0FRMGdRaVlpQmlJR1ZUR3lCbGZTRmtJR1duSVEwZ0ZDQVBJQWxCNE1yS0FCRG5CeWdDQUJDakJ5Rm5BMzhnWkZBRWYwRURCU0FIUWNBRmFpQUhRZkFHYWlBTklHY1FnQUlnWkVJQmZTRmtJQTFCQVdvaERRd0JDd3NMSUFscUlRa01BUXNBQ3dBTElBY2dHRFlDOUFZZ0J5QVdOZ0x3QmtHQXo5SUFRU3NnQjBId0JtcEIwSWZLQUVId3lNb0FFSXdFQUFzZ0IwSFlCV29pRHlBSFFZZ0hhaWtEQURjREFDQUhRZEFGYWlJS0lBZEJnQWRxS1FNQU53TUFJQWRCeUFWcUlna2dCMEg0Qm1vcEF3QTNBd0FnQnlBSEtRUHdCamNEd0FVZ0J5Z0NnQVVnQnlnQ2hBVVE5UWxCK0FBUXVnZ2lEU0FoTmdJc0lBMGdFellDS0NBTklCVTJBaVFnRFNBWU5nSWdJQTBnRmpZQ0hDQU5JQTQyQWhnZ0RTQm9PUU1RSUExQ0FUY0RDQ0FOUW9HQWdJQVFOd01BSUEwZ0J5a0R3QVUzQXpBZ0RVRTRhaUFKS1FNQU53TUFJQTFCUUdzZ0Npa0RBRGNEQUNBTlFjZ0FhaUFQS1FNQU53TUFJQTBnQnlrRHlBTTNBMUFnRFVIWUFHb2dCMEhRQTJvcEF3QTNBd0FnRFVIZ0FHb2dCMEhZQTJvcEF3QTNBd0FnRFVIb0FHb2dCMEhnQTJvcEF3QTNBd0FnRFNBQk5nSjBJQTBnSURZQ2NFSElqc29BQ3lFSklBY29BcndESUFjb0FzQURFUFVKSUVJZ0NUWUNCQ0JDSUEwMkFnQWdCMEh3Q1dva0FDQUxLUU1nSVdJZ0MwRVlhaUFMS0FJb0lnb2dDeWdDTENCbUVMd0ZJQXN0QUJ3aENTQUtJQXNvQWhoQmJHeHFJZzlCQ0dzZ1lqY0NBQ0FQUVF4cklEWTJBZ0FnRDBFUWF5QTROZ0lBSUE5QkZHc2dQellDQUNBTElBc29BalJCQVdvMkFqUWdDeUFMS0FJd0lBbEJBWEZyTmdJd0N5QVBRUVJyS0FJQUlRb2dEMEVJYXlnQ0FDSVBJQThvQWdCQkFXb2lDVFlDQUNBSlJRMFZJQXNvQXNnRElBc29Bc3dERU5RSElBc2dDallDekFNZ0N5QVBOZ0xJQXlBTElEY29BZ0FnSGlnQ0FFRUJRZERkeWdBUTVRY1Fvd2M1QTlBRElBdEIrQVJxSUVnZ05oQ1JBU0FMS0FMNEJDQUxLQUw4QkJEMUNRd2lDeUFiSUJGQkNHb2lFV29nRG5FaEd3d0FDd0FMSUQ4Z0N5Z0NnQVZCbE5iU0FCRE1DQXdTQ3lBTFFZZ0ZhaUFMUWNnTWFpZ0NBRFlDQUNBTFFZQUZhaUFMUWNBTWFpa0NBRGNEQUNBTElBc3BBcmdNTndQNEJFR0F6OUlBUVNzZ0MwSDRCR3BCd0lmS0FFSEEzY29BRUl3RUFBc2dDeUFKUVJCcUtBSUFJQWxCRkdvb0FnQkJBRUhnM2NvQUVPVUhFS01IT1FQd0F3d2RDeUFMSUFsQkVHb29BZ0FnQ1VFVWFpZ0NBRUVBUWZEZHlnQVE1UWNRb3dkRUFBQUFBQUFBV1VDak9RUG9Bd3djQ3lBTElBbEJFR29vQWdBZ0NVRVVhaWdDQUVFQVFZRGV5Z0FRNVFjUW93YzVBK0FEREJzTElBc2dDVUVRYWlnQ0FDQUpRUlJxS0FJQVFRQkJrTjdLQUJEbEJ4Q2pCemtEMkFNTUdnc2dDMEdJQldvZ0MwSElER29vQWdBMkFnQWdDMEdBQldvZ0MwSEFER29wQWdBM0F3QWdDeUFMS1FLNEREY0QrQVJCZ00vU0FFRXJJQXRCK0FScVFjQ0h5Z0JCZ04vS0FCQ01CQUFMSUF0QmlBVnFJQXRCeUF4cUtBSUFOZ0lBSUF0QmdBVnFJQXRCd0F4cUtRSUFOd01BSUFzZ0N5a0N1QXczQS9nRVFZRFAwZ0JCS3lBTFFmZ0Vha0hBaDhvQVFhRGZ5Z0FRakFRQUN5QUpRUlJxSWdvb0FnQkJCa2NFUUVIYzNNb0FRUzlCa09ES0FCQ2NCZ0FMSUFsQkVHb2lDU2dDQUVFR1FRQkJzTi9LQUJEbEJ4Q2pCeUZxSUFrb0FnQWdDaWdDQUVFQlFjRGZ5Z0FRNVFjUW93Y2hheUFKS0FJQUlBb29BZ0JCQWtIUTM4b0FFT1VIRUtNSElXa2dDU2dDQUNBS0tBSUFRUU5CNE4vS0FCRGxCeENqQnlGb0lBa29BZ0FnQ2lnQ0FFRUVRZkRmeWdBUTVRY1Fvd2NoWnlBTElBa29BZ0FnQ2lnQ0FFRUZRWURneWdBUTVRY1Fvd2M1QStBTUlBc2daemtEMkF3Z0N5Qm9PUVBRRENBTElHazVBOGdNSUFzZ2F6a0R3QXdnQ3lCcU9RTzREQ0FMUWZnRWFpSUpJQXRCdUF4cUlDd1FxUU1nTENBSlFURDhDZ0FBREJjTElBa29BaEFoRUNBTFFRaHFJQWtvQWhRaUQwRUlRUWhCK1BqTkFCQ2FCU0FMUVFBMkFvQUZJQXNnQ3lrRENEY0MrQVFnQzBINEJHb2dEeERWQnlBTEtBS0FCU0VKSUFzb0F2d0VJUnNnRHdSQUlBa2dEMm9nR3lBSlFRTjBhaUVKQTBBZ0NTQVFFS01IT1FNQUlCQkJ5QUJxSVJBZ0NVRUlhaUVKSUE5QkFXc2lEdzBBQ3lFSkN5QUxLQUw0QkFzaENpQUxLQUtVQkNBTEtBS1lCQkNvQ1NBTElBazJBcHdFSUFzZ0d6WUNtQVFnQ3lBS05nS1VCQXdWQ3lBSktBSVFJUkFnQzBFUWFpQUpLQUlVSWc5QkNFRUlRZmo0elFBUW1nVWdDMEVBTmdLQUJTQUxJQXNwQXhBM0F2Z0VJQXRCK0FScUlBOFExUWNnQ3lnQ2dBVWhDU0FMS0FMOEJDRWJJQThFUUNBSklBOXFJQnNnQ1VFRGRHb2hDUU5BSUFrZ0VCQ2pCemtEQUNBUVFjZ0FhaUVRSUFsQkNHb2hDU0FQUVFGcklnOE5BQXNoQ1FzZ0N5Z0MrQVFMSVFvZ0N5Z0NpQVFnQ3lnQ2pBUVFxQWtnQ3lBSk5nS1FCQ0FMSUJzMkFvd0VJQXNnQ2pZQ2lBUU1Fd3NnQ1VFUWFpZ0NBQ0FKUVJScUtBSUFRUUJCNE43S0FCRGxCeUlKS0FJQVFRaEhEUklnQ1NnQ0RFSElBR3doRHlBSktBSUlJUkFEUUNBUFJRMFRBa0FDUUFKQUFrQWdFQ2dDQUVFRWF3NEVBQUVEQWdNTElCQkJDR29wQXdBaFlpQUxLd1BvQXlGb0lBc3JBOUFESVdjZ0xVSUFOd01BSUMxQkNHcENBRGNEQUNBTFFvQ0FnSUNBZ0lENFB6Y0QrQVFnQzBJQU53T2dCU0FMUW9DQWdJQ0FnSUQ0UHpjRGtBVWdDeUJvSUdjZ1lybEVBQUFBQUFCQWo4Q2pSQUFBQUFBQUFBQUFvS0tpT1FPWUJTQUxRYmdNYWlJSklBdEIrQVJxSUM0UXFRTWdMaUFKUVREOENnQUFEQUlMSUJCQkJHb3FBZ0FoZWlBTEt3UG9BeUZvSUFzckE5QURJV2NnTFVJQU53TUFJQzFCQ0dwQ0FEY0RBQ0FMUW9DQWdJQ0FnSUQ0UHpjRCtBUWdDMElBTndPZ0JTQUxRb0NBZ0lDQWdJRDRQemNEa0FVZ0N5Qm9JR2NnZXJ0RUFBQUFBQUJBajhDalJBQUFBQUFBQUFBQW9LS2lPUU9ZQlNBTFFiZ01haUlKSUF0QitBUnFJQzRRcVFNZ0xpQUpRVEQ4Q2dBQURBRUxJQXRCK0FScUlBdEJ5QUJxSUJCQkNHb29BZ0FnRUVFTWFpZ0NBQ0FHRUc4Z0N5Z0MrQVFpQ1VHaGdJQ0FlRVlOQUNBQUlBc3BBdndFTndJRUlBQkJER29nQzBHRUJXb3BBZ0EzQWdBTUZnc2dFRUhJQUdvaEVDQVBRY2dBYXlFUERBQUxBQXNnQ1VFUWFpZ0NBQ0FKUVJScUtBSUFRUUJCb043S0FCRGxCeUlKS0FJQVFRZEdCRUFnQzBINEJHb2dDMEhJQUdvZ0NTZ0NDQ0FKS0FJTUlBWVFieUFMS0FMNEJDSUpRYUdBZ0lCNFJnMFNJQUFnQ3lrQy9BUTNBZ1FnQUVFTWFpQUxRWVFGYWlrQ0FEY0NBQXdVQ3lBTFFRRTJBdndFSUF0QnlON0tBRFlDK0FRZ0MwSUJOd0tFQlNBTFFRazJBcndNSUFzZ0MwRzRER28yQW9BRklBc2dDMEgwQkdvMkFyZ01JQXRCK0FScVFkRGV5Z0FRcXdjQUN5QUpRUlJxSWdvb0FnQkJCa1lFUUNBSlFSQnFJZ2tvQWdCQkJrRUFRZnpieWdBUTVRY1Fvd2NoYWlBSktBSUFJQW9vQWdCQkFVR00zTW9BRU9VSEVLTUhJV3NnQ1NnQ0FDQUtLQUlBUVFKQm5OektBQkRsQnhDakJ5RnBJQWtvQWdBZ0NpZ0NBRUVEUWF6Y3lnQVE1UWNRb3djaGFDQUpLQUlBSUFvb0FnQkJCRUc4M01vQUVPVUhFS01ISVdjZ0N5QUpLQUlBSUFvb0FnQkJCVUhNM01vQUVPVUhFS01IT1FQZ0JDQUxJR2M1QTlnRUlBc2dhRGtEMEFRZ0N5QnBPUVBJQkNBTElHczVBOEFFSUFzZ2Fqa0R1QVFnTGlBTFFiZ0Vha0V3L0FvQUFBd1JDMEhjM01vQVFTOUJqTjNLQUJDY0JnQUxJQWxCRkdvaUNpZ0NBRUVDUmdSQUlBbEJFR29pQ1NnQ0FFRUNRUUJCek52S0FCRGxCeENqQnlGb0lBa29BZ0FnQ2lnQ0FFRUJRZHpieWdBUTVRY1Fvd2NoWnlBdFFnQTNBd0FnTFVFSWFrSUFOd01BSUF0Q2dJQ0FnSUNBZ1BnL053UDRCQ0FMSUdjNUE2QUZJQXNnYURrRG1BVWdDMEtBZ0lDQWdJQ0ErRDgzQTVBRklBdEJ1QXhxSWdrZ0MwSDRCR29nQzBHNEJHb2lDaENwQXlBS0lBbEJNUHdLQUFBZ0xpQUtRVEQ4Q2dBQURCQUxRWXpieWdCQkwwSHMyOG9BRUp3R0FBc2dDVUVVYWlJS0tBSUFRUUpHQkVBZ0NVRVFhaUlKS0FJQVFRSkJBRUhzMnNvQUVPVUhFS01ISVdnZ0N5QUpLQUlBSUFvb0FnQkJBVUg4MnNvQUVPVUhFS01ISW1lYU9RUHdBeUF0UWdBM0F3QWdMVUVJYWtJQU53TUFJQXRDZ0lDQWdJQ0FnUGcvTndQNEJDQUxJR2M1QTZBRklBc2dhRGtEbUFVZ0MwS0FnSUNBZ0lDQStEODNBNUFGSUF0QnVBeHFJZ2tnQzBINEJHb2dDMEc0QkdvaUNoQ3BBeUFLSUFsQk1Qd0tBQUFnTGlBS1FURDhDZ0FBREE4TFFZemJ5Z0JCTDBHODI4b0FFSndHQUFzQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUJBZ0NrSEZnYzRBUVFFUTdBZEZCRUFnRUNBS1FlMkF6Z0JCQVJEc0J3MEJJQkFnQ2tIZzFjb0FRUUlRN0FjTkFpQVFJQXBCdllIT0FFRUJFT3dIRFJZZ0VDQUtRY3VCemdCQkFSRHNCdzBPSUJBZ0NrSG1nTTRBUVFFUTdBY05GaUFRSUFwQnZvSE9BRUVCRU93SERSWWdFQ0FLUWVtQXpnQkJBUkRzQncwV0lCQWdDa0c0Z2M0QVFRRVE3QWNORmlBUUlBcEI0dFhLQUVFQ0VPd0hEUllnRUNBS1FjR0J6Z0JCQVJEc0J3MFBJQkFnQ2tIQWdjNEFRUUVRN0FjTkVDQVFJQXBCdDRIT0FFRUJFT3dIRFJFZ0VDQUtRY3FCemdCQkFSRHNCdzBESUJBZ0NrSE5nYzRBUVFFUTdBY05CQ0FRSUFwQnZJSE9BRUVCRU93SERRVWdFQ0FLUWVUVnlnQkJBaERzQncwR0lCQWdDa0hIZ2M0QVFRRVE3QWNORmlBUUlBcEI1dFhLQUVFQ0VPd0hEUllnRUNBS1FkNkF6Z0JCQVJEc0J3MFdJQkFnQ2tIbzFjb0FRUUlRN0FjTkZpQVFJQXBCdG9IT0FFRUJFT3dIRFJZZ0VDQUtRZStBemdCQkFSRHNCdzBJSUJBZ0NrSGlnTTRBUVFFUTdBY05DQ0FRSUFwQnVvSE9BRUVCRU93SERRZ2dFQ0FLUWZPQXpnQkJBUkRzQncwV0lCQWdDa0hxMWNvQVFRSVE3QWNORmlBUUlBcEJ3b0hPQUVFQkVPd0hEUWdnRUNBS1FlelZ5Z0JCQXhEc0IwVUVRQ0FRSUFwQjc5WEtBRUVERU93SFJRMElDeUFMS0FLMEJDSVBJQXNvQXF3RVJnUkFJd0JCRUdzaURDUUFJQXhCQ0dvZ0MwR3NCR29pQ2lBS0tBSUFRUUZCQkVFRUVJZ0NJQXdvQWdnaUNrR0JnSUNBZUVjRVFDQUtJQXdvQWd4QnJOYktBQkRNQ0FBTElBeEJFR29rQUFzZ0N5Z0NzQVFnRDBFQ2RHb2dDVFlDQUNBTElBOUJBV28yQXJRRURCWUxJQXNyQTVBRElXd2dDeXNEaUFNaGJTQUxLd09BQXlGdUlBc3JBL2dDSVc4Z0N5c0Q4QUloY0NBTEt3UG9BaUZ4QWtBZ0N5Z0N5QU1pQ1VVRVFFRUFJUWtNQVFzZ0N5Z0N6QU1oRUNBSklBa29BZ0JCQVdvaUNqWUNBQ0FLUlEwSkN5QUxLd1BBQXlGeUlBc3JBN2dESVhNZ0N5c0RzQU1oZENBTEt3T29BeUYxSUFzckE2QURJWFlnQ3lzRG1BTWhkeUFMS3dQNEF5RjRJQXNyQS9BRElXb2dDeXNENkFNaGF5QUxLd1BnQXlGcElBc3JBOWdESVdnZ0N5c0QwQU1oWndKQUlBc29Bc2dDUVlDQWdJQjRSd1JBSUF0QnVBeHFJRDRRUlF3QkN5QUxRWUNBZ0lCNE5nTElEQXNnQzBINEJHb2dDMEhJQUdvUVZTQXpJQXNvQW93RUlBc29BcEFFRVBnRUlGVWdSeEJWSUNRZ0N5Z0NtQVFnQ3lnQ25BUVErQVFnQ3lCNE9RT29DQ0FMSUdvNUE2QUlJQXNnYXprRG1BZ2dDeUJwT1FPUUNDQUxJR2c1QTRnSUlBc2daemtEZ0FnZ0N5QVFOZ0w4QnlBTElBazJBdmdISUFzZ2Nqa0Q4QWNnQ3lCek9RUG9CeUFMSUhRNUErQUhJQXNnZFRrRDJBY2dDeUIyT1FQUUJ5QUxJSGM1QThnSElBc2diRGtEd0FjZ0N5QnRPUU80QnlBTElHNDVBN0FISUFzZ2J6a0RxQWNnQ3lCd09RT2dCeUFMSUhFNUE1Z0hJQXNyQTRBRUlXY2dJeUFMUWJnTWFrRXcvQW9BQUNBTElHYzVBN0FJSUFzb0FxZ0VJZ29nQ3lnQ29BUkdCRUFqQUVFUWF5SVBKQUFnRDBFSWFpQUxRYUFFYWlJSklBa29BZ0JCQVVFSVFkZ0RFSWdDSUE4b0FnZ2lDVUdCZ0lDQWVFY0VRQ0FKSUE4b0FneEIzTnJLQUJETUNBQUxJQTlCRUdva0FBc2dDeWdDcEFRZ0NrSFlBMnhxSUF0QitBUnFRZGdEL0FvQUFDQUxJQXBCQVdvMkFxZ0VEQlVMSUFzb0FxZ0VJZ2xGRFJRZ0N5QUpRUUZySWdrMkFxZ0VJQXNvQXFRRUlBbEIyQU5zYWlJSktRTUFRaE5SRFJRZ0MwSFFDR29pQ2lBSlFkZ0QvQW9BQUNBTFFjZ0FhaUlKRU5NR0lBa2dDa0hZQS93S0FBQU1GQXNnTlNBMElBTkIwTTNLQUVFSkVNQUVJUW9nQzBHNERHb2dDVUVRYWlnQ0FDQUpRUlJxS0FJQVFRQkJ2TnJLQUJEbEJ4QzVCQ0FMS0FLNERFR2ZnSUNBZUVjTkJ5QTFJRFFnQ2lBTEtBSzhEQ0FMS0FMQURCREFCQ0lKS0FJWVFkZ0FiQ0VNSUFrb0FoUWhEMEVBSVFrRFFDQUpJQXhHRFJRZ0N5QUpJQTlxSWdvMkF1d01JQXBCekFCcUtBSUFJUTRDUUFKQUFrQWdDa0hRQUdvb0FnQkJCR3NPQWdFQUFnc2dEaTBBQUVIVEFFY05BU0FPTFFBQlFjMEFSdzBCSUE0dEFBSkI0UUJIRFFFZ0RpMEFBMEh6QUVjTkFTQU9MUUFFUWVzQVJ3MEJBa0FDUUFKQUlEVWdOQ0FLRUxrRElnNG9BZ0JCQm1zT0JBSUFBQUVBQ3lBTFFRRTJBdndFSUF0QnVNM0tBRFlDK0FRZ0MwSUJOd0tFQlNBTFFRbzJBcndNSUFzZ0MwRzRER28yQW9BRklBc2dDMEhzREdvMkFyZ01JQXRCK0FScVFjRE55Z0FRcXdjQUN5QUxRZmdFYWlJS0lBNUJDR29RUlNBK0VPUUlJRDRnQ2tFdy9Bb0FBQXdDQ3lBT0tBSUlJQTRvQWd4QjFkVFNBRUVFRU93SFJRMExJRDRRNUFnZ0MwR0FnSUNBZURZQ3lBSU1BUXNnRGkwQUFFSFVBRWNOQUNBT0xRQUJRZmtBUncwQUlBNHRBQUpCOEFCSERRQWdEaTBBQTBIbEFFY05BQ0FLS0FJQVFRWkhEUXNnQ3lBS1FRUnFOZ0s0RENBS1FRaHFLQUlBSUFwQkRHb29BZ0JCME0zS0FFRUpFT3dIUlEwTUN5QUpRZGdBYWlFSkRBQUxBQXNnQ3lnQzhBUWlDa1VORGlBTEtBTHNCQ0FLUVRoc2FpSVBRVGhySWdwRkRRNGdDaWtEQUNKaVFnTmFEUlVnRHlCaXAwRUNkQ0lLUVl6VzJnQnFLQUlBYWlzREFDRnFJQThnQ2tHWTF0b0FhaWdDQUdvckF3QWhheUFKUVJCcUlnb29BZ0FnQ1VFVWFpSUpLQUlBUVFCQmpOaktBQkRsQnhDakJ5RnBJQW9vQWdBZ0NTZ0NBRUVCUVp6WXlnQVE1UWNRb3djaGFDQUtLQUlBSUFrb0FnQkJBa0dzMk1vQUVPVUhFS01ISVdjZ0N5QUtLQUlBSUFrb0FnQkJBMEc4Mk1vQUVPVUhFS01IT1FPb0JTQUxJR2M1QTZBRklBc2dhRGtEbUFVZ0N5QnBPUU9RQlNBTElHczVBNGdGSUFzZ2Fqa0RnQVVnQzBJQ053UDRCQ0FMUWVnRWFpQUxRZmdFYWtITTJNb0FFS01HREJJTElBbEJFR29pQ2lnQ0FDQUpRUlJxSWdrb0FnQkJBRUdjMThvQUVPVUhFS01ISVdvZ0NpZ0NBQ0FKS0FJQVFRRkJyTmZLQUJEbEJ4Q2pCeUZySUFvb0FnQWdDU2dDQUVFQ1Fielh5Z0FRNVFjUW93Y2hhU0FLS0FJQUlBa29BZ0JCQTBITTE4b0FFT1VIRUtNSElXZ2dDaWdDQUNBSktBSUFRUUpCM05mS0FCRGxCeENqQnlGbklBc2dDaWdDQUNBSktBSUFRUU5CN05mS0FCRGxCeENqQnprRHFBVWdDeUJuT1FPZ0JTQUxJR2c1QTVnRklBc2dhVGtEa0FVZ0N5QnJPUU9JQlNBTElHbzVBNEFGSUF0Q0FqY0QrQVFnQzBIb0JHb2dDMEg0QkdwQi9OZktBQkNqQmd3UkN5QUxRZ1EzQS9nRUlBdEI2QVJxSUF0QitBUnFRWXpYeWdBUW93WU1FQXNnQ1VFUWFpSUtLQUlBSUFsQkZHb2lDU2dDQUVFQVField5Z0FRNVFjUW93Y2hhU0FLS0FJQUlBa29BZ0JCQVVITTFzb0FFT1VIRUtNSElXZ2dDaWdDQUNBSktBSUFRUUpCM05iS0FCRGxCeENqQnlGbklBc2dDaWdDQUNBSktBSUFRUU5CN05iS0FCRGxCeENqQnprRG1BVWdDeUJuT1FPUUJTQUxJR2c1QTRnRklBc2dhVGtEZ0FVZ0MwSUROd1A0QkNBTFFlZ0VhaUFMUWZnRWFrSDgxc29BRUtNR0RBOExBbjhDUUNBUUlBcEI4dFhLQUVFREVPd0hSUVJBSUJBZ0NrSDExY29BUVFJUTdBZEZEUkVnTlNBMElBTkI5OVhLQUVFSEVNQUVJUW9nQzBHNERHb2lEQ0FKUVJCcUtBSUFJQWxCRkdvb0FnQkJBRUdBMXNvQUVPVUhFTGtFSUFzb0FyZ01RWitBZ0lCNFJ3ME9JQXRCK0FScUlnNGdDaUFMS0FLOERDSVBJQXNvQXNBTUlnb1F6d0VnRGhDV0NDRUpJQXdnRHlBS0VJSUJJQTRnTlNBMElBa2dDeWdDdkF3aUNTQUxLQUxBREJDckNCQzVBeEQrQkNBTEtBTDRCRUdmZ0lDQWVFY05EeUFMS0FMOEJDRVBJQXNvQXJnTUlBa1E0QWdnTlNBMElBOUJDR3BCb05iS0FFRUpFTWdESWdvTkFVRUFEQUlMSUFzb0FyUUVJZ2xGRFJBZ0N5QUpRUUZyTmdLMEJBd1FDeUFMUWZnRWFpSUpJQW9RMlFRZ0NSQ0hDQXNoQ2lBTFFhd01haUlKSUE4UXhRTWdDMEg0QkdvZ0FTQUpJQW9nQXlBS0d5QUVJQVVnQmhBTUlBc29BdmdFSWdsQm9ZQ0FnSGhHRFE0Z0FDQUxLUUw4QkRjQ0JDQUFRUXhxSUF0QmhBVnFLUUlBTndJQURCQUxJQXRCQURZQzhBUU1EUXNBQ3lBTFFZZ0ZhaUFMUWNnTWFpZ0NBRFlDQUNBTFFZQUZhaUFMUWNBTWFpa0NBRGNEQUNBTElBc3BBcmdNTndQNEJFR0F6OUlBUVNzZ0MwSDRCR3BCd0lmS0FFSE0yc29BRUl3RUFBdEIrTXpLQUVFVkVPNEpBQXRCOE0zS0FFRVBFTzRKQUFzZ0MwRUFOZ0w0QkNNQVFSQnJJZ0FrQUNBQVFkek55Z0EyQWd3Z0FDQUxRYmdNYWpZQ0NDQUFRUWhxUWNUK3pRQWdBRUVNYWtIVS9zMEFJQXRCK0FScVFlRE55Z0FRNkFFQUN5QUxJQWxCRUdvb0FnQWdDVUVVYWlnQ0FFRUFRYXpheWdBUTVRY1Fvd2M1QTRBRURBY0xJQWxCRUdvaUNpZ0NBQ0FKUVJScUlna29BZ0JCQUVIODJjb0FFT1VIRUtNSElXY2dDeUFLS0FJQUlBa29BZ0JCQVVHTTJzb0FFT1VIRUtNSE9RT0lCU0FMSUdjNUE0QUZJQXRDQURjRCtBUWdDMEhvQkdvZ0MwSDRCR3BCbk5yS0FCQ2pCZ3dHQ3lBSlFSQnFJZ29vQWdBZ0NVRVVhaUlKS0FJQVFRQkJ6Tm5LQUJEbEJ4Q2pCeUZuSUFzZ0NpZ0NBQ0FKS0FJQVFRRkIzTm5LQUJEbEJ4Q2pCemtEaUFVZ0N5Qm5PUU9BQlNBTFFnRTNBL2dFSUF0QjZBUnFJQXRCK0FScVFlelp5Z0FRb3dZTUJRc2dDVUVRYWlJS0tBSUFJQWxCRkdvaUNTZ0NBRUVBUWR6WXlnQVE1UWNRb3djaGFpQUtLQUlBSUFrb0FnQkJBVUhzMk1vQUVPVUhFS01ISVdzZ0NpZ0NBQ0FKS0FJQVFRSkIvTmpLQUJEbEJ4Q2pCeUZwSUFvb0FnQWdDU2dDQUVFRFFZelp5Z0FRNVFjUW93Y2hhQ0FLS0FJQUlBa29BZ0JCQkVHYzJjb0FFT1VIRUtNSElXY2dDeUFLS0FJQUlBa29BZ0JCQlVHczJjb0FFT1VIRUtNSE9RT29CU0FMSUdjNUE2QUZJQXNnYURrRG1BVWdDeUJwT1FPUUJTQUxJR3M1QTRnRklBc2dhamtEZ0FVZ0MwSUNOd1A0QkNBTFFlZ0VhaUFMUWZnRWFrRzgyY29BRUtNR0RBUUxRWkRPeWdBUXV3a0FDeUFMUVlnRmFpQUxRY2dNYWlnQ0FEWUNBQ0FMUVlBRmFpQUxRY0FNYWlrQ0FEY0RBQ0FMSUFzcEFyZ01Od1A0QkVHQXo5SUFRU3NnQzBINEJHcEJ3SWZLQUVHUTFzb0FFSXdFQUFzZ0MwSDRCR29RelFKQmpJZlNBRUVLUVppSDBnQVEvUVFBQ3lBTElBbEJFR29vQWdBZ0NVRVVhaWdDQUVFQVFaemR5Z0FRNVFjUW93YzVBL2dEREFBTEFBc2dDMEdJQldvZ0MwSFlBR29vQWdBMkFnQWdDMEdBQldvZ0MwSFFBR29wQWdBM0F3QWdDeUFMS1FKSU53UDRCRUdBejlJQVFTc2dDMEg0QkdwQndJZktBRUdnMWNvQUVJd0VBQXNnQUNBSk5nSUFJQXNvQXVnRUlBc29BdXdFUVFoQk9CREpCQ0FMS0FLc0JDQUxLQUt3QkVFRVFRUVF5UVJCQUNFUUlBc29BcWdFSVJJZ0N5Z0NwQVFoQXdOQUlCSUVRQUpBSUFNZ0VHb2lCa0dBQTJvaUFTZ0NBQ0lBUlEwQUlBQWdBQ2dDQUVFQmF5SUFOZ0lBSUFBTkFDQUJLQUlBSUFaQmhBTnFLQUlBRUpnRUN5QUdRWUFDYWlJQUtBSUFRWUNBZ0lCNFJ3UkFJQVpCakFKcUtBSUFJQVpCa0FKcUtBSUFFTUVJSUFBUSt3WWdBQ2dDQUNBR1FZUUNhaWdDQUJEQUNRc2dCaER3QVNBR1FjQURhaWdDQUNBR1FjUURhaWdDQUJDb0NTQUdRZmdBYWhEd0FTQUdRY3dEYWlnQ0FDQUdRZEFEYWlnQ0FCQ29DU0FTUVFGcklSSWdFRUhZQTJvaEVBd0JDd3NnQ3lnQ29BUWdBMEVJUWRnREVNa0VJQXRCeUFCcUVOTUdJQXNvQWl3aUJnUkFJQXNvQWlnaEVpQUxLQUkwSWdBRVFDQVNRUWhxSVFrZ0Vpa0RBRUovaFVLQWdZS0VpSkNnd0lCL2d5RmlRUUVoRHdOQUlBOEVRQU5BSUdKUUJFQWdFa0dnQVdzaEVpQUpLUU1BUW4rRlFvQ0Jnb1NJa0tEQWdIK0RJV0lnQ1VFSWFpRUpEQUVMQ3lBU0lHSjZwMEVEZGtGc2JHb2lDa0VVYXlnQ0FDQUtRUkJyS0FJQUVLa0pJQXBCQ0dzaUF5Z0NBQ0lCSUFFb0FnQkJBV3NpQVRZQ0FDQmlRZ0Y5SUdLRElXSWdBRUVCYXlJQUlROGdBUTBCSUFNb0FnQWdDa0VFYXlnQ0FCQ1lCQXdCQ3dzZ0N5Z0NLQ0VTQ3lBTFFmZ0Vha0VVUVFnZ0JrRUJhaERxQXlBU0lBc29Bb0FGYXlBTEtBTDRCQ0FMS0FMOEJCRFFDQXNnTHlCWEVNOEdJRW9nTHhERUNTQUNLQUlBSUFJb0FnUVE5UWtnQzBId0RHb2tBQThMUWRpTHlnQkJEaER1Q1FBTHVUd0NHMzhFZmlNQVFjQUdheUlESkFBZ0F5QUJLQUlVSWcwMkFuUWdBeUFCS0FJUUloazJBbkFnQXlBQktBSU1JaG8yQW13Z0F5QUJLQUlJSWhzMkFtZ2dBeUFCS0FJRUloZzJBbVFnQXlBQktBSUFJaE0yQW1BZ0EwRUNOZ0tzQXlBRFFaRFEwZ0EyQXFnRElBTkJBallDcEFNZ0EwRzNuY2tBTmdLZ0F5QURRUUkyQXB3RElBTkJ0WjNKQURZQ21BTWdBMEVDTmdLVUF5QURRYm1keVFBMkFwQURJQU5CQVRZQ2pBTWdBMEdjd2NvQU5nS0lBeUFEUVFFMkFvUURJQU5Cbk1IS0FEWUNnQU1nQTBFQk5nTDhBaUFEUVp6QnlnQTJBdmdDSUFOQkFUWUM5QUlnQTBHY3djb0FOZ0x3QWlBRFFRUTJBdXdDSUFOQmxOakpBRFlDNkFJZ0EwSGdCV29pQjBHVTJNa0FRUVFnQTBIZ0FHb1F2UUlnQXlnQytBVWhBUUpBQWtBQ1FBSi9BbjhDUUFKQUlBTW9BdUFGSWdaQkEwY05BQ0FES0FMMEJTRUpJQU1vQXZBRklRb2dBeWtDNkFVaEhpQURLQUxrQlNFRklBTWdBVFlDbkFRZ0F5QUpOZ0tZQkNBRElBbzJBcFFFSUFNZ0hqY0NqQVFnQXlBRk5nS0lCQ0FISUFOQmlBUnFFTUVDSUFNb0F2Z0ZJUUVnQXlnQzRBVWlCa0VEUncwQUlBTW9BdlFGSVJZZ0F5Z0M4QVVoRUNBREtBTHNCU0VVSUFNb0F1Z0ZJUThnQXlnQzVBVWhEaUFESUFFMkFyd0NJQU1nRmpZQ3VBSWdBeUFRTmdLMEFpQURJQlEyQXJBQ0lBTWdEellDckFJZ0F5QU9OZ0tvQWlBRFFnQTNBNWdDSUFOQkFEWUNrQUlnQTBFQk9nQ2dBaUFISUFOQnFBSnFFR3NnQXlnQy9BVWhCQ0FES0FMNEJTRUdJQU1vQXZRRklRc2dBeWdDOEFVaENTQURLQUxzQlNFS0lBTW9BdWdGSVFjZ0F5Z0M1QVVoQ0FKL0FrQUNRQUpBQW40Q1FBSkFJQU1vQXVBRklnVkJBMGNFUUNBRUlRd01BUXNnQXlBR05nTGtCQ0FESUFzMkF1QUVJQU1nQ1RZQzNBUWdBeUFLTmdMWUJDQURJQWMyQXRRRUlBTWdDRFlDMEFRZ0EwSGdCV3BCbk1IS0FFRUJJQU5CMEFScUVMMENJQU1vQXZnRklRWWdBeWdDOUFVaEN5QURLQUx3QlNFSklBTW9BdXdGSVFvZ0F5Z0M2QVVoQnlBREtBTGtCU0VJSUFNb0F1QUZJZ1ZCQTBjRVFDQURLQUw4QlNFTURBRUxJQU1nQmpZQ25BUWdBeUFMTmdLWUJDQURJQWsyQXBRRUlBTWdDallDa0FRZ0F5QUhOZ0tNQkNBRElBZzJBb2dFSUFOQjRBVnFJQU5CaUFScUVKc0NJQU1vQXZ3RklRd2dBeWdDK0FVaEJpQURLQUwwQlNFTElBTW9BdkFGSVFrZ0F5Z0M3QVVoQ2lBREtBTG9CU0VISUFNb0F1UUZJUWdnQXlnQzRBVWlCVUVEUmcwQkN5QUdyU0FNclVJZ2hvUU1BUXNnQXlBR05nS2NCQ0FESUFzMkFwZ0VJQU1nQ1RZQ2xBUWdBeUFLTmdLUUJDQURJQWMyQW93RUlBTWdDRFlDaUFRZ0EwSGdCV3BCbk1IS0FFRUJJQU5CaUFScUVKWUNBa0FDUUFKQUlBTXRBUGdGSWdWQk8wY0VRQUpBQWtCQkFpQUZRVGxySWdVZ0JVRUNUeHNpQlVFQmF3NENBd0FCQ3lBREtBTDRCU0VTSUFNb0F2UUZJUkVnQXlnQzhBVWhDeUFES0FMc0JTRUpJQU1vQXVnRklRb2dBeWdDNUFVaEIwRUNJUVVMSUFNb0F1QUZJUWdNQWdzZ0F5Z0M5QVVoQmlBREtBTHdCU0VMSUFNb0F1d0ZJUWtnQXlnQzZBVWhDaUFES0FMa0JTRUhJQU1vQXVBRklRZ0xJQU1nQmpZQzVBUWdBeUFMTmdMZ0JDQURJQWsyQXR3RUlBTWdDallDMkFRZ0F5QUhOZ0xVQkNBRElBZzJBdEFFSUFOQjRBVnFJQU5CMEFScUVNRUNJQU1vQXZnRklSRWdBeWdDOUFVaEN5QURLQUx3QlNFSklBTW9BdXdGSVFvZ0F5Z0M2QVVoQnlBREtBTGtCU0VJSUFNb0F1QUZJZ1ZCQTBZTkFTQURLQUw4QlNFU0N5QVJyU0FTclVJZ2hvUU1BUXNnQXlBUk5nTE1BeUFESUFzMkFzZ0RJQU1nQ1RZQ3hBTWdBeUFLTmdMQUF5QURJQWMyQXJ3RElBTWdDRFlDdUFNZ0EwSGdCV29nQTBHQUEyb2lIQ0FEUWJnRGFoQWVJQU1vQXZnRklRc2dBeWdDOUFVaENTQURLQUx3QlNFS0lBTW9BdXdGSVFjZ0F5Z0M2QVVoQ0NBREtBTGtCU0VGSUFNcEF2d0ZJaDRnQXlnQzRBVkJBVVlOQUJvZ0F5QURLQUtFQmpZQzZBVWdCSzBnREsxQ0lJYUVJUjhnQXlBZU53UGdCU0FlcHlJRVFZQ0FnSUI0UncwQklCOExJUjVCQVNFR0lBVkJBVWNOQVNBRFFaQUNhaENTQkVFQUlSSkJDU0VSSUE0aEJTQVBJUWdnRkNFSElCQWhDaUFXSVFrZ0FTRUxRUUlNQXdzZ0F5a0M1QVVoSGlBRFFmQUZhaUlkSUFOQm9BSnFJaGNvQWdBMkFnQWdBMEhvQldvaUVTQURRWmdDYWlJU0tRTUFOd01BSUFNZ0F5a0RrQUkzQStBRklBTWdIamNEZ0FZZ0F5QUVOZ0w4QlNBRElCODNBdlFGSUFOQmtBSnFJQU5CNEFWcUlBTkI5QVZxSWhZUWxBTUNRQU5BSUFNZ0N6WUMzQUlnQXlBSk5nTFlBaUFESUFvMkF0UUNJQU1nQnpZQzBBSWdBeUFJTmdMTUFpQURJQVUyQXNnQ0lBTkI0QVZxSUFOQnlBSnFFR3NnQXlnQy9BVWhGQ0FES0FMNEJTRVZJQU1vQXZRRklRUWdBeWdDOEFVaERDQURLQUxzQlNFT0lBTW9BdWdGSVE4Z0F5Z0M1QVVoQVFKQUFuNENRQUpBSUFNb0F1QUZJZ1pCQTBjRVFDQVVJUkFNQVFzZ0F5QVZOZ0xrQkNBRElBUTJBdUFFSUFNZ0REWUMzQVFnQXlBT05nTFlCQ0FESUE4MkF0UUVJQU1nQVRZQzBBUWdBMEhnQldwQm5NSEtBRUVCSUFOQjBBUnFFTDBDSUFNb0F2Z0ZJUlVnQXlnQzlBVWhCQ0FES0FMd0JTRU1JQU1vQXV3RklRNGdBeWdDNkFVaER5QURLQUxrQlNFQklBTW9BdUFGSWdaQkEwY0VRQ0FES0FMOEJTRVFEQUVMSUFNZ0ZUWUNuQVFnQXlBRU5nS1lCQ0FESUF3MkFwUUVJQU1nRGpZQ2tBUWdBeUFQTmdLTUJDQURJQUUyQW9nRUlBTkI0QVZxSUFOQmlBUnFFSnNDSUFNb0F2d0ZJUkFnQXlnQytBVWhGU0FES0FMMEJTRUVJQU1vQXZBRklRd2dBeWdDN0FVaERpQURLQUxvQlNFUElBTW9BdVFGSVFFZ0F5Z0M0QVVpQmtFRFJnMEJDeUFWclNBUXJVSWdob1FNQVFzZ0F5QVZOZ0tjQkNBRElBUTJBcGdFSUFNZ0REWUNsQVFnQXlBT05nS1FCQ0FESUE4MkFvd0VJQU1nQVRZQ2lBUWdBMEhnQldwQm5NSEtBRUVCSUFOQmlBUnFFSllDQWtBQ1FBSkFJQU10QVBnRklnWkJPMGNFUUFKL0FrQUNRRUVDSUFaQk9Xc2lCaUFHUVFKUEcwRUJhdzRDQkFBQkN5QURLQUw0QlNFUUlBTW9BdlFGSVJVZ0F5Z0M4QVVoQkNBREtBTHNCU0VNSUFNb0F1Z0ZJUTRnQXlnQzVBVWhEMEVDREFFTFFRQUxJUVlnQXlnQzRBVWhBUXdDQ3lBREtBTDBCU0VWSUFNb0F2QUZJUVFnQXlnQzdBVWhEQ0FES0FMb0JTRU9JQU1vQXVRRklROGdBeWdDNEFVaEFRc2dBeUFWTmdMa0JDQURJQVEyQXVBRUlBTWdERFlDM0FRZ0F5QU9OZ0xZQkNBRElBODJBdFFFSUFNZ0FUWUMwQVFnQTBIZ0JXb2dBMEhRQkdvUXdRSWdBeWdDK0FVaEZTQURLQUwwQlNFRUlBTW9BdkFGSVF3Z0F5Z0M3QVVoRGlBREtBTG9CU0VQSUFNb0F1UUZJUUVnQXlnQzRBVWlCa0VEUmcwQklBTW9BdndGSVJBTElCV3RJQkN0UWlDR2hBd0JDeUFESUJVMkFzd0RJQU1nQkRZQ3lBTWdBeUFNTmdMRUF5QURJQTQyQXNBRElBTWdEellDdkFNZ0F5QUJOZ0s0QXlBRFFlQUZhaUFjSUFOQnVBTnFFQjRnQXlnQytBVWhCQ0FES0FMMEJTRU1JQU1vQXZBRklRNGdBeWdDN0FVaER5QURLQUxvQlNFQklBTW9BdVFGSVFZZ0F5a0MvQVVpSGlBREtBTGdCVUVCUmcwQUdpQVVyU0FRclVJZ2hvUWhIeUFlcHlJUVFZQ0FnSUI0UncwQklCOExJUjRnQmtFQlJ3MENJQU5CeGdWcUlBTkJvd0pxTFFBQU9nQUFJQU1nQXk4QW9RSTdBY1FGSUFNcEE1QUNJaDVDS0lpbklSSWdIa0lnaUtjaEVTQURLUU9ZQWlFZklBVWhCaUFJSVFVZ0J5RUlJQW9oQnlBSklRb2dDeUVKSUI2bklRc2dBeTBBb0FJTUJRc2dIa0lnaUtjaEZDQUJJQWhIQkVBZ0F5Z0NoQVloQlNBZElCY29BZ0EyQWdBZ0VTQVNLUU1BTndNQUlBTWdBeWtEa0FJM0ErQUZJQU1nQlRZQ2hBWWdBeUFVTmdLQUJpQURJQkEyQXZ3RklBTWdIemNDOUFVZ0EwR1FBbW9nQTBIZ0JXb2dGaENVQXlBRUlRc2dEQ0VKSUE0aENpQVBJUWNnQVNFSUlBWWhCUXdCQ3dzZ0VDQVVFS2NKUVFBaEVrRUpJUkZCQVNFR0RBSUxJQjVDS0lpbklSSWdIa0lnaUtjaEVTQWVweUVMSUFFaEJTQVBJUWdnRGlFSElBd2hDaUFFSVFrTUFRc2dIa0lvaUtjaEVpQWVRaUNJcHlFUklBTkJrQUpxRUpJRUlBVWhCaUFJSVFVZ0J5RUlJQW9oQnlBSklRb2dDeUVKSUI2bklRdEJBZ3dCQ3lBRFFaQUNhaENTQkVFQ0N5RU1JQkZCL3dGeElCSkJDSFJ5SVFRZ0RFSC9BWEZCQWtZRVFDQURJQWMyQXRnRklBTWdDRFlDMUFVZ0F5QUZOZ0xRQlNBTElRRU1BZ3NnQTBHYkJHb2dBMEhHQldvdEFBQTZBQUFnQXlBREx3SEVCVHNBbVFRZ0F5QUpOZ0tVQlNBRElBbzJBcEFGSUFNZ0J6WUNqQVVnQXlBSU5nS0lCU0FESUFVMkFvUUZJQU1nQmpZQ2dBVWdBeUFNT2dDWUJDQURJQjgzQXBBRUlBTWdCRFlDakFRZ0F5QUxOZ0tJQkNBRFFlQUZhaUFEUVlBRmFoQ29BaUFES0FMNEJTRUJJQU1vQXVBRklnWkJBMGNFUUNBREtBTDhCU0VFSUFOQmlBUnFFSklFREFJTElBTW9BdlFGSVFZZ0F5Z0M4QVVoQ0NBREtRTG9CU0VnSUFNb0F1UUZJUWtnQTBIV0FXb2dBMEdaQkdvaUJVRUNhaTBBQUNJS09nQUFJQU1nQ0RZQzJBVWdBeUFnTndQUUJTQURJQVV2QUFBaUJUc0IxQUVnQXlrQzFBVWhIaUFEUWRzQ2FpQUtPZ0FBSUFNZ0JEb0F6QUlnQTBIUEFtb2dCRUVZZGpvQUFDQURJQVU3QU5rQ0lBTWdERG9BMkFJZ0F5QWZOd0xRQWlBRElBczJBc2dDSUFNZ0JFRUlkaUlIT3dETkFpQURJQUUyQXV3QklBTWdCallDNkFFZ0F5QWVOd0xnQVNBRElDQStBdHdCSUFNZ0NUWUMyQUVnQTBIb0Ftb2lCVUc3bmNrQVFRY2dBMEhZQVdvUXZRSWdBeWdDZ0FNaEFRSkFBa0FnQXlnQzZBSWlCa0VEUncwQUlBTWdBVFlDOUFVZ0F5QURLUUw0QWpjQzdBVWdBeUFES1FMd0FqY0M1QVVnQXlBREtBTHNBallDNEFVZ0JTQURRZUFGYWhDb0FpQURLQUtBQXlFQklBTW9BdWdDSWdaQkEwY05BQ0FESUFFMkFzd0RJQU1nQXlrQytBSTNBc1FESUFNZ0F5a0M4QUkzQXJ3RElBTWdBeWdDN0FJMkFyZ0RJQVVnQTBHNEEyb1FaQ0FEUWJBQ2FpSUtJQU5COUFKcUtBSUFOZ0lBSUFNZ0F5a0M3QUkzQTZnQ0lBTW9Bb1FESVFVZ0F5Z0NnQU1oQVNBREtBTG9BaUVHSUFNb0FwQURJZ2hCZ0lDQWdIaEdCRUFnQlNFRURBSUxJQU1wQS9nQ0lSOGdBeWtEaUFNaElTQURRWXdHYWlBRFFhd0RhaWdDQURZQ0FDQURRWVFHYWlBRFFhUURhaWtDQURjQ0FDQURRZndGYWlBRFFad0RhaWtDQURjQ0FDQURRZHdFYWlBS0tBSUFOZ0lBSUFNZ0F5a0NsQU0zQXZRRklBTWdCallDMEFRZ0F5QURLUU9vQWpjQzFBUWdBeUFJTmdMd0JTQURJQ0UzQStnRklBTWdCVFlDNUFVZ0F5QUJOZ0xnQlNBRElCODNBdUFFSUFOQjZBSnFJQU5CMEFScUVLZ0NJQU1vQXVnQ0lnWkJBMGNFUUNBREtBS0VBeUVFSUFNb0FvQURJUUVnQTBIZ0JXb1E2Z2NNQWdzZ0EwR1FCR29pQ1NBRFFmUUZhaUlPSWcxQkNHb3BBZ0FpSURjREFDQURRWmdFYWlJS0lBMUJFR29wQWdBaUhqY0RBQ0FEUWFBRWFpQU5RUmhxS0FJQUlnSTJBZ0FnQXlBTktRSUFJaDgzQTRnRUlBTkJsQU5xSUFJMkFnQWdBMEdNQTJvZ0hqY0NBQ0FEUVlRRGFpQWdOd0lBSUFNZ0h6Y0MvQUlnQXlBRlFSaDJPZ0R2QWlBRElBVkJDSFk3QU8wQ0lBTkJ3QU5xSUFOQjBBSnFJZzFCQ0dvb0FnQWlBallDQUNBRElBMHBBZ0FpSHpjRHVBTWdBMEhnQkdvZ0FqWUNBQ0FESUFjN0FOVUVJQU5CMXdScUlBZEJFSFk2QUFBZ0F5QUVPZ0RVQkNBRElBczJBdEFFSUFNZ0h6Y0MyQVFnQXlBSU5nTDRBaUFESUNFM0EvQUNJQU1nQlRvQTdBSWdBeUFCTmdMb0FpQURRWWdFYWlBRFFlZ0Nha0dueThvQVFRUVF6d0VDZndKQUFrQWdBeWdDaUFSQm40Q0FnSGhIQkVBZ0RpQUtLQUlBTmdJQUlBTkI3QVZxSUFrcEFnQTNBZ0FnQXlBREtRS0lCRGNDNUFVTUFRc2dBMEhnQldvZ0F5Z0NqQVFpQVNnQ0FDQUJRUWhxS1FNQUVMd0VJQU1vQXVBRlFRRnhSUTBCQ3lBRFFlQUZha0VFY2hETkFpQURRZWdDYWhEcUJ5QURRZEFFYWhDU0JFRURJUVJCZ0lDQWdIZ2hDRUdHZ0lDQWVBd0JDeUFEUWZnQmFpQURRZUFFYWlnQ0FEWUNBQ0FEUVlnQ2FpQURRZkFDYWlrREFEY0RBQ0FES1FQb0JTRWZJQU5Cd0FGcUlBTkIvQUpxSWdGQkNHb3BBZ0EzQXdBZ0EwSElBV29nQVVFUWFpa0NBRGNEQUNBRFFkQUJhaUFCUVJocUtBSUFOZ0lBSUFNZ0h6NEMzQVFnQXlBREtRUG9BamNEZ0FJZ0F5QURLUUxZQkRjRDhBRWdBeUFCS1FJQU53TzRBU0FMQ3lFQklBTkI4QUZxSVJNZ0EwRzRBV29NQlFzZ0F5Z0NoQU1oQkFzZ0EwSElBbW9Ra2dRZ0JFRUlkZ3dDQ3lBREtBTDhCU0VFQ3lBRVFRaDJDeUVISUFaQkFVY0VRRUdCZ0lDQWVDRUlJQU5COEFGcUlSTWdBMEc0QVdvTUFRc2dBeUFOTmdMc0FTQURJQmsyQXVnQklBTWdHallDNUFFZ0F5QWJOZ0xnQVNBRElCZzJBdHdCSUFNZ0V6WUMyQUVnQTBFQU5nTGdCU0FEUWJnRGFpSUJFTDBGSUFOQjZBSnFJQU5CMkFGcVFRQWdBMEhnQldvZ0FpQUJFQkFDZndKQUlBTW9BdkFDUVF4R0JFQWdBMEhvQldvZ0EwR0VBMm9vQWdBMkFnQWdBeUFES1FMOEFqY0Q0QVVnQXlnQytBSWhHQ0FES0FMMEFpRVREQUVMSUFOQjhBSnFJUUVnQTBIZ0FXb2hFUUpBSUFNb0F2QUNRUUpyUVFsTkJFQWdBMEhvQldvZ0VVRUlhaWtDQURjREFDQURJQkVwQWdBM0ErQUZJQUVROUFSQmhvQ0FnSGdoRFVFRUlRUkJnSUNBZ0hnaENBd0JDeUFEUVlnRWFpSUZJQUZCeUFEOENnQUFJQU5CNEFWcUlna2dBMEdRQkdvaUFrSFcxTWtBUVFZUXp3RWdBeWdDNEFVaEFTQUpFTm9JQWtBQ1FDQUJRWitBZ0lCNFJ3MEFJQWtnQlJEMEFpQURLQUxnQlNJQlFaK0FnSUI0UmcwQUlBTkJnQVJxSUFOQjhBVnFLQUlBTmdJQUlBTWdBeWtDNkFVM0EvZ0RJQU1vQXVRRklRUWdBaERxQnlBREtBTEFCQ0FES0FMRUJCQ3BDU0FFUVFoMklRY2dBU0VOREFFTElBTkIwQVJxSWdFZ0FrRXcvQW9BQUNBRFFaQUZhaUFEUWNnRWFpZ0NBRFlDQUNBRElBTXBBOEFFTndPSUJTQURRZ0EzQTRBRlFRUWhCQ0FEUWVBQWFpSUNJQUZCcDh2S0FFRUVFTThCSUFOQjRBVnFJZ0VnQWhDUUJRSkFJQU1vQXVBRkJFQWdBVUVFY2hETkFrR0dnSUNBZUNFTkRBRUxJQU1nQXlrRDZBVWlIejRDYkNBRFFRQTJBbWdnQTBFQU5nSmdJQU5CQURvQWNDQURRZUFGYWlJQ0lBTkIwQVJxUWNxZ3lRQkJCUkRQQVNBRFFad0ZhaUlCSUFJUW5nRUNRQUpBQWtBQ1FBSkFBbjhnQXlnQ25BVkJuNENBZ0hoSEJFQkJnT0RhQUMwQUFCcEJFQkFXSWdaRkRRSWdCaUFmTndNSUlBWkNBRGNEQUNBQkVNMENRUUloQ0VFQ0RBRUxJQU1vQXFRRklRWWdBeWdDb0FVaENDQURLQUtvQlFzaEFpQURRZUFGYWlJRklBTkIwQVJxUWZPQXpnQkJBUkRQQVNBRFFiQUZhaUlCSUFVUW5nRUNRQUpBSUFNb0FyQUZRWitBZ0lCNFJ3UkFJQUVRelFJTUFRc2dBeTBBdUFVaEJDQURLQUswQlNJTVFZQ0FnSUI0UncwQkMwR0dnSUNBZUNFTkRBVUxJQU5CdXdWcUxRQUFRUmgwSUFNdkFMa0ZRUWgwY2lBRWNpRVhRUVFoQkNBREtBSzhCU0lIUVFOSkRRSWdGeUFIUVFCQjBLREpBQkRlQnlrREFFSUFVdzBDSUJjZ0IwRUJRZUNneVFBUTNnY3BBd0JDQUZNTkFpQVhJQWRCQWtId29Na0FFTjRIS1FNQVFnQlREUUlnQTBIb0FHb2hDMEVBSVE4Z0EwSEVCV29nRnlBSFFRQkJnS0hKQUJEZUJ5Z0NBRUdRb2NrQUVPWUVJQU5CMEFWcUlCY2dCMEVCUWFDaHlRQVEzZ2NvQWdCQnNLSEpBQkRtQkNBRFFaQUNhaUFYSUFkQkFrSEFvY2tBRU40SEtBSUFRZENoeVFBUTVnUWdBa0VCZGlFS0lBTW9BcGdDSVJBZ0F5Z0NsQUloRWlBREtBTFlCU0VVSUFNb0F0UUZJUllnQXlnQ3lBVWhEaUFES0FMTUJTRUpBMEFnQ2lBUFJ3UkFJQVlnQWlBUFFRRjBJZ0ZCNEtISkFCRGVCeWdDQUNFSElBWWdBaUFCUVFGeVFmQ2h5UUFRM2djcEF3QWlIMElBSUI5Q0FGVWJJUjRnRDBFQmFpRVBBMEFnSGxBTkFnSkFBa0FnQ1VVTkFDQURRZUFGYWlBRFFZQUZhaUFPSUFrUXVRSWdBeWdDNUFVaEJDQURLQUxnQlNJQlFaK0FnSUI0UndSQUlBTkJnQVJxSUFOQjhBVnFLQUlBTmdJQUlBTWdBeWtDNkFVM0EvZ0RJQUVoRFF3SEN3SkFBa0FnQkE0REFBSUJBd3NnQTBIZ0JXb2dBMEdBQldvZ0ZpQVVFTGtDSUFNb0F1QUZJZ0ZCbjRDQWdIaEhCRUFnQTBHQUJHb2dBMEh3Qldvb0FnQTJBZ0FnQXlBREtRTG9CVGNEK0FNZ0F5Z0M1QVVoQkNBQklRME1DQXNnQTBIZ0JXb2dBMEdBQldvZ0VpQVFFTGtDSUFNb0F1QUZJZ0ZCbjRDQWdIaEdEUUlnQTBHQUJHb2dBMEh3Qldvb0FnQTJBZ0FnQXlBREtRTG9CVGNEK0FNZ0F5Z0M1QVVoQkNBQklRME1Cd3NnQTBIZ0JXb2dBMEdBQldvZ0ZpQVVFTGtDSUFNb0F1UUZJUVFnQXlnQzRBVWlBVUdmZ0lDQWVFY0VRQ0FEUVlBRWFpQURRZkFGYWlnQ0FEWUNBQ0FESUFNcEF1Z0ZOd1A0QXlBQklRME1Cd3NnQTBIZ0JXb2dBMEdBQldvZ0VpQVFFTGtDSUFNb0F1UUZJUVVnQXlnQzRBVWlBVUdmZ0lDQWVFY0VRQ0FEUVlBRWFpQURRZkFGYWlnQ0FEWUNBQ0FESUFNcEF1Z0ZOd1A0QXlBQklRMGdCU0VFREFjTElBTkI0QUJxSUFjZ0JVRVFkSzBnQksxQ0lJYUVRZ09FRUs0RkRBRUxJQU5CNEFWcUlBTkJnQVZxSUJZZ0ZCQzVBaUFES0FMa0JTRUVJQU1vQXVBRklnRkJuNENBZ0hoSEJFQWdBMEdBQkdvZ0EwSHdCV29vQWdBMkFnQWdBeUFES1FMb0JUY0QrQU1nQVNFTkRBWUxJQU5CNEFCcUlBY2dFQVIrSUFOQjRBVnFJQU5CZ0FWcUlCSWdFQkM1QWlBREtBTGtCU0VGSUFNb0F1QUZJZ0ZCbjRDQWdIaEhCRUFnQTBHQUJHb2dBMEh3Qldvb0FnQTJBZ0FnQXlBREtRTG9CVGNEK0FNZ0FTRU5JQVVoQkF3SEN5QUZRUkIwclFWQ0FBc2dCSzFDSUlhRVFnS0VFSzRGQ3lBZVFnRjlJUjRnQjBFQmFpRUhEQUFMQUFzTElBTW9BcEFDSUJJUXFRa2dBeWdDMEFVZ0ZoQ3BDU0FES0FMRUJTQU9FS2tKSUF3Z0Z4Q29DU0FJSUFZUXFBa2dBMEhnQldvaUFpQURRZEFFYWlJQlFlVFV5UUJCQmhCUUlBSVFod1FnQWlBQlFmT0F6Z0JCQVJCUUlBSVFod1FnQWlBQlFjcWd5UUJCQlJCUUlBSVFod1FnQTBHNEJtb2dBMEhZQkdvcEF3QTNBZ0FnQTBIZ0Eyb2dBMEhzQkdvcEFnQTNBd0FnQTBIb0Eyb2dBMEgwQkdvcEFnQTNBd0FnQTBId0Eyb2dBMEg4Qkdvb0FnQTJBZ0FnQTBHQUJHb2dDMEVJYWlnQ0FEWUNBQ0FESUFNcEE5QUVOd0t3QmlBRElBTXBBdVFFTndQWUF5QURJQXNwQWdBM0EvZ0RJQU1vQW1BZ0F5Z0M0QVFoQ0NBREtBSmtJUVFnQXlnQ2lBVWdBeWdDakFVUXFRa2dBMEhvQldvZ0VVRUlhaWtDQURjREFDQURJQkVwQWdBM0ErQUZJQWhCZ1lDQWdIaEdEUWdnQkVFSWRpRUhJUTBNQndzQUN5QURLQUtRQWlBU0VLa0pJQU1vQXRBRklCWVFxUWtnQXlnQ3hBVWdEaENwQ1NBRVFRaDJJUWNNQVF0QmhvQ0FnSGdoRFFzZ0RDQVhFS2dKQ3lBSUlBWVFxQWtnQTBIZ0FHb1FrZ1FMSUFNb0FvZ0ZJQU1vQW93RkVLa0pJQU5CMEFScUVPb0hDeUFEUWVnRmFpQVJRUWhxS1FJQU53TUFJQU1nRVNrQ0FEY0Q0QVZCZ0lDQWdIZ2hDQXNnQTBIUUFtb2dBMEdBQkdvb0FnQTJBZ0FnQTBIY0Ftb2dBMEcwQm1vcEFnQTNBZ0FnQTBIa0Ftb2dBMEc4Qm1vb0FnQTJBZ0FnQTBHd0Ftb2dBMEhnQTJvcEF3QTNBd0FnQTBHNEFtb2dBMEhvQTJvcEF3QTNBd0FnQTBIQUFtb2dBMEh3QTJvb0FnQTJBZ0FnQXlBREtRUDRBemNEeUFJZ0F5QURLUUtzQmpjQzFBSWdBeUFES1FQWUF6Y0RxQUlnRTBFQlJnd0JDeUFEUWZnQ2FpQURRZWdGYWlnQ0FEWUNBQ0FESUJnMkF1d0NJQU1nRXpZQzZBSWdBeUFES1FQZ0JUY0M4QUlnQTBIb0Ftb1F6UUpCTlNFRVFZR0FnSUI0SVFoQkFRc2dBeWdDdUFNZ0F5Z0N2QU1RNVFVZ0NFR0JnSUNBZUVjRVFDQURRYkFCYWlBRFFlQUNhaWtEQURjREFDQURRYWdCYWlBRFFkZ0NhaWtEQURjREFDQURRYUFCYWlBRFFkQUNhaWtEQURjREFDQURRWUFCYWlBRFFiQUNhaWtEQURjREFDQURRWWdCYWlBRFFiZ0NhaWtEQURjREFDQURRWkFCYWlBRFFjQUNhaWdDQURZQ0FDQURJQU1wQThnQ053T1lBU0FESUFNcEE2Z0NOd040SUFOQm1BRnFJUk1nRFNFQklBTkIrQUJxREFFTERRRWdBMEdZQVdvaEV5QU5JUUZCZ1lDQWdIZ2hDQ0FEUWZnQWFnc2hCaUFEUWRnQWFpSU5JQk5CR0dvcEF3QTNBd0FnQTBIUUFHb2lBaUFUUVJCcUtRTUFOd01BSUFOQnlBQnFJZ3dnRTBFSWFpa0RBRGNEQUNBRFFTaHFJZ3NnQmtFSWFpa0NBRGNEQUNBRFFUQnFJZ2tnQmtFUWFpa0NBRGNEQUNBRFFUaHFJZ29nQmtFWWFpZ0NBRFlDQUNBRElCTXBBd0EzQTBBZ0F5QUdLUUlBTndNZ0lBaEJnWUNBZ0hoSERRRUxJQUJCQXpvQUJDQUFRWWFBZ0lCNE5nSUFRWUNBZ0lCNElRZ01BUXNnQUNBREtRTWdOd0lzSUFOQkdHb2lCU0FOS1FNQU53TUFJQU5CRUdvaURTQUNLUU1BTndNQUlBTkJDR29pQWlBTUtRTUFOd01BSUFCQk5Hb2dDeWtEQURjQ0FDQUFRVHhxSUFrcEF3QTNBZ0FnQUVIRUFHb2dDaWdDQURZQ0FDQURJQU1wQTBBM0F3QWdBRUVIYWlBSFFSQjJPZ0FBSUFBZ0J6c0FCU0FBUVFOcUlBRkJHSFk2QUFBZ0FDQUJRUWgyT3dBQklBQWdCRG9BQkNBQUlBTXBBd0EzQUFnZ0FFRVFhaUFDS1FNQU53QUFJQUJCR0dvZ0RTa0RBRGNBQUNBQVFTQnFJQVVwQXdBM0FBQWdBQ0FCT2dBQUN5QUFJQWcyQWlnZ0EwSEFCbW9rQUF1cUlRSVpmaTUvSUFBcEF5QWlEVUlEZkNFWElBMUNBbndoR0NBTlFnRjhJUmxCOU1xQjJRWWhMVUd5Mm9qTEJ5RXVRZTdJZ1prRElTOUI1ZkRCaXdZaExFRUdJVEJCNWZEQml3WWhNVUh1eUlHWkF5RXlRYkxhaU1zSElUTkI5TXFCMlFZaE5FSGw4TUdMQmlFMVFlN0lnWmtESVRaQnN0cUl5d2NoTjBIMHlvSFpCaUU0UWVYd3dZc0dJVGxCN3NpQm1RTWhPa0d5Mm9qTEJ5RTdRZlRLZ2RrR0lUd2dBQ2tES0NJQ0lSb2dBaUVISUFJaERpQUFLUU1BSWdVaER5QUFLUU1JSWdNaEVDQUZJUWdnQXlFUklBVWhDU0FESVJJZ0FDa0RFQ0lFSVJNZ0FDa0RHQ0lHSVJRZ0JDRVZJQVloQ2lBRUlSWWdCaUVMQTBBZ01BUkFJQVVnT1NBRnAyb2lJSzBnT2lBRlFpQ0lwMm9pRzYxQ0lJYUVJQmVGSWdWQ0lJaW5RUkIzSWlFZ0JFSWdpS2RxSWgrdFFpQ0dJQVduUVJCM0loNGdCS2RxSWgydGhJVWlCRUlnaUtkQkRIY2lIQ0FiYWlJbHJVSWdoaUFFcDBFTWR5SWJJQ0JxSWlhdGhDQWVyU0FoclVJZ2hvU0ZJZ1JDSUlpblFRaDNJaWNnSDJvaUtLMUNJSVlnQktkQkNIY2lLU0FkYWlJcXJZUWdHNjBnSEsxQ0lJYUVoU0lNcDBFSGR5SXJJRHNnQTZkcUlpS3RJRHdnQTBJZ2lLZHFJaHl0UWlDR2hDQUNoU0lDUWlDSXAwRVFkeUlnSUFaQ0lJaW5haUliclVJZ2hpQUNwMEVRZHlJaElBYW5haUlmcllRZ0E0VWlBa0lnaUtkQkRIY2lIaUFjYWlJZGFpSWpyVUlnaGlBYklBS25RUXgzSWh3Z0ltb2lHNjBnSGExQ0lJYUVJQ0d0SUNDdFFpQ0doSVVpQWtJZ2lLZEJDSGNpSkdvaUlLMUNJSVlnQXFkQkNIY2lIU0FmYWlJaXJZUWdISzBnSHExQ0lJYUVoU0lHUWlDSXAwRUhkeUljSUJ0cUlodXRoQ0FuclNBZHJVSWdob1NGSWdKQ0lJaW5RUkIzSWlFZ0tHb2lINjFDSUlZZ0FxZEJFSGNpSGlBcWFpSWRyWVFnSEswZ0s2MUNJSWFFaFNJQ1FpQ0lwMEVNZHlJY0lDTnFJanl0UWlDR0lCc2dBcWRCREhjaUcyb2lPNjJFSUI2dElDR3RRaUNHaElVaUFrSWdpS2RCQ0hjaVBTQWZhcTFDSUlZZ0FxZEJDSGNpUGlBZGFxMkVJZ1FnRzYwZ0hLMUNJSWFFaFNJRnAwRUhkNjFDSUlZZ0lDQU1RaUNJcDBFSGR5SWpJQ1pxSWlDdElBYW5RUWQzSWh3Z0pXb2lHNjFDSUlhRUlDU3RJQ210UWlDR2hJVWlBa0lnaUtkQkVIY2lJV29pSDYxQ0lJWWdBcWRCRUhjaUhpQWlhaUlkcllRZ0k2MGdISzFDSUlhRWhTSUNRaUNJcDBFTWR5SWNJQnRxSWpxdFFpQ0dJQUtuUVF4M0loc2dJR29pT2EyRUlCNnRJQ0d0UWlDR2hJVWlBa0lnaUtkQkNIY2lQeUFmYXExQ0lJWWdBcWRCQ0hjaVFDQWRhcTJFSWdZZ0c2MGdISzFDSUlhRWhTSUNRaUNJcDBFSGQ2MkVJUU1nQlVJZ2lLZEJCM2V0SUFLblFRZDNyVUlnaG9RaEJTQTFJQW1uYWlJZ3JTQTJJQWxDSUlpbmFpSWJyVUlnaG9RZ0dJVWlBa0lnaUtkQkVIY2lJU0FXUWlDSXAyb2lINjFDSUlZZ0FxZEJFSGNpSGlBV3Ayb2lIYTJFSUFtRklnSkNJSWluUVF4M0lod2dHMm9pSmExQ0lJWWdBcWRCREhjaUd5QWdhaUltcllRZ0hxMGdJYTFDSUlhRWhTSUNRaUNJcDBFSWR5SW5JQjlxSWlpdFFpQ0dJQUtuUVFoM0lpa2dIV29pS3EyRUlCdXRJQnl0UWlDR2hJVWlES2RCQjNjaUt5QTNJQktuYWlJaXJTQTRJQkpDSUlpbmFpSWNyVUlnaG9RZ0dvVWlBa0lnaUtkQkVIY2lJQ0FMUWlDSXAyb2lHNjFDSUlZZ0FxZEJFSGNpSVNBTHAyb2lINjJFSUJLRklnSkNJSWluUVF4M0loNGdIR29pSFdvaUk2MUNJSVlnR3lBQ3AwRU1keUljSUNKcUlodXRJQjJ0UWlDR2hDQWhyU0FnclVJZ2hvU0ZJZ0pDSUlpblFRaDNJaVJxSWlDdFFpQ0dJQUtuUVFoM0loMGdIMm9pSXEyRUlCeXRJQjZ0UWlDR2hJVWlDMElnaUtkQkIzY2lIQ0FiYWlJYnJZUWdKNjBnSGExQ0lJYUVoU0lDUWlDSXAwRVFkeUloSUNocUloK3RRaUNHSUFLblFSQjNJaDRnS21vaUhhMkVJQnl0SUN1dFFpQ0doSVVpQWtJZ2lLZEJESGNpSENBamFpSTRyVUlnaGlBYklBS25RUXgzSWh0cUlqZXRoQ0FlclNBaHJVSWdob1NGSWdKQ0lJaW5RUWgzSWtFZ0gycXRRaUNHSUFLblFRaDNJa0lnSFdxdGhDSVdJQnV0SUJ5dFFpQ0doSVVpQ2FkQkIzZXRRaUNHSUNBZ0RFSWdpS2RCQjNjaUl5QW1haUlnclNBTHAwRUhkeUljSUNWcUlodXRRaUNHaENBa3JTQXByVUlnaG9TRklnSkNJSWluUVJCM0lpRnFJaCt0UWlDR0lBS25RUkIzSWg0Z0ltb2lIYTJFSUNPdElCeXRRaUNHaElVaUFrSWdpS2RCREhjaUhDQWJhaUkyclVJZ2hpQUNwMEVNZHlJYklDQnFJald0aENBZXJTQWhyVUlnaG9TRklnSkNJSWluUVFoM0lrTWdIMnF0UWlDR0lBS25RUWgzSWtRZ0hXcXRoQ0lMSUJ1dElCeXRRaUNHaElVaUFrSWdpS2RCQjNldGhDRVNJQWxDSUlpblFRZDNyU0FDcDBFSGQ2MUNJSWFFSVFrZ01TQUlwMm9pSUswZ01pQUlRaUNJcDJvaUc2MUNJSWFFSUJtRklnSkNJSWluUVJCM0lpRWdGVUlnaUtkcUloK3RRaUNHSUFLblFSQjNJaDRnRmFkcUloMnRoQ0FJaFNJQ1FpQ0lwMEVNZHlJY0lCdHFJaVd0UWlDR0lBS25RUXgzSWhzZ0lHb2lKcTJFSUI2dElDR3RRaUNHaElVaUFrSWdpS2RCQ0hjaUp5QWZhaUlvclVJZ2hpQUNwMEVJZHlJcElCMXFJaXF0aENBYnJTQWNyVUlnaG9TRklnaW5RUWQzSWlzZ015QVJwMm9pSXEwZ05DQVJRaUNJcDJvaUhLMUNJSWFFSUFlRklnSkNJSWluUVJCM0lpQWdDa0lnaUtkcUlodXRRaUNHSUFLblFSQjNJaUVnQ3FkcUloK3RoQ0FSaFNJQ1FpQ0lwMEVNZHlJZUlCeHFJaDFxSWlPdFFpQ0dJQnNnQXFkQkRIY2lIQ0FpYWlJYnJTQWRyVUlnaG9RZ0lhMGdJSzFDSUlhRWhTSUNRaUNJcDBFSWR5SWthaUlnclVJZ2hpQUNwMEVJZHlJZElCOXFJaUt0aENBY3JTQWVyVUlnaG9TRklncENJSWluUVFkM0lod2dHMm9pRzYyRUlDZXRJQjJ0UWlDR2hJVWlBa0lnaUtkQkVIY2lJU0FvYWlJZnJVSWdoaUFDcDBFUWR5SWVJQ3BxSWgydGhDQWNyU0FyclVJZ2hvU0ZJZ0pDSUlpblFReDNJaHdnSTJvaU5LMUNJSVlnR3lBQ3AwRU1keUliYWlJenJZUWdIcTBnSWExQ0lJYUVoU0lDUWlDSXAwRUlkeUpGSUI5cXJVSWdoaUFDcDBFSWR5SkdJQjFxcllRaUZTQWJyU0FjclVJZ2hvU0ZJZ2VuUVFkM3JVSWdoaUFnSUFoQ0lJaW5RUWQzSWlNZ0ptb2lJSzBnQ3FkQkIzY2lIQ0FsYWlJYnJVSWdob1FnSkswZ0thMUNJSWFFaFNJQ1FpQ0lwMEVRZHlJaGFpSWZyVUlnaGlBQ3AwRVFkeUllSUNKcUloMnRoQ0FqclNBY3JVSWdob1NGSWdKQ0lJaW5RUXgzSWh3Z0cyb2lNcTFDSUlZZ0FxZEJESGNpR3lBZ2FpSXhyWVFnSHEwZ0lhMUNJSWFFaFNJQ1FpQ0lwMEVJZHlKSElCOXFyVUlnaGlBQ3AwRUlkeUpJSUIxcXJZUWlDaUFiclNBY3JVSWdob1NGSWdKQ0lJaW5RUWQzcllRaEVTQUhRaUNJcDBFSGQ2MGdBcWRCQjNldFFpQ0doQ0VJSUN3Z0Q2ZHFJaUN0SUM4Z0QwSWdpS2RxSWh1dFFpQ0doQ0FOaFNJQ1FpQ0lwMEVRZHlJaElCTkNJSWluYWlJZnJVSWdoaUFDcDBFUWR5SWVJQk9uYWlJZHJZUWdENFVpQWtJZ2lLZEJESGNpSENBYmFpSXNyVUlnaGlBQ3AwRU1keUliSUNCcUlpV3RoQ0FlclNBaHJVSWdob1NGSWdKQ0lJaW5RUWgzSWlZZ0gyb2lKNjFDSUlZZ0FxZEJDSGNpS0NBZGFpSXByWVFnRzYwZ0hLMUNJSWFFaFNJTXAwRUhkeUlrSUM0Z0VLZHFJaUt0SUMwZ0VFSWdpS2RxSWh5dFFpQ0doQ0FPaFNJQ1FpQ0lwMEVRZHlJZ0lCUkNJSWluYWlJYnJVSWdoaUFDcDBFUWR5SWhJQlNuYWlJZnJZUWdFSVVpQWtJZ2lLZEJESGNpSGlBY2FpSWRhaUlqclVJZ2hpQWJJQUtuUVF4M0lod2dJbW9pRzYwZ0hhMUNJSWFFSUNHdElDQ3RRaUNHaElVaUFrSWdpS2RCQ0hjaUttb2lJSzFDSUlZZ0FxZEJDSGNpSFNBZmFpSXJyWVFnSEswZ0hxMUNJSWFFaFNJSFFpQ0lwMEVIZHlJY0lCdHFJaHV0aENBbXJTQWRyVUlnaG9TRklnSkNJSWluUVJCM0lpRWdKMm9pSDYxQ0lJWWdBcWRCRUhjaUhpQXBhaUlkcllRZ0hLMGdKSzFDSUlhRWhTSUNRaUNJcDBFTWR5SWNJQ05xSWkydFFpQ0dJQnNnQXFkQkRIY2lHMm9pTHEyRUlCNnRJQ0d0UWlDR2hJVWlBa0lnaUtkQkNIY2lKQ0FmYXExQ0lJWWdBcWRCQ0hjaUlpQWRhcTJFSWhNZ0c2MGdISzFDSUlhRWhTSU9wMEVIZDYxQ0lJWWdJQ0FNUWlDSXAwRUhkeUlqSUNWcUlpQ3RJQWVuUVFkM0loNGdMR29pSGExQ0lJYUVJQ3F0SUNpdFFpQ0doSVVpQWtJZ2lLZEJFSGNpSVdvaUg2MUNJSVlnQXFkQkVIY2lIQ0FyYWlJYnJZUWdJNjBnSHExQ0lJYUVoU0lDUWlDSXAwRU1keUllSUIxcUlpK3RRaUNHSUFLblFReDNJaDBnSUdvaUxLMkVJQnl0SUNHdFFpQ0doSVVpQWtJZ2lLZEJDSGNpSENBZmFxMUNJSVlnR3lBQ3AwRUlkeUliYXEyRUloUWdIYTBnSHExQ0lJYUVoU0lDUWlDSXAwRUhkNjJFSVJBZ0RrSWdpS2RCQjNldElBS25RUWQzclVJZ2hvUWhEeUE5clNCQXJVSWdob1FoQWlBL3JTQStyVUlnaG9RaEZ5QkJyU0JFclVJZ2hvUWhHaUJEclNCQ3JVSWdob1FoR0NCRnJTQklyVUlnaG9RaEJ5QkhyU0JHclVJZ2hvUWhHU0FrclNBYnJVSWdob1FoRGlBY3JTQWlyVUlnaG9RaERTQXdRUUZySVRBTUFRc0xJQUVnUEVIMHlvSFpCbW8yQXN3QklBRWdPMEd5Mm9qTEIybzJBc2dCSUFFZ09rSHV5SUdaQTJvMkFzUUJJQUVnT1VIbDhNR0xCbW8yQXNBQklBRWdPRUgweW9IWkJtbzJBb3dCSUFFZ04wR3kyb2pMQjJvMkFvZ0JJQUVnTmtIdXlJR1pBMm8yQW9RQklBRWdOVUhsOE1HTEJtbzJBb0FCSUFFZ05FSDB5b0haQm1vMkFrd2dBU0F6UWJMYWlNc0hhallDU0NBQklESkI3c2lCbVFOcU5nSkVJQUVnTVVIbDhNR0xCbW8yQWtBZ0FTQXRRZlRLZ2RrR2FqWUNEQ0FCSUM1QnN0cUl5d2RxTmdJSUlBRWdMMEh1eUlHWkEybzJBZ1FnQVNBc1FlWHd3WXNHYWpZQ0FDQUJJQUFvQWhnaUhpQUdwMm8yQXVnQklBRWdBQ2dDRUNJZElBU25hallDNEFFZ0FTQUFLQUlJSWh3Z0E2ZHFOZ0xZQVNBQklBQW9BZ0FpR3lBRnAybzJBdEFCSUFFZ0hpQUxwMm8yQXFnQklBRWdIU0FXcDJvMkFxQUJJQUVnSENBU3AybzJBcGdCSUFFZ0d5QUpwMm8yQXBBQklBRWdIaUFLcDJvMkFtZ2dBU0FkSUJXbmFqWUNZQ0FCSUJ3Z0VhZHFOZ0pZSUFFZ0d5QUlwMm8yQWxBZ0FTQWVJQlNuYWpZQ0tDQUJJQjBnRTZkcU5nSWdJQUVnSENBUXAybzJBaGdnQVNBYklBK25hallDRUNBQklBQXBBeWdpREtjaUh5QUNwMm8yQXZnQklBRWdBQ2dDSENJZUlBWkNJSWluYWpZQzdBRWdBU0FBS0FJVUloMGdCRUlnaUtkcU5nTGtBU0FCSUFBb0Fnd2lIQ0FEUWlDSXAybzJBdHdCSUFFZ0FDZ0NCQ0liSUFWQ0lJaW5hallDMUFFZ0FTQWZJQnFuYWpZQ3VBRWdBU0FlSUF0Q0lJaW5hallDckFFZ0FTQWRJQlpDSUlpbmFqWUNwQUVnQVNBY0lCSkNJSWluYWpZQ25BRWdBU0FiSUFsQ0lJaW5hallDbEFFZ0FTQWZJQWVuYWpZQ2VDQUJJQjRnQ2tJZ2lLZHFOZ0pzSUFFZ0hTQVZRaUNJcDJvMkFtUWdBU0FjSUJGQ0lJaW5hallDWENBQklCc2dDRUlnaUtkcU5nSlVJQUVnSHlBT3AybzJBamdnQVNBQUtRTWdJZ09uSUEybmFqWUNNQ0FCSUI0Z0ZFSWdpS2RxTmdJc0lBRWdIU0FUUWlDSXAybzJBaVFnQVNBY0lCQkNJSWluYWpZQ0hDQUJJQnNnRDBJZ2lLZHFOZ0lVSUFFZ0RFSWdpS2NpR3lBQ1FpQ0lwMm8yQXZ3QklBRWdBMElEZkNJRXB5QVhwMm8yQXZBQklBRWdHeUFhUWlDSXAybzJBcndCSUFFZ0EwSUNmQ0lHcHlBWXAybzJBckFCSUFFZ0d5QUhRaUNJcDJvMkFud2dBU0FEUWdGOElnS25JQm1uYWpZQ2NDQUJJQnNnRGtJZ2lLZHFOZ0k4SUFFZ0EwSWdpS2NnRFVJZ2lLZHFOZ0kwSUFFZ0JFSWdpS2NnRjBJZ2lLZHFOZ0wwQVNBQklBWkNJSWluSUJoQ0lJaW5hallDdEFFZ0FTQUNRaUNJcHlBWlFpQ0lwMm8yQW5RZ0FDQURRZ1I4TndNZ0Mvb3FBU1YvSXdCQmdBRnJJZ01rQUNBRFFRQkJ3QUQ4Q3dBZ0FTQUNRUVowYWlFbUlBQW9BaHdoSWlBQUtBSVlJU01nQUNnQ0ZDRWVJQUFvQWhBaEh5QUFLQUlNSVNRZ0FDZ0NDQ0VsSUFBb0FnUWhJQ0FBS0FJQUlTRURRQ0FCSUNaR1JRUkFRUkJCd0FCQkJCREZDQ0lDSUFKQkVFOGJRUUowSVJBZ0FVRkFhMEVBSVFJRFFDQUNJQkJHUlFSQUlBSWdBMm9nQVNBQ2FpZ0FBQ0lQUVJoMElBOUJnUDREY1VFSWRISWdEMEVJZGtHQS9nTnhJQTlCR0haeWNqWUNBQ0FDUVFScUlRSU1BUXNMSUFNb0Fqd2hGQ0FES0FJNElSVWdBeWdDTkNFY0lBTW9BakFoQVNBREtBSXNJUllnQXlnQ0tDRVhJQU1vQWlRaEdDQURLQUlnSVJBZ0F5Z0NIQ0VaSUFNb0FoZ2hHaUFES0FJVUlSc2dBeWdDRUNFUElBTW9BZ3doQWlBREtBSUlJUkVnQXlnQ0JDRVNJQU1vQWdBaEV5QURJQ1UyQW1BZ0F5QWtOZ0prSUFNZ0l6WUNhQ0FESUNJMkFtd2dBeUFlTmdKOElBTWdIellDZUNBRElDQTJBblFnQXlBaE5nSndJQU5CMEFCcUlna2dBMEhnQUdvaUNpQURRZkFBYWlJTElCSkJrWW5kaVFkcUlCTkJtTitvbEFScUVNQUNJQU1vQWxBaEJDQURLQUpVSVFVZ0F5Z0NXQ0VHSUFNb0Fsd2hCeUFESUI0MkFtd2dBeUFmTmdKb0lBTWdJRFlDWkNBRElDRTJBbUFnQXlBSE5nSjhJQU1nQmpZQ2VDQURJQVUyQW5RZ0F5QUVOZ0p3SUFrZ0NpQUxJQUpCMjhpb3NnRnJJQkZCc1lqODBRUnJFTUFDSUFNb0FsQWhDQ0FES0FKVUlRd2dBeWdDV0NFTklBTW9BbHdoRGlBRElBYzJBbXdnQXlBR05nSm9JQU1nQlRZQ1pDQURJQVEyQW1BZ0F5QU9OZ0o4SUFNZ0RUWUNlQ0FESUF3MkFuUWdBeUFJTmdKd0lBa2dDaUFMSUJ0QjhhUEV6d1ZxSUE5QjI0VGJ5Z05xRU1BQ0lBTW9BbEFoQkNBREtBSlVJUVVnQXlnQ1dDRUdJQU1vQWx3aEJ5QURJQTQyQW13Z0F5QU5OZ0pvSUFNZ0REWUNaQ0FESUFnMkFtQWdBeUFITmdKOElBTWdCallDZUNBRElBVTJBblFnQXlBRU5nSndJQWtnQ2lBTElCbEJxOEtPcHdWcklCcEIzUHFCN2dackVNQUNJQU1vQWxBaENDQURLQUpVSVF3Z0F5Z0NXQ0VOSUFNb0Fsd2hEaUFESUFjMkFtd2dBeUFHTmdKb0lBTWdCVFlDWkNBRElBUTJBbUFnQXlBT05nSjhJQU1nRFRZQ2VDQURJQXcyQW5RZ0F5QUlOZ0p3SUFrZ0NpQUxJQmhCZ2JhTmxBRnFJQkJCNktyaHZ3SnJFTUFDSUFNb0FsQWhCQ0FES0FKVUlRVWdBeWdDV0NFR0lBTW9BbHdoQnlBRElBNDJBbXdnQXlBTk5nSm9JQU1nRERZQ1pDQURJQWcyQW1BZ0F5QUhOZ0o4SUFNZ0JqWUNlQ0FESUFVMkFuUWdBeUFFTmdKd0lBa2dDaUFMSUJaQncvdXhxQVZxSUJkQnZvdkdvUUpxRU1BQ0lBTW9BbEFoQ0NBREtBSlVJUXdnQXlnQ1dDRU5JQU1vQWx3aERpQURJQWMyQW13Z0F5QUdOZ0pvSUFNZ0JUWUNaQ0FESUFRMkFtQWdBeUFPTmdKOElBTWdEVFlDZUNBRElBdzJBblFnQXlBSU5nSndJQWtnQ2lBTElCeEJncHlGK1FkcklBRkI5THI1bFFkcUVNQUNJQU1vQWxBaEJDQURLQUpVSVFVZ0F5Z0NXQ0VHSUFNb0Fsd2hCeUFESUE0MkFtd2dBeUFOTmdKb0lBTWdERFlDWkNBRElBZzJBbUFnQXlBSE5nSjhJQU1nQmpZQ2VDQURJQVUyQW5RZ0F5QUVOZ0p3SUFrZ0NpQUxJQlJCakoyUTh3TnJJQlZCMmZLUG9RWnJFTUFDSUFNb0FsQWhDQ0FES0FKVUlRd2dBeWdDV0NFTklBTW9BbHdoRGlBRElCTTJBbHdnQXlBU05nSllJQU1nRVRZQ1ZDQURJQUkyQWxBZ0F5QVFOZ0pzSUFNZ0dEWUNhQ0FESUJjMkFtUWdBeUFXTmdKZ0lBTWdBVFlDZkNBRElCdzJBbmdnQXlBVk5nSjBJQU1nRkRZQ2NDQURRVUJySWgwZ0NTQVBJQW9nQ3hDbkFpQURLQUpBSVJFZ0F5Z0NSQ0VTSUFNb0FrZ2hFeUFES0FKTUlRSWdBeUFITmdKc0lBTWdCallDYUNBRElBVTJBbVFnQXlBRU5nSmdJQU1nRGpZQ2ZDQURJQTAyQW5nZ0F5QU1OZ0owSUFNZ0NEWUNjQ0FKSUFvZ0N5QVRRZnJ3aG9JQmF5QUNRYitza3RzQmF4REFBaUFES0FKUUlRUWdBeWdDVkNFRklBTW9BbGdoQmlBREtBSmNJUWNnQXlBT05nSnNJQU1nRFRZQ2FDQURJQXcyQW1RZ0F5QUlOZ0pnSUFNZ0J6WUNmQ0FESUFZMkFuZ2dBeUFGTmdKMElBTWdCRFlDY0NBSklBb2dDeUFSUWN6RHNxQUNhaUFTUWNhN2h2NEFhaERBQWlBREtBSlFJUWdnQXlnQ1ZDRU1JQU1vQWxnaERTQURLQUpjSVE0Z0F5QVBOZ0pjSUFNZ0d6WUNXQ0FESUJvMkFsUWdBeUFaTmdKUUlBTWdBVFlDYkNBRElCdzJBbWdnQXlBVk5nSmtJQU1nRkRZQ1lDQURJQUkyQW53Z0F5QVROZ0o0SUFNZ0VqWUNkQ0FESUJFMkFuQWdIU0FKSUJBZ0NpQUxFS2NDSUFNb0FrQWhHU0FES0FKRUlSb2dBeWdDU0NFYklBTW9Ba3doRHlBRElBYzJBbXdnQXlBR05nSm9JQU1nQlRZQ1pDQURJQVEyQW1BZ0F5QU9OZ0o4SUFNZ0RUWUNlQ0FESUF3MkFuUWdBeUFJTmdKd0lBa2dDaUFMSUJ0QnFvblMwd1JxSUE5Qjc5aWs3d0pxRU1BQ0lBTW9BbEFoQkNBREtBSlVJUVVnQXlnQ1dDRUdJQU1vQWx3aEJ5QURJQTQyQW13Z0F5QU5OZ0pvSUFNZ0REWUNaQ0FESUFnMkFtQWdBeUFITmdKOElBTWdCallDZUNBRElBVTJBblFnQXlBRU5nSndJQWtnQ2lBTElCbEIycEhtdHdkcUlCcEIzTlBDNVFWcUVNQUNJQU1vQWxBaENDQURLQUpVSVF3Z0F5Z0NXQ0VOSUFNb0Fsd2hEaUFESUJBMkFsd2dBeUFZTmdKWUlBTWdGellDVkNBRElCWTJBbEFnQXlBQ05nSnNJQU1nRXpZQ2FDQURJQkkyQW1RZ0F5QVJOZ0pnSUFNZ0R6WUNmQ0FESUJzMkFuZ2dBeUFhTmdKMElBTWdHVFlDY0NBZElBa2dBU0FLSUFzUXB3SWdBeWdDUUNFV0lBTW9Ba1FoRnlBREtBSklJUmdnQXlnQ1RDRVFJQU1nQnpZQ2JDQURJQVkyQW1nZ0F5QUZOZ0prSUFNZ0JEWUNZQ0FESUE0MkFud2dBeUFOTmdKNElBTWdERFlDZENBRElBZzJBbkFnQ1NBS0lBc2dHRUdUODdpK0JXc2dFRUd1M1lhK0Jtc1F3QUlnQXlnQ1VDRUVJQU1vQWxRaEJTQURLQUpZSVFZZ0F5Z0NYQ0VISUFNZ0RqWUNiQ0FESUEwMkFtZ2dBeUFNTmdKa0lBTWdDRFlDWUNBRElBYzJBbndnQXlBR05nSjRJQU1nQlRZQ2RDQURJQVEyQW5BZ0NTQUtJQXNnRmtHNWdKcUZCR3NnRjBHNHNQUC9CR3NRd0FJZ0F5Z0NVQ0VJSUFNb0FsUWhEQ0FES0FKWUlRMGdBeWdDWENFT0lBTWdBVFlDWENBRElCdzJBbGdnQXlBVk5nSlVJQU1nRkRZQ1VDQURJQTgyQW13Z0F5QWJOZ0pvSUFNZ0dqWUNaQ0FESUJrMkFtQWdBeUFRTmdKOElBTWdHRFlDZUNBRElCYzJBblFnQXlBV05nSndJQjBnQ1NBQ0lBb2dDeENuQWlBREtBSkFJUlFnQXlnQ1JDRVZJQU1vQWtnaEhDQURLQUpNSVFFZ0F5QUhOZ0pzSUFNZ0JqWUNhQ0FESUFVMkFtUWdBeUFFTmdKZ0lBTWdEallDZkNBRElBMDJBbmdnQXlBTU5nSjBJQU1nQ0RZQ2NDQUpJQW9nQ3lBY1FibmQ0ZElDYXlBQlFZM28vOGdEYXhEQUFpQURLQUpRSVFRZ0F5Z0NWQ0VGSUFNb0FsZ2hCaUFES0FKY0lRY2dBeUFPTmdKc0lBTWdEVFlDYUNBRElBdzJBbVFnQXlBSU5nSmdJQU1nQnpZQ2ZDQURJQVkyQW5nZ0F5QUZOZ0owSUFNZ0JEWUNjQ0FKSUFvZ0N5QVVRZWZTcEtFQmFpQVZRZEhHcVRacUVNQUNJQU1vQWxBaENDQURLQUpVSVF3Z0F5Z0NXQ0VOSUFNb0Fsd2hEaUFESUFJMkFsd2dBeUFUTmdKWUlBTWdFallDVkNBRElCRTJBbEFnQXlBUU5nSnNJQU1nR0RZQ2FDQURJQmMyQW1RZ0F5QVdOZ0pnSUFNZ0FUWUNmQ0FESUJ3MkFuZ2dBeUFWTmdKMElBTWdGRFlDY0NBZElBa2dEeUFLSUFzUXB3SWdBeWdDUUNFUklBTW9Ba1FoRWlBREtBSklJUk1nQXlnQ1RDRUNJQU1nQnpZQ2JDQURJQVkyQW1nZ0F5QUZOZ0prSUFNZ0JEWUNZQ0FESUE0MkFud2dBeUFOTmdKNElBTWdERFlDZENBRElBZzJBbkFnQ1NBS0lBc2dFMEc0d3V6d0Ftb2dBa0dGbGR5OUFtb1F3QUlnQXlnQ1VDRUVJQU1vQWxRaEJTQURLQUpZSVFZZ0F5Z0NYQ0VISUFNZ0RqWUNiQ0FESUEwMkFtZ2dBeUFNTmdKa0lBTWdDRFlDWUNBRElBYzJBbndnQXlBR05nSjRJQU1nQlRZQ2RDQURJQVEyQW5BZ0NTQUtJQXNnRVVHVG11Q1pCV29nRWtIODI3SHBCR29Rd0FJZ0F5Z0NVQ0VJSUFNb0FsUWhEQ0FES0FKWUlRMGdBeWdDWENFT0lBTWdEellDWENBRElCczJBbGdnQXlBYU5nSlVJQU1nR1RZQ1VDQURJQUUyQW13Z0F5QWNOZ0pvSUFNZ0ZUWUNaQ0FESUJRMkFtQWdBeUFDTmdKOElBTWdFellDZUNBRElCSTJBblFnQXlBUk5nSndJQjBnQ1NBUUlBb2dDeENuQWlBREtBSkFJUmtnQXlnQ1JDRWFJQU1vQWtnaEd5QURLQUpNSVE4Z0F5QUhOZ0pzSUFNZ0JqWUNhQ0FESUFVMkFtUWdBeUFFTmdKZ0lBTWdEallDZkNBRElBMDJBbmdnQXlBTU5nSjBJQU1nQ0RZQ2NDQUpJQW9nQ3lBYlFidVZxTE1IYWlBUFFkVG1xYWdHYWhEQUFpQURLQUpRSVFRZ0F5Z0NWQ0VGSUFNb0FsZ2hCaUFES0FKY0lRY2dBeUFPTmdKc0lBTWdEVFlDYUNBRElBdzJBbVFnQXlBSU5nSmdJQU1nQnpZQ2ZDQURJQVkyQW5nZ0F5QUZOZ0owSUFNZ0JEWUNjQ0FKSUFvZ0N5QVpRZnVtdCt3R2F5QWFRZEx0OVBFSGF4REFBaUFES0FKUUlRZ2dBeWdDVkNFTUlBTW9BbGdoRFNBREtBSmNJUTRnQXlBUU5nSmNJQU1nR0RZQ1dDQURJQmMyQWxRZ0F5QVdOZ0pRSUFNZ0FqWUNiQ0FESUJNMkFtZ2dBeUFTTmdKa0lBTWdFVFlDWUNBRElBODJBbndnQXlBYk5nSjRJQU1nR2pZQ2RDQURJQmsyQW5BZ0hTQUpJQUVnQ2lBTEVLY0NJQU1vQWtBaEZpQURLQUpFSVJjZ0F5Z0NTQ0VZSUFNb0Frd2hFQ0FESUFjMkFtd2dBeUFHTmdKb0lBTWdCVFlDWkNBRElBUTJBbUFnQXlBT05nSjhJQU1nRFRZQ2VDQURJQXcyQW5RZ0F5QUlOZ0p3SUFrZ0NpQUxJQmhCdGJPV3Z3VnJJQkJCMzY2QTZnVnJFTUFDSUFNb0FsQWhCQ0FES0FKVUlRVWdBeWdDV0NFR0lBTW9BbHdoQnlBRElBNDJBbXdnQXlBTk5nSm9JQU1nRERZQ1pDQURJQWcyQW1BZ0F5QUhOZ0o4SUFNZ0JqWUNlQ0FESUFVMkFuUWdBeUFFTmdKd0lBa2dDaUFMSUJaQjNkek94QU5ySUJkQmtPblI3UU5yRU1BQ0lBTW9BbEFoQ0NBREtBSlVJUXdnQXlnQ1dDRU5JQU1vQWx3aERpQURJQUUyQWx3Z0F5QWNOZ0pZSUFNZ0ZUWUNWQ0FESUJRMkFsQWdBeUFQTmdKc0lBTWdHellDYUNBRElCbzJBbVFnQXlBWk5nSmdJQU1nRURZQ2ZDQURJQmcyQW5nZ0F5QVhOZ0owSUFNZ0ZqWUNjQ0FkSUFrZ0FpQUtJQXNRcHdJZ0F5Z0NRQ0VVSUFNb0FrUWhGU0FES0FKSUlSd2dBeWdDVENFQklBTWdCellDYkNBRElBWTJBbWdnQXlBRk5nSmtJQU1nQkRZQ1lDQURJQTQyQW53Z0F5QU5OZ0o0SUFNZ0REWUNkQ0FESUFnMkFuQWdDU0FLSUFzZ0hFSGM4NXZMQW1zZ0FVSG5yN1R6QW1zUXdBSWdBeWdDVUNFRUlBTW9BbFFoQlNBREtBSllJUVlnQXlnQ1hDRUhJQU1nRGpZQ2JDQURJQTAyQW1nZ0F5QU1OZ0prSUFNZ0NEWUNZQ0FESUFjMkFud2dBeUFHTmdKNElBTWdCVFlDZENBRElBUTJBbkFnQ1NBS0lBc2dGRUh3d0txREFXb2dGVUg3bE1mZkFHc1F3QUlnQXlnQ1VDRUlJQU1vQWxRaERDQURLQUpZSVEwZ0F5Z0NYQ0VPSUFNZ0FqWUNYQ0FESUJNMkFsZ2dBeUFTTmdKVUlBTWdFVFlDVUNBRElCQTJBbXdnQXlBWU5nSm9JQU1nRnpZQ1pDQURJQlkyQW1BZ0F5QUJOZ0o4SUFNZ0hEWUNlQ0FESUJVMkFuUWdBeUFVTmdKd0lCMGdDU0FQSUFvZ0N4Q25BaUFES0FKQUlSRWdBeWdDUkNFU0lBTW9Ba2doRXlBREtBSk1JUUlnQXlBSE5nSnNJQU1nQmpZQ2FDQURJQVUyQW1RZ0F5QUVOZ0pnSUFNZ0RqWUNmQ0FESUEwMkFuZ2dBeUFNTmdKMElBTWdDRFlDY0NBSklBb2dDeUFUUVlqWTNmRUJhaUFDUVphQ2s4MEJhaERBQWlBREtBSlFJUVFnQXlnQ1ZDRUZJQU1vQWxnaEJpQURLQUpjSVFjZ0F5QU9OZ0pzSUFNZ0RUWUNhQ0FESUF3MkFtUWdBeUFJTmdKZ0lBTWdCellDZkNBRElBWTJBbmdnQXlBRk5nSjBJQU1nQkRZQ2NDQUpJQW9nQ3lBUlFiWDV3cVVEYWlBU1FjenVvYm9DYWhEQUFpQURLQUpRSVFnZ0F5Z0NWQ0VNSUFNb0FsZ2hEU0FES0FKY0lRNGdBeUFQTmdKY0lBTWdHellDV0NBRElCbzJBbFFnQXlBWk5nSlFJQU1nQVRZQ2JDQURJQncyQW1nZ0F5QVZOZ0prSUFNZ0ZEWUNZQ0FESUFJMkFud2dBeUFUTmdKNElBTWdFallDZENBRElCRTJBbkFnSFNBSklCQWdDaUFMRUtjQ0lBTW9Ba0FoRHlBREtBSkVJUmtnQXlnQ1NDRWFJQU1vQWt3aEd5QURJQWMyQW13Z0F5QUdOZ0pvSUFNZ0JUWUNaQ0FESUFRMkFtQWdBeUFPTmdKOElBTWdEVFlDZUNBRElBdzJBblFnQXlBSU5nSndJQWtnQ2lBTElCcEJ5dFRpOWdScUlCdEJzNW53eUFOcUVNQUNJQU1vQWxBaEJDQURLQUpVSVFVZ0F5Z0NXQ0VHSUFNb0Fsd2hCeUFESUE0MkFtd2dBeUFOTmdKb0lBTWdERFlDWkNBRElBZzJBbUFnQXlBSE5nSjhJQU1nQmpZQ2VDQURJQVUyQW5RZ0F5QUVOZ0p3SUFrZ0NpQUxJQTlCODkrNXdRWnFJQmxCejVUejNBVnFFTUFDSUFNb0FsQWhDQ0FES0FKVUlRd2dBeWdDV0NFTklBTW9BbHdoRGlBRElCQTJBbHdnQXlBWU5nSllJQU1nRnpZQ1ZDQURJQlkyQWxBZ0F5QUNOZ0pzSUFNZ0V6WUNhQ0FESUJJMkFtUWdBeUFSTmdKZ0lBTWdHellDZkNBRElCbzJBbmdnQXlBWk5nSjBJQU1nRHpZQ2NDQWRJQWtnQVNBS0lBc1Fwd0lnQXlnQ1FDRVFJQU1vQWtRaEVTQURLQUpJSVJJZ0F5Z0NUQ0VUSUFNZ0J6WUNiQ0FESUFZMkFtZ2dBeUFGTmdKa0lBTWdCRFlDWUNBRElBNDJBbndnQXlBTk5nSjRJQU1nRERZQ2RDQURJQWcyQW5BZ0NTQUtJQXNnRWtIdnhwWEZCMm9nRTBIdWhiNmtCMm9Rd0FJZ0F5Z0NVQ0VXSUFNb0FsUWhGeUFES0FKWUlSZ2dBeWdDWENFRUlBTWdEallDYkNBRElBMDJBbWdnQXlBTU5nSmtJQU1nQ0RZQ1lDQURJQVEyQW53Z0F5QVlOZ0o0SUFNZ0Z6WUNkQ0FESUJZMkFuQWdDU0FLSUFzZ0VFSDQrK09aQjJzZ0VVSHNqOTdaQjJzUXdBSWdBeWdDVUNFRklBTW9BbFFoQmlBREtBSllJUWNnQXlnQ1hDRUlJQU1nQVRZQ1hDQURJQncyQWxnZ0F5QVZOZ0pVSUFNZ0ZEWUNVQ0FESUJzMkFtd2dBeUFhTmdKb0lBTWdHVFlDWkNBRElBODJBbUFnQXlBVE5nSjhJQU1nRWpZQ2VDQURJQkUyQW5RZ0F5QVFOZ0p3SUIwZ0NTQUNJQW9nQ3hDbkFpQURLQUpBSVJRZ0F5Z0NSQ0VWSUFNb0FrZ2hBU0FES0FKTUlRSWdBeUFFTmdKc0lBTWdHRFlDYUNBRElCYzJBbVFnQXlBV05nSmdJQU1nQ0RZQ2ZDQURJQWMyQW5nZ0F5QUdOZ0owSUFNZ0JUWUNjQ0FKSUFvZ0N5QUJRWldtdnQwRmF5QUNRWWFBaFBvR2F4REFBaUFES0FKUUlRRWdBeWdDVkNFQ0lBTW9BbGdoRHlBREtBSmNJUkFnQXlBSU5nSnNJQU1nQnpZQ2FDQURJQVkyQW1RZ0F5QUZOZ0pnSUFNZ0VEWUNmQ0FESUE4MkFuZ2dBeUFDTmdKMElBTWdBVFlDY0NBSklBb2dDeUFVUVk2T3Vzd0RheUFWUVltNG1ZZ0VheERBQWlBUUlDSnFJU0lnRHlBamFpRWpJQUlnSkdvaEpDQUJJQ1ZxSVNVZ0F5Z0NYQ0FlYWlFZUlBTW9BbGdnSDJvaEh5QURLQUpVSUNCcUlTQWdBeWdDVUNBaGFpRWhJUUVNQVFzTElBQWdJallDSENBQUlDTTJBaGdnQUNBZU5nSVVJQUFnSHpZQ0VDQUFJQ1EyQWd3Z0FDQWxOZ0lJSUFBZ0lEWUNCQ0FBSUNFMkFnQWdBMEdBQVdva0FBdkxMUUlaZndWK0l3QkJnQWRySWdZa0FDQUdRZWdEYWlJSklBRVFxQUlnQmtHNEJtb2lDQ0lISUFaQi9BTnFLQUlBTmdJQUlBWWdCaWtDOUFNM0E3QUdBa0FDUUFKQUFrQUNRQ0FHS0FMb0EwRURSdzBBSUFZb0F2QURJUTRnQmlnQzdBTWhDaUFHUWJBQ2FpQUhLQUlBTmdJQUlBWWdEallDcEFJZ0JpQUtOZ0tnQWlBR0lBWXBBN0FHTndLb0FpQUdJQVlvQW9BRU5nSzBBaUFKSUFaQm9BSnFJZ29RWXlBSElBWkJnQVJxS0FJQU5nSUFJQVlnQmlrQytBTTNBN0FHSUFZb0F1Z0RRUUZHRFFBZ0JpZ0M5QU1oQ3lBR0tBTHdBeUVPSUFZb0F1d0RJUWNnQmlnQ2hBUWhGeUFHTHdHSUJDRVlJQVpCdkFGcUlBZ29BZ0EyQWdBZ0JpQUdLUU93QmpjQ3RBRWdCaUFMTmdLd0FTQUdJQTQyQXF3QklBWWdCellDcUFFZ0NVR25uY2tBUVFNZ0JrR29BV29RdlFJZ0JpZ0M2QU5CQTBjTkFDQUdJQVlvQW9BRU5nSzBBaUFHSUFZcEF2Z0ROd0tzQWlBR0lBWW9BdlFETmdLb0FpQUdJQVlwQXV3RE53S2dBaUFKSUFvUXFBSWdCaWdDNkFOQkEwWU5BUXRCbVlDQWdIZ2hFUXdCQ3lBR0tBTDBBeUVRSUFZb0F2QURJUkVnQmlnQ2dBUWhEaUFHS1FMNEF5RWZJQVlvQXV3REloa05BU0FRSVFJTElBQWdEallDSENBQUlCODNBaFFnQUNBQ05nSVFJQUFnRVRZQ0RDQUFRUXcyQWdnTUFRc0NRQUovQWtBQ1FBSkFBa0FDUUFKQUFrQWdBeWdDQUVFQlJnUkFJQmNnQXlnQ0JFY05BU0FZSUFNdkFRaEhEUUVMSUFFb0FnUWhHaUFHSUE0MkFwd0NJQVlnSDBJZ2lLY2lHellDbUFJZ0JpQWZweUljTmdLVUFpQUdJQkEyQXBBQ0lBWWdFVFlDakFJZ0JpQVpOZ0tJQWlBR1FiQUdhaUFHUVlnQ2FoQmtJQVpCNEFWcUlnRWdCa0c0Qm1vcEF3QTNBd0FnQmtIb0JXb2lBeUFHUWNBR2Fpa0RBRGNEQUNBR0lBWXBBN0FHTndQWUJTQUdLQUxNQmlFSklBWW9Bc2dHSVFvZ0JpZ0MyQVlpQ0VHQWdJQ0FlRVlFUUNBR1FkQURhaUFCS1FNQU53TUFJQVpCMkFOcUlBTXBBd0EzQXdBZ0JpQUdLUVBZQlRjRHlBTU1CZ3NnQmlrRDBBWWhJeUFHUVl3RmFpQUdRZlFHYWlnQ0FEWUNBQ0FHUVlRRmFpQUdRZXdHYWlrQ0FEY0NBQ0FHUWZ3RWFpQUdRZVFHYWlrQ0FEY0NBQ0FHUVpnRmFpQUJLUU1BTndNQUlBWkJvQVZxSUFNcEF3QTNBd0FnQmlBR0tRTGNCamNDOUFRZ0JpQUdLUVBZQlRjRGtBVWdCaUFJTmdMd0JDQUdJQ00zQStnRUlBWWdDVFlDNUFRZ0JpQUtOZ0xnQkNBR1FiQUdhaUFHUVpBRmFoQ29BaUFHS1FMRUJpRWhJQVlwQXJ3R0lTQWdCaWtDdEFZaEh5QUdLQUt3QmlJRFFRTkhCRUFnSDBJZ2lDRWlJQVlvQXN3R0lRa01CUXNnQmlBaE53TzRCU0FHSUNBM0E3QUZJQVlnSHpjRHFBVWdCa0d3Qm1wQm1KM0pBRUVHSUFaQnFBVnFFTjhCSUFZcEFzQUdJU0FnQmlrQ3VBWWhIeUFHS0FLMEJpRURJQVlvQXJBR0lndEZEUUVnQmlBZ053TFFCU0FHSUI4M0FzZ0ZJQVlnQXpZQ3hBVWdCaUFMTmdMQUJVRUFJUUVDUUFKQUFrQURRQ0FCSUFOR0RRRWdBU0FMYWkwQUFDSUhRU0JISUFkQkNVZHhSUVJBSUFGQkFXb2hBUXdCQ3dzZ0JrR3dCbW9nQmtIQUJXb2dBUkMwQ0NBR0tBS3dCa1VFUUNBR0tBSzBCa1VOQWdzZ0JrSFlCV29nQmtHd0JtcEJNUHdLQUFBTUFnc2dCa0VCTmdLNEJpQUdRZ0EzQXJBR0N5QUdRZGdGYWlBR1FjQUZhaUFERUxRSUN5QUdOUUxnQlNFZklBWW9BdHdGSVFNQ1FBSkFJQVlvQXRnRklnRU5BRUVBSVFFZ0F3MEFEQUVMSUFZb0F2Z0ZJUWNnQmlrQzhBVWhJU0FHS1FMb0JTRWdJQVlvQXVRRklRc0xJQXV0UWlDR0lCK0VJUjhnQVVVTkFpQUdJQ0EzQXBBRElBWWdIemNDaUFNZ0JpQUROZ0tFQXlBR0lBRTJBb0FESUFaQnNBWnFJQVpCZ0FOcUVPUUJJQVlwQXNBR0lTQWdCaWtDdUFZaEh5QUdLQUswQmlFRElBWW9BckFHSWdkRkRRRU1Bd3NnQUVLTWdJQ0FvSU9BZ0lCL053TUlEQWdMSUFZb0F0QUdJUWNnQmlrQ3lBWWhJUXNnSDBJZ2lDRWlJQU5CQTBjRVFDQUhJUWtNQWdzZ0lxY2hBeUFmcHlFSElDQWhIeUFoSVNBTElBWWdDallDNEFNZ0JrR3NBMm9nQmtIMEJHb2lBVUVZYWlnQ0FEWUNBQ0FHUWFRRGFpQUJRUkJxS1FJQU53SUFJQVpCbkFOcUlBRkJDR29wQWdBM0FnQWdCa0c0QTJvZ0h6Y0RBQ0FHUWNBRGFpQWdOd01BSUFaQjJBUnFJQ0EzQXdBZ0JrSFFCR29nSHpjREFDQUdJQUVwQWdBM0FwUURJQVlnQjYwZ0E2MUNJSWFFSWlBM0E3QURJQVlnSURjRHlBUWdCaWdDekFRaEVpQUdJQWcyQXBBRElBWWdJemNEaUFNZ0JpQUpOZ0tFQXlBR0lBbzJBb0FESUFaQndBVnFJQVpCZ0FOcVFlVFV5UUJCQmhEUEFRSkFBa0FDUUNBR0tBTEFCVUdmZ0lDQWVFY0VRQ0FHUWR3RGFpQUdRZEFGYWlnQ0FEWUNBQ0FHUWRRRGFpQUdRY2dGYWlrQ0FEY0NBQ0FHSUFZcEFzQUZOd0xNQXlBR1FRRTJBc2dEREFFTElBWkI0QVJxSUFZb0FzUUZJZ0VReEFRQ1FBSkFBa0FnQmlnQzRBUkJuNENBZ0hoR0JFQWdCaThCNkFRaENTQUdLQUxrQkNFTElBVXBBeGdoSUNBRktRTVFJUjhnQlNnQ0RFVU5BU0FmSUNBZ0N5QUpFT3NESVNFZ0JTZ0NCQ0lESUNHbmNTRUJJQ0ZDR1loQy93Q0RRb0dDaElpUW9NQ0FBWDRoSXlBRktBSUFJUWdnQ1VILy93TnhJUW9EUUNBQklBaHFLUUFBSWlJZ0k0VWlJVUovaFNBaFFvR0NoSWlRb01DQUFYMkRRb0NCZ29TSWtLREFnSCtESVNFRFFDQWhVRVVFUUNBSUlDRjZwMEVEZGlBQmFpQURjVUVEZEdzaUQwRUlheWdDQUNBTFJnUkFRWk9BZ0lCNElRY2dDaUFQUVFSckx3RUFSZzBHQ3lBaFFnRjlJQ0dESVNFTUFRc0xJQ0lnSWtJQmhvTkNnSUdDaElpUW9NQ0FmNE5RUlEwQ0lBRWdERUVJYWlJTWFpQURjU0VCREFBTEFBc2dCa0hJQTJvZ0FTZ0NBQ0FCUVFocUtRTUFFTHdFSUFaQjRBUnFFTTBDREFJTElBWWdDVHNCckFVZ0JpQUxOZ0tvQlNBZklDQWdDeUFKRU9zRElSOGdCaUFHUWFnRmFqWUNrQVVnQlNnQ0NFVUVRQUpBSXdCQlFHb2lBU1FBSUFFZ0JVRVFhaUlJTmdJTUlBVW9BZ3doQXlBQklBRkJER28yQWhBZ0EwRi9Sd1JBQW44Q1FDQUZLQUlFSWdjZ0IwRUJha0VEZGtFSGJDQUhRUWhKR3lJSFFRRjJJQU5OQkVBZ0FVRXdhaUFISUFNZ0F5QUhTUnRCQVdvUS9nSWdBU2dDTkNJS0lBRW9BakFpQjBVTkFob2dBU2dDT0NFTUlBRWdBU2dDUERZQ0xDQUJJQXcyQWlnZ0FTQUtOZ0lrSUFFZ0J6WUNJQ0FCUW9pQWdJQ0FBVGNDR0NBQklBZzJBaFFnQlNnQ0FDSVBLUU1BUW4rRlFvQ0Jnb1NJa0tEQWdIK0RJU0FnQVVFZ2FpRWRRUUFoQ0FOQUlBTUVRQU5BSUNCUUJFQWdDRUVJYWlFSUlBOUJDR29pRHlrREFFSi9oVUtBZ1lLRWlKQ2d3SUIvZ3lFZ0RBRUxDeUFISUFjZ0NpQUJRUkJxSUFVZ0lIcW5RUU4ySUFocUloNFEzUVlRMGdaQmYzTkJBM1JxSUFVb0FnQWdIa0YvYzBFRGRHb3BBQUEzQUFBZ0EwRUJheUVESUNCQ0FYMGdJSU1oSUF3QkN3c2dBU0FGS0FJTUlnTTJBaXdnQVNBTUlBTnJOZ0lvSUFVZ0hSRFRDU0FCUVJScUVLZ0ZEQUVMSUFVZ0FVRVFha0UrRUpNQkMwRUFDeG9nQVVGQWF5UUFEQUVMRU9jR0FBc0xJQVlnQmtHUUJXbzJBckFHSUFZZ0JUWUN0QVlnQmlBRktBSUFJQVVvQWdRZ0h5QUdRYkFHYWtFOUVQNEJJQVlvQWdCQkFYRUVRQ0FGS0FJQUlnRWdCaWdDQkNJRGFpSUhMUUFBSVFnZ0JpZ0NxQVVoQ2lBR0x3R3NCU0VNSUFjZ0g2ZEJHWFlpQnpvQUFDQUJJQVVvQWdRZ0EwRUlhM0ZxUVFocUlBYzZBQUFnQlNBRktBSU1RUUZxTmdJTUlBVWdCU2dDQ0NBSVFRRnhhellDQ0NBQklBTkJBM1JySWdGQkJHc2dERHNCQUNBQlFRaHJJQW8yQWdBTFFaR0FnSUI0SVFjQ1FDQUVLQUtFQWlJSVJRMEFJQVFvQW9nQ0lRd0RRQ0FJUWR3QWFpRURJQWd2QVlvQklnMUJBblFoQVVGL0lRb0NRQU5BSUFGRkJFQWdEU0VLREFJTElBTW9BZ0FoRHlBS1FRRnFJUW9nQVVFRWF5RUJJQU5CQkdvaEF3SkFJQXNnRDBzZ0N5QVBTV3RCL3dGeERnSUFBUUlMQ3lBR1FaR0FnSUI0TmdLd0JpQUdRYkFHYWlJREVNMENJQWdnQ2tFRGRHb2lBUzhCQUVFQ1J3MENJQUV2QVFJZ0NVSC8vd054UncwQ0lBRW9BZ1FoQVNBR0lBazdBYkFGSUFZZ0N6WUNyQVVnQmtFQk5nS29CU0FESUFRZ0FTQUdRYWdGYWlBRkVLSUJJQVpCbUFWcUlnTWdCa0hPQm1vdkFRQTdBUUFnQmlBR0tRSEdCamNEa0FVZ0JpOEJ4QVloQ1NBR0tBTEFCaUVMSUFZb0Fyd0dJUWNnQmlnQ3VBWWlBVUVNUmdSQUlBWkI0QVZxSUFNdkFRQTdBUUFnQmlBR0tRT1FCVGNEMkFVTUJBc2dCa0hpQldvZ0JrSFFCbXBCTVB3S0FBQWdCa0hnQldvZ0JrR1lCV292QVFBN0FRQWdCaUFHS1FPUUJUY0QyQVVnQmlBSk93RzhCaUFHSUFzMkFyZ0dJQVlnQnpZQ3RBWWdCaUFCTmdLd0JpQUdRYjRHYWlBR1FkZ0Zha0U2L0FvQUFDQUdRY2dEYWlBQklBWXBBN2dHRUx3RUlBWkJzQVpxRVBRRURBUUxJQXhGRFFFZ0RFRUJheUVNSUFnZ0NrRUNkR29vQW93QklRZ01BQXNBQ3dzZ0JrSGVBMm9nQmtIZ0JXb3ZBUUE3QVFBZ0JpQUpPd0hVQXlBR0lBczJBdEFESUFZZ0J6WUN6QU1nQmlBR0tRUFlCVGNCMWdNZ0JrRUJOZ0xJQXdzZ0JpZ0N5QU5CQVhGRkRRRUxJQVpCaUFScUlBWkJnQU5xUVREOENnQUFJQVpCOEFOcUlBWkIwQVJxS1FNQU53TUFJQVpCK0FOcUlBWkIyQVJxS1FNQU53TUFRUUVoQXlBR1FRRTZBTVFFSUFaQkFEWUN3QVFnQmtLQWdJQ0FFRGNEdUFRZ0JpQVJJQkpyTmdLRUJDQUdRUUUyQW9BRUlBWWdCaWtEeUFRM0ErZ0REQUVMQWtBZ0Jpa0QwQU1pSUVJQVdRUkFJQVpCc0FacUlDQ25JQVpCeUFScUVPQUJJQVlvQXRBR0lSSWdCaWdDekFZaEN5QUdLQUxJQmlFS0lBWW9Bc1FHSVFFZ0JpZ0N3QVloQXlBR0tBSzhCaUVGSUFZb0FyZ0dJUWNnQmlnQ3RBWWhEQUpBQWtBQ1FDQUdLQUt3QmlJUFJRUkFJQXdoQ0NBSElRUU1BUXNnQmlBQk5nTHNCU0FHSUFNMkF1Z0ZJQVlnQlRZQzVBVWdCaUFITmdMZ0JTQUdJQXcyQXR3RklBWWdEellDMkFVZ0JrR3dCbW9nQmtIWUJXb1FqUUVnQmlnQ3VBWWhCQ0FHS0FLMEJpRUlBa0FnQmlnQ3NBWWlDVVVFUUVFNUlRa0NRQUpBQWtBZ0NFRUJhdzRDQVFBQ0N5QUdRZE1HYWkwQUFFRVlkQ0FHTHdEUkJrRUlkSEloQ0NBR0xRRFFCaUVKSUFZb0FzQUdJUk1nQmlnQ3pBWWhGQ0FHS0FMSUJpRVZJQVlvQXNRR0lSWWdCaWdDdkFZaERRd0JDMEU2SVFsQkFDRUlDeUFJSUFseUlnbEIvd0Z4UVR0R0JFQWdEU0VJSUJNaEJ5QVdJUVVnRlNFRElCUWhBU0FFSVFrTUFnc0NRQUpBUVFJZ0NVRTVhMEgvQVhFaUNDQUlRUUpQR3lJSVFRRnJEZ0lBQVFVTElBd2hDQ0FQSVFrTUFnc2dEU0VGSUJNaEF5QVdJUUVnRlNFS0lCUWhDMEVDSVFnTUF3c2dCaWdDeEFZaEFTQUdLQUxBQmlFRElBWW9BcndHSVFVZ0JDRUhDeUFHSUFFMkF2UUVJQVlnQXpZQzhBUWdCaUFGTmdMc0JDQUdJQWMyQXVnRUlBWWdDRFlDNUFRZ0JpQUpOZ0xnQkNBR1FiQUdha0dlbmNrQVFRa2dCa0hnQkdvUXZRSWdCaWdDeUFZaEJ5QUdLQUxFQmlFTklBWW9Bc0FHSVFFZ0JpZ0N2QVloQXlBR0tBSzRCaUVGSUFZb0FyUUdJUVFnQmlnQ3NBWWlDRUVEUndSQUlBWW9Bc3dHSVFrZ0RTRUtJQWNoQ3d3Q0N5QUVEUUlnQlNFSUlBTWhCQ0FCSVFVZ0RTRURJQWNoQVFzZ0VpRUpDeUFHSUFrMkFxQUVJQVlnQ3pZQ25BUWdCaUFLTmdLWUJDQUdJQUUyQXBRRUlBWWdBellDa0FRZ0JpQUZOZ0tNQkNBR0lBUTJBb2dFSUFZZ0NEWUNoQVFNQWdzZ0JrR3dCbW9pQ1NBR1FZQURha0V3L0FvQUFDQUdRZGdGYWlJSUlBb2dDeENyQkNBR1FZQUVhaUFKSUFnUXlBVWdCaUFITmdMOEF5QUdJQTAyQXZnRElBWWdBVFlDOUFNZ0JpQUROZ0x3QXlBR0lBVTJBdXdESUFZZ0JEWUM2QU1nQmlnQ2dBUWhBd3dDQ3lBR1FaZ0VhaUFHUWRnRWFpa0RBRGNEQUNBR1FaQUVhaUFHUWRBRWFpa0RBRGNEQUNBR0lBWXBBOGdFTndPSUJDQUdRUTA2QUtBRUlBWkJBallDaEFRTElBWkJnQU5xRU9vSElBWkJ5QU5xRU1NSURBTUxJQVpCeUFOcUVNTUlJQU5CREVZTkFpQUdRYmdCYWlBR1FmZ0RhaWtEQURjREFDQUdRYkFCYWlBR1FmQURhaWtEQURjREFDQUdJQVlwQStnRE53T29BU0FHS0FLRUJDRUZJQVlvQW9nRUlRUWdCa0hrQVdvaUNTQUdRYVFFYWtFay9Bb0FBQ0FHUWR3QmFpQUdRWndFYWlrQ0FEY0NBQ0FHUWRRQmFpQUdRWlFFYWlrQ0FEY0NBQ0FHSUFRMkFzZ0JJQVlnQlRZQ3hBRWdCaUFETmdMQUFTQUdJQVlwQW93RU53TE1BU0FHUWFnQmFpRU9JQVpCeUFGcURBTUxJQVlnSURjQzFBTWdCaUFETmdMSUF5QUdJQjlDLy8vLy93K0RJQ0pDSUlhRU53TE1BeUFHSUNFM0F0d0RJQ0ZDSUlpbklRb2dCa0hnQkdvUTZnY0xJQVpCakFScUlBWkIwQU5xS1FNQU53SUFJQVpCbEFScUlBWkIyQU5xS1FNQU53SUFJQVlnQmlrRHlBTTNBb1FFSUFZZ0NUWUNvQVFnQmlBS05nS2NCQXNnQmlnQ2lBUWhBeUFHS0FLRUJDSUJCRUFnQmtHb0Jtb2dCa0djQkdvcEFnQTNBd0FnQmtHZ0Jtb2dCa0dVQkdvcEFnQTNBd0FnQmlBR0tRS01CRGNEbUFZTElBWkIzQUZxSUFaQnFBWnFLUU1BTndJQUlBWkIxQUZxSUFaQm9BWnFLUU1BTndJQUlBWWdCaWtEbUFZM0Fzd0JJQVlnQXpZQ3lBRWdCa0VNTmdMQUFTQUdJQUUyQXNRQklBRkJBVWNOQVNBR0lBNDJBdndESUFZZ0d6WUMrQU1nQmlBY05nTDBBeUFHSUJBMkF2QURJQVlnRVRZQzdBTWdCaUFaTmdMb0F5QUdRYUFDYWlJT0lBWkI2QU5xRUJvZ0JpZ0N1QUlpQTBFTVJnMEJJQVpCM0FKcUlRa2dCaWdDd0FJaEJDQUdLQUs4QWlFRklBWkJ3QUpxQ3lFQklBWkJvQUZxSUE1QkVHb3BBd0EzQXdBZ0JrR1lBV29nRGtFSWFpa0RBRGNEQUNBR0lBNHBBd0EzQTVBQklBRW9BZ1FoRENBQktBSUlJUk1nQVNnQ0RDRVVJQUVvQWhBaEZTQUJLQUlVSVJZZ0FTZ0NHQ0VRSUFaQmpBUnFJZ0VnQ1VFay9Bb0FBQ0FHSUJBMkFvZ0VJQVlnRmpZQ2hBUWdCaUFWTmdLQUJDQUdJQlEyQXZ3RElBWWdFellDK0FNZ0JpQU1OZ0wwQXlBR0lBUTJBdkFESUFZZ0JUWUM3QU1nQmlBRE5nTG9BeUFHUWFBQ2FpQUdRWkFCYWhDb0FpQUdLQUtnQWtFRFJ3UkFJQVpCNkFOcUVQUUVEQUVMSUFZb0FyZ0NJUWNnQmlnQ3RBSWhDU0FHS0FLd0FpRUlJQVlvQXF3Q0lRMGdCaWdDcUFJaENpQUdLQUtrQWlFTElBWkIxQUJxSUFGQkpQd0tBQUFnQmlBSE5nS01BU0FHSUFrMkFvZ0JJQVlnQ0RZQ2hBRWdCaUFOTmdLQUFTQUdJQW8yQW53Z0JpQUxOZ0o0SUFaQmpBUnFJZzhnQmtIVUFHcEJKUHdLQUFBZ0JpQVFOZ0tJQkNBR0lCWTJBb1FFSUFZZ0ZUWUNnQVFnQmlBVU5nTDhBeUFHSUJNMkF2Z0RJQVlnRERZQzlBTWdCaUFFTmdMd0F5QUdJQVUyQXV3RElBWWdBellDNkFNZ0JrR2dBbW9pQnlBR1FmZ0FhaENvQWdKQUlBWW9BcUFDUVFOSERRQWdCaWdDcEFJaEFTQUdLQUtvQWlFTElBWW9BcXdDSVFvZ0JpZ0NzQUloQ1NBR0tBSzBBaUVJSUFZZ0JpZ0N1QUlpRWpZQ3ZBRWdCaUFJTmdLNEFTQUdJQWsyQXJRQklBWWdDallDc0FFZ0JpQUxOZ0tzQVNBR0lBRTJBcWdCSUFkQnFwM0pBRUVHSUFaQnFBRnFFSzhDSUFZb0FxUUNJUWNDUUFKQUFrQUNRQUpBSUFZb0FxQUNJZzFGQkVBZ0IwRUJhdzRDQWdFR0N5QUdLQUswQWlFU0lBWW9BckFDSVFnZ0JpZ0NyQUloQ1NBR0tBS29BaUVLREFJTElBWXRBTUFDUVRwSERRUUxJQUZGRFFFZ0FTRU5JQXNoQndzZ0JpQVNOZ0xFQmlBR0lBZzJBc0FHSUFZZ0NUWUN2QVlnQmlBS05nSzRCaUFHSUFjMkFyUUdJQVlnRFRZQ3NBWWdCa0dnQW1vZ0JrR3dCbW9RcUFJZ0JpZ0NvQUpCQTBZTkFRd0NDeUFMUVFOSERRRUxJQVpCTEdvZ0QwRWsvQW9BQUNBR0lCQTJBaWdnQmlBV05nSWtJQVlnRlRZQ0lDQUdJQlEyQWh3Z0JpQVROZ0lZSUFZZ0REWUNGQ0FHSUFRMkFoQWdCaUFGTmdJTUlBWWdBellDQ0NBR1FRaHFJZ0VnR2lBUmF4REpCU0FHUWVvRGFpQUJRY2dBL0FvQUFDQUFJQmc3QVFRZ0FDQVhOZ0lBSUFCQkJtb2dCa0hvQTJwQnlnRDhDZ0FBREFJTElBWkI2QU5xRVBRRUN5QUFJQUkyQWhBZ0FFS01nSUNBa0lPQWdJQi9Od01JQ3lBR1FZQUhhaVFBQzVjcUFnUi9JbjRqQUVHd0FXc2lBeVFBSUFOQkFFR0FBZndMQUNBQklBSkJCM1JxSVFVZ0FDa0RPQ0VuSUFBcEF6QWhKU0FBS1FNb0lTTWdBQ2tESUNFZ0lBQXBBeGdoS0NBQUtRTVFJU1lnQUNrRENDRWtJQUFwQXdBaElRTkFJQUVnQlVaRkJFQkJFRUdBQVVFSUVNVUlJZ0lnQWtFUVR4dEJBM1FoQkNBQlFZQUJha0VBSVFJRFFDQUNJQVJHUlFSQUlBSWdBMm9nQVNBQ2Fpa0FBQ0lRUWppR0lCQkNnUDREZzBJb2hvUWdFRUtBZ1B3SGcwSVloaUFRUW9DQWdQZ1BnMElJaG9TRUlCQkNDSWhDZ0lDQStBK0RJQkJDR0loQ2dJRDhCNE9FSUJCQ0tJaENnUDREZ3lBUVFqaUloSVNFTndNQUlBSkJDR29oQWd3QkN3c2dBeWtER0NFTklBTXBBeEFoRHlBREtRTUlJUnNnQTBHZ0FXb2lBU0FoSUNBZ0pDQWpJQ1lnSlNBb0lDY2dBeWtEQUNJaVFxTGNvcm1OODR2RndnQjhFS1lFSUFFZ0F5a0RvQUVpRUNBREtRT29BU0lNSUNFZ0lDQWtJQ01nSmlBbElCdEN6Y3U5bjVLUzBadnhBSHdRcGdRZ0FTQURLUU9nQVNJUklBTXBBNmdCSWhJZ0VDQU1JQ0VnSUNBa0lDTWdEMExSaWN1ZGdZYkJuOG9BZlJDbUJDQUJJQU1wQTZBQklnY2dBeWtEcUFFaUZDQVJJQklnRUNBTUlDRWdJQ0FOUXNUSTJQT25pNG1sRm4wUXBnUWdBeWtET0NFWUlBTXBBekFoR1NBREtRTW9JUjBnQVNBREtRT2dBU0ljSUFNcEE2Z0JJZzRnQnlBVUlCRWdFaUFRSUF3Z0F5a0RJQ0llUXJqcW9wcS95N0NyT1h3UXBnUWdBU0FES1FPZ0FTSVFJQU1wQTZnQklnd2dIQ0FPSUFjZ0ZDQVJJQklnSFVLWm9KZXdtNzdFK05rQWZCQ21CQ0FCSUFNcEE2QUJJaElnQXlrRHFBRWlFeUFRSUF3Z0hDQU9JQWNnRkNBWlF1WGdtb2UxcTUvZzdRQjlFS1lFSUFFZ0F5a0RvQUVpQnlBREtRT29BU0lVSUJJZ0V5QVFJQXdnSENBT0lCaEM2UDNKcktLbDZQSFVBSDBRcGdRZ0F5a0RXQ0VjSUFNcEExQWhFU0FES1FOSUlRNGdBU0FES1FPZ0FTSVdJQU1wQTZnQkloVWdCeUFVSUJJZ0V5QVFJQXdnQXlrRFFDSWZRcjc3OCtmMXJKWDhKMzBRcGdRZ0FTQURLUU9nQVNJTUlBTXBBNmdCSWhvZ0ZpQVZJQWNnRkNBU0lCTWdEa0srMzhHcmxPRFd3Uko4RUtZRUlBRWdBeWtEb0FFaUV5QURLUU9vQVNJSUlBd2dHaUFXSUJVZ0J5QVVJQkZDak9XUzkrUzM0WmdrZkJDbUJDQUJJQU1wQTZBQklnY2dBeWtEcUFFaUZDQVRJQWdnRENBYUlCWWdGU0FjUXVMcC9xKzl1SitHMVFCOEVLWUVJQU1wQTNnaEVpQURLUU53SVJBZ0F5a0RhQ0VXSUFFZ0F5a0RvQUVpRlNBREtRT29BU0lYSUFjZ0ZDQVRJQWdnRENBYUlBTXBBMkFpR2tMdmt1NlR6NjZYMy9JQWZCQ21CQ0FCSUFNcEE2QUJJZ29nQXlrRHFBRWlDU0FWSUJjZ0J5QVVJQk1nQ0NBV1FzL1NwYWVjd05PUS93QjlFS1lFSUFFZ0F5a0RvQUVpRXlBREtRT29BU0lJSUFvZ0NTQVZJQmNnQnlBVUlCQkN5OXZqMFkyci9wSGtBSDBRcGdRZ0FTQURLUU9nQVNJVUlBTXBBNmdCSWdzZ0V5QUlJQW9nQ1NBVklCY2dFa0xzc3R1RXM5R0RzajU5RUtZRUlBTXBBNmdCSVF3Z0F5a0RvQUVoQnlBRFFZQUJhaUlDSUJzZ0lpQVBJQkVnRGlBU0lCQVFsUVFnQTBHUUFXb2lCQ0FOSUE4Z0hpQWFJQndnQXlrRGdBRWlJaUFES1FPSUFTSWJFSlVFSUFNcEE1QUJJUlVnQXlrRG1BRWhGeUFCSUFjZ0RDQVVJQXNnRXlBSUlBb2dDU0FiUXE3cXVvam14Nld5RzMwUXBnUWdBU0FES1FPZ0FTSUtJQU1wQTZnQklna2dCeUFNSUJRZ0N5QVRJQWdnSWtLZHRNTzluSS91b0JCOUVLWUVJQUVnQXlrRG9BRWlFeUFES1FPb0FTSUlJQW9nQ1NBSElBd2dGQ0FMSUJkQ3RhdXozT2k0NStBUGZCQ21CQ0FCSUFNcEE2QUJJZ3NnQXlrRHFBRWlEU0FUSUFnZ0NpQUpJQWNnRENBVlF1VzRzcjNIdWFpR0pId1FwZ1FnQXlrRHFBRWhCeUFES1FPZ0FTRVBJQUVnSFNBZUlCa2dFQ0FXSUJVZ0Z4Q1ZCQ0FCSUJnZ0dTQWZJQnNnRWlBREtRT2dBU0liSUFNcEE2Z0JJaFFRbFFRZ0F5a0RvQUVoR1NBREtRT29BU0VNSUFFZ0R5QUhJQXNnRFNBVElBZ2dDaUFKSUJSQzlZU3N5ZldOeS9RdGZCQ21CQ0FCSUFNcEE2QUJJZ29nQXlrRHFBRWlDU0FQSUFjZ0N5QU5JQk1nQ0NBYlFvUEptL1dtbGFHNnlnQjhFS1lFSUFFZ0F5a0RvQUVpRXlBREtRT29BU0lJSUFvZ0NTQVBJQWNnQ3lBTklBeEMxUGVINnN1N3F0amNBSHdRcGdRZ0FTQURLUU9nQVNJTElBTXBBNmdCSWcwZ0V5QUlJQW9nQ1NBUElBY2dHVUsxcDhXWXFKdmkvUFlBZkJDbUJDQURLUU9vQVNFSElBTXBBNkFCSVE4Z0FTQU9JQjhnRVNBWElDSWdHU0FNRUpVRUlBRWdIQ0FSSUJvZ0ZDQVZJQU1wQTZBQkloY2dBeWtEcUFFaUhCQ1ZCQ0FES1FPZ0FTRU9JQU1wQTZnQklSRWdBU0FQSUFjZ0N5QU5JQk1nQ0NBS0lBa2dIRUxWd09TTTBkWHI0T2NBZlJDbUJDQUJJQU1wQTZBQkloVWdBeWtEcUFFaUNpQVBJQWNnQ3lBTklCTWdDQ0FYUXZDYnI1S3RzbzduMXdCOUVLWUVJQUVnQXlrRG9BRWlDQ0FES1FPb0FTSUpJQlVnQ2lBUElBY2dDeUFOSUJGQ3diMlR1UGFHdHY3UEFIMFFwZ1FnQVNBREtRT2dBU0lMSUFNcEE2Z0JJZzBnQ0NBSklCVWdDaUFQSUFjZ0RrS2M0c09JaEllZzA4QUFmUkNtQkNBREtRT29BU0VISUFNcEE2QUJJUThnQVNBV0lCb2dFQ0FNSUJzZ0RpQVJFSlVFSUFFZ0VpQVFJQU1wQTRnQkloSWdIQ0FaSUFNcEE2QUJJaGdnQXlrRHFBRWlFeENWQkNBREtRT2dBU0VXSUFNcEE2Z0JJUkFnQVNBUElBY2dDeUFOSUFnZ0NTQVZJQW9nRTBLKzROMlN6SUg5anpsOUVLWUVJQUVnQXlrRG9BRWlDaUFES1FPb0FTSWRJQThnQnlBTElBMGdDQ0FKSUJoQzI3SFY1NGJYbTZ3cWZSQ21CQ0FCSUFNcEE2QUJJZ2dnQXlrRHFBRWlDU0FLSUIwZ0R5QUhJQXNnRFNBUVF1K0Vqb0NlNnBqbEJud1FwZ1FnQVNBREtRT2dBU0lMSUFNcEE2Z0JJZzBnQ0NBSklBb2dIU0FQSUFjZ0ZrTHczTG5ROEt6S2xCUjhFS1lFSUFNcEE2Z0JJUWNnQXlrRG9BRWhEeUFCSUFNcEE0QUJJQklnQXlrRG1BRWlFaUFSSUJjZ0ZpQVFFSlVFSUFFZ0F5a0RrQUVnRWlBVUlCTWdEaUFES1FPZ0FTSWVJQU1wQTZnQkloVVFsUVFnQXlrRG9BRWhHaUFES1FPb0FTRVNJQUVnRHlBSElBc2dEU0FJSUFrZ0NpQWRJQlZDL04vSXR0VFF3dHNuZkJDbUJDQUJJQU1wQTZBQklnb2dBeWtEcUFFaUhTQVBJQWNnQ3lBTklBZ2dDU0FlUXFhU20rR0ZwOGlOTG53UXBnUWdBU0FES1FPZ0FTSUlJQU1wQTZnQklna2dDaUFkSUE4Z0J5QUxJQTBnRWtMdDFaRFd4YitibHMwQWZCQ21CQ0FCSUFNcEE2QUJJZ3NnQXlrRHFBRWlEU0FJSUFrZ0NpQWRJQThnQnlBYVF0L24xdXk1b29PYzB3QjhFS1lFSUFNcEE2Z0JJUWNnQXlrRG9BRWhEeUFDSUJzZ0ZDQU1JQkFnR0NBYUlCSVFsUVFnQkNBWklBd2dIQ0FWSUJZZ0F5a0RnQUVpSWlBREtRT0lBU0lNRUpVRUlBTXBBNUFCSVJzZ0F5a0RtQUVoSHlBQklBOGdCeUFMSUEwZ0NDQUpJQW9nSFNBTVF0N0h2ZDNJNnB5RjVRQjhFS1lFSUFFZ0F5a0RvQUVpQ2lBREtRT29BU0lkSUE4Z0J5QUxJQTBnQ0NBSklDSkNxT1hlNDdQWGdyWDJBSHdRcGdRZ0FTQURLUU9nQVNJSUlBTXBBNmdCSWdrZ0NpQWRJQThnQnlBTElBMGdIMEthb3NuQW05ck5udjRBZlJDbUJDQUJJQU1wQTZBQklnc2dBeWtEcUFFaURTQUlJQWtnQ2lBZElBOGdCeUFiUXNXVjk5dXU3L1RHN1FCOUVLWUVJQU1wQTZnQklRY2dBeWtEb0FFaER5QUJJQmNnSENBUklCSWdIaUFiSUI4UWxRUWdBU0FPSUJFZ0V5QU1JQm9nQXlrRG9BRWlGeUFES1FPb0FTSVVFSlVFSUFNcEE2QUJJUmtnQXlrRHFBRWhEQ0FCSUE4Z0J5QUxJQTBnQ0NBSklBb2dIU0FVUXB6NXU1anI2NFdnM1FCOUVLWUVJQUVnQXlrRG9BRWlEaUFES1FPb0FTSUtJQThnQnlBTElBMGdDQ0FKSUJkQy81LzNuY1MyNXZMWEFIMFFwZ1FnQVNBREtRT2dBU0lJSUFNcEE2Z0JJZ2tnRGlBS0lBOGdCeUFMSUEwZ0RFTHYwSjM0OHBHZDJqMTlFS1lFSUFFZ0F5a0RvQUVpQ3lBREtRT29BU0lOSUFnZ0NTQU9JQW9nRHlBSElCbEMwSU90emMvTDY4azRmUkNtQkNBREtRT29BU0VSSUFNcEE2QUJJUWNnQVNBWUlCTWdFQ0FmSUNJZ0dTQU1FSlVFSUFFZ0ZpQVFJQlVnRkNBYklBTXBBNkFCSWhzZ0F5a0RxQUVpRHhDVkJDQURLUU9nQVNFY0lBTXBBNmdCSVJBZ0FTQUhJQkVnQ3lBTklBZ2dDU0FPSUFvZ0QwTG8yOExJNHZ6RnRpNTlFS1lFSUFFZ0F5a0RvQUVpQ2lBREtRT29BU0lZSUFjZ0VTQUxJQTBnQ0NBSklCdEM4SzNwMUxxN3ZyTXBmUkNtQkNBQklBTXBBNkFCSWdnZ0F5a0RxQUVpQ1NBS0lCZ2dCeUFSSUFzZ0RTQVFRdGEvdThTcXovTDRDMzBRcGdRZ0FTQURLUU9nQVNJTElBTXBBNmdCSWcwZ0NDQUpJQW9nR0NBSElCRWdIRUs0bysrVmc0Nm90UkI4RUtZRUlBTXBBNmdCSVFjZ0F5a0RvQUVoRGlBQklCNGdGU0FTSUF3Z0Z5QWNJQkFRbFFRZ0FTQWFJQklnQXlrRGlBRWlFaUFQSUJrZ0F5a0RvQUVpSFNBREtRT29BU0lURUpVRUlBTXBBNkFCSVJZZ0F5a0RxQUVoRVNBQklBNGdCeUFMSUEwZ0NDQUpJQW9nR0NBVFFzaWh5OGJyb3JEU0dYd1FwZ1FnQVNBREtRT2dBU0lLSUFNcEE2Z0JJaGdnRGlBSElBc2dEU0FJSUFrZ0hVTFQxb2FLaFlIYm14NThFS1lFSUFFZ0F5a0RvQUVpQ0NBREtRT29BU0lKSUFvZ0dDQU9JQWNnQ3lBTklCRkNtZGU3L00zcG5hUW5mQkNtQkNBQklBTXBBNkFCSWdzZ0F5a0RxQUVpRFNBSUlBa2dDaUFZSUE0Z0J5QVdRcWlSN1l6ZWxxL1lOSHdRcGdRZ0F5a0RxQUVoQnlBREtRT2dBU0VPSUFFZ0F5a0RnQUVnRWlBREtRT1lBU0lTSUJBZ0d5QVdJQkVRbFFRZ0FTQURLUU9RQVNBU0lCUWdFeUFjSUFNcEE2QUJJaDRnQXlrRHFBRWlGUkNWQkNBREtRT2dBU0VhSUFNcEE2Z0JJUklnQVNBT0lBY2dDeUFOSUFnZ0NTQUtJQmdnRlVManRLV3V2SmFEampsOEVLWUVJQUVnQXlrRG9BRWlDaUFES1FPb0FTSVlJQTRnQnlBTElBMGdDQ0FKSUI1Q3k1V0dtcTdKcXV6T0FId1FwZ1FnQVNBREtRT2dBU0lJSUFNcEE2Z0JJZ2tnQ2lBWUlBNGdCeUFMSUEwZ0VrTHp4bys3OThteXp0c0FmQkNtQkNBQklBTXBBNkFCSWdzZ0F5a0RxQUVpRFNBSUlBa2dDaUFZSUE0Z0J5QWFRcVB4eXJXOS9wdVg2QUI4RUtZRUlBTXBBNmdCSVFjZ0F5a0RvQUVoRGlBQ0lCY2dGQ0FNSUJFZ0hTQWFJQklRbFFRZ0JDQVpJQXdnRHlBVklCWWdBeWtEZ0FFaUh5QURLUU9JQVNJVUVKVUVJQU1wQTVBQklSa2dBeWtEbUFFaEZ5QUJJQTRnQnlBTElBMGdDQ0FKSUFvZ0dDQVVRdnpsdnUvbDNlREg5QUI4RUtZRUlBRWdBeWtEb0FFaUNpQURLUU9vQVNJWUlBNGdCeUFMSUEwZ0NDQUpJQjlDNE43Y21QVHQyTkw0QUh3UXBnUWdBU0FES1FPZ0FTSUlJQU1wQTZnQklna2dDaUFZSUE0Z0J5QUxJQTBnRjBLT3FiM3d0ZjNobS9zQWZSQ21CQ0FCSUFNcEE2QUJJZ3NnQXlrRHFBRWlEU0FJSUFrZ0NpQVlJQTRnQnlBWlFwU003NnordnIrYzh3QjlFS1lFSUFNcEE2Z0JJUXdnQXlrRG9BRWhCeUFCSUJzZ0R5QVFJQklnSGlBWklCY1FsUVFnQVNBY0lCQWdFeUFVSUJvZ0F5a0RvQUVpSENBREtRT29BU0lQRUpVRUlBTXBBNkFCSVJRZ0F5a0RxQUVoRUNBQklBY2dEQ0FMSUEwZ0NDQUpJQW9nR0NBUFF0akQ4K1RkZ01DZzd3QjlFS1lFSUFFZ0F5a0RvQUVpRGlBREtRT29BU0lLSUFjZ0RDQUxJQTBnQ0NBSklCeENsNFQxaThMaTVOZmJBSDBRcGdRZ0FTQURLUU9nQVNJSUlBTXBBNmdCSWdrZ0RpQUtJQWNnRENBTElBMGdFRUxyamVicGhJR1hnOEVBZlJDbUJDQUJJQU1wQTZBQklnc2dBeWtEcUFFaURTQUlJQWtnRGlBS0lBY2dEQ0FVUXRYWnR1VFI0YUhIT1gwUXBnUWdBeWtEcUFFaERDQURLUU9nQVNFSElBRWdIU0FUSUJFZ0Z5QWZJQlFnRUJDVkJDQUJJQllnRVNBVklBOGdHU0FES1FPZ0FTSWJJQU1wQTZnQkloa1FsUVFnQXlrRG9BRWhFeUFES1FPb0FTRVdJQUVnQnlBTUlBc2dEU0FJSUFrZ0RpQUtJQmxDNUx6bXJwR21zT3cxZlJDbUJDQUJJQU1wQTZBQklnNGdBeWtEcUFFaUZ5QUhJQXdnQ3lBTklBZ2dDU0FiUXZuNy9QR041OUc4TG4wUXBnUWdBU0FES1FPZ0FTSUlJQU1wQTZnQklnb2dEaUFYSUFjZ0RDQUxJQTBnRmtMaXFmeVFrOFhna2hWOUVLWUVJQUVnQXlrRG9BRWlDU0FES1FPb0FTSUxJQWdnQ2lBT0lCY2dCeUFNSUJOQ2lOM0VqSUdRck1FS2ZSQ21CQ0FES1FPb0FTRU1JQU1wQTZBQklSRWdBU0FlSUJVZ0VpQVFJQndnRXlBV0VKVUVJQUVnR2lBU0lBTXBBNGdCSWgwZ0dTQVVJQU1wQTZBQklnMGdBeWtEcUFFaUdCQ1ZCQ0FES1FPZ0FTRVNJQU1wQTZnQklRY2dBU0FSSUF3Z0NTQUxJQWdnQ2lBT0lCY2dHRUs2MzkyUXAvV1orQVo4RUtZRUlBRWdBeWtEb0FFaURpQURLUU9vQVNJVklCRWdEQ0FKSUFzZ0NDQUtJQTFDcHJHaWx0cTQzN0VLZkJDbUJDQUJJQU1wQTZBQklob2dBeWtEcUFFaUNDQU9JQlVnRVNBTUlBa2dDeUFIUXE2YjVQZkxnT2FmRVh3UXBnUWdBU0FES1FPZ0FTSVhJQU1wQTZnQklnb2dHaUFJSUE0Z0ZTQVJJQXdnRWtLYmp2R1kwZWJDdUJ0OEVLWUVJQU1wQTZnQklRd2dBeWtEb0FFaEVTQUJJQU1wQTRBQklCMGdBeWtEbUFFaUNTQVdJQnNnRWlBSEVKVUVJQUVnQXlrRGtBRWdDU0FQSUJnZ0V5QURLUU9nQVNJV0lBTXBBNmdCSWdrUWxRUWdBeWtEb0FFaEN5QURLUU9vQVNFYklBRWdFU0FNSUJjZ0NpQWFJQWdnRGlBVklBbENoUHVSbU5MKzNlMG9mQkNtQkNBQklBTXBBNkFCSWc0Z0F5a0RxQUVpRXlBUklBd2dGeUFLSUJvZ0NDQVdRcFBKbklhMDc2cmxNbndRcGdRZ0FTQURLUU9nQVNJV0lBTXBBNmdCSWhVZ0RpQVRJQkVnRENBWElBb2dHMEs4L2FhdW9jR3Z6eng4RUtZRUlBRWdBeWtEb0FFaUdpQURLUU9vQVNJSUlCWWdGU0FPSUJNZ0VTQU1JQXRDekpyQTRNbjQyWTdEQUh3UXBnUWdBeWtEcUFFaERDQURLUU9nQVNFUklBSWdIQ0FQSUJBZ0J5QU5JQXNnR3hDVkJDQUVJQlFnRUNBWklBa2dFaUFES1FPQUFTSUhJQU1wQTRnQkloQVFsUVFnQXlrRGtBRWhGQ0FES1FPWUFTRVpJQUVnRVNBTUlCb2dDQ0FXSUJVZ0RpQVRJQkJDdG9YNTJleVg5ZUxNQUh3UXBnUWdBU0FES1FPZ0FTSVFJQU1wQTZnQkloSWdFU0FNSUJvZ0NDQVdJQlVnQjBLcS9KWGp6N1BLdjlrQWZCQ21CQ0FCSUFNcEE2QUJJZ2NnQXlrRHFBRWlEeUFRSUJJZ0VTQU1JQm9nQ0NBWlF1ejEyOWF6OWR2bDN3QjhFS1lFSUFFZ0F5a0RvQUVpR1NBREtRT29BU0ljSUFjZ0R5QVFJQklnRVNBTUlCUkNsN0NkMHNTeGhxTHNBSHdRcGdRZ0VpQW5mQ0VuSUJBZ0tId2hLQ0FQSUNWOElTVWdCeUFtZkNFbUlCd2dJM3doSXlBWklDUjhJU1FnSUNBREtRT29BWHdoSUNBaElBTXBBNkFCZkNFaElRRU1BUXNMSUFBZ0p6Y0RPQ0FBSUNVM0F6QWdBQ0FqTndNb0lBQWdJRGNESUNBQUlDZzNBeGdnQUNBbU53TVFJQUFnSkRjRENDQUFJQ0UzQXdBZ0EwR3dBV29rQUF2cEp3TUpmd3ArQVh3akFFR2dBMnNpQlNRQUlBVWdBellDSkNBRklBSTJBaUFDUUFKQUFrQUNRQUpBSUFOQkIyc09CQUlEQVFBREN5QUNMUUFBUWNRQVJ3MENJQUl0QUFGQjVRQkhEUUlnQWkwQUFrSDJBRWNOQWlBQ0xRQURRZWtBUncwQ0lBSXRBQVJCNHdCSERRSWdBaTBBQlVIbEFFY05BZ0pBQWtBZ0FpMEFCa0hEQUdzT0JRRUVCQVFBQkFzZ0FpMEFCMEh5QUVjTkF5QUNMUUFJUWVFQVJ3MERJQUl0QUFsQitRQkhEUU1nQUVJSk53TUFEQVFMSUFJdEFBZEJ6UUJIRFFJZ0FpMEFDRUhaQUVjTkFpQUNMUUFKUWNzQVJ3MENJQUJDQ3pjREFBd0RDeUFDTFFBQVFjUUFSdzBCSUFJdEFBRkI1UUJIRFFFZ0FpMEFBa0gyQUVjTkFTQUNMUUFEUWVrQVJ3MEJJQUl0QUFSQjR3QkhEUUVnQWkwQUJVSGxBRWNOQVNBQ0xRQUdRZElBUncwQklBSXRBQWRCeHdCSERRRWdBaTBBQ0VIQ0FFY05BU0FBUWdvM0F3QU1BZ3NnQWkwQUFFSFFBRWNOQUNBQ0xRQUJRZUVBUncwQUlBSXRBQUpCOUFCSERRQWdBaTBBQTBIMEFFY05BQ0FDTFFBRVFlVUFSdzBBSUFJdEFBVkI4Z0JIRFFBZ0FpMEFCa0h1QUVjTkFDQUFRZzAzQXdBTUFRc0NRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQVNnQ21BSWlDQ0FCS0FLY0FpSUtJQWdnQ2lBRVFiRE95Z0JCQ2hEQUJDQUNJQU1ReUFNaUJBUkFJQVZCS0dvZ0JCRGJCQUpBSUFVb0FpaEJuNENBZ0hoSEJFQWdCVUhZQVdvZ0JCQzVCQ0FGS0FMWUFVR2ZnSUNBZUVZTkFVSFlpOG9BUVE0UTdna0FDeUFGSUFVb0Fpd2lCRFlDUENBRlFkZ0JhaUlKSUFSQkJHb2lBaWdDQUNBRVFRaHFJZ1lvQWdCQkFFRzh6c29BRU9VSEVMa0VJQVZCR0dvZ0NVSE16c29BUVJoQjVNN0tBQkN1QkNBRlFVQnJJZzBnQlNnQ0dDQUZLQUljRUpFQklBVW9Ba1FpQXlBRktBSklJZ2RCOU03S0FFRUtFT3dIRFFJQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFNZ0IwSCt6c29BUVFnUTdBZEZCRUFnQXlBSFFZYlB5Z0JCQnhEc0J3MEJJQU1nQjBHTno4b0FRUVlRN0FjTkFpQURJQWRCazgvS0FFRURFT3dIRFFNZ0F5QUhRWmJQeWdCQkJ4RHNCdzBFSUFNZ0IwR2R6OG9BUVFvUTdBY05CU0FESUFkQnA4L0tBRUVKRU93SERRWWdBeUFIUWJEUHlnQkJDaERzQncwSElBTWdCMEc2ejhvQVFRY1E3QWNOQ0NBRlFRTTJBcndCSUFWQjBNL0tBRFlDdUFFZ0JVSUROd0xFQVNBRlFlUUFOZ0xzQVNBRlFTTTJBdVFCSUFWQjVRQTJBdHdCSUFVZ0NUWUN3QUVnQlNBRlFUeHFOZ0xvQVNBRklBMDJBdUFCSUFVZ0JVRWdhallDMkFFZ0JVRzRBV3BCNk0vS0FCQ3JCd0FMSUFWQnVBRnFJQWdnQ2lBRVFRUnFLQUlBSUFSQkNHb29BZ0JCQVVHUTBjb0FFT1VIRUxrREVQNEVJQVVvQXJnQlFaK0FnSUI0UncwTElBQkJDR29nQlNnQ3ZBRVF4UU1nQUVJU053TUFEQmNMSUFWQjJBRnFJZ0lnQkVFRWFpZ0NBQ0FFUVFocUtBSUFRUUZCOE5ES0FCRGxCeERaQkNBQ0lBRWdBa0dJME1vQVFSbEJnTkhLQUJDdkJDSUNFTnNESUFCQkNHb2dBU0FDUWI3UXlnQkJDUkRMQlNBRlFiZ0JhaUFDUVpuQ3p3QkJCUkRkQlNBRktRTzRBU0VQSUFBZ0JTc0R3QUU1QXpBZ0FDQVBOd01vSUFBZ0JTa0QyQUUzQXpnZ0FFRkFheUFGUWVBQmFpa0RBRGNEQUNBQVFjZ0FhaUFGUWVnQmFpa0RBRGNEQUNBQVFnODNBd0FNRmdzZ0JVSFlBV29pQmlBRVFRUnFLQUlBSUFSQkNHb29BZ0JCQVVISTBNb0FFT1VIRU5rRUlBVkJtQUpxSUFFZ0JrR0kwTW9BUVJsQjJOREtBQkN2QkNJQ0VOc0RJQVlnQVNBQ1FiN1F5Z0JCQ1JETEJTQUZRZmdCYWlBQklBSkJtY0xQQUVFRkVNc0ZJQVZCc0FKcUlBRWdBa0hvME1vQVFRWVF2d1VnQUVFSWFpQUdRZWdBL0FvQUFDQUFRZzQzQXdBTUZRc2dCVUhZQVdvaUJpQUVRUVJxS0FJQUlBUkJDR29vQWdCQkFVSDR6OG9BRU9VSEVOa0VJQVZCb0FKcUlBRWdCa0dJME1vQVFSbEJwTkRLQUJDdkJDSUNFTnNESUFZZ0FTQUNRYjdReWdCQkNSRExCU0FGUWZnQmFpQUJJQUlRbXdFZ0FFRUlhaUFHUWVBQS9Bb0FBQ0FBUWhBM0F3QU1GQXNnQUVJTk53TUFEQk1MSUFCQ0NUY0RBQXdTQ3lBQVFnbzNBd0FNRVFzZ0FFSUxOd01BREJBTElBQkNERGNEQUF3UEN5QUZRYmdCYWlBRktBTGNBU0FGS0FMZ0FSQ1JBU0FBSUFVb0Fyd0JJZ0VnQlNnQ3dBRWlBa0duejhvQVFRa1E3QWNFZmtJS0JTQUJJQUpCbmMvS0FFRUtFT3dIUlEwRVFna0xOd01BSUFVb0FyZ0JJQUVROVFrZ0JVSFlBV29RNGdnTUR3c2dCVUVCTmdMY0FTQUZRWWpWeWdBMkF0Z0JJQVZDQVRjQzVBRWdCVUhsQURZQ25BRWdCU0FETmdLOEFTQUZJQUkyQXJnQklBVWdCVUdZQVdvMkF1QUJJQVVnQlVHNEFXbzJBcGdCSUFWQjJBRnFRWkRWeWdBUXF3Y0FDeUFGUWRnQmFpSUpJQUlvQWdBZ0JpZ0NBRUVCUWJEUnlnQVE1UWNRdVFRZ0JVRVFhaUFKUWNEUnlnQkJHVUhjMGNvQUVLNEVJQVZCekFCcUlBVW9BaEFnQlNnQ0ZCQ1JBU0FJSUFvZ0FpZ0NBQ0FHS0FJQVFRSkI3TkhLQUJEbEJ4QzVBeUlHS0FJQVFRWnJEZ01EQ3dJTEN5QUZRZWdCYWlBRlFjZ0JhaWdDQURZQ0FDQUZRZUFCYWlBRlFjQUJhaWtDQURjREFDQUZJQVVwQXJnQk53UFlBVUdBejlJQVFTc2dCVUhZQVdwQndJZktBRUdnMGNvQUVJd0VBQXRCMkl2S0FFRU9FTzRKQUFzZ0JVSFlBV29pQWlBR0tBSUlJQVlvQWd4QkFFR28wc29BRU9VSEVMa0VJQVZCQ0dvZ0FrSE16c29BUVJoQnVOTEtBQkN1QkNBRlFaQURhaUFGS0FJSUlBVW9BZ3dRa1FFQ1FBSitBa0FDUUFKQUlBVW9BcFFESWdJZ0JTZ0NtQU1pQjBIK3pzb0FRUWdRN0FkRkJFQWdBaUFIUVliUHlnQkJCeERzQncwQklBSWdCMEdOejhvQVFRWVE3QWNOQWlBQ0lBZEJrOC9LQUVFREVPd0hEUU5CeU5MS0FFRWJFTzRKQUFzZ0JVRzRBV29nQ0NBS0lBWW9BZ2dnQmlnQ0RFRUJRZFRUeWdBUTVRY1F1UU1RL2dRZ0JTZ0N1QUZCbjRDQWdIaEhEUVFnQlVHQUFXb2dCU2dDdkFFUXhRTkNDQXdEQ3lBRlFkZ0JhaUlKSUFZb0FnZ2dCaWdDREVFQlFiVFR5Z0FRNVFjUTJRUWdCVUc0QVdvZ0FTQUpRWWpReWdCQkdVSEUwOG9BRUs4RUlnWVEyd01nQ1NBQklBWkJ2dERLQUVFSkVNc0ZJQVZCbUFGcUlBWkJtY0xQQUVFRkVOMEZJQVZCK0FCcUlBVkJ5QUZxS1FNQU53TUFJQVZCaUFGcUlBVkI0QUZxS1FNQU53TUFJQVZCa0FGcUlBVkI2QUZxS1FNQU53TUFJQVVnQlNrRHdBRTNBM0FnQlNBRktRUFlBVGNEZ0FFZ0JTc0RvQUVoR0NBRktRT1lBU0VRSUFVcEE3Z0JJUkVnQlNrRDhBRWhFa0lHREFJTElBVkIyQUZxSWdjZ0JpZ0NDQ0FHS0FJTVFRRkJsTlBLQUJEbEJ4RFpCQ0FISUFFZ0IwR0kwTW9BUVJsQnBOUEtBQkN2QkNJR0VOc0RJQVZCbUFGcUlBRWdCa0crME1vQVFRa1F5d1VnQlVHNEFXb2dBU0FHUVpuQ3p3QkJCUkRMQlNBRlFmQUJhaUlISUFFZ0JrSG8wTW9BUVFZUXZ3VWdCVUdJQVdvZ0JVR29BV29wQXdBM0F3QWdCVUdRQVdvZ0JVR3dBV29wQXdBM0F3QWdCVUg0QUdvZ0JVSGdBV29wQXdBM0F3QWdCVUhvQUdvZ0JVSDRBV29wQXdBM0F3QWdCVUhnQUdvZ0J5a0RBRGNEQUNBRklBVXBBNkFCTndPQUFTQUZJQVVwQTlnQk53TndJQVVnQlNrRDZBRTNBMWdnQlNrRHVBRWhFaUFGS1FQQUFTRVFJQVVyQThnQklSZ2dCU2tEMEFFaEVTQUZLUU9ZQVF3QkN5QUZRZGdCYWlJSklBWW9BZ2dnQmlnQ0RFRUJRZlRTeWdBUTVRY1EyUVFnQlVIWUFHb2dBU0FKUVlqUXlnQkJHVUdFMDhvQUVLOEVJZ1lRMndNZ0JVRzRBV29nQVNBR1FiN1F5Z0JCQ1JETEJTQUpJQUVnQmhDYkFTQUZRWkFCYWlBRlFjZ0JhaWtEQURjREFDQUZRWWdCYWlBRlFjQUJhaWtEQURjREFDQUZRZmdBYWlBRlFmZ0JhaWtEQURjREFDQUZJQVVwQTdnQk53T0FBU0FGSUFVcEEvQUJOd053SUFVcEE5QUJJUklnQlNrRDJBRWhFQ0FGS3dQZ0FTRVlJQVVwQStnQklSRkNCd3NoRHlBRktBS1FBeUFDRVBVSkRBSUxJQVZCNkFGcUlBVkJ5QUZxS0FJQU5nSUFJQVZCNEFGcUlBVkJ3QUZxS1FJQU53TUFJQVVnQlNrQ3VBRTNBOWdCUVlEUDBnQkJLeUFGUWRnQmFrSEFoOG9BUWVUVHlnQVFqQVFBQ3lBR0tBSUlJUUlDZmdKQUFrQUNRQ0FHS0FJTVFRbHJEZ0lCQUFVTElBSXRBQUJCeEFCSERRUWdBaTBBQVVIbEFFY05CQ0FDTFFBQ1FmWUFSdzBFSUFJdEFBTkI2UUJIRFFRZ0FpMEFCRUhqQUVjTkJDQUNMUUFGUWVVQVJ3MEVBa0FnQWkwQUJrSERBR3NPQlFBRkJRVUNCUXNnQWkwQUIwSE5BRWNOQkNBQ0xRQUlRZGtBUncwRUlBSXRBQWxCeXdCSERRUkNCQXdDQ3lBQ0xRQUFRY1FBUncwRElBSXRBQUZCNVFCSERRTWdBaTBBQWtIMkFFY05BeUFDTFFBRFFla0FSdzBESUFJdEFBUkI0d0JIRFFNZ0FpMEFCVUhsQUVjTkF5QUNMUUFHUWRJQVJ3MERJQUl0QUFkQnh3QkhEUU1nQWkwQUNFSENBRWNOQTBJRERBRUxJQUl0QUFkQjhnQkhEUUlnQWkwQUNFSGhBRWNOQWlBQ0xRQUpRZmtBUncwQ1FnSUxJUThMSUFnZ0NpQUVRUVJxS0FJQUlBUkJDR29vQWdCQkEwSDAwOG9BRU9VSEVMa0RJZ0lvQWdBaUJFRUNheUlKUVFsTklBUkJDV3RCQWs5eERRRWdCU0FDUVFocUlnWkJrTXZLQUVFTUVLTUVJaE0zQThBQ0FuOENRQUpBQWtBQ1FDQVRRZ1JXRFFCQmdZQ0FnSGdoQkNBVHAwRUJhdzRFQUFFS0F3SUxJQVZCQVRZQzNBRWdCVUdrek1vQU5nTFlBU0FGUWdFM0F1UUJJQVZCNWdBMkFyd0JJQVVnQlVHNEFXbzJBdUFCSUFVZ0JVSEFBbW8yQXJnQklBVkIyQUZxUWF6TXlnQVFxd2NBQ3lBRlFaQURhaUFCSUFaQjFNdktBRUVDRUw4RklBVkJtQUZxSUFFZ0JrSFd5OG9BUVFJUXZ3VWdCVUhZQVdvaUFpQUdRZXFBemdCQkFSRFBBU0FDRUpZSUlRRWdCVUc0QVdwQjZvRE9BRUVCRUlJQklBSWdBU0FGS0FLOEFTSUJJQVVvQXNBQlFmeUcwZ0FRcWdnUXN3WWdCU2dDMkFGRkRRVWdCU2tENEFFaERpQUZLQUs0QVNBQkVPRUlJQVVvQXFBQklRY2dCU2tEbUFFaEZDQUZLQUtZQXlFTElBVXBBNUFESVJWQmdJQ0FnSGdNQWdzZ0NVRUpTdzBHUWRpTHlnQkJEaER1Q1FBTElBbEJDVTBOQkNBRlFkZ0JhaUFDRU1VRElBVXBBdHdCSVE0Z0JTZ0MyQUVoREVHQ2dJQ0FlQXNoQkF3RkMwSDgwY29BUVJzUTdna0FDMEhZaThvQVFRNFE3Z2tBQzBHTWg5SUFRUXBCbUlmU0FCRDlCQUFMUWRqTHlnQkJJaER1Q1FBTElBVkJ6QUpxSUFFZ0JrR2N5OG9BUVFVUTl3TWdCVUhZQW1vZ0FTQUdRYUhMeWdCQkJoRDNBeUFGUWVRQ2FpQUNFTVVESUFWQjJBRnFJZ01nQmtHbnk4b0FRUVFRendFZ0F4Q1dDQ0VDSUFWQmtBTnFRYWZMeWdCQkJCQ0NBU0FESUFnZ0NpQUNJQVVvQXBRRElBVW9BcGdERUtzSUVMa0RFTnNFQWtBQ1FBSkFBa0FDUUNBRktBTFlBVUdmZ0lDQWVFWUVRQ0FGS0FMY0FTSURLQUlFSVFJZ0JTQURLQUlJSWdkQkNFRUlRZmo0elFBUW1nVkJBQ0VJSUFWQkFEWUNvQUVnQlNBRktBSUVJZ1EyQXB3QklBVWdCU2dDQUNJRE5nS1lBUUpBQWtBZ0F5QUhTUVJBSUFWQm1BRnFRUUFnQjBFSVFRZ1E0UVVnQlNnQ29BRWhDQ0FGS0FLY0FTRUVEQUVMSUFkRkRRRUxJQVFnQ0VFRGRHb2hBd05BSUFJb0FnQkJCRWNOQXlBRElBSkJDR29wQXdBM0F3QWdBa0hJQUdvaEFpQURRUWhxSVFNZ0NFRUJhaUVJSUFkQkFXc2lCdzBBQ3dzZ0JVRzRBV3BCQkhJaUFpQUZLUUtZQVRjQ0FDQUNRUWhxSUFnMkFnQU1BZ3NnQlVISUFXb2dCVUhvQVdvb0FnQTJBZ0FnQlVIQUFXb2dCVUhnQVdvcEFnQTNBd0FnQlNBRktRTFlBU0lPTndPNEFTQU9wMEdmZ0lDQWVFWU5BU0FGUWJnQmFoRE5BZ3dDQzBHTWg5SUFRUXBCbVAzTkFCRDlCQUFMSUFVb0Fyd0JJZ2RCZ0lDQWdIaEdEUUFnQlNnQ3hBRWhDQ0FGS0FMQUFTRUVJQVVvQXBBRElBVW9BcFFERU9BSUlBWkJxOHZLQUVFTkVLTUVJUllnQlVHNEFXb2dBU0FHUWJqTHlnQkJCaEMvQlNBRktBSzRBVUdBZ0lDQWVFWU5BU0FGUVlnRGFpQUZRY0FCYWlnQ0FEWUNBQ0FGSUFVcEFyZ0JOd09BQXd3Q0MwR01oOUlBUVFwQm1JZlNBQkQ5QkFBTElBVkJBRFlDaUFNZ0JVS0FnSUNBZ0FFM0E0QURJQWhCQTNRaEFpQUVJUU1EUUNBQ1JRMEJJQU1wQXdBaERpQUZRWUFEYWtFQ0VOVUhJQVVvQW9RRElBVW9Bb2dESWdwQkEzUnFJZ2tnRGtJQmZiazVBd2dnQ1VJQU53TUFJQVVnQ2tFQ2FqWUNpQU1nQWtFSWF5RUNJQU5CQ0dvaEF3d0FDd0FMSUFWQjJBRnFJQUVnQmtHK3k4b0FRUVlRdndVQ1FDQUZLQUxZQVVHQWdJQ0FlRWNFUUNBRlFmZ0NhaUFGUWVBQmFpZ0NBRFlDQUNBRklBVXBBdGdCTndQd0Fnd0JDeUFGUWZBQ2FpQUZLQUxRQWlBRktBTFVBaEQ0QkFzZ0JUVUM0QUlnQlRVQ3pBSkNJSWFFSVE0Z0JLMGdDSzFDSUlhRUlSY2dCU2dDUkNFRElBVXBBdWdDSVJRZ0JTZ0M1QUloQ3lBRktRTFFBaUVWSUFVb0F0d0NJUXdnQlNnQzJBSWhCQXRCMEFCQkNCQ2ZDQ0lCSUJjM0F6QWdBU0FITmdJc0lBRWdGRGNDSkNBQklBczJBaUFnQVNBVk53TVlJQUVnRGpjREVDQUJJQXcyQWd3Z0FTQUVOZ0lJSUFFZ0ZqY0RBQ0FCSUFVcEE0QUROd000SUFGQlFHc2dCVUdJQTJvb0FnQTJBZ0FnQVNBRktRUHdBamNDUkNBQlFjd0FhaUFGUWZnQ2FpZ0NBRFlDQUNBQUlBVXBBNEFCTndNSUlBQkJFR29nQlVHSUFXb3BBd0EzQXdBZ0FFRVlhaUFGUVpBQmFpa0RBRGNEQUNBQUlBRTJBblFnQUNBUk53TTRJQUFnR0RrRE1DQUFJQkEzQXlnZ0FDQVNOd01nSUFBZ0R6Y0RBQ0FBUWNnQWFpQUZRZmdBYWlrREFEY0RBQ0FBSUFVcEEzQTNBMEFnQUVIZ0FHb2dCVUhvQUdvcEF3QTNBd0FnQUVIWUFHb2dCVUhnQUdvcEF3QTNBd0FnQUNBRktRTllOd05RSUFCQjhBQnFJQVZCMUFCcUtBSUFOZ0lBSUFBZ0JTa0NURGNDYUF3QkN5QUVRUVJxS0FJQUlBUkJDR29vQWdCQkFrR0UxTW9BRU9VSElRQWdCVUhuQURZQ3ZBRWdCU0FBTmdLNEFTQUZRUUUyQXR3QklBVkJ2TlRLQURZQzJBRWdCVUlCTndMa0FTQUZJQVZCdUFGcU5nTGdBU0FGUWRnQmFrSEUxTW9BRUtzSEFBc2dCU2dDUUNBREVQVUpDeUFGUVNocUVPSUlDeUFGUWFBRGFpUUFDNm9jQWhaL0JINGpBRUdnQ21zaUF5UUFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUJLUU1BSWhsUVJRUkFJQUVwQXdnaUdsQkZCRUFnQVNrREVDSWJVRVVFUUNBWklCa2dHM3dpSEZnRVFDQVpJQnBhQkVBZ0FTd0FHaUVPSUFFdUFSZ2hBU0FESUJrK0FnQWdBMEVCUVFJZ0dVS0FnSUNBRUZRaUJCczJBcUFCSUFOQkFDQVpRaUNJcHlBRUd6WUNCRUVBSWdSRkJFQWdBMEVJYWtFQVFaZ0IvQXNBQ3lBRElCbytBcVFCSUFOQkFVRUNJQnBDZ0lDQWdCQlVJZ1ViTmdMRUFpQURRUUFnR2tJZ2lLY2dCUnMyQXFnQklBUkZCRUFnQTBHc0FXcEJBRUdZQWZ3TEFBc2dBeUFiUGdMSUFpQURRUUZCQWlBYlFvQ0FnSUFRVkNJRkd6WUM2QU1nQTBFQUlCdENJSWluSUFVYk5nTE1BaUFFUlFSQUlBTkIwQUpxUVFCQm1BSDhDd0FMSUFOQjhBTnFRUUJCbkFIOEN3QWdBMEVCTmdMc0F5QURRUUUyQW93RklBR3NJQnhDQVgxNWZVTENtc0hvQkg1Q2dLSE5vTFFDZkVJZ2lLY2lCTUVoREFKQUlBRkJBRTRFUUNBRElBRVFTeG9nQTBHa0FXb2dBUkJMR2lBRFFjZ0NhaUFCRUVzYURBRUxJQU5CN0FOcVFRQWdBV3ZCRUVzYUN3SkFJQXhCQUVnRVFDQURRUUFnREd0Qi8vOERjU0lCRUdnZ0EwR2tBV29nQVJCb0lBTkJ5QUpxSUFFUWFBd0JDeUFEUWV3RGFpQUVRZi8vQVhFUWFBc2dBMEg4Q0dvZ0EwR2tBZndLQUFBQ1FBSkFBa0FnQXlnQzZBTWlDU0FES0FLY0NpSUJJQUVnQ1VrYklnUkJLRTBFUUNBRURRRkJBQ0VFREFJTERBc0xJQU5CeUFKcUlRWWdBMEg4Q0dvaEFTQUVJUWdEUUNBQklBRW9BZ0FpQ2lBR0tBSUFhaUlGSUFkQkFYRnFJZ2MyQWdBZ0JTQUtTU0FGSUFkTGNpRUhJQUZCQkdvaEFTQUdRUVJxSVFZZ0NFRUJheUlJRFFBTElBZEZEUUFnQkVFb1JnMEJJQU5CL0FocUlBUkJBblJxUVFFMkFnQWdCRUVCYWlFRUN5QURJQVEyQXB3S0lBUWdBeWdDakFVaUFTQUJJQVJKR3lJQlFTbEpCRUFnQVVFQ2RDRUJBa0FDUUFKL0FrQURRQ0FCUlEwQklBRkJCR3NpQVNBRFFld0RhbW9vQWdBaUJDQUJJQU5CL0FocWFpZ0NBQ0lGUmcwQUN5QUVJQVZMSUFRZ0JVbHJEQUVMUVg5QkFDQURRZndJYWlJRUlBRWdCR3BIR3dzZ0RrNEVRQ0FES0FLZ0FTSUZRU2xQRFFJQ1FDQUZSUVJBUVFBaEJRd0JDeUFESUFWQkFuUWlCbW9nQXlFQlFnQWhHUU5BSUFFZ0FUVUNBRUlLZmlBWmZDSWFQZ0lBSUFGQkJHb2hBU0FhUWlDSUlSa2dCa0VFYXlJR0RRQUxJQnBDZ0lDQWdCQlVEUUFnQlVFb1JnMFNJQmsrQWdBZ0JVRUJhaUVGQ3lBRElBVTJBcUFCSUFNb0FzUUNJZ1JCS1U4TkRVRUFJUWNnQXdKL1FRQWdCRVVOQUJvZ0JFRUNkQ0lHSUFOQnBBRnFJZ0ZxUWdBaEdRTkFJQUVnQVRVQ0FFSUtmaUFaZkNJYVBnSUFJQUZCQkdvaEFTQWFRaUNJSVJrZ0JrRUVheUlHRFFBTElBUWdHa0tBZ0lDQUVGUU5BQm9nQkVFb1JnMFNJQmsrQWdBZ0JFRUJhZ3MyQXNRQ0lBTWdDUVIvSUFsQkFuUWhCaUFEUWNnQ2FpRUJRZ0FoR1FOQUlBRWdBVFVDQUVJS2ZpQVpmQ0lhUGdJQUlBRkJCR29oQVNBYVFpQ0lJUmtnQmtFRWF5SUdEUUFMSUJwQ2dJQ0FnQkJVQkVBZ0F5QUpOZ0xvQXd3REN5QUpRU2hHRFJJZ0EwSElBbW9nQ1VFQ2RHb2dHVDRDQUNBSlFRRnFCU0FIQ3pZQzZBTU1BUXNnREVFQmFpRU1DMEVBSWdGRkJFQWdBMEdRQldvZ0EwSHNBMnBCcEFIOENnQUFDeUFEUVpBRmFrRUJFRXNoRVNBQlJRUkFJQU5CdEFacUlBTkI3QU5xUWFRQi9Bb0FBQXNnQTBHMEJtcEJBaEJMSVJJZ0FVVUVRQ0FEUWRnSGFpQURRZXdEYWtHa0Fmd0tBQUFMQWtBQ1FBSkFBa0FnQTBIWUIycEJBeEJMSWhZb0FxQUJJaEFnQXlnQ29BRWlCeUFISUJCSkd5SUVRU2hOQkVBZ0VTZ0NvQUVoRXlBU0tBS2dBU0VVSUFNb0Fvd0ZJUTlCQUNFS0EwQWdDaUVMSUFSQkFuUWhBUUovQWtBQ1FBSkFBMEFnQVVVTkFTQUJRUVJySWdFZ0Eyb29BZ0FpQlNBQklBTkIyQWRxYWlnQ0FDSUlSZzBBQ3lBRklBaEpEUUVNQWdzZ0ZpQURRZGdIYWlBQmFrWU5BUXNnQnlFRVFRQU1BUXNnQkFSQVFRRWhCeUFEUWRnSGFpRUdJQU1oQVNBRUlRZ0RRQ0FCSUFFb0FnQWlDU0FHS0FJQVFYOXphaUlGSUFkQkFYRnFJZ2MyQWdBZ0JTQUpTU0FGSUFkTGNpRUhJQUZCQkdvaEFTQUdRUVJxSVFZZ0NFRUJheUlJRFFBTElBZEZEUlVMSUFNZ0JEWUNvQUZCQ0FzaENpQVVJQVFnQkNBVVNSc2lCVUVwVHcwU0lBVkJBblFoQVFKQUFrQUNRQU5BSUFGRkRRRWdBVUVFYXlJQklBTnFLQUlBSWdnZ0FTQURRYlFHYW1vb0FnQWlDVVlOQUFzZ0NDQUpUdzBCSUFRaEJRd0NDeUFTSUFOQnRBWnFJQUZxUmcwQUlBUWhCUXdCQ3lBRkJFQkJBU0VISUFOQnRBWnFJUVlnQXlFQklBVWhDQU5BSUFFZ0FTZ0NBQ0lKSUFZb0FnQkJmM05xSWdRZ0IwRUJjV29pQnpZQ0FDQUVJQWxKSUFRZ0IwdHlJUWNnQVVFRWFpRUJJQVpCQkdvaEJpQUlRUUZySWdnTkFBc2dCMFVORlFzZ0F5QUZOZ0tnQVNBS1FRUnlJUW9MSUJNZ0JTQUZJQk5KR3lJSlFTbFBEUU1nQ1VFQ2RDRUJBa0FDUUFKQUEwQWdBVVVOQVNBQlFRUnJJZ0VnQTJvb0FnQWlCQ0FCSUFOQmtBVnFhaWdDQUNJSVJnMEFDeUFFSUFoUERRRWdCU0VKREFJTElCRWdBMEdRQldvZ0FXcEdEUUFnQlNFSkRBRUxJQWtFUUVFQklRY2dBMEdRQldvaEJpQURJUUVnQ1NFSUEwQWdBU0FCS0FJQUlnVWdCaWdDQUVGL2Myb2lCQ0FIUVFGeGFpSUhOZ0lBSUFRZ0JVa2dCQ0FIUzNJaEJ5QUJRUVJxSVFFZ0JrRUVhaUVHSUFoQkFXc2lDQTBBQ3lBSFJRMFZDeUFESUFrMkFxQUJJQXBCQW1vaENnc2dEeUFKSUFrZ0Qwa2JJZ1JCS1U4TkVTQUVRUUowSVFFQ1FBSkFBa0FEUUNBQlJRMEJJQUZCQkdzaUFTQURhaWdDQUNJRklBRWdBMEhzQTJwcUtBSUFJZ2hHRFFBTElBVWdDRThOQVNBSklRUU1BZ3NnQTBIc0Eyb2lCU0FCSUFWcVJnMEFJQWtoQkF3QkN5QUVCRUJCQVNFSElBTkI3QU5xSVFZZ0F5RUJJQVFoQ0FOQUlBRWdBU2dDQUNJSklBWW9BZ0JCZjNOcUlnVWdCMEVCY1dvaUJ6WUNBQ0FGSUFsSklBVWdCMHR5SVFjZ0FVRUVhaUVCSUFaQkJHb2hCaUFJUVFGcklnZ05BQXNnQjBVTkZRc2dBeUFFTmdLZ0FTQUtRUUZxSVFvTElBdEJFVVlOQkNBQ0lBdHFJQXBCTUdvNkFBQWdBeWdDeEFJaURTQUVJQVFnRFVrYklnRkJLVThORkNBTFFRRnFJUW9nQVVFQ2RDRUJBbjhDUUFOQUlBRkZEUUVnQVVFRWF5SUJJQU5xS0FJQUlnVWdBU0FEUWFRQmFtb29BZ0FpQ0VZTkFBc2dCU0FJU3lBRklBaEphd3dCQzBGL1FRQWdBMEdrQVdvaUJTQUJJQVZxUnhzTElSY2dBMEg4Q0dvZ0EwR2tBZndLQUFBQ1FBSkFJQU1vQXVnRElna2dBeWdDbkFvaUFTQUJJQWxKR3lJRlFTaE5CRUFnQlEwQlFRQWhCUXdDQ3d3VUMwRUFJUWNnQTBISUFtb2hCaUFEUWZ3SWFpRUJJQVVoQ0FOQUlBRWdBU2dDQUNJWUlBWW9BZ0JxSWhVZ0IwRUJjV29pQnpZQ0FDQVZJQmhKSUFjZ0ZVbHlJUWNnQVVFRWFpRUJJQVpCQkdvaEJpQUlRUUZySWdnTkFBc2dCMFVOQUNBRlFTaEdEUllnQTBIOENHb2dCVUVDZEdwQkFUWUNBQ0FGUVFGcUlRVUxJQU1nQlRZQ25Bb2dCU0FQSUFVZ0Qwc2JJZ0ZCS1U4TkZDQUJRUUowSVFFQ2Z3SkFBMEFnQVVVTkFTQUJRUVJySWdFZ0EwSHNBMnBxS0FJQUlnVWdBU0FEUWZ3SWFtb29BZ0FpQ0VZTkFBc2dCU0FJU3lBRklBaEphd3dCQzBGL1FRQWdBMEg4Q0dvaUJTQUJJQVZxUnhzTElRRWdEaUFYU2lJRlJTQUJJQTVPY1VVRVFDQUJJQTVJRFFNTUVBdEJBQ0VGSUFNQ2YwRUFJQVJGRFFBYUlBTWdCRUVDZENJR2FpQURJUUZDQUNFWkEwQWdBU0FCTlFJQVFncCtJQmw4SWhvK0FnQWdBVUVFYWlFQklCcENJSWdoR1NBR1FRUnJJZ1lOQUFzZ0JDQWFRb0NBZ0lBUVZBMEFHaUFFUVNoR0RSWWdHVDRDQUNBRVFRRnFDeUlITmdLZ0FRSkFJQTFGRFFBZ0RVRUNkQ0lHSUFOQnBBRnFJZ0ZxUWdBaEdRTkFJQUVnQVRVQ0FFSUtmaUFaZkNJYVBnSUFJQUZCQkdvaEFTQWFRaUNJSVJrZ0JrRUVheUlHRFFBTElCcENnSUNBZ0JCVUJFQWdEU0VGREFFTElBMUJLRVlORmlBWlBnSUFJQTFCQVdvaEJRc2dBeUFGTmdMRUFnSkFJQWxGQkVCQkFDRUpEQUVMSUFsQkFuUWlCaUFEUWNnQ2FpSUJha0lBSVJrRFFDQUJJQUUxQWdCQ0NuNGdHWHdpR2o0Q0FDQUJRUVJxSVFFZ0drSWdpQ0VaSUFaQkJHc2lCZzBBQ3lBYVFvQ0FnSUFRVkEwQUlBbEJLRVlORmlBWlBnSUFJQWxCQVdvaENRc2dBeUFKTmdMb0F5QVFJQWNnQnlBUVNSc2lCRUVvVFEwQUN3c01Ed3NnQlVVTkN5QURRUUVRU3hvZ0F5Z0NqQVVpQVNBREtBS2dBU0lFSUFFZ0JFc2JJZ0ZCS1U4TkVTQUJRUUowSVFFZ0EwRUVheUVFQTBBZ0FVVU5BeUFCSUFScUtBSUFJZ1VnQVVFRWF5SUJJQU5CN0FOcWFpZ0NBQ0lJUmcwQUN5QUZJQWhKRFF3TUN3c2dDVUVvUVpTTndRQVF1QWtBQzBFUlFSRkI2T0hBQUJER0JBQUxJQU5CN0FOcUlnUWdBU0FFYWtjTkNRd0lDd3dMQ3d3TUN3d01DMEdZNHNBQVFUZEIwT0xBQUJDY0JnQUxRZURpd0FCQk5rR1k0OEFBRUp3R0FBdEJ2T0hBQUVFY1Fkamh3QUFRbkFZQUMwR000Y0FBUVIxQnJPSEFBQkNjQmdBTFFkL2d3QUJCSEVIODRNQUFFSndHQUFzZ0FpQUthaUVJUVg4aEJpQUtJUUVDUUFOQUlBRWlCRVVOQVNBR1FRRnFJUVlnQVVFQmF5SUJJQUpxSWdVdEFBQkJPVVlOQUFzZ0JTQUZMUUFBUVFGcU9nQUFJQVpGSUFRZ0MwdHlEUUVnQWlBRWFrRXdJQWI4Q3dBTUFRc2dBa0V4T2dBQUFrQWdDd1JBSUFzRVFDQUNRUUZxUVRBZ0Mvd0xBQXNnQzBFUFN3MEJDeUFJUVRBNkFBQWdERUVCYWlFTUlBdEJBbW9oQ2d3Q0N5QUtRUkZCK09IQUFCREdCQUFMSUF0QkVVa05BQ0FLUVJGQmlPTEFBQkM0Q1FBTElBQWdERHNCQ0NBQUlBbzJBZ1FnQUNBQ05nSUFJQU5Cb0FwcUpBQVBDeUFFUVNoQmxJM0JBQkM0Q1FBTElBVkJLRUdVamNFQUVMZ0pBQXRCcEkzQkFFRWFRWlNOd1FBUW5BWUFDeUFCUVNoQmxJM0JBQkM0Q1FBTFFTaEJLRUdVamNFQUVNWUVBQXVhTHdFRWZ5TUFRWUFUYXlJREpBQWdBMEVnT3dIOEVpQURRUVUyQXZnU0lBTkJtLy9OQURZQzlCSWdBMEhkemdBN0FmQVNJQU5CQXpZQzdCSWdBMEgxM05FQU5nTG9FaUFEUWR6T0FEc0I1QklnQTBFRE5nTGdFaUFEUWZMYzBRQTJBdHdTSUFOQjI4NEFPd0hZRWlBRFFRTTJBdFFTSUFOQjc5elJBRFlDMEJJZ0EwSDF6Z0E3QWN3U0lBTkJBellDeUJJZ0EwR2wzZEVBTmdMRUVpQURRZlRPQURzQndCSWdBMEVETmdLOEVpQURRYUxkMFFBMkFyZ1NJQU5CNjg0QU93RzBFaUFEUVFNMkFyQVNJQU5CaGQzUkFEWUNyQklnQTBIcXpnQTdBYWdTSUFOQkF6WUNwQklnQTBHQzNkRUFOZ0tnRWlBRFFlM09BRHNCbkJJZ0EwRUROZ0tZRWlBRFFZdmQwUUEyQXBRU0lBTkI3TTRBT3dHUUVpQURRUU0yQW93U0lBTkJpTjNSQURZQ2lCSWdBMEhwemdBN0FZUVNJQU5CQXpZQ2dCSWdBMEgvM05FQU5nTDhFU0FEUWFET0FEc0IrQkVnQTBFQ05nTDBFU0FEUWIzYjBRQTJBdkFSSUFOQjZNNEFPd0hzRVNBRFFRTTJBdWdSSUFOQi9OelJBRFlDNUJFZ0EwSHp6Z0E3QWVBUklBTkJBellDM0JFZ0EwR2YzZEVBTmdMWUVTQURRZkxPQURzQjFCRWdBMEVETmdMUUVTQURRWnpkMFFBMkFzd1JJQU5COGM0QU93SElFU0FEUVFNMkFzUVJJQU5CbWQzUkFEWUN3QkVnQTBIdnpnQTdBYndSSUFOQkF6WUN1QkVnQTBHUzNkRUFOZ0swRVNBRFFkck9BRHNCc0JFZ0EwRUROZ0tzRVNBRFFlemMwUUEyQXFnUklBTkIyYzRBT3dHa0VTQURRUU0yQXFBUklBTkI2ZHpSQURZQ25CRWdBMEhZemdBN0FaZ1JJQU5CQXpZQ2xCRWdBMEhtM05FQU5nS1FFU0FEUWRmTEFEc0JqQkVnQTBFRE5nS0lFU0FEUWVQYzBRQTJBb1FSSUFOQm44NEFPd0dBRVNBRFFRSTJBdndRSUFOQnU5dlJBRFlDK0JBZ0EwSFd6Z0E3QWZRUUlBTkJBellDOEJBZ0EwSGczTkVBTmdMc0VDQURRY2JMQURzQjZCQWdBMEVETmdMa0VDQURRZDNjMFFBMkF1QVFJQU5Cdk1zQU93SGNFQ0FEUVFNMkF0Z1FJQU5CMnR6UkFEWUMxQkFnQTBHeXl3QTdBZEFRSUFOQkF6WUN6QkFnQTBIWDNORUFOZ0xJRUNBRFFkSE9BRHNCeEJBZ0EwRUROZ0xBRUNBRFFkRGMwUUEyQXJ3UUlBTkJ6ODRBT3dHNEVDQURRUU0yQXJRUUlBTkJ5ZHpSQURZQ3NCQWdBMEdneXdBN0Fhd1FJQU5CQXpZQ3FCQWdBMEhHM05FQU5nS2tFQ0FEUWMzT0FEc0JvQkFnQTBFRE5nS2NFQ0FEUWNQYzBRQTJBcGdRSUFOQno4c0FPd0dVRUNBRFFRTTJBcEFRSUFOQndOelJBRFlDakJBZ0EwSEx6Z0E3QVlnUUlBTkJBellDaEJBZ0EwRzkzTkVBTmdLQUVDQURRWjdPQURzQi9BOGdBMEVDTmdMNER5QURRYm5iMFFBMkF2UVBJQU5CeXM0QU93SHdEeUFEUVFNMkF1d1BJQU5CdXR6UkFEWUM2QThnQTBISnpnQTdBZVFQSUFOQkF6WUM0QThnQTBHMzNORUFOZ0xjRHlBRFFjak9BRHNCMkE4Z0EwRUROZ0xVRHlBRFFiVGMwUUEyQXRBUElBTkJ4ODRBT3dITUR5QURRUU0yQXNnUElBTkJzZHpSQURZQ3hBOGdBMEhHemdBN0FjQVBJQU5CQXpZQ3ZBOGdBMEd1M05FQU5nSzREeUFEUWNYT0FEc0J0QThnQTBFRE5nS3dEeUFEUWF2YzBRQTJBcXdQSUFOQnhNNEFPd0dvRHlBRFFRTTJBcVFQSUFOQnFOelJBRFlDb0E4Z0EwSER6Z0E3QVp3UElBTkJBellDbUE4Z0EwR2wzTkVBTmdLVUR5QURRY0xPQURzQmtBOGdBMEVETmdLTUR5QURRYUxjMFFBMkFvZ1BJQU5Cd2M0QU93R0VEeUFEUVFNMkFvQVBJQU5Cbjl6UkFEWUMvQTRnQTBHZHpnQTdBZmdPSUFOQkFqWUM5QTRnQTBHMzI5RUFOZ0x3RGlBRFFjRE9BRHNCN0E0Z0EwRUROZ0xvRGlBRFFaemMwUUEyQXVRT0lBTkJ2ODRBT3dIZ0RpQURRUU0yQXR3T0lBTkJtZHpSQURZQzJBNGdBMEcremdBN0FkUU9JQU5CQXpZQzBBNGdBMEdXM05FQU5nTE1EaUFEUWIzT0FEc0J5QTRnQTBFRE5nTEVEaUFEUVpQYzBRQTJBc0FPSUFOQnZNNEFPd0c4RGlBRFFRTTJBcmdPSUFOQmtOelJBRFlDdEE0Z0EwRzd6Z0E3QWJBT0lBTkJBellDckE0Z0EwR04zTkVBTmdLb0RpQURRYnJPQURzQnBBNGdBMEVETmdLZ0RpQURRWXJjMFFBMkFwd09JQU5CdWM0QU93R1lEaUFEUVFNMkFwUU9JQU5CaDl6UkFEWUNrQTRnQTBHNHpnQTdBWXdPSUFOQkF6WUNpQTRnQTBHRTNORUFOZ0tFRGlBRFFiZk9BRHNCZ0E0Z0EwRUROZ0w4RFNBRFFZSGMwUUEyQXZnTklBTkJoczRBT3dIMERTQURRUUkyQXZBTklBTkI3OXJSQURZQzdBMGdBMEcyemdBN0FlZ05JQU5CQXpZQzVBMGdBMEgrMjlFQU5nTGdEU0FEUWJYT0FEc0IzQTBnQTBFRE5nTFlEU0FEUWZ2YjBRQTJBdFFOSUFOQnRNNEFPd0hRRFNBRFFRTTJBc3dOSUFOQitOdlJBRFlDeUEwZ0EwR3p6Z0E3QWNRTklBTkJBellDd0EwZ0EwSDEyOUVBTmdLOERTQURRYkxPQURzQnVBMGdBMEVETmdLMERTQURRZkxiMFFBMkFyQU5JQU5Cc2M0QU93R3NEU0FEUVFNMkFxZ05JQU5CNzl2UkFEWUNwQTBnQTBHd3pnQTdBYUFOSUFOQkF6WUNuQTBnQTBIczI5RUFOZ0tZRFNBRFFhL09BRHNCbEEwZ0EwRUROZ0tRRFNBRFFlbmIwUUEyQW93TklBTkJyczRBT3dHSURTQURRUU0yQW9RTklBTkI1dHZSQURZQ2dBMGdBMEd0emdBN0Fmd01JQU5CQXpZQytBd2dBMEhqMjlFQU5nTDBEQ0FEUVk3TUFEc0I4QXdnQTBFQ05nTHNEQ0FEUWUzYTBRQTJBdWdNSUFOQnJNNEFPd0hrRENBRFFRTTJBdUFNSUFOQjROdlJBRFlDM0F3Z0EwR3J6Z0E3QWRnTUlBTkJBellDMUF3Z0EwSGQyOUVBTmdMUURDQURRYXJPQURzQnpBd2dBMEVETmdMSURDQURRZHJiMFFBMkFzUU1JQU5CcWM0QU93SEFEQ0FEUVFNMkFyd01JQU5CMTl2UkFEWUN1QXdnQTBHRnpBQTdBYlFNSUFOQkF6WUNzQXdnQTBIVTI5RUFOZ0tzRENBRFFhZk9BRHNCcUF3Z0EwRUROZ0trRENBRFFkSGIwUUEyQXFBTUlBTkJwczRBT3dHY0RDQURRUU0yQXBnTUlBTkJ6dHZSQURZQ2xBd2dBMEdsemdBN0FaQU1JQU5CQXpZQ2pBd2dBMEhMMjlFQU5nS0lEQ0FEUWFUT0FEc0JoQXdnQTBFRE5nS0FEQ0FEUWNqYjBRQTJBdndMSUFOQm84NEFPd0g0Q3lBRFFRTTJBdlFMSUFOQnhkdlJBRFlDOEFzZ0EwR0V6Z0E3QWV3TElBTkJBallDNkFzZ0EwSHIydEVBTmdMa0N5QURRYUxPQURzQjRBc2dBMEVETmdMY0N5QURRY0xiMFFBMkF0Z0xJQU5Cbk00QU93SFVDeUFEUVFNMkF0QUxJQU5CdE52UkFEWUN6QXNnQTBHYnpnQTdBY2dMSUFOQkF6WUN4QXNnQTBHeDI5RUFOZ0xBQ3lBRFFack9BRHNCdkFzZ0EwRUROZ0s0Q3lBRFFhN2IwUUEyQXJRTElBTkJtYzRBT3dHd0N5QURRUU0yQXF3TElBTkJxOXZSQURZQ3FBc2dBMEdZemdBN0FhUUxJQU5CQXpZQ29Bc2dBMEdvMjlFQU5nS2NDeUFEUVpmT0FEc0JtQXNnQTBFRE5nS1VDeUFEUWFYYjBRQTJBcEFMSUFOQmxzNEFPd0dNQ3lBRFFRTTJBb2dMSUFOQm90dlJBRFlDaEFzZ0EwR1Z6Z0E3QVlBTElBTkJBellDL0FvZ0EwR2YyOUVBTmdMNENpQURRZkRPQURzQjlBb2dBMEVFTmdMd0NpQURRWlhkMFFBMkF1d0tJQU5CN3M0QU93SG9DaUFEUVFRMkF1UUtJQU5CanQzUkFEWUM0QW9nQTBIU3pnQTdBZHdLSUFOQkJEWUMyQW9nQTBIVDNORUFOZ0xVQ2lBRFFkRE9BRHNCMEFvZ0EwRUVOZ0xNQ2lBRFFjemMwUUEyQXNnS0lBTkJnODRBT3dIRUNpQURRUVEyQXNBS0lBTkI1OXJSQURZQ3ZBb2dBMEd4endBN0FiZ0tJQU5CQkRZQ3RBb2dBMEhrMzlFQU5nS3dDaUFEUWE3UEFEc0JyQW9nQTBFRU5nS29DaUFEUWR6ZjBRQTJBcVFLSUFOQmxNNEFPd0dnQ2lBRFFRTTJBcHdLSUFOQm5OdlJBRFlDbUFvZ0EwR0N6Z0E3QVpRS0lBTkJBallDa0FvZ0EwSGwydEVBTmdLTUNpQURRYXpQQURzQmlBb2dBMEVFTmdLRUNpQURRZFRmMFFBMkFvQUtJQU5CdDg4QU93SDhDU0FEUVFRMkF2Z0pJQU5CL04vUkFEWUM5QWtnQTBHMHp3QTdBZkFKSUFOQkJEWUM3QWtnQTBIdzM5RUFOZ0xvQ1NBRFFaalBBRHNCNUFrZ0EwRUVOZ0xnQ1NBRFFZVGYwUUEyQXR3SklBTkJ1YzhBT3dIWUNTQURRUVEyQXRRSklBTkJoT0RSQURZQzBBa2dBMEcyendBN0Fjd0pJQU5CQkRZQ3lBa2dBMEg0MzlFQU5nTEVDU0FEUWFyUEFEc0J3QWtnQTBFRU5nSzhDU0FEUWN6ZjBRQTJBcmdKSUFOQm1zOEFPd0cwQ1NBRFFRUTJBckFKSUFOQmpOL1JBRFlDckFrZ0EwRyt6d0E3QWFnSklBTkJCRFlDcEFrZ0EwR1k0TkVBTmdLZ0NTQURRYjNQQURzQm5Ba2dBMEVFTmdLWUNTQURRWlRnMFFBMkFwUUpJQU5Cazg0QU93R1FDU0FEUVFNMkFvd0pJQU5CbWR2UkFEWUNpQWtnQTBHOHp3QTdBWVFKSUFOQkJEWUNnQWtnQTBHUTRORUFOZ0w4Q0NBRFFidlBBRHNCK0FnZ0EwRUVOZ0wwQ0NBRFFZemcwUUEyQXZBSUlBTkJ1czhBT3dIc0NDQURRUVEyQXVnSUlBTkJpT0RSQURZQzVBZ2dBMEc0endBN0FlQUlJQU5CQkRZQzNBZ2dBMEdBNE5FQU5nTFlDQ0FEUWJYUEFEc0IxQWdnQTBFRU5nTFFDQ0FEUWZUZjBRQTJBc3dJSUFOQnM4OEFPd0hJQ0NBRFFRUTJBc1FJSUFOQjdOL1JBRFlDd0FnZ0EwR3l6d0E3QWJ3SUlBTkJCRFlDdUFnZ0EwSG8zOUVBTmdLMENDQURRYS9QQURzQnNBZ2dBMEVFTmdLc0NDQURRZURmMFFBMkFxZ0lJQU5CcmM4QU93R2tDQ0FEUVFRMkFxQUlJQU5CMk4vUkFEWUNuQWdnQTBHcnp3QTdBWmdJSUFOQkJEWUNsQWdnQTBIUTM5RUFOZ0tRQ0NBRFFaTE9BRHNCakFnZ0EwRUROZ0tJQ0NBRFFaYmIwUUEyQW9RSUlBTkJxYzhBT3dHQUNDQURRUVEyQXZ3SElBTkJ5Ti9SQURZQytBY2dBMEdvendBN0FmUUhJQU5CQkRZQzhBY2dBMEhFMzlFQU5nTHNCeUFEUWFmUEFEc0I2QWNnQTBFRU5nTGtCeUFEUWNEZjBRQTJBdUFISUFOQnBzOEFPd0hjQnlBRFFRUTJBdGdISUFOQnZOL1JBRFlDMUFjZ0EwR2x6d0E3QWRBSElBTkJCRFlDekFjZ0EwRzQzOUVBTmdMSUJ5QURRYVRQQURzQnhBY2dBMEVFTmdMQUJ5QURRYlRmMFFBMkFyd0hJQU5Cb3M4QU93RzRCeUFEUVFRMkFyUUhJQU5Cck4vUkFEWUNzQWNnQTBHaHp3QTdBYXdISUFOQkJEWUNxQWNnQTBHbzM5RUFOZ0trQnlBRFFhRFBBRHNCb0FjZ0EwRUVOZ0tjQnlBRFFhVGYwUUEyQXBnSElBTkJuODhBT3dHVUJ5QURRUVEyQXBBSElBTkJvTi9SQURZQ2pBY2dBMEdSemdBN0FZZ0hJQU5CQXpZQ2hBY2dBMEdUMjlFQU5nS0FCeUFEUVo3UEFEc0IvQVlnQTBFRU5nTDRCaUFEUVp6ZjBRQTJBdlFHSUFOQm5jOEFPd0h3QmlBRFFRUTJBdXdHSUFOQm1OL1JBRFlDNkFZZ0EwR2N6d0E3QWVRR0lBTkJCRFlDNEFZZ0EwR1UzOUVBTmdMY0JpQURRWnZQQURzQjJBWWdBMEVFTmdMVUJpQURRWkRmMFFBMkF0QUdJQU5CbWM4QU93SE1CaUFEUVFRMkFzZ0dJQU5CaU4vUkFEWUN4QVlnQTBHVnd3QTdBY0FHSUFOQkJEWUN2QVlnQTBHQTM5RUFOZ0s0QmlBRFFaVERBRHNCdEFZZ0EwRUVOZ0t3QmlBRFFmemUwUUEyQXF3R0lBTkJvODhBT3dHb0JpQURRUVEyQXFRR0lBTkJzTi9SQURZQ29BWWdBMEdTd3dBN0Fad0dJQU5CQkRZQ21BWWdBMEg0M3RFQU5nS1VCaUFEUVpUUEFEc0JrQVlnQTBFRU5nS01CaUFEUWZUZTBRQTJBb2dHSUFOQmo4NEFPd0dFQmlBRFFRTTJBb0FHSUFOQmpOdlJBRFlDL0FVZ0EwR1R6d0E3QWZnRklBTkJCRFlDOUFVZ0EwSHczdEVBTmdMd0JTQURRWkxQQURzQjdBVWdBMEVFTmdMb0JTQURRZXplMFFBMkF1UUZJQU5Ca2M4QU93SGdCU0FEUVFRMkF0d0ZJQU5CNk43UkFEWUMyQVVnQTBHUXp3QTdBZFFGSUFOQkJEWUMwQVVnQTBIazN0RUFOZ0xNQlNBRFFZL1BBRHNCeUFVZ0EwRUVOZ0xFQlNBRFFlRGUwUUEyQXNBRklBTkJqczhBT3dHOEJTQURRUVEyQXJnRklBTkIzTjdSQURZQ3RBVWdBMEdOendBN0FiQUZJQU5CQkRZQ3JBVWdBMEhZM3RFQU5nS29CU0FEUVl6UEFEc0JwQVVnQTBFRU5nS2dCU0FEUWRUZTBRQTJBcHdGSUFOQmk4OEFPd0dZQlNBRFFRUTJBcFFGSUFOQjBON1JBRFlDa0FVZ0EwR0t6d0E3QVl3RklBTkJCRFlDaUFVZ0EwSE0zdEVBTmdLRUJTQURRWTdPQURzQmdBVWdBMEVETmdMOEJDQURRWW5iMFFBMkF2Z0VJQU5CaWM4QU93SDBCQ0FEUVFRMkF2QUVJQU5CeU43UkFEWUM3QVFnQTBHSXp3QTdBZWdFSUFOQkJEWUM1QVFnQTBIRTN0RUFOZ0xnQkNBRFFZZlBBRHNCM0FRZ0EwRUVOZ0xZQkNBRFFjRGUwUUEyQXRRRUlBTkJoczhBT3dIUUJDQURRUVEyQXN3RUlBTkJ2TjdSQURZQ3lBUWdBMEdGendBN0FjUUVJQU5CQkRZQ3dBUWdBMEc0M3RFQU5nSzhCQ0FEUVlUUEFEc0J1QVFnQTBFRU5nSzBCQ0FEUWJUZTBRQTJBckFFSUFOQmc4OEFPd0dzQkNBRFFRUTJBcWdFSUFOQnNON1JBRFlDcEFRZ0EwR0N6d0E3QWFBRUlBTkJCRFlDbkFRZ0EwR3MzdEVBTmdLWUJDQURRWUhQQURzQmxBUWdBMEVFTmdLUUJDQURRYWplMFFBMkFvd0VJQU5CZ004QU93R0lCQ0FEUVFRMkFvUUVJQU5CcE43UkFEWUNnQVFnQTBHTnpnQTdBZndESUFOQkF6WUMrQU1nQTBHRzI5RUFOZ0wwQXlBRFFmL09BRHNCOEFNZ0EwRUVOZ0xzQXlBRFFhRGUwUUEyQXVnRElBTkIvczRBT3dIa0F5QURRUVEyQXVBRElBTkJuTjdSQURZQzNBTWdBMEg5emdBN0FkZ0RJQU5CQkRZQzFBTWdBMEdZM3RFQU5nTFFBeUFEUWZ6T0FEc0J6QU1nQTBFRU5nTElBeUFEUVpUZTBRQTJBc1FESUFOQis4NEFPd0hBQXlBRFFRUTJBcndESUFOQmtON1JBRFlDdUFNZ0EwSDZ6Z0E3QWJRRElBTkJCRFlDc0FNZ0EwR00zdEVBTmdLc0F5QURRZm5PQURzQnFBTWdBMEVFTmdLa0F5QURRWWplMFFBMkFxQURJQU5CK000QU93R2NBeUFEUVFRMkFwZ0RJQU5CaE43UkFEWUNsQU1nQTBIM3pnQTdBWkFESUFOQkJEWUNqQU1nQTBHQTN0RUFOZ0tJQXlBRFFmYk9BRHNCaEFNZ0EwRUVOZ0tBQXlBRFFmemQwUUEyQXZ3Q0lBTkJqTTRBT3dINEFpQURRUU0yQXZRQ0lBTkJnOXZSQURZQzhBSWdBMEhweUFBN0Fld0NJQU5CQkRZQzZBSWdBMEg0M2RFQU5nTGtBaUFEUWVqSUFEc0I0QUlnQTBFRU5nTGNBaUFEUWZUZDBRQTJBdGdDSUFOQjU4Z0FPd0hVQWlBRFFRUTJBdEFDSUFOQjhOM1JBRFlDekFJZ0EwSG15QUE3QWNnQ0lBTkJCRFlDeEFJZ0EwSHMzZEVBTmdMQUFpQURRZVhJQURzQnZBSWdBMEVFTmdLNEFpQURRZWpkMFFBMkFyUUNJQU5CNU1nQU93R3dBaUFEUVFRMkFxd0NJQU5CNU4zUkFEWUNxQUlnQTBIanlBQTdBYVFDSUFOQkJEWUNvQUlnQTBIZzNkRUFOZ0tjQWlBRFFlTElBRHNCbUFJZ0EwRUVOZ0tVQWlBRFFkemQwUUEyQXBBQ0lBTkI0Y2dBT3dHTUFpQURRUVEyQW9nQ0lBTkIyTjNSQURZQ2hBSWdBMEhneUFBN0FZQUNJQU5CQkRZQy9BRWdBMEhVM2RFQU5nTDRBU0FEUVo3TUFEc0I5QUVnQTBFRE5nTHdBU0FEUVlEYjBRQTJBdXdCSUFOQmg4NEFPd0hvQVNBRFFRUTJBdVFCSUFOQjhkclJBRFlDNEFFZ0EwR0l6Z0E3QWR3QklBTkJCRFlDMkFFZ0EwSDEydEVBTmdMVUFTQURRWW5PQURzQjBBRWdBMEVFTmdMTUFTQURRZm5hMFFBMkFzZ0JJQU5CNDh3QU93SEVBU0FEUVFRMkFzQUJJQU5CeE4zUkFEWUN2QUVnQTBIbXpBQTdBYmdCSUFOQkJEWUN0QUVnQTBISTNkRUFOZ0t3QVNBRFFlWE1BRHNCckFFZ0EwRUVOZ0tvQVNBRFFjemQwUUEyQXFRQklBTkJtOHdBT3dHZ0FTQURRUU0yQXB3QklBTkIvZHJSQURZQ21BRWdBMEhnekFBN0FaUUJJQU5CQkRZQ2tBRWdBMEhRM2RFQU5nS01BU0FEUWVmT0FEc0JpQUVnQTBFRU5nS0VBU0FEUWNEZDBRQTJBb0FCSUFOQjVzNEFPd0Y4SUFOQkJEWUNlQ0FEUWJ6ZDBRQTJBblFnQTBIbHpnQTdBWEFnQTBFRU5nSnNJQU5CdU4zUkFEWUNhQ0FEUVpET0FEc0JaQ0FEUVFRMkFtQWdBMEdQMjlFQU5nSmNJQU5CNU00QU93RllJQU5CQkRZQ1ZDQURRYlRkMFFBMkFsQWdBMEhqemdBN0FVd2dBMEVFTmdKSUlBTkJzTjNSQURZQ1JDQURRZUxPQURzQlFDQURRUVEyQWp3Z0EwR3MzZEVBTmdJNElBTkI0YzRBT3dFMElBTkJCRFlDTUNBRFFhamQwUUEyQWl3Z0EwSGV6Z0E3QVNnZ0EwRUVOZ0lrSUFOQitOelJBRFlDSUNBRFFhSE9BRHNCSENBRFFRTTJBaGdnQTBHLzI5RUFOZ0lVSUFOQmdjNEFPd0VRSUFOQkFqWUNEQ0FEUWVQYTBRQTJBZ2hCeWdFaEJRTkFJQVZCQWtsRkJFQWdCQ0FGUVFGMklnWWdCR29pQkNBQklBSWdBMEVJYWlBRVFReHNhaUlFS0FJQUlBUkJCR29vQWdBUWd3ZEIvd0Z4UVFGR0d5RUVJQVVnQm1zaEJRd0JDd3NDUUNBQklBSWdBMEVJYWlBRVFReHNhaUlCS0FJQUlBRkJCR29vQWdBUWd3ZEIvd0Z4SWdFRWYwRUFCU0FFSUFGQi93RkdhaUlCUWNvQlR3MEJJQU5CQ0dvZ0FVRU1iR292QVFnaEJFRUJDeUVGSUFBZ0JEc0JBaUFBSUFVN0FRQWdBMEdBRTJva0FBOExRY29CUWNvQlFiVCt6UUFReGdRQUM1Y2dBUTUvSXdCQjBBRnJJZ0lrQUFKQUFrQWdBVUlDZlVJRFdnUkFJQUZDQlgxQ0FsUU5BU0FBUW9DQWdJRFlnc0FJTndJQURBSUxJQUpCK3JYSkFEWUNYQ0FDUVFBN0FWZ2dBa0tCZ0lDQUVEY0NVQ0FDUVJCcUlBSkIwQUJxSWdNUTJRSWdBaTBBRUFSQUlBSXRBQkVoQ2lBQ1FmQUFhaUFERU9NSElBSkJDR3BCQ0NBQ0tBSndRUUZxSWdSQmZ5QUVHeUlFSUFSQkNFMGJRUUZCQVVINCtNMEFFSm9GSUFJb0FnZ2hCQ0FDS0FJTUlnTWdDam9BQUNBQ1FRRTJBa3dnQWlBRE5nSklJQUlnQkRZQ1JDQUNRZmdBYWlBQ1FkZ0FhaWtDQURjREFDQUNJQUlwQWxBM0EzQkJBU0VHQTBBZ0FpQUNRZkFBYWlJRUVOa0NJQUl0QUFBRVFDQUNMUUFCSVFvZ0FpZ0NSQ0FHUmdSQUlBSkI1QUJxSUFRUTR3Y2dBa0hFQUdvZ0FpZ0NaRUVCYWlJRVFYOGdCQnNReFFjZ0FpZ0NTQ0VEQ3lBRElBWnFJQW82QUFBZ0FpQUdRUUZxSWdZMkFrd01BUXNMSUFBZ0Fpa0NSRGNDQUNBQVFRaHFJQUpCekFCcUtBSUFOZ0lBREFJTElBQkJBRFlDQ0NBQVFvQ0FnSUFRTndJQURBRUxJQUpDZ1lDQWdCQTNBbkFDUUFKQUEwQWdBa0h3QUdvUXdnWWlCRUdBZ01RQVJnMEJJQVJCSUVrZ0JFSC9BRXR5UlNBRVFmOEFSM0VOQUFzZ0FrSDZBR3BDQURjQkFDQUNRZ0EzQVhJZ0FrSFlBR29pQnlBQ1FmZ0FhaWtCQURjREFDQUNRZUFBYWlJRUlBSkJnQUZxSWdvdkFRQTdBUUFnQWlBQ0tRRndOd05RSUFKQkFEWUNiQ0FDUW9DQWdJQVFOd0prSUFKQjVBQnFRUUFReFFjZ0FrR0dBV29nQnlrREFEY0JBQ0FDUVk0QmFpQUVMd0VBT3dFQUlBSkJBRHNCZkNBQ1FZQ0F4QUEyQW5nZ0FrRUFOZ0p3SUFJZ0Fpa0RVRGNCZmlBQ1FRQTZBTWdCSUFKQkFUb0F4QUVnQWtFQU5nTEFBU0FDUWdFM0FyZ0JJQUpDZ0lDQWdCQTNBckFCSUFKQkFEb0FyQUVnQWtFQU5nS29BU0FDUVFBNkFLUUJJQUpCQURZQ29BRWdBa0VBT2dDY0FTQUNRUUEyQXBnQklBSkJBRG9BbEFFZ0FrRUFPd0dRQVNBQ1FaUUJhaUVMSUFKQmtBRnFJUXdnQWtIOEFHb2hEd05BSUFJb0Fvd0JJUVlnQWk4QmZDRURJQUlvQW9nQklRY2dBaWdDZ0FFaERnTkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFsQkFXc09BZ0FCQWdzZ0J5RUVJQVloQ1NBT1FZQ0F4QUJHSWdWRkJFQWdBMEgvL3dOeElnbEJCVThOQXlBS0lRUUxJQWdnQ1U4TkRTQUNJQVkyQW93QklBSWdBenNCZkNBQ1FRRTJBbkFnQkNBSVFRSjBhaWdDQUNFRklBSWdDRUVCYWpZQ2RDQUNRUUUyQW5BTUNBc2dBaUFHTmdLTUFTQUNJQU03QVh3Z0FrRUNOZ0p3SUE1QmdJREVBRVlOQXlBRFFmLy9BM0VpQkVFRlNRMENJQVJCQkVHVW05SUFFTGdKQUFzZ0FpQUdOZ0tNQVNBQ0lBTTdBWHdnQWtFQU5nSndBMEFDUUNBQ0tBTEFBVVVFUUFKQUFrQUNRQUpBQW44Q1FBSkFJQUlvQXJRQklnWkZEUUFnQWlnQ3VBRWhCd0pBQWtBQ1FBSkFBMEFnQmlBSFJnMEVBbjhnQml3QUFDSUpRUUJPQkVBZ0NVSC9BWEVoQlNBR1FRRnFEQUVMSUFZdEFBRkJQM0VoQkNBSlFSOXhJUU1nQ1VGZlRRUkFJQU5CQm5RZ0JISWhCU0FHUVFKcURBRUxJQVl0QUFKQlAzRWdCRUVHZEhJaEJDQUpRWEJKQkVBZ0JDQURRUXgwY2lFRklBWkJBMm9NQVFzZ0EwRVNkRUdBZ1BBQWNTQUdMUUFEUVQ5eElBUkJCblJ5Y2lFRklBWkJCR29MSVFZZ0JVR0EvQU5yUVJCSkRRQWdCVUdHTUdzaUJFRUhUVUVBUVFFZ0JIUkI0UUZ4R3cwQUFrQWdCVUdBUUdvT0RnSUNBZ0lDQWdJQ0FnSUNBZ0VCQUFzQ1FDQUZRZC9BQUdzT0FnSUJBQXNnQlVHdEFVWWdCVUhQQmtaeUlBVkIvLzBEUm5JTkFBc2dCVUdnQVVZZ0JVR0FMVVp5SUFWQnI4QUFSbklOQUNBRlFZQ0F4QUJHSWdRTkF5QUZRWURnQUVjTkFRc2dBaUFHTmdLMEFVRWdJUVVNQVFzZ0FpQUdOZ0swQVNBRURRSUxJQUl0QU1RQlJRMEZJQVZCZ0FGSkRRWWdCVUdBMkFKcklnTkJwTmNBU1EwRUlBSkJNR29nQlJEakF5QUNLQUl3SWdaRkRRSWdBaWdDTkF3REN5QUNJQVkyQXJRQkN3Si9JQUlvQXBnQlFZQ0F4QUJHQkVBZ0FpZ0NwQUVNQVFzZ0FpOEJrQUVMUlEwRklBd1EyZ0lnQWdKL0lBSW9BcGdCSWdaQmdJREVBRVlFUUNBQ0tBS2tBUXdCQ3lBQ0x3R1FBUXMyQXNBQkRBY0xJQUpCS0dvZ0JSRGtBeUFDS0FJb0lRWWdBaWdDTEFzZ0JrVU5Ba0VDZENFRkEwQWdCVVVOQnlBTUlBWW9BZ0FRc2dVZ0JVRUVheUVGSUFaQkJHb2hCZ3dBQ3dBTElBd2dBMEgvL3dOeElnZEJ6QVJ1SWdSQmdDSnlFTElGSUF3Z0F5QUVRY3dFYkd0Qi8vOERjVUVjYmtIaEltb1FzZ1VnQjBFY2NDSUVSUTBGSUFSQnB5TnFJUVVNQVFzZ0JVR0FBVWtOQUNBRlFZRFlBbXNpQTBHazF3QlBCRUFnQWtFNGFpQUZFT1FESUFJb0FqZ2lBMFVOQVNBQ0tBSThRUUowSVFZRFFDQUdSUTBHSUF3Z0F5Z0NBQkN5QlNBR1FRUnJJUVlnQTBFRWFpRUREQUFMQUFzZ0RDQURRZi8vQTNFaUIwSE1CRzRpQkVHQUluSVFzZ1VnRENBRElBUkJ6QVJzYTBILy93TnhRUnh1UWVFaWFoQ3lCU0FIUVJ4d0lnUkZEUVFnQkVHbkkyb2hCUXNnRENBRkVMSUZEQU1MSUFKQ0FqY0NjRUVDSVFsQkFDRUlJQUlvQW5naUJVR0FnTVFBUmcwUUlBSkJnSURFQURZQ2VBd0pDeUFDS0FLWUFTRUdDd0pBQWtBQ1FBSkFJQUlvQXJ3QkFuOGdCa0dBZ01RQVJnUkFJQUlvQXFRQklRWWdBaWdDb0FFTUFRc2dBaThCa0FFaUJrRUZUdzBCSUFzTElBWkJ4SnJTQUJEUUJ5Z0NCQ0VISUFJb0Fyd0JRUUZxSWdRZ0FpZ0N3QUZIQkVBZ0FpQUVOZ0s4QVF3RUN3Si9JQUlvQXBnQlFZQ0F4QUJHQkVBZ0FpZ0NwQUVNQVFzZ0FpOEJrQUVMSUFScklRMUJBQ0VHUVFRaEJRTkFJQVlnRFVjRVFDQUNLQUxBQVNBR2FnSi9JQUlvQXBnQlFZQ0F4QUJHQkVBZ0FpZ0NwQUVoQXlBQ0tBS2dBUXdCQ3lBQ0x3R1FBU0lEUVFWUERRUWdDd3NnQTBIVW10SUFFTkFISWdRb0FnUWhEaUFFTFFBQUlRa0NmeUFDS0FLWUFVR0FnTVFBUmdSQUlBSW9BcUFCSVFnZ0FpZ0NwQUVNQVFzZ0FrRWdhaUFDTHdHUUFTQUxFTkVISUFJb0FpQWhDQ0FDS0FJa0N5SURJQVpORFFRZ0JTQUlhaUlFSUE0MkFnQWdCRUVFYXlBSk9nQUFJQVpCQVdvaEJpQUZRUWhxSVFVTUFRc0xBa0FnQWlnQ21BRkJnSURFQUVZRVFDQU5JQUlvQXFRQlN3MEJJQUlnRFRZQ3BBRU1BUXNnRFNBQ0x3R1FBVThOQUNBQ0lBMDdBWkFCQ3lBQ1FnQTNBcndCREFNTElBWkJCRUdVbTlJQUVMZ0pBQXNnQTBFRVFaU2IwZ0FRdUFrQUN5QUdJQU5CNUpyU0FCREdCQUFMSUFjUTZBUWhBd0pBQWtBQ1FBSkFJQUlvQW5naUJVR0FnTVFBUndSQUlBSXRBTWdCUlEwQklBTkIvd0Z4SWdRZ0FpMEF5UUZORFFNZ0JTQUhFRm9pQkVHQWdNUUFSdzBDREFRTElBTkIvd0Z4QkVBZ0J5RUZEQXdMSUFJZ0J6WUNlQXdFQ3lBRklBY1FXaUlFUVlDQXhBQkhCRUFnQWlBRU5nSjREQVFMSUFOQi93RnhEUUlnQWlBSE5nSjREQW9MSUFJZ0JEWUNlQXdDQ3lBRURRQWdBa0VBT2dESUFTQUNJQWMyQW5nZ0FrSUJOd0p3REFnTElBOGdCeEQ3QWlBQ0lBTTZBTWtCSUFKQkFUb0F5QUVNQUFzQUN5QUNJQVkyQW93QklBSWdBenNCZkNBQ1FRRTJBbkFnQ1VFRVFaU2IwZ0FRdUFrQUN5QUtJUWNnQkNBSVN3MEJJQVJGRFFNZ0FrRUFPd0Y4REFNTElBWWdDRTBOQVFzZ0J5QUlRUUowYWlnQ0FDRUZJQUlnQ0VFQmFqWUNkQ0FDUVFJMkFuQU1BZ3NnQWtFQU5nS01BUXNnQWlnQ2VDRUZJQUpCZ0lERUFEWUNlQ0FGUVlDQXhBQkdEUUVMSUFJb0Ftd2hCQ0FDUWVRQWFnSi9RUUVnQlVHQUFVa2lCdzBBR2tFQ0lBVkJnQkJKRFFBYVFRTkJCQ0FGUVlDQUJFa2JDeUlHRU1VSElBSW9BbWdnQWlnQ2JHb2hBeUFIRFFJZ0JVR0FFRWtOQVNBRlFZQ0FCRThFUUNBRElBVkJQM0ZCZ0FGeU9nQURJQU1nQlVFU2RrSHdBWEk2QUFBZ0F5QUZRUVoyUVQ5eFFZQUJjam9BQWlBRElBVkJESFpCUDNGQmdBRnlPZ0FCREFRTElBTWdCVUUvY1VHQUFYSTZBQUlnQXlBRlFReDJRZUFCY2pvQUFDQURJQVZCQm5aQlAzRkJnQUZ5T2dBQkRBTUxJQXdRcHdnZ0R4Q29DQ0FDS0FKa0lRa2dBaUFDS0FKb0lnZ2dBaWdDYkNJR2FpSUxOZ0owSUFJZ0NEWUNjQUpBQTBBQ1FDQUNRZkFBYWhEQ0JpSURRWUJBYWtFTVNTQURRYUFCUm5JZ0EwR0FMVVlnQTBHdndBQkdjbklnQTBIZndBQkdJQU5CZ09BQVJuSnlEUUFDUUNBRFFZQ0F4QUJIQkVBZ0EwSC9BRVlnQTBFZ1NYSWdBMEhnLy84QWNVR0FBVVp5RFFJZ0EwSGd3QUJySWdSQkQwdEJBU0FFZEVHUCtBTnhSWElOQVF3Q0N5QUNRUUEyQW9BQklBSWdDellDZkNBQ0lBZzJBbmdnQWlBR05nSjBJQUlnQ0RZQ2NDQUNRZmdBYWlFS0FrQUNRQUpBQTBBZ0NoRFhCQ0lFUVlDQXhBQkdEUUVnQkJDMUNFVU5BQXNnQWtFQU5nS0FBU0FDSUFzMkFud2dBaUFJTmdKNElBSWdCallDZENBQ0lBZzJBbkFnQWtINEFHb2hDZ0pBQTBBZ0NoRFhCQ0lFUVlDQXhBQkdEUUVnQkJDWUEwSC9BWEZCQ1VjTkFBdEJnSURFQUNFRERBVUxJQUlnQ3pZQ2RDQUNJQWcyQW5CQmdJREVBQ0VESUFKQjhBQnFFTUlHSWdSQmdJREVBRVlOQVNBRUVMVUlSUTBFSUFaRkRRSWdDMEVCYXl3QUFDSUZRUUJJQkVBZ0JVRS9jUUovSUF0QkFtc3RBQUFpQk1BaUIwRkFUZ1JBSUFSQkgzRU1BUXNnQjBFL2NRSi9JQXRCQTJzdEFBQWlDc0FpQkVHL2Ywb0VRQ0FLUVE5eERBRUxJQVJCUDNFZ0MwRUVheTBBQUVFSGNVRUdkSElMUVFaMGNndEJCblJ5SWdWQmdJREVBRVlOQXdzZ0JSQzFDRVVOQkFzZ0FpQUxOZ0owSUFJZ0NEWUNjQU5BSUFKQjhBQnFFTUlHSWdOQmdJREVBRWNFUUVHTUF5RUZRUUFoQkFOQUlBVkJBa2xGQkVBZ0JDQUZRUUYySWdvZ0JHb2lCQ0FFUVFOMFFieWkwZ0JxS0FJQUlBTkxHeUVFSUFVZ0Ntc2hCUXdCQ3dzZ0JFRURkQ0lFUWJ5aTBnQnFLQUlBSUFOTERRRWdBeUFFUWNDaTBnQnFLQUlBU3cwQkRBVUxDeUFJSVFNZ0NVR0JnSUNBZUVjTkRRd0ZDMEdjb05JQUVMc0pBQXRCcktEU0FCQzdDUUFMSUFOQmpNQUFheUlFUVIxTlFRQkJBU0FFZEVHRGdJQ0FBM0ViRFFBZ0EwSGREVVlnQTBINS93TnJJZ1JCQkVseUlBTkJqdzVHSUFOQmpqQkdjbklnQTBILy9RTkdJQU5CODZJSGEwRUlTWElnQTBHQXdBTnJRWUF5U1NBRFFZQ0FQR3RCL3Y4RFNYSnljZzBBSUFOQmdJQkFha0grL3dOSkRRQkJBU0VGSUFOQjBQc0RhMEVnVHdSL0lBTkIvdi8vQUhGQi92OERhMEVRZDBFUVNTQURRZjMvd3dCTGNnVWdCUXNnQkVFRlNYSWdBMEh3M3dCclFReEpJQU5CNnNBQWEwRUdTWEp5SUFOQnFzQUFhMEVGU1NBRFFjQUdhMEVDU1hJZ0EwR0JnRGhHSUFOQmpzQUFhMEVDU1hKeWNnMEFJQU5Cb0lBNGEwSGdBRThOQVFzTElBa2dDRUVCUVFFUXlRUUxJQUJCZ0lDQWdIZzJBZ0FnQUNBRE5nSUVEQWdMSUFNZ0JVRS9jVUdBQVhJNkFBRWdBeUFGUVFaMlFjQUJjam9BQUF3QkN5QURJQVU2QUFBTElBSWdCQ0FHYWpZQ2JDQUNLQUowSVFnZ0FpZ0NjQ0VKREFJTFFRQWhDU0FEUVFBZ0JSc2hBMEVBSUFZZ0JSc2hCZ3dBQ3dBTEFBdEJnSUNBZ0hnaENVRUJJUWdMSUFKQkdHb2dCa0dVMXRJQUVKOEZJQUlvQWhnaEJDQUNLQUljSVFvZ0JnUkFJQW9nQ0NBRy9Bb0FBQXNnQUNBR05nSUlJQUFnQ2pZQ0JDQUFJQVEyQWdBZ0NVR0FnSUNBZUVZTkFDQUpJQWdRcVFrTElBSkIwQUZxSkFBTGdTTUNDSDhCZmdKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQUVIMUFVOEVRQ0FBUWN6L2Uwc05CU0FBUVF0cUlnRkJlSEVoQlVHdzM5b0FLQUlBSWdoRkRRUkJIeUVIUVFBZ0JXc2hBeUFBUWZULy93ZE5CRUFnQlVFR0lBRkJDSFpuSWdCcmRrRUJjU0FBUVFGMGEwRSthaUVIQ3lBSFFRSjBRWlRjMmdCcUtBSUFJZ0ZGQkVCQkFDRUFEQUlMUVFBaEFDQUZRUmtnQjBFQmRtdEJBQ0FIUVI5SEczUWhCQU5BQWtBZ0FTZ0NCRUY0Y1NJR0lBVkpEUUFnQmlBRmF5SUdJQU5QRFFBZ0FTRUNJQVlpQXcwQVFRQWhBeUFCSVFBTUJBc2dBU2dDRkNJR0lBQWdCaUFCSUFSQkhYWkJCSEZxS0FJUUlnRkhHeUFBSUFZYklRQWdCRUVCZENFRUlBRU5BQXNNQVF0QnJOL2FBQ2dDQUNJRVFSQWdBRUVMYWtINEEzRWdBRUVMU1JzaUJVRURkaUlBZGlJQlFRTnhCRUFDUUNBQlFYOXpRUUZ4SUFCcUlnVkJBM1FpQUVHazNkb0FhaUlDSUFCQnJOM2FBR29vQWdBaUFTZ0NDQ0lEUndSQUlBTWdBallDRENBQ0lBTTJBZ2dNQVF0QnJOL2FBQ0FFUVg0Z0JYZHhOZ0lBQ3lBQklBQkJBM0kyQWdRZ0FDQUJhaUlBSUFBb0FnUkJBWEkyQWdRTUNBc2dCVUcwMzlvQUtBSUFUUTBEQWtBQ1FDQUJSUVJBUWJEZjJnQW9BZ0FpQUVVTkJpQUFhRUVDZEVHVTNOb0FhaWdDQUNJQ0tBSUVRWGh4SUFWcklRTWdBaUVCQTBBQ1FDQUNLQUlRSWdBTkFDQUNLQUlVSWdBTkFDQUJLQUlZSVFjQ1FBSkFJQUVnQVNnQ0RDSUFSZ1JBSUFGQkZFRVFJQUVvQWhRaUFCdHFLQUlBSWdJTkFVRUFJUUFNQWdzZ0FTZ0NDQ0lDSUFBMkFnd2dBQ0FDTmdJSURBRUxJQUZCRkdvZ0FVRVFhaUFBR3lFRUEwQWdCQ0VHSUFJaUFFRVVhaUFBUVJCcUlBQW9BaFFpQWhzaEJDQUFRUlJCRUNBQ0cyb29BZ0FpQWcwQUN5QUdRUUEyQWdBTElBZEZEUVFDUUNBQktBSWNRUUowUVpUYzJnQnFJZ0lvQWdBZ0FVY0VRQ0FCSUFjb0FoQkhCRUFnQnlBQU5nSVVJQUFOQWd3SEN5QUhJQUEyQWhBZ0FBMEJEQVlMSUFJZ0FEWUNBQ0FBUlEwRUN5QUFJQWMyQWhnZ0FTZ0NFQ0lDQkVBZ0FDQUNOZ0lRSUFJZ0FEWUNHQXNnQVNnQ0ZDSUNSUTBFSUFBZ0FqWUNGQ0FDSUFBMkFoZ01CQXNnQUNnQ0JFRjRjU0FGYXlJQ0lBTWdBaUFEU1NJQ0d5RURJQUFnQVNBQ0d5RUJJQUFoQWd3QUN3QUxBa0JCQWlBQWRDSUNRUUFnQW10eUlBRWdBSFJ4YUNJR1FRTjBJZ0JCcE4zYUFHb2lBU0FBUWF6ZDJnQnFLQUlBSWdJb0FnZ2lBMGNFUUNBRElBRTJBZ3dnQVNBRE5nSUlEQUVMUWF6ZjJnQWdCRUYrSUFaM2NUWUNBQXNnQWlBRlFRTnlOZ0lFSUFJZ0JXb2lCaUFBSUFWcklnTkJBWEkyQWdRZ0FDQUNhaUFETmdJQVFiVGYyZ0FvQWdBaUFRUkFJQUZCZUhGQnBOM2FBR29oQUVHODM5b0FLQUlBSVFRQ2YwR3MzOW9BS0FJQUlnVkJBU0FCUVFOMmRDSUJjVVVFUUVHczM5b0FJQUVnQlhJMkFnQWdBQXdCQ3lBQUtBSUlDeUVCSUFBZ0JEWUNDQ0FCSUFRMkFnd2dCQ0FBTmdJTUlBUWdBVFlDQ0F0QnZOL2FBQ0FHTmdJQVFiVGYyZ0FnQXpZQ0FDQUNRUWhxRHd0QnNOL2FBRUd3MzlvQUtBSUFRWDRnQVNnQ0hIZHhOZ0lBQ3dKQUFrQWdBMEVRVHdSQUlBRWdCVUVEY2pZQ0JDQUJJQVZxSWdVZ0EwRUJjallDQkNBRElBVnFJQU0yQWdCQnROL2FBQ2dDQUNJRVJRMEJJQVJCZUhGQnBOM2FBR29oQUVHODM5b0FLQUlBSVFJQ2YwR3MzOW9BS0FJQUlnWkJBU0FFUVFOMmRDSUVjVVVFUUVHczM5b0FJQVFnQm5JMkFnQWdBQXdCQ3lBQUtBSUlDeUVFSUFBZ0FqWUNDQ0FFSUFJMkFnd2dBaUFBTmdJTUlBSWdCRFlDQ0F3QkN5QUJJQU1nQldvaUFFRURjallDQkNBQUlBRnFJZ0FnQUNnQ0JFRUJjallDQkF3QkMwRzgzOW9BSUFVMkFnQkJ0Ti9hQUNBRE5nSUFDd3dIQ3lBQUlBSnlSUVJBUVFBaEFrRUNJQWQwSWdCQkFDQUFhM0lnQ0hFaUFFVU5BeUFBYUVFQ2RFR1UzTm9BYWlnQ0FDRUFDeUFBUlEwQkN3TkFJQUFnQWlBQUtBSUVRWGh4SWdRZ0JXc2lCaUFEU1NJSEd5RUlJQUFvQWhBaUFVVUVRQ0FBS0FJVUlRRUxJQUlnQ0NBRUlBVkpJZ0FiSVFJZ0F5QUdJQU1nQnhzZ0FCc2hBeUFCSWdBTkFBc0xJQUpGRFFBZ0JVRzAzOW9BS0FJQUlnQk5JQU1nQUNBRmEwOXhEUUFnQWlnQ0dDRUhBa0FDUUNBQ0lBSW9BZ3dpQUVZRVFDQUNRUlJCRUNBQ0tBSVVJZ0FiYWlnQ0FDSUJEUUZCQUNFQURBSUxJQUlvQWdnaUFTQUFOZ0lNSUFBZ0FUWUNDQXdCQ3lBQ1FSUnFJQUpCRUdvZ0FCc2hCQU5BSUFRaEJpQUJJZ0JCRkdvZ0FFRVFhaUFBS0FJVUlnRWJJUVFnQUVFVVFSQWdBUnRxS0FJQUlnRU5BQXNnQmtFQU5nSUFDeUFIUlEwREFrQWdBaWdDSEVFQ2RFR1UzTm9BYWlJQktBSUFJQUpIQkVBZ0FpQUhLQUlRUndSQUlBY2dBRFlDRkNBQURRSU1CZ3NnQnlBQU5nSVFJQUFOQVF3RkN5QUJJQUEyQWdBZ0FFVU5Bd3NnQUNBSE5nSVlJQUlvQWhBaUFRUkFJQUFnQVRZQ0VDQUJJQUEyQWhnTElBSW9BaFFpQVVVTkF5QUFJQUUyQWhRZ0FTQUFOZ0lZREFNTEFrQUNRQUpBQWtBZ0JVRzAzOW9BS0FJQUlnRkxCRUFnQlVHNDM5b0FLQUlBSWdCUEJFQkJBQ0VESUFWQnI0QUVhaUlBUVJCMlFBQWlBVUYvUmlJQ0RRWWdBVUVRZENJQlJRMEdRY1RmMmdCQkFDQUFRWUNBZkhFZ0Foc2lBMEhFMzlvQUtBSUFhaUlBTmdJQVFjamYyZ0FnQUVISTM5b0FLQUlBSWdJZ0FDQUNTeHMyQWdBQ1FBSkFRY0RmMmdBb0FnQWlBZ1JBUVpUZDJnQWhBQU5BSUFBb0FnQWlCQ0FBS0FJRUlnWnFJQUZHRFFJZ0FDZ0NDQ0lBRFFBTERBSUxRZERmMmdBb0FnQWlBRUVBSUFBZ0FVMGJSUVJBUWREZjJnQWdBVFlDQUF0QjFOL2FBRUgvSHpZQ0FFR1kzZG9BSUFNMkFnQkJsTjNhQUNBQk5nSUFRYkRkMmdCQnBOM2FBRFlDQUVHNDNkb0FRYXpkMmdBMkFnQkJyTjNhQUVHazNkb0FOZ0lBUWNEZDJnQkJ0TjNhQURZQ0FFRzAzZG9BUWF6ZDJnQTJBZ0JCeU4zYUFFRzgzZG9BTmdJQVFiemQyZ0JCdE4zYUFEWUNBRUhRM2RvQVFjVGQyZ0EyQWdCQnhOM2FBRUc4M2RvQU5nSUFRZGpkMmdCQnpOM2FBRFlDQUVITTNkb0FRY1RkMmdBMkFnQkI0TjNhQUVIVTNkb0FOZ0lBUWRUZDJnQkJ6TjNhQURZQ0FFSG8zZG9BUWR6ZDJnQTJBZ0JCM04zYUFFSFUzZG9BTmdJQVFhRGQyZ0JCQURZQ0FFSHczZG9BUWVUZDJnQTJBZ0JCNU4zYUFFSGMzZG9BTmdJQVFlemQyZ0JCNU4zYUFEWUNBRUg0M2RvQVFlemQyZ0EyQWdCQjlOM2FBRUhzM2RvQU5nSUFRWURlMmdCQjlOM2FBRFlDQUVIODNkb0FRZlRkMmdBMkFnQkJpTjdhQUVIODNkb0FOZ0lBUVlUZTJnQkIvTjNhQURZQ0FFR1EzdG9BUVlUZTJnQTJBZ0JCak43YUFFR0UzdG9BTmdJQVFaamUyZ0JCak43YUFEWUNBRUdVM3RvQVFZemUyZ0EyQWdCQm9ON2FBRUdVM3RvQU5nSUFRWnplMmdCQmxON2FBRFlDQUVHbzN0b0FRWnplMmdBMkFnQkJwTjdhQUVHYzN0b0FOZ0lBUWJEZTJnQkJwTjdhQURZQ0FFRzQzdG9BUWF6ZTJnQTJBZ0JCck43YUFFR2szdG9BTmdJQVFjRGUyZ0JCdE43YUFEWUNBRUcwM3RvQVFhemUyZ0EyQWdCQnlON2FBRUc4M3RvQU5nSUFRYnplMmdCQnRON2FBRFlDQUVIUTN0b0FRY1RlMmdBMkFnQkJ4TjdhQUVHODN0b0FOZ0lBUWRqZTJnQkJ6TjdhQURZQ0FFSE0zdG9BUWNUZTJnQTJBZ0JCNE43YUFFSFUzdG9BTmdJQVFkVGUyZ0JCek43YUFEWUNBRUhvM3RvQVFkemUyZ0EyQWdCQjNON2FBRUhVM3RvQU5nSUFRZkRlMmdCQjVON2FBRFlDQUVIazN0b0FRZHplMmdBMkFnQkIrTjdhQUVIczN0b0FOZ0lBUWV6ZTJnQkI1TjdhQURZQ0FFR0EzOW9BUWZUZTJnQTJBZ0JCOU43YUFFSHMzdG9BTmdJQVFZamYyZ0JCL043YUFEWUNBRUg4M3RvQVFmVGUyZ0EyQWdCQmtOL2FBRUdFMzlvQU5nSUFRWVRmMmdCQi9ON2FBRFlDQUVHWTM5b0FRWXpmMmdBMkFnQkJqTi9hQUVHRTM5b0FOZ0lBUWFEZjJnQkJsTi9hQURZQ0FFR1UzOW9BUVl6ZjJnQTJBZ0JCcU4vYUFFR2MzOW9BTmdJQVFaemYyZ0JCbE4vYUFEWUNBRUhBMzlvQUlBRTJBZ0JCcE4vYUFFR2MzOW9BTmdJQVFiamYyZ0FnQTBFb2F5SUFOZ0lBSUFFZ0FFRUJjallDQkNBQUlBRnFRU2cyQWdSQnpOL2FBRUdBZ0lBQk5nSUFEQWNMSUFJZ0JFa2dBU0FDVFhJTkFDQUFLQUlNUlEwREMwSFEzOW9BUWREZjJnQW9BZ0FpQUNBQklBQWdBVWtiTmdJQUlBRWdBMm9oQkVHVTNkb0FJUUFDUUFKQUEwQWdCQ0FBS0FJQUlnWkhCRUFnQUNnQ0NDSUFEUUVNQWdzTElBQW9BZ3hGRFFFTFFaVGQyZ0FoQUFOQUFrQWdBaUFBS0FJQUlnUlBCRUFnQWlBRUlBQW9BZ1JxSWdaSkRRRUxJQUFvQWdnaEFBd0JDd3RCd04vYUFDQUJOZ0lBUWJqZjJnQWdBMEVvYXlJQU5nSUFJQUVnQUVFQmNqWUNCQ0FBSUFGcVFTZzJBZ1JCek4vYUFFR0FnSUFCTmdJQUlBSWdCa0VnYTBGNGNVRUlheUlBSUFBZ0FrRVFha2tiSWdSQkd6WUNCRUdVM2RvQUtRSUFJUWtnQkVFUWFrR2MzZG9BS1FJQU53SUFJQVFnQ1RjQ0NFR1kzZG9BSUFNMkFnQkJsTjNhQUNBQk5nSUFRWnpkMmdBZ0JFRUlhallDQUVHZzNkb0FRUUEyQWdBZ0JFRWNhaUVBQTBBZ0FFRUhOZ0lBSUFCQkJHb2lBQ0FHU1EwQUN5QUNJQVJHRFFZZ0JDQUVLQUlFUVg1eE5nSUVJQUlnQkNBQ2F5SUFRUUZ5TmdJRUlBUWdBRFlDQUNBQVFZQUNUd1JBSUFJZ0FCRDdBUXdIQ3lBQVFmZ0JjVUdrM2RvQWFpRUJBbjlCck4vYUFDZ0NBQ0lFUVFFZ0FFRURkblFpQUhGRkJFQkJyTi9hQUNBQUlBUnlOZ0lBSUFFTUFRc2dBU2dDQ0FzaEFDQUJJQUkyQWdnZ0FDQUNOZ0lNSUFJZ0FUWUNEQ0FDSUFBMkFnZ01CZ3NnQUNBQk5nSUFJQUFnQUNnQ0JDQURhallDQkNBQklBVkJBM0kyQWdRZ0JrRVBha0Y0Y1VFSWF5SURJQUVnQldvaUJHc2hCU0FEUWNEZjJnQW9BZ0JHRFFNZ0EwRzgzOW9BS0FJQVJnMEVJQU1vQWdRaUFrRURjVUVCUmdSQUlBTWdBa0Y0Y1NJQUVNb0JJQUFnQldvaEJTQUFJQU5xSWdNb0FnUWhBZ3NnQXlBQ1FYNXhOZ0lFSUFRZ0JVRUJjallDQkNBRUlBVnFJQVUyQWdBZ0JVR0FBazhFUUNBRUlBVVErd0VNQ2dzZ0JVSDRBWEZCcE4zYUFHb2hBQUovUWF6ZjJnQW9BZ0FpQWtFQklBVkJBM1owSWdOeFJRUkFRYXpmMmdBZ0FpQURjallDQUNBQURBRUxJQUFvQWdnTElRVWdBQ0FFTmdJSUlBVWdCRFlDRENBRUlBQTJBZ3dnQkNBRk5nSUlEQWtMUWJqZjJnQWdBQ0FGYXlJQk5nSUFRY0RmMmdCQndOL2FBQ2dDQUNJQUlBVnFJZ0kyQWdBZ0FpQUJRUUZ5TmdJRUlBQWdCVUVEY2pZQ0JDQUFRUWhxSVFNTUJRdEJ2Ti9hQUNnQ0FDRUFBa0FnQVNBRmF5SUNRUTlOQkVCQnZOL2FBRUVBTmdJQVFiVGYyZ0JCQURZQ0FDQUFJQUZCQTNJMkFnUWdBQ0FCYWlJQklBRW9BZ1JCQVhJMkFnUU1BUXRCdE4vYUFDQUNOZ0lBUWJ6ZjJnQWdBQ0FGYWlJRU5nSUFJQVFnQWtFQmNqWUNCQ0FBSUFGcUlBSTJBZ0FnQUNBRlFRTnlOZ0lFQ3lBQVFRaHFEd3NnQUNBRElBWnFOZ0lFUWNEZjJnQkJ3Ti9hQUNnQ0FDSUFRUTlxUVhoeElnRkJDR3NpQWpZQ0FFRzQzOW9BUWJqZjJnQW9BZ0FnQTJvaUJDQUFJQUZyYWtFSWFpSUJOZ0lBSUFJZ0FVRUJjallDQkNBQUlBUnFRU2cyQWdSQnpOL2FBRUdBZ0lBQk5nSUFEQUlMUWNEZjJnQWdCRFlDQUVHNDM5b0FRYmpmMmdBb0FnQWdCV29pQURZQ0FDQUVJQUJCQVhJMkFnUU1CUXRCdk4vYUFDQUVOZ0lBUWJUZjJnQkJ0Ti9hQUNnQ0FDQUZhaUlBTmdJQUlBUWdBRUVCY2pZQ0JDQUFJQVJxSUFBMkFnQU1CQXRCQUNFRFFiamYyZ0FvQWdBaUFDQUZUUTBBUWJqZjJnQWdBQ0FGYXlJQk5nSUFRY0RmMmdCQndOL2FBQ2dDQUNJQUlBVnFJZ0kyQWdBZ0FpQUJRUUZ5TmdJRUlBQWdCVUVEY2pZQ0JDQUFRUWhxRHdzZ0F3OExRYkRmMmdCQnNOL2FBQ2dDQUVGK0lBSW9BaHgzY1RZQ0FBc0NRQ0FEUVJCUEJFQWdBaUFGUVFOeU5nSUVJQUlnQldvaUFTQURRUUZ5TmdJRUlBRWdBMm9nQXpZQ0FDQURRWUFDVHdSQUlBRWdBeEQ3QVF3Q0N5QURRZmdCY1VHazNkb0FhaUVBQW45QnJOL2FBQ2dDQUNJRVFRRWdBMEVEZG5RaUEzRkZCRUJCck4vYUFDQURJQVJ5TmdJQUlBQU1BUXNnQUNnQ0NBc2hBeUFBSUFFMkFnZ2dBeUFCTmdJTUlBRWdBRFlDRENBQklBTTJBZ2dNQVFzZ0FpQURJQVZxSWdCQkEzSTJBZ1FnQUNBQ2FpSUFJQUFvQWdSQkFYSTJBZ1FMSUFKQkNHb1BDeUFCUVFocUMrZ1lBaE4vQTM0akFFSEFCbXNpQlNRQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQktRTUFJaGhRUlFSQUlBRXBBd2dpR1ZBTkFTQUJLUU1RSWhwUURRSWdHQ0FhZkNBWVZBMERJQmdnR1ZRTkJDQUJMZ0VZSVFFZ0JTQVlQZ0lNSUFWQkFVRUNJQmhDZ0lDQWdCQlVJZ2NiTmdLc0FTQUZRUUFnR0VJZ2lLY2dCeHMyQWhBZ0JVRVVha0VBUVpnQi9Bc0FJQVZCdEFGcVFRQkJuQUg4Q3dBZ0JVRUJOZ0t3QVNBRlFRRTJBdEFDSUFHc0lCaENBWDE1ZlVMQ21zSG9CSDVDZ0tITm9MUUNmRUlnaUtjaUI4RWhEUUpBSUFGQkFFNEVRQ0FGUVF4cUlBRVFTeG9NQVFzZ0JVR3dBV3BCQUNBQmE4RVFTeG9MQWtBZ0RVRUFTQVJBSUFWQkRHcEJBQ0FOYTBILy93TnhFR2dNQVFzZ0JVR3dBV29nQjBILy93RnhFR2dMSUFWQm5BVnFJQVZCc0FGcVFhUUIvQW9BQUNBRlFaZ0ZhaUVISUFNaENRTkFJQVVvQXJ3R0lnRkJLVThORUNBQkJFQWdBVUVDZENFQlFnQWhHQU5BSUFFZ0Iyb2lCaUFHTlFJQUlCaENJSWFFSWhoQ2dKVHIzQU9BSWhrK0FnQWdHQ0FaUW9DVTY5d0RmbjBoR0NBQlFRUnJJZ0VOQUFzTElBbEJDV3NpQ1VFSlN3MEFDeUFKUVFKMFFlemV3QUJxS0FJQVFRRjBJZ2RGRFFVZ0JTZ0N2QVlpQVVFcFR3MFBJQUVFZnlBQlFRSjBJUUVnQlVHWUJXb2hCaUFIclNFWVFnQWhHUU5BSUFFZ0Jtb2lCeUFITlFJQUlCbENJSWFFSWhrZ0dJQWlHajRDQUNBWklCZ2dHbjU5SVJrZ0FVRUVheUlCRFFBTElBVW9BcndHQlVFQUN5RUJBa0FDUUNBRktBS3NBU0lHSUFFZ0FTQUdTUnNpQ0VFb1RRUkFJQWdOQVVFQUlRZ01BZ3NNRUF0QkFDRUpJQVZCREdvaENpQUZRWndGYWlFQklBZ2hCd05BSUFFZ0FTZ0NBQ0lPSUFvb0FnQnFJZ3NnQ1VFQmNXb2lDVFlDQUNBTElBNUpJQWtnQzBseUlRa2dBVUVFYWlFQklBcEJCR29oQ2lBSFFRRnJJZ2NOQUFzZ0NVVU5BQ0FJUVNoR0RSRWdCVUdjQldvZ0NFRUNkR3BCQVRZQ0FDQUlRUUZxSVFnTElBVWdDRFlDdkFZZ0JTZ0MwQUlpRENBSUlBZ2dERWtiSWdGQktVOE5EeUFCUVFKMElRRUNRQUpBQTBBZ0FVVU5BU0FCUVFScklnRWdCVUdjQldwcUtBSUFJZ2NnQVNBRlFiQUJhbW9vQWdBaUNFWU5BQXNnQnlBSVR3MEJEQWdMSUFWQnNBRnFJZ2dnQVNBSWFrY05Cd3NnRFVFQmFpRU5EQWNMUWQvZ3dBQkJIRUdvNDhBQUVKd0dBQXRCak9IQUFFRWRRYmpqd0FBUW5BWUFDMEc4NGNBQVFSeEJ5T1BBQUJDY0JnQUxRZURpd0FCQk5rRzQ1TUFBRUp3R0FBdEJtT0xBQUVFM1Fhamt3QUFRbkFZQUMwSGJqY0VBUVJ0QmxJM0JBQkNjQmdBTElBWkZCRUJCQUNFR0lBVkJBRFlDckFFTUFRc2dCa0VDZENJS0lBVkJER29pQVdvaEIwSUFJUmdEUUNBQklBRTFBZ0JDQ240Z0dId2lHVDRDQUNBQlFRUnFJUUVnR1VJZ2lDRVlJQXBCQkdzaUNnMEFDeUFaUW9DQWdJQVFXZ1JBSUFaQktFWU5DaUFISUJnK0FnQWdCa0VCYWlFR0N5QUZJQVkyQXF3QkMwRUFJUWRCQVNFSUlBM0JJZ0VnQk1FaUMwZ2lGZzBFSUEwZ0JHdkJJQU1nQVNBTGF5QURTUnNpRGtVTkJFRUFJZ0ZGQkVBZ0JVSFVBbW9nQlVHd0FXcEJwQUg4Q2dBQUN5QUZRZFFDYWtFQkVFc2hFQ0FCUlFSQUlBVkIrQU5xSUFWQnNBRnFRYVFCL0FvQUFBc2dCVUg0QTJwQkFoQkxJUkVnQVVVRVFDQUZRWndGYWlBRlFiQUJha0drQWZ3S0FBQUxJQVZCQ0dvaEZ5QUZRWndGYWtFREVFc2hFaUFRS0FLZ0FTRVRJQkVvQXFBQklSUWdFaWdDb0FFaEZVRUFJUVFnQlNnQ3JBRWhCaUFGS0FMUUFpRU1Ba0FEUUNBR1FTbFBEUUlnQmtFQ2RDRUhRUUFoQVFKL0FrQUNRQU5BSUFFZ0IwWU5BU0FGUVF4cUlBRnFJQUZCQkdvaEFTZ0NBRVVOQUFzZ0ZTQUdJQVlnRlVrYklnaEJLVThOQ3lBSVFRSjBJUUVDUUFOQUlBRkZEUUVnQVVFRWF5SUJJQVZCREdwcUtBSUFJZ2NnQVNBRlFad0ZhbW9vQWdBaUMwWU5BQXNnQnlBTFR3MENRUUFNQXdzZ0VpQUZRWndGYWlBQmFrWU5BVUVBREFJTElBTWdEa2tOQlFKQUlBUWdEa1lOQUNBT0lBUnJJZ0ZGRFFBZ0FpQUVha0V3SUFIOEN3QUxJQUFnRFRzQkNDQUFJQTQyQWdRTUNRdEJBU0VKSUFWQm5BVnFJUW9nQlVFTWFpRUJJQWdoQndOQUlBRWdBU2dDQUNJTElBb29BZ0JCZjNOcUlnWWdDVUVCY1dvaUNUWUNBQ0FHSUF0SklBWWdDVXR5SVFrZ0FVRUVhaUVCSUFwQkJHb2hDaUFIUVFGcklnY05BQXNnQ1VVTkRDQUZJQWcyQXF3QklBZ2hCa0VJQ3lFUElCUWdCaUFHSUJSSkd5SUlRU2xQRFFnZ0NFRUNkQ0VCQWtBQ1FBSkFBMEFnQVVVTkFTQUJRUVJySWdFZ0JVRU1hbW9vQWdBaUJ5QUJJQVZCK0FOcWFpZ0NBQ0lMUmcwQUN5QUhJQXRQRFFFZ0JpRUlEQUlMSUJFZ0JVSDRBMm9nQVdwR0RRQWdCaUVJREFFTElBZ0VRRUVCSVFrZ0JVSDRBMm9oQ2lBRlFReHFJUUVnQ0NFSEEwQWdBU0FCS0FJQUlnc2dDaWdDQUVGL2Myb2lCaUFKUVFGeGFpSUpOZ0lBSUFZZ0Mwa2dCaUFKUzNJaENTQUJRUVJxSVFFZ0NrRUVhaUVLSUFkQkFXc2lCdzBBQ3lBSlJRME5DeUFGSUFnMkFxd0JJQTlCQkhJaER3c2dFeUFJSUFnZ0Uwa2JJZ3RCS1U4TkJDQUxRUUowSVFFQ1FBSkFBa0FEUUNBQlJRMEJJQUZCQkdzaUFTQUZRUXhxYWlnQ0FDSUhJQUVnQlVIVUFtcHFLQUlBSWdaR0RRQUxJQVlnQjAwTkFTQUlJUXNNQWdzZ0VDQUZRZFFDYWlBQmFrWU5BQ0FJSVFzTUFRc2dDd1JBUVFFaENTQUZRZFFDYWlFS0lBVkJER29oQVNBTElRY0RRQ0FCSUFFb0FnQWlDQ0FLS0FJQVFYOXphaUlHSUFsQkFYRnFJZ2syQWdBZ0JpQUlTU0FHSUFsTGNpRUpJQUZCQkdvaEFTQUtRUVJxSVFvZ0IwRUJheUlIRFFBTElBbEZEUTBMSUFVZ0N6WUNyQUVnRDBFQ2FpRVBDeUFNSUFzZ0N5QU1TUnNpQmtFcFR3MEZJQVpCQW5RaEFRSkFBa0FDUUFOQUlBRkZEUUVnQVNBWGFpZ0NBQ0lISUFGQkJHc2lBU0FGUWJBQmFtb29BZ0FpQ0VZTkFBc2dCeUFJVHcwQklBc2hCZ3dDQ3lBRlFiQUJhaUlJSUFFZ0NHcEdEUUFnQ3lFR0RBRUxJQVlFUUVFQklRa2dCVUd3QVdvaENpQUZRUXhxSVFFZ0JpRUhBMEFnQVNBQktBSUFJZ3NnQ2lnQ0FFRi9jMm9pQ0NBSlFRRnhhaUlKTmdJQUlBZ2dDMGtnQ0NBSlMzSWhDU0FCUVFScUlRRWdDa0VFYWlFS0lBZEJBV3NpQncwQUN5QUpSUTBOQ3lBRklBWTJBcXdCSUE5QkFXb2hEd3NnQXlBRVRRMEJJQUlnQkdvZ0QwRXdham9BQUFKQUlBWkZCRUJCQUNFR0RBRUxJQVpCQW5RaUNpQUZRUXhxSWdGcVFnQWhHQU5BSUFFZ0FUVUNBRUlLZmlBWWZDSVpQZ0lBSUFGQkJHb2hBU0FaUWlDSUlSZ2dDa0VFYXlJS0RRQUxJQmxDZ0lDQWdCQlVEUUFnQmtFb1JnMExJQmcrQWdBZ0JrRUJhaUVHQ3lBRklBWTJBcXdCSUFSQkFXb2lCQ0FPUncwQUMwRUFJUWdnRGlFSERBVUxJQVFnQTBHSTVNQUFFTVlFQUFzZ0JrRW9RWlNOd1FBUXVBa0FDeUFPSUFOQm1PVEFBQkM0Q1FBTElBdEJLRUdVamNFQUVMZ0pBQXNnQmtFb1FaU053UUFRdUFrQUN3SkFBbjhDUUFKQUlBeEJLVWtFUUFKQUlBeEZCRUJCQUNFTURBRUxJQXhCQW5RaUNpQUZRYkFCYWlJQmFrSUFJUmdEUUNBQklBRTFBZ0JDQlg0Z0dId2lHVDRDQUNBQlFRUnFJUUVnR1VJZ2lDRVlJQXBCQkdzaUNnMEFDeUFaUW9DQWdJQVFWQTBBSUF4QktFWU5DU0FZUGdJQUlBeEJBV29oREFzZ0JTQU1OZ0xRQWlBTUlBWWdCaUFNU1JzaUFVRXBUdzBISUFGQkFuUWhBU0FGUVFocUlRc0NRQUovQWtBRFFDQUJSUTBCSUFFZ0Myb29BZ0FpQkNBQlFRUnJJZ0VnQlVHd0FXcHFLQUlBSWdaR0RRQUxJQVFnQmtzZ0JDQUdTV3NNQVF0QmYwRUFJQVZCc0FGcUlnUWdBU0FFYWtjYkMwSC9BWEVPQWdBQ0F3dEJBQ0FJRFFNYUlBTWdCMEVCYXlJQlN3UkFJQUVnQW1vdEFBQkJBWEVOQWd3REN5QUJJQU5CMk9QQUFCREdCQUFMSUF4QktFR1VqY0VBRUxnSkFBc2dBeUFIVHdSQUlBSWdCMnBCZnlFS0lBY2hBUUpBQTBBZ0FTSUVSUTBCSUFwQkFXb2hDaUFCUVFGcklnRWdBbW9pQmkwQUFFRTVSZzBBQ3lBR0lBWXRBQUJCQVdvNkFBQWdDa1VnQkNBSFQzSU5BaUFDSUFScVFUQWdDdndMQUF3Q0N3SkFJQWdFUUVFeElRRU1BUXNnQWtFeE9nQUFJQWRCQVVZRVFFRXdJUUVNQVF0Qk1DRUJJQWRCQVdzaUJFVU5BQ0FDUVFGcVFUQWdCUHdMQUFzZ0RVRUJhaUVOSUJZZ0F5QUhUWElOQVNBQk9nQUFJQWRCQVdvaEJ3d0JDeUFISUFOQjZPUEFBQkM0Q1FBTElBTWdCMGtOQVNBSEN5RUJJQUFnRFRzQkNDQUFJQUUyQWdRTUFRc2dCeUFEUWZqandBQVF1QWtBQ3lBQUlBSTJBZ0FnQlVIQUJtb2tBQThMSUFoQktFR1VqY0VBRUxnSkFBc2dBVUVvUVpTTndRQVF1QWtBQzBFb1FTaEJsSTNCQUJER0JBQUxRYVNOd1FCQkdrR1VqY0VBRUp3R0FBdVpMZ0lxZndOK0l3QkJvS1FCYXlJQ0pBQWdBa0hJMGdCcUlBRkJDR3BCbmRYSkFFRUxFTThCQWtBZ0FpZ0N5RkpCbjRDQWdIaEhCRUFnQWtHWUFXb2dBa0hZMGdCcUtBSUFOZ0lBSUFKQmtBRnFJQUpCME5JQWFpa0NBRGNEQUNBQ0lBSXBBc2hTTndPSUFRd0JDeUFDUVlnQmFpQUNLQUxNVWhEWkJBc0NmeUFDS0FLSUFVR2ZnSUNBZUVZRVFDQUNLQUtNQVF3QkN5QUNRWWdCYWhDbkEwRUFDeUVaSUFKQnlOSUFhaUFCRUdvZ0FpZ0MxRkloQXlBQ0tBTFFVaUVXSUFJb0FzeFNJUndDUUNBQ0tBTElVaUlJUVorQWdJQjRSd1JBSUFBZ0FpZ0MyRkkyQWhBZ0FDQUROZ0lNSUFBZ0ZqWUNDQ0FBSUJ3MkFnUWdBQ0FJTmdJQURBRUxJQllnQTBFRGRHb2hKaUFDUWNpaEFXb2hKeUFDUWVBQWFpRWlJQUpCakFGcUlTZ2dBU2dDUUNFSUlBRW9BandoQVVFQUlRTkJBU0VhSUJZaEZ3Si9BMEFDUUFKQUFuOENRQUpBQWtBQ1FBSkFBa0FnRnlBbVJ3UkFJQmNvQWdBaEF5QVhLQUlFUVFsckRnVURDUUVKQWdrTElCWWdIQkQ0Q1NBQUlBTTJBZ3dnQUNBYU5nSUlJQUFnSFRZQ0JDQUFRWitBZ0lCNE5nSUFEQXNMSUFNdEFBQkJ4Z0JIRFFjZ0F5MEFBVUhzQUVjTkJ5QURMUUFDUWVFQVJ3MEhJQU10QUFOQjlBQkhEUWNnQXkwQUJFSGxBRWNOQnlBRExRQUZRY1FBUncwSElBTXRBQVpCNVFCSERRY2dBeTBBQjBIakFFY05CeUFETFFBSVFlOEFSdzBISUFNdEFBbEI1QUJIRFFjZ0F5MEFDa0hsQUVjTkJ5QUNRUmhxSUFoQkFYUkJnTkhKQUJDZkJTQUNRUUEyQWtRZ0FpQUNLQUljTmdKQUlBSWdBaWdDR0NJTE5nSThJQUpCL0FCcUlnTkJnSUFDUWJER3lRQVE1Z1FnQWtFUWFpQURRYXlseVFBUXhRUkJnT0RhQUMwQUFCb2dBaWdDRkNFR0lBSW9BaEFoQjBHUTBnSVFGaUlEQkVBZ0owRUFRY0FDL0FzQUlBSkJ5TklBYWlJTVFRQkJnTThBL0FzQUlBSkJpQUZxSUF4QndORUEvQW9BQUNBRFFRQkJpSUFDL0FzQUlBTkJpSUFDYWlBQ1FZZ0Jha0hBMFFEOENnQUFJQU5CeU5FQ2FrRUFRY0VBL0FzQUlBTkJBVHNCanRJQ0lBTkJBVG9Bak5JQ0lDSkNBRGNEQUNBRFFRQTZBSTNTQWlBaVFRaHFRZ0EzQXdBZ0FpQUROZ0p3SUFKQ0FEY0RXQ0FDSUFZMkFsUWdBaUFITmdKUUlBSWdDRFlDVENBQ0lBRTJBa2dnQ0VVTkJVRUFJUUZCQUNFRUlBc2lCa0VmVFFSQUlBSkJ5TklBYWlBQ1FjZ0FhaUFDUVR4cUVJMERBbjhnQWkwQXlGSkJCRVlFUUNBQ0tBTE1VZ3dCQ3lBQ0tRUElVaUl0UWlDSUlTd2dMVUwvQVlOQ0JGSU5CU0FzcHd0RkRRVWdBaWdDUkNFRUlBSW9BandoQmd0QmdNQUFJUWNEUUNBRUlBWkhJQVlnQzBkeVJRUkFJQUpCeU5JQWFpQUNRY2dBYWlBQ1FUeHFFSTBEQW44Z0FpMEF5RkpCQkVZRVFDQUNLQUxNVWd3QkN5QUNLUVBJVWlJdFFpQ0lJU3dnTFVML0FZTkNCRklOQmlBc3B3dEZEUVlnQWlnQ1JDRUVJQUlvQWp3aEJnc2dCQ0FHUmdSQUlBSkJDR29nQWtFOGFpQUdRU0FReUFRZ0FpZ0NDRUdCZ0lDQWVFY0VRRUlCSVMxQ0FDRXNEQVlMSUFJb0FrUWhCQ0FDS0FJOElRWUxJQWNnQmlBRWF5SU1JQWNnREVrYklRZ2dBaWdDUUNBRWFpRURBMEFnQ0NBQmF5SVNCRUFnQVNBRGFrRUFJQkw4Q3dBTElBSkJ5TklBYWlBQ1FjZ0FhaUFESUFnUVNRSkFBa0FDZnlBQ0xRRElVa0VFUmdSQUlBSW9Bc3hTSWdNZ0NFc05BaUFDUVFRNkFJZ0JRUUVNQVFzZ0FpQUNLUVBJVWlJc1FpQ0lweUlTTmdLTUFTQUNJQ3luSWdFNkFJZ0JJQUlnQVVFWWRqb0Fpd0VnQWlBQlFRaDJPd0NKQVNBQlFmOEJjVUVFUmdSQVFRQWhBMEVCREFFTElBSkJpQUZxRUxvR0RRSkJBQ0VEUVFBTElRRWdBaUFESUFScUlnUTJBa1FDUUNBQlJRUkFJQUlwQTRnQklpMUMvd0dEUWdSU0RRRUxJQU5GRFFrZ0NDQURheUVCUVg4Z0IwRUJkQ0FIUVFCSUd5QUhJQWNnREUwYklBY2dBeUFJUmhzaEJ3d0VDeUF0UWlDSUlTd01Cd3RCd01ySkFFRXBRYnpMeVFBUW5BWUFDeUFDS0FLSUFTQVNFS2NGSUFnaEFRd0FDd0FMQUFzQUN5QURMUUFBUWNFQVJ3MEdJQU10QUFGQjB3QkhEUVlnQXkwQUFrSERBRWNOQmlBRExRQURRY2tBUncwR0lBTXRBQVJCeVFCSERRWWdBeTBBQlVFNFJ3MEdJQU10QUFaQk5VY05CaUFETFFBSFFjUUFSdzBHSUFNdEFBaEI1UUJIRFFZZ0F5MEFDVUhqQUVjTkJpQURMUUFLUWU4QVJ3MEdJQU10QUF0QjVBQkhEUVlnQXkwQURFSGxBRWNOQmlBQ1FRQTJBdEJTSUFKQ2dJQ0FnQkEzQXNoU0FrQWdDRUVDVHdSQUlBRWdDRUVDYXlJRGFpOEFBRUgrL0FCR0RRRUxJQWdoQXdzZ0FTQURhaUVMQWtBQ1FBSkFBa0FDUUFOQVFRQWhCa0VBSVFRQ1FBTkFJQUVnQzBZTkFTQUJRUUZxSVFNZ0FTMEFBQ0lJUVFscklnZEJGMDBFUUNBRElRRkJBU0FIZEVHYmdJQUVjUTBCQ3lBSVFmb0FSZ1JBSUFZRVFFRXpJUUZCbE5ISkFDRUlEQWtMSUFKQnlOSUFha0dRMGNrQVFaVFJ5UUFReUFZZ0F5RUJEQUVMSUFoQklXdEIvd0Z4SWdGQjFBQkxEUUVnQksxQzFRQitJaXhDSUlpbkRRTWdMS2NnQVdvaEJDQURJUUVnQmtFQmFpSUdRUVZIRFFBTElBSWdCRUVZZENBRVFZRCtBM0ZCQ0hSeUlBUkJDSFpCZ1A0RGNTQUVRUmgyY25JMkFvZ0JJQUpCeU5JQWFpQUNRWWdCYWlBb0VNZ0dEQUVMQ3lBR1JRMENRUVVnQm1zaUFVRUFJQUZCQlUwYklRRURRQ0FCUlEwQ0lBU3RRdFVBZmlJc1FpQ0lwdzBCSUFGQkFXc2hBU0FzcDBIVUFHb2hCQXdBQ3dBTFFSY2hBVUhZMGNrQUlRZ01Bd3NnQWlBRVFSaDBJQVJCZ1A0RGNVRUlkSElnQkVFSWRrR0EvZ054SUFSQkdIWnljallDaUFFZ0JrRUJheUlCUVFWUERRRWdBa0hJMGdCcUlBSkJpQUZxSUFFUWx3a0xJQUlvQXN4U0lRRWdBaWdDeUZJaENDQUNLQUxRVWlJZUlRTU1Cd3NnQVVFRVFjalJ5UUFRdUFrQUN5QUNLQUxJVWlBQ0tBTE1VaENwQ1NBQUlBRTJBZ2dnQUNBSU5nSUVJQUJCaFlDQWdIZzJBZ0JCREF3SUN5QURMUUFBUWN3QVJ3MEZJQU10QUFGQjJnQkhEUVVnQXkwQUFrSFhBRWNOQlNBRExRQURRY1FBUncwRklBTXRBQVJCNVFCSERRVWdBeTBBQlVIakFFY05CU0FETFFBR1FlOEFSdzBGSUFNdEFBZEI1QUJIRFFVZ0F5MEFDRUhsQUVjTkJRSkFBa0FnR1VVTkFDQUNRY2pTQUdvaUF5QVpRZlhReVFCQkN4RFBBU0FDS0FMSVVrR2ZnSUNBZUVjRVFDQURFTm9JREFFTElBSkJ5TklBYWlJRElBSW9Bc3hTSWdZb0FnQWdCa0VJYWlrREFCQzhCQ0FDS0FMSVVrRUJSZ1JBSUFNUXhnZ01BUXNnQWlrRDBGSkNBRklOQUNBQ1FjalNBR29pQXhDK0FoQzNDQ0lFSUFOQjBBRDhDZ0FBREFFTElBSkJ5TklBYWlJREVMNENFTGNJSWdRZ0EwSFFBUHdLQUFBZ0JFRUJPZ0JIQ3lBQ1FRQTJBb1FCSUFKQ2dJQ0FnQkEzQW53Z0FrSEkwZ0JxUVlDQWdBaEJsTEhKQUJEbUJFR0JnSUNBZUNBYkVONElJQUlvQXRCU0loRUVRQ0FDS0FMTVVpRWJJQUlvQXNoU0FuOENRQU5BSUFKQktHb2hHQ0FiSVJOQkFDRURRUUFoRFVFQUlRNUJBQ0VIUVFBaERFSUFJUzBqQUVIZ0FXc2lCU1FBSUFVZ0NEWUNmQ0FGSUFFMkFuZ0NRQUovQWtBQ1FBSkFBa0FnQkMwQVJrVUVRQ0FFS1FNWUlTd2dCRUVBT3dFWUFuNGdMS2RCQVhFRVFDQXNRakNJcHlFSElDeENJSWluSVF3Z0xFSVFpS2NoQXlBc1FvQ0FnSUNBZ0lDQWY0TU1BUXNnQkVFd2FpRUdJQVF0QURzZ0JDMEFPa2tFUUNBR0lBVkIrQUJxRU9JQkN5QUZRZkFBYWlBR0VOTUVRUUVoRHlBRkx3RndRUUZ4UlEwRVFRTWhEeUFGTHdGeUlnTWdCQzhCUUU4TkJDQURJQVF2QVVKR0RRSWdCQzhCUkNBRFFmLy9BM0ZHRFFNQ2Z5QUVLQUlJQkVBZ0JFRWdhaUFFSUFNUTNBTWFJQVFvQWdRZ0JDZ0NDQ0FERUwwSElnWXRBQUloQnlBR0x3RUFEQUVMSUFRdEFFaEJBVWNOQlNBRUVLUUdJQVJCSUdvZ0JDQURFTndER2lBRUtBSUVJQVFvQWdnZ0F4QzlCeUlHTFFBQ0lRY2dCaThCQUFzaERFSUFDeUV0SUFWQjZBQnFJQVJCSUdvUWt3VWdCU2dDYUNFTEFrQUNRQ0FSSUFVb0Ftd2lCazhFUUVJQklTd2dCZzBCUVFFaER3d0hDMElCSVN3Z0VRMEJRUUVoRDBFQURBY0xJQVZCNEFCcUlBWWdFeUFSUWJ6TjJnQVF3d2NnQlNnQ1lDQUZLQUprSUFzZ0JrSE16ZG9BRUt3SElBUWdCQ2dDS0NBR2FqWUNLQ0FGUWRnQWFpQUdJQk1nRVVIY3pkb0FFSjhIUVFBaER5QUZLQUpZSVJNZ0JTZ0NYQXdHQ3lBVElCRWdDeUFSUWV6TjJnQVFyQWNnQkNBRUtBSW9JQkZxTmdJb1FRRWhFMEVBSVE5QkFBd0ZDeUFZUVFJNkFBZ2dHRUlBTndJQURBVUxJQVFRcEFaQkFDRVBEQUVMSUFSQkFUb0FSa0VDSVE4TFFnQWhMQXNnRVFzaEZDQUZRWWdCYWtFQU5nSUFJQVZDQURjRGdBRWdCVUdZQVdvaUtrRUFOZ0lBSUFWQ0FEY0RrQUVnQlVJQk53TElBU0FGUWdFM0FzQUJJQVZDQVRjQ3VBRWdCVUlCTndLd0FTQUZRZ0UzQXFnQklBVkNBVGNDb0FFZ0JFRXdhaUVqSUFSQklHb2hIeUFGUVk0QmFpRWtJQVZCL2dCcUlTc0NRQU5BSUF5dFF2Ly9BNE5DSUlZZ0I2MUMvd0dEUWpDR2hDQURJZ2F0UXYvL0E0TkNFSWFFSVM0Q1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBTkFJQ3hRQkVCQ0FDRXNJQVloQXd3TEN5QXNJQzZFSWl4Q01JaW5JUklnTEVJZ2lLY2hJQ0FzUWhDSXB5RUxBa0FDUUFKQUFrQWdGQTBBSUFWQjBBQnFJQjhRa3dVZ0JTZ0NWRVVOQUVFQUlSUU1BUXNnSXlBRlFmZ0FhaERpQVVFQUlSQWdLaUVEUVFBaENnSkFBMEFnRUVFTVJnUkFRUVloQ2d3RkN5QUZRY2dBYWlBakVOTUVJQVV2QVVoQkFYRkZEUUVnQlVHQUFXb2dFR29pQ1NBRkx3RktPd0VBSUJBRVFDQUZRZEFCYWlBVElCUWdFQ0FrYWk4QkFFSDh6ZG9BRU5RRUlBVW9BdHdCSVJRZ0JTZ0MyQUVoRXlBRElBVXBBdEFCTndJQUN5QUVMd0ZBSWhVZ0NrSC8vd054YWlJaFFmLy9BM0VnSVVjTkFRSkFJQW9nRldwQi8vOERjU0FFTHdFNElBUXRBRWRyUWYvL0EzRkdEUUFnRlNBSkx3RUFJZ2xORFFBZ0NTQUVMd0ZDUmcwQUlBa2dCQzhCUkVZTkFDQVVJQVFvQWhBZ0JDZ0NGQ0FKUVl6TzJnQVE1Z2N2QVFBaUNVa05BQ0FRSUNScVFRSnFJQWs3QVFBZ0NrRUJhaUVLSUJCQkFtb2hFQ0FEUVFocUlRTU1BUXNMSUFwQkFXb2hDZ3dDQ3lBS0RRRUxRZ0VoTENBU0lRY2dJQ0VNSUFzaEF3d01DeUFLUVFkUERRTUxJQ3NnQ2tFQmRHb2lDVVVOQXlBSkx3RUFJUU1nQlVGQWF5QUZRYUFCYWlBS1FRRnJJaUZCdk03YUFCRGRCeUFGS0FKRUlnb2dDU0FGUVlBQmFpSVZhMEVCZGlJSklBa2dDa3NiSVFvZ0JTZ0NRQ0VRQTBBZ0NnUkFJQVZCT0dvZ0JDQUVLQUlFSUFRb0FnZ2dGUzhCQUNJSklCQW9BZ0FnRUVFRWFpZ0NBQkNhQkNBTEVKb0dJQVV0QURvaEVpQUZMd0U0SVNBZ0JDQUVMd0ZBUVFGcU93RkFJQXBCQVdzaENpQVFRUWhxSVJBZ0ZVRUNhaUVWSUFraEN3d0JDd3NnQlVFd2FpQUZRYUFCYWlBaFFjek8yZ0FRM1FjQ1FDQUZLQUkwSWdsRkRRQWdCU2dDTUNBSlFRTjBhaUlLUVFocklnbEZEUUFnQ1NnQ0FDRU5JQWxCQVRZQ0FDQUtRUVJySWdrb0FnQWhEaUFKUVFBMkFnQUxBa0FnQkM4QlFpQURSd1JBSUFNZ0JDOEJSRVlOQVNBRElBUXZBVUFpQ1UwTkEwSUFJU3hCQXlFUERBNExJQVFnQkMwQVNTSURRUUZxSWdzNkFEb2dCRUVCSUFOQkQzRjBRUUpxSWdNN0FVQWdCRUYvSUF0QkQzRjBRWDl6T3dFNElBTkIvLzhEY1NJRElBUW9BZ2hOQkVBZ0JDQUROZ0lJQzBJQUlTeEJBQ0VOSUFRb0FoUWdBMGtOQVNBRUlBTTJBaFFNQVFzTElBUkJBVG9BUmtJQUlTeEJBaUVQREFzTElBUW9BaFFoQmlBRUtBSVFJUWNnRkFKL0lBTWdDVWNFUUNBSElBWWdBMEhjenRvQUVPWUhMd0VBREFFTElBY2dCaUFMUWYvL0EzRkI3TTdhQUJEbUJ5OEJBRUVCYWd0Qi8vOERjU0lHU1NJSlJRUkFJQVZCMEFGcUlCTWdGQ0FHUWZ6TzJnQVExQVFnQlNnQzNBRWhGQ0FGS0FMWUFTRVRJQVVvQXRRQklRWWdCU2dDMEFFaERBSkFJQVF2QVVBZ0EwY0VRQ0FFS0FJRUlBUW9BZ2dnQXlBTUlBWVFtZ1FoQnd3QkN5QU5SUVJBSUFRb0Fpd2lEaUFFS0FJa0lnZExEUVVnSHlnQ0FDRU5DeUFPUlEwRklBMHRBQUFoQnlBRlFTaHFJQTRnRENBR1FhelAyZ0FRd3djZ0JTZ0NLQ0FGS0FJc0lBMGdEa0c4ejlvQUVLd0hJQTB0QUFBaERTQUZRU0JxSUE0Z0RDQUdRY3pQMmdBUW53Y2dCU2dDSkVVTkJpQUZLQUlnSUEwNkFBQUxJQXdoRFNBR0lRNE1DQXNnQkM4QlFDQURSd1JBUVFBaERTQWZJQVFnQXhEY0F5RUhEQWdMSUEwRVFDQUZRUmhxSUE0Z0JDZ0NJQ0FFS0FJa1FlelAyZ0FRd3djZ0JTZ0NHQ0FGS0FJY0lBMGdEa0g4ejlvQUVLd0hJQVFnRGpZQ0tDQUVJQTQyQWl3TElBUW9BaVFpQjBVTkJTQUVLQUlzSWdZZ0IwOE5CaUFFS0FJZ0lRZEJBQ0VOSUFSQkFEWUNLQ0FFSUFaQkFXbzJBaXdnQmlBSGFpQUhMUUFBSWdjNkFBQU1Cd3NnQ2tFR1Faek8yZ0FRdUFrQUMwR3N6dG9BRUxzSkFBc2dEaUFIUVl6UDJnQVF1QWtBQzBFQVFRQkJuTS9hQUJER0JBQUxRUUJCQUVIY3o5b0FFTVlFQUF0QkFFRUFRWnpSMmdBUXhnUUFDeUFHSUFkQnJOSGFBQkRHQkFBTEFrQUNRQ0FFS0FJSVFmOGZUUVJBSUFWQkVHb2dCQ0FISUFzUW1nWWdCUzBBRWlFSElBVXZBUkFoRENBRUx3RkFJZ1lnQkM4Qk9DSUxJQVF0QUVkclFmLy9BM0ZIRFFFZ0JDMEFPaUlTUVF4UERRRWdCQ0FTUVFGcU9nQTZJQVFnQzBFQmRFRUJjanNCT0F3QkN5QWdJUXdnRWlFSERBRUxJQVFnQmtFQmFqc0JRQXRDQVNFc0lBbEZEUUVMQ3lBTkJFQWdCVUVJYWlBT0lBUW9BaUFnQkNnQ0pFR00wTm9BRU1NSElBVW9BZ2dnQlNnQ0RDQU5JQTVCbk5EYUFCQ3NCeUFFSUE0MkFpZ2dCQ0FPTmdJc0N5QURJUVlMSUJnZ0VTQVVhellDQkNBWUlBZ2dCU2dDZkNJRGF6WUNBQ0FZSUE5QkFDQURJQWhQR3lBUElBOUJBVVliT2dBSUlBUWdCNjFDL3dHRFFqQ0dJQzJFSUF5dFF2Ly9BNE5DSUlhRUlBYXRRdi8vQTROQ0VJYUVJQ3lFTndNWUN5QUZRZUFCYWlRQUlBSW9BaXdoQmlBQ1FTQnFJQUlvQWlnZ0FTQUlRZUNqeVFBUW53Y2dBaWdDSkNFSUlBSW9BaUFoQVFKQUFrQUNRQ0FDTFFBd0lnTkJBMGNOQUNBQ1FRRTJBc3hTSUFKQmhJL1NBRFlDeUZJZ0FrSUJOd0xVVWlBQ1FRZzJBa0FnQWlBQ1FUeHFOZ0xRVWlBQ0lBSkJuNlFCYWpZQ1BDQUNRY2dBYWlBQ1FjalNBR29RcndVZ0FrR1FwQUZxUVJVZ0FpZ0NUQ0lESUFJb0FsQVEyQU1nQWlnQ1NDQURFS2tKSUFJdEFKQ2tBVUVFUmdSQUlBSXRBSkdrQVNFRERBRUxJQUlwQTVDa0FTSXNRdjhCZzBJRVVnMEJJQ3hDQ0lpbklRTUxBa0FnQTBIL0FYRWlBMEVCUndSQUlBWWdFVTBOQVNBR0lCRkJwS1RKQUJDNENRQUxJQUpCaUtRQmFrRWxRZnVqeVFCQkp4RFlBd3dDQ3lBQ1Fmd0FhaUFiSUFZUWx3a2dBa0VFT2dDSXBBRWdBaUFEUVFKR09nQ0pwQUVNQVFzZ0FpQXNOd09JcEFFTElBSXBBNGlrQVNJdElTd0NRQUpBSUMybklnWkIvd0Z4UVFSckRnSUFBd0VMUWdBaExDQXRRb0FDZzBJQVVnMENDeUF0UXY4QmcwSUVVU0lERFFBTElDVWdMRUlnaUtjZ0F4c2hKVUVFSUFZZ0F4c01BUXRCQkFzaEFTQWJFTjRJSUFGQi93RnhRUVJIQkVBZ0FTQWxFS2NGQ3lBQ1FkRFNBR29nQWtHRUFXb29BZ0EyQWdBZ0FpQUNLUUo4TndQSVVpQUNRWWdCYWlBQ1FjalNBR29nR1JBdUlBUW9BZ0FnQkNnQ0JFRUVFT0lFSUFRb0Fnd2dCQ2dDRUJEdkNTQUVLQUlnSUFRb0FpUVE3QWdnQkVIUUFFRUlFT01FSUFJb0FwUUJJUU1nQWlnQ2tBRWhBU0FDS0FLTUFTRUlJQUlvQW9nQklnWkJuNENBZ0hoR0RRVWdBaWdDbUFFTUJBdEI0TERKQUVFa1FZU3h5UUFRbkFZQUN5QXRweUFzcHhDbkJRc2dBaWdDVkNFR0N5QUNRZERTQUdvZ0FrSEVBR29vQWdBMkFnQWdBaUFDS1FJOE53UElVaUFDUVNocUlBSkJ5TklBYWlBWkVDNGdCZ1JBSUFJb0FsQWdCa0VCRU9NRUN5QUNLQUp3UVpEU0FrRUVFT01FSUFJb0FqUWhBeUFDS0FJd0lRRWdBaWdDTENFSUlBSW9BaWdpQmtHZmdJQ0FlRVlOQVNBQ0tBSTRDeUVlSUFBZ0F6WUNEQ0FBSUFFMkFnZ2dBQ0FJTmdJRUlBQWdCallDQUVFUURBTUxJQmRCQ0dvaEZ5QWRJQm9RcVFrZ0FTRWFJQWdoSFNBRElRZ01BUXNMSUFCQjNkREpBRFlDQkNBQVFZQ0FnSUI0TmdJQVFSZ2hIa0VJQ3lBQWFpQWVOZ0lBSUJZZ0hCRDRDU0FkSUJvUXFRa0xJQUpCb0tRQmFpUUFDN0VuQWl4L0IzNGpBRUd3QVdzaUJDUUFJQUZCQVdzaExDQUVRWTRCYWlFdElBUkJwQUZxSVNJZ0JFR1lBV29oSnlBRVFkZ0FhaUV1SUFSQjBBQnFRUVJ5SVNnZ0JFR01BV29oSUNBRVFTaHFJU1FnQWlnQ0ZDRVZJQUlvQWhBaEV5QUNLQUlNSVJRZ0FpZ0NDQ0VKSUFJb0FnUWhDeUFDS0FJQUlRVWdCRUdqQVdvaEtVRUJJU01nQUFKL0FrQUNmd0pBQWtBRFFDQUVJQlVpR1RZQ0xDQUVJQk1pSFRZQ0tDQUVJQlFpSGpZQ0pDQUVJQWtpSVRZQ0lDQUVJQXNpRmpZQ0hDQUVJQVVpSHpZQ0dFRUFJUUlDZndKQUFuOENRQUpBQWtBRFFDQUNJQlpIQkVCQjRaL0pBRUVGSUFJZ0gyb3RBQUFRckFZTkFpQUNRUUZxSVFJTUFRc0xJQlpGQkVCQkFDRVVEQUlMSUFSQmdBRnFJQVJCR0dvaUFpQVdFTkFHSUNjZ0FpQVdFTkVHSUFSQjhBQnFJQ0pCQ0dvb0FBQTJBZ0FnQkNBaUtRQUFOd05vSUFRdkFLRUJJQ2t0QUFCQkVIUnlEQU1MSUJZaEZDQUNEUUVMSUJtdElDV3RRaWlHaEVLQWdJQ0F3QVNFSVRFZ0lTRVRJQjRoRlNBZElRSU1BZ3NnQkVHQUFXb2dCRUVZYWlJVElBSVEwQVlnSnlBVElBSVEwUVlnQkVId0FHb2dJa0VJYWlnQUFEWUNBQ0FFSUNJcEFBQTNBMmdnQkM4QW9RRWdLUzBBQUVFUWRISUxJU1VnQkMwQW9BRWhDQ0FFS0FLY0FTRUhJQVFvQXBnQklRSWdCQ2dDbEFFaEZTQUVLQUtRQVNFVElBUW9Bb3dCSVJRZ0JDZ0NpQUVoQ1NBRUtBS0VBU0VMQW44Q1FBSkFJQVFvQW9BQklnVkZCRUFnQzBVRVFDQU5JUWNnREF3RUN5QUhyU0FJclVML0FZTkNJSWFFSUNXdFFpaUdoQ0V4SUF0QkFXc09BZ1FCQWdzZ0JFRVFhaUFFUWZBQWFpZ0NBRFlDQUNBRUlBUXBBMmczQXdnZ01rTC8vLzhIZ3lBQ3JVSVlob1FpTWtJSWhpRXZJQlFoQmlBVElRb2dGU0VNSUFldElBaXRRdjhCZzBJZ2hvUWdKYTFDS0lhRUlqRWhNQ0FDREFRTFFRSWhEaUF4SVM4Z0FpRUhJQlVoQ0NBVElRb2dGQ0VHSUFraEJRd0dDeUFVSVFZZ0V5RUtJQUloQnlBVkN5RUlJREVoTDBFQUlRNGdDU0VGREFRTElBUWdHVFlDTENBRUlCMDJBaWdnQkNBZU5nSWtJQVFnSVRZQ0lDQUVJQlkyQWh3Z0JDQWZOZ0lZSUFSQmdBRnFJUkJCQUNFRlFRQWhHRUVBSVJvakFFSFFBR3NpQXlRQUlBTkJJR3BCMlp6SkFFRUJJQVJCR0dvUXZRSWdBeWdDT0NFYklBTW9BalFoSENBREtBSXdJUkVnQXlnQ0xDRU9JQU1vQWlnaEVpQURLQUlrSVJjQ1FBSkFBa0FDUUFKQUFuOGdBeWdDSUNJUFFRTkhCRUFnR3lFTElCd2hDQ0FSSVFrZ0RpRU1JQkloQnlBWElRb2dBeWdDUEF3QkN5QURJQnMyQWh3Z0F5QWNOZ0lZSUFNZ0VUWUNGQ0FESUE0MkFoQWdBeUFTTmdJTUlBTWdGellDQ0VFQUlROENRQUpBQW44Q1FBSkFBMEFnRWlBUElnWkdEUUVnQmtFRFJnMENJQVpCQVdvaER5QUdJQmRxTFFBQVFmZ0JjVUV3UmcwQUN5QUdSUTBESUFOQklHb2dBMEVJYWlJRklBWVEwQVlnQTBFNGFpQUZJQVlRdGdjZ0F5OEFRU0FEUWNNQWFpMEFBRUVRZEhJTUFnc2dFa1VOQWlBRFFTQnFJQU5CQ0dvaUJpQVNFTkFHSUFOQk9Hb2dCaUFTRUxZSElBTXZBRUVnQTBIREFHb3RBQUJCRUhSeURBRUxJQU5CSUdvZ0EwRUlhaUlHUVFNUTBBWWdBMEU0YWlBR1FRTVF0Z2NnQXk4QVFTQURRY01BYWkwQUFFRVFkSElMSVFVZ0F5MEFRQ0VHSUFNb0Fqd2hDeUFES0FJNElRZ2dBeWdDTkNFSklBTW9BakFoRENBREtBSXNJUWNnQXlnQ0tDRUtJQU1vQWlRaER3SkFJQU1vQWlBaURVVUVRQ0FQRFFFTUF3c2dBMEVnYWlBSUlBc1FaeUFES0FJZ1FRRkhCRUFnQXlnQ0pDQURLQUlvUVFnUTVRRWlCa0VCY1EwQ0lBWkJFSFloQmlBS0lBd2hDQ0FKSVFzZ0RTRUtJQWNoQ1NFTUlBOGhCd3dHQ3lBRElBTXBBaVEzQXdoQmdNL1NBRUVySUFOQkNHcEJpS3pKQUVHUXJza0FFSXdFQUFzZ0JrSC9BWEVnQlVFSWRISWhCZ0pBSUE4T0JBSUFBQVVBQ3lBR1FSQjJJUm9nQmtFSWRpRVlRUUVoRFNBR0lRVWdEMEVCYXc0REFBRUZBUXNnQXlBYk5nSWNJQU1nSERZQ0dDQURJQkUyQWhRZ0F5QU9OZ0lRSUFNZ0VqWUNEQ0FESUJjMkFnZ2dBMEVnYWlBRFFRaHFFT1FCSUFNb0FpQWlDZ1JBSUFNb0FqUWhDeUFES0FJd0lRZ2dBeWdDTENFSklBTW9BaWdoRENBREtBSWtJUWRCQUNFTkRBVUxJQU12QVVJaEdpQURLQUk4SVFzZ0F5Z0NPQ0VJSUFNb0FqUWhDU0FES0FJd0lRd2dBeWdDTENFSElBTW9BaWdoQ2lBRExRQkFJZ1loRFNBRExRQkJJaGdoQlFKQUlBTW9BaVFpRDBFQmF3NERBQUVGQVFzZ0F5QWJOZ0ljSUFNZ0hEWUNHQ0FESUJFMkFoUWdBeUFPTmdJUUlBTWdFallDRENBRElCYzJBZ2hCQVNFTklBTkJJR3BCd29IT0FFRUJJQU5CQ0dvUTN3RWdBeWdDSUNJS0JFQWdBeWdDTkNFTElBTW9BakFoQ0NBREtBSXNJUWtnQXlnQ0tDRU1JQU1vQWlRaEIwRUtJUVVNQlFzZ0F5OEJRaUVhSUFNb0Fqd2hDeUFES0FJNElRZ2dBeWdDTkNFSklBTW9BakFoRENBREtBSXNJUWNnQXlnQ0tDRUtJQU10QUVBaUJpRU5JQU10QUVFaUdDRUZBa0FnQXlnQ0pDSVBRUUZyRGdNQUFRVUJDeUFESUJzMkFod2dBeUFjTmdJWUlBTWdFVFlDRkNBRElBNDJBaEFnQXlBU05nSU1JQU1nRnpZQ0NFRUJJUTBnQTBFZ2FrSEdnYzRBUVFFZ0EwRUlhaERmQVNBREtBSWdJZ29FUUNBREtBSTBJUXNnQXlnQ01DRUlJQU1vQWl3aENTQURLQUlvSVF3Z0F5Z0NKQ0VIUVEwaEJRd0ZDeUFETHdGQ0lSb2dBeWdDUENFTElBTW9BamdoQ0NBREtBSTBJUWtnQXlnQ01DRU1JQU1vQWl3aEJ5QURLQUlvSVFvZ0F5MEFRQ0lHSVEwZ0F5MEFRU0lZSVFVQ1FDQURLQUlrSWc5QkFXc09Bd0FCQlFFTElBTWdHellDSENBRElCdzJBaGdnQXlBUk5nSVVJQU1nRGpZQ0VDQURJQkkyQWd3Z0F5QVhOZ0lJUVFFaERTQURRU0JxUWNpQnpnQkJBU0FEUVFocUVOOEJJQU1vQWlBaUNnUkFJQU1vQWpRaEN5QURLQUl3SVFnZ0F5Z0NMQ0VKSUFNb0FpZ2hEQ0FES0FJa0lRZEJDU0VGREFVTElBTXZBVUloR2lBREtBSThJUXNnQXlnQ09DRUlJQU1vQWpRaENTQURLQUl3SVF3Z0F5Z0NMQ0VISUFNb0FpZ2hDaUFETFFCQUlnWWhEU0FETFFCQkloZ2hCUUpBSUFNb0FpUWlEMEVCYXc0REFBRUZBUXNnQXlBYk5nSWNJQU1nSERZQ0dDQURJQkUyQWhRZ0F5QU9OZ0lRSUFNZ0VqWUNEQ0FESUJjMkFnaEJBU0VOSUFOQklHcEJ0b0hPQUVFQklBTkJDR29RM3dFZ0F5Z0NJQ0lLQkVBZ0F5Z0NOQ0VMSUFNb0FqQWhDQ0FES0FJc0lRa2dBeWdDS0NFTUlBTW9BaVFoQjBFSUlRVU1CUXNnQXk4QlFpRWFJQU1vQWp3aEN5QURLQUk0SVFnZ0F5Z0NOQ0VKSUFNb0FqQWhEQ0FES0FJc0lRY2dBeWdDS0NFS0lBTXRBRUFpQmlFTklBTXRBRUVpR0NFRkFrQWdBeWdDSkNJUFFRRnJEZ01BQVFVQkN5QURJQnMyQWh3Z0F5QWNOZ0lZSUFNZ0VUWUNGQ0FESUE0MkFoQWdBeUFTTmdJTUlBTWdGellDQ0VFQklRMGdBMEVnYWtHNmdjNEFRUUVnQTBFSWFoRGZBU0FES0FJZ0lnb0VRQ0FES0FJMElRc2dBeWdDTUNFSUlBTW9BaXdoQ1NBREtBSW9JUXdnQXlnQ0pDRUhRUXdoQlF3RkN5QURMd0ZDSVJvZ0F5Z0NQQ0VMSUFNb0FqZ2hDQ0FES0FJMElRa2dBeWdDTUNFTUlBTW9BaXdoQnlBREtBSW9JUW9nQXkwQVFDSUdJUTBnQXkwQVFTSVlJUVVDUUNBREtBSWtJZzlCQVdzT0F3QUJCUUVMSUFNZ0d6WUNIQ0FESUJ3MkFoZ2dBeUFSTmdJVUlBTWdEallDRUNBRElCSTJBZ3dnQXlBWE5nSUlJQU5CSUdwQkFTQURRUWhxRU9BQklBTW9BaUFpQ2dSQUlBTW9BanhGRFFNZ0F5Z0NPQzBBQUNFRklBTW9BalFoQ3lBREtBSXdJUWdnQXlnQ0xDRUpJQU1vQWlnaERDQURLQUlrSVFkQkFTRU5EQVVMSUFNdEFFRWhHQ0FETFFCQUlRWWdBeWdDUENFTElBTW9BamdoQ0NBREtBSTBJUWtnQXlnQ01DRU1JQU1vQWl3aEJ5QURLQUlvSVFvZ0F5Z0NKQ0lQUVFOR0JFQWdCaUVOSUJnaEJRd0ZDeUFETHdGQ0lSb0xJQVpCL3dGeElCaEIvd0Z4UVFoMGNpQWFRUkIwY2dzaERRSkFBa0FnRHc0RUFRQUFCUUFMSUExQkVIWWhFaUFOUVFoMklSY0xJQkFnQ3pZQ0dDQVFJQWcyQWhRZ0VDQUpOZ0lRSUJBZ0REWUNEQ0FRSUFjMkFnZ2dFQ0FTT3dFZUlCQWdGem9BSFNBUUlBMDZBQndnRUNBS05nSUVJQkFnRHpZQ0FBd0VDMEVBUVFCQjNKekpBQkRHQkFBTFFRRWhEU0FHSVFVTElBMUIvd0Z4SUFWQi93RnhRUWgwY2lFTkN5QVFJQXMyQWhnZ0VDQUlOZ0lVSUJBZ0NUWUNFQ0FRSUF3MkFnd2dFQ0FITmdJSUlCQWdDallDQkNBUVFRTTJBZ0FnRUNBTlFRaDJPZ0FkSUJBZ0RVRUJjVG9BSEFzZ0EwSFFBR29rQUNBRUtBS1VBU0VISUFRb0FwQUJJUWdnQkNnQ2hBRWhCUUpBSUFRb0FvQUJJZzVCQTBjRVFDQUVLUUtZQVNFdklBUW9Bb3dCSVFvZ0JDZ0NpQUVoQmlBT1FRRnJEZ0lCQlFRTElBUW9Bb3dCSVFrZ0JDZ0NpQUVoQ3lBVUlRWWdFeUVLSUJVaERDQUVLQUtZQVNFVklBY2hFeUFJSVJRZ00wS0FnSUI0Z3lBRU1RQ2NBVUlJaG9RZ0JERUFuUUZDRUlhRVFnR0VJaThoTXlBQ0RBRUxJQVFnR1RZQ0xDQUVJQjAyQWlnZ0JDQWVOZ0lrSUFRZ0lUWUNJQ0FFSUJZMkFod2dCQ0FmTmdJWUlBUkJnQUZxSUFSQkdHb1E1QUVDUUNBRUtBS0FBU0lGUlFSQUlBUXBBcHdCSVM4Z0JDZ0NtQUVoQnlBRUtBS1VBU0VJSUFRb0FwQUJJUW9nQkNnQ2pBRWhCaUFFS0FLSUFTRUZJQVFvQW9RQklnNUJBV3NPQWdFRkJBc2dCRUVRYWlBaVFRaHFLQUlBTmdJQUlBUWdJaWtDQURjRENDQTBRdi8vL3dlRElBUTFBcGdCUWhpR2hDSTBRZ2lHUWdLRUlTOGdCQ2tDbkFFaE1DQUVLQUtJQVNFSklBUW9Bb1FCSVFzZ0ZDRUdJQk1oQ2lBVklRd2dCQ2dDbEFFaEZTQUVLQUtRQVNFVElBUW9Bb3dCSVJRZ0Fnd0JDeUFFSUJrMkFrd2dCQ0FkTmdKSUlBUWdIallDUkNBRUlDRTJBa0FnQkNBV05nSThJQVFnSHpZQ09BSi9Ba0FDUUNBQlJRUkFJQVFnR1RZQ0xDQUVJQjAyQWlnZ0JDQWVOZ0lrSUFRZ0lUWUNJQ0FFSUJZMkFod2dCQ0FmTmdJWUlBUkJnQUZxUWV5Y3lRQkJDQ0FFUVJocUVOOEJJQVFvQW9BQkRRRWdCQ2dDbkFFaEJTQUVLQUtZQVNFSklBUW9BcFFCSVFZZ0JDa0NqQUVoTHlBRUtBS0lBU0VMSUFRb0FvUUJJUTRnQkNnQ29BRWlLaUVSREFJTElBUkJnQUZxUVp6UHlRQkJBU0FFUVRocUVMMENJQVFvQXBnQklRVWdCQ2dDbEFFaENTQUVLQUtRQVNFR0lBUXBBb2dCSVM4Z0JDZ0NoQUVoQ3lBRUtBS0FBU0lPUVFOSEJFQWdCQ2dDbkFFaEVRd0NDeUFFSUFVMkFud2dCQ0FKTmdKNElBUWdCallDZENBRUlDODNBbXdnQkNBTE5nSm9JQVJCZ0FGcUlDd2dCRUhvQUdvUUdTQUVLQUtnQVNFRklBUW9BcHdCSVFjZ0JDZ0NtQUVoQ1NBRUtBS1VBU0VHSUFRcEFvd0JJUzhnQkNnQ2lBRWhDeUFFS0FLRUFTRU9JQVFvQW9BQlFRRkdCRUFnQlNFUklBY2hCUXdDQ3lBRUlBazJBaXdnQkNBR05nSW9JQVFnTHpjQ0lDQUVJQXMyQWh3Z0JDQU9OZ0lZSUFRb0FxUUJJUXdnQkVHQUFXcEJrNVhTQUVFQklBUkJHR29RdlFJZ0JDZ0NtQUVoQmlBRUtBS1VBU0VKSUFRb0FwQUJJUThnQkNrQ2lBRWhNQ0FFS0FLRUFTRU9JQVFvQW9BQklncEJBMGNFUUNBRUtBS2NBU0VSSUFjZ0JSQ3BDU0FPSVFzZ0JpRUZJQW9oRGlBUElRWWdNQ0V2REFJTElBUWdCVFlDaEFFZ0JDQUhOZ0tBQVNBRUlBdzJBb2dCSUFjZ0RFWUVRQ0FFUVlBQmFrSDBuTWtBRUswRElBUW9Bb1FCSVFVTElBd0VRQ0FGUVFGcUlBVWdEUHdLQUFBTElBVkJLRG9BQUNBRUlBeEJBV29pQ2pZQ2lBRWdNRUlnaUNFdklEQ25JUXNnQkNnQ2dBRWdDa1lFUUNBRVFZQUJha0dFbmNrQUVLMERJQVFvQW9RQklRVUxJQVVnQ21wQktUb0FBQ0FFSUFrMkFtUWdERUVDYWlFUklBUW9Bb0FCSVFrZ0JFSFFBR29oQ0NBRVFlQUFhaUVISUNnaERDQXVJUTFCQUF3Q0MwRUJJUTRnQkNrQ1BDRXZJQjRoQmlBZElRa2dHU0VGSUNwQmdINXhRUzF5SWlvaEVTQWZJUXNMSUM5Q0lJaW5JUThnQkVIUUFHb2hEQ0FFUWVBQWFpRUlJQVJCNUFCcUlRY2dLQ0VOUVFFTElBZ2dDVFlDQUNBSElBWTJBZ0FnRENBRk5nSUFJQTBnRVRZQ0FDQXZweUVKSUFRb0FtQWhCeUFFS0FKa0lRZ0VRQ0FPUVFGR0RRWWdCQ2tEVUNFdklBOGhDaUFKSVFZZ0N5RUZEQVFMSURWQy8vLy9CNE1nQkRVQ1VFSVlob1FpTlVJSWhrSURoQ0V2SUFRcEFsUWhNQ0FVSVFZZ0V5RUtJQlVoRENBSElSVWdDQ0VUSUE4aEZDQU9JUVVnQWdzaERTQWtJQVFwQXdnM0FnQWdKRUVJYWlBRVFSQnFLQUlBTmdJQUlBUWdNRGNESUNBRUlDODNBeGdnQ3lBV1J3UkFJQ0FnQkNrREdEY0NBQ0FnUVJocUlBUkJNR29vQWdBMkFnQWdJRUVRYWlBa0tRTUFOd0lBSUNCQkNHb2dCRUVnYWlrREFEY0NBQ0FFSUNzMkFvZ0JJQVFnSXpZQ2hBRWdCQ0FtTmdLQUFRSkFBa0FDUUFKQUlBUXRBSXdCUVFGckRnTUFBZ0VDQ3lBRVFZQUJhaUFFTFFDTkFTSUNFTVVISUMxQkFDQUNHeUVDSUFRb0FvZ0JJUWdnQkNnQ2hBRWhCd05BSUFJRVFDQUhJQWhxSUFJdEFBQTZBQUFnQ0VFQmFpRUlRUUFoQWd3QkN3c2dCQ0FJTmdLSUFRd0NDeUFFUVlBQmFpQUVLQUtVQVNBRUtBS1lBUkNYQ1F3QkN5QUVRWUFCYWlBRUtBS1FBU0FFS0FLVUFSQ1hDUXNnQkNnQ2lBRWhLeUFFS0FLRUFTRWpJQVFvQW9BQklTWWdJQkNqQ0F3QkN3c2dCRUVZYWhDakNFRUJJUTRnSFNFSElCNGhDQ0FoSVFvZ0ZpRUdJQjhoQlVFSURBSUxRUUFoRGdzZ0wwSW9pS2NoSUNBdnB5RVpJQzlDSUlpbkN5RUJJQ1lnSXhDcENTQUFJQWMyQWhnZ0FDQUlOZ0lVSUFBZ0NqWUNFQ0FBSUFZMkFnd2dBQ0FPQkg0Z0dhMGdJSzFDS0lZZ0FhMUMvd0dEUWlDR2hJUUZJQzhMTndJY0lBQWdCVFlDQ0NBQUlBNDJBZ1JCQVF3QkN5QUFJQmsyQWhnZ0FDQWROZ0lVSUFBZ0hqWUNFQ0FBSUNFMkFnd2dBQ0FyTmdJa0lBQWdJellDSUNBQUlDWTJBaHdnQUNBV05nSUlJQUFnSHpZQ0JFRUFDellDQUNBRVFiQUJhaVFBQzZ3V0FnNS9BWDRqQUVIQUJHc2lBaVFBSUFFb0FnQWhBeUFCS0FJRUlRVWdBU2dDQ0NFSElBRW9BZ3doQ2lBQktBSVFJUXNnQWlBQktBSVVJZzAyQXF3RElBSWdDellDcUFNZ0FpQUtOZ0trQXlBQ0lBYzJBcUFESUFJZ0JUWUNuQU1nQWlBRE5nS1lBeUFDUVJocUlBSkJtQU5xRUtRQ0FrQUNRQUpBQW40Q1FBSkFBa0FDUUNBQ0tBSXdJZ1JCREVZRVFDQUNLQUkwSWdGQkFVWU5BU0FDTHdGU0lRNGdBaThCVUNFTUlBSW9Ba3doQ1NBQ0tBSklJUVlnQWlnQ1JDRUVJQUlvQWtBaEF5QUNLUU00REFVTElBSkJFR29nQWtFa2FpZ0NBRFlDQUNBQ0lBSXBBaHczQXdnZ0FpZ0NHQ0VCSUFJb0FpZ2hCaUFDS0FJc0lRZ2dBaWdDTkNFSklBSW9Ba0FoQlNBQ0tBSkVJUWNnQWlnQ1NDRURJQUlvQWt3aENpQUNMd0ZRSVFzZ0FpOEJVaUVOSUFJcEF6Z2hFQ0FDUWR3Q2FpQUNRZFFBYWtFay9Bb0FBQ0FRUWlDSXB5RU1JQkNuSVE0TUFRc2dBaUFOTmdLc0F5QUNJQXMyQXFnRElBSWdDallDcEFNZ0FpQUhOZ0tnQXlBQ0lBVTJBcHdESUFJZ0F6WUNtQU1nQWtINEFHb2dBa0dZQTJvUWJRSkFJQUlvQXBBQklnUkJERVlFUUNBQ0tBS1VBU0lCUVFGR0RRRWdBaThCc2dFaERpQUNMd0d3QVNFTUlBSW9BcXdCSVFrZ0FpZ0NxQUVoQmlBQ0tBS2tBU0VFSUFJb0FxQUJJUU1nQWlrRG1BRU1CUXNnQWtFUWFpQUNRWVFCYWlnQ0FEWUNBQ0FDSUFJcEFudzNBd2dnQWlnQ2VDRUJJQUlvQW9nQklRWWdBaWdDakFFaENDQUNLQUtVQVNFSklBSW9BcUFCSVFVZ0FpZ0NwQUVoQnlBQ0tBS29BU0VESUFJb0Fxd0JJUW9nQWk4QnNBRWhDeUFDTHdHeUFTRU5JQUlwQTVnQklSQWdBa0hjQW1vZ0FrRzBBV3BCSlB3S0FBQWdFRUlnaUtjaERDQVFweUVPREFFTElBSWdEVFlDbEFNZ0FpQUxOZ0tRQXlBQ0lBbzJBb3dESUFJZ0J6WUNpQU1nQWlBRk5nS0VBeUFDSUFNMkFvQURJQUpCbUFOcUlBSkJnQU5xRUdNZ0FrRzRCR29pQVNBQ1FhZ0RhaWdDQURZQ0FDQUNJQUlwQXFBRE53T3dCQ0FDTHdHNEF5RU1JQUlvQXJRRElRa2dBaWdDc0FNaEJpQUNLQUtzQXlFRUlBSW9BcHdESVE4Q1FBSi9JQUlvQXBnRFFRRkdCRUFnQWtHb0JHb2dBU2dDQURZQ0FDQUNJQUlwQTdBRUloQTNBNkFFSUJDbklRRWdBaWtDcEFRaEVDQUNMd0c2QXd3QkN5QUNRZXdEYWlBQktBSUFOZ0lBSUFJZ0R6WUM0QU1nQWlBQ0tRT3dCRGNDNUFNZ0FpQUdOZ0wwQXlBQ0lBUTJBdkFESUFKQm1BTnFRZTZBemdCQkFTQUNRZUFEYWhDOUFpQUNLQUt3QXlFSUlBSW9BcXdESVFZZ0FpZ0NxQU1oQkNBQ0tRS2dBeUVRSUFJb0Fwd0RJUUVnQWlnQ21BTWlEMEVEUmcwQklBZ2hDU0FDS0FLMEF5SU1RUkIyQ3lFT0lBSWdBVFlDMkFFZ0FpQVFOd0xjQVFKQUFrQWdEMEVCUmdSQUlBSWdEVFlDOUFNZ0FpQUxOZ0x3QXlBQ0lBbzJBdXdESUFJZ0J6WUM2QU1nQWlBRk5nTGtBeUFDSUFNMkF1QURJQUpCbUFOcUlBSkI0QU5xRURjQ1FDQUNLQUtZQXlJQlFRTkhCRUFnQVVFQlJnMEJEQWdMSUFKQkVHb2dBa0dvQTJvb0FnQTJBZ0FnQWlBQ0tRS2dBemNEQ0NBQ0tBS2NBeUVCSUFJb0Fxd0RJUVlnQWlnQ3NBTWhDQ0FDS0FLMEF5RUpRUVVoQkF3RkN5QUNJQTAyQXZRRElBSWdDellDOEFNZ0FpQUtOZ0xzQXlBQ0lBYzJBdWdESUFJZ0JUWUM1QU1nQWlBRE5nTGdBeUFDUVpnRGFpQUNRZUFEYWhCR0FrQWdBaWdDbUFOQkFVWUVRQ0FDS0FLY0F5SUJRUUZHRFFFZ0FpOEJ1Z01oRGlBQ0x3RzRBeUVNSUFJb0FyUURJUWtnQWlnQ3NBTWhCaUFDS0FLc0F5RUVJQUlvQXFnRElRTWdBaWtEb0FNTUNRc2dBa0VRYWlBQ1Fhd0RhaWdDQURZQ0FDQUNJQUlwQXFRRE53TUlJQUlwQTdnREloQkNJSWluSVF3Z0FpZ0NvQU1oQVNBQ0tBS3dBeUVHSUFJb0FyUURJUWdnRUtjaERrRUVJUVFNQlFzZ0FpQU5OZ0wwQXlBQ0lBczJBdkFESUFJZ0NqWUM3QU1nQWlBSE5nTG9BeUFDSUFVMkF1UURJQUlnQXpZQzRBTWdBa0dZQTJvZ0FrSGdBMm9RTENBQ0tBS2NBeUVCQWtBQ1FDQUNLQUtZQTBFQlJnUkFJQUZCQVVZTkFRd0lDeUFDUVJCcUlBSkJvQU5xSWdOQkNHb29BZ0EyQWdBZ0FpQURLUUlBTndNSUlBSW9BcXdESVFZZ0FpZ0NzQU1oQ0NBQ0tBSzBBeUVKSUFJcEFyZ0RJUkJCQmlFRURBRUxJQUlnRFRZQzlBTWdBaUFMTmdMd0F5QUNJQW8yQXV3RElBSWdCellDNkFNZ0FpQUZOZ0xrQXlBQ0lBTTJBdUFESUFKQm1BTnFJZ2dnQWtIZ0Eyb1FqQUVnQWlnQ25BTWhBU0FDS0FLWUEwRUJSZ1JBSUFGQkFVY05CeUFDSUEwMkFxd0RJQUlnQ3pZQ3FBTWdBaUFLTmdLa0F5QUNJQWMyQXFBRElBSWdCVFlDbkFNZ0FpQUROZ0tZQXlBQ1FmZ0JhaUFJRUM4Q1FDQUNLQUtRQWlJRVFReEdCRUFnQWlnQ2xBSkJBV3NPQWdFR0JRc2dBa0VRYWlBQ1FZUUNhaWdDQURZQ0FDQUNJQUlwQXZ3Qk53TUlJQUlvQXZnQklRRWdBaWdDaUFJaEJpQUNLQUtNQWlFSUlBSW9BcFFDSVFrZ0Fpa0RtQUloRUNBQ0tBS2dBaUVGSUFJb0FxUUNJUWNnQWlnQ3FBSWhBeUFDS0FLc0FpRUtJQUl2QWJBQ0lRc2dBaThCc2dJaERTQUNRZHdDYWlBQ1FiUUNha0VrL0FvQUFBd0NDeUFDSUEwMkF2UURJQUlnQ3pZQzhBTWdBaUFLTmdMc0F5QUNJQWMyQXVnRElBSWdCVFlDNUFNZ0FpQUROZ0xnQXlBQ1FaZ0RhaUFDUWVBRGFoQTdJQUlvQXB3RElRRWdBaWdDbUFORkJFQkJDQ0VFSUFKQkVHb2dBa0dnQTJvaUEwRUlhaWdDQURZQ0FDQUNJQU1wQWdBM0F3Z2dBaWdDckFNaEJpQUNLQUt3QXlFSUlBSW9BclFESVFrZ0Fpa0N1QU1oRUF3Q0N5QUJRUUZIRFFjZ0FpQU5OZ0tVQXlBQ0lBczJBcEFESUFJZ0NqWUNqQU1nQWlBSE5nS0lBeUFDSUFVMkFvUURJQUlnQXpZQ2dBTWdBa0dZQTJvaUNDQUNRWUFEYWhCa0lBSW9BcGdESVFFZ0FpZ0N3QU1pQTBHQWdJQ0FlRVlOQ0NBQ1FSQnFJQWhCQkhJaUNFRUlhaWdDQURZQ0FDQUNJQWdwQWdBM0F3Z2dBaWdDcUFNaEJpQUNLQUtzQXlFSUlBSkI0QU5xSUFKQnNBTnFRVEQ4Q2dBQUlBSXZBY29ESVEwZ0FpOEJ5QU1oQ3lBQ0tBTEVBeUVLSUFJb0Fyd0RJUWNnQWlnQ3VBTWhCU0FDS1FPd0F5RVFJQUpCM0FKcUlBSkIvQU5xUVNUOENnQUFRUWtoQkF3QkN5QUNRUkJxSUFKQm9BTnFJZ05CQ0dvb0FnQTJBZ0FnQWlBREtRSUFOd01JSUFJb0Fxd0RJUVlnQWlnQ3NBTWhDQ0FDS0FLMEF5RUpJQUlwQXJnRElSQkJCeUVFUVFBaEJRc2dFRUlnaUtjaERDQVFweUVPREFRTElCQkNJSWluSVFNZ0R5RUJJQUlwQTlnQkRBWUxJQUlvQXBnQ0lRVkJBQ0VCREFjTElBSXZBYklDSVE0Z0FpOEJzQUloRENBQ0tBS3NBaUVKSUFJb0FxZ0NJUVlnQWlnQ3BBSWhCQ0FDS0FLZ0FpRURJQUlwQTVnQ0loQ25JUVZCQWlFQkRBVUxJQUpCOEFGcUlBUTJBZ0FnQWtFUWFpQUVOZ0lBSUFJZ0REWUMyQUVnQWlBUU53UG9BU0FDSUJBM0F3Z2dBaWtEMkFFaUVFSWdpS2NoRENBUXB5RU9RUXNoQkFzZ0FDQUJOZ0lBSUFBZ0Fpa0RDRGNDQkNBQVFReHFJQUpCRUdvb0FnQTJBZ0FnQUNBSU5nSVVJQUFnQmpZQ0VDQUFRVHhxSUFKQjNBSnFRU1Q4Q2dBQUlBQWdEVHNCT2lBQUlBczdBVGdnQUNBS05nSTBJQUFnQXpZQ01DQUFJQWMyQWl3Z0FDQUZOZ0lvSUFBZ0REWUNKQ0FBSUE0MkFpQWdBQ0FKTmdJY0lBQWdCRFlDR0F3RkN5QUNMd0c2QXlFT0lBSXZBYmdESVF3Z0FpZ0N0QU1oQ1NBQ0tBS3dBeUVHSUFJb0Fxd0RJUVFnQWlnQ3FBTWhBeUFDS1FLZ0F3d0JDeUFDTHdHMkF5RU9JQUl2QWJRRElRd2dBaWdDc0FNaENTQUNLQUtzQXlFR0lBSW9BcWdESVFRZ0FpZ0NwQU1oQXlBQ0tRS2NBd3NpRUtjaEJTQUJEUUFNQVFzZ0VFSWdpS2NoQndzZ0FDQU9Pd0U2SUFBZ0REc0JPQ0FBSUFrMkFqUWdBQ0FHTmdJd0lBQWdCRFlDTENBQUlBTTJBaWdnQUNBSE5nSWtJQUFnQlRZQ0lDQUFJQUUyQWh3Z0FFRU1OZ0lZQ3lBQ1FjQUVhaVFBQzdZUkFSbC9Jd0JCUUdvaUJTUUFJQUVnQWtFR2RHb2hHeUFBS0FJTUlRb2dBQ2dDQ0NFSUlBQW9BZ1FoQmlBQUtBSUFJUWNEUUNBQklCdEdSUVJBUVFBaEFpQUZRUUJCd0FEOEN3QkJFRUhBQUVFRUVNVUlJZ3NnQzBFUVR4dEJBblFoQXlBQlFVQnJBMEFnQWlBRFJrVUVRQ0FDSUFWcUlBRWdBbW9vQUFBMkFnQWdBa0VFYWlFQ0RBRUxDeUFBSUFjZ0JTZ0NFQ0lNSUFVb0FpQWlEU0FGS0FJd0lnNGdCU2dDQUNJUElBVW9BaVFpRUNBRktBSTBJaEVnQlNnQ0JDSVNJQVVvQWhRaUV5QVJJQkFnRXlBU0lBNGdEU0FNSUE4Z0J5QUdJQWh4YWlBS0lBWkJmM054YW1wQmlMZlZ4QUpyUVFkM0lBWnFJZ0ZxSUFvZ0Vtb2dDQ0FCUVg5emNXb2dBU0FHY1dwQnFwSGh1UUZyUVF4M0lBRnFJZ0lnQmlBRktBSU1JZ2RxSUFFZ0FpQUlJQVVvQWdnaUZHb2dCaUFDUVg5emNXb2dBU0FDY1dwQjIrR0JvUUpxUVJGM2FpSURRWDl6Y1dvZ0FpQURjV3BCa3VLSThnTnJRUlozSUFOcUlnRkJmM054YWlBQklBTnhha0hSNEkvVUFHdEJCM2NnQVdvaUJHb2dBaUFUYWlBRElBUkJmM054YWlBQklBUnhha0dxakorOEJHcEJESGNnQkdvaUFpQUZLQUljSWhVZ0FXb2dCQ0FDSUFVb0FoZ2lGaUFEYWlBQklBSkJmM054YWlBQ0lBUnhha0h0ODc2K0JXdEJFWGRxSWdGQmYzTnhhaUFCSUFKeGFrSC8xZVVWYTBFV2R5QUJhaUlEUVg5emNXb2dBU0FEY1dwQjJMR0N6QVpxUVFkM0lBTnFJZ1JxSUFJZ0VHb2dBU0FFUVg5emNXb2dBeUFFY1dwQjBaRHNwUWRyUVF4M0lBUnFJZ0lnQlNnQ0xDSVhJQU5xSUFRZ0FpQUZLQUlvSWhnZ0FXb2dBeUFDUVg5emNXb2dBaUFFY1dwQno4Z0NhMEVSZDJvaUFVRi9jM0ZxSUFFZ0FuRnFRY0xRakxVSGEwRVdkeUFCYWlJRFFYOXpjV29nQVNBRGNXcEJvcUxBM0FacVFRZDNJQU5xSWdScUlBVW9BamdpR1NBQmFpQURJQUlnRVdvZ0FTQUVRWDl6Y1dvZ0F5QUVjV3BCN1p5ZUUydEJESGNnQkdvaUFVRi9jeUlKY1dvZ0FTQUVjV3BCOHZpYXpBVnJRUkYzSUFGcUlnSWdDWEZxSUFVb0Fqd2lDU0FEYWlBRUlBSkJmM01pR25GcUlBRWdBbkZxUWFHUTBNMEVha0VXZHlBQ2FpSURJQUZ4YWtHZXRZZlBBR3RCQlhjZ0Eyb2lCR29nQWlBWGFpQUVJQU5CZjNOeGFpQUJJQlpxSUFNZ0duRnFJQUlnQkhGcVFjQ1ovZjBEYTBFSmR5QUVhaUlCSUFOeGFrSFJ0UG15QW1wQkRuY2dBV29pQWlBQlFYOXpjV29nQXlBUGFpQUJJQVJCZjNOeGFpQUNJQVJ4YWtIVzhLU3lBV3RCRkhjZ0Ftb2lBeUFCY1dwQm85L0R6Z0pyUVFWM0lBTnFJZ1JxSUFJZ0NXb2dCQ0FEUVg5emNXb2dBU0FZYWlBRElBSkJmM054YWlBQ0lBUnhha0hUcUpBU2FrRUpkeUFFYWlJQklBTnhha0gvc3ZpNkFtdEJEbmNnQVdvaUFpQUJRWDl6Y1dvZ0F5QU1haUFCSUFSQmYzTnhhaUFDSUFSeGFrRzRpTERCQVd0QkZIY2dBbW9pQXlBQmNXcEI1cHVIandKcVFRVjNJQU5xSWdScUlBSWdCMm9nQkNBRFFYOXpjV29nQVNBWmFpQURJQUpCZjNOeGFpQUNJQVJ4YWtHcThLUG1BMnRCQ1hjZ0JHb2lBU0FEY1dwQitlU3IyUUJyUVE1M0lBRnFJZ0lnQVVGL2MzRnFJQU1nRFdvZ0FTQUVRWDl6Y1dvZ0FpQUVjV3BCN2Fub3FnUnFRUlIzSUFKcUlnTWdBWEZxUWZ1dDhMQUZhMEVGZHlBRGFpSUVhaUFESUE1cUlBRWdGR29nQXlBQ1FYOXpjV29nQWlBRWNXcEJpTGpCR0d0QkNYY2dCR29pQVNBRVFYOXpjV29nQWlBVmFpQUVJQU5CZjNOeGFpQUJJQU54YWtIWmhieTdCbXBCRG5jZ0FXb2lBaUFFY1dwQjl1YldsZ2RyUVJSM0lBSnFJZ01nQW5NaUdpQUJjMnBCdm8wWGEwRUVkeUFEYWlJRWFpQUNJQmRxSUFRZ0FTQU5haUFFSUJwemFrSC9rcmpFQjJ0QkMzY2dCR29pQkhNaUFpQURjMnBCb3NMMTdBWnFRUkIzSUFScUlnRWdCSE1nQXlBWmFpQUJJQUp6YWtIMGorc1FhMEVYZHlBQmFpSUNjMnBCdkt1RTJnVnJRUVIzSUFKcUlnTnFJQUVnRldvZ0JDQU1haUFCSUFKeklBTnpha0dwbi92ZUJHcEJDM2NnQTJvaUFTQUNJQU56YzJwQm9PbVN5Z0JyUVJCM0lBRnFJZ1FnQVhNZ0FpQVlhaUFCSUFOeklBUnpha0dRaDRHS0JHdEJGM2NnQkdvaUFuTnFRY2I5N2NRQ2FrRUVkeUFDYWlJRGFpQUVJQWRxSUFFZ0Qyb2dBaUFFY3lBRGMycEJockQ3cWdGclFRdDNJQU5xSWdFZ0FpQURjM05xUWZ1ZXc5Z0NhMEVRZHlBQmFpSUVJQUZ6SUFJZ0Ztb2dBU0FEY3lBRWMycEJoYnFnSkdwQkYzY2dCR29pQW5OcVFjZmZyTEVDYTBFRWR5QUNhaUlEYWlBQ0lCUnFJQUVnRG1vZ0FpQUVjeUFEYzJwQm04eVJ5UUZyUVF0M0lBTnFJZ0VnQTNNZ0JDQUphaUFDSUFOeklBRnpha0g0K1luOUFXcEJFSGNnQVdvaUFuTnFRWnZUenRvRGEwRVhkeUFDYWlJRElBRkJmM055SUFKemFrRzh1OXZlQUd0QkJuY2dBMm9pQkdvZ0F5QVRhaUFDSUJscUlBRWdGV29nQkNBQ1FYOXpjaUFEYzJwQmwvK3JtUVJxUVFwM0lBUnFJZ0VnQTBGL2MzSWdCSE5xUWRtNHI2TUZhMEVQZHlBQmFpSUNJQVJCZjNOeUlBRnpha0hIdjdFYmEwRVZkeUFDYWlJRElBRkJmM055SUFKemFrSERzKzJxQm1wQkJuY2dBMm9pQkdvZ0F5QVNhaUFDSUJocUlBRWdCMm9nQkNBQ1FYOXpjaUFEYzJwQjd1Yk1od2RyUVFwM0lBUnFJZ0VnQTBGL2MzSWdCSE5xUVlPWHdBQnJRUTkzSUFGcUlnSWdCRUYvYzNJZ0FYTnFRYS9FN3RNSGEwRVZkeUFDYWlJRElBRkJmM055SUFKemFrSFAvS0g5Qm1wQkJuY2dBMm9pQkdvZ0F5QVJhaUFDSUJacUlBRWdDV29nQkNBQ1FYOXpjaUFEYzJwQm9MTE1EbXRCQ25jZ0JHb2lBU0FEUVg5emNpQUVjMnBCN1BuNjV3VnJRUTkzSUFGcUlnSWdCRUYvYzNJZ0FYTnFRYUdqb1BBRWFrRVZkeUFDYWlJRElBRkJmM055SUFKemFrSCtnckxGQUd0QkJuY2dBMm9pQkdvaUJ6WUNBQ0FBSUFFZ0Yyb2dCQ0FDUVg5emNpQURjMnBCeTV1VWxnUnJRUXAzSUFScUlnRWdDbW9pQ2pZQ0RDQUFJQUlnRkdvZ0FTQURRWDl6Y2lBRWMycEJ1NlhmMWdKcVFROTNJQUZxSWdJZ0NHb2lDRFlDQ0NBQUlBSWdCbW9nQXlBUWFpQUNJQVJCZjNOeUlBRnpha0h2Mk9TakFXdEJGWGRxSWdZMkFnUWhBUXdCQ3dzZ0JVRkFheVFBQzlJVkFnZC9BbjRqQUVHQUFtc2lCQ1FBSUFRZ0FTQUNJQU5COE1US0FFRUpFTWdESWdFMkFqUWdCRUVBTmdJNEFrQWdBVVVOQUFKL0FrQUNRQUpBQWtCQkNDQUJLQUlBUVFKcklnSWdBa0VLVHh0QkJHc09CUUlBQUFBQkFBc2dCRUVCTmdMRUFTQUVRZlRHeWdBMkFzQUJJQVJDQVRjQ3pBRWdCRUhwQURZQ2pBRWdCQ0FFUVlnQmFqWUN5QUVnQkNBRVFUUnFOZ0tJQVNBRVFjQUJha0g4eHNvQUVLc0hBQXNnQkVIY0FHb2dBUkRGQXlBRVFjQUJhaUlESUFRb0FtQWlBU0FFS0FKa0lnSVFqQVVnQkVHSUFXb2lCU0FERUpzRUlBUW9Bb2dCUVlDQWdJQjRSZ1JBSUFRb0Fvd0JJQVFvQXBBQkVQVUpJQU1nQVNBQ0VOQUNJQVJCdEFGcUlBTkJrSkhBQUJDQUJDQUZFTlVFSUFSQnlBRnFRZmpQMGdBcEF3QTNBd0FnQkVId3o5SUFLUU1BTndQQUFTQUVJQVFwQTVBQk53UFlBU0FFSUFRcEE0Z0JOd1BRQVVFQUlRTURRQ0FFS0FLOEFTSUJJQU5OQkVBZ0JFR1FBV29nQkVIVUFXb3BBZ0EzQXdBZ0JFR1lBV29nQkVIY0FXb29BZ0EyQWdBZ0JDQUVLUUxNQVRjRGlBRWdCQ2dDeUFFaEFpQUVLQUxFQVNFRklBUW9Bc0FCREFVTEFrQWdCQ2dDdUFFaUFpQUJJQU5Cb0pIQUFCRGdCeUlGTFFBQVFRVkhEUUFDUUFKQUlBVW9BZ2dpQmlBRktBSU1JZ1ZCc0pIQUFFRUxFT3dIUlFSQUlBWWdCVUc3a2NBQVFRd1E3QWRGRFFNZ0FpQUJJQU5CQVd0QnlKSEFBQkRnQnlJQkxRQUFRUU5HRFFGQkdDRUNRZGlSd0FBaEJRd0hDeUFDSUFFZ0EwRUJhMEd3azhBQUVPQUhJZ0V0QUFCQkEwWU5BVUVYSVFKQndKUEFBQ0VGREFZTFFnQWhDeUFCS1FNSUlneENBQ0FNUWdCVkd5RU1JQU5CQVdvaEF3TkFJQXNnREZFTkFrRWVJUUpCZ0pMQUFDRUZJQVFvQXJnQklnRWdCQ2dDdkFFaUJ5QURRZkNSd0FBUTRBY2lCaTBBQUEwR0lBWW9BZ2dnQmlnQ0RCRGJCaUVHSUFFZ0J5QURRUUZxUWFDU3dBQVE0QWNpQ0MwQUFBMEdJQWdvQWdnZ0NDZ0NEQkRiQmlFSVFTVWhBa0dMazhBQUlRVUNRQUpBQWtBQ1FBSkFBa0FDUUNBQklBY2dBMEVDYWtHd2tzQUFFT0FISWdjdEFBQU9CUUFORFEwQkRRc2dCeWdDREVFQ2F3NERBd0VDQVFzZ0J5Z0NEQ0FJSUFaclFRRnFSZzBEUVJNaEFrSDRrc0FBSVFVTUN3dEJ3SkxBQUVFWEVPNEpBQXNnQnlnQ0NFRUVFTnNHSUFSQkFEb0E4QUVnQkNBSU5nTHNBU0FFSUFZMkF1Z0JJQVpySVFJRFFDQUVRUkJxSUFSQjZBRnFFSUlGSUFRb0FoQkJBWEZGRFFNZ0JDQUNJQVFvQWhRaUJXb2lBVUVZZENBQlFZRCtBM0ZCQ0hSeUlBRkJDSFpCZ1A0RGNTQUJRUmgyY25JMkF1UUJJQVJCaUFGcUlnRWdCRUhrQVdwQkJCQzFCQ0FFUWZRQmFpQUVRY0FCYWlBRklBRVE0d0VnQkNnQzlBRWdCQ2dDK0FFUTBRZ01BQXNBQ3lBSEtBSUlRUUlRMndZaEFTQUVRUUE2QVBBQklBUWdDRFlDN0FFZ0JDQUdOZ0xvQVFOQUlBUkJHR29nQkVIb0FXb1FnZ1VnQkNnQ0dFRUJjVVVOQWlBRUlBUW9BaHdpQWlBR2F5QUJhaUlGUVFoMElBVkJnUDREY1VFSWRuSTdBZVFCSUFSQmlBRnFJZ1VnQkVIa0FXcEJBaEMxQkNBRVFmUUJhaUFFUWNBQmFpQUNJQVVRNHdFZ0JDZ0M5QUVnQkNnQytBRVEwUWdNQUFzQUMwRUFJUUVnQkVFQU9nRDhBU0FFSUFnMkF2Z0JJQVFnQmpZQzlBRURRQ0FFUVNocUlBUkI5QUZxRUlJRklBUW9BaWhCQVhGRkRRRWdCQ2dDTENFSUlBY29BZ2dnQnlnQ0RDQUJRZWlTd0FBUTRBY2lBaTBBQUFSQVFZQ1N3QUFoQlVFZUlRSU1DUXNnQWlnQ0NDRUpJQVJCSUdvZ0FpZ0NEQ0lDUVpUVzBnQVFxUVVnQkNnQ0lDRUdJQVFvQWlRaEJTQUNCRUFnQlNBSklBTDhDZ0FBQ3lBR1FZQ0FnSUI0UmcwSUlBUWdBallDY0NBRUlBVTJBbXdnQkNBR05nSm9JQVJCaUFGcUlBUkJ3QUZxSUFnZ0JFSG9BR29RNHdFZ0JDZ0NpQUVnQkNnQ2pBRVEwUWdnQVVFQmFpRUJEQUFMQUFzZ0MwSUJmQ0VMSUFOQkEyb2hBd3dBQ3dBTElBRXBBd2dpQzBJQUlBdENBRlViSVFzZ0EwRUJhaUVEQTBBZ0MxQU5BVUVkSVFKQjZKUEFBQ0VGSUFRb0FyZ0JJZ1lnQkNnQ3ZBRWlCeUFEUWRpVHdBQVE0QWNpQVMwQUFBMEZJQVlnQnlBRFFRRnFRWWlVd0FBUTRBY2lCaTBBQUEwRklBRW9BZ2dnQVNnQ0RCRGJCaUVGSUFZb0FnZ2hCeUFFUVFocUlBWW9BZ3dpQVVHVTF0SUFFS2tGSUFRb0FnZ2hCaUFFS0FJTUlRSWdBUVJBSUFJZ0J5QUIvQW9BQUFzZ0JDQUJOZ0tRQVNBRUlBSTJBb3dCSUFRZ0JqWUNpQUVnQkVIMEFXb2dCRUhBQVdvZ0JTQUVRWWdCYWhEakFTQUVLQUwwQVNBRUtBTDRBUkRSQ0NBTFFnRjlJUXNnQTBFQ2FpRUREQUFMQUFzZ0EwRUJhaUVEREFBTEFBc2dCRUhRQVdvZ0JFR1lBV29vQWdBMkFnQWdCRUhJQVdvZ0JFR1FBV29wQWdBM0F3QWdCQ0FFS1FLSUFUY0R3QUZCZ00vU0FFRXJJQVJCd0FGcVFlQ0h5Z0JCek1YS0FCQ01CQUFMSUFSQmlBRnFJZ0lnQVNnQ0NDQUJLQUlNRUpFQklBUW9Bb3dCSWdFZ0JDZ0NrQUZCK2NUS0FFRUtFT3dIUlFSQUlBUkJBVFlDeEFFZ0JFRzB4Y29BTmdMQUFTQUVRZ0UzQXN3QklBUkJJellDYkNBRUlBUkI2QUJxTmdMSUFTQUVJQUkyQW1nZ0JFSEFBV3BCdk1YS0FCQ3JCd0FMSUFRb0FvZ0JJQUVROVFrTUFnc2dCRUhBQVdvUWhBTkJBQXNoQXlBRVFiUUJhaEQyQ0FKQUFrQUNRQ0FEQkVBZ0JFSDhBR29nQkVHUUFXb3BBd0EzQWdBZ0JFR0VBV29nQkVHWUFXb29BZ0EyQWdBZ0JDQUNOZ0p3SUFRZ0F6WUNhQ0FFSUFRcEE0Z0JOd0owSUFRZ0JUWUNiQ0FFUVlnQmFoQzlCU0FFSUFRb0FuUWlCallDMkFFZ0JDQUROZ0xRQVNBRUlBTWdCV3BCQVdvMkFzd0JJQVFnQTBFSWFqWUN5QUVnQkNBREtRTUFRbitGUW9DQmdvU0lrS0RBZ0grRE53UEFBUU5BSUFaRkRRUWdCRUhBQVdvUW5RUWhBaUFFSUFRb0F0Z0JRUUZySWdZMkF0Z0JJQUpCRUdzb0FnQWhDU0FFUVFBMkF2QUJJQVJDZ0lDQWdDQTNBdWdCSUFKQkJHc2lCeWdDQUNJQlFRRnhEUU1nQWtFSWF5RUlRUUFoQWtFQ0lRVkJBQ0VEQTBBZ0FTQURUUVJBQWtBZ0FrRUJSZ1JBUVFFaEFpQUZMd0VBUVlEd0EzRkJnTEFEUmcwQkN5QUVRZlFCYWlJQklBVWdBaEI1SUFRb0F2UUJRWUNBZ0lCNFJnMEZJQVJCc0FGcUlBUkIvQUZxS0FJQU5nSUFJQVFnQkNrQzlBRTNBNmdCSUFFZ0JFR0lBV29nQ1NBRVFhZ0JhaERuQVNBRUtBTDBBU0FFS0FMNEFSRGhDQXNnQkNnQzZBRWdCUkR2Q1F3Q0JTQUlLQUlBSUFFZ0EwSDh4Y29BRVA0SExRQUFRUWgwSUFnb0FnQWdCeWdDQUNBRFFRRnFJZ0ZCak1iS0FCRCtCeTBBQUhJaENpQUVLQUxvQVNBQ1JnUkFJQVJCNkFGcVFaekd5Z0FRM2dVZ0JDZ0M3QUVoQlFzZ0F5QUZhaUFLT3dFQUlBUWdBa0VCYWlJQ05nTHdBU0FCUVFGcUlRTWdCeWdDQUNFQkRBRUxBQXNBQ3dBTElBUWdBallDeEFFZ0JDQUZOZ0xBQVVHQXo5SUFRU3NnQkVIQUFXcEIwSWZLQUVIY3hjb0FFSXdFQUF0QmdNL1NBRUVySUFSQnRBRnFRZkNIeWdCQjdNWEtBQkNNQkFBTFFhekd5Z0JCSWtIUXhzb0FFSndHQUFzZ0JFSFlBV29pQVNBRVFhQUJhaWtEQURjREFDQUVRZEFCYWlJQ0lBUkJtQUZxS1FNQU53TUFJQVJCeUFGcUlnTWdCRUdRQVdvcEF3QTNBd0FnQkNBRUtRT0lBVGNEd0FFZ0JFRTRhaENJQ1NBRVFkQUFhaUFCS1FNQU53TUFJQVJCeUFCcUlBSXBBd0EzQXdBZ0JFRkFheUFES1FNQU53TUFJQVFnQkNrRHdBRTNBemdnQkVIb0FHb1FoQU1nQkNnQ1hDQUVLQUpnRVBVSkN5QUFJQVFwQXpnM0F3QWdBRUVZYWlBRVFkQUFhaWtEQURjREFDQUFRUkJxSUFSQnlBQnFLUU1BTndNQUlBQkJDR29nQkVGQWF5a0RBRGNEQUNBRVFZQUNhaVFBQy9jV0FoTi9BMzRqQUVHUUFtc2lBaVFBSUFKQk5Hb2lBeUFCRU5vREFrQWdBaWdDTkVHZmdJQ0FlRWNFUUNBREVNMENJQUJCZzRERUFEWUNDQ0FBUW9LQWdJRHdnSUNBZ0g4M0F3QU1BUXNnQWtIQUFXb2dBaWdDT0NJRlFiQzB5UUJCRHhEUEFRSi9JQUlvQXNBQlFaK0FnSUI0UmdSQUlBSW9Bc1FCREFFTElBSkJ3QUZxRU1zSVFjQzB5UUFMSWdFb0FnQWlBMEVEUndSQUlBSkJLR29nQXhEdEJpQUNJQUlwQXlnM0Fzd0JJQUpCQnpZQ3lBRWdBa0czenNrQU5nTEVBU0FDUVlHQWdJQjROZ0xBQVNBQ1FjQUJhaEROQWlBQVFaQ0F4QUEyQWdnZ0FFS0NnSUNBOElDQWdJQi9Od01BREFFTElBRkJCR290QUFBaEZDQUNRY0FCYWlJQklBVkI1TlRKQUVFR0VNOEJJQUlvQXNBQklRTWdBUkRMQ0NBRFFaK0FnSUI0UndSL1FRQUZJQUpCL0FGcUlBVkI1TlRKQUVFR0VNOEJJQUlvQW9BQ0lRRWdBaWdDL0FFaUJFR2ZnSUNBZUVjRVFDQUFJQUlwQW9RQ053SU1JQUJCRkdvZ0FrR01BbW9vQWdBMkFnQWdBQ0FCTmdJSUlBQWdCRFlDQkNBQVFRSTJBZ0FNQWdzZ0FrSEFBV29nQVNnQ0FDQUJRUWhxS1FNQUVMd0VJQUlvQXNBQlFRRkdCRUFnQWlnQ3hBRWhBU0FDS1FQSUFTRVZJQUFnQWlrRDBBRTNBeEFnQUNBVk53TUlJQUFnQVRZQ0JDQUFRUUkyQWdBTUFnc2dBaWtEeUFFaUZVS0FnSUNBRUZvRVFDQUFRb0tBZ0lEUWc0Q0FnSDgzQXdBTUFnc2dGYWNoREVFQkN5RVJJQUpCeUFCcUlnRWdCVUh5Z000QVFRRVF6d0VnQWlnQ1NFR2ZnSUNBZUVjRVFDQUJFTTBDSUFCQmhJREVBRFlDQ0NBQVFvS0FnSUR3Z0lDQWdIODNBd0FNQVFzZ0FrSEFBV29pQkNBQ0tBSk1JZ0VvQWdBZ0FVRUlhaWtEQUJDOEJDQUNLQUxBQVVFQlJnUkFJQVJCQkhJUXpRSWdBRUdRZ01RQU5nSUlJQUJDZ29DQWdQQ0FnSUNBZnpjREFBd0JDd0pBQWtBQ1FBSkFJQUlwQThnQkloWkNCVmdFUUFKQUFrQUNRQUpBUWdFZ0ZvWkNOb05RQkVBZ0ZsQkZEUUVnQUVHT2dNUUFOZ0lJSUFCQ2dvQ0FnUENBZ0lDQWZ6Y0RBQXdLQ3lBRFFaK0FnSUI0UmlBV1FnSlVjUTBESUJGQkFDQU1RUWR4SUF4QktHdEIyQUJMY2hzTkJTQUNRZHdBYWlJQklBVkI3b0RPQUVFQkVNOEJJQUlvQWx4Qm40Q0FnSGhIQkVBZ0FSRE5BaUFBUVlXQXhBQTJBZ2dnQUVLQ2dJQ0E4SUNBZ0lCL053TUFEQW9MSUFKQndBRnFJZ01nQWlnQ1lDSUJLQUlBSUFGQkNHb3BBd0FRdkFRZ0FpZ0N3QUZCQVVZRVFDQURRUVJ5RU0wQ0lBQkJrSURFQURZQ0NDQUFRb0tBZ0lEd2dJQ0FnSDgzQXdBTUNnc2dBaWtEeUFFaEZTQUNRWVFCYWlJQklBVkI2NERPQUVFQkVNOEJJQUlvQW9RQlFaK0FnSUI0UndSQUlBRVF6UUlnQUVHR2dNUUFOZ0lJSUFCQ2dvQ0FnUENBZ0lDQWZ6Y0RBQXdLQ3lBQ1FmQUFhaUlCSUFJb0FvZ0JFTGdFSUFJb0FuQkJuNENBZ0hoSEJFQWdBUkROQWlBQVFaQ0F4QUEyQWdnZ0FFS0NnSUNBOElDQWdJQi9Od01BREFvTElBSW9BblFoQVNBQ1FTQnFJQUlvQW5naUNFR1UxdElBRUo4RklBSW9BaUFoRWlBQ0tBSWtJUTBnQ0FSQUlBMGdBU0FJL0FvQUFBc2dGVUlFVlEwQklBaEJJRWNOQWd3R0N5QUFRWTZBeEFBMkFnZ2dBRUtDZ0lDQThJQ0FnSUIvTndNQURBZ0xJQWhCTUVZTkJDQUFRWXFBeEFBMkFnZ2dBRUtDZ0lDQThJQ0FnSUIvTndNQURBVUxJQUJCaW9ERUFEWUNDQ0FBUW9LQWdJRHdnSUNBZ0g4M0F3QU1CQXNnQUVHTGdNUUFOZ0lJSUFCQ2dvQ0FnUENBZ0lDQWZ6Y0RBQXdGQ3lBQVFaU0F4QUEyQWdnZ0FFS0NnSUNBOElDQWdJQi9Od01BREFRTElBQkJpNERFQURZQ0NDQUFRb0tBZ0lEd2dJQ0FnSDgzQXdBTUF3c2dBa0hBQVdvaUFTQUZRZVNFemdCQkFoRFBBU0FDUWZ3QmFpQUJFT2NGQWtBZ0FpZ0MvQUZCbjRDQWdIaEhCRUFnQWtIUUFXb2dBa0dNQW1vb0FnQTJBZ0FnQWtISUFXb2dBa0dFQW1vcEFnQTNBd0FnQWlBQ0tRTDhBVGNEd0FFTUFRc2dBaWdDZ0FJaEJDQUNRUmhxSUFJb0FvUUNJZ0ZCbE5iU0FCQ2ZCU0FDS0FJWUlRWWdBaWdDSENFRElBRUVRQ0FESUFRZ0Fmd0tBQUFMSUFJZ0FUWUN6QUVnQWlBRE5nTElBU0FDSUFZMkFzUUJJQUpCbjRDQWdIZzJBc0FCQ3lBQ1FmQUJhaUFDUWNBQmFoRGVCZ0pBQWtBQ1FBSkFJQUlvQXZBQklnNUJnSUNBZ0hoSEJFQWdBaWdDK0FFaEF5QUNLQUwwQVNFUElCVkNCRlVOQVNBRElRRU1Bd3RCQUNFT1FRRWhEMEVBSVFFZ0ZVSUVWdzBDREFFTFFTQWhBU0FEUVNCR0RRRUxJQUJCaklERUFEWUNDQ0FBUW9LQWdJRHdnSUNBZ0g4M0F3QU1BUXNnQWtHc0FXb2lBeUFGUWZHQXpnQkJBUkRQQVNBQ0tBS3NBVUdmZ0lDQWVFY0VRQ0FERU0wQ0lBQkJoNERFQURZQ0NDQUFRb0tBZ0lEd2dJQ0FnSDgzQXdBTUFRc2dBa0dZQVdvaUF5QUNLQUt3QVJDNEJDQUNLQUtZQVVHZmdJQ0FlRWNFUUNBREVNMENJQUJCa0lERUFEWUNDQ0FBUW9LQWdJRHdnSUNBZ0g4M0F3QU1BUXNnQWlnQ25BRWhBeUFDUVJCcUlBSW9BcUFCSWdaQmxOYlNBQkNmQlNBQ0tBSVFJUk1nQWlnQ0ZDRVFJQVlFUUNBUUlBTWdCdndLQUFBTEFrQUNRQUpBSUJWQ0JGY0VRQ0FHUVNCSERRRU1BZ3NnQmtFd1JnMEJJQUJCaW9ERUFEWUNDQ0FBUW9LQWdJRHdnSUNBZ0g4M0F3QU1BZ3NnQUVHS2dNUUFOZ0lJSUFCQ2dvQ0FnUENBZ0lDQWZ6Y0RBQXdCQ3lBQ1FjQUJhaUlESUFWQjg3WEpBRUVDRU04QklBSkIvQUZxSUFNUTV3VUNRQ0FDS0FMOEFVR2ZnSUNBZUVjRVFDQUNRZEFCYWlBQ1FZd0NhaWdDQURZQ0FDQUNRY2dCYWlBQ1FZUUNhaWtDQURjREFDQUNJQUlwQXZ3Qk53UEFBUXdCQ3lBQ0tBS0FBaUVKSUFKQkNHb2dBaWdDaEFJaUEwR1UxdElBRUo4RklBSW9BZ2doQ2lBQ0tBSU1JUVFnQXdSQUlBUWdDU0FEL0FvQUFBc2dBaUFETmdMTUFTQUNJQVEyQXNnQklBSWdDallDeEFFZ0FrR2ZnSUNBZURZQ3dBRUxJQUpCOEFGcUlBSkJ3QUZxRU40R0FrQUNRQUpBQWtBZ0FpZ0M4QUVpQ1VHQWdJQ0FlRWNFUUNBQ0tBTDRBU0VFSUFJb0F2UUJJUW9nRlVJRVZRMEJJQVFoQXd3REMwRUFJUWxCQVNFS1FRQWhBeUFWUWdSWERRSU1BUXRCSUNFRElBUkJJRVlOQVFzZ0FFR01nTVFBTmdJSUlBQkNnb0NBZ1BDQWdJQ0FmemNEQUF3QkN5QUNRZHdCYWlJRUlBVkI3SURPQUVFQkVNOEJJQUlvQXR3QlFaK0FnSUI0UndSQUlBUVF6UUlnQUVHSWdNUUFOZ0lJSUFCQ2dvQ0FnUENBZ0lDQWZ6Y0RBQXdCQ3lBQ1FjQUJhaUlISUFJb0F1QUJJZ1FvQWdBZ0JFRUlhaWtEQUJDOEJDQUNLQUxBQVVFQlJnUkFJQWRCQkhJUXpRSWdBRUdRZ01RQU5nSUlJQUJDZ29DQWdQQ0FnSUNBZnpjREFBd0JDeUFDS1FQSUFTRVhJQUpCd0FGcUlnUWdCVUgxdGNrQVFRVVF6d0VnQWtIOEFXb2dCQkRuQlFKQUlBSW9BdndCUVorQWdJQjRSd1JBSUFKQjBBRnFJQUpCakFKcUtBSUFOZ0lBSUFKQnlBRnFJQUpCaEFKcUtRSUFOd01BSUFJZ0Fpa0MvQUUzQThBQkRBRUxJQUlvQW9BQ0lRY2dBaUFDS0FLRUFpSUVRWlRXMGdBUW53VWdBaWdDQUNFTElBSW9BZ1FoQlNBRUJFQWdCU0FISUFUOENnQUFDeUFDSUFRMkFzd0JJQUlnQlRZQ3lBRWdBaUFMTmdMRUFTQUNRWitBZ0lCNE5nTEFBUXNnQWtId0FXb2dBa0hBQVdvUTNnWUNRQUpBSUFJb0F2QUJJZ2RCZ0lDQWdIaEhCRUFnQWlnQytBRWhCU0FDS0FMMEFTRUxJQlZDQkZVTkFTQUZJUVFNQnd0QkFDRUhRUUVoQzBFQUlRUWdGVUlFVlEwQkRBWUxRUkFoQkNBRlFSQkdEUVVMSUFCQmpJREVBRFlDQ0NBQVFvS0FnSUR3Z0lDQWdIODNBd0FnQnlBTEVLa0pDeUFKSUFvUXFRa0xJQk1nRUJDcENRc2dEaUFQRUtrSkN5QVNJQTBRcVFrTUFRc2dBQ0FFTmdKWUlBQWdDellDVkNBQUlBYzJBbEFnQUNBRE5nSk1JQUFnQ2pZQ1NDQUFJQWsyQWtRZ0FDQUdOZ0pBSUFBZ0VEWUNQQ0FBSUJNMkFqZ2dBQ0FCTmdJMElBQWdEellDTUNBQUlBNDJBaXdnQUNBSU5nSW9JQUFnRFRZQ0pDQUFJQkkyQWlBZ0FDQVVPZ0JjSUFBZ0YwSzhIb00zQXhnZ0FDQVZOd01RSUFBZ0ZqY0RDQ0FBSUF3MkFnUWdBQ0FSTmdJQUN5QUNRWkFDYWlRQUM2b1JBaUovQW40akFFSFFBV3NpQXlRQUlBTkJCRUVFUVF4QjlLekpBQkNhQlNBRFFld0FhaUVKSUFOQnBBRnFJUkVnQTBIb0FHb2hFaUFCS0FJc0lSVWdBU2dDS0NFV0lBRW9BaVFoRnlBQktBSWdJUmdnQVNnQ0hDRVpJQUVvQWhnaEdpQUJLQUlVSVJzZ0FTZ0NFQ0VjSUFFb0Fnd2hIU0FCS0FJSUlSNGdBU2dDQkNFZklBRW9BZ0FoSUNBQ0tBSU1JUXdnQWlnQ0NDRUdJQUlvQWdBaEJDQUNLQUlVSVFVZ0FpZ0NFQ0VISUFJb0FnUWhDeUFES0FJRUlRMGdBeWdDQUNFT0lBTkI3d0JxSVNFQ1FBSkFBa0FDUUFKQUEwQWdBeUFGTmdJY0lBTWdCellDR0NBRElBdzJBaFFnQXlBR05nSVFJQU1nQ3pZQ0RDQURJQVEyQWdnZ0EwSGdBR29nQTBFSWFoQ0xBaUFES0FKOElRZ2dBeWdDZUNFSElBTW9BblFoQkNBREtRSnNJU1VnQXlnQ2FDRUZJQU1vQW1RaEFRSkFBa0FnQXlnQ1lBUkFJQWdoQmd3QkN5QURJQWMyQXBRQklBTWdCRFlDa0FFZ0F5QWxOd0tJQVNBRElBVTJBb1FCSUFNZ0FUWUNnQUVnQTBIZ0FHb2dJQ0FmSUFOQmdBRnFFSllDSUFOQndBRnFJZ1lnRWtFSWFpZ0NBRFlDQUNBRElCSXBBZ0EzQTdnQklBTW9BblFoQnlBREtBSmtJUVVnQXlnQ1lDRUJBa0FDZnlBRExRQjRJZ1JCTzBjRVFDQURRZEFBYWlBR0tBSUFOZ0lBSUFNZ0F5a0R1QUUzQTBnZ0EwSDdBR290QUFCQkdIUWdBeThBZVVFSWRISWdCSElNQVFzZ0VTQURLUU80QVRjQ0FDQVJRUWhxSUFZb0FnQTJBZ0FnQXlBRk5nS2dBU0FESUFFMkFwd0JJQU1nQnpZQ3NBRWdBMEhnQUdvZ0EwR2NBV29RaXdJZ0EwSFFBR29pQmlBSlFRaHFJaUlvQWdBMkFnQWdBeUFKS1FJQU53TklJQU1vQW1naEJTQURLQUprSVFFZ0F5Z0NlQ0VFSUFNb0Fud2hEQ0FES0FKZ1FRRkhEUUVnQkNFSElBd0xJUVlnQTBIUUFHb29BZ0FoQkNBREtRTklJU1VNQVFzZ0EwRkFheUFHS0FJQU5nSUFJQU1nQXlrRFNDSW1Od000SUFNcEFqd2hKU0FtcHlFS0lBRU5BU0FJSVFjZ0RDRUdJQVVoQVNBS0lRVUxJQVpCQ0hZaENRd0VDeUFESUFRMkFqUWdBeUFsTndJc0lBTWdDallDS0NBRElBVTJBaVFnQXlBQk5nSWdJQU5CNEFCcUlCNGdIU0FEUVNCcUVKWUNJQU1vQW5RaEJ5QURLQUp3SVFRZ0F5a0NhQ0VsSUFNb0FtUWhCU0FES0FKZ0lRRWdBeTBBZUNJR1FUdEhCRUFnQXk4QWVTQURRZnNBYWkwQUFFRVFkSEloQ1F3RUN5QURJQWMyQWx3Z0F5QUVOZ0pZSUFNZ0pUY0NVQ0FESUFVMkFrd2dBeUFCTmdKSUlBTkI0QUJxSUJ3Z0d5QURRY2dBYWhDdUFTQURLQUo0SVFjZ0F5Z0NkQ0VFSUFNcEFtd2hKU0FES0FKb0lRVWdBeWdDWkNFQklBTW9BbUJCQVVZRVFDQURMd0I5SUFOQi93QnFMUUFBUVJCMGNpRUpJQU10QUh3aEJnd0VDeUFES0FKOElTTWdBeUFITmdMTUFTQURJQVEyQXNnQklBTWdKVUlnaUtjaUNqWUN4QUVnQXlBbHB5SVROZ0xBQVNBRElBVTJBcndCSUFNZ0FUWUN1QUVnQTBHQUFXb2dHaUFaSUFOQnVBRnFJaVFRbGdJZ0N3Si9JQU10QUpnQklnWkJPMGNFUUVFQ0lBWkJPV3NpRUNBUVFRSlBHMEVCYXcwRUlBTWdCellDekFFZ0F5QUVOZ0xJQVNBRElBbzJBc1FCSUFNZ0V6WUN3QUVnQXlBRk5nSzhBU0FESUFFMkFyZ0JJQU5CbkFGcUlCZ2dGeUFrRUpZQ0FrQWdBeTBBdEFFaUJrRTdSd1JBUVFJZ0JrRTVheUlRSUJCQkFrOGJRUUZyQkVBTUJnVU1BZ3NBQ3lBRFFad0JhaUVFSUFNb0FyQUJJUVVnQXlnQ3JBRWhCeUFES1FLa0FTRWxJQU1vQXFBQkRBSUxJQU1nQnpZQ3pBRWdBeUFFTmdMSUFTQURJQW8yQXNRQklBTWdFellDd0FFZ0F5QUZOZ0s4QVNBRElBRTJBcmdCSUFOQjRBQnFJQllnRlNBRFFiZ0JhaENXQWdKL0FrQUNRQ0FETFFCNElncEJPMGNFUUVFNklRWkJBaUFLUVRscklnZ2dDRUVDVHh0QkFXc09BZ2tDQVFzZ0EwSGdBR29oQkNBREtBSjBJUVVnQXlnQ2NDRUhJQU1wQW1naEpTQURLQUprREFRTElBTXZBSGtnQTBIN0FHb3RBQUJCRUhSeURBRUxJQU12QUhrZ0EwSDdBR290QUFCQkVIUnlDeUVKSUFNb0FuUWhCeUFES0FKd0lRUWdBeWtDYUNFbElBTW9BbVFoQlNBREtBSmdJUUVnQ2lFR0RBVUxJQU5CZ0FGcUlRUWdBeWdDbEFFaEJTQURLQUtRQVNFSElBTXBBb2dCSVNVZ0F5Z0NoQUVMSWdGSEJFQWdCQ2dDQUNFRUlBSWdCVFlDRkNBQ0lBYzJBaEFnQWlBbE53SUlJQUlnQVRZQ0JDQUNJQVEyQWdBZ0F5QUlPZ0JzSUNFZ0NFRVlkam9BQUNBRElDTkI3Z0JHT2dCMElBTWdERFlDY0NBRElBMDJBbVFnQXlBSVFRaDJPd0J0SUFNZ0RqWUNZQ0FESUE4MkFtZ2dKYWNoQmlBbFFpQ0lweUVNSUE0Z0QwWUVmeU1BUVJCcklnZ2tBQ0FJUVFocUlBTkI0QUJxSWdzZ0N5Z0NBRUVCUVFSQkRCQ0lBaUFJS0FJSUlndEJnWUNBZ0hoSEJFQWdDeUFJS0FJTVFZU3R5UUFRekFnQUN5QUlRUkJxSkFBZ0F5Z0NaQVVnRFFzZ0ZHb2lDQ0FKS1FJQU53SUFJQWhCQ0dvZ0lpZ0NBRFlDQUNBVVFReHFJUlFnRDBFQmFpRVBJQU1vQW1BaERpQURLQUprSVEwZ0FTRUxEQUVMQ3lBQVFRZzZBQ0FnQUVFQk5nSUVJQUFnQWlrQ0FEY0NDQ0FBUVJocUlBSkJFR29wQWdBM0FnQWdBRUVRYWlBQ1FRaHFLUUlBTndJQURBTUxJQU12QUxVQklBTkJ0d0ZxTFFBQVFSQjBjaUVKSUFNb0FyQUJJUWNnQXlnQ3JBRWhCQ0FES1FLa0FTRWxJQU1vQXFBQklRVWdBeWdDbkFFaEFRd0JDeUFETHdDWkFTQURRWnNCYWkwQUFFRVFkSEloQ1NBREtBS1VBU0VISUFNb0FwQUJJUVFnQXlrQ2lBRWhKU0FES0FLRUFTRUZJQU1vQW9BQklRRUxBa0FDUUFKQVFRSWdCa0U1YTBIL0FYRWlDQ0FJUVFKUEcwRUJhdzRDQWdFQUN5QUFJQUUyQWdnZ0FFRUFOZ0lFREFJTElBQWdDVHNBSVNBQUlBWTZBQ0FnQUNBSE5nSWNJQUFnQkRZQ0dDQUFJQ1UzQWhBZ0FDQUZOZ0lNSUFBZ0FUWUNDQ0FBUVFJMkFnUWdBRUVqYWlBSlFSQjJPZ0FBREFFTElBQWdEellDSkNBQUlBMDJBaUFnQUNBT05nSWNJQUJCQURZQ0FDQUFJQUlwQWdBM0FnUWdBRUVVYWlBQ1FSQnFLUUlBTndJQUlBQkJER29nQWtFSWFpa0NBRGNDQUF3QkN5QUFRUUUyQWdBZ0RpQU5FS2NKQ3lBRFFkQUJhaVFBQy80T0FRMS9Jd0JCTUdzaUN5UUFJQUpCREdzaEVnSkFBa0FDUUFOQUFrQUNRQUpBSUFGQklVOEVRQ0FFRFFFZ0FDQUJJQUlnQTBFQkVEZ01Cd3NnQVVFQ1NRMEdJQU1nQVVFUWFra05CQ0FCUVFGMklRTWdBVUVQU3cwQklBSWdBMEVNYkNJRmFpRUVJQUFnQldvaEJTQUJRUWRMQkVBZ0FDQUNFS29DSUFVZ0JCQ3FBa0VFSVFrTUJnc2dBaUFBS1FJQU53SUFJQUpCQ0dvZ0FFRUlhaWdDQURZQ0FDQUVJQVVwQWdBM0FnQWdCRUVJYWlBRlFRaHFLQUlBTmdJQVFRRWhDUXdGQ3lBQUlBRkJBM1lpQ1VIVUFHeHFJUWNnQUNBSlFUQnNhaUVNSUFSQkFXc2hCQ0FMUVJCcUFuOGdBVUhBQUU4RVFDQUFJQXdnQnlBSkVOSUREQUVMSUFBZ0J5QU1JQUFvQWdBaUNTQU1LQUlBSWd4SklnWWdEQ0FIS0FJQUlnZEpjeHNnQmlBSElBbExjeHNMSWdwQkNHb29BZ0EyQWdBZ0N5QUtLUUlBTndNSUlBb2dBR3RCREc0aERDQUZCRUFnQlNnQ0FDQUtLQUlBVHcwQ0N5QUJJQU5MRFFNZ0FpQUJRUXhzSWc5cUlRaEJBQ0VISUFBaEJpQU1JUWtEUUNBQUlBbEJBMnNpRFVFQUlBa2dEVThiUVF4c2FpRU5BMEFnQmlBTlQwVUVRQ0FIUVF4c0lBSWdDRUVNYXlBR0tBSUFJQW9vQWdCSklnNGJhaUlRSUFZcEFnQTNBZ0FnRUVFSWFpQUdRUWhxS0FJQU5nSUFJQWNnRG1vaUIwRU1iQ0FDSUFoQkdHc2dCa0VNYWlJT0tBSUFJQW9vQWdCSkloQWJhaUlSSUE0cEFnQTNBZ0FnRVVFSWFpQUdRUlJxS0FJQU5nSUFJQWNnRUdvaUIwRU1iQ0FDSUFoQkpHc2dCa0VZYWlJT0tBSUFJQW9vQWdCSkloQWJhaUlSSUE0cEFnQTNBZ0FnRVVFSWFpQUdRU0JxS0FJQU5nSUFJQWNnRUdvaUIwRU1iQ0FDSUFoQk1Hc2lDQ0FHUVNScUlnNG9BZ0FnQ2lnQ0FFa2lFQnRxSWhFZ0Rpa0NBRGNDQUNBUlFRaHFJQVpCTEdvb0FnQTJBZ0FnQnlBUWFpRUhJQVpCTUdvaEJnd0JDd3NnQUNBSlFReHNhaUVOQTBBZ0JpQU5Ud1JBSUFFZ0NVY0VRQ0FJUVF4cklnZ2dCMEVNYkdvaUNTQUdLUUlBTndJQUlBbEJDR29nQmtFSWFpZ0NBRFlDQUNBR1FReHFJUVlnQVNFSkRBTUxJQWRCREd3aUNBUkFJQUFnQWlBSS9Bb0FBQXNnRHlBU2FpRUdJQWNoQ1NBQUlBaHFJZzhoQ0FOQUlBRWdDVVpGQkVBZ0NDQUdLUUlBTndJQUlBaEJDR29nQmtFSWFpZ0NBRFlDQUNBSlFRRnFJUWtnQmtFTWF5RUdJQWhCREdvaENBd0JDd3NnQjBVTkJDQUJJQWRKQkVBZ0MwRUFOZ0lvSUF0QkFUWUNIQ0FMUWRqTTJnQTJBaGdnQzBJRU53SWdJQXRCR0dwQmhKelNBQkNyQndBTElBOGdBU0FIYXlBQ0lBTWdCQ0FMUVFocUVCOGdCeUVCREFVRklBZEJER3dnQWlBSVFReHJJZ2dnQmlnQ0FDQUtLQUlBU1NJT0cyb2lFQ0FHS1FJQU53SUFJQkJCQ0dvZ0JrRUlhaWdDQURZQ0FDQUdRUXhxSVFZZ0J5QU9haUVIREFFTEFBc0FDd0FMSUFBZ0FpQUNJQUZCREd4cUlnUVE5d2NnQUNBRFFReHNJZ1ZxSUFJZ0JXb2dCRUhnQUdvUTl3ZEJDQ0VKREFNTElBRWdBMHNOQVNBQ0lBRkJER3dpQ1dvaENFRUFJUWNnQUNFR0EwQWdBQ0FNUVFOcklnVkJBQ0FGSUF4TkcwRU1iR29oQlFOQUlBVWdCazFGQkVBZ0IwRU1iQ0FDSUFoQkRHc2dDaWdDQUNBR0tBSUFUeUlQRzJvaURTQUdLUUlBTndJQUlBMUJDR29nQmtFSWFpZ0NBRFlDQUNBSElBOXFJZ2RCREd3Z0FpQUlRUmhySUFvb0FnQWdCa0VNYWlJUEtBSUFUeUlORzJvaURpQVBLUUlBTndJQUlBNUJDR29nQmtFVWFpZ0NBRFlDQUNBSElBMXFJZ2RCREd3Z0FpQUlRU1JySUFvb0FnQWdCa0VZYWlJUEtBSUFUeUlORzJvaURpQVBLUUlBTndJQUlBNUJDR29nQmtFZ2FpZ0NBRFlDQUNBSElBMXFJZ2RCREd3Z0FpQUlRVEJySWdnZ0NpZ0NBQ0FHUVNScUlnOG9BZ0JQSWcwYmFpSU9JQThwQWdBM0FnQWdEa0VJYWlBR1FTeHFLQUlBTmdJQUlBY2dEV29oQnlBR1FUQnFJUVlNQVFzTElBQWdERUVNYkdvaEJRTkFJQVVnQmswRVFBSkFJQUVnREVjRVFDQUNJQWRCREd4cUlnVWdCaWtDQURjQ0FDQUZRUWhxSUFaQkNHb29BZ0EyQWdBZ0JrRU1haUVHSUFkQkFXb2hCeUFJUVF4cklRZ2dBU0VNREFRTElBZEJER3dpQlFSQUlBQWdBaUFGL0FvQUFBc2dDU0FTYWlFR0lBRWdCMnNpRENFS0lBQWdCV29pQUNFSUEwQWdDZ1JBSUFnZ0Jpa0NBRGNDQUNBSVFRaHFJQVpCQ0dvb0FnQTJBZ0FnQ2tFQmF5RUtJQVpCREdzaEJpQUlRUXhxSVFnTUFRc0xJQUVnQjBrTkFFRUFJUVVnRENFQkRBUUxCU0FIUVF4c0lBSWdDRUVNYXlJSUlBb29BZ0FnQmlnQ0FFOGlEeHRxSWcwZ0Jpa0NBRGNDQUNBTlFRaHFJQVpCQ0dvb0FnQTJBZ0FnQmtFTWFpRUdJQWNnRDJvaEJ3d0JDd3NMQ3lBSElBRkJsSnpTQUJDNUNRQUxBQXNnQzBLQWdJQ0FJRGNDR0NBTFFRQTJBaUJCQUNBSmF5RUZJQUFnQ1VFTWJDSUVhaUVNSUFJZ0JHb2hDaUFMSUFNMkFpUWdBU0FEYXlFU0EwQUNRQ0FMSUF0QkdHb1Eyd1VnQ3lnQ0FFRUJjVVVOQUNBRklCSWdBeUFMS0FJRUlnUWJJZ2NnQ1NBSElBbExHMm9oQnlBTUlBUkJER3dpQkdvaENDQUVJQXBxSVFZZ0FpQUVhaUVFQTBBZ0IwVU5BaUFHSUFncEFnQTNBZ0FnQmtFSWFpQUlRUWhxS0FJQU5nSUFJQVFnQmhEREJDQUhRUUZySVFjZ0NFRU1haUVJSUFaQkRHb2hCZ3dBQ3dBTEN5QUNJQUVnQUJEYkFRc2dDMEV3YWlRQUM1ME5BUTEvSXdCQmdBRnJJZ3NrQUNBQ1FkQUFheUVRQWtBRFFBSkFBa0FnQVVFaFR3UkFJQVFOQVNBQUlBRWdBaUFEUVFFUU13d0VDeUFCUVFKSkRRTWdBeUFCUVJCcVNRMEJJQUlnQVVFQmRpSUVRZEFBYkNJRGFpRUtJQUFnQTJvaEF3Si9JQUZCQjBzRVFDQUFJQUlRdVFFZ0F5QUtFTGtCUVFRTUFRdEJBQ0lGUlFSQUlBSWdBRUhRQVB3S0FBQUxJQVZGQkVBZ0NpQURRZEFBL0FvQUFBdEJBUXNoQXlBTFFvQ0FnSUFnTndJWUlBdEJBRFlDSUVFQUlBTnJJUTBnQUNBRFFkQUFiQ0lGYWlFTUlBSWdCV29oQ1NBTElBUTJBaVFnQVNBRWF5RU9BMEFDUUNBTFFRaHFJQXRCR0dvUTJ3VWdDeWdDQ0VFQmNVVU5BQ0FOSUE0Z0JDQUxLQUlNSWdVYklnWWdBeUFESUFaSkcyb2hDQ0FNSUFWQjBBQnNJZ1ZxSVFjZ0JTQUphaUVHSUFJZ0JXb2hCUU5BSUFoRkRRSWdCaUFIUWRBQS9Bb0FBQ0FGSUFZUXJnSWdDRUVCYXlFSUlBZEIwQUJxSVFjZ0JrSFFBR29oQmd3QUN3QUxDeUFLUWRBQWF5RUdJQUFnQVVIUUFHeEIwQUJySWdWcUlRTWdBaUFGYWlFSUEwQWdCRVVFUUNBR1FkQUFhaUVESUFGQkFYRUVmeUFBSUFJZ0NpQUNJQU5KSWdFYlFkQUEvQW9BQUNBS0lBSWdBMDlCMEFCc2FpRUtJQUlnQVVIUUFHeHFCU0FDQ3lBRFJpQUtJQWhCMEFCcVJuRU5CUkRyQmdBTEFuOGdDaWdDQUNJRklBSW9BZ0FpQjBjRVFDQUZJQWRKREFFTElBb3ZBUVFnQWk4QkJFa0xJUWRCQUNJRlJRUkFJQUFnQ2lBQ0lBY2JRZEFBL0FvQUFBc0NmeUFJS0FJQUlnMGdCaWdDQUNJTVJ3UkFJQXdnRFVzTUFRc2dDQzhCQkNBR0x3RUVTUXNoQ1NBRlJRUkFJQU1nQmlBSUlBa2JRZEFBL0FvQUFBc2dBRUhRQUdvaEFDQUhRZEFBYkNBS2FpRUtJQWRCQVhOQjBBQnNJQUpxSVFJZ0JFRUJheUVFSUFOQjBBQnJJUU1nQmlBSlFiQi9iR29oQmlBSlFkQUFiQ0FJYWtIUUFHc2hDQXdBQ3dBTElBQWdBVUVEZGlJSFFiQUViR29oQmlBQUlBZEJ3QUpzYWlFTkFuOGdBVUhBQUU4RVFDQUFJQTBnQmlBSEVNc0NEQUVMSUFBQ2Z5QUFLQUlBSWdjZ0RTZ0NBQ0lNUndSQUlBY2dERWtNQVFzZ0FDOEJCQ0FOTHdFRVNRc2lDUUovSUFZb0FnQWlDQ0FIUndSQUlBY2dDRWtNQVFzZ0FDOEJCQ0FHTHdFRVNRdEhEUUFhSUFZZ0RTQUlJQXhIQkg4Z0NDQU1Td1VnRFM4QkJDQUdMd0VFU1FzZ0NYTWJDeUVLUVFCRkJFQWdDMEVZYWlBS1FkQUEvQW9BQUFzZ0JFRUJheUVFSUFvZ0FHdEIwQUJ1SVEwQ1FBSkFJQVZGRFFBZ0JTZ0NBQ0lHSUFvb0FnQWlCMFlFUUNBRkx3RUVJQW92QVFSSkRRRU1BZ3NnQmlBSFR3MEJDeUFCSUFOTERRRWdBaUFCUWRBQWJDSVBhaUVJUVFBaEJ5QUFJUVlnRFNFTUEwQWdBQ0FNUWRBQWJHb2hFUU5BQWtBZ0JpQVJUd1JBSUFFZ0RFWU5BU0FJUWRBQWF5RUlJQTVGQkVBZ0NDQUhRZEFBYkdvZ0JrSFFBUHdLQUFBTElBWkIwQUJxSVFZZ0FTRU1EQU1MQW44Z0JpZ0NBQ0lKSUFvb0FnQWlFa2NFUUNBSklCSkpEQUVMSUFaQkJHb3ZBUUFnQ2k4QkJFa0xJUWtnQ0VIUUFHc2hDQ0FPUlFSQUlBZEIwQUJzSUFJZ0NDQUpHMm9nQmtIUUFQd0tBQUFMSUFaQjBBQnFJUVlnQnlBSmFpRUhEQUVMQ3dzZ0IwSFFBR3dpREFSQUlBQWdBaUFNL0FvQUFBc2dEeUFRYWlFSUlBY2hCaUFBSUF4cUlnd2hDUU5BSUFFZ0JrY0VRQ0FPUlFSQUlBa2dDRUhRQVB3S0FBQUxJQVpCQVdvaEJpQUlRZEFBYXlFSUlBbEIwQUJxSVFrTUFRc0xJQWRGRFFBZ0FTQUhTUVJBSUF0QkFEWUNlQ0FMUVFFMkFtd2dDMEhZek5vQU5nSm9JQXRDQkRjQ2NDQUxRZWdBYWtHRW5OSUFFS3NIQUFzZ0RDQUJJQWRySUFJZ0F5QUVJQXRCR0dvUUlDQUhJUUVNQWdzZ0FTQURTdzBBSUFJZ0FVSFFBR3dpREdvaEIwRUFJUWdnQUNFR0EwQWdBQ0FOUWRBQWJHb2hCUU5BQWtBZ0JTQUdUUVJBSUFFZ0RVWU5BU0FPUlFSQUlBSWdDRUhRQUd4cUlBWkIwQUQ4Q2dBQUN5QUdRZEFBYWlFR0lBaEJBV29oQ0NBSFFkQUFheUVISUFFaERRd0RDd0ovSUFvb0FnQWlDU0FHS0FJQUlnOUhCRUFnQ1NBUFNRd0JDeUFLTHdFRUlBWkJCR292QVFCSkN5RUpJQWRCMEFCcklRY2dEa1VFUUNBSVFkQUFiQ0FISUFJZ0NSdHFJQVpCMEFEOENnQUFDeUFHUWRBQWFpRUdJQWdnQ1VFQmMyb2hDQXdCQ3dzTElBaEIwQUJzSWdVRVFDQUFJQUlnQmZ3S0FBQUxJQUVnQ0dzaEJpQU1JQkJxSVFjZ0FDQUZhaUVKQTBBZ0JnUkFJQTVGQkVBZ0NTQUhRZEFBL0FvQUFBc2dCa0VCYXlFR0lBZEIwQUJySVFjZ0NVSFFBR29oQ1F3QkN3c2dDMEVRYWlBSUlBQWdBUkNBQnlBTEtBSVVJUUVnQ3lnQ0VDRUFRUUFoQlF3QkN3c0FDeUFMUVlBQmFpUUFDNTBOQVExL0l3QkJnQUZySWdza0FDQUNRZEFBYXlFUUFrQURRQUpBQWtBZ0FVRWhUd1JBSUFRTkFTQUFJQUVnQWlBRFFRRVFOQXdFQ3lBQlFRSkpEUU1nQXlBQlFSQnFTUTBCSUFJZ0FVRUJkaUlFUWRBQWJDSURhaUVLSUFBZ0Eyb2hBd0ovSUFGQkIwc0VRQ0FBSUFJUXVRRWdBeUFLRUxrQlFRUU1BUXRCQUNJRlJRUkFJQUlnQUVIUUFQd0tBQUFMSUFWRkJFQWdDaUFEUWRBQS9Bb0FBQXRCQVFzaEF5QUxRb0NBZ0lBZ053SVlJQXRCQURZQ0lFRUFJQU5ySVEwZ0FDQURRZEFBYkNJRmFpRU1JQUlnQldvaENTQUxJQVEyQWlRZ0FTQUVheUVPQTBBQ1FDQUxRUWhxSUF0QkdHb1Eyd1VnQ3lnQ0NFRUJjVVVOQUNBTklBNGdCQ0FMS0FJTUlnVWJJZ1lnQXlBRElBWkpHMm9oQ0NBTUlBVkIwQUJzSWdWcUlRY2dCU0FKYWlFR0lBSWdCV29oQlFOQUlBaEZEUUlnQmlBSFFkQUEvQW9BQUNBRklBWVFyZ0lnQ0VFQmF5RUlJQWRCMEFCcUlRY2dCa0hRQUdvaEJnd0FDd0FMQ3lBS1FkQUFheUVHSUFBZ0FVSFFBR3hCMEFCcklnVnFJUU1nQWlBRmFpRUlBMEFnQkVVRVFDQUdRZEFBYWlFRElBRkJBWEVFZnlBQUlBSWdDaUFDSUFOSklnRWJRZEFBL0FvQUFDQUtJQUlnQTA5QjBBQnNhaUVLSUFJZ0FVSFFBR3hxQlNBQ0N5QURSaUFLSUFoQjBBQnFSbkVOQlJEckJnQUxBbjhnQ2lnQ0FDSUZJQUlvQWdBaUIwY0VRQ0FGSUFkSkRBRUxJQW92QVFRZ0FpOEJCRWtMSVFkQkFDSUZSUVJBSUFBZ0NpQUNJQWNiUWRBQS9Bb0FBQXNDZnlBSUtBSUFJZzBnQmlnQ0FDSU1Sd1JBSUF3Z0RVc01BUXNnQ0M4QkJDQUdMd0VFU1FzaENTQUZSUVJBSUFNZ0JpQUlJQWtiUWRBQS9Bb0FBQXNnQUVIUUFHb2hBQ0FIUWRBQWJDQUthaUVLSUFkQkFYTkIwQUJzSUFKcUlRSWdCRUVCYXlFRUlBTkIwQUJySVFNZ0JpQUpRYkIvYkdvaEJpQUpRZEFBYkNBSWFrSFFBR3NoQ0F3QUN3QUxJQUFnQVVFRGRpSUhRYkFFYkdvaEJpQUFJQWRCd0FKc2FpRU5BbjhnQVVIQUFFOEVRQ0FBSUEwZ0JpQUhFTXNDREFFTElBQUNmeUFBS0FJQUlnY2dEU2dDQUNJTVJ3UkFJQWNnREVrTUFRc2dBQzhCQkNBTkx3RUVTUXNpQ1FKL0lBWW9BZ0FpQ0NBSFJ3UkFJQWNnQ0VrTUFRc2dBQzhCQkNBR0x3RUVTUXRIRFFBYUlBWWdEU0FJSUF4SEJIOGdDQ0FNU3dVZ0RTOEJCQ0FHTHdFRVNRc2dDWE1iQ3lFS1FRQkZCRUFnQzBFWWFpQUtRZEFBL0FvQUFBc2dCRUVCYXlFRUlBb2dBR3RCMEFCdUlRMENRQUpBSUFWRkRRQWdCU2dDQUNJR0lBb29BZ0FpQjBZRVFDQUZMd0VFSUFvdkFRUkpEUUVNQWdzZ0JpQUhUdzBCQ3lBQklBTkxEUUVnQWlBQlFkQUFiQ0lQYWlFSVFRQWhCeUFBSVFZZ0RTRU1BMEFnQUNBTVFkQUFiR29oRVFOQUFrQWdCaUFSVHdSQUlBRWdERVlOQVNBSVFkQUFheUVJSUE1RkJFQWdDQ0FIUWRBQWJHb2dCa0hRQVB3S0FBQUxJQVpCMEFCcUlRWWdBU0VNREFNTEFuOGdCaWdDQUNJSklBb29BZ0FpRWtjRVFDQUpJQkpKREFFTElBWkJCR292QVFBZ0NpOEJCRWtMSVFrZ0NFSFFBR3NoQ0NBT1JRUkFJQWRCMEFCc0lBSWdDQ0FKRzJvZ0JrSFFBUHdLQUFBTElBWkIwQUJxSVFZZ0J5QUphaUVIREFFTEN3c2dCMEhRQUd3aURBUkFJQUFnQWlBTS9Bb0FBQXNnRHlBUWFpRUlJQWNoQmlBQUlBeHFJZ3doQ1FOQUlBRWdCa2NFUUNBT1JRUkFJQWtnQ0VIUUFQd0tBQUFMSUFaQkFXb2hCaUFJUWRBQWF5RUlJQWxCMEFCcUlRa01BUXNMSUFkRkRRQWdBU0FIU1FSQUlBdEJBRFlDZUNBTFFRRTJBbXdnQzBIWXpOb0FOZ0pvSUF0Q0JEY0NjQ0FMUWVnQWFrR0VuTklBRUtzSEFBc2dEQ0FCSUFkcklBSWdBeUFFSUF0QkdHb1FJU0FISVFFTUFnc2dBU0FEU3cwQUlBSWdBVUhRQUd3aURHb2hCMEVBSVFnZ0FDRUdBMEFnQUNBTlFkQUFiR29oQlFOQUFrQWdCU0FHVFFSQUlBRWdEVVlOQVNBT1JRUkFJQUlnQ0VIUUFHeHFJQVpCMEFEOENnQUFDeUFHUWRBQWFpRUdJQWhCQVdvaENDQUhRZEFBYXlFSElBRWhEUXdEQ3dKL0lBb29BZ0FpQ1NBR0tBSUFJZzlIQkVBZ0NTQVBTUXdCQ3lBS0x3RUVJQVpCQkdvdkFRQkpDeUVKSUFkQjBBQnJJUWNnRGtVRVFDQUlRZEFBYkNBSElBSWdDUnRxSUFaQjBBRDhDZ0FBQ3lBR1FkQUFhaUVHSUFnZ0NVRUJjMm9oQ0F3QkN3c0xJQWhCMEFCc0lnVUVRQ0FBSUFJZ0Jmd0tBQUFMSUFFZ0NHc2hCaUFNSUJCcUlRY2dBQ0FGYWlFSkEwQWdCZ1JBSUE1RkJFQWdDU0FIUWRBQS9Bb0FBQXNnQmtFQmF5RUdJQWRCMEFCcklRY2dDVUhRQUdvaENRd0JDd3NnQzBFUWFpQUlJQUFnQVJDQUJ5QUxLQUlVSVFFZ0N5Z0NFQ0VBUVFBaEJRd0JDd3NBQ3lBTFFZQUJhaVFBQzUwTkFRMS9Jd0JCZ0FGcklnc2tBQ0FDUWRBQWF5RVFBa0FEUUFKQUFrQWdBVUVoVHdSQUlBUU5BU0FBSUFFZ0FpQURRUUVRTlF3RUN5QUJRUUpKRFFNZ0F5QUJRUkJxU1EwQklBSWdBVUVCZGlJRVFkQUFiQ0lEYWlFS0lBQWdBMm9oQXdKL0lBRkJCMHNFUUNBQUlBSVF1UUVnQXlBS0VMa0JRUVFNQVF0QkFDSUZSUVJBSUFJZ0FFSFFBUHdLQUFBTElBVkZCRUFnQ2lBRFFkQUEvQW9BQUF0QkFRc2hBeUFMUW9DQWdJQWdOd0lZSUF0QkFEWUNJRUVBSUFOcklRMGdBQ0FEUWRBQWJDSUZhaUVNSUFJZ0JXb2hDU0FMSUFRMkFpUWdBU0FFYXlFT0EwQUNRQ0FMUVFocUlBdEJHR29RMndVZ0N5Z0NDRUVCY1VVTkFDQU5JQTRnQkNBTEtBSU1JZ1ViSWdZZ0F5QURJQVpKRzJvaENDQU1JQVZCMEFCc0lnVnFJUWNnQlNBSmFpRUdJQUlnQldvaEJRTkFJQWhGRFFJZ0JpQUhRZEFBL0FvQUFDQUZJQVlRcmdJZ0NFRUJheUVJSUFkQjBBQnFJUWNnQmtIUUFHb2hCZ3dBQ3dBTEN5QUtRZEFBYXlFR0lBQWdBVUhRQUd4QjBBQnJJZ1ZxSVFNZ0FpQUZhaUVJQTBBZ0JFVUVRQ0FHUWRBQWFpRURJQUZCQVhFRWZ5QUFJQUlnQ2lBQ0lBTkpJZ0ViUWRBQS9Bb0FBQ0FLSUFJZ0EwOUIwQUJzYWlFS0lBSWdBVUhRQUd4cUJTQUNDeUFEUmlBS0lBaEIwQUJxUm5FTkJSRHJCZ0FMQW44Z0NpZ0NBQ0lGSUFJb0FnQWlCMGNFUUNBRklBZEpEQUVMSUFvdkFRUWdBaThCQkVrTElRZEJBQ0lGUlFSQUlBQWdDaUFDSUFjYlFkQUEvQW9BQUFzQ2Z5QUlLQUlBSWcwZ0JpZ0NBQ0lNUndSQUlBd2dEVXNNQVFzZ0NDOEJCQ0FHTHdFRVNRc2hDU0FGUlFSQUlBTWdCaUFJSUFrYlFkQUEvQW9BQUFzZ0FFSFFBR29oQUNBSFFkQUFiQ0FLYWlFS0lBZEJBWE5CMEFCc0lBSnFJUUlnQkVFQmF5RUVJQU5CMEFCcklRTWdCaUFKUWJCL2JHb2hCaUFKUWRBQWJDQUlha0hRQUdzaENBd0FDd0FMSUFBZ0FVRURkaUlIUWJBRWJHb2hCaUFBSUFkQndBSnNhaUVOQW44Z0FVSEFBRThFUUNBQUlBMGdCaUFIRU1zQ0RBRUxJQUFDZnlBQUtBSUFJZ2NnRFNnQ0FDSU1Sd1JBSUFjZ0RFa01BUXNnQUM4QkJDQU5Md0VFU1FzaUNRSi9JQVlvQWdBaUNDQUhSd1JBSUFjZ0NFa01BUXNnQUM4QkJDQUdMd0VFU1F0SERRQWFJQVlnRFNBSUlBeEhCSDhnQ0NBTVN3VWdEUzhCQkNBR0x3RUVTUXNnQ1hNYkN5RUtRUUJGQkVBZ0MwRVlhaUFLUWRBQS9Bb0FBQXNnQkVFQmF5RUVJQW9nQUd0QjBBQnVJUTBDUUFKQUlBVkZEUUFnQlNnQ0FDSUdJQW9vQWdBaUIwWUVRQ0FGTHdFRUlBb3ZBUVJKRFFFTUFnc2dCaUFIVHcwQkN5QUJJQU5MRFFFZ0FpQUJRZEFBYkNJUGFpRUlRUUFoQnlBQUlRWWdEU0VNQTBBZ0FDQU1RZEFBYkdvaEVRTkFBa0FnQmlBUlR3UkFJQUVnREVZTkFTQUlRZEFBYXlFSUlBNUZCRUFnQ0NBSFFkQUFiR29nQmtIUUFQd0tBQUFMSUFaQjBBQnFJUVlnQVNFTURBTUxBbjhnQmlnQ0FDSUpJQW9vQWdBaUVrY0VRQ0FKSUJKSkRBRUxJQVpCQkdvdkFRQWdDaThCQkVrTElRa2dDRUhRQUdzaENDQU9SUVJBSUFkQjBBQnNJQUlnQ0NBSkcyb2dCa0hRQVB3S0FBQUxJQVpCMEFCcUlRWWdCeUFKYWlFSERBRUxDd3NnQjBIUUFHd2lEQVJBSUFBZ0FpQU0vQW9BQUFzZ0R5QVFhaUVJSUFjaEJpQUFJQXhxSWd3aENRTkFJQUVnQmtjRVFDQU9SUVJBSUFrZ0NFSFFBUHdLQUFBTElBWkJBV29oQmlBSVFkQUFheUVJSUFsQjBBQnFJUWtNQVFzTElBZEZEUUFnQVNBSFNRUkFJQXRCQURZQ2VDQUxRUUUyQW13Z0MwSFl6Tm9BTmdKb0lBdENCRGNDY0NBTFFlZ0Fha0dFbk5JQUVLc0hBQXNnRENBQklBZHJJQUlnQXlBRUlBdEJHR29RSWlBSElRRU1BZ3NnQVNBRFN3MEFJQUlnQVVIUUFHd2lER29oQjBFQUlRZ2dBQ0VHQTBBZ0FDQU5RZEFBYkdvaEJRTkFBa0FnQlNBR1RRUkFJQUVnRFVZTkFTQU9SUVJBSUFJZ0NFSFFBR3hxSUFaQjBBRDhDZ0FBQ3lBR1FkQUFhaUVHSUFoQkFXb2hDQ0FIUWRBQWF5RUhJQUVoRFF3REN3Si9JQW9vQWdBaUNTQUdLQUlBSWc5SEJFQWdDU0FQU1F3QkN5QUtMd0VFSUFaQkJHb3ZBUUJKQ3lFSklBZEIwQUJySVFjZ0RrVUVRQ0FJUWRBQWJDQUhJQUlnQ1J0cUlBWkIwQUQ4Q2dBQUN5QUdRZEFBYWlFR0lBZ2dDVUVCYzJvaENBd0JDd3NMSUFoQjBBQnNJZ1VFUUNBQUlBSWdCZndLQUFBTElBRWdDR3NoQmlBTUlCQnFJUWNnQUNBRmFpRUpBMEFnQmdSQUlBNUZCRUFnQ1NBSFFkQUEvQW9BQUFzZ0JrRUJheUVHSUFkQjBBQnJJUWNnQ1VIUUFHb2hDUXdCQ3dzZ0MwRVFhaUFJSUFBZ0FSQ0FCeUFMS0FJVUlRRWdDeWdDRUNFQVFRQWhCUXdCQ3dzQUN5QUxRWUFCYWlRQUMvME1BUTEvSXdCQklHc2lEQ1FBSUFKQkNHc2hFUUpBQWtBQ1FBTkFBa0FDUUFKQUlBRkJJVThFUUNBRURRRWdBQ0FCSUFJZ0EwRUJFRGtNQndzZ0FVRUNTUTBHSUFNZ0FVRVFha2tOQkNBQlFRRjJJUU1nQVVFUFN3MEJJQUZCQjBzRVFDQUFJQUlRM2dJZ0FDQURRUU4wSWdScUlBSWdCR29RM2dKQkJDRUVEQVlMSUFJZ0FDa0NBRGNDQUNBQ0lBTkJBM1FpQkdvZ0FDQUVhaWtDQURjQ0FFRUJJUVFNQlFzZ0FDQUJRUU4ySWd0Qk9HeHFJUVlnQUNBTFFRVjBhaUVISUFSQkFXc2hCQ0FNQW44Z0FVSEFBRThFUUNBQUlBY2dCaUFMRU1ZRERBRUxJQUFnQmlBSElBQW9BZ0FvQWdBaUN5QUhLQUlBS0FJQUlnZEpJZ2tnQnlBR0tBSUFLQUlBSWdaSmN4c2dDU0FHSUF0TGN4c0xJZzBvQWdRMkFnUWdEQ0FOS0FJQUlnWTJBZ0FnRFNBQWEwRURkaUVMSUFVRVFDQUZLQUlBS0FJQUlBWW9BZ0JQRFFJTElBRWdBMHNOQXlBQ0lBRkJBM1FpRG1vaENFRUFJUWNnQUNFR0lBc2hDUU5BSUFBZ0NVRURheUlLUVFBZ0NTQUtUeHRCQTNScUlROERRQ0FHSUE5UFJRUkFJQWRCQTNRZ0FpQUlRUWhySUEwb0FnQW9BZ0FpQ2lBR0tBSUFLQUlBU3lJUUcyb2dCaWtDQURjQ0FDQUhJQkJxSWdkQkEzUWdBaUFJUVJCcklBWkJDR29pRUNnQ0FDZ0NBQ0FLU1NJU0cyb2dFQ2tDQURjQ0FDQUhJQkpxSWdkQkEzUWdBaUFJUVJocklBWkJFR29pRUNnQ0FDZ0NBQ0FLU1NJU0cyb2dFQ2tDQURjQ0FDQUhJQkpxSWdkQkEzUWdBaUFJUVNCcklnZ2dDaUFHUVJocUlnb29BZ0FvQWdCTEloQWJhaUFLS1FJQU53SUFJQWNnRUdvaEJ5QUdRU0JxSVFZTUFRc0xJQUFnQ1VFRGRHb2hDZ05BSUFZZ0NrOEVRQ0FCSUFsSEJFQWdDRUVJYXlJSUlBZEJBM1JxSUFZcEFnQTNBZ0FnQmtFSWFpRUdJQUVoQ1F3REN5QUhRUU4wSWdrRVFDQUFJQUlnQ2Z3S0FBQUxJQTRnRVdvaENDQUhJUVlnQUNBSmFpSUtJUWtEUUNBQklBWkdSUVJBSUFrZ0NDa0NBRGNDQUNBR1FRRnFJUVlnQ0VFSWF5RUlJQWxCQ0dvaENRd0JDd3NnQjBVTkJDQUJJQWRKQkVBZ0RFRUFOZ0lZSUF4QkFUWUNEQ0FNUWRqTTJnQTJBZ2dnREVJRU53SVFJQXhCQ0dwQmhKelNBQkNyQndBTElBb2dBU0FIYXlBQ0lBTWdCQ0FNRUNNZ0J5RUJEQVVGSUFkQkEzUWdBaUFJUVFocklnZ2dCaWdDQUNnQ0FDQU5LQUlBS0FJQVNTSVBHMm9nQmlrQ0FEY0NBQ0FHUVFocUlRWWdCeUFQYWlFSERBRUxBQXNBQ3dBTElBQWdBaUFDSUFGQkEzUnFJZ1FRK0FjZ0FDQURRUU4wSWdWcUlBSWdCV29nQkVGQWF4RDRCMEVJSVFRTUF3c2dBU0FEU3cwQklBSWdBVUVEZENJSmFpRUlRUUFoQnlBQUlRWURRQ0FBSUF0QkEyc2lCVUVBSUFVZ0MwMGJRUU4wYWlFS0EwQWdCaUFLVDBVRVFDQUhRUU4wSUFJZ0NFRUlheUFOS0FJQUtBSUFJZ1VnQmlnQ0FDZ0NBRThpRGh0cUlBWXBBZ0EzQWdBZ0J5QU9haUlIUVFOMElBSWdDRUVRYXlBRklBWkJDR29pRGlnQ0FDZ0NBRThpRHh0cUlBNHBBZ0EzQWdBZ0J5QVBhaUlIUVFOMElBSWdDRUVZYXlBRklBWkJFR29pRGlnQ0FDZ0NBRThpRHh0cUlBNHBBZ0EzQWdBZ0J5QVBhaUlIUVFOMElBSWdDRUVnYXlJSUlBVWdCa0VZYWlJT0tBSUFLQUlBVHlJRkcyb2dEaWtDQURjQ0FDQUZJQWRxSVFjZ0JrRWdhaUVHREFFTEN5QUFJQXRCQTNScUlRVURRQ0FGSUFaTkJFQUNRQ0FCSUF0SEJFQWdBaUFIUVFOMGFpQUdLUUlBTndJQUlBWkJDR29oQmlBSFFRRnFJUWNnQ0VFSWF5RUlJQUVoQ3d3RUN5QUhRUU4wSWdVRVFDQUFJQUlnQmZ3S0FBQUxJQWtnRVdvaENDQUJJQWRySWdzaEJpQUFJQVZxSWdBaENRTkFJQVlFUUNBSklBZ3BBZ0EzQWdBZ0JrRUJheUVHSUFoQkNHc2hDQ0FKUVFocUlRa01BUXNMSUFFZ0Iwa05BRUVBSVFVZ0N5RUJEQVFMQlNBSFFRTjBJQUlnQ0VFSWF5SUlJQTBvQWdBb0FnQWdCaWdDQUNnQ0FFOGlDaHRxSUFZcEFnQTNBZ0FnQmtFSWFpRUdJQWNnQ21vaEJ3d0JDd3NMQ3lBSElBRkJsSnpTQUJDNUNRQUxBQXRCQUNFTklBeEJBRFlDRUVFQUlBUnJJUXNnQUNBRVFRTjBJZ1ZxSVFrZ0FpQUZhaUVLSUF3Z0F6WUNGQ0FCSUFOcklSRWdERUVRYWlFT0EwQUNRQ0FOUVFKSEJFQWdDeUFSSUFNZ0RpQU5RUUowYWlnQ0FDSUZHeUlHSUFRZ0JDQUdTUnRxSVFnZ0NTQUZRUU4wSWdWcUlRY2dCU0FLYWlFR0lBSWdCV29oQlFOQUlBaEZEUUlnQmlBSEtRSUFOd0lBSUFVZ0JoRGZCQ0FJUVFGcklRZ2dCMEVJYWlFSElBWkJDR29oQmd3QUN3QUxJQUlnQVNBQUVQb0JEQUlMSUExQkFXb2hEUXdBQ3dBTElBeEJJR29rQUF1QkRnRVBmeU1BUWFBS2F5SUhKQUFnQjBHWUFXcEJBRUhCQVB3TEFDQUhRWWdCYWtHWXM4a0FLUU1BTndNQUlBZEJnQUZxUVpDenlRQXBBd0EzQXdBZ0IwSDRBR3BCaUxQSkFDa0RBRGNEQUNBSFFnQTNBNUFCSUFkQmdMUEpBQ2tEQURjRGNDQUhRZkFBYWlJSUlBSWdBeENlQWlBSUlBUkJDQkNlQWlBRkJFQWdDQ0FGSUFZUW5nSUxJQWRCOEFGcUlnUWdCMEh3QUdwQjhBRDhDZ0FBSUFkQm9BVnFJQVFRY2tFZ0lRb2dCMEhvQUdwQklFR1UxdElBRUo4RklBY29BbWdoRUNBSEtBSnNJZ3dnQnlrQW9BVTNBQUFnREVFWWFpQUhRYmdGYWlrQUFEY0FBQ0FNUVJCcUlBZEJzQVZxS1FBQU53QUFJQXhCQ0dvZ0IwR29CV29wQUFBM0FBQUNRQ0FCUWdWUkJFQWdBRUVnTmdJSUlBQWdERFlDQkNBQUlCQTJBZ0FNQVFzZ0IwSGdBR29nQXlBR1FRQWdCUnRxUVFaMFFZQWdha0dBd01rQUVKOEZJQWNnQnlrRFlEY0M1QUVnQjBHb0NHb2hFeUFIUWZBRmFpRVJJQWRCMEFocUlRMGdCMEhRQkdvaEZFRUJJUTREUUNBSFFRQTJBdXdCUWNBQUlRUURRQ0FFQkVBZ0IwSGtBV29pQ0NBQ0lBTVFsd2tnQ0NBTUlBb1Fsd2tnQlFSQUlBZ2dCU0FHRUpjSkN5QUVRUUZySVFRTUFRc0xJQWRCMkFCcUlBd2dDa0VBUVpEQXlRQVFvQWNDUUFKQUlBY29BbHdpQkVFUFN3UkFJQWNvQWxnaEJDQUhRZEFBYWlBTUlBcEJFRUd3d01rQUVLQUhJQWNvQWxRaUNFRVBUUTBCSUFjb0FsQWhDQ0FIUWFBRmFpSUpJQVFRWENBVUlBZ1Fod1VnQjBId0FXb2dDVUhnQXZ3S0FBQWdEa0VCYWlFVklBY29BdXdCSWdoQmNIRWhDVUVBSVFRZ0J5Z0M2QUVoQ3dOQUlBUWdDVVpGQkVBZ0IwSHdBV29nQkNBTGFpSUtJQW9ReGdJZ0JFRVFhaUVFREFFTEN5QUhLQUxrQVNFU0lBZEJ5QUJxSUFzZ0NFRVFRZERBeVFBUXl3Y0NRQUpBQWtBQ1FDQUhLQUpNSWdsRkRRQWdCeWdDU0NFRVFRQWhDZ05BSUFvZ0JDMEFBR29oQ2lBRVFRRnFJUVFnQ1VFQmF5SUpEUUFMSUFwQkEzQkJBV3NPQWdFQ0FBc2dFMEVBUWNFQS9Bc0FJQWRCbUFocVFaaXp5UUFwQXdBM0F3QWdCMEdRQ0dwQmtMUEpBQ2tEQURjREFDQUhRWWdJYWtHSXM4a0FLUU1BTndNQUlBZENBRGNEb0FnZ0IwR0FzOGtBS1FNQU53T0FDQ0FIUVlBSWFpSUVJQXNnQ0JDZUFpQUhRYUFGYWlJSklBUkI4QUQ4Q2dBQUlBZEI0QWxxSUFrUWNrRWdJUW9nQjBFZ1FaVFcwZ0FRbndVZ0J5Z0NBQ0VKSUFjb0FnUWlCQ0FIS1FEZ0NUY0FBQ0FFUVJocUlBZEIrQWxxS1FBQU53QUFJQVJCRUdvZ0IwSHdDV29wQUFBM0FBQWdCRUVJYWlBSFFlZ0phaWtBQURjQUFBd0NDeUFOUVFCQmdRSDhDd0JCQUNJSlJRUkFJQWRCZ0FocVFiQ3p5UUJCd0FEOENnQUFDeUFIUWdBM0E4Z0lJQWRDQURjRHdBZ0NRQ0FJUWY4QVRRUkFJQWRCR0dwQkFDQU5RWUFCUVpDd3lRQVFud2NnQjBFUWFpQUlJQWNvQWhnZ0J5Z0NIRUdnc01rQUVNOEhJQWNvQWhBZ0J5Z0NGQ0FMSUFoQnNMREpBQkNzQnlBSUlRUU1BUXNnQjBHQUNHb2dDeUFJUVFkMkVQOEdJQWRCSUdvZ0NFSC9BSEVpQkNBTlFZQUJRZkN2eVFBUXp3Y2dCeWdDSUNBSEtBSWtJQXNnQ0VHQWYzRnFJQVJCZ0xESkFCQ3NCd3NnQnlBRU9nRFFDU0FIUWFBRmFpQUhRWUFJYWtIZ0Fmd0tBQUFnQ1VVRVFDQUhRZUFKYWtFQVFjQUEvQXNBQ3lBSFFhQUZhaUFSSUFkQjRBbHFJZ1FRZWtFd0lRcEJBRVVFUUNBSFFlQUVhaUFFUVREOENnQUFDeUFIUVFocVFUQkJsTmJTQUJDZkJTQUhLQUlJSVFrZ0J5Z0NEQ0VFSUE4TkFTQUVJQWRCNEFScVFURDhDZ0FBREFFTElBMUJBRUdCQWZ3TEFDQUhRWUFJYWtId3M4a0FRY0FBL0FvQUFDQUhRZ0EzQThnSUlBZENBRGNEd0FnQ1FDQUlRZjhBVFFSQUlBZEJPR3BCQUNBTlFZQUJRWkN3eVFBUW53Y2dCMEV3YWlBSUlBY29BamdnQnlnQ1BFR2dzTWtBRU04SElBY29BakFnQnlnQ05DQUxJQWhCc0xESkFCQ3NCeUFJSVFRTUFRc2dCMEdBQ0dvZ0N5QUlRUWQyRVA4R0lBZEJRR3NnQ0VIL0FIRWlCQ0FOUVlBQlFmQ3Z5UUFRendjZ0J5Z0NRQ0FIS0FKRUlBc2dDRUdBZjNGcUlBUkJnTERKQUJDc0J3c2dCeUFFT2dEUUNTQUhRYUFGYWlBSFFZQUlha0hnQWZ3S0FBQkJ3QUFoQ2tFQVJRUkFJQWRCNEFscVFRQkJ3QUQ4Q3dBTElBZEJvQVZxSUJFZ0IwSGdDV29pQkJCNklBOUZCRUFnQjBIZ0JHb2dCRUhBQVB3S0FBQUxJQWRCS0dwQndBQkJsTmJTQUJDZkJTQUhLQUlvSVFrZ0J5Z0NMQ0VFSUE4TkFDQUVJQWRCNEFScVFjQUEvQW9BQUFzZ0VDQU1FS2tKSUE1QlAwME5BZ0pBSUFoRkRRQWdDQ0FMYWtFQmF5SU1SUTBBSUF3dEFBQWdEa0VnYTBzTkF3c2dFaUFMRUtrSklBQkJJRFlDQ0NBQUlBUTJBZ1FnQUNBSk5nSUFEQVFMUVJBZ0JFR2d3TWtBRUxnSkFBdEJFQ0FJUWNEQXlRQVF1QWtBQ3lBSElBZzJBdXdCSUFjZ0N6WUM2QUVnQnlBU05nTGtBU0FFSVF3Z0NTRVFJQlVoRGd3QUN3QUxJQWRCb0FwcUpBQUxzQTRCQzM4akFFSHdBR3NpQkNRQUlBUkIzQUJxSUFNUS9nUUNRQ0FFS0FKY1FaK0FnSUI0UndSQUlBUkIyQUJxSUFSQjdBQnFLQUlBTmdJQUlBUkIwQUJxSUFSQjVBQnFLUUlBTndNQUlBUWdCQ2tDWERjRFNBd0JDeUFFS0FKZ1FRaHFRWlRWeVFCQkJCQ2xBeUVGSUFSQm40Q0FnSGcyQWtnZ0JDQUZPZ0JNQzBHWWdNUUFJUVVDUUNBRVFjZ0FhaEM4QncwQUFrQUNRQUpBQWtCQkNDQURLQUlBSWdoQkFtc2lCeUFIUVFwUEcwRUhhdzRDQVFJQUN5QUVRVEJxSUFnUTdRWWdCRUVVTmdKa0lBUkI3YzdKQURZQ1lDQUVRWUdBZ0lCNE5nSmNJQVFnQkNrRE1EY0NhQXdDQ3lBRVFkd0FhaUFEUVFocUVQMEJEQUVMSUFSQjNBQnFJQU5CQ0dvUS9RRUxJQVJCS0dvZ0JFSGNBR29RNEFZQ1FDQUVLQUlvSWdaRkRRQWdCaUFFS0FJc1FZelZ5UUJCQ0JEc0IwVU5BQ0FBTFFDTUFVRUJSdzBCQ3lBRVFkd0FhaUlGSUFNUS9nUUNRQ0FFS0FKY1FaK0FnSUI0UndSQUlBVVF6UUpCQUNFSERBRUxJQVJCM0FCcUlBUW9BbUFpQ1JCcUFrQWdCQ2dDWEVHZmdJQ0FlRWNFUUNBRVFkZ0FhaUFFUWV3QWFpZ0NBRFlDQUNBRVFkQUFhaUFFUWVRQWFpa0NBRGNEQUNBRUlBUXBBbHczQTBnTUFRc2dCQ2dDYUVFRGRDRUlJQVFvQW1BZ0JDZ0NaQ0lMSVFZRFFDQUlJZ1VFUUNBRlFRaHJJUWdnQmlnQ0JDRU1JQVlvQWdBZ0JrRUlhaUVHSUF4Qm1OWEpBRUVGRU93SFJRMEJDd3NnQ3hDbUNTQUVRWitBZ0lCNE5nSklJQVFnQlVFQVJ6b0FUQXRCQUNFSElBUkJ5QUJxRUx3SFJRMEFJQVJCM0FCcUlnVWdDVUVJYWtHZDFja0FRUXNRendFZ0JDZ0NYRUdmZ0lDQWVFY0VRQ0FGRU1zSURBRUxJQVJCM0FCcUlnVWdCQ2dDWUJEWkJDQUVLQUpjUVorQWdJQjRSd1JBSUFVUXpRSU1BUXNnQkVIY0FHb2dCQ2dDWUVHbzFja0FRUVFRendFQ1FDQUVLQUpjUVorQWdJQjRSd1JBSUFSQjJBQnFJQVJCN0FCcUtBSUFOZ0lBSUFSQjBBQnFJQVJCNUFCcUtRSUFOd01BSUFRZ0JDa0NYRGNEU0F3QkN5QUVRY2dBYWlBRUtBSmdFTGtFQ3lBRVFTQnFJQVJCeUFCcUVPQUdJQVFvQWlBaURnUi9JQVJCR0dvQ2Z3SkFJQUFvQW9BQklnbEZEUUFnQkNnQ0pDRUxJQUFvQW9RQklRd0RRQ0FKUWR3QWFpRUdJQWt2QWVJQklnVkJER3doQ0VGL0lRY0NRQU5BSUFoRkJFQWdCU0VIREFJTElBWkJDR29oQ2lBR1FRUnFJUTBnQjBFQmFpRUhJQWhCREdzaENDQUdRUXhxSVFZQ1FDQU9JQTBvQWdBZ0N5QUtLQUlBSWdvZ0NpQUxTeHNRc0FVaURTQUxJQXBySUEwYklncEJBRW9nQ2tFQVNHdEIvd0Z4RGdJQUFRSUxDeUFKSUFkQkEzUnFEQU1MSUF4RkRRRWdERUVCYXlFTUlBa2dCMEVDZEdvb0F1UUJJUWtNQUFzQUMwRUFDeERhQlNBRUtBSWNJUWdnQkNnQ0dBVkJBQXNoQlJDNENDSUhRb0dBZ0lBUU53SUFJQVJCRUdvZ0JTQUlJQWRCck5YSkFCREtCU0FFS0FJVUlRWWdCQ2dDRUNFSEN5QUVJQVkyQWp3Z0JDQUhOZ0k0QWtBQ1FBSkFBa0FDUUFKQUFrQWdCRUVJYWdKL0FrQUNRRUVJSUFNb0FnQkJBbXNpQlNBRlFRcFBHMEVGYXc0RUFBTUVBUVlMUVFRaENTQUFLQUtBQVNBQUtBS0VBU0FBS0FJOElBQW9Ba0FRcGdNTUFRdEJPQ0VKSUFBb0FvQUJJQUFvQW9RQklBQW9BakFnQUNnQ05CQ21Bd3NRMmdVZ0JDQUVLQUlJSUFRb0Fnd1F1QWdpQlVLQmdJQ0FFRGNDQUNBRlFlelV5UUFReWdVZ0JDZ0NBQ0VJSUFRZ0JDZ0NCQ0lGTmdKRUlBUWdDRFlDUUNBSEJFQWdCRUZBYXhEU0J5QUVJQVkyQWtRZ0JDQUhOZ0pBSUFjaENDQUdJUVVMSUFSQjNBQnFJZ1lnQ0NBRktBSUlRUUZyUVhoeGFrRUlhaUFBS0FJa0lBQW9BaWdnQVNBQ0lBVW9BaFFSQ0FBZ0JDZ0NZQ0VGSUFRb0Fsd2lBVUdBZ0lDQWVFY0VRQ0FHSUFRb0FrQWdCQ2dDUkNJQUtBSUlRUUZyUVhoeGFrRUlhaUFGSUFRb0FtUWdBeUFKYWlJQ0tBSUVJQUlvQWdnZ0FDZ0NIQkVJQUNBRUtBSmdJUUFnQkNnQ1hDSUNRWUNBZ0lCNFJ3MEdJQUVnQlJDcENTQUFJUVVMSUFkQkFFY2hDQ0FFUVVCckVOSUhJQVFvQWpnaEJ3d0NDeUFES0FJTVFjZ0FiQ0VHSUFNb0FnZ2hBMEdZZ01RQUlRVURRRUVBSVFnZ0JrVU5BaUFBSUFFZ0FpQURFQ1VoQ1NBR1FjZ0FheUVHSUFOQnlBQnFJUU1nQ1VHWWdNUUFSZzBBQ3lBSklRVU1BUXNnQXlnQ0lFSFlBR3doQmlBREtBSWNJUU5CbUlERUFDRUZBMEJCQUNFSUlBWkZEUUVnQUNBQklBSWdBeEFsSVFrZ0JrSFlBR3NoQmlBRFFkZ0FhaUVESUFsQm1JREVBRVlOQUFzZ0NTRUZDeUFJRFFRTUFRdEJtSURFQUNFRkN5QUhEUUVNQWdzZ0JDQUVLQUprTmdKUUlBUWdBRFlDVENBRUlBSTJBa2dDUUFKQUFrQUNRRUVJSUFNb0FnQkJBbXNpQ0NBSVFRcFBHMEVGYXc0RUFRQUFBZ0FMSUFJZ0FCQ3BDUXdDQ3lBREtBSUVJQU1vQWdnUXFRa2dBMEVNYWlBRVFkQUFhaWdDQURZQ0FDQURJQVFwQWtnM0FnUU1BUXNnQXlBRVFjZ0FhaERmQmdzZ0FTQUZFS2tKSUFSQlFHc1EwZ2RCbUlERUFDRUZJQWNOQVNBRUtBSTRSUTBCQ3lBRVFUaHFFTklIQ3lBRVFmQUFhaVFBSUFVTHh3d0JEWDhqQUVFd2F5SUtKQUFnQWtFSWF5RVNBa0FDUUFOQUFrQUNRQUpBQWtBZ0FVRWhUd1JBSUFRTkFTQUFJQUVnQWlBRFFRRVFRZ3dIQ3lBQlFRSkpEUVlnQXlBQlFSQnFTUTBESUFGQkFYWWhBeUFCUVE5TERRRWdBVUVIU3dSQUlBQWdBaENBQXlBQUlBTkJBM1FpQkdvZ0FpQUVhaENBQTBFRUlRd01CZ3NnQWlBQUtRSUFOd0lBSUFJZ0EwRURkQ0lFYWlBQUlBUnFLUUlBTndJQVFRRWhEQXdGQ3lBQUlBRkJBM1lpRFVFNGJHb2hCaUFBSUExQkJYUnFJUWNnQkVFQmF5RUVBbjhnQVVIQUFFOEVRQ0FBSUFjZ0JpQU5FTlFEREFFTElBQWdCaUFISUFBdEFBQWlEU0FITFFBQUlnZEpJZ2tnQnlBR0xRQUFJZ1pKY3hzZ0NTQUdJQTFMY3hzTElnd3RBQUFoQmlBS0lBd29BZ1EyQWhRZ0NpQUdPZ0FRSUF3Z0FHdEJBM1loRFNBRkJFQWdCUzBBQUNBTUxRQUFUdzBDQ3lBQklBTkxEUUlnQWlBQlFRTjBJZzVxSVFoQkFDRUhJQUFoQmlBTklRa0RRQ0FBSUFsQkEyc2lDMEVBSUFrZ0MwOGJRUU4wYWlFUEEwQWdCaUFQVDBVRVFDQUhRUU4wSUFJZ0NFRUlheUFNTFFBQUlnc2dCaTBBQUVzaUVCdHFJQVlwQWdBM0FnQWdCeUFRYWlJSFFRTjBJQUlnQ0VFUWF5QUdRUWhxSWhBdEFBQWdDMGtpRVJ0cUlCQXBBZ0EzQWdBZ0J5QVJhaUlIUVFOMElBSWdDRUVZYXlBR1FSQnFJaEF0QUFBZ0Mwa2lFUnRxSUJBcEFnQTNBZ0FnQnlBUmFpSUhRUU4wSUFJZ0NFRWdheUlJSUFzZ0JrRVlhaUlMTFFBQVN5SVFHMm9nQ3lrQ0FEY0NBQ0FISUJCcUlRY2dCa0VnYWlFR0RBRUxDeUFBSUFsQkEzUnFJUXNEUUNBR0lBdFBCRUFnQVNBSlJ3UkFJQWhCQ0dzaUNDQUhRUU4wYWlBR0tRSUFOd0lBSUFaQkNHb2hCaUFCSVFrTUF3c2dCMEVEZENJSkJFQWdBQ0FDSUFuOENnQUFDeUFPSUJKcUlRZ2dCeUVHSUFBZ0NXb2lDeUVKQTBBZ0FTQUdSa1VFUUNBSklBZ3BBZ0EzQWdBZ0JrRUJhaUVHSUFoQkNHc2hDQ0FKUVFocUlRa01BUXNMSUFkRkRRUWdBU0FIU1FSQUlBcEJBRFlDS0NBS1FRRTJBaHdnQ2tIWXpOb0FOZ0lZSUFwQ0JEY0NJQ0FLUVJocVFZU2MwZ0FRcXdjQUN5QUxJQUVnQjJzZ0FpQURJQVFnQ2tFUWFoQW1JQWNoQVF3R0JTQUhRUU4wSUFJZ0NFRUlheUlJSUFZdEFBQWdEQzBBQUVraUR4dHFJQVlwQWdBM0FnQWdCa0VJYWlFR0lBY2dEMm9oQnd3QkN3QUxBQXNBQ3lBQUlBSWdBaUFCUVFOMGFpSUVFUG9ISUFBZ0EwRURkQ0lGYWlBQ0lBVnFJQVJCUUdzUStnZEJDQ0VNREFNTElBRWdBMHNOQUNBQ0lBRkJBM1FpQ1dvaENFRUFJUWNnQUNFR0EwQWdBQ0FOUVFOcklnVkJBQ0FGSUExTkcwRURkR29oQ3dOQUlBWWdDMDlGQkVBZ0IwRURkQ0FDSUFoQkNHc2dEQzBBQUNJRklBWXRBQUJQSWc0YmFpQUdLUUlBTndJQUlBY2dEbW9pQjBFRGRDQUNJQWhCRUdzZ0JTQUdRUWhxSWc0dEFBQlBJZzhiYWlBT0tRSUFOd0lBSUFjZ0Qyb2lCMEVEZENBQ0lBaEJHR3NnQlNBR1FSQnFJZzR0QUFCUElnOGJhaUFPS1FJQU53SUFJQWNnRDJvaUIwRURkQ0FDSUFoQklHc2lDQ0FGSUFaQkdHb2lEaTBBQUU4aUJSdHFJQTRwQWdBM0FnQWdCU0FIYWlFSElBWkJJR29oQmd3QkN3c2dBQ0FOUVFOMGFpRUZBMEFnQlNBR1RRUkFJQUVnRFVjRVFDQUNJQWRCQTNScUlBWXBBZ0EzQWdBZ0JrRUlhaUVHSUFkQkFXb2hCeUFJUVFocklRZ2dBU0VOREFNTElBZEJBM1FpQlFSQUlBQWdBaUFGL0FvQUFBc2dBU0FIYXlFR0lBa2dFbW9oQ0NBQUlBVnFJUWtEUUNBR0JFQWdDU0FJS1FJQU53SUFJQVpCQVdzaEJpQUlRUWhySVFnZ0NVRUlhaUVKREFFTEN5QUtRUWhxSUFjZ0FDQUJFSVVISUFvb0Fnd2hBU0FLS0FJSUlRQkJBQ0VGREFRRklBZEJBM1FnQWlBSVFRaHJJZ2dnREMwQUFDQUdMUUFBVHlJTEcyb2dCaWtDQURjQ0FDQUdRUWhxSVFZZ0J5QUxhaUVIREFFTEFBc0FDd0FMQ3dBTElBcENnSUNBZ0NBM0FoZ2dDa0VBTmdJZ1FRQWdER3NoQlNBQUlBeEJBM1FpQkdvaERTQUNJQVJxSVFrZ0NpQUROZ0lrSUFFZ0Eyc2hDd05BQWtBZ0NpQUtRUmhxRU5zRklBb29BZ0JCQVhGRkRRQWdCU0FMSUFNZ0NpZ0NCQ0lFR3lJR0lBd2dCaUFNU3h0cUlRZ2dEU0FFUVFOMElnUnFJUWNnQkNBSmFpRUdJQUlnQkdvaEJBTkFJQWhGRFFJZ0JpQUhLUUlBTndJQUlBUWdCaERnQkNBSVFRRnJJUWdnQjBFSWFpRUhJQVpCQ0dvaEJnd0FDd0FMQ3lBQ0lBRWdBQkNCQWdzZ0NrRXdhaVFBQzhjTUFRMS9Jd0JCTUdzaUNpUUFJQUpCQ0dzaEVnSkFBa0FEUUFKQUFrQUNRQUpBSUFGQklVOEVRQ0FFRFFFZ0FDQUJJQUlnQTBFQkVFTU1Cd3NnQVVFQ1NRMEdJQU1nQVVFUWFra05BeUFCUVFGMklRTWdBVUVQU3cwQklBRkJCMHNFUUNBQUlBSVFnQU1nQUNBRFFRTjBJZ1JxSUFJZ0JHb1FnQU5CQkNFTURBWUxJQUlnQUNrQ0FEY0NBQ0FDSUFOQkEzUWlCR29nQUNBRWFpa0NBRGNDQUVFQklRd01CUXNnQUNBQlFRTjJJZzFCT0d4cUlRWWdBQ0FOUVFWMGFpRUhJQVJCQVdzaEJBSi9JQUZCd0FCUEJFQWdBQ0FISUFZZ0RSRFVBd3dCQ3lBQUlBWWdCeUFBTFFBQUlnMGdCeTBBQUNJSFNTSUpJQWNnQmkwQUFDSUdTWE1iSUFrZ0JpQU5TM01iQ3lJTUxRQUFJUVlnQ2lBTUtBSUVOZ0lVSUFvZ0Jqb0FFQ0FNSUFCclFRTjJJUTBnQlFSQUlBVXRBQUFnREMwQUFFOE5BZ3NnQVNBRFN3MENJQUlnQVVFRGRDSU9haUVJUVFBaEJ5QUFJUVlnRFNFSkEwQWdBQ0FKUVFOcklndEJBQ0FKSUF0UEcwRURkR29oRHdOQUlBWWdEMDlGQkVBZ0IwRURkQ0FDSUFoQkNHc2dEQzBBQUNJTElBWXRBQUJMSWhBYmFpQUdLUUlBTndJQUlBY2dFR29pQjBFRGRDQUNJQWhCRUdzZ0JrRUlhaUlRTFFBQUlBdEpJaEViYWlBUUtRSUFOd0lBSUFjZ0VXb2lCMEVEZENBQ0lBaEJHR3NnQmtFUWFpSVFMUUFBSUF0SkloRWJhaUFRS1FJQU53SUFJQWNnRVdvaUIwRURkQ0FDSUFoQklHc2lDQ0FMSUFaQkdHb2lDeTBBQUVzaUVCdHFJQXNwQWdBM0FnQWdCeUFRYWlFSElBWkJJR29oQmd3QkN3c2dBQ0FKUVFOMGFpRUxBMEFnQmlBTFR3UkFJQUVnQ1VjRVFDQUlRUWhySWdnZ0IwRURkR29nQmlrQ0FEY0NBQ0FHUVFocUlRWWdBU0VKREFNTElBZEJBM1FpQ1FSQUlBQWdBaUFKL0FvQUFBc2dEaUFTYWlFSUlBY2hCaUFBSUFscUlnc2hDUU5BSUFFZ0JrWkZCRUFnQ1NBSUtRSUFOd0lBSUFaQkFXb2hCaUFJUVFocklRZ2dDVUVJYWlFSkRBRUxDeUFIUlEwRUlBRWdCMGtFUUNBS1FRQTJBaWdnQ2tFQk5nSWNJQXBCMk16YUFEWUNHQ0FLUWdRM0FpQWdDa0VZYWtHRW5OSUFFS3NIQUFzZ0N5QUJJQWRySUFJZ0F5QUVJQXBCRUdvUUp5QUhJUUVNQmdVZ0IwRURkQ0FDSUFoQkNHc2lDQ0FHTFFBQUlBd3RBQUJKSWc4YmFpQUdLUUlBTndJQUlBWkJDR29oQmlBSElBOXFJUWNNQVFzQUN3QUxBQXNnQUNBQ0lBSWdBVUVEZEdvaUJCRDZCeUFBSUFOQkEzUWlCV29nQWlBRmFpQUVRVUJyRVBvSFFRZ2hEQXdEQ3lBQklBTkxEUUFnQWlBQlFRTjBJZ2xxSVFoQkFDRUhJQUFoQmdOQUlBQWdEVUVEYXlJRlFRQWdCU0FOVFJ0QkEzUnFJUXNEUUNBR0lBdFBSUVJBSUFkQkEzUWdBaUFJUVFocklBd3RBQUFpQlNBR0xRQUFUeUlPRzJvZ0Jpa0NBRGNDQUNBSElBNXFJZ2RCQTNRZ0FpQUlRUkJySUFVZ0JrRUlhaUlPTFFBQVR5SVBHMm9nRGlrQ0FEY0NBQ0FISUE5cUlnZEJBM1FnQWlBSVFSaHJJQVVnQmtFUWFpSU9MUUFBVHlJUEcyb2dEaWtDQURjQ0FDQUhJQTlxSWdkQkEzUWdBaUFJUVNCcklnZ2dCU0FHUVJocUlnNHRBQUJQSWdVYmFpQU9LUUlBTndJQUlBVWdCMm9oQnlBR1FTQnFJUVlNQVFzTElBQWdEVUVEZEdvaEJRTkFJQVVnQmswRVFDQUJJQTFIQkVBZ0FpQUhRUU4wYWlBR0tRSUFOd0lBSUFaQkNHb2hCaUFIUVFGcUlRY2dDRUVJYXlFSUlBRWhEUXdEQ3lBSFFRTjBJZ1VFUUNBQUlBSWdCZndLQUFBTElBRWdCMnNoQmlBSklCSnFJUWdnQUNBRmFpRUpBMEFnQmdSQUlBa2dDQ2tDQURjQ0FDQUdRUUZySVFZZ0NFRUlheUVJSUFsQkNHb2hDUXdCQ3dzZ0NrRUlhaUFISUFBZ0FSQ0ZCeUFLS0FJTUlRRWdDaWdDQ0NFQVFRQWhCUXdFQlNBSFFRTjBJQUlnQ0VFSWF5SUlJQXd0QUFBZ0JpMEFBRThpQ3h0cUlBWXBBZ0EzQWdBZ0JrRUlhaUVHSUFjZ0Myb2hCd3dCQ3dBTEFBc0FDd3NBQ3lBS1FvQ0FnSUFnTndJWUlBcEJBRFlDSUVFQUlBeHJJUVVnQUNBTVFRTjBJZ1JxSVEwZ0FpQUVhaUVKSUFvZ0F6WUNKQ0FCSUFOcklRc0RRQUpBSUFvZ0NrRVlhaERiQlNBS0tBSUFRUUZ4UlEwQUlBVWdDeUFESUFvb0FnUWlCQnNpQmlBTUlBWWdERXNiYWlFSUlBMGdCRUVEZENJRWFpRUhJQVFnQ1dvaEJpQUNJQVJxSVFRRFFDQUlSUTBDSUFZZ0J5a0NBRGNDQUNBRUlBWVE0QVFnQ0VFQmF5RUlJQWRCQ0dvaEJ5QUdRUWhxSVFZTUFBc0FDd3NnQWlBQklBQVFnUUlMSUFwQk1Hb2tBQXZoRGdJRGZ3RitJd0JCUUdvaUFpUUFJQUVvQWdRaEF5QUJLQUlBSVFFQ2Z3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQVFRSWdBQ2dDQUNJQUtBSUFRWUNBZ0lCNGN5SUVJQVJCSDA4YlFRRnJEaDRCQWdNRUJRWUhDQWtLQ3d3TkRnOFFFUklURkJVV0Z4Z1pHaHNjSFI0QUN5QUNJQUFwQWdRM0FoQWdBa0VDTmdJc0lBSkJzT1BKQURZQ0tDQUNRZ0UzQWpRZ0FrRUxOZ0ljSUFJZ0FrRVlhallDTUNBQ0lBSkJFR28yQWhnZ0FTQURJQUpCS0dvUTN3Z01IZ3NnQUNrQ0RDRUZJQUlnQUNrQ0JEY0NDQ0FDSUFVM0FoQWdBa0VDTmdJc0lBSkIrT1BKQURZQ0tDQUNRZ0kzQWpRZ0FrRUxOZ0lrSUFKQkN6WUNIQ0FDSUFKQkdHbzJBakFnQWlBQ1FSQnFOZ0lnSUFJZ0FrRUlhallDR0NBQklBTWdBa0VvYWhEZkNBd2RDeUFCUVlqa3lRQkJHeUFES0FJTUVRSUFEQndMSUFGQm8rVEpBRUVoSUFNb0Fnd1JBZ0FNR3dzZ0FVSEU1TWtBUVJvZ0F5Z0NEQkVDQUF3YUN5QUNJQUJCQkdvMkFoQWdBa0VCTmdJc0lBSkIvT1RKQURZQ0tDQUNRZ0UzQWpRZ0FrRU1OZ0ljSUFJZ0FrRVlhallDTUNBQ0lBSkJFR28yQWhnZ0FTQURJQUpCS0dvUTN3Z01HUXNnQWlBQVFRUnFOZ0lRSUFKQkFUWUNMQ0FDUVp6bHlRQTJBaWdnQWtJQk53STBJQUpCRFRZQ0hDQUNJQUpCR0dvMkFqQWdBaUFDUVJCcU5nSVlJQUVnQXlBQ1FTaHFFTjhJREJnTElBSWdBRUVFYWpZQ0VDQUNRUUUyQWl3Z0FrRzQ1Y2tBTmdJb0lBSkNBVGNDTkNBQ1FRNDJBaHdnQWlBQ1FSaHFOZ0l3SUFJZ0FrRVFhallDR0NBQklBTWdBa0VvYWhEZkNBd1hDeUFDSUFCQkJHbzJBaEFnQWtFQ05nSXNJQUpCNU9YSkFEWUNLQ0FDUWdFM0FqUWdBa0VQTmdJY0lBSWdBa0VZYWpZQ01DQUNJQUpCRUdvMkFoZ2dBU0FESUFKQktHb1Ezd2dNRmdzZ0FpQUFRUVJxTmdJUUlBSkJBVFlDTENBQ1FZem15UUEyQWlnZ0FrSUJOd0kwSUFKQkR6WUNIQ0FDSUFKQkdHbzJBakFnQWlBQ1FSQnFOZ0lZSUFFZ0F5QUNRU2hxRU44SURCVUxJQUlnQUVFRWFqWUNFQ0FDUVFFMkFpd2dBa0d3NXNrQU5nSW9JQUpDQVRjQ05DQUNRUTgyQWh3Z0FpQUNRUmhxTmdJd0lBSWdBa0VRYWpZQ0dDQUJJQU1nQWtFb2FoRGZDQXdVQ3lBQ0lBQkJCR28yQWhBZ0FrRUJOZ0lzSUFKQnlPYkpBRFlDS0NBQ1FnRTNBalFnQWtFUE5nSWNJQUlnQWtFWWFqWUNNQ0FDSUFKQkVHbzJBaGdnQVNBRElBSkJLR29RM3dnTUV3c2dBaUFBUVFScU5nSVFJQUpCQVRZQ0xDQUNRZWpteVFBMkFpZ2dBa0lCTndJMElBSkJEellDSENBQ0lBSkJHR28yQWpBZ0FpQUNRUkJxTmdJWUlBRWdBeUFDUVNocUVOOElEQklMSUFGQjhPYkpBRUVUSUFNb0Fnd1JBZ0FNRVFzZ0FpQUFRUVJxTmdJUUlBSkJBVFlDTENBQ1FieUx5Z0EyQWlnZ0FrSUJOd0kwSUFKQkJEWUNIQ0FDSUFKQkdHbzJBakFnQWlBQ1FSQnFOZ0lZSUFFZ0F5QUNRU2hxRU44SURCQUxJQUZCZytmSkFFRWxJQU1vQWd3UkFnQU1Ed3NnQVVHbzU4a0FRUjBnQXlnQ0RCRUNBQXdPQ3lBQlFjWG55UUJCRWlBREtBSU1FUUlBREEwTElBSkJBellDTENBQ1Flem55UUEyQWlnZ0FrSUNOd0kwSUFKQkVEWUNKQ0FDSUFCQkNHbzJBaUFnQWtFUk5nSWNJQUlnQUVFRWFqWUNHQ0FDSUFKQkdHbzJBakFnQVNBRElBSkJLR29RM3dnTURBc2dBa0VDTmdJc0lBSkJwT2pKQURZQ0tDQUNRZ0kzQWpRZ0FrRVFOZ0lrSUFJZ0FFRUlhallDSUNBQ1FSRTJBaHdnQWlBQVFRUnFOZ0lZSUFJZ0FrRVlhallDTUNBQklBTWdBa0VvYWhEZkNBd0xDeUFCUWJUb3lRQkJGU0FES0FJTUVRSUFEQW9MSUFJZ0FFRUVhallDRUNBQ1FRRTJBaXdnQWtIazZNa0FOZ0lvSUFKQ0FUY0NOQ0FDUVE4MkFod2dBaUFDUVJocU5nSXdJQUlnQWtFUWFqWUNHQ0FCSUFNZ0FrRW9haERmQ0F3SkN5QUJRZXpveVFCQndnQWdBeWdDREJFQ0FBd0lDeUFCUWE3cHlRQkJHeUFES0FJTUVRSUFEQWNMSUFJZ0FFRUVhallDRUNBQ1FRRTJBaXdnQWtIdzZja0FOZ0lvSUFKQ0FUY0NOQ0FDUVJJMkFod2dBaUFDUVJocU5nSXdJQUlnQWtFUWFqWUNHQ0FCSUFNZ0FrRW9haERmQ0F3R0N5QUNJQUJCQkdvMkFoQWdBa0VCTmdJc0lBSkJvT3JKQURZQ0tDQUNRZ0UzQWpRZ0FrRVROZ0ljSUFJZ0FrRVlhallDTUNBQ0lBSkJFR28yQWhnZ0FTQURJQUpCS0dvUTN3Z01CUXNnQVVHbzZza0FRVEVnQXlnQ0RCRUNBQXdFQ3lBQ0lBQkJCR28yQWhBZ0FrRUJOZ0lzSUFKQi9PckpBRFlDS0NBQ1FnRTNBalFnQWtFUE5nSWNJQUlnQWtFWWFqWUNNQ0FDSUFKQkVHbzJBaGdnQVNBRElBSkJLR29RM3dnTUF3c2dBaUFBUVFScU5nSVFJQUpCQVRZQ0xDQUNRYVRyeVFBMkFpZ2dBa0lCTndJMElBSkJGRFlDSENBQ0lBSkJHR28yQWpBZ0FpQUNRUkJxTmdJWUlBRWdBeUFDUVNocUVOOElEQUlMSUFJZ0FEWUNFQ0FDUVFFMkFpd2dBa0hBNjhrQU5nSW9JQUpDQVRjQ05DQUNRUlUyQWh3Z0FpQUNRUmhxTmdJd0lBSWdBa0VRYWpZQ0dDQUJJQU1nQWtFb2FoRGZDQXdCQ3lBQlFjanJ5UUJCSENBREtBSU1FUUlBQ3lBQ1FVQnJKQUFMMncwQkRYOGpBRUVnYXlJSEpBQWdBRUVrYWlFSklBQkJJR29oQmlBQVFSQnFJUXNnQUVFTWFpRU1JQUFvQWdRaEFTQUFLQUlBSVFRQ1FBTkFJQUFvQWh3aENpQUFMd0VNSVFNZ0FDZ0NHQ0VDSUFBb0FoQWhDQU5BQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUVRUUZyRGdJQUFRSUxBa0FnQ0VHQWdNUUFSd1JBSUFOQi8vOERjU0lGUVFWSkRRRWdCVUVFUVpTYjBnQVF1QWtBQ3lBQklBcFBEUWdnQWlFTERBb0xJQUVnQlVrTkNVRUFJUU1nQlVVTkNDQU1RUUE3QVFBTUNBc2dDRUdBZ01RQVJnMENJQU5CLy84RGNTSUpRUVZKRFFFZ0NVRUVRWlNiMGdBUXVBa0FDd05BQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUovQWtBQ1FDQUFLQUpRUlFSQUFrQWdBQ2dDUkNJQ1JRMEFJQUlnQUNnQ1NFWU5BQ0FBSUFKQkFXbzJBa1FDUUNBQ0xRQUFJZ0hBUVFCT0RRQWdBQ0FDUVFKcU5nSkVJQUl0QUFGQlAzRWhCU0FCUVI5eElRTWdBVUhmQVUwRVFDQURRUVowSUFWeUlRRU1BUXNnQUNBQ1FRTnFOZ0pFSUFJdEFBSkJQM0VnQlVFR2RISWhCU0FCUWZBQlNRUkFJQVVnQTBFTWRISWhBUXdCQ3lBQUlBSkJCR28yQWtRZ0EwRVNkRUdBZ1BBQWNTQUNMUUFEUVQ5eElBVkJCblJ5Y2lJQlFZQ0F4QUJHRFFFTElBQXRBRlJGRFFZZ0FVR0FBVWtOQnlBQlFZRFlBbXNpQWtHazF3QkpEUVVnQjBFUWFpQUJFT01ESUFjb0FoQWlCRVVOQXlBSEtBSVVEQVFMQW44Z0FDZ0NLRUdBZ01RQVJnUkFJQUFvQWpRTUFRc2dCaThCQUF0RkRRY2dCaERiQWlBQUFuOGdBQ2dDS0NJRVFZQ0F4QUJHQkVBZ0FDZ0NOQXdCQ3lBR0x3RUFDellDVUF3QkN5QUFLQUlvSVFRTElBQW9Ba3dDZnlBRVFZQ0F4QUJHQkVBZ0FDZ0NOQ0VFSUFBb0FqQU1BUXNnQmk4QkFDSUVRUVZQRFFjZ0NRc2dCRUhFbXRJQUVOQUhLQUlFSVFVZ0FDZ0NURUVCYWlJQ0lBQW9BbEJIQkVBZ0FDQUNOZ0pNREFvTEFuOGdBQ2dDS0VHQWdNUUFSZ1JBSUFBb0FqUU1BUXNnQmk4QkFBc2dBbXNoQ0VFQUlRUkJCQ0VEQTBBZ0JDQUlSd1JBSUFBb0FsQWdCR29DZnlBQUtBSW9RWUNBeEFCR0JFQWdBQ2dDTkNFQklBQW9BakFNQVFzZ0JpOEJBQ0lCUVFWUERRb2dDUXNnQVVIVW10SUFFTkFISWdJb0FnUWhDaUFDTFFBQUlRMENmeUFBS0FJb1FZQ0F4QUJHQkVBZ0FDZ0NOQ0VCSUFBb0FqQU1BUXNnQnlBR0x3RUFJQWtRMFFjZ0J5Z0NCQ0VCSUFjb0FnQUxJQUVnQkUwTkNpQURhaUlDSUFvMkFnQWdBa0VFYXlBTk9nQUFJQVJCQVdvaEJDQURRUWhxSVFNTUFRc0xBa0FnQUNnQ0tFR0FnTVFBUmdSQUlBZ2dBQ2dDTkVzTkFTQUFJQWcyQWpRTUFRc2dDQ0FHTHdFQVR3MEFJQVlnQ0RzQkFBc2dBRUlBTndKTURBa0xJQWRCQ0dvZ0FSRGtBeUFIS0FJSUlRUWdCeWdDREFzZ0JFVU5Ba0VDZENFREEwQWdBMFVOQ1NBR0lBUW9BZ0FRdGdVZ0EwRUVheUVESUFSQkJHb2hCQXdBQ3dBTElBWWdBa0gvL3dOeElnRkJ6QVJ1SWdOQmdDSnlFTFlGSUFZZ0FpQURRY3dFYkd0Qi8vOERjVUVjYmtIaEltb1F0Z1VnQVVFY2NDSUNSUTBISUFKQnB5TnFJUUVNQVFzZ0FVR0FBVWtOQUNBQlFZRFlBbXNpQWtHazF3QlBCRUFnQjBFWWFpQUJFT1FESUFjb0FoZ2lBMFVOQVNBSEtBSWNRUUowSVFRRFFDQUVSUTBJSUFZZ0F5Z0NBQkMyQlNBRVFRUnJJUVFnQTBFRWFpRUREQUFMQUFzZ0JpQUNRZi8vQTNFaUFVSE1CRzRpQTBHQUluSVF0Z1VnQmlBQ0lBTkJ6QVJzYTBILy93TnhRUnh1UWVFaWFoQzJCU0FCUVJ4d0lnSkZEUVlnQWtHbkkyb2hBUXNnQmlBQkVMWUZEQVVMSUFCQ0FqY0NBRUVDSVFSQkFDRUJJQUFvQWdnaUEwR0FnTVFBUmcwT0lBQkJnSURFQURZQ0NBd1BDeUFFUVFSQmxKdlNBQkM0Q1FBTElBRkJCRUdVbTlJQUVMZ0pBQXNnQkNBQlFlU2EwZ0FReGdRQUN5QUZFT2dFSVFJQ1FBSkFBa0FDUUNBQUtBSUlJZ05CZ0lERUFFY0VRQ0FBTFFCWVJRMEJJQUpCL3dGeElnRWdBQzBBV1UwTkF5QURJQVVRV2lJQlFZQ0F4QUJIRFFJTUJBc2dBa0gvQVhGRkJFQWdBQ0FGTmdJSURBVUxJQVVoQXd3UEN5QURJQVVRV2lJQlFZQ0F4QUJIQkVBZ0FDQUJOZ0lJREFRTElBSkIvd0Z4RFFJZ0FDQUZOZ0lJREE0TElBQWdBVFlDQ0F3Q0N5QUJEUUFnQUVFQU9nQllJQUFnQlRZQ0NDQUFRZ0UzQWdBTURBc2dEQ0FGRVBzQ0lBQWdBam9BV1NBQVFRRTZBRmdNQUFzQUN5QUxJUUlnQVNBSlNRMEJJQU5CLy84RGNVVU5BeUFNUVFBN0FRQU1Bd3NnQVNBS1R3MEJDeUFDSUFGQkFuUnFLQUlBSVFNZ0FDQUJRUUZxTmdJRUlBQkJBallDQUF3SEN5QUFRUUEyQWh3TElBQW9BZ2doQXlBQVFZQ0F4QUEyQWdnTUJRdEJBQ0VLSUFCQkFEWUNIQXRCQUNFRUlBQkJBRFlDQUF3QkN3c0xJQXNnQVVFQ2RHb29BZ0FoQXlBQUlBRkJBV28yQWdRZ0FFRUJOZ0lBQ3lBSFFTQnFKQUFnQXd2aERnSVBmd0YrSXdCQjBBTnJJZ0lrQUNBQlFRaHFJUTRnQWtHRUEyb2hEQ0FDUVpBQ2FpRVBJQUpCbEFKcUlSQWdBa0dNQTJvaENpQUNRZGdBYWtFRWNpRU5Ba0FDUUFOQUFrQUNRQUpBQWtBZ0FTZ0NJQ0lEQkVBZ0FTQURRUUZyTmdJZ0FrQUNRQUpBQWtBZ0FTZ0NBQ0lEUVFGSERRQWdBU2dDQkEwQUlBRW9BZ3doQkNBT0lRTURRQ0FES0FJQUlRTWdCQVJBSUFSQkFXc2hCQ0FEUVl3QmFpRUREQUVGSUFGQ0FEY0NDQ0FCSUFNMkFnUWdBVUVCTmdJQURBTUxBQXNBQ3lBRFJRMEJJQUVvQWdRaEF3c2dBU2dDRENFSUlBRW9BZ2doQkFOQUlBZ2dBeThCaWdGSkRRSWdBeWdDV0NJR0JFQWdCRUVCYWlFRUlBTXZBWWdCSVFnZ0JpRUREQUVMQzBId3c4a0FFTHNKQUF0QmtNVEpBQkM3Q1FBTElBaEJBV29oQndKQUlBUkZCRUFnQXlFR0RBRUxJQU1nQjBFQ2RHcEJqQUZxSVFsQkFDRUhRUUFoQlFOQUlBa29BZ0FpQmtHTUFXb2hDU0FFSUFWQkFXb2lCVWNOQUFzTElBRWdCellDRENBQlFRQTJBZ2dnQVNBR05nSUVJQU1nQ0VFRGRHb2lBeThCQUVFQ1J3MEZJQU5CQkdvb0FnQWhBeUFCS0FJa0lRWWdBa0VBTmdKWUlBSkJpQUpxSWdRUXZRVWdBa0dBQTJvZ0JpQURJQUpCMkFCcUlBUVFvZ0VnQWlnQ2lBTWlBMEVNUmdSQUlBb1F6UUlnQWlnQ2lBSWdBaWdDakFJUTVRVU1CZ3NnQWlnQ2dBTWhDQ0FDTHdHRUF5RUpJQTBnQ2tIRUFQd0tBQUFnQWlBRE5nSllJQUlvQW9nQ0lBSW9Bb3dDRU9VRkFrQUNRQUpBSUFFb0FpZ2lCQ2dDQUNJREJFQWdBa0dBQTJvZ0NDQUpJQUpCMkFCcUlBTVJBQUFnQWlnQ2lBTWlBMEVNUmcwQklBSXBBNEFESVJFZ0VDQUtRY1FBL0FvQUFDQUNJQU0yQXBBQ0lBSWdFVGNEaUFJZ0R4Q2VCQXNnQWtHa0FXb2dBa0hZQUdvUS9nUWdBaWdDcEFGQm40Q0FnSGhIRFFjQ1FDQUNLQUtvQVNJRFFRaHFRY3pZeVFCQkJoQ2xBd1JBSUFFb0Fpd3RBQUJCQVVjTkFRc2dBeWdDUUVVTkF3d0lDeUFDUVlBRGFpSUdJQU1RTFNBQ0tBS0FBMEdmZ0lDQWVFWU5BU0FHRU0wQ0lBSkJwQUZxRU1zSUN5QUNRZGdBYWhDZUJBd0hDeUFDUWRBQmFpQU1RUWhxS0FJQU5nSUFJQUlnRENrQ0FEY0R5QUVnQWlBQktBSXdJZ1l0QUFBaUF6b0FpQUlnQmtFQk9nQUFJQU5CQVVZTkNDQUVLQUlBSWdNRVFDQUNJQU0yQXJnQklBSW9Bc3dCSVFRZ0FpQUNLQUxRQVVFQUlBSW9Bc2dCSWdNYk5nTDBBU0FDSUFRMkF2QUJJQUlnQXpZQzdBRWdBa0VBTmdMb0FTQUNJQU5CQUVjaUJUWUM1QUVnQWlBRU5nTGdBU0FDSUFNMkF0d0JJQUpCQURZQzJBRWdBaUFGTmdMVUFTQUNJQUpCdUFGcU5nTDRBU0FDUVlnQ2FpSURJQUpCMUFGcUlnUVE4d0lDUUFKQUFrQWdBaWdDa0FKQkRFY0VRRUhRQUNFRklBSkJDR3BCQkVFSVFkQUFRZmo0elFBUW1nVWdBaWdDQ0NFTElBSW9BZ3dpQnlBRFFkQUEvQW9BQUVFQklRTWdBa0VCTmdLRUFpQUNJQWMyQW9BQ0lBSWdDellDL0FFZ0FrSFlBbW9nQkVFby9Bb0FBQU5BSUFKQmdBTnFJQUpCMkFKcUVQTUNJQUlvQW9nRFFReEdEUUlnQWlnQy9BRWdBMFlFUUNBQ1Fmd0Jha0VCRU13SElBSW9Bb0FDSVFjTElBVWdCMm9nQWtHQUEycEIwQUQ4Q2dBQUlBSWdBMEVCYWlJRE5nS0VBaUFGUWRBQWFpRUZEQUFMQUFzZ0FrRUFOZ0tJQXlBQ1FvQ0FnSUNBQVRjRGdBTWdBa0hVQVdvUTVnVU1BUXNnQWtHQUEyb1FzZ2dnQWtIWUFtb1E1Z1VnQWtHSUEyb2dBa0dFQW1vb0FnQWlBellDQUNBQ0lBSXBBdndCTndPQUF5QUREUUVMSUFKQkFEWUN4QUVnQWtFQU5nSzhBU0FDUVlBRGFoQ3pDQXdGQ3lBRFFRRkdEUU1nQWlnQ2hBTWhCQ0FEUVJWUEJFQWpBRUdBSUdzaUJTUUFBa0JCb0kwR0lBTWdBMEdnalFaUEd5SUhJQU1nQTBFQmRtc2lDeUFISUF0TEd5SUhRVFJQQkVBZ0JTQUhFTUFHSUFRZ0F5QUZLQUlFSUFVb0FnZ2lCRUhRQUd4cUlBVW9BZ0FnQkdzZ0EwSEJBRWtRTlNBRkVMTUlEQUVMSUFRZ0F5QUZRVE1nQTBIQkFFa1FOUXNnQlVHQUlHb2tBQXdFQzBIUUFDRUZJQU5CMEFCc0lRTURRQ0FESUFWR0RRUWdCQ0FFSUFWcUVLNENJQVZCMEFCcUlRVU1BQXNBQ3lBR1FRUnFJQUpCeUFGcUVJMEVEQVFMSUFJZ0FTZ0NOQ0lHTFFBQUlnTTZBSWdDSUFaQkFUb0FBQ0FEUVFGR0RRY2dCaWdDRENJRElBWW9BZ1JHQkVBZ0JrRUVha0hVMk1rQUVOZ0ZDeUFHS0FJSUlBTkJBM1JxSWdRZ0NUc0JCQ0FFSUFnMkFnQWdCaUFEUVFGcU5nSU1EQU1MSUFCQkREWUNDQ0FDUVF3MkFvZ0RJQUpCZ0FOcUVMSUlEQVVMSUFKQnZBRnFJQUpCZ0FOcUVFZ0xJQVpCQkdvZ0FrRzhBV29RalFRTElBWkJBRG9BQUFzZ0FrR2tBV29ReXdnZ0FpZ0NXQ0VESUFKQkZHb2lCeUFOUWNRQS9Bb0FBQ0FEUVF4R0RRQUxJQUpCakFOcUlBZEJ4QUQ4Q2dBQUlBSWdBellDaUFNZ0FpQUlyU0FKclVMLy93T0RRaUNHaERjRGdBTWdBQ0FDUVlBRGFrSFFBUHdLQUFBTElBSkIwQU5xSkFBUEN5QUNRZ0EzQW93RElBSkNnWUNBZ01BQU53S0VBeUFDUWVER3lRQTJBb0FESXdCQkVHc2lBQ1FBSUFCQjZNYkpBRFlDRENBQUlBSkJpQUpxTmdJSUlBQkJDR3BCNUl6U0FDQUFRUXhxUWVTTTBnQWdBa0dBQTJwQnlNZkpBQkRvQVFBTHFnd0NFbjRJZnlNQVFlQUFheUlWSkFBQ1FBSi9Ba0FDUUFKQUFrQUNRQUpBQWtBZ0FTa0RBQ0lEVUVVRVFDQUJLUU1JSWdSUURRRWdBU2tERUNJRlVBMENJQU1nQlh3aUJTQURWQTBESUFNZ0JGUU5CQ0FGUW9DQWdJQ0FnSUNBSUZvTkJTQVZJQUV2QVJnaUFUc0JPQ0FWSUFNZ0JIMGlCemNETUNBVklBY2dCWGtpQklZaUNDQUVpQ0lHTndOQUlBWWdCMUlOQ1NBVklBRTdBVGdnRlNBRE53TXdJQlVnQXlBRVFqK0RJZ2VHSWdZZ0I0Z2lCemNEUUNBRElBZFNEUWxCb0g4Z0FTQUVwMnNpRjJ2QlFkQUFiRUd3cHdWcVFjNFFiU0lCUWRFQVR3MEdJQlZCSUdvZ0FVRUVkQ0lCUWNqa3dBQnFLUU1BSWdOQ0FDQUZJQVNHRUlzRUlCVkJFR29nQTBJQUlBZ1Fpd1FnRlNBRFFnQWdCaENMQkVJQlFRQWdGeUFCUWREa3dBQnFMd0VBYW10QlAzR3RJZ2FHSWdoQ0FYMGhDaUFWS1FNUVFqK0hJUXdnRlNrREFFSS9pQ0VPSUJVcEF3Z2hEeUFCUWRMa3dBQnFMd0VBSVJjZ0ZTa0RHQ0VRSUJVcEF5Z2lFeUFWS1FNZ1FqK0lJaFI4SWhGQ0FYd2lDU0FHaUtjaUZrR1F6Z0JQQkVBZ0ZrSEFoRDFKRFFnZ0ZrR0F3dGN2VHdSQVFRaEJDU0FXUVlDVTY5d0RTU0lCR3lFWlFZREMxeTlCZ0pUcjNBTWdBUnNNQ2d0QkJrRUhJQlpCZ0szaUJFa2lBUnNoR1VIQWhEMUJnSzNpQkNBQkd3d0pDeUFXUWVRQVR3UkFRUUpCQXlBV1FlZ0hTU0lCR3lFWlFlUUFRZWdISUFFYkRBa0xRUXBCQVNBV1FRbExJaGtiREFnTFFkL2d3QUJCSEVHWTc4QUFFSndHQUF0QmpPSEFBRUVkUWFqdndBQVFuQVlBQzBHODRjQUFRUnhCdU8vQUFCQ2NCZ0FMUWVEaXdBQkJOa0c0OE1BQUVKd0dBQXRCbU9MQUFFRTNRYWp3d0FBUW5BWUFDMEhJNzhBQVFTMUIrTy9BQUJDY0JnQUxJQUZCMFFCQmlPL0FBQkRHQkFBTFFRUkJCU0FXUWFDTkJra2lBUnNoR1VHUXpnQkJvSTBHSUFFYkN5RUJJQWtnQ29NaEJDQU9JQTk4SVFzZ0dTQVhhMEVCYWlFYklBd2dFSDBnQ1h4Q0FYd2lEU0FLZ3lFRkFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFOQUlBSWdHR29nRmlBQmJpSWNRVEJxSWhvNkFBQWdHRUVCYWlFWEFrQWdGaUFCSUJ4c2F5SVdyU0FHaGlJU0lBUjhJZ01nRFZvRVFDQVlJQmxIRFFFZ0Z5RUJRZ0VoQXdOQUlBTWhCeUFCUVJGR0RRVWdBU0FDYWlBRVFncCtJZ1FnQm9pblFUQnFJaGc2QUFBZ0FVRUJhaUVCSUFOQ0NuNGhBeUFGUWdwK0lnVWdCQ0FLZ3lJRVdBMEFDeUFESUFrZ0MzMStJZ2tnQTN3aEJpQUZJQVI5SUFoVUloWU5CeUFFSUFrZ0EzMGlDVlFOQXd3SEN5QU5JQU45SWdVZ0FhMGdCb1lpQjFRaEFTQUpJQXQ5SWdaQ0FYd2hDQ0FGSUFkVUlBTWdCa0lCZlNJSlduSU5CQ0FDSUJkcVFRRnJJUmdnRENBUmZDQVFmU0FFSUFkOElnUWdFbng5UWdKOElRb2dFU0FMZlNBRGZTRUxJQVFnRG53Z0Qzd2dGSDBnRTMwZ0Vud2hCa0lBSVFRRFFDQURJQWQ4SWdVZ0NWUWdCQ0FMZkNBR1duSkZCRUJCQUNFQkRBWUxJQmdnR2tFQmF5SWFPZ0FBSUFRZ0Nud2lEQ0FIVkNFQklBVWdDVm9OQmlBR0lBZDhJUVlnQkNBSGZTRUVJQVVoQXlBSElBeFlEUUFMREFVTElBRkJDa2tnRnlFWUlBRkJDbTRoQVVVTkFBdEJpUERBQUJEcUJnQUxJQUVnQW1wQkFXc2hGeUFGSUFoOUlRc2dDQ0FKZlNFTlFnQWdCSDBoQ2dOQUlBUWdDSHdpQXlBSlZDQUpJQXA4SUFRZ0RYeGFja1VFUUVFQUlSWU1CUXNnRnlBWVFRRnJJaGc2QUFBZ0NpQUxmQ0lNSUFoVUlSWWdBeUFKV2cwRklBb2dDSDBoQ2lBRElRUWdDQ0FNV0EwQUN3d0VDMEVSUVJGQm1QREFBQkRHQkFBTElBTWhCUXNDUUNBRklBaGFJQUZ5RFFBZ0NDQUZJQWQ4SWdOWUlBZ2dCWDBnQXlBSWZWUnhEUUFnQUVFQU5nSUFEQVFMSUFVZ0RVSUVmVmdnQlVJQ1duRkZCRUFnQUVFQU5nSUFEQVFMSUFBZ0d6c0JDQ0FBSUJjMkFnUU1BZ3NnQkNFREN3SkFJQU1nQmxvZ0ZuSU5BQ0FHSUFNZ0NId2lCRmdnQmlBRGZTQUVJQVo5VkhFTkFDQUFRUUEyQWdBTUFnc2dBeUFIUWxoK0lBVjhXQ0FESUFkQ0ZINWFjVVVFUUNBQVFRQTJBZ0FNQWdzZ0FDQWJPd0VJSUFBZ0FUWUNCQXNnQUNBQ05nSUFDeUFWUWVBQWFpUUFEd3NnRlVFQU5nSklJd0JCRUdzaUFDUUFJQUFnRlVFd2FqWUNEQ0FBSUJWQlFHczJBZ2dnQUVFSWFrR0U5Y0FBSUFCQkRHcEJoUFhBQUNBVlFjZ0Fha0hjM3NBQUVPZ0JBQXVnRFFFc2Z5TUFRZkFBYXlJQ0pBQWdBa0ZBYTBHUXo4a0FRUUVnQVJDOUFpQUNLQUpZSVEwZ0FpZ0NWQ0VQSUFJb0FsQWhEaUFDS0FKTUlSQWdBaWdDU0NFTUlBSW9Ba1FoRVFKL0FrQUNmeUFDS0FKQUlncEJBMGNFUUNBQ0tBSmNEQUVMSUFKQkNHcEJCRUVCUVFGQjlLekpBQkNhQlNBQ0tBSU1JUk1nQWlnQ0NDRVZJQUpCM3dCcUlTUWdBa0hiQUdvaEpRSi9BMEFDUUNBQ0lBMDJBaVFnQWlBUE5nSWdJQUlnRGpZQ0hDQUNJQkEyQWhnZ0FpQU1OZ0lVSUFJZ0VUWUNFQ0FDUVVCclFkaWN5UUJCQVNBQ1FSQnFFSllDSUFJb0FsUWhCU0FDS0FKUUlRa2dBaWdDVENFSUlBSW9Ba2doQmlBQ0tBSkVJUWNnQWlnQ1FDRUtBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUl0QUZnaUJFRTdSd1JBSUFJdkFGa2dKUzBBQUVFUWRISWhBd3dCQ3lBQ0lBVTJBandnQWlBSk5nSTRJQUlnQ0RZQ05DQUNJQVkyQWpBZ0FpQUhOZ0lzSUFJZ0NqWUNLQ0FDUVVCclFRSWdBa0VvYWhEZ0FTQUNLQUpFSVNFZ0FpZ0NTQ0VLSUFJb0Frd2hCeUFDS0FKUUlRWWdBaWdDVkNFSUlBSW9BbGdoQ1NBQ0tBSmNJUVVnQWlnQ1lDRUVBa0FDUUFKQUFrQWdBaWdDUUNJRFJRMEFRUUFoQVFOQUlBRWdCVWNFUUNBQklBbHFMUUFBSWhKQk1HdEIvd0Z4UVFwSklCSkI0UUJyUVFaSmNrVWdFa0hCQUd0QkJVdHhEUWNnQVVFQmFpRUJEQUVMQ3lBRFJRMEFJQUpCUUdzZ0NTQUZFR2NnQWlnQ1FFRUJSd1JBSUFJZ0FpZ0NSQ0FDS0FKSUVPRUJJQUl0QUFBTkJpQUNMUUFCSVFRZ0lTRVdJQW9oRnlBSElSSWdCaUVKSUFnaEJTQURJUW9NQWdzZ0FpQUNLUUpFTndNb1FZRFAwZ0JCS3lBQ1FTaHFRWWlzeVFCQmdLN0pBQkNNQkFBTElBUkJDSFloQXlBSElSWWdCaUVYSUFnaEVpQWhRUUZyRGdNRUFnQUJDeUFGSVFNZ0NTRUhJQkloQ0NBWElRRWdGaUVHREFZTFFUa2hCQ0FiSVFVZ0hDRUpJQjBoQ0NBZUlRWWdKaUVESUI4aEJ3d0RDeUFESVNZZ0J5RWZJQVloSGlBSUlSMGdDU0VjSUFVaEd3c2dCRUgvQVhGQk9rY05BUXNnQWlBTk5nSThJQUlnRHpZQ09DQUNJQTQyQWpRZ0FpQVFOZ0l3SUFJZ0REWUNMQ0FDSUJFMkFpZ2dBa0ZBYTBFQklBSkJLR29RaGdRZ0FpZ0NTQ0VCSUFJb0FrUWhCZ0ovSUFJb0FrQWlDa1VFUUVFNUlRTUNRQUpBQWtBZ0JrRUJhdzRDQUFFQ0MwRTZJUU1NQVFzZ0FpOEFZU0FDUWVNQWFpMEFBRUVRZEhJaElpQUNMUUJnSVFNZ0FpZ0NYQ0VqSUFJb0FsZ2hJQ0FDS0FKVUlSZ2dBaWdDVUNFWklBSW9Ba3doR2dzZ0lrRUlkQ0FEY2d3QkN5QUNMUUJjSUFJdkFGMGdKQzBBQUVFUWRISWlJa0VJZEhKRkRRWUNRQ0FDS0FKWUxRQUFJZ1JCSTBZTkFDQUNLQUpVSVFNZ0FpZ0NVQ0VISUFJb0Frd2hDRUdzMGRJQVFRWWdCQkNYQkEwQVFaU3R5UUJCQ2lBRUVKY0VSUTBEQ3lBWUlTQWdHU0VZSUJvaEdTQW5JUm9nS0NFQklBdEJnSDV4UVRweUN5RUxRVG9oQkNBcElRVWdLaUVKSUNzaENDQXNJUVlnTFNFRElBdEIvd0Z4UVRwR0RRQWdDMEVJZGlFRElDTWhCU0FnSVFrZ0dDRUlJQmtoQmlBQklRb2dDeUVFSUJvaEJ3dEJBaUFFUVRsclFmOEJjU0lCSUFGQkFrOGJJZ3RCQVdzT0FnTUNCZ3NnQzBFSWRpRXRJQjhoRmlBZUlSY2dIU0VTSUJ3aENTQWJJUVVnQXlFaklBWWhKeUFLSVNnZ0FTRWFJQWdoR1NBSElSZ2dBeUVnSUF0QmdINXhJQVJ5SWdzaEJBc2dCaUFNUncwRFFRRWhDMEVJSVFRZ0R5RUpJQXdoQnlBUklRb01CQXNnQ0NFT0lBWWhFQ0FGSVExQkFpRUxEQU1MSUJOQkNIWWhBeUFPSUJBaEJ5QU5JUWtnRHlFT0lSQWdFeUVFSUJVaERTQU1JUW9nRVNFTFFRQU1CQXRCQUVFQVFhQ3V5UUFReGdRQUN5QUNJQVE2QUV3Z0FpQVVOZ0pJSUFJZ0V6WUNSQ0FDSUJVMkFrQWdBa0ZBYXlBRVFZU3R5UUFRL0FZZ0FpZ0NTQ0VVSUFJb0FrUWhFeUFDS0FKQUlSVWdGaUVmSUJjaEhpQVNJUjBnQ1NFY0lBVWhHeUFESVNrZ0J5RXFJQWdoS3lBQklTd2dBeUVOSUFjaER5QUlJUTRnQVNFUUlBWWhEQ0FLSVJFTUFRc0xJQlVnRXhDcENVRUJDMEVJSVFFZ0JFSC9BWEVnQTBFSWRISWhCa1VOQVNBSklROGdCeUVNSUFvaEVTQUxJUW9nQmdzaEZDQUFJQkEyQWhBZ0FDQU1OZ0lNUVFFaEEwRWdJUVZCSENFRVFRZ2hERUVFSVFGQkZDRUlRUmdNQVFzZ0FDQU9OZ0lVSUFBZ0VEWUNFQ0FBSUFjMkFneEJBQ0VEUVNRaEJVRWdJUVJCSENFTVFSZ2hDQ0FKSVE0Z0N5RVBJQTBoRVNBR0lRMUJCQXNoQnlBQUlBaHFJQTQyQWdBZ0FDQUhhaUFQTmdJQUlBQWdBV29nQ2pZQ0FDQUFJQXhxSUJFMkFnQWdBQ0FFYWlBTk5nSUFJQUFnQXpZQ0FDQUFJQVZxSUJRMkFnQWdBa0h3QUdva0FBdUpEZ0lJZndGK0l3QkJrQUpySWdJa0FDQUNRYkFCYWlJRUlBRVE5QUlnQkJETENBSkFBa0FDUUFKQUFrQWdBU2dDUUFSQUlBSkJ5QUJxSWdVZ0FVRUlhaUlHUWN6VnlRQkJCUkRQQVNBRUlBVVFrQVVnQWlnQ3NBRUVRQ0FDS0FLMEFTRUJJQUlwQTdnQklRb2dBQ0FDS1FQQUFUY0NEQ0FBSUFvM0FnUWdBQ0FCTmdJQURBVUxJQUlwQTdnQklncENnSUNBZ0JCYUJFQWdBa0cwQVdvUXJRUWdBQ0FDS1FLNEFUY0NDQ0FBUVJCcUlBSkJ3QUZxS0FJQU5nSUFJQUFnQWlnQ3RBRTJBZ1FnQUVHVmdJQ0FlRFlDQUF3RkN5QUNJQXFuSWdRMkFpQWdBU2dDUENFRklBRW9Ba0FnQWtHTmdJQ0FlRFlDc0FFZ0FpQUVOZ0swQVNBRVNRUkFJQUFnQkRZQ0JDQUFRWTJBZ0lCNE5nSUFEQVVMSUFKQnNBRnFJZ01RelFJZ0FrRW9haUFGSUFRUVp5QUNLQUlvUVFGR0JFQWdBaUFDS1FJc0lnbzNBNEFDSUFKQkFEWUNvQUVnQWtLQWdJQ0FFRGNDbUFFQ1FDQUtRb0NBZ0lBUWcxQkZCRUFnQWlBS1FpaUlQQUFuSUFKQkFqWUN0QUVnQWtIRSs4QUFOZ0t3QVNBQ1FnSTNBcndCSUFJZ0FrR0FBbXF0UW9DQWdJQ2dBNFEzQTFBZ0FpQUNRU2RxclVLQWdJQ0FnQU9FTndOSUlBSWdBa0hJQUdvMkFyZ0JJQUpCbUFGcVFaalN5UUFnQXhDRkFVVU5BUXdJQ3lBQ1FRRTJBclFCSUFKQmdQekFBRFlDc0FFZ0FrSUJOd0s4QVNBQ0lBSkJnQUpxclVLQWdJQ0FvQU9FTndOSUlBSWdBa0hJQUdvMkFyZ0JJQUpCbUFGcVFaalN5UUFnQWtHd0FXb1FoUUVOQndzZ0Fpa0NtQUVoQ2lBQUlBSTFBcUFCTndJTUlBQWdDamNDQkNBQVFZeUFnSUI0TmdJQURBVUxJQUlvQWpBaEJTQUNLQUlzSVFNZ0FrRUJPd0ZrUVFBaEJDQUNRUUEyQW1BZ0FpQURJQVZxTmdKY0lBSWdBellDV0NBQ0lBVTJBbFFnQWlBRE5nSlFJQUlnQlRZQ1RDQUNRUUEyQWtnZ0FrRVlhaUFDUWNnQWFoQnpRUVFoQlNBQ0tBSVlJZ05CQWtjRVFDQUNLQUljSVFRZ0FrRVFha0VFUVFSQkNFSDQrTTBBRUpvRklBSW9BaEFoQnlBQ0tBSVVJZ1VnQkRZQ0JDQUZJQU0yQWdBZ0FrRUJOZ0tnQVNBQ0lBVTJBcHdCSUFJZ0J6WUNtQUVnQWtISUFXb2dBa0hnQUdvcEFnQTNBd0FnQWtIQUFXb2dBa0hZQUdvcEFnQTNBd0FnQWtHNEFXb2dBa0hRQUdvcEFnQTNBd0FnQWlBQ0tRSklOd093QVVFTUlRTkJBU0VFQTBBZ0FrRUlhaUFDUWJBQmFoQnpJQUlvQWdnaUIwRUNSd1JBSUFJb0Fnd2hDQ0FDS0FLWUFTQUVSZ1JBSUFKQm1BRnFJQVJCQVVFRVFRZ1E0UVVnQWlnQ25BRWhCUXNnQXlBRmFpSUpJQWcyQWdBZ0NVRUVheUFITmdJQUlBSWdCRUVCYWlJRU5nS2dBU0FEUVFocUlRTU1BUXNMSUFJb0FwZ0JJUWNnQWlnQ25BRWhCUXNnQWtISUFHb2lBeUFHUWVxQXpnQkJBUkRQQVNBQ1FiQUJhaUFERUpBRklBSW9BckFCUVFGR0JFQWdBaWdDdEFFaEFTQUNLUU80QVNFS0lBQWdBaWtEd0FFM0Fnd2dBQ0FLTndJRUlBQWdBVFlDQUF3RUN5QUNJQUZCT0dvMkFqZ2dBa0VDTmdJd0lBSWdCRUgrLy8vL0FIRTJBaXdnQWlBRk5nSW9JQUlnQWtFZ2FqWUNOQ0FDUWNnQWFpSUJJQUpCS0dvUTZnRUNRQUpBQWtBZ0FpZ0NVRUVNUndSQUlBSkJzQUZxSUFJb0Fpd2dBa0V3YWlJR0tBSUFFTHNGUWRBQUlRUWdBa0VFSUFJb0FyQUJRUUZxSWdOQmZ5QURHeUlESUFOQkJFMGJRUWhCMEFCQitQak5BQkNhQlNBQ0tBSUFJUWdnQWlnQ0JDSURJQUZCMEFEOENnQUFJQUJCQkdvaENTQUNRUUUyQWtRZ0FpQUROZ0pBSUFJZ0NEWUNQQ0FDUWFnQmFpQUNRVGhxS0FJQU5nSUFJQUpCb0FGcUlBWXBBZ0EzQXdBZ0FpQUNLUUlvTndPWUFVRUJJUUVEUUNBQ1FiQUJhaUFDUVpnQmFoRHFBU0FDS0FLNEFVRU1SZzBDSUFJb0Fqd2dBVVlFUUNBQ1FZQUNhaUFDS0FLY0FTQUNLQUtnQVJDN0JTQUNRVHhxSUFJb0FvQUNRUUZxSWdOQmZ5QURHeERNQnlBQ0tBSkFJUU1MSUFNZ0JHb2dBa0d3QVdwQjBBRDhDZ0FBSUFJZ0FVRUJhaUlCTmdKRUlBUkIwQUJxSVFRTUFBc0FDeUFDUVFBMkFrUWdBa0tBZ0lDQWdBRTNBandNQVFzZ0FrR3dBV29Rc2dnZ0FpZ0NSQ0lCRFFFTElBQkJBRFlDRENBQVFRQTJBZ1FnQWtFOGFoQ3pDQXdEQ3lBQlFRRkdEUUVnQWlnQ1FDRUVJQUZCRlU4RVFDTUFRWUFnYXlJREpBQUNRRUdnalFZZ0FTQUJRYUNOQms4YklnWWdBU0FCUVFGMmF5SUlJQVlnQ0VzYklnWkJORThFUUNBRElBWVF3QVlnQkNBQklBTW9BZ1FnQXlnQ0NDSUVRZEFBYkdvZ0F5Z0NBQ0FFYXlBQlFjRUFTUkF6SUFNUXN3Z01BUXNnQkNBQklBTkJNeUFCUWNFQVNSQXpDeUFEUVlBZ2FpUUFEQUlMSUFGQjBBQnNJUU5CMEFBaEFRTkFJQUVnQTBZTkFpQUVJQUVnQkdvUXJnSWdBVUhRQUdvaEFRd0FDd0FMSUFCQkFEWUNEQ0FBUXArQWdJQUlOd0lBREFNTElBa2dBa0U4YWhCSUN5QUFRWitBZ0lCNE5nSUFDeUFISUFVUXBna0xJQUpCa0FKcUpBQVBDMEhBMHNrQVFUY2dBa0dQQW1wQnNOTEpBRUhFMDhrQUVJd0VBQXYvQ3dJUGZ3TitJd0JCNEFCcklnTWtBQUpBQWtBQ2ZnSi9Ba0FDUUFKQUlBSUVRQ0FEUVFocUlnUWdBa0h2MGNrQVFRa1F6d0VnQTBGQWF5SUhJQVFRa0FVZ0IwSUJFSlVJUWdwOVFnWmFEUVlnQkNBQ1FmalJ5UUJCQnhEUEFTQUhJQVFRa0FVZ0IwSUJFSlVJSVJJZ0JDQUNRZi9SeVFCQkJoRFBBU0FISUFRUWtBVWdBMEZBYTBJQkVKVUlJUk1nQkNBQ1FZWFN5UUJCRUJEUEFTQUhJQVFRa0FVZ0IwSUlFSlVJSVJRZ0FTZ0NDQ0VQSUFFb0FnUWhEQ0FEUVFBMkFpUWdBMEtBZ0lDQUVEY0NIRUdBZ0lDQWVDRUNRb0hNQUNBRFFSeHFJZ2RDQ0NBVUlCUkNDRmNicDBJQklCTWdFMElCVnh1bmJFRURkaUlRUWdFZ0VpQVNRZ0ZYRzZkc0lnUVFqZ2RCZ1lDQWdIaEhEUVVhSUFjZ0JCQ01BeUFEUVFBMkFqQWdBMEtBZ0lDQUVEY0NLQ0FEUVNocUlBUVFqZ2RCZ1lDQWdIaEhCRUFnQTBLQnpBQTNBa1FNQkFzZ0EwRW9haUFFRUl3RElBTkJBRFlDUENBRFFvQ0FnSUFRTndJMElBUkJBV29oRVFOQUlBMGdEMDhFUUNBRFFjZ0FhaUFEUVR4cUtBSUFOZ0lBSUFNZ0F5a0NORGNEUUNBREtBSW9JQU1vQWl3UXFRa2dBeWdDUUF3R0N5QU1JQTFxSWdJdEFBQWlCRUVGVHdSQUlBTkJBallDUkNBRFFlU3J5UUEyQWtBZ0EwSUJOd0pNSUFOQkdEWUNYQ0FESUFJMkFsZ2dBeUFEUWRnQWFqWUNTQ0FEUVFocUlnSWdBMEZBYXlJRUVLOEZJQVJCQkhKQkJFRU1FSjRKSWdSRkJFQUFDeUFFSUFJcEFnQTNBZ0FnQkVFSWFpQUNRUWhxS0FJQU5nSUFRUlVnQkVIWXlNa0FFTDhHREFRTElBTWdEVUVCYWlBTUlBOUJ1S3ZKQUJDZkJ5QURJQU1wQXdBM0FnZ2dBMEZBYXlBRFFRaHFJQU1vQWl3aUJ5QURLQUl3SWdzUXd3TUNRQ0FETFFCQVFRUkdEUUFnQXlrRFFDSVNRdjhCZzBJRVVRMEFJQU1nRWpjQ1JBd0VDeUFMSUJBZ0N5QVFTUnNoQWlBREtBSWtJUWdnQXlnQ0lDRUdBa0FDUUFKQUFrQUNRQ0FFUVFGckRnUUFBUUlEQkFzZ0N5RUVJQWNoQmdOQUlBSWdCRVlOQkNBQ0lBWnFJZ1VnQmkwQUFDQUZMUUFBYWpvQUFDQUVRUUZySVFRZ0JrRUJhaUVHREFBTEFBc2dDeUVFSUFnaEJTQUhJUUlEUUNBRVJRMERJQVVFUUNBQ0lBWXRBQUFnQWkwQUFHbzZBQUFnQkVFQmF5RUVJQVZCQVdzaEJTQUNRUUZxSVFJZ0JrRUJhaUVHREFFTEN5QUlJQWhCNktySkFCREdCQUFMSUFJaEJTQUlJUWtnQnlFRUlBWWhDZ05BSUFWRkJFQWdBaUFHYWlFSklBc2hCQ0FJSUFJZ0FpQUlTUnNpQ2lFRklBY2hCZ05BSUFJZ0JFWU5CQ0FDSUFWSEJFQWdBaUFHYWlJT0lBWXRBQUFnRGkwQUFHb2dDUzBBQUVFQmRtbzZBQUFnQkVFQmF5RUVJQVZCQVdzaEJTQUdRUUZxSVFZZ0NVRUJhaUVKREFFTEN5QUtJQWhCK0tySkFCREdCQUFMSUFrRVFDQUVJQVF0QUFBZ0NpMEFBRUVCZG1vNkFBQWdCVUVCYXlFRklBbEJBV3NoQ1NBRVFRRnFJUVFnQ2tFQmFpRUtEQUVMQ3lBSUlBaEJpS3ZKQUJER0JBQUxJQUloQlNBSUlRa2dCeUVFSUFZaENnTkFJQVZGQkVBZ0N5RUZJQWdnQWlBQ0lBaEpHeUlLSVFrZ0J5RUVBMEFnQWlBRlJnMERJQUlnQ1VZTkJpQUNJQVJxSWc0Z0JDMEFBQ0FDSUFacUxRQUFJQVl0QUFBUXR3TWdEaTBBQUdvNkFBQWdCVUVCYXlFRklBbEJBV3NoQ1NBRVFRRnFJUVFnQmtFQmFpRUdEQUFMQUFzZ0NRUkFJQVJCQUNBS0xRQUFRUUFRdHdNZ0JDMEFBR282QUFBZ0JVRUJheUVGSUFsQkFXc2hDU0FFUVFGcUlRUWdDa0VCYWlFS0RBRUxDeUFJSUFoQnFLdkpBQkRHQkFBTElBTkJOR29nQnlBTEVKY0pJQU5CSEdvZ0EwRW9ha0VERUtjR0lBMGdFV29oRFF3QUN3QUxJQUJCbjRDQWdIZzJBZ0FnQUNBQktRSUFOd0lFSUFCQkRHb2dBVUVJYWlnQ0FEWUNBQXdHQ3lBS0lBaEJtS3ZKQUJER0JBQUxJQU1vQWpRZ0F5Z0NPQkNwQ1FzZ0F5Z0NLQ0FES0FJc0VLa0pRWUNBZ0lCNEN5RUNJQU1wQWtRTElSSWdBeWdDSENBREtBSWdFS2tKSUFKQmdJQ0FnSGhHQkVBZ0FDQVNOd0lFSUFCQmpvQ0FnSGcyQWdBZ0FTZ0NBQ0FNRUtrSkRBSUxJQUVvQWdBZ0RCQ3BDU0FCSUJJM0FnUWdBU0FDTmdJQUN5QUFRWitBZ0lCNE5nSUFJQUFnQVNrQ0FEY0NCQ0FBUVF4cUlBRkJDR29vQWdBMkFnQUxJQU5CNEFCcUpBQUxwUXNDSG44Q2ZpTUFRYUFCYXlJQ0pBQWdBa0hZQUdwQnNNL0pBRUVCSUFFUXZRSWdBaThBWlNBQ1FlY0FhaTBBQUVFUWRISWhBU0FDS0FKd0lRVWdBaWdDYkNFRUlBSW9BbWdoQXlBQ0xRQmtJUVlnQWlnQ1lDRUxJQUlvQWx3aEJ3SkFBa0FDUUNBQ0tBSllJZ2hCQTBjRVFDQUNLQUowSVFrTUFRc2dBVUVJZENBR2NpRVJRUUVoRENBRklRNGdCQ0VQSUFNaEJnSi9BbjhDUUFKQUFrQURRQ0FWUlNBTUlCVnFRUUZySWhkRmNpRWVBMEFnQWlBT05nSlVJQUlnRHpZQ1VDQUNJQVkyQWt3Z0FpQVJOZ0pJSUFJZ0N6WUNSQ0FDSUFjMkFrQWdBa0hZQUdvZ0FrRkFheEQzQVNBQ0tBSndJUUVnQWlnQ2JDRURJQUlvQW1naENDQUNLQUprSVFrZ0FpZ0NZQ0VFSUFJb0Fsd2hCU0FDS0FKWUloSkJBMGNFUUNBQ0tBSjBJaEJCQ0hZaEdBd0RDeUFDSUFFMkFwd0JJQUlnQXpZQ21BRWdBaUFJTmdLVUFTQUNJQWsyQXBBQklBSWdCRFlDakFFZ0FpQUZOZ0tJQVNBQ1FkZ0FhaUlLUVFFZ0FrR0lBV29RNEFFZ0FpZ0NkQ0VCSUFJb0FuQWhBeUFDS0FKc0lRZ2dBaWdDYUNFSklBSW9BbVFoQkNBQ0tBSmdJUVVnQWlnQ1hDRVNBa0FnQWlnQ1dDSWZCRUFnQ2lBRElBRVFaeUFDS0FKWURRVWdBa0VJYWlBQ0tBSmNJQUlvQW1BUTRRRWdBaTBBQ0EwRklBSXRBQWtnRUVHQWZuRnlJUkFnRWlFS0lBVWhFeUFFSVJRZ0NTRURJQWdoQVNBZklRVU1BUXNnQWlnQ2VDRVFJQVFoQ2lBSklSTWdDQ0VVQWtBQ1FDQVNEZ1FBQVFFQ0FRc2dHU0VFSUJvaEFTQWJJUU1nSENFSUlCMGhDUXdHQ3lBUVFRaDJJUmdnRWtFRFJ3MERDeUFLSUF0R0JFQWdDeUVFSUFjaEN5QU9JUUVnRHlFT0lBWWhEeUFSSVFaQkFTRUhRUWdNQmdzZ0ZrVUVRQ0FDSUJVMkFtQWdBaUFNTmdKY0lBSWdEVFlDV0NBQ1FkZ0FhaUFRUVFSMFFiQ3V5UUFRL0FZZ0FpZ0NZQ0VWSUFJb0Fsd2hEQ0FDS0FKWUlRMUJBU0VXSUFvaEdTQVRJUjBnRkNFY0lBTWhHeUFCSVJvZ0FTRU9JQU1oRHlBVUlRWWdFeUVSSUFvaEN5QUZJUWNNQWdzZ0hrVUVRQ0FYSUJjdEFBQWdFSEk2QUFCQkFDRVdJQW9oR1NBVElSMGdGQ0VjSUFNaEd5QUJJUm9nQVNFT0lBTWhEeUFVSVFZZ0V5RVJJQW9oQ3lBRklRY01BUXNMQzBIQXJza0FFTHNKQUFzZ0VrRUJSdzBCQzBFQURBSUxJQVVoQ3lBRElRNGdDQ0VQSUFraEJpQVNJUWNnRUVIL0FYRWdHRUVJZEhJTElBMGdEQkNwQ1NBRUlSRWhEQ0FCSVExQkFRc2hBeUFMclNBUnJVSWdob1FoSUFKK0FrQUNRQ0FEQkVBZ0J5RUlJQTBoQlNBTUlRa2dEaUVFSUE4aEF3d0JDeUFDSUE0MkFqd2dBaUFQTmdJNElBSWdCallDTkNBQ0lDQTNBaXdnQWlBSE5nSW9JQUpCMkFCcUlBSkJLR29ROXdFZ0FrR1FBV29nQWtIa0FHb29BZ0EyQWdBZ0FpQUNLUUpjTndPSUFTQUNLQUp3SVFVZ0FpZ0NiQ0VFSUFJb0FtZ2hBeUFDS0FKWUlnaEJBMFlOQVNBQ0tBSjBJUWtnQWlrRGlBRWhJQ0FDS0FLUUFTRUdJQTBnREJDcENRc2dCcTFDSUlZaElTQWdweUVISUNCQ0lJZ01BUXNnQWlBRk5nSWtJQUlnQkRZQ0lDQUNJQU0yQWh3Z0FpQUNLUUtNQVRjQ0ZDQUNJQUlvQW9nQk5nSVFJQUpCMkFCcVFielB5UUJCQVNBQ1FSQnFFTDBDSUFJb0FuQWhCU0FDS0FKc0lRUWdBaWdDYUNFRElBSXBBbUFoSVNBQ0tBSmNJUWNnQWlnQ1dDSUlRUU5HRFFJZ0FpZ0NkQ0VKSUEwZ0RCQ3BDU0FoUWlDSXB5RUdJQ0VMSUNGQ0tJaW5JUUduSVFzTElBQWdBVHNBS1NBQUlBazJBamdnQUNBRk5nSTBJQUFnQkRZQ01DQUFJQU0yQWl3Z0FDQUdPZ0FvSUFBZ0N6WUNKQ0FBSUFjMkFpQWdBQ0FJTmdJY0lBQkJERFlDR0NBQVFTdHFJQUZCRUhZNkFBQU1BUXNnQUVFUGFpQURRUmgyT2dBQUlBQWdBMEVJZGpzQURTQUFRUUU2QUNnZ0FDQVZOZ0lrSUFBZ0REWUNJQ0FBSUEwMkFod2dBRUVITmdJWUlBQWdCVFlDRkNBQUlBUTJBaEFnQUNBRE9nQU1JQUFnSVVJZ2lENENDQ0FBSUNFK0FnUWdBQ0FITmdJQUN5QUNRYUFCYWlRQUM1TVFBZ2wvQVg0akFFSGdBR3NpQXlRQUlBTkJnSUFFTmdJNElBTkJBRG9BTmlBRFFRazZBRXdnQTBHazVNRUFOZ0pJSUFOQkNqb0FOQ0FEUVJCcUlRbEJBU0VGUVFNaEJ3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRFFUUnFJZ1F0QUFCQkFXc09DZ0VDQXdRRkJnY0xDQWtBQ3lBQ3JVSURmaUlNcHlFSElBeENJSWhRSVFVTUNnc2dCQ2dDQ0VFRWFrRURJQVFvQWd3YklBSnFJZ2NnQWs4aEJRd0pDMEVBSVFVZ0FpQUVMUUFISUFRdEFBVWdCQzBBQXlBRUxRQUJJQVF0QUFscWFtcHFRVDl4YWlJRUlBSkpEUWdnQksxQ0EzNGlERUlnaUtjTkNDQU1weUlGUVFGcUlRY2dCVUYvUnlFRkRBZ0xJQUlnQkMwQUFXb2lCQ0FDU1EwR1FRQWhCU0FFUVFCSURRY2dCRUgvLy8vL0IwY2hCU0FFUVFGMFFRSnFJUWNNQnd0QkFDRUZJQUlnQkMwQUFVRUFSMm9pQkNBQ1NTQUVRWDlHY2cwR0lBUkJBV3BCQVhZaUNDQUVhaUlFSUFoSkRRWWdCRUVDYWlFSElBUkJma2toQlF3R0MwRUFJUVVnQWlBRUxRQUNJZ3RCQVhOQkFDQUVMUUFGSWdjYlFmOEJjU0FFTFFBRFFRVnJRZjhCY1VFQ1NXb2dBbW9pQ0VzTkJTQUlBbjhnQjBFQUlBdEJBWEViUlFSQUlBUXRBQUVNQVFzZ0JDMEFBVUVCYWd0Qi93RnhhaUlFSUFoSkRRVWdCSzFDQTM0aURLY2hCeUFNUWlDSVVDRUZEQVVMSUFJZ0JDMEFBV29pQlNBQ1NRMERJQVd0UWdOK0lneW5JUWNnREVJZ2lGQWhCUXdFQzBFQUlRVWdBaUFFTFFBQmFpSUVJQUpKSUFSQmYwWnlEUU1nQkVFQmFrRUJkaUlJSUFScUlnUWdDRWtOQXlBRVFRSnFJUWNnQkVGK1NTRUZEQU1MSUFLdFFnTitJZ3luSVFjZ0RFSWdpRkFoQlF3Q0MwRUFJUVVnQWlBRUx3RUVRUUJIUVFGMFFRSkJBU0FFTFFBQ0cycHFJZ1FnQWtrTkFTQUVRUUYyclVJRGZpSU1RaUNJcHcwQklBeW5JZ1ZCQVdvaEJ5QUZRWDlISVFVTUFRdEJBQ0VGQ3lBSklBYzJBZ1FnQ1NBRk5nSUFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQXlnQ0VFRUJjUVJBSUFNb0FoUWlCVUVBU0EwS1FRRWhDU0FGQkVCQmdPRGFBQzBBQUJvZ0JSQVdJZ2xGRFFvZ0JTRUtDeUFEUVRCcUlnVWdBMEhNQUdvb0FnQTJBZ0FnQTBFb2FpQURRY1FBYWlrQ0FEY0RBQ0FEUVNCcUlBTkJQR29wQWdBM0F3QWdBeUFES1FJME53TVlJQU5CQ0dwQkFDQUpJQXBCbk9iQkFCQ2ZCeUFGTFFBQUlRY2dBeWdDRENFRklBTW9BZ2doQkFKQUFrQUNRQU5BQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FIUWY4QmNVRUJhdzRLQkFVR0J3a0tDd0FCQWdNTElBTkJDRG9BTUNBRFFkQUFhaUFEUVJocUlBRWdBaUFFSUFWQkFFRzdBUkRwQWd3VEN5QURRUWs2QURBZ0EwSFFBR29nQTBFWWFpQUJJQUlnQkNBRkVNOEVEQklMUWZEbHdRQkJLVUdzNXNFQUVKd0dBQXNnQWtVTkR3SkFBa0FDUUNBQkxRQUFJZ2hCL2dGckRnSUJBZ0FMUVFraEJ5QUlRZThCUncwR0lBWkJBV29oQmtFRUlRY01CZ3NnQmtFQmFpRUdRUVloQnd3RkN5QUdRUUZxSVFaQkJ5RUhEQVFMSUFKRkRRMUJCRUVKSUFFdEFBQkI3d0ZHSWdnYklRY2dCaUFJYWlFR0RBTUxJQUpGRFF0QkJrRUpJQUV0QUFCQi9nRkdJZ2diSVFjZ0JpQUlhaUVHREFJTElBSkZEUWxCQjBFSklBRXRBQUJCL3dGR0lnZ2JJUWNnQmlBSWFpRUdEQUVMSUFJZ0JrMEVRQ0FEUVFRNkFEQWdBMEhRQUdvZ0EwRVlhaUFCSUFJZ0JDQUZJQVpCN3dFUTZRSU1EUXNnQVNBR2FpMEFBRUc3QVVZRVFDQUdRUUZxSVFaQkJTRUhEQUVMQ3lBRFFRUTZBREFnQTBIUUFHb2dBMEVZYWlBQklBSWdCQ0FGSUFaQjd3RVE2UUlNQ3dzZ0EwRUZPZ0F3SUFJZ0JrMEVRQ0FEUWRBQWFpQURRUmhxSUFFZ0FpQUVJQVVnQmhDdEFnd0xDeUFCSUFacUxRQUFRYjhCUncwRElBTkJDVG9BTUNBREtBSXNRZHprd1FCSEJFQWdBMEdBL3dJN0FTZ2dBMEVBTmdJa0lBTkNBRGNDSENBRFFRRTZBQmdnQTBIYzVNRUFOZ0lzQ3lBRFFkQUFhaUFEUVJocUlBRWdBaUFFSUFVZ0JrRUJhaENSQkF3S0N5QURRUVk2QURBZ0FpQUdUUVJBSUFOQjBBQnFJQU5CR0dvZ0FTQUNJQVFnQlNBR1FmNEJFT2tDREFvTElBRWdCbW90QUFCQi93RkhEUU1nQTBFSk9nQXdJQU1vQWl4QnBPVEJBRWNFUUNBRFFZQ0FCRFlDSENBRFFRQTZBQm9nQTBFS09nQVlJQU5CcE9UQkFEWUNMQXNnQTBIUUFHb2dBMEVZYWlBQklBSWdCQ0FGSUFaQkFXb1FrUVFNQ1FzZ0EwRUhPZ0F3SUFJZ0JrMEVRQ0FEUWRBQWFpQURRUmhxSUFFZ0FpQUVJQVVnQmtIL0FSRHBBZ3dKQ3lBQklBWnFMUUFBUWY0QlJ3MERJQU5CQ1RvQU1DQURLQUlzUWNEa3dRQkhCRUFnQTBFQU5nQVpJQU5CQ2pvQUdDQURRY0Rrd1FBMkFpd2dBMEVBTmdBY0N5QURRZEFBYWlBRFFSaHFJQUVnQWlBRUlBVWdCa0VCYWhDUkJBd0lDMEhRNWNFQUVMc0pBQXNnQTBIUUFHb2dBMEVZYWlBQklBSWdCQ0FGSUFZUXJRSU1CZ3NnQTBIUUFHb2dBMEVZYWlBQklBSWdCQ0FGSUFaQi9nRVE2UUlNQlFzZ0EwSFFBR29nQTBFWWFpQUJJQUlnQkNBRklBWkIvd0VRNlFJTUJBc2dBMEVBTmdKWUlBTkJBRG9BVkF3REN5QURRUUEyQWxnZ0EwRUFPZ0JVREFJTElBTkJBRFlDV0NBRFFRQTZBRlFNQVFzZ0EwRUFOZ0pZSUFOQkFEb0FWQXNDUUFKQUFrQUNRQ0FETFFCVVFRRnJEZ0lCQWdBTElBQWdBeWdDV0RZQ0NDQUFJQWsyQWdRZ0FDQUtOZ0lBREFJTFFjQ1V5UUJCS0VIZzVjRUFFSndHQUFzZ0FFR0JnSUNBZURZQ0FBSi9JQXBGQkVCQkFDRUtJQU5CMEFCcURBRUxJQU5CQVRZQ1VDQURRZHdBYWdzZ0NqWUNBQ0FES0FKUUlnQkZEUUFnQXlnQ1hDSUJSUTBBSUFrZ0FTQUFFT01FQ3lBRFFlQUFhaVFBRHd0QkFTRUdDeUFHSUFWQmpPVEJBQkRNQ0FBTG5Rb0JHbjhnQVVHQU5tb2hFU0FCUWVUUkFHb2hGaUFCUVlBRWFpRVhJQUZCZ004QWFpRVlJQUZCZ0IxcUlSa2dBVUdnMFFCcUlSb2dBVUh0MFFCcUlSc2pBRUh3QUdzaUIwRXdhaUVjSUFFdEFPdFJJUU1nQjBFZ2FpRVNJQWRCR0dvaEV5QUhRUkJxSVJRRFFBSkFRU0FoQlNBWklRa2dHaUVQQWtBQ1FBSkFBa0FDUUNBRFFmOEJjU0lMRGdNQUFRTUNDMEdnQWlFRklCY2hDU0FZSVE4TElCSkNBRGNEQUNBVFFnQTNBd0FnRkVJQU53TUFJQWRDQURjRENFRUFJUU1nQjBFc2FrRUFRY1FBL0FzQUEwQWdBMEdBRUVZRVFFR0FFQ0VEQTBBZ0EwR0FHVVlOQlNBRElBbHFRUUE3QVFBZ0EwRUNhaUVEREFBTEFBVWdBeUFKYWtHZUJqc0JBQ0FEUVFKcUlRTU1BUXNBQ3dBTFFRTWhCQXdDQ3lBU1FnQTNBd0FnRTBJQU53TUFJQlJDQURjREFDQUhRZ0EzQXdoQkFDRURJQWRCTEdwQkFFSEVBUHdMQUFOL0lBTkJnQkJHQkg5QkV5RUZJQkVoQ1NBYkJTQURJQkZxUVo0R093RUFJQU5CQW1vaEF3d0JDd3NoRHd0QkF5RUVRUndoQ0NBRklCWWdDMEVCZEdvdkFRQWlFRWtOQUNBUUlRTWdEeUVGQTBBZ0EwVUVRRUVBSVFOQkFTRUtRUUFoQlVFQUlRNERRQUpBQWtBZ0NrVUVRQ0FEUVE5TERRSWdBMEVCYWlFRURBRUxRUkFnQTBFUUlBTnJJZ1FnQ2lBRUlBcEpHeUlNSUFOcUlnUWdBeUFFU3hzaUJDQUVRUkJOR3lFR0lBcEJmM01nREdvaEF3TkFJQVFnQmtZTkFpQUVRUUZxSVFRZ0EwRUJhaUlERFFBTElBUkJBV3NoQTBFQUlRb0xJQndnQTBFQ2RHb2dCU0FIUVFocUlBTkJBWFJxTHdFQUlnWnFRUUYwSWdVMkFnQWdCaUFPYWlFT0lBUWhBd3dCQ3dzZ0JVR0FnQVJIQkVCQkFTRUVJQXRCQWtZZ0RrSC8vd054UVFGTGNnMERDeUFKUVlBUWFpRVZRZi8vQXlFR1FRQWhEQU5BSUF3Z0VDQU1JQkJMR3lFS0FrQUNRQUpBQTBBQ2Z3SkFJQW9nRENJSVJ3UkFJQWhCQVdvaERDQUlJQTlxTFFBQUlnTkJEM0VpRFVVTkF5QUhRU3hxSUExQkFuUnFJZ1FnQkNnQ0FDSUVRUUZxTmdJQUlBUkJmMEVBSUExcmRuRWlCRUdBQkVrTkFTQUVRUWgwSUFSQmdQNERjVUVJZG5JaUJFRUVka0dQSG5FZ0JFR1BIbkZCQkhSeUlnUkJBblpCcytZQWNTQUVRYlBtQUhGQkFuUnlJZ1JCQVhaQjFhb0JjU0FFUWRXcUFYRkJBWFJ5REFJTEFrQUNRQ0FCTFFEclVTSUVEZ01BQVFVQkN5QUNRUUEyQWd4QkFTRUVRUXdoQ0F3S0N5QUJJQVJCQVdzaUF6b0E2MUVNQ2dzZ0JFRUJkRUdZOHNrQWFpOEJBQXRCLy84RGNVRUFJQU5yUVE5eGRpRURJQTFCQ2swRVFFRUJJQTEwSWc1QkFYUWhDeUFKSUFOQkFYUnFJUVVnRFVFSmRDQUljaUVFQTBBZ0EwSC9CMHNOQWlBRklBUTdBUUFnQlNBTGFpRUZJQU1nRG1vaEF3d0FDd0FMQ3lBSklBTkIvd2R4UVFGMGFpSUVMd0VBSWdWQm5nWkdEUUVnQmlFRUlBVWhCZ3dDQ3lBQ1FRQTJBZ3hCQVNFRVFRb2hDQXdGQ3lBRUlBWTdBUUFnQmtFQ2F5RUVDeUFEUVFsMklRVkJDeUVEQTBBQ1FBSkFJQTBnQTBIL0FYRkxCRUFnQlVFQmRpSUZRUUZ4SUFaQmYzTnFRZi8vQTNFaUJrRy9CRTBOQVF3Q0N5QUZRUUYyUVFGeElBWkJmM05xUWYvL0EzRWlCa0cvQkVzTkFTQVZJQVpCQVhScUlBZzdBUUFnQkNFR0RBTUxJQU5CQVdvaEF5QUZRZi8vQVhFaEJTQVZJQVpCQVhScUlnc3ZBUUFpQmcwQklBc2dCRHNCQUNBRUlRWWdCRUVDYXlFRURBRUxDd3RCQ2lFSVFRTWhCQXdDQ3lBRkxRQUFJZ1pCRDBzTkFTQUhRUWhxSUFaQkFYUnFJZ1lnQmk4QkFFRUJhanNCQUNBRFFRRnJJUU1nQlVFQmFpRUZEQUFMQUFzTElBQWdDRG9BQVNBQUlBUTZBQUFMOEFzQkVYOGpBRUdBQTJzaUFpUUFBa0FnQUNnQ0FDSUhSUVJBQWtBQ1FBSkFBa0FDUUVFSUlBRW9BZ0JCQW1zaUFDQUFRUXBQRzBFRWF3NEZBQUVDQXdRR0N5QUJLQUlFSUFFb0FnZ1FxUWtNQlFzZ0FTZ0NCQ0FCS0FJSUVLa0pEQVFMSUFGQkJHb1ErZ1lnQVNnQ0JDQUJLQUlJRUw0SkRBTUxJQUZCQ0dvUTZnY01BZ3NnQVVFSWFoRHFCeUFCS0FJNElBRW9BandRcVFrTUFRc0NRQUpBQWtBQ1FDQUFLQUlNQkVBZ0FDOEJDQ0VJSUFBb0FnUWhDU0FBS0FJTUlnVXZBZllHUVF0SkRRTWdBQ2dDRUNFTVFRVWhCQUovQWtBZ0FDZ0NGQ0lEUVFWSkJFQWdBa0hnQW1vaEJpQUNRZVFDYWlFTlFRUWhCQ0FESVFBTUFRc2dBa0hzQW1vaERTQUNRZWdDYWlFR1FRQWhBQUpBQWtBZ0EwRUZhdzRDQUFJQkN5QUNRUVUyQXZ3Q0lBSWdERFlDK0FJZ0FpQUZOZ0wwQWlBQ1FaQUNhaUFDUWZRQ2FoQ3lBaUFDS0FMZ0FpRURJQUlvQXVRQ0lRUWdBa0VGTmdMRUFTQUNJQVEyQXNBQklBSWdBellDdkFFZ0FrRW9haUFDUWJ3QmFpQUpJQWdnQVJDNEJTQUNJQUl2QVpZQ093R0VBaUFDS0FLUUFpRUtJQUl2QVpRQ0lRc2dBaWdDbUFJaEFTQUNRZkFBYWlBQ1Fad0Nha0hFQVB3S0FBQWdBaWdDNkFJaEJpQUNLQUxzQWd3Q0N5QURRUWRySVFCQkJpRUVDeUFDSUFRMkF2d0NJQUlnRERZQytBSWdBaUFGTmdMMEFpQUNRWkFDYWlBQ1FmUUNhaEN5QWlBR0tBSUFJUU1nRFNnQ0FDRUZJQUlnQURZQ3hBRWdBaUFGTmdMQUFTQUNJQU0yQXJ3QklBSkJLR29nQWtHOEFXb2dDU0FJSUFFUXVBVWdBaUFDTHdHV0Fqc0JoQUlnQWlnQ2tBSWhDaUFDTHdHVUFpRUxJQUlvQXBnQ0lRRWdBa0h3QUdvZ0FrR2NBbXBCeEFEOENnQUFJQUlvQXVnQ0lRWWdBaWdDNUFJaEJDQUNLQUxnQWlFRElBSW9BdXdDQ3lFQUlBRkJERVlOQkNBQ0lBSXZBWVFDT3dHQ0FrRUFSUVJBSUFKQnZBRnFJQUpCOEFCcVFjUUEvQW9BQUFzZ0FrR2NBbW9oRVNBQ1Fld0NhaUVJSUFKQjVBSnFJUXdnQWtIb0Ftb2hDU0FDUWVBQ2FpRU5JQUpCOEFCcVFRUnlJUklEUUNBREtBTHdCaUlPUlFSQUlBSWdBVFlDbUFJZ0FpQUNMd0dDQWpzQmxnSWdBa0djQW1vZ0FrRzhBV3BCeEFEOENnQUFJQUlnQURZQzdBSWdBaUFHTmdMb0FpQUNJQVEyQXVRQ0lBSWdBellDNEFJZ0FpQUxPd0dVQWlBQ0lBbzJBcEFDSUFjb0FnQWlBVVVOQXlBQ1FSQnFJQUVnQnlnQ0JCRGtCU0FDS0FJUUlRRWdCeUFDS0FJVUlnTTJBZ1FnQnlBQk5nSUFJQUVnQXlBS0lBc2dBa0dZQW1vZ0JpQUFFTW9EREFZTElBSWdEallDSENBQ0lBTXZBZlFHSWdVMkFpUWdBaUFFUVFGcUloQTJBaUFnQWlBQk5nSndJQTlGQkVBZ0VpQUNRYndCYWtIRUFQd0tBQUFMSUFBZ0JFY05BeUFPTHdIMkJrRUxUd1JBQW44Q1FDQUZRUVZKQkVCQkJDRUVJQTBoQUNBTUlRTWdCU0VCREFFTFFRQWhBVUVGSVFRZ0NTRUFJQWdoQXdKQUFrQWdCVUVGYXc0Q0FBSUJDMEVGSVFFZ0FrRUZOZ0tNQWlBQ0lCQTJBb2dDSUFJZ0RqWUNoQUlnQWtHUUFtb2dBa0dFQW1vUTF3RWdBaWdDNUFJaEF5QUNLQUxnQWd3Q0N5QUZRUWRySVFGQkJpRUVDeUFDSUFRMkFvd0NJQUlnRURZQ2lBSWdBaUFPTmdLRUFpQUNRWkFDYWlBQ1FZUUNhaERYQVNBREtBSUFJUU1nQUNnQ0FBc2hBQ0FDSUFFMkF2d0NJQUlnQXpZQytBSWdBaUFBTmdMMEFpQUNRZlFDYWlBS0lBc2dBa0h3QUdvZ0JoQ3ZBeUFDSUFJdkFaWUNPd0Z1SUFJdkFaUUNJUXNnQWlnQ2tBSWhDaUFDS0FLWUFpRUJJQTlGQkVBZ0FrRW9haUFSUWNRQS9Bb0FBQXNnQVVFTVJnMEdJQUlvQXV3Q0lRQWdBaWdDNkFJaEJpQUNLQUxrQWlFRUlBSW9BdUFDSVFNZ0FpQUNMd0Z1T3dHQ0FpQVBEUUVnQWtHOEFXb2dBa0VvYWtIRUFQd0tBQUFNQVFzTElBSkJIR29nQ2lBTElBSkI4QUJxSUFZUXJ3TU1CQXNnQWtFSWFoRFZDQ0FDS0FJSUlRTWdCMEVBTmdJRUlBY2dBellDQUNBQ1FaQUNhaUFEUVFBZ0FDZ0NCQ0FBTHdFSUlBRVFxZ1FNQXd0QnpJL0pBQkM3Q1FBTFFkQ1N5UUJCTlVHSWs4a0FFSndHQUFzZ0FrR1FBbW9nQUVFTWFpQUpJQWdnQVJDNEJRc2dCeUFIS0FJSVFRRnFOZ0lJQ3lBQ1FZQURhaVFBQy9nSkFoSi9BbjRqQUVHQUEyc2lDQ1FBSUFHdEloZEMvLy8vLy8vLy8vOC9mQ0FYZ0NFWUFuOGdBVUdCSUU4RVFDQUJFTDhIREFFTFFjQUFJQUVnQVVFQmRtc2lCU0FGUWNBQVR4c0xJUklnQUVIUUFHc2hGVUVCSVFkQkFDRUZBMEJCQVNFTlFRQWhFeUFCSUE1TEJFQWdDRUVvYWlBT0lBQWdBVUdnbnRJQUVQMEdJQWdvQWlnaERDQU9yU0lYQW44Q1FDQUlLQUlzSWdzZ0Vra05BRUVBSVFrQ1FBSkFJQXRCQWtrTkFBSkFBa0FnRENnQ1VDSVBJQXdvQWdBaURVWUVRQ0FNTHdGVUlBd3ZBUVJQRFFFTUFnc2dEU0FQU3cwQkN5QU1RYVFCYWlFS1FRSWhCZ05BSUFZZ0MwWU5BZ0pBSUFwQkJHc29BZ0FpRHlBS1FkUUFheWdDQUNJTlJnUkFJQW92QVFBZ0NrSFFBR3N2QVFCSkRRVU1BUXNnRFNBUFN3MEVDeUFLUWRBQWFpRUtJQVpCQVdvaEJnd0FDd0FMSUF4QnBBRnFJUXBCQWlFR0EwQkJBU0VKSUFZZ0MwWU5BUUpBSUFwQkJHc29BZ0FpRHlBS1FkUUFheWdDQUNJTlJnUkFJQW92QVFBZ0NrSFFBR3N2QVFCUERRUU1BUXNnRFNBUFRRMERDeUFLUWRBQWFpRUtJQVpCQVdvaEJnd0FDd0FMSUFzaEJnc2dCaUFTU1EwQUlBa0VRQ0FJUVNCcUlBWWdEQ0FMUWZDZDBnQVF3d2NnQ0NnQ0lDQUlLQUlrRUt3RUN5QUdRUUYwUVFGeURBRUxJQXNnRWlBTElCSkpHMEVCZENBRVJRMEFHaUFJUVJocVFTQWdDeUFMUVNCUEd5SU5JQXdnQzBIZ25kSUFFTU1ISUFnb0FoZ2dDQ2dDSENBQ0lBTkJBRUVBRUNBZ0RVRUJkRUVCY2dzaURVRUJkaUFPYXExOElCaCtJQTRnQjBFQmRtdXRJQmQ4SUJoK2hYbW5JUk1MSUJVZ0RrSFFBR3dpQzJvaER5QUFJQXRxSVJZRFFBSkFBa0FDUUFKQUFrQUNRQ0FGUVFKUEJFQWdCVUVCYXlJTElBaEJ2Z0pxYWkwQUFDQVRUdzBCQ3lBSVFiNENhaUFGYWlBVE9nQUFJQWhCTkdvZ0JVRUNkR29nQnpZQ0FDQUJJQTVORFFFZ0JVRUJhaUVGSUExQkFYWWdEbW9oRGlBTklRY01Cd3NnQXlBSVFUUnFJQXRCQW5ScUtBSUFJZ2xCQVhZaUJpQUhRUUYySWdWcUloQlBJQWNnQ1hKQkFYRkZjUTBCSUFBZ0RpQVFhMEhRQUd4cUlSRWdDVUVCY1VVRVFDQUlRUkJxSUFZZ0VTQVFRWUNlMGdBUXd3Y2dDQ2dDRUNBSUtBSVVJQUlnQXhEekJ3c2dCMEVCY1VVRVFDQUlRUWhxSUFZZ0VTQVFRWkNlMGdBUS9RWWdDQ2dDQ0NBSUtBSU1JQUlnQXhEekJ3c2dDVUVDU1NBSFFRSkpjZzBFSUFNZ0JTQUdJQVVnQmtraUNSc2lCVWtOQkNBUklBWkIwQUJzYWlJR0lCRWdDUnNoQnlBRlFkQUFiQ0lGQkVBZ0FpQUhJQVg4Q2dBQUN5QUNJQVZxSVFvZ0NRMENJQUloQlFOQUlBVWdDa1lnQmlBV1JuSU5CQ0FISUFZZ0JRSi9JQVlvQWdBaURDQUZLQUlBSWdsSEJFQWdDU0FNU3d3QkN5QUdMd0VFSUFVdkFRUkpDeUlKRzBIUUFQd0tBQUFnQjBIUUFHb2hCeUFHSUFsQjBBQnNhaUVHSUFVZ0NVRUJjMEhRQUd4cUlRVU1BQXNBQ3lBSFFRRnhSUVJBSUFBZ0FTQUNJQU1ROHdjTElBaEJnQU5xSkFBUEN5QVFRUUYwSVFjZ0N5RUZEQU1MSUE4aENRTkFBbjhnQ2tIUUFHc2lGQ2dDQUNJR0lBZEIwQUJySWd3b0FnQWlCVWNFUUNBRklBWkxEQUVMSUFwQnpBQnJMd0VBSUFkQnpBQnJMd0VBU1FzaEJ5QUpJQXdnRkNBSEcwSFFBUHdLQUFBZ0ZDQUhRZEFBYkdvaENpQVJJQXdnQjBFQmMwSFFBR3hxSWdkSEJFQWdDVUhRQUdzaENTQUNJQXBIRFFFTEN5QUNJUVVMSUFvZ0JXc2lDVVVOQUNBSElBVWdDZndLQUFBTElCQkJBWFJCQVhJaEJ5QUxJUVVNQUFzQUN3QUwrQWtDRW44Q2ZpTUFRWUFEYXlJSUpBQWdBYTBpRjBMLy8vLy8vLy8vL3o5OElCZUFJUmdDZnlBQlFZRWdUd1JBSUFFUXZ3Y01BUXRCd0FBZ0FTQUJRUUYyYXlJRklBVkJ3QUJQR3dzaEVpQUFRZEFBYXlFVlFRRWhCMEVBSVFVRFFFRUJJUTFCQUNFVElBRWdEa3NFUUNBSVFTaHFJQTRnQUNBQlFhQ2UwZ0FRL1FZZ0NDZ0NLQ0VNSUE2dEloY0Nmd0pBSUFnb0Fpd2lDeUFTU1EwQVFRQWhDUUpBQWtBZ0MwRUNTUTBBQWtBQ1FDQU1LQUpRSWc4Z0RDZ0NBQ0lOUmdSQUlBd3ZBVlFnREM4QkJFOE5BUXdDQ3lBTklBOUxEUUVMSUF4QnBBRnFJUXBCQWlFR0EwQWdCaUFMUmcwQ0FrQWdDa0VFYXlnQ0FDSVBJQXBCMUFCcktBSUFJZzFHQkVBZ0NpOEJBQ0FLUWRBQWF5OEJBRWtOQlF3QkN5QU5JQTlMRFFRTElBcEIwQUJxSVFvZ0JrRUJhaUVHREFBTEFBc2dERUdrQVdvaENrRUNJUVlEUUVFQklRa2dCaUFMUmcwQkFrQWdDa0VFYXlnQ0FDSVBJQXBCMUFCcktBSUFJZzFHQkVBZ0NpOEJBQ0FLUWRBQWF5OEJBRThOQkF3QkN5QU5JQTlORFFNTElBcEIwQUJxSVFvZ0JrRUJhaUVHREFBTEFBc2dDeUVHQ3lBR0lCSkpEUUFnQ1FSQUlBaEJJR29nQmlBTUlBdEI4SjNTQUJEREJ5QUlLQUlnSUFnb0FpUVFyQVFMSUFaQkFYUkJBWElNQVFzZ0N5QVNJQXNnRWtrYlFRRjBJQVJGRFFBYUlBaEJHR3BCSUNBTElBdEJJRThiSWcwZ0RDQUxRZUNkMGdBUXd3Y2dDQ2dDR0NBSUtBSWNJQUlnQTBFQVFRQVFJU0FOUVFGMFFRRnlDeUlOUVFGMklBNXFyWHdnR0g0Z0RpQUhRUUYyYTYwZ0Yzd2dHSDZGZWFjaEV3c2dGU0FPUWRBQWJDSUxhaUVQSUFBZ0Myb2hGZ05BQWtBQ1FBSkFBa0FDUUFKQUlBVkJBazhFUUNBRlFRRnJJZ3NnQ0VHK0FtcHFMUUFBSUJOUERRRUxJQWhCdmdKcUlBVnFJQk02QUFBZ0NFRTBhaUFGUVFKMGFpQUhOZ0lBSUFFZ0RrME5BU0FGUVFGcUlRVWdEVUVCZGlBT2FpRU9JQTBoQnd3SEN5QURJQWhCTkdvZ0MwRUNkR29vQWdBaUNVRUJkaUlHSUFkQkFYWWlCV29pRUU4Z0J5QUpja0VCY1VWeERRRWdBQ0FPSUJCclFkQUFiR29oRVNBSlFRRnhSUVJBSUFoQkVHb2dCaUFSSUJCQmdKN1NBQkREQnlBSUtBSVFJQWdvQWhRZ0FpQURFUFVIQ3lBSFFRRnhSUVJBSUFoQkNHb2dCaUFSSUJCQmtKN1NBQkQ5QmlBSUtBSUlJQWdvQWd3Z0FpQURFUFVIQ3lBSlFRSkpJQWRCQWtseURRUWdBeUFGSUFZZ0JTQUdTU0lKR3lJRlNRMEVJQkVnQmtIUUFHeHFJZ1lnRVNBSkd5RUhJQVZCMEFCc0lnVUVRQ0FDSUFjZ0Jmd0tBQUFMSUFJZ0JXb2hDaUFKRFFJZ0FpRUZBMEFnQlNBS1JpQUdJQlpHY2cwRUlBY2dCaUFGQW44Z0JpZ0NBQ0lNSUFVb0FnQWlDVWNFUUNBSklBeExEQUVMSUFZdkFRUWdCUzhCQkVrTElna2JRZEFBL0FvQUFDQUhRZEFBYWlFSElBWWdDVUhRQUd4cUlRWWdCU0FKUVFGelFkQUFiR29oQlF3QUN3QUxJQWRCQVhGRkJFQWdBQ0FCSUFJZ0F4RDFCd3NnQ0VHQUEyb2tBQThMSUJCQkFYUWhCeUFMSVFVTUF3c2dEeUVKQTBBQ2Z5QUtRZEFBYXlJVUtBSUFJZ1lnQjBIUUFHc2lEQ2dDQUNJRlJ3UkFJQVVnQmtzTUFRc2dDa0hNQUdzdkFRQWdCMEhNQUdzdkFRQkpDeUVISUFrZ0RDQVVJQWNiUWRBQS9Bb0FBQ0FVSUFkQjBBQnNhaUVLSUJFZ0RDQUhRUUZ6UWRBQWJHb2lCMGNFUUNBSlFkQUFheUVKSUFJZ0NrY05BUXNMSUFJaEJRc2dDaUFGYXlJSlJRMEFJQWNnQlNBSi9Bb0FBQXNnRUVFQmRFRUJjaUVISUFzaEJRd0FDd0FMQUF2NENRSVNmd0orSXdCQmdBTnJJZ2drQUNBQnJTSVhRdi8vLy8vLy8vLy9QM3dnRjRBaEdBSi9JQUZCZ1NCUEJFQWdBUkMvQnd3QkMwSEFBQ0FCSUFGQkFYWnJJZ1VnQlVIQUFFOGJDeUVTSUFCQjBBQnJJUlZCQVNFSFFRQWhCUU5BUVFFaERVRUFJUk1nQVNBT1N3UkFJQWhCS0dvZ0RpQUFJQUZCb0o3U0FCRDlCaUFJS0FJb0lRd2dEcTBpRndKL0FrQWdDQ2dDTENJTElCSkpEUUJCQUNFSkFrQUNRQ0FMUVFKSkRRQUNRQUpBSUF3b0FsQWlEeUFNS0FJQUlnMUdCRUFnREM4QlZDQU1Md0VFVHcwQkRBSUxJQTBnRDBzTkFRc2dERUdrQVdvaENrRUNJUVlEUUNBR0lBdEdEUUlDUUNBS1FRUnJLQUlBSWc4Z0NrSFVBR3NvQWdBaURVWUVRQ0FLTHdFQUlBcEIwQUJyTHdFQVNRMEZEQUVMSUEwZ0Qwc05CQXNnQ2tIUUFHb2hDaUFHUVFGcUlRWU1BQXNBQ3lBTVFhUUJhaUVLUVFJaEJnTkFRUUVoQ1NBR0lBdEdEUUVDUUNBS1FRUnJLQUlBSWc4Z0NrSFVBR3NvQWdBaURVWUVRQ0FLTHdFQUlBcEIwQUJyTHdFQVR3MEVEQUVMSUEwZ0QwME5Bd3NnQ2tIUUFHb2hDaUFHUVFGcUlRWU1BQXNBQ3lBTElRWUxJQVlnRWtrTkFDQUpCRUFnQ0VFZ2FpQUdJQXdnQzBId25kSUFFTU1ISUFnb0FpQWdDQ2dDSkJDc0JBc2dCa0VCZEVFQmNnd0JDeUFMSUJJZ0N5QVNTUnRCQVhRZ0JFVU5BQm9nQ0VFWWFrRWdJQXNnQzBFZ1R4c2lEU0FNSUF0QjRKM1NBQkREQnlBSUtBSVlJQWdvQWh3Z0FpQURRUUJCQUJBaUlBMUJBWFJCQVhJTElnMUJBWFlnRG1xdGZDQVlmaUFPSUFkQkFYWnJyU0FYZkNBWWZvVjVweUVUQ3lBVklBNUIwQUJzSWd0cUlROGdBQ0FMYWlFV0EwQUNRQUpBQWtBQ1FBSkFBa0FnQlVFQ1R3UkFJQVZCQVdzaUN5QUlRYjRDYW1vdEFBQWdFMDhOQVFzZ0NFRytBbW9nQldvZ0V6b0FBQ0FJUVRScUlBVkJBblJxSUFjMkFnQWdBU0FPVFEwQklBVkJBV29oQlNBTlFRRjJJQTVxSVE0Z0RTRUhEQWNMSUFNZ0NFRTBhaUFMUVFKMGFpZ0NBQ0lKUVFGMklnWWdCMEVCZGlJRmFpSVFUeUFISUFseVFRRnhSWEVOQVNBQUlBNGdFR3RCMEFCc2FpRVJJQWxCQVhGRkJFQWdDRUVRYWlBR0lCRWdFRUdBbnRJQUVNTUhJQWdvQWhBZ0NDZ0NGQ0FDSUFNUTlnY0xJQWRCQVhGRkJFQWdDRUVJYWlBR0lCRWdFRUdRbnRJQUVQMEdJQWdvQWdnZ0NDZ0NEQ0FDSUFNUTlnY0xJQWxCQWtrZ0IwRUNTWElOQkNBRElBVWdCaUFGSUFaSklna2JJZ1ZKRFFRZ0VTQUdRZEFBYkdvaUJpQVJJQWtiSVFjZ0JVSFFBR3dpQlFSQUlBSWdCeUFGL0FvQUFBc2dBaUFGYWlFS0lBa05BaUFDSVFVRFFDQUZJQXBHSUFZZ0ZrWnlEUVFnQnlBR0lBVUNmeUFHS0FJQUlnd2dCU2dDQUNJSlJ3UkFJQWtnREVzTUFRc2dCaThCQkNBRkx3RUVTUXNpQ1J0QjBBRDhDZ0FBSUFkQjBBQnFJUWNnQmlBSlFkQUFiR29oQmlBRklBbEJBWE5CMEFCc2FpRUZEQUFMQUFzZ0IwRUJjVVVFUUNBQUlBRWdBaUFERVBZSEN5QUlRWUFEYWlRQUR3c2dFRUVCZENFSElBc2hCUXdEQ3lBUElRa0RRQUovSUFwQjBBQnJJaFFvQWdBaUJpQUhRZEFBYXlJTUtBSUFJZ1ZIQkVBZ0JTQUdTd3dCQ3lBS1Fjd0FheThCQUNBSFFjd0FheThCQUVrTElRY2dDU0FNSUJRZ0J4dEIwQUQ4Q2dBQUlCUWdCMEhRQUd4cUlRb2dFU0FNSUFkQkFYTkIwQUJzYWlJSFJ3UkFJQWxCMEFCcklRa2dBaUFLUncwQkN3c2dBaUVGQ3lBS0lBVnJJZ2xGRFFBZ0J5QUZJQW44Q2dBQUN5QVFRUUYwUVFGeUlRY2dDeUVGREFBTEFBc0FDNjBKQWd4L0FYNGpBRUdRQm1zaUNDUUFJQWhCQkdwQkFFR0pCdndMQUNBQ1FRRnFJUVFnQ0VFTWFpRUtBa0FDUUFOQUlBUWhCU0FDSUFOR0JFQkJBQ0VGREFJTElBRWdBMm9nQlVFQmF5RUVJQU5CQVdvaEF5MEFBQ0lHUVRCR0RRQUxJQUVnQTJvaENTQUVRUUZySVFzQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQW44Q1FBSkFJQVpCTUdzaUIwSC9BWEZCQ1UwRVFDQUNJQU5yUVFKcUlRUkJBQ0VEQWtBRFFDQUVJUVVnQTBIL0JVMEVRQ0FESUFwcUlBYzZBQUFMSUFOQkFXb2hCaUFESUF0SEJFQWdBeUFKYWlBRlFRRnJJUVFnQmlFRExRQUFJZ3hCTUdzaUIwSC9BWEZCQ1VzTkFnd0JDd3NnQXlBSmFpRUhJQWdnQmpZQ0JFRUFJUVJCQUNFSklBSWhBd3dKQ3lBR0lBbHFJUWNnQ0NBR05nSUVJQXhCTGtZTkFTQUZRUUpySVFRZ0IwRUJheUVIUVFBaENRd0hDeUFHUVM1R0RRRWdDVUVCYXlFSFFRQWhCVUVBSVFrTUNnc2dCRUVDYXlJS0RBRUxJQVZCQW1zaENrRUFJUU1EUUNBRElBdEdCRUJCQUNFRklBaEJBQ0FLYXpZQ0NBd0xDeUFESUFscUlBTkJBV29oQXkwQUFFRXdSZzBBQ3lBRElBbHFRUUZySVFkQkFDRUdJQVFnQTJzTElnUkJDRThFUUNBR1FRaHFJUU1DUUFOQUlBTkJnQVpQRFFNZ0J5a0FBQ0lQUXNhTW1iTGt5SkdqeGdCOElBOUNzT0RBZ1lPR2pKZ3dmU0lQaEVLQWdZS0VpSkNnd0lCL2cwSUFVZzBESUFOQkNHc2lCVUdCQmtrRVFDQUlRUVJxSUFOcUlBODNBQUFnQ0NBRE5nSUVJQU5CQ0dvaEF5QUhRUWhxSVFjZ0JFRUlheUlFUVFkTkRRSU1BUXNMSUFWQmdBWkJ6TS9BQUJDNUNRQUxJQU5CQ0dzaEJnc2dCQTBCUVFBaEJBd0NDeUFEUVFocklRWUxJQWN0QUFCQk1Hc2lDVUgvQVhGQkNVMEVRQ0FIUVFGcUlRc2dCRUVCYXlFTUlBWWdDR3BCREdvaERVRUFJUVVDZndOQUlBWWdCU0lEYWlJT1FmOEZUUVJBSUFNZ0RXb2dDVG9BQUFzZ0F5QU1Sd1JBSUFOQkFXb2hCU0FFUVFGcklnUWdBeUFMYWkwQUFFRXdheUlKUWY4QmNVRUpTdzBDR2d3QkN3dEJBQXNoQkNBRElBZHFRUUZxSVFjZ0RrRUJhaUVHQ3lBSUlBWTJBZ1FMSUFnZ0JDQUtheUlKTmdJSUlBWU5BRUVBSVFVTUJBc2dBaUFFYXlFRElBSWdCRWtOQVVFQUlRVWdBaUFFUmcwQ0N5QUJRUUZySVFGQkFDRUZBMEFDUUFKQUlBRWdBMm90QUFCQkxtc09Bd0VFQUFRTElBVkJBV29oQlFzZ0EwRUJheUlERFFBTERBRUxJQU1nQWtIY3o4QUFFTGdKQUFzZ0NDQUdJQWxxSWdrMkFnZ2dDQ0FHSUFWcklnRTJBZ1JCZ0FZaEJTQUJRWUFHVFFSQUlBRWhCUXdCQ3lBSVFZQUdOZ0lFSUFoQkFUb0FqQVlMQWtBZ0JFVWdCMFZ5RFFBZ0J5MEFBRUVnY2tIbEFFY05BQ0FJSUFSQkFXc2lBZ1IvQWtBQ1FBSkFBa0FnQjBFQmFpSUdMUUFBSWdGQksyc09Bd0FCQUFFTElBUkJBbXNpQWtVTkFTQUhRUUpxSVFZTFFRQWhCRUVBSVFNRFFDQUdMUUFBUVRCclFmOEJjU0lIUVFsTERRSWdBMEVLYkNBSGFpSUhJQU1nQTBHQWdBUklJZ29iSVFNZ0J5QUVJQW9iSVFRZ0JrRUJhaUVHSUFKQkFXc2lBZzBBQ3d3QkMwRUFJUVFMUVFBZ0JHc2dCQ0FCUVMxR0d3VkJBQXNnQ1dvMkFnZ0xJQVZCRWtzTkFRdEJFeUFGYXlJQlJRMEFJQVVnQ0dwQkRHcEJBQ0FCL0FzQUN5QUFJQWhCQkdwQmpBYjhDZ0FBSUFoQmtBWnFKQUFMenhRRERuOEVmZ0Y5SXdCQnNBRnJJZ0lrQUNBQktBSUFJUWtnQVNnQ0JDRUlJQUVvQWdnaERDQUJLQUlNSVEwZ0FTZ0NFQ0VESUFJZ0FTZ0NGQ0lITmdKa0lBSWdBellDWUNBQ0lBMDJBbHdnQWlBTU5nSllJQUlnQ0RZQ1ZDQUNJQWsyQWxBZ0FrR0FBV3BCb05IU0FFRUNJQUpCMEFCcUVLNEJBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBaWdDZ0FGQkFVWUVRQ0FJSVE0Z0NTRVBBa0JCQWlBQ0xRQ2NBVUU1YTBIL0FYRWlBU0FCUVFKUEcwRUJhdzRDQWdBREMwRUNJUVlnQWlnQ2pBRWhEQ0FDS2dLY0FTRVVJQUlvQXBnQklRZ2dBaWdDbEFFaENTQUNLQUtRQVNFTklBSW9Bb2dCSVFNZ0FpZ0NoQUVoQ3d3SkN5QUNLQUtFQVNFUElBSW9BcGdCSVFjZ0FpZ0NsQUVoQXlBQ0tBS1FBU0VOSUFJb0Fvd0JJUXdnQWlnQ2lBRWhEZ3NnQWlBSE5nSWNJQUlnQXpZQ0dDQUNJQTAyQWhRZ0FpQU1OZ0lRSUFJZ0RqWUNEQ0FDSUE4MkFnZ2dBa0dBQVdvaUNpQUNRUWhxRUlBQklBSXBBcEFCSVJFZ0Fpa0NpQUVoRUNBQ0tBS0VBU0VHSUFJb0FvQUJJZ0ZGRFFFZ0FpQVJOd0l3SUFJZ0VEY0NLQ0FDSUFZMkFpUWdBaUFCTmdJZ0lBcEJ4TmpKQUVFQklBSkJJR29RM3dFZ0Fpa0NrQUVoRVNBQ0tRS0lBU0VRSUFJb0FvUUJJUVlnQWlnQ2dBRWlDa1VOQVNBQ0lCRTNBa2dnQWlBUU53SkFJQUlnQmpZQ1BDQUNJQW8yQWpoQkFDRUJBa0FDUUFKQUEwQWdBU0FHUmcwQklBRWdDbW90QUFCQk9tdEIvd0Z4UWZZQlR3UkFJQUZCQVdvaEFRd0JDd3NnQWtHQUFXb2dBa0U0YWlBQkVMUUlJQUlvQW9BQlJRUkFJQUlvQW9RQlJRMENDeUFDUWRBQWFpQUNRWUFCYWtFdy9Bb0FBQXdDQ3lBQ1FRRTJBb2dCSUFKQ0FEY0NnQUVMSUFKQjBBQnFJQUpCT0dvZ0JoQzBDQXNnQWpVQ1dDRVFJQUlvQWxRaEFRSkFBa0FnQWlnQ1VDSUxEUUJCQUNFTElBRU5BQXdCQ3lBQ0tnSndJUlFnQWlrQ2FDRVNJQUlwQW1BaEVTQUNLQUpjSVFZTElBYXRRaUNHSUJDRUlSQWdDdzBESUFFaEJnd0NDeUFDS0FLRUFTRUxEQVlMSUFJcUFxQUJJUlFnQWlrQ21BRWhFZ3NDUUNBR1FRRkhCRUFnRUVJZ2lLY2hBeUFRcHlFTERBRUxJQUlnQnpZQ1RDQUNJQU0yQWtnZ0FpQU5OZ0pFSUFJZ0REWUNRQ0FDSUE0MkFqd2dBaUFQTmdJNElBSkJnQUZxUWNUWXlRQkJBU0FDUVRocUVOOEJJQUlwQXBBQklSRWdBaWdDakFFaEF5QUNLQUtJQVNFTElBSW9Bb1FCSVFFQ1FBSitJQUlvQW9BQklnWkZCRUFnQWlvQ29BRWhGQ0FDS1FLWUFRd0JDeUFDSUJFM0FtQWdBaUFETmdKY0lBSWdDellDV0NBQ0lBRTJBbFFnQWlBR05nSlFJQUpCZ0FGcUlBSkIwQUJxRUlBQklBSW9Bb1FCSVFFZ0FpZ0NnQUVpQ3cwQklBSXFBcUFCSVJRZ0Fpa0NrQUVoRVNBQ0tBS01BU0VESUFJb0FvZ0JJUXNnQWlrQ21BRUxJUkpCQVNFR0lBRkJBVWNFUUNBQklRWU1BZ3NnRWtJZ2lLY2hDQ0FSUWlDSXB5RU5JQktuSVFrZ0VhY2hEQXdIQ3lBQ0tRS1FBU0VSSUFJcEFvZ0JJUkFNQVFzZ0JrRURSdzBCSUJFaEVDQURJUUVnRWlFUkN5QUlJQUZySVFNZ0FTQUlTdzBCSUFKQmdBRnFJQWtnQXhCbklBSW9Bb0FCUVFGR0RRSWdFRUlnaUtjaERTQVFweUVNSUFKQk9Hb2hDaUFDS0FLRUFTRUhJQUlvQW9nQklRVWpBRUd3Qm1zaUJDUUFBa0FnQlVVRVFDQUtRUUU3QVFBTUFRc0NRQUpBQWtBQ1FBSkFJQWN0QUFBaURrRXJhdzREQUFFQUFRc2dCVUVCYXlJRlJRMEJJQWRCQVdvaEJ3c2dCRUVnYWlBSElBVVFQQUpBQW4wQ1FDQUVMUUF4SWdOQkFrY0VRQ0FEUVFGeElBUXBBeUFpRTBJU2ZVSmtWQ0FFS1FNb0loQkNnSUNBQ0ZaeWNnMERJQk5DQ2xjRVFDQVRweUVESUJDMUlSUWdFMElBVXcwQ0lBTkJBblJCd052QUFHb3FBZ0FnRkpRTUF3c2dCQ0FRUWdBZ0U2ZEJBM1JCa00zQUFHb3BBd0FRaXdRZ0JDa0RDRUlBVWcwRElBUXBBd0FpRWtLQWdJQUlWZzBESUJLMVEva0NGVkNVREFJTEFrQWdDZ0o5QWtBQ1FDQUZRUU5yRGdZQkF3TURBd0FEQ3lBSEtRQUFRdCsvLy83OSsvZnZYNE5DeVp5Wnl1U3BrcXJaQUZJTkFrTUFBSUIvREFFTFF3QUFnSDhnQnpNQUFDQUhNUUFDUWhDR2hFTGZ2LzhHZ3lJU1FzbWNtUUpSRFFBYUlCSkN6b0s1QWxJTkFVTUFBTUIvQ3lJVWpDQVVJQTVCTFVZYk9BSUVJQXBCQURvQUFBd0hDeUFLUVFFNkFBRWdDa0VCT2dBQURBWUxJQlJCd052QUFDQURRUUowYXlvQ0FKVUxJUlFnQ2tFQU9nQUFJQW9nRkl3Z0ZDQU9RUzFHR3pnQ0JBd0VDeUFFUVJCcUlCTWdFQkNnQVFKQUlBTkJBWEVnQkNnQ0dDSUlRUUJPY1VVRVFDQUlRUUJJRFFFZ0JDa0RFQ0VTREFRTElBUkJJR29nRXlBUVFnRjhFS0FCSUFRcEF4QWlFaUFFS1FNZ1VnMEFJQWdnQkNnQ0tFWU5Bd3NnQkVFZ2FpQUhJQVVRTmtFQUlRaENBQ0VTSUFRb0FpQkZEUUlnQkNnQ0pDSUZRYng5U0EwQ1FmOEJJUWdnQlVHMUFrb05BaUFGUVFCTUJFQkJBQ0VIREFJTFFRQWhCd05BUVR3aEF5QUZRUk5KQkVBZ0JVR3MyOEFBYWkwQUFDRURDeUFFUVNCcUlBTVFmeUFFS0FJa0lnVkJnSEJLQkVBZ0F5QUhhaUVISUFWQkFFd05Bd3dCQ3d0QkFDRUlEQUlMSUFwQmdRSTdBUUFNQWdzZ0JFRW9haUVHQTBBQ1FDQUVRU0JxQW44Z0JVVUVRQ0FHTFFBQUlnTkJCRXNOQWtFQ1FRRWdBMEVDU1JzTUFRdEJQRUVBSUFWcklnTkJFMDhOQUJvZ0EwR3MyOEFBYWkwQUFBc2lBeENIQVNBRUtBSWtJZ1ZCL3c5S0RRSWdCeUFEYXlFSElBVkJBRXdOQVFzTElBZEJBV3NpQlVHQmYwd0VRQU5BSUFSQklHcEJQRUdDZnlBRmF5SURJQU5CUEU4YklnTVFmeUFESUFWcUlnVkJnbjlKRFFBTEN5QUZRZjhBYWtIK0FVb05BQ0FFUVNCcVFSZ1Fod0VDUUFKQUFrQUNRQ0FFS0FJZ0lnOUZEUUFnQkNnQ0pDSUpRUUJJRFFBZ0NVRVNTdzBDSUFsRkJFQkNBQ0VRREFJTFFRQWhCMElBSVJBRFFDQVFRZ3ArSVJBZ0J5QVBTUVJBSUJBZ0JpQUhhakVBQUh3aEVBc2dCMEVCYWlJSElBbEhEUUFMREFFTElBVkIvZ0JxSVFnTUF3c0NRQ0FKSUE5UERRQUNRQ0FHSUFscUlnWXRBQUFpQTBFRlJ5QUpRUUZxSUE5SGNrVUVRQ0FFTFFDb0JnMEJJQWxGRFFJZ0JrRUJheTBBQUVFQmNRMEJEQUlMSUFOQkJFME5BUXNnRUVJQmZDRVFDeUFRUW9DQWdBaFVEUUVMSUFSQklHb2lBMEVCRUg4Z0F4RGdBaUVRSUFWQmdBRnFRZjRCU2cwQklBVkJBV29oQlFzZ0VFTC8vLzhEZ3lFU1FmNEFRZjhBSUJCQ2dJQ0FCRlFiSUFWcUlRZ0xJQXBCQURvQUFDQUtJQWhCRjNTdElCS0VwNzRpRkl3Z0ZDQU9RUzFHR3pnQ0JBc2dCRUd3Qm1va0FDQUNMUUE0UVFFZ0N4c0VRRU1RQUFBQUlSUkJBU0VHREFjTElBQWdBaW9DUERnQ0hDQUFJQkUzQWhRZ0FDQU5OZ0lRSUFBZ0REWUNEQ0FBSUFFMkFnZ2dBQ0FMTmdJRUlBQkJBellDQUF3SEN5QVNRaUNJcHlFSUlCRkNJSWluSVEwZ0VxY2hDU0FScHlFTURBSUxJQU1nQ0VHNG5Na0FFTGdKQUFzZ0FpQUNLUUtFQVRjRFVFR0F6OUlBUVNzZ0FrSFFBR3BCaEp6SkFFSEluTWtBRUl3RUFBc2dCa1VOQVFzZ0F5RUJJQW10SUFpdFFpQ0doQ0VSREFFTFFRQWhCZ3NnQUNBVU9BSWNJQUFnRVRjQ0ZDQUFJQTAyQWhBZ0FDQU1OZ0lNSUFBZ0FUWUNDQ0FBSUFzMkFnUWdBQ0FHTmdJQUN5QUNRYkFCYWlRQUM4QUpBaEovQW40akFFR0FBMnNpQ1NRQUlBR3RJaGRDLy8vLy8vLy8vLzgvZkNBWGdDRVhBbjhnQVVHQklFOEVRQ0FCRUw4SERBRUxRY0FBSUFFZ0FVRUJkbXNpQlNBRlFjQUFUeHNMSVJFZ0FFRU1heUVWUVFFaENFRUFJUVVEUUVFQklReEJBQ0VTSUFFZ0RVc0VRQ0FKUVNocUlBMGdBQ0FCUWFDZTBnQVEvZ1lnQ1NnQ0tDRUhJQTJ0SWhnQ2Z3SkFJQWtvQWl3aUN5QVJTUTBBUVFBaERnSkFBa0FnQzBFQ1NRMEFJQWNvQWd3Z0J5Z0NBRThFUUNBSFFReHFJUXBCQWlFR0EwQWdCaUFMUmcwQ0lBcEJER29pRENnQ0FDQUtLQUlBU1EwRElBWkJBV29oQmlBTUlRb01BQXNBQ3lBSFFReHFJUXBCQWlFR0EwQkJBU0VPSUFZZ0MwWU5BU0FLUVF4cUlnd29BZ0FnQ2lnQ0FFOE5BaUFHUVFGcUlRWWdEQ0VLREFBTEFBc2dDeUVHQ3lBR0lCRkpEUUFDUUNBT1JRMEFJQWxCSUdvZ0JpQUhJQXRCOEozU0FCRERCMEVBSVFkQkFDQUpLQUlrSWd0QkFYWWlEbXNoRHlBSktBSWdJZ29nQzBFTWJHcEJER3NoREFOQUlBY2dEMFlOQVNBSFFRRnJJUWNnQzBFQ1R3UkFJQW9nREVFREVLY0dJQXhCREdzaERDQUtRUXhxSVFvTUFRc0xJQWNnRGtIMG5OSUFFTVlFQUFzZ0JrRUJkRUVCY2d3QkN5QUxJQkVnQ3lBUlNSdEJBWFFnQkVVTkFCb2dDVUVZYWtFZ0lBc2dDMEVnVHhzaUNpQUhJQXRCNEozU0FCRERCeUFKS0FJWUlBa29BaHdnQWlBRFFRQkJBQkFmSUFwQkFYUkJBWElMSWd4QkFYWWdEV3F0ZkNBWGZpQU5JQWhCQVhacnJTQVlmQ0FYZm9WNXB5RVNDeUFWSUExQkRHd2lDbW9oQ3lBQUlBcHFJUllEUUFKQUFrQUNRQUpBQWtBQ1FDQUZRUUpQQkVBZ0JVRUJheUlLSUFsQnZnSnFhaTBBQUNBU1R3MEJDeUFKUWI0Q2FpQUZhaUFTT2dBQUlBbEJOR29nQlVFQ2RHb2dDRFlDQUNBQklBMU5EUUVnQlVFQmFpRUZJQXhCQVhZZ0RXb2hEU0FNSVFnTUJ3c2dBeUFKUVRScUlBcEJBblJxS0FJQUlnWkJBWFlpQlNBSVFRRjJJZ2RxSWc1UElBWWdDSEpCQVhGRmNRMEJJQUFnRFNBT2EwRU1iR29oRHlBR1FRRnhSUVJBSUFsQkVHb2dCU0FQSUE1QmdKN1NBQkREQnlBSktBSVFJQWtvQWhRZ0FpQURFUFFIQ3lBSVFRRnhSUVJBSUFsQkNHb2dCU0FQSUE1QmtKN1NBQkQrQmlBSktBSUlJQWtvQWd3Z0FpQURFUFFIQ3lBR1FRSkpJQWhCQWtseURRUWdBeUFISUFVZ0JTQUhTeUlRR3lJSFNRMEVJQThnQlVFTWJHb2lCaUFQSUJBYklRZ2dCMEVNYkNJRkJFQWdBaUFJSUFYOENnQUFDeUFDSUFWcUlRY2dFRVVFUUNBQ0lRVURRQ0FGSUFkR0lBWWdGa1p5RFFVZ0NDQUdJQVVnQmlnQ0FDSVBJQVVvQWdBaUVFa2lFeHNpRkNrQ0FEY0NBQ0FJUVFocUlCUkJDR29vQWdBMkFnQWdDRUVNYWlFSUlBWWdFMEVNYkdvaEJpQUZJQThnRUU5QkRHeHFJUVVNQUFzQUN5QUxJUVVEUUNBRklBaEJER3NpQ0NBSFFReHJJZ1lnQmlnQ0FDSVFJQWdvQWdBaUUwa2lCeHNpRkNrQ0FEY0NBQ0FGUVFocUlCUkJDR29vQWdBMkFnQWdCaUFIUVF4c2FpRUhJQWdnRUNBVFQwRU1iR29pQ0NBUFJnMERJQVZCREdzaEJTQUNJQWRIRFFBTERBSUxJQWhCQVhGRkJFQWdBQ0FCSUFJZ0F4RDBCd3NnQ1VHQUEyb2tBQThMSUE1QkFYUWhDQ0FLSVFVTUF3c2dBaUVGQ3lBSElBVnJJZ1pGRFFBZ0NDQUZJQWI4Q2dBQUN5QU9RUUYwUVFGeUlRZ2dDaUVGREFBTEFBc0FDOHNKQWhGL0FuNGpBRUdBQTJzaUNTUUFJQUd0SWhaQy8vLy8vLy8vLy84L2ZDQVdnQ0VXQW44Z0FVR0JJRThFUUNBQkVMOEhEQUVMUWNBQUlBRWdBVUVCZG1zaUJpQUdRY0FBVHhzTElSRWdBRUVJYXlFVVFRRWhDRUVBSVFZRFFFRUJJUXBCQUNFU0lBRWdEVXNFUUNBSlFTaHFJQTBnQUNBQlFhQ2UwZ0FRaEFjZ0NTZ0NLQ0VIQW44Q1FDQUpLQUlzSWdzZ0VVa05BRUVBSVE0Q1FBSkFJQXRCQWtrTkFDQUhLQUlJS0FJQUlBY29BZ0FvQWdCUEJFQWdCMEVJYWlFRlFRSWhDZ05BSUFvZ0MwWU5BaUFGUVFocUlnd29BZ0FvQWdBZ0JTZ0NBQ2dDQUVrTkF5QUtRUUZxSVFvZ0RDRUZEQUFMQUFzZ0IwRUlhaUVGUVFJaENnTkFRUUVoRGlBS0lBdEdEUUVnQlVFSWFpSU1LQUlBS0FJQUlBVW9BZ0FvQWdCUERRSWdDa0VCYWlFS0lBd2hCUXdBQ3dBTElBc2hDZ3NnQ2lBUlNRMEFBa0FnRGtVTkFDQUpRU0JxSUFvZ0J5QUxRZkNkMGdBUXd3ZEJBQ0VNUVFBZ0NTZ0NKQ0lMUVFGMklnNXJJUThnQ1NnQ0lDSUhJQXRCQTNScVFRaHJJUVVEUUNBTUlBOUdEUUVnREVFQmF5RU1JQXRCQWs4RVFDQUhLUUlBSVJjZ0J5QUZLUUlBTndJQUlBVWdGemNDQUNBRlFRaHJJUVVnQjBFSWFpRUhEQUVMQ3lBTUlBNUI5SnpTQUJER0JBQUxJQXBCQVhSQkFYSU1BUXNnQ3lBUklBc2dFVWtiUVFGMElBUkZEUUFhSUFsQkdHcEJJQ0FMSUF0QklFOGJJZ1VnQnlBTFFlQ2QwZ0FRd3djZ0NTZ0NHQ0FKS0FJY0lBSWdBMEVBUVFBUUl5QUZRUUYwUVFGeUN5RUtJQTJ0SWhjZ0NrRUJkaUFOYXExOElCWitJQTBnQ0VFQmRtdXRJQmQ4SUJaK2hYbW5JUklMSUJRZ0RVRURkQ0lGYWlFTElBQWdCV29oRlFOQUFrQUNRQUpBQWtBQ1FBSkFJQVpCQWs4RVFDQUdRUUZySWd3Z0NVRytBbXBxTFFBQUlCSlBEUUVMSUFsQnZnSnFJQVpxSUJJNkFBQWdDVUUwYWlBR1FRSjBhaUFJTmdJQUlBRWdEVTBOQVNBR1FRRnFJUVlnQ2tFQmRpQU5haUVOSUFvaENBd0hDeUFESUFsQk5Hb2dERUVDZEdvb0FnQWlCVUVCZGlJR0lBaEJBWFlpQjJvaURrOGdCU0FJY2tFQmNVVnhEUUVnQUNBTklBNXJRUU4wYWlFUElBVkJBWEZGQkVBZ0NVRVFhaUFHSUE4Z0RrR0FudElBRU1NSElBa29BaEFnQ1NnQ0ZDQUNJQU1RK1FjTElBaEJBWEZGQkVBZ0NVRUlhaUFHSUE4Z0RrR1FudElBRUlRSElBa29BZ2dnQ1NnQ0RDQUNJQU1RK1FjTElBVkJBa2tnQ0VFQ1NYSU5CQ0FESUFjZ0JpQUdJQWRMSWhBYklnVkpEUVFnRHlBR1FRTjBhaUlISUE4Z0VCc2hDQ0FGUVFOMElnWUVRQ0FDSUFnZ0J2d0tBQUFMSUFJZ0Jtb2hCU0FRUlFSQUlBSWhCZ05BSUFVZ0JrWWdCeUFWUm5JTkJTQUlJQWNnQmlBSEtBSUFLQUlBSWc4Z0JpZ0NBQ2dDQUNJUVNTSVRHeWtDQURjQ0FDQUlRUWhxSVFnZ0J5QVRRUU4wYWlFSElBWWdEeUFRVDBFRGRHb2hCZ3dBQ3dBTElBc2hCZ05BSUFZZ0NFRUlheUlJSUFWQkNHc2lCU0FGS0FJQUtBSUFJZ2NnQ0NnQ0FDZ0NBQ0lRU1NJVEd5a0NBRGNDQUNBRklCTkJBM1JxSVFVZ0NDQUhJQkJQUVFOMGFpSUlJQTlHRFFNZ0JrRUlheUVHSUFJZ0JVY05BQXNNQWdzZ0NFRUJjVVVFUUNBQUlBRWdBaUFERVBrSEN5QUpRWUFEYWlRQUR3c2dEa0VCZENFSUlBd2hCZ3dEQ3lBQ0lRWUxJQVVnQm1zaUJVVU5BQ0FJSUFZZ0Jmd0tBQUFMSUE1QkFYUkJBWEloQ0NBTUlRWU1BQXNBQ3dBTHBRc0JCSDhqQUVIUUFHc2lBaVFBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FFRUlJQUFvQWdCQkFtc2lCQ0FFUVFwUEcwRUJhdzRKQVFJREJBa0ZCZ2NJQUFzZ0FrRUFOZ0pBSUFKQkFUWUNOQ0FDUVlqUHlRQTJBakFnQWtJRU53STRJQUVvQWdBZ0FTZ0NCQ0FDUVRCcUVOOElJUU1NQ1FzZ0FpQUFRUVJxTmdKSUlBSkJBVFlDTkNBQ1FZU1AwZ0EyQWpBZ0FrSUJOd0k4SUFKQnlRQTJBaFFnQWlBQ1FSQnFOZ0k0SUFJZ0FrSElBR28yQWhBZ0FTZ0NBQ0FCS0FJRUlBSkJNR29RM3dnaEF3d0lDeUFDSUFCQkNHbzJBa2dnQWtFQk5nSTBJQUpCaEkvU0FEWUNNQ0FDUWdFM0Fqd2dBa0hLQURZQ0ZDQUNJQUpCRUdvMkFqZ2dBaUFDUWNnQWFqWUNFQ0FCS0FJQUlBRW9BZ1FnQWtFd2FoRGZDQ0VEREFjTElBSWdBRUVFYWpZQ1NDQUNRUUUyQWpRZ0FrR0VqOUlBTmdJd0lBSkNBVGNDUENBQ1Fjc0FOZ0lVSUFJZ0FrRVFhallDT0NBQ0lBSkJ5QUJxTmdJUUlBRW9BZ0FnQVNnQ0JDQUNRVEJxRU44SUlRTU1CZ3NnQWtFUWFpSURJQUFvQWdnZ0FDZ0NEQkNDQVNBQ1FUbzJBa3dnQWtFQk5nSTBJQUpCbE0vSkFEWUNNQ0FDUWdFM0Fqd2dBaUFETmdKSUlBSWdBa0hJQUdvMkFqZ2dBU2dDQUNBQktBSUVJQUpCTUdvUTN3Z2hBeUFDS0FJUUlBSW9BaFFRNEFnTUJRc2dBQ2dDQ0NFRElBSkJDR29nQUNnQ0RDSUZRUVJCREVINCtNMEFFSm9GSUFKQkFEWUNLQ0FDSUFJcEF3ZzNBaUFnQWtFZ2FpQUZFTTBISUFJb0FpZ2hBQ0FGQkVBZ0FDQUZhaUFDS0FJa0lBQkJER3hxSVFBRFFDQUNJQU0yQWl3Z0FrRUJOZ0kwSUFKQmhJL1NBRFlDTUNBQ1FnRTNBandnQWtFS05nSk1JQUlnQWtISUFHbzJBamdnQWlBQ1FTeHFOZ0pJSUFKQkVHb2dBa0V3YWhDZkFpQUFRUWhxSUFKQkdHb29BZ0EyQWdBZ0FDQUNLUUlRTndJQUlBQkJER29oQUNBRFFjZ0FhaUVESUFWQkFXc2lCUTBBQ3lFQUN5QUNJQUEyQWlnZ0FrRVFhaUlESUFJb0FpUWdBRUdjd2NvQVFRRVFnUUVnQWtISUFEWUNUQ0FDUVFJMkFqUWdBa0hrejhrQU5nSXdJQUpDQVRjQ1BDQUNJQU0yQWtnZ0FpQUNRY2dBYWpZQ09DQUJLQUlBSUFFb0FnUWdBa0V3YWhEZkNDRURJQUpCSUdvUXRnZ2dBaWdDRUNBQ0tBSVVFS2tKREFRTElBSWdBRUVJYWpZQ1NDQUNRUUUyQWpRZ0FrR0VqOUlBTmdJd0lBSkNBVGNDUENBQ1Fjd0FOZ0lVSUFJZ0FrRVFhallDT0NBQ0lBSkJ5QUJxTmdJUUlBRW9BZ0FnQVNnQ0JDQUNRVEJxRU44SUlRTU1Bd3NnQWtFQ05nSTBJQUpCaU5ESkFEWUNNQ0FDUWdFM0Fqd2dBa0hOQURZQ0ZDQUNJQUJCQ0dvMkFoQWdBaUFDUVJCcU5nSTRJQUVvQWdBZ0FTZ0NCQ0FDUVRCcUVOOElJUU1NQWdzZ0FrRUROZ0kwSUFKQm5OREpBRFlDTUNBQ1FnSTNBandnQWtFUU5nSWNJQUlnQUVFSWFqWUNHQ0FDUVJFMkFoUWdBaUFBUVFScU5nSVFJQUlnQWtFUWFqWUNPQ0FCS0FJQUlBRW9BZ1FnQWtFd2FoRGZDQ0VEREFFTElBQXRBQkJGQkVBZ0FrRVFhaUlESUFBb0FnZ2dBQ2dDREJDQ0FTQUNRVG8yQWt3Z0FrRUNOZ0kwSUFKQm9NL0pBRFlDTUNBQ1FnRTNBandnQWlBRE5nSklJQUlnQWtISUFHbzJBamdnQVNnQ0FDQUJLQUlFSUFKQk1Hb1Ezd2doQXlBQ0tBSVFJQUlvQWhRUTRBZ01BUXNnQWtFQU5nSkFRUUVoQXlBQ1FRRTJBalFnQWtHMHo4a0FOZ0l3SUFKQ0JEY0NPQ0FCS0FJQUlnUWdBU2dDQkNJQklBSkJNR29RM3dnTkFDQUFLQUlNSVFNZ0FDZ0NDQ0VBQTBBZ0F3UkFJQUlnQURZQ1NDQUNRUUUyQWtRZ0FrSEl6OGtBTmdKQUlBSkJBVFlDTkNBQ1FZU1AwZ0EyQWpBZ0FrRUJOZ0k4SUFKQnpnQTJBaFFnQWlBQ1FSQnFOZ0k0SUFJZ0FrSElBR28yQWhBZ0JDQUJJQUpCTUdvUTN3Z0VRRUVCSVFNTUF3VWdBMEVCYXlFRElBQkJBV29oQUF3Q0N3QUxDeUFDUVFBMkFrQWdBa0VCTmdJMElBSkJ3TS9KQURZQ01DQUNRZ1EzQWpnZ0JDQUJJQUpCTUdvUTN3Z2hBd3NnQWtIUUFHb2tBQ0FEQzVFTEFoeC9BbjRqQUVHUUFtc2lBaVFBSUFKQnNBRnFRZURQeVFCQkFTQUJFTDBDSUFJb0FzZ0JJUVVnQWlnQ3hBRWhCeUFDS0FMQUFTRURJQUlwQXJnQklSNGdBaWdDdEFFaENBSi9Ba0FDUUNBQ0tBS3dBU0lFUVFOSEJFQWdBaWdDekFFaEJnd0JDeUFDSUFVMkFud2dBaUFITmdKNElBSWdBellDZENBQ0lCNDNBbXdnQWlBSU5nSm9JQUpCc0FGcUlBSkI2QUJxRUtnQ0lBSW9Bc2dCSVFVZ0FpZ0N4QUVoQnlBQ0tBTEFBU0VESUFJb0FyUUJJUWdnQWlnQ3NBRWlCRUVEUndSQUlBSW9Bc3dCSVFZZ0Fpa0N1QUVoSGd3QkN5QUNLQUs0QVNFR0lBSW9BcndCSVEwZ0FrRXdhaERCQmlBQ1FlQUJhaUVXSUFKQmlBRnFJUmNnQWtIb0FXb2hHQ0FDUWNBQmFpRVpJQUpCNXdGcUlSb0Nmd0pBQWtBQ1FBTkFJQUlnQlRZQ2ZDQUNJQWMyQW5nZ0FpQUROZ0owSUFJZ0RUWUNjQ0FDSUFZMkFtd2dBaUFJTmdKb0lBSkJzQUZxSUFKQjZBQnFFSGdnQWlnQ3lBRWlFMEVNUmdSQVFUa2hEQ0FDS0FMUUFTRVBBa0FDUUFKQUlBSW9Bc3dCUVFGckRnSUFBUUlMUVRvaERBd0JDeUFDTHdEcEFTQUNRZXNCYWkwQUFFRVFkSEloRUNBQ0tBTGtBU0VCSUFJb0F1QUJJUWtnQWlnQzNBRWhDaUFDS0FMWUFTRU9JQUlvQXRRQklRc2dBaTBBNkFFaERBdEJBaUFNUVRsclFmOEJjU0lFSUFSQkFrOGJJZ1JCQVdzT0FnTUNCQXNnR2kwQUFDRWJJQUlvQXNRQklSd2dBaWdDd0FFaEhTQUNLQUs4QVNFTUlBSW9BcmdCSVFRZ0FpZ0NzQUVoRHlBQ0tBSzBBU0VVSUFJb0Fzd0JJUlVnQWlnQzBBRWhDeUFDS0FMVUFTRU9JQUlvQXRnQklRb2dBaWdDM0FFaENTQUNLQUxnQVNFQklBSXRBT1FCSVJBZ0FpOEE1UUVoRWtFQVJRUkFJQUpCUUdzZ0dFRW8vQW9BQUFzZ0FpQVFJQklnRzBFUWRISWlFRUVJZEhJaUVqWUNoQUVnQWlBQk5nS0FBU0FDSUFrMkFud2dBaUFLTmdKNElBSWdEallDZENBQ0lBczJBbkFnQWlBVk5nSnNJQUlnRXpZQ2FDQVJSUVJBSUJjZ0FrRkFhMEVvL0FvQUFBc2dCaUFVUndSQUlBSkJ1QUZxSWdNZ0FrRTRhaUlGS0FJQU5nSUFJQUlnQWlrRE1EY0RzQUVnQWlBU05nTGNBU0FDSUFFMkF0Z0JJQUlnQ1RZQzFBRWdBaUFLTmdMUUFTQUNJQTQyQXN3QklBSWdDellDeUFFZ0FpQVZOZ0xFQVNBQ0lCTTJBc0FCSUJGRkJFQWdGaUFDUVVCclFTajhDZ0FBQ3lBQ1FiQUJhaUFaRUswR0lBVWdBeWdDQURZQ0FDQUNJQUlwQTdBQk53TXdJQndoQlNBZElRY2dEQ0VESUFRaERTQVVJUVlnRHlFSURBRUxDeUFDUWVnQWFoQzdCRUVCSVFSQkNDRU1JQVVoQVNBSElRa2dBeUVLSUEwaEF5QUdJUTBnQ0NFUERBSUxJQTRoQXlBTElRMUJBaUVFREFFTElBSW9BalFpREVFSWRpRVFJQUlvQWpnaEVTQUNLQUl3SVFFZ0JTRUpJQWNoQ2lBR0lROGdDQ0VFUVFBTUFRc2dBa0V3YWhDR0NVRUJDeUFNUWY4QmNTQVFRUWgwY2lFR0JFQWdBaUFETmdJUUlBSWdEVFlDRENBQ0tRSU1JUjRnRHlFSUlBRWhCU0FKSVFjZ0NpRUREQUVMSUFJZ0NUWUNMQ0FDSUFvMkFpZ2dBaUFETmdJa0lBSWdEVFlDSUNBQ0lBODJBaHdnQWlBRU5nSVlJQUlnRVRZQ2NDQUNJQVkyQW13Z0FpQUJOZ0pvSUFKQnNBRnFRZUhQeVFCQkFTQUNRUmhxRUwwQ0lBSW9Bc2dCSVFVZ0FpZ0N4QUVoQnlBQ0tBTEFBU0VESUFJcEFyZ0JJUjRnQWlnQ3RBRWhDQ0FDS0FLd0FTSUVRUU5HRFFFZ0FpZ0N6QUVoQmlBQ1FlZ0FhaENHQ1FzZ0FDQWVOd0lNSUFBZ0NEWUNDQ0FBSUFRMkFnUkJJQ0VKUVJ3aEMwRVlJUTVCRkNFRVFRRU1BUXNnQWlBRE5nSVFJQUlnSGpjRENDQUNLUUlNSVI4Z0FDQUhOZ0lVSUFBZ0h6Y0NEQ0FBSUI0K0FnZ2dBQ0FJTmdJRVFTUWhDVUVnSVF0QkhDRU9RUmdoQkNBRklRTWdBU0VISUFZaEJTQVJJUVpCQUFzaENpQUFJQVJxSUFNMkFnQWdBQ0FPYWlBSE5nSUFJQUFnQzJvZ0JUWUNBQ0FBSUFvMkFnQWdBQ0FKYWlBR05nSUFJQUpCa0FKcUpBQUx0UWtDQ1g4RmZpQUJJUU1DUUFKQUFrQUNmZ0pBSUFJaUJrRUlTUTBBQTBBZ0F5a0FBQ0lOUXNhTW1iTGt5SkdqeGdCOElBMUNzT0RBZ1lPR2pKZ3dmU0lOaEVLQWdZS0VpSkNnd0lCL2cxQkZEUUVnREVLQXd0Y3ZmaUFOUWdwK0lBMUNDSWg4SWd4Q0VJaEMvNEdBZ1BBZmcwS0JnSUNBZ09JSmZpQU1RditCZ0lEd0g0TkM1SUNBZ0lESTBBZCtmRUlnaUh3aERDQURRUWhxSVFNZ0JrRUlheUlHUVFkTERRQUxJQVlOQUVFQklRZENBQXdCQ3dOQUlBTXRBQUFpQkVFd2F5SUZRZjhCY1VFSlN3MENJQXhDQ240Z0JhMUMvd0dEZkNFTVFRRWhCeUFEUVFGcUlRTWdCa0VCYXlJR0RRQUxRZ0FMSVExQkFDRUdJQUloQ0F3QkN5QUNJQVpyQW40Z0JFRXVSd1JBSUFZaEJFSUFEQUVMSUFOQkFXb2hBd0pBQWtBQ1FBSkFJQVpCQVdzaUNFRUlTUVJBSUFnaEJBd0JDeUFJSVFRRFFDQURLUUFBSWcxQ3hveVpzdVRJa2FQR0FId2dEVUt3NE1DQmc0YU1tREI5SWcyRVFvQ0Jnb1NJa0tEQWdIK0RVRVVOQWlBTVFvREMxeTkrSUExQ0NuNGdEVUlJaUh3aURFSVFpRUwvZ1lDQThCK0RRb0dBZ0lDQTRnbCtJQXhDLzRHQWdQQWZnMExrZ0lDQWdNalFCMzU4UWlDSWZDRU1JQU5CQ0dvaEF5QUVRUWhySWdSQkIwc05BQXNMSUFSRkRRRUxJQU1pQlNBRWFpRURBMEFnQlMwQUFFRXdheUlKUWY4QmNVRUpTd1JBSUFVaEF3d0RDeUFNUWdwK0lBbXRRdjhCZzN3aERDQUZRUUZxSVFVZ0JFRUJheUlFRFFBTEMwRUFJUVFMUVFBZ0NDQUVheUlJYTZ3TElRNUJBaUVGSUFocUlnaEZEUUZCQVNFSFFnQWhEU0FFUlEwQUlBTXRBQUJCSUhKQjVRQkhCRUJCQUNFSERBRUxJQVJCQVdzaUIwVU5BU0FEUVFGcUlna3RBQUFpQ2lFTEFrQUNRQ0FLUVN0ckRnTUFBUUFCQ3lBRVFRSnJJZ2RGRFFJZ0EwRUNhaUVKSUFNdEFBSWhDd3NnQzBFd2EwSC9BWEZCQ1VzTkFRSkFBMEFnQ1MwQUFFRXdheUlEUWY4QmNVRUpTdzBCSUExQ0NuNGdBNjFDL3dHRGZDSVFJQTBnRFVLQWdBUlRJZ01iSVEwZ0VDQVBJQU1iSVE4Z0NVRUJhaUVKSUFkQkFXc2lCdzBBQzBFQUlRY0xRZ0FnRDMwZ0R5QUtRUzFHR3lJTklBNThJUTRnQjBVaEJ3dEJBQ0VESUFoQkZFNEVRQ0FJUVJOcklRVWdBU0VESUFJaENBTkFBa0FDUUNBRExRQUFJZ1JCTG1zT0F3QUJBQUVMSUFVZ0JFRXZheUlGUVFBZ0JDQUZUeHRySVFVZ0EwRUJhaUVESUFoQkFXc2lDQTBCQ3dzZ0JVRUFTZ1JBUVFBZ0Ftc2hBMElBSVF3Z0RRSi9Ba0FDZndKQUEwQWdBeUVDSUFFdEFBQkJNR3NpQkVIL0FYRkJDVXNOQVNBQlFRRnFJUUVnREVJS2ZpQUVyVUwvQVlOOElneEMvLytQdTdyV3JmQU5XRUVBSUFOQkFXb2lBeHNOQUFzZ0RFTC8vNCs3dXRhdDhBMVdEUUpCQUNBRGF5QUNRWDlIRFFFYVFRRkJBRUdvM3NBQUVMa0pBQXRCQUNBQ2F3dEJBV3NpQWtVRVFFRUFJQUpyREFJTElBRkJBV29oQXlBQ0lRWURRQ0FHSUFKcklBTXRBQUJCTUdzaUJFSC9BWEZCQ1VzTkFob2dCa0VCYXlFQklBeENDbjRnQksxQy93R0RmQ0lNUXYvL2o3dTYxcTN3RFZnRVFDQURRUUZxSVFNZ0JrRUJSeUFCSVFZTkFRc0xJQUVnQW1zTUFRdEJBQ0FESUFacWF3dXNmQ0VPQ3lBRlFRQktJUU1MUVFJaEJTQUhSUTBBSUFCQkFEb0FFQ0FBSUF3M0F3Z2dBQ0FPTndNQUlBTWhCUXNnQUNBRk9nQVJDNElOQVFkL0l3QkJRR29pQXlRQVFRUkJCQkNmQ0NJQlFiYlIwZ0EyQWdCQkNFRUVFSjhJSWdCQjZJckFBRFlDQkNBQUlBRTJBZ0JCQkVFRUVKOElJZ0pCdXRIU0FEWUNBRUVJUVFRUW53Z2lBVUdvaWNBQU5nSUVJQUVnQWpZQ0FDQUFRWkNQd0FBZ0FVSEFnOEFBRU1rSEVQNElFSzhJSVFFUWdBbEIrSVhBQUVFQkVJQUlJUVJCRUVFRUVKOElJZ0JCeUlMQUFEWUNEQ0FBSUFRMkFnZ2dBRUdBaGNBQU5nSUVJQUFnQVRZQ0FFRUlRUVFRbndnaUFVSGdnc0FBTmdJRUlBRWdBRFlDQUVFSVFRUVFud2dpQUVHWWlNQUFOZ0lFSUFBZ0FUWUNBRUVJUVFRUW53Z2lBVUhRaE1BQU5nSUVJQUVnQURZQ0FFRUlRUVFRbndnaUFFSDRpOEFBTmdJRUlBQWdBVFlDQUVIWWpNQUFJQUJCMElmQUFCREpCeEQrQ0JDdkNDRUVFSUFKSVFFZ0EwRTRhaENBQ1VINGhjQUFRUUFRZ0FnUTN3Y2dBeWdDT0NFRlFSQkJCQkNmQ0NJQVFmQ1B3QUEyQWd3Z0FDQUZOZ0lJSUFCQitJWEFBRFlDQkNBQUlBRTJBZ0FRZ0FsQitJWEFBRUVCRUlBSUlRVkJMaEQ5Q0NFR1FSQkJCQkNmQ0NJQlFjaUl3QUEyQWd3Z0FTQUdOZ0lJSUFGQnlJTEFBRFlDQkNBQklBVTJBZ0FnQTBFd2FpQUFRWWlCd0FBZ0FVSHdnOEFBRUlBSlFmaUZ3QUJCQUJDQUNCRElCMEdRaWNBQUVJb0hJQU5CS0dvZ0F5Z0NNRUdvak1BQVFTNFEvUWhCeUlqQUFCQ0FDVUg0aGNBQVFRRVFnQWdReUFkQmtJbkFBQkNLQnlBREtBSW9JUUZCRUVFRUVKOElJZ0JCcUl6QUFEWUNEQ0FBSUFFMkFnZ2dBRUdBaGNBQU5nSUVJQUFnQkRZQ0FFRUlRUVFRbndnaUFVSHdnTUFBTmdJRUlBRWdBRFlDQUVFSVFRUVFud2dpQUVHZ2pjQUFOZ0lFSUFBZ0FUWUNBRUVJUVFRUW53Z2lBVUhBaHNBQU5nSUVJQUVnQURZQ0FFSFlqTUFBSUFGQnVJckFBQkRKQnhEckJDRUNRUWhCQkJDZkNDSUFRZUNMd0FBMkFnUWdBQ0FDTmdJQVFkaU13QUFnQUVHWWk4QUFFTWtIUVFSQkJCQ2ZDQ0lBUVpMUTBnQTJBZ0FnQTBFZ2FrRUJRYUNLd0FBZ0FFR1lqc0FBRUlvSElBTW9BaUJCcUl6QUFFRUJFSUFJSVFGQkNFRUVFSjhJSWdCQnlJTEFBRFlDQkNBQUlBRTJBZ0JCQ0VFRUVKOElJZ0ZCd0l6QUFEWUNCQ0FCSUFBMkFnQkIySXpBQUNBQlFaaUN3QUFReVFkQktCRDlDQ0VDRVA4SVFaQ013QUJCQVJDQUNFSElnc0FBRUpjQlFlQ0x3QUFReVFkQjZJM0FBQkNsQkVIUWdjQUFFTWtIRUlJSUlRUkJDRUVFRUo4SUlnQkJpSXJBQURZQ0JDQUFJQVEyQWdBZ0EwRVlhaUFDSUFCQjJJREFBQkNIQnlBRFFSQnFJQU1vQWhoQktSRDlDRUhJaU1BQUVJZ0hJQU1vQWhBaEFrRUlRUVFRbndnaUFFSFFnY0FBTmdJRUlBQWdBallDQUVIWWpNQUFJQUJCNklmQUFCREpCeERyQkNFQkVKc0ZJUUpCRUVFRUVKOElJZ0JCNklIQUFEWUNEQ0FBSUFJMkFnZ2dBRUhnaThBQU5nSUVJQUFnQVRZQ0FFRVFRUVFRbndnaUFVR3dpTUFBTmdJTUlBRkJBVFlDQ0NBQlFiaUV3QUEyQWdRZ0FTQUFOZ0lBUWJMUjBnQVFnUWxCc0lYQUFCQ2JCVUhvZ2NBQUVNa0hJUVZCREVFRUVKOElJZ0pCQURZQ0NDQUNRZGlHd0FBMkFnUWdBaUFCTmdJQVFSQkJCQkNmQ0NJQVFmQ013QUEyQWd3Z0FDQUNOZ0lJSUFCQjJJL0FBRFlDQkNBQUlBVTJBZ0JCdE5IU0FCQ0JDU0VDUVJCQkJCQ2ZDQ0lCUWJDRndBQTJBZ3dnQVNBQ05nSUlJQUZCNEk3QUFEWUNCQ0FCSUFBMkFnQkJDRUVFRUo4SUlnQkJ5STdBQURZQ0JDQUFJQUUyQWdCQkNFRUVFSjhJSWdGQjZJVEFBRFlDQkNBQklBQTJBZ0JCMkl6QUFDQUJRZkNKd0FBUXlRY2dBMEVJYWtFOEVQMElFSnNGRUw0R1FiaUh3QUFReGdkQm9JZkFBRUVBRUlBSVFjaUN3QUFRaHdjZ0F5QURLQUlJRUpzRlFUNFEvUWhCeUlqQUFCREdCMEdnaDhBQUVJZ0hJQU1vQWdBaEFrRUlRUVFRbndnaUFFSFFnY0FBTmdJRUlBQWdBallDQUVIWWpNQUFJQUJCa0lQQUFCREpCMEhiQUJEOUNDRUJFSnNGSVFSQkVFRUVFSjhJSWdCQjZJSEFBRFlDRENBQUlBUTJBZ2dnQUVISWlNQUFOZ0lFSUFBZ0FUWUNBRUVCUWJDSXdBQkJBQkNBQ0NFRVFSQkJCQkNmQ0NJQlFZQ0l3QUEyQWd3Z0FTQUVOZ0lJSUFGQnNJN0FBRFlDQkNBQklBQTJBZ0JCM1FBUS9RZ2hCRUVRUVFRUW53Z2lBRUhJaU1BQU5nSU1JQUFnQkRZQ0NDQUFRYWlQd0FBMkFnUWdBQ0FCTmdJQVFRaEJCQkNmQ0NJQlFZaVF3QUEyQWdRZ0FTQUFOZ0lBUWRpTXdBQWdBVUhZaWNBQUVNa0hJUUVRaXdjaEFrRVFRUVFRbndnaUFFSHdqOEFBTmdJTUlBQWdBallDQ0NBQVFkaU13QUEyQWdRZ0FDQUJOZ0lBSUFOQlFHc2tBQ0FBQy9RSkFoSi9CMzRqQUVHUUEyc2lBaVFBSUFKQklHb1FqUVVnQWtId0FXb2hFQ0FDUVp3QmFpRVJJQUpCK0FCcUlROGdBa0g4QVdvaEVpQUJLQUlVSVFzZ0FTZ0NFQ0VHSUFFb0Fnd2hCeUFCS0FJSUlRZ2dBU2dDQkNFRUlBRW9BZ0FoREFKL0FrQUNRQUpBQW44RFFDQUNJQXMyQW1RZ0FpQUdOZ0pnSUFJZ0J6WUNYQ0FDSUFnMkFsZ2dBaUFFTmdKVUlBSWdERFlDVUNBQ1FjQUJhaUFDUWRBQWFoQXNJQUlvQXRnQklRRWdBaWdDMUFFaEJTQUNLQUxRQVNFSklBSW9Bc3dCSVFvZ0FpZ0N5QUVoRFNBQ0tBTEVBU0VEQWtBQ1FDQUNLQUxBQVVFQlJnUkFJQUlwQXR3QklSUU1BUXNnQWlBQk5nSjhJQUlnQlRZQ2VDQUNJQWsyQW5RZ0FpQUtOZ0p3SUFJZ0RUWUNiQ0FDSUFNMkFtZ2dBalVDNUFFaEZpQUNLUUxjQVNFVklBSW9BdUFCSVE0Z0FpZ0MzQUVnQWtIQUFXb2dBa0hvQUdvUXFBSWdBaWdDMUFFaEFTQUNLQUxRQVNFRklBSW9Bc3dCSVFrZ0FpZ0N5QUVoQ2lBQ0tBTEVBU0VOQW40Z0FpZ0N3QUVpQTBFRFJ3UkFJQUlwQXRnQkRBRUxJQUlnQWlnQzJBRTJBdHdDSUFJZ0FUWUMyQUlnQWlBRk5nTFVBaUFDSUFrMkF0QUNJQUlnQ2pZQ3pBSWdBaUFOTmdMSUFpQUNRY0FCYWlBQ1FjZ0NhaERKQVNBQ0tBTFlBU0lOUVF4SERRSWdBaWdDOEFFaEFTQUNLQUxzQVNFRklBSW9BdWdCSVFrZ0FpZ0M1QUVoQ2lBQ0tBTGdBU0VOSUFJb0F0d0JJUU1nQWlrQzlBRUxJUlFnRGhDcENRc2dBMEVCUmcwRElCUkNLSWluSVE0Z0ZLY2hDeUFCSVFZZ0JTRUhJQWtoQ0NBS0lRUWdEU0VNSUJSQ0lJaW5EQUlMSUFJb0F0UUJJUVVnQWlnQzBBRWhBeUFDS0FMTUFTRUpJQUlvQXNnQklRb2dBaWdDd0FFaERpQUNLQUxFQVNFQklBSXBBdHdCSVJjZ0Fpa0M1QUVoR0NBQ0tRTHNBU0VaSUFJcEF2UUJJUm9nRVNBU1FTVDhDZ0FBSUFJZ0dqY0NsQUVnQWlBWk53S01BU0FDSUJnM0FvUUJJQUlnRnpjQ2ZDQUNJQTAyQW5nZ0FpQVVRb0NBZ0lCd2d5QVdoQ0lVTndOd0lBSWdGVGNEYUNBQklBUkhCRUJCQUNJRVJRUkFJQUpCd0FGcUlBSkJJR3BCTVB3S0FBQUxJQkFnQWtIb0FHb2lCa0hZQVB3S0FBQWdBa0hJQW1vaUJ5QUNRY0FCYWlJSUlBWWdEeEJUSUFjUWh3UWdCRVVFUUNBQ1FTQnFJQWhCTVB3S0FBQUxJQVVoQ3lBRElRWWdDU0VISUFvaENDQUJJUVFnRGlFTURBRUxDeUFWcHlBVlFpQ0lweENwQ1NBUEVMc0VRUUVoQTBFSUN5RVBJQUpCSUdvUTZnY01BUXNnQWtFSWFpSURJQUpCUEdvcEFnQTNBd0FnQWtFUWFpSUpJQUpCeEFCcUtRSUFOd01BSUFKQkdHb2lDaUFDUWN3QWFpZ0NBRFlDQUNBQ0lBSXBBalEzQXdBZ0Fpa0RJQ0lVUWlpSXB5RU9JQlJDSUlpbklROGdGS2NoQlNBQ0tBSXdJZ0ZCZ0lDQWdIaEhEUUVnRENFRElBUWhEQ0FJSVFRZ0J5RUlJQVloQnlBTElRWWdCU0VMQ3lBREJFQWdDNjBnRHExQ0tJWWdENjFDL3dHRFFpQ0doSVFoRkFzZ0FDQUdOZ0lVSUFBZ0J6WUNFQ0FBSUFnMkFnd2dBQ0FFTmdJSUlBQWdERFlDQkNBQUlBTTJBZ0JCZ0lDQWdIZ2hBVUVZREFFTElBSXBBeWdoRkNBQUlBSXBBd0EzQWl3Z0FFSEVBR29nQ2lnQ0FEWUNBQ0FBUVR4cUlBa3BBd0EzQWdBZ0FFRTBhaUFES1FNQU53SUFJQUFnQ3pZQ0ZDQUFJQVkyQWhBZ0FDQUhOZ0lNSUFBZ0NEWUNDQ0FBSUFRMkFnUWdBQ0FNTmdJQUlBQWdCYTBnRHExQ0tJWWdENjFDL3dHRFFpQ0doSVEzQXhoQklBc2dBR29nRkRjREFDQUFJQUUyQWlnZ0FrR1FBMm9rQUF1M0RBRUhmeU1BUVVCcUlnTWtBRUVFUVFRUW53Z2lBVUcyMGRJQU5nSUFRUWhCQkJDZkNDSUFRYXk4MGdBMkFnUWdBQ0FCTmdJQVFRUkJCQkNmQ0NJQ1FiclIwZ0EyQWdCQkNFRUVFSjhJSWdGQnJNTFNBRFlDQkNBQklBSTJBZ0FnQUVHRXl0SUFJQUZCbE1MU0FCREpCeEQrQ0JDOENDRUJFSUFKUWNTLzBnQkJBUkNBQ0NFRVFSQkJCQkNmQ0NJQVFlekowZ0EyQWd3Z0FDQUVOZ0lJSUFCQnJML1NBRFlDQkNBQUlBRTJBZ0JCQ0VFRUVKOElJZ0ZCcE1QU0FEWUNCQ0FCSUFBMkFnQkJDRUVFRUo4SUlnQkI5TVhTQURZQ0JDQUFJQUUyQWdCQkNFRUVFSjhJSWdGQnRMN1NBRFlDQkNBQklBQTJBZ0JCQ0VFRUVKOElJZ0JCM01YU0FEWUNCQ0FBSUFFMkFnQkJ2TURTQUNBQVFjeTcwZ0FReVFjUS9nZ1F2QWdoQkJDQUNTRUJJQU5CT0dvUWdBbEJ4TC9TQUVFQUVJQUlFT2tISUFNb0FqZ2hCVUVRUVFRUW53Z2lBRUhjeU5JQU5nSU1JQUFnQlRZQ0NDQUFRY1MvMGdBMkFnUWdBQ0FCTmdJQUVJQUpRY1MvMGdCQkFSQ0FDQ0VGUVM0US9RZ2hCa0VRUVFRUW53Z2lBVUhVeHRJQU5nSU1JQUVnQmpZQ0NDQUJRZXpKMGdBMkFnUWdBU0FGTmdJQUlBTkJNR29nQUVIOHdkSUFJQUZCak1EU0FCQ0FDVUhFdjlJQVFRQVFnQWdRM0FkQnpNZlNBQkNUQnlBRFFTaHFJQU1vQWpCQjVMN1NBRUV1RVAwSVFkVEcwZ0FRZ0FsQnhML1NBRUVCRUlBSUVOd0hRY3pIMGdBUWt3Y2dBeWdDS0NFQlFSQkJCQkNmQ0NJQVFlUyswZ0EyQWd3Z0FDQUJOZ0lJSUFCQnJML1NBRFlDQkNBQUlBUTJBZ0JCQ0VFRUVKOElJZ0ZCbk1mU0FEWUNCQ0FCSUFBMkFnQkJDRUVFRUo4SUlnQkI3TURTQURZQ0JDQUFJQUUyQWdCQkNFRUVFSjhJSWdGQnRNSFNBRFlDQkNBQklBQTJBZ0JCdk1EU0FDQUJRYlRIMGdBUXlRY1Erd1FoQWtFSVFRUVFud2dpQUVITXl0SUFOZ0lFSUFBZ0FqWUNBRUc4d05JQUlBQkIvTDdTQUJESkIwRUVRUVFRbndnaUFFR1MwTklBTmdJQUlBTkJJR3BCQVVIOHU5SUFJQUJCOU1MU0FCQ1RCeUFES0FJZ1FlUyswZ0JCQVJDQUNDRUJRUWhCQkJDZkNDSUFRZXpKMGdBMkFnUWdBQ0FCTmdJQVFRaEJCQkNmQ0NJQlFlVEgwZ0EyQWdRZ0FTQUFOZ0lBUWJ6QTBnQWdBVUdVdk5JQUVNa0hRU2dRL1FnaEFoRC9DRUdVeGRJQVFRRVFnQWhCN01uU0FCQ1lBVUhNeXRJQUVNa0hRWlRJMGdBUXNRUkI1TUhTQUJESkJ4Q0dDQ0VFUVFoQkJCQ2ZDQ0lBUWFTOTBnQTJBZ1FnQUNBRU5nSUFJQU5CR0dvZ0FpQUFRY3pCMGdBUWtBY2dBMEVRYWlBREtBSVlRU2tRL1FnUWtnY2dBeWdDRUNFQ1FRaEJCQkNmQ0NJQVFlVEIwZ0EyQWdRZ0FDQUNOZ0lBUWJ6QTBnQWdBRUdjd2RJQUVNa0hFUHNFSVFFUW93VWhBa0VRUVFRUW53Z2lBRUhreE5JQU5nSU1JQUFnQWpZQ0NDQUFRY3pLMGdBMkFnUWdBQ0FCTmdJQVFSQkJCQkNmQ0NJQlFkeTgwZ0EyQWd3Z0FVRUJOZ0lJSUFGQnZNUFNBRFlDQkNBQklBQTJBZ0JCc3RIU0FCQ0JDVUdjdnRJQUVLTUZRZVRFMGdBUXlRY2hCVUVNUVFRUW53Z2lBa0VBTmdJSUlBSkJ2TWJTQURZQ0JDQUNJQUUyQWdCQkVFRUVFSjhJSWdCQmhNVFNBRFlDRENBQUlBSTJBZ2dnQUVIMHlOSUFOZ0lFSUFBZ0JUWUNBRUcwMGRJQUVJRUpJUUpCRUVFRUVKOElJZ0ZCbkw3U0FEWUNEQ0FCSUFJMkFnZ2dBVUhzdzlJQU5nSUVJQUVnQURZQ0FFRUlRUVFRbndnaUFFSFV5ZElBTmdJRUlBQWdBVFlDQUVFSVFRUVFud2dpQVVHRXg5SUFOZ0lFSUFFZ0FEWUNBRUc4d05JQUlBRkJ0TXJTQUJESkJ5QURRUWhxUVR3US9RZ1F4Z1pCMU1EU0FFRUFFSUFJUWV6SjBnQVFrQWNnQXlBREtBSUlRVDRRL1FnUWtnY2dBeWdDQUNFQ1FRaEJCQkNmQ0NJQVFlVEIwZ0EyQWdRZ0FDQUNOZ0lBUWJ6QTBnQWdBRUcwdTlJQUVNa0hRZHNBRVAwSUVLTUZFTm9IUVFGQjNMelNBRUVBRUlBSUVOZ0hRZDBBRVAwSUVOc0hJUUpCQ0VFRUVKOElJZ0JCN0wzU0FEWUNCQ0FBSUFJMkFnQkJ2TURTQUNBQVFZUyswZ0FReVFkQit3QVEvUWdRb3dVUTJnZEJBVUhjdk5JQVFRQVFnQWdRMkFkQi9RQVEvUWdRMndjaEFrRUlRUVFRbndnaUFFSHN2ZElBTmdJRUlBQWdBallDQUVHOHdOSUFJQUJCak1iU0FCREpCeUVCRUpFSElRSkJFRUVFRUo4SUlnQkIzTWpTQURZQ0RDQUFJQUkyQWdnZ0FFRzh3TklBTmdJRUlBQWdBVFlDQUNBRFFVQnJKQUFnQUF1b0NBSUZmd0orSXdCQm9BSnJJZ0lrQUNBQ1FmQUJha0dWbk1rQVFRRWdBUkRmQVNBQ1FaQUJhaUlGSUFKQmhBSnFLUUlBTndNQUlBSkJtQUZxSWdZZ0FrR01BbW9wQWdBM0F3QWdBaUFDS1FMOEFUY0RpQUVnQWlnQytBRWhBU0FDS0FMMEFTRURBa0FDUUFKQUlBSW9BdkFCSWdSRkJFQWdBa0dBQW1vZ0Jpa0RBRGNEQUNBQ1FmZ0JhaUFGS1FNQU53TUFJQUlnQWlrRGlBRTNBL0FCREFFTElBSkI3QUJxSUFVb0FnQTJBZ0FnQWlBQk5nSmdJQUlnQXpZQ1hDQUNJQVEyQWxnZ0FpQUNLUU9JQVRjQ1pFRUFJUUVDUUFKQUEwQWdBU0FEUmcwQlFaRFEwZ0JCQWlBQklBUnFMUUFBRUt3R1JRUkFJQUZCQVdvaEFRd0JDd3NnQWtId0FXb2dBa0hZQUdvaUF5QUJFTkFHSUFKQmlBSnFJQU1nQVJEUkJnd0JDeUFDUWZBQmFpQUNRZGdBYWlJQklBTVEwQVlnQWtHSUFtb2dBU0FERU5FR0N5QUNRY2dCYWlBQ1FZUUNhaWtDQURjREFDQUNRZEFCYWlBQ1FZd0NhaWtDQURjREFDQUNRYmdCYWlBQ1Fad0NhaWdDQURZQ0FDQUNJQUlwQXZ3Qk53UEFBU0FDSUFJcEFwUUNOd093QVNBQ0tBTDRBU0VCSUFJb0F2UUJJUU1nQWlnQzhBRWlCVVVFUUNBREJFQWdBa0hvQVdvZ0FrSFFBV29wQXdBM0F3QWdBa0hnQVdvZ0FrSElBV29wQXdBM0F3QWdBaUFDS1FQQUFUY0QyQUVMSUFKQkVHb2dBa0hnQVdvcEF3QWlCemNEQUNBQ1FZQUNhaUFDUWVnQmFpa0RBRGNEQUNBQ1FmZ0JhaUFITndNQUlBSWdBaWtEMkFFM0EvQUJEQUVMSUFKQjZBRnFJQUpCMEFGcUtRTUFJZ2czQXdBZ0FrSGdBV29nQWtISUFXb3BBd0FpQnpjREFDQUNRYWdCYWlBQ1FiZ0JhaWdDQURZQ0FDQUNRWkFCYWlJRUlBYzNBd0FnQWtHWUFXb2lCaUFJTndNQUlBSkJPR29nQno0Q0FDQUNJQUlwQThBQklnYzNBOWdCSUFJZ0Fpa0RzQUUzQTZBQklBSWdCemNEaUFFZ0FpQUhOd013SUFKQnpBQnFJQUpCcEFGcUtRSUFOd0lBSUFKQnhBQnFJQUpCbkFGcUtRSUFOd0lBSUFJZ0Fpa0NsQUUzQWp3Z0FrRUlhaUFDUVRCcVFTVDhDZ0FBSUFKQmhBRnFJQUpCRUdvb0FnQTJBZ0FnQWlBQk5nSjRJQUlnQXpZQ2RDQUNJQVUyQW5BZ0FpQUNLUUlJTndKOElBSkI4QUZxSUFKQjhBQnFFT1FCSUFRZ0FrR0VBbW9wQWdBM0F3QWdCaUFDUVl3Q2Fpa0NBRGNEQUNBQ0lBSXBBdndCTndPSUFTQUNLQUw0QVNFQklBSW9BdlFCSVFNZ0FpZ0M4QUVpQlEwQklBSkJnQUpxSUFZcEF3QTNBd0FnQWtINEFXb2dCQ2tEQURjREFDQUNJQUlwQTRnQk53UHdBUXNnQUNBQk5nSUVJQUFnQXpZQ0FDQUFJQUlwQS9BQk53SUlJQUJCRUdvZ0FrSDRBV29wQXdBM0FnQWdBRUVZYWlBQ1FZQUNhaWtEQURjQ0FBd0JDeUFDUWZnQmFpQUNRWkFCYWlnQ0FDSUVOZ0lBSUFJZ0Fpa0RpQUVpQnpjRDhBRWdBQ0FCTmdJTUlBQWdBellDQ0NBQUlBYzNBaEFnQUVFWWFpQUVOZ0lBSUFBZ0JUWUNCQ0FBUVFNMkFnQUxJQUpCb0FKcUpBQUx6QWtDRG44QmZpTUFRZEFBYXlJQ0pBQUNRQUpBQWtBQ1FBSkFBa0FnQUNnQ0NBUkFJQUFvQWdBaEJ5QUFLQUlFSVFvQ2Z3SkFBa0FnQUNnQ0NDSUxMd0dLQVVFTFR3UkFJQUFvQWd3aEEwRUZJUVVnQUNnQ0VDSUFRUVZQRFFFZ0FrRTBhaUVJSUFKQk9Hb2hCRUVFSVFVZ0FDRUdEQUlMSUFKQktHb2dBRUVJYWlBS0lBRVF4Z1VnQWlnQ01Cb2dBaWdDS0JvTUJBc2dBa0ZBYXlFRUlBSkJQR29oQ0FKQUFrQWdBRUVGYXc0Q0FBSUJDeUFDUVFVMkFoZ2dBaUFETmdJVUlBSWdDellDRUNBQ1FTaHFJQUpCRUdvUTdBSWdBaWdDTkNFRElBSW9BamdoQlNBQ1FRVTJBa3dnQWlBRk5nSklJQUlnQXpZQ1JDQUNRUnhxSUFKQnhBQnFJQW9nQVJER0JTQUNLUUlzSWhCQ2dJQjhneUVCSUFJb0Fod2FJQUlvQWlRYUlBSW9BaWdoQ0NBQ0tBSThJUWtnQWlnQ1FDRUdJQkNuREFJTElBQkJCMnNoQmtFR0lRVUxJQUlnQlRZQ0dDQUNJQU0yQWhRZ0FpQUxOZ0lRSUFKQktHb2dBa0VRYWhEc0FpQUlLQUlBSVFNZ0JDZ0NBQ0VBSUFJZ0JqWUNUQ0FDSUFBMkFrZ2dBaUFETmdKRUlBSkJIR29nQWtIRUFHb2dDaUFCRU1ZRklBSXBBaXdpRUVLQWdIeURJUUVnQWlnQ0hCb2dBaWdDSkJvZ0FpZ0NLQ0VJSUFJb0FqUWhBeUFDS0FJNElRVWdBaWdDUENFSklBSW9Ba0FoQmlBUXB3c2lBRUgvL3dOeFFRUkdEUUVnQVNBQXJVTC8vd09EaENFQklBSkJRR3NoRHlBQ1FUaHFJUW9nQWtFOGFpRUxJQUpCTkdvaEJBTkFJQU1vQWxnaURFVUVRQ0FIS0FJQUlnUkZEUVFnQnlnQ0JDRURFUEVISWdBZ0JEWUNqQUVnQWtFSWFpQUFJQU5CQVdvUS9BTWdBaWdDQ0NFRUlBY2dBaWdDRENJQU5nSUVJQWNnQkRZQ0FDQUdJQUJCQVd0SERRVWdCQzhCaWdFaUEwRUxUdzBHSUFRZ0EwRUJhaUlBT3dHS0FTQUVJQU5CQW5ScUlBZzJBbHdnQkNBRFFRTjBhaUFCTndJQUlBUWdBRUVDZEdvZ0NUWUNqQUVnQ1NBQU93R0lBU0FKSUFRMkFsZ01Bd3NnQWlBTU5nSVFJQUlnQXk4QmlBRWlEVFlDR0NBQ0lBVkJBV29pRGpZQ0ZDQUZJQVpIRFFZQ2Z3SkFBa0FnREM4QmlnRkJDMDhFUUNBTlFRVlBEUUZCQkNFR0lBUWhBQ0FLSVFNZ0RTRUZEQUlMSUFKQkVHb2dDQ0FCSUFrUTFBSU1CUXRCQUNFRlFRVWhCaUFMSVFBZ0R5RURBa0FDUUNBTlFRVnJEZ0lBQWdFTFFRVWhCU0FDUVFVMkFpUWdBaUFPTmdJZ0lBSWdERFlDSENBQ1FTaHFJQUpCSEdvUTdRRWdBaWdDT0NFRElBSW9BalFNQWdzZ0RVRUhheUVGUVFZaEJnc2dBaUFHTmdJa0lBSWdEallDSUNBQ0lBdzJBaHdnQWtFb2FpQUNRUnhxRU8wQklBTW9BZ0FoQXlBQUtBSUFDeUVBSUFJZ0JUWUNUQ0FDSUFNMkFrZ2dBaUFBTmdKRUlBSkJ4QUJxSUFnZ0FTQUpFTlFDSUFJb0FrQWhCaUFDS0FJOElRa2dBaWdDT0NFRklBSW9BalFoQXlBQ0tBSW9JUWdnQWlrQ0xDSUJRdi8vQTROQ0JGSU5BQXNNQVFzZ0FDZ0NBQ0VIRU8wSElRUWdCMEVBTmdJRUlBY2dCRFlDQUNBRUx3R0tBU0lEUVF0UERRVWdCQ0FEUVFGcU93R0tBU0FFSUFOQkFuUnFJQUFvQWdRMkFsd2dCQ0FEUVFOMGFpQUJOd0lBQ3lBSElBY29BZ2hCQVdvMkFnZ2dBa0hRQUdva0FBOExRY3lQeVFBUXV3a0FDMEdNa01rQVFUQkJ2SkRKQUJDY0JnQUxRZHlQeVFCQklFSE1rTWtBRUp3R0FBdEIwSkxKQUVFMVFZaVR5UUFRbkFZQUMwSGNqOGtBUVNCQi9JL0pBQkNjQmdBTHdBZ0NFbjhDZmlNQVFZQURheUlISkFBZ0FhMGlGMEwvLy8vLy8vLy8vejk4SUJlQUlSZ0NmeUFCUVlFZ1R3UkFJQUVRdndjTUFRdEJ3QUFnQVNBQlFRRjJheUlGSUFWQndBQlBHd3NoRWlBQVFRaHJJUlZCQVNFSVFRQWhCUU5BUVFFaERrRUFJUk1nQVNBTVN3UkFJQWRCS0dvZ0RDQUFJQUZCb0o3U0FCQ0VCeUFIS0FJb0lRa2dESzBpRndKL0FrQWdCeWdDTENJTElCSkpEUUJCQUNFTkFrQUNRQ0FMUVFKSkRRQWdDUzBBQ0NBSkxRQUFUd1JBSUFsQkNHb2hDa0VDSVFZRFFDQUdJQXRHRFFJZ0NrRUlhaUlPTFFBQUlBb3RBQUJKRFFNZ0JrRUJhaUVHSUE0aENnd0FDd0FMSUFsQkNHb2hDa0VDSVFZRFFFRUJJUTBnQmlBTFJnMEJJQXBCQ0dvaURpMEFBQ0FLTFFBQVR3MENJQVpCQVdvaEJpQU9JUW9NQUFzQUN5QUxJUVlMSUFZZ0Vra05BQ0FOQkVBZ0IwRWdhaUFHSUFrZ0MwSHduZElBRU1NSElBY29BaUFnQnlnQ0pCRFZBd3NnQmtFQmRFRUJjZ3dCQ3lBTElCSWdDeUFTU1J0QkFYUWdCRVVOQUJvZ0IwRVlha0VnSUFzZ0MwRWdUeHNpQ2lBSklBdEI0SjNTQUJEREJ5QUhLQUlZSUFjb0Fod2dBaUFEUVFCQkFCQW1JQXBCQVhSQkFYSUxJZzVCQVhZZ0RHcXRmQ0FZZmlBTUlBaEJBWFpyclNBWGZDQVlmb1Y1cHlFVEN5QVZJQXhCQTNRaUNtb2hDeUFBSUFwcUlSWURRQUpBQWtBQ1FBSkFBa0FDUUNBRlFRSlBCRUFnQlVFQmF5SUtJQWRCdmdKcWFpMEFBQ0FUVHcwQkN5QUhRYjRDYWlBRmFpQVRPZ0FBSUFkQk5Hb2dCVUVDZEdvZ0NEWUNBQ0FCSUF4TkRRRWdCVUVCYWlFRklBNUJBWFlnREdvaERDQU9JUWdNQndzZ0F5QUhRVFJxSUFwQkFuUnFLQUlBSWdaQkFYWWlDU0FJUVFGMklnVnFJZzlQSUFZZ0NISkJBWEZGY1EwQklBQWdEQ0FQYTBFRGRHb2hFQ0FHUVFGeFJRUkFJQWRCRUdvZ0NTQVFJQTlCZ0o3U0FCRERCeUFIS0FJUUlBY29BaFFnQWlBREVQc0hDeUFJUVFGeFJRUkFJQWRCQ0dvZ0NTQVFJQTlCa0o3U0FCQ0VCeUFIS0FJSUlBY29BZ3dnQWlBREVQc0hDeUFHUVFKSklBaEJBa2x5RFFRZ0F5QUZJQWtnQlNBSlNTSU5HeUlGU1EwRUlCQWdDVUVEZEdvaUJpQVFJQTBiSVFnZ0JVRURkQ0lGQkVBZ0FpQUlJQVg4Q2dBQUN5QUNJQVZxSVJFZ0RVVUVRQ0FDSVFVRFFDQUZJQkZHSUFZZ0ZrWnlEUVVnQ0NBR0lBVWdCaTBBQUNJVUlBVXRBQUFpQ1VraURSc3BBZ0EzQWdBZ0NFRUlhaUVJSUFZZ0RVRURkR29oQmlBRklBa2dGRTFCQTNScUlRVU1BQXNBQ3lBTElRVURRQ0FGSUFoQkNHc2lGQ0FSUVFocklna2dDUzBBQUNJTklCUXRBQUFpQmtraUNCc3BBZ0EzQWdBZ0NTQUlRUU4wYWlFUklCUWdCaUFOVFVFRGRHb2lDQ0FRUmcwRElBVkJDR3NoQlNBQ0lCRkhEUUFMREFJTElBaEJBWEZGQkVBZ0FDQUJJQUlnQXhEN0J3c2dCMEdBQTJva0FBOExJQTlCQVhRaENDQUtJUVVNQXdzZ0FpRUZDeUFSSUFWcklnWkZEUUFnQ0NBRklBYjhDZ0FBQ3lBUFFRRjBRUUZ5SVFnZ0NpRUZEQUFMQUFzQUM4QUlBaEovQW40akFFR0FBMnNpQnlRQUlBR3RJaGRDLy8vLy8vLy8vLzgvZkNBWGdDRVlBbjhnQVVHQklFOEVRQ0FCRUw4SERBRUxRY0FBSUFFZ0FVRUJkbXNpQlNBRlFjQUFUeHNMSVJJZ0FFRUlheUVWUVFFaENFRUFJUVVEUUVFQklRNUJBQ0VUSUFFZ0RFc0VRQ0FIUVNocUlBd2dBQ0FCUWFDZTBnQVFoQWNnQnlnQ0tDRUpJQXl0SWhjQ2Z3SkFJQWNvQWl3aUN5QVNTUTBBUVFBaERRSkFBa0FnQzBFQ1NRMEFJQWt0QUFnZ0NTMEFBRThFUUNBSlFRaHFJUXBCQWlFR0EwQWdCaUFMUmcwQ0lBcEJDR29pRGkwQUFDQUtMUUFBU1EwRElBWkJBV29oQmlBT0lRb01BQXNBQ3lBSlFRaHFJUXBCQWlFR0EwQkJBU0VOSUFZZ0MwWU5BU0FLUVFocUlnNHRBQUFnQ2kwQUFFOE5BaUFHUVFGcUlRWWdEaUVLREFBTEFBc2dDeUVHQ3lBR0lCSkpEUUFnRFFSQUlBZEJJR29nQmlBSklBdEI4SjNTQUJEREJ5QUhLQUlnSUFjb0FpUVExUU1MSUFaQkFYUkJBWElNQVFzZ0N5QVNJQXNnRWtrYlFRRjBJQVJGRFFBYUlBZEJHR3BCSUNBTElBdEJJRThiSWdvZ0NTQUxRZUNkMGdBUXd3Y2dCeWdDR0NBSEtBSWNJQUlnQTBFQVFRQVFKeUFLUVFGMFFRRnlDeUlPUVFGMklBeHFyWHdnR0g0Z0RDQUlRUUYyYTYwZ0Yzd2dHSDZGZWFjaEV3c2dGU0FNUVFOMElncHFJUXNnQUNBS2FpRVdBMEFDUUFKQUFrQUNRQUpBQWtBZ0JVRUNUd1JBSUFWQkFXc2lDaUFIUWI0Q2Ftb3RBQUFnRTA4TkFRc2dCMEcrQW1vZ0JXb2dFem9BQUNBSFFUUnFJQVZCQW5ScUlBZzJBZ0FnQVNBTVRRMEJJQVZCQVdvaEJTQU9RUUYySUF4cUlRd2dEaUVJREFjTElBTWdCMEUwYWlBS1FRSjBhaWdDQUNJR1FRRjJJZ2tnQ0VFQmRpSUZhaUlQVHlBR0lBaHlRUUZ4UlhFTkFTQUFJQXdnRDJ0QkEzUnFJUkFnQmtFQmNVVUVRQ0FIUVJCcUlBa2dFQ0FQUVlDZTBnQVF3d2NnQnlnQ0VDQUhLQUlVSUFJZ0F4RDhCd3NnQ0VFQmNVVUVRQ0FIUVFocUlBa2dFQ0FQUVpDZTBnQVFoQWNnQnlnQ0NDQUhLQUlNSUFJZ0F4RDhCd3NnQmtFQ1NTQUlRUUpKY2cwRUlBTWdCU0FKSUFVZ0NVa2lEUnNpQlVrTkJDQVFJQWxCQTNScUlnWWdFQ0FOR3lFSUlBVkJBM1FpQlFSQUlBSWdDQ0FGL0FvQUFBc2dBaUFGYWlFUklBMUZCRUFnQWlFRkEwQWdCU0FSUmlBR0lCWkdjZzBGSUFnZ0JpQUZJQVl0QUFBaUZDQUZMUUFBSWdsSklnMGJLUUlBTndJQUlBaEJDR29oQ0NBR0lBMUJBM1JxSVFZZ0JTQUpJQlJOUVFOMGFpRUZEQUFMQUFzZ0N5RUZBMEFnQlNBSVFRaHJJaFFnRVVFSWF5SUpJQWt0QUFBaURTQVVMUUFBSWdaSklnZ2JLUUlBTndJQUlBa2dDRUVEZEdvaEVTQVVJQVlnRFUxQkEzUnFJZ2dnRUVZTkF5QUZRUWhySVFVZ0FpQVJSdzBBQ3d3Q0N5QUlRUUZ4UlFSQUlBQWdBU0FDSUFNUS9BY0xJQWRCZ0FOcUpBQVBDeUFQUVFGMElRZ2dDaUVGREFNTElBSWhCUXNnRVNBRmF5SUdSUTBBSUFnZ0JTQUcvQW9BQUFzZ0QwRUJkRUVCY2lFSUlBb2hCUXdBQ3dBTEFBdS9DUUVJZnlNQVFTQnJJZ2trQUNBQ0lBTnJJQU1nQW1zaUN5QUNJQU5MR3lFSUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQVZCZjBjRVFDQUVRWHh4SWdvZ0Eyb2hCeUFDSUFScVFRTnJJZ3dnQVVraEJpQUlRUUZISUFFZ0RFMXlEUUlNQVFzZ0JFRjhjU0lLSUFOcUlRZEJBU0VHSUFoQkFVY05BUXRCQVNFR0lBSWdBMDhOQUNBRFFRRnJJZ0lnQVU4TkFpQUFJQUpxTFFBQUlRY2dDU0FESUFNZ0Ntb2lCaUFBSUFGQnFQckpBQkNEQmlBSktBSUVJUU1nQ1NnQ0FDRUNBMEFnQTBVTkFpQUNJQWM2QUFBZ0EwRUJheUVESUFKQkFXb2hBZ3dBQ3dBTFFRQWhDQ0FCUVFOcklncEJBQ0FCSUFwUEd5SUtJQWNnQnlBS1N4c2hDaUFHUlNBQ0lBTlBja1VnQzBFRFMzRU5BaUFBSUFOcUlRd0RRQ0FDSUFocUlRY2dBeUFJYWlJR0lBcFBEUTBnQmtFRGFpQUJUdzBFSUFkQkEyb2dCWEVpRFNBQlR3MEZJQVVnQjNFaUN5QUJUdzBHSUFnZ0RHb2lCaUFBSUF0cUxRQUFPZ0FBSUFkQkFXb2dCWEVpQ3lBQlR3MEhJQVpCQVdvZ0FDQUxhaTBBQURvQUFDQUhRUUpxSUFWeElnY2dBVThOQ0NBR1FRSnFJQUFnQjJvdEFBQTZBQUFnQmtFRGFpQUFJQTFxTFFBQU9nQUFJQWhCQkdvaENBd0FDd0FMSUFaQkFXc2hCd3dMQ3lBQ0lBRkJtUHJKQUJER0JBQUxJQUZCQkdzaEJ3TkFJQU1nQ2s4RVFDQURJUVlnQWlFSERBc0xJQUpCZkVZTkJpQUNRUVJxSVFZZ0FrRjdTdzBISUFFZ0Jra05DQ0FESUFkTERRa2dBQ0FEYWlBQUlBSnFLQUFBTmdBQUlBTkJCR29oQXlBR0lRSU1BQXNBQzBHNCtza0FRUzlCNlBySkFCQ2NCZ0FMUWZqNnlRQkJ5QUJCd1B2SkFCQ2NCZ0FMSUFzZ0FVSFErOGtBRU1ZRUFBc2dDeUFCUWVEN3lRQVF4Z1FBQ3lBSElBRkI4UHZKQUJER0JBQUxJd0JCSUdzaUFDUUFJQUJCQURZQ0dDQUFRUUUyQWd3Z0FFR1ErOEFBTmdJSUlBQkNCRGNDRUNBQVFRaHFRYmlFeWdBUXF3Y0FDeUFDSUFaQnNQL0pBQkMzQ1FBTElBWWdBVUd3LzhrQUVMZ0pBQXNnQ1VFQU5nSVlJQWxCQVRZQ0RDQUpRZUNEeWdBMkFnZ2dDVUlFTndJUUlBbEJDR3BCc1AvSkFCQ3JCd0FMQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBUkJBM0ZCQVdzT0F3QUJBZzRMSUFVZ0IzRWlBaUFCU1EwS0lBSWdBVUdBL01rQUVNWUVBQXNnQmtFQmFpSURJQUZQRFFFZ0IwRUJhaUFGY1NJQ0lBRlBEUUlnQlNBSGNTSUlJQUZQRFFNZ0FTQUdTdzBLSUFZZ0FVSEkvY2tBRU1ZRUFBc2dCa0VDYWlJRElBRlBEUU1nQjBFQ2FpQUZjU0lDSUFGUERRUWdCU0FIY1NJRUlBRlBEUVVnQVNBR1RRMEdJQUFnQm1vZ0FDQUVhaTBBQURvQUFDQUhRUUZxSUFWeElnZ2dBVThOQnlBR1FRRnFJZ1lnQVVrTkNTQUdJQUZCb1AvSkFCREdCQUFMUWFEOHlRQkJMMEhRL01rQUVKd0dBQXRCNFB6SkFFSElBRUdvL2NrQUVKd0dBQXNnQ0NBQlFiajl5UUFReGdRQUMwSFkvY2tBUVM5QmlQN0pBQkNjQmdBTFFaait5UUJCeUFCQjRQN0pBQkNjQmdBTElBUWdBVUh3L3NrQUVNWUVBQXNnQmlBQlFZRC95UUFReGdRQUN5QUlJQUZCa1AvSkFCREdCQUFMSUFFZ0Jrc0VRQ0FHSVFNTUFnc2dCaUFCUVpEOHlRQVF4Z1FBQ3lBQUlBWnFJQUFnQ0dvdEFBQTZBQUFMSUFBZ0Eyb2dBQ0FDYWkwQUFEb0FBQXNnQ1VFZ2FpUUFDL01JQWdwL0FYNGpBRUdBQVdzaUFpUUFJQUpCQURZQ0ZDQUNRb0NBZ0lDQUFUY0NERUhvejlJQUlRUWdBU2dDSUNJSUJFQWdBa0VvYWlBSVFRRnFFUFVESUFJb0FpZ2hCQ0FCS0FJY0lRVWdBaWdDTENJSFFRbHFJZ01FUUNBRUlBVWdBL3dLQUFBTElBVXBBd0FoRENBQ0lBRW9BaWdpQmpZQ1FDQUNJQVUyQWpnZ0FpQUZJQWhxUVFGcU5nSTBJQUlnQlVFSWFqWUNNQ0FDSUF4Q2Y0VkNnSUdDaElpUW9NQ0FmNE0zQXlnZ0JFRUVheUVJSUFZaEF3TkFJQU1FUUFOQUlBSWdBa0VvYWhEWkJTQUNLQUlBUVFGeFJRUkFJQUlnQWlnQ09FRWdhellDT0NBQ0lBSW9BakFpQTBFSWFqWUNNQ0FDSUFNcEF3QkNmNFZDZ0lHQ2hJaVFvTUNBZjRNM0F5Z01BUXNMSUFnZ0FpZ0NPQ0FDS0FJRVFRSjBheUlESUFWcmFpQURRUVJyS0FJQU5nSUFJQUlnQWlnQ1FFRUJheUlETmdKQURBRUxDeUFCS0FJa0lRTUxRZWpQMGdCQkFCREJDQ0FDSUFZMkFpUWdBaUFETmdJZ0lBSWdCellDSENBQ0lBUTJBaGdDUUFKQUFrQUNRQ0FCS0FJWUlnVkZCRUFnQVNnQ0ZDRUlRUUFoQkF3QkN5QURJQVlnQWtFTWFpQUZFSWtFSUFFb0FoUWhDQ0FGSUFJb0FoUWlCRXNOQVFzZ0FpQUZOZ0lVSUFJb0FoQWdCVUhZQUd4cUlRTURRQ0FFSUFWR0JFQWdCU0VFREFNRklBUkJBV3NoQkNBREVJY0pJQU5CMkFCcUlRTU1BUXNBQ3dBTElBUWdCVXNOQVFzZ0FpZ0NFQ0VLSUFRaEJrRUFJUWNEUUNBR0JFQWdCeUFLYWlJRFFkQUFha0VBTmdJQUlBTkIxQUJxSUFjZ0NHb2lDVUhVQUdvb0FnQTJBZ0FnQTBISUFHb2dDVUhNQUdvb0FnQWlDeUFMSUFsQjBBQnFLQUlBYWhESUJpQUNRU2hxSUFrUTlBRUNRQUpBQWtBQ1FBSkFBa0JCQ0NBREtBSUFRUUpySWdrZ0NVRUtUeHRCQkdzT0JRQUJBZ01FQlFzZ0EwRUVhaWdDQUNBRFFRaHFLQUlBRUtrSkRBUUxJQU5CQkdvb0FnQWdBMEVJYWlnQ0FCQ3BDUXdEQ3lBRFFRUnFJZ2tRK2dZZ0NTZ0NBQ0FEUVFocUtBSUFFTDRKREFJTElBTkJDR29RNmdjTUFRc2dBMEVJYWhEcUJ5QURRVGhxS0FJQUlBTkJQR29vQWdBUXFRa0xJQU1nQWtFb2FrSElBUHdLQUFBZ0JrRUJheUVHSUFkQjJBQnFJUWNNQVFzTElBVWdCQ0lEYTBIWUFHeEIyQUJ1SWdZZ0FpZ0NEQ0FEYTBzRVFDQUNRUXhxSUFNZ0JrRUlRZGdBRU9FRklBSW9BaEFoQ2lBQ0tBSVVJUU1MSUFRZ0JVY0VRQ0FFUWRnQWJDQUlhaUVGSUFNZ0Jtb2dDaUFEUWRnQWJHb2hDQ0FDUWZBQWFpRUtRUUFoQndOQUlBVWdCMm9pQTBIVUFHb29BZ0FoQ1NBS0lBTkJ6QUJxS0FJQUlBTkIwQUJxS0FJQUVJd0ZJQUpCS0dvaUN5QURFUFFCSUFJZ0NUWUNmQ0FISUFocUlBdEIyQUQ4Q2dBQUlBZEIyQUJxSVFjZ0JrRUJheUlHRFFBTElRTUxJQUpCRkdvaUJDQUROZ0lBSUFBZ0Fpa0NERGNDRUNBQVFTQnFJQUpCSEdvcEFnQTNBZ0FnQUVFb2FpQUNRU1JxS0FJQU5nSUFJQUJCR0dvZ0JDa0NBRGNDQUNBQUlBRXBBd2czQXdnZ0FDQUJLUU1BTndNQUlBSkJnQUZxSkFBUEN5QUNRUUEyQWpnZ0FrRUJOZ0lzSUFKQjJNemFBRFlDS0NBQ1FnUTNBakFnQWtFb2FrR1E3OGtBRUtzSEFBdmtDQUlMZndKK0l3QkJnQUZySWdJa0FDQUJLQUlBSVFVZ0FTZ0NCQ0VESUFFb0FnZ2hCQ0FCS0FJTUlRWWdBU2dDRUNFSUlBSWdBU2dDRkNJQk5nSjhJQUlnQ0RZQ2VDQUNJQVkyQW5RZ0FpQUVOZ0p3SUFJZ0F6WUNiQ0FDSUFVMkFtZ2dBa0VnYWtHZzBkSUFRUUlnQWtIb0FHb1FyZ0VnQUFKL0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFuOGdBaWdDSUVFQlJnUkFBa0FDUUVFQ0lBSXRBRHhCT1d0Qi93RnhJZ2NnQjBFQ1R4dEJBV3NPQWdBQkJBc2dBeUVISUFVTUFndEJBaUVCSUFJb0Fpd2hDQ0FDS0FJOElRd2dBaWdDT0NFRUlBSW9BalFoQXlBQ0tBSXdJUWNnQWlnQ0tDRUtJQUlvQWlRaEJnd0RDeUFDS0FJNElRRWdBaWdDTkNFSUlBSW9BakFoQmlBQ0tBSXNJUVFnQWlnQ0tDRUhJQUlvQWlRTElRb2dBaUFCTmdKa0lBSWdDRFlDWUNBQ0lBWTJBbHdnQWlBRU5nSllJQUlnQnpZQ1ZDQUNJQW8yQWxBZ0FrRWdhaUFDUWRBQWFoQ0FBU0FDS0FJMElRY2dBaWdDTUNFSUlBSW9BaXdoQ2lBQ0tBSW9JUVlnQWlnQ0pDRUJJQUlvQWlBaUMwVUVRQ0FDS0FKQUlRd2dBaWdDUENFRUlBSW9BamdoQXd3Q0N5QURJQUZySVFrZ0FTQURTdzBDSUFKQklHb2dCU0FKRUdkQkFTRUpJQUlvQWlCQkFVWU5BeUFDS0FJa0lRUkJFQ0VNQWtBQ1FBSkFJQUlvQWlnaUJRNENDZ0FCQ3lBRUxRQUFJZ05CSzJzT0F3a0JDUUVMSUFRdEFBQWhBd3NDUUFKQUFrQUNRQ0FEUWY4QmNVRXJhdzREQUFJQkFnc2dCVUVCYXlFRElBUkJBV29oQkNBRlFSQkxEUUlNQ0FzZ0JVRUJheUVESUFSQkFXb2hCQ0FGUVJGUEJFQURRQ0FEUlEwTUlBSkJFR29nRFNBTlFqK0hRZ29RaXdRZ0JDMEFBRUV3YXlJRlFRbExEUXNnQWlrREdDQUNLUU1RSWc1Q1A0ZFNEUXNnQkVFQmFpRUVJQU5CQVdzaEF5QUZyU0lOUWdCU0lBNGdEWDBpRFNBT1UzTkZEUUFMREFvTEEwQWdBMFVOQ3lBRUxRQUFRVEJySWdWQkNVc05DU0FFUVFGcUlRUWdBMEVCYXlFRElBMUNDbjRnQmExOUlRME1BQXNBQ3lBRklnTkJFRWtOQmdzTUJBdEJBQ0VCSUFJb0FpUWhCZ3NnQVVVRVFDQUdJUXNNQmdzZ0FTRUpJQVloQ3lBS0lRRWdDQ0VHSUFjaENpQURJUWdnQkNFSERBVUxJQWtnQTBHWW5Na0FFTGdKQUFzZ0FpQUNLUUlrTndOb1FZRFAwZ0JCS3lBQ1FlZ0Fha0dFbk1rQVFhaWN5UUFRakFRQUN3TkFJQU5GRFFRZ0FpQU5JQTFDUDRkQ0NoQ0xCQ0FFTFFBQVFUQnJJZ1ZCQ1VzTkF5QUNLUU1JSUFJcEF3QWlEa0kvaDFJTkF5QUVRUUZxSVFRZ0EwRUJheUVESUFXdElnMUNBRlFnRFNBT2ZDSU5JQTVUYzBVTkFBc01BZ3NEUUNBRFJRMERJQVF0QUFCQk1Hc2lCVUVKU3cwQklBUkJBV29oQkNBRFFRRnJJUU1nQmEwZ0RVSUtmbndoRFF3QUN3QUxDeUFBSUF3MkFpQWdBQ0FITmdJY0lBQWdDRFlDR0NBQUlBbzJBaFFnQUNBR05nSVFJQUFnQVRZQ0RDQUFJQXMyQWdnZ0FDQUpOZ0lFUVFFTUFRc2dBQ0FOTndNZ0lBQWdCellDSENBQUlBZzJBaGdnQUNBS05nSVVJQUFnQmpZQ0VDQUFJQUUyQWd3Z0FDQUxOZ0lJUVFBTE5nSUFJQUpCZ0FGcUpBQUwwUWNCQ244Q1FBSkFJQUFvQWdnaUMwR0FnSURBQVhGRkRRQUNRQUovQWtBZ0MwR0FnSUNBQVhFRVFDQUFMd0VPSWdVTkFVRUFJUUpCQUF3Q0N5QUNRUkJQQkVBZ0FpQUJJQUZCQTJwQmZIRWlDR3NpQ1dvaUJrRURjU0VISUFFZ0NFY0VRQ0FCSVFNRFFDQUZJQU1zQUFCQnYzOUthaUVGSUFOQkFXb2hBeUFKUVFGcUlna05BQXNMSUFjRVFDQUlJQVpCZkhGcUlRTURRQ0FFSUFNc0FBQkJ2MzlLYWlFRUlBTkJBV29oQXlBSFFRRnJJZ2NOQUFzTElBWkJBblloQ1NBRUlBVnFJUVVEUUNBSUlRWWdDVVVOQkVIQUFTQUpJQWxCd0FGUEd5SU1RUU54SVFvZ0RFRUNkQ0VIUVFBaEJDQUpRUVJQQkVBZ0JpQUhRZkFIY1dvaENDQUdJUU1EUUNBRUlBTW9BZ0FpQkVGL2MwRUhkaUFFUVFaMmNrR0Jnb1FJY1dvZ0EwRUVhaWdDQUNJRVFYOXpRUWQySUFSQkJuWnlRWUdDaEFoeGFpQURRUWhxS0FJQUlnUkJmM05CQjNZZ0JFRUdkbkpCZ1lLRUNIRnFJQU5CREdvb0FnQWlCRUYvYzBFSGRpQUVRUVoyY2tHQmdvUUljV29oQkNBRFFSQnFJZ01nQ0VjTkFBc0xJQWtnREdzaENTQUdJQWRxSVFnZ0JFRUlka0gvZ2Z3SGNTQUVRZitCL0FkeGFrR0JnQVJzUVJCMklBVnFJUVVnQ2tVTkFBc2dDa0VDZENFSElBWWdERUg4QVhGQkFuUnFJUU5CQUNFRUEwQWdBeWdDQUNJR1FYOXpRUWQySUFaQkJuWnlRWUdDaEFoeElBUnFJUVFnQTBFRWFpRURJQWRCQkdzaUJ3MEFDeUFFUVFoMlFmK0IvQWR4SUFSQi80SDhCM0ZxUVlHQUJHeEJFSFlnQldvaEJRd0RDeUFDUlFSQVFRQWhBZ3dEQ3dOQUlBVWdBU0FEYWl3QUFFRy9mMHBxSVFVZ0FpQURRUUZxSWdOSERRQUxEQUlMSUFFZ0Ftb2hBMEVBSVFJZ0FTRUVBa0FEUUNBRUlnWWdBMFlOQVFKL0lBUkJBV29nQkN3QUFDSUlRUUJPRFFBYUlBWkJBbW9nQ0VGZ1NRMEFHaUFHUVFOcUlBaEJjRWtOQUJvZ0JrRUVhZ3NpQkNBR2F5QUNhaUVDSUFVZ0IwRUJhaUlIUncwQUMwRUFEQUVMSUFVZ0Iyc0xJUU1nQlNBRGF5RUZDeUFGSUFBdkFRd2lCazhOQUNBR0lBVnJJUVpCQUNFRFFRQWhCUUpBQWtBQ1FDQUxRUjEyUVFOeFFRRnJEZ0lBQVFJTElBWWhCUXdCQ3lBR1FmNy9BM0ZCQVhZaEJRc2dDMEgvLy84QWNTRUlJQUFvQWdRaENpQUFLQUlBSVFjRFFDQURRZi8vQTNFZ0JVSC8vd054U1FSQVFRRWhCQ0FEUVFGcUlRTWdCeUFJSUFvb0FoQVJBd0JGRFFFTUF3c0xRUUVoQkNBSElBRWdBaUFLS0FJTUVRSUFEUUVnQmlBRmEwSC8vd054SVFCQkFDRURBMEFnQUNBRFFmLy9BM0ZOQkVCQkFBOExJQU5CQVdvaEF5QUhJQWdnQ2lnQ0VCRURBRVVOQUFzTUFRc2dBQ2dDQUNBQklBSWdBQ2dDQkNnQ0RCRUNBQ0VFQ3lBRUM0QUpBaEIvQW40akFFR0FCR3NpQWlRQUlBSkJJR29RMVFnZ0FTZ0NBQ0VESUFFb0FnUWhCQ0FCS0FJSUlRY2dBa0h3QUdvZ0FpZ0NJQ0lLUVFBUW9BWWdBaWdDZENFR0lBSW9BbkFoQlVFTklRRWdBa0VOTmdKNElBSkIvQUJxSVF0QkFFVUVRQ0FMSUFKQkxHcEJ4QUQ4Q2dBQUN5QUNJQVFnQjBIUUFHeHFJZ2cyQXN3QklBSWdBellDeUFFZ0FpQUVOZ0xFQVNBQ0lBUTJBc0FCSUFKQjlBSnFJUThnQWtId0Ftb2hFQ0FDUWRnQmFpRU9JQUpCd0FGcUlSRkJBQ0VIQTBBQ1FBSkFBa0FDUUFKQUFrQUNRQUorSUFGQkRVY0VRQ0FMSVFrZ0JDRURJQklNQVFzZ0JDQUlSZzBCSUFJZ0JFSFFBR29pQXpZQ3hBRWdCRUVNYWlFSklBUW9BZ2doQVNBRUtRTUFDeUVUSUFGQkRFWU5BQ0FOUlFSQUlBOGdDVUhFQVB3S0FBQUxJQUlnQVRZQzhBSWdBaUFUTndQb0FnSkFJQU1nQ0VZRVFFRU1JUUVnQXlFRURBRUxJQUlnQTBIUUFHb2lCRFlDeEFFZ0F5a0RBQ0VTSUFNb0FnZ2hBU0FORFFBZ0FrRzhBMm9nQTBFTWFrSEVBUHdLQUFBTElBMUZCRUFnQ3lBQ1Fid0Rha0hFQVB3S0FBQUxRUXdoQXlBQlFReEhCRUFnRTBMLy8vLy8vLzgvZ3lBU1F2Ly8vLy8vL3orRFVRMEZJQUVoQXdzZ0FpQVNOd053SUFJZ0F6WUNlQ0FDUWRBQmFpQUNRZWdDYWlJQlFkQUEvQW9BQUNBQ0tBTFlBVUVNUmcwQklBSXZBZFFCSVFrZ0FpZ0MwQUVoQ0NBQ1FhQUNhaUFPUWNnQS9Bb0FBQ0FGTHdIMkJrRUxUdzBDSUFFZ0JTQUdJQWdnQ1NBT0VLb0VEQVlMSUFJZ0VqY0RjRUVOSVFNZ0FrRU5OZ0o0Q3lBUkVMb0ZBa0FnQTBFT2NVRU1SZzBBQWtBQ1FBSkFBa0FDUUVFSUlBTkJBbXNpQVNBQlFRcFBHMEVFYXc0RkFBRUNBd1FGQ3lBQ0tBSjhJQUlvQW9BQkVLa0pEQVFMSUFJb0Fud2dBaWdDZ0FFUXFRa01Bd3NnQ3hENkJpQUNLQUo4SUFJb0FvQUJFTDRKREFJTElBSkJnQUZxRU9vSERBRUxJQUpCZ0FGcUVPb0hJQUlvQXJBQklBSW9BclFCRUtrSkN5QUhJUUVnQ2lFREEwQWdBVVVOQkNBREx3SDJCaUlFUlEwQ0lBSWdBVFlDZENBQ0lBRkJBV3NpQVRZQ2lBRWdBaUFCTmdLQUFTQUNJQVJCQVdzaUJEWUNlQ0FDSUFNMkFuQWdBaUFESUFSQkFuUnFJZ1FvQXZ3R0lnTTJBb1FCSUFJZ0JDZ0MrQVkyQW53Z0F5OEI5Z1lpQkVFRlR3MEFJQUpCOEFCcVFRVWdCR3RCLy84RGNSQ0lBUXdBQ3dBTEEwQUNRQ0FGS0FMd0JpSUZSUVJBSUFKQkdHb2dDaUFIRU9RRklBSW9BaGdpQ2lFRklBSW9BaHdpQnlFR0RBRUxJQVpCQVdvaEJpQUZMd0gyQmtFS1N3MEJDd3NnQWtFUWFoRFZDRUVBSVFOQkFTRUJJQUlvQWhBaEJBTkFJQUVnQmtZRVFDQUZJQVlnQ0NBSklBSkJvQUpxSUFRZ0F4REtBeUFDUWVnQ2FpQUZJQVlRb0FZZ0FpZ0M3QUloQmlBQ0tBTG9BaUVGREFVRklBSkJDR29nQkNBREVPUUZJQUZCQVdvaEFTQUNLQUlNSVFNZ0FpZ0NDQ0VFREFFTEFBc0FDMEhHanNrQVFSbEJ2SS9KQUJDY0JnQUxJQkFRbmdRTUFnc2dBQ0FNTmdJSUlBQWdCellDQkNBQUlBbzJBZ0FnQWtHQUJHb2tBQThMSUF4QkFXb2hEQ0FDS1FOd0lSSWdBaWdDeEFFaEJDQUNLQUxNQVNFSUlBSW9BbmdoQVF3QUN3QUxxUWdDRW44Q2ZpTUFRU0JySWdZa0FDQUJLQUlNSVE0Z0FTZ0NDQ0VRSUFFb0FoUWhDQ0FCS0FJUUlRMENRQU5BQWtBQ1FBSkFBa0FnQ0NBTlJnUkFJQUVvQWdBaENTQUJLQUlFSWdRZ0RpQUVJQTVKR3lJSVFRRkdEUUVnQmlBSUlCQWdEa0hBbzhrQUVNTUhJQVlvQWdBZ0JpZ0NCQ0FKSUFoQjBLUEpBQkNzQnlBQktBSU1JUTRnQVNnQ0NDRVFEQUlMSUFnZ0RVa05BZ3dEQ3lBUUlBa3RBQUE2QUFBTElBRWdDRFlDRkVFQUlRMGdBVUVBTmdJUUlBRWdCQ0FJYXpZQ0JDQUJJQWdnQ1dvMkFnQU1BUXNnRFNBSVFieWx5UUFRdHdrQUN5QUlJQTVMQkVBZ0NDQU9RYnlseVFBUXVBa0FDeUFCS1FNWUlSWWdBU2tESUNFWElBRW9BaWdpQlMwQWp0SUNJUWRCQUNFS0lBVkJBRG9BanRJQ0lBWWdBellDRUNBR0lBSTJBZ3dnQ0NBTmF5RUpRUUVoQ3dKQUlBVXNBSXpTQWlJRVFYeEdCRUJCZXlFSFFRQWhEQXdCQzBFQUlRd2dCRUVBU0FSQVFYMGhCd3dCQ3lBRkxRQ1AwZ0lpQ2lBSlFRQkhjUVJBUVg0aEIwRUFJUW9NQVF0QndBQkJDQ0FGTFFDTjBnSWlCQnNnQkVFQ1NYSWhCQ0FOSUJCcUlSRWdCU0FKUlNBS2NrRUJjVG9BajlJQ0lBbEZJQWRCQVhGeFJRUkFBa0FnQlNnQ2hJQUNSUVJBSUFSQkFuSWdCQ0FKR3lFVUlBVkJpSUFDYWlFVlFRQWhDaUFKSVFRRFFDQUdRUlJxSUJVZ0VTQUVJQVZCZ0lBQ0lBVW9Bb0NBQWlBVUVBc2dCU0FHTEFBWUlnODZBSXpTQWlBRUlBWW9BaFFpRWtrTkFpQUZJQVlvQWh3MkFvU0FBaUFLSUJKcUlRb2dCU0FHUVF4cUVNY0RJQXhxSVF4QkFTRUxRWHNoQnlBUFFYeEdEUVFnRDBFQVNBUkFRWDBoQnd3RkN5QUpSU0FQUVFGR2NRMEVJQVFnRW1zaEJBSkFBa0FnQ1FSQUlBVW9Bb1NBQWlFSElBOUZJUXNDUUNBUFJTQUVSWElOQUVFQUlRc2dCaWdDRUVVTkFDQUhSUTBDQ3lBTElBZEZjU0VIUVFBaEN3d0hDeUFQUlEwQklBWW9BaEJGRFFZTElCRWdFbW9oRVF3QkN3dEJlMEVCSUFVb0FvU0FBaUlFR3lFSElBUkJBRWNoQ3d3REN5QUZJQVpCREdvUXh3TWhEQ0FGTFFDTTBnSWdCU2dDaElBQ2NrVWhCMEVBSVF0QkFDRUtEQUlMSUJJZ0JFRzBoY29BRUxrSkFBc2dCa0VVYWlBRlFZaUFBbW9nRVNBSklBSWdBMEVBSUFSQkJISVFDeUFGSUFZdEFCZ2lCRG9Bak5JQ1FYc2hCd0pBSUFSQi9BRkdEUUFnQk1BaUJFRUFTQVJBUVgwaEJ3d0JDeUFFUlFSQVFRQWhDMEVCSVFjTUFRc2dCVUgvQVRvQWpOSUNDeUFHS0FJY0lRd2dCaWdDRkNFS0N5QUJJQmNnREsxOE53TWdJQUVnRmlBS3JYdzNBeGdnQVNBSUlBb2dEV29pQlNBRklBaExHeUlOTmdJUUFuOENRQ0FMQkVBZ0IwRjdSdzBCUVFFaEUwRUJEQUlMSUFkQkFFZEJBWFFoRTBFQkRBRUxRUUFMUlFSQUlBQkJGRUcwcE1rQVFSWVEyQU1NQWdzQ1FBSkFJQk5CQVdzT0FnQUJBQXNnQ1VVZ0EwVnlEUUFnREVVTkFRc0xJQUJCQkRvQUFDQUFJQXcyQWdRTElBWkJJR29rQUF2K0NBSUZmd0YrSXdCQmdBUnJJZ1FrQUFKQUlBQXBBeEJDQW4waUNVSUNWZ1JBUVkrQXhBQWhBUXdCQ3dKQUFrQUNRQ0FKcDBFQmF3NENBUUVBQ3lBRVFZQUNhaUlGSUFBZ0FTQUNJQU1Ra2dFZ0JDZ0NoQUloQVNBRUtBS0FBaUlDUVlDQWdJQjRSZzBDSUFVZ0FTQUVLQUtJQWhEVkFpQUVRVUJyUVpLK3lRQXBBQUEzQXdBZ0JFRTRha0dLdnNrQUtRQUFOd01BSUFSQk1HcEJncjdKQUNrQUFEY0RBQ0FFUWZxOXlRQXBBQUEzQXlnZ0JFSElBV29nQlNBRVFTaHFFUElFSUFJZ0FSQ3BDU0FFS0FMTUFTRUJJQVFvQXNnQklnSkJnSUNBZ0hoR0RRSWdCQ2dDMEFFaUJpRUREQUVMSUFSQmdBSnFJQUFnQVNBQ0lBTVFrZ0VnQkNnQ2hBSWhBeUFFS0FLQUFpSUhRWUNBZ0lCNFJnUkFJQU1oQVF3Q0N5QUVLQUtJQWlFQ0lBUkJRR3RCQUVIQkFQd0xBQ0FFUVRCcVFkaXd5UUFwQXdBM0F3QWdCRUlBTndNNElBUkIwTERKQUNrREFEY0RLQ0FFUVpnQ2FrR1N2c2tBS1FBQU53TUFJQVJCa0FKcVFZcSt5UUFwQUFBM0F3QWdCRUdJQW1wQmdyN0pBQ2tBQURjREFDQUVRZnE5eVFBcEFBQTNBNEFDSUFSQktHb2dCRUdBQW1vUTJRa2dCRUcwQVdvaUJTQUJRWkFCYWtHYXZza0FRUUlRendFQ1FBSkFBa0FnQkNnQ3RBRkJuNENBZ0hoSEJFQkJpWURFQUNFQkRBRUxJQVJCb0FGcUlnVWdCQ2dDdUFFUTJ3UWdCQ2dDb0FGQm40Q0FnSGhIQkVCQmtJREVBQ0VCREFFTElBUW9BcVFCSWdFb0FnaEZCRUJCa0lERUFDRUJEQUlMSUFSQmpBRnFJZ1VnQVNnQ0JCQzRCQ0FFS0FLTUFVR2ZnSUNBZUVjRVFFR1FnTVFBSVFFTUFRc2dCRUVvYWlJRklBUW9BcEFCSUFRb0FwUUJFSjBDSUFSQmdBSnFJZ0VnQlVIZ0FQd0tBQUFnQkVISUFXb2lCU0FCRUxjQklBRWdBeUFDRU5VQ0lBUkIyQUZxSUFFZ0JSRHpCQ0FFUWVRQmFpQUNRZURBeVFBUTVnUWdCRUVUT2dEeUFTQUVRWUFDT3dId0FTQUVLQUxzQVNJR0lBSWdBaUFHU3hzaEJTQUVLQUxvQVNFQ0EwQWdCRUVnYWlBRVFmQUJhaENHQlNBRUxRQWdCRUFnQkMwQUlTRUlRUUFoQVFOQUlBRWdCVVpGQkVBZ0FTQUNhaUFCSUFOcUxRQUFJQWh6T2dBQUlBRkJBV29oQVF3QkN3c2dCRUdBQW1vaUFTQUNJQVlRMVFJZ0JFSDBBV29nQVNBRUtBTGNBU0lCSUFSQjRBRnFJZ2dvQWdBUThRUWdCQ2dDMkFFZ0FSQ3BDU0FJSUFSQi9BRnFLQUlBTmdJQUlBUWdCQ2tDOUFFM0E5Z0JEQUVMQ3lBRVFkZ0Jha0VnRUl3REVQOEJJUVVnQkVFWWFpQUVLQUxjQVNBRUtBTGdBUkMyQmlBRUtBSVlJQVFvQWh3Z0JSQ1dBU0FFS0FMZ0FTRUdJQVFvQXR3QklRRWdCQ2dDMkFFaEFpQUZFSk1JSUFRb0F1UUJJQVFvQXVnQkVLa0pEQUlMSUFVUXpRSUxRWUNBZ0lCNElRSUxJQWNnQXhDcENVRVFJUU1nQWtHQWdJQ0FlRVlOQVFzQ1FDQURJQUFvQWtBaUJVc0VmMEdLZ01RQUJTQUVRUkJxSUFFZ0JpQURRWURCeVFBUXl3Y2dCQ2dDRkNFR0lBUW9BaEFnQkVFSWFpQUFLQUk4SUFVZ0EwR1F3Y2tBRU1zSElBWWdCQ2dDQ0NBRUtBSU1FSVVKUlEwQlFaS0F4QUFMSUFJZ0FSQ3BDU0VCREFFTElBSWdBUkNwQ1VHWWdNUUFJUUVMSUFSQmdBUnFKQUFnQVF2OEJ3RUhmd0pBSUFGQmdBcEpCRUFnQVVFRmRpRUZBa0FDUUNBQUtBS2dBU0lFQkVBZ0JFRUJheUVESUFSQkFuUWdBR3BCQkdzaEFpQUVJQVZxUVFKMElBQnFRUVJySVFZZ0JFRXBTU0VFQTBBZ0JFVU5BaUFESUFWcUlnZEJLRThOQXlBR0lBSW9BZ0EyQWdBZ0JrRUVheUVHSUFKQkJHc2hBaUFEUVFGcklnTkJmMGNOQUFzTElBRkJJRWtOQXlBQVFRQTJBZ0FnQlVFQmFpSUNRUUpHRFFNZ0FFRUFOZ0lFSUFKQkEwWU5BeUFBUVFBMkFnZ2dBa0VFUmcwRElBQkJBRFlDRENBQ1FRVkdEUU1nQUVFQU5nSVFJQUpCQmtZTkF5QUFRUUEyQWhRZ0FrRUhSZzBESUFCQkFEWUNHQ0FDUVFoR0RRTWdBRUVBTmdJY0lBSkJDVVlOQXlBQVFRQTJBaUFnQWtFS1JnMERJQUJCQURZQ0pDQUNRUXRHRFFNZ0FFRUFOZ0lvSUFKQkRFWU5BeUFBUVFBMkFpd2dBa0VOUmcwRElBQkJBRFlDTUNBQ1FRNUdEUU1nQUVFQU5nSTBJQUpCRDBZTkF5QUFRUUEyQWpnZ0FrRVFSZzBESUFCQkFEWUNQQ0FDUVJGR0RRTWdBRUVBTmdKQUlBSkJFa1lOQXlBQVFRQTJBa1FnQWtFVFJnMERJQUJCQURZQ1NDQUNRUlJHRFFNZ0FFRUFOZ0pNSUFKQkZVWU5BeUFBUVFBMkFsQWdBa0VXUmcwRElBQkJBRFlDVkNBQ1FSZEdEUU1nQUVFQU5nSllJQUpCR0VZTkF5QUFRUUEyQWx3Z0FrRVpSZzBESUFCQkFEWUNZQ0FDUVJwR0RRTWdBRUVBTmdKa0lBSkJHMFlOQXlBQVFRQTJBbWdnQWtFY1JnMERJQUJCQURZQ2JDQUNRUjFHRFFNZ0FFRUFOZ0p3SUFKQkhrWU5BeUFBUVFBMkFuUWdBa0VmUmcwRElBQkJBRFlDZUNBQ1FTQkdEUU1nQUVFQU5nSjhJQUpCSVVZTkF5QUFRUUEyQW9BQklBSkJJa1lOQXlBQVFRQTJBb1FCSUFKQkkwWU5BeUFBUVFBMkFvZ0JJQUpCSkVZTkF5QUFRUUEyQW93QklBSkJKVVlOQXlBQVFRQTJBcEFCSUFKQkprWU5BeUFBUVFBMkFwUUJJQUpCSjBZTkF5QUFRUUEyQXBnQklBSkJLRVlOQXlBQVFRQTJBcHdCSUFKQktVWU5BMEVvUVNoQmxJM0JBQkRHQkFBTElBTkJLRUdVamNFQUVNWUVBQXNnQjBFb1FaU053UUFReGdRQUMwRytqY0VBUVIxQmxJM0JBQkNjQmdBTElBQW9BcUFCSUFWcUlRSWdBVUVmY1NJR1JRUkFJQUFnQWpZQ29BRWdBQThMQWtBZ0FrRUJheUlEUVNkTkJFQWdBaUVFSUFBZ0EwRUNkR29vQWdCQkFDQUJheUlCZGlJRFJRMEJJQUpCSjAwRVFDQUFJQUpCQW5ScUlBTTJBZ0FnQWtFQmFpRUVEQUlMSUFKQktFR1VqY0VBRU1ZRUFBc2dBMEVvUVpTTndRQVF4Z1FBQ3lBQ0lBVkJBV29pQjBzRVFDQUJRUjl4SVFFZ0FrRUNkQ0FBYWtFSWF5RURBMEFnQTBFRWFpSUlJQWdvQWdBZ0JuUWdBeWdDQUNBQmRuSTJBZ0FnQTBFRWF5RURJQWNnQWtFQmF5SUNTUTBBQ3dzZ0FDQUZRUUowYWlJQklBRW9BZ0FnQm5RMkFnQWdBQ0FFTmdLZ0FTQUFDL1FIQVF0L0l3QkJ3QVpySWdFa0FBSkFBa0FDUUFKQUlBTkJFRVlFUUNBRlFROXhSUVJBSUFWQkVISkJFRVlFUUNBQVFRQTJBZ2dnQUVLQWdJQ0FFRGNDQUF3R0N5QUZRUTlMQkVBZ0FVRVlha0VRSUFRZ0JVR0FwOGtBRUo4SElBRW9BaGdoQlNBQlFSQnFJQUVvQWh3aUEwR1UxdElBRUo4RklBRW9BaEFoRGlBQktBSVVJUWNnQXdSQUlBY2dCU0FEL0FvQUFBc2dBVUdRQTJvaUJpQUNFRndnQVVHQUEyb2lCU0FFRUljRklBRkJJR29nQmtIZ0F2d0tBQUFnQTBFUGNRMEVJQU5CQlhZaEJpQURRUVIySWcxQi92Ly8vd0J4SVFrZ0FVR1FCbW9oQ2tFQUlRUURRQ0FFSUFaR0JFQWdEVUVCY1NFS0lBY2dDVUVFZEdvaENTQUJRYkFHYWlFR1FRQWhBZ3dGQ3lBQlFZQUdhaUFISUFSQkJYUnFJZ0lRN1FJZ0FVR2dCbW9pQXlBQ0VPMENJQUZCa0FOcUlBRkJJR29nQXhERUFTQUJRYmdHYWlJSUlBRkJxQU5xS1FBQU53TUFJQUZCc0FacUlnc2dBVUdnQTJvcEFBQTNBd0FnQVVHb0Jtb2lEeUFCUVpnRGFpSVFLUUFBTndNQUlBRWdBU2tBa0FNM0E2QUdRUUFoQXdOQUlBTkJFRVlFUUVFQUlRTURRQ0FEUVJCR1JRUkFJQUVnQTJwQnNBWnFJZ3dnREMwQUFDQUJRWUFHYWlBRGFpMEFBSE02QUFBZ0EwRUJhaUVEREFFTEN5QUNJQUVwQTZBR053QUFJQUpCR0dvZ0NDa0RBRGNBQUNBQ1FSQnFJQXNwQXdBM0FBQWdBa0VJYWlBUEtRTUFOd0FBSUFGQmtBTnFJQW9RaHdVZ0JVRUlhaUFRS1FBQU53QUFJQVVnQVNrQWtBTTNBQUFnQkVFQmFpRUVEQUlGSUFGQm9BWnFJQU5xSWd3Z0RDMEFBQ0FESUFWcUxRQUFjem9BQUNBRFFRRnFJUU1NQVFzQUN3QUxBQXRCRUNBRlFmQ215UUFRdUFrQUN5QUFRb0NBZ0lESWdjQUlOd0lBREFRTElBQkNnSUNBZ0xpQndBZzNBZ0FNQXdzRFFBSkFJQUlnQ2tjRVFDQUJRZkFGYWlBSklBSkJCSFJxSWdRUWh3VWdBVUdBQm1vaUF5QUVFSWNGSUFGQm9BWnFJZ2dnQXhDSEJTQUdRUWhxUWdBM0FBQWdCa0lBTndBQUlBRkJrQU5xSUFGQklHb2dDQkRFQVNBQlFZZ0dhaUlJSUFGQm1BTnFLUUFBTndNQUlBRWdBU2tBa0FNM0E0QUdRUUFoQXdOQUlBTkJFRVlOQWlBQlFZQUdhaUFEYWlJTElBc3RBQUFnQXlBRmFpMEFBSE02QUFBZ0EwRUJhaUVEREFBTEFBc2dBVUVJYWlBSElBMFF0QU1nQVNnQ0NDSUVSUTBDSUFFZ0FTZ0NEQ0lDUVpUVzBnQVFud1VnQVNnQ0FDRUZJQUVvQWdRaEF5QUNCRUFnQXlBRUlBTDhDZ0FBQ3lBQUlBSTJBZ2dnQUNBRE5nSUVJQUFnQlRZQ0FBd0RDeUFFSUFFcEE0QUdOd0FBSUFSQkNHb2dDQ2tEQURjQUFDQUZJQUVwQVBBRk53QUFJQVZCQ0dvZ0FVSDRCV29wQUFBM0FBQWdBa0VCYWlFQ0RBQUxBQXNnQUVLQWdJQ0ErSUxBQ0RjQ0FBc2dEaUFIRUtrSkN5QUJRY0FHYWlRQUMvUUhBUXQvSXdCQndBaHJJZ0VrQUFKQUFrQUNRQUpBSUFOQklFWUVRQ0FGUVE5eFJRUkFJQVZCRUhKQkVFWUVRQ0FBUVFBMkFnZ2dBRUtBZ0lDQUVEY0NBQXdHQ3lBRlFROUxCRUFnQVVFWWFrRVFJQVFnQlVIQXA4a0FFSjhISUFFb0FoZ2hCU0FCUVJCcUlBRW9BaHdpQTBHVTF0SUFFSjhGSUFFb0FoQWhEaUFCS0FJVUlRY2dBd1JBSUFjZ0JTQUQvQW9BQUFzZ0FVR1FCR29pQmlBQ0VHd2dBVUdBQkdvaUJTQUVFSWNGSUFGQklHb2dCa0hnQS93S0FBQWdBMEVQY1EwRUlBTkJCWFloQmlBRFFRUjJJZzFCL3YvLy93QnhJUWtnQVVHUUNHb2hDa0VBSVFRRFFDQUVJQVpHQkVBZ0RVRUJjU0VLSUFjZ0NVRUVkR29oQ1NBQlFiQUlhaUVHUVFBaEFnd0ZDeUFCUVlBSWFpQUhJQVJCQlhScUlnSVE3UUlnQVVHZ0NHb2lBeUFDRU8wQ0lBRkJrQVJxSUFGQklHb2dBeERGQVNBQlFiZ0lhaUlJSUFGQnFBUnFLUUFBTndNQUlBRkJzQWhxSWdzZ0FVR2dCR29wQUFBM0F3QWdBVUdvQ0dvaUR5QUJRWmdFYWlJUUtRQUFOd01BSUFFZ0FTa0FrQVEzQTZBSVFRQWhBd05BSUFOQkVFWUVRRUVBSVFNRFFDQURRUkJHUlFSQUlBRWdBMnBCc0FocUlnd2dEQzBBQUNBQlFZQUlhaUFEYWkwQUFITTZBQUFnQTBFQmFpRUREQUVMQ3lBQ0lBRXBBNkFJTndBQUlBSkJHR29nQ0NrREFEY0FBQ0FDUVJCcUlBc3BBd0EzQUFBZ0FrRUlhaUFQS1FNQU53QUFJQUZCa0FScUlBb1Fod1VnQlVFSWFpQVFLUUFBTndBQUlBVWdBU2tBa0FRM0FBQWdCRUVCYWlFRURBSUZJQUZCb0FocUlBTnFJZ3dnREMwQUFDQURJQVZxTFFBQWN6b0FBQ0FEUVFGcUlRTU1BUXNBQ3dBTEFBdEJFQ0FGUWJDbnlRQVF1QWtBQ3lBQVFvQ0FnSURJZ2NBSU53SUFEQVFMSUFCQ2dJQ0FnTGlCd0FnM0FnQU1Bd3NEUUFKQUlBSWdDa2NFUUNBQlFmQUhhaUFKSUFKQkJIUnFJZ1FRaHdVZ0FVR0FDR29pQXlBRUVJY0ZJQUZCb0FocUlnZ2dBeENIQlNBR1FRaHFRZ0EzQUFBZ0JrSUFOd0FBSUFGQmtBUnFJQUZCSUdvZ0NCREZBU0FCUVlnSWFpSUlJQUZCbUFScUtRQUFOd01BSUFFZ0FTa0FrQVEzQTRBSVFRQWhBd05BSUFOQkVFWU5BaUFCUVlBSWFpQURhaUlMSUFzdEFBQWdBeUFGYWkwQUFITTZBQUFnQTBFQmFpRUREQUFMQUFzZ0FVRUlhaUFISUEwUXRBTWdBU2dDQ0NJRVJRMENJQUVnQVNnQ0RDSUNRWlRXMGdBUW53VWdBU2dDQUNFRklBRW9BZ1FoQXlBQ0JFQWdBeUFFSUFMOENnQUFDeUFBSUFJMkFnZ2dBQ0FETmdJRUlBQWdCVFlDQUF3REN5QUVJQUVwQTRBSU53QUFJQVJCQ0dvZ0NDa0RBRGNBQUNBRklBRXBBUEFITndBQUlBVkJDR29nQVVINEIyb3BBQUEzQUFBZ0FrRUJhaUVDREFBTEFBc2dBRUtBZ0lDQStJTEFDRGNDQUFzZ0RpQUhFS2tKQ3lBQlFjQUlhaVFBQzRFSkFRSi9Jd0JCRUdzaUFpUUFBbjhDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRRUVDSUFBb0FnQkJnSUNBZ0hoeklnTWdBMEVmVHh0QkFXc09IZ0VDQXdRRkJnY0lDUW9MREEwT0R4QVJFaE1VRlJZWEdCa2FHeHdkSGdBTElBSWdBRUVFYWpZQ0RDQUJRWUNJeWdCQkRTQUNRUXhxUWRZQUVOY0NEQjRMSUFJZ0FFRU1hallDRENBQlFZMkl5Z0JCQ2tHWGlNb0FRUWdnQUVFRWFrSFlBRUdmaU1vQVFRVWdBa0VNYWtIV0FCQ1NBd3dkQ3lBQ0lBQTJBZ3dnQVVHa2lNb0FRUWhCbDRqS0FFRUlJQUJCREdwQjJBQkJuNGpLQUVFRklBSkJER3BCMlFBUWtnTU1IQXNnQVNnQ0FFR3NpTW9BUVJBZ0FTZ0NCQ2dDREJFQ0FBd2JDeUFCS0FJQVFieUl5Z0JCRVNBQktBSUVLQUlNRVFJQURCb0xJQUlnQUVFRWFqWUNEQ0FCUWMySXlnQkJDaUFDUVF4cVFkb0FFTmNDREJrTElBSWdBRUVFYWpZQ0RDQUJRZGVJeWdCQkJTQUNRUXhxUWRzQUVOY0NEQmdMSUFJZ0FFRUVhallDRENBQlFkeUl5Z0JCQ2lBQ1FReHFRZHdBRU5jQ0RCY0xJQUlnQUVFRWFqWUNEQ0FCUWVhSXlnQkJCeUFDUVF4cVFka0FFTmNDREJZTElBSWdBRUVFYWpZQ0RDQUJRZTJJeWdCQkVpQUNRUXhxUWRrQUVOY0NEQlVMSUFJZ0FFRUVhallDRENBQlFmK0l5Z0JCRGlBQ1FReHFRZGtBRU5jQ0RCUUxJQUlnQUVFRWFqWUNEQ0FCUVkySnlnQkJEU0FDUVF4cVFka0FFTmNDREJNTElBSWdBRUVFYWpZQ0RDQUJRWnFKeWdCQkV5QUNRUXhxUWRrQUVOY0NEQklMSUFJZ0FFRUVhallDRENBQlFhMkp5Z0JCRFNBQ1FReHFRZDBBRU5jQ0RCRUxJQUlnQUVFRWFqWUNEQ0FCUWJxSnlnQkJBaUFDUVF4cVFkNEFFTmNDREJBTElBRW9BZ0JCdkluS0FFRUpJQUVvQWdRb0Fnd1JBZ0FNRHdzZ0FTZ0NBRUhGaWNvQVFRd2dBU2dDQkNnQ0RCRUNBQXdPQ3lBQktBSUFRZEdKeWdCQkVDQUJLQUlFS0FJTUVRSUFEQTBMSUFJZ0FFRUVhallDRENBQlFlR0p5Z0JCRGlBQ1FReHFRZDhBRU5jQ0RBd0xJQUlnQUVFRWFqWUNEQ0FCUWUrSnlnQkJEaUFDUVF4cVFkOEFFTmNDREFzTElBSWdBRUVFYWpZQ0RDQUJRZjJKeWdCQkVpQUNRUXhxUWRRQUVOY0NEQW9MSUFJZ0FFRUVhallDRENBQlFZK0t5Z0JCQ3lBQ1FReHFRZGtBRU5jQ0RBa0xJQUVvQWdCQm1vcktBRUVPSUFFb0FnUW9BZ3dSQWdBTUNBc2dBU2dDQUVHb2lzb0FRUkFnQVNnQ0JDZ0NEQkVDQUF3SEN5QUNJQUJCQkdvMkFnd2dBVUc0aXNvQVFRUWdBa0VNYWtIZ0FCRFhBZ3dHQ3lBQ0lBQkJCR28yQWd3Z0FVRzhpc29BUVE1QnlvcktBRUVHSUFKQkRHcEIzUUFRbndNTUJRc2dBU2dDQUVIUWlzb0FRUkFnQVNnQ0JDZ0NEQkVDQUF3RUN5QUNJQUJCQkdvMkFnd2dBVUhnaXNvQVFRWWdBa0VNYWtIWkFCRFhBZ3dEQ3lBQ0lBQkJCR28yQWd3Z0FVSG1pc29BUVEwZ0FrRU1ha0hoQUJEWEFnd0NDeUFDSUFBMkFnd2dBVUh6aXNvQVFRb2dBa0VNYWtIaUFCRFhBZ3dCQ3lBQ0lBQkJCR28yQWd3Z0FVSDlpc29BUVJvZ0FrRU1ha0hqQUJEWEFnc2dBa0VRYWlRQUM4Y0hBUWwvSXdCQmtBbHJJZ0VrQUFKQUFrQUNRQ0FEUVNCR0JFQWdBVUVJYWlBRlFYQnhJZ05CSUdvaUJrR1FwOGtBRUo4RklBRkJBRFlDSENBQklBRXBBd2czQWhRUS93RWhDaUFCUVNocUlnbENBRGNEQUNBQlFnQTNBeUFnQ2lBQlFTQnFJZ2NRNFFrZ0FVRVVhaUlJSUFjZ0FVRXdhaUlIRU1nR0lBZ2dCQ0FGRUpjSklBZ2dCaENNQXlBQlFhZ0VhaUFKS1FNQU53TUFJQUVnQVNrRElEY0RvQVFnQVVHd0JHb2lCaUFDRUd3Z0FVR1FCR29nQVVHZ0JHb1Fod1VnQnlBR1FlQUQvQW9BQUNBQklBRW9BaGdpRENBQktBSWNRYUNueVFBUXVRWWdCU0FCS0FJRUlnUkxEUUlnQVNnQ0FDRUNJQVlnQjBId0Evd0tBQUFnQVVINENHcENBRGNEQUNBQlFnQTNBL0FJSUFOQkVHb2dCRXNOQWlBQ0lBTnFJUU1nQlVFUGNTSUVCRUFnQVVId0NHb2dBeUFFL0FvQUFBc2dBVUh3Q0dvZ0JCRG5CQ0FCUWFnSWFpQUJRZmdJYWlJR0tRTUFOd01BSUFFZ0FTa0Q4QWczQTZBSUlBRWdBellDdkFnZ0FTQUZRUVIySWcwMkFyZ0lJQUVnQWpZQ3RBZ2dBU0FDTmdLd0NDQUJRZUFJYWlFSklBRkJrQWhxSVFoQkFDRUVBMEFnQkNBTlJrVUVRQ0FCUWNBSWFpQUNJQVJCQkhScUlnY1Fod1ZCQUNFRkEwQWdCVUVRUmtVRVFDQUJRY0FJYWlBRmFpSUxJQXN0QUFBZ0FTQUZha0dRQ0dvdEFBQnpPZ0FBSUFWQkFXb2hCUXdCQ3dzZ0FVSFFDR29pQlNBQlFjQUlhaUlMRUljRklBbEJDR3BDQURjQUFDQUpRZ0EzQUFBZ0FVSHdDR29pRGlBQlFiQUVhaUFGRUx3QklBRkJ5QWhxSWdVZ0Jpa0FBRGNEQUNBQklBRXBBUEFJTndQQUNDQU9JQXNRaHdVZ0NFRUlhaUFHS1FBQU53QUFJQWdnQVNrQThBZzNBQUFnQjBFSWFpQUZLUU1BTndBQUlBY2dBU2tEd0FnM0FBQWdCRUVCYWlFRURBRUxDeUFDUlEwQ0lBRkJ3QWhxSUFGQm9BaHFFSWNGUVFBaEJRTkFJQVZCRUVZTkFpQUJRY0FJYWlBRmFpSUNJQUl0QUFBZ0FTQUZha0dRQ0dvdEFBQnpPZ0FBSUFWQkFXb2hCUXdBQ3dBTElBQkNnSUNBZ0xpQndBZzNBZ0FNQWdzZ0FVSG9DR3BDQURjREFDQUJRZUFJYWtJQU53TUFJQUZCMkFocVFnQTNBd0FnQVVJQU53UFFDQ0FCUWRBSWFpSUNJQUZCd0FocUlnUVFod1VnQVVId0NHb2lCU0FCUWJBRWFpQUNFTHdCSUFGQnlBaHFJZ0lnQVVINENHb3BBQUEzQXdBZ0FTQUJLUUR3Q0RjRHdBZ2dCU0FFRUljRklBTkJDR29nQWlrREFEY0FBQ0FESUFFcEE4QUlOd0FBSUFFb0FyUUlSUTBBSUFBZ0FTa0NGRGNDQUNBQVFRaHFJQUZCSEdvb0FnQTJBZ0FnQ2hDVENBd0JDeUFBUW9DQWdJRDRnc0FJTndJQUlBb1Frd2dnQVNnQ0ZDQU1FS2tKQ3lBQlFaQUphaVFBQzdVSUFnbC9CSDRqQUVHQUFtc2lCQ1FBUVF3aEJRSkFBa0FDUUFKQUFrQWdBU2dDR0NJSURnSUVBQUVMSUFJZ0F5QUJLQUlVSWdOQnpBQnFLQUlBSUFOQjBBQnFLQUlBRU1JSlJRMERJQUZCQURZQ0dDQURLQUlBSWdKQkRFWU5BeUFES0FKTUlRZ2dBeWdDU0NFS0lBTW9BbFFoQlNBRVFkUUFhaUFEUVFScVFjUUEvQW9BQUNBQlFSeHFJUWtnQmEwaURrSVppRUtCZ29TSWtLREFnQUYrSVE4Z0FTZ0NIQ0lEUVFScklRWWdCU0FCS0FJZ0lnZHhJUUZCQUNFRkEwQWdCQ0FCSUFOcUtRQUFJZzBnRDRVaUVFSi9oU0FRUW9HQ2hJaVFvTUNBQVgyRFFvQ0Jnb1NJa0tEQWdIK0ROd080QVFKQUEwQWdCRUVJYWlBRVFiZ0JhaUlMRU5rRklBUW9BZ2hCQVhGRkRRRWdCaUFFS0FJTUlBRnFJQWR4SWd4QkFuUnJLQUlBRFFBTElBUWdDVFlDSENBRUlBNDNBeEFnQkNBRFFRQWdER3RCQW5ScU5nSVlJQXNnQkVFUWFoQ0pBd3dEQ3lBTklBMUNBWWFEUW9DQmdvU0lrS0RBZ0grRFFnQlNEUUlnQlVFSWFpSUZJQUZxSUFkeElRRU1BQXNBQ3lBQktRTUFJQUVwQXdnZ0FpQURFSjhFSVFvZ0JDQUlOZ0trQVNBRUlBTTJBcHdCSUFRZ0FqWUNtQUVnQkNBQktBSVVOZ0tnQVNBQktBSWNJQUVvQWlBZ0NxMGlEU0FFUVpnQmFoQ0hBaUlDUlEwQ0lBUWdBVUVjYWpZQ3RBRWdCQ0FDTmdLd0FTQUVJQTAzQTZnQklBUkJ1QUZxSWdnZ0JFR29BV29RaVFNQ1FDQUVLQUs0QVNJRElBRW9BaGdpQjBrRVFDQUJLQUlVSWdrZ0EwSFlBR3dpQm1vaUJTZ0NBQ0VDSUFnZ0JVRUVha0hFQVB3S0FBQWdCU2dDVENFSUlBVW9Ba2doQ2lBRklBa2dCMEVCYXlJRlFkZ0FiR3BCMkFEOENnQUFJQUVnQlRZQ0dDQURJQVZQRFFFZ0FTZ0NIQ0lIUVFScklRc2dBU2dDSUNJSklBWWdBU2dDRkdvb0FsUWlCbkVoQVNBR1FSbDJyVUtCZ29TSWtLREFnQUYrSVE1QkFDRUdBMEFnQkNBQklBZHFLUUFBSWcwZ0RvVWlEMEovaFNBUFFvR0NoSWlRb01DQUFYMkRRb0NCZ29TSWtLREFnSCtETndNUUFrQURRQ0FFSUFSQkVHb1EyUVVnQkNnQ0FFRUJjVVVOQVNBTElBUW9BZ1FnQVdvZ0NYRWlERUVDZEdzb0FnQWdCVWNOQUFzZ0IwRUFJQXhyUVFKMGFrRUVheUFETmdJQURBTUxJQTBnRFVJQmhvTkNnSUdDaElpUW9NQ0FmNE5RQkVBZ0JrRUlhaUlHSUFGcUlBbHhJUUVNQVFzTFFZRHd5UUJCRDBHUThNa0FFUDBFQUFzakFFRXdheUlBSkFBZ0FDQUhOZ0lFSUFBZ0F6WUNBQ0FBUVFNMkFnd2dBRUhNcE1BQU5nSUlJQUJDQWpjQ0ZDQUFJQUJCQkdxdFFvQ0FnSUNnQTRRM0F5Z2dBQ0FBclVLQWdJQ0FvQU9FTndNZ0lBQWdBRUVnYWpZQ0VDQUFRUWhxUVlEdnlRQVFxd2NBQ3lBRVFSQnFJQVJCdUFGcVFjUUEvQW9BQUVFTUlRVWdBa0VNUmcwQ0RBRUxRUXdoQlNBQ1FReEdEUUVnQkVFUWFpQUVRZFFBYWtIRUFQd0tBQUFMSUFCQkJHb2dCRUVRYWtIRUFQd0tBQUFnQ2lBSUVLa0pJQUloQlFzZ0FDQUZOZ0lBSUFSQmdBSnFKQUFMK3dvQkJYOGpBRUVnYXlJRUpBQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUVPS0FZQkFRRUJBUUVCQVFJRUFRRURBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVKQVFFQkFRY0FDeUFCUWR3QVJnMEVDeUFDUVFGeElBRkIvd1ZMY1EwR0lBRkJJRWtOQ1NBQlFmOEFTUTBLREFnTElBQkJnQVE3QVFvZ0FFSUFOd0VDSUFCQjNPZ0JPd0VBREFvTElBQkJnQVE3QVFvZ0FFSUFOd0VDSUFCQjNPUUJPd0VBREFrTElBQkJnQVE3QVFvZ0FFSUFOd0VDSUFCQjNOd0JPd0VBREFnTElBQkJnQVE3QVFvZ0FFSUFOd0VDSUFCQjNMZ0JPd0VBREFjTElBQkJnQVE3QVFvZ0FFSUFOd0VDSUFCQjNPQUFPd0VBREFZTElBSkJnQUp4UlEwRUlBQkJnQVE3QVFvZ0FFSUFOd0VDSUFCQjNNNEFPd0VBREFVTFFSRkJBQ0FCUWErd0JFOGJJZ0lnQWtFSWNpSURJQUZCQzNRaUFpQURRUUowUWREaHdRQnFLQUlBUVF0MFNSc2lBeUFEUVFSeUlnTWdBMEVDZEVIUTRjRUFhaWdDQUVFTGRDQUNTeHNpQXlBRFFRSnlJZ01nQTBFQ2RFSFE0Y0VBYWlnQ0FFRUxkQ0FDU3hzaUF5QURRUUZxSWdNZ0EwRUNkRUhRNGNFQWFpZ0NBRUVMZENBQ1N4c2lBeUFEUVFGcUlnTWdBMEVDZEVIUTRjRUFhaWdDQUVFTGRDQUNTeHNpQTBFQ2RFSFE0Y0VBYWlnQ0FFRUxkQ0lHSUFKR0lBSWdCa3RxSUFOcUlnWkJBblJCME9IQkFHb2lCeWdDQUVFVmRpRUNRZThGSVFNQ1FDQUdRU0JOQkVBZ0J5Z0NCRUVWZGlFRElBWkZEUUVMSUFkQkJHc29BZ0JCLy8vL0FIRWhCUXNDUUNBRElBSkJBV3BHRFFBZ0FTQUZheUVGSUFOQkFXc2hCa0VBSVFNRFFDQURJQUpCN01mQUFHb3RBQUJxSWdNZ0JVc05BU0FHSUFKQkFXb2lBa2NOQUFzTElBSkJBWEZGRFFFZ0JFRUFPZ0FLSUFSQkFEc0JDQ0FFSUFGQkZIWkIvZlBBQUdvdEFBQTZBQXNnQkNBQlFRUjJRUTl4UWYzendBQnFMUUFBT2dBUElBUWdBVUVJZGtFUGNVSDk4OEFBYWkwQUFEb0FEaUFFSUFGQkRIWkJEM0ZCL2ZQQUFHb3RBQUE2QUEwZ0JDQUJRUkIyUVE5eFFmM3p3QUJxTFFBQU9nQU1JQUZCQVhKblFRSjJJZ0lnQkVFSWFpSURhaUlGUWZzQU9nQUFJQVZCQVd0QjlRQTZBQUFnQXlBQ1FRSnJJZ0pxUWR3QU9nQUFJQVJCRUdvaUF5QUJRUTl4UWYzendBQnFMUUFBT2dBQUlBQkJDam9BQ3lBQUlBSTZBQW9nQUNBRUtRSUlOd0lBSUFSQi9RQTZBQkVnQUVFSWFpQURMd0VBT3dFQURBUUxJQUpCLy8vL0IzRkJnSUFFU1EwQ0lBQkJnQVE3QVFvZ0FFSUFOd0VDSUFCQjNNUUFPd0VBREFNTElBRkJnSUFFVHdSQUlBRkJnSUFJU1FSQUlBRkJ6SUhCQUVFc1FhU0N3UUJCMEFGQjlJUEJBRUhtQXhEZUFVVU5BZ3dEQ3lBQlFmNy8vd0J4UVo3d0NrWWdBVUhnLy84QWNVSGd6UXBHY2lBQlFjRHVDbXRCZVVzZ0FVR3duUXRyUVhGTGNuSWdBVUh3MXd0clFYQkxJQUZCZ1BBTGEwSGRiRXR5SUFGQmdJQU1hMEdkZEVzZ0FVSFFwZ3hyUVhwTGNuSnlJQUZCZ0lJNGEwR3Z4VlJMSUFGQjhJTTRUM0p5RFFFTUFnc2dBVUhhaDhFQVFTaEJxb2pCQUVHaUFrSE1pc0VBUWFrQ0VONEJEUUVMSUFSQkFEb0FGaUFFUVFBN0FSUWdCQ0FCUVJSMlFmM3p3QUJxTFFBQU9nQVhJQVFnQVVFRWRrRVBjVUg5ODhBQWFpMEFBRG9BR3lBRUlBRkJDSFpCRDNGQi9mUEFBR290QUFBNkFCb2dCQ0FCUVF4MlFROXhRZjN6d0FCcUxRQUFPZ0FaSUFRZ0FVRVFka0VQY1VIOTg4QUFhaTBBQURvQUdDQUJRUUZ5WjBFQ2RpSUNJQVJCRkdvaUEyb2lCVUg3QURvQUFDQUZRUUZyUWZVQU9nQUFJQU1nQWtFQ2F5SUNha0hjQURvQUFDQUVRUnhxSWdNZ0FVRVBjVUg5ODhBQWFpMEFBRG9BQUNBQVFRbzZBQXNnQUNBQ09nQUtJQUFnQkNrQ0ZEY0NBQ0FFUWYwQU9nQWRJQUJCQ0dvZ0F5OEJBRHNCQUF3QkN5QUFJQUUyQWdRZ0FFR0FBVG9BQUFzZ0JFRWdhaVFBQzZzSEFRcC9Jd0JCNEFGcklnTWtBQ0FCS0FJQUlnY2dBU2dDQ0NJSlFRTjBhaUlFTHdFRUlRc2dCQ2dDQUNFTUlBY3ZBZllHSWdZZ0NVRi9jMm9pQlVFRGRDSUlCRUFnQkNBRVFRaHFJQWo4Q2dBQUN5QUhJQWxCeUFCc2FpSUlRZGdBYWlFRVFRQkZCRUFnQTBISUFHb2dCRUhJQVB3S0FBQUxJQVZCeUFCc0lnVUVRQ0FFSUFoQm9BRnFJQVg4Q2dBQUN5QUhJQVpCQVdzaUJqc0I5Z1lnQ2tVRVFDQURRWmdCYWlBRFFjZ0Fha0hJQVB3S0FBQUxJQUVvQWdRaEJBSkFJQVpCLy84RGNVRUVTdzBBSUFOQnlBQnFJQWNnQkJERUFnSkFJQU1vQWtnaUNrRUNSZ1JBSUFNZ0NUWUNKQ0FESUFNcEFrdzNBaHdNQVFzZ0F5Z0NXQ0lITHdIMkJpQURLQUpnSWdRdkFmWUdha0VCYWlFSUlBTkJ6QUJxSVFFZ0F5Z0NaQ0VHSUFNb0Fsd2hCUUpBSUFwQkFYRUVRQ0FJUVF4SkRRRWdBMEV3YWlBQlFRaHFLQUlBTmdJQUlBTWdCallDUUNBRElBUTJBandnQXlBRk5nSTRJQU1nQnpZQ05DQURJQUVwQWdBM0F5Z2dBMEVvYWtFQkVJWUJJQU1nQ1RZQ0pDQURJQVUyQWlBZ0F5QUhOZ0ljREFJTElBaEJERThFUUNBRFFUQnFJQUZCQ0dvb0FnQTJBZ0FnQXlBR05nSkFJQU1nQkRZQ1BDQURJQVUyQWpnZ0F5QUhOZ0kwSUFNZ0FTa0NBRGNES0NBRFFTaHFRUUVRaUFFZ0F5QUdOZ0lnSUFNZ0JEWUNIQ0FESUFsQkFXbzJBaVFNQWdzZ0EwRXdhaUFCUVFocUtBSUFOZ0lBSUFNZ0JqWUNRQ0FESUFRMkFqd2dBeUFGTmdJNElBTWdCellDTkNBRElBRXBBZ0EzQXlnZ0EwRWNhaUFEUVNocVFRRWdDUkMyQXd3QkN5QURRVEJxSUFGQkNHb29BZ0EyQWdBZ0F5QUdOZ0pBSUFNZ0JEWUNQQ0FESUFVMkFqZ2dBeUFITmdJMElBTWdBU2tDQURjREtDQURRUnhxSUFOQktHcEJBQ0FKRUxZREN5QURLQUlrSVFrZ0F5Z0NJQ0VFSUFNb0Fod2lCeWdDOEFZaUFVVU5BQ0FFUVFGcUlRVWdBMEhNQUdvaEJnTkFJQUV2QWZZR0lnaEJCRXNOQVNBRFFjZ0FhaUFCSUFVUXhBSWdBeWdDU0NJRlFRSkdCRUFnQ0EwQ0lBSkJBVG9BQUF3Q0N5QURLQUpZTHdIMkJpQURLQUpnTHdIMkJtcEJBV29oQVFKL0FrQWdCVUVCY1FSQUlBRkJERWtOQVNBR1FRVWdDR3NRaGdFTUJBc2dBVUVNVHdSQUlBWkJCU0FJYXhDSUFRd0VDeUFEUVJCcUlBWVFsQUVnQXlnQ0ZDRUZJQU1vQWhBTUFRc2dBMEVJYWlBR0VKUUJJQU1vQWd3aEJTQURLQUlJQ3lJQkRRQUxDeUFBSUFzN0FRUWdBQ0FNTmdJQUlBQkJCbW9nQTBHV0FXcEJ5Z0Q4Q2dBQUlBQWdDVFlDV0NBQUlBUTJBbFFnQUNBSE5nSlFJQU5CNEFGcUpBQUxzaEFDRkg4RWZpTUFRZUFBYXlJSUpBQWdBaWdDQkNFTklBSW9BZ2doRGlBQktRTUFJUmdnQVNrRENDRVpJQWhCMEFCcVFnQTNBd0FnQ0VJQU53TklJQWdnR1RjRFFDQUlJQmczQXpnZ0NDQVpRdlBLMGN1bmpObXk5QUNGTndNd0lBZ2dHVUx0M3BIemxzemN0K1FBaFRjREtDQUlJQmhDNGVTVjg5YnMyYnpzQUlVM0F5QWdDQ0FZUXZYS3pZUFhyTnUzOHdDRk53TVlJQWhCR0dvaUJpQU9FTGdISUFZZ0RTQU9FTDhDSUFZUTVnRWlHYWNoRXlBQktBSVlJUkVnQVNnQ0ZDRVVJQUlvQWdBaEZTQUJLQUlrUlFSQUl3QkIwQUJySWdRa0FDQUVJQkUyQWhnZ0JDQVVOZ0lVQW44Q1FBSkFJQVJCT0dvQ2Z3SkFBa0FnQVVFY2FpSUhLQUlNSWd4QmYwWU5BQ0FNSUFjb0FnUWlDU0FKUVFGcUlndEJBM1lpQmtFSGJDQUpRUWhKR3lJQ1FRRjJTUTBESUFJZ0RDQUNJQXhMR3lJQ1FRNUpEUUVnQWtIKy8vLy9BVXNOQUVGL0lBSkJBM1JCQ0dwQkIyNUJBV3RuZGtFQmFnd0NDeERzQmdBTFFRUkJDRUVRSUFKQkIwa2JJQUpCQTBrYkN4RDFBeUFFS0FJOElnWWdCQ2dDT0NJQ1JRMENHaUFFS0FKQUlRVWdCQ2dDUkNFSklBWkJDV29pQ3dSQUlBSkIvd0VnQy93TEFBc2dCQ0FKTmdJMElBUWdCVFlDTUNBRUlBWTJBaXdnQkNBQ05nSW9JQVJDaElDQWdJQUJOd0lnSUFRZ0IwRVFhallDSENBSEtBSUFJZ1VwQXdBaEdDQUVJQVUyQWtnZ0JDQU1OZ0pFSUFSQkFEWUNRQ0FFSUJoQ2Y0VkNnSUdDaElpUW9NQ0FmNE0zQXpnZ0FrRUlhaUVKSUFSQktHb2hDd05BSUF3RVFBTkFJQVJCQ0dvZ0JFRTRhaERaQlNBRUtBSUlRUUZ4UlFSQUlBUWdCQ2dDU0NJRlFRaHFOZ0pJSUFRZ0JDZ0NRRUVJYWpZQ1FDQUVJQVVwQXdoQ2Y0VkNnSUdDaElpUW9NQ0FmNE0zQXpnTUFRc0xJQVFvQWd3aEJTQUVJQVFvQWtSQkFXc2lERFlDUkNBQ0lBSWdCaUFFUVJScUlBY29BZ0FnQlNBRUtBSkFhaUlLRUxnR0loZ1E5Z01pQldvZ0dFSVppS2NpRHpvQUFDQUpJQVlnQlVFSWEzRnFJQTg2QUFBZ0FpQUZRUUowYTBFRWF5QUhLQUlBSUFwQkFuUnJRUVJyS0FBQU5nQUFEQUVMQ3lBRUlBY29BZ3dpQWpZQ05DQUVJQVFvQWpBZ0FtczJBakFnQnlBTFFRUVFwd1lnQkNnQ0xDSUNSUTBCSUFRb0FpZ2dBaUFFS0FJZ0lBUW9BaVFRdHdZTUFRc2dCaUFMUVFkeFFRQkhhaUVHSUFjb0FnQWlCU0VDQTBBZ0JnUkFJQUlnQWlrREFDSVlRbitGUWdlSVFvR0NoSWlRb01DQUFZTWdHRUwvL3YzNzkrL2Z2LzhBaEh3M0F3QWdBa0VJYWlFQ0lBWkJBV3NoQmd3QkN3c0NRQ0FMUVFoUEJFQWdCU0FMYWlBRktRQUFOd0FBREFFTElBdEZEUUFnQlVFSWFpQUZJQXY4Q2dBQUMwRUFJUVlEUUFKQUlBWWlBaUFMUndSQUlBSkJBV29oQmlBQ0lBVnFMUUFBUVlBQlJ3MENJQVVnQWtFQ2RHdEJCR3NoRHdOQUlBSWdDU0FFUVJScUlBVWdBaEM0QmlJWXAzRWlFbXNnQlNBSklCZ1E5Z01pQ2lBU2EzTWdDWEZCQ0VrTkFpQUZJQXBxSWdrdEFBQWdDU0FZUWhtSXB5SVdPZ0FBSUFVZ0J5Z0NCQ0lKSUFwQkNHdHhha0VJYWlBV09nQUFJQVVnQ2tFQ2RHdEJCR3NoQ2tIL0FVY0VRQ0FQSUFwQkFSQ25CaUFIS0FJQUlRVU1BUXNMSUFjb0FnQWlCU0FDYWtIL0FUb0FBQ0FGSUFjb0FnUWlDU0FDUVFocmNXcEJDR3BCL3dFNkFBQWdDaUFQS0FBQU5nQUFEQUlMSUFjZ0J5Z0NCQ0lDSUFKQkFXcEJBM1pCQjJ3Z0FrRUlTUnNnREdzMkFnZ01BZ3NnQWlBRmFpQVlRaG1JcHlJS09nQUFJQVVnQnlnQ0JDSUpJQUpCQ0d0eGFrRUlhaUFLT2dBQURBQUxBQXRCQUFzYUlBUkIwQUJxSkFBTElBRkJFR29oQ1NBQktBSWNJZ1ZCQkdzaERDQUJLQUlnSWdjZ0UzRWhCQ0FaUWhtSUlobEMvd0NEUW9HQ2hJaVFvTUNBQVg0aEdrRUFJUUlDUUFKQUFrQURRQ0FJSUFRZ0JXb3BBQUFpR0NBYWhTSWJRbitGSUJ0Q2dZS0VpSkNnd0lBQmZZTkNnSUdDaElpUW9NQ0FmNE0zQXhnQ1FBTkFJQWhCRUdvZ0NFRVlhaUlMRU5rRklBZ29BaEFpQ2tFQmNVVU5BU0FNSUFnb0FoUWdCR29nQjNFaUNrRUNkR3NvQWdBaUJpQVJUdzBFSUEwZ0RpQVVJQVpCMkFCc2FpSUdRY3dBYWlnQ0FDQUdRZEFBYWlnQ0FCRHNCMFVOQUFzZ0JTQUtRUUowYTBFRWF5Z0NBQ0lDSUFFb0FoZ2lCazhOQkNBQktBSVVJQUpCMkFCc2FpSUJLQUlBSVFJZ0N5QUJRUVJxUWNRQS9Bb0FBQ0FCSUFOQnlBRDhDZ0FBSUJVZ0RSQ3BDUXdDQzBFQklRWUNRQUpBSUFKRkJFQWdDRUVJYWlBSElCZ2dCQkN0QnlBSUtBSU1JUkFnQ0NnQ0NDSUdRUUZ4UlEwQkN5QVlJQmhDQVlhRFFvQ0Jnb1NJa0tEQWdIK0RRZ0JTRFFFTElCZEJDR29pRnlBRWFpQUhjU0VFSUFZaEFnd0JDd3NnQlNBUWFpd0FBRUVBVGdSQUlBVXBBd0JDZ0lHQ2hJaVFvTUNBZjRONnAwRURkaUVRQ3lBRklBVWdFRUVDZEdzZ0VDQUtRUUZ4R3lJQ2FpSUdMUUFBSVFRZ0FTZ0NHQ0VNSUFZZ0dhZEIvd0J4SWdZNkFBQWdCU0FISUFKQkNHdHhha0VJYWlBR09nQUFJQVVnQWtFQ2RHdEJCR3NnRERZQ0FDQUJJQUVvQWloQkFXbzJBaWdnQVNBQktBSWtJQVJCQVhGck5nSWtJQUVvQWhnaUJDQUJLQUlRSWdKR0JIOGdBU2dDSkNBQktBSW9JQWxCQVJDSkJDQUJLQUlZSVFRZ0FTZ0NFQVVnQWdzZ0JFWUVRQ01BUVJCcklnSWtBQ0FDUVFocUlBa2dDU2dDQUVFQlFRaEIyQUFRaUFJZ0FpZ0NDQ0lHUVlHQWdJQjRSd1JBSUFZZ0FpZ0NERUd3OE1rQUVNd0lBQXNnQWtFUWFpUUFDeUFCS0FJVUlBUkIyQUJzYWlJQ0lBTkJ5QUQ4Q2dBQUlBSWdFellDVkNBQ0lBNDJBbEFnQWlBTk5nSk1JQUlnRlRZQ1NDQUJJQVJCQVdvMkFoaEJEQ0VDQ3lBQUlBSTJBZ0FnQUVFRWFpQUlRUmhxUWNRQS9Bb0FBQ0FJUWVBQWFpUUFEd3NnQmlBUlFhU2Z5UUFReGdRQUN5QUNJQVpCd1BESkFCREdCQUFMd1FZQkMzOGpBRUVRYXlJSEpBQkJBU0VNQWtBZ0FrRWlJQU1vQWhBaURSRURBQTBBQWtBQ1FDQUJSUVJBUVFBaEFRd0JDeUFBSVFnZ0FTRUpBa0FEUUNBSUlBbHFJUTVCQUNFRUFrQURRQ0FFSUFocUlnb3RBQUFpQzBIL0FHdEIvd0Z4UWFFQlNTQUxRU0pHY2lBTFFkd0FSbklOQVNBSklBUkJBV29pQkVjTkFBc2dCU0FKYWlFRkRBSUxJQVFnQldvaEJRSkFBa0FDUUNBS0xBQUFJZ1JCQUU0RVFDQUtRUUZxSVFnZ0JFSC9BWEVoQkF3QkN5QUtMUUFCUVQ5eElRZ2dCRUVmY1NFSklBUkJYMDBFUUNBSlFRWjBJQWh5SVFRZ0NrRUNhaUVJREFFTElBb3RBQUpCUDNFZ0NFRUdkSEloQ3lBRVFYQkpCRUFnQ3lBSlFReDBjaUVFSUFwQkEyb2hDQXdCQ3lBS1FRUnFJUWdnQ1VFU2RFR0FnUEFBY1NBS0xRQURRVDl4SUF0QkJuUnljaUlFUVlDQXhBQkdEUUVMSUFkQkJHb2dCRUdCZ0FRUVVRSkFJQWN0QUFSQmdBRkdEUUFnQnkwQUR5QUhMUUFPYTBIL0FYRkJBVVlOQUFKQUFrQWdCU0FHU1EwQUFrQWdCa1VOQUNBQklBWk5CRUFnQVNBR1J3MENEQUVMSUFBZ0Jtb3NBQUJCdjM5TURRRUxBa0FnQlVVTkFDQUJJQVZOQkVBZ0FTQUZSZzBCREFJTElBQWdCV29zQUFCQlFFZ05BUXNnQWlBQUlBWnFJQVVnQm1zZ0F5Z0NEQ0lHRVFJQVJRMEJEQVFMSUFBZ0FTQUdJQVZCc1BuQUFCQ0RDUUFMQWtBZ0J5MEFCRUdBQVVZRVFDQUNJQWNvQWdnZ0RSRURBQTBFREFFTElBSWdCeTBBRGlJSklBZEJCR3BxSUFjdEFBOGdDV3NnQmhFQ0FBMERDd0ovUVFFZ0JFR0FBVWtOQUJwQkFpQUVRWUFRU1EwQUdrRURRUVFnQkVHQWdBUkpHd3NnQldvaEJnc0NmMEVCSUFSQmdBRkpEUUFhUVFJZ0JFR0FFRWtOQUJwQkEwRUVJQVJCZ0lBRVNSc0xJQVZxSVFVTElBNGdDR3NpQ1EwQkRBSUxDd3dEQ3lBRklBWkpEUUZCQUNFRUFrQWdCa1VOQUNBQklBWk5CRUFnQmlBQklnUkhEUU1NQVFzZ0JpSUVJQUJxTEFBQVFiOS9UQTBDQ3lBRlJRUkFRUUFoQVF3QkN5QUJJQVZOQkVBZ0FTQUZSZzBCSUFRaEJnd0NDeUFBSUFWcUxBQUFRYjkvVEFSQUlBUWhCZ3dDQ3lBRklRRUxJQUlnQUNBRWFpQUJJQVJySUFNb0Fnd1JBZ0FOQVNBQ1FTSWdEUkVEQUNFTURBRUxJQUFnQVNBR0lBVkJ3UG5BQUJDRENRQUxJQWRCRUdva0FDQU1DOXNIQWdkL0FuNGpBRUhRQW1zaUFpUUFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQVFRZ2dBU2tEQUNJSlFnbDlJZ3FuSUFwQ0Nsb2JRUUZyRGdrQkFnTUVCUVlIQ0FrQUN5QUFRZ2szQXdBTUNRc2dBRUlLTndNQURBZ0xJQUJDQ3pjREFBd0hDeUFBUWd3M0F3QU1CZ3NnQUVJTk53TUFEQVVMSUFCQkNHb2dBVUVJYWhDRUFpQUFRZzQzQXdBTUJBc2dBRUVJYWlBQlFRaHFFSkFESUFCQ0R6Y0RBQXdEQ3lBQVFRaHFJQUZCQ0dvUThRRWdBRUlRTndNQURBSUxJQUpCakFGcUlBRW9BbXdnQVNnQ2NCRC9CQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQkJBeUFKUWdKOUlnbW5JQWxDQjFvYlFRRnJEZ1lCQWdNRUJRWUFDeUFDUWdJM0E1Z0JEQVlMSUFKQ0F6Y0RtQUVNQlFzZ0FrSUVOd09ZQVF3RUN5QUNRWmdCYWlBQkVJUUNEQU1MSUFKQm9BRnFJQUZCQ0dvUWtBTWdBa0lHTndPWUFRd0NDeUFDUWFBQmFpQUJRUWhxRVBFQklBSkNCemNEbUFFTUFRc2dBa0dnQVdvZ0FTZ0NEQ0FCS0FJUUVJd0ZJQUpDQ0RjRG1BRUxJQUpCRUdwQkNFSFFBQkNFQ0NBQ0tBSVFJZ1JGRFFJQ1FBSkFBa0FDUUFKQUlBRW9BblFpQVNnQ0NDSURRZi8vLy84SGEwRUFJQU5CZzRDQWdIaElHMEVCYXc0REFRSURBQXNnQWtHSUFtb2dBVUVNYWlnQ0FDQUJRUkJxS0FJQUVQZ0VJQUpCbEFKcUlBRkJHR29vQWdBZ0FVRWNhaWdDQUJENEJDQUNRYUFDYWlBQlFTUnFLQUlBSUFGQktHb29BZ0FRakFVZ0FVRXdhaWdDQUNFR0lBSkJDR29nQVVFMGFpZ0NBQ0lEUVFoQkNFR1UxdElBRUpvRklBSW9BZ2doQnlBQ0tBSU1JUVVnQTBFRGRDSUlCRUFnQlNBR0lBajhDZ0FBQ3lBQ0lBTTJBclFDSUFJZ0JUWUNzQUlnQWlBSE5nS3NBaUFCS1FNQUlRa2dBa0c0QW1vZ0FVRThhaWdDQUNBQlFVQnJLQUlBRVBnRUlBSkJ4QUpxSUFGQnlBQnFLQUlBSUFGQnpBQnFLQUlBRVBnRUlBSWdDVGNEZ0FJTUF3c2dBa0VnYWlJRElBRkJHR29RMXdjZ0FrRXNhaUFCUVNScUVOY0hJQUpCbUFKcUlBTXBBd0EzQXdBZ0FrR2dBbW9nQWtFb2Fpa0RBRGNEQUNBQ1FhZ0NhaUFDUVRCcUtRTUFOd01BSUFJZ0FTc0RFRGtER0NBQ1FZQ0FnSUI0TmdLSUFpQUNJQUlwQXhnM0E1QUNEQUlMSUFKQmdZQ0FnSGcyQW9nQ0RBRUxJQUpCakFKcUlBRkJFR29vQWdBZ0FVRVVhaWdDQUJDTUJTQUNRWUtBZ0lCNE5nS0lBZ3NnQkNBQ1FZQUNha0hRQVB3S0FBQWdBa0dJQVdvZ0FrR1VBV29vQWdBMkFnQWdBaUFDS1FLTUFUY0RnQUVnQWtFWWFpSUJJQUpCbUFGcVFlZ0EvQW9BQUNBQUlBRkI5QUQ4Q2dBQUlBQWdCRFlDZEF3QkN5QUFRUWhxSUFFb0Fnd2dBU2dDRUJDTUJTQUFRaEkzQXdBTElBSkIwQUpxSkFBUEN3QUw3Z1lCQlg4Q1FBSkFBa0FDUUFKQUlBQkJCR3NpQlNnQ0FDSUhRWGh4SWdSQkJFRUlJQWRCQTNFaUJoc2dBV3BQQkVBZ0JrRUFJQUZCSjJvaUNDQUVTUnNOQVFKQUFrQWdBa0VKVHdSQUlBSWdBeEN3QVNJQ0RRRkJBQThMUVFBaEFpQURRY3ovZTBzTkFVRVFJQU5CQzJwQmVIRWdBMEVMU1JzaEFRSkFJQVpGQkVBZ0FVR0FBa2tnQkNBQlFRUnlTWElnQkNBQmEwR0JnQWhQY2cwQkRBa0xJQUJCQ0dzaUJpQUVhaUVJQWtBQ1FBSkFBa0FnQVNBRVN3UkFJQWhCd04vYUFDZ0NBRVlOQkNBSVFiemYyZ0FvQWdCR0RRSWdDQ2dDQkNJSFFRSnhEUVVnQjBGNGNTSUhJQVJxSWdRZ0FVa05CU0FJSUFjUXlnRWdCQ0FCYXlJQ1FSQkpEUUVnQlNBQklBVW9BZ0JCQVhGeVFRSnlOZ0lBSUFFZ0Jtb2lBU0FDUVFOeU5nSUVJQVFnQm1vaUF5QURLQUlFUVFGeU5nSUVJQUVnQWhDZEFRd05DeUFFSUFGcklnSkJEMHNOQWd3TUN5QUZJQVFnQlNnQ0FFRUJjWEpCQW5JMkFnQWdCQ0FHYWlJQklBRW9BZ1JCQVhJMkFnUU1Dd3RCdE4vYUFDZ0NBQ0FFYWlJRUlBRkpEUUlDUUNBRUlBRnJJZ05CRDAwRVFDQUZJQWRCQVhFZ0JISkJBbkkyQWdBZ0JDQUdhaUlCSUFFb0FnUkJBWEkyQWdSQkFDRURRUUFoQVF3QkN5QUZJQUVnQjBFQmNYSkJBbkkyQWdBZ0FTQUdhaUlCSUFOQkFYSTJBZ1FnQkNBR2FpSUNJQU0yQWdBZ0FpQUNLQUlFUVg1eE5nSUVDMEc4MzlvQUlBRTJBZ0JCdE4vYUFDQUROZ0lBREFvTElBVWdBU0FIUVFGeGNrRUNjallDQUNBQklBWnFJZ0VnQWtFRGNqWUNCQ0FJSUFnb0FnUkJBWEkyQWdRZ0FTQUNFSjBCREFrTFFiamYyZ0FvQWdBZ0JHb2lCQ0FCU3cwSEN5QURFQllpQVVVTkFTQURRWHhCZUNBRktBSUFJZ0pCQTNFYklBSkJlSEZxSWdJZ0FpQURTeHNpQWdSQUlBRWdBQ0FDL0FvQUFBc2dBQkJwSUFFUEN5QURJQUVnQVNBRFN4c2lBd1JBSUFJZ0FDQUQvQW9BQUFzZ0JTZ0NBQ0lEUVhoeElnVWdBVUVFUVFnZ0EwRURjU0lCRzJwSkRRTWdBVUVBSUFVZ0NFc2JEUVFnQUJCcEN5QUNEd3RCblkzU0FFRXVRY3lOMGdBUW5BWUFDMEhjamRJQVFTNUJqSTdTQUJDY0JnQUxRWjJOMGdCQkxrSE1qZElBRUp3R0FBdEIzSTNTQUVFdVFZeU8wZ0FRbkFZQUN5QUZJQUVnQjBFQmNYSkJBbkkyQWdBZ0FTQUdhaUlDSUFRZ0FXc2lBVUVCY2pZQ0JFRzQzOW9BSUFFMkFnQkJ3Ti9hQUNBQ05nSUFJQUFQQ3lBQUM1WUhBZ3gvQkg0akFFR0FBbXNpQkNRQUlBUkJDR29nQVNnQ0FDQUNJQU1nQVNnQ0JDZ0NGQkVBQUFKQUFrQWdCQ2dDQ0VFRlJ3UkFJQUFnQkNrQ0NEY0NCQ0FBUVFBMkFnQWdBRUVVYWlBRVFSaHFLUUlBTndJQUlBQkJER29nQkVFUWFpa0NBRGNDQUF3QkN5QUVLQUlRSVFJZ0JDZ0NEQ0FFS0FJVUlBUkJNR29RMVFRZ0JFRW9haUlJUWZqUDBnQXBBd0EzQXdBZ0JFSHd6OUlBS1FNQU53TWdRVGhzSVFFZ0JDa0RPQ0VRSUFRcEF6QWhFU0FFUWRBQmFpRUtJQVJCUUdzaEN5QUVRZEFBYWlFTUlBSWhBd05BSUFFRVFFRUFSUVJBSUF3Z0EwRTQvQW9BQUFzZ0JFRTRhaUlPSUFncEF3QTNBd0FnQkNBUU53TklJQVFnRVRjRFFDQUVJQVFwQXlBM0F6QkJBQ0lHUlFSQUlBUkJpQUZxSUFOQkVHcEJLUHdLQUFBTElBUkJ3QUZxSUFRb0FsUWdCQ2dDV0NJRkVHY0NRQ0FFS0FMQUFVVUVRQ0FFS1FOUUlSSWdCYTBoRXd3QkN5QUVLUUpVSVJJZ0JDa0N4QUVoRXlBRUtBSlFJZ1ZCZ0lDQWdIaEhEUVFMSUFRZ0U2Y2lCVFlDdUFFZ0JDQVNOd093QVNBUklCQWdFa0lnaUtjZ0JSRGVBeUVRSUFRZ0JFR3dBV28yQXZ3QklBUW9BamhGQkVBZ0JFRXdhaUFMRUtjQkN5QUVJQVJCTUdvMkFzUUJJQVFnQkVIOEFXbzJBc0FCSUFRZ0JDZ0NNQ0FFS0FJMElCQWdCRUhBQVdwQkZoQ09BaUFFS0FJRUlRVWdCQ2dDTUNFSEFrQWdCQ2dDQUVFQmNRUkFJQVJCeUFGcUlBUkJ1QUZxS0FJQU5nSUFJQVFnQkNrRHNBRTNBOEFCSUFaRkJFQWdDaUFFUVlnQmFrRW8vQW9BQUFzZ0JTQUhhaUlHTFFBQUlROGdCaUFRcDBFWmRpSUdPZ0FBSUFjZ0JDZ0NOQ0FGUVFocmNXcEJDR29nQmpvQUFDQUVJQVFvQWp4QkFXbzJBandnQkNBRUtBSTRJQTlCQVhGck5nSTRJQTBOQVNBSElBVkJTR3hxUVRocklBUkJ3QUZxUVRqOENnQUFEQUVMSUFjZ0JVRkliR3BCS0dzaEJTQUdSUVJBSUFSQndBRnFJQVZCS1B3S0FBQUxJQVpGQkVBZ0JTQUVRWWdCYWtFby9Bb0FBQXNnQkNnQ3NBRWdCQ2dDdEFFUXJna2dCQzBBd0FGQkNFWU5BQ0FFUWNBQmFoRE9CQXNnQTBFNGFpRURJQWdnRGlrREFEY0RBQ0FFSUFRcEF6QTNBeUFnQVVFNGF5RUJJQVFwQTBBaEVTQUVLUU5JSVJBTUFRc0xJQUFnQkNrRElEY0RBQ0FBSUJBM0F4Z2dBQ0FSTndNUUlBQkJDR29nQkVFb2Fpa0RBRGNEQUNBQ0VLMEpDeUFFUVlBQ2FpUUFEd3NnQkNBVE53TE1BU0FFSUJJM0FzUUJJQVFnQlRZQ3dBRkJnTS9TQUVFcklBUkJ3QUZxUWRTWHdBQkJ5SmpBQUJDTUJBQUwrZ1lDRG44RWZpTUFRZUFCYXlJRUpBQWdCRUVRYWlBQktBSUFJQUlnQXlBQktBSUVLQUlVRVFBQUFrQUNRQ0FFS0FJUVFRVkhCRUFnQUNBRUtRSVFOd0lFSUFCQkFEWUNBQ0FBUVJScUlBUkJJR29wQWdBM0FnQWdBRUVNYWlBRVFSaHFLUUlBTndJQURBRUxJQVFvQWhnaEJpQUVLQUlVSUFRb0Fod2dCRUU0YWhEVkJDQUVRVEJxSWdkQitNL1NBQ2tEQURjREFDQUVRZkRQMGdBcEF3QTNBeWhCT0d3aENpQUVLUU5BSVJJZ0JDa0RPQ0VUSUFSQnNBRnFJUXNnQkVISUFHb2hEQ0FFUWVnQWFpRUlJQVJCMkFCcUlRMUJBQ0VCQTBBZ0FTQUtSd1JBUVFCRkJFQWdEU0FCSUFacVFUajhDZ0FBQ3lBRVFVQnJJZzhnQnlrREFEY0RBQ0FFSUJJM0ExQWdCQ0FUTndOSUlBUWdCQ2tES0RjRE9DQUVRYUFCYWlBRUtBSmNJQVFvQW1BaUFoQm5Ba0FnQkNnQ29BRkZCRUFnQkNrRFdDRVVJQUt0SVJVTUFRc2dCQ2tDWENFVUlBUXBBcVFCSVJVZ0JDZ0NXQ0lDUVlDQWdJQjRSdzBFQ3lBRUlCV25JZ0kyQXBnQklBUWdGRGNEa0FFZ0V5QVNJQlJDSUlpbklBSVEzZ01oRWlBRUlBUkJrQUZxTmdMY0FTQUVLQUpBUlFSQUlBUkJPR29nREJDbkFRc2dCQ0FFUVRocU5nS2tBU0FFSUFSQjNBRnFOZ0tnQVNBRVFRaHFJQVFvQWpnZ0JDZ0NQQ0FTSUFSQm9BRnFJaEJCRmhDT0FpQUVLQUlNSVFJZ0JDZ0NPQ0VEQWtBZ0JDZ0NDRUVCY1FSQUlBUkJxQUZxSUFSQm1BRnFLQUlBTmdJQUlBUWdCQ2tEa0FFM0E2QUJJQXNnQ0VFby9Bb0FBQ0FDSUFOcUlnVXRBQUFoRVNBRklCS25RUmwySWdVNkFBQWdBeUFFS0FJOElBSkJDR3R4YWtFSWFpQUZPZ0FBSUFRZ0JDZ0NSRUVCYWpZQ1JDQUVJQVFvQWtBZ0VVRUJjV3MyQWtBZ0RnMEJJQU1nQWtGSWJHcEJPR3NnRUVFNC9Bb0FBQXdCQ3lBRElBSkJTR3hxUVNocklRSkJBQ0lEUlFSQUlBUkJvQUZxSUFKQktQd0tBQUFMSUFORkJFQWdBaUFJUVNqOENnQUFDeUFFS0FLUUFTQUVLQUtVQVJDdUNTQUVMUUNnQVVFSlJnMEFJQVJCb0FGcUVNMEVDeUFISUE4cEF3QTNBd0FnQkNBRUtRTTROd01vSUFGQk9Hb2hBU0FFS1FOSUlSTWdCQ2tEVUNFU0RBRUxDeUFBSUFRcEF5ZzNBd0FnQUNBU053TVlJQUFnRXpjREVDQUFRUWhxSUFSQk1Hb3BBd0EzQXdBZ0JoQ3RDUXNnQkVIZ0FXb2tBQThMSUFRZ0ZUY0NyQUVnQkNBVU53S2tBU0FFSUFJMkFxQUJRWURQMGdCQkt5QUVRYUFCYWtId3p0SUFRZFRQMGdBUWpBUUFDNnNHQWdoL0FuNGpBRUdRQVdzaUJDUUFJQUlnQXlnQ0RCRUdBQ0VLSUFSQjFBQnFJQUVvQWdBZ0FpQURJQUVvQWdRb0FoUVJBQUFDUUNBRUtBSlVRUVZIQkVBZ0FDQUVLUUpVTndJQUlBQkJFR29nQkVIa0FHb3BBZ0EzQWdBZ0FFRUlhaUFFUWR3QWFpa0NBRGNDQUF3QkMwRUJJUVlnQkNnQ1hDRUlJQVFvQWxnQ1FBSkFBa0FDUUNBRUtBSmdJZ2tPQWdNQUFRdEJBU0VISUFndEFBQWlBVUVyYXc0REFnRUNBUXNnQ0MwQUFDRUJDd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FCUWY4QmNVRXJhdzREQUFJQkFnc2dDVUVCYXlFQklBaEJBV29oQlNBSlFSQkxEUUlNQmdzZ0NVRUJheUVCSUFoQkFXb2hCU0FKUVJGSkRRSURRQ0FCUlEwRklBUkJNR29nRENBTVFqK0hRZ29RaXdRZ0JFSElBR29nQlMwQUFFRUtFS1lHSUFRb0FraEJBWEZGRFFkQkF5RUhJQVFwQXpnZ0JDa0RNQ0lOUWorSFVnMElJQVZCQVdvaEJTQUJRUUZySVFFZ0JEVUNUQ0lNUWdCU0lBMGdESDBpRENBTlUzTkZEUUFMREFjTElBZ2hCU0FKSWdGQkVFa05CQXNNQVFzRFFDQUJSUVJBUVFBaEJrRUJJUWNNQmdzZ0JFRW9haUFGTFFBQVFRb1FwZ1pCQVNFSElBUW9BaWhCQVhFRVFDQUZRUUZxSVFVZ0FVRUJheUVCSUF4Q0NuNGdCRFVDTEgwaERBd0JCUXdHQ3dBTEFBc0RRQ0FCUlEwQklBUkJFR29nRENBTVFqK0hRZ29RaXdRZ0JFRWdhaUFGTFFBQVFRb1FwZ1lnQkNnQ0lFRUJjVVVOQTBFQ0lRY2dCQ2tER0NBRUtRTVFJZzFDUDRkU0RRUWdCVUVCYWlFRklBRkJBV3NoQVNBRU5RSWtJZ3hDQUZRZ0RDQU5mQ0lNSUExVGMwVU5BQXNNQXd0QkFDRUdEQUlMUVFFaEJ3TkFJQUZGQkVCQkFDRUdEQU1MSUFSQkNHb2dCUzBBQUVFS0VLWUdJQVFvQWdoQkFYRkZEUUVnQlVFQmFpRUZJQUZCQVdzaEFTQUVOUUlNSUF4Q0NuNThJUXdNQUFzQUMwRUJJUWNMSUFnUTlna2dBQUovSUFZRVFDQUVJQWM2QUc4Z0FpQUtJQU1vQWhnUkFRQWdCRUVCTmdKMElBUkIyTXpTQURZQ2NDQUVRZ0UzQW53Z0JFRWdOZ0tNQVNBRUlBUkJpQUZxTmdKNElBUWdCRUh2QUdvMkFvZ0JJQUJCQ0dvZ0JFSHdBR29RbmdNZ0FDQUtOZ0lFUVFJTUFRc2dBQ0FNTndNSVFRVUxOZ0lBQ3lBRVFaQUJhaVFBQzQ0SUFRSi9Ba0FDUUNBQVFZQWlhMEVUVHdSQUlBQkJnTmdDYXlJQ1FmLy9BM0ZCSEhBZ0FrR2oxd0JMSUFGQnFDTnJRUnBMY25JTkFTQUFJQUZxUWFjamF3OExJQUZCNFNKclFSVkpEUUVMQWtBZ0FDQUJja0dBZ0FSUEJFQkJnSURFQUNFQ0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQVFaN0NCV3NPQlFFU0VnSURBQXNDUUNBQVFlUGFCV3NPQndVU0VoSUdFZ2NBQ3dKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUJCbWFFRWF3NERBU0VDQUFzQ1FDQUFRYkdpQkdzT0FnUUZBQXNDUUNBQVFZS25CR3NPQXdjaENBQUxBa0FnQUVHNHF3UnJEZ0lORGdBTElBQkJxY0lGUmcwU0lBQkIyb3NFUndSQUlBQkJwYUVFUmcwRElBQkJ4NllFUmcwR0lBQkJpNmNFUmcwSklBQkJrS2NFUmcwS0lBQkJ3cWNFUmcwTElBQkJ1YWtFUmcwTUlBQkJ0YklFUmcwUElBQkIwb3NFUncwaFFjbUxCRUdBZ01RQUlBRkJod1pHR3c4TFFlU0xCRUdBZ01RQUlBRkJod1pHR3c4TFFacWhCRUdBZ01RQUlBRkJ1cUVFUmhzUEMwR2NvUVJCZ0lERUFDQUJRYnFoQkVZYkR3dEJxNkVFUVlDQXhBQWdBVUc2b1FSR0d3OExRYTZpQkVHQWdNUUFJQUZCcDZJRVJoc1BDMEd2b2dSQmdJREVBQ0FCUWFlaUJFWWJEd3RCeTZZRVFjeW1CRUdBZ01RQUlBRkIxNllFUmhzZ0FVRytwZ1JHR3c4TFFZT25CRUdBZ01RQUlBRkJ5YWNFUmhzUEMwR0Zwd1JCZ0lERUFDQUJRYnVuQkVZYkR3dEJqcWNFUVlDQXhBQWdBVUhDcHdSR0d3OExRWkduQkVHQWdNUUFJQUZCeWFjRVJoc1BDeUFCUWJpbkJFWU5DeUFCUWNLbkJFWU5EQ0FCUWNtbkJFY05GVUhJcHdRUEN5QUJRYnFwQkdzT0JBMFVGQTRNQzBHNnF3UkJnSURFQUNBQlFhK3JCRVliRHd0QnU2c0VRWUNBeEFBZ0FVR3Zxd1JHR3c4TFFiaXlCRUdBZ01RQUlBRkJzTElFUmhzUEN5QUJRWjdDQldzT0F3c01EUTRMUWFiQ0JVR293Z1ZCZ0lERUFDQUJRYURDQlVZYklBRkJuOElGUmhzUEMwR253Z1ZCZ0lERUFDQUJRWi9DQlVZYkR3dEJwTUlGUVlDQXhBQWdBVUdmd2dWR0d3OExRZW5hQlVHQWdNUUFJQUZCNTlvRlJoc1BDMEhvMmdWQmdJREVBQ0FCUWVmYUJVWWJEd3RCNnRvRlFZQ0F4QUFnQVVIbjJnVkdHdzhMUWNlbkJBOExRY1duQkE4TElBRkJzS2tFUncwSFFieXBCQThMUWJ1cEJBOExRYjZwQkE4TFFhSENCUThMUWFQQ0JROExRYVhDQlE4TElBRkJxY0lGUncwQlFhTENCUThMUVlDQXhBQWdBRUVRZENBQmNpSUFJQUJCcHJLRmlnTnNJZ0VnQUVHNTg5M3hlV3h6clVLZ0IzNUNJSWluUVFGMFFZQ1IxQUJxTHdFQWFrRzU4OTN4ZVd3Z0FYT3RRcUFIZmtJZ2lLZEJBM1FpQVVIRW45UUFhaWdDQUNBQUlBRkJ3Si9VQUdvb0FnQkhHeUVDQ3lBQ0R3c2dBRUhNQkd3Z0FVRWNiR3BCbkkyaEFXc0xqQWNCQlg4akFFR3dFR3NpQXlRQUFrQUNRQUpBQWtBQ1FDQUNRUTlyRGdNQ0FBRURDeUFCTFFBQVFjMEFSdzBDSUFFdEFBRkI0UUJIRFFJZ0FTMEFBa0hqQUVjTkFpQUJMUUFEUWRJQVJ3MENJQUV0QUFSQjd3QkhEUUlnQVMwQUJVSHRBRWNOQWlBQkxRQUdRZUVBUncwQ0lBRXRBQWRCN2dCSERRSWdBUzBBQ0VIRkFFY05BaUFCTFFBSlFlNEFSdzBDSUFFdEFBcEI0d0JIRFFJZ0FTMEFDMEh2QUVjTkFpQUJMUUFNUWVRQVJ3MENJQUV0QUExQjZRQkhEUUlnQVMwQURrSHVBRWNOQWlBQkxRQVBRZWNBUncwQ0lBTkJIR3BCNUk3S0FFR0FFUHdLQUFBTUF3c2dBUzBBQUVITkFFY05BU0FCTFFBQlFlRUFSdzBCSUFFdEFBSkI0d0JIRFFFZ0FTMEFBMEhGQUVjTkFTQUJMUUFFUWZnQVJ3MEJJQUV0QUFWQjhBQkhEUUVnQVMwQUJrSGxBRWNOQVNBQkxRQUhRZklBUncwQklBRXRBQWhCOUFCSERRRWdBUzBBQ1VIRkFFY05BU0FCTFFBS1FlNEFSdzBCSUFFdEFBdEI0d0JIRFFFZ0FTMEFERUh2QUVjTkFTQUJMUUFOUWVRQVJ3MEJJQUV0QUE1QjZRQkhEUUVnQVMwQUQwSHVBRWNOQVNBQkxRQVFRZWNBUncwQklBTkJIR3BCNUo3S0FFR0FFUHdLQUFBTUFnc2dBUzBBQUVIWEFFY05BQ0FCTFFBQlFla0FSdzBBSUFFdEFBSkI3Z0JIRFFBZ0FTMEFBMEhCQUVjTkFDQUJMUUFFUWU0QVJ3MEFJQUV0QUFWQjh3QkhEUUFnQVMwQUJrSHBBRWNOQUNBQkxRQUhRY1VBUncwQUlBRXRBQWhCN2dCSERRQWdBUzBBQ1VIakFFY05BQ0FCTFFBS1FlOEFSdzBBSUFFdEFBdEI1QUJIRFFBZ0FTMEFERUhwQUVjTkFDQUJMUUFOUWU0QVJ3MEFJQUV0QUE1QjV3QkhEUUFnQTBFY2FrSGtyc29BUVlBUS9Bb0FBQXdCQ3lBRFFhUVFhaUlBSUFFZ0FoQ1JBU0FEUVNNMkFxQVFJQU5CQVRZQ0lDQURRZmkreWdBMkFod2dBMElCTndJb0lBTWdBRFlDbkJBZ0F5QURRWndRYWpZQ0pDQURRUnhxUVlDL3lnQVFxd2NBQ3lBRFFSQnFRWUFDUVFKQkFrSDQrTTBBRUpvRlFRQWhBU0FEUVFBMkFxd1FJQU1nQXlrREVEY0NwQkFnQTBHa0VHb1ExZ2NnQXlnQ3FCQWdBeWdDckJBaUJFRUJkR29oQWdKQUEwQWdBaUFEUVJ4cUlBRnFJZ1lvQWdBaUJ3Ui9JQU5CQ0dvZ0J5QUdRUVJxS0FJQUVBa2dBeThCQ0VFQmNVVU5BaUFETHdFS0JTQUZDenNCQUNBQ1FRSnFJUUlnQkVFQmFpRUVJQUZCQ0dvaUFVR0FFRWNOQUFzZ0FDQURLUUtrRURjQ0FDQUFRUWhxSUFRMkFnQWdBMEd3RUdva0FBOExRYWo5elFBUXV3a0FDN29HQVFkL0l3QkIwQU5ySWdJa0FDQUNRZkFBYWlJRFFRQkI0QUw4Q3dBZ0FrSG9BR29nQTBIWUFFRzhtY0FBRUtnR0lBSW9BbWdnQWlnQ2JDQUJJQUVRZTBGc0lRaEJFQ0VCQWtBQ1FBTkFJQVJCQ2tZRVFFRUlJUUVEUUNBQlFjZ0FSa1VFUUNBQ1FTaHFJQUpCOEFCcUlnTWdBU0FCUVFocUlnUkI3Sm5BQUJDcEJpQUNLQUlvSUFJb0Fpd1F0Z1FnQWtFZ2FpQURJQVFnQVVFUWFpSUVRZnlad0FBUXFRWWdBaWdDSUNBQ0tBSWtFS29GSUFKQkdHb2dBeUFFSUFGQkdHcEJqSnJBQUJDcEJpQUNLQUlZSUFJb0Fod1F0d1FnQVVFZ2FpRUJEQUVMQ3lBQ1FSQnFJQUpCOEFCcVFjZ0FRZEFBUWN5WndBQVFxUVlnQWlnQ0VDQUNLQUlVRUxZRVFSQWhBUU5BSUFGQjRBQkdSUVJBSUFKQkNHb2dBa0h3QUdvZ0FVRUlheUFCUWR5WndBQVFxUVlnQWlnQ0NDQUNLQUlNRVBFRElBRkJDR29oQVF3QkN3c2dBQ0FDUWZBQWFrSGdBdndLQUFBZ0FrSFFBMm9rQUE4TElBSkI4QUJxSWdkQjJBQWdBVUVRYXhENUF5QUNRZUFBYWlBSElBRkJDR3NpQmlBQlFaeWF3QUFRcVFZZ0FpZ0NZQ0FDS0FKa0VGMGdBa0hZQUdvZ0J5QUdJQUZCckpyQUFCQ3BCaUFDS0FKWUlBSW9BbHdROFFNQ1FBSi9JQVJCQ0U4RVFDQUNRZEFBYWlBSElBWWdBVUc4bXNBQUVLa0dJQVJCQ0dzaUF5QUNLQUpVSWdWUERRSWdBaWdDVUNBSWFrRU1heUlESUFNb0FnQkJnSUFEY3pZQ0FDQUNRY2dBYWlBSElBWWdBVUhNbXNBQUVLa0dJQVJCQjJzaUF5QUNLQUpNSWdWUERRVWdBaWdDU0NBSWFrRUlheUlESUFNb0FnQkJnSUFEY3pZQ0FDQUNRVUJySUFjZ0JpQUJRZHlhd0FBUXFRWWdCRUVGYXlJRElBSW9Ba1FpQlU4TkJTQUNLQUpBSUFocUlnTWdBeWdDQUVHQWdBTnpOZ0lBSUFKQk9Hb2dCeUFHSUFGQjdKckFBQkNwQmlBRVFRUnJJZ01nQWlnQ1BDSUZTUVJBSUFJb0FqZ01BZ3NNQlFzZ0FrRXdhaUFDUWZBQWFpQUdJQUZCL0pyQUFCQ3BCaUFFSUFJb0FqUWlBMDhOQXlBRUlRTWdBaWdDTUFzZ0EwRUNkR29pQXlBREtBSUFRWUNBQTNNMkFnQWdBa0h3QUdwQjJBQWdCa0VJUVE0UTZ3SWdCRUVCYWlFRUlBRkJDR29oQVNBSVFRUnFJUWdNQVFzTERBRUxJQVFnQTBITW9jQUFFTVlFQUFzZ0F5QUZRY3lod0FBUXhnUUFDOWtGQVJwL0FrQUNRQUpBQWtBQ1FBSkFBa0FnQVFSQUlBRkJBVVlOQVNBQlFRSk5EUUlnQVVFRFJnMERJQUZCQkUwTkJDQUJRUVZHRFFVZ0FVRUdUUTBHSUFGQkIwY05CMEVIUVFkQnZKL0FBQkRHQkFBTFFRQkJBRUhNbnNBQUVNWUVBQXRCQVVFQlFkeWV3QUFReGdRQUMwRUNRUUpCN0o3QUFCREdCQUFMUVFOQkEwSDhuc0FBRU1ZRUFBdEJCRUVFUVl5ZndBQVF4Z1FBQzBFRlFRVkJuSi9BQUJER0JBQUxRUVpCQmtHc244QUFFTVlFQUFzZ0FDQUFLQUljSWdFZ0FDZ0NCQ0lGY3lJUElBQW9BaEFpQWlBQUtBSUlJZzF6SWhCekloRWdBQ2dDREhNaUNDQUFLQUlZSWdOeklnUWdBU0FDY3lJU2N5SUpJQU1nQUNnQ0ZITWlCbk1pQ2lBRklBWWdBQ2dDQUNJRmN5SURjeUlYSUFOeGN5QUtJQTl4SWc1eklBOXpJQWtnRW5FaUN5QUdJQWdnRFhNaUJuTWlDQ0FKY3lJVElCQnhjeUlIY3lJTUlBY2dCaUFSY1NJSElBUWdCU0FHY3lJWUlCY2dBU0FOY3lJTmN5SVVjWE56Y3lJVmNTSUVJQWdnRFhFZ0MzTWlGaUFDSUFOekloa2dCWEVnRFhNZ0NITWdCM056SWd0eklCWWdDaUFGSUFsekloWWdBU0FEY3lJYWNYTWdEbk1nQVhOeklnSWdESE54SWc0Z0JITWdBbkVpQnlBQ0lBUnpJZ0Z6SUFFZ0N5QVZjeUlFY1NBTGN5SUJjU0FFY3lJRUlBY2dESE1pRENBQ0lBNXpJZ0p6SWd0eklnNGdBU0FDY3lJSGN5SVZJQkJ4SUFjZ0VuRWlFSE1pRWlBTElCUnhjeUlVSUF3Z0VYRnpJaEVnQ2lBQklBUnpJZ3B4SWhzZ0F5QUVjWE1pQXlBVElCVnhjeUlUSUFjZ0NYRnpJZ2x6TmdJY0lBQWdDaUFQY1NJUElBWWdESEVpQ2lBQ0lBVnhjeUlHSUFnZ0RuRnpjeUFUY3lJSUlBRWdHbkZ6SWd3Z0RTQU9jU0FRY3lBSmMzTTJBaFFnQUNBTElCaHhJQXB6SUFOeklCRnpJZ1UyQWhBZ0FDQVVJQUlnR1hGeklBeHpOZ0lJSUFBZ0JpQUJJQlp4Y3lBYmN5SUJJQklnQkNBWGNYTnpJZ01nQ0hNMkFnUWdBQ0FESUE5ek5nSUFJQUFnQlNBSmN6WUNHQ0FBSUFFZ0JYTTJBZ3dMekE4RERYOERmZ0Y4SXdCQmtBRnJJZ0VrQUFKQUlBQW9BaFFpQkNBQUtBSUVJZ0pMRFFBZ0FFRUFPd0VZSUFFZ0FDZ0NBRFlDTkNBQklBS3RJQVN0UWlDR2hEY0NPQ0FBS0FJSUlRMGdBQ2dDRENFSkFrQUNRQU5BSUFFb0Fqd2dBU2dDT0U4TkFpQUJRVEJxSUFGQk5Hb1Fxd1pCQUNFRElBRXRBREJGRFFNZ0FTMEFNU0lFRUo4R0RRSUNmQUpBQWtBQ1FBSkFBa0FDUUFKQUlBUkJIR3NPQXdBQkFnTUxJQUVvQWp3aUJFRjlTdzBLSUFSQkFtb2lBaUFCS0FJNFN3MEtJQUVnQWpZQ1BDQUJLQUkwSUFScUx3QUFJZ1JCQ0hRZ0JFRUlkbkxCdHd3R0N5QUJLQUk4SWdSQmUwc05DU0FFUVFScUlnSWdBU2dDT0VzTkNTQUJJQUkyQWp3Z0FTZ0NOQ0FFYWlnQUFDSUVRUmgwSUFSQmdQNERjVUVJZEhJZ0JFRUlka0dBL2dOeElBUkJHSFp5Y3JjTUJRc2dBVUZBYTBFQVFjQUEvQXNBQTBBZ0FVRW9haUFCUVRScUVLc0dJQUV0QUNoRkRRY0NRQ0FCTFFBcElnUkJCSFlpQWtFUFJnMEFJQUZCSUdvZ0FpQURJQUZCUUdzaUFoQ2lBaUFCS0FJZ1FRRnhSUTBJSUFFb0FpUWhBeUFFUVE5eElnUkJEMFlOQUNBQlFSaHFJQVFnQXlBQ0VLSUNJQUVvQWh3aEF5QUJLQUlZUVFGeERRRU1DQXNMSUFOQndRQlBEUUVnQVVHQUFXb2lCQ0FCUVVCcklBTVFaeUFCS0FLQUFRMEdJQUVvQW9RQklRVWdBU2dDaUFFaEFpTUFRYkFHYXlJREpBQUNRQ0FDUlFSQUlBUkJBVHNCQUF3QkN3SkFBa0FDUUFKQUFrQWdCUzBBQUNJS1FTdHJEZ01BQVFBQkN5QUNRUUZySWdKRkRRRWdCVUVCYWlFRkN5QURRU0JxSUFVZ0FoQThBa0FDZkFKQUlBTXRBREVpQjBFQ1J3UkFJQWRCQVhFZ0F5a0RJQ0lPUWlaOVFrUlVJQU1wQXlnaUQwS0FnSUNBZ0lDQUVGWnljZzBESUE1Q0ZsY0VRQ0FPcHlFQ0lBKzZJUkVnRGtJQVV3MENJQUpCQTNSQmdOekFBR29yQXdBZ0VhSU1Bd3NnQXlBUFFnQWdEcWRCQTNSQnNNekFBR29wQXdBUWl3UWdBeWtEQ0VJQVVnMERJQU1wQXdBaUVFS0FnSUNBZ0lDQUVGWU5BeUFRdWtTUzFVMEd6L0NBUktJTUFnc0NRQ0FFQW53Q1FBSkFJQUpCQTJzT0JnRURBd01EQUFNTElBVXBBQUJDMzcvLy92Mzc5KzlmZzBMSm5Kbks1S21TcXRrQVVnMENSQUFBQUFBQUFQQi9EQUVMUkFBQUFBQUFBUEIvSUFVekFBQWdCVEVBQWtJUWhvUkMzNy8vQm9NaURrTEpuSmtDVVEwQUdpQU9RczZDdVFKU0RRRkVBQUFBQUFBQStIOExJaEdhSUJFZ0NrRXRSaHM1QXdnZ0JFRUFPZ0FBREFjTElBUkJBVG9BQVNBRVFRRTZBQUFNQmdzZ0VVR0EzTUFBSUFKQkEzUnJLd01Bb3dzaEVTQUVRUUE2QUFBZ0JDQVJtaUFSSUFwQkxVWWJPUU1JREFRTElBTkJFR29nRGlBUEVLRUJBa0FnQjBFQmNTQURLQUlZSWdkQkFFNXhSUVJBSUFkQkFFZ05BU0FES1FNUUlROE1CQXNnQTBFZ2FpQU9JQTlDQVh3UW9RRWdBeWtERUNJUElBTXBBeUJTRFFBZ0J5QURLQUlvUmcwREN5QURRU0JxSUFVZ0FoQTJRUUFoQjBJQUlROGdBeWdDSUVVTkFpQURLQUlrSWdKQnZIMUlEUUpCL3c4aEJ5QUNRYlVDU2cwQ0lBSkJBRXdFUUVFQUlRVU1BZ3RCQUNFRkEwQkJQQ0VHSUFKQkUwa0VRQ0FDUWF6YndBQnFMUUFBSVFZTElBTkJJR29nQmhCL0lBTW9BaVFpQWtHQWNFb0VRQ0FGSUFacUlRVWdBa0VBVEEwRERBRUxDMEVBSVFjTUFnc2dCRUdCQWpzQkFBd0NDeUFEUVNocUlRZ0RRQUpBSUFOQklHb0NmeUFDUlFSQUlBZ3RBQUFpQWtFRVN3MENRUUpCQVNBQ1FRSkpHd3dCQzBFOFFRQWdBbXNpQWtFVFR3MEFHaUFDUWF6YndBQnFMUUFBQ3lJR0VJY0JJQU1vQWlRaUFrSC9EMG9OQWlBRklBWnJJUVVnQWtFQVRBMEJDd3NnQlVFQmF5SUNRWUY0VEFSQUEwQWdBMEVnYWtFOFFZSjRJQUpySWdVZ0JVRThUeHNpQlJCL0lBSWdCV29pQWtHQ2VFa05BQXNMSUFKQi93ZHFRZjRQU2cwQUlBTkJJR3BCTlJDSEFRSkFBa0FDUUFKQUlBTW9BaUFpQzBVTkFDQURLQUlrSWdaQkFFZ05BQ0FHUVJKTERRSWdCa1VFUUVJQUlRNE1BZ3RCQUNFRlFnQWhEZ05BSUE1Q0NuNGhEaUFGSUF0SkJFQWdEaUFGSUFocU1RQUFmQ0VPQ3lBRlFRRnFJZ1VnQmtjTkFBc01BUXNnQWtIK0Iyb2hCd3dEQ3dKQUlBWWdDMDhOQUFKQUlBWWdDR29pQlMwQUFDSUlRUVZISUFaQkFXb2dDMGR5UlFSQUlBTXRBS2dHRFFFZ0JrVU5BaUFGUVFGckxRQUFRUUZ4RFFFTUFnc2dDRUVFVFEwQkN5QU9RZ0Y4SVE0TElBNUNnSUNBZ0lDQWdCQlVEUUVMSUFOQklHb2lCVUVCRUg4Z0JSRGdBaUVPSUFKQmdBaHFRZjRQU2cwQklBSkJBV29oQWdzZ0RrTC8vLy8vLy8vL0I0TWhEMEgrQjBIL0J5QU9Rb0NBZ0lDQWdJQUlWQnNnQW1vaEJ3c2dCRUVBT2dBQUlBUWdCNjFDTklZZ0Q0Uy9JaEdhSUJFZ0NrRXRSaHM1QXdnTElBTkJzQVpxSkFBZ0FTMEFnQUZCQVVZTkJpQUJLd09JQVF3RUN5QUVRU0JyUWY4QmNVSFhBVWtOQVNBRVFRbHFRZjhCY1VFRVR3UkFJQVJCQldwQi93RnhRUVJQRFFnZ0FVRVFhaUFCUVRScUVLc0dJQUV0QUJCRkRRaEJsUFVESUFFdEFCRWdCRUVJZEhKcnR3d0VDeUFCUVFocUlBRkJOR29RcXdZZ0FTMEFDQTBDREFjTElBTkJ3QUJCOE1IQUFCQzRDUUFMSUFSQml3RnJ0d3dCQ3lBQkxRQUpJQVJCQ0hSeVFaVHRBMnU0Q3lFUklBeEIvLzhEY1NJRUlBbEpCRUJCQVNFRElBQWdERUVCYWlJTU93RVlJQTBnQkVFRGRHb2dFVGtEQUNBSklBeEIvLzhEY1VzTkFRd0VDd3NnQkNBSlFkREJ3QUFReGdRQUMwRUFJUU1NQVF0QkFTRURDeUFCUVpBQmFpUUFJQU1MaFFVQ0VYOEJmaU1BUVpBQmF5SUNKQUFnQVNnQ0JDRUxJQUpCQ0dvZ0FTZ0NDQ0lKUVFoQnlBQkIxSnZKQUJDYUJTQUpRY2dBYkNFTUlBSkIwUUJxSVEwZ0FrSFpBR29oRGlBQ1FZQUJhaUVQSUFKQjBBQnFJUkJCQUNFQklBSW9BZ3doQ2lBQ0tBSUlJaEVoQ0FOQUlBaEZJQUVnREVaeVJRUkFRUUloQlFKQUFrQUNRQUpBQWtBQ1FBSkFRUWdnQVNBTGFpSURLQUlBSWdkQkFtc2lFaUFTUVFwUEcwRUJhdzRKQlFVRkFBRUNBd1FGQmdzZ0FrSElBR29nQTBFSWFpZ0NBQ0FEUVF4cUtBSUFFSXdGSUFJcEFrd2hFeUFDS0FKSUlRUkJCaUVGREFVTElBSkJ5QUJxSUFOQkNHb29BZ0FnQTBFTWFpZ0NBQkNNQlNBRFFSQnFMUUFBSVFZZ0Fpa0NUQ0VUSUFJb0FrZ2hCRUVISVFVTUJBc2dBa0hJQUdvZ0EwRUVhaEJmSUFJcEFrd2hFeUFDS0FKSUlRUkJDQ0VGREFNTElBSkJ5QUJxSUFOQkNHb1FSU0FDTFFCUUlRWWdBaWtEU0NFVElBSkJFV29nRFVFbi9Bb0FBRUVKSVFVTUFnc2dFQ0FEUVFocUVFVWdEeUFEUVR4cUtBSUFJQU5CUUdzb0FnQVFqQVVnQWlBRFFjUUFhaTBBQURvQWpBRWdBMEVFYWlnQ0FDRUVJQU1vQWdBaEJTQUNLUU5RSVJNZ0FpMEFXQ0VHSUFKQkVXb2dEa0UzL0FvQUFBd0JDeUFEUVJCcUxRQUFJUVlnQTBFSWFpa0NBQ0VUSUFOQkJHb29BZ0FoQkNBQ1FSRnFJQU5CRVdwQk4vd0tBQUFnQnlFRkMwRUFJZ05GQkVBZ0FrSElBR29nQWtFUmFrRTMvQW9BQUFzZ0FTQUthaUlISUFVMkFnQWdCMEVRYWlBR09nQUFJQWRCQ0dvZ0V6Y0NBQ0FIUVFScUlBUTJBZ0FnQTBVRVFDQUhRUkZxSUFKQnlBQnFRVGY4Q2dBQUN5QUlRUUZySVFnZ0FVSElBR29oQVF3QkN3c2dBQ0FKTmdJSUlBQWdDallDQkNBQUlCRTJBZ0FnQWtHUUFXb2tBQXU5QmdJT2Z3RitJd0JCOEFCcklnSWtBQ0FCUVFocUlRa2dBU2dDRkNFR0lBSkI0UUJxSVFvZ0FrSE1BR29oQ3lBQ1FkZ0FhaUVPSUFFb0FnQWhBeUFCS0FJRUlRUWdBa0VZYWlFTUFrQUNRQUpBQWtBRFFDQUNJQVkyQWlnZ0FpQUVOZ0lZSUFJZ0F6WUNGQ0FDSUFFb0FoQTJBaVFnQWlBQktRSUlOd0ljSUFJZ0JEWUNXQ0FDUVFFZ0JDQUVRUUZMR3pZQ1ZDQUNRUUEyQWxBZ0FrR2R3Y29BTmdKTUlBSkJuTUhLQURZQ1NDQUNJQU1nQkdvMkFrUWdBaUFETmdKQUFrQUNRQUpBQWtBQ1FDQUNRVUJyRVBZRVFRRnhSU0FFUVFCSGNVVUVRQ0FDUVRocUlBeEJDR29vQWdBMkFnQWdBaUFNS1FJQU53TXdRVG9oQlF3QkN5QUNRVUJySUFKQkZHb2lBMEVCRU5BR0lBNGdBMEVCRUxZSElBSkJPR29nQzBFSWFpZ0NBRFlDQUNBQ1FTNXFJZzhnQ2tFQ2FpMEFBRG9BQUNBQ0lBc3BBZ0EzQXpBZ0FpQUtMd0FBT3dFc0lBSW9Ba2doQXlBQ0tBSkVJUWNnQWlnQ1FDSUZEUU5CT2lFRkFrQWdCMEVCYXc0Q0FRSUFDMEU1SVFVTElBSWdDRFlDRUNBQ0lCQTNBd2dNQVFzZ0FpZ0NXQ0VJSUFJb0Fsd2hCaUFDTFFCZ0lRVWdBa0UrYWlBUExRQUFPZ0FBSUFJZ0FpOEJMRHNCUENBQ0lBZzJBaEFnQWlBQ0tRSTBJaEEzQXdnZ0FpZ0NNQ0lOSVFjZ0JVRTdSZzBDQzBFQ0lBVkJPV3RCL3dGeElnUWdCRUVDVHh0QkFXc09BZ1FGQXdzZ0FpQUNLUU13SWhBM0Fnd2dBaUFETmdJSUlBTWhEU0FDS0FJNElnZ2hCaUFGSVFNTElBUWdCMGNFUUNBQklBYzJBZ1FnQVNBRE5nSUFJQWtnQWlrRENEY0NBQ0FCSUFZMkFoUWdDVUVJYWlBQ1FSQnFLQUlBTmdJQUlBY2hCQXdCQ3dzZ0FFRUlPZ0FjSUFCQkFUWUNBQ0FBSUFFcEFnQTNBZ1FnQUVFVWFpQUJRUkJxS1FJQU53SUFJQUJCREdvZ0FVRUlhaWtDQURjQ0FBd0RDeUFBSUFNMkFnUWdBRUVBTmdJQURBSUxJQUJCQXpZQ0FDQUFJQUVwQWdBM0FnUWdBRUVVYWlBQlFSQnFLUUlBTndJQUlBQkJER29nQVVFSWFpa0NBRGNDQUF3QkN5QUFJQTAyQWdnZ0FDQUROZ0lFSUFBZ0Fpa0RDRGNDRENBQUlBVTZBQndnQUNBR05nSVlJQUFnQWk4QlBEc0FIU0FBUVFJMkFnQWdBRUVVYWlBQ1FSQnFLQUlBTmdJQUlBQkJIMm9nQWtFK2FpMEFBRG9BQUFzZ0FrSHdBR29rQUF1SkJnRUpmeU1BUVpBSGF5SUJKQUFDUUFKQUlBTkJFRVlFUUNBQlFRaHFJQVZCY0hFaUNFRWdhaUlLUWRDbXlRQVFud1VnQVVFQU5nSWNJQUVnQVNrRENEY0NGQkQvQVNFRElBRkJLR29pQmtJQU53TUFJQUZDQURjRElDQURJQUZCSUdvaUJ4RGhDU0FCUVJScUlna2dCeUFCUVRCcUlnY1F5QVlnQ1NBRUlBVVFsd2tnQ1NBS0VJd0RJQUZCcUFOcUlBWXBBd0EzQXdBZ0FTQUJLUU1nTndPZ0F5QUJRYkFEYWlJR0lBSVFYQ0FCUVpBRGFpQUJRYUFEYWhDSEJTQUhJQVpCNEFMOENnQUFJQUVnQVNnQ0dDSUtJQUVvQWh4QjRLYkpBQkM1QmdKQUlBVWdBU2dDQkNJRVN3MEFJQUVvQWdBaEFpQUdJQWRCOEFMOENnQUFJQUZCK0FacVFnQTNBd0FnQVVJQU53UHdCaUFJUVJCcUlBUkxEUUFnQWlBSWFpRUlJQVZCRDNFaUJBUkFJQUZCOEFacUlBZ2dCUHdLQUFBTElBRkI4QVpxSUFRUTV3UWdBVUdvQm1vZ0FVSDRCbW9pQmlrREFEY0RBQ0FCSUFFcEEvQUdOd09nQmlBQklBZzJBcndHSUFFZ0JVRUVkaUlOTmdLNEJpQUJJQUkyQXJRR0lBRWdBallDc0FZZ0FVSGdCbW9oQ1NBQlFaQUdhaUVIUVFBaEJBTkFJQVFnRFVaRkJFQWdBVUhBQm1vZ0FpQUVRUVIwYWlJTUVJY0ZRUUFoQlFOQUlBVkJFRVpGQkVBZ0FVSEFCbW9nQldvaUN5QUxMUUFBSUFFZ0JXcEJrQVpxTFFBQWN6b0FBQ0FGUVFGcUlRVU1BUXNMSUFGQjBBWnFJZ1VnQVVIQUJtb2lDeENIQlNBSlFRaHFRZ0EzQUFBZ0NVSUFOd0FBSUFGQjhBWnFJZzRnQVVHd0Eyb2dCUkM3QVNBQlFjZ0dhaUlGSUFZcEFBQTNBd0FnQVNBQktRRHdCamNEd0FZZ0RpQUxFSWNGSUFkQkNHb2dCaWtBQURjQUFDQUhJQUVwQVBBR053QUFJQXhCQ0dvZ0JTa0RBRGNBQUNBTUlBRXBBOEFHTndBQUlBUkJBV29oQkF3QkN3c2dBa1VOQUNBQlFiQURhaUFCUWFBR2FpQUlFTVlDSUFFb0FyUUdEUUlnQVNnQ0dDRUtDeUFBUW9DQWdJRDRnc0FJTndJQUlBTVFrd2dnQVNnQ0ZDQUtFS2tKREFJTElBQkNnSUNBZ0xpQndBZzNBZ0FNQVFzZ0FDQUJLUUlVTndJQUlBQkJDR29nQVVFY2FpZ0NBRFlDQUNBREVKTUlDeUFCUVpBSGFpUUFDNE1HQWdsL0JYNGpBRUVRYXlJTEpBQUNRQUovQWtBQ1FBSkFJQUZRUlFSQUlBRkNnSUNBZ0lDQWdJQWdXZzBCUWFCL0lBSWdBWGtpRDZkcklnWnJ3VUhRQUd4QnNLY0Zha0hPRUcwaUFrSFJBRThOQWlBTElBSkJCSFFpQWtISTVNQUFhaWtEQUVJQUlBRWdENFlRaXdSQ0FVRkFJQVlnQWtIUTVNQUFhaThCQUdwcklnZEJQM0d0SWcrR0loRkNBWDBpRWlBTEtRTUlJQXNwQXdCQ1A0aDhJZ0dESWhCUVJRUkFJQUpCMHVUQUFHb3ZBUUFoQ0NBQklBK0lweUlHUVpET0FFOEVRQ0FHUWNDRVBVa05CU0FHUVlEQzF5OVBCRUJCQ0VFSklBWkJnSlRyM0FOSklnSWJJUWxCZ01MWEwwR0FsT3ZjQXlBQ0d3d0hDMEVHUVFjZ0JrR0FyZUlFU1NJQ0d5RUpRY0NFUFVHQXJlSUVJQUliREFZTElBWkI1QUJQQkVCQkFrRURJQVpCNkFkSklnSWJJUWxCNUFCQjZBY2dBaHNNQmd0QkNrRUJJQVpCQ1VzaUNSc01CUXNnQUVFQU5nSUFEQVVMUWQvZ3dBQkJIRUhzOE1BQUVKd0dBQXRCL1BEQUFFRWtRYUR4d0FBUW5BWUFDeUFDUWRFQVFZanZ3QUFReGdRQUMwRUVRUVVnQmtHZ2pRWkpJZ0liSVFsQmtNNEFRYUNOQmlBQ0d3c2hBZ0pBQWtBQ1FDQUpJQWhyUVFGcXdTSUlJQVhCSWdwS0JFQWdCMEgvL3dOeElRMGdDQ0FGYThFZ0JDQUlJQXBySUFSSkd5SUtRUUZySVE1QkFDRUhBMEFnQXlBSGFpQUdJQUp1SWd4Qk1HbzZBQUFnQmlBQ0lBeHNheUVHSUFjZ0RrWU5BeUFISUFsR0RRSWdCMEVCYWlFSElBSkJDa2tnQWtFS2JpRUNSUTBBQzBHdzhjQUFFT29HQUFzZ0FDQURJQVJCQUNBSUlBVWdBVUlLZ0NBQ3JTQVBoaUFSRUs4QkRBTUxJQWRCQVdvaEFpQU5RUUZyUVQ5eHJTRVRRZ0VoQVFOQUlBRWdFNGhRUlFSQUlBQkJBRFlDQUF3RUN5QUNJQVJHRFFJZ0FpQURhaUFRUWdwK0loQWdENGluUVRCcU9nQUFJQUZDQ240aEFTQVFJQktESVJBZ0NpQUNRUUZxSWdKSERRQUxJQUFnQXlBRUlBb2dDQ0FGSUJBZ0VTQUJFSzhCREFJTElBQWdBeUFFSUFvZ0NDQUZJQWF0SUErR0lCQjhJQUt0SUErR0lCRVFyd0VNQVFzZ0JDQUVRY0R4d0FBUXhnUUFDeUFMUVJCcUpBQUx3UVlDRUg4QmZpTUFRZkFBYXlJQ0pBQWdBa0VvYWlJSUlBRVFtd0lnQWlnQ1JDRUxJQUlvQWtBaEJTQUNLQUk4SVFZZ0FpZ0NNQ0VISUFJb0Fpd2hBUUpBSUFBQ2Z3SkFBbjRnQWlrQ05DSVNJQUlvQWlnaUEwRURSdzBBR2lBQ0lBVTJBbXdnQWlBR05nSm9JQUlnRWpjQ1lDQUNJQWMyQWx3Z0FpQUJOZ0pZSUFnZ0FrSFlBR29RcUFJZ0FpZ0NRQ0VGSUFJb0Fqd2hCaUFDS0FJd0lRY2dBaWdDTENFUklBSW9BaWdpQTBFRFJ3UkFJQUlvQWtRaEN5QVJJUUVnQWlrQ05Bd0JDeUFDS0FJNElRd2dBaWdDTkNFTklBSWdCVFlDYkNBQ0lBWTJBbWdnQWlBTU5nSmtJQUlnRFRZQ1lDQUNJQWMyQWx3Z0FpQVJOZ0pZSUFKQktHb2lCQ0FDUWRnQWFoQ0FBU0FDS0FKRUlRNGdBaWdDUUNFSklBSW9BandoRHlBQ0tBSTRJUkFnQWlnQ05DRUlJQUlvQWpBaEFTQUNLQUlzSVFNQ1FBSkFBa0FnQWlnQ0tDSUtCRUFnQkNBSklBNFFaMEVCSVFRZ0FpZ0NLRUVCUmcwSElBSW9BaXdnQWlnQ01FRUtFT1VCSWdsQkFYRkZEUUZCQUNFS0lCRWhBVUVCSVFNTUF3c2dBaWdDU0NFRUlBTWhDZ0pBSUFNT0JBTUFBQUlBQ3lBRFFRTkdEUUVnQkVHQWdIeHhJUW9nRUNFTklBOGhEQ0FKSVFZZ0NDRUhJQTRoQlF3Q0N5QUpRUkIySVFRZ0R5RU9JQkFoQ1NBSUlROGdBU0VRSUFNaENDQUtJUUVMSUFJZ0RqWUNKQ0FDSUFrMkFpQWdBaUFQTmdJY0lBSWdFRFlDR0NBQ0lBZzJBaFFnQWlBQk5nSVFJQUpCS0dvZ0FrRVFhaENvQWlBQ0tBSkFJUVVnQWlnQ1BDRUdJQUlvQWpnaERDQUNLQUkwSVEwZ0FpZ0NNQ0VISUFJb0Fpd2hBU0FDS0FJb0lnTkJBMFlOQWlBQ0tBSkVJZ1JCZ0lCOGNTRUtDeUFDSUF3MkFnUWdBaUFOTmdJQUlBb2dCRUgvL3dOeGNpRUxJQUlwQXdBTElSSWdBQ0FMT3dFZ0lBQWdCVFlDSENBQUlBWTJBaGdnQUNBU053SVFJQUFnQnpZQ0RDQUFJQUUyQWdnZ0FDQUROZ0lFSUFBZ0MwRVFkanNCSWtFQkRBRUxJQUlnQmpZQ0NDQUNJQXcyQWdRZ0Fpa0NCQ0VTSUFBZ0JEc0JJQ0FBSUFzMkFod2dBQ0FGTmdJWUlBQWdFamNDRUNBQUlBMDJBZ3dnQUNBSE5nSUlJQUFnQVRZQ0JFRUFDellDQUNBQ1FmQUFhaVFBRHdzZ0FpQUNLUUlzTndOWVFZRFAwZ0JCS3lBQ1FkZ0Fha0dJck1rQVFkQ3V5UUFRakFRQUM3MEdBZ2gvQTM0akFFSFFBV3NpQWlRQUlBSkI4QUJxSWdSQnN0SFNBRUVDSUFFUXZRSWdBaWdDaUFFaEJTQUNLQUtFQVNFQklBSW9Bb0FCSVFZZ0Fpa0NlQ0VLSUFJb0FuUWhCd0pBQWtBQ1FDQUNLQUp3SWdOQkEwY05BQ0FDSUFVMkFrUWdBaUFCTmdKQUlBSWdCallDUENBQ0lBbzNBalFnQWlBSE5nSXdJQVFnQWtFd2FoQ29BaUFDS0FLSUFTRUZJQUlvQW9RQklRRWdBaWdDZ0FFaEJpQUNLUUo0SVFvZ0FpZ0NkQ0VISUFJb0FuQWlBMEVEUncwQUlBSWdCVFlDTENBQ0lBRTJBaWdnQWlBR05nSWtJQUlnQ2pjQ0hDQUNJQWMyQWhnZ0JDQUNRUmhxRUQ0Z0FrSG9BR29pQkNBQ1Fmd0FhaWdDQURZQ0FDQUNJQUlwQW5RM0EyQWdBaWdDakFFaENDQUNLQUtJQVNFRklBSW9Bb1FCSVFFZ0FpZ0NnQUVoQmlBQ0tBSndJUU1nQWlnQ21BRWlDVUdBZ0lDQWVFWUVRQ0FDUVJCcUlBUW9BZ0EyQWdBZ0FpQUNLUU5nSWdvM0F3Z2dDcWNoQnlBQ0tRSU1JUW9NQWdzZ0Fpa0RrQUVoQ3lBQ1Fkd0FhaUFDUWJRQmFpZ0NBRFlDQUNBQ1FkUUFhaUFDUWF3QmFpa0NBRGNDQUNBQ1Fjd0FhaUFDUWFRQmFpa0NBRGNDQUNBQ1FjUUJhaUFFS0FJQU5nSUFJQUlnQWlrQ25BRTNBa1FnQWlBRE5nSzRBU0FDSUFJcEEyQTNBcndCSUFJZ0FUWUN6QUVnQWlBR05nTElBU0FDSUFrMkFrQWdBaUFMTndNNElBSWdDRFlDTkNBQ0lBVTJBakFnQWtId0FHcEJ0TkhTQUVFQ0lBSkJ1QUZxRUwwQ0lBSW9Bb2dCSVFRZ0FpZ0NoQUVoQVNBQ0tBS0FBU0VHSUFJcEFuZ2hDaUFDS0FKMElRY2dBaWdDY0NJRFFRTkhCRUFnQWlnQ2pBRWhDQ0FDUVRCcUVPb0hJQVFoQlF3Q0N5QUFJQUpCeEFCcUlnTXBBZ0EzQWl3Z0FFSEVBR29nQTBFWWFpZ0NBRFlDQUNBQVFUeHFJQU5CRUdvcEFnQTNBZ0FnQUVFMGFpQURRUWhxS1FJQU53SUFJQUlnQmpZQ0VDQUNJQW8zQXdnZ0Fpa0NEQ0VNSUFBZ0N6Y0RJQ0FBSUFnMkFod2dBQ0FGTmdJWUlBQWdCRFlDRkNBQUlBRTJBaEFnQUNBTU53TUlJQUFnQ2o0Q0JDQUFJQWMyQWdBTUFnc2dBaWdDakFFaENBc2dBQ0FJTmdJY0lBQWdCVFlDR0NBQUlBRTJBaFFnQUNBR05nSVFJQUFnQ2pjRENDQUFJQWMyQWdRZ0FDQUROZ0lBUVlDQWdJQjRJUWtMSUFBZ0NUWUNLQ0FDUWRBQmFpUUFDOWdFQVJ4L0lBQWdBQ2dDQ0NJQ0lBQW9BZ1FpQjNNaUR5QUFLQUljSWdRZ0FDZ0NFQ0lCY3lJUUlBQW9BaGdpQTNNaUdDQVFjWE1nQXlBRWN5SUlJQUFvQWd3aUJTQUFLQUlBSWdaeklnbHpJZ3B6SUFnZ0JpQUhjeUlMY3lJVklBRWdBM01pRGlBQ0lBQW9BaFFpQW5NaUVYTWlHWEVpRm5NZ0JTQVljeUlYSUFFZ0JYTWlBU0FQY3lJU2NTQUtJQkp6SUFGeElneHpJZzF6SWhNZ0RTQU9JQUVnQm5NaUduRWdBeUFIY3lJSElBSWdCWE56SWdZZ0FTQUxjeUlOY25OekloUnhJZ01nRENBSUlBcHhjeUlNSUFZZ0RYRWdDeUFPY3lJTElBSnpJaHNnQnlBSmN5SWNjWE1nQVhNZ0FuTnpJZ1Z6SUJNZ0ZpQUxJQVFnRVhNaUZuRWdDWE56SUF4eklnSnpJZ2x4SUFKeklnY2dCU0FVY3lJTUlBSWdBM054SUFWeklnUnpJaEVnQVhFZ0JDQUxjU0lMY3lBRUlBd2dBaUFVY1VGL2MzRWdBM01pQVhNaUFpQVZjU0FJSUFNZ0JTQVRjU0FKY1hNZ0NYTWlBeUFCY3lJSWNTSUpjeUlUY3pZQ0FDQUFJQVlnQXlBSGN5SUdjU0lGSUFjZ0czRWlGSE1nQ0NBUmN5SVZJQmR4SWhjZ0NDQUtjU0lJY3lJTUlCRWdDaUFQYzNFaUR5QUdJQTF4SWdZZ0F5QU9jU0lPYzNNaURYTWlDbk0yQWh3Z0FDQUNJQmx4SWdJZ0JDQVdjU0lFY3lBS2N6WUNFQ0FBSUFNZ0duRWlBeUFTSUJWeGN5QU5jeUlTSUFRZ0FTQVFjWE1pQkNBTGN5SVFJQUlnRkhNaUFpQUpjM056TmdJTUlBQWdCU0FYY3lBU2N6WUNCQ0FBSUFvZ0F5QUJJQmh4Y3lJQmN5QUNjellDQ0NBQUlBRWdCU0FISUJ4eGMzTWdEM01pQVNBR2N5QVFjeUFNY3pZQ0ZDQUFJQUVnRG5NZ0JITWdDSE1nRTNNMkFoZ0xqQVVDREg4RGZpTUFRYUFCYXlJSUpBQWdDRUVBUWFBQi9Bc0FBa0FDUUNBQ0lBQW9BcUFCSWdWTkJFQWdCVUVwVHcwQ0lBVkJBblFoQ1NBRlFRRnFJUXdnQVNBQ1FRSjBhaUVOQWtBRFFDQUlJQVpCQW5ScUlRTURRQ0FHSVFJZ0F5RUVJQUVnRFVZTkJDQURRUVJxSVFNZ0FrRUJhaUVHSUFFb0FnQWhCeUFCUVFScUlnc2hBU0FIUlEwQUN5QUhyU0VSUWdBaER5QUpJUWNnQWlFQklBQWhBd05BSUFGQktFOE5BaUFFSUE4Z0JEVUNBSHdnQXpVQ0FDQVJmbndpRUQ0Q0FDQVFRaUNJSVE4Z0JFRUVhaUVFSUFGQkFXb2hBU0FEUVFScUlRTWdCMEVFYXlJSERRQUxBa0FnQ2lBUVFvQ0FnSUFRV2dSL0lBSWdCV29pQVVFb1R3MEJJQWdnQVVFQ2RHb2dEejRDQUNBTUJTQUZDeUFDYWlJQklBRWdDa2tiSVFvZ0N5RUJEQUVMQ3lBQlFTaEJsSTNCQUJER0JBQUxJQUZCS0VHVWpjRUFFTVlFQUFzZ0FrRUNkQ0VNSUFKQkFXb2hEU0FBSUFWQkFuUnFJUTRnQUNFREFrQURRQ0FJSUFkQkFuUnFJUVlEUUNBSElRc2dCaUVFSUFNZ0RrWU5BeUFFUVFScUlRWWdCMEVCYWlFSElBTW9BZ0FoQ1NBRFFRUnFJZ1VoQXlBSlJRMEFDeUFKclNFUlFnQWhEeUFNSVFrZ0N5RURJQUVoQmdOQUlBTkJLRThOQWlBRUlBOGdCRFVDQUh3Z0JqVUNBQ0FSZm53aUVENENBQ0FRUWlDSUlROGdCRUVFYWlFRUlBTkJBV29oQXlBR1FRUnFJUVlnQ1VFRWF5SUpEUUFMQWtBZ0NpQVFRb0NBZ0lBUVdnUi9JQUlnQzJvaUEwRW9UdzBCSUFnZ0EwRUNkR29nRHo0Q0FDQU5CU0FDQ3lBTGFpSURJQU1nQ2trYklRb2dCU0VEREFFTEN5QURRU2hCbEkzQkFCREdCQUFMSUFOQktFR1VqY0VBRU1ZRUFBc2dBQ0FJUWFBQi9Bb0FBQ0FBSUFvMkFxQUJJQWhCb0FGcUpBQVBDeUFGUVNoQmxJM0JBQkM0Q1FBTDBBVUNCbjhDZmdKQUlBSkZEUUFnQWtFSGF5SURRUUFnQWlBRFR4c2hCeUFCUVFOcVFYeHhJQUZySVFoQkFDRURBMEFDUUFKQUFrQWdBU0FEYWkwQUFDSUZ3Q0lHUVFCT0JFQWdDQ0FEYTBFRGNRMEJJQU1nQjA4TkFnTkFJQUVnQTJvaUJFRUVhaWdDQUNBRUtBSUFja0dBZ1lLRWVIRU5BeUFEUVFocUlnTWdCMGtOQUFzTUFndENnSUNBZ0lBZ0lRcENnSUNBZ0JBaENRSkFBa0FDZmdKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRlFhUDh3QUJxTFFBQVFRSnJEZ01BQVFJS0N5QURRUUZxSWdRZ0Fra05Ba0lBSVFwQ0FDRUpEQWtMUWdBaENpQURRUUZxSWdRZ0Fra05Ba0lBSVFrTUNBdENBQ0VLSUFOQkFXb2lCQ0FDU1EwQ1FnQWhDUXdIQ3lBQklBUnFMQUFBUWI5L1NnMEdEQWNMSUFFZ0JHb3NBQUFoQkFKQUFrQWdCVUhnQVdzaUJRUkFJQVZCRFVZRVFBd0NCUXdEQ3dBTElBUkJZSEZCb0g5R0RRUU1Bd3NnQkVHZmYwb05BZ3dEQ3lBR1FSOXFRZjhCY1VFTVR3UkFJQVpCZm5GQmJrY05BaUFFUVVCSURRTU1BZ3NnQkVGQVNBMENEQUVMSUFFZ0JHb3NBQUFoQkFKQUFrQUNRQUpBSUFWQjhBRnJEZ1VCQUFBQUFnQUxJQVpCRDJwQi93RnhRUUpMSUFSQlFFNXlEUU1NQWdzZ0JFSHdBR3BCL3dGeFFUQlBEUUlNQVFzZ0JFR1BmMG9OQVFzZ0FpQURRUUpxSWdSTkJFQkNBQ0VKREFVTElBRWdCR29zQUFCQnYzOUtEUUpDQUNFSklBTkJBMm9pQkNBQ1R3MEVJQUVnQkdvc0FBQkJRRWdOQlVLQWdJQ0FnT0FBREFNTFFvQ0FnSUNBSUF3Q0MwSUFJUWtnQTBFQ2FpSUVJQUpQRFFJZ0FTQUVhaXdBQUVHL2Ywd05Bd3RDZ0lDQWdJREFBQXNoQ2tLQWdJQ0FFQ0VKQ3lBQUlBb2dBNjJFSUFtRU53SUVJQUJCQVRZQ0FBOExJQVJCQVdvaEF3d0NDeUFEUVFGcUlRTU1BUXNnQWlBRFRRMEFBMEFnQVNBRGFpd0FBRUVBU0EwQklBSWdBMEVCYWlJRFJ3MEFDd3dDQ3lBQ0lBTkxEUUFMQ3lBQUlBSTJBZ2dnQUNBQk5nSUVJQUJCQURZQ0FBdmVCQUlFZndOK0FrQUNRQUpBSUFGQkNFOEVRQ0FCUVFkeElnTkZEUUVnQUNnQ29BRWlBa0VwVHcwQ0lBSkZCRUFnQUVFQU5nS2dBUXdDQ3lBQ1FRSjBJUVFnQTBFQ2RFSHMzc0FBYWlnQ0FDQURkcTBoQ0NBQUlRTURRQ0FESUFNMUFnQWdDSDRnQm53aUJ6NENBQ0FEUVFScUlRTWdCMElnaUNFR0lBUkJCR3NpQkEwQUN5QUFJQWRDZ0lDQWdCQmFCSDhnQWtFb1JnMEVJQUFnQWtFQ2RHb2dCajRDQUNBQ1FRRnFCU0FDQ3pZQ29BRU1BUXNnQUNnQ29BRWlBa0VwVHcwQklBSkZCRUFnQUVFQU5nS2dBUThMSUFGQkFuUkI3TjdBQUdvMUFnQWhDQ0FDUVFKMElRUWdBQ0VEQTBBZ0F5QUROUUlBSUFoK0lBWjhJZ2MrQWdBZ0EwRUVhaUVESUFkQ0lJZ2hCaUFFUVFScklnUU5BQXNnQUNBSFFvQ0FnSUFRV2dSL0lBSkJLRVlOQXlBQUlBSkJBblJxSUFZK0FnQWdBa0VCYWdVZ0FnczJBcUFCRHdzQ1FDQUJRUWh4QkVBZ0FDZ0NvQUVpQWtFcFR3MENBa0FnQWtVRVFFRUFJUUlNQVFzZ0FDQUNRUUowSWdScVFnQWhCaUFBSVFNRFFDQURJQU0xQWdCQzRlc1hmaUFHZkNJSFBnSUFJQU5CQkdvaEF5QUhRaUNJSVFZZ0JFRUVheUlFRFFBTElBZENnSUNBZ0JCVURRQWdBa0VvUmcwQ0lBWStBZ0FnQWtFQmFpRUNDeUFBSUFJMkFxQUJDeUFCUVJCeEJFQWdBRUdVMzhBQVFRSVFaZ3NnQVVFZ2NRUkFJQUJCbk4vQUFFRURFR1lMSUFGQndBQnhCRUFnQUVHbzM4QUFRUVVRWmdzZ0FVR0FBWEVFUUNBQVFiemZ3QUJCQ2hCbUN5QUJRWUFDY1FSQUlBQkI1Ti9BQUVFVEVHWUxJQUFnQVJCTEdnOExEQUVMSUFKQktFR1VqY0VBRUxnSkFBdEJLRUVvUVpTTndRQVF4Z1FBQzRFR0FRVi9JQUJCQ0dzaUFTQUFRUVJyS0FJQUlnTkJlSEVpQUdvaEFnSkFBa0FnQTBFQmNRMEFJQU5CQW5GRkRRRWdBU2dDQUNJRElBQnFJUUFnQVNBRGF5SUJRYnpmMmdBb0FnQkdCRUFnQWlnQ0JFRURjVUVEUncwQlFiVGYyZ0FnQURZQ0FDQUNJQUlvQWdSQmZuRTJBZ1FnQVNBQVFRRnlOZ0lFSUFJZ0FEWUNBQThMSUFFZ0F4REtBUXNDUUFKQUFrQUNRQUpBSUFJb0FnUWlBMEVDY1VVRVFDQUNRY0RmMmdBb0FnQkdEUUlnQWtHODM5b0FLQUlBUmcwRElBSWdBMEY0Y1NJQ0VNb0JJQUVnQUNBQ2FpSUFRUUZ5TmdJRUlBQWdBV29nQURZQ0FDQUJRYnpmMmdBb0FnQkhEUUZCdE4vYUFDQUFOZ0lBRHdzZ0FpQURRWDV4TmdJRUlBRWdBRUVCY2pZQ0JDQUFJQUZxSUFBMkFnQUxJQUJCZ0FKSkRRSWdBU0FBRVBzQlFRQWhBVUhVMzlvQVFkVGYyZ0FvQWdCQkFXc2lBRFlDQUNBQURRUkJuTjNhQUNnQ0FDSUFCRUFEUUNBQlFRRnFJUUVnQUNnQ0NDSUFEUUFMQzBIVTM5b0FRZjhmSUFFZ0FVSC9IMDBiTmdJQUR3dEJ3Ti9hQUNBQk5nSUFRYmpmMmdCQnVOL2FBQ2dDQUNBQWFpSUFOZ0lBSUFFZ0FFRUJjallDQkVHODM5b0FLQUlBSUFGR0JFQkJ0Ti9hQUVFQU5nSUFRYnpmMmdCQkFEWUNBQXNnQUVITTM5b0FLQUlBSWdOTkRRTkJ3Ti9hQUNnQ0FDSUNSUTBEUVFBaEFFRzQzOW9BS0FJQUlnUkJLVWtOQWtHVTNkb0FJUUVEUUNBQ0lBRW9BZ0FpQlU4RVFDQUNJQVVnQVNnQ0JHcEpEUVFMSUFFb0FnZ2hBUXdBQ3dBTFFiemYyZ0FnQVRZQ0FFRzAzOW9BUWJUZjJnQW9BZ0FnQUdvaUFEWUNBQ0FCSUFCQkFYSTJBZ1FnQUNBQmFpQUFOZ0lBRHdzZ0FFSDRBWEZCcE4zYUFHb2hBZ0ovUWF6ZjJnQW9BZ0FpQTBFQklBQkJBM1owSWdCeFJRUkFRYXpmMmdBZ0FDQURjallDQUNBQ0RBRUxJQUlvQWdnTElRQWdBaUFCTmdJSUlBQWdBVFlDRENBQklBSTJBZ3dnQVNBQU5nSUlEd3RCbk4zYUFDZ0NBQ0lCQkVBRFFDQUFRUUZxSVFBZ0FTZ0NDQ0lCRFFBTEMwSFUzOW9BUWY4ZklBQWdBRUgvSDAwYk5nSUFJQU1nQkU4TkFFSE0zOW9BUVg4MkFnQUxDKzhGQVFaL0l3QkJrQUZySWdJa0FDQUNRZFFBYWlBQlFRaHFRZGJVeVFCQkJoRFBBU0FDS0FKWUlRRUNRQ0FDS0FKVUlnTkJuNENBZ0hoSEJFQWdBQ0FDS1FKY053SUlJQUJCRUdvZ0FrSGtBR29vQWdBMkFnQWdBQ0FCTmdJRUlBQWdBellDQUF3QkN5QUNRU3hxSUFFUXVRUUNRQUpBQWtBQ2Z3SkFJQUlvQWl4Qm40Q0FnSGhIQkVBZ0FrRkFheUFCRU5zRUlBSW9Ba0JCbjRDQWdIaEhEUU1nQWlnQ1JDSURLQUlFSVFFZ0F5Z0NDQ0VESUFKQm40Q0FnSGcyQWxRZ0FpQUJJQU5CeUFCc2FqWUNiQ0FDSUFFMkFtZ2dBaUFDUWRRQWFqWUNjQ0FDUVJocUlBSkI2QUJxRUxNRElBSW9BaGdpQVEwQlFRQWhBVUVFREFJTFFZRGcyZ0F0QUFBYUlBSW9BalFoQXlBQ0tBSXdJUVJCQ0JBV0lnRkZEUU1nQVNBRE5nSUVJQUVnQkRZQ0FDQUFRUUUyQWd3Z0FDQUJOZ0lJSUFCQ240Q0FnQmczQWdBTUJBc2dBaWdDSENFRElBSkJFR3BCQkVFRVFRaEIrUGpOQUJDYUJTQUNLQUlRSVFVZ0FpZ0NGQ0lFSUFNMkFnUWdCQ0FCTmdJQUlBSkJBVFlDZkNBQ0lBUTJBbmdnQWlBRk5nSjBJQUpCaUFGcUlBSkI4QUJxS0FJQU5nSUFJQUlnQWlrQ2FEY0RnQUZCRENFRFFRRWhBUU5BSUFKQkNHb2dBa0dBQVdvUXN3TWdBaWdDQ0NJRkJFQWdBaWdDRENFR0lBSW9BblFnQVVZRVFDQUNRZlFBYWlBQlFRRkJCRUVJRU9FRklBSW9BbmdoQkFzZ0F5QUVhaUlISUFZMkFnQWdCMEVFYXlBRk5nSUFJQUlnQVVFQmFpSUJOZ0o4SUFOQkNHb2hBd3dCQ3dzZ0FpZ0NkQ0VFSUFJb0FuZ0xJUU1nQWlnQ1ZFR2ZnSUNBZUVjRVFDQUFJQUlwQWxRM0FnQWdBRUVRYWlBQ1FlUUFhaWdDQURZQ0FDQUFRUWhxSUFKQjNBQnFLUUlBTndJQUlBUWdBeENtQ1F3REN5QUFJQUUyQWd3Z0FDQUROZ0lJSUFBZ0JEWUNCQ0FBUVorQWdJQjROZ0lBREFJTElBSkJJR29nQVNnQ0FCRHRCaUFBSUFJcEF5QTNBZ3dnQUVFTk5nSUlJQUJCME5ESkFEWUNCQ0FBUVlHQWdJQjROZ0lBSUFKQlFHc1Fwd01NQVFzQUN5QUNRU3hxRU5vSUN5QUNRWkFCYWlRQUM3UUZBaEovQVg0akFFSGdBR3NpQWlRQUlBSWdBU2dDRkNJTU5nSmNJQUlnQVNnQ0VDSU5OZ0pZSUFJZ0FTZ0NEQ0lPTmdKVUlBSWdBU2dDQ0NJUE5nSlFJQUlnQVNnQ0JDSVFOZ0pNSUFJZ0FTZ0NBQ0lSTmdKSUlBSkJHR29pQVNBQ1FjZ0FhaENBQVNBQ0tBSTBJUU1nQWlnQ01DRUdJQUlvQWl3aEJ5QUNLQUlvSVFnZ0FpZ0NKQ0VKSUFJb0FpQWhDeUFDS0FJY0lRb0NRQUpBQWtBQ1FBSkFBa0FDUUNBQ0tBSVlJaElFUUNBQklBWWdBeEJuUVFFaEFTQUNLQUlZUVFGR0RRRWdBaWdDSENFRFFRRWhCUUpBQWtBQ1FDQUNLQUlnSWdRT0FnY0FBUXNnQXkwQUFFRXJhdzREQmdFR0FRc2dBeTBBQUVFclJnUkFJQVJCQVdzaEFTQURRUUZxSVFNZ0JFRUtTUTBCREFRTElBUWlBVUVKVHcwREMwRUFJUVFEUUNBQlJRUkFEQWNMSUFKQkNHb2dBeTBBQUVFS0VLWUdJQUlvQWdoQkFYRkZEUVFnQTBFQmFpRURJQUZCQVdzaEFTQUNLQUlNSUFSQkNteHFJUVFNQUFzQUN5QUtRUU5HSUFJb0FqZ2hCU0FKSVJBZ0NDRVBJQWNoRGlBRElRd2dCaUVOSUFzaEVTQUtJUUVnQ1NFS0lBZ2hCQ0FISVFrZ0F5RUhJQVloQ0NBTElSSU5CUXdEQ3lBQ0lBSXBBaHczQTBoQmdNL1NBRUVySUFKQnlBQnFRWWlzeVFCQjBLN0pBQkNNQkFBTFFRQWhCQU5BSUFGRkJFQU1CQXNnQWtFUWFpQURMUUFBUVFvUXBnWWdBaWdDRUVFQmNVVU5BU0FFclVJS2ZpSVVRaUNJcHcwQklBTkJBV29oQXlBQlFRRnJJUUVnRktjaUJpQUNLQUlVYWlJRUlBWlBEUUFMQzBFQklRRUxJQUFnRERZQ0dDQUFJQTAyQWhRZ0FDQU9OZ0lRSUFBZ0R6WUNEQ0FBSUJBMkFnZ2dBQ0FGTmdJY0lBQWdFVFlDQkNBQUlBRTJBZ0FNQWdzZ0JDRUZJQXNoQkFzZ0FDQUhOZ0lZSUFBZ0NEWUNGQ0FBSUFrMkFoQWdBQ0FFTmdJTUlBQWdDallDQ0NBQUlBVTJBaHdnQUNBU05nSUVJQUJCQXpZQ0FBc2dBa0hnQUdva0FBdXRCUUVGZnlNQVFjQUVheUlDSkFBZ0FrSGdBR29pQTBFQVFlQUQvQXNBSUFKQjJBQnFJQU5CK0FCQmpKdkFBQkNvQmlBQ0tBSllJQUlvQWx3Z0FTQUJFSHNnQWtIUUFHb2dBMEVJUVJCQm5KdkFBQkNxQmlBQ0tBSlFJQUlvQWxRZ0FVRVFhaUlCSUFFUWUwRUlJUUVEUUNBQ1FlQUFhaUlGUWZnQUlBRVErUU1nQWtISUFHb2dCU0FCUVFocUlnTWdBVUVRYWlJQlFheWJ3QUFRcWdZZ0FpZ0NTQ0FDS0FKTUVGMGdBa0ZBYXlBRklBTWdBVUc4bThBQUVLb0dJQUlvQWtBZ0FpZ0NSQkR4QXlBQ1FUaHFJQVVnQXlBQlFjeWJ3QUFRcWdZQ1FDQUNLQUk4SWdNZ0JFc0VRQ0FDS0FJNElBWnFJZ01nQXlnQ0FFR0FnQU56TmdJQUlBVkIrQUFnQVVFSWF5SURRUkJCRGhEckFpQUVRUVpIRFFGQkNDRUJBMEFnQVVIb0FFWkZCRUFnQWtFZ2FpQUNRZUFBYWlJRElBRWdBVUVJYWlJRVFmeWJ3QUFRcWdZZ0FpZ0NJQ0FDS0FJa0VMWUVJQUpCR0dvZ0F5QUVJQUZCRUdvaUJFR01uTUFBRUtvR0lBSW9BaGdnQWlnQ0hCQ3FCU0FDUVJCcUlBTWdCQ0FCUVJocVFaeWN3QUFRcWdZZ0FpZ0NFQ0FDS0FJVUVMY0VJQUZCSUdvaEFRd0JDd3NnQWtFSWFpQUNRZUFBYWtIb0FFSHdBRUhjbThBQUVLb0dJQUlvQWdnZ0FpZ0NEQkMyQkVFUUlRRURRQ0FCUVlBQlJrVUVRQ0FDSUFKQjRBQnFJQUZCQ0dzZ0FVSHNtOEFBRUtvR0lBSW9BZ0FnQWlnQ0JCRHhBeUFCUVFocUlRRU1BUXNMSUFBZ0FrSGdBR3BCNEFQOENnQUFJQUpCd0FScUpBQVBDeUFFSUFOQnpLSEFBQkRHQkFBTElBSkI0QUJxSWdWQitBQWdBeEQ1QXlBQ1FUQnFJQVVnQTBFSWFpSUJJQU5CRUdvaUEwR3NuTUFBRUtvR0lBSW9BakFnQWlnQ05CQmRJQUpCS0dvZ0JTQUJJQU5Cdkp6QUFCQ3FCaUFDS0FJb0lBSW9BaXdROFFNZ0JVSDRBQ0FCUVJCQkJoRHJBaUFFUVFGcUlRUWdCa0VFYWlFR0RBQUxBQXUwQlFJSmZ3SitJd0JCMEFGcklnSWtBQ0FCS0FJQUlRUWdBU2dDQkNFRklBRW9BZ2doQmlBQktBSU1JUWNnQVNnQ0VDRUlJQUlnQVNnQ0ZDSUtOZ0tFQVNBQ0lBZzJBb0FCSUFJZ0J6WUNmQ0FDSUFZMkFuZ2dBaUFGTmdKMElBSWdCRFlDY0NBQ1FZZ0Jha0cyMGRJQVFRUWdBa0h3QUdvUTN3RUNRQUovQWtBZ0FpZ0NpQUZGQkVBZ0FrSElBR29nQWtHY0FXb3BBZ0EzQXdBZ0FrSFFBR29nQWtHa0FXb3BBZ0EzQXdBZ0FpQUNLUUtVQVRjRFFDQUNLQUtRQVNFSklBSkJRR3NoQVFKQUFrQUNRQUpBSUFJb0Fvd0JJZ05CQVdzT0FnQUNBUXNnQWlBS05nS0VBU0FDSUFnMkFvQUJJQUlnQnpZQ2ZDQUNJQVkyQW5nZ0FpQUZOZ0owSUFJZ0JEWUNjQ0FDUVlnQmFrRzYwZElBUVFVZ0FrSHdBR29RM3dFZ0FpZ0NpQUVOQkNBQ1FlQUFhaUFDUVp3QmFpa0NBRGNEQUNBQ1FlZ0FhaUFDUWFRQmFpa0NBRGNEQUNBQ0lBSXBBcFFCTndOWUlBSW9BcEFCSVFrZ0FrSFlBR29oQVNBQ0tBS01BU0lERFFFTFFRQWhBd3dCQ3lBQ1FSaHFJQUZCRUdvcEFnQWlDemNEQUNBQ1FSQnFJQUZCQ0dvcEFnQWlERGNEQUNBQ1FjQUJhaUFNTndNQUlBSkJ5QUZxSUFzM0F3QWdBaUFCS1FJQUlnczNBd2dnQWlBTE53TzRBUXNnQUNBQ0tRTzRBVGNDSkNBQUlBazJBaUFnQUNBRE5nSWNJQUJCRERZQ0dDQUFRVFJxSUFKQnlBRnFLUU1BTndJQUlBQkJMR29nQWtIQUFXb3BBd0EzQWdBTUF3c2dBa0V3YWlBQ1FaZ0JhaWtDQURjREFDQUNRU2hxSUFKQmtBRnFLUUlBTndNQUlBSWdBaWtDaUFFM0F5QkJBUXdCQ3lBQ1FUQnFJQUpCbUFGcUtRSUFOd01BSUFKQktHb2dBa0dRQVdvcEFnQTNBd0FnQWlBQ0tRS0lBVGNESUVFQUN5RUJJQUFnQWlrRElEY0RBQ0FBUVJCcUlBSkJNR29wQXdBM0F3QWdBRUVJYWlBQ1FTaHFLUU1BTndNQUlBQWdBVFlDSENBQVFRTTJBaGdMSUFKQjBBRnFKQUFMbndVQ0JuOEJmaU1BUWZBQWF5SUNKQUFnQWlBQktRSVFOd0pvSUFJZ0FTa0NDRGNDWUNBQ0lBRXBBZ0EzQWxnZ0FrRW9haUFDUWRnQWFoQ0FBU0FDUVJocUlnVWdBa0UwYWlrQ0FEY0RBQ0FDUVNCcUlnTWdBa0U4YWlnQ0FEWUNBQ0FDSUFJcEFpdzNBeEFnQWlnQ1JDRUVJQUlvQWtBaEJnSkFJQUlvQWlnaUIwVUVRQ0FDS0FKSUlRRWdBQ0FDS1FNUU53SUFJQUFnQVRZQ0hDQUFJQVEyQWhnZ0FDQUdOZ0lVSUFCQkVHb2dBeWdDQURZQ0FDQUFRUWhxSUFVcEF3QTNBZ0FNQVFzZ0FrRTRhaUFES0FJQU5nSUFJQUpCTUdvZ0JTa0RBRGNEQUNBQ0lBSXBBeEEzQXlnZ0FrSFlBR29nQmlBRUVHY0NRQUpBQWtBZ0FpZ0NXRUVCUndSQUlBSW9BbHdoQkFKQUFrQUNRQ0FDS0FKZ0lnTU9BZ1VBQVF0QkFTRUZJQVF0QUFCQksyc09Bd1FCQkFFTElBUXRBQUJCSzBZRVFDQURRUUZySVFVZ0JFRUJhaUVFSUFOQkNra05BUXdEQ3lBRElnVkJDVThOQWd0QkFDRURBMEFnQlVVTkJDQUNJQVF0QUFCQkNoQ21CaUFDS0FJQVFRRnhSUTBESUFSQkFXb2hCQ0FGUVFGcklRVWdBaWdDQkNBRFFRcHNhaUVEREFBTEFBc2dBaUFDS1FKY053TVFRWURQMGdCQkt5QUNRUkJxUVlpc3lRQkIwSzdKQUJDTUJBQUxRUUFoQXdOQUlBVkZEUUlnQTYxQ0NuNGlDRUlnaUtjTkFTQUNRUWhxSUFRdEFBQkJDaENtQmlBQ0tBSUlRUUZ4UlEwQklBUkJBV29oQkNBRlFRRnJJUVVnQ0tjaUJpQUNLQUlNYWlJRElBWlBEUUFMQ3lBQVFRRTZBQndnQUVFQk5nSUFJQUFnQVNrQ0FEY0NCQ0FBUVJScUlBRkJFR29wQWdBM0FnQWdBRUVNYWlBQlFRaHFLUUlBTndJQURBRUxJQUFnQWlrREtEY0NDQ0FBSUFNMkFod2dBQ0FITmdJRUlBQkJBellDQUNBQVFSaHFJQUpCT0dvb0FnQTJBZ0FnQUVFUWFpQUNRVEJxS1FNQU53SUFDeUFDUWZBQWFpUUFDNmtKQWd4L0Mzd2pBRUhnQVdzaUJTUUFJQUVvQW9BRElnWUVRQ0FCUVlBRGFrRUFJQVliSVFzZ0FVSFFBbW9oQ1NBRlFiQUJhaUlJSUFZZ0FTZ0NoQU1pQnlnQ0NFRUJhMEY0Y1NJTWFrRUlhaUlHSUFjZ0FpQURFTFFCSUFVb0FyQUJJQVVvQXJRQkVQVUpJQWdnQmlBSElBSWdBeEMwQVNBRktBS3dBU0FGS0FLMEFSRDFDU0FFUVFFNkFFUWdCU0FITmdJUUlBVWdCallDRENBRklBSWdBMm8yQWdnZ0JTQUNOZ0lFSUFGQm9BSnFJUTRnQVNzRGtBTWlGQ0FCS3dPWUE2QWhHQ0FGUWJnQmFpRUlJQVZCS0dvaERTQUJLd09JQXlFU0lBRXJBN0FESVJrZ0FTc0RvQU1oRlNBSElRRURRQ0FGUVJScUlBWWdCVUVFYWlBQktBSVVFUVVBQWtBQ1FDQUZLQUlVUVFGR0JFQWdCUzBBSENFUElBVW9BaGdoQmlBTlFnQTNBd0FnRFVFSWFrSUFOd01BSUFVZ0ZUa0RJQ0FGSUJrNUEwZ2dCVUlBTndOQUlBVkNnSUNBZ0lDQWdQZy9Od000SUFWQnNBRnFJZ0VnQ1NBT0VLa0RJQVZCMEFCcUlnSWdCVUVnYWlBQkVLa0RJQXNvQWdBZ0RHcEJDR29nQmlBSEtBSVFFUkFBSUFWQmdBRnFJQXNvQWdBZ0RHcEJDR29nQmlBSEtBSVlFUVVBUkFBQUFBQUFRSTlBb3lFV0lBVW9Bb1FCSVFvZ0JTZ0NpQUVoRUNNQVFlQUFheUlESkFBZ0F5QVFOZ0lNSUFNZ0NqWUNDQ0FEUVJCcUlBSWdCRUVRYWhDcEF5QVNJQUlyQXdDaUlCSWdBaXNERUtLZ0lCSWdBaXNEQ0tJZ0VpQUNLd01Zb3FDaW55RVJJQU1yQXpnaEZ5QURLd013SVJNQ1FBSkFJQVF0QUVSRkRRQUNRQUpBSUJjZ0JDc0RDS0daSWhvZ0VVUUFBQUFBQUFENFA2SmtCRUFnQTBFQU5nSlFJQU5CQVRZQ1JDQURRYVRneWdBMkFrQWdBMElFTndKSUlBUW9Ba0FnQTBGQWF4RGNDQTBCQ3lBVElBUXJBd0FpRzJORklCb2dFVVFBQUFBQUFBRGdQNkprUlhJTkFTQURRUUEyQWxBZ0EwRUJOZ0pFSUFOQnBPREtBRFlDUUNBRFFnUTNBa2dnQkNnQ1FDQURRVUJyRU53SVJRMEJJQUZCbjRDQWdIZzJBZ0FNQXdzZ0FVR2ZnSUNBZURZQ0FBd0NDeUFUSUJGRW1wbVptWm1adVQraUlCdWdaRVVOQUNBRFFRQTJBbEFnQTBFQk5nSkVJQU5Cck9ES0FEWUNRQ0FEUWdRM0FrZ2dCQ2dDUUNBRFFVQnJFTndJUlEwQUlBRkJuNENBZ0hnMkFnQU1BUXNnQTBFQk5nSkVJQU5CaEkvU0FEWUNRQ0FEUWdFM0Frd2dBMEVMTmdKY0lBTWdBMEhZQUdvMkFrZ2dBeUFEUVFocU5nSllJQVFvQWtBZ0EwRkFheERjQ0FSQUlBRkJuNENBZ0hnMkFnQU1BUXNnQkNBWE9RTUlJQVJCQURvQVJDQUJRYUdBZ0lCNE5nSUFJQVFnRXlBV0lCR2lvRGtEQUFzZ0EwSGdBR29rQUNBRktBS3dBU0lCUWFHQWdJQjRSZzBDSUFBZ0JTa0N0QUUzQWdRZ0FFRU1haUFGUWJ3QmFpa0NBRGNDQUNBQUlBRTJBZ0FnQlNnQ2dBRWdDaEQxQ1F3QkN5QUFRYUdBZ0lCNE5nSUFDeUFGUWVBQmFpUUFEd3NnQlNnQ2dBRWdDaEQxQ1NBSVFnQTNBd0FnQ0VFSWFrSUFOd01BSUFWQ2dJQ0FnSUNBZ1BnL053T3dBU0FGUWdBM0E5Z0JJQVZDZ0lDQWdJQ0FnUGcvTndQSUFTQUZJQlVnR0NBVUlBOUJBVVliSUJRZ0JrRWdSaHNnRmlBU29xQ2lPUVBRQVNBRlFZQUJhaUlCSUFWQnNBRnFJQWtRcVFNZ0NTQUJRVEQ4Q2dBQUlBVW9BaEFoQVNBRktBSU1JUVlNQUFzQUMwSG96TW9BRUxzSkFBdVdCUUVPZnlBQUlBQW9BaGdpQkVFV2QwRy8vdno1QTNFZ0JFRWVkMEhBZ1lPR2ZIRnlJQVJ6SWdZZ0FDZ0NIQ0lDY3lJSElBSkJGbmRCdi83OCtRTnhJQUpCSG5kQndJR0Robnh4Y2lBQ2N5SUNJQUFvQWhBaUEwRVdkMEcvL3Z6NUEzRWdBMEVlZDBIQWdZT0dmSEZ5SUFOeklna2dBQ2dDRkNJQmN5SUljeUlGUVF4M1FZK2V2UGdBY1NBRlFSUjNRZkRodzRkL2NYSnpJQVZ6TmdJY0lBQWdCQ0FCSUFGQkZuZEJ2Lzc4K1FOeElBRkJIbmRCd0lHRGhueHhjbk1pQ25NaUJDQUFLQUlBSWdGQkZuZEJ2Lzc4K1FOeElBRkJIbmRCd0lHRGhueHhjaUFCY3lJTGN5SUZJQVZCREhkQmo1NjgrQUJ4SUFWQkZIZEI4T0hEaDM5eGNuTWdBU0FDY3lJRmN6WUNBQ0FBSUFRZ0JpQURJQUFvQWd3aUFVRVdkMEcvL3Z6NUEzRWdBVUVlZDBIQWdZT0dmSEZ5SUFGeklnWnpJQUp6SWd4eklnTkJESGRCajU2OCtBQnhJQU5CRkhkQjhPSERoMzl4Y25NZ0EzTTJBaGdnQUNBSUlBRWdBQ2dDQ0NJRFFSWjNRYi8rL1BrRGNTQURRUjUzUWNDQmc0WjhjWElnQTNNaURYTWdBbk1pRGlBSElBcHpjeUlCUVF4M1FZK2V2UGdBY1NBQlFSUjNRZkRodzRkL2NYSnpJQUZ6TmdJVUlBQWdEaUFDSUFzZ0FDZ0NCQ0lDYzNNaUNDQUVJQVp6Y3lJQlFReDNRWStldlBnQWNTQUJRUlIzUWZEaHc0ZC9jWEp6SUFGek5nSU1JQUFnQXlBQ0lBSkJGbmRCdi83OCtRTnhJQUpCSG5kQndJR0Robnh4Y25NaUFYTWlBeUFISUExeklBVnpJZ0pCREhkQmo1NjgrQUJ4SUFKQkZIZEI4T0hEaDM5eGNuTWdBbk0yQWdnZ0FDQUVJQWR6SWdRZ0FYTWlBaUFDUVF4M1FZK2V2UGdBY1NBQ1FSUjNRZkRodzRkL2NYSnpJQWh6TmdJRUlBQWdBeUFFY3lBSmN5SUFJQUJCREhkQmo1NjgrQUJ4SUFCQkZIZEI4T0hEaDM5eGNuTWdESE0yQWhBTGhnVUJEbjhnQUNBQUtBSVlJZ1JCRW5kQmc0YU1HSEVnQkVFYWQwSDgrZk5uY1hJZ0JITWlCaUFBS0FJY0lnSnpJZ2NnQWtFU2QwR0Rob3dZY1NBQ1FScDNRZno1ODJkeGNpQUNjeUlDSUFBb0FoQWlBMEVTZDBHRGhvd1ljU0FEUVJwM1FmejU4MmR4Y2lBRGN5SUpJQUFvQWhRaUFYTWlDSE1pQlVFTWQwR1Bucno0QUhFZ0JVRVVkMEh3NGNPSGYzRnljeUFGY3pZQ0hDQUFJQVFnQVNBQlFSSjNRWU9HakJoeElBRkJHbmRCL1BuelozRnljeUlLY3lJRUlBQW9BZ0FpQVVFU2QwR0Rob3dZY1NBQlFScDNRZno1ODJkeGNpQUJjeUlMY3lJRklBVkJESGRCajU2OCtBQnhJQVZCRkhkQjhPSERoMzl4Y25NZ0FTQUNjeUlGY3pZQ0FDQUFJQVFnQmlBRElBQW9BZ3dpQVVFU2QwR0Rob3dZY1NBQlFScDNRZno1ODJkeGNpQUJjeUlHY3lBQ2N5SU1jeUlEUVF4M1FZK2V2UGdBY1NBRFFSUjNRZkRodzRkL2NYSnpJQU56TmdJWUlBQWdDQ0FCSUFBb0FnZ2lBMEVTZDBHRGhvd1ljU0FEUVJwM1FmejU4MmR4Y2lBRGN5SU5jeUFDY3lJT0lBY2dDbk56SWdGQkRIZEJqNTY4K0FCeElBRkJGSGRCOE9IRGgzOXhjbk1nQVhNMkFoUWdBQ0FPSUFJZ0N5QUFLQUlFSWdKemN5SUlJQVFnQm5OeklnRkJESGRCajU2OCtBQnhJQUZCRkhkQjhPSERoMzl4Y25NZ0FYTTJBZ3dnQUNBRElBSWdBa0VTZDBHRGhvd1ljU0FDUVJwM1FmejU4MmR4Y25NaUFYTWlBeUFISUExeklBVnpJZ0pCREhkQmo1NjgrQUJ4SUFKQkZIZEI4T0hEaDM5eGNuTWdBbk0yQWdnZ0FDQUVJQWR6SWdRZ0FYTWlBaUFDUVF4M1FZK2V2UGdBY1NBQ1FSUjNRZkRodzRkL2NYSnpJQWh6TmdJRUlBQWdBeUFFY3lBSmN5SUFJQUJCREhkQmo1NjgrQUJ4SUFCQkZIZEI4T0hEaDM5eGNuTWdESE0yQWhBTDBBUUNCWDhFZmlNQVFaQUJheUlDSkFBZ0FrRW9ha0lBTndNQUlBSkJJR3BDQURjREFDQUNRUmhxUWdBM0F3QWdBa0lBTndNUUlBSkJ5QUJxUWdBM0F3QWdBa0ZBYTBJQU53TUFJQUpCT0dwQ0FEY0RBQ0FCUVNocUlnVWdBUzBBYUNJRGFrR0FBVG9BQUNBQ1FnQTNBekFnQVNrRElDRUhJQUpCQ0dvZ0EwRUJhaUFGUWNBQVFjQ3d5UUFRbndjZ0FpZ0NEQ0VFSUFJb0FnZ2hCZ05BSUFRRVFDQUdRUUE2QUFBZ0JFRUJheUVFSUFaQkFXb2hCZ3dCQ3dzZ0E2MUNPNFlnQjBJSmhpSUpJQU5CQTNTdGhDSUlRb0QrQTROQ0tJYUVJQWhDZ0lEOEI0TkNHSVlnQ0VLQWdJRDRENE5DQ0lhRWhDQUhRZ0dHUW9DQWdQZ1BneUFIUWcrSVFvQ0EvQWVEaENBSFFoK0lRb0QrQTRNZ0NVSTRpSVNFaENFSEFrQWdBMEU0Y1VFNFJ3UkFJQUVnQnpjRFlDQUJJQVVRNHdrTUFRc2dBU0FGRU9NSklBSkIwQUJxSWdOQkFFRTQvQXNBSUFJZ0J6Y0FpQUVnQVNBREVPTUpDMEVBSVFRZ0FVRUFPZ0JvUVFoQklFRUVFTVFJSWdNZ0EwRUlUeHRCQW5RaEJRTkFJQVFnQlVaRkJFQWdBaUFCSUFScUtBSUFJZ05CR0hRZ0EwR0EvZ054UVFoMGNpQURRUWgyUVlEK0EzRWdBMEVZZG5KeU5nSlFJQUpCTUdvZ0JHcEJCQ0FDUWRBQWFrRUVRZXl5eVFBUXJBY2dCRUVFYWlFRURBRUxDeUFDUVNocUlBSkJ5QUJxS1FNQUlnYzNBd0FnQWtFZ2FpQUNRVUJyS1FNQUlnZzNBd0FnQWtFWWFpQUNRVGhxS1FNQUlnazNBd0FnQWlBQ0tRTXdJZ28zQXhBZ0FFRVlhaUFITndBQUlBQkJFR29nQ0RjQUFDQUFRUWhxSUFrM0FBQWdBQ0FLTndBQUlBSkJrQUZxSkFBTDN3UUNDbjhCZmlNQVFSQnJJZ1lrQUNBQlFSQnFJUWhCQWlFRkFrQUNRQUpBQWtBRFFDQUJMUUFkRFFRZ0FTZ0NFQ0VISUFFb0FoUWhBeUFCS0FJSUlRa0NRQUpBQTBBZ0JrRUlhaUFJRU9vQ0lBWW9BZ2hCQVhGRkRRRWdCaWdDRENFQ0lBRWdBU2dDR0NJS0lBTnFJQWNnQVNnQ0ZDSURhbXNnQVNnQ0VDSUhhaUlMTmdJWUFrQWdBa0VKYXlJRVFSZE5RUUJCQVNBRWRFR2ZnSUFFY1JzTkFDQUNRWUFCU1EwQklBSkJDSFlpQkFSQUFrQWdCRUV3UndSQUlBUkJJRVlOQVNBRVFSWkhJQUpCZ0MxSGNnMEVEQU1MSUFKQmdPQUFSdzBEREFJTElBSkIvd0Z4UWN6THlRQnFMUUFBUVFKeFJRMENEQUVMSUFKQi93RnhRY3pMeVFCcUxRQUFRUUZ4UlEwQkN3c2dBU2dDQUNFQ0lBRWdDellDQUNBQ0lBbHFJUU1nQ2lBQ2F5RUNEQUVMSUFFdEFCME5CU0FCUVFFNkFCMGdBUzBBSEVVZ0FTZ0NCQ0lDSUFFb0FnQWlBMFp4RFFVZ0FpQURheUVDSUFFb0FnZ2dBMm9oQXdzQ1FDQUNEZ0lCQUFJTEMwRUFJUVZCQVNFQklBTXRBQUJCSzJzT0F3TUJBd0VMSUFNdEFBQkJLMFlFUUNBQ1FRRnJJUUVnQTBFQmFpRURJQUpCQ2trTkFRd0NDeUFDSWdGQkNVOE5BUXRCQUNFQ1FRRWhCUU5BSUFGRkRRSWdBeTBBQUVFd2F5SUVRUWxMQkVCQkFDRUZEQU1GSUFOQkFXb2hBeUFCUVFGcklRRWdCQ0FDUVFwc2FpRUNEQUVMQUFzQUMwRUFJUUlEUUNBQlJRUkFRUUVoQlF3Q0MwRUFJUVVnQXExQ0NuNGlERUlnaUtjTkFTQURMUUFBUVRCcklnSkJDVXNOQVNBRFFRRnFJUU1nQVVFQmF5RUJJQUlnREtjaUJHb2lBaUFFVHcwQUN3c2dBQ0FDTmdJRUlBQWdCVFlDQUNBR1FSQnFKQUFMandZQkEzOGpBRUV3YXlJQ0pBQWdBU2dDQkNFRElBRW9BZ0FoQVFKL0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBUVJNZ0FDZ0NBQ2dDQUNJQVFZT0F4QUJySWdRZ0JFRVZUeHRCQVdzT0ZBRUNBd1FGQmdjSUNRb0xEQTBPRHhBUkVoTVVBQXNnQVVHVjJza0FRU0lnQXlnQ0RCRUNBQXdVQ3lBQlFiZmF5UUJCR2lBREtBSU1FUUlBREJNTElBRkIwZHJKQUVFYklBTW9BZ3dSQWdBTUVnc2dBVUhzMnNrQVFSOGdBeWdDREJFQ0FBd1JDeUFCUVl2YnlRQkJIaUFES0FJTUVRSUFEQkFMSUFGQnFkdkpBRUVpSUFNb0Fnd1JBZ0FNRHdzZ0FVSEwyOGtBUVIwZ0F5Z0NEQkVDQUF3T0N5QUJRZWpieVFCQkV5QURLQUlNRVFJQURBMExJQUZCKzl2SkFFRVNJQU1vQWd3UkFnQU1EQXNnQVVHTjNNa0FRUmtnQXlnQ0RCRUNBQXdMQ3lBQlFhYmN5UUJCR1NBREtBSU1FUUlBREFvTElBRkJ2OXpKQUVFUElBTW9BZ3dSQWdBTUNRc2dBVUhPM01rQVFSQWdBeWdDREJFQ0FBd0lDeUFCUWQ3Y3lRQkJOeUFES0FJTUVRSUFEQWNMSUFGQmxkM0pBRUVzSUFNb0Fnd1JBZ0FNQmdzZ0FVSEIzY2tBUVNJZ0F5Z0NEQkVDQUF3RkN5QUJRZVBkeVFCQnh3QWdBeWdDREJFQ0FBd0VDeUFCUWFyZXlRQkJNaUFES0FJTUVRSUFEQU1MSUFGQjNON0pBRUV6SUFNb0Fnd1JBZ0FNQWdzQ1FBSkFBa0FDUUNBQVFmLy93d0JyUVFBZ0FFR0FnTVFBYTBFRFNSdEJBV3NPQXdFQ0F3QUxJQUlnQURZQ0RDQUNRUUkyQWh3Z0FrSEludElBTmdJWUlBSkNBVGNDSkNBQ1FkY0FOZ0lVSUFJZ0FrRVFhallDSUNBQ0lBSkJER28yQWhBZ0FTQURJQUpCR0dvUTN3Z01CQXNnQWtFQU5nSW9JQUpCQVRZQ0hDQUNRZmllMGdBMkFoZ2dBa0lFTndJZ0lBRWdBeUFDUVJocUVOOElEQU1MSUFKQkFEWUNLQ0FDUVFFMkFod2dBa0dnbjlJQU5nSVlJQUpDQkRjQ0lDQUJJQU1nQWtFWWFoRGZDQXdDQ3lBQ1FRQTJBaWdnQWtFQk5nSWNJQUpCdEovU0FEWUNHQ0FDUWdRM0FpQWdBU0FESUFKQkdHb1Ezd2dNQVFzZ0FVR1AzOGtBUWNNQUlBTW9BZ3dSQWdBTElBSkJNR29rQUF2ZkJRRUlmeU1BUWRBQWF5SUNKQUFnQVNnQ0ZDRUZJQUVvQWhBaEF5QUFBbjhEUUFKQUFrQWdBMFVnQlVWeVJRUkFJQUVvQWhnaUJBMEJEQUlMSUFFb0FnZ2lBMFVOQVNBQklBTkJBV3NpQXpZQ0NDQUJJQUVvQWdRZ0EwRURkR29pQXlnQ0JDSUZOZ0lVSUFFZ0F5Z0NBQ0lETmdJUURBSUxJQUVnQlVFQmF5SUZOZ0lVSUFFZ0EwSElBR29pQmpZQ0VDQUJJQVJCQVdzMkFoZ2dBa0VVYWlBREVNUUVJQUlvQWhSQm40Q0FnSGhHQkVBZ0FrRThhaUFCS0FJTUlnTkJtQUpxS0FJQUlBTkJuQUpxS0FJQUlBSW9BaGdpQnlBQ0x3RWNJZ2dRcEFRQ1FDQUNLQUk4UVorQWdJQjRSd1JBSUFKQk9Hb2dBa0hNQUdvb0FnQTJBZ0FnQWtFd2FpQUNRY1FBYWlrQ0FEY0RBQ0FDSUFJcEFqdzNBeWdNQVFzZ0FrRW9haUFDS0FKQUVQMEJDd0pBSUFJb0FpaEJuNENBZ0hoSERRQWdBaWdDTENFRUFrQUNRQ0FDS0FJd1FRUnJEZ0lBQVFJTElBUXRBQUJCMEFCSERRRWdCQzBBQVVIaEFFY05BU0FFTFFBQ1FlY0FSdzBCSUFRdEFBTkI1UUJIRFFFZ0FrRW9haERMQ0NBQ1FSUnFFTXNJSUFBZ0NEc0JEQ0FBSUFjMkFnZ2dBQ0FCS0FJY1FRRnFJZ0EyQWdRZ0FTQUFOZ0ljUVFFTUJRc2dCQzBBQUVIUUFFY05BQ0FFTFFBQlFlRUFSdzBBSUFRdEFBSkI1d0JIRFFBZ0JDMEFBMEhsQUVjTkFDQUVMUUFFUWZNQVJ3MEFJQUVvQWdnaUJFSC9BVXNOQUNBRkJFQWdBU2dDQUNBRVJnUkFJd0JCRUdzaUF5UUFJQU5CQ0dvZ0FTQUJLQUlBUVFGQkJFRUlFSWdDSUFNb0FnZ2lDVUdCZ0lDQWVFY0VRQ0FKSUFNb0FneEJpSnZKQUJETUNBQUxJQU5CRUdva0FDQUJLQUlNSVFNTElBRWdCRUVCYWpZQ0NDQUJLQUlFSUFSQkEzUnFJZ1FnQlRZQ0JDQUVJQVkyQWdBTElBSkJDR29nQTBHWUFtb29BZ0FnQTBHY0Ftb29BZ0FnQnlBSUVOa0JJQUlvQWdnaEJpQUJJQUlvQWd3aUJUWUNGQ0FCSUFZMkFoQUxJQUpCS0dvUXl3Z0xJQUpCRkdvUXl3Z2dCaUVEREFFTEMwRUFDellDQUNBQ1FkQUFhaVFBQytVRUFnOS9BWDRnQUNnQ0JFRUJhaUlJUVFOMklBaEJCM0ZCQUVkcUlRWWdBQ2dDQUNJRklRa0RRQ0FHQkVBZ0NTQUpLUU1BSWhOQ2Y0VkNCNGhDZ1lLRWlKQ2d3SUFCZ3lBVFF2LysvZnYzNzkrLy93Q0VmRGNEQUNBSlFRaHFJUWtnQmtFQmF5RUdEQUVGQWtBZ0NFRUlUd1JBSUFVZ0NHb2dCU2tBQURjQUFBd0JDeUFJUlEwQUlBVkJDR29nQlNBSS9Bb0FBQXNnQTBFQmNTRVJJQU5CUEhFaERpQURRUUoySVJJZ0EwRURjU0VQUVFBaENRTkFBa0FnQ0NBSklnVkxCRUFnQlNBRklBaEphaUVKSUFBb0FnQWlCQ0FGYWkwQUFFR0FBVWNOQWlBRUlBTWdCVUYvYzJ4cUloQWdEbW9oQ3dOQUlBVWdBU0FBSUFVZ0FoRUxBQ0lUcHlJSElBQW9BZ1FpQ25FaUJHc2dBQ2dDQUNJTUlBb2dFeENXQkNJR0lBUnJjeUFLY1VFSVNRMENJQVlnREdvaUJDMEFBQ0FFSUFkQkdYWWlCRG9BQUNBQUtBSUFJQVpCQ0dzZ0NuRnFRUWhxSUFRNkFBQWdEQ0FESUFaQmYzTnNhaUVIUWY4QlJnUkFJQUFvQWdRaEJDQUFLQUlBSUFWcVFmOEJPZ0FBSUFBb0FnQWdCQ0FGUVFocmNXcEJDR3BCL3dFNkFBQWdBMFVOQkNBSElCQWdBL3dLQUFBTUJBc2dFQ0FISUJJUXB3WWdEMFVOQUNBSElBNXFJUWRCQUNFR0lBOUJBVWNFUUNBTEx3QUFJUVFnQ3lBSEx3QUFPd0FBSUFjZ0JEc0FBRUVDSVFZZ0VVVU5BUXNnQmlBTGFpSUVMUUFBSVEwZ0JDQUdJQWRxSWdRdEFBQTZBQUFnQkNBTk9nQUFEQUFMQUFzZ0FDQUFLQUlFSWdFZ0FVRUJha0VEZGtFSGJDQUJRUWhKR3lBQUtBSU1hellDQ0E4TElBVWdER29nQjBFWmRpSUVPZ0FBSUFBb0FnQWdDaUFGUVFocmNXcEJDR29nQkRvQUFBd0FDd0FMQUFzQUMrVUVBZzkvQVg0Z0FDZ0NCRUVCYWlJSVFRTjJJQWhCQjNGQkFFZHFJUVlnQUNnQ0FDSUZJUWtEUUNBR0JFQWdDU0FKS1FNQUloTkNmNFZDQjRoQ2dZS0VpSkNnd0lBQmd5QVRRdi8rL2Z2Mzc5Ky8vd0NFZkRjREFDQUpRUWhxSVFrZ0JrRUJheUVHREFFRkFrQWdDRUVJVHdSQUlBVWdDR29nQlNrQUFEY0FBQXdCQ3lBSVJRMEFJQVZCQ0dvZ0JTQUkvQW9BQUFzZ0EwRUJjU0VSSUFOQkZIRWhEaUFEUVFKMklSSWdBMEVEY1NFUFFRQWhDUU5BQWtBZ0NDQUpJZ1ZMQkVBZ0JTQUZJQWhKYWlFSklBQW9BZ0FpQkNBRmFpMEFBRUdBQVVjTkFpQUVJQU1nQlVGL2MyeHFJaEFnRG1vaEN3TkFJQVVnQVNBQUlBVWdBaEVMQUNJVHB5SUhJQUFvQWdRaUNuRWlCR3NnQUNnQ0FDSU1JQW9nRXhDV0JDSUdJQVJyY3lBS2NVRUlTUTBDSUFZZ0RHb2lCQzBBQUNBRUlBZEJHWFlpQkRvQUFDQUFLQUlBSUFaQkNHc2dDbkZxUVFocUlBUTZBQUFnRENBRElBWkJmM05zYWlFSFFmOEJSZ1JBSUFBb0FnUWhCQ0FBS0FJQUlBVnFRZjhCT2dBQUlBQW9BZ0FnQkNBRlFRaHJjV3BCQ0dwQi93RTZBQUFnQTBVTkJDQUhJQkFnQS93S0FBQU1CQXNnRUNBSElCSVFwd1lnRDBVTkFDQUhJQTVxSVFkQkFDRUdJQTlCQVVjRVFDQUxMd0FBSVFRZ0N5QUhMd0FBT3dBQUlBY2dCRHNBQUVFQ0lRWWdFVVVOQVFzZ0JpQUxhaUlFTFFBQUlRMGdCQ0FHSUFkcUlnUXRBQUE2QUFBZ0JDQU5PZ0FBREFBTEFBc2dBQ0FBS0FJRUlnRWdBVUVCYWtFRGRrRUhiQ0FCUVFoSkd5QUFLQUlNYXpZQ0NBOExJQVVnREdvZ0IwRVpkaUlFT2dBQUlBQW9BZ0FnQ2lBRlFRaHJjV3BCQ0dvZ0JEb0FBQXdBQ3dBTEFBc0FDOE1FQWdaL0JINGpBRUhnQVdzaUFpUUFJQUpCNkFCcUlBRVFHZ0pBSUFJb0FvQUJJZ1JCREVZRVFDQUNRZUFBYWlBQ1Fad0JhaWtDQUNJSU53TUFJQUpCMkFCcUlBSkJsQUZxS1FJQUlnazNBd0FnQWtIUUFHb2dBa0dNQVdvcEFnQWlDamNEQUNBQ0lBSXBBb1FCSWdzM0EwZ2dBRUUwYWlBSU53SUFJQUJCTEdvZ0NUY0NBQ0FBUVNScUlBbzNBZ0FnQUNBTE53SWNJQUJCRERZQ0dBd0JDeUFDUWRnQmFpQUNRZmdBYWlrREFEY0RBQ0FDUWRBQmFpQUNRZkFBYWlrREFEY0RBQ0FDUWRBQWFpSUZJZ0VnQWtHTUFXb3BBZ0EzQXdBZ0FrSFlBR29pQmlJRElBSkJsQUZxS1FJQU53TUFJQUpCNEFCcUlnY2dBa0djQVdvcEFnQTNBd0FnQWlBQ0tRTm9Od1BJQVNBQ0lBSXBBb1FCTndOSUlBSkJKR29nQWtHa0FXcEJKUHdLQUFBZ0FrRU1haUFCS1FNQU53SUFJQUpCRkdvZ0F5a0RBRGNDQUNBQ1FSeHFJQWNwQXdBM0FnQWdBaUFFTmdJQUlBSWdBaWtEU0RjQ0JDQUNRZWdBYWlBQ1FjZ0JhaENvQWlBQklBSkI5QUJxS1FJQU53TUFJQU1nQWtIOEFHb3BBZ0EzQXdBZ0FpQUNLUUpzTndOSUlBSW9BbWdpQVVFRFJ3UkFJQUlvQW9RQklRTWdBQ0FDS1FOSU53SWdJQUFnQXpZQ09DQUFJQUUyQWh3Z0FFRU1OZ0lZSUFCQk1Hb2dCaWtEQURjQ0FDQUFRU2hxSUFVcEF3QTNBZ0FnQWhEMEJBd0JDeUFDUWZnQWFpQUNRZGdBYWlrREFEY0RBQ0FDUWZBQWFpQUNRZEFBYWlrREFEY0RBQ0FDSUFJcEEwZzNBMmdnQWtHQUFXb2dBa0hJQVB3S0FBQWdBQ0FDUWVnQWFrSGdBUHdLQUFBTElBSkI0QUZxSkFBTDJRUUJCMzhqQUVFUWF5SUVKQUFDUUFKQUFrQWdBa0VBVGdSQUlBSkZCRUFnQkVFQU5nSU1JQVJDZ0lDQWdCQTNBZ1FNQXd0QmdPRGFBQzBBQUJvZ0FoQVdJZ1pGRFFFZ0JFRUFOZ0lNSUFRZ0JqWUNDQ0FFSUFJMkFnUWdBU0FDUVFGMGFpRUlBMEFnQVVFQ2FpRURBbjhDUUFKL0lBRXZBUUFpQWtHQThBTnhRWUN3QTBZRVFBSkFJQU1nQ0VZZ0FrSC90d05MY2cwQUlBTXZBUUFpQTBHQVFHdEIvLzhEY1VHQStBTkpEUUFnQTBIL0IzRWdBa0gvQjNGQkNuUnlRWUNBQkdvaEFpQUJRUVJxREFJTElBQkJnSUNBZ0hnMkFnQWdCQ2dDQkNJQVJRMElJQVFvQWdnZ0FFRUJFT01FREFnTFFRRWhCeUFDUVlBQlNRUkFJQU1oQVVFQkRBTUxJQUpCZ0JCSkRRRWdBd3NoQVVFQUlRZEJBMEVFSUFKQmdJQUVTUnNNQVF0QkFDRUhJQU1oQVVFQ0N5SUpJQVFvQWdRZ0JTSURhMHNFUUNBRVFRUnFJQU1nQ1JEM0FpQUVLQUlJSVFZZ0JDZ0NEQ0VEQ3lBRElBWnFJUU1DUUFKQUlBZEZCRUFnQWtHQUVFa05BU0FDUVlDQUJFOEVRQ0FESUFKQlAzRkJnQUZ5T2dBRElBTWdBa0VTZGtId0FYSTZBQUFnQXlBQ1FRWjJRVDl4UVlBQmNqb0FBaUFESUFKQkRIWkJQM0ZCZ0FGeU9nQUJEQU1MSUFNZ0FrRS9jVUdBQVhJNkFBSWdBeUFDUVF4MlFlQUJjam9BQUNBRElBSkJCblpCUDNGQmdBRnlPZ0FCREFJTElBTWdBam9BQUF3QkN5QURJQUpCUDNGQmdBRnlPZ0FCSUFNZ0FrRUdka0hBQVhJNkFBQUxJQVFnQlNBSmFpSUZOZ0lNSUFFZ0NFY05BQXNNQWd0QjBLTEFBQkRwQmdzQUN5QUFJQVFwQWdRM0FnQWdBRUVJYWlBRVFReHFLQUlBTmdJQUN5QUVRUkJxSkFBTHd3UUNCSDRGZnlNQVFaQUJheUlISkFBZ0FTQUJMUUNBQVNJSmFrR0FBVG9BQUNBQUtRTklJUVVnQUNrRFFDRURJQWRCQ0dvZ0NVRUJhaUFCUVlBQlFjQ3d5UUFRbndjZ0NVRURkQ0FIS0FJTUlRZ2dCeWdDQ0NFS0EwQWdDQVJBSUFwQkFEb0FBQ0FJUVFGcklRZ2dDa0VCYWlFS0RBRUxDNjBpQkVJNGhpQURRZ3FHSWdZZ0JJUWlCRUtBL2dPRFFpaUdoQ0FFUW9DQS9BZURRaGlHSUFSQ2dJQ0ErQStEUWdpR2hJUWdBMElDaGtLQWdJRDRENE1nQTBJT2lFS0FnUHdIZzRRZ0EwSWVpRUtBL2dPRElBWkNPSWlFaElRaEJDQURRamFJSWdOQ09JWWdCVUlLaGlJR0lBT0VJZ05DZ1A0RGcwSW9ob1FnQTBLQWdQd0hnMElZaGlBRFFvQ0FnUGdQZzBJSWhvU0VJQVZDQW9aQ2dJQ0ErQStESUFWQ0RvaENnSUQ4QjRPRUlBVkNIb2hDZ1A0RGd5QUdRamlJaElTRUlRTUNRQ0FKUWZBQWNVSHdBRWNFUUNBQklBTTNBSEFnQVNBRU53QjRJQUFnQVJEa0NRd0JDeUFBSUFFUTVBa2dCMEVRYWlJSVFRQkI4QUQ4Q3dBZ0J5QUVOd0NJQVNBSElBTTNBSUFCSUFBZ0NCRGtDUXNnQVVFQU9nQ0FBVUVJUWNBQVFRZ1F4QWdpQVNBQlFRaFBHeUVJQTBBZ0NBUkFJQWNnQUNrREFDSURRamlHSUFOQ2dQNERnMElvaG9RZ0EwS0FnUHdIZzBJWWhpQURRb0NBZ1BnUGcwSUlob1NFSUFOQ0NJaENnSUNBK0ErRElBTkNHSWhDZ0lEOEI0T0VJQU5DS0loQ2dQNERneUFEUWppSWhJU0VOd01RSUFKQkNDQUhRUkJxUVFoQm9MUEpBQkNzQnlBQVFRaHFJUUFnQ0VFQmF5RUlJQUpCQ0dvaEFnd0JDd3NnQjBHUUFXb2tBQXZYQkFFTmZ3SkFBa0FDUUFKQUFrQUNRQUpBSUFFRVFDQUFJQU1vQUF3aUJTQUNLQUFNSWdSQkFYWnpRZFdxMWFvRmNTSUdRUUYwSUFSeklnUWdBeWdBQ0NJSUlBSW9BQWdpQjBFQmRuTkIxYXJWcWdWeElnbEJBWFFnQjNNaUIwRUNkbk5CcytiTW1RTnhJZ3BCQW5RZ0IzTWlCeUFES0FBRUlnc2dBaWdBQkNJTVFRRjJjMEhWcXRXcUJYRWlEVUVCZENBTWN5SU1JQU1vQUFBaUF5QUNLQUFBSWdKQkFYWnpRZFdxMWFvRmNTSU9RUUYwSUFKeklnSkJBblp6UWJQbXpKa0RjU0lQUVFKMElBSnpJZ0pCQkhaelFZK2V2UGdBY1NJUVFRUjBJQUp6TmdJQUlBRkJBVVlOQVNBQUlBVWdCbk1pQWlBSUlBbHpJZ1ZCQW5aelFiUG16SmtEY1NJR1FRSjBJQVZ6SWdVZ0N5QU5jeUlJSUFNZ0RuTWlBMEVDZG5OQnMrYk1tUU54SWdsQkFuUWdBM01pQTBFRWRuTkJqNTY4K0FCeElndEJCSFFnQTNNMkFnUWdBVUVDVFEwQ0lBQWdCQ0FLY3lJRElBd2dEM01pQkVFRWRuTkJqNTY4K0FCeElncEJCSFFnQkhNMkFnZ2dBVUVEUmcwRElBQWdBaUFHY3lJQ0lBZ2dDWE1pQkVFRWRuTkJqNTY4K0FCeElnWkJCSFFnQkhNMkFnd2dBVUVFVFEwRUlBQWdCeUFRY3pZQ0VDQUJRUVZHRFFVZ0FDQUZJQXR6TmdJVUlBRkJCazBOQmlBQUlBTWdDbk0yQWhnZ0FVRUhSdzBIUVFkQkIwR2NvY0FBRU1ZRUFBdEJBRUVBUWF5Z3dBQVF4Z1FBQzBFQlFRRkJ2S0RBQUJER0JBQUxRUUpCQWtITW9NQUFFTVlFQUF0QkEwRURRZHlnd0FBUXhnUUFDMEVFUVFSQjdLREFBQkRHQkFBTFFRVkJCVUg4b01BQUVNWUVBQXRCQmtFR1FZeWh3QUFReGdRQUN5QUFJQUlnQm5NMkFod0xxd1FCREg4Z0FVRUJheUVPSUFBb0FnUWhDaUFBS0FJQUlRc2dBQ2dDQ0NFTUFrQURRQ0FGRFFFQ2Z3SkFJQUlnQTBrTkFBTkFJQUVnQTJvaEJRSkFBa0FDUUNBQ0lBTnJJZ2RCQjAwRVFDQUNJQU5IRFFFZ0FpRUREQVVMQWtBZ0JVRURha0Y4Y1NJR0lBVnJJZ1FFUUVFQUlRQURRQ0FBSUFWcUxRQUFRUXBHRFFVZ0JDQUFRUUZxSWdCSERRQUxJQVFnQjBFSWF5SUFUUTBCREFNTElBZEJDR3NoQUFzRFFFR0Fnb1FJSUFZb0FnQWlDVUdLbEtqUUFITnJJQWx5UVlDQ2hBZ2dCa0VFYWlnQ0FDSUpRWXFVcU5BQWMyc2dDWEp4UVlDQmdvUjRjVUdBZ1lLRWVFY05BaUFHUVFocUlRWWdCRUVJYWlJRUlBQk5EUUFMREFFTFFRQWhBQU5BSUFBZ0JXb3RBQUJCQ2tZTkFpQUhJQUJCQVdvaUFFY05BQXNnQWlFRERBTUxJQVFnQjBZRVFDQUNJUU1NQXdzZ0JDQUZhaUVHSUFJZ0JHc2dBMnNoQjBFQUlRQUNRQU5BSUFBZ0Jtb3RBQUJCQ2tZTkFTQUhJQUJCQVdvaUFFY05BQXNnQWlFRERBTUxJQUFnQkdvaEFBc2dBQ0FEYWlJRVFRRnFJUU1DUUNBQ0lBUk5EUUFnQUNBRmFpMEFBRUVLUncwQVFRQWhCU0FESWdRTUF3c2dBaUFEVHcwQUN3c2dBaUFJUmcwQ1FRRWhCU0FJSVFRZ0Fnc2hBQUpBSUF3dEFBQUVRQ0FMUWNqMndBQkJCQ0FLS0FJTUVRSUFEUUVMUVFBaEJpQUFJQWhIQkVBZ0FDQU9haTBBQUVFS1JpRUdDeUFBSUFocklRQWdBU0FJYWlFSElBd2dCam9BQUNBRUlRZ2dDeUFISUFBZ0NpZ0NEQkVDQUVVTkFRc0xRUUVoRFFzZ0RRdm5CQUlIZndGK0l3QkJFR3NpQXlRQUFrQWdBQzhCRENJQ1JRUkFJQUFvQWdBZ0FDZ0NCQ0FCRUtvQklRRU1BUXNnQTBFSWFpQUJRUWhxS1FJQU53TUFJQU1nQVNrQ0FEY0RBQUpBQW44Z0FDa0NDQ0lKcHlJRlFZQ0FnQWh4UlFSQUlBTW9BZ1FNQVFzZ0FDZ0NBQ0FES0FJQUlBTW9BZ1FpQVNBQUtBSUVLQUlNRVFJQURRRWdBQ0FGUVlDQWdQOTVjVUd3Z0lDQUFuSWlCVFlDQ0NBRFFnRTNBd0FnQWlBQlFmLy9BM0ZySWdGQkFDQUJJQUpOR3lFQ1FRQUxJUVFnQXlnQ0RDSUdCRUFnQXlnQ0NDRUJJQVpCREd3aENBTkFBbjhDUUFKQUFrQWdBUzhCQUVFQmF3NENBZ0VBQ3lBQlFRUnFLQUlBREFJTElBRkJDR29vQWdBTUFRc2dBVUVDYWk4QkFDSUhRZWdIVHdSQVFRUkJCU0FIUVpET0FFa2JEQUVMUVFFZ0IwRUtTUTBBR2tFQ1FRTWdCMEhrQUVrYkN5RUdJQUZCREdvaEFTQUVJQVpxSVFRZ0NFRU1heUlJRFFBTEN3SkFJQUpCLy84RGNTQUVTd1JBSUFJZ0JHc2hCRUVBSVFGQkFDRUNBa0FDUUFKQUlBVkJIWFpCQTNGQkFXc09Bd0FCQUFJTElBUWhBZ3dCQ3lBRVFmNy9BM0ZCQVhZaEFnc2dCVUgvLy84QWNTRUhJQUFvQWdRaEJpQUFLQUlBSVFVRFFDQUJRZi8vQTNFZ0FrSC8vd054VHcwQ0lBRkJBV29oQVNBRklBY2dCaWdDRUJFREFFVU5BQXNNQWdzZ0FDZ0NBQ0FBS0FJRUlBTVFxZ0VoQVNBQUlBazNBZ2dNQWdzZ0JTQUdJQU1RcWdFTkFDQUVJQUpyUWYvL0EzRWhCRUVBSVFJRFFDQUVJQUpCLy84RGNVMEVRRUVBSVFFZ0FDQUpOd0lJREFNTFFRRWhBU0FDUVFGcUlRSWdCU0FISUFZb0FoQVJBd0JGRFFBTElBQWdDVGNDQ0F3QkMwRUJJUUVMSUFOQkVHb2tBQ0FCQzdNRUFRUi9Jd0JCZ0FGcklnUWtBQUpBQWtBQ1FDQUJLQUlJSWdKQmdJQ0FFSEZGQkVBZ0FrR0FnSUFnY1EwQklBQW9BZ0FnQVJESEFVVU5Ba0VCSVFJTUF3c2dBQ2dDQUNFQ1FZRUJJUU1EUUNBRElBUnFRUUpySUFKQkQzRWlCVUV3Y2lBRlFkY0FhaUFGUVFwSkd6b0FBQ0FEUVFGcklRTWdBa0VRU1NBQ1FRUjJJUUpGRFFBTFFRRWhBaUFCUVFGQjNQYkFBRUVDSUFNZ0JHcEJBV3RCZ1FFZ0Eyc1Fnd0ZGRFFFTUFnc2dBQ2dDQUNFQ1FZRUJJUU1EUUNBRElBUnFRUUpySUFKQkQzRWlCVUV3Y2lBRlFUZHFJQVZCQ2trYk9nQUFJQU5CQVdzaEF5QUNRUTlMSUFKQkJIWWhBZzBBQzBFQklRSWdBVUVCUWR6MndBQkJBaUFESUFScVFRRnJRWUVCSUFOckVJTUJEUUVMSUFFb0FnQkIrL1BBQUVFQ0lBRW9BZ1FvQWd3UkFnQUVRRUVCSVFJTUFRc0NRQ0FCS0FJSUlnSkJnSUNBRUhGRkJFQWdBa0dBZ0lBZ2NRMEJJQUFvQWdRZ0FSREhBU0VDREFJTElBQW9BZ1FoQWtHQkFTRURBMEFnQXlBRWFrRUNheUFDUVE5eElnQkJNSElnQUVIWEFHb2dBRUVLU1JzNkFBQWdBMEVCYXlFRElBSkJEMHNnQWtFRWRpRUNEUUFMSUFGQkFVSGM5c0FBUVFJZ0F5QUVha0VCYTBHQkFTQURheENEQVNFQ0RBRUxJQUFvQWdRaEFrR0JBU0VEQTBBZ0F5QUVha0VDYXlBQ1FROXhJZ0JCTUhJZ0FFRTNhaUFBUVFwSkd6b0FBQ0FEUVFGcklRTWdBa0VQU3lBQ1FRUjJJUUlOQUFzZ0FVRUJRZHoyd0FCQkFpQURJQVJxUVFGclFZRUJJQU5yRUlNQklRSUxJQVJCZ0FGcUpBQWdBZ3VaQkFJRmZ3UitJQUJCQ0dvaEJDQUJRVDl4clNFSUlBQW9BZ0FoQWtFQUlRRUNRQUpBQWtBRFFDQUJJQUpHQkVBZ0IxQU5BeUFISUFpSVVFVUVRQ0FDSVFFTUF3c2dBaUVCQTBBZ0FVRUJhaUVCSUFkQ0NuNGlCeUFJaUZBTkFBc01BZ3NnQVVHQUJrY0VRQ0FBSUFGcUlBRkJBV29oQVVFSWFqRUFBQ0FIUWdwK2ZDSUhJQWlJVUEwQkRBSUxDMEdBQmtHQUJrR3N6OEFBRU1ZRUFBc2dBQ0FBS0FJRUlBRnJRUUZxSWdNMkFnUWdBMEdCY0VnRVFDQUFRUUE2QUlnR0lBQkNBRGNDQUE4TFFuOGdDSVpDZjRVaENnSkFBa0FDUUNBQklBSkpCRUJCQUNBQ2F5RUZJQUZCQ0dvaEF5QUNJQUZySVFKQmdBWWdBU0FCUVlBR1R4dEJnQVpySVFaQkNDRUJBMEFnQVNBR2FrRUlSZzBDSUFBZ0Eyb3hBQUFnQUNBQmFpQUhJQWlJUEFBQUlBY2dDb05DQ241OElRY2dBVUVCYWlFQklBVWdBMEVCYWlJRGFrRUlSdzBBQ3lBSFVBMEREQUlMUVFBaEFpQUhRZ0JTRFFFZ0FFRUFOZ0lBREFNTElBTkJDR3RCZ0FaQnZNL0FBQkRHQkFBTEEwQWdCeUlKSUFxRFFncCtJUWNnQ1NBSWlLY2hBUUpBSUFKQmdBWlBCRUFnQVVIL0FYRkZEUUVnQUVFQk9nQ0lCZ3dCQ3lBQ0lBUnFJQUU2QUFBZ0FrRUJhaUVDQ3lBSFFnQlNEUUFMQ3lBQUlBSTJBZ0FnQWtHQUJrc05BU0FDUVFkcUlRRURRQ0FBSUFGcUxRQUFEUUVnQUNBQlFRaHJOZ0lBSUFGQkFXc2lBVUVIUncwQUN3c1BDeUFDUVFGclFZQUdRWXpQd0FBUXhnUUFDOWtFQWdSL0FuNGpBRUdnQVdzaUFpUUFJQUVvQWdRaEJTQUJLQUlBSVFRQ1FBSkFBa0FDUUFKQUFrQUNRQU5BSUFNZ0JVWU5BU0FESUFScUxRQUFRVHByUWY4QmNVSDJBVThFUUNBRFFRRnFJUU1NQVFzTEFrQWdBMFVFUUNBQ1FSQTZBSkFCSUFJZ0JUWUNmQ0FDSUFRMkFuZ2dBa0tBZ0lDQUVEY0NjQ0FDSUFFcEFoQTNBb2dCSUFJZ0FTa0NDRGNDZ0FFTUFRc2dBa0h3QUdvZ0FTQURFTFFJSUFJb0FuQU5BQ0FDS0FKMFJRMENDeUFDUVNocUlBSkI4QUJxUVREOENnQUFEQUlMUVFFaEF5QUNRUUUyQW5nZ0FrSUFOd0p3SUFVTkFDQUNRUkE2QUVnZ0FrRUFOZ0kwSUFJZ0FTa0NFRGNDUUNBQ0lBRXBBZ2czQWpnTUFnc2dBa0VvYWlBQklBVVF0QWdMSUFJb0FqQWhCQ0FDS0FJc0lRTWdBaWdDS0NJQkRRSWdBMFVOQVFzZ0FrSG9BR29nQWtIRUFHb3BBZ0EzQXdBZ0FrSGdBR29nQWtFOGFpa0NBRGNEQUNBQ0lBSXBBalEzQTFnTElBQWdBaWtEV0RjQ0RDQUFJQVEyQWdnZ0FDQUROZ0lFSUFCQkFEWUNBQ0FBUVJ4cUlBSkI2QUJxS1FNQU53SUFJQUJCRkdvZ0FrSGdBR29wQXdBM0FnQU1BUXNnQWtIb0FHb2dBa0hFQUdvcEFnQWlCamNEQUNBQ1FlQUFhaUFDUVR4cUtRSUFJZ2MzQXdBZ0FrRWdhaUFDUWRRQWFpZ0NBRFlDQUNBQ1FRaHFJQWMzQXdBZ0FrRVFhaUFHTndNQUlBSWdBaWtDTkNJR053TllJQUlnQWlrQ1REY0RHQ0FBSUFZM0Fnd2dBRUVVYWlBSFBnSUFJQUFnQWlrQ0REY0NHQ0FBUVNCcUlBSkJGR29wQWdBM0FnQWdBRUVvYWlBQ1FSeHFLUUlBTndJQUlBQWdCRFlDQ0NBQUlBTTJBZ1FnQUNBQk5nSUFDeUFDUWFBQmFpUUFDL0lEQVFaL0l3QkJNR3NpQlNRQUFrQUNRQ0FDUlFSQUlBQkJBRFlDQ0NBQVFvQ0FnSUFRTndJQURBRUxJQUZCREdvaENDQUVJQUpCREd3aUIwRU1heUlKUVF4dWJDRUNJQUVoQmdKQUEwQWdCMFVOQVNBSFFReHJJUWNnQWlBR0tBSUlJQUpxSWdKTElBWkJER29oQmtVTkFBdEJvTVRKQUVFMVFhREZ5UUFRL1FRQUN5QUZRUmhxSUFKQkFVRUJFTEFESUFVb0Fod2hCZ0pBSUFVb0FoaEJBVWNFUUNBRlFRQTJBaFFnQlNBRktBSWdOZ0lRSUFVZ0JqWUNEQ0FGUVF4cUlBRW9BZ1FpQmlBR0lBRW9BZ2hxRU1nR0lBSWdCU2dDRkNJQmF5RUhJQVVvQWhBZ0FXb2hCaUFFUVFGeEJFQURRQ0FKUlEwRElBZEZEUVVnQ0NnQ0NDRUJJQWdvQWdRaEJDQUdJQU10QUFBNkFBQWdCMEVCYXlJSElBRkpEUVVnQ0VFTWFpRUlJQVpCQVdvaUJpQUJJQVFnQVJDdkJ5QUpRUXhySVFrZ0J5QUJheUVISUFFZ0Jtb2hCZ3dBQ3dBTEEwQWdDVVVOQWlBSElBZ29BZ2dpQVVrTkJDQUdJQUVnQ0NnQ0JDQUJFSzhISUFsQkRHc2hDU0FISUFGcklRY2dBU0FHYWlFR0lBaEJER29oQ0F3QUN3QUxJQVlnQlNnQ0lFR3d4Y2tBRU13SUFBc2dBQ0FGS1FJTU53SUFJQUJCQ0dvZ0FpQUhhellDQUFzZ0JVRXdhaVFBRHdzZ0JVRUFOZ0lvSUFWQkFUWUNIQ0FGUWRqTTJnQTJBaGdnQlVJRU53SWdJQVZCR0dwQndNWEpBQkNyQndBTHh3UUJCbjhqQUVFd2F5SURKQUFnQXlBQ05nSUlJQU1nQVRZQ0JDQURRU0JxSUFOQkJHb1FrQUVDUUFKQUFrQWdBeWdDSUNJR0JFQWdBeWdDSkNFQklBTW9BaXhGQkVBZ0FDQUJOZ0lJSUFBZ0JqWUNCQ0FBUVlDQWdJQjROZ0lBREFRTElBSkJBRWdOQVFKQUlBSkZCRUJCQVNFRURBRUxRWURnMmdBdEFBQWFJQUlRRmlJRVJRMERDeUFEUVFBMkFoUWdBeUFFTmdJUUlBTWdBallDRENBQklBSkxCRUFnQTBFTWFrRUFJQUVROXdJZ0F5Z0NFQ0VFSUFNb0FoUWhCU0FES0FJTUlRSUxJQUVFUUNBRUlBVnFJQVlnQWZ3S0FBQUxJQU1nQVNBRmFpSUJOZ0lVSUFJZ0FXdEJBazBFUUNBRFFReHFJQUZCQXhEM0FpQURLQUlRSVFRZ0F5Z0NGQ0VCQ3lBQklBUnFJZ0pCbktUQUFDOEFBQ0lGT3dBQUlBSkJBbXBCbnFUQUFDMEFBQ0lHT2dBQUlBTWdBVUVEYWlJQ05nSVVJQU1nQXlrQ0JEY0NHQU5BQWtBZ0EwRWdhaUFEUVJocUVKQUJJQU1vQWlBaUIwVU5BQ0FES0FJc0lBTW9BaVFpQVNBREtBSU1JQUpyU3dSQUlBTkJER29nQWlBQkVQY0NJQU1vQWhBaEJDQURLQUlVSVFJTElBRUVRQ0FDSUFScUlBY2dBZndLQUFBTElBTWdBU0FDYWlJQ05nSVVSUTBCSUFNb0Fnd2dBbXRCQWswRVFDQURRUXhxSUFKQkF4RDNBaUFES0FJUUlRUWdBeWdDRkNFQ0N5QUNJQVJxSWdFZ0JUc0FBQ0FCUVFKcUlBWTZBQUFnQXlBQ1FRTnFJZ0kyQWhRTUFRc0xJQUFnQXlrQ0REY0NBQ0FBUVFocUlBTkJGR29vQWdBMkFnQU1Bd3NnQUVFQU5nSUlJQUJDZ0lDQWdCZzNBZ0FNQWd0QjBLTEFBQkRwQmdzQUN5QURRVEJxSkFBTHlRUUNCbjhCZmdKL0lBRkZCRUFnQUNnQ0NDRUdRUzBoQ3lBRlFRRnFEQUVMUVN0QmdJREVBQ0FBS0FJSUlnWkJnSUNBQVhFaUFSc2hDeUFCUVJWMklBVnFDeUVKQWtBZ0JrR0FnSUFFY1VVRVFFRUFJUUlNQVFzZ0F3UkFJQUloQVNBRElRZ0RRQ0FISUFFc0FBQkJ2MzlLYWlFSElBRkJBV29oQVNBSVFRRnJJZ2dOQUFzTElBY2dDV29oQ1FzQ1FDQUFMd0VNSWdnZ0NVc0VRQUpBQWtBZ0JrR0FnSUFJY1VVRVFDQUlJQWxySVFsQkFDRUJRUUFoQ0FKQUFrQUNRQ0FHUVIxMlFRTnhRUUZyRGdNQUFRQUNDeUFKSVFnTUFRc2dDVUgrL3dOeFFRRjJJUWdMSUFaQi8vLy9BSEVoQ2lBQUtBSUVJUVlnQUNnQ0FDRUFBMEFnQVVILy93TnhJQWhCLy84RGNVOE5Ba0VCSVFjZ0FVRUJhaUVCSUFBZ0NpQUdLQUlRRVFNQVJRMEFDd3dFQ3lBQUlBQXBBZ2dpREtkQmdJQ0EvM2x4UWJDQWdJQUNjallDQ0VFQklRY2dBQ2dDQUNJR0lBQW9BZ1FpQ2lBTElBSWdBeERNQmcwRFFRQWhBU0FJSUFsclFmLy9BM0VoQWdOQUlBRkIvLzhEY1NBQ1R3MENJQUZCQVdvaEFTQUdRVEFnQ2lnQ0VCRURBRVVOQUFzTUF3dEJBU0VISUFBZ0JpQUxJQUlnQXhETUJnMENJQUFnQkNBRklBWW9BZ3dSQWdBTkFpQUpJQWhyUWYvL0EzRWhBa0VBSVFFRFFDQUNJQUZCLy84RGNVMEVRRUVBRHdzZ0FVRUJhaUVCSUFBZ0NpQUdLQUlRRVFNQVJRMEFDd3dDQ3lBR0lBUWdCU0FLS0FJTUVRSUFEUUVnQUNBTU53SUlRUUFQQzBFQklRY2dBQ2dDQUNJQklBQW9BZ1FpQUNBTElBSWdBeERNQmcwQUlBRWdCQ0FGSUFBb0Fnd1JBZ0FoQndzZ0J3dllCQUVGZnlNQVFUQnJJZ0VrQUNBQUtBSUFJZ1VFUUNBQklBVTJBaGdnQVVFQU5nSVVJQUVnQlRZQ0NDQUJRUUEyQWdRZ0FTQUFLQUlFSWdJMkFod2dBU0FDTmdJTVFRRWhBeUFBS0FJSUlRSUxJQUVnQWpZQ0lDQUJJQU0yQWhBZ0FTQUROZ0lBQWtBQ1FBSkFBMEFnQWtVRVFDQUJLQUlBUVFGeFJRMEVJQUVvQWdnaEF5QUJLQUlFSWdJTkF5QUJLQUlNSVFBZ0F5RUNBMEFnQUFSQUlBQkJBV3NoQUNBQ0tBTGtBU0VDREFFRlFRQWhBd3dGQ3dBTEFBc2dBU0FDUVFGck5nSWdBa0FDUUNBQktBSUFJZ0JCQVVjTkFDQUJLQUlFRFFBZ0FTZ0NDQ0VDSUFFb0Fnd2hBd05BSUFNRVFDQURRUUZySVFNZ0FpZ0M1QUVoQWd3QkJTQUJRZ0EzQWdnZ0FTQUNOZ0lFSUFGQkFUWUNBQXdEQ3dBTEFBc2dBRVVOQWlBQktBSUVJUUlMSUFFb0Fnd2hBQ0FCS0FJSUlRTUNRQU5BSUFJdkFlSUJJQUJOQkVBZ0FVRWthaUFDSUFNUXJBVWdBU2dDSkNJQ1JRMENJQUVvQWl3aEFDQUJLQUlvSVFNTUFRc0xJQUJCQVdvaEJBSkFJQU5GQkVBZ0FpRUZEQUVMSUFJZ0JFRUNkR3BCNUFGcUlRUURRQ0FFS0FJQUlnVkI1QUZxSVFRZ0EwRUJheUlERFFBTFFRQWhCQXNnQVNBRU5nSU1JQUZCQURZQ0NDQUJJQVUyQWdRZ0FrVU5CQ0FDSUFCQkRHeHFJZ01vQWx3Z0EwSGdBR29vQWdBUXFRa2dBaUFBUVFOMGFpSUFLQUlBSWdJZ0FpZ0NBQ0lDUVFGck5nSUFJQUpCQVVZRVFDQUFFSU1FQ3lBQktBSWdJUUlNQVFzTFFmQ1h5UUFRdXdrQUMwSGd3OGtBRUxzSkFBc0RRQ0FCUVNScUlBSWdBeENzQlNBQktBSWtJZ0pGRFFFZ0FTZ0NLQ0VEREFBTEFBc2dBVUV3YWlRQUM3b0VBUWgvSXdCQkVHc2lBeVFBSUFNZ0FUWUNCQ0FESUFBMkFnQWdBMEtnZ0lDQURqY0NDQUovQWtBQ1FBSkFJQUlvQWhBaUNRUkFJQUlvQWhRaUFBMEJEQUlMSUFJb0Fnd2lBRVVOQVNBQ0tBSUlJZ0VnQUVFRGRHb2hCQ0FBUVFGclFmLy8vLzhCY1VFQmFpRUdJQUlvQWdBaEFBTkFBa0FnQUVFRWFpZ0NBQ0lGUlEwQUlBTW9BZ0FnQUNnQ0FDQUZJQU1vQWdRb0Fnd1JBZ0JGRFFCQkFRd0ZDMEVCSUFFb0FnQWdBeUFCUVFScUtBSUFFUU1BRFFRYUlBQkJDR29oQUNBRUlBRkJDR29pQVVjTkFBc01BZ3NnQUVFWWJDRUtJQUJCQVd0Qi8vLy8vd0Z4UVFGcUlRWWdBaWdDQ0NFRUlBSW9BZ0FoQUFOQUFrQWdBRUVFYWlnQ0FDSUJSUTBBSUFNb0FnQWdBQ2dDQUNBQklBTW9BZ1FvQWd3UkFnQkZEUUJCQVF3RUMwRUFJUWRCQUNFSUFrQUNRQUpBSUFVZ0NXb2lBVUVJYWk4QkFFRUJhdzRDQVFJQUN5QUJRUXBxTHdFQUlRZ01BUXNnQkNBQlFReHFLQUlBUVFOMGFpOEJCQ0VJQ3dKQUFrQUNRQ0FCTHdFQVFRRnJEZ0lCQWdBTElBRkJBbW92QVFBaEJ3d0JDeUFFSUFGQkJHb29BZ0JCQTNScUx3RUVJUWNMSUFNZ0J6c0JEaUFESUFnN0FRd2dBeUFCUVJScUtBSUFOZ0lJUVFFZ0JDQUJRUkJxS0FJQVFRTjBhaUlCS0FJQUlBTWdBU2dDQkJFREFBMERHaUFBUVFocUlRQWdCVUVZYWlJRklBcEhEUUFMREFFTEN3SkFJQVlnQWlnQ0JFOE5BQ0FES0FJQUlBSW9BZ0FnQmtFRGRHb2lBQ2dDQUNBQUtBSUVJQU1vQWdRb0Fnd1JBZ0JGRFFCQkFRd0JDMEVBQ3lBRFFSQnFKQUFMeWdRQkVIOGpBRUdRQVdzaUNTUUFBa0FDUUFKQUlBRUVRQ0FCSUFBb0Fnd2lCaThCOWdZaUIyb2lDMEVNVHcwQklBQW9BaFFpQkM4QjlnWWlDQ0FCU1EwQ0lBWWdDenNCOWdZZ0JDQUlJQUZySWdnN0FmWUdJQVJCMkFCcUlnd2dBVUhJQUd4cUlRMGdCQ0FCUVFGcklnTkJBM1JxSWdVb0FnQWhEaUFGTHdFRUlRcEJBQ0lGUlFSQUlBa2dEVUhJQUd0QnlBRDhDZ0FBQ3lBQUtBSUFJZzhnQUNnQ0NDSVFRUU4wYWlJQ0x3RUVJUkVnQWlBS093RUVJQUlvQWdBaENpQUNJQTQyQWdBZ0R5QVFRY2dBYkdwQjJBQnFJUUlnQlVVRVFDQUpRY2dBYWlBQ1FjZ0EvQW9BQUFzZ0JVVUVRQ0FDSUFsQnlBRDhDZ0FBQ3lBR0lBZEJBM1JxSWdJZ0VUc0JCQ0FDSUFvMkFnQWdCaUFIUWNnQWJHb2hBaUFGUlFSQUlBSkIyQUJxSUFsQnlBQnFRY2dBL0FvQUFBc2dCQ0FESUFZZ0IwRUJhaUlIUVFOMGFpQURFUE1HSUF3Z0F5QUNRYUFCYWlBREVQY0dJQWhCQTNRaUF3UkFJQVFnQkNBQlFRTjBhaUFEL0FvQUFBc2dDRUhJQUd3aUF3UkFJQXdnRFNBRC9Bb0FBQXNnQUNnQ0dDRURBa0FnQUNnQ0VDSUZCRUFnQTBVTkJTQUVRZmdHYWlJQUlBRWdCaUFIUVFKMGFrSDRCbW9nQVJEeUJpQUlRUUowUVFScUlnSUVRQ0FBSUFBZ0FVRUNkR29nQXZ3S0FBQUxJQVlnQlNBSElBdEJBV29RbmdVZ0JDQURRUUFnQ0VFQmFoQ2VCUXdCQ3lBRERRUUxJQWxCa0FGcUpBQVBDMEdZazhrQVFSdEIrSlRKQUJDY0JnQUxRWWlWeVFCQk1rRzhsY2tBRUp3R0FBdEJ6SlhKQUVFb1FmU1Z5UUFRbkFZQUMwSEFsTWtBUVNoQmhKYkpBQkNjQmdBTG1RUUNDWDhFZmdKQUlBQW9BZ0FpQWtVTkFBSkFBa0FDUUNBQlFUOXhJZ2hCQVhSQjdNL0FBR29pQVM4QkFDSURRZjhQY1NJRVFaMEtTUVJBSUFOQkMzWWhBMEVBSUFKcklRVWdBRUVJYWlFSklBUWdBUzhCQWtIL0QzRnJJUXBCNUhVaEFRTkFJQUVnQ21wQjVIVkdEUVFnQVNBRWFpSUdSUTBFSUFFZ0JXcEI1SFZHRFFJZ0FVSGtlMFlOQXlBQklBbHFJQUZCQVdvaEFVR2NDbW90QUFBaUJ5QUdRWXJid0FCcUxRQUFJZ1pHRFFBTElBTWdCaUFIUzJzaEF3d0RDeUFFUVp3S1FZemJ3QUFRdVFrQUN5QURRUUZySVFNTUFRdEJnQVpCZ0FaQm5OdkFBQkRHQkFBTElBQkJCMm9pQkNBRGFpRUZJQWl0SVE0RFFDQUNJZ0ZCQVdzaEFnSkFBa0FnQVVHQkJra0VRQ0FCSUFScU1RQUFJQTZHSUExOElnc2dDMElLZ0NJTlFuWitmQ0VNSUFJZ0EycEJnQVpKRFFFZ0RGQU5BaUFBUVFFNkFJZ0dEQUlMSUFKQmdBWkJuTS9BQUJER0JBQUxJQUVnQldvZ0REd0FBQXNnQWcwQUN5QUxRZ3BhQkVBZ0EwRUhhaUVDQTBBZ0RTSUxJQXRDQ29BaURVSjJmbndoREFKQUlBSkJDR3RCZ0FaUEJFQWdERkFOQVNBQVFRRTZBSWdHREFFTElBQWdBbW9nRER3QUFBc2dBa0VCYXlFQ0lBdENDbG9OQUFzTElBQWdBQ2dDQkNBRGFqWUNCQ0FBUVlBR0lBQW9BZ0FnQTJvaUFTQUJRWUFHVHhzaUFqWUNBQ0FCUlEwQUlBSkJCMm9oQWdOQUlBQWdBbW90QUFBTkFTQUFJQUpCQ0dzMkFnQWdBa0VCYXlJQ1FRZEhEUUFMQ3d2QkJBRU9meU1BUVpBQmF5SUdKQUFDUUFKQUFrQWdBUVJBSUFFZ0FDZ0NGQ0lFTHdIMkJpSUNhaUlKUVF4UERRRWdBQ2dDRENJSEx3SDJCaUlJSUFGSkRRSWdCeUFJSUFGcklnTTdBZllHSUFRZ0NUc0I5Z1lnQWtFRGRDSUZCRUFnQkNBQlFRTjBhaUFFSUFYOENnQUFDeUFFUWRnQWFpSUZJQUZCeUFCc2FpRU1JQUpCeUFCc0lnSUVRQ0FNSUFVZ0F2d0tBQUFMSUFjZ0EwRUJhaUlOUVFOMGFpQUlJQTFySWdJZ0JDQUJRUUZySWdnUTh3WWdCeUFEUWNnQWJHb2lDa0dnQVdvZ0FpQUZJQWdROXdZZ0J5QURRUU4wYWlJREtBSUFJUVVnQXk4QkJDRUxRUUFpQTBVRVFDQUdJQXBCMkFCcVFjZ0EvQW9BQUFzZ0FDZ0NBQ0lLSUFBb0FnZ2lEa0VEZEdvaUFpOEJCQ0VQSUFJZ0N6c0JCQ0FDS0FJQUlRc2dBaUFGTmdJQUlBb2dEa0hJQUd4cVFkZ0FhaUVDSUFORkJFQWdCa0hJQUdvZ0FrSElBUHdLQUFBTElBTkZCRUFnQWlBR1FjZ0EvQW9BQUFzZ0JDQUlRUU4wYWlJQ0lBODdBUVFnQWlBTE5nSUFJQU5GQkVBZ0RFSElBR3NnQmtISUFHcEJ5QUQ4Q2dBQUN5QUFLQUlZSVFNQ1FDQUFLQUlRQkVBZ0EwVU5CU0FFUWZnR2FpRUFJQWxCQVdvaUFpQUJhMEVDZENJSkJFQWdBQ0FCUVFKMGFpQUFJQW44Q2dBQUN5QUhJQTFCQW5ScVFmZ0dhaUFCSUFBZ0FSRHlCaUFFSUFOQkFDQUNFSjRGREFFTElBTU5CQXNnQmtHUUFXb2tBQThMUVppVHlRQkJHMEcwazhrQUVKd0dBQXRCeEpQSkFFRXpRZmlUeVFBUW5BWUFDMEdJbE1rQVFTZEJzSlRKQUJDY0JnQUxRY0NVeVFCQktFSG9sTWtBRUp3R0FBdXBCUUlHZndGOEl3QkI4QUJySWdJa0FDQUNJQUUyQWh3Q1FDQUFRU0JxSUFKQkhHb1Fxd0lpQVFSQUlBRXJBd0FoQ0F3QkN5QUNJQUFvQWl3MkFqZ2dBaUFBS0FJZ0lnRTJBakFnQWlBQlFRaHFOZ0lvSUFJZ0FTQUFLQUlrYWtFQmFqWUNMQ0FDSUFFcEF3QkNmNFZDZ0lHQ2hJaVFvTUNBZjRNM0F5QWdBa0VRYWlBQ1FTQnFFS0VEQWtBZ0FpZ0NFQ0lCUlFSQVFRUWhBd3dCQ3lBQ0tBSVVJUVFnQWtFSWFrRUVJQUpCT0dvaUJpZ0NBRUVCYWlJRFFYOGdBeHNpQXlBRFFRUk5HMEVFUVFoQitQak5BQkNhQlNBQ0tBSUlJUVVnQWlnQ0RDSURJQVEyQWdRZ0F5QUJOZ0lBSUFKQkFUWUNUQ0FDSUFNMkFrZ2dBaUFGTmdKRUlBSkI2QUJxSUFZcEF3QTNBd0FnQWtIZ0FHb2dBa0V3YWlrREFEY0RBQ0FDUWRnQWFpQUNRU2hxS1FNQU53TUFJQUlnQWlrRElEY0RVRUVBSVFSQkFTRUJBMEFnQWlBQ1FkQUFhaENoQXlBQ0tBSUFJZ1lFUUNBQ0tBSUVJUVVnQWlnQ1JDQUJSZ1JBSUFKQnhBQnFJQUVnQWlnQ2FFRUJhaUlEUVg4Z0F4dEJCRUVJRU9FRklBSW9Ba2doQXdzZ0F5QUVhaUlIUVF4cUlBVTJBZ0FnQjBFSWFpQUdOZ0lBSUFJZ0FVRUJhaUlCTmdKTUlBUkJDR29oQkF3QkN3c2dBaWdDUkNFR0lBSW9Ba2doQXlBQlFRSkpEUUFnQVVFVlR3UkFJd0JCa0NCcklnUWtBQUpBUWNDRVBTQUJJQUZCd0lROVR4c2lCU0FCSUFGQkFYWnJJZ2NnQlNBSFN4c2lCVUdCQkU4RVFDQUVRUWhxSUFWQkJFRUlRYnlnMGdBUW1nVWdBeUFCSUFRb0Fnd2lCU0FFS0FJSUlnY2dBVUhCQUVrUU9TQUhJQVVRcGdrTUFRc2dBeUFCSUFSQkVHcEJnQVFnQVVIQkFFa1FPUXNnQkVHUUlHb2tBQXdCQ3lBRFFRaHFJUUVEUUNBRVJRMEJJQU1nQVJEZkJDQUVRUWhySVFRZ0FVRUlhaUVCREFBTEFBc2dBQ3NEUUNFSUlBWWdBeENtQ1FzZ0FrSHdBR29rQUNBSUM4VUVBUWgvSUFBZ0FDZ0NHQ0lDUVJaM1FiLysvUGtEY1NBQ1FSNTNRY0NCZzRaOGNYSWlBU0FDY3lJRUlBQW9BaHdpQWtFV2QwRy8vdno1QTNFZ0FrRWVkMEhBZ1lPR2ZIRnlJZ01nQW5NaUFrRU1kMEdQbnJ6NEFIRWdBa0VVZDBIdzRjT0hmM0Z5Y3lBRGN6WUNIQ0FBSUFFZ0FDZ0NGQ0lCUVJaM1FiLysvUGtEY1NBQlFSNTNRY0NCZzRaOGNYSWlBeUFCY3lJQklBUkJESGRCajU2OCtBQnhJQVJCRkhkQjhPSERoMzl4Y25Oek5nSVlJQUFnQUNnQ0VDSUVRUlozUWIvKy9Qa0RjU0FFUVI1M1FjQ0JnNFo4Y1hJaUJTQUVjeUlFSUFGQkRIZEJqNTY4K0FCeElBRkJGSGRCOE9IRGgzOXhjbk1nQTNNMkFoUWdBQ0FBS0FJRUlnRkJGbmRCdi83OCtRTnhJQUZCSG5kQndJR0Robnh4Y2lJSUlBRnpJZ0VnQUNnQ0NDSURRUlozUWIvKy9Qa0RjU0FEUVI1M1FjQ0JnNFo4Y1hJaUJpQURjeUlEUVF4M1FZK2V2UGdBY1NBRFFSUjNRZkRodzRkL2NYSnpJQVp6TmdJSUlBQWdBQ2dDQUNJR1FSWjNRYi8rL1BrRGNTQUdRUjUzUWNDQmc0WjhjWElpQnlBR2N5SUdRUXgzUVkrZXZQZ0FjU0FHUVJSM1FmRGh3NGQvY1hJZ0IzTWdBbk0yQWdBZ0FDQUZJQUFvQWd3aUJVRVdkMEcvL3Z6NUEzRWdCVUVlZDBIQWdZT0dmSEZ5SWdjZ0JYTWlCU0FFUVF4M1FZK2V2UGdBY1NBRVFSUjNRZkRodzRkL2NYSnpjeUFDY3pZQ0VDQUFJQU1nQlVFTWQwR1Bucno0QUhFZ0JVRVVkMEh3NGNPSGYzRnljeUFIY3lBQ2N6WUNEQ0FBSUFZZ0FVRU1kMEdQbnJ6NEFIRWdBVUVVZDBIdzRjT0hmM0Z5Y3lBSWN5QUNjellDQkF1MUJBRUlmeUFBSUFBb0FoZ2lBa0VTZDBHRGhvd1ljU0FDUVJwM1FmejU4MmR4Y2lJQklBSnpJZ1FnQUNnQ0hDSUNRUkozUVlPR2pCaHhJQUpCR25kQi9QbnpaM0Z5SWdNZ0FuTWlBa0VNZDBHUG5yejRBSEVnQWtFVWQwSHc0Y09IZjNGeWN5QURjellDSENBQUlBRWdBQ2dDRkNJQlFSSjNRWU9HakJoeElBRkJHbmRCL1BuelozRnlJZ01nQVhNaUFTQUVRUXgzUVkrZXZQZ0FjU0FFUVJSM1FmRGh3NGQvY1hKemN6WUNHQ0FBSUFBb0FoQWlCRUVTZDBHRGhvd1ljU0FFUVJwM1FmejU4MmR4Y2lJRklBUnpJZ1FnQVVFTWQwR1Bucno0QUhFZ0FVRVVkMEh3NGNPSGYzRnljeUFEY3pZQ0ZDQUFJQUFvQWdRaUFVRVNkMEdEaG93WWNTQUJRUnAzUWZ6NTgyZHhjaUlJSUFGeklnRWdBQ2dDQ0NJRFFSSjNRWU9HakJoeElBTkJHbmRCL1BuelozRnlJZ1lnQTNNaUEwRU1kMEdQbnJ6NEFIRWdBMEVVZDBIdzRjT0hmM0Z5Y3lBR2N6WUNDQ0FBSUFBb0FnQWlCa0VTZDBHRGhvd1ljU0FHUVJwM1FmejU4MmR4Y2lJSElBWnpJZ1pCREhkQmo1NjgrQUJ4SUFaQkZIZEI4T0hEaDM5eGNpQUhjeUFDY3pZQ0FDQUFJQVVnQUNnQ0RDSUZRUkozUVlPR2pCaHhJQVZCR25kQi9QbnpaM0Z5SWdjZ0JYTWlCU0FFUVF4M1FZK2V2UGdBY1NBRVFSUjNRZkRodzRkL2NYSnpjeUFDY3pZQ0VDQUFJQU1nQlVFTWQwR1Bucno0QUhFZ0JVRVVkMEh3NGNPSGYzRnljeUFIY3lBQ2N6WUNEQ0FBSUFZZ0FVRU1kMEdQbnJ6NEFIRWdBVUVVZDBIdzRjT0hmM0Z5Y3lBSWN5QUNjellDQkF2R0JBSUxmd0orSXdCQmdBRnJJZ0lrQUNBQ1FVQnJRWnpQeVFCQkFTQUJFTDBDSUFJb0FsZ2hBeUFDS0FKVUlRRWdBaWdDVUNFRUlBSXBBa2doRFNBQ0tBSkVJUVVDZndKQUFrQWdBaWdDUUNJR1FRTkhCRUFnQWlnQ1hDRUhEQUVMSUFJZ0F6WUNMQ0FDSUFFMkFpZ2dBaUFFTmdJa0lBSWdEVGNDSENBQ0lBVTJBaGdnQWtGQWEwSGtBQ0FDUVJocUVCa2dBa0U0YWlJSUlBSkIwQUJxS0FJQU5nSUFJQUlnQWlrQ1NEY0RNQ0FDS0FKZ0lRY2dBaWdDWENFRElBSW9BbGdoQVNBQ0tBSlVJUVFnQWlnQ1JDRUdJQUlvQWtCQkFVWUVRQ0FDUVJCcUlBZ29BZ0EyQWdBZ0FpQUNLUU13SWcwM0F3Z2dEYWNoQlNBQ0tRSU1JUTBNQVFzZ0FrSDBBR29nQ0NnQ0FEWUNBQ0FDSUFZMkFtZ2dBaUFDS1FNd053SnNJQUlnQVRZQ2ZDQUNJQVEyQW5nZ0FpZ0NaQ0VKSUFKQlFHdEJrNVhTQUVFQklBSkI2QUJxRUwwQ0lBSW9BbGdoQ0NBQ0tBSlVJUUVnQWlnQ1VDRUVJQUlwQWtnaERTQUNLQUpFSVFVZ0FpZ0NRQ0lHUVFOR0RRRWdBaWdDWENBRElBY1FxUWtnQ0NFRElRY0xJQUFnRFRjQ0RDQUFJQVUyQWdnZ0FDQUdOZ0lFUVNBaEJrRWNJUXBCR0NFTFFSUWhERUVCREFFTElBSWdCRFlDRUNBQ0lBMDNBd2dnQWlrQ0RDRU9JQUFnQVRZQ0ZDQUFJQTQzQWd3Z0FDQU5QZ0lJSUFBZ0JUWUNCRUVrSVFaQklDRUtRUndoQzBFWUlRd2dDQ0VFSUFNaEFTQUhJUU1nQ1NFSFFRQUxJUVVnQUNBTWFpQUVOZ0lBSUFBZ0Myb2dBVFlDQUNBQUlBcHFJQU0yQWdBZ0FDQUZOZ0lBSUFBZ0Jtb2dCellDQUNBQ1FZQUJhaVFBQzZVRUFRZC9Jd0JCc0FGcklnSWtBQ0FDSUFFb0FoUWlBellDZkNBQ0lBRW9BaEFpQkRZQ2VDQUNJQUVvQWd3aUJUWUNkQ0FDSUFFb0FnZ2lCallDY0NBQ0lBRW9BZ1FpQnpZQ2JDQUNJQUVvQWdBaUFUWUNhQ0FDUVFocVFaRFEwZ0JCQWlBQ1FlZ0FhaERmQVFKQUFrQUNRQUpBSUFJb0FnaEZCRUFnQWlnQ0RFRUJhdzRDQXdJQkN5QUFJQUpCQ0dwQk1Qd0tBQUFNQXdzZ0FDQUNRUWhxUVREOENnQUFEQUlMSUFBZ0FrRUlha0V3L0FvQUFBd0JDeUFDSUFNMkFud2dBaUFFTmdKNElBSWdCVFlDZENBQ0lBWTJBbkFnQWlBSE5nSnNJQUlnQVRZQ2FDQUNRVGhxSWdoQm9PREtBRUVCSUFKQjZBQnFFTjhCSUFJb0FqZ0VRQ0FBSUFoQk1Qd0tBQUFNQVFzQ1FBSkFBa0FnQWlnQ1BFRUJhdzRDQWdFQUN5QUFJQUpCT0dwQk1Qd0tBQUFNQWdzZ0FDQUNRVGhxUVREOENnQUFEQUVMSUFJZ0F6WUNyQUVnQWlBRU5nS29BU0FDSUFVMkFxUUJJQUlnQmpZQ29BRWdBaUFITmdLY0FTQUNJQUUyQXBnQklBSkI2QUJxSWdGQmxKekpBRUVCSUFKQm1BRnFFTjhCSUFJb0FtZ0VRQ0FBSUFGQk1Qd0tBQUFNQVFzQ1FBSkFBa0FnQWlnQ2JFRUJhdzRDQVFJQUN5QUFJQUpCNkFCcVFURDhDZ0FBREFJTElBQWdBaWtDY0RjQ0NDQUFRb0NBZ0lBUU53SUFJQUJCSUdvZ0FrR0lBV29vQWdBMkFnQWdBRUVZYWlBQ1FZQUJhaWtDQURjQ0FDQUFRUkJxSUFKQitBQnFLUUlBTndJQURBRUxJQUFnQWtIb0FHcEJNUHdLQUFBTElBSkJzQUZxSkFBTDlnTUJEWDhnQUNBQUtBSVlJZ1JCRkhkQmo1NjgrQUJ4SUFSQkhIZEI4T0hEaDM5eGNpQUVjeUlGSUFBb0Fod2lBWE1pQnlBQlFSUjNRWStldlBnQWNTQUJRUngzUWZEaHc0ZC9jWElnQVhNaUFTQUFLQUlRSWdOQkZIZEJqNTY4K0FCeElBTkJISGRCOE9IRGgzOXhjaUFEY3lJS0lBQW9BaFFpQW5NaUNITWlCa0VRZDNNZ0JuTTJBaHdnQUNBRUlBSWdBa0VVZDBHUG5yejRBSEVnQWtFY2QwSHc0Y09IZjNGeWN5SUdjeUlFSUFBb0FnQWlBa0VVZDBHUG5yejRBSEVnQWtFY2QwSHc0Y09IZjNGeUlBSnpJZ3R6SWdsQkVIY2dDWE1nQVNBQ2N5SUpjellDQUNBQUlBUWdCU0FESUFBb0Fnd2lBa0VVZDBHUG5yejRBSEVnQWtFY2QwSHc0Y09IZjNGeUlBSnpJZ1Z6SUFGeklneHpJZ05CRUhkeklBTnpOZ0lZSUFBZ0NDQUNJQUFvQWdnaUEwRVVkMEdQbnJ6NEFIRWdBMEVjZDBIdzRjT0hmM0Z5SUFOeklnMXpJQUZ6SWdJZ0JpQUhjM01pQmtFUWQzTWdCbk0yQWhRZ0FDQUNJQUVnQ3lBQUtBSUVJZ0Z6Y3lJSUlBUWdCWE56SWdWQkVIZHpJQVZ6TmdJTUlBQWdBeUFCSUFGQkZIZEJqNTY4K0FCeElBRkJISGRCOE9IRGgzOXhjbk1pQVhNaUF5QUhJQTF6SUFseklnSkJFSGR6SUFKek5nSUlJQUFnQVNBRUlBZHpJZ0Z6SWdRZ0JFRVFkM01nQ0hNMkFnUWdBQ0FCSUFOeklBcHpJZ0FnQUVFUWQzTWdESE0yQWhBTG1RVUJBbjhqQUVFUWF5SUNKQUFDZndKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRRUVUSUFBb0FnQWlBQ2dDQUVHRGdNUUFheUlESUFOQkZVOGJRUUZyRGhRQkFnTUVCUVlIQ0FrS0N3d05EZzhRRVJJVEZBQUxJQUVvQWdCQjB0L0pBRUVZSUFFb0FnUW9BZ3dSQWdBTUZBc2dBU2dDQUVIcTM4a0FRUTRnQVNnQ0JDZ0NEQkVDQUF3VEN5QUJLQUlBUWZqZnlRQkJEeUFCS0FJRUtBSU1FUUlBREJJTElBRW9BZ0JCaCtESkFFRVVJQUVvQWdRb0Fnd1JBZ0FNRVFzZ0FTZ0NBRUdiNE1rQVFSTWdBU2dDQkNnQ0RCRUNBQXdRQ3lBQktBSUFRYTdneVFCQkVpQUJLQUlFS0FJTUVRSUFEQThMSUFFb0FnQkJ3T0RKQUVFTklBRW9BZ1FvQWd3UkFnQU1EZ3NnQVNnQ0FFSE40TWtBUVJFZ0FTZ0NCQ2dDREJFQ0FBd05DeUFCS0FJQVFkN2d5UUJCRUNBQktBSUVLQUlNRVFJQURBd0xJQUVvQWdCQjd1REpBRUVYSUFFb0FnUW9BZ3dSQWdBTUN3c2dBU2dDQUVHRjRja0FRUmNnQVNnQ0JDZ0NEQkVDQUF3S0N5QUJLQUlBUVp6aHlRQkJEaUFCS0FJRUtBSU1FUUlBREFrTElBRW9BZ0JCcXVISkFFRVBJQUVvQWdRb0Fnd1JBZ0FNQ0FzZ0FTZ0NBRUc1NGNrQVFRc2dBU2dDQkNnQ0RCRUNBQXdIQ3lBQktBSUFRY1RoeVFCQkRpQUJLQUlFS0FJTUVRSUFEQVlMSUFFb0FnQkIwdUhKQUVFUklBRW9BZ1FvQWd3UkFnQU1CUXNnQVNnQ0FFSGo0Y2tBUVJVZ0FTZ0NCQ2dDREJFQ0FBd0VDeUFCS0FJQVFmamh5UUJCRWlBQktBSUVLQUlNRVFJQURBTUxJQUVvQWdCQml1TEpBRUVUSUFFb0FnUW9BZ3dSQWdBTUFnc2dBaUFBTmdJTUlBRkJuZUxKQUVFS0lBSkJER3BCMHdBUTF3SU1BUXNnQVNnQ0FFR240c2tBUVFjZ0FTZ0NCQ2dDREJFQ0FBc2dBa0VRYWlRQUMvWURBUWgvSUFFb0FnUWlCUVJBSUFFb0FnQWhCQU5BQWtBZ0EwRUJhaUVDQW44Z0FpQURJQVJxTFFBQUlnakFJZ2xCQUU0TkFCb0NRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFoQm8vekFBR290QUFCQkFtc09Bd0FCQWd3TFFlakd5UUFnQWlBRWFpQUNJQVZQR3l3QUFFRkFUZzBMSUFOQkFtb01DZ3RCNk1iSkFDQUNJQVJxSUFJZ0JVOGJMQUFBSVFjZ0NFSGdBV3NpQmtVTkFTQUdRUTFHRFFJTUF3dEI2TWJKQUNBQ0lBUnFJQUlnQlU4YkxBQUFJUVlnQ0VId0FXc09CUVFEQXdNRkF3c2dCMEZnY1VHZ2YwY05DQXdHQ3lBSFFaOS9TZzBIREFVTElBbEJIMnBCL3dGeFFReFBCRUFnQ1VGK2NVRnVSeUFIUVVCT2NnMEhEQVVMSUFkQlFFNE5CZ3dFQ3lBSlFROXFRZjhCY1VFQ1N5QUdRVUJPY2cwRkRBSUxJQVpCOEFCcVFmOEJjVUV3VHcwRURBRUxJQVpCajM5S0RRTUxRZWpHeVFBZ0JDQURRUUpxSWdKcUlBSWdCVThiTEFBQVFiOS9TZzBDUWVqR3lRQWdCQ0FEUVFOcUlnSnFJQUlnQlU4YkxBQUFRYjkvU2cwQ0lBTkJCR29NQVF0QjZNYkpBQ0FFSUFOQkFtb2lBbW9nQWlBRlR4c3NBQUJCUUU0TkFTQURRUU5xQ3lJRElnSWdCVWtOQVFzTElBQWdBellDQkNBQUlBUTJBZ0FnQVNBRklBSnJOZ0lFSUFFZ0FpQUVhallDQUNBQUlBSWdBMnMyQWd3Z0FDQURJQVJxTmdJSUR3c2dBRUVBTmdJQUMvb0RBUVYvSXdCQmdBRnJJZ01rQUFKQUFrQUNRQ0FDUVFKTkRRQWdBUzBBQUVIK0FVY05BQ0FCTFFBQlFmOEJSdzBBSUFOQnpBQnFJQUZCQW1vZ0FrRUNheEF3SUFNb0Frd2lBVUdCZ0lDQWVFY0VRQ0FBSUFNb0FsQWlBQ0FES0FKVUVKY0ZEQUlMUWVpTHlnQVF1d2tBQ3lBRFFRQTJBaWdnQTBFQU5nSVlJQU1nQVRZQ09DQURJQUVnQW1vMkFqd2dBMEVRYWlBRFFSaHFJZ1VROWdJQ1FDQURMUUFRQkVBZ0F5MEFFU0VFSUFOQnpBQnFJZ1lnQlJDVUJFRUJJUUVnQTBFSWFrRUlJQU1vQWt4QkFXb2lBa0YvSUFJYklnSWdBa0VJVFJ0QkFVRUJRZmo0elFBUW1nVWdBeWdDQ0NFSElBTW9BZ3dpQWlBRU9nQUFJQU5CQVRZQ1NDQURJQUkyQWtRZ0F5QUhOZ0pBSUFZZ0JVRW8vQW9BQUFOQUlBTWdBMEhNQUdvaUJSRDJBaUFETFFBQUJFQWdBeTBBQVNFRUlBTW9Ba0FnQVVZRVFDQURRZlFBYWlBRkVKUUVJQU5CUUdzZ0F5Z0NkRUVCYWlJQ1FYOGdBaHNReFFjZ0F5Z0NSQ0VDQ3lBQklBSnFJQVE2QUFBZ0F5QUJRUUZxSWdFMkFrZ01BUXNMSUFOQnpBQnFFTGtJSUFNb0FrQWhCQXdCQ3lBRFFSaHFFTGtJUVFFaEFrRUFJUUVMSUFOQnpBQnFJQUlnQVJBd0lBTW9Ba3dpQVVHQmdJQ0FlRVlOQVNBQUlBTW9BbEFpQUNBREtBSlVFSmNGSUFRZ0FoRDFDUXNnQVNBQUVPRUlJQU5CZ0FGcUpBQVBDMEg0aThvQUVMc0pBQXVnQkFJQmZ3RitJd0JCa0FKcklnVWtBQ0FGUVJocVFRQkJ3UUQ4Q3dBZ0JVRUlha0hZc01rQUtRTUFOd01BSUFWQ0FEY0RFQ0FGUWRDd3lRQXBBd0EzQXdBZ0JTQURRU0FnQkNBRVFTQlBHeUlERUowQ0lBVkIrcjNKQUVFZ0lBTnJFSjBDSUFVZ0FTZ0NKQ0FCS0FJb0VOb0pJQVVnQVNnQ0dFSEFZWElRdFFjZ0JVR01BV29pQkNBQ1FaQUJha0dhdnNrQVFRSVF6d0VDUUFKQUFrQWdCU2dDakFGQm40Q0FnSGhIQkVCQmlZREVBQ0VCREFFTElBVkIrQUJxSWdRZ0JTZ0NrQUVRMndRZ0JTZ0NlRUdmZ0lDQWVFY0VRRUdRZ01RQUlRRU1BUXNnQlNnQ2ZDSUNLQUlJUlFSQVFaQ0F4QUFoQVF3Q0N5QUZRZVFBYWlJRElBSW9BZ1FRdUFRZ0JTZ0NaRUdmZ0lDQWVFY0VRQ0FERU0wQ0lBQkNnSUNBZ0lpQ3dBZzNBZ0FNQXdzZ0JTQUZLQUpvSUFVb0Ftd1FuUUlDUUNBQktRTVFJZ1pDQkZNTkFDQUJMUUJjUVFGR0RRQWdCUkRiQ1FzZ0JVR3dBV29pQWlBRlFlQUEvQW9BQUNBRlFhQUJhaUFDRUxjQlFRVWhCQUpBSUFaQ0FsY05BQ0FCS0FJRVFRTjJRUVVnQVNnQ0FCc2lCRUVRVFFSQVFUSWhBUU5BSUFGRkRRSWdCVUd3QVdvZ0JVR2dBV29nQkJDekJDQUZRYWdCYWlBRlFiZ0JhaWtBQURjREFDQUZJQVVwQUxBQk53T2dBU0FCUVFGcklRRU1BQXNBQ3lBQVFvQ0FnSUM0Z2NBSU53SUFEQU1MSUFBZ0JVR2dBV29nQkJDZ0JRd0NDeUFFRU0wQ0N5QUFRWUNBZ0lCNE5nSUFJQUFnQVRZQ0JBc2dCVUdRQW1va0FBdm1Bd0lLZndGK0lBQW9BZ1JCQVdvaUJVRURkaUFGUVFkeFFRQkhhaUVHSUFBb0FnQWlBeUVFQTBBZ0JnUkFJQVFnQkNrREFDSU5RbitGUWdlSVFvR0NoSWlRb01DQUFZTWdEVUwvL3YzNzkrL2Z2LzhBaEh3M0F3QWdCRUVJYWlFRUlBWkJBV3NoQmd3QkJRSkFJQVZCQ0U4RVFDQURJQVZxSUFNcEFBQTNBQUFNQVFzZ0JVVU5BQ0FEUVFocUlBTWdCZndLQUFBTFFRQWhCZ05BQWtBZ0JTQUdJZ1JMQkVBZ0JDQUVJQVZKYWlFR0lBQW9BZ0FpQXlBRWFpMEFBRUdBQVVjTkFpQURJQVJCZjNOQkEzUnFJUXNEUUNBRUlBRWdBQ0FFSUFJUkN3QWlEYWNpQnlBQUtBSUVJZ2h4SWdOcklBQW9BZ0FpQ1NBSUlBMFE3QU1pQ2lBRGEzTWdDSEZCQ0VrTkFpQUpJQXBxSWdNdEFBQWdBeUFIUVJsMklnTTZBQUFnQUNnQ0FDQUtRUWhySUFoeGFrRUlhaUFET2dBQUlBa2dDa0YvYzBFRGRHb2hCMEgvQVVZRVFDQUFLQUlFSVFNZ0FDZ0NBQ0FFYWtIL0FUb0FBQ0FBS0FJQUlBTWdCRUVJYTNGcVFRaHFRZjhCT2dBQUlBY2dDeWtBQURjQUFBd0VCU0FMSUFkQkFoQ25CZ3dCQ3dBTEFBc2dBQ0FBS0FJRUlnRWdBVUVCYWtFRGRrRUhiQ0FCUVFoSkd5QUFLQUlNYXpZQ0NBOExJQVFnQ1dvZ0IwRVpkaUlET2dBQUlBQW9BZ0FnQ0NBRVFRaHJjV3BCQ0dvZ0F6b0FBQXdBQ3dBTEFBc0FDK1lEQVJCL0l3QkIwQUJySWdva0FDQUJLQUlNSWdRdkFmWUdJZ3RCQVdvaUJ5QUJLQUlVSWdndkFmWUdJZ1ZxSWd4QkRFa0VRQ0FCS0FJUUlSRWdBU2dDQkNFTklBRW9BZ0FpQXk4QjlnWWhFQ0FFSUF3N0FmWUdJQU1nQVNnQ0NDSUJRUU4wYWlJQ0tBSUFJUVlnQWk4QkJDRU9JQkFnQVVGL2Myb2lDVUVEZENJUEJFQWdBaUFDUVFocUlBLzhDZ0FBQ3lBRUlBdEJBM1JxSWdJZ0Rqc0JCQ0FDSUFZMkFnQWdDQ0FGSUFRZ0IwRURkR29nQlJEekJpQURJQUZCeUFCc2FpSUdRZGdBYWlFQ1FRQWlEa1VFUUNBS1FRaHFJQUpCeUFEOENnQUFDeUFKUWNnQWJDSVBCRUFnQWlBR1FhQUJhaUFQL0FvQUFBc2dCRUhZQUdvaEFpQU9SUVJBSUFJZ0MwSElBR3hxSUFwQkNHcEJ5QUQ4Q2dBQUN5QUlRZGdBYWlBRklBSWdCMEhJQUd4cUlBVVE5d1lnQVVFQmFpRUJRZmdHSVFJZ0NVRUNkQ0lKQkVBZ0F5QUJRUUowYWlJR1FmZ0dhaUFHUWZ3R2FpQUovQW9BQUFzZ0F5QU5JQUVnRUJDZUJTQURJQU12QWZZR1FRRnJPd0gyQmlBSUlBMUJBazhFZnlBSVFmZ0dhaUFGUVFGcUlBUWdCMEVDZEdwQitBWnFJQXdnQzJzUThnWWdCQ0FSSUFjZ0RFRUJhaENlQlVHb0J3VWdBZ3RCQ0JEakJDQUFJQTAyQWdRZ0FDQUROZ0lBSUFwQjBBQnFKQUFQQzBHMGw4a0FRU3BCNEpmSkFCQ2NCZ0FMNWdNQkVIOGpBRUhRQUdzaUN5UUFJQUVvQWd3aUF5OEI5Z1lpREVFQmFpSUlJQUVvQWhRaUNTOEI5Z1lpQm1vaURVRU1TUVJBSUFFb0FoQWhFQ0FCS0FJQUlnUXZBZllHSVJFZ0F5QU5Pd0gyQmlBRUlBRW9BZ2dpQlVFRGRHb2lBaWdDQUNFSElBSXZBUVFoRGlBQktBSUVJUUVnRVNBRlFYOXphaUlLUVFOMElnOEVRQ0FDSUFKQkNHb2dEL3dLQUFBTElBTWdERUVEZEdvaUFpQU9Pd0VFSUFJZ0J6WUNBQ0FKSUFZZ0F5QUlRUU4wYWlBR0VQTUdJQVFnQlVISUFHeHFJZ2RCMkFCcUlRSkJBQ0lPUlFSQUlBdEJDR29nQWtISUFQd0tBQUFMSUFwQnlBQnNJZzhFUUNBQ0lBZEJvQUZxSUEvOENnQUFDeUFEUWRnQWFpRUNJQTVGQkVBZ0FpQU1RY2dBYkdvZ0MwRUlha0hJQVB3S0FBQUxJQWxCMkFCcUlBWWdBaUFJUWNnQWJHb2dCaEQzQmlBRlFRRnFJUVZCK0FZaEFpQUtRUUowSWdvRVFDQUVJQVZCQW5ScUlnZEIrQVpxSUFkQi9BWnFJQXI4Q2dBQUN5QUVJQUVnQlNBUkVKNEZJQVFnQkM4QjlnWkJBV3M3QWZZR0lBa2dBVUVDVHdSL0lBbEIrQVpxSUFaQkFXb2dBeUFJUVFKMGFrSDRCbW9nRFNBTWF4RHlCaUFESUJBZ0NDQU5RUUZxRUo0RlFhZ0hCU0FDQzBFSUVPTUVJQUFnRURZQ0JDQUFJQU0yQWdBZ0MwSFFBR29rQUE4TFFiU1h5UUJCS2tIZ2w4a0FFSndHQUF2S0JBSU1md0YrSXdCQk1Hc2lBeVFBSUFKQmlBSnFJUVVnQWtFSWFpRU1Ba0FEUUNBQklBcE5EUUVnQTBFWWFpQUJJQXBySWdaQmZIRWlDeUFDSUFJb0FzZ0NJZ1JCd0FCUEJIOENRQ0FDS1FQQUFpSVBRZ0JWQkVBZ0FpQVBRb0FDZlRjRHdBSWdCU0FNRUE0TUFRc2pBRUZBYWlJRUpBQWdCRUVJYWhDZkFRSkFJQVFvQWdoQkFVWUVRQ0FGS1FNd0lROE1BUXNnQlNrRE1DRVBJQVVnQkVFUWFrRXcvQW9BQUFzZ0JTQVBRb0FDZlRjRE9DQUZJQXdRRGlBRVFVQnJKQUFMSUFKQkFEWUN5QUpCQUFVZ0JBdEJBblJCQ0dvaUIyb2dCUkNoQmlBRElBTW9BaUFpQkRZQ0RDQURJQU1vQWh3aUNEWUNDQ0FESUFNb0FoZ2lDVFlDRkNBRFFRRTJBaEFnQ0VFQlJ5QUVJQWxIY2tVRVFDQUFJQXBxSWdnZ0Myb2hEU0FHUVFOeElRWURRQ0FEUVJocUlBc2dBaUFIYWlBRkVLRUdJQU1vQWlCQmZ5QURLQUljSWc0YklRUURRQ0FFQkVBZ0F5QUNJQWRxS0FJQU5nSVlJQWhCQkNBRFFSaHFRUVJCeUl2U0FCQ3NCeUFFUVFGcklRUWdCMEVFYWlFSElBdEJCR3NoQ3lBSVFRUnFJUWdNQVFVZ0RrVU5BaUFKUVFKMElRUWdCa1VnQjBHSUFrWnlSUVJBSUFNZ0FpQUhhaWdDQURZQ0dDQU5JQVlnQTBFWWFpQUdRYmlMMGdBUXJBY2dDVUVCYWlFSklBUWdCbkloQkFzZ0FpQUNLQUxJQWlBSmFqWUN5QUlnQkNBS2FpRUtEQVFMQUFzQUN3QUxDeUFEUVFBMkFoZ2pBRUVRYXlJQUpBQWdBQ0FEUVJCcU5nSU1JQUFnQTBFSWFqWUNDQ0FBUVFocVFkeWh3QUFnQUVFTWFrSGNvY0FBSUFOQkdHcEJ5SXJTQUJEb0FRQUxJQU5CTUdva0FBdmZCQUVGZnlNQVFSQnJJZ01rQUVIY0FCRDlDQ0VFUWR3QUVQMElJUUZCQ0VFRUVKOElJZ0JCeUlqQUFEWUNCQ0FBSUFFMkFnQkJLQkQ5Q0NFQ1FRaEJCQkNmQ0NJQlFjaUl3QUEyQWdRZ0FTQUNOZ0lBSUFCQjRJWEFBQ0FCUWJDTHdBQVF5UWRCS1JEOUNDRUNRUWhCQkJDZkNDSUFRY2lJd0FBMkFnUWdBQ0FDTmdJQVFlaU53QUFnQUVHNGdjQUFFTWtIUWU0QUVQMElJUUpCQ0VFRUVKOElJZ0JCeUlqQUFEWUNCQ0FBSUFJMkFnQkI2STNBQUNBQVFjQ0p3QUFReVFkQjhnQVEvUWdoQWtFSVFRUVFud2dpQUVISWlNQUFOZ0lFSUFBZ0FqWUNBRUhvamNBQUlBQkJ5SXZBQUJESkIwSDBBQkQ5Q0NFQ1FRaEJCQkNmQ0NJQVFjaUl3QUEyQWdRZ0FDQUNOZ0lBUWVpTndBQWdBRUhBajhBQUVNa0hRZUlBRVAwSUlRSkJDRUVFRUo4SUlnQkJ5SWpBQURZQ0JDQUFJQUkyQWdCQjZJM0FBQ0FBUWFDRXdBQVF5UWRCNWdBUS9RZ2hBa0VJUVFRUW53Z2lBRUhJaU1BQU5nSUVJQUFnQWpZQ0FFSG9qY0FBSUFCQnFJUEFBQkRKQjBFUVFRUVFud2dpQUVLQmdJQ0F3QUEzQWdnZ0FFRzRqY0FBTmdJRUlBQkJBVFlDQUNBQVFZaU53QUFRc0FnaEFVRUlRUVFRbndnaUFFSFFqY0FBTmdJRUlBQWdBVFlDQUVFSVFRUVFud2dpQVVIUWlzQUFOZ0lFSUFFZ0FEWUNBRUhvamNBQUlBRkJnSXZBQUJESkJ4Q3hCU0VDUVFoQkJCQ2ZDQ0lBUWFpTXdBQTJBZ1FnQUNBQ05nSUFRZWlOd0FBZ0FFR0loTUFBRU1rSElRRkJDRUVFRUo4SUlnQkIrSUxBQURZQ0JDQUFRUUUyQWdBZ0EwRUlhaUFFSUFGQjZJM0FBQ0FBUWNpRndBQVF5UWRCNkkzQUFCQ0hCeUFES0FJSUlBTkJFR29rQUF2ZkJBRUZmeU1BUVJCcklnTWtBRUhjQUJEOUNDRUVRZHdBRVAwSUlRRkJDRUVFRUo4SUlnQkIxTWJTQURZQ0JDQUFJQUUyQWdCQktCRDlDQ0VDUVFoQkJCQ2ZDQ0lCUWRURzBnQTJBZ1FnQVNBQ05nSUFJQUJCaE1IU0FDQUJRYVRKMGdBUXlRZEJLUkQ5Q0NFQ1FRaEJCQkNmQ0NJQVFkVEcwZ0EyQWdRZ0FDQUNOZ0lBUVpUSTBnQWdBRUdzeGRJQUVNa0hRZTRBRVAwSUlRSkJDRUVFRUo4SUlnQkIxTWJTQURZQ0JDQUFJQUkyQWdCQmxNalNBQ0FBUWRTOTBnQVF5UWRCOGdBUS9RZ2hBa0VJUVFRUW53Z2lBRUhVeHRJQU5nSUVJQUFnQWpZQ0FFR1V5TklBSUFCQmpNUFNBQkRKQjBIMEFCRDlDQ0VDUVFoQkJCQ2ZDQ0lBUWRURzBnQTJBZ1FnQUNBQ05nSUFRWlRJMGdBZ0FFSDB2OUlBRU1rSFFlSUFFUDBJSVFKQkNFRUVFSjhJSWdCQjFNYlNBRFlDQkNBQUlBSTJBZ0JCbE1qU0FDQUFRZFREMGdBUXlRZEI1Z0FRL1FnaEFrRUlRUVFRbndnaUFFSFV4dElBTmdJRUlBQWdBallDQUVHVXlOSUFJQUJCck1qU0FCREpCMEVRUVFRUW53Z2lBRUtCZ0lDQXdBQTNBZ2dnQUVIRXlOSUFOZ0lFSUFCQkFUWUNBQ0FBUWNURjBnQVFzQWdoQVVFSVFRUVFud2dpQUVHOHZkSUFOZ0lFSUFBZ0FUWUNBRUVJUVFRUW53Z2lBVUhNdnRJQU5nSUVJQUVnQURZQ0FFR1V5TklBSUFGQjlMelNBQkRKQnhDMUJTRUNRUWhCQkJDZkNDSUFRZVMrMGdBMkFnUWdBQ0FDTmdJQVFaVEkwZ0FnQUVHY3hOSUFFTWtISVFGQkNFRUVFSjhJSWdCQi9NclNBRFlDQkNBQVFRRTJBZ0FnQTBFSWFpQUVJQUZCbE1qU0FDQUFRY1M4MGdBUXlRZEJsTWpTQUJDUUJ5QURLQUlJSUFOQkVHb2tBQXZ1QXdFRmZ5TUFRZEFBYXlJQ0pBQWdBaUFBS0FJVUlnTWdBQ2dDR0VIWUFHeHFOZ0lzSUFJZ0F6WUNLQ0FDUVR4cUlBSkJLR29RK2dJQ2Z5QUNLQUk4UVlDQWdJQjRSd1JBSUFKQkNHcEJBeUFDS0FJc0lnQWdBaWdDS0NJRGEwSFlBRzRpQkNBRVFRTk5HMEVCYWtFRVFReEIrUGpOQUJDYUJTQUNRY1FBYWlnQ0FDRUZJQUlvQWdnaEJpQUNLQUlNSWdRZ0Fpa0NQRGNDQUNBRVFRaHFJQVUyQWdBZ0FrRUJOZ0k0SUFJZ0JEWUNOQ0FDSUFZMkFqQWdBaUFBTmdKTUlBSWdBellDU0VFTUlRQkJBU0VEQTBBZ0FrRVFhaUFDUWNnQWFoRDZBaUFDS0FJUVFZQ0FnSUI0UmtVRVFDQUNLQUl3SUFOR0JFQWdBa0V3YWlBQ0tBSk1JQUlvQWtoclFkZ0Fia0VCYWhETkJ5QUNLQUkwSVFRTElBQWdCR29pQlNBQ0tRSVFOd0lBSUFWQkNHb2dBa0VZYWlnQ0FEWUNBQ0FDSUFOQkFXb2lBellDT0NBQVFReHFJUUFNQVFzTElBSW9BalFoQXlBQ0tBSTREQUVMSUFKQkFEWUNPQ0FDUW9DQWdJREFBRGNDTUVFRUlRTkJBQXNoQUNBQ1FUeHFJZ1FnQXlBQVFRRkJBQkNCQVNBQ1FjZ0FOZ0pNSUFKQkFqWUNGQ0FDUWNEUXlRQTJBaEFnQWtJQk53SWNJQUlnQkRZQ1NDQUNJQUpCeUFCcU5nSVlJQUVvQWdBZ0FTZ0NCQ0FDUVJCcUVOOElJQUpCTUdvUXRnZ2dBaWdDUENBQ0tBSkFFS2tKSUFKQjBBQnFKQUFMeUFNQ0JuOERmaU1BUWVBQWF5SUVKQUFnQkVFNGFpSUdRZ0EzQXdBZ0JDQUJOd01vSUFSQkdHb2lCeUFCUXZQSzBjdW5qTm15OUFDRk53TUFJQVJCRUdvaUJTQUJRdTNla2ZPV3pOeTM1QUNGTndNQUlBUWdBRGNESUNBRVFRaHFJZ2dnQUVMaDVKWHoxdXpadk93QWhUY0RBQ0FFUWdBM0F6QWdCQ0FBUXZYS3pZUFhyTnUzOHdDRk53TUFJQVFnQXpZQ1FDQUVJQVJCUUdzaUNVRUVFTDhDSUFRZ0FpQURFTDhDSUFSQjBBQnFJZ0lnQlNrREFEY0RBQ0FFUWNnQWFpSURJQWdwQXdBM0F3QWdCRUhZQUdvaUJTQUVLUU13SUFZMUFnQkNPSWFFSWdvZ0J5a0RBSVUzQXdBZ0JDQUVLUU1BTndOQUlBa1FxQVFnQWlrREFDRUFJQVFwQTBBaERDQURLUU1BSVFzZ0JTa0RBQ0VCSUFSQjRBQnFKQUFnQVNBTFF2OEJoWHdpQ3lBQUlBb2dESVY4SWdvZ0FFSU5pWVVpQUh3aURDQUFRaEdKaFNJQVFnMkpJQUFnQVVJUWlTQUxoU0lBSUFwQ0lJbDhJZ0Y4SWdxRklndENFWWtnQUVJVmlTQUJoU0lBSUF4Q0lJbDhJZ0VnQzN3aURJVWlDMElOaVNBQVFoQ0pJQUdGSWdBZ0NrSWdpWHdpQVNBTGZJVWlDa0lSaVNBQVFoV0pJQUdGSWdBZ0RFSWdpWHdpQVNBS2ZDSUtRaUNKaFNBQVFoQ0pJQUdGUWhXSmhTQUtoUXZaQXdJQ2Z3UjhJd0JCNEFCcklnTWtBQ0FEUVFocUlnUWdBa0djeThvQVFRVVF6d0VDUUFKQUFrQUNRQUpBSUFRUWxnZ2lBZ1JBSUFNZ0FUWUNCQ0FEUVRCcUlBRW9BcGdDSUFFb0Fwd0NJQUlRdVFNUTJ3UWdBeWdDTUVHZmdJQ0FlRVlFUUNBRElBTW9BalFpQVNnQ0JDSUNOZ0pFSUFNZ0FpQUJLQUlJUWNnQWJHbzJBa2dnQXlBRFFRUnFOZ0pNSUFOQjBBQnFJZ0VnQTBIRUFHb2lBaERMQkNBREtBSlFSUTBESUFNckExZ2hCU0FCSUFJUXl3UWdBeWdDVUVVTkJDQURLd05ZSVFZZ0FTQUNFTXNFSUFNb0FsQkZEUVVnQXlzRFdDRUhJQUVnQWhETEJDQURLQUpRUlEwR0lBTXJBMWdoQ0NBRFFSaHFJZ0VnQmprREFDQURRU0JxSWdJZ0J6a0RBQ0FEUVNocUlnUWdDRGtEQUNBRElBVTVBeEFnQUVFZ2FpQUVLUU1BTndNQUlBQkJHR29nQWlrREFEY0RBQ0FBUVJCcUlBRXBBd0EzQXdBZ0FDQURLUU1RTndNSUlBQkNBVGNEQUF3Q0N5QURRUnhxSUFOQlFHc29BZ0EyQWdBZ0EwRVVhaUFEUVRocUtRSUFOd0lBSUFNZ0F5a0NNRGNDRENBRFFRRTJBZ2dnQUVJQU53TUFJQU5CQ0dwQkJISVF6Z0lNQVFzZ0FFSUFOd01BQ3lBRFFlQUFhaVFBRHd0QndJektBQkM3Q1FBTFFkQ015Z0FRdXdrQUMwSGdqTW9BRUxzSkFBdEI4SXpLQUJDN0NRQUw2Z01CQ244akFFRWdheUlDSkFBUTdnSkJnTnphQUNnQ0FDRUdRZnpiMmdBb0FnQWhCMEg4MjlvQVFnQTNBZ0JCOU52YUFDZ0NBQ0VGUWZqYjJnQW9BZ0FoQkVIMDI5b0FRZ1EzQWdCQjhOdmFBQ2dDQUNFQVFmRGIyZ0JCQURZQ0FBSkFBa0FnQkNBSFJ3UkFJQUFoQXd3QkN3SkFJQUFnQkVjRVFDQUFJUU1nQUNBRUlnRkxEUUVNQXd2UWIwR0FBU0FBSUFCQmdBRk5HeUlCL0E4QklnTkJmMFlOQWdKQUlBWkZCRUFnQXlFR0RBRUxJQUFnQm1vZ0EwY05Bd3NnQUNBQmFpSURJQUJKSUFOQi8vLy8vd05MY2cwQ0lBTkJBblFpQVVIOC8vLy9CMHNOQWdKL0lBQkZCRUFnQWtFY2FpRUpRUUFNQVFzZ0FrRUVOZ0ljSUFKQkdHb2hDU0FBUVFKMEN5RUlJQWtnQ0RZQ0FBSi9JQUlvQWh3RVFDQUNLQUlZSWdoRkJFQWdBa0VRYWtFRUlBRVF2Z2NnQWlnQ0VBd0NDeUFGSUFoQkJDQUJFRllNQVFzZ0FrRUlha0VFSUFFUXZnY2dBaWdDQ0FzaEJTQUFJUUVnQlVVTkFnc2dCU0FCUVFKMGFpQUVRUUZxTmdJQUlBRkJBV29oQkFzZ0JDQUhUUTBBSUFVZ0IwRUNkR29vQWdBaEFFR0EzTm9BSUFZMkFnQkIvTnZhQUNBQU5nSUFRZmpiMmdBZ0JEWUNBRUgwMjlvQUtBSUFJUUJCOU52YUFDQUZOZ0lBUWZEYjJnQW9BZ0JCOE52YUFDQUROZ0lBSUFBUTlBa2dBa0VnYWlRQUlBWWdCMm9QQ3dBTC9BTUJBbjhnQUNBQmFpRUNBa0FDUUNBQUtBSUVJZ05CQVhFTkFDQURRUUp4UlEwQklBQW9BZ0FpQXlBQmFpRUJJQUFnQTJzaUFFRzgzOW9BS0FJQVJnUkFJQUlvQWdSQkEzRkJBMGNOQVVHMDM5b0FJQUUyQWdBZ0FpQUNLQUlFUVg1eE5nSUVJQUFnQVVFQmNqWUNCQ0FDSUFFMkFnQU1BZ3NnQUNBREVNb0JDd0pBQWtBQ1FDQUNLQUlFSWdOQkFuRkZCRUFnQWtIQTM5b0FLQUlBUmcwQ0lBSkJ2Ti9hQUNnQ0FFWU5BeUFDSUFOQmVIRWlBaERLQVNBQUlBRWdBbW9pQVVFQmNqWUNCQ0FBSUFGcUlBRTJBZ0FnQUVHODM5b0FLQUlBUncwQlFiVGYyZ0FnQVRZQ0FBOExJQUlnQTBGK2NUWUNCQ0FBSUFGQkFYSTJBZ1FnQUNBQmFpQUJOZ0lBQ3lBQlFZQUNUd1JBSUFBZ0FSRDdBUThMSUFGQitBRnhRYVRkMmdCcUlRSUNmMEdzMzlvQUtBSUFJZ05CQVNBQlFRTjJkQ0lCY1VVRVFFR3MzOW9BSUFFZ0EzSTJBZ0FnQWd3QkN5QUNLQUlJQ3lFQklBSWdBRFlDQ0NBQklBQTJBZ3dnQUNBQ05nSU1JQUFnQVRZQ0NBOExRY0RmMmdBZ0FEWUNBRUc0MzlvQVFiamYyZ0FvQWdBZ0FXb2lBVFlDQUNBQUlBRkJBWEkyQWdRZ0FFRzgzOW9BS0FJQVJ3MEJRYlRmMmdCQkFEWUNBRUc4MzlvQVFRQTJBZ0FQQzBHODM5b0FJQUEyQWdCQnROL2FBRUcwMzlvQUtBSUFJQUZxSWdFMkFnQWdBQ0FCUVFGeU5nSUVJQUFnQVdvZ0FUWUNBQXNMb1FRQ0JuOEJmaU1BUVRCcklnSWtBQUpBQWtBZ0FTZ0NBRUdmZ0lDQWVFY0VRQ0FBSUFFcEFnQTNBZ0FnQUVFUWFpQUJRUkJxS0FJQU5nSUFJQUJCQ0dvZ0FVRUlhaWtDQURjQ0FBd0JDeUFDUVJocUlBRW9BZ1FRMndRZ0FpZ0NIQ0VCSUFJb0FoZ2lBMEdmZ0lDQWVFY0VRQ0FBSUFJcEFpQTNBZ2dnQUVFUWFpQUNRU2hxS0FJQU5nSUFJQUFnQVRZQ0JDQUFJQU0yQWdBTUFRc2dBa0VZYWlBQlFRaHFJZ1VvQWdCQkNFRUlFTEFESUFJb0Fod2hBeUFDS0FJWVFRRkdEUUVnQWtFQU5nSVVJQUlnQWlnQ0lDSUVOZ0lRSUFJZ0F6WUNEQ0FGS0FJQVFjZ0FiQ0VGSUFGQkJHb29BZ0FoQVFOQUlBVUVRQ0FDUVJocUlBRW9BZ0FnQVVFSWFpa0RBQkM4QkNBQ0tBSVlCRUFnQWlnQ0hDRUJJQUlwQXlBaENDQUFJQUlwQXlnM0Fnd2dBQ0FJTndJRUlBQWdBVFlDQUNBQ0tBSU1JQUlvQWhBUXFBa01Bd1VnQWlrRElDRUlJQUZCeUFCcUlRRWdBaWdDRENBSFJnUkFJd0JCRUdzaUF5UUFJQU5CQ0dvZ0FrRU1haUlFSUFRb0FnQkJBVUVJUVFnUWlBSWdBeWdDQ0NJRVFZR0FnSUI0UndSQUlBUWdBeWdDREVHUW9za0FFTXdJQUFzZ0EwRVFhaVFBSUFJb0FoQWhCQXNnQkNBR2FpQUlOd01BSUFJZ0IwRUJhaUlITmdJVUlBVkJ5QUJySVFVZ0JrRUlhaUVHREFJTEFBc0xJQUFnQWlrQ0REY0NCQ0FBUVorQWdJQjROZ0lBSUFCQkRHb2dBa0VVYWlnQ0FEWUNBQXNnQWtFd2FpUUFEd3NnQXlBQ0tBSWdRWUNpeVFBUXpBZ0FDOFVEQWdkL0FuNGpBRUhnQUdzaUFTUUFJQUZCR0dwQ0FEY0RBQ0FCUVJCcVFnQTNBd0FnQVVFSWFrSUFOd01BSUFGQ0FEY0RBRUVnSVFJZ0FTRURBa0FDUUFKQUEwQWdBa1VOQVNBRFFZQ0FCQ0FDSUFKQmdJQUVUeHNpQkJBR1FmamYyZ0FwQXdBaENFSDQzOW9BUWdBM0F3QWdDS2RCQVVjRVFDQURJQVJxSVFNZ0FpQUVheUVDREFFTEMwRUJJUUpCaW9BRUlRTkJCQ0VFSUFoQ2dJQ0FnTUFRVkEwQklBaENJSWluRUlzRkRBRUxJQUZCT0dvZ0FVRVlhaWtEQURjREFDQUJRVEJxSWdNZ0FVRVFhaWtEQURjREFDQUJRU2hxSUFGQkNHb3BBd0EzQXdBZ0FTQUJLUU1BTndNZ0lBRkJ4QUJxSWdVZ0FSRG9CeUFCS0FKRVFRRkdEUUVnQVNnQ1ZDRUdJQUVvQWxBaEJ5QUJLQUpNSVFJZ0FTZ0NTQ0VFSUFVZ0F4RG9CeUFCS0FKRVFRRkdEUUVnQVNrQ1NDRUpJQUVwQWxBaENFRUFJUU1nQUVFQU5nSXdJQUJDQURjREtDQUFJQWczQXlBZ0FDQUpOd01ZSUFBZ0JqWUNGQ0FBSUFjMkFoQWdBQ0FDTmdJTUlBQWdCRFlDQ0VFMElRUkJBQ0VDQ3lBQUlBSTJBZ0FnQUNBRWFpQUROZ0lBSUFGQjRBQnFKQUFQQ3lBQklBRXBBa2czQWxoQmdNL1NBRUVySUFGQjJBQnFRWmlJMGdCQnRJalNBQkNNQkFBTG1BTUNCbjRFZnlNQVFTQnJJZ29rQUFKQUlBSlFJQUZDdjM5VGNnMEFRZjhCSVFzZ0FVSW1WUTBBSUFwQkVHb2dBYWNpQ1VFRWRDSU1RZGk0d1FCcUtRTUFRZ0FnQWlBQ2VTSUdoaUlERUlzRUlBb3BBeEFoQlNBS0tRTVlJZ0pDLy8vLy8vOEhnMEwvLy8vLy93ZFJCRUFnQ2lBTVFlQzR3UUJxS1FNQVFnQWdBeENMQkNBQ0lBb3BBd2dpQWlBRmZDSUZJQUpVclh3aEFnc2dCVUovVWlBQlFtUlZja1VFUUVGL0lRc01BUXNnQWlBQ1FqK0lJZ2RDSm9RaUNJZ2hBeUFIcHlBSlFlcWtEV3hCRUhVZ0JxZHJha0UvYWlJSlFZSi9UZ1JBUVlBQlFmOEFJQU5DL1AvL0g0TWdBeUFESUFpR0lBSlJHeUFESUFOQ0E0TkNBVkViSUFNZ0JVSUNWQnNnQXlBQlFoRjhRaHhVR3lJQlFnR0RJQUY4SWdGQy8vLy9EMVlpREJzZ0NXb2lDVUgrQVVzTkFVSUFJQUZDQVloQy8vLy9HNE1nREJzaEJDQUpJUXNNQVF0QkFDRUxJQWxCdzM1SkRRQWdBMEVDSUFsclFUOXhyWWdpQVVJQmd5SUNJQUY4UXYvLy93ZFdJUXNnQXFjZ0FhZHFRUUYyclNFRUN5QUFJQXMyQWdnZ0FDQUVOd01BSUFwQklHb2tBQXVpQXdJR2ZnUi9Jd0JCSUdzaUNpUUFBa0FnQWxBZ0FVS3FmVk55RFFCQi93OGhDeUFCUXJRQ1ZRMEFJQXBCRUdvZ0FhY2lDVUVFZENJTVFkaTR3UUJxS1FNQVFnQWdBaUFDZVNJR2hpSURFSXNFSUFvcEF4QWhCU0FLS1FNWUlnSkMvd09EUXY4RFVRUkFJQW9nREVIZ3VNRUFhaWtEQUVJQUlBTVFpd1FnQWlBS0tRTUlJZ0lnQlh3aUJTQUNWSzE4SVFJTElBVkNmMUlnQVVJYmZFTFRBRlJ5UlFSQVFYOGhDd3dCQ3lBQ0lBSkNQNGdpQjBJSmZDSUlpQ0VESUFlbklBbEI2cVFOYkVFUWRTQUdwMnRxUVQ5cUlnbEJnbmhPQkVCQmdBaEIvd2NnQTBMOC8vLy8vLy8vL3dDRElBTWdBeUFJaGlBQ1VSc2dBeUFEUWdPRFFnRlJHeUFESUFWQ0FsUWJJQU1nQVVJRWZFSWNWQnNpQVVJQmd5QUJmQ0lCUXYvLy8vLy8vLzhmVmlJTUd5QUphaUlKUWY0UFN3MEJRZ0FnQVVJQmlFTC8vLy8vLy8vLzkvOEFneUFNR3lFRUlBa2hDd3dCQzBFQUlRc2dDVUhEZDBrTkFDQURRUUlnQ1d0QlAzR3RpQ0lCUWdHRElBRjhJZ0ZDLy8vLy8vLy8vdzlXSVFzZ0FVSUJpQ0VFQ3lBQUlBczJBZ2dnQUNBRU53TUFJQXBCSUdva0FBdkxBd0lEZndKK0l3QkI4QUZySWdVa0FBSkFJQUVvQXJRQ0lnWWdBazhFUUNBQktBS3dBaUVISUFWQkFUWUNKQ0FGUWc4M0Fod2dCVUhGMmNrQU5nSVlJQVVnQmpZQ0ZDQUZJQWMyQWhBZ0JVRUlhaUFISUFZZ0FoQ2hCeUFGUWRnQmFpSUdJQVZCRUdvZ0JTZ0NDQ0FGS0FJTUVJSURJQVZCaUFGcUlBWWdBaUFESUFFZ0JCQVFJQVVvQXBBQklnRkJERVlFUUNBRlFZQUJhaUFGUWFRQmFpZ0NBQ0lCTmdJQUlBVkIrQUJxSUFWQm5BRnFLUUlBSWdnM0F3QWdCU0FGS1FLVUFTSUpOd053SUFCQkhHb2dBVFlDQUNBQVFSUnFJQWczQWdBZ0FDQUpOd0lNSUFCQkREWUNDQXdDQ3lBRlFmZ0FhaUlESUFWQm5BRnFLUUlBTndNQUlBVkJnQUZxSWdRZ0JVR2tBV29vQWdBMkFnQWdCU0FGS1FLVUFUY0RjQ0FGS0FLSUFTRUdJQVV2QVl3QklRY2dCVUZBYXlBRlFhZ0Jha0V3L0FvQUFDQUZRVFJxSUFNcEF3QTNBZ0FnQlVFOGFpQUVLQUlBTmdJQUlBVWdBVFlDS0NBRklBVXBBM0EzQWl3Z0JVRW9haUlCSUFJUXlRVWdCVUdLQVdvZ0FVSElBUHdLQUFBZ0FDQUhPd0VFSUFBZ0JqWUNBQ0FBUVFacUlBVkJpQUZxUWNvQS9Bb0FBQXdCQ3lBQUlBSTJBaEFnQUVLTWdJQ0EwSUdBZ0lCL053TUlDeUFGUWZBQmFpUUFDOW9EQVFkL0l3QkJFR3NpQlNRQUFrQUNRQUpBSUFFb0FpQWlBa1VFUUNBQktBSUFJQUZCQURZQ0FFRUJjVVVOQWlBQktBSUlJUU1nQVNnQ0JDSUNEUUVnQVNnQ0RDRUVJQU1oQWdOQUlBUUVRQ0FFUVFGcklRUWdBaWdDakFFaEFnd0JCVUVBSVFNTUF3c0FDd0FMSUFFZ0FrRUJhellDSUFKQUlBRW9BZ0JCQVVZRVFBSkFJQUVvQWdSRkJFQWdBVUVJYWlFQ0lBRW9BZ3doQXdOQUlBSW9BZ0FoQWlBREJFQWdBMEVCYXlFRElBSkJqQUZxSVFJTUFRVWdBVUlBTndJSUlBRWdBallDQkNBQlFRRTJBZ0FNQXdzQUN3QUxJQUVvQWdRaEFnc2dBU2dDRENFRElBRW9BZ2doQkFOQUlBSXZBWW9CSUFOTkJFQWdCVUVFYWlBQ0lBUVFxd1VnQlNnQ0JDSUNSUTBESUFVb0Fnd2hBeUFGS0FJSUlRUU1BUXNMSUFOQkFXb2hCZ0pBSUFSRkJFQWdBaUVIREFFTElBSWdCa0VDZEdwQmpBRnFJUVlnQkNFSUEwQWdCaWdDQUNJSFFZd0JhaUVHSUFoQkFXc2lDQTBBQzBFQUlRWUxJQUFnQXpZQ0NDQUFJQVEyQWdRZ0FDQUNOZ0lBSUFFZ0JqWUNEQ0FCUVFBMkFnZ2dBU0FITmdJRURBUUxRZUREeVFBUXV3a0FDMEh3bDhrQUVMc0pBQXNEUUNBRlFRUnFJQUlnQXhDckJTQUZLQUlFSWdKRkRRRWdCU2dDQ0NFRERBQUxBQXNnQUVFQU5nSUFDeUFGUVJCcUpBQUx2QU1DQ1g4QmZpTUFRVUJxSWdJa0FDQUNJQUUyQWd3Z0FDZ0NEQ0VESUFJZ0FrRU1hallDRUNBRFFYOUhCRUFDZndKQUlBQW9BZ1FpQVNBQlFRRnFRUU4yUVFkc0lBRkJDRWtiSWdGQkFYWWdBMDBFUUNBQ1FUQnFRUkFnQVNBRElBRWdBMHNiUVFGcUVNSUNJQUlvQWpRaUJpQUNLQUl3SWdSRkRRSWFJQUlvQWpnaEJ5QUNJQUlvQWp3MkFpd2dBaUFITmdJb0lBSWdCallDSkNBQ0lBUTJBaUFnQWtLUWdJQ0FnQUUzQWhnZ0FpQUFRUkJxTmdJVUlBQW9BZ0FpQ0NrREFFSi9oVUtBZ1lLRWlKQ2d3SUIvZ3lFTElBSkJJR29oQ1VFQUlRRURRQ0FEQkVBRFFDQUxVQVJBSUFGQkNHb2hBU0FJUVFocUlnZ3BBd0JDZjRWQ2dJR0NoSWlRb01DQWY0TWhDd3dCQ3dzZ0JDQUVJQVlnQWtFUWFpQUFJQXQ2cDBFRGRpQUJhaUlGRUtvSEVNb0dRWDl6UVFSMGFpSUtJQUFvQWdBZ0JVRi9jMEVFZEdvaUJTa0FBRGNBQUNBS1FRaHFJQVZCQ0dvcEFBQTNBQUFnQTBFQmF5RURJQXRDQVgwZ0M0TWhDd3dCQ3dzZ0FpQUFLQUlNSWdFMkFpd2dBaUFISUFGck5nSW9JQUFnQ1JEVENTQUNRUlJxRUtnRkRBRUxJQUFnQWtFUWFrRWlRUkFRZGd0QkFBc2FJQUpCUUdza0FBOExFT2NHQUF2YUF3RUhmeU1BUVJCcklnVWtBQUpBQWtBQ1FDQUJLQUlnSWdKRkJFQWdBU2dDQUNBQlFRQTJBZ0JCQVhGRkRRSWdBU2dDQ0NFRElBRW9BZ1FpQWcwQklBRW9BZ3doQkNBRElRSURRQ0FFQkVBZ0JFRUJheUVFSUFJb0F2Z0dJUUlNQVFWQkFDRUREQU1MQUFzQUN5QUJJQUpCQVdzMkFpQUNRQ0FCS0FJQVFRRkdCRUFDUUNBQktBSUVSUVJBSUFGQkNHb2hBaUFCS0FJTUlRTURRQ0FDS0FJQUlRSWdBd1JBSUFOQkFXc2hBeUFDUWZnR2FpRUNEQUVGSUFGQ0FEY0NDQ0FCSUFJMkFnUWdBVUVCTmdJQURBTUxBQXNBQ3lBQktBSUVJUUlMSUFFb0Fnd2hBeUFCS0FJSUlRUURRQ0FDTHdIMkJpQURUUVJBSUFWQkJHb2dBaUFFRUswRklBVW9BZ1FpQWtVTkF5QUZLQUlNSVFNZ0JTZ0NDQ0VFREFFTEN5QURRUUZxSVFZQ1FDQUVSUVJBSUFJaEJ3d0JDeUFDSUFaQkFuUnFRZmdHYWlFR0lBUWhDQU5BSUFZb0FnQWlCMEg0Qm1vaEJpQUlRUUZySWdnTkFBdEJBQ0VHQ3lBQUlBTTJBZ2dnQUNBRU5nSUVJQUFnQWpZQ0FDQUJJQVkyQWd3Z0FVRUFOZ0lJSUFFZ0J6WUNCQXdFQzBIZ3c4a0FFTHNKQUF0QjhKZkpBQkM3Q1FBTEEwQWdCVUVFYWlBQ0lBTVFyUVVnQlNnQ0JDSUNSUTBCSUFVb0FnZ2hBd3dBQ3dBTElBQkJBRFlDQUFzZ0JVRVFhaVFBQzVRRUFRSi9Jd0JCSUdzaUFpUUFBa0FDUUFKQUFrQUNRQUpBSUFBb0FnQWlBQzBBQUVFQmF3NERBUUlEQUFzZ0FpQUFLQUlFTmdJRUlBRW9BZ0JCK1pUU0FFRUNJQUVvQWdRb0Fnd1JBZ0FoQUNBQ1FRQTZBQTBnQWlBQU9nQU1JQUlnQVRZQ0NDQUNRUWhxUWZ1VTBnQkJCQ0FDUVFScVFjQUFFSWtDSUFKQktUb0FFMEhKenRJQVFRUWdBa0VUYWtIQkFCQ0pBa0dBNE5vQUxRQUFHa0VVRUJZaUFFVU5CQ0FBUVJCcVFkQ1owZ0FvQUFBMkFBQWdBRUVJYWtISW1kSUFLUUFBTndBQUlBQkJ3Sm5TQUNrQUFEY0FBQ0FDUVJRMkFod2dBaUFBTmdJWUlBSkJGRFlDRkVHTzFOSUFRUWNnQWtFVWFrSENBQkNKQWhESEJDRUJJQUlvQWhRaUFFVU5BeUFDS0FJWUlBQkJBUkRqQkF3REN5QUNJQUF0QUFFNkFBZ2dBaUFCS0FJQVFmK1UwZ0JCQkNBQktBSUVLQUlNRVFJQU9nQWNJQUlnQVRZQ0dDQUNRUUE2QUIwZ0FrRUFOZ0lVSUFKQkZHb2dBa0VJYWtIQkFCRFBBaERXQXlFQkRBSUxJQUFvQWdRaEFDQUJLQUlBUVlPVjBnQkJCU0FCS0FJRUtBSU1FUUlBSVFNZ0FrRUFPZ0FaSUFJZ0F6b0FHQ0FDSUFFMkFoUWdBa0VVYWtISnp0SUFRUVFnQUVFSWFrSEJBQkNKQWtHTzFOSUFRUWNnQUVIREFCQ0pBaERIQkNFQkRBRUxJQUlnQUNnQ0JDSUFOZ0lVSUFGQnN0VFNBRUVHUWNuTzBnQkJCQ0FBUVFocVFjRUFRYzdQMGdCQkJTQUNRUlJxUWNRQUVKSURJUUVMSUFKQklHb2tBQ0FCRHdzQUM2Z0RBZ2gvQVg0akFFRkFhaUlDSkFBZ0FpQUJOZ0lNSUFBb0Fnd2hBeUFDSUFKQkRHbzJBaEFnQTBGL1J3UkFBbjhDUUNBQUtBSUVJZ0VnQVVFQmFrRURka0VIYkNBQlFRaEpHeUlCUVFGMklBTk5CRUFnQWtFd2FrRTRJQUVnQXlBQklBTkxHMEVCYWhEQ0FpQUNLQUkwSWdVZ0FpZ0NNQ0lFUlEwQ0dpQUNLQUk0SVFZZ0FpQUNLQUk4TmdJc0lBSWdCallDS0NBQ0lBVTJBaVFnQWlBRU5nSWdJQUpDdUlDQWdJQUJOd0lZSUFJZ0FFRVFhallDRkNBQUtBSUFJZ2NwQXdCQ2Y0VkNnSUdDaElpUW9NQ0FmNE1oQ2lBQ1FTQnFJUWhCQUNFQkEwQWdBd1JBQTBBZ0NsQUVRQ0FCUVFocUlRRWdCMEVJYWlJSEtRTUFRbitGUW9DQmdvU0lrS0RBZ0grRElRb01BUXNMSUFRZ0JDQUZJQUpCRUdvZ0FDQUtlcWRCQTNZZ0FXb2lDUkM5QmhES0JrRi9jMEU0YkdvZ0FDZ0NBQ0FKUVg5elFUaHNha0U0L0FvQUFDQURRUUZySVFNZ0NrSUJmU0FLZ3lFS0RBRUxDeUFDSUFBb0Fnd2lBVFlDTENBQ0lBWWdBV3MyQWlnZ0FDQUlFTk1KSUFKQkZHb1FxQVVNQVFzZ0FDQUNRUkJxUVJkQk9CQjJDMEVBQ3hvZ0FrRkFheVFBRHdzUTV3WUFDNlFEQVE1L0lBQWdBU2dDSENJQ0lBRW9BaGdpQkVFQmRuTkIxYXJWcWdWeElnY2dBbk1pQWlBQktBSVVJZ1VnQVNnQ0VDSUdRUUYyYzBIVnF0V3FCWEVpQ0NBRmN5SUZRUUoyYzBHejVzeVpBM0VpQ1NBQ2N5SUNJQUVvQWd3aUF5QUJLQUlJSWd0QkFYWnpRZFdxMWFvRmNTSU1JQU56SWdNZ0FTZ0NCQ0lLSUFFb0FnQWlBVUVCZG5OQjFhclZxZ1Z4SWcwZ0NuTWlDa0VDZG5OQnMrYk1tUU54SWc0Z0EzTWlBMEVFZG5OQmo1NjgrQUJ4SWc4Z0FuTTJBQndnQUNBSlFRSjBJQVZ6SWdJZ0RrRUNkQ0FLY3lJRlFRUjJjMEdQbnJ6NEFIRWlDU0FDY3pZQUdDQUFJQTlCQkhRZ0EzTTJBQlFnQUNBRUlBZEJBWFJ6SWdJZ0JpQUlRUUYwY3lJRVFRSjJjMEd6NXN5WkEzRWlCeUFDY3lJQ0lBc2dERUVCZEhNaUJpQUJJQTFCQVhSeklnRkJBblp6UWJQbXpKa0RjU0lJSUFaeklnWkJCSFp6UVkrZXZQZ0FjU0lESUFKek5nQU1JQUFnQ1VFRWRDQUZjellBRUNBQUlBZEJBblFnQkhNaUFpQUlRUUowSUFGeklnRkJCSFp6UVkrZXZQZ0FjU0lFSUFKek5nQUlJQUFnQTBFRWRDQUdjellBQkNBQUlBUkJCSFFnQVhNMkFBQUx3UU1DQTM4QmZpTUFRYUFCYXlJRUpBQWdBaUFES0FJTUVRWUFJUVVnQkVFd2FpQUJLQUlBSUFJZ0F5QUJLQUlFS0FJVUVRQUFBa0FDUUNBRUtBSXdRUVZIQkVBZ0JFRW9haUFFUVVCcktRTUFOd01BSUFRZ0JDa0RPRGNESUNBRUtRTXdJUWNNQVFzZ0JFSElBR29nQVNnQ0NDQUNJQU1nQVNnQ0RDZ0NGQkVBQUNBRUtBSTBJUUVnQkMwQVNFRUlSZ1JBSUFRb0FqZ2hCaUFFUVNocUlBUkIzQUJxS1FJQU53TUFJQVFnQkNrQ1ZEY0RJQ0FFS1FKTUlRY2dBU0FHRVBZSkRBRUxJQVFwQXpnaEJ5QUVRZmdBYWlBRVFjZ0Fha0VvL0FvQUFDQUVRU2hxSUFSQi9BQnFLUUlBTndNQUlBUkJDR29nQkVIY0FHb3BBZ0EzQXdBZ0JFRVFhaUFFUWVRQWFpa0NBRGNEQUNBRVFSaHFJQVJCN0FCcUtBSUFOZ0lBSUFRZ0JDa0NkRGNESUNBRUlBUXBBbFEzQXdBZ0FVR0FnSUNBZUVjTkFRc2dBaUFGSUFNb0FoZ1JBUUJCZ0lDQWdIZ2hBUXNnQUNBSE53SUVJQUFnQVRZQ0FDQUFJQVFwQXlBM0Fnd2dBQ0FFS1FNQU53SWNJQUJCRkdvZ0JFRW9haWtEQURjQ0FDQUFRU1JxSUFSQkNHb3BBd0EzQWdBZ0FFRXNhaUFFUVJCcUtRTUFOd0lBSUFCQk5Hb2dCRUVZYWlnQ0FEWUNBQ0FFUWFBQmFpUUFDNVVEQVFkL0l3QkJFR3NpQlNRQUFuOENRQ0FDS0FJRUlnTkZEUUFnQUNBQ0tBSUFJQU1nQVNnQ0RCRUNBRVVOQUVFQkRBRUxJQUlvQWd3aUF3UkFJQUlvQWdnaUJDQURRUXhzYWlFR0lBVkJER29oQndOQUFrQUNRQUpBQWtBZ0JDOEJBRUVCYXc0Q0FnRUFDd0pBSUFRb0FnUWlBa0hCQUU4RVFDQUJRUXhxS0FJQUlRTURRRUVCSUFCQnB2akFBRUhBQUNBREVRSUFEUWdhSUFKQlFHb2lBa0hBQUVzTkFBc01BUXNnQWtVTkF5QUJRUXhxS0FJQUlRTUxJQUJCcHZqQUFDQUNJQU1SQWdCRkRRSkJBUXdGQ3lBQUlBUW9BZ1FnQkNnQ0NDQUJRUXhxS0FJQUVRSUFSUTBCUVFFTUJBc2dCQzhCQWlFQ0lBZEJBRG9BQUNBRlFRQTJBZ2dDZjBFRVFRVWdBa0dRemdCSkd5QUNRZWdIVHcwQUdrRUJJQUpCQ2trTkFCcEJBa0VESUFKQjVBQkpHd3NpQ0NFREEwQWdBMEVCYXlJRElBVkJDR29pQ1dvZ0FpQUNRZi8vQTNGQkNtNGlBa0VLYkd0Qk1ISTZBQUFnQXcwQUN5QUFJQWtnQ0NBQlFReHFLQUlBRVFJQVJRMEFRUUVNQXdzZ0JFRU1haUlFSUFaSERRQUxDMEVBQ3lBRlFSQnFKQUFMclFNQkJIOGpBRUdRQVdzaUJDUUFJQVFnQWpZQ0hDQUVJQUUyQWhoQkFDRUNJQVJCQURZQ01DQUVRUUEyQWlBZ0JDQUROZ0pBUVFFaEFTQUVJQU5CQVdvMkFrUWdCQ0FFUVJocU5nSklJQVJCRUdvZ0JFRWdhaUlGRU1jQ0FuOGdCQzBBRUFSQUlBUXRBQkVoQXlBRVFkZ0FhaUlHSUFVUWxBUkJBU0VDSUFSQkNHcEJDQ0FFS0FKWVFRRnFJZ0ZCZnlBQkd5SUJJQUZCQ0UwYlFRRkJBVUg0K00wQUVKb0ZJQVFvQWdnaEJ5QUVLQUlNSWdFZ0F6b0FBQ0FFUVFFMkFsUWdCQ0FCTmdKUUlBUWdCellDVENBR0lBVkJMUHdLQUFBRFFDQUVJQVJCMkFCcUlnVVF4d0lnQkMwQUFBUkFJQVF0QUFFaEF5QUVLQUpNSUFKR0JFQWdCRUdFQVdvZ0JSQ1VCQ0FFUWN3QWFpQUVLQUtFQVVFQmFpSUJRWDhnQVJzUXhRY2dCQ2dDVUNFQkN5QUJJQUpxSUFNNkFBQWdCQ0FDUVFGcUlnSTJBbFFNQVFzTElBUkIyQUJxRUxrSUlBUW9Ba3dNQVFzZ0JFRWdhaEM1Q0VFQUN5QUVRZGdBYWlBQklBSVFNQ0FFS0FKWUlnSkJnWUNBZ0hoR0JFQkJpSXpLQUJDN0NRQUxJQUFnQkNnQ1hDSUFJQVFvQW1BUWx3VWdBUkQxQ1NBQ0lBQVE0UWdnQkVHUUFXb2tBQXZCQXdJRGZ3RitJd0JCb0FGcklnUWtBQ0FDSUFNb0Fnd1JCZ0FoQlNBRVFUQnFJQUVvQWdBZ0FpQURJQUVvQWdRb0FoUVJBQUFDUUFKQUlBUW9BakJCQlVjRVFDQUVRU2hxSUFSQlFHc3BBd0EzQXdBZ0JDQUVLUU00TndNZ0lBUXBBekFoQnd3QkN5QUVRY2dBYWlBQktBSUlJQUlnQXlBQktBSU1LQUlVRVFBQUlBUW9BalFoQVNBRUxRQklRUWxHQkVBZ0JDZ0NPQ0VHSUFSQktHb2dCRUhjQUdvcEFnQTNBd0FnQkNBRUtRSlVOd01nSUFRcEFrd2hCeUFCSUFZUTlna01BUXNnQkNrRE9DRUhJQVJCK0FCcUlBUkJ5QUJxUVNqOENnQUFJQVJCS0dvZ0JFSDhBR29wQWdBM0F3QWdCRUVJYWlBRVFkd0FhaWtDQURjREFDQUVRUkJxSUFSQjVBQnFLUUlBTndNQUlBUkJHR29nQkVIc0FHb29BZ0EyQWdBZ0JDQUVLUUowTndNZ0lBUWdCQ2tDVkRjREFDQUJRWUNBZ0lCNFJ3MEJDeUFDSUFVZ0F5Z0NHQkVCQUVHQWdJQ0FlQ0VCQ3lBQUlBYzNBZ1FnQUNBQk5nSUFJQUFnQkNrRElEY0NEQ0FBSUFRcEF3QTNBaHdnQUVFVWFpQUVRU2hxS1FNQU53SUFJQUJCSkdvZ0JFRUlhaWtEQURjQ0FDQUFRU3hxSUFSQkVHb3BBd0EzQWdBZ0FFRTBhaUFFUVJocUtBSUFOZ0lBSUFSQm9BRnFKQUFMcFFNQkNIOGdBQ0FBS0FJWUlnRkJGSGRCajU2OCtBQnhJQUZCSEhkQjhPSERoMzl4Y2lJRElBRnpJZ0lnQUNnQ0hDSUVRUlIzUVkrZXZQZ0FjU0FFUVJ4M1FmRGh3NGQvY1hJaUFTQUVjeUlGUVJCM2N5QUJjellDSENBQUlBTWdBQ2dDRkNJQlFSUjNRWStldlBnQWNTQUJRUngzUWZEaHc0ZC9jWElpQXlBQmN5SUJJQUpCRUhkemN6WUNHQ0FBSUFNZ0FDZ0NFQ0lDUVJSM1FZK2V2UGdBY1NBQ1FSeDNRZkRodzRkL2NYSWlBeUFDY3lJR0lBRkJFSGR6Y3pZQ0ZDQUFJQUFvQWdRaUFVRVVkMEdQbnJ6NEFIRWdBVUVjZDBIdzRjT0hmM0Z5SWdjZ0FYTWlDQ0FBS0FJSUlnSkJGSGRCajU2OCtBQnhJQUpCSEhkQjhPSERoMzl4Y2lJQklBSnpJZ1JCRUhkeklBRnpOZ0lJSUFBZ0FDZ0NBQ0lDUVJSM1FZK2V2UGdBY1NBQ1FSeDNRZkRodzRkL2NYSWlBU0FDY3lJQ1FSQjNJQUZ6SUFWek5nSUFJQUFnQXlBQUtBSU1JZ0ZCRkhkQmo1NjgrQUJ4SUFGQkhIZEI4T0hEaDM5eGNpSURJQUZ6SWdFZ0JrRVFkM056SUFWek5nSVFJQUFnQkNBQlFSQjNjeUFEY3lBRmN6WUNEQ0FBSUFJZ0NFRVFkM01nQjNNZ0JYTTJBZ1FMOUFJQkNIOGpBRUV3YXlJRUpBQWdBQUovQWtBZ0F5Z0NCQ0lKQkVBZ0FTQUNhaUVJSUFNb0FnQWlDaTBBQUNJSHdDRUxBMEFDZnlBSUlnVWdBU0FGUmcwQUdpQUJMQUFBSWdKQkFFNEVRQ0FDUWY4QmNTRUNJQUZCQVdvTUFRc2dBUzBBQVVFL2NTRUdJQUpCSDNFaEJTQUNRVjlOQkVBZ0JVRUdkQ0FHY2lFQ0lBRkJBbW9NQVFzZ0FTMEFBa0UvY1NBR1FRWjBjaUVHSUFKQmNFa0VRQ0FHSUFWQkRIUnlJUUlnQVVFRGFnd0JDeUFGUVJKMFFZQ0E4QUJ4SUFFdEFBTkJQM0VnQmtFR2RISnlJUUlnQVVFRWFnc2hCU0FCSUFoSElBSkJnSURFQUVkeElnWUVRQ0FGSVFFZ0FpQUhSdzBCQ3dzZ0JnMEJDMEU2SVFkQkFRd0JDeUFFUVFocUlBb2dDVUVCUVFJZ0MwRUFUaHNRb1FjZ0JFRVVhaUFESUFRb0FnZ2dCQ2dDREJDQ0F5QUFJQVFwQWhnM0FnZ2dBRUVRYWlBRVFTQnFLUUlBTndJQUlBQkJHR29nQkVFb2FpZ0NBRFlDQUNBQUlBUW9BaFEyQWdSQkFBczJBZ0FnQUNBSE5nSWNJQVJCTUdva0FBdUdBd0VGZndKQUFrQUNRQUpBQWtBZ0J5QUlWZ1JBSUFjZ0NIMGdDRmdOQVFKQUlBWWdCeUFHZlZRZ0J5QUdRZ0dHZlNBSVFnR0dXbkZGQkVBZ0JpQUlWZzBCREFjTElBSWdBMGtOQXd3RkN5QUhJQVlnQ0gwaUJuMGdCbFlOQlNBQ0lBTkpEUU1nQVNBRGFpRU5RWDhoQ3lBRElRa0NRQUpBQTBBZ0NTSUtSUTBCSUF0QkFXb2hDeUFLUVFGcklna2dBV29pREMwQUFFRTVSZzBBQ3lBTUlBd3RBQUJCQVdvNkFBQWdDMFVnQXlBS1RYSU5BU0FCSUFwcVFUQWdDL3dMQUF3QkN3SkFJQU5GQkVCQk1TRUpEQUVMSUFGQk1Ub0FBQ0FEUVFGR0JFQkJNQ0VKREFFTFFUQWhDU0FEUVFGcklncEZEUUFnQVVFQmFrRXdJQXI4Q3dBTElBUkJBV3JCSWdRZ0JjRk1JQUlnQTAxeURRQWdEU0FKT2dBQUlBTkJBV29oQXdzZ0FpQURUdzBFSUFNZ0FrSGc4Y0FBRUxnSkFBc2dBRUVBTmdJQUR3c2dBRUVBTmdJQUR3c2dBeUFDUWZEeHdBQVF1QWtBQ3lBRElBSkIwUEhBQUJDNENRQUxJQUFnQkRzQkNDQUFJQU0yQWdRZ0FDQUJOZ0lBRHdzZ0FFRUFOZ0lBQytrQ0FRVi9Ba0FnQVVITi8zdEJFQ0FBSUFCQkVFMGJJZ0JyVHcwQUlBQkJFQ0FCUVF0cVFYaHhJQUZCQzBrYklnUnFRUXhxRUJZaUFrVU5BQ0FDUVFocklRRUNRQ0FBUVFGcklnTWdBbkZGQkVBZ0FTRUFEQUVMSUFKQkJHc2lCU2dDQUNJR1FYaHhJQUlnQTJwQkFDQUFhM0ZCQ0dzaUFpQUFRUUFnQWlBQmEwRVFUUnRxSWdBZ0FXc2lBbXNoQXlBR1FRTnhCRUFnQUNBRElBQW9BZ1JCQVhGeVFRSnlOZ0lFSUFBZ0Eyb2lBeUFES0FJRVFRRnlOZ0lFSUFVZ0FpQUZLQUlBUVFGeGNrRUNjallDQUNBQklBSnFJZ01nQXlnQ0JFRUJjallDQkNBQklBSVFuUUVNQVFzZ0FTZ0NBQ0VCSUFBZ0F6WUNCQ0FBSUFFZ0FtbzJBZ0FMQWtBZ0FDZ0NCQ0lCUVFOeFJRMEFJQUZCZUhFaUFpQUVRUkJxVFEwQUlBQWdCQ0FCUVFGeGNrRUNjallDQkNBQUlBUnFJZ0VnQWlBRWF5SUVRUU55TmdJRUlBQWdBbW9pQWlBQ0tBSUVRUUZ5TmdJRUlBRWdCQkNkQVFzZ0FFRUlhaUVEQ3lBREM1TURBZ2QvQVg0akFFRVFheUlFSkFBZ0FDZ0NCQ0lIQkVBZ0FDZ0NBQ0VGQWtBZ0FDZ0NEQ0lEUlEwQUlBVkJDR29oQUNBRktRTUFRbitGUW9DQmdvU0lrS0RBZ0grRElRaEJBU0VDSUFVaEJnTkFJQUpGRFFFRFFDQUlRZ0JTUlFSQUlBWkJ3QU5ySVFZZ0FDa0RBRUovaFVLQWdZS0VpSkNnd0lCL2d5RUlJQUJCQ0dvaEFBd0JDd3NnQmlBSWVxZEJBM1pCU0d4cUlnRkJPR3NvQWdBZ0FVRTBheWdDQUJDdUNTQUlRZ0Y5SUFpRElRZ2dBMEVCYXlJRElRSUNRQUpBQWtBQ1FBSkFBa0FnQVVFb2F5MEFBRUVCYXc0SEFnTUdCQVVHQUFFTElBRkJJR3NRc1FFTUJRc2dBVUVrYXlnQ0FDQUJRU0JyS0FJQUVLNEpEQVFMSUFGQkpHc29BZ0FnQVVFZ2F5Z0NBQkN1Q1F3REN5QUJRU1JyS0FJQUlBRkJJR3NvQWdBUXJna01BZ3NnQVVFa2F5SUNFUFVHSUFJb0FnQWdBVUVnYXlnQ0FCQ3NDU0FESVFJTUFRc2dBVUVrYXlnQ0FDQUJRU0JyS0FJQUVLNEpEQUFMQUFzZ0JFRUVha0U0UVFnZ0IwRUJhaERxQXlBRklBUW9BZ3hySUFRb0FnUWdCQ2dDQ0JEUUNBc2dCRUVRYWlRQUM1VURBZ2wvQVg0akFFRkFhaUlFSkFBZ0FpQURLQUlNRVFZQUlRa2dCRUVBTmdJTUlBUkNnSUNBZ01BQU53SUVRUVFoQmlBRVFSaHFJUW9nQVNnQ0FDRUxJQUVvQWdRb0FoUWhEQ0FBQW44RFFBSkFJQVJCRkdvaUNDQUxJQUlnQXlBTUVRQUFJQVFvQWhSQkJVY0VRQ0FJRU9zSElBUWdBU2dDQ0NJQk5nSVFJQUVnQlVzTkFTQUFJQVFwQWdRM0FnUWdBRUVNYWlBRVFReHFLQUlBTmdJQVFRVU1Bd3NnQkNnQ0JDQUZSZ1JBSUFSQkJHb1EwZ1VnQkNnQ0NDRUdDeUFLS1FJQUlRMGdCaUFIYWlJSVFRaHFJQXBCQ0dvb0FnQTJBZ0FnQ0NBTk53SUFJQVFnQlVFQmFpSUZOZ0lNSUFRb0FoUkJCVWNFUUNBRVFSUnFFT3NIQ3lBSFFReHFJUWNNQVFzTElBSWdDU0FES0FJWUVRRUFJQVJCQXpZQ0dDQUVRYXpNMGdBMkFoUWdCRUlDTndJZ0lBUkJHallDT0NBRVFSbzJBakFnQkNBRk5nSThJQVFnQkVFc2FqWUNIQ0FFSUFSQlBHbzJBalFnQkNBRVFSQnFOZ0lzSUFCQkNHb2dCRUVVYWhDZUF5QUFJQWsyQWdRZ0JpQUZFSWtISUFRb0FnUWdCaEN2Q1VFQkN6WUNBQ0FFUVVCckpBQUxsQU1DQTM4QmZpTUFRZUFBYXlJREpBQWdBMEV3YWlBQ0VNUUVBa0FnQXlnQ01FR2ZnSUNBZUVjRVFDQURRUmhxSUFOQlFHc29BZ0EyQWdBZ0EwRVFhaUFEUVRocUtRSUFOd01BSUFNZ0F5a0NNRGNEQ0F3QkN5QURRUWhxSUFCQm1BSnFLQUlBSUFCQm5BSnFLQUlBSUFNb0FqUWdBeThCT0JDa0JBc0NRQ0FES0FJSVFaK0FnSUI0UmdSQUlBTkJIR29nQXlnQ0RDSUZFUDBCQWtBZ0F5Z0NIQ0lFUVorQWdJQjRSdzBBSUFNb0FpUkJCVWNOQUVFQklRSWdBeWdDSUNJRUxRQUFRZEFBUncwQ0lBUXRBQUZCNFFCSERRSWdCQzBBQWtIbkFFY05BaUFFTFFBRFFlVUFSdzBDSUFRdEFBUkI4d0JIRFFJZ0EwSE1BR29pQWlBRlFkeWZ5UUJCQlNBQVFaZ0NhaWdDQUNBQVFad0NhaWdDQUJDSUF5QURRVEJxSUFJUWtBVUNRQ0FES0FJd0lnQkJBVWNFUUNBREtRTTRJUVlNQVFzZ0FFVU5BQ0FEUVRCcVFRUnlFTTBDQ3lBR1FnQWdCa0lBVlJ1bklRSU1BZ3RCQVNFQ0lBUkJuNENBZ0hoR0RRRWdBMEVjYWhETkFnd0JDeUFEUVFocUVNMENRUUVoQWdzZ0EwSGdBR29rQUNBQklBSnFDNU1EQVFGL0l3QkI0QUJySWdVa0FDQUZJQUkyQWhBZ0JTQUJOZ0lNSUFVZ0FqWUNJQ0FGSUFFMkFod2dCU0FETmdJVUlBVWdBeUFFYWpZQ0dDQUZJQVZCREdvMkFpUWdCVUUwYWlBRlFSUnFFSW9GUVFRaEFVRUFJUUpCQUNFRElBVW9BalJCZ0lDQWdIaEhCRUFnQlVFRVFRUkJERUg0K00wQUVKb0ZJQVZCUEdvb0FnQWhBU0FGS0FJQUlRSWdCU2dDQkNJRUlBVXBBalEzQWdBZ0JFRUlhaUFCTmdJQUlBVkJBVFlDTUNBRklBUTJBaXdnQlNBQ05nSW9JQVZCMEFCcUlBVkJKR29vQWdBMkFnQWdCVUhJQUdvZ0JVRWNhaWtDQURjREFDQUZJQVVwQWhRM0EwQkJEQ0VCUVFFaEFnTkFJQVZCMUFCcUlBVkJRR3NRaWdVZ0JTZ0NWRUdBZ0lDQWVFWkZCRUFnQlNnQ0tDQUNSZ1JBSUFWQktHcEJBUkROQnlBRktBSXNJUVFMSUFFZ0JHb2lBeUFGS1FKVU53SUFJQU5CQ0dvZ0JVSGNBR29vQWdBMkFnQWdCU0FDUVFGcUlnSTJBakFnQVVFTWFpRUJEQUVMQ3lBRktBSW9JUU1nQlNnQ0xDRUJDeUFBSUFFZ0FrRUJRUUFRZ1FFZ0FTQUNFSThISUFNZ0FSRG1DU0FGUWVBQWFpUUFDNGdEQWdkL0FYNGpBRUVRYXlJRUpBQWdBQ2dDQkNJSEJFQWdBQ2dDQUNFRkFrQWdBQ2dDRENJQ1JRMEFJQVZCQ0dvaEFDQUZLUU1BUW4rRlFvQ0Jnb1NJa0tEQWdIK0RJUWhCQVNFRElBVWhCZ05BSUFORkRRRURRQ0FJUWdCU1JRUkFJQVpCd0FOcklRWWdBQ2tEQUVKL2hVS0FnWUtFaUpDZ3dJQi9neUVJSUFCQkNHb2hBQXdCQ3dzZ0JpQUllcWRCQTNaQlNHeHFJZ0ZCT0dzb0FnQWdBVUUwYXlnQ0FCQ3VDU0FJUWdGOUlBaURJUWdnQWtFQmF5SUNJUU1DUUFKQUFrQUNRQUpBQWtBQ1FDQUJRU2hyTFFBQURnZ0JBZ01IQkFVR0J3QUxJQUZCSUdzUXRRRU1CZ3NnQVVFa2F5Z0NBQ0FCUVNCcktBSUFFSzRKREFVTElBRkJKR3NvQWdBZ0FVRWdheWdDQUJDdUNRd0VDeUFCUVNScktBSUFJQUZCSUdzb0FnQVFyZ2tNQXdzZ0FVRWtheENRQ1F3Q0N5QUJRU1JyRUpBSkRBRUxJQUZCSkdzb0FnQWdBVUVnYXlnQ0FCQ3VDUXdBQ3dBTElBUkJCR3BCT0VFSUlBZEJBV29RNmdNZ0JTQUVLQUlNYXlBRUtBSUVJQVFvQWdnUTBBZ0xJQVJCRUdva0FBdVZBd0lKZndGK0l3QkJRR29pQkNRQUlBSWdBeWdDREJFR0FDRUpJQVJCQURZQ0RDQUVRb0NBZ0lEQUFEY0NCRUVFSVFZZ0JFRVlhaUVLSUFFb0FnQWhDeUFCS0FJRUtBSVVJUXdnQUFKL0EwQUNRQ0FFUVJScUlnZ2dDeUFDSUFNZ0RCRUFBQ0FFS0FJVVFRVkhCRUFnQ0JEOUJ5QUVJQUVvQWdnaUFUWUNFQ0FCSUFWTERRRWdBQ0FFS1FJRU53SUVJQUJCREdvZ0JFRU1haWdDQURZQ0FFRUZEQU1MSUFRb0FnUWdCVVlFUUNBRVFRUnFFTklGSUFRb0FnZ2hCZ3NnQ2lrQ0FDRU5JQVlnQjJvaUNFRUlhaUFLUVFocUtBSUFOZ0lBSUFnZ0RUY0NBQ0FFSUFWQkFXb2lCVFlDRENBRUtBSVVRUVZIQkVBZ0JFRVVhaEQ5QndzZ0IwRU1haUVIREFFTEN5QUNJQWtnQXlnQ0dCRUJBQ0FFUVFNMkFoZ2dCRUdzek5JQU5nSVVJQVJDQWpjQ0lDQUVRUm8yQWpnZ0JFRWFOZ0l3SUFRZ0JUWUNQQ0FFSUFSQkxHbzJBaHdnQkNBRVFUeHFOZ0kwSUFRZ0JFRVFhallDTENBQVFRaHFJQVJCRkdvUW5nTWdBQ0FKTmdJRUlBWWdCUkNKQnlBRUtBSUVJQVlRcndsQkFRczJBZ0FnQkVGQWF5UUFDL01DQWdWL0FuNGpBRUh3QUdzaUFpUUFJQUpCR0dwQ0FEY0RBQ0FDUWdBM0F4QWdBU2tERUNFSElBRkJHR29pQkNBQkxRQllJZ1ZxUVlBQk9nQUFJQUpCS0dvZ0FVRUlhaWtDQURjREFDQUNJQUVwQWdBM0F5QWdBa0VJYWlBRlFRRnFJQVJCd0FCQndMREpBQkNmQnlBRnJTQUNLQUlNSVFNZ0FpZ0NDQ0VHQTBBZ0F3UkFJQVpCQURvQUFDQURRUUZySVFNZ0JrRUJhaUVHREFFTEMwSURoaUFIUWdtR2hDRUhBa0FnQlVFNGNVRTRSd1JBSUFFZ0J6Y0RVQ0FDUVNCcUlBUVE0QWtNQVFzZ0FrRWdhaUlESUFRUTRBa2dBa0V3YWlJRVFRQkJPUHdMQUNBQ0lBYzNBR2dnQXlBRUVPQUpDMEVBSVFNZ0FVRUFPZ0JZUVFSQkVFRUVFTVFJSWdFZ0FVRUVUeHRCQW5RaEFRTkFJQUVnQTBaRkJFQWdBaUFDUVNCcUlBTnFLQUlBTmdJd0lBSkJFR29nQTJwQkJDQUNRVEJxUVFSQi9MSEpBQkNzQnlBRFFRUnFJUU1NQVFzTElBQWdBaWtERURjQUFDQUFRUWhxSUFKQkdHb3BBd0EzQUFBZ0FrSHdBR29rQUF2V0FnRU5meUFBSUFBb0FoZ2lCRUVZZHlBRWN5SUZJQUFvQWh3aUFYTWlCaUFCUVJoM0lBRnpJZ0VnQUNnQ0VDSURRUmgzSUFOeklnb2dBQ2dDRkNJQ2N5SUljeUlIUVJCM2N5QUhjellDSENBQUlBUWdBaUFDUVJoM2N5SUhjeUlFSUFBb0FnQWlBa0VZZHlBQ2N5SUxjeUlKUVJCM0lBbHpJQUVnQW5NaUNYTTJBZ0FnQUNBRUlBVWdBeUFBS0FJTUlnSkJHSGNnQW5NaUJYTWdBWE1pREhNaUEwRVFkM01nQTNNMkFoZ2dBQ0FJSUFJZ0FDZ0NDQ0lEUVJoM0lBTnpJZzF6SUFGeklnSWdCaUFIYzNNaUIwRVFkM01nQjNNMkFoUWdBQ0FDSUFFZ0N5QUFLQUlFSWdGemN5SUlJQVFnQlhOeklnVkJFSGR6SUFWek5nSU1JQUFnQXlBQklBRkJHSGR6SWdGeklnTWdCaUFOY3lBSmN5SUNRUkIzY3lBQ2N6WUNDQ0FBSUFFZ0JDQUdjeUlCY3lJR0lBWkJFSGR6SUFoek5nSUVJQUFnQVNBRGN5QUtjeUlBSUFCQkVIZHpJQXh6TmdJUUMvNENBUWwvQW44Z0FDZ0NVQ0lESUFBb0FnQWlBa2NFUUNBQ0lBTkxEQUVMSUFBdkFWUWdBQzhCQkVrTElRTWdBRUdnQVVId0FRSi9JQUFvQXZBQklnSWdBQ2dDb0FFaUJVY0VRQ0FDSUFWSkRBRUxJQUF2QWZRQklBQXZBYVFCU1FzaUJodHFJUVVnQUNBRFJVSFFBR3hxSVFJQ2Z5QUFRZkFCUWFBQklBWWJhaUlHS0FJQUlnUWdBQ0FEUWRBQWJHb2lDU2dDQUNJQVJ3UkFJQUFnQkVzTUFRc2dCaThCQkNBSkx3RUVTUXNoQXdKL0lBVWdBaUFHSUFNYkFuOGdCU2dDQUNJQUlBSW9BZ0FpQkVjRVFDQUFJQVJKREFFTElBVXZBUVFnQWk4QkJFa0xJZ0FiSWdRb0FnQWlDQ0FKSUFZZ0FpQUFHeUFER3lJS0tBSUFJZ2RIQkVBZ0J5QUlTd3dCQ3lBRUx3RUVJQW92QVFSSkN5RUlRUUFpQjBVRVFDQUJJQVlnQ1NBREcwSFFBUHdLQUFBTElBZEZCRUFnQVVIUUFHb2dCQ0FLSUFnYlFkQUEvQW9BQUFzZ0IwVUVRQ0FCUWFBQmFpQUtJQVFnQ0J0QjBBRDhDZ0FBQ3lBSFJRUkFJQUZCOEFGcUlBSWdCU0FBRzBIUUFQd0tBQUFMQzVvREFRTi9Jd0JCOEFCcklnUWtBQ0FDSUFNb0Fnd1JCZ0FoQmlBRVFUQnFJQUVvQWdBZ0FpQURJQUVvQWdRb0FoUVJBQUFDUUFKQUFrQWdCQzBBTUNJRlFRaEdCRUFnQkVFamFpQUVRY1FBYWlrQ0FEY0FBQ0FFUVJ0cUlBUkJQR29wQWdBM0FBQWdCQ0FFS1FJME53QVREQUVMSUFSQjJBQnFJQUVvQWdnZ0FpQURJQUVvQWd3b0FoUVJBQUFnQkNnQ1dFRUZSZzBCSUFSQkkyb2dCRUhvQUdvcEFnQTNBQUFnQkVFYmFpQUVRZUFBYWlrQ0FEY0FBQ0FFSUFRcEFsZzNBQk1nQkVFd2FoRHBCQXNnQWlBR0lBTW9BaGdSQVFCQkNDRUZEQUVMSUFSQkoyb2dCRUhJQUdvb0FBQTJBQUFnQkVFZ2FpQUVRY0VBYWlrQUFEY0RBQ0FFUVJocUlBUkJPV29wQUFBM0F3QWdCRUVJYWlBRVFkUUFhaWdDQURZQ0FDQUVJQVFwQURFM0F4QWdCQ0FFS1FKTU53TUFDeUFBSUFVNkFBQWdBQ0FFS1FNUU53QUJJQUFnQkNrREFEY0NIQ0FBUVFscUlBUkJHR29wQXdBM0FBQWdBRUVSYWlBRVFTQnFLUU1BTndBQUlBQkJHR29nQkVFbmFpZ0FBRFlBQUNBQVFTUnFJQVJCQ0dvb0FnQTJBZ0FnQkVId0FHb2tBQXZYQWdFRGZ5TUFRVUJxSWdNa0FDQURRVGhxUWdBM0F3QWdBMEV3YWtJQU53TUFJQU5CS0dwQ0FEY0RBQ0FEUWdBM0F5QWdBMEVnYWlJRVFRZ2dBaUFDUVJCcUVIc2dCQ0FCUVFnUTFnVkJDQ0VDQTBBZ0EwRWdhaUlFUVFnUVhTQUVFSW9CSUFOQkdHb2dBU0FDSUFKQkNHb2lBa0dNbmNBQUVNSUZJQVFnQXlnQ0dDQURLQUljRU5ZRklBSkIwQUJHQkVBZ0JFRUlFS29GSUFSQkNCQmRJQVFnQVVIQUFtcEJDQkRXQlNBQUlBUVFxQUVnQTBGQWF5UUFCU0FEUVNCcUlnUkJDQkJkSUFRUXJRRWdBMEVRYWlBQklBSWdBa0VJYWlJRlFaeWR3QUFRd2dVZ0JDQURLQUlRSUFNb0FoUVExZ1VnQkVFSUVGMGdCQkNMQVNBRFFRaHFJQUVnQlNBQ1FSQnFJZ1ZCckozQUFCRENCU0FFSUFNb0FnZ2dBeWdDREJEV0JTQUVRUWdRWFNBRUVJd0NJQU1nQVNBRklBSkJHR29pQWtHOG5jQUFFTUlGSUFRZ0F5Z0NBQ0FES0FJRUVOWUZEQUVMQ3d2WEFnRURmeU1BUVVCcUlnTWtBQ0FEUVRocVFnQTNBd0FnQTBFd2FrSUFOd01BSUFOQktHcENBRGNEQUNBRFFnQTNBeUFnQTBFZ2FpSUVRUWdnQWlBQ1FSQnFFSHNnQkNBQlFRZ1ExZ1ZCQ0NFQ0EwQWdBMEVnYWlJRVFRZ1FYU0FFRUlvQklBTkJHR29nQVNBQ0lBSkJDR29pQWtHTW5zQUFFTU1GSUFRZ0F5Z0NHQ0FES0FJY0VOWUZJQUpCOEFCR0JFQWdCRUVJRUtvRklBUkJDQkJkSUFRZ0FVSEFBMnBCQ0JEV0JTQUFJQVFRcUFFZ0EwRkFheVFBQlNBRFFTQnFJZ1JCQ0JCZElBUVFyUUVnQTBFUWFpQUJJQUlnQWtFSWFpSUZRWnlld0FBUXd3VWdCQ0FES0FJUUlBTW9BaFFRMWdVZ0JFRUlFRjBnQkJDTEFTQURRUWhxSUFFZ0JTQUNRUkJxSWdWQnJKN0FBQkREQlNBRUlBTW9BZ2dnQXlnQ0RCRFdCU0FFUVFnUVhTQUVFSXdDSUFNZ0FTQUZJQUpCR0dvaUFrRzhuc0FBRU1NRklBUWdBeWdDQUNBREtBSUVFTllGREFFTEN3dWFBd0VEZnlNQVFmQUFheUlFSkFBZ0FpQURLQUlNRVFZQUlRWWdCRUV3YWlBQktBSUFJQUlnQXlBQktBSUVLQUlVRVFBQUFrQUNRQUpBSUFRdEFEQWlCVUVKUmdSQUlBUkJJMm9nQkVIRUFHb3BBZ0EzQUFBZ0JFRWJhaUFFUVR4cUtRSUFOd0FBSUFRZ0JDa0NORGNBRXd3QkN5QUVRZGdBYWlBQktBSUlJQUlnQXlBQktBSU1LQUlVRVFBQUlBUW9BbGhCQlVZTkFTQUVRU05xSUFSQjZBQnFLUUlBTndBQUlBUkJHMm9nQkVIZ0FHb3BBZ0EzQUFBZ0JDQUVLUUpZTndBVElBUkJNR29RekFRTElBSWdCaUFES0FJWUVRRUFRUWtoQlF3QkN5QUVRU2RxSUFSQnlBQnFLQUFBTmdBQUlBUkJJR29nQkVIQkFHb3BBQUEzQXdBZ0JFRVlhaUFFUVRscUtRQUFOd01BSUFSQkNHb2dCRUhVQUdvb0FnQTJBZ0FnQkNBRUtRQXhOd01RSUFRZ0JDa0NURGNEQUFzZ0FDQUZPZ0FBSUFBZ0JDa0RFRGNBQVNBQUlBUXBBd0EzQWh3Z0FFRUphaUFFUVJocUtRTUFOd0FBSUFCQkVXb2dCRUVnYWlrREFEY0FBQ0FBUVJocUlBUkJKMm9vQUFBMkFBQWdBRUVrYWlBRVFRaHFLQUlBTmdJQUlBUkI4QUJxSkFBTDZ3SUNCbjhDZmlNQVFTQnJJZ1VrQUVFVUlRTWdBQ0lKUXVnSFdnUkFJQWtoQ2dOQUlBVkJER29nQTJvaUJFRURheUFLSUFwQ2tNNEFnQ0lKUXBET0FINTlweUlHUWYvL0EzRkI1QUJ1SWdkQkFYUWlDRUhmOXNBQWFpMEFBRG9BQUNBRVFRUnJJQWhCM3ZiQUFHb3RBQUE2QUFBZ0JFRUJheUFHSUFkQjVBQnNhMEgvL3dOeFFRRjBJZ1pCMy9iQUFHb3RBQUE2QUFBZ0JFRUNheUFHUWQ3MndBQnFMUUFBT2dBQUlBTkJCR3NoQXlBS1F2K3M0Z1JXSUFraENnMEFDd3NnQ1VJSlZnUkFJQU1nQldwQkMyb2dDYWNpQkNBRVFmLy9BM0ZCNUFCdUlnUkI1QUJzYTBILy93TnhRUUYwSWdaQjMvYkFBR290QUFBNkFBQWdBMEVDYXlJRElBVkJER3BxSUFaQjN2YkFBR290QUFBNkFBQWdCSzBoQ1FzZ0FGQkZJQWxRY1VVRVFDQURRUUZySWdNZ0JVRU1hbW9nQ2FkQkFYUkJIbkZCMy9iQUFHb3RBQUE2QUFBTElBSWdBVUVCUVFBZ0JVRU1haUFEYWtFVUlBTnJFSU1CSUFWQklHb2tBQXVQQXdJS2Z3RitJd0JCTUdzaUFpUUFJQUVvQWdBaUJDOEI0Z0VoQ2hEd0J5SUhJQVF2QWVJQklnZ2dBU2dDQ0NJRlFYOXphaUlET3dIaUFTQUNRU2hxSUFRZ0JVRU1iR29pQmtIa0FHb29BZ0EyQWdBZ0FpQUdRZHdBYWlrQ0FEY0RJQ0FFSUFWQkEzUnFJZ2tvQWdBaEN5QUpLQUlFSVFrZ0FrRVlhaUFESUFkQjNBQnFFTUlISUFaQjZBQnFJQWdnQlVFQmFpSUdheUlJSUFJb0FoZ2dBaWdDSEJENEJpQUNRUkJxSUFNZ0J4REJCeUFFSUFaQkEzUnFJQWdnQWlnQ0VDQUNLQUlVRVBNR0lBUWdCVHNCNGdFZ0J5OEI0Z0VpQmtFQmFpRURBa0FnQmtFTVNRUkFJQW9nQldzZ0EwY05BU0FEUVFKMElnTUVRQ0FIUWVRQmFpQUVJQVZCQW5ScVFlZ0JhaUFEL0FvQUFBc2dBa0VJYWlBSElBRW9BZ1FpQVJEN0F5QUNLUU1JSVF3Z0FDQUJOZ0lZSUFBZ0JEWUNGQ0FBSUFJcEF5QTNBZ0FnQUVFSWFpQUNRU2hxS0FJQU5nSUFJQUFnRERjQ0hDQUFJQWsyQWhBZ0FDQUxOZ0lNSUFKQk1Hb2tBQThMSUFOQkRFSEFrc2tBRUxnSkFBdEI2SkhKQUVFb1FaQ1N5UUFRbkFZQUM1TURBUVovSXdCQlFHb2lBaVFBSUFGQkNHb2hCU0FCS0FJQUlRWWdBa0VzYWlFSElBRW9BZ1FoQXdKQUFrQUNRQUpBQTBBZ0FpQUROZ0lRSUFJZ0JqWUNEQ0FDSUFFcEFoQTNBaHdnQWlBQktRSUlOd0lVSUFKQkpHb2dBa0VNYWhDUEFpQUNMUUE4SWdSQk8wY0VRRUVDSUFSQk9Xc2lBeUFEUVFKUEcwRUJhdzRDQXdRQ0N5QURJQUlvQWlnaUJFY0VRQ0FCSUFRMkFnUWdBU0FDS0FJa0lnWTJBZ0FnQlNBSEtRSUFOd0lBSUFWQkNHb2dCMEVJYWlrQ0FEY0NBQ0FFSVFNTUFRc0xJQUJCTVRvQUhDQUFRUUUyQWdBZ0FDQUJLUUlBTndJRUlBQkJGR29nQVVFUWFpa0NBRGNDQUNBQVFReHFJQUZCQ0dvcEFnQTNBZ0FNQXdzZ0FDQUNLQUlrTmdJRUlBQkJBRFlDQUF3Q0N5QUFRUU0yQWdBZ0FDQUJLUUlBTndJRUlBQkJGR29nQVVFUWFpa0NBRGNDQUNBQVFReHFJQUZCQ0dvcEFnQTNBZ0FNQVFzZ0FDQUNLUUlrTndJRUlBQkJBallDQUNBQVFSeHFJQUpCUEdvb0FnQTJBZ0FnQUVFVWFpQUNRVFJxS1FJQU53SUFJQUJCREdvZ0FrRXNhaWtDQURjQ0FBc2dBa0ZBYXlRQUM3RURBUUYvSXdCQlFHb2lBaVFBQWtBQ1FBSkFBa0FDUUFKQUlBQXRBQUJCQVdzT0F3RUNBd0FMSUFJZ0FDZ0NCRFlDQkVHQTROb0FMUUFBR2tFVUVCWWlBRVVOQkNBQVFSQnFRZENaMGdBb0FBQTJBQUFnQUVFSWFrSEltZElBS1FBQU53QUFJQUJCd0puU0FDa0FBRGNBQUNBQ1FSUTJBaEFnQWlBQU5nSU1JQUpCRkRZQ0NDQUNRUU0yQWl3Z0FrR1VsZElBTmdJb0lBSkNBamNDTkNBQ0lBSkJCR3F0UW9DQWdJRGdDSVEzQXlBZ0FpQUNRUWhxclVLQWdJQ0E4QWlFTndNWUlBSWdBa0VZYWpZQ01DQUJLQUlBSUFFb0FnUWdBa0VvYWhDRkFTRUFJQUlvQWdnaUFVVU5BeUFDS0FJTUlBRkJBUkRqQkF3REN5QUFMUUFCSVFBZ0FrRUJOZ0lzSUFKQmhJL1NBRFlDS0NBQ1FnRTNBalFnQWlBQ1FSaHFyVUtBZ0lDQTRBQ0VOd01JSUFJZ0FFRUNkQ0lBUVp6WjJnQnFLQUlBTmdJY0lBSWdBRUhFMnRvQWFpZ0NBRFlDR0NBQ0lBSkJDR28yQWpBZ0FTZ0NBQ0FCS0FJRUlBSkJLR29RaFFFaEFBd0NDeUFCSUFBb0FnUWlBQ2dDQUNBQUtBSUVFRWNoQUF3QkN5QUFLQUlFSWdBb0FnQWdBU0FBS0FJRUtBSVFFUU1BSVFBTElBSkJRR3NrQUNBQUR3c0FDNllEQWdsL0FYNGpBRUh3QUdzaUJDUUFJQVJCR0dvZ0FTZ0NBQ0lJUVFJUXRRUWdBaUFES0FJTUlna1JCZ0FoQ2lBREtBSVVJUXNnQXlnQ0VDRU1RUUFoQVNBRUtBSWNJUVlnQkNnQ0lDRUZBMEFDUUFKQUlBRWdCVWNFUUNBRVFSQnFJQUlnREJFQkFDQUVMUUFRQkg4Z0JDQUVMUUFSSWdjNkFDY2dCaUFGSUFGQjRNelNBQkQrQnkwQUFDQUhRZjhCY1VZTkFpQUVRUWhxSUFnUXdRVWdCQ0FFS1FNSU53Sm9JQVlnQlNBQlFmRE0wZ0FRL2djaEFTQUVRUmcyQW1RZ0JFRVlOZ0pjSUFRZ0FUWUNXQ0FFUVJrMkFsUWdCRUVETmdJOElBUkJtTTNTQURZQ09DQUVRZ00zQWtRZ0JDQUVRU2RxTmdKZ0lBUWdCRUhvQUdvMkFsQWdCQ0FFUWRBQWFqWUNRQ0FFUVNocUlBUkJPR29RbmdNZ0JDa0RLQ0VOSUFRb0FqQWhCU0FDSUFrUkJnQWhCMEVCQlVFQUN5RUJJQUlnQ2lBREtBSVlFUUVBSUFBZ0JUWUNFQ0FBSUEwM0FnZ2dBQ0FITmdJRUlBQWdBVFlDQUNBRUtBSVlJQVlROWdrTUFnc2dBQ0FFS1FJY053SUlJQUFnQkNnQ0dEWUNCQ0FBUVFVMkFnQU1BUXNnQWlBTEVRUUFJQUZCQVdvaEFRd0JDd3NnQkVId0FHb2tBQXZtQXdJSmZ3RitJd0JCOEFCcklnUWtBQ0FFUVJocUlBRW9BZ0FpQjBFRUVMVUVJQUlnQXlnQ0RDSUxFUVlBSVF3Z0F5Z0NGQ0VJSUFNb0FoQWhDVUVBSVFFZ0JDZ0NIQ0VLSUFRb0FpQWhCZ05BQWtBQ1FDQUJJQVpIQkVBZ0JFRVFhaUFDSUFrUkFRQWdCQzBBRUFSL0lBUWdCQzBBRVNJRk9nQW5JQW9nQmlBQlFlRE0wZ0FRL2djdEFBQWdCVUgvQVhGR0RRSWpBRUVRYXlJRkpBQWdCVUVFYWlBSFFRUVFaeUFGS0FJSUlRY2dCRUVJYWlJSVFRd2dCU2dDRENBRktBSUVJZ2tiTmdJRUlBaEJxSWZTQUNBSElBa2JOZ0lBSUFWQkVHb2tBQ0FFSUFRcEF3ZzNBbWdnQ2lBR0lBRkI4TXpTQUJEK0J5RUJJQVJCR0RZQ1pDQUVRUmcyQWx3Z0JDQUJOZ0pZSUFSQkdUWUNWQ0FFUVFNMkFqd2dCRUdZemRJQU5nSTRJQVJDQXpjQ1JDQUVJQVJCSjJvMkFtQWdCQ0FFUWVnQWFqWUNVQ0FFSUFSQjBBQnFOZ0pBSUFSQktHb2dCRUU0YWhDZUF5QUVLUU1vSVEwZ0JDZ0NNQ0VHSUFJZ0N4RUdBQ0VGUVFFRlFRQUxJUUVnQWlBTUlBTW9BaGdSQVFBZ0FDQUdOZ0lRSUFBZ0RUY0NDQ0FBSUFVMkFnUWdBQ0FCTmdJQUlBUW9BaGdnQ2hEMkNRd0NDeUFBSUFRcEFodzNBZ2dnQUNBRUtBSVlOZ0lFSUFCQkJUWUNBQXdCQ3lBQ0lBZ1JCQUFnQVVFQmFpRUJEQUVMQ3lBRVFmQUFhaVFBQzg0Q0FRTi9Jd0JCUUdvaUF5UUFJQU5CT0dwQ0FEY0RBQ0FEUVRCcVFnQTNBd0FnQTBFb2FrSUFOd01BSUFOQ0FEY0RJQ0FEUVNCcUlnUkJDQ0FDSUFKQkVHb1FleUFFSUFGQndBSnFRUWdRMWdVZ0JCQmxJQVJCQ0JDcUJVSElBQ0VDQTBBZ0EwRVlhaUFCSUFJZ0FrRUlha0hNbk1BQUVNSUZJQU5CSUdvaUJDQURLQUlZSUFNb0Fod1ExZ1VnQkJCd0lBUVFaU0FDUVFocklnSUVRQ0FEUVJCcUlBRWdBaUFDUVFocVFkeWN3QUFRd2dVZ0EwRWdhaUlFSUFNb0FoQWdBeWdDRkJEV0JTQUVFTGdCSUFRUVpTQURRUWhxSUFFZ0FrRUlheUlGSUFKQjdKekFBQkRDQlNBRUlBTW9BZ2dnQXlnQ0RCRFdCU0FFRUhFZ0JCQmxJQU1nQVNBQ1FSQnJJQVZCL0p6QUFCRENCU0FFSUFNb0FnQWdBeWdDQkJEV0JTQUNRUmhySVFJZ0JCQ09BU0FFRUdVTUFRVWdCQ0FCUVFnUTFnVWdBQ0FFRUtnQklBTkJRR3NrQUFzTEM4NENBUU4vSXdCQlFHb2lBeVFBSUFOQk9HcENBRGNEQUNBRFFUQnFRZ0EzQXdBZ0EwRW9ha0lBTndNQUlBTkNBRGNESUNBRFFTQnFJZ1JCQ0NBQ0lBSkJFR29RZXlBRUlBRkJ3QU5xUVFnUTFnVWdCQkJsSUFSQkNCQ3FCVUhvQUNFQ0EwQWdBMEVZYWlBQklBSWdBa0VJYWtITW5jQUFFTU1GSUFOQklHb2lCQ0FES0FJWUlBTW9BaHdRMWdVZ0JCQndJQVFRWlNBQ1FRaHJJZ0lFUUNBRFFSQnFJQUVnQWlBQ1FRaHFRZHlkd0FBUXd3VWdBMEVnYWlJRUlBTW9BaEFnQXlnQ0ZCRFdCU0FFRUxnQklBUVFaU0FEUVFocUlBRWdBa0VJYXlJRklBSkI3SjNBQUJEREJTQUVJQU1vQWdnZ0F5Z0NEQkRXQlNBRUVIRWdCQkJsSUFNZ0FTQUNRUkJySUFWQi9KM0FBQkREQlNBRUlBTW9BZ0FnQXlnQ0JCRFdCU0FDUVJocklRSWdCQkNPQVNBRUVHVU1BUVVnQkNBQlFRZ1ExZ1VnQUNBRUVLZ0JJQU5CUUdza0FBc0xDK1lEQWdsL0FYNGpBRUh3QUdzaUJDUUFJQVJCR0dvZ0FTZ0NBQ0lIUVFVUXRRUWdBaUFES0FJTUlnc1JCZ0FoRENBREtBSVVJUWdnQXlnQ0VDRUpRUUFoQVNBRUtBSWNJUW9nQkNnQ0lDRUdBMEFDUUFKQUlBRWdCa2NFUUNBRVFSQnFJQUlnQ1JFQkFDQUVMUUFRQkg4Z0JDQUVMUUFSSWdVNkFDY2dDaUFHSUFGQjRNelNBQkQrQnkwQUFDQUZRZjhCY1VZTkFpTUFRUkJySWdVa0FDQUZRUVJxSUFkQkJSQm5JQVVvQWdnaEJ5QUVRUWhxSWdoQkRDQUZLQUlNSUFVb0FnUWlDUnMyQWdRZ0NFR29oOUlBSUFjZ0NSczJBZ0FnQlVFUWFpUUFJQVFnQkNrRENEY0NhQ0FLSUFZZ0FVSHd6TklBRVA0SElRRWdCRUVZTmdKa0lBUkJHRFlDWENBRUlBRTJBbGdnQkVFWk5nSlVJQVJCQXpZQ1BDQUVRWmpOMGdBMkFqZ2dCRUlETndKRUlBUWdCRUVuYWpZQ1lDQUVJQVJCNkFCcU5nSlFJQVFnQkVIUUFHbzJBa0FnQkVFb2FpQUVRVGhxRUo0RElBUXBBeWdoRFNBRUtBSXdJUVlnQWlBTEVRWUFJUVZCQVFWQkFBc2hBU0FDSUF3Z0F5Z0NHQkVCQUNBQUlBWTJBaEFnQUNBTk53SUlJQUFnQlRZQ0JDQUFJQUUyQWdBZ0JDZ0NHQ0FLRVBZSkRBSUxJQUFnQkNrQ0hEY0NDQ0FBSUFRb0FoZzJBZ1FnQUVFRk5nSUFEQUVMSUFJZ0NCRUVBQ0FCUVFGcUlRRU1BUXNMSUFSQjhBQnFKQUFMNXdJQkNIOGpBRUVRYXlJRkpBQkJDaUVDSUFBaUEwSG9CMDhFUUNBRElRUURRQ0FGUVFacUlBSnFJZ1pCQTJzZ0JDQUVRWkRPQUc0aUEwR1F6Z0JzYXlJSFFmLy9BM0ZCNUFCdUlnaEJBWFFpQ1VIZjlzQUFhaTBBQURvQUFDQUdRUVJySUFsQjN2YkFBR290QUFBNkFBQWdCa0VCYXlBSElBaEI1QUJzYTBILy93TnhRUUYwSWdkQjMvYkFBR290QUFBNkFBQWdCa0VDYXlBSFFkNzJ3QUJxTFFBQU9nQUFJQUpCQkdzaEFpQUVRZitzNGdSTElBTWhCQTBBQ3dzQ1FDQURRUWxOQkVBZ0F5RUVEQUVMSUFJZ0JXcEJCV29nQXlBRFFmLy9BM0ZCNUFCdUlnUkI1QUJzYTBILy93TnhRUUYwSWdOQjMvYkFBR290QUFBNkFBQWdBa0VDYXlJQ0lBVkJCbXBxSUFOQjN2YkFBR290QUFBNkFBQUxRUUFnQUNBRUcwVUVRQ0FDUVFGcklnSWdCVUVHYW1vZ0JFRUJkRUVlY1VIZjlzQUFhaTBBQURvQUFBc2dBVUVCUVFGQkFDQUZRUVpxSUFKcVFRb2dBbXNRZ3dFZ0JVRVFhaVFBQytjQ0FRaC9Jd0JCRUdzaUJpUUFRUW9oQXlBQUlnUkI2QWRQQkVBZ0JDRUZBMEFnQmtFR2FpQURhaUlIUVFOcklBVWdCVUdRemdCdUlnUkJrTTRBYkdzaUNFSC8vd054UWVRQWJpSUpRUUYwSWdwQjMvYkFBR290QUFBNkFBQWdCMEVFYXlBS1FkNzJ3QUJxTFFBQU9nQUFJQWRCQVdzZ0NDQUpRZVFBYkd0Qi8vOERjVUVCZENJSVFkLzJ3QUJxTFFBQU9nQUFJQWRCQW1zZ0NFSGU5c0FBYWkwQUFEb0FBQ0FEUVFScklRTWdCVUgvck9JRVN5QUVJUVVOQUFzTEFrQWdCRUVKVFFSQUlBUWhCUXdCQ3lBRElBWnFRUVZxSUFRZ0JFSC8vd054UWVRQWJpSUZRZVFBYkd0Qi8vOERjVUVCZENJRVFkLzJ3QUJxTFFBQU9nQUFJQU5CQW1zaUF5QUdRUVpxYWlBRVFkNzJ3QUJxTFFBQU9nQUFDMEVBSUFBZ0JSdEZCRUFnQTBFQmF5SURJQVpCQm1wcUlBVkJBWFJCSG5GQjMvYkFBR290QUFBNkFBQUxJQUlnQVVFQlFRQWdCa0VHYWlBRGFrRUtJQU5yRUlNQklBWkJFR29rQUF2akFnRUZmeU1BUVlBQmF5SUNKQUFnQWtFSWFpQUJFSGdDZnlBQ0tBSWdJZ05CREVZRVFDQUNLQUlvSVFFZ0FpZ0NKQ0lEQkVBZ0FrSDRBR29nQWtFOGFpa0NBRGNEQUNBQ1FmQUFhaUFDUVRScUtRSUFOd01BSUFJZ0Fpa0NMRGNEYUFzZ0FDQUNLUU5vTndJa0lBQWdBVFlDSUNBQUlBTTJBaHdnQUVFMGFpQUNRZmdBYWlrREFEY0NBQ0FBUVN4cUlBSkI4QUJxS1FNQU53SUFRUXdoQVVFWURBRUxJQUFnQWlrRENEY0RBQ0FBUVJCcUlBSkJHR29wQXdBM0F3QWdBRUVJYWlBQ1FSQnFLUU1BTndNQUlBSkI4QUJxSWdRZ0FrRTBhaWtDQURjREFDQUNRZmdBYWlJRklBSkJQR29wQWdBM0F3QWdBaUFDS1FJc053Tm9JQUlvQWlnaEFTQUNLQUlrSVFZZ0FFRThhaUFDUWNRQWFrRWsvQW9BQUNBQVFUUnFJQVVwQXdBM0FnQWdBRUVzYWlBRUtRTUFOd0lBSUFBZ0Fpa0RhRGNDSkNBQUlBWTJBaHdnQUNBRE5nSVlRU0FMSUFCcUlBRTJBZ0FnQWtHQUFXb2tBQXVDQXdFRWZ5QUFLQUlNSVFJQ1FBSkFBa0FnQVVHQUFrOEVRQ0FBS0FJWUlRTUNRQUpBSUFBZ0FrWUVRQ0FBUVJSQkVDQUFLQUlVSWdJYmFpZ0NBQ0lCRFFGQkFDRUNEQUlMSUFBb0FnZ2lBU0FDTmdJTUlBSWdBVFlDQ0F3QkN5QUFRUlJxSUFCQkVHb2dBaHNoQkFOQUlBUWhCU0FCSWdKQkZHb2dBa0VRYWlBQ0tBSVVJZ0ViSVFRZ0FrRVVRUkFnQVJ0cUtBSUFJZ0VOQUFzZ0JVRUFOZ0lBQ3lBRFJRMENBa0FnQUNnQ0hFRUNkRUdVM05vQWFpSUJLQUlBSUFCSEJFQWdBeWdDRUNBQVJnMEJJQU1nQWpZQ0ZDQUNEUU1NQkFzZ0FTQUNOZ0lBSUFKRkRRUU1BZ3NnQXlBQ05nSVFJQUlOQVF3Q0N5QUFLQUlJSWdBZ0FrY0VRQ0FBSUFJMkFnd2dBaUFBTmdJSUR3dEJyTi9hQUVHczM5b0FLQUlBUVg0Z0FVRURkbmR4TmdJQUR3c2dBaUFETmdJWUlBQW9BaEFpQVFSQUlBSWdBVFlDRUNBQklBSTJBaGdMSUFBb0FoUWlBRVVOQUNBQ0lBQTJBaFFnQUNBQ05nSVlEd3NQQzBHdzM5b0FRYkRmMmdBb0FnQkJmaUFBS0FJY2QzRTJBZ0FMK0FJQkJYOGpBRUhRQUdzaUJDUUFJQUlnQXlnQ0RCRUdBQ0VGSUFSQkJHb2dBU2dDQUNBQ0lBTWdBU2dDQkNnQ0ZCRUFBQUpBQWtBZ0JDZ0NCRUVGUndSQUlBQWdCQ2tDQkRjQ0FDQUFRUkJxSUFSQkZHb3BBZ0EzQWdBZ0FFRUlhaUFFUVF4cUtRSUFOd0lBREFFTElBUkJQR29pQmlBRVFRaHFFSnNFSUFRb0FqeEJnSUNBZ0hoSERRRWdCQ0FFS0FKRUlnY2dCQ2dDU0VFUUVOb0JJQVF0QUFFaEFTQUVMUUFBSVFnZ0JDZ0NRQ0FIRVBZSklBQUNmeUFJQkVBZ0JDQUJPZ0FmSUFJZ0JTQURLQUlZRVFFQUlBUkJBVFlDSkNBRVFkak0wZ0EyQWlBZ0JFSUJOd0lzSUFSQklEWUNRQ0FFSUFZMkFpZ2dCQ0FFUVI5cU5nSThJQUJCQ0dvZ0JFRWdhaENlQXlBQUlBVTJBZ1JCQWd3QkN5QUFJQUU2QUFSQkJRczJBZ0FMSUFSQjBBQnFKQUFQQ3lBRVFUQnFJQVJCekFCcUtBSUFOZ0lBSUFSQktHb2dCRUhFQUdvcEFnQTNBd0FnQkNBRUtRSThOd01nUVlEUDBnQkJLeUFFUVNCcVFhQ1F3QUJCc0pEQUFCQ01CQUFMK0FJQkJYOGpBRUhRQUdzaUJDUUFJQUlnQXlnQ0RCRUdBQ0VGSUFSQkJHb2dBU2dDQUNBQ0lBTWdBU2dDQkNnQ0ZCRUFBQUpBQWtBZ0JDZ0NCRUVGUndSQUlBQWdCQ2tDQkRjQ0FDQUFRUkJxSUFSQkZHb3BBZ0EzQWdBZ0FFRUlhaUFFUVF4cUtRSUFOd0lBREFFTElBUkJQR29pQmlBRVFRaHFFSnNFSUFRb0FqeEJnSUNBZ0hoSERRRWdCQ0FFS0FKRUlnY2dCQ2dDU0VFSUVOb0JJQVF0QUFFaEFTQUVMUUFBSVFnZ0JDZ0NRQ0FIRVBZSklBQUNmeUFJQkVBZ0JDQUJPZ0FmSUFJZ0JTQURLQUlZRVFFQUlBUkJBVFlDSkNBRVFkak0wZ0EyQWlBZ0JFSUJOd0lzSUFSQklEWUNRQ0FFSUFZMkFpZ2dCQ0FFUVI5cU5nSThJQUJCQ0dvZ0JFRWdhaENlQXlBQUlBVTJBZ1JCQWd3QkN5QUFJQUU2QUFSQkJRczJBZ0FMSUFSQjBBQnFKQUFQQ3lBRVFUQnFJQVJCekFCcUtBSUFOZ0lBSUFSQktHb2dCRUhFQUdvcEFnQTNBd0FnQkNBRUtRSThOd01nUVlEUDBnQkJLeUFFUVNCcVFhQ1F3QUJCd0pEQUFCQ01CQUFMK0FJQkJYOGpBRUhRQUdzaUJDUUFJQUlnQXlnQ0RCRUdBQ0VGSUFSQkJHb2dBU2dDQUNBQ0lBTWdBU2dDQkNnQ0ZCRUFBQUpBQWtBZ0JDZ0NCRUVGUndSQUlBQWdCQ2tDQkRjQ0FDQUFRUkJxSUFSQkZHb3BBZ0EzQWdBZ0FFRUlhaUFFUVF4cUtRSUFOd0lBREFFTElBUkJQR29pQmlBRVFRaHFFSnNFSUFRb0FqeEJnSUNBZ0hoSERRRWdCQ0FFS0FKRUlnY2dCQ2dDU0VFSUVOb0JJQVF0QUFFaEFTQUVMUUFBSVFnZ0JDZ0NRQ0FIRVBZSklBQUNmeUFJQkVBZ0JDQUJPZ0FmSUFJZ0JTQURLQUlZRVFFQUlBUkJBVFlDSkNBRVFkak0wZ0EyQWlBZ0JFSUJOd0lzSUFSQklEWUNRQ0FFSUFZMkFpZ2dCQ0FFUVI5cU5nSThJQUJCQ0dvZ0JFRWdhaENlQXlBQUlBVTJBZ1JCQWd3QkN5QUFJQUU2QUFSQkJRczJBZ0FMSUFSQjBBQnFKQUFQQ3lBRVFUQnFJQVJCekFCcUtBSUFOZ0lBSUFSQktHb2dCRUhFQUdvcEFnQTNBd0FnQkNBRUtRSThOd01nUVlEUDBnQkJLeUFFUVNCcVFhek8wZ0JCNE03U0FCQ01CQUFMK0FJQkJYOGpBRUhRQUdzaUJDUUFJQUlnQXlnQ0RCRUdBQ0VGSUFSQkJHb2dBU2dDQUNBQ0lBTWdBU2dDQkNnQ0ZCRUFBQUpBQWtBZ0JDZ0NCRUVGUndSQUlBQWdCQ2tDQkRjQ0FDQUFRUkJxSUFSQkZHb3BBZ0EzQWdBZ0FFRUlhaUFFUVF4cUtRSUFOd0lBREFFTElBUkJQR29pQmlBRVFRaHFFSnNFSUFRb0FqeEJnSUNBZ0hoSERRRWdCQ0FFS0FKRUlnY2dCQ2dDU0VFUUVOb0JJQVF0QUFFaEFTQUVMUUFBSVFnZ0JDZ0NRQ0FIRVBZSklBQUNmeUFJQkVBZ0JDQUJPZ0FmSUFJZ0JTQURLQUlZRVFFQUlBUkJBVFlDSkNBRVFkak0wZ0EyQWlBZ0JFSUJOd0lzSUFSQklEWUNRQ0FFSUFZMkFpZ2dCQ0FFUVI5cU5nSThJQUJCQ0dvZ0JFRWdhaENlQXlBQUlBVTJBZ1JCQWd3QkN5QUFJQUU2QUFSQkJRczJBZ0FMSUFSQjBBQnFKQUFQQ3lBRVFUQnFJQVJCekFCcUtBSUFOZ0lBSUFSQktHb2dCRUhFQUdvcEFnQTNBd0FnQkNBRUtRSThOd01nUVlEUDBnQkJLeUFFUVNCcVFhek8wZ0JCME03U0FCQ01CQUFMaGdNQkJYOGpBRUV3YXlJRUpBQUNRQUpBQWtBQ1FBSkFJQUVvQWhnaUJnNENBd0VBQ3lBQktRTUFJQUVwQXdnZ0FpQURFSjhFSVFnZ0JDQUdOZ0ljSUFRZ0F6WUNGQ0FFSUFJMkFoQWdCQ0FCS0FJVUlnYzJBaGdnQVNnQ0hDQUJLQUlnSUFpdElBUkJFR29RaHdJaUFVVU5BaUFCUVFScktBSUFJUVVNQVFzZ0FpQURJQUVvQWhRaUIwSE1BR29vQWdBZ0IwSFFBR29vQWdBUXdnbEZEUUVMSUFVZ0JrOE5BU0FISUFWQjJBQnNhaUVGQ3lBRVFTUnFJQUlnQXhDQ0FTQUVLQUlvSVFJZ0JFRUlhaUFFS0FJc0lnRkJsTmJTQUJDZkJTQUVLQUlJSVFZZ0JDZ0NEQ0VESUFFRVFDQURJQUlnQWZ3S0FBQUxJQVFnQVRZQ0hDQUVJQU0yQWhnZ0JDQUdOZ0lVSUFSQmlJQ0FnSGcyQWhBQ1FDQUZCRUFnQUVHZmdJQ0FlRFlDQUNBQUlBVTJBZ1FnQkVFUWFoQ25Bd3dCQ3lBQUlBUXBBaEEzQWdBZ0FFRVFhaUFFUVNCcUtBSUFOZ0lBSUFCQkNHb2dCRUVZYWlrQ0FEY0NBQXNnQkNnQ0pDQUNFT0FJSUFSQk1Hb2tBQThMSUFVZ0JrR1VuOGtBRU1ZRUFBdnFBZ0VGZnlNQVFkQUFheUlFSkFBZ0FpQURLQUlNRVFZQUlRWWdCRUVnYWlBQktBSUFJQUlnQXlBQktBSUVLQUlVRVFBQUFrQUNRQUovSUFRb0FpQWlCVUVGUndSQUlBUkJFR29nQkVFdmFpa0FBRGNEQUNBRVFSaHFJQVJCTjJvdEFBQTZBQUFnQkNBRUtRQW5Od01JSUFRdkFTUWdCRUVtYWkwQUFFRVFkSElNQVFzZ0JDMEFKU0VISUFRdEFDUWhDQ0FFUVRocUlBRW9BZ2dnQWlBRElBRW9BZ3dvQWhRUkFBQWdCQ2dDT0NJRlFRVkdEUUVnQkVFUWFpQUVRY2NBYWlrQUFEY0RBQ0FFUVJocUlBUkJ6d0JxTFFBQU9nQUFJQVFnQkNrQVB6Y0RDQ0FFTHdFOElBUkJQbW90QUFCQkVIUnlDeUVCSUFJZ0JpQURLQUlZRVFFQURBRUxJQWRCQ0hRZ0NISWdCQzBBUEVFUWRISWhBVUVGSVFVTElBQWdBVHNCQkNBQUlBVTJBZ0FnQUNBRUtRTUlOd0FISUFCQkJtb2dBVUVRZGpvQUFDQUFRUTlxSUFSQkVHb3BBd0EzQUFBZ0FFRVhhaUFFUVJocUxRQUFPZ0FBSUFSQjBBQnFKQUFMOUFJQkNIOGpBRUh3QUdzaUJDUUFJQUlnQXlnQ0RCRUdBQ0VJSUFSQkFEWUNGQ0FFUW9DQWdJQ0FBVGNDRENBQktBSUFJUW9nQVNnQ0JDZ0NGQ0VMUVFnaENTQUFBbjhEUUFKQUlBUkJHR29pQnlBS0lBSWdBeUFMRVFBQUlBUXRBQmhCQ0VZRVFDQUhFUDhISUFRZ0FTZ0NDQ0lCTmdKQUlBRWdCVXNOQVNBQUlBUXBBZ3czQWdRZ0FFRU1haUFFUVJScUtBSUFOZ0lBUVFVTUF3c2dCQ2dDRENBRlJnUkFJQVJCREdvUTBRVWdCQ2dDRUNFSkN5QUdJQWxxSUFSQkdHb2lCMEVvL0FvQUFDQUVJQVZCQVdvaUJUWUNGQ0FFTFFBWVFRaEdCRUFnQnhEL0J3c2dCa0VvYWlFR0RBRUxDeUFDSUFnZ0F5Z0NHQkVCQUNBRVFRTTJBa2dnQkVHc3pOSUFOZ0pFSUFSQ0FqY0NVQ0FFUVJvMkFtZ2dCRUVhTmdKZ0lBUWdCVFlDYkNBRUlBUkIzQUJxTmdKTUlBUWdCRUhzQUdvMkFtUWdCQ0FFUVVCck5nSmNJQUJCQ0dvZ0JFSEVBR29RbmdNZ0FDQUlOZ0lFSUFSQkRHb1E5Z2hCQVFzMkFnQWdCRUh3QUdva0FBdjlBZ0VJZnlNQVFZQUJheUlFSkFBZ0FpQURLQUlNRVFZQUlRZ2dCRUVBTmdJVUlBUkNnSUNBZ0lBQk53SU1JQUVvQWdBaENpQUJLQUlFS0FJVUlRdEJDQ0VKSUFBQ2Z3TkFBa0FnQkVFWWFpSUhJQW9nQWlBRElBc1JBQUFnQkNnQ0dFR0FnSUNBZUVZRVFDQUhFSjBISUFRZ0FTZ0NDQ0lCTmdKUUlBRWdCVXNOQVNBQUlBUXBBZ3czQWdRZ0FFRU1haUFFUVJScUtBSUFOZ0lBUVFVTUF3c2dCQ2dDRENBRlJnUkFJQVJCREdvUTB3VWdCQ2dDRUNFSkN5QUdJQWxxSUFSQkdHb2lCMEU0L0FvQUFDQUVJQVZCQVdvaUJUWUNGQ0FFS0FJWVFZQ0FnSUI0UmdSQUlBY1FuUWNMSUFaQk9Hb2hCZ3dCQ3dzZ0FpQUlJQU1vQWhnUkFRQWdCRUVETmdKWUlBUkJyTXpTQURZQ1ZDQUVRZ0kzQW1BZ0JFRWFOZ0o0SUFSQkdqWUNjQ0FFSUFVMkFud2dCQ0FFUWV3QWFqWUNYQ0FFSUFSQi9BQnFOZ0owSUFRZ0JFSFFBR28yQW13Z0FFRUlhaUFFUWRRQWFoQ2VBeUFBSUFnMkFnUWdCRUVNYWhDMUJrRUJDellDQUNBRVFZQUJhaVFBQy9RQ0FRaC9Jd0JCOEFCcklnUWtBQ0FDSUFNb0Fnd1JCZ0FoQ0NBRVFRQTJBaFFnQkVLQWdJQ0FnQUUzQWd3Z0FTZ0NBQ0VLSUFFb0FnUW9BaFFoQzBFSUlRa2dBQUovQTBBQ1FDQUVRUmhxSWdjZ0NpQUNJQU1nQ3hFQUFDQUVMUUFZUVFsR0JFQWdCeENGQ0NBRUlBRW9BZ2dpQVRZQ1FDQUJJQVZMRFFFZ0FDQUVLUUlNTndJRUlBQkJER29nQkVFVWFpZ0NBRFlDQUVFRkRBTUxJQVFvQWd3Z0JVWUVRQ0FFUVF4cUVORUZJQVFvQWhBaENRc2dCaUFKYWlBRVFSaHFJZ2RCS1B3S0FBQWdCQ0FGUVFGcUlnVTJBaFFnQkMwQUdFRUpSZ1JBSUFjUWhRZ0xJQVpCS0dvaEJnd0JDd3NnQWlBSUlBTW9BaGdSQVFBZ0JFRUROZ0pJSUFSQnJNelNBRFlDUkNBRVFnSTNBbEFnQkVFYU5nSm9JQVJCR2pZQ1lDQUVJQVUyQW13Z0JDQUVRZHdBYWpZQ1RDQUVJQVJCN0FCcU5nSmtJQVFnQkVGQWF6WUNYQ0FBUVFocUlBUkJ4QUJxRUo0RElBQWdDRFlDQkNBRVFReHFFSkFKUVFFTE5nSUFJQVJCOEFCcUpBQUwvUUlCQ0g4akFFR0FBV3NpQkNRQUlBSWdBeWdDREJFR0FDRUlJQVJCQURZQ0ZDQUVRb0NBZ0lDQUFUY0NEQ0FCS0FJQUlRb2dBU2dDQkNnQ0ZDRUxRUWdoQ1NBQUFuOERRQUpBSUFSQkdHb2lCeUFLSUFJZ0F5QUxFUUFBSUFRb0FoaEJnSUNBZ0hoR0JFQWdCeENtQnlBRUlBRW9BZ2dpQVRZQ1VDQUJJQVZMRFFFZ0FDQUVLUUlNTndJRUlBQkJER29nQkVFVWFpZ0NBRFlDQUVFRkRBTUxJQVFvQWd3Z0JVWUVRQ0FFUVF4cUVOTUZJQVFvQWhBaENRc2dCaUFKYWlBRVFSaHFJZ2RCT1B3S0FBQWdCQ0FGUVFGcUlnVTJBaFFnQkNnQ0dFR0FnSUNBZUVZRVFDQUhFS1lIQ3lBR1FUaHFJUVlNQVFzTElBSWdDQ0FES0FJWUVRRUFJQVJCQXpZQ1dDQUVRYXpNMGdBMkFsUWdCRUlDTndKZ0lBUkJHallDZUNBRVFSbzJBbkFnQkNBRk5nSjhJQVFnQkVIc0FHbzJBbHdnQkNBRVFmd0FhallDZENBRUlBUkIwQUJxTmdKc0lBQkJDR29nQkVIVUFHb1FuZ01nQUNBSU5nSUVJQVJCREdvUXV3WkJBUXMyQWdBZ0JFR0FBV29rQUF2MkFnRUhmeU1BUVRCcklnUWtBQ0FFSUFFb0FnQWdBaUFESUFFb0FnUW9BaFFSQUFBQ1FDQUVLQUlBUVFWSEJFQWdBQ0FFS1FJQU53SUFJQUJCRUdvZ0JFRVFhaWtDQURjQ0FDQUFRUWhxSUFSQkNHb3BBZ0EzQWdBTUFRc2dCQ2dDQ0NFR0lBUW9BZ1FnQkNnQ0RCQ3VDQ0lDUVNnNkFBQkJER3doQ1NBRVFTUnFJUWRCQVNFRlFRQWhBVUVCSVFNRFFDQUJJQWxHUlFSQUlBY2dBU0FHYWlJS0tRSUFOd0lBSUFkQkNHb2dDa0VJYWlnQ0FEWUNBQ0FFSUFNMkFpQWdCQ0FDTmdJY0lBUWdCVFlDR0NBRVFSaHFJQVFvQWlnZ0JDZ0NMQkRBQlNBRUtBSWdJUU1nQkNnQ0hDRUNJQVFvQWhnaEJTQUVLQUlrSUFRb0FpZ1FyZ2tnQVVFTWFpRUJEQUVMQ3lBRUlBSTJBaHdnQkNBRE5nSWdJQVFnQlRZQ0dDQUdFSzhKSUFNZ0JVWUVmeUFFUVJocVFlQ1F3QUFRclFNZ0JDZ0NIQVVnQWdzZ0EycEJLVG9BQUNBQVFRUnFJZ0ZCQ0dvZ0EwRUJhallDQUNBQklBUXBBaGczQWdBZ0FFRUZOZ0lBQ3lBRVFUQnFKQUFMOWdJQkIzOGpBRUV3YXlJRUpBQWdCQ0FCS0FJQUlBSWdBeUFCS0FJRUtBSVVFUUFBQWtBZ0JDZ0NBRUVGUndSQUlBQWdCQ2tDQURjQ0FDQUFRUkJxSUFSQkVHb3BBZ0EzQWdBZ0FFRUlhaUFFUVFocUtRSUFOd0lBREFFTElBUW9BZ2doQmlBRUtBSUVJQVFvQWd3UXJnZ2lBa0VvT2dBQVFReHNJUWtnQkVFa2FpRUhRUUVoQlVFQUlRRkJBU0VEQTBBZ0FTQUpSa1VFUUNBSElBRWdCbW9pQ2lrQ0FEY0NBQ0FIUVFocUlBcEJDR29vQWdBMkFnQWdCQ0FETmdJZ0lBUWdBallDSENBRUlBVTJBaGdnQkVFWWFpQUVLQUlvSUFRb0Fpd1F3QVVnQkNnQ0lDRURJQVFvQWh3aEFpQUVLQUlZSVFVZ0JDZ0NKQ0FFS0FJb0VLNEpJQUZCREdvaEFRd0JDd3NnQkNBQ05nSWNJQVFnQXpZQ0lDQUVJQVUyQWhnZ0JoQ3ZDU0FESUFWR0JIOGdCRUVZYWtHQTBkSUFFSzBESUFRb0Fod0ZJQUlMSUFOcVFTazZBQUFnQUVFRWFpSUJRUWhxSUFOQkFXbzJBZ0FnQVNBRUtRSVlOd0lBSUFCQkJUWUNBQXNnQkVFd2FpUUFDL2NDQWd4L0FYNGpBRUd3QVdzaUFpUUFJQUVvQWdBaUF5OEI5Z1loQ1JEeUJ5SUdJQU12QWZZR0lnZ2dBU2dDQ0NJRVFYOXphaUlIT3dIMkJpQURJQVJCQTNScUlnVW9BZ0FoQ2lBRkx3RUVJUXNnQXlBRVFjZ0FiR29oQlVFQVJRUkFJQUpCNkFCcUlBVkIyQUJxUWNnQS9Bb0FBQXNnQWtFUWFpQUhJQVlRd2djZ0F5QUVRUUZxSWcxQkEzUnFJQWdnRFdzaUNDQUNLQUlRSUFJb0FoUVE4d1lnQWtFSWFpQUhJQVpCMkFCcUVNRUhJQVZCb0FGcUlBZ2dBaWdDQ0NBQ0tBSU1FUGNHSUFNZ0JEc0I5Z1lnREVVRVFDQUNRU0JxSUFKQjZBQnFRY2dBL0FvQUFBc2dCaThCOWdZaUJVRUJhaUVISUFWQkRFa0VRQ0FESUFSQkFuUnFRZndHYWlBSklBUnJJQVpCK0FacUlBY1E4Z1lnQWlBR0lBRW9BZ1FpQVJEOUF5QUNLUU1BSVE0Z0FDQUJOZ0pVSUFBZ0F6WUNVQ0FBSUFzN0FRUWdBQ0FLTmdJQUlBQkJCbW9nQWtFZWFrSEtBUHdLQUFBZ0FDQU9Od05ZSUFKQnNBRnFKQUFQQ3lBSFFReEJ3SkxKQUJDNENRQUw2QUlCQkg4akFFRWdheUlDSkFBQ1FDQUJLQUlRSWdNZ0FTZ0NCQ0lFU3cwQUlBRWdBellDRkNBQ0lBRW9BZ0EyQWhRZ0FpQUVyU0FEclVJZ2hvUTNBaGdEUUNBRElBUlBEUUVnQWtFUWFpQUNRUlJxRUtzR0lBSXRBQkJGRFFFQ1FBSkFBa0FnQWkwQUVTSURFSjhHUlFSQVFRSWhCQUpBQWtBQ1FDQURRZjhCY1VFY2F3NERCUUVBQWdzRFFDQUNLQUljSUFJb0FoaFBEUVlnQWtFSWFpQUNRUlJxRUtzR0lBSXRBQWhGRFFnZ0FpMEFDU0lEUWU4QlN3MEdJQU5CRDNGQkQwY05BQXNNQlF0QkJDRUVEQU1MSUFOQklHdEIvd0Z4UWRjQlR3MEJEQU1MSUFOQi93RnhJZ05CREVZRVFDQUNJQUpCRkdvUXF3WWdBaTBBQUVVTkJTQUNMUUFCUWJBSmFpRURDeUFCSUFJb0FodzJBaEJCQVNFRkRBUUxJQU5CQ1dwQi93RnhRUWhQRFFOQkFTRUVDeUFDSUFJb0Fod2dCR28yQWh3TElBSW9BaGdoQkNBQ0tBSWNJUU1NQUFzQUN5QUFJQU03QVFJZ0FDQUZPd0VBSUFKQklHb2tBQXZSQWdJQmZ3SitJd0JCMEFCcklnVWtBQ0FGUVRocUlBRWdBaUFESUFRUXBBUUNRQ0FGS0FJNFFaK0FnSUI0UndSQUlBVkJNR29nQlVISUFHb29BZ0EyQWdBZ0JVRW9haUFGUVVCcktRSUFOd01BSUFVZ0JTa0NPRGNESUF3QkN5QUZRU0JxSUFVb0FqeEJnWnZKQUVFRUlBRWdBaENJQXdzQ1FDQUZLQUlnUVorQWdJQjRSd1JBSUFWQkdHb2dCVUV3YWlnQ0FEWUNBQ0FGUVJCcUlBVkJLR29wQXdBM0F3QWdCU0FGS1FNZ053TUlEQUVMSUFWQkNHb2dCU2dDSkJEYkJBc0NmeUFGS0FJSVFaK0FnSUI0UmdSQUlBVW9BZ3dpQVNnQ0NDRUNJQUVvQWdRTUFRc2dCVUhJQUdvZ0JVRVlhaWdDQURZQ0FDQUZRVUJySUFWQkVHb3BBd0FpQmpjREFDQUZJQVVwQXdnaUJ6Y0RPQ0FIcDBHZmdJQ0FlRVlFUUNBR3B5RUNJQVVvQWp3TUFRc2dCVUU0YWhETkFrRUFDeUVCSUFBZ0FqWUNCQ0FBSUFFMkFnQWdCVUhRQUdva0FBdlJBZ0VHZnlNQVFSQnJJZ1lrQUVFQklRY0NRQUpBQWtBQ1FBSkFBa0FnQWc0Q0JRQUJDMEVCSVFRZ0FTMEFBRUVyYXc0REJBRUVBUXNnQVMwQUFFRXJSZ1JBSUFGQkFXb2hBU0FDUVFGcklnVWhCQ0FDUVFSSkRRRU1BZ3RCQWlFRUlBSWhCU0FDUVFKTERRRUxRUUFoQlFOQUlBUkZCRUFnQlNFRVFRQWhCd3dFQ3lBR0lBRXRBQUFnQXhDbUJpQUdLQUlBUVFGeFJRMENJQUZCQVdvaEFTQUVRUUZySVFRZ0JpZ0NCQ0FESUFWc2FpRUZEQUFMQUF0QkFDRUNBMEFnQlVVRVFDQUNJUVJCQUNFSERBTUxJQVpCQ0dvZ0FTMEFBQ0FERUtZR0lBWW9BZ2hCQVhGRkRRRkJBaUVFSUFKQi93RnhJQU5CL3dGeGJDSUpRUWgyRFFJZ0FVRUJhaUVCSUFWQkFXc2hCU0FKSUFZb0Fnd2lDR29oQWlBSlFmOEJjU0FJUWY4QmNXb2lDRUgvQVhFZ0NFWU5BQXNNQVF0QkFTRUVDeUFBSUFRNkFBRWdBQ0FIT2dBQUlBWkJFR29rQUF2Q0FnRU1meUFDSUFGQkRHeEJER3NpQTJvaEJTQUFJQU5xSVFZZ0FDQUJRUUYySWdkQkRHeHFJZ05CREdzaEJBTkFJQWNFUUNBQ0lBTWdBQ0FES0FJQUlna2dBQ2dDQUNJS1NTSUxHeUlJS1FJQU53SUFJQUpCQ0dvZ0NFRUlhaWdDQURZQ0FDQUZJQVFnQmlBR0tBSUFJZ2dnQkNnQ0FDSU1TU0lOR3lJT0tRSUFOd0lBSUFWQkNHb2dEa0VJYWlnQ0FEWUNBQ0FIUVFGcklRY2dCVUVNYXlFRklBSkJER29oQWlBRVFYUkJBQ0FORzJvaEJDQUdRWFJCQUNBSUlBeFBHMm9oQmlBQUlBa2dDazlCREd4cUlRQWdBeUFMUVF4c2FpRUREQUVGQWtBZ0JFRU1haUVFSUFGQkFYRUVmeUFDSUFBZ0F5QUFJQVJKSWdFYklnVXBBZ0EzQWdBZ0FrRUlhaUFGUVFocUtBSUFOZ0lBSUFNZ0FDQUVUMEVNYkdvaEF5QUFJQUZCREd4cUJTQUFDeUFFUmlBRElBWkJER3BHY1EwQUVPc0dBQXNMQ3d2M0FnSUJmd044SXdCQjBBQnJJZ01rQUNBRElBRTJBZ3dnQTBFd2FpQUJLQUtZQWlBQktBS2NBaUFDRUxrREVOc0VBa0FDUUFKQUFrQWdBeWdDTUVHZmdJQ0FlRVlFUUNBRElBTW9BalFpQVNnQ0JDSUNOZ0pFSUFNZ0FpQUJLQUlJUWNnQWJHbzJBa2dnQXlBRFFReHFOZ0pNSUFOQkVHb2lBU0FEUWNRQWFpSUNFTW9FSUFNb0FoQkZEUUlnQXlzREdDRUVJQUVnQWhES0JDQURLQUlRUlEwRElBTXJBeGdoQlNBQklBSVF5Z1FnQXlnQ0VFVU5CQ0FES3dNWUlRWWdBMEVnYWlJQklBVTVBd0FnQTBFb2FpSUNJQVk1QXdBZ0F5QUVPUU1ZSUFCQkdHb2dBaWtEQURjREFDQUFRUkJxSUFFcEF3QTNBd0FnQUNBREtRTVlOd01JSUFCQ0FUY0RBQXdCQ3lBRFFTUnFJQU5CUUdzb0FnQTJBZ0FnQTBFY2FpQURRVGhxS1FJQU53SUFJQU1nQXlrQ01EY0NGQ0FEUVFFMkFoQWdBRUlBTndNQUlBTkJFR3BCQkhJUXpnSUxJQU5CMEFCcUpBQVBDMEdRamNvQUVMc0pBQXRCb0kzS0FCQzdDUUFMUWJDTnlnQVF1d2tBQy9VQ0FnTi9BWDRqQUVIUUFHc2lBeVFBSUFOQklHb2dBU2dDbUFJZ0FTZ0NuQUlnQWhDNUF4RGJCQUpBQWtBQ1FBSkFJQU1vQWlCQm40Q0FnSGhHQkVBZ0F5Z0NKQ0lDS0FJRUlRRWdBeUFDS0FJSUlnUkJDRUVJUWZqNHpRQVFtZ1VnQTBFQU5nSThJQU1nQXlrREFEY0NOQ0FEUVRScUlBUVExUWNnQXlnQ1BDRUZJQVFFUUNBREtBSTRJQVZCQTNScUlRSURRQ0FEUVVCcklBRVFzd1lnQXlnQ1FFVU5CaUFDSUFNckEwZzVBd0FnQVVISUFHb2hBU0FDUVFocUlRSWdCVUVCYWlFRklBUkJBV3NpQkEwQUN3c2dBMEVJYWtFRWNpSUJJQU1wQWpRM0FnQWdBVUVJYWlBRk5nSUFEQUVMSUFOQkdHb2dBMEV3YWlnQ0FEWUNBQ0FEUVJCcUlBTkJLR29wQWdBM0F3QWdBeUFES1FJZ0lnWTNBd2dnQnFkQm40Q0FnSGhIRFFFTElBQWdBeWtDRERjQ0FDQUFRUWhxSUFOQkZHb29BZ0EyQWdBTUFRc2dBRUdBZ0lDQWVEWUNBQ0FEUVFocUVNMENDeUFEUWRBQWFpUUFEd3RCaklmU0FFRUtRWmo5elFBUS9RUUFDOG9DQVFaL0lBRWdBa0VCZEdvaENTQUFRWUQrQTNGQkNIWWhDaUFBUWY4QmNTRU1Ba0FDUUFKQUFrQURRQ0FCUVFKcUlRc2dCeUFCTFFBQklnSnFJUWdnQ2lBQkxRQUFJZ0ZIQkVBZ0FTQUtTdzBFSUFnaEJ5QUxJZ0VnQ1VjTkFRd0VDeUFISUFoTERRRWdCQ0FJU1EwQ0lBTWdCMm9oQVFOQUlBSkZCRUFnQ0NFSElBc2lBU0FKUncwQ0RBVUxJQUpCQVdzaEFpQUJMUUFBSUFGQkFXb2hBU0FNUncwQUN3dEJBQ0VDREFNTElBY2dDRUc4Z2NFQUVMY0pBQXNnQ0NBRVFieUJ3UUFRdUFrQUN5QUFRZi8vQTNFaEJ5QUZJQVpxSVFOQkFTRUNBMEFnQlVFQmFpRUFBa0FnQlN3QUFDSUJRUUJPQkVBZ0FDRUZEQUVMSUFBZ0EwY0VRQ0FGTFFBQklBRkIvd0J4UVFoMGNpRUJJQVZCQW1vaEJRd0JDMEdzZ2NFQUVMc0pBQXNnQnlBQmF5SUhRUUJJRFFFZ0FrRUJjeUVDSUFNZ0JVY05BQXNMSUFKQkFYRUw2UUlDQVg4Q2ZpTUFRZkFBYXlJRUpBQWdCRUVvYWlBQklBSWdBeEN2QWlBRUtBSXdJUUlnQkNnQ0xDRUJBa0FnQkNnQ0tDSURSUVJBSUFFRVFDQUVRZWdBYWlBRVFjUUFhaWtDQURjREFDQUVRZUFBYWlBRVFUeHFLUUlBTndNQUlBUWdCQ2tDTkRjRFdBc2dBQ0FFS1FOWU53SU1JQUFnQWpZQ0NDQUFJQUUyQWdRZ0FFRUFOZ0lBSUFCQkhHb2dCRUhvQUdvcEF3QTNBZ0FnQUVFVWFpQUVRZUFBYWlrREFEY0NBQXdCQ3lBRVFlZ0FhaUFFUWNRQWFpa0NBQ0lGTndNQUlBUkI0QUJxSUFSQlBHb3BBZ0FpQmpjREFDQUVRU0JxSUFSQjFBQnFLQUlBTmdJQUlBUkJDR29nQmpjREFDQUVRUkJxSUFVM0F3QWdCQ0FFS1FJMElnVTNBMWdnQkNBRUtRSk1Od01ZSUFBZ0JUY0NEQ0FBUVJScUlBWStBZ0FnQUNBRUtRSU1Od0lZSUFCQklHb2dCRUVVYWlrQ0FEY0NBQ0FBUVNocUlBUkJIR29wQWdBM0FnQWdBQ0FDTmdJSUlBQWdBVFlDQkNBQUlBTTJBZ0FMSUFSQjhBQnFKQUFMNXdJQ0FuOENmaU1BUWZBQWF5SURKQUFnQTBFb2FpQUJJQUlRaGdRZ0F5Z0NNQ0VDSUFNb0Fpd2hBUUpBSUFNb0FpZ2lCRVVFUUNBQkJFQWdBMEhvQUdvZ0EwSEVBR29wQWdBM0F3QWdBMEhnQUdvZ0EwRThhaWtDQURjREFDQURJQU1wQWpRM0ExZ0xJQUFnQXlrRFdEY0NEQ0FBSUFJMkFnZ2dBQ0FCTmdJRUlBQkJBRFlDQUNBQVFSeHFJQU5CNkFCcUtRTUFOd0lBSUFCQkZHb2dBMEhnQUdvcEF3QTNBZ0FNQVFzZ0EwSG9BR29nQTBIRUFHb3BBZ0FpQlRjREFDQURRZUFBYWlBRFFUeHFLUUlBSWdZM0F3QWdBMEVnYWlBRFFkUUFhaWdDQURZQ0FDQURRUWhxSUFZM0F3QWdBMEVRYWlBRk53TUFJQU1nQXlrQ05DSUZOd05ZSUFNZ0F5a0NURGNER0NBQUlBVTNBZ3dnQUVFVWFpQUdQZ0lBSUFBZ0F5a0NERGNDR0NBQVFTQnFJQU5CRkdvcEFnQTNBZ0FnQUVFb2FpQURRUnhxS1FJQU53SUFJQUFnQWpZQ0NDQUFJQUUyQWdRZ0FDQUVOZ0lBQ3lBRFFmQUFhaVFBQzhrQ0FRWi9Jd0JCRUdzaUJDUUFRUUVoQlFKQUFrQUNRQUpBQWtBQ1FDQUNEZ0lGQUFFTFFRRWhBeUFCTFFBQVFTdHJEZ01FQVFRQkN5QUJMUUFBUVN0R0JFQWdBVUVCYWlFQklBSkJCRWtnQWtFQmF5SURJUUlOQVF3Q0MwRUNJUU1nQWtFRFR3MEJDMEVBSVFJRFFDQURSUVJBSUFJaEEwRUFJUVVNQkFzZ0JDQUJMUUFBUVJBUXBnWWdCQ2dDQUVFQmNVVU5BaUFCUVFGcUlRRWdBMEVCYXlFRElBUW9BZ1FnQWtFRWRHb2hBZ3dBQ3dBTFFRQWhCZ05BSUFKRkJFQWdCaUVEUVFBaEJRd0RDeUFFUVFocUlBRXRBQUJCRUJDbUJpQUVLQUlJUVFGeFJRMEJRUUloQXlBR1FmOEJjVUVQU3cwQ0lBRkJBV29oQVNBQ1FRRnJJUUlnQmtFRWRDSUhJQVFvQWd3aUNHb2hCaUFIUWY4QmNTQUlRZjhCY1dvaUIwSC9BWEVnQjBZTkFBc01BUXRCQVNFREN5QUFJQU02QUFFZ0FDQUZPZ0FBSUFSQkVHb2tBQXZxQWdJRmZ3RitJd0JCSUdzaUFpUUFJQUF0QUFzaEF5QUNRZ0EzQXhnZ0FTZ0NBQ0VGQWtBQ2Z5QUJLQUlFSWdSQndBQWdBMnNpQmtINEFYRkJBM1lpQTA4RVFDQUNRUkJxSUFKQkdHb2dBMEhNME5vQUVMd0dJQUlvQWhBZ0FpZ0NGQ0FGSUFOQjNORGFBQkNzQnlBQktBSUVJZ1FnQTBrTkFpQUdRZmdCY1NFRklBUWdBMnNoQkNBQktBSUFJQU5xREFFTElBSkJDR29nQWtFWWFpQUVRYXpRMmdBUXZBWWdBaWdDQ0NBQ0tBSU1JQVVnQkVHODBOb0FFS3dISUFSQkEzUWhCVUVBSVFSQkFRc2hBeUFCSUFRMkFnUWdBU0FETmdJQUlBQWdBQzBBQ3lJQklBVnFPZ0FMSUFBZ0FDa0RBQ0FDS1FNWUlnZENPSVlnQjBLQS9nT0RRaWlHaENBSFFvQ0EvQWVEUWhpR0lBZENnSUNBK0ErRFFnaUdoSVFnQjBJSWlFS0FnSUQ0RDRNZ0IwSVlpRUtBZ1B3SGc0UWdCMElvaUVLQS9nT0RJQWRDT0lpRWhJUWdBVUUvY2EySWhEY0RBQ0FDUVNCcUpBQVBDeUFESUFSQjdORGFBQkM1Q1FBTDRnSUNCWDhCZmlNQVFTQnJJZ1FrQUNBRUlBSTJBaEFnQVNrREVDQUJLUU1ZSUFJUS93TWhDU0FFSUFSQkVHbzJBaFFnQVNnQ0NFVUVRQ0FCSUFGQkVHb1FwQUVMSUFRZ0JFRVVhallDR0NBRUlBRTJBaHdnQkVFSWFpQUJLQUlBSUFFb0FnUWdDU0FFUVJocVFTZ1FqZ0lnQVNnQ0FDRUNJQVFvQWd3aEJRSkFJQVFvQWdoQkFYRUVRQ0FDSUFWcUlnWXRBQUFoQnlBRUtBSVFJUWdnQmlBSnAwRVpkaUlHT2dBQUlBSWdBU2dDQkNBRlFRaHJjV3BCQ0dvZ0Jqb0FBQ0FBUVlDQWdJQjROZ0lBSUFFZ0FTZ0NERUVCYWpZQ0RDQUJJQUVvQWdnZ0IwRUJjV3MyQWdnZ0FpQUZRUVIwYXlJQVFSQnJJQWcyQWdBZ0FFRU1heUlBSUFNcEFnQTNBZ0FnQUVFSWFpQURRUWhxS0FJQU5nSUFEQUVMSUFBZ0FpQUZRUVIwYTBFTWF5SUJLUUlBTndJQUlBRWdBeWtDQURjQ0FDQUFRUWhxSUFGQkNHb2lBQ2dDQURZQ0FDQUFJQU5CQ0dvb0FnQTJBZ0FMSUFSQklHb2tBQXZsQWdJRGZ3SitJd0JCOEFCcklnSWtBQ0FDUVNocUlBRVFqUUVnQWlnQ01DRURJQUlvQWl3aEFRSkFJQUlvQWlnaUJFVUVRQ0FCQkVBZ0FrSG9BR29nQWtIRUFHb3BBZ0EzQXdBZ0FrSGdBR29nQWtFOGFpa0NBRGNEQUNBQ0lBSXBBalEzQTFnTElBQWdBaWtEV0RjQ0RDQUFJQU0yQWdnZ0FDQUJOZ0lFSUFCQkFEWUNBQ0FBUVJ4cUlBSkI2QUJxS1FNQU53SUFJQUJCRkdvZ0FrSGdBR29wQXdBM0FnQU1BUXNnQWtIb0FHb2dBa0hFQUdvcEFnQWlCVGNEQUNBQ1FlQUFhaUFDUVR4cUtRSUFJZ1kzQXdBZ0FrRWdhaUFDUWRRQWFpZ0NBRFlDQUNBQ1FRaHFJQVkzQXdBZ0FrRVFhaUFGTndNQUlBSWdBaWtDTkNJRk53TllJQUlnQWlrQ1REY0RHQ0FBSUFVM0Fnd2dBRUVVYWlBR1BnSUFJQUFnQWlrQ0REY0NHQ0FBUVNCcUlBSkJGR29wQWdBM0FnQWdBRUVvYWlBQ1FSeHFLUUlBTndJQUlBQWdBellDQ0NBQUlBRTJBZ1FnQUNBRU5nSUFDeUFDUWZBQWFpUUFDOHdDQVFaL0l3QkJFR3NpQkNRQVFRRWhBd0pBQWtBQ1FBSkFBa0FDUUNBQkRnSUZBQUVMUVlBQ0lRRWdBQzBBQUVFcmF3NERCQUVFQVFzZ0FDMEFBRUVyUmdSQUlBRkJBV3NoQXlBQVFRRnFJUUFnQVVFR1NRMEJEQUlMSUFFaEF5QUJRUVJMRFFFTEEwQWdBMFVOQWlBRUlBQXRBQUFnQWhDbUJpQUVLQUlBUVFGeEJFQWdBRUVCYWlFQUlBTkJBV3NoQXlBRUtBSUVJQUlnQld4cUlRVU1BUXNMUVlBQ0lRRkJBU0VEREFJTElBTWhCd05BSUFkRkRRRWdCRUVJYWlBQUxRQUFJQUlRcGdaQkFTRURJQVFvQWdoQkFYRkZCRUJCZ0FJaEFRd0RDMEdBQkNFQklBVkIvLzhEY1NBQ1FmLy9BM0ZzSWdaQkVIWU5BaUFBUVFGcUlRQWdCMEVCYXlFSElBWWdCQ2dDRENJSWFpRUZJQVpCLy84RGNTQUlRZi8vQTNGcUlnWkIvLzhEY1NBR1JnMEFDd3dCQ3lBRlFSQjBJUUZCQUNFREN5QUVRUkJxSkFBZ0FTQURjZ3V5QWdJRmZnUi9Jd0JCSUdzaUJpUUFJQVpCRUdvaUJ5QUFRUkJxS1FNQU53TUFJQVpCQ0dvaUNDQUFRUWhxS1FNQU53TUFJQVpCR0dvaUNTQUFLUU13SUFBMUFqaENPSWFFSWdNZ0FFRVlhaWtEQUlVM0F3QWdCaUFBS1FNQU53TUFJQVlRcUFRZ0J5a0RBQ0VCSUFZcEF3QWhCU0FJS1FNQUlRUWdDU2tEQUNFQ0lBWkJJR29rQUNBQ0lBUkMvd0dGZkNJRUlBRWdBeUFGaFh3aUF5QUJRZzJKaFNJQmZDSUZJQUZDRVltRklnRkNEWWtnQVNBQ1FoQ0pJQVNGSWdFZ0EwSWdpWHdpQW53aUE0VWlCRUlSaVNBQlFoV0pJQUtGSWdFZ0JVSWdpWHdpQWlBRWZDSUZoU0lFUWcySklBRkNFSWtnQW9VaUFTQURRaUNKZkNJQ0lBUjhoU0lEUWhHSklBRkNGWWtnQW9VaUFTQUZRaUNKZkNJQ0lBTjhJZ05DSUltRklBRkNFSWtnQW9WQ0ZZbUZJQU9GQzl3Q0FnVi9BWDRqQUVFZ2F5SUVKQUFnQkNBQ05nSVFJQUVwQXhBZ0FTa0RHQ0FDRUwwRUlRa2dCQ0FFUVJCcU5nSVVJQUZCQVNBQlFSQnFFS3dJSUFRZ0FUWUNIQ0FFSUFSQkZHbzJBaGdnQkVFSWFpQUJLQUlBSUFFb0FnUWdDU0FFUVJocVFlc0FFSTRDSUFFb0FnQWhBaUFFS0FJTUlRVUNRQ0FFS0FJSVFRRnhCRUFnQWlBRmFpSUdMUUFBSVFjZ0JDZ0NFQ0VJSUFZZ0NhZEJHWFlpQmpvQUFDQUNJQUVvQWdRZ0JVRUlhM0ZxUVFocUlBWTZBQUFnQUVHQWdJQ0FlRFlDQUNBQklBRW9BZ3hCQVdvMkFnd2dBU0FCS0FJSUlBZEJBWEZyTmdJSUlBSWdCVUVFZEdzaUFFRVFheUFJTmdJQUlBQkJER3NpQUNBREtRSUFOd0lBSUFCQkNHb2dBMEVJYWlnQ0FEWUNBQXdCQ3lBQUlBSWdCVUVFZEd0QkRHc2lBU2tDQURjQ0FDQUJJQU1wQWdBM0FnQWdBRUVJYWlBQlFRaHFJZ0FvQWdBMkFnQWdBQ0FEUVFocUtBSUFOZ0lBQ3lBRVFTQnFKQUFMcGdJQ0FYOEJmaU1BUWZBQWF5SUdKQUFnQmlBQk5nSU1JQVlnQURZQ0NDQUdJQU0yQWhRZ0JpQUNOZ0lRSUFaQkFqWUNIQ0FHUVpUMXdBQTJBaGdDUUNBRUtBSUFCRUFnQmtFd2FpQUVRUkJxS1FJQU53TUFJQVpCS0dvZ0JFRUlhaWtDQURjREFDQUdJQVFwQWdBM0F5QWdCa0VFTmdKY0lBWkIvUFhBQURZQ1dDQUdRZ1EzQW1RZ0JrS0FnSUNBOEFBaUJ5QUdRUkJxcllRM0ExQWdCaUFISUFaQkNHcXRoRGNEU0NBR0lBWkJJR3F0UW9DQWdJQ1FCWVEzQTBBTUFRc2dCa0VETmdKY0lBWkJ5UFhBQURZQ1dDQUdRZ00zQW1RZ0JrS0FnSUNBOEFBaUJ5QUdRUkJxcllRM0EwZ2dCaUFISUFaQkNHcXRoRGNEUUFzZ0JpQUdRUmhxclVLQWdJQ0E0QUNFTndNNElBWWdCa0U0YWpZQ1lDQUdRZGdBYWlBRkVLc0hBQXZ5QWdFQmZ3SkFJQUlFUUNBQkxRQUFRVEJORFFFZ0JVRUNPd0VBQWtBQ1FBSkFBa0FDUUNBRHdTSUdRUUJLQkVBZ0JTQUJOZ0lFSUFJZ0EwSC8vd054SWdOTERRRWdCVUVBT3dFTUlBVWdBallDQ0NBRklBTWdBbXMyQWhBZ0JBMENRUUloQVF3RkN5QUZJQUkyQWlBZ0JTQUJOZ0ljSUFWQkFqc0JHQ0FGUVFBN0FRd2dCVUVDTmdJSUlBVkI1UExBQURZQ0JDQUZRUUFnQm1zaUF6WUNFRUVESVFFZ0FpQUVUdzBFSUFRZ0Ftc2lBaUFEVFEwRUlBSWdCbW9oQkF3REN5QUZRUUk3QVJnZ0JVRUJOZ0lVSUFWQnhOakpBRFlDRUNBRlFRSTdBUXdnQlNBRE5nSUlJQVVnQWlBRGF5SUNOZ0lnSUFVZ0FTQURhallDSENBQ0lBUkpEUUZCQXlFQkRBTUxJQVZCQVRZQ0lDQUZRY1RZeVFBMkFod2dCVUVDT3dFWURBRUxJQVFnQW1zaEJBc2dCU0FFTmdJb0lBVkJBRHNCSkVFRUlRRUxJQUFnQVRZQ0JDQUFJQVUyQWdBUEMwSEk4TUFBUVNGQnBQTEFBQkNjQmdBTFFiVHl3QUJCSDBIVThzQUFFSndHQUF2aUFnSUpmd0YrSXdCQjBBRnJJZ0lrQUNBQktBSVFJUWNnQVNnQ0RDRUpJQUVvQWdnaEJpQUJLQUlBSVFnZ0FTZ0NCQ0VFQWtBQ1FBSkFBa0FEUUNBRVJRMEJJQUVnQkNBR0lBUWdCQ0FHU3hzaUJXc2lCRFlDQkNBQklBZ2lBeUFGUVFOMGFpSUlOZ0lBSUFaRkRRTWdBeWdDQUVVTkFDQUZRUUZHRFFRZ0F5Z0NDRVVOQUNBREtBSU1JQWtvQWdCcUlnVWdCeWdDQ0NJS1R3MEFJQU0xQWdRaEN5QUNJQVVnQnlnQ0JDQUtRZFRXeVFBUW53Y2dBa0VCTmdKc0lBSkNEVGNDWkNBQ1FlVFd5UUEyQW1BZ0FpQUNLUU1BTndKWUlBSkI4QUJxSUFKQjJBQnFFTWtCSUFJb0FvZ0JJZ05CREVZTkFBc2dBa0VVYWlBQ1FZd0Jha0hFQVB3S0FBQWdBaUFETmdJUUlBSWdDemNEQ0NBQUlBSkJDR3BCMEFEOENnQUFEQUVMSUFCQkREWUNDQ0FDUVF3MkFoQWdBa0VJYWhDeUNBc2dBa0hRQVdva0FBOExRUUJCQUVHMDFza0FFTVlFQUF0QkFVRUJRY1RXeVFBUXhnUUFDN2dDQVF0L0FrQWdBaWdDQUNJRElBSW9BZ1FpQ2tZRVFBd0JDeUFDSUFOQkFXb2lCellDQUNBQktBSVlRUXhzSVFzZ0FTZ0NGQ0VNSUFNdEFBQWhCVUVCSVFNRFFDQUpJQU5CQkV0eURRRkJCQ0FEUVFGcUlBTkJCRVlpQ1JzaERTQUxJUVlnRENFRUFrQURRQ0FHQkVBQ1FDQUZJQVJCQkdvb0FnQkpEUUFnQlNBRVFRaHFLQUlBU3cwQUlBUW9BZ0FnQTBZTkF3c2dCRUVNYWlFRUlBWkJER3NoQmd3QkN3c2dCeUFLUmcwQ0lBSWdCMEVCYWlJRE5nSUFJQWN0QUFBZ0JVRUlkSEloQlNBRElRY2dEU0VEREFFTEN5QUJLQUlrUVF4c0lRWWdBU2dDSUNFRUEwQWdCa1VOQVFKQUlBUW9BZ0FnQlUwRVFDQUZJQVJCQkdvb0FnQk5EUUVMSUFSQkRHb2hCQ0FHUVF4cklRWU1BUXNMSUFBZ0F6b0FDQ0FBSUFRb0FnZ2dCV28yQWdSQkFTRUlDeUFBSUFnMkFnQUx4Z0lCQW44akFFSHdBR3NpQkNRQUlBSWdBeWdDREJFR0FDRUZJQVJCREdvZ0FTZ0NBQ0FDSUFNZ0FTZ0NCQ2dDRkJFQUFBSkFJQVFvQWd4QkJVY0VRQ0FBSUFRcEFndzNBZ0FnQUVFUWFpQUVRUnhxS1FJQU53SUFJQUJCQ0dvZ0JFRVVhaWtDQURjQ0FBd0JDeUFFUVNScUlBUkJFR29RbXdRZ0FBSi9JQVFvQWlSQmdJQ0FnSGhIQkVBZ0JFSElBR29nQkVFMGFpZ0NBRFlDQUNBRVFVQnJJQVJCTEdvcEFnQTNBd0FnQkNBRUtRSWtOd000SUFJZ0JTQURLQUlZRVFFQUlBUkJBVFlDVkNBRVFkak0wZ0EyQWxBZ0JFSUJOd0pjSUFSQkh6WUNiQ0FFSUFSQjZBQnFOZ0pZSUFRZ0JFRTRhallDYUNBQVFRaHFJQVJCMEFCcUVKNERJQUFnQlRZQ0JDQUVLQUk0SUFRb0Fqd1E5Z2xCQWd3QkN5QUFJQVFwQWlnM0FnUWdBRUVNYWlBRVFUQnFLQUlBTmdJQVFRVUxOZ0lBQ3lBRVFmQUFhaVFBQzlrQ0FndC9BbjRqQUVFZ2F5SUNKQUFnQVNnQ0FDSUVMd0dLQVNFSkVQRUhJZ1VnQkM4QmlnRWlDQ0FCS0FJSUlnWkJmM05xSWdNN0FZb0JJQVJCM0FCcUlnb2dCa0VDZENJTGFpZ0NBQ0VNSUFRZ0JrRURkR29wQWdBaERTQUNRUmhxSUFNZ0JVSGNBR29Rd2djZ0NpQUdRUUZxSWdkQkFuUnFJQWdnQjJzaUNDQUNLQUlZSUFJb0Fod1E4Z1lnQWtFUWFpQURJQVVRd1FjZ0JDQUhRUU4wYWlBSUlBSW9BaEFnQWlnQ0ZCRHpCaUFFSUFZN0FZb0JJQVV2QVlvQklnZEJBV29oQXdKQUlBZEJERWtFUUNBSklBWnJJQU5IRFFFZ0EwRUNkQ0lEQkVBZ0JVR01BV29nQkNBTGFrR1FBV29nQS93S0FBQUxJQUpCQ0dvZ0JTQUJLQUlFSWdFUS9BTWdBaWtEQ0NFT0lBQWdBVFlDRUNBQUlBUTJBZ3dnQUNBT053SVVJQUFnRFRjQ0JDQUFJQXcyQWdBZ0FrRWdhaVFBRHdzZ0EwRU1RY0NTeVFBUXVBa0FDMEhva2NrQVFTaEJrSkxKQUJDY0JnQUwyQUlCQjM4Q1FBSkFJQUVvQWlBaUFrVUVRQXdCQ3lBQklBSkJBV3MyQWlBZ0FTZ0NBRUVCUncwQkFrQWdBU2dDQkVVRVFDQUJRUWhxSVFJZ0FTZ0NEQ0VEQTBBZ0FpZ0NBQ0VDSUFNRVFDQURRUUZySVFNZ0FrSDRCbW9oQWd3QkJTQUJRZ0EzQWdnZ0FTQUNOZ0lFSUFGQkFUWUNBQXdEQ3dBTEFBc2dBU2dDQkNFQ0N5QUJLQUlNSVFRZ0FTZ0NDQ0VEQWtBRFFDQUVJQUl2QWZZR1NRMEJJQUlvQXZBR0lnVUVRQ0FEUVFGcUlRTWdBaThCOUFZaEJDQUZJUUlNQVFzTFFZQ1l5UUFRdXdrQUN5QUVRUUZxSVFZQ1FDQURSUVJBSUFJaEJRd0JDeUFDSUFaQkFuUnFRZmdHYWlFSFFRQWhCZ05BSUFjb0FnQWlCVUg0Qm1vaEJ5QURJQWhCQVdvaUNFY05BQXNMSUFFZ0JqWUNEQ0FCUVFBMkFnZ2dBU0FGTmdJRUlBSWdCRUVEZEdvaEF5QUNJQVJCeUFCc2FrSFlBR29oQWdzZ0FDQUNOZ0lFSUFBZ0F6WUNBQThMUWRERHlRQVF1d2tBQys4Q0FnRi9BbjRDUUFKQVFRZ2dBQ2tEQUNJQ1FnbDlJZ09uSUFOQ0Nsb2JJZ0ZCQ0UwRVFFRUJJQUYwUWQ4QmNRMEJJQUZCQlVjTkFpQUFLQUpnSUFBb0FtUVE0d2dQQ3lBQUtBSUlJQUFvQWd3UTlRa0xEd3NnQUNnQ2FDQUFLQUpzRVBVSkFrQkJBeUFDUWdKOUlnS25JQUpDQjFvYklnRkJCVTBFUUNBQlFRTkhEUUVnQUNnQ1dDQUFLQUpjRU9NSURBRUxJQUFvQWdnZ0FDZ0NEQkQxQ1FzQ1FBSkFBa0FDUUNBQUtBSjBJZ0FvQWdnaUFVSC8vLy8vQjJ0QkFDQUJRWU9BZ0lCNFNCc09Bd0VDQXdBTElBQW9BZ3dnQUVFUWFpZ0NBQkQxQ1F3Q0N5QUJJQUJCREdvb0FnQVFxQWtnQUNnQ0ZDQUFRUmhxS0FJQUVLZ0pJQUFvQWlBZ0FFRWthaWdDQUJEMUNTQUFLQUlzSUFCQk1Hb29BZ0FRcUFrZ0FDZ0NPQ0FBUVR4cUtBSUFFS2dKSUFBb0FrUWdBRUhJQUdvb0FnQVFxQWtNQVFzZ0FDZ0NHQ0FBUVJ4cUtBSUFFT01JSUFBb0FpUWdBRUVvYWlnQ0FCRGpDQXNnQUVIUUFFRUlFT01FQys4Q0FnRi9BbjRDUUFKQVFRZ2dBQ2tEQUNJQ1FnbDlJZ09uSUFOQ0Nsb2JJZ0ZCQ0UwRVFFRUJJQUYwUWQ4QmNRMEJJQUZCQlVjTkFpQUFLQUpnSUFBb0FtUVE0d2dQQ3lBQUtBSUlJQUFvQWd3UXFRa0xEd3NnQUNnQ2FDQUFLQUpzRUtrSkFrQkJBeUFDUWdKOUlnS25JQUpDQjFvYklnRkJCVTBFUUNBQlFRTkhEUUVnQUNnQ1dDQUFLQUpjRU9NSURBRUxJQUFvQWdnZ0FDZ0NEQkNwQ1FzQ1FBSkFBa0FDUUNBQUtBSjBJZ0FvQWdnaUFVSC8vLy8vQjJ0QkFDQUJRWU9BZ0lCNFNCc09Bd0VDQXdBTElBQW9BZ3dnQUVFUWFpZ0NBQkNwQ1F3Q0N5QUJJQUJCREdvb0FnQVFxQWtnQUNnQ0ZDQUFRUmhxS0FJQUVLZ0pJQUFvQWlBZ0FFRWthaWdDQUJDcENTQUFLQUlzSUFCQk1Hb29BZ0FRcUFrZ0FDZ0NPQ0FBUVR4cUtBSUFFS2dKSUFBb0FrUWdBRUhJQUdvb0FnQVFxQWtNQVFzZ0FDZ0NHQ0FBUVJ4cUtBSUFFT01JSUFBb0FpUWdBRUVvYWlnQ0FCRGpDQXNnQUVIUUFFRUlFT01FQzY4Q0FnRi9BbjRqQUVGQWFpRUNJQUVvQWdCQkFVWUVRQ0FDUVJocUlBRkJHR29wQXdBM0F3QWdBa0VRYWlBQlFSQnFLUU1BTndNQUlBSWdBU2tEQ0RjRENFSUJJUVFMSUFFb0FpQkJBVVlFUUNBQ1FUaHFJQUZCUUdzcEF3QTNBd0FnQWtFd2FpQUJRVGhxS1FNQU53TUFJQUpCS0dvZ0FVRXdhaWtEQURjREFDQUNJQUVwQXlnM0F5QkNBU0VEQ3lBQUlBUTNBd0FnQUNBQ0tRTUlOd01JSUFBZ0F6Y0RJQ0FBSUFJcEF5QTNBeWdnQUNBQktRTklOd05JSUFCQjJBQnFJQUZCMkFCcUtRTUFOd01BSUFCQjBBQnFJQUZCMEFCcUtRTUFOd01BSUFCQkVHb2dBa0VRYWlrREFEY0RBQ0FBUVJocUlBSkJHR29wQXdBM0F3QWdBRUV3YWlBQ1FTaHFLUU1BTndNQUlBQkJPR29nQWtFd2Fpa0RBRGNEQUNBQVFVQnJJQUpCT0dvcEF3QTNBd0FMcmdJQ0EzOEJmaU1BUVNCcklnWWtBQUpBSUFJZ0FpQURhaUlEU3dSQVFRQWhBZ3dCQzBFQUlRSWdCQ0FGYWtFQmEwRUFJQVJyY2EwZ0F5QUJLQUlBSWdoQkFYUWlCeUFESUFkTEd5SURRUWhCQkNBRlFRRkdHeUlISUFNZ0Iwc2JJZ2V0ZmlJSlFpQ0lwdzBBSUFtbklnTkJnSUNBZ0hnZ0JHdExEUUFDZnlBSVJRUkFRUUFoQlNBR1FSeHFEQUVMSUFZZ0JEWUNIQ0FGSUFoc0lRVWdBU2dDQkNFSUlBWkJHR29MSUFVMkFnQUNmeUFHS0FJY0JFQWdCaWdDR0NJQ1JRUkFJQVpCRUdvZ0JDQURRUUFRMVFZZ0JpZ0NFQXdDQ3lBSUlBSWdCQ0FERUZZTUFRc2dCa0VJYWlBRUlBTVF4d1lnQmlnQ0NBc2hCU0FFSVFJZ0JVVU5BQ0FCSUFjMkFnQWdBU0FGTmdJRVFZR0FnSUI0SVFJTElBQWdBellDQkNBQUlBSTJBZ0FnQmtFZ2FpUUFDNzhDQVFGL0l3QkJRR29pQXlRQUlBTkJCR29nQVNBQ1Fkemd5Z0JCQ0JDL0JRSkFJQU1vQWdSQmdJQ0FnSGhIQkVBZ0FDQURLUUlFTndJQUlBQkJDR29nQTBFTWFpZ0NBRFlDQUF3QkN5QURRU2hxSUFKQnRPREtBRUVHRU04QkFrQWdBeWdDS0VHZmdJQ0FlRWNFUUNBRFFTQnFJQU5CT0dvb0FnQTJBZ0FnQTBFWWFpQURRVEJxS1FJQU53TUFJQU1nQXlrQ0tEY0RFQXdCQ3lBRFFSQnFJQU1vQWl3UXhBUUxBa0FnQXlnQ0VFR2ZnSUNBZUVjRVFDQURRVGhxSUFOQklHb29BZ0EyQWdBZ0EwRXdhaUFEUVJocUtRTUFOd01BSUFNZ0F5a0RFRGNES0F3QkN5QURRU2hxSUFFb0FwZ0NJQUVvQXB3Q0lBTW9BaFFnQXk4QkdCQ2tCQXNnQTBFb2FoQ0hDQ0lDUlFSQUlBQkJnSUNBZ0hnMkFnQkJnSUNBZ0hnZ0F5Z0NDQkRqQ0F3QkN5QUFJQUVnQWhEekFRc2dBMEZBYXlRQUM4Z0NBUU4vSXdCQjBBQnJJZ0lrQUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQkJDQ0FCS0FJQUlnTkJBbXNpQkNBRVFRcFBHMEVCYXc0SkFRSURCQVVHQndnSkFBc2dBRUVDTmdJQURBa0xJQUFnQVVISUFQd0tBQUFNQ0FzZ0FDQUJRY2dBL0FvQUFBd0hDeUFBSUFGQnlBRDhDZ0FBREFZTElBQkJCR29nQVNnQ0NDQUJLQUlNRUl3RklBQkJCallDQUF3RkN5QUFRUVJxSUFFb0FnZ2dBU2dDREJDTUJTQUFRUWMyQWdBZ0FDQUJMUUFRT2dBUURBUUxJQUJCQkdvZ0FVRUVhaEJmSUFCQkNEWUNBQXdEQ3lBQVFRaHFJQUZCQ0dvUVJTQUFRUWsyQWdBTUFnc2dBa0VRYWlBQlFRaHFFRVVnQWtGQWF5QUJLQUk4SUFFb0FrQVFqQVVnQWlBRE5nSUlJQUlnQVMwQVJEb0FUQ0FDSUFFb0FnUTJBZ3dnQUNBQ1FRaHFRY2dBL0FvQUFBd0JDeUFBSUFGQnlBRDhDZ0FBQ3lBQ1FkQUFhaVFBQzY4Q0FRUi9Jd0JCTUdzaUJDUUFJQVJCREdvZ0FTZ0NBQ0FDSUFNZ0FTZ0NCQ2dDRkJFQUFBSkFJQVFvQWd4QkJVY0VRQ0FBSUFRcEFndzNBZ0FnQUVFUWFpQUVRUnhxS1FJQU53SUFJQUJCQ0dvZ0JFRVVhaWtDQURjQ0FBd0JDeUFFS0FJVUlRVkJBQ0VESUFRb0FoZ2lCZ1JBSUFWQkNHb2hBU0FHSVFJRFFDQUJLQUlBSUFOcUlRTWdBVUVNYWlFQklBSkJBV3NpQWcwQUN3c2dBRUVFYWlFQ0lBUW9BaEFnQkNBRFFhelAwZ0FRcVFVZ0JFRUFOZ0lzSUFRZ0JDa0RBRGNDSkNBR1FReHNJUU1nQlNFQkEwQWdBd1JBSUFSQkpHb2dBU2dDQkNBQktBSUlFTUFGSUFOQkRHc2hBeUFCUVF4cUlRRU1BUXNMSUFJZ0JDa0NKRGNDQUNBQ1FRaHFJQVJCTEdvb0FnQTJBZ0FnQlNBR0VJa0hJQVVRcndrZ0FFRUZOZ0lBQ3lBRVFUQnFKQUFMeUFJQkIzOGpBRUZBYWlJRUpBQWdBaUFES0FJTUVRWUFJUVlnQkVFQU5nSU1JQVJDZ0lDQWdCQTNBZ1FnQVNnQ0JDRUhJQUVvQWdBaENDQUJLQUlNSVFrRFFBSkFJQWtnQlVFQmFrc0VRQ0FFUVJScUlnb2dDQ0FDSUFNZ0J5Z0NGQkVBQUNBRUtBSVVRUVZHRFFFZ0NoRE9DQXNnQkNBQktBSUlJZ0UyQWhBZ0FBSi9JQUVnQlUwRVFDQUFJQVFwQWdRM0FnUWdBRUVNYWlBRVFReHFLQUlBTmdJQVFRVU1BUXNnQWlBR0lBTW9BaGdSQVFBZ0JFRUROZ0lZSUFSQnJNelNBRFlDRkNBRVFnSTNBaUFnQkVFYU5nSTRJQVJCR2pZQ01DQUVJQVUyQWp3Z0JDQUVRU3hxTmdJY0lBUWdCRUU4YWpZQ05DQUVJQVJCRUdvMkFpd2dBRUVJYWlBRVFSUnFFSjRESUFBZ0JqWUNCQ0FFS0FJRUlBUW9BZ2dROWdsQkFRczJBZ0FnQkVGQWF5UUFEd3NnQkVFRWFpQUVMUUFZRVBZR0lBUW9BZ3doQlF3QUN3QUx5d0lCQ1g4akFFRXdheUlDSkFBZ0FTZ0NCQ0VFSUFFb0FnQWhCUUpBQWtBRFFDQURJQVJHRFFFZ0F5QUZhaTBBQUJEZUNRUkFJQU5CQVdvaEF3d0JDd3NnQWlBQklBTVEwQVlnQWtFWWFpQUJJQU1RMFFZTUFRc2dBaUFCSUFRUTBBWWdBa0VZYWlBQklBUVEwUVlMSUFJb0FpQWhDaUFDS0FJY0lRZ2dBaWdDR0NFQklBSW9BaFFoQXlBQ0tBSVFJUVlnQWlnQ0RDRUVJQUlvQWdnaEJTQUNLQUlFSVFjQ1FBSkFJQUlvQWdBaUNVVUVRQ0FIUVFOR0JFQWdCQ0VISUFVaENRd0NDeUFBSUFnMkFoZ2dBQ0FCTmdJVUlBQWdBellDRUNBQUlBWTJBZ3dnQUNBRU5nSUlJQUFnQ2pZQ0hDQUFJQVUyQWdRZ0FDQUhOZ0lBREFJTElBTWhDQ0FHSVFFZ0JDRURJQVVoQmdzZ0FDQUlOZ0lZSUFBZ0FUWUNGQ0FBSUFNMkFoQWdBQ0FHTmdJTUlBQWdCellDQ0NBQUlBazJBZ1FnQUVFRE5nSUFDeUFDUVRCcUpBQUx5QUlCQjM4akFFRkFhaUlFSkFBZ0FpQURLQUlNRVFZQUlRWWdCRUVBTmdJTUlBUkNnSUNBZ0JBM0FnUWdBU2dDQkNFSElBRW9BZ0FoQ0NBQktBSU1JUWtEUUFKQUlBa2dCVUVCYWtzRVFDQUVRUlJxSWdvZ0NDQUNJQU1nQnlnQ0ZCRUFBQ0FFS0FJVVFRVkdEUUVnQ2hEb0NBc2dCQ0FCS0FJSUlnRTJBaEFnQUFKL0lBRWdCVTBFUUNBQUlBUXBBZ1EzQWdRZ0FFRU1haUFFUVF4cUtBSUFOZ0lBUVFVTUFRc2dBaUFHSUFNb0FoZ1JBUUFnQkVFRE5nSVlJQVJCck16U0FEWUNGQ0FFUWdJM0FpQWdCRUVhTmdJNElBUkJHallDTUNBRUlBVTJBandnQkNBRVFTeHFOZ0ljSUFRZ0JFRThhallDTkNBRUlBUkJFR28yQWl3Z0FFRUlhaUFFUVJScUVKNERJQUFnQmpZQ0JDQUVLQUlFSUFRb0FnZ1E5Z2xCQVFzMkFnQWdCRUZBYXlRQUR3c2dCRUVFYWlBRUxRQVlFUFlHSUFRb0Fnd2hCUXdBQ3dBTHdGZ0NNSDhGZmlNQVFlQUJheUlPSkFBQ1FDQUJFTllHUlFSQUlBQkJrSUNBZ0hnMkFnQU1BUXNnRGtHQUFXb2lCaUFCRUIwZ0RrSHdBR29pRWlBT1FZd0JhaWtDQURjREFDQU9RZmdBYWlJUElBNUJsQUZxS0FJQU5nSUFJQTRnRGlrQ2hBRTNBMmdnRGlnQ2dBRWlBMEVDUndSQUlBNUJJR29nRGtHWUFXcEJ5QUQ4Q2dBQUlBNUJIR29nRHlnQ0FEWUNBQ0FPUVJScUlCSXBBd0EzQWdBZ0RpQUROZ0lJSUE0Z0Rpa0RhRGNDRENBR0lBNHBBeGdRRlNBT0tBS0VBU0VUSUE0b0FvQUJJakJCZ0lDQWdIaEdCRUFnQUNBVE5nSUVJQUJCaDRDQWdIZzJBZ0FnRGtFSWFoRE5CZ3dDQ3lBQUlSQWdEaWdDaUFFaENrRUFJUU1qQUVHZ0Qyc2lBaVFBQWtBZ0FTSU1FTllHUlFSQUlBQkJrSUNBZ0hnMkFnQU1BUXNDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBd1ExZ1pGQkVCQmtJQ0FnSGdoQkF3QkN5QUNRWWdHYWlJUElBd1FIU0FDUWJBS2FpSUFJQUpCbkFacUtBSUFOZ0lBSUFJZ0Fpa0NsQVkzQTZnS0lBSW9BcEFHSVFNZ0FpZ0NqQVloQkFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQWlnQ2lBWWlDMEVDUndSQUlBSkIrQUpxSUFKQm9BWnFRY2dBL0FvQUFDQUNRZlFDYWlBQUtBSUFOZ0lBSUFJZ0Fpa0RxQW8zQXV3Q0lBSWdBellDNkFJZ0FpQUVOZ0xrQWlBQ0lBczJBdUFDSUFJcEEvQUNJakpDQW4waU0wSURXZ1JBUVpXQXhBQWhEU0F5UWdWOVFnSmFEUVlnQWtHd0FXb2dBaWdDaEFNaUJpQUNLQUtJQXlJQlFRQkJnTUxKQUJDZ0J5QUNLQUswQVNJQVFSOU5EUUlnQWlnQ3NBRWhBeUFDUWFnQmFpQUdJQUZCSUVHZ3dza0FFS0FISUFJb0Fxd0JJZ0JCQjAwTkF5QUNLQUtvQVNFR0lBSkJvQUZxUWY4QUlBb2dDa0gvQUU4YklnRkJDR3BCd01MSkFCQ2ZCU0FDUVFBMkFyQUtJQUlnQWlrRG9BRTNBcWdLSUFKQnFBcHFJZ0FnRXlBQkVKY0pJQUFnQmlBR1FRaHFFTWdHSUE4Z01pQVRJQUVnQmlBQ0tBS2NBeUFDS0FLZ0F4QWtJQUlvQW93R0lRMGdBaWdDaUFZaUFVR0FnSUNBZUVjRVFDQU5JQUlvQXBBR0lBTVFoQWtoQUNBQklBMFFxUWxCa29ERUFFR1lnTVFBSUFBYklRMExJQUlvQXFnS0lBSW9BcXdLRUtrSkRBWUxJQUpCd0FwcVFRQkJ3UUQ4Q3dBZ0FrR3dDbXBCMkxESkFDa0RBRGNEQUNBQ1FnQTNBN2dLSUFKQjBMREpBQ2tEQURjRHFBb2dBa0dvQ21vaUFTQVRRU0FnQ2lBS1FTQlBHeUlBRUowQ0lBRkIrcjNKQUVFZ0lBQnJFSjBDSUFKQmlBWnFJZ0FnQVVIZ0FQd0tBQUFnQWtHNEFXb2dBQkMzQVVFRklRZ2dNa0lEV1FSQVFUSWhBQU5BSUFBRVFDQUNRWkFHYWlBQ1FjQUJhaWtBQURjREFDQUNJQUlwQUxnQk53T0lCaUFBUVFGcklRQWdBa0c0QVdvZ0FrR0lCbW9Rc2dRTUFRc0xRWXVBeEFBaERTQUVRUU4yUVFVZ0MwRUJjUnNpQ0VFUVN3MEZDeUFDS0FLRUF5RUFJQUpCbUFGcUlBSW9Bb2dESWhGQmxOYlNBQkNmQlNBQ0tBS1lBU0VGSUFJb0Fwd0JJUVFnRVFSQUlBUWdBQ0FSL0FvQUFBc2dNa0lEVXcwRElBSkJpQTVxSUFoQm9NSEpBQkRtQkNBQ1FSTTZBTW9DSUFKQmdBSTdBY2dDQTBBZ0FrR1FBV29nQWtISUFtb1FoUVVDUUNBQ0xRQ1FBUVJBSUFJdEFKRUJJUXNnQWlnQ2tBNGlCaUFJSUFZZ0NFa2JJUUZCQUNFQUlBSW9Bb3dPSVFNRFFDQUFJQUZHRFFJZ0FDQURhaUFDUWJnQmFpQUFhaTBBQUNBTGN6b0FBQ0FBUVFGcUlRQU1BQXNBQ3lBQ0tBS0lEaUFDS0FLTURoQ3BDUXdGQ3lBQ1FZZ0dhaUlBSUFNZ0JoRFZBaUFDUWRnT2FpQUFJQVFnRVJEeEJDQUZJQVFRcVFrZ0FpZ0M0QTRoRVNBQ0tBTGNEaUVFSUFJb0F0Z09JUVVNQUFzQUN5QUNRWUFLYWlBQUtBSUFOZ0lBSUFJZ0Fpa0RxQW8zQS9nSklBUkJuNENBZ0hoR0RRY01DQXRCSUNBQVFaREN5UUFRdUFrQUMwRUlJQUJCc01MSkFCQzRDUUFMSUFKQmlBWnFJZ0FnQWtHNEFXb2dDQkRWQWlBQ1FkZ09haUFBSUFRZ0VSRHhCQ0FGSUFRUXFRa2dBaWdDMkE0Z0FrSGdBbW9nRENBQ0tBTGNEaUlBSUFJb0F1QU9FRW9oRFNBQUVLa0pJQUlwQS9BQ0lqSkNBbjBoTXdzZ00wSURXZzBBSURKQ0FuMGlNMElDVmdSQVFZK0F4QUFoQXd3Q0N3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQXpwMEVCYXc0Q0FRRUFDeUFDUVlnR2FpSUJJQUpCNEFKcUlBd2dFeUFLRUpJQklBSW9Bb3dHSVFNZ0FpZ0NpQVlpQUVHQWdJQ0FlRVlOQ1NBQklBTWdBaWdDa0FZUTFRSWdBa0hBQ21wQmtyN0pBQ2tBQURjREFDQUNRYmdLYWtHS3Zza0FLUUFBTndNQUlBSkJzQXBxUVlLK3lRQXBBQUEzQXdBZ0FrSDZ2Y2tBS1FBQU53T29DaUFDUWJnQmFpQUJJQUpCcUFwcUVQSUVJQUFnQXhDcENTQUNLQUs4QVNFQUlBSW9BcmdCSWdSQmdJQ0FnSGhIRFFFTUJ3c2dBa0dJQm1vaUFDQUNRZUFDYWlBTUlCTWdDaENTQVNBQ0tBS01CaUVESUFJb0FvZ0dJZzlCZ0lDQWdIaEdEUWdnQWlnQ2tBWWhCaUFDUWNBS2FrRUFRY0VBL0FzQUlBSkJzQXBxUWRpd3lRQXBBd0EzQXdBZ0FrSUFOd080Q2lBQ1FkQ3d5UUFwQXdBM0E2Z0tJQUpCb0FacVFaSyt5UUFwQUFBM0F3QWdBa0dZQm1wQmlyN0pBQ2tBQURjREFDQUNRWkFHYWtHQ3Zza0FLUUFBTndNQUlBSkIrcjNKQUNrQUFEY0RpQVlnQWtHb0Ntb2dBQkRaQ1NBQ1FlUUVhaUlFSUF4QmtBRnFRWnEreVFCQkFoRFBBU0FDS0FMa0JFR2ZnSUNBZUVjRVFFR0pnTVFBSVFBTUF3c2dBa0hRQkdvaUJDQUNLQUxvQkJEYkJDQUNLQUxRQkVHZmdJQ0FlRWNFUUVHUWdNUUFJUUFNQXdzZ0FpZ0MxQVFpQUNnQ0NFVUVRRUdRZ01RQUlRQU1CQXNnQWtHOEJHb2lCQ0FBS0FJRUVMZ0VJQUlvQXJ3RVFaK0FnSUI0UndSQVFaQ0F4QUFoQUF3REN5QUNRYWdLYWlJQUlBSW9Bc0FFSUFJb0FzUUVFSjBDSUFKQmlBWnFJZ0VnQUVIZ0FQd0tBQUFnQWtHNEFXb2lBQ0FCRUxjQklBRWdBeUFHRU5VQ0lBSkJ5QUpxSUFFZ0FCRHpCQ0FDUVlnT2FpQUdRZURBeVFBUTVnUWdBa0VUT2dET0RpQUNRWUFDT3dITURpQUNLQUtRRGlJSElBWWdCaUFIU3hzaEJpQUNLQUtNRGlFU0EwQWdBa0h3QUdvZ0FrSE1EbW9RaGdVZ0FpMEFjRVVOQWlBQ0xRQnhJUUZCQUNFQUEwQWdBQ0FHUndSQUlBQWdFbW9nQUNBRGFpMEFBQ0FCY3pvQUFDQUFRUUZxSVFBTUFRc0xJQUpCaUFacUlnQWdFaUFIRU5VQ0lBSkIyQTVxSUFBZ0FpZ0N6QUlpQVNBQ1FkQUNhaUlBS0FJQUVQRUVJQUlvQXNnQ0lBRVFxUWtnQUNBQ1FlQU9haWdDQURZQ0FDQUNJQUlwQXRnT053UElBZ3dBQ3dBTElBSW9Bc0FCSWdzaEF3d0VDeUFDUWNnQ2FrRWdFSXdERVA4QklRRWdBa0hvQUdvZ0FpZ0N6QUlnQWlnQzBBSVF0Z1lnQWlnQ2FDQUNLQUpzSUFFUWxnRWdBaWdDMEFJaEN5QUNLQUxNQWlFQUlBSW9Bc2dDSVFRZ0FSQ1RDQ0FDS0FLSURpQUNLQUtNRGhDcENRd0NDeUFFRU0wQ0MwR0FnSUNBZUNFRUN5QVBJQU1RcVFsQkVDRURJQVJCZ0lDQWdIaEdEUUVMQWtBZ0F5QUNLQUtnQXlJUFN3Ui9RWXFBeEFBRklBSkI0QUJxSUFBZ0N5QURRWURCeVFBUXl3Y2dBaWdDWkNFR0lBSW9BbUFnQWtIWUFHb2dBaWdDbkFNZ0R5QURRWkRCeVFBUXl3Y2dCaUFDS0FKWUlBSW9BbHdRaFFsRkRRRkJrb0RFQUFzaEF5QUVJQUFRcVFrTUF3c2dCQ0FBRUtrSkRBTUxJQUFoQXd3QkN5QXlRZ1Y5UWdKYUJFQkJsWURFQUNFRERBRUxJQUpCaUFGcUlBSW9BcHdESWdNZ0FpZ0NvQU1pQVVFQVFiREJ5UUFRb0FjZ0FpZ0NqQUVpQUVFZlRRMEZJQUlvQW9nQklRWWdBa0dBQVdvZ0F5QUJRU0JCME1ISkFCQ2dCeUFDS0FLRUFTSUFRUWRORFFZZ0FpZ0NnQUVoQXlBQ1FmZ0Fha0gvQUNBS0lBcEIvd0JQR3lJQlFRaHFRZkRCeVFBUW53VWdBa0VBTmdLd0NpQUNJQUlwQTNnM0FxZ0tJQUpCcUFwcUlnQWdFeUFCRUpjSklBQWdBeUFEUVFocUVNZ0dJQUpCaUFacUlESWdFeUFCSUFOQkFDQURFQ1FnQWlnQ2pBWWhBeUFDS0FLSUJpSUJRWUNBZ0lCNFJ3UkFJQU1nQWlnQ2tBWWdCaENFQ1NFQUlBRWdBeENwQ1VHU2dNUUFRWmlBeEFBZ0FCc2hBd3NnQWlnQ3FBb2dBaWdDckFvUXFRa0xJQTFCbUlERUFFWWdBMEdZZ01RQVJuSU5BQ0FDUWVBQ2FoRE5Ca0dIZ0lDQWVDRUVEQUlMSUFKQjRBSnFFTTBHQ3lBQ1FZZ0dhaUlBSUF4QmtBRnFJaVZCeGRqSkFFRUhFTThCSUFKQnFBcHFJQUFRNEFVZ0FpOEJzQW9oSmlBQ0tBS3NDaUVlSUFJb0FxZ0tJZ0JCbjRDQWdIaEdEUUVnRUNBQ0tRR3lDamNCQ2lBUVFSSnFJQUpCdWdwcUx3RUFPd0VBSUJBZ0pqc0JDQ0FRSUI0MkFnUWdFQ0FBTmdJQURCUUxJQkFnQXpZQ0JDQVFJQUlwQS9nSk53SUlJQkJCRUdvZ0FrR0FDbW9vQWdBMkFnQWdFQ0FFTmdJQURCTUxBa0FnREJEV0JrVUVRQ0FDUVpDQWdJQjROZ0xrQWd3QkN5QUNRWWdHYWlBTUVOb0RBa0FnQWlnQ2lBWkJuNENBZ0hoSEJFQWdBa0c0Q21vZ0FrR1lCbW9vQWdBMkFnQWdBa0d3Q21vZ0FrR1FCbW9wQWdBM0F3QWdBaUFDS1FLSUJqY0RxQW9NQVFzZ0FrR29DbW9nQWlnQ2pBWkIxdFRKQUVFR0VNOEJDd0pBSUFJb0FxZ0tRWitBZ0lCNFJ3UkFJQUpCaUFWcUlBSkJ1QXBxS0FJQU5nSUFJQUpCZ0FWcUlBSkJzQXBxS1FNQU53TUFJQUlnQWlrRHFBbzNBL2dFREFFTElBSkIrQVJxSUFJb0Fxd0tFTGtFQ3lBQ0tBTDRCRUdmZ0lDQWVFY0VRQ0FDUVl3R2FrSFcxTWtBUVFZUXF3UWdBa0g0QkdvUXpRSWdBa0dJZ0lDQWVEWUM1QUlnQWlBQ0tRS1VCamNEOEFJZ0FpQUNLUUtNQmpjRDZBSU1BUXNnQWlnQy9BUWhBQUpBSUFJb0FvQUZJZ3RCQ0VjTkFFRUlJUXNnQUNrQUFFTFQ2SVh6eHF5WXVlUUFVZzBBSUFKQmlBWnFJQXdRSFNBQ0tRT1lCaUV5SUFJcEE1QUdJVFFnQWlnQ2pBWWhJQ0FDS0FLSUJpSWFRUUpHQkVBZ0FpQXlOd1B3QWlBQ0lEUTNBK2dDSUFKQjBBSnFJQUpCN0FKcUtRSUFOd01BSUFKQjJBSnFJQUpCOUFKcUtBSUFOZ0lBSUFJZ0lEWUM1QUlnQWlBQ0tRTGtBamNEeUFJTUVnc2dBaTBBNUFZaElTQUNLQUxnQmlFbklBSW9BdHdHSVNJZ0FpZ0MyQVloS0NBQ0tBTFVCaUVwSUFJb0F0QUdJU01nQWlnQ3pBWWhLaUFDS0FMSUJpRVlJQUlvQXNRR0lSVWdBaWdDd0FZaEt5QUNLQUs4QmlFc0lBSW9BcmdHSVNRZ0FpZ0N0QVloTFNBQ0tBS3dCaUViSUFJb0Fxd0dJUmtnQWlnQ3FBWWhMaUFDS1FPZ0JpRTFBa0FDUUNBeVFnSjlRZ05hQkVCQmxZREVBQ0VESURKQ0JYMUNBbG9ORVNBQ1FkQUFhaUFaSUJ0QkFFR2d2c2tBRUtBSElBSW9BbFFpQUVFZlRRMElJQUlvQWxBaENTQUNRY2dBYWlBWklCdEJJRUhBdnNrQUVLQUhJQUlvQWt3aUFFRUhUUTBKSUFJb0FrZ2hBU0FDUVVCcklCa2dHMEVvUWVDK3lRQVFvQWNnQWlnQ1JDSUFRUWRORFFvZ0FpZ0NRQ0VGSUFKQk9Hb2dGU0FZUVFCQmdML0pBQkNnQnlBQ0tBSThJZ0JCSDAwTkN5QUNLQUk0SVFjZ0FrRXdhaUFWSUJoQklFR2d2OGtBRUtBSElBSW9BalFpQUVFSFRRME1JQUlvQWpBaEVpQUNRU2hxSUJVZ0dFRW9RY0MveVFBUW9BY2dBaWdDTENJQVFRZE5EUTBnQWlnQ0tDRVBJQUpCaUFacUlnWWdNaUFUUWY4QUlBb2dDa0gvQUU4Yklnb2dBU0FWSUJnUUpFR0FnSUNBZUNFV0lBSW9Bb3dHSVFNZ0FpZ0NpQVlpQVVHQWdJQ0FlRVlORUNBRElBSW9BcEFHSUFrUXZ3a2dBU0FERUtrSkRRSWdCaUF5SUJNZ0NpQVNRUUFnSGhBa0lBSW9Bb3dHSVFNZ0FpZ0NpQVlpQVVHQWdJQ0FlRVlORUNBRElBSW9BcEFHSUFjUXZ3a2dBU0FERUtrSkRRRkJrb0RFQUNFRERCQUxJQUpCd0FwcVFRQkJ3UUQ4Q3dBZ0FrR3dDbXBCMkxESkFDa0RBRGNEQUNBQ1FnQTNBN2dLSUFKQjBMREpBQ2tEQURjRHFBb2dBa0dvQ21vaUFTQVRRU0FnQ2lBS1FTQlBHeUlBRUowQ0lBRkIrcjNKQUVFZ0lBQnJFSjBDSUFFZ0dTQWJFTm9KSUFFZ05hZEJ3R0Z5RUxVSElBSkJ0QVZxSWdRZ0pVR2F2c2tBUVFJUXp3RWdBaWdDdEFWQm40Q0FnSGhIQkVCQmlZREVBQ0VEREE4TElBSkJvQVZxSWdRZ0FpZ0N1QVVRMndRZ0FpZ0NvQVZCbjRDQWdIaEhCRUJCa0lERUFDRUREQThMUVpDQXhBQWhBMEdBZ0lDQWVDRVdJQUlvQXFRRklnRW9BZ2hGRFE4Z0FrR01CV29pQUNBQktBSUVFTGdFSUFJb0Fvd0ZRWitBZ0lCNFJ3UkFJQUFRelFJTUVBc2dBa0dvQ21vZ0FpZ0NrQVVnQWlnQ2xBVVFuUUlnTWtJRVV3ME5JQ0ZCQVhGRkRRWU1EUXRCQUNFRUlBSkJpQVpxSURJZ0V5QUtJQTlCQUNBZUVDUWdBaWdDakFZaEFDQUNLQUtJQmlJR1FZQ0FnSUI0UmdSQUlBQWhBd3dQQ3lBQ1FmQUZha0lBTndNQUlBSkIrQVZxUWdBM0F3QWdBa0dBQm1wQ0FEY0RBQ0FDUWdBM0ErZ0ZJQUpCNkFWcUlnRkJJQ0FBSUFJb0FwQUdRZUMveVFBUXJBY2dBa0d3Q21wQ0FEY0RBQ0FDUWdBM0E2Z0tJQUpCekE1cUlDTWdLUkNNQlNBQ1FZZ0dhaUFCSUFKQnFBcHFFTTRHSUFJb0F0UU9JaFJCY0hFaEFTQUNLQUxRRGlFREEwQWdBU0FFUndSQUlBSkJpQVpxSUFNZ0JHb1Fzd0lnQkVFUWFpRUVEQUVMQ3lBQ1FZQUtha0lBTndNQUlBSkNBRGNEK0FrZ0FrSDRDV29pRWtFUUlDSWdKMEhRd3NrQUVLd0hJQUpCb0FwcVFnQTNBd0FnQWtHWUNtcENBRGNEQUNBQ1FaQUtha0lBTndNQUlBSkNBRGNEaUFvZ0FrR0lDbW9pQVVFZ0lBTWdGRUhnd3NrQUVLd0hJQUpCcUFwcUlnOGdBUkJzSUFKQm9BNXFRZ0EzQXdBZ0FrR1lEbXBDQURjREFDQUNRWkFPYWtJQU53TUFJQUpDQURjRGlBNGdBa0dJRG1vaUFTQVNFSWNGSUFKQjJBNXFJQThnQVJERkFRSi9Ba0FDUUNBQ0x3Q0JDaUFDUVlNS2FpMEFBRUVRZEhKQjRjaUpBMGNOQUNBQ0lEVkN3R0dFTndPb0NpQVNRUU1nRDBFREVJVUpEUUFnQWkwQWdBcEIxQUJCeGdBZ0lVRUJjUnRHRFFFTElBSW9Bc3dPSUFNUXFRbEJrb0RFQUNFRFFZQ0FnSUI0REFFTElBSW9Bc3dPQ3lFV0lBWWdBQkNwQ1F3T0N5QUNRWWdHYWlJR0lESWdFeUFLSUFVZ0ZTQVlFQ1FnQWlnQ2pBWWhBeUFDS0FLSUJpSUJRWUNBZ0lCNFJnME5JQUpCMEFWcVFnQTNBd0FnQWtIWUJXcENBRGNEQUNBQ1FlQUZha0lBTndNQUlBSkNBRGNEeUFVZ0FrSElCV29pQUVFZ0lBTWdBaWdDa0FaQjhML0pBQkNzQnlBQ1FiQUtha0lBTndNQUlBSkNBRGNEcUFvZ0FrSFlEbW9nSkNBc0VJd0ZJQVlnQUNBQ1FhZ0thaERPQmtFQUlBSW9BdUFPSWhSQmNIRnJJUVFnQWlnQzNBNGlBQ0VMQTBBZ0JBUkFJQVJCRUdvaEJDQUNRWWdHYWlBTEVMTUNJQXRCRUdvaEN3d0JDd3NnQWlnQzJBNGhGaUFCSUFNUXFRa2dBQ0VEREEwTElBSkI2QUpxSUFBZ0N4Q3JCQ0FDUVo2QWdJQjROZ0xrQWdzZ0FrSFlBbW9nQWtIMEFtb29BZ0EyQWdBZ0FrSFFBbW9nQWtIc0Ftb3BBZ0EzQXdBZ0FpQUNLUUxrQWpjRHlBSU1Ed3RCSUNBQVFjREJ5UUFRdUFrQUMwRUlJQUJCNE1ISkFCQzRDUUFMSUFKQnFBcHFFTnNKREFZTFFTQWdBRUd3dnNrQUVMZ0pBQXRCQ0NBQVFkQyt5UUFRdUFrQUMwRUlJQUJCOEw3SkFCQzRDUUFMUVNBZ0FFR1F2OGtBRUxnSkFBdEJDQ0FBUWJDL3lRQVF1QWtBQzBFSUlBQkIwTC9KQUJDNENRQUxJQUpCaUFacUlnQWdBa0dvQ21wQjRBRDhDZ0FBSUFKQjJBNXFJQUFRdHdGQkJTRVVBa0FnTWtJQ1Z3MEFJQ0JCQTNaQkJTQWFRUUZ4R3lJVVFSQk5CRUJCTWlFRUEwQWdCRVVOQWlBQ1FZZ0dhaUFDUWRnT2FpQVVFTE1FSUFKQjRBNXFJQUpCa0FacUtRQUFOd01BSUFJZ0Fpa0FpQVkzQTlnT0lBUkJBV3NoQkF3QUN3QUxRWXVBeEFBaEF3d0NDeUFDUVNCcUlCUkJsTmJTQUJDZkJTQUNLQUlnSVJZZ0FpZ0NKQ0VESUJSRkRRRWdBeUFDUWRnT2FpQVUvQW9BQUF3QkN5QUVFTTBDUVlDQWdJQjRJUllMSUJaQmdJQ0FnSGhIRFFFTElBSWdBellDNkFJZ0FrS0NnSUNBOElDQWdJQi9Od1BnQWlBdUlCa1FxUWtnTFNBa0VLa0pJQ3NnRlJDcENTQXFJQ01RcVFrZ0tDQWlFS2tKSUFJb0F1QUNJUm9NQVFzZ0FrRUFOZ0t3RGlBQ1FRQTJBcWdPSUFKQmlBWnFJQXdRMmdNQ1FDQUNLQUtJQmtHZmdJQ0FlRWNFUUNBQ1FiZ0thaUFDUVpnR2FpZ0NBRFlDQUNBQ1FiQUthaUFDUVpBR2Fpa0NBRGNEQUNBQ0lBSXBBb2dHTndPb0Nnd0JDeUFDUWFnS2FpQUNLQUtNQmtHY21za0FRUUlRendFTEFrQWdBaWdDcUFwQm40Q0FnSGhIQkVBZ0FrSG9EbW9nQWtHNENtb29BZ0EyQWdBZ0FrSGdEbW9nQWtHd0Ntb3BBd0EzQXdBZ0FpQUNLUU9vQ2pjRDJBNE1BUXNnQWtIWURtb2dBaWdDckFvUTJRUUxBa0FnQWlnQzJBNUJuNENBZ0hoSERRQWdBaWdDM0E0aUFFRVVhaWdDQUNJY0lBQkJHR29vQWdCQjJBQnNhaUV4SUFKQnFBWnFJUklnQWtHZ0Jtb2hEeUFDUWFRR2FpRUdJQUpCbkFacUlRRWdBa0c0Q21vaEx3SkFBa0FDUUFKQUEwQWdIQ0lISURGR0RRVWdBa0dJQm1vaUFDQUhFTmtFSUFkQjJBQnFJUndnQWlnQ2lBWkJuNENBZ0hoSEJFQWdBQkRMQ0F3QkN5QUNLQUtNQmlFSklBSkJpQVpxSWdVUXl3Z2dCU0FKUVpEQ3lnQkJCQkRQQVNBQ0tBS0lCaUFGRU1zSVFaK0FnSUI0UmdSQUlBbEJqSm5KQUVFTEVLVURSUTBCQ3lBQ1FZZ0dhaUFKUVplWnlRQkJBeERQQVFKQUlBSW9Bb2dHUVorQWdJQjRSd1JBSUM4Z0FrR1lCbW9vQWdBMkFnQWdBa0d3Q21vZ0FrR1FCbW9wQWdBM0F3QWdBaUFDS1FLSUJqY0RxQW9NQVFzZ0FrR29DbW9nQWlnQ2pBWVF1UVFMQWtBQ1FDQUNLQUtvQ2tHZmdJQ0FlRWNFUUNBQ1FhZ0thaERMQ0F3QkN5QUNLQUtzQ2lFRkFrQUNRQUpBSUFJb0FyQUtRUUpyRGdjQUJRVUJCUVVDQlFzZ0JTMEFBRUhXQUVjTkJDQUZMUUFCUVRKSERRUkJuSm5KQUNFQURBTUxJQVV0QUFCQndRQkhEUU1nQlMwQUFVSEZBRWNOQXlBRkxRQUNRZE1BUncwRElBVXRBQU5CMWdCSERRTkJ2Sm5KQUNFQUFrQWdCUzBBQkVFeWF3NENBd0FFQzBIY21ja0FJUUFNQWdzZ0JTMEFBRUhKQUVjTkFpQUZMUUFCUWVRQVJ3MENJQVV0QUFKQjVRQkhEUUlnQlMwQUEwSHVBRWNOQWlBRkxRQUVRZlFBUncwQ0lBVXRBQVZCNlFCSERRSWdCUzBBQmtIMEFFY05BaUFGTFFBSFFma0FSdzBDQzBIOG1ja0FJUUFMUVFoQkJCQ2ZDQ0lkUW9HQWdJQVFOd0lBSUFKQnRBNXFJQWNvQWt3Z0J5Z0NVQkNNQlNBQ0tBSzhEaUVYSUFJb0FyZ09JUVVDUUFKQUFuOGdBaWdDcUE0aUNRUkFJQUlvQXF3T0lRZ0RRQ0FKUWR3QWFpRUVJQWt2QWVJQklnZEJER3doQzBGL0lRMENRQU5BSUF0RkJFQWdCeUVOREFJTElBUkJDR29oSHlBRVFRUnFJUW9nRFVFQmFpRU5JQXRCREdzaEN5QUVRUXhxSVFRQ1FDQUZJQmNnQ2lnQ0FDQWZLQUlBRVBrR1FmOEJjUTRDQUFFQ0N3c2dBaWdDdEE0Z0JSQ3BDUXdFQ3lBSUJFQWdDRUVCYXlFSUlBa2dEVUVDZEdvb0F1UUJJUWtNQVFzTElBMnRRaUNHSVRZZ0FrR29EbW9oRFNBQ0tBSzBEZ3dCQzBFQUlRa2dBa0dvRG1vaERTQUNLQUswRGdzaUIwR0FnSUNBZUVZRVFDQUZJUWtNQVFzZ0FpQTJOd0s4Q2lBQ0lBazJBcmdLSUFJZ0RUWUN0QW9nQWlBWE5nS3dDaUFDSUFVMkFxd0tJQUlnQnpZQ3FBb0NRQ0FKQkVBQ2Z3SkFBa0FnQWlnQ3VBb2lDQzhCNGdGQkMwOEVRQ0FDS0FLOENpRUtJQUlvQXNBS0lnUkJCVThOQVVFRUlSRWdBU0VGSUE4aEJ5QUVJUWtNQWdzZ0FrR0lCbW9nTHlBQ1FhZ0thaUFkSUFBUXVRVU1CQXRCQUNFSlFRVWhFU0FHSVFVZ0VpRUhBa0FDUUNBRVFRVnJEZ0lBQWdFTElBSkJCVFlDMUE0Z0FpQUtOZ0xRRGlBQ0lBZzJBc3dPSUFKQmlBWnFJQUpCekE1cUVNTUNJQUlvQXB3R0lRc2dBaWdDb0FZaENDQUNRUVUyQXBBT0lBSWdDRFlDakE0Z0FpQUxOZ0tJRGlBQ1FmZ0phaUFDUVlnT2FpQUNRYWdLYWlBZElBQVF1UVVnQWlnQ2lBWWhCQ0FDS1FLTUJpRXpJQUlvQXBnR0lRa2dBaWdDbEFZTUFnc2dCRUVIYXlFSlFRWWhFUXNnQWlBUk5nTFVEaUFDSUFvMkF0QU9JQUlnQ0RZQ3pBNGdBa0dJQm1vZ0FrSE1EbW9Rd3dJZ0JTZ0NBQ0VGSUFjb0FnQWhCeUFDSUFrMkFwQU9JQUlnQnpZQ2pBNGdBaUFGTmdLSURpQUNRZmdKYWlBQ1FZZ09haUFDUWFnS2FpQWRJQUFRdVFVZ0FpZ0NpQVloQkNBQ0tRS01CaUV6SUFJb0FwZ0dJUWtnQWlnQ25BWWhDeUFDS0FLZ0JpRUlJQUlvQXBRR0N5RUhJQUlvQXFRR0lSRWdBaWdDcUFZaEJTQUVRWUNBZ0lCNFJnMEJBMEFnQWlBek53TEVEaUFDSUFRMkFzQU9JQXNvQWxnaUYwVUVRQ0FOS0FJQUlncEZEUVVnRFNnQ0JDRUVFUEFISWdBZ0NqWUM1QUVnQWtFWWFpQUFJQVJCQVdvUSt3TWdBaWdDR0NFSUlBMGdBaWdDSENJQU5nSUVJQTBnQ0RZQ0FDQUZJQUJCQVd0SERRY2dDQzhCNGdFaUFFRUxUdzBJSUFnZ0FFRUJhaUlLT3dIaUFTQUNRY2dPYWlnQ0FDRUVJQUlwQXNBT0lUTWdDQ0FBUVFOMGFpSUZJQWsyQWdRZ0NDQUFRUXhzYWlJQUlETTNBbHdnQlNBSE5nSUFJQUJCNUFCcUlBUTJBZ0FnQ0NBS1FRSjBhaUFSTmdMa0FTQVJJQW83QWVBQklCRWdDRFlDV0F3REN5QUNJQmMyQXN3T0lBSWdDeThCNEFFaUNqWUMxQTRnQWlBSVFRRnFJaDgyQXRBT0lBVWdDRWNOQ0FKL0FrQUNRQ0FYTHdIaUFVRUxUd1JBSUFwQkJVOE5BVUVFSVFVZ0FTRUVJQThoQUNBS0lRZ01BZ3NnQWtITURtb2dBa0hBRG1vZ0J5QUpJQkVRMGdJTUJRdEJBQ0VJUVFVaEJTQUdJUVFnRWlFQUFrQUNRQ0FLUVFWckRnSUFBZ0VMUVFVaENDQUNRUVUyQW9BS0lBSWdIellDL0FrZ0FpQVhOZ0w0Q1NBQ1FZZ0dhaUFDUWZnSmFoQy9BU0FDS0FLZ0JpRUxJQUlvQXB3R0RBSUxJQXBCQjJzaENFRUdJUVVMSUFJZ0JUWUNnQW9nQWlBZk5nTDhDU0FDSUJjMkF2Z0pJQUpCaUFacUlBSkIrQWxxRUw4QklBQW9BZ0FoQ3lBRUtBSUFDeUVBSUFJZ0NEWUNrQTRnQWlBTE5nS01EaUFDSUFBMkFvZ09JQUpCaUE1cUlBSkJ3QTVxSUFjZ0NTQVJFTklDSUFJb0FxZ0dJUVVnQWlnQ3BBWWhFU0FDS0FLZ0JpRUlJQUlvQXB3R0lRc2dBaWdDbUFZaENTQUNLQUtVQmlFSElBSXBBb3dHSVRNZ0FpZ0NpQVlpQkVHQWdJQ0FlRWNOQUFzTUFRc1E3Z2NoQ1NBTlFRQTJBZ1FnRFNBSk5nSUFJQWt2QWVJQklnZEJDMDhOQnlBSklBZEJBV283QWVJQklBa2dCMEVNYkdvaUJTQUNLUUtvQ2pjQ1hDQUpJQWRCQTNScUlnY2dBRFlDQkNBSElCMDJBZ0FnQlVIa0FHb2dBa0d3Q21vb0FnQTJBZ0FMSUEwZ0RTZ0NDRUVCYWpZQ0NBd0NDeUFKSUExQkEzUnFJZ1VvQWdRaEJ5QUZJQUEyQWdRZ0JTZ0NBQ0VBSUFVZ0hUWUNBQ0FDSUFjMkFvd0dJQUlnQURZQ2lBWWdBQ0FBS0FJQUlnQkJBV3MyQWdBZ0FFRUJSdzBCSUFKQmlBWnFFSU1FREFFTEMwSE1qOGtBRUxzSkFBdEJqSkRKQUVFd1FieVF5UUFRbkFZQUMwSGNqOGtBUVNCQnpKREpBQkNjQmdBTFFkQ1N5UUJCTlVHSWs4a0FFSndHQUF0QjNJL0pBRUVnUWZ5UHlRQVFuQVlBQ3lBQ1FkZ09haERMQ0NBQ0tBS29EaUVFSUFJb0Fxd09JUUVnQWlnQ3NBNGhDeUEwUWdOWEJFQWdBaUFMTmdLUUJpQUNJQUUyQW93R0lBSWdCRFlDaUFZZ0FrR0lCbW9RaEFGQkFDRUxRUUFoQkFzZ0FrR1lCbW9pQUVJQU53TUFRUUFoQ0NBQ1FRQTZBSlFISUFKQkFEWUNpQVlnQWtFQU5nS1FCeUFDUVFBMkFxZ0dJQUpDQURjRGtBWWdBa0lCTndMMEJpQUNRZ0EzQXV3R0lBSkNnSUNBZ0JBM0F1UUdJQUpDQVRjQzNBWWdBa0lBTndMVUJpQUNRb0NBZ0lBUU53TE1CaUFDUWdFM0FzUUdJQUpDQURjQ3ZBWWdBa0tBZ0lDQUVEY0N0QVlnQWtJQk53S3NCaUFDUXJ3ZU53T2dCaUFDUWdBM0FvUUhJQUpDZ0lDQWdCQTNBdndHSUFKQmlBZHFFSVFCUVFFaEVVRUFRUUVRcVFsQkFFRUJFS2tKUVFCQkFSQ3BDVUVBUVFFUXFRbEJBRUVCRUtrSlFRQkJBUkNwQ1VFQUlRVkJBQ0VIUVFBaEhFRUJJUWtnTkVKK2cwSUVVUVJBSUFKQmlBWnFJQXdRMmdNQ1FDQUNLQUtJQmtHZmdJQ0FlRWNFUUNBQ1FiZ0thaUFBS0FJQU5nSUFJQUpCc0FwcUlBSkJrQVpxS1FJQU53TUFJQUlnQWlrQ2lBWTNBNmdLREFFTElBSkJxQXBxSUFJb0Fvd0dRZHpVeVFCQkJCRFBBUXNDUUNBQ0tBS29Da0dmZ0lDQWVFY0VRQ0FDUVpnR2FpQUNRYmdLYWlnQ0FEWUNBQ0FDUVpBR2FpQUNRYkFLYWlrREFEY0RBQ0FDSUFJcEE2Z0tOd09JQmd3QkN5QUNRWWdHYWlBQ0tBS3NDaEM1QkFzZ0FpZ0NpQVpCbjRDQWdIaEhCSDlCQUFVZ0FrR29DbW9nQWlnQ2pBWWdBaWdDa0FZUXF3UkJBRUVCRUtrSklBSW9BcXdLSVJFZ0FpZ0NxQW9oQlNBQ0tBS3dDZ3NoQnlBQ1FZZ0dhaUlBRU1zSUlBQWdEQkRhQXdKQUlBSW9Bb2dHUVorQWdJQjRSd1JBSUFKQnVBcHFJQUpCbUFacUtBSUFOZ0lBSUFKQnNBcHFJQUpCa0FacUtRSUFOd01BSUFJZ0Fpa0NpQVkzQTZnS0RBRUxJQUpCcUFwcUlBSW9Bb3dHUWVEVXlRQkJCQkRQQVFzQ1FDQUNLQUtvQ2tHZmdJQ0FlRWNFUUNBQ1FaZ0dhaUFDUWJnS2FpZ0NBRFlDQUNBQ1FaQUdhaUFDUWJBS2Fpa0RBRGNEQUNBQ0lBSXBBNmdLTndPSUJnd0JDeUFDUVlnR2FpQUNLQUtzQ2hDNUJBc2dBaWdDaUFaQm40Q0FnSGhIQkg5QkFBVWdBa0dvQ21vZ0FpZ0NqQVlnQWlnQ2tBWVFxd1JCQUVFQkVLa0pJQUlvQXJBS0lRZ2dBaWdDckFvaENTQUNLQUtvQ2dzaEhDQUNRWWdHYWhETENBc2dBaUFoT2dEc0F5QUNJQXMyQXVnRElBSWdBVFlDNUFNZ0FpQUVOZ0xnQXlBQ0lDYzJBdHdESUFJZ0lqWUMyQU1nQWlBb05nTFVBeUFDSUNrMkF0QURJQUlnSXpZQ3pBTWdBaUFxTmdMSUF5QUNJQmcyQXNRRElBSWdGVFlDd0FNZ0FpQXJOZ0s4QXlBQ0lDdzJBcmdESUFJZ0pEWUN0QU1nQWlBdE5nS3dBeUFDSUJzMkFxd0RJQUlnR1RZQ3FBTWdBaUF1TmdLa0F5QUNJQWcyQXFBRElBSWdDVFlDbkFNZ0FpQWNOZ0tZQXlBQ0lBYzJBcFFESUFJZ0VUWUNrQU1nQWlBRk5nS01BeUFDSUJRMkFvZ0RJQUlnQXpZQ2hBTWdBaUFXTmdLQUF5QUNJRFUzQS9nQ0lBSWdNamNEOEFJZ0FpQTBOd1BvQWlBQ0lDQTJBdVFDSUFJZ0dqWUM0QUlnQWtIdkEyb2dBa0dLQm1vdEFBQTZBQUFnQWlBQ0x3Q0lCanNBN1FNTElBSkIyQUpxSWdFZ0FrSDBBbW9vQWdBMkFnQWdBa0hRQW1vaUFDQUNRZXdDYWlrQ0FEY0RBQ0FDSUFJcEF1UUNOd1BJQWlBYVFRSkdEUUFnQWtIUUFXb2dBa0g0QW1wQitBRDhDZ0FBSUFKQnhBRnFJQUFwQXdBM0FnQWdBa0hNQVdvZ0FTZ0NBRFlDQUNBQ0lCbzJBcmdCSUFJZ0Fpa0R5QUkzQXJ3QklBd29BcHdDSVFFZ0FpQU1LQUtnQWtFQUlBd29BcGdDSWdNYk5nS29CaUFDSUFFMkFxUUdJQUlnQXpZQ29BWWdBa0VBTmdLY0JpQUNJQU5CQUVjaUFEWUNtQVlnQWlBQk5nS1VCaUFDSUFNMkFwQUdJQUpCQURZQ2pBWWdBaUFBTmdLSUJpQU1RWmdDYWlFRkEwQWdBa0VRYWlBQ1FZZ0dhaER1QVNBQ0tBSVFJZ0JGRFFJZ0FpZ0NGQ0VESUI0Z0FDZ0NBQ0lCUmlBQUx3RUVJZ0FnSmtaeERRQWdBa0c0QVdvZ0FTQUFJQU1RSlNJQVFaaUF4QUJHRFFBTElCQWdBRFlDQkNBUVFZZUFnSUI0TmdJQURBSUxJQkFnQWlrRHlBSTNBZ0FnRUVFUWFpQUNRZGdDYWlnQ0FEWUNBQ0FRUVFocUlBSkIwQUpxS1FNQU53SUFEQUlMSUFKQkFEWUNnQW9nQWtLQWdJQ0FnQUUzQXZnSklBd29BcHdDSVFFZ0FpQU1LQUtnQWtFQUlBd29BcGdDSWdNYk5nTElDaUFDSUFFMkFzUUtJQUlnQXpZQ3dBb2dBa0VBTmdLOENpQUNJQU5CQUVjaUFEWUN1QW9nQWlBQk5nSzBDaUFDSUFNMkFyQUtJQUpCQURZQ3JBb2dBaUFBTmdLb0NnSkFBa0FDUUFOQUFrQWdBa0VJYWlBQ1FhZ0thaER1QVFKQUFuOENRQ0FDS0FJSUJFQWdBa0hnQW1vZ0FpZ0NEQkQrQkNBQ0tBTGdBa0dmZ0lDQWVFY05BeUFDS0FMa0FpSUFRUWhxUWN6WXlRQkJCaENsQTBVTkJTQUNRWWdHYWlBQUVDMGdBaWdDaUFaQm40Q0FnSGhIRFFnZ0FpZ0NqQVlpQVEwQlFRQWhBMEVBREFJTElBSW9Bb0FLSVFFZ0FpZ0MvQWtoQUNBQ0lBSW9BdmdKTmdLd0NpQUNJQUEyQXFnS0lBSWdBQ0FCUWRBQWJDSURhaUlITmdLMENpQUFRZEFBYWlFRUlBSkI4QU5xUVFSeUlSSURRQUpBQWtBZ0FpQURCSDhnQUNnQ0NDSUJRUXhIRFFFZ0JBVWdCd3MyQXF3S0lBSkJxQXBxSWdFUXVnVWdBa0dJQm1vaUFDQWxRY1hZeVFCQkJ4QlFJQUlvQW9nR1FReEdEUVlnQVNBQVFjZ0EvQW9BQUNBQ1FlQUNhaUFCRU1RRUlBSXZBZWdDSVFZZ0FpZ0M1QUloQXlBQ0tBTGdBaUlBUVorQWdJQjRSZzBCSUJBZ0Fpa0I2Z0kzQVFvZ0VFRVNhaUFDUWZJQ2FpOEJBRHNCQUNBUUlBWTdBUWdnRUNBRE5nSUVJQkFnQURZQ0FDQUJFSjRFREFzTElBSWdBVFlDOEFNZ0FDZ0NBQ0VQSUFBdkFRUWhCaUFTSUFCQkRHcEJ4QUQ4Q2dBQUlBQkIwQUJxSVFBZ0FrR0lCbW9pQVNBRklBOGdCaEQ1QWlBRVFkQUFhaUVFSUFOQjBBQnJJUU1nQVNBQ1FmQURhaEF5REFFTEN5QUNRYWdLYWlJQkVKNEVBa0FnQlNnQ0FDSUFSUTBBSUFKQmlBNXFJQUFnRENnQ25BSWdBeUFHRU9FQ0lBSW9Bb2dPUVFGR0RRQWdBaWdDbEE0aEJpQUNLQUtRRGlFRElBSW9Bb3dPSVFBZ0FrRUFPZ0RNRGdKQUlBTkZCRUFnQWlBR05nS3dDaUFDUVFBMkFxd0tJQUlnQURZQ3FBb2dBa0dJQm1vZ0FTQUNRY3dPYWhCU0RBRUxJQUpCaUFacUlBQWdCa0VDZEdvb0F2Z0dJQU5CQVdzUW9BWWdBaWdDa0FZaUFBUi9JQUkxQW93R0lBQkJBV3V0UWlDR2hDRXlJQUlvQW9nR0JVRUFDeUVBSUFJZ01qY0N6QUlnQWlBQU5nTElBaUFDUVlnR2FpQUNRY2dDYWlBQ1Fjd09haEJTSUFJdkFZd0dJUThnQWlnQ2lBWWhCaUFDUWVBQ2FpQUNRWkFHYWtISUFQd0tBQUFnQWlnQzRBWWhBeUFDS0FMWUJpRUFBMEFnQUM4QjlnWWdBMDBFUUNBQUx3SDBCaUVESUFBb0F2QUdJUUFNQVFzTElBQWdBMEVEZEdvaUFTQVBPd0VFSUFFZ0JqWUNBQ0FBSUFOQnlBQnNha0hZQUdvaEFDQUNRWWdHYWlBQVFjZ0EvQW9BQUNBQUlBSkI0QUpxUWNnQS9Bb0FBQ0FDUWFvS2FpQUNRWWdHYWlJQVFjZ0EvQW9BQUNBQVFRWnlJQUpCcUFwcVFjb0EvQW9BQUFzZ0FpZ0NrQVloQXlBQ1FhZ0thaUFDUVpRR2FrSEVBUHdLQUFBZ0RDQU1LQUtnQWtFQmF6WUNvQUlnQWkwQXpBNUJBVVlFUUNBRktBSUFJZ0ZGRFFnZ0RDZ0NuQUlpQUVVTkJ5QU1JQUJCQVdzMkFwd0NJQXdnQVNnQytBWWlBRFlDbUFJZ0FFRUFOZ0x3QmlBQlFhZ0hRUWdRNHdRTElBSkIyQTVxSWdFZ0FrR29DbXBCeEFEOENnQUFJQU5CREVZTkFDQUNJQU0yQW9nR0lBSkJpQVpxSWdCQkJISWdBVUhFQVB3S0FBQWdBQkNlQkFzZ0FrR0lCbW9nQWtHNEFXcEJrQUg4Q2dBQUlBd29BZ0JCQWtjRVFDQU1FT1VFQ3lBTUlBSkJpQVpxUVpBQi9Bb0FBQ0FRUVorQWdJQjROZ0lBREFrTElBSW9BcFFHSVFNZ0FpQUNLQUtRQmlJQU5nS2tCaUFDSUFFMkFxQUdJQUpCQURZQ25BWWdBaUFBTmdLVUJpQUNJQUUyQXBBR0lBSkJBRFlDakFaQkFRc2hBQ0FDSUFNMkFxZ0dJQUlnQURZQ21BWWdBaUFBTmdLSUJpQUNRZmdKYWlBQ1FZZ0dhaENFQkF3Q0N5QUNRZUFDYWhETkFnd0JDd3RCb0pySkFCQzdDUUFMUWJTUnlRQkJJVUhZa2NrQUVKd0dBQXRCdU1qSkFCQzdDUUFMSUFKQmlBWnFFTTBDUWJDYXlRQVF1d2tBQ3lBQ1FiZ0JhaERsQkFzZ0FrR2dEMm9rQUNBd0lCTVFxUWtnRGtFSWFoRE5CZ3dCQ3lBQUlBNHBBMmczQWdBZ0FFRVFhaUFQS0FJQU5nSUFJQUJCQ0dvZ0Vpa0RBRGNDQUFzZ0RrSGdBV29rQUF1WUFnRUxmeUFDSUFGQkEzUkJDR3NpQTJvaEJpQUFJQU5xSVFVZ0FDQUJRUUYySWdkQkEzUnFJZ05CQ0dzaEJBTkFJQWNFUUNBQ0lBTWdBQ0FES0FJQUtBSUFJZ2dnQUNnQ0FDZ0NBQ0lKU1NJS0d5a0NBRGNDQUNBR0lBUWdCU0FGS0FJQUtBSUFJZ3NnQkNnQ0FDZ0NBQ0lNU1NJTkd5a0NBRGNDQUNBSFFRRnJJUWNnQmtFSWF5RUdJQUpCQ0dvaEFpQUFJQWdnQ1U5QkEzUnFJUUFnQXlBS1FRTjBhaUVESUFSQmVFRUFJQTBiYWlFRUlBVkJlRUVBSUFzZ0RFOGJhaUVGREFFRkFrQWdCRUVJYWlFRUlBRkJBWEVFZnlBQ0lBQWdBeUFBSUFSSklnRWJLUUlBTndJQUlBTWdBQ0FFVDBFRGRHb2hBeUFBSUFGQkEzUnFCU0FBQ3lBRVJpQURJQVZCQ0dwR2NRMEFFT3NHQUFzTEN3dTZBZ0VFZjBFZklRSWdBRUlBTndJUUlBRkIvLy8vQjAwRVFDQUJRUVlnQVVFSWRtY2lBMnQyUVFGeElBTkJBWFJyUVQ1cUlRSUxJQUFnQWpZQ0hDQUNRUUowUVpUYzJnQnFJUVJCQVNBQ2RDSURRYkRmMmdBb0FnQnhSUVJBSUFRZ0FEWUNBQ0FBSUFRMkFoZ2dBQ0FBTmdJTUlBQWdBRFlDQ0VHdzM5b0FRYkRmMmdBb0FnQWdBM0kyQWdBUEN3SkFBa0FnQVNBRUtBSUFJZ01vQWdSQmVIRkdCRUFnQXlFQ0RBRUxJQUZCR1NBQ1FRRjJhMEVBSUFKQkgwY2JkQ0VGQTBBZ0F5QUZRUjEyUVFSeGFpSUVLQUlRSWdKRkRRSWdCVUVCZENFRklBSWhBeUFDS0FJRVFYaHhJQUZIRFFBTEN5QUNLQUlJSWdFZ0FEWUNEQ0FDSUFBMkFnZ2dBRUVBTmdJWUlBQWdBallDRENBQUlBRTJBZ2dQQ3lBRVFSQnFJQUEyQWdBZ0FDQUROZ0lZSUFBZ0FEWUNEQ0FBSUFBMkFnZ0xrQUlCQkg4Q1FDQUNJQUVvQWdRaUF5QUJMUUFJSWdadVR3MEFJQUlnQm13aUFpQURTdzBBSUFFb0FnQWhCQUovQWtBQ1FBSkFBa0FnQmtFQ2F3NERBUUlEQUFzZ0FpQURUdzBFSUFJZ0JHb3RBQUFNQXdzZ0FrRUNhaUFEU3lBQ1FYMUxjZzBESUFJZ0JHb3ZBQUFpQVVFSWRDQUJRUWgyY2tILy93TnhEQUlMSUFKQkEyb2dBMHNnQWtGOFMzSU5BaUFDSUFScUlnRXZBQUFpQWtHQS9nTnhJQUZCQW1vdEFBQnlRUWgwSUFKQkdIUnlRUWgyREFFTElBSkJCR29nQTBzZ0FrRjdTM0lOQVNBQ0lBUnFLQUFBSWdGQkdIUWdBVUdBL2dOeFFRaDBjaUFCUVFoMlFZRCtBM0VnQVVFWWRuSnlDeUlCUVFCSElRVWdBVUVCYXlFQkN5QUFJQUUyQWdRZ0FDQUZOZ0lBQzhBQ0FRRi9Jd0JCUUdvaUFpUUFJQUpCTEdvZ0FVR1F3c29BUVFRUXp3RUNRQ0FDS0FJc1FaK0FnSUI0UndSQUlBSkJFR29nQWtFOGFpZ0NBRFlDQUNBQ1FRaHFJQUpCTkdvcEFnQTNBd0FnQWlBQ0tRSXNOd01BREFFTElBSWdBaWdDTUJDNUJBc0NRQ0FDS0FJQVFaK0FnSUI0UndSQUlBSkJHR29nQVVHMDBNa0FRUW9RendFZ0FrRUtOZ0kwSUFKQnROREpBRFlDTUNBQ1FaK0FnSUI0TmdJc0FrQWdBaWdDR0VHZmdJQ0FlRWNFUUNBQUlBSXBBaGczQWdBZ0FFRVFhaUFDUVNocUtBSUFOZ0lBSUFCQkNHb2dBa0VnYWlrQ0FEY0NBQ0FDUVN4cUVOb0lEQUVMSUFBZ0Fpa0NMRGNDQUNBQVFSQnFJQUpCUEdvb0FnQTJBZ0FnQUVFSWFpQUNRVFJxS1FJQU53SUFJQUpCR0dvUTJnZ0xJQUlRcHdNTUFRc2dBQ0FDS1FJRU53SUVJQUJCbjRDQWdIZzJBZ0FMSUFKQlFHc2tBQXU2QWdJSGZ3SitJd0JCRUdzaUNDUUFJQUlnQTZkeElRWWdBMElaaUVML0FJTkNnWUtFaUpDZ3dJQUJmaUVPQWtBRFFDQUJJQVpxS1FBQUlnMGdEb1VpQTBKL2hTQURRb0dDaElpUW9NQ0FBWDJEUW9DQmdvU0lrS0RBZ0grRElRTURRQ0FEVUVVRVFFRUFJUWNnQkNBRGVxZEJBM1lnQm1vZ0FuRWlDU0FGRVFNQURRTWdBMElCZlNBRGd5RUREQUVMQzBFQklRY0NRQUpBSUF0QkFVY0VRQ0FJUVFocUlBSWdEU0FHRUswSElBZ29BZ3doRENBSUtBSUlJZ2RCQVhGRkRRRUxJQTBnRFVJQmhvTkNnSUdDaElpUW9NQ0FmNE5DQUZJTkFRc2dDa0VJYWlJS0lBWnFJQUp4SVFZZ0J5RUxEQUVMQzBFQklRY2dBU0FNYWl3QUFFRUFTQVJBSUF3aENRd0JDeUFCS1FNQVFvQ0Jnb1NJa0tEQWdIK0RlcWRCQTNZaENRc2dBQ0FKTmdJRUlBQWdCellDQUNBSVFSQnFKQUFMekFJQkJIOGpBRUdBQTJzaUFDUUFBa0FDUUFKQVFZamMyZ0FvQWdBaUFRMEFJQUJCeUFKcUVKOEJJQUFvQXNnQ1FRRkdEUUVnQUVHWUFtb2dBRUhRQW1wQk1Qd0tBQUFnQUVFWWFpSUNRUUJCZ0FMOEN3QkJnT0RhQUMwQUFCcEIwQUlRRmlJQlJRMENJQUZDZ1lDQWdCQTNBd0FnQVVFSWFpQUNRYkFDL0FvQUFDQUJRY0FBTmdMSUFpQUJRb0NBQkRjRHdBSWdBVUtBZ0FRM0E3Z0NRWWpjMmdBb0FnQWhBa0dJM05vQUlBRTJBZ0FnQWtVTkFDQUNJQUlvQWdCQkFXc2lBellDQUNBRERRQWdBaEM2QjBHSTNOb0FLQUlBSVFFTElBRWdBU2dDQUVFQmFpSUNOZ0lBSUFKRkRRRWdBRUdBQTJva0FDQUJEd3NnQUNBQUtBTE1BallDRENBQVFRRTJBc3dDSUFCQnhJblNBRFlDeUFJZ0FFSUJOd0xVQWlBQVFUazJBaFFnQUNBQVFSQnFOZ0xRQWlBQUlBQkJER28yQWhBZ0FFSElBbXBCekluU0FCQ3JCd3NBQytRRkFncC9BbjRqQUVFZ2F5SUZKQUFnQlNBQ05nSVFJQUVwQXhBZ0FTa0RHQ0FDRUwwRUlROGdCU0FGUVJCcU5nSVVJQUVvQWdoRkJFQUNRQ01BUVVCcUlnSWtBQ0FDSUFGQkVHb2lCellDRENBQktBSU1JUVFnQWlBQ1FReHFOZ0lRSUFSQmYwY0VRQUovQWtBZ0FTZ0NCQ0lHSUFaQkFXcEJBM1pCQjJ3Z0JrRUlTUnNpQmtFQmRpQUVUUVJBSUFKQk1HcEJFQ0FHSUFRZ0JDQUdTUnRCQVdvUS93SWdBaWdDTkNJSklBSW9BakFpQmtVTkFob2dBaWdDT0NFS0lBSWdBaWdDUERZQ0xDQUNJQW8yQWlnZ0FpQUpOZ0lrSUFJZ0JqWUNJQ0FDUXBDQWdJQ0FBVGNDR0NBQ0lBYzJBaFFnQVNnQ0FDSUxLUU1BUW4rRlFvQ0Jnb1NJa0tEQWdIK0RJUTRnQWtFZ2FpRU1RUUFoQndOQUlBUUVRQU5BSUE1UUJFQWdCMEVJYWlFSElBdEJDR29pQ3lrREFFSi9oVUtBZ1lLRWlKQ2d3SUIvZ3lFT0RBRUxDeUFDSUFZZ0NTQUNRUkJxSUFFZ0RucW5RUU4ySUFkcUlnZ1Fzd2NRdkFVZ0JpQUNLQUlBUVg5elFRUjBhaUlOSUFFb0FnQWdDRUYvYzBFRWRHb2lDQ2tBQURjQUFDQU5RUWhxSUFoQkNHb3BBQUEzQUFBZ0JFRUJheUVFSUE1Q0FYMGdEb01oRGd3QkN3c2dBaUFCS0FJTUlnUTJBaXdnQWlBS0lBUnJOZ0lvSUFFZ0RCRFRDU0FDUVJScUVLZ0ZEQUVMSUFFZ0FrRVFha0h4QUVFUUVIY0xRUUFMR2lBQ1FVQnJKQUFNQVFzUTV3WUFDd3NnQlNBRlFSUnFOZ0lZSUFVZ0FUWUNIQ0FGUVFocUlBRW9BZ0FnQVNnQ0JDQVBJQVZCR0dwQjZnQVFqZ0lnQVNnQ0FDRUNJQVVvQWd3aEJDQUFBbjRnQlNnQ0NFRUJjUVJBSUFJZ0JHb2lBQzBBQUNFR0lBVW9BaEFoQnlBQUlBK25RUmwySWdBNkFBQWdBaUFCS0FJRUlBUkJDR3R4YWtFSWFpQUFPZ0FBSUFFZ0FTZ0NERUVCYWpZQ0RDQUJJQUVvQWdnZ0JrRUJjV3MyQWdnZ0FpQUVRUVIwYXlJQVFRaHJJQU01QXdBZ0FFRVFheUFITmdJQVFnQU1BUXNnQUNBQ0lBUkJCSFJyUVFocklnQXJBd0E1QXdnZ0FDQURPUU1BUWdFTE53TUFJQVZCSUdva0FBdU1BZ0VMZnlBQ0lBRkJBM1JCQ0dzaUEyb2hCaUFBSUFOcUlRVWdBQ0FCUVFGMklnZEJBM1JxSWdOQkNHc2hCQU5BSUFjRVFDQUNJQU1nQUNBRExRQUFJZ2dnQUMwQUFDSUpTU0lLR3lrQ0FEY0NBQ0FHSUFRZ0JTQUZMUUFBSWdzZ0JDMEFBQ0lNU1NJTkd5a0NBRGNDQUNBSFFRRnJJUWNnQmtFSWF5RUdJQUpCQ0dvaEFpQUVRWGhCQUNBTkcyb2hCQ0FGUVhoQkFDQUxJQXhQRzJvaEJTQUFJQWdnQ1U5QkEzUnFJUUFnQXlBS1FRTjBhaUVEREFFRkFrQWdCRUVJYWlFRUlBRkJBWEVFZnlBQ0lBQWdBeUFBSUFSSklnRWJLUUlBTndJQUlBTWdBQ0FFVDBFRGRHb2hBeUFBSUFGQkEzUnFCU0FBQ3lBRVJpQURJQVZCQ0dwR2NRMEFFT3NHQUFzTEN3dTlBZ0VGZnlNQVFVQnFJZ1FrQUNBQ0lBTW9BZ3dSQmdBaEJ5QUVRUUEyQWd3Z0JFS0FnSUNBRURjQ0JDQUJLQUlFSVFZZ0FTZ0NBQ0VJSUFFb0FnZ2hBU0FBQW44Q1FBTkFJQUVnQlVzRVFDQUVRUlJxSUFnZ0FpQURJQVlvQWhRUkFBQWdCQ2dDRkVFRlJ3MENJQVJCQkdvZ0JDMEFHQkQyQmlBRUtBSU1JUVVNQVFzTElBQWdCQ2tDQkRjQ0JDQUFRUXhxSUFSQkRHb29BZ0EyQWdBZ0JDQUJOZ0lRUVFVTUFRc2dCRUVVYWlJR0VNNElJQVFnQVRZQ0VDQUNJQWNnQXlnQ0dCRUJBQ0FFUVFNMkFoZ2dCRUdzek5JQU5nSVVJQVJDQWpjQ0lDQUVRUm8yQWpnZ0JFRWFOZ0l3SUFRZ0JUWUNQQ0FFSUFSQkxHbzJBaHdnQkNBRVFUeHFOZ0kwSUFRZ0JFRVFhallDTENBQVFRaHFJQVlRbmdNZ0FDQUhOZ0lFSUFRb0FnUWdCQ2dDQ0JEMkNVRUJDellDQUNBRVFVQnJKQUFMbWdJQkEzOGdBQ2dDQ0NJRElRSUNmMEVCSUFGQmdBRkpEUUFhUVFJZ0FVR0FFRWtOQUJwQkEwRUVJQUZCZ0lBRVNSc0xJZ1FnQUNnQ0FDQURhMHNFZnlBQUlBTWdCQkQzQWlBQUtBSUlCU0FDQ3lBQUtBSUVhaUVDQWtBQ1FDQUJRWUFCVHdSQUlBRkJnQkJKRFFFZ0FVR0FnQVJQQkVBZ0FpQUJRVDl4UVlBQmNqb0FBeUFDSUFGQkVuWkI4QUZ5T2dBQUlBSWdBVUVHZGtFL2NVR0FBWEk2QUFJZ0FpQUJRUXgyUVQ5eFFZQUJjam9BQVF3REN5QUNJQUZCUDNGQmdBRnlPZ0FDSUFJZ0FVRU1ka0hnQVhJNkFBQWdBaUFCUVFaMlFUOXhRWUFCY2pvQUFRd0NDeUFDSUFFNkFBQU1BUXNnQWlBQlFUOXhRWUFCY2pvQUFTQUNJQUZCQm5aQndBRnlPZ0FBQ3lBQUlBTWdCR28yQWdoQkFBdW5BZ0lCZndKK0l3QkJNR3NpQWlRQUlBRW9BZ0JCQVVZRVFDQUNRUkJxSUFGQkdHb3BBd0EzQXdBZ0FrRUlhaUFCUVJCcUtRTUFOd01BSUFJZ0FTa0RDRGNEQUVJQklRUUxJQUVvQWlCQkFVWUVRQ0FDUVNocUlBRkJPR29wQXdBM0F3QWdBa0VnYWlBQlFUQnFLUU1BTndNQUlBSWdBU2tES0RjREdFSUJJUU1MSUFCQjJBQnFJQUZCMkFCcUVOY0hJQUFnQkRjREFDQUFJQU0zQXlBZ0FFSFFBR29nQVVIUUFHb3BBd0EzQXdBZ0FFSElBR29nQVVISUFHb3BBd0EzQXdBZ0FDQUJLUU5BTndOQUlBQWdBaWtEQURjRENDQUFRUkJxSUFKQkNHb3BBd0EzQXdBZ0FFRVlhaUFDUVJCcUtRTUFOd01BSUFBZ0Fpa0RHRGNES0NBQVFUQnFJQUpCSUdvcEF3QTNBd0FnQUVFNGFpQUNRU2hxS1FNQU53TUFJQUpCTUdva0FBdTlBZ0VGZnlNQVFVQnFJZ1FrQUNBQ0lBTW9BZ3dSQmdBaEJ5QUVRUUEyQWd3Z0JFS0FnSUNBRURjQ0JDQUJLQUlFSVFZZ0FTZ0NBQ0VJSUFFb0FnZ2hBU0FBQW44Q1FBTkFJQUVnQlVzRVFDQUVRUlJxSUFnZ0FpQURJQVlvQWhRUkFBQWdCQ2dDRkVFRlJ3MENJQVJCQkdvZ0JDMEFHQkQyQmlBRUtBSU1JUVVNQVFzTElBQWdCQ2tDQkRjQ0JDQUFRUXhxSUFSQkRHb29BZ0EyQWdBZ0JDQUJOZ0lRUVFVTUFRc2dCRUVVYWlJR0VPZ0lJQVFnQVRZQ0VDQUNJQWNnQXlnQ0dCRUJBQ0FFUVFNMkFoZ2dCRUdzek5JQU5nSVVJQVJDQWpjQ0lDQUVRUm8yQWpnZ0JFRWFOZ0l3SUFRZ0JUWUNQQ0FFSUFSQkxHbzJBaHdnQkNBRVFUeHFOZ0kwSUFRZ0JFRVFhallDTENBQVFRaHFJQVlRbmdNZ0FDQUhOZ0lFSUFRb0FnUWdCQ2dDQ0JEMkNVRUJDellDQUNBRVFVQnJKQUFMbkFJQkJYOENRQUpBQWtBZ0FrRURha0Y4Y1NBQ2F5SUZCRUFnQVVIL0FYRWhCMEVCSVFZRFFDQUNJQVJxTFFBQUlBZEdEUVFnQlNBRVFRRnFJZ1JIRFFBTElBVWdBMEVJYXlJR1N3MENEQUVMSUFOQkNHc2hCa0VBSVFVTElBRkIvd0Z4UVlHQ2hBaHNJUVFEUUVHQWdvUUlJQUlnQldvaUJ5Z0NBQ0FFY3lJSWF5QUlja0dBZ29RSUlBZEJCR29vQWdBZ0JITWlCMnNnQjNKeFFZQ0Jnb1I0Y1VHQWdZS0VlRWNOQVNBRlFRaHFJZ1VnQmswTkFBc0xBa0FnQXlBRlJnMEFJQU1nQldzaEF5QUNJQVZxSVFKQkFDRUVJQUZCL3dGeElRRURRQ0FCSUFJZ0JHb3RBQUJIQkVBZ0JFRUJhaUlFSUFOSERRRU1BZ3NMSUFRZ0JXb2hCRUVCSVFZTUFRdEJBQ0VHQ3lBQUlBUTJBZ1FnQUNBR05nSUFDN2dDQWdsL0FuNGpBRUVRYXlJRUpBQWdBRUVFYXlFSUlBSkNHWWhDZ1lLRWlKQ2d3SUFCZmlFTklBRWdBcWR4SVFVZ0F5Z0NDQ0VKSUFNb0FnQWhDaUFES0FJRUlRc2dBeWdDRENFREFrQURRQ0FFSUFBZ0JXb3BBQUFpQWlBTmhTSU9RbitGSUE1Q2dZS0VpSkNnd0lBQmZZTkNnSUdDaElpUW9NQ0FmNE0zQXdnQ1FBSkFBMEFnQkNBRVFRaHFFTmtGSUFRb0FnQkJBWEZGRFFFZ0NDQUVLQUlFSUFWcUlBRnhJZ3hCQW5ScktBSUFJZ1lnQTA4TkFpQUtJQXNnQ1NBR1FkZ0FiR29pQmtITUFHb29BZ0FnQmtIUUFHb29BZ0FRd2dsRkRRQUxJQUJCQUNBTWEwRUNkR29oQXd3REN5QUNJQUpDQVlhRFFvQ0Jnb1NJa0tEQWdIK0RVRVVFUUVFQUlRTU1Bd3NnQlNBSFFRaHFJZ2RxSUFGeElRVU1BUXNMSUFZZ0EwR2tuOGtBRU1ZRUFBc2dCRUVRYWlRQUlBTUxrUUlDQkg4QmZpTUFRU0JySWdZa0FBSkFJQUlnQWlBRGFpSURTd1JBUVFBaEFnd0JDMEVBSVFJZ0JDQUZha0VCYTBFQUlBUnJjYTBnQXlBQktBSUFJZ2hCQVhRaUJ5QURJQWRMR3lJRFFRaEJCQ0FGUVFGR0d5SUhJQU1nQjBzYklnZXRmaUlLUWlDSXB3MEFJQXFuSWdsQmdJQ0FnSGdnQkd0TERRQUNmeUFJUlFSQVFRQWhCU0FHUVJocURBRUxJQVlnQkRZQ0dDQUdJQUVvQWdRMkFoUWdCU0FJYkNFRklBWkJIR29MSUFVMkFnQWdCa0VJYWlBRUlBa2dCa0VVYWhEUkF5QUdLQUlJUVFGR0JFQWdCaWdDRUNFRElBWW9BZ3doQWd3QkN5QUdLQUlNSVFJZ0FTQUhOZ0lBSUFFZ0FqWUNCRUdCZ0lDQWVDRUNDeUFBSUFNMkFnUWdBQ0FDTmdJQUlBWkJJR29rQUF2SUFnRUVmeU1BUVNCcklnVWtBRUVCSVFjQ1FDQUFMUUFFRFFBZ0FDMEFCU0VJSUFBb0FnQWlCaTBBQ2tHQUFYRkZCRUFnQmlnQ0FFSFA5c0FBUWN6MndBQWdDRUVCY1NJSUcwRUNRUU1nQ0JzZ0JpZ0NCQ2dDREJFQ0FBMEJJQVlvQWdBZ0FTQUNJQVlvQWdRb0Fnd1JBZ0FOQVNBR0tBSUFRWnoyd0FCQkFpQUdLQUlFS0FJTUVRSUFEUUVnQXlBR0lBUVJBd0FoQnd3QkN5QUlRUUZ4UlFSQUlBWW9BZ0JCMGZiQUFFRURJQVlvQWdRb0Fnd1JBZ0FOQVFzZ0JVRUJPZ0FQSUFWQnNQYkFBRFlDRkNBRklBWXBBZ0EzQWdBZ0JTQUdLUUlJTndJWUlBVWdCVUVQYWpZQ0NDQUZJQVUyQWhBZ0JTQUJJQUlRZkEwQUlBVkJuUGJBQUVFQ0VId05BQ0FESUFWQkVHb2dCQkVEQUEwQUlBVW9BaEJCMVBiQUFFRUNJQVVvQWhRb0Fnd1JBZ0FoQndzZ0FFRUJPZ0FGSUFBZ0J6b0FCQ0FGUVNCcUpBQWdBQXVvQWdFRmZ5TUFRUkJySWdNa0FBSi9JQUF2QVFBaUFFSG9CMDhFUUNBRElBQWdBRUdRemdCdUlnUkJrTTRBYkdzaUFrSC8vd054UWVRQWJpSUZRUUYwSWdaQjMvYkFBR290QUFBNkFBMGdBeUFHUWQ3MndBQnFMUUFBT2dBTUlBTWdBaUFGUWVRQWJHdEIvLzhEY1VFQmRDSUNRZC8yd0FCcUxRQUFPZ0FQSUFNZ0FrSGU5c0FBYWkwQUFEb0FEa0VCREFFTElBQWhCRUVGSUFCQkNra05BQm9nQXlBQUlBQkI1QUJ1SWdSQjVBQnNhMEgvL3dOeFFRRjBJZ0pCMy9iQUFHb3RBQUE2QUE4Z0F5QUNRZDcyd0FCcUxRQUFPZ0FPUVFNTElRSkJBQ0FBSUFRYlJRUkFJQUpCQVdzaUFpQURRUXRxYWlBRVFRRjBRUjV4UWQvMndBQnFMUUFBT2dBQUN5QUJRUUZCQVVFQUlBTkJDMm9nQW1wQkJTQUNheENEQVNBRFFSQnFKQUFMbHdJQkEzOGpBRUZBYWlJQ0pBQWdBa0VJYWlBQkVHNUJPU0VCSUFJb0Fnd2hCQUovQWtBQ1FBSkFBa0FnQWlnQ0NDSURRUUZyRGdNQUFRTUNDMEU2SVFGQkFDRUREQUVMSUFKQk1Hb2dBa0VZYWlrQ0FEY0RBQ0FDUVRocUlBSkJJR29vQWdBMkFnQWdBaUFDS1FJUU53TW9JQUpCSjJvdEFBQkJHSFFnQWk4QUpVRUlkSEloQXlBQ0xRQWtJUUVMSUFFZ0EzSWhBVUVCREFFTElBSkJPR29nQWtFZ2FpZ0NBRFlDQUNBQ1FUQnFJQUpCR0dvcEFnQTNBd0FnQWlBQ0tRSVFOd01vSUFJb0FpUWhBVUVBQ3lFRElBQWdBaWtES0RjQ0NDQUFJQUUyQWh3Z0FDQUVOZ0lFSUFBZ0F6WUNBQ0FBUVJocUlBSkJPR29vQWdBMkFnQWdBRUVRYWlBQ1FUQnFLUU1BTndJQUlBSkJRR3NrQUF1RkFnRUlmeUFBSUFBb0FoZ2lBMEVZZHlJQklBTnpJZ1FnQUNnQ0hDSURRUmgzSWdJZ0EzTWlBMEVRZDNNZ0FuTTJBaHdnQUNBQklBQW9BaFFpQVVFWWR5SUNJQUZ6SWdFZ0JFRVFkM056TmdJWUlBQWdBaUFBS0FJUUlnUkJHSGNpQWlBRWN5SUVJQUZCRUhkemN6WUNGQ0FBSUFBb0FnUWlBVUVZZHlJSUlBRnpJZ0VnQUNnQ0NDSUdRUmgzSWdVZ0JuTWlCa0VRZDNNZ0JYTTJBZ2dnQUNBQUtBSUFJZ1ZCR0hjaUJ5QUZjeUlGUVJCM0lBZHpJQU56TmdJQUlBQWdBaUFBS0FJTUlnSkJHSGNpQnlBQ2N5SUNJQVJCRUhkemN5QURjellDRUNBQUlBWWdBa0VRZDNNZ0IzTWdBM00yQWd3Z0FDQUZJQUZCRUhkeklBaHpJQU56TmdJRUM3Z0NBUVIvSXdCQjBBQnJJZ1FrQUNBQ0lBTW9BZ3dSQmdBaEJ5QUVRU0JxSUFFb0FnQWdBaUFESUFFb0FnUW9BaFFSQUFBQ1FBSkFBbjhnQkNnQ0lDSUZRUVZIQkVBZ0JFRVFhaUFFUVMxcUtRQUFOd01BSUFSQkYyb2dCRUUwYWlnQUFEWUFBQ0FFSUFRcEFDVTNBd2dnQkMwQUpBd0JDeUFFTFFBa0lRWWdCRUU0YWlBQktBSUlJQUlnQXlBQktBSU1LQUlVRVFBQUlBUW9BamdpQlVFRlJnMEJJQVJCRUdvZ0JFSEZBR29wQUFBM0F3QWdCRUVYYWlBRVFjd0FhaWdBQURZQUFDQUVJQVFwQUQwM0F3Z2dCQzBBUEFzaEJpQUNJQWNnQXlnQ0dCRUJBQXdCQ3lBRUtBSThJQVFvQWtBUTlnbEJCU0VGQ3lBQUlBWTZBQVFnQUNBRk5nSUFJQUFnQkNrRENEY0FCU0FBUVExcUlBUkJFR29wQXdBM0FBQWdBRUVVYWlBRVFSZHFLQUFBTmdBQUlBUkIwQUJxSkFBTG53SUNCbjhDZmlBQ0lBT25jU0VHSUFOQ0dZaEMvd0NEUW9HQ2hJaVFvTUNBQVg0aERRSkFBMEFnQVNBR2Fpa0FBQ0lNSUEyRklnTkNmNFVnQTBLQmdvU0lrS0RBZ0FGOWcwS0FnWUtFaUpDZ3dJQi9neUVEQTBBZ0ExQkZCRUFnQkNBRGVxZEJBM1lnQm1vZ0FuRWlCeUFGRVFNQURRTWdBMElCZlNBRGd5RUREQUVMQ3lBTVFvQ0Jnb1NJa0tEQWdIK0RJUU1DUUFKL0FrQWdDUTBBSUFOUVJRUkFJQU42cDBFRGRpQUdhaUFDY1NFTERBRUxRUUFNQVFzZ0F5QU1RZ0dHZzBJQVVnMEJRUUVMSVFrZ0JpQUlRUWhxSWdocUlBSnhJUVlNQVFzTFFRRWhDaUFCSUF0cUxBQUFRUUJJQkVBZ0N5RUhEQUVMSUFFcEF3QkNnSUdDaElpUW9NQ0FmNE42cDBFRGRpRUhDeUFBSUFjMkFnUWdBQ0FLTmdJQUM2SUNBUUovSXdCQlFHb2lBaVFBSUFKQkJHb2dBUkJBUVRraEFTQUNLQUlJSVFNQ2Z3SkFBa0FDUUFKQUlBSW9BZ1JCQVdzT0F3RUNBQU1MSUFKQk9Hb2dBa0VjYWlnQ0FEWUNBQ0FDUVRCcUlBSkJGR29wQWdBM0F3QWdBaUFDS1FJTU53TW9RVHNNQXd0Qk9pRUJEQUVMSUFKQk1Hb2dBa0VVYWlrQ0FEY0RBQ0FDUVRocUlBSkJIR29vQWdBMkFnQWdBa0VtYWlBQ1FTTnFMUUFBT2dBQUlBSWdBaWtDRERjREtDQUNJQUl2QUNFN0FTUkJPeUFDTFFBZ0lnRkJPMFlOQVJvTElBQWdBaThCSkRzQUdTQUFRUnRxSUFKQkptb3RBQUE2QUFBZ0FRc2hBU0FBSUFJcEF5ZzNBZ1FnQUNBQk9nQVlJQUFnQXpZQ0FDQUFRUlJxSUFKQk9Hb29BZ0EyQWdBZ0FFRU1haUFDUVRCcUtRTUFOd0lBSUFKQlFHc2tBQXU3QWdFRmZ5TUFRVUJxSWdRa0FDQUNJQU1vQWd3UkJnQWhDQ0FFSUFFb0FnQWdBaUFESUFFb0FnUW9BaFFSQUFBQ1FBSkFBbjhnQkNnQ0FDSUZRUVZIQkVBZ0JDQUVLUUVHTndNd0lBUWdCRUVNYWlrQkFEY0JOaUFFTFFBRklRWWdCQzBBQkNFSElBUW9BaFFNQVFzZ0JDMEFCU0VHSUFRdEFBUWhCeUFFUVJocUlBRW9BZ2dnQWlBRElBRW9BZ3dvQWhRUkFBQWdCQ2dDR0NJRlFRVkdEUUVnQkNBRUtRRWVOd013SUFRZ0JFRWthaWtCQURjQk5pQUVMUUFkSVFZZ0JDMEFIQ0VISUFRb0Fpd0xJUUVnQWlBSUlBTW9BaGdSQVFBTUFRc2dCRUU2YWlBRVFSeHFJZ0pCQ0dvb0FRQTJBUUFnQkNBQ0tRRUFOd0V5UVFVaEJRc2dBQ0FHT2dBRklBQWdCem9BQkNBQUlBVTJBZ0FnQUNBRUtRTXdOd0VHSUFBZ0FUWUNGQ0FBUVF4cUlBUXBBVFkzQVFBZ0JFRkFheVFBQzdFQ0FRVi9Jd0JCUUdvaUJDUUFJQUlnQXlnQ0RCRUdBQ0VHSUFSQkFEWUNEQ0FFUW9DQWdJQVFOd0lFSUFFb0FnQWhCU0FCS0FJRUtBSVVJUWNEUUNBRVFSUnFJZ2dnQlNBQ0lBTWdCeEVBQUNBRUtBSVVRUVZIQkVBZ0NCRE9DQ0FFSUFFb0FnZ2lBVFlDRUNBQUFuOGdBU0FFS0FJTUlnVk5CRUFnQUNBRUtRSUVOd0lFSUFCQkRHb2dCRUVNYWlnQ0FEWUNBRUVGREFFTElBSWdCaUFES0FJWUVRRUFJQVJCQXpZQ0dDQUVRYXpNMGdBMkFoUWdCRUlDTndJZ0lBUkJHallDT0NBRVFSbzJBakFnQkNBRk5nSThJQVFnQkVFc2FqWUNIQ0FFSUFSQlBHbzJBalFnQkNBRVFSQnFOZ0lzSUFCQkNHb2dCRUVVYWhDZUF5QUFJQVkyQWdRZ0JDZ0NCQ0FFS0FJSUVQWUpRUUVMTmdJQUlBUkJRR3NrQUFVZ0JFRUVhaUFFTFFBWUVQWUdEQUVMQ3d1T0FnRURmeU1BUVlBQmF5SUVKQUFnQUNnQ0FDRUFBbjhDUUNBQktBSUlJZ0pCZ0lDQUVIRkZCRUFnQWtHQWdJQWdjUTBCSUFBZ0FSQ0tBZ3dDQ3lBQUx3RUFJUUpCZ1FFaEFBTkFJQUFnQkdwQkFtc2dBa0VQY1NJRFFUQnlJQU5CMXdCcUlBTkJDa2tiT2dBQUlBSWlBMEVFZGlFQ0lBQkJBV3NoQUNBRFFROUxEUUFMSUFGQkFVSGM5c0FBUVFJZ0FDQUVha0VCYTBHQkFTQUFheENEQVF3QkN5QUFMd0VBSVFKQmdRRWhBQU5BSUFBZ0JHcEJBbXNnQWtFUGNTSURRVEJ5SUFOQk4yb2dBMEVLU1JzNkFBQWdBaUlEUVFSMklRSWdBRUVCYXlFQUlBTkJEMHNOQUFzZ0FVRUJRZHoyd0FCQkFpQUFJQVJxUVFGclFZRUJJQUJyRUlNQkN5QUVRWUFCYWlRQUM0NENBZ0ovQVg0akFFR0FBV3NpQXlRQUlBQW9BZ0FoQUFKL0FrQWdBU2dDQ0NJQ1FZQ0FnQkJ4UlFSQUlBSkJnSUNBSUhFTkFTQUFJQUVRNGdjTUFnc2dBQ2tEQUNFRVFZRUJJUUFEUUNBQUlBTnFRUUpySUFTblFROXhJZ0pCTUhJZ0FrSFhBR29nQWtFS1NSczZBQUFnQUVFQmF5RUFJQVJDRDFZZ0JFSUVpQ0VFRFFBTElBRkJBVUhjOXNBQVFRSWdBQ0FEYWtFQmEwR0JBU0FBYXhDREFRd0JDeUFBS1FNQUlRUkJnUUVoQUFOQUlBQWdBMnBCQW1zZ0JLZEJEM0VpQWtFd2NpQUNRVGRxSUFKQkNra2JPZ0FBSUFCQkFXc2hBQ0FFUWc5V0lBUkNCSWdoQkEwQUN5QUJRUUZCM1BiQUFFRUNJQUFnQTJwQkFXdEJnUUVnQUdzUWd3RUxJQU5CZ0FGcUpBQUxzUUlCQlg4akFFRkFhaUlFSkFBZ0FpQURLQUlNRVFZQUlRWWdCRUVBTmdJTUlBUkNnSUNBZ0JBM0FnUWdBU2dDQUNFRklBRW9BZ1FvQWhRaEJ3TkFJQVJCRkdvaUNDQUZJQUlnQXlBSEVRQUFJQVFvQWhSQkJVY0VRQ0FJRU9nSUlBUWdBU2dDQ0NJQk5nSVFJQUFDZnlBQklBUW9BZ3dpQlUwRVFDQUFJQVFwQWdRM0FnUWdBRUVNYWlBRVFReHFLQUlBTmdJQVFRVU1BUXNnQWlBR0lBTW9BaGdSQVFBZ0JFRUROZ0lZSUFSQnJNelNBRFlDRkNBRVFnSTNBaUFnQkVFYU5nSTRJQVJCR2pZQ01DQUVJQVUyQWp3Z0JDQUVRU3hxTmdJY0lBUWdCRUU4YWpZQ05DQUVJQVJCRUdvMkFpd2dBRUVJYWlBRVFSUnFFSjRESUFBZ0JqWUNCQ0FFS0FJRUlBUW9BZ2dROWdsQkFRczJBZ0FnQkVGQWF5UUFCU0FFUVFScUlBUXRBQmdROWdZTUFRc0xDNndDQWdSL0FYNGpBRUZBYWlJRUpBQWdBaUFES0FJTUVRWUFJUVlnQkVFUWFpQUJLQUlBSUFJZ0F5QUJLQUlFS0FJVUVRQUFBa0FDUUFKQUlBUW9BaEFpQlVFRlJ3UkFJQVJCQ0dvZ0JFRWNhaWdDQURZQ0FDQUVJQVFwQWhRM0F3QWdCQ2tDSUNFSURBRUxJQVJCS0dvZ0FTZ0NDQ0FDSUFNZ0FTZ0NEQ2dDRkJFQUFDQUVRUlJxSVFFZ0JDZ0NLQ0lGUVFWR0RRRWdCRUVJYWlBRVFTeHFJZ2RCQ0dvb0FnQTJBZ0FnQkNBSEtRSUFOd01BSUFRcEFqZ2hDQ0FCRUxVR0N5QUNJQVlnQXlnQ0dCRUJBQXdCQ3lBRVFRaHFJQUZCQ0dvb0FnQTJBZ0FnQkNBQktRSUFOd01BSUFRb0Fpd2dCQ2dDTUJEMkNVRUZJUVVMSUFBZ0JUWUNBQ0FBSUFRcEF3QTNBZ1FnQUNBSU53SVFJQUJCREdvZ0JFRUlhaWdDQURZQ0FDQUVRVUJySkFBTHNBSUNBbjhDZmlNQVFkQUFheUlFSkFBZ0JFRU1haUFCSUFJZ0F4Q3ZBaUFFS0FJUUlRTUNmeUFFS0FJTUlnSkZCRUJCT1NFQklBUW9BaFFoQWdKQUFrQUNRQ0FEUVFGckRnSUFBUUlMUVRvaEFRd0JDeUFFUWNnQWFpQUVRU0JxS1FJQU53TUFJQVJCUG1vZ0JFRXZhaTBBQURvQUFDQUVJQVFwQWhnM0EwQWdCQ0FFTHdBdE93RThJQVFvQWlnaEF5QUVMUUFzSVFFTElBQWdCQ2tEUURjQ0JDQUFJQVF2QVR3N0FCa2dBRUVNYWlBRVFjZ0FhaWtEQURjQ0FDQUFRUnRxSUFSQlBtb3RBQUE2QUFCQkZBd0JDeUFFUWNnQWFpQUVRUlJxSWdGQkNHb3BBZ0FpQmpjREFDQUVJQUVwQWdBaUJ6Y0RRQ0FBUVJCcUlBWTNBZ0FnQUNBSE53SUlRVHNoQVVFRUN5RUZJQUFnQWpZQ0FDQUFJQUU2QUJnZ0FDQUZhaUFETmdJQUlBUkIwQUJxSkFBTHF3SUNCSDRJZnlBQktRTVFJQUVwQXhnZ0FoQzlCQ0VFSUFFb0FnUWlDQ0FFcHlJTGNTRUhJQVJDR1loQy93Q0RRb0dDaElpUW9NQ0FBWDRoQmlBQlFSQnFJUXdnQVNnQ0FDSUpRUkJySVEwRFFDQUhJQWxxS1FBQUlnVWdCb1VpQTBKL2hTQURRb0dDaElpUW9NQ0FBWDJEUW9DQmdvU0lrS0RBZ0grRElRTUNRQUpBQWtBRFFDQURVRVVFUUNBTklBTjZwMEVEZGlBSGFpQUljU0lPUVFSMGF5Z0NBQ0FDUmcwQ0lBTkNBWDBnQTRNaEF3d0JDd3NnQlNBRlFnR0dnMEtBZ1lLRWlKQ2d3SUIvZzFBTkFpQUJRUUVnREJDc0NDQUFJQUkyQWdnZ0FDQUVRaUNJUGdJRUlBQWdDellDQUF3QkN5QUFJQUUyQWdRZ0FDQUpRUUFnRG10QkJIUnFOZ0lBUVFBaEFRc2dBQ0FCTmdJTUR3c2dCeUFLUVFocUlncHFJQWh4SVFjTUFBc0FDNndDQWdSL0FYNGpBRUZBYWlJRUpBQWdBaUFES0FJTUVRWUFJUVlnQkVFUWFpQUJLQUlBSUFJZ0F5QUJLQUlFS0FJVUVRQUFBa0FDUUFKQUlBUW9BaEFpQlVFRlJ3UkFJQVJCQ0dvZ0JFRWNhaWdDQURZQ0FDQUVJQVFwQWhRM0F3QWdCQ2tDSUNFSURBRUxJQVJCS0dvZ0FTZ0NDQ0FDSUFNZ0FTZ0NEQ2dDRkJFQUFDQUVRUlJxSVFFZ0JDZ0NLQ0lGUVFWR0RRRWdCRUVJYWlBRVFTeHFJZ2RCQ0dvb0FnQTJBZ0FnQkNBSEtRSUFOd01BSUFRcEFqZ2hDQ0FCRUxzR0N5QUNJQVlnQXlnQ0dCRUJBQXdCQ3lBRVFRaHFJQUZCQ0dvb0FnQTJBZ0FnQkNBQktRSUFOd01BSUFRb0Fpd2dCQ2dDTUJEMkNVRUZJUVVMSUFBZ0JUWUNBQ0FBSUFRcEF3QTNBZ1FnQUNBSU53SVFJQUJCREdvZ0JFRUlhaWdDQURZQ0FDQUVRVUJySkFBTGl3SUJBWDhqQUVFUWF5SUNKQUFnQUNnQ0FDRUFBbjhnQVMwQUMwRVljVVVFUUNBQktBSUFJQUFnQVNnQ0JDZ0NFQkVEQUF3QkN5QUNRUUEyQWd3Z0FTQUNRUXhxQW44Q1FDQUFRWUFCVHdSQUlBQkJnQkJKRFFFZ0FFR0FnQVJQQkVBZ0FpQUFRVDl4UVlBQmNqb0FEeUFDSUFCQkVuWkI4QUZ5T2dBTUlBSWdBRUVHZGtFL2NVR0FBWEk2QUE0Z0FpQUFRUXgyUVQ5eFFZQUJjam9BRFVFRURBTUxJQUlnQUVFL2NVR0FBWEk2QUE0Z0FpQUFRUXgyUWVBQmNqb0FEQ0FDSUFCQkJuWkJQM0ZCZ0FGeU9nQU5RUU1NQWdzZ0FpQUFPZ0FNUVFFTUFRc2dBaUFBUVQ5eFFZQUJjam9BRFNBQ0lBQkJCblpCd0FGeU9nQU1RUUlMRUVjTElBSkJFR29rQUF1eEFnSUZmd0YrSXdCQlFHb2lCQ1FBUVlBQklRY0NRQUpBQTBBZ0JFRUVhaUlHSUFNUXhBUWdCQ2dDQkVHZmdJQ0FlRWNFUUNBR0VNc0lJQUFnQXpZQ0VDQUFJQWszQWdnZ0FDQUZOZ0lFSUFCQm40Q0FnSGcyQWdBTUF3c2dBU0FDSUFRb0FnZ2lCU0FFTHdFTUlnWVE5UUloQXlBRUlBWTdBVFFnQkNBRk5nSXdJQVJCa29DQWdIZzJBaXdnQkVFWWFpQURJQVJCTEdvUXh3VWdCQ2dDSENFRElBUW9BaGdpQ0VHZmdJQ0FlRWNFUUNBQUlBUXBBaUEzQWdnZ0FFRVFhaUFFUVNocUtBSUFOZ0lBSUFBZ0F6WUNCQ0FBSUFnMkFnQU1BZ3NnQndSQUlBV3RJQWxDZ0lDQWdJQ0FRSU9FSUFhdFF2Ly9BNE5DSUlhRUlRa2dCMEVCYXlFSElBUkJCR29ReXdoQkFTRUZEQUVMQ3lBQVFaYUFnSUI0TmdJQUN5QUVRUVJxRU1zSUN5QUVRVUJySkFBTG1RSUNBMzhDZmlNQVFVQnFJZ0lrQUNBQ1FRaHFJQUVRYmlBQ0tBSU1JUUVDUUFKQUFrQUNRQ0FDS0FJSUlnTU9CQUVBQUFJQUN5QUNRVGhxSUFKQklHb29BZ0EyQWdBZ0FrRXdhaUFDUVJocUtRSUFOd01BSUFJZ0Fpa0NFRGNES0NBQ0tBSWtJUVFMSUFBZ0Fpa0RLRGNDQ0NBQUlBUTJBaHdnQUNBQk5nSUVJQUFnQXpZQ0FDQUFRUmhxSUFKQk9Hb29BZ0EyQWdBZ0FFRVFhaUFDUVRCcUtRTUFOd0lBREFFTElBSkJPR29nQWtFZ2FpZ0NBQ0lETmdJQUlBSkJNR29nQWtFWWFpa0NBQ0lGTndNQUlBSWdBaWtDRUNJR053TW9JQUlvQWlRaEJDQUFRUmhxSUFNMkFnQWdBRUVRYWlBRk53SUFJQUFnQmpjQ0NDQUFJQVEyQWh3Z0FDQUJOZ0lFSUFCQkF6WUNBQXNnQWtGQWF5UUFDNG9DQVFKL0l3QkI4QUZySWdFa0FDQUJRUWhxSUFOQkNXcEJ2S2JKQUJDZkJTQUJRUUEyQWh3Z0FTQUJLUU1JTndJVUlBRkJGR29pQmlBQ0lBTVFsd2tnQVNBRU5nS1FBU0FHSUFGQmtBRnFJZ2NnQjBFRGNoRElCaUFCSUFVN0FaQUJJQVlnQnlBQlFaSUJhaERJQmlBR1FjeW15UUJCMEtiSkFCRElCaUFCS0FJVUlBRW9BaGdoQWlBQktBSWNJUVVnQVVISUFHcEJBRUhCQVB3TEFDQUJRVGhxUWRpd3lRQXBBd0EzQXdBZ0FVSUFOd05BSUFGQjBMREpBQ2tEQURjRE1DQUJRVEJxSWdZZ0FpQUZFTFlDSUFjZ0JrSGdBUHdLQUFBZ0FVRWdhaUlGSUFjUXR3RWdBaENwQ1NBQUlBVkJFQ0FEUVFWcUlnQWdBRUVRVHhzUW9BVWdBVUh3QVdva0FBdTJBZ0VGZnlNQVFUQnJJZ01rQUNBQVFSaHFJUVVDUUFKQUFrQkJ3QUFnQUMwQVdDSUVheUlHSUFKTkJFQWdCQTBCREFJTElBTkJDR29nQkNBRlFjQUFRWkN3eVFBUW53Y2dBeUFDSUFNb0FnZ2dBeWdDREVHZ3NNa0FFTThISUFNb0FnQWdBeWdDQkNBQklBSkJzTERKQUJDc0J5QUNJQVJxSVFRTUFnc2dBMEVnYWlBQklBSWdCaERRQkNBREtBSXNJUUlnQXlnQ0tDRUJJQU1vQWlRaEJpQURLQUlnSVFjZ0EwRVlhaUFFSUFWQndBQkIwSy9KQUJDZkJ5QURLQUlZSUFNb0Fod2dCeUFHUWVDdnlRQVFyQWNnQUNBRlFRRVFwUWdMSUFKQlAzRWhCQ0FDUWNBQVR3UkFJQUFnQVNBQ1FRWjJFS1VJQ3lBRFFSQnFJQVFnQlVIQUFFSHdyOGtBRU04SElBTW9BaEFnQXlnQ0ZDQUJJQUpCUUhGcUlBUkJnTERKQUJDc0J3c2dBQ0FFT2dCWUlBTkJNR29rQUF1MkFnRUZmeU1BUVRCcklnTWtBQ0FBUVNocUlRVUNRQUpBQWtCQndBQWdBQzBBYUNJRWF5SUdJQUpOQkVBZ0JBMEJEQUlMSUFOQkNHb2dCQ0FGUWNBQVFaQ3d5UUFRbndjZ0F5QUNJQU1vQWdnZ0F5Z0NERUdnc01rQUVNOEhJQU1vQWdBZ0F5Z0NCQ0FCSUFKQnNMREpBQkNzQnlBQ0lBUnFJUVFNQWdzZ0EwRWdhaUFCSUFJZ0JoRFFCQ0FES0FJc0lRSWdBeWdDS0NFQklBTW9BaVFoQmlBREtBSWdJUWNnQTBFWWFpQUVJQVZCd0FCQjBLL0pBQkNmQnlBREtBSVlJQU1vQWh3Z0J5QUdRZUN2eVFBUXJBY2dBQ0FGUVFFUXBnZ0xJQUpCUDNFaEJDQUNRY0FBVHdSQUlBQWdBU0FDUVFaMkVLWUlDeUFEUVJCcUlBUWdCVUhBQUVId3I4a0FFTThISUFNb0FoQWdBeWdDRkNBQklBSkJRSEZxSUFSQmdMREpBQkNzQndzZ0FDQUVPZ0JvSUFOQk1Hb2tBQXVTQWdFRmZ5TUFRUkJySWdNa0FBSkFBa0FDUUFKQUlBRW9BZ1FpQlFSQUlBRW9BZ0FpQmtFRWFpRUVBMEFnQkNnQ0FDQUNhaUVDSUFSQkNHb2hCQ0FGUVFGcklnVU5BQXNnQVNnQ0RFVU5BaUFDUVE5TERRRWdCaWdDQkEwQkRBTUxJQUVvQWd4RkRRSUxJQUpCQUNBQ1FRQktHMEVCZENFQ0N3SkFJQUpCQUU0RVFDQUNSUTBDUVlEZzJnQXRBQUFhSUFJUUZpSUVSUTBCREFNTFFkQ2l3QUFRNlFZTEFBdEJBU0VFUVFBaEFnc2dBMEVBTmdJSUlBTWdCRFlDQkNBRElBSTJBZ0FnQTBIc29jQUFJQUVRaFFGRkJFQWdBQ0FES1FJQU53SUFJQUJCQ0dvZ0EwRUlhaWdDQURZQ0FDQURRUkJxSkFBUEMwSHdvc0FBUWRZQUlBTkJEMnBCNEtMQUFFSGdvOEFBRUl3RUFBdUZBZ0lCZmdKL0l3QkJnQUZySWdRa0FDQUFLQUlBS1FNQUlRSUNmd0pBSUFFb0FnZ2lBRUdBZ0lBUWNVVUVRQ0FBUVlDQWdDQnhEUUVnQWtFQklBRVF2Z0VNQWd0QmdRRWhBQU5BSUFBZ0JHcEJBbXNnQXFkQkQzRWlBMEV3Y2lBRFFkY0FhaUFEUVFwSkd6b0FBQ0FBUVFGcklRQWdBa0lQVmlBQ1FnU0lJUUlOQUFzZ0FVRUJRZHoyd0FCQkFpQUFJQVJxUVFGclFZRUJJQUJyRUlNQkRBRUxRWUVCSVFBRFFDQUFJQVJxUVFKcklBS25RUTl4SWdOQk1ISWdBMEUzYWlBRFFRcEpHem9BQUNBQVFRRnJJUUFnQWtJUFZpQUNRZ1NJSVFJTkFBc2dBVUVCUWR6MndBQkJBaUFBSUFScVFRRnJRWUVCSUFCckVJTUJDeUFFUVlBQmFpUUFDNnNDQVFSL0l3QkIwQUJySWdRa0FDQUNJQU1vQWd3UkJnQWhCeUFFUVNCcUlBRW9BZ0FnQWlBRElBRW9BZ1FvQWhRUkFBQUNRQUpBQW44Z0JDZ0NJQ0lGUVFWSEJFQWdCRUVRYWlBRVFTMXFLUUFBTndNQUlBUkJGMm9nQkVFMGFpZ0FBRFlBQUNBRUlBUXBBQ1UzQXdnZ0JDMEFKQXdCQ3lBRUxRQWtJUVlnQkVFNGFpQUJLQUlJSUFJZ0F5QUJLQUlNS0FJVUVRQUFJQVFvQWpnaUJVRUZSZzBCSUFSQkVHb2dCRUhGQUdvcEFBQTNBd0FnQkVFWGFpQUVRY3dBYWlnQUFEWUFBQ0FFSUFRcEFEMDNBd2dnQkMwQVBBc2hCaUFDSUFjZ0F5Z0NHQkVCQUF3QkMwRUZJUVVMSUFBZ0Jqb0FCQ0FBSUFVMkFnQWdBQ0FFS1FNSU53QUZJQUJCRFdvZ0JFRVFhaWtEQURjQUFDQUFRUlJxSUFSQkYyb29BQUEyQUFBZ0JFSFFBR29rQUF1ckFnRUNmd0pBSUFKQndBQkdEUUFDUUFKQUFrQUNRQUpBQWtBZ0FVSC9BWEVpQkVFS1R3UkFBa0FDUUFKQUFrQWdCRUVMYXc0RUFRSUxBd0FMSUFKQndBQlBEUVFnQWlBRGFrRXVPZ0FBREFrTElBSkJ3QUJKRFFjZ0FrSEFBRUdRd3NBQUVNWUVBQXNnQWtFQmFpSUVRY0FBUncwRkRBZ0xJQUpCd0FCSkRRTWdBa0hBQUVHd3dzQUFFTVlFQUFzZ0FrSEFBRWtOQVNBQ1FjQUFRY0RDd0FBUXhnUUFDeUFDUWNBQVFZREN3QUFReGdRQUN5QUNJQU5xSUFGQk1ISTZBQUFNQXdzZ0FpQURha0V0T2dBQURBSUxJQUpCd0FCSkJFQWdBeUFFYWtFdE9nQUFJQUlnQTJwQnhRQTZBQUFnQkNFQ0RBSUxJQUpCd0FCQm9NTEFBQkRHQkFBTElBSWdBMnBCeFFBNkFBQUxRUUVoQlNBQ1FRRnFJUUVMSUFBZ0FUWUNCQ0FBSUFVMkFnQUxnd0lCQTM4akFFR0FBV3NpQkNRQUFuOENRQ0FCS0FJSUlnSkJnSUNBRUhGRkJFQWdBa0dBZ0lBZ2NRMEJJQUFnQVJEQUJ3d0NDeUFBS0FJQUlRQkJnUUVoQWdOQUlBSWdCR3BCQW1zZ0FFRVBjU0lEUVRCeUlBTkIxd0JxSUFOQkNra2JPZ0FBSUFKQkFXc2hBaUFBUVE5TElBQkJCSFloQUEwQUN5QUJRUUZCM1BiQUFFRUNJQUlnQkdwQkFXdEJnUUVnQW1zUWd3RU1BUXNnQUNnQ0FDRUFRWUVCSVFJRFFDQUNJQVJxUVFKcklBQkJEM0VpQTBFd2NpQURRVGRxSUFOQkNra2JPZ0FBSUFKQkFXc2hBaUFBUVE5TElBQkJCSFloQUEwQUN5QUJRUUZCM1BiQUFFRUNJQUlnQkdwQkFXdEJnUUVnQW1zUWd3RUxJQVJCZ0FGcUpBQUxod0lCQkg4akFFSGdBR3NpQWlRQUlBSkJHR3BCbEozSkFFRUVJQUVRM3dFZ0FBSi9JQUlvQWhoRkJFQWdBa0VJYWlJQklBSkJMR29wQWdBM0F3QWdBa0VRYWlJRElBSkJOR29wQWdBM0F3QWdBaUFDS1FJa053TUFJQUlvQWlBaEJDQUNLQUljSWdVRVFDQUNRZGdBYWlBREtRTUFOd01BSUFKQjBBQnFJQUVwQXdBM0F3QWdBaUFDS1FNQU53TklDeUFBSUFJcEEwZzNBaVFnQUNBRU5nSWdJQUFnQlRZQ0hDQUFRVFJxSUFKQjJBQnFLUU1BTndJQUlBQkJMR29nQWtIUUFHb3BBd0EzQWdCQkRBd0JDeUFBSUFJcEFoZzNBZ0FnQUVFUWFpQUNRU2hxS1FJQU53SUFJQUJCQ0dvZ0FrRWdhaWtDQURjQ0FFRUNDellDR0NBQ1FlQUFhaVFBQzRRQ0FRUi9JQUFvQWdnaEF5QUFBbjlCQVNBQlFZQUJTU0lFRFFBYVFRSWdBVUdBRUVrTkFCcEJBMEVFSUFGQmdJQUVTUnNMSWdVUXhRY2dBQ2dDQkNBQUtBSUlhaUVDQWtBQ1FDQUVSUVJBSUFGQmdCQkpEUUVnQVVHQWdBUlBCRUFnQWlBQlFUOXhRWUFCY2pvQUF5QUNJQUZCRW5aQjhBRnlPZ0FBSUFJZ0FVRUdka0UvY1VHQUFYSTZBQUlnQWlBQlFReDJRVDl4UVlBQmNqb0FBUXdEQ3lBQ0lBRkJQM0ZCZ0FGeU9nQUNJQUlnQVVFTWRrSGdBWEk2QUFBZ0FpQUJRUVoyUVQ5eFFZQUJjam9BQVF3Q0N5QUNJQUU2QUFBTUFRc2dBaUFCUVQ5eFFZQUJjam9BQVNBQ0lBRkJCblpCd0FGeU9nQUFDeUFBSUFNZ0JXbzJBZ2hCQUF1a0FnSUVmd0YrSXdCQlFHb2lCQ1FBSUFJZ0F5Z0NEQkVHQUNFR0lBUkJFR29nQVNnQ0FDQUNJQU1nQVNnQ0JDZ0NGQkVBQUFKQUFrQUNRQ0FFS0FJUUlnVkJCVWNFUUNBRVFRaHFJQVJCSEdvb0FnQTJBZ0FnQkNBRUtRSVVOd01BSUFRcEFpQWhDQXdCQ3lBRVFTaHFJQUVvQWdnZ0FpQURJQUVvQWd3b0FoUVJBQUFnQkNnQ0tDSUZRUVZHRFFFZ0JDZ0NHQ0VCSUFRb0FoUWdCRUVJYWlBRVFUUnFLQUlBTmdJQUlBUWdCQ2tDTERjREFDQUVLUUk0SVFnZ0FSRDJDUXNnQWlBR0lBTW9BaGdSQVFBTUFRc2dCRUVJYWlBRVFSUnFJZ0ZCQ0dvb0FnQTJBZ0FnQkNBQktRSUFOd01BUVFVaEJRc2dBQ0FGTmdJQUlBQWdCQ2tEQURjQ0JDQUFJQWczQWhBZ0FFRU1haUFFUVFocUtBSUFOZ0lBSUFSQlFHc2tBQXZvQVFFRGZ5QUFJQU1vQWdnZ0FTZ0NEQ0FCS0FJSUlnVkJHWGNnQlVFT2QzTWdCVUVEZG5OcWFpQUVLQUlFSWdaQkQzY2dCa0VOZDNNZ0JrRUtkbk5xSWdZMkFnd2dBQ0FES0FJRUlBVWdBU2dDQkNJSFFSbDNJQWRCRG5keklBZEJBM1p6YW1vZ0JDZ0NBQ0lGUVE5M0lBVkJEWGR6SUFWQkNuWnphaUlGTmdJSUlBQWdBeWdDQUNBSElBRW9BZ0FpQVVFWmR5QUJRUTUzY3lBQlFRTjJjMnBxSUFaQkQzY2dCa0VOZDNNZ0JrRUtkbk5xTmdJRUlBQWdBU0FFS0FJTWFpQUNRUmwzSUFKQkRuZHpJQUpCQTNaemFpQUZRUTkzSUFWQkRYZHpJQVZCQ25aemFqWUNBQXVzQ1FJamZ3SitJd0JCUUdvaUJDUUFJQVJCQ0dvaEF5TUFRZEFBYXlJQ0pBQWdBa0U0YWlFaUlBRW9BaFFoRGlBQktBSVFJUThnQVNnQ0RDRVFJQUVvQWdnaEVTQUJLQUlFSVFZZ0FTZ0NBQ0VLSUFKQnd3QnFJU01DUUFOQUlBSWdEallDSENBQ0lBODJBaGdnQWlBUU5nSVVJQUlnRVRZQ0VDQUNJQVkyQWd3Z0FpQUtOZ0lJUVFBaEJRSkFBa0FDUUFKQUFuOENmd0pBQWtBQ1FBTkFJQVVnQmtjRVFDQUZJQXBxTFFBQUVONEpSUTBDSUFWQkFXb2hCUXdCQ3dzZ0JrVUVRRUVBSVFnTUFnc2dBa0VnYWlBQ1FRaHFJZ0VnQmhEUUJpQWlJQUVnQmhEUkJpQUNMd0JCSUNNdEFBQkJFSFJ5REFNTElBWWhDQ0FGRFFFTFFTUWhDMEVCSVFrZ0VTRUhJQkFoQVNBUElRd2dEaUVOSUFvTUFnc2dBa0VnYWlBQ1FRaHFJZ0VnQlJEUUJpQWlJQUVnQlJEUkJpQUNMd0JCSUNNdEFBQkJFSFJ5Q3lFVklBSXRBRUFoQ3lBQ0tBSThJUTBnQWlnQ09DRU1JQUlvQWpRaEFTQUNLQUl3SVFjZ0FpZ0NMQ0VJSUFJb0FpZ2hFaUFDS0FJa0lRVWdBaWdDSUNJVERRTWdCVVVOQVNBRklRa2dFZ3NoRXlBTFFmOEJjU0FWUVFoMGNpRVVJQWxCQVVZRVFDQUNJQTQyQWh3Z0FpQVBOZ0lZSUFJZ0VEWUNGQ0FDSUJFMkFoQWdBaUFHTmdJTUlBSWdDallDQ0NBQ1FTQnFJQUpCQ0dvUVFDQUNLQUlrSVJNQ1FBSkFBa0FnQWlnQ0lDSUpEZ1FBQWdJQkFndEJBQ0VKSUJnaENDQVpJUTBnR2lFTUlCc2hBU0FjSVFjTUJBc2dBaWdDS0NJWUlRVWdBaWdDT0NJWklRc2dBaWdDTkNJYUlSWWdBaWdDTUNJYklSY2dBaWdDTENJY0lSSU1CUXNnQ1VFQlJ3UkFJQUlvQWp3aEZDQUNLQUk0SVEwZ0FpZ0NOQ0VNSUFJb0FqQWhBU0FDS0FJc0lRY2dBaWdDS0NFSURBTUxJQU1nRGpZQ0dDQURJQTgyQWhRZ0F5QVFOZ0lRSUFNZ0VUWUNEQ0FESUFZMkFnZ2dBeUFLTmdJRUlBTkJBellDQUF3R0N5QUlJUVVnRFNFTElBd2hGaUFCSVJjZ0J5RVNJQWxCQTBjTkFRd0RDeUFGSVFrZ0VpRVRJQjBoQ0NBZUlRMGdIeUVNSUNBaEFTQWhJUWNMSUFNZ0ZEWUNIQ0FESUEwMkFoZ2dBeUFNTmdJVUlBTWdBVFlDRUNBRElBYzJBZ3dnQXlBSU5nSUlJQU1nRXpZQ0JDQURJQWsyQWdBTUF3c2dDMEgvQVhFZ0ZVRUlkSEloRkNBQklRc2dCeUVXSUFnaEZ3c2dCU0FHUndSQUlBMGhIaUFNSVI4Z0FTRWdJQWNoSVNBSUlSMGdDeUVPSUJZaER5QVhJUkFnRWlFUklBVWhCaUFUSVFvTUFRc0xJQU5CQ0RvQUhDQURJQTQyQWhnZ0F5QVBOZ0lVSUFNZ0VEWUNFQ0FESUJFMkFnd2dBeUFHTmdJSUlBTWdDallDQkNBRFFRRTJBZ0FMSUFKQjBBQnFKQUFnQkNnQ0RDRUhBa0FDUUFKQUFrQWdCQ2dDQ0NJQkRnUUJBQUFDQUFzZ0JFRTRhaUFFUVNCcUtBSUFOZ0lBSUFSQk1Hb2dCRUVZYWlrQ0FEY0RBQ0FFSUFRcEFoQTNBeWdnQkNnQ0pDRWtDeUFBSUFRcEF5ZzNBZ2dnQUNBa05nSWNJQUFnQnpZQ0JDQUFJQUUyQWdBZ0FFRVlhaUFFUVRocUtBSUFOZ0lBSUFCQkVHb2dCRUV3YWlrREFEY0NBQXdCQ3lBRVFUaHFJQVJCSUdvb0FnQWlBVFlDQUNBRVFUQnFJQVJCR0dvcEFnQWlKVGNEQUNBRUlBUXBBaEFpSmpjREtDQUFRUmhxSUFFMkFnQWdBRUVRYWlBbE53SUFJQUFnSmpjQ0NDQUFJQWMyQWdRZ0FFRUROZ0lBQ3lBRVFVQnJKQUFMcGdVQ0NIOERmaU1BUVVCcUlnTWtBQ0FEUVFocUlRUWpBRUhnQUdzaUFpUUFJQUVvQWdRaEJpQUJLQUlBSVFjQ1FBSkFBMEFnQlNBR1JnMEJRZWFmeVFCQkJDQUZJQWRxTFFBQUVLd0dCRUFnQlVFQmFpRUZEQUVMQ3lBQ1FUQnFJQUVnQlJEUUJpQUNRY2dBYWlBQklBVVEwUVlNQVFzZ0FrRXdhaUFCSUFZUTBBWWdBa0hJQUdvZ0FTQUdFTkVHQ3lBQ1FRaHFJZ2NnQWtIRUFHb3BBZ0EzQXdBZ0FrRVFhaUlJSUFKQnpBQnFLUUlBTndNQUlBSWdBaWtDUERjREFDQUNLQUk0SVFVZ0FpZ0NOQ0VCQWtBZ0FpZ0NNQ0lHUlFSQUlBRUVRQ0FDUVNocUlBZ3BBd0EzQXdBZ0FrRWdhaUFIS1FNQU53TUFJQUlnQWlrREFEY0RHQXNnQWtFNGFpQUNRU0JxS1FNQUlnbzNBd0FnQWtGQWF5QUNRU2hxS1FNQUlnczNBd0FnQWlBQ0tRTVlJZ3czQXpBZ0JDQUZOZ0lFSUFRZ0FUWUNBQ0FFSUF3M0FnZ2dCRUVRYWlBS053SUFJQVJCR0dvZ0N6Y0NBQXdCQ3lBQ1FUaHFJQUpCQ0dvb0FnQWlCellDQUNBQ0lBSXBBd0FpQ2pjRE1DQUVJQVUyQWd3Z0JDQUJOZ0lJSUFRZ0JqWUNCQ0FFSUFvM0FoQWdCRUVZYWlBSE5nSUFJQVJCQXpZQ0FBc2dBa0hnQUdva0FDQURLQUlNSVFFQ1FBSkFBa0FDUUNBREtBSUlJZ0lPQkFFQUFBSUFDeUFEUVRocUlBTkJJR29vQWdBMkFnQWdBMEV3YWlBRFFSaHFLUUlBTndNQUlBTWdBeWtDRURjREtDQURLQUlrSVFrTElBQWdBeWtES0RjQ0NDQUFJQWsyQWh3Z0FDQUJOZ0lFSUFBZ0FqWUNBQ0FBUVJocUlBTkJPR29vQWdBMkFnQWdBRUVRYWlBRFFUQnFLUU1BTndJQURBRUxJQU5CT0dvZ0EwRWdhaWdDQUNJQ05nSUFJQU5CTUdvZ0EwRVlhaWtDQUNJS053TUFJQU1nQXlrQ0VDSUxOd01vSUFCQkdHb2dBallDQUNBQVFSQnFJQW8zQWdBZ0FDQUxOd0lJSUFBZ0FUWUNCQ0FBUVFNMkFnQUxJQU5CUUdza0FBdUlBZ0VKZnlBQUlBQW9BZ3dpQXlBQUtBSUFJZ1JKUVF4c2FpSUZJQUJCSkVFWUlBQW9BaVFnQUNnQ0dFa2lCaHRxSWdJZ0FDQURJQVJQUVF4c2FpSURJQUJCR0VFa0lBWWJhaUlBS0FJQUlBTW9BZ0JKSWdRYklBSW9BZ0FnQlNnQ0FFa2lCaHNpQnlnQ0FDRUpJQUFnQXlBQ0lBWWJJQVFiSWdnb0FnQWhDaUFCUVFocUlBSWdCU0FHR3lJQ1FRaHFLQUlBTmdJQUlBRWdBaWtDQURjQ0FDQUJJQWdnQnlBSklBcExJZ0liSWdVcEFnQTNBZ3dnQVVFVWFpQUZRUWhxS0FJQU5nSUFJQUZCSUdvZ0J5QUlJQUliSWdKQkNHb29BZ0EyQWdBZ0FTQUNLUUlBTndJWUlBRkJMR29nQXlBQUlBUWJJZ0JCQ0dvb0FnQTJBZ0FnQVNBQUtRSUFOd0lrQzQ0Q0FnTitCbjhDUUNBQUtBSU1SUTBBSUFBcEF4QWdBQ2tER0NBQktBSUFJZ2dRdlFRaEFpQUFLQUlFSWdVZ0FxZHhJUUVnQWtJWmlFTC9BSU5DZ1lLRWlKQ2d3SUFCZmlFRUlBQW9BZ0FpQUVFUWF5RUpBMEFnQUNBQmFpa0FBQ0lESUFTRklnSkNmNFVnQWtLQmdvU0lrS0RBZ0FGOWcwS0FnWUtFaUpDZ3dJQi9neUVDQWtBQ1FBTkFJQUpRSWdkRkJFQWdDQ0FKSUFKNnAwRURkaUFCYWlBRmNTSUtRUVIwYXlnQ0FFWU5BaUFDUWdGOUlBS0RJUUlNQVFzTElBTWdBMElCaG9OQ2dJR0NoSWlRb01DQWY0TlFEUUVMUVFCQkFDQUFJQXBCQkhScklBY2JRUkJySUFjYklRVU1BZ3NnQVNBR1FRaHFJZ1pxSUFWeElRRU1BQXNBQ3lBRlFRaHFRUUFnQlJzTGpnSUNBMzRHZndKQUlBQW9BZ3hGRFFBZ0FDa0RFQ0FBS1FNWUlBRW9BZ0FpQ0JDOUJDRUNJQUFvQWdRaUJTQUNwM0VoQVNBQ1FobUlRdjhBZzBLQmdvU0lrS0RBZ0FGK0lRUWdBQ2dDQUNJQVFSQnJJUWtEUUNBQUlBRnFLUUFBSWdNZ0JJVWlBa0ovaFNBQ1FvR0NoSWlRb01DQUFYMkRRb0NCZ29TSWtLREFnSCtESVFJQ1FBSkFBMEFnQWxBaUIwVUVRQ0FJSUFrZ0FucW5RUU4ySUFGcUlBVnhJZ3BCQkhScktBSUFSZzBDSUFKQ0FYMGdBb01oQWd3QkN3c2dBeUFEUWdHR2cwS0FnWUtFaUpDZ3dJQi9nMUFOQVF0QkFFRUFJQUFnQ2tFRWRHc2dCeHRCRUdzZ0J4c2hCUXdDQ3lBQklBWkJDR29pQm1vZ0JYRWhBUXdBQ3dBTElBVkJCR3BCQUNBRkd3dXRBZ0VEZnlNQVFTQnJJZ2NrQUNBQlFRazZBQmdDUUFKQUFrQUNRQUpBQWtBZ0JnNENBQUVDQ3lBSFFlLzNBanNBRWtFQ0lRa2dCMEVVYWlBQklBZEJFbXBCQWlBRUlBVkJBQkFLSUFjb0Fod2hCZ0pBQWtBQ1FDQUhMUUFZUVFGckRnSUJBZ0FMSUFkQkNHb2dCaUFFSUFWQnJPYkJBQkNmQnlBSFFSUnFJQUVnQWlBRElBY29BZ2dnQnlnQ0RCRFBCQ0FIS0FJY0lBWnFJUVlnQnlnQ0ZDRUlJQWN2QUJraEJTQUhMUUFZSVFrTUJRdEJ2T2JCQUVFblFhem13UUFRbkFZQUN5QUhMd0FaSVFVZ0J5Z0NGRUVCUmcwQ0RBTUxJQUFnQVNBQ0lBTWdCQ0FGUVFCQjd3RVE2UUlNQXdzZ0FDQUJJQUlnQXlBRUlBVVF6d1FNQWdzZ0FVRUlPZ0FZQ3lBQUlBVTdBQVVnQUNBSk9nQUVJQUFnQmpZQ0NDQUFJQWcyQWdBTElBZEJJR29rQUF2dEFRRUVmeU1BUWRBQWF5RUZBa0FDUUNBQktBSUFJZ01nQVVIUUFHc29BZ0FpQWtZRVFDQUJMd0VFSWdJZ0FVSE1BR3N2QVFCSkRRRU1BZ3NnQWlBRFRRMEJJQUV2QVFRaEFnc2dCVUVHYWlBQlFRWnFRY29BL0FvQUFDQUJRYUFCYXlFQkFuOERRQ0FCUWFBQmFpQUJRZEFBYWlJRVFkQUEvQW9BQUFKQUFrQUNRQ0FBSUFSSEJFQWdBeUFCS0FJQUlnUkhEUUVnQWlBQlFRUnFMd0VBU1EwQ0N5QUJRZEFBYWd3RUN5QURJQVJQRFFFTElBRkIwQUJySVFFTUFRc0xJQUZCMEFCcUN5RUFJQUZCMEFCcUlBTTJBZ0FnQUNBQ093RUVJQUJCQm1vZ0JVRUdha0hLQVB3S0FBQUxDNXdDQVFOL0l3QkJNR3NpQkNRQUlBUkJBRFlDRUNBRUlBTW9BZ1FpQlRZQ0dDQUVJQU1vQWdBaUJqWUNBQ0FFSUFFMkFnZ2dCQ0FCSUFKcU5nSU1JQVFnQlNBR2FqWUNCQ0FFSUFJZ0JTQUNJQVZKR3pZQ0ZBSkFBa0FDUUFKQVFRSWdBaUFGU3lBRUVQWUVRUUZ4RzBFQmF3NENBUUlBQ3lBRUlBTWdBaERRQmlBRVFSaHFJQU1nQWhDMkJ5QUFJQVJCTVB3S0FBQU1BZ3NnQUVFQU9nQWdJQUJDZ0lDQWdCQTNBZ0FnQUNBREtRSUFOd0lJSUFCQkdHb2dBMEVRYWlrQ0FEY0NBQ0FBUVJCcUlBTkJDR29wQWdBM0FnQU1BUXNnQUVFQU9nQWdJQUJDZ0lDQWdCQTNBZ0FnQUNBREtRSUFOd0lJSUFCQkdHb2dBMEVRYWlrQ0FEY0NBQ0FBUVJCcUlBTkJDR29wQWdBM0FnQUxJQVJCTUdva0FBdWFBZ0lEZndGK0l3QkJRR29pQkNRQUlBSWdBeWdDREJFR0FDRUdJQVJCRUdvZ0FTZ0NBQ0FDSUFNZ0FTZ0NCQ2dDRkJFQUFBSkFBa0FDUUNBRUtBSVFJZ1ZCQlVjRVFDQUVRUWhxSUFSQkhHb29BZ0EyQWdBZ0JDQUVLUUlVTndNQUlBUXBBaUFoQnd3QkN5QUVRU2hxSUFFb0FnZ2dBaUFESUFFb0Fnd29BaFFSQUFBZ0JFRVVhaUVCSUFRb0FpZ2lCVUVGUmcwQklBUkJDR29nQkVFMGFpZ0NBRFlDQUNBRUlBUXBBaXczQXdBZ0JDa0NPQ0VISUFFUTlnZ0xJQUlnQmlBREtBSVlFUUVBREFFTElBUkJDR29nQVVFSWFpZ0NBRFlDQUNBRUlBRXBBZ0EzQXdCQkJTRUZDeUFBSUFVMkFnQWdBQ0FFS1FNQU53SUVJQUFnQnpjQ0VDQUFRUXhxSUFSQkNHb29BZ0EyQWdBZ0JFRkFheVFBQzRvQ0FRRi9Jd0JCRUdzaUFpUUFBbjhDUUFKQUFrQUNRQUpBSUFBb0FnQW9BZ0FpQUNnQ0FFRUJhdzRFQVFJREJBQUxJQUVvQWdCQi9OUFNBRUVLSUFFb0FnUW9BZ3dSQWdBTUJBc2dBaUFBUVFScU5nSU1JQUZCaHRUU0FFRUlRWTdVMGdCQkJ5QUFRUWhxUVNOQmxkVFNBRUVJSUFKQkRHcEJKQkNTQXd3REN5QUNJQUJCQkdvMkFnd2dBVUdkMU5JQVFRcEJqdFRTQUVFSElBQkJDR3BCSTBHVjFOSUFRUWdnQWtFTWFrRWtFSklEREFJTElBSWdBRUVJYWpZQ0RDQUJRYWZVMGdBZ0FFRU1haUFBUVFScUlBSkJER3BCSlJDSEF3d0JDeUFDSUFCQkNHbzJBZ3dnQVVHeTFOSUFJQUJCREdvZ0FFRUVhaUFDUVF4cVFTWVFod01MSUFKQkVHb2tBQXVRQWdFTGZ5TUFRZUFBYXlJQ0pBQVE3d2NpQmlBQktBSUFJZ012QWZZR0lnY2dBU2dDQ0NJRVFYOXphaUlJT3dIMkJpQURJQVJCQTNScUlnVW9BZ0FoQ1NBRkx3RUVJUW9nQXlBRVFjZ0FiR29oQlVFQVJRUkFJQUpCR0dvZ0JVSFlBR3BCeUFEOENnQUFDeUFDUVJCcUlBZ2dCaERDQnlBRElBUkJBV29pREVFRGRHb2dCeUFNYXlJSElBSW9BaEFnQWlnQ0ZCRHpCaUFDUVFocUlBZ2dCa0hZQUdvUXdRY2dCVUdnQVdvZ0J5QUNLQUlJSUFJb0Fnd1E5d1lnQUNBS093RUVJQUFnQ1RZQ0FDQURJQVE3QWZZR0lBdEZCRUFnQUVFSWFpQUNRUmhxUWNnQS9Bb0FBQXNnQUVFQU5nSmNJQUFnQmpZQ1dDQUFJQU0yQWxBZ0FDQUJLQUlFTmdKVUlBSkI0QUJxSkFBTDhRRUJBMzhqQUVIZ0FHc2lBaVFBSUFJZ0FSQ0hCU0FDUVJCcUlnTWdBUkNIQlNBQ1FUaHFRZ0EzQXdBZ0FrRXdha0lBTndNQUlBSkJLR3BDQURjREFDQUNRZ0EzQXlBZ0FrRWdhaUlFSUFNUWh3VWdBa0ZBYXlBQUlBUVF4UUVnQWtFWWFpQUNRY2dBYWlrQUFEY0RBQ0FDSUFJcEFFQTNBeEFnQUVIZ0Eyb2hBMEVBSVFBRFFDQUFRUkJHUlFSQUlBSkJFR29nQUdvaUJDQUVMUUFBSUFBZ0Eyb3RBQUJ6T2dBQUlBQkJBV29oQUF3QkN3c2dBU0FDS1FNUU53QUFJQU1nQWlrQUFEY0FBQ0FCUVFocUlBSkJHR29wQXdBM0FBQWdBMEVJYWlBQ1FRaHFLUUFBTndBQUlBSkI0QUJxSkFBTG1nSUNBMzhCZmlNQVFVQnFJZ1FrQUNBQ0lBTW9BZ3dSQmdBaEJpQUVRUkJxSUFFb0FnQWdBaUFESUFFb0FnUW9BaFFSQUFBQ1FBSkFBa0FnQkNnQ0VDSUZRUVZIQkVBZ0JFRUlhaUFFUVJ4cUtBSUFOZ0lBSUFRZ0JDa0NGRGNEQUNBRUtRSWdJUWNNQVFzZ0JFRW9haUFCS0FJSUlBSWdBeUFCS0FJTUtBSVVFUUFBSUFSQkZHb2hBU0FFS0FJb0lnVkJCVVlOQVNBRVFRaHFJQVJCTkdvb0FnQTJBZ0FnQkNBRUtRSXNOd01BSUFRcEFqZ2hCeUFCRUpBSkN5QUNJQVlnQXlnQ0dCRUJBQXdCQ3lBRVFRaHFJQUZCQ0dvb0FnQTJBZ0FnQkNBQktRSUFOd01BUVFVaEJRc2dBQ0FGTmdJQUlBQWdCQ2tEQURjQ0JDQUFJQWMzQWhBZ0FFRU1haUFFUVFocUtBSUFOZ0lBSUFSQlFHc2tBQXVNQWdFQmZ5TUFRUkJySWdJa0FBSi9Ba0FDUUFKQUFrQUNRQ0FBS0FJQUtBSUFJZ0FvQWdCQkFXc09CQUVDQXdRQUN5QUJLQUlBUWZ6VDBnQkJDaUFCS0FJRUtBSU1FUUlBREFRTElBSWdBRUVFYWpZQ0RDQUJRWWJVMGdCQkNFR08xTklBUVFjZ0FFRUlha0VqUVpYVTBnQkJDQ0FDUVF4cVFTUVFrZ01NQXdzZ0FpQUFRUVJxTmdJTUlBRkJuZFRTQUVFS1FZN1UwZ0JCQnlBQVFRaHFRU05CbGRUU0FFRUlJQUpCREdwQkpCQ1NBd3dDQ3lBQ0lBQkJDR28yQWd3Z0FVR24xTklBSUFCQkRHb2dBRUVFYWlBQ1FReHFRZlVBRUljRERBRUxJQUlnQUVFSWFqWUNEQ0FCUWJMVTBnQWdBRUVNYWlBQVFRUnFJQUpCREdwQjlnQVFod01MSUFKQkVHb2tBQXVhQWdFRWZ5TUFRU0JySWdNa0FDQUFRUmhxSVFVQ1FBSkFBa0JCd0FBZ0FDMEFXQ0lFYXlJR0lBSk5CRUFnQkEwQkRBSUxJQU5CQ0dvZ0JDQUZRY0FBUVpDd3lRQVFud2NnQXlBQ0lBTW9BZ2dnQXlnQ0RFR2dzTWtBRU1NSElBTW9BZ0FnQXlnQ0JDQUJJQUpCc0xESkFCQ3NCeUFDSUFScUlRUU1BZ3NnQTBFWWFpQUVJQVZCd0FCQjBLL0pBQkNmQnlBREtBSVlJQU1vQWh3Z0FTQUdRZUN2eVFBUXJBY2dBQ0FGUVFFUXBRZ2dBaUFHYXlFQ0lBRWdCbW9oQVFzZ0FrRS9jU0VFSUFKQndBQlBCRUFnQUNBQklBSkJCbllRcFFnTElBTkJFR29nQkNBRlFjQUFRZkN2eVFBUXd3Y2dBeWdDRUNBREtBSVVJQUVnQWtGQWNXb2dCRUdBc01rQUVLd0hDeUFBSUFRNkFGZ2dBMEVnYWlRQUM0Z0NBUVovSXdCQk1Hc2lCQ1FBSUFJZ0F5Z0NEQkVHQUNFR0lBRW9BZ0FoQnlBQktBSUVLQUlVSVFnZ0FBSi9Ba0FEUUNBRVFRUnFJZ2tnQnlBQ0lBTWdDQkVBQUNBRUtBSUVRUVZIQkVBZ0NSRE9DQ0FFSUFFb0FnZ2lBVFlDQUNBQklBVkxEUUlnQUNBRk5nSU1JQUJDZ0lDQWdCQTNBZ1JCQlF3REN5QUZRUUZxSWdVTkFBc1F0Z2tBQ3lBQ0lBWWdBeWdDR0JFQkFDQUVRUU0yQWdnZ0JFR3N6TklBTmdJRUlBUkNBamNDRUNBRVFSbzJBaWdnQkVFYU5nSWdJQVFnQlRZQ0xDQUVJQVJCSEdvMkFnd2dCQ0FFUVN4cU5nSWtJQVFnQkRZQ0hDQUFRUWhxSUFSQkJHb1FuZ01nQUNBR05nSUVRUUJCQVJDckNVRUJDellDQUNBRVFUQnFKQUFMZ2dJQkFYOGpBRUVRYXlJQ0pBQUNmd0pBQWtBQ1FBSkFBa0FnQUNnQ0FFRUJhdzRFQVFJREJBQUxJQUVvQWdCQi9OUFNBRUVLSUFFb0FnUW9BZ3dSQWdBTUJBc2dBaUFBUVFScU5nSU1JQUZCaHRUU0FFRUlRWTdVMGdCQkJ5QUFRUWhxUVNOQmxkVFNBRUVJSUFKQkRHcEJKQkNTQXd3REN5QUNJQUJCQkdvMkFnd2dBVUdkMU5JQVFRcEJqdFRTQUVFSElBQkJDR3BCSTBHVjFOSUFRUWdnQWtFTWFrRWtFSklEREFJTElBSWdBRUVJYWpZQ0RDQUJRYWZVMGdBZ0FFRU1haUFBUVFScUlBSkJER3BCSlJDSEF3d0JDeUFDSUFCQkNHbzJBZ3dnQVVHeTFOSUFJQUJCREdvZ0FFRUVhaUFDUVF4cVFTWVFod01MSUFKQkVHb2tBQXVGQWdJRWZ3SitJd0JCSUdzaUJDUUFJQVFnQVNnQ0RDSUdOZ0lRSUFRZ0FTZ0NFQ0lGUXYvLy8vOFBJQUVwQXdBaUNDQUlRdi8vLy84UFdodW5heUlIUVFBZ0JTQUhUeHMyQWh3Z0JDQUlJQVd0SWdrZ0NDQUpWQnVuSWdVMkFoUWdCQ0FGSUFacU5nSVlJQVJCQ0dvZ0JFRVlhaUFDSUFNUXd3TWdBU0FJSUFPdGZDQUpJQVF0QUFnaUFVRUVSaHMzQXdBQ1FBSkFJQUZCQkVZTkFDQUVLUU1JSWdoQy93R0RRZ1JSRFFBZ0FDQUlOd0lFSUFCQmpvQ0FnSGcyQWdBTUFRdEJBQ0VCQTBBZ0F3UkFJQU5CQVdzaEF5QUNMUUFBSUFGQkNIUnlJUUVnQWtFQmFpRUNEQUVMQ3lBQVFaK0FnSUI0TmdJQUlBQWdBVFlDQkFzZ0JFRWdhaVFBQzRNQ0FnRitCbjhqQUVFUWF5SURKQUFnQUNnQ0JDSUhCRUFnQUNnQ0FDRUVBa0FnQUNnQ0RDSUdSUTBBSUFSQkNHb2hBQ0FFS1FNQVFuK0ZRb0NCZ29TSWtLREFnSCtESVFGQkFTRUNJQVFoQlFOQUlBSkZEUUVEUUNBQlFnQlNSUVJBSUFWQndBTnJJUVVnQUNrREFFSi9oVUtBZ1lLRWlKQ2d3SUIvZ3lFQklBQkJDR29oQUF3QkN3c2dCU0FCZXFkQkEzWkJTR3hxSWdKQk5Hc29BZ0FnQWtFd2F5Z0NBQkRCQ1NBQ1FTaHJLQUlBSUFKQkpHc29BZ0FRcVFrZ0FVSUJmU0FCZ3lFQklBWkJBV3NpQmlFQ0RBQUxBQXNnQTBFRWFrRTRRUWdnQjBFQmFoRHFBeUFFSUFNb0FneHJJQU1vQWdRZ0F5Z0NDQkRRQ0FzZ0EwRVFhaVFBQzRnQ0FRWi9Jd0JCTUdzaUJDUUFJQUlnQXlnQ0RCRUdBQ0VHSUFFb0FnQWhCeUFCS0FJRUtBSVVJUWdnQUFKL0FrQURRQ0FFUVFScUlna2dCeUFDSUFNZ0NCRUFBQ0FFS0FJRVFRVkhCRUFnQ1JEb0NDQUVJQUVvQWdnaUFUWUNBQ0FCSUFWTERRSWdBQ0FGTmdJTUlBQkNnSUNBZ0JBM0FnUkJCUXdEQ3lBRlFRRnFJZ1VOQUFzUXRna0FDeUFDSUFZZ0F5Z0NHQkVCQUNBRVFRTTJBZ2dnQkVHc3pOSUFOZ0lFSUFSQ0FqY0NFQ0FFUVJvMkFpZ2dCRUVhTmdJZ0lBUWdCVFlDTENBRUlBUkJIR28yQWd3Z0JDQUVRU3hxTmdJa0lBUWdCRFlDSENBQVFRaHFJQVJCQkdvUW5nTWdBQ0FHTmdJRVFRQkJBUkNyQ1VFQkN6WUNBQ0FFUVRCcUpBQUxoQUlCQVg4akFFRVFheUlDSkFBQ2Z3SkFBa0FDUUFKQUFrQWdBQ2dDQUVFQmF3NEVBUUlEQkFBTElBRW9BZ0JCL05QU0FFRUtJQUVvQWdRb0Fnd1JBZ0FNQkFzZ0FpQUFRUVJxTmdJTUlBRkJodFRTQUVFSVFZN1UwZ0JCQnlBQVFRaHFRU05CbGRUU0FFRUlJQUpCREdwQkpCQ1NBd3dEQ3lBQ0lBQkJCR28yQWd3Z0FVR2QxTklBUVFwQmp0VFNBRUVISUFCQkNHcEJJMEdWMU5JQVFRZ2dBa0VNYWtFa0VKSUREQUlMSUFJZ0FFRUlhallDRENBQlFhZlUwZ0FnQUVFTWFpQUFRUVJxSUFKQkRHcEI5UUFRaHdNTUFRc2dBaUFBUVFocU5nSU1JQUZCc3RUU0FDQUFRUXhxSUFCQkJHb2dBa0VNYWtIMkFCQ0hBd3NnQWtFUWFpUUFDNGtDQWdGL0FuNGpBRUhRQUdzaUJDUUFJQVJCQ0dvZ0FTQUNJQU1RcndJZ0JDZ0NFQ0VDSUFRb0Fnd2hBUUpBSUFRb0FnZ2lBMFVFUUNBQkJFQWdCRUhJQUdvZ0JFRWthaWtDQURjREFDQUVRVUJySUFSQkhHb3BBZ0EzQXdBZ0JDQUVLUUlVTndNNEN5QUFJQVFwQXpnM0FnZ2dBQ0FDTmdJRUlBQWdBVFlDQUNBQVFSaHFJQVJCeUFCcUtRTUFOd0lBSUFCQkVHb2dCRUZBYXlrREFEY0NBQXdCQ3lBRVFjZ0FhaUFFUVNScUtRSUFOd01BSUFSQlFHc2dCRUVjYWlrQ0FDSUZOd01BSUFRZ0JDa0NGQ0lHTndNNElBQkJHR29nQlQ0Q0FDQUFJQVkzQWhBZ0FDQUNOZ0lNSUFBZ0FUWUNDQ0FBSUFNMkFnUWdBRUVETmdJQUN5QUVRZEFBYWlRQUM2UUNBUVYvSXdCQklHc2lBU1FBSUFGQkNHcEJCRUhzMGRvQUVKa0ZJQUVvQWdnaEFpQUJLQUlNSVFNZ0FVRUNRZnpSMmdBUW1RVWdBU2dDQUNFRUlBRW9BZ1FoQlNBQVFRQTJBaFFnQUNBRk5nSVFJQUFnQkRZQ0RDQUFRUUEyQWdnZ0FDQUROZ0lFSUFBZ0FqWUNBQ0FCUVJScVFZQWdRZnpRMmdBUTVnUUNRQ0FCS0FJVUlnTWdBU2dDSENJQ1N3UkFJQUVvQWhnaEJBSkFJQUpGQkVCQkFTRUZJQVJCQVNBREVOQUlEQUVMSUFRZ0EwRUJJQUlRVmlJRlJRMENDeUFCSUFVMkFoZ0xJQUVvQWhnaEF5QUFRZ0EzQXlnZ0FDQUNOZ0lrSUFBZ0F6WUNJQ0FBUVlFUU93RklJQUJDZ29LQWlKQWdOd05BSUFCQkFEc0JHQ0FBUWYrREpEWUNPQ0FBUWdBM0F6QWdBVUVnYWlRQUR3dEJBU0FDUVl6UjJnQVF6QWdBQy9VQkFnTi9BWDRnQUNBQUtBSTRJQUpxTmdJNEFrQUNRQ0FBS0FJOElnUkZCRUFNQVFzZ0FVRUFRUWdnQkdzaUF5QUNJQUlnQTBzYkVQQURJUVlnQUNBQUtRTXdJQVlnQkVFRGRFRTRjYTJHaENJR053TXdJQUlnQTA4RVFDQUFJQUFwQXhnZ0JvVTNBeGdnQUJDb0JDQUFRUUEyQWp3Z0FDQUFLUU1BSUFBcEF6Q0ZOd01BREFFTElBSWdCR29oQVF3QkN5QUNJQU5ySWdSQmVIRWhCUU5BSUFNZ0JVOUZCRUFnQUNBQklBTnFLUUFBSWdZZ0FDa0RHSVUzQXhnZ0FCQ29CQ0FBSUFZZ0FDa0RBSVUzQXdBZ0EwRUlhaUVEREFFTEN5QUFJQUVnQXlBRVFRZHhJZ0VROEFNM0F6QUxJQUFnQVRZQ1BBdldBUUVGZnlBQUlBRW9BZ3dnQWlnQ0NDSUZRUnAzSUFWQkZYZHpJQVZCQjNkeklBUnFhaUFCS0FJSUlnY2dBaWdDRENJSWN5QUZjU0FIYzJvaUJDQUJLQUlFYWlJR05nSU1JQUFnQkNBQ0tBSUFJZ1FnQVNnQ0FDSUpJQUlvQWdRaUFuTnhJQUlnQ1hGeklBUkJIbmNnQkVFVGQzTWdCRUVLZDNOcWFpSUJOZ0lFSUFBZ0NTQURJQWRxSUFnZ0JpQUZJQWh6Y1hOcUlBWkJHbmNnQmtFVmQzTWdCa0VIZDNOcUlnTnFOZ0lJSUFBZ0FVRWVkeUFCUVJOM2N5QUJRUXAzY3lBQklBSWdCSE54SUFJZ0JIRnphaUFEYWpZQ0FBdUZBZ0lEZndKK0l3QkIwQUJySWdJa0FDQUNRUWhxSUFFUWpRRWdBaWdDRUNFRElBSW9BZ3doQVFKQUlBSW9BZ2dpQkVVRVFDQUJCRUFnQWtISUFHb2dBa0VrYWlrQ0FEY0RBQ0FDUVVCcklBSkJIR29wQWdBM0F3QWdBaUFDS1FJVU53TTRDeUFBSUFJcEF6ZzNBZ2dnQUNBRE5nSUVJQUFnQVRZQ0FDQUFRUmhxSUFKQnlBQnFLUU1BTndJQUlBQkJFR29nQWtGQWF5a0RBRGNDQUF3QkN5QUNRY2dBYWlBQ1FTUnFLUUlBTndNQUlBSkJRR3NnQWtFY2Fpa0NBQ0lGTndNQUlBSWdBaWtDRkNJR053TTRJQUJCR0dvZ0JUNENBQ0FBSUFZM0FoQWdBQ0FETmdJTUlBQWdBVFlDQ0NBQUlBUTJBZ1FnQUVFRE5nSUFDeUFDUWRBQWFpUUFDK1VCQVFOL0l3QkJFR3NpQXlRQUFrQUNRQ0FEUVFScUlBRkJDQUovSUFKQkQwOEVRQ0FDUWYvLy8vOEJTdzBDUVg4Z0FrRURkRUVIYmtFQmEyZDJRUUZxREFFTFFRUkJDRUVRSUFKQkNFa2JJQUpCQkVrYkN5SUNFT29ESUFNb0FnUWlBVVVOQUNBREtBSU1JUVFnQXlnQ0NDSUZCRUJCZ09EYUFDMEFBQm9nQlNBQkVLQUlJUUVMSUFGRkRRRWdBU0FFYWlFQklBSkJDR29pQkFSQUlBRkIvd0VnQlB3TEFBc2dBRUVBTmdJTUlBQWdBa0VCYXlJRU5nSUVJQUFnQVRZQ0FDQUFJQVFnQWtFRGRrRUhiQ0FDUVFsSkd6WUNDQ0FEUVJCcUpBQVBDeERuQmdzQUM0TUNBZ2gvQVg0akFFRWdheUlDSkFBUTdnY2lCaUFCS0FJQUlnTXZBZUlCSWdjZ0FTZ0NDQ0lFUVg5emFpSUlPd0hpQVNBQ1FSaHFJZ2tnQXlBRVFReHNhaUlGUWVRQWFpZ0NBRFlDQUNBQ0lBVkIzQUJxS1FJQU53TVFJQU1nQkVFRGRHb3BBZ0FoQ2lBQ1FRaHFJQWdnQmtIY0FHb1F3Z2NnQlVIb0FHb2dCeUFFUVFGcUlnVnJJZ2NnQWlnQ0NDQUNLQUlNRVBnR0lBSWdDQ0FHRU1FSElBTWdCVUVEZEdvZ0J5QUNLQUlBSUFJb0FnUVE4d1lnQXlBRU93SGlBU0FBSUFvM0Fnd2dBQ0FDS1FNUU53SUFJQUJCQ0dvZ0NTZ0NBRFlDQUNBQVFRQTJBaUFnQUNBR05nSWNJQUFnQXpZQ0ZDQUFJQUVvQWdRMkFoZ2dBa0VnYWlRQUM1QUNBUVIvSXdCQklHc2lBeVFBQWtBZ0FTZ0M4QVlpQkVVRVFDQUFJQUkyQWdnZ0FDQUJOZ0lFSUFCQkFqWUNBQXdCQ3lBQ1FRRnFJUVVDUUNBQkx3SDBCaUlHUlFSQUlBUXZBZllHUlEwQklBQWdBallDSENBQUlBSTJBaFFnQUNBQk5nSVFJQUJCQURZQ0RDQUFJQVUyQWdnZ0FDQUVOZ0lFSUFCQkFUWUNBQ0FBSUFRb0F2d0dOZ0lZREFJTElBQWdBallDSENBQUlBRTJBaGdnQUNBQ05nSVVJQUFnQlRZQ0NDQUFJQVEyQWdRZ0FFRUFOZ0lBSUFBZ0JrRUJheUlCTmdJTUlBQWdCQ0FCUVFKMGFpZ0MrQVkyQWhBTUFRc2dBMEVCTmdJSUlBTkJuSkhKQURZQ0JDQURRZ0EzQWhBZ0F5QURRUnhxTmdJTUlBTkJCR3BCcEpISkFCQ3JCd0FMSUFOQklHb2tBQXZXQVFJRGZ3RitJd0JCRUdzaUJ5UUFBa0FnQlVVTkFDQUNJQU5xSWdNZ0Fra05BQ0FFSUFWcVFRRnJRUUFnQkd0eHJTQURJQUVvQWdBaUNFRUJkQ0lDSUFJZ0Ewa2JJZ0pCQ0VFRUlBVkJBVVliSWdNZ0FpQURTeHNpQTYxK0lnbENJSWluRFFBZ0NhY2lBa0dBZ0lDQWVDQUVhMHNOQUNBRUlRWUNmeUFJQkVBZ0FTZ0NCQ0FGSUFoc0lBUWdBaEJXREFFTElBZEJDR29nQkNBQ0VMNEhJQWNvQWdnTElnVkZEUUFnQVNBRE5nSUFJQUVnQlRZQ0JFR0JnSUNBZUNFR0N5QUFJQUkyQWdRZ0FDQUdOZ0lBSUFkQkVHb2tBQXZzQVFFRGZ5TUFRZEFBYXlJREpBQWdBeUFCRUljRklBQkI0QUpxSVFWQkFDRUJBMEFnQVVFUVJrVUVRQ0FCSUFOcUlnUWdCQzBBQUNBQUlBRnFRZUFDYWkwQUFITTZBQUFnQVVFQmFpRUJEQUVMQ3lBRFFTaHFRZ0EzQXdBZ0EwRWdha0lBTndNQUlBTkJHR3BDQURjREFDQURRZ0EzQXhBZ0EwRVFhaUlCSUFNUWh3VWdBMEV3YWlJRUlBQWdBUkM3QVNBRFFRaHFJZ0FnQTBFNGFpSUJLUUFBTndNQUlBTWdBeWtBTURjREFDQUVJQU1RaHdVZ0JVRUlhaUFCS1FBQU53QUFJQVVnQXlrQU1EY0FBQ0FDUVFocUlBQXBBd0EzQUFBZ0FpQURLUU1BTndBQUlBTkIwQUJxSkFBTDlRRUJCWDhqQUVFUWF5SURKQUJCQVNFRkFrQWdBQUovQTBBZ0EwRUlhaUFCRVBrRUlBTXRBQWdFUUNBRExRQUpEQUlMQWtBZ0FTZ0NJQ0lDUlEwQUlBSWdBU2dDSkVZTkFDQUJJQUpCQVdvMkFpQWdBU2dDS0NJRUtBSUVJZ1lnQWkwQUFDSUNUUTBESUFRb0FnQWdBa0VCZEdvdkFRQWhCQkM3Q0NJQ0lBUkJDSFFnQkVFSWRuSTdBQUFnQVNnQ0FDQUJLQUlJRUlrSklBRWdBa0VDYWpZQ0RDQUJRUUkyQWdnZ0FTQUNOZ0lFSUFFZ0FqWUNBQXdCQ3dzZ0F5QUJRUkJxRVBrRUlBTXRBQUFoQlNBRExRQUJDem9BQVNBQUlBVkJBWEU2QUFBZ0EwRVFhaVFBRHdzZ0FpQUdRWWo5elFBUXhnUUFDOXdCQWdOL0FYNGpBRUVRYXlJSEpBQUNRQ0FDSUFJZ0Eyb2lBMHNFUUVFQUlRSU1BUXRCQUNFQ0lBUWdCV3BCQVd0QkFDQUVhM0d0SUFNZ0FTZ0NBQ0lJUVFGMElnWWdBeUFHU3hzaUEwRUlRUVFnQlVFQlJoc2lCaUFESUFaTEd5SUdyWDRpQ1VJZ2lLY05BQ0FKcHlJRFFZQ0FnSUI0SUFSclN3MEFJQVFoQWdKL0lBZ0VRQ0FCS0FJRUlBVWdDR3dnQkNBREVGWU1BUXNnQjBFSWFpQUVJQU1RdmdjZ0J5Z0NDQXNpQlVVTkFDQUJJQVkyQWdBZ0FTQUZOZ0lFUVlHQWdJQjRJUUlMSUFBZ0F6WUNCQ0FBSUFJMkFnQWdCMEVRYWlRQUM1OENBUVYvSXdCQklHc2lCQ1FBSUFSQkNHb2hBd0pBSUFFdEFBUU5BQ0FCTHdFQ0lnWWdBUzhCQUNJSFNRMEFJQVlnQjJ0Qi8vOERjVUVCYWlFRkN5QURJQVUyQWdnZ0EwRUJOZ0lFSUFNZ0JUWUNBQ0FFS0FJTVFRRkdCRUFnQUNBRUtBSVFFTW9ISUFBb0FnZ2hBd0pBSUFFdEFBUkJBWEVOQUNBQkx3RUNJZ1VnQVM4QkFDSUJTUTBBSUFBb0FnUWlCaUFEUVFGMGFpRUNJQU1nQlNBQmEwSC8vd054YWlFREEwQWdCU0FCUWYvL0EzRkxCRUFnQWlBQk93RUFJQUpCQW1vaEFpQUJRUUZxSVFFTUFRc0xJQVlnQTBFQmRHb2dCVHNCQUNBRFFRRnFJUU1MSUFBZ0F6WUNDQ0FFUVNCcUpBQVBDeUFFUVFBMkFoZ2dCRUVCTmdJTUlBUkJ6SnZKQURZQ0NDQUVRZ1EzQWhBZ0JFRUlhaUFDRUtzSEFBdjhBUUVFZnlNQVFTQnJJZ01rQUVFQklRVUNRQ0FBTFFBRURRQWdBQzBBQlNFR0FrQWdBQ2dDQUNJRUxRQUtRWUFCY1VVRVFDQUdRUUZ4UlEwQklBUW9BZ0JCei9iQUFFRUNJQVFvQWdRb0Fnd1JBZ0JGRFFFTUFnc2dCa0VCY1VVRVFDQUVLQUlBUWFEZ3lnQkJBU0FFS0FJRUtBSU1FUUlBRFFJTElBTkJBVG9BRHlBRFFiRDJ3QUEyQWhRZ0F5QUVLUUlBTndJQUlBTWdCQ2tDQ0RjQ0dDQURJQU5CRDJvMkFnZ2dBeUFETmdJUUlBRWdBMEVRYWlBQ0VRTUFEUUVnQXlnQ0VFSFU5c0FBUVFJZ0F5Z0NGQ2dDREJFQ0FDRUZEQUVMSUFFZ0JDQUNFUU1BSVFVTElBQkJBVG9BQlNBQUlBVTZBQVFnQTBFZ2FpUUFDOHNCQVFOL0lBTkJDRThFUUNBQUlBQWdBMEVEZGlJRFFjQUNiQ0lFYWlBQUlBTkJzQVJzSWdWcUlBTVF5d0loQUNBQklBRWdCR29nQVNBRmFpQURFTXNDSVFFZ0FpQUNJQVJxSUFJZ0JXb2dBeERMQWlFQ0N3Si9JQUFvQWdBaUF5QUJLQUlBSWdSSEJFQWdBeUFFU1F3QkN5QUFMd0VFSUFFdkFRUkpDeUVGQW44Z0FpZ0NBQ0lHSUFOSEJFQWdBeUFHU1F3QkN5QUFMd0VFSUFJdkFRUkpDeUFGUmdSL0lBSWdBU0FFSUFaSEJIOGdCQ0FHU1FVZ0FTOEJCQ0FDTHdFRVNRc2dCWE1iQlNBQUN3dm5BUUlFZndGK0l3QkJJR3NpQkNRQVFZR0FnSUI0SVFVQ1FDQURJQUVvQWdBaUJpQUNhMDBOQUVFQUlRVWdBaUFEYWlJRElBSkpEUUFnQTYxQzJBQitJZ2hDSUlpbkRRQWdDS2NpQjBINC8vLy9CMHNOQUFKL0lBWkZCRUFnQkVFWWFnd0JDeUFFUVFnMkFoZ2dCQ0FCS0FJRU5nSVVJQVpCMkFCc0lRVWdCRUVjYWdzZ0JUWUNBQ0FFUVFocVFRZ2dCeUFFUVJScUVORURJQVFvQWdoQkFVWUVRQ0FFS0FJUUlRSWdCQ2dDRENFRkRBRUxJQVFvQWd3aEFpQUJJQU0yQWdBZ0FTQUNOZ0lFUVlHQWdJQjRJUVVMSUFBZ0FqWUNCQ0FBSUFVMkFnQWdCRUVnYWlRQUM5QUJBUU4vQWtBQ1FBSkFBa0FDUUFKQVFRSWdBQ2dDQUNJQlFZQ0FnSUI0Y3lJQ0lBSkJIMDhiRGg0RUJBRUVCQVFFQkFVRkJRVUZCQUlFQkFRRUJBUUZCQVFFQkFRREJBUUFDeUFBS0FJRUlBQW9BZ2dRcVFrTUF3c2dBU0FBS0FJRUVLa0pEd3NnQUMwQUJFRURSdzBCSUFBb0FnZ2lBQ2dDQUNFQklBQW9BZ1FpQWlnQ0FDSURCRUFnQVNBREVRUUFDeUFDS0FJRUlnTUVRQ0FCSUFNZ0FpZ0NDQkRqQkFzZ0FFRU1RUVFRNHdRUEN5QUFLQUlFSUFBb0FnZ1FxUWtMRHdzZ0FDZ0NCQ0FBS0FJSUVLa0pDOUFCQVFOL0FrQUNRQUpBQWtBQ1FBSkFRUUlnQUNnQ0FDSUJRWUNBZ0lCNGN5SUNJQUpCSDA4YkRoNEVCQUVFQkFRRUJBVUZCUVVGQkFJRUJBUUVCQVFGQkFRRUJBUURCQVFBQ3lBQUtBSUVJQUFvQWdnUTlRa01Bd3NnQVNBQUtBSUVFUFVKRHdzZ0FDMEFCRUVEUncwQklBQW9BZ2dpQUNnQ0FDRUJJQUFvQWdRaUFpZ0NBQ0lEQkVBZ0FTQURFUVFBQ3lBQ0tBSUVJZ01FUUNBQklBTWdBaWdDQ0JEakJBc2dBRUVNUVFRUTR3UVBDeUFBS0FJRUlBQW9BZ2dROVFrTER3c2dBQ2dDQkNBQUtBSUlFUFVKQy84QkFRTi9Jd0JCSUdzaUF5UUFJQUFvQWdBaEJTQUFBbjlCQVNBQUxRQUlEUUFhSUFBb0FnUWlCQzBBQ2tHQUFYRkZCRUJCQVNBRUtBSUFRYy8yd0FCQm5NL0pBQ0FGRzBFQ1FRRWdCUnNnQkNnQ0JDZ0NEQkVDQUEwQkdpQUJJQVFnQWhFREFBd0JDeUFGUlFSQVFRRWdCQ2dDQUVIWjlzQUFRUUlnQkNnQ0JDZ0NEQkVDQUEwQkdnc2dBMEVCT2dBUElBTkJzUGJBQURZQ0ZDQURJQVFwQWdBM0FnQWdBeUFFS1FJSU53SVlJQU1nQTBFUGFqWUNDQ0FESUFNMkFoQkJBU0FCSUFOQkVHb2dBaEVEQUEwQUdpQURLQUlRUWRUMndBQkJBaUFES0FJVUtBSU1FUUlBQ3pvQUNDQUFJQVZCQVdvMkFnQWdBMEVnYWlRQUlBQUxud0lCQkg4akFFRWdheUlGSkFCQkpSRDlDQ0VEUVFSQkJCQ2ZDQ0lFUVpEUTBnQTJBZ0FnQlVFSWFpQURJQVJCbUlYQUFFRUFFSUFJUWNpQ3dBQVFod2NnQlNnQ0NCQ3hCU0VHUVFoQkJCQ2ZDQ0lEUWFpTXdBQTJBZ1FnQXlBR05nSUFRZUNMd0FBZ0EwR3dnc0FBRU1rSFFkaVB3QUFRZ1FnaEJCQ0xCeUVHUVJCQkJCQ2ZDQ0lEUWZDUHdBQTJBZ3dnQXlBR05nSUlJQU5CZ0k3QUFEWUNCQ0FESUFRMkFnQVFQU0VHUVJCQkJCQ2ZDQ0lFUWZpT3dBQTJBZ3dnQkNBR05nSUlJQVJCMklQQUFEWUNCQ0FFSUFNMkFnQWdCRUdJaDhBQVFRRVFnQWdoQXlBRlFRQTJBaHdnQlNBQ05nSVlJQVVnQVRZQ0ZDQUFJQU1nQlVFVWFrSHdrTUFBRU5FQklBTVFzZ2tnQTBFTVFRUVE0d1FnQlVFZ2FpUUFDK3dCQVFKL0l3QkJNR3NpQlNRQUlBRWdBaUFESUFRUTlRSWhCaUFGSUFRN0FTUWdCU0FETmdJZ0lBVkJrb0NBZ0hnMkFod2dCVUVJYWlBR0lBVkJIR29ReHdVZ0JTZ0NEQ0VEQWtBZ0JTZ0NDQ0lFUVorQWdJQjRSd1JBSUFBZ0JTa0NFRGNDQ0NBQVFSQnFJQVZCR0dvb0FnQTJBZ0FnQUNBRE5nSUVJQUFnQkRZQ0FBd0JDeUFGUVJ4cUlBRWdBaUFERUpvQ0lBVW9BaHhCbjRDQWdIaEhCRUFnQUNBRktRSWNOd0lBSUFCQkVHb2dCVUVzYWlnQ0FEWUNBQ0FBUVFocUlBVkJKR29wQWdBM0FnQU1BUXNnQUNBRktBSXNOZ0lFSUFCQm40Q0FnSGcyQWdBTElBVkJNR29rQUF2YUFRRUVmeUFBS0FJQUlnVkIzQUJxSUFVdkFlSUJJZ2RCQVdvaUNDQUFLQUlJSWdZZ0FSRFdCQ0FGSUFnZ0JpQUNJQU1RaEFVZ0JrRUJhaUVBSUFWQjVBRnFJUUVDUUNBSFFRSnFJZ0lnQmtFQ2FpSURUUTBBSUFjZ0JtdEJBblFpQjBVTkFDQUJJQU5CQW5ScUlBRWdBRUVDZEdvZ0Ivd0tBQUFMSUFFZ0FFRUNkR29nQkRZQ0FDQUZJQWc3QWVJQklBSWdBQ0FBSUFKSkd5RUNJQVpCQW5RZ0JXcEI2QUZxSVFFRFFDQUFJQUpHUlFSQUlBRW9BZ0FpQXlBQU93SGdBU0FESUFVMkFsZ2dBVUVFYWlFQklBQkJBV29oQUF3QkN3c0w1UUVCQjM4Q1FDQUJLQUlBSWdNRVFDQUJLQUlFSVFVRFFDQURMd0dLQVNJSVFRSjBJUWxCQUNFR1FYOGhCQUpBQTBBZ0JpQUpSZ1JBSUFnaEJBd0NDeUFESUFacUlRY2dCRUVCYWlFRUlBWkJCR29oQmdKQUlBSWdCMEhjQUdvb0FnQWlCMHNnQWlBSFNXdEIvd0Z4RGdJQUFRSUxDeUFBSUFFMkFoQWdBQ0FFTmdJTUlBQWdCVFlDQ0NBQUlBTTJBZ1FnQUVFQU5nSUFEd3NnQlFSQUlBVkJBV3NoQlNBRElBUkJBblJxS0FLTUFTRUREQUVMQ3lBQUlBUTJBaEFnQUVFQU5nSU1JQUFnQXpZQ0NBd0JDeUFBUVFBMkFnZ0xJQUFnQWpZQ0JDQUFJQUUyQWdBTDJBRUJCbjhnQUNnQ0FDSUZRZHdBYWlBRkx3R0tBU0lHUVFGcUlnY2dBQ2dDQ0NJRUlBRVFwZ1VnQlNBSElBUWdBaENsQlNBRVFRRnFJUUFnQlVHTUFXb2hBUUpBSUFaQkFtb2lDQ0FFUVFKcUlnbE5EUUFnQmlBRWEwRUNkQ0lHUlEwQUlBRWdDVUVDZEdvZ0FTQUFRUUowYWlBRy9Bb0FBQXNnQVNBQVFRSjBhaUFETmdJQUlBVWdCenNCaWdFZ0NDQUFJQUFnQ0VrYklRTWdCRUVDZENBRmFrR1FBV29oQVFOQUlBQWdBMFpGQkVBZ0FTZ0NBQ0lFSUFBN0FZZ0JJQVFnQlRZQ1dDQUJRUVJxSVFFZ0FFRUJhaUVBREFFTEN3dktBUUVHZnlNQVFZQUNheUlFSkFBZ0FrR0JBbXRCLzMxTEJFQWdCRUVBUVlBQy9Bc0FBMEFnQTBHQUFrWUVRRUVBSVFNRFFDQURRWUFDUmdSQUlBQWdCRUdBQXZ3S0FBQWdCRUdBQW1va0FBOEZJQU1nQkdvaUJpQUVJQUVnQldvdEFBQWdCaTBBQUNJR0lBZHFhaUlIUWY4QmNXb2lDQzBBQURvQUFDQUlJQVk2QUFBZ0JVRUJhaUlGUVFBZ0FpQUZSeHNoQlNBRFFRRnFJUU1NQVFzQUN3QUZJQU1nQkdvZ0F6b0FBQ0FEUVFGcUlRTU1BUXNBQ3dBTFFheXB5UUJCTlVIa3Fja0FFSndHQUF2NEFRRURmeU1BUVRCcklnSWtBQUovSUFBb0FnQWlBRUdCZ0lDQWVFOEVRQ0FDUVFBZ0FHdXRRaUNHTndNSUlBSkJDR29nQVJEQkFRd0JDMEhuaWNrQUlRTkJKaUVFQWtBQ1FBSkFBa0FnQUVHQWdBUnJEZ01CQXdBQ0MwR05pc2tBSVFOQkZDRUVEQUlMUWNDSnlRQWhBMEVuSVFRTUFRc2dBRUdLZ0FSSEJFQWdBa0VCTmdJTUlBSkIwSXJKQURZQ0NDQUNRZ0UzQWhRZ0FrSEdBRFlDS0NBQ0lBQTJBaXdnQWlBQ1FTUnFOZ0lRSUFJZ0FrRXNhallDSkNBQktBSUFJQUVvQWdRZ0FrRUlhaENGQVF3Q0MwR2hpc2tBSVFOQkhTRUVDeUFCS0FJQUlBTWdCQ0FCS0FJRUtBSU1FUUlBQ3lBQ1FUQnFKQUFMK0FFQkEzOGpBRUVnYXlJRkpBQkJBU0VIQWtBZ0FDZ0NBQ0lHSUFFZ0FpQUFLQUlFSWdJb0Fnd2lBUkVDQUEwQUFrQWdBQzBBQ2tHQUFYRkZCRUFnQmtHY3o4a0FRUUVnQVJFQ0FBMENJQU1nQUNBRUVRTUFEUUlnQUNnQ0FDRUdJQUFvQWdRb0Fnd2hBUXdCQ3lBR1FkbjJ3QUJCQWlBQkVRSUFEUUVnQlVFQk9nQVBJQVVnQWpZQ0JDQUZJQVkyQWdBZ0JVR3c5c0FBTmdJVUlBVWdBQ2tDQ0RjQ0dDQUZJQVZCRDJvMkFnZ2dCU0FGTmdJUUlBTWdCVUVRYWlBRUVRTUFEUUVnQlNnQ0VFSFU5c0FBUVFJZ0JTZ0NGQ2dDREJFQ0FBMEJDeUFHUVpPVjBnQkJBU0FCRVFJQUlRY0xJQVZCSUdva0FDQUhDK1lCQVFSL0l3QkJJR3NpQlNRQUlBRW9BZ0FpQmlBQ1R3UkFBbjhnQmtVRVFDQUZRUVJxSVFkQkFBd0JDeUFGSUFNMkFnUWdBU2dDQkNFSUlBVkJIR29oQnlBRUlBWnNDeUVHSUFjZ0JqWUNBQUpBSUFVb0FnUWlCZ1JBSUFVb0Fod2hCd0pBSUFKRkJFQWdDQ0FHSUFjUTBBZ01BUXNnQ0NBSElBWWdBaUFFYkNJRUVGWWlBMFVOQWdzZ0FTQUNOZ0lBSUFFZ0F6WUNCQXRCZ1lDQWdIZ2hCZ3NnQUNBRU5nSUVJQUFnQmpZQ0FDQUZRU0JxSkFBUEN5QUZRUUEyQWhRZ0JVRUJOZ0lJSUFWQnRNemFBRFlDQkNBRlFnUTNBZ3dnQlVFRWFrRzh6Tm9BRUtzSEFBdmhBUUVHZnlNQVFSQnJJZ1FrQUFKL0EwQUNRQUpBSUFFdkFRZ2lBa1VFUUNBRVFRaHFJQUVRNmdJZ0JDZ0NDRUVCY1EwQlFRQU1CQXNnQVVFQU93RUlEQUVMSUFRb0Fnd2lBa0gvL3dOTkRRQWdBU0FDUWY4SGNVR0F1QU55T3dFSUlBSkJnSUQ4QjJwQkNuWkJnTEIvY2lFQ0N5QUJLQUlNSVFaQkFDRURJQUpCLy84RGNTRUNRUUFoQlFOQUlBTkJnQWhHRFFFQ1FDQURJQVpxSWdjdkFRQkJBVVlFUUNBSFFRSnFMd0VBSUFKR0RRRUxJQU5CQkdvaEF5QUZRUUZxSVFVTUFRc0xDMEVCQ3lFRElBQWdCVG9BQVNBQUlBTTZBQUFnQkVFUWFpUUFDOVVDQVFWL0l3QkJFR3NpQlNRQUlBQW9BakFoQVFKL0lBQW9BZ2hCZ0lERUFFWUVRQ0FBS0FJVUlRSWdBQ2dDRUF3QkN5QUZRUWhxSUFBdkFRQWdBRUVFYWhEUkJ5QUZLQUlNSVFJZ0JTZ0NDQXNoQXdKQUlBRWdBazBFUUNBQ0lBRnJJZ0JCQWtrTkFTQURJQUZCQTNScUlRUWdBRUVWVHdSQUl3QkJnQ0JySWdFa0FBSkFRY0NFUFNBQUlBQkJ3SVE5VHhzaUFpQUFJQUJCQVhacklnTWdBaUFEU3hzaUFrR0JCRThFUUNBQklBSVExQVlnQkNBQUlBRW9BZ1FpQkNBQktBSUlJZ0pCQTNScUlBRW9BZ0FpQXlBQ2F5QUFRY0VBU1JCQ0lBTWdCQkNtQ1F3QkN5QUVJQUFnQVVHQUJDQUFRY0VBU1JCQ0N5QUJRWUFnYWlRQURBSUxJQUpCQTNRZ0FVRURkQ0lBYTBFSWF5RUJJQUFnQTJwQkNHb2hBQU5BSUFGRkRRSWdCQ0FBRU9BRUlBRkJDR3NoQVNBQVFRaHFJUUFNQUFzQUN5QUJJQUpCOUpyU0FCQzVDUUFMSUFWQkVHb2tBQXZWQWdFRmZ5TUFRUkJySWdVa0FDQUFLQUl3SVFFQ2Z5QUFLQUlJUVlDQXhBQkdCRUFnQUNnQ0ZDRUNJQUFvQWhBTUFRc2dCVUVJYWlBQUx3RUFJQUJCQkdvUTBRY2dCU2dDRENFQ0lBVW9BZ2dMSVFNQ1FDQUJJQUpOQkVBZ0FpQUJheUlBUVFKSkRRRWdBeUFCUVFOMGFpRUVJQUJCRlU4RVFDTUFRWUFnYXlJQkpBQUNRRUhBaEQwZ0FDQUFRY0NFUFU4YklnSWdBQ0FBUVFGMmF5SURJQUlnQTBzYklnSkJnUVJQQkVBZ0FTQUNFTlFHSUFRZ0FDQUJLQUlFSWdRZ0FTZ0NDQ0lDUVFOMGFpQUJLQUlBSWdNZ0Ftc2dBRUhCQUVrUVF5QURJQVFRcGdrTUFRc2dCQ0FBSUFGQmdBUWdBRUhCQUVrUVF3c2dBVUdBSUdva0FBd0NDeUFDUVFOMElBRkJBM1FpQUd0QkNHc2hBU0FBSUFOcVFRaHFJUUFEUUNBQlJRMENJQVFnQUJEZ0JDQUJRUWhySVFFZ0FFRUlhaUVBREFBTEFBc2dBU0FDUWZTYTBnQVF1UWtBQ3lBRlFSQnFKQUFMMndFQkJIOGpBRUV3YXlJRUpBQWdBaUFES0FJTUVRWUFJUVVnQkVFWWFpQUJLQUlBSUFJZ0F5QUJLQUlFS0FJVUVRQUFBa0FnQkNnQ0dFRUZSd1JBSUFSQkVHb2dCRUVvYWlrQ0FEY0RBQ0FFUVFocUlBUkJJR29wQWdBM0F3QWdCQ0FFS1FJWU53TUFEQUVMSUFRb0FpQWhCaUFFS0FJY0lBUWdBU2dDQ0NBQ0lBTWdBU2dDRENnQ0ZCRUFBQ0FHRVBZSkN5QUVLQUlBUVFWSEJFQWdBaUFGSUFNb0FoZ1JBUUFMSUFBZ0JDa0RBRGNDQUNBQVFSQnFJQVJCRUdvcEF3QTNBZ0FnQUVFSWFpQUVRUWhxS1FNQU53SUFJQVJCTUdva0FBdmJBUUVFZnlNQVFUQnJJZ1FrQUNBQ0lBTW9BZ3dSQmdBaEJTQUVRUmhxSUFFb0FnQWdBaUFESUFFb0FnUW9BaFFSQUFBQ1FDQUVLQUlZUVFWSEJFQWdCRUVRYWlBRVFTaHFLUUlBTndNQUlBUkJDR29nQkVFZ2Fpa0NBRGNEQUNBRUlBUXBBaGczQXdBTUFRc2dCQ2dDSUNFR0lBUW9BaHdnQkNBQktBSUlJQUlnQXlBQktBSU1LQUlVRVFBQUlBWVFxd2tMSUFRb0FnQkJCVWNFUUNBQ0lBVWdBeWdDR0JFQkFBc2dBQ0FFS1FNQU53SUFJQUJCRUdvZ0JFRVFhaWtEQURjQ0FDQUFRUWhxSUFSQkNHb3BBd0EzQWdBZ0JFRXdhaVFBQzk0QkFRbC9JQUFnQUNnQ0NDZ0NBQ0lDSUFBb0FnQW9BZ0FpQkVsQkEzUnFJZ1lnQUVFWVFSQWdBQ2dDR0NnQ0FDQUFLQUlRS0FJQVNTSUZHMm9pQXlBQUlBSWdCRTlCQTNScUlnSWdBRUVRUVJnZ0JSdHFJZ0FvQWdBb0FnQWdBaWdDQUNnQ0FFa2lCQnNnQXlnQ0FDZ0NBQ0FHS0FJQUtBSUFTU0lGR3lJSEtBSUFLQUlBSVFrZ0FDQUNJQU1nQlJzZ0JCc2lDQ2dDQUNnQ0FDRUtJQUVnQXlBR0lBVWJLUUlBTndJQUlBRWdDQ0FISUFrZ0Nrc2lBeHNwQWdBM0FnZ2dBU0FISUFnZ0F4c3BBZ0EzQWhBZ0FTQUNJQUFnQkJzcEFnQTNBaGdMMmdFQkFYOGpBRUV3YXlJQkpBQWdBVUVJYWlBQ0lBTW9BaEFSQVFBQ1FDQUJMUUFJUVFGeEJFQWdBU0FCTFFBSklnUTZBQThnQkVIQkFHdEJCa2tnQkVIaEFHdEJCa2x5SUFSQk1HdEIvd0Z4UVFwSmNrVUVRQ0FCUVFFMkFoUWdBVUhremRJQU5nSVFJQUZDQVRjQ0hDQUJRUmcyQWl3Z0FTQUJRU2hxTmdJWUlBRWdBVUVQYWpZQ0tDQUFRUWhxSUFGQkVHb1FuZ01nQUNBQ0lBTW9BZ3dSQmdBMkFnUWdBRUVCTmdJQURBSUxJQUlnQXlnQ0ZCRUVBQ0FBUVFVMkFnQWdBQ0FFT2dBRURBRUxJQUJCQURZQ0FBc2dBVUV3YWlRQUM4RUJBZ0YrQkg4Q1FDQUFLQUlBSWdSRkRRQWdBQ2dDQkNJQ1FRQklEUUJDZnlFQklBSkJFa3NOQUFKQUlBSkZCRUJDQUNFQkRBRUxJQUJCQ0dvaEJVSUFJUUVEUUNBQlFncCtJUUVnQXlBRVNRUkFJQUVnQXlBRmFqRUFBSHdoQVFzZ0FpQURRUUZxSWdOSERRQUxDeUFDSUFSUERRQUNRQ0FBSUFKcUlnTXRBQWdpQlVFRlJ5QUNRUUZxSUFSSGNrVUVRQ0FBTFFDSUJnMEJJQUpGRFFJZ0EwRUhhaTBBQUVFQmNRMEJEQUlMSUFWQkJFME5BUXNnQVVJQmZDRUJDeUFCQzljQkFRVi9JQVJCLy84RGNTRUlBMEFnQVM4QjlnWWlDVUVEZENFSFFYOGhCaUFCSVFRQ1FBSi9Ba0FEUUNBSFJRUkFJQWtoQmd3Q0N3Si9JQVFvQWdBaUJTQURSd1JBSUFNZ0JVc2dBeUFGU1dzTUFRc2dDQ0FFUVFScUx3RUFJZ1ZMSUFVZ0NFdHJDeUVGSUFSQkNHb2hCQ0FHUVFGcUlRWWdCMEVJYXlFSEFrQWdCVUgvQVhFT0FnQUJBZ3NMUVFBTUFRc2dBZzBCUVFBaEFrRUJDeUVFSUFBZ0JqWUNEQ0FBSUFJMkFnZ2dBQ0FCTmdJRUlBQWdCRFlDQUE4TElBSkJBV3NoQWlBQklBWkJBblJxS0FMNEJpRUJEQUFMQUF1akFnRURmeU1BUVVCcUlnUWtBQ0FFUVFocUlBSWdBeWdDRUJFQkFBSkFJQVF0QUFnRVFDQUVJQVF0QUFraUJUb0FEeUFBQW44Z0FTZ0NBQ0lHUVFZZ0JSQ1pCRVVFUUNNQVFSQnJJZ0VrQUNBQlFRUnFJQVpCQmhCbklBRW9BZ2doQlNBRVFRd2dBU2dDRENBQktBSUVJZ1liTmdJRUlBUkJxSWZTQUNBRklBWWJOZ0lBSUFGQkVHb2tBQ0FFUVJnMkFqUWdCRUVaTmdJc0lBUkJBallDRkNBRVFmek4wZ0EyQWhBZ0JFSUNOd0ljSUFRZ0JDa0RBRGNDT0NBRUlBUkJEMm8yQWpBZ0JDQUVRVGhxTmdJb0lBUWdCRUVvYWpZQ0dDQUFRUWhxSUFSQkVHb1FuZ01nQUNBQ0lBTW9BZ3dSQmdBMkFnUkJBUXdCQ3lBQ0lBTW9BaFFSQkFBZ0FDQUZPZ0FFUVFVTE5nSUFEQUVMSUFCQkFEWUNBQXNnQkVGQWF5UUFDK01CQVFKL0l3QkJRR29pQkNRQUlBUkJDR29nQWlBREtBSVFFUUVBQWtBZ0JDMEFDQVJBSUFRZ0JDMEFDU0lGT2dBUElBQUNmeUFCS0FJQUlnRWdCUkRTQ1VVRVFDQUNJQU1vQWhRUkJBQWdBQ0FGT2dBRVFRVU1BUXNnQkNBQkVNRUZJQVJCR0RZQ05DQUVRUmsyQWl3Z0JFRUNOZ0lVSUFSQm5NN1NBRFlDRUNBRVFnSTNBaHdnQkNBRUtRTUFOd0k0SUFRZ0JFRVBhallDTUNBRUlBUkJPR28yQWlnZ0JDQUVRU2hxTmdJWUlBQkJDR29nQkVFUWFoQ2VBeUFBSUFJZ0F5Z0NEQkVHQURZQ0JFRUJDellDQUF3QkN5QUFRUUEyQWdBTElBUkJRR3NrQUF1akFnRURmeU1BUVVCcUlnUWtBQ0FFUVFocUlBSWdBeWdDRUJFQkFBSkFJQVF0QUFnRVFDQUVJQVF0QUFraUJUb0FEeUFBQW44Z0FTZ0NBQ0lHUVFvZ0JSQ1pCRVVFUUNNQVFSQnJJZ0VrQUNBQlFRUnFJQVpCQ2hCbklBRW9BZ2doQlNBRVFRd2dBU2dDRENBQktBSUVJZ1liTmdJRUlBUkJxSWZTQUNBRklBWWJOZ0lBSUFGQkVHb2tBQ0FFUVJnMkFqUWdCRUVaTmdJc0lBUkJBallDRkNBRVFmek4wZ0EyQWhBZ0JFSUNOd0ljSUFRZ0JDa0RBRGNDT0NBRUlBUkJEMm8yQWpBZ0JDQUVRVGhxTmdJb0lBUWdCRUVvYWpZQ0dDQUFRUWhxSUFSQkVHb1FuZ01nQUNBQ0lBTW9BZ3dSQmdBMkFnUkJBUXdCQ3lBQ0lBTW9BaFFSQkFBZ0FDQUZPZ0FFUVFVTE5nSUFEQUVMSUFCQkFEWUNBQXNnQkVGQWF5UUFDK01CQVFKL0l3QkJRR29pQkNRQUlBUkJDR29nQWlBREtBSVFFUUVBQWtBZ0JDMEFDQVJBSUFRZ0JDMEFDU0lGT2dBUElBQUNmeUFCS0FJQUlnRWdCUkRTQ1VVRVFDQUVJQUVRd1FVZ0JFRVlOZ0kwSUFSQkdUWUNMQ0FFUVFJMkFoUWdCRUg4emRJQU5nSVFJQVJDQWpjQ0hDQUVJQVFwQXdBM0FqZ2dCQ0FFUVE5cU5nSXdJQVFnQkVFNGFqWUNLQ0FFSUFSQktHbzJBaGdnQUVFSWFpQUVRUkJxRUo0RElBQWdBaUFES0FJTUVRWUFOZ0lFUVFFTUFRc2dBaUFES0FJVUVRUUFJQUFnQlRvQUJFRUZDellDQUF3QkN5QUFRUUEyQWdBTElBUkJRR3NrQUF1akFnRURmeU1BUVVCcUlnUWtBQ0FFUVFocUlBSWdBeWdDRUJFQkFBSkFJQVF0QUFnRVFDQUVJQVF0QUFraUJUb0FEeUFBQW44Z0FTZ0NBQ0lHUVJBZ0JSQ1pCRVVFUUNBQ0lBTW9BaFFSQkFBZ0FDQUZPZ0FFUVFVTUFRc2pBRUVRYXlJQkpBQWdBVUVFYWlBR1FSQVFaeUFCS0FJSUlRVWdCRUVNSUFFb0Fnd2dBU2dDQkNJR0d6WUNCQ0FFUWFpSDBnQWdCU0FHR3pZQ0FDQUJRUkJxSkFBZ0JFRVlOZ0kwSUFSQkdUWUNMQ0FFUVFJMkFoUWdCRUdjenRJQU5nSVFJQVJDQWpjQ0hDQUVJQVFwQXdBM0FqZ2dCQ0FFUVE5cU5nSXdJQVFnQkVFNGFqWUNLQ0FFSUFSQktHbzJBaGdnQUVFSWFpQUVRUkJxRUo0RElBQWdBaUFES0FJTUVRWUFOZ0lFUVFFTE5nSUFEQUVMSUFCQkFEWUNBQXNnQkVGQWF5UUFDK01CQVFKL0l3QkJRR29pQkNRQUlBUkJDR29nQWlBREtBSVFFUUVBQWtBZ0JDMEFDQVJBSUFRZ0JDMEFDU0lGT2dBUElBQUNmeUFCS0FJQUlnRWdCUkR5Q1VVRVFDQUNJQU1vQWhRUkJBQWdBQ0FGT2dBRVFRVU1BUXNnQkNBQkVNMEZJQVJCR0RZQ05DQUVRUmsyQWl3Z0JFRUNOZ0lVSUFSQm5NN1NBRFlDRUNBRVFnSTNBaHdnQkNBRUtRTUFOd0k0SUFRZ0JFRVBhallDTUNBRUlBUkJPR28yQWlnZ0JDQUVRU2hxTmdJWUlBQkJDR29nQkVFUWFoQ2VBeUFBSUFJZ0F5Z0NEQkVHQURZQ0JFRUJDellDQUF3QkN5QUFRUUEyQWdBTElBUkJRR3NrQUF2akFRRUNmeU1BUVVCcUlnUWtBQ0FFUVFocUlBSWdBeWdDRUJFQkFBSkFJQVF0QUFnRVFDQUVJQVF0QUFraUJUb0FEeUFBQW44Z0FTZ0NBQ0lCSUFVUThnbEZCRUFnQkNBQkVNMEZJQVJCR0RZQ05DQUVRUmsyQWl3Z0JFRUNOZ0lVSUFSQi9NM1NBRFlDRUNBRVFnSTNBaHdnQkNBRUtRTUFOd0k0SUFRZ0JFRVBhallDTUNBRUlBUkJPR28yQWlnZ0JDQUVRU2hxTmdJWUlBQkJDR29nQkVFUWFoQ2VBeUFBSUFJZ0F5Z0NEQkVHQURZQ0JFRUJEQUVMSUFJZ0F5Z0NGQkVFQUNBQUlBVTZBQVJCQlFzMkFnQU1BUXNnQUVFQU5nSUFDeUFFUVVCckpBQUw4Z0VCQTM4akFFRWdheUlJSkFBZ0FVRUpPZ0FZQWtBQ1FBSkFBa0FnQmtVRVFDQUlJQWM2QUJOQkFDRUhJQWhCRkdvZ0FTQUlRUk5xUVFFZ0JDQUZRUUFRQ2lBSUtBSWNJUVlnQ0M4QUdTRUpJQWd0QUJnaUNrRUJhdzRDQVFNQ0N5QUFJQUVnQWlBRElBUWdCUkRQQkF3REMwRzg1c0VBUVNkQnJPYkJBQkNjQmdBTElBaEJDR29nQmlBRUlBVkJyT2JCQUJDZkJ5QUlRUlJxSUFFZ0FpQURJQWdvQWdnZ0NDZ0NEQkRQQkNBSUtBSWNJQVpxSVFZZ0NDZ0NGQ0VISUFndkFCa2hDU0FJTFFBWUlRb0xJQUFnQ1RzQUJTQUFJQW82QUFRZ0FDQUdOZ0lJSUFBZ0J6WUNBQXNnQ0VFZ2FpUUFDOGNCQVFWL0FrQWdBU2dDQUNJQ0lBRW9BZ1JHQkVBTUFRdEJBU0VHSUFFZ0FrRUJhallDQUNBQ0xRQUFJZ1BBUVFCT0RRQWdBU0FDUVFKcU5nSUFJQUl0QUFGQlAzRWhCQ0FEUVI5eElRVWdBMEhmQVUwRVFDQUZRUVowSUFSeUlRTU1BUXNnQVNBQ1FRTnFOZ0lBSUFJdEFBSkJQM0VnQkVFR2RISWhCQ0FEUWZBQlNRUkFJQVFnQlVFTWRISWhBd3dCQ3lBQklBSkJCR28yQWdBZ0JVRVNkRUdBZ1BBQWNTQUNMUUFEUVQ5eElBUkJCblJ5Y2lFREN5QUFJQU0yQWdRZ0FDQUdOZ0lBQzhvQkFRUi9JQUVnQW1zaUJrRUFJQUVnQms4YklRWkJBQ0FEYXlFSFFRQWdBMEVDZEdzaENDQUFJQUpCQW5ScUlRTUNRQUpBQTBBZ0JVRUlSZzBCSUFJZ0Iyb2lBQ0FCVHcwQ0lBVWdCa2NFUUNBRElBTWdDR29vQWdBZ0F5Z0NBQ0FFZUVHRGhvd1ljWE1pQUVFRWRFSHc0Y09IZjNFZ0FFRUNkRUg4K2ZObmNYTWdBRUVHZEVIQWdZT0dmSEZ6SUFCek5nSUFJQVZCQVdvaEJTQURRUVJxSVFNZ0FrRUJhaUVDREFFTEN5QUNJQUZCbktEQUFCREdCQUFMRHdzZ0FDQUJRWXlnd0FBUXhnUUFDOThCQWdsL0FYNGpBRUVRYXlJQ0pBQVE3UWNpQlNBQktBSUFJZ012QVlvQklnWWdBU2dDQ0NJRVFYOXphaUlIT3dHS0FTQURRZHdBYWlJSklBUkJBblJxS0FJQUlRb2dBeUFFUVFOMGFpa0NBQ0VMSUFKQkNHb2dCeUFGUWR3QWFoRENCeUFKSUFSQkFXb2lDRUVDZEdvZ0JpQUlheUlHSUFJb0FnZ2dBaWdDREJEeUJpQUNJQWNnQlJEQkJ5QURJQWhCQTNScUlBWWdBaWdDQUNBQ0tBSUVFUE1HSUFBZ0N6Y0NCQ0FBSUFvMkFnQWdBeUFFT3dHS0FTQUFRUUEyQWhnZ0FDQUZOZ0lVSUFBZ0F6WUNEQ0FBSUFFb0FnUTJBaEFnQWtFUWFpUUFDNVVDQVFOL0l3QkJRR29pQWlRQUlBSkJBRFlDTEFOQUlBTkJJRWNFUUNBQ1FUQnFJQUVnQTJvUWh3VWdBa0VNYWlBRGFpSUVRUWhxSUFKQk9Hb3BBZ0EzQWdBZ0JDQUNLUUl3TndJQUlBSWdBaWdDTEVFQmFpSUVOZ0lzSUFOQkVHb2hBd3dCQ3dzZ0JFRUJUUVJBSXdCQk1Hc2lBQ1FBSUFCQkFqWUNCQ0FBSUFRMkFnQWdBRUVDTmdJTUlBQkJ2SWpKQURZQ0NDQUFRZ0kzQWhRZ0FFRWFOZ0lzSUFCQkdqWUNKQ0FBSUFCQklHbzJBaEFnQUNBQVFRUnFOZ0lvSUFBZ0FEWUNJQ0FBUVFocVFiQ0p5UUFRcXdjQUN5QUFJQUlwQWd3M0FBQWdBRUVZYWlBQ1FTUnFLUUlBTndBQUlBQkJFR29nQWtFY2Fpa0NBRGNBQUNBQVFRaHFJQUpCRkdvcEFnQTNBQUFnQWtGQWF5UUFDNHdDQVFKL0l3QkJNR3NpQUNRQUFrQUNRRUhzMjlvQUtBSUFSUVJBUVlUYzJnQW9BZ0FoQVVHRTNOb0FRUUEyQWdBZ0FVVU5BU0FBUVFScUlBRVJCQUJCN052YUFDZ0NBQ0lCRFFJZ0FRUkFRZkRiMmdBb0FnQkI5TnZhQUNnQ0FCRDBDUXRCN052YUFFRUJOZ0lBUWZEYjJnQWdBQ2tDQkRjQ0FFSDQyOW9BSUFCQkRHb3BBZ0EzQWdCQmdOemFBQ0FBUVJScUtBSUFOZ0lBQ3lBQVFUQnFKQUFQQ3lBQVFRQTJBaWdnQUVFQk5nSWNJQUJCOE1yYUFEWUNHQ0FBUWdRM0FpQWdBRUVZYWtIWXk5b0FFS3NIQUFzZ0FDZ0NCQ0FBS0FJSUVQUUpJQUJCQURZQ0tDQUFRUUUyQWh3Z0FFSDR5OW9BTmdJWUlBQkNCRGNDSUNBQVFSaHFRWURNMmdBUXF3Y0FDOE1CQWdGL0FYNGpBRUVRYXlJRkpBQWdBQUovQWtBZ0F5QUVha0VCYTBFQUlBTnJjYTBnQWExK0lnWkNJSWhRQkVBZ0JxY2lCRUdBZ0lDQWVDQURhMDBOQVFzZ0FFRUFOZ0lFUVFFTUFRc2dCRVVFUUNBQUlBTTJBZ2dnQUVFQU5nSUVRUUFNQVFzQ2Z5QUNCRUFnQlNBRElBUkJBUkRWQmlBRktBSUFEQUVMSUFWQkNHb2dBeUFFRU1jR0lBVW9BZ2dMSWdJRVFDQUFJQUkyQWdnZ0FDQUJOZ0lFUVFBTUFRc2dBQ0FFTmdJSUlBQWdBellDQkVFQkN6WUNBQ0FGUVJCcUpBQUwwd0VDQTM4QmZpTUFRVUJxSWdJa0FDQUJLQUlFSVFNZ0FpQUJLQUlJUVFBZ0FTZ0NBQ0lCR3pZQ0tDQUNJQU0yQWlRZ0FpQUJOZ0lnSUFKQkFEWUNIQ0FDSUFGQkFFY2lCRFlDR0NBQ0lBTTJBaFFnQWlBQk5nSVFJQUpCQURZQ0RDQUNJQVEyQWdnRFFBSkFJQUpCTEdvaUJDQUNRUWhxRUtNQklBSW9BaXdpQVVVTkFDQUJJQUlvQWpRaUEwRURkR29wQWdBaUJVTC8vd09EUWdSUkRRQWdCQ0FBSUFFZ0EwRUNkR29vQWx3UTB3SWdBaWdDTEVVTkFTQUVJQVVRUVF3QkN3c2dBa0VJYWhDMEJ5QUNRVUJySkFBTDNRRUJBWDhqQUVFZ2F5SURKQUFnQXlBQ05nSU1JQU1nQWpvQUV3SkFJQUVvQWdBRVFBSkFJQUVnQTBFTWFoQ3NBaUlDQkVBZ0EwRVVhaUFDUVFScUtBSUFJQUpCQ0dvb0FnQVEvd1FNQVFzZ0F5QUJLQUpVUVFBZ0FTZ0NVRUdBZ0lDQWVFY2JJQUVvQWxoQm5NVEtBQkRUQnlBRFFSUnFJQU1vQWdBZ0F5Z0NCQ0FEUVJOcUVLc0JDeUFBSUFNcEFoUTNBZ0FnQUVFSWFpQURRUnhxS0FJQU5nSUFEQUVMSUFCQmlQbk5BQ0FCS0FKVUlBRW9BbEJCZ0lDQWdIaEdJZ0FiUVlBQ0lBRW9BbGdnQUJzZ0EwRVRhaENyQVFzZ0EwRWdhaVFBQzkwQkFRRi9Jd0JCSUdzaUF5UUFJQU1nQWpZQ0RDQURJQUk2QUJNQ1FDQUJLQUlBQkVBQ1FDQUJJQU5CREdvUXJBSWlBZ1JBSUFOQkZHb2dBa0VFYWlnQ0FDQUNRUWhxS0FJQUVQOEVEQUVMSUFNZ0FTZ0NURUVBSUFFb0FraEJnSUNBZ0hoSEd5QUJLQUpRUWVERXlnQVEwd2NnQTBFVWFpQURLQUlBSUFNb0FnUWdBMEVUYWhDckFRc2dBQ0FES1FJVU53SUFJQUJCQ0dvZ0EwRWNhaWdDQURZQ0FBd0JDeUFBUVlqNXpRQWdBU2dDVENBQktBSklRWUNBZ0lCNFJpSUFHMEdBQWlBQktBSlFJQUFiSUFOQkUyb1Fxd0VMSUFOQklHb2tBQXZSQVFJRWZ3RitJd0JCOEFGcklnSWtBQ0FDUWRnQWFpRUVBa0FDUUFOQUlBSkIwQUJxSUFFUWhRUWdBaWdDV0VFTVJnMEJJQUl2QVZRaEF5QUNLQUpRSVFVZ0FpQUVRY2dBL0FvQUFDQUNRYUFCYWlBRklBTWdBaUFCS0FJa0tBSUFFUUFBSUFJUW5nUWdBaWdDcUFFaUEwRU1SZzBBQ3lBQ0tRT2dBU0VHSUFKQkRHb2dBa0dzQVdwQnhBRDhDZ0FBSUFJZ0F6WUNDQ0FDSUFZM0F3QWdBQ0FDUWRBQS9Bb0FBQXdCQ3lBQ1FkQUFhaEN5Q0NBQVFRdzJBZ2dnQWtFTU5nSUlJQUlRc2dnTElBSkI4QUZxSkFBTHpBRUJCSDhqQUVId0FHc2lBaVFBSUFKQktHb2dBUkFZSUFKQkVHb2lBeUFDUVRScUtBSUFOZ0lBSUFJZ0Fpa0NMRGNEQ0FKQUlBSW9BaWdpQlVHZmdJQ0FlRWNFUUNBQ0tBSTRJUUVnQUNBQ0tRTUlOd0lFSUFBZ0FUWUNFQ0FBUVF4cUlBTW9BZ0EyQWdBTUFRc2dBa0VnYWlBREtBSUFOZ0lBSUFJZ0Fpa0RDRGNER0NBQ1FTaHFJZ1FnQVVFSWFpSURRWjNWeVFCQkN4QlFJQVFRaHdRZ0JDQURRZGJVeVFCQkJoQlFJQVFRaHdRZ0FTQUNRUmhxRU44R0N5QUFJQVUyQWdBZ0FrSHdBR29rQUF2RUFRRUdmd0pBSUFCRkRRQWdBMEgvL3dOeElRZ0RRQ0FBTHdIMkJpSUpRUU4wSVFaQmZ5RUZJQUFoQXdKQUEwQWdCa1VFUUNBSklRVU1BZ3NDZnlBREtBSUFJZ1FnQWtjRVFDQUNJQVJMSUFJZ0JFbHJEQUVMSUFnZ0EwRUVhaThCQUNJRVN5QUVJQWhMYXdzaEJDQURRUWhxSVFNZ0JVRUJhaUVGSUFaQkNHc2hCZ0pBSUFSQi93RnhEZ0lBQVFJTEN5QUFJQVZCeUFCc2FrSFlBR29oQnd3Q0N5QUJSUTBCSUFGQkFXc2hBU0FBSUFWQkFuUnFLQUw0QmlFQURBQUxBQXNnQnd2UkFRRUVmeU1BUVJCcklnSWtBRUVCSVFRZ0FBSi9BMEFnQWtFSWFpQUJFUGtFSUFJdEFBZ0VRQ0FDTFFBSkRBSUxBa0FnQVNnQ0lDSURSUTBBSUFNZ0FTZ0NKRVlOQUNBQklBTkJBV28yQWlBZ0F5MEFBRUVCZEVHSStjMEFhaThCQUNFRkVMc0lJZ01nQlVFSWRDQUZRUWgyY2pzQUFDQUJLQUlBSUFFb0FnZ1FpUWtnQVNBRFFRSnFOZ0lNSUFGQkFqWUNDQ0FCSUFNMkFnUWdBU0FETmdJQURBRUxDeUFDSUFGQkVHb1ErUVFnQWkwQUFDRUVJQUl0QUFFTE9nQUJJQUFnQkVFQmNUb0FBQ0FDUVJCcUpBQUx1Z0VCQW44akFFRWdheUlESkFBQ1FBSi9RUUFnQVNBQklBSnFJZ0pMRFFBYVFRQkJDQ0FDSUFBb0FnQWlBVUVCZENJRUlBSWdCRXNiSWdJZ0FrRUlUUnNpQkVFQVNBMEFHa0VBSVFJZ0F5QUJCSDhnQXlBQk5nSWNJQU1nQUNnQ0JEWUNGRUVCQlNBQ0N6WUNHQ0FEUVFocUlBUWdBMEVVYWhEdkJDQURLQUlJUVFGSERRRWdBeWdDRUNFQUlBTW9BZ3dMSUFCQnBLTEFBQkRNQ0FBTElBTW9BZ3doQVNBQUlBUTJBZ0FnQUNBQk5nSUVJQU5CSUdva0FBdlBBUUVDZnlNQVFUQnJJZ0VrQUNBQlFRaHFJQUlnQXlnQ0VCRUJBQUpBSUFFdEFBZ0VRQ0FCSUFFdEFBa2lCRG9BRHlBRVFRbHJJZ1ZCRjAxQkFFRUJJQVYwUVpPQWdBUnhHMFVFUUNBQlFRRTJBaFFnQVVIa3pkSUFOZ0lRSUFGQ0FUY0NIQ0FCUVJnMkFpd2dBU0FCUVNocU5nSVlJQUVnQVVFUGFqWUNLQ0FBUVFocUlBRkJFR29RbmdNZ0FDQUNJQU1vQWd3UkJnQTJBZ1FnQUVFQk5nSUFEQUlMSUFJZ0F5Z0NGQkVFQUNBQVFRVTJBZ0FnQUNBRU9nQUVEQUVMSUFCQkFEWUNBQXNnQVVFd2FpUUFDOVFCQVFKL0l3QkJJR3NpQkNRQUFrQUNRQ0FCS0FJQUlnVUVRQ0FFSUFVZ0FTZ0NCQ0FDSUFNUTRRSWdCRUVFYWlFRklBUW9BZ0JGRFFFZ0JFRWNhaUFGUVFocUtBRUFOZ0VBSUFBZ0F6c0JDQ0FBSUFJMkFnUWdBQ0FCTmdJQUlBUWdCU2tCQURjQkZDQUFJQVFwQVJJM0FRb2dBRUVRYWlBRVFSaHFLUUVBTndFQURBSUxJQUJCQURZQ0RDQUFJQU03QVFnZ0FDQUNOZ0lFSUFBZ0FUWUNBQXdCQ3lBQUlBRTJBaEFnQUVFQU5nSUFJQUFnQlNrQ0FEY0NCQ0FBUVF4cUlBVkJDR29vQWdBMkFnQUxJQVJCSUdva0FBdUlBZ0VEZnlNQVFkQUFheUlDSkFBZ0FTZ0NBQ0lFSUFFb0FnUkhCRUFnQVNBRVFkZ0FhallDQUNBRUlRTUxJQUlnQXpZQ0JDQUNJQU5CeUFCcVFRQWdBeHMyQWdBQ1FDQUNLQUlBSWdFRVFDQUNJQUlvQWdRMkFnd2dBa0hFQUdvaUF5QUJLQUlFSUFFb0FnZ1FnZ0VnQWtFS05nSkFJQUpCT2pZQ09DQUNRUUkyQWlBZ0FrSDBtOGtBTmdJY0lBSkNBamNDS0NBQ0lBSkJER28yQWp3Z0FpQUROZ0kwSUFJZ0FrRTBhallDSkNBQ1FSQnFJQUpCSEdvUW53SWdBaWdDUkNJQlFZQ0FnSUI0UndSQUlBRWdBaWdDU0JDcENRc2dBRUVJYWlBQ1FSaHFLQUlBTmdJQUlBQWdBaWtDRURjQ0FBd0JDeUFBUVlDQWdJQjROZ0lBQ3lBQ1FkQUFhaVFBQy9nREFnaC9BWDRqQUVFZ2F5SUZKQUFDUUNBQUtBSUVRWUNBeEFCR0JFQWdBQ2dDRUNJRUlBQW9BZ2hHQkVBZ0FFRUlha0dFbTlJQUVOOEZDeUFBS0FJTUlBUkJBblJxSUFFMkFnQWdBQ0FFUVFGcU5nSVFEQUVMSUFBdkFRQWlCRUVEVFFSQUlBQWdCRUVCYWpzQkFDQUFRUVJxSUFSQkFuUnFJQUUyQWdBTUFRc2dCVUVNYWlFSElBRWhCRUVBSVFFakFFRWdheUlDSkFBZ0FpQUFMd0VBSWdOQkFYUkJCRUdjb3RJQUVPNERJQUpCQURZQ0hDQUNJQUlvQWdRaUNUWUNHQ0FDSUFJb0FnQWlDRFlDRkFKQUlBTkJCVWtFUUNBRElBaExCRUFnQWtFVWFrRUFJQU5CQkVFRUVPRUZJQUlvQWhnaENTQUNLQUljSVFFTElBTUVRQ0FBUVFScUlRWWdBU0FEYWlBSklBRkJBblJxSVFFRFFDQUJJQVlvQWdBMkFnQWdCa0VBTmdJQUlBWkJCR29oQmlBQlFRUnFJUUVnQTBFQmF5SUREUUFMSVFFTElBQkJBRHNCQUNBQ1FSQnFJQUUyQWdBZ0FpQUNLUUlVSWdvM0F3Z2dDcWNnQVVZRVFDQUNRUWhxUWF5aDBnQVEzd1VMSUFjZ0Fpa0RDRGNDQ0NBSFFZQ0F4QUEyQWdRZ0IwRVFhaUFCUVFGcU5nSUFJQUlvQWd3Z0FVRUNkR29nQkRZQ0FDQUNRU0JxSkFBTUFRc2dBMEVFUWF5aTBnQVF1QWtBQ3lBQUVLZ0lJQUJCRUdvZ0JVRWNhaWdDQURZQ0FDQUFRUWhxSUFWQkZHb3BBZ0EzQWdBZ0FDQUZLUUlNTndJQUN5QUZRU0JxSkFBTHlnRUJBbjhqQUVFd2F5SUVKQUFnQWlBREtBSU1FUVlBSVFVZ0JFRVlhaUFCS0FJQUlBSWdBeUFCS0FJRUtBSVVFUUFBQWtBZ0JDZ0NHRUVGUndSQUlBUkJFR29nQkVFb2Fpa0NBRGNEQUNBRVFRaHFJQVJCSUdvcEFnQTNBd0FnQkNBRUtRSVlOd01BREFFTElBUWdBU2dDQ0NBQ0lBTWdBU2dDRENnQ0ZCRUFBQXNnQkNnQ0FFRUZSd1JBSUFJZ0JTQURLQUlZRVFFQUN5QUFJQVFwQXdBM0FnQWdBRUVRYWlBRVFSQnFLUU1BTndJQUlBQkJDR29nQkVFSWFpa0RBRGNDQUNBRVFUQnFKQUFMdmdFQkFYOGpBRUVnYXlJRUpBQWdCRUVJYWlBQktBSUFJQUlnQXlBQktBSUVLQUlVRVFBQUFrQUNRQ0FFS0FJSVFRVkhCRUFnQkNnQ0NFRURSdzBCSUFBZ0JDa0NDRGNDQUNBQVFSQnFJQVJCR0dvcEFnQTNBZ0FnQUVFSWFpQUVRUkJxS1FJQU53SUFEQUlMSUFBZ0JDa0NDRGNDQUNBQVFSQnFJQVJCR0dvcEFnQTNBZ0FnQUVFSWFpQUVRUkJxS1FJQU53SUFEQUVMSUFBZ0FTZ0NDQ0FDSUFNZ0FTZ0NEQ2dDRkJFQUFDQUVRUWhxRU9vRUN5QUVRU0JxSkFBTHdBRUNBMzhCZmlNQVFSQnJJZ0lrQUFKQUlBSkJDQUovSUFGQkQwOEVRQ0FCUWYvLy8vOEJTdzBDUVg4Z0FVRURkRUVIYmtFQmEyZDJRUUZxREFFTFFRUkJDRUVRSUFGQkNFa2JJQUZCQkVrYkN4RENBeUFDS0FJRUlRRUNRQ0FDS0FJQUlnTkZCRUFnQUNBQ0tBSUlOZ0lJSUFBZ0FUWUNCQ0FBUVFBMkFnQU1BUXNnQWlrQ0NDRUZJQUZCQ1dvaUJBUkFJQU5CL3dFZ0JQd0xBQXNnQUNBRk53SUlJQUFnQVRZQ0JDQUFJQU0yQWdBTElBSkJFR29rQUE4TEVPY0dBQXZBQVFJQ2Z3RitJd0JCRUdzaUF5UUFBa0FnQXlBQkFuOGdBa0VQVHdSQUlBSkIvLy8vL3dGTERRSkJmeUFDUVFOMFFRZHVRUUZyWjNaQkFXb01BUXRCQkVFSVFSQWdBa0VJU1JzZ0FrRUVTUnNMRU1JRElBTW9BZ1FoQVFKQUlBTW9BZ0FpQWtVRVFDQUFJQU1vQWdnMkFnZ2dBQ0FCTmdJRUlBQkJBRFlDQUF3QkN5QURLUUlJSVFVZ0FVRUphaUlFQkVBZ0FrSC9BU0FFL0FzQUN5QUFJQVUzQWdnZ0FDQUJOZ0lFSUFBZ0FqWUNBQXNnQTBFUWFpUUFEd3NRNXdZQUM4QUJBUWwvSUFBZ0FDMEFDQ0lDSUFBdEFBQWlCRWxCQTNScUlnWWdBRUVZUVJBZ0FDMEFHQ0FBTFFBUVNTSUZHMm9pQXlBQUlBSWdCRTlCQTNScUlnSWdBRUVRUVJnZ0JSdHFJZ0F0QUFBZ0FpMEFBRWtpQkJzZ0F5MEFBQ0FHTFFBQVNTSUZHeUlITFFBQUlRa2dBQ0FDSUFNZ0JSc2dCQnNpQ0MwQUFDRUtJQUVnQXlBR0lBVWJLUUlBTndJQUlBRWdDQ0FISUFrZ0Nrc2lBeHNwQWdBM0FnZ2dBU0FISUFnZ0F4c3BBZ0EzQWhBZ0FTQUNJQUFnQkJzcEFnQTNBaGdMdmdFQkFYOGpBRUVnYXlJRUpBQWdCRUVJYWlBQktBSUFJQUlnQXlBQktBSUVLQUlVRVFBQUFrQUNRQ0FFS0FJSVFRVkhCRUFnQkNnQ0NFRURSdzBCSUFBZ0JDa0NDRGNDQUNBQVFSQnFJQVJCR0dvcEFnQTNBZ0FnQUVFSWFpQUVRUkJxS1FJQU53SUFEQUlMSUFBZ0JDa0NDRGNDQUNBQVFSQnFJQVJCR0dvcEFnQTNBZ0FnQUVFSWFpQUVRUkJxS1FJQU53SUFEQUVMSUFBZ0FTZ0NDQ0FDSUFNZ0FTZ0NEQ2dDRkJFQUFDQUVRUWhxRVBvRUN5QUVRU0JxSkFBTHZnRUJCbjhqQUVFUWF5SUdKQUFDZnlBQktBSUFJZ1FnQWtZRVFDQUJLQUlVSVFVZ0FTZ0NFQXdCQ3lBR1FRaHFJQVFnQVNnQ0JDQUNJQVJySWdjUXpnY2dBU2dDRUNFSUFrQWdCaWdDQ0NJRUlBUWdCaWdDREdvaUNVOE5BQU5BSUFRZ0NVOE5BU0FGSUFRdEFBQkJDa1pxSVFVZ0JFRUJhaUVFREFBTEFBc2dBU2dDRkNBRmFpRUZJQWNnQ0dvTElRUWdBQ0FGTmdJVUlBQWdCRFlDRUNBQUlBTTJBZ1FnQUNBQ05nSUFJQUFnQVNrQ0NEY0NDQ0FHUVJCcUpBQUx4d0VCQW44akFFRXdheUlFSkFBZ0JDQUNJQU1vQWhBUkFRQUNRQ0FFTFFBQUJFQWdCQ0FFTFFBQklnVTZBQWNnQUFKL0lBVWdBUzBBQUVjRVFDQUVRUUkyQWd3Z0JFRzR6ZElBTmdJSUlBUkNBamNDRkNBRVFSZzJBaXdnQkVFWU5nSWtJQVFnQVRZQ0lDQUVJQVJCSUdvMkFoQWdCQ0FFUVFkcU5nSW9JQUJCQ0dvZ0JFRUlhaENlQXlBQUlBSWdBeWdDREJFR0FEWUNCRUVCREFFTElBSWdBeWdDRkJFRUFDQUFJQVU2QUFSQkJRczJBZ0FNQVFzZ0FFRUFOZ0lBQ3lBRVFUQnFKQUFMMFFFQ0JIOEJmaU1BUVNCcklnRWtBQ0FBS0FJRUlnTUVRQ0FBS0FJQUlRSUNRQ0FBS0FJTUlnQkZEUUFnQWlrREFDRUZJQUVnQURZQ0dDQUJJQUkyQWhCQkFTRUFJQUVnQWlBRGFrRUJhallDRENBQklBSkJDR28yQWdnZ0FTQUZRbitGUW9DQmdvU0lrS0RBZ0grRE53TUFBMEFnQUVVTkFTQUJFSjBFSVFRZ0FTQUJLQUlZUVFGcklnQTJBaGdnQkVFTWF5Z0NBQ0FFUVFocktBSUFFSzRKREFBTEFBc2dBVUVRUVFnZ0EwRUJhaERxQXlBQ0lBRW9BZ2hySUFFb0FnQWdBU2dDQkJEUUNBc2dBVUVnYWlRQUM5RUJBZ1IvQVg0akFFRWdheUlCSkFBZ0FDZ0NCQ0lEQkVBZ0FDZ0NBQ0VDQWtBZ0FDZ0NEQ0lBUlEwQUlBSXBBd0FoQlNBQklBQTJBaGdnQVNBQ05nSVFRUUVoQUNBQklBSWdBMnBCQVdvMkFnd2dBU0FDUVFocU5nSUlJQUVnQlVKL2hVS0FnWUtFaUpDZ3dJQi9nemNEQUFOQUlBQkZEUUVnQVJDZEJDRUVJQUVnQVNnQ0dFRUJheUlBTmdJWUlBUkJER3NvQWdBZ0JFRUlheWdDQUJDcENRd0FDd0FMSUFGQkVFRUlJQU5CQVdvUTZnTWdBaUFCS0FJSWF5QUJLQUlBSUFFb0FnUVEwQWdMSUFGQklHb2tBQXZGQVFFQmZ5TUFRVEJySWdFa0FDQUJRUWhxSUFJZ0F5Z0NFQkVCQUFKQUlBRXRBQWdFUUNBQklBRXRBQWtpQkRvQUR5QUFBbjhnQkVIZkFYRkJ3UUJyUWY4QmNVRWFUd1JBSUFGQkFUWUNGQ0FCUWVUTjBnQTJBaEFnQVVJQk53SWNJQUZCR0RZQ0xDQUJJQUZCS0dvMkFoZ2dBU0FCUVE5cU5nSW9JQUJCQ0dvZ0FVRVFhaENlQXlBQUlBSWdBeWdDREJFR0FEWUNCRUVCREFFTElBSWdBeWdDRkJFRUFDQUFJQVE2QUFSQkJRczJBZ0FNQVFzZ0FFRUFOZ0lBQ3lBQlFUQnFKQUFMM0FFQkFYOGpBRUVRYXlJR0pBQWdBQ2dDQUNBQlFRWWdBQ2dDQkNnQ0RCRUNBQ0VCSUFaQkFEb0FEU0FHSUFFNkFBd2dCaUFBTmdJSUlBWkJDR3BCanRUU0FFRUhJQUpCSXhDSkFrR1YxTklBUVFnZ0EwRWRFSWtDUWEzVTBnQkJCU0FFSUFVUWlRSWhBU0FHTFFBTklnSWdCaTBBRENJRGNpRUFBa0FnQTBFQmNTQUNRUUZIY2cwQUlBRW9BZ0FpQUMwQUNrR0FBWEZGQkVBZ0FDZ0NBRUhYOXNBQVFRSWdBQ2dDQkNnQ0RCRUNBQ0VBREFFTElBQW9BZ0JCMXZiQUFFRUJJQUFvQWdRb0Fnd1JBZ0FoQUFzZ0JrRVFhaVFBSUFCQkFYRUx4UUVCQVg4akFFRWdheUlHSkFBZ0JrRU1haUFCSUFJZ0F4RFBBU0FHS0FJUUlRRUNRQ0FHS0FJTUlnSkJuNENBZ0hoSEJFQWdBQ0FHS1FJVU53SUlJQUJCRUdvZ0JrRWNhaWdDQURZQ0FDQUFJQUUyQWdRZ0FDQUNOZ0lBREFFTElBWkJER29nQkNBRklBRVFtZ0lnQmlnQ0RFR2ZnSUNBZUVjRVFDQUFJQVlwQWd3M0FnQWdBRUVRYWlBR1FSeHFLQUlBTmdJQUlBQkJDR29nQmtFVWFpa0NBRGNDQUF3QkN5QUFJQVlvQWh3MkFnUWdBRUdmZ0lDQWVEWUNBQXNnQmtFZ2FpUUFDODBCQWdaL0FYNUJnQUVoQXlBQktBSU1JZ0lvQWdBaUJDQUVJQUVvQWdnaUJtdEJBblVpQldvaUJ5a0FBQ0lJSUFoQ0FZYURRb0NCZ29TSWtLREFnSCtEZXFkQkEzWWdCQ0FDS0FJRUlBVkJDR3R4YWlJRUtRQUFJZ2dnQ0VJQmhvTkNnSUdDaElpUW9NQ0FmNE41cDBFRGRtcEJCMDBFUUNBQ0lBSW9BZ2hCQVdvMkFnaEIvd0VoQXdzZ0J5QURPZ0FBSUFSQkNHb2dBem9BQUNBQUlBSTJBaFFnQUNBRk5nSVFJQUFnQVNrREFEY0RDQ0FDSUFJb0FneEJBV3MyQWd3Z0FDQUdRUVJyS0FJQU5nSUFDNzBCQWdGK0FuOENRQ0FEclNJSElBRkJwcktGaWdOc0lna2dBVUc1ODkzeGVXeHpyWDVDSUlpbklnZ2dBMGtFUUNBRklBRWdBaUFJUVFGMGFpOEJBR3BCdWZQZDhYbHNJQWx6clNBSGZrSWdpS2NpQWswTkFTQUVJQUpCQTNScUtRSUFJZ2VuSUFGSEJFQWdBQ0FHS0FFQU5nRUFJQUJCQkdvZ0JrRUVhaThCQURzQkFBOExJQUJCQVRzQkFDQUFJQWRDTUlnOUFRUWdBQ0FIUWlDSVBRRUNEd3NnQ0NBRFFhVEsyZ0FReGdRQUN5QUNJQVZCdE1yYUFCREdCQUFMclFFQkJIOGpBRUdBQW1zaUJTUUFJQVVnQUVHQUF2d0tBQUFnQkNBRGF5SUFJQUlnQVdzaUFpQUFJQUpKR3lFQ1FRQWhBRUVBSVFRRFFDQUNCRUFnQlNBRVFRRnFJZ1JCL3dGeGFpSUdJQVVnQmkwQUFDSUhJQUJxSWdCQi93RnhhaUlJTFFBQU9nQUFJQWdnQnpvQUFDQURJQUV0QUFBZ0JTQUhJQVl0QUFCcVFmOEJjV290QUFCek9nQUFJQUpCQVdzaEFpQURRUUZxSVFNZ0FVRUJhaUVCREFFTEN5QUZRWUFDYWlRQUM3VUJBUVIvSXdCQkVHc2lCQ1FBQWtBZ0FDQUFLQUlJSWdJZ0FVa0VmeUFDSVFNZ0FTQUNheUlGSUFBb0FnQWdBbXRMQkVBZ0JFRUlhaUFBSUFJZ0JVRUJRUUVROGdFZ0JDZ0NDQ0lEUVlHQWdJQjRSdzBDSUFBb0FnZ2hBd3NnQWtGL2N5QUJhaUVCSUFBb0FnUWdBMm9oQWdOQUlBSkJBRG9BQUNBQkJFQWdBVUVCYXlFQklBSkJBV29oQWd3QkN3c2dBeUFGYWdVZ0FRczJBZ2dnQkVFUWFpUUFEd3NnQXlBRUtBSU1RWnpVMmdBUXpBZ0FDN3dCQVFOL0l3QkJNR3NpQXlRQUlBTkJJR3BDQURjREFDQURRUmhxUWdBM0F3QWdBMEVRYWtJQU53TUFJQU5DQURjRENBTkFBa0FnQTBFb2FpSUVJQUVnQTBFSWFrRWdFRWtDUUFKQUlBTXRBQ2dpQlVFRVJ3UkFJQVFRdWdZTkFpQUFJQU1wQXlnM0FnQU1BUXNnQXlnQ0xDSUJRU0ZQRFFJZ0FpQURRUWhxSWdJZ0FTQUNhaERJQmlBQVFRUTZBQUFnQUNBQk5nSUVDeUFEUVRCcUpBQVBDeUFGSUFNb0Fpd1Fwd1VNQVFzTElBRkJJRUd3eXNrQUVMZ0pBQXU5QVFFQmZ5TUFRVEJySWdFa0FDQUJRUWhxSUFJZ0F5Z0NFQkVCQUFKQUlBRXRBQWdFUUNBQklBRXRBQWtpQkRvQUR5QUFBbjhnQkVINEFYRkJNRWNFUUNBQlFRRTJBaFFnQVVIa3pkSUFOZ0lRSUFGQ0FUY0NIQ0FCUVJnMkFpd2dBU0FCUVNocU5nSVlJQUVnQVVFUGFqWUNLQ0FBUVFocUlBRkJFR29RbmdNZ0FDQUNJQU1vQWd3UkJnQTJBZ1JCQVF3QkN5QUNJQU1vQWhRUkJBQWdBQ0FFT2dBRVFRVUxOZ0lBREFFTElBQkJBRFlDQUFzZ0FVRXdhaVFBQzlRQkFnSi9BWDRqQUVFUWF5SUZKQUFnQUFKL0FrQWdBeUFFYWtFQmEwRUFJQU5yY2EwZ0FhMStJZ2RDSUloUUJFQWdCNmNpQkVHQWdJQ0FlQ0FEYTAwTkFRc2dBRUVBTmdJRVFRRU1BUXNnQkVVRVFDQUFJQU0yQWdnZ0FFRUFOZ0lFUVFBTUFRc2dCVUVJYWlFR1FZRGcyZ0F0QUFBYUFuOGdBa1VFUUNBRUlBTVFvQWdNQVFzZ0JCRDBCZ3NoQWlBR0lBUTJBZ1FnQmlBQ05nSUFJQVVvQWdnaUFnUkFJQUFnQWpZQ0NDQUFJQUUyQWdSQkFBd0JDeUFBSUFRMkFnZ2dBQ0FETmdJRVFRRUxOZ0lBSUFWQkVHb2tBQXUwQVFJQmZ3RitJd0JCSUdzaEFpQUFJQUVvQWdCQkFVWUVmaUFDUVJocUlBRkJHR29wQXdBM0F3QWdBa0VRYWlBQlFSQnFLUU1BTndNQUlBSWdBU2tEQ0RjRENFSUJCU0FEQ3pjREFDQUFJQUlwQXdnM0F3Z2dBQ0FCS1FNd053TXdJQUFnQVNzREtEa0RLQ0FBSUFFcEF5QTNBeUFnQUVFNGFpQUJRVGhxS1FNQU53TUFJQUJCUUdzZ0FVRkFheWtEQURjREFDQUFRUkJxSUFKQkVHb3BBd0EzQXdBZ0FFRVlhaUFDUVJocUtRTUFOd01BQzVFRUFnbC9BWDRqQUVFd2F5SUtKQUFDUUNBQUtBSUlRWUNBeEFCR0JFQWdBQ2dDRkNJRklBQW9BZ3hHQkVBZ0FFRU1ha0dFbTlJQUVOZ0ZDeUFBSUFWQkFXbzJBaFFnQUNnQ0VDQUZRUU4wYWlJQUlBSTJBZ1FnQUNBQk9nQUFEQUVMSUFBdkFRQWlCVUVEVFFSQUlBQWdCVUVCYWpzQkFDQUFJQVZCQTNScUlnQWdBallDQ0NBQUlBRTZBQVFNQVFzZ0NrRU1haUVJSUFFaEJVRUFJUUVqQUVFZ2F5SURKQUFnQXlBQUx3RUFJZ1JCQVhSQkNFR2NvdElBRU80RElBTkJBRFlDSENBRElBTW9BZ1FpQmpZQ0dDQURJQU1vQWdBaUNUWUNGQUpBSUFSQkJVa0VRQ0FFSUFsTEJFQWdBMEVVYWtFQUlBUkJCRUVJRU9FRklBTW9BaGdoQmlBREtBSWNJUUVMSUFRRVFDQUFRUVJxSVFjZ0FTQUVhaUFHSUFGQkEzUnFJUUVEUUNBSExRQUFJUVlnQjBFQU9nQUFJQUVnQmpvQUFDQUhRUVJxSWdZb0FnQWhDeUFHUVFBMkFnQWdBVUVFYWlBTE5nSUFJQWRCQ0dvaEJ5QUJRUWhxSVFFZ0JFRUJheUlFRFFBTElRRUxJQUJCQURzQkFDQURRUkJxSUFFMkFnQWdBeUFES1FJVUlndzNBd2dnREtjZ0FVWUVRQ0FEUVFocVFheWgwZ0FRMkFVTElBZ2dBeWtEQ0RjQ0RDQUlRWUNBeEFBMkFnZ2dDRUVVYWlBQlFRRnFOZ0lBSUFNb0Fnd2dBVUVEZEdvaUFTQUNOZ0lFSUFFZ0JUb0FBQ0FEUVNCcUpBQU1BUXNnQkVFRVFheWkwZ0FRdUFrQUN5QUFFS2NJSUFBZ0NFRWsvQW9BQUFzZ0NrRXdhaVFBQzhnQkFRRi9Jd0JCRUdzaUN5UUFJQUFvQWdBZ0FTQUNJQUFvQWdRb0Fnd1JBZ0FoQVNBTFFRQTZBQTBnQ3lBQk9nQU1JQXNnQURZQ0NDQUxRUWhxSUFNZ0JDQUZJQVlRaVFJZ0J5QUlJQWtnQ2hDSkFpRUJJQXN0QUEwaUFpQUxMUUFNSWdOeUlRQUNRQ0FEUVFGeElBSkJBVWR5RFFBZ0FTZ0NBQ0lBTFFBS1FZQUJjVVVFUUNBQUtBSUFRZGYyd0FCQkFpQUFLQUlFS0FJTUVRSUFJUUFNQVFzZ0FDZ0NBRUhXOXNBQVFRRWdBQ2dDQkNnQ0RCRUNBQ0VBQ3lBTFFSQnFKQUFnQUVFQmNRdXBBUUlDZndGK0l3QkJFR3NpQkNRQUlBQUNmd0pBSUFJZ0EycEJBV3RCQUNBQ2EzR3RJQUd0ZmlJR1FpQ0lVQVJBSUFhbklnTkJnSUNBZ0hnZ0FtdE5EUUVMSUFCQkFEWUNCRUVCREFFTElBTkZCRUFnQUNBQ05nSUlJQUJCQURZQ0JFRUFEQUVMSUFSQkNHb2dBaUFERUw0SElBUW9BZ2dpQlFSQUlBQWdCVFlDQ0NBQUlBRTJBZ1JCQUF3QkN5QUFJQU0yQWdnZ0FDQUNOZ0lFUVFFTE5nSUFJQVJCRUdva0FBdThBUUlGZndGK0lBSW9BaEJCREd3aEF5QUNLQUlJSUFJb0FnQWhCQ0FDS0FJTUlnWWhBZ05BQWtBZ0EwVU5BQ0FDTFFBSUlnZEJBa1lOQUFKQUlBZEJBWEZGRFFBZ0Fpa0NBQ0lJUW9DQWdJQ0FnTUFBV2cwQUlBRWdCQ0FJUWhDSVFvQ0EvUDhQZ3lBSVFpQ0doRUlDaEJDdUJRc2dBa0VNYWlFQ0lBTkJER3NoQXlBRVFRRnFJUVFNQVFzTElBWVFwd2tnQUVFUWFpQUJRUkJxS0FJQU5nSUFJQUJCQ0dvZ0FVRUlhaWtDQURjQ0FDQUFJQUVwQWdBM0FnQUxzd0VCQW44akFFRkFhaUlFSkFBZ0FpQURLQUlNRVFZQUlRVWdCRUVvYWlBQktBSUFJQUlnQXlBQktBSUVLQUlVRVFBQUFrQUNRQ0FFS0FJb1FRVkhCRUFnQkVFVWFpQUVRVGhxS1FJQU53SUFJQVJCQ0RvQUFDQUVRUXhxSUFSQk1Hb3BBZ0EzQWdBZ0JDQUVLUUlvTndJRURBRUxJQVFnQVNnQ0NDQUNJQU1nQVNnQ0RDZ0NGQkVBQUNBRUxRQUFRUWhIRFFFTElBSWdCU0FES0FJWUVRRUFDeUFBSUFSQktQd0tBQUFnQkVGQWF5UUFDNmdCQVFOL0l3QkJFR3NpQXlRQVFRTWhBaUFBTFFBQUlnQWhCQ0FBUVFwUEJFQWdBeUFBSUFCQjVBQnVJZ1JCNUFCc2EwSC9BWEZCQVhRaUFrSGY5c0FBYWkwQUFEb0FEeUFESUFKQjN2YkFBR290QUFBNkFBNUJBU0VDQzBFQUlBQWdCQnRGQkVBZ0FrRUJheUlDSUFOQkRXcHFJQVJCQVhSQi9nRnhRZC8yd0FCcUxRQUFPZ0FBQ3lBQlFRRkJBVUVBSUFOQkRXb2dBbXBCQXlBQ2F4Q0RBU0FEUVJCcUpBQUxvZ0VBSXdCQjBBRnJJZ0VrQUNBQlFSaHFRUUJCd1FEOEN3QWdBVUVJYWtIWXNNa0FLUU1BTndNQUlBRkNBRGNERUNBQlFkQ3d5UUFwQXdBM0F3QWdBU0FDSUFNUXRnSWdBU0FFTmdKd0lBRWdBVUh3QUdvaUFrRURFTFlDSUFFZ0JUc0JjQ0FCSUFKQkFoQzJBaUFDSUFGQjRBRDhDZ0FBSUFGQjRBQnFJZ1FnQWhDM0FTQUFJQVJCRUNBRFFRVnFJZ0FnQUVFUVR4c1FvQVVnQVVIUUFXb2tBQXV6QVFFRWYwSGhDeUVDQTBBZ0FrRUNTVVVFUUNBQklBSkJBWFlpQXlBQmFpSUJJQUZCREd3aUJFR2sxdElBYWlnQ0FDQUFTeHNnQVNBQUlBUkJxTmJTQUdvb0FnQk5HeUVCSUFJZ0Eyc2hBZ3dCQ3d0QkNTRUNBa0FDUUNBQUlBRkJER3dpQTBHbzF0SUFhaWdDQUVzaUJBMEFJQU5CcE5iU0FHb29BZ0FnQUVzTkFDQUJJQVJxSWdCQjRBdExEUUVnQUVFTWJFR3MxdElBYWkwQUFDRUNDeUFDRHd0QjRRdEI0UXRCbk9UVEFCREdCQUFMbWdFQkJIOGpBRUVRYXlJSEpBQUNRQU5BSUFRZ0JrME5BU0FDSUFWTkJFQU1BZ3NnQlVFQUlBWWdBU0FGYWkwQUFDQURJQVpxTFFBQVJpSUpHMnRCQVdvaEJTQUdRUUZxUVFBZ0NSc2lCaUFFUncwQUMwRUJJUWdnQjBFSWFpQUJJQUlnQXlBRUlBVWdCR3NpQVVFQmFoQ1pBeUFIS0FJTUlBRWdCeWdDQ0VFQmNSc2hCZ3NnQUNBR05nSUVJQUFnQ0RZQ0FDQUhRUkJxSkFBTHJnRUJBbjhqQUVFd2F5SUZKQUFnQlVFSWFpSUVJQUVvQWdBZ0FpQURJQUVvQWdRb0FoUVJBQUFDUUFKQUlBVXRBQWhCQ0VZRVFDQUVRUVJ5SVFRZ0JTZ0NERUVEUncwQklBQkJDRG9BQUNBQUlBUXBBZ0EzQWdRZ0FFRVVhaUFFUVJCcUtRSUFOd0lBSUFCQkRHb2dCRUVJYWlrQ0FEY0NBQXdDQ3lBQUlBVkJDR3BCS1B3S0FBQU1BUXNnQUNBQktBSUlJQUlnQXlBQktBSU1LQUlVRVFBQUlBUVE2Z1FMSUFWQk1Hb2tBQXVuQVFFRWYwSFduOGNBSVFJQ1FBTkFJQU5CSVU4TkFTQUJJQUl2QVFCcklnVWdBa0VDYWk4QkFFOEVRQ0FDUVFacUlRSWdBMEVEYWlFRERBRUxDeUFEUVFKcUlRRWdBMEVlVFFSQUlBVWdBVUVCZEVIV244Y0FhaThCQUdvaUFVSC9BVWtFUUNBQlFRRjBRZGlieHdCcUx3RUFJZ0pCQUVjaEJBd0NDeUFCUWY4QlFiaUh5UUFReGdRQUN5QUJRU0ZCcUlmSkFCREdCQUFMSUFBZ0Fqc0JBaUFBSUFRN0FRQUxzd0VCQW44akFFRkFhaUlFSkFBZ0FpQURLQUlNRVFZQUlRVWdCRUVvYWlBQktBSUFJQUlnQXlBQktBSUVLQUlVRVFBQUFrQUNRQ0FFS0FJb1FRVkhCRUFnQkVFVWFpQUVRVGhxS1FJQU53SUFJQVJCREdvZ0JFRXdhaWtDQURjQ0FDQUVJQVFwQWlnM0FnUWdCRUVKT2dBQURBRUxJQVFnQVNnQ0NDQUNJQU1nQVNnQ0RDZ0NGQkVBQUNBRUxRQUFRUWxIRFFFTElBSWdCU0FES0FJWUVRRUFDeUFBSUFSQktQd0tBQUFnQkVGQWF5UUFDNjRCQVFKL0l3QkJNR3NpQlNRQUlBVkJDR29pQkNBQktBSUFJQUlnQXlBQktBSUVLQUlVRVFBQUFrQUNRQ0FGTFFBSVFRbEdCRUFnQkVFRWNpRUVJQVVvQWd4QkEwY05BU0FBUVFrNkFBQWdBQ0FFS1FJQU53SUVJQUJCRkdvZ0JFRVFhaWtDQURjQ0FDQUFRUXhxSUFSQkNHb3BBZ0EzQWdBTUFnc2dBQ0FGUVFocVFTajhDZ0FBREFFTElBQWdBU2dDQ0NBQ0lBTWdBU2dDRENnQ0ZCRUFBQ0FFRVBvRUN5QUZRVEJxSkFBTHZnRUJCSDhqQUVFUWF5SURKQUFnQVNnQ0RDRUNBa0FDUUFKQUFrQUNRQUpBSUFFb0FnUU9BZ0FCQWdzZ0FnMEJRUUVoQWtFQUlRRU1BZ3NnQWcwQUlBRW9BZ0FpQWlnQ0JDRUJJQUlvQWdBaEFnd0JDeUFBSUFFUW53SU1BUXNnQTBFRWFpQUJFUFFESUFNb0FnZ2hCQ0FES0FJRVFRRkdEUUVnQXlnQ0RDRUZJQUVFUUNBRklBSWdBZndLQUFBTElBQWdBVFlDQ0NBQUlBVTJBZ1FnQUNBRU5nSUFDeUFEUVJCcUpBQVBDeUFFSUFNb0FneEJsTmJTQUJETUNBQUx2UUVCQVg4akFFRVFheUlISkFBZ0FDZ0NBQ0FCSUFJZ0FDZ0NCQ2dDREJFQ0FDRUJJQWRCQURvQURTQUhJQUU2QUF3Z0J5QUFOZ0lJSUFkQkNHb2dBeUFFSUFVZ0JoQ0pBaUVCSUFjdEFBMGlBaUFITFFBTUlnTnlJUUFDUUNBRFFRRnhJQUpCQVVkeURRQWdBU2dDQUNJQUxRQUtRWUFCY1VVRVFDQUFLQUlBUWRmMndBQkJBaUFBS0FJRUtBSU1FUUlBSVFBTUFRc2dBQ2dDQUVIVzlzQUFRUUVnQUNnQ0JDZ0NEQkVDQUNFQUN5QUhRUkJxSkFBZ0FFRUJjUXVtQVFFRWYwSE9sY1VBSVFJQ1FBTkFJQU5CSVU4TkFTQUJJQUl2QVFCcklnVWdBa0VDYWk4QkFFOEVRQ0FDUVFacUlRSWdBMEVEYWlFRERBRUxDeUFEUVFKcUlRRWdBMEVlVFFSQVFRRWhCQ0FGSUFGQkFYUkJ6cFhGQUdvdkFRQnFJZ0ZCOEFGSkJFQWdBVUVCZEVIdWtjVUFhaThCQUNFQ0RBSUxJQUZCOEFGQm1JZkpBQkRHQkFBTElBRkJJVUdJaDhrQUVNWUVBQXNnQUNBQ093RUNJQUFnQkRzQkFBdXZBUUlFZndGK0lBRW9BaGdpQkFSL0lBRW9BaEFoQXlBQktBSUlJUUlnQVNrREFDRUdBMEFnQmtJQVVrVUVRQ0FCSUFOQmdBRnJJZ00yQWhBZ0FTQUNRUWhxSWdVMkFnZ2dBU0FDS1FNQVFuK0ZRb0NCZ29TSWtLREFnSCtESWdZM0F3QWdCU0VDREFFTEN5QUJJQVJCQVdzMkFoZ2dBU0FHUWdGOUlBYUROd01BSUFNZ0JucW5RUUYwUWZBQmNXc2lBVUVJYXlFQ0lBRkJFR3NGUVFBTElRRWdBQ0FDTmdJRUlBQWdBVFlDQUF2UEFRQWdBQ2dDNEFFZ0FDZ0M1QUVROVFrZ0FDZ0M3QUVnQUNnQzhBRVE5UWtnQUVHUUFXb1E2Z2NnQUVHRUFtb1FrZ1FnQUVHWUFtb1Frd1FnQUNnQytBRWdBQ2dDL0FFUXdRa2dBRUhBQVdvUXVnSWdBQ2dDQUVFQ1J3UkFJQUJCZ0FGcUVJUUJJQUFvQWlBZ0FDZ0NKQkQxQ1NBQUtBSXNJQUFvQWpBUTlRa2dBQ2dDT0NBQUtBSThFUFVKSUFBb0FrUWdBQ2dDU0JEMUNTQUFLQUpRSUFBb0FsUVE5UWtnQUNnQ1hDQUFLQUpnRVBVSklBQW9BbWdnQUNnQ2JCRDFDU0FBS0FKMElBQW9BbmdROVFrTEM2VUJBUVIvSXdCQklHc2lCQ1FBSUFJZ0F5Z0NEQ0lGRVFZQUlRWWdCRUVJYWlBQktBSUFJQUlnQXlBQktBSUVLQUlVRVFBQUFrQWdCQ2dDQ0VFRlJ3UkFJQUFnQkNrQ0NEY0NBQ0FBUVJCcUlBUkJHR29wQWdBM0FnQWdBRUVJYWlBRVFSQnFLUUlBTndJQURBRUxJQVFvQWhRaEFTQUVLQUlRSUFCQkJHb2dBaUFHSUFJZ0JSRUdBQ0FES0FJY0VRQUFJQUVROWdrZ0FFRUZOZ0lBQ3lBRVFTQnFKQUFMcFFFQkJIOGpBRUVnYXlJRUpBQWdBaUFES0FJTUlnVVJCZ0FoQmlBRVFRaHFJQUVvQWdBZ0FpQURJQUVvQWdRb0FoUVJBQUFDUUNBRUtBSUlRUVZIQkVBZ0FDQUVLUUlJTndJQUlBQkJFR29nQkVFWWFpa0NBRGNDQUNBQVFRaHFJQVJCRUdvcEFnQTNBZ0FNQVFzZ0JDZ0NFQ0VCSUFRb0Fnd2dBRUVFYWlBQ0lBWWdBaUFGRVFZQUlBTW9BaHdSQUFBZ0FSRDJDU0FBUVFVMkFnQUxJQVJCSUdva0FBdWZBUUVCZnlNQVFUQnJJZ01rQUNBRFFSeHFJQUJCa01MS0FFRUVFTThCQWtBZ0F5Z0NIRUdmZ0lDQWVFY0VRQ0FEUVJocUlBTkJMR29vQWdBMkFnQWdBMEVRYWlBRFFTUnFLUUlBTndNQUlBTWdBeWtDSERjRENBd0JDeUFEUVFocUlBTW9BaUFRdVFRTEFuOGdBeWdDQ0VHZmdJQ0FlRWNFUUNBRFFRaHFFTm9JUVFBTUFRc2dBeWdDRENBREtBSVFJQUVnQWhEc0J3c2dBMEV3YWlRQUM2VUJBUWQvQWtBZ0FFVU5BQU5BSUFCQjNBQnFJUVVnQUM4QjRnRWlDRUVNYkNFR1FYOGhCQUpBQTBBZ0JrVUVRQ0FJSVFRTUFnc2dCVUVJYWlFSklBVkJCR29oQ2lBRVFRRnFJUVFnQmtFTWF5RUdJQVZCREdvaEJRSkFJQUlnQXlBS0tBSUFJQWtvQWdBUStRWkIvd0Z4RGdJQUFRSUxDeUFBSUFSQkEzUnFJUWNNQWdzZ0FVVU5BU0FCUVFGcklRRWdBQ0FFUVFKMGFpZ0M1QUVoQUF3QUN3QUxJQWNMa1FFQkFuOENRQUpBQWtBQ1FBSkFBa0JCQWlBQUtBSUFJZ0ZCZ0lDQWdIaHpJZ0lnQWtFZlR4c09IZ0VCQWdFQkFRRUJCUVVGQlFVQkF3RUJBUUVCQVFVQkFRRUJBUVFCQVFBTElBQW9BZ1FnQUNnQ0NCQ3BDUXNQQ3lBQklBQW9BZ1FRcVFrUEN5QUFMUUFFSUFBb0FnZ1Fwd1VQQ3lBQUtBSUVJQUFvQWdnUXFRa1BDeUFBS0FJRUlBQW9BZ2dRcVFrTHpRRUJCMzhnQVNnQ0NDRUVJQUVvQWdRaENDQUJLQUlNSVFVZ0FTZ0NFQ0lHUVFnZ0Joc2lBaUFDSUFFb0FoUkJBQ0FHRzBISUFHeHFJZ0ZIQkVBZ0FTQUNhMEhJQUc0aEFRTkFJQVVnQXlBQ0VMTUJJUU1nQWtISUFHb2hBaUFCUVFGcklnRU5BQXNMSUFNaEFpQUVCRUFEUUNBSUlBZEJBM1JxSWdFb0FnUWlBd1JBSUFFb0FnQWhBUU5BSUFVZ0FpQUJFTE1CSVFJZ0FVSElBR29oQVNBRFFRRnJJZ01OQUFzTElBZEJBV29pQnlBRVJ3MEFDd3NnQUNBQ05nSUlJQUJCQVRZQ0JDQUFJQUkyQWdBTG9nRUJCbndnQUNBQ0t3TUlJZ01nQVNzREVDSUVvaUFDS3dNWUlnVWdBU3NER0NJR29xQTVBeGdnQUNBRUlBSXJBd0FpQktJZ0JpQUNLd01RSWdhaW9Ea0RFQ0FBSUFNZ0FTc0RBQ0lIb2lBRklBRXJBd2dpQ0tLZ09RTUlJQUFnQnlBRW9pQUlJQWFpb0RrREFDQUFJQU1nQVNzRElDSURvaUFGSUFFckF5Z2lCYUtnSUFJckF5aWdPUU1vSUFBZ0Fpc0RJQ0FFSUFPaUlBWWdCYUtnb0RrRElBdXVBUUVEZnlNQVFSQnJJZ1FrQUFKQUFrQWdBaUFEVFFSQUlBTWdBU2dDQkNJRlN3MEJJQUVvQWdBaEJpQUVRUVJxSUFNZ0Ftc2lBUkQwQXlBRUtBSUlJUU1nQkNnQ0JFRUJSZzBDSUFRb0Fnd2hCU0FCQkVBZ0JTQUNJQVpxSUFIOENnQUFDeUFBSUFFMkFnZ2dBQ0FGTmdJRUlBQWdBellDQUNBRVFSQnFKQUFQQ3lBQ0lBTkJ1TlhTQUJDM0NRQUxJQU1nQlVHNDFkSUFFTGdKQUFzZ0F5QUVLQUlNUVpUVzBnQVF6QWdBQzZVQkFRRi9Jd0JCSUdzaUJDUUFJQVFnQVNnQ0FDQUNJQU1nQVNnQ0JDZ0NGQkVBQUNBQUFuOGdCQ2dDQUVVRVFDQUFJQVFwQWdRM0FnUWdBRUVVYWlBRVFSUnFLUUlBTndJQUlBQkJER29nQkVFTWFpa0NBRGNDQUVFSURBRUxJQUFnQkNrREFEY0RDQ0FBUVNCcUlBUkJHR29wQXdBM0F3QWdBRUVZYWlBRVFSQnFLUU1BTndNQUlBQkJFR29nQkVFSWFpa0RBRGNEQUVFSEN6b0FBQ0FFUVNCcUpBQUxwUUVCQVg4akFFRWdheUlFSkFBZ0JDQUJLQUlBSUFJZ0F5QUJLQUlFS0FJVUVRQUFJQUFDZnlBRUtBSUFSUVJBSUFBZ0JDa0NCRGNDQkNBQVFSUnFJQVJCRkdvcEFnQTNBZ0FnQUVFTWFpQUVRUXhxS1FJQU53SUFRUWtNQVFzZ0FDQUVLUU1BTndNSUlBQkJJR29nQkVFWWFpa0RBRGNEQUNBQVFSaHFJQVJCRUdvcEF3QTNBd0FnQUVFUWFpQUVRUWhxS1FNQU53TUFRUWdMT2dBQUlBUkJJR29rQUF1WkFRRUVmeU1BUVNCcklnSWtBRUVJSUFBb0FnQWlCRUVCZENJRElBTkJDRTBiSWdOQkFFZ0VRRUVBUVFBZ0FSRE1DQUFMSUFJZ0JBUi9JQUlnQkRZQ0hDQUNJQUFvQWdRMkFoUkJBUVVnQlFzMkFoZ2dBa0VJYWlBRElBSkJGR29RN3dRZ0FpZ0NDRUVCUmdSQUlBSW9BZ3dnQWlnQ0VDQUJFTXdJQUFzZ0FpZ0NEQ0VCSUFBZ0F6WUNBQ0FBSUFFMkFnUWdBa0VnYWlRQUM2QUJBUVIvSXdCQklHc2lBeVFBUVFSQnZBRVFuZ2tpQkFSQUlBUWdBVFlDakFFZ0JFRUFPd0dLQVNBRVFRQTJBbGdnQTBFWWFrRUFPZ0FBSUFOQ0FEY0RFQ0FFUVl3QmFpRUJBMEFnQTBFSWFpQURRUkJxRUlJRklBTW9BZ2hCQVhFRVFDQUJJQU1vQWd3aUJVRUNkR29vQWdBaUJpQUZPd0dJQVNBR0lBUTJBbGdNQVFzTElBQWdBa0VCYWpZQ0JDQUFJQVEyQWdBZ0EwRWdhaVFBRHdzQUM1NEJBUVYvSUFBb0FnQWlCaUFHTHdIMkJpSUhRUUZxSWdnZ0FDZ0NDQ0lGSUFFZ0FoQ0RCU0FHUWRnQWFpQUlJQVVnQXhDQUJTQUZRUUZxSVFFZ0JrSDRCbW9oQWdKQUlBZEJBbW9pQXlBRlFRSnFJZ2xORFFBZ0J5QUZhMEVDZENJRlJRMEFJQUlnQ1VFQ2RHb2dBaUFCUVFKMGFpQUYvQW9BQUFzZ0FpQUJRUUowYWlBRU5nSUFJQVlnQ0RzQjlnWWdCaUFBS0FJRUlBRWdBeENlQlF1aUFRSUNmd0YrQWtBQ1FDQUNJQU5xUVFGclFRQWdBbXR4clNBQnJYNGlCa0lnaUZBRVFDQUdweUlFUVlDQWdJQjRJQUpyVFEwQkN5QUFRUUEyQWdSQkFTRUREQUVMSUFSRkJFQWdBQ0FDTmdJSVFRQWhBeUFBUVFBMkFnUU1BUXRCQUNFRFFZRGcyZ0F0QUFBYUlBUWdBaENnQ0NJRkJFQWdBQ0FGTmdJSUlBQWdBVFlDQkF3QkN5QUFJQVEyQWdnZ0FDQUNOZ0lFUVFFaEF3c2dBQ0FETmdJQUM0OEJBUVYvSXdCQkVHc2lBeVFBQWtBZ0FrRUJhaUlHUlEwQUlBTkJDR29nQVVFSWFpSUhJQUlRL0FFZ0F5Z0NDRUVCY1VVTkFDQURLQUlNSVFRZ0F5QUhJQVlRL0FFZ0F5Z0NBRUVCY1VVTkFDQUJLQUlBSUFScVFRQWdBeWdDQkNJQ0lBRW9BZ1JORzBFQUlBSWdCRThiSVFVZ0FpQUVheUVDQ3lBQUlBSTJBZ1FnQUNBRk5nSUFJQU5CRUdva0FBdVhBUUVEZnlNQVFSQnJJZ0lrQUNBQUtBSUFJZ05CQkdvb0FnQWhBQ0FEUVFocUtBSUFJQUVvQWdCQjRNL0pBRUVCSUFFb0FnUW9BZ3dSQWdBaEJDQUNRUUE2QUFrZ0FpQUVPZ0FJSUFJZ0FUWUNCRUhJQUd3aEFRTkFJQUVFUUNBQ0lBQTJBZ3dnQWtFRWFpQUNRUXhxUVFvUXlnSWdBVUhJQUdzaEFTQUFRY2dBYWlFQURBRUxDeUFDUVFScUVJMEhJQUpCRUdva0FBdXRBUUlFZndGK0l3QkJJR3NpQWlRQUFuOGdBU2dDQUNJRElBRW9BZ1JIQkVBZ0FTZ0NDQ0VFSUFFZ0EwSElBR28yQWdBZ0FrRU1haUFERUxrRUlBSW9BaFFoQVNBQ0tBSVFJZ01nQWlnQ0RDSUZRWitBZ0lCNFJnMEJHaUFDS1FJWUlRWWdCQ2dDQUVHZmdJQ0FlRWNFUUNBRUVNMENDeUFFSUFZM0Fnd2dCQ0FCTmdJSUlBUWdBellDQkNBRUlBVTJBZ0FMUVFBTElRTWdBQ0FCTmdJRUlBQWdBellDQUNBQ1FTQnFKQUFMaXdFQkJYOENRQUpBSUFKRkRRQWdBU0FDUVFSMGFpSURRUkJySWdWRkRRQWdBMEVCYXkwQUFDSUVRUkZyUWY4QmNVSHdBVWtOQUVFUUlBUnJRZjhCY1NJR0lRTURRQ0FEUVE5SEJFQWdBeUFGYWlFSElBTkJBV29oQXlBRUlBY3RBQUJHRFFFTUFnc0xJQUpCQkhRZ0JtcEJFR3NoQXd3QkMwRUFJUUVMSUFBZ0F6WUNCQ0FBSUFFMkFnQUxsQUVCQTM4akFFRVFheUlDSkFBQ2YwRUJJQUVvQWdBaUEwRW5JQUVvQWdRaUJDZ0NFQ0lCRVFNQURRQWFJQUpCQkdvZ0FDZ0NBRUdCQWhCUkFrQWdBaTBBQkVHQUFVWUVRQ0FESUFJb0FnZ2dBUkVEQUVVTkFVRUJEQUlMSUFNZ0FpMEFEaUlBSUFKQkJHcHFJQUl0QUE4Z0FHc2dCQ2dDREJFQ0FFVU5BRUVCREFFTElBTkJKeUFCRVFNQUN5QUNRUkJxSkFBTG9BRUJBbjhqQUVFUWF5SUVKQUFnQVNnQ0RDOEI5Z1loQlFKQUFuOGdBa0VCY1FSQUlBTWdBU2dDRkM4QjlnWkxEUUlnQkNBQkVKVUJJQU1nQldwQkFXb2hBeUFFS0FJQUlRSWdCQ2dDQkF3QkN5QURJQVZMRFFFZ0JFRUlhaUFCRUpVQklBUW9BZ2doQWlBRUtBSU1DeUVCSUFBZ0F6WUNDQ0FBSUFJMkFnQWdBQ0FCTmdJRUlBUkJFR29rQUE4TFFaU1d5UUJCamdGQnBKZkpBQkNjQmdBTGdnRUJBbjhnQUNBQ0lBRWdBVUgvQVhFaUFTQUFRZjhCY1NJRGFpQUNRZjhCY1NJQ2F5SUFJQUZySWdFZ0FjRkJEM1VpQVhNZ0FXdEIvLzhEY1NJQklBQWdBbXNpQWlBQ3dVRVBkU0lDY3lBQ2EwSC8vd054SWdKTEd5SUVJQUFnQTJzaUFDQUF3VUVQZFNJQWN5QUFhMEgvL3dOeElnQWdBazBiSUFRZ0FDQUJUUnNMaGdFQUlBVWdBaUFEYTNFaEF5QUVRUU5HQkVBQ1FDQUNRUU5xSUFGTElBSkJmRXR5RFFBZ0FTQURUU0FEUVFGcUlBVnhJZ1FnQVU5eURRQWdBMEVDYWlBRmNTSUZJQUZQRFFBZ0FDQUNhaUlCSUFBZ0Eyb3RBQUE2QUFBZ0FTQUFJQVJxTFFBQU9nQUJJQUVnQUNBRmFpMEFBRG9BQWdzUEN5QUFJQUVnQXlBQ0lBUWdCUkJFQzVRQkFRRi9Jd0JCTUdzaUF5UUFBa0FnQWlnQ0FFRUxSZ1JBSUFOQkJHb2dBQ0FCSUFJb0FnUWdBaThCQ0JEUkFpQURLQUlFUVorQWdJQjRSdzBCSUFNb0FnZ2hBZ3NnQTBFd2FpUUFJQUlQQ3lBRFFTaHFJQU5CRkdvb0FnQTJBZ0FnQTBFZ2FpQURRUXhxS1FJQU53TUFJQU1nQXlrQ0JEY0RHRUdZak1vQVFSZ2dBMEVZYWtIQWg4b0FRYkNNeWdBUWpBUUFDNVFCQVFOL0l3QkJJR3NpQkNRQUlBSWdBeWdDRENJRkVRWUFJUVlnQkVFSWFpQUJLQUlBSUFJZ0F5QUJLQUlFS0FJVUVRQUFBa0FnQkNnQ0NFRUZSd1JBSUFBZ0JDa0NDRGNDQUNBQVFSQnFJQVJCR0dvcEFnQTNBZ0FnQUVFSWFpQUVRUkJxS1FJQU53SUFEQUVMSUFCQkJHb2dBaUFHSUFJZ0JSRUdBQ0FES0FJY0VRQUFJQUJCQlRZQ0FBc2dCRUVnYWlRQUM3SUJBUUovSXdCQkVHc2lBaVFBQW44Q1FBSkFBa0FDUUNBQUtBSUFJZ0FvQWdBaUEwSC8vOE1BYTBFQUlBTkJnSURFQUd0QkEwa2JRUUZyRGdNQkFnTUFDeUFDSUFBMkFnd2dBVUhrMDhrQVFSTWdBa0VNYWtIU0FCRFhBZ3dEQ3lBQktBSUFRZmZUeVFCQkd5QUJLQUlFS0FJTUVRSUFEQUlMSUFFb0FnQkJrdFRKQUVFY0lBRW9BZ1FvQWd3UkFnQU1BUXNnQVNnQ0FFR3UxTWtBUVFzZ0FTZ0NCQ2dDREJFQ0FBc2dBa0VRYWlRQUM0b0JBUUYvSXdCQklHc2lCQ1FBSUFSQkNHb2dBU2dDQUNBQ0lBTWdBU2dDQkNnQ0ZCRUFBQ0FBQW44Z0JDZ0NDRUVGUndSQUlBQWdCQ2tDQ0RjQ0JDQUFRUlJxSUFSQkdHb3BBZ0EzQWdBZ0FFRU1haUFFUVJCcUtRSUFOd0lBUVFnTUFRc2dBQ0FFS1FJTU53SUVJQUJCREdvZ0JFRVVhaWdDQURZQ0FFRUVDem9BQUNBRVFTQnFKQUFMa0FFQkFYOGpBRUVnYXlJRUpBQWdCRUVJYWlBQktBSUFJQUlnQXlBQktBSUVLQUlVRVFBQVFRVWhBUUpBSUFRb0FnaEJCVWNFUUNBQUlBUXBBZ2czQWdRZ0FFRVVhaUFFUVJocUtRSUFOd0lBUVFnaEFTQUFRUXhxSUFSQkVHb3BBZ0EzQWdBTUFRc2dBQ0FFS1FJTU53SUVJQUJCREdvZ0JFRVVhaWdDQURZQ0FBc2dBQ0FCT2dBQUlBUkJJR29rQUF1S0FRRUJmeU1BUVNCcklnUWtBQ0FFUVFocUlBRW9BZ0FnQWlBRElBRW9BZ1FvQWhRUkFBQWdBQUovSUFRb0FnaEJCVWNFUUNBQUlBUXBBZ2czQWdRZ0FFRVVhaUFFUVJocUtRSUFOd0lBSUFCQkRHb2dCRUVRYWlrQ0FEY0NBRUVJREFFTElBQWdCQ2tDRERjQ0JDQUFRUXhxSUFSQkZHb29BZ0EyQWdCQkFRczZBQUFnQkVFZ2FpUUFDNG9CQVFGL0l3QkJJR3NpQkNRQUlBUkJDR29nQVNnQ0FDQUNJQU1nQVNnQ0JDZ0NGQkVBQUNBQUFuOGdCQ2dDQ0VFRlJ3UkFJQUFnQkNrQ0NEY0NCQ0FBUVJScUlBUkJHR29wQWdBM0FnQWdBRUVNYWlBRVFSQnFLUUlBTndJQVFRZ01BUXNnQUNBRUtRSU1Od0lFSUFCQkRHb2dCRUVVYWlnQ0FEWUNBRUVDQ3pvQUFDQUVRU0JxSkFBTGlnRUJBWDhqQUVFZ2F5SUVKQUFnQkVFSWFpQUJLQUlBSUFJZ0F5QUJLQUlFS0FJVUVRQUFJQUFDZnlBRUtBSUlRUVZIQkVBZ0FDQUVLUUlJTndJRUlBQkJGR29nQkVFWWFpa0NBRGNDQUNBQVFReHFJQVJCRUdvcEFnQTNBZ0JCQ0F3QkN5QUFJQVFwQWd3M0FnUWdBRUVNYWlBRVFSUnFLQUlBTmdJQVFRQUxPZ0FBSUFSQklHb2tBQXQvQWdGK0FYOENRQ0FCclNBRHJYNGlCRUlnaUZCRkJFQU1BUXNnQktjaUFTQUNRUUZyYWlJRklBRkpCRUFNQVFzZ0F5QUZRUUFnQW10eElnRnFRUWhxSWdNZ0FVa0VRQXdCQzBHQWdJQ0FlQ0FDYXlBRFR3UkFJQUFnQVRZQ0NDQUFJQU0yQWdRZ0FDQUNOZ0lBRHdzZ0FFRUFOZ0lBRHdzZ0FFRUFOZ0lBQzQ0QkFRTi9Jd0JCRUdzaUF5UUFJQU5CQkdvZ0FVRUlJQUlRNmdNQ1FDQURLQUlFSWdFRVFDQURLQUlNSVFVZ0F5Z0NDQ0lFQkVCQmdPRGFBQzBBQUJvZ0JDQUJFS0FJSVFFTElBRkZEUUVnQUVFQU5nSU1JQUFnQWtFQmF5SUVOZ0lFSUFBZ0FTQUZhallDQUNBQUlBUWdBa0VEZGtFSGJDQUNRUWxKR3pZQ0NDQURRUkJxSkFBUEN4RG5CZ3NBQzZFQkFRUi9Jd0JCRUdzaUJpUUFJQUVvQWdBaEJRSkFJQU1nQVNnQ0JDSUVTd1JBSUFaQkNHb2dCQ0FGSUFSQi9LTEpBQkNmQnlBQklBWXBBd2czQWdBZ0FFRzRvOGtBS1FNQU53SUFEQUVMSUFRZ0Eyc2hCQ0FESUFWcUlRY0NRQ0FEUVFGSEJFQWdBaUFESUFVZ0EwSHNvc2tBRUt3SERBRUxJQUlnQlMwQUFEb0FBQXNnQVNBRU5nSUVJQUVnQnpZQ0FDQUFRUVE2QUFBTElBWkJFR29rQUF1Z0FRRUNmeU1BUVRCcklnSWtBQ0FCS0FJRUlRTWdBU2dDQUNFQkFuOGdBQ2dDQUNJQUxRQUFRUUpHQkVBZ0FVSFV5Y2tBUVJJZ0F5Z0NEQkVDQUF3QkN5QUNJQUEyQWd3Z0FrRUJOZ0lrSUFKQnZNbkpBRFlDSUNBQ1FRRTJBaFFnQWtHMHlja0FOZ0lRSUFKQkFUWUNIQ0FDUWNVQU5nSXNJQUlnQWtFb2FqWUNHQ0FDSUFKQkRHbzJBaWdnQVNBRElBSkJFR29RaFFFTElBSkJNR29rQUF1ZUFRRUNmeU1BUVRCcklnSWtBQ0FDUVFocUlnTWdBUkJxQWtBZ0FpZ0NDRUdmZ0lDQWVFY0VRQ0FERU00Q0lBQWdBU2dDUENBQktBSkFFSXdGREFFTElBSW9BZ3dnQWlnQ0VCQ21DU0FDUVJ4cUlnTWdBUkFZSUFJb0FoeEJuNENBZ0hoSEJFQWdBQ0FCS0FJOElBRW9Ba0FRakFVZ0F4RE9BZ3dCQ3lBQUlBSXBBaUEzQWdBZ0FFRUlhaUFDUVNocUtBSUFOZ0lBQ3lBQ1FUQnFKQUFMaVFFQkFuOGdBMEVJVHdSQUlBQWdBQ0FEUVFOMklnTkJCWFFpQkdvZ0FDQURRVGhzSWdWcUlBTVF4Z01oQUNBQklBRWdCR29nQVNBRmFpQURFTVlESVFFZ0FpQUNJQVJxSUFJZ0JXb2dBeERHQXlFQ0N5QUFJQUlnQVNBQUtBSUFLQUlBSWdBZ0FTZ0NBQ2dDQUNJQlNTSURJQUVnQWlnQ0FDZ0NBQ0lDU1hNYklBTWdBQ0FDU1hNYkM2QUJBUVovQWtBZ0FDZ0NnSUFDSWdRZ0FTZ0NCQ0lGSUFBb0FvU0FBaUlHSUFVZ0Jra2JJZ0pxSWdNZ0JFOEVRQ0FEUVlDQUFrc05BU0FCS0FJQUlRY2dBZ1JBSUFjZ0FDQUVhaUFDL0FvQUFBc2dBU0FGSUFKck5nSUVJQUVnQWlBSGFqWUNBQ0FBSUFZZ0FtczJBb1NBQWlBQUlBTkIvLzhCY1RZQ2dJQUNJQUlQQ3lBRUlBTkJ4SVhLQUJDM0NRQUxJQU5CZ0lBQ1FjU0Z5Z0FRdUFrQUM0Z0JBUUYvSXdCQk1Hc2lCU1FBSUFWQkhHb2dBaUFESUFRUXp3RUNRQ0FGS0FJY1FaK0FnSUI0UndSQUlBVkJHR29nQlVFc2FpZ0NBRFlDQUNBRlFSQnFJQVZCSkdvcEFnQTNBd0FnQlNBRktRSWNOd01JREFFTElBQWdBU0FGS0FJZ0VMa0RJUUFnQlVHZmdJQ0FlRFlDQ0NBRklBQTJBZ3dMSUFWQkNHb1FsZ2dnQlVFd2FpUUFDNU1CQVFGL0l3QkJJR3NpQkNRQUlBUkJDR29nQVNnQ0FDQUNJQU1nQVNnQ0JDZ0NGQkVBQUFKQUlBUW9BZ2hCQlVjRVFDQUFJQVFwQWdnM0FnQWdBRUVRYWlBRVFSaHFLUUlBTndJQUlBQkJDR29nQkVFUWFpa0NBRGNDQUF3QkN5QUVMUUFNSVFJUXJnZ2hBU0FBUVFFMkFnd2dBQ0FCTmdJSUlBRWdBam9BQUNBQVFvV0FnSUFRTndJQUN5QUVRU0JxSkFBTGx3RUJBWDhDUUNBQlFRRnJJQVpHQkVBZ0FDOEI5Z1lpQVVFTFR3MEJJQUFnQVVFQmFpSUdPd0gyQmlBQUlBRkJBM1JxSWdjZ0F6c0JCQ0FISUFJMkFnQWdBQ0FCUWNnQWJHcEIyQUJxSUFSQnlBRDhDZ0FBSUFBZ0JrRUNkR29nQlRZQytBWWdCU0FHT3dIMEJpQUZJQUEyQXZBR0R3dEJqSkRKQUVFd1FieVF5UUFRbkFZQUMwSGNqOGtBUVNCQnpKREpBQkNjQmdBTGlnRUJBWDhqQUVFZ2F5SUVKQUFnQkVFSWFpQUJLQUlBSUFJZ0F5QUJLQUlFS0FJVUVRQUFJQUFDZnlBRUtBSUlRUVZIQkVBZ0FDQUVLUUlJTndJRUlBQkJGR29nQkVFWWFpa0NBRGNDQUNBQVFReHFJQVJCRUdvcEFnQTNBZ0JCQ1F3QkN5QUFJQVFwQWd3M0FnUWdBRUVNYWlBRVFSUnFLQUlBTmdJQVFRUUxPZ0FBSUFSQklHb2tBQXVRQVFFQmZ5TUFRU0JySWdRa0FDQUVRUWhxSUFFb0FnQWdBaUFESUFFb0FnUW9BaFFSQUFCQkJTRUJBa0FnQkNnQ0NFRUZSd1JBSUFBZ0JDa0NDRGNDQkNBQVFSUnFJQVJCR0dvcEFnQTNBZ0FnQUVFTWFpQUVRUkJxS1FJQU53SUFRUWtoQVF3QkN5QUFJQVFwQWd3M0FnUWdBRUVNYWlBRVFSUnFLQUlBTmdJQUN5QUFJQUU2QUFBZ0JFRWdhaVFBQzRvQkFRRi9Jd0JCSUdzaUJDUUFJQVJCQ0dvZ0FTZ0NBQ0FDSUFNZ0FTZ0NCQ2dDRkJFQUFDQUFBbjhnQkNnQ0NFRUZSd1JBSUFBZ0JDa0NDRGNDQkNBQVFSUnFJQVJCR0dvcEFnQTNBZ0FnQUVFTWFpQUVRUkJxS1FJQU53SUFRUWtNQVFzZ0FDQUVLUUlNTndJRUlBQkJER29nQkVFVWFpZ0NBRFlDQUVFQkN6b0FBQ0FFUVNCcUpBQUxpZ0VCQVg4akFFRWdheUlFSkFBZ0JFRUlhaUFCS0FJQUlBSWdBeUFCS0FJRUtBSVVFUUFBSUFBQ2Z5QUVLQUlJUVFWSEJFQWdBQ0FFS1FJSU53SUVJQUJCRkdvZ0JFRVlhaWtDQURjQ0FDQUFRUXhxSUFSQkVHb3BBZ0EzQWdCQkNRd0JDeUFBSUFRcEFndzNBZ1FnQUVFTWFpQUVRUlJxS0FJQU5nSUFRUVlMT2dBQUlBUkJJR29rQUF1S0FRRUJmeU1BUVNCcklnUWtBQ0FFUVFocUlBRW9BZ0FnQWlBRElBRW9BZ1FvQWhRUkFBQWdBQUovSUFRb0FnaEJCVWNFUUNBQUlBUXBBZ2czQWdRZ0FFRVVhaUFFUVJocUtRSUFOd0lBSUFCQkRHb2dCRUVRYWlrQ0FEY0NBRUVKREFFTElBQWdCQ2tDRERjQ0JDQUFRUXhxSUFSQkZHb29BZ0EyQWdCQkFBczZBQUFnQkVFZ2FpUUFDNG9CQVFGL0l3QkJJR3NpQkNRQUlBUkJDR29nQVNnQ0FDQUNJQU1nQVNnQ0JDZ0NGQkVBQUNBQUFuOGdCQ2dDQ0VFRlJ3UkFJQUFnQkNrQ0NEY0NCQ0FBUVJScUlBUkJHR29wQWdBM0FnQWdBRUVNYWlBRVFSQnFLUUlBTndJQVFRa01BUXNnQUNBRUtRSU1Od0lFSUFCQkRHb2dCRUVVYWlnQ0FEWUNBRUVDQ3pvQUFDQUVRU0JxSkFBTGpnRUJBbjhqQUVFUWF5SUVKQUFDZnlBREtBSUVCRUFnQXlnQ0NDSUZSUVJBSUFSQkNHb2dBU0FDRUw0SElBUW9BZ2doQXlBRUtBSU1EQUlMSUFNb0FnQWdCU0FCSUFJUVZpRURJQUlNQVFzZ0JDQUJJQUlRdmdjZ0JDZ0NBQ0VESUFRb0FnUUxJUVVnQUNBRElBRWdBeHMyQWdRZ0FDQURSVFlDQUNBQUlBVWdBaUFER3pZQ0NDQUVRUkJxSkFBTGdRRUJBbjhnQTBFSVR3UkFJQUFnQUNBRFFRTjJJZ05CTUd3aUJHb2dBQ0FEUWRRQWJDSUZhaUFERU5JRElRQWdBU0FCSUFScUlBRWdCV29nQXhEU0F5RUJJQUlnQWlBRWFpQUNJQVZxSUFNUTBnTWhBZ3NnQUNBQ0lBRWdBQ2dDQUNJQUlBRW9BZ0FpQVVraUF5QUJJQUlvQWdBaUFrbHpHeUFESUFBZ0FrbHpHd3VSQVFFRWZ5TUFRUkJySWdNa0FDQUFLQUlJSVFVZ0EwRUlhaUFBS0FJTUlnSW9BZ0FpQkNBQ0tBSUVJQUFwQXdBUXZBVWdBeWdDQ0NFQUlBSWdBaWdDQ0NBRExRQU1RUUZ4YXpZQ0NDQUVJQUJCQkhScklnQkJER3NpQkNBQktRSUFOd0lBSUFSQkNHb2dBVUVJYWlnQ0FEWUNBQ0FBUVJCcklBVTJBZ0FnQWlBQ0tBSU1RUUZxTmdJTUlBTkJFR29rQUF1QUFRRUNmeUFEUVFoUEJFQWdBQ0FBSUFOQkEzWWlBMEVGZENJRWFpQUFJQU5CT0d3aUJXb2dBeERVQXlFQUlBRWdBU0FFYWlBQklBVnFJQU1RMUFNaEFTQUNJQUlnQkdvZ0FpQUZhaUFERU5RRElRSUxJQUFnQWlBQklBQXRBQUFpQUNBQkxRQUFJZ0ZKSWdNZ0FTQUNMUUFBSWdKSmN4c2dBeUFBSUFKSmN4c0xpUUVDQlg4QmZrRUFJQUZCQVhZaUJHc2hCU0FCUVFOMElBQnFRUWhySVFJZ0FVRUNTU0VCQWtBRFFDQURJQVZHRFFFZ0EwRUJheUVESUFGRkJFQWdBaWtDQUNFSElBSWdBQzBBQURvQUFDQUFRUVJxS0FJQUlRWWdBQ0FITndJQUlBSkJCR29nQmpZQ0FDQUFRUWhxSVFBZ0FrRUlheUVDREFFTEN5QURJQVJCOUp6U0FCREdCQUFMQzVrQkFRTi9JQUF0QUFnaEFRSkFJQUFvQWdBaUEwVUVRQ0FCSVFJTUFRdEJBU0VDQWtBZ0FVRUJjVVVFUUNBRFFRRkhEUUVnQUMwQUNVVU5BU0FBS0FJRUlnRXRBQXBCZ0FGeERRRWdBU2dDQUVIYjlzQUFRUUVnQVNnQ0JDZ0NEQkVDQUVVTkFRc2dBQ0FDT2dBSURBRUxJQUFnQUNnQ0JDSUFLQUlBUVpPVjBnQkJBU0FBS0FJRUtBSU1FUUlBSWdJNkFBZ0xJQUpCQVhFTGdnRUJBMzhnQTBILy93TnhJUVVDUUFOQUlBSkJBVTBFUUFKQVFRRWhBaUFCSUFSQkFYUnFMd0VBSWdFZ0EwSC8vd054SWdOSERRQkJBQ0VDREFNTEJTQUVJQUpCQVhZaUJpQUVhaUlFSUFFZ0JFRUJkR292QVFBZ0JVc2JJUVFnQWlBR2F5RUNEQUVMQ3lBRUlBRWdBMGxxSVFRTElBQWdCRFlDQkNBQUlBSTJBZ0FMbFFFQkEzOGpBRUVRYXlJRUpBQWdCRUVFYWlBRFFRQkJBVUVCRUk4RElBUW9BZ2doQlFKQUlBUW9BZ1JCQVVjRVFDQUVLQUlNSVFZZ0F3UkFJQVlnQWlBRC9Bb0FBQXRCZ09EYUFDMEFBQnBCREJBV0lnSkZEUUVnQWlBRE5nSUlJQUlnQmpZQ0JDQUNJQVUyQWdBZ0FDQUJJQUpCMklmSkFCQy9CaUFFUVJCcUpBQVBDeUFGSUFRb0FneEJsTmJTQUJETUNBc0FDNDhCQVFKL0l3QkJJR3NpQmlRQUFrQWdBUVJBSUFaQkZHb2lCeUFCSUFNZ0JDQUZJQUlvQWhBUkJ3QWdBQ0FHS0FJY0lnRWdCaWdDRkVrRWZ5QUdRUWhxSUFjZ0FVRUVRUVFRMkFJZ0JpZ0NDQ0lCUVlHQWdJQjRSdzBDSUFZb0Fod0ZJQUVMTmdJRUlBQWdCaWdDR0RZQ0FDQUdRU0JxSkFBUEN4RFlDUUFMSUFFZ0JpZ0NERUdFanNrQUVNd0lBQXVPQVFFQ2Z5TUFRVEJySWdJa0FDQUNRUnhxSWdNZ0FVR1FBV3BCeGRqSkFFRUhFTThCSUFKQkNHb2dBeERnQlFKQUlBSW9BZ2hCbjRDQWdIaEhCRUFnQUNBQ0tRSUlOd0lBSUFCQkVHb2dBa0VZYWlnQ0FEWUNBQ0FBUVFocUlBSkJFR29wQWdBM0FnQU1BUXNnQUNBQktBS1lBaUFCS0FLY0FpQUNLQUlNSUFJdkFSQVFwQVFMSUFKQk1Hb2tBQXVpQVFFQmZ5TUFRVEJySWdNa0FDQURJQUpCdE5ES0FFRUtFTThCSUFNUWxnZ2hBaUFEUVNScVFiVFF5Z0JCQ2hDQ0FTQURJQUVnQWlBREtBSW9JZ0VnQXlnQ0xFSDhodElBRUtvSUVOd0JJQU1vQWdCRkJFQkJqSWZTQUVFS1FaaUgwZ0FRL1FRQUN5QUFJQU1wQXdnM0F3QWdBRUVRYWlBRFFSaHFLUU1BTndNQUlBQkJDR29nQTBFUWFpa0RBRGNEQUNBREtBSWtJQUVRNFFnZ0EwRXdhaVFBQzU0QkFRUi9Jd0JCRUdzaUF5UUFJQUJDQURjQ0NDQUJLQUlRSUFFb0FoUWdBa0gvL3dOeFFielIyZ0FRNWdjaEJDQUFLQUlFSVFVZ0FDZ0NBQ0VHSUFCQ0FUY0NBQ0FEUVFocUlBUXZBUUFpQkNBR0lBVkJ6TkhhQUJEREJ5QUJLQUlFSUFFb0FnZ2dBaUFES0FJSUlBTW9BZ3dRbWdRZ0FDZ0NBQ0FBS0FJRUVPd0lJQUFnQkRZQ0RDQUFJQVUyQWdRZ0FDQUdOZ0lBSUFOQkVHb2tBQXVOQVFFQmZ5TUFRU0JySWdRa0FDQUVRUWhxSUFFb0FnQWdBaUFESUFFb0FnUW9BaFFSQUFBQ1FDQUVLQUlJUVFWSEJFQWdBQ0FFS1FJSU53SUFJQUJCRUdvZ0JFRVlhaWtDQURjQ0FDQUFRUWhxSUFSQkVHb3BBZ0EzQWdBTUFRc1FyZ2doQVNBQVFRRTJBZ3dnQUNBQk5nSUlJQUZCM0FBNkFBQWdBRUtGZ0lDQUVEY0NBQXNnQkVFZ2FpUUFDNmtCQVFKL0l3QkIwQUJySWdRa0FDQUVRVUJyUWdBM0F3QWdCRUlBTndNNElBUWdBVGNETUNBRUlBRkM4OHJSeTZlTTJiTDBBSVUzQXlBZ0JDQUJRdTNla2ZPV3pOeTM1QUNGTndNWUlBUWdBRGNES0NBRUlBQkM0ZVNWODliczJienNBSVUzQXhBZ0JDQUFRdlhLellQWHJOdTM4d0NGTndNSUlBUkJDR29pQlNBQ0lBTVF2d0lnQkVIL0FUb0FUeUFGSUFSQnp3QnFRUUVRdndJZ0JSRG1BU0FFUWRBQWFpUUFDNHdCQVFGL0l3QkJJR3NpQkNRQUlBUkJDR29nQVNnQ0FDQUNJQU1nQVNnQ0JDZ0NGQkVBQUFKQUlBUW9BZ2hCQlVjRVFDQUFJQVFwQWdnM0FnQWdBRUVRYWlBRVFSaHFLUUlBTndJQUlBQkJDR29nQkVFUWFpa0NBRGNDQUF3QkN4Q3VDQ0VCSUFCQkFUWUNEQ0FBSUFFMkFnZ2dBVUVKT2dBQUlBQkNoWUNBZ0JBM0FnQUxJQVJCSUdva0FBdU1BUUVCZnlNQVFTQnJJZ1FrQUNBRVFRaHFJQUVvQWdBZ0FpQURJQUVvQWdRb0FoUVJBQUFDUUNBRUtBSUlRUVZIQkVBZ0FDQUVLUUlJTndJQUlBQkJFR29nQkVFWWFpa0NBRGNDQUNBQVFRaHFJQVJCRUdvcEFnQTNBZ0FNQVFzUXJnZ2hBU0FBUVFFMkFnd2dBQ0FCTmdJSUlBRkJDam9BQUNBQVFvV0FnSUFRTndJQUN5QUVRU0JxSkFBTGpBRUJBWDhqQUVFZ2F5SUVKQUFnQkVFSWFpQUJLQUlBSUFJZ0F5QUJLQUlFS0FJVUVRQUFBa0FnQkNnQ0NFRUZSd1JBSUFBZ0JDa0NDRGNDQUNBQVFSQnFJQVJCR0dvcEFnQTNBZ0FnQUVFSWFpQUVRUkJxS1FJQU53SUFEQUVMRUs0SUlRRWdBRUVCTmdJTUlBQWdBVFlDQ0NBQlFTZzZBQUFnQUVLRmdJQ0FFRGNDQUFzZ0JFRWdhaVFBQzR3QkFRRi9Jd0JCSUdzaUJDUUFJQVJCQ0dvZ0FTZ0NBQ0FDSUFNZ0FTZ0NCQ2dDRkJFQUFBSkFJQVFvQWdoQkJVY0VRQ0FBSUFRcEFnZzNBZ0FnQUVFUWFpQUVRUmhxS1FJQU53SUFJQUJCQ0dvZ0JFRVFhaWtDQURjQ0FBd0JDeEN1Q0NFQklBQkJBVFlDRENBQUlBRTJBZ2dnQVVFSU9nQUFJQUJDaFlDQWdCQTNBZ0FMSUFSQklHb2tBQXVZQVFFQ2Z5TUFRU0JySWdJa0FDQUNRUUE3QVJvZ0FrRVVhaUFCUVpUbzFnQkJpQjVCcEtUWEFFR0lIaUFDUVJwcUVJb0RBa0FnQWk4QkZFRUJSZ1JBSUFJdkFSZ2hBU0FDUVFocUlBSXZBUlpCNUpUWkFFR0xMVUdReWRvQUVJWUhJQUlvQWd3aUF5QUJTUTBCSUFJb0FnZ2hBd3NnQUNBQk5nSUVJQUFnQXpZQ0FDQUNRU0JxSkFBUEN5QUJJQU5Cb01uYUFCQzRDUUFMbUFFQkFuOGpBRUVnYXlJQ0pBQWdBa0VBT3dFYUlBSkJGR29nQVVIQTJkUUFRYUVRUVlUNjFBQkJvUkFnQWtFYWFoQ0tBd0pBSUFJdkFSUkJBVVlFUUNBQ0x3RVlJUUVnQWtFSWFpQUNMd0VXUVl6ODFRQkIraHBCOU9mV0FCQ0dCeUFDS0FJTUlnTWdBVWtOQVNBQ0tBSUlJUU1MSUFBZ0FUWUNCQ0FBSUFNMkFnQWdBa0VnYWlRQUR3c2dBU0FEUVlUbzFnQVF1QWtBQzR3QkFRRi9Jd0JCSUdzaUJDUUFJQVJCQ0dvZ0FTZ0NBQ0FDSUFNZ0FTZ0NCQ2dDRkJFQUFBSkFJQVFvQWdoQkJVY0VRQ0FBSUFRcEFnZzNBZ0FnQUVFUWFpQUVRUmhxS1FJQU53SUFJQUJCQ0dvZ0JFRVFhaWtDQURjQ0FBd0JDeEN1Q0NFQklBQkJBVFlDRENBQUlBRTJBZ2dnQVVFTk9nQUFJQUJDaFlDQWdCQTNBZ0FMSUFSQklHb2tBQXVNQVFFQmZ5TUFRU0JySWdRa0FDQUVRUWhxSUFFb0FnQWdBaUFESUFFb0FnUW9BaFFSQUFBQ1FDQUVLQUlJUVFWSEJFQWdBQ0FFS1FJSU53SUFJQUJCRUdvZ0JFRVlhaWtDQURjQ0FDQUFRUWhxSUFSQkVHb3BBZ0EzQWdBTUFRc1FyZ2doQVNBQVFRRTJBZ3dnQUNBQk5nSUlJQUZCRERvQUFDQUFRb1dBZ0lBUU53SUFDeUFFUVNCcUpBQUxqQUVCQVg4akFFRWdheUlFSkFBZ0JFRUlhaUFCS0FJQUlBSWdBeUFCS0FJRUtBSVVFUUFBQWtBZ0JDZ0NDRUVGUndSQUlBQWdCQ2tDQ0RjQ0FDQUFRUkJxSUFSQkdHb3BBZ0EzQWdBZ0FFRUlhaUFFUVJCcUtRSUFOd0lBREFFTEVLNElJUUVnQUVFQk5nSU1JQUFnQVRZQ0NDQUJRU2s2QUFBZ0FFS0ZnSUNBRURjQ0FBc2dCRUVnYWlRQUM0UUJBUUYvSXdCQklHc2lCQ1FBSUFSQkNHb2dBU2dDQUNBQ0lBTWdBU2dDQkNnQ0ZCRUFBQ0FBQW44Z0JDZ0NDRUVGUndSQUlBQWdCQ2tDQ0RjQ0JDQUFRUlJxSUFSQkdHb3BBZ0EzQWdBZ0FFRU1haUFFUVJCcUtRSUFOd0lBUVFnTUFRc2dBRUVBT2dBQklBUW9BZ3dnQkNnQ0VCQ3VDVUVHQ3pvQUFDQUVRU0JxSkFBTGhBRUJBWDhqQUVFZ2F5SUVKQUFnQkVFSWFpQUJLQUlBSUFJZ0F5QUJLQUlFS0FJVUVRQUFJQUFDZnlBRUtBSUlRUVZIQkVBZ0FDQUVLUUlJTndJRUlBQkJGR29nQkVFWWFpa0NBRGNDQUNBQVFReHFJQVJCRUdvcEFnQTNBZ0JCQ0F3QkN5QUFRUUU2QUFFZ0JDZ0NEQ0FFS0FJUUVLNEpRUVlMT2dBQUlBUkJJR29rQUF1QUFRSUJmZ0YvQWtBQ1FDQUJyU0FEclg0aUJFSWdpS2NOQUNBRXB5SUJJQUpCQVd0cUlnVWdBVWtOQUNBRlFRQWdBbXR4SWdFZ0EwRUlhbW9pQXlBQlNRMEJRWUNBZ0lCNElBSnJJQU5QQkVBZ0FDQUJOZ0lJSUFBZ0F6WUNCQ0FBSUFJMkFnQVBDeUFBUVFBMkFnQVBDeUFBUVFBMkFnQVBDeUFBUVFBMkFnQUxwZ0VCQVg4akFFSFFBR3NpQkNRQUlBUkJRR3RDQURjREFDQUVRZ0EzQXpnZ0JDQUJOd013SUFRZ0FVTHp5dEhMcDR6WnN2UUFoVGNESUNBRUlBRkM3ZDZSODViTTNMZmtBSVUzQXhnZ0JDQUFOd01vSUFRZ0FFTGg1Slh6MXV6WnZPd0FoVGNERUNBRUlBQkM5Y3JOZzllczI3ZnpBSVUzQXdnZ0FpQUVRUWhxSWdJUXR3Y2dCQ0FET3dGT0lBSWdCRUhPQUdwQkFoQy9BaUFDRU9ZQklBUkIwQUJxSkFBTGd3RUJBMzhqQUVFUWF5SUVKQUFnQVNBQ3AzRWhBMEVJSVFVRGZ5QUVRUWhxSUFFZ0FDQURhaWtBQUNBREVLMEhJQVFvQWdoQkFVWUVmeUFBSUFRb0Fnd2lBMm9zQUFCQkFFNEVRQ0FBS1FNQVFvQ0Jnb1NJa0tEQWdIK0RlcWRCQTNZaEF3c2dCRUVRYWlRQUlBTUZJQU1nQldvZ0FYRWhBeUFGUVFocUlRVU1BUXNMQzQwQkFRRi9Jd0JCSUdzaUFpUUFJQUFvQWdBaEFDQUNJQUVvQWdCQkFVRUFJQUVvQWdRb0Fnd1JBZ0E2QUJBZ0FpQUJOZ0lNSUFKQkFUb0FFU0FDUVFBMkFnZ2dBaUFBTmdJVUlBSWdBRUVJYWpZQ0dDQUNJQUJCRUdvMkFod2dBa0VJYWlBQ1FSUnFRZTRBRU04Q0lBSkJHR3BCN3dBUXp3SWdBa0VjYWtIV0FCRFBBaERXQXlBQ1FTQnFKQUFMZ0FFQ0EzOEJmaU1BUVJCcklnUWtBQ0FDUVFOcVFSeHhyU0FCclg0aUI2Y2hBZ0pBSUFkQ0lJaW5JQUpCL1AvLy93ZExja1VFUUNBQ1JRUkFRUUFoQVVFRUlRWU1BZ3RCQkNFRklBUkJDR3BCQkNBQ0VMNEhJQVFvQWdnaUJnMEJDeUFGSUFJZ0F4RE1DQUFMSUFBZ0JqWUNCQ0FBSUFFMkFnQWdCRUVRYWlRQUM0Z0JBZ0YvQVh3akFFRXdheUlDSkFBZ0FpQUJOZ0lFSUFCQklHb2dBa0VFYWhDckFpSUJCRUFnQVNzREFDQUNRVEJxSkFBUEN5QUNRUUkyQWd3Z0FrSEF4TW9BTmdJSUlBSkNBamNDRkNBQ1Fjd0FOZ0lzSUFJZ0FFRkFhellDS0NBQ1FSRTJBaVFnQWlBQ1FTQnFOZ0lRSUFJZ0FrRUVhallDSUNBQ1FRaHFRZERFeWdBUXF3Y0FDM0FDQVg4QmZrRUVJUU1DZmlBQ1FRUkpCRUJCQUNFRFFnQU1BUXNnQUNBQmFqVUFBQXNoQkNBQ0lBTkJBWEpMQkVBZ0FDQUJhaUFEYWpNQUFDQURRUU4wcllZZ0JJUWhCQ0FEUVFKeUlRTUxJQUlnQTBzRWZpQUFJQUVnQTJwcU1RQUFJQU5CQTNTdGhpQUVoQVVnQkFzTGpRRUFBa0FDUUFKQUlBRUVRQ0FBSUFBb0FnQkJmM00yQWdBZ0FVRUJSZzBCSUFBZ0FDZ0NCRUYvY3pZQ0JDQUJRUVZORFFJZ0FDQUFLQUlVUVg5ek5nSVVJQUZCQmtjTkEwRUdRUVpCL0ovQUFCREdCQUFMUVFCQkFFSE1uOEFBRU1ZRUFBdEJBVUVCUWR5ZndBQVF4Z1FBQzBFRklBRkI3Si9BQUJER0JBQUxJQUFnQUNnQ0dFRi9jellDR0F1RUFRRUJmeU1BUVNCcklnUWtBQ0FFUVFocUlBRW9BZ0FnQWlBRElBRW9BZ1FvQWhRUkFBQWdBQUovSUFRb0FnaEJCVWNFUUNBQUlBUXBBZ2czQWdRZ0FFRVVhaUFFUVJocUtRSUFOd0lBSUFCQkRHb2dCRUVRYWlrQ0FEY0NBRUVKREFFTElBQkJBRG9BQVNBRUtBSU1JQVFvQWhBUXJnbEJCd3M2QUFBZ0JFRWdhaVFBQzRRQkFRRi9Jd0JCSUdzaUJDUUFJQVJCQ0dvZ0FTZ0NBQ0FDSUFNZ0FTZ0NCQ2dDRkJFQUFDQUFBbjhnQkNnQ0NFRUZSd1JBSUFBZ0JDa0NDRGNDQkNBQVFSUnFJQVJCR0dvcEFnQTNBZ0FnQUVFTWFpQUVRUkJxS1FJQU53SUFRUWtNQVFzZ0FFRUJPZ0FCSUFRb0Fnd2dCQ2dDRUJDdUNVRUhDem9BQUNBRVFTQnFKQUFMaHdFQkEzOGpBRUVRYXlJQ0pBQUNRQ0FCUVFCSUJFQWdBRUVBTmdJRVFRRWhBd3dCQ3dKQUlBRkZCRUFnQUVLQWdJQ0FFRGNDQkF3QkMwRUJJUU1nQWtFSWFrRUJJQUVRdmdjZ0FpZ0NDQ0lFQkVBZ0FDQUVOZ0lJSUFBZ0FUWUNCQXdCQ3lBQUlBRTJBZ2dnQUVFQk5nSUVEQUVMUVFBaEF3c2dBQ0FETmdJQUlBSkJFR29rQUF0OEFRUi9Jd0JCRUdzaUFpUUFJQUpCQkdwQkJFRUlJQUVRd1FNQ1FDQUNLQUlFSWdNRVFDQUNLQUlNSVFRZ0F5QUNLQUlJRUo0SklnVkZEUUVnQUVFQU5nSU1JQUFnQVVFQmF5SUROZ0lFSUFBZ0JDQUZhallDQUNBQUlBTWdBVUVEZGtFSGJDQURRUWhKR3pZQ0NDQUNRUkJxSkFBUEN4RHNCZ3NBQzRBQkFRTi9Jd0JCRUdzaUJDUUFJQUVnQXFkeElRTkJDQ0VGQTBBZ0JFRUlhaUFCSUFBZ0Eyb3BBQUFnQXhDdEJ5QUVLQUlJUlFSQUlBTWdCV29nQVhFaEF5QUZRUWhxSVFVTUFRc0xJQUFnQkNnQ0RDSURhaXdBQUVFQVRnUkFJQUFwQXdCQ2dJR0NoSWlRb01DQWY0TjZwMEVEZGlFREN5QUVRUkJxSkFBZ0F3dU5BUUVCZnlNQVFTQnJJZ1VrQUNBRklBSWdBeUFFRU04QklBVVFsZ2doQWlBRklBTWdCQkNDQVNBRlFSUnFJQUVnQWlBRktBSUVJZ0VnQlNnQ0NCQ3JDQkRkQVNBRktBSVVRWUNBZ0lCNFJnUkFRWXlIMGdCQkNrR1loOUlBRVAwRUFBc2dBQ0FGS1FJVU53SUFJQUJCQ0dvZ0JVRWNhaWdDQURZQ0FDQUZLQUlBSUFFUTRBZ2dCVUVnYWlRQUMzb0JBWDhqQUVFZ2F5SUVKQUFnQkVFSWFpQUJLQUlBSUFJZ0F5QUJLQUlFS0FJVUVRQUFJQUFDZnlBRUtBSUlRUVZIQkVBZ0FDQUVLUU1JTndJRUlBQkJGR29nQkVFWWFpa0RBRGNDQUNBQVFReHFJQVJCRUdvcEF3QTNBZ0JCQ0F3QkN5QUFJQVFwQXhBM0F3aEJBd3M2QUFBZ0JFRWdhaVFBQzNzQkFuOGdBa0VQYWlFRElBQWdBa0VDZEdvaEFFRWdJUUlDUUFKQUEwQWdBa1VOQVNBRFFRaHJJZ1FnQVU4TkFpQUJJQU5MQkVBZ0FDQUNhaUlFUVJ4cUlBUkJCR3NvQWdBMkFnQWdBa0VFYXlFQ0lBTkJBV3NoQXd3QkN3c2dBeUFCUWJ5aHdBQVF4Z1FBQ3c4TElBUWdBVUdzb2NBQUVNWUVBQXQyQVFOL0l3QkJnQUZySWdRa0FFR0JBU0VDQTBBZ0FpQUVha0VDYXlBQVFROXhJZ05CTUhJZ0EwSFhBR29nQTBFS1NSczZBQUFnQUVIL0FYRWlBMEVFZGlFQUlBSkJBV3NoQWlBRFFROUxEUUFMSUFGQkFVSGM5c0FBUVFJZ0FpQUVha0VCYTBHQkFTQUNheENEQVNBRVFZQUJhaVFBQzRNQkFRUi9Jd0JCSUdzaUF5UUFJQUV2QWVJQklRUWdBMEVBT2dBY0lBTWdCRFlDR0NBRFFRQTJBaFFnQVVIa0FXb2hCQU5BSUFOQkNHb2dBMEVVYWhDQ0JTQURLQUlJUVFGeEJFQWdCQ0FES0FJTUlnVkJBblJxS0FJQUlnWWdCVHNCNEFFZ0JpQUJOZ0pZREFFTEN5QUFJQUkyQWdRZ0FDQUJOZ0lBSUFOQklHb2tBQXVEQVFFRWZ5TUFRU0JySWdNa0FDQUJMd0dLQVNFRUlBTkJBRG9BSENBRElBUTJBaGdnQTBFQU5nSVVJQUZCakFGcUlRUURRQ0FEUVFocUlBTkJGR29RZ2dVZ0F5Z0NDRUVCY1FSQUlBUWdBeWdDRENJRlFRSjBhaWdDQUNJR0lBVTdBWWdCSUFZZ0FUWUNXQXdCQ3dzZ0FDQUNOZ0lFSUFBZ0FUWUNBQ0FEUVNCcUpBQUxoQUVCQkg4akFFRWdheUlESkFBZ0FTOEI5Z1loQkNBRFFRQTZBQndnQXlBRU5nSVlJQU5CQURZQ0ZDQUJRZmdHYWlFRUEwQWdBMEVJYWlBRFFSUnFFSUlGSUFNb0FnaEJBWEVFUUNBRUlBTW9BZ3dpQlVFQ2RHb29BZ0FpQmlBRk93SDBCaUFHSUFFMkF2QUdEQUVMQ3lBQUlBSTJBZ1FnQUNBQk5nSUFJQU5CSUdva0FBdDdBUUYvSXdCQklHc2lCQ1FBSUFSQkNHb2dBU2dDQUNBQ0lBTWdBU2dDQkNnQ0ZCRUFBQUpBSUFRb0FnaEJCVWNFUUNBQUlBUXBBZ2czQWdBZ0FFRVFhaUFFUVJocUtRSUFOd0lBSUFCQkNHb2dCRUVRYWlrQ0FEY0NBQXdCQ3lBRUtBSU1JQVFvQWhBUTlna2dBRUVGTmdJQUN5QUVRU0JxSkFBTG53RUJBWDhqQUVIUUFHc2lBeVFBSUFOQlFHdENBRGNEQUNBRFFnQTNBemdnQXlBQk53TXdJQU1nQVVMenl0SExwNHpac3ZRQWhUY0RJQ0FESUFGQzdkNlI4NWJNM0xma0FJVTNBeGdnQXlBQU53TW9JQU1nQUVMaDVKWHoxdXpadk93QWhUY0RFQ0FESUFCQzljck5nOWVzMjdmekFJVTNBd2dnQXlBQ05nSk1JQU5CQ0dvaUFpQURRY3dBYWtFRUVMOENJQUlRNWdFZ0EwSFFBR29rQUF0NkFRRi9Jd0JCSUdzaUF5UUFJQUVvQWdCQkJVY0VRQ0FEUVJocUlBRkJFR29wQWdBM0F3QWdBMEVRYWlBQlFRaHFLUUlBTndNQUlBTWdBU2tDQURjRENFSGcwZElBUVE4Z0EwRUlha0hRa01BQUlBSVFqQVFBQ3lBQUlBRXBBZ1EzQWdBZ0FFRUlhaUFCUVF4cUtBSUFOZ0lBSUFOQklHb2tBQXR2QVFOL0l3QkJnQUZySWdRa0FFR0JBU0VDQTBBZ0FpQUVha0VDYXlBQVFROXhJZ05CTUhJZ0EwRTNhaUFEUVFwSkd6b0FBQ0FDUVFGcklRSWdBRUVQU3lBQVFRUjJJUUFOQUFzZ0FVRUJRZHoyd0FCQkFpQUNJQVJxUVFGclFZRUJJQUpyRUlNQklBUkJnQUZxSkFBTGNBRURmeU1BUVlBQmF5SUVKQUJCZ1FFaEFnTkFJQUlnQkdwQkFtc2dBRUVQY1NJRFFUQnlJQU5CMXdCcUlBTkJDa2tiT2dBQUlBSkJBV3NoQWlBQVFROUxJQUJCQkhZaEFBMEFDeUFCUVFGQjNQYkFBRUVDSUFJZ0JHcEJBV3RCZ1FFZ0Ftc1Fnd0VnQkVHQUFXb2tBQXQzQVFKL0lBQW9BZ0FoQVNBQUtBSUVJZ0FvQWdBaUFnUkFJQUVnQUNnQ0NFRUJhMEY0Y1dwQkNHb2dBaEVFQUFzQ1FDQUJRWDlHRFFBZ0FTQUJLQUlFSWdKQkFXczJBZ1FnQWtFQlJ3MEFJQUZCQkNBQUtBSUlJZ0VnQVVFRVRSc2lBU0FCSUFBb0FnUnFRUWRxUVFBZ0FXdHhFTkFJQ3d0OEFRTi9Jd0JCMEFCcklnSWtBQU5BQWtBZ0FpQUJFSVVFSUFJb0FnaEJERVlOQUNBQUtBSUlJZ01nQUNnQ0FFWUVRQ0FBSUFFb0FpQkJBV29pQkVGL0lBUWJFTXdIQ3lBQUtBSUVJQU5CMEFCc2FpQUNRZEFBL0FvQUFDQUFJQU5CQVdvMkFnZ01BUXNMSUFJUXNnZ2dBUkRtQlNBQ1FkQUFhaVFBQzNZQkJIOGpBRUVRYXlJQ0pBQWdBa0VFYWlBQkVLVUJBa0FnQWlnQ0JDSUJCRUFnQVNBQ0tBSU1JZ1JCQTNScUlnTW9BZ0FoQlNBREx3RUVJUU1nQUVFSWFpQUJJQVJCeUFCc2FrSFlBR3BCeUFEOENnQUFJQUFnQXpzQkJDQUFJQVUyQWdBTUFRc2dBRUVNTmdJSUN5QUNRUkJxSkFBTGZ3RUJmeU1BUVRCcklnTWtBQUpBSUFFZ0FpZ0NCRXNFUUNBQVFSZzZBQ0FnQUVLQWdJQ0FFRGNDQUNBQUlBSXBBZ0EzQWdnZ0FFRVlhaUFDUVJCcUtRSUFOd0lBSUFCQkVHb2dBa0VJYWlrQ0FEY0NBQXdCQ3lBRElBSWdBUkRRQmlBRFFSaHFJQUlnQVJDMkJ5QUFJQU5CTVB3S0FBQUxJQU5CTUdva0FBdDdBUUYvQWtBQ1FDQUFLQUlBSWdGQkRFWU5BQUpBQWtBQ1FFRUlJQUZCQW1zaUFTQUJRUXBQRzBFRWF3NEZCQVFBQVFJREN5QUFRUVJxRVBvR0lBQW9BZ1FnQUNnQ0NCQytDUThMSUFCQkNHb1E2Z2NQQ3lBQVFRaHFFT29ISUFBb0FqZ2dBQ2dDUEJDcENRc1BDeUFBS0FJRUlBQW9BZ2dRcVFrTG53RUJBbjhqQUVIUUFHc2lBeVFBSUFOQlFHdENBRGNEQUNBRFFnQTNBemdnQXlBQk53TXdJQU1nQVVMenl0SExwNHpac3ZRQWhUY0RJQ0FESUFGQzdkNlI4NWJNM0xma0FJVTNBeGdnQXlBQU53TW9JQU1nQUVMaDVKWHoxdXpadk93QWhUY0RFQ0FESUFCQzljck5nOWVzMjdmekFJVTNBd2dnQXlBQ053TklJQU5CQ0dvaUJDQURRY2dBYWtFSUVMOENJQVFRNWdFZ0EwSFFBR29rQUF1SkFRRUJmeU1BUVJCcklnUWtBQUpBSUFRZ0FpQURRWmU2MFFzZ0FDQUJhaUlBSUFCQmw3clJDMDhiSUFJb0FnZ2lBV3NpQUVrRWZ5QUVRUWhxSUFJZ0FTQUFFTXdDSUFRb0FnaEJnWUNBZ0hoR0RRRWdBaWdDQ0FVZ0FRc2dBeERNQWlBRUtBSUFJZ0JCZ1lDQWdIaEdEUUFnQUNBRUtBSUVRYUR3eVFBUXpBZ0FDeUFFUVJCcUpBQUxld0VCZnlNQVFTQnJJZ1FrQUNBRVFRaHFJQUVvQWdBZ0FpQURJQUVvQWdRb0FoUVJBQUFDUUNBRUtBSUlRUVZIQkVBZ0FDQUVLUUlJTndJQUlBQkJFR29nQkVFWWFpa0NBRGNDQUNBQVFRaHFJQVJCRUdvcEFnQTNBZ0FNQVFzZ0JDZ0NEQ0FFS0FJUUVLc0pJQUJCQlRZQ0FBc2dCRUVnYWlRQUMyZ0JCWDRnQUNBRFF2Ly8vLzhQZ3lJRUlBRkMvLy8vL3crRElnVitJZ1lnQlNBRFFpQ0lJZ2QrSWdVZ0JDQUJRaUNJSWdoK2ZDSUJRaUNHZkNJRU53TUFJQUFnQkNBR1ZLMGdCeUFJZmlBQklBVlVyVUlnaGlBQlFpQ0loSHg4SUFJZ0EzNThOd01JQzN3QkFYOGpBRUZBYWlJRkpBQWdCU0FCTmdJTUlBVWdBRFlDQ0NBRklBTTJBaFFnQlNBQ05nSVFJQVZCQWpZQ0hDQUZRYUQyd0FBMkFoZ2dCVUlDTndJa0lBVWdCVUVRYXExQ2dJQ0FnUEFBaERjRE9DQUZJQVZCQ0dxdFFvQ0FnSURnQUlRM0F6QWdCU0FGUVRCcU5nSWdJQVZCR0dvZ0JCQ3JCd0FMZ3dFQkFuOGpBRUV3YXlJQ0pBQUNmeUFCS0FJQUlnTkZCRUJCQUNFRFFRQU1BUXNnQWlBRE5nSWtJQUpCQURZQ0lDQUNJQU0yQWhRZ0FrRUFOZ0lRSUFJZ0FTZ0NCQ0lETmdJb0lBSWdBellDR0NBQktBSUlJUU5CQVFzaEFTQUNJQU0yQWl3Z0FpQUJOZ0ljSUFJZ0FUWUNEQ0FBSUFKQkRHb1FoQVFnQWtFd2FpUUFDM2dCQW44akFFRVFheUlESkFBZ0FpZ0NBRUhnejhrQVFRRWdBaWdDQkNnQ0RCRUNBQ0VFSUFOQkFEb0FDU0FESUFRNkFBZ2dBeUFDTmdJRUEwQWdBUVJBSUFNZ0FEWUNEQ0FEUVFScUlBTkJER3BCT3hES0FpQUJRUUZySVFFZ0FFRUJhaUVBREFFTEN5QURRUVJxRUkwSElBTkJFR29rQUF0NkFRRi9Jd0JCSUdzaUJDUUFJQVJCQ0dvZ0FTZ0NBQ0FDSUFNZ0FTZ0NCQ2dDRkJFQUFDQUFBbjhnQkNnQ0NFRUZSd1JBSUFBZ0JDa0RDRGNDQkNBQVFSUnFJQVJCR0dvcEF3QTNBZ0FnQUVFTWFpQUVRUkJxS1FNQU53SUFRUWtNQVFzZ0FDQUVLUU1RTndNSVFRTUxPZ0FBSUFSQklHb2tBQXQxQVFGL0l3QkJJR3NpQkNRQUlBUkJDR29nQVNnQ0FDQUNJQU1nQVNnQ0JDZ0NGQkVBQUFKQUlBUW9BZ2hCQlVjRVFDQUFJQVFwQWdnM0FnQWdBRUVRYWlBRVFSaHFLUUlBTndJQUlBQkJDR29nQkVFUWFpa0NBRGNDQUF3QkN5QUFRZ0UzQWdnZ0FFSUZOd0lBQ3lBRVFTQnFKQUFMZGdFQmZ5TUFRUkJySWdja0FDQURJQVpKQkVBZ0JpQURRYXptd1FBUXVRa0FDeUFIUVFScUlBRWdBaUFHYWlBRElBWnJJQVFnQlJEUEJDQUFRUVpxSUFkQkNtb3RBQUE2QUFBZ0FDQUhMd0VJT3dFRUlBY29BZ1FoQVNBQUlBY29BZ3cyQWdnZ0FDQUJJQVpxTmdJQUlBZEJFR29rQUF1QkFRRUNmeU1BUVRCcklnRWtBQUovSUFBb0FnQWlBa1VFUUVFQUlRSkJBQXdCQ3lBQklBSTJBaVFnQVVFQU5nSWdJQUVnQWpZQ0ZDQUJRUUEyQWhBZ0FTQUFLQUlFSWdJMkFpZ2dBU0FDTmdJWUlBQW9BZ2doQWtFQkN5RUFJQUVnQWpZQ0xDQUJJQUEyQWh3Z0FTQUFOZ0lNSUFGQkRHb1F0QWNnQVVFd2FpUUFDNEVCQVFKL0l3QkJNR3NpQVNRQUFuOGdBQ2dDQUNJQ1JRUkFRUUFoQWtFQURBRUxJQUVnQWpZQ0pDQUJRUUEyQWlBZ0FTQUNOZ0lVSUFGQkFEWUNFQ0FCSUFBb0FnUWlBallDS0NBQklBSTJBaGdnQUNnQ0NDRUNRUUVMSVFBZ0FTQUNOZ0lzSUFFZ0FEWUNIQ0FCSUFBMkFnd2dBVUVNYWhEbUJTQUJRVEJxSkFBTGN3RUVmeUFCS0FJY0lBRW9BaFJyUVFBZ0FTZ0NFQnNoQkNBQktBSU1JQUVvQWdSclFRQWdBU2dDQUJzaEFnSkFJQUVvQWlBaUJRUkFJQUVvQWlRZ0JVY05BUXNnQUNBQ0lBUnFJZ0UyQWdnZ0FTQUNUeUVEQ3lBQUlBTTJBZ1FnQUVGL0lBSWdCR29pQUNBQUlBSkpHellDQUF0ZUFDQUFJQUVnQkh3Z0EwSS9pU0FEUWppSmhTQURRZ2VJaFh3Z0JrSXRpU0FHUWdPSmhTQUdRZ2FJaFh3M0F3QWdBQ0FCUWorSklBRkNPSW1GSUFGQ0I0aUZJQUo4SUFWOElBZENMWWtnQjBJRGlZVWdCMElHaUlWOE53TUlDM1VCQW44Z0FTQUNwM0VoQTBFSUlRUURmeUFBSUFOcUtRQUFRb0NCZ29TSWtLREFnSCtESWdKUUJIOGdBeUFFYWlBQmNTRURJQVJCQ0dvaEJBd0JCU0FBSUFKNnAwRURkaUFEYWlBQmNTSURhaXdBQUVFQVRnUi9JQUFwQXdCQ2dJR0NoSWlRb01DQWY0TjZwMEVEZGdVZ0F3c0xDd3R5QVFOL0l3QkJFR3NpQXlRQUFrQWdBVUVIVFFSQUlBSkIvd0Z4SVFRRFFDQUJSUVJBUVFBaEFnd0RDeUFCUVFGcklRRkJBU0VDSUFBdEFBQWhCU0FBUVFGcUlRQWdCQ0FGUncwQUN3d0JDeUFEUVFocUlBSWdBQ0FCRUlZQ0lBTW9BZ2hCQVVZaEFnc2dBMEVRYWlRQUlBSUxid0VCZnlBQktBSUFJZ0lFUUNBQUlBRW9BZ2hCQVd0QmVIRnFRUWhxSUFJUkJBQUxBa0FnQUVGL1JnMEFJQUFnQUNnQ0JFRUJheUlDTmdJRUlBSU5BRUVFSUFFb0FnZ2lBaUFDUVFSTkd5SUNJQUVvQWdScVFRZHFRUUFnQW10eElnRkZEUUFnQUNBQklBSVE0d1FMQzJZQkFYOGpBRUVRYXlJREpBQUNmeUFCUVFkTkJFQWdBa0gvQVhFaEFnTkFRUUFnQVVVTkFocEJBU0FDSUFBdEFBQkdEUUlhSUFGQkFXc2hBU0FBUVFGcUlRQU1BQXNBQ3lBRFFRaHFJQUlnQUNBQkVJWUNJQU1vQWdoQkFVWUxJQU5CRUdva0FBdDlBUUYvQWtBZ0FrSC8vd054SWdVZ0FVa0VRQ0FFSVFFRFFDQUJCRUFnQVVFQmF5SUJJQU5xSUFBZ0FrSC8vd054UVFKMGFpSUNMUUFDT2dBQUlBSXZBUUFpQWlBRklBSWdCVWtiSVFJTUFRVWdCQTBEUVFCQkFFRzgwOW9BRU1ZRUFBc0FDd0FMSUFWQkFXb2dBVUdzMDlvQUVMZ0pBQXNnQXkwQUFBdCtBUUYvSXdCQkVHc2lBaVFBSUFKQkJHb2dBU2dDQkNBQktBSUlFR2NDUUNBQ0tBSUVRUUZHQkVBZ0FDQUNLUUlJTndJTUlBQWdBU2tDQURjQ0FDQUFRUWhxSUFGQkNHb29BZ0EyQWdBTUFRc2dBRUdBZ0lDQWVEWUNBQ0FBSUFFcEFnQTNBZ1FnQUVFTWFpQUJRUWhxS0FJQU5nSUFDeUFDUVJCcUpBQUxiZ0VCZnlNQVFTQnJJZ1FrQUNBRVFRaHFJQUVvQWdBZ0FpQURJQUVvQWdRb0FoUVJBQUFDUUNBRUtBSUlRUVZIQkVBZ0FDQUVLUUlJTndJQUlBQkJFR29nQkVFWWFpa0NBRGNDQUNBQVFRaHFJQVJCRUdvcEFnQTNBZ0FNQVFzZ0FFRUZOZ0lBQ3lBRVFTQnFKQUFMZWdJQmZnTi9JQUFvQWhBaEFpQUFLQUlJSVFNZ0FDa0RBQ0VCQTM4Z0FWQUVmeUFBSUFKQmdBRnJJZ0kyQWhBZ0FDQURRUWhxSWdRMkFnZ2dBQ0FES1FNQVFuK0ZRb0NCZ29TSWtLREFnSCtESWdFM0F3QWdCQ0VEREFFRklBQWdBVUlCZlNBQmd6Y0RBQ0FDSUFGNnAwRUJkRUh3QVhGckN3c0xjZ0VCZndKQUFrQUNRQUpBQWtCQkNDQUFLQUlBUVFKcklnRWdBVUVLVHh0QkJHc09CUVFFQUFFQ0F3c2dBRUVFYWhENkJpQUFLQUlFSUFBb0FnZ1F2Z2tQQ3lBQVFRaHFFT29IRHdzZ0FFRUlhaERxQnlBQUtBSTRJQUFvQWp3UXFRa0xEd3NnQUNnQ0JDQUFLQUlJRUtrSkM1VUJBUUYvSXdCQlFHb2lCQ1FBSUFSQk9HcENBRGNEQUNBRVFnQTNBekFnQkNBQk53TW9JQVFnQVVMenl0SExwNHpac3ZRQWhUY0RHQ0FFSUFGQzdkNlI4NWJNM0xma0FJVTNBeEFnQkNBQU53TWdJQVFnQUVMaDVKWHoxdXpadk93QWhUY0RDQ0FFSUFCQzljck5nOWVzMjdmekFJVTNBd0FnQkNBREVMZ0hJQVFnQWlBREVMOENJQVFRNWdFZ0JFRkFheVFBcHd0NEFRRi9Jd0JCSUdzaUFpUUFJQUFvQWdBaEFDQUNJQUVvQWdCQkFVRUFJQUVvQWdRb0Fnd1JBZ0E2QUJRZ0FpQUJOZ0lRSUFKQkFUb0FGU0FDUVFBMkFnd2dBaUFBTmdJWUlBSWdBRUVFYWpZQ0hDQUNRUXhxSUFKQkdHcEIxQUFRendJZ0FrRWNha0hWQUJEUEFoRFdBeUFDUVNCcUpBQUxhQUVEZnlNQVFSQnJJZ0lrQUNBQ1FRaHFJQUZCQWhEaUJTQUNLQUlJSWdNRWZ5QUNLQUlNSWdSQkFrWUVRQ0FETHdBQUlRRUxJQUZCQ0hRZ0FVR0EvZ054UVFoMmNpRURJQVJCQWtZRlFRQUxJUUVnQUNBRE93RUNJQUFnQVRzQkFDQUNRUkJxSkFBTGdRRUJBbjhqQUVHZ0FXc2lBaVFBUVlEZzJnQXRBQUFhUVFZUUZpSURSUVJBQUFzZ0EwRUVha0hvMU1rQUx3QUFPd0FBSUFOQjVOVEpBQ2dBQURZQUFDQUNRUVkyQWxRZ0FpQUROZ0pRSUFKQkJqWUNUQ0FDUVFRMkFsZ2dBaUFCTndOZ0lBSWdBQ0FDUWN3QWFpQUNRZGdBYWhCVElBSVFod1FnQWtHZ0FXb2tBQXR5QWdKL0FYNGpBRUVnYXlJREpBQWdBMEVNYWlJRUlBQWdBU0FDRU04QklBUVFsZ2dnQkNBQklBSVFnZ0VnQXlnQ0VDSUFJQU1vQWhSQi9JYlNBQkNxQ0NJQktBSUFRUVJIQkVCQmpJZlNBRUVLUVppSDBnQVEvUVFBQ3lBQktRTUlJQU1vQWd3Z0FCRGhDQ0FEUVNCcUpBQUxiQUVCZnlNQVFTQnJJZ1VrQUNBRlFReHFJQUVnQWlBRElBUVEwUUlDUUNBRktBSU1RWitBZ0lCNFJ3UkFJQUFnQlNrQ0REY0NBQ0FBUVJCcUlBVkJIR29vQWdBMkFnQWdBRUVJYWlBRlFSUnFLUUlBTndJQURBRUxJQUFnQlNnQ0VCRFpCQXNnQlVFZ2FpUUFDNDRCQVFSL0l3QkJFR3NpQUNRQVFTZ1EvUWdoQWhEL0NFR1FqTUFBUVFFUWdBaEJ5SUxBQUJDWEFVSGdpOEFBRU1rSFFlaU53QUJCQVVINGlNQUFFTWtIRUlJSUlRTkJDRUVFRUo4SUlnRkJpSXJBQURZQ0JDQUJJQU0yQWdBZ0FFRUlhaUFDSUFGQnFJREFBQkNIQnlBQUlBQW9BZ2hCS1JEOUNFSElpTUFBRUlnSElBQW9BZ0FnQUVFUWFpUUFDMWNBSUFBZ0FrSXlpU0FDUWk2SmhTQUNRaGVKaFNBSmZDQUlmQ0FFSUFhRklBS0RJQWFGZkNJQ0lBZDhOd01JSUFBZ0F5QUZoU0FCZ3lBRElBV0RoU0FCUWlTSklBRkNIb21GSUFGQ0dZbUZmQ0FDZkRjREFBdGlBUU4vSXdCQkVHc2lCQ1FBSUFSQkRHb2hCaUFEUlNBQVJYSkZCRUFnQkNBQ05nSU1JQVJCQ0dvaEJpQUFJQU5zSVFVTElBWWdCVFlDQUFKQUlBUW9BZ3dpQUVVTkFDQUVLQUlJSWdKRkRRQWdBU0FDSUFBUTR3UUxJQVJCRUdva0FBdG1BUVYrSUFBZ0FDa0RHQ0lCUWhDSklBRWdBQ2tEQ0h3aUFZVWlBaUFBS1FNUUlnTWdBQ2tEQUh3aUJFSWdpWHdpQlRjREFDQUFJQUpDRllrZ0JZVTNBeGdnQUNBQklBTkNEWWtnQklVaUFud2lBU0FDUWhHSmhUY0RFQ0FBSUFGQ0lJazNBd2dMWXdFRWZ5QUJJQUV2QVFnaUFrRUJhanNCQ0FKQUlBRW9BZ1FpQkVFQmRrSC8vd054SUFKTkRRQWdBa0VCZENJQ1FRSnFJQVJMRFFBZ0FTZ0NBQ0FDYWk4QUFDSUJRUWgwSUFGQkNIWnlJUVZCQVNFREN5QUFJQVU3QVFJZ0FDQURPd0VBQzI4QkFuOGdBUzhCOWdZaUJrRUxTUVJBSUFFZ0JrRUJhanNCOWdZZ0FTQUdRUU4wYWlJSElBUTdBUVFnQnlBRE5nSUFJQUVnQmtISUFHeHFRZGdBYWlBRlFjZ0EvQW9BQUNBQUlBWTJBZ2dnQUNBQ05nSUVJQUFnQVRZQ0FBOExRZHlQeVFCQklFSDhqOGtBRUp3R0FBdHdBUU4vSXdCQkVHc2lBeVFBSUFOQkJHb2dBa0VCUVFFUXNBTWdBeWdDQ0NFRUlBTW9BZ1JCQVVjRVFDQURLQUlNSVFVZ0FnUkFJQVVnQVNBQy9Bb0FBQXNnQUNBQ05nSUlJQUFnQlRZQ0JDQUFJQVEyQWdBZ0EwRVFhaVFBRHdzZ0JDQURLQUlNUVpUVzBnQVF6QWdBQzJnQkJIOUJBQ0FCUVFGMklnUnJJUVVnQVVIUUFHd2dBR3BCMEFCcklRTWdBVUVDU1NFQkFrQURRQ0FDSUFWR0RRRWdBa0VCYXlFQ0lBRkZCRUFnQUNBRFFSUVFwd1lnQUVIUUFHb2hBQ0FEUWRBQWF5RUREQUVMQ3lBQ0lBUkI5SnpTQUJER0JBQUxDNEVCQVFGL0l3QkJJR3NpQVNRQUlBRkJBRFlDQ0NBQlFvQ0FnSUFRTndJQUlBRkJtTkxKQURZQ0VDQUJRcUNBZ0lBT053SVVJQUVnQVRZQ0RDQUJRUXhxRU5ZSkJFQkJ3TkxKQUVFM0lBRkJIMnBCc05MSkFFSEUwOGtBRUl3RUFBc2dBQ0FCS1FJQU53SUFJQUJCQ0dvZ0FVRUlhaWdDQURZQ0FDQUJRU0JxSkFBTGF3RUJmeU1BUVNCcklnVWtBQ0FCS0FJQVFaK0FnSUI0UndSQUlBVkJHR29nQVVFUWFpZ0NBRFlDQUNBRlFSQnFJQUZCQ0dvcEFnQTNBd0FnQlNBQktRSUFOd01JSUFJZ0F5QUZRUWhxUWNDSHlnQWdCQkNNQkFBTElBQWdBU2tDQkRjREFDQUZRU0JxSkFBTFpnRUJmeU1BUVNCcklnUWtBQ0FBS0FJQVFaK0FnSUI0UndSQUlBUkJHR29nQUVFUWFpZ0NBRFlDQUNBRVFSQnFJQUJCQ0dvcEFnQTNBd0FnQkNBQUtRSUFOd01JSUFFZ0FpQUVRUWhxUWNDSHlnQWdBeENNQkFBTElBQW9BZ1FnQkVFZ2FpUUFDNUVUQXdaL0JYNENmQ0FCS0FJSUlnUkJnSUNBQVhFaEFpQUFLQUlBS3dNQUlRMGdCRUdBZ0lDQUFYRkZCRUFnRFpraURrUUFnT0EzZWNOQlEyWWdEVVFBQUFBQUFBQUFBR0lnRGtRdFF4enI0allhUDJOeGNrVUVRQ0FDUVFCSElRUkJBQ0VDSXdCQmdBRnJJZ0FrQUNBTnZTRUlBbjlCQXlBTm1VUUFBQUFBQUFEd2YyRU5BQnBCQWlBSVFvQ0FnSUNBZ0lENC93Q0RJZ2xDZ0lDQWdJQ0FnUGovQUZFTkFCb2dDRUwvLy8vLy8vLy9CNE1pREVLQWdJQ0FnSUNBQ0lRZ0NFSUJoa0wrLy8vLy8vLy9ENE1nQ0VJMGlLZEIvdzl4SWdJYklncENBWU1oQ3lBSlVBUkFRUVFnREZBTkFSb2dBa0d6Q0dzaEFrSUJJUWtnQzFBTUFRdENnSUNBZ0lDQWdDQWdDa0lCaGlBS1FvQ0FnSUNBZ0lBSVVTSURHeUVLUWdKQ0FTQURHeUVKUWN0M1FjeDNJQU1iSUFKcUlRSWdDMUFMSVFNZ0FDQUNPd0Y0SUFBZ0NUY0RjQ0FBUWdFM0EyZ2dBQ0FLTndOZ0lBQWdBem9BZWdKL0FrQUNRQUpBSUFOQkFtc2lBd1JBUVFFaEFrR0s4OEFBUVl2endBQWdDRUlBVXlJRkcwR0s4OEFBUVFFZ0JSc2dCQnNoQlNBSVFqK0lweUFFY2lFRVFRTWdBeUFEUVFOUEcwRUNhdzRDQXdJQkN5QUFRUU0yQWlnZ0FFR004OEFBTmdJa0lBQkJBanNCSUVFQklRVkJBQ0VFUVFFaEFpQUFRU0JxREFNTElBQkJBellDS0NBQVFZL3p3QUEyQWlRZ0FFRUNPd0VnSUFCQklHb01BZ3NnQUVFZ2FpQUFRZUFBYWlBQVFROXFFQ3NDUUNBQUtBSWdCRUFnQUVIWUFHb2dBRUVvYWlnQ0FEWUNBQ0FBSUFBcEFpQTNBMUFNQVFzZ0FFSFFBR29nQUVIZ0FHb2dBRUVQYWhBVEN5QUFJQUFvQWxBZ0FDZ0NWQ0FBTHdGWVFRRWdBRUVnYWhEcEFTQUFLQUlFSVFJZ0FDZ0NBQXdCQ3lBQVFRRTJBakFnQUVFQU93RXNRUUloQWlBQVFRSTJBaWdnQUVIazhzQUFOZ0lrSUFCQkFqc0JJQ0FBUVNCcUN5RURJQUFnQWpZQ1hDQUFJQU0yQWxnZ0FDQUVOZ0pVSUFBZ0JUWUNVQ0FCSUFCQjBBQnFFSDBnQUVHQUFXb2tBQThMQW44Z0FrRUFSeUVFUVFBaEFpTUFRYUFCYXlJQUpBQWdEYjBoQ0FKL1FRTWdEWmxFQUFBQUFBQUE4SDloRFFBYVFRSWdDRUtBZ0lDQWdJQ0ErUDhBZ3lJSlFvQ0FnSUNBZ0lENC93QlJEUUFhSUFoQy8vLy8vLy8vL3dlRElneENnSUNBZ0lDQWdBaUVJQWhDQVlaQy92Ly8vLy8vL3crRElBaENOSWluUWY4UGNTSUNHeUlLUWdHRElRc2dDVkFFUUVFRUlBeFFEUUVhSUFKQnN3aHJJUUpDQVNFSklBdFFEQUVMUW9DQWdJQ0FnSUFnSUFwQ0FZWWdDa0tBZ0lDQWdJQ0FDRkVpQXhzaENrSUNRZ0VnQXhzaENVSExkMEhNZHlBREd5QUNhaUVDSUF0UUN5RURJQUFnQWpzQmlBRWdBQ0FKTndPQUFTQUFRZ0UzQTNnZ0FDQUtOd053SUFBZ0F6b0FpZ0VDUUFKQUFrQUNRQUpBQWtBZ0EwRUNheUlEQkVCQkFTRUNRWXJ6d0FCQmkvUEFBQ0FJUWdCVElnVWJRWXJ6d0FCQkFTQUZHeUFFR3lFRklBaENQNGluSUFSeUlRWkJBeUFESUFOQkEwOGJRUUpyRGdJQ0F3RUxJQUJCQXpZQ0lDQUFRWXp6d0FBMkFod2dBRUVDT3dFWVFRRWhCVUVCSVFJTUF3c2dBRUVETmdJZ0lBQkJqL1BBQURZQ0hDQUFRUUk3QVJnTUFnc2dBRUVETmdJZ0lBQkJrL1BBQURZQ0hDQUFRUUk3QVJnTUFRc2dBRUhnQUdvZ0FFSHdBR29nQUVFSGFoQXJBa0FnQUNnQ1lBUkFJQUJCbUFGcUlBQkI2QUJxS0FJQU5nSUFJQUFnQUNrQ1lEY0RrQUVNQVFzZ0FFR1FBV29nQUVId0FHb2dBRUVIYWhBVEN5QUFLQUtVQVNJQ1JRMEJJQUFvQXBBQklnUXRBQUJCTUUwTkFpQUFMZ0dZQVNFRElBQWdCRFlDSENBQVFRSTdBUmdnQUVFQk5nSWdBbjhnQWtFQlJnUkFRUU1oQWlBQVFTUnFEQUVMSUFCQkFqc0JNQ0FBUWNUWXlRQTJBaWdnQUVFQ093RWtJQUFnQWtFQmF6WUNPQ0FBUVFFMkFpd2dBQ0FFUVFGcU5nSTBRUVVoQWlBQVFUeHFDeUlFUVFFN0FRd2dCRUVDT3dFQUlBUkJBU0FEYXlBRFFRRnJJQU5CQUV3aUF4czdBUTRnQkVFQ1FRRWdBeHMyQWdnZ0JFR0k4OEFBUWJtQnpnQWdBeHMyQWdRTElBQWdBallDYkNBQUlBWTJBbVFnQUNBRk5nSmdJQUFnQUVFWWFqWUNhQ0FCSUFCQjRBQnFFSDBnQUVHZ0FXb2tBQXdDQzBISThNQUFRU0ZCNlBMQUFCQ2NCZ0FMUWJUeXdBQkJIMEg0OHNBQUVKd0dBQXNQQ3lBQ1FRQkhJUVVnQVM4QkRpRUFRUUFoQkNNQVFmQUlheUlDSkFBZ0RiMGhDUUovUVFNZ0RabEVBQUFBQUFBQThIOWhEUUFhUVFJZ0NVS0FnSUNBZ0lDQStQOEFneUlLUW9DQWdJQ0FnSUQ0L3dCUkRRQWFJQWxDLy8vLy8vLy8vd2VESWd4Q2dJQ0FnSUNBZ0FpRUlBbENBWVpDL3YvLy8vLy8vdytESUFsQ05JaW5RZjhQY1NJRUd5SUlRZ0dESVFzZ0NsQUVRRUVFSUF4UURRRWFJQVJCc3docklRUkNBU0VLSUF0UURBRUxRb0NBZ0lDQWdJQWdJQWhDQVlZZ0NFS0FnSUNBZ0lDQUNGRWlBeHNoQ0VJQ1FnRWdBeHNoQ2tITGQwSE1keUFER3lBRWFpRUVJQXRRQ3lFRElBSWdCRHNCNkFnZ0FpQUtOd1BnQ0NBQ1FnRTNBOWdJSUFJZ0NEY0QwQWdnQWlBRE9nRHFDQUovQWtBQ1FBSkFBa0FnQTBFQ2F5SUdCRUJCQVNFRFFZcnp3QUJCaS9QQUFDQUpRZ0JUSWdjYlFZcnp3QUJCQVNBSEd5QUZHeUVISUFsQ1A0aW5JQVZ5SVFWQkF5QUdJQVpCQTA4YlFRSnJEZ0lDQXdFTElBSkJBellDbUFnZ0FrR004OEFBTmdLVUNDQUNRUUk3QVpBSVFRRWhCMEVBSVFWQkFTRURJQUpCa0FocURBUUxJQUpCQXpZQ21BZ2dBa0dQODhBQU5nS1VDQ0FDUVFJN0FaQUlJQUpCa0FocURBTUxRUUloQXlBQ1FRSTdBWkFJSUFCRkRRRWdBaUFBTmdLZ0NDQUNRUUE3QVp3SUlBSkJBallDbUFnZ0FrSGs4c0FBTmdLVUNDQUNRWkFJYWd3Q0MwRjBRUVVnQk1FaUEwRUFTQnNnQTJ3aUEwSEEvUUJKQkVBZ0FrR1FDR29nQ0NBRUlBSkJFR29nQTBFRWRrRVZhaUlEUVlDQWZrRUFJQUJySUFEQlFRQklHeUlFRUdJZ0JNRWhCQUpBSUFJb0FwQUlCRUFnQWtISUNHb2dBa0dZQ0dvb0FnQTJBZ0FnQWlBQ0tRS1FDRGNEd0FnTUFRc2dBa0hBQ0dvZ0FrSFFDR29nQWtFUWFpQURJQVFRRndzZ0JDQUNMZ0hJQ0NJRFNBUkFJQUpCQ0dvZ0FpZ0N3QWdnQWlnQ3hBZ2dBeUFBSUFKQmtBaHFFT2tCSUFJb0Fnd2hBeUFDS0FJSURBTUxRUUloQXlBQ1FRSTdBWkFJSUFCRkJFQkJBU0VESUFKQkFUWUNtQWdnQWtHUzg4QUFOZ0tVQ0NBQ1FaQUlhZ3dEQ3lBQ0lBQTJBcUFJSUFKQkFEc0JuQWdnQWtFQ05nS1lDQ0FDUWVUeXdBQTJBcFFJSUFKQmtBaHFEQUlMUVpiendBQkJKVUc4ODhBQUVKd0dBQXRCQVNFRElBSkJBVFlDbUFnZ0FrR1M4OEFBTmdLVUNDQUNRWkFJYWdzaEFDQUNJQU0yQXN3SUlBSWdBRFlDeUFnZ0FpQUZOZ0xFQ0NBQ0lBYzJBc0FJSUFFZ0FrSEFDR29RZlNBQ1FmQUlhaVFBQzRrQkFRUi9Jd0JCRUdzaUFDUUFRU2dRL1FnaEFoRC9DRUdVeGRJQVFRRVFnQWhCN01uU0FCQ1lBVUhNeXRJQUVNa0hRWlRJMGdCQkFVR2t3TklBRU1rSEVJWUlJUU5CQ0VFRUVKOElJZ0ZCcEwzU0FEWUNCQ0FCSUFNMkFnQWdBRUVJYWlBQ0lBRkI1THZTQUJDUUJ5QUFJQUFvQWdoQktSRDlDQkNTQnlBQUtBSUFJQUJCRUdva0FBdG9BUUYvSXdCQndBRnJJZ0lrQUNBQ1FSaHFRUUJCd1FEOEN3QWdBa0VJYWtIWXNNa0FLUU1BTndNQUlBSkNBRGNERUNBQ1FkQ3d5UUFwQXdBM0F3QWdBaUFCUVJBUW5RSWdBa0hnQUdvaUFTQUNRZUFBL0FvQUFDQUFJQUVRdHdFZ0FrSEFBV29rQUF0b0FRRi9Jd0JCd0FGcklnTWtBQ0FEUVJocVFRQkJ3UUQ4Q3dBZ0EwRUlha0hZc01rQUtRTUFOd01BSUFOQ0FEY0RFQ0FEUWRDd3lRQXBBd0EzQXdBZ0F5QUJJQUlRblFJZ0EwSGdBR29pQVNBRFFlQUEvQW9BQUNBQUlBRVF0d0VnQTBIQUFXb2tBQXRuQVFGL0lBRkJnQkJxSVFSQkNpRUJBMEFDUUNBRElBRjJRUUZ4SUFKQmYzTnFJZ0pCd0FSUEJFQWdBVUVCYWlFQlFmLy9BU0VDREFFTElBRkJBV29oQVNBRUlBSkJBWFJxTGdFQUlnSkJBRWdOQVFzTElBQWdBallDQUNBQUlBRkIvd0Z4TmdJRUMyd0JBMzhqQUVFUWF5SURKQUFnQTBFRWFpQUNFUFFESUFNb0FnZ2hCQ0FES0FJRVFRRkhCRUFnQXlnQ0RDRUZJQUlFUUNBRklBRWdBdndLQUFBTElBQWdBallDQ0NBQUlBVTJBZ1FnQUNBRU5nSUFJQU5CRUdva0FBOExJQVFnQXlnQ0RFR1UxdElBRU13SUFBdGdBUUYvSUFGQkFuUWhBUU5BSUFFRVFDQUFJQUFvQWdBaUFpQUNJQUpCQkhaelFZQ1l2Qmh4SWdKQkJIUnpJQUp6SWdJZ0FpQUNRUUoyYzBHQTVvQ1lBM0VpQWtFQ2RITWdBbk0yQWdBZ0FVRUVheUVCSUFCQkJHb2hBQXdCQ3dzTFlRRUJmeUFCUVFKMElRRURRQ0FCQkVBZ0FDQUFLQUlBSWdJZ0FpQUNRUVIyYzBHQWhyemdBSEVpQWtFRWRITWdBbk1pQWlBQ0lBSkJBblp6UVlEbWdKZ0RjU0lDUVFKMGN5QUNjellDQUNBQlFRUnJJUUVnQUVFRWFpRUFEQUVMQ3d0MkFRTi9Jd0JCRUdzaUF5UUFBbjhnQVNnQ0FDSUNRUWRHQkVBZ0FTZ0NEQ0VDUVorQWdJQjRJUVFnQVNnQ0NBd0JDeUFEUVFocUlBSVE3UVlnQUNBREtRTUlOd0lNUVlHQWdJQjRJUVJCQmlFQ1Fjbk95UUFMSVFFZ0FDQUNOZ0lJSUFBZ0FUWUNCQ0FBSUFRMkFnQWdBMEVRYWlRQUMzWUJBMzhqQUVFUWF5SURKQUFDZnlBQktBSUFJZ0pCQmtZRVFDQUJLQUlNSVFKQm40Q0FnSGdoQkNBQktBSUlEQUVMSUFOQkNHb2dBaER0QmlBQUlBTXBBd2czQWd4QmdZQ0FnSGdoQkVFRUlRSkJxTlhKQUFzaEFTQUFJQUkyQWdnZ0FDQUJOZ0lFSUFBZ0JEWUNBQ0FEUVJCcUpBQUxaUUVCZndKQUFrQUNRQUpBQWtCQkNDQUFLQUlBUVFKcklnRWdBVUVLVHh0QkJHc09CUVFFQUFFQ0F3c2dBRUVFYWhDR0NROExJQUJCR0dvUWxBZ1BDeUFBUVJocUVKUUlJQUFvQWpnZ0FDZ0NQQkNwQ1FzUEN5QUFLQUlFSUFBb0FnZ1FxUWtMWlFFQmZ3SkFBa0FDUUFKQUFrQkJDQ0FBS0FJQVFRSnJJZ0VnQVVFS1R4dEJCR3NPQlFRRUFBRUNBd3NnQUVFRWFoQ0dDUThMSUFCQkNHb1E2Z2NQQ3lBQVFRaHFFT29ISUFBb0FqZ2dBQ2dDUEJDcENRc1BDeUFBS0FJRUlBQW9BZ2dRcVFrTGJ3RUJmeU1BUVJCcklnTWtBQ0FBQW44Z0FVRUVSZ1JBSUFBZ0FqY0RDRUVBREFFTElBTkJDR29nQVJEdEJpQURLQUlJSVFFZ0FDQURLQUlNTmdJVUlBQWdBVFlDRUNBQVFRYzJBZ3dnQUVHK3pza0FOZ0lJSUFCQmdZQ0FnSGcyQWdSQkFRczJBZ0FnQTBFUWFpUUFDNHNCQVFGL0l3QkJRR29pQXlRQUlBTkJPR3BDQURjREFDQURRZ0EzQXpBZ0F5QUJOd01vSUFNZ0FVTHp5dEhMcDR6WnN2UUFoVGNER0NBRElBRkM3ZDZSODViTTNMZmtBSVUzQXhBZ0F5QUFOd01nSUFNZ0FFTGg1Slh6MXV6WnZPd0FoVGNEQ0NBRElBQkM5Y3JOZzllczI3ZnpBSVUzQXdBZ0FpQURFTGNISUFNUTVnRWdBMEZBYXlRQUMyb0JBbjhqQUVFd2F5SUNKQUFnQVNnQ0JDRURJQUVvQWdBZ0FpQUFLQUlBS1FJQU53SUlJQUpCQVRZQ0ZDQUNRWURzeVFBMkFoQWdBa0lCTndJY0lBSkJDellDTENBQ0lBSkJLR28yQWhnZ0FpQUNRUWhxTmdJb0lBTWdBa0VRYWhEZkNDQUNRVEJxSkFBTGZnQWdBQ2dDQUVFQ1J3UkFJQUJCZ0FGcUVJUUJJQUFvQWlBZ0FDZ0NKQkNwQ1NBQUtBSXNJQUFvQWpBUXFRa2dBQ2dDT0NBQUtBSThFS2tKSUFBb0FrUWdBQ2dDU0JDcENTQUFLQUpRSUFBb0FsUVFxUWtnQUNnQ1hDQUFLQUpnRUtrSklBQW9BbWdnQUNnQ2JCQ3BDU0FBS0FKMElBQW9BbmdRcVFrTEMyNEJBbjhqQUVFZ2F5SUZKQUFnQlVFTWFpSUdJQUlnQXlBRUVNOEJJQVlRbGdnaEFpQUdJQU1nQkJDQ0FTQUFJQUVnQWlBRktBSVFJZ0FnQlNnQ0ZCQ3JDQkMwQlNJQlJRUkFRWXlIMGdCQkNrR1loOUlBRVAwRUFBc2dCU2dDRENBQUVPQUlJQVZCSUdva0FDQUJDMjBCQVg4akFFRWdheUlFSkFBQ2Z5QUJJQUlnQTBIVXdNb0FRUXdReUFNaUF3UkFJQVJCREdvZ0F4QzVCQ0FFS0FJTVFaK0FnSUI0UmdSQUlBUW9BaFFoQXlBRUtBSVFEQUlMSUFSQkRHb1E0Z2dMUVFBTElRSWdBQ0FETmdJRUlBQWdBallDQUNBRVFTQnFKQUFMZXdFQmZ5TUFRUkJySWdNa0FFR1EzTm9BUVpEYzJnQW9BZ0FpQkVFQmFqWUNBQUpBSUFSQkFFZ05BQUpBUWR6ZjJnQXRBQUJGQkVCQjJOL2FBRUhZMzlvQUtBSUFRUUZxTmdJQVFZemMyZ0FvQWdCQkFFNE5BUXdDQ3lBRFFRaHFJQUFnQVJFQkFBQUxRZHpmMmdCQkFEb0FBQ0FDUlEwQUFBc0FDMnNDQW44QmZpQUJLQUlBSWdJZ0FVRU1heUlES0FJQVNRUkFJQUVwQWdRaEJBTkFBa0FnQXlJQlFReHFJQUVwQWdBM0FnQWdBVUVVYWlBQlFRaHFLQUlBTmdJQUlBQWdBVVlOQUNBQ0lBRkJER3NpQXlnQ0FFa05BUXNMSUFFZ0JEY0NCQ0FCSUFJMkFnQUxDM1VCQW44akFFRVFheUlESkFBQ2Z5QUJLQUlBSWdKQkMwWUVRQ0FBSUFFdkFRZzdBUWhCbjRDQWdIZ2hBaUFCS0FJRURBRUxJQU5CQ0dvZ0FoRHRCaUFBSUFNcEF3ZzNBZ3dnQUVFSk5nSUlRWUdBZ0lCNElRSkJ6ODdKQUFzaEFTQUFJQUkyQWdBZ0FDQUJOZ0lFSUFOQkVHb2tBQXRzQVFKL0l3QkJFR3NpQXlRQUFrQWdBQ0FCS0FJSUlnUWdBU2dDQUVrRWZ5QURRUWhxSUFFZ0JFRUJRUUVRMkFJZ0F5Z0NDQ0lFUVlHQWdJQjRSdzBCSUFFb0FnZ0ZJQVFMTmdJRUlBQWdBU2dDQkRZQ0FDQURRUkJxSkFBUEN5QUVJQU1vQWd3Z0FoRE1DQUFMYWdJQmZ3RitJd0JCTUdzaUF5UUFJQU1nQVRZQ0JDQURJQUEyQWdBZ0EwRUNOZ0lNSUFOQjlQVEFBRFlDQ0NBRFFnSTNBaFFnQTBLQWdJQ0FvQU1pQkNBRHJZUTNBeWdnQXlBRUlBTkJCR3F0aERjRElDQURJQU5CSUdvMkFoQWdBMEVJYWlBQ0VLc0hBQXR1QVFGL0lBQXRBQVFoQVNBQUxRQUZCRUFnQUFKL1FRRWdBVUVCY1EwQUdpQUFLQUlBSWdFdEFBcEJnQUZ4UlFSQUlBRW9BZ0JCMS9iQUFFRUNJQUVvQWdRb0Fnd1JBZ0FNQVFzZ0FTZ0NBRUhXOXNBQVFRRWdBU2dDQkNnQ0RCRUNBQXNpQVRvQUJBc2dBVUVCY1F0dEFRRi9Jd0JCRUdzaUJDUUFBbjlCZ1lDQWdIZ2dBU2dDQUNBQ2F5QURUdzBBR2lBRVFRaHFJQUVnQWlBRFFRRkJBUkNJQWtHQmdJQ0FlQ0FFS0FJSUlnTkJnWUNBZ0hoR0RRQWFJQVFvQWd3aEFpQURDeUVCSUFBZ0FqWUNCQ0FBSUFFMkFnQWdCRUVRYWlRQUMyQUJBWDhqQUVFUWF5SUVKQUFDZnlBQVJRUkFRUUFoQUNBRVFReHFEQUVMSUFRZ0FqWUNEQ0FBSUFOc0lRQWdCRUVJYWdzZ0FEWUNBQUpBSUFRb0Fnd2lBRVVOQUNBRUtBSUlJZ0pGRFFBZ0FTQUNJQUFRNHdRTElBUkJFR29rQUF0bUFRSi9Jd0JCRUdzaUFpUUFBa0FnQUNBQktBSUFJZ01nQVNnQ0JFWUVma0lBQlNBQklBTkJ5QUJxTmdJQUlBSWdBeEN6QmlBQ0tBSUFSUTBCSUFBZ0Fpc0RDRGtEQ0VJQkN6Y0RBQ0FDUVJCcUpBQVBDMEdNaDlJQVFRcEJ3STNLQUJEOUJBQUxaZ0VDZnlNQVFSQnJJZ0lrQUFKQUlBQWdBU2dDQUNJRElBRW9BZ1JHQkg1Q0FBVWdBU0FEUWNnQWFqWUNBQ0FDSUFNUXN3WWdBaWdDQUVVTkFTQUFJQUlyQXdnNUF3aENBUXMzQXdBZ0FrRVFhaVFBRHd0QmpJZlNBRUVLUVlDTnlnQVEvUVFBQzJzQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQUMwQUFBNElCZ1lCQWdNRUJRSUFDeUFBUVFocUVMVUJEd3NnQUNnQ0JDQUFLQUlJRVBZSkN3OExJQUJCQkdvUWtBa1BDeUFBUVFScUVKQUpEd3NnQUNnQ0JDQUFLQUlJRVBZSkR3c2dBQ2dDQkNBQUtBSUlFUFlKQzJzQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQUMwQUFBNElCZ1lCQWdNRUJRSUFDeUFBUVFocUVMVUJEd3NnQUNnQ0JDQUFLQUlJRUs0SkN3OExJQUJCQkdvUWtBa1BDeUFBUVFScUVKQUpEd3NnQUNnQ0JDQUFLQUlJRUs0SkR3c2dBQ2dDQkNBQUtBSUlFSzRKQzI0QUFrQUNRQUpBQWtBQ1FBSkFJQUF0QUFCQkFXc09Cd1VCQWdNRUFnQUZDeUFBUVFocUVMRUJEd3NnQUNnQ0JDQUFLQUlJRUs0SkN3OExJQUJCQkdvUTlRWWdBQ2dDQkNBQUtBSUlFS3dKRHdzZ0FDZ0NCQ0FBS0FJSUVLNEpEd3NnQUNnQ0JDQUFLQUlJRUs0SkMyb0JBWDhqQUVFUWF5SUdKQUFnQmtFRWFpQUJJQUlnQXlBRUlBVkJBUkFLSUFZb0Fnd2hBaUFHS0FJRUlRTWdCaThBQ1NFRUlBWXRBQWdpQlVVRVFDQUJRUW82QUJnTElBQWdCRHNBQlNBQUlBVTZBQVFnQUNBQ05nSUlJQUFnQXpZQ0FDQUdRUkJxSkFBTGF3RUJmeU1BUVNCcklnUWtBQ0FDSUFOSkJFQWdCRUVBTmdJWUlBUkJBVFlDRENBRVFkak0yZ0EyQWdnZ0JFSUVOd0lRSUFSQkNHcEJ3Sy9KQUJDckJ3QUxJQUFnQXpZQ0JDQUFJQUUyQWdBZ0FDQUNJQU5yTmdJTUlBQWdBU0FEYWpZQ0NDQUVRU0JxSkFBTGNnRUNmeU1BUVNCcklnWWtBQ0FHUVF4cUlnY2dBeUFFSUFVUXp3RWdCaWdDREVHZmdJQ0FlRVlFUUNBSElBRWdBaUFHS0FJUUVMa0RFTGtFSUFZZ0IwSFFqY29BUVFSQjFJM0tBQkN1QkNBQUlBWW9BZ0FnQmlnQ0JCQ1JBU0FHUVNCcUpBQVBDMEhramNvQVFRVVE3Z2tBQzJRQ0FYOEJmaU1BUVNCcklnUWtBQ0FBS0FJQVFRRkdCRUFnQkVFWWFpQUFRUlJxS0FJQU5nSUFJQVJCRUdvZ0FFRU1haWtDQURjREFDQUVJQUFwQWdRM0F3Z2dBU0FDSUFSQkNHcEJ3SWZLQUNBREVJd0VBQXNnQUNrRENDQUVRU0JxSkFBTFlBSUNmd0YrSUFFdEFBc2lBeUFCTFFBS0lnSkpCSDlCQUFVZ0FTQURJQUpyT2dBTElBRWdBU2tEQUNBQ3JZa2lCQ0FCTHdFSUlnR3RRbitGUW9DQWZJU0ROd01BSUFFZ0JLZHhJUUpCQVFzaEFTQUFJQUk3QVFJZ0FDQUJPd0VBQzJnQkFYOGpBRUVnYXlJRkpBQWdBaUFEU1FSQUlBVkJBRFlDR0NBRlFRRTJBZ3dnQlVIWXpOb0FOZ0lJSUFWQ0JEY0NFQ0FGUVFocUlBUVFxd2NBQ3lBQUlBTTJBZ1FnQUNBQk5nSUFJQUFnQWlBRGF6WUNEQ0FBSUFFZ0EybzJBZ2dnQlVFZ2FpUUFDM3NDQVg4Q2ZpTUFRUkJySWdFa0FBSitRZURmMmdBb0FnQkJBVVlFUUVIdzM5b0FLUU1BSVFKQjZOL2FBQ2tEQUF3QkN5QUJFTE1GUWVEZjJnQkNBVGNEQUVIdzM5b0FJQUVwQXdnaUFqY0RBQ0FCS1FNQUN5RURJQUFnQWpjRENDQUFJQU0zQXdCQjZOL2FBQ0FEUWdGOE53TUFJQUZCRUdva0FBdGJBUUYvQWtBZ0FTQUNRUUZxSWdSTkRRQWdBU0FDUVg5emFrRU1iQ0lCUlEwQUlBQWdCRUVNYkdvZ0FDQUNRUXhzYWlBQi9Bb0FBQXNnQUNBQ1FReHNhaUlBSUFNcEFnQTNBZ0FnQUVFSWFpQURRUWhxS0FJQU5nSUFDMk1CQkg4akFFRVFheUlCSkFBZ0FDZ0NBQ0VESUFBb0FnUWhCQ0FCUVFocUlBQVE2Z0pCZ0lERUFDRUNJQUVvQWdoQkFYRUVRQ0FCS0FJTUlRSWdBQ0FBS0FJQUlBQW9BZ2dnQkdvZ0F5QUFLQUlFYW10cU5nSUlDeUFCUVJCcUpBQWdBZ3RmQVFKL0l3QkJFR3NpQXlRQUFuOGdBU0FDUWY4SGNVRUJkR291QVFBaUJFRUFTQVJBSUFOQkNHb2dBU0FFSUFJUXRBUWdBeWdDQ0NFRUlBTW9BZ3dNQVFzZ0JFRUpkZ3NoQWlBQUlBUTJBZ0FnQUNBQ05nSUVJQU5CRUdva0FBdHJBUUovSXdCQkVHc2lBeVFBQW44Z0FTZ0NBQ0lDUVFsR0JFQkJuNENBZ0hnaEFpQUJRUWhxREFFTElBTkJDR29nQWhEdEJpQUFJQU1wQXdnM0Fnd2dBRUVLTmdJSVFZR0FnSUI0SVFKQjNjN0pBQXNoQVNBQUlBSTJBZ0FnQUNBQk5nSUVJQU5CRUdva0FBdGpBUUYvSXdCQklHc2lCQ1FBSUFSQkNHb2dBU2dDQUNBQ0lBTWdBU2dDQkNnQ0ZCRUFBQUovSUFRb0FnaEJCVVlFUUNBQUlBUXRBQXc2QUFWQkFRd0JDeUFFUVFocUVNNElRUUFMSVFFZ0FFRUZOZ0lBSUFBZ0FUb0FCQ0FFUVNCcUpBQUxhd0VDZnlNQVFSQnJJZ01rQUFKL0lBRW9BZ0FpQWtFSVJnUkFRWitBZ0lCNElRSWdBVUVFYWd3QkN5QURRUWhxSUFJUTdRWWdBQ0FES1FNSU53SU1JQUJCQlRZQ0NFR0JnSUNBZUNFQ1Fkak95UUFMSVFFZ0FDQUNOZ0lBSUFBZ0FUWUNCQ0FEUVJCcUpBQUxZd0VCZnlNQVFTQnJJZ1FrQUNBRVFRaHFJQUVvQWdBZ0FpQURJQUVvQWdRb0FoUVJBQUFDZnlBRUtBSUlRUVZHQkVBZ0FDQUVMUUFNT2dBRlFRRU1BUXNnQkVFSWFoRG9DRUVBQ3lFQklBQkJCVFlDQUNBQUlBRTZBQVFnQkVFZ2FpUUFDMWtCQW44akFFRVFheUlDSkFBQ2Z5QUFSUVJBUVFBaEFDQUNRUXhxREFFTElBSkJBVFlDRENBQ1FRaHFDeUFBTmdJQUFrQWdBaWdDRENJQVJRMEFJQUlvQWdnaUEwVU5BQ0FCSUFNZ0FCRGpCQXNnQWtFUWFpUUFDNEFCQVFGL0lBRW9BZ0FoQWlBQktBSUVLQUlNSVFFQ1FBSkFBa0FDUUFKQUlBQW9BZ0F0QUFCQkFXc09CQUVDQXdRQUN5QUNRWS9zeVFCQkZ5QUJFUUlBRHdzZ0FrR203TWtBUVJZZ0FSRUNBQThMSUFKQnZPekpBRUVUSUFFUkFnQVBDeUFDUWMvc3lRQkJGQ0FCRVFJQUR3c2dBa0hqN01rQVFSMGdBUkVDQUF0bEFRTi9JQUVvQWdBaUFpZ0NBQ0FCUVFocklnTW9BZ0FvQWdCSkJFQWdBU2dDQkNFRUEwQUNRQ0FESWdGQkNHb2dBU2tDQURjQ0FDQUFJQUZHRFFBZ0FpZ0NBQ0FCUVFocklnTW9BZ0FvQWdCSkRRRUxDeUFCSUFRMkFnUWdBU0FDTmdJQUN3dGZBZ0ovQW40Z0FTMEFBQ0lDSUFGQkNHc2lBeTBBQUVrRVFDQUNyU0VFSUFFMUFnUWhCUU5BQWtBZ0F5SUJRUWhxSUFFcEFnQTNBZ0FnQUNBQlJnMEFJQUlnQVVFSWF5SURMUUFBU1EwQkN3c2dBU0FGUWlDR0lBU0VOd0lBQ3d0V0FRRi9Jd0JCRUdzaUF5UUFBbjhnQUVVRVFFRUFJUUFnQTBFTWFnd0JDeUFEUVFRMkFnd2dBQ0FDYkNFQUlBTkJDR29MSUFBMkFnQWdBeWdDRENJQUJFQWdBU0FBSUFNb0FnZ1EwQWdMSUFOQkVHb2tBQXRXQVFGL0l3QkJFR3NpQXlRQUFuOGdBRVVFUUVFQUlRQWdBMEVNYWd3QkN5QURRUUkyQWd3Z0FDQUNiQ0VBSUFOQkNHb0xJQUEyQWdBZ0F5Z0NEQ0lBQkVBZ0FTQUFJQU1vQWdnUTBBZ0xJQU5CRUdva0FBdGRBUUYvQWtBZ0FFRUVheWdDQUNJQ1FYaHhJZ05CQkVFSUlBSkJBM0VpQWhzZ0FXcFBCRUFnQWtFQUlBTWdBVUVuYWtzYkRRRWdBQkJwRHd0Qm5ZM1NBRUV1UWN5TjBnQVFuQVlBQzBIY2pkSUFRUzVCakk3U0FCQ2NCZ0FMVndFRGZ5TUFRUkJySWdJa0FDQUJLQUlFSWdNZ0FTMEFDQ0lFU1FSL1FRQUZJQUpCQ0dvZ0FTQURJQVJ1UVFGckVQd0JJQUlvQWd3aEF5QUNLQUlJQ3lFQklBQWdBellDQkNBQUlBRTJBZ0FnQWtFUWFpUUFDM01BSUFCQmdBRnFFSVFCSUFBb0FpQWdBQ2dDSkJDcENTQUFLQUlzSUFBb0FqQVFxUWtnQUNnQ09DQUFLQUk4RUtrSklBQW9Ba1FnQUNnQ1NCQ3BDU0FBS0FKUUlBQW9BbFFRcVFrZ0FDZ0NYQ0FBS0FKZ0VLa0pJQUFvQW1nZ0FDZ0NiQkNwQ1NBQUtBSjBJQUFvQW5nUXFRa0xYd0VDZnlNQVFSQnJJZ01rQUNBRFFRUnFJQUZCQVVFQlFRRVE3d0lnQXlnQ0NDRUVJQU1vQWdSQkFVWUVRQ0FFSUFNb0Fnd2dBaERNQ0FBTElBTW9BZ3doQWlBQUlBRTJBZ2dnQUNBQ05nSUVJQUFnQkRZQ0FDQURRUkJxSkFBTFd3RUNmeU1BUVJCcklnSWtBQ0FDUVFocUlBRWdBRUVRUWJpb3lRQVFud2RCRUNBQmF5RURJQUlvQWd3aEFTQUNLQUlJSVFBRFFDQUJCRUFnQUNBRE9nQUFJQUZCQVdzaEFTQUFRUUZxSVFBTUFRc0xJQUpCRUdva0FBdGRBUUYvSUFBZ0FFR21zb1dLQTJ3aUFTQUFRYm56M2ZGNWJIT3RRcVlIZmtJZ2lLZEJBWFJCbXVYVEFHb3ZBUUJxUWJuejNmRjViQ0FCYzYxQ3BnZCtRaUNJcDBFQ2RFSG84OU1BYWlnQ0FDSUJRUUFnQUNBQlFRaDJSaHNMWVFBQ1FBSkFBa0FDUUFKQUFrQWdBQzBBQUVFQmF3NEhCUUVDQXdRQ0FBVUxJQUJCQ0dvUXNRRVBDeUFBS0FJRUlBQW9BZ2dROWdrTER3c2dBRUVFYWhEMkNBOExJQUFvQWdRZ0FDZ0NDQkQyQ1E4TElBQW9BZ1FnQUNnQ0NCRDJDUXRiQUFKQUFrQUNRQUpBSUFBb0FnQU9CQUVEQXdJQUN5QUFLQUlNSUFBb0FoQVE5Z2tnQUNnQ0NFVU5BQ0FBUVFocUVNOElDdzhMSUFBb0Fnd2dBQ2dDRUJEMkNTQUFRUWhxRU04SUR3c2dBQ2dDQ0NBQUtBSU1FUFlKQzNBQkEzOGpBRUVRYXlJQUpBQkJMeEQ5Q0NFQlFRUkJCQkNmQ0NJQ1FaRFIwZ0EyQWdBZ0FFRUlhaUFDUWZDR3dBQkJJeEQ5Q0JDK0JrRzRoOEFBRU1jSFFhQ0J3QUFRaWdjZ0FDQUJJQUFvQWdoQnFJekFBRUVBRUlBSVFjaUN3QUFRaHdjZ0FDZ0NBQ0FBUVJCcUpBQUxXd0FDUUFKQUFrQUNRQ0FBS0FJQURnUUJBd01DQUFzZ0FDZ0NEQ0FBS0FJUUVLNEpJQUFvQWdoRkRRQWdBRUVJYWhEU0NBc1BDeUFBS0FJTUlBQW9BaEFRcmdrZ0FFRUlhaERTQ0E4TElBQW9BZ2dnQUNnQ0RCQ3VDUXRkQVFGL0l3QkJFR3NpQWlRQUFuOGdBQ2dDQUNJQUxRQUFRUUZHQkVBZ0FpQUFRUUZxTmdJTUlBRkIyZFRTQUVFRUlBSkJER3BCSnhEWEFnd0JDeUFCS0FJQVFkWFUwZ0JCQkNBQktBSUVLQUlNRVFJQUN5QUNRUkJxSkFBTFhRRUJmeU1BUVJCcklnSWtBQUovSUFBb0FnQWlBQ2dDQUVFQlJnUkFJQUlnQUVFRWFqWUNEQ0FCUWRuVTBnQkJCQ0FDUVF4cVFTb1Exd0lNQVFzZ0FTZ0NBRUhWMU5JQVFRUWdBU2dDQkNnQ0RCRUNBQXNnQWtFUWFpUUFDMWdCQVg4Q2Z5QUNLQUlFQkVBQ1FDQUNLQUlJSWdORkJFQU1BUXNnQWlnQ0FDQURRUUVnQVJCV0RBSUxDMEdBNE5vQUxRQUFHaUFCRUJZTElRSWdBQ0FCTmdJSUlBQWdBa0VCSUFJYk5nSUVJQUFnQWtVMkFnQUxWQUVDZnlNQVFSQnJJZ0lrQUFKQUlBRVFYa1VOQUNBQ1FRaHFJQUVRakFjZ0FpZ0NERUVCUncwQUlBSW9BZ2dyQXdEOEFpSUJRWDl6UVI5MklRTUxJQUFnQVRZQ0JDQUFJQU0yQWdBZ0FrRVFhaVFBQzFvQkFYOGpBRUVRYXlJRUpBQWdCRUVFYWlBRFFmU3B5UUFRNWdRZ0FTQUNJQUlnQTJvZ0JDZ0NDQ0lCSUFFZ0JFRU1haUlDS0FJQWFoQ0xBeUFBUVFocUlBSW9BZ0EyQWdBZ0FDQUVLUUlFTndJQUlBUkJFR29rQUF0YUFRRi9Jd0JCRUdzaUF5UUFJQU5CQkdwQklFSDBxY2tBRU9ZRUlBRWdBaUFDUVNCcUlBTW9BZ2dpQVNBQklBTkJER29pQWlnQ0FHb1Fpd01nQUVFSWFpQUNLQUlBTmdJQUlBQWdBeWtDQkRjQ0FDQURRUkJxSkFBTFdnRUJmeU1BUVJCcklnTWtBQ0FEUVFScVFSQkI5S25KQUJEbUJDQUJJQUlnQWtFUWFpQURLQUlJSWdFZ0FTQURRUXhxSWdJb0FnQnFFSXNESUFCQkNHb2dBaWdDQURZQ0FDQUFJQU1wQWdRM0FnQWdBMEVRYWlRQUMxVUJBWDhDUUFKQUFrQUNRQUpBUVFnZ0FDZ0NBRUVDYXlJQklBRkJDazhiUVFSckRnVUVCQUFCQWdNTElBQkJCR29RaGdrUEN5QUFRUWhxRU9vSER3c2dBQkRDQ0FzUEN5QUFLQUlFSUFBb0FnZ1FxUWtMWFFFQmZ5TUFRUkJySWdJa0FBSi9JQUFvQWdBaUFDMEFBRUVCUmdSQUlBSWdBRUVCYWpZQ0RDQUJRZG5VMGdCQkJDQUNRUXhxUVRzUTF3SU1BUXNnQVNnQ0FFSFYxTklBUVFRZ0FTZ0NCQ2dDREJFQ0FBc2dBa0VRYWlRQUMxa0JCWDhnQUNnQ0VDSUNJQUFvQWhRaUFTQUJJQUpKR3lFRElBQW9BZ2doQkNBQUtBSUFJUVVEUUNBQ0lnRWdBMGNFUUNBQUlBRkJBV29pQWpZQ0VDQUJJQVZxTFFBQUlBRWdCR290QUFCR0RRRUxDeUFCSUFOSEMxd0JBWDhqQUVFUWF5SURKQUFnQXlBQ05nSU1Ba0FDUUNBQktBSklSUTBBSUFGQnlBQnFJQU5CREdvUXJBSWlBVVVOQUNBQUlBRkJCR29vQWdBZ0FVRUlhaWdDQUJEL0JBd0JDeUFBUVFGQkFCQ1hCUXNnQTBFUWFpUUFDMTRCQkg4akFFRVFheUlESkFBZ0EwRUlhaUFDUVFoQkNFR1UxdElBRUpvRklBTW9BZ2doQlNBREtBSU1JUVFnQWtFRGRDSUdCRUFnQkNBQklBYjhDZ0FBQ3lBQUlBSTJBZ2dnQUNBRU5nSUVJQUFnQlRZQ0FDQURRUkJxSkFBTFhBRUNmd0ovUVFBZ0FTZ0NBQ0lDUlEwQUdpQUJLQUlFSWdNZ0FTZ0NERWNFUUNBQklBTkJBV28yQWdRZ0F5MEFBQ0VCUVFFTUFRc2dBaUFCS0FJSUVJa0pJQUZCQURZQ0FFRUFDeUVDSUFBZ0FUb0FBU0FBSUFJNkFBQUxXd0FDUUFKQUFrQUNRQ0FBS0FJQURnUUJBd01DQUFzZ0FDZ0NEQ0FBS0FJUUVQWUpJQUFvQWdoRkRRQWdBRUVJYWhEbkNBc1BDeUFBS0FJTUlBQW9BaEFROWdrZ0FFRUlhaERuQ0E4TElBQW9BZ2dnQUNnQ0RCRDJDUXR3QVFOL0l3QkJFR3NpQUNRQVFTOFEvUWdoQVVFRVFRUVFud2dpQWtHUTBkSUFOZ0lBSUFCQkNHb2dBa0g4eDlJQVFTTVEvUWdReGdaQjFNRFNBQkRaQjBIRXd0SUFFSk1ISUFBZ0FTQUFLQUlJUWVTKzBnQkJBQkNBQ0VIc3lkSUFFSkFISUFBb0FnQWdBRUVRYWlRQUMxc0FBa0FDUUFKQUFrQWdBQ2dDQUE0RUFRTURBZ0FMSUFBb0Fnd2dBQ2dDRUJDdUNTQUFLQUlJUlEwQUlBQkJDR29RNlFnTER3c2dBQ2dDRENBQUtBSVFFSzRKSUFCQkNHb1E2UWdQQ3lBQUtBSUlJQUFvQWd3UXJna0xXd0VCZnlNQVFUQnJJZ01rQUNBRElBRTJBZ3dnQXlBQU5nSUlJQU5CQVRZQ0ZDQURRWVNQMGdBMkFoQWdBMElCTndJY0lBTWdBMEVJYXExQ2dJQ0FnT0FBaERjREtDQURJQU5CS0dvMkFoZ2dBMEVRYWlBQ0VLc0hBQXRrQVFOL0l3QkJFR3NpQWlRQVFaK0FnSUI0SVFNZ0FTZ0NBQ0lFUVFKclFRbE5CRUFnQWtFSWFpQUVFTzBHSUFBZ0Fpa0RDRGNDRENBQVFRWTJBZ2hCZ1lDQWdIZ2hBMEhuenNrQUlRRUxJQUFnQXpZQ0FDQUFJQUUyQWdRZ0FrRVFhaVFBQzE0QkFYOENRQ0FDUVFCT0JFQUNRQ0FDUlFSQVFRRWhBd3dCQzBHQTROb0FMUUFBR2lBQ0VCWWlBMFVOQWdzZ0FnUkFJQU1nQVNBQy9Bb0FBQXNnQUNBQ05nSUlJQUFnQXpZQ0JDQUFJQUkyQWdBUEMwR01wTUFBRU9rR0N3QUxUZ0VCZndKQUlBRWdBa0VCYWlJRVRRMEFJQUVnQWtGL2MycEJ5QUJzSWdGRkRRQWdBQ0FFUWNnQWJHb2dBQ0FDUWNnQWJHb2dBZndLQUFBTElBQWdBa0hJQUd4cUlBTkJ5QUQ4Q2dBQUMxTUJBWDhqQUVFZ2F5SUZKQUFDZnlBQUlBRWdBaUFESUFRUXlBTWlBQVJBSUFWQkRHb2dBQkRiQkNBRktBSU1RWitBZ0lCNFJnUkFJQVVvQWhBTUFnc2dCVUVNYWhEaUNBdEJBQXNnQlVFZ2FpUUFDMUFCQTM4Q1FDQUJMUUFJRFFBZ0FTZ0NBQ0lESUFFb0FnUWlCRXNOQUNBRElBUlBCRUJCQVNFQ0lBRkJBVG9BQ0F3QkMwRUJJUUlnQVNBRFFRRnFOZ0lBQ3lBQUlBTTJBZ1FnQUNBQ05nSUFDMDhCQVg4Q1FDQUJJQUpCQVdvaUJVME5BQ0FCSUFKQmYzTnFRUU4wSWdGRkRRQWdBQ0FGUVFOMGFpQUFJQUpCQTNScUlBSDhDZ0FBQ3lBQUlBSkJBM1JxSWdBZ0JEc0JCQ0FBSUFNMkFnQUxUd0VCZndKQUlBRWdBa0VCYWlJRlRRMEFJQUVnQWtGL2MycEJBM1FpQVVVTkFDQUFJQVZCQTNScUlBQWdBa0VEZEdvZ0Fmd0tBQUFMSUFBZ0FrRURkR29pQUNBRU5nSUVJQUFnQXpZQ0FBdFFBUU4vQWtBZ0FTMEFBQTBBSUFFdEFBRWlCQ0FCTFFBQ0lnTkxEUUFnQXlBRVRRUkFRUUVoQWlBQlFRRTZBQUFNQVFzZ0FTQURRUUZyT2dBQ1FRRWhBZ3NnQUNBRE9nQUJJQUFnQWpvQUFBdFFBUU4vQWtBZ0FTMEFBQTBBSUFFdEFBRWlBeUFCTFFBQ0lnUkxEUUFnQXlBRVR3UkFRUUVoQWlBQlFRRTZBQUFNQVF0QkFTRUNJQUVnQTBFQmFqb0FBUXNnQUNBRE9nQUJJQUFnQWpvQUFBdE5BUUovSXdCQklHc2hBd05BSUFKQkVFWkZCRUFnQTBFTWFpQUNhaUFCSUFKcUxRQUFPZ0FBSUFKQkFXb2hBZ3dCQ3dzZ0FDQURLUUlNTndBQUlBQkJDR29nQTBFVWFpa0NBRGNBQUF0YkFRRi9Jd0JCRUdzaUFpUUFBbjhnQUNnQ0FDSUFMUUFBUVFKR0JFQWdBU2dDQUVHRXlja0FRUkFnQVNnQ0JDZ0NEQkVDQUF3QkN5QUNJQUEyQWd3Z0FVSFhpTW9BUVFVZ0FrRU1ha0hGQUJEWEFnc2dBa0VRYWlRQUMxY0JBMzhqQUVFUWF5SUNKQUFnQUNBQktBSUVJZ01FZnlBQ1FRaHFRUUVnQVNnQ0FDSUVJQU5CN0lMS0FCQ2ZCeUFCSUFJcEF3ZzNBZ0FnQkMwQUFBVWdBUXM2QUFFZ0FDQURRUUJIT2dBQUlBSkJFR29rQUF0aUFRRi9Jd0JCRUdzaUFpUUFJQUpCQkdvZ0FTZ0NDQ0FCSUFFb0Fnd29BaFFSQlFBQ1FDQUNLQUlFUVFGR0JFQWdBQ0FCS0FJUUlnQW9BZ0FnQWlnQ0NDQUFLQUlFS0FJWUVRVUFEQUVMSUFCQmdJQ0FnSGcyQWdBTElBSkJFR29rQUF0bUFRRi9Ba0FnQUVHRUFVOEVRQ0FBMEc4bUFSRHVBaUFBUVlEYzJnQW9BZ0FpQVVrTkFTQUFJQUZySWdCQitOdmFBQ2dDQUU4TkFVSDAyOW9BS0FJQUlBQkJBblJxUWZ6YjJnQW9BZ0EyQWdCQi9OdmFBQ0FBTmdJQVFRQkJCQkQwQ1FzUEN3QUxXUUVEZnlNQVFSQnJJZ01rQUNBRFFRaHFJQUpCQVVFQlFaVFcwZ0FRbWdVZ0F5Z0NDQ0VGSUFNb0Fnd2hCQ0FDQkVBZ0JDQUJJQUw4Q2dBQUN5QUFJQUkyQWdnZ0FDQUVOZ0lFSUFBZ0JUWUNBQ0FEUVJCcUpBQUxad0lCZndKK0l3QkJFR3NpQVNRQUlBRVE1Z1lnQVNrREFDRUNJQUVwQXdnaEF5QUFRUUEyQWhnZ0FFS0FnSUNBZ0FFM0F4QWdBRUh3ejlJQUtRTUFOd0ljSUFCQkpHcEIrTS9TQUNrREFEY0NBQ0FBSUFNM0F3Z2dBQ0FDTndNQUlBRkJFR29rQUF0WEFRRi9Jd0JCRUdzaUFpUUFBbjhnQUNnQ0FDSUFLQUlBQkVBZ0FpQUFOZ0lNSUFGQjJkVFNBRUVFSUFKQkRHcEJKUkRYQWd3QkN5QUJLQUlBUWRYVTBnQkJCQ0FCS0FJRUtBSU1FUUlBQ3lBQ1FSQnFKQUFMWFFFQ2Z5TUFRU0JySWdZa0FDQUdRUXhxSWdjZ0FTQUNJQU1RendFQ1FDQUdLQUlNUVorQWdJQjRSd1JBSUFBZ0FTQUVJQVVRendFZ0J4RE5BZ3dCQ3lBQUlBWW9BaEEyQWdRZ0FFR2ZnSUNBZURZQ0FBc2dCa0VnYWlRQUMxb0FJQUVvQWdCQm40Q0FnSGhIQkVBZ0FFRUJOZ0lBSUFBZ0FTa0NBRGNDQkNBQVFSUnFJQUZCRUdvb0FnQTJBZ0FnQUVFTWFpQUJRUWhxS1FJQU53SUFEd3NnQUNBQktBSUVJZ0FvQWdBZ0FFRUlhaWtEQUJDOEJBdFlBUU4vSXdCQkVHc2lBU1FBSUFGQkNHcEJnQUpCQWtFQ1FaVFcwZ0FRbWdVZ0FTZ0NDQ0VDSUFFb0Fnd2lBMEdJK2MwQVFZQUUvQW9BQUNBQVFZQUNOZ0lJSUFBZ0F6WUNCQ0FBSUFJMkFnQWdBVUVRYWlRQUMxZ0JBWDhqQUVFUWF5SUNKQUFDZnlBQUtBSUFJZ0FvQWdBRVFDQUNJQUEyQWd3Z0FVSFoxTklBUVFRZ0FrRU1ha0gxQUJEWEFnd0JDeUFCS0FJQVFkWFUwZ0JCQkNBQktBSUVLQUlNRVFJQUN5QUNRUkJxSkFBTFd3RURmd0pBSUFFb0Fnd2lBaUFCS0FJSUlnTlBCRUFnQWlBQktBSUVJZ1JMRFFFZ0FTZ0NBQ0VCSUFBZ0FpQURhellDQkNBQUlBRWdBMm8yQWdBUEN5QURJQUpCM05IYUFCQzNDUUFMSUFJZ0JFSGMwZG9BRUxnSkFBdFJBZ0YvQVg0akFFRVFheUlDSkFBQ1FDQUJFRjVGRFFBZ0FrRUlhaUFCRUl3SElBSW9BZ3hGRFFBZ0FpZ0NDQ0lCUlEwQUlBQWdBU3NEQURrRENFSUJJUU1MSUFBZ0F6Y0RBQ0FDUVJCcUpBQUxUQUVEZnlNQVFSQnJJZ0lrQUNBQ1FRaHFJQUZCQVJEaUJTQUFJQUlvQWdnaUEwRUFSeUFDS0FJTVFRQkhjU0lFQkg4Z0F5MEFBQVVnQVFzNkFBRWdBQ0FFT2dBQUlBSkJFR29rQUF0VkFRUi9Jd0JCRUdzaUFTUUFJQUFvQWdRaUFrRUJUUVJBUVFJZ0FrRzQ4Y2tBRUxnSkFBc2dBQ2dDQUNJREx3QUFJQUZCQ0dwQkFpQURJQUpCN0lMS0FCQ2ZCeUFBSUFFcEF3ZzNBZ0FnQVVFUWFpUUFDMVFCQTM4akFFRVFheUlESkFBZ0EwRUlhaUFDUVFGQkFSQ2hCU0FES0FJSUlRVWdBeWdDRENFRUlBSUVRQ0FFSUFFZ0F2d0tBQUFMSUFBZ0FqWUNDQ0FBSUFRMkFnUWdBQ0FGTmdJQUlBTkJFR29rQUF0UEFnRi9BWHdqQUVFUWF5SUNKQUFnQWlBQk5nSU1Ba0FnQUVFb2FpQUNRUXhxRUtzQ0lnRUVmeUFCQlNBQUtBSUFSUTBCSUFCQkNHb0xLd01BSUFKQkVHb2tBQThMUVlETHlnQVF1d2tBQzFVQkFYOGpBRUVRYXlJREpBQWdBMEVFYWtHQUlFRUFRUUlnQVJEdkFpQURLQUlJSVFFZ0F5Z0NCRUVCUmdSQUlBRWdBeWdDRENBQ0VNd0lBQXNnQUNBREtBSU1OZ0lFSUFBZ0FUWUNBQ0FEUVJCcUpBQUxVZ0VCZnlNQVFSQnJJZ1VrQUNBRlFRUnFJQUVnQWlBREVMQURJQVVvQWdnaEFTQUZLQUlFUVFGR0JFQWdBU0FGS0FJTUlBUVF6QWdBQ3lBQUlBVW9BZ3cyQWdRZ0FDQUJOZ0lBSUFWQkVHb2tBQXRpQVFOL0l3QkJFR3NpQVNRQVFRUkJCQkNmQ0NJQVFhelIwZ0EyQWdBZ0FVRUlhaUFBUVlDQ3dBQkJBUkNBQ0JEZkJ5QUJLQUlJUWZDUHdBQVFnUWdoQWtFSVFRUVFud2dpQUVHQWpzQUFOZ0lFSUFBZ0FqWUNBQ0FCUVJCcUpBQWdBQXRWQVFGL0l3QkJFR3NpQkNRQUlBUkJCR29nQVNBQ0lBTVFrd01nQkNnQ0NDRUJJQVFvQWdSQkFVWUVRQ0FCSUFRb0FneEIrUGpOQUJETUNBQUxJQUFnQkNnQ0REWUNCQ0FBSUFFMkFnQWdCRUVRYWlRQUMwc0JCSDhnQVNBQkx3RUlJZ0pCQVdvN0FRZ2dBU2dDQkNJRVFmLy9BM0VnQWswZ0FpQUVUM0pGQkVBZ0FTZ0NBQ0FDYWkwQUFDRUZRUUVoQXdzZ0FDQUZPZ0FCSUFBZ0F6b0FBQXRQQVFGL0lBTWdBaUFDSUFOSkd5RUJJQUpCQW5RZ0FHcEIrQVpxSVFNRFFDQUJJQUpHUlFSQUlBTW9BZ0FpQkNBQ093SDBCaUFFSUFBMkF2QUdJQU5CQkdvaEF5QUNRUUZxSVFJTUFRc0xDMUlCQVg4akFFRVFheUlESkFBZ0EwRUVhaUFCUVFGQkFSQ3dBeUFES0FJSUlRRWdBeWdDQkVFQlJnUkFJQUVnQXlnQ0RDQUNFTXdJQUFzZ0FDQURLQUlNTmdJRUlBQWdBVFlDQUNBRFFSQnFKQUFMVlFFRGZ5TUFRUkJySWdNa0FDQURRUWhxSUFKQmxOYlNBQkNmQlNBREtBSUlJUVVnQXlnQ0RDRUVJQUlFUUNBRUlBRWdBdndLQUFBTElBQWdBallDQ0NBQUlBUTJBZ1FnQUNBRk5nSUFJQU5CRUdva0FBdFZBUUYvSXdCQkVHc2lCQ1FBSUFSQkJHb2dBU0FDSUFNUXNBTWdCQ2dDQ0NFQklBUW9BZ1JCQVVZRVFDQUJJQVFvQWd4QmxOYlNBQkRNQ0FBTElBQWdCQ2dDRERZQ0JDQUFJQUUyQWdBZ0JFRVFhaVFBQzFNQkFYOGpBRUVRYXlJQ0pBQUNmeUFBS0FJQUJFQWdBaUFBTmdJTUlBRkIyZFRTQUVFRUlBSkJER3BCN1FBUTF3SU1BUXNnQVNnQ0FFSFYxTklBUVFRZ0FTZ0NCQ2dDREJFQ0FBc2dBa0VRYWlRQUMySUJBMzhqQUVFUWF5SUJKQUJCQkVFRUVKOElJZ0JCck5IU0FEWUNBQ0FCUVFocUlBQkIzTUxTQUVFQkVJQUlFT2tISUFFb0FnaEIzTWpTQUJDQkNDRUNRUWhCQkJDZkNDSUFRZXpHMGdBMkFnUWdBQ0FDTmdJQUlBRkJFR29rQUNBQUMwd0JBbjhqQUVFUWF5SUJKQUFnQVVFSWFpQUFRUUVRNGdWQkFDRUFBa0FnQVNnQ0NDSUNSUTBBSUFFb0FneEZEUUFnQWkwQUFDSUFRUUFnQUVFRlNSc2hBQXNnQVVFUWFpUUFJQUFMUmdFQmZ3SkFJQUVnQWtFQmFpSUVUUTBBSUFFZ0FrRi9jMnBCQTNRaUFVVU5BQ0FBSUFSQkEzUnFJQUFnQWtFRGRHb2dBZndLQUFBTElBQWdBa0VEZEdvZ0F6Y0NBQXRHQVFGL0FrQWdBU0FDUVFGcUlnUk5EUUFnQVNBQ1FYOXpha0VDZENJQlJRMEFJQUFnQkVFQ2RHb2dBQ0FDUVFKMGFpQUIvQW9BQUFzZ0FDQUNRUUowYWlBRE5nSUFDMHdCQW44Z0FFSC9BWEZCQTBZRVFDQUJLQUlBSVFBZ0FTZ0NCQ0lES0FJQUlnSUVRQ0FBSUFJUkJBQUxJQU1vQWdRaUFnUkFJQUFnQWlBREtBSUlFT01FQ3lBQlFReEJCQkRqQkFzTFRRRUNmeU1BUVJCcklnRWtBQ0FBS0FJUUlnSUVRQ0FCUVFScUlBQW9BZ1FnQUNnQ0NDQUNRUUZxRU9vRElBQW9BZ3dnQVNnQ0RHc2dBU2dDQkNBQktBSUlFTkFJQ3lBQlFSQnFKQUFMVGdFQmZ5TUFRUkJySWdNa0FDQURRUVJxSUFFUTlBTWdBeWdDQ0NFQklBTW9BZ1JCQVVZRVFDQUJJQU1vQWd3Z0FoRE1DQUFMSUFBZ0F5Z0NERFlDQkNBQUlBRTJBZ0FnQTBFUWFpUUFDMGNCQVg4Z0FVRUNkQ0VCQTBBZ0FRUkFJQUFnQUNnQ0FDSUNJQUlnQWtFRWRuTkJnSjZBK0FCeElnSkJCSFJ6SUFKek5nSUFJQUZCQkdzaEFTQUFRUVJxSVFBTUFRc0xDMHNCQTM4Z0FTRURJQUloQkNBQktBSllJZ1VFUUNBQkx3R0lBU0VFSUFKQkFXb2hBd3NnQVVHOEFVR01BU0FDRzBFRUVPTUVJQUFnQlRZQ0FDQUFJQU90SUFTdFFpQ0doRGNDQkF0TEFRTi9JQUVoQXlBQ0lRUWdBU2dDV0NJRkJFQWdBUzhCNEFFaEJDQUNRUUZxSVFNTElBRkJsQUpCNUFFZ0FodEJCQkRqQkNBQUlBVTJBZ0FnQUNBRHJTQUVyVUlnaG9RM0FnUUxUQUVEZnlBQklRTWdBaUVFSUFFb0F2QUdJZ1VFUUNBQkx3SDBCaUVFSUFKQkFXb2hBd3NnQVVHb0IwSDRCaUFDRzBFSUVPTUVJQUFnQlRZQ0FDQUFJQU90SUFTdFFpQ0doRGNDQkF0S0FRRi9Jd0JCSUdzaUF5UUFJQU5CREdvZ0FDQUJFTk1DQWtBZ0F5Z0NERVVFUUNBREtBSVFJQU1vQWhoQkEzUnFJQUkzQWdBTUFRc2dBMEVNYWlBQ0VFRUxJQU5CSUdva0FBdFpBUUYvSUFFb0Fnd2hBZ0pBQWtBQ1FBSkFJQUVvQWdRT0FnQUJBZ3NnQWcwQlFRRWhBVUVBSVFJTUFnc2dBZzBBSUFFb0FnQWlBU2dDQkNFQ0lBRW9BZ0FoQVF3QkN5QUFJQUVRbndJUEN5QUFJQUVnQWhDZ0JRdERBUU4vQWtBZ0FrVU5BQU5BSUFBdEFBQWlCQ0FCTFFBQUlnVkdCRUFnQUVFQmFpRUFJQUZCQVdvaEFTQUNRUUZySWdJTkFRd0NDd3NnQkNBRmF5RURDeUFEQzFzQkFuOGpBRUVRYXlJQUpBQWdBRUVJYWtFTkVQMElRUW9RL1FoQnlJakFBQkRIQjBHZ2djQUFRUW9RL1FoQnlJakFBQkNLQnlBQUlBQW9BZ2hCcUl6QUFFRU5FUDBJUWNpSXdBQVFpZ2NnQUNnQ0FDQUFRUkJxSkFBTFRRRUJmeUFCRU9nRUlnSkIvd0Z4UlFSQUlBQVEyZ0lnQUVFQUlBRVFrUU1nQUFKL0lBQW9BZ2hCZ0lERUFFWUVRQ0FBS0FJVURBRUxJQUF2QVFBTE5nSXdEd3NnQUNBQ0lBRVFrUU1MU3dFQ2Z5TUFRUkJySWdFa0FFR0E0Tm9BTFFBQUdpQUJRUUE2QUE5QkFSQVdJZ0pGQkVBQUN5QUFJQUZCRDJxdE53TUFJQUFnQXEwM0F3Z2dBa0VCUVFFUTR3UWdBVUVRYWlRQUMwZ0JBWDhqQUVFZ2F5SURKQUFnQTBFTWFpQUFJQUVnQWhDNUF4RFpCQUovSUFNb0FneEJuNENBZ0hoR0JFQWdBeWdDRUF3QkN5QURRUXhxRU0wQ1FRQUxJQU5CSUdva0FBdGJBUUovSXdCQkVHc2lBQ1FBSUFCQkNHcEJEUkQ5Q0VFS0VQMElRZFRHMGdBUTJRZEJ4TUxTQUVFS0VQMElRZFRHMGdBUWt3Y2dBQ0FBS0FJSVFlUyswZ0JCRFJEOUNFSFV4dElBRUpNSElBQW9BZ0FnQUVFUWFpUUFDMDBCQVg4Z0FSRG9CQ0lDUWY4QmNVVUVRQ0FBRU5zQ0lBQkJBQ0FCRUpFRElBQUNmeUFBS0FJSVFZQ0F4QUJHQkVBZ0FDZ0NGQXdCQ3lBQUx3RUFDellDTUE4TElBQWdBaUFCRUpFREMwZ0JBWDhnQUNnQ0FDQUFLQUlJSWdOcklBSkpCRUFnQUNBRElBSVE5d0lnQUNnQ0NDRURDeUFDQkVBZ0FDZ0NCQ0FEYWlBQklBTDhDZ0FBQ3lBQUlBSWdBMm8yQWdoQkFBdFRBUU4vSUFFb0FnQWlCU0FGTHdIMkJrRUJhaUlHSUFFb0FnZ2lCeUFDSUFNUWd3VWdCVUhZQUdvZ0JpQUhJQVFRZ0FVZ0JTQUdPd0gyQmlBQUlBYzJBZ2dnQUNBRk5nSUFJQUFnQVNnQ0JEWUNCQXRUQVFOL0lBRW9BZ0FpQlVIY0FHb2dCUzhCNGdGQkFXb2lCaUFCS0FJSUlnY2dBaERXQkNBRklBWWdCeUFESUFRUWhBVWdCU0FHT3dIaUFTQUFJQWMyQWdnZ0FDQUZOZ0lBSUFBZ0FTZ0NCRFlDQkF0SkFRSi9JQUFvQWdRaUFVRUlhaUVDSUFBb0Fnd2dBV3RCMEFCdUlRRURRQ0FCQkVBZ0FVRUJheUVCSUFJUW5nUWdBa0hRQUdvaEFnd0JDd3NnQUNnQ0NDQUFLQUlBRU1VSkN6NEJBWDhDUUNBQUlBRUVmeUFDUlEwQklBRWdBbTRpQXlBQklBSWdBMnhIYWdWQkFBczJBZ2dnQUVLQWdJQ0FFRGNDQUE4TFFlU2J5UUFRNmdZQUMwY0JBMzhnQVNBQklBSWdBeENXQkNJRmFpSUVMUUFBSVFZZ0JDQURwMEVaZGlJRU9nQUFJQUVnQWlBRlFRaHJjV3BCQ0dvZ0JEb0FBQ0FBSUFZNkFBUWdBQ0FGTmdJQUMxUUNBWDhDZmlNQVFSQnJJZ0VrQUNBQkVPWUdJQUVwQXdBaEFpQUJLUU1JSVFNZ0FFRUlha0g0ejlJQUtRTUFOd01BSUFCQjhNL1NBQ2tEQURjREFDQUFJQU0zQXhnZ0FDQUNOd01RSUFGQkVHb2tBQXM2QVFKL0l3QkJJR3NpQlNRQUlBVkJER29pQmlBQ0lBTWdCQkRQQVNBR0VKWUlJZ0lFZnlBQUlBRWdBaEMwQlFWQkFBc2dCVUVnYWlRQUMwY0JBbjhqQUVFZ2F5SUZKQUFnQlVFTWFpSUdJQUlnQXlBRUVNOEJBa0FnQmhDV0NDSUNCRUFnQUNBQklBSVEzUUVNQVFzZ0FFR0FnSUNBZURZQ0FBc2dCVUVnYWlRQUM0QUJBUUovSUFBb0FnQWdBQ2dDQ0NJRGF5QUNTUVJBSXdCQkVHc2lCQ1FBSUFSQkNHb2dBQ0FESUFKQkFVRUJFTVVDSUFRb0FnZ2lBMEdCZ0lDQWVFY0VRQ0FESUFRb0FneEJuTlRhQUJETUNBQUxJQVJCRUdva0FDQUFLQUlJSVFNTElBSUVRQ0FBS0FJRUlBTnFJQUVnQXZ3S0FBQUxJQUFnQWlBRGFqWUNDQXRKQVFKL0l3QkJFR3NpQWlRQUlBSkJCR29nQVVFQ0VHY2dBaWdDQ0NFQklBQkJEQ0FDS0FJTUlBSW9BZ1FpQXhzMkFnUWdBRUdvaDlJQUlBRWdBeHMyQWdBZ0FrRVFhaVFBQzBJQUFrQWdBaUFEVFFSQUlBTkIyQUJMRFFFZ0FDQURJQUpyTmdJRUlBQWdBU0FDUVFKMGFqWUNBQThMSUFJZ0F5QUVFTGNKQUFzZ0EwSFlBQ0FFRUxnSkFBdENBQUpBSUFJZ0EwMEVRQ0FEUWZnQVN3MEJJQUFnQXlBQ2F6WUNCQ0FBSUFFZ0FrRUNkR28yQWdBUEN5QUNJQU1nQkJDM0NRQUxJQU5CK0FBZ0JCQzRDUUFMUVFFQ2Z5TUFRUkJySWdJa0FDQUNRUWhxSUFGQkFSRGlCU0FBSUFJb0FnZ2lBUVIvSUFFdEFBQUZJQU1MT2dBQklBQWdBVUVBUnpvQUFDQUNRUkJxSkFBTFR3RUNmeUFBS0FJRUlRSWdBQ2dDQUNFREFrQWdBQ2dDQ0NJQUxRQUFSUTBBSUFOQnlQYkFBRUVFSUFJb0Fnd1JBZ0JGRFFCQkFROExJQUFnQVVFS1Jqb0FBQ0FESUFFZ0FpZ0NFQkVEQUF0UkFRTi9JQUVvQWdBaUJFSGNBR29nQkM4QmlnRkJBV29pQlNBQktBSUlJZ1lnQWhDbUJTQUVJQVVnQmlBREVLVUZJQVFnQlRzQmlnRWdBQ0FHTmdJSUlBQWdCRFlDQUNBQUlBRW9BZ1EyQWdRTFNRQWdBUVJBSUFCQm40Q0FnSGcyQWdBZ0FDQUJOZ0lFSUFJUXpRSVBDeUFBSUFJcEFnQTNBZ0FnQUVFUWFpQUNRUkJxS0FJQU5nSUFJQUJCQ0dvZ0FrRUlhaWtDQURjQ0FBdEZBUUYvSUFFZ0FrRUlhaUlETlFJQUVLSUVJQUJCQ0dvZ0FVRXcvQW9BQUNBQVFRRTZBRVFnQUVFQU5nSUFJQUJCUUdzZ0F5Z0NBRFlDQUNBQUlBSXBBZ0EzQWpnTFBnRUJmeUFBS0FJQUlnSkJBbXRCQ2s4RVFDQUNRUUZ4Qkg4Z0FDZ0NCQ0lDSUFGcUlnRWdBazhGUVFBTElRSWdBQ0FCTmdJRUlBQWdBallDQUFzTFJRRUJmeU1BUVJCcklnVWtBQ0FGSUFRMkFnd2dCU0FETmdJSUlBRUVRQ0FGUVFocUVOSUhJQUloQkNBQklRTUxJQUFnQkRZQ0JDQUFJQU0yQWdBZ0JVRVFhaVFBQzBNQkFuOGpBRUVnYXlJRkpBQWdCVUVNYWlJR0lBSWdBeUFFRU04QkFrQWdCaENXQ0NJQ0JFQWdBQ0FCSUFJUTNBRU1BUXNnQUVJQU53TUFDeUFGUVNCcUpBQUxPZ0VDZnlNQVFTQnJJZ1VrQUNBRlFReHFJZ1lnQWlBRElBUVF6d0VnQmhDV0NDSUNCSDhnQUNBQklBSVF1UU1GUVFBTElBVkJJR29rQUF0SkFRSi9Jd0JCRUdzaUFpUUFJQUpCQkdvZ0FVRURFR2NnQWlnQ0NDRUJJQUJCRENBQ0tBSU1JQUlvQWdRaUF4czJBZ1FnQUVHb2g5SUFJQUVnQXhzMkFnQWdBa0VRYWlRQUMwb0JBWDhqQUVFUWF5SUFKQUFnQVNnQ0FFR29pTklBUVFrZ0FTZ0NCQ2dDREJFQ0FDRUNJQUJCQURvQURTQUFJQUk2QUF3Z0FDQUJOZ0lJSUFCQkNHb1F4d1FnQUVFUWFpUUFDMG9CQVg4akFFRVFheUlBSkFBZ0FTZ0NBRUdjanRJQVFRc2dBU2dDQkNnQ0RCRUNBQ0VDSUFCQkFEb0FEU0FBSUFJNkFBd2dBQ0FCTmdJSUlBQkJDR29ReHdRZ0FFRVFhaVFBQzBnQkFYOGpBRUVRYXlJQ0pBQWdBaUFBS0FJQUlnQkJCR28yQWd3Z0FVRzQxTklBUVFsQndkVFNBRUVMSUFCQkhVSE0xTklBUVFrZ0FrRU1ha0VlRUpJRElBSkJFR29rQUF0S0FRRi9Jd0JCRUdzaUFTUUFJQUZCQ0dvZ0FDQUFLQUlBUVFGQkNFRW9FTVVDSUFFb0FnZ2lBRUdCZ0lDQWVFY0VRQ0FBSUFFb0FneEI4TXZTQUJETUNBQUxJQUZCRUdva0FBdEtBUUYvSXdCQkVHc2lBU1FBSUFGQkNHb2dBQ0FBS0FJQVFRRkJCRUVNRU1VQ0lBRW9BZ2dpQUVHQmdJQ0FlRWNFUUNBQUlBRW9BZ3hCOE12U0FCRE1DQUFMSUFGQkVHb2tBQXRLQVFGL0l3QkJFR3NpQVNRQUlBRkJDR29nQUNBQUtBSUFRUUZCQ0VFNEVNVUNJQUVvQWdnaUFFR0JnSUNBZUVjRVFDQUFJQUVvQWd4QjhNdlNBQkRNQ0FBTElBRkJFR29rQUF1V0FRRUNmd0pBSUFJZ0EwMEVRQ0FESUFFb0FnUWlCRXNOQVNBQktBSUFJQUpxSVFRakFFRVFheUlCSkFBZ0FVRUlhaUFESUFKcklnSkJsTmJTQUJDcEJTQUJLQUlJSVFVZ0FTZ0NEQ0VESUFJRVFDQURJQVFnQXZ3S0FBQUxJQUFnQWpZQ0NDQUFJQU0yQWdRZ0FDQUZOZ0lBSUFGQkVHb2tBQThMSUFJZ0EwRzQxZElBRUxjSkFBc2dBeUFFUWJqVjBnQVF1QWtBQ3o4QUFrQWdBU0FDVFFSQUlBSWdCRTBOQVNBQ0lBUWdCUkM0Q1FBTElBRWdBaUFGRUxjSkFBc2dBQ0FDSUFGck5nSUVJQUFnQXlBQlFRSjBhallDQUFzOUFFRUlJQUlnQWtFSVR4c2hBZ05BSUFJRVFDQUFJQUFvQWdBZ0FTZ0NBSE0yQWdBZ0FrRUJheUVDSUFGQkJHb2hBU0FBUVFScUlRQU1BUXNMQzhnQ0FRVi9Jd0JCRUdzaUJDUUFJQVJCQ0dvZ0FSQ2hCQUpBSUFRdkFRaEJBWEZGQkVBZ0FFRUFPZ0FRREFFTElBUXZBUW9oQXlNQVFUQnJJZ0lrQUFKQUlBTkZCRUFnQUVFQk9nQVFJQUJDQVRjQ0NDQUFRZ0UzQWdBTUFRc2dBUkNrQlVIL0FYRWlCVVVFUUNBQVFRQTZBQkFNQVFzZ0FrRVlhaUFCSUFOQkFXb2dCV3dRNGdVZ0FpZ0NHQ0lEUlFSQUlBQkJBRG9BRUF3QkN5QUNLQUljSVFZZ0FpQUZPZ0FzSUFJZ0F6WUNKQ0FDSUFZMkFpZ2dBa0VRYWlBQ1FTUnFFT1FFSUFJb0FoQkJBWEVFUUNBQ1FRaHFJQUVnQWlnQ0ZCRGlCU0FDS0FJSUlnRkZCRUFnQUVFQU9nQVFEQUlMSUFJb0Fnd2hBeUFBSUFJcEFpUTNBZ2dnQUNBQk5nSUFJQUFnQXpZQ0JDQUFRUkJxSUFKQkxHb29BZ0EyQWdBTUFRc2dBRUVCT2dBUUlBQkNBVGNDQ0NBQVFnRTNBZ0FMSUFKQk1Hb2tBQXNnQkVFUWFpUUFDMGNCQVg4akFFRVFheUlDSkFBZ0FrRUlhaUFBSUFBb0FnQkJBVUVFUVFnUWlBSWdBaWdDQ0NJQVFZR0FnSUI0UndSQUlBQWdBaWdDRENBQkVNd0lBQXNnQWtFUWFpUUFDendDQVg0QmZ5QUJLUU1BSWdKUUJIOUJBQVVnQVNBQ1FnRjlJQUtETndNQUlBSjZwMEVEZGlFRFFRRUxJUUVnQUNBRE5nSUVJQUFnQVRZQ0FBdEVBUUovQWtBQ1FDQUJSUVJBREFFTElBRW9BZ0FpQWlBQ0tBSUFJZ05CQVdvMkFnQWdBMEVBU0EwQklBRW9BZ1FoQVFzZ0FDQUJOZ0lFSUFBZ0FqWUNBQThMQUF0QUFRRi9JQUVvQWdBaUFpQUJLQUlFUmdSL1FRQUZJQUVnQWtFQmFqWUNBQ0FCSUFKQkFuUnFLQUlJSVFGQkFRc2hBaUFBSUFFMkFnUWdBQ0FDTmdJQUMwa0JBWDhqQUVFUWF5SUNKQUFnQWlBQUtBSUFJZ0JCREdvMkFnd2dBVUgwL3MwQVFRbEIvZjdOQUVFSUlBQkJJMEdGLzgwQVFRZ2dBa0VNYWtIa0FCQ1NBeUFDUVJCcUpBQUxRUUVDZnlNQVFTQnJJZ1FrQUNBRVFReHFJZ1VnQVNBQ0lBTVF6d0VDUUNBRkVKWUlJZ0VFUUNBQUlBRVFzd1lNQVFzZ0FFSUFOd01BQ3lBRVFTQnFKQUFMUndFQmZ5TUFRUkJySWdJa0FDQUNRUWhxSUFBZ0FDZ0NBRUVCUVFKQkFoRHlBU0FDS0FJSUlnQkJnWUNBZ0hoSEJFQWdBQ0FDS0FJTUlBRVF6QWdBQ3lBQ1FSQnFKQUFMUndFQmZ5TUFRUkJySWdJa0FDQUNRUWhxSUFBZ0FDZ0NBRUVCUVFSQkJCQ0lBaUFDS0FJSUlnQkJnWUNBZ0hoSEJFQWdBQ0FDS0FJTUlBRVF6QWdBQ3lBQ1FSQnFKQUFMUmdBZ0FTZ0NBRUdmZ0lDQWVFY0VRQ0FBSUFFcEFnQTNBZ0FnQUVFUWFpQUJRUkJxS0FJQU5nSUFJQUJCQ0dvZ0FVRUlhaWtDQURjQ0FBOExJQUFnQVNnQ0JCREVCQXRIQVFGL0l3QkJFR3NpQlNRQUlBVkJDR29nQUNBQklBSWdBeUFFRUlnQ0lBVW9BZ2dpQUVHQmdJQ0FlRWNFUUNBQUlBVW9BZ3hCbk5UYUFCRE1DQUFMSUFWQkVHb2tBQXRCQVFOL0FrQWdBU2dDQ0NJRUlBSnFJZ1VnQkVrTkFDQUZJQUVvQWdSTERRQWdBU0FGTmdJSUlBRW9BZ0FnQkdvaEF3c2dBQ0FDTmdJRUlBQWdBellDQUF0SEFRRi9Jd0JCRUdzaUJTUUFJQVZCQ0dvZ0FDQUJJQUlnQXlBRUVNZ0NJQVVvQWdnaUFFR0JnSUNBZUVjRVFDQUFJQVVvQWd4Qm5OVGFBQkRNQ0FBTElBVkJFR29rQUF0R0FRSi9Jd0JCRUdzaUF5UUFFUElISWdRZ0FUWUMrQVlnQTBFSWFpQUVJQUpCQVdvUS9RTWdBeWdDRENFQklBQWdBeWdDQ0RZQ0FDQUFJQUUyQWdRZ0EwRVFhaVFBQ3o4QkFYOGpBRUVRYXlJQ0pBQWdBUVJBSUFKQkJHcEJDRUVJSUFGQkFXb1E2Z01nQUNBQ0tBSU1heUFDS0FJRUlBSW9BZ2dRMEFnTElBSkJFR29rQUF0QUFRSi9Jd0JCRUdzaUFTUUFBMEFnQVVFRWFpQUFFS1VCSUFFb0FnUWlBZ1JBSUFJZ0FTZ0NERUhJQUd4cVFkZ0FhaENlQkF3QkN3c2dBVUVRYWlRQUMwWUFJQUVvQWdCQm40Q0FnSGhIQkVBZ0FDQUJLUUlBTndJQUlBQkJFR29nQVVFUWFpZ0NBRFlDQUNBQVFRaHFJQUZCQ0dvcEFnQTNBZ0FQQ3lBQUlBRW9BZ1FRdUFRTFdnRUJmeUFCS0FJQUlRSWdBU2dDQkNnQ0RDRUJBa0FDUUFKQUlBQW9BZ0F0QUFCQkFXc09BZ0VDQUFzZ0FrSGg3Y2tBUVJNZ0FSRUNBQThMSUFKQjlPM0pBRUVoSUFFUkFnQVBDeUFDUVpYdXlRQkJIaUFCRVFJQUN6OEJBWDhqQUVFUWF5SUNKQUFnQVFSQUlBSkJCR3BCRUVFSUlBRkJBV29RNmdNZ0FDQUNLQUlNYXlBQ0tBSUVJQUlvQWdnUTBBZ0xJQUpCRUdva0FBdERBUUovSXdCQkVHc2lCQ1FBSUFFb0FnQWhCU0FFSUFFb0FnUWlBVFlDRENBRUlBVTJBZ2dnQUNBRVFRaHFJQUlnQXhEb0F5QUZJQUVRbEFjZ0JFRVFhaVFBQzBNQkFuOGpBRUVRYXlJRUpBQWdBU2dDQUNFRklBUWdBU2dDQkNJQk5nSU1JQVFnQlRZQ0NDQUFJQVJCQ0dvZ0FpQURFTHdESUFVZ0FSQ1VCeUFFUVJCcUpBQUxRd0VDZnlNQVFSQnJJZ1FrQUNBQktBSUFJUVVnQkNBQktBSUVJZ0UyQWd3Z0JDQUZOZ0lJSUFBZ0JFRUlhaUFDSUFNUTZRTWdCU0FCRUpRSElBUkJFR29rQUF0REFRSi9Jd0JCRUdzaUJDUUFJQUVvQWdBaEJTQUVJQUVvQWdRaUFUWUNEQ0FFSUFVMkFnZ2dBQ0FFUVFocUlBSWdBeERkQXlBRklBRVFsQWNnQkVFUWFpUUFDME1CQW44akFFRVFheUlFSkFBZ0FTZ0NBQ0VGSUFRZ0FTZ0NCQ0lCTmdJTUlBUWdCVFlDQ0NBQUlBUkJDR29nQWlBREVMMERJQVVnQVJDVUJ5QUVRUkJxSkFBTFF3RUNmeU1BUVJCcklnUWtBQ0FCS0FJQUlRVWdCQ0FCS0FJRUlnRTJBZ3dnQkNBRk5nSUlJQUFnQkVFSWFpQUNJQU1ReVFNZ0JTQUJFSlFISUFSQkVHb2tBQXRDQVFKL0l3QkJFR3NpQkNRQUlBRW9BZ0FoQlNBRUlBRW9BZ1FpQVRZQ0RDQUVJQVUyQWdnZ0FDQUVRUWhxSUFJZ0F4QlhJQVVnQVJDVUJ5QUVRUkJxSkFBTFF3RUNmeU1BUVJCcklnUWtBQ0FCS0FJQUlRVWdCQ0FCS0FJRUlnRTJBZ3dnQkNBRk5nSUlJQUFnQkVFSWFpQUNJQU1RMVFFZ0JTQUJFSlFISUFSQkVHb2tBQXREQVFKL0l3QkJFR3NpQkNRQUlBRW9BZ0FoQlNBRUlBRW9BZ1FpQVRZQ0RDQUVJQVUyQWdnZ0FDQUVRUWhxSUFJZ0F4QytBeUFGSUFFUWxBY2dCRUVRYWlRQUMwTUJBbjhqQUVFUWF5SUVKQUFnQVNnQ0FDRUZJQVFnQVNnQ0JDSUJOZ0lNSUFRZ0JUWUNDQ0FBSUFSQkNHb2dBaUFERUw4RElBVWdBUkNVQnlBRVFSQnFKQUFMUXdFQ2Z5TUFRUkJySWdRa0FDQUJLQUlBSVFVZ0JDQUJLQUlFSWdFMkFnd2dCQ0FGTmdJSUlBQWdCRUVJYWlBQ0lBTVF3QU1nQlNBQkVKUUhJQVJCRUdva0FBdERBUUovSXdCQkVHc2lCQ1FBSUFFb0FnQWhCU0FFSUFFb0FnUWlBVFlDRENBRUlBVTJBZ2dnQUNBRVFRaHFJQUlnQXhEZkF5QUZJQUVRbEFjZ0JFRVFhaVFBQzBNQkFuOGpBRUVRYXlJRUpBQWdBU2dDQUNFRklBUWdBU2dDQkNJQk5nSU1JQVFnQlRZQ0NDQUFJQVJCQ0dvZ0FpQURFT0FESUFVZ0FSQ1VCeUFFUVJCcUpBQUxRd0VDZnlNQVFSQnJJZ1FrQUNBQktBSUFJUVVnQkNBQktBSUVJZ0UyQWd3Z0JDQUZOZ0lJSUFBZ0JFRUlhaUFDSUFNUTRRTWdCU0FCRUpRSElBUkJFR29rQUF0REFRSi9Jd0JCRUdzaUJDUUFJQUVvQWdBaEJTQUVJQUVvQWdRaUFUWUNEQ0FFSUFVMkFnZ2dBQ0FFUVFocUlBSWdBeERpQXlBRklBRVFsQWNnQkVFUWFpUUFDME1CQW44akFFRVFheUlFSkFBZ0FTZ0NBQ0VGSUFRZ0FTZ0NCQ0lCTmdJTUlBUWdCVFlDQ0NBQUlBUkJDR29nQWlBREVKd0VJQVVnQVJDVUJ5QUVRUkJxSkFBTFF3RUJmeU1BUVJCcklnSWtBQ0FDSUFCQkRHbzJBZ3dnQVVHOHo5SUFRUTFCeWMvU0FFRUZJQUJCRzBIT3o5SUFRUVVnQWtFTWFrRWNFSklESUFKQkVHb2tBQXREQVFKL0l3QkJFR3NpQkNRQUlBRW9BZ0FoQlNBRUlBRW9BZ1FpQVRZQ0RDQUVJQVUyQWdnZ0FDQUVRUWhxSUFJZ0F4RGFCQ0FGSUFFUWxBY2dCRUVRYWlRQUMwTUJBbjhqQUVFUWF5SUVKQUFnQVNnQ0FDRUZJQVFnQVNnQ0JDSUJOZ0lNSUFRZ0JUWUNDQ0FBSUFSQkNHb2dBaUFERU93QklBVWdBUkNVQnlBRVFSQnFKQUFMUXdFQ2Z5TUFRUkJySWdRa0FDQUJLQUlBSVFVZ0JDQUJLQUlFSWdFMkFnd2dCQ0FGTmdJSUlBQWdCRUVJYWlBQ0lBTVF5d0VnQlNBQkVKUUhJQVJCRUdva0FBdERBUUovSXdCQkVHc2lCQ1FBSUFFb0FnQWhCU0FFSUFFb0FnUWlBVFlDRENBRUlBVTJBZ2dnQUNBRVFRaHFJQUlnQXhETUFTQUZJQUVRbEFjZ0JFRVFhaVFBQzBNQkFuOGpBRUVRYXlJRUpBQWdBU2dDQUNFRklBUWdBU2dDQkNJQk5nSU1JQVFnQlRZQ0NDQUFJQVJCQ0dvZ0FpQURFS1FESUFVZ0FSQ1VCeUFFUVJCcUpBQUxRd0VCZnlNQVFSQnJJZ0lrQUNBQ0lBQkJCR28yQWd3Z0FVRzQxTklBUVFsQndkVFNBRUVMSUFCQkhVSE0xTklBUVFrZ0FrRU1ha0U4RUpJRElBSkJFR29rQUFzOEFRSi9JQUFvQWdBb0FnQWlBeWdDQUNBQUtBSUVLQUlBSUFGQkEzUnJJZ0JCQ0dzb0FnQkdCSDhnQXk4QkJDQUFRUVJyTHdFQVJnVWdBZ3NMM1FzREIzOERmZ0Y5SUFFb0FnZ2lCRUdBZ0lBQmNTRUNJQUFvQWdBcUFnQWhEQ0FFUVlDQWdJQUJjVVVFUUNBQ1FRQkhJUU5CQUNFQ0l3QkJnQUZySWdBa0FDQU12Q0VFQW45QkF5QU1pME1BQUlCL1d3MEFHa0VDSUFSQmdJQ0EvQWR4SWdWQmdJQ0EvQWRHRFFBYUlBUkIvLy8vQTNFaUJrR0FnSUFFY2lBRVFRRjBRZjcvL3dkeElBUkJGM1pCL3dGeElnSWJJZ2V0SWdsQ0FZTWhDeUFGUlFSQVFRUWdCa1VOQVJvZ0FrR1dBV3NoQWtJQklRb2dDMUFNQVF0Q2dJQ0FFQ0FKUWdHR0lBZEJnSUNBQkVZaUJSc2hDVUlDUWdFZ0JSc2hDa0hvZmtIcGZpQUZHeUFDYWlFQ0lBdFFDeUVGSUFBZ0Fqc0JlQ0FBSUFvM0EzQWdBRUlCTndOb0lBQWdDVGNEWUNBQUlBVTZBSG9DZndKQUFrQUNRQ0FGUVFKcklnVUVRRUVCSVFKQml2UEFBRUdMODhBQUlBUkJBRWdpQmh0Qml2UEFBRUVCSUFZYklBTWJJUVlnQkVFZmRpQURjaUVFUVFNZ0JTQUZRUU5QRzBFQ2F3NENBd0lCQ3lBQVFRTTJBaWdnQUVHTTg4QUFOZ0lrSUFCQkFqc0JJRUVCSVFaQkFDRUVRUUVoQWlBQVFTQnFEQU1MSUFCQkF6WUNLQ0FBUVkvendBQTJBaVFnQUVFQ093RWdJQUJCSUdvTUFnc2dBRUVnYWlBQVFlQUFhaUFBUVE5cUVDc0NRQ0FBS0FJZ0JFQWdBRUhZQUdvZ0FFRW9haWdDQURZQ0FDQUFJQUFwQWlBM0ExQU1BUXNnQUVIUUFHb2dBRUhnQUdvZ0FFRVBhaEFUQ3lBQUlBQW9BbEFnQUNnQ1ZDQUFMd0ZZUVFBZ0FFRWdhaERwQVNBQUtBSUVJUUlnQUNnQ0FBd0JDeUFBUVFFMkFpZ2dBRUdTODhBQU5nSWtJQUJCQWpzQklDQUFRU0JxQ3lFRElBQWdBallDWENBQUlBTTJBbGdnQUNBRU5nSlVJQUFnQmpZQ1VDQUJJQUJCMEFCcUVIMGdBRUdBQVdva0FBOExJQUpCQUVjaEJpQUJMd0VPSVFCQkFDRUVJd0JCOEFocklnSWtBQ0FNdkNFRkFuOUJBeUFNaTBNQUFJQi9XdzBBR2tFQ0lBVkJnSUNBL0FkeElnTkJnSUNBL0FkR0RRQWFJQVZCLy8vL0EzRWlCMEdBZ0lBRWNpQUZRUUYwUWY3Ly93ZHhJQVZCRjNaQi93RnhJZ1FiSWdpdElnbENBWU1oQ3lBRFJRUkFRUVFnQjBVTkFSb2dCRUdXQVdzaEJFSUJJUW9nQzFBTUFRdENnSUNBRUNBSlFnR0dJQWhCZ0lDQUJFWWlBeHNoQ1VJQ1FnRWdBeHNoQ2tIb2ZrSHBmaUFER3lBRWFpRUVJQXRRQ3lFRElBSWdCRHNCNkFnZ0FpQUtOd1BnQ0NBQ1FnRTNBOWdJSUFJZ0NUY0QwQWdnQWlBRE9nRHFDQUovQWtBQ1FBSkFBa0FnQTBFQ2F5SUhCRUJCQVNFRFFZcnp3QUJCaS9QQUFDQUZRUUJJSWdnYlFZcnp3QUJCQVNBSUd5QUdHeUVJSUFWQkgzWWdCbkloQlVFRElBY2dCMEVEVHh0QkFtc09BZ0lEQVFzZ0FrRUROZ0tZQ0NBQ1FZenp3QUEyQXBRSUlBSkJBanNCa0FoQkFTRUlRUUFoQlVFQklRTWdBa0dRQ0dvTUJBc2dBa0VETmdLWUNDQUNRWS96d0FBMkFwUUlJQUpCQWpzQmtBZ2dBa0dRQ0dvTUF3dEJBaUVESUFKQkFqc0JrQWdnQUVVTkFTQUNJQUEyQXFBSUlBSkJBRHNCbkFnZ0FrRUNOZ0tZQ0NBQ1FlVHl3QUEyQXBRSUlBSkJrQWhxREFJTFFYUkJCU0FFd1NJRFFRQklHeUFEYkNJRFFjRDlBRWtFUUNBQ1FaQUlhaUFKSUFRZ0FrRVFhaUFEUVFSMlFSVnFJZ05CZ0lCK1FRQWdBR3NnQU1GQkFFZ2JJZ1FRWWlBRXdTRUVBa0FnQWlnQ2tBZ0VRQ0FDUWNnSWFpQUNRWmdJYWlnQ0FEWUNBQ0FDSUFJcEFwQUlOd1BBQ0F3QkN5QUNRY0FJYWlBQ1FkQUlhaUFDUVJCcUlBTWdCQkFYQ3lBRUlBSXVBY2dJSWdOSUJFQWdBa0VJYWlBQ0tBTEFDQ0FDS0FMRUNDQURJQUFnQWtHUUNHb1E2UUVnQWlnQ0RDRURJQUlvQWdnTUF3dEJBaUVESUFKQkFqc0JrQWdnQUVVRVFFRUJJUU1nQWtFQk5nS1lDQ0FDUVpMendBQTJBcFFJSUFKQmtBaHFEQU1MSUFJZ0FEWUNvQWdnQWtFQU93R2NDQ0FDUVFJMkFwZ0lJQUpCNVBMQUFEWUNsQWdnQWtHUUNHb01BZ3RCbHZQQUFFRWxRYnp6d0FBUW5BWUFDMEVCSVFNZ0FrRUJOZ0tZQ0NBQ1FaTHp3QUEyQXBRSUlBSkJrQWhxQ3lFQUlBSWdBellDekFnZ0FpQUFOZ0xJQ0NBQ0lBVTJBc1FJSUFJZ0NEWUN3QWdnQVNBQ1FjQUlhaEI5SUFKQjhBaHFKQUFMUEFBQ1FDQUJJQUpOQkVBZ0FpQUVUUTBCSUFJZ0JDQUZFTGdKQUFzZ0FTQUNJQVVRdHdrQUN5QUFJQUlnQVdzMkFnUWdBQ0FCSUFOcU5nSUFDMFFCQVg4akFFRVFheUlDSkFBZ0FpQUFRUXhxTmdJTUlBRkJ2TS9TQUVFTlFjblAwZ0JCQlNBQVFmQUFRYzdQMGdCQkJTQUNRUXhxUVJ3UWtnTWdBa0VRYWlRQUMwTUJBbjhqQUVFUWF5SUVKQUFnQVNnQ0FDRUZJQVFnQVNnQ0JDSUJOZ0lNSUFRZ0JUWUNDQ0FBSUFSQkNHb2dBaUFERU9VRElBVWdBUkNVQnlBRVFSQnFKQUFMUXdFQ2Z5TUFRUkJySWdRa0FDQUJLQUlBSVFVZ0JDQUJLQUlFSWdFMkFnd2dCQ0FGTmdJSUlBQWdCRUVJYWlBQ0lBTVE5UUVnQlNBQkVKUUhJQVJCRUdva0FBdENBUUovSXdCQkVHc2lCQ1FBSUFFb0FnQWhCU0FFSUFFb0FnUWlBVFlDRENBRUlBVTJBZ2dnQUNBRVFRaHFJQUlnQXhCWUlBVWdBUkNVQnlBRVFSQnFKQUFMUXdFQ2Z5TUFRUkJySWdRa0FDQUJLQUlBSVFVZ0JDQUJLQUlFSWdFMkFnd2dCQ0FGTmdJSUlBQWdCRUVJYWlBQ0lBTVE1Z01nQlNBQkVKUUhJQVJCRUdva0FBdERBUUovSXdCQkVHc2lCQ1FBSUFFb0FnQWhCU0FFSUFFb0FnUWlBVFlDRENBRUlBVTJBZ2dnQUNBRVFRaHFJQUlnQXhETEF5QUZJQUVRbEFjZ0JFRVFhaVFBQzBNQkFuOGpBRUVRYXlJRUpBQWdBU2dDQUNFRklBUWdBU2dDQkNJQk5nSU1JQVFnQlRZQ0NDQUFJQVJCQ0dvZ0FpQURFTXdESUFVZ0FSQ1VCeUFFUVJCcUpBQUxRd0VDZnlNQVFSQnJJZ1FrQUNBQktBSUFJUVVnQkNBQktBSUVJZ0UyQWd3Z0JDQUZOZ0lJSUFBZ0JFRUlhaUFDSUFNUWtBUWdCU0FCRUpRSElBUkJFR29rQUF0REFRSi9Jd0JCRUdzaUJDUUFJQUVvQWdBaEJTQUVJQUVvQWdRaUFUWUNEQ0FFSUFVMkFnZ2dBQ0FFUVFocUlBSWdBeEROQXlBRklBRVFsQWNnQkVFUWFpUUFDME1CQW44akFFRVFheUlFSkFBZ0FTZ0NBQ0VGSUFRZ0FTZ0NCQ0lCTmdJTUlBUWdCVFlDQ0NBQUlBUkJDR29nQWlBREVQSURJQVVnQVJDVUJ5QUVRUkJxSkFBTFF3RUNmeU1BUVJCcklnUWtBQ0FCS0FJQUlRVWdCQ0FCS0FJRUlnRTJBZ3dnQkNBRk5nSUlJQUFnQkVFSWFpQUNJQU1RemdNZ0JTQUJFSlFISUFSQkVHb2tBQXREQVFKL0l3QkJFR3NpQkNRQUlBRW9BZ0FoQlNBRUlBRW9BZ1FpQVRZQ0RDQUVJQVUyQWdnZ0FDQUVRUWhxSUFJZ0F4RHpBeUFGSUFFUWxBY2dCRUVRYWlRQUMwTUJBbjhqQUVFUWF5SUVKQUFnQVNnQ0FDRUZJQVFnQVNnQ0JDSUJOZ0lNSUFRZ0JUWUNDQ0FBSUFSQkNHb2dBaUFERU04RElBVWdBUkNVQnlBRVFSQnFKQUFMUXdFQ2Z5TUFRUkJySWdRa0FDQUJLQUlBSVFVZ0JDQUJLQUlFSWdFMkFnd2dCQ0FGTmdJSUlBQWdCRUVJYWlBQ0lBTVExZ0VnQlNBQkVKUUhJQVJCRUdva0FBdERBUUovSXdCQkVHc2lCQ1FBSUFFb0FnQWhCU0FFSUFFb0FnUWlBVFlDRENBRUlBVTJBZ2dnQUNBRVFRaHFJQUlnQXhEUUF5QUZJQUVRbEFjZ0JFRVFhaVFBQzBNQkFuOGpBRUVRYXlJRUpBQWdBU2dDQUNFRklBUWdBU2dDQkNJQk5nSU1JQVFnQlRZQ0NDQUFJQVJCQ0dvZ0FpQURFT2NESUFVZ0FSQ1VCeUFFUVJCcUpBQUxRd0VDZnlNQVFSQnJJZ1FrQUNBQktBSUFJUVVnQkNBQktBSUVJZ0UyQWd3Z0JDQUZOZ0lJSUFBZ0JFRUlhaUFDSUFNUXpRRWdCU0FCRUpRSElBUkJFR29rQUF0REFRSi9Jd0JCRUdzaUJDUUFJQUVvQWdBaEJTQUVJQUVvQWdRaUFUWUNEQ0FFSUFVMkFnZ2dBQ0FFUVFocUlBSWdBeERjQkNBRklBRVFsQWNnQkVFUWFpUUFDME1CQW44akFFRVFheUlFSkFBZ0FTZ0NBQ0VGSUFRZ0FTZ0NCQ0lCTmdJTUlBUWdCVFlDQ0NBQUlBUkJDR29nQWlBREVNNEJJQVVnQVJDVUJ5QUVRUkJxSkFBTFF3RUNmeU1BUVJCcklnUWtBQ0FCS0FJQUlRVWdCQ0FCS0FJRUlnRTJBZ3dnQkNBRk5nSUlJQUFnQkVFSWFpQUNJQU1RaWdRZ0JTQUJFSlFISUFSQkVHb2tBQXRDQVFKL0l3QkJFR3NpQkNRQUlBRW9BZ0FoQlNBRUlBRW9BZ1FpQVRZQ0RDQUVJQVUyQWdnZ0FDQUVRUWhxSUFJZ0F4QlpJQVVnQVJDVUJ5QUVRUkJxSkFBTFF3RUNmeU1BUVJCcklnUWtBQ0FCS0FJQUlRVWdCQ0FCS0FJRUlnRTJBZ3dnQkNBRk5nSUlJQUFnQkVFSWFpQUNJQU1RL2dNZ0JTQUJFSlFISUFSQkVHb2tBQXRRQVFGL0lBRW9BaEFnQVNnQ0ZDQURRZi8vQTNGQi9OTGFBQkRtQnk4QkFDRUVJQUVnQXlBQ1FZelQyZ0FRdEFZZ0FVRU1haUFFUVFGcVFaelQyZ0FRNVFZZ0FDQUNPZ0FDSUFBZ0F6c0JBQXRCQVFGL0EwQWdBUzhCaWdFaEF5QUNCRUFnQWtFQmF5RUNJQUVnQTBFQ2RHb29Bb3dCSVFFTUFRVWdBQ0FETmdJSUlBQkJBRFlDQkNBQUlBRTJBZ0FMQ3d0Q0FRRi9Jd0JCSUdzaUF5UUFJQU5CQURZQ0VDQURRUUUyQWdRZ0EwSUVOd0lJSUFNZ0FUWUNIQ0FESUFBMkFoZ2dBeUFEUVJocU5nSUFJQU1nQWhDckJ3QUxQUUVCZnlBQUtBSUFLQUlBSWdKQkJHb29BZ0FnQWtFSWFpZ0NBQ0FBS0FJRUtBSUFJQUZCU0d4cUlnQkJOR3NvQWdBZ0FFRXdheWdDQUJEc0J3dElBUUYvSUFBb0FnQWhBQ0FCS0FJSUlnSkJnSUNBRUhGRkJFQWdBa0dBZ0lBZ2NVVUVRQ0FBS0FJQUlBRVF4d0VQQ3lBQUtBSUFJQUVRZ1FRUEN5QUFLQUlBSUFFUWdnUUxNQUVCZjBFQklRRWdBRUgvQVhFaUFFRWNTU0FBUVI5R0lBQkIvd0ZHY2lBQVFSOVBjWEpGQkVCQkFDRUJDeUFCQzBFQkFYOERRQ0FCTHdIMkJpRURJQUlFUUNBQ1FRRnJJUUlnQVNBRFFRSjBhaWdDK0FZaEFRd0JCU0FBSUFNMkFnZ2dBRUVBTmdJRUlBQWdBVFlDQUFzTEN5NEFJQUJCQVRZQ0JDQUFJQU1nQW10QkFuWWlBaUFCUVFKMklnRWdBU0FDU3hzaUFUWUNDQ0FBSUFFMkFnQUxOd0FnQUNBQ0tBSUFJZ0VnQWlnQ0JFWUVmMEVBQlNBQVFRRTZBQWdnQWlBQlFRRnFOZ0lBSUFBZ0FTMEFBRFlDQkVFQkN6WUNBQXQwQVFOL0lBQW9BZ2dpQkNBQUtBSUFSZ1JBSXdCQkVHc2lBeVFBSUFOQkNHb2dBQ0FBS0FJQVFRRkJDRUU0RUlnQ0lBTW9BZ2dpQlVHQmdJQ0FlRWNFUUNBRklBTW9BZ3dnQWhETUNBQUxJQU5CRUdva0FBc2dBQ2dDQkNBRVFUaHNhaUFCUVRqOENnQUFJQUFnQkVFQmFqWUNDQXU0QVFFRGZ5QUFJQUF0QUVraUFVRUJhaUlDT2dBNklBQkJBU0FCUVE5eElnTjBRUUpxT3dGQUlBQkJmeUFDUVE5eGRFRi9jenNCT0NBQVFRQTJBaFFnQUVFQU5nSUlJQUJCREdvaEFrRUFJUUVEUUNBQlFmLy9BM0VnQTNaRkJFQWdBRUVBSUFGQnpOTGFBQkMwQmlBQ1FRRkIzTkxhQUJEbEJpQUJRUUZxSVFFTUFRc0xJQUJCQUVFQVFZelMyZ0FRdEFZZ0FrRUFRWnpTMmdBUTVRWWdBRUVBUVFCQnJOTGFBQkMwQmlBQ1FRQkJ2TkxhQUJEbEJncytBUUYvSUFBb0FnZ2lCQ0FBS0FJQVJnUkFJQUFnQXhEWUJRc2dBQ0FFUVFGcU5nSUlJQUFvQWdRZ0JFRURkR29pQUNBQ093RUVJQUFnQVRZQ0FBczJBUUYvSUFBZ0FVSEJBR3RCWDNGQkNtb2dBVUV3YXlJRElBSkJDa3NiSUFNZ0FVRTVTeHNpQVRZQ0JDQUFJQUVnQWtrMkFnQUxPd0VCZndOQUlBSUVRQ0FBS0FBQUlRTWdBQ0FCS0FBQU5nQUFJQUVnQXpZQUFDQUNRUUZySVFJZ0FVRUVhaUVCSUFCQkJHb2hBQXdCQ3dzTFBnRUJmeU1BUVJCcklnUWtBQ0FFUVFocVFRQkJDQ0FCSUFJZ0F4RFZCU0FFS0FJTUlRRWdBQ0FFS0FJSU5nSUFJQUFnQVRZQ0JDQUVRUkJxSkFBTFB3RUJmeU1BUVJCcklnVWtBQ0FGUVFocUlBSWdBeUFCUWRnQUlBUVExUVVnQlNnQ0RDRUJJQUFnQlNnQ0NEWUNBQ0FBSUFFMkFnUWdCVUVRYWlRQUN6OEJBWDhqQUVFUWF5SUZKQUFnQlVFSWFpQUNJQU1nQVVINEFDQUVFTlVGSUFVb0Fnd2hBU0FBSUFVb0FnZzJBZ0FnQUNBQk5nSUVJQVZCRUdva0FBczlBUU4vSUFBZ0FTZ0NDQ0lDSUFFb0FnUWlBMGtFZnlBQklBSkJBV28yQWdnZ0FTZ0NBQ0FDYWkwQUFBVWdCQXM2QUFFZ0FDQUNJQU5KT2dBQUN6Y0JBbjhnQWtIL0FYRWhBd05BSUFFaUFnUkFJQUpCQVdzaEFTQUFMUUFBSVFRZ0FFRUJhaUVBSUFNZ0JFY05BUXNMSUFKQkFFY0xlZ0VEZnlBQUtBSUlJZ01nQUNnQ0FFWUVRQ01BUVJCcklnSWtBQ0FDUVFocUlBQWdBQ2dDQUVFQlFRaEJ5QUFRaUFJZ0FpZ0NDQ0lFUVlHQWdJQjRSd1JBSUFRZ0FpZ0NERUdFcmNrQUVNd0lBQXNnQWtFUWFpUUFDeUFBS0FJRUlBTkJ5QUJzYWlBQlFjZ0EvQW9BQUNBQUlBTkJBV28yQWdnTHJ3RUJBMzhnQUNnQ0FDRUFJQUVvQWdnaUFrR0FnSUFRY1VVRVFDQUNRWUNBZ0NCeFJRUkFJQUFnQVJDV0F3OExJQUF0QUFBaEFDTUFRWUFCYXlJRUpBQkJnUUVoQXdOQUlBTWdCR3BCQW1zZ0FFRVBjU0lDUVRCeUlBSkJOMm9nQWtFS1NSczZBQUFnQUNJQ1FRUjJJUUFnQTBFQmF5RURJQUpCRDBzTkFBc2dBVUVCUWR6MndBQkJBaUFESUFScVFRRnJRWUVCSUFOckVJTUJJQVJCZ0FGcUpBQVBDeUFBTFFBQUlBRVErZ01MUlFFQmZ5QUFLQUlBSVFBZ0FTZ0NDQ0lDUVlDQWdCQnhSUVJBSUFKQmdJQ0FJSEZGQkVBZ0FDQUJFTkVKRHdzZ0FDZ0NBQ0FCRUlFRUR3c2dBQ2dDQUNBQkVJSUVDMFVCQVg4Z0FDZ0NBQ0VBSUFFb0FnZ2lBa0dBZ0lBUWNVVUVRQ0FDUVlDQWdDQnhSUVJBSUFBZ0FSQzZDUThMSUFBb0FnQWdBUkNCQkE4TElBQW9BZ0FnQVJDQ0JBcy9BUUYvSXdCQkVHc2lCU1FBSUFWQkNHb2dBaUFESUFGQm9BSWdCQkNEQmlBRktBSU1JUUVnQUNBRktBSUlOZ0lBSUFBZ0FUWUNCQ0FGUVJCcUpBQUxQZ0VCZnlNQVFSQnJJZ1VrQUNBRlFRaHFRUUFnQVNBQ0lBTWdCQkNEQmlBRktBSU1JUUVnQUNBRktBSUlOZ0lBSUFBZ0FUWUNCQ0FGUVJCcUpBQUxPd0VCZmdKQUlBQUNmQUpBQWtBZ0FTZ0NBRUVFYXc0Q0FBRURDeUFCS1FNSXVRd0JDeUFCS2dJRXV3czVBd2hDQVNFQ0N5QUFJQUkzQXdBTGVnRURmeUFBS0FJSUlnVWdBQ2dDQUVZRVFDTUFRUkJySWdRa0FDQUVRUWhxSUFBZ0FDZ0NBRUVCUVFKQkJCRHlBU0FFS0FJSUlnWkJnWUNBZ0hoSEJFQWdCaUFFS0FJTUlBTVF6QWdBQ3lBRVFSQnFKQUFMSUFBZ0JVRUJhallDQ0NBQUtBSUVJQVZCQW5ScUlnQWdBam9BQWlBQUlBRTdBUUFMU3dFRGZ5QUFLQUlJSVFJZ0FDZ0NCQ0lESVFFRFFDQUNCRUFnQWtFQmF5RUNJQUVvQWdBZ0FTZ0NCQkN1Q1NBQlFSQnFFTTRFSUFGQk9Hb2hBUXdCQ3dzZ0FDZ0NBQ0FERUswSkN6OEJBWDhqQUVFUWF5SURKQUFnQTBFSWFrRVFJQUVnQWtId3dNa0FFSjhISUFNb0Fnd2hBU0FBSUFNb0FnZzJBZ0FnQUNBQk5nSUVJQU5CRUdva0FBczZBUUYvSXdCQkVHc2lCQ1FBSUFSQkJHb2dBaUFESUFGQkFXb1F3UU1nQUNBRUtBSU1heUFFS0FJSUlBUW9BZ1FRNHdRZ0JFRVFhaVFBQ3prQUlBRWdBa0VDZEd0QkJHc29BZ0FpQVNBQUtBSUVJZ0pQQkVBZ0FTQUNRYlNmeVFBUXhnUUFDeUFBS0FJQUlBRkIyQUJzYWpVQ1ZBczhBUUYvSXdCQkVHc2lCQ1FBSUFSQkNHcEJFQ0FCSUFJZ0F4Q2ZCeUFFS0FJTUlRRWdBQ0FFS0FJSU5nSUFJQUFnQVRZQ0JDQUVRUkJxSkFBTFFnRUJmd0pBQWtBQ1FBSkFJQUF0QUFCQkFXc09Bd0FCQWdNTElBQXRBQUZCSTBZUEN5QUFLQUlFTFFBSVFTTkdEd3NnQUNnQ0JDMEFDRUVqUmlFQkN5QUJDMHNCQTM4Z0FDZ0NDQ0VDSUFBb0FnUWlBeUVCQTBBZ0FnUkFJQUpCQVdzaEFpQUJLQUlBSUFFb0FnUVFyZ2tnQVVFUWFoRE5CQ0FCUVRocUlRRU1BUXNMSUFBb0FnQWdBeEN0Q1FzOEFRRi9Jd0JCRUdzaUJDUUFJQVJCQ0dvZ0FpQUJRUWdnQXhEREJ5QUVLQUlNSVFFZ0FDQUVLQUlJTmdJQUlBQWdBVFlDQkNBRVFSQnFKQUFMTlFBZ0FDZ0NBQ2dDQUNJQUtRTUFJQUJCQ0dvcEF3QWdBU2dDQUNBQ1FVaHNhaUlBUVRScktBSUFJQUJCTUdzb0FnQVEzZ01MU1FFQ2YwRU1RUVFRbndnaUFFRUNOZ0lJSUFCQndJREFBRFlDQkNBQVFRRTJBZ0FnQUVIZ2lNQUFFTEFJSVFGQkNFRUVFSjhJSWdCQjBJM0FBRFlDQkNBQUlBRTJBZ0FnQUFzN0FRRi9RWURnMmdBdEFBQWFRUXdRRmlJRVJRUkFBQXNnQkNBQk9nQUlJQVFnQXpZQ0JDQUVJQUkyQWdBZ0FDQUVyVUlnaGtJRGhEY0NBQXMvQWdGL0FYNGpBRUVRYXlJQ0pBQWdBa0VJYWlBQlFRaEIwQUJCdktEU0FCQ2FCU0FDS1FNSUlRTWdBRUVBTmdJSUlBQWdBemNDQUNBQ1FSQnFKQUFMUHdJQmZ3RitJd0JCRUdzaUFTUUFJQUZCQ0dwQkJFRUlRY2dBUWZTc3lRQVFtZ1VnQVNrRENDRUNJQUJCQURZQ0NDQUFJQUkzQWdBZ0FVRVFhaVFBQ3pVQkFuOGpBRUVRYXlJQkpBQWdBVUVJYWlBQUVPb0NJQUVvQWdnaEFDQUJLQUlNSUFGQkVHb2tBRUdBZ01RQUlBQkJBWEViQ3pzQkFuOGdBQ2dDQ0NJQ0lBQW9BZ1FpQTBrRVFDQUFJQUpCQVdvMkFnZ2dBQ2dDQUNBQ2FpQUJPZ0FBRHdzZ0FpQURRYnlDeWdBUXhnUUFDemdCQVg0Q1FDQUJJQUlnQXlBRUlBVVF5QU1pQVVVTkFDQUJLQUlBUVFSSERRQWdBQ0FCS1FNSU53TUlRZ0VoQmdzZ0FDQUdOd01BQ3pVQUlBQW9BZ0FvQWdBaUFDa0RBQ0FBUVFocUtRTUFJQUVvQWdBZ0FrRnNiR29pQUVFUWF5Z0NBQ0FBUVF4cktBSUFFSm9CQzBrQkFuOUJERUVFRUo4SUlnQkJBallDQ0NBQVFjekUwZ0EyQWdRZ0FFRUJOZ0lBSUFCQmpNblNBQkN3Q0NFQlFRaEJCQkNmQ0NJQVFieTkwZ0EyQWdRZ0FDQUJOZ0lBSUFBTE9nRUJmeU1BUVJCcklnTWtBQ0FEUVFocUlBRWdBa0VBRU5VR0lBTW9BZ3doQVNBQUlBTW9BZ2cyQWdBZ0FDQUJOZ0lFSUFOQkVHb2tBQXMyQVFGL0lBQWdBaUFCYXlJQ0VNVUhJQUFvQWdnaEF5QUNCRUFnQUNnQ0JDQURhaUFCSUFMOENnQUFDeUFBSUFJZ0EybzJBZ2dMTndFQ2Z5QUFLQUlBSVFJZ0FDZ0NCQ0lBS0FJQUlnRUVRQ0FDSUFFUkJBQUxJQUFvQWdRaUFRUkFJQUlnQVNBQUtBSUlFT01FQ3dzeUFRSi9JQUFnQUNBQklBSVFsZ1FpQTJvZ0FxZEJHWFlpQkRvQUFDQUFJQUVnQTBFSWEzRnFRUWhxSUFRNkFBQWdBd3MrQVFGL0lBRW9BZ2dpQWtHQWdJQVFjVVVFUUNBQ1FZQ0FnQ0J4UlFSQUlBQWdBUkRSQ1E4TElBQW9BZ0FnQVJDQkJBOExJQUFvQWdBZ0FSQ0NCQXM0QUFKQUlBSkJnSURFQUVZTkFDQUFJQUlnQVNnQ0VCRURBRVVOQUVFQkR3c2dBMFVFUUVFQUR3c2dBQ0FESUFRZ0FTZ0NEQkVDQUF0REFDQUFLQUlnSUFBb0FpUVFxUWtnQUNnQ0xDQUFLQUl3RUtrSklBQW9BamdnQUNnQ1BCQ3BDU0FBS0FKRUlBQW9Ba2dRcVFrZ0FDZ0NVQ0FBS0FKVUVLa0pDeklCQVg4akFFSGdBMnNpQXlRQUlBTWdBUkJzSUFCQjRBTnFJQUlRaHdVZ0FDQURRZUFEL0FvQUFDQURRZUFEYWlRQUN6SUFBMEFnQVFSQUlBQW9BZ0FnQUVFRWFpZ0NBQkNwQ1NBQVFReHFFSVlKSUFGQkFXc2hBU0FBUVJocUlRQU1BUXNMQ3prQkFYOGpBRUVRYXlJREpBQWdBMEVJYWlBQktBSUFJQUVvQWdRZ0FoQ2hCeUFBSUFFZ0F5Z0NDQ0FES0FJTUVJSURJQU5CRUdva0FBczVBUUYvSXdCQkVHc2lBeVFBSUFOQkNHb2dBU2dDQUNBQktBSUVJQUlRemdjZ0FDQUJJQU1vQWdnZ0F5Z0NEQkNDQXlBRFFSQnFKQUFMTWdFQ2Z5QUFJQUFnQVNBQ0VPd0RJZ05xSUFLblFSbDJJZ1E2QUFBZ0FDQUJJQU5CQ0d0eGFrRUlhaUFFT2dBQUlBTUxSZ0FnQUNnQ2dBTWdBQ2dDaEFNUTFBY2dBRUh3QVdvUTVBZ2dBQkR2QVNBQUtBTEFBeUFBS0FMRUF4Q29DU0FBUWZnQWFoRHZBU0FBS0FMTUF5QUFLQUxRQXhDb0NRczhBZ0YvQVg0akFFRVFheUlDSkFBZ0FrRUlhaUFCUVFoQnZLRFNBQkR1QXlBQ0tRTUlJUU1nQUVFQU5nSUlJQUFnQXpjQ0FDQUNRUkJxSkFBTE9RQUNRQ0FDUlEwQVFZRGcyZ0F0QUFBYUlBTkZCRUFnQWlBQkVLQUlJUUVNQVFzZ0FoRDBCaUVCQ3lBQUlBSTJBZ1FnQUNBQk5nSUFDekVCQW44akFFRWdheUlCSkFBZ0FVRU1haUlDSUFBUTJnTWdBU2dDRENBQ0VNc0lJQUZCSUdva0FFR2ZnSUNBZUVZTE13RUJmeU1BUVJCcklnUWtBQ0FFSUFFcEFnQTNBZ2dnQUNBRVFRaHFJZ0FnQWlBREVLc0RJQUFReVFZZ0JFRVFhaVFBQ3pNQkFYOGpBRUVRYXlJRUpBQWdCQ0FCS1FJQU53SUlJQUFnQkVFSWFpSUFJQUlnQXhENEF5QUFFTWtHSUFSQkVHb2tBQXMxQVFGL0l3QkJFR3NpQWlRQUlBSWdBRFlDRENBQlFiek8wZ0JCRFVISnp0SUFRUVFnQWtFTWFrRWhFSjhESUFKQkVHb2tBQXN6QVFGL0l3QkJFR3NpQkNRQUlBUWdBU2tDQURjQ0NDQUFJQVJCQ0dvaUFDQUNJQU1Rb3dNZ0FCREpCaUFFUVJCcUpBQUxLd0VCZndOQUlBRUVRQ0FCUVFGcklRRWdBQzBBQUNBQ1FRaDBjaUVDSUFCQkFXb2hBQXdCQ3dzZ0FndHhBUU4vSUFBb0FnZ2lCQ0FBS0FJQVJnUkFJd0JCRUdzaUF5UUFJQU5CQ0dvZ0FDQUFLQUlBUVFGQkFrRUNFTWdDSUFNb0FnZ2lCVUdCZ0lDQWVFY0VRQ0FGSUFNb0Fnd2dBaERNQ0FBTElBTkJFR29rQUFzZ0FDQUVRUUZxTmdJSUlBQW9BZ1FnQkVFQmRHb2dBVHNCQUFzMUFDQUFLQUlBS0FJQUlnQXBBd0FnQUVFSWFpa0RBQ0FCS0FJQUlBSkJBM1JySWdCQkNHc29BZ0FnQUVFRWF5OEJBQkRyQXdzOEFDQUJLQUlBUVorQWdJQjRSZ1JBSUFBZ0FTa0NCRGNDQUNBQVFRaHFJQUZCREdvb0FnQTJBZ0FQQ3lBQVFZQ0FnSUI0TmdJQUlBRVF6UUlMTmdBZ0FDZ0NPQ0FBS0FJOEVLa0pJQUFnQVNrQ0FEY0NPQ0FBUVVCcklBRkJDR29vQWdBaUFUWUNBQ0FBUVFocUlBR3RFS0lFQ3pzQkFYOENmeUFCS0FJQVFaK0FnSUI0UmdSQUlBRW9BZ2doQWlBQktBSUVEQUVMSUFFUXl3aEJBQXNoQVNBQUlBSTJBZ1FnQUNBQk5nSUFDelVCQVg4Z0FTZ0NBQ0lDUlFSQUlBQkNBVGNEQUNBQUlBRXBBd2czQXdnUEN5QUFRZ0EzQXdBZ0FnUkFJQUZCQkdvUXpRSUxDek1CQVg4akFFRVFheUlFSkFBZ0JDQUJLUUlBTndJSUlBQWdCRUVJYWlJQUlBSWdBeENQQkNBQUVNa0dJQVJCRUdva0FBc3pBUUYvSXdCQkVHc2lCQ1FBSUFRZ0FTa0NBRGNDQ0NBQUlBUkJDR29pQUNBQ0lBTVFyQU1nQUJESkJpQUVRUkJxSkFBTE13RUJmeU1BUVJCcklnUWtBQ0FFSUFFcEFnQTNBZ2dnQUNBRVFRaHFJZ0FnQWlBREVMb0RJQUFReVFZZ0JFRVFhaVFBQ3pVQkFYOGdBQ2dDQ0NJRElBQW9BZ0JHQkVBZ0FDQUNFTjRGQ3lBQUlBTkJBV28yQWdnZ0FDZ0NCQ0FEUVFGMGFpQUJPd0VBQzMwQ0FYOEJma0VBRU84SUlnRkZCRUFqQUVFd2F5SUFKQUFnQUVFQk5nSU1JQUJCOEk3U0FEWUNDQ0FBUWdFM0FoUWdBQ0FBUVM5cXJVS0FnSUNBZ0FxRU53TWdJQUFnQUVFZ2FqWUNFQ0FBUVFocVFlelQwZ0FRcXdjQUN5QUFJQUVwQXdnM0F3Z2dBQ0FCS1FNQUlnSTNBd0FnQVNBQ1FnRjhOd01BQ3pvQkFYOGpBRUVnYXlJQUpBQWdBRUVBTmdJWUlBQkJBVFlDRENBQVFlaUx5UUEyQWdnZ0FFSUVOd0lRSUFCQkNHcEJuSXpKQUJDckJ3QUxNd0VEZnlBQUlBRW9BZ2dpQWlBQktBSUVJZ05KQkg4Z0FTZ0NBQ0FDYWkwQUFBVWdCQXM2QUFFZ0FDQUNJQU5KT2dBQUN6Y0JBWDhqQUVFZ2F5SUJKQUFnQVVFQU5nSVlJQUZCQVRZQ0RDQUJRY3lieVFBMkFnZ2dBVUlFTndJUUlBRkJDR29nQUJDckJ3QUxOd0VCZnlNQVFTQnJJZ0VrQUNBQlFRQTJBaGdnQVVFQk5nSU1JQUZCeE4vQkFEWUNDQ0FCUWdRM0FoQWdBVUVJYWlBQUVLc0hBQXM2QVFGL0l3QkJJR3NpQUNRQUlBQkJBRFlDR0NBQVFRRTJBZ3dnQUVHYytzQUFOZ0lJSUFCQ0JEY0NFQ0FBUVFocVFkVDZ3QUFRcXdjQUN6b0JBWDhqQUVFZ2F5SUFKQUFnQUVFQU5nSVlJQUJCQVRZQ0RDQUFRZWlMeVFBMkFnZ2dBRUlFTndJUUlBQkJDR3BCdkl2SkFCQ3JCd0FMTkFBZ0FFRUlJQUZCQW1zaUFTQUJRUXBQRzBFQ2RDSUJRZnpVMmdCcUtBSUFOZ0lFSUFBZ0FVR2sxZG9BYWlnQ0FEWUNBQXN5QVFGL0l3QkJFR3NpQWlRQUlBSWdBQ2dDQURZQ0RDQUJRY3pOeVFCQkR5QUNRUXhxUWM4QUVOY0NJQUpCRUdva0FBc3lBUUYvSXdCQkVHc2lBaVFBSUFJZ0FDZ0NBRFlDRENBQlFZT1YwZ0JCQlNBQ1FReHFRZEVBRU5jQ0lBSkJFR29rQUFzeUFRRi9Jd0JCRUdzaUFpUUFJQUlnQUNnQ0FEWUNEQ0FCUVlqc3lRQkJCeUFDUVF4cVFkWUFFTmNDSUFKQkVHb2tBQXMzQVFGL0l3QkJFR3NpQkNRQUlBUWdBVFlDRENBRUlBQTJBZ2dnQkVFSWFrSGsvczBBSUFSQkRHcEI1UDdOQUNBQ0lBTVE2QUVBQ3k4QUlBRWdBMFlFUUNBQlFRSjBJZ0VFUUNBQ0lBQWdBZndLQUFBTER3dEI2SkhKQUVFb1FaQ1N5UUFRbkFZQUN5OEFJQUVnQTBZRVFDQUJRUU4wSWdFRVFDQUNJQUFnQWZ3S0FBQUxEd3RCNkpISkFFRW9RWkNTeVFBUW5BWUFDeTBCQVg4Q1FDQUFFQllpQVVVTkFDQUJRUVJyTFFBQVFRTnhSU0FBUlhJTkFDQUJRUUFnQVB3TEFBc2dBUXN2QVFGL0lBQW9BZ2doQVNBQUtBSUVJUUFEUUNBQkJFQWdBVUVCYXlFQklBQVF6Z1FnQUVFb2FpRUFEQUVMQ3dzMUFRRi9JQUFvQWdnaUFpQUFLQUlBUmdSQUlBQkI4TXZTQUJDdEF3c2dBQ0FDUVFGcU5nSUlJQUFvQWdRZ0Ftb2dBVG9BQUFzd0FDQUJJQU5HQkVBZ0FVSElBR3dpQVFSQUlBSWdBQ0FCL0FvQUFBc1BDMEhva2NrQVFTaEJrSkxKQUJDY0JnQUxMd0FnQVNBRFJnUkFJQUZCREd3aUFRUkFJQUlnQUNBQi9Bb0FBQXNQQzBIb2tja0FRU2hCa0pMSkFCQ2NCZ0FMS0FBZ0FDQUNJQUVnQXlBQklBTkpHeEN3QlNJQUlBRWdBMnNnQUJzaUFFRUFTaUFBUVFCSWF3c3dBUUYvSUFBb0FnZ2hBU0FBS0FJRUlRQURRQ0FCQkVBZ0FVRUJheUVCSUFBUXVnUWdBRUhJQUdvaEFBd0JDd3NMTUFFQmZ5QUFLQUlJSVFFZ0FDZ0NCQ0VBQTBBZ0FRUkFJQUZCQVdzaEFTQUFFSWNKSUFCQjJBQnFJUUFNQVFzTEN6SUJBWDhnQUNnQ0NDSURJQUFvQWdCR0JFQWdBQ0FDRUswREN5QUFJQU5CQVdvMkFnZ2dBQ2dDQkNBRGFpQUJPZ0FBQ3l3QUlBRWdBMHNFUUNBQklBTWdCQkM1Q1FBTElBQWdBeUFCYXpZQ0JDQUFJQUlnQVVIUUFHeHFOZ0lBQ3lzQUlBRWdBMHNFUUNBQklBTWdCQkM1Q1FBTElBQWdBeUFCYXpZQ0JDQUFJQUlnQVVFTWJHbzJBZ0FMTHdFQ2ZpQUFJQUFwQTBBaUF5QUNyWHdpQkRjRFFDQUFJQUFwQTBnZ0F5QUVWcTE4TndOSUlBQWdBU0FDRUJFTEx3QWdBU0FEU3dSQUlBRWdBMEdVbk5JQUVMa0pBQXNnQUNBRElBRnJOZ0lFSUFBZ0FpQUJRZEFBYkdvMkFnQUxMd0VCZnlBQUtBSUlJUUVnQUNnQ0JDRUFBMEFnQVFSQUlBRkJBV3NoQVNBQUVNMEVJQUJCS0dvaEFBd0JDd3NMTHdFQmZ5TUFRUkJySWdJa0FDQUNJQUEyQWd3Z0FVR04vODBBUVE0Z0FrRU1ha0hQQUJEWEFpQUNRUkJxSkFBTEtBQWdBaUFBSUFNZ0FTQUJJQU5MR3hDd0JTSUFJQU1nQVdzZ0FCc2lBRUVBU2lBQVFRQklhd3NyQUNBQklBTkxCRUFnQVNBRElBUVF1UWtBQ3lBQUlBTWdBV3MyQWdRZ0FDQUNJQUZCQTNScU5nSUFDeTRBSUFFZ0Ewc0VRQ0FCSUFOQmxKelNBQkM1Q1FBTElBQWdBeUFCYXpZQ0JDQUFJQUlnQVVFRGRHbzJBZ0FMS3dBZ0FTQURTd1JBSUFFZ0F5QUVFTGtKQUFzZ0FDQURJQUZyTmdJRUlBQWdBaUFCUVFKMGFqWUNBQXM3QVFGL1FSQkJCQkNmQ0NJRUlBTTJBZ3dnQkNBQ05nSUlJQVJCeUlqQUFEWUNCQ0FFSUFFMkFnQWdBRUhnaThBQU5nSUVJQUFnQkRZQ0FBczdBUUYvUVJCQkJCQ2ZDQ0lFSUFNMkFnd2dCQ0FDTmdJSUlBUkI0SXZBQURZQ0JDQUVJQUUyQWdBZ0FFSFFnY0FBTmdJRUlBQWdCRFlDQUFzcUFBTkFJQUVFUUNBQUtBSUFJQUJCQkdvb0FnQVFyZ2tnQVVFQmF5RUJJQUJCREdvaEFBd0JDd3NMT0FFQmYwRVFRUVFRbndnaUJTQUVOZ0lNSUFVZ0F6WUNDQ0FGSUFJMkFnUWdCU0FCTmdJQUlBQkJxSXpBQURZQ0JDQUFJQVUyQWdBTExRRUNmeU1BUVJCcklnQWtBQ0FBUVFocVFRRkJrSWJBQUVFQUVJQUlFTjhISUFBb0FnZ2dBRUVRYWlRQUN6UUJBbjhnQVNnQ0RDSURJQUV2QVJnaUFra0VRQ0FDSUFOQjRNSEFBQkM0Q1FBTElBQWdBallDQkNBQUlBRW9BZ2cyQWdBTE9BRUJmMEVCSVFFZ0FDMEFCRVVFUUNBQUtBSUFJZ0VvQWdCQjRjL0pBRUVCSUFFb0FnUW9BZ3dSQWdBaEFRc2dBQ0FCT2dBRUlBRUxLZ0VCZnlNQVFSQnJJZ0lrQUNBQ1FRaHFJQUFnQUNnQ0NDQUJFTWdFSUFJb0FnZ2dBa0VRYWlRQUN5b0FBMEFnQVFSQUlBQW9BZ0FnQUVFRWFpZ0NBQkNwQ1NBQlFRRnJJUUVnQUVFTWFpRUFEQUVMQ3dzN0FRRi9RUkJCQkJDZkNDSUVJQU0yQWd3Z0JDQUNOZ0lJSUFSQjFNYlNBRFlDQkNBRUlBRTJBZ0FnQUVITXl0SUFOZ0lFSUFBZ0JEWUNBQXN0QVFKL0l3QkJFR3NpQUNRQUlBQkJDR3BCQVVIa3l0SUFRUUFRZ0FnUTZRY2dBQ2dDQ0NBQVFSQnFKQUFMUGdFQmYwRVFRUVFRbndnaUEwSFV4dElBTmdJTUlBTWdBallDQ0NBRFFjekswZ0EyQWdRZ0F5QUJOZ0lBSUFCQjVNSFNBRFlDQkNBQUlBTTJBZ0FMT0FFQmYwRVFRUVFRbndnaUJTQUVOZ0lNSUFVZ0F6WUNDQ0FGSUFJMkFnUWdCU0FCTmdJQUlBQkI1TDdTQURZQ0JDQUFJQVUyQWdBTEt3RUJmeUFCS0FJQUlnSUVRQ0FBSUFJUkJBQUxJQUVvQWdRaUFnUkFJQUFnQWlBQktBSUlFT01FQ3dzc0FRRi9Jd0JCRUdzaUJDUUFJQVFnQVNnQ0FEWUNEQ0FBSUFSQkRHb2dBaUFERU9JQ0lBUkJFR29rQUFzc0FRRi9Jd0JCRUdzaUJDUUFJQVFnQVNnQ0FEWUNEQ0FBSUFSQkRHb2dBaUFERU9NQ0lBUkJFR29rQUFzc0FRRi9Jd0JCRUdzaUJDUUFJQVFnQVNnQ0FEWUNEQ0FBSUFSQkRHb2dBaUFERU9RQ0lBUkJFR29rQUFzc0FRRi9Jd0JCRUdzaUJDUUFJQVFnQVNnQ0FEWUNEQ0FBSUFSQkRHb2dBaUFERU9VQ0lBUkJFR29rQUFzc0FRRi9Jd0JCRUdzaUJDUUFJQVFnQVNnQ0FEWUNEQ0FBSUFSQkRHb2dBaUFERU9ZQ0lBUkJFR29rQUFzc0FRRi9Jd0JCRUdzaUJDUUFJQVFnQVMwQUFEb0FEeUFBSUFSQkQyb2dBaUFERUlNRElBUkJFR29rQUFzc0FRRi9Jd0JCRUdzaUJDUUFJQVFnQVNnQ0FEWUNEQ0FBSUFSQkRHb2dBaUFERU1NQklBUkJFR29rQUFzc0FRRi9Jd0JCRUdzaUJDUUFJQVFnQVNnQ0FEWUNEQ0FBSUFSQkRHb2dBaUFERU9jQ0lBUkJFR29rQUFzd0FRRi9JQUFvQWdBaUFVR0FnSUNBZUVjRVFDQUJJQUFvQWdRUTlna2dBRUVRYWhEcEJBOExJQUJCQkdvUTZnUUxMQUVCZnlNQVFSQnJJZ1FrQUNBRUlBRW9BZ0EyQWd3Z0FDQUVRUXhxSUFJZ0F4RG9BaUFFUVJCcUpBQUxLQUFnQVNBRFN3UkFJQUVnQXlBRUVMa0pBQXNnQUNBRElBRnJOZ0lFSUFBZ0FTQUNhallDQUFzb0FDQUNJQU5KQkVBZ0F5QUNJQVFRdVFrQUN5QUFJQUlnQTJzMkFnUWdBQ0FCSUFOcU5nSUFDeXNBSUFJZ0Ewa0VRQ0FESUFKQnNJYktBQkM1Q1FBTElBQWdBaUFEYXpZQ0JDQUFJQUVnQTJvMkFnQUxNZ0FnQVNnQ0FFRUJSZ1JBSUFCQmdJQ0FnSGcyQWdBZ0FDQUJLUUlFTndJRUR3c2dBQ0FCS0FJRUlBRW9BZ2dRakFVTE1BQUNRQUpBQWtBZ0FDZ0NBRUVFYXc0Q0FRSUFDMEhNek1vQVFRd1E3Z2tBQ3lBQUtRTUl1UThMSUFBcUFnUzdDeXdCQVg4akFFRVFheUlFSkFBZ0JDQUJLQUlBTmdJTUlBQWdCRUVNYWlBQ0lBTVF3Z0VnQkVFUWFpUUFDeXdCQVg4akFFRVFheUlFSkFBZ0JDQUJLQUlBTmdJTUlBQWdCRUVNYWlBQ0lBTVF4Z0VnQkVFUWFpUUFDekFCQVg4Z0FDZ0NBQ0lCUVlDQWdJQjRSd1JBSUFFZ0FDZ0NCQkQyQ1NBQVFSQnFFTXdFRHdzZ0FFRUVhaEQ2QkF2WGZnTW5md2QrQW53akFFRVFheUlaSkFBUW5BRWlBeUFBSmdFakFFR2dDV3NpQWlRQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRElpTVEvQWtpQTBFQVNBMEFRUUVoSkNBREJFQkJBU0VGSUFKQlFHdEJBU0FERUw0SElBSW9Ba0FpSkVVTkFTQURJU1lMRUFFaEFCQ2NBU0lHSUFBbUFTQUdKUUVRQWlFQUVKd0JJZ1FnQUNZQklBUWxBUkFESVFBUW5BRWlBeUFBSmdFZ0JCRHVDQ0FESlFFZ0l5VUJJQ1FRQkNBREVPNElJQVlRN2dnZ0l4RDhDU0VFSUFKQkFEWUNWQ0FDUW9DQWdJQVFOd0pNSUFKQitBQnFRZ0EzQXdBZ0FrR1FBV3BDQURjREFDQUNRZ0EzQTNBZ0FrS0FnSUNBZ0lDQStEODNBMmdnQWtJQU53T0lBU0FDUW9DQWdJQ0FnSUQ0UHpjRGdBRWdBa0VBT2dDY0FTQUNRZ0EzQTJBZ0FrS0FnSUNBZ01DYS9NQUFOd05ZSUFJZ0FrSE1BR28yQXBnQklBSkI0QWRxUVpxWXlRQkJBeENNQlVFRVFRRVFud2dpQTBHNzI0TDJmVFlBQUNBQ1FaQUhhaENOQlNBQ1FaUUlha0VBT2dBQUlBSkNBRGNDakFnZ0FrRUFOZ0tFQ0NBQ1FiZ0lhaERtQmlBQ1FjZ0hha0g0ejlJQUtRTUFOd01BSUFKQ0FEY0RvQWdnQWtFQU5nS1lDQ0FDUVFRMkF2UUhJQUlnQXpZQzhBY2dBa0VFTmdMc0J5QUNRZ0EzQTZnSUlBSkJBRFlDZ0FnZ0FrS0FnSUNBd0FBM0EvZ0hJQUpCQWpZQ2dBWWdBaUFrTmdLd0NDQUNJQVEyQXJRSUlBSkI4TS9TQUNrREFEY0R3QWNnQWlBQ0tRUEFDRGNEMkFjZ0FpQUNLUU80Q0RjRDBBY2dBa0hRQTJvaEQwRUFJUVlqQUVHQUMyc2lBU1FBSUFGQkFEWUNuQUVnQWtHQUJtb2lDQ2dDdEFJaEJ5QUlLQUt3QWlFREFrQUNRQUpBQTBBQ1FBSkFJQUZCaUFGcUlBZEJCVThFZnlBQlFaQUJha0VCSUFNZ0IwRzgxTWtBRUo4SElBTTFBQUFnQTBFRWFqRUFBRUlnaG9SQ3BhQ1JzdFFGVWcwQklBWUZRUUFMSUFnb0FyQUNJQWdvQXJRQ1FkRFh5UUFRbndjZ0FTZ0NpQUVoQkNBSUlBRW9Bb3dCSWdNMkFyUUNJQWdnQkRZQ3NBSWdBVUVCTmdLc0FpQUJRZ1kzQXFRQ0lBRkI0TmZKQURZQ29BSWdBU0FETmdLY0FpQUJJQVEyQXBnQ0lBRkJ5QVJxUWJDZHlRQkJCU0FCUVpnQ2FoQzlBaUFCS0FMSUJFRURSdzBCSUFFZ0FTa0MzQVEzQTZBSElBRWdBU2tDMUFRM0E1Z0hJQUVnQVNrQ3pBUWlLRGNEa0FjZ0tFSWdpS2NoQmlBb3B5RUVRUUFoQXdKQUFrQURRQ0FESUFaR0RRRkJrTkRTQUVFQ0lBTWdCR290QUFBUXJBWkZCRUFnQTBFQmFpRUREQUVMQ3lBQlFjZ0VhaUFCUVpBSGFpSUVJQU1RMEFZZ0FVSGdCR29nQkNBREVORUdEQUVMSUFGQnlBUnFJQUZCa0FkcUlnTWdCaERRQmlBQlFlQUVhaUFESUFZUTBRWUxJQUVvQXVRRUlSRWdBU2dDNEFRaEVDQUJLQUxjQkNFS0lBRW9BdGdFSVFrZ0FTZ0MxQVFoQlNBQktBTFFCQ0VHSUFFb0Fzd0VJUVFnQVNnQ3lBUWlBMFVOQVNBQklBbzJBb1FJSUFFZ0NUWUNnQWdnQVNBRU5nTDBCeUFCSUFNMkF2QUhJQUVnQnEwZ0JhMUNJSWFFTndMNEJ5QUJRY2dFYWlJRUlBRkI4QWRxRU1FQ0lBRW9Bc2dFUVFOSERRRWdBU0FCS1FMY0JEY0NrQWtnQVNBQktRTFVCRGNDaUFrZ0FTQUJLUUxNQkRjQ2dBa2dCQ0FCUVlBSmFpSURFTUFCSUFFb0FzZ0VRUU5IRFFFZ0FTZ0N6QVJGRFFFZ0JDQVFJQkVRWnlBRElBUVFvZ2NnQVNnQ2dBa2lIMEdBZ0lDQWVFWU5BU0FCS1FLRUNTSW9RaUNJcHlFWUlDaW5JU0FnQ0NnQ3RBSWhCeUFJS0FLd0FpRUdRUUFoQXdOQUlBTWdCMFlOQkNBRElBWnFMUUFBUVFwSEJFQWdBMEVCYWlFRERBRUxDeUFCUVlBQmFpQURRUUZxSUFZZ0IwSG8xOGtBRUo4SElBRXBBNEFCSVNnZ0FVRUJOZ0tzQWlBQlFnczNBcVFDSUFGQitOZkpBRFlDb0FJZ0FTQW9Od0tZQWlBQlFjZ0Vha0dWbk1rQVFRRWdBVUdZQW1vUXZRSUNRQ0FCS0FMSUJFRURSdzBBSUFFZ0FTa0MzQVEzQTZBSElBRWdBU2tDMUFRM0E1Z0hJQUVnQVNrQ3pBUWlLRGNEa0FjZ0tFSWdpS2NoQmlBb3B5RUVRUUFoQXdKQUFrQURRQ0FESUFaR0RRRkJrTkRTQUVFQ0lBTWdCR290QUFBUXJBWkZCRUFnQTBFQmFpRUREQUVMQ3lBQlFjZ0VhaUFCUVpBSGFpSUVJQU1RMEFZZ0FVSGdCR29nQkNBREVORUdEQUVMSUFGQnlBUnFJQUZCa0FkcUlnTWdCaERRQmlBQlFlQUVhaUFESUFZUTBRWUxJQUVvQXVRRUlSRWdBU2dDNEFRaEVDQUJLQUxjQkNFS0lBRW9BdGdFSVFrZ0FTZ0MxQVFoQlNBQktBTFFCQ0VHSUFFb0Fzd0VJUVFnQVNnQ3lBUWlBMFVOQUNBQklBbzJBb1FJSUFFZ0NUWUNnQWdnQVNBRU5nTDBCeUFCSUFNMkF2QUhJQUVnQnEwZ0JhMUNJSWFFTndMNEJ5QUJRY2dFYWlJRElBRkI4QWRxRU1FQ0lBRW9Bc2dFUVFOSERRQWdBU0FCS1FMY0JEY0NrQWtnQVNBQktRTFVCRGNDaUFrZ0FTQUJLUUxNQkRjQ2dBa2dBeUFCUVlBSmFoREFBU0FCS0FMSUJFRURSdzBBSUFFb0Fzd0VSUTBBSUFNZ0VDQVJFSXdGSUFFb0FzZ0VJZ1ZCZ0lDQWdIaEdEUUFnQVNnQzBBUWhCaUFCS0FMTUJDRUpRUUFoQXdKQUEwQWdBeUFHUmcwQklBTWdDV29nQTBFQmFpRURMQUFBUVFCSURRQUxJQVVnQ1JDcENRd0JDeUFJS0FMc0FTQUlLQUx3QVJDcENTQUlJQVkyQXZRQklBZ2dDVFlDOEFFZ0NDQUZOZ0xzQVFzZ0NDZ0N0QUloQnlBSUtBS3dBaUVHREFNTElBRW9BcFFCSVFjZ0FTZ0NrQUVoQXlBR1FRRnFJUVlNQVFzTElBOUJBam9BQ0NBUFFvT0FnSURnZ0lDQWdIODNBd0FNQVFzZ0FVSDRBR29nQmlBSFFkVFp5UUJCQlNBSFFZQUVheUlEUVFBZ0F5QUhUUnNRbVFNQ1FBSkFBa0FDUUFKQUlBRW9BbmhCQVhFRVFDQUJLQUo4SWdOQkdVc05BUXNnQVVFQU9nRE1CQXdCQ3lBQlFmQUFhaUFHSUFkQjJkbkpBRUVKSUFOQkdXc1FtUU1nQVNnQ2RDRUZJQUVvQW5BZ0FVR1lnSUNBZURZQ3lBUkJBQ0VESUFGQkFEb0F6QVJCQVhFTkFRc2dBVUdvQVdvZ0FVSFlCR29vQWdBMkFnQWdBU0FCS1FMUUJEY0RvQUVnQVNnQ3pBUWhBd3dCQ3lBQlFjZ0VhaUlPRU0wQ0lBVWdCMHNOQUNBQlFlZ0FhaUFGSUFZZ0IwSGsyY2tBRUo4SElBRkJBVFlDM0FFZ0FVSUVOd0xVQVNBQlFaVFl5UUEyQXRBQklBRWdBU2tEYURjQ3lBRWdEa0haMmNrQVFRa2dBVUhJQVdvUXZRSWdBVUg0QjJvaUJpQUJRZGdFYWlJUUtBSUFOZ0lBSUFFZ0FTa0MwQVEzQS9BSElBRW9Bc2dFUVFOSERRQWdBU2dDekFRaEJDQUJRWXdKYWlJRklBWW9BZ0EyQWdBZ0FTQUVOZ0tBQ1NBQklBRXBBL0FITndLRUNTQUJJQUVwQXR3RU53S1FDU0FPSUFGQmdBbHFJZ29Rd1FJZ0JpQVFLQUlBTmdJQUlBRWdBU2tDMEFRM0EvQUhJQUVvQXNnRVFRTkhEUUFnQVNnQ3pBUWhCQ0FCUWFRQ2FpQUdLQUlBTmdJQUlBRWdBU2tEOEFjM0Fwd0NJQUVnQVNrQzNBUTNBcWdDSUFFZ0JEWUNtQUlnRGlBQlFaZ0NhaEJnSUFGQmlBbHFJZ1lnRUNnQ0FEWUNBQ0FCSUFFcEF0QUVOd09BQ1NBQktBTElCRUVEUncwQUlBRW9Bc3dFSVFRZ0FVSDhCMm9nQmlnQ0FEWUNBQ0FCSUFRMkF2QUhJQUVnQVNrRGdBazNBdlFISUFFZ0FTa0MzQVEzQW9BSUlBNGdBVUh3QjJvaUNSQkdJQUVvQXNnRVFRRkdEUUFnQlNBQlFkd0VhaUlGSWdZb0FnQTJBZ0FnQVNBQktBTFFCRFlDZ0FrZ0FTQUJLUUxVQkRjQ2hBa2dBU0FCS1FQZ0JEY0NrQWtnQVNrRDZBUWhLQ0FPSUFvUVlDQUJRWUFDYWlJUklCQW9BZ0EyQWdBZ0FTQUJLUUxRQkRjRCtBRWdBU2dDeUFSQkEwY05BQ0FCS0FMTUJDRUVJQUZCbkFkcUlCRW9BZ0EyQWdBZ0FTQUJLUVA0QVRjQ2xBY2dBU0FCS1FMY0JEY0NvQWNnQVNBRU5nS1FCeUFPSUFGQmtBZHFFT1FCSUJFZ0JpZ0NBRFlDQUNBQklBRXBBdFFFTndQNEFTQUJLQUxRQkNFSElBRW9Bc3dFSVFZQ1FBSkFJQUVvQXNnRUlnUkZEUUFnQVVHRUNHb2dFU2dDQURZQ0FDQUJJQWMyQXZnSElBRWdCallDOUFjZ0FTQUVOZ0x3QnlBQklBRXBBL2dCTndMOEJ5QU9RZFRaeVFCQkJTQUpFTjhCSUJFZ0JTZ0NBRFlDQUNBQklBRXBBdFFFTndQNEFTQUJLQUxRQkNFSElBRW9Bc3dFSVFZZ0FTZ0N5QVFpQkVVTkFDQUJRWlFKYWlBUktBSUFOZ0lBSUFFZ0J6WUNpQWtnQVNBR05nS0VDU0FCSUFRMkFvQUpJQUVnQVNrRCtBRTNBb3dKSUE0Z0NoQ29BaUFCS0FMSUJFRURSdzBDSUFFb0Fzd0VJUWNNQVFzZ0JrRURSdzBCQ3lBSFJRMEFBa0FDUUFKQUFrQWdDQ2dDdEFJaUF5QW9weUlFVHdSQUlBZ2dCRFlDckFJZ0FVSGdBR29nQkNBSUtBS3dBaUFEUVlUWXlRQVFud2NnQVVFQk5nS0VDQ0FCUWdRM0F2d0hJQUZCbE5qSkFEWUMrQWNnQVNBQktRTmdOd0x3QnlBQlFjZ0VhaUFCUWZBSGFpQUlFQTBnQVNnQzhBUWlBMEdBZ0lDQWVFWUVRQ0FCUVpBSmFpQUJRZGdFYWlnQ0FDSUROZ0lBSUFGQmlBbHFJQUZCMEFScUtRTUFJaWszQXdBZ0FTQUJLUVBJQkNJb053T0FDU0FQUVJScUlBTTJBZ0FnRDBFTWFpQXBOd0lBSUE4Z0tEY0NCQ0FQUVFNMkFnQU1Cd3NnQVVHQUNXb2lCQ0FCUWNnRWFpSUdRU2o4Q2dBQUlBRkI5QUZxSUFGQmpBVnFLQUlBTmdJQUlBRkI3QUZxSUFGQmhBVnFLUUlBTndJQUlBRkI1QUZxSUFGQi9BUnFLUUlBTndJQUlBRkIwQUZxSUFGQm9BbHFLUU1BTndNQUlBRWdBU2tDOUFRM0F0d0JJQUZCd0FGcUlBRkJrQWxxSWhJb0FnQTJBZ0FnQVVHNEFXb2dBVUdJQ1dvaURpa0RBRGNEQUNBQklBRXBBNWdKTndQSUFTQUJJQUVwQTRBSk53T3dBU0FCSUFNMkF0Z0JJQVlRNWdZZ0FVR0FBbXBCK00vU0FDa0RBRGNEQUNBQlFmRFAwZ0FwQXdBM0EvZ0JJQUVnQVNrRDBBUTNBNUFDSUFFZ0FTa0R5QVEzQTRnQ0lBRkJtQUpxSWdNZ0FVSElBV3BCbU5qSkFFRUVFRkFnQmtFRWNpRWxJQUZCZ0FWcUlSRWdBVUhRQkdvaERDQUVRUVJ5SVNFZ0FVR1lDV29oR3lBQlFhd0phaUVYSUFGQjlBUnFJU0lnQVVHRUNHb2hHaUFEUVFSeUlSVWdBVUdJQW1vaEVDQUJLQUtZQWlFRFFRd2hCZ05BSUFOQkRFWU5BeUFCSUFNMkFzZ0VJQ1VnRlVIRUFQd0tBQUFnQVVHQUNXb2lCQ0FESUFFcEE5QUVFTHdFSUFGQjhBTnFJQVFRNFFZZ0FVSElCR29RbmdRZ0FTZ0M4QU5CQVhGRkRRSWdBU2tEa0FJaExDQUJLUU9JQWlFdElBRXBBL2dESVNvQ1FDQUJLQUtFQWtVTkFDQXRJQ3dnS2hDSUJDRW9JQUVvQXZ3Qklna2dLS2R4SVFjZ0tFSVppRUwvQUlOQ2dZS0VpSkNnd0lBQmZpRXBJQUVvQXZnQklnVkJDR3NoQkVFQUlSTURRQ0FGSUFkcUtRQUFJaTRnS1lVaUtFSi9oU0FvUW9HQ2hJaVFvTUNBQVgyRFFvQ0Jnb1NJa0tEQWdIK0RJU2dEUUNBb1VFVUVRQ0FxSUFRZ0tIcW5RUU4ySUFkcUlBbHhRUU4wYXlrREFGRU5CaUFvUWdGOUlDaURJU2dNQVFzTElDNGdMa0lCaG9OQ2dJR0NoSWlRb01DQWY0TlFSUTBCSUFjZ0UwRUlhaUlUYWlBSmNTRUhEQUFMQUFzZ0FTQXFOd09BQ1NBdElDd2dLaENJQkNFcElBRWdBVUdBQ1dvMkF2QUhJQUVvQW9BQ1JRUkFBa0FqQUVGQWFpSVVKQUFnRkNBUU5nSU1JQUZCK0FGcUlod29BZ3doQnlBVUlCUkJER28yQWhBZ0IwRi9Sd1JBQW44Q1FDQWNLQUlFSWdNZ0EwRUJha0VEZGtFSGJDQURRUWhKR3lJRFFRRjJJQWROQkVBZ0ZFRXdhaUFESUFjZ0F5QUhTeHRCQVdvUS9nSWdGQ2dDTkNJS0lCUW9BakFpSGtVTkFob2dGQ2dDT0NFSklCUWdGQ2dDUERZQ0xDQVVJQWsyQWlnZ0ZDQUtOZ0lrSUJRZ0hqWUNJQ0FVUW9pQWdJQ0FBVGNDR0NBVUlCeEJFR28yQWhRZ0hDZ0NBQ0lGS1FNQVFuK0ZRb0NCZ29TSWtLREFnSCtESVNnZ0ZFRWdhaUVFUVFBaEV3TkFJQWNFUUFOQUlDaFFCRUFnRTBFSWFpRVRJQVZCQ0dvaUJTa0RBRUovaFVLQWdZS0VpSkNnd0lCL2d5RW9EQUVMQ3lBZUlCNGdDaUFVUVJCcUlCd2dLSHFuUVFOMklCTnFJZ01RcmdjUTBnWkJmM05CQTNScUlCd29BZ0FnQTBGL2MwRURkR29wQUFBM0FBQWdCMEVCYXlFSElDaENBWDBnS0lNaEtBd0JDd3NnRkNBY0tBSU1JZ00yQWl3Z0ZDQUpJQU5yTmdJb0lCd2dCQkRUQ1NBVVFSUnFFS2dGREFFTElCd2dGRUVRYWtFL0VKTUJDMEVBQ3hvZ0ZFRkFheVFBREFFTEVPY0dBQXNMSUFFZ0FVSDRBV28yQXN3RUlBRWdBVUh3QjJvMkFzZ0VJQUZCMkFCcUlBRW9BdmdCSUFFb0F2d0JJQ2tnQVVISUJHcEJCUkQrQVNBQktBSllRUUZ4QkVBZ0FTZ0MrQUVpQ1NBQktBSmNJZ1ZxSWdNdEFBQWhCQ0FCS1FPQUNTRW9JQU1nS2FkQkdYWWlBem9BQUNBSklBRW9BdndCSUFWQkNHdHhha0VJYWlBRE9nQUFJQWtnQlVFRGRHdEJDR3NnS0RjREFDQUJJQUVvQW9RQ1FRRnFOZ0tFQWlBQklBRW9Bb0FDSUFSQkFYRnJOZ0tBQWdzQ1FDQXFRZ0JaQkVBZ0NDZ0N0QUlpQkNBcXB5SURUdzBCQ3lBUFFRRTZBQWdnRDBLRGdJQ0FnSU9BZ0lCL053TUFEQVVMSUFGQjBBQnFJQU1nQ0NnQ3NBSWdCRUdjMk1rQUVKOEhJQUZDZ0lDQWdCQTNBb0FJSUFGQ0FUY0MrQWNnQVNBQktRTlFOd0x3QnlBQlFjZ0VhaUFCUWZBSGFpQUlFQTBnQVNnQzhBUWlBMEdBZ0lDQWVFWUVRQ0FCUVpBSmFpQUJRZGdFYWlnQ0FDSUROZ0lBSUFGQmlBbHFJQUZCMEFScUtRTUFJaWszQXdBZ0FTQUJLUVBJQkNJb053T0FDU0FQUVJScUlBTTJBZ0FnRDBFTWFpQXBOd0lBSUE4Z0tEY0NCQ0FQUVFNMkFnQU1CUXNnQVVHQUNXb2dBVUhJQkdvaUJFRW8vQW9BQUNBYVFSaHFJQ0pCR0dvaUNpZ0NBRFlDQUNBYVFSQnFJQ0pCRUdvaUNTa0NBRGNDQUNBYVFRaHFJQ0pCQ0dvaUJTa0NBRGNDQUNBYUlDSXBBZ0EzQWdBZ0FVR0FCMm9nRGlrREFEY0RBQ0FCUVlnSGFpQVNLQUlBTmdJQUlBRkIrQWRxSUJ0QkNHb3BBd0EzQXdBZ0FTQUJLUU9BQ1RjRCtBWWdBU0FiS1FNQU53UHdCeUFCSUFNMkFvQUlJQUZCc0FGcUlBRkIrQVpxRVBBQ0lBRkI0QUpxSWdNZ0FVSElBV3BCck5qSkFFRUhFRkFDUUNBQktBTGdBa0VNUmcwQUlBUWdBU2dDNEFJZ0FTa0Q2QUlRdkFRZ0FVSFFDR29nQkJEaEJpQURFSjRFSUFFb0F0QUlRUUZ4UlEwQUFrQUNRQUpBSUFFcEE5Z0lJaWhDQUZrRVFDQUlLQUswQWlJRUlDaW5JZ05QRFFFTElBOUJBam9BQ0NBUFFvT0FnSUNBZzRDQWdIODNBd0FNQVFzZ0FVSElBR29nQXlBSUtBS3dBaUFFUWJUWXlRQVFud2NnQVVLQWdJQ0FFRGNDMEFNZ0FVSUJOd0xJQXlBQklBRXBBMGczQXNBRElBRkJ5QVJxSUFGQndBTnFJQWdRRFNBQktBTHdCQ0lFUVlDQWdJQjRSdzBCSUFGQm9BZHFJQUZCMkFScUtBSUFJZ00yQWdBZ0FVR1lCMm9nQVVIUUJHb3BBd0FpS1RjREFDQUJJQUVwQThnRUlpZzNBNUFISUE5QkZHb2dBellDQUNBUFFReHFJQ2szQWdBZ0R5QW9Od0lFSUE5QkF6WUNBQXNnQVVId0Iyb1E2Z2NNQmdzZ0FVR1FCMm9pQXlBQlFjZ0Vha0VvL0FvQUFDQVhRUmhxSUFvb0FnQTJBZ0FnRjBFUWFpQUpLUUlBTndJQUlCZEJDR29nQlNrQ0FEY0NBQ0FYSUNJcEFnQTNBZ0FnQVVHQUNXb2dBMEVvL0FvQUFDQUJRYkFEYWlBQlFaZ0hhaWtEQURjREFDQUJRYmdEYWlBQlFhQUhhaWdDQURZQ0FDQUJJQVEyQXFnSklBRWdBU2tEa0FjM0E2Z0RJQnNRNmdjZ0FVR3dBV29nQVVHb0Eyb1E4QUlMSUFGQmtBZHFJQUZCOEFkcVFaall5UUJCQkJEUEFRSkFBa0FnQVNnQ2tBZEJuNENBZ0hoSEJFQWdJU0FCS1FLUUJ6Y0NBQ0FoUVJCcUlBRkJvQWRxS0FJQU5nSUFJQ0ZCQ0dvZ0FVR1lCMm9wQWdBM0FnQWdBVUVNTmdLQUNRd0JDd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtCQkNDQUJLQUtVQnlJRktBSUFJZ1JCQW1zaUF5QURRUXBQRzBFQmF3NEpBUUlEQkFVR0J3Z0pBQXNnQVVFQ05nTElCQXdKQ3lBQlFjZ0VhaUFGUWNnQS9Bb0FBQXdJQ3lBQlFjZ0VhaUFGUWNnQS9Bb0FBQXdIQ3lBQlFjZ0VhaUFGUWNnQS9Bb0FBQXdHQ3lBbElBVkJDR29vQWdBZ0JVRU1haWdDQUJDTUJTQUJRUVkyQXNnRURBVUxJQ1VnQlVFSWFpZ0NBQ0FGUVF4cUtBSUFFSXdGSUFGQkJ6WUN5QVFnQVNBRkxRQVFPZ0RZQkF3RUN5QWxJQVZCQkdvUVh5QUJRUWcyQXNnRURBTUxJQXdnQlVFSWFoQkZJQUZCQ1RZQ3lBUU1BZ3NnRENBRlFRaHFFRVVnRVNBRlFUeHFLQUlBSUFWQlFHc29BZ0FRakFVZ0FTQUVOZ0xJQkNBQklBVXRBRVE2QUl3RklBRWdCU2dDQkRZQ3pBUU1BUXNnQVVISUJHb2dCVUhJQVB3S0FBQUxJQUZCZ0FscUlBRkJ5QVJxSWdSQnlBRDhDZ0FBSUFFb0FvQUpJZ05CREVZTkFDQUVJQ0ZCeEFEOENnQUFEQUVMSUNFUXpRSkJEQ0VEQ3lBVklBRkJ5QVJxUWNRQS9Bb0FBQ0FCUWZBSGFoRHFCd3dBQ3dBTElBOUJBRG9BQ0NBUFFvT0FnSUNBZzRDQWdIODNBd0FNQlFzZ0F5RUdDeUFCSUFZMkFwZ0NJQUVnQVNnQ3RBRWlCallDNUFRZ0FTQUJLQUt3QVNJRE5nTGdCQ0FCUVFBMkF0d0VJQUVnQTBFQVJ5SUVOZ0xZQkNBQklBWTJBdFFFSUFFZ0F6WUMwQVFnQVVFQU5nTE1CQ0FCSUFRMkFzZ0VBa0FDUUFKQUlBTUVRQ0FCS0FLNEFTSUVEUUVMUVFFaEF3d0JDeUFCSUFSQkFXczJBdWdFQTBBZ0F5OEJpZ0VoQnlBR0JFQWdCa0VCYXlFR0lBTWdCMEVDZEdvb0Fvd0JJUU1NQVFzTElBRWdCellDNUFSQkFDRUdJQUZCQURZQzRBUWdBU0FETmdMY0JDQUJRUUUyQXRnRUFrQURRQ0FIRFFFZ0F5Z0NXQ0lFQkVBZ0JrRUJhaUVHSUFNdkFZZ0JJUWNnQkNFRERBRUxDMEdBeE1rQUVMc0pBQXNnQjBFQmF5RUZBa0FnQmtVTkFFRUJJQVpySVFjZ0F5QUZRUUowYWtHTUFXb2hCZ05BSUFkRkRRRWdCMEVCYWlFSElBWW9BZ0FpQkNBRUx3R0tBVUVDZEdwQmpBRnFJUVlNQUFzQUN5QURJQVZCQW5ScUtBSmNRUUZxSWdORkRRRUxJQUVvQXJ3QklBTkdEUUlnQVNBRE5nSzhBUXdDQ3lBUFFRUTZBQWdnRDBLRGdJQ0E0SUNBZ0lCL053TUFDeUFCS0FMNEFTQUJLQUw4QVJEbEJTQUJRY2dCYWhEcUJ5QUJRYkFCYWhDU0JBd0NDeUFJS0FMZ0FTQUlLQUxrQVJDcENTQUlJQmcyQXVnQklBZ2dJRFlDNUFFZ0NDQWZOZ0xnQVNBSUlBRW9BcndCUVFGck5nS2tBaUFCUWNnRWFpSUZJQUZCeUFGcVFURDhDZ0FBSUFoQmtBRnFJZ1lRNmdjZ0JpQUZRVEQ4Q2dBQUlBRkIyQVJxSWdNZ0FVSEFBV29vQWdBMkFnQWdBVUhRQkdvaUJDQUJRYmdCYWlrREFEY0RBQ0FCSUFFcEE3QUJOd1BJQkNBSVFZUUNhaENTQkNBSVFaUUNhaUFES0FJQU5nSUFJQWhCakFKcUlnTWdCQ2tEQURjQ0FDQUlJQUVwQThnRU53S0VBaUFGSUFaQnhkakpBRUVIRU04QklBRWdBU2dDeUFSQm40Q0FnSGhHT2dEZkF5QUZFTXNJSUFGQkFEWUM3QU1nQVVLQWdJQ0F3QUEzQXVRRElBRkJBRG9BNEFNZ0FVRUFOZ0w4QXlBQlFvQ0FnSUNBQVRjQzlBTWdBVUVBT2dEd0F5QURLQUlBSVFNZ0NDZ0NpQUloQkNBSUtBS0VBaUVHSUFFZ0NEWUN0QWNnQVNBRFFRQWdCaHMyQXJBSElBRWdCRFlDckFjZ0FTQUdOZ0tvQnlBQlFRQTJBcVFISUFFZ0JrRUFSeUlETmdLZ0J5QUJJQVEyQXB3SElBRWdCallDbUFjZ0FVRUFOZ0tVQnlBQklBTTJBcEFISUFFZ0FVSGdBMm8yQXNRSElBRWdBVUh3QTJvMkFzQUhJQUVnQVVIZkEybzJBcndISUFFZ0FVR2NBV28yQXJnSElBRkJnQWxxSWdNZ0FVR1FCMm9pQlJBcUFrQUNRQUpBQWtBZ0FTZ0NpQWxCREVjRVFFSFFBQ0VISUFGQlFHdEJCRUVJUWRBQVFmajR6UUFRbWdVZ0FTZ0NRQ0VFSUFFb0FrUWlCaUFEUWRBQS9Bb0FBRUVCSVFNZ0FVRUJOZ0xJQXlBQklBWTJBc1FESUFFZ0JEWUN3QU1nQVVId0Iyb2dCVUU0L0FvQUFBTkFJQUZCeUFScUlBRkI4QWRxRUNvZ0FTZ0MwQVJCREVZTkFpQUJLQUxBQXlBRFJnUkFJQUZCd0FOcVFRRVF6QWNnQVNnQ3hBTWhCZ3NnQmlBSGFpQUJRY2dFYWtIUUFQd0tBQUFnQVNBRFFRRnFJZ00yQXNnRElBZEIwQUJxSVFjTUFBc0FDeUFCUVFBMkF0Z0lJQUZDZ0lDQWdJQUJOd1BRQ0F3QkN5QUJRY2dFYWhDeUNDQUJRZGdJYWlBQlFjZ0RhaWdDQUNJSk5nSUFJQUVnQVNrQ3dBTTNBOUFJSUFrTkFRc2dBVUVBTmdMUUJDQUJRUUEyQXNnRUlBRkIwQWhxRUxNSURBRUxBa0FnQ1VFQlJnMEFJQUVvQXRRSUlRWWdDVUVWVHdSQUl3QkJnQ0JySWdVa0FBSkFRYUNOQmlBSklBbEJvSTBHVHhzaUJDQUpJQWxCQVhacklnTWdBeUFFU1JzaUEwRTBUd1JBSUFVZ0F4REFCaUFHSUFrZ0JTZ0NCQ0FGS0FJSUlnTkIwQUJzYWlBRktBSUFJQU5ySUFsQndRQkpFRFFnQlJDekNBd0JDeUFHSUFrZ0JVRXpJQWxCd1FCSkVEUUxJQVZCZ0NCcUpBQU1BUXNnQ1VIUUFHd2hCRUhRQUNFREEwQWdBeUFFUmcwQklBWWdBeUFHYWhDdUFpQURRZEFBYWlFRERBQUxBQXNnQVVISUJHb2dBVUhRQ0dvUVNBc2dDRUdZQW1vaUVSQ1RCQ0FJUWFBQ2FpQUJRZEFFYWlnQ0FEWUNBQ0FJSUFFcEFzZ0VOd0tZQWlBQktBTDBBeUVFSUFFZ0FTZ0MrQU1pQXlBQktBTDhBMEhRQUd3aUIyb2lFRFlDakFrZ0FTQUVOZ0tJQ1NBQklBTTJBb0FKSUFOQjBBQnFJUVlnQVVHQUJHcEJCSEloQ2dOQUFrQWdBU0FIQkg4Z0F5Z0NDQ0lFUVF4SERRRWdCZ1VnRUFzMkFvUUpJQUZCZ0FscUVMb0ZJQUVvQXV3RFFRTjBJUVlnQVVIUUJHb2hHaUFCUWN3RWFpRVlJQUZCbEFkcUlSSWdBVUdZQjJvaEZ5QUJRZmdIYWlFYklBRkJ5QVJxUVFSeUlSNGdBU2dDNUFNaENpQUJLQUxvQXlJSklRTURRQUpBSUFFQ2ZnSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFZRVFDQUJRY2dFYWlJRklBZ29BcGdDSUFnb0Fwd0NJQU1vQWdBaUh5QURMd0VFSWlBUTBRSWdBU2dDekFRaEJ5QUJLQUxJQkNJRVFaK0FnSUI0UncwUUlBVWdCeEQrQkNBQktBTE1CQ0VISUFFb0FzZ0VJZ1JCbjRDQWdIaEhEUkFnQVVHQUNXb2dCMEVJYWtIazFNa0FRUVlRendFQ1FDQUJLQUtBQ1VHZmdJQ0FlRWNFUUNBQlFZQUlhaUFCUVpBSmFpZ0NBRFlDQUNBYklBRkJpQWxxS1FJQU53TUFJQUVnQVNrQ2dBazNBL0FIREFFTElBRkI4QWRxSUFnb0FwZ0NJQWdvQXB3Q0lBRW9Bb1FKRUpvQ0N3SkFBa0FnQVNnQzhBZEJuNENBZ0hoSEJFQWdIaUFCS1FQd0J6Y0NBQ0FlUVJCcUlBRkJnQWhxS0FJQU5nSUFJQjVCQ0dvZ0d5a0RBRGNDQUF3QkN5QUJRY2dFYWlBQktBS0FDQ0lFS0FJQUlBUkJDR29wQXdBUXZBUWdBU2dDeUFSQkFYRkZEUUVMSUFFb0Fzd0VJUVFnQVNnQzBBUWhCeUFCS0FMVUJDRU1JQUVwQTlnRURCSUxJQUVvQXRRRUlRNGdBU2dDMEFRaEVTQUlLQUtZQWlJTUlBZ29BcHdDSWhBZ0h5QWdFUFVDSVFRZ0FTQWdPd0hRQkNBQklCODJBc3dFSUFGQmtvQ0FnSGcyQXNnRUlBRkJnQWxxSUFRZ0FVSElCR29ReHdVZ0FTZ0NoQWtoQndKQUFrQUNRQUovSUFFb0FvQUpJZ1JCbjRDQWdIaEhCRUFnQVNnQ2tBa2hEQ0FCTHdHTUNTRVRJQUVvQW9nSklSVWdBUzhCamdrTUFRc2dBVUhJQkdvaUJTQU1JQkFnQnhDYUFpQUJMd0hVQkNFVElBRW9BdEFFSVJVZ0FTZ0N6QVFoQnlBQktBTElCQ0lFUVorQWdJQjRSZ1JBSUF3RVFDQUZJQXdnRUNBVklCOGdCMEVCY1NJRUd5QVRJQ0FnQkJzUTRRSWdBU2dDeUFSQkFVY05Bd3RCL0pqSkFCQzdDUUFMSUFFb0F0Z0VJUXdnQVM4QjFnUUxJUVVnQVNBTU5nS0FDQ0FCSUFVN0FmNEhJQUVnRXpzQi9BY2dBU0FWTmdMNEJ5QUJJQWMyQXZRSElBRWdCRFlDOEFjTUFRc2dBVUh3QjJvZ0FTZ0N6QVFnQVNnQzFBUkJ5QUJzYWtIWUFHb1EvZ1FnQVNnQzlBY2hCeUFCS0FMd0J5SUVRWitBZ0lCNFJnMEJDeUFYSUJzcEFnQTNBZ0FnRjBFSWFpQWJRUWhxS0FJQU5nSUFJQUVnQnpZQ2xBY2dBU0FFTmdLUUJ3d1RDeUFIS0FJRUlRVWdCeWdDQUNBWVFlVFl5UUJCRmhDckJDQUJRWXVBZ0lCNE5nTElCRVVFUUNBWElCb3BBZ0EzQWdBZ0YwRUlhaUFhUVFocUtBSUFOZ0lBSUFFZ0FTZ0N6QVEyQXBRSERCQUxJQUZCeUFScUVNMENJQTVCQUVnTkFTQU9CRUFnR0JDdEJDQVhJQm9wQWdBM0FnQWdGMEVJYWlBYVFRaHFLQUlBTmdJQUlBRkJsWUNBZ0hnMkFwQUhJQUVnQVNnQ3pBUTJBcFFIREJNTElBVWdFV29pQkNBSUtBSzBBazBFUUNBRUlBVkpEUU1nQVVISUJHb2lCQ0FJS0FLd0FpQUZhaUFSRUtzRUlBY2dCQkRmQmlBQlFaK0FnSUI0TmdLUUJ3d1RDeUFTUVl6WnlRQkJJaENyQkF3UEN5QUpJQW9RcWdrZ0FVSElCR29pQXlBSVFiQUMvQW9BQUNBREVOWUdSUVJBSUFGQmtJQ0FnSGcyQXNBRElBRkJ3QU5xRU1zSURBNExJQUZCZ0FscUlBRkJ5QVJxRUIwZ0FVSDRCMm9pQkNBQlFZd0phaWtDQURjREFDQUJRWUFJYWlJRElBRkJsQWxxS0FJQU5nSUFJQUVnQVNrQ2hBazNBL0FISUFFb0FvQUpJZ1ZCQWtZRVFDQUJRY2dEYWlBRUtRTUFOd01BSUFGQjBBTnFJQU1vQWdBMkFnQWdBU0FCS1FQd0J5SW9Od1BBQXlBQlFjQURhaERMQ0NBb3AwR2ZnSUNBZUVjTkRnd0xDeUFCUWFnSGFpQUJRWmdKYWtISUFQd0tBQUFnQVVHa0Iyb2dBVUdBQ0dvb0FnQTJBZ0FnQVVHY0Iyb2dBVUg0QjJvcEF3QTNBZ0FnQVNBRk5nS1FCeUFCSUFFcEEvQUhOd0tVQnlBQlFZQUphaUFCS1FPZ0J5SXBFQlVnQVNnQ2hBa2hFaUFCS0FLQUNTSVJRWUNBZ0lCNFJnUkFJQUVnRWpZQ3hBTWdBVUdIZ0lDQWVEWUN3QU1NQ1FzZ0FTZ0NpQWtoRGlBcFFnSjlJaWhDQTFvRVFFR1ZnTVFBSVFZZ0tVSUZmVUlDV2cwSElBRkJPR29nQVNnQ3RBY2lCaUFCS0FLNEJ5SUVRUUJCZ01MSkFCQ2dCeUFCS0FJOElnTkJIMDBOQXlBQktBSTRJUVVnQVVFd2FpQUdJQVJCSUVHZ3dza0FFS0FISUFFb0FqUWlBMEVIVFEwRUlBRW9BakFoQmlBQlFTaHFRZjhBSUE0Z0RrSC9BRThiSWdSQkNHcEJ3TUxKQUJDZkJTQUJRUUEyQXZnSElBRWdBU2tES0RjQzhBY2dBVUh3QjJvaUF5QVNJQVFRbHdrZ0F5QUdJQVpCQ0dvUXlBWWdBVUdBQ1dvZ0tTQVNJQVFnQmlBQktBTE1CeUFCS0FMUUJ4QWtJQUVvQW9RSklRWWdBU2dDZ0FraUJFR0FnSUNBZUVjRVFDQUdJQUVvQW9nSklBVVFoQWtoQXlBRUlBWVFxUWxCa29ERUFFR1lnTVFBSUFNYklRWUxJQUVvQXZBSElBRW9BdlFIRUtrSkRBY0xJQUZCaUFocVFRQkJ3UUQ4Q3dBZ0FVSDRCMnBCMkxESkFDa0RBRGNEQUNBQlFnQTNBNEFJSUFGQjBMREpBQ2tEQURjRDhBY2dBVUh3QjJvaUJDQVNRU0FnRGlBT1FTQlBHeUlERUowQ0lBUkIrcjNKQUVFZ0lBTnJFSjBDSUFGQmdBbHFJZ01nQkVIZ0FQd0tBQUFnQVVIUUNHb2dBeEMzQVVFRklRd2dLVUlEV1FSQVFUSWhBd05BSUFNRVFDQUJRWWdKYWlBQlFkZ0lhaWtBQURjREFDQUJJQUVwQU5BSU53T0FDU0FEUVFGcklRTWdBVUhRQ0dvZ0FVR0FDV29Rc2dRTUFRc0xRWXVBeEFBaEJpQUJLQUtVQjBFRGRrRUZJQVZCQVhFYklneEJFRXNOQmdzZ0FTZ0N0QWNoQXlBQlFTQnFJQUVvQXJnSElnWkJsTmJTQUJDZkJTQUJLQUlnSVFjZ0FTZ0NKQ0VFSUFZRVFDQUVJQU1nQnZ3S0FBQUxJQ2xDQTFNTkJDQUJRZVFJYWlBTVFhREJ5UUFRNWdRZ0FVRVRPZ0R5Q0NBQlFZQUNPd0h3Q0FOQUlBRkJHR29nQVVId0NHb1FoUVVDUUNBQkxRQVlCRUFnQVMwQUdTRUpJQUVvQXV3SUloQWdEQ0FNSUJCTEd5RUZRUUFoQXlBQktBTG9DQ0VLQTBBZ0F5QUZSZzBDSUFNZ0Ntb2dBVUhRQ0dvZ0Eyb3RBQUFnQ1hNNkFBQWdBMEVCYWlFRERBQUxBQXNnQVNnQzVBZ2dBU2dDNkFnUXFRa01CZ3NnQVVHQUNXb2lBeUFLSUJBUTFRSWdBVUgwQ0dvZ0F5QUVJQVlROFFRZ0J5QUVFS2tKSUFFb0F2d0lJUVlnQVNnQytBZ2hCQ0FCS0FMMENDRUhEQUFMQUFzZ0VrR3UyY2tBUVJjUXF3UU1EUXNnQlNBRVFmell5UUFRdHdrQUMwRWdJQU5Ca01MSkFCQzRDUUFMUVFnZ0EwR3d3c2tBRUxnSkFBc2dBVUdBQ1dvaUF5QUJRZEFJYWlBTUVOVUNJQUZCOUFocUlBTWdCQ0FHRVBFRUlBY2dCQkNwQ1NBQktBTDBDQ0FCUVpBSGFpQUJRY2dFYWlBQktBTDRDQ0lESUFFb0F2d0lFRW9oQmlBREVLa0pJQUVwQTZBSElpbENBbjBoS0FzZ0tFSURXZzBBSUFGQmtBZHFJQUZCeUFScUlCSWdEaEJLSVFNTUFRdEJsWURFQUNFRElDbENCWDFDQWxvTkFDQUJRUkJxSUFFb0Fzd0hJZ2tnQVNnQzBBY2lCVUVBUWJEQnlRQVFvQWNnQVNnQ0ZDSURRUjlORFFRZ0FTZ0NFQ0VFSUFGQkNHb2dDU0FGUVNCQjBNSEpBQkNnQnlBQktBSU1JZ05CQjAwTkJTQUJLQUlJSVFrZ0FVSC9BQ0FPSUE1Qi93QlBHeUlGUVFocVFmREJ5UUFRbndVZ0FVRUFOZ0w0QnlBQklBRXBBd0EzQXZBSElBRkI4QWRxSWdNZ0VpQUZFSmNKSUFNZ0NTQUpRUWhxRU1nR0lBRkJnQWxxSUNrZ0VpQUZJQWxCQUNBQkVDUWdBU2dDaEFraEF5QUJLQUtBQ1NJRlFZQ0FnSUI0UndSQUlBTWdBU2dDaUFrZ0JCQ0VDU0VFSUFVZ0F4Q3BDVUdTZ01RQVFaaUF4QUFnQkJzaEF3c2dBU2dDOEFjZ0FTZ0M5QWNRcVFrTElBWkJtSURFQUVZZ0EwR1lnTVFBUm5JTkFTQUJJQU0yQXNRRElBRkJoNENBZ0hnMkFzQURJQkVnRWhDcENRc2dBVUdRQjJvUXpRWWdBVUhBQTJvUXl3Z01CQXNnQVVHZmdJQ0FlRFlDd0FNZ0VTQVNFS2tKSUFGQmtBZHFFTTBHSUFGQndBTnFFTXNJQ3lBQlFZQUphaUFCUWNnRWFpSUVFUGtCSUFFb0FvQUpJZ05CbjRDQWdIaEdEUUlnRHlBQktRS0VDVGNDQ0NBUFFSQnFJQUZCakFscUtRSUFOd0lBSUE5QkF6WUNBQ0FQSUFNMkFnUWdBU2dDcUFZZ0FTZ0NyQVlRcVFrZ0FTZ0N0QVlnQVNnQ3VBWVFxUWtnQVVIWUJXb1E2Z2NnQVVITUJtb1FrZ1FnQVVIZ0Jtb1Frd1FnQVNnQ3dBWWdBU2dDeEFZUXdRa2dBVUdJQm1vUXVnSWdCQkMvQkNBQktBTDRBU0FCS0FMOEFSRGxCUXdOQzBFZ0lBTkJ3TUhKQUJDNENRQUxRUWdnQTBIZ3dja0FFTGdKQUFzZ0R5QUJRY2dFYWtHd0F2d0tBQUFnQVNnQytBRWdBU2dDL0FFUTVRVU1DZ3NnQVVHTGdJQ0FlRFlDa0FjTUFnc2dBU2dDMEFRaERDQUJLUUxVQkFzM0Fwd0hJQUVnQkRZQ2tBY2dBU0FIclNBTXJVSWdob1EzQXBRSEN5QURRUWhxSVFNZ0JrRUlheUVHSUFGQmtBZHFFTXNJREFBTEFBc2dBU0FFTmdLQUJDQURLQUlBSVFrZ0F5OEJCQ0VGSUFvZ0EwRU1ha0hFQVB3S0FBQWdBMEhRQUdvaEF5QUJRY2dFYWlJRUlCRWdDU0FGRVBrQ0lBWkIwQUJxSVFZZ0IwSFFBR3NoQnlBRUlBRkJnQVJxRURJTUFBc0FDeUFQSUFNMkFnZ2dEMEtEZ0lDQWdJT0FnSUIvTndNQUlBOGdBU2tEb0FFM0Fnd2dEMEVVYWlBQlFhZ0JhaWdDQURZQ0FBc2dIeUFnRUtrSkN5QUlLQUxnQVNBSUtBTGtBUkNwQ1NBSUtBTHNBU0FJS0FMd0FSQ3BDU0FJUVpBQmFoRHFCeUFJUVlRQ2FoQ1NCQ0FJUVpnQ2FoQ1RCQ0FJS0FMNEFTQUlLQUw4QVJEQkNTQUlRY0FCYWhDNkFpQUlFTDhFQ3lBQlFZQUxhaVFBSUFJb0F1UURJUWtnQWlnQzRBTWhGU0FDS0FMY0F5RUhJQUlvQXRnRElSTWdBaWdDMUFNaEF5QUNLQUxRQXlJRlFRTkdEUVFnQWtHNEFXb2dBa0hvQTJwQm1BTDhDZ0FBSUFJZ0NUWUN0QUVnQWlBVk5nS3dBU0FDSUFjMkFxd0JJQUlnRXpZQ3FBRWdBaUFETmdLa0FTQUNJQVUyQXFBQkFrQWdBa0dnQVdvaUF4RFdCa1VOQUNBSUlBTVErUUVnQWlnQ2dBWWlBMEdmZ0lDQWVFWU5BQ0FDS0FLUUJpRUpJQUlvQW93R0lSVWdBaWdDaUFZaEJ5QUNLQUtFQmlFVERBUUxJQUpCb0FGcUVOWUdHaUFDUVlBR2FoQ05CU0FDUWRBRGFpSURJQUpCc0FKcVFjQ2F5UUJCQkJEUEFTQUNRYmdJYWlBREVPQUZBa0FnQWlnQ3VBaEJuNENBZ0hoSEJFQWdBa0hnQTJvZ0FrSElDR29vQWdBMkFnQWdBa0hZQTJvZ0FrSEFDR29wQWdBM0F3QWdBaUFDS1FLNENEY0QwQU1NQVFzZ0FrSFFBMm9nQWlnQ3VBTWdBaWdDdkFNZ0FpZ0N2QWdnQWk4QndBZ1FwQVFMQWtBZ0FpZ0MwQU5CbjRDQWdIaEhCRUFnQWtISUNHb2dBa0hnQTJvb0FnQTJBZ0FnQWtIQUNHb2dBa0hZQTJvcEF3QTNBd0FnQWlBQ0tRUFFBemNEdUFnTUFRc2dBa0c0Q0dvZ0FpZ0MxQU5CL0pySkFFRUZFTThCQ3lBQ1FkQURhaUFDUWJnSWFoRGdCU0FDS0FMUUEwR2ZnSUNBZUVjRWYwRUVCU0FDUVRocUlBSW9BcmdESUFJb0Fyd0RJQUlvQXRRRElBSXZBZGdERU5rQklBSW9BandoQlNBQ0tBSTRJUTBnQWtFd2FrRWdRUVJCQ0VIc21za0FFSm9GSUFJb0FqQWhGaUFDS0FJMEN5RUdJQUlvQXNBRElRUWdBa0hRQTJvaUF4RExDQ0FDUVFBMkF0UUlJQUlnQkRZQzBBZ2dBaUFGTmdMTUNDQUNJQTAyQXNnSUlBSkJBRFlDd0FnZ0FpQUdOZ0s4Q0NBQ0lCWTJBcmdJSUFJZ0FrR2dBV28yQXNRSUlBTWdBa0c0Q0dvaUF4QjFJQUlvQXRBRFFRRkdCRUFnQWtHSUNXb2dBeENvQXlBQ1FTaHFRUVFnQWlnQ2lBbEJBV29pQTBGL0lBTWJJZ01nQTBFRVRSdEJCRUVNUWZqNHpRQVFtZ1VnQWtIY0Eyb29BZ0FoQkNBQ0tBSW9JUU1nQWlnQ0xDSUtJQUlwQXRRRE53SUFJQXBCQ0dvZ0JEWUNBQ0FDUVFFMkF2QUlJQUlnQ2pZQzdBZ2dBaUFETmdMb0NDQUNRZWdEYWlBQ1FkQUlhaWtDQURjREFDQUNRZUFEYWlBQ1FjZ0lhaWtDQURjREFDQUNRZGdEYWlBQ1FjQUlhaWtDQURjREFDQUNJQUlwQXJnSU53UFFBeUFDUVl3SmFpRUdRUUFoQlVFQklRTURRQ0FDUVlnSmFpQUNRZEFEYWlJRUVIVWdBaWdDaUFsQkFVWUVRQ0FDS0FMb0NDQURSZ1JBSUFKQjlBaHFJQVFRcUFNZ0FrSG9DR29nQXlBQ0tBTDBDRUVCYWlJRVFYOGdCQnRCQkVFTUVPRUZJQUlvQXV3SUlRb0xJQVVnQ21vaUJFRVVhaUFHUVFocUtBSUFOZ0lBSUFSQkRHb2dCaWtDQURjQ0FDQUNJQU5CQVdvaUF6WUM4QWdnQlVFTWFpRUZEQUVMQ3lBQ0tBTFFBeUFDS0FMVUF4Q21DU0FDS0FMb0NDRVRJQU5CQVVZTkFpQURRUlZQQkVBakFFR1FJR3NpRFNRQUFrQkJxdGdvSUFNZ0EwR3EyQ2hQR3lJR0lBTWdBMEVCZG1zaUJDQUVJQVpKR3lJRVFkWUNUd1JBSUExQkNHb2dCRUVFUVF4QnZLRFNBQkNhQlNBS0lBTWdEU2dDRENJR0lBMG9BZ2dpQkNBRFFjRUFTUkE0SUFRZ0JoQ25DUXdCQ3lBS0lBTWdEVUVRYWtIVkFpQURRY0VBU1JBNEN5QU5RWkFnYWlRQURBTUxJQXBCREdvaEZnTkFJQVZGRFFNZ0NpQVdFTU1FSUFWQkRHc2hCU0FXUVF4cUlSWU1BQXNBQ3lBQ0tBSzRDQ0FDS0FLOENCQ21DVUVBUVFRUXB3bEJBQ0VKREFJTElBVWdBMEdJamNrQUVNd0lBQXNnQWtFZ2FoQ29CeUFDUWRBRGFpQUNLQUlnSWdsQkFCQ2JCaUFLSUFOQkRHeHFJUTRnQWlnQzFBTWhEU0FDS0FMUUF5RU1RUUloRmlBS0lRTURRQUpBQWtBQ1FBSkFBa0FDUUFKQUlCWkJBa1lFUUNBRElBNUdEUUlnQXlrQ0JDRW9JQU1vQWdBaEJTQURRUXhxSVFNTUFRc2dLeUVvSUFzaEJTQVdRUUZ4UlEwQkN3SkFJQU1nRGtZRVFFRUFJUllnQ3lFRUlBTWhCZ3dCQ3lBREtBSUFJUVFnQXlrQ0JDRXJRUUVoRmlBRklRc2dBMEVNYWlJR0lRTWdCQ0FGUmcwSEN5QW9RaUNJcHlFUklDaW5JUWNnREM4QmlnRkJDMDhOQVNBTUx3R0tBU0lEUVF0UERRSWdEQ0FEUVFGcU93R0tBU0FNSUFOQkFuUnFJQVUyQWx3Z0RDQURRUU4wYWlJRElCRTdBUVFnQXlBSE5nSUFEQVVMSUJNZ0NoQ25DU0FkSVFRZ0NTRU5BMEFnQkVVTkJ5QU5JZ012QVlvQklndEZEUVFnQkVFQmF5RUVJQU1nQzBFQmF5SUdRUUowYWlJUktBS1FBU0lOTHdHS0FTSUZRUVJMRFFCQkJTQUZhMEgvL3dOeEloSWdFU2dDakFFaUNDOEJpZ0VpQ2tzTkF5QUlJQW9nRW1zaUVEc0JpZ0VnRFVFRk93R0tBU0FTUVFKMElSZ2dEVUhjQUdvaERpQUZRUUowSWdzRVFDQU9JQmhxSUE0Z0Mvd0tBQUFMSUFWQkEzUWlDd1JBSUEwZ0VrRURkR29nRFNBTC9Bb0FBQXNnQ0VIY0FHb2lFeUFRUVFGcUlnVkJBblFpRldvZ0NpQUZheUlMSUE0Z0VrRUJheUlLRVBJR0lBZ2dCVUVEZEdvZ0N5QU5JQW9ROHdZZ0VTZ0NYQ0VGSUFnZ0VFRURkR29pQ3lnQ0FDRUhJQXN2QVFRaEN5QVJJQk1nRUVFQ2RHb29BZ0EyQWx3Z0F5QUdRUU4wYWlJREx3RUVJUVlnQXlBTE93RUVJQU1vQWdBaEN5QURJQWMyQWdBZ0RTQUtRUU4wYWlJRElBWTdBUVFnQXlBTE5nSUFJQTRnQ2tFQ2RHb2dCVFlDQUNBRVJRMEFJQTFCakFGcUlRVkJHQ0FZYXlJREJFQWdCU0FZYWlBRklBUDhDZ0FBQ3lBWUJFQWdCU0FJSUJWcVFZd0JhaUFZL0FvQUFBdEJBQ0VEQTBBZ0EwRUdSZzBCSUFVb0FnQWlDeUFET3dHSUFTQUxJQTAyQWxnZ0JVRUVhaUVGSUFOQkFXb2hBd3dBQ3dBTEFBc0RRQUpBSUF3b0FsZ2lERVVFUUNBQ1FSaHFJQWtnSFJDdUF5QUNLQUlZSWdraERDQUNLQUljSWgwaERRd0JDeUFOUVFGcUlRMGdEQzhCaWdGQkNrc05BUXNMSUExQkFXc2hGU0FDUVJCcUVLZ0hRUUFoRUVFQklRTWdBaWdDRUNFTEEwQWdBeUFOUmdSQUFrQWdFQ0FWUmdSQUlBd3ZBWW9CSWdOQkMwOE5BU0FNSUFOQkFXb2lFRHNCaWdFZ0RDQURRUUowYWlBRk5nSmNJQXdnQTBFRGRHb2lBeUFST3dFRUlBTWdCellDQUNBTUlCQkJBblJxSUFzMkFvd0JJQXNnRURzQmlBRWdDeUFNTmdKWUlBSkIwQU5xSUF3Z0RSQ2JCaUFDS0FMVUF5RU5JQUlvQXRBRElRd01Cd3RCakpESkFFRXdRYnlReVFBUW5BWUFDMEhjajhrQVFTQkJ6SkRKQUJDY0JnQUZJQUpCQ0dvZ0N5QVFFSzRESUFOQkFXb2hBeUFDS0FJTUlSQWdBaWdDQ0NFTERBRUxBQXNBQzBIY2o4a0FRU0JCL0kvSkFCQ2NCZ0FMUVlpVXlRQkJKMEd3bE1rQUVKd0dBQXRCeG83SkFFRVpRYnlQeVFBUW5BWUFDeUFuUVFGcUlTY2dCQ0VMSUFZaEF3d0FDd0FMSUFKQjhBQnFJUkFnQWlBZE5nTHNBeUFDSUFrMkF1Z0RJQUpCQURZQzVBTWdBaUFkTmdMY0F5QUNJQWsyQXRnRElBSkJBRFlDMUFNZ0FpQW5RUUFnQ1JzMkF2QURJQUlnQ1VFQVJ5SUROZ0xnQXlBQ0lBTTJBdEFEQTBBQ1FDQUNRYmdJYWlBQ1FkQURhaENqQVFKL0FrQWdBaWdDdUFnaUF3UkFJQUpCaUFscUlnc2dBaWdDdUFNZ0FpZ0N2QU1nQXlBQ0tBTEFDRUVEZEdvaUF5Z0NBQ0lOSUFNdkFRUWlCaERSQWlBQ0tBS0lDVUdmZ0lDQWVFWUVRQ0FMSUFJb0Fvd0pFTmtFSUFJb0FvZ0pRWitBZ0lCNFJnUkFJQUlvQW93SklnVWhBd0pBQTBBZ0FpZ0N1QU1nQWlnQ3ZBTWdBMEdnMXNvQVFRa1F2Z1VpQ3cwQklBSkJ1QWhxSUFOQnRPREtBRUVHRU04QkFrQWdBaWdDdUFoQm40Q0FnSGhIQkVBZ0FrR1lDV29nQWtISUNHb29BZ0EyQWdBZ0FrR1FDV29nQWtIQUNHb3BBZ0EzQXdBZ0FpQUNLUUs0Q0RjRGlBa01BUXNnQWtHSUNXb2dBaWdDdkFnUXhBUUxBa0FnQWlnQ2lBbEJuNENBZ0hoSEJFQWdBa0hJQ0dvZ0FrR1lDV29vQWdBMkFnQWdBa0hBQ0dvZ0FrR1FDV29wQXdBM0F3QWdBaUFDS1FPSUNUY0R1QWdNQVFzZ0FrRzRDR29nQWlnQ3VBTWdBaWdDdkFNZ0FpZ0NqQWtnQWk4QmtBa1FwQVFMSUFKQnVBaHFFSWNJSWdNTkFBc2dBa0dBQm1vaEN3c2dBa0c0Q0dvaUJDQUNRYUFCYWlJRElBVVE4d0VnQWlnQ3VBZ2lIVUdBZ0lDQWVFY0VRQ0FDS0FLOENDSVNJQUlvQXNBSUlncEJBRUgwNE1vQUVONEhHaUFTSUFwQkFVR0U0Y29BRU40SEt3TUFJUzhnRWlBS1FRSkJsT0hLQUJEZUJ4b2dFaUFLUVFOQnBPSEtBQkRlQnlzREFDRXdJQVFnQXlBRlFiVGh5Z0JCQmhDL0JTQUNLQUs0Q0NJRFFZQ0FnSUI0UndSQUlBSW9BcndJSWdVZ0FpZ0N3QWdpQkVFQVFiemh5Z0FRM2djYUlBVWdCRUVCUWN6aHlnQVEzZ2NhSUFVZ0JFRUNRZHpoeWdBUTNnY2FJQVVnQkVFRFFlemh5Z0FRM2djYUlBTWdCUkNvQ1FzZ0VFSUFOd01BSUJCQkNHcENBRGNEQUNBQ1FvQ0FnSUNBZ0lENFB6Y0RhQ0FDUWdBM0E0Z0JJQUpDZ0lDQWdJQ0FnUGkvZnpjRGdBRWdBaUF3SUMraE9RT1FBU0FDS0FLNEF5RU9JQUlvQXJ3RElSRWdBa0VBTmdMa0NDQUNRb0NBZ0lBUU53TGNDQ0FDUVFBMkF2QUlJQUpDZ0lDQWdNQUFOd0xvQ0NBQ1FmUUlhaUFPSUJFZ0RTQUdFS1FFUVFRaEJFRUFJUXBCQUNBQ0tBTDBDRUdmZ0lDQWVFY05CUm9nQWtHSUNXb2dBaWdDK0FoQnhKckpBRUVJRU04QklBSW9Bb2dKUVorQWdJQjRSdzBFSUFJb0Fvd0pJZ01vQWdBaEJVR0FBU0VFQTBBQ1FBSkFJQVZCQ0dzT0JBQUhCd0VIQ3lBRFFReHFLQUlBUWNnQWJDRUZJQU5CQ0dvb0FnQWhBd05BSUFWRkRRY2dBa0c0Q0dvZ0F4REVCQ0FDS0FLNENFR2ZnSUNBZUVZRVFDQUNRZWdJYWlBQ0tBSzhDQ0FDTHdIQUNFSE1tc2tBRUtVR0N5QURRY2dBYWlFRElBVkJ5QUJySVFVZ0FrRzRDR29ReXdnTUFBc0FDd0pBSUE0Z0VTQURLQUlFSWcwZ0EwRUlhaThCQUNJR0VQVUNJZ01FUUNBREtBSUFJZ1ZCQW10QkNra05BUXNnQWtIb0NHb2dEU0FHUWR5YXlRQVFwUVlNQmdzZ0JFRUJheUlFRFFBTERBUUxRZHpneWdCQkNFSGs0TW9BRVAwRUFBc2dBa0hJQ0dvZ0FrR1lDV29vQWdBMkFnQWdBa0hBQ0dvZ0FrR1FDV29wQWdBM0F3QWdBaUFDS1FLSUNUY0R1QWhCZ00vU0FFRXJJQUpCdUFocVFjQ0h5Z0JCek9ES0FCQ01CQUFMSUFKQnlBaHFJQUpCbUFscUtBSUFOZ0lBSUFKQndBaHFJQUpCa0FscUtRSUFOd01BSUFJZ0Fpa0NpQWszQTdnSVFZRFAwZ0JCS3lBQ1FiZ0lha0hBaDhvQVFiemd5Z0FRakFRQUMwR2hnSUNBZUNFRERBSUxJQUpCaUFscUVNc0lJQUlvQXV3SUlRUWdBaWdDNkFnaENpQUNLQUx3Q0F0QkEzUWhCU0FDUWZRSWFoRExDQ0FFSVFNRFFBSkFJQVVFUUNBQ1FiZ0lhaUFPSUJFZ0F5Z0NBQ0FETHdFRUVORUNBa0FnQWlnQ3VBaEJuNENBZ0hoSEJFQWdBa0dZQ1dvZ0FrSElDR29vQWdBMkFnQWdBa0dRQ1dvZ0FrSEFDR29wQWdBM0F3QWdBaUFDS1FLNENEY0RpQWtNQVFzZ0FrR0lDV29nQWlnQ3ZBZ1EvZ1FMSUFJb0FvZ0pRWitBZ0lCNFJ3UkFJQUpCaUFscUVNMENEQUlMSUFKQnVBaHFJQUlvQW93SklnWVFHQ0FDS0FLNENFR2ZnSUNBZUVZRVFDQUNLQUs4Q0NBQ1Fkd0lhaUFDS0FMQUNDSUdJQUlvQXNRSUVKY0pJQVlRcVFrTUFnc2dBa0hjQ0dvZ0JpZ0NQQ0FHS0FKQUVKY0pJQUpCdUFocUVNMENEQUVMSUFRZ0NoQ3FDU0FDUVpBSmFpQUNRZVFJYWlnQ0FEWUNBQ0FDSUFJcEF0d0lOd09JQ1NBQ1FiZ0lhaUFDUWFBQmFpQUNRWWdKYWlBTElDOGdNQ0FDUWRnQWFoQU1RYUdBZ0lCNElRTWdBaWdDdUFnaUMwR2hnSUNBZUVjRVFDQUNLQUxJQ0NFSklBSW9Bc1FJSVJVZ0FpZ0N3QWdoQnlBQ0tBSzhDQ0VUSUFzaEF3c2dIU0FTRUtnSklBTkJvWUNBZ0hoR0RRTU1BZ3NnQTBFSWFpRURJQVZCQ0dzaEJRd0FDd0FMQ3lBQ1FkQURhaEMwQnlBQ1FZQUdhaERxQnlBRFFhR0FnSUI0UncwQUlBSkJvQUZxRUtJRElBSW9Ba3doRXlBQ0tBSlFJUWNnQWlnQ1ZDRVZEQUlMSUFKQm9BRnFFS0lEQ3lBQ0tBSk1JQUlvQWxBUTlRa2dBMEdoZ0lDQWVFWU5BQ0FDSUFrMkF1QURJQUlnRlRZQzNBTWdBaUFITmdMWUF5QUNJQk0yQXRRRElBSWdBellDMEFNZ0FrRUFOZ0tvQVNBQ1FvQ0FnSUFRTndLZ0FRSkFBa0FDUUFKQVFRSWdBMEhoLy8vL0Iyb2lBeUFEUVFKUEcwRUJhdzRDQWdBQkN5QUNJQUpCMEFOcU5nSzRDQ0FDUVFFMkFvUUdJQUpCMEl2S0FEWUNnQVlnQWtJQk53S01CaUFDUVFJMkFsd2dBaUFDUWRnQWFqWUNpQVlnQWlBQ1FiZ0lhallDV0NBQ1FhQUJhaUFDUVlBR2FoRE5DQTBFREFJTElBSWdBa0hRQTJvMkFyZ0lJQUpCQVRZQ2hBWWdBa0dvaThvQU5nS0FCaUFDUWdFM0Fvd0dJQUpCQXpZQ1hDQUNJQUpCMkFCcU5nS0lCaUFDSUFKQnVBaHFOZ0pZSUFKQm9BRnFJQUpCZ0FacUVNMElSUTBCREFNTElBSWdBa0hVQTJvMkFyZ0lJQUpCQVRZQ2hBWWdBa0c4aThvQU5nS0FCaUFDUWdFM0Fvd0dJQUpCQkRZQ1hDQUNJQUpCMkFCcU5nS0lCaUFDSUFKQnVBaHFOZ0pZSUFKQm9BRnFJQUpCZ0FacUVNMElEUUlMSUFJb0FxQUJJQUlvQXFRQklnTWdBaWdDcUFFUUJTRUFFSndCSWdjZ0FDWUJJQU1RcVFrQ1FBSkFBa0JCQWlBQ0tBTFFBeUlMUWVILy8vOEhhaUlESUFOQkFrOGJEZ0lDQVFBTEFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQkJBaUFMUVlDQWdJQjRjeUlESUFOQkgwOGJEaDRMQ3dFTEN3c0xDd0lEQkFVR0N3Y0xDd3NMQ3dzSUN3c0xDd3NKQ3dzQUN5QUNLQUxVQXlBQ0tBTFlBeENwQ1F3S0N5QUxJQUlvQXRRREVLa0pEQWtMSUFJb0F0UURJQUlvQXRnREVLa0pEQWdMSUFJb0F0UURJQUlvQXRnREVLa0pEQWNMSUFJb0F0UURJQUlvQXRnREVLa0pEQVlMSUFJb0F0UURJQUlvQXRnREVLa0pEQVVMSUFJb0F0UURJQUlvQXRnREVLa0pEQVFMSUFJdEFOUURJQUlvQXRnREVLY0ZEQU1MSUFJb0F0UURJQUlvQXRnREVLa0pEQUlMSUFJb0F0UURJQUlvQXRnREVLa0pEQUVMSUFJdEFOUURJQUlvQXRnREVLY0ZDMEdBZ0lDQWVDRVRDeUFtSUNRUXFRa2dJMEdFQVU4RVFDQWpFSXNGQ3lBWkFuOGdFMEdBZ0lDQWVFWUVRRUVBSVFWQkFDRVdRUUVNQVFzZ0FpQVZOZ0tJQmlBQ0lBYzJBb1FHSUFJZ0V6WUNnQVlnQWlBQ1FZQUdha0dFanNrQUVNVUVJQUlvQWdRaEZpQUNLQUlBSVFWQkFDRUhRUUFMTmdJTUlCa2dCellDQ0NBWklCWTJBZ1FnR1NBRk5nSUFJQUpCb0FscUpBQU1BUXRCd05MSkFFRTNJQUpCZ0FacVFaaUF3QUJCeE5QSkFCQ01CQUFMSUJrb0FnQWdHU2dDQkNBWktBSUlJQmtvQWd3Z0dVRVFhaVFBQ3pBQkFYOUJCRUdNQVJDZUNTSUJSUVJBQUFzZ0FVRUFPd0dLQVNBQlFRQTJBbGdnQUVFQU5nSUVJQUFnQVRZQ0FBc3pBQ0FCS0FJQUlBQW9BZ0F0QUFCQkFuUWlBRUc0MXRvQWFpZ0NBQ0FBUWFUVzJnQnFLQUlBSUFFb0FnUW9BZ3dSQWdBTEt3QWdBQ2dDQUNnQ0FDSUFLUU1BSUFCQkNHb3BBd0FnQVNnQ0FDQUNRUVIwYTBFUWF5Z0NBQkQvQXd2dUFRSUNmd0YrSXdCQkVHc2lBaVFBSUFKQkFUc0JEQ0FDSUFFMkFnZ2dBaUFBTmdJRUl3QkJFR3NpQVNRQUlBSkJCR29pQUNrQ0FDRUVJQUVnQURZQ0RDQUJJQVEzQWdRakFFRVFheUlBSkFBZ0FVRUVhaUlCS0FJQUlnSW9BZ3doQXdKQUFrQUNRQUpBSUFJb0FnUU9BZ0FCQWdzZ0F3MEJRUUVoQWtFQUlRTU1BZ3NnQXcwQUlBSW9BZ0FpQWlnQ0JDRURJQUlvQWdBaEFnd0JDeUFBUVlDQWdJQjROZ0lBSUFBZ0FUWUNEQ0FBUWZNQUlBRW9BZ2dpQUMwQUNDQUFMUUFKRU1JRUFBc2dBQ0FETmdJRUlBQWdBallDQUNBQVFmUUFJQUVvQWdnaUFDMEFDQ0FBTFFBSkVNSUVBQXNrQUNBQklBTkdCRUFnQVFSQUlBQWdBaUFCL0FvQUFBc1BDeUFCSUFNZ0JCQzhDUUFMTEFBZ0FDQUNRb0NCZ29TSWtLREFnSCtESWdKQ0FGSTJBZ0FnQUNBQ2VxZEJBM1lnQTJvZ0FYRTJBZ1FMS3dBZ0FDZ0NBQ2dDQUNJQUtRTUFJQUJCQ0dvcEF3QWdBU2dDQUNBQ1FRTjBhMEVJYXlrREFCQ0lCQXNuQUNBQklBTkdCRUFnQVFSQUlBQWdBaUFCL0FvQUFBc1BDeUFCSUFOQndNWEpBQkM4Q1FBTE13QWdBU2dDQUNBQUtBSUFMUUFBUVFKMElnQkIyTlhhQUdvb0FnQWdBRUhNMWRvQWFpZ0NBQ0FCS0FJRUtBSU1FUUlBQ3pNQUlBRW9BZ0FnQUNnQ0FDMEFBRUVDZENJQVFmalYyZ0JxS0FJQUlBQkI1TlhhQUdvb0FnQWdBU2dDQkNnQ0RCRUNBQXN5QUNBQUtBSVFJQUFvQWhRUXJ3a2dBQ2dDSENBQUtBSWdFSzhKSUFCQnlBQnFFSWdKSUFBb0FpZ2dBQ2dDTEJEcEJRc3JBQ0FBS0FJQUtBSUFJZ0FwQXdBZ0FFRUlhaWtEQUNBQktBSUFJQUpCQkhSclFSQnJLQUlBRUwwRUN5Z0JBWDhqQUVFUWF5SUJKQUFEUUNBQlFRUnFJQUFRb3dFZ0FTZ0NCQTBBQ3lBQlFSQnFKQUFMSndFQmZ5TUFRUkJySWdJa0FDQUNJQUUyQWd3Z0FDQUNRUXhxUVFRUW5RSWdBa0VRYWlRQUN5d0JBWDhnQVNnQ0JDSURJQUpKQkVBZ0FpQURRZFRUeVFBUXVBa0FDeUFBSUFFZ0FTZ0NBQ0FDRUlJREN5Y0JBWDhqQUVFUWF5SUNKQUFnQWlBQU5nSU1JQUVnQWtFTWFrRUVFTDhDSUFKQkVHb2tBQXNuQVFGL0l3QkJFR3NpQWlRQUlBSWdBVFlDRENBQUlBSkJER3BCQkJDL0FpQUNRUkJxSkFBTEtBQWpBRUdBQW1zaUFTUUFJQUVnQWlBREVOVUNJQUFnQVNBRUlBVVE4UVFnQVVHQUFtb2tBQXNyQVFGL0FrQWdBRUYvUmcwQUlBQWdBQ2dDQkVFQmF5SUJOZ0lFSUFFTkFDQUFRZEFDUVFnUTR3UUxDekFBSUFFb0FnQWdBQzBBQUVFQ2RDSUFRZlRYMmdCcUtBSUFJQUJCek5iYUFHb29BZ0FnQVNnQ0JDZ0NEQkVDQUFzbEFBSi9JQUFvQWdCQm40Q0FnSGhHQkVBZ0FDMEFCQXdCQ3lBQUVNMENRUUFMUVFGeEN5WUFJQUpCLy84RGNTSUNJQUZQQkVBZ0FpQUJRZXpTMmdBUXhnUUFDeUFBSUFKQkFuUnFDeWNBSUFJRVFFR0E0Tm9BTFFBQUdpQUNJQUVRb0FnaEFRc2dBQ0FDTmdJRUlBQWdBVFlDQUFzZUFRRi9RUUZCSUNBQVFRRnlaMnRCQVhZaUFYUWdBQ0FCZG1wQkFYWUxJd0VCZnlBQUtBSUFJZ0FnQUVFZmRTSUNjeUFDYXlBQVFYOXpRUjkySUFFUXlBRUxKZ0FnQVVFTFRRUkFJQUFnQVRZQ0JDQUFJQUkyQWdBUEN5QUJRUXRCc0pMSkFCQzRDUUFMSmdBZ0FVRUxUUVJBSUFBZ0FUWUNCQ0FBSUFJMkFnQVBDeUFCUVF0Qm9KTEpBQkM0Q1FBTEl3QWdBU0FEVFFSQUlBQWdBVFlDQkNBQUlBSTJBZ0FQQ3lBQklBTWdCQkM0Q1FBTExnQWdBU2dDQUVHRGxkSUFRZnpUMGdBZ0FDZ0NBQzBBQUNJQUcwRUZRUW9nQUJzZ0FTZ0NCQ2dDREJFQ0FBc2tBUUYvSUFBb0FnQWdBQ2dDQ0NJQ2F5QUJTUVJBSUFBZ0FpQUJRUUZCQVJEaEJRc0xMQUVCZjBFUVFRUVFud2dpQXlBQ05nSU1JQU1nQVRZQ0NDQURRZWlCd0FBMkFnUWdBeUFBTmdJQUlBTUxMQUVCZjBFUVFRUVFud2dpQXlBQ05nSU1JQU1nQVRZQ0NDQURRY2lJd0FBMkFnUWdBeUFBTmdJQUlBTUxMQUVCZjBFUVFRUVFud2dpQTBISWdzQUFOZ0lNSUFNZ0FqWUNDQ0FESUFFMkFnUWdBeUFBTmdJQUlBTUxLUUVCZjBFUVFRUVFud2dpQkNBRE5nSU1JQVFnQWpZQ0NDQUVJQUUyQWdRZ0JDQUFOZ0lBSUFRTEpBRUJmeUFBS0FJQUlBQW9BZ2dpQW1zZ0FVa0VRQ0FBSUFJZ0FVRUNRUUlRNHdVTEN5SUFJQUlnQTBrRVFDQURJQUlnQkJDNENRQUxJQUFnQXpZQ0JDQUFJQUUyQWdBTEpRRUJmeUFBS0FJQUlBQW9BZ2dpQW1zZ0FVa0VRQ0FBSUFJZ0FVRUlRZEFBRU9FRkN3c2tBUUYvSUFBb0FnQWdBQ2dDQ0NJQ2F5QUJTUVJBSUFBZ0FpQUJRUVJCREJEaEJRc0xKUUFnQWlBRFNRUkFJQU1nQWtIVTA4a0FFTGdKQUFzZ0FDQUROZ0lFSUFBZ0FUWUNBQXNpQUNBQklBTkxCRUFnQVNBRElBUVF1QWtBQ3lBQUlBRTJBZ1FnQUNBQ05nSUFDeDBBSUFBZ0Fra0VRQ0FCSUFCQkEzUnFEd3NnQUNBQ0lBTVF4Z1FBQ3lVQUlBRkJCVThFUUNBQlFRUkJyS0xTQUJDNENRQUxJQUFnQVRZQ0JDQUFJQUkyQWdBTEpRRUJmeUFBS0FJQUlnRWdBU2dDQUNJQlFRRnJOZ0lBSUFGQkFVWUVRQ0FBRUlNRUN3c2pBQ0FCQkVBZ0FDQUNOZ0lFSUFBZ0FUWUNBQThMUWZ6RHlnQkJJQ0FERVAwRUFBc21BUUYvQWtBZ0FFVU5BQ0FBSUFBb0FnQkJBV3NpQWpZQ0FDQUNEUUFnQUNBQkVKZ0VDd3NrQVFGL0lBQW9BZ0FnQUNnQ0NDSUNheUFCU1FSQUlBQWdBaUFCUVFoQkNCRGhCUXNMSmdFQmZ5QUFLQUlBSUFBb0FnZ2lBV3RCZ0FKSkJFQWdBQ0FCUVlBQ1FRSkJBaERoQlFzTExBQWdBU2dDQUVHQWdJQ0FlRWNFUUNBQUlBRW9BZ1FnQVNnQ0NCRDRCQThMSUFCQmdJQ0FnSGcyQWdBTEx3RUJmMEVRUVFRUW53Z2lBa0djdTlJQU5nSU1JQUlnQVRZQ0NDQUNRYlRFMGdBMkFnUWdBaUFBTmdJQUlBSUxMQUVCZjBFUVFRUVFud2dpQXlBQ05nSU1JQU1nQVRZQ0NDQURRZFRHMGdBMkFnUWdBeUFBTmdJQUlBTUxMd0VCZjBFUVFRUVFud2dpQWtIa3hOSUFOZ0lNSUFJZ0FUWUNDQ0FDUWRURzBnQTJBZ1FnQWlBQU5nSUFJQUlMTHdFQmYwRVFRUVFRbndnaUFrSFV4dElBTmdJTUlBSWdBVFlDQ0NBQ1FhVEcwZ0EyQWdRZ0FpQUFOZ0lBSUFJTExBRUJmMEVRUVFRUW53Z2lBMEhzeWRJQU5nSU1JQU1nQWpZQ0NDQURJQUUyQWdRZ0F5QUFOZ0lBSUFNTElnQWdBa0VIVHdSQUlBSkJCaUFERUxnSkFBc2dBQ0FDTmdJRUlBQWdBVFlDQUFzY0FDQUJJQUpOQkVBZ0FpQUJJQU1ReGdRQUN5QUFJQUpCQTNScUN5MEJBWDlCQ0VFRUVKOElJZ0pCeUlMQUFEWUNCQ0FDSUFFMkFnQWdBRUh3ajhBQU5nSUVJQUFnQWpZQ0FBc2NBQ0FCSUFKTkJFQWdBaUFCSUFNUXhnUUFDeUFBSUFKQktHeHFDeUlBSUFBb0FnQW9BZ0FvQWdBZ0FDZ0NCQ2dDQUNBQlFRUjBhMEVRYXlnQ0FFWUxJQUVDZmlBQUtRTUFJZ0lnQWtJL2h5SURoU0FEZlNBQ1FnQlpJQUVRdmdFTEpnQWdBRUtBZ0lDQUVEY0NBQ0FBSUFFb0FnUWdBU2dDQUdzZ0FTOEJDRUVBUjJvMkFnZ0xJZ0FnQUNnQ0FDZ0NBQ2tEQUNBQUtBSUVLQUlBSUFGQkEzUnJRUWhyS1FNQVVRc2RBQ0FCSUFKTkJFQWdBaUFCSUFNUXhnUUFDeUFBSUFKQnlBQnNhZ3NjQUNBQklBSk5CRUFnQWlBQklBTVF4Z1FBQ3lBQUlBSkJBWFJxQ3h3QUlBRWdBazBFUUNBQ0lBRWdBeERHQkFBTElBQWdBa0VDZEdvTEl3QWdBRUVBTmdJQUlBQWdBU2tBQURjQUJDQUFRUXhxSUFGQkNHb3BBQUEzQUFBTExRRUJmMEVJUVFRUW53Z2lBa0hzeWRJQU5nSUVJQUlnQVRZQ0FDQUFRZHpJMGdBMkFnUWdBQ0FDTmdJQUN5UUFJQUFvQWh3Z0FDZ0NJQkRCQ0NBQVFSQnFFUHNHSUFBb0FoQWdBQ2dDRkJEQUNRc2dBQ0FBS0FJQVFRVkdCRUFnQUNnQ0JDQUFLQUlJRVBZSkR3c2dBQkRxQkFzWkFRRi9JQUVnQTBZRWZ5QUFJQUlnQVJDd0JVVUZJQVFMQ3lRQkFYOUJCRUdNQVJDZUNTSUFSUVJBQUFzZ0FFRUFPd0dLQVNBQVFRQTJBbGdnQUFza0FRRi9RUVJCNUFFUW5na2lBRVVFUUFBTElBQkJBRHNCNGdFZ0FFRUFOZ0pZSUFBTEpRRUJmMEVJUWZnR0VKNEpJZ0JGQkVBQUN5QUFRUUE3QWZZR0lBQkJBRFlDOEFZZ0FBc2tBUUYvUVFSQmxBSVFuZ2tpQUVVRVFBQUxJQUJCQURzQjRnRWdBRUVBTmdKWUlBQUxKQUVCZjBFRVFid0JFSjRKSWdCRkJFQUFDeUFBUVFBN0FZb0JJQUJCQURZQ1dDQUFDeVVCQVg5QkNFR29CeENlQ1NJQVJRUkFBQXNnQUVFQU93SDJCaUFBUVFBMkF2QUdJQUFMR2dBZ0FDQUJJQUlnQXlBQlFRRnlaMEVCZEVFK2MwRUFFQ0FMR2dBZ0FDQUJJQUlnQXlBQlFRRnlaMEVCZEVFK2MwRUFFQjhMR2dBZ0FDQUJJQUlnQXlBQlFRRnlaMEVCZEVFK2MwRUFFQ0VMR2dBZ0FDQUJJQUlnQXlBQlFRRnlaMEVCZEVFK2MwRUFFQ0lMSHdBZ0FDQUNFS29DSUFCQk1Hb2dBa0V3YWhDcUFpQUNRUWdnQVJEYkFRc2ZBQ0FBSUFJUTNnSWdBRUVnYWlBQ1FTQnFFTjRDSUFKQkNDQUJFUG9CQ3hvQUlBQWdBU0FDSUFNZ0FVRUJjbWRCQVhSQlBuTkJBQkFqQ3g4QUlBQWdBaENBQXlBQVFTQnFJQUpCSUdvUWdBTWdBa0VJSUFFUWdRSUxHZ0FnQUNBQklBSWdBeUFCUVFGeVowRUJkRUUrYzBFQUVDWUxHZ0FnQUNBQklBSWdBeUFCUVFGeVowRUJkRUUrYzBFQUVDY0xJQUFnQUNnQ0FFRUZSZ1JBSUFBb0FnUWdBQ2dDQ0JEMkNROExJQUFRK2dRTEdRQWdBU0FDVFFSQUlBSWdBU0FERU1ZRUFBc2dBQ0FDYWdzYkFDQUFMUUFBUVFoSEJFQWdBQkRwQkE4TElBQkJCR29RNmdRTElnRUJmMEVNUVFRUW53Z2lBeUFDTmdJSUlBTWdBVFlDQkNBRElBQTJBZ0FnQXdzaUFRRi9RUXhCQkJDZkNDSUNRUUEyQWdnZ0FpQUJOZ0lFSUFJZ0FEWUNBQ0FDQ3lVQkFYOUJERUVFRUo4SUlnRkJBRFlDQ0NBQlFlaU53QUEyQWdRZ0FTQUFOZ0lBSUFFTEhnQWdBRVVFUUJEWUNRQUxJQUFnQWlBRElBUWdCU0FCS0FJUUVRd0FDeUlBUVlEZzJnQXRBQUFhSUFJZ0FSQ2dDQ0VCSUFBZ0FqWUNCQ0FBSUFFMkFnQUxHd0FnQUMwQUFFRUpSd1JBSUFBUXpBUVBDeUFBUVFScUVQb0VDeVVCQVg5QkRFRUVFSjhJSWdGQkFEWUNDQ0FCUVpUSTBnQTJBZ1FnQVNBQU5nSUFJQUVMSGdBZ0FDZ0NBRUdmZ0lDQWVFWUVRQ0FBS0FJRUR3c2dBQkRPQWtFQUN4MEFJQUFnQVNBQ0lBTVFrUUlnQVNnQ0FDQUJRUVJxS0FJQUVKUUhDeDBBSUFBZ0FTQUNJQU1RMFFFZ0FTZ0NBQ0FCUVFScUtBSUFFSlFIQ3gwQUlBQWdBU0FDSUFNUWdnSWdBU2dDQUNBQlFRUnFLQUlBRUpRSEN4MEFJQUFnQVNBQ0lBTVFzZ0VnQVNnQ0FDQUJRUVJxS0FJQUVKUUhDeDBBSUFBZ0FTQUNJQU1ROWdFZ0FTZ0NBQ0FCUVFScUtBSUFFSlFIQ3gwQUlBQWdBU0FDSUFNUXR3SWdBU2dDQUNBQlFRUnFLQUlBRUpRSEN4d0FJQUJGQkVBUTJBa0FDeUFBSUFJZ0F5QUVJQUVvQWhBUkFBQUxIQUFnQUVVRVFCRFlDUUFMSUFBZ0FpQURJQVFnQVNnQ0VCRUtBQXNjQUNBQVJRUkFFTmdKQUFzZ0FDQUNJQU1nQkNBQktBSVFFVFFBQ3h3QUlBQkZCRUFRMkFrQUN5QUFJQUlnQXlBRUlBRW9BaEFSTmdBTEhBQWdBRVVFUUJEWUNRQUxJQUFnQWlBRElBUWdBU2dDRUJFNEFBc2VBUUYvSUFBZ0FDZ0NBRUVCYXlJQk5nSUFJQUZGQkVBZ0FCQzZCd3NMSVFBZ0FDZ0NEQ0FBS0FJUUVNRUlJQUFRK3dZZ0FDZ0NBQ0FBS0FJRUVNQUpDeG9BSUFBb0FnQkJBVWNFUUNBQUtRTUlEd3NnQUJER0NDQUJDeDRBSUFBb0FnQkJuNENBZ0hoR0JFQWdBQ2dDQkE4TElBQVE0Z2hCQUFzaEFDQUFLQUpRSUFBb0FsUVE1Z2dnQUJDSUNTQUFLQUlnSUFBb0FpUVE2UVVMSVFBZ0FDZ0NTQ0FBS0FKTUVPWUlJQUFRaUFrZ0FDZ0NJQ0FBS0FJa0VPa0ZDeDBBSUFBZ0FTQUNJQU1RMHdFZ0FTZ0NBQ0FCUVFScUtBSUFFSlFIQ3gwQUlBQWdBU0FDSUFNUXRnRWdBU2dDQUNBQlFRUnFLQUlBRUpRSEN4MEFJQUFnQVNBQ0lBTVErQUVnQVNnQ0FDQUJRUVJxS0FJQUVKUUhDeDBBSUFBZ0FTQUNJQU1RdXdJZ0FTZ0NBQ0FCUVFScUtBSUFFSlFIQ3gwQUlBQWdBU0FDSUFNUWhRSWdBU2dDQUNBQlFRUnFLQUlBRUpRSEN4MEFJQUFnQVNBQ0lBTVFsQUlnQVNnQ0FDQUJRUVJxS0FJQUVKUUhDeHNBUVlEZzJnQXRBQUFhSUFBZ0FSQ2dDQ0lBUlFSQUFBc2dBQXNXQUNBQlFRbFBCRUFnQVNBQUVMQUJEd3NnQUJBV0N4b0JBWDhnQUNnQ0FDSUJCRUFnQUNnQ0JDQUJRUUVRNHdRTEN4b0FJQUJGQkVBUTJBa0FDeUFBSUFJZ0F5QUJLQUlRRVFVQUN4b0FJQUF0QUFCQkEwWUVRQ0FBS0FJRUlBQW9BZ2dRcVFrTEN4MEFJQUFvQWdBaUFDZ0NCQ0FBS0FJSUlBRW9BZ0FnQVNnQ0JCQlVDeGdBSUFBZ0FDa0RFQ0FDclh3M0F4QWdBQ0FCSUFJUUd3c1lBQ0FBSUFBcEF5QWdBcTE4TndNZ0lBQWdBU0FDRUE4TEhRQWdBQ2dDQ0VHQWdNUUFSZ1JBSUFBb0Fnd2dBQ2dDRUJDbUNRc0xIUUFnQUNnQ0JFR0FnTVFBUmdSQUlBQW9BZ2dnQUNnQ0RCREJDUXNMSEFBZ0FDZ0NBQ0lBS0FJQUlBRWdBRUVFYWlnQ0FDZ0NEQkVEQUFzVUFDQUFCRUFnQUE4TElBRWdBaUFERVAwRUFBc1hBQ0FBQkVBZ0FBOExJQUVnQWtIOGh0SUFFUDBFQUF2YUF3SUlmd0YrSUFBb0FnZ2dBVWtFUUFKQUl3QkJRR29pQXlRQUlBTWdBallDRENBQUtBSU1JUUlnQXlBRFFReHFOZ0lRSUFJZ0FTQUNhaUlCVFFSQUFuOENRQ0FBS0FJRUlnUWdCRUVCYWtFRGRrRUhiQ0FFUVFoSkd5SUVRUUYySUFGSkJFQWdBMEV3YWtFUUlBUkJBV29pQkNBQklBRWdCRWtiRVA4Q0lBTW9BalFpQmlBREtBSXdJZ0ZGRFFJYUlBTW9BamdoQnlBRElBTW9BancyQWl3Z0F5QUhOZ0lvSUFNZ0JqWUNKQ0FESUFFMkFpQWdBMEtRZ0lDQWdBRTNBaGdnQXlBQVFSQnFOZ0lVSUFBb0FnQWlDQ2tEQUVKL2hVS0FnWUtFaUpDZ3dJQi9neUVMSUFOQklHb2hDVUVBSVFRRFFDQUNCRUFEUUNBTFVBUkFJQVJCQ0dvaEJDQUlRUWhxSWdncEF3QkNmNFZDZ0lHQ2hJaVFvTUNBZjRNaEN3d0JDd3NnQXlBQklBWWdBMEVRYWlBQUlBdDZwMEVEZGlBRWFpSUZFTE1IRUx3RklBRWdBeWdDQUVGL2MwRUVkR29pQ2lBQUtBSUFJQVZCZjNOQkJIUnFJZ1VwQUFBM0FBQWdDa0VJYWlBRlFRaHFLUUFBTndBQUlBSkJBV3NoQWlBTFFnRjlJQXVESVFzTUFRc0xJQU1nQUNnQ0RDSUJOZ0lzSUFNZ0J5QUJhellDS0NBQUlBa1Ewd2tnQTBFVWFoQ29CUXdCQ3lBQUlBTkJFR3BCOGdCQkVCQjNDMEVBQ3hvZ0EwRkFheVFBREFFTEVPY0dBQXNMQ3h3QUlBQW9BZ0FnQUNnQ0JCQ1VCeUFBS0FJSUlBQW9BZ3dRbEFjTEdnRUJmMEdBNE5vQUxRQUFHa0VCRUJZaUFFVUVRQUFMSUFBTEhnRUJmMEVJUVFRUW53Z2lBVUdvaHNBQU5nSUVJQUVnQURZQ0FDQUJDeHNCQVg5QkNFRUVFSjhJSWdJZ0FUWUNCQ0FDSUFBMkFnQWdBZ3NZQUNBQVJRUkFFTmdKQUFzZ0FDQUNJQUVvQWhBUkF3QUxGUUFnQUNnQ0NFRU1Sd1JBSUFCQkNHb1F1Z1FMQ3o4QkEzOGdBQ2dDQ0NFQklBQW9BZ1FpQTBFSWFpRUNBMEFnQVFSQUlBRkJBV3NoQVNBQ0VMb0VJQUpCMEFCcUlRSU1BUXNMSUFBb0FnQWdBeERGQ1FzWEFDQUFJQUVnQWhEUUJpQUFRUmhxSUFFZ0FoRFJCZ3NVQUNBQUVKZ0RRZjhCY1NJQVJTQUFRUkZHY2dzZEFRRi9JQUFvQWdRaUFTQUFLQUlJRUk4SElBQW9BZ0FnQVJEbUNRc2JBUUYvUVlEZzJnQXRBQUFhUWRBQUVCWWlBRVVFUUFBTElBQUxHZ0VCZjBHQTROb0FMUUFBR2tFSUVCWWlBRVVFUUFBTElBQUxIQUFnQUNnQ0FDQUFLQUlJRUlrSklBQW9BaEFnQUNnQ0dCQ0pDUXNZQUVHQTROb0FMUUFBR2lBQUVCWWlBRVVFUUFBTElBQUxHZ0VCZjBHQTROb0FMUUFBR2tFQ0VCWWlBRVVFUUFBTElBQUxIZ0VCZjBFSVFRUVFud2dpQVVHVXY5SUFOZ0lFSUFFZ0FEWUNBQ0FCQ3hrQUlBQVFQU0lBSUFJZ0F4QzZBU0FBUWZpT3dBQVFsQWNMR2dBZ0FCQ2xCQ0lBSUFJZ0F4Q21BaUFBUWRDQndBQVFsQWNMR0FBZ0FDZ0NCQ0FBS0FJSUlBRW9BZ0FnQVNnQ0JCQlVDeGdBSUFBb0FnQWdBQ2dDQkNBQktBSUFJQUVvQWdRUVZBc1NBQ0FCQkVBZ0FDQUJRUVJCQ0JDM0Jnc0xGd0FnQUVFSWFoRHFCeUFBS0FJNElBQW9BandRcVFrTEVnQWdBQ2dDQUFSQUlBQkJCR29RelFJTEN4WUFJQUZGQkVCQjNJblNBQkRxQmdBTElBQWdBVzRMRmdBZ0FVVUVRRUhVak5JQUVPb0dBQXNnQUNBQmJnc1NBQ0FBS0FJQUJFQWdBRUVFYWhDbkF3c0xHUUFnQUJBL0lnQWdBaUFERUwwQklBQkJ2TW5TQUJDVUJ3c2FBQ0FBRUxFRUlnQWdBaUFERUtZQ0lBQkI1TUhTQUJDVUJ3c2NBQ0FBUVFBMkFoQWdBRUlBTndJSUlBQkNnSUNBZ01BQU53SUFDeGtBSUFFb0FnQkJnNVhTQUVFRklBRW9BZ1FvQWd3UkFnQUxGZ0FnQUNnQ0FFR2ZnSUNBZUVjRVFDQUFFTTBDQ3dzT0FDQUFCRUFBQ3lBQ0VPa0dBQXNVQUNBQktBSUVHaUFBUVlDQXdBQWdBUkNGQVFzU0FDQUFLQUlBUVFWSEJFQWdBQkRxQkFzTEZRQWdBQ2dDQUNJQUVPb0VJQUJCR0VFRUVPTUVDeEFBSUFJRVFDQUFJQUlnQVJEakJBc0xGUUFnQUVHQWdJQ0FlRWNFUUNBQUlBRVFyZ2tMQ3hVQUlBQW9BZ0FpQUJEc0JDQUFRUmhCQkJEakJBc1VBQ0FCS0FJRUdpQUFRZXlod0FBZ0FSQ0ZBUXNVQUNBQktBSUVHaUFBUWJEMndBQWdBUkNGQVFzWEFRRi9FTzhISVFFZ0FFRUFOZ0lFSUFBZ0FUWUNBQXNaQUNBQktBSUFRWWZheVFCQkRpQUJLQUlFS0FJTUVRSUFDeGtBSUFFb0FnQkI5Tm5KQUVFVElBRW9BZ1FvQWd3UkFnQUxHUUFnQVNnQ0FFR1ltOGtBUVJFZ0FTZ0NCQ2dDREJFQ0FBc1pBQ0FCS0FJQVFhbWJ5UUJCRVNBQktBSUVLQUlNRVFJQUN4WUFJQUFvQWdCQm40Q0FnSGhIQkVBZ0FCQ25Bd3NMRlFBZ0FTQUFLQUlBSWdBb0FnUWdBQ2dDQ0JCSEN4UUFJQUVvQWdRYUlBQkJ4Si9KQUNBQkVJVUJDeGtBSUFFb0FnQkI4S1BKQUVFTElBRW9BZ1FvQWd3UkFnQUxGUUFnQUVHQmdJQ0FlRW9FUUNBQUlBRVFxUWtMQ3hFQUlBSW9BZ1FhSUFBZ0FTQUNFSVVCQ3hVQUlBQkJnSUNBZ0hoSEJFQWdBQ0FCRUtrSkN3c1ZBQ0FBUVlDQWdJQjRSd1JBSUFBZ0FSRDFDUXNMRmdBZ0FDZ0NBRUdmZ0lDQWVFY0VRQ0FBRU00Q0N3c1ZBQ0FBUVlDQWdJQjRSd1JBSUFBZ0FSQ29DUXNMRmdBZ0FDZ0NFRUdBZ0lDQWVFY0VRQ0FBRU9vSEN3c1NBQ0FBUVNCcUVLY0lJQUJCREdvUXFBZ0xGUUFnQUVHQWdJQ0FlRWNFUUNBQUlBRVE3d2tMQ3hVQUlBQW9BZ0FpQUJENkJDQUFRUmhCQkJEakJBc1NBQ0FBS0FJQVFRVkhCRUFnQUJENkJBc0xGUUFnQUNnQ0FDSUFFUHdFSUFCQkdFRUVFT01FQ3hBQUlBRUVRQ0FBSUFFZ0FoRGpCQXNMRXdCQitOL2FBQ0FBclVJZ2hrSUJoRGNEQUFzUUFDQUJCRUFnQUNBQlFRRVE0d1FMQ3hBQUlBQWdBU0FCSUFKcUVNZ0dRUUFMRUFBZ0FFR0VBVThFUUNBQUVJc0ZDd3QvQWdKL0FYNUI0Ti9hQUNnQ0FFVUVRQ01BUVJCcklnRWtBRUh3MzlvQUFuNENRQ0FBUlEwQUlBQW9BZ0FnQUVJQU53TUFRUUZ4UlEwQUlBQXBBd2doQXlBQUtRTVFEQUVMSUFFUXN3VWdBU2tEQUNFRElBRXBBd2dMTndNQVFlamYyZ0FnQXpjREFFSGczOW9BUWdFM0F3QWdBVUVRYWlRQUMwSG8zOW9BQ3hJQUlBQWdBU0FDSUFNUXFRRWdBUkN0Q0FzU0FDQUFJQUVnQWlBREVOQUJJQUVRclFnTEVnQWdBQ0FCSUFJZ0F4RGNBaUFCRUswSUN4SUFJQUFnQVNBQ0lBTVEzUUlnQVJDdENBc1NBQ0FBSUFFZ0FpQURFSlVESUFFUXJRZ0xFZ0FnQUNBQklBSWdBeEN3QWlBQkVLMElDeFFBSUFBUTlRWWdBQ2dDQUNBQUtBSUVFS3dKQ3hJQUlBQWdBU0FDSUFNUXVnRWdBUkN0Q0FzU0FDQUFJQUVnQWlBREVJMENJQUVRclFnTEVnQWdBQ0FCSUFJZ0F4Q1ZBaUFCRUswSUN4SUFJQUFnQVNBQ0lBTVEvUUlnQVJDdENBc1NBQ0FBSUFFZ0FpQURFSm9ESUFFUXJRZ0xFZ0FnQUNBQklBSWdBeERTQVNBQkVNa0dDeFFCQVg5QkFVRUJFSjhJSWdFZ0FEb0FBQ0FCQ3hjQkFYOUJCRUVFRUo4SUlnQkJvTkhTQURZQ0FDQUFDeGNCQVg5QkJFRUVFSjhJSWdCQmxkRFNBRFlDQUNBQUN4Y0JBWDlCQkVFRUVKOElJZ0JCb3RIU0FEWUNBQ0FBQ3hRQkFYOUJCRUVFRUo4SUlnRWdBRFlDQUNBQkN4UUFJQUFvQWdBZ0FTQUFLQUlFS0FJTUVRTUFDOWdIQVFSL0lBQWhCaU1BUWZBQWF5SUZKQUFnQlNBRE5nSU1JQVVnQWpZQ0NBSi9Ba0FnQVVHQkFrOEVRQ0FBTEFDQUFrRy9mMG9FUUVHQUFpRUFEQUlMSUFZc0FQOEJRYjkvU2dSQVFmOEJJUUFNQWdzZ0JrSCtBVUg5QVNBR0xBRCtBVUcvZjBvYklnQnFMQUFBUWI5L1NnMEJJQVlnQVVFQUlBQWdCQkNEQ1FBTFFRRWhCeUFCSVFCQkFBd0JDMEdVLzhBQUlRZEJCUXNoQ0NBRklBQTJBaFFnQlNBR05nSVFJQVVnQ0RZQ0hDQUZJQWMyQWhnQ1FBSkFBa0FDUUNBQklBSkpJZ0FnQVNBRFNYSkZCRUFnQWlBRFN3MEJJQUpGSUFFZ0FrMXlSUVJBSUFNZ0FpQUNJQVpxTEFBQVFiOS9TaHNoQXdzZ0JTQUROZ0lnSUFNZ0FTSUFTUVJBSUFOQkFXb2lCeUFEUVFOcklnQkJBQ0FBSUFOTkd5SUNTUTBESUFNZ0Jtb2hBQ0FISUFKcklRTURRQ0FEQkVBZ0EwRUJheUVESUFBc0FBQWdBRUVCYXlFQVFVQklEUUVMQ3lBQ0lBTnFJUUFMQWtBZ0FFVU5BQ0FBSUFGUEJFQWdBQ0FCUmcwQkRBVUxJQUFnQm1vc0FBQkJ2MzlNRFFRTEFuOENRQUpBSUFBZ0FVWU5BQUpBQWtBZ0FDQUdhaUlDTEFBQUlnRkJBRWdFUUNBQ0xRQUJRVDl4SVFZZ0FVRWZjU0VESUFGQlgwc05BU0FEUVFaMElBWnlJUU1NQWdzZ0JTQUJRZjhCY1RZQ0pFRUJEQVFMSUFJdEFBSkJQM0VnQmtFR2RISWhCaUFCUVhCSkJFQWdCaUFEUVF4MGNpRUREQUVMSUFOQkVuUkJnSUR3QUhFZ0FpMEFBMEUvY1NBR1FRWjBjbklpQTBHQWdNUUFSZzBCQ3lBRklBTTJBaVFnQTBHQUFVOE5BVUVCREFJTElBUVF1d2tBQzBFQ0lBTkJnQkJKRFFBYVFRTkJCQ0FEUVlDQUJFa2JDeUVCSUFVZ0FEWUNLQ0FGSUFBZ0FXbzJBaXdnQlVFRk5nSTBJQVZCbklEQkFEWUNNQ0FGUWdVM0Fqd2dCU0FGUVJocXJVS0FnSUNBNEFDRU53Tm9JQVVnQlVFUWFxMUNnSUNBZ09BQWhEY0RZQ0FGSUFWQktHcXRRb0NBZ0lDd0JZUTNBMWdnQlNBRlFTUnFyVUtBZ0lDQXdBV0VOd05RSUFVZ0JVRWdhcTFDZ0lDQWdLQURoRGNEU0F3RUN5QUZJQUlnQXlBQUd6WUNLQ0FGUVFNMkFqUWdCVUhjZ01FQU5nSXdJQVZDQXpjQ1BDQUZJQVZCR0dxdFFvQ0FnSURnQUlRM0ExZ2dCU0FGUVJCcXJVS0FnSUNBNEFDRU53TlFJQVVnQlVFb2FxMUNnSUNBZ0tBRGhEY0RTQXdEQ3lBRlFRUTJBalFnQlVHOC84QUFOZ0l3SUFWQ0JEY0NQQ0FGSUFWQkdHcXRRb0NBZ0lEZ0FJUTNBMkFnQlNBRlFSQnFyVUtBZ0lDQTRBQ0VOd05ZSUFVZ0JVRU1hcTFDZ0lDQWdLQURoRGNEVUNBRklBVkJDR3F0UW9DQWdJQ2dBNFEzQTBnTUFnc2dBaUFIUWZTQXdRQVF0d2tBQ3lBR0lBRWdBQ0FCSUFRUWd3a0FDeUFGSUFWQnlBQnFOZ0k0SUFWQk1Hb2dCQkNyQndBTEVBQWdBQ0FCSUFKQklCRHNCMEVCY3dzUUFDQUFJQUVnQWlBREVPd0hRUUZ6Q3hRQUlBQVErZ1lnQUNnQ0FDQUFLQUlFRUw0SkN4UUFJQUFvQWtnZ0FDZ0NUQkNwQ1NBQUVMb0VDdzhBSUFBb0FnQUVRQ0FBRUlVREN3c09BQ0FBQkVBZ0FTQUFFTjBFQ3dzU0FDQUFJQUVnQWlBREVLd0JJQUVRclFnTEVnQWdBQ0FCSUFJZ0F4Q1FBaUFCRUswSUN4SUFJQUFnQVNBQ0lBTVEvQUlnQVJDdENBc1NBQ0FBSUFFZ0FpQURFSndESUFFUXJRZ0xFZ0FnQUNBQklBSWdBeENoQWlBQkVLMElDeElBSUFBZ0FTQUNJQU1RdEFJZ0FSQ3RDQXNVQUNBQUVJRUhJQUFvQWdBZ0FDZ0NCQkNzQ1FzU0FDQUFJQUVnQWlBREVLWUNJQUVRclFnTEVnQWdBQ0FCSUFJZ0F4Q1lBaUFCRUswSUN4SUFJQUFnQVNBQ0lBTVF2UUVnQVJDdENBc1NBQ0FBSUFFZ0FpQURFSjBESUFFUXJRZ0xFZ0FnQUNBQklBSWdBeERVQVNBQkVNa0dDeElBSUFBZ0FTQUNJQU1RZ1FNZ0FSQ3RDQXNPQUNBQUlBRWdBU0FDYWhESUJndUdBUUVEZnlBQUtBSUVJUUlnQUNnQ0NDRURJd0JCRUdzaUFDUUFJQUVvQWdCQjRNL0pBRUVCSUFFb0FnUW9BZ3dSQWdBaEJDQUFRUUE2QUFrZ0FDQUVPZ0FJSUFBZ0FUWUNCQ0FEQkVBRFFDQUFJQUkyQWd3Z0FFRUVhaUFBUVF4cVFTY1F5Z0lnQWtFQmFpRUNJQU5CQVdzaUF3MEFDd3NnQUVFRWFoQ05CeUFBUVJCcUpBQUxFQUFnQVNBQUtBSUFJQUFvQWdRUVJ3c1BBQ0FBSUFBb0FnaEJBV28yQWdnTEVBQWdBU0FBS0FJRUlBQW9BZ2dRUndzUkFDQUJLQUlBSUFFb0FnUWdBQkNGQVFzaEFDQUFRdlRpbTVuOW50Ky9XemNEQ0NBQVF2eW11S1hkME16MnUzODNBd0FMRWdCQmdPRGFBQzBBQUJvZ0FTQUFFS0FJQ3hNQUlBQkJBallDQkNBQVFkVFV5UUEyQWdBTEV3QWdBRUVJTmdJRUlBQkJ6TlRKQURZQ0FBc1RBQ0FBUVFVMkFnUWdBRUdRbU1rQU5nSUFDeE1BSUFCQkJUWUNCQ0FBUVpXWXlRQTJBZ0FMRVFBZ0FDZ0NCQ0FBS0FJSUlBRVFqZ1FMRVFBZ0FDZ0NBQ0FBS0FJRUlBRVFqZ1FMRVFBZ0FDZ0NBQ2dDQUVFSklBRVFqZ1FMRFFBZ0FDQUJRUVJCQ0JESkJBc05BQ0FBSUFGQkJFRU1FTWtFQ3cwQUlBQWdBVUVJUVFnUXlRUUxEUUFnQUNBQlFRRkJBUkRKQkFzTkFDQUJJQUJCQkVFSUVNa0VDdzBBSUFBZ0FVRUJRUUFRcHdRTERRQWdBQ0FCUVFoQktCQ25CQXNOQUNBQUlBRkJDRUU0RUtjRUN3MEFJQUFnQVVFQlFRRVFwd1FMRFFBZ0FDQUJRUVJCREJDbkJBc05BQ0FBSUFNZ0FpQURFUGdDQ3cwQUlBQWdBeUFDSUFNUXZRZ0xEd0FnQUNnQ0FDQUFLQUlFRUpRSEN3MEFJQUFnQXlBQ0lBTVF2Z2dMRFFBZ0FDQURJQUlnQXhDR0F3c05BQ0FBSUFNZ0FpQURFSTREQ3c4QVFRQkJBRUh3eTlJQUVNd0lBQXRyQVFGL0l3QkJNR3NpQXlRQUlBTWdBVFlDQkNBRElBQTJBZ0FnQTBFQ05nSU1JQU5CMU9EQkFEWUNDQ0FEUWdJM0FoUWdBeUFEUVFScXJVS0FnSUNBb0FPRU53TW9JQU1nQTYxQ2dJQ0FnS0FEaERjRElDQURJQU5CSUdvMkFoQWdBMEVJYWlBQ0VLc0hBQXRyQVFGL0l3QkJNR3NpQXlRQUlBTWdBVFlDQkNBRElBQTJBZ0FnQTBFQ05nSU1JQU5Cb09EQkFEWUNDQ0FEUWdJM0FoUWdBeUFEUVFScXJVS0FnSUNBb0FPRU53TW9JQU1nQTYxQ2dJQ0FnS0FEaERjRElDQURJQU5CSUdvMkFoQWdBMEVJYWlBQ0VLc0hBQXRyQVFGL0l3QkJNR3NpQXlRQUlBTWdBVFlDQkNBRElBQTJBZ0FnQTBFQ05nSU1JQU5CZ09EQkFEWUNDQ0FEUWdJM0FoUWdBeUFEUVFScXJVS0FnSUNBb0FPRU53TW9JQU1nQTYxQ2dJQ0FnS0FEaERjRElDQURJQU5CSUdvMkFoQWdBMEVJYWlBQ0VLc0hBQXNPQUNBQUtBSUFRUUVnQVJESUFRc1BBRUdOOU1BQVFTc2dBQkNjQmdBTGF3RUJmeU1BUVRCcklnTWtBQ0FESUFBMkFnUWdBeUFCTmdJQUlBTkJBellDRENBRFFiamh3UUEyQWdnZ0EwSUNOd0lVSUFNZ0EwRUVhcTFDZ0lDQWdLQURoRGNES0NBRElBT3RRb0NBZ0lDZ0E0UTNBeUFnQXlBRFFTQnFOZ0lRSUFOQkNHb2dBaENyQndBTER3QWdBQ2dDQUNBQUtBSUVFTjBFQ3c0QUlBQWdBVUVJUWNnQUVNa0VDdzBBSUFBZ0FTQUNRU0FRN0FjTERnQWdBQ0FCUVFoQjJBQVF5UVFMRFFBZ0FDQUJRUVJCQkJESkJBc05BQ0FBSUFFZ0FpQURFT3dIQ3cwQUlBQWdBU0FDRUpjSlFRQUxEUUFnQUNBQlFRUkJHQkRKQkFzT0FDQUFJQUZCQ0VIUUFCREpCQXNQQUNBQUtBSUFJQUFvQWdRUXFRa0xMQUFDZnlBQUtBSUFMUUFBUVFGeFJRUkFJQUZCdXRIU0FFRUZFRWNNQVFzZ0FVRzIwZElBUVFRUVJ3c0xEd0FnQUNnQ0FDMEFBQ0FCRVBvREN3OEFJQUFvQWdBZ0FDZ0NCQkQxQ1FzTkFDQUFJQU1nQWlBREVNY0lDdzhBSUFBb0FnQWdBQ2dDQkJEMkNRc05BQ0FBSUFNZ0FpQURFTWdJQ3cwQUlBQWdBeUFDSUFNUTN3SUxEd0FnQUNnQ0FDQUFLQUlFRUs0SkN3MEFJQUZCZ2ZuQUFFRXRFRWNMREFBZ0FDZ0NBQ0FCRU1FQkN3d0FJQUFvQWdBZ0FSREhBUXNMQUNBQVFRSWdBUkNaQkFzTEFDQUFJQUZCQkJDbkJnc01BQ0FBS0FJQUlBRVF5d1lMREFBZ0FDQUJLUUlFTndNQUN3MEFJQUJCelBQQUFFRXZFRWNMREFBZ0FDZ0NBQ0FCRU1BSUN3d0FRWlNPeVFCQk1oQUhBQXNMQUNBQUlBRkJJQkNkQWdzTEFDQUFJQUVnQWhDZEFnc09BQ0FBUVp5K3lRQkJCQkNkQWdzTEFDQUFLQUlBSUFFUU9nc01BQ0FBS0FJQUlBRVFvd2tMRGdCQnJOSFNBRUVHSUFBUXJBWUxDd0FnQUNBRUlBVVFvQVVMQ2dBZ0FDQUJRUUVRR3dzTEFDQUJRUkFnQUJDV0FRc0xBQ0FBSUFJZ0F4Q2dCUXNLQUNBQUlBRkJBUkFQQ3dvQUlBQWdBVUVCRUJFTERBQWdBQ2dDQUNBQkVKa0JDd3NBSUFBZ0FVRU1FT0VFQ3d3QUlBQW9BZ0FnQVJEaUJ3c05BQ0FCUWRpTDBnQkJBaEJIQ3d3QUlBQW9BZ0FnQVJDMUF3c01BQ0FBS0FJQUlBRVEwUWtMREFBZ0FDZ0NTQ0FCRUprQkN3d0FJQUFvQWtBZ0FSQ1pBUXNNQUNBQUtBSm9JQUVRbVFFTEt3RUJmeU1BUVJCcklnSWtBQ0FDSUFFMkFnd2dBaUFBTmdJSUlBSkJDR3BCOHdCQkFVRUFFTUlFQUFzTEFDQUFJQUZCQWhEaUJBc01BQ0FBS0FJQUlBRVEzQWtMREFBZ0FDZ0NBQ0FCRU4wSkN3c0FJQUJCQXlBQkVKa0VDd3dBSUFBZ0FTa0NBRGNEQUFzTEFDQUFJQUZCQkJEaEJBc0pBQ0FBSUFFUXFRa0xDUUFnQUNBQkVLNEpDd2tBSUFCQkFEWUNBQXNKQUNBQklBQVFwZ2tMQ1FBZ0FTQUFFS2dKQ3drQUlBQkJCVFlDQUFzSkFDQUFJQUUyQWdnTENBQWdBQ1VCRUFBTEJ3QWdBQ2dDQ0FzSEFDQUJFTllKQ3dJQUN3dmxqaHJwREFCQmdJREFBQXNWZHdBQUFBd0FBQUFFQUFBQWVBQUFBSGtBQUFCNkFFR2dnTUFBQ3gwQkFBQUFld0FBQUh3QUFBQUlBQUFBQkFBQUFIMEFBQUIrQUFBQWZnQkJ5SURBQUF1dEFnRUFBQUIvQUFBQWdBQUFBSUFBQUFCOEFBQUFDQUFBQUFRQUFBQ0JBQUFBZ2dBQUFJSUFBQUNEQUFBQUVBQUFBQVFBQUFDRUFBQUFoUUFBQUlVQUFBQ0RBQUFBRUFBQUFBUUFBQUNHQUFBQWh3QUFBSWNBQUFDREFBQUFFQUFBQUFRQUFBQ0lBQUFBaVFBQUFJa0FBQUI4QUFBQUNBQUFBQVFBQUFDS0FBQUFpd0FBQUlzQUFBQ0RBQUFBRUFBQUFBUUFBQUNNQUFBQWpRQUFBSTBBQUFCOEFBQUFDQUFBQUFRQUFBQ09BQUFBandBQUFJOEFBQUFBQUFBQUJBQUFBQVFBQUFDUUFBQUFrUUFBQUpFQUFBQjhBQUFBQ0FBQUFBUUFBQUNTQUFBQWt3QUFBSk1BQUFCOEFBQUFDQUFBQUFRQUFBQ1VBQUFBbFFBQUFKVUFBQUNXQUFBQURBQUFBQVFBQUFDWEFBQUFtQUFBQUpnQUFBQ0RBQUFBRUFBQUFBUUFBQUNaQUFBQW1nQUFBSm9BUVlDRHdBQUxqUU1CQUFBQW13QUFBSndBQUFDY0FBQUFmQUFBQUFnQUFBQUVBQUFBblFBQUFKNEFBQUNlQUFBQWZBQUFBQWdBQUFBRUFBQUFud0FBQUtBQUFBQ2dBQUFBZkFBQUFBZ0FBQUFFQUFBQW9RQUFBS0lBQUFDaUFBQUFnd0FBQUJBQUFBQUVBQUFBb3dBQUFLUUFBQUNrQUFBQWd3QUFBQkFBQUFBRUFBQUFwUUFBQUtZQUFBQ21BQUFBZkFBQUFBZ0FBQUFFQUFBQXB3QUFBS2dBQUFDb0FBQUFmQUFBQUFnQUFBQUVBQUFBcVFBQUFLb0FBQUNxQUFBQWd3QUFBQkFBQUFBRUFBQUFqQUFBQUkwQUFBQ05BQUFBZkFBQUFBZ0FBQUFFQUFBQXF3QUFBS3dBQUFDc0FBQUFmQUFBQUFnQUFBQUVBQUFBclFBQUFLNEFBQUN1QUFBQWZBQUFBQWdBQUFBRUFBQUFyd0FBQUxBQUFBQ3dBQUFBQUFBQUFBUUFBQUFFQUFBQXNRQUFBTElBQUFDeUFBQUFBQUFBQUFRQUFBQUVBQUFBc3dBQUFMUUFBQUMwQUFBQWZBQUFBQWdBQUFBRUFBQUFwd0FBQUtnQUFBQ29BQUFBZkFBQUFBZ0FBQUFFQUFBQXRRQUFBTFlBQUFDMkFBQUFBQUFBQUFRQUFBQUVBQUFBdHdBQUFMZ0FBQUM0QUVHWWhzQUFDNVVDQVFBQUFMa0FBQUM2QUFBQXVnQUFBQUFBQUFBRUFBQUFCQUFBQUxzQUFBQzhBQUFBdkFBQUFId0FBQUFJQUFBQUJBQUFBS3NBQUFDc0FBQUFyQUFBQUlNQUFBQVFBQUFBQkFBQUFMMEFBQUMrQUFBQXZnQUFBQUFBQUFBRUFBQUFCQUFBQUw4QUFBREFBQUFBd0FBQUFJTUFBQUFRQUFBQUJBQUFBTUVBQUFEQ0FBQUF3Z0FBQUlNQUFBQVFBQUFBQkFBQUFJZ0FBQUNKQUFBQWlRQUFBSHdBQUFBSUFBQUFCQUFBQU1NQUFBREVBQUFBeEFBQUFNVUFBQUFJQUFBQUJBQUFBTVlBQUFESEFBQUF4d0FBQUh3QUFBQUlBQUFBQkFBQUFKMEFBQUNlQUFBQW5nQUFBSllBQUFBTUFBQUFCQUFBQU1nQUFBREpBQUFBeVFBQUFNVUFBQUFJQUFBQUJBQUFBTW9BQUFETEFBQUF5d0JCdUlqQUFBczlBUUFBQU13QUFBRE5BQUFBelFBQUFBQUFBQUFCQUFBQUFRQUFBTTRBQUFEUEFBQUF6d0FBQUpZQUFBQU1BQUFBQkFBQUFOQUFBQURSQUFBQTBRQkJnSW5BQUF1ZEFRRUFBQURTQUFBQTB3QUFBTk1BQUFDREFBQUFFQUFBQUFRQUFBRFVBQUFBMVFBQUFOVUFBQUFBQUFBQUJBQUFBQVFBQUFEV0FBQUExd0FBQU5jQUFBQjhBQUFBQ0FBQUFBUUFBQURZQUFBQTJRQUFBTmtBQUFCOEFBQUFDQUFBQUFRQUFBRGFBQUFBMndBQUFOc0FBQURGQUFBQUNBQUFBQVFBQUFEY0FBQUEzUUFBQU4wQUFBQ1dBQUFBREFBQUFBUUFBQURlQUFBQTN3QUFBTjhBUWFpS3dBQUxqUU1CQUFBQTRBQUFBT0VBQUFEaEFBQUFmQUFBQUFnQUFBQUVBQUFBNGdBQUFPTUFBQURqQUFBQWZBQUFBQWdBQUFBRUFBQUE1QUFBQU9VQUFBRGxBQUFBQUFBQUFBUUFBQUFFQUFBQTVnQUFBT2NBQUFEbkFBQUFmQUFBQUFnQUFBQUVBQUFBNkFBQUFPa0FBQURwQUFBQWZBQUFBQWdBQUFBRUFBQUE2Z0FBQU9zQUFBRHJBQUFBZkFBQUFBZ0FBQUFFQUFBQTdBQUFBTzBBQUFEdEFBQUFmQUFBQUFnQUFBQUVBQUFBN2dBQUFPOEFBQUR2QUFBQWd3QUFBQkFBQUFBRUFBQUFpQUFBQUlrQUFBQ0pBQUFBZkFBQUFBZ0FBQUFFQUFBQThBQUFBUEVBQUFEeEFBQUFBQUFBQUFRQUFBQUVBQUFBOGdBQUFQTUFBQUR6QUFBQWd3QUFBQkFBQUFBRUFBQUE5QUFBQVBVQUFBRDFBQUFBZkFBQUFBZ0FBQUFFQUFBQXF3QUFBS3dBQUFDc0FBQUFnd0FBQUJBQUFBQUVBQUFBOWdBQUFQY0FBQUQzQUFBQStBQUFBQXdBQUFBRUFBQUErUUFBQVBvQUFBRDZBQUFBK3dBQUFCQUFBQUFFQUFBQS9BQUFBUDBBQUFEOUFBQUF4UUFBQUFnQUFBQUVBQUFBL2dBQUFQOEFBQUQvQUVIQWpjQUFDNTBWQVFBQUFBQUJBQUFCQVFBQUFRRUFBSHdBQUFBSUFBQUFCQUFBQUFJQkFBQURBUUFBQXdFQUFJTUFBQUFRQUFBQUJBQUFBUFFBQUFEMUFBQUE5UUFBQUpZQUFBQU1BQUFBQkFBQUFBUUJBQUFGQVFBQUJRRUFBQUFBQUFBRUFBQUFCQUFBQUFZQkFBQUhBUUFBQndFQUFJTUFBQUFRQUFBQUJBQUFBSWdBQUFDSkFBQUFpUUFBQUlNQUFBQVFBQUFBQkFBQUFBZ0JBQUFKQVFBQUNRRUFBSU1BQUFBUUFBQUFCQUFBQUlnQUFBQ0pBQUFBaVFBQUFJTUFBQUFRQUFBQUJBQUFBQW9CQUFBTEFRQUFDd0VBQUh3QUFBQUlBQUFBQkFBQUFBd0JBQUFOQVFBQURRRUFBSU1BQUFBUUFBQUFCQUFBQUlnQUFBQ0pBQUFBaVFBQUFId0FBQUFJQUFBQUJBQUFBQTRCQUFBUEFRQUFEd0VBQUlNQUFBQVFBQUFBQkFBQUFLVUFBQUNtQUFBQXBnQUFBSHdBQUFBSUFBQUFCQUFBQUJBQkFBQVJBUUFBRVFFQUFJTUFBQUFRQUFBQUJBQUFBQklCQUFBVEFRQUFFd0VBQUJRQkFBQVVBQUFBQkFBQUFCOEFBQURrQ3hBQVpBQUFBQmtBQUFCS0FBQUE1QXNRQUdRQUFBQXFBQUFBU2dBQUFCVUJBQUFZQUFBQUJBQUFBQllCQUFEa0N4QUFaQUFBQUVrQUFBQVRBQUFBQUFBQUFBd0FBQUFFQUFBQUZ3RUFBQmdCQUFBWkFRQUFHZ0VBQUJzQkFBRGtDeEFBWkFBQUFLa0FBQUFmQUFBQTVBc1FBR1FBQUFDdUFBQUFGQUFBQUdKbFoybHVZbVpqYUdGeVltVm5hVzVpWm5KaGJtZGxBT1FMRUFCa0FBQUF2Z0FBQUVzQUFBQmlaV2RwYm1KbWNtRnVaMlVnWlhobFkzUmxaQ0JwYm5Ua0N4QUFaQUFBQU1FQUFBQmFBQUFBWW1WbmFXNWlabkpoYm1kbElHVjRaV04wWldRZ2FHVjRjM1J5YVc1bkFBRGtDeEFBWkFBQUFNSUFBQUJhQUFBQTVBc1FBR1FBQUFEREFBQUFLUUFBQUdKaFpDQnNaVzVuZEdnZ2IyWWdhR1Y0YzNSeWFXNW5BT1FMRUFCa0FBQUExUUFBQUMwQUFBRGtDeEFBWkFBQUFPQUFBQUJqQUFBQVltRmtJR3hsYm1kMGFDQnZaaUJoY25KaGVXSmxaMmx1WW1aeVlXNW5aU0JsZUdWamRHVmtJR0Z5Y21GNUlHOXlJR3hwZEdWeVlXemtDeEFBWkFBQUFMSUFBQUJMQUFBQVltVm5hVzVpWm1Ob1lYSWdaWGhsWTNSbFpDQnBiblFBNUFzUUFHUUFBQUMxQUFBQVdRQUFBR0psWjJsdVltWmphR0Z5SUdWNFpXTjBaV1FnYUdWNGMzUnlhVzVuQUFBQTVBc1FBR1FBQUFDMkFBQUFXQUFBQUdGemMyVnlkR2x2YmlCbVlXbHNaV1E2SUhOMFlYSjBYMk5vWVhKekxteGxiaWdwSUQwOUlHVnVaRjlqYUdGeWN5NXNaVzRvS1FBQTVBc1FBR1FBQUFENEFBQUFCUUFBQU9RTEVBQmtBQUFBK2dBQUFDd0FBQURrQ3hBQVpBQUFBUHNBQUFBbUFBQUE1QXNRQUdRQUFBQVhBUUFBSHdBQUFPUUxFQUJrQUFBQUhBRUFBQlFBQUFCaVpXZHBibU52WkdWemNHRmpaWEpoYm1kbFltVm5hVzVqYVdSeVlXNW5aZVFMRUFCa0FBQUFLd0VBQUVzQUFBQmlaV2RwYm1OcFpISmhibWRsSUdWNFpXTjBaV1FnYVc1MEFBQUE1QXNRQUdRQUFBQXVBUUFBVlFBQUFHSmxaMmx1WTJsa2NtRnVaMlVnWlhobFkzUmxaQ0JvWlhoemRISnBibWNBNUFzUUFHUUFBQUF2QVFBQVV3QUFBT1FMRUFCa0FBQUFNQUVBQUZBQUFBRGtDeEFBWkFBQUFERUJBQUFvQUFBQTVBc1FBR1FBQUFBZ0FRQUFTd0FBQUdKbFoybHVZMjlrWlhOd1lXTmxjbUZ1WjJVZ1pYaGxZM1JsWkNCcGJuUUE1QXNRQUdRQUFBQWpBUUFBVlFBQUFHSmxaMmx1WTI5a1pYTndZV05sY21GdVoyVWdaWGhsWTNSbFpDQm9aWGh6ZEhKcGJtY0FBQURrQ3hBQVpBQUFBQ1FCQUFCVEFBQUE1QXNRQUdRQUFBQWxBUUFBTGdBQUFCd0JBQUFVQUFBQUJBQUFBQjhBQUFBdmFHOXRaUzl5ZFc1dVpYSXZMbU5oY21kdkwzSmxaMmx6ZEhKNUwzTnlZeTlwYm1SbGVDNWpjbUYwWlhNdWFXOHRNVGswT1dObU9HTTJZalZpTlRVM1ppOWhaRzlpWlMxamJXRndMWEJoY25ObGNpMHdMalF1TVM5emNtTXZiR2xpTG5KejVBc1FBR1FBQUFCMUFBQUFYd0FBQUM5b2IyMWxMM0oxYm01bGNpOHVZMkZ5WjI4dmNtVm5hWE4wY25rdmMzSmpMMmx1WkdWNExtTnlZWFJsY3k1cGJ5MHhPVFE1WTJZNFl6WmlOV0kxTlRkbUwyRmxjeTB3TGpndU5DOXpjbU12YzI5bWRDOW1hWGh6YkdsalpUTXlMbkp6QUFCWURCQUFZZ0FBQUNvQUFBQVlBQUFBV0F3UUFHSUFBQUJPQUFBQUpBQUFBRmdNRUFCaUFBQUFVd0FBQUNJQUFBQllEQkFBWWdBQUFFb0FBQUFvQUFBQVdBd1FBR0lBQUFCTEFBQUFLQUFBQUZnTUVBQmlBQUFBVEFBQUFDZ0FBQUJZREJBQVlnQUFBREVBQUFBZEFBQUFXQXdRQUdJQUFBQXlBQUFBSWdBQUFGZ01FQUJpQUFBQU53QUFBQzRBQUFCWURCQUFZZ0FBQURnQUFBQXVBQUFBV0F3UUFHSUFBQUE1QUFBQUxnQUFBRmdNRUFCaUFBQUFPZ0FBQUM0QUFBQllEQkFBWWdBQUFEVUFBQUF1QUFBQVdBd1FBR0lBQUFDN0FBQUFHQUFBQUZnTUVBQmlBQUFBdkFBQUFCZ0FBQUJZREJBQVlnQUFBTVVBQUFBZEFBQUFXQXdRQUdJQUFBREdBQUFBSWdBQUFGZ01FQUJpQUFBQXlBQUFBQ29BQUFCWURCQUFZZ0FBQU9jQUFBQWtBQUFBV0F3UUFHSUFBQURzQUFBQUlnQUFBRmdNRUFCaUFBQUE0d0FBQUNnQUFBQllEQkFBWWdBQUFPUUFBQUFvQUFBQVdBd1FBR0lBQUFEbEFBQUFLQUFBQUZnTUVBQmlBQUFBMHdBQUFCMEFBQUJZREJBQVlnQUFBTlFBQUFBaUFBQUFXQXdRQUdJQUFBQUpBUUFBS1FBQUFGZ01FQUJpQUFBQUVnRUFBQ2tBQUFCWURCQUFZZ0FBQUJrQkFBQXRBQUFBV0F3UUFHSUFBQUFlQVFBQUxRQUFBRmdNRUFCaUFBQUFPQUVBQUNrQUFBQllEQkFBWWdBQUFFZ0JBQUF0QUFBQVdBd1FBR0lBQUFCTkFRQUFMUUFBQUZnTUVBQmlBQUFBVXdFQUFDa0FBQUJZREJBQVlnQUFBTjBCQUFBcEFBQUFXQXdRQUdJQUFBRG1BUUFBS1FBQUFGZ01FQUJpQUFBQTdRRUFBQzBBQUFCWURCQUFZZ0FBQVBJQkFBQXRBQUFBV0F3UUFHSUFBQUFNQWdBQUtRQUFBRmdNRUFCaUFBQUFIQUlBQUMwQUFBQllEQkFBWWdBQUFDRUNBQUF0QUFBQVdBd1FBR0lBQUFBbkFnQUFLUUFBQUZnTUVBQmlBQUFBRHdNQUFBNEFBQUJZREJBQVlnQUFBQkFEQUFBT0FBQUFXQXdRQUdJQUFBQVJBd0FBRGdBQUFGZ01FQUJpQUFBQUVnTUFBQTRBQUFCWURCQUFZZ0FBQUJNREFBQU9BQUFBV0F3UUFHSUFBQUFVQXdBQURnQUFBRmdNRUFCaUFBQUFGUU1BQUE0QUFBQllEQkFBWWdBQUFCWURBQUFPQUFBQVdBd1FBR0lBQUFDNEF3QUFCUUFBQUZnTUVBQmlBQUFBdVFNQUFBVUFBQUJZREJBQVlnQUFBTG9EQUFBRkFBQUFXQXdRQUdJQUFBQzdBd0FBQlFBQUFGZ01FQUJpQUFBQWlRUUFBQklBQUFCWURCQUFZZ0FBQUlrRUFBQTlBQUFBV0F3UUFHSUFBQURDQkFBQUJRQUFBRmdNRUFCaUFBQUF3d1FBQUFVQUFBQllEQkFBWWdBQUFNUUVBQUFGQUFBQVdBd1FBR0lBQUFERkJBQUFCUUFBQUZnTUVBQmlBQUFBeGdRQUFBVUFBQUJZREJBQVlnQUFBTWNFQUFBRkFBQUFXQXdRQUdJQUFBRElCQUFBQlFBQUFGZ01FQUJpQUFBQXlRUUFBQVVBQUFCWURCQUFZZ0FBQUJRRkFBQWlBQUFBV0F3UUFHSUFBQUFVQlFBQUNRQUFBRmdNRUFCaUFBQUFKQVVBQUFVQUFBQUFBQUFBQkFBQUFBUUFBQUFkQVFBQUhnRUFBQXdBQUFBRUFBQUFId0VBQUNBQkFBQWhBUUFBYkdsaWNtRnllUzloYkd4dll5OXpjbU12Y21GM1gzWmxZeTl0YjJRdWNuTUVFUkFBSUFBQUFDNENBQUFSQUFBQWJHbGljbUZ5ZVM5aGJHeHZZeTl6Y21NdmMzUnlhVzVuTG5KekFEUVJFQUFiQUFBQTZBRUFBQmNBUWVpaXdBQUxnUnNCQUFBQUlnRUFBR0VnWm05eWJXRjBkR2x1WnlCMGNtRnBkQ0JwYlhCc1pXMWxiblJoZEdsdmJpQnlaWFIxY201bFpDQmhiaUJsY25KdmNpQjNhR1Z1SUhSb1pTQjFibVJsY214NWFXNW5JSE4wY21WaGJTQmthV1FnYm05MGJHbGljbUZ5ZVM5aGJHeHZZeTl6Y21NdlptMTBMbkp6QUFER0VSQUFHQUFBQUlvQ0FBQU9BQUFBYkdsaWNtRnllUzloYkd4dll5OXpjbU12YzJ4cFkyVXVjbk1BQVBBUkVBQWFBQUFBdmdFQUFCMEFBQUR2djcxemQyRndYM0psYlc5MlpTQnBibVJsZUNBb2FYTWdLU0J6YUc5MWJHUWdZbVVnUENCc1pXNGdLR2x6SUFBZkVoQUFGZ0FBQURVU0VBQVdBQUFBazRvVUFBRUFBQUF1Ym05MFpHVm1NREF4TGpBd01EQXdNUzR3TURFd01ERXVNREF5TURBeExqQXdNMEpzWVdOclFtOXNaRUp2YjJ0TWFXZG9kRTFsWkdsMWJWSmxaM1ZzWVhKU2IyMWhibE5sYldsaWIyeGtBR1FTRUFBSEFBQUFtMzhUQUFVQUFBQ2dmeE1BQmdBQUFLWi9Fd0FJQUFBQXJuOFRBQW9BQUFDNGZ4TUFCZ0FBQUw1L0V3QUhBQUFBeFg4VEFBa0FBQURPZnhNQUNnQUFBTmgvRXdBSkFBQUE0WDhUQUFvQUFBRHJmeE1BQ0FBQUFQTi9Fd0FFQUFBQTkzOFRBQVVBQUFEOGZ4TUFCZ0FBQUFLQUV3QUdBQUFBQ0lBVEFBVUFBQUFOZ0JNQUJBQUFBQkdBRXdBREFBQUFGSUFUQUFNQUFBQVhnQk1BQlFBQUFCeUFFd0FFQUFBQUlJQVRBQVFBQUFBa2dCTUFBd0FBQUNlQUV3QUZBQUFBTElBVEFBVUFBQUF4Z0JNQUJBQUFBRFdBRXdBRkFBQUFPb0FUQUFrQUFBQkRnQk1BQkFBQUFFZUFFd0FGQUFBQVRJQVRBQWNBQUFCVGdCTUFDQUFBQUZ1QUV3QUNBQUFBWFlBVEFBRUFBQUJlZ0JNQUFRQUFBRitBRXdBQkFBQUFZSUFUQUFFQUFBQmhnQk1BQVFBQUFHS0FFd0FCQUFBQVk0QVRBQUVBQUFCa2dCTUFBUUFBQUdXQUV3QUJBQUFBWm9BVEFBRUFBQUJuZ0JNQUFRQUFBR2lBRXdBQkFBQUFhWUFUQUFFQUFBQnFnQk1BQVFBQUFHdUFFd0FCQUFBQWJJQVRBQUVBQUFCdGdCTUFBUUFBQUc2QUV3QUJBQUFBYjRBVEFBRUFBQUJ3Z0JNQUFRQUFBSEdBRXdBQkFBQUFjb0FUQUFFQUFBQnpnQk1BQVFBQUFIU0FFd0FCQUFBQWRZQVRBQUVBQUFCMmdCTUFBUUFBQUhlQUV3QUxBQUFBZ29BVEFBa0FBQUNMZ0JNQURBQUFBSmVBRXdBTEFBQUFvb0FUQUFvQUFBQ3NnQk1BQ1FBQUFMV0FFd0FCQUFBQXRvQVRBQUVBQUFDM2dCTUFBUUFBQUxpQUV3QUJBQUFBdVlBVEFBRUFBQUM2Z0JNQUFRQUFBTHVBRXdBQkFBQUF2SUFUQUFFQUFBQzlnQk1BQVFBQUFMNkFFd0FCQUFBQXY0QVRBQUVBQUFEQWdCTUFBUUFBQU1HQUV3QUJBQUFBd29BVEFBRUFBQUREZ0JNQUFRQUFBTVNBRXdBQkFBQUF4WUFUQUFFQUFBREdnQk1BQVFBQUFNZUFFd0FCQUFBQXlJQVRBQUVBQUFESmdCTUFBUUFBQU1xQUV3QUJBQUFBeTRBVEFBRUFBQURNZ0JNQUFRQUFBTTJBRXdBQkFBQUF6b0FUQUFFQUFBRFBnQk1BQ1FBQUFOaUFFd0FEQUFBQTI0QVRBQW9BQUFEbGdCTUFDZ0FBQU8rQUV3QUtBQUFBK1lBVEFBUUFBQUQ5Z0JNQUNBQUFBQVdCRXdBSUFBQUFEWUVUQUFNQUFBQVFnUk1BQmdBQUFCYUJFd0FIQUFBQUhZRVRBQWdBQUFBbGdSTUFDd0FBQURDQkV3QU1BQUFBUElFVEFBMEFBQUJKZ1JNQURRQUFBRmFCRXdBT0FBQUFaSUVUQUFJQUFBQm1nUk1BQWdBQUFHaUJFd0FHQUFBQWJvRVRBQVlBQUFCMGdSTUFDUUFBQUgyQkV3QU9BQUFBaTRFVEFBa0FBQUNVZ1JNQUJnQUFBSnFCRXdBT0FBQUFxSUVUQUF3QUFBQzBnUk1BRFFBQUFNR0JFd0FPQUFBQXo0RVRBQWdBQUFEWGdSTUFDd0FBQU9LQkV3QU1BQUFBN29FVEFBVUFBQUR6Z1JNQUJRQUFBUGlCRXdBS0FBQUFBb0lUQUFVQUFBQUhnaE1BQmdBQUFBMkNFd0FGQUFBQUVvSVRBQWtBQUFBYmdoTUFDQUFBQUNPQ0V3QUVBQUFBSjRJVEFBY0FBQUF1Z2hNQURBQUFBRHFDRXdBR0FBQUFRSUlUQUFVQUFBQkZnaE1BQmdBQUFFdUNFd0FDQUFBQVRZSVRBQXNBQUFCWWdoTUFCZ0FBQUY2Q0V3QUdBQUFBWklJVEFBSUFBQUJtZ2hNQURBQUFBSEtDRXdBQ0FBQUFkSUlUQUFnQUFBQjhnaE1BQmdBQUFJS0NFd0FHQUFBQWlJSVRBQUlBQUFDS2doTUFDZ0FBQUkrSEV3QUxBQUFBU29jVEFBb0FBQUM1aFJNQUFnQUFBQWlHRXdBSkFBQUFHNFVUQUFNQUFBQXVoaE1BQndBQUFMdUVFd0FKQUFBQS9ZTVRBQVVBQUFCdmhoTUFDZ0FBQU1XQ0V3QUdBQUFBeElRVEFBa0FBQUNZaGhNQUJnQUFBS0NGRXdBRkFBQUEyNFVUQUEwQUFBQ2xoUk1BQ3dBQUFNMkVFd0FLQUFBQUtJY1RBQVVBQUFCNmh4TUFBd0FBQUVhRUV3QUlBQUFBSjRRVEFBMEFBQUJHZ3hNQUNRQUFBRWFGRXdBR0FBQUEwWUlUQUFzQUFBQk1oUk1BQ1FBQUFEcUVFd0FHQUFBQStvWVRBQVVBQUFEdGhoTUFCZ0FBQUI2RkV3QUlBQUFBWElZVEFBWUFBQUIvaEJNQUN3QUFBQ3lERXdBSkFBQUE4SVFUQUFZQUFBQzFoQk1BQmdBQUFDMkhFd0FMQUFBQWxJSVRBQWtBQUFBYmhoTUFCZ0FBQU1tR0V3QUdBQUFBYUlVVEFBWUFBQUNLaFJNQUN3QUFBTENGRXdBSkFBQUFOSVFUQUFZQUFBRC9oaE1BQmdBQUFIbUdFd0FHQUFBQUg0TVRBQVlBQUFEaWdoTUFDd0FBQUErREV3QUpBQUFBbFlVVEFBWUFBQURMZ2hNQUJnQUFBTHlDRXdBSkFBQUFDWVVUQUFZQUFBRGNnaE1BQmdBQUFOT0RFd0FMQUFBQWlvUVRBQWtBQUFCemd4TUFCZ0FBQUZ5REV3QUZBQUFBaTRNVEFBWUFBQURyZ3hNQUNBQUFBSjJDRXdBR0FBQUEvNElUQUFzQUFBQ1RoQk1BQ1FBQUFGV0ZFd0FHQUFBQXFZTVRBQVlBQUFCMGhCTUFDd0FBQUlHRkV3QUpBQUFBdTRVVEFBWUFBQUJKaGhNQUJnQUFBRzZGRXdBR0FBQUFQb1lUQUFzQUFBQlVoeE1BQ1FBQUFKNkdFd0FHQUFBQXo0WVRBQVlBQUFDYmd4TUFCZ0FBQUU2RUV3QUdBQUFBeUlNVEFBc0FBQUJkaHhNQUNRQUFBS3FHRXdBR0FBQUE3WUlUQUFZQUFBQmxoQk1BQ1FBQUFIMkhFd0FHQUFBQWRmMFNBQXNBQUFBU3VoSUFFUUFBQUZYMUVnQU9BQUFBYnZVU0FBNEFBQUIwMXhJQURnQUFBT0t4RWdBS0FBQUFwem9UQUJFQUFBQlhPeE1BRWdBQUFHRm9Fd0FPQUFBQUlqY1RBQTRBQUFDRGVoTUFEQUFBQUswM0V3QUxBQUFBK21nVEFBc0FBQUFpWWhNQURRQUFBRzhDRXdBTUFBQUFUd0FUQUF3QUFBQktWaE1BQ3dBQUFIdFJFd0FOQUFBQUFma1NBQTBBQUFEbExoTUFEQUFBQUxickVnQU5BQUFBVUdJVEFCTUFBQUJCUFJNQURnQUFBS3RFRXdBTkFBQUF3ZDBTQUFrQUFBQks1UklBQ1FBQUFFcm5FZ0FNQUFBQU9mWVNBQWtBQUFDSy9CSUFDUUFBQURjWUV3QUpBQUFBN1NRVEFBa0FBQURFS2hNQUNRQUFBSFl6RXdBSkFBQUFyemdUQUFrQUFBQkNUQk1BQ1FBQUFHRmFFd0FKQUFBQXAyWVRBQWtBQUFCaS9oSUFBZ0FBQUdUK0VnQURBQUFBWi80U0FBTUFBQUJwT2hNQUVRQUFBQlU3RXdBU0FBQUFKclFTQUE4QUFBQmpFQk1BRGdBQUFDYTVFZ0FLQUFBQW43SVNBQVlBQUFBTnN4SUFCZ0FBQUVtMEVnQUdBQUFBTjdVU0FBWUFBQUJ2dHhJQUJnQUFBREc0RWdBR0FBQUFNTGtTQUFZQUFBQUF1aElBQmdBQUFHYTdFZ0FHQUFBQTVyc1NBQVlBQUFEMXZCSUFCZ0FBQUh5OUVnQUdBQUFBMEwwU0FBWUFBQUJSdmhJQUJnQUFBSkxBRWdBR0FBQUFPTUVTQUFZQUFBQlB3UklBQmdBQUFOZkJFZ0FHQUFBQVZzUVNBQVlBQUFCWHhSSUFCZ0FBQUdISEVnQUdBQUFBNmNjU0FBWUFBQUE1eUJJQUJnQUFBRzdJRWdBR0FBQUFIOGtTQUFZQUFBQTl5aElBQmdBQUFOL3FFZ0FOQUFBQU9UY1RBQWtBQUFDdlRCTUFCZ0FBQU9qRUVnQUtBQUFBVi8wU0FBOEFBQUErNXhJQURBQUFBSEc5RWdBTEFBQUFjc01TQUFzQUFBQ0R5UklBQ3dBQUFPUzBFZ0FOQUFBQUE3TVNBQW9BQUFBcHN4SUFDZ0FBQUNPMUVnQU9BQUFBa0wwU0FBc0FBQUNRL2hJQUNnQUFBRHNRRXdBT0FBQUFaYjhTQUFzQUFBQ3N3UklBQ1FBQUFHMnpFZ0FNQUFBQWZFUVRBQkVBQUFBd054TUFDUUFBQUp0aEV3QU1BQUFBNWY4U0FBc0FBQUFKVVJNQURBQUFBT0kzRXdBSUFBQUFPR2tUQUFrQUFBQ2FlaE1BREFBQUFLSUNFd0FNQUFBQWdnQVRBQXdBQUFCNFZoTUFDd0FBQUxOUkV3QU5BQUFBT2ZrU0FBMEFBQUFZTHhNQURBQUFBR3A2RXdBTUFBQUFnemNUQUFzQUFBRFFhQk1BQ3dBQUFQSmhFd0FOQUFBQVFnSVRBQXdBQUFBMkFCTUFEQUFBQUROV0V3QUxBQUFBWUZFVEFBMEFBQURtK0JJQURRQUFBTXd1RXdBTUFBQUFKZWNTQUF3QUFBQTQ5UklBRGdBQUFCazlFd0FPQUFBQWJPc1NBQTBBQUFBL3NoSUFDd0FBQUJLeEVnQUxBQUFBdmJFU0FCQUFBQUNsc2hJQUN3QUFBQjZ5RWdBT0FBQUFsYklTQUFvQUFBQUxzUklBQndBQUFFQ3pFZ0FOQUFBQVZyWVNBQXNBQUFCNHRSSUFDd0FBQVArMUVnQVFBQUFBTWJZU0FBNEFBQURjdWhJQUN3QUFBRUc2RWdBTEFBQUFYN29TQUJBQUFBQ2d1aElBRGdBQUFJZTNFZ0FJQUFBQVY3NFNBQXNBQUFCd3Z4SUFDd0FBQUdtK0VnQUxBQUFBQXI4U0FCQUFBQURId0JJQUN3QUFBRTYvRWdBT0FBQUFZcjRTQUFjQUFBQ0h3QklBQ3dBQUFEakdFZ0FMQUFBQWNNVVNBQXNBQUFDZXhSSUFFQUFBQUNIR0VnQU9BQUFBZE1nU0FBc0FBQURVeEJJQUNnQUFBSnpJRWdBT0FBQUFheElRQUFjQUFBQnlFaEFBQndBQUFIa1NFQUFIQUFBQWdCSVFBQWNBQUFDSEVoQUFCUUFBQUl3U0VBQUVBQUFBa0JJUUFBUUFBQUNVRWhBQUJRQUFBSmtTRUFBR0FBQUFueElRQUFjQUFBQ21FaEFBQlFBQUFLc1NFQUFJQUVHTXZzQUFDMThCQWdNRUJRWUhDQWtLQ3d3TkRnOFFFUklURkJVV0Z4Z1pHaHNjSFI0ZklDRWlJeVFsSmljb0tTb3JMQzB1THpBeE1qTTBOVFkzT0RrNk96dzlQajlBUVVKRFJFVkdSMGhKU2t0TVRVNVBVRkZTVTFSVlZsZFlXVnBiWEYxZVh3QkJqYi9BQUFzd1lHRmlZMlJsWm1kb2FXcHJiRzF1QUc5d2NYSUFjM1IxZG5kNGVYb0Fld0I4Zlg1L2dJR0Nnd0NFaFFDR2g0aUpBRUhOdjhBQUM1OGNpZ0NMQUFBQUFJeU5qbzhBQUFBQUFKQUFBQUNSQUFDU2s1U1ZBQUFBQUM5b2IyMWxMM0oxYm01bGNpOHVZMkZ5WjI4dmNtVm5hWE4wY25rdmMzSmpMMmx1WkdWNExtTnlZWFJsY3k1cGJ5MHhPVFE1WTJZNFl6WmlOV0kxTlRkbUwyTm1aaTF3WVhKelpYSXRNQzR4TGpBdmMzSmpMMlZ1WTI5a2FXNW5Mbkp6QUFEc0h4QUFZZ0FBQUpZQUFBQWxBQUFBN0I4UUFHSUFBQUNjQUFBQUlnQUFBQzlvYjIxbEwzSjFibTVsY2k4dVkyRnlaMjh2Y21WbmFYTjBjbmt2YzNKakwybHVaR1Y0TG1OeVlYUmxjeTVwYnkweE9UUTVZMlk0WXpaaU5XSTFOVGRtTDJObVppMXdZWEp6WlhJdE1DNHhMakF2YzNKakwyUnBZM1F1Y25NQUFIQWdFQUJlQUFBQVlRQUFBQkVBQUFCd0lCQUFYZ0FBQUc4QUFBQVhBQUFBY0NBUUFGNEFBQURlQUFBQUp3QUFBSEFnRUFCZUFBQUE3Z0FBQUEwQUFBQndJQkFBWGdBQUFQRUFBQUFOQUFBQWNDQVFBRjRBQUFENEFBQUFEUUFBQUhBZ0VBQmVBQUFBQUFFQUFBMEFBQUJ3SUJBQVhnQUFBT3NBQUFBTkFBQUFBQUFCQU9VQTVnRG5BT2dBNlFEcUFPc0E3QUR0QU80QURRQU9BQThBWXdEdkFQQUE4UUR5QVBNQTlBRDFBUFlBOXdENEFCc0FIQUQ1QVBvQSt3RDhBUDBBL2dEL0FBQUJBUUVDQVFNQkJBRUZBUVlCQndFSUFRa0JDZ0Z0QUc0QUN3RU1BUTBCRGdFUEFSQUJFUUVTQVJNQkZBRVZBUllCRndFWUFSa0JHZ0ViQVJ3QkhRRWVBUjhCSUFFaEFTSUJJd0VrQVNVQkpnRW5BU2dCS1FFcUFTc0JMQUV0QVM0Qkx3RXdBVEVCTWdFekFUUUJOUUUyQVRjQk9BRTVBVG9CT3dFOEFUMEJQZ0dlQUpzQW93QS9BVUFCUVFGQ0FVTUJSQUZGQVVZQmxnQ2tBS2tBUndGSUFVa0JTZ0ZMQVV3QlRRRk9BVThCVUFGUkFWSUJVd0ZVQVZVQlZnRlhBVmdCV1FGYUFWc0JYQUZkQVY0Qlh3RmdBV0VCWWdGakFXUUJaUUZtQVdjQmFBRnBBV29CYXdGc0FXMEJiZ0Z2QVhBQmNRRnlBWE1CZEFGMUFYWUJkd0Y0QVhrQmVnRUFBQUVBNXdEb0FPc0E3QUR0QU80QURRQU9BQThBWXdEdkFQQUE4UUR5QVBNQTlBRDFBUFlBOXdENEFCc0FIQUQ1QVBvQSt3RDlBUDRBL3dBQUFRRUJBZ0VEQVFRQkJRRUdBUWNCQ0FFSkFRb0JiUUJ1QUFzQkRBRU5BUTRCRUFFc0FTMEJMZ0V4QVRvQk93R2VBSnNBb3dCQUFVRUJRZ0ZEQVVRQlJRRkdBWllBcEFDcEFFY0JTQUZKQVVvQlN3Rk1BVTBCVGdGUEFWQUJVUUZTQVZNQlZBRlZBVllCVndGWUFWa0JXZ0V2YUc5dFpTOXlkVzV1WlhJdkxtTmhjbWR2TDNKbFoybHpkSEo1TDNOeVl5OXBibVJsZUM1amNtRjBaWE11YVc4dE1UazBPV05tT0dNMllqVmlOVFUzWmk5alptWXRjR0Z5YzJWeUxUQXVNUzR3TDNOeVl5OWphR0Z5YzJWMExuSnpBRW9qRUFCaEFBQUFpd0FBQUJrQUFBQktJeEFBWVFBQUFJd0FBQUFaQUFBQVNpTVFBR0VBQUFDVEFBQUFHUUFBQUVvakVBQmhBQUFBbEFBQUFCa0FBQUFBY0FBSEFDMEJBUUVDQVFJQkFVZ0xNQlVRQVdVSEFnWUNBZ0VFSXdFZUcxc0xPZ2tKQVJnRUFRa0JBd0VGS3dNN0NTb1lBU0EzQVFFQkJBZ0VBUU1IQ2dJZEFUb0JBUUVDQkFnQkNRRUtBaG9CQWdJNUFRUUNCQUlDQXdNQkhnSURBUXNDT1FFRUJRRUNCQUVVQWhZR0FRRTZBUUVDQVFRSUFRY0RDZ0llQVRzQkFRRU1BUWtCS0FFREFUY0JBUU1GQXdFRUJ3SUxBaDBCT2dFQ0FnRUJBd01CQkFjQ0N3SWNBamtDQVFFQ0JBZ0JDUUVLQWgwQlNBRUVBUUlEQVFFSUFWRUJBZ2NNQ0dJQkFna0xCMGtDR3dFQkFRRUJOdzRCQlFFQ0JRc0JKQWtCWmdRQkJnRUNBZ0laQWdRREVBUU5BUUlDQmdFUEFRQURBQVFjQXgwQ0hnSkFBZ0VIQ0FFQ0N3a0JMUU1CQVhVQ0lnRjJBd1FDQ1FFR0E5c0NBZ0U2QVFFSEFRRUJBUUlJQmdvQ0FUQWZNUVF3Q2dRREpna01BaUFFQWdZNEFRRUNBd0VCQlRnSUFnS1lBd0VOQVFjRUFRWUJBd0xHUUFBQnd5RUFBNDBCWUNBQUJta0NBQVFCQ2lBQ1VBSUFBUU1CQkFFWkFnVUJsd0lhRWcwQkpnZ1pDd0VCTEFNd0FRSUVBZ0lDQVNRQlF3WUNBZ0lDREFFSUFTOEJNd0VCQXdJQ0JRSUJBU29DQ0FIdUFRSUJCQUVBQVFBUUVCQUFBZ0FCNGdHVkJRQURBUUlGQkNnREJBR2xBZ0FFUVFVQUFrOEVSZ3N4QkhzQk5nOHBBUUlDQ2dNeEJBSUNCd0U5QXlRRkFRZytBUXdDTkFrQkFRZ0VBZ0ZmQXdJRUJnRUNBWjBCQXdnVkFqa0NBUUVCQVF3QkNRRU9Cd01GUXdFQ0JnRUJBZ0VCQXdRREFRRU9BbFVJQWdNQkFSY0JVUUVDQmdFQkFnRUJBZ0VDNndFQ0JBWUNBUUliQWxVSUFnRUJBbW9CQVFFQ0NHVUJBUUVDQkFFRkFBa0JBdlVCQ2dRRUFaQUVBZ0lFQVNBS0tBWUNCQWdCQ1FZQ0F5NE5BUUlBQndFR0FRRlNGZ0lIQVFJQkFub0dBd0VCQWdFSEFRRklBZ01CQVFFQUFnc0NOQVVGQXhjQkFBRUdEd0FNQXdNQUJUc0hBQUUvQkZFQkN3SUFBZ0F1QWhjQUJRTUdDQWdDQng0RWxBTUFOd1F5Q0FFT0FSWUZBUThBQndFUkFnY0JBZ0VGWkFHZ0J3QUJQUVFBQlA0Q0FBZHRCd0JnZ1BBQUFBQUFBQUFCQUFBQUFBQUFBQW9BQUFBQUFBQUFaQUFBQUFBQUFBRG9Bd0FBQUFBQUFCQW5BQUFBQUFBQW9JWUJBQUFBQUFCQVFnOEFBQUFBQUlDV21BQUFBQUFBQU9IMUJRQUFBQUFBeXBvN0FBQUFBQURrQzFRQ0FBQUFBT2gyU0JjQUFBQUFFS1hVNkFBQUFBQ2djazRZQ1FBQUFFQjZFUE5hQUFBQWdNYWtmbzBEQUd4cFluSmhjbmt2WTI5eVpTOXpjbU12Ym5WdEwyUmxZekptYkhRdlpHVmphVzFoYkY5elpYRXVjbk1BWUNjUUFDc0FBQUJXQUFBQUp3QUFBR0FuRUFBckFBQUFpQUFBQUJNQUFBQmdKeEFBS3dBQUFMQUFBQUFnQUFBQVlDY1FBQ3NBQUFESEFBQUFKUUFBQUdBbkVBQXJBQUFBOUFBQUFCVUFBQUJnSnhBQUt3QUFBUDhBQUFBWUFBQUFBQUFBQ0FFSUF3Z0dFQWtRRFJBU0dCY1lIUmdrSUNzZ015QThJRVlvVUNoYktHY3djekNBTUk0NG5EaXJPTHM0ekVEZFFPOUFBa2tWU1NsSlBsRlRVV2xSZ0ZHWVdiQlp5Vm5qWWYxaEdHSTBhbEJxYldxTGFxcHl5WExwY2dwN0szdE5lM0NEazRPM2c5eURBb3dvakUrTWQ1U2ZsTWlVOHB3Y0JSd0ZIQVVjQlFVQ0JRRUNCUVlDQlFNQkFnVUJCUVlDQlFjSUFRSUZBd2tBQmdJRkFRa0ZBd0VDQlFrSEJnVUdBZ1VFQ0FnQ0NBRUNCUUlFQkFFRUFBWUNCUUVDQWdBSEFBTUJBZ1VHQVFBREJRRUZCZ0lGQXdBRkFRY0ZCd2dCQWdVQkJRSUZDQWNJQ1FBR0FnVUhCZ0lKQXdrRUJRTUJBZ1VEQ0FFRUJna0hBZ1lGQmdJRkFRa0FCd01FQ0FZREFnZ0JBZ1VKQlFNR0J3UURBUVlFQUFZQ0JRUUhCZ2dEQndFRkNBSUFBd0VDQlFJRENBUUJDQVVIQ1FFQUFRVUdBZ1VCQVFrQ0FBa0NDQWtGQlFBSENBRUNCUVVKQmdBRUJnUUVCd2NGQXdrQUJnSUZBZ2tJQUFJREFnSURDQWNHQ1FVREFRSUZBUVFKQUFFQkJnRUJDUU1JQkFjR0JRWUNCUWNFQlFBRkNBQUZDUVlKQWdNSUFnZ0JBZ1VEQndJRkFna0FBZ2tJQkFZQkNRRUVBQVlDQlFFSUJnSUdCQVVCQkFrQ0F3QUpCUWNBQXdFQ0JRa0RBUU1DQWdVSEJBWUJCUVFIQ0FVQkJRWUNCUVFHQlFZR0FRSUlCd01BQndjRENRSUZCd2dCQWdVQ0F3SUlBd0FHQkFNR0JRTUlCZ2tHQWdnSkFBWUNCUUVCQmdRQkJRTUNBUWdDQmdrREJBZ0JCQVFGQXdFQ0JRVUlBZ0FIQmdZQUNRRURCQVlIQkFBSEFnSUdCUVlDQlFJSkFRQURDQU1BQkFVR0J3TURCd0FEQmdFREFnZ0JBZ1VCQkFVRkFRa0JCUUlDQ0FNR0JnZ0ZBUWdBQmdZRUFBWUNCUWNDQndVSkJRY0dBUVFCQ0FNRUFnVUpBQU1EQWdBREFRSUZBd1lEQndrSENBZ0FCd0FKQVFjQkFna0ZBUVlHQUFFRkJnSUZBUWdCQ0FrSUNRUUFBd1VFQlFnRkJnUUhCUWdEQUFBSENBRUNCUWtBQ1FRSkJBY0FBUWNIQWdrQ0NBSURCd2tCQlFBRENRQUdBZ1VFQlFRSEJBY0RCUUFJQ0FZRUJnUUJBUWdKQlFjRkFRa0ZBd0VDQlFJQ0J3TUhBd1lIQlFRRUF3SURBZ0FGQ1FRSENBY0ZDUWNHQlFZQ0JRRUJBd1lJQmdnREJ3Y0NBUVlCQmdBQ0NRY0RDUU1IQ1FnSUFnZ0JBZ1VGQmdnRUF3UUJDQWdHQUFnQUNBQUJCQWdHQ1FZSUNRa0VBUVFBQmdJRkFnZ0VBZ0VIQUFrRUF3QUVBQVFBQUFjRUF3UUlCQVFKQndBSEFBTUJBZ1VCQkFJQkFBZ0ZCQWNCQlFJQUFnQUFBd2NCQndRQ0FnUUlCUU1GQVFVR0FnVUhBUUFGQkFJSEF3VUhCZ0FCQUFBQkNBVUlCd0VCQWdRQ0JnY0ZCd2dCQWdVREJRVUNCd0VEQmdjSUNBQUFCUUFBQ1FJSkF3VUZCZ0lCQXdNSENBa0FCZ0lGQVFjSEJnTUZCZ2dEQ1FRQUFBSUZBQVFHQkFZSEJ3Z0JBQVlHQ0FrRUJRTUJBZ1VJQ0FnQkJ3Z0VBUWtIQUFBQkFnVUNBd0lEQXdnSkFBVURBd1FFQndJR0JRWUNCUVFFQkFBSUNRSUFDUWdGQUFBR0FnWUJCZ0VHQ1FRRkFnWUdCd0lEQmdNQ0NBRUNCUUlDQWdBRUJBWUFCQWtDQlFBREFRTUFDQUFJQkFjQ0JnTURBd1lCQ0FFR0JBQUdBZ1VCQVFFQUFnSURBQUlFQmdJRkFRVUdCUVFBQkFJREJnTUJCZ1lJQUFrQUNBSUFBd0VDQlFVRkJRRUJBUVVCQWdNQkFnVUhDQUlIQUFJQkFRZ0JCUWdEQkFBRUJRUUJBQUVGQmdJRkFnY0hCUVVGQndVR0FRVUdBZ2dKQVFNRkFRQUZDUUFIQ1FFSEFBSUNCd0FGQUFjSUFRSUZBUU1JQndjSENBY0lBQWNJQVFRRUJRWUhCUVVDQ1FVRENRVUlCUUVCQXdVQ0JRTUpBQVlDQlFZSkF3Z0lDUU1KQUFNSkFBY0NBZ2dEQndjR0JBY0dDUWNKQWdVRkJnY0dBZ1lKQlFNQkFnVURCQVlKQkFRR0NRVUJDUVVEQmdFRUFRZ0lDQUlEQ0FRSUNRWUNCd2dEQ0FFREJBY0dCUVlDQlFFSEF3UUhBZ01FQndVSkJ3WUlBQWNBQ1FRRUFRRUpBZ1FFQ0FFRENRRUpBQVlIQXdnQ0NBRUNCUWdHQndNR0FRY0RCd2tJQ0FRQUF3VUVCd0lBQlFrR0FnSUVBQVlKQlFrRkF3TUdDUUVFQUFZQ0JRQUFZQ2NRQUNzQUFBQnNBUUFBR3dBQUFHQW5FQUFyQUFBQWNRRUFBQk1BQUFBQUF3WUpEUkFURnhvZElTUW5LeTR4TlRnN0FBQUFnRDhBQUNCQkFBRElRZ0FBZWtRQVFCeEdBRkREUndBa2RFbUFsaGhMSUx5K1RDaHJiazc1QWhWUUFFR0czTUFBQzdJQjhEOEFBQUFBQUFBa1FBQUFBQUFBQUZsQUFBQUFBQUJBajBBQUFBQUFBSWpEUUFBQUFBQUFhdmhBQUFBQUFJQ0VMa0VBQUFBQTBCSmpRUUFBQUFDRTE1ZEJBQUFBQUdYTnpVRUFBQUFnWDZBQ1FnQUFBT2gyU0RkQ0FBQUFvcFFhYlVJQUFFRGxuRENpUWdBQWtCN0V2TlpDQUFBMEp2VnJERU1BZ09BM2VjTkJRd0NnMklWWE5IWkRBTWhPWjIzQnEwTUFQWkZnNUZqaFEwQ010WGdkcnhWRVVPL2kxdVFhUzBTUzFVMEd6L0NBUkFCQmdON0FBQXUwQzJ4cFluSmhjbmt2WTI5eVpTOXpjbU12Ym5WdEwyUmxZekptYkhRdmNHRnljMlV1Y25NQUFBQUFMeEFBSlFBQUFLMEFBQUFUQUFBQWJHbGljbUZ5ZVM5amIzSmxMM055WXk5dWRXMHZaR2w1WDJac2IyRjBMbkp6QUFBQU9DOFFBQ0VBQUFBdUFBQUFDUUFBQUFFQUFBQUtBQUFBWkFBQUFPZ0RBQUFRSndBQW9JWUJBRUJDRHdDQWxwZ0FBT0gxQlFES21qdkJiL0tHSXdBQUFJSHZySVZiUVcwdDdnUUFBQUVmYXI5azdUaHU3WmVuMnZUNVAra0RUeGdBQVQ2VkxnbVozd1A5T0JVUEwrUjBJK3oxejlNSTNBVEUyckROdkJsL002WURKaC9wVGdJQUFBRjhMcGhiaDlPK2NwL1oySWN2RlJMR1VONXJjRzVLencvWWxkVnVjYkltc0diR3JTUTJGUjFhMDBJOERsVC9ZOEJ6VmN3WDcvbGw4aWk4VmZmSDNJRGM3VzcwenUvY1gvZFRCUUJzYVdKeVlYSjVMMk52Y21VdmMzSmpMMjUxYlM5bWJIUXlaR1ZqTDNOMGNtRjBaV2Q1TDJSeVlXZHZiaTV5YzJGemMyVnlkR2x2YmlCbVlXbHNaV1E2SUdRdWJXRnVkQ0ErSURBQU1EQVFBQzhBQUFCMkFBQUFCUUFBQUdGemMyVnlkR2x2YmlCbVlXbHNaV1E2SUdRdWJXbHVkWE1nUGlBd0FBQUFNREFRQUM4QUFBQjNBQUFBQlFBQUFHRnpjMlZ5ZEdsdmJpQm1ZV2xzWldRNklHUXVjR3gxY3lBK0lEQXdNQkFBTHdBQUFIZ0FBQUFGQUFBQU1EQVFBQzhBQUFEQ0FBQUFDUUFBQURBd0VBQXZBQUFBK3dBQUFBMEFBQUF3TUJBQUx3QUFBQUlCQUFBU0FBQUFZWE56WlhKMGFXOXVJR1poYVd4bFpEb2daQzV0WVc1MExtTm9aV05yWldSZmMzVmlLR1F1YldsdWRYTXBMbWx6WDNOdmJXVW9LUUF3TUJBQUx3QUFBSG9BQUFBRkFBQUFZWE56WlhKMGFXOXVJR1poYVd4bFpEb2daQzV0WVc1MExtTm9aV05yWldSZllXUmtLR1F1Y0d4MWN5a3VhWE5mYzI5dFpTZ3BBQUF3TUJBQUx3QUFBSGtBQUFBRkFBQUFNREFRQUM4QUFBQUxBUUFBQlFBQUFEQXdFQUF2QUFBQURBRUFBQVVBQUFBd01CQUFMd0FBQUEwQkFBQUZBQUFBTURBUUFDOEFBQUJ5QVFBQUpBQUFBREF3RUFBdkFBQUFkd0VBQUM4QUFBQXdNQkFBTHdBQUFJUUJBQUFTQUFBQU1EQVFBQzhBQUFCbUFRQUFEUUFBQURBd0VBQXZBQUFBVEFFQUFDSUFBQUF3TUJBQUx3QUFBQThCQUFBRkFBQUFNREFRQUM4QUFBQU9BUUFBQlFBQUFOOUZHajBEenhybXdmdk0vZ0FBQUFES3hwckhGLzV3cTl6NzFQNEFBQUFBVDl5OHZ2eXhkLy8yKzl6K0FBQUFBQXpXYTBIdmtWYStFZnprL2dBQUFBQTgvSCtRclIvUWpTejg3UDRBQUFBQWc1cFZNU2hjVWRORy9QVCtBQUFBQUxYSnBxMlBySEdkWWZ6OC9nQUFBQURMaSs0amR5S2M2bnY4QlA4QUFBQUFiVk40UUpGSnpLNlcvQXovQUFBQUFGZk90bDE1RWp5Q3Nmd1Uvd0FBQUFBM1Z2dE5OcFFRd3N2OEhQOEFBQUFBVDVoSU9HL3FscERtL0NUL0FBQUFBTWM2Z2lYTGhYVFhBUDBzL3dBQUFBRDBsNytYemMrR29CdjlOUDhBQUFBQTVhd3FGNWdLTk84MS9Uei9BQUFBQUk2eU5Tcjdaeml5VVAxRS93QUFBQUE3UDhiUzM5VEloR3Y5VFA4QUFBQUF1czNUR2lkRTNjV0YvVlQvQUFBQUFKYkpKYnZPbjJ1VG9QMWMvd0FBQUFDRXBXSjlKR3lzMjdyOVpQOEFBQUFBOXRwZkRWaG1xNlBWL1d6L0FBQUFBQ2J4dzk2VCtPTHo3LzEwL3dBQUFBQzRnUCtxcUsyMXRRcitmUDhBQUFBQWkwcDhiQVZmWW9jbC9vVC9BQUFBQUZNd3dUUmcvN3pKUC82TS93QUFBQUJWSnJxUmpJVk9sbHIrbFA4QUFBQUF2WDRwY0NSMytkOTAvcHovQUFBQUFJKzQ1YmlmdmQrbWovNmsvd0FBQUFDVWZYU0l6MStwK0tuK3JQOEFBQUFBejV1b2o1TndSTG5FL3JUL0FBQUFBR3NWRDcvNDhBaUszLzY4L3dBQUFBQzJNVEZsVlNXd3pmbit4UDhBQUFBQXJIOTcwTWJpUDVrVS84ei9BQUFBQUFZN0t5ckVFRnprTHYvVS93QUFBQURUa25OcG1TUWtxa24vM1A4QUFBQUFEc29BZy9LMWgvMWovK1QvQUFBQUFPc2FFWkprQ09XOGZ2L3Mvd0FBQUFETWlGQnZDY3k4akpuLzlQOEFBQUFBTEdVWjRsZ1h0OUd6Ly96L0FFRys2Y0FBQ3dWQW5NNy9CQUJCek9uQUFBdlhFeENsMU9qby93d0FBQUFBQUFBQVlxekY2M2l0QXdBVUFBQUFBQUNFQ1pUNGVEay9nUjRBSEFBQUFBQUFzeFVIeVh2T2w4QTRBQ1FBQUFBQUFIQmM2bnZPTW42UFV3QXNBQUFBQUFCb2dPbXJwRGpTMVcwQU5BQUFBQUFBUlNLYUZ5WW5UNStJQUR3QUFBQUFBQ2Y3eE5ReG9tUHRvZ0JFQUFBQUFBQ29yY2lNT0dYZXNMMEFUQUFBQUFBQTIyV3JHbzRJeDRQWUFGUUFBQUFBQUpvZGNVTDVIVjNFOGdCY0FBQUFBQUJZNXh1bUxHbE5rZzBCWkFBQUFBQUE2bzF3R21UdUFkb25BV3dBQUFBQUFFcDM3NXFabzIyaVFnRjBBQUFBQUFDRmEzMjBlM2dKOGx3QmZBQUFBQUFBZHhqZGVhSGtWTFIzQVlRQUFBQUFBTUxGbTF1U2hsdUdrZ0dNQUFBQUFBQTlYWmJJeFZNMXlLd0JsQUFBQUFBQXM2Q1grbHkwS3BYSEFad0FBQUFBQU9OZm9KbTluMGJlNFFHa0FBQUFBQUFsakRuYk5NS2JwZndCckFBQUFBQUFYSitZbzNLYXh2WVdBclFBQUFBQUFNNis2VlJUdjl5M01RSzhBQUFBQUFEaVFTTHlGL1A4aUV3Q3hBQUFBQUFBcFhoYzA1dk9JTXhtQXN3QUFBQUFBTjlUSVh2eldoYVlnUUxVQUFBQUFBQTZNQitYM0xXZzRwc0MzQUFBQUFBQWxyUGpYRlBSMmFpMkF1UUFBQUFBQUR4RXA2VFpmSnY3MEFMc0FBQUFBQUFRUktTblRFeDJ1K3NDOUFBQUFBQUFHcHhBdHUrT3E0c0dBL3dBQUFBQUFDeUVWNllRN3gvUUlBTUVBUUFBQUFBcE1aSHA1YVFRbXpzRERBRUFBQUFBblF5Y29mdWJFT2RWQXhRQkFBQUFBQ24wTzJMWklDaXNjQU1jQVFBQUFBQ0Z6NmQ2WGt0RWdJc0RKQUVBQUFBQUxkMnNBMERrSWIrbEF5d0JBQUFBQUkvL1JGNHZuR2VPd0FNMEFRQUFBQUJCdUl5Y25SY3oxTm9EUEFFQUFBQUFxUnZqdEpMYkdaNzFBMFFCQUFBQUFObDMzN3B1djVickR3Uk1BUUFBQUFCc2FXSnlZWEo1TDJOdmNtVXZjM0pqTDI1MWJTOW1iSFF5WkdWakwzTjBjbUYwWldkNUwyZHlhWE4xTG5KekFBQllOeEFBTGdBQUFIMEFBQUFWQUFBQVdEY1FBQzRBQUFDcEFBQUFCUUFBQUZnM0VBQXVBQUFBcWdBQUFBVUFBQUJZTnhBQUxnQUFBS3NBQUFBRkFBQUFZWE56WlhKMGFXOXVJR1poYVd4bFpEb2daQzV0WVc1MElDc2daQzV3YkhWeklEd2dLREVnUER3Z05qRXBBQUFBV0RjUUFDNEFBQUN2QUFBQUJRQUFBRmczRUFBdUFBQUFDZ0VBQUJFQUFBQllOeEFBTGdBQUFFQUJBQUFKQUFBQVdEY1FBQzRBQUFDdEFBQUFCUUFBQUZnM0VBQXVBQUFBckFBQUFBVUFBQUJoYzNObGNuUnBiMjRnWm1GcGJHVmtPaUFoWW5WbUxtbHpYMlZ0Y0hSNUtDa0FBQUJZTnhBQUxnQUFBTndCQUFBRkFBQUFZWE56WlhKMGFXOXVJR1poYVd4bFpEb2daQzV0WVc1MElEd2dLREVnUER3Z05qRXBXRGNRQUM0QUFBRGRBUUFBQlFBQUFGZzNFQUF1QUFBQU13SUFBQkVBQUFCWU54QUFMZ0FBQUd3Q0FBQUpBQUFBV0RjUUFDNEFBQURqQWdBQUpnQUFBRmczRUFBdUFBQUE3d0lBQUNZQUFBQllOeEFBTGdBQUFNd0NBQUFtQUFBQWJHbGljbUZ5ZVM5amIzSmxMM055WXk5dWRXMHZabXgwTW1SbFl5OXRiMlF1Y25NQUFEa1FBQ01BQUFDN0FBQUFCUUFBQUdGemMyVnlkR2x2YmlCbVlXbHNaV1E2SUdKMVpsc3dYU0ErSUdJbk1DY0FBRGtRQUNNQUFBQzhBQUFBQlFBQUFEQXVBQUFBT1JBQUl3QUFBQW9CQUFBRkFBQUFBRGtRQUNNQUFBQUxBUUFBQlFBQUFHVXRMU3RPWVU1cGJtWXdNR1V3WVhOelpYSjBhVzl1SUdaaGFXeGxaRG9nWW5WbUxteGxiaWdwSUQ0OUlHMWhlR3hsYmdBQU9SQUFJd0FBQUg0Q0FBQU5BQUFBYjNWMElHOW1JSEpoYm1kbElHbHVkR1ZuY21Gc0lIUjVjR1VnWTI5dWRtVnljMmx2YmlCaGRIUmxiWEIwWldRdUxqQXhNak0wTlRZM09EbGhZbU5rWldaallXeHNaV1FnWUU5d2RHbHZiam82ZFc1M2NtRndLQ2xnSUc5dUlHRWdZRTV2Ym1WZ0lIWmhiSFZsMklVU0FBNEFBQUJwYm1SbGVDQnZkWFFnYjJZZ1ltOTFibVJ6T2lCMGFHVWdiR1Z1SUdseklDQmlkWFFnZEdobElHbHVaR1Y0SUdseklBQUFRRG9RQUNBQUFBQmdPaEFBRWdBQUFBQUFBQUFFQUFBQUJBQUFBQ01CQUFBOVBXRnpjMlZ5ZEdsdmJpQmdiR1ZtZENBZ2NtbG5hSFJnSUdaaGFXeGxaQW9nSUd4bFpuUTZJQW9nY21sbmFIUTZJQUFBbGpvUUFCQUFBQUNtT2hBQUZ3QUFBTDA2RUFBSkFBQUFJSEpwWjJoMFlDQm1ZV2xzWldRNklBb2dJR3hsWm5RNklBQUFBSlk2RUFBUUFBQUE0RG9RQUJBQUFBRHdPaEFBQ1FBQUFMMDZFQUFKQUFBQU9pQUFBQUVBQUFBQUFBQUFIRHNRQUFJQUFBQUFBQUFBREFBQUFBUUFBQUFrQVFBQUpRRUFBQ1lCQUFBZ0lDQWdJSHNnTENBZ2V3b3NDbjBnZlNnS0xEQjRNREF3TVRBeU1ETXdOREExTURZd056QTRNRGt4TURFeE1USXhNekUwTVRVeE5qRTNNVGd4T1RJd01qRXlNakl6TWpReU5USTJNamN5T0RJNU16QXpNVE15TXpNek5ETTFNell6TnpNNE16azBNRFF4TkRJME16UTBORFUwTmpRM05EZzBPVFV3TlRFMU1qVXpOVFExTlRVMk5UYzFPRFU1TmpBMk1UWXlOak0yTkRZMU5qWTJOelk0TmprM01EY3hOekkzTXpjME56VTNOamMzTnpnM09UZ3dPREU0TWpnek9EUTROVGcyT0RjNE9EZzVPVEE1TVRreU9UTTVORGsxT1RZNU56azRPVGt3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3YkdsaWNtRnllUzlqYjNKbEwzTnlZeTltYlhRdmJXOWtMbkp6WVc0Z1pYSnliM0lnYjJOamRYSnlaV1FnZDJobGJpQm1iM0p0WVhSMGFXNW5JR0Z1SUdGeVozVnRaVzUwQUFCbVBCQUFHd0FBQUprS0FBQW1BQUFBWmp3UUFCc0FBQUNpQ2dBQUdnQUFBSFZ6WlhJdGNISnZkbWxrWldRZ1kyOXRjR0Z5YVhOdmJpQm1kVzVqZEdsdmJpQmtiMlZ6SUc1dmRDQmpiM0p5WldOMGJIa2dhVzF3YkdWdFpXNTBJR0VnZEc5MFlXd2diM0prWlhMUVBCQUFUQUFBQUd4cFluSmhjbmt2WTI5eVpTOXpjbU12YzJ4cFkyVXZjMjl5ZEM5emFHRnlaV1F2YzIxaGJHeHpiM0owTG5KekFDUTlFQUF2QUFBQVhBTUFBQVVBQUFCaGRIUmxiWEIwWldRZ2RHOGdhVzVrWlhnZ2MyeHBZMlVnZFhBZ2RHOGdiV0Y0YVcxMWJTQjFjMmw2WldROUVBQXNBQUFBYVc1MllXeHBaQ0IxZEdZdE9DQnpaWEYxWlc1alpTQnZaaUFnWW5sMFpYTWdabkp2YlNCcGJtUmxlQ0NZUFJBQUdnQUFBTEk5RUFBU0FBQUFhVzVqYjIxd2JHVjBaU0IxZEdZdE9DQmllWFJsSUhObGNYVmxibU5sSUdaeWIyMGdhVzVrWlhnZ0FBRFVQUkFBS2dBQUFHeHBZbkpoY25rdlkyOXlaUzl6Y21NdmMzUnlMMjF2WkM1eWN3RUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBRUhsL2NBQUN6TUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lEQXdNREF3TURBd01EQXdNREF3TURCQVFFQkFRQVFhUCt3QUFMdlRwc2FXSnlZWEo1TDJOdmNtVXZjM0pqTDNOMGNpOXdZWFIwWlhKdUxuSnpBQUFqUHhBQUh3QUFBSEVGQUFBU0FBQUFJejhRQUI4QUFBQnhCUUFBS0FBQUFDTS9FQUFmQUFBQVpBWUFBQlVBQUFBalB4QUFId0FBQUpJR0FBQVZBQUFBSXo4UUFCOEFBQUNUQmdBQUZRQUFBRnN1TGk1ZFltVm5hVzRnUEQwZ1pXNWtJQ2dnUEQwZ0tTQjNhR1Z1SUhOc2FXTnBibWNnWUFDWlB4QUFEZ0FBQUtjL0VBQUVBQUFBcXo4UUFCQUFBQUJHanhRQUFRQUFBR0o1ZEdVZ2FXNWtaWGdnSUdseklHNXZkQ0JoSUdOb1lYSWdZbTkxYm1SaGNuazdJR2wwSUdseklHbHVjMmxrWlNBZ0tHSjVkR1Z6SUNrZ2IyWWdZQURjUHhBQUN3QUFBT2MvRUFBbUFBQUFEVUFRQUFnQUFBQVZRQkFBQmdBQUFFYVBGQUFCQUFBQUlHbHpJRzkxZENCdlppQmliM1Z1WkhNZ2IyWWdZQUFBM0Q4UUFBc0FBQUJFUUJBQUZnQUFBRWFQRkFBQkFBQUFDRDRRQUJzQUFBQ2VBUUFBTEFBQUFHeHBZbkpoY25rdlkyOXlaUzl6Y21NdmRXNXBZMjlrWlM5d2NtbHVkR0ZpYkdVdWNuTUFBQUNFUUJBQUpRQUFBQm9BQUFBMkFBQUFoRUFRQUNVQUFBQUtBQUFBS3dBQUFBQUdBUUVEQVFRQ0JRY0hBZ2dJQ1FJS0JRc0NEZ1FRQVJFQ0VnVVRIQlFCRlFJWEFoa05IQVVkQ0I4QkpBRnFCR3NDcndPeEFyd0N6d0xSQXRRTTFRbldBdGNDMmdIZ0JlRUM1d1RvQXU0ZzhBVDRBdm9FK3dFTUp6cytUaytQbnA2ZmU0dVRscUt5dW9heEJnY0pOajArVnZQUTBRUVVHRFkzVmxkL3FxNnZ2VFhnRW9lSmpwNEVEUTRSRWlreE5EcEZSa2xLVGs5a1pZcU1qWSsyd2NQRXhzdldYTGEzR3h3SENBb0xGQmMyT1Rxb3FkalpDVGVRa2FnSENqcytabW1Qa2hGdlg3L3U3MXBpOVB6L1UxU2FteTR2SnloVm5hQ2hvNlNucUsyNnZNUUdDd3dWSFRvL1JWR21wOHpOb0FjWkdpSWxQai9uN08vL3hjWUVJQ01sSmlnek9EcElTa3hRVTFWV1dGcGNYbUJqWldacmMzaDlmNHFrcXErd3dOQ3VyMjV2M2Q2VFhpSjdCUU1FTFFObUF3RXZMb0NDSFFNeER4d0VKQWtlQlNzRlJBUU9Lb0NxQmlRRUpBUW9DRFFMVGdNMERJRTNDUllLQ0JnN1JUa0RZd2dKTUJZRklRTWJCUUZBT0FSTEJTOEVDZ2NKQjBBZ0p3UU1DVFlET2dVYUJ3UU1CMUJKTnpNTk13Y3VDQW9HSmdNZENBS0EwRklRQXpjc0NDb1dHaVljRkJjSlRnUWtDVVFOR1FjS0JrZ0lKd2wxQzBJK0tnWTdCUW9HVVFZQkJSQURCUXRaQ0FJZFloNUlDQXFBcGw0aVJRc0tCZzBUT2dZS0JoUWNMQVFYZ0xrOFpGTU1TQWtLUmtVYlNBaFREVWtIQ29DMklnNEtCa1lLSFFOSFNUY0REZ2dLQmprSENvRTJHUWM3QXgxVkFROHlEWU9iWm5VTGdNU0tUR01OaERBUUZncVBtd1dDUjVxNU9vYkdnamtIS2dSY0JpWUtSZ29vQlJPQnNEcUF4bHRsU3dRNUJ4RkFCUXNDRHBmNENJVFdLUXFpNTRFekR3RWRCZzRFQ0lHTWlRUnJCUTBEQ1FjUWoyQ0ErZ2FCdEV4SENYUThnUFlLY3dod0ZVWjZGQXdVREZjSkdZQ0hnVWNEaFVJUEZZUlFId1lHZ05VckJUNGhBWEF0QXhvRUFvRkFIeEU2QlFHQjBDcUExaXNFQVlIZ2dQY3BUQVFLQkFLREVVUk1QWURDUEFZQkJGVUZHelFDZ1E0c0JHUU1WZ3FBcmpnZERTd0VDUWNDRGdhQW1vUFlCQkVERFFOM0JGOEdEQVFCRHd3RU9BZ0tCaWdJTEFRQ1BvRlVEQjBEQ2dVNEJ4d0dDUWVBK29RR0FBRURCUVVHQmdJSEJnZ0hDUkVLSEFzWkRCb05FQTRNRHdRUUF4SVNFd2tXQVJjRUdBRVpBeG9IR3dFY0FoOFdJQU1yQXkwTExnRXdCREVDTWdHbkJLa0NxZ1NyQ1BvQyt3WDlBdjREL3dtdGVIbUxqYUl3VjFpTGpKQWMzUTRQUzB6Ny9DNHZQMXhkWCtLRWpZNlJrcW14dXJ2RnhzbkszdVRsL3dBRUVSSXBNVFEzT2pzOVNVcGRoSTZTcWJHMHVydkd5czdQNU9VQUJBME9FUklwTVRRNk8wVkdTVXBlWkdXRWtadWR5YzdQRFJFcE9qdEZTVmRiWEY1ZlpHV05rYW0wdXJ2RnlkL2s1ZkFORVVWSlpHV0FoTEs4dnIvVjEvRHhnNFdMcEthK3Y4WEh6OXJiU0ppOXpjYk96MGxPVDFkWlhsK0pqbyt4dHJlL3djYkgxeEVXRjF0Yzl2ZisvNEJ0Y2Q3ZkRoOXVieHdkWDMxK3JxOU51N3dXRng0ZlJrZE9UMWhhWEY1K2Y3WEYxTlhjOFBIMWNuT1BkSFdXSmk0dnA2KzN2OGZQMTkrYUFFQ1htRENQSDg3UDB0VE8vMDVQV2xzSENBOFFKeS91NzI1dk56MC9Ra1dRa1ZObmRjakowTkhZMmVmKy93QWdYeUtDM3dTQ1JBZ2JCQVlSZ2F3T2dLc0ZId2lCSEFNWkNBRUVMd1EwQkFjREFRY0dCeEVLVUE4U0IxVUhBd1FjQ2drRENBTUhBd0lEQXdNTUJBVURDd1lCRGhVRlRnY2JCMWNIQWdZWERGQUVRd010QXdFRUVRWVBERG9FSFNWZklHMEVhaVdBeUFXQ3NBTWFCb0w5QTFrSEZna1lDUlFNRkF4cUJnb0dHZ1paQnlzRlJnb3NCQXdFQVFNeEN5d0VHZ1lMQTRDc0Jnb0dMekdBOUFnOEF3OERQZ1U0Q0NzRmd2OFJHQWd2RVMwRElROGhENENNQklLYUZnc1ZpSlFGTHdVN0J3SU9HQW1BdmlKMERJRFdHb0VRQllEaENmS2VBemNKZ1Z3VWdMZ0lnTjBWT3dNS0JqZ0lSZ2dNQm5RTEhnTmFCRmtKZ0lNWUhBb1dDVXdFZ0lvR3E2UU1Gd1F4b1FTQjJpWUhEQVVGZ0tZUWdmVUhBU0FxQmt3RWdJMEVnTDRER3dNUERXeHBZbkpoY25rdlkyOXlaUzl6Y21NdmJuVnRMMkpwWjI1MWJTNXljd0IxUmhBQUhnQUFBS3NCQUFBQkFBQUFZWE56WlhKMGFXOXVJR1poYVd4bFpEb2dibTlpYjNKeWIzZGhjM05sY25ScGIyNGdabUZwYkdWa09pQmthV2RwZEhNZ1BDQTBNR0Z6YzJWeWRHbHZiaUJtWVdsc1pXUTZJRzkwYUdWeUlENGdNQUFBV3RZN2t0WlQ5TzQvTzZFR0thby9FZmhsWlJ0bXRGaVZCOFVrcEZuS3gwcDJ2ejZpZitHdXVrbjJMUTN3dkhsZFUyL09pdCtaV3VuY2Mza1FMQ3pZOUpRRndiWXJvTmlSYWVoTGlwc2JCM241Um5Ha05zaE90b1RpM215QzRraVh0NWlOVFVSNjR1TWxteFlJSXhzYi9YSi9lTEJxakcyTzl5QU81Zlh3TVA1UG41WmNoZThJc2pXcFVWNHpMYjI5STBlOHMyWXJpOTZDRStZMWdIZ3NyWGFzVlRBZyt4YUxNY3l2SVZETE8weVRGMnM4NkxuY3JUMi9HeW9rdmtyZmVOMkZTMkxvVTlrTnI2STByVzBkMTJ1cU0yODljZFNIYUszbFFJeGtjb1lHbFFETGpJM0pxY0lZSDFHdi9RNW9TTHJBL2Uvd085VHkzbVlsRzcwU0FtMTBtUDZWZHFXRVYwdGc5ekMyU3dHSWtUNStPOVRPcFMxZU9EVzlvNTVCNmpYT1hVcUpRcys1ZFlhQ3JFd0dVckxob0hyT2xZbUJrd21VMGV2dlEzTWZHa2taUXZ2cm9mZ0wrY1htNnhRUXBtQ2JueEw2WnNyMlRuZDM0Q1lhMU5BNGdrZVh1QUQ5dENKVmxaaXdJSW1DWTdHTVhuTWduckExVlYxZmJyUlZZcnpkTHphUXFNVWRnNm8wOTRraDYzc3IxYnREdEJMMzVDUFZBWFhzNmFVdE8yVlZxckJybW00MkpTSEpNN0pIK0ltKzZ0U2NCc0VLaEc1cHU4Q2VtWFlzYmlVS1JFanhEU1hLUStwd0JzREsyMlJYaGlyTmxpaFhYbXFTQmdRNHZCSSs3U2QxZ0x6eTdQVUVOd2dGeG11WGplaHhrcURyTG1nenhrUktodmVqZmxneGgxdEVreDBoNFB0cTdyTjZUSjZ1L1doeUZiaGtLZGk2QmVwZ1dkOUZHajBEenhybXZUT09LWWNrdVcrcmF6QUdZc0hRajFiZytIblV0dE9sbG9hOGg3cnh4TE5zR0hlWWlhUklqenlvcXlrcExyYmdoOTZVL3F2TkdqTWxTUXU2MmR4eGpCUUxIWCtMd1BDZmJ4dU9LQkJVanEvWlRlUmVydkRzQjBxaXNUSVU2WEhiVUdHZDl0a3M2TWx1QmErZnJERW5pZEpjSWpvSUhERyt5c2FheHhmK2NLc0c5S3BJQ21POWJYMTRnYm1kUFUzV0NMSFYyc3k3TEFsTzYvQ1Rna2J3aGFXT3hRaGc5YnNsSVNidE9DTlliS2RPOHZZS3VQSXFyNnB2S0Fjc2JrZlI0YTYwRFdhdjlScktSWG1FMjZUTWdrM3RrTWlmamRsUVBKZVhaUkxPZjZPZ0tMVzZCL0VQNVF4OS9mNld3Vi9NeUhKaXFVbnRVeDVQM0x5Ky9MRjMvM29QdXhPYzZPZ2xzUWsyOXozUHFwK3M2VlNNWVpHeGR4Mk1BM1VOZzVYSEZ5UnE3N24xbmRVbGIwVFMwT042K1IydFJHc29jd1ZMZDhWcWcyTE83SnN5N0FwRCtXZmpUdFYyUlNUN0FlakNQNmZOay9kQm5DS0sxRmJ0ZVFLaTh3OFJ3WGgxVWtOcjFrUldOSXhCUlppcHFuaHJpUk1LZ3d6V2EwSHZrVmErVTlWV3htdVl6Q09QeThZUmF6YnM3YWlLN0xlR3ZyOHNPVDhjNndLaXM1U3Axdk15Rk5mM2V3ZFA0NldEaXVDNVU4eXdQOW5NOWRySklseVBKSzFZNkdqL25JOFBRTFBSdnBXWjJUWnNONUdoSDhLNUNRZ1FJeTM3LzQ5RVI0VzFpcWN5S0F3SzFLdjUrZit6RlpubTRteFJQektQRE1rV08veC9rSzBmMEkzamttZC8yYWM5cmtyN24vU1lKMFN4bkhkQjM4OFJ6WmtkK3NjeGZ6R1YzWVBWRWRkRFZrQkFVdndjZis4K2ZZcHlKV3RtNmpVb1NHWTc1RjZyamh5dHorNEZBR1ZETXRwQVNwMDJWckpqMklKcUIwQSsxTDZRYUU0aTRuVlBQb2VSb2dUb3BrUjNXZ0xpcWxwVDR3MnBOc3NGb3RBVkZYR0RtbFV4S0Z4UjB3TStoOHBFVzFvTmtZRFZIcG5aRW9UQ2hwVCtDbmxZNkxiZ2ltYi9qeGVsY3FnNXZrMlhibUxqbUMxQS8zTmR6bzhTeUMwaFBRcjdqbjhjaUg5bytvQ1pDNTI4TkdibWZIS2ZJMnFmQWptaGdFN0U2OEgvSHh4T2g2eEVSME9IeVNCaXRXYXkveWVqSXFuWEZSa1U2ZnVvdW1JQW4vL3hTN1hKcHEyUHJIR2RxYlE5WU1NL2QyOGlmQkNac3hmT3hOTWhUVGkwRDFYTEs1dFVmNkNkQWZaSWFtQkdvVk1xZnZ2Z2xFK0VBc0daYlVMOHkwUjAyaTQ1R1hwakpVTXh3QWhUKy81VkVaSDZpSjlZdk82VFBmREtKN3ArcTFVMWViVmp0elYxZkNhVzNsZzBMNHRWd1V1aVBDV0RraHV3dXhadkFmdnRxckdleTR2dUkzY2luT3JjeXNGNXFSVmVSbDhYZFhhS2xhR1N5UjRaN0luTitnczJYUklVN2ZwSnQzdG1IMmZzZ1BuT2hQUVdXYWg1SE9VYVFPZUFKK0czZ3RKWXJqY0p6REdQRUlpUXNManNzdEVINzVtRkN6LytzaFdxdE56bXB4K0d5V29BWjg3T3ZkK2ExT0dUNEpHblo3MUNZQUJCb2RhTDRDUnRYQ3k3eU9CdFUzaEFrVW5NcmhodWlIUDM2ZnBZU0dpV2tQVmJmOXFlaVdwUWRhUTVyeTBCWG5wNW1ZK0lBNVpDVXNrR2hHMTRnZlhZMTMrenFvTTcwNlo3Q09YSTF1RXl6ODFmWU5Wa0NvaVFta29lK3liTmY2SGdPMXlGZndaVm1xRHU4bHh2d04vSjJFcXpwaDVJNnNCSXFpLzBpN0JYL0k0ZFlOQW0yaVR4MnBRNzhWZk90bDE1RWp5Q1dBaTMxZ2c5eFhidGdTUzFGeGZMb203S1pBeExqSFpVYUtKdG90M2NmY3NKL1gzUFhTK1VxUUlMQ1FzVlZGMytUSHhkUXpVNytkUGhwdVVtalZUNm5xOXRHa29CeFh2RW1oQ2ZjTERwdU1ZYkNhR2NRYmFhTmNEVXhvd2NKR2Y0WWt2SkE5SmpBY1A0UlB6WGtYWkFteDNQWFVKajN1QjVObGI3VFRhVUVNTGtRdlVTL0JWWm1NUXJldUZEdVpUeW5aT3lGM3RiYno1YVcreHN5dk9jbDBLY3orNHNtUVduTVhJbkNMMHdoTDFUZzRNcWVQL0dVTDFPTVVyc1BPWHNLR1FrTlZhLytLUTIwVjZ1RTBZUGxKbStOdUdWZHh1SGhJWDJtWmdYRTdrL2JvUlplMVhpS09VbWRNQiszVmZuejRubEw5cnFHak5QbUVnNGIrcVdrQ0YyNzEzSTB2QS9ZNzVhQmd1bHZMU3BVMnQxZWdmdEQvdHQ4Y2ROenV2aGxDakdFbGxKNk5POTVQYWM4R0F6alZ6WnU2dlhMWEZrN0owMHhDdzVnTEN6ejZxV1RYbU52V2ZGUWZWM1I2RGNvSU5WL0tEWDhPeGdHMG41cWl6a2lVUnl0WjNFaGhiME9XS2J0OVUzWGF6VnppTEZkU2djTWNjNmdpWExoWFRYaTRKck5wTXlZMzI4WkhIM250T29ocGN4QXdLYy8xMnU2NzFOdFlZSVU2ajgvWU1DZzMvMTJXWXRvV0tveW1mU2UvMGt3MlBmY3RCZ3ZLUTlxZDZBZzIwZTkxbWV5MGRDZU9zTmpWTVdZYVFJNW5Ud2hiN1pVbFptVVhEb1czbk5peCtTYkNjdWtHZjIzekpHY2RscmdMWlQyNlBZSExvQTg1ZS9sODNQaHFDa0tOTE1EcVRvZ1BCOXIvM0FnNmpJemJJR2dCTE5JbUZzWFJzOXNhVFMrb0ZmQ0NCWGdHdDVZeG94eHU2bXc1eXdPd1YwTmpEankveGd2WGVxa1BURG5Jb0dFVVQ4Mjc0N3Vhd1YxYlR4OUVRdFNCVlYrNUx1eGZPTExRVVJGNWxLSEUwdEZkMGJkYmJ3N25oRzFWeS9YV09nZUZyVVl0TGtyQ29YbUFvMDd6Ujh5Qlp4aWZ1R0RxeDZEcCtHZ0pXZ1RUMnU1alZkMUJKWEdkSkdxT0M2Q2FITVdXQ0RkSW5YckorR1dOS1k2VXZKUDNBNHBORXJCc3dqVkhlRC81SFAzU2RHb3daamV3aS9MQ2xWWkgrMlF0V3hGMHpJT3hySzduZHphajBmNUpOS25oMWZ1c29nUHZVcWlHS0drNDZjN29KeWU3UitWSTJ5TlNyN1p6aXlRNm9qVDVwaG51a3hIOFAwK1lIRzN0U1U3T0lBK2dWa2Z2UDVPRHdSUElzRTNkT05RTHlEM2w1d09FZUxGUXV1UmRSSXNWQ3JKSloyakFZWjd0cU4yVmNKbTkwazFxMDd5UmVrejlTbytJZlc1WUFLMTZWTTVid2RqUU1LMC9hcFRCOGh6VXpQbjE0clpYQ0V6SWQwMUI5bmFRQWd3MGQyT3ovRzB0L1V5SVJ6NEVFQTlObnNLUW5QZDhjWEN2dWxrRmhTQUhFUWFQVE13bFc1bmN4NXo3VHVaa0NORklKeHY1blZrK0lmcklFd1ZVQkkyRXp4eGk4QXl6amJKeGVpZkdwUVdnNmdyYmc3d1AwRzB2R2N5aHlGNVBBUkNObW1TakM5aUVZdVJQMWpwaDF0RmtxUGtDNCtkaFhzbkVxZS9vY3lCRTZPV1pxNnpkTWFKMFRkeGYwcFA0WGg4ZTlBS01HSTRUQ1ZWUGQ4OUk3bVdlNHIwYmw0OVl3KzNaU2F6bGdaTVBoMHU0TG4xakl3amhRNndRR3ZIencyVW1yam9Zdy92TEdaaVBIQm1pZkx3K1pFM09XM3B4VVBZUFdXdWNENFhqb1FxeW5lcFJIYkVyaXl2T2Z3dHZaSTFCVjBWZy9Xa1JkbTMrc2hyV1EwVzBrYkVaWEpKYnZPbjJ1VE5PeStBTmtOc2NyN08rOXB3b2RHdUVLbjdrQlBVVjA5K2dwckJMTXBXT1lTVVNvUm82VzBETnptd3VJUEd2ZVBxM0s2Nm9YbjhFZVRvSFBiaytEMHMxWVBhV1ZuSWUxWnVJaFEwcmdZOHVBc1U4TSt3V2xvTUhOVmNvTnpUNWVNK3hNNnh4aENRUjdQNms1a1VDTzlyL3FZQ1BtZWt0SGxnNlZpZlNSc3JOczV2MHEzUnZkRjMzS25YYzZXdzB1Smc3ZU9Nb3k2aTJ0UEVmV0JmTFNlcTJSbE1qOHZxVzRHb2xWeW9wdGhodGE5L3Y0T2UxTUt5SVYxaDBVQi9ST0dObDlmNlN4MEJyM25VdW1XUWZ5WXB3UTN0eU00RVVnc29LZWovRkU3ZjlIRkJLVXNoaFZhOThSSTVqMFRoZStDK3lMbjIzTk5tSnIxMmw4TldHYXJvN3JyNE5MUVlEN0JzOUczRU80L2xzeW9KcGtIQmZtTk1SL0c1WlRwejd2L1VuQi9TVVozOGYzVG13Lzk4V0hWbnpPbTcrMkw2cmIreUlKVGZHNjZ5c2ZBajJ2cExxVmsvbnRqYUJzS2FiMzVzSFBHbzNyTy9UMHRQaUZScG1FV25FNElYS1lNb2I0R3VJMXA1US82RzhOaUN2UFBUMGx1U0NieHc5NlQrT0x6K3N6dnc2UGJpVnEzZGpwclhOdHRtQnpnZFZwR0taYjRaUlFKaGpOU2liNGpXQlB4bDdPNzluOVppMmZBcGl2dUxDNVk3WDJnYW5UdkY3ZEFPRWpibE53Y1Y3Uk9wTUtvNjkza1VFWWFFcm9UNUd4aFlrM3prbVlWSHVYWG9KYm9GeDNJK2JvZ3NIZGd6VEx2aGlSZWtTNFNIZHgwRk00S3VJRC9xcWl0dGJXNlZpUVRrcG1CRGVaZ3Y5VVNHU1BqYVd6dGwvYi80UkNQbkpmRnErLzFqY0ZqOUI3NlA0M0tzNFA5dHBacmM3R3lmTEdtK0k4d3ZhRGt2R1I4UnREZDN0dGQwUGF6Zkt6a0R2YStEU3lpaW11cE9rSjY4TTFyblpLekxoRzNTcTNHVThuU21HekJoa1IzWUhyVlpKM1l0Nmg3QjcvSGNlaUxTbnhzQlY5aWgzSkpyV1RYSEVjUkxWMmJ4OGIyT3FuUG05ZzlEZVNZMVhrMGdubDR0SW5UdzhKT2pSQWQvMHJMWVBGTHl4QTJoTG81VVZncWN0L08vcmp0SHY2VVE2VW9pR1h1dEU2WHdqNG5xYVk5ZXBUT011citLV0lpUFhPSHVDbUlac3djZ1Y5U1AxcDlOUVlJcUNZMEtvRC9ZNkgzSnMrdzNNSUh5bEl3d1RSZy83ekp0ZkFDM1pPemlmeG5mUEZCT0Q4cy9PS3NROVI0SUt5N3dPMDJLWU9ubTUwTlRLcUVTNVJMMVRHcGhQTmprUUxGRWQvVVpWNTVuZ3A5MDJYd3ZEVkQ5dFVXU3YrMUYwWk5McVEvRnBZQjZwbEZUbzYvMGM1TFVEbU56NXY3Z1dUQTF1RnhMNGJDWHVTSWNNT0NlcUo5OEV4YVRyc25jM1pkVlNhNmtZeUZUcFp2K0JEVitBZHFPdXF2S0xidkp1SzdpelpWQ3ZlSkJJbmwyN0tqcTdEYTZpNkU2c3gwckVVcmI4bFBSbXV1eUpLZGtoSUF5WXNMTzh1NzR4Y0cybnEzUkRjWFFMdHV6Z205cXR5ZGg1Qlo1UlVGSFJCcUNrTE10dXFwd2xUNlY0OHRJeEpLZ2thcG4yUmxWUFBwK0MyeithdVczQ0tZazBlOWZpbHdKSGY1My9kV3ZKTXJmbmhaTnU4WnhuYnErNHRhdGxVODIwN3JWd05yb0hjVTVmcXU4U05yQzVJaTV1M0VoWWlWV1o2NTJ1M3NSWTQycTEvcG0xTjEvZmNDdElnVXRPc1lBc3ZiRVlHbzB2eTFBK0dxR2FFbW44SzlVdGFpVWdkOG8wU1oxVjlKOEVZemJlZExwWk9FTGViS2Y0WGJMVllNUUtSd2I0NjQ1YmlmdmQrbVVybHJEMUROVE11eUpoK25CNjJYMEtlblJoT2tBQ0IrTDNoenlDVE1Yb0xJS0F5TVpnRFVqanRXa1BvdGYvYWkraklQTDRBQWlYTEthelI1K1I2MHk3bi8wanFnUUN0UHZJYUIxN2Ntb2Y2b3Y0ZEp5QkQyNGpiMHNPWXl1Q1NmeWRmMExYM0syUTFETVYyZ1ArYnR4cnNOY25rY1BWQ1JsSDEwaU05ZnFmZ3FrYzZYWTB5a2RYek9TTFhoMjJtYnVocmhQcjZ2aHNrYkFwc2kybEpFd21oaG1jNnRXK2o3b3NKQnE1Qm4xZkxEdVQ5Q21YTGkrcVVaQ1d1NllNV1hHdFJueVorSHpkd1BZTXNGNmJpMnZTREp3YnVINlFCVUV6ZytSeU5uSk8xb083S3E2U01CS1F2amhneDJ3RGFVSVdXdkNuSzJvUG5PbTZpUGszQkV1V2srVzQwTzVBajR3c0tTYzdpTWxlY0VEckl3RWgwTHRybTVPMGp6ZDcyUXdraHZYaXZ5eHJFb3FFb2E4TlhzdFBNYUN6YTJyamdlTWxMZElHd0xLT0t3NFkzRFk5ckdKVjlUaXBRakIxbU5EcTA0V241SW5GYzM2S3g1N0VpdnNGSFl4dkNkV29NdFJDSVltQ2NiMjl4bGp2aHNSVEhrK0dzVkQ3LzQ4QWlLLzFnYlpNdWVqaHZGMnRMdU5pMkxyRDh2SWoxK1JuTGlkNUdIcW9UNHJkY1B1MnJNSGRnT1crcTZsT3BTdTh5RzZiVENueEpINlppbDZUbWxKK3AvcUNSaXMwZlhtQ00vRG1TSWpySGtuOUt0T3FBWkRYL3Nqb2srRmZudTdxT0RyQ1FFTUdqUFV4a3JqbHEzcXVxTXBOY3RCVHhDdzZoZnRqRXhaVlVsc00xTmVRYkxFdlNTTnhHL1BsOVZGNDZBMEF2a3Zvdll1K0xXYmc2M0twMnhvTVFPbmE2dXptcGJpd3JTWkhVRTNzaDFVa1JhV29KRjhpNk5CcjZTaFJYN0VtZlY4UERpMXU0OUdNUzJlM1B0bkd0Z2haYldUVVpWVEI1MXBGclFLTVNHdUNZOFRPR1hxdDlsa2sxeEJEUDFxR1l3UzUvWlBkV3JmM3ZReHVJL21TbEEvbzREcUVibGxsK2FoSGpiajc4ejBMMXlCRktZM256M3dLVlcwblB2UUVSdGo0Vm1QcGF0bXBnbmRtT29sYWhLcEhrVEFPZmRXY0Yrc1ZOOEVydFNYUTFZR01CZ1ZhOXgzcDFvRzlmcHByUVFiaDd3dUtvTkI2dGlJWEVta3Vod3lnUVRsclBLMGNoVnUya05zTFlpRGYzRmwzdGdQUVU3S3lyRUVGemthbEI4dDMyYXVJempCRnVhZW9xNWprS3lyWktPWVBOM0hNYnhRQm50WjdMVEhsazNzamp3VmFNM0xwRmY2QUhmaUdZdnhkNUdiR3ZHNHJ5Nk96RmhpeFdnUFR0THJDTWpkeHRzcVlwOU9hNGFDQTBLWHBmc3ExVWl4MVB0M01mWklVcVFqRFc5NTVaMWRWeFVGT29jaUZRdTJuZEIxbEIrMHBKemFaa2tKS3JwdWREVjBRdmwzWWQzME1PL0xhM1VaT2hFUzhaT1hwVzBTbUxhbHp6c2hENFJDKzg3OFZxOVlkMzYwTDFMSjZhTzFjM3FpcTJ4N0xxVU9VV3RIckhQOGtxQnBlMFkzbWYwL0VOTExMUE9nZGZPY0llVXorcUFNZndVWHZkZlFxS05BazJwZVlNbG9UNDdtalgxOTlMS01FT2dFMWprYmdrTnlnQ0Q4cldIL2Z4VGlCaHVuY3FMU0g3Z2tiZlJkSjUrTkZYUFpLSmVkOXFkV0hZbEJoTEdub0VxQS81S05wVlJ4ZTdUcm9lVzl3VWk5WU85M1lNNlVqdDFSTTBVdnBwRE5YbHlsbXFTeENlS2twVUFtbTNCbElJWER6d0Z0M1d4TFBlNmdBREo4VGxqM1JLTHhpUlQ3bnZhZEZDZ0haY0VYc3JyRnZ6MjArb2FFWkprQ09XOGhmVzhwaHk3OUlpbFlaVzJmVW9lN09ZeWJORGo2VEVyQjEwZGtvN3VrcFBRbjBOaUxqTC9Pa20wcERZeXFuZTR3NGZVK3JuK3ZnbGI0VTNFdnBTVjVyU3BpWGxvdmk1TTJheXdPdmQ4SFpBUkN2WkxBVGVkRHcvWVhBazEzQ1MwbFl6em5zR0VoRk1URHJSTFFoTXU0YnB2c0FieXBXVW95NGhRYnduTXZJelVSUzVFdDRjLytmNnFKTXNMLyt1dlNkYzVGYVZwai9lKzFlMjl6djdtMnh4TmlGb09SSE8xbDZXME5rRmZjSWt4TUpYNGlBcG9NZnpPWVlRUmQ4eXJQbnk2TmlzTnd2MjhRbnJsMVpTLzFrMGJhUVIya0RJOXRXbHNyd1c5TjRZUXNjSENTWm8vcGlPRVJ4dEhyTVduVkIxeU05eUF6dzhyWlJuaVdCZTMwYW1rVGtBVFljUFRPOTlQalpkdUVvUHFKakVJckJ4YVpBclhvM0E5Q3RlanBIQTlDdGVqY0QzTXpNek16TXpNek0zTXpNek16TXpNQUFBQUFBQUFBSUFBUWUrNHdRQUxBYUFBUWYrNHdRQUxBY2dBUVkrNXdRQUxBZm9BUVo2NXdRQUxBa0NjQUVHdXVjRUFDd0pRd3dCQnZybkJBQXNDSlBRQVFjMjV3UUFMQTRDV21BQkIzYm5CQUFzRElMeStBRUh0dWNFQUN3TW9hKzRBUWYyNXdRQUxBL2tDbFFCQmpMckJBQXNFUUxkRHVnQkJuTHJCQUFzRUVLWFU2QUJCckxyQkFBc0VLdWVFa1FCQnU3ckJBQXNGZ1BRZzVyVUFRY3U2d1FBTEJhQXhxVi9qQUVIYnVzRUFDd1VFdjhrYmpnQkI2N3JCQUFzRnhTNjhvckVBUWZxNndRQUxCa0IyT21zTDNnQkJpcnZCQUFzRzZJa0VJOGVLQUVHYXU4RUFDd1ppck1YcmVLMEFRYW03d1FBTEI0QjZGN2NtMTlnQVFibTd3UUFMQjVDc2JqSjRob2NBUWNtN3dRQUxCN1JYQ2o4V2FLa0FRZG03d1FBTHpDaWg3Y3pPRzhMVEFBQUFBQUFBQUFDZ2hCUkFZVkZaaEFBQUFBQUFBQUFBeUtVWmtMbWxiNlVBQUFBQUFBQUFBRG9QSVBRbmo4dk9BQUFBQUFBQUFBQ0VDWlQ0ZURrL2dRQUFBQUFBQUFCQTVRdTVOdGNIajZFQUFBQUFBQUFBVU41T1p3VE55ZkxKQUFBQUFBQUFBS1NXSW9GRlFIeHYvQUFBQUFBQUFBQk5uYlZ3SzZpdHhaMEFBQUFBQUFBZzhBWGpURFlTR1RmRkFBQUFBQUFBS0d6R0crRERWdCtFOWdBQUFBQUFBRExIWEJGc09wWUxFNW9BQUFBQUFFQi9QTE1WQjhsN3pwZkFBQUFBQUFBUW4wc2cyMGk3R3NLOThBQUFBQUFBMUlZZTlJZ050VkNaZHBZQUFBQUFnRVFVRXpIclVPS2tQeFM4QUFBQUFLQlYyUmY5SmVVYWprOFo2d0FBQUFBSXE4OWR2amZQMExqUjc1SUFBQUFBNWNxaFdxMEZBd1VueHF1M0FBQUFRSjQ5U3ZFWngwUEdzTGVXNVFBQUFOQUZ6Wnh0YjF6cWU4NHlmbzhBQUFDaUl3Q0M1SXZ6NUJxQ3YxMnpBQUNBaWl5QW90MXVNSjZoWWk4MTRBQUFJSzAzSUF2VlJkNENwWjA5SVl3QUFEVE1JdlFtUmRhVlF3NEZqU212QUFCQmZ5dXhjSlpNZTlSUlJ2RHoyZ0JBRVY5MjNRdzhEODBrOHl0MjJJZ0F5R3I3YVFxSXBWTUE3dSsya3c2ckFIcEZlZ1FONm81b2dPbXJwRGpTMVlEWTFwaEZrS1J5UWZCeDYyWmpvNFZRUjRaL0s5cW1SMUZzVHFaQVBBeW5KTmxuWDdhUWtKbGxCK0xQVUV2UDBHM1BRZmZqdFBUL24wVHRnUktQZ1lLa0lZbDZEdkg0djhlVmFDTFg4aUdqRFdvckdWSXQ5Njg1dXdMcmpHL3F5NUJFZHArbStQU2JDR3JESlhBTDVmNjAxVk5IMERieUFrVWltaGNtSjArZmtHV1VMRUppMXdIV3FvQ2Q3L0FpeC9WK3ViZlNPazFDaTlYZ2hDdXQ2L2l5M3FkbGg0bmcwbmVGRERNN1RKT2JMK3VJbi9SVnpHUFZwcy8vU1I5NHd2c2xhOGR4YTc4OGlwRERmeHduRnZONjcwVTVUa2J2aTFZNjJzOXgyTzJYckxYTDQvQ0xkWmZzeU5CRGprN3B2UmVqdmh6dDdsSTlKL3ZFMURHaVkrM2RTKzVqcUtxblRQZ2MreVJmUlY2VWF1OTBQcW5LNkk4MjVEbnV0dFoxdVVRckVvNVQvZUt6UkYzSXFXUk0wK2NXdHBaeHFMemJZRW82SGVxK0QrU1F6VEgrUnVsVmliemRpS1NrcmhNZHRVRyt2WmhqcTZ0ckZLdk5UWnBZWk9MUkxlMStQSmFXeHV5S29IQmd0MzZOb2p4VXorVWRIdnlvcmNpTU9HWGVzTXRMS1VOZnBTVTdFdG42cjRiK0ZkMitudk1UdHc3dlNhdkgvQzBVdnkyS04wTjRiREpwTlc2VytYczUyUzY1ckFSVWxnZC93OEpKKy9mYWg0OTY1OWNHNlh2SlhuUXozUDNhNkxTWnJQQ0dvM0h0UGJzb29HbThFU01pd05lc3FBek9hQTNxTWdqRUs5YXJLckFOMk5LUUFjT1FwRDhLOWR0bHF4cU9DTWVEK3VCNTJzWm5KbmxTUDFhaHNjcTRwRGhaR0pHNEFYQlhKcytyQ1Y3OTVzMkdiMTYxSmdKTTdYaGhDOFphWHJDQXRBVmJNVmlCVDFUV09ZNTM4WFhjb0NISHNUMnVZV05wVE1oeDFXMlRFOG5wT0I3TkdUcThBMTg2emtwSmVGajdJOGRsUUtCSXF3Ujc1TURPTFVzWG5YYWNQeWhrRGV0aW1oMXhRdmtkWGNTVWcwOHl2ZENsT3dCbERaTjNaWFQxZVdUamZ1eEVqOG9nWCtpN2FyOW9tY3NlVHM4VGk1bCs2SGJpYWtYdndyOStwaUhEMk8wL25xSVVtOFVXcTdQdkhoRHE4MDdwejhYbDdJQTc3a3JRbFJKS2NsalI4YUc3SHloaHlxbGRSTHVYM0k2dVJXNktLaVp5K1R3VWRSWHF2Wk15R3RjSkxmVlk1eHVtTEdsTmtsYWNYM0FtSmp4Wkx1R2l6M2ZENExac2czY01zQytMYjNxWmk4TlY5SmprUjJTVkQ1ejdiUXZzUHplYXRaamZqcXhldllsQnZTUkg1dy9GQU9OK2w3Slh0aXpza2V6dFdPRlQ5c0NiWGozZjdlTTNaN1puS1M5czlKbFlJVnVHaTNUdWdnRFM0SG05aDNIQXJ1bnhaNjRScXFPQUJsblk3T21OY0JwazdnSGFsWlRNSUVodkR1aXlXSWFRL2pSQmlOM2NmeFNOQlFreDN1Nm5ORDZDVWFvVjFKOVo4RVpMdlpicTBjSE40dVhVR3NrSGNLd1lubXllTWlPWndLMFBoYkRkQk1acnorSURSZjlydnpDWlU2WWNGWWEzUm9QYmhCYi9SdTk4ZitqUFk1cG5aUmhrRXVadVg0d1Zyay94Z1g3QVlEK1Bmc3RQU1hmdm1wbWpiYUtkOERnUE0xNis0eHhWcXdHQURBbkx4U3dIMDcvMXJWeGpLaFlDb0UvTC9mYjN5TWN2YzlsemZ0cE5BY1FSbjU3Nm10M2MvZWRuS0IxUm9RRTExa2JHdUFFVlZQM2hnYkpscFFsQ3dvdlk5eVpDR3FsOFdpSWZYd2RHYVZsWDU1cFlhYkRwalhoMU16ZUpsOE12TGFIQnJvTWNaTEhXVWdDRWEzMjBlM2dKOHBxa0k3MWRqR2ZBTW1QT1VFM3JSWmZnUmphV3VyZEErUC83QWFVZ1poZTltTmpETzZubFVMYi9la0xPcUQ5ZDdMN090SW9USCtXajM0enBnTWxIdXBNM0FiRTJiRE52eGhmd0krRzcyYWk0aEVGZFJFY0FDN2dkN0d6WktoRFQ1dVdSZEJWWndBMm1raFBreHhycVE1QXYyMml0TjVqSWgzY1kzWG1oNUZTMCt4SERtRVcrdWltVVhsVFl5UjFxNFhyVzgvN1diU24wSGJzMEo1NVM0b3dNWmxoZnB1U1pHT1RwQWJGRjV4cXdqMzh1OTg5ZHdGNWRaRUlkRjZFaDNITWYrdlJEZFhCMnVuNUpjcTRFbFltb1V4eDVTa2tHYW1uZTJ3N2FSZnFya21oakY1M2Jod1FEMXBLU1VOZjQxclpDUEYyRTBxbEZ3c1diVzVLR1c0YXlxVVc2a2lPS0N6SzNndkkyYVBLbkhoVFhhSGVzYkk3L1pDT3ZSQUx2MFNiWkRFT1Yxd2N5SHg5MjdXcGhOWU80QitoSnZlWkVmK2VtMDZqRnVRS2twZ2xpbkd3Z0ZsK2hrQWdUTjJnRHpRK01lc09IcU5zMlpGcmxheUloSW9DSmx5emFWRWxKd3YydzNnWnJxU3FnYkwyM0VLcWIyL0k5WFpiSXhWTTF5TWVzNVpTVWdwSnZqUFM3T3Jlb1F2cjVGeCs2T1NOM3k5ZDR0WVJ5cVdtYysyNVRGQVIyS3Y4TjErSWx6eE9FdzdwS2FCbUZFL1grMFl4Yjc4SVlaZlJwWGNKZlpsaXlmZ0k0bWRWNUw3K1lZWHJaK3o5M0wrOERodjlLV1B2dXZ2cll6L29QVmZ1cWhHZS9YUzY2cXU0NHo0UDVVeXE2bGJLZ2wvcGN0Q3FWZzJIeWUzUmFsTjNmaUQwNWRHRjF1dVQ1N3BvUmNmbVVGK3VNUjlHNUV1bGR1S29CVnMwM2V1NFN1TXdpdEt1Uk9yTUt3VlhnWXF5cUYrWi9LNkVXdGdsZ1RURnJtSHRYbEozZlgzWkpuT01MdUtEOWhYNWE3WDNDNi92cHJVR09CM09FdmhPUFdCUWNzK1o2WkJuU3NjaVBKYTdZc201WjQxK2dtYjJmUnQ2Nzg2N1pqbC9LYis0N0JJRFdJK3lLVkZnTlNMbDczaVhwU2dVZ3pDeW5yV3F1RUpxbkdsYXZwSjBHS1AvM0VOa0UycFNBVWFFckc0WWlCSG4vbXFxSFFnaGQ4TkpFKzVBb0swVlh2MEdWcVZOS2RLd0hGam8xOG5VV0xTK1MrdFBvWEpHWGladUlRcmNKTG54ZG0zeUVFZHE2L2pWaGxXa2xqRG5iTk1LYnBaV1FhWDZEdWZwREx1OEhFc0t5QXMrNzlBTmU1R2Y1bEgzMVJFdTVyMkdCOVhqQ3V1N2dHeDNjTWhhZXB4dTZvVElYYzJrcTJXSmtrNytiaFpHaUtNciszTThEZFk5N2ZYaXZBdWMxeTdMOFB0VERSRkp6Mmx5cnJXR3dBYi92bmFkayttb1RpQWc2RmhsNkhNS3VhOFhRL2JoRkdLcUtDRnVmbUtOeW1zYjJSVDBuVjU1VXJZcVpZeittaHlBOG1rdUdlUGJpVkt3MmZ6elBqNmtveThEZHB4YTBHMnBYaEo4THcvUFQ4djN3MVZFY29hSkViV1ZENTFsNHhMZWVsaVd6c2FUbFNtU2ZGR0Z3bHJWbFJyenVIOTRObjEwOWgxbDVEUHdpLzFmcjZxZFYwUWExREtuWXk0ZmRkZjhXay9LSTFVSWs4YWNKenI3cFZGTy8zTGN2NjRwVGJlMFJESUV1SkNvbzc5UGwrcVZ0cU1ob0ZvOFFuVllhZVhXa2o3eUhSR2w5QVc3NVZVVHNZTmVTamJPc3FaWEQzSUhKTjJwVkp6bU45M0RnRnhSNzlGUGl1NFZpbGJoRHVKcEdqSTdzekhoMGJaV1R1N3FtVkdaQldLK3lKd0NYMGNoNk9HcHAwT20vVVM3Ym5qSEEvQVY3bVFiaVFTTHlGL1A4aUFNZitMM2o3QjlFV3RLcTd0MHZQS3ZESm5hdEhPZ24xZkdHVldyVk93dldkTERUMkNQaWNZcFdkSFZpWlFYSGhVbE9oR2RXTFlmMmJORVN1NzdHT0tmYllXVUJyUGdvdE1lRjEybHUrQWJSVXJxK0FkYzJNK0djc3lZQ1JWdWtnbk0wRjJGR0FzRHNoR0N3UWhaeVRhT1FBVjM1MXdMd0o2VjRYTk9iemlETTlFRzA5NDBEN0RIT2xqUElRZ0lwLzNGU29YVnhCR2QrUVQ0Z3ZXbWhlWitHMDRUcHhtSUFEOUZOYUN6RUNWakhhQWptbzNoN3dGSkZZWUkzTlF3dStZS0szOHhXbW5DbnkzeXhRcUhIdkp1UnRndEFkbUNtaVA3YlhaT0orYXZDTmFRTzBKUDR6MnIrVWpYNDYvZFc4ME5ORXNTNDlvTUYzbE1oZS9OYUZwaEtjSXQ2TTNweXc5YW82Vm13OFJ1K1hFd3VXY0FZVDNRTUUyUndITzZpN1hQZmVXL3czbUlSNTRzK3h0SFVoWlNvSzZ4RlZzdmRpdUV1empjR1NxZTVrallYMXlzK2xXMlp1c0hGaHh3UjZEY0UzY3kyamZySW9CU1oyOVN4Q3BHaUlncEFrcGljSGNoWmZ4SktYazIxUzZzTTBMYStBeVU2TUIrWDNMV2c0aDNXRDRSa3JrUXVKSDV6M3FseHBJM1M1WW5TL3V6cVhLMWRFRllVamcyeFIxOHNoejZvSlhRWWRaUnJtZkZRM1JsMzl5aE9FaS9STDhrODQvK1dVb3B2cXByWmNHdTlnbnY3Qzl5L1BPZXNDMVVCRUUzR2JHTmErZzdUN3dzaDJFNnFBVlRnOTBjOGVGenA0M1duRklkeENvRTA3UHFzWlphejQxeFQwZG1vRFUyaFFhYzVHSDk4b0J3MHFFVVEwMUNnQ1JJUlNONGVUZVNSSUlrcjZvTXlCRWFyQ3UxS2syQmR0bWhydHVTa1A0VVhWazJvSGZpNTlPTkNCdVFkem81bW5hdGdFaVUyODNqTzZZT3Uwb0FaWUVKcmZDdlh3VEFYUXVRa1dnZWhIL2dTaGx2MlRMTDhuRklkcmpCSnlTZTJsMmZ5TStEZVBFU25wTmw4bS91eG8zMEI3MENZRnFXSzZBWUlMa0dkVG9idVlKVW9INDVPcmFJSWlubVJ4T0luS3JtNjhxYnhvbGpMaXV6WHRmWGJzWFJuYWE4UXJtVVh2OWJ6cHBHWktlK280S0Z0eXF3LzNXN01zQkQydi9NcTAxZ0tDZjBYanBTSy85eVU4Kyt3OVFmdlRFdjgzZG1jdGg4S1BmaVZqdmxrRlJDdnZVb1BSS1NuVEV4MnUvRTN2aHJVR20yZEUxV04wVi9mVStydHhXMGhpV0hJaEN4VitPS2JhM1NTdEp2a3RQVTgvVEozYXJiYmdvWVJ0NkhDSFNJempMdy9GUVdra2lQbzFlUktNNlhxUDYrckR5MkRwanNXc1FXUERrQ244b2ROeXluNEk1REtXeDNIc2hJUVVlL3BJRDUwOWl3MHZiTGtlTjhXVkNWckpLbE5rUnFjUUxidmpxdUxqbFQzd3JhSjBCb2d3OUNqcTNLV3JyRXB0WE1rcklTaDZQUEVqRllQUE5vZWRLS1FMZGZseVhFWSt4ZVdpV1dJa29obGVueW1MMzZOM3ZtZCsrdCtxcmZxL3BnYmtMdmRNVlo0aGZxbUh0VmxwVDUvSW5RcVZkNDFhNU5jS0RPRlh5ZUhqNVdJT3RWV0EwYTRjL0ovcGpmeGFQTzZLb21LTElSWHBoRHZIOUNGTFVPd2FYVXJMWnV5OW1kcTlST0NjL3dwRG1JcE81eENYL1FCeGZLWW9vOTd0Skc2ODBtREUzZHhRbll2UDh0em1pRTJxWEFjSk5mVURkTlQrdzcrRUFHcWc5T01JKzBHcGVoakZGM0pucXBBU2pJRU9EYjBTTTdpZkZtMGU4YlYwTncrQmNaRHNkcUJHOXh2b1JyNENnV1Vqb2EzbE4wb01aSHA1YVFRbXlhREhCbTA4bnpLY24zMVl4L08xTUh3bzJNZllTOGMvYy9jOGp5bkFVcnk3SXc4WnprN1k3d0J5aGVHQ0VGdWx4UFloZUFEQmI3VmdyeWRwMHJSU2IwWVRxZllSSVl0UzZJcmhWR2RSWnpzbmlIUkR0Ym4rTjFGTy9OU2dxdmhrd08xUXNubGtMdktGd3F3NTJJVzJyaERZcE03SDNWcVBaME1uS0g3bXhEbjFEcDRDbWNTeFF6aWh3RkZmV0Zxa01Va2kyYUFLL3NuMnVsQmx0ejVoTFQyN1MyQVlQYjVzVkZrMHJ0VE9LYmhjMms1b1BoemVGNnlmbU5WTk9NSGplamhJMlI3U0F2YlgxNjhhZ0hjU2JCaTJpdzltaHJPa2ZkMWE4VUJVMXpjK3hCNHpFQ2hRWGE2S1dNYjRiTzVpWjBLeTMvSUJPbXBLZlE3WXRrZ0tLeEV6YjJmK2tWalZEUHh5cm9QS1RMWGxVQ3RSM2tYZktuQTFyN1VxVmwvaGwxSXpNeXJqdTFKY0l6dVNSUXdINmgwV3YrL1Z2Sm9YSXd2YWx3Wi9DYlNFVEgvYit3dWczTzNYY0xaajExWWc2dCsvOFZUL1RISUpmVXkwUE4wTHFSVlhuKzNxSHcrdW0reVA4UXdFanJONnpWZjVkSWJ6aWlGejZkNlhrdEVnTE9CVzg5ajBZQjVac05SR1RaZVZhQWZZakxEdkFYaDEwQTBwcC9EdFdySXAvcis4eXRIMlkxUXdZK0hOR09GK2xHNS92RDJtRSt4MHRpNTFBQmVrNXpUTTU5V21yL1JiZ2RQNkFtQk5iakR5QUJIN0lBdmhncklZbUpNNFVLbTlQckFXQ2RodXlmTnZYMjl6OHpwNTVpY2VKZTRITlU0Z0N6ZHJBTkE1Q0cvdzFhOTVtTUtSK0I0RkpnRVVGM3E3blNzYk9EOHpGZ1l5d3pmQWxKNlVwWEk2ME1NSG9BM0QvM1Bsb1BtR0tlNnV1WlVqeVZnQmRQOWczd2tJTjlRNldrZ0t2TXV1TVpIZnRMTkZuU0wwcEZCVlBwWEhUUGNUQjFIZ1J4UkxrZTJVdW40cmVRL0UrRGxtS0ZqNWZuWTQ2WWpkOW5kRHhoWWovOUVYaStjWjQ1SWR1cW42Z2tQVjJGMGRHVnRjSFFnZEc4Z1pHbDJhV1JsSUdKNUlIcGxjbThBQUFDb2J4QUFHUUFBQUhKaGJtZGxJSE4wWVhKMElHbHVaR1Y0SUNCdmRYUWdiMllnY21GdVoyVWdabTl5SUhOc2FXTmxJRzltSUd4bGJtZDBhQ0RNYnhBQUVnQUFBTjV2RUFBaUFBQUFjbUZ1WjJVZ1pXNWtJR2x1WkdWNElCQndFQUFRQUFBQTNtOFFBQ0lBQUFCemJHbGpaU0JwYm1SbGVDQnpkR0Z5ZEhNZ1lYUWdJR0oxZENCbGJtUnpJR0YwSUFBd2NCQUFGZ0FBQUVad0VBQU5BQUFBWTI5d2VWOW1jbTl0WDNOc2FXTmxPaUJ6YjNWeVkyVWdjMnhwWTJVZ2JHVnVaM1JvSUNncElHUnZaWE1nYm05MElHMWhkR05vSUdSbGMzUnBibUYwYVc5dUlITnNhV05sSUd4bGJtZDBhQ0FvQUFBQVpIQVFBQ1lBQUFDS2NCQUFLd0FBQUpPS0ZBQUJBQUFBQUFNQUFJTUVJQUNSQldBQVhST2dBQklYSUI4TUlHQWY3eXdnS3lvd29DdHZwbUFzQXFqZ0xCNzc0QzBBL2lBMm52OWdOdjBCNFRZQkNpRTNKQTNoTjZzT1lUa3ZHT0U1TUJ6aFN2TWU0VTVBTktGU0htSGhVL0JxWVZSUGIrRlVuYnhoVlFEUFlWWmwwYUZXQU5vaFZ3RGdvVml1NGlGYTdPVGhXOURvWVZ3Z0FPNWM4QUYvWFM5b2IyMWxMM0oxYm01bGNpOHVZMkZ5WjI4dmNtVm5hWE4wY25rdmMzSmpMMmx1WkdWNExtTnlZWFJsY3k1cGJ5MHhPVFE1WTJZNFl6WmlOV0kxTlRkbUwyVnVZMjlrYVc1blgzSnpMVEF1T0M0ek5TOXpjbU12WjJJeE9EQXpNQzV5Y3dCWWNSQUFZd0FBQUwwQUFBQXBBQUFBSmtNU0FHQUFBQUJRdkFFQUVnQUFBQ1pERWdCZ0FBQUFVYndCQUJNQUFBQ01kaEFBWXdBQUFEWUVBQUF1QUFBQWpIWVFBR01BQUFBM0JBQUFNQUFBQUhkcEVnQkxBQUFBNkFFQUFCY0FBQUJWVkVZdE1UWkNSUW9BUWJEa3dRQUxFUnh5RUFBSUFBQUFWVlJHTFRFMlRFVUxBRUhNNU1FQUN4RTRjaEFBQ0FBQUFGVlVSaTA0QUFBQUFRQkI2T1RCQUF2N0FWUnlFQUFGQUFBQUwyaHZiV1V2Y25WdWJtVnlMeTVqWVhKbmJ5OXlaV2RwYzNSeWVTOXpjbU12YVc1a1pYZ3VZM0poZEdWekxtbHZMVEU1TkRsalpqaGpObUkxWWpVMU4yWXZaVzVqYjJScGJtZGZjbk10TUM0NExqTTFMM055WXk5c2FXSXVjbk1BY0hJUUFGOEFBQUNxREFBQUZnQUFBSEJ5RUFCZkFBQUF0UXdBQUNvQUFBQk5kWE4wSUc1dmRDQjFjMlVnWVNCa1pXTnZaR1Z5SUhSb1lYUWdhR0Z6SUdacGJtbHphR1ZrTGdBQUFIQnlFQUJmQUFBQVN4QUFBRVlBQUFCd2NoQUFYd0FBQVBjUEFBQUZBQUFBVDNWMGNIVjBJR0oxWm1abGNpQnRkWE4wSUdoaGRtVWdZbVZsYmlCMGIyOGdjMjFoYkd3dUFFR0E1OEVBQzZzSi9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QeFVWRlJVVkZSVVZGUlVWRlJVVkZSVWxKU1VsSlNVbEpTVWxKU1VsSlNVbEtTa3BLU2twS1NrcEtTa3BLU2twS1NrcEtTa3BLU2twS1NrcEtTa3BLU2svUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvUHo4L1B6OC9QejgvQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCQUlDQWdJQ0FnSUNBZ0lDQWdnQ0FoQUNBZ0lnQVFFQkFRRUJBUUVCQVFFTDJodmJXVXZjblZ1Ym1WeUx5NWpZWEpuYnk5eVpXZHBjM1J5ZVM5emNtTXZhVzVrWlhndVkzSmhkR1Z6TG1sdkxURTVORGxqWmpoak5tSTFZalUxTjJZdlpXNWpiMlJwYm1kZmNuTXRNQzQ0TGpNMUwzTnlZeTkxZEdaZk9DNXljd0FBQUFCMUVBQmhBQUFBU0FBQUFDVUFBQUFBZFJBQVlRQUFBTkVBQUFBZUFBQUFBSFVRQUdFQUFBRFNBQUFBSFFBQUFBQjFFQUJoQUFBQXdnQUFBQjRBQUFDTWRoQUFZd0FBQUZrRUFBQXFBQUFBakhZUUFHTUFBQUJhQkFBQUxBQUFBSXgyRUFCakFBQUFYd1FBQUJ3QUFBQ01kaEFBWXdBQUFGOEVBQUJKQUFBQUwyaHZiV1V2Y25WdWJtVnlMeTVqWVhKbmJ5OXlaV2RwYzNSeWVTOXpjbU12YVc1a1pYZ3VZM0poZEdWekxtbHZMVEU1TkRsalpqaGpObUkxWWpVMU4yWXZaVzVqYjJScGJtZGZjbk10TUM0NExqTTFMM055WXk5cGMyOWZNakF5TWw5cWNDNXljd0FtUXhJQVlBQUFBQkMrQVFBYUFBQUE1SFVRQUdjQUFBQjhBQUFBSWdBQUFJeDJFQUJqQUFBQURnUUFBQzRBQUFDTWRoQUFZd0FBQUE4RUFBQXdBQUFBTDJodmJXVXZjblZ1Ym1WeUx5NWpZWEpuYnk5eVpXZHBjM1J5ZVM5emNtTXZhVzVrWlhndVkzSmhkR1Z6TG1sdkxURTVORGxqWmpoak5tSTFZalUxTjJZdlpXNWpiMlJwYm1kZmNuTXRNQzQ0TGpNMUwzTnlZeTlvWVc1a2JHVnpMbkp6WVhOelpYSjBhVzl1SUdaaGFXeGxaRG9nYVNBOElITmxiR1l1YkdWdUFBQUFqSFlRQUdNQUFBQjFBQUFBQ1FBQUFHRnpjMlZ5ZEdsdmJpQm1ZV2xzWldRNklHWnliMjBnUEQwZ2MyVnNaaTVzWlc0QUFJeDJFQUJqQUFBQWxRQUFBQWtBQUFDTWRoQUFZd0FBQUNzQkFBQVZBQUFBakhZUUFHTUFBQUJYQVFBQUdRQUFBSXgyRUFCakFBQUFXUUVBQUJrQUFBQ01kaEFBWXdBQUFGc0JBQUFaQUFBQWpIWVFBR01BQUFCZEFRQUFHUUFBQUl4MkVBQmpBQUFBUlFFQUFCVUFBQUNNZGhBQVl3QUFBRWNCQUFBVkFBQUFqSFlRQUdNQUFBQkpBUUFBRlFBQUFJeDJFQUJqQUFBQVFBRUFBQlVBQUFDTWRoQUFZd0FBQUVJQkFBQVZBQUFBakhZUUFHTUFBQUJvQkFBQUtnQUFBSXgyRUFCakFBQUFhUVFBQUN3QUFBQWdCVjlFRDFLQ3VQZ0FBRUFncVU0RUFBQUFBRFFMQVFCQnUvREJBQXRUREVBQUFBQUFBQUFBQUFSWUFEd0FBQUFBQUlCY3Jkenp1OGxEN3Uya0R5YkJtM2J5Nzk3Nyt2Y1BNa1N2L3UvOS9oRmdzQUFBSVJtQklCQ0lxR0FoYVNRQVJJbkVBQUFEUURVQVE0UXhVWk5vQWdJQVFabnh3UUFMNFFGQUFBR0FyR1NDUUl5aGtBUlFZTlFBMGlvWW5XZzFsMC9ZK0NERWdod29nbldVQWpoQW9LSEZFSEZOeEEyWXVWNWJBVU9mbVFONElPSWZDSWtCeVVBSEF3MmFrRkxSVDN3REFpRWd3RzRUZzdYYjllVjNrRThYbWpZWERBQnV1Z2t2WUZRQUhuaG9JbkJXbmlYempyY1hDKy9tZHhkYkc4RVFtSTBTR0xiUEFURnlHbHNzdHNBZzRzTmNnaHZnMnM2RjFrQ3BWQXZRRDBoRVFCQUoxRUN1TzJRZVJDc1hDSWFDTmhpZ2llZWNXd2lFQXdMYWtPemJoNFcvb3EyZGpwMllJQ1ZHQUVhZmYrUFZ5WVQwMWswRzQ3WVlFZ2tBQUFBRUFBQWdBQUFBQUFJQVFZUHp3UUFMQVNBQVFaRHp3UUFMZ3dFSUFBQ09lRzVmUDM3ZFBmZjhtL3l1MHYrUGEvSG52N3F1YmhmdjNLYyt0clYzeVpMWHBiWkticHU1Z1Uxbi9sVHhtMkwrYjFMWE52Ni9LVVdCK2IxbHBrSTVBQUJDWUk4QWxFQkEwcS9YMGRzQW9KaXlld1pTSUpnV3lEMEpBQUFCQUFBQUFRcXlDSUFBQUFBRWlDQVVFRXdBQUFRQW9VUVFBRUVCQUFoQThOOVBBZ0JCbHZyQkFBc0NnSUlBUWVTQndnQUw0QUtBQml1K3ZoYXcvZ3dRQ0FES0tRaVpFRUFMRER0Z0pRQXExSUlZU040dGdoVWtoeGdZNFlBaEFkT1NlQk9DQTVQTlVNVTB3Q2lpclh5WkdGZ1NJc1JDb2xPT1BzM2hRa1Uwa0g0UEFJRjBBUktDaFRsSEtRRGVZa0VCaUtGRG5ZSElvVWdBOEVNeVRBTkdwa1Y0UldkeWQwMnpSYkY4NGt6RmZKVTdOa2RFUjBkTVFFeS9RaGMyVW5PTGJ0SndWMHhSbzA5SDJrV0ZUR3g4QjAya1NxRkdJMnNsY2xSYVl4b0dQbUUvVFdiN1ZnQUFsWDBkV2JtTDlEMDBsKzk3MjF0ZUhhUmFKVGF3bnRGYXQxdjhYRzVuazRWRm1XRjBuWFIxT0ZNZG5qWWhZT3crM2xqMU92eDZsNTloUVEySjZqR0tDbDR5Q2tPRWhKYWZMNVF3U1JPR2xsaEtseGlTMEhreWVtQm1LV3FkaUV4MHhYdUNaeXg2VDFKR2tPWTB4SE81WGNaMHg1K3pWeTlKVEZReFFZNDJHRmh5ZW1WN2o0dXVSb2h1Z1VHWlhhNTd2Q1RJbjhFa3lTVE1KTW1mQklXN05iUkF5cC9oUlArdHdXSnVjTXVmQUVHQ2hjSUFDNUlCd0RIQk1jSXh3ekhFTVF3QnhUSFJBTTBBeGpISE1jc0E2Qi9JTWNvQXlUSEtNY3N4ekRFT0FjMHh6akVBQWNFQXpRSEFBQklCeVFBYUFjZ0FUQUhUQU5FQjBnQUFBTDRlQUFEQUhzb0FBUUhoQU00QjRBQlJBaE1CNlFBYkFlZ0FLd0h0QU5BQjdBQk5BZk1BMGdIeUFHc0IrZ0RVQWZrQTFnSFlBZG9CM0FIOEFBQUF2eDRBQU1FZTZnQmhBdG9qMnlNQVFieUh3Z0FMNUVHcG8wVVJBQUFLWlFBQUFBQTlUdDF1VHAzZmtRQUFBQUExZDVGa0drOG9UNmhQVmxGMFVaeFI1RkdoVXFoU08xTk9VOUZUMkZQaVZ2QllCRmtIV1RKWk5GbG1XNTVibjF1YVhJWmVPMkNKWmY1bkJHaGxhRTV0dkhBMWRhUitySDY2ZnNkK3ozN2ZmZ1ovTjM5NmdzK0NiNFBHaWI2TDRvdG1qMmVQYm84UmRQeDh6WDFHYWNsNkoxSUFBQUFBQUFBQUFJeVJ1SGhla2J5QUFBQUxqZmFBNXdrQUFBQUFuNERIbnMxTXlaME1uajVNOXAwT2NBcWVNNkhCTlFBQW1tNCtnaGwxQUFBUlNXeWFqNXFabjRkNWJJVEtIZEFGNWlva1RvRk9nRTZIVHI5TzYwNDNUMHcwdlU5SVBnTlFpRkI5TkpNMHBUU0dVUVZaMjFIOFVRVlNpVTU1VXBCU0oxUEhOYWxUVVRXd1UxTTF3bE1qVkcwMWNqV0JOcE5VbzFTMFZMbFUwRlR2VkJoVkkxVW9WWmcxUDFXbE5iODExMVhGTllSOUpWVUFBRUlNRlEwclVaQlZ4aXpzT1VFRFJvNjRUZVdVVTBDK2dIcDNPQ3cwT3RWSFhZSHlhZXBOM1dSOERiUVAxUXowRUkxa2ZvNldEZ3NNWkErcExGYUMwMFFBQUVZTlRacnBnUFJIcDA3Q0xMS2FaenIwbGUwL0JqWEhVdFNYeUhoRUxXNmRGWmdBQU5sRHBXQzBaT05VVEMzS0szY1Eremx2RU5wbUZtZWdlZXBrVWxCRERHaU9vU0ZNaXpFSEFBQUxTS2tCK2o5eldJMHRBQURJUmZ3RWwyQk1ENVlOZVZXN1FMcERBQUMwU21ZcW5SQ3FnZldZbkExNVkvNDVkU2ZBamFGV2ZHUkRQZ0FBQWFZSkRzOHF5U3dBQU1nUXdqbVNPUVk2bTRKNE5VbGV4eUJTVmpFUHNpd2dsN3cwUFd3N1RnQUFBQUIwZFlzdUNDSmJwczJNZWc0MERCeG9rMy9QRUFNb09TbjdOZU5SakE2TkQ2b09rejh3RDBjTlR4Rk1EZ0FBcXc2cEMwZ053QkE5RWZrL2xpWXlaSzBQOURNNWRzNHJmZzEvRFZFc1ZTd1lPcGdPeHhBdUR6S21VR3ZTakptTnlveXFsY3hVeElLNVZRQUF3NTRtbkxhYVhuZnVMVUJ4YllIc2dCeGNjbVUwZ1pjM1gxTzlnTGFSK2c0UERuY08rdzdkTmV0TkNUYldESzlXdFNmSkVCQU9lQTU0RUVnUkI0SlZGSGtPVUU2a0xWUmFIUkFlRVBVUTloQ2NWeEVPbEhiTmdyVVBldzUrVVFNM3RnK0FFZGhTdmFMYVNUb1lkMEY4Z3BsWWFGSWFOajFYc250b1d3QklMRXNubitkSkg1eU5tM1JiUFRIN1ZmSTFpVllvVGdKWndSdDQrRkdYaGdCYlRydE9QalVqWEZGZnhGLzZPRXhpTldWNmF6VnNPbXhzY0N0eUxFNnRjdWxJVW44N2VmbDhVMzlxWXNFMEFBQkxZd0tBZ0lBU1psRnBYVk5raU1HSnNuaWdpeDJOaFpSNGxYK1Y2SlVQanVhWGRaak9tTjZZWTVrUW1IeWNINTdFbm05ckIvazNUb2NBSFpZM1lxS1VBQUE3VVA1dGM1eW1uOGs5ajRoT1FYZHc5VndnUzgxUldUVXdYU0poTW9xbmovYVJrWEVaWjdwemdUSUhvWXM4Z0JrUVMrUjRBblN1VVErSENVQmphcnFpSTBJUGhtOEtLbnBIbWVxS1ZaZE5jQ1JUZmlEMGs5bDI0NG1ubjkxM28wN3dUN3hRTDA0WFQ2aWZORlNMZlpKWTBGaTJIWkplbVY3Q1h4SW5pMlg1TXhscFEycGpQUDlzQUFBQWNnVkZqSFBiUGhOS0ZWdTVkSU9McEZ5VlZwTjY3SHZEZkd4KytJS1hoYW1ma0lpcW43bU9xNS9QajErRjRKa2hrcXlmdVkwL0ZIRkFva0lhV2dBQUFBQUFBR2lZYTJkMlFqMVhBQURXaFh0SnY0SU5jWUZNZEcxN1hSVnJ2bSt0bjY2ZmxsdXZuK2RtVzM1WGJzcDVpRDNEUkZZeWxpZWFRelpGQUFEVlhCbzcrWXA0WEJJOVVUVjRYYktmVjNGWVJleEFJeDUzVEhnNVNqU2tBVUZzeklxMFR6a0N2MWxzZ1ZhWStwZzdYNThMQUFEQklXMkpBa0c3Um5tUUJ6K3puN1doK0VEV04vZEdSbXg4UWJLRy8zTnRSZFE0bWxSaFJSdEZpVTE3VEhaTjZrWElQdzlMWVRiZVJMMUU3VUUrWFVoZFZsMzhQUTg0cEYyNVhTQTRPRGhDWHIxZUpWK0RYd2c1RkRrL09VMDUxMkE5WWVWY2lUbTNZYmxoejJHNE9TeGlrR0xsWWhoaitEbXhWZ002NG1QN1l3ZGtXbVJMT3NCa0ZWMGhWcCtmbHpxR1piMDYvMlZUWnZJNmttWWlPeFpuUWp1a1p3Qm9XRHRLYUlSb2NqdHhPM3M3Q1dsRGFWeHlaR21mYVlWcHZEdldhZDA3WldwMGFuRnFnbXJzTzVscThqdXJhclZxMUdyMmFvRnJ3V3ZxYTNWc3FtekxQQUp0Qm0wbWJZRnQ3enlrYmJGdEZXNFliaWx1aG03QWlidHU0bTdhYm4rZjZHN3BiaVJ2Tkc5R1BVRS9nVysrYjJvOWRUMjNjWmxjaWowc2NKRTlVSEJVY0c5d2YzQ0pjQ1VEd1VQeE5kZ08xejYrVjlOdVBuSGdWMDQyb21ucGkzUmJTWHJoV05tVVpYcDllcXhadTNxd2VzSjZ3M3JSY1kxa3lrSGFldDE2Nm5ydlFiSlVBVndMZTFWN0tYc09VLzVjb250dmU1eUR0RnQvYk5CN0lZU1NlN2g3SUYydFBXVmNrb1Q2ZXdaOE5YekJYRVI4ZzN5Q1NLWjhmV1o0UmNsOHgzem1mSFI4ODN6MWZNNThaMzRkUlVSdVhYM1dibzEwaVgycmZUVnhzMzNTZlZkQUtXRGtmUk05OVgzNUYrVjliWU1kZmlGaFdtRnVmcEorSzBOc2xDZCtRSDlCZjBkL05ublFZdUdabDM5Ulk2Ti9ZUlpvQUZ4RlpqY0RSVHFEK24rSlpBV0FDSUFkZ0NpQUw0Q0hvTU5zTzRBOGdHR0FGQ2VKU1NabTR6M29aaVZucDRCSWlnZUJHb0d3V1BZbWYyeVlaTGhQNTJTS0ZCaUNYaGhUYW1WS2xVcDZSQ21DRFF0U2FuNDkrVS85Rk9LRVlvTUthNmRKTURWekYvZzlxb0liYVpUNTIwRkxoZENDR29NV0RyUVh3VFo5TVZvMWU0TGlnaGlEaXo2amJRVnJsMnZPTmI4OUhZUHNWWVdEQzBXbGJheUR3WVBUZzM0MDFHNVhhbHFGbGpSQ2J1OHVXSVRrVzNHRTB6M2tSS2RxU29TMVBGaDVxSVNXYTNkdVEyN2VoQStFa1lPZ1JKT0U1SVNSWEVCQ3dGeERSVFNGOGxxWmJpZEZjNFVXUmI5bkZvWWxoanVHd1lXSWNBS0dnaFhOY0xMNWFrVW9oa2cyb2hqM1U1cHpmb1p4aC9pZzdvY25MTEdIMm9jUGlHRldiSVpXYUE5R1JZaEdpT0IxdVQza2RWNkluSWhiUnJTSXRZakJZOFdJZDNjUGQ0ZUppb21taWFtSnA0bThpU1dLNTRra2ViMTZuSXFUZC82UmtJcFpldWw2T251UFB4TkhPSHQ4Y1F5TEg0c3dWR1ZWUDR0TWkwMkxxWXA2U3BDTG00dXZpdDhXRlVaUGlKdU1WSDJQZmRUNUpUZFRmZGFNbUgyOWZSS05BNDBRR2R1TVhIQVJqY2xNMEQ1M2phbU5Bb0FVRUlwSmZEdThnUXh4NTNxdGpyYU93NDdVa2htUExZOWxneEtFcFk4RGs1K2lVQXF6anlwSjNvazloYnM5K0Y1aU12bVBGS0M4aGdHRkpTT0FPZGR1TjVBOGhiNTZZWkJzaFF1R3FKQVRoOFNRNW9hdWtQMlFaNUh3T3FtUnhKR3NmRE9KaVI0T2twOXNRWkppa3JsVnVaTEdpcHM4REl2YlZURU5MSk5yaytHSzY0dVBjTU5hNG9ybGltVkpSSkxzaXptTS80dHprMXVVdkk2RmxhYVZKcFNnbGZadnVVSjZKdGlHZkJJdVB0OUpIR3g3bHBhV2JFR2psdFZ1Mm1HMmx2VjQ0SXE5bHN4VG9VbTRiSFFDRUdTdmtPV1EwVW9WR1Fvek1aZENoamFYRDBvOVJZVkY2VXAxY0VGYkc1ZGNsOVdSVjVkS1crdVJYNWNsbE5CUXR6QzhNSW1YbjVleGw3Nlh3SmZTbCtDWGJGVHVseHgwTTVUL2wvV1hIWlI2ZWRGS05KZ3ptRXVZWnBnT08zVnhVVDB3Qmx4QkJsZkttTGVZeUpqSG1QOUtKMjNURnJCVjRaam1tT3lZZUpNNW1TbEtja3RYbUFXWjlaa01tanVhRUpwWW1pVlh4RGF4a05XYjRKcmltZ1diOUpvT1RCU2JMWnNBaGpSUU5KdW9hY000ZlRCUW0wQ2JQcDFGV21NWWpwdExRZ0tjLzVzTW5HaWUxSjIzbjVLaHE2SGhvQ09oMzZGK25ZT2ROS0VPbm9ob3hKMWJJWk9oSUtJN0dUT2lPWjI1b0xTaWtKNlZucDZlb3A0MFRhcWVyNTVrUThHZVlEdmxPUjA5TWsrK055dU1BcDhJbjVaTEpKU2liUmVmRnA4NW41OVdpbFpGbjdpWmk1RHlsMytFWXA5cG45eDZqcDhXY3I1TGRVbTdTWGR4K0VsSVExRktublBhaS9vWW4zbCtpVGFPYVpQemswU0s3SktCazh1VGJJbTVSQmR5Nno1eWQwTjYwSEJ6UlBoRGZuSHZGNk53dmhpWk5jYytoUmd2VlBnWElqZjdGamtZNFRaMEY5RVlTMThqTjhBV1cxY2xTdjRUcUJMR0U3WVVBNFdtTmdPRlZZU1VTV1Z4TVQ1Y1ZmcytVbkQwUk80Mm5aa21iL2xuTXpjVlBPYzliRmdpR1JCb1YwQS9OK0ZBaTBBUFFTRnN5MVNlVnJGbWtsYmZENmdMRFE3R2t4T0xuSlA0VGl0UkdUZzJSTHhPWlFSL0EwdFBpazlSVm1oYXF3SExBNWs1Q2dNVUJEVTBLVS9BQXJPT2RRTGFpZ3dDbUU3TlVBMVJvazhEVHc1S2lqNUNUeTVRYkZDQlVNeFA1VTlZVVB4UVdWRmJVVjFSWGxGMmJwVTFPVDYvUG5KdGhCaUpQcWhSdzFIZ0JkMUVvd1NTQkpFRWVvMmNpZzRIV1ZLa1VuTUk0Vkp1azNwR2pIR01ReUFNckVua0VORnBIUTU1ZE40K21YUVVkRlowbUhPT1M3eEtqVURRVTRRMUQzTEpRTFJWUlFQTlZNWUxIVmRka3ZTV1pwUGRWNDFYZjFjK05zdFltVnBHaXZvV2J4Y1FGeXhhdUZtUGtuNWF6MW9TV2taWjh4bGhHSlZDOVRZRmJVTjBJVnFEWG9GYTE0c1RCT0NUakhRREV3Vnhja2tJbFB1SnZaT2dOeDVjbmx4ZVhraGVsaGw4R2U0NnpWNVBXd01aQkJrQk42QVkzVGIrRnRNMktvRkhpcm9kY2pTb2lReGZEbDhuR2FzWGExbzdGMFJiRkliOWRXQ0lmbUJnS0NzbTIxKzRQcThsdmlXSWtITnZ3R0UrQUVZQUd5YVpZWmhoZFdDYkxBY3QxRVpOa1hGa1pVWnFLeWs2SWl0UU5PcVllQzQzWTF1a3RtUXhZOUZqNDBsbkxhUmlvU3c3Wkd0bGNtbjBPNDR3clRLSlNhc3lEVlhnTXRrWVA1VE9ab2t5c3pIZ09wQkJoRlVpaTQ5Vi9CWmJWU1ZVN25nRE1Tb1lOREprTkE4eWdqSEpRbzVtSkcxclpwTkxNR1p3ZU9zZFkyYlNNdUV5SG1aeVdORTRPamk4TjVrN29qZitNOUIwbGp1UFp5cEd0bWdlYU1RN3ZtcGpPTlUzaDBRemFsSnF5V29GYXhJWkVXV1lhRXhxMXp0NmFsZHJ3RCthUEtDVDhwTHFpOHVLaVpJZWdOeUpaNVNsYlF0djdFbG5iWDgvanowRWJqeEFQVm9LYmtkWUpHMUNlRHR4R2tOMlF2RndVSEtIY3BSeWowY2xSM2xScEVyckJYcDArRDVmTmtwS0YwbmhYd1kvc1Q3ZlNpT01OVCtuWVBNK3pIUThkSWVUTjNTZlJPcHRVVVdEZFdNLzJVd0dUVmcvVlhWemRzYWxHVHRvZE15S3EwbU9TZnM2elQxT1N2OCt4VW56U1BxUk1sZENrK09LWkJqZlVDRlM1MUY0ZHpJeURuY1BkM3QzbDBhQk4xNDY4RWc0ZEp0MHZ6NjZTc2RLeUVDV1NxNWhCNU9CVlI1NGpYaUllTko0MEhOWmVVRjM0MVlPUVp0NWxvU2xlUzFxK2o0NmV2UjVia0htRmpKQk5aTHhlVXdOakVtWkFybzliaGVYTld0VmNEV3FOdFFCRFF6aWVsbGE5U2F2V3B4YURWcGJBdkI0S2xyR1cvNTYrVUZkZkcxOEVVS3pXN3hlcGw3TmZQbEpzQmVPZkh4OHJueXlhdHg5QjM3VGZVNS9ZV0pjWVVoN2wzMkNYbXBDZFdzV0NkWm5UZ0RQTmNSWEVtVDRZMkpKM1g4bmV5d0k2VnBEWFF4N0RsN21tVVdHWTVvY2FqODA0am4zU2ExbEg1cWdaWUNFSjNIUmJPcEVONEVDUk1hQUNZRkNnYlJudzVoQ2FtS0NaWUpSYWxPRXAyMFFoaHR5aGxwL1FVQVlLMXVoR09SYTJCaWdocno1anowdGlDSjBBbHB1aUVWUGg0aS9pT2FJWllsTmlZTldWSW1GZDRSMzlZdlppNXlMK1ltdFBxT0U5VWJQUnZJM1BZb2Npa2lVVFY4cmtvUkMxR1VwY2NSd1JSaHRuWitNNll6Y2ZacFp3M2Z3V1c1RDFEWXFqcWVPQ1V3d2owcVA5RUpZYkx0dklTT2JTSGx2aTI3YUYrbWJ0VFl2U2J1UWw1QnhWUVpKdTVFRWxFdUtZa0Q4aWllVUhZdzdqT1dFSzRxWmxhZVZsNVdXbFRTTlJYVENQdjlJUWtycVErYytKVEtQbHVlT1pvNWxqc3crN1VsNFN1NC9FblJyZFB3K1FaZXdrRWRvSFVxVGtOOVhYWmRvazRtSkpvd3ZpNzVqdXBJUlcybUxQRW41Y3h0Q201ZHhsemlaSmcvQlhjV0xza29mbU5xVTlwTFhsZVdSd0VSUWkyZEtaSXZjbUVXS0FEOHFraVZKRklRN21VMlpCbnY5UFp1WmIwdXFtVnlhWll2SVdJOXFJWnIrV2krYThaaVFTMGladkptOVM1ZExmWk55V0FJVElsaTRTZWdVUkhnZko3Zzl4V2g5UFZpVUp6bFFZWUVuYXlrSFlVK2NVNXg3bkRXY0VKeC9tOCtiTFo2Zm0vV2gvcUFobmE1TUJFRVluckJNREoyMG9lMmc4NkF2bWFXZHZZUVNidDl2Z212OGhUTkZwRzJFYnZCdElJVHVoUUJ1MXpka1lPSjVuRFZBTmkxSjNrbGlQZHVUdnBKSWs3OEN1WGgza2syVTVFOUFOR1NRWFZVOWVGUjR0bmhMZUZjWHlURkJTWm8yY2svYWI5bHZIbkFlY0JSVXRVRzdWL05ZaWxjV25kZFhOSEd2Tkt4QjYzRkFiSmRQS0Z1MUYwbUtER0hPV2d0YXZFS0lSQ3czZTB2OGlidVR1SlBXR0IwUGNvVEFiQk1VK2tJbUxNRkRsRm0zUFVGbnFIMWJZYVJndVVtTFNmcUo1WkxpYytrK3RIUmppNThZNFQ2elN0aHE4M1A3YzlZK1BrcVVTdGtYWmtxbkF5UVU1VWxJZEJaSnBYQjJTWVNTNW5OZmsvNEVNWlBPaWhhS2hwUG5pOVZWTlVtQ2ltdHhRMG4vREtSV0dnYnJDN2dNQWxYRWVmb1gvbjNDRmxCS1VoZ3VSUUdVQ2pmQWlxMUpzRm0vR0lNWWhIU2hXdUkyV3oyd05sK1NlVnFCaW1JWWRKUE5QTFFLbGtxS09mUlFhVDFNUFp3VGRYSDdRaGlDRDI3a2tPdEVWMjFQZm1kd3IyeldQTzAvTFQ0Q2JneHZiejMxQTFGMXZEYklOSUJHMmo1eFNNUlpicEkrU1VHUEhJekFheEpZeUZmV05sSVUvbkJpUTNGSzR5K3dFcjBqdVdobmFaZ1Q1VFQwZTk4Mmc0cldOL296bjB3YWFxMDJ0MncraE45RXprUW1iVkZ0Z216ZWJ4ZHZDWEU5Z3pvWDdZT0FiRk53MnhlSldZSmFzeGRoV25GYUJSbjhRUzAzNzFrOEY4YzJqbkdRazVwbXBVSnVXaXRhazBJcmF2aytObmRiUk1wQ0hYRlpRdUdKc0U4b2JjSmN6a1JOZnIxRERHcFdRZ1FUcG5BemNlbERwVDNmYkNYNFQwcGxmdXRaTDEzelBWeGZYVXJmRjZSOUpvU0ZWUG82QURNVUFuNVgxUWdaQnVVL25oKzJvZ053VzVGd1hZOXowM3haaWlDVXlFL25mODF5RUhQMGVqaHpPWFAyVmtGelNIT3BQaGg3YkpEMWNmSkk0WFAyZ2NvK0RIZlJQcUpzL1ZZWmRCNTBIM1RpUHZBKzlENzZQdE4wRGo5VFAwSjFiWFZ5ZFkxMWZEL0lkZHgxd0Q5TmR0Yy9kSGJjUDNwMlhFK0ljU05XZ0lscFdCMUFRM2M1UUdGblJVRGJOWmgzYWtCdlFGNWN2bmZMZC9KWUdIaTVjQng0cUVBNWVFZDRVWGhtZUVpRU5WVXplUU5vTW5rRFFRbEJrWG1aZWJ1UEJucThqMmRCa1hxeVFieDZlWUxFUWM5NjIzclBRU0ZPWW50c2UzdDdFbndiZkdCQ2VrSjdmSng4akVLNGZKUkM3WHlUajhCd3p3elBmZFI5MEgzOWZhNS90SCtmY3BkRElJQWxnRGw3TG9BeGdGU0F6RDIwVjZCd3Q0RHBnTzFERElFcWN3NkJFb0ZnZFJTQkFVUTVPMWFCV1lGYWdSTkVPbGg4Z1lTQkpVU1RnUzFFcFlIdlY4R0I1SUZVZ285RXBvSjJnc3FDMklML2dyQkVWNE5wbG9wcEJZVDFjR1NFNDJDSWhBUkZ2b1RoaFBpRUVJVTRoVktGTzBWdmhYQ0Y0SVYzUlhLR2tvYXlodStHUlphTGh3WkdGMGF1aVArSUpJbEhpWkdKWjNrcGlqaUtsSXEwaWxHTTFJenlqQnlObUVkZldNT043VWZ1VGpxTzJGVlVWM0dPOVZXd2pqZEl6bzdpanVTTzdZN3lqcmVQd1kvS2o4eVBNNURFbWExSTRKZ1RraDVKS0pKWWttdVNzWkt1a3IrUzQ1THJrdk9TOUpMOWtrT1RoSk90azBWSlVVbS9uaGVVQVZNZGxDMlVQcFJxU1ZTVWVaUXRsYUtWcDBuMGxUT1c1VW1nWnlSS1FKYzFTcktYd3BkVVZ1Uks2R0M1bUJsTDhaaEVXQTZaR1ptMFVSeVpONWxDbVYyWllwbHdTOFdablVzOG1nK2JnM3BwbTRHYjNadnhtL1NiYlV3Z25HODN3aHRKblRxYy9wNVFWcE9kdlozQW5meWQ5cFMyajN1ZXJKNnhucjJleHA3Y2xPS2U4Wjc0bnNoNlJKK1VBTGNDb0FNYWFjT1VyRm5YQkVCWXdaUzVOOVVGRlFaMkJyb1dWMWR6Y2NJS3pRcS9DMnBVTy9qTEM1NVUrd3M3REZNTVpReDhET2RnalF4NlZyVU0zUXp0REc4TnNnM0lEVlZwTDV5bGh3UU9EZzdYRHBBUExROXpEaUJjdkE4TFhsd1FUeEIyRUI1bmV4Q0lFSllRUnphL0VOTVFMeEU3RVdSVHJZVGpFblVUTmhPQmkzY1ZHUmJERjhjWGVFNjdjQzBZYWhrdEdrVWFLaHh3SEt3Y3lCN0RZdFVlRlIrWWNWVm9SU0RwYWNnMmZDTFhJL29qS2lkeEtFOHAvWUpuS1pNcDFTcWxpZWdxb0k4T0s3aVhQeXRIbUwyYVRDd0FBSWdzdHl6b1d3Z3RFaTIzTFpVdFFpNTBMOHd2TXpCbU1COHozak94WDBobXYyWjVlbWMxOHpVQmNycEoxM2NhTmhZM2gzNUdBN1ZZRG1jWWFhYzZWM2JpWHhFK3VUNytkWm9nMEVpNFNobEJtb3J1UWcxRE8wQTBRNVpEUlVyS0JkSlJFUWFmV2FnZXZqdi9QQVJFMWtTSVYzUkdtemt2UitpRnlabGlOOE1oWG90T2k5YVpFa2o3U0JWS0NYTEFTbmdNWlZtbFRvWlBlUWZhaml4UWoxSS9WM0Z4bVZJWlZFby9wMHE4VlVaVWJsUlNhOVNSY3pRL1ZUSjJYbFVZUjJKVlpsWEhWejlKWFZobVVQczB6RFBlWUFOWmZFZElpYTVhaVZzR1hKQWRvVmRSY2JadkFtRVNmRmFRc21HYVQyS0xBbVJLWkZ0ZDkyczJqNFJrSEJucWl2WkppR1R2UHhKbHdFdS9aYlZtR3lkbGxPRlhsV0VuV3MzNHUwKzVWaUZGL0dacVRqUkpWcGFQYmIxc0dEWjNpWmxuYm1nUlpGNW8zM0hIYUVKN3dKQVJDaVpwQkpFNWFVVjY4SjM2YVNhYUxXcGZObWxrSVFDRGVUUnFXMnNzWFJrMXo0T2RhOUJHcEd3N2RXV0lybTIyV0J3M2pTVkxjTTF4VkR5QWNvVnlnWko2SVl0eU1KUG1jdEJKT1d5ZmxGQjArQTRuaVBXSUppbHpoTEVYdUc0cVNpQVlwRG01TmhCYzQzay9SYlptclp5a21FT0p6SGRZZU5aVzMwQUtGcUU1THpmb2dNVVRyWEZtZzkxNXFKRm5XcmRNcjNDcmlmMTVDbm9MZTJaOWVrRkRlMzU1Q1lDMWI5K2lBMm9ZZzZKVEIyNi9relpvWFpkdmdTT0F0V250RXk4eVNJQ0ZYVENNZzRBVlZ5T1lTWW1yWFloSnZtWFZhZEpUcFVxQlB4RThObWVRZ1BTQUxvR2hIMCtCaVlHdmdScUNCb012ZzRxRHlqVm9oS3FHK2tqbVkxYUpDSGhWa3JpSjhrUG5pZDlENklsR2k5U0wrRmtKakF1UHhZL3NrRkY3RUpFOGtmYzlYcEhLU3RDUGozS0xWdWVVNlpXd2xiaVZNcGZSbUVtWmFwbkRtU2lhRHB0YW5adWRuMzc0bmlPZnBFeEhsWk9pb25IL29wRk5FcERMcFp4Tm5BeStqOEZWdW8rd0pMbVBrMG9KUlg5K1ZtK3hhdXBPNURRc2k1MTRPamVBanZVWEpJQnNpNW1MUG5xdlp1czlWWGEzUERWV1ZsbWFUb0ZlV0dLL1ZtME9EbzV0VzRnK25remVZOUJpOWhkN0dEQmxMVlpLWEJwVUVWUEdQWmlkZlV3aVZoNVdTWC9ZWG5WWlFEMXdoeHhPNmc5SkRibzJGNEZlblJpTk8zWkZuRTUydVhkRmt6SlVTSUgzZ2lWV01vRVloTDJBNmxWaWVVTldGbFNkRHM0MUJWYnhWZkZtNG9JdE5qUjE4Rlc2VlpkVWNsVkJESllNMEY1SVVYWU9ZaXlpRHF1ZVduM2VWWFVRbldKdGw1UlV6WXoyY1hhUi9HTzVZLzVqYVZWREszS2NzeTZhVWQ4MHB3Mm5VVTFVSGxVVFZXWjJMWTZLYUxGMXRvQUVpSWFIeDRpMmdSeUV3UkRzUkFSekJrZVFXd3VEazJoN1Z2UW1MMzJqUVhOOTBHNjJjbkNSMlJFSWt2dzhxYWFzRHZrT1puS2lIRTVId2svNWYrc1Ara0JkbkI5bG9DM3pTT0JIZkozc0R3b09ZbUNqZGUwUEFBQklZSWNSbzNHT2ZsQ2RHazRFVG5jMURWdXliR2RUckRiY09YMVRwVFlZUnBwWWJrc3Rna3RVcWxlVldua0pBQUJTT21Va2RIT3NuZ2xON1p2K1BEQ2ZXMHlwVDU2VjNwOWNoTFk5c25Lelp5QTNMbU1sZmZjK0xENHFPZ2lRekZKMFBubzI2VVdPQkVCMjhGcTJEbnA0TG4rbldMOUFmRmFMbTNSZFZIWTBwSVdlNFV6NWRmczNHV0hhTVBKREFBQmRWcWtTcDFkalNRYWVORkt1Y0swMVNteDhuVlo4T1p2ZVYyd1hVMXpUWk5DVU5XTmtjYTJHS0EwaWJlSktjUTBBQVA1UkR4K09YUU9YMFIyQm5reVFIM3NDbTlGY28zdG9ZalZqLzVyUGV5cWJmbnd1bTBKOGhud1ZuUHg3Q1pzWG54dWNQa2xhbjNOVncxdjlUNWllOGs5Z1VnWSswVkpuVjFaUXQxa1NYc2lYcTUxY2oybFV0SmRBbWJxWExGTXdZU3hwMmxNS25BS2RPMHhCbG9CcHBsQkdkVzBYMnBselVnQUFXWkdCbGx5UkFBQlJrWmVPZjJNamJjcHFFVmFPa1hwMWhXTDhBMDl6Y0h3aFhQMDhBQUFaU2RaMm5ac3FUdFFNdm9OQ2lBQUFTbHpBYWUxUWVsY2ZVdlZkems0eGJQSUJPVStjVk5wVW1sS0NqZjQxREYvek5RQUFVbXQ4a2FXZmw1c3VtTFNZdXBxb25vU2VlbkVVZXdBQSttc1lpSGgvQUFBZ1ZrcW1kNDVUbndBQTFJMVBqaHllQVk2Q1luMkRLSTUxanRONmQwbytldGg0Nm14bmlnZDJXb29tbjg1czFvZkRkYktpVTNoQStBeU40bkp4Y3kyTEFuUHhkT3VNdTBvdmhycGZvSWkzUkFBQU94Z0ZiZ0FBZm9vYkpRQUEvV0JuZHRlYVJKMXVrNCtiOVljQUFBK0k5NHdzY3lHWHNKdldOYkp5QjB4UmZFcVpXV0ZaWVFSTWxwNTlZUUFBWDFkdllhWmlPV0xPWWx3NjRtR3FVL1V6WkdNQ2FOSTFWMTNDaTlxUE9ZNEFBTmxRUmgwR2VUSlRPSlk3RDJWQUFBRCtkd0FBd253YVg5cDhMWHBtZ0dPQVRYMEZkZkowbElrYWdneG5Zb0NHZEZ1QThIUURnU1IzaVluTVoxTjEwVzZwaDg2SHlJR01oMG1Lcll4RGl5dDMrSFRhaERVMnNtbW1qUUFBcVlsb2RMbHR3WWNSUU9kMDJ6MTJjYVJnbkdIUlBHSnhkMkFBQUhGL0xZdFFjdWxnZmtzZ1VoZzh4enpYWGxaMk1WVkVHZjRTQTVuY2JhMXd3Vnl0WVErS2R6YnVBRVpvRGs5aVJSOWJUR05RbjZhZWEySUFNQXovQVRBQ01BNy9KeUFiL3hyL0gvOEIvekQrSmlBbElGRCtVZjVTL3JjQVZQNVYvbGIrVi81Yy94TWdNZjRVSURQK2RDVTAvay8rQ1A4Si96WCtOdjViLzEzL04vNDQvaFF3RlRBNS9qcitFREFSTUR2K1BQNEtNQXN3UGY0Ky9nZ3dDVEEvL2tEK0REQU5NRUgrUXY0T01BOHdRLzVFL2xuK1d2NWIvbHorWGY1ZS9oZ2dHU0FjSUIwZ0hUQWVNRFVnTWlBRC93Yi9Ddjg3SUtjQUF6RExKYzhsc3lXeUpjNGxCaVlGSnNjbHhpV2hKYUFsdlNXOEphTXlCU0d2QU9QL1AvL05Ba24rU3Y1Ti9rNytTLzVNL2wvK1lQNWgvZ3YvRGYvWEFQY0FzUUFhSWh6L0h2OGQvMllpWnlKZ0loNGlVaUpoSW1MK1kvNWsvbVgrWnY1ZS95a2lLaUtsSWlBaUh5Sy9JdEl6MFRNcklpNGlOU0kwSWtBbVFpYVZJcGtpa1NHVElaQWhraUdXSVpjaG1TR1lJU1VpSXlJUC96ei9GU0pvL2dULzVmOFNNT0QvNGY4Ri95RC9BeUVKSVduK2F2NXIvdFV6bkRPZE01NHp6ak9oTTQ0emp6UEVNN0FBV1ZGYlVWNVJYVkZoVVdOUjUxWHBkTTU4Z1NXQ0pZTWxoQ1dGSllZbGh5V0lKWThsamlXTkpZd2xpeVdLSllrbFBDVTBKU3dsSkNVY0paUWxBQ1VDSlpVbERDVVFKUlFsR0NWdEpXNGxjQ1Z2SlZBbFhpVnFKV0VsNGlYakplVWw1Q1Z4SlhJbGN5VVEveEgvRXY4VC94VC9GZjhXL3hmL0dQOFovMkFoWVNGaUlXTWhaQ0ZsSVdZaFp5Rm9JV2toSVRBaU1DTXdKREFsTUNZd0p6QW9NQ2t3UVZORVUwVlRJZjhpL3lQL0pQOGwveWIvSi84by95bi9LdjhyL3l6L0xmOHUveS8vTVA4eC96TC9NLzgwL3pYL052ODMvemovT2Y4Ni8wSC9RdjlELzBUL1JmOUcvMGYvU1A5Si8wci9TLzlNLzAzL1R2OVAvMUQvVWY5Uy8xUC9WUDlWLzFiL1YvOVkvMW4vV3YrUkE1SURrd09VQTVVRGxnT1hBNWdEbVFPYUE1c0RuQU9kQTU0RG53T2dBNkVEb3dPa0E2VURwZ09uQTZnRHFRT3hBN0lEc3dPMEE3VUR0Z08zQTdnRHVRTzZBN3NEdkFPOUE3NER2d1BBQThFRHd3UEVBOFVEeGdQSEE4Z0R5UU1GTVFZeEJ6RUlNUWt4Q2pFTE1Rd3hEVEVPTVE4eEVERVJNUkl4RXpFVU1SVXhGakVYTVJneEdURWFNUnN4SERFZE1SNHhIekVnTVNFeElqRWpNU1F4SlRFbU1TY3hLREVwTWRrQ3lRTEtBc2NDeXdJQUpBRWtBaVFESkFRa0JTUUdKQWNrQ0NRSkpBb2tDeVFNSkEwa0RpUVBKQkFrRVNRU0pCTWtGQ1FWSkJZa0Z5UVlKQmtrR2lRYkpCd2tIU1FlSkI4a0lTU3NJQUJCMjhuQ0FBdXRXVTVaVGdGT0EwNURUbDFPaGs2TVRycE9QMUZsVVd0UjRGRUFVZ0ZTbTFJVlUwRlRYRlBJVXdsT0MwNElUZ3BPSzA0NFR1RlJSVTVJVGw5T1hrNk9UcUZPUUZFRFV2cFNRMVBKVStOVEgxZnJXQlZaSjFseldWQmJVVnRUVy9oYkQxd2lYRGhjY1Z6ZFhlVmQ4VjN5WGZOZC9sMXlYdjVlQzE4VFgwMWlFVTRRVGcxT0xVNHdUamxPUzA0NVhJaE9rVTZWVHBKT2xFNmlUc0ZPd0U3RFRzWk94MDdOVHNwT3kwN0VUa05SUVZGblVXMVJibEZzVVpkUjlsRUdVZ2RTQ0ZMN1V2NVMvMUlXVXpsVFNGTkhVMFZUWGxPRVU4dFR5bFBOVSt4WUtWa3JXU3BaTFZsVVd4RmNKRnc2WEc5YzlGMTdYdjllRkY4Vlg4TmZDR0kyWWt0aVRtSXZaWWRsbDJXa1pibGw1V1h3WmdobktHY2dhMkpyZVd2TGE5UnIyMnNQYkRSc2EzQXFjalp5TzNKSGNsbHlXM0tzY290ekdVNFdUaFZPRkU0WVRqdE9UVTVQVGs1TzVVN1lUdFJPMVU3V1R0ZE80MDdrVHRsTzNrNUZVVVJSaVZHS1VheFIrVkg2VWZoUkNsS2dVcDlTQlZNR1V4ZFRIVlBmVGtwVFNWTmhVMkJUYjFOdVU3dFQ3MVBrVS9OVDdGUHVVK2xUNkZQOFUvaFQ5VlByVStaVDZsUHlVL0ZUOEZQbFUrMVQrMVBiVnRwV0Zsa3VXVEZaZEZsMldWVmJnMXM4WE9oZDUxM21YUUplQTE1elhueGVBVjhZWHhkZnhWOEtZbE5pVkdKU1lsRmlwV1htWlM1bkxHY3FaeXRuTFdkamE4MXJFV3dRYkRoc1FXeEFiRDVzcjNLRWM0bHozSFRtZEJoMUgzVW9kU2wxTUhVeGRUSjFNM1dMZFgxMnJuYS9kdTUyMjNmaWQvTjNPbm0rZVhSNnkzb2VUaDlPVWs1VFRtbE9tVTZrVHFaT3BVNy9UZ2xQR1U4S1R4VlBEVThRVHhGUEQwL3lUdlpPKzA3d1R2Tk8vVTRCVHd0UFNWRkhVVVpSU0ZGb1VYRlJqVkd3VVJkU0VWSVNVZzVTRmxLalVnaFRJVk1nVTNCVGNWTUpWQTlVREZRS1ZCQlVBVlFMVkFSVUVWUU5WQWhVQTFRT1ZBWlVFbFRnVnQ1VzNWWXpWekJYS0ZjdFZ5eFhMMWNwVnhsWkdsazNXVGhaaEZsNFdZTlpmVmw1V1lKWmdWbFhXMWhiaDF1SVc0VmJpVnY2V3haY2VWemVYUVplZGw1MFhnOWZHMS9aWDlaZkRtSU1ZZzFpRUdKallsdGlXR0kyWmVsbDZHWHNaZTFsOG1ielpnbG5QV2MwWnpGbk5XY2hhMlJyZTJzV2JGMXNWMnhaYkY5c1lHeFFiRlZzWVd4YmJFMXNUbXh3Y0Y5eVhYSitkdmw2YzN6NGZEWi9pbis5ZndHQUE0QU1nQktBTTRCL2dJbUFpNENNZ09PQjZvSHpnZnlCRElJYmdoK0Nib0p5Z242Q2E0WkFpRXlJWTRoL2lTR1dNazZvVGsxUFQwOUhUMWRQWGs4MFQxdFBWVTh3VDFCUFVVODlUenBQT0U5RFQxUlBQRTlHVDJOUFhFOWdUeTlQVGs4MlQxbFBYVTlJVDFwUFRGRkxVVTFSZFZHMlViZFJKVklrVWlsU0tsSW9VcXRTcVZLcVVxeFNJMU56VTNWVEhWUXRWQjVVUGxRbVZFNVVKMVJHVkVOVU0xUklWRUpVRzFRcFZFcFVPVlE3VkRoVUxsUTFWRFpVSUZROFZFQlVNVlFyVkI5VUxGVHFWdkJXNUZiclZrcFhVVmRBVjAxWFIxZE9WejVYVUZkUFZ6dFg3MWcrV1oxWmtsbW9XWjVabzFtWldaWlpqVm1rV1pOWmlsbWxXVjFiWEZ0YVcxdGJqRnVMVzQ5YkxGeEFYRUZjUDF3K1hKQmNrVnlVWEl4YzYxME1YbzllaDE2S1h2ZGVCRjhmWDJSZllsOTNYM2xmMkYvTVg5ZGZ6Vi94WCt0ZitGL3FYeEppRVdLRVlwZGlsbUtBWW5aaWlXSnRZb3BpZkdKK1lubGljMktTWW05aW1HSnVZcFZpazJLUllvWmlPV1U3WlRobDhXWDBabDluVG1kUFoxQm5VV2RjWjFablhtZEpaMFpuWUdkVFoxZG5aV3ZQYTBKc1hteVpiSUZzaUd5SmJJVnNtMnhxYkhwc2tHeHdiSXhzYUd5V2JKSnNmV3lEYkhKc2ZteDBiSVpzZG15TmJKUnNtR3lDYkhad2ZIQjljSGh3WW5KaGNtQnl4SExDY3BaekxIVXJkVGQxT0hXQ2R1OTI0M2ZCZWNCNXYzbDJldnQ4VlgrV2dKT0FuWUNZZ0p1QW1vQ3lnRytDa29LTGdvMkNpNG5TaVFDS040eEdqRldNbll4a2pYQ05zNDJyanNxT200K3dqOEtQeG8vRmo4U1A0VjJSa0tLUXFwQ21rS09RU1pIR2tjeVJNcFl1bGpHV0twWXNsaVpPVms1elRvdE9tMDZlVHF0T3JFNXZUNTFQalU5elQzOVBiRStiVDR0UGhrK0RUM0JQZFUrSVQybFBlMCtXVDM1UGowK1JUM3BQVkZGU1VWVlJhVkYzVVhaUmVGRzlVZjFSTzFJNFVqZFNPbEl3VWk1U05sSkJVcjVTdTFKU1UxUlRVMU5SVTJaVGQxTjRVM2xUMWxQVVU5ZFRjMVIxVkpaVWVGU1ZWSUJVZTFSM1ZJUlVrbFNHVkh4VWtGUnhWSFpVakZTYVZHSlVhRlNMVkgxVWpsVDZWb05YZDFkcVYybFhZVmRtVjJSWGZGY2NXVWxaUjFsSVdVUlpWRm0rV2J0WjFGbTVXYTVaMFZuR1dkQlp6Vm5MV2ROWnlsbXZXYk5aMGxuRldWOWJaRnRqVzVkYm1sdVlXNXhibVZ1Yld4cGNTRnhGWEVaY3QxeWhYTGhjcVZ5clhMRmNzMXdZWGhwZUZsNFZYaHRlRVY1NFhwcGVsMTZjWHBWZWxsNzJYaVpmSjE4cFg0QmZnVjkvWDN4ZjNWL2dYLzFmOVYvL1h3OWdGR0F2WURWZ0ZtQXFZQlZnSVdBbllDbGdLMkFiWUJaaUZXSS9ZajVpUUdKL1lzbGl6R0xFWXI5aXdtSzVZdEppMjJLcll0TmkxR0xMWXNoaXFHSzlZcnhpMEdMWllzZGl6V0sxWXRwaXNXTFlZdFppMTJMR1lxeGl6bUkrWmFkbHZHWDZaUlJtRTJZTVpnWm1BbVlPWmdCbUQyWVZaZ3BtQjJZTlp3dG5iV2VMWjVWbmNXZWNaM05uZDJlSFo1MW5sMmR2WjNCbmYyZUpaMzVua0dkMVo1cG5rMmQ4WjJwbmNtY2phMlpyWjJ0L2F4TnNHMnpqYk9oczgyeXhiTXhzNVd5emJMMXN2bXk4Yk9Kc3EyelZiTk5zdUd6RWJMbHN3V3l1Yk5kc3hXenhiTDlzdTJ6aGJOdHN5bXlzYk85czNHeldiT0JzbFhDT2NKSndpbkNaY0N4eUxYSTRja2h5WjNKcGNzQnl6bkxaY3RkeTBIS3BjNmh6bjNPcmM2VnpQWFdkZFpsMW1uV0Vkc0oyOG5iMGR1VjMvWGMrZVVCNVFYbkplY2g1ZW5wNWV2cDYvbnhVZjR4L2kzOEZnTHFBcFlDaWdMR0FvWUNyZ0ttQXRJQ3FnSytBNVlIK2dRMkNzNEtkZ3BtQ3JZSzlncCtDdVlLeGdxeUNwWUt2Z3JpQ280S3dncjZDdDRKT2huR0dIVkpvaU11T3pvL1VqOUdQdFpDNGtMR1F0cERIa2RHUmQ1V0FsUnlXUUpZL2xqdVdSSlpDbHJtVzZKWlNsMTZYbjA2dFRxNU80VSsxVDY5UHYwL2dUOUZQejAvZFQ4TlB0ay9ZVDk5UHlrL1hUNjVQMEUvRVQ4SlAyay9PVDk1UHQwOVhVWkpSa1ZHZ1VVNVNRMUpLVWsxU1RGSkxVa2RTeDFMSlVzTlN3VklOVTFkVGUxT2FVOXRUckZUQVZLaFV6bFRKVkxoVXBsU3pWTWRVd2xTOVZLcFV3VlRFVk1oVXIxU3JWTEZVdTFTcFZLZFV2MVQvVm9KWGkxZWdWNk5Yb2xmT1Y2NVhrMWRWV1ZGWlQxbE9XVkJaM0ZuWVdmOVo0MW5vV1FOYTVWbnFXZHBaNWxrQld2dFphVnVqVzZaYnBGdWlXNlZiQVZ4T1hFOWNUVnhMWE5sYzBsejNYUjFlSlY0ZlhuMWVvRjZtWHZwZUNGOHRYMlZmaUYrRlg0cGZpMStIWDR4ZmlWOFNZQjFnSUdBbFlBNWdLR0JOWUhCZ2FHQmlZRVpnUTJCc1lHdGdhbUJrWUVGaTNHSVdZd2xqL0dMdFlnRmo3bUw5WWdkajhXTDNZdTlpN0dMK1l2UmlFV01DWXo5bFJXV3JaYjFsNG1VbFppMW1JR1luWmk5bUgyWW9aakZtSkdiM1p2OW4wMmZ4WjlSbjBHZnNaN1pucjJmMVorbG43MmZFWjlGbnRHZmFaK1ZudUdmUFo5NW44MmV3WjlsbjRtZmRaOUpuYW11RGE0WnJ0V3ZTYTlkckgyekpiQXR0TW0wcWJVRnRKVzBNYlRGdEhtMFhiVHR0UFcwK2JUWnRHMjMxYkRsdEoyMDRiU2x0TG0wMWJRNXRLMjJyY0xwd3MzQ3NjSzl3clhDNGNLNXdwSEF3Y25KeWIzSjBjdWx5NEhMaGNyZHp5bk83YzdKenpYUEFjN056R25VdGRVOTFUSFZPZFV0MXEzV2tkYVYxb25XamRYaDJobmFIZG9oMnlIYkdkc04yeFhZQmQvbDIrSFlKZHd0My9uYjhkZ2QzM0hjQ2VCUjRESGdOZUVaNVNYbEllVWQ1dVhtNmVkRjUwbm5MZVg5NmdYci9ldjE2Zlh3Q2ZRVjlBSDBKZlFkOUJIMEdmVGgvam4rL2Z3U0FFSUFOZ0JHQU5vRFdnT1dBMm9ERGdNU0F6SURoZ051QXpvRGVnT1NBM1lEMGdTS0M1NElEZ3dXRDQ0TGJndWFDQklQbGdnS0RDWVBTZ3RlQzhZSUJnOXlDMUlMUmd0NkMwNExmZ3UrQ0JvTlFobm1HZTRaNmhrMklhNGlCaWRTSkNJb0NpZ09Lbm95Z2pIU05jNDIwamMyT3pJN3dqK2FQNG8vcWorV1A3WS9yaitTUDZJL0trTTZRd1pERGtFdVJTcEhOa1lLVlVKWkxsa3lXVFpaaWwybVh5NWZ0bC9PWEFaaW9tTnVZMzVpV21abVpXRTZ6VGd4UURWQWpVTzlQSmxBbFVQaFBLVkFXVUFaUVBGQWZVQnBRRWxBUlVQcFBBRkFVVUNoUThVOGhVQXRRR1ZBWVVQTlA3azh0VUNwUS9rOHJVQWxRZkZHa1VhVlJvbEhOVWN4UnhsSExVVlpTWEZKVVVsdFNYVklxVTM5VG4xT2RVOTlUNkZRUVZRRlZOMVg4Vk9WVThsUUdWZnBVRkZYcFZPMVU0VlFKVmU1VTZsVG1WQ2RWQjFYOVZBOVZBMWNFVjhKWDFGZkxWOE5YQ1ZnUFdWZFpXRmxhV1JGYUdGb2NXaDlhRzFvVFd1eFpJRm9qV2lsYUpWb01XZ2xhYTF0WVhMQmJzMXUyVzdSYnJsdTFXN2xidUZzRVhGRmNWVnhRWE8xYy9WejdYT3BjNkZ6d1hQWmNBVjMwWE81ZExWNHJYcXRlclY2blhqRmZrbCtSWDVCZldXQmpZR1ZnVUdCVllHMWdhV0J2WUlSZ24yQ2FZSTFnbEdDTVlJVmdsbUJIWXZOaUNHUC9ZazVqUG1NdlkxVmpRbU5HWTA5alNXTTZZMUJqUFdNcVl5dGpLR05OWTB4alNHVkpaWmxsd1dYRlpVSm1TV1pQWmtObVVtWk1aa1ZtUVdiNFpoUm5GV2NYWnlGb09HaElhRVpvVTJnNWFFSm9WR2dwYUxOb0YyaE1hRkZvUFdqMFoxQm9RR2c4YUVOb0ttaEZhQk5vR0doQmFJcHJpV3UzYXlOc0oyd29iQ1pzSkd6d2JHcHRsVzJJYllkdFptMTRiWGR0V1cyVGJXeHRpVzF1YlZwdGRHMXBiWXh0aW0xNWJZVnRaVzJVYmNwdzJIRGtjTmx3eUhEUGNEbHllWEw4Y3ZseS9YTDRjdmR5aG5QdGN3bDA3blBnYytwejNuTlVkVjExWEhWYWRWbDF2blhGZGNkMXNuV3pkYjExdkhXNWRjSjF1SFdMZHJCMnluYk5kczUyS1hjZmR5QjNLSGZwZHpCNEozZzRlQjE0TkhnM2VDVjRMWGdnZUI5NE1uaFZlVkI1WUhsZmVWWjVYbmxkZVZkNVdubmtlZU41NTNuZmVlWjU2WG5ZZVlSNmlIclplZ1o3RVh1SmZDRjlGMzBMZlFwOUlIMGlmUlI5RUgwVmZScDlISDBOZlJsOUczMDZmMTkvbEgvRmY4Ri9Cb0FZZ0JXQUdZQVhnRDJBUDREeGdBS0I4SUFGZ2UyQTlJQUdnZmlBODRBSWdmMkFDb0g4Z08rQTdZSHNnUUNDRUlJcWdpdUNLSUlzZ3J1Q0s0TlNnMVNEU29NNGcxQ0RTWU0xZ3pTRFQ0TXlnem1ETm9NWGcwQ0RNWU1vZzBPRFZJYUtocXFHazRha2hxbUdqSWFqaHB5R2NJaDNpSUdJZ29oOWlIbUlHSW9RaWc2S0RJb1ZpZ3FLRjRvVGloYUtENG9SaWtpTWVveDVqS0dNb294M2pheU8wbzdVanMrT3NZOEJrQWFROTQ4QWtQcVA5SThEa1AyUEJaRDRqNVdRNFpEZGtPS1FVcEZOa1V5UjJKSGRrZGVSM0pIWmtZT1ZZcFpqbG1HV1c1WmRsbVNXV0paZWxydVc0cGlzbWFpYTJKb2xtektiUEp0K1RucFFmVkJjVUVkUVExQk1VRnBRU1ZCbFVIWlFUbEJWVUhWUWRGQjNVRTlRRDFCdlVHMVFYRkdWVWZCUmFsSnZVdEpTMlZMWVV0VlNFRk1QVXhsVFAxTkFVejVUdzFQOFprWlZhbFZtVlVSVlhsVmhWVU5WU2xVeFZWWlZUMVZWVlM5VlpGVTRWUzVWWEZVc1ZXTlZNMVZCVlZkVkNGY0xWd2xYMzFjRldBcFlCbGpnVitSWCtsY0NXRFZZOTFmNVZ5QlpZbGsyV2tGYVNWcG1XbXBhUUZvOFdtSmFXbHBHV2twYWNGdkhXOFZieEZ2Q1c3OWJ4bHNKWEFoY0IxeGdYRnhjWFZ3SFhRWmREbDBiWFJaZElsMFJYU2xkRkYwWlhTUmRKMTBYWGVKZE9GNDJYak5lTjE2M1hyaGV0bDYxWHI1ZU5WODNYMWRmYkY5cFgydGZsMStaWDU1Zm1GK2hYNkJmbkY5L1lLTmdpV0NnWUtoZ3kyQzBZT1pndldERllMdGd0V0RjWUx4ZzJHRFZZTVpnMzJDNFlOcGd4MkFhWWh0aVNHS2dZNmRqY21PV1k2SmpwV04zWTJkam1HT3FZM0ZqcVdPSlk0TmptMk5yWTZoamhHT0lZNWxqb1dPc1k1SmpqMk9BWTN0amFXTm9ZM3BqWFdWV1pWRmxXV1ZYWlY5VlQyVllaVlZsVkdXY1padGxyR1hQWmN0bHpHWE9aVjFtV21aa1ptaG1abVplWnZsbTExSWJaNEZvcjJpaWFKTm90V2gvYUhab3NXaW5hSmRvc0dpRGFNUm9yV2lHYUlWb2xHaWRhS2hvbjJpaGFJSm9NbXU2YSt0cjdHc3JiSTV0dkczemJkbHRzbTNoYmN4dDVHMzdiZnB0Qlc3SGJjdHRyMjNSYmE1dDNtMzViYmh0OTIzMWJjVnQwbTBhYnJWdDJtM3JiZGh0Nm0zeGJlNXQ2RzNHYmNSdHFtM3NiYjl0NW0zNWNBbHhDbkg5Y085d1BYSjljb0Z5SEhNYmN4WnpFM01aYzRkekJYUUtkQU4wQm5UK2N3MTA0SFQyZFBkMEhIVWlkV1YxWm5WaWRYQjFqM1hVZGRWMXRYWEtkYzExam5iVWR0SjIyM1kzZHo1M1BIYzJkemgzT25kcmVFTjRUbmhsZVdoNWJYbjdlWko2bFhvZ2V5aDdHM3NzZXlaN0dYc2VleTU3a255WGZKVjhSbjFEZlhGOUxuMDVmVHg5UUgwd2ZUTjlSSDB2ZlVKOU1uMHhmVDEvbm4rYWY4eC96bi9TZnh5QVNvQkdnQytCRm9FamdTdUJLWUV3Z1NTQkFvSTFnamVDTm9JNWdvNkRub09ZZzNpRG9vT1dnNzJEcTRPU2c0cURrNE9KZzZDRGQ0TjdnM3lEaG9PbmcxV0dhbC9IaHNDR3RvYkVocldHeG9iTGhyR0dyNGJKaGxPSW5vaUlpS3VJa29pV2lJMklpNGlUaVkrSktvb2RpaU9LSllveGlpMktING9iaWlLS1NZeGFqS21Nckl5cmpLaU1xb3luakdlTlpvMitqYnFOMjQ3ZmpobVFEWkFha0JlUUk1QWZrQjJRRUpBVmtCNlFJSkFQa0NLUUZwQWJrQlNRNkpEdGtQMlFWNUhPa2ZXUjVwSGprZWVSN1pIcGtZbVZhcFoxbG5PV2VKWndsblNXZHBaM2xteVd3SmJxbHVtVzRIcmZlZ0tZQTVoYW0rV2NkWjUvbnFXZXU1NmlVSTFRaFZDWlVKRlFnRkNXVUpoUW1sQUFaL0ZSY2xKMFVuVlNhVkxlVXQxUzIxSmFVNlZUZTFXQVZhZFZmRldLVloxVm1GV0NWWnhWcWxXVVZZZFZpMVdEVmJOVnJsV2ZWVDVWc2xXYVZidFZyRld4Vlg1VmlWV3JWWmxWRFZjdldDcFlORmdrV0RCWU1WZ2hXQjFZSUZqNVdQcFlZRmwzV3BwYWYxcVNXcHRhcDFwelczRmIwbHZNVzlOYjBGc0tYQXRjTVZ4TVhWQmRORjFIWGYxZFJWNDlYa0JlUTE1K1hzcGV3VjdDWHNSZVBGOXRYNmxmcWwrb1g5Rmc0V0N5WUxaZzRHQWNZU05oK21BVllmQmcrMkQwWUdoaDhXQU9ZZlpnQ1dFQVlSSmhIMkpKWXFOampHUFBZOEJqNldQSlk4Wmp6V1BTWStOajBHUGhZOVpqN1dQdVkzWmo5R1BxWTl0alVtVGFZL2xqWG1WbVpXSmxZMldSWlpCbHIyVnVabkJtZEdaMlptOW1rV1o2Wm41bWQyYitadjltSDJjZFovcG8xV2pnYU5obzEyZ0ZhZDlvOVdqdWFPZG8rV2pTYVBKbzQyakxhTTFvRFdrU2FRNXB5V2phYUc1cCsyZythenByUFd1WWE1WnJ2R3Z2YXk1c0wyd3NiQzl1T0c1VWJpRnVNbTVuYmtwdUlHNGxiaU51RzI1YmJsaHVKRzVXYm01dUxXNG1ibTl1Tkc1TmJqcHVMRzVEYmgxdVBtN0xib2x1R1c1T2JtTnVSRzV5Ym1sdVgyNFpjUnB4Sm5Fd2NTRnhObkZ1Y1J4eFRIS0Vjb0J5Tm5NbGN6UnpLWE02ZENwME0zUWlkQ1YwTlhRMmREUjBMM1FiZENaMEtIUWxkU1oxYTNWcWRlSjEyM1hqZGRsMTJIWGVkZUIxZTNaOGRwWjJrM2EwZHR4MlQzZnRkMTE0YkhodmVBMTZDSG9MZWdWNkFIcVllcGQ2bG5ybGV1TjZTWHRXZTBaN1VIdFNlMVI3VFh0TGUwOTdVWHVmZktWOFhuMVFmV2g5VlgwcmZXNTljbjFoZldaOVluMXdmWE45aEZYVWY5Vi9DNEJTZ0lXQVZZRlVnVXVCVVlGT2dUbUJSb0UrZ1V5QlU0RjBnUktDSElMcGd3T0UrSU1OaE9DRHhZTUxoTUdENzRQeGcvU0RWNFFLaFBDRERJVE1nLzJEOG9QS2d6aUVEb1FFaE55REI0VFVnOStEVzRiZmh0bUc3WWJVaHR1RzVJYlFodDZHVjRqQmlNS0lzWWlEaVphSk80cGdpbFdLWG9vOGlrR0tWSXBiaWxDS1JvbzBpanFLTm9wV2ltR01nb3l2akx5TXM0eTlqTUdNdTR6QWpMU010NHkyakwrTXVJeUtqWVdOZ1kzT2pkMk55NDNhamRHTnpJM2JqY2FOKzQ3NGp2eU9uSTh1a0RXUU1aQTRrREtRTnBBQ2tmV1FDWkgra0dPUlpaSFBrUlNTRlpJamtnbVNIcElOa2hDU0I1SVJrcFNWajVXTGxaR1ZrNVdTbFk2VmlwYU9sb3VXZlphRmxvYVdqWlp5bG9TV3daYkZsc1NXeHBiSGx1K1c4cGJNbHdXWUJwZ0ltT2VZNnBqdm1PbVk4cGp0bUs2WnJabkRuczJlMFo2Q1RxMVF0VkN5VUxOUXhWQytVS3hRdDFDN1VLOVF4MUIvVW5kU2ZWTGZVdVpTNUZMaVV1TlNMMVBmVmVoVjAxWG1WYzVWM0ZYSFZkRlY0MVhrVmU5VjJsWGhWY1ZWeGxYbFZjbFZFbGNUVjE1WVVWaFlXRmRZV2xoVVdHdFlURmh0V0VwWVlsaFNXRXRZWjFuQldzbGF6RnErV3IxYXZGcXpXc0phc2xwcFhXOWRURjU1WHNsZXlGNFNYMWxmckYrdVh4cGhEMkZJWVI5aDgyQWJZZmxnQVdFSVlVNWhUR0ZFWVUxaFBtRTBZU2RoRFdFR1lUZGhJV0lpWWhOa1BtUWVaQ3BrTFdROVpDeGtEMlFjWkJSa0RXUTJaQlprRjJRR1pHeGxuMld3WlpkbWlXYUhab2htbG1hRVpwaG1qV1lEWjVScGJXbGFhWGRwWUdsVWFYVnBNR21DYVVwcGFHbHJhVjVwVTJsNWFZWnBYV2xqYVZ0cFIydHlhOEJydjJ2VGEvMXJvbTZ2YnROdXRtN0NicEJ1blc3SGJzVnVwVzZZYnJ4dXVtNnJidEZ1bG02Y2JzUnUxRzZxYnFkdXRHNU9jVmx4YVhGa2NVbHhaM0ZjY1d4eFpuRk1jV1Z4WG5GR2NXaHhWbkU2Y2xKeU4zTkZjejl6UG5OdmRGcDBWWFJmZEY1MFFYUS9kRmwwVzNSY2RIWjFlSFVBZHZCMUFYYnlkZkYxK25YL2RmUjE4M1hlZHQ5MlczZHJkMlozWG5kamQzbDNhbmRzZDF4M1pYZG9kMkozN25lT2VMQjRsM2lZZUl4NGlYaDhlSkY0azNoL2VIcDVmM21CZVN5RXZYa2NlaHA2SUhvVWVoOTZIbnFmZXFCNmQzdkFlMkI3Ym50bmU3RjhzM3kxZkpOOWVYMlJmWUY5ajMxYmZXNS9hWDlxZjNKL3FYK29mNlIvVm9CWWdJYUFoSUJ4Z1hDQmVJRmxnVzZCYzRGcmdYbUJlb0ZtZ1FXQ1I0S0NoSGVFUFlReGhIV0Vab1JyaEVtRWJJUmJoRHlFTllSaGhHT0VhWVJ0aEVhRVhvWmNobCtHK1lZVGh3aUhCNGNBaC82Rys0WUNod09IQm9jS2gxbUkzNGpVaU5tSTNJallpTjJJNFlqS2lOV0kwb2ljaWVPSmE0cHlpbk9LWm9wcGluQ0toNHA4aW1PS29JcHhpb1dLYllwaWltNktiSXA1aW51S1BvcG9pbUtNaW95SmpNcU14NHpJak1TTXNvekRqTUtNeFl6aGpkK042STN2amZPTitvM3FqZVNONW8yeWpnT1BDWS8ramdxUG40K3lqMHVRU3BCVGtFS1FWSkE4a0ZXUVVKQkhrRStRVHBCTmtGR1FQcEJCa0JLUkY1RnNrV3FSYVpISmtUZVNWNUk0a2oyU1FKSStrbHVTUzVKa2tsR1NOSkpKa2syU1JaSTVraitTV3BLWWxaaVdsSmFWbHMyV3k1Ykpsc3FXOTViN2x2bVc5cFpXbDNTWGRwY1FtQkdZRTVnS21CS1lESmo4bVBTWS9aaittTE9ac1ptMG1lR2E2WnlDbmc2ZkU1OGduK2RRN2xEbFVOWlE3VkRhVU5WUXoxRFJVUEZRemxEcFVHSlI4MUdEVW9KU01WT3RVLzVWQUZZYlZoZFcvVlVVVmdaV0NWWU5WZzVXOTFVV1ZoOVdDRllRVnZaVkdGY1dWM1ZZZmxpRFdKTllpbGg1V0lWWWZWajlXQ1ZaSWxra1dXcFphVm5oV3VaYTZWclhXdFphMkZyalduVmIzbHZuVytGYjVWdm1XK2hiNGx2a1c5OWJEVnhpWElSZGgxMWJYbU5lVlY1WFhsUmUwMTdXWGdwZlJsOXdYN2xmUjJFL1lVdGhkMkZpWVdOaFgyRmFZVmhoZFdFcVlvZGtXR1JVWktSa2VHUmZaSHBrVVdSblpEUmtiV1I3WkhKbG9XWFhaZFpsb21hb1pwMW1uR21vYVpWcHdXbXVhZE5weTJtYmFiZHB1Mm1yYWJScDBHbk5hYTFwekdtbWFjTnBvMmxKYTB4ck0yd3pieFJ2L200VGIvUnVLVzgrYnlCdkxHOFBid0p2SW0vL2J1OXVCbTh4Ynpodk1tOGpieFZ2SzI4dmI0aHZLbS9zYmdGdjhtN01idmR1bEhHWmNYMXhpbkdFY1pKeFBuS1NjcFp5UkhOUWMyUjBZM1JxZEhCMGJYUUVkWkYxSjNZTmRndDJDWFlUZHVGMjQzYUVkMzEzZjNkaGQ4RjRuM2luZUxONHFYaWplSTU1ajNtTmVTNTZNWHFxZXFsNjdYcnZlcUY3bFh1TGUzVjdsM3VkZTVSN2ozdTRlNGQ3aEh1NWZMMTh2bnk3ZmJCOW5IMjlmYjU5b0gzS2ZiUjlzbjJ4ZmJwOW9uMi9mYlY5dUgydGZkSjl4MzJzZlhCLzRIL2hmOTkvWG9CYWdJZUFVSUdBZ1krQmlJR0tnWCtCZ29IbmdmcUJCNElVZ2g2Q1M0TEpoTCtFeG9URWhKbUVub1N5aEp5RXk0UzRoTUNFMDRTUWhMeUUwWVRLaEQrSEhJYzdoeUtISlljMGh4aUhWWWMzaHltSDg0Z0NpZlNJK1lqNGlQMkk2SWdhaWUrSXBvcU1pcDZLbzRxTmlxR0trNHFraXFxS3BZcW9pcGlLa1lxYWlxZUthb3lOakl5TTA0elJqTktNYTQyWmpaV04vSTBVanhLUEZZOFRqNk9QWUpCWWtGeVFZNUJaa0Y2UVlwQmRrRnVRR1pFWWtSNlJkWkY0a1hlUmRKRjRrb0NTaFpLWWtwYVNlNUtUa3B5U3FKSjhrcEdTb1pXb2xhbVZvNVdsbGFTVm1aYWNscHVXekpiU2xnQ1hmSmVGbC9hWEY1Z1ltSytZc1pnRG1RV1pESmtKbWNHWnI1cXdtdWFhUVp0Q20vU2M5cHp6bkx5ZU81OUtud1JSQUZIN1VQVlErVkFDVVFoUkNWRUZVZHhSaDFLSVVvbFNqVktLVXZCU3NsTXVWanRXT1ZZeVZqOVdORllwVmxOV1RsWlhWblJXTmxZdlZqQldnRmlmV0o1WXMxaWNXSzVZcVZpbVdHMVpDVnY3V2d0YjlWb01Xd2hiN2x2c1crbGI2MXRrWEdWY25WMlVYV0plWDE1aFh1SmUybDdmWHQxZTQxN2dYa2hmY1YrM1g3VmZkbUZuWVc1aFhXRlZZWUpoZkdGd1lXdGhmbUduWVpCaHEyR09ZYXhobW1Ha1laUmhybUV1WW1sa2IyUjVaSjVrc21TSVpKQmtzR1NsWkpOa2xXU3BaSkprcm1TdFpLdGttbVNzWkpsa29tU3paSFZsZDJWNFphNW1xMmEwWnJGbUkyb2ZhdWhwQVdvZWFobHEvV2toYWhOcUNtcnphUUpxQldydGFSRnFVR3RPYTZScnhXdkdhejl2ZkcrRWIxRnZabTlVYjRadmJXOWJiM2h2Ym0rT2IzcHZjRzlrYjVkdldHL1ZibTl2WUc5ZmI1OXhySEd4Y2FoeFZuS2JjazV6VjNOcGRJdDBnM1IrZElCMGYzVWdkaWwySDNZa2RpWjJJWFlpZHBwMnVuYmtkbzUzaDNlTWQ1RjNpM2ZMZU1WNHVuaktlTDU0MVhpOGVOQjRQM284ZWtCNlBYbzNlanQ2cjNxdWVxMTdzWHZFZTdSN3hudkhlOEY3b0h2TWU4cDg0SDMwZmU5OSszM1lmZXg5M1gzb2ZlTjkybjNlZmVsOW5uM1pmZko5K1gxMWYzZC9yMy9wZnlhQW00R2NnWjJCb0lHYWdaaUJGNFU5aFJxRjdvUXNoUzJGRTRVUmhTT0ZJWVVVaGV5RUpZWC9oQWFGZ29kMGgzYUhZSWRtaDNpSGFJZFpoMWVIVElkVGgxdUlYWWdRaVFlSkVva1RpUldKQ29tOGl0S0t4NHJFaXBXS3k0cjRpcktLeVlyQ2lyK0tzSXJXaXMyS3RvcTVpdHVLVEl4T2pHeU00SXplak9hTTVJenNqTzJNNG96ampOeU02b3poakcyTm40MmpqU3VPRUk0ZGppS09ENDRwamgrT0lZNGVqcnFPSFk4Ymp4K1BLWThtanlxUEhJOGVqeVdQYVpCdWtHaVFiWkIza0RDUkxaRW5rVEdSaDVHSmtZdVJnNUhGa3J1U3Q1THFrcXlTNUpMQmtyT1N2SkxTa3NlUzhKS3lrcTJWc1pVRWx3YVhCNWNKbDJDWGpaZUxsNCtYSVpncm1CeVlzNWdLbVJPWkVwa1ltZDJaMEpuZm1kdVowWm5WbWRLWjJabTNtdTZhNzVvbm0wV2JSSnQzbTIrYkJwMEpuUU9kcVo2K25zNmVxRmhTbnhKUkdGRVVVUkJSRlZHQVVhcFIzVkdSVXBOUzgxSlpWbXRXZVZacFZtUldlRlpxVm1oV1pWWnhWbTlXYkZaaVZuWld3VmkrV01kWXhWaHVXUjFiTkZ0NFcvQmJEbHhLWDdKaGtXR3BZWXBoeldHMlliNWh5bUhJWVRCaXhXVEJaTXRrdTJTOFpOcGt4R1RIWk1Ka3pXUy9aTkprMUdTK1pIUmx4bWJKWnJsbXhHYkhacmhtUFdvNGFqcHFXV3ByYWxocU9XcEVhbUpxWVdwTGFrZHFOV3BmYWtocVdXdDNhd1Zzd20reGI2RnZ3MitrYjhGdnAyK3piOEJ2dVcrMmI2WnZvRyswYjc1eHlYSFFjZEp4eUhIVmNibHh6bkhaY2R4eHczSEVjV2h6bkhTamRKaDBuM1NlZE9KMERIVU5kVFIyT0hZNmR1ZDI1WGFnZDU1M24zZWxkK2g0Mm5qc2VPZDRwbmxOZWs1NlJucE1la3Q2dW5yWmV4Rjh5WHZrZTl0NzRYdnBlK1o3MVh6V2ZBcCtFWDRJZmh0K0kzNGVmaDErQ1g0UWZubC9zbi93Zi9GLzduOG9nTE9CcVlHb2dmdUJDSUpZZ2xtQ1NvVlpoVWlGYUlWcGhVT0ZTWVZ0aFdxRlhvV0RoNStIbm9laWg0MkhZWWdxaVRLSkpZa3JpU0dKcW9tbWllYUsrb3JyaXZHS0FJdmNpdWVLN29yK2lnR0xBb3YzaXUySzg0cjJpdnlLYTR4dGpKT005SXhFampHT05JNUNqam1PTlk0N2p5K1BPSTh6ajZpUHBvOTFrSFNRZUpCeWtIeVFlcEEwa1pLUklKTTJrL2lTTTVNdmt5S1QvSklya3dTVEdwTVFreWFUSVpNVmt5NlRHWk83bGFlV3FKYXFsdFdXRHBjUmx4YVhEWmNUbHcrWFc1ZGNsMmFYbUpjd21EaVlPNWczbUMyWU9aZ2ttQkNaS0prZW1SdVpJWmthbWUyWjRwbnhtYmlhdkpyN211MmFLSnVSbXhXZEk1MG1uU2lkRXAwYm5kaWUxSjZObjV5ZktsRWZVU0ZSTWxIMVVvNVdnRmFRVm9WV2gxYVBWdFZZMDFqUldNNVlNRnNxV3lSYmVsczNYR2hjdkYyNlhiMWR1RjFyWGt4ZnZWL0pZY0poeDJIbVljdGhNbUkwWXM1a3ltVFlaT0JrOEdUbVpPeGs4V1RpWk8xa2dtV0RaZGxtMW1hQWFwUnFoR3FpYXB4cTIycWphbjVxbDJxUWFxQnFYR3V1YTlwckNHelliL0Z2MzIvZ2I5dHY1Ry9yYis5dmdHL3NiK0Z2NlcvVmIrNXY4Ry9uY2Q5eDduSG1jZVZ4N1hIc2NmUng0SEUxY2taeWNITnljNmwwc0hTbWRLaDBSblpDZGt4MjZuYXpkNnAzc0hlc2Q2ZDNyWGZ2ZC9kNCtuajBlTzk0QVhtbmVhcDVWM3EvZWdkOERYeitlL2Q3REh6Z2UrQjgzSHplZk9KODMzelpmTjE4TG40K2ZrWitOMzR5ZmtOK0szNDlmakYrUlg1QmZqUitPWDVJZmpWK1AzNHZma1IvODMvOGYzR0Fjb0J3Z0crQWM0REdnY09CdW9IQ2djQ0J2NEc5Z2NtQnZvSG9nUW1DY1lLcWhZU0Zmb1djaFpHRmxJV3ZoWnVGaDRXb2hZcUZaNGJBaDlHSHM0ZlNoOGFIcTRlN2g3cUh5SWZMaHp1Sk5vbEVpVGlKUFltc2lRNkxGNHNaaXh1TENvc2dpeDJMQklzUWkwR01QNHh6alBxTS9ZejhqUGlNKzR5b2pVbU9TNDVJamtxT1JJOCtqMEtQUlk4L2ozK1FmWkNFa0lHUWdwQ0FrRG1SbzVHZWtaeVJUWk9Da3lpVGRaTktrMldUUzVNWWszNlRiSk5iazNDVFdwTlVrOHFWeTVYTWxjaVZ4cFd4bHJpVzFwWWNseDZYb0pmVGwwYVl0cGcxbVFHYS81bXVtNnVicXB1dG16dWRQNTJMbnMrZTNwN2NudDJlMjU0K24wdWY0bE9WVnE1VzJWallXRGhiWFYvallUTmk5R1R5WlA1a0JtWDZaUHRrOTJTM1pkeG1KbWV6YXF4cXcycTdhcmhxd21xdWFxOXFYMnQ0YTY5ckNYQUxjUDV2Qm5ENmJ4RndEM0Q3Y2Z4eC9uSDRjWGR6ZFhPbmRMOTBGWFZXZGxoMlVuYTlkNzkzdTNlOGR3NTVybmxoZW1KNllIckVlc1Y2SzN3bmZDcDhIbndqZkNGODUzeFVmbFYrWG41YWZtRitVbjVaZmtoLytYLzdmM2VBZG9ETmdjK0JDb0xQaGFtRnpZWFFoY21Gc0lXNmhibUZwb1h2aCt5SDhvZmdoNGFKc29uMGlTaUxPWXNzaXl1TFVJd0ZqVm1PWTQ1bWptU09YNDVWanNDT1NZOU5qNGVRZzVDSWtLdVJySkhRa1pTVGlwT1drNktUczVPdWs2eVRzSk9ZazVxVGw1UFVsZGFWMEpYVmxlS1czSmJabHR1VzNwWWtsNk9YcHBldGwvbVhUWmhQbUV5WVRwaFRtTHFZUHBrL21UMlpMcG1sbVE2YXdab0Rtd2FiVDV0T20wMmJ5cHZKbS8yYnlKdkFtMUdkWFoxZ25lQ2VGWjhzbnpOUnBWYmVXTjlZNGxqMVc1Q2Y3Rjd5WWZkaDltSDFZUUJsRDJYZ1p0MW01V3JkYXRwcTAyb2JjQjl3S0hBYWNCMXdGWEFZY0FaeURYSlljcUp5ZUhONmM3MTB5blRqZElkMWhuVmZkbUYyeDNjWmViRjVhM3BwZWo1OFAzdzRmRDE4TjN4QWZHdCtiWDU1Zm1sK2FuNkZmM04rdG4rNWY3aC8ySUhwaGQyRjZvWFZoZVNGNVlYM2hmdUhCWWdOaVBtSC9vZGdpVitKVm9sZWlVR0xYSXRZaTBtTFdvdE9pMCtMUm90Wml3aU5DbzE4am5LT2g0NTJqbXlPZW81MGpsU1BUbyt0ajRxUWk1Q3hrYTZSNFpQUms5K1R3NVBJazl5VDNaUFdrK0tUelpQWWsrU1QxNVBvazl5VnRKYmpsaXFYSjVkaGw5eVgrNWRlbUZpWVc1aThtRVdaU1prV21obWFEWnZvbStlYjFwdmJtNG1kWVoxeW5XcWRiSjJTbnBlZWs1NjBudmhTcUZhM1ZyWld0RmE4VnVSWVFGdERXMzFiOWx2SlhmaGgrbUVZWlJSbEdXWG1aaWRuN0dvK2NEQndNbkFRY250enozUmlkbVYySm5rcWVTeDVLM25IZXZaNlRIeERmRTE4NzN6d2ZLNlBmWDU4Zm9KK1RIOEFnTnFCWm9MN2hmbUZFWWI2aFFhR0M0WUhoZ3FHRklnVmlHU0p1b240aVhDTGJJdG1pMitMWDR0cml3K05EWTJKam9HT2hZNkNqclNSeTVFWWxBT1UvWlBobFRDWHhKaFNtVkdacUprcm1qQ2FONW8xbWhPY0RaeDVucldlNko0dm4xK2ZZNTlobnpkUk9GSEJWc0JXd2xZVVdXeGN6VjM4WWY1aEhXVWNaWlZsNldiN2FnUnIrbXF5YTB4d0czS25jdFowMUhScGR0TjNVSHlQZm94K3ZIOFhoaTJHR29ZamlDS0lJWWdmaUdxSmJJbTlpWFNMZDR0OWl4T05pbzZOam91T1g0K3ZqN3FSTHBRemxEV1VPcFE0bERLVUs1VGlsVGlYT1pjeWwvK1haNWhsbUZlWlJacERta0NhUHByUG1sU2JVWnN0bkNXY3I1MjBuY0tkdUoyZG51K2VHWjljbjJhZlo1ODhVVHRSeUZiS1ZzbFdmMXZVWGRKZFRsLy9ZU1JsQ210aGExRndXSENBYytSMGluVnVkbXgyczNsZ2ZGOThmb0I5Z04rQmNvbHZpZnlKZ0lzV2pSZU5rWTZUam1HUFNKRkVsRkdVVXBROWx6Nlh3NWZCbDJ1WVZabFZtazJhMHBvYW0wbWNNWncrbkR1YzA1M1huVFNmYko5cW41U2Z6RmJXWFFCaUkyVXJaU3BsN0dZUWE5cDB5bnBrZkdOOFpYeVRmcForbEg3aWdUaUdQNFl4aUlxTGtKQ1BrR09VWUpSa2xHaVhiNWhjbVZxYVc1cFhtdE9hMUpyUm1sU2NWNXhXbk9XZG41NzBudEZXNlZnc1pWNXdjWFp5ZHRkM1VIK0lmemFJT1loaWlKT0xrb3VXaTNlQ0c0M0FrV3FVUXBkSWwwU1h4cGR3bUYrYUlwdFltMStjK1ozNm5YeWVmWjRIbjNlZmNwL3pYaFpyWTNCc2ZHNThPNGpBaWFHT3daRnlsSENVY1poZW1kYWFJNXZNbm1SdzJuZWFpM2VVeVpkaW1tV2FuSDZjaTZxT3haRjlsSDZVZkpSM25IaWM5NTVVakgrVUdwNG9jbXFhTVpzYm5oNmVjbnhnSkdFa1lpUmpKR1FrWlNSbUpHY2thQ1JwSkhRa2RTUjJKSGNrZUNSNUpIb2tleVI4Skgwa2NDRnhJWEloY3lGMElYVWhkaUYzSVhnaGVTRTJUajlPaFU2Z1RvSlJsbEdyVWZsU09GTnBVN1pUQ2xtQVc5dGRNeTkvWHZSZVVGOWhYelJsNEdXU2RYWjJ0WSsybHFnQXhnTDlNUDR3blRDZU1BTXczVTRGTUFZd0J6RDhNRHYvUGY4OUowRXdRakJETUVRd1JUQkdNRWN3U0RCSk1Fb3dTekJNTUUwd1RqQlBNRkF3VVRCU01GTXdWREJWTUZZd1Z6QllNRmt3V2pCYk1Gd3dYVEJlTUY4d1lEQmhNR0l3WXpCa01HVXdaakJuTUdnd2FUQnFNR3N3YkRCdE1HNHdiekJ3TUhFd2NqQnpNSFF3ZFRCMk1IY3dlREI1TUhvd2V6QjhNSDB3ZmpCL01JQXdnVENDTUlNd2hEQ0ZNSVl3aHpDSU1Ja3dpakNMTUl3d2pUQ09NSTh3a0RDUk1KSXdrekNoTUtJd296Q2tNS1V3cGpDbk1LZ3dxVENxTUtzd3JEQ3RNSzR3cnpDd01MRXdzakN6TUxRd3RUQzJNTGN3dURDNU1Mb3d1ekM4TUwwd3ZqQy9NTUF3d1REQ01NTXd4RERGTU1Zd3h6RElNTWt3eWpETE1Nd3d6VERPTU04dzBERFJNTkl3MHpEVU1OVXcxakRYTU5ndzJURGFNTnN3M0REZE1ONHczekRnTU9FdzRqRGpNT1F3NVREbU1PY3c2RERwTU9vdzZ6RHNNTzB3N2pEdk1QQXc4VER5TVBNdzlERDFNUFl3RUFRUkJCSUVFd1FVQkJVRUFRUVdCQmNFR0FRWkJCb0VHd1FjQkIwRUhnUWZCQ0FFSVFRaUJDTUVKQVFsQkNZRUp3UW9CQ2tFS2dRckJDd0VMUVF1QkM4RU1BUXhCRElFTXdRMEJEVUVVUVEyQkRjRU9BUTVCRG9FT3dROEJEMEVQZ1EvQkVBRVFRUkNCRU1FUkFSRkJFWUVSd1JJQkVrRVNnUkxCRXdFVFFST0JFOEU1eUc0SWJraHp6SE1BRnBPaWdBQ1VwRkVzSitJVWJHZkIzWUFRZGlqd3dBTHd2VUY0di9rL3dmL0F2OHhNaFloSVNHYk1Kd3dnQzZFTG9ZdWh5NklMb291akM2TkxwVXVuQzZkTHFVdXB5NnFMcXd1cmk2Mkxyd3V2aTdHTHNvdXpDN05Mczh1MWk3WEx0NHU0eTRBQUFBQUFBQ0RBbEFDV3dKVUFuVUNVd0g0QUVzQmlnSnFBa0pPWEU3MVVScFRnbE1IVGd4T1IwNk5UdGRXRFBwdVhITmZEMDZIVVE1T0xrNlRUc0pPeVU3SVRwaFIvRkpzVTdsVElGY0RXU3haRUZ6L1hlRmxzMnZNYXhSc1AzSXhUanhPNkU3Y1R1bE80VTdkVHRwT0RGSWNVMHhUSWxjalZ4ZFpMMW1CVzRSYkVsdzdYSFJjYzF3RVhvQmVnbDdKWHdsaVVHSVZiRFpzUTJ3L2JEdHNybkt3Y29wenVIbUtnQjZXRGs4WVR5eFA5VTRVVC9GT0FFLzNUZ2hQSFU4Q1R3VlBJazhUVHdSUDlFNFNUN0ZSRTFJSlVoQlNwbElpVXg5VFRWT0tVd2RVNFZiZlZpNVhLbGMwVnp4WmdGbDhXWVZaZTFsK1dYZFpmMWxXV3hWY0pWeDhYSHBjZTF4K1hOOWRkVjZFWGdKZkdsOTBYOVZmMUYvUFgxeGlYbUprWW1GaVptSmlZbGxpWUdKYVltVmk3Mlh1WlQ1bk9XYzRaenRuT21jL1p6eG5NMmNZYkVac1VteGNiRTlzU214VWJFdHNUR3h4Y0Y1eXRISzFjbzV6S25WL2RuVjZVWDk0Z255Q2dJSjlnbitDVFlaK2labVFsNUNZa0p1UWxKQWlsaVNXSUpZamxsWlBPMDlpVDBsUFUwOWtUejVQWjA5U1QxOVBRVTlZVHkxUE0wOC9UMkZQajFHNVVSeFNIbEloVXExU3JsSUpVMk5UY2xPT1U0OVRNRlEzVkNwVVZGUkZWQmxVSEZRbFZCaFVQVlJQVkVGVUtGUWtWRWRVN2xiblZ1VldRVmRGVjB4WFNWZExWMUpYQmxsQVdhWlptRm1nV1pkWmpsbWlXWkJaajFtbldhRlpqbHVTV3loY0tseU5YSTljaUZ5TFhJbGNrbHlLWElaY2sxeVZYT0JkQ2w0T1hvdGVpVjZNWG9oZWpWNEZYeDFmZUY5Mlg5SmYwVi9RWCsxZjZGL3VYL05mNFYva1grTmYrbC92WC9kZisxOEFZUFJmT21LRFlveGlqbUtQWXBSaWgySnhZbnRpZW1Kd1lvRmlpR0ozWW4xaWNtSjBZamRsOEdYMFpmTmw4bVgxWlVWblIyZFpaMVZuVEdkSVoxMW5UV2RhWjB0bjBHc1piQnBzZUd4bmJHdHNoR3lMYkk5c2NXeHZiR2xzbW14dGJJZHNsV3ljYkdac2MyeGxiSHRzam14MGNIcHdZM0svY3IxeXczTEdjc0Z5dW5MRmNwVnpsM09UYzVSemtuTTZkVGwxbEhXVmRZRjJQWGswZ0pXQW1ZQ1FnSktBbklDUWdvK0NoWUtPZ3BHQ2s0S0tnb09DaElKNGpNbVB2NCtma0tHUXBaQ2VrS2VRb0pBd2xpaVdMNVl0bGpOT21FOThUNFZQZlUrQVQ0ZFBkazkwVDRsUGhFOTNUMHhQbDA5cVQ1cFBlVStCVDNoUGtFK2NUNVJQbmsrU1Q0SlBsVTlyVDI1UG5sRzhVYjVSTlZJeVVqTlNSbEl4VXJ4U0NsTUxVenhUa2xPVVU0ZFVmMVNCVkpGVWdsU0lWR3RVZWxSK1ZHVlViRlIwVkdaVWpWUnZWR0ZVWUZTWVZHTlVaMVJrVlBkVytWWnZWM0pYYlZkclYzRlhjRmQyVjRCWGRWZDdWM05YZEZkaVYyaFhmVmNNV1VWWnRWbTZXYzlaemxteVdjeFp3Vm0yV2J4WncxbldXYkZadlZuQVdjaFp0Rm5IV1dKYlpWdVRXNVZiUkZ4SFhLNWNwRnlnWExWY3IxeW9YS3hjbjF5alhLMWNvbHlxWEtkY25WeWxYTFpjc0Z5bVhCZGVGRjRaWGloZklsOGpYeVJmVkYrQ1gzNWZmVi9lWCtWZkxXQW1ZQmxnTW1BTFlEUmdDbUFYWUROZ0dtQWVZQ3hnSW1BTllCQmdMbUFUWUJGZ0RHQUpZQnhnRkdJOVlxMWl0R0xSWXI1aXFtSzJZc3Bpcm1LellxOWl1MktwWXJCaXVHSTlaYWhsdTJVSlp2eGxCR1lTWmdobSsyVURaZ3RtRFdZRlp2MWxFV1lRWnZabUNtZUZaMnhuam1lU1ozWm5lMmVZWjRabmhHZDBaNDFuakdkNlo1OW5rV2VaWjRObmZXZUJaM2huZVdlVVp5VnJnR3QrYTk1ckhXeVRiT3hzNjJ6dWJObHN0bXpVYksxczUyeTNiTkJzd215NmJNTnN4bXp0YlBKczBtemRiTFJzaW15ZGJJQnMzbXpBYkRCdHpXekhiTEJzK1d6UGJPbHMwV3lVY0pod2hYQ1RjSVp3aEhDUmNKWndnbkNhY0lOd2FuTFdjc3R5MkhMSmN0eHkwbkxVY3RweXpITFJjcVJ6b1hPdGM2Wnpvbk9nYzZ4em5YUGRkT2gwUDNWQWRUNTFqSFdZZGE5MjgzYnhkdkIyOVhiNGQveDMrWGY3ZC9wMzkzZENlVDk1eFhsNGVudDYrM3AxZlAxOE5ZQ1BnSzZBbzRDNGdMV0FyWUFnZ3FDQ3dJS3JncHFDbUlLYmdyV0NwNEt1Z3J5Q25vSzZnclNDcUlLaGdxbUN3b0trZ3NPQ3RvS2lnbkNHYjRadGhtNkdWb3pTajh1UDA0L05qOWFQMVkvWGo3S1F0SkN2a0xPUXNKQTVsajJXUEpZNmxrT1d6VS9GVDlOUHNrL0pUOHRQd1UvVVQ5eFAyVSs3VDdOUDIwL0hUOVpQdWsvQVQ3bFA3RTlFVWtsU3dGTENVajFUZkZPWFU1WlRtVk9ZVTdwVW9WU3RWS1ZVejFURFZBMkR0MVN1Vk5aVXRsVEZWTVpVb0ZSd1ZMeFVvbFMrVkhKVTNsU3dWTFZYbmxlZlY2UlhqRmVYVjUxWG0xZVVWNWhYajFlWlY2VlhtbGVWVi9SWURWbFRXZUZaM2xudVdRQmE4Vm5kV2ZwWi9WbjhXZlpaNUZueVdmZFoyMW5wV2ZOWjlWbmdXZjVaOUZudFdhaGJURnpRWE5oY3pGelhYTXRjMjF6ZVhOcGN5VnpIWE1wYzFselRYTlJjejF6SVhNWmN6bHpmWFBoYytWMGhYaUplSTE0Z1hpUmVzRjZrWHFKZW0xNmpYcVZlQjE4dVgxWmZobDgzWURsZ1ZHQnlZRjVnUldCVFlFZGdTV0JiWUV4Z1FHQkNZRjlnSkdCRVlGaGdabUJ1WUVKaVEyTFBZZzFqQzJQMVlnNWpBMlByWXZsaUQyTU1ZL2hpOW1JQVl4TmpGR1A2WWhWaisyTHdZa0ZsUTJXcVpiOWxObVloWmpKbU5XWWNaaVptSW1ZelppdG1PbVlkWmpSbU9XWXVaZzluRUdmQlovSm55R2U2Wjl4bnUyZjRaOWhud0dlM1o4Vm42MmZrWjk5bnRXZk5aN05uOTJmMlorNW40MmZDWjdsbnptZm5aL0Juc21mOFo4Wm43V2ZNWjY1bjVtZmJaL3BueVdmS1o4Tm42bWZMWnlocmdtdUVhN1pyMW12WWErQnJJR3doYkNodE5HMHRiUjl0UEcwL2JSSnRDbTNhYkROdEJHMFpiVHB0R20wUmJRQnRIVzFDYlFGdEdHMDNiUU50RDIxQWJRZHRJRzBzYlFodEltMEpiUkJ0dDNDZmNMNXdzWEN3Y0tGd3RIQzFjS2x3UVhKSmNrcHliSEp3Y25OeWJuTEtjdVJ5NkhMcmN0OXk2bkxtY3VOeWhYUE1jOEp6eUhQRmM3bHp0bk8xYzdSejYzTy9jOGR6dm5QRGM4Wnp1SFBMYyt4MDduUXVkVWQxU0hXbmRhcDFlWGJFZGdoM0EzY0Vkd1YzQ25mM2R2dDIrbmJuZCtoM0JuZ1JlQko0QlhnUWVBOTREbmdKZUFONEUzaEtlVXg1UzNsRmVVUjUxWG5OZWM5NTFubk9lWUI2Zm5yUmVnQjdBWHQ2ZkhoOGVYeC9mSUI4Z1h3RGZRaDlBWDFZZjVGL2pYKytmd2VBRG9BUGdCU0FONERZZ01lQTRJRFJnTWlBd29EUWdNV0E0NERaZ055QXlvRFZnTW1BejREWGdPYUF6WUQvZ1NHQ2xJTFpndjZDK1lJSGcraUNBSVBWZ2pxRDY0TFdndlNDN0lMaGd2S0M5WUlNZy91QzlvTHdndXFDNUlMZ2d2cUM4NEx0Z25lR2RJWjhobk9HUVloT2lHZUlhb2hwaU5PSkJJb0hpbktONDQvaGorNlA0SS94a0wyUXY1RFZrTVdRdnBESGtNdVF5SkRVa2RPUlZKWlBsbEdXVTVaS2xrNldIbEFGVUFkUUUxQWlVREJRRzFEMVQvUlBNMUEzVUN4UTlrLzNUeGRRSEZBZ1VDZFFOVkF2VURGUURsQmFVWlJSazFIS1VjUlJ4VkhJVWM1UllWSmFVbEpTWGxKZlVsVlNZbExOVWc1VG5sTW1WZUpVRjFVU1ZlZFU4MVRrVkJwVi8xUUVWUWhWNjFRUlZRVlY4VlFLVmZ0VTkxVDRWT0JVRGxVRFZRdFZBVmNDVjh4WE1salZWOUpYdWxmR1Y3MVh2RmU0VjdaWHYxZkhWOUJYdVZmQlZ3NVpTbGtaV2haYUxWb3VXaFZhRDFvWFdncGFIbG96V214YnAxdXRXNnhiQTF4V1hGUmM3RnovWE81YzhWejNYQUJkK1Z3cFhpaGVxRjZ1WHFwZXJGNHpYekJmWjE5ZFlGcGdaMkJCWUtKZ2lHQ0FZSkpnZ1dDZFlJTmdsV0NiWUpkZ2gyQ2NZSTVnR1dKR1l2SmlFR05XWXl4alJHTkZZelpqUTJQa1l6bGpTMk5LWXp4aktXTkJZelJqV0dOVVkxbGpMV05IWXpOaldtTlJZemhqVjJOQVkwaGpTbVZHWmNabHcyWEVaY0psU21aZlprZG1VV1lTWnhObkgyZ2FhRWxvTW1nemFEdG9TMmhQYUJab01XZ2NhRFZvSzJndGFDOW9UbWhFYURSb0hXZ1NhQlJvSm1nb2FDNW9UV2c2YUNWb0lHZ3NheTlyTFdzeGF6UnJiV3VDZ0locjVtdmthK2hyNDJ2aWErZHJKV3g2YldOdFpHMTJiUTF0WVcyU2JWaHRZbTF0Ylc5dGtXMk5iZTl0ZjIyR2JWNXRaMjFnYlpkdGNHMThiVjl0Z20yWWJTOXRhRzJMYlg1dGdHMkViUlp0ZzIxN2JYMXRkVzJRYmR4dzAzRFJjTjF3eTNBNWYrSncxM0RTY041dzRIRFVjTTF3eFhER2NNZHcybkRPY09Gd1FuSjRjbmR5ZG5JQWMvcHk5SEwrY3ZaeTgzTDdjZ0Z6MDNQWmMrVnoxbk84YytkejQzUHBjOXh6MG5QYmM5UnozWFBhYzlkejJIUG9jOTUwMzNUMGRQVjBJWFZiZFY5MXNIWEJkYnQxeEhYQWRiOTF0blc2ZFlwMnlYWWRkeHQzRUhjVGR4SjNJM2NSZHhWM0dYY2FkeUozSjNjamVDeDRJbmcxZUM5NEtIZ3VlQ3Q0SVhncGVETjRLbmd4ZUZSNVczbFBlVng1VTNsU2VWRjU2M25zZWVCNTdubnRlZXA1M0huZWVkMTVobnFKZW9WNmkzcU1lb3A2aDNyWWVoQjdCSHNUZXdWN0Qzc0lld3A3RG5zSmV4SjdoSHlSZklwOGpIeUlmSTE4aFh3ZWZSMTlFWDBPZlJoOUZuMFRmUjk5RW4wUGZReDlYSDloZjE1L1lIOWRmMXQvbG4rU2Y4Ti93bi9BZnhhQVBvQTVnUHFBOG9ENWdQV0FBWUg3Z0FDQkFZSXZnaVdDTTRNdGcwU0RHWU5SZ3lXRFZvTS9nMEdESm9NY2d5S0RRb05PZ3h1REtvTUlnenlEVFlNV2d5U0RJSU0zZ3krREtZTkhnMFdEVElOVGd4NkRMSU5MZ3llRFNJTlRobEtHb29hb2hwYUdqWWFSaHA2R2g0YVhob2FHaTRhYWhvV0dwWWFaaHFHR3A0YVZocGlHam9hZGhwQ0dsSVpEaUVTSWJZaDFpSGFJY29pQWlIR0lmNGh2aUlPSWZvaDBpSHlJRW9wSGpGZU1lNHlraktPTWRvMTRqYldOdDQyMmpkR08wNDcrai9XUEFwRC9qL3VQQkpEOGovYVAxcERna05tUTJwRGprTitRNVpEWWtOdVExNURja09TUVVKRk9rVStSMVpIaWtkcVJYSlpmbHJ5VzQ1amZtaStiZjA1d1VHcFFZVkJlVUdCUVUxQkxVRjFRY2xCSVVFMVFRVkJiVUVwUVlsQVZVRVZRWDFCcFVHdFFZMUJrVUVaUVFGQnVVSE5RVjFCUlVOQlJhMUp0VW14U2JsTFdVdE5TTFZPY1UzVlZkbFU4VlUxVlVGVTBWU3BWVVZWaVZUWlZOVlV3VlZKVlJWVU1WVEpWWlZWT1ZUbFZTRlV0VlR0VlFGVkxWUXBYQjFmN1Z4Ulk0bGYyVjl4WDlGY0FXTzFYL1ZjSVdQaFhDMWp6Vjg5WEIxanVWK05YOGxmbFYreFg0VmNPV1B4WEVGam5Wd0ZZREZqeFYrbFg4RmNOV0FSWVhGbGdXbGhhVlZwbldsNWFPRm8xV20xYVVGcGZXbVZhYkZwVFdtUmFWMXBEV2wxYVVscEVXbHRhU0ZxT1dqNWFUVm81V2t4YWNGcHBXa2RhVVZwV1drSmFYRnB5VzI1YndWdkFXMWxjSGwwTFhSMWRHbDBnWFF4ZEtGME5YU1pkSlYwUFhUQmRFbDBqWFI5ZExsMCtYalJlc1Y2MFhybGVzbDZ6WGpaZk9GK2JYNVpmbjErS1lKQmdobUMrWUxCZ3VtRFRZTlJnejJEa1lObGczV0RJWUxGZzIyQzNZTXBndjJERFlNMWd3R0F5WTJWamltT0NZMzFqdldPZVk2MWpuV09YWTZ0amptTnZZNGRqa0dOdVk2OWpkV09jWTIxanJtTjhZNlJqTzJPZlkzaGpoV09CWTVGampXTndZMU5seldWbFptRm1XMlpaWmx4bVltWVlaM2xvaDJpUWFKeG9iV2h1YUs1b3EyaFdhVzlvbzJpc2FLbG9kV2gwYUxKb2oyaDNhSkpvZkdocmFISm9xbWlBYUhGb2ZtaWJhSlpvaTJpZ2FJbG9wR2g0YUh0b2tXaU1hSXBvZldnMmF6TnJOMnM0YTVGcmoydU5hNDVyakdzcWJNQnRxMjIwYmJOdGRHNnNiZWx0NG0yM2JmWnQxRzBBYnNodDRHM2ZiZFp0dm0zbGJkeHQzVzNiYmZSdHltMjliZTF0OEcyNmJkVnR3bTNQYmNsdDBHM3liZE50L1czWGJjMXQ0MjI3YmZwd0RYSDNjQmR4OUhBTWNmQndCSEh6Y0JCeC9IRC9jQVp4RTNFQWNmaHc5bkFMY1FKeERuRitjbnR5ZkhKL2NoMXpGM01IY3hGekdITUtjd2h6LzNJUGN4NXppSFAyYy9oejlYTUVkQUYwL1hNSGRBQjArblA4Yy85ekRIUUxkUFJ6Q0hSa2RXTjF6blhTZGM5MXkzWE1kZEYxMEhXUGRvbDIwM1k1ZHk5M0xYY3hkekozTkhjemR6MTNKWGM3ZHpWM1NIaFNlRWw0VFhoS2VFeDRKbmhGZUZCNFpIbG5lV2w1YW5samVXdDVZWG03ZWZwNStIbjJlZmQ1ajNxVWVwQjZOWHRIZXpSN0pYc3dleUo3SkhzemV4aDdLbnNkZXpGN0szc3RleTk3TW5zNGV4cDdJM3VVZkpoOGxueWpmRFY5UFgwNGZUWjlPbjFGZlN4OUtYMUJmVWQ5UG4wL2ZVcDlPMzBvZldOL2xYK2NmNTEvbTMvS2Y4dC96WC9RZjlGL3gzL1BmOGwvSDRBZWdCdUFSNEJEZ0VpQUdJRWxnUm1CRzRFdGdSK0JMSUVlZ1NHQkZZRW5nUjJCSW9FUmdqaUNNNEk2Z2pTQ01vSjBncENEbzRPb2c0MkRlb056ZzZTRGRJT1BnNEdEbFlPWmczV0RsSU9wZzMyRGc0T01nNTJEbTRPcWc0dURmb09sZzYrRGlJT1hnN0NEZjRPbWc0ZURyb04yZzVxRFdZWldocitHdDRiQ2hzR0d4WWE2aHJDR3lJYTVock9HdUliTWhyU0d1NGE4aHNPR3ZZYStobEtJaVlpVmlLaUlvb2lxaUpxSWtZaWhpSitJbUlpbmlKbUltNGlYaUtTSXJJaU1pSk9Jam9pQ2lkYUoyWW5WaVRDS0o0b3NpaDZLT1l3N2pGeU1YWXg5aktXTWZZMTdqWG1OdkkzQ2pibU52NDNCamRpTzNvN2RqdHlPMTQ3Z2p1R09KSkFMa0JHUUhKQU1rQ0dRNzVEcWtQQ1E5SkR5a1BPUTFKRHJrT3lRNlpCV2tWaVJXcEZUa1ZXUjdKSDBrZkdSODVINGtlU1IrWkhxa2V1Ujk1SG9rZTZSZXBXR2xZaVZmSlp0bG11V2NaWnZscitXYXBjRW1PV1lsNW1iVUpWUWxGQ2VVSXRRbzFDRFVJeFFqbENkVUdoUW5GQ1NVSUpRaDFCZlVkUlJFbE1SVTZSVHAxT1JWYWhWcFZXdFZYZFZSVmFpVlpOVmlGV1BWYlZWZ1ZXalZaSlZwRlY5Vll4VnBsVi9WWlZWb1ZXT1ZReFhLVmczV0JsWUhsZ25XQ05ZS0ZqMVYwaFlKVmdjV0J0WU0xZy9XRFpZTGxnNVdEaFlMVmdzV0R0WVlWbXZXcFJhbjFwNldxSmFubHA0V3FaYWZGcWxXcXhhbFZxdVdqZGFoRnFLV3BkYWcxcUxXcWxhZTFwOVdveGFuRnFQV3BOYW5WcnFXODFieTF2VVc5RmJ5bHZPV3d4Y01GdzNYVU5kYTExQlhVdGRQMTAxWFZGZFRsMVZYVE5kT2wxU1hUMWRNVjFaWFVKZE9WMUpYVGhkUEYweVhUWmRRRjFGWFVSZVFWNVlYNlpmcFYrclg4bGd1V0RNWU9KZ3ptREVZQlJoOG1BS1lSWmhCV0gxWUJOaCtHRDhZUDVnd1dBRFlSaGhIV0VRWWY5Z0JHRUxZVXBpbEdPeFk3Qmp6bVBsWStoajcyUERZNTFrODJQS1krQmo5bVBWWS9KajlXTmhaTjlqdm1QZFk5eGp4R1BZWTlOandtUEhZOHhqeTJQSVkvQmoxMlBaWXpKbFoyVnFaV1JsWEdWb1pXVmxqR1dkWlo1bHJtWFFaZEpsZkdac1pudG1nR1p4Wm5sbWFtWnlaZ0ZuREduVGFBUnAzR2dxYWV4bzZtanhhQTlwMW1qM2FPdG81R2oyYUJOcEVHbnphT0ZvQjJuTWFBaHBjR20wYUJGcDcyakdhQlJwK0dqUWFQMW8vR2pvYUF0cENta1hhYzVveUdqZGFONW81bWowYU5Gb0JtblVhT2xvRldrbGFjZG9PV3M3YXo5clBHdVVhNWRybVd1VmE3MXI4R3Z5YS9Ock1HejhiVVp1UjI0ZmJrbHVpRzQ4YmoxdVJXNWliaXR1UDI1QmJsMXVjMjRjYmpOdVMyNUFibEZ1TzI0RGJpNXVYbTVvYmx4dVlXNHhiaWh1WUc1eGJtdHVPVzRpYmpCdVUyNWxiaWR1ZUc1a2JuZHVWVzU1YmxKdVptNDFialp1V200Z2NSNXhMM0g3Y0M1eE1YRWpjU1Z4SW5FeWNSOXhLSEU2Y1J0eFMzSmFjb2h5aVhLR2NvVnlpM0lTY3d0ek1ITWljekZ6TTNNbmN6SnpMWE1tY3lOek5YTU1jeTUwTEhRd2RDdDBGblFhZENGMExYUXhkQ1IwSTNRZGRDbDBJSFF5ZFB0MEwzVnZkV3gxNTNYYWRlRjE1blhkZGQ5MTVIWFhkWlYya25iYWRrWjNSM2RFZDAxM1JYZEtkMDUzUzNkTWQ5NTM3SGRnZUdSNFpYaGNlRzE0Y1hocWVHNTRjSGhwZUdoNFhuaGllSFI1YzNseWVYQjVBbm9LZWdONkRIb0VlcGw2NW5ya2VrcDdPM3RFZTBoN1RIdE9lMEI3V0h0RmU2SjhubnlvZktGOFdIMXZmV045VTMxV2ZXZDlhbjFQZlcxOVhIMXJmVko5VkgxcGZWRjlYMzFPZlQ1L1AzOWxmMlovb24rZ2Y2Ri8xMzlSZ0UrQVVJRCtnTlNBUTRGS2dWS0JUNEZIZ1QyQlRZRTZnZWFCN29IM2dmaUIrWUVFZ2p5Q1BZSS9nbldDTzRQUGcvbURJNFRBZytpREVvVG5nK1NEL0lQMmd4Q0V4b1BJZyt1RDQ0Ty9nd0dFM1lQbGc5aUQvNFBoZzh1RHpvUFdnL1dEeVlNSmhBK0Uzb01SaEFhRXdvUHpnOVdEK29QSGc5R0Q2b01UaE1PRDdJUHVnOFNEKzRQWGcrS0RHNFRiZy82RDJJYmlodWFHMDRiamh0cUc2b2JkaHV1RzNJYnNodW1HMTRib2h0R0dTSWhXaUZXSXVvalhpTG1JdUlqQWlMNkl0b2k4aUxlSXZZaXlpQUdKeVlpVmlaaUpsNG5kaWRxSjI0bE9pazJLT1lwWmlrQ0tWNHBZaWtTS1JZcFNpa2lLVVlwS2lreUtUNHBmaklHTWdJeTZqTDZNc0l5NWpMV01oSTJBalltTjJJM1RqYzJOeDQzV2pkeU56NDNWamRtTnlJM1hqY1dONzQ3M2p2cU8rWTdtanU2TzVZNzFqdWVPNkk3Mmp1dU84WTdzanZTTzZZNHRrRFNRTDVBR2tTeVJCSkgva1B5UUNKSDVrUHVRQVpFQWtRZVJCWkVEa1dHUlpKRmZrV0tSWUpFQmtncVNKWklEa2hxU0pwSVBrZ3lTQUpJU2t2K1IvWkVHa2dTU0o1SUNraHlTSkpJWmtoZVNCWklXa251VmpaV01sWkNWaDVaK2xvaVdpWmFEbG9DV3dwYklsc09XOFpid2xteVhjSmR1bHdlWXFaanJtT2FjK1o2RFRvUk90azY5VUw5UXhsQ3VVTVJReWxDMFVNaFF3bEN3VU1GUXVsQ3hVTXRReVZDMlVMaFExMUY2VW5oU2UxSjhVc05WMjFYTVZkQlZ5MVhLVmQxVndGWFVWY1JWNlZXL1ZkSlZqVlhQVmRWVjRsWFdWY2hWOGxYTlZkbFZ3bFVVVjFOWWFGaGtXRTlZVFZoSldHOVlWVmhPV0YxWVdWaGxXRnRZUFZoaldIRlkvRmpIV3NSYXkxcTZXcmhhc1ZxMVdyQmF2MXJJV3J0YXhscTNXc0JheWxxMFdyWmF6VnE1V3BCYTFsdllXOWxiSDF3elhIRmRZMTFLWFdWZGNsMXNYVjVkYUYxblhXSmQ4RjFQWGs1ZVNsNU5Ya3RleFY3TVhzWmV5MTdIWGtCZnIxK3RYL2RnU1dGS1lTdGhSV0UyWVRKaExtRkdZUzloVDJFcFlVQmhJR0pva1NOaUpXSWtZc1ZqOFdQcll4QmtFbVFKWkNCa0pHUXpaRU5rSDJRVlpCaGtPV1EzWkNKa0kyUU1aQ1prTUdRb1pFRmtOV1F2WkFwa0dtUkFaQ1ZrSjJRTFpPZGpHMlF1WkNGa0RtUnZaWkpsMDJXR1pveG1sV2FRWm90bWltYVpacFJtZUdZZ1oyWnBYMms0YVU1cFltbHhhVDlwUldscWFUbHBRbWxYYVZscGVtbElhVWxwTldsc2FUTnBQV2xsYWZCb2VHazBhV2xwUUdsdmFVUnBkbWxZYVVGcGRHbE1hVHRwUzJrM2FWeHBUMmxSYVRKcFVta3ZhWHRwUEdsR2EwVnJRMnRDYTBoclFXdWJhdzM2KzJ2OGEvbHI5MnY0YTV0dTFtN0libzl1d0c2ZmJwTnVsRzZnYnJGdXVXN0didEp1dlc3QmJwNXV5VzYzYnJCdXpXNm1iczl1c202K2JzTnUzRzdZYnBsdWttNk9ibzF1cEc2aGJyOXVzMjdRYnNwdWwyNnVicU51UjNGVWNWSnhZM0ZnY1VGeFhYRmljWEp4ZUhGcWNXRnhRbkZZY1VOeFMzRndjVjl4VUhGVGNVUnhUWEZhY1U5eWpYS01jcEZ5a0hLT2NqeHpRbk03Y3pwelFITktjMGx6UkhSS2RFdDBVblJSZEZkMFFIUlBkRkIwVG5SQ2RFWjBUWFJVZE9GMC8zVCtkUDEwSFhWNWRYZDFnMm52ZFE5MkEzYjNkZjUxL0hYNWRmaDFFSGI3ZGZaMTdYWDFkZjExbVhhMWR0MTJWWGRmZDJCM1VuZFdkMXAzYVhkbmQxUjNXWGR0ZCtCM2gzaWFlSlI0ajNpRWVKVjRoWGlHZUtGNGczaDVlSmw0Z0hpV2VIdDRmSG1DZVgxNWVYa1JlaGg2R1hvU2VoZDZGWG9pZWhONkczb1FlcU42b25xZWV1dDZabnRrZTIxN2RIdHBlM0o3Wlh0emUzRjdjSHRoZTNoN2RudGplN0o4dEh5dmZJaDlobjJBZlkxOWYzMkZmWHA5am4xN2ZZTjlmSDJNZlpSOWhIMTlmWko5Ylg5cmYyZC9hSDlzZjZaL3BYK25mOXQvM0g4aGdHU0JZSUYzZ1Z5QmFZRmJnV0tCY29FaFoxNkJkb0ZuZ1crQlJJRmhnUjJDU1lKRWdrQ0NRb0pGZ3ZHRVA0UldoSGFFZVlTUGhJMkVaWVJSaEVDRWhvUm5oRENFVFlSOWhGcUVXWVIwaEhPRVhZUUhoVjZFTjRRNmhEU0Vlb1JEaEhpRU1vUkZoQ21FMllOTGhDK0VRb1F0aEYrRWNJUTVoRTZFVElSU2hHK0V4WVNPaER1RVI0UTJoRE9FYUlSK2hFU0VLNFJnaEZTRWJvUlFoQXVIQklmM2hneUgrb2JXaHZXR1RZZjRoZzZIQ1ljQmgvYUdEWWNGaDlhSXk0ak5pTTZJM29qYmlOcUl6SWpRaUlXSm00bmZpZVdKNUluaGllQ0o0b25jaWVhSmRvcUdpbitLWVlvL2luZUtnb3FFaW5XS2c0cUJpblNLZW9vOGpFdU1Tb3hsakdTTVpveUdqSVNNaFl6TWpHaU5hWTJSall5TmpvMlBqWTJOazQyVWpaQ05rbzN3amVDTjdJM3hqZTZOMEkzcGplT040bzNuamZLTjY0MzBqUWFQLzQ0Qmp3Q1BCWThIandpUEFvOExqMUtRUDVCRWtFbVFQWkFRa1EyUkQ1RVJrUmFSRkpFTGtRNlJicEZ2a1VpU1VwSXdranFTWnBJemttV1NYcEtEa2k2U1NwSkdrbTJTYkpKUGttQ1NaNUp2a2phU1laSndrakdTVkpKamtsQ1NjcEpPa2xPU1RKSldraktTbjVXY2xaNlZtNVdTbHBPV2taYVhsczZXK3BiOWx2aVc5Wlp6bDNlWGVKZHlsdytZRFpnT21LeVk5cGo1bUsrWnNwbXdtYldaclpxcm1sdWI2cHp0bk9lY2dKNzludVpRMUZEWFVPaFE4MURiVU9wUTNWRGtVTk5RN0ZEd1VPOVE0MURnVU5oUmdGS0JVdWxTNjFJd1U2eFRKMVlWVmd4V0VsYjhWUTlXSEZZQlZoTldBbGI2VlIxV0JGYi9WZmxWaVZoOFdKQlltRmlHV0lGWWYxaDBXSXRZZWxpSFdKRllqbGgyV0lKWWlGaDdXSlJZajFqK1dHdFozRnJ1V3VWYTFWcnFXdHBhN1Zycld2TmE0bHJnV3R0YTdGcmVXdDFhMlZyb1d0OWFkMXZnVytOYlkxeUNYWUJkZlYyR1hYcGRnVjEzWFlwZGlWMklYWDVkZkYyTlhYbGRmMTFZWGxsZVUxN1lYdEZlMTE3T1h0eGUxVjdaWHRKZTFGNUVYME5mYjErMlh5eGhLR0ZCWVY1aGNXRnpZVkpoVTJGeVlXeGhnR0YwWVZSaGVtRmJZV1ZoTzJGcVlXRmhWbUVwWWlkaUsySXJaRTFrVzJSZFpIUmtkbVJ5WkhOa2ZXUjFaR1prcG1ST1pJSmtYbVJjWkV0a1UyUmdaRkJrZjJRL1pHeGthMlJaWkdWa2QyUnpaYUJsb1dhZ1pwOW1CV2NFWnlKbnNXbTJhY2xwb0duT2FaWnBzR21zYWJ4cGtXbVphWTVwcDJtTmFhbHB2bW12YWI5cHhHbTlhYVJwMUdtNWFjcHBtbW5QYWJOcGsybXFhYUZwbm1uWmFaZHBrR25DYWJWcHBXbkdhVXByVFd0TGE1NXJuMnVnYThOcnhHdithODV1OVc3eGJnTnZKVy80YmpkdisyNHVid2x2VG04WmJ4cHZKMjhZYnp0dkVtL3RiZ3B2Tm05emIvbHU3bTR0YjBCdk1HODhielZ2NjI0SGJ3NXZRMjhGYi8xdTltNDVieHh2L0c0NmJ4OXZEVzhlYndodklXK0hjWkJ4aVhHQWNZVnhnbkdQY1h0eGhuR0JjWmR4UkhKVGNwZHlsWEtUY2tOelRYTlJjMHh6WW5SemRIRjBkWFJ5ZEdkMGJuUUFkUUoxQTNWOWRaQjFGbllJZGd4MkZYWVJkZ3AyRkhhNGRvRjNmSGVGZDRKM2JuZUFkMjkzZm5lRGQ3SjRxbmkwZUsxNHFIaCtlS3Q0bm5pbGVLQjRySGlpZUtSNG1IbUtlWXQ1bG5tVmVaUjVrM21YZVloNWtubVFlU3Q2U25vd2VpOTZLSG9tZXFoNnEzcXNldTU2aUh1Y2U0cDdrWHVRZTVaN2pYdU1lNXQ3am51RmU1aDdoRktaZTZSN2dudTdmTDk4dkh5NmZLZDl0MzNDZmFOOXFuM0JmY0I5eFgyZGZjNTl4SDNHZmN0OXpIMnZmYmw5bG4yOGZaOTlwbjJ1ZmFsOW9YM0pmWE4vNG4vamYrVi8zbjhrZ0YyQVhJQ0pnWWFCZzRHSGdZMkJqSUdMZ1JXQ2w0U2toS0dFbjRTNmhNNkV3b1NzaEs2RXE0UzVoTFNFd1lUTmhLcUVtb1N4aE5DRW5ZU25oTHVFb29TVWhNZUV6SVNiaEttRXI0U29oTmFFbUlTMmhNK0VvSVRYaE5TRTBvVGJoTENFa1lSaGhqT0hJNGNvaDJ1SFFJY3VoeDZISVljWmh4dUhRNGNzaDBHSFBvZEdoeUNITW9jcWh5MkhQSWNTaHpxSE1ZYzFoMEtISm9jbmh6aUhKSWNhaHpDSEVZZjNpT2VJOFlqeWlQcUkvb2p1aVB5STlvajdpUENJN0lqcmlKMkpvWW1maVo2SjZZbnJpZWlKcTRxWmlvdUtrb3FQaXBhS1BZeG9qR21NMVl6UGpOZU1sbzBKamdLTy80ME5qdjJOQ280RGpnZU9CbzRGanY2TkFJNEVqaENQRVk4T2p3MlBJNUVja1NDUklwRWZrUjJSR3BFa2tTR1JHNUY2a1hLUmVaRnprYVdTcEpKMmtwdVNlcEtna3BTU3FwS05rcWFTbXBLcmtubVNsNUova3FPUzdwS09rb0tTbFpLaWtuMlNpSktoa29xU2hwS01rcG1TcDVKK2tvZVNxWktka291U0xaS2VscUdXLzVaWWwzMlhlcGQrbDRPWGdKZUNsM3VYaEplQmwzK1h6cGZObHhhWXJaaXVtQUtaQUprSG1aMlpuSm5EbWJtWnU1bTZtY0tadlpuSG1iR2E0NXJubWo2YlA1dGdtMkdiWDV2eG5QS2M5WnlubnY5UUExRXdVZmhRQmxFSFVmWlEvbEFMVVF4Ui9WQUtVWXRTakZMeFV1OVNTRlpDVmt4V05WWkJWa3BXU1ZaR1ZsaFdXbFpBVmpOV1BWWXNWajVXT0ZZcVZqcFdHbGVyV0oxWXNWaWdXS05ZcjFpc1dLVllvVmovV1A5YTlGcjlXdmRhOWxvRFcvaGFBbHY1V2dGYkIxc0ZXdzliWjF5WlhaZGRuMTJTWGFKZGsxMlZYYUJkbkYyaFhacGRubDFwWGwxZVlGNWNYdk45MjE3ZVh1RmVTVit5WDR0aGcyRjVZYkZoc0dHaVlZbGhtMkdUWWE5aHJXR2ZZWkpocW1HaFlZMWhabUd6WVMxaWJtUndaSlprb0dTRlpKZGtuR1NQWkl0a2ltU01aS05rbjJSb1pMRmttR1IyWlhwbGVXVjdaYkpsczJXMVpyQm1xV2F5WnJkbXFtYXZaZ0JxQm1vWGF1VnArR2tWYXZGcDVHa2dhdjlwN0duaWFSdHFIV3IrYVNkcThtbnVhUlJxOTJubmFVQnFDR3JtYWZ0cERXcjhhZXRwQ1dvRWFoaHFKV29QYXZacEptb0hhdlJwRm1wUmE2VnJvMnVpYTZackFXd0FiUDlyQW14QmJ5WnZmbStIYjhadmttK05iNGx2akc5aWIwOXZoVzlhYjVadmRtOXNiNEp2Vlc5eWIxSnZVRzlYYjVSdmsyOWRid0J2WVc5cmIzMXZaMitRYjFOdmkyOXBiMzl2bFc5amIzZHZhbTk3YjdKeHIzR2JjYkJ4b0hHYWNhbHh0WEdkY2FWeG5uR2tjYUZ4cW5HY2NhZHhzM0dZY3BweVdITlNjMTV6WDNOZ2MxMXpXM05oYzFweldYTmljNGQwaVhTS2RJWjBnWFI5ZElWMGlIUjhkSGwwQ0hVSGRYNTFKWFllZGhsMkhYWWNkaU4yR25Zb2RodDJuSGFkZHA1Mm0zYU5kNDkzaVhlSWQ4MTR1M2pQZU14NDBYak9lTlI0eUhqRGVNUjR5WGlhZWFGNW9IbWNlYUo1bTNsMmF6bDZzbnEwZXJONnQzdkxlNzU3ckh2T2U2OTd1WHZLZTdWN3hYeklmTXg4eTN6M2ZkdDk2bjNuZmRkOTRYMERmdnA5NW4zMmZmRjk4SDN1ZmQ5OWRuK3NmN0IvclgvdGYrdC82bi9zZitaLzZIOWtnR2VBbzRHZmdaNkJsWUdpZ1ptQmw0RVdnaytDVTRKU2dsQ0NUb0pSZ2lTRk80VVBoUUNGS1lVT2hRbUZEWVVmaFFxRko0VWNoZnVFSzRYNmhBaUZESVgwaENxRjhvUVZoZmVFNjRUemhQeUVFb1hxaE9tRUZvWCtoQ2lGSFlVdWhRS0YvWVFlaGZhRU1ZVW1oZWVFNklUd2hPK0UrWVFZaFNDRk1JVUxoUm1GTDRWaWhsYUhZNGRraDNlSDRZZHpoMWlIVklkYmgxS0hZWWRhaDFHSFhvZHRoMnFIVUlkT2gxK0hYWWR2aDJ5SGVvZHVoMXlIWllkUGgzdUhkWWRpaDJlSGFZZGFpQVdKRElrVWlRdUpGNGtZaVJtSkJva1dpUkdKRG9rSmlhS0pwSW1qaWUySjhJbnNpYytLeG9xNGl0T0swWXJVaXRXS3U0clhpcjZLd0lyRml0aUt3NHE2aXIySzJZbytqRTJNajR6bGpOK00yWXpvak5xTTNZem5qS0NObkkyaGpadU5JSTRqamlXT0pJNHVqaFdPRzQ0V2poR09HWTRtamllT0ZJNFNqaGlPRTQ0Y2poZU9HbzRzanlTUEdJOGFqeUNQSTQ4V2p4ZVBjNUJ3a0crUVo1QnJrQytSSzVFcGtTcVJNcEVta1M2UmhaR0drWXFSZ1pHQ2tZU1JnSkhRa3NPU3hKTEFrdG1TdHBMUGt2R1MzNUxZa3VtUzE1TGRrc3lTNzVMQ2t1aVN5cExJa3M2UzVwTE5rdFdTeVpMZ2t0NlM1NUxSa3RPU3RaTGhrc2FTdEpKOGxheVZxNVd1bGJDVnBKYWlsdE9XQlpjSWx3S1hXcGVLbDQ2WGlKZlFsOCtYSHBnZG1DYVlLWmdvbUNDWUc1Z25tTEtZQ0puNm1CR1pGSmtXbVJlWkZabmNtYzJaejVuVG1kU1p6cG5KbWRhWjJKbkxtZGVaekptem11eWE2NXJ6bXZLYThacEdtME9iWjV0MG0zR2JacHQybTNXYmNKdG9tMlNiYkp2OG5QcWMvWnovblBlY0I1MEFuZm1jKzV3SW5RV2RCSjJEbnRPZUQ1OFFueHhSRTFFWFVScFJFVkhlVVRSVDRWTndWbUJXYmxaelZtWldZMVp0Vm5KV1hsWjNWaHhYRzFmSVdMMVl5VmkvV0xwWXdsaThXTVpZRjFzWld4dGJJVnNVV3hOYkVGc1dXeWhiR2xzZ1d4NWI3MXVzWGJGZHFWMm5YYlZkc0YydVhhcGRxRjJ5WGExZHIxMjBYV2RlYUY1bVhtOWU2VjduWHVaZTZGN2xYa3RmdkYrZFlhaGhsbUhGWWJSaHhtSEJZY3hodW1HL1liaGhqR0hYWk5aazBHVFBaTWxrdldTSlpNTmsyMlR6Wk5sa00yVi9aWHhsb21YSVpyNW13R2JLWnN0bXoyYTlacnRtdW1iTVppTm5OR3BtYWtscVoyb3lhbWhxUG1wZGFtMXFkbXBiYWxGcUtHcGFhanRxUDJwQmFtcHFaR3BRYWs5cVZHcHZhbWxxWUdvOGFsNXFWbXBWYWsxcVRtcEdhbFZyVkd0V2E2ZHJxbXVyYThocngyc0ViQU5zQm15dGI4dHZvMi9IYjd4dnptL0liMTV2eEcrOWI1NXZ5bStvYndSd3BXK3ViN3B2ckcrcWI4OXZ2Mis0YjZKdnlXK3JiODF2cjIreWI3QnZ4WEhDY2I5eHVISFdjY0J4d1hITGNkUnh5bkhIY2M5eHZYSFljYnh4eG5IYWNkdHhuWEtlY21selpuTm5jMnh6WlhOcmMycHpmM1NhZEtCMGxIU1NkSlYwb1hRTGRZQjFMM1l0ZGpGMlBYWXpkangyTlhZeWRqQjJ1M2JtZHBwM25YZWhkNXgzbTNlaWQ2TjNsWGVaZDVkMzNYanBlT1Y0Nm5qZWVPTjQyM2poZU9KNDdYamZlT0I0cEhsRWVraDZSM3EyZXJoNnRYcXhlcmQ2M252amUrZDczWHZWZStWNzJudm9lL2w3MUh2cWUrSjczSHZyZTloNzMzdlNmTlI4MTN6UWZORjhFbjRoZmhkK0RINGZmaUIrRTM0T2ZoeCtGWDRhZmlKK0MzNFBmaForRFg0VWZpVitKSDVEZjN0L2ZIOTZmN0YvNzM4cWdDbUFiSUN4Z2FhQnJvRzVnYldCcTRHd2dheUJ0SUd5Z2JlQnA0SHlnVldDVm9KWGdsYUZSWVZyaFUyRlU0VmhoVmlGUUlWR2hXU0ZRWVZpaFVTRlVZVkhoV09GUG9WYmhYR0ZUb1Z1aFhXRlZZVm5oV0NGaklWbWhWMkZWSVZsaFd5Rlk0WmxobVNHbTRlUGg1ZUhrNGVTaDRpSGdZZVdoNWlIZVllSGg2T0hoWWVRaDVHSG5ZZUVoNVNIbkllYWg0bUhIb2ttaVRDSkxZa3VpU2VKTVlraWlTbUpJNGt2aVN5Skg0bnhpZUNLNG9yeWl2U0s5WXJkaWhTTDVJcmZpdkNLeUlyZWl1R0s2SXIvaXUrSys0cVJqSktNa0l6MWpPNk04WXp3alBPTWJJMXVqYVdOcDQwempqNk9PSTVBamtXT05vNDhqajJPUVk0d2pqK092WTQyank2UE5ZOHlqem1QTjQ4MGozYVFlWkI3a0lhUStwQXprVFdSTnBHVGtaQ1JrWkdOa1krUko1TWVrd2lUSDVNR2t3K1RlcE00a3p5VEc1TWpreEtUQVpOR2t5MlREcE1Oazh1U0haUDZraVdURTVQNWt2ZVNOSk1Da3lTVC81SXBrem1UTlpNcWt4U1RESk1May82U0NaTUFrL3VTRnBPOGxjMlZ2cFc1bGJxVnRwVy9sYldWdlpXcGx0U1dDNWNTbHhDWG1aZVhsNVNYOEpmNGx6V1lMNWd5bUNTWkg1a25tU21abnBudW1leVo1Wm5rbWZDWjQ1bnFtZW1aNTVtNW1yK2F0SnE3bXZhYStwcjVtdmVhTTV1QW00V2JoNXQ4bTM2YmU1dUNtNU9ia3B1UW0zcWJsWnQ5bTRpYkpaMFhuU0NkSHAwVW5TbWRIWjBZblNLZEVKMFpuUitkaUo2R25vZWVycDZ0bnRXZTFwNzZuaEtmUFo4bVVTVlJJbEVrVVNCUktWSDBVcE5XakZhTlZvWldoRmFEVm41V2dsWi9Wb0ZXMWxqVVdNOVkwbGd0V3lWYk1sc2pXeXhiSjFzbVd5OWJMbHQ3Vy9GYjhsdTNYV3hlYWw2K1g3dGZ3MkcxWWJ4aDUySGdZZVZoNUdIb1lkNWg3MlRwWk9OazYyVGtaT2hrZ1dXQVpiWmwybVhTWm8xcWxtcUJhcVZxaVdxZmFwdHFvV3FlYW9kcWsycU9hcFZxZzJxb2FxUnFrV3AvYXFacW1tcUZhb3hxa21wYmE2MXJDV3pNYjZsdjlHL1ViK052M0cvdGIrZHY1bS9lYi9KdjNXL2liK2h2NFhIeGNlaHg4bkhrY2ZCeDRuRnpjMjV6YjNPWGRMSjBxM1NRZEtwMHJYU3hkS1YwcjNRUWRSRjFFblVQZFlSMVEzWklka2wyUjNha2R1bDJ0WGVyZDdKM3QzZTJkN1Izc1hlb2QvQjM4M2o5ZUFKNSszajhlUEo0QlhuNWVQNTRCSG1yZWFoNVhIcGJlbFo2V0hwVWVscDZ2bnJBZXNGNkJYd1BmUEo3QUh6L2UvdDdEbnowZXd0ODgzc0NmQWw4QTN3QmZQaDcvWHNHZlBCNzhYc1FmQXA4Nkh3dGZqeCtRbjR6ZmtpWU9INHFma2wrUUg1SGZpbCtUSDR3Zmp0K05uNUVmanArUlg5L2YzNS9mWC8wZi9KL0xJQzdnY1NCeklIS2djV0J4NEc4Z2VtQlc0SmFnbHlDZzRXQWhZK0ZwNFdWaGFDRmk0V2poWHVGcElXYWhaNkZkNFY4aFltRm9ZVjZoWGlGVjRXT2haYUZob1dOaFptRm5ZV0JoYUtGZ29XSWhZV0ZlWVYyaFppRmtJV2ZoV2lHdm9lcWg2Mkh4WWV3aDZ5SHVZZTFoN3lIcm9mSmg4T0h3b2ZNaDdlSHI0ZkVoOHFIdEllMmg3K0h1SWU5aDk2SHNvYzFpVE9KUElrK2lVR0pVb2szaVVLSnJZbXZpYTZKOG9uemlSNkxHSXNXaXhHTEJZc0xpeUtMRDRzU2l4V0xCNHNOaXdpTEJvc2NpeE9MR290UGpIQ01jb3h4akcrTWxZeVVqUG1NYjQxT2prMk9VNDVRamt5T1I0NURqMENQaFpCK2tEaVJtcEdpa1p1Um1aR2ZrYUdSblpHZ2thR1RnNU92azJTVFZwTkhrM3lUV0pOY2szYVRTWk5RazFHVFlKTnRrNCtUVEpOcWszbVRWNU5WazFLVFQ1TnhrM2VUZTVOaGsxNlRZNU5uazRDVFRwTlprOGVWd0pYSmxjT1Z4WlczbGE2V3NKYXNsaUNYSDVjWWx4MlhHWmVhbDZHWG5KZWVsNTJYMVpmVWwvR1hRWmhFbUVxWVNaaEZtRU9ZSlprcm1TeVpLcGt6bVRLWkw1a3RtVEdaTUptWW1hT1pvWmtDbXZxWjlKbjNtZm1aK0puMm1mdVovWm4rbWZ5WkE1cSttdjZhL1pvQm0veWFTSnVhbTZpYm5wdWJtNmFib1p1bG02U2JocHVpbTZDYnI1c3puVUdkWjUwMm5TNmRMNTB4blRpZE1KMUZuVUtkUTUwK25UZWRRSjA5bmZWL0xaMktub21lalo2d25zaWUycDc3bnYrZUpKOGpueUtmVkorZ256RlJMVkV1VVpoV25GYVhWcHBXblZhWlZuQlpQRnRwWEdwY3dGMXRYbTVlMkdIZlllMWg3bUh4WWVwaDhHSHJZZFpoNldIL1pBUmwvV1Q0WkFGbEEyWDhaSlJsMjJYYVp0dG0yR2JGYXJscXZXcmhhc1pxdW1xMmFyZHF4MnEwYXExcVhtdkphd3RzQjNBTWNBMXdBWEFGY0JSd0RuRC9id0J3KzI4bWNQeHY5MjhLY0FGeS8zSDVjUU55L1hGMmM3aDB3SFMxZE1GMHZuUzJkTHQwd25RVWRSTjFYSFprZGxsMlVIWlRkbGQyV25hbWRyMTI3SGJDZDdwMy8zZ01lUk41RkhrSmVSQjVFbmtSZWExNXJIbGZlaHg4S1h3WmZDQjhIM3d0ZkIxOEpud29mQ0o4Slh3d2ZGeCtVSDVXZm1OK1dINWlmbDkrVVg1Z2ZsZCtVMzYxZjdOLzkzLzRmM1dBMFlIU2dkQ0JYNEplZ3JTRnhvWEFoY09Gd29XemhiV0Z2WVhIaGNTRnY0WExoYzZGeUlYRmhiR0Z0b1hTaFNTR3VJVzNoYjZGYVlibmgrYUg0b2ZiaCt1SDZvZmxoOStIODRma2g5U0gzSWZUaCsySDJJZmpoNlNIMTRmWmh3R0k5SWZvaDkySFU0bExpVStKVElsR2lWQ0pVWWxKaVNxTEo0c2ppek9MTUlzMWkwZUxMNHM4aXo2TE1Zc2xpemVMSm9zMml5NkxKSXM3aXoyTE9vdENqSFdNbVl5WWpKZU0vb3dFalFLTkFJMWNqbUtPWUk1WGpsYU9YbzVsam1lT1c0NWFqbUdPWFk1cGpsU09SbzlIajBpUFM0OG9rVHFSTzVFK2thaVJwWkdua2ErUnFwRzFrNHlUa3BPM2s1dVRuWk9KazZlVGpwT3FrNTZUcHBPVms0aVRtWk9mazQyVHNaT1JrN0tUcEpPb2s3U1RvNU9sazlLVjA1WFJsYk9XMTViYWxzSmQzNWJZbHQyV0k1Y2lseVdYckpldWw2aVhxNWVrbDZxWG9wZWxsOWVYMlpmV2w5aVgrcGRRbUZHWVVwaTRtRUdaUEprNm1RK2FDNW9KbWcyYUJKb1JtZ3FhQlpvSG1nYWF3SnJjbWdpYkJKc0ZteW1iTlp0S20weWJTNXZIbThhYnc1dS9tOEdidFp1NG05T2J0cHZFbTdtYnZadGNuVk9kVDUxS25WdWRTNTFablZhZFRKMVhuVktkVkoxZm5WaWRXcDJPbm95ZTM1NEJud0NmRnA4bG55dWZLcDhwbnlpZlRKOVZuelJSTlZHV1V2ZFN0Rk9yVnExV3BsYW5WcXBXckZiYVdOMVkyMWdTV1QxYlBscy9XOE5kY0Y2L1gvdGhCMlVRWlExbENXVU1aUTVsaEdYZVpkMWwzbWJuYXVCcXpHclJhdGxxeTJyZmF0eHEwR3JyYXM5cXpXcmVhbUJyc0dzTWJCbHdKM0FnY0Jad0szQWhjQ0p3STNBcGNCZHdKSEFjY0Nwd0RISUtjZ2R5QW5JRmNxVnlwbktrY3FOeW9YTExkTVYwdDNURGRCWjFZSGJKZDhwM3hIZnhkeDE1RzNraGVSeDVGM2tlZWJCNVozcG9lak44UEh3NWZDeDhPM3pzZk9wOGRuNTFmbmgrY0g1M2ZtOStlbjV5Zm5SK2FINUxmMHAvZzMrR2Y3ZC8vWC8rZjNpQTE0SFZnV1NDWVlKamd1dUY4WVh0aGRtRjRZWG9oZHFGMTRYc2hmS0YrSVhZaGQrRjQ0WGNoZEdGOElYbWhlK0Yzb1hpaFFDSStvY0RpUGFIOTRjSmlBeUlDNGdHaVB5SENJai9od3FJQW9oaWlWcUpXNGxYaVdHSlhJbFlpVjJKV1ltSWliZUp0b24yaVZDTFNJdEtpMENMVTR0V2kxU0xTNHRWaTFHTFFvdFNpMWVMUTR4M2pIYU1tb3dHalFlTkNZMnNqYXFOclkycmpXMk9lSTV6am1xT2I0NTdqc0tPVW85UmowK1BVSTlUajdTUFFKRS9rYkNSclpIZWs4ZVR6NVBDazlxVDBKUDVrK3lUekpQWms2bVQ1cFBLazlTVDdwUGprOVdUeEpQT2s4Q1QwcFBuazMyVjJwWGJsZUdXS1pjcmx5eVhLSmNtbDdPWHQ1ZTJsOTJYM3BmZmwxeVlXWmhkbUZlWXY1aTltTHVZdnBoSW1VZVpRNW1tbWFlWkdwb1ZtaVdhSFpva21odWFJcG9nbWllYUk1b2VtaHlhRkpyQ21ndWJDcHNPbXd5Yk41dnFtK3ViNEp2ZW0rU2I1cHZpbS9DYjFKdlhtK3liM0p2Wm0rV2IxWnZobTlxYmQ1MkJuWXFkaEoySW5YR2RnSjE0bllhZGk1Mk1uWDJkYTUxMG5YV2RjSjFwbllXZGM1MTduWUtkYjUxNW5YK2RoNTFvblpTZWtaN0FudnllTFo5QW4wR2ZUWjlXbjFlZldKODNVN0pXdFZhelZ1TllSVnZHWGNkZDdsN3ZYc0Jmd1YvNVlSZGxGbVVWWlJObDMyWG9adU5tNUdiemF2QnE2bXJvYXZscThXcnVhdTlxUEhBMWNDOXdOM0EwY0RGd1FuQTRjRDl3T25BNWNFQndPM0F6Y0VGd0UzSVVjcWh5ZlhOOGM3cDBxM2FxZHI1MjdYYk1kODUzejNmTmQvSjNKWGtqZVNkNUtIa2tlU2w1c25sdWVteDZiWHIzZWtsOFNIeEtmRWQ4Ulh6dWZIdCtmbjZCZm9CK3VuLy9mM21BMjRIWmdRdUNhSUpwZ2lLRy80VUJodjZGRzRZQWh2YUZCSVlKaGdXR0RJYjloUm1JRUlnUmlCZUlFNGdXaUdPSlpvbTVpZmVKWUl0cWkxMkxhSXRqaTJXTFo0dHRpNjZOaG82SWpvU09XWTlXajFlUFZZOVlqMXFQalpCRGtVR1J0NUcxa2JLUnM1RUxsQk9VKzVNZ2xBK1VGSlQra3hXVUVKUW9sQm1VRFpUMWt3Q1U5NU1IbEE2VUZwUVNsUHFUQ1pUNGt3cVUvNVA4a3d5VTlwTVJsQWFVM3BYZ2xkK1ZMcGN2bDdtWHU1ZjlsLzZYWUpoaW1HT1lYNWpCbU1LWVVKbE9tVm1aVEpsTG1WT1pNcG8wbWpHYUxKb3FtamFhS1pvdW1qaWFMWnJIbXNxYXhwb1FteEtiRVpzTG5BaWM5NXNGbkJLYytKdEFuQWVjRHB3R25CZWNGSndKbkorZG1aMmtuWjJka3AyWW5aQ2RtNTJnblpTZG5KMnFuWmVkb1oyYW5hS2RxSjJlbmFPZHY1MnBuWmFkcHAybm5abWVtNTZhbnVXZTVKN25udWFlTUo4dW4xdWZZSjllbjEyZldaK1JuenBST1ZHWVVwZFN3MWE5VnI1V1NGdEhXOHRkejEzeFh2MWhHMlVDYS94cUEydjRhZ0JyUTNCRWNFcHdTSEJKY0VWd1JuQWRjaHB5R1hKK2N4ZDFhbmJRZHkxNU1Ya3ZlVlI4VTN6eWZJcCtoMzZJZm90K2huNk5mazEvdTM4d2dOMkJHSVlxaGlhR0g0WWpoaHlHR1lZbmhpNkdJWVlnaGltR0hvWWxoaW1JSFlnYmlDQ0lKSWdjaUN1SVNvaHRpV21KYm9scmlmcUplWXQ0aTBXTGVvdDdpeENORkkydmpZNk9qSTVlajF1UFhZOUdrVVNSUlpHNWtUK1VPNVEybENtVVBaUThsRENVT1pRcWxEZVVMSlJBbERHVTVaWGtsZU9WTlpjNmw3K1g0WmRrbU1tWXhwakFtRmlaVnBrNW1qMmFScHBFbWtLYVFabzZtaithelpvVm14ZWJHSnNXbXpxYlVwc3JuQjJjSEp3c25DT2NLSndwbkNTY0laeTNuYmFkdkozQm5jZWR5cDNQbmI2ZHhaM0RuYnVkdFozT25ibWR1cDJzbmNpZHNaMnRuY3lkczUzTm5iS2RlcDZjbnV1ZTdwN3RuaHVmR0o4YW56R2ZUcDlsbjJTZmtwKzVUc1pXeFZiTFZuRlpTMXRNVzlWZDBWM3lYaUZsSUdVbVpTSmxDMnNJYXdsckRXeFZjRlp3VjNCU2NCNXlIM0twY245ejJIVFZkTmwwMTNSdGRxMTJOWG0wZVhCNmNYcFhmRng4V1h4YmZGcDg5SHp4ZkpGK1QzK0hmOTZCYTRJMGhqV0dNNFlzaGpLR05vWXNpQ2lJSm9ncWlDV0ljWW0vaWI2Sis0bCtpNFNMZ291R2k0V0xmNHNWalpXT2xJNmFqcEtPa0k2V2pwZU9ZSTlpajBlUlRKUlFsRXFVUzVSUGxFZVVSWlJJbEVtVVJwUS9sK09YYXBocG1NdVlWSmxibVU2YVU1cFVta3lhVDVwSW1rcWFTWnBTbWxDYTBKb1pteXViTzV0V20xV2JScHhJbkQrY1JKdzVuRE9jUVp3OG5EZWNOSnd5bkQyY05wemJuZEtkM3AzYW5jdWQwSjNjbmRHZDM1M3BuZG1kMkozV25mV2QxWjNkbmJhZThKNDFuek9mTXA5Q24ydWZsWitpbnoxUm1WTG9XT2RZY2xsTlc5aGRMNGhQWHdGaUEySUVZaWxsSldXV1pldG1FV3NTYXc5cnltdGJjRnB3SW5LQ2M0RnpnM053ZHRSM1ozeG1mSlYrYklJNmhrQ0dPWVk4aGpHR080WStoakNJTW9ndWlET0lkb2wwaVhPSi9vbU1pNDZMaTR1SWkwV01HWTJZam1TUFk0KzhrV0tVVlpSZGxGZVVYcFRFbDhXWEFKaFdtbG1hSHBzZm15Q2JVcHhZbkZDY1NweE5uRXVjVlp4Wm5FeWNUcHo3bmZlZDc1M2puZXVkK0oza25mYWQ0WjN1bmVhZDhwM3duZUtkN0ozMG5mT2Q2SjN0bmNLZTBKN3ludk9lQnA4Y256aWZONTgybjBPZlQ1OXhuM0NmYnA5dm45Tld6VlpPVzIxY0xXWHRadTVtRTJ0ZmNHRndYWEJnY0NOeTIzVGxkTlYzT0htM2ViWjVhbnlYZm9sL2JZSkRoamlJTjRnMWlFdUlsSXVWaTU2T240NmdqcDJPdnBHOWtjS1JhNVJvbEdtVTVaWkdsME9YUjVmSGwrV1hYcHJWbWxtYlk1eG5uR2FjWXB4ZW5HQ2NBcDcrblFlZUE1NEduZ1dlQUo0Qm5nbWUvNTM5blFTZW9KNGVuMGFmZEo5MW4zYWYxRll1WmJobEdHc1pheGRyR210aWNDWnlxbkxZZDlsM09YbHBmR3Q4OW55YWZwaCttMzZaZnVDQjRZRkdoa2VHU0laNWlYcUpmSWw3aWYrSm1JdVppNldPcEk2amptNlViWlJ2bEhHVWM1UkpsM0tZWDVsb25HNmNiWndMbmcyZUVKNFBuaEtlRVo2aG52V2VDWjlIbjNpZmU1OTZuM21mSGxkbWNHOThQSWl5amFhT3c1RjBsSGlVZHBSMWxHQ2FkSnh6bkhHY2Rad1VuaE9lOXA0S242U2ZhSEJsY1BkOGFvWStpRDJJUDRpZWk1eU1xWTdKamt1WGM1aDBtTXlZWVptcm1XU2FacHBubWlTYkZaNFhua2lmQjJJZWF5ZHlUSWFvam9LVWdKU0JsR21hYUpvdW14bWVLWEpMaHArTGc1UjVuTGVlZFhacm1ucWNIWjVwY0dwd3BKNStuMG1mbUorQmVMbVN6NGk3V0ZKZ3AzejZXbFFsWmlWWEpXQWxiQ1ZqSlZvbGFTVmRKVklsWkNWVkpWNGxhaVZoSlZnbFp5VmJKVk1sWlNWV0pWOGxheVZpSlZrbGFDVmNKVkVsVUNWdEpXNGxjQ1Z2SmUzL1J3WGJrdDhGeFQ5TWhiVkM3M08xVVVrMlFrbmtpVVNUMnhudWdzZzhQSGhFWjk5aU0wbXFpYUFDczJzRkU2dFA3U1FJVUNsdGhIb0FOckZLRXlVcFVINERwRitBQTBjRDIyNGZCSDFRQVZGNk5BNVJiSmhETnhhRXBFbUhCR0JSdEROcVVmOEwvQ0RsQWpBbGpnVXpNb01aZ2x0OWg3TUZtVHl5VWJoUk5KM0pVYzlSMFZIY1BOTlJwa3F6VWVKUlFsUHRVYzJEUG1rdE4zdGZDMUltVWp4U3RWSlhVcFJTdVZMRlVoVjhRb1hnVWcyR0Uyc0ZVOTZLU1ZYWmJvQS9WQW5zUHpOVFJGUGlDOHRzSmhjYmFOVnpTbUNxUHN3NDZCYmRjYUpFYlZOMFU2dUdmbE4vVTVZVkV4Ym1kNU5UbTRxZ1U2dFRybE9uYzNKWFdUK2NjOEZUeFZOSmJFbE8vbGZaVTZzNmp3dmdVK3Mvb3kzMlUzY01FMVI1Y0N0VlYyWmJiVzFVVTJ0MERWMVZqMVNrVktaSERSZmREclE5VFEyOGlaZ21SMVh0VEM5VUYzU0dWYWxWQlZiWEdEcEFVa1UxUkxObXRCQTNWczFtaWpLa1pxMW1UVlpQVnZGNDhWYUhsLzVUQUZmdlZ1MVdab3NqTms4U1JsZWxRVzVzaTNCQ1Y3RTJmbXptVnhZVUExaFVGR05ESmxqMVMxeFlxbGhoTmVCWTNGZzhFdnRZLzF0RFYxQ2hlRUxUazZFMUgxbW1hTU0yV1c0K0ZpUmFVMVdTRmdXRnlWbE9EWUZzS20zY0Y5bForeGV5RjZadGNXMG9HTlVXK1ZsRmJxdGFZMXJtTnFsSmQxb0lONVphWlhUVFdxRnZWQ1dGUFJFWk1qZTRGb05lMEZKMlc0aGxmRnNPZWdSQVhVZ0VBdFZiWUdFMEdzeFpwUVh6VzUxYkVFMEZYRVFiRTF6T2N4UmNwUndvYTBsYzNVaUZYT2xjNzF5TFhma2ROeDRRWFJoZFJsMmtIcnBjMTEzOGdpMDRBVWxKSUhNaGg0STJPTUk3TGw2S2FuVmVlbDY4Uk5NTXBsTzNUdEJlcUZOeEZ3bGU5RjZDaFBsZSsxNmdPUHhlUG1nYmxBMWZ3UUdVK040NnJrZzZFenBmaUdqUUkxaGZjU1JqWDcyWGJtNXlYMENUTm9xblg3WmRYejFRVW1vZitIQm9KdGFSbmdJcGlqRmdoV1ozR0dNNXh6MDVOcEJYdENkeGVVQStubUNrWUxOZ2drbVBTVk42cEhUaFVLQmFaR0VraEVKaHB2alNib0ZoOUZGV0JvZGhxbHUzUDE4bzAyR2RpMTJaMEdFeU9ZQXB3U2dqWUZ4aEhtV0xZeGdCeFdKd0Y5VmlEUzVzWTk5SkZ6bzRaUGhqamhQOEY1QmtpbTgyTGhTWWpFQWRWK0ZrNVdSN2xHWTZPbVJYT2sxbEZtOG9TaU5LaFdWdFpWOWxmakMxWlVCSk4wdlJaZGhBS1JqZ1plTmwzMThBTkJobTl6SDRNVVJtcERHbE1VdG1kUTVuWnVaUmMyWjBaajBlTVRMMGhjZ3hFMVBGZC9jb3BKa0NaNXhESVVvck8vcHB3amRlWjJkblltZk5RZTJRMTJmcFJDSm9VRzQ4a2dGbzVqT2diVjFvYnpUaGFRdHEzNHB6YWNOb3pUVUJhUUJwTWowQk9qdzJnRHVzWjJGcFNvcjhRalpwbUdtaE84a0RZNE9RVVBscFdUWXFJVVZxQXplZGF2TTdzV2ZJYXB5UkRUd2RheU1KM21BMWEzUnJ6U2UxYnRzNnRRTllHVUEzSVZSYU8rRnIvRDdjYXpkc2l5VHhTRkZyV213bWdubHN2RDNGUkwwOXBFRU1TUUJKeVR6bE51czhNZzJEbS9reGtTU1BmemRvSlcyaGJldHRsbTFjYlh4dUJHOS9TWVZBY200emhYUnZ4MUdjYkIxdUxvUWhpeTl1THo1VGRJSS96SGxQYnBGYVN6RDRidzAzblc4d1B2cHVseFE5UUZWRjhKTkViMXh2VGoxMGIzQ1JPejJmYjBSQjAyK1JRRlZCT1VEd1A3US9QMEhmVVZaQlYwRkFRZDFoUzNCK2NLZHdnWERNY05WdzFuRGZjQVJCNkQyMGNaWnhkMElyY1VWeGlGcEtjVzV4bkZ4bFEwOXhZcFBCUWl4eFdrUW5TaUpLdW5Ib2k3MXdEbkpDbEJWeUVWbERsQ1J5UVpNRlZpNXlRSEowU2Ixb1ZYSlhjbFUrUkRBTmFEMXZnbklxY3l0ekkwZ3JpTzFJQklnb2N5NXp6M09xY3pvTUxtckpjMGwwNGtIbkZpUktJMmJGTnJkSmpVbjdTZmR6RlhRRGFTWktPWFREQmRjK1hIU3RLR0Iwc281SGRPUnpkblM1ZzJ4ME1EZDBkUEdUTEdxQ2RGTkpqRXBmUVhsS2o0dEdXd09NbmhqSWRJZ1pEblhwZEI1MTJZNUxHdGRickk2RmswMTFTblZuZFc1MWdrOEVQeE5Oam5WZGRKNTF0SFVDZGl4MlVYWlBkbTkyZG5iMVk1QjI3NEg0TnhGcERtbWhkcVYydDNiTWRwOXZZb1NkVUgxUkhCNGVkeVozUUhldlpDQlNXSGVzTXE5M1pJbG9pY0VXOUhjSmVIWVRFa3JLYUs5NHgzalRlS1dXTG5uZ1ZkZDROSG14ZUF4MnVJK0VpQ3VMZzJBY0pvWjVBSWtDYVlCNVYxaWRlVGw3UEhtcGVTcHVKbkdvUHNaNURaSFVlWnhPRmxVRFdqK1d3RlFiWVNoajlsa2lrSFdFSElOUWVxcGc0V01sYnUxbFpvU21ndldiazJnblY2RmxjV0tiVzlCWmU0YjBtR0o5dm4yT214WmluM3kzaUlsYnRWNEpZNWRtU0dqSGxZMlhUMmZsVGdwUFRVK2RUMGxROGxZM1dkUlpBVm9KWE45Z0QyRndZUk5tQldtNmNFOTFjSFg3ZWExOTczM0RnQTZFWTRnQ2kxV1FlcEE3VTVWT3BVN2ZWN0tBd1pEdmVBQk84VmlpYmppUU1ub29nNHVDTDV4QlVYQlR2VlRoVk9CVysxa1ZYL0tZNjIza2dDMkZZcFp3bHFDVys1Y0xWUE5UaDF2UGNMMS93by9vbG05VFhKMjZlaEZPazNqOGdTWnVHRllFVlIxckdvVTduT1ZacVZObWJkeDBqNVZDVnBGT1M1RHlsaytEREpuaFU3WlZNRnR4WHlCbTgyWUVhRGhzODJ3cGJWdDB5SFpPZWpTWThZSmJpR0NLN1pLeWJhdDF5bmJGbWFaZ0FZdUtqYktWam1tdFU0WlJFbGN3V0VSWnRGdjJYaWhncVdQMFk3OXNGRytPY0JSeFdYSFZjVDl6QVg1Mmd0R0NsNFZna0Z1U0c1MXBXTHhsV213bGRmbFJMbGxsV1lCZjNGKzhZdnBsS21vbmE3UnJpM1BCZjFhSkxKME9uY1Nlb1Z5V2JIdURCRkZMWExaaHhvRjJhR0Z5V1U3NlQzaFRhV0FwYms5Njg1Y0xUaFpUN2s1VlR6MVBvVTl6VDZCUzcxTUpWZzlad1ZxMlcrRmIwWG1IWnB4bnRtZE1hN05zYTNEQ2M0MTV2bms4ZW9kN3NZTGJnZ1NEZDRQdmc5T0Rab2V5aWlsV3FJem1qMDZRSHBlS2hzUlA2RndSWWxseU8zWGxnYjJDL29iQWpNV1dFNW5WbWN0T0drL2ppZDVXU2xqS1dQdGU2MThxWUpSZ1ltRFFZUkppMEdJNVpVR2JabWF3YUhkdGNIQk1kWVoyZFgybGd2bUhpNVdPbHAyTThWRytVaFpaczFTeld4WmRhR0dDYWE5dGpYakxoRmVJY29xbms3aWFiRzJvbWRtR28xZi9aODZHRHBLRFVvZFdCRlRUWHVGaXVXUThhRGhvdTJ0eWM3cDRhM3FhaWRLSmE0MERqKzJRbzVXVWxtbVhabHV6WEgxcFRaaE9tSnRqSUhzcmFuOXF0bWdObkY5dmNsS2RWWEJnN0dJN2JRZHUwVzViaEJDSlJJOFVUam1jOWxNYmFUcHFoSmNxYUZ4UnczcXloTnlSakpOYlZpaWRJbWdGZ3pHRXBYd0lVc1dDNW5SK1RvTlBvRkhTV3dwUzJGTG5VdnRkbWxVcVdPWlpqRnVZVzl0YmNsNTVYcU5nSDJGalliNWgyMk5pWmRGblUyajZhRDVyVTJ0WGJDSnZsMjlGYjdCMEdIWGpkZ3QzLzNxaGV5Rjg2WDAyZi9CL25ZQm1ncDZEczRuTWlxdU1oSkJSbEpPVmtaV2lsV1dXMDVjb21SaUNPRTRyVkxoY3pGMnBjMHgyUEhlcFhPdC9DNDNCbGhHWVZKaFltQUZQRGs5eFU1eFZhRmI2VjBkWkNWdkVXNUJjREY1K1hzeGY3bU02WjlkbDRtVWZaOHRveEdoZmFqQmV4V3NYYkgxc2YzVkllV05iQUhvQWZiMWZqNGtZaXJTTWQ0M01qaDJQNHBnT21qeWJnRTU5VUFCUmsxbWNXeTlpZ0dMc1pEcHJvSEtSZFVkNXFYLzdoN3lLY0l1c1k4cURvSmNKVkFOVXExVlVhRmhxY0lvbmVIVm56WjUwVTZKYkdvRlFoZ2FRR0U1RlRzZE9FVS9LVXpoVXJsc1RYeVZnVVdVOVowSnNjbXpqYkhod0EzUjJlcTU2Q0hzYWZmNThabjNuWlZ0eXUxTkZYT2hkMG1MZ1lobGpJRzVhaGpHSzNZMzRrZ0Z2cG5sYW02aE9xMDZzVHB0UG9FL1JVRWRSOW5weFVmWlJWRk1oVTM5VDYxT3NWWU5ZNFZ3M1gwcGZMMkJRWUcxZ0gyTlpaVXRxd1d6Q2N1MXk3M2Y0Z0FXQkNJSk9oZmVRNFpQL2wxZVpXcHJ3VHQxUkxWeUJabTFwUUZ6eVpuVnBpWE5RYUlGOHhWRGtVa2RYL2wwbWs2UmxJMnM5YXpSMGdYbTllVXQ3eW4yNWdzeURmNGhmaVRtTDBZL1JrUjlVZ0pKZFRqWlE1Vk02VTlkeWxuUHBkK2FDcjQ3R21jaVowcGwzVVJwaFhvYXdWWHA2ZGxEVFcwZVFoWll5VHR0cTU1RlJYRWhjbUdPZmVwTnNkSmRoajZwNmluR0lsb0o4RjJod2ZsRm9iSlB5VWh0VXE0VVRpcVIvelk3aGtHWlRpSWhCZWNKUHZsQVJVa1JSVTFVdFYrcHppMWRSV1dKZmhGOTFZSFpoWjJHcFliSmpPbVJzWlc5bVFtZ1RibVoxUFhyN2ZFeDltWDFMZm10L0RvTktnODJHQ0lwamltYUwvWTRhbUkrZHVJTE9qK2liaDFJZllvTmt3RytabGtGb2tWQWdhM3BzVkc5MGVsQjlRSWdqaWdobjlrNDVVQ1pRWlZCOFVUaFNZMUtuVlE5WEJWak1XdnBlc21INFlmTmljbU1jYVNscWZYS3NjaTV6RkhodmVIbDlESGVwZ0l1SkdZdmlqTktPWTVCMWszcVdWWmdUbW5pZVExR2ZVN05UZTE0bVh4dHVrRzZFYy81elEzMDNnZ0NLK29wUWxrNU9DMURrVTN4VStsYlJXV1JiOFYyclhpZGZPR0pGWmE5blZtN1Fjc3A4dElpaGdPR0E4SU5PaG9lSzZJMDNrc2VXWjVnVG41Uk9razROVDBoVFNWUStWQzlhakYraFg1OWdwMmlPYWxwMGdYaWVpcVNLZDR1UWtWNU95WnVrVG54UHIwOFpVQlpRU1ZGc1VaOVN1VkwrVXBwVDQxTVJWQTVVaVZWUlY2SlhmVmxVVzExYmoxdmxYZWRkOTExNFhvTmVtbDYzWGhoZlVtQk1ZWmRpMkdLbll6dGxBbVpEWnZSbWJXY2hhSmRveTJsZmJDcHRhVzB2YnAxdU1uV0hkbXg0UDNyZ2ZBVjlHSDFlZmJGOUZZQURnSytBc1lCVWdZK0JLb0pTZzB5SVlZZ2JpNktNL0l6S2tIV1JjWkkvZVB5U3BKVk5sZ1dZbVpuWW1qdWRXMUtyVXZkVENGVFZXUGRpNEc5cWpGK1B1WjVMVVR0U1NsVDlWa0I2ZDVGZ25kS2VSSE1KYjNDQkVYWDlYOXBncUpyYmNyeVBaR3NEbU1wTzhGWmtWNzVZV2xwb1lNZGhEMllHWmpsb3NXajNiZFYxT24xdWdrS2JtMDVRVDhsVEJsVnZYZVpkN2wzN1o1bHNjM1FDZUZDS2xwUGZpRkJYcDE0clk3VlFyRkNOVVFCbnlWUmVXTHRac0Z0cFgwMWlvV005YUhOckNHNTljTWVSZ0hJVmVDWjRiWG1PWlRCOTNJUEJpQW1QbTVaa1VpaFhVR2RxZjZHTXRGRkNWeXFXT2xpS2FiU0FzbFFPWGZ4WGxYajZuVnhQU2xLTFZENWtLR1lVWi9WbmhIcFdleUo5TDVOY2FLMmJPWHNaVTRwUk4xTGZXL1ppcm1UbVpDMW51bXVwaGRHV2tIYldtMHhqQnBPcm03OTJVbVlKVHBoUXdsTnhYT2hna21SalpWOW81bkhLY3lOMWwzdUNmcFdHZzR2YmpIaVJFSm1zWmF0bWkydlZUdFJPT2s5L1R6cFMrRlB5VStOVjIxYnJXTXRaeVZuL1dWQmJUVndDWGl0ZTExOGRZQWRqTDJWY1c2OWx2V1hvWloxblltdDdhdzlzUlhOSmVjRjUrSHdaZlN0OW9vQUNnZk9CbG9sZWltbUtab3FNaXU2S3g0emNqTXlXL0podmE0dE9QRStOVDFCUlYxdjZXMGhoQVdOQ1ppRnJ5MjY3YkQ1eXZYVFVkY0Y0T25rTWdET0E2b0dVaEo2UFVHeC9uZzlmV0lzcm5mcDYrSTZOVyt1V0EwN3hVL2RYTVZuSldxUmJpV0IvYmdadnZuWHFqSjliQUlYZ2UzSlE5R2VkZ21GY1NvVWVmZzZDbVZFRVhHaGpabzJjWlc1eFBua1hmUVdBSFl2S2ptNlF4NGFxa0I5UStsSTZYRk5uZkhBMWNreVJ5SkVyaytXQ3dsc3hYL2xnTzA3V1U0aGJTMkl4WjRwcjZYTGdjeTU2YTRHampWS1JscGtTVWRkVGFsVC9XNGhqT1dxc2ZRQ1gybGJPVTJoVWwxc3hYTjVkN2s4QllmNWlNbTNBZWN0NVFuMU5mdEovN1lFZmdwQ0VSb2h5aVpDTGRJNHZqekdRUzVGc2tjYVduSkhBVGs5UFJWRkJVNU5mRG1MVVowRnNDMjVqY3laK3paR0RrdFJUR1ZtL1c5RnRYWGt1ZnB0OGZsaWZjZnBSVTRqd2o4cFArMXdsWnF4MzQzb2NnditaeGxHcVgreGxiMm1KYS9OdGxtNWtiLzUyRkgzaFhYV1FoNUVHbU9aUkhWSkFZcEZtMldZYWJyWmUwbjF5Zi9obXI0WDNoZmlLcVZMWlUzTlpqMTZRWDFWZzVKSmtscmRRSDFIZFVpQlRSMVBzVStoVVJsVXhWUmRXYUZtK1dUeGF0VnNHWEE5Y0VWd2FYSVJlaWw3Z1huQmZmMktFWXR0aWpHTjNZd2RtREdZdFpuWm1mbWVpYUI5cU5XcThiSWh0Q1c1WWJqeHhKbkZuY2NkMUFYZGRlQUY1Wlhud2VlQjZFWHVuZkRsOWxvRFdnNHVFU1lWZGlQT0lING84aWxTS2M0cGhqTjZNcEpGbWtuNlRHSlNjbHBpWENrNElUaDVPVjA2WFVYQlN6bGMwV014WUlsczRYc1ZnL21SaFoxWm5SRzIyY25OMVkzcTRoSEtMdUpFZ2t6Rlc5RmYrbU8xaURXbVdhKzF4Vkg1M2dIS0M1b25mbUZXSHNZODdYRGhQNFUrMVR3ZFZJRnJkVytsYncxOU9ZUzlqc0dWTFp1NW9tMmw0YmZGdE0zVzVkUjkzWG5ubWVUTjk0NEd2Z3FxRnFvazZpcXVPbTQ4eWtOMlJCNWU2VHNGT0ExSjFXT3hZQzF3YWRUMWNUb0VLaXNXUFk1WnRseVY3ejRvSW1HS1I4MWFvVXhlUU9WU0NWeVZlcUdNMGJJcHdZWGVMZk9CL2NJaENrRlNSRUpNWWs0K1dYblRFbWdkZGFWMXdaYUpucUkzYmxtNWpTV2NaYWNXREY1akFsdjZJaEc5NlpQaGJGazRzY0YxMUwyYkVVVFpTNGxMVFdZRmZKMkFRWWo5bGRHVWZablJtOG1nV2FHTnJCVzV5Y2g5MTIzYStmRmFBOEZqOWlIK0pvSXFUaXN1S0haQ1NrVktYV1plSlpRNTZCb0c3bGkxZTNHQWFZcVZsRkdhUVovTjNUWHBOZkQ1K0NvR3NqR1NONFkxZmpxbDRCMUxaWXFWalFtU1lZaTJLZzNyQWU2eUs2cFoyZlF5Q1NZZlpUa2hSUTFOZ1U2TmJBbHdXWE4xZEptSkhZckJrRTJnMGFNbHNSVzBYYmROblhHOU9jWDF4eTJWL2VxMTcybjFLZnFoL2VvRWJnam1DcG9WdWlzNk05WTE0a0hlUXJaS1Jrb09WcnB0TlVvUlZPRzgyY1doUmhYbFZmck9Cem54TVZsRllxRnlxWS81bS9XWmFhZGx5ajNXT2RRNTVWbm5mZVpkOElIMUVmUWVHTklvN2xtR1FJSi9uVUhWU3pGUGlVd2xRcWxYdVdFOVpQWEtMVzJSY0hWUGpZUE5nWEdPRFl6OWp1MlBOWk9sbCtXYmpYYzFwL1drVmIrVnhpVTdwZGZoMmszcmZmTTk5bkgxaGdFbURXSU5zaEx5RSs0WEZpSENOQVpCdGtKZVRISmNTbXM5UWwxaU9ZZE9CTllVSWpTQ1F3MDkwVUVkU2MxTnZZRWxqWDJjc2JyT05INURYVDE1Y3lvelBaWnA5VWxPV2lIWlJ3Mk5ZVzJ0YkNsd05aRkZuWEpEV1RocFpLbGx3YkZHS1BsVVZXS1ZaOEdCVFlzRm5OWUpWYVVDV3hKa29tbE5QQmxqK1d4Q0FzVnd2WG9WZklHQkxZVFJpLzJid2JONXV6b0IvZ2RTQ2k0aTRqQUNRTHBDS2x0dWUyNXZqVHZCVEoxa3NlNDJSVEpqNW5kMXVKM0JUVTBSVmhWdFlZcDVpMDJLaWJPOXZJblFYaWppVXdXLytpamlENTFINGh1cFQ2Vk5HVDFTUXNJOXFXVEdCL1YzcWVyK1AybWczalBoeVNKdzlhckNLT1U1WVV3WldabGZGWXFKajVtVk9hK0Z0VzI2dGNPMTM3M3FxZTd0OVBZREdnTXVHbFlwYmsrTld4MWcrWDYxbGxtYUFhclZyTjNYSGlpUlE1WGN3Vnh0ZlpXQjZabUJzOUhVYWVtNS85SUVZaDBXUXM1bkplMXgxK1hwUmU4U0VFSkRwZVpKNk5vUGhXa0IzTFU3eVRwbGI0Ris5WWp4bThXZm9iR3VHZDRnN2lrNlI4NUxRbVJkcUpuQXFjK2VDVjRTdmpBRk9SbEhMVVl0VjlWc1dYak5lZ1Y0VVh6VmZhMSswWC9KaEVXT2laaDFuYm05U2NqcDFPbmQwZ0RtQmVJRjJoNytLM0lxRmpmT05tcEozbFFLWTVaekZVbGRqOUhZVlo0aHN6WFBEaks2VGM1WWxiWnhZRG1uTWFmMlBtcFBiZFJxUVdsZ0NhTFJqKzJsRFR5eHYyR2U3anlhRnRIMVVrejlwY0c5cVYvZFlMRnNzZlNweUNsVGprYlNkclU1T1QxeFFkVkJEVXA2TVNGUWtXSnBiSFY2VlhxMWU5MTRmWDR4Z3RXSTZZOUJqcjJoQWJJZDRqbmtMZXVCOVI0SUNpdWFLUkk0VGtMaVFMWkhZa1E2ZjVXeFlaT0prZFdYMGJvUjJHM3Rwa05HVHVtN3lWTGxmcEdSTmorMlBSSko0VVd0WUtWbFZYSmRlKzIyUGZoeDF2SXppamx1WXVYQWRUNzlyc1c4d2RmdVdUbEVRVkRWWVYxaXNXV0Jja2wrWFpWeG5JVzU3ZHQrRDdZd1VrUDJRVFpNbGVEcDRxbEttWGg5WGRGa1NZQkpRV2xHc1VjMVJBRklRVlZSWVdGaFhXWlZiOWx5TFhieGdsV0l0WkhGblEyaThhTjlvMTNiWWJXOXVtMjF2Y01oeFUxL1lkWGQ1U1h0VWUxSjcxbnh4ZlRCU1k0UnBoZVNGRG9vRWkwYU1ENDREa0ErUUdaUjJsaTJZTUpyWWxjMVExVklNVkFKWURseW5ZWjVrSG0yemQrVjY5SUFFaEZPUWhaTGdYQWVkUDFPWFg3TmZuRzE1Y21OM3YzbmtlOUpyN0hLdGlnTm9ZV3I0VVlGNk5HbEtYUGFjNjRMRlcwbVJIbkI0Vm05Y3gyQm1aWXhzV294QmtCT1lVVlRIWmcyU1NGbWprSVZSVFU3cVVabUZEb3RZY0hwalM1TmlhYlNaQkg1M2RWZFRZR25manVPV1hXeU1UanhjRUYvcGp3SlQwWXlKZ0htRy8xN2xaWE5PWlZHQ1dUOWM3cGY3VG9wWnpWK05pdUZ2c0hsaWVlZGJjWVFyYzdGeGRGNzFYM3RqbW1URGNaaDhRMDc4WGt0TzNGZWlWcWxndzI4TmZmMkFNNEcvZ2JLUGw0bWtodlJkaW1LdFpJZUpkMmZpYkQ1dE5uUTBlRVphZFgrdGdxeVo4MC9EWHQxaWttTlhaVzludzNaTWNzeUF1b0FwajAyUkRWRDVWNUphaFdoemFXUngvWEszalBKWTRJeHFsaG1RZjRma2VlZDNLWVF2VDJWU1dsUE5ZczlueW14OWRwUjdsWHcyZ29TRjY0L2RaaUJ2Qm5JYmZxdUR3Wm1tbnYxUnNYdHllTGg3aDRCSWUraHFZVjZNZ0ZGMVlIVnJVV0tTakc1NmRwZVI2cG9RVDNCL25HSlBlNldWNlp4NlZsbFk1SWE4bGpSUEpGSktVODFUMjFNR1hpeGtrV1YvWno1c1RteEljcTl5N1hOVWRVRitMSUxwaGFtTXhIdkdrV2x4RXBqdm1EMWphV1pxZGVSMjBIaERoZTZHS2xOUlV5WlVnMW1IWG54ZnNtQkpZbmxpcTJLUVpkUnJ6R3l5ZGE1MmtYalllY3Q5ZDMrbGdLdUl1WXE3akgrUVhwZmJtQXRxT0h5WlVENWNybCtIWjlock5YUUpkNDUvTzUvS1p4ZDZPVk9MZGUyYVpsK2RnZkdEbUlBOFg4VmZZblZHZXp5UVoyanJXWnRhRUgxK2RpeUw5VTlxWHhscU4yd0NiK0owYUhsb2lGV0tlWXpmWHM5anhYWFNlZGVDS0pQeWtweUU3WVl0bk1GVWJGK01aVnh0RlhDbmpOT01PNWhQWmZaMERVN1lUdUJYSzFsbVdzeGJxRkVEWHB4ZUZtQjJZbmRscDJWdVptNXRObkltZTFDQm1vR1pnbHlMb0l6bWpIU05ISlpFbHE1UHEyUm1heDZDWVlScWhlaVFBVnhUYWFpWWVvUlhoUTlQYjFLcFgwVmVEV2VQZVhtQkI0bUdpZlZ0RjE5VllyaHN6MDVwY3BLYkJsSTdWSFJXczFpa1lXNWlHbkZ1V1lsODNud2JmZkNXaDJWZWdCbE9kVTkxVVVCWVkxNXpYZ3BmeEdjbVRqMkZpWlZibG5OOEFaajdVTUZZVm5hbmVDVlNwWGNSaFlaN1QxQUpXVWR5eDN2b2ZicVAxSTlOa0w5UHlWSXBXZ0ZmclpmZFR4ZUM2cElEVjFWamFXc3JkZHlJRkk5Q2V0OVNrMWhWWVFwaXJtYk5hejk4NllNalVQaFBCVk5HVkRGWVNWbWRXL0JjNzF3cFhaWmVzV0puWXo1bHVXVUxaOVZzNFd6NWNESjRLMzdlZ0xPQ0RJVHNoQUtIRW9rcWlrcU1wcERTa3YyWTg1eHNuVTlPb1U2TlVGWlNTbGVvV1QxZTJGL1pYejlpdEdZYlo5Qm4wbWlTVVNGOXFvQ29nUUNMakl5L2pINlNNcFlnVkN5WUYxUFZVRnhUcUZpeVpEUm5aM0ptZDBaNjVwSERVcUZzaG1zQVdFeGVWRmtzWi90LzRWSEdkbWxrNkhoVW03dWV5MWU1V1NkbW1tZk9hK2xVMldsVlhweUJsV2VxbS81blVweGRhS1pPNDAvSVU3bGlLMmVyYk1TUHJVOXRmcitlQjA1aVlZQnVLMjhUaFhOVUttZEZtL05kbFh1c1hNWmJISWRLYnRHRUZIb0lnWmxaalh3UmJDQjMyVklpV1NGeFgzTGJkeWVYWVowTGFYOWFHRnFsVVExVWZWUU9adDkyOTQrWWt2U2M2bGxkY3NWdVRWSEphTDk5N0gxaWw3cWVlR1FoYWdLRGhGbGZXOXRyRzNQeWRySjlGNENaaERKUktHZlpudTUyWW1mL1VnV1pKRnc3WW41OHNJeFBWYlpnQzMyQWxRRlRYMDYyVVJ4Wk9uSTJnTTZSSlYvaWQ0UlRlVjhFZmF5Rk00cU5qbGFYODJldWhWT1VDV0VJWWJsc1VuYnRpamlQTDFWUlR5cFJ4MUxMVTZWYmZWNmdZSUpoMW1NSlo5cG5aMjZNYlRaek4zTXhkVkI1MVlpWWlrcVFrWkQxa01TV2pZY1ZXWWhPV1U4T1RvbUtQNDhRbUsxUWZGNldXYmxidUY3YVkvcGp3V1RjWmtwcDJHa0xiYlp1bEhFb2RhOTZpbjhBZ0VtRXlZU0JpU0dMQ281bGtIMldDcGwrWVpGaU1tdURiSFJ0ekgvOGY4QnRoWCs2aC9pSVpXZXhnenlZOTVZYmJXRjlQWVJxa1hGT2RWTlFYUVJyNjIvTmhTMkdwNGtwVWc5VVpWeE9aNmhvQm5TRGRPSjF6NGpoaU15UjRwWjRsb3RmaDNQTGVrNkVvR05sZFlsU1FXMmNiZ2wwV1hWcmVKSjhocGJjZW8yZnRrOXVZY1ZsWElhR1RxNU8ybEFoVHN4UjdsdVpaWUZvdkcwZmMwSjJyWGNjZXVkOGI0TFNpbnlRejVGMWxoaVltMUxSZlN0UW1GT1haOHR0MEhFemRPaUJLbytqbGxlY241NWdkRUZZbVcwdmZWNlk1RTQyVDR0UHQxR3hVcnBkSEdDeWN6eDUwNEkwa3JlVzlwWUtsNWVlWXArbVpuUnJGMUtqVXNod3dvakpYa3Rna0dFamIwbHhQbnowZlcrQTdvUWprQ3lUUWxSdm05TnFpWERDak8rTk1wZTBVa0ZheWw0RVh4ZG5mR21VYVdwdEQyOWljdnh5N1hzQmdINkFTNGZPa0cxUms1NkVlWXVBTXBQV2lpMVFqRlJ4aW1wcnhJd0hnZEZnb0dmeW5abE9tRTRRbkd1S3dZVm9oUUJwZm02WGVGV0JERjhRVGhWT0trNHhUalpPUEU0L1RrSk9WazVZVG9KT2hVNXJqSXBPRW9JTlg0NU9uazZmVHFCT29rNndUck5PdGs3T1RzMU94RTdHVHNKTzEwN2VUdTFPMzA3M1RnbFBXazh3VDF0UFhVOVhUMGRQZGsrSVQ0OVBtRTk3VDJsUGNFK1JUMjlQaGsrV1R4aFIxRS9mVDg1UDJFL2JUOUZQMmsvUVQrUlA1VThhVUNoUUZGQXFVQ1ZRQlZBY1QvWlBJVkFwVUN4US9rL3ZUeEZRQmxCRFVFZFFBMmRWVUZCUVNGQmFVRlpRYkZCNFVJQlFtbENGVUxSUXNsREpVTXBRczFEQ1VOWlEzbERsVU8xUTQxRHVVUGxROVZBSlVRRlJBbEVXVVJWUkZGRWFVU0ZST2xFM1VUeFJPMUUvVVVCUlVsRk1VVlJSWWxINGVtbFJhbEZ1VVlCUmdsSFlWb3hSaVZHUFVaRlJrMUdWVVpaUnBGR21VYUpScVZHcVVhdFJzMUd4VWJKUnNGRzFVYjFSeFZISlVkdFI0RkZWaHVsUjdWSHdVZlZSL2xFRVVndFNGRklPVWlkU0tsSXVVak5TT1ZKUFVrUlNTMUpNVWw1U1ZGSnFVblJTYVZKelVuOVNmVktOVXBSU2tsSnhVb2hTa1ZLb2o2ZVByRkt0VXJ4U3RWTEJVczFTMTFMZVV1TlM1bEx0bU9CUzgxTDFVdmhTK1ZJR1V3aFRPSFVOVXhCVEQxTVZVeHBUSTFNdlV6RlRNMU00VTBCVFJsTkZVeGRPU1ZOTlU5WlJYbE5wVTI1VEdGbDdVM2RUZ2xPV1U2QlRwbE9sVTY1VHNGTzJVOE5URW56Wmx0OVQvR2J1Y2U1VDZGUHRVL3BUQVZROVZFQlVMRlF0VkR4VUxsUTJWQ2xVSFZST1ZJOVVkVlNPVkY5VWNWUjNWSEJVa2xSN1ZJQlVkbFNFVkpCVWhsVEhWS0pVdUZTbFZLeFV4RlRJVktoVXExVENWS1JVdmxTOFZOaFU1VlRtVkE5VkZGWDlWTzVVN1ZUNlZPSlVPVlZBVldOVlRGVXVWVnhWUlZWV1ZWZFZPRlV6VlYxVm1WV0FWYTlVaWxXZlZYdFZmbFdZVlo1VnJsVjhWWU5WcVZXSFZhaFYybFhGVmQ5VnhGWGNWZVJWMUZVVVZ2ZFZGbGIrVmYxVkcxYjVWVTVXVUZiZmNUUldObFl5VmpoV2ExWmtWaTlXYkZacVZvWldnRmFLVnFCV2xGYVBWcVZXcmxhMlZyUld3bGE4VnNGV3cxYkFWc2hXemxiUlZ0TlcxMWJ1VnZsV0FGZi9WZ1JYQ1ZjSVZ3dFhEVmNUVnhoWEZsZkhWUnhYSmxjM1Z6aFhUbGM3VjBCWFQxZHBWOEJYaUZkaFYzOVhpVmVUVjZCWHMxZWtWNnBYc0ZmRFY4WlgxRmZTVjlOWENsaldWK05YQzFnWldCMVljbGdoV0dKWVMxaHdXTUJyVWxnOVdIbFloVmk1V0o5WXExaTZXTjVZdTFpNFdLNVl4VmpUV05GWTExalpXTmhZNVZqY1dPUlkzMWp2V1BwWStWajdXUHhZL1ZnQ1dRcFpFRmtiV2Fab0pWa3NXUzFaTWxrNFdUNVowbnBWV1ZCWlRsbGFXVmhaWWxsZ1dXZFpiRmxwV1hoWmdWbWRXVjVQcTAraldiSlp4bG5vV2R4WmpWblpXZHBaSlZvZldoRmFIRm9KV2hwYVFGcHNXa2xhTlZvMldtSmFhbHFhV3J4YXZsckxXc0phdlZyald0ZGE1bHJwV3RaYStscjdXZ3hiQzFzV1d6SmIwRm9xV3paYlBsdERXMFZiUUZ0UlcxVmJXbHRiVzJWYmFWdHdXM05iZFZ0NFc0aGxlbHVBVzROYnBsdTRXOE5ieDF2Slc5UmIwRnZrVytaYjRsdmVXK1ZiNjF2d1cvWmI4MXNGWEFkY0NGd05YQk5jSUZ3aVhDaGNPRnc1WEVGY1JseE9YRk5jVUZ4UFhIRmJiRnh1WEdKT2RseDVYSXhja1Z5VVhKdFpxMXk3WExaY3ZGeTNYTVZjdmx6SFhObGM2Vno5WFBwYzdWeU1YZXBjQzEwVlhSZGRYRjBmWFJ0ZEVWMFVYU0pkR2wwWlhSaGRURjFTWFU1ZFMxMXNYWE5kZGwySFhZUmRnbDJpWFoxZHJGMnVYYjFka0YyM1hieGR5VjNOWGROZDBsM1dYZHRkNjEzeVhmVmRDMTRhWGhsZUVWNGJYalplTjE1RVhrTmVRRjVPWGxkZVZGNWZYbUplWkY1SFhuVmVkbDU2WHJ5ZWYxNmdYc0Zld2w3SVh0QmV6MTdXWHVOZTNWN2FYdHRlNGw3aFh1aGU2VjdzWHZGZTgxN3dYdlJlK0Y3K1hnTmZDVjlkWDF4ZkMxOFJYeFpmS1Y4dFh6aGZRVjlJWDB4ZlRsOHZYMUZmVmw5WFgxbGZZVjl0WDNOZmQxK0RYNEpmZjErS1g0aGZrVitIWDU1Zm1WK1lYNkJmcUYrdFg3eGYxbC83WCtSZitGL3hYOTFmczJEL1h5RmdZR0FaWUJCZ0tXQU9ZREZnRzJBVllDdGdKbUFQWURwZ1dtQkJZR3BnZDJCZllFcGdSbUJOWUdOZ1EyQmtZRUpnYkdCcllGbGdnV0NOWU9kZ2cyQ2FZSVJnbTJDV1lKZGdrbUNuWUl0ZzRXQzRZT0JnMDJDMFlQQmZ2V0RHWUxWZzJHQk5ZUlZoQm1IMllQZGdBR0gwWVBwZ0EyRWhZZnRnOFdBTllRNWhSMkUrWVNoaEoyRktZVDloUEdFc1lUUmhQV0ZDWVVSaGMyRjNZVmhoV1dGYVlXdGhkR0Z2WVdWaGNXRmZZVjFoVTJGMVlabGhsbUdIWWF4aGxHR2FZWXBoa1dHcllhNWh6R0hLWWNsaDkySElZY05oeG1HNlljdGhlWC9OWWVaaDQySDJZZnBoOUdIL1lmMWgvR0grWVFCaUNHSUpZZzFpREdJVVlodGlIbUloWWlwaUxtSXdZakppTTJKQllrNWlYbUpqWWx0aVlHSm9ZbnhpZ21LSlluNWlrbUtUWXBaaTFHS0RZcFJpMTJMUllydGl6MkwvWXNaaTFHVElZdHhpekdMS1lzSml4MktiWXNsaURHUHVZdkZpSjJNQ1l3aGo3MkwxWWxCalBtTk5ZeHhrVDJPV1k0NWpnR09yWTNaam8yT1BZNGxqbjJPMVkydGphV08rWStsandHUEdZK05qeVdQU1kvWmp4R01XWkRSa0JtUVRaQ1prTm1RZFpSZGtLR1FQWkdka2IyUjJaRTVrS21XVlpKTmtwV1NwWkloa3ZHVGFaTkpreFdUSFpMdGsyR1RDWlBGazUyUUpndUJrNFdTc1l1Tms3MlFzWmZaazlHVHlaUHBrQUdYOVpCaGxIR1VGWlNSbEkyVXJaVFJsTldVM1pUWmxPR1ZMZFVobFZtVlZaVTFsV0dWZVpWMWxjbVY0WllKbGcyV0tpNXRsbjJXclpiZGx3MlhHWmNGbHhHWE1aZEpsMjJYWlplQmw0V1h4WlhKbkNtWURadnRsYzJjMVpqWm1OR1ljWms5bVJHWkpaa0ZtWG1aZFptUm1aMlpvWmw5bVltWndab05taUdhT1pvbG1oR2FZWnAxbXdXYTVac2xtdm1hOFpzUm11R2JXWnRwbTRHWS9adVptNldid1p2Vm05MllQWnhabkhtY21aeWRuT0pjdVp6OW5ObWRCWnpobk4yZEdaMTVuWUdkWloyTm5aR2VKWjNCbnFXZDhaMnBuakdlTFo2Wm5vV2VGWjdkbjcyZTBaK3huczJmcFo3aG41R2ZlWjkxbjRtZnVaN2xuem1mR1orZG5uR29lYUVab0tXaEFhRTFvTW1oT2FMTm9LMmhaYUdOb2QyaC9hSjlvajJpdGFKUm9uV2liYUlOb3JtcTVhSFJvdFdpZ2FMcG9EMm1OYUg1b0FXbkthQWhwMkdnaWFTWnA0V2dNYWMxbzFHam5hTlZvTm1rU2FRUnAxMmpqYUNWcCtXamdhTzlvS0drcWFScHBJMmtoYWNab2VXbDNhVnhwZUdscmFWUnBmbWx1YVRscGRHazlhVmxwTUdsaGFWNXBYV21CYVdwcHNtbXVhZEJwdjJuQmFkTnB2bW5PYWVoYnltbmRhYnRwdzJtbmFTNXFrV21nYVp4cGxXbTBhZDVwNkdrQ2FodHEvMmtLYS9scDhtbm5hUVZxc1drZWF1MXBGR3JyYVFwcUVtckJhaU5xRTJwRWFneHFjbW8yYW5ocVIycGlhbGxxWm1wSWFqaHFJbXFRYW8xcW9HcUVhcUpxbzJxWGFoZUd1MnJEYXNKcXVHcXphcXhxM21yUmF0OXFxbXJhYXVwcSsyb0ZheGFHK21vU2F4WnJNWnNmYXpock4ydmNkamxyN3BoSGEwTnJTV3RRYTFsclZHdGJhMTlyWVd0NGEzbHJmMnVBYTRScmcydU5hNWhybFd1ZWE2UnJxbXVyYTY5cnNtdXhhN05ydDJ1OGE4WnJ5MnZUYTk5cjdHdnJhL05yNzJ1K25naHNFMndVYkJ0c0pHd2piRjVzVld4aWJHcHNnbXlOYkpwc2dXeWJiSDVzYUd4emJKSnNrR3pFYlBGczAyeTliTmRzeFd6ZGJLNXNzV3krYkxwczIyenZiTmxzNm13ZmJVMklObTByYlQxdE9HMFpiVFZ0TTIwU2JReHRZMjJUYldSdFdtMTViVmx0am0yVmJlUnZoVzM1YlJWdUNtNjFiY2R0NW0yNGJjWnQ3RzNlYmN4dDZHM1NiY1Z0K20zWmJlUnQxVzNxYmU1dExXNXViaTV1R1c1eWJsOXVQbTRqYm10dUsyNTJiazF1SDI1RGJqcHVUbTRrYnY5dUhXNDRib0p1cW02WWJzbHV0MjdUYnIxdXIyN0Vickp1MUc3VmJvOXVwVzdDYnA5dVFXOFJiMHh3N0c3NGJ2NXVQMi95YmpGdjcyNHliOHh1UG04VGIvZHVobTk2YjNodmdXK0FiMjl2VzIvemIyMXZnbTk4YjFodmptK1JiOEp2Wm0remI2TnZvVytrYjdsdnhtK3FiOTl2MVcvc2I5UnYyRy94Yis1djIyOEpjQXR3K204UmNBRndEM0QrYnh0d0duQjBieDF3R0hBZmNEQndQbkF5Y0ZGd1kzQ1pjSkp3cjNEeGNLeHd1SEN6Y0s1dzMzRExjTjF3MlhBSmNmMXdISEVaY1dWeFZYR0ljV1p4WW5GTWNWWnhiSEdQY2Z0eGhIR1ZjYWh4ckhIWGNibHh2bkhTY2NseDFISE9jZUJ4N0hIbmNmVngvSEg1Y2Y5eERYSVFjaHR5S0hJdGNpeHlNSEl5Y2p0eVBISS9ja0J5Um5KTGNsaHlkSEorY29KeWdYS0hjcEp5bG5LaWNxZHl1WEt5Y3NOeXhuTEVjczV5MG5MaWN1Qnk0WEw1Y3ZkeUQxQVhjd3B6SEhNV2N4MXpOSE12Y3lsekpYTStjMDV6VDNQWW5sZHphbk5vYzNCemVITjFjM3R6ZW5QSWM3Tnp6bk83YzhCejVYUHVjOTV6b25RRmRHOTBKWFQ0Y3pKME9uUlZkRDkwWDNSWmRFRjBYSFJwZEhCMFkzUnFkSFowZm5TTGRKNTBwM1RLZE05MDFIVHhjK0IwNDNUbmRPbDA3blR5ZFBCMDhYVDRkUGQwQkhVRGRRVjFESFVPZFExMUZYVVRkUjUxSm5Vc2RUeDFSSFZOZFVwMVNYVmJkVVoxV25WcGRXUjFaM1ZyZFcxMWVIVjJkWVoxaDNWMGRZcDFpWFdDZFpSMW1uV2RkYVYxbzNYQ2RiTjF3M1cxZGIxMXVIVzhkYkYxelhYS2RkSjEyWFhqZGQ1MS9uWC9kZngxQVhid2RmcDE4blh6ZFF0MkRYWUpkaDkySjNZZ2RpRjJJbllrZGpSMk1IWTdka2QyU0haR2RseDJXSFpoZG1KMmFIWnBkbXAyWjNac2RuQjJjbloyZG5oMmZIYUFkb04yaUhhTGRvNTJsbmFUZHBsMm1uYXdkclIydUhhNWRycDJ3bmJOZHRaMjBuYmVkdUYyNVhibmR1cDJMNGI3ZGdoM0IzY0VkeWwzSkhjZWR5VjNKbmNiZHpkM09IZEhkMXAzYUhkcmQxdDNaWGQvZDM1M2VYZU9kNHQza1hlZ2Q1NTNzSGUyZDdsM3YzZThkNzEzdTNmSGQ4MTMxM2ZhZDl4MzQzZnVkL3gzREhnU2VDWjVJSGdxZVVWNGpuaDBlSVo0ZkhpYWVJeDRvM2kxZUtwNHIzalJlTVo0eTNqVWVMNTR2SGpGZU1wNDdIam5lTnA0L1hqMGVBZDVFbmtSZVJsNUxIa3JlVUI1WUhsWGVWOTVXbmxWZVZONWVubC9lWXA1blhtbmVVdWZxbm11ZWJONXVYbTZlY2w1MVhubmVleDU0WG5qZVFoNkRYb1llaGw2SUhvZmVvQjVNWG83ZWo1Nk4zcERlbGQ2U1hwaGVtSjZhWHFkbjNCNmVYcDllb2g2bDNxVmVwaDZsbnFwZXNoNnNIcTJlc1Y2eEhxL2VvT1F4M3JLZXMxNnozclZldE42MlhyYWV0MTY0WHJpZXVaNjdYcndlZ0o3RDNzS2V3WjdNM3NZZXhsN0huczFleWg3Tm50UWUzcDdCSHROZXd0N1RIdEZlM1Y3Wlh0MGUyZDdjSHR4ZTJ4N2JudWRlNWg3bjN1TmU1eDdtbnVMZTVKN2ozdGRlNWw3eTN2QmU4eDd6M3UwZThaNzNYdnBleEY4Rkh6bWUrVjdZSHdBZkFkOEUzenplL2Q3RjN3TmZQWjdJM3duZkNwOEgzdzNmQ3Q4UFh4TWZFTjhWSHhQZkVCOFVIeFlmRjk4Wkh4V2ZHVjhiSHgxZklOOGtIeWtmSzE4b255cmZLRjhxSHl6ZkxKOHNYeXVmTGw4dlh6QWZNVjh3bnpZZk5KODNIemlmRHViNzN6eWZQUjg5bno2ZkFaOUFuMGNmUlY5Q24xRmZVdDlMbjB5ZlQ5OU5YMUdmWE45Vm4xT2ZYSjlhSDF1ZlU5OVkzMlRmWWw5VzMyUGZYMTltMzI2ZmE1OW8zMjFmY2Q5dlgycmZUMStvbjJ2ZmR4OXVIMmZmYkI5MkgzZGZlUjkzbjM3ZmZKOTRYMEZmZ3ArSTM0aGZoSitNWDRmZmdsK0MzNGlma1orWm40N2ZqVitPWDVEZmpkK01uNDZmbWQrWFg1V2ZsNStXWDVhZm5sK2FuNXBmbngrZTM2RGZ0VjlmWDZ1ajM5K2lINkpmb3gra242UWZwTitsSDZXZm81K20zNmNmamgvT245RmYweC9UWDlPZjFCL1VYOVZmMVIvV0g5ZmYyQi9hSDlwZjJkL2VIK0NmNFovZzMrSWY0ZC9qSCtVZjU1L25YK2FmNk4vcjMreWY3bC9ybisyZjdoL2NZdkZmOFoveW4vVmY5Ui80WC9tZitsLzgzLzVmOXlZQm9BRWdBdUFFb0FZZ0JtQUhJQWhnQ2lBUDRBN2dFcUFSb0JTZ0ZpQVdvQmZnR0tBYUlCemdIS0FjSUIyZ0htQWZZQi9nSVNBaG9DRmdKdUFrNENhZ0syQWtGR3NnTnVBNVlEWmdOMkF4SURhZ05hQUNZSHZnUEdBRzRFcGdTT0JMNEZMZ1l1V1JvRStnVk9CVVlIOGdIR0Jib0ZsZ1dhQmRJR0RnWWlCaW9HQWdZS0JvSUdWZ2FTQm80RmZnWk9CcVlHd2diV0J2b0c0Z2IyQndJSENnYnFCeVlITmdkR0IyWUhZZ2NpQjJvSGZnZUNCNTRINmdmdUIvb0VCZ2dLQ0JZSUhnZ3FDRFlJUWdoYUNLWUlyZ2ppQ000SkFnbG1DV0lKZGdscUNYNEprZ21LQ2FJSnFnbXVDTG9KeGduZUNlSUorZ28yQ2tvS3JncCtDdTRLc2d1R0M0NExmZ3RLQzlJTHpndnFDazRNRGcvdUMrWUxlZ2dhRDNJSUpnOW1DTllNMGd4YURNb014ZzBDRE9ZTlFnMFdETDRNcmd4ZURHSU9GZzVxRHFvT2ZnNktEbG9Namc0NkRoNE9LZzN5RHRZTnpnM1dEb0lPSmc2aUQ5SU1UaE91RHpvUDlnd09FMklNTGhNR0Q5NE1IaE9DRDhvTU5oQ0tFSUlTOWd6aUVCb1g3ZzIyRUtvUThoRnFGaElSM2hHdUVyWVJ1aElLRWFZUkdoQ3lFYjRSNWhEV0V5b1JpaExtRXY0U2ZoTm1FellTN2hOcUUwSVRCaE1hRTFvU2hoQ0dGLzRUMGhCZUZHSVVzaFIrRkZZVVVoZnlFUUlWamhWaUZTSVZCaFFLR1M0VlZoWUNGcElXSWhaR0Zpb1dvaFcyRmxJV2JoZXFGaDRXY2hYZUZmb1dRaGNtRnVvWFBoYm1GMElYVmhkMkY1WVhjaGZtRkNvWVRoZ3VHL29YNmhRYUdJb1lhaGpDR1A0Wk5obFZPVklaZmhtZUdjWWFUaHFPR3FZYXFob3VHaklhMmhxK0d4SWJHaHJDR3lZWWppS3VHMUliZWh1bUc3SWJmaHR1Rzc0WVNod2FIQ0ljQWh3T0grNFlSaHdtSERZZjVoZ3FITkljL2h6ZUhPNGNsaHltSEdvZGdoMStIZUlkTWgwNkhkSWRYaDJpSGJvZFpoMU9IWTRkcWh3V0lvb2VmaDRLSHI0ZkxoNzJId0lmUWg5YVdxNGZFaDdPSHg0ZkdoN3VINzRmeWgrQ0hENGdOaVA2SDlvZjNodzZJMG9jUmlCYUlGWWdpaUNHSU1ZZzJpRG1JSjRnN2lFU0lRb2hTaUZtSVhvaGlpR3VJZ1loK2lKNklkWWg5aUxXSWNvaUNpSmVJa29pdWlKbUlvb2lOaUtTSXNJaS9pTEdJdzRqRWlOU0kySWpaaU4ySStZZ0NpZnlJOUlqb2lQS0lCSWtNaVFxSkU0bERpUjZKSllrcWlTdUpRWWxFaVR1Sk5vazRpVXlKSFlsZ2lWNkpab2xraVcySmFvbHZpWFNKZDRsK2lZT0ppSW1LaVpPSm1JbWhpYW1KcG9tc2lhK0pzb202aWIySnY0bkFpZHFKM0luZGllZUo5SW40aVFPS0Zvb1FpZ3lLRzRvZGlpV0tOb3BCaWx1S1VvcEdpa2lLZklwdGlteUtZb3FGaW9LS2hJcW9pcUdLa1lxbGlxYUttb3FqaXNTS3pZckNpdHFLNjRyeml1ZUs1SXJ4aWhTTDRJcmlpdmVLM29yYmlneUxCNHNhaStHS0Zvc1FpeGVMSUlzemk2dVhKb3NyaXo2TEtJdEJpMHlMVDR0T2kwbUxWb3RiaTFxTGE0dGZpMnlMYjR0MGkzMkxnSXVNaTQ2TGtvdVRpNWFMbVl1YWl6cU1RWXcvakVpTVRJeE9qRkNNVll4aWpHeU1lSXg2aklLTWlZeUZqSXFNall5T2pKU01mSXlZakIxaXJZeXFqTDJNc295empLNk10b3pJak1HTTVJempqTnFNL1l6NmpQdU1CSTBGalFxTkI0MFBqUTJORUkxT254T056WXdValJhTlo0MXRqWEdOYzQyQmpabU53bzIramJxTno0M2FqZGFOekkzYmpjdU42bzNyamQrTjQ0MzhqUWlPQ1k3L2pSMk9IbzRRamgrT1FvNDFqakNPTkk1S2prZU9TWTVNamxDT1NJNVpqbVNPWUk0cWptT09WWTUyam5LT2ZJNkJqb2VPaFk2RWpvdU9pbzZUanBHT2xJNlpqcXFPb1k2c2pyQ094bzZ4anI2T3hZN0lqc3VPMjQ3amp2eU8rNDdyanY2T0NvOEZqeFdQRW84Wmp4T1BISThmanh1UERJOG1qek9QTzQ4NWowV1BRbzgrajB5UFNZOUdqMDZQVjQ5Y2oyS1BZNDlrajV5UG40K2pqNjJQcjQrM2o5cVA1WS9paitxUDc0K0hrUFNQQlpENWovcVBFWkFWa0NHUURaQWVrQmFRQzVBbmtEYVFOWkE1a1BpUFQ1QlFrRkdRVXBBT2tFbVFQcEJXa0ZpUVhwQm9rRytRZHBDb2xuS1FncEI5a0lHUWdKQ0trSW1RajVDb2tLK1FzWkMxa09LUTVKQklZdHVRQXBFU2tSbVJNcEV3a1VxUlZwRllrV09SWlpGcGtYT1JjcEdMa1ltUmdwR2lrYXVScjVHcWtiV1J0Skc2a2NDUndaSEprY3VSMEpIV2tkK1I0Wkhia2Z5UjlaSDJrUjZTLzVFVWtpeVNGWklSa2w2U1Y1SkZra21TWkpKSWtwV1NQNUpMa2xDU25KS1drcE9TbTVKYWtzK1N1Wksza3VtU0Q1UDZra1NUTHBNWmt5S1RHcE1qa3pxVE5aTTdrMXlUWUpOOGsyNlRWcE93azZ5VHJaT1VrN21UMXBQWGsraVQ1WlBZazhPVDNaUFFrOGlUNUpNYWxCU1VFNVFEbEFlVUVKUTJsQ3VVTlpRaGxEcVVRWlJTbEVTVVc1UmdsR0tVWHBScWxDbVNjSlIxbEhlVWZaUmFsSHlVZnBTQmxIK1VncFdIbFlxVmxKV1dsWmlWbVpXZ2xhaVZwNVd0bGJ5VnU1VzVsYjZWeXBYMmI4T1Z6WlhNbGRXVjFKWFdsZHlWNFpYbGxlS1ZJWllvbGk2V0w1WkNsa3lXVDVaTGxuZVdYSlplbGwyV1g1Wm1sbktXYkphTmxwaVdsWmFYbHFxV3A1YXhscktXc0phMGxyYVd1SmE1bHM2V3k1YkpsczJXVFluY2xnMlgxWmI1bGdTWEJwY0lseE9YRHBjUmx3K1hGcGNabHlTWEtwY3dsem1YUFpjK2wwU1hScGRJbDBLWFNaZGNsMkNYWkpkbWwyaVgwbEpybDNHWGVaZUZsM3lYZ1pkNmw0YVhpNWVQbDVDWG5KZW9sNmFYbzVlemw3U1h3NWZHbDhpWHk1ZmNsKzJYVDUveWw5OTY5cGYxbHcrWURKZzRtQ1NZSVpnM21EMllScGhQbUV1WWE1aHZtSENZY1poMG1IT1lxcGl2bUxHWXRwakVtTU9ZeHBqcG1PdVlBNWtKbVJLWkZKa1ltU0daSFprZW1TU1pJSmtzbVM2WlBaayttVUtaU1psRm1WQ1pTNWxSbVZLWlRKbFZtWmVabUptbG1hMlpycG04bWQrWjI1bmRtZGlaMFpudG1lNlo4Wm55bWZ1WitKa0JtZythQlpyaW1SbWFLNW8zbWtXYVFwcEFta09hUHBwVm1rMmFXNXBYbWwrYVlwcGxtbVNhYVpwcm1tcWFyWnF3bXJ5YXdKclBtdEdhMDVyVW10NmEzNXJpbXVPYTVwcnZtdXVhN3ByMG12R2E5NXI3bWdhYkdKc2FteCtiSXBzam15V2JKNXNvbXltYktwc3VteStiTXB0RW0wT2JUNXRObTA2YlVadFltM1NiazV1RG01R2JscHVYbTUrYm9KdW9tN1Nid0p2S203bWJ4cHZQbTlHYjBwdmptK0tiNUp2VW0rR2JPcHp5bS9HYjhKc1ZuQlNjQ1p3VG5BeWNCcHdJbkJLY0Nwd0VuQzZjRzV3bG5DU2NJWnd3bkVlY01weEduRDZjV3B4Z25HZWNkcHg0bk9lYzdKenduQW1kQ0ozcm5BT2RCcDBxblNhZHI1MGpuUitkUkowVm5SS2RRWjAvblQ2ZFJwMUluVjJkWHAxa25WR2RVSjFablhLZGlaMkhuYXVkYjUxNm5acWRwSjJwbmJLZHhKM0JuYnVkdUoyNm5jYWR6NTNDbmRtZDA1MzRuZWFkN1ozdm5mMmRHcDRibmg2ZWRaNTVubjJlZ1o2SW5vdWVqSjZTbnBXZWtaNmRucVdlcVo2NG5xcWVyWjVobDh5ZXpwN1BudENlMUo3Y250NmUzWjdnbnVXZTZKN3ZudlNlOXA3M252bWUrNTc4bnYyZUI1OEluN2QyRlo4aG55eWZQcDlLbjFLZlZKOWpuMStmWUo5aG4yYWZaNTlzbjJxZmQ1OXluM2FmbForY242Q2ZMMWpIYVZtUVpIVGNVWmx4aW40Y2lVaVRpSkxjaE1sUHUzQXhac2hvK1pMN1prVmZLRTdoVHZ4T0FFOERUemxQVmsrU1Q0cFBtaytVVDgxUFFGQWlVUDlQSGxCR1VIQlFRbENVVVBSUTJGQktVV1JSblZHK1VleFJGVktjVXFaU3dGTGJVZ0JUQjFNa1UzSlRrMU95VTkxVER2cWNWSXBVcVZUL1ZJWlZXVmRsVjZ4WHlGZkhWdy82RVBxZVdMSllDMWxUV1Z0WlhWbGpXYVJadWxsV1c4QmJMM1hZVyt4YkhseW1YTHBjOVZ3blhWTmRFZnBDWFcxZHVGMjVYZEJkSVY4MFgyZGZ0MS9lWDExZ2hXQ0tZTjVnMVdBZ1lmSmdFV0UzWVRCaG1HRVRZcVppOVdOZ1pKMWt6bVJPWlFCbUZXWTdaZ2xtTG1ZZVppUm1aV1pYWmxsbUV2cHpacGxtb0dheVpyOW0rbVlPWnluNVptZTdaMUpvd0djQmFFUm96MmdUK21ocEZQcVlhZUpwTUdwcmFrWnFjMnArYXVKcTVHcldhejlzWEd5R2JHOXMybXdFYllkdGIyMldiYXh0ejIzNGJmSnQvRzA1Ymx4dUoyNDhicjl1aUcrMWIvVnZCWEFIY0Nod2hYQ3JjQTl4QkhGY2NVWnhSM0VWK3NGeC9uR3hjcjV5SkhNVytuZHp2WFBKYzlaejQzUFNjd2QwOVhNbWRDcDBLWFF1ZEdKMGlYU2ZkQUYxYjNXQ2RweDJubmFiZHFaMkYvcEdkNjlTSVhoT2VHUjRlbmd3ZVJqNkdmb2ErcFI1Ry9xYmVkRjY1M29jK3V0Nm5uc2Qra2g5WEgyM2ZhQjkxbjFTZmtkL29YOGUrZ0dEWW9OL2c4ZUQ5b05JaExTRVU0VlpoV3VGSC9xd2hTRDZJZm9IaVBXSUVvbzNpbm1LcDRxK2l0K0tJdnIyaWxPTGY0dndqUFNNRW8xMmpTUDZ6NDRrK2lYNlo1RGVrQ2I2RlpFbmtkcVIxNUhla2UyUjdwSGtrZVdSQnBJUWtncVNPcEpBa2p5U1RwSlprbEdTT1pKbmtxZVNkNUo0a3VlUzE1TFprdENTSi9yVmt1Q1MwNUlsa3lHVCs1SW8raDZULzVJZGt3S1RjSk5YazZTVHhwUGVrL2lUTVpSRmxFaVVrcFhjK1NuNm5aYXZsak9YTzVkRGwwMlhUNWRSbDFXWFY1aGxtQ3I2Sy9vbm1TejZucGxPbXRtYTNKcDFtM0tiajV1eG03dWJBSnh3bld1ZExmb1pudEdlQURBQk1BSXdEUDhPLy9zd0d2OGIveC8vQWYrYk1Kd3d0QUJBLzZnQVB2L2ovei8vL1REK01KMHduakFETU4xT0JUQUdNQWN3L0RBVklCQWdELzg4LzE3L0pTSmMveVlnSlNBWUlCa2dIQ0FkSUFqL0NmOFVNQlV3Ty84OS8xdi9YZjhJTUFrd0NqQUxNQXd3RFRBT01BOHdFREFSTUF2L0RmK3hBTmNBOXdBZC8yQWlIUDhlLzJZaVp5SWVJalFpUWlaQUpyQUFNaUF6SUFNaDVmOEUvK0QvNGY4Ri93UC9CdjhLL3lEL3B3QUdKZ1VteXlYUEpjNGx4eVhHSmFFbG9DV3pKYklsdlNXOEpUc2dFakNTSVpBaGtTR1RJUk13Q0NJTElvWWloeUtDSW9NaUtpSXBJaWNpS0NMaS85SWgxQ0VBSWdNaUlDS2xJaElqQWlJSEltRWlVaUpxSW1zaUdpSTlJaDBpTlNJcklpd2lLeUV3SUc4bWJTWnFKaUFnSVNDMkFPOGxBQ1VDSlF3bEVDVVlKUlFsSENVc0pTUWxOQ1U4SlFFbEF5VVBKUk1sR3lVWEpTTWxNeVVySlRzbFN5VWdKUzhsS0NVM0pUOGxIU1V3SlNVbE9DVkNKVWt6RkRNaU0wMHpHRE1uTXdNek5qTlJNMWN6RFRNbU15TXpLek5LTXpzem5ET2RNNTR6ampPUE04UXpvVE43TXgwd0h6QVdJYzB6SVNHa01xVXlwaktuTXFneU1USXlNamt5ZmpOOU0zd3pVaUpoSWlzaUxpSVJJaG9pcFNJZ0loOGl2eUkxSWlraUtpTGkvK1QvQi84Qy96RXlGaUVoSVRVaUFBQnNBQUFBZHdBSUFHd0Fod0FIQUhRQW1RQVBBSHNBcndBSUFJb0F1d0FCQUpJQWtnSWdBSk1BaHdRWEFMTUFwZ1FlQU1vQThDa0lBT2dBeENFRUFPZ0F5d0FLQUJELzNBQWFBQ0gvL0FBYUFFSC8xZ0VSQUpFRDV3RUhBS01EOWdFUkFMRURCd0lIQU1NRE5BSUdBQkFFT2dJQkFBRUVPd0lhQUJZRVpBSUdBREFFYWdJQkFGRUVhd0lhQURZRWFBUVVBR0FrZkFRS0FHQWh1aUVLQUhBaDNDa0tBSEFoNWlrS0FHQWhBQUFDQUFRQUNRQUtBQXdBRHdBV0FCY0FIUUFmQUNJQUxBQXRBRE1BTmdBNUFFd0FUZ0JRQUZFQVZnQlhBRmtBWEFCZkFHWUFad0J0QUc0QWNBQjNBSGdBZXdCOUFJQUFnd0NMQUl3QWxBQ1dBSmdBbVFDYUFKd0FuUUNlQUtNQXBRQ29BS2tBcmdDdkFMQUF0Z0M1QUx3QXhBREdBTXdBemdEUkFOZ0EyUURhQU9BQTR3RG1BTzRBN3dEM0FQa0Erd0QvQUFBQkFRRUdBUWdCQ3dFV0FSd0JMZ0UyQVRnQk93RkNBVU1CU3dGT0FWRUJaQUZtQVdnQmJnRnZBWEFCZGdHUkFaTUJsUUdXQVpzQm5BR2RBYUFCb1FHaUFhVUJwZ0dyQWF3QnJ3R3hBYk1CdGdHOUFiNEJ4QUhLQWZrQitnSDlBUVFDQlFJTEFnMENHQUlhQWhzQ0lRSWtBaWNDTVFJMUFqY0NVZ0pVQWxVQ1ZnSmRBbDRDWHdKakFta0NkQUo2QW8wQ2t3S1dBcGtDb0FLakFxa0N4QUxHQXNrQ3p3TFFBdEVDMWdMZEF1Z0M3Z0x3QXZNQytnTDhBZ01EQmdNSkF4QURHZ00xQXpjRE9BTTVBem9EUGdNL0EwQURRd05oQTJNRFpnTnRBMjREYndOMUEzWURlQU45QTM0RGZ3T0FBNElEaFFPTUE0MERrd09WQTVnRG53T2pBOFVEeGdQSkE4b0R6Z1BQQTlRRDFnUFpBK0FENFFQbkEra0Q3QVB6QS9VRDl3UDZBLzBERkFRV0JCa0VHZ1FmQkNBRUlRUWxCQ2dFS3dRMkJGa0VYQVJmQkdZRVp3UnZCSEVFZEFSOEJIMEVmZ1NFQklZRWlBU1BCSkFFa1FTWEJLb0VzUVRNQk04RTBnVFpCT01FNlFUd0JQTUUrUVQ3QlA0RUF3VUVCUVVGQ0FVSkJRd0ZEd1VpQlNRRkp3VW9CUzBGTGdVdkJUTUZOQVUxQlRjRk9nVTdCVDRGUUFWREJVb0ZTd1ZSQllnRmlRV0xCWXdGa0FXUkJaSUZrd1dWQlpZRm1BV2JCYUlGb3dXcEJhd0Zyd1c2QmNBRnd3WGFCZHdGM2dYZkJlQUY0d1hrQmVVRjVnWG5CZWtGN0FYdkJRSUdGUVljQmg4R0lnWXBCaW9HTWdaTkJrOEdVZ1paQmxvR1d3WmhCblFHZXdhUEJwVUdtQWFiQnFNR3BBYWxCcXNHcmdheEJyZ0d2QWJDQnNRR3hnYkhCc3dHelFiT0J0UUc3d2J4QnZNRytnYjdCZ0FIQWdjRkJ3d0hEUWNTQnhRSEZ3Y2VCeDhIWFFkZkIySUhZd2RuQjJnSGJRZHZCM0lIZVFkNkI0QUhrd2UyQjdnSHV3ZkhCODBIMUFmbkJ3SUlCUWc0Q0RvSVBRaERDRWNJYVFpRUNJY0lpZ2lSQ0pRSXRnaTRDTG9Jd1FqQ0NNb0l6UWpRQ05jSTRRamtDT2NJN2dqdkNQQUk5Z2o0Q1BzSUFna0RDUVlKQ0FrTENSSUpFd2taQ1JzSktRa3FDVXdKVGdsUkNWZ0pXUWxlQ1dBSll3bHFDV3NKYkFseUNYUUpkd2wrQ1g4SmhRbUlDWlFKbFFtZENaOEpvZ21wQ2FvSnF3bXhDYlFKeEFuZUNlVUo2QW5yQ2ZJSjh3bjBDZm9KL1FrQUNnZ0tDUW9LQ2hBS0Vnb1ZDaHdLSFFvZUNpUUtOd28rQ2xrS1d3cGVDbVVLWndwb0NtNEtjQXB6Q25vS2V3cDhDb0lLaEFxSENvNEtqd3FRQ3BJS3J3cXhDclFLdXdxOENyMEt3d3JGQ3NZS3l3ck1DczBLendyUUN0SUsxUXJjQ3QwSzRncm9DdlFLRmdzWUN4c0xIQXNoQ3lJTEl3c25DeWtMTEFzekN6UUxPZ3M4Q3o4TFNRdEtDMDRMYVF0cUMyMExiZ3R6QzNRTGRRdDdDMzRMalF1dkM3SUx0UXU5Qzc0THZ3dkZDOGdMeXd2VEM5UUwzQXZkQzk4TDVBdmxDK1lMNlF2cUMrMEw4QXY0Qy9rTEFRd2NEQjhNSWd3MUREZ01Pd3hDREVRTVRBeFBERklNV1F4YkRIOE1nUXlERElRTWlReUtESXNNakF5T0RKQU1sQXlWREpZTW1ReWJESjBNb0F5bkRLZ01xd3l0REs4TXV3emhET01NNVF6bURPc003QXp0RFBJTTlBejJEUDBNL2d3RURRWU5DUTBSRFJJTkZRMFhEUm9OTVEweURUVU5QQTA5RFQ0TlJBMUhEVllOWFExd0RYY05lUTE4RFlNTmpRMlFEYWNOcVEyckRiQU5zUTJ5RGJVTnRnMjlEY2dOenczcURld043dzM3RFFFT0JBNEhEZzRPRUE0UkRoY09HUTRjRGlNT0pBNUlEa29PVFE1T0RsTU9WQTVWRGxrT1d3NWVEbDhPWkE1bERtb09iQTV2RG5ZT2R3NTlEb3NPc2c2MERyWU92UTYvRHNVTzJRN2ZEdTBPN2c0UUR4SVBGUThjRHg4UFhROTRENHdQa2crVUQ1Y1BuZytnRDZFUCt3OFBFQlVRR0JBYkVDSVFTQkJLRUUwUVZCQlZFRllRWEJCZEVGOFFaQkJsRUdnUWFoQnNFRzhRZGhCM0VIMFFmeENDRUlrUWloQ0xFSkVRbEJDWEVKNFFvaENvRUtvUXF4Q3ZFTEFRdEJDMUVMY1F1aERCRU1JUXlCREtFTTBRMUJEVkVOc1EzaERoRU8wUTh4RDBFUGNRK0JEOUVQNFEveEFDRVFRUkJoRUpFUlVSR3hFZUVTRVJLQkVxRVRFUk5CRTNFVDRSUHhGSEVVa1JUQkZURVZRUlZSRmJFVjBSWHhGbUVXY1JhQkZwRVdvUmF4RitFWVVSaHhHS0VaRVJsUkdiRVowUm9CR25FYWdScVJHdkViVVJ2QkcrRWI4UnhSSEhFY29SMEJIUkVkSVI5QkgyRWZnUi9oSC9FUUFTQkJJRkVnWVNDUklRRWhJU0Z4SVpFaHdTSXhJbEVrQVNZaEprRW1jU2FCSnRFbThTZFJKNEVuc1NyaExGRXNjU3lSTEtFczhTMGhMWUV0b1M2Ukx3RWdNVENoTU5FeEFURnhNaEV6d1RQaE5CRTBnVFN4TlJFMlFUYXhPR0U0a1R0Uk83RTcwVHdCUEJFOFVUenhQU0U5VVQzQlBuRStrVDdCUHpFL1FUOVJQN0UvMFQvaE1DRkFNVUJoUUhGQWtVREJRVEZCUVVHaFFjRkI4VUlSUWxGQ1lVSnhRcUZDc1VMaFF4RkRrVVF4UkZGRVlVU3hSTUZFMFVUaFJRRkZNVVdoUmJGRndVWWhSakZHWVVaeFJyRkc0VWNSUjBGSHNVZkJTREZJVVVpQlNKRklzVWpCU05GSTRVa2hTVUZKY1VuaFNmRktVVXB4U3lGTFFVdFJTN0ZMMFV3QlRIRk1nVXlSVFBGTkVVMUJUYkZOd1UzUlRqRk9VVTZCVHRGTzRVN3hUMUZQY1UraFFCRlFNVkNSVUxGUTRWRlJVWUZSNFZJQlVqRlNvVkt4VXNGVElWTkJVM0ZUNFZQeFZBRlVFVlJSVkhGVW9WVHhWUUZWRVZVaFZWRlZnVlh4VmhGV2tWYXhWdUZYSVZjeFYyRlhjVmVSVjZGWHNWZ0JXQkZZWVZpQldMRlpJVmt4V1pGWnNWbkJXZEZhUVZxQld1RmJFVnRCWEhGY2tWekJYTkZkSVYweFhVRmRrVjJ4WGVGZVVWNWhYbkZlMFY4Qlh6RmZvVi9CVUNGaDBXSHhZaUZpTVdLQllwRmlvV0xSWXpGanNXUEJZOUZnS3NCYXdMckJpc0hxd2hyQ1dzTHF3eXJEcXNQYXhCckV5c1RxeFZyRm1zWGF4eXJIV3NlYXg3cklLc2g2eU5ySkdzbGF5ZXJLS3NxNnl0ckxHc3VxeStyTUtzeGF6SnJNMnMxcXpZck9LczVhenByT3VzN2F6eXJQU3M5NnorckFHdEJhMEhyUTZ0RUswU3JSbXRIYTBoclNxdExxMDJyVG10UGExR3JVaXRTcTFSclZXdFdhMWlyV1N0YnExeHJYZXRmcTJBcllPdGlxMk5yWkd0bnEybHJiaXR3cTNGcmNtdDBxM1VyZDJ0NGEzbHJmcXQvYTBDcmdxdURLNE9yaFd1TXE0MXJqbXVPNjVDcmtTdVI2NUxyayt1VWE1VnJsZXVYcTVpcm1hdWFxNXRybkd1ZXE1K3JvYXVqYTYvcnNHdXhhN09ydEt1MnE3ZHJ1bXU3Szd1cnZXdSthNzlyZ212RHE4UnJ5NnZNYTh6cnpXdlBxOUFyMFN2U3E5UnIxNnZacTk2cjRHdmhhK0pyNUt2bHErZHI3cXZ2YS9CcjhxdnpLL1ByOVd2M2EvcXIvS3Y5YS81cndLd0JiQU5zQkd3RmJBZXNDbXdSckJKc0V1d1RiQlBzRmF3V0xCYXNGNndmckNCc0lXd2pyQ1FzSkt3bTdDZHNLT3dxckN3c0xLd3RyQzVzTDJ3eHJES3NOS3cxYkRac09HdzVyQUtzUTJ4RWJFVXNScXhIckVtc1NteExiRTJzVHF4UXJGRnNVbXhVckZXc1ZteFhiRmhzWHF4ZmJHQnNZT3hpckdNc1k2eGxiR1pzWjJ4cWJITnNkR3gxYkhlc2VDeDZySHRzZkd4K3JIOHNmNnhCcklKc2cyeUZySVlzaHF5SWJJMXNqMnlXYkpkc21HeWFySjJzbjJ5aHJLS3NwS3lsYktic3FLeXBMS25zcXV5cmJLeHNyV3l5ckxOc3RHeTA3TGFzdHl5M3JManN1ZXk2Ykx3c3ZheS9MSUNzd1d6Q2JNU3N4YXpIYk5YczFtelhiTmdzMmF6YUxOcXMyeXpiN055czNXemViT0NzNGF6amJPUnM1V3pvck9wczYyenhyUEpzODJ6ejdQUnM5YXoyTFBhczl5ejNyUGhzK1d6NmJQOXN4RzBHYlFkdENHMEtyUXN0RFcwVXJSVnRGbTBZclJrdEdhMGJiU0J0SW0wbnJTbHRLbTByYlMydExpMHVyVEJ0TVcweWJUUnROYTAzclRodE9XMDU3VHV0UEMwOHJUNXRCYTFHYlVkdFNhMUs3VXl0VFcxT2JWQ3RVYTFUclZSdFZXMVhyVml0YUsxcGJXcHRheTFzclcydGI2MXdiWEZ0YzYxMHJYWnRlMjFFcllWdGhtMkpyWXR0alcyU2JabHRtbTJucmFodHFXMnJiYXl0dFcyOGJiMXR2bTJBcmNHdHlxM0xiY3h0enEzUExkRnQwbTNUYmRXdDJHM1piZHB0M0szZExkMnQzNjNnYmVGdDQ2M2s3ZWF0NTIzb2JlcXQ2NjN0cmU1dDhpM3lyZnV0L0czOWJmK3R3SzRDcmdOdUJHNEdyZ2N1QjY0SnJncHVDMjROcmc2dUVHNFJiaFN1RlM0WHJoaHVHVzRicmh3dUhLNGViaDl1STY0cWJpeHVMVzR1YmpDdU1TNHhyak51Tkc0MWJqZXVPQzQ0cmpxdU8yNDhiajZ1UHk0L3JnRnVSbTVJYmsrdVVHNVJibE51VkM1VXJsYXVWMjVZYmxxdVd5NWJybDJ1WG01ZmJtR3VZaTVpN21QdWE2NXNibTF1YjY1d0xuQ3VjcTV6Ym5UdWRxNTNMbmZ1ZUs1NXJucHVlMjU5cm43dVFLNkNib1d1anE2UGJwQnVrTzZTcnBNdWsrNlZycFp1bDI2WnJwcXVuSzZkYnA1dW9hNmlMcU51cXE2cmJxeHVyTzZ1cnE4dXI2Nnhickp1dHE2L2JvQnV3VzdEcnNRdXhLN0dic2R1eUc3S3Jzc3V6ZTdPYnMvdTBhN1NMdEt1MDY3VWJ0VnUxbTdZcnRrdTIyN2lidU51NUc3cGJ1cHU2Mjd0YnU0dThHN3hidkp1OUc3MUx2NnUvMjdBYndEdkFxOERyd1F2Qks4R2J3Z3ZDYThLTHdxdkM2OE1ydzF2RG04UXJ4R3ZFcThUcnhSdkY2OGhyeUp2STI4ajd5V3ZKaThtN3lpdktXOHFieXl2TGE4dnJ6QnZNVzh6cnpTdk5hODJiemR2UGU4K2J6OXZBYTlDTDBLdlJHOUZiMGx2UzI5UWIxS3ZVMjlVYjFhdldXOWFiMkN2WVc5aTcyU3ZaUzlscjJidloyOXBiMnh2Ym05MXIzWnZkMjk2cjN4dmZXOStiMEJ2Z1MrQnI0T3ZoRytGYjRldmlDK1JyNUp2azIrVDc1V3ZsaStYTDVpdm1XK2FiNXJ2bksrZHI1K3ZvRytoYjZPdnBLK21yNnB2dEsrMWI3WnZ1Rys1cjd0dmdLL0NyOGF2eDYvUXI5RnYwbS9VcjlXdjVXL3NiL0d2ODYvMGIvVnY5Mi80TC9pdnozQVVzQlp3RjNBWWNCcXdKTEFsY0Nad0tMQXBNQ213SzdBc2NDM3dMN0F3c0RHd01yQXpjRFJ3TnJBM3NEbXdPbkE3Y0Qyd1BqQStzQUJ3UVhCQ2NFUndSYkJJY0Vsd1NqQkxzRXl3VGZCT3NFOXdVSEJTc0ZPd1ZiQldjRmR3V2JCYXNGeHdYWEJlY0dHd1kvQmtjR1Z3WmZCbnNHZ3dhTEJwc0dxd2EzQnNjRyt3Y1hCeWNITndkWEIyY0hod2VYQjZjSHl3ZlRCL3NFQndnWENEc0lRd2hMQ0dzSWR3aUhDS3NJc3dpN0NNTUl6d2pYQ1NjSlN3bFhDV2NKaHdtYkNic0p4d25YQ2ZzS0F3b0xDaXNLUndwbkNuTUtld3FiQ3FjS3V3cmJDdU1LNnd0N0M0Y0xsd3U3QzhNTHl3dmZDK3NMOXdnSERDc01Pd3hiREdjTWR3eWJES3NOR3cyckRiY054dzNQRGVzTit3NFhEaWNPTnc4SEQyc1BkdytIRDQ4UHF3KzdEOXNQNXd3bkVFY1FseEMzRU1jUTF4RDdFU2NSbXhHbkViY1IyeEhyRWdjU1Z4SjNFdWNTOXhPckU4c1QxeFBuRSs4UUN4UTNGRWNVVnhSM0ZLc1V0eFRIRk9zVTh4VDdGUnNWTHhVL0ZWc1ZheFYvRllzVmx4V25GY3NWMnhYN0ZnY1dGeFlqRmpzV1F4WkxGbHNXWnhaM0ZvY1dxeGJiRnVzVy94Y3ZGemNYUHhkTEYxY1haeGVMRjVNWG14ZS9GOGNYMXhmakZBc1lKeGczR0VjWWF4aDNHSnNZcHhpL0dNY1kyeGpqR09zWTh4a0xHUmNaSnhsTEdWc1pleG1IR2JjWnd4bkxHZXNaOXhvSEdpc2FNeG83R2xzYVp4cDNHcHNhb3hxckdzc2ExeHJ2R3dzYkV4c2JHenNiUnh0WEczc2JpeHVyRzdjYnh4dnJHL3NZR3h3bkhEY2NXeHhqSEdzY2l4eVhIS2NjeXh6VEhOc2M0eHo3SFFjZEZ4MHZIVHNkUXgxbkhYY2RoeDJuSGJNZDJ4M25IZjhlR3g0dkhqOGVTeDVYSG1jZWJ4NkxIcDhldXg3SEh0Y2UreDhMSHlzZk54OC9IMGNmWng5N0g1Y2ZweCszSEFzZ0Z5QW5JQzhnU3lCVElGOGdleUNISUpjZ3V5RERJTXNnNXlEM0lRY2hLeUU3SVZjaHl5SFhJZWNoN3lJTEloTWlJeUk3SWxjaWV5S0RJb3NnQUFBTUFGZ0FjQUI4QUlnQXBBQ29BS3dBeEFETUFRd0JKQUVzQVRnQlRBRlFBVlFCYkFHNEFkUUNRQUpJQWxRQ2NBSjBBcFFDb0FLc0FzZ0M5QUw4QXdnREpBTW9BeXdEdEFPOEE4UUR5QVBjQStBRDVBUHNBL0FEK0FQOEFBQUVDQVFZQkJ3RU5BUThCRWdFWkFSb0JJQUVqQVRNQlZRRlhBVm9CWVFGaUFXZ0JmQUdDQVpVQnVBRzZBYjBCeEFIRkFjWUJ4d0hMQWRFQjNBSGpBZllCL1FFQUFnTUNDZ0lwQWk4Q01RSTBBanNDUGdKRUFsY0NlUUtVQXE4Q3ZnTEFBc0VDNHdMbEF1Z0M3d0x5QXZZQytBTDVBdm9DQVFNQ0F3Y0RDUU1NQXhNREZBTWFBeDBESGdNZkF5WURLZ05NQTA0RFVRTllBMWtEWHdOaEEyUURhd05zQTIwRGN3TjJBNFVEakFPUEE1OERwUU9uQTZvRHNRT3lBN01EdVFPOEE3OER5d1B0QS9BRDh3UDZBL3NEL0FNQ0JCRUVIQVFlQkNFRUtBUXBCQ29FTUFSREJFb0VUUVJrQkdjRWFnUnhCSElFY3dSNUJId0Vmd1NHQklvRWtBU1NCSlVFbkFTZEJKNEV3QVRDQk1RRXlnVExCTXdFMGdUVUJOY0UzZ1RmQk9BRTVnVG9CT3NFOGdUekJQa0VEQVV1QlRBRk1nVTVCVG9GUUFWQ0JVVUZUQVZOQlU0RlZBVlhCVm9GWVFWaUJXZ0Znd1dGQllnRmp3V1FCWkVGbHdXWkJad0Zvd1duQmEwRndRWEhCYzRGNFFYOEJmNEZBUVlJQmdrR0NnWVFCaE1HRmdZaUJpZ0dQQVpDQmtRR1J3Wk9CazhHVUFaV0Jsa0dYQVpqQm00R2NBWnpCbm9HZlFhZkJxRUdwQWFyQnF3R3JRYXpCclVHdUFhK0JyOEd4UWJIQnNvRzBRYlNCdGdHN0FZT0J4QUhFd2NVQnhrSEdnY2dCeUlISlFjc0J5MEhMZ2MwQnpjSFJnZE5CMUFIWndkcEIyd0hjd2QwQjNVSGVRZDZCMzBIbEFldkI3SUh3QWZCQjhjSDRnZmtCK2NIN2dmdkIvQUg5Z2NKQ0JBSUt3Z3RDREFJTndnNkNFQUlRd2hHQ0UwSVVRaFhDRmtJV3doY0NHRUlZZ2hxQ0cwSWNBaDNDSUVJZ3dpR0NJMElqZ2lQQ0pVSWxnaVpDSm9JbndpZ0NLTUlwUWluQ0tvSXNRaXlDTGdJN2dqd0NQTUkrZ2o3Q0FFSkF3a0dDUTBKRGdrUENSVUpHQWtiQ1NJSkpBa3FDVEVKT1FrNkNVSUpSQWxIQ1U0SlR3bFFDVllKYWdtTUNZOEpwZ21wQ2F3SnRBbTFDYjBKdnduQkNjSUp4d25JQ2NrSnp3bmpDUVVLQ0FvTENoSUtGQW9jQ2g4S0lnb3BDaXNLTEFveUNqVUtPQW8vQ2tBS1pBcG1DbWtLY0FweENuSUtlQXA2Q24wS2dRcURDb1FLaFFxTENvMEtrQXFYQ3BnS25ncXlDdFFLMWdyWkN0b0szd3JnQ3VFSzV3cnBDdXdLOHdyMEN2VUsrd3I5Q2dBTEJ3c0lDdzRMRVFzVUN4d0xKZ3NvQ3lzTEx3c3hDeklMTXdzMkN6Z0xPZ3M5QzBjTFNBdE9DMUFMWGd0ZkMyVUxad3RxQzNJTGN3dDBDM29MZlF1QUM0Z0xpUXVSQzVNTGxndWFDNXdMbmd1ZkM2VUxxQXVyQzdJTHRndThDNzRMd1F2TkM5TUwxUXZZQzk4TDRBdmhDK2NMNlF2c0MvTUw5UXYyQy93TC9ndi9Dd1VNQmd3SERBb01EQXdQREJJTUdRd2NEQ0lNSkF3bkRDNE1Md3d3REtYSXFjaSt5TVhJeWNqTnlOYkkyTWpheU9MSTVjajJ5UDdJQWNrSHlRN0pFTWtTeVJuSkxjazF5VkxKVmNsWnlXTEpaTWx0eVhISmRjbDl5WXJKamNtUnlackpuTW1leWNMSnhjbkp5Y3ZKMHNuVXlkZkoyOG5leWVISjQ4bmx5ZWpKN3NueXlmckovY2tCeWdyS0Rzb1Z5aG5LS3NwT3lsSEtWY3BleW1MS2FjcCt5b1hLbWNxK3lzSEt4Y3JPeXRESzBzclV5dHJLNGNydHl2WEtDY3NSeXhYTEdjc2l5MExMU3N0TnkxSExXc3RleTJYTGVzdWR5N25MMWN2bHkrakw2c3NPekJITUZjd2V6Q1BNS3N3dHpDL01NY3c2ekQvTVJzeEp6RTNNVnN4YXpHSE1aY3huekduTWNjeDJ6SnJNbmN5aHpLck1yc3kyekxuTXZjekd6TWpNeXN6UnpOWE01Y3p0elBITUFzMEt6UTNORWMwYXpSek5IczBselNuTkxjMDZ6VjNOWWMxbHpXN05jTTF5elhuTmljMld6Wm5ObmMybXphak5xczJ4emNYTnpjM1J6ZW5ON2MzeHpmck4vTTMrelFYT0NjNE56aFhPR3M0aXppWE9LYzR5empUT05zNWF6bDNPWXM1cXptek9iczUyem5uT2ZjNkd6b2pPaXM2U3pwWE9tYzZpenFiT3JzN0N6dWJPNmM3dHp2Yk8rczRDendYUENjOFN6eFRQRnM4ZHp5SFBKYzh1enpMUE9jOVd6MW5QWGM5bXoyalBhczl5ejNYUGVjK0J6NGJQamMraXo2blBzYy9GeitMUDVjL3B6L0xQOU0vMnovM1BBZEFGMEJMUUdkQXUwRGJRT2RBOTBFYlFTTkJLMEZIUVZkQlowR0hRYnRCeDBIWFFmdENDMEtiUXFkQ3QwTGJRdU5DNjBNTFF4ZERLME5MUTF0RGUwT0hRNWREdTBQTFErZEFPMFRMUk5kRTUwVHZSUXRGRzBVN1JVZEZWMFY3UllORmkwV25SYmRGOTBZWFJpZEdpMGFYUnFkR3kwYlRSdHRHNzBiM1J3ZEhaMGZYUitkRUkwZ3JTRWRJdTBqSFNOZEkrMGtEU1F0SkowbDNTWmRLQzBvWFNpZEtTMHBiU25kS2gwcVhTcmRLeTByclN2ZExCMHNQU3l0TE0wdFhTMmRMZDB1YlM4dEwxMHZuU0F0TUUwd2JURDlNUjB4WFRGOU1lMHlMVEp0TXEweTNUTWRNNjB6N1RSdE4rMDRIVGhkT08wNUxUbXRPZDA2SFRxdE9zMDY3VHRkTzUwNzNUeHRQSzA5SFQyZFBpMCtUVDd0UHgwL1hUL3RNQTFBTFVDZFFlMUVIVVJkUmQxR0hVWmRSdTFIRFVldFI5MUlIVWc5U0sxSXpVanRTVjFLclV6ZFRSMU5YVTNkVGcxT25VN2RUeDFQblUvTlQrMUFYVkNkVU4xUmJWR05VKzFVSFZSZFZPMVZEVlV0VmExVjNWWWRWbTFXclZiTlZ1MVhiVmVkVjkxWWJWaXRXUjFhYlZ5dFhOMWRIVjA5WGExZHpWM3RYbTFlblY3ZFgyMWZqVit0VUMxZ1hXQ2RZUzFoYldIZFloMWlYV0x0WTYxajNXUWRaRzFrcldUTlpPMWxMV1Z0WloxbDNXYU5acTFuTFdkZGFFMW9iV2p0YVIxcFhXbnRhZzFxTFdxZGF0MXJIV3V0YTgxc2JXeWRiTjF0TFcxZGJZMXRyVzRkYmwxdW5XOGRiMjF2N1dBZGNGMXhMWEd0Y2QxeUhYS3RjczF5N1hOdGM1MXozWFJkZEkxMHJYVXRkVjExclhZdGRrMTJiWGF0ZHQxM0hYZGRkKzE0TFhpdGVOMTVIWG10ZWMxNTdYQUt3QnJBU3NCNndJckFtc0Nxd1FyQkdzRXF3VHJCU3NGYXdXckJlc0dhd2FyQnVzSEt3ZHJDQ3NKS3dzckMyc0w2d3dyREdzT0t3NXJEeXNRS3hMckUyc1ZLeFlyRnlzY0t4eHJIU3NkNng0ckhxc2dLeUJySU9zaEt5RnJJYXNpYXlLckl1c2pLeVFySlNzbkt5ZHJKK3NvS3locktpc3FheXFyS3lzcjZ5d3JMaXN1YXk3ckx5c3ZhekJyTVNzeUt6TXJOV3MxNnpnck9HczVLem5yT2lzNnF6c3JPK3M4S3p4clBPczlhejJyUHlzL2F3QXJRU3RCcTBNclEydEQ2MFJyUml0SEswZ3JTbXRMSzB0clRTdE5hMDRyVHl0UksxRnJVZXRTYTFRclZTdFdLMWhyV090YksxdHJYQ3RjNjEwclhXdGRxMTdyWHl0ZmExL3JZR3RncTJJclltdGpLMlFyWnl0bmEya3JiZXR3SzNCcmNTdHlLM1FyZEd0MDYzY3JlQ3Q1SzM0cmZtdC9LMy9yUUN1QWE0SXJnbXVDNjROcmhTdU1LNHhyalN1TjY0NHJqcXVRSzVCcmtPdVJhNUdya3F1VEs1TnJrNnVVSzVVcmxhdVhLNWRybCt1WUs1aHJtV3VhSzVwcm15dWNLNTRybm11ZTY1OHJuMnVoSzZGcm95dXZLNjlycjZ1d0s3RXJzeXV6YTdQcnRDdTBhN1lydG11M0s3b3J1dXU3YTcwcnZpdS9LNEhyd2l2RGE4UXJ5eXZMYTh3cnpLdk5LODhyejJ2UDY5QnIwS3ZRNjlJcjBtdlVLOWNyMTJ2Wks5bHIzbXZnSytFcjRpdmtLK1JyNVd2bksrNHI3bXZ2Sy9BcjhldnlLL0pyOHV2emEvT3I5U3YzSy9vcittdjhLL3hyL1N2K0s4QXNBR3dCTEFNc0JDd0ZMQWNzQjJ3S0xCRXNFV3dTTEJLc0V5d1RyQlRzRlN3VmJCWHNGbXdYYkI4c0gyd2dMQ0VzSXl3amJDUHNKR3dtTENac0pxd25MQ2ZzS0N3b2JDaXNLaXdxYkNyc0t5d3JiQ3VzSyt3c2JDenNMU3d0YkM0c0x5d3hMREZzTWV3eUxESnNOQ3cwYkRVc05pdzRMRGxzQWl4Q2JFTHNReXhFTEVTc1JPeEdMRVpzUnV4SExFZHNTT3hKTEVsc1NpeExMRTBzVFd4TjdFNHNUbXhRTEZCc1VTeFNMRlFzVkd4VkxGVnNWaXhYTEZnc1hpeGViRjhzWUN4Z3JHSXNZbXhpN0dOc1pLeGs3R1VzWml4bkxHb3NjeXgwTEhVc2R5eDNiSGZzZWl4NmJIc3NmQ3grYkg3c2YyeEJMSUZzZ2l5QzdJTXNoU3lGYklYc2hteUlMSTBzanl5V0xKY3NtQ3lhTEpwc25TeWRiSjhzb1N5aGJLSnNwQ3lrYktVc3BpeW1iS2FzcUN5b2JLanNxV3lwcktxc3F5eXNMSzBzc2l5eWJMTXN0Q3kwckxZc3RteTI3TGRzdUt5NUxMbHN1YXk2TExyc3V5eTdiTHVzdSt5ODdMMHN2V3k5N0w0c3ZteStyTDdzdit5QUxNQnN3U3pDTE1Rc3hHekU3TVVzeFd6SExOVXMxV3pWck5ZczF1elhMTmVzMSt6WkxObHMyZXphYk5yczI2emNMTnhzM1N6ZUxPQXM0R3pnN09FczRXempMT1FzNVN6b0xPaHM2aXpyTFBFczhXenlMUExzOHl6enJQUXM5U3oxYlBYczltejI3UGRzK0N6NUxQb3MveXpFTFFZdEJ5MElMUW90Q20wSzdRMHRGQzBVYlJVdEZpMFlMUmh0R08wWmJSc3RJQzBpTFNkdEtTMHFMU3N0TFcwdDdTNXRNQzB4TFRJdE5DMDFiVGN0TjIwNExUanRPUzA1clRzdE8yMDc3VHh0UGkwRkxVVnRSaTFHN1VjdFNTMUpiVW50U2kxS2JVcXRUQzFNYlUwdFRpMVFMVkJ0VU8xUkxWRnRVdTFUTFZOdFZDMVZMVmN0VjIxWDdWZ3RXRzFvTFdodGFTMXFMV3F0YXUxc0xXeHRiTzF0TFcxdGJ1MXZMVzl0Y0MxeExYTXRjMjF6N1hRdGRHMTJMWHN0UkMyRWJZVXRoaTJKYllzdGpTMlNMWmt0bWkybkxhZHRxQzJwTGFydHF5MnNiYlV0dkMyOUxiNHRnQzNBYmNGdHlpM0tiY3N0eSszTUxjNHR6bTNPN2RFdDBpM1RMZFV0MVczWUxka3QyaTNjTGR4dDNPM2RiZDh0MzIzZ0xlRXQ0eTNqYmVQdDVDM2tiZVN0NWEzbDdlWXQ1bTNuTGVndDZpM3FiZXJ0NnkzcmJlMHQ3VzN1TGZIdDhtMzdMZnR0L0MzOUxmOHQvMjMvN2NBdUFHNEI3Z0l1QW00RExnUXVCaTRHYmdidUIyNEpMZ2x1Q2k0TExnMHVEVzRON2c0dURtNFFMaEV1Rkc0VTdoY3VGMjRZTGhrdUd5NGJiaHZ1SEc0ZUxoOHVJMjRxTGl3dUxTNHVMakF1TUc0dzdqRnVNeTQwTGpVdU4yNDM3amh1T2k0NmJqc3VQQzQrTGo1dVB1NC9iZ0V1Umk1SUxrOHVUMjVRTGxFdVV5NVQ3bFJ1Vmk1V2JsY3VXQzVhTGxwdVd1NWJibDB1WFc1ZUxsOHVZUzVoYm1IdVltNWlybU51WTY1ckxtdHViQzV0TG04dWIyNXY3bkJ1Y2k1eWJuTXVjNjV6N25RdWRHNTBybll1ZG01MjduZHVkNjU0Ym5qdWVTNTVibm91ZXk1OUxuMXVmZTUrTG41dWZxNUFMb0J1Z2k2RmJvNHVqbTZQTHBBdWtLNlNMcEp1a3U2VGJwT3VsTzZWTHBWdWxpNlhMcGt1bVc2Wjdwb3VtbTZjTHB4dW5TNmVMcUR1b1M2aGJxSHVveTZxTHFwdXF1NnJMcXd1cks2dUxxNXVydTZ2YnJFdXNpNjJMclp1dnk2QUxzRXV3MjdEN3NSdXhpN0hMc2d1eW03SzdzMHV6VzdOcnM0dXp1N1BMczl1ejY3Ukx0RnUwZTdTYnROdTArN1VMdFV1MWk3WWJ0anUyeTdpTHVNdTVDN3BMdW91Nnk3dEx1M3U4Qzd4THZJdTlDNzA3djR1L203L0x2L3V3QzhBcndJdkFtOEM3d012QTI4RDd3UnZCUzhGYndXdkJlOEdMd2J2Qnk4SGJ3ZXZCKzhKTHdsdkNlOEtid3R2REM4TWJ3MHZEaThRTHhCdkVPOFJMeEZ2RW04VEx4TnZGQzhYYnlFdklXOGlMeUx2SXk4anJ5VXZKVzhsN3ladkpxOG9MeWh2S1M4cDd5b3ZMQzhzYnl6dkxTOHRieTh2TDI4d0x6RXZNMjh6N3pRdk5HODFiell2Tnk4OUx6MXZQYTgrTHo4dkFTOUJiMEh2UW05RUwwVXZTUzlMTDFBdlVpOVNiMU12VkM5V0wxWnZXUzlhTDJBdllHOWhMMkh2WWk5aWIyS3ZaQzlrYjJUdlpXOW1iMmF2Wnk5cEwyd3ZiaTkxTDNWdmRpOTNMM3B2ZkM5OUwzNHZRQytBNzRGdmd5K0RiNFF2aFMrSEw0ZHZoKytSTDVGdmtpK1RMNU92bFMrVmI1WHZsbStXcjVidm1DK1liNWt2bWkrYXI1d3ZuRytjNzUwdm5XK2U3NTh2bjIrZ0w2RXZveStqYjZQdnBDK2tiNll2cG0rcUw3UXZ0RysxTDdYdnRpKzRMN2p2dVMrNWI3c3ZnRy9DTDhKdnhpL0diOGJ2eHkvSGI5QXYwRy9STDlJdjFDL1ViOVZ2NVMvc0wvRnY4eS96Yi9RdjlTLzNML2Z2K0cvUE1CUndGakFYTUJnd0dqQWFjQ1F3SkhBbE1DWXdLREFvY0Nqd0tYQXJNQ3R3Sy9Bc01DendMVEF0Y0Myd0x6QXZjQy93TURBd2NERndNakF5Y0RNd05EQTJNRFp3TnZBM01EZHdPVEE1Y0Rvd096QTlNRDF3UGZBK2NBQXdRVEJDTUVRd1JYQkhNRWR3UjdCSDhFZ3dTUEJKTUVtd1NmQkxNRXR3Uy9CTU1FeHdUYkJPTUU1d1R6QlFNRkl3VW5CUzhGTXdVM0JWTUZWd1ZqQlhNRmt3V1hCWjhGb3dXbkJjTUYwd1hqQmhjR013WTNCanNHUXdaVEJsc0djd1ozQm44R2h3YVhCcU1HcHdhekJzTUc5d2NUQnlNSE13ZFRCMThIWXdlREI1TUhvd2ZEQjhjSHp3ZnpCL2NFQXdnVENETUlOd2cvQ0VjSVl3aG5DSE1JZndpRENLTUlwd2l2Q0xjSXZ3akhDTXNJMHdrakNVTUpSd2xUQ1dNSmd3bVhDYk1KdHduRENkTUo4d24zQ2Y4S0J3b2pDaWNLUXdwakNtOEtkd3FUQ3BjS293cXpDcmNLMHdyWEN0OEs1d3R6QzNjTGd3dVBDNU1Mcnd1ekM3Y0x2d3ZIQzlzTDR3dm5DKzhMOHdnRERDTU1Kd3d6RERjTVR3eFRERmNNWXd4ekRKTU1sd3lqREtjTkZ3MmpEYWNOc3czRERjc040dzNuRGZNTjl3NFREaU1PTXc4REQyTVBadzl6RDM4UGd3K0xENk1QcHcrM0Q5TVAxdy9qRENNUVF4Q1RFTE1Rd3hEVEVQTVE5eEVqRVpNUmx4R2pFYk1SMHhIWEVlY1NBeEpURW5NUzR4THpFNmNUd3hQSEU5TVQ0eFByRS84UUF4UUhGRE1VUXhSVEZITVVveFNuRkxNVXd4VGpGT2NVN3hUM0ZSTVZGeFVqRlNjVkt4VXpGVGNWT3hWUEZWTVZWeFZmRldNVlp4VjNGWHNWZ3hXSEZaTVZveFhERmNjVnp4WFRGZGNWOHhYM0ZnTVdFeFlmRmpNV054WS9Ga2NXVnhaZkZtTVdjeGFERnFjVzB4YlhGdU1XNXhidkZ2TVc5eGI3RnhNWEZ4Y2JGeDhYSXhjbkZ5c1hNeGM3RjBNWFJ4ZFRGMk1YZ3hlSEY0OFhseGV6RjdjWHV4ZkRGOU1YMnhmZkYvTVg5eGY3Ri84VUF4Z0hHQmNZR3hnZkdDTVlNeGhER0dNWVp4aHZHSE1Za3hpWEdLTVlzeGkzR0xzWXd4alBHTk1ZMXhqZkdPY1k3eGtER1FjWkV4a2pHVU1aUnhsUEdWTVpWeGx6R1hjWmd4bXpHYjhaeHhuakdlY1o4eG9ER2lNYUp4b3ZHamNhVXhwWEdtTWFjeHFUR3BjYW54cW5Hc01heHhyVEd1TWE1eHJyR3dNYkJ4c1BHeGNiTXhzM0cwTWJVeHR6RzNjYmd4dUhHNk1icHh1ekc4TWI0eHZuRy9jWUV4d1hIQ01jTXh4VEhGY2NYeHhuSElNY2h4eVRIS01jd3h6SEhNOGMxeHpmSFBNYzl4MERIUk1kS3gwekhUY2RQeDFISFVzZFR4MVRIVmNkV3gxZkhXTWRjeDJESGFNZHJ4M1RIZGNkNHgzekhmY2QreDRQSGhNZUZ4NGZIaU1lSng0ckhqc2VReDVISGxNZVd4NWZIbU1lYXg2REhvY2VqeDZUSHBjZW14NnpIcmNld3g3VEh2TWU5eDcvSHdNZkJ4OGpIeWNmTXg4N0gwTWZZeDkzSDVNZm94K3pIQU1nQnlBVElDTWdLeUJESUVjZ1R5QlhJRnNnY3lCM0lJTWdreUN6SUxjZ3Z5REhJT01nOHlFRElTTWhKeUV6SVRjaFV5SERJY2NoMHlIakllc2lBeUlISWc4aUZ5SWJJaDhpTHlJeklqY2lVeUozSW44aWh5S2pJdk1pOXlNVEl5TWpNeU5USTFjalh5Tm5JNE1qaHlPVEk5Y2o4eVAzSUFNa0V5UVhKQnNrTXlRM0pEOGtSeVJqSkxNazB5VkRKVWNsVXlWakpZTWxoeVdQSmJNbHd5WFRKZk1tSXlZbkpqTW1ReVpqSm1jbWJ5WjNKd01uQnljVEp4OG5JeWNySjBNblJ5ZFBKMWNuV3lkbkoyc25jeWQzSjRNbml5ZVRKNThuc3llM0o3OG53eWZISitNbjV5ZnpKQU1vSXlnbktDOG9NeWczS0ZNb1l5aW5LVE1wTnlsREtWTXBjeWwzS1g4cGd5bUhLYU1wOXlvVEttTXE4eXIzS3dNckV5c3pLemNyUHl0SEswOHJZeXRuSzRNcnN5dlRLQ01zUXl4VExHTXNneXlITFFjdEl5MG5MVE10UXkxakxXY3RkeTJUTGVNdDV5NXpMdU12VXkrVEw1OHZweXd6TURjd1F6QlRNSE13ZHpDSE1Jc3duekNqTUtjd3N6QzdNTU13NHpEbk1POHc4ekQzTVBzeEV6RVhNU014TXpGVE1WY3hYekZqTVdjeGd6R1RNWnN4b3pIRE1kY3lZekpuTW5NeWd6S2pNcWN5cnpLek1yY3kwekxYTXVNeTh6TVRNeGN6SHpNbk0wTXpVek9UTTdNend6QUhOQ00wSnpRek5FTTBZelJuTkc4MGR6U1ROS00wc3pUbk5YTTFneldUTmJNMXR6Vy9OY2MxNHpZak5sTTJWelpqTm5NMmt6YVhOcDgycHpiRE54TTNNemRETjZNM3N6ZkROK00zNXpmdk4vYzBFemdqT0RNNFV6aG5PSU00aHppVE9LTTR3empIT004NDF6bGpPV2M1Y3psL09ZTTVoem1qT2FjNXJ6bTNPZE01MXpuak9mTTZFem9YT2g4Nkp6cERPa2M2VXpwak9vTTZoenFQT3BNNmx6cXpPcmM3Qnp1VE81YzdvenV2TzdNNzB6dlhPOTg3NHp2bk9BTThCendUUENNOFF6eEhQRTg4Vnp4elBJTThrenl6UExjOHZ6ekRQTWM4NHoxVFBWYzlZejF6UFpNOWx6MmZQYWM5d3ozSFBkTTk0ejREUGhjK016NkhQcU0rd3o4VFA0TS9oeitUUDZNL3d6L0hQODgvMXovelBBTkFFMEJIUUdOQXQwRFRRTmRBNDBEelFSTkJGMEVmUVNkQlEwRlRRV05CZzBHelFiZEJ3MEhUUWZOQjkwSUhRcE5DbDBLalFyTkMwMExYUXQ5QzUwTURRd2RERTBNalF5ZERRME5IUTA5RFUwTlhRM05EZDBPRFE1TkRzME8zUTc5RHcwUEhRK05BTjBURFJNZEUwMFRqUk90RkEwVUhSUTlGRTBVWFJUTkZOMFZEUlZORmMwVjNSWDlGaDBXalJiTkY4MFlUUmlOR2cwYUhScE5HbzBiRFJzZEd6MGJYUnV0RzgwY0RSMk5IMDBmalJCOUlKMGhEU0xOSXQwakRTTk5JODBqM1NQOUpCMGtqU1hOSmswb0RTZ2RLRTBvalNrTktSMHBYU25OS2cwcVRTck5LeDByalN1ZEs4MHIvU3dOTEMwc2pTeWRMTDB0VFMyTkxjMHVUUzVkTHcwdkhTOU5MNDBnRFRBZE1EMHdYVEROTU4wdzdURU5NVTB4YlRITk1kMHgvVElOTWgweVhUS05NcDB5elRNTk00MHpuVE85TTgwejNUUk5ORjAzelRmZE9BMDRUVGpOT04wNC9Ua05PUjA1alRtZE9jMDZEVHFOT3AwNnZUcmRPMDA3alR2TlBFMDhYVHlOUEowOURUMk5QaDArUFQ3TlB0MC9EVDlOUDgwLzNULzlNQjFBalVIZFJBMUVUVVhOUmcxR1RVYmRSdjFIalVlZFI4MUgvVWdOU0MxSWpVaWRTTDFJM1VsTlNwMU16VTBOVFUxTnpVMzlUbzFPelU4TlQ0MVB2VS9kUUUxUWpWRE5VVTFSWFZGOVU4MVQzVlFOVkUxVXpWVGRWUDFWSFZXTlZaMVZ6VllOVmwxV2pWYWRWcjFXM1ZkTlYxMVhqVmZOV0UxWVhWaDlXSTFZblZrTldsMWNqVnlkWE0xZERWMHRYWTFkblYyOVhkMWVUVjVkWG8xZXpWOU5YMTFmZlYrZFVBMWdIV0JOWUkxaERXRWRZVDFoVFdGZFljMWlEV0pOWXQxampXT2RZODFrRFdSZFpJMWtuV1M5Wk4xbEhXVk5aVjFsaldYTlpuMW1uV2NOWngxblRXZzlhRjFveldqZGFRMXBUV25kYWYxcUhXcU5hczFyRFd1ZGE3MXNUV3hkYkkxc3pXMGRiVTF0ZlcyZGJnMXVUVzZOYncxdlhXL05iOTFnRFhCTmNSMXhqWEdkY2MxeURYS05jcDF5dlhMZGMwMXpYWE9OYzgxMFRYUjlkSjExRFhVZGRVMTFiWFY5ZFkxMW5YWU5kaDEyUFhaZGRwMTJ6WGNOZDAxM3pYZmRlQjE0alhpZGVNMTVEWG1OZVoxNXZYbmRjOVQzTlBSMUQ1VUtCUzcxTjFWT1ZVQ1ZiQldyWmJoMmEyWjdkbjcyZE1hOEp6d25VOGV0dUNCSU5YaUlpSU5vcklqTStOKzQ3bWo5V1pPMUowVXdSVWFtQmtZYnhyejNNYWdicUowb21qbFlOUENsSytXSGhaNWxseVhubGV4MkhBWTBabjdHZC9hSmR2VG5ZTGQvVjRDSHIvZWlGOG5ZQnVnbkdDNjRxVGxXdE9uVlgzWmpSdW8zanRlbHVFRUlsT2g2aVgyRkpPVnlwWVRGMGZZYjVoSVdKaVpkRm5SR29iYmhoMXMzWGpkckIzT24ydmtGR1VVcFNWbnlOVHJGd3lkZHVBUUpLWWxWdFNDRmpjV2FGY0YxMjNYanBmU2w5M1lWOXNlbldHZGVCOGMzMnhmWXgvVklFaGdwR0ZRWWtiaS95U1RaWkhuTXRPOTA0TFVQRlJUMWczWVQ1aGFHRTVaZXBwRVcrbGRZWjIxbmFIZTZXQ3k0UUErYWVUaTVXQVZhSmJVVmNCK2JOOHVYKzFrU2hRdTFORlhPaGQwbUp1WTlwazUyUWdicXh3VzNuZGpSNk9Bdmw5a0VXUytKSitUdlpPWlZEK1hmcGVCbUZYYVhHQlZJWkhqbldUSzVwZVRwRlFjR2RBYUFsUmpWS1NVcUpxdkhjUWt0U2VxMUl2WVBLUFNGQ3BZZTFqeW1ROGFJUnF3RytJZ2FHSmxKWUZXSDF5ckhJRWRYbDliWDZwZ0l1SmRJdGprRkdkaVdKNmJGUnZVSDA2ZnlPS2ZGRktZWjE3R1l0WGtveVRyRTdUVHg1UXZsQUdVY0ZTelZKL1UzQlhnMWlhWHBGZmRtR3NZYzVrYkdWdlpydG05R2FYYUlkdGhYRHhjSjkwcFhUS2RObDFiSGpzZU45NjlucEZmWk45RllBL2dCdUJsb05taXhXUEZaRGhrd09ZT0poYW11aWJ3azlUVlRwWVVWbGpXMFpjdUdBU1lrSm9zR2pvYUtwdVRIVjRkczU0UFhyN2ZHdCtmSDRJaXFHS1A0eU9sc1NkNUZQcFUwcFVjVlQ2VnRGWlpGczdYS3RlOTJJM1pVVmxjbVdnWnE5bndXbTliUHgxa0haK2R6OTZsSDhEZ0tHQWo0SG1ndjJDOElQQmhUR0l0SWlsaWdQNW5JOHVrOGVXWjVqWW1oT2Y3VlNiWmZKbWoyaEFlamVNWUozd1ZtUlhFVjBHWnJGb3pXaitiaWgwbm9qa20yaHNCUG1vbXB0UGJGRnhVWjlTVkZ2bFhWQmdiV0R4WXFkak8yWFpjM3A2bzRhaWpJK1hNazdoV3doaW5HZmNkTkY1MDRPSGlyS0s2STFPa0V1VFJwalRYdWhwLzRYdGtBWDVvRkdZVyt4YlkySDZhRDVyVEhBdmROaDBvWHRRZjhXRHdJbXJqTnlWS0prdVVsMWc3R0lDa0lwUFNWRWhVOWxZNDE3Z1pqaHRtbkRDY3RaelVIdnhnRnVVWmxPYlkydC9WazZBVUVwWTNsZ3FZQ2RoMEdMUWFVR2JqMXNZZmJHQVg0K2tUdEZRckZTc1ZReGJvRjNuWFNwbFRtVWhhRXRxNFhLT2R1OTNYbjM1ZjZDQlRvWGZoZ09QVG8vS2tBT1pWWnFybXhoT1JVNWRUc2RPOFU5M1VmNVNRRlBqVStWVGpsUVVWblZYb2xmSFc0ZGQwRjc4WWRoaVVXVzRaK2xueTJsUWE4WnI3R3RDYkoxdWVIRFhjcFp6QTNTL2QrbDNkbnAvZlFtQS9JRUZnZ3FDMzRKaWlET0wvSXpBamhHUXNaQmtrcmFTMHBsRm11bWMxNTJjbnd0WFFGektnNkNYcTVlMG5odFVtSHFrZjltSXpZN2hrQUJZU0Z5WVk1OTZybHNUWDNsNnJucU9ncXlPSmxBNFV2aFNkMU1JVi9OaWNtTUthOE50TjNlbFUxZHphSVYyanRXVk9tZkRhbkJ2YllyTWprdVpCdmwzWm5ocnRJdzhtd2Y1NjFNdFYwNVp4bVA3YWVwelJYaTZlc1Y2L254MWhJK0pjNDAxa0tpVisxSkhWMGQxWUh2TWd4NlNDUGxZYWt0UlMxS0hVaDlpMkdoMWFabVd4VkNrVXVSU3cyR2taVGxvLzJsK2RFdDd1WUxyZzdLSk9ZdlJqMG1aQ2ZuS1RwZFowbVFSWm81cU5IU0JlYjE1cVlKK2lIK0lYNGtLK1NhVEMwL0tVeVZnY1dKeWJCcDlabjJZVG1KUjNIZXZnQUZQRGs5MlVZQlIzRlZvVmp0WCtsZjhWeFJaUjFtVFdjUmJrRndPWGZGZGZsN01YNEJpMTJYalpSNW5IMmRlWjh0b3hHaGZhanBySTJ4OWJJSnN4MjJZY3laMEtuU0NkS04wZUhWL2RZRjQ3M2hCZVVkNVNIbDZlWlY3QUgyNmZZaC9Cb0F0Z0l5QUdJcFBpMGlNZDQwaGt5U1Q0cGhSbVE2YUQ1cGxtcEtleW4xMlR3bFU3bUpVYU5HUnExVTZVUXY1RFBrY1d1WmhEZm5QWXY5aUR2a1ArUkQ1RWZrUytSUDVvNUFVK1JYNUZ2a1grUmo1L29vWitScjVHL2tjK1pabUhmbFdjUjc1SC9uamxpRDVUMk42WTFkVElmbVBaMkJwYzI0aStUZDFJL2trK1NYNURYMG0rU2Y1Y29qS1ZoaGFLUGtwK1NyNUsva3MrVU5PTGZsblVVaFo4R2NRZ0M3NWMxbDBYcHBreW5uMVgyeGd5R0o3WStkYjExdXFVaS81ZEZrcFh4SmdNUGt4K1RMNVdYUXorVFQ1TmZrMitUZjVPUG5SbVRuNU92azcrVHo1UGZrKytULzVRUGxCK1VMNVEvbkRiMFQ1UmZtL2diS1A4V0JHK1VmNVpvRkkrVW41UDF4SytVdjVUUGxOK1U3NVQvbFErVkg1NlZvbGludG5FSDFTK1ZQNVZQbFYrVmI1Vi9uOWdGajVXZms4WE9Wc1AxTzZiaHBaTm9NNVRyWk9Sayt1VlJoWHgxaFdYN2RsNW1XQWFyVnJUVzd0ZCs5NkhuemVmY3VHa29neWtWdVR1MlMrYjNwenVIVlVrRlpWVFZlNllkUmt4MmJoYlZ0dWJXKzViL0IxUTRDOWdVR0ZnNG5IaWxxTEg1T1RiRk4xVkhzUGpsMlFFRlVDV0ZoWVlsNEhZcDVrNEdoMmRkWjhzNGZvbnVOT2lGZHVWeWRaRFZ5eFhEWmVoVjgwWXVGa3MzUDZnWXVJdUl5S2x0dWVoVnUzWDdOZ0VsQUFVakJTRmxjMVdGZFlEbHhnWFBaY2kxMm1YcEpmdkdBUlk0bGpGMlJEYVBsb3dtclliU0Z1MUc3a2IvNXgzSFo1ZDdGNU8zb0VoS21KN1l6empVaU9BNUFVa0ZPUS9aQk5rM2FXM0pmU2F3WndXSEtpY21oelkzZS9lZVI3bTM2QWk2bFl4MkJtWmYxbHZtYU1iQjV4eVhGYWpCT1liVTZCZXQxT3JGSE5VZFZTREZTbllYRm5VR2pmYUI1dGZHKzhkYk4zNVhyMGdHT0VoWkpjVVpkbFhHZVRaOWgxeDNwemcxcjVSb3dYa0MyWWIxekFnWnFDUVpCdmtBMlNsMStkWFZscXlIRjdka2w3NUlVRWl5ZVJNSnFIVmZaaFcvbHBkb1YvUDRhNmgvaUlqNUJjK1J0dDJYRGVjMkY5UFlSZCtXcVI4WmxlK1lKT2RWTUVheEpyUG5BYmNpMkdIcDVNVXFPUFVGM2xaQ3hsRm12cmIwTjhuSDdOaFdTSnZZbkpZdGlCSDRqS1hoZG5hbTM4Y2dWMGIzU0NoOTZRaGs4TlhhQmZDb1MzVWFCalpYV3VUZ1pRYVZISlVZRm9FV3F1ZkxGODUzeHZndEtLRzQvUGtiWlBOMUgxVWtKVTdGNXVZVDVpeFdYYWF2NXZLbm5jaFNPSXJaVmltbXFhbDU3T25wdFN4bVozYXgxd0szbGlqMEtYa0dFQVlpTmxJMjlKY1lsMDlIMXZnTzZFSm84amtFcVR2VkVYVXFOU0RHM0ljTUtJeVY2Q1phNXJ3bTgrZkhWejVFNDJUL2xXWC9tNlhMcGRIR0N5Y3kxN21uL09mMGFBSHBBMGt2YVdTSmNZbUdHZmkwK25iNjU1dEpHM2x0NVNZUG1JWk1SazAycGVieGh3RUhMbmRnR0FCb1pjaHUrTkJZOHlsMitiK3AxMW5veDRmM21nZmNtREJKTi9ucE9lMW9yZldBUmZKMmNuY005MFlIeCtnQ0ZSS0hCaWNzcDR3b3phalBTTTk1YUdUdHBRN2x2V1hwbGx6bkZDZHExM1NvRDhoSHlRSjV1Tm45aFlRVnBpWEJOcTJtMFBienQyTDMwM2ZoNkZPSW5razB1V2lWTFNaZk5udEdsQmJaeHVEM0FKZEdCMFdYVWtkbXQ0TEl0ZW1HMVJMbUo0bHBaUEsxQVpYZXB0dUgwcWo0dGZSR0VYYUdINWhwYlNVb3VBM0ZITVVWNXBISHErZmZHRGRaYmFUeWxTbUZNUFZBNVZaVnluWUU1bnFHaHNiWUZ5K0hJR2RJTjBZdm5pZFd4OGVYKzRmNG1EejRqaGlNeVIwSkhpbHNtYkhWUitiOUJ4bUhUNmhhcU9vNVpYbkorZWwyZkxiVE4wNklFV2x5eDR5M29nZTVKOGFXUnFkUEoxdkhqb2VLeVpWSnU3bnQ1YlZWNGdiNXlCcTRPSWtBZE9UVk1wV3RKZFRsOWlZVDFqYVdiOFp2OXVLMjlqY0o1M0xJUVRoVHVJRTQ5Rm1UdWNIRlc1WWl0bnEyd0pnMnFKZXBlaFRvUloyRi9aWHh0bnNuMVVmNUtDSzRPOWd4NlBtWkRMVjdsWmtsclFXeWRtbW1lRmFNOXJaSEYxZjdlTTQ0eUJrRVdiQ0lHS2pFeVdRSnFsbmw5YkUyd2JjL0oyMzNZTWhLcFJrNGxOVVpWUnlWTEphSlJzQkhjZ2Q3OTk3SDFpbDdXZXhXNFJoYVZSRFZSOVZBNW1uV1luYVo5dXYzYVJkeGVEd29TZmgybVJtSkwwbklLSXJrK1NVZDlTeGxrOVhsVmhlR1I1Wks1bTBHY2hhczFyMjJ0ZmNtRnlRWFE0ZDl0M0Y0QzhnZ1dEQUlzb2k0eU1LR2VRYkdkeTduWm1kMFo2cVoxL2E1SnNJbGttWjVtRWIxT1RXSmxaMzE3UFl6Um1jMmM2Yml0ejEzclhnaWlUMlZMclhhNWh5MkVLWXNkaXEyVGdaVmxwWm12TGF5Rng5M05kZFVaK0hvSUNnMnFGbzRxL2pDZVhZWjJvV05pZUVWQU9VanRVVDFXSFpYWnNDbjBMZlY2QWlvYUFsZStXLzFLVmJHbHljMVNhV2o1Y1MxMU1YNjVmS21lMmFHTnBQRzVFYmdsM2MzeU9mNGVGRG92M2oyR1g5SjYzWExaZ0RXR3JZVTlsKzJYOFpSRnM3MnlmYzhsejRYMlVsY1piSEljUWkxMVNXbFBOWWc5a3NtUTBaemhxeW16QWM1NTBsSHVWZkJ0K2lvRTJnb1NGNjQvNWxzR1pORTlLVTgxVDIxUE1ZaXhrQUdXUlpjTnA3bXhZYisxelZIVWlkdVIyL0hiUWVQdDRMSGxHZlN5QzRJZlVqeEtZNzVqRFV0UmlwV1FrYmxGdmZIYkxqYkdSWXBMdW1rT2JJMUNOVUVwWHFGa29YRWRlZDE4L1lqNWx1V1hCWlFsbWkyZWNhY0p1eFhnaGZhcUFnSUVyZ3JPQ29ZU01oaXFLRjR1bWtES1drSjhOVVBOUFkvbjVWNWhmM0dLU1kyOW5RMjRaY2NOMnpJRGFnUFNJOVlnWmllQ01LWTlOa1dxV0wwOXdUeHRlejJjaWFIMTJmblpFbTJGZUNtcHBjZFJ4YW5WaytVRitRNFhwaGR5WUVFOVBlM0IvcFpYaFVRWmV0V2crYkU1czIyeXZjc1I3QTRQVmJEcDArMUNJVXNGWTJHU1hhcWQwVm5hbmVCZUc0cFU1bDJYNVhsTUJYNHFMcUkrdmo0cVFKVktsZDBtY0NKOFpUZ0pRZFZGYlhIZGVIbVk2WnNSbnhXaXpjQUYxeFhYSmVkMTZKNDhnbVFpYTNVOGhXREZZOWx0dVptVnJFVzE2Ym4xdjVITXJkZW1EM0lnVGlWeUxGSThQVDlWUUVGTmNVNU5icVY4Tlo0OTVlWUV2Z3hTRkI0bUdpVG1QTzQrbG1SS2NMR2QyVHZoUFNWa0JYTzljOEZ4blk5Sm8vWENpY1N0MEszN3NoQUtISXBEU2t2T2NEVTdZVHU5UGhWQldVbTlTSmxTUVZPQlhLMWxtV2xwYmRWdk1XNXhlWnZsMlluZGxwMlZ1YmFWdU5uSW1lejk4Tm45UWdWR0Jtb0ZBZ3BtQ3FZTURpcUNNNW96N2pIU051bzNva055UkhKWkVsdG1aNTV3WFV3WlNLVlIwVnJOWVZGbHVXZjlmcEdGdVloQm1mbXdhY2NaMmlYemVmQnQ5cklMQmpQQ1daL2xiVHhkZmYxL0NZaWxkQzJmYWFIeDRRMzVzblJWT21WQVZVeXBUVVZPRFdXSmFoMTZ5WUlwaFNXSjVZcEJsaDJlbmFkUnIxbXZYYTlocnVHeG8rVFYwK25VU2VKRjQxWG5ZZVlOOHkzM2hmNldBUG9IQ2dmS0RHb2ZvaUxtS2JJdTdqQm1SWHBmYm1EdWZyRllxVzJ4ZmpHV3phcTlyWEczeGJ4VndYWEt0YzZlTTA0dzdtSkZoTjJ4WWdBR2FUVTZMVHB0TzFVNDZUenhQZjAvZlQvOVE4bFA0VXdaVjQxWGJWdXRZWWxrUld1dGIrbHNFWFBOZEsxNlpYeDFnYUdPY1phOWw5bWY3WjYxb2UydVpiTmRzSTI0SmNFVnpBbmcrZVVCNVlIbkJlZWw3RjMxeWZZYUFEWUtPZzlHRXg0YmZpRkNLWG9vZGk5eU1abzJ0ajZxUS9KamZtWjJlU2xKcCtSUm5hdm1ZVUNwU2NWeGpaVlZzeW5NamRaMTFsM3VjaEhpUk1KZDNUcEprdW10ZWNhbUZDVTVyK1VsbjdtZ1hicCtDR0lWcmlQZGpnVzhTa3ErWUNrNjNVTTlRSDFGR1ZhcFZGMVpBV3hsYzRGdzRYb3Blb0Y3Q1h2TmdVV2hoYWxodVBYSkFjc0J5K0habGViRjcxSC96aVBTSmM0cGhqTjZNSEpkZVdMMTAvWXpIVld6NVlYb2lmWEtDY25JZmRTVjFiZmtaZTRWWSsxaThYWTlldGw2UVgxVmdrbUovWTAxbGtXYlpadmhtRm1qeWFJQnlYblJ1ZTI1OTFuMXlmK1dBRW9LdmhYK0prNG9ka09TU3paNGdueFZaYlZrdFh0eGdGR1p6WnBCblVHekZiVjl2ODNlcGVNYUV5NUVyazlsT3lsQklVWVJWQzF1alcwZGlmbVhMWlRKdWZYRUJkRVIwaDNTL2RHeDJxbm5hZlZWK3FIOTZnYk9CT1lJYWh1eUhkWXJqalhpUWtaSWxsRTJacnB0b1UxRmNWR25FYkNsdEsyNE1ncHVGTzRrdGlxcUs2cFpubjJGU3VXYXlhNVorL29jTmpZT1ZYWllkWllsdDduRnUrYzVYMDFtc1d5ZGcrbUFRWWg5bVgyWXBjL2x6MjNZQmQyeDdWb0J5Z0dXQm9JcVNrUlpPNGxKeWF4ZHRCWG81ZXpCOWIvbXdqT3hUTDFaUldMVmJEMXdSWE9KZFFHS0RZeFJrTFdhemFMeHNpRzJ2Ymg5d3BIRFNjU1oxajNXT2RSbDJFWHZnZXl0OElIMDVmU3lGYllVSGhqU0tEWkJoa0xXUXQ1TDJsemVhMTA5c1hGOW5rVzJmZkl4K0Zvc1dqUitRYTF2OVhRMWt3SVJja09HWWgzT0xXNXBnZm1mZWJSK0twb29Ca0F5WU4xSncrVkZ3am5pV2szQ0kxNUh1VDlkVC9WWGFWb0pYL1ZqQ1dvaGJxMXpBWENWZUFXRU5Za3RpaUdNY1pEWmxlR1U1YW9wck5Hd1piVEZ2NTNIcGNuaHpCM1N5ZENaMllYZkFlVmQ2Nm5xNWZJOTlySDFoZnA1L0tZRXhnNUNFMm9UcWhaYUlzSXFRaXppUFFwQ0RrR3lSbHBLNWtvdVdwNWFvbHRhV0FKY0ltSmFaMDVvYW05UlRmbGdaV1hCYnYxdlJiVnB2bjNFaGRMbDBoWUQ5ZytGZGgxK3FYMEpnN0dVU2FHOXBVMnFKYXpWdDgyM2pjLzUyckhkTmV4UjlJNEVjZ2tDRDlJUmpoV0tLeElxSGtSNlRCcGkwbVF4aVU0andqMldTQjEwblhXbGRYM1NkZ1dpSDFXLytZdEovTm9seWlSNU9XRTduVU4xU1IxTi9ZZ2RtYVg0RmlGNldqVThaVXpaV3kxbWtXamhjVGx4TlhBSmVFVjlEWUwxbEwyWkNacjVuOUdjY2MrSjNPbm5GZjVTRXpZU1dpV2FLYVlyaGlsV01lb3owVjlSYkQxOXZZTzFpRFdtV2ExeHVoSEhTZTFXSFdJditqdCtZL3BnNFQ0RlA0VTk3VkNCYXVGczhZYkJsYUdiOGNUTjFYbmt6ZlU2QjQ0R1lnNnFGem9VRGh3cUtxNDZiajNINXhZOHhXYVJiNWx1SllPbGJDMXpEWDRGc2N2bnhiUXR3R25Xdmd2YUt3RTVCVTNQNTJaWVBiSjVPeEU5U1VWNVZKVnJvWEJGaVdYSzlncXFEL29aWmlCMktQNWJGbGhPWkNaMWRuUXBZczF5OVhVUmU0V0FWWWVGakFtb2xiZ0tSVkpOT21CQ2NkNStKVzdoY0NXTlBaa2hvUEhmQmxvMlhWSmlmbTZGbEFZdkxqcnlWTlZXcFhOWmR0VjZYWmt4MjlJUEhsZE5ZdkdMT2NpaWQ4RTR1V1E5Z08yYURhK2Q1SnAyVFU4QlV3MWNXWFJ0aDFtYXZiWTE0Zm9LWWxrU1hoRk44WXBaanNtMEtma3VCVFpqN2FreC9yNTBhbmw5T08xQzJVUnhaK1dEMll6QnBPbkkyZ0hUNXpwRXhYM1g1ZHZrRWZlV0NiNFM3aE9XRmpZNTMrVzlQZVBsNStlUllRMXRaWU5wakdHVnRaWmhtZXZsS2FTTnFDMjBCY0d4eDBuVU5kck41Y0hwNytZcC9mUGxFaVgzNWs0dkFrWDJXZnZrS21RUlhvVis4WlFGdkFIYW1lWjZLclpsYW0yeWZCRkcyWVpGaWpXckdnVU5RTUZobVh3bHhBSXI2aW54YkZvYjZUenhSdEZaRVdhbGorVzJxWFcxcGhsR0lUbGxQZi9tQStZSDVnbG1DK1lQNVgydGRiSVQ1dFhRV2VZWDVCNEpGZ2ptRFA0OWRqNGI1R0ptSCtZajVpZm1tVG9yNTMxZDVYeE5taS9tTSthdDFlWDV2aTQzNUJwQmJtcVZXSjFqNFdSOWF0RnVPK2ZaZWovbVErVkJqTzJPUitUMXBoMnkvYkk1dGsyMzFiUlJ2a3ZuZmNEWnhXWEdUK2NOeDFYR1UrVTk0YjNpVitYVjc0MzJXK1M5K2wvbE5pTitPbVBtWitacjVXNUtiK2ZhY25QbWQrWjc1aFdDRmJaLzVzWEdnK2FINXNaV3RVNkw1by9taytkTm5wZm1PY0RCeE1IUjJndEtDcHZtN2xlV2FmWjdFWnFmNXdYRkpoS2o1cWZsTFdLcjVxL200WFhGZnJQa2dabzVtZVdtdWFUaHM4MncyYmtGdjJtOGJjQzl3VUhIZmNYQnpyZmxiZEs3NTFIVElkazU2azM2ditiRDU4WUpnaXM2UHNmbElrN0w1R1pleitiVDVRazRxVUxYNUNGTGhVL05tYld6S2J3cHpmM2RpZXE2QzNZVUNocmI1MUloamluMkxhNHkzK2JPU3VQa1RseENZbEU0TlQ4bFBzbEJJVXo1VU0xVGFWV0pZdWxobldSdGE1RnVmWUxuNXltRldaZjlsWkdhbmFGcHNzMi9QY0t4eFVuTjlld2lIcElveW5BZWZTMXlEYkVSemlYTTZrcXR1WlhRZmRtbDZGWDRLaGtCUnhWakJaTzUwRlhWd2RzRi9sWkRObGxTWkptN21kS2w2cW5ybGdkbUdlSWNiaWtsYWpGdWJXNkZvQUdsamJhbHpFM1FzZEpkNDZYM3JmeGlCVllHZWcweU1McFlSbVBCbWdGLzZaWWxuYW15TGN5MVFBMXBxYSs1M0ZsbHNYYzFkSlhOUGRicjV1L25sVVBsUkwxZ3RXWlpaMmxubFc3ejV2Zm1pWGRkaUZtU1RaUDVrdnZuY1pyLzVTR3JBK2Y5eFpIVEIrWWg2cjNwSGZsNStBSUJ3Z2NMNTc0ZUJpU0NMV1pERCtZQ1FVcGwrWVRKcmRHMGZmaVdKc1kvUlQ2MVFsMUhIVXNkWGlWaTVXN2hlUW1HVmFZeHRaMjYyYnBSeFluUW9kU3gxYzRBNGc4bUVDbzZVazk2VHhQbU9UbEZQZGxBcVVjaFR5MVB6VTRkYjAxc2tYQnBoZ21IMFpWdHlsM05BZE1KMlVIbVJlYmw1Qm4yOWY0dUMxWVZlaHNLUFI1RDFrT3FSaFpib2x1bVcxbEpuWCsxbE1XWXZhRnh4Tm5yQmtBcVlrVTdGK1ZKcW5tdVFiNGx4R0lDNGdsT0ZTNUNWbHZLVys1Y2FoVEdia0U2S2NjU1dRMUdmVStGVUUxY1NWNk5YbTFyRVdzTmJLR0EvWWZSamhXdzViWEp1a0c0d2NqOXpWM1RSZ29HSVJZOWdrTWI1WXBaWW1CdWRDR2VLalY2U1RVOUpVTjVRY1ZNTlY5UlpBVm9KWEhCaGtHWXRiakp5UzNUdmZjT0FEb1JtaEQrRlg0ZGJpQmlKQW90VmtNdVhUNXR6VHBGUEVsRnFVY2Y1TDFXcFZYcGJwVnQ4WG4xZXZsNmdZTjlnQ0dFSlljUmpPR1VKWjhqNTFHZmFaOG41WVdsaWFibHNKMjNLK1RodXkvbmhielp6TjNQTStWeDBNWFhOK1ZKMnp2blArYTE5L29FNGhOV0ltSXJiaXUyS01JNUNqa3FRUHBCNmtFbVJ5WkZ1azlENTBma0pXTkw1MDJ1SmdMS0EwL25VK1VGUmExazVYTlg1MXZsa2I2ZHo1SUFIamRmNUY1S1BsZGo1MmZuYStkdjVmNEFPWWh4d2FIMk5oOXo1b0ZkcFlFZGh0MnUraW9DU3NaWlpUaDlVNjIwdGhYQ1c4NWZ1bU5aajQyeVJrTjFSeVdHNmdmbWRuVThhVUFCUm5Gc1BZZjloN0dRRmFjVnJrWFhqZDZsL1pJS1BoZnVIWTRpOGluQ0xxNUdNVHVWT0NrL2QrZDc1TjFub1dkLzU4bDBiWDF0ZklXRGcrZUg1NHZuaitUNXk1WFBrK1hCMXpYWGwrZnQ1NXZrTWdET0FoSURoZ2xHRDUvbm8rYjJNczR5SGtPbjU2dm4wbUF5WjYvbnMrVGR3eW5iS2Y4eC8vSDhhaTdwT3dVNERVbkJUN2ZtOVZPQlcrMW5GV3hWZnpWOXVidTc1Ny9scWZUV0Q4UG1UaG8ySzhmbHRsM2VYOHZueitRQk9XazkrVC9sWTVXV2liamlRc0pPNW1mdE83RmlLV2RsWlFXRDArZlg1RkhyMitVK0R3NHhsVVVSVDkvbjQrZm41elU1cFVsVmJ2NExVVGpwU3FGVEpXZjlaVUZ0WFcxeGJZMkJJWWN0dW1YQnVjWVp6OTNTMWRjRjRLMzBGZ09xQktJTVhoY21GN29ySGpNeVdYRS82VXJ4V3EyVW9abnh3dUhBMWNyMTlqWUpNa2NDV2NwMXhXK2RvbUd0NmI5NTJrVnlyWmx0dnRIc3FmRGFJM0pZSVR0ZE9JRk0wV0x0WTcxaHNXUWRjTTE2RVhqVmZqR095WmxabkgycWphZ3hyUDI5R2N2cjVVSE9MZE9CNnAzeDRnZCtCNTRHS2cyeUVJNFdVaGMrRjNZZ1RqYXlSZDVXY2xvMVJ5VlFvVjdCYlRXSlFaejFvazJnOWJ0TnVmWEFoZnNHSW9Zd0pqMHVmVHA4dGNvOTd6WW9hazBkUFRrOHlVWUJVMEZtVlhyVmlkV2R1YVJkcXJtd2FidGx5S25POWRiaDdOWDNuZ3ZtRFY0VDNoVnVLcjR5SGpobVF1SkRPbGwrZjQxSUtWT0Zhd2x0WVpIVmw5RzdFY3Z2NWhIWk5laHQ3VFh3K2Z0OS9lNE1yaThxTVpJM2hqVitPNm8vNWoybVEwWk5EVDNwUHMxQm9VWGhSVFZKcVVtRllmRmhnV1FoY1ZWemJYcHRnTUdJVGFMOXJDR3l4YjA1eElIUXdkVGgxVVhWeWRreDdpM3V0ZThaN2ozNXVpajZQU1k4L2twT1NJcE1ybFB1V1dwaHJtQjZaQjFJcVlwaGlXVzFrZHNwNndIdDJmV0JUdmx5WFhqaHZ1WENZZkJHWGpwdmVucVZqZW1SMmh3Rk9sVTZ0VGx4UWRWQklWTU5abWx0QVhxMWU5MTZCWDhWZ09tTS9aWFJsekdWMlpuaG0vbWRvYVlscVkydEFiTUJ0NkcwZmJsNXVIbkNoY0k1ei9YTTZkVnQzaDNpT2VRdDZmWHErZkk1OVI0SUNpdXFLbm93dGtVcVIySkZta3N5U0lKTUdsMWFYWEpjQ21BNmZObEtSVW54VkpGZ2RYaDlmakdEUVk2OW8zMjl0ZVN4N3pZRzZoZjJJK0lwRWpvMlJaSmFibGoyWFRKaEtuODVQUmxITFVhbFNNbFlVWDJ0ZnFtUE5aT2xsUVdiNlp2bG1IV2VkYU5kby9Xa1ZiMjV2WjNIbGNTcHlxblE2ZDFaNVdubmZlU0I2bFhxWGZOOThSSDF3Zm9lQSs0V2tobFNLdjRxWmpZR09JSkJ0a09PUk81YlZsdVdjejJVSGZMT053NU5ZV3dwY1VsUFpZaDF6SjFDWFc1NWZzR0JyWWRWbzJXMHVkQzU2UW4yY2ZURithNEVxampXT2ZwTVlsRkJQVUZmbVhhZGVLMk5xZnp0T1QwK1BUMXBRM1ZuRWdHcFVhRlQrVlU5Wm1WdmVYZHBlWFdZeFovRm5LbWpvYkRKdFNtNk5iN2R3NEhPSGRVeDhBbjBzZmFKOUg0TGJoanVLaFlwd2pZcU9NNDh4a0U2UlVwRkVsTkNaK1hxbGZNcFBBVkhHVWNoWDcxdjdYRmxtUFdwYWJaWnU3RzhNY1c5MTQzb2lpQ0dRZFpETGx2K1pBWU10VHZKT1Jvak5rWDFUMjJwcmFVRnNlb1NlV0k1aC9tYnZZdDF3RVhYSGRWSit1SVJKaXdpTlMwN3FVNnRVTUZkQVY5ZGZBV01IWTI5a0wyWG9aWHBtbldleloySnJZR3lhYkN4djVYY2xlRWw1VjNrWmZhS0FBb0h6Z1oyQ3Q0SVloNHlLL1BrRWpiNk5jcEQwZGhsNk4zcFVmbmVBQjFYVVZYVllMMk1pWkVsbVMyWnRhSnRwaEdzbGJiRnV6WE5vZEtGMFczVzVkZUYySG5lTGQrWjVDWDRkZnZ1Qkw0V1hpRHFLMFl6cmpyQ1BNcEN0azJPV2M1WUhsNFJQOFZQcVdjbGFHVjVPYU1aMHZuWHBlWko2bzRIdGh1cU16STN0ajU5bEZXZjkrZmRYVjIvZGZTK1A5cFBHbHJWZjhtR0VieFJPbUU4ZlVNbFQzMVZ2WGU1ZElXdGthOHQ0bW52KytVbU95bzV1a0VsalBtUkFkNFI2TDVOL2xHcWZzR1N2YitaeHFIVGFkTVI2RW55Q2ZySjhtSDZhaXdxTmZaUVFtVXlaT1ZMZlcrWmtMV2N1ZmUxUXcxTjVXRmhoV1dINllheGwyWHFTaTVhTENWQWhVSFZTTVZVOFd1QmVjRjgwWVY1bERHWTJacUptelduRWJqSnZGbk1oZHBONk9ZRlpndGFEdklTMVVQQlh3RnZvVzJsZm9XTW1lTFY5M0lNaGhjZVI5WkdLVWZWblZudXNqTVJSdTFtOVlGV0dIRkQvK1ZSU09seDlZUnBpMDJMeVpLVmx6RzRnZGdxQllJNWZscnVXMzA1RFU1aFZLVm5kWGNWa3lXejZiWlJ6ZjNvYmdxYUY1SXdRam5lUTU1SGhsU0dXeHBmNFVmSlVobFc1WDZSa2lHKzBmUitQVFk4MWxNbFFGbHkrYlB0dEczVzdkejE4Wkh4NWlzS0tIbGkrV1JaZWQyTlNjb3AxYTNmY2lyeU1Fby96WG5SbStHMTlnTUdEeTRwUmw5YWJBUHBEVXY5bWxXM3ZidUI5NW9vdWtGNlExSm9kVW45UzZGU1VZWVJpMjJLaWFCSnBXbWsxYXBKd0puRmRlQUY1RG5uU2VRMTZsb0I0Z3RXQ1NZTkpoWUtNaFkxaWtZdVJycEhEVDlGVzdYSFhkd0NIK0luNFc5WmZVV2Vva09KVFdsajFXNlJnZ1dGZ1pEMStjSUFsaFlPU3JtU3NVQlJkQUdlY1dMMWlxR01PYVhocEhtcHJicnAyeTNtN2dpbUV6NHFvamYyUEVwRkxrWnlSRUpNWWs1cVQyNVkybWcyY0VVNWNkVjE1K25wUmU4bDdMbjdFaEZtT2RJNzRqaENRSldZL2FVTjArbEV1Wjl5ZVJWSGdYNVpzOG9kZGlIZUl0R0MxZ1FPRUJZM1dVemxVTkZZMldqRmNpbkRnZjFxQUJvSHRnYU9OaVpGZm12S2RkRkRFVHFCVCsyQXNibVJjaUU4a1VPUlYyVnhmWG1WZ2xHaTdiTVJ0dm5IVWRmUjFZWFlhZWtsNngzMzdmVzUvOUlHcGhoeVB5WmF6bVZLZlIxTEZVdTJZcW9rRFR0Sm5CbSsxVCtKYmxXZUliSGh0RzNRbmVOMlJmSlBFaCtSNU1YcnJYOVpPcEZRK1ZhNVlwVm53WUZOaTFtSTJaMVZwTllKQWxyR1ozWmtzVUZOVFJGVjhWd0g2V0dJQyt1SmthMmJkWjhGdjcyOGlkRGgwRjRvNGxGRlVCbFptVjBoZm1tRk9hMWh3clhDN2ZaV0thbGtyZ2FKakNIYzlnS3FNVkZndFpMdHBsVnNSWG05dUEvcHBoVXhSOEZNcVdTQmdTMkdHYTNCczhHd2VlODZBMUlMR2piQ1FzWmdFK3Nka3BHK1JaQVJsVGxFUVZCOVhEb3BmWVhab0JmcmJkVko3Y1gwYWtBWll6R2wvZ1NxSkFKQTVtSGhRVjFtc1daVmlENUFxbTExaGVYTFdsV0ZYUmxyMFhZcGlyV1Q2WkhkbjRtdytiU3h5Tm5RMGVIZC9yWUxialJlWUpGSkNWMzluU0hMamRLbU1wbzhSa2lxV2ExSHRVMHhqYVU4RVZaWmdWMldiYkg5dFRITDljaGQ2aDRtZGpHMWZqbS81Y0tpQkRtRy9UMDlRUVdKSGNzZDc2SDNwZjAyUXJaY1ptcmFNYWxkelhyQm5EWVJWaWlCVUZsdGpYdUplQ2wrRFpicUFQWVdKbFZ1V1NFOEZVdzFURDFPR1ZQcFVBMWNEWGhaZ20yS3hZbFZqQnZyaGJHWnRzWFV5ZU42QUw0SGVnbUdFc29TTmlCS0pDNURxa3YyWWtadEZYclJtM1dZUmNBWnlCL3IxVDMxU2FsOVRZVk5uR1dvQ2IrSjBhSGxvaUhtTXg1akVtRU9hd1ZRZmVsTnA5NHBLaktpWXJwbDhYNnRpc25XdWRxdUlmNUJDbGpsVFBGL0ZYOHhzekhOaWRZdDFSbnYrZ3AyWlQwNDhrQXRPVlUrbVV3OVp5RjR3WnJOc1ZYUjNnMmFId0l4UWtCNlhGWnpSV0hoYlVJWVVpN1NkMGx0b1lJMWc4V1ZYYkNKdm8yOGFjRlYvOEgrUmxaS1ZVSmJUbDNKU1JJLzlVU3RVdUZSalZZcFZ1MnExYmRoOVpvS2NrbmVXZVo0SVZNaFUwbmJraHFTVjFKVmNscUpPQ1UvdVdlWmE5MTFTWUpkaWJXZEJhSVpzTDI0NGY1dUFLb0lJK2duNkJaaWxUbFZRczFTVFYxcFphVnV6VzhoaGQybDNiU053K1lmamlYS0s1NHFDa08yWnVKcStVamhvRmxCNFhrOW5SNE5NaUt0T0VWU3VWdVp6RlpIL2x3bVpWNW1abVZOV24xaGJoakdLc21IMmFudHowbzVIYTZxV1Y1cFZXUUJ5YTQxcGw5UlA5RndtWC9oaFcyYnJiS3R3aEhPNWMvNXpLWGROZDBOOVluMGpmamVDVW9nSyt1S01TWkp2bUZGYmRIcEFpQUdZekZyZ1QxUlRQbG45WEQ1amVXMzVjZ1dCQjRHaWc4K1NNSmlvVGtSUkVWS0xWMkpmd216T2JnVndVSEN2Y0pKeDZYTnBkRXFEb29kaGlBaVFvcENqazZpWmJsRlhYK0JnWjJHelpsbUZTbzZ2a1l1WFRrNlNUbnhVMVZqNldIMVp0VnduWHpaaVNHSUtabWRtNjJ0cGJjOXRWbTc0YnBSdjRHL3BiMTF3MEhJbGRGcDA0SFNUZGx4NXlud2VmdUdBcG9KcmhMK0VUb1pmaG5TSGQ0dHFqS3lUQUpobG1ORmdGbUoza1ZwYUQyYjNiVDV1UDNSQ20vMWYybUFQZThSVUdGOWViTk5zS20zWWNBVjllWVlNaWp1ZEZsT01WQVZiT21wcmNIVjFqWG0rZWJHQzc0Tnhpa0dMcUl4MGx3djY5R1FyWmJwNHUzaHJlamhPbWxWUVdhWmJlMTZqWU50allXdGxabE5vR1c1bGNiQjBDSDJFa0dtYUpadzdiZEZ1UG5OQmpNcVY4RkZNWHFoZlRXRDJZREJoVEdGRFprUm1wV25CYkY5dXlXNWliMHh4bkhTSGRzRjdKM3hTZzFlSFVaQ05sc09lTDFQZVZ2dGVpbDlpWUpSZzkyRm1aZ05ubkdydWJhNXZjSEJxYzJwK3ZvRTBnOVNHcUlyRWpJTlNjbk9XVzJ0cUJKVHVWSVpXWFZ0SVpZVmx5V2FmYUkxdHhtMDdjclNBZFpGTm1xOVBHVkNhVXc1VVBGU0pWY1ZWUDE2TVh6MW5abkhkY3dXUTIxTHpVbVJZemxnRWNZOXgrM0d3aFJPS2lHYW9oYWRWaEdaS2NUR0VTVk9aVmNGcldWKzlYKzVqaVdaSGNmR0tIWSsrbmhGUE9tVExjR1oxWjRaa1lFNkwrSjFIVWZaUkNGTTJiZmlBMFo0VlppTnJtSERWZFFOVWVWd0hmUmFLSUdzOWEwWnJPRlJ3WUQxdDFYOElndFpRM2xHY1ZXdFd6VmJzV1FsYkRGNlpZWmhoTVdKZVp1Wm1tWEc1Y2JweHAzS25lUUI2c245d2lnQXdBVEFDTUxjQUpTQW1JS2dBQXpDdEFCVWdKU0k4L3p3aUdDQVpJQndnSFNBVU1CVXdDREFKTUFvd0N6QU1NQTB3RGpBUE1CQXdFVEN4QU5jQTl3QmdJbVFpWlNJZUlqUWlzQUF5SURNZ0F5RXJJZUQvNGYvbC8wSW1RQ1lnSXFVaUVpTUNJZ2NpWVNKU0lxY0FPeUFHSmdVbXl5WFBKYzRseHlYR0phRWxvQ1d6SmJJbHZTVzhKWkloa0NHUklaTWhsQ0VUTUdvaWF5SWFJajBpSFNJMUlpc2lMQ0lJSWdzaWhpS0hJb0lpZ3lJcUlpa2lKeUlvSXVMLzBpSFVJUUFpQXlLMEFGNy94d0xZQXQwQzJnTFpBcmdBMndLaEFMOEEwQUl1SWhFaUR5S2tBQWtoTUNEQkpjQWx0eVcySldRbVlDWmhKbVVtWnlaakpwa2l5Q1dqSmRBbDBTV1NKYVFscFNXb0phY2xwaVdwSldnbUR5WU9KaHdtSGlhMkFDQWdJU0NWSVpjaG1TR1dJWmdoYlNacEptb21iQ1ovTWh3eUZpSEhNeUlod2pQWU15RWhyQ0N1QU1ZQTBBQ3FBQ1lCQUFBeUFRQUFQd0ZCQWRnQVVnRzZBTjRBWmdGS0FlWUFFUUh3QUNjQk1RRXpBVGdCUUFGQ0FmZ0FVd0hmQVA0QVp3RkxBVWtCQUNVQ0pRd2xFQ1VZSlJRbEhDVXNKU1FsTkNVOEpRRWxBeVVQSlJNbEd5VVhKU01sTXlVckpUc2xTeVVnSlM4bEtDVTNKVDhsSFNVd0pTVWxPQ1ZDSlJJbEVTVWFKUmtsRmlVVkpRNGxEU1VlSlI4bElTVWlKU1lsSnlVcEpTb2xMU1V1SlRFbE1pVTFKVFlsT1NVNkpUMGxQaVZBSlVFbFF5VkVKVVVsUmlWSEpVZ2xTU1ZLSlFBQU93QThBRjBBWGdDOEFNWUF5d0RWQU53QTdRRDBBUHdBRFFFVUFSb0JlQUY3QVh3QmZRRitBWUlCakFHTkFaQUJrUUdUQVpRQmxnR2dBYVVCcXdHd0FiRUJzd0cyQWJjQnVBRzdBYndCd0FIQkFjSUJ3d0hFQWNVQnhnSEhBZFlCNWdFQ0Fod0NLd0lzQWk0Q0x3SXdBalFDUkFKZ0Fub0NpUUtLQW93Q2pRS09BcElDNVFMd0FrWURUZ05VQTFVRGJ3TitBNFFEaFFPZkF3SC81djg5LytQL01URndJUUFBWUNFQUFKRURvd01BQUxFRHd3TUFBQUFBbFRNVElaZ3p4RE9qTTVrenlqT05NODh6aURQSU02Y3pzRE9BTTdvemtETW1JY0F6aWpQV004VXpyVFBiTTZrejNUUFFNOU16d3pQSk05d3p4ak1BQUFBQVlETFFKR0FrdlFCVElid0F2Z0JiSVFBQUFES2NKSFFrdVFDeUFIUWdmeUNCSUVFd0FBQ2hNQUFBRUFRQkJCWUVBQUF3QkZFRU5nUUNUZ1JPQlU0TVRoSk9IMDRqVGlST0tFNHJUaTVPTDA0d1RqVk9RRTVCVGtST1IwNVJUbHBPWEU1alRtaE9hVTUwVG5WT2VVNS9UbzFPbGs2WFRwMU9yMDY1VHNOTzBFN2FUdHRPNEU3aFR1Sk82RTd2VHZGTzgwNzFUdjFPL2s3L1RnQlBBazhEVHdoUEMwOE1UeEpQRlU4V1R4ZFBHVTh1VHpGUFlFOHpUelZQTjA4NVR6dFBQazlBVDBKUFNFOUpUMHRQVEU5U1QxUlBWazlZVDE5UFkwOXFUMnhQYms5eFQzZFBlRTk1VDNwUGZVOStUNEZQZ2srRVQ0VlBpVStLVDR4UGprK1FUNUpQazArVVQ1ZFBtVSthVDU1UG4wK3lUN2RQdVUrN1Q3eFB2VSsrVDhCUHdVL0ZUOFpQeUUvSlQ4dFB6RS9OVDg5UDBrL2NUK0JQNGsvd1QvSlAvRS85VC85UEFGQUJVQVJRQjFBS1VBeFFEbEFRVUJOUUYxQVlVQnRRSEZBZFVCNVFJbEFuVUM1UU1GQXlVRE5RTlZCQVVFRlFRbEJGVUVaUVNsQk1VRTVRVVZCU1VGTlFWMUJaVUY5UVlGQmlVR05RWmxCblVHcFFiVkJ3VUhGUU8xQ0JVSU5RaEZDR1VJcFFqbENQVUpCUWtsQ1RVSlJRbGxDYlVKeFFubENmVUtCUW9WQ2lVS3BRcjFDd1VMbFF1bEM5VU1CUXcxREVVTWRRekZET1VOQlEwMURVVU5oUTNGRGRVTjlRNGxEa1VPWlE2RkRwVU85UThWRDJVUHBRL2xBRFVRWlJCMUVJVVF0UkRGRU5VUTVSOGxBUVVSZFJHVkViVVJ4UkhWRWVVU05SSjFFb1VTeFJMVkV2VVRGUk0xRTBVVFZST0ZFNVVVSlJTbEZQVVZOUlZWRlhVVmhSWDFGa1VXWlJmbEdEVVlSUmkxR09VWmhSblZHaFVhTlJyVkc0VWJwUnZGRytVYjlSd2xISVVjOVIwVkhTVWROUjFWSFlVZDVSNGxIbFVlNVI4bEh6VWZSUjkxRUJVZ0pTQlZJU1VoTlNGVklXVWhoU0lsSW9VakZTTWxJMVVqeFNSVkpKVWxWU1YxSllVbHBTWEZKZlVtQlNZVkptVW01U2QxSjRVbmxTZ0ZLQ1VvVlNpbEtNVXBOU2xWS1dVcGRTbUZLYVVweFNwRktsVXFaU3AxS3ZVckJTdGxLM1VyaFN1bEs3VXIxU3dGTEVVc1pTeUZMTVVzOVMwVkxVVXRaUzIxTGNVdUZTNVZMb1V1bFM2bExzVXZCUzhWTDBVdlpTOTFJQVV3TlRDbE1MVXd4VEVWTVRVeGhURzFNY1V4NVRIMU1sVXlkVEtGTXBVeXRUTEZNdFV6QlRNbE0xVXp4VFBWTStVMEpUVEZOTFUxbFRXMU5oVTJOVFpWTnNVMjFUY2xONVUzNVRnMU9IVTRoVGpsT1RVNVJUbVZPZFU2RlRwRk9xVTZ0VHIxT3lVN1JUdFZPM1U3aFR1bE85VThCVHhWUFBVOUpUMDFQVlU5cFQzVlBlVStCVDVsUG5VL1ZUQWxRVFZCcFVJVlFuVkNoVUtsUXZWREZVTkZRMVZFTlVSRlJIVkUxVVQxUmVWR0pVWkZSbVZHZFVhVlJyVkcxVWJsUjBWSDlVZ1ZTRFZJVlVpRlNKVkkxVWtWU1ZWSlpVbkZTZlZLRlVwbFNuVktsVXFsU3RWSzVVc1ZTM1ZMbFV1bFM3Vkw5VXhsVEtWTTFVemxUZ1ZPcFU3RlR2VlBaVS9GVCtWUDlVQUZVQlZRVlZDRlVKVlF4VkRWVU9WUlZWS2xVclZUSlZOVlUyVlR0VlBGVTlWVUZWUjFWSlZVcFZUVlZRVlZGVldGVmFWVnRWWGxWZ1ZXRlZaRlZtVlg5VmdWV0NWWVpWaUZXT1ZZOVZrVldTVlpOVmxGV1hWYU5WcEZXdFZiSlZ2MVhCVmNOVnhsWEpWY3RWekZYT1ZkRlYwbFhUVmRkVjJGWGJWZDVWNGxYcFZmWlYvMVVGVmdoV0NsWU5WZzVXRDFZUVZoRldFbFlaVml4V01GWXpWalZXTjFZNVZqdFdQRlk5Vmo5V1FGWkJWa05XUkZaR1ZrbFdTMVpOVms5V1ZGWmVWbUJXWVZaaVZtTldabFpwVm0xV2IxWnhWbkpXZFZhRVZvVldpRmFMVm94V2xWYVpWcHBXblZhZVZwOVdwbGFuVnFoV3FWYXJWcXhXclZheFZyTld0MWErVnNWV3lWYktWc3RXejFiUVZzeFd6VmJaVnR4VzNWYmZWdUZXNUZibFZ1Wlc1MWJvVnZGVzYxYnRWdlpXOTFZQlZ3SlhCMWNLVnd4WEVWY1ZWeHBYRzFjZFZ5QlhJbGNqVnlSWEpWY3BWeXBYTEZjdVZ5OVhNMWMwVnoxWFBsYy9WMFZYUmxkTVYwMVhVbGRpVjJWWFoxZG9WMnRYYlZkdVYyOVhjRmR4VjNOWGRGZDFWM2RYZVZkNlYzdFhmRmQrVjRGWGcxZU1WNVJYbDFlWlY1cFhuRmVkVjU1WG4xZWhWNVZYcDFlb1Y2bFhyRmU0VjcxWHgxZklWOHhYejFmVlY5MVgzbGZrVitaWDUxZnBWKzFYOEZmMVYvWlgrRmY5Vi81WC8xY0RXQVJZQ0ZnSldPRlhERmdOV0J0WUhsZ2ZXQ0JZSmxnbldDMVlNbGc1V0Q5WVNWaE1XRTFZVDFoUVdGVllYMWhoV0dSWVoxaG9XSGhZZkZoL1dJQllnVmlIV0loWWlWaUtXSXhZalZpUFdKQllsRmlXV0oxWW9GaWhXS0pZcGxpcFdMRllzbGpFV0x4WXdsaklXTTFZemxqUVdOSlkxRmpXV05wWTNWamhXT0pZNlZqeldBVlpCbGtMV1F4WkVsa1RXUlJaUVlZZFdTRlpJMWtrV1NoWkwxa3dXVE5aTlZrMldUOVpRMWxHV1ZKWlUxbFpXVnRaWFZsZVdWOVpZVmxqV1d0WmJWbHZXWEpaZFZsMldYbFplMWw4V1l0WmpGbU9XWkpabFZtWFdaOVpwRm1uV2ExWnJsbXZXYkJaczFtM1dicFp2Rm5CV2NOWnhGbklXY3BaelZuU1dkMVozbG5mV2VOWjVGbm5XZTVaNzFueFdmSlo5Rm4zV1FCYUJGb01XZzFhRGxvU1doTmFIbG9qV2lSYUoxb29XaXBhTFZvd1drUmFSVnBIV2toYVRGcFFXbFZhWGxwaldtVmFaMXB0V25kYWVscDdXbjVhaTFxUVdwTmFsbHFaV3B4YW5scWZXcUJhb2xxbldxeGFzVnF5V3JOYXRWcTRXcnBhdTFxL1dzUmF4bHJJV3M5YTJscmNXdUJhNVZycVd1NWE5VnIyV3YxYUFGc0JXd2hiRjFzMFd4bGJHMXNkV3lGYkpWc3RXemhiUVZ0TFcweGJVbHRXVzE1YmFGdHVXMjliZkZ0OVczNWJmMXVCVzRSYmhsdUtXNDVia0Z1Ulc1TmJsRnVXVzZoYnFWdXNXNjFicjF1eFc3SmJ0MXU2Vzd4YndGdkJXODFiejF2V1c5ZGIyRnZaVzlwYjRGdnZXL0ZiOUZ2OVd3eGNGMXdlWEI5Y0kxd21YQ2xjSzF3c1hDNWNNRnd5WERWY05seFpYRnBjWEZ4aVhHTmNaMXhvWEdsY2JWeHdYSFJjZFZ4NlhIdGNmRng5WElkY2lGeUtYSTlja2x5ZFhKOWNvRnlpWEtOY3BseXFYTEpjdEZ5MVhMcGN5VnpMWE5KYzNWelhYTzVjOFZ6eVhQUmNBVjBHWFExZEVsMHJYU05kSkYwbVhTZGRNVjAwWFRsZFBWMC9YVUpkUTExR1hVaGRWVjFSWFZsZFNsMWZYV0JkWVYxaVhXUmRhbDF0WFhCZGVWMTZYWDVkZjEyQlhZTmRpRjJLWFpKZGsxMlVYWlZkbVYyYlhaOWRvRjJuWGF0ZHNGMjBYYmhkdVYzRFhjZGR5MTNRWGM1ZDJGM1pYZUJkNUYzcFhmaGQrVjBBWGdkZURWNFNYaFJlRlY0WVhoOWVJRjR1WGloZU1sNDFYajVlUzE1UVhrbGVVVjVXWGxoZVcxNWNYbDVlYUY1cVhtdGViRjV0WG01ZWNGNkFYb3Rlamw2aVhxUmVwVjZvWHFwZXJGNnhYck5ldlY2K1hyOWV4bDdNWHN0ZXpsN1JYdEplMUY3Vlh0eGUzbDdsWHV0ZUFsOEdYd2RmQ0Y4T1h4bGZIRjhkWHlGZklsOGpYeVJmS0Y4clh5eGZMbDh3WHpSZk5sODdYejFmUDE5QVgwUmZSVjlIWDAxZlVGOVVYMWhmVzE5Z1gyTmZaRjluWDI5ZmNsOTBYM1ZmZUY5NlgzMWZmbCtKWDQxZmoxK1dYNXhmblYraVg2ZGZxMStrWDZ4ZnIxK3dYN0ZmdUYvRVg4ZGZ5Ri9KWDh0ZjBGL1JYOUpmMDEvVVg5NWY0Vi9pWCtoZjZWL3FYK3hmN1YvdVgrOWY4bC96WC9aZitsLzhYd2RnQ21BTllCTmdGR0FYWUJoZ0dtQWZZQ1JnTFdBellEVmdRR0JIWUVoZ1NXQk1ZRkZnVkdCV1lGZGdYV0JoWUdkZ2NXQitZSDlnZ21DR1lJaGdpbUNPWUpGZ2syQ1ZZSmhnbldDZVlLSmdwR0NsWUtoZ3NHQ3hZTGRndTJDK1lNSmd4R0RJWU1sZ3ltRExZTTVnejJEVVlOVmcyV0RiWU4xZzNtRGlZT1ZnOG1EMVlQaGcvR0Q5WUFKaEIyRUtZUXhoRUdFUllSSmhFMkVVWVJaaEYyRVpZUnhoSG1FaVlTcGhLMkV3WVRGaE5XRTJZVGRoT1dGQllVVmhSbUZKWVY1aFlHRnNZWEpoZUdGN1lYeGhmMkdBWVlGaGcyR0VZWXRoaldHU1laTmhsMkdZWVp4aG5XR2ZZYUJocFdHb1lhcGhyV0c0WWJsaHZHSEFZY0Zod21IT1ljOWgxV0hjWWQxaDNtSGZZZUZoNG1IblllbGg1V0hzWWUxaDcyRUJZZ05pQkdJSFloTmlGV0ljWWlCaUltSWpZaWRpS1dJcllqbGlQV0pDWWtOaVJHSkdZa3hpVUdKUllsSmlWR0pXWWxwaVhHSmtZbTFpYjJKellucGlmV0tOWW81aWoyS1FZcVppcUdLellyWml0Mks2WXI1aXYyTEVZczVpMVdMV1l0cGk2bUx5WXZSaS9HTDlZZ05qQkdNS1l3dGpEV01RWXhOakZtTVlZeWxqS21NdFl6VmpObU01WXp4alFXTkNZME5qUkdOR1kwcGpTMk5PWTFKalUyTlVZMWhqVzJObFkyWmpiR050WTNGamRHTjFZM2hqZkdOOVkzOWpnbU9FWTRkamltT1FZNVJqbFdPWlk1cGpubU9rWTZaanJXT3VZNjlqdldQQlk4Vmp5R1BPWTlGajAyUFVZOVZqM0dQZ1krVmo2bVBzWS9KajgyUDFZL2hqK1dNSlpBcGtFR1FTWkJSa0dHUWVaQ0JrSW1Ra1pDVmtLV1FxWkM5a01HUTFaRDFrUDJSTFpFOWtVV1JTWkZOa1ZHUmFaRnRrWEdSZFpGOWtZR1JoWkdOa2JXUnpaSFJrZTJSOVpJVmtoMlNQWkpCa2tXU1laSmxrbTJTZFpKOWtvV1NqWktaa3FHU3NaTE5rdldTK1pMOWt4R1RKWk1wa3kyVE1aTTVrMEdUUlpOVmsxMlRrWk9WazZXVHFaTzFrOEdUMVpQZGsrMlQvWkFGbEJHVUlaUWxsQ21VUFpSTmxGR1VXWlJsbEcyVWVaUjlsSW1VbVpTbGxMbVV4WlRwbFBHVTlaVU5sUjJWSlpWQmxVbVZVWlY5bFlHVm5aV3RsZW1WOVpZRmxoV1dLWlpKbGxXV1laWjFsb0dXalphWmxybVd5WmJObHRHVy9aY0pseUdYSlpjNWwwR1hVWmRabDJHWGZaZkJsOG1YMFpmVmwrV1grWmY5bEFHWUVaZ2htQ1dZTlpoRm1FbVlWWmhabUhXWWVaaUZtSW1ZalppUm1KbVlwWmlwbUsyWXNaaTVtTUdZeFpqTm1PV1kzWmtCbVJXWkdaa3BtVEdaUlprNW1WMlpZWmxsbVcyWmNabUJtWVdiN1ptcG1hMlpzWm41bWMyWjFabjltZDJaNFpubG1lMmFBWm54bWkyYU1abzFta0dhU1pwbG1tbWFiWnB4bW4yYWdacVJtcldheFpySm10V2E3WnI5bXdHYkNac05teUdiTVpzNW16MmJVWnR0bTMyYm9adXRtN0didVp2cG1CV2NIWnc1bkUyY1paeHhuSUdjaVp6Tm5QbWRGWjBkblNHZE1aMVJuVldkZFoyWm5iR2R1WjNSbmRtZDdaNEZuaEdlT1o0OW5rV2VUWjVabm1HZVpaNXRuc0dleFo3Sm50V2U3Wjd4bnZXZjVaOEJud21mRFo4Vm55R2ZKWjlKbjEyZlpaOXhuNFdmbVovQm44bWYyWi9kblVtZ1VhQmxvSFdnZmFDaG9KMmdzYUMxb0wyZ3dhREZvTTJnN2FEOW9SR2hGYUVwb1RHaFZhRmRvV0doYmFHdG9ibWh2YUhCb2NXaHlhSFZvZVdoNmFIdG9mR2lDYUlSb2htaUlhSlpvbUdpYWFKeG9vV2lqYUtWb3FXaXFhSzVvc21pN2FNVm95R2pNYU05bzBHalJhTk5vMW1qWmFOeG8zV2psYU9obzZtanJhT3hvN1dqd2FQRm85V2oyYVB0by9HajlhQVpwQ1drS2FSQnBFV2tUYVJacEYya3hhVE5wTldrNGFUdHBRbWxGYVVscFRtbFhhVnRwWTJsa2FXVnBabWxvYVdscGJHbHdhWEZwY21sNmFYdHBmMm1BYVkxcGttbVdhWmhwb1dtbGFhWnBxR21yYWExcHIybTNhYmhwdW1tOGFjVnB5R25SYWRacDEybmlhZVZwN21udmFmRnA4Mm4xYWY1cEFHb0JhZ05xRDJvUmFoVnFHbW9kYWlCcUpHb29hakJxTW1vMGFqZHFPMm8rYWo5cVJXcEdha2xxU21wT2FsQnFVV3BTYWxWcVZtcGJhbVJxWjJwcWFuRnFjMnArYW9GcWcycUdhb2RxaVdxTGFwRnFtMnFkYXA1cW4ycWxhcXRxcjJxd2FyRnF0R3E5YXI1cXYyckdhc2xxeUdyTWF0QnExR3JWYXRacTNHcmRhdVJxNTJyc2F2QnE4V3J5YXZ4cS9Xb0Nhd05yQm1zSGF3bHJEMnNRYXhGckYyc2JheDVySkdzb2F5dHJMR3N2YXpWck5tczdhejlyUm10S2EwMXJVbXRXYTFoclhXdGdhMmRyYTJ0dWEzQnJkV3Q5YTM1cmdtdUZhNWRybTJ1ZmE2QnJvbXVqYTZocnFXdXNhNjFycm11d2E3aHJ1V3U5YTc1cncydkVhOGxyekd2V2E5cHI0V3ZqYStacjUydnVhL0ZyOTJ2NWEvOXJBbXdFYkFWc0NXd05iQTVzRUd3U2JCbHNIMndtYkNkc0tHd3NiQzVzTTJ3MWJEWnNPbXc3YkQ5c1NteExiRTFzVDJ4U2JGUnNXV3hiYkZ4c2EyeHRiRzlzZEd4MmJIaHNlV3g3YklWc2hteUhiSWxzbEd5VmJKZHNtR3ljYko5c3NHeXliTFJzd216R2JNMXN6MnpRYk5GczBtelViTlpzMm16Y2JPQnM1MnpwYk90czdHenViUEpzOUd3RWJRZHRDbTBPYlE5dEVXMFRiUnB0Sm0wbmJTaHRaMnd1YlM5dE1XMDViVHh0UDIxWGJWNXRYMjFoYldWdFoyMXZiWEJ0ZkcyQ2JZZHRrVzJTYlpSdGxtMlhiWmh0cW0yc2JiUnR0MjI1YmIxdHYyM0ViY2h0eW0zT2JjOXQxbTNiYmQxdDMyM2diZUp0NVczcGJlOXQ4RzMwYmZadC9HMEFiZ1J1SG00aWJpZHVNbTQyYmpsdU8yNDhia1J1Ulc1SWJrbHVTMjVQYmxGdVVtNVRibFJ1VjI1Y2JsMXVYbTVpYm1OdWFHNXpibnR1Zlc2TmJwTnVtVzZnYnFkdXJXNnVickZ1czI2N2JyOXV3RzdCYnNOdXgyN0lic3B1elc3T2JzOXU2Mjd0YnU1dStXNzdidjF1Qkc4SWJ3cHZERzhOYnhadkdHOGFieHR2Sm04cGJ5cHZMMjh3YnpOdk5tODdienh2TFc5UGIxRnZVbTlUYjFkdldXOWFiMTF2WG05aGIySnZhRzlzYjMxdmZtK0RiNGR2aUcrTGI0eHZqVytRYjVKdmsyK1ViNVp2bW0rZmI2QnZwVyttYjZkdnFHK3ViNjl2c0crMWI3WnZ2Ry9GYjhkdnlHL0tiOXB2M20vb2IrbHY4Ry8xYi9sdi9HLzlid0J3QlhBR2NBZHdEWEFYY0NCd0kzQXZjRFJ3TjNBNWNEeHdRM0JFY0Vod1NYQktjRXR3VkhCVmNGMXdYbkJPY0dSd1pYQnNjRzV3ZFhCMmNINXdnWENGY0lad2xIQ1ZjSlp3bDNDWWNKdHdwSENyY0xCd3NYQzBjTGR3eW5EUmNOTncxSERWY05adzJIRGNjT1J3K25BRGNRUnhCWEVHY1FkeEMzRU1jUTl4SG5FZ2NTdHhMWEV2Y1RCeE1YRTRjVUZ4UlhGR2NVZHhTbkZMY1ZCeFVuRlhjVnB4WEhGZWNXQnhhSEY1Y1lCeGhYR0hjWXh4a25HYWNadHhvSEdpY2E5eHNIR3ljYk54dW5HL2NjQnh3WEhFY2N0eHpISFRjZFp4MlhIYWNkeHgrSEgrY1FCeUIzSUljZ2x5RTNJWGNocHlIWElmY2lSeUszSXZjalJ5T0hJNWNrRnlRbkpEY2tWeVRuSlBjbEJ5VTNKVmNsWnlXbkpjY2w1eVlISmpjbWh5YTNKdWNtOXljWEozY25oeWUzSjhjbjl5aEhLSmNvMXlqbktUY3B0eXFIS3RjcTV5c1hLMGNyNXl3WExIY3NseXpITFZjdFp5MkhMZmN1Vnk4M0wwY3ZweSszTCtjZ0p6QkhNRmN3ZHpDM01OY3hKekUzTVljeGx6SG5NaWN5UnpKM01vY3l4ek1YTXljelZ6T25NN2N6MXpRM05OYzFCelVuTldjMWh6WFhOZWMxOXpZSE5tYzJkemFYTnJjMnh6Ym5OdmMzRnpkM041YzN4emdIT0JjNE56aFhPR2M0NXprSE9UYzVWemwzT1ljNXh6bm5PZmM2Qnpvbk9sYzZaenFuT3JjNjF6dFhPM2M3bHp2SE85Yzc5enhYUEdjOGx6eTNQTWM4OXowblBUYzlaejJYUGRjK0Z6NDNQbWMrZHo2WFAwYy9WejkzUDVjL3B6KzNQOWMvOXpBSFFCZEFSMEIzUUtkQkYwR25RYmRDUjBKblFvZENsMEtuUXJkQ3gwTFhRdWRDOTBNSFF4ZERsMFFIUkRkRVIwUm5SSGRFdDBUWFJSZEZKMFYzUmRkR0owWm5SbmRHaDBhM1J0ZEc1MGNYUnlkSUIwZ1hTRmRJWjBoM1NKZEk5MGtIU1JkSkowbUhTWmRKcDBuSFNmZEtCMG9YU2pkS1owcUhTcGRLcDBxM1N1ZEs5MHNYU3lkTFYwdVhTN2RMOTB5SFRKZE14MDBIVFRkTmgwMm5UYmRONTAzM1RrZE9oMDZuVHJkTzkwOUhUNmRQdDAvSFQvZEFaMUVuVVdkUmQxSUhVaGRTUjFKM1VwZFNwMUwzVTJkVGwxUFhVK2RUOTFRSFZEZFVkMVNIVk9kVkIxVW5WWGRWNTFYM1ZoZFc5MWNYVjVkWHAxZTNWOGRYMTFmbldCZFlWMWtIV1NkWk4xbFhXWmRaeDFvbldrZGJSMXVuVy9kY0Ixd1hYRWRjWjF6SFhPZGM5MTEzWGNkZDkxNEhYaGRlUjE1M1hzZGU1MTczWHhkZmwxQUhZQ2RnTjJCSFlIZGdoMkNuWU1kZzkyRW5ZVGRoVjJGbllaZGh0MkhIWWRkaDUySTNZbGRpWjJLWFl0ZGpKMk0zWTFkamgyT1hZNmRqeDJTblpBZGtGMlEzWkVka1YyU1haTGRsVjJXWFpmZG1SMlpYWnRkbTUyYjNaeGRuUjJnWGFGZG94MmpYYVZkcHQybkhhZGRwOTJvSGFpZHFOMnBIYWxkcVoycDNhb2RxcDJyWGE5ZHNGMnhYYkpkc3QyekhiT2R0UjIyWGJnZHVaMjZIYnNkdkIyOFhiMmR2bDIvSFlBZHdaM0NuY09keEozRkhjVmR4ZDNHWGNhZHh4M0luY29keTEzTG5jdmR6UjNOWGMyZHpsM1BYYytkMEozUlhkR2QwcDNUWGRPZDA5M1VuZFdkMWQzWEhkZWQxOTNZSGRpZDJSM1ozZHFkMngzY0hkeWQzTjNkSGQ2ZDMxM2dIZUVkNHgzalhlVWQ1VjNsbmVhZDU5M29uZW5kNnAzcm5ldmQ3RjN0WGUrZDhOM3lYZlJkOUozMVhmWmQ5NTMzM2ZnZCtSMzVuZnFkK3gzOEhmeGQvUjMrSGY3ZHdWNEJuZ0plQTE0RG5nUmVCMTRJWGdpZUNONExYZ3VlREI0TlhnM2VFTjRSSGhIZUVoNFRIaE9lRko0WEhoZWVHQjRZWGhqZUdSNGFIaHFlRzU0ZW5oK2VJcDRqM2lVZUpoNG9YaWRlSjU0bjNpa2VLaDRySGl0ZUxCNHNYaXllTE40dTNpOWVMOTR4M2pJZU1sNHpIak9lTko0MDNqVmVOWjQ1SGpiZU45NDRIamhlT1o0Nm5qeWVQTjRBSG4yZVBkNCtuajdlUDk0Qm5rTWVSQjVHbmtjZVI1NUgza2dlU1Y1SjNrcGVTMTVNWGswZVRWNU8zazllVDk1UkhsRmVVWjVTbmxMZVU5NVVYbFVlVmg1VzNsY2VXZDVhWGxyZVhKNWVYbDdlWHg1Zm5tTGVZeDVrWG1UZVpSNWxYbVdlWmg1bTNtY2VhRjVxSG1wZWF0NXIzbXhlYlI1dUhtN2VjSjV4SG5IZWNoNXlublBlZFI1MW5uYWVkMTUzbm5nZWVKNTVYbnFlZXQ1N1hueGVmaDUvSGtDZWdONkIzb0plZ3A2REhvUmVoVjZHM29lZWlGNkozb3JlaTE2TDNvd2VqUjZOWG80ZWpsNk9ucEVla1Y2UjNwSWVreDZWWHBXZWxsNlhIcGRlbDk2WUhwbGVtZDZhbnB0ZW5WNmVIcCtlb0I2Z25xRmVvWjZpbnFMZXBCNmtYcVVlcDU2b0hxamVxeDZzM3ExZXJsNnUzcThlc1o2eVhyTWVzNTYwWHJiZXVoNjZYcnJldXg2OFhyMGV2dDYvWHIrZWdkN0ZIc2ZleU43SjNzcGV5cDdLM3N0ZXk1N0wzc3dlekY3TkhzOWV6OTdRSHRCZTBkN1RudFZlMkI3Wkh0bWUybDdhbnR0ZTI5N2NudHplM2Q3aEh1SmU0NTdrSHVSZTVaN20zdWVlNkI3cFh1c2U2OTdzSHV5ZTdWN3RudTZlN3Q3dkh1OWU4Sjd4WHZJZThwNzFIdldlOWQ3Mlh2YWU5dDc2SHZxZS9KNzlIdjFlL2g3K1h2NmUveDcvbnNCZkFKOEEzd0VmQVo4Q1h3TGZBeDhEbndQZkJsOEczd2dmQ1Y4Sm53b2ZDeDhNWHd6ZkRSOE5udzVmRHA4Um54S2ZGVjhVWHhTZkZOOFdYeGFmRnQ4WEh4ZGZGNThZWHhqZkdkOGFYeHRmRzU4Y0h4eWZIbDhmSHg5ZklaOGgzeVBmSlI4bm55Z2ZLWjhzSHkyZkxkOHVueTdmTHg4djN6RWZNZDh5SHpKZk0xOHozelRmTlI4MVh6WGZObDgybnpkZk9aODZYenJmUFY4QTMwSGZRaDlDWDBQZlJGOUVuMFRmUlo5SFgwZWZTTjlKbjBxZlMxOU1YMDhmVDE5UG4xQWZVRjlSMzFJZlUxOVVYMVRmVmQ5V1gxYWZWeDlYWDFsZldkOWFuMXdmWGg5ZW4xN2ZYOTlnWDJDZllOOWhYMkdmWWg5aTMyTWZZMTlrWDJXZlpkOW5YMmVmYVo5cDMycWZiTjl0bjIzZmJsOXduM0RmY1I5eFgzR2ZjeDl6WDNPZmRkOTJYMEFmdUo5NVgzbWZlcDk2MzN0ZmZGOTlYMzJmZmw5K24wSWZoQitFWDRWZmhkK0hINGRmaUIrSjM0b2ZpeCtMWDR2ZmpOK05uNC9ma1IrUlg1SGZrNStVSDVTZmxoK1gzNWhmbUorWlg1cmZtNStiMzV6Zm5oK2ZuNkJmb1oraDM2S2ZvMStrWDZWZnBoK21uNmRmcDUrUEg4N2Z6MS9QbjgvZjBOL1JIOUhmMDkvVW45VGYxdC9YSDlkZjJGL1kzOWtmMlYvWm45dGYzRi9mWDkrZjM5L2dIK0xmNDEvajMrUWY1Ri9sbitYZjV4L29YK2lmNlovcW4rdGY3Ui92SCsvZjhCL3czL0lmODUvejMvYmY5OS80My9sZitoLzdIL3VmKzkvOG4vNmYvMS8vbi8vZndlQUNJQUtnQTJBRG9BUGdCR0FFNEFVZ0JhQUhZQWVnQitBSUlBa2dDYUFMSUF1Z0RDQU5JQTFnRGVBT1lBNmdEeUFQb0JBZ0VTQVlJQmtnR2FBYllCeGdIV0FnWUNJZ0k2QW5JQ2VnS2FBcDRDcmdMaUF1WURJZ00yQXo0RFNnTlNBMVlEWGdOaUE0SUR0Z082QThJRHlnUE9BOW9ENWdQcUEvb0FEZ1F1QkZvRVhnUmlCSElFZWdTQ0JKSUVuZ1N5Qk1JRTFnVHFCUElGRmdVZUJTb0ZNZ1ZLQlY0RmdnV0dCWjRGb2dXbUJiWUZ2Z1hlQmdZR1FnWVNCaFlHR2dZdUJqb0dXZ1ppQm00R2VnYUtCcm9HeWdiU0J1NEhMZ2NPQnhZSEtnYzZCejRIVmdkZUIyNEhkZ2Q2QjRZSGtnZXVCN0lId2dmR0I4b0gxZ2ZhQitJSDVnZjJCLzRFQWdnT0NENElUZ2hTQ0dZSWFnaDJDSVlJaWdpaUNNb0kwZ2pxQ1E0SkVna1dDUm9KTGdrNkNUNEpSZ2xhQ1hJSmdnbU9DWjRKdGduU0NlNEo5Z24rQ2dJS0Jnb09DaElLSGdvbUNpb0tPZ3BHQ2xJS1dncGlDbW9LYmdxQ0NvWUtqZ3FTQ3A0S29ncW1DcW9LdWdyQ0Nzb0swZ3JlQ3VvSzhncjZDdjRMR2d0Q0MxWUxhZ3VDQzRvTGtndWlDNm9MdGd1K0M5b0wzZ3YyQy9vSUFnd0dEQjRNSWd3cURDNE5VZ3h1REhZTWVneCtESVlNaWd5eURMWU11Z3pDRE00TTNnenFEUElNOWcwS0RRNE5FZzBlRFRZTk9nMUdEVllOV2cxZURjSU40ZzMyRGY0T0FnNEtEaElPR2c0MkRrb09VZzVXRG1JT1pnNXVEbklPZGc2YURwNE9wZzZ5RHZvTy9nOENEeDRQSmc4K0QwSVBSZzlTRDNZTlRnK2lENm9QMmcvaUQrWVA4Z3dHRUJvUUtoQStFRVlRVmhCbUVyWU12aERtRVJZUkhoRWlFU29STmhFK0VVWVJTaEZhRVdJUlpoRnFFWElSZ2hHU0VaWVJuaEdxRWNJUnpoSFNFZG9SNGhIeUVmWVNCaElXRWtvU1RoSldFbm9TbWhLaUVxWVNxaEsrRXNZUzBoTHFFdllTK2hNQ0V3b1RIaE1pRXpJVFBoTk9FM0lUbmhPcUU3NFR3aFBHRThvVDNoREtGK29UN2hQMkVBb1VEaFFlRkRJVU9oUkNGSElVZWhTS0ZJNFVraFNXRko0VXFoU3VGTDRVemhUU0ZOb1UvaFVhRlQ0VlFoVkdGVW9WVGhWYUZXWVZjaFYyRlhvVmZoV0NGWVlWaWhXU0ZhNFZ2aFhtRmVvVjdoWDJGZjRXQmhZV0Zob1dKaFl1RmpJV1BoWk9GbUlXZGhaK0ZvSVdpaGFXRnA0VzBoYmFGdDRXNGhieUZ2WVcraGIrRndvWEhoY3FGeTRYT2hhMkYySVhhaGQrRjRJWG1oZWlGN1lYemhmYUYvSVgvaFFDR0JJWUZoZzJHRG9ZUWhoR0dFb1lZaGhtR0c0WWVoaUdHSjRZcGhqYUdPSVk2aGp5R1BZWkFoa0tHUm9aU2hsT0dWb1pYaGxpR1dZWmRobUNHWVlaaWhtT0daSVpwaG15R2I0WjFobmFHZDRaNmhvMkdrWWFXaHBpR21vYWNocUdHcG9hbmhxaUdyWWF4aHJPR3RJYTFocmVHdUlhNWhyK0d3SWJCaHNPR3hZYlJodEtHMVliWGh0cUczSWJnaHVPRzVZYm5ob2lHK29iOGh2MkdCSWNGaHdlSEM0Y09odytIRUljVGh4U0hHWWNlaHgrSElZY2poeWlITG9jdmh6R0hNb2M1aHpxSFBJYzloejZIUUlkRGgwV0hUWWRZaDEySFlZZGtoMldIYjRkeGgzS0hlNGVEaDRTSGhZZUdoNGVIaUllSmg0dUhqSWVRaDVPSGxZZVhoNWlIbVllZWg2Q0hvNGVuaDZ5SHJZZXVoN0dIdFllK2g3K0h3WWZJaDhtSHlvZk9oOVdIMW9mWmg5cUgzSWZmaCtLSDQ0ZmtoK3FINjRmdGgvR0g4NGY0aC9xSC80Y0JpQU9JQm9nSmlBcUlDNGdRaUJtSUVvZ1RpQlNJR0lnYWlCdUlISWdlaUIrSUtJZ3RpQzZJTUlneWlEV0lPb2c4aUVHSVE0aEZpRWlJU1loS2lFdUlUb2hSaUZXSVZvaFlpRnFJWEloZmlHQ0laSWhwaUhHSWVZaDdpSUNJbUlpYWlKdUluSWlmaUtDSXFJaXFpTHFJdllpK2lNQ0l5b2pMaU15SXpZak9pTkdJMG9qVGlOdUkzb2puaU8rSThJanhpUFdJOTRnQmlRYUpEWWtPaVErSkZZa1dpUmlKR1lrYWlSeUpJSWttaVNlSktJa3dpVEdKTW9rMWlUbUpPb2sraVVDSlFvbEZpVWFKU1lsUGlWS0pWNGxhaVZ1SlhJbGhpV0tKWTRscmlXNkpjSWx6aVhXSmVvbDdpWHlKZlltSmlZMkprSW1VaVpXSm00bWNpWitKb0ltbGliQ0p0SW0xaWJhSnQ0bThpZFNKMVluV2lkZUoySW5saWVtSjY0bnRpZkdKODRuMmlmbUovWW4vaVFTS0JZb0hpZytLRVlvU2loU0tGWW9laWlDS0lvb2tpaWFLSzRvc2lpK0tOWW8zaWoyS1BvcEFpa09LUllwSGlrbUtUWXBPaWxPS1ZvcFhpbGlLWElwZGltR0taWXBuaW5XS2RvcDNpbm1LZW9wN2luNktmNHFBaW9PS2hvcUxpbytLa0lxU2lwYUtsNHFaaXArS3A0cXBpcTZLcjRxemlyYUt0NHE3aXI2S3c0ckdpc2lLeVlyS2l0R0swNHJVaXRXSzE0cmRpdCtLN0lyd2l2U0s5WXIyaXZ5Sy80b0Zpd2FMQzRzUml4eUxIb3NmaXdxTExZc3dpemVMUEl0Q2kwT0xSSXRGaTBhTFNJdFNpMU9MVkl0WmkwMkxYb3RqaTIyTGRvdDRpM21MZkl0K2k0R0xoSXVGaTR1TGpZdVBpNVNMbFl1Y2k1NkxuNHM0akRtTVBZdytqRVdNUjR4SmpFdU1UNHhSakZPTVZJeFhqRmlNVzR4ZGpGbU1ZNHhrakdhTWFJeHBqRzJNYzR4MWpIYU1lNHgraklhTWg0eUxqSkNNa295VGpKbU1tNHljaktTTXVZeTZqTVdNeG96SmpNdU16NHpXak5XTTJZemRqT0dNNkl6c2pPK004SXp5alBXTTk0ejRqUDZNLzR3QmpRT05DWTBTalJlTkc0MWxqV21OYkkxdWpYK05nbzJFallpTmpZMlFqWkdObFkyZWpaK05vSTJtamF1TnJJMnZqYktOdFkyM2pibU51NDNBamNXTnhvM0hqY2lOeW8zT2pkR04xSTNWamRlTjJZM2tqZVdONTQzc2pmQ052STN4amZLTjlJMzlqUUdPQkk0RmpnYU9DNDRSamhTT0ZvNGdqaUdPSW80amppYU9KNDR4ampPT05vNDNqamlPT1k0OWprQ09RWTVMamsyT1RvNVBqbFNPVzQ1Y2psMk9YbzVoam1LT2FZNXNqbTJPYjQ1d2puR09lWTU2am51T2dvNkRqb21Pa0k2U2pwV09tbzZianAyT25vNmlqcWVPcVk2dGpxNk9zNDYxanJxT3U0N0Fqc0dPdzQ3RWpzZU96NDdSanRTTzNJN29qdTZPOEk3eGp2ZU8rWTc2anUyT0FJOENqd2VQQ0k4UGp4Q1BGbzhYanhpUEhvOGdqeUdQSTQ4bGp5ZVBLSThzankyUExvODBqeldQTm84M2p6cVBRSTlCajBPUFI0OVBqMUdQVW85VGoxU1BWWTlZajEyUFhvOWxqNTJQb0kraGo2U1BwWSttajdXUHRvKzRqNzZQd0kvQmo4YVB5by9MajgyUDBJL1NqOU9QMVkvZ2orT1A1SS9vais2UDhZLzFqL2FQKzQvK2p3S1FCSkFJa0F5UUdKQWJrQ2lRS1pBdmtDcVFMSkF0a0RPUU5KQTNrRCtRUTVCRWtFeVFXNUJka0dLUVpwQm5rR3lRY0pCMGtIbVFoWkNJa0l1UWpKQ09rSkNRbFpDWGtKaVFtWkNia0tDUW9aQ2lrS1dRc0pDeWtMT1F0SkMya0wyUXpKQytrTU9ReEpERmtNZVF5SkRWa05lUTJKRFprTnlRM1pEZmtPV1EwcEQya091UTc1RHdrUFNRL3BEL2tBQ1JCSkVGa1FhUkNKRU5rUkNSRkpFV2tSZVJHSkVha1J5UkhwRWdrU1dSSXBFamtTZVJLWkV1a1MrUk1aRTBrVGFSTjVFNWtUcVJQSkU5a1VPUlI1RklrVStSVTVGWGtWbVJXcEZia1dHUlpKRm5rVzJSZEpGNWtYcVJlNUdCa1lPUmhaR0drWXFSanBHUmtaT1JsSkdWa1ppUm5wR2hrYWFScUpHc2thMlJycEd3a2JHUnNwR3prYmFSdTVHOGtiMlJ2NUhDa2NPUnhaSFRrZFNSMTVIWmtkcVIzcEhra2VXUjZaSHFrZXlSN1pIdWtlK1I4Skh4a2ZlUitaSDdrZjJSQUpJQmtnU1NCWklHa2dlU0NaSUtrZ3lTRUpJU2toT1NGcElZa2h5U0haSWpraVNTSlpJbWtpaVNMcEl2a2pDU001STFramFTT0pJNWtqcVNQSkkra2tDU1FwSkRra2FTUjVKS2trMlNUcEpQa2xHU1dKSlprbHlTWFpKZ2ttR1NaWkpua21pU2FaSnVrbStTY0pKMWtuYVNkNUo0a25tU2U1SjhrbjJTZjVLSWtvbVNpcEtOa282U2twS1hrcG1TbjVLZ2txU1NwWktua3FpU3E1S3ZrcktTdHBLNGtycVN1NUs4a3IyU3Y1TEFrc0dTd3BMRGtzV1N4cExIa3NpU3k1TE1rczJTenBMUWt0T1MxWkxYa3RpUzJaTGNrdDJTMzVMZ2t1R1M0NUxsa3VlUzZKTHNrdTZTOEpMNWt2dVMvNUlBa3dLVENKTU5reEdURkpNVmt4eVRIWk1la3grVElaTWtreVdUSjVNcGt5cVRNNU0wa3phVE41TkhrMGlUU1pOUWsxR1RVcE5WazFlVFdKTmFrMTZUWkpObGsyZVRhWk5xazIyVGI1TndrM0dUYzVOMGszYVRlcE45azMrVGdKT0JrNEtUaUpPS2s0dVRqWk9QazVLVGxaT1lrNXVUbnBPaGs2T1RwSk9tazZpVHE1TzBrN1dUdHBPNms2bVR3WlBFazhXVHhwUEhrOG1UeXBQTGs4eVR6WlBUazltVDNKUGVrOStUNHBQbWsrZVQrWlAzay9pVCtwUDdrLzJUQVpRQ2xBU1VDSlFKbEEyVURwUVBsQldVRnBRWGxCK1VMcFF2bERHVU1wUXpsRFNVTzVRL2xEMlVRNVJGbEVpVVNwUk1sRldVV1pSY2xGK1VZWlJqbEdpVWE1UnRsRzZVYjVSeGxIS1VoSlNEbEhpVmVaVitsWVNWaUpXTWxZMlZqcFdkbFo2Vm41V2hsYWFWcVpXcmxheVZ0SlcybGJxVnZaVy9sY2FWeUpYSmxjdVYwSlhSbGRLVjA1WFpsZHFWM1pYZWxkK1Y0SlhrbGVhVkhaWWVsaUtXSkpZbGxpYVdMSll4bGpPV041WTRsam1XT3BZOGxqMldRWlpTbGxTV1ZwWlhsbGlXWVpadWxuU1dlNVo4bG42V2Y1YUJsb0tXZzVhRWxvbVdrWmFXbHBxV25aYWZscVNXcFphbWxxbVdycGF2bHJPV3VwYktsdEtXc2wzWWx0cVczWmJlbHQrVzZaYnZsdkdXK3BZQ2x3T1hCWmNKbHhxWEc1Y2RseUdYSXBjamx5aVhNWmN6bDBHWFE1ZEtsMDZYVDVkVmwxZVhXSmRhbDF1WFk1ZG5sMnFYYnBkemwzYVhkNWQ0bDN1WGZaZC9sNENYaVplVmw1YVhsNWVabDVxWG5wZWZsNktYckpldWw3R1hzcGUxbDdhWHVKZTVsN3FYdkplK2w3K1h3WmZFbDhXWHg1ZkpsOHFYekpmTmw4NlgwSmZSbDlTWDE1ZllsOW1YM1pmZWwrQ1gyNWZobCtTWDc1ZnhsL1NYOTVmNGwvcVhCNWdLbUJtWURaZ09tQlNZRnBnY21CNllJSmdqbUNhWUs1Z3VtQytZTUpneW1ET1lOWmdsbUQ2WVJKaEhtRXFZVVpoU21GT1lWcGhYbUZtWVdwaGltR09ZWlpobW1HcVliSmlybUsyWXJwaXdtTFNZdDVpNG1McVl1NWkvbU1LWXhaakltTXlZNFpqam1PV1k1cGpubU9xWTg1ajJtQUtaQjVrSW1SR1pGWmtXbVJlWkdwa2JtUnlaSDVraW1TYVpKNWtybVRHWk1wa3ptVFNaTlprNW1UcVpPNWs4bVVDWlFabEdtVWVaU0psTm1VNlpWSmxZbVZtWlc1bGNtVjZaWDVsZ21adVpuWm1mbWFhWnNKbXhtYktadFptNW1icVp2Wm0vbWNPWnlablRtZFNaMlpuYW1keVozcG5ubWVxWjY1bnNtZkNaOUpuMW1mbVovWm4rbVFLYUE1b0VtZ3VhREpvUW1oR2FGcG9lbWlDYUlwb2ptaVNhSjVvdG1pNmFNNW8xbWphYU9KcEhta0dhUkpwS21rdWFUSnBPbWxHYVZKcFdtbDJhcXBxc21xNmFyNXF5bXJTYXRacTJtcm1hdTVxK21yK2F3WnJEbXNhYXlKck9tdENhMHByVm10YWExNXJibXR5YTRKcmttdVdhNTVycG11eWE4cHJ6bXZXYStacjZtdjJhLzVvQW13R2JBcHNEbXdTYkJac0ltd21iQzVzTW13MmJEcHNRbXhLYkZwc1pteHViSEpzZ215YWJLNXN0bXpPYk5KczFtemViT1pzNm16MmJTSnRMbTB5YlZadFdtMWViVzV0ZW0yR2JZNXRsbTJhYmFKdHFtMnViYkp0dG0yNmJjNXQxbTNlYmVKdDVtMytiZ0p1RW00V2JocHVIbTRtYmlwdUxtNDJiajV1UW01U2JtcHVkbTU2YnBwdW5tNm1ickp1d203R2JzcHUzbTdpYnU1dThtNzZidjV2Qm04ZWJ5SnZPbTlDYjE1dlltOTJiMzV2bG0rZWI2cHZybSsrYjg1djNtL2liK1p2Nm0vMmIvNXNBbkFLY0M1d1BuQkdjRnB3WW5CbWNHcHdjbkI2Y0lwd2puQ2FjSjV3b25DbWNLcHd4bkRXY05wdzNuRDJjUVp4RG5FU2NSWnhKbkVxY1RweFBuRkNjVTV4VW5GYWNXSnhibkYyY1hweGZuR09jYVp4cW5GeWNhNXhvbkc2Y2NKeHluSFdjZDV4N25PYWM4cHozblBtY0M1MENuUkdkRjUwWW5SeWRIWjBlblMrZE1KMHluVE9kTkowNm5UeWRSWjA5blVLZFE1MUhuVXFkVTUxVW5WK2RZNTFpbldXZGFaMXFuV3VkY0oxMm5YZWRlNTE4blg2ZGc1MkVuWWFkaXAyTm5ZNmRrcDJUblpXZGxwMlhuWmlkb1oycW5heWRycDJ4bmJXZHVaMjhuYitkdzUzSG5jbWR5cDNVbmRXZDFwM1huZHFkM3AzZm5lQ2Q1WjNubmVtZDY1M3VuZkNkODUzMG5mNmRDcDRDbmdlZURwNFFuaEdlRXA0Vm5oYWVHWjRjbmgyZWVwNTdubnllZ0o2Q25vT2VoSjZGbm9lZWpwNlBucGFlbUo2Ym5wNmVwSjZvbnF5ZXJwNnZuckNlczU2MG5yV2V4cDdJbnN1ZTFaN2ZudVNlNTU3c251MmU3cDd3bnZHZThwNzFudmllLzU0Q253T2ZDWjhQbnhDZkVaOFNueFNmRnA4WG54bWZHcDhibngrZklwOG1ueXFmSzU4dm56R2ZNcDgwbnplZk9aODZuenlmUFo4L24wR2ZRNTlFbjBXZlJwOUhuMU9mVlo5V24xZWZXSjlhbjEyZlhwOW9uMm1mYlo5dW4yK2ZjSjl4bjNPZmRaOTZuMzJmajUrUW41R2ZrcCtVbjVhZmw1K2VuNkdmb3Aram42V2YyQUxIQXJnQTJRTGRBcThBMndMYUFsNy9oQU9GQTZFQXBnQy9BTG9BcWdDcEFLNEFJaUdrQUJZaGhnT0lBNGtEaWdPcUF3QUFqQU1BQUk0RHF3TUFBSThEckFPdEE2NERyd1BLQTVBRHpBUENBODBEeXdPd0E4NEREZ1FQQkY0RVh3VEdBQkFCQUFBbUFRQUFNZ0VBQUVFQlB3RUFBRW9CMkFCU0FRQUFaZ0hlQU9ZQUVRSHdBQ2NCTVFFekFUZ0JRZ0ZBQVVrQlN3SDRBRk1CM3dCbkFmNEF3UURBQU1RQXdnQUNBYzBCQUFFRUFjVUF3d0FHQVFnQkRBSEhBQW9CRGdISkFNZ0F5d0RLQUJvQkZnRVNBUmdCQUFBY0FSNEJJZ0VnQVNRQnpRRE1BTThBemdEUEFUQUJLZ0V1QVNnQk5BRTJBVGtCUFFFN0FVTUJSd0ZGQWRFQTB3RFNBTllBMUFEUkFWQUJUQUhWQUZRQldBRldBVm9CWEFGZ0FWNEJaQUZpQWRvQTJRRGNBTnNBYkFIVEFYQUJhZ0Z5QVc0QmFBSFhBZHNCMlFIVkFYUUIzUUI0QVhZQmVRRjlBWHNCNFFEZ0FPUUE0Z0FEQWM0QkFRRUZBZVVBNHdBSEFRa0JEUUhuQUFzQkR3SHBBT2dBNndEcUFCc0JGd0VUQVJrQjlRRWRBUjhCQUFBaEFTVUI3UURzQU84QTdnRFFBUUFBS3dFdkFTa0JOUUUzQVRvQlBnRThBVVFCU0FGR0FmRUE4d0R5QVBZQTlBRFNBVkVCVFFIMUFGVUJXUUZYQVZzQlhRRmhBVjhCWlFGakFmb0ErUUQ4QVBzQWJRSFVBWEVCYXdGekFXOEJhUUhZQWR3QjJnSFdBWFVCL1FEL0FIY0JlZ0YrQVh3QmJBQUxBQUFBZndBREFBc0FxQUFIQUE0QUZnSU1BQlVBSmdJTUFDRUFZQUlDQUMwQWtBSUNBQzhBOEFJUUFERUFFQU1RQUVFQVRnTlhBRkVBckFOWEFLZ0FBQUFCQUFRQUJRQUdBQWNBQ2dBTEFBd0FEUUFQQUJBQUVRQVNBQk1BRkFBWEFCZ0FHUUFhQUJzQUhBQWRBQjhBSXdBbEFDc0FMQUEyQUQwQVBnQS9BRUFBUWdCREFFWUFSd0JJQUVzQVRBQlFBRk1BVkFCVkFGY0FXQUJiQUZ3QVhRQmZBR0FBWXdCa0FHVUFhQUJwQUdvQWF3QnlBSFFBZVFCN0FId0FmUUIvQUlJQWd3Q0VBSVVBaGdDSEFJZ0FqUUNQQUpVQWxnQ1hBSmdBbWdDYkFKd0FuZ0NnQUtJQW93Q25BS2dBcXdDdUFLOEFzQUN4QUxJQXRBQzJBTGtBdWdDOEFMNEF2d0RBQU1FQXhnRFBBTklBMWdEWkFONEEzd0RnQU9FQTRnRGtBT1VBNXdEb0FPa0E3UUR1QVBFQS9nRC9BQUVCQWdFRkFRWUJDQUVKQVF3QkRRRU9BUmtCR2dFYkFSOEJJZ0VsQVNZQkt3RXZBVEFCT0FFK0FVY0JTZ0ZNQVZBQlVnRldBV3NCYkFGdEFXOEJkQUY3QVk0QmxBR1hBYUlCcGdHcUFhc0JzQUc2QWIwQnd3SFJBZTRCN3dId0FmRUI4Z0gxQWZjQitnSDdBUUFDQWdJRUFnWUNCd0lJQWdrQ0N3SU5BZzhDRVFJVkFoY0NHQUlaQWh3Q0hRSWVBaU1DSlFJbUFpa0NLd0l1QWk4Q01BSXhBak1DTkFJOUFqNENRQUpDQWtnQ1NRSktBa3dDVFFKT0FrOENVUUpTQWxRQ1ZnSlpBbG9DWEFKZkFtSUNZd0prQW1VQ1p3SnBBbW9DYXdKeEFuSUNkQUoyQW5jQ2ZBSjlBbjhDZ2dLREFvUUNpQUtLQXBRQ2xRS1dBcHNDb2dLa0Fxc0NyQUt3QXJNQ3ZRTEFBc01DeEFMRkFza0N5Z0xOQXM0QzFBTFlBdU1DNndMdUF2SUM4d0wzQXZnQy9BTDlBdjhDQVFNQ0F3UURCd01LQXhRREZnTVhBeGdER1FNYUF4MERIZ01mQXlFRElnTWpBeVFESlFNbUF5Z0RLUU1xQXlzREx3TXhBeklETkFNMUF6d0RQZ00vQTBFRFFnTkVBMFVEUmdOS0ExRURWUU5ZQTFrRFhnTmhBMk1EWkFObEEyZ0RhZ05yQTJ3RGJRTndBM0VEY2dOekEzUURkUU40QTNrRGVnTjhBMzBEZmdOL0E0RURnZ09EQTRRRGhnT0lBNGtEaWdPT0E0OERrQU9WQTVZRGx3T1lBNkFEb1FPakE2VURwZ09uQTZnRHJBT3RBNjREcndPeEE3SUR0d080QTdrRHVnTzdBNzREd0FQQkE4SUR3d1BFQThZRHh3UElBOGtEemdQUUE5TUQyUVBhQTlzRDNBUGdBK0VENWdQb0ErNEQ4Z1B6QS9VRDl3UDRBL2tEK2dQOUF3RUVBZ1FEQkFRRUJRUUhCQXdFRUFRVkJCa0VHd1FkQkI0RUpBUW1CQ2NFS0FRcUJDMEVMZ1F3QkRNRU5RUTJCRDBFUmdSSEJFZ0VTUVJLQkVzRVRBUlJCRlFFVmdSWkJGb0VYd1JnQkdFRVlnUmpCR1FFWmdSb0JHa0VhZ1J2QkhBRWRnUjRCSGtFZ1FTREJJVUVpQVNLQkk0RWtRU1NCSk1FbFFTV0JKa0VwUVNxQkt3RXJnU3pCTFFFdHdTN0JMOEV3d1RMQk5JRTFRVGtCTzhFOWdUNkJBY0ZFQVVTQlJRRkZRVVdCUndGSFFVZkJTRUZKQVVtQlNrRktnVXJCVHdGUGdWQkJVVUZSZ1ZJQlUwRlR3VlFCVkVGVlFWWEJWZ0ZYUVZmQldFRllnVmpCV1FGWlFWb0JXb0ZiUVZ5QlhZRmV3V0NCWVlGaHdXSUJZa0ZpZ1dOQlk0RmtRV2FCYUVGb3dXbEJhWUZxQVdxQmFzRnJnVzJCYmNGdXdXK0JjQUZ3Z1hEQmNZRnlRWEtCYzBGMEFYVEJkY0YyQVhhQmQ4RjVBWG9CZllGL1FVQUJnSUdCUVlLQmhBR0ZRWW1CaWNHS0FZcEJpd0dOQVk1Qmp3R1JBWldCbG9HWFFab0Jtc0dlUVovQm9BR2dRYURCb1VHaHdhUEJwQUdrZ2FYQnBnR25BYWVCcDhHb1FhbEJxWUdwd2FvQnFrR3F3YXRCcTRHc2dhekJyVUd0Z2E0QnJrR3V3YThCc0VHd2diRUJ0RUcwZ2JUQnRZRzJRYmFCdHNHM1FiaEJ1TUc1QWJvQnV3RzdnYndCdklHK0FiNUJ2c0dBZ2NGQndrSEN3Y01CdzBIRWdjVEJ4VUhHQWNrQnlVSEtBY3BCeW9ITEFjd0J6RUhOUWM0QnpvSFBBYzlCMEFIUndkSUIwa0hUZ2RSQjFZSFdBZGlCMllIYlFkeEIzTUhmQWQrQjRJSGxBZWJCNmtIc0FleEI3TUh1QWU2QjhBSHdnZkhCOGdIeVFmS0I4MEgwQWZSQjlNSDFRZldCOXNIOGdmK0J4Z0lHUWdiQ0NNSU1nZ3pDRFFJTlFnM0NEa0lPZ2c5Q0Q0SVB3aERDRVVJUndoSUNFa0lTZ2hNQ0U4SVVBaFJDRklJVlFoWkNGc0lYQWhmQ0dFSVlnaG1DR2tJYWdoekNIUUlkZ2g0Q0gwSWZnaUZDSWNJaUFpS0NJc0lqUWlSQ0pJSWxBaVZDSllJbHdpYkNKd0luUWloQ0tVSXB3aXFDS3dJcmdpd0NMTUl0Z2k2Q0xzSXZBaTlDTVFJeFFqTUNOQUkwUWpXQ05rSTJ3amRDTjRJNHdqb0NPa0k3QWp0Q080STd3anpDUFFJOVFqM0NQMElBd2tKQ1JBSkVna1RDUlFKRmdrWUNTSUpLQWtxQ1RBSk5RazJDVG9KUEFsQkNVSUpRd2xHQ1VzSlV3bGJDVjBKYUFscUNXc0pkZ2wzQ1hrSmZRbUtDYUFKb3dtOENja0owQW5kQ2Q0SjRBbmlDZU1KNVFubUNlZ0o3UW52Q2ZBSjhRbjBDZllKK0FuNUNRRUtCZ29JQ2cwS0R3b1RDaFFLR2dvaENpWUtLQW9xQ2prS09nbzdDandLUFFwQUNrRUtRd3BHQ2tjS1NBcEpDa29LVGdwVENsZ0tXUXBkQ21jS2JRcHZDbk1LZndxQUNva0tpZ3FNQ284S2tncVRDcFlLbHdxWUNwa0ttZ3FjQ3A4S293cWtDcVlLcHdxb0NxOEtzQXF6Q3NJS3d3ckVDc2dLeXdyTUNzMEt6d3JRQ3RJSzB3cldDdGNLMkFyYkN0d0szUXJnQ3VFSzR3cmtDdVlLNmdyd0N2RUs4d3I1Q3ZvSy9nb0RDd1VMQndzSUN3c0xEZ3NRQ3hJTEZBc1dDeGNMR1FzY0N4NExJQXNoQ3lRTEpnc29DeWtMS3dzc0N5NExNUXMwQ3prTFBndEFDMEVMU0F0SkMwc0xUQXRPQzFFTFV3dFhDMWtMV2d0Y0MxNExYd3RnQzJNTFp3dHBDMjBMYmd0dkMzSUxjd3QwQzNZTGVBdDVDM3NMZkF0OUMzNExnUXVEQzRzTGpndVRDNVlMbUF1WkM1b0xtd3VnQzZFTG93dWtDNllMcXd1dkM3QUxzd3U0Qzd3THdBdkNDOE1MeGd2WkMrRUw0Z3ZqQytRTDVndnBDL0FMOUF2NEMvOExBd3dFREJjTUdRd2VEQ1lNTHd3eEREc01RUXhFREVrTVNneFBERkFNWVF4dkRIZ01mZ3gvRElBTWdneURESVlNaHd5SURJd01qUXlPREpJTWxBeVpESm9NblF5ZURLQU1vd3lsREt3TXJneXZETEVNc3d5MURMY011QXk3REw4TXhRekdETWNNeWd6TERNME16d3pURE5ZTTJRemFETnNNM1F6ZUROOE00QXpoRE9JTTVBem1ET2NNNlF6cURPc003QXp3RFBFTTlRejVEUHNNL3d3Q0RRTU5CUTBHRFFrTkN3MFJEUk1ORncwWURSb05HdzBmRFNjTktBMHJEU3dOTHcweERUVU5OdzA3RFR3TlFBMUJEVUlOUXcxR0RVY05UZzFQRFZBTlVRMVNEVk1OVlExWERWZ05XUTFhRFY4TllBMWlEV1VOWmcxcERYQU5jUTF5RFhjTmVRMTlEWDROZncyQURZUU5oUTJIRFl3TmpnMlFEWllObHcyWURad05udzJnRGFZTnF3MnREYTROcncyeERiSU51UTI2RGIwTndnM0tEY3NOemczWURkOE40QTNoRGVvTjdBM3VEZklOOXczN0RmME4vZzBDRGdNT0JBNEZEZ2dPQ1E0TERoSU9FdzRVRGhnT0hRNGdEaUVPSWc0N0RrTU9TdzVRRGx3T1lRNWpEbWNPYUE1cERtc09jQTV5RG5RT2RnNTNEbm9PZkE1OURuNE9nUTZERG9jT2lnNkxEb3dPamc2ZERxQU9vdzZrRHFjT3FBNnBEcXNPckE2dURxOE9zQTZ4RHJJT3N3NjdEcjBPd0E3QkRzVU94ZzdJRHNzTzB3N1VEdFlPMkE3Y0R0NE80dzdrRHVZTzZRN3FEdXNPN2c3eER2UU85UTc1RHZvTy9nNy9EZ0FQQWc4SER3Z1BDZzhMRHhJUEZBOFdEeGdQSEE4ZER4OFBJQThoRHlZUEtROHFEeXdQTHc4eUR6TVBOUTg1RHowUFFROUdEMDhQVkE5WkQxMFBZUTk3RDN3UGhBK0dENHdQalErUEQ1QVBrZytURDVvUG13K2RENkFQb1Era0Q2VVBwZytzRDYwUHJnK3ZEN0FQc2crMkQ3Z1B1Zys3RDcwUHZnL0FEOEVQd2cvRUQ4a1B5Zy9ORDg4UDBRL1NEOU1QMUEvVkQ5a1AyZy9iRDkwUDN3L2dEK0VQNVEvcEQrb1A2dy9zRCs4UDhBL3hEL0lQOHcvMEQvWVA5dy8vRHdBUUNoQU5FQTRRRHhBUUVCSVFGUkFYRUJrUUdoQWlFQ01RSnhBb0VDa1FLaEFyRUMwUU1oQTFFRHdRUXhCR0VFZ1FTUkJLRUVzUVRCQk5FRTRRV0JCWkVHRVFZaEJyRUd3UWJSQjFFSGdRZXhDRkVJZ1FqQkNORUk4UWtCQ2FFSnNRb1JDaUVLTVFweENwRUtzUXJCQ3hFTE1RdlJDK0VNRVF4QkRGRU1rUXpCRFJFTklRMHhEVUVPQVE0eERyRU8wUThCRDBFUGNRK0JENkVBc1JEUkVQRVJFUkVoRVVFUllSR2hFY0VSNFJJeEVsRVNnUktSRXFFU3NSTGhFMEVUWVJPQkZDRVVRUlJSRklFVW9SVEJGUEVWUVJYQkZkRVY0Ulh4RmlFV2dSYXhGM0VYc1JoUkdHRVpBUm5CR2lFYU1ScVJHcUVhNFJyeEd5RWJrUnZoSEFFY2dSenhIUUVkVVIyQkhqRWVvUjdCSHZFZklSK3hIOEVRRVNDUklSRWhJU2hSS0hFcEVTbFJLV0Vwa1NuUktmRXFBU29oS3VFcllTdUJMR0VzY1N5eExNRXMwU3poTFNFdFFTMXhMY0V1UVM3Qkx0RXZRUzlSTDNFdndTL1JMK0VnQVRBUk1DRXdjVER4TVNFeFVURmhNWkV4d1RJeE1vRXlrVEtoTXJFeTRUTHhNd0V6RVROQk0xRXpZVE9CTThFejRUUVJOQ0UwY1RTaE5MRTA0VFVCTlRFMWdUV1JOYUUxc1RYUk5nRTJJVFl4TmtFMllUYUJOcUUyNFRieE55RTNNVGRCTjFFM1lUZUJOOEUzMFRnUk9FRTRVVGlCT0tFNDBUanhPUUU1RVRreE9VRTVZVGx4T1lFNWtUbXhPZEU1OFRvaE9qRTZZVHFoT3JFNjBUc3hPMEU3WVR1Qk82RTdzVHZoTy9FOEVUd2hQREU4UVR4UlBHRThvVHl4UE1FODBUenhQUkU5TVQxaFBhRTl3VDN4UGtFK1lUNkJQcUUrc1Q3UlB1RS9NVDlCUDFFL1lUK0JQNkUvd1QvaE1FRkFjVUNoUU9GQklVRXhRV0ZCY1VHUlFhRkI0VUh4UWhGQ0lVSlJRbUZDY1VMeFF6RkRRVU5SUTNGRGdVT2hROEZENFVQeFJDRkVNVVJCUkZGRWNVU0JSTEZFd1VWQlJjRkdBVVlSUmlGR1FVWnhSeUZIUVVneFNHRkljVWlSU09GSlVVbUJTYUZKd1VuaFNmRktFVXBSU21GS2NVcUJTcUZLc1VyaFN5RkxVVXVCUzVGTG9VdXhTOUZNQVV3UlRDRk13VTBCVFlGTnNVM1JUaUZPVVU3eFR5RlBZVTl4VDRGUGtVK2hUOEZBTVZDaFVORlE0VkdCVWJGUndWSHhVaUZTZ1ZLeFVzRlM4Vk1CVXhGVGdWT3hVOUZVb1ZUaFZURlY0VllCVmlGV2dWYVJWdkZYWVZnUldDRlk0VnJ4VzNGYjRWenhYU0ZlUVY1aFgwRlFBV0FSWUZGZ1lXQ1JZS0ZnNFdFUllVRmhjV0dCWWFGaHdXS1JZcUZpc1dMaFl2RmpFV05SWTJGa01XUkJaSEZrc1dUQlpORms0V1ZSWldGbGtXWkJacEZtc1diQlp0Rm5nV2dCYUVGcElXbGhhWEZwZ1dwUmFtRnFzV3JCYXhGclFXdUJhNUZyc1d3UmJHRnNvV3poYlJGdFlXM1JiZ0Z1WVc1eGJxRnZNVy9SWUNGd3dYRUJjUkZ4Y1hJUmN0RjBNWFRSZE9GMDhYVWhkVkYxWVhWeGRZRjE4WFloZG1GMmtYYXhkc0YyMFhiaGR2RjNJWGN4ZDNGM2tYZXhkK0Y0RVhneGVJRjRrWGloZU1GNWdYcEJlbEY2Z1hxUmV3RjdNWHR4ZTRGN2tYdlJlK0Z3Sk9CRTRQVGhKT0YwNGZUaU5PSms0cFRpNU9NVTR6VGpWT04wNDhUa0JPUkU1R1RrcE9VVTVWVGxkT1drNWlUbWRPYWs1eVRuUk9mMDZIVG9wT2tFNldUcGxPbkU2alRxcE9yMDYwVHJaT3ZFN0lUc3hPejA3U1R0cE80RTdpVHVaTzZVN3RUdkZPOUU3NFR2eE8vazRBVHdKUEMwOFNUeHhQSVU4alR5aFBMRTh4VHpOUE5VODNUemxQTzA4K1QwUlBSMDlTVDFSUFZrOWhUMlpQYUU5cVQyMVBjVTkxVDNkUGZVK0FUNFZQaWsrTVQ0NVBrRStTVDVWUG1FK2NUNTVQb1Ura1Q2dFByVSt3VDdaUHdFL0dUOHRQMGsvWlQ5dFA0RS9pVCtSUDUwL3JUL0JQOGsvMFQvbFArMC8vVHc1UUVGQVRVQlZRRzFBZFVDQlFJbEFuVUN0UUwxQTdVRDFRUDFCRVVFbFFUVkJRVUZaUVcxQmRVR1pRYlZCNFVIeFFnVkNHVUlsUWpsQ2tVS1pRcWxDdFVMTlF2RkRRVU5kUTIxRG9VTzlROUZEMlVQeFFDRkVNVVJOUklsRkNVVWRSU2xGTVVVNVJVbEZYVVZ0UlhWRmpVV1pSYVZGdlVYSlJlbEYrVVlOUmhsR0tVWTVSazFHWVVacFJuVkdoVWFOUnBsR3RVYlJSdUZHK1VjRlJ4VkhJVWNwUnpWSFFVZEpSM0ZIZVVlSlI1VkhzVWU1UjhWSDBVZmRSL2xFRVVnbFNDMUlQVWhOU0hGSWVVaUZTSlZJcVVpeFNMMUl4VWpSU1BGSStVa1JTUzFKT1VsSlNWVkpYVWwxU1gxSmlVbVpTYUZKclVuQlNjMUorVW9CU2cxS0pVcEZTbEZLY1VxUlNybEswVXNCU3hGTElVc3BTekZMUlV0TlMxMUxaVXVCUzVWTHhVdnRTQVZNSFV3bFREbE1SVXhoVEcxTWVVeUpUSkZNblV5dFRMMU04VTBCVFFsTkVVMFpUUzFOUVUxUlRXRk5iVTExVFpWTm9VMnBUYkZOeVUzWlRlVk43VTRCVGcxT0hVNHBUamxPV1U1bFRtMU9lVTZCVHBGT25VNnBUcjFPM1U3eFR3RlBEVTg1VDBsUFZVOXBUM0ZQaFUrZFQ5RlA2VS81VEFsUUZWQWRVQzFRVVZCaFVIRlFpVkNSVUtsUXdWRE5VTmxRNlZEMVVQMVJCVkVSVVIxUkpWRXhVVVZSYVZGMVVZMVJsVkdkVWFWUjBWSGxVZmxTQlZJTlVoVlNIVkkxVWtWU1RWSmRVbkZTZVZLVlVybFN3VkxKVXRWUzVWTHhVdmxURFZNVlV5bFRXVk5oVTIxVGdWT3RVNzFUMFZQdFUvbFFBVlFKVkNGVUtWUkpWRlZVY1ZTRlZKVlVvVlN0VkxWVXlWVFJWT0ZVOVZVQlZRbFZGVlVkVlMxVlJWVmRWWFZWaVZXaFZhMVZ2VlhsVmZWVi9WWVZWakZXUVZaSlZsVldhVlo1Vm9GV29WYkpWdEZXMlZiaFZ1bFc4VmI5VnhsWEtWYzVWMVZYWFZkNVY0RlhpVmVkVjZWWHRWZkJWOUZYMlZmaFYvMVVDVmdwV0RWWVFWaGxXSEZZZ1ZpVldLRll1VmpOV05WWTNWanBXUEZaQVZrOVdWVlphVmwxV1kxWmxWbTFXY2xaM1ZuMVdoMWFRVnBSV3BGYXdWcmhXdlZiTFZ0VlcyRmJjVnVOVzVWYnNWdTVXOGxiMlZ2dFdBRmNGVndkWEMxY2RWeUJYSkZjclZ6RlhORmM4Vno5WFFWZERWMGhYUzFkU1YxaFhZbGRsVjJkWGJGZHVWM0JYZEZkNFYzMVhoMWVOVjVSWG5GZWxWNmhYcWxlc1Y2OVhzMWUxVjdsWHhGZk1WOUJYMDFmV1Y5dFgzbGZoVitWWDdsZndWL1ZYKzFmK1Z3RllBMWdJV0F4WURsZ1NXQlpZR2xnZldDSllKVmdyV0RGWU5saEZXRTVZVWxoVldGbFlYMWhtV0cxWWYxaUNXSVJZaGxpS1dKUlltMWlnV0twWXZWakNXTVpZMGxqV1dPVlk3Vmp2V1BGWTlGajNXUHBZQTFrRldRaFpEbGtRV1JkWkcxa2RXU0JaSmxrb1dTeFpNRmt5V1RWWk8xazlXVU5aUlZsS1dVeFpVRmxTV1ZsWlcxbGhXV05aWmxsMVdYZFplbGwrV1lWWmlWbUxXWTVabEZtWVdacFpuMW1tV2F4WnNGbXpXYnBadkZtL1djZFp6Rm5WV2RsWjIxbmVXZVJaNWxucFdlMVorbG44V1FCYUFsb0tXZzFhRWxvVVdobGFIVm9oV2lSYUpsb3FXak5hTlZvM1dqMWFRVnBIV2t0YVZscGJXbU5hYUZwclduaGFlMXFBV3BOYW5GcXJXclJhdGxxNVdyOWF3MXJLV3MxYTAxclZXdGRhMlZyZFd1SmE1RnJuV3VwYTdGcnlXZ3BiR0Zzeld6VmJPRnRCVzFKYlZsdGVXMkJiWjF0clcyMWJjbHQwVzNaYmUxdCtXNEpiaGx1S1c0MWJrRnVVVzVaYm4xdW5XNnhic1Z1M1c3cGJ3RnZEVzhoYnpWdlJXOVJiNEZ2aVcrWmI2VnZ2Vy9GYi9Wc0FYQUpjQlZ3SFhBdGNFRndTWEJkY0dWd2JYQjVjSTF3bVhDaGNMVnd5WERWY1ExeEdYRXhjVWx4V1hGcGNYMXhpWEdSY1oxeHdYSEpjZTF5QVhJTmNpVnlPWEpKY2xWeWRYS1JjcWx5dVhMSmN0RnkyWExsY3ZsekFYTUpjeFZ6TVhOTmMybHppWE9kYzZWenJYTzVjOFZ6OFhBUmRDRjBQWFJWZEYxMGNYUjlkSlYwb1hTcGRMMTAxWFQ5ZFNGMU5YVmxkWEYxZVhXcGRiVjF3WFhWZGcxMmFYWjVkdUYzR1hjNWQzRjNmWGVOZDZsM3NYZkJkOVYzNFhmOWRCRjRIWGdsZURWNFNYaGRlSGw0b1hpOWVNbDQ1WGo1ZVExNUdYazFlVmw1Y1hsOWVZMTUxWG5kZWVWNStYb0ZlaFY2SVhveGVrbDZZWHB0ZW5WNmhYcWhlcmw2MFhycGV2MTdMWHRSZTExN2NYdWxlNjE3MVh2aGUrMTRGWHdsZkRGOFFYeEpmRkY4V1h4bGZIRjhoWHloZksxOHVYekJmTWw4N1h6MWZRVjlSWDFSZldWOWVYMk5mWlY5blgydGZibDl5WDNSZmVGOTZYMzFmZzErR1g0MWZrVitUWDVaZm1sK2RYNkpmcVYrclg2OWZ0bCs0WDc1ZngxL0tYODVmMDEvYVg5NWY0bC9sWCtoZjdGL3ZYL0pmOWwvNVgveGZCMkFMWUJCZ0UyQVhZQnBnSG1BaVlDeGdNR0EyWUQxZ1FHQkVZRXhnVG1CUllGTmdWbUJiWUY1Z1pXQnVZSEZnZEdCM1lINWdnR0NGWUlwZ2ptQ1RZSlZnbDJDY1lKNWdvV0NrWUtkZ3FXQ3VZTEJnczJDMVlMbGd2V0RIWU14ZzBtRFdZTmxnMjJEZVlPRmc2bUR4WVBWZzkyRDdZQUpoQjJFS1lSQmhGbUViWVNGaEpXRW9ZU3hoUUdGSllVdGhUV0ZQWVZKaFZtRmVZV05oYVdGeFlYWmhlR0dNWVk5aGxXR2VZYXBocldHNFliOWh3MkhKWWN4aDAySFZZZWRoOW1FQVlnZGlDV0lUWWhsaUhHSWdZaU5pSm1JcllpMWlMMkkxWWpoaVFtSkVZa3BpVDJKVllsbGlYR0prWW1oaWNXSjBZbmRpZW1KOVlvRmloV0tMWXBSaW1XS2NZcU5pcG1LcFlxMWlzbUsyWXJwaXZtTEFZc05peTJMUFl0RmkxV0xkWXVCaTVHTHFZdkJpOG1MMVl2aGlBR01EWXdwakQyTVNZeGRqSEdNbVl5bGpMR013WXpOak8yTStZMFJqUjJOS1kxRmpWbU5nWTJSamFHTnFZMjlqY21ONFkzeGpnV09EWTR0ampXT1JZNU5qbDJPWlk2RmpwR09tWTZ0anIyT3hZN1ZqdVdPN1k3MWp2MlBGWThkanltUFJZOU5qMTJQZlkrSmo1R1ByWSs1ajgyUDFZL2RqK1dQK1l3TmtCbVFOWkJGa0ZXUWRaQjlrSW1RblpDdGtMbVExWkR0a1BtUkFaRUprU1dSTFpGTmtWV1JaWkY5a2FHUnFaRzVrZTJTRFpJWmtpR1NUWkpka21tU2ZaS1ZrcW1TdlpMRmt0bVM1Wkx0a3ZXVEJaTU5reG1UUFpORmswMlRaWk45azQyVGxaT2RrQVdVS1pSTmxHV1VtWlN4bE1HVTNaVHBsUEdWQVpVWmxTbVZOWlZCbFVtVlhaVnBsWEdWZlpXUmxaMlZ0WlhGbGMyVjFaWGhsaUdXTlpaSmxsR1dZWlpwbG5XV2daYUpscG1Xb1phcGxyR1d1WmJGbHVtVytaY0pseDJYTlpkQmwwMlhZWmVGbDQyWHFaZkpsK0dYN1pRRm1CR1lIWmd0bURXWVFaaFptR21ZZVppRm1KbVlwWmk1bU1HWXlaamRtUFdZL1prSm1SR1pOWmxCbVdHWmJabUJtWW1abFptZG1hV1p4Wm5WbWVHWjdabjltZzJhRlpvaG1qV2FTWnBobW5tYXBacTltdFdhNlpyOW0ybWJlWnVkbTZtYnhadlZtK0diNlp2MW1BV2NNWnc1bkVXY1daeGhuSEdjZVp5Qm5KMmNwWnk1bk1HY3laelpuTzJjK1owRm5SR2RIWjBwblRXZFNaMVJuVjJkZFoySm5abWRyWjI1bmNXZDBaM1puZUdkOVo0Qm5nbWVGWjRobmltZU1aNUZubG1lWlo1dG5uMmVrWjZabnFXZXNaNjVuc1dlMFo3bG53bWZGWjlWbjIyZmZaK0ZuNDJmbVorcG43V2Z5Wi9Wbi9tY0JhQVpvRFdnUWFCSm9GR2dZYUI1b0ltZ3JhRFJvT21nL2FFZG9TMmhOYUU5b1VtaFdhR3BvYkdoMWFIaG9nbWlFYUlkb2tHaVVhSmhvbzJpcGFLNW9zV2kwYUxab3dXakRhTXBvekdqT2FOTm8xbWpaYU50bzRXamthTzlvOG1qMmFQdG8vV2dDYVFacERHa1BhUkZwRTJraGFTVnBMbWt4YVRWcE9taythVUJwUTJsVmFWaHBXMmxmYVdGcFpHbG5hV3hwYjJseWFYcHBmV21CYVlOcGhXbUthWTVwbG1tWmFaMXBxV21zYWE1cHNtbTFhYmhwdkduQ2FjdHB6V25QYWRGcDFXbmNhZUZwN21uemFmNXBBR29MYWhscUlHb2lhaWxxSzJvd2FqSnFObW8vYWtWcVNHcFJhbHBxWEdwaWFtWnFjbXA2YW4xcWdXcUZhbzlxa21xWWFxRnFxbXF0YWlWcktHc3phemhyTzJzL2EwUnJTR3RLYTAxcldtdG9hMnRyZW10OWE0VnJpR3VNYTQ1cmxHdVhhNXhyb211cmE3WnJ1R3ZBYThOcnhtdk1hODVyMEd2WWE5cHIzR3ZpYSt4cjhHdjBhL1pyK212K2F3aHNEbXdTYkJkc0hHd2diQ05zSld3cmJERnNNMncyYkRsc1BteERiRWhzUzJ4UmJGWnNXR3hpYkdWc2EyeHhiSE5zZFd4M2JIcHNmMnlFYklkc2lteU5iSkZzbFd5YWJKeHNvR3lpYktoc3JHeXZiTFJzdW16QWJNWnN5MnpOYk5GczJHemNiTjlzNUd6bWJPbHM3R3p5YlBScytXei9iQUp0QlcwSWJRMXREMjBUYlJodEhHMGZiU1p0S0cwc2JTOXRORzAyYlRwdFAyMUNiVVJ0U1cxTWJWQnRWVzFiYlYxdFgyMWhiV1J0WjIxcmJYQnRkVzE1YlgxdGcyMkdiWXB0alcyUGJaSnRsbTJjYmFKdHBXMnNiYkJ0czIyMmJibHR3VzNJYmMxdDBtM1hiZHB0MzIzaWJlVnQ1MjN0YmU5dDhtMzBiZmh0K20zOWJRWnVDMjRQYmhKdUZXNFliaHR1SG00aWJpWnVLbTRzYmk1dU1HNHpialZ1T1c0N2JrVnVUMjVWYmxkdVdXNWNibUJ1Ykc1dmJvQnVoRzZIYm9wdWtXNlpicDF1b0c2amJxWnVxRzZyYnJCdXMyNjFicmh1dkc2K2JzTnV5RzdNYnRCdTBtN1didGh1MjI3amJ1ZHU2bTcxYnZwdUEyOEhid3B2RUc4V2J5RnZKVzhzYnk1dk1HOHlielJ2TjI4L2IwaHZURzlPYjFsdlhXOWZiMk52WjI5dmIzTnZkVzk1YjN0dmZXK0ZiNHB2ajIrZGI2SnZxRyswYjdkdnVtL0JiOE52eW0vVGI5OXY0bS93YnhKd0hIQWtjRFp3T25CTmNGQndYM0J1Y0hGd2QzQjVjSDF3Z1hDR2NJdHdqM0NUY0pkd21uQ2VjTEJ3c25DMGNMcHd2bkRFY01sd3kzRGFjTnh3NEhEbGNPcHc3bkR3Y1BodytuRCtjQXR4RVhFVWNSZHhHM0VuY1RKeE4zRkdjVXR4VFhGUGNWMXhYM0ZsY1dseGIzRjBjWGx4ZTNGK2NZVnhpM0dRY1pWeG1uR2hjYWx4clhHMGNiWnh1bkhFY2M5eDFuSGhjZVp4NkhIdmNmcHhCM0llY2lseUszSXRjakp5T25JOGNqNXlRSEpKY2s1eVUzSlhjbHB5WEhKZWNtQnlZM0pvY21weWNISnpjblp5ZTNLQ2NvVnlqSEtPY3BCeWszS2djcTV5c1hLMWNycHl4WExKY3M5eTBYTFRjdGh5Mm5JQUFBSUFBd0FKQUFzQURRQU9BQklBRXdBWkFCd0FJQUFoQUNRQUpnQW9BQ3NBTEFBdUFEQUFNZ0EyQUVNQVJRQkdBRW9BVWdCZEFGNEFiQUJ4QUhNQWRBQjFBSGNBZVFCOUFJRUFoQUNHQUl3QWpRQ1BBSkFBa3dDVkFKa0FtZ0NmQUtFQW9nQ3BBSzBBcmdDeUFMTUF0QUMzQUxzQXl3RE1BTTRBMGdEYkFPRUE0d0RrQU9VQTVnRG5BT2dBNmdEdkFQTUFCZ0VIQVFnQkNRRVdBUmdCSFFFakFTUUJKUUVvQVNzQkxRRXVBVGtCT2dGQ0FWSUJhUUZ5QVhNQmRBRjFBWFlCZlFHQkFZSUJpUUdOQVpVQmxnR1hBWmdCbkFHZEFaOEJwQUdtQWFjQnFBR3BBYW9CcXdHdEFhNEJzZ0cwQWJZQnR3RzdBYjhCeHdIS0FkRUIwZ0hWQWRvQjNRSGZBZU1CNWdIbkFlZ0I2UUhxQWV3QjdRSHVBZk1COUFIMkFmZ0Ird0g4QWY0QkFnSURBZ1FDQmdJSUFnc0NEQUlOQWhFQ0V3SVhBaGtDR3dJY0FoMENJUUlpQWlVQ0tRSXFBaXNDTGdJdkFqQUNNZ0l6QWpVQ053STVBandDUFFJL0FrY0NUUUpPQWxNQ1ZBSllBbDhDWWdKcUFtd0NiUUp3QW5FQ2NnSjBBbllDZUFKNUFuc0NmUUtIQXBBQ2tnS1RBcDBDbndLaEFxSUNvd0tsQXFZQ3B3S3BBcXdDc1FLNUFyb0N1d0srQXNBQ3dRTERBc1VDeHdMSUFza0MxQUxZQXRrQzNBTGRBdUFDNFFMbUF1Y0M2QUxyQXV3Qzd3TDNBdjhDQkFNRkF3WURDQU1VQXhjREdnTWdBeUlETGdNdkF6RURNZ016QXpRRE53TTVBem9EUHdOQUEwRURUZ05YQTFvRFh3TmdBMkVEWWdOakEyY0RhUU5xQTI0RGRBTjJBM2tEZWdON0Ezd0RmUU4rQTRFRGdnT0RBNFVEaHdPS0E0d0RqUU9PQTVJRGt3T1hBNWdEbVFPYUE1d0RvUU90QTdVRHVRUERBOFFEeGdQSUE4a0R6QVBOQTg4RDBBUFJBOUlEMHdQYkE5OEQ0d1BsQStnRDZ3UHZBL0lEOVFNREJBWUVDd1FNQkE0RUVBUVdCQmtFSmdRd0JEVUVSQVJKQkVvRVN3UlBCRkFFV1FSYkJGMEVYZ1JnQkdFRVpRUm1CRzBFYmdSekJIVUVlUVI5QkljRWt3U2VCS01FcEFTbEJLWUVxQVNxQktzRXJBU3ZCTEVFc3dTNUJMd0V2UVMrQkw4RXdBVEJCTWdFeWdUTEJNMEV6Z1RRQk5RRTFRVGFCTndFM2dUaEJPSUU1QVR6QlBZRTl3VDRCUGtFL3dRSkJRNEZKZ1VwQlNvRkxnVXZCVEFGTVFVMUJUZ0ZPZ1U5QlQ0RlFnVkRCVVlGU3dWV0JXRUZhd1Z0QlhFRmN3VjBCWG9GZXdXRUJZWUZod1dLQllzRmpBV05CWkFGa1FXVEJaWUZsd1daQlpvRm5RV2VCWjhGb0FXaUJhTUZwd1dvQmFrRnFnV3dCYkVGc2dXekJiVUZ0Z1czQmJnRnVRVzZCYndGdlFYSUJjb0Z6QVhOQmM0Rnp3WFJCZElGMWdYZEJkOEY0Z1hqQmVjRjZnWHRCZkFGOGdYMUJmMEZBUVlGQmdrR0NnWVBCaEVHRkFZWEJob0dIUVlmQmlRR0tBWXBCakVHTkFZMkJqd0dSQVpLQmt3R1dRWmZCbW9HandhVkJxQUdwd2FwQnFvR3JRYXZCckFHdEFhM0Jya0d2Z2JBQnNJR3hRYkdCc2NHeUFiUEJ0QUcwZ2JVQnRzRzRRYnBCdXNHK1FZT0J3OEhFd2NXQnhrSFZ3ZGZCNDBIbEFjZ0NDVUlLZ2hrQ0h3SWZ3aUFDSUVJZ3dpRUNJVUloZ2lIQ0lnSWlRaUtDSXNJakFpVENKUUluZ2lnQ0tFSW9naW1DS2NJckFpdkNMRUlzZ2kyQ0xvSXZBakVDTVVJeGdqTENOQUkwZ2pUQ05VSTF3amVDTjhJNUFqbUNPY0k2QWpyQ084SThBanhDUFlJK0FqK0NBRUpBd2tIQ1FnSkNRa1FDUk1KRkFrWUNSb0pHd2tjQ1I0SklRa2lDU1FKS2drckNTd0pMZ2t2Q1RBSk1nazBDVGNKT3drOENUOEpRQWxPQ1ZRSllRbGpDV1FKWlFsbUNXd0piZ2x2Q1hBSmNRbHlDWFVKZGdsM0NYZ0plZ2w4Q1gwSmZnbURDWW9KaXdtTkNZOEprQW1SQ1pJSmt3bVVDWlVKbVFtY0NaNEpvQW1oQ2FJSm93bW1DYk1KdFFtMkNia0p1Z20vQ2NZSnh3bklDY3NKekFuUENkUUoyQW5aQ2RvSjNRbmVDZUFKNUFubENlb0o2d252Q2ZBSjlnbjRDZjBKL3drQUNnRUtDUW9QQ2hNS0ZRb1lDaGtLTHdveUNqUUtOUW82Q2tBS1FRcENDa01LU0FwS0Nrc0tUQXBTQ2xNS1ZBcFlDbGtLV2dwYkNsd0tYZ3BqQ21VS1pncG5DbW9LY2dwekNuY0tmd3FFQ29VS2lRcUxDbzBLamdxUkNwSUtrd3FVQ3BnS21ncWJDcHdLbmdxZkNxQUtvZ3FsQ3FjS3FRcXJDcXdLclFxdUNyQUtzUXF5Q3JZS3VRcTZDcndLdmdxL0NzQUt4UXJIQ3NnS3lRckxDc3dLemdyWUN0b0syd3JjQ3QwSzNncmZDdUlLNUFybUN1Y0s3QXJ0Q3ZJSzh3cjBDdnNLL1FvRUN3WUxDZ3NOQ3hFTEV3c1VDeFVMSEFzZ0N5RUxJZ3NrQ3ljTEtBc3FDeXNMTFFzeEN6SUxNd3MyQ3pjTE9nczlDMElMUnd0S0MwMExUZ3RQQzFNTFZBdGFDMTBMWXd0ckMzRUxkQXQ4QzRZTGl3dU1DNUFMa1F1V0M1Y0xtZ3ViQzV3TG5RdWVDNlVMcVF1cUM2c0xzd3UwQzdZTHVndkhDOGtMeWd2TkM4OEwwQXZSQzlNTDF3dlpDOXNMM0F2ZUMrUUw1UXZuQytnTDdRdndDL3NML1FzSkRBME1EZ3dSREJNTUZ3d1lEQ0VNS3d3d0REUU1Qd3hCREVVTVNneE5ERllNVnd4YkRGME1ZZ3hqREdvTWRReDhESDhNZ0F5RERJa01pZ3lSREpnTW5ReWZES0FNcGd5dERMRU13Z3pGRE1vTTFRelpET2tNNmd6NERQc01DdzBORFJJTkZRMFlEU0FOSVEwakRTb05NUTAyRFRjTlBRMUNEVVFOUlExSERVa05UQTFSRFZRTlZRMVdEVmdOV2cxZERWNE5ZQTFrRFdnTmF3MXNEVzhOY3cxMERYVU5lQTE2RFg0TmZ3MkFEWUVOZ2cyRERZVU5oZzJKRFkwTmp3MlJEWk1ObGcyWURaOE5vUTJpRGFZTnFRMnFEYkFOc2cyNkRic052ZzIvRGNNTnhnM0hEY2tOeXczTURkRU4xQTNiRGVNTjVRM21EZWtONmczdURmQU44ZzMzRGZvTi93MEdEZ29PRGc0U0RoVU9IdzRqRGljT0xRNDFEallPT2c0L0RrNE9WQTVXRGxrT1hBNWlEbWdPYWc1ckRuSU9kQTUxRG5ZT2R3NTREbndPZ1E2Q0RvTU9oUTZIRG9nT2pBNlBEcFFPbVE2YURxQU9vUTZrRHFrT3JRNnhEck1PdFE2NURyd092UTYvRHNRT3hnN0lEczhPMEE3VER0VU8xZzdaRHVBTzVRN21EdXNPOEE3ekR2Y08rdzcrRHY4T0NROExEeVFQS2c4K0QwRVBRZzlERDBVUGZ3K0FENEVQaEErSEQ0Z1BpUStORDQ0UGtnK1ZENWdQcEErcUQrQVA2UThaRUNnUU1CQ2pFTUVRQUJFRkVUZ1JPUkU2RVRzUlBCRTlFVDRSUHhGQUVVa1JUUkZPRVZBUldCRmNFV0lSYVJGd0VYUVJleEY5RVlBUmdSR0lFWXNSRHhJUUVoSVNFeElVRWhVU0dCSVpFaHNTSFJJbUVpZ1NMQkl4RWpNU1BSSkFFazBTVGhKUUVsRVNVaEpURWxZU1Z4SmJFbHdTWFJKaEVtTVNaQkpuRW1vU2F4SnRFbkFTY1JKeUVuTVNlaEo5RW40U2dCS0VFb3dTamhLVEVwUVNsUktXRXBrU25CS2VFcUFTb1JLakVxZ1NyaEs2RXJ3U3ZoSy9Fc0FTd1JMQ0VzY1N5UkxLRXMwU3poTFZFdGdTM3hMZ0V1d1M3aEx3RXZjU0NoT2hFNklUb3hPa0U2VVRwaE9wRTYwVHJoT3lFN1lUdUJPN0U3MFR2aE8vRThRVHhSUEdFOGdUeVJQTEU4d1R6UlBPRTg4VDBSUFVFOWNUMlJQYkU5d1QzUlBlRTk4VDRSUGlFK1VUNnhQd0UvRVQ4eFAwRS9ZVDl4UDVFLzRUL3hNQ0ZBUVVDaFFMRkEwVUVSUVdGQjBVSGhRZkZDTVVKUlFxRkNzVUxCUXRGQzRVTHhRd0ZETVVOUlE0RkRrVU9oUTdGRHdVUGhSQUZFSVVReFJGRkVnVVNSUk1GRThVVWhSVkZGY1VXQlJaRkYwVVlCUmtGR2NVYUJSOEZJQVVneFNPRkk4VWxoU2ZGS0VVb3hTa0ZLZ1VxaFNzRks0VXNSU3lGTE1VdEJTM0ZMd1V2UlMrRkw4VXdSVElGTTRVMUJUV0ZOb1UzaFRxRk9zVTdCVHRGUGNVamhXbkZjWVYzeFZVRm44V294YmRGdWdXVHhkN0Y1UVhsUmVXRjVjWG1CZVpGNXNYbkJlZEY1NFhueGVnRjZFWG9oZWpGNlFYcFJlbUY2Y1hxQmVwRjZvWHJCZTBGeHdZSFJnZUdCOFlJQmdoR0NJWUl4Z2tHQ3NZTGhnd0dEUVlOUmcyR0RjWU9CZzZHRDBZUWhoRkdFWVlSeGhKR0VvWVR4aFFHRjBZWGhoZ0dHRVlZaGhsR0djWWFSaHpHSHNZZlJoL0dJRVlneGlFR0lZWWh4aUpHSXNZalJpWEdKNFlvaGlsR0tjWXFCaXNHSzBZcnhpd0dMTVl0aGk0R0wwWXZoakpHTXNZelJqT0dOTVkxeGpxR093WTdoanZHUEVZOGhqMEdQY1lBQmtCR1FZWkRoa1RHUlFaRnhrWUdSc1pJaGtrR1NzWkxCa3RHUzhaTUJsaEdXSVpaeGxvR2VZWjV4bm9HZWtaNmhuckdld1pFaG9VR2hVYUZ4b2FHaUVhUlJwSEdtUWFpUnFXR3BjYW1CcVpHcHNhbkJxZEdwOGFvQnFoR3FJYXJScXZHbkliY3h0MEczVWJkeHQ1RzNvYmV4dUNHNFliaHh1SUc0c2JqUnVTRzVZYmx4dWJHNkVib2h1bUc2b2JxeHVzRzdVYnRodTlHOEVieHh2S0c5VWIyQnZqRytVYjdSdnhHL0liOVJ2MkcvY2IrUnNnSFNJZEl4MGxIU2NkS0IwcEhTb2RMaDB2SFRBZE1SMHlIVE1kT0IwNkhUd2RQaDFBSFh3ZWZSNStIbjhlZ0I2QkhvTWVoQjZGSG9ZZWlSNktIb3NlakI2UUhwRWVreDZVSHA0ZW9CNmtIcVllckI2MUhyWWV2QjdKSHN3ZXpoN1BIdFFlMkI3Ykh0d2UzaDdoSHVNZTVCN2xIdWNlNkI3cEh1MGU5aDczSHZnZUJCOEZId1lmQ0I4TEh3d2ZFaDhUSHh3ZkhoOGxIeVlmSng4b0h5MGZPQjlsSDJjZmN4OTJIOXh5MzNMaWN1cHk5WEw1Y3YxeUFuTUVjd3R6RDNNVWN4aHpIM01qY3laekxYTXZjekp6TlhNNmMwQnpUbk5SYzFOeldITmhjMjV6Y0hOL2M0VnppSE9LYzR4emozT1NjNWR6bkhPZ2M2Tnpxbk9zYzdGenRITzRjN3h6d1hQRGM4dHp6blBTYzlwejMzUGhjK1p6NkhQcWMrNXo4M01FZEFkMEMzUVJkQngwSTNRbmRDbDBLM1F0ZEM5ME1YUTNkRDEwUW5SV2RGaDBYWFJnZEc1MGNYUjRkSDkwZ25TRWRJaDBqSFNQZEpGMG5YU2ZkS3AwdTNUVGROMTAzM1RoZE9WMDUzVHdkUFYwK0hRQWRRVjFEblVRZFJKMUZIVWJkUjExSUhVbWRTcDFMblUwZFRaMU9YVThkVDkxUVhWR2RVbDFUWFZRZFZWMVhYVm5kV3QxYzNWMWRYcDFnSFdFZFlkMWpIV1FkWk4xbFhXWWRadDFubldpZGFaMXJYVzJkYnAxdjNYR2RjdDF6blhUZGRkMTJYWGNkZDkxNVhYcGRleDE4blgxZGZwMS9YVUNkZ1IyQm5ZTGRnMTJFWFlXZGhwMkhIWWhkaU4ySjNZc2RpNTJNWFkyZGpsMlBYWkJka1IyVG5aVmRsZDJYWFpmZG1SMmJIWndkbmwyZkhaL2RvTjJoWGFKZG94MmozYVNkcFIybDNhYWRxVjJyM2F6ZHJWMndIYkRkc2QyeVhiTGR0TjIxWGJaZHR4MjRIYm1kdkIyODNiMWR2cDIvWGIvZGdKM0JYY0tkd3gzRG5jYmR5RjNJM2NuZHlwM0xuY3dkemwzTzNjOWQwSjNSSGRJZDFKM1hIZGtkMmQzYVhkdGQzcDNnWGVHZDQ5M2szZWhkNk4zcG5lb2Q2dDNyWGV4ZDdSM3RuZThkNzUzd0hmT2Q5aDMzWGZrZCtaMzZIZnFkKzkzOUhmM2QvbDNBM2dLZUE1NEUzZ1ZlQmw0RzNnZWVDQjRKSGdvZUNwNExuZ3hlRFY0UFhnL2VFRjRSbmhJZUUxNFQzaFJlRk40V0hoZWVHOTRlSGg5ZUloNGluaVBlSko0bEhpWmVKMTRvSGlpZUtSNHBuaW9lTFY0dW5pL2VNSjR4bmpNZU5GNDFuamFlT2w0N1hqemVQVjQrSGo3ZUFKNUJua1VlUjk1SlhrMWVUMTVQM2xDZVVkNVNubFVlVmg1WVhsamVXWjVhWGx1ZVhCNWVYbDdlWUo1aG5tTGVaQjVtM21vZWJSNXZIbS9lY0o1eEhuSGVjcDV6SG5PZWRONTFublplZUI1NVhub2VlcDU3SG51ZWZGNStYbjhlZjU1QVhvRWVnZDZESG9QZWhWNkdIb2JlaDk2SVhva2VqUjZPSG82ZWo1NlFIcEhlbEo2V0hweGVuVjZlM3FDZW9WNmgzcUplbzU2azNxWmVwNTZvWHFuZXFsNnJucTBlc0I2ekhyWGV0cDY0WHJrZXVkNjducndldnQ2L25vQWV3VjdCM3NKZXd4N0VIc1NleFo3R25zY2V4OTdJWHNuZXlsN0xYc3Zleko3TkhzNWV6dDdQWHMvZTBaN1NIdEtlMDE3VTN0VmUxZDdXWHRjZTE1N1lYdGplMjk3YzN0MmUzaDdlbnQ4ZTM5N2dYdUdlNDU3a1h1V2U1aDdubnVqZTY1N3NudTFlN2w3d252SWU4MTcwbnZVZTl0NzNudmllK2Q3NjN2dmUvSjcrSHY5ZS85N0NId05mQkI4RjN3Z2ZDaDhLM3c1ZkVKOFRueDFmSDU4aW55VGZKWjhtWHlnZktOOHBueXJmSzk4dEh5NmZMOTh3bnpHZk1sOHkzek9mTmg4Mm56ZGZPRjg2WHp3ZlBsOC9Id0xmU0Y5STMwb2ZTeDlNSDF2ZlhoOXAzMnZmVHgrUW41SWZvTituSDZ1ZnJSK3UzN1dmdVIrN0g3NWZncC9FSDhlZnpkL09YODdmME4vUm45U2YxWi9XWDliZjJCL1kzOXJmMjkvYzM5MWYzcC9mMytDZjR0L2pYK1BmNVYvbTMrZ2Y2Si9wWCtvZjdGL3MzKzZmNzUvd0gvQ2Y4Wi95My9OZjg5LzFuL1pmK0ovNTMvcWYrOS84bi8wZi8xL0FvQUhnQTZBRVlBVGdCcUFIWUFoZ0NPQUs0QXlnRFNBT1lBOGdENkFRSUJFZ0VlQVRvQlRnRldBV1lCYmdHdUFjb0NCZ0lXQWlJQ0tnSTJBbElDWGdKbUFub0NqZ0thQXJJQ3dnTE9BdFlDNGdMdUF4WURIZ00rQTJJRGZnT0tBNW9EdWdQV0E5NEQ1Z1B1QS9vQURnUWVCQzRFVmdSZUJHWUViZ1IrQkxZRXdnVE9CTjRFNWdUK0JSNEZKZ1UyQlVvRldnVnVCWVlGbWdXaUJhb0Z2Z1hLQmRZR0JnWU9CaVlHTGdaQ0Jrb0daZ1o2QnBJR25nYW1CcTRHMGdieUJ4SUhIZ2N1QnpZSGtnZWlCNjRIdWdmV0IvWUgvZ1FPQ0I0SU9naEdDRTRJVmdoMkNJSUlrZ2ltQ0xvSXlnanFDUElJL2drV0NTSUpLZ2t5Q1VJSlpnbHVDWUlKcGduR0NkWUo3Z29DQ2c0S0Znb21DaklLUWdwT0Ntb0tlZ3FDQ29vS25ncktDdFlLNmdyK0N3b0xGZ3NtQzBJTFdndG1DM1lMaWd1ZUM3SUx3Z3ZLQzlZTDRndnFDL0lJS2d3MkRFSU1TZ3hhREdJTWRneW1ETG9Nd2d6S0RONE03Z3oyRFFZTkVnMGlEU29OVGcxV0RYWU5pZzNDRGVZTitnNGVEaW9PUGc1U0RtWU9kZzUrRG9ZT3NnN1dEdTRPK2c4S0R4b1BJZzh1RHpZUFFnOVdEMTRQWmc5NkQ0b1BtZyt1RDg0UDZnLzZEQW9RRmhBZUVFSVFTaEJtRUhvUXBoREtFT1lRK2hFZUVVb1JZaEYyRVlvUmtoR3FFYm9SeWhIU0VkNFI1aEh1RWc0U0toSTJFajRTWWhKcUVuWVNpaExDRXM0UzFoTHVFdm9UQWhNS0V4WVRMaE02RTBvVFVoTmVFM29UaGhPU0U1NFR0aFBHRS9ZUUFoUTJGRW9VVWhSaUZHNFVnaFNLRkxZVStoVVNGUzRWWGhWcUZYNFZsaFdtRmM0VjFoWHlGZjRXR2hZaUZrSVdkaGFXRnFZV3JoYkdGdUlXNmhjS0Z5b1hSaGRTRjFvWGRoZVdGNm9YOGhRQ0dCb1lTaGhlR0tJWXFoam1HUFlaU2hsV0dXNFpmaG1PR2JZWnZobktHZzRhT2hwU0dsb2FlaHFXR3E0YXRocktHdDRhN2hzR0d4WWJJaHN5RzBvYlZodHFHM0liZ2h1V0c2b2J2aHZXRytvYi9oZ0dIQkljTGh3NkhGSWNXaHhtSEc0Y2RoeCtISkljbWh5cUhMNGN5aHpXSE9JYzhoMENIU29kTmgwK0hWSWRZaDFxSFlZZG1oMitIY1lkMWgzZUhmNGVFaDRhSGlZZU1oNDZIbEllWWg2Q0hxWWV1aDdDSHRJZTJoN3VIdm9mQmg4ZUh6SWZVaDl5SDRZZm1oK3VINzRmNmgvK0hCSWdMaUJTSUY0Z2NpQ09JTTRnNmlEMklRWWhHaUU2SVZZaFlpRnFJWm9ocWlHMkliNGh4aUhPSWVJaUFpSU9JaG9pSmlJeUlqb2lUaUplSW5ZaWppS1dJcklpdWlMS0l1SWk5aU1PSXg0aktpTStJMDRqV2lOcUk0SWptaU9tSThvajFpUHFJL1lqL2lBT0pDNGtSaVJTSkhJa2lpU2FKTElreGlUV0pONGxDaVVXSllJbG5pWHlKZ0ltQ2lZU0poNG5EaWMySjA0blhpZHVKM1luZmllU0o1NG5zaWZDSjlJa0JpZ2lLUDRwSmlucUtpNHFVaWdpTEo0dG5pMjJMckl1eGk3dUx4NHZRaStxTENZd2VqRGlNUW94SWpFcU1UWXhXakZ1TVk0eHNqSFNNZTR5RGpJYU1pNHlOakpXTW1Zd2dqVkdOVjQxZmpXV05hSTFzalc2TmNZMTRqWUtOaG8yTWpaS05sWTJnamFTTnNvMjJqYm1OdTQyOWpjQ054WTNIamMyTjBJM1NqZGlOM0kzZ2plV042WTN0amZDTjlJMzJqZnlOL28wR2pndU9EWTRRamhXT0lJNGtqaXVPTFk0d2pqS09ObzQ3amo2T1E0NUZqa3lPVTQ1YWptZU9hbzV1am5HT2M0NTFqbmVPZlk2QWpvS09obzZJanBHT2xZNmRqcCtPclk2d2pyT091NDdQam1xUGdJK01qNUtQblkrZ2o2U1BxbytzajdLUHQ0KzZqNytQdzQvR2o4bVB6NC9TajlhUDJvL2dqK09QNTQvc2orK1A4WS8wai9xUC9vOEhrQXlRRHBBVGtCV1FHSkFja0NPUUo1QXdrRGVRT1pBOWtEK1FRNUJGa0VpUVRwQlVrRm1RWEpCa2tHYVFhWkJ2a0hhUWZwQ0JrSVNRaVpDTWtKS1FsSkNXa0ppUW1wQ2NrSjZRcEpDbmtLdVFyWkN5a0xlUXZKQy9rTUtReHBESWtNdVEwcERVa05pUTNwRGprT21RN0pEdWtQQ1E5WkQ1a1ArUUE1RUZrUnFSSDVFa2tUQ1JNcEU2a1VTUlI1RlJrVk9SV0pGYmtWK1JacEZya1cyUmM1RjZrWUNSaHBHSWtZcVJqcEdUa1p5UnBKR3JrYkNSdHBHN2tjaVJ5NUhRa2RLUjNaRjFrbytTcjVMSmtqK1RhNU9Razh1VDE1TS9sR3lVa1pTV2xKaVV4NVRQbE5PVTJwVG1sUHVVSEpVZ2xTZVZNNVU5bFVPVlNKVkxsVldWV3BWZ2xXNlZkSlYzbFlDVjdKWC9sUWVXRTVZWWxodVdIcFlnbGlPV0s1WXZsamVXUHBaQmxrT1dTcFpPbGxHV1ZwWmNsbUNXWTVabGxtdVdiWlp6bG5pV2g1YUpsb3lXanBhUmxwV1dtcGFkbHFpV3NaYTBscmVXdXBhL2xzS1d5SmJLbHRDVzA1YldsdUdXNjVid2x2U1crSmI2bHYrV0FwY0Zsd3FYRUpjVWx4ZVhIWmNmbHl1WExwY3hsek9YT3BjL2wxU1hWNWRhbDF5WFg1ZGpsMmFYYXBkMWwzZVhmWmVHbDR5WGpwZVRsNVdYbVplaGw2U1hySmV1bDdDWHM1ZTFsK2lYN3BmMGwvZVhpNWlPbUpLWWxaaVptS09ZcUpqUG1OU1kxcGpibU9DWTZaZ09tUkdaTDVsV21XU1pacGx6bVhpWmU1bCttWUtaaVptTW1ZNlptcG1tbWFtWmNwcURtb21halpxVW1wbWFwcHFwbXJLYXVacTdtcjJhdzVyR21zMmEwcHJVbXRtYTRKcmltdWVhN0pydW12Q2ErcHI4bWdTYkNac1FteFNiSUpza216Q2JNNXM5bTBhYlNwdE9tMUNiVXB0Vm0zMmNnSnlEbkltY2pKeVBuSk9jbHB5ZG5LcWNySnl2bkxtY3ZwekluTkdjMnB6Z25PT2NKSjRubmk2ZU1KNDBuanVlUUo1Tm5sQ2VVcDVXbmxtZVhaNWZubVdlYnA1eW5uU2VnSjZEbm9tZWpKNlVucDZlb0o2bm5yV2V1WjY4bnIrZXhaN0tudENlMHA3Vm50bWUzcDdobnVPZTVwN29udXVlOEo3Nm52MmUvNTRNbncrZkVaOFVueGlmR3A4aG55T2ZMWjh3bnppZk9wODhueitmUlo5U240R2ZqWitjbjZHZkFBQWZBU0FCb0FLaUFxTUNwQUtsQXFZQ3B3S29BcWtDclFLdUFxOENzQUt4QXJNQ3RBTFlBdWNDNmdMc0F2QUM4UUx5QXZNQzlRSUFBd2tEQ2dNTUF3OERFQU1SQXhJREZBTVZBeFlERndNWUF4a0RHZ01iQXh3REhRTWdBeUVESXdNbEF5WURLQU15QXpZRFJBTklBMGtEVlFOV0EyQUR4dVFBTU9ibHlnTFpBaE1nRlNBbElEVWdCU0VKSVpZaEZTSWZJaU1pVWlKbUlyOGlVQ1dCSlpNbHZDWGlKUWttbFNJU01CMHd2T2NoTUtNeWpqT2NNNkV6eERQT005RXoxVE13L3VMLzVQL2k1eUVoTVRMajV4QWc1T2Y4TUpzdy9UQUdNSjB3U2Y1VS9sbithUDQrTVBBdkJ6RDA1eXo1ZWZtVitlZjU4ZmtNK2czNkR2b1AraEg2RS9vVStoajZIL29nK2lINkkvb2sraWY2S1BvcCtvRXVGdWdYNkJqb2hDNXpORWMwaUM2TExyU2ZualVhTmc0MmpDNlhMbTQ1R0RtMW44ODUzemx6T3RBNXRwKzNuMDQ3Ymp6Z1BLY3VNZWk0bjZvdVZrQmZRYTR1TjBPekxyWXV0eTQ3NkxGRHJFTzdMdDFEMWtSaFJreEd1WjhqUnlsSGZFZU5SOG91UjBsNlNYMUpna21EU1lWSmhrbWZTWnRKdDBtMlNicWZWZWlqVEo5TW9FeWhUSGRNb2t3VFRSUk5GVTBXVFJkTkdFMFpUYTVOdTU5S1ZUK1d3MWNvWTg1VUNWWEFWSkYyVEhZOGhlNTNmb0tOZURGeW1KYU5seWhzaVZ2NlR3bGpsMmE0WFBxQVNHaXVnQUptem5iNVVWWmxySEh4ZjRTSXNsQmxXY3BoczIrdGdreGpVbUx0VXlkVUJudHJVYVIxOUYzVVlzdU5kcGVLWWhtQVhWYzRsMkovT0hKOWRzOW5mblpHWkhCUEpZM2NZaGQ2a1dYdGN5eGtjMklzZ29HWWYyZEljbTVpekdJMFQrTjBTbE9lVXNwK3BwQXVYb1pvbkdtQWdkRiswbWpGZUl5R1VaV05VQ1NNM29MZWdBVlRFb2xsVW9TRitaYmRUeUZZY1ptZFc3RmlwV0swWm5tTWpad0djbTlua1hpeVlGRlRGMU9Jajh5QUhZMmhsQTFReUhJSFdldGdHWEdyaUZSWjc0SXNaeWg3S1YzM2ZpMTE5V3htanZpUFBKQTduOVJyR1pFVWUzeGZwM2pXaEQyRjFXdlphOVpyQVY2SFh2bDE3WlZkWlFwZnhWK2ZqOEZZd29GL2tGdVdyWmU1anhaL0xJMUJZcjlQMkZOZVU2aVBxWStyajAyUUIyaHFYNWlCYUlqV25JdGhLMUlxZG14ZmpHWFNiK2h1dmx0SVpIVlJzRkhFWnhsT3lYbDhtYk53eFhWMlhydHo0SU90Wk9oaXRaVGliRnBUdzFJUFpNS1VsSHN2VHh0ZU5vSVdnWXFCSkc3S2JIT2FWV05jVS9wVVpZamdWdzFPQTE1bGF6OTg2SkFXWU9aa0hIUEJpRkJuVFdJaWpXeDNLWTdIa1dsZjNJTWhoUkNad2xPVmhvdHI3V0RvWUg5d3pZSXhndE5PcDJ6UGhjMWsyWHo5YWZsbVNZT1ZVMVo3cDArTVVVdHRRbHh0anRKanlWTXNnemFENVdlMGVEMWszMXVVWE81ZDU0dkdZdlJuZW93QVpMcGpTWWVMbVJlTUlIL3lsS2RPRUpha21BeG1Gbk02VngxY09GNS9sWDlRb0lDQ1UxNWxSWFV4VlNGUWhZMkVZcDZVSFdjeVZtNXY0bDAxVkpKd1pvOXZZcVJrbzJON1g0aHY5SkRqZ2JDUEdGeG9adkZmaVd4SWxvR05iSWlSWlBCNXpsZFphaEJpU0ZSWVRndDY2V0NFYjlxTGYySWVrSXVhNUhrRFZQUjFBV01aVTJCczM0OGJYM0NhTzRCL240aFBPbHhramNWL3BXVzljRVZSc2xGcmhnZGRvRnU5WW15UmRIVU1qaUI2QVdGNWU4ZE8rSDZGZHhGTzdZRWRVdnBSY1dxb1U0ZU9CSlhQbHNGdVpKWmFhVUI0cUZEWGR4Qms1b2tFV2VOajNWMS9lajFwSUU4NWdwaFZNazZ1ZFpkNllsNktYdStWRzFJNVZJcHdkbU1rbFlKWEpXWS9hWWVSQjFYemJhOStJb2d6WXZCK3RYVW9nOEY0ekphZWowaGg5M1ROaTJSck9sSlFqU0ZyYW9CeGhQRldCbFBPVGh0TzBWR1hmSXVSQjN6RFQzK080WHVjZW1ka0ZGMnNVQWFCQVhhNWZPeHQ0SDlSWjFoYitGdkxlSzVrRTJTcVl5dGpHWlV0Wkw2UFZIc3BkbE5pSjFsR1ZIbHJvMUEwWWlaZWhtdmpUamVOaTRpRlh5NlFJR0E5Z01WaU9VNVZVL2lRdUdQR2dPWmxMbXhHVCs1ZzRXM2VpemxmeTRaVFh5RmpXbEZoZzJOb0FGSmpZMGlPRWxDYlhIZDUvRnN3VWp0NnZHQlRrTmQydDErWFg0UjJiSTV2Y0h0MlNYdXFkL05SazVBa1dFNVA5RzdxajB4bEczdkVjcVJ0MzMvaFdyVmlsVjR3VjRLRUxIc2RYaDlmRXBBVWY2Q1lnbVBIYnBoNHVYQjRVVnVYcTFjMWRVTlBPSFdYWHVaZ1lGbkFiYjlyaVhqOFU5V1d5MUVCVW9sakNsU1RsQU9NekkwNWNwOTRkb2Z0ancyTTRGTUJUdTkyN2xPSmxIYVlEcDh0bFpwYm9vc2lUaHhPckZGamhNSmhxRklMYUpkUGEyQzdVUjV0WEZHV1lwZGxZWlpHakJlUTJIWDlrR04zMG11S2N1eHkrNHMxV0hsM1RJMWNaMENWbW9DbVhpRnVrbG52ZXUxM081VzFhNjFsRG44R1dGRlJINWI1VzZsWUtGUnlqbVpsZjVqa1ZwMlUvblpCa0lkanhsUWFXVHBabTFleWpqVm4rbzAxZ2tGUzhHQVZXUDZHNkZ4Rm5zUlBuWmk1aXlWYWRtQ0VVM3hpVDVBQ2tYK1phV0FNZ0Q5Uk00QVVYSFdaTVcyTVRqQ04wVk5hZjA5N0VFOVBUZ0NXMVd6UWMrbUZCbDVxZGZ0L0NtcitkNUtVUVg3aFVlWnd6VlBVandPREtZMnZjbTJaMjJ4S1Y3T0N1V1dxZ0Q5aU1wYW9XZjlPdjR1NmZqNWw4b05lbDJGVjNwaWxnQ3BUL1lzZ1ZMcUFuMTY0YkRtTnJJSmFrU2xVRzJ3R1VyZCtYMWNhY1g1c2lYeExXZjFPLzE4a1lhcDhNRTRCWEt0bkFvZndYQXVWenBpdmRmMXdJcEN2VVIxL3ZZdEpXZVJSVzA4bVZDdFpkMldrZ0hWYmRtTENZcENQUlY0ZmJDWjdEMC9ZVHcxbmJtMnFiWTk1c1lnWFh5dDFtbUtGais5UDNKR25aUytCVVlHY1hsQ0JkSTF2VW9hSlM0ME5XWVZRMkU0Y2xqWnllWUVmamN4Ym80dEVsb2RaR24rUVZIWldEbGJsaXpsbGdtbVpsTloyaVc1eVhoaDFSbWZSWi85Nm5ZQjJqUjloeG5saVpXT05pRkVhVXFLVU9IK2JnTEorbDF3dmJtQm4yWHVMZHRpYWo0R1VmOVY4SG1SUWxUOTZTbFRsVkV4ckFXUUlZajJlODRDWmRYSlNhWmRiaER4bzVJWUJscFNXN0pRcVRnUlUyWDQ1YU4rTkZZRDBacHBldVgvQ1Z6K0FsMmpsWFR0bG4xSnRZSnFmbTArc2pteFJxMXNUWCtsZFhtenhZaUdOY1ZHcGxQNVNuMnpmZ3RkeW9sZUVaeTJOSDFtY2o4ZURsVlNOZXpCUHZXeGtXOUZaRTUva1U4cUdxSm8zaktHQVJXVittUHBXeDVZdVV0eDBVRkxoV3dKakFvbFdUdEJpS21ENmFITlJtRnVnVWNLSm9YdUdtVkIvNzJCTWNDK05TVkYvWGh1UWNIVEVpUzFYUlhoU1g1K2YrcFZvanp5YjRZdDRka0pvM0dmcWpUV05QVktLajlwdXpXZ0ZsZTJRL1ZhY1ovbUl4NC9JVkxpYWFWdDNiU1pzcFU2elc0ZWFZNUdvWWErUTZaY3JWTFZ0MGx2OVVZcFZWWC93Zjd4a1RXUHhaYjVoaldBS2NWZHNTV3d2V1cxbktvTFZXSTVXYW96cmE5MlFmVmtYZ1BkVGFXMTFWSjFWZDRQUGd6aG92bm1NVkZWUENGVFNkb21NQXBhemJMaHRhNDBRaVdTZU9vMC9WdEdlMVhXSVgrQnlhR0Q4VktoT0ttcGhpRkpnY0kvRVZOaHdlWVkvbmlwdGoxc1lYNkoraVZXdlR6UnpQRlNhVXhsUURsUjhWRTVPL1Y5YWRQWllhNFRoZ0hTSDBITEtmRlp1SjE5T2hpeFZwR0tTVHFwc04yS3hndGRVVGxNK2M5RnVPM1VTVWhaVDNZdlFhWXBmQUdEdWJVOVhJbXV2YzFObzJJOFRmMkpqbzJBa1ZlcDFZb3dWY2FOdHBsdDdYbEtEVEdIRW52cDRWNGNuZklkMjhGSDJZRXh4UTJaTVhrMWdEb3h3Y0NWamlZKzlYMkpnMUliZVZzRnJsR0JuWVVsVDRHQm1aaitOL1hrYVQrbHdSMnl6aS9LTDJINWtndzltV2xwQ20xRnQ5MjFCakR0dEdVOXJjTGVERm1MUllBMlhKNDE0ZWZ0UlBsZjZWenBuZUhVOWV1OTVsWHVNZ0dXWitZL0FiNldMSVo3c1dlbCtDWDhKVklGbjJHaVJqMDE4eHBiS1V5Vmd2blZ5YkhOVHlWcW5maVJqNEZFS2dmRmQzNFNBWW9CUlkxc09UMjE1UWxLNFlFNXR4RnZDVzZHTHNJdmlaY3hmUlphVFdlZCtxbjRKVnJkbk9WbHpUN1pib0ZKYWc0cVlQbzB5ZGI2VVIxQThldmRPdG1kK21zRmFmR3ZSZGxwWEZsdzZlL1NWVG5GOFVhbUFjSUo0V1FSL0o0UEFhT3huc1hoM2VPTmlZV09BZSsxUGFsTFBVVkNEMjJsMGt2V05NWTNCaVM2VnJYdjJUbVZRTUlKUlVtK1pFRzZGYnFkdCtsNzFVTnhaQmx4R2JWOXNobldMaEdob1ZsbXlpeUJUY1pGTmxrbUZFbWtCZVNaeDlvQ2tUc3FRUjIyRW1nZGF2RllGWlBDVTYzZWxUeHFCNFhMU2lYcVpOSC9lZm45U1dXVjFrWCtQZzQvclU1WjY3V09sWTRaMitIbFhpRGFXS21LclVvS0NWR2h3WjNkamEzZnRlZ0Z0MDM3amlkQlpFbUxKaGFXQ1RIVWZVTXRPcFhYcmkwcGMvbDFMZTZSbDBaSEtUaVZ0WDRrbmZTYVZ4VTRvak51UGM1ZExab0Y1MFkvc2NIaHRQVnl5VWthRFlsRU9nMXQzZG1hNG5LeE95bUMrZkxOOHozNlZUbWFMYjJhSW1GbVhnMWhzWlZ5VmhGL0pkVmFYMzNyZWVzQlJyM0NZZXVwamRucWdmcFp6N1pkRlRuaHdYVTVTa2FsVFVXWG5aZnlCQllLT1ZERmNtbldnbDloaTJYSzlkVVZjZVpyS2cwQmNnRlRwZHo1T3JteGFnTkppYm1Qb1hYZFIzWTBlamkrVjhVL2xVK2RnckhCblVsQmpRNTRmV2laUU4zZDNVK0oraFdRclpZbGltR01VVURWeXlZbXpVY0NMM1g1SFY4eURwNVNiVVJ0VSsxektUK042V20zaGtJK2FnRldXVkdGVHIxUUFYK2xqZDJudlVXaGhDbElxV05oU1RsY05lQXQzdDE1M1llQjhXMktYWXFKT2xYQURnUGRpNUhCZ2wzZFgyNEx2Wi9WbzFYaVhtTkY1ODFpelZPOVRORzVMVVR0U29sditpNitBUTFXbVYzTmdVVmN0VkhwNlVHQlVXNmRqb0dMalUyTml4MXV2WisxVW4zcm1nbmVSazE3a2lEaFpybGNPWStpTjc0QlhWM2Q3cVUvclg3MWJQbXNoVTFCN3duSkdhUDkzTm5mM1piVlJqMDdVZHI5Y3BYcDFoRTVaUVp1QVVJaVpKMkdEYm1SWEJtWkdZL0JXN0dKcFl0TmVGSmFEVjhsaWgxVWhoMHFCbzQ5bVZiR0RaV2RXamQyRWFsb1BhT1ppN25zUmxuQlJuRzh3alAxanlJblNZUVovd25EbGJnVjBsR244Y3NwZXpwQVhaMnB0WG1PelVtSnlBWUJzVCtWWmFwSFpjSjF0MGxKUVR2ZVdiWlYraGNwNEwzMGhVWkpYd21TTGdIdDg2bXp4YUY1cHQxR1lVNmhvZ1hMT252RjcrSEs3ZVJOdkJuUk9aOHlScEp3OGVZbURWSU1QVkJkb1BVNkpVN0ZTUG5pR1V5bFNpRkNMVDlCUDRuWExlcEo4cFd5MmxwdFNnM1RwVk9sUFZJQ3lnOTZQY0pYSlhoeGduMjBZWGx0bE9JSCtsRXRndkhERGZxNTh5VkdCYUxGOGI0SWtUb2FQejVGK1pxNU9CWXlwWkVxQTJsQ1hkYzV4NVZ1OWoyWnZoazZDWkdPVjFsNlpaUmRTd29qSWNLTlNEbk16ZEpkbjkzZ1dselJPdTVEZW5NdHQyMUZCalIxVXptS3ljL0dEOXBhRW44T1VOaythZjh4UmRYQjFscTFjaHBqbVUrUk9uRzRKZExScGEzaVBtVmwxR0ZJa2RrRnQ4MmR0VVptZlM0Q1pWRHg3djNxR2xvUlg0bUpIbG54cEJGb0NaTk43RDI5TGxxYUNZbE9GbUpCZWlYQ3pZMlJUVDRhQm5KT2VqSGd5bCsrTlFvMS9ubDV2aEhsVlgwYVdMbUowbWhWVTNaU2pUOFZsWlZ4aFhCVi9VWVl2Ykl0ZmgzUGtidjkrNWx3YlkycGI1bTUxVTNGT29HTmxkYUZpYm84bVQ5Rk9wbXkyZnJxTEhZUzZoMWQvTzVBamxhbDdvWnI0aUQyRUcyMkdtdHgraUZtN25wdHpBWGlDaG15YWdwb2JWaGRVeTFkd1RxYWVWbFBJandtQmtuZVNtZTZHNFc0VGhmeG1ZbUVyYnltTWtvSXJnL0oyRTJ6Wlg3MkRLM01GZ3hxVjIydmJkOGFVYjFNQ2c1SlJQVjZNakRpTlNFNnJjNXBuaFdoMmtRbVhaSEdoYkFsM2tscEJsYzlyam44blp0QmJ1Vm1hV3VpVjk1WHNUZ3lFbVlTc2F0OTJNSlViYzZab1gxc3ZkNXFSWVpmY2ZQZVBISXdsWDNOODJIbkZpY3hzSElmR1cwSmV5V2dnZC9WK2xWRk5VY2xTS1ZvRmYyS1gxNExQWTRSMzBJWFNlVHB1bVY2WldSR0ZiWEFSYkw5aXYzWlBaYTlnL1pVT1pwK0hJNTd0bEExVWZWUXNqSGhrZVdRUmhpRnFuSUhvZUdsa1ZKdTVZaXRucTRPb1dOaWVxMndnYjk1YlRKWUxqRjl5MEdmSFltRnlxVTdHV2MxcmsxaXVabFZlMzFKVllTaG43blptZDJkeVJuci9ZdXBVVUZTZ2xLT1FIRnF6Zmhac1EwNTJXUkNBU0ZsWFV6ZDF2cGJLVmlCakVZRjhZUG1WMW0xaVZJR1poVkhwV3YyQXJsa1RseXBRNVd3OFhOOWlZRTgvVTN1QkJwQzZiaXVGeUdKMFhyNTR0V1I3WS9WZkdGcC9rUitlUDF4UFkwS0FmVnR1VlVxVlRaV0ZiYWhnNEdmZWN0MVJnVnZuWXQ1c1czSnRZcTZVdlg0VGdWTnRuRkVFWDNSWnFsSVNZSE5abG1aUWhwOTFLbVBtWWU5OCtvdm1WQ2RySlo2MGE5V0ZWVlIyVUtSc2FsVzBqU3h5RlY0VllEWjB6V0tTWTB4eW1GOURiajV0QUdWWWI5aDIwSGo4ZGxSMUpGTGJVMU5Pbmw3QlpTcUExb0NiWW9aVUtGS3VjSTJJMFkzaGJIaFUyb0Q1Vi9TSVZJMXFsazJSYVUrYmJMZFZ4bll3ZUtoaStYQ09iMjFmN0lUYWFIeDQ5M3VvZ1F0blQ1NW5ZN0I0YjFjU2VEbVhlV0tyWW9oU05YVFhhMlJWUG9HeWRhNTJPVlBlZGZ0UVFWeHNpOGQ3VDFCSGNwZWEySmdDYitKMGFIbUhaS1YzL0dLUm1DdU53VlJZZ0ZKT2FsZjVnZzJFYzE3dFVmWjB4SXRQWEdGWC9HeUhtRVphTkhoRW0rdVBsWHhXVWxGaStwVEdUb2FEWVlUcGc3S0UxRmMwWndOWGJtWm1iVEdNM1dZUmNCOW5PbXNXYUJwaXUxa0RUc1JSQm0vU1o0OXNkbEhMYUVkWloydG1kUTVkRUlGUW45ZGxTSGxCZVpHYWQ0MkNYRjVPQVU4dlZGRlpESGhvVmhSc3hJOERYMzFzNDJ5cmk1QmpjR0E5YlhWeVptS09sTVdVUTFQQmozNTczMDRtakg1TzFKNnhsTE9VVFZKY2IyT1FSVzAwakJGWVRGMGdhMGxycW1kYlZGU0JqSCtaV0RlRk9sK2lZa2RxT1pWeVpZUmdaV2luZDFST3FFL25YWmlYckdUWWYrMWN6MCtOZWdkU0JJTVVUaTlnZzNxbWxMVlBzazdtZVRSMDVGSzVndEprdlhuZFc0RnNVcGQ3anlKc1BsQi9Vd1Z1em1SMFpqQnN4V0IzbVBlTGhsNDhkSGQ2eTNrWVRyR1FBM1JDYk5wV1M1SEZiSXVOT2xQR2h2Sm1yNDVJWEhHYUlHN1dVelphaTUrampidFRDRmVubUVObm01SEpiR2hSeW5YellxeHlPRktkVWpwL2xIQTRkblJUU3A2M2FXNTR3SmJaaUtSL05uSERjWWxSMDJma2RPUllHR1czVnFtTGRwbHdZdFYrK1dEdGNPeFl3VTY2VHMxZjU1ZjdUcVNMQTFLS1dhdCtWR0xOVHVWbERtSTRnOG1FWTRPTmg1Unh0bTY1VzlKK2wxSEpZOVJuaVlBNWd4V0lFbEY2VzRKWnNZOXpUbDFzWlZFbGlXK1BMcFpLaFY1MEVKWHdsYVp0NVlJeFg1SmtFbTBvaEc2Qnc1eGVXRnVOQ1U3QlV4NVBZMlZSYU5OVkowNFVaSnFhYTJMQ1dsOTBjb0twYmU1bzUxQ09nd0o0UUdjNVVwbHNzWDY3VUdWVlhuRmJlMUpteW5QcmdrbG5jVndnVW4xeGE0anFsVldXeFdSaGpiT0JoRlZWYkVkaUxuK1NXQ1JQUmxWUGpVeG1DazRhWFBPSW9taE9ZdzE2NTNDTmd2cFM5cGNSWE9oVXRaRE5mbUpaU28zSGhneUNEWUptalVSa0JGeFJZWWx0UG5tK2l6ZDRNM1Y3VkRoUHE0N3hiU0JheFg1ZWVZaHNvVnQyV2hwMXZvQk9ZUmR1OEZnZmRTVjFjbkpIVS9OK0FYZmJkbWxTM0lBalZ3aGVNVm51Y3IxbGYyN1hpemhjY1laQlUvTjMvbUwyWmNCTzM1aUFocDVieG92eVUrSjNmMDlPWEhhYXkxa1BYenA1NjFnV1R2OW5pMDd0WXBPS0haQy9VaTltM0ZWc1ZnS1ExVTZOVDhxUmNKa1BiQUplUTJDa1c4YUoxWXMyWlV0aWxwbUlXLzliaUdNdVZkZFRKblo5VVN5Rm9tZXphSXBya21LVGo5UlRFb0xSYlk5MVprNU9qWEJibjNHdmhaRm0yV1p5ZndDSHpaNGduMTVjTDJmd2p4Rm9YMmNOWXRaNmhWaTJYbkJsTVc5VllEZFNEWUJVWkhDSUtYVUZYaE5vOUdJY2w4eFRQWElCakRSc1lYY09laTVVckhkNm1CeUM5SXRWZUJSbndYQ3ZaWlZrTmxZZFlNRjUrRk1kVG50cmhvRDZXK05WMjFZNlR6eFBjcG56WFg1bk9JQUNZSUtZQVpDTFc3eUw5WXNjWkZpQzNtVDlWYytDWlpIWFR5QjlINUNmZlBOUVVWaXZicjlieVl1RGdIaVJuSVNYZTMyR2k1YVBsdVYrMDVxT2VJRmNWM3BDa0tlV1gzbFpXMTlqQzN2UmhLMW9CbFVwZnhCMEluMEJsVUJpVEZqV1RvTmJlVmxVV0cxekhtTkxqZytPem9EVWdxeGk4RlB3YkY2Uktsa0JZSEJzVFZkS1pDcU5LM2JwYmx0WGdHcndkVzF2TFl3SWpHWlg3MnVTaUxONG9tUDVVNjF3Wkd4WVdDcGtBbGpnYUp1QkVGWFdmQmhRdW83TWJaK042M0NQWTV0dDFHN21mZ1NFUTJnRGtOaHRkcGFvaTFkWmVYTGtoWDZCdkhXS2lxOW9WRklpamhHVjBHT1ltRVNPZkZWVFQvOW1qMWJWWUpWdFExSkpYQ2xaKzIxcldEQjFISFZzWUJTQ1JvRVJZMkZuNG84NmQvT05OSTNCbEJaZWhWTXNWTU53UUd6M1hseFFyVTZ0WGpwalI0SWFrRkJvYnBHemR3eFUzSlJrWCtWNmRtaEZZMUo3MzM3YmRYZFFsV0kwV1ErUStGSERlWUY2L2xhU1h4U1FnbTFnWEI5WEVGUlVVVTF1NGxhb1k1T1lmNEVWaHlxSkFKQWVWRzljd0lIV1lsaGlNWUUxbmtDV2JwcDhtaTFwcFZuVFlqNVZGbVBIVk5tR1BHMERXdVowbklocWF4WlpUSXd2WDM1dXFYTjltRGhPOTNDTVc1ZDRQV05hWnBaMnkyQ2JXMGxhQjA1VmdXcHNpM09oVG9sblVYK0FYL3BsRzJmWVg0UlpBVnJOWGE1ZmNWUG1sOTJQUldqMFZpOVYzMkE2VGsxdjlIN0hnZzZFMUZrZlR5cFBQbHlzZmlwbkdvVnpWRTkxdzRDQ1ZVK2JUVTh0YmhPTUNWeHdZV3RUSDNZcGJvcUdoMlg3bGJsK08xUXplZ3A5N3BYaFZjRi83blFkWXhlSG9XMmRlaEZpb1dWblUrRmpnMnpyWFZ4VXFKUk1UbUZzN0l0TFhPQmxuSUtuYUQ1VU5GVExhMlpybEU1Q1kwaFRIb0lOVDY1UFhsY0tZdjZXWkdacGN2OVNvVktmWU8rTEZHYVpjWkJuZjRsU2VQMTNjR1k3VmpoVUlaVjZjZ0I2YjJBTVhvbGduWUVWV2R4Z2hISHZjS3B1VUd5QWNvUnFyWWd0WG1CT3MxcWNWZU9VRjIzN2ZKbVdEMkxHZm81M2ZvWWpVeDZYbG8rSFp1RmNvRS90Y2d0T3BsTVBXUk5VZ0dNb2xVaFIyVTZjbktSK3VGUWtqVlNJTjRMeWxZNXRKbC9NV2o1bWFaYXdjeTV6djFONmdZV1pvWCtxVzNlV1VKYS9mdmgyb2xOMmxabVpzWHRFaVZodVlVN1VmMlY1NW92ellNMVVxMDU1bVBkZFlXclBVQkZVWVl3bmhGMTRCSmRLVXU1VW8xWUFsWWh0dFZ2R2JWTm1EMXhkV3lGb2xvQjRWUkY3U0dWVWFadE9SMnRPaDR1WFQxTWZZenBrcXBDY1pjR0FFSXlaVWJCb2VGUDVoOGhoeEd6N2JDS01VVnlxaGErQ0RKVWphNXVQc0dYN1g4TmY0VTlGaUI5bVpZRXBjL3BnZEZFUlVvdFhZbCtpa0V5SWtwRjRYazluSjJEVFdVUlI5bEg0Z0FoVGVXekVsb3B4RVUvdVQ1NS9QV2ZGVlFpVndIbVdpT04rbjFnTVlnQ1hXb1lZVm51WWtGKzRpOFNFVjVIWlUrMWxqMTVjZFdSZ2JuMS9XdXArN1g1cGo2ZFZvMXVzWU10bGhITUprR04yS1hmYWZuU1htNFZtVzNSNjZwWkFpTXRTajNHcVgreGw0b3Y3VzIrYTRWMkphMXRzcll1dml3cVF4WStMVTd4aUpwNHRua0JVSzA2OWdsbHluSVlXWFZtSXIyM0ZsdEZVbWs2Mml3bHh2VlFKbHQ5dytXM1FkaVZPRkhnU2g2bGM5bDRBaXB5WURwYU9jTDlzUkZtcFl6eDNUWWdVYjNPQ01GalZjWXhUR25qQmxnRlZabDh3Y2JSYkdveU1tb05yTGxrdm51ZDVhR2RzWW05UG9YV0tmd3R0TTVZbmJQQk8wblY3VVRkb1BtK0FrSENCbGxsMmRFZGtKMXhsa0pGNkk0emFXYXhVQUlKdmc0R0pBSUF3YVU1V05vQTNjczZSdGxGZlRuV1lsbU1hVHZaVDgyWkxnUnhac20wQVR2bFlPMVBXWS9HVW5VOEtUMk9Ja0pnM1dWZVErM25xVHZDQWtYV0NiSnhiNkZsZFh3VnBnWVlhVVBKZFdVN2pkK1ZPZW9LUlloTm1rWkI1WEw5T2VWL0dnVGlRaElDcmRhWk8xSWdQWWNWcnhsOUpUc3Ayb203amk2NkxDb3pSaXdKZi9IL01mODUrTllOcmcrQld0MnZ6bHpTVysxa2ZWUGFVNjIzRlcyNlpPVndWWDVDV2NGUHhnakZxZEZwd25wUmVLSCs1Z3lTRUpZUm5nMGVIem85aWpjaDJjVitXbUd4NElHYmZWT1ZpWTAvRGdjaDF1RjdObGdxTytZYVBWUE5zakcwNGJIOWd4MUlvZFgxZUdFK2dZT2RmSkZ3eGRhNlF3SlM1Y3Jsc09HNUprUWxueTFQelUxRlB5Wkh4aThoVGZGN0NqK1J0ams3Q2RvWnBYb1lhWVFhQ1dVL2VUejZRZkp3SllSMXVGRzZGbG9oT01Wcm9sZzVPZjF5NWVZZGI3WXU5ZjRsejMxZUxnc0dRQVZSSGtMdFY2bHloWHdoaE1tdnhjcktBaVlwMGJkTmIxWWlFbUd1TWJab3puZ3B1cEZGRFVhTlhnWWlmVS9SamxZL3RWbGhVQmxjL2M1QnVHSC9jajlHQ1AyRW9ZR0tXOEdhbWZvcU53NDJsbExOY3BId0laNlpnQlpZWWdKRk81NUFBVTJpV1FWSFFqM1NGWFpGVlp2V1hWVnNkVXpoNFFtYzlhTWxVZm5Dd1czMlBqVkVvVjdGVUVtV0NabDZOUTQwUGdXeUViWkRmZlA5Uis0V2paK2xsb1cra2hvR09hbFlna0lKMmRuRGxjU09ONldJWlV2MXNQSTBPWUo1WWptSCtabUNOVG1LelZTTnVMV2RuaitHVStKVW9kd1ZvcUdtTFZFMU91SERJaTFoa2kyV0ZXNFI2T2xEb1c3dDM0V3Q1aXBoOHZtelBkcWxsbDQ4dFhWVmNPSVlJYUdCVEdHTFplbHR1L1g0ZmF1QjZjRjh6YnlCZmpHT29iVlpuQ0U0UVhpYU4xMDdBZ0RSMm5KYmJZaTFtZm1LOGJIV05aM0ZwZjBaUmg0RHNVMjZRbUdMeVZQQ0dtWThGZ0JlVkY0WFpqMWx0elhPZlpSOTNCSFVuZVB1QkhvMklsS1pQbFdlNWRjcUxCNWN2WTBlVk5aYTRoQ05qUVhlQlgvQnlpVTRVWUhSbDcySmphejlsSjE3SGRkR1F3WXVkZ3AxbkwyVXhWQmlINVhlaWdBS0JRV3hMVHNkK1RJRDBkZzFwbG10bllqeFFoRTlBVndkalltdStqZXBUNkdXNGZ0ZGZHbU8zWS9PQjlJRnVmeHhlMlZ3MlVucG02WGthZWlpTm1YRFVkZDV1dTJ5U2VpMU94WGJnWDUrVWQ0aklmczE1djRETmtmSk9GMDhmZ21oVTNsMHliY3lMcFh4MGo1aUFHbDZTVkxGMm1WczhacVNhNEhNcWFOdUdNV2NxYy9pTDI0c1FrUGw2MjNCdWNjUmlxWGN4Vmp0T1Y0VHhaNmxTd0lZdWpmaVVVWHRQVCtoc1hYbDdtcE5pS25MOVloTk9GbmhzajdCa1dvM0dlMmxvaEY3RmlJWlpubVR1V0xaeURta2xsZjJQV0kxZ1Z3Qi9Cb3pHVVVsajJXSlRVMHhvSW5RQmcweVJSRlZBZDN4d1NtMTVVYWhVUkkzL1djdHV4RzFjV3l0OTFFNTlmTk51VUZ2cWdRMXVWMXNEbTlWb0tvNlhXL3grTzJDMWZybVFjSTFQV2MxajMzbXpqVkpUejJWV2VjV0xPNWJFZnJ1VWduNDBWb21SQUdkcWZ3cGNkWkFvWnVaZFVFL2VaMXBRWEU5UVY2ZGVFT2dSNkJMb0UrZ1U2STFPREU1QVVSQk8vMTVGVXhWT21FNGVUaktiYkZ0cFZpaE91bmsvVGhWVFIwNHRXVHR5YmxNUWJOOVc1SUNYbWROcmZuY1huelpPbjA0UW4xeE9hVTZUVG9pQ1cxdHNWUTlXeEU2TlU1MVRvMU9sVTY1VFpaZGRqUnBUOVZNbVV5NVRQbE5jaldaVFkxTUNVZ2hTRGxJdFVqTlNQMUpBVWt4U1hsSmhVbHhTcjRSOVVvSlNnVktRVXBOU2dsRlVmN3RPdzA3SlRzSk82RTdoVHV0TzNrNGJUL05PSWs5a1QvVk9KVThuVHdsUEswOWVUMmRQT0dWYVQxMVBYMDlYVHpKUFBVOTJUM1JQa1UrSlQ0TlBqMDkrVDN0UHFrOThUNnhQbEUvbVQraFA2ay9GVDlwUDQwL2NUOUZQMzAvNFR5bFFURkR6VHl4UUQxQXVVQzFRL2s4Y1VBeFFKVkFvVUg1UVExQlZVRWhRVGxCc1VIdFFwVkNuVUtsUXVsRFdVQVpSN1ZEc1VPWlE3bEFIVVF0UjNVNDliRmhQWlUvT1Q2Q2ZSbXgwZkc1Ui9WM0pucGlaZ1ZFVVdmbFNEVk1IaWhCVDYxRVpXVlZSb0U1V1ViTk9ib2lraUxWT0ZJSFNpSUI1TkZzRGlMaC9xMUd4VWIxUnZGSEhVWlpSb2xHbFVhQ0xwb3VuaTZxTHRJdTFpN2VMd292RGk4dUx6NHZPaTlLTDA0dlVpOWFMMkl2Wmk5eUwzNHZnaStTTDZJdnBpKzZMOEl2emkvYUwrWXY4aS8rTEFJd0NqQVNNQjR3TWpBK01FWXdTakJTTUZZd1dqQm1NRzR3WWpCMk1INHdnakNHTUpZd25qQ3FNSzR3dWpDK01Nb3d6akRXTU5veHBVM3BUSFpZaWxpR1dNWllxbGoyV1BKWkNsa21XVkpaZmxtZVdiSlp5bG5TV2lKYU5scGVXc0phWGtKdVFuWkNaa0t5UW9aQzBrTE9RdHBDNmtMaVFzSkRQa01XUXZwRFFrTVNReDVEVGtPYVE0cERja05lUTI1RHJrTytRL3BBRWtTS1JIcEVqa1RHUkw1RTVrVU9SUnBFTlVrSlpvbEtzVXExU3ZsTC9WTkJTMWxMd1V0OVQ3bkhOZC9SZTlWSDhVUytidGxNQlgxcDE3MTFNVjZsWG9WZCtXTHhZeFZqUldDbFhMRmNxVnpOWE9WY3VWeTlYWEZjN1YwSlhhVmVGVjJ0WGhsZDhWM3RYYUZkdFYzWlhjMWV0VjZSWGpGZXlWODlYcDFlMFY1TlhvRmZWVjloWDJsZlpWOUpYdUZmMFYrOVgrRmZrVjkxWEMxZ05XUDFYN1ZjQVdCNVlHVmhFV0NCWVpWaHNXSUZZaVZpYVdJQllxSmtabi85aGVZSjlnbitDajRLS2dxaUNoSUtPZ3BHQ2w0S1pncXVDdUlLK2dyQ0N5SUxLZ3VPQ21JSzNncTZDeTRMTWdzR0NxWUswZ3FHQ3FvS2Znc1NDem9La2d1R0NDWVAzZ3VTQ0Q0TUhnOXlDOUlMU2d0aUNESVA3Z3RPQ0VZTWFnd2FERklNVmcrQ0MxWUljZzFHRFc0TmNnd2lEa29NOGd6U0RNWU9iZzE2REw0TlBnMGVEUTROZmcwQ0RGNE5nZ3kyRE9vTXpnMmFEWllOb2d4dURhWU5zZzJxRGJZTnVnN0NEZUlPemc3U0RvSU9xZzVPRG5JT0ZnM3lEdG9PcGczMkR1SU43ZzVpRG5vT29nN3FEdklQQmd3R0U1WVBZZ3dkWUdJUUxoTjJEL1lQV2d4eUVPSVFSaEFhRTFJUGZndytFQTRUNGcvbUQ2b1BGZzhDREpvVHdnK0dEWElSUmhGcUVXWVJ6aEllRWlJUjZoSW1FZUlROGhFYUVhWVIyaEl5RWpvUXhoRzJFd1lUTmhOQ0U1b1M5aE5PRXlvUy9oTHFFNElTaGhMbUV0SVNYaE9XRTQ0UU1oUTExT0lYd2hEbUZINFU2aFZhRk80WC9oUHlFV1lWSWhXaUZaSVZlaFhxRm9uZERoWEtGZTRXa2hhaUZoNFdQaFhtRnJvV2NoWVdGdVlXM2hiQ0YwNFhCaGR5Ri80VW5oZ1dHS1lZV2hqeUcvbDRJWHp4WlFWazNnRlZaV2xsWVdROVRJbHdsWEN4Y05GeE1ZbXBpbjJLN1lzcGkybUxYWXU1aUltUDJZamxqUzJORFk2MWo5bU54WTNwamptTzBZMjFqckdPS1kybGpybU84WS9KaitHUGdZLzlqeEdQZVk4NWpVbVRHWTc1alJXUkJaQXRrRzJRZ1pBeGtKbVFoWkY1a2hHUnRaSlprZW1TM1pMaGttV1M2Wk1CazBHVFhaT1JrNG1RSlpTVmxMbVVMWDlKZkdYVVJYMTlUOFZQOVUrbFQ2RlA3VXhKVUZsUUdWRXRVVWxSVFZGUlVWbFJEVkNGVVYxUlpWQ05VTWxTQ1ZKUlVkMVJ4VkdSVW1sU2JWSVJVZGxSbVZKMVUwRlN0Vk1KVXRGVFNWS2RVcGxUVFZOUlVjbFNqVk5WVXUxUy9WTXhVMlZUYVZOeFVxVlNxVktSVTNWVFBWTjVVRzFYblZDQlYvVlFVVmZOVUlsVWpWUTlWRVZVblZTcFZaMVdQVmJWVlNWVnRWVUZWVlZVL1ZWQlZQRlUzVlZaVmRWVjJWWGRWTTFVd1ZWeFZpMVhTVllOVnNWVzVWWWhWZ1ZXZlZYNVYxbFdSVlh0VjMxVzlWYjVWbEZXWlZlcFY5MVhKVlI5VzBWWHJWZXhWMUZYbVZkMVZ4Rlh2VmVWVjhsWHpWY3hWelZYb1ZmVlY1RldVang1V0NGWU1WZ0ZXSkZZalZ2NVZBRlluVmkxV1dGWTVWbGRXTEZaTlZtSldXVlpjVmt4V1ZGYUdWbVJXY1ZaclZudFdmRmFGVnBOV3IxYlVWdGRXM1ZiaFZ2Vlc2MWI1VnY5V0JGY0tWd2xYSEZjUFhobGVGRjRSWGpGZU8xNDhYamRlUkY1VVhsdGVYbDVoWG94Y2VseU5YSkJjbGx5SVhKaGNtVnlSWEpwY25GeTFYS0pjdlZ5c1hLdGNzVnlqWE1GY3QxekVYTkpjNUZ6TFhPVmNBbDBEWFNkZEpsMHVYU1JkSGwwR1hSdGRXRjArWFRSZFBWMXNYVnRkYjExZFhXdGRTMTFLWFdsZGRGMkNYWmxkblYxempMZGR4VjF6WDNkZmdsK0hYNGxmakYrVlg1bGZuRitvWDYxZnRWKzhYMktJWVYrdGNyQnl0SEszY3JoeXczTEJjczV5elhMU2N1aHk3M0xwY3ZKeTlITDNjZ0Z6ODNJRGMvcHkrM0lYY3hOeklYTUtjeDV6SFhNVmN5SnpPWE1sY3l4ek9ITXhjMUJ6VFhOWGMyQnpiSE52YzM1ekc0SWxXZWVZSkZrQ1dXT1paNWxvbVdtWmFwbHJtV3laZEpsM21YMlpnSm1FbVllWmlwbU5tWkNaa1ptVG1aU1psWm1BWHBGZWkxNldYcVZlb0Y2NVhyVmV2bDZ6WGxPTjBsN1JYdHRlNkY3cVhycUJ4Ri9KWDlaZnoxOERZTzVmQkdEaFgrUmYvbDhGWUFaZzZsL3RYL2hmR1dBMVlDWmdHMkFQWUExZ0tXQXJZQXBnUDJBaFlIaGdlV0I3WUhwZ1FtQnFZSDFnbG1DYVlLMWduV0NEWUpKZ2pHQ2JZT3hndTJDeFlOMWcyR0RHWU5wZ3RHQWdZU1poRldFallmUmdBR0VPWVN0aFNtRjFZYXhobEdHblliZGgxR0gxWWQxZnM1YnBsZXVWOFpYemxmV1Y5cFg4bGY2VkE1WUVsZ2FXQ0pZS2xndVdESllObGcrV0VwWVZsaGFXRjVZWmxocVdMRTQvY2hWaU5XeFViRnhzU215amJJVnNrR3lVYkl4c2FHeHBiSFJzZG15R2JLbHMwR3pVYksxczkyejRiUEZzMTJ5eWJPQnMxbXo2Yk90czdteXhiTk5zNzJ6K2JEbHRKMjBNYlVOdFNHMEhiUVJ0R1cwT2JTdHRUVzB1YlRWdEdtMVBiVkp0VkcwemJaRnRiMjJlYmFCdFhtMlRiWlJ0WEcxZ2JYeHRZMjBhYnNkdHhXM2ViUTV1djIzZ2JSRnU1bTNkYmRsdEZtNnJiUXh1cm0wcmJtNXVUbTVyYnJKdVgyNkdibE51Vkc0eWJpVnVSRzdmYnJGdW1HN2diaTF2NG02bGJxZHV2VzY3YnJkdTEyNjBiczl1ajI3Q2JwOXVZbTlHYjBkdkpHOFZiL2x1TDI4MmIwdHZkRzhxYndsdktXK0piNDF2akc5NGIzSnZmRzk2YjlGdnlXK25iN2x2dG0vQ2IrRnY3bS9lYitCdjcyOGFjQ053RzNBNWNEVndUM0JlY0lCYmhGdVZXNU5icFZ1NFd5OTFucG8wWk9SYjdsc3dpZkJiUjQ0SGk3YVAwNC9WaitXUDdvL2tqK21QNW8vemoraVBCWkFFa0F1UUpwQVJrQTJRRnBBaGtEV1FOcEF0a0MrUVJKQlJrRktRVUpCb2tGaVFZcEJia0xsbWRKQjlrSUtRaUpDRGtJdVFVRjlYWDFaZldGODdYS3RVVUZ4WlhIRmJZMXhtWEx4L0tsOHBYeTFmZElJOFh6dWJibHlCV1lOWmpWbXBXYXBabzFtWFdjcFpxMW1lV2FSWjBsbXlXYTlaMTFtK1dRVmFCbHJkV1FoYTQxbllXZmxaREZvSldqSmFORm9SV2lOYUUxcEFXbWRhU2xwVldqeGFZbHAxV3V5QXFscWJXbmRhZWxxK1d1dGFzbHJTV3RSYXVGcmdXdU5hOFZyV1d1WmEyRnJjV2dsYkYxc1dXekpiTjF0QVd4VmNIRnhhVzJWYmMxdFJXMU5iWWx0MW1uZWFlSnA2bW4rYWZacUFtb0dhaFpxSW1vcWFrSnFTbXBPYWxwcVltcHVhbkpxZG1wK2FvSnFpbXFPYXBacW5tcDkrb1g2amZxVitxSDZwZnExK3NINitmc0Ird1g3Q2ZzbCt5MzdNZnRCKzFIN1hmdHQrNEg3aGZ1aCs2Mzd1ZnU5KzhYN3lmZzEvOW43NmZ2dCsvbjRCZndKL0EzOEhmd2gvQzM4TWZ3OS9FWDhTZnhkL0dYOGNmeHQvSDM4aGZ5Si9JMzhrZnlWL0puOG5meXAvSzM4c2Z5MS9MMzh3ZnpGL01uOHpmelYvZWw1L2RkdGRQbldWa0k1emtYT3VjNkp6bjNQUGM4SnowWE8zYzdOendIUEpjOGh6NVhQWmMzeVlDblRwYytkejNuTzZjL0p6RDNRcWRGdDBKblFsZENoME1IUXVkQ3gwRzNRYWRFRjBYSFJYZEZWMFdYUjNkRzEwZm5TY2RJNTBnSFNCZElkMGkzU2VkS2gwcVhTUWRLZDAwblM2ZE9xWDY1ZnNsMHhuVTJkZVowaG5hV2VsWjRkbmFtZHpaNWhucDJkMVo2aG5ubWV0WjR0bmQyZDhaL0JuQ1dqWVp3cG82V2V3Wnd4bzJXZTFaOXBuczJmZFp3Qm93MmU0WitKbkRtakJaLzFuTW1nemFHQm9ZV2hPYUdKb1JHaGthSU5vSFdoVmFHWm9RV2huYUVCb1BtaEthRWxvS1dpMWFJOW9kR2gzYUpOb2EyakNhRzVwL0dnZmFTQnArV2drYWZCb0Mya0JhVmRwNDJnUWFYRnBPV2xnYVVKcFhXbUVhV3RwZ0dtWWFYaHBOR25NYVlkcGlHbk9hWWxwWm1samFYbHBtMm1uYWJ0cHEybXRhZFJwc1duQmFjcHAzMm1WYWVCcGpXbi9hUzlxN1drWGFoaHFaV3J5YVVScVBtcWdhbEJxVzJvMWFvNXFlV285YWlocVdHcDhhcEZxa0dxcGFwZHFxMm8zYzFKemdXdUNhNGRyaEd1U2E1TnJqV3VhYTV0cm9XdXFhMnVQYlk5eGozS1BjNDkxajNhUGVJOTNqM21QZW85OGozNlBnWStDajRTUGg0K0xqNDJQam8rUGo1aVBtby9Pamd0aUYySWJZaDlpSW1JaFlpVmlKR0lzWXVlQjczVDBkUDkwRDNVUmRSTjFOR1h1WmU5bDhHVUtaaGxtY21jRFpoVm1BR2FGY1BkbUhXWTBaakZtTm1ZMVpnYUFYMlpVWmtGbVQyWldabUZtVjJaM1pvUm1qR2FuWnAxbXZtYmJadHhtNW1icFpqS05NNDAyalR1TlBZMUFqVVdOUm8xSWpVbU5SNDFOalZXTldZM0hpY3FKeTRuTWljNkp6NG5RaWRHSmJuS2ZjbDF5Wm5KdmNuNXlmM0tFY290eWpYS1BjcEp5Q0dNeVk3QmpQMlRZWkFTQTZtdnphLzFyOVd2NWF3VnNCMndHYkExc0ZXd1liQmxzR213aGJDbHNKR3dxYkRKc05XVlZaV3RsVFhKU2NsWnlNSEppaGhaU240Q2NnSk9BdklBS1o3MkFzWUNyZ0syQXRJQzNnT2VBNklEcGdPcUEyNERDZ01TQTJZRE5nTmVBRUdmZGdPdUE4WUQwZ08yQURZRU9nZktBL0lBVlp4S0JXb3cyZ1I2QkxJRVlnVEtCU0lGTWdWT0JkSUZaZ1ZxQmNZRmdnV21CZklGOWdXMkJaNEZOV0xWYWlJR0NnWkdCMVc2amdhcUJ6SUVtWjhxQnU0SEJnYWFCSkdzM2F6bHJRMnRHYTFscjBaalNtTk9ZMVpqWm1OcVlzMnRBWDhKcjg0bVFaVkdmazJXOFpjWmx4R1hEWmN4bHptWFNaZFpsZ0hDY2NKWnduWEM3Y01Cd3QzQ3JjTEZ3NkhES2NCQnhFM0VXY1M5eE1YRnpjVnh4YUhGRmNYSnhTbkY0Y1hweG1IR3pjYlZ4cUhHZ2NlQngxSEhuY2ZseEhYSW9jbXh3R0hGbWNibHhQbUk5WWtOaVNHSkpZanQ1UUhsR2VVbDVXM2xjZVZONVdubGllVmQ1WUhsdmVXZDVlbm1GZVlwNW1ubW5lYk41MFYvUVh6eGdYV0JhWUdkZ1FXQlpZR05ncTJBR1lRMWhYV0dwWVoxaHkySFJZUVppZ0lCL2dKTnM5bXo4YmZaMytIY0FlQWw0RjNnWWVCRjRxMlV0ZUJ4NEhYZzVlRHA0TzNnZmVEeDRKWGdzZUNONEtYaE9lRzE0Vm5oWGVDWjRVSGhIZUV4NGFuaWJlSk40bW5pSGVKeDRvWGlqZUxKNHVYaWxlTlI0MlhqSmVPeDQ4bmdGZWZSNEUza2tlUjU1TkhtYm4vbWUrNTc4bnZGMkJIY05kL2wyQjNjSWR4cDNJbmNaZHkxM0puYzFkemgzVUhkUmQwZDNRM2RhZDJoM1luZGxkMzkzalhkOWQ0QjNqSGVSZDU5M29IZXdkN1YzdlhjNmRVQjFUblZMZFVoMVczVnlkWGwxZzNWWWYyRi9YMzlJaW1oL2RIOXhmM2wvZ1g5K2Y4MTI1WFl5aUlXVWhwU0hsSXVVaXBTTWxJMlVqNVNRbEpTVWw1U1ZsSnFVbTVTY2xLT1VwSlNybEtxVXJaU3NsSytVc0pTeWxMU1V0cFMzbExpVXVaUzZsTHlVdlpTL2xNU1V5SlRKbE1xVXk1VE1sTTJVenBUUWxOR1UwcFRWbE5hVTE1VFpsTmlVMjVUZWxOK1U0SlRpbE9TVTVaVG5sT2lVNnBUcGxPdVU3cFR2bFBPVTlKVDFsUGVVK1pUOGxQMlUvNVFEbFFLVkJwVUhsUW1WQ3BVTmxRNlZENVVTbFJPVkZKVVZsUmFWR0pVYmxSMlZIcFVmbFNLVktwVXJsU21WTEpVeGxUS1ZOSlUybFRlVk9KVThsVDZWUDVWQ2xUV1ZSSlZGbFVhVlNaVk1sVTZWVDVWU2xWT1ZWSlZXbFZlVldKVlpsVnVWWHBWZmxWMlZZWlZpbFdTVlpaVm1sV2VWYUpWcGxXcVZhNVZzbFcrVmNaVnlsWE9WT3BYbmQreDN5WmJWZWUxNTQzbnJlUVo2UjEwRGVnSjZIbm9VZWpsNk4zcFJlcytlcFpsd2VvaDJqbmFUZHBsMnBIYmVkT0IwTEhVZ25pS2VLSjRwbmlxZUs1NHNuaktlTVo0Mm5qaWVONTQ1bmpxZVBwNUJua0tlUko1R25rZWVTSjVKbmt1ZVRKNU9ubEdlVlo1WG5scWVXNTVjbmw2ZVk1NW1ubWVlYUo1cG5tcWVhNTVzbm5HZWJaNXpucEoxbEhXV2RhQjFuWFdzZGFOMXMzVzBkYmgxeEhXeGRiQjF3M1hDZGRaMXpYWGpkZWgxNW5Ya2RldDE1M1VEZHZGMS9IWC9kUkIyQUhZRmRneDJGM1lLZGlWMkdIWVZkaGwyRzNZOGRpSjJJSFpBZGkxMk1IWS9kalYyUTNZK2RqTjJUWFplZGxSMlhIWldkbXQyYjNiS2YrWjZlSHA1ZW9CNmhucUllcFY2cG5xZ2VxeDZxSHF0ZXJONlpJaHBpSEtJZlloL2lJS0lvb2pHaUxlSXZJakppT0tJem9qamlPV0k4WWdhaWZ5STZJaitpUENJSVlrWmlST0pHNGtLaVRTSks0azJpVUdKWm9sN2lZdDE1WUN5ZHJSMjNIY1NnQlNBRm9BY2dDQ0FJb0FsZ0NhQUo0QXBnQ2lBTVlBTGdEV0FRNEJHZ0UyQVVvQnBnSEdBZzRsNG1JQ1lnNWlKbUl5WWpaaVBtSlNZbXBpYm1KNlluNWlobUtLWXBaaW1tRTJHVklac2htNkdmNFo2aG55R2U0YW9obzJHaTRhc2hwMkdwNGFqaHFxR2s0YXBocmFHeElhMWhzNkdzSWE2aHJHR3I0YkpocytHdElicGh2R0c4b2J0aHZPRzBJWVRoOTZHOUliZmh0aUcwWVlEaHdlSCtJWUlod3FIRFljSmh5T0hPNGNlaHlXSExvY2FoejZIU0ljMGh6R0hLWWMzaHorSGdvY2loMzJIZm9kN2gyQ0hjSWRNaDI2SGk0ZFRoMk9IZklka2gxbUhaWWVUaDYrSHFJZlNoOGFIaUllRmg2MkhsNGVEaDZ1SDVZZXNoN1dIczRmTGg5T0h2WWZSaDhDSHlvZmJoK3FINElmdWh4YUlFNGoraHdxSUc0Z2hpRG1JUElnMmYwSi9SSDlGZnhDQytucjllZ2g3QTNzRWV4VjdDbnNyZXc5N1IzczRleXA3R1hzdWV6RjdJSHNsZXlSN00zcytleDU3V0h0YWUwVjdkWHRNZTExN1lIdHVlM3Q3WW50eWUzRjdrSHVtZTZkN3VIdXNlNTE3cUh1RmU2cDduSHVpZTZ0N3RIdlJlOEY3ekh2ZGU5cDc1WHZtZStwN0RIeitlL3g3RDN3V2ZBdDhIM3dxZkNaOE9IeEJmRUI4L29FQmdnS0NCSUxzZ1VTSUlZSWlnaU9DTFlJdmdpaUNLNEk0Z2p1Q000STBnajZDUklKSmdrdUNUNEphZ2wrQ2FJSitpSVdJaUlqWWlOK0lYb21kZjU5L3AzK3ZmN0Ivc245OGZFbGxrWHlkZkp4OG5ueWlmTEo4dkh5OWZNRjh4M3pNZk0xOHlIekZmTmQ4Nkh4dWdxaG12My9PZjlWLzVYL2hmK1ovNlgvdWYvTi8rSHgzZmFaOXJuMUhmcHQrdUo2MG5uT05oSTJValpHTnNZMW5qVzJOUjR4SmpFcVJVSkZPa1UrUlpKRmlrV0dSY0pGcGtXK1JmWkYra1hLUmRKRjVrWXlSaFpHUWtZMlJrWkdpa2FPUnFwR3RrYTZScjVHMWtiU1J1cEZWakg2ZXVJM3JqUVdPV1k1cGpyV052NDI4amJxTnhJM1dqZGVOMm8zZWpjNk56NDNiamNhTjdJMzNqZmlONDQzNWpmdU41STBKanYyTkZJNGRqaCtPTEk0dWppT09MNDQ2amtDT09ZNDFqajJPTVk1SmprR09RbzVSamxLT1NvNXdqbmFPZkk1dmpuU09oWTZQanBTT2tJNmNqcDZPZUl5Q2pJcU1oWXlZakpTTW0yWFdpZDZKMm9uY2llV0o2NG52aVQ2S0pvdFRsK21XODVidmxnYVhBWmNJbHcrWERwY3FseTJYTUpjK2w0Q2ZnNStGbjRhZmg1K0luNG1maXArTW4vNmVDNThObjdtV3ZKYTlsczZXMHBhL2QrQ1dqcEt1a3NpU1BwTnFrOHFUajVNK2xHdVVmNXlDbklXY2hweUhuSWljSTNxTG5JNmNrSnlSbkpLY2xKeVZuSnFjbTV5ZW5KK2NvSnlobktLY281eWxuS2FjcDV5b25LbWNxNXl0bks2Y3NKeXhuTEtjczV5MG5MV2N0cHkzbkxxY3U1eThuTDJjeEp6Rm5NYWN4NXpLbk11Y3pKek5uTTZjejV6UW5OT2MxSnpWbk5lYzJKelpuTnljM1p6Zm5PS2NmSmVGbDVHWGtwZVVsNitYcTVlamw3S1h0SmV4bXJDYXQ1cFlucmFhdXBxOG1zR2F3SnJGbXNLYXk1ck1tdEdhUlp0RG0wZWJTWnRJbTAyYlVadm9tQTJaTHBsVm1WU1ozNXJobXVhYTc1cnJtdnVhN1pyNW1naWJENXNUbXgrYkk1dTlucjZlTzM2Q25vZWVpSjZMbnBLZTFwT2RucCtlMjU3Y250MmU0SjdmbnVLZTZaN25udVdlNnA3dm5pS2ZMSjh2bnptZk41ODluejZmUko4QU1BRXdBakMzQU1rQ3h3S29BQU13QlRBVUlGNy9GaUFtSUJnZ0dTQWNJQjBnRkRBVk1BZ3dDVEFLTUFzd0REQU5NQTR3RHpBV01CY3dFREFSTUxFQTF3RDNBRFlpSnlJb0loRWlEeUlxSWlraUNDSTNJaG9pcFNJbElpQWlFaU9aSWlzaUxpSmhJa3dpU0NJOUloMGlZQ0p1SW04aVpDSmxJaDRpTlNJMElrSW1RQ2F3QURJZ015QURJUVQvcEFEZy8rSC9NQ0NuQUJZaEJpWUZKc3NsenlYT0pjY2x4aVdoSmFBbHN5V3lKVHNna2lHUUlaRWhreUVUTURYK052NDUvanIrUC81QS9qMytQdjVCL2tMK1EvNUUvaGYrR1A0Ny9qeitOLzQ0L2pIK0dmNHovalQrQVFIaEFNNEI0QUFUQWVrQUd3SG9BQ3NCN1FEUUFld0FUUUh6QU5JQjhnQnJBZm9BMUFINUFOWUIyQUhhQWR3Qi9BRHFBRkVDUHg1RUFVZ0IrUUZoQWdBQUNnQVFBQ1FBT0FCQ0FFTUFSQUJPQUZBQVhBQmVBR0VBWWdDN0FMd0FEd0VhQVhBQmVBR0pBWkFCbUFHcEFiQUJzUUd5QWJNQnR3SE5BZFlCM0FIZEFmY0JCZ0lNQWcwQ0p3STBBbFFDV0FKOUFwSUNsUUxoQXZBQ0pBVndJV2JuaUNSMEpHQWtyQ0J0NXlBeWJ1ZGdJWERuQWYvbC93WC80LzlCTUhMbm9UQjk1NUVEb3dPRjU3RUR3d01RL2hMK0VmNFQvZ0FBbCtjUUJBRUVGZ1NnNXpBRVVRUTJCSy9uQUFESjV3VXh6ZWYrNXdBbEFlZ0E0QUFBSkFBbUFDMEFNZ0JSQUZrQVh3QmdBR1FBWndCb0FHa0FiUUIrQUlVQWxBQ3NBSzhBc3dEUUFESUJNd0UwQVRVQk5nRTNBVGdCT1FGVkFhd0J1d0VnQWlFQ0xnTGxBdVlDN1FMdUFpVURNd00wQS9JZTlCNzFIdmNlL2g0SEh3Z2ZDUjhPSDM0ZjFCL1ZIOWdmNUIvdUh5d2dNQ0JHSUVnZ3RpQzhJTDBnd0NERUlNWWd5Q0RKSU1vZ3pDRFJJTllnNENEaklPZ2c5U0QzSVAwZ0lpRWxJVEFoU1NHYkllZ2k4aUpXSTFvalp5TnFJM1FqaENPTUk1UWpseU9aSTZzanlpUE1Jd0lrQXlSQkxFTXNSaXhJTEZJc1lTeGpMR1lzYWl4c0xHOHNmU3lpTGFZdHB5MnNMYTR0d2kzRUxjc3R6UzNTTGRndHppN1ZMa1l2TURBOE1ENHdZREJwTUdzd2JURGVNQWt4TXpLaU1xMHlxalgvTlY4MmJUWUFOOW8zK1RocU9kODg1ejIrUHpKQU5rQmhRRmxCemtMaVFxTkRxRVA2UXdwRXcwWDFSZmRGKzBYOFJSQkdFMFlwUnVoSUQwbCtTUkpLWTBxOWdyNkN2NExNZ3MyQzBvTFpndDJDNFlMcGd2Q0NBSU1PZzlXVElaUThsSTJVbHBTd2xMR1VzcFMxbEx1VXZKUytsTVNZeFpqSm1NcVl5NWpNbUdHWjRwbUFBS1VBcVFDeUFMZ0EyQURpQU9zQTdnRDBBUGdBK3dEOUFBSUJGQUVjQVN3QlJRRkpBVTRCYkFIUEFkRUIwd0hWQWRjQjJRSGJBZDBCK2dGU0FtSUN5QUxNQXRvQ29nT3FBOElEeWdNQ0JGQUVVZ1FSSUJjZ0dpQWVJQ2NnTVNBMElEWWdQQ0N0SUFRaEJpRUtJUmNoSWlGc0lYb2hsQ0dhSVFraUVDSVNJaFlpR3lJaElpUWlKaUlzSWk4aU9DSStJa2tpVFNKVEltSWlhQ0p3SXBZaW1pS21Jc0FpRXlOcUpKd2tUQ1YwSlpBbGxpV2lKYlFsdmlYSUpjd2wwQ1htSlFjbUNpWkJKa01tZ2k2Rkxva3VqUzZZTHFndXF5NnZMclF1dUM2OExzc3UvQzhFTUJnd0h6QXFNRDh3bERDZk1QY3cvekFxTVNveU1qS2tNcEF6bnpPaU04VXp6elBUTTlZelNEUjBOSjgxRHpZYk5oazViem5ST2VBNWREcFBPMjg4NFR4WFFHQkJPRU90UTdKRDNrUFhSRTFHWWtZa1J5cEhmVWVPUjBoSmUwbCtTWVJKaDBtY1NhQkp1RWw0VEtSTUdrMnZUYWFmYk9mSTUrZm5GZWdaNkIvb0orZ3Q2RFBvUE9oRTZGYm9aZWd0K1hyNWx2bm8rZkw1RVBvUytoWDZHZm9pK2lYNkt2b3kva1grVS81WS9tZitiUDVmLytiL0wyaHZiV1V2Y25WdWJtVnlMeTVqWVhKbmJ5OXlaV2RwYzNSeWVTOXpjbU12YVc1a1pYZ3VZM0poZEdWekxtbHZMVEU1TkRsalpqaGpObUkxWWpVMU4yWXZaVzVqYjJScGJtZGZjbk10TUM0NExqTTFMM055WXk5a1lYUmhMbkp6QUFBbVF4SUFZQUFBQU9XOUFRQWFBQUFBSmtNU0FHQUFBQURtdlFFQUdRQUFBQ1pERWdCZ0FBQUFMNzRCQUJvQUFBQW1ReElBWUFBQUFEQytBUUFkQUFBQUp3RUFBQXdBQUFBRUFBQUFLQUVBQUNjQkFBQU1BQUFBQkFBQUFDa0JBQUFvQVFBQXlFTVNBQ29CQUFBckFRQUFMQUVBQUNvQkFBQXRBUUFBUjJWdVpYSnBZMEZ5Y21GNU9qcG1jbTl0WDJsMFpYSWdjbVZqWldsMlpXUWdJR1ZzWlcxbGJuUnpJR0oxZENCbGVIQmxZM1JsWkNBRVJCSUFJUUFBQUNWRUVnQVhBQUFBTDJodmJXVXZjblZ1Ym1WeUx5NWpZWEpuYnk5eVpXZHBjM1J5ZVM5emNtTXZhVzVrWlhndVkzSmhkR1Z6TG1sdkxURTVORGxqWmpoak5tSTFZalUxTjJZdloyVnVaWEpwWXkxaGNuSmhlUzB3TGpFMExqY3ZjM0pqTDJ4cFlpNXljd0FBQUV4RUVnQmhBQUFBYmdFQUFBVUFBQUJuWlhSeVlXNWtiMjA2SUhSb2FYTWdkR0Z5WjJWMElHbHpJRzV2ZENCemRYQndiM0owWldSbGNuSnViem9nWkdsa0lHNXZkQ0J5WlhSMWNtNGdZU0J3YjNOcGRHbDJaU0IyWVd4MVpYVnVaWGh3WldOMFpXUWdjMmwwZFdGMGFXOXVWMlZpSUVOeWVYQjBieUJCVUVrZ2FYTWdkVzVoZG1GcGJHRmliR1ZWYm10dWIzZHVJRVZ5Y205eU9pQUFBQUErUlJJQUR3QUFBQzlvYjIxbEwzSjFibTVsY2k4dVkyRnlaMjh2Y21WbmFYTjBjbmt2YzNKakwybHVaR1Y0TG1OeVlYUmxjeTVwYnkweE9UUTVZMlk0WXpaaU5XSTFOVGRtTDJoaGMyaGljbTkzYmkwd0xqRTFMak12YzNKakwzSmhkeTl0YjJRdWNuTUFBQUJZUlJJQVlRQUFBQ1VBQUFBb0FBQUFTR0Z6YUNCMFlXSnNaU0JqWVhCaFkybDBlU0J2ZG1WeVpteHZkOHhGRWdBY0FBQUFMM0oxYzNRdlpHVndjeTlvWVhOb1luSnZkMjR0TUM0eE5TNHpMM055WXk5eVlYY3ZiVzlrTG5KekFBRHdSUklBS2dBQUFDVUFBQUFvQUFBQUwyaHZiV1V2Y25WdWJtVnlMeTVqWVhKbmJ5OXlaV2RwYzNSeWVTOXpjbU12YVc1a1pYZ3VZM0poZEdWekxtbHZMVEU1TkRsalpqaGpObUkxWWpVMU4yWXZhbk10YzNsekxUQXVNeTQzTnk5emNtTXZiR2xpTG5KekFBQXNSaElBV2dBQUFQc1lBQUFCQUFBQUwyaHZiV1V2Y25WdWJtVnlMeTVqWVhKbmJ5OXlaV2RwYzNSeWVTOXpjbU12YVc1a1pYZ3VZM0poZEdWekxtbHZMVEU1TkRsalpqaGpObUkxWWpVMU4yWXZkMkZ6YlMxaWFXNWtaMlZ1TFRBdU1pNHhNREF2YzNKakwyTnZiblpsY25RdmMyeHBZMlZ6TG5Kem1FWVNBR3dBQUFBa0FRQUFEZ0FBQUdOc2IzTjFjbVVnYVc1MmIydGxaQ0J5WldOMWNuTnBkbVZzZVNCdmNpQmhablJsY2lCaVpXbHVaeUJrY205d2NHVmtZWE56WlhKMGFXOXVJR1poYVd4bFpEb2diR1Z1SUQ0Z01DOXlkWE4wWXk4MllqQXdZbU16T0Rnd01UazROakF3TVRNd1pURmpaall5WWpobU9HRTVNelE1TkRRNE9HTmpMMnhwWW5KaGNua3ZZV3hzYjJNdmMzSmpMMk52Ykd4bFkzUnBiMjV6TDJKMGNtVmxMMjV2WkdVdWNuTUFBRjlIRWdCYkFBQUFaUUVBQUFrQUFBRFlZeElBWUFBQUFLRUJBQUF1QUFBQVlYTnpaWEowYVc5dUlHWmhhV3hsWkRvZ2FXUjRJRHdnUTBGUVFVTkpWRmxmUnhJQVd3QUFBSlVDQUFBSkFBQUFZWE56WlhKMGFXOXVJR1poYVd4bFpEb2daV1JuWlM1b1pXbG5hSFFnUFQwZ2MyVnNaaTVvWldsbmFIUWdMU0F4WDBjU0FGc0FBQUN0QWdBQUNRQUFBRjlIRWdCYkFBQUFzUUlBQUFrQUFBQnBiblJsY201aGJDQmxjbkp2Y2pvZ1pXNTBaWEpsWkNCMWJuSmxZV05vWVdKc1pTQmpiMlJsT2lCbGJYQjBlU0JwYm5SbGNtNWhiQ0J1YjJSbEFBQUFYRWdTQUQwQUFBQmZSeElBV3dBQUFFWUZBQUFmQUFBQVlYTnpaWEowYVc5dUlHWmhhV3hsWkRvZ2MyVnNaaTVvWldsbmFIUWdQaUF3QUFBQVgwY1NBRnNBQUFCZ0FnQUFDUUFBQUdGemMyVnlkR2x2YmlCbVlXbHNaV1E2SUhOeVl5NXNaVzRvS1NBOVBTQmtjM1F1YkdWdUtDbGZSeElBV3dBQUFFb0hBQUFGQUFBQVgwY1NBRnNBQUFESEJBQUFJd0FBQUY5SEVnQmJBQUFBeXdRQUFDTUFBQUJmUnhJQVd3QUFBQW9GQUFBa0FBQUFZWE56WlhKMGFXOXVJR1poYVd4bFpEb2daV1JuWlM1b1pXbG5hSFFnUFQwZ2MyVnNaaTV1YjJSbExtaGxhV2RvZENBdElERUFBQUJmUnhJQVd3QUFBUG9EQUFBSkFBQUFZWE56WlhKMGFXOXVJR1poYVd4bFpEb2dZMjkxYm5RZ1BpQXdBRjlIRWdCYkFBQUE3d1VBQUFrQUFBQmhjM05sY25ScGIyNGdabUZwYkdWa09pQnZiR1JmY21sbmFIUmZiR1Z1SUNzZ1kyOTFiblFnUEQwZ1EwRlFRVU5KVkZrQVgwY1NBRnNBQUFEM0JRQUFEUUFBQUdGemMyVnlkR2x2YmlCbVlXbHNaV1E2SUc5c1pGOXNaV1owWDJ4bGJpQStQU0JqYjNWdWRBQmZSeElBV3dBQUFQZ0ZBQUFOQUFBQWFXNTBaWEp1WVd3Z1pYSnliM0k2SUdWdWRHVnlaV1FnZFc1eVpXRmphR0ZpYkdVZ1kyOWtaVjlIRWdCYkFBQUFKd1lBQUJZQUFBQmZSeElBV3dBQUFDNEdBQUFKQUFBQVlYTnpaWEowYVc5dUlHWmhhV3hsWkRvZ2IyeGtYMnhsWm5SZmJHVnVJQ3NnWTI5MWJuUWdQRDBnUTBGUVFVTkpWRmtBQUY5SEVnQmJBQUFBTmdZQUFBMEFBQUJoYzNObGNuUnBiMjRnWm1GcGJHVmtPaUJ2YkdSZmNtbG5hSFJmYkdWdUlENDlJR052ZFc1MFgwY1NBRnNBQUFBM0JnQUFEUUFBQUY5SEVnQmJBQUFBWndZQUFCWUFBQUJoYzNObGNuUnBiMjRnWm1GcGJHVmtPaUJ0WVhSamFDQjBjbUZqYTE5bFpHZGxYMmxrZUNCN0NpQWdJQ0JNWldaMFQzSlNhV2RvZERvNlRHVm1kQ2hwWkhncElEMCtJR2xrZUNBOFBTQnZiR1JmYkdWbWRGOXNaVzRzQ2lBZ0lDQk1aV1owVDNKU2FXZG9kRG82VW1sbmFIUW9hV1I0S1NBOVBpQnBaSGdnUEQwZ2NtbG5hSFJmYkdWdUxBcDlBQUJmUnhJQVd3QUFBTWtGQUFBSkFBQUFZWE56WlhKMGFXOXVJR1poYVd4bFpEb2dibVYzWDJ4bFpuUmZiR1Z1SUR3OUlFTkJVRUZEU1ZSWkFBQmZSeElBV3dBQUFId0ZBQUFKQUFBQWNHRVNBRjhBQUFCWUFnQUFNQUFBQUhCaEVnQmZBQUFBTUFJQUFDOEFBQUJCUlZOV01rRkZVMVl6TVM0MEwyaHZiV1V2Y25WdWJtVnlMeTVqWVhKbmJ5OXlaV2RwYzNSeWVTOXpjbU12YVc1a1pYZ3VZM0poZEdWekxtbHZMVEU1TkRsalpqaGpObUkxWWpVMU4yWXZiRzl3WkdZdE1DNHpOaTR3TDNOeVl5OWtiMk4xYldWdWRDNXljd0FkVEJJQVhnQUFBTE1BQUFBNEFBQUFRM0o1Y0hSR2FXeDBaWEpEUmswQVFhU1p5UUFMRmdFQUFBQXVBUUFBTHdFQUFEQUJBQUF4QVFBQU1RRUFRY1NaeVFBTEZnRUFBQUF5QVFBQU13RUFBRFFCQUFBMUFRQUFOZ0VBUWVTWnlRQUxGZ0VBQUFBM0FRQUFPQUVBQURrQkFBQTZBUUFBT3dFQVFZU2F5UUFMd1JvQkFBQUFQQUVBQUQwQkFBQTVBUUFBUGdFQUFENEJBQUJEUmdBQUhVd1NBRjRBQUFBSEFnQUFPUUFBQUIxTUVnQmVBQUFBK3dFQUFEMEFBQUJTYjI5MFEyOXVkR1Z1ZEhNZFRCSUFYZ0FBQUVJQ0FBQXRBQUFBSFV3U0FGNEFBQUExQWdBQUtRQUFBQjFNRWdCZUFBQUFLZ01BQUJnQUFBQlFZV2RsYzB0cFpITUFBQUFkVEJJQVhnQUFBRmNEQUFBMEFBQUFRV1Z6TVRJNFEzSjVjSFJHYVd4MFpYSkJaWE15TlRaRGNubHdkRVpwYkhSbGNtTmhjR0ZqYVhSNUlHOTJaWEptYkc5M0FMcE5FZ0FSQUFBQXlLb1VBRW9BQUFDb0FRQUFId0FBQUFXR0ZBQk9BQUFBOWdVQUFCVUFBQUNRWnhJQUFRQUFBSnlnRWdBQkFBQUFBQUFBQUFnQUFBQUVBQUFBUHdFQUFBMGxBQUNlVmhJQVlBQUFBR0lBQUFBYkFBQUFubFlTQUdBQUFBQmpBQUFBUEFBQUFKNVdFZ0JnQUFBQWJ3QUFBQjBBQUFDZVZoSUFZQUFBQUhBQUFBQStBQUFBSTF3QUFKNVdFZ0JnQUFBQW53QUFBRFVBQUFCMGIyOGdaR1ZsY0o1V0VnQmdBQUFBendBQUFCMEFBQUNlVmhJQVlBQUFBTkFBQUFBZEFBQUFiblZzYkhOMGNtVmhiV1Z1WkhOMGNtVmhiVzlpYW1WdVpHOWlhaVZRUkVZdElBMGdDbTVtZEhKaGFXeGxja0pKUlVsWGFXUjBhRWhsYVdkb2RFSlFRMlpwYkhSbGNuTWdabTl5SUdsdWJHbHVaU0JwYldGblpYTlFZWFIwWlhKdUlHTnZiRzl5YzNCaFkyVWdhWE1nYm05MElHRnNiRzkzWldRZ2FXNGdhVzVzYVc1bElHbHRZV2RsYzJsdWJHbHVaU0JwYldGblpTQmpiMnh2Y25Od1lXTmxjeTlvYjIxbEwzSjFibTVsY2k4dVkyRnlaMjh2Y21WbmFYTjBjbmt2YzNKakwybHVaR1Y0TG1OeVlYUmxjeTVwYnkweE9UUTVZMlk0WXpaaU5XSTFOVGRtTDJsdVpHVjRiV0Z3TFRJdU9TNHdMM055WXk5dFlYQXVjbk1BQURkUEVnQmJBQUFBekFJQUFCb0FBQUNnZHhJQVlBQUFBRHNBQUFBakFBQUFvSGNTQUdBQUFBQXpBQUFBRHdBQUFIY0FBQUFNQUFBQUJBQUFBRUFCQUFCQkFRQUFlZ0FBQUVOdmRXNTBLQ2xjRFFvZ0NRMEtMMmh2YldVdmNuVnVibVZ5THk1allYSm5ieTl5WldkcGMzUnllUzl6Y21NdmFXNWtaWGd1WTNKaGRHVnpMbWx2TFRFNU5EbGpaamhqTm1JMVlqVTFOMll2Ykc5d1pHWXRNQzR6Tmk0d0wzTnlZeTl3WVhKelpYSmZZWFY0TG5KelNXNWtaWGdBNms4U0FHQUFBQUFZQVFBQUhBQUFBT3BQRWdCZ0FBQUFHUUVBQUJ3QUFBRHFUeElBWUFBQUFCb0JBQUFjQUFBQTZrOFNBR0FBQUFBZkFRQUFNUUFBQU9wUEVnQmdBQUFBSHdFQUFCb0FBQURxVHhJQVlBQUFBQ0FCQUFBeEFBQUE2azhTQUdBQUFBQWdBUUFBR2dBQUFPcFBFZ0JnQUFBQUlRRUFBREVBQUFEcVR4SUFZQUFBQUNFQkFBQWFBQUFBNms4U0FHQUFBQUFrQVFBQUp3QUFBT3BQRWdCZ0FBQUFKUUVBQUNjQUFBRHFUeElBWUFBQUFGa0JBQUFUQUFBQTZrOFNBR0FBQUFCY0FRQUFEUUFBQUM5eWRYTjBZeTgyWWpBd1ltTXpPRGd3TVRrNE5qQXdNVE13WlRGalpqWXlZamhtT0dFNU16UTVORFE0T0dOakwyeHBZbkpoY25rdmMzUmtMM055WXk5cGJ5OXBiWEJzY3k1eWN3QWdVUklBU3dBQUFHb0JBQUFSQUFBQUlGRVNBRXNBQUFCZkFRQUFHZ0FBQUdaaGFXeGxaQ0IwYnlCbWFXeHNJSGRvYjJ4bElHSjFabVpsY2dDTVVSSUFHd0FBQUNVQUFBQUFBQUFBQWdBQUFLaFJFZ0FnVVJJQVN3QUFBRFlCQUFBUUFBQUFJRkVTQUVzQUFBQTJBUUFBR0FBQUFDQlJFZ0JMQUFBQW5nRUFBQllBQUFCSmJuWmhiR2xrUTI5a1pVNXZJRzF2Y21VZ1pHRjBZU0JpZFhRZ2JtOGdaVzVrSUcxaGNtdGxjaUJrWlhSbFkzUmxaQUFBWUtZV0FGc0FBQUN5QVFBQUpRQUFBR052Y25KMWNIUWdaR1ZtYkdGMFpTQnpkSEpsWVcwdmFHOXRaUzl5ZFc1dVpYSXZMbU5oY21kdkwzSmxaMmx6ZEhKNUwzTnlZeTlwYm1SbGVDNWpjbUYwWlhNdWFXOHRNVGswT1dObU9HTTJZalZpTlRVM1ppOW1iR0YwWlRJdE1TNHhMakV2YzNKakwySjFabkpsWVdSbGNpNXljd0FBQUVwU0VnQmZBQUFBTGdBQUFCWUFBQUJLVWhJQVh3QUFBR0lBQUFBVkFBQUFMMmh2YldVdmNuVnVibVZ5THk1allYSm5ieTl5WldkcGMzUnllUzl6Y21NdmFXNWtaWGd1WTNKaGRHVnpMbWx2TFRFNU5EbGpaamhqTm1JMVlqVTFOMll2Ykc5d1pHWXRNQzR6Tmk0d0wzTnlZeTlsYm1OeWVYQjBhVzl1TDJOeWVYQjBYMlpwYkhSbGNuTXVjbk1BQU14U0VnQnVBQUFBWEFBQUFCc0FBQUJ6UVd4VXpGSVNBRzRBQUFDQkFBQUFIZ0FBQU14U0VnQnVBQUFBbEFBQUFEa0FBQURNVWhJQWJnQUFBS3dBQUFBbkFBQUF6RklTQUc0QUFBQzBBQUFBSXdBQUFNeFNFZ0J1QUFBQTFRQUFBQjRBQUFETVVoSUFiZ0FBQU9nQUFBQTVBQUFBekZJU0FHNEFBQUFBQVFBQUp3QUFBTXhTRWdCdUFBQUFDQUVBQUNNQUFBQXZhRzl0WlM5eWRXNXVaWEl2TG1OaGNtZHZMM0psWjJsemRISjVMM055WXk5cGJtUmxlQzVqY21GMFpYTXVhVzh0TVRrME9XTm1PR00yWWpWaU5UVTNaaTlzYjNCa1ppMHdMak0yTGpBdmMzSmpMMlZ1WTNKNWNIUnBiMjR2Y0d0amN6VXVjbk1BQU5CVEVnQm1BQUFBS2dBQUFCd0FBQUF2YUc5dFpTOXlkVzV1WlhJdkxtTmhjbWR2TDNKbFoybHpkSEo1TDNOeVl5OXBibVJsZUM1amNtRjBaWE11YVc4dE1UazBPV05tT0dNMllqVmlOVFUzWmk5c2IzQmtaaTB3TGpNMkxqQXZjM0pqTDJWdVkzSjVjSFJwYjI0dmNtTTBMbkp6WVhOelpYSjBhVzl1SUdaaGFXeGxaRG9nSVd0bGVTNXBjMTlsYlhCMGVTZ3BJQ1ltSUd0bGVTNXNaVzRvS1NBOFBTQXlOVFlBQUFCSVZCSUFaQUFBQUFvQUFBQUpBQUFBU0ZRU0FHUUFBQUEwQUFBQUdnQUFBQzlvYjIxbEwzSjFibTVsY2k4dVkyRnlaMjh2Y21WbmFYTjBjbmt2YzNKakwybHVaR1Y0TG1OeVlYUmxjeTVwYnkweE9UUTVZMlk0WXpaaU5XSTFOVGRtTDJ4dmNHUm1MVEF1TXpZdU1DOXpjbU12Wm1sc2RHVnljeTl3Ym1jdWNuTUFBQUFFVlJJQVlRQUFBRDhBQUFBMkFBQUFCRlVTQUdFQUFBQklBQUFBWHdBQUFBUlZFZ0JoQUFBQVJBQUFBRFlBQUFBRVZSSUFZUUFBQUZFQUFBQldBQUFBQkZVU0FHRUFBQUJOQUFBQVJ3QUFBQVJWRWdCaEFBQUFaQUFBQUJZQUFBQnBiblpoYkdsa0lGQk9SeUJtYVd4MFpYSWdkSGx3WlNBb0FBQUF5RlVTQUJrQUFBQ1RpaFFBQVFBQUFHTnZiblJsYm5RZ2IzQmxjbUYwYVc5dWN3QUFBQUFBQUFnQUFBQUVBQUFBUHdFQUFDOW9iMjFsTDNKMWJtNWxjaTh1WTJGeVoyOHZjbVZuYVhOMGNua3ZjM0pqTDJsdVpHVjRMbU55WVhSbGN5NXBieTB4T1RRNVkyWTRZelppTldJMU5UZG1MMjV2YlMwNExqQXVNQzl6Y21NdmJYVnNkR2t2Ylc5a0xuSnpHRllTQUZ3QUFBQmNBQUFBSndBQUFCaFdFZ0JjQUFBQWNRQUFBQkVBQUFBb0tUdytXMTE3ZlM4bEwyaHZiV1V2Y25WdWJtVnlMeTVqWVhKbmJ5OXlaV2RwYzNSeWVTOXpjbU12YVc1a1pYZ3VZM0poZEdWekxtbHZMVEU1TkRsalpqaGpObUkxWWpVMU4yWXZiRzl3WkdZdE1DNHpOaTR3TDNOeVl5OXdZWEp6WlhJdmJXOWtMbkp6QUFDZVZoSUFZQUFBQUhnQUFBQkFBQUFBbmxZU0FHQUFBQUNBQUFBQVFRQUFBSjVXRWdCZ0FBQUFpZ0FBQUJRQUFBQ2VWaElBWUFBQUFPMEFBQUFoQUFBQW5sWVNBR0FBQUFEeEFBQUFMUUFBQUo1V0VnQmdBQUFBVHdFQUFDMEFBQUF2YUc5dFpTOXlkVzV1WlhJdkxtTmhjbWR2TDNKbFoybHpkSEo1TDNOeVl5OXBibVJsZUM1amNtRjBaWE11YVc4dE1UazBPV05tT0dNMllqVmlOVFUzWmk5aWJHOWpheTFpZFdabVpYSXRNQzR4TUM0MEwzTnlZeTlzYVdJdWNuTmdWeElBWUFBQUFLSUFBQUFuQUFBQVlGY1NBR0FBQUFDa0FBQUFHQUFBQUdCWEVnQmdBQUFBcEFBQUFDQUFBQUJnVnhJQVlBQUFBSzRBQUFBVUFBQUFZRmNTQUdBQUFBQ3VBQUFBR2dBQUFHQlhFZ0JnQUFBQW5RQUFBQmdBQUFCZ1Z4SUFZQUFBQUowQUFBQWZBQUFBWUZjU0FHQUFBQUNkQUFBQUpRQUFBR0JYRWdCZ0FBQUFMUUVBQUNJQUFBQUJJMFZuaWF2TjcvN2N1cGgyVkRJUVlYTnpaWEowYVc5dUlHWmhhV3hsWkRvZ0lXOTFkR0oxWmk1cGMxOWxiWEIwZVNncFlLWVdBRnNBQUFDTEFRQUFDUUFBQUdDbUZnQmJBQUFBaHdFQUFFTUFBQUF2YUc5dFpTOXlkVzV1WlhJdkxtTmhjbWR2TDNKbFoybHpkSEo1TDNOeVl5OXBibVJsZUM1amNtRjBaWE11YVc4dE1UazBPV05tT0dNMllqVmlOVFUzWmk5dFpDMDFMVEF1TVRBdU5pOXpjbU12YkdsaUxuSnpwRmdTQUZnQUFBQmRBQUFBRXdBQUFDOW9iMjFsTDNKMWJtNWxjaTh1WTJGeVoyOHZjbVZuYVhOMGNua3ZjM0pqTDJsdVpHVjRMbU55WVhSbGN5NXBieTB4T1RRNVkyWTRZelppTldJMU5UZG1MM05vWVRJdE1DNHhNQzQ1TDNOeVl5OWpiM0psWDJGd2FTNXljd0FBQUF4WkVnQmRBQUFBUWdBQUFCTUFBQUFBQUFBQVorWUphb1d1Wjd0eTgyNDhPdlZQcFg5U0RsR01hQVdicTltREh4bk40RnNNV1JJQVhRQUFBSXdBQUFBVEFBQUEySjRGd1YyZHU4c0gxWHcyS2ltYVloZmRjREJhQVZtUk9Wa085OWpzTHhVeEM4RC9aeVl6WnhFVldHaUhTclNPcDQvNVpBMHVETnVrVC9xK0hVaTFSd2pKdlBObjVnbHFPNmZLaElXdVo3c3IrSlQrY3ZOdVBQRTJIVjg2OVUrbDBZTG1yWDlTRGxFZmJENHJqR2dGbTJ1OVFmdXIyWU1mZVNGK0V4bk40RnRGYm1OeWVYQjBUV1YwWVdSaGRHRUFBd0FBQUFFQVFZaTF5UUFMY2k5b2IyMWxMM0oxYm01bGNpOHVZMkZ5WjI4dmNtVm5hWE4wY25rdmMzSmpMMmx1WkdWNExtTnlZWFJsY3k1cGJ5MHhPVFE1WTJZNFl6WmlOV0kxTlRkbUwyeHZjR1JtTFRBdU16WXVNQzl6Y21NdlpXNWpjbmx3ZEdsdmJpOWhiR2R2Y21sMGFHMXpMbkp6VlVWUVpYSnRjd0JCMnJiSkFBdnJFZ0VBMkFJQkFNY0NBUURHQWdFQTJRSUJBTjBDQVFEYkFnRUEyZ0lCQU53Q0FRQWdBQUVBSVFBQkFDSUFBUUFqQUFFQUpBQUJBQ1VBQVFBbUFBRUFKd0FCQUNnQUFRQXBBQUVBS2dBQkFDc0FBUUFzQUFFQUxRQUJBQzRBQVFBdkFBRUFNQUFCQURFQUFRQXlBQUVBTXdBQkFEUUFBUUExQUFFQU5nQUJBRGNBQVFBNEFBRUFPUUFCQURvQUFRQTdBQUVBUEFBQkFEMEFBUUErQUFFQVB3QUJBRUFBQVFCQkFBRUFRZ0FCQUVNQUFRQkVBQUVBUlFBQkFFWUFBUUJIQUFFQVNBQUJBRWtBQVFCS0FBRUFTd0FCQUV3QUFRQk5BQUVBVGdBQkFFOEFBUUJRQUFFQVVRQUJBRklBQVFCVEFBRUFWQUFCQUZVQUFRQldBQUVBVndBQkFGZ0FBUUJaQUFFQVdnQUJBRnNBQVFCY0FBRUFYUUFCQUY0QUFRQmZBQUVBWUFBQkFHRUFBUUJpQUFFQVl3QUJBR1FBQVFCbEFBRUFaZ0FCQUdjQUFRQm9BQUVBYVFBQkFHb0FBUUJyQUFFQWJBQUJBRzBBQVFCdUFBRUFid0FCQUhBQUFRQnhBQUVBY2dBQkFITUFBUUIwQUFFQWRRQUJBSFlBQVFCM0FBRUFlQUFCQUhrQUFRQjZBQUVBZXdBQkFId0FBUUI5QUFFQWZnQUFBQUFBQVFBaUlBRUFJQ0FCQUNFZ0FRQW1JQUVBRkNBQkFCTWdBUUNTQVFFQVJDQUJBRGtnQVFBNklBRUFFaUlCQURBZ0FRQWVJQUVBSENBQkFCMGdBUUFZSUFFQUdTQUJBQm9nQVFBaUlRRUFBZnNCQUFMN0FRQkJBUUVBVWdFQkFHQUJBUUI0QVFFQWZRRUJBREVCQVFCQ0FRRUFVd0VCQUdFQkFRQitBUUFBQUFBQkFLd2dBUUNoQUFFQW9nQUJBS01BQVFDa0FBRUFwUUFCQUtZQUFRQ25BQUVBcUFBQkFLa0FBUUNxQUFFQXF3QUJBS3dBQUFBQUFBRUFyZ0FCQUs4QUFRQ3dBQUVBc1FBQkFMSUFBUUN6QUFFQXRBQUJBTFVBQVFDMkFBRUF0d0FCQUxnQUFRQzVBQUVBdWdBQkFMc0FBUUM4QUFFQXZRQUJBTDRBQVFDL0FBRUF3QUFCQU1FQUFRRENBQUVBd3dBQkFNUUFBUURGQUFFQXhnQUJBTWNBQVFESUFBRUF5UUFCQU1vQUFRRExBQUVBekFBQkFNMEFBUURPQUFFQXp3QUJBTkFBQVFEUkFBRUEwZ0FCQU5NQUFRRFVBQUVBMVFBQkFOWUFBUURYQUFFQTJBQUJBTmtBQVFEYUFBRUEyd0FCQU53QUFRRGRBQUVBM2dBQkFOOEFBUURnQUFFQTRRQUJBT0lBQVFEakFBRUE1QUFCQU9VQUFRRG1BQUVBNXdBQkFPZ0FBUURwQUFFQTZnQUJBT3NBQVFEc0FBRUE3UUFCQU80QUFRRHZBQUVBOEFBQkFQRUFBUUR5QUFFQTh3QUJBUFFBQVFEMUFBRUE5Z0FCQVBjQUFRRDRBQUVBK1FBQkFQb0FBUUQ3QUFFQS9BQUJBUDBBQVFEK0FBRUEvd0FvdjA1ZVRuV0tRV1FBVGxiLytnRUlMaTRBdHRCb1BvQXZES24rWkZOcGVrbEUvLy8vLzRoYUVnQnJBQUFBWmdFQUFEWUFBQUNJV2hJQWF3QUFBR1lCQUFBN0FBQUFpRm9TQUdzQUFBQm5BUUFBTmdBQUFJaGFFZ0JyQUFBQVp3RUFBRHdBQUFDSVdoSUFhd0FBQUdnQkFBQXZBQUFBaUZvU0FHc0FBQUJvQVFBQU5RQUFBSWhhRWdCckFBQUFhZ0VBQURRQUFBQ0lXaElBYXdBQUFHb0JBQUE1QUFBQWlGb1NBR3NBQUFCckFRQUFOQUFBQUloYUVnQnJBQUFBYXdFQUFEb0FBQUNJV2hJQWF3QUFBR3dCQUFBdEFBQUFpRm9TQUdzQUFBQnNBUUFBTXdBQUFJaGFFZ0JyQUFBQW5RRUFBQkVBQUFDSVdoSUFhd0FBQUg0QkFBQVJBQUFBaUZvU0FHc0FBQURjQVFBQUZnQUFBSWhhRWdCckFBQUErUUVBQUJrQUFBQ0lXaElBYXdBQUFQa0JBQUFlQUFBQWlGb1NBR3NBQUFENkFRQUFHQUFBQUloYUVnQnJBQUFBK2dFQUFCNEFBQUNJV2hJQWF3QUFBQXNDQUFBWUFBQUFpRm9TQUdzQUFBRFhBZ0FBRndBQUFJaGFFZ0JyQUFBQTV3SUFBQjBBQUFDSVdoSUFhd0FBQUE0REFBQWdBQUFBaUZvU0FHc0FBQUFPQXdBQU9nQUFBSWhhRWdCckFBQUFYQU1BQUJzQUFBQ0lXaElBYXdBQUFCNEVBQUEwQUFBQWlGb1NBR3NBQUFBZUJBQUFPUUFBQUloYUVnQnJBQUFBSHdRQUFEUUFBQUNJV2hJQWF3QUFBQjhFQUFBNkFBQUFpRm9TQUdzQUFBQXFCQUFBR1FBQUFJaGFFZ0JyQUFBQVFnUUFBRFlBQUFDSVdoSUFhd0FBQUVJRUFBQTdBQUFBaUZvU0FHc0FBQUJEQkFBQU5nQUFBSWhhRWdCckFBQUFRd1FBQUR3QUFBQ0lXaElBYXdBQUFFNEVBQUFaQUFBQWlGb1NBR3NBQUFCcEJBQUFEd0FBQUloYUVnQnJBQUFBYkFRQUFBMEFBQUF2Y25WemRHTXZObUl3TUdKak16ZzRNREU1T0RZd01ERXpNR1V4WTJZMk1tSTRaamhoT1RNME9UUTBPRGhqWXk5c2FXSnlZWEo1TDJGc2JHOWpMM055WXk5amIyeHNaV04wYVc5dWN5OWlkSEpsWlM5dVlYWnBaMkYwWlM1eWN3QndZUklBWHdBQUFLMEFBQUFrQUFBQWNHRVNBRjhBQUFER0FBQUFKd0FBQUhCaEVnQmZBQUFBRmdJQUFDOEFBQUJ3WVJJQVh3QUFBQ0lDQUFBMEFBQUFjR0VTQUY4QUFBQ2hBQUFBSkFBQUFHRjBkR1Z0Y0hRZ2RHOGdhbTlwYmlCcGJuUnZJR052Ykd4bFkzUnBiMjRnZDJsMGFDQnNaVzRnUGlCMWMybDZaVG82VFVGWUwzSjFjM1JqTHpaaU1EQmlZek00T0RBeE9UZzJNREF4TXpCbE1XTm1OakppT0dZNFlUa3pORGswTkRnNFkyTXZiR2xpY21GeWVTOWhiR3h2WXk5emNtTXZjM1J5TG5KekFBQUFWV0lTQUVnQUFBQ2FBQUFBQ2dBQUFGVmlFZ0JJQUFBQW5RQUFBQllBQUFCVlloSUFTQUFBQUxFQUFBQVdBQUFBTDJodmJXVXZjblZ1Ym1WeUx5NWpZWEpuYnk5eVpXZHBjM1J5ZVM5emNtTXZhVzVrWlhndVkzSmhkR1Z6TG1sdkxURTVORGxqWmpoak5tSTFZalUxTjJZdlpteGhkR1V5TFRFdU1TNHhMM055WXk5NmJHbGlMM0psWVdRdWNuTUEwR0lTQUY4QUFBQ3ZBQUFBSmdBQUFHTmhibTV2ZENCeVpXTjFjbk5wZG1Wc2VTQmhZM0YxYVhKbElHMTFkR1Y0UUdNU0FDQUFBQUFBTDNKMWMzUmpMelppTURCaVl6TTRPREF4T1RnMk1EQXhNekJsTVdObU5qSmlPR1k0WVRrek5EazBORGc0WTJNdmJHbGljbUZ5ZVM5emRHUXZjM0pqTDNONWN5OXplVzVqTDIxMWRHVjRMMjV2WDNSb2NtVmhaSE11Y25NQUFBQnBZeElBWEFBQUFCTUFBQUFKQUFBQUwzSjFjM1JqTHpaaU1EQmlZek00T0RBeE9UZzJNREF4TXpCbE1XTm1OakppT0dZNFlUa3pORGswTkRnNFkyTXZiR2xpY21GeWVTOWhiR3h2WXk5emNtTXZZMjlzYkdWamRHbHZibk12WW5SeVpXVXZiV0Z3TDJWdWRISjVMbkp6MkdNU0FHQUFBQUJuQWdBQUtnQUFBSGNBQUFBTUFBQUFCQUFBQUNnQkFBQjNBQUFBREFBQUFBUUFBQUFwQVFBQUtBRUFBRWhrRWdBcUFRQUFLd0VBQUN3QkFBQXFBUUFBTFFFQUFFbHVkbUZzYVdSRGIyUmxVbUZ1WjJWamIzVnNaQ0J1YjNRZ2NHRnljMlVnVkc5VmJtbGpiMlJsSUVOTllYQTZJSlJrRWdBZ0FBQUFBZ0FBQUFBQUFBQUNBRUhReWNrQUM0b0NJQUNBNEdsdWRtRnNhV1FnWTI5a1pTQnlZVzVuWlM5eWRYTjBZeTgyWWpBd1ltTXpPRGd3TVRrNE5qQXdNVE13WlRGalpqWXlZamhtT0dFNU16UTVORFE0T0dOakwyeHBZbkpoY25rdmMzUmtMM055WXk5cGJ5OXRiMlF1Y25NQTVtUVNBRWtBQUFDeUFRQUFNUUFBQUdGemMyVnlkR2x2YmlCbVlXbHNaV1E2SUdacGJHeGxaQ0E4UFNCelpXeG1MbUoxWmk1cGJtbDBMM0oxYzNSakx6WmlNREJpWXpNNE9EQXhPVGcyTURBeE16QmxNV05tTmpKaU9HWTRZVGt6TkRrME5EZzRZMk12YkdsaWNtRnllUzlqYjNKbEwzTnlZeTlwYnk5aWIzSnliM2RsWkY5aWRXWXVjbk5wWlJJQVV3QUFBQjBCQUFBSkFBQUFBZ0lDQWdJQ0FnSUNBd01CQVFFQVFlekx5UUFMRUFFQUFBQUFBQUFBQWdJQUFBQUFBQUlBUWF2TXlRQUxBUUlBUWRITXlRQUxBUUVBUWV6TXlRQUxBUUVBUWN6TnlRQUwvUUZVY25sR2NtOXRTVzUwUlhKeWIzSXZhRzl0WlM5eWRXNXVaWEl2TG1OaGNtZHZMM0psWjJsemRISjVMM055WXk5cGJtUmxlQzVqY21GMFpYTXVhVzh0TVRrME9XTm1PR00yWWpWaU5UVTNaaTlzYjNCa1ppMHdMak0yTGpBdmMzSmpMMjlpYW1WamRDNXljMEp2YjJ4bFlXNUpiblJsWjJWeVVtVmhiRk4wY21sdVoxSmxabVZ5Wlc1alpVRnljbUY1UkdsamRHbHZibUZ5ZVZOMGNtVmhiVVJwWTNScGIyNWhjbmtnYjNJZ1UzUnlaV0Z0VG5Wc2JBQUFBSUZuRWdBRUFBQUFMd0FBQUpCbkVnQUJBQUFBS0FBQUFKeG5FZ0FCQUFBQWs0b1VBQUVBQUFBOEFBQUFzR2NTQUFFQUFBQStBQUFBdkdjU0FBRUFBQUFDQUVIU3o4a0FDd0VDQUVIY3o4a0FDOUVDSUFBQTZWdGRBQURnWnhJQUFRQUFBT0ZuRWdBQkFBQUFjM1J5WldGdExpNHVaVzVrYzNSeVpXRnRBQUFCQUFBQUFBQUFBUFJuRWdBU0FBQUFJRklBQUFFQUFBQUFBQUFBbktBU0FBRUFBQUFZYUJJQUFnQUFBRXhwYm1WaGNtbDZaV1FBQUxLb0ZBQUNBQUFBdEtnVUFBSUFBQUJPWVcxbElHOXlJRUZ5Y21GNVpHVmpiMjF3Y21WemMybHZiaUJoYkdkdmNtbDBhRzF6UldGeWJIbERhR0Z1WjJYYlpoSUFYQUFBQU44Q0FBQWFBQUFBQUFBQUFIb2dZMmhoY21GamRHVnlJR2x6SUc1dmRDQmhiR3h2ZDJWa0lHbHVJSFJvWlNCdGFXUmtiR1VnYjJZZ1lTQm5jbTkxY0FEYlpoSUFYQUFBQUJ3REFBQXNBQUFBYlhWc2RHbHdiR2xqWVhScGIyNGdiM1psY21ac2IzZFFjbVZrYVdOMGIzSkRiMngxYlc1elEyOXNiM0p6UW1sMGMxQmxja052YlhCdmJtVnVkQUFBQUhjQUFBQU1BQUFBQkFBQUFIZ0FBQUI1QUFBQWVnQkJ1TkxKQUF1eUFnRUFBQUI3QUFBQVlTQkVhWE53YkdGNUlHbHRjR3hsYldWdWRHRjBhVzl1SUhKbGRIVnlibVZrSUdGdUlHVnljbTl5SUhWdVpYaHdaV04wWldSc2VTOXlkWE4wWXk4MllqQXdZbU16T0Rnd01UazROakF3TVRNd1pURmpaall5WWpobU9HRTVNelE1TkRRNE9HTmpMMnhwWW5KaGNua3ZZV3hzYjJNdmMzSmpMM04wY21sdVp5NXljd0FBZDJrU0FFc0FBQUR3Q2dBQURnQUFBTlNDRWdCWkFBQUF6QUFBQUFvQUFBQlFjbTlvYVdKcGRHVmtRMmhoY21GamRHVnlVSEp2YUdsaWFYUmxaRUpwWkdseVpXTjBhVzl1WVd4VVpYaDBVM1JoY25SelYybDBhRU52YldKcGJtbHVaME5vWVhKaFkzUmxja1Z0Y0hSNVUzUnlhVzVuQUFBQUJZWVVBRTRBQUFCUkJRQUFIUUFBQUVsa1pXNTBhWFI1VmpKR2FXeDBaWEpUZEcxR1UzUnlSa3hsYm1kMGFBQkI5TlRKQUF2SktnRUFBQUF1QVFBQUx3RUFBREFCQUFBeEFRQUFNUUVBQUUxbGRHRmtZWFJoV0ZKbFprTnllWEIwUkdWamIyUmxVR0Z5YlhOT1lXMWxBQUFBQUFBQUFBQUJBQUFBUEFFQUFEMEJBQUE1QVFBQVBnRUFBRDRCQUFCR2FYSnpkQzlvYjIxbEwzSjFibTVsY2k4dVkyRnlaMjh2Y21WbmFYTjBjbmt2YzNKakwybHVaR1Y0TG1OeVlYUmxjeTVwYnkweE9UUTVZMlk0WXpaaU5XSTFOVGRtTDJ4dmNHUm1MVEF1TXpZdU1DOXpjbU12YjJKcVpXTjBYM04wY21WaGJTNXljOUZxRWdCakFBQUFNZ0FBQUJZQUFBRFJhaElBWXdBQUFETUFBQUFwQUFBQTBXb1NBR01BQUFBNUFBQUFWZ0FBQUdScGNtVmpkQ0J2WW1wbFkzUXZhRzl0WlM5eWRXNXVaWEl2TG1OaGNtZHZMM0psWjJsemRISjVMM055WXk5cGJtUmxlQzVqY21GMFpYTXVhVzh0TVRrME9XTm1PR00yWWpWaU5UVTNaaTlzYjNCa1ppMHdMak0yTGpBdmMzSmpMM0psWVdSbGNpNXljd0FBQUhGckVnQmNBQUFBMndBQUFDTUFBQUJvWldGa1pYSUFBSEZyRWdCY0FBQUE1UUFBQUVnQUFBQmlhVzVoY25sZmJXRnlhd0J4YXhJQVhBQUFBUFFBQUFCSkFBQUFlSEpsWmxCeVpYWnhheElBWEFBQUFBTUJBQUJOQUFBQVdGSmxabE4wYlFCeGF4SUFYQUFBQUE0QkFBQlJBQUFBTGtWdVkzSjVjSFJQWW1wVGRHMEFBSEZyRWdCY0FBQUFRd0VBQUMwQUFBQnRhWE56YVc1bklITjBZWEowSUhCdmMybDBhVzl1QUFCeGF4SUFYQUFBQUljQkFBQW5BQUFBYzNSeVpXRnRJR1Y0ZEdWdVpITWdZV1owWlhJZ1pHOWpkVzFsYm5RZ1pXNWtMbTVsWjJGMGFYWmxJSE4wY21WaGJTQnNaVzVuZEdndWFXNWthWEpsWTNRZ2IySnFaV04wSlNWRlQwWnpkR0Z5ZEhoeVpXWUFBSEZyRWdCY0FBQUF5UUVBQUV3QUFBQkpaR1Z1ZEdsMGVVTnllWEIwUm1sc2RHVnlVbU0wUTNKNWNIUkdhV3gwWlhKMGFHVWdMMFZ1WTNKNWNIUWdaR2xqZEdsdmJtRnllU0JwY3lCdGFYTnphVzVuYldsemMybHVaeUJsYm1OeWVYQjBhVzl1SUhabGNuTnBiMjV0YVhOemFXNW5JR1Z1WTNKNWNIUnBiMjRnY21WMmFYTnBiMjV0YVhOemFXNW5JSFJvWlNCdmQyNWxjaUJ3WVhOemQyOXlaQ0FvTDA4cGJXbHpjMmx1WnlCMGFHVWdkWE5sY2lCd1lYTnpkMjl5WkNBb0wxVXBiV2x6YzJsdVp5QjBhR1VnY0dWeWJXbHpjMmx2Ym5NZ1ptbGxiR1FnS0M5UUtXMXBjM05wYm1jZ2RHaGxJR1pwYkdVZ0wwbEVJR1ZzWlcxbGJuUnphVzUyWVd4cFpDQm9ZWE5vSUd4bGJtZDBhR2x1ZG1Gc2FXUWdhMlY1SUd4bGJtZDBhR2x1ZG1Gc2FXUWdZMmx3YUdWeWRHVjRkQ0JzWlc1bmRHaHBiblpoYkdsa0lIQmxjbTFwYzNOcGIyNGdiR1Z1WjNSb2FXNTJZV3hwWkNCMlpYSnphVzl1YVc1MllXeHBaQ0J5WlhacGMybHZiblZ1Wlhod1pXTjBaV1FnZEhsd1pUc2daRzlqZFcxbGJuUWdaRzlsY3lCdWIzUWdZMjl0Y0d4NUlIZHBkR2dnZEdobElITndaV04wYUdVZ2IySnFaV04wSUdseklHNXZkQ0JqWVhCaFlteGxJRzltSUdKbGFXNW5JR1JsWTNKNWNIUmxaSFJvWlNCemRYQndiR2xsWkNCd1lYTnpkMjl5WkNCcGN5QnBibU52Y25KbFkzUjBhR1VnWkc5amRXMWxiblFnZFhObGN5QmhiaUJsYm1OeWVYQjBhVzl1SUhOamFHVnRaU0IwYUdGMElHbHpJRzV2ZENCcGJYQnNaVzFsYm5SbFpDQnBiaUJzYjNCa1puUm9aU0JsYm1OeWVYQjBhVzl1SUhabGNuTnBiMjRnYVhNZ2JtOTBJR2x0Y0d4bGJXVnVkR1ZrSUdsdUlHeHZjR1JtZEdobElHVnVZM0o1Y0hScGIyNGdjbVYyYVhOcGIyNGdhWE1nYm05MElHbHRjR3hsYldWdWRHVmtJR2x1SUd4dmNHUm1hVzUyWVd4cFpDQndZV1JrYVc1bklHVnVZMjkxYm5SbGNtVmtJSGRvWlc0Z1pHVmpjbmx3ZEdsdVp5d2dhMlY1SUcxcFoyaDBJR0psSUdsdVkyOXljbVZqZEUxcGMzTnBibWRGYm1OeWVYQjBSR2xqZEdsdmJtRnllVTFwYzNOcGJtZFdaWEp6YVc5dVRXbHpjMmx1WjFKbGRtbHphVzl1VFdsemMybHVaMDkzYm1WeVVHRnpjM2R2Y21STmFYTnphVzVuVlhObGNsQmhjM04zYjNKa1RXbHpjMmx1WjFCbGNtMXBjM05wYjI1elRXbHpjMmx1WjBacGJHVkpSRWx1ZG1Gc2FXUklZWE5vVEdWdVozUm9TVzUyWVd4cFpFdGxlVXhsYm1kMGFFbHVkbUZzYVdSRGFYQm9aWEpVWlhoMFRHVnVaM1JvU1c1MllXeHBaRkJsY20xcGMzTnBiMjVNWlc1bmRHaEpiblpoYkdsa1ZtVnljMmx2YmtsdWRtRnNhV1JTWlhacGMybHZia2x1ZG1Gc2FXUlVlWEJsVG05MFJHVmpjbmx3ZEdGaWJHVkpibU52Y25KbFkzUlFZWE56ZDI5eVpGVnVjM1Z3Y0c5eWRHVmtSVzVqY25sd2RHbHZibFZ1YzNWd2NHOXlkR1ZrVm1WeWMybHZibFZ1YzNWd2NHOXlkR1ZrVW1WMmFYTnBiMjVUZEhKcGJtZFFjbVZ3VUdGa1pHbHVaMjFwYzNOcGJtY2dabVZoZEhWeVpTQnZaaUJzYjNCa1pqb2dPeUJ3YkdWaGMyVWdiM0JsYmlCaGJpQnBjM04xWlNCaGRDQm9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZTaTFHTFV4cGRTOXNiM0JrWmk4Z2RHOGdiR1YwSUhSb1pTQmtaWFpsYkc5d1pYSnpJR3R1YjNjZ2IyWWdlVzkxY2lCMWMyVmpZWE5sQUFBdWNSSUFHZ0FBQUVoeEVnQm1BQUFBYjJKcVpXTjBJR2hoY3lCM2NtOXVaeUIwZVhCbE95QmxlSEJsWTNSbFpDQjBlWEJsSUNCaWRYUWdabTkxYm1RZ2RIbHdaU0FBQUFEQWNSSUFKUUFBQU9WeEVnQVFBQUFBWkdsamRHbHZibUZ5ZVNCb1lYTWdkM0p2Ym1jZ2RIbHdaVG9nVUVSR0lHUnZZM1Z0Wlc1MElHbHpJR0ZzY21WaFpIa2daVzVqY25sd2RHVmthVzUyWVd4cFpDQmphR0Z5WVdOMFpYSWdaVzVqYjJScGJtZGpiM1ZzWkc0bmRDQmtaV052YlhCeVpYTnpJSE4wY21WaGJTQUFBQUJlY2hJQUd3QUFBR052ZFd4a2JpZDBJSEJoY25ObElHbHVjSFYwT2lBQUFJUnlFZ0FXQUFBQVpHVmpjbmx3ZEdsdmJpQmxjbkp2Y2pvZ0FBQ2tjaElBRWdBQUFHMXBjM05wYm1jZ2NtVnhkV2x5WldRZ1pHbGpkR2x2Ym1GeWVTQnJaWGtnSWlJQUFNQnlFZ0FoQUFBQTRYSVNBQUVBQUFCcGJuWmhiR2xrSUdsdWJHbHVaU0JwYldGblpUb2dBQUQwY2hJQUZnQUFBR2x1ZG1Gc2FXUWdaRzlqZFcxbGJuUWdiM1YwYkdsdVpUb2dBQUFVY3hJQUdnQUFBR2x1ZG1Gc2FXUWdjM1J5WldGdE9pQTRjeElBRUFBQUFHbHVkbUZzYVdRZ2IySnFaV04wSUhOMGNtVmhiVG9nQUZCekVnQVhBQUFBYVc1MllXeHBaQ0JpZVhSbElHOW1abk5sZEZCRVJpQmtiMk4xYldWdWRDQmtiMlZ6SUc1dmRDQm9ZWFpsSUdGdUlHOTFkR3hwYm1WUVJFWWdaRzlqZFcxbGJuUWdhWE1nYm05MElHVnVZM0o1Y0hSbFpHMXBjM05wYm1jZ2VISmxaaUJsYm5SeWVXOWlhbVZqZENCSlJDQWdibTkwSUdadmRXNWtBTmR6RWdBS0FBQUFuS0FTQUFFQUFBRGhjeElBQ2dBQUFISmxabVZ5Wlc1alpTQmplV05zWlNCM2FYUm9JRzlpYW1WamRDQkpSQ0FBQkhRU0FCOEFBQUNjb0JJQUFRQUFBSEJoWjJVZ2JuVnRZbVZ5SUc1dmRDQm1iM1Z1Wkc1MWJXSmxjbWxqSUhSNWNHVWdZMkZ6ZENCbVlXbHNaV1E2SUVsMEVnQWJBQUFBWkdWeVpXWmxjbVZ1WTJsdVp5QnZZbXBsWTNRZ2NtVmhZMmhsWkNCc2FXMXBkQ3dnYldGNUlHbHVaR2xqWVhSbElHRWdjbVZtWlhKbGJtTmxJR041WTJ4bFpHVmpiMlJwYm1jZ2RHVjRkQ0J6ZEhKcGJtY2dabUZwYkdWa1ptRnBiR1ZrSUhCaGNuTnBibWNnWTNKdmMzTWdjbVZtWlhKbGJtTmxJSFJoWW14bE9pQUF5WFFTQUNZQUFBQnBiblpoYkdsa0lHbHVaR2x5WldOMElHOWlhbVZqZENCaGRDQmllWFJsSUc5bVpuTmxkQ0FBK0hRU0FDY0FBQUJtYjNWdVpDQnZZbXBsWTNRZ1NVUWdaRzlsY3lCdWIzUWdiV0YwWTJnZ1pYaHdaV04wWldRZ2IySnFaV04wSUVsRWMzbHVkR0Y0SUdWeWNtOXlJR2x1SUdOdmJuUmxiblFnYzNSeVpXRnRPaUFBQUFCWmRSSUFJQUFBQUdaaGFXeGxaQ0J3WVhKemFXNW5JRlJ2Vlc1cFkyOWtaU0JEVFdGd09pQUFoSFVTQUI4QUFBQmpiMjUyWlhKMGFXNW5JR2x1ZEdWblpYSTZJS3gxRWdBVUFBQUFkVzV6ZFhCd2IzSjBaV1FnYzJWamRYSnBkSGtnYUdGdVpHeGxjbVJsWTI5a2FXNW5JRUZUUTBsSk9EVWdabUZwYkdWa09pQUFBQURrZFJJQUdRQUFBRUZ6WTJscE9EVjFibVY0Y0dWamRHVmtJR1Z1WkNCdlppQnBibkIxZEdsdWRtRnNhV1FnWTI5dWRHVnVkQ0J6ZEhKbFlXMXBiblpoYkdsa0lHWnBiR1VnYUdWaFpHVnlhVzUyWVd4cFpDQm1hV3hsSUhSeVlXbHNaWEpwYm5aaGJHbGtJR055YjNOeklISmxabVZ5Wlc1alpTQjBZV0pzWlVWdVpFOW1TVzV3ZFhSSmJuWmhiR2xrUTI5dWRHVnVkRk4wY21WaGJVbHVkbUZzYVdSR2FXeGxTR1ZoWkdWeVNXNTJZV3hwWkZSeVlXbHNaWEpKYm5aaGJHbGtXSEpsWmxOMFlYSjBVSEpsZGxOMFlYSjBVM1J5WldGdFUzUmhjblJwYm5aaGJHbGtJSE4wWVhKMElIWmhiSFZsYVc1MllXeHBaQ0J6ZEdGeWRDQjJZV3gxWlNCcGJpQlFjbVYySUdacFpXeGthVzUyWVd4cFpDQnpkR0Z5ZENCMllXeDFaU0J2WmlCWVVtVm1VM1J0TDNKMWMzUmpMelppTURCaVl6TTRPREF4T1RnMk1EQXhNekJsTVdObU5qSmlPR1k0WVRrek5EazBORGc0WTJNdmJHbGljbUZ5ZVM5aGJHeHZZeTl6Y21NdmRtVmpMMjF2WkM1eWN3QXpkeElBVEFBQUFLc0hBQUFOQUFBQXlLb1VBRW9BQUFBekF3QUFJUUFBQUM5b2IyMWxMM0oxYm01bGNpOHVZMkZ5WjI4dmNtVm5hWE4wY25rdmMzSmpMMmx1WkdWNExtTnlZWFJsY3k1cGJ5MHhPVFE1WTJZNFl6WmlOV0kxTlRkbUwybHVaR1Y0YldGd0xUSXVPUzR3TDNOeVl5OXRZWEF2WTI5eVpTNXljMmx1WkdWNElHNXZkQ0JtYjNWdVpBQ2dkeElBWUFBQUFFc0FBQUFLQUFBQW9IY1NBR0FBQUFBV0FnQUFEUUFBQUtCM0VnQmdBQUFBVHdFQUFCWUFBQUNnZHhJQVlBQUFBRnNCQUFBNEFBQUFMMmh2YldVdmNuVnVibVZ5THk1allYSm5ieTl5WldkcGMzUnllUzl6Y21NdmFXNWtaWGd1WTNKaGRHVnpMbWx2TFRFNU5EbGpaamhqTm1JMVlqVTFOMll2YldsdWFYcGZiM2hwWkdVdE1DNDRMamd2YzNKakwybHVabXhoZEdVdlkyOXlaUzV5Y3dCUWVCSUFad0FBQUJFQ0FBQW9BQUFBVUhnU0FHY0FBQUNHQWdBQUhRQUFBRkI0RWdCbkFBQUFGZ01BQUJnQUFBQlFlQklBWndBQUFCY0RBQUFZQUFBQVVIZ1NBR2NBQUFBWUF3QUFHQUFBQUZCNEVnQm5BQUFBR1FNQUFCZ0FBQUFBQUFDQUFFQUF3QUFnQUtBQVlBRGdBQkFBa0FCUUFOQUFNQUN3QUhBQThBQUlBSWdBU0FESUFDZ0FxQUJvQU9nQUdBQ1lBRmdBMkFBNEFMZ0FlQUQ0QUFRQWhBQkVBTVFBSkFDa0FHUUE1QUFVQUpRQVZBRFVBRFFBdEFCMEFQUUFEQUNNQUV3QXpBQXNBS3dBYkFEc0FCd0FuQUJjQU53QVBBQzhBSHdBL0FBQ0FJSUFRZ0RDQUNJQW9nQmlBT0lBRWdDU0FGSUEwZ0F5QUxJQWNnRHlBQW9BaWdCS0FNb0FLZ0NxQUdvQTZnQWFBSm9BV2dEYUFEb0F1Z0I2QVBvQUJnQ0dBRVlBeGdBbUFLWUFaZ0RtQUJZQWxnQldBTllBTmdDMkFIWUE5Z0FPQUk0QVRnRE9BQzRBcmdCdUFPNEFIZ0NlQUY0QTNnQStBTDRBZmdEK0FBRUFnUUJCQU1FQUlRQ2hBR0VBNFFBUkFKRUFVUURSQURFQXNRQnhBUEVBQ1FDSkFFa0F5UUFwQUtrQWFRRHBBQmtBbVFCWkFOa0FPUUM1QUhrQStRQUZBSVVBUlFERkFDVUFwUUJsQU9VQUZRQ1ZBRlVBMVFBMUFMVUFkUUQxQUEwQWpRQk5BTTBBTFFDdEFHMEE3UUFkQUowQVhRRGRBRDBBdlFCOUFQMEFBd0NEQUVNQXd3QWpBS01BWXdEakFCTUFrd0JUQU5NQU13Q3pBSE1BOHdBTEFJc0FTd0RMQUNzQXF3QnJBT3NBR3dDYkFGc0Eyd0E3QUxzQWV3RDdBQWNBaHdCSEFNY0FKd0NuQUdjQTV3QVhBSmNBVndEWEFEY0F0d0IzQVBjQUR3Q1BBRThBendBdkFLOEFid0R2QUI4QW53QmZBTjhBUHdDL0FIOEEvNEFBZ0lDQVFJREFnQ0NBb0lCZ2dPQ0FFSUNRZ0ZDQTBJQXdnTENBY0lEd2dBaUFpSUJJZ01pQUtJQ29nR2lBNklBWWdKaUFXSURZZ0RpQXVJQjRnUGlBQklDRWdFU0F4SUFrZ0tTQVpJRGtnQlNBbElCVWdOU0FOSUMwZ0hTQTlJQU1nSXlBVElETWdDeUFySUJzZ095QUhJQ2NnRnlBM0lBOGdMeUFmSUQ4Z0FLQWdvQkNnTUtBSW9DaWdHS0E0b0FTZ0pLQVVvRFNnREtBc29CeWdQS0FDb0NLZ0VxQXlvQXFnS3FBYW9EcWdCcUFtb0JhZ05xQU9vQzZnSHFBK29BR2dJYUFSb0RHZ0NhQXBvQm1nT2FBRm9DV2dGYUExb0EyZ0xhQWRvRDJnQTZBam9CT2dNNkFMb0N1Z0c2QTdvQWVnSjZBWG9EZWdENkF2b0IrZ1A2QUFZQ0JnRUdBd1lBaGdLR0FZWURoZ0JHQWtZQlJnTkdBTVlDeGdIR0E4WUFKZ0ltQVNZREpnQ21BcVlCcGdPbUFHWUNaZ0ZtQTJZQTVnTG1BZVlENWdBV0FoWUJGZ01XQUpZQ2xnR1dBNVlBVmdKV0FWWURWZ0RXQXRZQjFnUFdBRFlDTmdFMkF6WUF0Z0syQWJZRHRnQjJBbllCZGdOMkFQWUM5Z0gyQS9ZQURnSU9BUTRERGdDT0FvNEJqZ09PQUU0Q1RnRk9BMDRBemdMT0FjNER6Z0F1QWk0QkxnTXVBSzRDcmdHdUE2NEFiZ0p1QVc0RGJnRHVBdTRCN2dQdUFCNENIZ0VlQXg0QW5nS2VBWjREbmdCZUFsNEJYZ05lQU40QzNnSGVBOTRBUGdJK0FUNERQZ0MrQXI0QnZnTytBSDRDZmdGK0EzNEEvZ0wrQWY0RC9VSGdTQUdjQUFBQWlCQUFBRkFBQUFGQjRFZ0JuQUFBQUl3UUFBQklBQUFCaGMzTmxjblJwYjI0Z1ptRnBiR1ZrT2lCdmRYUmZjRzl6SUNzZ015QThJRzkxZEY5emJHbGpaUzVzWlc0b0tRQlFlQklBWndBQUFEWUVBQUFOQUFBQVlYTnpaWEowYVc5dUlHWmhhV3hsWkRvZ0tITnZkWEpqWlY5d2IzTWdLeUF6S1NBbUlHOTFkRjlpZFdaZmMybDZaVjl0WVhOcklEd2diM1YwWDNOc2FXTmxMbXhsYmlncFVIZ1NBR2NBQUFBM0JBQUFEUUFBQUZCNEVnQm5BQUFBT1FRQUFDSUFBQUJRZUJJQVp3QUFBRG9FQUFBbUFBQUFVSGdTQUdjQUFBQTdCQUFBSmdBQUFGQjRFZ0JuQUFBQVJBUUFBQ01BQUFCUWVCSUFad0FBQUVRRUFBQU9BQUFBWVhOelpYSjBhVzl1SUdaaGFXeGxaRG9nYjNWMFgzQnZjeUFySURFZ1BDQnZkWFJmYzJ4cFkyVXViR1Z1S0NrQVVIZ1NBR2NBQUFCR0JBQUFEUUFBQUdGemMyVnlkR2x2YmlCbVlXbHNaV1E2SUNoemIzVnlZMlZmY0c5eklDc2dNU2tnSmlCdmRYUmZZblZtWDNOcGVtVmZiV0Z6YXlBOElHOTFkRjl6YkdsalpTNXNaVzRvS1ZCNEVnQm5BQUFBUndRQUFBMEFBQUJRZUJJQVp3QUFBRWdFQUFBaUFBQUFVSGdTQUdjQUFBQklCQUFBRFFBQUFHRnpjMlZ5ZEdsdmJpQm1ZV2xzWldRNklHOTFkRjl3YjNNZ0t5QXlJRHdnYjNWMFgzTnNhV05sTG14bGJpZ3BBRkI0RWdCbkFBQUFUQVFBQUEwQUFBQmhjM05sY25ScGIyNGdabUZwYkdWa09pQW9jMjkxY21ObFgzQnZjeUFySURJcElDWWdiM1YwWDJKMVpsOXphWHBsWDIxaGMyc2dQQ0J2ZFhSZmMyeHBZMlV1YkdWdUtDbFFlQklBWndBQUFFMEVBQUFOQUFBQVVIZ1NBR2NBQUFCT0JBQUFJZ0FBQUZCNEVnQm5BQUFBVGdRQUFBMEFBQUJRZUJJQVp3QUFBRThFQUFBbUFBQUFVSGdTQUdjQUFBQlBCQUFBRFFBQUFGQjRFZ0JuQUFBQUxBUUFBQmNBUWNqL3lRQUxwZ2dCQVFFQkFnSUNBZ01EQXdNRUJBUUVCUVVGQlFBQUFBQURBQVFBQlFBR0FBY0FDQUFKQUFvQUN3QU5BQThBRVFBVEFCY0FHd0FmQUNNQUt3QXpBRHNBUXdCVEFHTUFjd0NEQUtNQXd3RGpBQUlCQUFJQUFnQUNBUUFDQUFNQUJBQUZBQWNBQ1FBTkFCRUFHUUFoQURFQVFRQmhBSUVBd1FBQkFZRUJBUUlCQXdFRUFRWUJDQUVNQVJBQkdBRWdBVEFCUUFGZ1VIZ1NBR2NBQUFCZUJnQUFLQUFBQUZCNEVnQm5BQUFBWHdZQUFCb0FBQUJRZUJJQVp3QUFBR29HQUFBbEFBQUFVSGdTQUdjQUFBQnJCZ0FBTmdBQUFGQjRFZ0JuQUFBQWF3WUFBQm9BQUFCUWVCSUFad0FBQUhNSEFBQStBQUFBVUhnU0FHY0FBQURaQndBQVRRQUFBQzlvYjIxbEwzSjFibTVsY2k4dVkyRnlaMjh2Y21WbmFYTjBjbmt2YzNKakwybHVaR1Y0TG1OeVlYUmxjeTVwYnkweE9UUTVZMlk0WXpaaU5XSTFOVGRtTDIxcGJtbDZYMjk0YVdSbExUQXVPQzQ0TDNOeVl5OXBibVpzWVhSbEwyOTFkSEIxZEY5aWRXWm1aWEl1Y25QTWdCSUFjQUFBQUNBQUFBQUpBQUFBeklBU0FIQUFBQUFxQUFBQUV3QUFBTXlBRWdCd0FBQUFLZ0FBQURnQUFBRE1nQklBY0FBQUFGVUFBQUFoQUFBQUFRRUJBQVFBRUJFU0FBZ0hDUVlLQlFzRURBTU5BZzRCRHdBQUFGQjRFZ0JuQUFBQVBBWUFBQzBBQUFCUWVCSUFad0FBQUR3R0FBQVpBQUFBVUhnU0FHY0FBQUNFQmdBQUlBQUFBR1JsYzNRZ2FYTWdiM1YwSUc5bUlHSnZkVzVrY3dBQUFNaUJFZ0FWQUFBQUwzSjFjM1JqTHpaaU1EQmlZek00T0RBeE9UZzJNREF4TXpCbE1XTm1OakppT0dZNFlUa3pORGswTkRnNFkyTXZiR2xpY21GeWVTOWpiM0psTDNOeVl5OXpiR2xqWlM5cGJtUmxlQzV5Y3dEb2dSSUFUd0FBQUZNREFBQXlBQUFBTDJodmJXVXZjblZ1Ym1WeUx5NWpZWEpuYnk5eVpXZHBjM1J5ZVM5emNtTXZhVzVrWlhndVkzSmhkR1Z6TG1sdkxURTVORGxqWmpoak5tSTFZalUxTjJZdmJXbHVhWHBmYjNocFpHVXRNQzQ0TGpndmMzSmpMMmx1Wm14aGRHVXZjM1J5WldGdExuSnpBQUFBU0lJU0FHa0FBQUJDQVFBQUhBQUFBRWlDRWdCcEFBQUFkZ0VBQURBQUFBQXZhRzl0WlM5eWRXNXVaWEl2TG1OaGNtZHZMM0psWjJsemRISjVMM055WXk5cGJtUmxlQzVqY21GMFpYTXVhVzh0TVRrME9XTm1PR00yWWpWaU5UVTNaaTl1YjIwdE9DNHdMakF2YzNKakwzUnlZV2wwY3k1eWN3QUFBTlNDRWdCWkFBQUEwQUFBQUFvQUFBQXZjblZ6ZEdNdk5tSXdNR0pqTXpnNE1ERTVPRFl3TURFek1HVXhZMlkyTW1JNFpqaGhPVE0wT1RRME9EaGpZeTlzYVdKeVlYSjVMMk52Y21VdmMzSmpMM04wY2k5d1lYUjBaWEp1TG5KekFFQ0RFZ0JQQUFBQTRnVUFBQlFBQUFCQWd4SUFUd0FBQU9JRkFBQWhBQUFBUUlNU0FFOEFBQURXQlFBQUlRQUFBRUlCQUFBVUFBQUFCQUFBQUVNQkFBQUFBQUFBQ0FBQUFBUUFBQUJZQUFBQVJBRUFBQlFBQUFBRUFBQUFSUUVBUWZpSHlnQUw2Z1lCQUFBQVJnRUFBRlZ1YVcxd2JHVnRaVzUwWldSUFltcGxZM1JVZVhCbFpYaHdaV04wWldSbWIzVnVaRVJwWTNSVWVYQmxRV3h5WldGa2VVVnVZM0o1Y0hSbFpFTm9ZWEpoWTNSbGNrVnVZMjlrYVc1blJHVmpiMjF3Y21WemMxQmhjbk5sUkdWamNubHdkR2x2YmtScFkzUkxaWGxKYm5aaGJHbGtTVzVzYVc1bFNXMWhaMlZKYm5aaGJHbGtUM1YwYkdsdVpVbHVkbUZzYVdSVGRISmxZVzFKYm5aaGJHbGtUMkpxWldOMFUzUnlaV0Z0U1c1MllXeHBaRTltWm5ObGRFbFBUbTlQZFhSc2FXNWxUbTkwUlc1amNubHdkR1ZrVFdsemMybHVaMWh5WldaRmJuUnllVTlpYW1WamRFNXZkRVp2ZFc1a1VtVm1aWEpsYm1ObFEzbGpiR1ZRWVdkbFRuVnRZbVZ5VG05MFJtOTFibVJPZFcxbGNtbGpRMkZ6ZEZKbFptVnlaVzVqWlV4cGJXbDBWR1Y0ZEZOMGNtbHVaMFJsWTI5a1pWaHlaV1pKYm1ScGNtVmpkRTlpYW1WamRHOW1abk5sZEU5aWFtVmpkRWxrVFdsemJXRjBZMmhUZVc1MFlYaFViMVZ1YVdOdlpHVkRUV0Z3VkhKNVJuSnZiVWx1ZEZWdWMzVndjRzl5ZEdWa1UyVmpkWEpwZEhsSVlXNWtiR1Z5Um05eWJXRjBhVzVuSUdWeWNtOXlPaUNYaFJJQUVRQUFBRWxQSUdWeWNtOXlPaUFBQUxDRkVnQUtBQUFBVUVSR0lHVnljbTl5T2lBQXhJVVNBQXNBQUFCbGVIQnNhV05wZENCd1lXNXBZd0FBSElNVUFGNEFBQUNhQUFBQVZnQUFBQnlERkFCZUFBQUFud0FBQUZFQUFBQWNneFFBWGdBQUFLb0FBQUJSQUFBQWJXbHpjMmx1WnlCdlltcGxZM1FnY21WbVpYSmxibU5sSElNVUFGNEFBQUN4QUFBQU5BQUFBQnlERkFCZUFBQUE0UUFBQUJrQUFBQWNneFFBWGdBQUFPRUFBQUF1QUFBQUhJTVVBRjRBQUFEaEFBQUFRd0FBQUJ5REZBQmVBQUFBNFFBQUFGZ0FBQUFjZ3hRQVhnQUFBT0FBQUFBdUFBQUFISU1VQUY0QUFBRHJBQUFBR1FBQUFCeURGQUJlQUFBQTZ3QUFBQzRBQUFBY2d4UUFYZ0FBQU9zQUFBQkRBQUFBSElNVUFGNEFBQURxQUFBQUxnQUFBRzVoYldVY2d4UUFYZ0FBQUI0QkFBQnFBQUFBWkdWeVpXWUFBQUFjZ3hRQVhnQUFBQjRCQUFCUEFBQUFVM1ZpZEhsd1pWUjVjR1V3Vkhsd1pUTUFBQUJIQVFBQVlBQUFBQWdBQUFCSUFRQUFTUUVBQUVvQkFBQkxBUUFBVEFFQUFGZ0FBQUFJQUFBQVRRRUFBRTRCQUFCS0FRQUFUd0VBQUZBQkFBQndBQUFBQ0FBQUFGRUJBQUJTQVFBQVV3RUFBRlFCQUVIa2tNb0FDL1VGbTM4VEFBVUFBQUNnZnhNQUJnQUFBS1ovRXdBSUFBQUFybjhUQUFvQUFBQzRmeE1BQmdBQUFMNS9Fd0FIQUFBQXhYOFRBQWtBQUFBbGdSTUFDd0FBQU5oL0V3QUpBQUFBNFg4VEFBb0FBQURyZnhNQUNBQUFBUE4vRXdBRUFBQUE5MzhUQUFVQUFBRDhmeE1BQmdBQUFBS0FFd0FHQUFBQUNJQVRBQVVBQUFBTmdCTUFCQUFBQUJHQUV3QURBQUFBRklBVEFBTUFBQUFYZ0JNQUJRQUFBQnlBRXdBRUFBQUFJSUFUQUFRQUFBQWtnQk1BQXdBQUFDZUFFd0FGQUFBQUxJQVRBQVVBQUFBeGdCTUFCQUFBQURXQUV3QUZBQUFBT29BVEFBa0FBQUJEZ0JNQUJBQUFBRWVBRXdBRkFBQUFUSUFUQUFjQUFBQlRnQk1BQ0FBQUFGdUFFd0FDQUFBQVhZQVRBQUVBQUFCZWdCTUFBUUFBQUYrQUV3QUJBQUFBWUlBVEFBRUFBQUJoZ0JNQUFRQUFBR0tBRXdBQkFBQUFZNEFUQUFFQUFBQmtnQk1BQVFBQUFHV0FFd0FCQUFBQVpvQVRBQUVBQUFCbmdCTUFBUUFBQUdpQUV3QUJBQUFBYVlBVEFBRUFBQUJxZ0JNQUFRQUFBR3VBRXdBQkFBQUFiSUFUQUFFQUFBQnRnQk1BQVFBQUFHNkFFd0FCQUFBQWI0QVRBQUVBQUFCd2dCTUFBUUFBQUhHQUV3QUJBQUFBY29BVEFBRUFBQUJ6Z0JNQUFRQUFBSFNBRXdBQkFBQUFkWUFUQUFFQUFBQjJnQk1BQVFBQUFIZUFFd0FMQUFBQWdvQVRBQWtBQUFDTGdCTUFEQUFBQUplQUV3QUxBQUFBb29BVEFBb0FBQUR1Z1JNQUJRQUFBTFdBRXdBQkFBQUF0b0FUQUFFQUFBQzNnQk1BQVFBQUFMaUFFd0FCQUFBQXVZQVRBQUVBQUFDNmdCTUFBUUFBQUx1QUV3QUJBQUFBdklBVEFBRUFBQUM5Z0JNQUFRQUFBTDZBRXdBQkFBQUF2NEFUQUFFQUFBREFnQk1BQVFBQUFNR0FFd0FCQUFBQXdvQVRBQUVBQUFERGdCTUFBUUFBQU1TQUV3QUJBQUFBeFlBVEFBRUFBQURHZ0JNQUFRQUFBTWVBRXdBQkFBQUF5SUFUQUFFQUFBREpnQk1BQVFBQUFNcUFFd0FCQUFBQXk0QVRBQUVBQUFETWdCTUFBUUFBQU0yQUV3QUJBQUFBem9BVEFBRUFBQURQZ0JNQUNRQUFBTmlBRXdBREFBQUEyNEFUQUFvQUFBRGxnQk1BQ2dCQjVKYktBQXY5QjB5RkV3QUpBQUFBK29ZVEFBVUFBQUFlaFJNQUNBQUFBRnlHRXdBR0FBQUF5WVlUQUFZQUFBQ3doUk1BQ1FBQUFBK0RFd0FKQUFBQTNJSVRBQVlBQUFCemd4TUFCZ0FBQU5PREV3QUxBQUFBaW9RVEFBa0FBQUNMZ3hNQUJnQUFBRnlERXdBRkFBQUE2NE1UQUFnQUFBQ2RnaE1BQmdBQUFGV0ZFd0FHQUFBQS80SVRBQXNBQUFDVGhCTUFDUUFBQUttREV3QUdBQUFBdTRVVEFBWUFBQUIwaEJNQUN3QUFBSUdGRXdBSkFBQUFTWVlUQUFZQUFBQnVoUk1BQmdBQUFKNkdFd0FHQUFBQVBvWVRBQXNBQUFCVWh4TUFDUUFBQU0rR0V3QUdBQUFBVG9RVEFBWUFBQUNxaGhNQUJnQUFBTWlERXdBTEFBQUFYWWNUQUFrQUFBQnVnUk1BQmdBQUFKaUdFd0FHQUFBQStZQVRBQVFBQUFEOWdCTUFDQUFBQUJhQkV3QUhBQUFBbElFVEFBWUFBQUNMZ1JNQUNRQUFBSXFDRXdBS0FBQUF6WVFUQUFvQUFBQkdneE1BQ1FBQUFBaUdFd0FKQUFBQTg0RVRBQVVBQUFBYmdoTUFDQUFBQUdhSEV3QUlBQUFBUzRJVEFBSUFBQUJlZ2hNQUJnQUFBQTdpRXdBSUFBQUF1NFFUQUFrQUFBQTFoaE1BQ1FBQUFBK0ZFd0FNQUFBQURZRVRBQU1BQUFDNWhSTUFBZ0FBQUZxRUV3QUxBQUFBNTRRVEFBa0FBQUI1NHhNQUJ3QUFBTXpoRXdBQ0FBQUFmK1FUQUFnQUFBQk5naE1BQ3dBQUFHYUNFd0FNQUFBQVlPRVRBQVVBQUFCeWdoTUFBZ0FBQUlLQ0V3QUdBQUFBNG9FVEFBd0FBQUR2Z0JNQUNnQUFBRXFIRXdBS0FBQUFzSVlUQUFjQUFBQVFnUk1BQmdBQUFIVGlFd0FMQUFBQW00VVRBQVVBQUFBOGdSTUFEUUFBQU1HQkV3QU9BQUFBejRFVEFBZ0FBQUNiZnhNQUJRQUFBRHFFRXdBR0FBQUE3WVlUQUFZQUFBRC9oaE1BQmdBQUFHU0NFd0FDQUFBQWlJSVRBQUlBQUFCb2dSTUFCZ0FBQUVXQ0V3QUdBQUFBTUlFVEFBd0FBQUMwZ1JNQURRQUFBS3lBRXdBSkFBQUF6bjhUQUFvQUFBREZnaE1BQmdBQUFLK0RFd0FIQUFBQVpZUVRBQWtBQUFDOGdoTUFDUUFBQUFXQkV3QUlBQUFBSFlFVEFBZ0FBQUJKZ1JNQURRQUFBRmFCRXdBT0FBQUFaSUVUQUFJQUFBQm1nUk1BQWdBQUFIU0JFd0FKQUFBQWZZRVRBQTRBQUFDYWdSTUFEZ0FBQUtpQkV3QU1BQUFBMTRFVEFBc0FBQURSZ2hNQUN3QUFBSCtFRXdBTEFBQUFSb1VUQUFZQUFBQXNneE1BQ1FBQUFQQ0VFd0FHQUFBQXRZUVRBQVlBQUFBdGh4TUFDd0FBQUpTQ0V3QUpBQUFBRzRZVEFBWUFBQUJvaFJNQUJnQUFBSXFGRXdBTEFBQUFHT1VUQUFVQUFBQTBoQk1BQmdBQUFCK0RFd0FHQUFBQTRvSVRBQXNBQUFDVmhSTUFCZ0FBQUhTQ0V3QUlBQUFBK0lFVEFBb0FBQUFDZ2hNQUJRQUFBQWVDRXdBR0FBQUFEWUlUQUFVQUFBQVNnaE1BQ1FBQUFDT0NFd0FFQUFBQUo0SVRBQWNBQUFBdWdoTUFEQUFBQURxQ0V3QUdBQUFBUUlJVEFBVUFRZVNneWdBTDNRR2JmeE1BQlFBQUFIWDlFZ0FMQUFBQUVyb1NBQkVBQUFBKzV4SUFEQUFBQUZYMUVnQU9BQUFBYnZVU0FBNEFBQUIwMXhJQURnQUFBT0t4RWdBS0FBQUFwem9UQUJFQUFBQlhPeE1BRWdBQUFHRm9Fd0FPQUFBQUlqY1RBQTRBQUFEM2Z4TUFCUUFBQVB4L0V3QUdBQUFBQW9BVEFBWUFBQUFGZ1JNQUNBQUFBSU42RXdBTUFBQUFyVGNUQUFzQUFBRDZhQk1BQ3dBQUFDSmlFd0FOQUFBQWJ3SVRBQXdBQUFCUEFCTUFEQUFBQUVwV0V3QUxBQUFBZTFFVEFBMEFBQUFCK1JJQURRQUFBT1V1RXdBTUFBQUFOWUFUQUFVQUFBQTZnQk1BQ1FCQnpLTEtBQXNGVUdJVEFCTUFRZHlpeWdBTEJhdEVFd0FOQUVHRW84b0FDd1dIdHhJQUNBQkJuS1BLQUF0RmI0WVRBQW9BQUFBdWhoTUFCd0FBQU51RkV3QU5BQUFBTURjVEFBa0FBQUNiWVJNQURBQUFBT1gvRWdBTEFBQUFDVkVUQUF3QUFBRGlOeE1BQ0FBQUFEaHBFd0FKQUVHVXBNb0FDeTFpL2hJQUFnQUFBR1NCRXdBQ0FBQUFab0VUQUFJQUFBQmsvaElBQXdBQUFHZitFZ0FEQUFBQWFUb1RBQkVBUWN5a3lnQUxqUUlWT3hNQUVnQUFBQ2EwRWdBUEFBQUFPeEFUQUE0QUFBQW11UklBQ2dBQUFKK3lFZ0FHQUFBQURiTVNBQVlBQUFCSnRCSUFCZ0FBQURlMUVnQUdBQUFBYjdjU0FBWUFBQUF4dUJJQUJnQUFBREM1RWdBR0FBQUFBTG9TQUFZQUFBQm11eElBQmdBQUFPYTdFZ0FHQUFBQTlid1NBQVlBQUFCOHZSSUFCZ0FBQU5DOUVnQUdBQUFBVWI0U0FBWUFBQUNTd0JJQUJnQUFBRGpCRWdBR0FBQUFUOEVTQUFZQUFBRFh3UklBQmdBQUFGYkVFZ0FHQUFBQVY4VVNBQVlBQUFCaHh4SUFCZ0FBQU9uSEVnQUdBQUFBT2NnU0FBWUFBQUJ1eUJJQUJnQUFBQi9KRWdBR0FBQUFQY29TQUFZQUFBRGY2aElBRFFBQUFEazNFd0FKQUFBQXIwd1RBQVlBQUFEb3hCSUFDZ0JCN0tiS0FBc053ZDBTQUFrQUFBQks1eElBREFCQm5LZktBQXZGQVJLeEVnQUxBQUFBUDdJU0FBc0FBQUM5c1JJQUVBQUFBQjZ5RWdBT0FBQUFwYklTQUFzQUFBQ1ZzaElBQ2dBQUFFQ3pFZ0FOQUFBQWVMVVNBQXNBQUFCV3RoSUFDd0FBQVArMUVnQVFBQUFBTWJZU0FBNEFBQUJCdWhJQUN3QUFBTnk2RWdBTEFBQUFYN29TQUJBQUFBQ2d1aElBRGdBQUFGZStFZ0FMQUFBQWFiNFNBQXNBQUFCd3Z4SUFDd0FBQUFLL0VnQVFBQUFBVHI4U0FBNEFBQURId0JJQUN3QUFBSERGRWdBTEFBQUFPTVlTQUFzQUFBQ2V4UklBRUFBQUFDSEdFZ0FPQUVIc3FNb0FDelU1K1JJQURRQUFBRUlDRXdBTUFBQUE4bUVUQUEwQUFBQXpWaE1BQ3dBQUFPYjRFZ0FOQUFBQVlGRVRBQTBBQUFCeXd4SUFDd0JCcktuS0FBc05KZWNTQUF3QUFBRFFhQk1BQ3dCQnhLbktBQXNGNUxRU0FBMEFRZFNweWdBTEZTbXpFZ0FLQUFBQXJ6Z1RBQWtBQUFBMkFCTUFEQUJCOUtuS0FBc1ZiT3NTQUEwQUFBQVpQUk1BRGdBQUFIVElFZ0FMQUVHVXFzb0FDd1U0OVJJQURnQkJyS3JLQUFzRjFNUVNBQW9BUWJ5cXlnQUxQY3d1RXdBTUFBQUFhbm9UQUF3QUFBQ0R5UklBQ3dBQUFBdXhFZ0FIQUFBQWg4QVNBQXNBQUFCOFJCTUFFUUFBQUlNM0V3QUxBQUFBY2IwU0FBc0FRYXlyeWdBTEJXMnpFZ0FNQUVIY3E4b0FDeFZpdmhJQUJ3QUFBSkQrRWdBS0FBQUFZeEFUQUE0QVFaU3N5Z0FMQlZmOUVnQVBBRUdrck1vQUN3V2N5QklBRGdCQnRLektBQXRGajRjVEFBc0FBQUNsaFJNQUN3QUFBQ2VFRXdBTkFBQUFvZ0lUQUF3QUFBQ0NBQk1BREFBQUFIaFdFd0FMQUFBQXMxRVRBQTBBQUFBWUx4TUFEQUFBQUpwNkV3QU1BRUdFcmNvQUN4V0svQklBQ1FBQUFFSk1Fd0FKQUFBQXAyWVRBQWtBUWF5dHlnQUxGVGNZRXdBSkFBQUFZVm9UQUFrQUFBQTU5aElBQ1FCQjdLM0tBQXRWN1NRVEFBa0FBQUJsdnhJQUN3QUFBQU96RWdBS0FBQUFrTDBTQUFzQUFBQks1UklBQ1FBQUFIWXpFd0FKQUFBQXhDb1RBQWtBQUFDMjZ4SUFEUUFBQUVFOUV3QU9BQUFBSTdVU0FBNEFBQUNzd1JJQUNRQkI1TERLQUF2RjNnT2JmeE1BQlFBQUFLQi9Fd0FHQUFBQXBuOFRBQWdBQUFDdWZ4TUFDZ0FBQUxoL0V3QUdBQUFBdm44VEFBY0FBQURGZnhNQUNRQUFBQ1dCRXdBTEFBQUEySDhUQUFrQUFBRGhmeE1BQ2dBQUFPdC9Fd0FJQUFBQTgzOFRBQVFBQUFEM2Z4TUFCUUFBQVB4L0V3QUdBQUFBQW9BVEFBWUFBQUFJZ0JNQUJRQUFBQTJBRXdBRUFBQUFFWUFUQUFNQUFBQVVnQk1BQXdBQUFCZUFFd0FGQUFBQUhJQVRBQVFBQUFBZ2dCTUFCQUFBQUNTQUV3QURBQUFBSjRBVEFBVUFBQUFzZ0JNQUJRQUFBREdBRXdBRUFBQUFOWUFUQUFVQUFBQTZnQk1BQ1FBQUFFT0FFd0FFQUFBQVI0QVRBQVVBQUFCTWdCTUFCd0FBQUZPQUV3QUlBQUFBVzRBVEFBSUFBQUJkZ0JNQUFRQUFBRjZBRXdBQkFBQUFYNEFUQUFFQUFBQmdnQk1BQVFBQUFHR0FFd0FCQUFBQVlvQVRBQUVBQUFCamdCTUFBUUFBQUdTQUV3QUJBQUFBWllBVEFBRUFBQUJtZ0JNQUFRQUFBR2VBRXdBQkFBQUFhSUFUQUFFQUFBQnBnQk1BQVFBQUFHcUFFd0FCQUFBQWE0QVRBQUVBQUFCc2dCTUFBUUFBQUcyQUV3QUJBQUFBYm9BVEFBRUFBQUJ2Z0JNQUFRQUFBSENBRXdBQkFBQUFjWUFUQUFFQUFBQnlnQk1BQVFBQUFIT0FFd0FCQUFBQWRJQVRBQUVBQUFCMWdCTUFBUUFBQUhhQUV3QUJBQUFBZDRBVEFBc0FBQUNDZ0JNQUNRQUFBSXVBRXdBTUFBQUFsNEFUQUFzQUFBQ2lnQk1BQ2dBQUFPNkJFd0FGQUFBQXRZQVRBQUVBQUFDMmdCTUFBUUFBQUxlQUV3QUJBQUFBdUlBVEFBRUFBQUM1Z0JNQUFRQUFBTHFBRXdBQkFBQUF1NEFUQUFFQUFBQzhnQk1BQVFBQUFMMkFFd0FCQUFBQXZvQVRBQUVBQUFDL2dCTUFBUUFBQU1DQUV3QUJBQUFBd1lBVEFBRUFBQURDZ0JNQUFRQUFBTU9BRXdBQkFBQUF4SUFUQUFFQUFBREZnQk1BQVFBQUFNYUFFd0FCQUFBQXg0QVRBQUVBQUFESWdCTUFBUUFBQU1tQUV3QUJBQUFBeW9BVEFBRUFBQURMZ0JNQUFRQUFBTXlBRXdBQkFBQUF6WUFUQUFFQUFBRE9nQk1BQVFBQUFNK0FFd0FKQUFBQTJJQVRBQU1BQUFEYmdCTUFDZ0FBQU9XQUV3QUtBQUFBbElFVEFBWUFBQUNoaHhNQUJBQUFBSlNCRXdBR0FBQUFtb0VUQUE0QUFBQVFnUk1BQmdBQUFLaUJFd0FNQUFBQXo0RVRBQWdBQUFCdWdSTUFCZ0FBQUhTQkV3QUpBQUFBK0lFVEFBb0FBQURYZ1JNQUN3QUFBSG1HRXdBR0FBQUFTWUVUQUEwQUFBQmtnaE1BQWdBQUFKU0JFd0FHQUFBQUNZVVRBQVlBQUFDVWdSTUFCZ0FBQUpTQkV3QUdBQUFBcklBVEFBa0FBQURPZnhNQUNnQUFBRENCRXdBTUFBQUF0SUVUQUEwQUFBQ1VnUk1BQmdBQUFHaUJFd0FHQUFBQVJZSVRBQVlBQUFBQ2doTUFCUUFBQUFpR0V3QUpBQUFBbTRNVEFBWUFBQUJXZ1JNQURnQUFBSWlDRXdBQ0FBQUFsSUVUQUFZQUFBQjloeE1BQmdBQUFMeUNFd0FKQUFBQW0zOFRBQVVBQUFEdmdCTUFDZ0FBQVBtQUV3QUVBQUFBL1lBVEFBZ0FBQUFkZ1JNQUNBQUFBQTJCRXdBREFBQUF4SVFUQUFrQUFBQVdnUk1BQndBQUFCdUNFd0FJQUFBQVJvTVRBQWtBQUFCTmdoTUFDd0FBQUR5QkV3QU5BQUFBU29jVEFBb0FBQUQ4ZnhNQUJnQUFBTTJFRXdBS0FBQUFCNElUQUFZQUFBQ1loaE1BQmdBQUFMdUVFd0FKQUFBQXBZVVRBQXNBQUFBbmhCTUFEUUFBQVBPQkV3QUZBQUFBdVlVVEFBSUFBQUNMZ1JNQUNRQUFBSDJCRXdBT0FBQUFKNElUQUFjQUFBQ1BoeE1BQ3dBQUFHYUNFd0FNQUFBQXdZRVRBQTRBQUFCdmhoTUFDZ0FBQUM2R0V3QUhBQUFBMjRVVEFBMEFBQURpZ1JNQURBQUFBRHFFRXdBR0FBQUFSb1VUQUFZQUFBRFJnaE1BQ3dBQUFPMkdFd0FHQUFBQVRJVVRBQWtBQUFENmhoTUFCUUFBQUV1Q0V3QUNBQUFBSG9VVEFBZ0FBQUR3aEJNQUJnQUFBRnlHRXdBR0FBQUFmNFFUQUFzQUFBQXNneE1BQ1FBQUFCdUdFd0FHQUFBQXRZUVRBQVlBQUFBdGh4TUFDd0FBQUpTQ0V3QUpBQUFBRzRVVEFBTUFBQURKaGhNQUJnQUFBRFNFRXdBR0FBQUFhSVVUQUFZQUFBQ0toUk1BQ3dBQUFQK0dFd0FHQUFBQXNJVVRBQWtBQUFCR2hCTUFDQUFBQUY2Q0V3QUdBQUFBbFlVVEFBWUFBQUFmZ3hNQUJnQUFBT0tDRXdBTEFBQUFENE1UQUFrQUFBRExnaE1BQmdBQUFQMkRFd0FGQUFBQWlvSVRBQW9BQUFCemd4TUFCZ0FBQU55Q0V3QUdBQUFBMDRNVEFBc0FBQUNMZ3hNQUJnQUFBSXFFRXdBSkFBQUFYSU1UQUFVQUFBQnlnaE1BQWdBQUFPdURFd0FJQUFBQVZZVVRBQVlBQUFDZGdoTUFCZ0FBQVArQ0V3QUxBQUFBazRRVEFBa0FBQUM3aFJNQUJnQUFBS21ERXdBR0FBQUFkSVFUQUFzQUFBQ0JoUk1BQ1FBQUFIcUhFd0FEQUFBQVNZWVRBQVlBQUFDZWhoTUFCZ0FBQUc2RkV3QUdBQUFBUG9ZVEFBc0FBQURQaGhNQUJnQUFBRlNIRXdBSkFBQUF4WUlUQUFZQUFBQ0NnaE1BQmdBQUFLcUdFd0FHQUFBQVRvUVRBQVlBQUFESWd4TUFDd0FBQUYySEV3QUpBQUFBN1lJVEFBWUFBQUNnaFJNQUJRQUFBR1dFRXdBSkFBQUFkVzVsZUhCbFkzUmxaQ0JsYm1OdlpHbHVaeUJrbnhJQUZBQUFBQnlERkFCZUFBQUFad0VBQUE0QUFBQkNZWE5sUm05dWRFWnZiblJFWlhOamNtbHdkRzl5Vkhsd1pURlVjblZsVkhsd1pVWnZiblJHYVd4bE1rWnZiblJHYVd4bFpXNWpiMlJwYm1jY2d4UUFYZ0FBQUljQkFBQmJBQUFBUm05dWRFWnBiR1V6Vkhsd1pURkRBQnlERkFCZUFBQUFuUUVBQUVJQUFBQWNneFFBWGdBQUFLSUJBQUF2QUFBQUhJTVVBRjRBQUFDakFRQUFMZ0FBQUJ5REZBQmVBQUFBcEFFQUFFNEFBQUFjZ3hRQVhnQUFBS2tCQUFCS0FBQUFRMmhoY2xObGRBQWNneFFBWGdBQUFDUUNBQUFpQUFBQVFtRnpaVVZ1WTI5a2FXNW5SR2xtWm1WeVpXNWpaWE1BSElNVUFGNEFBQURvQVFBQUtnQUFBQnlERkFCZUFBQUE3d0VBQUZnQUFBQWNneFFBWGdBQUFQQUJBQUJ6QUFBQUlBQUFBQnlERkFCZUFBQUE3UUVBQUdRQUFBQkdiMjUwUVhkbGMyOXRaWFZ1Wlhod1pXTjBaV1FnWlc1MGNua2dhVzRnZFc1cFkyOWtaU0J0WVhBQUFCeURGQUJlQUFBQUFBSUFBRFVBQUFCM2NtOXVaeUIwZVhCbElBRHNvQklBQ3dBQUFCeURGQUJlQUFBQUV3SUFBQ1FBQUFCVWVYQmxSbWx5YzNSRGFHRnlUR0Z6ZEVOb1lYSlhhV1IwYUhNQUhJTVVBRjRBQUFCRkFnQUFEUUFBQUUxcGMzTnBibWRYYVdSMGFCeURGQUJlQUFBQVlRSUFBRVlBQUFBY2d4UUFYZ0FBQUcwQ0FBQXBBQUFBSElNVUFGNEFBQUIxQWdBQVJnQUFBQnlERkFCZUFBQUFjZ0lBQUNZQUFBQWNneFFBWGdBQUFEQUNBQUFVQUFBQVltRmtJRzVoYldVZ0FBQUFtS0VTQUFrQUFBQWNneFFBWGdBQUFITUNBQUJwQUFBQUhJTVVBRjRBQUFEU0FnQUFLZ0FBQUJ5REZBQmVBQUFBMmdJQUFDUUFBQUFjZ3hRQVhnQUFBUGNDQUFBSkFBQUFISU1VQUY0QUFBRG5BZ0FBRkFBQUFHMXBjM05wYm1jZ2RXNXBZMjlrWlNCdFlYQWdZVzVrSUdWdVkyOWthVzVuSElNVUFGNEFBQUJBQXdBQVN3QUFBRzFwYzNOcGJtY2dkMmxrZEdnZ1ptOXlJQUFBTEtJU0FCSUFBQUNjb0JJQUFRQUFBQnlERkFCZUFBQUFYZ01BQUEwQUFBQWNneFFBWGdBQUFISURBQUJMQUFBQVZHOVZibWxqYjJSbFNXUmxiblJwZEhrdFNHNXZkQ0I1WlhRZ2FXMXdiR1Z0Wlc1MFpXUTZJSFZ1YzNWd2NHOXlkR1ZrSUZSdlZXNXBZMjlrWlNCdVlXMWxPaUNEb2hJQU1RQUFBQnlERkFCZUFBQUF2d01BQUJFQUFBQWNneFFBWGdBQUFKd0RBQUJGQUFBQUhJTVVBRjRBQUFDZUF3QUFSZ0FBQUJ5REZBQmVBQUFBc3dNQUFERUFBQUFjZ3hRQVhnQUFBS2dEQUFBZ0FBQUFISU1VQUY0QUFBQ29Bd0FBTlFBQUFCeURGQUJlQUFBQXFBTUFBQmdBQUFCaGMzTmxjblJwYjI0Z1ptRnBiR1ZrT2lCMkxteGxiaWdwSUNVZ01pQTlQU0F3QUFBY2d4UUFYZ0FBQUtZREFBQVJBQUFBZFc1emRYQndiM0owWldRZ1kyMWhjQ0FBQUFCZ294SUFFUUFBQUJ5REZBQmVBQUFBd2dNQUFCQUFBQUJFWlhOalpXNWtZVzUwUm05dWRITkVaWE5qWlc1a1lXNTBJR1p2Ym5SeklISmxjWFZwY21Wa0hJTVVBRjRBQUFETEF3QUFTZ0FBQUJ5REZBQmVBQUFBekFNQUFEUUFBQUJ6YUc5MWJHUWdZbVVnUTBsRUlHUnBZM1FBQUJ5REZBQmVBQUFBekFNQUFFTUFBQUJGYm1OdlpHbHVaeUJ5WlhGMWFYSmxaQ0JwYmlCMGVYQmxNQ0JtYjI1MGN4eURGQUJlQUFBQXpRTUFBRDRBQUFCSlpHVnVkR2wwZVMxV2RXNXpkWEJ3YjNKMFpXUWdaVzVqYjJScGJtY2dBREtrRWdBVkFBQUFISU1VQUY0QUFBRFhBd0FBRlFBQUFCeURGQUJlQUFBQTNBTUFBRWtBQUFBY2d4UUFYZ0FBQU4wREFBQkFBQUFBY21WeGRXbHlaV1FjZ3hRQVhnQUFBT3NEQUFCSUFBQUFiWFZ6ZENCaVpTQmthV04wSElNVUFGNEFBQUR0QXdBQUpnQUFBRVJYQUFBY2d4UUFYZ0FBQVBVREFBQXlBQUFBSElNVUFGNEFBQUQyQXdBQUlBQUFBR2xrSUhOb2IzVnNaQ0JpWlNCdWRXMGNneFFBWGdBQUFQWURBQUF0QUFBQUhJTVVBRjRBQUFEL0F3QUFKQUFBQUdacGNuTjBJSE5vYjNWc1pDQmlaU0J1ZFcwQUhJTVVBRjRBQUFEL0F3QUFNUUFBQUJ5REZBQmVBQUFBQUFRQUFDTUFBQUJzWVhOMElITm9iM1ZzWkNCaVpTQnVkVzBBQUJ5REZBQmVBQUFBQUFRQUFEQUFBQUFjZ3hRQVhnQUFBQUVFQUFBc0FBQUFISU1VQUY0QUFBRGZBd0FBRkFBQUFCeURGQUJlQUFBQUZRUUFBQ2NBQUFCR2RXNWpkR2x2YmxSNWNHVlNZVzVuWlVSdmJXRnBibE5wZW1WQ2FYUnpVR1Z5VTJGdGNHeGxSVzVqYjJSbFJHVmpiMlJsSElNVUFGNEFBQUNhQkFBQUdnQUFBRU13UXpGMGVYQmxJRFFnWm5WdVkzUnBiMjV6SUhOb2IzVnNaQ0JpWlNCemRISmxZVzF6QUFBY2d4UUFYZ0FBQU1RRUFBQWNBQUFBZFc1b1lXNWtiR1ZrSUdaMWJtTjBhVzl1SUhSNWNHVWdES1lTQUJnQUFBQWNneFFBWGdBQUFNZ0VBQUFVQUFBQUhJTVVBRjRBQUFDU0JBQUFFZ0FBQUc1dmRDQmhJRzUxYldKbGNoeURGQUJlQUFBQTBnUUFBQkFBQUFBY2d4UUFYZ0FBQVA0RUFBQWhBQUFBZFc1bGVIQmxZM1JsWkNCemJXRnpheUJ1WVcxbEFBQUFISU1VQUY0QUFBQS9CUUFBR1FBQUFIVnVaWGh3WldOMFpXUWdjMjFoYzJzZ2RIbHdaU0FBQUtDbUVnQVdBQUFBSElNVUFGNEFBQUJGQlFBQUdBQUFBRVY0ZEVkVGRHRjBaUUFBQU5DbUVnQWNneFFBWGdBQUFFa0ZBQUFWQUFBQWRXNWxlSEJsWTNSbFpDQjBlWEJsQUJ5REZBQmVBQUFBU3dVQUFCZ0FBQUFjZ3hRQVhnQUFBR2NGQUFBZkFBQUFISU1VQUY0QUFBQnJCUUFBRkFBQUFFTnZiRzl5VTNCaFkyVUFBQnlERkFCZUFBQUFzQVVBQUMwQUFBQm1hWEp6ZENCaGNtY2diWFZ6ZENCaVpTQmhJRzVoYldVY2d4UUFYZ0FBQUxBRkFBQTdBQUFBVTJWd1lYSmhkR2x2YmtsRFEwSmhjMlZrUTJGc1IzSmhlVU5oYkZKSFFreGhZbEJoZEhSbGNtNUVaWFpwWTJWSGNtRjVSR1YyYVdObFVrZENSR1YyYVdObFEwMVpTMFJsZG1salpVNWpiMnh2Y2w5emNHRmpaU0FBQUFEQnB4SUFEQUFBQUp5Z0VnQUJBQUFBbktBU0FBRUFBQUFjZ3hRQVhnQUFBQkFHQUFBWkFBQUFISU1VQUY0QUFBQUJCZ0FBSmdBQUFITmxZMjl1WkNCaGNtY2diWFZ6ZENCaVpTQmhJR1JwWTNRQUFBQWNneFFBWGdBQUFBRUdBQUEwQUFBQVYyaHBkR1ZRYjJsdWRFSmhZMnRRYjJsdWRBQWNneFFBWGdBQUFQZ0ZBQUFtQUFBQUhJTVVBRjRBQUFENEJRQUFOQUFBQUUxaGRISnBlQUFBSElNVUFGNEFBQUR3QlFBQUpnQUFBQnlERkFCZUFBQUE4QVVBQURRQUFBQWNneFFBWGdBQUFPb0ZBQUE2QUFBQUhJTVVBRjRBQUFEcUJRQUFTd0FBQUJ5REZBQmVBQUFBc3dVQUFESUFBQUJ6WldOdmJtUWdZWEpuSUcxMWMzUWdZbVVnWVNCdVlXMWxBQUFBSElNVUFGNEFBQUN6QlFBQVFBQUFBQnlERkFCZUFBQUF0QVVBQUVvQUFBQjFibVY0Y0dWamRHVmtJR052Ykc5eUlITndZV05sSUc1aGJXVUFISU1VQUY0QUFBQzZCUUFBS2dBQUFCeURGQUJlQUFBQXZnVUFBRDBBQUFBY2d4UUFYZ0FBQUw0RkFBQkxBQUFBVlc1bGVIQmxZM1JsWkNCamIyeHZjaUJ6Y0dGalpTQnVZVzFsQUJ5REZBQmVBQUFBM3dVQUFDb0FBQUFjZ3hRQVhnQUFBTmdGQUFBMkFBQUFISU1VQUY0QUFBRFlCUUFBUkFBQUFCeURGQUJlQUFBQXp3VUFBRFlBQUFBY2d4UUFYZ0FBQU04RkFBQkVBQUFBSElNVUFGNEFBQURIQlFBQU5nQUFBQnlERkFCZUFBQUF4d1VBQUVRQUFBQWNneFFBWGdBQUFNRUZBQUJLQUFBQUhJTVVBRjRBQUFEQkJRQUFXd0FBQUJ5REZBQmVBQUFBNUFVQUFGNEFBQUFjZ3hRQVhnQUFBT0lGQUFCYkFBQUFRV3gwWlhKdVlYUmxJSE53WVdObElITm9iM1ZzWkNCaVpTQnVZVzFsSUc5eUlHRnljbUY1SUJTcUVnQW9BQUFBSElNVUFGNEFBQURpQlFBQUlnQUFBQnlERkFCZUFBQUFGd1lBQUJvQUFBQWNneFFBWGdBQUFCb0dBQUFSQUFBQWJXbHpjMmx1WnlCamIyeHZjbk53WVdObElBQjBxaElBRXdBQUFCeURGQUJlQUFBQXJnVUFBRndBQUFBY2d4UUFYZ0FBQUNvR0FBQXhBQUFBUWxSRlZHTnRRMU5qYzFORFUwTk9jMk56WTI1U1IzSm5WRXBVYWxSalZIZFVlbFJNVkdaVWMxUnRWR1JVUkZRcVozTnlhWEpsWmlwQ0tuY3FRazFEUWtSRFJVMURSRzlZVDJKcVpXTjBBQUFjZ3hRQVhnQUFBRVVIQUFBeUFBQUFISU1VQUY0QUFBQkZCd0FBUUFBQUFGSmxjMjkxY21ObGN3QUFBQnlERkFCZUFBQUFQQWNBQUI0QUFBQWNneFFBWGdBQUFDWUhBQUJLQUFBQUhJTVVBRjRBQUFBbkJ3QUFTZ0FBQUJ5REZBQmVBQUFBS0FjQUFFb0FBQUFjZ3hRQVhnQUFBQ2tIQUFCS0FBQUFISU1VQUY0QUFBQW1Cd0FBSGdBQUFCeURGQUJlQUFBQUpBY0FBQ01BQUFBY2d4UUFYZ0FBQUIwSEFBQXpBQUFBSElNVUFGNEFBQUFlQndBQU13QUFBQnlERkFCZUFBQUFId2NBQURNQUFBQWNneFFBWGdBQUFDQUhBQUF6QUFBQUhJTVVBRjRBQUFBaEJ3QUFNd0FBQUJ5REZBQmVBQUFBSWdjQUFETUFBQUFjZ3hRQVhnQUFBQndIQUFBZUFBQUFISU1VQUY0QUFBQVdCd0FBTXdBQUFCeURGQUJlQUFBQUZ3Y0FBRE1BQUFBY2d4UUFYZ0FBQUJnSEFBQXpBQUFBSElNVUFGNEFBQUFaQndBQU13QUFBQnlERkFCZUFBQUFFd2NBQUI0QUFBQWNneFFBWGdBQUFBb0hBQUF6QUFBQUhJTVVBRjRBQUFBTEJ3QUFNd0FBQUJ5REZBQmVBQUFBREFjQUFETUFBQUFjZ3hRQVhnQUFBQTBIQUFBekFBQUFISU1VQUY0QUFBQU9Cd0FBTXdBQUFCeURGQUJlQUFBQUR3Y0FBRE1BQUFBY2d4UUFYZ0FBQUFrSEFBQWVBQUFBSElNVUFGNEFBQUFIQndBQVVRQUFBQnlERkFCZUFBQUFCd2NBQUhFQUFBQWNneFFBWGdBQUFBY0hBQUFqQUFBQUhJTVVBRjRBQUFBR0J3QUFVUUFBQUJ5REZBQmVBQUFBQmdjQUFIRUFBQUFjZ3hRQVhnQUFBQVlIQUFBakFBQUFISU1VQUY0QUFBQUVCd0FBUkFBQUFCeURGQUJlQUFBQS93WUFBRElBQUFBY2d4UUFYZ0FBQVA4R0FBQkFBQUFBSElNVUFGNEFBQUQwQmdBQUl3QUFBQnlERkFCZUFBQUE0QVlBQURnQUFBQWNneFFBWGdBQUFPRUdBQUE0QUFBQVlYTnpaWEowYVc5dUlHWmhhV3hsWkRvZ2IzQmxjbUYwYVc5dUxtOXdaWEpoYm1SekxteGxiaWdwSUQwOUlESUFISU1VQUY0QUFBRGZCZ0FBRlFBQUFCeURGQUJlQUFBQTBRWUFBRGdBQUFBY2d4UUFYZ0FBQU5JR0FBQTRBQUFBSElNVUFGNEFBQURRQmdBQUZRQUFBQnlERkFCZUFBQUF3UVlBQUV3QUFBQWNneFFBWGdBQUFNSUdBQUJNQUFBQUhJTVVBRjRBQUFEREJnQUFUQUFBQUJ5REZBQmVBQUFBeEFZQUFFd0FBQUFjZ3hRQVhnQUFBTVVHQUFCTUFBQUFISU1VQUY0QUFBREdCZ0FBVEFBQUFHRnpjMlZ5ZEdsdmJpQm1ZV2xzWldRNklHOXdaWEpoZEdsdmJpNXZjR1Z5WVc1a2N5NXNaVzRvS1NBOVBTQTJBQnlERkFCZUFBQUF3QVlBQUJVQUFBQWNneFFBWGdBQUFMMEdBQUE4QUFBQVJtOXVkQnlERkFCZUFBQUFyQVlBQURJQUFBQWNneFFBWGdBQUFLd0dBQUJBQUFBQUhJTVVBRjRBQUFDNUJnQUFRUUFBQUJ5REZBQmVBQUFBcUFZQUFEOEFBQUFjZ3hRQVhnQUFBS1VHQUFCS0FBQUFISU1VQUY0QUFBQ2lCZ0FBUkFBQUFCeURGQUJlQUFBQW53WUFBRWtBQUFBY2d4UUFYZ0FBQUpjR0FBQXRBQUFBZFc1bGVIQmxZM1JsWkNCVWFpQnZjR1Z5WVc1a0lBQUFNSzhTQUJZQUFBQWNneFFBWGdBQUFKc0dBQUFnQUFBQUhJTVVBRjRBQUFCMkJnQUFMUUFBQUJ5REZBQmVBQUFBWXdZQUFESUFBQUFjZ3hRQVhnQUFBR01HQUFCQUFBQUFISU1VQUY0QUFBQmZCZ0FBTWdBQUFCeURGQUJlQUFBQVh3WUFBRUFBQUFBY2d4UUFYZ0FBQUZVR0FBQk9BQUFBSElNVUFGNEFBQUJXQmdBQVRnQUFBQnlERkFCZUFBQUFWd1lBQUU0QUFBQWNneFFBWGdBQUFGZ0dBQUJPQUFBQUhJTVVBRjRBQUFCWkJnQUFUZ0FBQUJ5REZBQmVBQUFBV2dZQUFFNEFBQUFjZ3hRQVhnQUFBRlFHQUFBVkFBQUFDZ0FBQUNDd0VnQUJBQUFBbktBU0FBRUFBQUJRWVhKbGJuUUFBQnlERkFCZUFBQUFYd2tBQUM4QUFBQWNneFFBWGdBQUFGOEpBQUJDQUFBQVRXVmthV0ZDYjNnY2d4UUFYZ0FBQUdVSkFBQktBQUFBSElNVUFGNEFBQUJtQ1FBQUxnQUFBQnlERkFCZUFBQUFaZ2tBQUVFQUFBQWNneFFBWGdBQUFHWUpBQUJVQUFBQUhJTVVBRjRBQUFCbUNRQUFad0FBQUVGeWRFSnZlQUFBSElNVUFGNEFBQUJvQ1FBQUZBQUFBQnlERkFCZUFBQUFhQWtBQUJvQUFBQWNneFFBWGdBQUFHZ0pBQUFnQUFBQUhJTVVBRjRBQUFCb0NRQUFKZ0FBQUVGRllXTjFkR1ZCUlcxaFkzSnZia0ZGYzIxaGJHeEJZV04xZEdWemJXRnNiRUZpY21WMlpXRmpkWFJsUVdKeVpYWmxZM2x5YVd4c2FXTkJZbkpsZG1Wa2IzUmlaV3h2ZDBGaWNtVjJaV2R5WVhabFFXSnlaWFpsYUc5dmEyRmliM1psUVdKeVpYWmxkR2xzWkdWQlkyRnliMjVCWTJseVkyeGxRV05wY21OMWJXWnNaWGhoWTNWMFpVRmphWEpqZFcxbWJHVjRaRzkwWW1Wc2IzZEJZMmx5WTNWdFpteGxlR2R5WVhabFFXTnBjbU4xYldac1pYaG9iMjlyWVdKdmRtVkJZMmx5WTNWdFpteGxlSE50WVd4c1FXTnBjbU4xYldac1pYaDBhV3hrWlVGamRYUmxRV04xZEdWemJXRnNiRUZqZVhKcGJHeHBZMEZrWW14bmNtRjJaVUZrYVdWeVpYTnBjMk41Y21sc2JHbGpRV1JwWlhKbGMybHpiV0ZqY205dVFXUnBaWEpsYzJsemMyMWhiR3hCWkc5MFltVnNiM2RCWkc5MGJXRmpjbTl1UVdkeVlYWmxjMjFoYkd4QmFHOXZhMkZpYjNabFFXbGxZM2x5YVd4c2FXTkJhVzUyWlhKMFpXUmljbVYyWlVGc2NHaGhkRzl1YjNOQmJXOXViM053WVdObFFYSnBibWRoWTNWMFpVRnlhVzVuWW1Wc2IzZEJjbWx1WjNOdFlXeHNRWE50WVd4c1FYUnBiR1JsYzIxaGJHeEJlV0poY20xbGJtbGhia0pqYVhKamJHVkNaRzkwWVdOalpXNTBRbVJ2ZEdKbGJHOTNRbVZqZVhKcGJHeHBZMEpsYm1GeWJXVnVhV0Z1UW1odmIydENiR2x1WldKbGJHOTNRbTF2Ym05emNHRmpaVUp5WlhabGMyMWhiR3hDYzIxaGJHeENkRzl3WW1GeVEyRmhjbTFsYm1saGJrTmhjbTl1UTJGeWIyNXpiV0ZzYkVOalpXUnBiR3hoWVdOMWRHVkRZMlZrYVd4c1lYTnRZV3hzUTJOcGNtTnNaVU5qYVhKamRXMW1iR1Y0UTJSdmRFTmtiM1JoWTJObGJuUkRaV1JwYkd4aGMyMWhiR3hEYUdGaGNtMWxibWxoYmtOb1pXRmlhMmhoYzJsaGJtTjVjbWxzYkdsalEyaGxZM2x5YVd4c2FXTkRhR1ZrWlhOalpXNWtaWEpoWW10b1lYTnBZVzVqZVhKcGJHeHBZME5vWldSbGMyTmxibVJsY21ONWNtbHNiR2xqUTJobFpHbGxjbVZ6YVhOamVYSnBiR3hwWTBOb1pXaGhjbTFsYm1saGJrTm9aV3RvWVd0aGMzTnBZVzVqZVhKcGJHeHBZME5vWlhabGNuUnBZMkZzYzNSeWIydGxZM2x5YVd4c2FXTkRhRzl2YTBOcGNtTjFiV1pzWlhoemJXRnNiRU50YjI1dmMzQmhZMlZEYjJGeWJXVnVhV0Z1UTNOdFlXeHNSRnBFV21OaGNtOXVSR0ZoY20xbGJtbGhia1JoWm5KcFkyRnVSR0poY2tSalpXUnBiR3hoUkdOcGNtTnNaVVJqYVhKamRXMW1iR1Y0WW1Wc2IzZEVaRzkwWVdOalpXNTBSR1J2ZEdKbGJHOTNSR1ZqZVhKcGJHeHBZMFJsYVdOdmNIUnBZMFJsYkhSaFozSmxaV3RFYUc5dmEwUnBaWEpsYzJselJHbGxjbVZ6YVhOQlkzVjBaVVJwWlhKbGMybHpSM0poZG1WRWFXVnlaWE5wYzNOdFlXeHNSR2xuWVcxdFlVUnBaMkZ0YldGbmNtVmxhMFJxWldONWNtbHNiR2xqUkd4cGJtVmlaV3h2ZDBSdGIyNXZjM0JoWTJWRWIzUmhZMk5sYm5SemJXRnNiRVJ6YkdGemFFUnpiV0ZzYkVSMGIzQmlZWEpFZWtSNlkyRnliMjVFZW1WaFltdG9ZWE5wWVc1amVYSnBiR3hwWTBSNlpXTjVjbWxzYkdsalJIcG9aV041Y21sc2JHbGpSV0ZqZFhSbGMyMWhiR3hGWW5KbGRtVkZZMlZrYVd4c1lXSnlaWFpsUldOb1lYSnRaVzVwWVc1RlkybHlZMnhsUldOcGNtTjFiV1pzWlhoaFkzVjBaVVZqYVhKamRXMW1iR1Y0WW1Wc2IzZEZZMmx5WTNWdFpteGxlR1J2ZEdKbGJHOTNSV05wY21OMWJXWnNaWGhuY21GMlpVVmphWEpqZFcxbWJHVjRhRzl2YTJGaWIzWmxSV05wY21OMWJXWnNaWGh6YldGc2JFVmphWEpqZFcxbWJHVjRkR2xzWkdWRlkzbHlhV3hzYVdORlpHSnNaM0poZG1WRlpHbGxjbVZ6YVhOemJXRnNiRVZrYjNSRlpHOTBZbVZzYjNkRlptTjVjbWxzYkdsalJXZHlZWFpsYzIxaGJHeEZhR0Z5YldWdWFXRnVSV2h2YjJ0aFltOTJaVVZwWjJoMGNtOXRZVzVGYVc1MlpYSjBaV1JpY21WMlpVVnBiM1JwWm1sbFpHTjVjbWxzYkdsalJXeGplWEpwYkd4cFkwVnNaWFpsYm5KdmJXRnVSVzFoWTNKdmJtRmpkWFJsUlcxaFkzSnZibWR5WVhabFJXMWplWEpwYkd4cFkwVnRiMjV2YzNCaFkyVkZibU41Y21sc2JHbGpSVzVrWlhOalpXNWtaWEpqZVhKcGJHeHBZMFZ1WjBWdVoyaGxZM2x5YVd4c2FXTkZibWh2YjJ0amVYSnBiR3hwWTBWdmNHVnVSWEJ6YVd4dmJuUnZibTl6UlhKamVYSnBiR3hwWTBWeVpYWmxjbk5sWkVWeVpYWmxjbk5sWkdONWNtbHNiR2xqUlhOamVYSnBiR3hwWTBWelpHVnpZMlZ1WkdWeVkzbHlhV3hzYVdORmMyaEZjMjFoYkd4RmRHRnliV1Z1YVdGdVJYUmhkRzl1YjNORmRHaHpiV0ZzYkVWMGFXeGtaVVYwYVd4a1pXSmxiRzkzUlhwb1JYcG9ZMkZ5YjI1RmVtaHlaWFpsY25ObFpFWkdTWE50WVd4c1JrWk1jMjFoYkd4R1JuTnRZV3hzUmtsemJXRnNiRVpNYzIxaGJHeEdZMmx5WTJ4bFJtUnZkR0ZqWTJWdWRFWmxhR0Z5YldWdWFXRnVSbVZwWTI5d2RHbGpSbWh2YjJ0R2FXNTJSbWwwWVdONWNtbHNiR2xqUm1sMlpYSnZiV0Z1Um0xdmJtOXpjR0ZqWlVadmRYSnliMjFoYmtaemJXRnNiRWRDYzNGMVlYSmxSMkZqZFhSbFIyRnRiV0ZoWm5KcFkyRnVSMkZ1WjJsaFkyOXdkR2xqUjJOaGNtOXVSMk5sWkdsc2JHRkhZMmx5WTJ4bFIyTnBjbU4xYldac1pYaEhaRzkwUjJSdmRHRmpZMlZ1ZEVkbFkzbHlhV3hzYVdOSFpYSnRZVzVrWW14elIyVnliV0Z1WkdKc2MzTnRZV3hzUjJoaFpHRnliV1Z1YVdGdVIyaGxiV2xrWkd4bGFHOXZhMk41Y21sc2JHbGpSMmhsYzNSeWIydGxZM2x5YVd4c2FXTkhhR1YxY0hSMWNtNWplWEpwYkd4cFkwZG9iMjlyUjJsdFlYSnRaVzVwWVc1SGFtVmplWEpwYkd4cFkwZHRZV055YjI1SGJXbHlSMjF2Ym05emNHRmpaVWR5WVhabFIzSmhkbVZ6YldGc2JFZHpiV0ZzYkVkemJXRnNiR2h2YjJ0SGMzUnliMnRsU0RFNE5UTXpTREU0TlRRelNERTROVFV4U0RJeU1EY3pTRkJ6Y1hWaGNtVklZV0ZpYTJoaGMybGhibU41Y21sc2JHbGpTR0ZrWlhOalpXNWtaWEpqZVhKcGJHeHBZMGhoY21SemFXZHVZM2x5YVd4c2FXTklZbUZ5U0dKeVpYWmxZbVZzYjNkSVkyVmthV3hzWVVoamFYSmpiR1ZJWTJseVkzVnRabXhsZUVoa2FXVnlaWE5wYzBoa2IzUmhZMk5sYm5SSVpHOTBZbVZzYjNkSWJXOXViM053WVdObFNHOWhjbTFsYm1saGJraHZjbWxqYjNCMGFXTkljMjFoYkd4SWRXNW5ZWEoxYld4aGRYUklkVzVuWVhKMWJXeGhkWFJ6YldGc2JFaDZjM0YxWVhKbFNVRmplWEpwYkd4cFkwbEtTVlZqZVhKcGJHeHBZMGxoWTNWMFpYTnRZV3hzU1dKeVpYWmxTV05oY205dVNXTnBjbU5zWlVsamFYSmpkVzFtYkdWNGMyMWhiR3hKWTNseWFXeHNhV05KWkdKc1ozSmhkbVZKWkdsbGNtVnphWE5oWTNWMFpVbGthV1Z5WlhOcGMyTjVjbWxzYkdsalNXUnBaWEpsYzJsemMyMWhiR3hKWkc5MFNXUnZkR0psYkc5M1NXVmljbVYyWldONWNtbHNiR2xqU1dWamVYSnBiR3hwWTBsbWNtRmpkSFZ5U1dkeVlYWmxjMjFoYkd4SmFHOXZhMkZpYjNabFNXbGplWEpwYkd4cFkwbHBiblpsY25SbFpHSnlaWFpsU1dsemFHOXlkR041Y21sc2JHbGpTVzFoWTNKdmJtTjVjbWxzYkdsalNXMXZibTl6Y0dGalpVbHVhV0Z5YldWdWFXRnVTVzlqZVhKcGJHeHBZMGx2ZEdGaFpuSnBZMkZ1U1c5MFlXUnBaWEpsYzJselNXOTBZWFJ2Ym05elNYTnRZV3hzU1hOMGNtOXJaVWwwYVd4a1pVbDBhV3hrWldKbGJHOTNTWHBvYVhSellXTjVjbWxzYkdsalNYcG9hWFJ6WVdSaWJHZHlZWFpsWTNseWFXeHNhV05LWVdGeWJXVnVhV0Z1U21OcGNtTnNaVXBqYVhKamRXMW1iR1Y0U21WamVYSnBiR3hwWTBwb1pXaGhjbTFsYm1saGJrcHRiMjV2YzNCaFkyVktjMjFoYkd4TFFuTnhkV0Z5WlV0TGMzRjFZWEpsUzJGaVlYTm9hMmx5WTNseWFXeHNhV05MWVdOMWRHVkxZV041Y21sc2JHbGpTMkZrWlhOalpXNWtaWEpqZVhKcGJHeHBZMHRoYUc5dmEyTjVjbWxzYkdsalMyRnpkSEp2YTJWamVYSnBiR3hwWTB0aGRtVnlkR2xqWVd4emRISnZhMlZqZVhKcGJHeHBZMHRqWVhKdmJrdGpaV1JwYkd4aFMyTnBjbU5zWlV0a2IzUmlaV3h2ZDB0bGFHRnliV1Z1YVdGdVMyVnVZWEp0Wlc1cFlXNUxhR0ZqZVhKcGJHeHBZMHRvWldsamIzQjBhV05MYUc5dmEwdHFaV041Y21sc2JHbGpTMnhwYm1WaVpXeHZkMHR0YjI1dmMzQmhZMlZMYjNCd1lXTjVjbWxzYkdsalMyOXdjR0ZuY21WbGEwdHphV041Y21sc2JHbGpTM050WVd4c1RFcE1URXhqWldScGJHeGhUR05wY21Oc1pVeGphWEpqZFcxbWJHVjRZbVZzYjNkTVpHOTBUR1J2ZEdGalkyVnVkRXhrYjNSaVpXeHZkMHhrYjNSaVpXeHZkMjFoWTNKdmJreHBkMjVoY20xbGJtbGhia3hxVEdwbFkzbHlhV3hzYVdOTWJHbHVaV0psYkc5M1RHMXZibTl6Y0dGalpVeHpiR0Z6YUhOdFlXeHNUSE50WVd4c1RVSnpjWFZoY21WTllXTnliMjVOWVdOeWIyNXpiV0ZzYkUxaFkzVjBaVTFqYVhKamJHVk5aRzkwWVdOalpXNTBUV1J2ZEdKbGJHOTNUV1Z1WVhKdFpXNXBZVzVOYlc5dWIzTndZV05sVFhOdFlXeHNUWFIxY201bFpFNUtUbU5sWkdsc2JHRk9ZMmx5WTJ4bFRtTnBjbU4xYldac1pYaGlaV3h2ZDA1a2IzUmhZMk5sYm5ST1pHOTBZbVZzYjNkT1owNW9iMjlyYkdWbWRFNXBibVZ5YjIxaGJrNXFUbXBsWTNseWFXeHNhV05PYkdsdVpXSmxiRzkzVG0xdmJtOXpjR0ZqWlU1dmQyRnliV1Z1YVdGdVRuTnRZV3hzVG5ScGJHUmxjMjFoYkd4UFJYTnRZV3hzVDJGamRYUmxjMjFoYkd4UFltRnljbVZrWTNseWFXeHNhV05QWW1GeWNtVmtaR2xsY21WemFYTmplWEpwYkd4cFkwOWljbVYyWlU5allYSnZiazlqWlc1MFpYSmxaSFJwYkdSbFQyTnBjbU5zWlU5amFYSmpkVzFtYkdWNFlXTjFkR1ZQWTJseVkzVnRabXhsZUdSdmRHSmxiRzkzVDJOcGNtTjFiV1pzWlhobmNtRjJaVTlqYVhKamRXMW1iR1Y0YUc5dmEyRmliM1psVDJOcGNtTjFiV1pzWlhoemJXRnNiRTlqYVhKamRXMW1iR1Y0ZEdsc1pHVlBZM2x5YVd4c2FXTlBaR0pzWVdOMWRHVlBaR0pzWjNKaGRtVlBaR2xsY21WemFYTmplWEpwYkd4cFkwOWthV1Z5WlhOcGMzTnRZV3hzVDJSdmRHSmxiRzkzVDJkdmJtVnJjMjFoYkd4UFozSmhkbVZ6YldGc2JFOW9ZWEp0Wlc1cFlXNVBhRzFQYUc5dmEyRmliM1psVDJodmNtNVBhRzl5Ym1GamRYUmxUMmh2Y201a2IzUmlaV3h2ZDA5b2IzSnVaM0poZG1WUGFHOXlibWh2YjJ0aFltOTJaVTlvYjNKdWRHbHNaR1ZQYVU5cGJuWmxjblJsWkdKeVpYWmxUMjFoWTNKdmJtRmpkWFJsVDIxaFkzSnZibWR5WVhabFQyMWxaMkZqZVhKcGJHeHBZMDl0WldkaFozSmxaV3RQYldWbllXbHVkazl0WldkaGNtOTFibVJqZVhKcGJHeHBZMDl0WldkaGRHbDBiRzlqZVhKcGJHeHBZMDl0WldkaGRHOXViM05QYldsamNtOXVkRzl1YjNOUGJXOXViM053WVdObFQyNWxjbTl0WVc1UGIyZHZibVZyVDI5bmIyNWxhMjFoWTNKdmJrOXZjR1Z1VDNOc1lYTm9ZV04xZEdWUGMyeGhjMmh6YldGc2JFOXpiV0ZzYkU5emRISnZhMlZoWTNWMFpVOTBZM2x5YVd4c2FXTlBkR2xzWkdWaFkzVjBaVTkwYVd4a1pXUnBaWEpsYzJselQzUnBiR1JsYzIxaGJHeFFZV04xZEdWUVkybHlZMnhsVUdSdmRHRmpZMlZ1ZEZCbFkzbHlhV3hzYVdOUVpXaGhjbTFsYm1saGJsQmxiV2xrWkd4bGFHOXZhMk41Y21sc2JHbGpVR2h2YjJ0UWFYZHlZWEp0Wlc1cFlXNVFiVzl1YjNOd1lXTmxVSE5wWTNseWFXeHNhV05RYzIxaGJHeFJZMmx5WTJ4bFVXMXZibTl6Y0dGalpWRnpiV0ZzYkZKaFlYSnRaVzVwWVc1U1kyVmthV3hzWVZKamFYSmpiR1ZTWkdKc1ozSmhkbVZTWkc5MFlXTmpaVzUwVW1SdmRHSmxiRzkzVW1SdmRHSmxiRzkzYldGamNtOXVVbVZvWVhKdFpXNXBZVzVTWm5KaFkzUjFjbEpwYm1kemJXRnNiRkpwYm5abGNuUmxaR0p5WlhabFVteHBibVZpWld4dmQxSnRiMjV2YzNCaFkyVlNjMjFoYkd4U2MyMWhiR3hwYm5abGNuUmxaRkp6YldGc2JHbHVkbVZ5ZEdWa2MzVndaWEpwYjNKVFJqQXhNREF3TUZOR01ESXdNREF3VTBZd016QXdNREJUUmpBME1EQXdNRk5HTURVd01EQXdVMFl3TmpBd01EQlRSakEzTURBd01GTkdNRGd3TURBd1UwWXdPVEF3TURCVFJqRXdNREF3TUZOR01URXdNREF3VTBZeE9UQXdNREJUUmpJd01EQXdNRk5HTWpFd01EQXdVMFl5TWpBd01EQlRSakl6TURBd01GTkdNalF3TURBd1UwWXlOVEF3TURCVFJqSTJNREF3TUZOR01qY3dNREF3VTBZeU9EQXdNREJUUmpNMk1EQXdNRk5HTXpjd01EQXdVMFl6T0RBd01EQlRSak01TURBd01GTkdOREF3TURBd1UwWTBNVEF3TURCVFJqUXlNREF3TUZOR05ETXdNREF3VTBZME5EQXdNREJUUmpRMU1EQXdNRk5HTkRZd01EQXdVMFkwTnpBd01EQlRSalE0TURBd01GTkdORGt3TURBd1UwWTFNREF3TURCVFJqVXhNREF3TUZOR05USXdNREF3VTBZMU16QXdNREJUUmpVME1EQXdNRk5UVTFOemJXRnNiRk5oWTNWMFpXUnZkR0ZqWTJWdWRGTmhiWEJwWjNKbFpXdFRZMkZ5YjI1a2IzUmhZMk5sYm5SVFkyRnliMjV6YldGc2JGTmphSGRoVTJOb2QyRmplWEpwYkd4cFkxTmphSGRoWkdsbGNtVnphWE5qZVhKcGJHeHBZMU5qYVhKamJHVlRZMmx5WTNWdFpteGxlRk5rYjNSaFkyTmxiblJUWkc5MFltVnNiM2RUWkc5MFltVnNiM2RrYjNSaFkyTmxiblJUWldoaGNtMWxibWxoYmxObGRtVnVjbTl0WVc1VGFHRmhjbTFsYm1saGJsTm9ZV041Y21sc2JHbGpVMmhqYUdGamVYSnBiR3hwWTFOb1pXbGpiM0IwYVdOVGFHaGhZM2x5YVd4c2FXTlRhR2x0WVdOdmNIUnBZMU5wZUhKdmJXRnVVMjF2Ym05emNHRmpaVk52Wm5SemFXZHVZM2x5YVd4c2FXTlRjMjFoYkd4VGRHbG5iV0ZuY21WbGExUmlZWEpVWTJWa2FXeHNZVlJqYVhKamJHVlVZMmx5WTNWdFpteGxlR0psYkc5M1ZHUnZkR0ZqWTJWdWRGUmtiM1JpWld4dmQxUmxZM2x5YVd4c2FXTlVaV1JsYzJObGJtUmxjbU41Y21sc2JHbGpWR1Z1Y205dFlXNVVaWFJ6WldONWNtbHNiR2xqVkdodmIydFVhRzl5Ym5OdFlXeHNWR2h5WldWeWIyMWhibFJwYkdSbGMyMWhiR3hVYVhkdVlYSnRaVzVwWVc1VWJHbHVaV0psYkc5M1ZHMXZibTl6Y0dGalpWUnZZWEp0Wlc1cFlXNVViMjVsWm1sMlpWUnZibVZ6YVhoVWIyNWxkSGR2VkhKbGRISnZabXhsZUdodmIydFVjMlZqZVhKcGJHeHBZMVJ6YUdWamVYSnBiR3hwWTFSemJXRnNiRlIzWld4MlpYSnZiV0Z1VkhkdmNtOXRZVzVWWVdOMWRHVnpiV0ZzYkZWaWNtVjJaVlZqWVhKdmJsVmphWEpqYkdWVlkybHlZM1Z0Wm14bGVHSmxiRzkzVldOcGNtTjFiV1pzWlhoemJXRnNiRlZqZVhKcGJHeHBZMVZrWW14aFkzVjBaVlZrWW14bmNtRjJaVlZrYVdWeVpYTnBjMkZqZFhSbFZXUnBaWEpsYzJselltVnNiM2RWWkdsbGNtVnphWE5qWVhKdmJsVmthV1Z5WlhOcGMyTjVjbWxzYkdsalZXUnBaWEpsYzJselozSmhkbVZWWkdsbGNtVnphWE50WVdOeWIyNVZaR2xsY21WemFYTnpiV0ZzYkZWa2IzUmlaV3h2ZDFWbmNtRjJaWE50WVd4c1ZXaHZiMnRoWW05MlpWVm9iM0p1VldodmNtNWhZM1YwWlZWb2IzSnVaRzkwWW1Wc2IzZFZhRzl5Ym1keVlYWmxWV2h2Y201b2IyOXJZV0p2ZG1WVmFHOXliblJwYkdSbFZXaDFibWRoY25WdGJHRjFkR041Y21sc2JHbGpWV2x1ZG1WeWRHVmtZbkpsZG1WVmEyTjVjbWxzYkdsalZXMWhZM0p2Ym1ONWNtbHNiR2xqVlcxaFkzSnZibVJwWlhKbGMybHpWVzF2Ym05emNHRmpaVlZ3YzJsc2IyNWhZM1YwWldodmIydHplVzFpYjJ4bmNtVmxhMVZ3YzJsc2IyNWhabkpwWTJGdVZYQnphV3h2Ym1ScFpYSmxjMmx6VlhCemFXeHZibVJwWlhKbGMybHphRzl2YTNONWJXSnZiR2R5WldWclZYQnphV3h2Ym1odmIydHplVzFpYjJ4VmNITnBiRzl1ZEc5dWIzTlZjMmh2Y25SamVYSnBiR3hwWTFWemJXRnNiRlZ6ZEhKaGFXZG9kR041Y21sc2JHbGpWWE4wY21GcFoyaDBjM1J5YjJ0bFkzbHlhV3hzYVdOVmRHbHNaR1ZWZEdsc1pHVmhZM1YwWlZWMGFXeGtaV0psYkc5M1ZtTnBjbU5zWlZaa2IzUmlaV3h2ZDFabFkzbHlhV3hzYVdOV1pYZGhjbTFsYm1saGJsWm9iMjlyVm0xdmJtOXpjR0ZqWlZadllYSnRaVzVwWVc1V2MyMWhiR3hXZEdsc1pHVlhZV04xZEdWWFkybHlZMnhsVjJOcGNtTjFiV1pzWlhoWFpHbGxjbVZ6YVhOWFpHOTBZV05qWlc1MFYyUnZkR0psYkc5M1YyZHlZWFpsVjIxdmJtOXpjR0ZqWlZkemJXRnNiRmhqYVhKamJHVllaR2xsY21WemFYTllaRzkwWVdOalpXNTBXR1ZvWVhKdFpXNXBZVzVZYlc5dWIzTndZV05sV0hOdFlXeHNXV0ZqZFhSbGMyMWhiR3haWVhSamVYSnBiR3hwWTFsamFYSmpiR1ZaWTJseVkzVnRabXhsZUZsa2FXVnlaWE5wYzNOdFlXeHNXV1J2ZEdGalkyVnVkRmxrYjNSaVpXeHZkMWxsYmxsbGNtbGplWEpwYkd4cFkxbGxjblZrYVdWeVpYTnBjMk41Y21sc2JHbGpXV2R5WVhabFdXaHZiMnRaYUc5dmEyRmliM1psV1dsaGNtMWxibWxoYmxscFkzbHlhV3hzYVdOWmFYZHVZWEp0Wlc1cFlXNVpiVzl1YjNOd1lXTmxXWE50WVd4c1dYUnBiR1JsV1hWelltbG5ZM2x5YVd4c2FXTlpkWE5pYVdkcGIzUnBabWxsWkdONWNtbHNiR2xqV1hWemJHbDBkR3hsWTNseWFXeHNhV05aZFhOc2FYUjBiR1ZwYjNScFptbGxaR041Y21sc2JHbGpXbUZoY20xbGJtbGhibHBqWVhKdmJuTnRZV3hzV21OcGNtTnNaVnBqYVhKamRXMW1iR1Y0V21SdmRGcGtiM1JpWld4dmQxcGxZM2x5YVd4c2FXTmFaV1JsYzJObGJtUmxjbU41Y21sc2JHbGpXbVZrYVdWeVpYTnBjMk41Y21sc2JHbGpXbWhsWVhKdFpXNXBZVzVhYUdWaWNtVjJaV041Y21sc2JHbGpXbWhsWTNseWFXeHNhV05hYUdWa1pYTmpaVzVrWlhKamVYSnBiR3hwWTFwb1pXUnBaWEpsYzJselkzbHlhV3hzYVdOYWJHbHVaV0psYkc5M1dtMXZibTl6Y0dGalpWcHpiV0ZzYkZwemRISnZhMlZoWVdKbGJtZGhiR2xoWVdSbGRtRmhZV2QxYW1GeVlYUnBZV0ZuZFhKdGRXdG9hV0ZoYldGMGNtRm5kWEp0ZFd0b2FXRmhjblZ6Y1hWaGNtVmhZWFp2ZDJWc2MybG5ibUpsYm1kaGJHbGhZWFp2ZDJWc2MybG5ibVJsZG1GaFlYWnZkMlZzYzJsbmJtZDFhbUZ5WVhScFlXSmljbVYyYVdGMGFXOXViV0Z5YTJGeWJXVnVhV0Z1WVdKaWNtVjJhV0YwYVc5dWMybG5ibVJsZG1GaFltVnVaMkZzYVdGaWIzQnZiVzltYjJGaWNtVjJaV0ZqZFhSbFlXSnlaWFpsWTNseWFXeHNhV05oWW5KbGRtVmtiM1JpWld4dmQyRmljbVYyWldkeVlYWmxZV0p5WlhabGFHOXZhMkZpYjNabFlXSnlaWFpsZEdsc1pHVmhZMkZ5YjI1aFkybHlZMnhsWVdOcGNtTjFiV1pzWlhoaFkzVjBaV0ZqYVhKamRXMW1iR1Y0Wkc5MFltVnNiM2RoWTJseVkzVnRabXhsZUdkeVlYWmxZV05wY21OMWJXWnNaWGhvYjI5cllXSnZkbVZoWTJseVkzVnRabXhsZUhScGJHUmxZV04xZEdWaVpXeHZkMk50WW1GamRYUmxZMjFpWVdOMWRHVmpiMjFpWVdOMWRHVmtaWFpoWVdOMWRHVnNiM2R0YjJSaFkzVjBaWFJ2Ym1WamJXSmhZM2x5YVd4c2FXTmhaR0pzWjNKaGRtVmhaR1JoYTJkMWNtMTFhMmhwWVdSbGRtRmhaR2xsY21WemFYTmplWEpwYkd4cFkyRmthV1Z5WlhOcGMyMWhZM0p2Ym1Ga2IzUmlaV3h2ZDJGa2IzUnRZV055YjI1aFpXRmpkWFJsWVdWcmIzSmxZVzVoWlcxaFkzSnZibUZtYVdrd01ESXdPR0ZtYVdrd09EazBNV0ZtYVdreE1EQXhOMkZtYVdreE1EQXhPR0ZtYVdreE1EQXhPV0ZtYVdreE1EQXlNR0ZtYVdreE1EQXlNV0ZtYVdreE1EQXlNbUZtYVdreE1EQXlNMkZtYVdreE1EQXlOR0ZtYVdreE1EQXlOV0ZtYVdreE1EQXlObUZtYVdreE1EQXlOMkZtYVdreE1EQXlPR0ZtYVdreE1EQXlPV0ZtYVdreE1EQXpNR0ZtYVdreE1EQXpNV0ZtYVdreE1EQXpNbUZtYVdreE1EQXpNMkZtYVdreE1EQXpOR0ZtYVdreE1EQXpOV0ZtYVdreE1EQXpObUZtYVdreE1EQXpOMkZtYVdreE1EQXpPR0ZtYVdreE1EQXpPV0ZtYVdreE1EQTBNR0ZtYVdreE1EQTBNV0ZtYVdreE1EQTBNbUZtYVdreE1EQTBNMkZtYVdreE1EQTBOR0ZtYVdreE1EQTBOV0ZtYVdreE1EQTBObUZtYVdreE1EQTBOMkZtYVdreE1EQTBPR0ZtYVdreE1EQTBPV0ZtYVdreE1EQTFNR0ZtYVdreE1EQTFNV0ZtYVdreE1EQTFNbUZtYVdreE1EQTFNMkZtYVdreE1EQTFOR0ZtYVdreE1EQTFOV0ZtYVdreE1EQTFObUZtYVdreE1EQTFOMkZtYVdreE1EQTFPR0ZtYVdreE1EQTFPV0ZtYVdreE1EQTJNR0ZtYVdreE1EQTJNV0ZtYVdreE1EQTJNbUZtYVdreE1EQTJNMkZtYVdreE1EQTJOR0ZtYVdreE1EQTJOV0ZtYVdreE1EQTJObUZtYVdreE1EQTJOMkZtYVdreE1EQTJPR0ZtYVdreE1EQTJPV0ZtYVdreE1EQTNNR0ZtYVdreE1EQTNNV0ZtYVdreE1EQTNNbUZtYVdreE1EQTNNMkZtYVdreE1EQTNOR0ZtYVdreE1EQTNOV0ZtYVdreE1EQTNObUZtYVdreE1EQTNOMkZtYVdreE1EQTNPR0ZtYVdreE1EQTNPV0ZtYVdreE1EQTRNR0ZtYVdreE1EQTRNV0ZtYVdreE1EQTRNbUZtYVdreE1EQTRNMkZtYVdreE1EQTROR0ZtYVdreE1EQTROV0ZtYVdreE1EQTRObUZtYVdreE1EQTROMkZtYVdreE1EQTRPR0ZtYVdreE1EQTRPV0ZtYVdreE1EQTVNR0ZtYVdreE1EQTVNV0ZtYVdreE1EQTVNbUZtYVdreE1EQTVNMkZtYVdreE1EQTVOR0ZtYVdreE1EQTVOV0ZtYVdreE1EQTVObUZtYVdreE1EQTVOMkZtYVdreE1EQTVPR0ZtYVdreE1EQTVPV0ZtYVdreE1ERXdNR0ZtYVdreE1ERXdNV0ZtYVdreE1ERXdNbUZtYVdreE1ERXdNMkZtYVdreE1ERXdOR0ZtYVdreE1ERXdOV0ZtYVdreE1ERXdObUZtYVdreE1ERXdOMkZtYVdreE1ERXdPR0ZtYVdreE1ERXdPV0ZtYVdreE1ERXhNR0ZtYVdreE1ERTBOV0ZtYVdreE1ERTBObUZtYVdreE1ERTBOMkZtYVdreE1ERTBPR0ZtYVdreE1ERTVNbUZtYVdreE1ERTVNMkZtYVdreE1ERTVOR0ZtYVdreE1ERTVOV0ZtYVdreE1ERTVObUZtYVdreE1EZ3pNV0ZtYVdreE1EZ3pNbUZtYVdreE1EZzBObUZtYVdreU9UbGhabWxwTXpBd1lXWnBhVE13TVdGbWFXazFOek00TVdGbWFXazFOek00T0dGbWFXazFOek01TW1GbWFXazFOek01TTJGbWFXazFOek01TkdGbWFXazFOek01TldGbWFXazFOek01Tm1GbWFXazFOek01TjJGbWFXazFOek01T0dGbWFXazFOek01T1dGbWFXazFOelF3TUdGbWFXazFOelF3TVdGbWFXazFOelF3TTJGbWFXazFOelF3TjJGbWFXazFOelF3T1dGbWFXazFOelF4TUdGbWFXazFOelF4TVdGbWFXazFOelF4TW1GbWFXazFOelF4TTJGbWFXazFOelF4TkdGbWFXazFOelF4TldGbWFXazFOelF4Tm1GbWFXazFOelF4TjJGbWFXazFOelF4T0dGbWFXazFOelF4T1dGbWFXazFOelF5TUdGbWFXazFOelF5TVdGbWFXazFOelF5TW1GbWFXazFOelF5TTJGbWFXazFOelF5TkdGbWFXazFOelF5TldGbWFXazFOelF5Tm1GbWFXazFOelF5TjJGbWFXazFOelF5T0dGbWFXazFOelF5T1dGbWFXazFOelF6TUdGbWFXazFOelF6TVdGbWFXazFOelF6TW1GbWFXazFOelF6TTJGbWFXazFOelF6TkdGbWFXazFOelEwTUdGbWFXazFOelEwTVdGbWFXazFOelEwTW1GbWFXazFOelEwTTJGbWFXazFOelEwTkdGbWFXazFOelEwTldGbWFXazFOelEwTm1GbWFXazFOelEwT0dGbWFXazFOelEwT1dGbWFXazFOelExTUdGbWFXazFOelExTVdGbWFXazFOelExTW1GbWFXazFOelExTTJGbWFXazFOelExTkdGbWFXazFOelExTldGbWFXazFOelExTm1GbWFXazFOelExTjJGbWFXazFOelExT0dGbWFXazFOelEzTUdGbWFXazFOelV3TldGbWFXazFOelV3Tm1GbWFXazFOelV3TjJGbWFXazFOelV3T0dGbWFXazFOelV3T1dGbWFXazFOelV4TVdGbWFXazFOelV4TW1GbWFXazFOelV4TTJGbWFXazFOelV4TkdGbWFXazFOelV4T1dGbWFXazFOelV6TkdGbWFXazFOell6Tm1GbWFXazFOelkwTldGbWFXazFOelkxT0dGbWFXazFOelkyTkdGbWFXazFOelkyTldGbWFXazFOelkyTm1GbWFXazFOelkyTjJGbWFXazFOelkyT0dGbWFXazFOelkyT1dGbWFXazFOelkzTUdGbWFXazFOelkzTVdGbWFXazFOelkzTW1GbWFXazFOelkzTTJGbWFXazFOelkzTkdGbWFXazFOelkzTldGbWFXazFOelkzTm1GbWFXazFOelkzTjJGbWFXazFOelkzT0dGbWFXazFOelkzT1dGbWFXazFOelk0TUdGbWFXazFOelk0TVdGbWFXazFOelk0TW1GbWFXazFOelk0TTJGbWFXazFOelk0TkdGbWFXazFOelk0TldGbWFXazFOelk0Tm1GbWFXazFOelk0TjJGbWFXazFOelk0T0dGbWFXazFOelk0T1dGbWFXazFOelk1TUdGbWFXazFOelk1TkdGbWFXazFOelk1TldGbWFXazFOemN3TUdGbWFXazFOemN3TldGbWFXazFOemN4Tm1GbWFXazFOemN4TjJGbWFXazFOemN4T0dGbWFXazFOemN5TTJGbWFXazFOemM1TTJGbWFXazFOemM1TkdGbWFXazFOemM1TldGbWFXazFOemM1Tm1GbWFXazFOemM1TjJGbWFXazFOemM1T0dGbWFXazFOemM1T1dGbWFXazFOemd3TUdGbWFXazFOemd3TVdGbWFXazFOemd3TW1GbWFXazFOemd3TTJGbWFXazFOemd3TkdGbWFXazFOemd3Tm1GbWFXazFOemd3TjJGbWFXazFOemd6T1dGbWFXazFOemcwTVdGbWFXazFOemcwTW1GbWFXazFOemt5T1dGbWFXazJNVEkwT0dGbWFXazJNVEk0T1dGbWFXazJNVE0xTW1GbWFXazJNVFUzTTJGbWFXazJNVFUzTkdGbWFXazJNVFUzTldGbWFXazJNVFkyTkdGbWFXazJNekUyTjJGbWFXazJORGt6TjJGbmRXcGhjbUYwYVdGbmRYSnRkV3RvYVdGb2FYSmhaMkZ1WVdGb2IyOXJZV0p2ZG1WaGFXSmxibWRoYkdsaGFXSnZjRzl0YjJadllXbGtaWFpoWVdsbFkzbHlhV3hzYVdOaGFXZDFhbUZ5WVhScFlXbG5kWEp0ZFd0b2FXRnBiV0YwY21GbmRYSnRkV3RvYVdGcGJtRnlZV0pwWTJGcGJtWnBibUZzWVhKaFltbGpZV2x1YVc1cGRHbGhiR0Z5WVdKcFkyRnBibTFsWkdsaGJHRnlZV0pwWTJGcGJuWmxjblJsWkdKeVpYWmxZV2wyYjNkbGJITnBaMjVpWlc1bllXeHBZV2wyYjNkbGJITnBaMjVrWlhaaFlXbDJiM2RsYkhOcFoyNW5kV3BoY21GMGFXRnJZWFJoYTJGdVlXRnJZWFJoYTJGdVlXaGhiR1ozYVdSMGFHRnJiM0psWVc1aGJHVm1ZV3hsWm1GeVlXSnBZMkZzWldaa1lXZGxjMmhvWldKeVpYZGhiR1ZtWm1sdVlXeGhjbUZpYVdOaGJHVm1hR0Z0ZW1GaFltOTJaV0Z5WVdKcFkyRnNaV1pvWVcxNllXRmliM1psWm1sdVlXeGhjbUZpYVdOaGJHVm1hR0Z0ZW1GaVpXeHZkMkZ5WVdKcFkyRnNaV1pvWVcxNllXSmxiRzkzWm1sdVlXeGhjbUZpYVdOaGJHVm1hR1ZpY21WM1lXeGxabXhoYldWa2FHVmljbVYzWVd4bFptMWhaR1JoWVdKdmRtVmhjbUZpYVdOaGJHVm1iV0ZrWkdGaFltOTJaV1pwYm1Gc1lYSmhZbWxqWVd4bFptMWhhM04xY21GaGNtRmlhV05oYkdWbWJXRnJjM1Z5WVdacGJtRnNZWEpoWW1sallXeGxabTFoYTNOMWNtRnBibWwwYVdGc1lYSmhZbWxqWVd4bFptMWhhM04xY21GdFpXUnBZV3hoY21GaWFXTmhiR1ZtY0dGMFlXaG9aV0p5WlhkaGJHVm1jV0Z0WVhSemFHVmljbVYzWVd4c1pYRjFZV3hoYkhCb1lYUnZibTl6WVd4MGMyVnNaV04wYjNKaGJXOXViM053WVdObFlXMXdaWEp6WVc1a2JXOXViM053WVdObFlXMXdaWEp6WVc1a2MyMWhiR3hoYlhOeGRXRnlaV0Z1WW05d2IyMXZabTloYm1kaWIzQnZiVzltYjJGdVoySnlZV05yWlhSc1pXWjBZVzVuWW5KaFkydGxkR3hsWm5SQ2FXZGhibWRpY21GamEyVjBiR1ZtZEVKcFoyZGhibWRpY21GamEyVjBiR1ZtZEdKcFoyRnVaMkp5WVdOclpYUnNaV1owWW1sbloyRnVaMkp5WVdOclpYUnlhV2RvZEdGdVoySnlZV05yWlhSeWFXZG9kRUpwWjJGdVoySnlZV05yWlhSeWFXZG9kRUpwWjJkaGJtZGljbUZqYTJWMGNtbG5hSFJpYVdkaGJtZGljbUZqYTJWMGNtbG5hSFJpYVdkbllXNW5hMmhoYm10b2RYUm9ZV2xoYm1kc1pXSnlZV05yWlhSc1pXWjBZVzVuYkdWaWNtRmphMlYwYkdWbWRIWmxjblJwWTJGc1lXNW5iR1ZpY21GamEyVjBjbWxuYUhSaGJtZHNaV0p5WVdOclpYUnlhV2RvZEhabGNuUnBZMkZzWVc1bmJHVnNaV1owUW1sbllXNW5iR1ZzWldaMFFtbG5aMkZ1WjJ4bGJHVm1kR0pwWjJGdVoyeGxiR1ZtZEdKcFoyZGhibWRzWlhKcFoyaDBRbWxuWVc1bmJHVnlhV2RvZEVKcFoyZGhibWRzWlhKcFoyaDBZbWxuWVc1bmJHVnlhV2RvZEdKcFoyZGhibWR6ZEhKdmJXRnViM1JsYkdWcFlXRnVkR2xqYkc5amEzZHBjMlZoYm5Wa1lYUjBZV1JsZG1GaGJuVnpkbUZ5WVdKbGJtZGhiR2xoYm5WemRtRnlZV1JsZG1GaGJuVnpkbUZ5WVdkMWFtRnlZWFJwWVhCaFlYUnZjM0YxWVhKbFlYQmhjbVZ1WVhCdmMzUnliM0JvWldGeWJXVnVhV0Z1WVhCdmMzUnliM0JvWlcxdlpHRndjSEp2WVdOb1pYTmhjSEJ5YjNobGNYVmhiRzl5YVcxaFoyVmhjSEJ5YjNocGJXRjBaV3g1WlhGMVlXeGhjSEJ5YjNodmNtVnhkV0ZzWVhKaFpXRmxhMjl5WldGdVlYSmhaV0ZyYjNKbFlXNWhjbU5oY21Ob2JHVm1kR1J2ZDI1aGNtTm9jbWxuYUhSa2IzZHVZWEpwWjJoMGFHRnNabkpwYm1kaGNtbHVaMkZqZFhSbFlYSnBibWRpWld4dmQyRnljbTkzWW05MGFIWmhjbkp2ZDJKMFlYSnliM2RrWVhOb1pHOTNibUZ5Y205M1pHRnphR3hsWm5SaGNuSnZkMlJoYzJoeWFXZG9kR0Z5Y205M1pHRnphSFZ3WVhKeWIzZGtZbXhpYjNSb2RtRnljbTkzWkdKc2RIQmhjbkp2ZDJSaWJIWmxjblJsZUdGeWNtOTNaRzkzYm14bFpuUmhjbkp2ZDJSdmQyNXlhV2RvZEdGeWNtOTNaRzkzYm5kb2FYUmxZWEp5YjNkb1pXRmtaRzkzYm0xdlpHRnljbTkzYUdWaFpHeGxablJ0YjJSaGNuSnZkMmhsWVdSeWFXZG9kRzF2WkdGeWNtOTNhR1ZoWkhWd2JXOWtZWEp5YjNkb2IyOXJiR1ZtZEdGeWNtOTNhRzl2YTNKcFoyaDBZWEp5YjNkc1pXWjBZbTkwYUdGc1ptRnljbTkzYkdWbWRHUmliR0Z5Y205M2JHVm1kR1JpYkhOMGNtOXJaV0Z5Y205M2JHVm1kRzkyWlhKeWFXZG9kR0Z5Y205M2JHVm1kSFJ2Y0doaGJHWmhjbkp2ZDJ4bFpuUjNhR2wwWldGeWNtOTNibTl5ZEdobFlYTjBZWEp5YjNkdWIzSjBhSGRsYzNSaGNuSnZkM0JoY25Kc1pXWjBjbWxuYUhSaGNuSnZkM0JoY25KeWFXZG9kR3hsWm5SaGNuSnZkM0pwWjJoMFltOTBhR0ZzWm1GeWNtOTNjbWxuYUhSa1lteHpkSEp2YTJWaGNuSnZkM0pwWjJoMGFHVmhkbmxoY25KdmQzSnBaMmgwYjNabGNteGxablJoY25KdmQzSnBaMmgwZEc5d2FHRnNabUZ5Y205M2NtbG5hSFIzYUdsMFpXRnljbTkzYzI5MWRHaGxZWE4wWVhKeWIzZHpiM1YwYUhkbGMzUmhjbkp2ZDNSaFlteGxablJoY25KdmQzUmhZbkpwWjJoMFlYSnliM2QwWVdsc2JHVm1kR0Z5Y205M2RHRnBiSEpwWjJoMFlYSnliM2QwY0dGeWNtOTNkSEpwY0d4bGJHVm1kR0Z5Y205M2RISnBjR3hsY21sbmFIUmhjbkp2ZDNWd1pHNWhjbkp2ZDNWd1pHNWljMlZoY25KdmQzVndaRzkzYm1KaGMyVmhjbkp2ZDNWd2JHVm1kR0Z5Y205M2RYQnNaV1owYjJaa2IzZHVZWEp5YjNkMWNISnBaMmgwWVhKeWIzZDFjSGRvYVhSbFlYTmpaVzVrWlhKamIyMXdkMjl5WkcxaGNtdGhjMk5wYVdOcGNtTjFiVzF2Ym05emNHRmpaV0Z6WTJscGRHbHNaR1Z0YjI1dmMzQmhZMlZoYzJOeWFYQjBZWE5qY21sd2RIUjFjbTVsWkdGemJXRnNiR2hwY21GbllXNWhZWE50WVd4c2EyRjBZV3RoYm1GaGMyMWhiR3hyWVhSaGEyRnVZV2hoYkdaM2FXUjBhR0Z6ZEdWeWFYTnJZV3gwYjI1bFlYSmhZbWxqWVhOMFpYSnBjMnRoY21GaWFXTmhjM1JsY21semEyTmxiblJsY21Wa1lYTjBaWEpwYzJ0dGIyNXZjM0JoWTJWaGMzUmxjbWx6YTNOdFlXeHNZWE4wWlhKcGMyMWhjM1Z3WlhKcGIzSmhjM2x0Y0hSdmRHbGpZV3hzZVdWeGRXRnNZWFJ0YjI1dmMzQmhZMlZoZEhOdFlXeHNZWFIxY201bFpHRjFZbVZ1WjJGc2FXRjFZbTl3YjIxdlptOWhkV1JsZG1GaGRXZDFhbUZ5WVhScFlYVm5kWEp0ZFd0b2FXRjFiR1Z1WjNSb2JXRnlhMkpsYm1kaGJHbGhkVzFoZEhKaFozVnliWFZyYUdsaGRYWnZkMlZzYzJsbmJtSmxibWRoYkdsaGRYWnZkMlZzYzJsbmJtUmxkbUZoZFhadmQyVnNjMmxuYm1kMWFtRnlZWFJwWVhaaFozSmhhR0ZrWlhaaFlYbGlZWEp0Wlc1cFlXNWhlV2x1WVhscGJtRnNkRzl1WldobFluSmxkMkY1YVc1b1pXSnlaWGRpWVdKbGJtZGhiR2xpWVdOcmMyeGhjMmhDYVdkaVlXTnJjMnhoYzJoQ2FXZG5ZbUZqYTNOc1lYTm9ZbWxuWW1GamEzTnNZWE5vWW1sbloySmhZMnR6YkdGemFHMXZibTl6Y0dGalpXSmhaR1YyWVdKaFozVnFZWEpoZEdsaVlXZDFjbTExYTJocFltRm9hWEpoWjJGdVlXSmhhSFIwYUdGcFltRnJZWFJoYTJGdVlXSmhjbVJpYkdKaGNtUmliR1Y0WW1GeVpYaGlZWEp0YjI1dmMzQmhZMlZpWW05d2IyMXZabTlpWTJseVkyeGxZbVJ2ZEdGalkyVnVkR0prYjNSaVpXeHZkMkpsWVcxbFpITnBlSFJsWlc1MGFHNXZkR1Z6WW1WallYVnpaV0psWTNseWFXeHNhV05pWldoaGNtRmlhV05pWldobWFXNWhiR0Z5WVdKcFkySmxhR2x1YVhScFlXeGhjbUZpYVdOaVpXaHBjbUZuWVc1aFltVm9iV1ZrYVdGc1lYSmhZbWxqWW1Wb2JXVmxiV2x1YVhScFlXeGhjbUZpYVdOaVpXaHRaV1Z0YVhOdmJHRjBaV1JoY21GaWFXTmlaV2h1YjI5dVptbHVZV3hoY21GaWFXTmlaV3RoZEdGcllXNWhZbVZ1WVhKdFpXNXBZVzVpWlhSaVpYUmhjM2x0WW05c1ozSmxaV3RpWlhSa1lXZGxjMmhpWlhSa1lXZGxjMmhvWldKeVpYZGlaWFJvWW1WMGFHVmljbVYzWW1WMGNtRm1aV2hsWW5KbGQySmxkSGRsWlc1aWFHRmlaVzVuWVd4cFltaGhaR1YyWVdKb1lXZDFhbUZ5WVhScFltaGhaM1Z5YlhWcmFHbGlhRzl2YTJKcGFHbHlZV2RoYm1GaWFXdGhkR0ZyWVc1aFltbHNZV0pwWVd4amJHbGphMkpwYm1ScFozVnliWFZyYUdsaWFYSjFjM0YxWVhKbFlteGhZMnRqYVhKamJHVmliR0ZqYTJScFlXMXZibVJpYkdGamEyUnZkMjV3YjJsdWRHbHVaM1J5YVdGdVoyeGxZbXhoWTJ0c1pXWjBjRzlwYm5ScGJtZHdiMmx1ZEdWeVlteGhZMnRzWldaMGNHOXBiblJwYm1kMGNtbGhibWRzWldKc1lXTnJiR1Z1ZEdsamRXeGhjbUp5WVdOclpYUnNaV1owWW14aFkydHNaVzUwYVdOMWJHRnlZbkpoWTJ0bGRHeGxablIyWlhKMGFXTmhiR0pzWVdOcmJHVnVkR2xqZFd4aGNtSnlZV05yWlhSeWFXZG9kR0pzWVdOcmJHVnVkR2xqZFd4aGNtSnlZV05yWlhSeWFXZG9kSFpsY25ScFkyRnNZbXhoWTJ0c2IzZGxjbXhsWm5SMGNtbGhibWRzWldKc1lXTnJiRzkzWlhKeWFXZG9kSFJ5YVdGdVoyeGxZbXhoWTJ0eVpXTjBZVzVuYkdWaWJHRmphM0pwWjJoMGNHOXBiblJwYm1kd2IybHVkR1Z5WW14aFkydHlhV2RvZEhCdmFXNTBhVzVuZEhKcFlXNW5iR1ZpYkdGamEzTnRZV3hzYzNGMVlYSmxZbXhoWTJ0emJXbHNhVzVuWm1GalpXSnNZV05yYzNGMVlYSmxZbXhoWTJ0emRHRnlZbXhoWTJ0MWNIQmxjbXhsWm5SMGNtbGhibWRzWldKc1lXTnJkWEJ3WlhKeWFXZG9kSFJ5YVdGdVoyeGxZbXhoWTJ0MWNIQnZhVzUwYVc1bmMyMWhiR3gwY21saGJtZHNaV0pzWVdOcmRYQndiMmx1ZEdsdVozUnlhV0Z1WjJ4bFlteGhibXRpYkdsdVpXSmxiRzkzWW14dlkydGliVzl1YjNOd1lXTmxZbTlpWVdsdFlXbDBhR0ZwWW05b2FYSmhaMkZ1WVdKdmEyRjBZV3RoYm1GaWNHRnlaVzVpY1hOeGRXRnlaV0p5WVdObGFIUnBjR1J2ZDI1c1pXWjBZbkpoWTJWb2RHbHdaRzkzYm5KcFoyaDBZbkpoWTJWb2RHbHdkWEJzWldaMFluSmhZMlZvZEdsd2RYQnlhV2RvZEdKeVlXTmxiR1ZtZEVKcFoySnlZV05sYkdWbWRFSnBaMmRpY21GalpXeGxablJpYVdkaWNtRmpaV3hsWm5SaWFXZG5ZbkpoWTJWc1pXWjBiVzl1YjNOd1lXTmxZbkpoWTJWc1pXWjBjMjFoYkd4aWNtRmpaV3hsWm5SMlpYSjBhV05oYkdKeVlXTmxjbWxuYUhSQ2FXZGljbUZqWlhKcFoyaDBRbWxuWjJKeVlXTmxjbWxuYUhSaWFXZGljbUZqWlhKcFoyaDBZbWxuWjJKeVlXTmxjbWxuYUhSdGIyNXZjM0JoWTJWaWNtRmpaWEpwWjJoMGMyMWhiR3hpY21GalpYSnBaMmgwZG1WeWRHbGpZV3hpY21GamEyVjBiR1ZtZEVKcFoySnlZV05yWlhSc1pXWjBRbWxuWjJKeVlXTnJaWFJzWldaMFltbG5ZbkpoWTJ0bGRHeGxablJpYVdkblluSmhZMnRsZEd4bFpuUnRZWFJvWW5KaFkydGxkR3hsWm5SdGIyNXZjM0JoWTJWaWNtRmphMlYwY21sbmFIUkNhV2RpY21GamEyVjBjbWxuYUhSQ2FXZG5ZbkpoWTJ0bGRISnBaMmgwWW1sblluSmhZMnRsZEhKcFoyaDBZbWxuWjJKeVlXTnJaWFJ5YVdkb2RHMWhkR2hpY21GamEyVjBjbWxuYUhSdGIyNXZjM0JoWTJWaWNtVjJaV0psYkc5M1kyMWlZbkpsZG1WamJXSmljbVYyWldsdWRtVnlkR1ZrWW1Wc2IzZGpiV0ppY21WMlpXbHVkbVZ5ZEdWa1kyMWlZbkpsZG1WcGJuWmxjblJsWkdSdmRXSnNaV050WW1KeWFXUm5aV0psYkc5M1kyMWlZbkpwWkdkbGFXNTJaWEowWldSaVpXeHZkMk50WW1KemRISnZhMlZpYzNWd1pYSnBiM0ppZEc5d1ltRnlZblZvYVhKaFoyRnVZV0oxYTJGMFlXdGhibUZpZFd4c1pYUnBiblpsY25ObFluVnNiR1YwYjNCbGNtRjBiM0ppZFd4c2MyVjVaV05oWVhKdFpXNXBZVzVqWVdKbGJtZGhiR2xqWVdSbGRtRmpZV2QxYW1GeVlYUnBZMkZuZFhKdGRXdG9hV05oYkhOeGRXRnlaV05oYm1SeVlXSnBibVIxWW1WdVoyRnNhV05oYm1SeVlXSnBibVIxWTIxaVkyRnVaSEpoWW1sdVpIVmtaWFpoWTJGdVpISmhZbWx1WkhWbmRXcGhjbUYwYVdOaGNHbDBZV3hqYjIxd2QyOXlaRzFoY210allYQnpiRzlqYTJOaGNtVnZabU5oY205dVltVnNiM2RqYldKallYSnZibU50WW1OaWIzQnZiVzltYjJOalpXUnBiR3hoWVdOMWRHVmpZMmx5WTJ4bFkyTnBjbU4xYldac1pYaGpZM1Z5YkdOa2IzUmpaRzkwWVdOalpXNTBZMlJ6Y1hWaGNtVmpaV1JwYkd4aFkyMWlZMlZwYkdsdVoyeGxablJqWldsc2FXNW5iR1ZtZEVKcFoyTmxhV3hwYm1kc1pXWjBRbWxuWjJObGFXeHBibWRzWldaMFltbG5ZMlZwYkdsdVoyeGxablJpYVdkblkyVnBiR2x1WjNKcFoyaDBZMlZwYkdsdVozSnBaMmgwUW1sblkyVnBiR2x1WjNKcFoyaDBRbWxuWjJObGFXeHBibWR5YVdkb2RHSnBaMk5sYVd4cGJtZHlhV2RvZEdKcFoyZGpaVzUwYVdkeVlXUmxZMlZ1ZEdsdVptVnlhVzl5WTJWdWRHMXZibTl6Y0dGalpXTmxiblJ2YkdSemRIbHNaV05sYm5SemRYQmxjbWx2Y21Ob1lXRnliV1Z1YVdGdVkyaGhZbVZ1WjJGc2FXTm9ZV1JsZG1GamFHRm5kV3BoY21GMGFXTm9ZV2QxY20xMWEyaHBZMmhpYjNCdmJXOW1iMk5vWldGaWEyaGhjMmxoYm1ONWNtbHNiR2xqWTJobFkydGphR1ZqYTIxaGNtdGphR1ZqZVhKcGJHeHBZMk5vWldSbGMyTmxibVJsY21GaWEyaGhjMmxoYm1ONWNtbHNiR2xqWTJobFpHVnpZMlZ1WkdWeVkzbHlhV3hzYVdOamFHVmthV1Z5WlhOcGMyTjVjbWxzYkdsalkyaGxhR0Z5YldWdWFXRnVZMmhsYTJoaGEyRnpjMmxoYm1ONWNtbHNiR2xqWTJobGRtVnlkR2xqWVd4emRISnZhMlZqZVhKcGJHeHBZMk5vYVdWMVkyaGhZMmx5WTJ4bGEyOXlaV0Z1WTJocFpYVmphR0Z3WVhKbGJtdHZjbVZoYm1Ob2FXVjFZMmhqYVhKamJHVnJiM0psWVc1amFHbGxkV05vYTI5eVpXRnVZMmhwWlhWamFIQmhjbVZ1YTI5eVpXRnVZMmh2WTJoaGJtZDBhR0ZwWTJodlkyaGhiblJvWVdsamFHOWphR2x1WjNSb1lXbGphRzlqYUc5bGRHaGhhV05vYjI5clkybGxkV05oWTJseVkyeGxhMjl5WldGdVkybGxkV05oY0dGeVpXNXJiM0psWVc1amFXVjFZMk5wY21Oc1pXdHZjbVZoYm1OcFpYVmphMjl5WldGdVkybGxkV053WVhKbGJtdHZjbVZoYm1OcFpYVmpkWEJoY21WdWEyOXlaV0Z1WTJseVkyeGxZMmx5WTJ4bFVtTnBjbU5zWlZOamFYSmpiR1ZoYzNSbGNtbHphMk5wY21Oc1pXTnZjSGx5ZEdOcGNtTnNaV1JwZG1sa1pXTnBjbU5zWldSdmRHTnBjbU5zWldSdmRHUnBjM0JzWVhsamFYSmpiR1ZrYjNSMFpYaDBZMmx5WTJ4bFpYRjFZV3hqYVhKamJHVnRhVzUxYzJOcGNtTnNaVzExYkhScGNHeDVaR2x6Y0d4aGVXTnBjbU5zWlcxMWJIUnBjR3g1ZEdWNGRHTnBjbU5zWlc5MFkybHlZMnhsY0d4MWMyUnBjM0JzWVhsamFYSmpiR1Z3YkhWemRHVjRkR05wY21Oc1pYQnZjM1JoYkcxaGNtdGphWEpqYkdWeWFXNW5ZMmx5WTJ4bGQybDBhR3hsWm5Sb1lXeG1ZbXhoWTJ0amFYSmpiR1YzYVhSb2NtbG5hSFJvWVd4bVlteGhZMnRqYVhKamRXMW1iR1Y0WW1Wc2IzZGpiV0pqYVhKamRXMW1iR1Y0WTIxaVkyeGxZWEpqYkdsamEyRnNkbVZ2YkdGeVkyeHBZMnRrWlc1MFlXeGpiR2xqYTJ4aGRHVnlZV3hqYkdsamEzSmxkSEp2Wm14bGVHTnNiMk5yZDJselpXTnNkV0p6ZFdsMFlteGhZMnRqYkhWaWMzVnBkSGRvYVhSbFkyMWpkV0psWkhOeGRXRnlaV050YjI1dmMzQmhZMlZqYlhOeGRXRnlaV1J6Y1hWaGNtVmpiMkZ5YldWdWFXRnVZMjlzYjI1dGIyNWxkR0Z5ZVdOdmJHOXViVzl1YjNOd1lXTmxZMjlzYjI1emFXZHVZMjlzYjI1emJXRnNiR052Ykc5dWRISnBZVzVuZFd4aGNtaGhiR1p0YjJSamIyeHZiblJ5YVdGdVozVnNZWEp0YjJSamIyMXRZV0ZpYjNabFkyMWlZMjl0YldGaFltOTJaWEpwWjJoMFkyMWlZMjl0YldGaGNtRmlhV05qYjIxdFlXRnliV1Z1YVdGdVkyOXRiV0ZwYm1abGNtbHZjbU52YlcxaGJXOXViM053WVdObFkyOXRiV0Z5WlhabGNuTmxaR0ZpYjNabFkyMWlZMjl0YldGeVpYWmxjbk5sWkcxdlpHTnZiVzFoYzIxaGJHeGpiMjF0WVhOMWNHVnlhVzl5WTI5dGJXRjBkWEp1WldSaFltOTJaV050WW1OdmJXMWhkSFZ5Ym1Wa2JXOWtZMjl0Y0dGemMyTnZiWEJzWlcxbGJuUmpiMjF3ZDI5eVpHMWhjbXRqYjI1MGFXNTBaV2R5WVd4a2FYTndiR0Y1WTI5dWRHbHVkR1ZuY21Gc2RHVjRkR052Ym5SdmRYSnBiblJsWjNKaGJHTnZiblJ5YjJ4amIyNTBjbTlzUVVOTFkyOXVkSEp2YkVKRlRHTnZiblJ5YjJ4Q1UyTnZiblJ5YjJ4RFFVNWpiMjUwY205c1ExSmpiMjUwY205c1JFTXhZMjl1ZEhKdmJFUkRNbU52Ym5SeWIyeEVRek5qYjI1MGNtOXNSRU0wWTI5dWRISnZiRVJGVEdOdmJuUnliMnhFVEVWamIyNTBjbTlzUlUxamIyNTBjbTlzUlU1UlkyOXVkSEp2YkVWUFZHTnZiblJ5YjJ4RlUwTmpiMjUwY205c1JWUkNZMjl1ZEhKdmJFVlVXR052Ym5SeWIyeEdSbU52Ym5SeWIyeEdVMk52Ym5SeWIyeEhVMk52Ym5SeWIyeElWR052Ym5SeWIyeE1SbU52Ym5SeWIyeE9RVXRqYjI1MGNtOXNUbFZNVEdOdmJuUnliMnhTVTJOdmJuUnliMnhUU1dOdmJuUnliMnhUVDJOdmJuUnliMnhUVDFSamIyNTBjbTlzVTFSWVkyOXVkSEp2YkZOVlFtTnZiblJ5YjJ4VFdVNWpiMjUwY205c1ZWTmpiMjUwY205c1ZsUmpiM0J5YjJSMVkzUmpiM0J5YjJSMVkzUmthWE53YkdGNVkyOXdjbTlrZFdOMGRHVjRkR052Y201bGNtSnlZV05yWlhSc1pXWjBZMjl5Ym1WeVluSmhZMnRsZEd4bFpuUm9ZV3htZDJsa2RHaGpiM0p1WlhKaWNtRmphMlYwYkdWbWRIWmxjblJwWTJGc1kyOXlibVZ5WW5KaFkydGxkSEpwWjJoMFkyOXlibVZ5WW5KaFkydGxkSEpwWjJoMGFHRnNabmRwWkhSb1kyOXlibVZ5WW5KaFkydGxkSEpwWjJoMGRtVnlkR2xqWVd4amIzSndiM0poZEdsdmJuTnhkV0Z5WldOdmMzRjFZWEpsWTI5MlpYSnJaM054ZFdGeVpXTndZWEpsYm1OeWRYcGxhWEp2WTNOMGNtVjBZMmhsWkdOMFkzVnliSGxoYm1SamRYSnNlV3hsWm5SamRYSnNlVzl5WTNWeWJIbHlhV2RvZEdOM2JXTjVja0p5WlhabFkzbHlSbXhsZUdONWNtSnlaWFpsWTNseVpteGxlR1JoWVhKdFpXNXBZVzVrWVdKbGJtZGhiR2xrWVdSaGNtRmlhV05rWVdSbGRtRmtZV1JtYVc1aGJHRnlZV0pwWTJSaFpHbHVhWFJwWVd4aGNtRmlhV05rWVdSdFpXUnBZV3hoY21GaWFXTmtZV2RsYzJoa1lXZGxjMmhvWldKeVpYZGtZV2QxYW1GeVlYUnBaR0ZuZFhKdGRXdG9hV1JoYUdseVlXZGhibUZrWVd0aGRHRnJZVzVoWkdGc1lYSmhZbWxqWkdGc1pYUmtZV3hsZEdSaFoyVnphR1JoYkdWMFpHRm5aWE5vYUdWaWNtVjNaR0ZzWlhSb1pHRnNaWFJvWVhSaFpuQmhkR0ZvWkdGc1pYUm9ZWFJoWm5CaGRHRm9hR1ZpY21WM1pHRnNaWFJvWVhSaFpuTmxaMjlzWkdGc1pYUm9ZWFJoWm5ObFoyOXNhR1ZpY21WM1pHRnNaWFJvWldKeVpYZGtZV3hsZEdocGNtbHhaR0ZzWlhSb2FYSnBjV2hsWW5KbGQyUmhiR1YwYUc5c1lXMWtZV3hsZEdodmJHRnRhR1ZpY21WM1pHRnNaWFJ3WVhSaGFHUmhiR1YwY0dGMFlXaG9aV0p5Wlhka1lXeGxkSEZoYldGMGMyUmhiR1YwY1dGdFlYUnphR1ZpY21WM1pHRnNaWFJ4ZFdKMWRITmtZV3hsZEhGMVluVjBjMmhsWW5KbGQyUmhiR1YwYzJWbmIyeGtZV3hsZEhObFoyOXNhR1ZpY21WM1pHRnNaWFJ6YUdWMllXUmhiR1YwYzJobGRtRm9aV0p5Wlhka1lXeGxkSFJ6WlhKbFpHRnNaWFIwYzJWeVpXaGxZbkpsZDJSaGJHWnBibUZzWVhKaFltbGpaR0Z0YldGaGNtRmlhV05rWVcxdFlXeHZkMkZ5WVdKcFkyUmhiVzFoZEdGdVlXeDBiMjVsWVhKaFltbGpaR0Z0YldGMFlXNWhjbUZpYVdOa1lXNWtZV1JoY21kaGFHVmljbVYzWkdGeVoyRnNaV1owYUdWaWNtVjNaR0Z6YVdGd2JtVjFiV0YwWVdONWNtbHNiR2xqWTIxaVpHSmhjbVJpYkVkeVlYWmxaR0pzWVc1bmJHVmljbUZqYTJWMGJHVm1kR1JpYkdGdVoyeGxZbkpoWTJ0bGRHeGxablIyWlhKMGFXTmhiR1JpYkdGdVoyeGxZbkpoWTJ0bGRISnBaMmgwWkdKc1lXNW5iR1ZpY21GamEyVjBjbWxuYUhSMlpYSjBhV05oYkdSaWJHRnlZMmhwYm5abGNuUmxaR0psYkc5M1kyMWlaR0pzWVhKeWIzZGtkMjVrWW14aGNuSnZkMmhsWVdSc1pXWjBaR0pzWVhKeWIzZG9aV0ZrY21sbmFIUmtZbXhoY25KdmQyeGxablJrWW14aGNuSnZkM0pwWjJoMFpHSnNZWEp5YjNkMWNHUmliR0p5WVdOclpYUnNaV1owWkdKc1luSmhZMnRsZEhKcFoyaDBaR0pzWkdGdVpHRmtZbXhuY21GMlpXUmliR2R5WVhabFkyMWlaR0pzYVc1MFpXZHlZV3hrWW14c2IzZHNhVzVsWkdKc2JHOTNiR2x1WldOdFltUmliRzkyWlhKc2FXNWxZMjFpWkdKc2NISnBiV1Z0YjJSa1lteDJaWEowYVdOaGJHSmhjbVJpYkhabGNuUnBZMkZzYkdsdVpXRmliM1psWTIxaVpHSnZjRzl0YjJadlpHSnpjWFZoY21Wa1kyVmthV3hzWVdSamFYSmpiR1ZrWTJseVkzVnRabXhsZUdKbGJHOTNaR1JoWW1WdVoyRnNhV1JrWVdSbGRtRmtaR0ZuZFdwaGNtRjBhV1JrWVdkMWNtMTFhMmhwWkdSaGJHRnlZV0pwWTJSa1lXeG1hVzVoYkdGeVlXSnBZMlJrWkdoaFpHVjJZV1JrYUdGaVpXNW5ZV3hwWkdSb1lXUmxkbUZrWkdoaFozVnFZWEpoZEdsa1pHaGhaM1Z5YlhWcmFHbGtaRzkwWVdOalpXNTBaR1J2ZEdKbGJHOTNaR1ZqYVcxaGJITmxjR0Z5WVhSdmNtRnlZV0pwWTJSbFkybHRZV3h6WlhCaGNtRjBiM0p3WlhKemFXRnVaR1ZqZVhKcGJHeHBZMlJsWm1sdVpYTmtaV2hwYUdWaWNtVjNaR1ZvYVhKaFoyRnVZV1JsYVdOdmNIUnBZMlJsYTJGMFlXdGhibUZrWld4bGRHVnNaV1owWkdWc1pYUmxjbWxuYUhSa1pXeDBZWFIxY201bFpHUmxibTl0YVc1aGRHOXliV2x1ZFhOdmJtVnVkVzFsY21GMGIzSmlaVzVuWVd4cFpHVjZhR1JvWVdKbGJtZGhiR2xrYUdGa1pYWmhaR2hoWjNWcVlYSmhkR2xrYUdGbmRYSnRkV3RvYVdSb2IyOXJaR2xoYkhsMGFXdGhkRzl1YjNOa2FXRnNlWFJwYTJGMGIyNXZjMk50WW1ScFlXMXZibVJ0WVhSb1pHbGhiVzl1WkhOdmJHbGtaR2xoYlc5dVpITjFhWFIzYUdsMFpXUnBaWEpsYzJsellXTjFkR1ZrYVdWeVpYTnBjMkpsYkc5M1kyMWlaR2xsY21WemFYTmpiV0prYVdWeVpYTnBjMmR5WVhabFpHbGxjbVZ6YVhOMGIyNXZjMlJwWm1abGNtVnVZMlZrYVdocGNtRm5ZVzVoWkdscllYUmhhMkZ1WVdScGRIUnZiV0Z5YTJScGRtbGtaVzExYkhScGNHeDVaR2wyYVdSbGMyUnBkbWx6YVc5dWMyeGhjMmhrYW1WamVYSnBiR3hwWTJScmMyaGhaR1ZrYkdsdVpXSmxiRzkzWkd4emNYVmhjbVZrYldGamNtOXVaRzF2Ym05emNHRmpaV1J1WW14dlkydGtiMk5vWVdSaGRHaGhhV1J2WkdWcmRHaGhhV1J2YUdseVlXZGhibUZrYjJ0aGRHRnJZVzVoWkc5c2JHRnlhVzVtWlhKcGIzSmtiMnhzWVhKdGIyNXZjM0JoWTJWa2IyeHNZWEp2YkdSemRIbHNaV1J2Ykd4aGNuTnRZV3hzWkc5c2JHRnljM1Z3WlhKcGIzSmtiMjVuWkc5eWRYTnhkV0Z5WldSdmRHRmpZMlZ1ZEdOdFltUnZkR0psYkc5M1kyMWlaRzkwWW1Wc2IzZGpiMjFpWkc5MGEyRjBZV3RoYm1Ga2IzUnNaWE56YW1SdmRHeGxjM05xYzNSeWIydGxhRzl2YTJSdmRIQnNkWE5rYjNSMFpXUmphWEpqYkdWa2IzVmliR1Y1YjJSd1lYUmhhR1J2ZFdKc1pYbHZaSEJoZEdGb2FHVmljbVYzWkc5M2JtWmhiR3hrYjNkdWMyeHZjR1ZrYjNkdWRHRmphMkpsYkc5M1kyMWlaRzkzYm5SaFkydHRiMlJrY0dGeVpXNWtjM1Z3WlhKcGIzSmtkR0ZwYkdSMGIzQmlZWEprZFdocGNtRm5ZVzVoWkhWcllYUmhhMkZ1WVdSNlpIcGhiSFJ2Ym1Wa2VtTmhjbTl1WkhwamRYSnNaSHBsWVdKcmFHRnphV0Z1WTNseWFXeHNhV05rZW1WamVYSnBiR3hwWTJSNmFHVmplWEpwYkd4cFkyVmhjblJvWldKbGJtZGhiR2xsWW05d2IyMXZabTlsWW5KbGRtVmxZMkZ1WkhKaFpHVjJZV1ZqWVc1a2NtRm5kV3BoY21GMGFXVmpZVzVrY21GMmIzZGxiSE5wWjI1a1pYWmhaV05oYm1SeVlYWnZkMlZzYzJsbmJtZDFhbUZ5WVhScFpXTmxaR2xzYkdGaWNtVjJaV1ZqYUdGeWJXVnVhV0Z1WldOb2VXbDNibUZ5YldWdWFXRnVaV05wY21Oc1pXVmphWEpqZFcxbWJHVjRZV04xZEdWbFkybHlZM1Z0Wm14bGVHSmxiRzkzWldOcGNtTjFiV1pzWlhoa2IzUmlaV3h2ZDJWamFYSmpkVzFtYkdWNFozSmhkbVZsWTJseVkzVnRabXhsZUdodmIydGhZbTkyWldWamFYSmpkVzFtYkdWNGRHbHNaR1ZsWTNseWFXeHNhV05sWkdKc1ozSmhkbVZsWkdWMllXVmtiM1JsWkc5MFltVnNiM2RsWldkMWNtMTFhMmhwWldWdFlYUnlZV2QxY20xMWEyaHBaV1pqZVhKcGJHeHBZMlZuZFdwaGNtRjBhV1ZvWVhKdFpXNXBZVzVsYUdKdmNHOXRiMlp2WldocGNtRm5ZVzVoWldodmIydGhZbTkyWldWcFltOXdiMjF2Wm05bGFXZG9kR0Z5WVdKcFkyVnBaMmgwWW1WdVoyRnNhV1ZwWjJoMFkybHlZMnhsWldsbmFIUmphWEpqYkdWcGJuWmxjbk5sYzJGdWMzTmxjbWxtWldsbmFIUmtaWFpoWldsbmFIUmxaVzVqYVhKamJHVmxhV2RvZEdWbGJuQmhjbVZ1WldsbmFIUmxaVzV3WlhKcGIyUmxhV2RvZEdkMWFtRnlZWFJwWldsbmFIUm5kWEp0ZFd0b2FXVnBaMmgwYUdGamEyRnlZV0pwWTJWcFoyaDBhR0Z1WjNwb2IzVmxhV2RvZEdodWIzUmxZbVZoYldWa1pXbG5hSFJwWkdWdlozSmhjR2hwWTNCaGNtVnVaV2xuYUhScGJtWmxjbWx2Y21WcFoyaDBiVzl1YjNOd1lXTmxaV2xuYUhSdmJHUnpkSGxzWldWcFoyaDBjR0Z5Wlc1bGFXZG9kSEJsY21sdlpHVnBaMmgwY0dWeWMybGhibVZwWjJoMGNtOXRZVzVsYVdkb2RITjFjR1Z5YVc5eVpXbG5hSFIwYUdGcFpXbHVkbVZ5ZEdWa1luSmxkbVZsYVc5MGFXWnBaV1JqZVhKcGJHeHBZMlZyWVhSaGEyRnVZV1ZyWVhSaGEyRnVZV2hoYkdaM2FXUjBhR1ZyYjI1cllYSm5kWEp0ZFd0b2FXVnJiM0psWVc1bGJHTjVjbWxzYkdsalpXeGxkbVZ1WTJseVkyeGxaV3hsZG1WdWNHRnlaVzVsYkdWMlpXNXdaWEpwYjJSbGJHVjJaVzV5YjIxaGJtVnNiR2x3YzJsemRtVnlkR2xqWVd4bGJXRmpjbTl1WVdOMWRHVmxiV0ZqY205dVozSmhkbVZsYldONWNtbHNiR2xqWlcxa1lYTm9kbVZ5ZEdsallXeGxiVzl1YjNOd1lXTmxaVzF3YUdGemFYTnRZWEpyWVhKdFpXNXBZVzVsYlhCMGVYTnNiM1JsYm1KdmNHOXRiMlp2Wlc1amVYSnBiR3hwWTJWdVpHRnphSFpsY25ScFkyRnNaVzVrWlhOalpXNWtaWEpqZVhKcGJHeHBZMlZ1WjJWdVoySnZjRzl0YjJadlpXNW5hR1ZqZVhKcGJHeHBZMlZ1YUc5dmEyTjVjbWxzYkdsalpXNXpjR0ZqWldWdmEyOXlaV0Z1Wlc5d1pXNWxiM0JsYm1Oc2IzTmxaR1Z2Y0dWdWNtVjJaWEp6WldSbGIzQmxibkpsZG1WeWMyVmtZMnh2YzJWa1pXOXdaVzV5WlhabGNuTmxaR2h2YjJ0bGNHRnlaVzVsY0hOcGJHOXVNV1Z3YzJsc2IyNXBiblpsY0hOcGJHOXVkRzl1YjNObGNYVmhiR1J2ZEd4bFpuUnlhV2RvZEdWeGRXRnNaRzkwY21sbmFIUnNaV1owWlhGMVlXeHRZWFJvWlhGMVlXeHRiMjV2YzNCaFkyVmxjWFZoYkc5eVptOXNiRzkzYzJWeGRXRnNiM0puY21WaGRHVnlaWEYxWVd4dmNteGxjM05sY1hWaGJHOXljSEpsWTJWa1pYTmxjWFZoYkc5eWMybHRhV3hoY21WeGRXRnNjMlJ2ZEhObGNYVmhiSE50WVd4c1pYRjFZV3h6ZFhCbGNtbHZjbVZ4ZFdsMllYTjViWEIwYjNScFkyVnlZbTl3YjIxdlptOWxjbU41Y21sc2JHbGpaWEpsZG1WeWMyVmtaWEpsZG1WeWMyVmtZM2x5YVd4c2FXTmxjMk41Y21sc2JHbGpaWE5rWlhOalpXNWtaWEpqZVhKcGJHeHBZMlZ6YUdWemFHTjFjbXhsYzJodmNuUmtaWFpoWlhOb2IzSjBkbTkzWld4emFXZHVaR1YyWVdWemFISmxkbVZ5YzJWa2JHOXZjR1Z6YUhOeGRXRjBjbVYyWlhKelpXUmxjMjFoYkd4b2FYSmhaMkZ1WVdWemJXRnNiR3RoZEdGcllXNWhaWE50WVd4c2EyRjBZV3RoYm1Gb1lXeG1kMmxrZEdobGMzUnBiV0YwWldSbGMzVndaWEpwYjNKbGRHRnliV1Z1YVdGdVpYUmhkRzl1YjNObGRHbHNaR1ZsZEdsc1pHVmlaV3h2ZDJWMGJtRm9kR0ZtYjNWcmFHaGxZbkpsZDJWMGJtRm9kR0ZtYjNWcmFHeGxablJvWldKeVpYZGxkRzVoYUhSaGFHVmljbVYzWlhSdVlXaDBZV3hsWm5Sb1pXSnlaWGRsZEhWeWJtVmtaWFZyYjNKbFlXNWxkWEp2WlhadmQyVnNjMmxuYm1KbGJtZGhiR2xsZG05M1pXeHphV2R1WkdWMllXVjJiM2RsYkhOcFoyNW5kV3BoY21GMGFXVjRZMnhoYldGeWJXVnVhV0Z1WlhoamJHRnRaR0pzWlhoamJHRnRaRzkzYm5OdFlXeHNaWGhqYkdGdGJXOXViM053WVdObFpYaGpiR0Z0YzIxaGJHeGxlbWhsZW1oallYSnZibVY2YUdOMWNteGxlbWh5WlhabGNuTmxaR1Y2YUhSaGFXeG1YMlptWDJaZmFXWmZabDlzWmw5cFpsOXNabUZrWlhaaFptRm5kWEp0ZFd0b2FXWmhhSEpsYm1obGFYUm1ZWFJvWVdGeVlXSnBZMlpoZEdoaGJHOTNZWEpoWW1salptRjBhR0YwWVc1aGNtRmlhV05tWW05d2IyMXZabTltWTJseVkyeGxabVJ2ZEdGalkyVnVkR1psYUdGeVlXSnBZMlpsYUdGeWJXVnVhV0Z1Wm1Wb1ptbHVZV3hoY21GaWFXTm1aV2hwYm1sMGFXRnNZWEpoWW1salptVm9iV1ZrYVdGc1lYSmhZbWxqWm1WcFkyOXdkR2xqWm1WdFlXeGxabVptWm1sbVpteG1hV1owWldWdVkybHlZMnhsWm1sbWRHVmxibkJoY21WdVptbG1kR1ZsYm5CbGNtbHZaR1pwWjNWeVpXUmhjMmhtYVd4c1pXUmliM2htYVd4c1pXUnlaV04wWm1sdVlXeHJZV1ptYVc1aGJHdGhabVJoWjJWemFHWnBibUZzYTJGbVpHRm5aWE5vYUdWaWNtVjNabWx1WVd4cllXWm9aV0p5WlhkbWFXNWhiR3RoWm5GaGJXRjBjMlpwYm1Gc2EyRm1jV0Z0WVhSemFHVmljbVYzWm1sdVlXeHJZV1p6YUdWMllXWnBibUZzYTJGbWMyaGxkbUZvWldKeVpYZG1hVzVoYkcxbGJXWnBibUZzYldWdGFHVmljbVYzWm1sdVlXeHVkVzVtYVc1aGJHNTFibWhsWW5KbGQyWnBibUZzY0dWbWFXNWhiSEJsYUdWaWNtVjNabWx1WVd4MGMyRmthV1pwYm1Gc2RITmhaR2xvWldKeVpYZG1hWEp6ZEhSdmJtVmphR2x1WlhObFptbHphR1Y1WldacGRHRmplWEpwYkd4cFkyWnBkbVZoY21GaWFXTm1hWFpsWW1WdVoyRnNhV1pwZG1WamFYSmpiR1ZtYVhabFkybHlZMnhsYVc1MlpYSnpaWE5oYm5OelpYSnBabVpwZG1Wa1pYWmhabWwyWldWcFoyaDBhSE5tYVhabFozVnFZWEpoZEdsbWFYWmxaM1Z5YlhWcmFHbG1hWFpsYUdGamEyRnlZV0pwWTJacGRtVm9ZVzVuZW1odmRXWnBkbVZwWkdWdlozSmhjR2hwWTNCaGNtVnVabWwyWldsdVptVnlhVzl5Wm1sMlpXMXZibTl6Y0dGalpXWnBkbVZ2YkdSemRIbHNaV1pwZG1Wd1lYSmxibVpwZG1Wd1pYSnBiMlJtYVhabGNHVnljMmxoYm1acGRtVnliMjFoYm1acGRtVnpkWEJsY21sdmNtWnBkbVYwYUdGcFpteGhkR1pzYjI5eWJHVm1kR1pzYjI5eWJHVm1kRUpwWjJac2IyOXliR1ZtZEVKcFoyZG1iRzl2Y214bFpuUmlhV2RtYkc5dmNteGxablJpYVdkblpteHZiM0p5YVdkb2RHWnNiMjl5Y21sbmFIUkNhV2RtYkc5dmNuSnBaMmgwUW1sbloyWnNiMjl5Y21sbmFIUmlhV2RtYkc5dmNuSnBaMmgwWW1sbloyWnRiMjV2YzNCaFkyVm1iWE54ZFdGeVpXWnZabUZ1ZEdoaGFXWnZabUYwYUdGcFptOXNiRzkzYm05MFpHSnNaWEYyWm05c2JHOTNibTkwYzJ4dWRHVnhiR1p2Ykd4dmQyOXlibTkwWlhGMmJHNTBabTlzYkc5M2MyWnZiR3h2ZDNObGNYVmhiR1p2Ykd4dmQzTnZjbU4xY214NVptOXNiRzkzYzI5eVpYRjFZV3htYjI1bmJXRnVkR2hoYVdadmNtRnNiR1p2Y21ObGMyWnZjbU5sYzJKaGNtWnZjbXRtYjNWeVlYSmhZbWxqWm05MWNtSmxibWRoYkdsbWIzVnlZMmx5WTJ4bFptOTFjbU5wY21Oc1pXbHVkbVZ5YzJWellXNXpjMlZ5YVdabWIzVnlaR1YyWVdadmRYSm5kV3BoY21GMGFXWnZkWEpuZFhKdGRXdG9hV1p2ZFhKb1lXTnJZWEpoWW1salptOTFjbWhoYm1kNmFHOTFabTkxY21sa1pXOW5jbUZ3YUdsamNHRnlaVzVtYjNWeWFXNW1aWEpwYjNKbWIzVnliVzl1YjNOd1lXTmxabTkxY201MWJXVnlZWFJ2Y21KbGJtZGhiR2xtYjNWeWIyeGtjM1I1YkdWbWIzVnljR0Z5Wlc1bWIzVnljR1Z5YVc5a1ptOTFjbkJsY25OcFlXNW1iM1Z5Y205dFlXNW1iM1Z5YzNWd1pYSnBiM0ptYjNWeWRHVmxibU5wY21Oc1pXWnZkWEowWldWdWNHRnlaVzVtYjNWeWRHVmxibkJsY21sdlpHWnZkWEowYUdGcFptOTFjblJvZEc5dVpXTm9hVzVsYzJWbWNHRnlaVzVtY21GdVkyWnliM2R1WjJGaVpXNW5ZV3hwWjJGamRYUmxaMkZrWlhaaFoyRm1ZWEpoWW1saloyRm1abWx1WVd4aGNtRmlhV05uWVdacGJtbDBhV0ZzWVhKaFltbGpaMkZtYldWa2FXRnNZWEpoWW1saloyRm5kV3BoY21GMGFXZGhaM1Z5YlhWcmFHbG5ZV2hwY21GbllXNWhaMkZyWVhSaGEyRnVZV2RoYlcxaGJHRjBhVzV6YldGc2JHZGhiVzFoYzNWd1pYSnBiM0puWVc1bmFXRmpiM0IwYVdOblltOXdiMjF2Wm05blkyRnliMjVuWTJWa2FXeHNZV2RqYVhKamJHVm5ZMmx5WTNWdFpteGxlR2RrYjNSblpHOTBZV05qWlc1MFoyVmplWEpwYkd4cFkyZGxhR2x5WVdkaGJtRm5aV3RoZEdGcllXNWhaMlZ2YldWeGRXbDJZV3hsYm5SblpXOXRaWFJ5YVdOaGJHeDVaWEYxWVd4blpYSmxjMmhoWTJObGJuUm9aV0p5WlhkblpYSmxjMmhvWldKeVpYZG5aWEpsYzJodGRYRmtZVzFvWldKeVpYZG5aWEp6YUdGNWFXMWhZMk5sYm5Sb1pXSnlaWGRuWlhKemFHRjVhVzFvWldKeVpYZG5aWFJoYldGeWEyZG9ZV0psYm1kaGJHbG5hR0ZrWVhKdFpXNXBZVzVuYUdGa1pYWmhaMmhoWjNWcVlYSmhkR2xuYUdGbmRYSnRkV3RvYVdkb1lXbHVZWEpoWW1saloyaGhhVzVtYVc1aGJHRnlZV0pwWTJkb1lXbHVhVzVwZEdsaGJHRnlZV0pwWTJkb1lXbHViV1ZrYVdGc1lYSmhZbWxqWjJobGJXbGtaR3hsYUc5dmEyTjVjbWxzYkdsaloyaGxjM1J5YjJ0bFkzbHlhV3hzYVdObmFHVjFjSFIxY201amVYSnBiR3hwWTJkb2FHRmtaWFpoWjJob1lXZDFjbTExYTJocFoyaHZiMnRuYUhwemNYVmhjbVZuYVdocGNtRm5ZVzVoWjJscllYUmhhMkZ1WVdkcGJXRnliV1Z1YVdGdVoybHRaV3huYVcxbGJHUmhaMlZ6YUdkcGJXVnNaR0ZuWlhOb2FHVmljbVYzWjJsdFpXeG9aV0p5WlhkbmFtVmplWEpwYkd4cFkyZHNiM1IwWVd4cGJuWmxjblJsWkhOMGNtOXJaV2RzYjNSMFlXeHpkRzl3WjJ4dmRIUmhiSE4wYjNCcGJuWmxjblJsWkdkc2IzUjBZV3h6ZEc5d2JXOWtaMnh2ZEhSaGJITjBiM0J5WlhabGNuTmxaR2RzYjNSMFlXeHpkRzl3Y21WMlpYSnpaV1J0YjJSbmJHOTBkR0ZzYzNSdmNISmxkbVZ5YzJWa2MzVndaWEpwYjNKbmJHOTBkR0ZzYzNSdmNITjBjbTlyWldkc2IzUjBZV3h6ZEc5d2MzUnliMnRsY21WMlpYSnpaV1JuYldGamNtOXVaMjF2Ym05emNHRmpaV2R2YUdseVlXZGhibUZuYjJ0aGRHRnJZVzVoWjNCaGNtVnVaM0JoYzNGMVlYSmxaM0poZG1WaVpXeHZkMk50WW1keVlYWmxZMjFpWjNKaGRtVmpiMjFpWjNKaGRtVmtaWFpoWjNKaGRtVnNiM2R0YjJSbmNtRjJaVzF2Ym05emNHRmpaV2R5WVhabGRHOXVaV050WW1keVpXRjBaWEprWW14bGNXeHNaWE56WjNKbFlYUmxjbVJpYkdWeGRXRnNaM0psWVhSbGNtUnZkR2R5WldGMFpYSmxjWFZoYkc5eWJHVnpjMmR5WldGMFpYSnNaWE56WlhGMVlXeG5jbVZoZEdWeWJXOXViM053WVdObFozSmxZWFJsY20xMVkyaG5jbVZoZEdWeWJtOTBaR0pzWlhGMVlXeG5jbVZoZEdWeWJtOTBaWEYxWVd4bmNtVmhkR1Z5YjNKaGNIQnliM2hsY1d4bmNtVmhkR1Z5YjNKbGNYVmhiSE5zWVc1MFozSmxZWFJsY205eVpYRjFhWFpoYkdWdWRHZHlaV0YwWlhKdmNteGxjM05uY21WaGRHVnliM0p1YjNSa1lteGxjV3huY21WaGRHVnliM0p1YjNSbGNYVmhiR2R5WldGMFpYSnZjbk5wYldsc1lYSm5jbVZoZEdWeWIzWmxjbVZ4ZFdGc1ozSmxZWFJsY25OdFlXeHNaM05qY21sd2RHZHpkSEp2YTJWbmRXaHBjbUZuWVc1aFozVnJZWFJoYTJGdVlXZDFjbUZ0ZFhOeGRXRnlaV2Q1YzNGMVlYSmxhR0ZoWW10b1lYTnBZVzVqZVhKcGJHeHBZMmhoWVd4MGIyNWxZWEpoWW1samFHRmlaVzVuWVd4cGFHRmtaWE5qWlc1a1pYSmplWEpwYkd4cFkyaGhaR1YyWVdoaFozVnFZWEpoZEdsb1lXZDFjbTExYTJocGFHRm9ZWEpoWW1samFHRm9abWx1WVd4aGNtRmlhV05vWVdocGJtbDBhV0ZzWVhKaFltbGphR0ZvYVhKaFoyRnVZV2hoYUcxbFpHbGhiR0Z5WVdKcFkyaGhhWFIxYzNGMVlYSmxhR0ZyWVhSaGEyRnVZV2hoYTJGMFlXdGhibUZvWVd4bWQybGtkR2hvWVd4aGJuUm5kWEp0ZFd0b2FXaGhiWHBoWVhKaFltbGphR0Z0ZW1Ga1lXMXRZV0Z5WVdKcFkyaGhiWHBoWkdGdGJXRjBZVzVoY21GaWFXTm9ZVzE2WVdaaGRHaGhZWEpoWW1samFHRnRlbUZtWVhSb1lYUmhibUZ5WVdKcFkyaGhiWHBoYkc5M1lYSmhZbWxqYUdGdGVtRnNiM2RyWVhOeVlXRnlZV0pwWTJoaGJYcGhiRzkzYTJGemNtRjBZVzVoY21GaWFXTm9ZVzE2WVhOMWEzVnVZWEpoWW1samFHRnVaM1ZzWm1sc2JHVnlhR0Z5WkhOcFoyNWplWEpwYkd4cFkyaGhjbkJ2YjI1a2IzZHViR1ZtZEdoaGNuQnZiMjVrYjNkdWNtbG5hSFJvWVhKd2IyOXViR1ZtZEdKaGNtSjFjR2hoY25CdmIyNXNaV1owWkc5M2JtaGhjbkJ2YjI1c1pXWjBjbWxuYUhSb1lYSndiMjl1YkdWbWRIVndhR0Z5Y0c5dmJuSnBaMmgwWW1GeVluVndhR0Z5Y0c5dmJuSnBaMmgwWkc5M2JtaGhjbkJ2YjI1eWFXZG9kR3hsWm5Sb1lYSndiMjl1Y21sbmFIUjFjR2hoY25CdmIyNTFjR3hsWm5Sb1lYSndiMjl1ZFhCeWFXZG9kR2hoYzNGMVlYSmxhR0YwWVdad1lYUmhhR2hoZEdGbWNHRjBZV2d4Tm1oaGRHRm1jR0YwWVdneU0yaGhkR0ZtY0dGMFlXZ3labWhoZEdGbWNHRjBZV2hvWldKeVpYZG9ZWFJoWm5CaGRHRm9ibUZ5Y205M2FHVmljbVYzYUdGMFlXWndZWFJoYUhGMVlYSjBaWEpvWldKeVpYZG9ZWFJoWm5CaGRHRm9kMmxrWldobFluSmxkMmhoZEdGbWNXRnRZWFJ6YUdGMFlXWnhZVzFoZEhNeFltaGhkR0ZtY1dGdFlYUnpNamhvWVhSaFpuRmhiV0YwY3pNMGFHRjBZV1p4WVcxaGRITm9aV0p5Wlhkb1lYUmhabkZoYldGMGMyNWhjbkp2ZDJobFluSmxkMmhoZEdGbWNXRnRZWFJ6Y1hWaGNuUmxjbWhsWW5KbGQyaGhkR0ZtY1dGdFlYUnpkMmxrWldobFluSmxkMmhoZEdGbWMyVm5iMnhvWVhSaFpuTmxaMjlzTVRkb1lYUmhabk5sWjI5c01qUm9ZWFJoWm5ObFoyOXNNekJvWVhSaFpuTmxaMjlzYUdWaWNtVjNhR0YwWVdaelpXZHZiRzVoY25KdmQyaGxZbkpsZDJoaGRHRm1jMlZuYjJ4eGRXRnlkR1Z5YUdWaWNtVjNhR0YwWVdaelpXZHZiSGRwWkdWb1pXSnlaWGRvWVhSM2FXUmxhR0YwZDJsa1pYSm9ZWFIzYVdSbGNuSm9ZWFIzYVdSbGMzUm9ZbUZ5YUdKdmNHOXRiMlp2YUdKeVpYWmxZbVZzYjNkb1kyVmthV3hzWVdoamFYSmpiR1ZvWTJseVkzVnRabXhsZUdoa2FXVnlaWE5wYzJoa2IzUmhZMk5sYm5Sb1pHOTBZbVZzYjNkb1pXaGxZWEowYzNWcGRHSnNZV05yYUdWaGNuUnpkV2wwZDJocGRHVm9aV1JoWjJWemFHaGxaR0ZuWlhOb2FHVmljbVYzYUdWb1lXeDBiMjVsWVhKaFltbGphR1ZvWVhKaFltbGphR1ZvWldKeVpYZG9aV2htYVc1aGJHRnNkRzl1WldGeVlXSnBZMmhsYUdacGJtRnNZV3gwZEhkdllYSmhZbWxqYUdWb1ptbHVZV3hoY21GaWFXTm9aV2hvWVcxNllXRmliM1psWm1sdVlXeGhjbUZpYVdOb1pXaG9ZVzE2WVdGaWIzWmxhWE52YkdGMFpXUmhjbUZpYVdOb1pXaHBibWwwYVdGc1lXeDBiMjVsWVhKaFltbGphR1ZvYVc1cGRHbGhiR0Z5WVdKcFkyaGxhR2x5WVdkaGJtRm9aV2h0WldScFlXeGhiSFJ2Ym1WaGNtRmlhV05vWldodFpXUnBZV3hoY21GaWFXTm9aV2x6WldsbGNtRnpjWFZoY21Wb1pXdGhkR0ZyWVc1aGFHVnJZWFJoYTJGdVlXaGhiR1ozYVdSMGFHaGxhM1YwWVdGeWRYTnhkV0Z5WldobGJtZG9iMjlyYUdWeWRYUjFjM0YxWVhKbGFHVjBhR1YwYUdWaWNtVjNhR2h2YjJ0b2FHOXZhM04xY0dWeWFXOXlhR2xsZFdoaFkybHlZMnhsYTI5eVpXRnVhR2xsZFdoaGNHRnlaVzVyYjNKbFlXNW9hV1YxYUdOcGNtTnNaV3R2Y21WaGJtaHBaWFZvYTI5eVpXRnVhR2xsZFdod1lYSmxibXR2Y21WaGJtaHBhR2x5WVdkaGJtRm9hV3RoZEdGcllXNWhhR2xyWVhSaGEyRnVZV2hoYkdaM2FXUjBhR2hwY21seGFHbHlhWEV4TkdocGNtbHhNakZvYVhKcGNUSmthR2x5YVhGb1pXSnlaWGRvYVhKcGNXNWhjbkp2ZDJobFluSmxkMmhwY21seGNYVmhjblJsY21obFluSmxkMmhwY21seGQybGtaV2hsWW5KbGQyaHNhVzVsWW1Wc2IzZG9iVzl1YjNOd1lXTmxhRzloY20xbGJtbGhibWh2YUdsd2RHaGhhV2h2YUdseVlXZGhibUZvYjJ0aGRHRnJZVzVoYUc5cllYUmhhMkZ1WVdoaGJHWjNhV1IwYUdodmJHRnRhRzlzWVcweE9XaHZiR0Z0TWpab2IyeGhiVE15YUc5c1lXMW9aV0p5Wlhkb2IyeGhiVzVoY25KdmQyaGxZbkpsZDJodmJHRnRjWFZoY25SbGNtaGxZbkpsZDJodmJHRnRkMmxrWldobFluSmxkMmh2Ym05cmFIVnJkR2hoYVdodmIydGhZbTkyWldOdmJXSm9iMjlyWTIxaWFHOXZhMnhsWm5SamFHRnlhRzl2YTNCaGJHRjBZV3hwZW1Wa1ltVnNiM2RqYldKb2IyOXJjbVYwY205bWJHVjRZbVZzYjNkamJXSm9iMjlyY21sbmFIUmphR0Z5YUc5dmJuTnhkV0Z5WldodmNtbGpiM0IwYVdOb2IzSnBlbTl1ZEdGc1ltRnlhRzl5Ym1OdFltaHZkSE53Y21sdVozTm9iM1Z6Wldod1lYSmxibWh6ZFhCbGNtbHZjbWgwZFhKdVpXUm9kV2hwY21GbllXNWhhSFZwYVhSdmMzRjFZWEpsYUhWcllYUmhhMkZ1WVdoMWEyRjBZV3RoYm1Gb1lXeG1kMmxrZEdob2RXNW5ZWEoxYld4aGRYUmpiV0pvZG1oNWNHaGxiaTVoYkhSb2VYQm9aVzVqYUdGeWFIbHdhR1Z1YVc1bVpYSnBiM0pvZVhCb1pXNXRiMjV2YzNCaFkyVm9lWEJvWlc1emJXRnNiR2g1Y0dobGJuTjFjR1Z5YVc5eWFIbHdhR1Z1ZEhkdmFXRmplWEpwYkd4cFkybGlaVzVuWVd4cGFXSnZjRzl0YjJadmFXSnlaWFpsYVdOaGNtOXVhV05wY21Oc1pXbGplWEpwYkd4cFkybGtZbXhuY21GMlpXbGtaVzluY21Gd2FHVmhjblJvWTJseVkyeGxhV1JsYjJkeVlYQm9abWx5WldOcGNtTnNaV2xrWlc5bmNtRndhR2xqWVd4c2FXRnVZMlZ3WVhKbGJtbGtaVzluY21Gd2FHbGpZMkZzYkhCaGNtVnVhV1JsYjJkeVlYQm9hV05qWlc1MGNtVmphWEpqYkdWcFpHVnZaM0poY0docFkyTnNiM05sYVdSbGIyZHlZWEJvYVdOamIyMXRZV2xrWlc5bmNtRndhR2xqWTI5dGJXRnNaV1owYVdSbGIyZHlZWEJvYVdOamIyNW5jbUYwZFd4aGRHbHZibkJoY21WdWFXUmxiMmR5WVhCb2FXTmpiM0p5WldOMFkybHlZMnhsYVdSbGIyZHlZWEJvYVdObFlYSjBhSEJoY21WdWFXUmxiMmR5WVhCb2FXTmxiblJsY25CeWFYTmxjR0Z5Wlc1cFpHVnZaM0poY0docFkyVjRZMlZzYkdWdWRHTnBjbU5zWldsa1pXOW5jbUZ3YUdsalptVnpkR2wyWVd4d1lYSmxibWxrWlc5bmNtRndhR2xqWm1sdVlXNWphV0ZzWTJseVkyeGxhV1JsYjJkeVlYQm9hV05tYVc1aGJtTnBZV3h3WVhKbGJtbGtaVzluY21Gd2FHbGpabWx5WlhCaGNtVnVhV1JsYjJkeVlYQm9hV05vWVhabGNHRnlaVzVwWkdWdlozSmhjR2hwWTJocFoyaGphWEpqYkdWcFpHVnZaM0poY0docFkybDBaWEpoZEdsdmJtMWhjbXRwWkdWdlozSmhjR2hwWTJ4aFltOXlZMmx5WTJ4bGFXUmxiMmR5WVhCb2FXTnNZV0p2Y25CaGNtVnVhV1JsYjJkeVlYQm9hV05zWldaMFkybHlZMnhsYVdSbGIyZHlZWEJvYVdOc2IzZGphWEpqYkdWcFpHVnZaM0poY0docFkyMWxaR2xqYVc1bFkybHlZMnhsYVdSbGIyZHlZWEJvYVdOdFpYUmhiSEJoY21WdWFXUmxiMmR5WVhCb2FXTnRiMjl1Y0dGeVpXNXBaR1Z2WjNKaGNHaHBZMjVoYldWd1lYSmxibWxrWlc5bmNtRndhR2xqY0dWeWFXOWthV1JsYjJkeVlYQm9hV053Y21sdWRHTnBjbU5zWldsa1pXOW5jbUZ3YUdsamNtVmhZMmh3WVhKbGJtbGtaVzluY21Gd2FHbGpjbVZ3Y21WelpXNTBjR0Z5Wlc1cFpHVnZaM0poY0docFkzSmxjMjkxY21ObGNHRnlaVzVwWkdWdlozSmhjR2hwWTNKcFoyaDBZMmx5WTJ4bGFXUmxiMmR5WVhCb2FXTnpaV055WlhSamFYSmpiR1ZwWkdWdlozSmhjR2hwWTNObGJHWndZWEpsYm1sa1pXOW5jbUZ3YUdsamMyOWphV1YwZVhCaGNtVnVhV1JsYjJkeVlYQm9hV056Y0dGalpXbGtaVzluY21Gd2FHbGpjM0JsWTJsaGJIQmhjbVZ1YVdSbGIyZHlZWEJvYVdOemRHOWphM0JoY21WdWFXUmxiMmR5WVhCb2FXTnpkSFZrZVhCaGNtVnVhV1JsYjJkeVlYQm9hV056ZFc1d1lYSmxibWxrWlc5bmNtRndhR2xqYzNWd1pYSjJhWE5sY0dGeVpXNXBaR1Z2WjNKaGNHaHBZM2RoZEdWeWNHRnlaVzVwWkdWdlozSmhjR2hwWTNkdmIyUndZWEpsYm1sa1pXOW5jbUZ3YUdsamVtVnliMmxrWlc5bmNtRndhRzFsZEdGc1kybHlZMnhsYVdSbGIyZHlZWEJvYlc5dmJtTnBjbU5zWldsa1pXOW5jbUZ3YUc1aGJXVmphWEpqYkdWcFpHVnZaM0poY0doemRXNWphWEpqYkdWcFpHVnZaM0poY0doM1lYUmxjbU5wY21Oc1pXbGtaVzluY21Gd2FIZHZiMlJqYVhKamJHVnBaR1YyWVdsa2FXVnlaWE5wYzJGamRYUmxhV1JwWlhKbGMybHpZM2x5YVd4c2FXTnBaRzkwWW1Wc2IzZHBaV0p5WlhabFkzbHlhV3hzYVdOcFpXTjVjbWxzYkdsamFXVjFibWRoWTJseVkyeGxhMjl5WldGdWFXVjFibWRoY0dGeVpXNXJiM0psWVc1cFpYVnVaMk5wY21Oc1pXdHZjbVZoYm1sbGRXNW5hMjl5WldGdWFXVjFibWR3WVhKbGJtdHZjbVZoYm1sbmRXcGhjbUYwYVdsbmRYSnRkV3RvYVdsb2FYSmhaMkZ1WVdsb2IyOXJZV0p2ZG1WcGFXSmxibWRoYkdscGFXTjVjbWxzYkdsamFXbGtaWFpoYVdsbmRXcGhjbUYwYVdscFozVnliWFZyYUdscGFXMWhkSEpoWjNWeWJYVnJhR2xwYVc1MlpYSjBaV1JpY21WMlpXbHBjMmh2Y25SamVYSnBiR3hwWTJscGRtOTNaV3h6YVdkdVltVnVaMkZzYVdscGRtOTNaV3h6YVdkdVpHVjJZV2xwZG05M1pXeHphV2R1WjNWcVlYSmhkR2xwYW1scllYUmhhMkZ1WVdscllYUmhhMkZ1WVdoaGJHWjNhV1IwYUdscmIzSmxZVzVwYkdSbGFXeDFlV2hsWW5KbGQybHRZV055YjI1amVYSnBiR3hwWTJsdFlXZGxiM0poY0hCeWIzaHBiV0YwWld4NVpYRjFZV3hwYldGMGNtRm5kWEp0ZFd0b2FXbHRiMjV2YzNCaFkyVnBibU55WlcxbGJuUnBibWxoY20xbGJtbGhibWx1ZEdWblpYSmthWFpwWkdWcGJuUmxaM0poYkdKdmRIUnZiV2x1ZEdWbmNtRnNaR2x6Y0d4aGVXbHVkR1ZuY21Gc2RHVjRkR2x1ZEdWbmNtRnNkRzl3YVc1MFpYSmpZV3hwYm5SbGNuSnZZbUZ1WjJsdWRHVnljbTlpWVc1blpHOTNibWx1ZEdWeWMyVmpkR2x2Ym1SaWJHbHVkR1Z5YzJWamRHbHZibVJwYzNCc1lYbHBiblJsY25ObFkzUnBiMjV6Y1dsdWRHVnljMlZqZEdsdmJuUmxlSFJwYm5ScGMzRjFZWEpsYVc1MlluVnNiR1YwYVc1MlkybHlZMnhsYVc1MmMyMXBiR1ZtWVdObGFXOWplWEpwYkd4cFkybHZkR0ZrYVdWeVpYTnBjMmx2ZEdGa2FXVnlaWE5wYzNSdmJtOXphVzkwWVd4aGRHbHVhVzkwWVhSdmJtOXphWEJoY21WdWFYSnBaM1Z5YlhWcmFHbHBjMjFoYkd4b2FYSmhaMkZ1WVdsemJXRnNiR3RoZEdGcllXNWhhWE50WVd4c2EyRjBZV3RoYm1Gb1lXeG1kMmxrZEdocGMzTm9ZWEppWlc1bllXeHBhWE4wY205clpXbHpkWEJsY21sdmNtbDBaWEpoZEdsdmJtaHBjbUZuWVc1aGFYUmxjbUYwYVc5dWEyRjBZV3RoYm1GcGRHbHNaR1ZwZEdsc1pHVmlaV3h2ZDJsMVltOXdiMjF2Wm05cGRXTjVjbWxzYkdsamFYWnZkMlZzYzJsbmJtSmxibWRoYkdscGRtOTNaV3h6YVdkdVpHVjJZV2wyYjNkbGJITnBaMjVuZFdwaGNtRjBhV2w2YUdsMGMyRmplWEpwYkd4cFkybDZhR2wwYzJGa1lteG5jbUYyWldONWNtbHNiR2xqYW1GaGNtMWxibWxoYm1waFltVnVaMkZzYVdwaFpHVjJZV3BoWjNWcVlYSmhkR2xxWVdkMWNtMTFhMmhwYW1KdmNHOXRiMlp2YW1OaGNtOXVhbU5wY21Oc1pXcGphWEpqZFcxbWJHVjRhbU55YjNOelpXUjBZV2xzYW1SdmRHeGxjM056ZEhKdmEyVnFaV041Y21sc2JHbGphbVZsYldGeVlXSnBZMnBsWlcxbWFXNWhiR0Z5WVdKcFkycGxaVzFwYm1sMGFXRnNZWEpoWW1samFtVmxiVzFsWkdsaGJHRnlZV0pwWTJwbGFHRnlZV0pwWTJwbGFHWnBibUZzWVhKaFltbGphbWhoWW1WdVoyRnNhV3BvWVdSbGRtRnFhR0ZuZFdwaGNtRjBhV3BvWVdkMWNtMTFhMmhwYW1obGFHRnliV1Z1YVdGdWFtbHphbTF2Ym05emNHRmpaV3B3WVhKbGJtcHpkWEJsY21sdmNtdGhZbUZ6YUd0cGNtTjVjbWxzYkdsamEyRmlaVzVuWVd4cGEyRmpkWFJsYTJGamVYSnBiR3hwWTJ0aFpHVnpZMlZ1WkdWeVkzbHlhV3hzYVdOcllXUmxkbUZyWVdacllXWmhjbUZpYVdOcllXWmtZV2RsYzJocllXWmtZV2RsYzJob1pXSnlaWGRyWVdabWFXNWhiR0Z5WVdKcFkydGhabWhsWW5KbGQydGhabWx1YVhScFlXeGhjbUZpYVdOcllXWnRaV1JwWVd4aGNtRmlhV05yWVdaeVlXWmxhR1ZpY21WM2EyRm5kV3BoY21GMGFXdGhaM1Z5YlhWcmFHbHJZV2hwY21GbllXNWhhMkZvYjI5clkzbHlhV3hzYVdOcllXdGhkR0ZyWVc1aGEyRnJZWFJoYTJGdVlXaGhiR1ozYVdSMGFHdGhjSEJoYzNsdFltOXNaM0psWld0cllYQjVaVzkxYm0xcFpYVnRhMjl5WldGdWEyRndlV1Z2ZFc1d2FHbGxkWEJvYTI5eVpXRnVhMkZ3ZVdWdmRXNXdhV1YxY0d0dmNtVmhibXRoY0hsbGIzVnVjM05oYm1kd2FXVjFjR3R2Y21WaGJtdGhjbTl5YVdsemNYVmhjbVZyWVhOb2FXUmhZWFYwYjJGeVlXSnBZMnRoYzJocFpHRmhkWFJ2Ym05emFXUmxZbVZoY21sdVoyRnlZV0pwWTJ0aGMyMWhiR3hyWVhSaGEyRnVZV3RoYzNGMVlYSmxhMkZ6Y21GaGNtRmlhV05yWVhOeVlYUmhibUZ5WVdKcFkydGhjM1J5YjJ0bFkzbHlhV3hzYVdOcllYUmhhR2x5WVhCeWIyeHZibWR0WVhKcmFHRnNabmRwWkhSb2EyRjJaWEowYVdOaGJITjBjbTlyWldONWNtbHNiR2xqYTJKdmNHOXRiMlp2YTJOaGJITnhkV0Z5Wld0allYSnZibXRqWldScGJHeGhhMk5wY21Oc1pXdGtiM1JpWld4dmQydGxhR0Z5YldWdWFXRnVhMlZvYVhKaFoyRnVZV3RsYTJGMFlXdGhibUZyWld0aGRHRnJZVzVoYUdGc1puZHBaSFJvYTJWdVlYSnRaVzVwWVc1clpYTnRZV3hzYTJGMFlXdGhibUZyWjNKbFpXNXNZVzVrYVdOcmFHRmlaVzVuWVd4cGEyaGhZM2x5YVd4c2FXTnJhR0ZrWlhaaGEyaGhaM1ZxWVhKaGRHbHJhR0ZuZFhKdGRXdG9hV3RvWVdoaGNtRmlhV05yYUdGb1ptbHVZV3hoY21GaWFXTnJhR0ZvYVc1cGRHbGhiR0Z5WVdKcFkydG9ZV2h0WldScFlXeGhjbUZpYVdOcmFHVnBZMjl3ZEdsamEyaG9ZV1JsZG1GcmFHaGhaM1Z5YlhWcmFHbHJhR2xsZFd0b1lXTnBjbU5zWld0dmNtVmhibXRvYVdWMWEyaGhjR0Z5Wlc1cmIzSmxZVzVyYUdsbGRXdG9ZMmx5WTJ4bGEyOXlaV0Z1YTJocFpYVnJhR3R2Y21WaGJtdG9hV1YxYTJod1lYSmxibXR2Y21WaGJtdG9iMnRvWVdsMGFHRnBhMmh2YTJodmJuUm9ZV2xyYUc5cmFIVmhkSFJvWVdscmFHOXJhSGRoYVhSb1lXbHJhRzl0ZFhSMGFHRnBhMmh2YjJ0cmFHOXlZV3RvWVc1bmRHaGhhV3RvZW5OeGRXRnlaV3RwYUdseVlXZGhibUZyYVd0aGRHRnJZVzVoYTJscllYUmhhMkZ1WVdoaGJHWjNhV1IwYUd0cGNtOW5kWEpoYlhWemNYVmhjbVZyYVhKdmJXVmxkRzl5ZFhOeGRXRnlaV3RwY205emNYVmhjbVZyYVhsbGIydGhZMmx5WTJ4bGEyOXlaV0Z1YTJsNVpXOXJZWEJoY21WdWEyOXlaV0Z1YTJsNVpXOXJZMmx5WTJ4bGEyOXlaV0Z1YTJsNVpXOXJhMjl5WldGdWEybDVaVzlyY0dGeVpXNXJiM0psWVc1cmFYbGxiMnR6YVc5emEyOXlaV0Z1YTJwbFkzbHlhV3hzYVdOcmJHbHVaV0psYkc5M2EyeHpjWFZoY21WcmJXTjFZbVZrYzNGMVlYSmxhMjF2Ym05emNHRmpaV3R0YzNGMVlYSmxaSE54ZFdGeVpXdHZhR2x5WVdkaGJtRnJiMmh0YzNGMVlYSmxhMjlyWVdsMGFHRnBhMjlyWVhSaGEyRnVZV3R2YTJGMFlXdGhibUZvWVd4bWQybGtkR2hyYjI5d2IzTnhkV0Z5Wld0dmNIQmhZM2x5YVd4c2FXTnJiM0psWVc1emRHRnVaR0Z5WkhONWJXSnZiR3R2Y205dWFYTmpiV0pyY0dGeVpXNXJjR0Z6Y1hWaGNtVnJjMmxqZVhKcGJHeHBZMnQwYzNGMVlYSmxhM1IxY201bFpHdDFhR2x5WVdkaGJtRnJkV3RoZEdGcllXNWhhM1ZyWVhSaGEyRnVZV2hoYkdaM2FXUjBhR3QyYzNGMVlYSmxhM2R6Y1hWaGNtVnNZV0psYm1kaGJHbHNZV1JsZG1Gc1lXZDFhbUZ5WVhScGJHRm5kWEp0ZFd0b2FXeGhhMnRvWVc1bmVXRnZkR2hoYVd4aGJXRnNaV1ptYVc1aGJHRnlZV0pwWTJ4aGJXRnNaV1pvWVcxNllXRmliM1psWm1sdVlXeGhjbUZpYVdOc1lXMWhiR1ZtYUdGdGVtRmhZbTkyWldsemIyeGhkR1ZrWVhKaFltbGpiR0Z0WVd4bFptaGhiWHBoWW1Wc2IzZG1hVzVoYkdGeVlXSnBZMnhoYldGc1pXWm9ZVzE2WVdKbGJHOTNhWE52YkdGMFpXUmhjbUZpYVdOc1lXMWhiR1ZtYVhOdmJHRjBaV1JoY21GaWFXTnNZVzFoYkdWbWJXRmtaR0ZoWW05MlpXWnBibUZzWVhKaFltbGpiR0Z0WVd4bFptMWhaR1JoWVdKdmRtVnBjMjlzWVhSbFpHRnlZV0pwWTJ4aGJXRnlZV0pwWTJ4aGJXSmtZWE4wY205clpXeGhiV1ZrYkdGdFpXUmtZV2RsYzJoc1lXMWxaR1JoWjJWemFHaGxZbkpsZDJ4aGJXVmthR1ZpY21WM2JHRnRaV1JvYjJ4aGJXeGhiV1ZrYUc5c1lXMWtZV2RsYzJoc1lXMWxaR2h2YkdGdFpHRm5aWE5vYUdWaWNtVjNiR0Z0WldSb2IyeGhiV2hsWW5KbGQyeGhiV1pwYm1Gc1lYSmhZbWxqYkdGdGFHRm9hVzVwZEdsaGJHRnlZV0pwWTJ4aGJXbHVhWFJwWVd4aGNtRmlhV05zWVcxcVpXVnRhVzVwZEdsaGJHRnlZV0pwWTJ4aGJXdG9ZV2hwYm1sMGFXRnNZWEpoWW1samJHRnRiR0Z0YUdWb2FYTnZiR0YwWldSaGNtRmlhV05zWVcxdFpXUnBZV3hoY21GaWFXTnNZVzF0WldWdGFHRm9hVzVwZEdsaGJHRnlZV0pwWTJ4aGJXMWxaVzFwYm1sMGFXRnNZWEpoWW1samJHRnRiV1ZsYldwbFpXMXBibWwwYVdGc1lYSmhZbWxqYkdGdGJXVmxiV3RvWVdocGJtbDBhV0ZzWVhKaFltbGpiR0Z5WjJWamFYSmpiR1ZzWVhSMGFXTmxkRzl3YkdKaGNteGlaV3gwYkdKdmNHOXRiMlp2YkdObFpHbHNiR0ZzWTJseVkyeGxiR05wY21OMWJXWnNaWGhpWld4dmQyeGtiM1JzWkc5MFlXTmpaVzUwYkdSdmRHSmxiRzkzYkdSdmRHSmxiRzkzYldGamNtOXViR1ZtZEdGdVoyeGxZV0p2ZG1WamJXSnNaV1owZEdGamEySmxiRzkzWTIxaWJHVnpjMlJpYkdWeGJHZHlaV0YwWlhKc1pYTnpaR0pzWlhGMVlXeHNaWE56Wkc5MGJHVnpjMlZ4ZFdGc1ozSmxZWFJsY214bGMzTmxjWFZoYkc5eVozSmxZWFJsY214bGMzTnRiMjV2YzNCaFkyVnNaWE56YlhWamFHeGxjM051YjNSa1lteGxjWFZoYkd4bGMzTnViM1JsY1hWaGJHeGxjM052Y21Gd2NISnZlR1Z4Ykd4bGMzTnZjbVZ4ZFdGc2MyeGhiblJzWlhOemIzSmxjWFZwZG1Gc1pXNTBiR1Z6YzI5eVozSmxZWFJsY214bGMzTnZjbTV2ZEdSaWJHVnhiR3hsYzNOdmNtNXZkR1Z4ZFdGc2JHVnpjMjl5YzJsdGFXeGhjbXhsYzNOdmRtVnlaWEYxWVd4c1pYTnpjMjFoYkd4c1pYcG9iR1ppYkc5amEyeG9iMjlyY21WMGNtOW1iR1Y0YkdseVlXeHBkMjVoY20xbGJtbGhibXhxYkdwbFkzbHlhV3hzYVdOc2JHeHNZV1JsZG1Gc2JHRm5kV3BoY21GMGFXeHNhVzVsWW1Wc2IzZHNiR3hoWkdWMllXeHNkbTlqWVd4cFkySmxibWRoYkdsc2JIWnZZMkZzYVdOa1pYWmhiR3gyYjJOaGJHbGpkbTkzWld4emFXZHVZbVZ1WjJGc2FXeHNkbTlqWVd4cFkzWnZkMlZzYzJsbmJtUmxkbUZzYldsa1pHeGxkR2xzWkdWc2JXOXViM053WVdObGJHMXpjWFZoY21Wc2IyTm9kV3hoZEdoaGFXeHZaMmxqWVd4aGJtUmthWE53YkdGNWJHOW5hV05oYkdGdVpIUmxlSFJzYjJkcFkyRnNibTkwY21WMlpYSnpaV1JzYjJkcFkyRnNiM0prYVhOd2JHRjViRzluYVdOaGJHOXlkR1Y0ZEd4dmJHbHVaM1JvWVdsc2IyNW5aR0pzYzJ4dmJtZHpiRzl1WjNOb2JHOXVaM05wYkc5dVozTnNiRzl1WjNOMGJHOTNiR2x1WldObGJuUmxjbXhwYm1Wc2IzZHNhVzVsWTIxaWJHOTNiR2x1WldSaGMyaGxaR3h3WVhKbGJteHpZM0pwY0hSc2MzRjFZWEpsYkhOMWNHVnlhVzl5YkhSemFHRmtaV3gxZEdoaGFXeDJiMk5oYkdsalltVnVaMkZzYVd4MmIyTmhiR2xqWkdWMllXeDJiMk5oYkdsamRtOTNaV3h6YVdkdVltVnVaMkZzYVd4MmIyTmhiR2xqZG05M1pXeHphV2R1WkdWMllXeDRjM0YxWVhKbGJXRmlaVzVuWVd4cGJXRmpjbTl1WW1Wc2IzZGpiV0p0WVdOeWIyNWpiV0p0WVdOeWIyNXNiM2R0YjJSdFlXTnliMjV0YjI1dmMzQmhZMlZ0WVdOMWRHVnRZV1JsZG1GdFlXZDFhbUZ5WVhScGJXRm5kWEp0ZFd0b2FXMWhhR0Z3WVd0b2FHVmljbVYzYldGb1lYQmhhMmhzWldaMGFHVmljbVYzYldGb2FYSmhaMkZ1WVcxaGFXTm9ZWFIwWVhkaGJHOTNiR1ZtZEhSb1lXbHRZV2xqYUdGMGRHRjNZV3h2ZDNKcFoyaDBkR2hoYVcxaGFXTm9ZWFIwWVhkaGRHaGhhVzFoYVdOb1lYUjBZWGRoZFhCd1pYSnNaV1owZEdoaGFXMWhhV1ZyYkc5M2JHVm1kSFJvWVdsdFlXbGxhMnh2ZDNKcFoyaDBkR2hoYVcxaGFXVnJkR2hoYVcxaGFXVnJkWEJ3WlhKc1pXWjBkR2hoYVcxaGFXaGhibUZyWVhSc1pXWjBkR2hoYVcxaGFXaGhibUZyWVhSMGFHRnBiV0ZwZEdGcGEyaDFiR1ZtZEhSb1lXbHRZV2wwWVdscmFIVjBhR0ZwYldGcGRHaHZiRzkzYkdWbWRIUm9ZV2x0WVdsMGFHOXNiM2R5YVdkb2RIUm9ZV2x0WVdsMGFHOTBhR0ZwYldGcGRHaHZkWEJ3WlhKc1pXWjBkR2hoYVcxaGFYUnlhV3h2ZDJ4bFpuUjBhR0ZwYldGcGRISnBiRzkzY21sbmFIUjBhR0ZwYldGcGRISnBkR2hoYVcxaGFYUnlhWFZ3Y0dWeWJHVm1kSFJvWVdsdFlXbDVZVzF2YTNSb1lXbHRZV3RoZEdGcllXNWhiV0ZyWVhSaGEyRnVZV2hoYkdaM2FXUjBhRzFoYkdWdFlXeDBaWE5sWTNKdmMzTnRZVzV6ZVc5dWMzRjFZWEpsYldGd2MzUnZiV0Z4WVdab1pXSnlaWGR0WVhKemJXRnpiM0poWTJseVkyeGxhR1ZpY21WM2JXRnpjWFZoY21WdFltOXdiMjF2Wm05dFluTnhkV0Z5WlcxamFYSmpiR1Z0WTNWaVpXUnpjWFZoY21WdFpHOTBZV05qWlc1MGJXUnZkR0psYkc5M2JXVmhjM1Z5WldSaGJtZHNaVzFsWlcxaGNtRmlhV050WldWdFptbHVZV3hoY21GaWFXTnRaV1Z0YVc1cGRHbGhiR0Z5WVdKcFkyMWxaVzF0WldScFlXeGhjbUZpYVdOdFpXVnRiV1ZsYldsdWFYUnBZV3hoY21GaWFXTnRaV1Z0YldWbGJXbHpiMnhoZEdWa1lYSmhZbWxqYldWbGRHOXlkWE54ZFdGeVpXMWxhR2x5WVdkaGJtRnRaV2w2YVdWeVlYTnhkV0Z5WlcxbGEyRjBZV3RoYm1GdFpXdGhkR0ZyWVc1aGFHRnNabmRwWkhSb2JXVnRiV1Z0WkdGblpYTm9iV1Z0WkdGblpYTm9hR1ZpY21WM2JXVnRhR1ZpY21WM2JXVnVZWEp0Wlc1cFlXNXRaWEpyYUdGb1pXSnlaWGR0WlhKcmFHRnJaV1oxYkdGb1pXSnlaWGR0WlhKcmFHRnJaV1oxYkdGc1pXWjBhR1ZpY21WM2JXVnlhMmhoYkdWbWRHaGxZbkpsZDIxb2IyOXJiV2g2YzNGMVlYSmxiV2xrWkd4bFpHOTBhMkYwWVd0aGJtRm9ZV3htZDJsa2RHaHRhV1JrYjNSdGFXVjFiV0ZqYVhKamJHVnJiM0psWVc1dGFXVjFiV0Z3WVhKbGJtdHZjbVZoYm0xcFpYVnRZMmx5WTJ4bGEyOXlaV0Z1YldsbGRXMXJiM0psWVc1dGFXVjFiWEJoYm5OcGIzTnJiM0psWVc1dGFXVjFiWEJoY21WdWEyOXlaV0Z1YldsbGRXMXdhV1YxY0d0dmNtVmhibTFwWlhWdGMybHZjMnR2Y21WaGJtMXBhR2x5WVdkaGJtRnRhV3RoZEdGcllXNWhiV2xyWVhSaGEyRnVZV2hoYkdaM2FXUjBhRzFwYm5WelltVnNiM2RqYldKdGFXNTFjMk5wY21Oc1pXMXBiblZ6Ylc5a2JXbHVkWE53YkhWemJXbHlhV0poWVhKMWMzRjFZWEpsYldseWFYTnhkV0Z5Wlcxc2IyNW5iR1ZuZEhWeWJtVmtiV3h6Y1hWaGNtVnRiV04xWW1Wa2MzRjFZWEpsYlcxdmJtOXpjR0ZqWlcxdGMzRjFZWEpsWkhOeGRXRnlaVzF2YUdseVlXZGhibUZ0YjJodGMzRjFZWEpsYlc5cllYUmhhMkZ1WVcxdmEyRjBZV3RoYm1Gb1lXeG1kMmxrZEdodGIyeHpjWFZoY21WdGIyMWhkR2hoYVcxdmRtVnljM054ZFdGeVpXMXZkbVZ5YzNOeGRXRnlaV1J6Y1hWaGNtVnRjR0Z5Wlc1dGNHRnpjWFZoY21WdGMzTnhkV0Z5WlcxemRYQmxjbWx2Y20xMGRYSnVaV1J0ZFRGdGRXRnpjWFZoY21WdGRXTm9aM0psWVhSbGNtMTFZMmhzWlhOemJYVm1jM0YxWVhKbGJYVm5jbVZsYTIxMVozTnhkV0Z5WlcxMWFHbHlZV2RoYm1GdGRXdGhkR0ZyWVc1aGJYVnJZWFJoYTJGdVlXaGhiR1ozYVdSMGFHMTFiSE54ZFdGeVpXMTFiSFJwWTJ4dmMyVnNaV1owYlhWc2RHbGpiRzl6WlhKcFoyaDBiWFZzZEdsdFlYQnRkV3gwYVc5d1pXNXNaV1owYlhWc2RHbHZjR1Z1Y21sbmFIUnRkVzF6Y1hWaGNtVnRkVzVoYUdobFluSmxkMjExYm1Gb2JHVm1kR2hsWW5KbGQyMTFjMmxqWVd4dWIzUmxiWFZ6YVdOaGJHNXZkR1ZrWW14dGRYTnBZMlpzWVhSemFXZHViWFZ6YVdOemFHRnljSE5wWjI1dGRYTnpjWFZoY21WdGRYWnpjWFZoY21WdGRYZHpjWFZoY21WdGRtMWxaMkZ6Y1hWaGNtVnRkbk54ZFdGeVpXMTNiV1ZuWVhOeGRXRnlaVzEzYzNGMVlYSmxibUZpWlc1bllXeHBibUZpYkdGdVlXUmxkbUZ1WVdkMWFtRnlZWFJwYm1GbmRYSnRkV3RvYVc1aGFHbHlZV2RoYm1GdVlXdGhkR0ZyWVc1aGJtRnJZWFJoYTJGdVlXaGhiR1ozYVdSMGFHNWhibVJ1WVhCdmMzUnliM0JvWlc1aGMzRjFZWEpsYm1GMGRYSmhiRzVpYjNCdmJXOW1iMjVpYzNCaFkyVnVZMlZrYVd4c1lXNWphWEpqYkdWdVkybHlZM1Z0Wm14bGVHSmxiRzkzYm1SdmRHRmpZMlZ1ZEc1a2IzUmlaV3h2ZDI1bFoyRjBhVzl1YzJ4aGMyaHVaV2hwY21GbllXNWhibVZyWVhSaGEyRnVZVzVsYTJGMFlXdGhibUZvWVd4bWQybGtkR2h1WlhkemFHVnhaV3h6YVdkdWJtWnpjWFZoY21WdVoyNW5ZV0psYm1kaGJHbHVaMkZrWlhaaGJtZGhaM1ZxWVhKaGRHbHVaMkZuZFhKdGRXdG9hVzVuYjI1bmRYUm9ZV2x1YUdseVlXZGhibUZ1YUc5dmEyeGxablJ1YUc5dmEzSmxkSEp2Wm14bGVHNXBaWFZ1WVdOcGNtTnNaV3R2Y21WaGJtNXBaWFZ1WVhCaGNtVnVhMjl5WldGdWJtbGxkVzVqYVdWMVkydHZjbVZoYm01cFpYVnVZMmx5WTJ4bGEyOXlaV0Z1Ym1sbGRXNW9hV1YxYUd0dmNtVmhibTVwWlhWdWEyOXlaV0Z1Ym1sbGRXNXdZVzV6YVc5emEyOXlaV0Z1Ym1sbGRXNXdZWEpsYm10dmNtVmhibTVwWlhWdWMybHZjMnR2Y21WaGJtNXBaWFZ1ZEdsclpYVjBhMjl5WldGdWJtbG9hWEpoWjJGdVlXNXBhMkYwWVd0aGJtRnVhV3RoZEdGcllXNWhhR0ZzWm5kcFpIUm9ibWxyYUdGb2FYUnNaV1owZEdoaGFXNXBhMmhoYUdsMGRHaGhhVzVwYm1WaGNtRmlhV051YVc1bFltVnVaMkZzYVc1cGJtVmphWEpqYkdWdWFXNWxZMmx5WTJ4bGFXNTJaWEp6WlhOaGJuTnpaWEpwWm01cGJtVmtaWFpoYm1sdVpXZDFhbUZ5WVhScGJtbHVaV2QxY20xMWEyaHBibWx1WldoaFkydGhjbUZpYVdOdWFXNWxhR0Z1WjNwb2IzVnVhVzVsYVdSbGIyZHlZWEJvYVdOd1lYSmxibTVwYm1WcGJtWmxjbWx2Y201cGJtVnRiMjV2YzNCaFkyVnVhVzVsYjJ4a2MzUjViR1Z1YVc1bGNHRnlaVzV1YVc1bGNHVnlhVzlrYm1sdVpYQmxjbk5wWVc1dWFXNWxjbTl0WVc1dWFXNWxjM1Z3WlhKcGIzSnVhVzVsZEdWbGJtTnBjbU5zWlc1cGJtVjBaV1Z1Y0dGeVpXNXVhVzVsZEdWbGJuQmxjbWx2Wkc1cGJtVjBhR0ZwYm1wdWFtVmplWEpwYkd4cFkyNXJZWFJoYTJGdVlXNXJZWFJoYTJGdVlXaGhiR1ozYVdSMGFHNXNaV2R5YVdkb2RHeHZibWR1YkdsdVpXSmxiRzkzYm0xdmJtOXpjR0ZqWlc1dGMzRjFZWEpsYm01aFltVnVaMkZzYVc1dVlXUmxkbUZ1Ym1GbmRXcGhjbUYwYVc1dVlXZDFjbTExYTJocGJtNXVZV1JsZG1GdWIyaHBjbUZuWVc1aGJtOXJZWFJoYTJGdVlXNXZhMkYwWVd0aGJtRm9ZV3htZDJsa2RHaHViMjVpY21WaGEybHVaM053WVdObGJtOXVaVzUwYUdGcGJtOXVkWFJvWVdsdWIyOXVZWEpoWW1samJtOXZibVpwYm1Gc1lYSmhZbWxqYm05dmJtZG9kVzV1WVdGeVlXSnBZMjV2YjI1bmFIVnVibUZtYVc1aGJHRnlZV0pwWTI1dmIyNW9aV2hwYm1sMGFXRnNZWEpoWW1samJtOXZibWx1YVhScFlXeGhjbUZpYVdOdWIyOXVhbVZsYldsdWFYUnBZV3hoY21GaWFXTnViMjl1YW1WbGJXbHpiMnhoZEdWa1lYSmhZbWxqYm05dmJtMWxaR2xoYkdGeVlXSnBZMjV2YjI1dFpXVnRhVzVwZEdsaGJHRnlZV0pwWTI1dmIyNXRaV1Z0YVhOdmJHRjBaV1JoY21GaWFXTnViMjl1Ym05dmJtWnBibUZzWVhKaFltbGpibTkwWVhCd2NtOTRaWEYxWVd4dWIzUmhjbkp2ZDJKdmRHaHViM1JoY25KdmQyeGxablJ1YjNSaGNuSnZkM0pwWjJoMGJtOTBZbUZ5Ym05MFkyOXVkR0ZwYm5OdWIzUmtZbXhoY25KdmQySnZkR2h1YjNSa1lteGhjbkp2ZDJ4bFpuUnViM1JrWW14aGNuSnZkM0pwWjJoMGJtOTBaV3hsYldWdWRHOW1ibTkwWlhocGMzUmxiblJwWVd4dWIzUm1iMnhzYjNkemJtOTBabTlzYkc5M2MyOXlaWEZzYm05MFptOXlZMlZ6Ym05MFptOXlZMlZ6WlhoMGNtRnViM1JuY21WaGRHVnlibTkwWjNKbFlYUmxjbVJpYkdWeGRXRnNibTkwWjNKbFlYUmxjbVZ4ZFdGc2JtOTBaM0psWVhSbGNtNXZjbVZ4ZFdGc2JtOTBaM0psWVhSbGNtNXZjbXhsYzNOdWIzUm5jbVZoZEdWeWIzSnpiRzUwWlhGc2JtOTBhV1JsYm5ScFkyRnNibTkwYkdWemMyNXZkR3hsYzNOa1lteGxjWFZoYkc1dmRHeGxjM05sY1hWaGJHNXZkR3hsYzNOdWIzSmxjWFZoYkc1dmRHeGxjM052Y25Oc2JuUmxjV3h1YjNSd1lYSmhiR3hsYkc1dmRIQnlaV05sWkdWemJtOTBjSEpsWTJWa1pYTnZjbVZ4Ykc1dmRITmhkR2x6Wm1sbGMyNXZkSE5wYldsc1lYSnViM1J6ZFdKelpYUmxjV3h1YjNSemRXSnpaWFJ2Y21SaWJHVnhiRzV2ZEhOMVluTmxkRzl5WlhGc2JtOTBjM1ZqWTJWbFpITnViM1J6ZFhCbGNuTmxkRzV2ZEhOMWNHVnljMlYwWlhGc2JtOTBjM1Z3WlhKelpYUnZjbVJpYkdWeGJHNXZkSE4xY0dWeWMyVjBiM0psY1d4dWIzUjBjbWxoYm1kbGNXeHNaV1owYm05MGRISnBZVzVuWlhGc2NtbG5hSFJ1YjNSMGNtbGhibWRzWld4bFpuUnViM1IwY21saGJtZHNaWEpwWjJoMGJtOTBkSFZ5Ym5OMGFXeGxibTkzWVhKdFpXNXBZVzV1Y0dGeVpXNXVjM054ZFdGeVpXNXpkWEJsY21sdmNtNTFhR2x5WVdkaGJtRnVkV3RoZEdGcllXNWhiblZyWVhSaGEyRnVZV2hoYkdaM2FXUjBhRzUxYTNSaFltVnVaMkZzYVc1MWEzUmhaR1YyWVc1MWEzUmhaM1ZxWVhKaGRHbHVkV3QwWVdkMWNtMTFhMmhwYm5WdFltVnljMmxuYm0xdmJtOXpjR0ZqWlc1MWJXSmxjbk5wWjI1emJXRnNiRzUxYldWeVlXeHphV2R1WjNKbFpXdHVkVzFsY21Gc2MybG5ibXh2ZDJWeVozSmxaV3R1ZFcxbGNtOXVkVzV1ZFc1a1lXZGxjMmh1ZFc1a1lXZGxjMmhvWldKeVpYZHVkVzVvWldKeVpYZHVkbk54ZFdGeVpXNTNjM0YxWVhKbGJubGhZbVZ1WjJGc2FXNTVZV1JsZG1GdWVXRm5kV3BoY21GMGFXNTVZV2QxY20xMWEyaHBiMkZ1WjNSb1lXbHZZbUZ5Y21Wa2IySmhjbkpsWkdONWNtbHNiR2xqYjJKaGNuSmxaR1JwWlhKbGMybHpZM2x5YVd4c2FXTnZZbVZ1WjJGc2FXOWliM0J2Ylc5bWIyOWljbVYyWlc5allXNWtjbUZrWlhaaGIyTmhibVJ5WVdkMWFtRnlZWFJwYjJOaGJtUnlZWFp2ZDJWc2MybG5ibVJsZG1GdlkyRnVaSEpoZG05M1pXeHphV2R1WjNWcVlYSmhkR2x2WTJGeWIyNXZZMmx5WTJ4bGIyTnBjbU4xYldac1pYaGhZM1YwWlc5amFYSmpkVzFtYkdWNFpHOTBZbVZzYjNkdlkybHlZM1Z0Wm14bGVHZHlZWFpsYjJOcGNtTjFiV1pzWlhob2IyOXJZV0p2ZG1WdlkybHlZM1Z0Wm14bGVIUnBiR1JsYjJONWNtbHNiR2xqYjJSaWJHRmpkWFJsYjJSaWJHZHlZWFpsYjJSbGRtRnZaR2xsY21WemFYTmplWEpwYkd4cFkyOWtiM1JpWld4dmQyOWxhMjl5WldGdWIyZHZibVZyWTIxaWIyZDFhbUZ5WVhScGIyaGhjbTFsYm1saGJtOW9hWEpoWjJGdVlXOW9iMjlyWVdKdmRtVnZhRzl5Ym05b2IzSnVZV04xZEdWdmFHOXlibVJ2ZEdKbGJHOTNiMmh2Y201bmNtRjJaVzlvYjNKdWFHOXZhMkZpYjNabGIyaHZjbTUwYVd4a1pXOXBiMmx1ZG1WeWRHVmtZbkpsZG1WdmEyRjBZV3RoYm1GdmEyRjBZV3RoYm1Gb1lXeG1kMmxrZEdodmEyOXlaV0Z1YjJ4bGFHVmljbVYzYjIxaFkzSnZibUZqZFhSbGIyMWhZM0p2Ym1keVlYWmxiMjFrWlhaaGIyMWxaMkZqZVhKcGJHeHBZMjl0WldkaGJHRjBhVzVqYkc5elpXUnZiV1ZuWVhKdmRXNWtZM2x5YVd4c2FXTnZiV1ZuWVhScGRHeHZZM2x5YVd4c2FXTnZiV1ZuWVhSdmJtOXpiMjFuZFdwaGNtRjBhVzl0YVdOeWIyNTBiMjV2YzI5dGIyNXZjM0JoWTJWdmJtVmhjbUZpYVdOdmJtVmlaVzVuWVd4cGIyNWxZMmx5WTJ4bGIyNWxZMmx5WTJ4bGFXNTJaWEp6WlhOaGJuTnpaWEpwWm05dVpXUmxkbUZ2Ym1Wa2IzUmxibXhsWVdSbGNtOXVaV1ZwWjJoMGFHOXVaV1pwZEhSbFpHOXVaV2QxYW1GeVlYUnBiMjVsWjNWeWJYVnJhR2x2Ym1Wb1lXTnJZWEpoWW1samIyNWxhR0Z1WjNwb2IzVnZibVZwWkdWdlozSmhjR2hwWTNCaGNtVnViMjVsYVc1bVpYSnBiM0p2Ym1WdGIyNXZjM0JoWTJWdmJtVnVkVzFsY21GMGIzSmlaVzVuWVd4cGIyNWxiMnhrYzNSNWJHVnZibVZ3WVhKbGJtOXVaWEJsY21sdlpHOXVaWEJsY25OcFlXNXZibVZ5YjIxaGJtOXVaWFJvWVdsdmJtVjBhR2x5Wkc5dloyOXVaV3R2YjJkdmJtVnJiV0ZqY205dWIyOW5kWEp0ZFd0b2FXOXZiV0YwY21GbmRYSnRkV3RvYVc5dmNHVnViM0JoY21WdWIzQmxibUoxYkd4bGRHOXdkR2x2Ym05eWRHaHZaMjl1WVd4dmNuVnVaR1Z5YzJOdmNtVnZjMmh2Y25Sa1pYWmhiM05vYjNKMGRtOTNaV3h6YVdkdVpHVjJZVzl6YkdGemFHRmpkWFJsYjNOdFlXeHNhR2x5WVdkaGJtRnZjMjFoYkd4cllYUmhhMkZ1WVc5emJXRnNiR3RoZEdGcllXNWhhR0ZzWm5kcFpIUm9iM04wY205clpXRmpkWFJsYjNOMWNHVnlhVzl5YjNSamVYSnBiR3hwWTI5MGFXeGtaV0ZqZFhSbGIzUnBiR1JsWkdsbGNtVnphWE52ZFdKdmNHOXRiMlp2YjNabGNteHBibVZ2ZG1WeWJHbHVaV05sYm5SbGNteHBibVZ2ZG1WeWJHbHVaV050WW05MlpYSnNhVzVsWkdGemFHVmtiM1psY214cGJtVmtZbXgzWVhaNWIzWmxjbXhwYm1WM1lYWjViM1psY25OamIzSmxiM1p2ZDJWc2MybG5ibUpsYm1kaGJHbHZkbTkzWld4emFXZHVaR1YyWVc5MmIzZGxiSE5wWjI1bmRXcGhjbUYwYVc5M2JtVnljR0ZoYlhCemMzRjFZWEpsY0dGaGMyVnVkRzl6Y1hWaGNtVndZV0psYm1kaGJHbHdZV04xZEdWd1lXUmxkbUZ3WVdkbFpHOTNibkJoWjJWMWNIQmhaM1ZxWVhKaGRHbHdZV2QxY20xMWEyaHBjR0ZvYVhKaFoyRnVZWEJoYVhsaGJtNXZhWFJvWVdsd1lXdGhkR0ZyWVc1aGNHRnNZWFJoYkdsNllYUnBiMjVqZVhKcGJHeHBZMk50WW5CaGJHOWphR3RoWTNseWFXeHNhV053WVc1emFXOXphMjl5WldGdWNHRnlZV3hzWld4d1lYSmxibXhsWm5SQ2FXZHdZWEpsYm14bFpuUkNhV2RuY0dGeVpXNXNaV1owWVd4MGIyNWxZWEpoWW1samNHRnlaVzVzWldaMFltbG5jR0Z5Wlc1c1pXWjBZbWxuWjNCaGNtVnViR1ZtZEdsdVptVnlhVzl5Y0dGeVpXNXNaV1owYldGMGFIQmhjbVZ1YkdWbWRHMXZibTl6Y0dGalpYQmhjbVZ1YkdWbWRITnRZV3hzY0dGeVpXNXNaV1owYzNWd1pYSnBiM0p3WVhKbGJteGxablIyWlhKMGFXTmhiSEJoY21WdWNtbG5hSFJDYVdkd1lYSmxibkpwWjJoMFFtbG5aM0JoY21WdWNtbG5hSFJoYkhSdmJtVmhjbUZpYVdOd1lYSmxibkpwWjJoMFltbG5jR0Z5Wlc1eWFXZG9kR0pwWjJkd1lYSmxibkpwWjJoMGFXNW1aWEpwYjNKd1lYSmxibkpwWjJoMGJXRjBhSEJoY21WdWNtbG5hSFJ0YjI1dmMzQmhZMlZ3WVhKbGJuSnBaMmgwYzIxaGJHeHdZWEpsYm5KcFoyaDBjM1Z3WlhKcGIzSndZWEpsYm5KcFoyaDBkbVZ5ZEdsallXeHdZWE5sY1dobFluSmxkM0JoYzJoMFlXaGxZbkpsZDNCaGMzRjFZWEpsY0dGMFlXaHdZWFJoYURFeGNHRjBZV2d4WkhCaGRHRm9NbUZ3WVhSaGFHaGxZbkpsZDNCaGRHRm9ibUZ5Y205M2FHVmljbVYzY0dGMFlXaHhkV0Z5ZEdWeWFHVmljbVYzY0dGMFlXaDNhV1JsYUdWaWNtVjNjR0Y2WlhKb1pXSnlaWGR3WW05d2IyMXZabTl3WTJseVkyeGxjR1J2ZEdGalkyVnVkSEJsY0dWamVYSnBiR3hwWTNCbFpHRm5aWE5vY0dWa1lXZGxjMmhvWldKeVpYZHdaV1Y2YVhOeGRXRnlaWEJsWm1sdVlXeGtZV2RsYzJob1pXSnlaWGR3WldoaGNtRmlhV053WldoaGNtMWxibWxoYm5CbGFHVmljbVYzY0dWb1ptbHVZV3hoY21GaWFXTndaV2hwYm1sMGFXRnNZWEpoWW1samNHVm9hWEpoWjJGdVlYQmxhRzFsWkdsaGJHRnlZV0pwWTNCbGEyRjBZV3RoYm1Gd1pXMXBaR1JzWldodmIydGplWEpwYkd4cFkzQmxjbUZtWldobFluSmxkM0JsY21ObGJuUmhjbUZpYVdOd1pYSmpaVzUwYlc5dWIzTndZV05sY0dWeVkyVnVkSE50WVd4c2NHVnlhVzlrWVhKdFpXNXBZVzV3WlhKcGIyUm9ZV3htZDJsa2RHaHdaWEpwYjJScGJtWmxjbWx2Y25CbGNtbHZaRzF2Ym05emNHRmpaWEJsY21sdlpITnRZV3hzY0dWeWFXOWtjM1Z3WlhKcGIzSndaWEpwYzNCdmJXVnVhV2R5WldWclkyMWljR1Z5Y0dOdmNuSmxjM0J2Ym1Sd1pYSjBaVzUwYUc5MWMyRnVaSEJsYzJWMFlYQm1jM0YxWVhKbGNHaGhZbVZ1WjJGc2FYQm9ZV1JsZG1Gd2FHRm5kV3BoY21GMGFYQm9ZV2QxY20xMWEyaHBjR2hwWlhWd2FHRmphWEpqYkdWcmIzSmxZVzV3YUdsbGRYQm9ZWEJoY21WdWEyOXlaV0Z1Y0docFpYVndhR05wY21Oc1pXdHZjbVZoYm5Cb2FXVjFjR2hyYjNKbFlXNXdhR2xsZFhCb2NHRnlaVzVyYjNKbFlXNXdhR2xzWVhScGJuQm9hVzUwYUhWMGFHRnBjR2hwYzNsdFltOXNaM0psWld0d2FHOXZhM0JvYjNCb1lXNTBhR0ZwY0dodmNHaDFibWQwYUdGcGNHaHZjMkZ0Y0doaGIzUm9ZV2x3YVRGd2FXVjFjR0ZqYVhKamJHVnJiM0psWVc1d2FXVjFjR0Z3WVhKbGJtdHZjbVZoYm5CcFpYVndZMmxsZFdOcmIzSmxZVzV3YVdWMWNHTnBjbU5zWld0dmNtVmhibkJwWlhWd2EybDVaVzlyYTI5eVpXRnVjR2xsZFhCcmIzSmxZVzV3YVdWMWNIQmhjbVZ1YTI5eVpXRnVjR2xsZFhCemFXOXphMmw1Wlc5cmEyOXlaV0Z1Y0dsbGRYQnphVzl6YTI5eVpXRnVjR2xsZFhCemFXOXpkR2xyWlhWMGEyOXlaV0Z1Y0dsbGRYQjBhR2xsZFhSb2EyOXlaV0Z1Y0dsbGRYQjBhV3RsZFhScmIzSmxZVzV3YVdocGNtRm5ZVzVoY0dscllYUmhhMkZ1WVhCcGMzbHRZbTlzWjNKbFpXdHdhWGR5WVhKdFpXNXBZVzV3YkdGdVkydHZkbVZ5TW5CcGNHeGhibU5yYjNabGNqSndhVEZ3YkhWelltVnNiM2RqYldKd2JIVnpZMmx5WTJ4bGNHeDFjMjFoZEdod2JIVnpiVzlrY0d4MWMyMXZibTl6Y0dGalpYQnNkWE56YldGc2JIQnNkWE56ZFhCbGNtbHZjbkJ0YjI1dmMzQmhZMlZ3YlhOeGRXRnlaWEJ2YUdseVlXZGhibUZ3YjJsdWRHbHVaMmx1WkdWNFpHOTNibmRvYVhSbGNHOXBiblJwYm1kcGJtUmxlR3hsWm5SM2FHbDBaWEJ2YVc1MGFXNW5hVzVrWlhoeWFXZG9kSGRvYVhSbGNHOXBiblJwYm1kcGJtUmxlSFZ3ZDJocGRHVndiMnRoZEdGcllXNWhjRzl3YkdGMGFHRnBjRzl6ZEdGc2JXRnlhM0J2YzNSaGJHMWhjbXRtWVdObGNIQmhjbVZ1Y0hKbFkyVmtaVzV2ZEdSaWJHVnhkbkJ5WldObFpHVnViM1J6Ykc1MFpYRnNjSEpsWTJWa1pXOXlibTkwWlhGMmJHNTBjSEpsWTJWa1pYTndjbVZqWldSbGMyVnhkV0ZzY0hKbFkyVmtaWE52Y21OMWNteDVjSEpsWTJWa1pYTnZjbVZ4ZFdGc2NISmxjMk55YVhCMGFXOXVjSEpwYldWd2NtbHRaVzF2WkhCeWFXMWxjbVYyWlhKelpYQnlhVzFsY21WMlpYSnpaV1J3Y205a2RXTjBaR2x6Y0d4aGVYQnliMlIxWTNSMFpYaDBjSEp2YW1WamRHbDJaWEJ5YjJ4dmJtZGxaR3RoYm1Gd2NtOXdaV3hzYjNKd2NtOXdiM0owYVc5dWNITnBZM2x5YVd4c2FXTndjMmxzYVhCdVpYVnRZWFJoWTNseWFXeHNhV05qYldKd2MzTnhkV0Z5WlhCMWFHbHlZV2RoYm1Gd2RXdGhkR0ZyWVc1aGNIVnVZM1JrWVhOb2NIWnpjWFZoY21Wd2QzTnhkV0Z5WlhGaFpHVjJZWEZoWkcxaGFHVmljbVYzY1dGbVlYSmhZbWxqY1dGbVptbHVZV3hoY21GaWFXTnhZV1pwYm1sMGFXRnNZWEpoWW1samNXRm1iV1ZrYVdGc1lYSmhZbWxqY1dGdFlYUnpjV0Z0WVhSek1UQnhZVzFoZEhNeFlYRmhiV0YwY3pGamNXRnRZWFJ6TWpkeFlXMWhkSE15T1hGaGJXRjBjek16Y1dGdFlYUnpaR1Z4WVcxaGRITm9aV0p5WlhkeFlXMWhkSE51WVhKeWIzZG9aV0p5WlhkeFlXMWhkSE54WVhSaGJtaGxZbkpsZDNGaGJXRjBjM0ZoZEdGdWJtRnljbTkzYUdWaWNtVjNjV0Z0WVhSemNXRjBZVzV4ZFdGeWRHVnlhR1ZpY21WM2NXRnRZWFJ6Y1dGMFlXNTNhV1JsYUdWaWNtVjNjV0Z0WVhSemNYVmhjblJsY21obFluSmxkM0ZoYldGMGMzZHBaR1ZvWldKeVpYZHhZWEp1Wlhsd1lYSmhhR1ZpY21WM2NXSnZjRzl0YjJadmNXTnBjbU5zWlhGb2IyOXJjVzF2Ym05emNHRmpaWEZ2Wm5GdlptUmhaMlZ6YUhGdlptUmhaMlZ6YUdobFluSmxkM0Z2Wm1oaGRHRm1jR0YwWVdoeGIyWm9ZWFJoWm5CaGRHRm9hR1ZpY21WM2NXOW1hR0YwWVdaelpXZHZiSEZ2Wm1oaGRHRm1jMlZuYjJ4b1pXSnlaWGR4YjJab1pXSnlaWGR4YjJab2FYSnBjWEZ2Wm1ocGNtbHhhR1ZpY21WM2NXOW1hRzlzWVcxeGIyWm9iMnhoYldobFluSmxkM0Z2Wm5CaGRHRm9jVzltY0dGMFlXaG9aV0p5WlhkeGIyWnhZVzFoZEhOeGIyWnhZVzFoZEhOb1pXSnlaWGR4YjJaeGRXSjFkSE54YjJaeGRXSjFkSE5vWldKeVpYZHhiMlp6WldkdmJIRnZabk5sWjI5c2FHVmljbVYzY1c5bWMyaGxkbUZ4YjJaemFHVjJZV2hsWW5KbGQzRnZablJ6WlhKbGNXOW1kSE5sY21Wb1pXSnlaWGR4Y0dGeVpXNXhkV0Z5ZEdWeWJtOTBaWEYxWW5WMGMzRjFZblYwY3pFNGNYVmlkWFJ6TWpWeGRXSjFkSE16TVhGMVluVjBjMmhsWW5KbGQzRjFZblYwYzI1aGNuSnZkMmhsWW5KbGQzRjFZblYwYzNGMVlYSjBaWEpvWldKeVpYZHhkV0oxZEhOM2FXUmxhR1ZpY21WM2NYVmxjM1JwYjI1aGNtRmlhV054ZFdWemRHbHZibUZ5YldWdWFXRnVjWFZsYzNScGIyNWtiM2R1YzIxaGJHeHhkV1Z6ZEdsdmJtZHlaV1ZyY1hWbGMzUnBiMjV0YjI1dmMzQmhZMlZ4ZFdWemRHbHZibk50WVd4c2NYVnZkR1ZrWW14dGIyNXZjM0JoWTJWeGRXOTBaV1JpYkhCeWFXMWxjWFZ2ZEdWa1lteHdjbWx0WlhKbGRtVnljMlZrY1hWdmRHVnNaV1owY21WMlpYSnpaV1J4ZFc5MFpYSmxkbVZ5YzJWa2NYVnZkR1Z5YVdkb2RHNXhkVzkwWlhOcGJtZHNaVzF2Ym05emNHRmpaWEpoWVhKdFpXNXBZVzV5WVdKbGJtZGhiR2x5WVdSbGRtRnlZV1JwWTJGc1FtbG5jbUZrYVdOaGJFSnBaMmR5WVdScFkyRnNZbWxuY21Ga2FXTmhiR0pwWjJkeVlXUnBZMkZzWW5SeVlXUnBZMkZzZEhCeVlXUnBZMkZzZG1WeWRHVjRjbUZrYjNabGNuTnpjWFZoY21WeVlXUnZkbVZ5YzNOeGRXRnlaV1J6Y1hWaGNtVnlZV1J6Y1hWaGNtVnlZV1psY21GbVpXaGxZbkpsZDNKaFozVnFZWEpoZEdseVlXZDFjbTExYTJocGNtRm9hWEpoWjJGdVlYSmhhMkYwWVd0aGJtRnlZV3RoZEdGcllXNWhhR0ZzWm5kcFpIUm9jbUZzYjNkbGNtUnBZV2R2Ym1Gc1ltVnVaMkZzYVhKaGJXbGtaR3hsWkdsaFoyOXVZV3hpWlc1bllXeHBjbUZ0YzJodmNtNXlZVzVuWldSaGMyaHlZWFJwYjNKaWIzQnZiVzltYjNKalpXUnBiR3hoY21OcGNtTnNaWEprWW14bmNtRjJaWEprYjNSaFkyTmxiblJ5Wkc5MFltVnNiM2R5Wkc5MFltVnNiM2R0WVdOeWIyNXlaV1psY21WdVkyVnRZWEpyY21Wb1lYSmhZbWxqY21Wb1lYSnRaVzVwWVc1eVpXaG1hVzVoYkdGeVlXSnBZM0psYUdseVlXZGhibUZ5WldoNVpXaGhiR1ZtYkdGdFlYSmhZbWxqY21WcllYUmhhMkZ1WVhKbGEyRjBZV3RoYm1Gb1lXeG1kMmxrZEdoeVpYTm9jbVZ6YUdSaFoyVnphR2hsWW5KbGQzSmxjMmhvWVhSaFpuQmhkR0ZvY21WemFHaGhkR0ZtY0dGMFlXaG9aV0p5WlhkeVpYTm9hR0YwWVdaelpXZHZiSEpsYzJob1lYUmhabk5sWjI5c2FHVmljbVYzY21WemFHaGxZbkpsZDNKbGMyaG9hWEpwY1hKbGMyaG9hWEpwY1dobFluSmxkM0psYzJob2IyeGhiWEpsYzJob2IyeGhiV2hsWW5KbGQzSmxjMmh3WVhSaGFISmxjMmh3WVhSaGFHaGxZbkpsZDNKbGMyaHhZVzFoZEhOeVpYTm9jV0Z0WVhSemFHVmljbVYzY21WemFIRjFZblYwYzNKbGMyaHhkV0oxZEhOb1pXSnlaWGR5WlhOb2MyVm5iMnh5WlhOb2MyVm5iMnhvWldKeVpYZHlaWE5vYzJobGRtRnlaWE5vYzJobGRtRm9aV0p5WlhkeVpYTm9kSE5sY21WeVpYTm9kSE5sY21Wb1pXSnlaWGR5WlhaaGMzbHRjSFJsY1hWaGJISmxkbVZ5YzJWa2RHbHNaR1Z5WlhacFlXaGxZbkpsZDNKbGRtbGhiWFZuY21GemFHaGxZbkpsZDNKbGRteHZaMmxqWVd4dWIzUnlaWFp6YVcxcGJHRnljbVpwYzJob2IyOXJjbVpwYzJob2IyOXJjbVYyWlhKelpXUnlhR0ZpWlc1bllXeHBjbWhoWkdWMllYSm9iekZ5YUc5dmEzSm9iMjlyZEhWeWJtVmtjbWh2YjJ0MGRYSnVaV1J6ZFhCbGNtbHZjbkpvYjNONWJXSnZiR2R5WldWcmNtaHZkR2xqYUc5dmEyMXZaSEpwWlhWc1lXTnBjbU5zWld0dmNtVmhibkpwWlhWc1lYQmhjbVZ1YTI5eVpXRnVjbWxsZFd4amFYSmpiR1ZyYjNKbFlXNXlhV1YxYkdocFpYVm9hMjl5WldGdWNtbGxkV3hyYVhsbGIydHJiM0psWVc1eWFXVjFiR3RwZVdWdmEzTnBiM05yYjNKbFlXNXlhV1YxYkd0dmNtVmhibkpwWlhWc2JXbGxkVzFyYjNKbFlXNXlhV1YxYkhCaGJuTnBiM05yYjNKbFlXNXlhV1YxYkhCaGNtVnVhMjl5WldGdWNtbGxkV3h3YUdsbGRYQm9hMjl5WldGdWNtbGxkV3h3YVdWMWNHdHZjbVZoYm5KcFpYVnNjR2xsZFhCemFXOXphMjl5WldGdWNtbGxkV3h6YVc5emEyOXlaV0Z1Y21sbGRXeDBhR2xsZFhSb2EyOXlaV0Z1Y21sbGRXeDBhV3RsZFhScmIzSmxZVzV5YVdWMWJIbGxiM0pwYm1ocFpYVm9hMjl5WldGdWNtbG5hSFJoYm1kc1pYSnBaMmgwWVc1bmJHVnVaWEpwWjJoMFlXNW5iR1Z1ZDNKcFoyaDBZVzVuYkdWelpYSnBaMmgwWVc1bmJHVnpkM0pwWjJoMGRHRmphMkpsYkc5M1kyMWljbWxuYUhSMGNtbGhibWRzWlhKcGFHbHlZV2RoYm1GeWFXdGhkR0ZyWVc1aGNtbHJZWFJoYTJGdVlXaGhiR1ozYVdSMGFISnBibWRpWld4dmQyTnRZbkpwYm1kamJXSnlhVzVuWm1sMGRHVmtjbWx1WjJoaGJHWnNaV1owY21sdVoyaGhiR1pzWldaMFlYSnRaVzVwWVc1eWFXNW5hR0ZzWm14bFpuUmlaV3h2ZDJOdFluSnBibWRvWVd4bWJHVm1kR05sYm5SbGNtVmtjbWx1WjJoaGJHWnlhV2RvZEhKcGJtZG9ZV3htY21sbmFIUmlaV3h2ZDJOdFluSnBibWRvWVd4bWNtbG5hSFJqWlc1MFpYSmxaSEpwYm1kcGJtVnhkV0ZzY21sdWRtVnlkR1ZrWW5KbGRtVnlhWFIwYjNKMWMzRjFZWEpsY214cGJtVmlaV3h2ZDNKc2IyNW5iR1ZuY214dmJtZHNaV2QwZFhKdVpXUnliVzl1YjNOd1lXTmxjbTlvYVhKaFoyRnVZWEp2YTJGMFlXdGhibUZ5YjJ0aGRHRnJZVzVoYUdGc1puZHBaSFJvY205eWRXRjBhR0ZwY25CaGNtVnVjbkpoWW1WdVoyRnNhWEp5WVdSbGRtRnljbUZuZFhKdGRXdG9hWEp5WldoaGNtRmlhV055Y21Wb1ptbHVZV3hoY21GaWFXTnljblp2WTJGc2FXTmlaVzVuWVd4cGNuSjJiMk5oYkdsalpHVjJZWEp5ZG05allXeHBZMmQxYW1GeVlYUnBjbkoyYjJOaGJHbGpkbTkzWld4emFXZHVZbVZ1WjJGc2FYSnlkbTlqWVd4cFkzWnZkMlZzYzJsbmJtUmxkbUZ5Y25adlkyRnNhV04yYjNkbGJITnBaMjVuZFdwaGNtRjBhWEp6ZFhCbGNtbHZjbkowWW14dlkydHlkSFZ5Ym1Wa2NuUjFjbTVsWkhOMWNHVnlhVzl5Y25Wb2FYSmhaMkZ1WVhKMWEyRjBZV3RoYm1GeWRXdGhkR0ZyWVc1aGFHRnNabmRwWkhSb2NuVndaV1Z0WVhKclltVnVaMkZzYVhKMWNHVmxjMmxuYm1KbGJtZGhiR2x5ZFhCcFlXaHlkWFJvWVdseWRtOWpZV3hwWTJKbGJtZGhiR2x5ZG05allXeHBZMlJsZG1GeWRtOWpZV3hwWTJkMWFtRnlZWFJwY25adlkyRnNhV04yYjNkbGJITnBaMjVpWlc1bllXeHBjblp2WTJGc2FXTjJiM2RsYkhOcFoyNWtaWFpoY25adlkyRnNhV04yYjNkbGJITnBaMjVuZFdwaGNtRjBhWE5oWW1WdVoyRnNhWE5oWTNWMFpXUnZkR0ZqWTJWdWRITmhaR0Z5WVdKcFkzTmhaR1YyWVhOaFpHWnBibUZzWVhKaFltbGpjMkZrYVc1cGRHbGhiR0Z5WVdKcFkzTmhaRzFsWkdsaGJHRnlZV0pwWTNOaFozVnFZWEpoZEdsellXZDFjbTExYTJocGMyRm9hWEpoWjJGdVlYTmhhMkYwWVd0aGJtRnpZV3RoZEdGcllXNWhhR0ZzWm5kcFpIUm9jMkZzYkdGc2JHRm9iM1ZoYkdGNWFHVjNZWE5oYkd4aGJXRnlZV0pwWTNOaGJXVnJhSE5oYldWcmFHUmhaMlZ6YUhOaGJXVnJhR1JoWjJWemFHaGxZbkpsZDNOaGJXVnJhR2hsWW5KbGQzTmhjbUZoWVhSb1lXbHpZWEpoWVdWMGFHRnBjMkZ5WVdGcGJXRnBiV0ZzWVdsMGFHRnBjMkZ5WVdGcGJXRnBiWFZoYm5Sb1lXbHpZWEpoWVcxMGFHRnBjMkZ5WVdGMGFHRnBjMkZ5WVdWMGFHRnBjMkZ5WVdscGJHVm1kSFJvWVdsellYSmhhV2wwYUdGcGMyRnlZV2xzWldaMGRHaGhhWE5oY21GcGRHaGhhWE5oY21GdmRHaGhhWE5oY21GMVpXVnNaV1owZEdoaGFYTmhjbUYxWldWMGFHRnBjMkZ5WVhWbGJHVm1kSFJvWVdsellYSmhkV1YwYUdGcGMyRnlZWFYwYUdGcGMyRnlZWFYxZEdoaGFYTmhkR2x6Wm1sbGMzTmliM0J2Ylc5bWIzTmpZWEp2Ym1SdmRHRmpZMlZ1ZEhOamFIZGhjMk5vZDJGamVYSnBiR3hwWTNOamFIZGhaR2xsY21WemFYTmplWEpwYkd4cFkzTmphSGRoYUc5dmEzTmphWEpqYkdWelkybHlZM1Z0Wm14bGVITmtiM1JoWTJObGJuUnpaRzkwWW1Wc2IzZHpaRzkwWW1Wc2IzZGtiM1JoWTJObGJuUnpaV0ZuZFd4c1ltVnNiM2RqYldKelpXTnZibVIwYjI1bFkyaHBibVZ6WlhObFpXNWhjbUZpYVdOelpXVnVabWx1WVd4aGNtRmlhV056WldWdWFXNXBkR2xoYkdGeVlXSnBZM05sWlc1dFpXUnBZV3hoY21GaWFXTnpaV2R2YkhObFoyOXNNVE56WldkdmJERm1jMlZuYjJ3eVkzTmxaMjlzYUdWaWNtVjNjMlZuYjJ4dVlYSnliM2RvWldKeVpYZHpaV2R2YkhGMVlYSjBaWEpvWldKeVpYZHpaV2R2YkhSaGFHVmljbVYzYzJWbmIyeDNhV1JsYUdWaWNtVjNjMlZvWVhKdFpXNXBZVzV6WldocGNtRm5ZVzVoYzJWcllYUmhhMkZ1WVhObGEyRjBZV3RoYm1Gb1lXeG1kMmxrZEdoelpXMXBZMjlzYjI1aGNtRmlhV056WlcxcFkyOXNiMjV0YjI1dmMzQmhZMlZ6WlcxcFkyOXNiMjV6YldGc2JITmxiV2wyYjJsalpXUnRZWEpyYTJGdVlYTmxiV2wyYjJsalpXUnRZWEpyYTJGdVlXaGhiR1ozYVdSMGFITmxiblJwYzNGMVlYSmxjMlZ1ZEc5emNYVmhjbVZ6WlhabGJtRnlZV0pwWTNObGRtVnVZbVZ1WjJGc2FYTmxkbVZ1WTJseVkyeGxjMlYyWlc1amFYSmpiR1ZwYm5abGNuTmxjMkZ1YzNObGNtbG1jMlYyWlc1a1pYWmhjMlYyWlc1bGFXZG9kR2h6YzJWMlpXNW5kV3BoY21GMGFYTmxkbVZ1WjNWeWJYVnJhR2x6WlhabGJtaGhZMnRoY21GaWFXTnpaWFpsYm1oaGJtZDZhRzkxYzJWMlpXNXBaR1Z2WjNKaGNHaHBZM0JoY21WdWMyVjJaVzVwYm1abGNtbHZjbk5sZG1WdWJXOXViM053WVdObGMyVjJaVzV2YkdSemRIbHNaWE5sZG1WdWNHRnlaVzV6WlhabGJuQmxjbWx2WkhObGRtVnVjR1Z5YzJsaGJuTmxkbVZ1Y205dFlXNXpaWFpsYm5OMWNHVnlhVzl5YzJWMlpXNTBaV1Z1WTJseVkyeGxjMlYyWlc1MFpXVnVjR0Z5Wlc1elpYWmxiblJsWlc1d1pYSnBiMlJ6WlhabGJuUm9ZV2x6Wm5Sb2VYQm9aVzV6YUdGaGNtMWxibWxoYm5Ob1lXSmxibWRoYkdsemFHRmplWEpwYkd4cFkzTm9ZV1JrWVdGeVlXSnBZM05vWVdSa1lXUmhiVzFoWVhKaFltbGpjMmhoWkdSaFpHRnRiV0YwWVc1aGNtRmlhV056YUdGa1pHRm1ZWFJvWVdGeVlXSnBZM05vWVdSa1lXWmhkR2hoZEdGdVlYSmhZbWxqYzJoaFpHUmhhMkZ6Y21GaGNtRmlhV056YUdGa1pHRnJZWE55WVhSaGJtRnlZV0pwWTNOb1lXUmxjMmhoWkdWa1lYSnJjMmhoWkdWc2FXZG9kSE5vWVdSbGJXVmthWFZ0YzJoaFpHVjJZWE5vWVdkMWFtRnlZWFJwYzJoaFozVnliWFZyYUdsemFHRnNjMmhsYkdWMGFHVmljbVYzYzJoaGNuQnphR0p2Y0c5dGIyWnZjMmhqYUdGamVYSnBiR3hwWTNOb1pXVnVZWEpoWW1samMyaGxaVzVtYVc1aGJHRnlZV0pwWTNOb1pXVnVhVzVwZEdsaGJHRnlZV0pwWTNOb1pXVnViV1ZrYVdGc1lYSmhZbWxqYzJobGFXTnZjSFJwWTNOb1pYRmxiSE5vWlhGbGJHaGxZbkpsZDNOb1pYWmhjMmhsZG1FeE1UVnphR1YyWVRFMWMyaGxkbUV5TW5Ob1pYWmhNbVZ6YUdWMllXaGxZbkpsZDNOb1pYWmhibUZ5Y205M2FHVmljbVYzYzJobGRtRnhkV0Z5ZEdWeWFHVmljbVYzYzJobGRtRjNhV1JsYUdWaWNtVjNjMmhvWVdONWNtbHNiR2xqYzJocFpuUnNaV1owYzJocFpuUnlhV2RvZEhOb2FXMWhZMjl3ZEdsamMyaHBibk5vYVc1a1lXZGxjMmh6YUdsdVpHRm5aWE5vYUdWaWNtVjNjMmhwYm1SaFoyVnphSE5vYVc1a2IzUnphR2x1WkdGblpYTm9jMmhwYm1SdmRHaGxZbkpsZDNOb2FXNWtZV2RsYzJoemFXNWtiM1J6YUdsdVpHRm5aWE5vYzJsdVpHOTBhR1ZpY21WM2MyaHBibVJ2ZEdobFluSmxkM05vYVc1b1pXSnlaWGR6YUdsdWMyaHBibVJ2ZEhOb2FXNXphR2x1Wkc5MGFHVmljbVYzYzJocGJuTnBibVJ2ZEhOb2FXNXphVzVrYjNSb1pXSnlaWGR6YUc5dmEzTnBaMjFoWm1sdVlXeHphV2R0WVd4MWJtRjBaWE41YldKdmJHZHlaV1ZyYzJsb2FYSmhaMkZ1WVhOcGEyRjBZV3RoYm1GemFXdGhkR0ZyWVc1aGFHRnNabmRwWkhSb2MybHNkWEZvWldKeVpYZHphV3gxY1d4bFpuUm9aV0p5WlhkemFXMXBiR0Z5WlhGMVlXeHphVzVrYjNSb1pXSnlaWGR6YVc5ellXTnBjbU5zWld0dmNtVmhibk5wYjNOaGNHRnlaVzVyYjNKbFlXNXphVzl6WTJsbGRXTnJiM0psWVc1emFXOXpZMmx5WTJ4bGEyOXlaV0Z1YzJsdmMydHBlV1Z2YTJ0dmNtVmhibk5wYjNOcmIzSmxZVzV6YVc5emJtbGxkVzVyYjNKbFlXNXphVzl6Y0dGeVpXNXJiM0psWVc1emFXOXpjR2xsZFhCcmIzSmxZVzV6YVc5emRHbHJaWFYwYTI5eVpXRnVjMmw0WVhKaFltbGpjMmw0WW1WdVoyRnNhWE5wZUdOcGNtTnNaWE5wZUdOcGNtTnNaV2x1ZG1WeWMyVnpZVzV6YzJWeWFXWnphWGhrWlhaaGMybDRaM1ZxWVhKaGRHbHphWGhuZFhKdGRXdG9hWE5wZUdoaFkydGhjbUZpYVdOemFYaG9ZVzVuZW1odmRYTnBlR2xrWlc5bmNtRndhR2xqY0dGeVpXNXphWGhwYm1abGNtbHZjbk5wZUcxdmJtOXpjR0ZqWlhOcGVHOXNaSE4wZVd4bGMybDRjR0Z5Wlc1emFYaHdaWEpwYjJSemFYaHdaWEp6YVdGdWMybDRjbTl0WVc1emFYaHpkWEJsY21sdmNuTnBlSFJsWlc1amFYSmpiR1Z6YVhoMFpXVnVZM1Z5Y21WdVkzbGtaVzV2YldsdVlYUnZjbUpsYm1kaGJHbHphWGgwWldWdWNHRnlaVzV6YVhoMFpXVnVjR1Z5YVc5a2MybDRkR2hoYVhOc1lYTm9RbWxuYzJ4aGMyaENhV2RuYzJ4aGMyaGlhV2R6YkdGemFHSnBaMmR6YkdGemFHMXZibTl6Y0dGalpYTnNiMjVuYzJ4dmJtZGtiM1JoWTJObGJuUnpiSFZ5WVdKdmRtVnpiSFZ5WW1Wc2IzZHpiV2xzWlhOdGFXeGxabUZqWlhOdGIyNXZjM0JoWTJWemIyWndZWE4xY1dobFluSmxkM052Wm5Sb2VYQm9aVzV6YjJaMGMybG5ibU41Y21sc2JHbGpjMjlvYVhKaFoyRnVZWE52YTJGMFlXdGhibUZ6YjJ0aGRHRnJZVzVoYUdGc1puZHBaSFJvYzI5c2FXUjFjMnh2Ym1kdmRtVnliR0Y1WTIxaWMyOXNhV1IxYzNOb2IzSjBiM1psY214aGVXTnRZbk52Y25WemFYUm9ZV2x6YjNOaGJHRjBhR0ZwYzI5emIzUm9ZV2x6YjNOMVlYUm9ZV2x6Y0dGalpXaGhZMnRoY21GaWFXTnpjR0ZrWlhOMWFYUmliR0ZqYTNOd1lXUmxjM1ZwZEhkb2FYUmxjM0JoY21WdWMzQm9aWEpwWTJGc1lXNW5iR1Z6Y1hWaGNtVnpjWFZoY21WaVpXeHZkMk50WW5OeGRXRnlaV05qYzNGMVlYSmxZMjF6Y1hWaGNtVmthV0ZuYjI1aGJHTnliM056YUdGMFkyaG1hV3hzYzNGMVlYSmxaRzkwYzNGMVlYSmxhRzl5YVhwdmJuUmhiR1pwYkd4emNYVmhjbVZwYldGblpYTnhkV0Z5Wld0bmMzRjFZWEpsYTIxemNYVmhjbVZyYldOaGNHbDBZV3h6Y1hWaGNtVnNibk54ZFdGeVpXeHZaM054ZFdGeVpXMW5jM0YxWVhKbGJXbHNjM0YxWVhKbGJXbHVkWE56Y1hWaGNtVnRiWE54ZFdGeVpXMXpjWFZoY21Wa2MzRjFZWEpsYlhWc2RHbHdiSGx6Y1hWaGNtVnZjbWxuYVc1aGJITnhkV0Z5Wlc5eWRHaHZaMjl1WVd4amNtOXpjMmhoZEdOb1ptbHNiSE54ZFdGeVpYQnNkWE56Y1hWaGNtVnpiMnhwWkhOeGRXRnlaWFZ3Y0dWeWJHVm1kSFJ2Ykc5M1pYSnlhV2RvZEdacGJHeHpjWFZoY21WMWNIQmxjbkpwWjJoMGRHOXNiM2RsY214bFpuUm1hV3hzYzNGMVlYSmxkbVZ5ZEdsallXeG1hV3hzYzNGMVlYSmxkMmhwZEdWM2FYUm9jMjFoYkd4aWJHRmphM054ZFdsbloyeGxiR1ZtZEhKcFoyaDBjM0YxYVdkbmJHVnlhV2RvZEhOeWMzRjFZWEpsYzNOaFltVnVaMkZzYVhOellXUmxkbUZ6YzJGbmRXcGhjbUYwYVhOellXNW5ZMmxsZFdOcmIzSmxZVzV6YzJGdVoyaHBaWFZvYTI5eVpXRnVjM05oYm1kcFpYVnVaMnR2Y21WaGJuTnpZVzVuYTJsNVpXOXJhMjl5WldGdWMzTmhibWR1YVdWMWJtdHZjbVZoYm5OellXNW5jR2xsZFhCcmIzSmxZVzV6YzJGdVozTnBiM05yYjNKbFlXNXpjMkZ1WjNScGEyVjFkR3R2Y21WaGJuTnpkWEJsY21sdmNuTjBjM1JoY25OMFpYSnNhVzVuYlc5dWIzTndZV05sYzNSeWIydGxiRzl1WjI5MlpYSnNZWGxqYldKemRISnZhMlZ6YUc5eWRHOTJaWEpzWVhsamJXSnpkV0p6WlhSemRXSnpaWFJrWW14emRXSnpaWFJrWW14bGNYVmhiSE4xWW5ObGRHNXZkR1Z4YkhOMVluTmxkRzV2ZEdWeGRXRnNjM1ZpYzJWMGIzSmxjWFZoYkhOMVluTmxkRzl5Ym05MFpHSnNaWEZzYzNWaWMyVjBjM0ZsY1hWaGJITjFZMk5sWldSemMzVm9hWEpoWjJGdVlYTjFhMkYwWVd0aGJtRnpkV3RoZEdGcllXNWhhR0ZzWm5kcFpIUm9jM1ZyZFc1aGNtRmlhV056ZFcxdFlYUnBiMjVrYVhOd2JHRjVjM1Z0YldGMGFXOXVkR1Y0ZEhOMWJuTjFjR1Z5YzJWMGMzVndaWEp6WlhSa1lteHpkWEJsY25ObGRHUmliR1Z4ZFdGc2MzVndaWEp6WlhSdWIzUmxjV3h6ZFhCbGNuTmxkRzV2ZEdWeGRXRnNjM1Z3WlhKelpYUnZjbVZ4ZFdGc2MzVndaWEp6WlhSdmNtNXZkR1JpYkdWeGJITjFjR1Z5YzJWMGMzRmxjWFZoYkhOMmMzRjFZWEpsYzNsdmRYZGhaWEpoYzNGMVlYSmxkR0ZpWlc1bllXeHBkR0ZqYTJSdmQyNTBZV05yYkdWbWRIUmhaR1YyWVhSaFozVnFZWEpoZEdsMFlXZDFjbTExYTJocGRHRm9ZWEpoWW1samRHRm9abWx1WVd4aGNtRmlhV04wWVdocGJtbDBhV0ZzWVhKaFltbGpkR0ZvYVhKaFoyRnVZWFJoYUcxbFpHbGhiR0Z5WVdKcFkzUmhhWE41YjNWbGNtRnpjWFZoY21WMFlXdGhkR0ZyWVc1aGRHRnJZWFJoYTJGdVlXaGhiR1ozYVdSMGFIUmhkSGRsWld4aGNtRmlhV04wWVhaMFlYWmtZV2RsYzNSaGRtUmhaMlZ6YUhSaGRtUmhaMlZ6YUdobFluSmxkM1JoZG1obFluSmxkM1JpWVhKMFltOXdiMjF2Wm05MFkyTjFjbXgwWTJWa2FXeHNZWFJqYUdWb1lYSmhZbWxqZEdOb1pXaG1hVzVoYkdGeVlXSnBZM1JqYUdWb2FXNXBkR2xoYkdGeVlXSnBZM1JqYUdWb2JXVmthV0ZzWVhKaFltbGpkR05vWldodFpXVnRhVzVwZEdsaGJHRnlZV0pwWTNSamFYSmpiR1YwWTJseVkzVnRabXhsZUdKbGJHOTNkR1JwWlhKbGMybHpkR1J2ZEdGalkyVnVkSFJrYjNSaVpXeHZkM1JsWTNseWFXeHNhV04wWldSbGMyTmxibVJsY21ONWNtbHNiR2xqZEdWb1lYSmhZbWxqZEdWb1ptbHVZV3hoY21GaWFXTjBaV2hvWVdocGJtbDBhV0ZzWVhKaFltbGpkR1ZvYUdGb2FYTnZiR0YwWldSaGNtRmlhV04wWldocGJtbDBhV0ZzWVhKaFltbGpkR1ZvYVhKaFoyRnVZWFJsYUdwbFpXMXBibWwwYVdGc1lYSmhZbWxqZEdWb2FtVmxiV2x6YjJ4aGRHVmtZWEpoWW1samRHVm9iV0Z5WW5WMFlXRnlZV0pwWTNSbGFHMWhjbUoxZEdGbWFXNWhiR0Z5WVdKcFkzUmxhRzFsWkdsaGJHRnlZV0pwWTNSbGFHMWxaVzFwYm1sMGFXRnNZWEpoWW1samRHVm9iV1ZsYldsemIyeGhkR1ZrWVhKaFltbGpkR1ZvYm05dmJtWnBibUZzWVhKaFltbGpkR1ZyWVhSaGEyRnVZWFJsYTJGMFlXdGhibUZvWVd4bWQybGtkR2gwWld4bGNHaHZibVYwWld4bGNHaHZibVZpYkdGamEzUmxiR2x6YUdGblpXUnZiR0ZvWldKeVpYZDBaV3hwYzJoaGNXVjBZVzVoYUdWaWNtVjNkR1Z1WTJseVkyeGxkR1Z1YVdSbGIyZHlZWEJvYVdOd1lYSmxiblJsYm5CaGNtVnVkR1Z1Y0dWeWFXOWtkR1Z1Y205dFlXNTBaWE5vZEdWMGRHVjBaR0ZuWlhOb2RHVjBaR0ZuWlhOb2FHVmljbVYzZEdWMGFHVmljbVYzZEdWMGMyVmplWEpwYkd4cFkzUmxkbWx5YUdWaWNtVjNkR1YyYVhKc1pXWjBhR1ZpY21WM2RHaGhZbVZ1WjJGc2FYUm9ZV1JsZG1GMGFHRm5kV3BoY21GMGFYUm9ZV2QxY20xMWEyaHBkR2hoYkdGeVlXSnBZM1JvWVd4bWFXNWhiR0Z5WVdKcFkzUm9ZVzUwYUdGcmFHRjBiRzkzYkdWbWRIUm9ZV2wwYUdGdWRHaGhhMmhoZEd4dmQzSnBaMmgwZEdoaGFYUm9ZVzUwYUdGcmFHRjBkR2hoYVhSb1lXNTBhR0ZyYUdGMGRYQndaWEpzWldaMGRHaGhhWFJvWldoaGNtRmlhV04wYUdWb1ptbHVZV3hoY21GaWFXTjBhR1ZvYVc1cGRHbGhiR0Z5WVdKcFkzUm9aV2h0WldScFlXeGhjbUZpYVdOMGFHVnlaV1Y0YVhOMGMzUm9aWFJoYzNsdFltOXNaM0psWld0MGFHbGxkWFJvWVdOcGNtTnNaV3R2Y21WaGJuUm9hV1YxZEdoaGNHRnlaVzVyYjNKbFlXNTBhR2xsZFhSb1kybHlZMnhsYTI5eVpXRnVkR2hwWlhWMGFHdHZjbVZoYm5Sb2FXVjFkR2h3WVhKbGJtdHZjbVZoYm5Sb2FYSjBaV1Z1WTJseVkyeGxkR2hwY25SbFpXNXdZWEpsYm5Sb2FYSjBaV1Z1Y0dWeWFXOWtkR2h2Ym1GdVoyMXZiblJvYjNSb1lXbDBhRzl2YTNSb2IzQm9kWFJvWVc5MGFHRnBkR2h2ZEdoaGFHRnVkR2hoYVhSb2IzUm9ZVzUwYUdGcGRHaHZkR2h2Ym1kMGFHRnBkR2h2ZEdoMWJtZDBhR0ZwZEdodmRYTmhibVJqZVhKcGJHeHBZM1JvYjNWellXNWtjM05sY0dGeVlYUnZjbUZ5WVdKcFkzUm9iM1Z6WVc1a2MzTmxjR0Z5WVhSdmNuQmxjbk5wWVc1MGFISmxaV0Z5WVdKcFkzUm9jbVZsWW1WdVoyRnNhWFJvY21WbFkybHlZMnhsZEdoeVpXVmphWEpqYkdWcGJuWmxjbk5sYzJGdWMzTmxjbWxtZEdoeVpXVmtaWFpoZEdoeVpXVmxhV2RvZEdoemRHaHlaV1ZuZFdwaGNtRjBhWFJvY21WbFozVnliWFZyYUdsMGFISmxaV2hoWTJ0aGNtRmlhV04wYUhKbFpXaGhibWQ2YUc5MWRHaHlaV1ZwWkdWdlozSmhjR2hwWTNCaGNtVnVkR2h5WldWcGJtWmxjbWx2Y25Sb2NtVmxiVzl1YjNOd1lXTmxkR2h5WldWdWRXMWxjbUYwYjNKaVpXNW5ZV3hwZEdoeVpXVnZiR1J6ZEhsc1pYUm9jbVZsY0dGeVpXNTBhSEpsWlhCbGNtbHZaSFJvY21WbGNHVnljMmxoYm5Sb2NtVmxjWFZoY25SbGNuTmxiV1JoYzJoMGFISmxaWEp2YldGdWRHaHlaV1YwYUdGcGRHaDZjM0YxWVhKbGRHbGxkR2xvYVhKaFoyRnVZWFJwYTJGMFlXdGhibUYwYVd0aGRHRnJZVzVoYUdGc1puZHBaSFJvZEdsclpYVjBZV05wY21Oc1pXdHZjbVZoYm5ScGEyVjFkR0Z3WVhKbGJtdHZjbVZoYm5ScGEyVjFkR05wY21Oc1pXdHZjbVZoYm5ScGEyVjFkR3R2Y21WaGJuUnBhMlYxZEhCaGNtVnVhMjl5WldGdWRHbHNaR1ZpWld4dmQyTnRZblJwYkdSbFkyMWlkR2xzWkdWamIyMWlkR2xzWkdWa2IzVmliR1ZqYldKMGFXeGtaVzl3WlhKaGRHOXlkR2xzWkdWdmRtVnliR0Y1WTIxaWRHbHNaR1YyWlhKMGFXTmhiR050WW5ScGJHUmxkMmxrWlhScGJHUmxkMmxrWlhKMGFXeGtaWGRwWkdWeWNuUnBiR1JsZDJsa1pYTjBkR2x0WlhOamFYSmpiR1YwYVhCbGFHRm9aV0p5WlhkMGFYQmxhR0ZzWldaMGFHVmljbVYzZEdsd2NHbG5kWEp0ZFd0b2FYUnBkR3h2WTNseWFXeHNhV05qYldKMGFYZHVZWEp0Wlc1cFlXNTBiR2x1WldKbGJHOTNkRzF2Ym05emNHRmpaWFJ2WVhKdFpXNXBZVzUwYjJocGNtRm5ZVzVoZEc5cllYUmhhMkZ1WVhSdmEyRjBZV3RoYm1Gb1lXeG1kMmxrZEdoMGIyNWxZbUZ5WlhoMGNtRm9hV2RvYlc5a2RHOXVaV0poY21WNGRISmhiRzkzYlc5a2RHOXVaV0poY21ocFoyaHRiMlIwYjI1bFltRnliRzkzYlc5a2RHOXVaV0poY20xcFpHMXZaSFJ2Ym1WbWFYWmxkRzl1WlhOcGVIUnZibVYwZDI5MGIyNXZjM1J2Ym5OeGRXRnlaWFJ2Y0dGMFlXdDBhR0ZwZEc5eWRHOXBjMlZ6YUdWc2JHSnlZV05yWlhSc1pXWjBkRzl5ZEc5cGMyVnphR1ZzYkdKeVlXTnJaWFJzWldaMGMyMWhiR3gwYjNKMGIybHpaWE5vWld4c1luSmhZMnRsZEd4bFpuUjJaWEowYVdOaGJIUnZjblJ2YVhObGMyaGxiR3hpY21GamEyVjBjbWxuYUhSMGIzSjBiMmx6WlhOb1pXeHNZbkpoWTJ0bGRISnBaMmgwYzIxaGJHeDBiM0owYjJselpYTm9aV3hzWW5KaFkydGxkSEpwWjJoMGRtVnlkR2xqWVd4MGIzUmhiM1JvWVdsMGNHRnNZWFJoYkdodmIydDBjR0Z5Wlc1MGNtVjBjbTltYkdWNGFHOXZhM1J5YVdGblpHNTBjbWxoWjJ4bWRISnBZV2R5ZEhSeWFXRm5kWEIwY21saGJtZHNaWFJ5YVdGdVoyeGxaRzkzYm5Oc1pIUnlhV0Z1WjJ4bGFXNTJkSEpwWVc1bmJHVnNaV1owZEhKcFlXNW5iR1ZzWldaMFpYRjFZV3gwY21saGJtZHNaV3hsWm5SemJHUjBjbWxoYm1kc1pYSnBaMmgwZEhKcFlXNW5iR1Z5YVdkb2RHVnhkV0ZzZEhKcFlXNW5iR1Z5YVdkb2RITnNaSFJ5YVdGdVoyeGxjMjlzYVdSMGMzUnpZV1JwZEhOaFpHbGtZV2RsYzJoMGMyRmthV1JoWjJWemFHaGxZbkpsZDNSellXUnBhR1ZpY21WM2RITmxZM2x5YVd4c2FXTjBjMlZ5WlhSelpYSmxNVEowYzJWeVpURmxkSE5sY21VeVluUnpaWEpsYUdWaWNtVjNkSE5sY21WdVlYSnliM2RvWldKeVpYZDBjMlZ5WlhGMVlYSjBaWEpvWldKeVpYZDBjMlZ5WlhkcFpHVm9aV0p5WlhkMGMyaGxZM2x5YVd4c2FXTjBjM1Z3WlhKcGIzSjBkR0ZpWlc1bllXeHBkSFJoWkdWMllYUjBZV2QxYW1GeVlYUnBkSFJoWjNWeWJYVnJhR2wwZEdWb1lYSmhZbWxqZEhSbGFHWnBibUZzWVhKaFltbGpkSFJsYUdsdWFYUnBZV3hoY21GaWFXTjBkR1ZvYldWa2FXRnNZWEpoWW1samRIUm9ZV0psYm1kaGJHbDBkR2hoWkdWMllYUjBhR0ZuZFdwaGNtRjBhWFIwYUdGbmRYSnRkV3RvYVhSMGRYSnVaV1IwZFdocGNtRm5ZVzVoZEhWcllYUmhhMkZ1WVhSMWEyRjBZV3RoYm1Gb1lXeG1kMmxrZEdoMGRYSnVjM1JwYkdWc1pXWjBkSFZ5Ym5OMGFXeGxjbWxuYUhSMGRYTnRZV3hzYUdseVlXZGhibUYwZFhOdFlXeHNhMkYwWVd0aGJtRjBkWE50WVd4c2EyRjBZV3RoYm1Gb1lXeG1kMmxrZEdoMGQyVnNkbVZqYVhKamJHVjBkMlZzZG1Wd1lYSmxiblIzWld4MlpYQmxjbWx2WkhSM1pXeDJaWEp2YldGdWRIZGxiSFpsZFdSaGMyaDBkMlZ1ZEhsamFYSmpiR1YwZDJWdWRIbG9ZVzVuZW1odmRYUjNaVzUwZVhCaGNtVnVkSGRsYm5SNWNHVnlhVzlrZEhkdllYSmhZbWxqZEhkdlltVnVaMkZzYVhSM2IyTnBjbU5zWlhSM2IyTnBjbU5zWldsdWRtVnljMlZ6WVc1emMyVnlhV1owZDI5a1pYWmhkSGR2Wkc5MFpXNXNaV0ZrWlhKMGQyOWtiM1JzWldGa1pYSjBkMjlrYjNSc1pXRmtaWEoyWlhKMGFXTmhiSFIzYjJkMWFtRnlZWFJwZEhkdlozVnliWFZyYUdsMGQyOW9ZV05yWVhKaFltbGpkSGR2YUdGdVozcG9iM1YwZDI5cFpHVnZaM0poY0docFkzQmhjbVZ1ZEhkdmFXNW1aWEpwYjNKMGQyOXRiMjV2YzNCaFkyVjBkMjl1ZFcxbGNtRjBiM0ppWlc1bllXeHBkSGR2YjJ4a2MzUjViR1YwZDI5d1lYSmxiblIzYjNCbGNtbHZaSFIzYjNCbGNuTnBZVzUwZDI5eWIyMWhiblIzYjNOMGNtOXJaWFIzYjNSb1lXbDBkMjkwYUdseVpITjFZbUZ5ZFdKbGJtZGhiR2wxWW05d2IyMXZabTkxWW5KbGRtVjFZMkZ5YjI1MVkybHlZMnhsZFdOcGNtTjFiV1pzWlhoaVpXeHZkM1ZqZVhKcGJHeHBZM1ZrWVhSMFlXUmxkbUYxWkdKc1lXTjFkR1YxWkdKc1ozSmhkbVYxWkdWMllYVmthV1Z5WlhOcGMyRmpkWFJsZFdScFpYSmxjMmx6WW1Wc2IzZDFaR2xsY21WemFYTmpZWEp2Ym5Wa2FXVnlaWE5wYzJONWNtbHNiR2xqZFdScFpYSmxjMmx6WjNKaGRtVjFaR2xsY21WemFYTnRZV055YjI1MVpHOTBZbVZzYjNkMVozVnFZWEpoZEdsMVozVnliWFZyYUdsMWFHbHlZV2RoYm1GMWFHOXZhMkZpYjNabGRXaHZjbTUxYUc5eWJtRmpkWFJsZFdodmNtNWtiM1JpWld4dmQzVm9iM0p1WjNKaGRtVjFhRzl5Ym1odmIydGhZbTkyWlhWb2IzSnVkR2xzWkdWMWFIVnVaMkZ5ZFcxc1lYVjBZM2x5YVd4c2FXTjFhVzUyWlhKMFpXUmljbVYyWlhWcllYUmhhMkZ1WVhWcllYUmhhMkZ1WVdoaGJHWjNhV1IwYUhWclkzbHlhV3hzYVdOMWEyOXlaV0Z1ZFcxaFkzSnZibU41Y21sc2JHbGpkVzFoWTNKdmJtUnBaWEpsYzJsemRXMWhkSEpoWjNWeWJYVnJhR2wxYlc5dWIzTndZV05sZFc1a1pYSnpZMjl5WldSaWJIVnVaR1Z5YzJOdmNtVnRiMjV2YzNCaFkyVjFibVJsY25OamIzSmxkbVZ5ZEdsallXeDFibVJsY25OamIzSmxkMkYyZVhWdWFXOXVaR0pzZFc1cGIyNWthWE53YkdGNWRXNXBiMjV0ZFd4MGFYVnVhVzl1YlhWc2RHbGthWE53YkdGNWRXNXBiMjV0ZFd4MGFYUmxlSFIxYm1sdmJuTnhkVzVwYjI1emNXUnBjM0JzWVhsMWJtbHZibk54ZEdWNGRIVnVhVzl1ZEdWNGRIVndZWEpsYm5Wd1lteHZZMnQxY0hCbGNtUnZkR2hsWW5KbGQzVndjbWx6WlhWd2MybHNiMjVrYVdWeVpYTnBjM1Z3YzJsc2IyNWthV1Z5WlhOcGMzUnZibTl6ZFhCemFXeHZibXhoZEdsdWRYQnphV3h2Ym5SdmJtOXpkWEJ6Ykc5d1pYVndkR0ZqYTJKbGJHOTNZMjFpZFhCMFlXTnJiVzlrZFhKaFozVnliWFZyYUdsMWMyaHZjblJqZVhKcGJHeHBZM1Z6YldGc2JHaHBjbUZuWVc1aGRYTnRZV3hzYTJGMFlXdGhibUYxYzIxaGJHeHJZWFJoYTJGdVlXaGhiR1ozYVdSMGFIVnpkSEpoYVdkb2RHTjVjbWxzYkdsamRYTjBjbUZwWjJoMGMzUnliMnRsWTNseWFXeHNhV04xZEdsc1pHVjFkR2xzWkdWaFkzVjBaWFYwYVd4a1pXSmxiRzkzZFhWaVpXNW5ZV3hwZFhWa1pYWmhkWFZuZFdwaGNtRjBhWFYxWjNWeWJYVnJhR2wxZFcxaGRISmhaM1Z5YlhWcmFHbDFkWFp2ZDJWc2MybG5ibUpsYm1kaGJHbDFkWFp2ZDJWc2MybG5ibVJsZG1GMWRYWnZkMlZzYzJsbmJtZDFhbUZ5WVhScGRYWnZkMlZzYzJsbmJtSmxibWRoYkdsMWRtOTNaV3h6YVdkdVpHVjJZWFYyYjNkbGJITnBaMjVuZFdwaGNtRjBhWFpoWkdWMllYWmhaM1ZxWVhKaGRHbDJZV2QxY20xMWEyaHBkbUZyWVhSaGEyRnVZWFpoZG5aaGRtUmhaMlZ6YUhaaGRtUmhaMlZ6YURZMWRtRjJaR0ZuWlhOb2FHVmljbVYzZG1GMmFHVmljbVYzZG1GMmFHOXNZVzEyWVhab2IyeGhiV2hsWW5KbGQzWmhkblpoZG1obFluSmxkM1poZG5sdlpHaGxZbkpsZDNaamFYSmpiR1YyWkc5MFltVnNiM2QyWldOMGIzSjJaV041Y21sc2JHbGpkbVZvWVhKaFltbGpkbVZvWm1sdVlXeGhjbUZpYVdOMlpXaHBibWwwYVdGc1lYSmhZbWxqZG1Wb2JXVmthV0ZzWVhKaFltbGpkbVZyWVhSaGEyRnVZWFpsYm5WemRtVnlkR2xqWVd4aVlYSjJaWEowYVdOaGJHeHBibVZoWW05MlpXTnRZblpsY25ScFkyRnNiR2x1WldKbGJHOTNZMjFpZG1WeWRHbGpZV3hzYVc1bGJHOTNiVzlrZG1WeWRHbGpZV3hzYVc1bGJXOWtkbVYzWVhKdFpXNXBZVzUyWlhoMFpXNWtaRzkxWW14bGRtVjRkR1Z1WkhOcGJtZHNaWFpvYjI5cmRtbHJZWFJoYTJGdVlYWnBjbUZ0WVdKbGJtZGhiR2wyYVhKaGJXRmtaWFpoZG1seVlXMWhaM1ZxWVhKaGRHbDJhWE5oY21kaFltVnVaMkZzYVhacGMyRnlaMkZrWlhaaGRtbHpZWEpuWVdkMWFtRnlZWFJwZG1semFXSnNaWE53WVdObGRtbHpkV0ZzYzNCaFkyVjJiVzl1YjNOd1lXTmxkbTloY20xbGJtbGhiblp2YVdObFpHbDBaWEpoZEdsdmJtaHBjbUZuWVc1aGRtOXBZMlZrYVhSbGNtRjBhVzl1YTJGMFlXdGhibUYyYjJsalpXUnRZWEpyYTJGdVlYWnZhV05sWkcxaGNtdHJZVzVoYUdGc1puZHBaSFJvZG05cllYUmhhMkZ1WVhad1lYSmxiblowYVd4a1pYWjBkWEp1WldSMmRXaHBjbUZuWVc1aGRuVnJZWFJoYTJGdVlYZGhZM1YwWlhkaFpXdHZjbVZoYm5kaGFHbHlZV2RoYm1GM1lXdGhkR0ZyWVc1aGQyRnJZWFJoYTJGdVlXaGhiR1ozYVdSMGFIZGhhMjl5WldGdWQyRnpiV0ZzYkdocGNtRm5ZVzVoZDJGemJXRnNiR3RoZEdGcllXNWhkMkYwZEc5emNYVmhjbVYzWVhabFpHRnphSGRoZG5sMWJtUmxjbk5qYjNKbGRtVnlkR2xqWVd4M1lYZGhjbUZpYVdOM1lYZG1hVzVoYkdGeVlXSnBZM2RoZDJoaGJYcGhZV0p2ZG1WaGNtRmlhV04zWVhkb1lXMTZZV0ZpYjNabFptbHVZV3hoY21GaWFXTjNZbk54ZFdGeVpYZGphWEpqYkdWM1kybHlZM1Z0Wm14bGVIZGthV1Z5WlhOcGMzZGtiM1JoWTJObGJuUjNaRzkwWW1Wc2IzZDNaV2hwY21GbllXNWhkMlZyWVhSaGEyRnVZWGRsYTI5eVpXRnVkMlZ2YTI5eVpXRnVkMmR5WVhabGQyaHBkR1ZpZFd4c1pYUjNhR2wwWldOcGNtTnNaWGRvYVhSbFkybHlZMnhsYVc1MlpYSnpaWGRvYVhSbFkyOXlibVZ5WW5KaFkydGxkR3hsWm5SM2FHbDBaV052Y201bGNtSnlZV05yWlhSc1pXWjBkbVZ5ZEdsallXeDNhR2wwWldOdmNtNWxjbUp5WVdOclpYUnlhV2RvZEhkb2FYUmxZMjl5Ym1WeVluSmhZMnRsZEhKcFoyaDBkbVZ5ZEdsallXeDNhR2wwWldScFlXMXZibVIzYUdsMFpXUnBZVzF2Ym1SamIyNTBZV2x1YVc1bllteGhZMnR6YldGc2JHUnBZVzF2Ym1SM2FHbDBaV1J2ZDI1d2IybHVkR2x1WjNOdFlXeHNkSEpwWVc1bmJHVjNhR2wwWldSdmQyNXdiMmx1ZEdsdVozUnlhV0Z1WjJ4bGQyaHBkR1ZzWldaMGNHOXBiblJwYm1kemJXRnNiSFJ5YVdGdVoyeGxkMmhwZEdWc1pXWjBjRzlwYm5ScGJtZDBjbWxoYm1kc1pYZG9hWFJsYkdWdWRHbGpkV3hoY21KeVlXTnJaWFJzWldaMGQyaHBkR1ZzWlc1MGFXTjFiR0Z5WW5KaFkydGxkSEpwWjJoMGQyaHBkR1Z5YVdkb2RIQnZhVzUwYVc1bmMyMWhiR3gwY21saGJtZHNaWGRvYVhSbGNtbG5hSFJ3YjJsdWRHbHVaM1J5YVdGdVoyeGxkMmhwZEdWemJXRnNiSE54ZFdGeVpYZG9hWFJsYzIxcGJHbHVaMlpoWTJWM2FHbDBaWE54ZFdGeVpYZG9hWFJsYzNSaGNuZG9hWFJsZEdWc1pYQm9iMjVsZDJocGRHVjBiM0owYjJselpYTm9aV3hzWW5KaFkydGxkR3hsWm5SM2FHbDBaWFJ2Y25SdmFYTmxjMmhsYkd4aWNtRmphMlYwY21sbmFIUjNhR2wwWlhWd2NHOXBiblJwYm1kemJXRnNiSFJ5YVdGdVoyeGxkMmhwZEdWMWNIQnZhVzUwYVc1bmRISnBZVzVuYkdWM2FXaHBjbUZuWVc1aGQybHJZWFJoYTJGdVlYZHBhMjl5WldGdWQyMXZibTl6Y0dGalpYZHZhR2x5WVdkaGJtRjNiMnRoZEdGcllXNWhkMjlyWVhSaGEyRnVZV2hoYkdaM2FXUjBhSGR2Ym5kdmJtMXZibTl6Y0dGalpYZHZkMkZsYm5Sb1lXbDNjR0Z5Wlc1M2NtVmhkR2h3Y205a2RXTjBkM0pwYm1kM2MzVndaWEpwYjNKM2RIVnlibVZrZDNsdWJuaGhZbTkyWldOdFluaGliM0J2Ylc5bWIzaGphWEpqYkdWNFpHbGxjbVZ6YVhONFpHOTBZV05qWlc1MGVHVm9ZWEp0Wlc1cFlXNTRiVzl1YjNOd1lXTmxlSEJoY21WdWVITjFjR1Z5YVc5eWVXRmhaRzl6Y1hWaGNtVjVZV0psYm1kaGJHbDVZV1JsZG1GNVlXVnJiM0psWVc1NVlXZDFhbUZ5WVhScGVXRm5kWEp0ZFd0b2FYbGhhR2x5WVdkaGJtRjVZV3RoZEdGcllXNWhlV0ZyWVhSaGEyRnVZV2hoYkdaM2FXUjBhSGxoYTI5eVpXRnVlV0Z0WVd0cllXNTBhR0ZwZVdGemJXRnNiR2hwY21GbllXNWhlV0Z6YldGc2JHdGhkR0ZyWVc1aGVXRnpiV0ZzYkd0aGRHRnJZVzVoYUdGc1puZHBaSFJvZVdGMFkzbHlhV3hzYVdONVkybHlZMnhsZVdOcGNtTjFiV1pzWlhoNVpHOTBZV05qWlc1MGVXUnZkR0psYkc5M2VXVm9ZWEpoWW1samVXVm9ZbUZ5Y21WbFlYSmhZbWxqZVdWb1ltRnljbVZsWm1sdVlXeGhjbUZpYVdONVpXaG1hVzVoYkdGeVlXSnBZM2xsYUdoaGJYcGhZV0p2ZG1WaGNtRmlhV041Wldob1lXMTZZV0ZpYjNabFptbHVZV3hoY21GaWFXTjVaV2hvWVcxNllXRmliM1psYVc1cGRHbGhiR0Z5WVdKcFkzbGxhR2hoYlhwaFlXSnZkbVZ0WldScFlXeGhjbUZpYVdONVpXaHBibWwwYVdGc1lYSmhZbWxqZVdWb2JXVmthV0ZzWVhKaFltbGplV1ZvYldWbGJXbHVhWFJwWVd4aGNtRmlhV041WldodFpXVnRhWE52YkdGMFpXUmhjbUZpYVdONVpXaHViMjl1Wm1sdVlXeGhjbUZpYVdONVpXaDBhSEpsWldSdmRITmlaV3h2ZDJGeVlXSnBZM2xsYTI5eVpXRnVlV1Z1Ylc5dWIzTndZV05sZVdWdmEyOXlaV0Z1ZVdWdmNtbHVhR2xsZFdocmIzSmxZVzU1WlhKaGFHSmxibmx2Ylc5b1pXSnlaWGQ1WlhKaGFHSmxibmx2Ylc5c1pXWjBhR1ZpY21WM2VXVnlhV041Y21sc2JHbGplV1Z5ZFdScFpYSmxjMmx6WTNseWFXeHNhV041WlhOcFpYVnVaMnR2Y21WaGJubGxjMmxsZFc1bmNHRnVjMmx2YzJ0dmNtVmhibmxsYzJsbGRXNW5jMmx2YzJ0dmNtVmhibmxsZEdsMmFHVmljbVYzZVdkeVlYWmxlV2h2YjJ0NWFHOXZhMkZpYjNabGVXbGhjbTFsYm1saGJubHBZM2x5YVd4c2FXTjVhV3R2Y21WaGJubHBibmxoYm1kNWFYZHVZWEp0Wlc1cFlXNTViVzl1YjNOd1lXTmxlVzlrZVc5a1pHRm5aWE5vZVc5a1pHRm5aWE5vYUdWaWNtVjNlVzlrYUdWaWNtVjNlVzlrZVc5a2FHVmljbVYzZVc5a2VXOWtjR0YwWVdob1pXSnlaWGQ1YjJocGNtRm5ZVzVoZVc5cGEyOXlaV0Z1ZVc5cllYUmhhMkZ1WVhsdmEyRjBZV3RoYm1Gb1lXeG1kMmxrZEdoNWIydHZjbVZoYm5sdmMyMWhiR3hvYVhKaFoyRnVZWGx2YzIxaGJHeHJZWFJoYTJGdVlYbHZjMjFoYkd4cllYUmhhMkZ1WVdoaGJHWjNhV1IwYUhsdmRHZHlaV1ZyZVc5NVlXVnJiM0psWVc1NWIzbGhhMjl5WldGdWVXOTVZV3QwYUdGcGVXOTVhVzVuZEdoaGFYbHdZWEpsYm5sd2IyZGxaM0poYlcxbGJtbDVjRzluWldkeVlXMXRaVzVwWjNKbFpXdGpiV0o1Y25seWFXNW5lWE4xY0dWeWFXOXllWFJwYkdSbGVYUjFjbTVsWkhsMWFHbHlZV2RoYm1GNWRXbHJiM0psWVc1NWRXdGhkR0ZyWVc1aGVYVnJZWFJoYTJGdVlXaGhiR1ozYVdSMGFIbDFhMjl5WldGdWVYVnpZbWxuWTNseWFXeHNhV041ZFhOaWFXZHBiM1JwWm1sbFpHTjVjbWxzYkdsamVYVnpiR2wwZEd4bFkzbHlhV3hzYVdONWRYTnNhWFIwYkdWcGIzUnBabWxsWkdONWNtbHNiR2xqZVhWemJXRnNiR2hwY21GbllXNWhlWFZ6YldGc2JHdGhkR0ZyWVc1aGVYVnpiV0ZzYkd0aGRHRnJZVzVoYUdGc1puZHBaSFJvZVhWNVpXdHZjbVZoYm5sMWVXVnZhMjl5WldGdWVYbGhZbVZ1WjJGc2FYbDVZV1JsZG1GNllXRnliV1Z1YVdGdWVtRmtaWFpoZW1GbmRYSnRkV3RvYVhwaGFHRnlZV0pwWTNwaGFHWnBibUZzWVhKaFltbGplbUZvYVc1cGRHbGhiR0Z5WVdKcFkzcGhhR2x5WVdkaGJtRjZZV2h0WldScFlXeGhjbUZpYVdONllXbHVZWEpoWW1samVtRnBibVpwYm1Gc1lYSmhZbWxqZW1GcllYUmhhMkZ1WVhwaGNXVm1aMkZrYjJ4b1pXSnlaWGQ2WVhGbFpuRmhkR0Z1YUdWaWNtVjNlbUZ5Y1dGb1pXSnlaWGQ2WVhscGJucGhlV2x1WkdGblpYTm9lbUY1YVc1a1lXZGxjMmhvWldKeVpYZDZZWGxwYm1obFluSmxkM3BpYjNCdmJXOW1iM3BqYVhKamJHVjZZMmx5WTNWdFpteGxlSHBqZFhKc2VtUnZkSHBrYjNSaVpXeHZkM3BsWTNseWFXeHNhV042WldSbGMyTmxibVJsY21ONWNtbHNiR2xqZW1Wa2FXVnlaWE5wYzJONWNtbHNiR2xqZW1Wb2FYSmhaMkZ1WVhwbGEyRjBZV3RoYm1GNlpYSnZZWEpoWW1samVtVnliMkpsYm1kaGJHbDZaWEp2WkdWMllYcGxjbTluZFdwaGNtRjBhWHBsY205bmRYSnRkV3RvYVhwbGNtOW9ZV05yWVhKaFltbGplbVZ5YjJsdVptVnlhVzl5ZW1WeWIyMXZibTl6Y0dGalpYcGxjbTl2YkdSemRIbHNaWHBsY205d1pYSnphV0Z1ZW1WeWIzTjFjR1Z5YVc5eWVtVnliM1JvWVdsNlpYSnZkMmxrZEdocWIybHVaWEo2WlhKdmQybGtkR2h1YjI1cWIybHVaWEo2WlhKdmQybGtkR2h6Y0dGalpYcG9ZbTl3YjIxdlptOTZhR1ZoY20xbGJtbGhibnBvWldKeVpYWmxZM2x5YVd4c2FXTjZhR1ZqZVhKcGJHeHBZM3BvWldSbGMyTmxibVJsY21ONWNtbHNiR2xqZW1obFpHbGxjbVZ6YVhOamVYSnBiR3hwWTNwcGFHbHlZV2RoYm1GNmFXdGhkR0ZyWVc1aGVtbHViM0pvWldKeVpYZDZiR2x1WldKbGJHOTNlbTF2Ym05emNHRmpaWHB2YUdseVlXZGhibUY2YjJ0aGRHRnJZVzVoZW5CaGNtVnVlbkpsZEhKdlpteGxlR2h2YjJ0NmMzUnliMnRsZW5Wb2FYSmhaMkZ1WVhwMWEyRjBZV3RoYm1FdmFHOXRaUzl5ZFc1dVpYSXZMbU5oY21kdkwzSmxaMmx6ZEhKNUwzTnlZeTlwYm1SbGVDNWpjbUYwWlhNdWFXOHRNVGswT1dObU9HTTJZalZpTlRVM1ppOXdaR1l0WlhoMGNtRmpkQzB3TGprdU1DOXpjbU12WjJ4NWNHaHVZVzFsY3k1eWN3Q3FleE1BWlFBQUFHWVNBQUFjQUFBQUwzSjFjM1JqTHpaaU1EQmlZek00T0RBeE9UZzJNREF4TXpCbE1XTm1OakppT0dZNFlUa3pORGswTkRnNFkyTXZiR2xpY21GeWVTOWpiM0psTDNOeVl5OXBkR1Z5TDNSeVlXbDBjeTlwZEdWeVlYUnZjaTV5Y3lCOEV3QllBQUFBMFFjQUFBa0FBQUFBQUFFQUFnQURBQVFBQlFBR0FBY0FDQUFKQUFvQUN3QU1BQTBBRGdBUEFCQUFFUUFTQUJNQUZBQVZBQllBRndEWUFzY0N4Z0xaQXQwQzJ3TGFBdHdDSUFBaEFDSUFJd0FrQUNVQUpnQW5BQ2dBS1FBcUFDc0FMQUF0QUM0QUx3QXdBREVBTWdBekFEUUFOUUEyQURjQU9BQTVBRG9BT3dBOEFEMEFQZ0EvQUVBQVFRQkNBRU1BUkFCRkFFWUFSd0JJQUVrQVNnQkxBRXdBVFFCT0FFOEFVQUJSQUZJQVV3QlVBRlVBVmdCWEFGZ0FXUUJhQUZzQVhBQmRBRjRBWHdCZ0FHRUFZZ0JqQUdRQVpRQm1BR2NBYUFCcEFHb0Fhd0JzQUcwQWJnQnZBSEFBY1FCeUFITUFkQUIxQUhZQWR3QjRBSGtBZWdCN0FId0FmUUIrQUFBQUlpQWdJQ0VnSmlBVUlCTWdrZ0ZFSURrZ09pQVNJakFnSGlBY0lCMGdHQ0FaSUJvZ0lpRUIrd0w3UVFGU0FXQUJlQUY5QVRFQlFnRlRBV0VCZmdFQUFLd2dvUUNpQUtNQXBBQ2xBS1lBcHdDb0FLa0FxZ0NyQUt3QUFBQ3VBSzhBc0FDeEFMSUFzd0MwQUxVQXRnQzNBTGdBdVFDNkFMc0F2QUM5QUw0QXZ3REFBTUVBd2dEREFNUUF4UURHQU1jQXlBREpBTW9BeXdETUFNMEF6Z0RQQU5BQTBRRFNBTk1BMUFEVkFOWUExd0RZQU5rQTJnRGJBTndBM1FEZUFOOEE0QURoQU9JQTR3RGtBT1VBNWdEbkFPZ0E2UURxQU9zQTdBRHRBTzRBN3dEd0FQRUE4Z0R6QVBRQTlRRDJBUGNBK0FENUFQb0Erd0Q4QVAwQS9nRC9BQnlERkFCZUFBQUFxQUFBQUJVQUFBQWNneFFBWGdBQUFOVUFBQUFxQUFBQUhJTVVBRjRBQUFCcUFRQUFSd0FBQUJ5REZBQmVBQUFBTEFJQUFGY0FBQUF2YUc5dFpTOXlkVzV1WlhJdkxtTmhjbWR2TDNKbFoybHpkSEo1TDNOeVl5OXBibVJsZUM1amNtRjBaWE11YVc4dE1UazBPV05tT0dNMllqVmlOVFUzWmk5d1pHWXRaWGgwY21GamRDMHdMamt1TUM5emNtTXZlbUZ3Wm1kc2VYQm9ibUZ0WlhNdWNuTUFBQURJZmhNQWFRQUFBTkVBQUFBY0FBQUFBQUFBQUFRQUFBQUVBQUFBVlFFQUFBQUFBQUFFQUFBQUJBQUFBRllCQUFBQUFBQUFCQUFBQUFRQUFBQnVBQUFBVDNCbGNtRjBhVzl1YjNCbGNtRjBiM0p2Y0dWeVlXNWtjMFp5YjIxVmRHWXhOa1Z5Y205eWMzQmhZMlZsZUdOc1lXMXhkVzkwWldSaWJHNTFiV0psY25OcFoyNWtiMnhzWVhKd1pYSmpaVzUwWVcxd1pYSnpZVzVrY1hWdmRHVnlhV2RvZEhCaGNtVnViR1ZtZEhCaGNtVnVjbWxuYUhSaGMzUmxjbWx6YTNCc2RYTmpiMjF0WVdoNWNHaGxibkJsY21sdlpITnNZWE5vZW1WeWIyOXVaWFIzYjNSb2NtVmxabTkxY21acGRtVnphWGh6WlhabGJtVnBaMmgwYm1sdVpXTnZiRzl1YzJWdGFXTnZiRzl1YkdWemMyVnhkV0ZzWjNKbFlYUmxjbkYxWlhOMGFXOXVZWFJCUWtORVJVWkhTRWxLUzB4TlRrOVFVVkpUVkZWV1YxaFpXbUp5WVdOclpYUnNaV1owWW1GamEzTnNZWE5vWW5KaFkydGxkSEpwWjJoMFlYTmphV2xqYVhKamRXMTFibVJsY25OamIzSmxjWFZ2ZEdWc1pXWjBZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5kNGVYcGljbUZqWld4bFpuUmlZWEppY21GalpYSnBaMmgwWVhOamFXbDBhV3hrWldWNFkyeGhiV1J2ZDI1alpXNTBjM1JsY214cGJtZG1jbUZqZEdsdmJubGxibVpzYjNKcGJuTmxZM1JwYjI1amRYSnlaVzVqZVhGMWIzUmxjMmx1WjJ4bGNYVnZkR1ZrWW14c1pXWjBaM1ZwYkd4bGJXOTBiR1ZtZEdkMWFXeHphVzVuYkd4bFpuUm5kV2xzYzJsdVoyeHlhV2RvZEdacFpteGxibVJoYzJoa1lXZG5aWEprWVdkblpYSmtZbXh3WlhKcGIyUmpaVzUwWlhKbFpIQmhjbUZuY21Gd2FHSjFiR3hsZEhGMWIzUmxjMmx1WjJ4aVlYTmxjWFZ2ZEdWa1lteGlZWE5sY1hWdmRHVmtZbXh5YVdkb2RHZDFhV3hzWlcxdmRISnBaMmgwWld4c2FYQnphWE53WlhKMGFHOTFjMkZ1WkhGMVpYTjBhVzl1Wkc5M2JtZHlZWFpsWVdOMWRHVmphWEpqZFcxbWJHVjRkR2xzWkdWdFlXTnliMjVpY21WMlpXUnZkR0ZqWTJWdWRHUnBaWEpsYzJsemNtbHVaMk5sWkdsc2JHRm9kVzVuWVhKMWJXeGhkWFJ2WjI5dVpXdGpZWEp2Ym1WdFpHRnphRUZGYjNKa1ptVnRhVzVwYm1WTWMyeGhjMmhQYzJ4aGMyaFBSVzl5WkcxaGMyTjFiR2x1WldGbFpHOTBiR1Z6YzJsc2MyeGhjMmh2YzJ4aGMyaHZaV2RsY20xaGJtUmliSE5KWkdsbGNtVnphWE5sWVdOMWRHVmhZbkpsZG1WMWFIVnVaMkZ5ZFcxc1lYVjBaV05oY205dVdXUnBaWEpsYzJselpHbDJhV1JsV1dGamRYUmxRV05wY21OMWJXWnNaWGhoWVdOMWRHVlZZMmx5WTNWdFpteGxlSGxoWTNWMFpYTmpiMjF0WVdGalkyVnVkR1ZqYVhKamRXMW1iR1Y0VlhKcGJtZFZaR2xsY21WemFYTmhiMmR2Ym1WclZXRmpkWFJsZFc5bmIyNWxhMFZrYVdWeVpYTnBjMFJqY205aGRHTnZiVzFoWVdOalpXNTBZMjl3ZVhKcFoyaDBSVzFoWTNKdmJtTmpZWEp2Ym1GeWFXNW5UbU52YlcxaFlXTmpaVzUwYkdGamRYUmxZV2R5WVhabFZHTnZiVzFoWVdOalpXNTBRMkZqZFhSbFlYUnBiR1JsUldSdmRHRmpZMlZ1ZEhOallYSnZibk5qWldScGJHeGhhV0ZqZFhSbGJHOTZaVzVuWlZKallYSnZia2RqYjIxdFlXRmpZMlZ1ZEhWamFYSmpkVzFtYkdWNFlXTnBjbU4xYldac1pYaEJiV0ZqY205dWNtTmhjbTl1WTJObFpHbHNiR0ZhWkc5MFlXTmpaVzUwVkdodmNtNVBiV0ZqY205dVVtRmpkWFJsVTJGamRYUmxaR05oY205dVZXMWhZM0p2Ym5WeWFXNW5kR2h5WldWemRYQmxjbWx2Y2s5bmNtRjJaVUZuY21GMlpVRmljbVYyWlcxMWJIUnBjR3g1ZFdGamRYUmxWR05oY205dWNHRnlkR2xoYkdScFptWjVaR2xsY21WemFYTk9ZV04xZEdWcFkybHlZM1Z0Wm14bGVFVmphWEpqZFcxbWJHVjRZV1JwWlhKbGMybHpaV1JwWlhKbGMybHpZMkZqZFhSbGJtRmpkWFJsZFcxaFkzSnZiazVqWVhKdmJrbGhZM1YwWlhCc2RYTnRhVzUxYzJKeWIydGxibUpoY25KbFoybHpkR1Z5WldSSFluSmxkbVZKWkc5MFlXTmpaVzUwYzNWdGJXRjBhVzl1UldkeVlYWmxjbUZqZFhSbGIyMWhZM0p2YmxwaFkzVjBaVnBqWVhKdmJtZHlaV0YwWlhKbGNYVmhiRVYwYUVOalpXUnBiR3hoYkdOdmJXMWhZV05qWlc1MGRHTmhjbTl1Wlc5bmIyNWxhMVZ2WjI5dVpXdEJZV04xZEdWQlpHbGxjbVZ6YVhObFozSmhkbVY2WVdOMWRHVnBiMmR2Ym1WclQyRmpkWFJsYjJGamRYUmxZVzFoWTNKdmJuTmhZM1YwWldsa2FXVnlaWE5wYzA5amFYSmpkVzFtYkdWNFZXZHlZWFpsUkdWc2RHRjBhRzl5Ym5SM2IzTjFjR1Z5YVc5eVQyUnBaWEpsYzJsemJYVnBaM0poZG1WdmFIVnVaMkZ5ZFcxc1lYVjBSVzluYjI1bGEyUmpjbTloZEhSb2NtVmxjWFZoY25SbGNuTlRZMlZrYVd4c1lXeGpZWEp2Ymt0amIyMXRZV0ZqWTJWdWRFeGhZM1YwWlhSeVlXUmxiV0Z5YTJWa2IzUmhZMk5sYm5SSlozSmhkbVZKYldGamNtOXVUR05oY205dWIyNWxhR0ZzWm14bGMzTmxjWFZoYkc5amFYSmpkVzFtYkdWNGJuUnBiR1JsVldoMWJtZGhjblZ0YkdGMWRFVmhZM1YwWldWdFlXTnliMjVuWW5KbGRtVnZibVZ4ZFdGeWRHVnlVMk5oY205dVUyTnZiVzFoWVdOalpXNTBUMmgxYm1kaGNuVnRiR0YxZEdSbFozSmxaVzluY21GMlpVTmpZWEp2Ym5WbmNtRjJaWEpoWkdsallXeEVZMkZ5YjI1eVkyOXRiV0ZoWTJObGJuUk9kR2xzWkdWdmRHbHNaR1ZTWTI5dGJXRmhZMk5sYm5STVkyOXRiV0ZoWTJObGJuUkJkR2xzWkdWQmIyZHZibVZyUVhKcGJtZFBkR2xzWkdWNlpHOTBZV05qWlc1MFJXTmhjbTl1U1c5bmIyNWxhMnRqYjIxdFlXRmpZMlZ1ZEcxcGJuVnpTV05wY21OMWJXWnNaWGh1WTJGeWIyNTBZMjl0YldGaFkyTmxiblJzYjJkcFkyRnNibTkwYjJScFpYSmxjMmx6ZFdScFpYSmxjMmx6Ym05MFpYRjFZV3huWTI5dGJXRmhZMk5sYm5SbGRHaDZZMkZ5YjI1dVkyOXRiV0ZoWTJObGJuUnZibVZ6ZFhCbGNtbHZjbWx0WVdOeWIyNUZkWEp2QUFBQUlBQkJ0WS9PQUFzTXdJSkFtMzhUQUFVQUFBQWhBRUhOajg0QUN3ekFna0NnZnhNQUJnQUFBQ0lBUWVXUHpnQUxETUNDUUtaL0V3QUlBQUFBSXdCQi9ZL09BQXNNd0lKQXJuOFRBQW9BQUFBa0FFR1ZrTTRBQ3d6QWdrQzRmeE1BQmdBQUFDVUFRYTJRemdBTERNQ0NRTDUvRXdBSEFBQUFKZ0JCeFpET0FBc013SUpBeFg4VEFBa0FBQUFuQUVIZGtNNEFDd3pBZ2tET2Z4TUFDZ0FBQUNnQVFmV1F6Z0FMRE1DQ1FOaC9Fd0FKQUFBQUtRQkJqWkhPQUFzTXdJSkE0WDhUQUFvQUFBQXFBRUdsa2M0QUN3ekFna0RyZnhNQUNBQUFBQ3NBUWIyUnpnQUxETUNDUVBOL0V3QUVBQUFBTEFCQjFaSE9BQXNNd0lKQTkzOFRBQVVBQUFBdEFFSHRrYzRBQ3d6QWdrRDhmeE1BQmdBQUFDNEFRWVdTemdBTERNQ0NRQUtBRXdBR0FBQUFMd0JCblpMT0FBc013SUpBQ0lBVEFBVUFBQUF3QUVHMWtzNEFDd3pBZ2tBTmdCTUFCQUFBQURFQVFjMlN6Z0FMRE1DQ1FCR0FFd0FEQUFBQU1nQkI1WkxPQUFzTXdJSkFGSUFUQUFNQUFBQXpBRUg5a3M0QUN3ekFna0FYZ0JNQUJRQUFBRFFBUVpXVHpnQUxETUNDUUJ5QUV3QUVBQUFBTlFCQnJaUE9BQXNNd0lKQUlJQVRBQVFBQUFBMkFFSEZrODRBQ3d6QWdrQWtnQk1BQXdBQUFEY0FRZDJUemdBTERNQ0NRQ2VBRXdBRkFBQUFPQUJCOVpQT0FBc013SUpBTElBVEFBVUFBQUE1QUVHTmxNNEFDd3pBZ2tBeGdCTUFCQUFBQURvQVFhV1V6Z0FMRE1DQ1FEV0FFd0FGQUFBQU93QkJ2WlRPQUFzTXdJSkFPb0FUQUFrQUFBQThBRUhWbE00QUN3ekFna0JEZ0JNQUJBQUFBRDBBUWUyVXpnQUxETUNDUUVlQUV3QUZBQUFBUGdCQmhaWE9BQXNNd0lKQVRJQVRBQWNBQUFBL0FFR2RsYzRBQ3d6QWdrQlRnQk1BQ0FBQUFFQUFRYldWemdBTERNQ0NRRnVBRXdBQ0FBQUFRUUJCelpYT0FBc013SUpBWFlBVEFBRUFBQUJDQUVIbGxjNEFDd3pBZ2tCZWdCTUFBUUFBQUVNQVFmMlZ6Z0FMRE1DQ1FGK0FFd0FCQUFBQVJBQkJsWmJPQUFzTXdJSkFZSUFUQUFFQUFBQkZBRUd0bHM0QUN3ekFna0JoZ0JNQUFRQUFBRVlBUWNXV3pnQUxETUNDUUdLQUV3QUJBQUFBUndCQjNaYk9BQXNNd0lKQVk0QVRBQUVBQUFCSUFFSDFsczRBQ3d6QWdrQmtnQk1BQVFBQUFFa0FRWTJYemdBTERNQ0NRR1dBRXdBQkFBQUFTZ0JCcFpmT0FBc013SUpBWm9BVEFBRUFBQUJMQUVHOWw4NEFDd3pBZ2tCbmdCTUFBUUFBQUV3QVFkV1h6Z0FMRE1DQ1FHaUFFd0FCQUFBQVRRQkI3WmZPQUFzTXdJSkFhWUFUQUFFQUFBQk9BRUdGbU00QUN3ekFna0JxZ0JNQUFRQUFBRThBUVoyWXpnQUxETUNDUUd1QUV3QUJBQUFBVUFCQnRaak9BQXNNd0lKQWJJQVRBQUVBQUFCUkFFSE5tTTRBQ3d6QWdrQnRnQk1BQVFBQUFGSUFRZVdZemdBTERNQ0NRRzZBRXdBQkFBQUFVd0JCL1pqT0FBc013SUpBYjRBVEFBRUFBQUJVQUVHVm1jNEFDd3pBZ2tCd2dCTUFBUUFBQUZVQVFhMlp6Z0FMRE1DQ1FIR0FFd0FCQUFBQVZnQkJ4Wm5PQUFzTXdJSkFjb0FUQUFFQUFBQlhBRUhkbWM0QUN3ekFna0J6Z0JNQUFRQUFBRmdBUWZXWnpnQUxETUNDUUhTQUV3QUJBQUFBV1FCQmpack9BQXNNd0lKQWRZQVRBQUVBQUFCYUFFR2xtczRBQ3d6QWdrQjJnQk1BQVFBQUFGc0FRYjJhemdBTERNQ0NRSGVBRXdBTEFBQUFYQUJCMVpyT0FBc013SUpBZ29BVEFBa0FBQUJkQUVIdG1zNEFDd3pBZ2tDTGdCTUFEQUFBQUY0QVFZV2J6Z0FMRE1DQ1FKZUFFd0FMQUFBQVh3QkJuWnZPQUFzTXdJSkFvb0FUQUFvQUFBQmdBRUcxbTg0QUN3ekFna0NzZ0JNQUNRQUFBR0VBUWMyYnpnQUxETUNDUUxXQUV3QUJBQUFBWWdCQjVadk9BQXNNd0lKQXRvQVRBQUVBQUFCakFFSDltODRBQ3d6QWdrQzNnQk1BQVFBQUFHUUFRWldjemdBTERNQ0NRTGlBRXdBQkFBQUFaUUJCclp6T0FBc013SUpBdVlBVEFBRUFBQUJtQUVIRm5NNEFDd3pBZ2tDNmdCTUFBUUFBQUdjQVFkMmN6Z0FMRE1DQ1FMdUFFd0FCQUFBQWFBQkI5WnpPQUFzTXdJSkF2SUFUQUFFQUFBQnBBRUdObmM0QUN3ekFna0M5Z0JNQUFRQUFBR29BUWFXZHpnQUxETUNDUUw2QUV3QUJBQUFBYXdCQnZaM09BQXNNd0lKQXY0QVRBQUVBQUFCc0FFSFZuYzRBQ3d6QWdrREFnQk1BQVFBQUFHMEFRZTJkemdBTERNQ0NRTUdBRXdBQkFBQUFiZ0JCaFo3T0FBc013SUpBd29BVEFBRUFBQUJ2QUVHZG5zNEFDd3pBZ2tERGdCTUFBUUFBQUhBQVFiV2V6Z0FMRE1DQ1FNU0FFd0FCQUFBQWNRQkJ6WjdPQUFzTXdJSkF4WUFUQUFFQUFBQnlBRUhsbnM0QUN3ekFna0RHZ0JNQUFRQUFBSE1BUWYyZXpnQUxETUNDUU1lQUV3QUJBQUFBZEFCQmxaL09BQXNNd0lKQXlJQVRBQUVBQUFCMUFFR3RuODRBQ3d6QWdrREpnQk1BQVFBQUFIWUFRY1dmemdBTERNQ0NRTXFBRXdBQkFBQUFkd0JCM1ovT0FBc013SUpBeTRBVEFBRUFBQUI0QUVIMW44NEFDd3pBZ2tETWdCTUFBUUFBQUhrQVFZMmd6Z0FMRE1DQ1FNMkFFd0FCQUFBQWVnQkJwYURPQUFzTXdJSkF6b0FUQUFFQUFBQjdBRUc5b000QUN3ekFna0RQZ0JNQUNRQUFBSHdBUWRXZ3pnQUxETUNDUU5pQUV3QURBQUFBZlFCQjdhRE9BQXNNd0lKQTI0QVRBQW9BQUFCK0FFR0ZvYzRBQ3d6QWdrRGxnQk1BQ2dBQUFLRUFRWjJoemdBTERNQ0NRTytBRXdBS0FBQUFvZ0JCdGFIT0FBc013SUpBK1lBVEFBUUFBQUNqQUVITm9jNEFDd3pBZ2tEOWdCTUFDQUFBQUtRQVFlV2h6Z0FMRE1DQ1FBV0JFd0FJQUFBQXBRQkIvYUhPQUFzTXdJSkFEWUVUQUFNQUFBQ21BRUdWb3M0QUN3ekFna0FRZ1JNQUJnQUFBS2NBUWEyaXpnQUxETUNDUUJhQkV3QUhBQUFBcUFCQnhhTE9BQXNNd0lKQUhZRVRBQWdBQUFDcEFFSGRvczRBQ3d6QWdrQWxnUk1BQ3dBQUFLb0FRZldpemdBTERNQ0NRRENCRXdBTUFBQUFxd0JCamFQT0FBc013SUpBUElFVEFBMEFBQUNzQUVHbG84NEFDd3pBZ2tCSmdSTUFEUUFBQUswQVFiMmp6Z0FMRE1DQ1FGYUJFd0FPQUFBQXJnQkIxYVBPQUFzTXdJSkFaSUVUQUFJQUFBQ3ZBRUh0bzg0QUN3ekFna0JtZ1JNQUFnQUFBTEVBUVlXa3pnQUxETUNDUUdpQkV3QUdBQUFBc2dCQm5hVE9BQXNNd0lKQWJvRVRBQVlBQUFDekFFRzFwTTRBQ3d6QWdrQjBnUk1BQ1FBQUFMUUFRYzJremdBTERNQ0NRSDJCRXdBT0FBQUF0Z0JCNWFUT0FBc013SUpBaTRFVEFBa0FBQUMzQUVIOXBNNEFDd3pBZ2tDVWdSTUFCZ0FBQUxnQVFaV2x6Z0FMRE1DQ1FKcUJFd0FPQUFBQXVRQkJyYVhPQUFzTXdJSkFxSUVUQUF3QUFBQzZBRUhGcGM0QUN3ekFna0MwZ1JNQURRQUFBTHNBUWQybHpnQUxETUNDUU1HQkV3QU9BQUFBdkFCQjlhWE9BQXNNd0lKQXo0RVRBQWdBQUFDOUFFR05wczRBQ3d6QWdrRFhnUk1BQ3dBQUFMOEFRYVdtemdBTERNQ0NRT0tCRXdBTUFBQUF3UUJCdmFiT0FBc013SUpBN29FVEFBVUFBQURDQUVIVnBzNEFDd3pBZ2tEemdSTUFCUUFBQU1NQVFlMm16Z0FMRE1DQ1FQaUJFd0FLQUFBQXhBQkJoYWZPQUFzTXdJSkFBb0lUQUFVQUFBREZBRUdkcDg0QUN3ekFna0FIZ2hNQUJnQUFBTVlBUWJXbnpnQUxETUNDUUEyQ0V3QUZBQUFBeHdCQnphZk9BQXNNd0lKQUVvSVRBQWtBQUFESUFFSGxwODRBQ3d6QWdrQWJnaE1BQ0FBQUFNb0FRZjJuemdBTERNQ0NRQ09DRXdBRUFBQUF5d0JCbGFqT0FBc013SUpBSjRJVEFBY0FBQUROQUVHdHFNNEFDd3pBZ2tBdWdoTUFEQUFBQU00QVFjV296Z0FMRE1DQ1FEcUNFd0FHQUFBQXp3QkIzYWpPQUFzTXdJSkFRSUlUQUFVQUFBRFFBRUgxcU00QUN3ekFna0JGZ2hNQUJnQUFBT0VBUVkycHpnQUxETUNDUUV1Q0V3QUNBQUFBNHdCQnBhbk9BQXNNd0lKQVRZSVRBQXNBQUFEb0FFRzlxYzRBQ3d6QWdrQllnaE1BQmdBQUFPa0FRZFdwemdBTERNQ0NRRjZDRXdBR0FBQUE2Z0JCN2FuT0FBc013SUpBWklJVEFBSUFBQURyQUVHRnFzNEFDd3pBZ2tCbWdoTUFEQUFBQVBFQVFaMnF6Z0FMRE1DQ1FIS0NFd0FDQUFBQTlRQkJ0YXJPQUFzTXdJSkFkSUlUQUFnQUFBRDRBRUhOcXM0QUN3ekFna0I4Z2hNQUJnQUFBUGtBUWVXcXpnQUxETUNDUUlLQ0V3QUdBQUFBK2dCQi9hck9BQXNNd0lKQWlJSVRBQUlBQUFEN0FFR1ZxODRBQyt3ZndJSkFpb0lUQUFvQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQWxJSVRBQWtBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBbllJVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFvNElUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQXFZSVRBQTBBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBdG9JVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkF2SUlUQUFrQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQXhZSVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBeTRJVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkEwWUlUQUFzQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQTNJSVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBNG9JVEFBc0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkE3WUlUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQTg0SVRBQXdBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBLzRJVEFBc0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFDb01UQUFVQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQUQ0TVRBQWtBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBR0lNVEFBY0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFINE1UQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQUpZTVRBQWNBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBTElNVEFBa0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFOWU1UQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQU80TVRBQXNBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBUm9NVEFBa0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFUNE1UQUFjQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQVZvTVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBWElNVEFBVUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFZWU1UQUF3QUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQWJZTVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBYzRNVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFlWU1UQUF3QUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQWhZTVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBaTRNVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFrWU1UQUFvQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQW00TVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBb1lNVEFBZ0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFxWU1UQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQXI0TVRBQWNBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBdG9NVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkF2SU1UQUF3QUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQXlJTVRBQXNBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBMDRNVEFBc0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkEzb01UQUFjQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQTVZTVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBNjRNVEFBZ0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkE4NE1UQUFvQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQS9ZTVRBQVVBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBQW9RVEFBY0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFDWVFUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQUQ0UVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBRllRVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFHNFFUQUFjQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQUlvUVRBQVVBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBSjRRVEFBMEFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFOSVFUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQU9vUVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBUUlRVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFSb1FUQUFnQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQVRvUVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBVklRVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFXb1FUQUFzQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQVpZUVRBQWtBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBYm9RVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFkSVFUQUFzQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQWY0UVRBQXNBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBaW9RVEFBa0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFrNFFUQUFrQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQW5JUVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBb29RVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFxSVFUQUFjQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQXI0UVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBdFlRVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkF1NFFUQUFrQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQXhJUVRBQWtBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBellRVEFBb0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkExNFFUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQTNZUVRBQW9BQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBNTRRVEFBa0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkE4SVFUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQTlvUVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBL0lRVEFBY0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFBNFVUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQUNZVVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBRDRVVEFBd0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFHNFVUQUFNQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQUhvVVRBQWdBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBSm9VVEFBd0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFNb1VUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQU9JVVRBQWNBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBUDRVVEFBY0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFSb1VUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQVRJVVRBQWtBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBVllVVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFXNFVUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQVlZVVRBQWNBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBYUlVVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFib1VUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQWRJVVRBQWNBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBZTRVVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFnWVVUQUFrQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQWlvVVRBQXNBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBbFlVVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFtNFVUQUFVQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQW9JVVRBQVVBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBcFlVVEFBc0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFzSVVUQUFrQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQXVZVVRBQUlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBdTRVVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkF3WVVUQUEwQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQXpvVVRBQWNBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBMVlVVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkEyNFVUQUEwQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQTZJVVRBQWdBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBOElVVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkE5b1VUQUF3QUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQUFvWVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBQ0lZVEFBa0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFFWVlUQUFvQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQUc0WVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBSVlZVEFBY0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFLSVlUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQUxvWVRBQWNBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBTllZVEFBa0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFQb1lUQUFzQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQVNZWVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBVDRZVEFBMEFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFYSVlUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQVlvWVRBQWNBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBYVlZVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFiNFlUQUFvQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQWVZWVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBZjRZVEFBd0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFpNFlUQUEwQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQW1JWVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBbm9ZVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFwSVlUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQXFvWVRBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBc0lZVEFBY0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkF0NFlUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQXZZWVRBQXdBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBeVlZVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkF6NFlUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQTFZWVRBQXdBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBNFlZVEFBd0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkE3WVlUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQTg0WVRBQWNBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBK29ZVEFBVUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkEvNFlUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQUJZY1RBQW9BQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBRDRjVEFBWUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFGWWNUQUFjQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQUhJY1RBQXdBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBS0ljVEFBVUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFMWWNUQUFzQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQU9JY1RBQVlBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBUG9jVEFBd0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFTb2NUQUFvQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQVZJY1RBQWtBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBWFljVEFBa0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFab2NUQUFnQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQWJvY1RBQXdBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBZW9jVEFBTUFBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFmWWNUQUFZQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQWc0Y1RBQXdBQUFELy8vLy8vLy8vL3dBQUFBQUF3SUpBajRjVEFBc0FBQUQvLy8vLy8vLy8vd0FBQUFBQXdJSkFtb2NUQUFjQUFBRC8vLy8vLy8vLy93QUFBQUFBd0lKQW9ZY1RBQVFBQUFCRGIzVnlhV1Z5TFVKdmJHUkJaRzlpWlZOMFlXNWtZWEprUlc1amIyUnBibWREYjNWeWFXVnlMVUp2YkdSUFlteHBjWFZsUTI5MWNtbGxjaTFQWW14cGNYVmxRMjkxY21sbGNnQUFBQUFBQUNBQVFZM0x6Z0FMREdCeFFKdC9Fd0FGQUFBQUlRQkJwY3ZPQUFzTTBIUkFvSDhUQUFZQUFBQWlBRUc5eTg0QUN3eWdmVUNtZnhNQUNBQUFBQ01BUWRYTHpnQUxER0NCUUs1L0V3QUtBQUFBSkFCQjdjdk9BQXNNWUlGQXVIOFRBQVlBQUFBbEFFR0Z6TTRBQ3d6SWkwQytmeE1BQndBQUFDWUFRWjNNemdBTERKQ0dRTVYvRXdBSkFBQUFKd0JCdGN6T0FBc01ZSEZBem44VEFBb0FBQUFvQUVITnpNNEFDd3pRZEVEWWZ4TUFDUUFBQUNrQVFlWE16Z0FMRE5CMFFPRi9Fd0FLQUFBQUtnQkIvY3pPQUFzTVVIaEE2MzhUQUFnQUFBQXJBRUdWemM0QUN3eEFna0R6ZnhNQUJBQUFBQ3dBUWEzTnpnQUxER0J4UVBkL0V3QUZBQUFBTFFCQnhjM09BQXNNMEhSQS9IOFRBQVlBQUFBdUFFSGR6YzRBQ3d4Z2NVQUNnQk1BQmdBQUFDOEFRZlhOemdBTERHQnhRQWlBRXdBRkFBQUFNQUJCamM3T0FBc01ZSUZBRFlBVEFBUUFBQUF4QUVHbHpzNEFDd3hnZ1VBUmdCTUFBd0FBQURJQVFiM096Z0FMREdDQlFCU0FFd0FEQUFBQU13QkIxYzdPQUFzTVlJRkFGNEFUQUFVQUFBQTBBRUh0enM0QUN3eGdnVUFjZ0JNQUJBQUFBRFVBUVlYUHpnQUxER0NCUUNDQUV3QUVBQUFBTmdCQm5jL09BQXNNWUlGQUpJQVRBQU1BQUFBM0FFRzF6ODRBQ3d4Z2dVQW5nQk1BQlFBQUFEZ0FRYzNQemdBTERHQ0JRQ3lBRXdBRkFBQUFPUUJCNWMvT0FBc01ZSUZBTVlBVEFBUUFBQUE2QUVIOXo4NEFDd3pRZEVBMWdCTUFCUUFBQURzQVFaWFF6Z0FMRE5CMFFEcUFFd0FKQUFBQVBBQkJyZERPQUFzTVFJSkFRNEFUQUFRQUFBQTlBRUhGME00QUN3eEFna0JIZ0JNQUJRQUFBRDRBUWQzUXpnQUxERUNDUUV5QUV3QUhBQUFBUHdCQjlkRE9BQXNNR0lOQVU0QVRBQWdBQUFCQUFFR04wYzRBQ3d4NGprQmJnQk1BQWdBQUFFRUFRYVhSemdBTERKQ0dRRjJBRXdBQkFBQUFRZ0JCdmRIT0FBc01rSVpBWG9BVEFBRUFBQUJEQUVIVjBjNEFDd3lRaGtCZmdCTUFBUUFBQUVRQVFlM1J6Z0FMREpDR1FHQ0FFd0FCQUFBQVJRQkJoZExPQUFzTTJJUkFZWUFUQUFFQUFBQkdBRUdkMHM0QUN3d1lnMEJpZ0JNQUFRQUFBRWNBUWJYU3pnQUxERkNJUUdPQUV3QUJBQUFBU0FCQnpkTE9BQXNNa0laQVpJQVRBQUVBQUFCSkFFSGwwczRBQ3d4Z2NVQmxnQk1BQVFBQUFFb0FRZjNTemdBTERHQ0JRR2FBRXdBQkFBQUFTd0JCbGRQT0FBc01rSVpBWjRBVEFBRUFBQUJNQUVHdDA4NEFDd3dZZzBCb2dCTUFBUUFBQUUwQVFjWFR6Z0FMREFpS1FHbUFFd0FCQUFBQVRnQkIzZFBPQUFzTWtJWkFhb0FUQUFFQUFBQlBBRUgxMDg0QUN3eFFpRUJyZ0JNQUFRQUFBRkFBUVkzVXpnQUxETmlFUUd5QUV3QUJBQUFBVVFCQnBkVE9BQXNNVUloQWJZQVRBQUVBQUFCU0FFRzkxTTRBQ3d5UWhrQnVnQk1BQVFBQUFGTUFRZFhVemdBTEROaUVRRytBRXdBQkFBQUFWQUJCN2RUT0FBc01HSU5BY0lBVEFBRUFBQUJWQUVHRjFjNEFDd3lRaGtCeGdCTUFBUUFBQUZZQVFaM1Z6Z0FMRE5pRVFIS0FFd0FCQUFBQVZ3QkJ0ZFhPQUFzTWdJMUFjNEFUQUFFQUFBQllBRUhOMWM0QUN3elloRUIwZ0JNQUFRQUFBRmtBUWVYVnpnQUxETmlFUUhXQUV3QUJBQUFBV2dCQi9kWE9BQXNNR0lOQWRvQVRBQUVBQUFCYkFFR1YxczRBQ3d6UWRFQjNnQk1BQ3dBQUFGd0FRYTNXemdBTERHQnhRSUtBRXdBSkFBQUFYUUJCeGRiT0FBc00wSFJBaTRBVEFBd0FBQUJlQUVIZDFzNEFDd3hBZ2tDWGdCTUFDd0FBQUY4QVFmWFd6Z0FMREdDQlFLS0FFd0FLQUFBQVlBQkJqZGZPQUFzTVlIRkFySUFUQUFrQUFBQmhBRUdsMTg0QUN3eGdnVUMxZ0JNQUFRQUFBR0lBUWIzWHpnQUxEQmlEUUxhQUV3QUJBQUFBWXdCQjFkZk9BQXNNWUlGQXQ0QVRBQUVBQUFCa0FFSHQxODRBQ3d3WWcwQzRnQk1BQVFBQUFHVUFRWVhZemdBTERHQ0JRTG1BRXdBQkFBQUFaZ0JCbmRqT0FBc00wSFJBdW9BVEFBRUFBQUJuQUVHMTJNNEFDd3dZZzBDN2dCTUFBUUFBQUdnQVFjM1l6Z0FMREJpRFFMeUFFd0FCQUFBQWFRQkI1ZGpPQUFzTVlIRkF2WUFUQUFFQUFBQnFBRUg5Mk00QUN3eGdjVUMrZ0JNQUFRQUFBR3NBUVpYWnpnQUxER0NCUUwrQUV3QUJBQUFBYkFCQnJkbk9BQXNNWUhGQXdJQVRBQUVBQUFCdEFFSEYyYzRBQ3d6SWkwREJnQk1BQVFBQUFHNEFRZDNaemdBTERCaURRTUtBRXdBQkFBQUFid0JCOWRuT0FBc01HSU5BdzRBVEFBRUFBQUJ3QUVHTjJzNEFDd3dZZzBERWdCTUFBUUFBQUhFQVFhWGF6Z0FMREJpRFFNV0FFd0FCQUFBQWNnQkJ2ZHJPQUFzTVVIaEF4b0FUQUFFQUFBQnpBRUhWMnM0QUN3eGdnVURIZ0JNQUFRQUFBSFFBUWUzYXpnQUxETkIwUU1pQUV3QUJBQUFBZFFCQmhkdk9BQXNNR0lOQXlZQVRBQUVBQUFCMkFFR2QyODRBQ3d4Z2dVREtnQk1BQVFBQUFIY0FRYlhiemdBTERGQ0lRTXVBRXdBQkFBQUFlQUJCemR2T0FBc01ZSUZBeklBVEFBRUFBQUI1QUVIbDI4NEFDd3hnZ1VETmdCTUFBUUFBQUhvQVFmM2J6Z0FMREVCL1FNNkFFd0FCQUFBQWV3QkJsZHpPQUFzTVVIaEF6NEFUQUFrQUFBQjhBRUd0M000QUN3eUFjVURZZ0JNQUF3QUFBSDBBUWNYY3pnQUxERkI0UU51QUV3QUtBQUFBZmdCQjNkek9BQXNNUUlKQTVZQVRBQW9BQUFDaEFFSDEzTTRBQ3d6UWRFRHZnQk1BQ2dBQUFLSUFRWTNkemdBTERHQ0JRUG1BRXdBRUFBQUFvd0JCcGQzT0FBc01ZSUZBL1lBVEFBZ0FBQUNrQUVHOTNjNEFDd3pnWkVBRmdSTUFDQUFBQUtVQVFkWGR6Z0FMREdDQlFBMkJFd0FEQUFBQXBnQkI3ZDNPQUFzTVlJRkFFSUVUQUFZQUFBQ25BRUdGM3M0QUN3eGdnVUFXZ1JNQUJ3QUFBS2dBUVozZXpnQUxER0NCUUIyQkV3QUlBQUFBcVFCQnRkN09BQXNNd0cxQUpZRVRBQXNBQUFDcUFFSE4zczRBQ3d4QWYwQXdnUk1BREFBQUFLc0FRZVhlemdBTERHQ0JRRHlCRXdBTkFBQUFyQUJCL2Q3T0FBc00wSFJBU1lFVEFBMEFBQUN0QUVHVjM4NEFDd3pRZEVCV2dSTUFEZ0FBQUs0QVFhM2Z6Z0FMREJpRFFHU0JFd0FDQUFBQXJ3QkJ4ZC9PQUFzTUdJTkFab0VUQUFJQUFBQ3hBRUhkMzg0QUN3eGdnVUJvZ1JNQUJnQUFBTElBUWZYZnpnQUxER0NCUUc2QkV3QUdBQUFBc3dCQmplRE9BQXNNWUlGQWRJRVRBQWtBQUFDMEFFR2w0TTRBQ3d4Z2NVQjlnUk1BRGdBQUFMWUFRYjNnemdBTERHQ0JRSXVCRXdBSkFBQUF0d0JCMWVET0FBc000SFZBbElFVEFBWUFBQUM0QUVIdDRNNEFDd3hnY1VDYWdSTUFEZ0FBQUxrQVFZWGh6Z0FMREVCL1FLaUJFd0FNQUFBQXVnQkJuZUhPQUFzTVFIOUF0SUVUQUEwQUFBQzdBRUcxNGM0QUN3eGdnVURCZ1JNQURnQUFBTHdBUWMzaHpnQUxERUNQUU0rQkV3QUlBQUFBdlFCQjVlSE9BQXNNUUk5QTE0RVRBQXNBQUFDL0FFSDk0YzRBQ3d3WWcwRGlnUk1BREFBQUFNRUFRWlhpemdBTEROQjBRTzZCRXdBRkFBQUF3Z0JCcmVMT0FBc00wSFJBODRFVEFBVUFBQUREQUVIRjRzNEFDd3pRZEVENGdSTUFDZ0FBQU1RQVFkM2l6Z0FMRE5CMFFBS0NFd0FGQUFBQXhRQkI5ZUxPQUFzTTBIUkFCNElUQUFZQUFBREdBRUdONDg0QUN3elFkRUFOZ2hNQUJRQUFBTWNBUWFYanpnQUxETkIwUUJLQ0V3QUpBQUFBeUFCQnZlUE9BQXNNMEhSQUc0SVRBQWdBQUFES0FFSFY0ODRBQ3d6UWRFQWpnaE1BQkFBQUFNc0FRZTNqemdBTEROQjBRQ2VDRXdBSEFBQUF6UUJCaGVUT0FBc00wSFJBTG9JVEFBd0FBQURPQUVHZDVNNEFDd3pRZEVBNmdoTUFCZ0FBQU04QVFiWGt6Z0FMRE5CMFFFQ0NFd0FGQUFBQTBBQkJ6ZVRPQUFzTVFJOUFSWUlUQUFZQUFBRGhBRUhsNU00QUN3eEFqMEJMZ2hNQUFnQUFBT01BUWYza3pnQUxEQ0IzUUUyQ0V3QUxBQUFBNkFCQmxlWE9BQXNNR0lOQVdJSVRBQVlBQUFEcEFFR3Q1YzRBQ3d4UWlFQmVnaE1BQmdBQUFPb0FRY1hsemdBTERFQ1BRR1NDRXdBQ0FBQUE2d0JCM2VYT0FBc00wSFpBWm9JVEFBd0FBQUR4QUVIMTVjNEFDd3pJaTBCeWdoTUFBZ0FBQVBVQVFZM216Z0FMREdCeFFIU0NFd0FJQUFBQStBQkJwZWJPQUFzTVlIRkFmSUlUQUFZQUFBRDVBRUc5NXM0QUN3d1lnMENDZ2hNQUJnQUFBUG9BUWRYbXpnQUxESUNOUUlpQ0V3QUNBQUFBK3dCQjdlYk9BQXZFSHhpRFFJcUNFd0FLQUFBQS8vLy8vLy8vLy84QUFBQUFBR0J4UUpTQ0V3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRSjJDRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFLT0NFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUttQ0V3QU5BQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRTGFDRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFMeUNFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBRUNDUU1XQ0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRTXVDRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FOR0NFd0FMQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUU55Q0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRT0tDRXdBTEFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFPMkNFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUVBPQ0V3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRUCtDRXdBTEFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FBcURFd0FGQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUErREV3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRQmlERXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FCK0RFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUNXREV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRQ3lERXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FEV0RFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBRUJ2UUR1REV3QUxBQUFBLy8vLy8vLy8vLzhBQUFBQUFBaUhRRWFERXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFFK0RFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUZhREV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRRnlERXdBRkFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FHR0RFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBR0J4UUcyREV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRSE9ERXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUJpRFFIbURFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUlXREV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRSXVERXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFKR0RFd0FLQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUp1REV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRS0dERXdBSUFBQUEvLy8vLy8vLy8vOEFBQUFBQUdCeFFLbURFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBT0IrUUsrREV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRTGFERXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUZDSVFMeURFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUU1pREV3QUxBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRTk9ERXdBTEFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FONkRFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBRkI0UU9XREV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRT3VERXdBSUFBQUEvLy8vLy8vLy8vOEFBQUFBQUJpRFFQT0RFd0FLQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUVAyREV3QUZBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQ0lRQUtFRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FBbUVFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUUErRUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFEaUhRQldFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FCdUVFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUNLRUV3QUZBQUFBLy8vLy8vLy8vLzhBQUFBQUFOQjBRQ2VFRXdBTkFBQUEvLy8vLy8vLy8vOEFBQUFBQUZDSVFEU0VFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUURxRUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRRUNFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUVDQ1FFYUVFd0FJQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUU2RUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRRlNFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQU9CK1FGcUVFd0FMQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUdXRUV3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRRzZFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdCeFFIU0VFd0FMQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUUgrRUV3QUxBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRSXFFRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFKT0VFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUp5RUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRS0tFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUJpRFFLaUVFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUsrRUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQnhRTFdFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUVDQ1FMdUVFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBSUJ4UU1TRUV3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFBaUhRTTJFRXdBS0FBQUEvLy8vLy8vLy8vOEFBQUFBQUZDSVFOZUVFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0J4UU4yRUV3QUtBQUFBLy8vLy8vLy8vLzhBQUFBQUFNQ0NRT2VFRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFQQ0VFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBRkI0UVBhRUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRUHlFRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUJpRFFBT0ZFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUFtRkV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFDaUJRQStGRXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FCdUZFd0FEQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUI2RkV3QUlBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQnhRQ2FGRXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQUZCNFFES0ZFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUURpRkV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRRCtGRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FFYUZFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUV5RkV3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRRldGRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FGdUZFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0J4UUdHRkV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQ0lRR2lGRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUJpRFFHNkZFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUhTRkV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRSHVGRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdCeFFJR0ZFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBRkNJUUlxRkV3QUxBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRSldGRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUNDRFFKdUZFd0FGQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUtDRkV3QUZBQUFBLy8vLy8vLy8vLzhBQUFBQUFOQjBRS1dGRXdBTEFBQUEvLy8vLy8vLy8vOEFBQUFBQUZDSVFMQ0ZFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUxtRkV3QUNBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQnhRTHVGRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUJpRFFNR0ZFd0FOQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUU02RkV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRTldGRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUJDS1FOdUZFd0FOQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUU9pRkV3QUlBQUFBLy8vLy8vLy8vLzhBQUFBQUFBQjVRUENGRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FQYUZFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUFLR0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFFQ1BRQWlHRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFCR0dFd0FLQUFBQS8vLy8vLy8vLy84QUFBQUFBR0J4UUJ1R0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQnhRQ0dHRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUJpRFFDaUdFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBQkNLUUM2R0V3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFDaUJRRFdHRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQUJpRFFENkdFd0FMQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUVtR0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRRStHRXdBTkFBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFGeUdFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUdLR0V3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRR21HRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUJDS1FHK0dFd0FLQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUUhtR0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRSCtHRXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQUZDSVFJdUdFd0FOQUFBQS8vLy8vLy8vLy84QUFBQUFBQUI1UUppR0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRSjZHRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FLU0dFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUtxR0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFDaUJRTENHRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FMZUdFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBRkI0UUwyR0V3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRTW1HRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUJpRFFNK0dFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUU5XR0V3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRT0dHRXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FPMkdFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUVBPR0V3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRUHFHRXdBRkFBQUEvLy8vLy8vLy8vOEFBQUFBQUZDSVFQK0dFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBRUIvUUFXSEV3QUtBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRQStIRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdCeFFCV0hFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUJ5SEV3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFFQ0NRQ2lIRXdBRkFBQUEvLy8vLy8vLy8vOEFBQUFBQUdCeFFDMkhFd0FMQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUURpSEV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFOQjBRRDZIRXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQUVDQ1FFcUhFd0FLQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUZTSEV3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRRjJIRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQUNpQlFHYUhFd0FJQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUc2SEV3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRSHFIRXdBREFBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FIMkhFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUlPSEV3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFOQjBRSStIRXdBTEFBQUEvLy8vLy8vLy8vOEFBQUFBQUdCeFFKcUhFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUtHSEV3QUVBQUFBU0dWc2RtVjBhV05oTFVKdmJHUklaV3gyWlhScFkyRXRRbTlzWkU5aWJHbHhkV1VBQUFBQUFDQUFRYjJHendBTERHQnhRSnQvRXdBRkFBQUFJUUJCMVliUEFBc01ZSEZBb0g4VEFBWUFBQUFpQUVIdGhzOEFDd3d3ZGtDbWZ4TUFDQUFBQUNNQVFZV0h6d0FMREdDQlFLNS9Fd0FLQUFBQUpBQkJuWWZQQUFzTVlJRkF1SDhUQUFZQUFBQWxBRUcxaDg4QUN3eklpMEMrZnhNQUJ3QUFBQ1lBUWMySHp3QUxETmlFUU1WL0V3QUpBQUFBSndCQjVZZlBBQXNNd0d0QXpuOFRBQW9BQUFBb0FFSDloODhBQ3d6UWRFRFlmeE1BQ1FBQUFDa0FRWldJendBTEROQjBRT0YvRXdBS0FBQUFLZ0JCcllqUEFBc01VSGhBNjM4VEFBZ0FBQUFyQUVIRmlNOEFDd3hBZ2tEemZ4TUFCQUFBQUN3QVFkMkl6d0FMREdCeFFQZC9Fd0FGQUFBQUxRQkI5WWpQQUFzTTBIUkEvSDhUQUFZQUFBQXVBRUdOaWM4QUN3eGdjVUFDZ0JNQUJnQUFBQzhBUWFXSnp3QUxER0J4UUFpQUV3QUZBQUFBTUFCQnZZblBBQXNNWUlGQURZQVRBQVFBQUFBeEFFSFZpYzhBQ3d4Z2dVQVJnQk1BQXdBQUFESUFRZTJKendBTERHQ0JRQlNBRXdBREFBQUFNd0JCaFlyUEFBc01ZSUZBRjRBVEFBVUFBQUEwQUVHZGlzOEFDd3hnZ1VBY2dCTUFCQUFBQURVQVFiV0t6d0FMREdDQlFDQ0FFd0FFQUFBQU5nQkJ6WXJQQUFzTVlJRkFKSUFUQUFNQUFBQTNBRUhsaXM4QUN3eGdnVUFuZ0JNQUJRQUFBRGdBUWYyS3p3QUxER0NCUUN5QUV3QUZBQUFBT1FCQmxZdlBBQXNNWUlGQU1ZQVRBQVFBQUFBNkFFR3RpODhBQ3d4Z2NVQTFnQk1BQlFBQUFEc0FRY1dMendBTERHQnhRRHFBRXdBSkFBQUFQQUJCM1l2UEFBc01RSUpBUTRBVEFBUUFBQUE5QUVIMWk4OEFDd3hBZ2tCSGdCTUFCUUFBQUQ0QVFZMk16d0FMREVDQ1FFeUFFd0FIQUFBQVB3QkJwWXpQQUFzTVlJRkFVNEFUQUFnQUFBQkFBRUc5ak04QUN3eTRqMEJiZ0JNQUFnQUFBRUVBUWRXTXp3QUxETmlFUUYyQUV3QUJBQUFBUWdCQjdZelBBQXNNMklSQVhvQVRBQUVBQUFCREFFR0ZqYzhBQ3d5UWhrQmZnQk1BQVFBQUFFUUFRWjJOendBTERKQ0dRR0NBRXdBQkFBQUFSUUJCdFkzUEFBc00ySVJBWVlBVEFBRUFBQUJHQUVITmpjOEFDd3dZZzBCaWdCTUFBUUFBQUVjQVFlV056d0FMREZDSVFHT0FFd0FCQUFBQVNBQkIvWTNQQUFzTWtJWkFaSUFUQUFFQUFBQkpBRUdWanM4QUN3eGdjVUJsZ0JNQUFRQUFBRW9BUWEyT3p3QUxERUIvUUdhQUV3QUJBQUFBU3dCQnhZN1BBQXNNMklSQVo0QVRBQUVBQUFCTUFFSGRqczhBQ3d4Z2dVQm9nQk1BQVFBQUFFMEFRZldPendBTERBaUtRR21BRXdBQkFBQUFUZ0JCalkvUEFBc01rSVpBYW9BVEFBRUFBQUJQQUVHbGo4OEFDd3hRaUVCcmdCTUFBUUFBQUZBQVFiMlB6d0FMRE5pRVFHeUFFd0FCQUFBQVVRQkIxWS9QQUFzTVVJaEFiWUFUQUFFQUFBQlNBRUh0ajg4QUN3eVFoa0J1Z0JNQUFRQUFBRk1BUVlXUXp3QUxETmlFUUcrQUV3QUJBQUFBVkFCQm5aRFBBQXNNR0lOQWNJQVRBQUVBQUFCVkFFRzFrTThBQ3d5UWhrQnhnQk1BQVFBQUFGWUFRYzJRendBTEROaUVRSEtBRXdBQkFBQUFWd0JCNVpEUEFBc01nSTFBYzRBVEFBRUFBQUJZQUVIOWtNOEFDd3pZaEVCMGdCTUFBUUFBQUZrQVFaV1J6d0FMRE5pRVFIV0FFd0FCQUFBQVdnQkJyWkhQQUFzTUdJTkFkb0FUQUFFQUFBQmJBRUhGa2M4QUN3eGdjVUIzZ0JNQUN3QUFBRndBUWQyUnp3QUxER0J4UUlLQUV3QUpBQUFBWFFCQjlaSFBBQXNNWUhGQWk0QVRBQXdBQUFCZUFFR05rczhBQ3d4UWZVQ1hnQk1BQ3dBQUFGOEFRYVdTendBTERHQ0JRS0tBRXdBS0FBQUFZQUJCdlpMUEFBc013R3RBcklBVEFBa0FBQUJoQUVIVmtzOEFDd3hnZ1VDMWdCTUFBUUFBQUdJQVFlMlN6d0FMREdDQlFMYUFFd0FCQUFBQVl3QkJoWlBQQUFzTVFIOUF0NEFUQUFFQUFBQmtBRUdkazg4QUN3eGdnVUM0Z0JNQUFRQUFBR1VBUWJXVHp3QUxER0NCUUxtQUV3QUJBQUFBWmdCQnpaUFBBQXNNWUhGQXVvQVRBQUVBQUFCbkFFSGxrODhBQ3d4Z2dVQzdnQk1BQVFBQUFHZ0FRZjJUendBTERHQ0JRTHlBRXdBQkFBQUFhUUJCbFpUUEFBc013R3RBdllBVEFBRUFBQUJxQUVHdGxNOEFDd3pBYTBDK2dCTUFBUUFBQUdzQVFjV1V6d0FMREVCL1FMK0FFd0FCQUFBQWJBQkIzWlRQQUFzTXdHdEF3SUFUQUFFQUFBQnRBRUgxbE04QUN3d0lpa0RCZ0JNQUFRQUFBRzRBUVkyVnp3QUxER0NCUU1LQUV3QUJBQUFBYndCQnBaWFBBQXNNWUlGQXc0QVRBQUVBQUFCd0FFRzlsYzhBQ3d4Z2dVREVnQk1BQVFBQUFIRUFRZFdWendBTERHQ0JRTVdBRXdBQkFBQUFjZ0JCN1pYUEFBc00wSFJBeG9BVEFBRUFBQUJ6QUVHRmxzOEFDd3hBZjBESGdCTUFBUUFBQUhRQVFaMld6d0FMREdCeFFNaUFFd0FCQUFBQWRRQkJ0WmJQQUFzTVlJRkF5WUFUQUFFQUFBQjJBRUhObHM4QUN3eEFmMERLZ0JNQUFRQUFBSGNBUWVXV3p3QUxESkNHUU11QUV3QUJBQUFBZUFCQi9aYlBBQXNNUUg5QXpJQVRBQUVBQUFCNUFFR1ZsODhBQ3d4QWYwRE5nQk1BQVFBQUFIb0FRYTJYendBTERFQi9RTTZBRXdBQkFBQUFld0JCeFpmUEFBc000SFJBejRBVEFBa0FBQUI4QUVIZGw4OEFDd3hBY0VEWWdCTUFBd0FBQUgwQVFmV1h6d0FMRE9CMFFOdUFFd0FLQUFBQWZnQkJqWmpQQUFzTVFJSkE1WUFUQUFvQUFBQ2hBRUdsbU04QUN3elFkRUR2Z0JNQUNnQUFBS0lBUWIyWXp3QUxER0NCUVBtQUV3QUVBQUFBb3dCQjFaalBBQXNNWUlGQS9ZQVRBQWdBQUFDa0FFSHRtTThBQ3d6Z1pFQUZnUk1BQ0FBQUFLVUFRWVdaendBTERHQ0JRQTJCRXdBREFBQUFwZ0JCblpuUEFBc01ZSUZBRUlFVEFBWUFBQUNuQUVHMW1jOEFDd3hnZ1VBV2dSTUFCd0FBQUtnQVFjMlp6d0FMREdDQlFCMkJFd0FJQUFBQXFRQkI1Wm5QQUFzTTRHZEFKWUVUQUFzQUFBQ3FBRUg5bWM4QUN3elFkRUF3Z1JNQURBQUFBS3NBUVpXYXp3QUxER0NCUUR5QkV3QU5BQUFBckFCQnJaclBBQXNNMEhSQVNZRVRBQTBBQUFDdEFFSEZtczhBQ3d6UWRFQldnUk1BRGdBQUFLNEFRZDJhendBTERFQi9RR1NCRXdBQ0FBQUFyd0JCOVpyUEFBc01RSDlBWm9FVEFBSUFBQUN4QUVHTm04OEFDd3hnZ1VCb2dSTUFCZ0FBQUxJQVFhV2J6d0FMREdDQlFHNkJFd0FHQUFBQXN3QkJ2WnZQQUFzTVlJRkFkSUVUQUFrQUFBQzBBRUhWbTg4QUN3eGdjVUI5Z1JNQURnQUFBTFlBUWUyYnp3QUxETWlBUUl1QkV3QUpBQUFBdHdCQmhaelBBQXNNNEhWQWxJRVRBQVlBQUFDNEFFR2RuTThBQ3d6QWEwQ2FnUk1BRGdBQUFMa0FRYldjendBTEROQjBRS2lCRXdBTUFBQUF1Z0JCelp6UEFBc00wSFJBdElFVEFBMEFBQUM3QUVIbG5NOEFDd3hnZ1VEQmdSTUFEZ0FBQUx3QVFmMmN6d0FMREVDUFFNK0JFd0FJQUFBQXZRQkJsWjNQQUFzTVFJOUExNEVUQUFzQUFBQy9BRUd0bmM4QUN3d1lnMERpZ1JNQURBQUFBTUVBUWNXZHp3QUxETkIwUU82QkV3QUZBQUFBd2dCQjNaM1BBQXNNMEhSQTg0RVRBQVVBQUFEREFFSDFuYzhBQ3d6UWRFRDRnUk1BQ2dBQUFNUUFRWTJlendBTEROQjBRQUtDRXdBRkFBQUF4UUJCcFo3UEFBc00wSFJBQjRJVEFBWUFBQURHQUVHOW5zOEFDd3pRZEVBTmdoTUFCUUFBQU1jQVFkV2V6d0FMRE5CMFFCS0NFd0FKQUFBQXlBQkI3WjdQQUFzTTBIUkFHNElUQUFnQUFBREtBRUdGbjg4QUN3elFkRUFqZ2hNQUJBQUFBTXNBUVoyZnp3QUxETkIwUUNlQ0V3QUhBQUFBelFCQnRaL1BBQXNNMEhSQUxvSVRBQXdBQUFET0FFSE5uODhBQ3d6UWRFQTZnaE1BQmdBQUFNOEFRZVdmendBTEROQjBRRUNDRXdBRkFBQUEwQUJCL1ovUEFBc01RSTlBUllJVEFBWUFBQURoQUVHVm9NOEFDd3hBajBCTGdoTUFBZ0FBQU9NQVFhMmd6d0FMRENCM1FFMkNFd0FMQUFBQTZBQkJ4YURQQUFzTVlJRkFXSUlUQUFZQUFBRHBBRUhkb004QUN3eFFpRUJlZ2hNQUJnQUFBT29BUWZXZ3p3QUxERUNQUUdTQ0V3QUNBQUFBNndCQmphSFBBQXNNMEhaQVpvSVRBQXdBQUFEeEFFR2xvYzhBQ3d6SWkwQnlnaE1BQWdBQUFQVUFRYjJoendBTERHQnhRSFNDRXdBSUFBQUErQUJCMWFIUEFBc013R3RBZklJVEFBWUFBQUQ1QUVIdG9jOEFDd3dZZzBDQ2doTUFCZ0FBQVBvQVFZV2l6d0FMRElDTlFJaUNFd0FDQUFBQSt3QkJuYUxQQUF1RUtCaURRSXFDRXdBS0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdCeFFKU0NFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUoyQ0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRS09DRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFLbUNFd0FOQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUxhQ0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRTHlDRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQUVDQ1FNV0NFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUU11Q0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRTkdDRXdBTEFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFOeUNFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUU9LQ0V3QUxBQUFBLy8vLy8vLy8vLzhBQUFBQUFFQi9RTzJDRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FQT0NFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUVArQ0V3QUxBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRQXFERXdBRkFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FBK0RFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUJpREV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRQitERXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFDV0RFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUUN5REV3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRRFdERXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUVCdlFEdURFd0FMQUFBQS8vLy8vLy8vLy84QUFBQUFBQWlIUUVhREV3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRRStERXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FGYURFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUZ5REV3QUZBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRR0dERXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQU1CclFHMkRFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUhPREV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRSG1ERXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FJV0RFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUl1REV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRSkdERXdBS0FBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FKdURFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBRUIvUUtHREV3QUlBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQnhRS21ERXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUhCOVFLK0RFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUxhREV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQ0lRTHlERXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFNaURFd0FMQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUU5PREV3QUxBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRTjZERXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQU5CMFFPV0RFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBRUIvUU91REV3QUlBQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRUE9ERXdBS0FBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFQMkRFd0FGQUFBQS8vLy8vLy8vLy84QUFBQUFBRkNJUUFLRUV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRQW1FRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFBK0VFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlFUUJXRUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRQnVFRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFDS0VFd0FGQUFBQS8vLy8vLy8vLy84QUFBQUFBTkIwUUNlRUV3QU5BQUFBLy8vLy8vLy8vLzhBQUFBQUFGQ0lRRFNFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFEcUVFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUUVDRUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFFQ0NRRWFFRXdBSUFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFFNkVFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUZTRUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFNQjlRRnFFRXdBTEFBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FHV0VFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUc2RUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQnhRSFNFRXdBTEFBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFIK0VFd0FMQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUlxRUV3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRSk9FRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FKeUVFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUtLRUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRS2lFRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FLK0VFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0J4UUxXRUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFFQ0NRTHVFRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQUVCd1FNU0VFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBQWlIUU0yRUV3QUtBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQ0lRTmVFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdCeFFOMkVFd0FLQUFBQS8vLy8vLy8vLy84QUFBQUFBTUNDUU9lRUV3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRUENFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQU5CMFFQYUVFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUVB5RUV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRQU9GRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUJpRFFBbUZFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBQ2lCUUErRkV3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRQnVGRXdBREFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FCNkZFd0FJQUFBQS8vLy8vLy8vLy84QUFBQUFBTUJyUUNhRkV3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFOQnpRREtGRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFEaUZFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUQrRkV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRRWFGRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFFeUZFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUZXRkV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFFQi9RRnVGRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQU1CclFHR0ZFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBRkNJUUdpRkV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRRzZGRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFIU0ZFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBRUIvUUh1RkV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQnhRSUdGRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQUZDSVFJcUZFd0FMQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUpXRkV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFDQ0RRSnVGRXdBRkFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFLQ0ZFd0FGQUFBQS8vLy8vLy8vLy84QUFBQUFBTkIwUUtXRkV3QUxBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQ0lRTENGRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFMbUZFd0FDQUFBQS8vLy8vLy8vLy84QUFBQUFBR0J4UUx1RkV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRTUdGRXdBTkFBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFNNkZFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUU5XRkV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFCQ0tRTnVGRXdBTkFBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFPaUZFd0FJQUFBQS8vLy8vLy8vLy84QUFBQUFBTEJ5UVBDRkV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRUGFGRXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFBS0dFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBRUNQUUFpR0V3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRQkdHRXdBS0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdCeFFCdUdFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0J4UUNHR0V3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRQ2lHRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUJDS1FDNkdFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBQ2lCUURXR0V3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRRDZHRXdBTEFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFFbUdFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUUrR0V3QU5BQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRRnlHRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFHS0dFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUdtR0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFCQ0tRRytHRXdBS0FBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFIbUdFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUUgrR0V3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFGQ0lRSXVHRXdBTkFBQUEvLy8vLy8vLy8vOEFBQUFBQUFCNVFKaUdFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUo2R0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRS1NHRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFLcUdFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBRkI4UUxDR0V3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRTGVHRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQU5CMFFMMkdFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUU1tR0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRTStHRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FOV0dFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUU9HR0V3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRTzJHRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFQT0dFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUVBxR0V3QUZBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQ0lRUCtHRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FBV0hFd0FLQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUUErSEV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQnhRQldIRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FCeUhFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBRUNDUUNpSEV3QUZBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQnhRQzJIRXdBTEFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFEaUhFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0J4UUQ2SEV3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFFQ0NRRXFIRXdBS0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFGU0hFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUYySEV3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFDaUJRR2FIRXdBSUFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFHNkhFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUhxSEV3QURBQUFBLy8vLy8vLy8vLzhBQUFBQUFFQi9RSDJIRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFJT0hFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBTkIwUUkrSEV3QUxBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQnhRSnFIRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFLR0hFd0FFQUFBQVNHVnNkbVYwYVdOaExVOWliR2x4ZFdWSVpXeDJaWFJwWTJGMWJtbDJaWEp6WVd4bGVHbHpkR1Z1ZEdsaGJITjFZMmgwYUdGMFlYTjBaWEpwYzJ0dFlYUm9ZMjl1WjNKMVpXNTBRV3h3YUdGQ1pYUmhRMmhwUlhCemFXeHZibEJvYVVkaGJXMWhSWFJoU1c5MFlYUm9aWFJoTVV0aGNIQmhUR0Z0WW1SaFRYVk9kVTl0YVdOeWIyNVFhVlJvWlhSaFVtaHZVMmxuYldGVVlYVlZjSE5wYkc5dWMybG5iV0V4VDIxbFoyRllhVkJ6YVZwbGRHRjBhR1Z5WldadmNtVndaWEp3Wlc1a2FXTjFiR0Z5Y21Ga2FXTmhiR1Y0WVd4d2FHRmlaWFJoWTJocFpHVnNkR0ZsY0hOcGJHOXVjR2hwWjJGdGJXRmxkR0ZwYjNSaGNHaHBNV3RoY0hCaGJHRnRZbVJoYm5WdmJXbGpjbTl1Y0dsMGFHVjBZWEpvYjNOcFoyMWhkR0YxZFhCemFXeHZibTl0WldkaE1XOXRaV2RoZUdsd2MybDZaWFJoYzJsdGFXeGhjbFZ3YzJsc2IyNHhiV2x1ZFhSbGFXNW1hVzVwZEhsamJIVmlaR2xoYlc5dVpHaGxZWEowYzNCaFpHVmhjbkp2ZDJKdmRHaGhjbkp2ZDJ4bFpuUmhjbkp2ZDNWd1lYSnliM2R5YVdkb2RHRnljbTkzWkc5M2JuTmxZMjl1WkhCeWIzQnZjblJwYjI1aGJHVnhkV2wyWVd4bGJtTmxZWEJ3Y205NFpYRjFZV3hoY25KdmQzWmxjblJsZUdGeWNtOTNhRzl5YVhwbGVHTmhjbkpwWVdkbGNtVjBkWEp1WVd4bGNHaEpabkpoYTNSMWNsSm1jbUZyZEhWeWQyVnBaWEp6ZEhKaGMzTmphWEpqYkdWdGRXeDBhWEJzZVdOcGNtTnNaWEJzZFhObGJYQjBlWE5sZEdsdWRHVnljMlZqZEdsdmJuVnVhVzl1Y0hKdmNHVnljM1Z3WlhKelpYUnlaV1pzWlhoemRYQmxjbk5sZEc1dmRITjFZbk5sZEhCeWIzQmxjbk4xWW5ObGRISmxabXhsZUhOMVluTmxkR1ZzWlcxbGJuUnViM1JsYkdWdFpXNTBZVzVuYkdWbmNtRmthV1Z1ZEhKbFoybHpkR1Z5YzJWeWFXWmpiM0I1Y21sbmFIUnpaWEpwWm5SeVlXUmxiV0Z5YTNObGNtbG1jSEp2WkhWamRHUnZkRzFoZEdoc2IyZHBZMkZzWVc1a2JHOW5hV05oYkc5eVlYSnliM2RrWW14aWIzUm9ZWEp5YjNka1lteHNaV1owWVhKeWIzZGtZbXgxY0dGeWNtOTNaR0pzY21sbmFIUmhjbkp2ZDJSaWJHUnZkMjVoYm1kc1pXeGxablJ5WldkcGMzUmxjbk5oYm5OamIzQjVjbWxuYUhSellXNXpkSEpoWkdWdFlYSnJjMkZ1YzNCaGNtVnViR1ZtZEhSd2NHRnlaVzVzWldaMFpYaHdZWEpsYm14bFpuUmlkR0p5WVdOclpYUnNaV1owZEhCaWNtRmphMlYwYkdWbWRHVjRZbkpoWTJ0bGRHeGxablJpZEdKeVlXTmxiR1ZtZEhSd1luSmhZMlZzWldaMGJXbGtZbkpoWTJWc1pXWjBZblJpY21GalpXVjRZVzVuYkdWeWFXZG9kR2x1ZEdWbmNtRnNhVzUwWldkeVlXeDBjR2x1ZEdWbmNtRnNaWGhwYm5SbFozSmhiR0owY0dGeVpXNXlhV2RvZEhSd2NHRnlaVzV5YVdkb2RHVjRjR0Z5Wlc1eWFXZG9kR0owWW5KaFkydGxkSEpwWjJoMGRIQmljbUZqYTJWMGNtbG5hSFJsZUdKeVlXTnJaWFJ5YVdkb2RHSjBZbkpoWTJWeWFXZG9kSFJ3WW5KaFkyVnlhV2RvZEcxcFpHSnlZV05sY21sbmFIUmlkR0Z3Y0d4bEFBQUFJQUJCcmNyUEFBc01RRzlBbTM4VEFBVUFBQUFoQUVIRnlzOEFDd3pRZEVDZ2Z4TUFCZ0FBQUNJQVFkM0t6d0FMREVpR1FOTGdFd0FKQUFBQUl3QkI5Y3JQQUFzTVFIOUFybjhUQUFvQUFBQWtBRUdOeTg4QUN3d29nVURiNEJNQUN3QUFBQ1VBUWFYTHp3QUxEQWlLUUw1L0V3QUhBQUFBSmdCQnZjdlBBQXNNVUloQXhYOFRBQWtBQUFBbkFFSFZ5ODhBQ3d4d2UwRG00Qk1BQ0FBQUFDZ0FRZTNMendBTEROQjBRTmgvRXdBSkFBQUFLUUJCaGN6UEFBc00wSFJBNFg4VEFBb0FBQUFxQUVHZHpNOEFDd3hBZjBEdTRCTUFEQUFBQUNzQVFiWE16d0FMRENpQlFQTi9Fd0FFQUFBQUxBQkJ6Y3pQQUFzTVFHOUE5MzhUQUFVQUFBQXRBRUhsek04QUN3d29nVUFvaHhNQUJRQUFBQzRBUWYzTXp3QUxERUJ2UUFLQUV3QUdBQUFBTHdCQmxjM1BBQXNNWUhGQUNJQVRBQVVBQUFBd0FFR3R6YzhBQ3d4QWYwQU5nQk1BQkFBQUFERUFRY1hOendBTERFQi9RQkdBRXdBREFBQUFNZ0JCM2MzUEFBc01RSDlBRklBVEFBTUFBQUF6QUVIMXpjOEFDd3hBZjBBWGdCTUFCUUFBQURRQVFZM096d0FMREVCL1FCeUFFd0FFQUFBQU5RQkJwYzdQQUFzTVFIOUFJSUFUQUFRQUFBQTJBRUc5enM4QUN3eEFmMEFrZ0JNQUF3QUFBRGNBUWRYT3p3QUxERUIvUUNlQUV3QUZBQUFBT0FCQjdjN1BBQXNNUUg5QUxJQVRBQVVBQUFBNUFFR0Z6ODhBQ3d4QWYwQXhnQk1BQkFBQUFEb0FRWjNQendBTERHQnhRRFdBRXdBRkFBQUFPd0JCdGMvUEFBc01ZSEZBT29BVEFBa0FBQUE4QUVITno4OEFDd3dvZ1VCRGdCTUFCQUFBQUQwQVFlWFB6d0FMRENpQlFFZUFFd0FGQUFBQVBnQkIvYy9QQUFzTUtJRkFUSUFUQUFjQUFBQS9BRUdWME04QUN3ekFlMEJUZ0JNQUNBQUFBRUFBUWEzUXp3QUxEQ2lCUVByZ0V3QUpBQUFBUVFCQnhkRFBBQXNNa0laQUErRVRBQVVBQUFCQ0FFSGQwTThBQ3d6WWhFQUk0Uk1BQkFBQUFFTUFRZlhRendBTERKQ0dRQXpoRXdBREFBQUFSQUJCamRIUEFBc01JSU5BbTRVVEFBVUFBQUJGQUVHbDBjOEFDd3dZZzBBUDRSTUFCd0FBQUVZQVFiM1J6d0FMRE5pSFFCYmhFd0FEQUFBQVJ3QkIxZEhQQUFzTTJJSkFHZUVUQUFVQUFBQklBRUh0MGM4QUN3eVFoa0FlNFJNQUF3QUFBRWtBUVlYU3p3QUxETkIwUUNIaEV3QUVBQUFBU2dCQm5kTFBBQXNNdUlOQUplRVRBQVlBQUFCTEFFRzEwczhBQ3d5UWhrQXI0Uk1BQlFBQUFFd0FRYzNTendBTERIQ0ZRRERoRXdBR0FBQUFUUUJCNWRMUEFBc015SXRBTnVFVEFBSUFBQUJPQUVIOTBzOEFDd3lRaGtBNDRSTUFBZ0FBQUU4QVFaWFR6d0FMREpDR1FEcmhFd0FIQUFBQVVBQkJydFBQQUFzTGlFQkI0Uk1BQWdBQUFGRUFRY1hUendBTERDaUhRRVBoRXdBRkFBQUFVZ0JCM2RQUEFBc01ZSUZBU09FVEFBTUFBQUJUQUVIMTA4OEFDd3lBZ2tCTDRSTUFCUUFBQUZRQVFZM1V6d0FMREJpRFFGRGhFd0FEQUFBQVZRQkJwZFRQQUFzTWtJVkFVK0VUQUFjQUFBQldBRUc5MU04QUN3eHdlMEJhNFJNQUJnQUFBRmNBUWRiVXp3QUxDNGhBWU9FVEFBVUFBQUJZQUVIdDFNOEFDd3dvaEVCbDRSTUFBZ0FBQUZrQVFZWFZ6d0FMRE5pSVFHZmhFd0FEQUFBQVdnQkJuZFhQQUFzTUdJTkFhdUVUQUFRQUFBQmJBRUcxMWM4QUN3elFkRUIzZ0JNQUN3QUFBRndBUWMzVnp3QUxEUGlLUUc3aEV3QUpBQUFBWFFCQjVkWFBBQXNNMEhSQWk0QVRBQXdBQUFCZUFFSDkxYzhBQ3d5UWhFQjM0Uk1BRFFBQUFGOEFRWlhXendBTERFQi9RS0tBRXdBS0FBQUFZQUJCcmRiUEFBc01RSDlBaE9FVEFBa0FBQUJoQUVIRjFzOEFDd3k0ZzBDTjRSTUFCUUFBQUdJQVFkM1d6d0FMRENpQlFKTGhFd0FFQUFBQVl3QkI5ZGJQQUFzTUtJRkFsdUVUQUFNQUFBQmtBRUdOMTg4QUN3emdma0NaNFJNQUJRQUFBR1VBUWFYWHp3QUxESEI3UUo3aEV3QUhBQUFBWmdCQnZkZlBBQXNNU0lCQXBlRVRBQU1BQUFCbkFFSFYxODhBQ3d5d2VVQ280Uk1BQlFBQUFHZ0FRZTNYendBTEROaUNRSzNoRXdBREFBQUFhUUJCaGRqUEFBc01rSFJBc09FVEFBUUFBQUJxQUVHZDJNOEFDd3pZZ2tDMDRSTUFCQUFBQUdzQVFiWFl6d0FMRENpQlFMamhFd0FGQUFBQWJBQkJ6ZGpQQUFzTUtJRkF2ZUVUQUFZQUFBQnRBRUhtMk04QUN3dUNRTG1GRXdBQ0FBQUFiZ0JCL2RqUEFBc01TSUJBdytFVEFBSUFBQUJ2QUVHVjJjOEFDd3dvZ1VERjRSTUFCd0FBQUhBQVFhM1p6d0FMRENpQlFNemhFd0FDQUFBQWNRQkJ4ZG5QQUFzTVNJQkF6dUVUQUFVQUFBQnlBRUhkMmM4QUN3d29nVURUNFJNQUF3QUFBSE1BUWZYWnp3QUxETmlDUU5iaEV3QUZBQUFBZEFCQmpkclBBQXNNY0h0QTIrRVRBQU1BQUFCMUFFR20yczhBQ3d1Q1FON2hFd0FIQUFBQWRnQkJ2ZHJQQUFzTVNJWkE1ZUVUQUFZQUFBQjNBRUhWMnM4QUN3eHdoVURyNFJNQUJRQUFBSGdBUWUzYXp3QUxETkIrUVBEaEV3QUNBQUFBZVFCQmhkdlBBQXNNY0lWQTh1RVRBQU1BQUFCNkFFR2QyODhBQ3d6Z2ZrRDE0Uk1BQkFBQUFIc0FRYmJiendBTEMzNUF6NEFUQUFrQUFBQjhBRUhPMjg4QUN3dHBRTmlBRXdBREFBQUFmUUJCNXR2UEFBc0xma0RiZ0JNQUNnQUFBSDRBUWYzYnp3QUxEQ2lCUVBuaEV3QUhBQUFBb0FCQmxkelBBQXNNY0lkQW9ZY1RBQVFBQUFDaEFFR3QzTThBQ3d4Z2cwQUE0aE1BQ0FBQUFLSUFRY1hjendBTERPQnVRQWppRXdBR0FBQUFvd0JCM2R6UEFBc01LSUZBTllZVEFBa0FBQUNrQUVIMTNNOEFDd3pnWkVBRmdSTUFDQUFBQUtVQVFZM2R6d0FMREVpR1FBN2lFd0FJQUFBQXBnQkJwZDNQQUFzTVFIOUFFSUVUQUFZQUFBQ25BRUc5M2M4QUN3eUloMEFXNGhNQUJBQUFBS2dBUWRYZHp3QUxESWlIUUJyaUV3QUhBQUFBcVFCQjdkM1BBQXNNaUlkQUllSVRBQVVBQUFDcUFFR0YzczhBQ3d5SWgwQW00aE1BQlFBQUFLc0FRWjNlendBTERFaVFRQ3ZpRXdBSkFBQUFyQUJCdGQ3UEFBc00ySTVBTk9JVEFBa0FBQUN0QUVITjNzOEFDd3pZZ2tBOTRoTUFCd0FBQUs0QVFlWGV6d0FMRE5pT1FFVGlFd0FLQUFBQXJ3QkIvZDdQQUFzTTJJSkFUdUlUQUFrQUFBQ3dBRUdXMzg4QUN3dDVRSmlHRXdBR0FBQUFzUUJCcmQvUEFBc01LSUZBdTRRVEFBa0FBQUN5QUVIRjM4OEFDd3l3ZVVCWDRoTUFCZ0FBQUxNQVFkM2Z6d0FMRENpQlFBK0ZFd0FNQUFBQXRBQkI5ZC9QQUFzTUtJRkFSb1FUQUFnQUFBQzFBRUdONE04QUN3eEloa0JkNGhNQURBQUFBTFlBUWFYZ3p3QUxET0IrUUZxRUV3QUxBQUFBdHdCQnZlRFBBQXNNd0h4QWxJRVRBQVlBQUFDNEFFSFY0TThBQ3d3b2dVREZnaE1BQmdBQUFMa0FRZTNnendBTERDaUJRR2FIRXdBSUFBQUF1Z0JCaGVIUEFBc01LSUZBYWVJVEFBc0FBQUM3QUVHZDRjOEFDd3dvZ1VCMDRoTUFDd0FBQUx3QVFiWGh6d0FMREVDUFFNK0JFd0FJQUFBQXZRQkJ6ZUhQQUFzTTJJSkFmK0lUQUFzQUFBQytBRUhsNGM4QUN3eEFqMENLNGhNQURBQUFBTDhBUWYzaHp3QUxESkNFUUpiaUV3QU9BQUFBd0FCQmxlTFBBQXNNdUlsQXBPSVRBQVVBQUFEQkFFR3Q0czhBQ3d4d2hVQ3A0aE1BQ0FBQUFNSUFRY1hpendBTEROaUlRTEhpRXdBSUFBQUF3d0JCM2VMUEFBc00ySTVBdWVJVEFBc0FBQURFQUVIMjRzOEFDd3VJUU1UaUV3QU9BQUFBeFFCQmp1UFBBQXNMaUVEUzRoTUFDZ0FBQU1ZQVFhWGp6d0FMRExpSlFOemlFd0FJQUFBQXh3QkJ2dVBQQUFzTGlFRGs0aE1BREFBQUFNZ0FRZGJqendBTEM0aEE4T0lUQUFVQUFBREpBRUh0NDg4QUN3eEloa0QxNGhNQURnQUFBTW9BUVlYa3p3QUxERWlHUUFQakV3QU9BQUFBeXdCQm5lVFBBQXNNU0laQUVlTVRBQWtBQUFETUFFRzE1TThBQ3d4SWhrQWE0eE1BREFBQUFNMEFRYzNrendBTERFaUdRQ2JqRXdBTUFBQUF6Z0JCNWVUUEFBc01TSVpBTXVNVEFBY0FBQURQQUVIOTVNOEFDd3hJaGtBNTR4TUFDZ0FBQU5BQVFaYmx6d0FMQzRoQVErTVRBQVVBQUFEUkFFR3Q1YzhBQ3d4SWhrQkk0eE1BQ0FBQUFOSUFRY1hsendBTERMQ0lRRkRqRXdBTkFBQUEwd0JCM2VYUEFBc01zSWhBWGVNVEFBNEFBQURVQUVIMTVjOEFDd3pRaTBCcjR4TUFEZ0FBQU5VQVFZM216d0FMRExpSlFIbmpFd0FIQUFBQTFnQkJwZWJQQUFzTUtJRkFzSVlUQUFjQUFBRFhBRUc5NXM4QUN3eEFiMENBNHhNQUJ3QUFBTmdBUWRYbXp3QUxERWlHUUVxSEV3QUtBQUFBMlFCQjdlYlBBQXNNMklKQWgrTVRBQW9BQUFEYUFFR0Y1ODhBQ3d6WWdrQ1I0eE1BQ1FBQUFOc0FRWjNuendBTERFaVFRSnJqRXdBTUFBQUEzQUJCdGVmUEFBc00ySTVBcHVNVEFBd0FBQURkQUVITjU4OEFDd3pZZ2tDeTR4TUFDZ0FBQU40QVFlWG56d0FMRE5pT1FMempFd0FOQUFBQTN3QkIvZWZQQUFzTTJJSkF5ZU1UQUF3QUFBRGdBRUdWNk04QUN3emdma0N2Z3hNQUJ3QUFBT0VBUWEzb3p3QUxESkIwUU5YakV3QUpBQUFBNGdCQnhlalBBQXNNc0loQTN1TVRBQXdBQUFEakFFSGQ2TThBQ3d5d2lFRHE0eE1BRFFBQUFPUUFRZlhvendBTERKQ0lRUGZqRXdBTkFBQUE1UUJCamVuUEFBc01TSVpBNTRRVEFBa0FBQURtQUVHbTZjOEFDd3Q0UUFUa0V3QUxBQUFBNXdCQnZ1blBBQXNMZUVBUDVCTUFDd0FBQU9nQVFkYnB6d0FMQzNoQUd1UVRBQXNBQUFEcEFFSHU2YzhBQ3d0NFFDWGtFd0FOQUFBQTZnQkJodXJQQUFzTGVFQXk1Qk1BRFFBQUFPc0FRWjdxendBTEMzaEFQK1FUQUEwQUFBRHNBRUcxNnM4QUN3emdma0JNNUJNQUN3QUFBTzBBUWMzcXp3QUxET0IrUUZma0V3QU1BQUFBN2dCQjVlclBBQXNNNEg1QVkrUVRBQXNBQUFEdkFFSDk2czhBQ3d6Z2ZrQnU1Qk1BQndBQUFQRUFRWlhyendBTERKQjBRSFhrRXdBS0FBQUE4Z0JCcmV2UEFBc01JSEZBZitRVEFBZ0FBQUR6QUVIRjY4OEFDd3h3aFVDSDVCTUFDZ0FBQVBRQVFkM3J6d0FMREhDRlFKSGtFd0FLQUFBQTlRQkI5ZXZQQUFzTWNJVkFtK1FUQUFvQUFBRDJBRUdPN004QUN3dDRRS1hrRXdBTUFBQUE5d0JCcHV6UEFBc0xlRUN4NUJNQURBQUFBUGdBUWI3c3p3QUxDM2hBdmVRVEFBd0FBQUQ1QUVIVzdNOEFDd3Q0UU1ua0V3QU9BQUFBK2dCQjd1elBBQXNMZUVEWDVCTUFEZ0FBQVBzQVFZYnR6d0FMQzNoQTVlUVRBQTRBQUFEOEFFR2Q3YzhBQ3d6Z2ZrRHo1Qk1BREFBQUFQMEFRYlh0endBTERPQitRUC9rRXdBTkFBQUEvZ0JCemUzUEFBczg0SDVBRE9VVEFBd0FBQUQvLy8vLy8vLy8vd0FBQUFBQXNJaEFHT1VUQUFVQUFBQlRlVzFpYjJ4R2IyNTBVM0JsWTJsbWFXTUFBQUFBQUFBZ0FFR1Y3czhBQ3d4QWIwQ2JmeE1BQlFBQUFDRUFRYTN1endBTEROQjBRS0IvRXdBR0FBQUFJZ0JCeGU3UEFBc01XSUZBcG44VEFBZ0FBQUFqQUVIZDdzOEFDd3hBZjBDdWZ4TUFDZ0FBQUNRQVFmWHV6d0FMREVCL1FMaC9Fd0FHQUFBQUpRQkJqZS9QQUFzTVFJOUF2bjhUQUFjQUFBQW1BRUdsNzg4QUN3d0lpa0RGZnhNQUNRQUFBQ2NBUWIzdnp3QUxETkIwUU01L0V3QUtBQUFBS0FCQjFlL1BBQXNNMEhSQTJIOFRBQWtBQUFBcEFFSHQ3ODhBQ3d6UWRFRGhmeE1BQ2dBQUFDb0FRWVh3endBTERFQi9RT3QvRXdBSUFBQUFLd0JCbmZEUEFBc00wSUZBODM4VEFBUUFBQUFzQUVHMThNOEFDd3hBYjBEM2Z4TUFCUUFBQUMwQVFjM3d6d0FMRE5CMFFQeC9Fd0FHQUFBQUxnQkI1ZkRQQUFzTVFHOUFBb0FUQUFZQUFBQXZBRUg5OE04QUN3eGdjVUFJZ0JNQUJRQUFBREFBUVpYeHp3QUxERUIvUUEyQUV3QUVBQUFBTVFCQnJmSFBBQXNNUUg5QUVZQVRBQU1BQUFBeUFFSEY4YzhBQ3d4QWYwQVVnQk1BQXdBQUFETUFRZDN4endBTERFQi9RQmVBRXdBRkFBQUFOQUJCOWZIUEFBc01RSDlBSElBVEFBUUFBQUExQUVHTjhzOEFDd3hBZjBBZ2dCTUFCQUFBQURZQVFhWHl6d0FMREVCL1FDU0FFd0FEQUFBQU53QkJ2ZkxQQUFzTVFIOUFKNEFUQUFVQUFBQTRBRUhWOHM4QUN3eEFmMEFzZ0JNQUJRQUFBRGtBUWUzeXp3QUxERUIvUURHQUV3QUVBQUFBT2dCQmhmUFBBQXNNMEhSQU5ZQVRBQVVBQUFBN0FFR2Q4ODhBQ3d6UWRFQTZnQk1BQ1FBQUFEd0FRYlh6endBTEROQ0JRRU9BRXdBRUFBQUFQUUJCemZQUEFBc00wSUZBUjRBVEFBVUFBQUErQUVIbDg4OEFDd3pRZ1VCTWdCTUFCd0FBQUQ4QVFmM3p6d0FMREVCL1FGT0FFd0FJQUFBQVFBQkJsZlRQQUFzTUVJMUFXNEFUQUFJQUFBQkJBRUd0OU04QUN3eVFoa0JkZ0JNQUFRQUFBRUlBUWNYMHp3QUxETmlFUUY2QUV3QUJBQUFBUXdCQjNmVFBBQXNNa0laQVg0QVRBQUVBQUFCRUFFSDE5TThBQ3d5UWhrQmdnQk1BQVFBQUFFVUFRWTMxendBTEROaUVRR0dBRXdBQkFBQUFSZ0JCcGZYUEFBc01HSU5BWW9BVEFBRUFBQUJIQUVHOTljOEFDd3hRaUVCamdCTUFBUUFBQUVnQVFkWDF6d0FMREZDSVFHU0FFd0FCQUFBQVNRQkI3ZlhQQUFzTVVIaEFaWUFUQUFFQUFBQktBRUdGOXM4QUN3eEFmMEJtZ0JNQUFRQUFBRXNBUVozMnp3QUxERkNJUUdlQUV3QUJBQUFBVEFCQnRmYlBBQXNNMklSQWFJQVRBQUVBQUFCTkFFSE45czhBQ3d5QWpVQnBnQk1BQVFBQUFFNEFRZVgyendBTERKQ0dRR3FBRXdBQkFBQUFUd0JCL2ZiUEFBc01VSWhBYTRBVEFBRUFBQUJRQUVHVjk4OEFDd3dZZzBCc2dCTUFBUUFBQUZFQVFhMzN6d0FMREZDSVFHMkFFd0FCQUFBQVVnQkJ4ZmZQQUFzTWtJWkFib0FUQUFFQUFBQlRBRUhkOTg4QUN3eGdnVUJ2Z0JNQUFRQUFBRlFBUWZYM3p3QUxETmlFUUhDQUV3QUJBQUFBVlFCQmpmalBBQXNNa0laQWNZQVRBQUVBQUFCV0FFR2wrTThBQ3d5UWhrQnlnQk1BQVFBQUFGY0FRYjM0endBTERFQ1BRSE9BRXdBQkFBQUFXQUJCMWZqUEFBc01rSVpBZElBVEFBRUFBQUJaQUVIdCtNOEFDd3lRaGtCMWdCTUFBUUFBQUZvQVFZWDV6d0FMRE5pRVFIYUFFd0FCQUFBQVd3QkJuZm5QQUFzTTBIUkFkNEFUQUFzQUFBQmNBRUcxK2M4QUN3eGdjVUNDZ0JNQUNRQUFBRjBBUWMzNXp3QUxETkIwUUl1QUV3QU1BQUFBWGdCQjVmblBBQXNNS0lKQWw0QVRBQXNBQUFCZkFFSDkrYzhBQ3d4QWYwQ2lnQk1BQ2dBQUFHQUFRWlg2endBTEROQjBRS3lBRXdBSkFBQUFZUUJCcmZyUEFBc01RSDlBdFlBVEFBRUFBQUJpQUVIRitzOEFDd3hnZ1VDMmdCTUFBUUFBQUdNQVFkMzZ6d0FMRE1CN1FMZUFFd0FCQUFBQVpBQkI5ZnJQQUFzTVlJRkF1SUFUQUFFQUFBQmxBRUdOKzg4QUN3ekFlMEM1Z0JNQUFRQUFBR1lBUWFYN3p3QUxETkIwUUxxQUV3QUJBQUFBWndCQnZmdlBBQXNNUUg5QXU0QVRBQUVBQUFCb0FFSFYrODhBQ3d4Z2dVQzhnQk1BQVFBQUFHa0FRZTM3endBTERHQnhRTDJBRXdBQkFBQUFhZ0JCaGZ6UEFBc00wSFJBdm9BVEFBRUFBQUJyQUVHZC9NOEFDd3hnZ1VDL2dCTUFBUUFBQUd3QVFiWDh6d0FMREdCeFFNQ0FFd0FCQUFBQWJRQkJ6ZnpQQUFzTUNJcEF3WUFUQUFFQUFBQnVBRUhsL004QUN3eGdnVURDZ0JNQUFRQUFBRzhBUWYzOHp3QUxERUIvUU1PQUV3QUJBQUFBY0FCQmxmM1BBQXNNWUlGQXhJQVRBQUVBQUFCeEFFR3QvYzhBQ3d4Z2dVREZnQk1BQVFBQUFISUFRY1g5endBTERNQjdRTWFBRXdBQkFBQUFjd0JCM2YzUEFBc01VSGhBeDRBVEFBRUFBQUIwQUVIMS9jOEFDd3pRZEVESWdCTUFBUUFBQUhVQVFZMyt6d0FMREdDQlFNbUFFd0FCQUFBQWRnQkJwZjdQQUFzTVFIOUF5b0FUQUFFQUFBQjNBRUc5L3M4QUN3eVFoa0RMZ0JNQUFRQUFBSGdBUWRYK3p3QUxERUIvUU15QUV3QUJBQUFBZVFCQjdmN1BBQXNNUUg5QXpZQVRBQUVBQUFCNkFFR0YvODhBQ3d6QWUwRE9nQk1BQVFBQUFIc0FRWjMvendBTERLQjRRTStBRXdBSkFBQUFmQUJCdGYvUEFBc01nR3RBMklBVEFBTUFBQUI5QUVITi84OEFDd3lnZUVEYmdCTUFDZ0FBQUg0QVFlWC96d0FMREVDQVFPV0FFd0FLQUFBQW9RQkIvZi9QQUFzTTBIUkE3NEFUQUFvQUFBQ2lBRUdWZ05BQUN3eEFmMEQ1Z0JNQUJBQUFBS01BUWEyQTBBQUxERUIvUVAyQUV3QUlBQUFBcEFCQnhZRFFBQXNNNEdSQUJZRVRBQWdBQUFDbEFFSGRnTkFBQ3d4QWYwQU5nUk1BQXdBQUFLWUFRZldBMEFBTERFQi9RQkNCRXdBR0FBQUFwd0JCallIUUFBc01RSDlBRm9FVEFBY0FBQUNvQUVHbGdkQUFDd3hBZjBBZGdSTUFDQUFBQUtrQVFiMkIwQUFMREdCeFFDV0JFd0FMQUFBQXFnQkIxWUhRQUFzTVFIOUFNSUVUQUF3QUFBQ3JBRUh0Z2RBQUN3eEFmMEE4Z1JNQURRQUFBS3dBUVlXQzBBQUxETkIwUUVtQkV3QU5BQUFBclFCQm5ZTFFBQXNNMEhSQVZvRVRBQTRBQUFDdUFFRzFndEFBQ3d4Z2dVQmtnUk1BQWdBQUFLOEFRYzJDMEFBTERHQ0JRR2FCRXdBQ0FBQUFzUUJCNVlMUUFBc01RSDlBYUlFVEFBWUFBQUN5QUVIOWd0QUFDd3hBZjBCdWdSTUFCZ0FBQUxNQVFaV0QwQUFMREVCL1FIU0JFd0FKQUFBQXRBQkJyWVBRQUFzTVFHOUFmWUVUQUE0QUFBQzJBRUhGZzlBQUN3emdnRUNMZ1JNQUNRQUFBTGNBUWQyRDBBQUxET0IxUUpTQkV3QUdBQUFBdUFCQjlZUFFBQXNNMEhSQW1vRVRBQTRBQUFDNUFFR05oTkFBQ3d4QWYwQ29nUk1BREFBQUFMb0FRYVdFMEFBTERFQi9RTFNCRXdBTkFBQUF1d0JCdllUUUFBc01RSDlBd1lFVEFBNEFBQUM4QUVIVmhOQUFDd3hBajBEUGdSTUFDQUFBQUwwQVFlMkUwQUFMREVDUFFOZUJFd0FMQUFBQXZ3QkJoWVhRQUFzTVFIOUE0b0VUQUF3QUFBREJBRUdkaGRBQUN3elFkRUR1Z1JNQUJRQUFBTUlBUWJXRjBBQUxETkIwUVBPQkV3QUZBQUFBd3dCQnpZWFFBQXNNMEhSQStJRVRBQW9BQUFERUFFSGxoZEFBQ3d6UWRFQUNnaE1BQlFBQUFNVUFRZjJGMEFBTEROQjBRQWVDRXdBR0FBQUF4Z0JCbFliUUFBc00wSFJBRFlJVEFBVUFBQURIQUVHdGh0QUFDd3pRZEVBU2doTUFDUUFBQU1nQVFjV0cwQUFMRE5CMFFCdUNFd0FJQUFBQXlnQkIzWWJRQUFzTTBIUkFJNElUQUFRQUFBRExBRUgxaHRBQUN3elFkRUFuZ2hNQUJ3QUFBTTBBUVkySDBBQUxETkIwUUM2Q0V3QU1BQUFBemdCQnBZZlFBQXNNMEhSQU9vSVRBQVlBQUFEUEFFRzloOUFBQ3d6UWRFQkFnaE1BQlFBQUFOQUFRZFdIMEFBTERFQ1BRRVdDRXdBR0FBQUE0UUJCN1lmUUFBc01RSTlBUzRJVEFBSUFBQURqQUVHRmlOQUFDd3pBY2tCTmdoTUFDd0FBQU9nQVFaMkkwQUFMRE5pRVFGaUNFd0FHQUFBQTZRQkJ0WWpRQUFzTVVJaEFYb0lUQUFZQUFBRHFBRUhOaU5BQUN3eEFqMEJrZ2hNQUFnQUFBT3NBUWVXSTBBQUxES0IwUUdhQ0V3QU1BQUFBOFFCQi9ZalFBQXNNa0laQWNvSVRBQUlBQUFEMUFFR1ZpZEFBQ3d4Z2NVQjBnaE1BQ0FBQUFQZ0FRYTJKMEFBTERHQnhRSHlDRXdBR0FBQUErUUJCeFluUUFBc01RSDlBZ29JVEFBWUFBQUQ2QUVIZGlkQUFDd3lRaGtDSWdoTUFBZ0FBQVBzQVFmV0owQUFMckI5Z2dVQ0tnaE1BQ2dBQUFQLy8vLy8vLy8vL0FBQUFBQUJRZUVDVWdoTUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBREFlMENkZ2hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQ2pnaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VDcGdoTUFEUUFBQVAvLy8vLy8vLy8vQUFBQUFBREFlMEMyZ2hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQzhnaE1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQURRZ1VERmdoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0RMZ2hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrRFJnaE1BQ3dBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBEY2doTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0RpZ2hNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwRHRnaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJRZUVEemdoTUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBREFlMEQvZ2hNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQUtneE1BQlFBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtBUGd4TUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEFZZ3hNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQWZneE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VBbGd4TUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBRFloRUFzZ3hNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQTFneE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJBYjBBN2d4TUFDd0FBQVAvLy8vLy8vLy8vQUFBQUFBQlloMEJHZ3hNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFEWWhFQlBneE1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBCV2d4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEJjZ3hNQUJRQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQmhneE1BREFBQUFQLy8vLy8vLy8vL0FBQUFBQUJnY1VCdGd4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEJ6Z3hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEWWhFQjVneE1BREFBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtDRmd4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMENMZ3hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEWWhFQ1JneE1BQ2dBQUFQLy8vLy8vLy8vL0FBQUFBQUJRZUVDYmd4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQlFlRUNoZ3hNQUNBQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2NVQ3BneE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURnZmtDdmd4TUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0MyZ3hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCUWlFQzhneE1BREFBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VESWd4TUFDd0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMERUZ3hNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrRGVneE1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBEbGd4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBREFlMERyZ3hNQUNBQUFBUC8vLy8vLy8vLy9BQUFBQUFEWWhFRHpneE1BQ2dBQUFQLy8vLy8vLy8vL0FBQUFBQUFZZzBEOWd4TUFCUUFBQVAvLy8vLy8vLy8vQUFBQUFBQlFpRUFDaEJNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQUpoQk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VBUGhCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQUFoVUFWaEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQWJoQk1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VBaWhCTUFCUUFBQVAvLy8vLy8vLy8vQUFBQUFBREFja0FuaEJNQURRQUFBUC8vLy8vLy8vLy9BQUFBQUFCUWlFQTBoQk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtBNmhCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0JBaEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEUWdVQkdoQk1BQ0FBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VCT2hCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBRFloRUJVaEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEZ2ZrQmFoQk1BQ3dBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBCbGhCTUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0J1aEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2NVQjBoQk1BQ3dBQUFQLy8vLy8vLy8vL0FBQUFBQURZaEVCL2hCTUFDd0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMENLaEJNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFEQWUwQ1RoQk1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBDY2hCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQmdnVUNpaEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2dVQ29oQk1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtDdmhCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQlFlRUMxaEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEUWdVQzdoQk1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQUNBYTBERWhCTUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBQlloMEROaEJNQUNnQUFBUC8vLy8vLy8vLy9BQUFBQUFCUWlFRFhoQk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJRZUVEZGhCTUFDZ0FBQVAvLy8vLy8vLy8vQUFBQUFBREFna0RuaEJNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFEWWhFRHdoQk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBEMmhCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEQ4aEJNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFEWWhFQURoUk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURZaEVBSmhSTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQW9nVUFQaFJNQURBQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQWJoUk1BQXdBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtBZWhSTUFDQUFBQVAvLy8vLy8vLy8vQUFBQUFBQmdjVUFtaFJNQURBQUFBUC8vLy8vLy8vLy9BQUFBQUFBQWVrQXloUk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBBNGhSTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0EvaFJNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQkdoUk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtCTWhSTUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBREFlMEJWaFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEQWUwQmJoUk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJnY1VCaGhSTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQlFpRUJvaFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQnVoUk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBCMGhSTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQlFlRUI3aFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2NVQ0JoUk1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQUJRaUVDS2hSTUFDd0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0NWaFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFBZ2cwQ2JoUk1BQlFBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VDZ2hSTUFCUUFBQVAvLy8vLy8vLy8vQUFBQUFBREFja0NsaFJNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFCUWlFQ3doUk1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VDNWhSTUFBZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQmdjVUM3aFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwREJoUk1BRFFBQUFQLy8vLy8vLy8vL0FBQUFBQURZaEVET2hSTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQmdnVURWaFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCd2gwRGJoUk1BRFFBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VEb2hSTUFDQUFBQVAvLy8vLy8vLy8vQUFBQUFBQ2dlRUR3aFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCUWlFRDJoUk1BREFBQUFQLy8vLy8vLy8vL0FBQUFBQURZaEVBQ2hoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFqMEFJaGhNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFEQWUwQVJoaE1BQ2dBQUFQLy8vLy8vLy8vL0FBQUFBQUJRZUVBYmhoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQlFlRUFoaGhNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFEWWhFQW9oaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJ3aDBBdWhoTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQW9nVUExaGhNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQStoaE1BQ3dBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VCSmhoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0JQaGhNQURRQUFBUC8vLy8vLy8vLy9BQUFBQUFEWWhFQmNoaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBCaWhoTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEJwaGhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCd2gwQnZoaE1BQ2dBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VCNWhoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQmdnVUIvaGhNQURBQUFBUC8vLy8vLy8vLy9BQUFBQUFCUWlFQ0xoaE1BRFFBQUFQLy8vLy8vLy8vL0FBQUFBQUFBZVVDWWhoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMENlaGhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQ2toaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VDcWhoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQW9nVUN3aGhNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQzNoaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBDOWhoTUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0RKaGhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwRFBoaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtEVmhoTUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBRFloRURoaGhNQURBQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrRHRoaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtEemhoTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0Q2aGhNQUJRQUFBUC8vLy8vLy8vLy9BQUFBQUFCUWlFRC9oaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBBRmh4TUFDZ0FBQVAvLy8vLy8vLy8vQUFBQUFBRFloRUFQaHhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCUWVFQVZoeE1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VBY2h4TUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBRFFnVUFvaHhNQUJRQUFBUC8vLy8vLy8vLy9BQUFBQUFCUWVFQXRoeE1BQ3dBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VBNGh4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBRFFkRUEraHhNQURBQUFBUC8vLy8vLy8vLy9BQUFBQUFEUWdVQktoeE1BQ2dBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBCVWh4TUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBQmdnVUJkaHhNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFBb2dVQm1oeE1BQ0FBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBCdWh4TUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEI2aHhNQUF3QUFBUC8vLy8vLy8vLy9BQUFBQUFEQWUwQjloeE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VDRGh4TUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBREFja0NQaHhNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2NVQ2FoeE1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBDaGh4TUFCQUFBQUZScGJXVnpMVUp2YkdRQUFBQUFBQUFnQUVHdHFkQUFDd3hBYjBDYmZ4TUFCUUFBQUNFQVFjV3AwQUFMREZCNFFLQi9Fd0FHQUFBQUlnQkIzYW5RQUFzTVdJRkFwbjhUQUFnQUFBQWpBRUgxcWRBQUN3eEFmMEN1ZnhNQUNnQUFBQ1FBUVkycTBBQUxERUIvUUxoL0V3QUdBQUFBSlFCQnBhclFBQXNNQ0lwQXZuOFRBQWNBQUFBbUFFRzlxdEFBQ3d4UWlFREZmeE1BQ1FBQUFDY0FRZFdxMEFBTEROQjBRTTUvRXdBS0FBQUFLQUJCN2FyUUFBc00wSFJBMkg4VEFBa0FBQUFwQUVHRnE5QUFDd3pRZEVEaGZ4TUFDZ0FBQUNvQVFaMnIwQUFMREVCL1FPdC9Fd0FJQUFBQUt3QkJ0YXZRQUFzTTBJRkE4MzhUQUFRQUFBQXNBRUhOcTlBQUN3eEFiMEQzZnhNQUJRQUFBQzBBUWVXcjBBQUxETkIwUVB4L0V3QUdBQUFBTGdCQi9hdlFBQXNNUUc5QUFvQVRBQVlBQUFBdkFFR1ZyTkFBQ3d4Z2NVQUlnQk1BQlFBQUFEQUFRYTJzMEFBTERFQi9RQTJBRXdBRUFBQUFNUUJCeGF6UUFBc01RSDlBRVlBVEFBTUFBQUF5QUVIZHJOQUFDd3hBZjBBVWdCTUFBd0FBQURNQVFmV3MwQUFMREVCL1FCZUFFd0FGQUFBQU5BQkJqYTNRQUFzTVFIOUFISUFUQUFRQUFBQTFBRUdscmRBQUN3eEFmMEFnZ0JNQUJBQUFBRFlBUWIydDBBQUxERUIvUUNTQUV3QURBQUFBTndCQjFhM1FBQXNNUUg5QUo0QVRBQVVBQUFBNEFFSHRyZEFBQ3d4QWYwQXNnQk1BQlFBQUFEa0FRWVd1MEFBTERFQi9RREdBRXdBRUFBQUFPZ0JCbmE3UUFBc00wSFJBTllBVEFBVUFBQUE3QUVHMXJ0QUFDd3pRZEVBNmdCTUFDUUFBQUR3QVFjMnUwQUFMRE5DQlFFT0FFd0FFQUFBQVBRQkI1YTdRQUFzTTBJRkFSNEFUQUFVQUFBQStBRUg5cnRBQUN3elFnVUJNZ0JNQUJ3QUFBRDhBUVpXdjBBQUxERUIvUUZPQUV3QUlBQUFBUUFCQnJxL1FBQXNMaWtCYmdCTUFBZ0FBQUVFQVFjV3YwQUFMRE5pRVFGMkFFd0FCQUFBQVFnQkIzYS9RQUFzTTJJUkFYb0FUQUFFQUFBQkRBRUgxcjlBQUN3elloRUJmZ0JNQUFRQUFBRVFBUVkydzBBQUxESkNHUUdDQUV3QUJBQUFBUlFCQnBiRFFBQXNNMklSQVlZQVRBQUVBQUFCR0FFRzlzTkFBQ3d6WWhFQmlnQk1BQVFBQUFFY0FRZFd3MEFBTERKQ0dRR09BRXdBQkFBQUFTQUJCN2JEUUFBc01VSWhBWklBVEFBRUFBQUJKQUVHRnNkQUFDd3hRZUVCbGdCTUFBUUFBQUVvQVFaMngwQUFMREVCL1FHYUFFd0FCQUFBQVN3QkJ0YkhRQUFzTTJJUkFaNEFUQUFFQUFBQk1BRUhOc2RBQUN3d1lnMEJvZ0JNQUFRQUFBRTBBUWVXeDBBQUxETWlMUUdtQUV3QUJBQUFBVGdCQi9iSFFBQXNNa0laQWFvQVRBQUVBQUFCUEFFR1ZzdEFBQ3d5UWhrQnJnQk1BQVFBQUFGQUFRYTJ5MEFBTERCaURRR3lBRXdBQkFBQUFVUUJCeGJMUUFBc01rSVpBYllBVEFBRUFBQUJTQUVIZHN0QUFDd3pZaEVCdWdCTUFBUUFBQUZNQVFmV3kwQUFMREdDQlFHK0FFd0FCQUFBQVZBQkJqYlBRQUFzTUdJTkFjSUFUQUFFQUFBQlZBRUdsczlBQUN3eVFoa0J4Z0JNQUFRQUFBRllBUWIyejBBQUxETmlFUUhLQUV3QUJBQUFBVndCQjFiUFFBQXNNeUl0QWM0QVRBQUVBQUFCWUFFSHRzOUFBQ3d6WWhFQjBnQk1BQVFBQUFGa0FRWVcwMEFBTERCaURRSFdBRXdBQkFBQUFXZ0JCbmJUUUFBc01HSU5BZG9BVEFBRUFBQUJiQUVHMXROQUFDd3pRZEVCM2dCTUFDd0FBQUZ3QVFjMjAwQUFMREdCeFFJS0FFd0FKQUFBQVhRQkI1YlRRQUFzTTBIUkFpNEFUQUF3QUFBQmVBRUg5dE5BQUN3elFnVUNYZ0JNQUN3QUFBRjhBUVpXMTBBQUxERUIvUUtLQUV3QUtBQUFBWUFCQnJiWFFBQXNNMEhSQXJJQVRBQWtBQUFCaEFFSEZ0ZEFBQ3d4QWYwQzFnQk1BQVFBQUFHSUFRZDIxMEFBTERFQi9RTGFBRXdBQkFBQUFZd0JCOWJYUUFBc013SHRBdDRBVEFBRUFBQUJrQUVHTnR0QUFDd3hBZjBDNGdCTUFBUUFBQUdVQVFhVzIwQUFMRE1CN1FMbUFFd0FCQUFBQVpnQkJ2YmJRQUFzTTBIUkF1b0FUQUFFQUFBQm5BRUhWdHRBQUN3eEFmMEM3Z0JNQUFRQUFBR2dBUWUyMjBBQUxER0NCUUx5QUV3QUJBQUFBYVFCQmhiZlFBQXNNWUhGQXZZQVRBQUVBQUFCcUFFR2R0OUFBQ3d4Z2NVQytnQk1BQVFBQUFHc0FRYlczMEFBTERFQi9RTCtBRXdBQkFBQUFiQUJCemJmUUFBc01ZSEZBd0lBVEFBRUFBQUJ0QUVIbHQ5QUFDd3hRaUVEQmdCTUFBUUFBQUc0QVFmMjMwQUFMREdDQlFNS0FFd0FCQUFBQWJ3QkJsYmpRQUFzTVFIOUF3NEFUQUFFQUFBQndBRUd0dU5BQUN3eEFmMERFZ0JNQUFRQUFBSEVBUWNXNDBBQUxERUIvUU1XQUV3QUJBQUFBY2dCQjNialFBQXNNVUhoQXhvQVRBQUVBQUFCekFFSDF1TkFBQ3d4UWVFREhnQk1BQVFBQUFIUUFRWTI1MEFBTERHQnhRTWlBRXdBQkFBQUFkUUJCcGJuUUFBc01ZSUZBeVlBVEFBRUFBQUIyQUVHOXVkQUFDd3pBZTBES2dCTUFBUUFBQUhjQVFkVzUwQUFMRE5pRVFNdUFFd0FCQUFBQWVBQkI3Ym5RQUFzTVFIOUF6SUFUQUFFQUFBQjVBRUdGdXRBQUN3ekFlMEROZ0JNQUFRQUFBSG9BUVoyNjBBQUxERkI0UU02QUV3QUJBQUFBZXdCQnRiclFBQXNNd0hWQXo0QVRBQWtBQUFCOEFFSE51dEFBQ3d5QWEwRFlnQk1BQXdBQUFIMEFRZVc2MEFBTERNQjFRTnVBRXdBS0FBQUFmZ0JCL2JyUUFBc00wSUZBNVlBVEFBb0FBQUNoQUVHVnU5QUFDd3hRZUVEdmdCTUFDZ0FBQUtJQVFhMjcwQUFMREVCL1FQbUFFd0FFQUFBQW93QkJ4YnZRQUFzTVFIOUEvWUFUQUFnQUFBQ2tBRUhkdTlBQUN3emdaRUFGZ1JNQUNBQUFBS1VBUWZXNzBBQUxERUIvUUEyQkV3QURBQUFBcGdCQmpielFBQXNNUUg5QUVJRVRBQVlBQUFDbkFFR2x2TkFBQ3d4QWYwQVdnUk1BQndBQUFLZ0FRYjI4MEFBTERFQi9RQjJCRXdBSUFBQUFxUUJCMWJ6UUFBc01ZSEZBSllFVEFBc0FBQUNxQUVIdHZOQUFDd3hBZjBBd2dSTUFEQUFBQUtzQVFZVzkwQUFMREVCL1FEeUJFd0FOQUFBQXJBQkJuYjNRQUFzTTBIUkFTWUVUQUEwQUFBQ3RBRUcxdmRBQUN3elFkRUJXZ1JNQURnQUFBSzRBUWMyOTBBQUxER0NCUUdTQkV3QUNBQUFBcndCQjViM1FBQXNNWUlGQVpvRVRBQUlBQUFDeEFFSDl2ZEFBQ3d4QWYwQm9nUk1BQmdBQUFMSUFRWlcrMEFBTERFQi9RRzZCRXdBR0FBQUFzd0JCcmI3UUFBc01RSDlBZElFVEFBa0FBQUMwQUVIRnZ0QUFDd3hBYjBCOWdSTUFEZ0FBQUxZQVFkMiswQUFMREVCL1FJdUJFd0FKQUFBQXR3QkI5YjdRQUFzTTRIVkFsSUVUQUFZQUFBQzRBRUdOdjlBQUN3elFkRUNhZ1JNQURnQUFBTGtBUWFXLzBBQUxERUIvUUtpQkV3QU1BQUFBdWdCQnZiL1FBQXNNUUg5QXRJRVRBQTBBQUFDN0FFSFZ2OUFBQ3d4QWYwREJnUk1BRGdBQUFMd0FRZTIvMEFBTERFQ1BRTStCRXdBSUFBQUF2UUJCaGNEUUFBc01RSTlBMTRFVEFBc0FBQUMvQUVHZHdOQUFDd3hBZjBEaWdSTUFEQUFBQU1FQVFiWEEwQUFMRE5CMFFPNkJFd0FGQUFBQXdnQkJ6Y0RRQUFzTTBIUkE4NEVUQUFVQUFBRERBRUhsd05BQUN3elFkRUQ0Z1JNQUNnQUFBTVFBUWYzQTBBQUxETkIwUUFLQ0V3QUZBQUFBeFFCQmxjSFFBQXNNMEhSQUI0SVRBQVlBQUFER0FFR3R3ZEFBQ3d6UWRFQU5naE1BQlFBQUFNY0FRY1hCMEFBTEROQjBRQktDRXdBSkFBQUF5QUJCM2NIUUFBc00wSFJBRzRJVEFBZ0FBQURLQUVIMXdkQUFDd3pRZEVBamdoTUFCQUFBQU1zQVFZM0MwQUFMRE5CMFFDZUNFd0FIQUFBQXpRQkJwY0xRQUFzTTBIUkFMb0lUQUF3QUFBRE9BRUc5d3RBQUN3elFkRUE2Z2hNQUJnQUFBTThBUWRYQzBBQUxETkIwUUVDQ0V3QUZBQUFBMEFCQjdjTFFBQXNNUUk5QVJZSVRBQVlBQUFEaEFFR0Z3OUFBQ3d5QWpVQkxnaE1BQWdBQUFPTUFRWjNEMEFBTERLQndRRTJDRXdBTEFBQUE2QUJCdGNQUUFBc01HSU5BV0lJVEFBWUFBQURwQUVITnc5QUFDd3lRaGtCZWdoTUFCZ0FBQU9vQVFlWEQwQUFMRElDTlFHU0NFd0FDQUFBQTZ3QkIvY1BRQUFzTXdISkFab0lUQUF3QUFBRHhBRUdWeE5BQUN3eVFoa0J5Z2hNQUFnQUFBUFVBUWEzRTBBQUxER0J4UUhTQ0V3QUlBQUFBK0FCQnhjVFFBQXNNWUhGQWZJSVRBQVlBQUFENUFFSGR4TkFBQ3d4QWYwQ0NnaE1BQmdBQUFQb0FRZlhFMEFBTERKQ0dRSWlDRXdBQ0FBQUErd0JCamNYUUFBdXNIMEIvUUlxQ0V3QUtBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQjRRSlNDRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQU1CN1FKMkNFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBRUIvUUtPQ0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRS21DRXdBTkFBQUEvLy8vLy8vLy8vOEFBQUFBQU1CN1FMYUNFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUx5Q0V3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFOQ0JRTVdDRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUJpRFFNdUNFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUU5HQ0V3QUxBQUFBLy8vLy8vLy8vLzhBQUFBQUFFQi9RTnlDRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FPS0NFd0FMQUFBQS8vLy8vLy8vLy84QUFBQUFBTUI3UU8yQ0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQjRRUE9DRXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQU1CN1FQK0NFd0FMQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUFxREV3QUZBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRQStERXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FCaURFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUIrREV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRQ1dERXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFDeURFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUURXREV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFFQnZRRHVERXdBTEFBQUEvLy8vLy8vLy8vOEFBQUFBQUZpSFFFYURFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUUUrREV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFNQjdRRmFERXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FGeURFd0FGQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUdHREV3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFHQnhRRzJERXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FIT0RFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUhtREV3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRSVdERXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FJdURFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUUpHREV3QUtBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQjRRSnVERXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUZCNFFLR0RFd0FJQUFBQS8vLy8vLy8vLy84QUFBQUFBR0J4UUttREV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFPQitRSytERXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFMYURFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUx5REV3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRTWlERXdBTEFBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FOT0RFd0FMQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUU42REV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQjRRT1dERXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQU1CN1FPdURFd0FJQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUVBPREV3QUtBQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRUDJERXdBRkFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FBS0VFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUUFtRUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRQStFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUFDRFFCV0VFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUJ1RUV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRQ0tFRXdBRkFBQUEvLy8vLy8vLy8vOEFBQUFBQU1CeVFDZUVFd0FOQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUURTRUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRRHFFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFFQ0VFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBTkNCUUVhRUV3QUlBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRRTZFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUJpRFFGU0VFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBT0IrUUZxRUV3QUxBQUFBLy8vLy8vLy8vLzhBQUFBQUFNQjdRR1dFRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FHNkVFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0J4UUhTRUV3QUxBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRSCtFRXdBTEFBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FJcUVFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBTUI3UUpPRUV3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFNQjdRSnlFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFLS0VFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0NCUUtpRUV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRSytFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUZCNFFMV0VFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBTkNCUUx1RUV3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFJQnJRTVNFRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQUZpSFFNMkVFd0FLQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUU5lRUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQjRRTjJFRXdBS0FBQUEvLy8vLy8vLy8vOEFBQUFBQU1DQ1FPZUVFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUVBDRUV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQjRRUGFFRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FQeUVFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUFPRkV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRQW1GRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUNpQlFBK0ZFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUJ1RkV3QURBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRQjZGRXdBSUFBQUEvLy8vLy8vLy8vOEFBQUFBQUdCeFFDYUZFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBT0IyUURLRkV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFNQjdRRGlGRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FEK0ZFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUUVhRkV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRRXlGRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQU1CN1FGV0ZFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBRkI0UUZ1RkV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQnhRR0dGRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FHaUZFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBRUIvUUc2RkV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFFQi9RSFNGRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUZCNFFIdUZFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBR0J4UUlHRkV3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFKQ0dRSXFGRXdBTEFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FKV0ZFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBQ0NEUUp1RkV3QUZBQUFBLy8vLy8vLy8vLzhBQUFBQUFFQi9RS0NGRXdBRkFBQUEvLy8vLy8vLy8vOEFBQUFBQU1CeVFLV0ZFd0FMQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUxDRkV3QUpBQUFBLy8vLy8vLy8vLzhBQUFBQUFBQ0NRTG1GRXdBQ0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdCeFFMdUZFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBRUIvUU1HRkV3QU5BQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRTTZGRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FOV0ZFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBSENIUU51RkV3QU5BQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRT2lGRXdBSUFBQUEvLy8vLy8vLy8vOEFBQUFBQU9CM1FQQ0ZFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUVBhRkV3QU1BQUFBLy8vLy8vLy8vLzhBQUFBQUFCaURRQUtHRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUVDUFFBaUdFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBTUI3UUJHR0V3QUtBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQjRRQnVHRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUZCNFFDR0dFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBQmlEUUNpR0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFIQ0hRQzZHRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUNpQlFEV0dFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBRUIvUUQ2R0V3QUxBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRRW1HRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FFK0dFd0FOQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUUZ5R0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFNQjdRR0tHRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FHbUdFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBSENIUUcrR0V3QUtBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRSG1HRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFIK0dFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUl1R0V3QU5BQUFBLy8vLy8vLy8vLzhBQUFBQUFBQjVRSmlHRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FKNkdFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUUtTR0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRS3FHRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUNpQlFMQ0dFd0FIQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUUxlR0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQjRRTDJHRXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQUpDR1FNbUdFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBRUIvUU0rR0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRTldHRXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQUJpRFFPR0dFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBTmlFUU8yR0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFOaUVRUE9HRXdBSEFBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFQcUdFd0FGQUFBQS8vLy8vLy8vLy84QUFBQUFBSkNHUVArR0V3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFGQjRRQVdIRXdBS0FBQUEvLy8vLy8vLy8vOEFBQUFBQU5pRVFBK0hFd0FHQUFBQS8vLy8vLy8vLy84QUFBQUFBRkI0UUJXSEV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFFQi9RQnlIRXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQVBDQ1FDaUhFd0FGQUFBQS8vLy8vLy8vLy84QUFBQUFBRkI0UUMySEV3QUxBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRRGlIRXdBR0FBQUEvLy8vLy8vLy8vOEFBQUFBQUdCeFFENkhFd0FNQUFBQS8vLy8vLy8vLy84QUFBQUFBUENDUUVxSEV3QUtBQUFBLy8vLy8vLy8vLzhBQUFBQUFFQi9RRlNIRXdBSkFBQUEvLy8vLy8vLy8vOEFBQUFBQUdDQlFGMkhFd0FKQUFBQS8vLy8vLy8vLy84QUFBQUFBQ2lCUUdhSEV3QUlBQUFBLy8vLy8vLy8vLzhBQUFBQUFFQi9RRzZIRXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQUVCL1FIcUhFd0FEQUFBQS8vLy8vLy8vLy84QUFBQUFBRkI0UUgySEV3QUdBQUFBLy8vLy8vLy8vLzhBQUFBQUFHQ0JRSU9IRXdBTUFBQUEvLy8vLy8vLy8vOEFBQUFBQU1CeVFJK0hFd0FMQUFBQS8vLy8vLy8vLy84QUFBQUFBR0J4UUpxSEV3QUhBQUFBLy8vLy8vLy8vLzhBQUFBQUFFQi9RS0dIRXdBRUFBQUFWR2x0WlhNdFFtOXNaRWwwWVd4cFl5QUFRY1hrMEFBTERFQnZRSnQvRXdBRkFBQUFJUUJCM2VUUUFBc00wSFJBb0g4VEFBWUFBQUFpQUVIMTVOQUFDd3hBZWtDbWZ4TUFDQUFBQUNNQVFZM2wwQUFMREVCL1FLNS9Fd0FLQUFBQUpBQkJwZVhRQUFzTVFIOUF1SDhUQUFZQUFBQWxBRUc5NWRBQUN3d0lpa0MrZnhNQUJ3QUFBQ1lBUWRYbDBBQUxERkNJUU1WL0V3QUpBQUFBSndCQjdlWFFBQXNNMEhSQXpuOFRBQW9BQUFBb0FFR0Y1dEFBQ3d6UWRFRFlmeE1BQ1FBQUFDa0FRWjNtMEFBTEROQjBRT0YvRXdBS0FBQUFLZ0JCdGViUUFBc01RSDlBNjM4VEFBZ0FBQUFyQUVITjV0QUFDd3dZaFVEemZ4TUFCQUFBQUN3QVFlWG0wQUFMREVCdlFQZC9Fd0FGQUFBQUxRQkIvZWJRQUFzTTBIUkEvSDhUQUFZQUFBQXVBRUdWNTlBQUN3eEFiMEFDZ0JNQUJnQUFBQzhBUWEzbjBBQUxER0J4UUFpQUV3QUZBQUFBTUFCQnhlZlFBQXNNUUg5QURZQVRBQVFBQUFBeEFFSGQ1OUFBQ3d4QWYwQVJnQk1BQXdBQUFESUFRZlhuMEFBTERFQi9RQlNBRXdBREFBQUFNd0JCamVqUUFBc01RSDlBRjRBVEFBVUFBQUEwQUVHbDZOQUFDd3hBZjBBY2dCTUFCQUFBQURVQVFiM28wQUFMREVCL1FDQ0FFd0FFQUFBQU5nQkIxZWpRQUFzTVFIOUFKSUFUQUFNQUFBQTNBRUh0Nk5BQUN3eEFmMEFuZ0JNQUJRQUFBRGdBUVlYcDBBQUxERUIvUUN5QUV3QUZBQUFBT1FCQm5lblFBQXNNUUg5QU1ZQVRBQVFBQUFBNkFFRzE2ZEFBQ3d6UWRFQTFnQk1BQlFBQUFEc0FRYzNwMEFBTEROQjBRRHFBRXdBSkFBQUFQQUJCNWVuUUFBc01HSVZBUTRBVEFBUUFBQUE5QUVIOTZkQUFDd3dZaFVCSGdCTUFCUUFBQUQ0QVFaWHEwQUFMREJpRlFFeUFFd0FIQUFBQVB3QkJyZXJRQUFzTVFIOUFVNEFUQUFnQUFBQkFBRUhGNnRBQUN3ekFqRUJiZ0JNQUFnQUFBRUVBUWQzcTBBQUxEQmlEUUYyQUV3QUJBQUFBUWdCQjllclFBQXNNR0lOQVhvQVRBQUVBQUFCREFFR042OUFBQ3d6WWhFQmZnQk1BQVFBQUFFUUFRYVhyMEFBTERKQ0dRR0NBRXdBQkFBQUFSUUJCdmV2UUFBc01HSU5BWVlBVEFBRUFBQUJHQUVIVjY5QUFDd3dZZzBCaWdCTUFBUUFBQUVjQVFlM3IwQUFMREpDR1FHT0FFd0FCQUFBQVNBQkJoZXpRQUFzTWtJWkFaSUFUQUFFQUFBQkpBRUdkN05BQUN3elFkRUJsZ0JNQUFRQUFBRW9BUWJYczBBQUxETUI3UUdhQUV3QUJBQUFBU3dCQnplelFBQXNNMklSQVo0QVRBQUVBQUFCTUFFSGw3TkFBQ3d4Z2dVQm9nQk1BQVFBQUFFMEFRZjNzMEFBTERBaUtRR21BRXdBQkFBQUFUZ0JCbGUzUUFBc00ySVJBYW9BVEFBRUFBQUJQQUVHdDdkQUFDd3lRaGtCcmdCTUFBUUFBQUZBQVFjWHQwQUFMREJpRFFHeUFFd0FCQUFBQVVRQkIzZTNRQUFzTWtJWkFiWUFUQUFFQUFBQlNBRUgxN2RBQUN3d1lnMEJ1Z0JNQUFRQUFBRk1BUVkzdTBBQUxERUIvUUcrQUV3QUJBQUFBVkFCQnBlN1FBQXNNWUlGQWNJQVRBQUVBQUFCVkFFRzk3dEFBQ3d5UWhrQnhnQk1BQVFBQUFGWUFRZFh1MEFBTERCaURRSEtBRXdBQkFBQUFWd0JCN2U3UUFBc01DSXBBYzRBVEFBRUFBQUJZQUVHRjc5QUFDd3dZZzBCMGdCTUFBUUFBQUZrQVFaM3YwQUFMREdDQlFIV0FFd0FCQUFBQVdnQkJ0ZS9RQUFzTVlJRkFkb0FUQUFFQUFBQmJBRUhONzlBQUN3eFFlRUIzZ0JNQUN3QUFBRndBUWVYdjBBQUxER0J4UUlLQUV3QUpBQUFBWFFCQi9lL1FBQXNNVUhoQWk0QVRBQXdBQUFCZUFFR1Y4TkFBQ3d4Z2VrQ1hnQk1BQ3dBQUFGOEFRYTN3MEFBTERFQi9RS0tBRXdBS0FBQUFZQUJCeGZEUUFBc00wSFJBcklBVEFBa0FBQUJoQUVIZDhOQUFDd3hBZjBDMWdCTUFBUUFBQUdJQVFmWHcwQUFMREVCL1FMYUFFd0FCQUFBQVl3QkJqZkhRQUFzTXdIdEF0NEFUQUFFQUFBQmtBRUdsOGRBQUN3eEFmMEM0Z0JNQUFRQUFBR1VBUWIzeDBBQUxETUI3UUxtQUV3QUJBQUFBWmdCQjFmSFFBQXNNWUhGQXVvQVRBQUVBQUFCbkFFSHQ4ZEFBQ3d4QWYwQzdnQk1BQVFBQUFHZ0FRWVh5MEFBTERFQi9RTHlBRXdBQkFBQUFhUUJCbmZMUUFBc01ZSEZBdllBVEFBRUFBQUJxQUVHMTh0QUFDd3hnY1VDK2dCTUFBUUFBQUdzQVFjM3kwQUFMRE1CN1FMK0FFd0FCQUFBQWJBQkI1ZkxRQUFzTVlIRkF3SUFUQUFFQUFBQnRBRUg5OHRBQUN3eVFoa0RCZ0JNQUFRQUFBRzRBUVpYejBBQUxERUIvUU1LQUV3QUJBQUFBYndCQnJmUFFBQXNNUUg5QXc0QVRBQUVBQUFCd0FFSEY4OUFBQ3d4QWYwREVnQk1BQVFBQUFIRUFRZDN6MEFBTERFQi9RTVdBRXdBQkFBQUFjZ0JCOWZQUUFBc01VSGhBeG9BVEFBRUFBQUJ6QUVHTjlOQUFDd3hRZUVESGdCTUFBUUFBQUhRQVFhWDAwQUFMREdCeFFNaUFFd0FCQUFBQWRRQkJ2ZlRRQUFzTVFIOUF5WUFUQUFFQUFBQjJBRUhWOU5BQUN3ekFlMERLZ0JNQUFRQUFBSGNBUWUzMDBBQUxETmlFUU11QUV3QUJBQUFBZUFCQmhmWFFBQXNNd0h0QXpJQVRBQUVBQUFCNUFFR2Q5ZEFBQ3d6QWUwRE5nQk1BQVFBQUFIb0FRYlgxMEFBTERGQjRRTTZBRXdBQkFBQUFld0JCenZYUUFBc0xlVURQZ0JNQUNRQUFBSHdBUWVYMTBBQUxEREJ4UU5pQUV3QURBQUFBZlFCQi92WFFBQXNMZVVEYmdCTUFDZ0FBQUg0QVFaWDIwQUFMRE9pQVFPV0FFd0FLQUFBQW9RQkJyZmJRQUFzTVVIaEE3NEFUQUFvQUFBQ2lBRUhGOXRBQUN3eEFmMEQ1Z0JNQUJBQUFBS01BUWQzMjBBQUxERUIvUVAyQUV3QUlBQUFBcEFCQjlmYlFBQXNNNEdSQUJZRVRBQWdBQUFDbEFFR045OUFBQ3d4QWYwQU5nUk1BQXdBQUFLWUFRYVgzMEFBTERFQi9RQkNCRXdBR0FBQUFwd0JCdmZmUUFBc01RSDlBRm9FVEFBY0FBQUNvQUVIVjk5QUFDd3hBZjBBZGdSTUFDQUFBQUtrQVFlMzMwQUFMRE1CcVFDV0JFd0FMQUFBQXFnQkJoZmpRQUFzTVlJRkFNSUVUQUF3QUFBQ3JBRUdkK05BQUN3eEFmMEE4Z1JNQURRQUFBS3dBUWJYNDBBQUxETkIwUUVtQkV3QU5BQUFBclFCQnpmalFBQXNNMEhSQVZvRVRBQTRBQUFDdUFFSGwrTkFBQ3d4QWYwQmtnUk1BQWdBQUFLOEFRZjM0MEFBTERFQi9RR2FCRXdBQ0FBQUFzUUJCbGZuUUFBc01RSDlBYUlFVEFBWUFBQUN5QUVHdCtkQUFDd3hBZjBCdWdSTUFCZ0FBQUxNQVFjWDUwQUFMREVCL1FIU0JFd0FKQUFBQXRBQkIzZm5RQUFzTVFHOUFmWUVUQUE0QUFBQzJBRUgxK2RBQUN3eFlnRUNMZ1JNQUNRQUFBTGNBUVkzNjBBQUxET0IxUUpTQkV3QUdBQUFBdUFCQnBmclFBQXNNMEhSQW1vRVRBQTRBQUFDNUFFRzkrdEFBQ3d4Z2dVQ29nUk1BREFBQUFMb0FRZFg2MEFBTERHQ0JRTFNCRXdBTkFBQUF1d0JCN2ZyUUFBc01RSDlBd1lFVEFBNEFBQUM4QUVHRis5QUFDd3pJaTBEUGdSTUFDQUFBQUwwQVFaMzcwQUFMREVDUFFOZUJFd0FMQUFBQXZ3QkJ0ZnZRQUFzTVFIOUE0b0VUQUF3QUFBREJBRUhOKzlBQUN3elFkRUR1Z1JNQUJRQUFBTUlBUWVYNzBBQUxETkIwUVBPQkV3QUZBQUFBd3dCQi9mdlFBQXNNMEhSQStJRVRBQW9BQUFERUFFR1YvTkFBQ3d6UWRFQUNnaE1BQlFBQUFNVUFRYTM4MEFBTEROQjBRQWVDRXdBR0FBQUF4Z0JCeGZ6UUFBc00wSFJBRFlJVEFBVUFBQURIQUVIZC9OQUFDd3pRZEVBU2doTUFDUUFBQU1nQVFmWDgwQUFMRE5CMFFCdUNFd0FJQUFBQXlnQkJqZjNRQUFzTTBIUkFJNElUQUFRQUFBRExBRUdsL2RBQUN3elFkRUFuZ2hNQUJ3QUFBTTBBUWIzOTBBQUxETkIwUUM2Q0V3QU1BQUFBemdCQjFmM1FBQXNNMEhSQU9vSVRBQVlBQUFEUEFFSHQvZEFBQ3d6UWRFQkFnaE1BQlFBQUFOQUFRWVgrMEFBTERNaUxRRVdDRXdBR0FBQUE0UUJCbmY3UUFBc015SXRBUzRJVEFBSUFBQURqQUVHMS90QUFDd3hBY1VCTmdoTUFDd0FBQU9nQVFjMyswQUFMREdDQlFGaUNFd0FHQUFBQTZRQkI1ZjdRQUFzTWtJWkFYb0lUQUFZQUFBRHFBRUg5L3RBQUN3eUFqVUJrZ2hNQUFnQUFBT3NBUVpYLzBBQUxER0J6UUdhQ0V3QU1BQUFBOFFCQnJmL1FBQXNNMklSQWNvSVRBQUlBQUFEMUFFSEYvOUFBQ3d4Z2NVQjBnaE1BQ0FBQUFQZ0FRZDMvMEFBTERHQnhRSHlDRXdBR0FBQUErUUJCOWYvUUFBc01RSDlBZ29JVEFBWUFBQUQ2QUVHTmdORUFDd3pZaEVDSWdoTUFBZ0FBQVBzQVFhV0EwUUFMckI5QWYwQ0tnaE1BQ2dBQUFQLy8vLy8vLy8vL0FBQUFBQURRZEVDVWdoTUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBREFlMENkZ2hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQ2pnaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBDcGdoTUFEUUFBQVAvLy8vLy8vLy8vQUFBQUFBREFlMEMyZ2hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2dVQzhnaE1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQUFZaFVERmdoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQmdnVURMZ2hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFBWWcwRFJnaE1BQ3dBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBEY2doTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0RpZ2hNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFEQWUwRHRnaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJRZUVEemdoTUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBREFlMEQvZ2hNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQUtneE1BQlFBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtBUGd4TUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEFZZ3hNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQWZneE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBBbGd4TUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQVlnMEFzZ3hNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQTFneE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJBYjBBN2d4TUFDd0FBQVAvLy8vLy8vLy8vQUFBQUFBREFoMEJHZ3hNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFBWWcwQlBneE1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBCV2d4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEJjZ3hNQUJRQUFBUC8vLy8vLy8vLy9BQUFBQUFEWWhFQmhneE1BREFBQUFQLy8vLy8vLy8vL0FBQUFBQUJnY1VCdGd4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEJ6Z3hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2dVQjVneE1BREFBQUFQLy8vLy8vLy8vL0FBQUFBQURZaEVDRmd4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMENMZ3hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFBWWcwQ1JneE1BQ2dBQUFQLy8vLy8vLy8vL0FBQUFBQUJRZUVDYmd4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQlFlRUNoZ3hNQUNBQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2NVQ3BneE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJ3ZlVDdmd4TUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQVlnMEMyZ3hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQzhneE1BREFBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBESWd4TUFDd0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMERUZ3hNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFBWWcwRGVneE1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUJRZUVEbGd4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBREFlMERyZ3hNQUNBQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2dVRHpneE1BQ2dBQUFQLy8vLy8vLy8vL0FBQUFBQUFZZzBEOWd4TUFCUUFBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0FDaEJNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFBWWcwQUpoQk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBBUGhCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQUFnVUFWaEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQWJoQk1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBBaWhCTUFCUUFBQVAvLy8vLy8vLy8vQUFBQUFBREFja0FuaEJNQURRQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQTBoQk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUFZZzBBNmhCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQVlnMEJBaEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFBWWhVQkdoQk1BQ0FBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBCT2hCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQmdnVUJVaEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEQWZVQmFoQk1BQ3dBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBCbGhCTUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBRFloRUJ1aEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2NVQjBoQk1BQ3dBQUFQLy8vLy8vLy8vL0FBQUFBQUFZZzBCL2hCTUFDd0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMENLaEJNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFEQWUwQ1RoQk1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBDY2hCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMENpaEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQ29oQk1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQURZaEVDdmhCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBRFFkRUMxaEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFBWWhVQzdoQk1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQUF3Y1VERWhCTUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBREFoMEROaEJNQUNnQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrRFhoQk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURRZEVEZGhCTUFDZ0FBQVAvLy8vLy8vLy8vQUFBQUFBREFna0RuaEJNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFBWWcwRHdoQk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJRZUVEMmhCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEQ4aEJNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2dVQURoUk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VBSmhSTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQW9nVUFQaFJNQURBQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQWJoUk1BQXdBQUFQLy8vLy8vLy8vL0FBQUFBQURZaEVBZWhSTUFDQUFBQVAvLy8vLy8vLy8vQUFBQUFBQmdjVUFtaFJNQURBQUFBUC8vLy8vLy8vLy9BQUFBQUFEQWNrQXloUk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBBNGhSTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0EvaFJNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFBWWcwQkdoUk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUFZZzBCTWhSTUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBREFlMEJWaFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCUWVFQmJoUk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJnY1VCaGhSTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0JvaFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQnVoUk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBCMGhSTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQlFlRUI3aFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2NVQ0JoUk1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtDS2hSTUFDd0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0NWaFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFBZ2cwQ2JoUk1BQlFBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBDZ2hSTUFCUUFBQVAvLy8vLy8vLy8vQUFBQUFBREFja0NsaFJNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQ3doUk1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBDNWhSTUFBZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQmdjVUM3aFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwREJoUk1BRFFBQUFQLy8vLy8vLy8vL0FBQUFBQUFZZzBET2hSTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMERWaFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCd2gwRGJoUk1BRFFBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBEb2hSTUFDQUFBQVAvLy8vLy8vLy8vQUFBQUFBREFja0R3aFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEWWhFRDJoUk1BREFBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VBQ2hoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ2dqa0FJaGhNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFEQWUwQVJoaE1BQ2dBQUFQLy8vLy8vLy8vL0FBQUFBQURRZEVBYmhoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBRFFkRUFoaGhNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFBWWcwQW9oaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJ3aDBBdWhoTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQW9nVUExaGhNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQStoaE1BQ3dBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBCSmhoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0JQaGhNQURRQUFBUC8vLy8vLy8vLy9BQUFBQUFBWWcwQmNoaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBCaWhoTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEJwaGhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCd2gwQnZoaE1BQ2dBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBCNWhoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEIvaGhNQURBQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQ0xoaE1BRFFBQUFQLy8vLy8vLy8vL0FBQUFBQUFBZVVDWWhoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMENlaGhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEWWhFQ2toaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBDcWhoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQlFmRUN3aGhNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQzNoaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJRZUVDOWhoTUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBRFloRURKaGhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwRFBoaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUFZZzBEVmhoTUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBQmdnVURoaGhNQURBQUFBUC8vLy8vLy8vLy9BQUFBQUFBWWcwRHRoaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUFZZzBEemhoTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQVlnMEQ2aGhNQUJRQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrRC9oaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJRZUVBRmh4TUFDZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQVlnMEFQaHhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEUWRFQVZoeE1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBBY2h4TUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBQVloVUFvaHhNQUJRQUFBUC8vLy8vLy8vLy9BQUFBQUFEUWRFQXRoeE1BQ3dBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBBNGh4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQmdjVUEraHhNQURBQUFBUC8vLy8vLy8vLy9BQUFBQUFBWWhVQktoeE1BQ2dBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBCVWh4TUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEJkaHhNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFBb2dVQm1oeE1BQ0FBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBCdWh4TUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEI2aHhNQUF3QUFBUC8vLy8vLy8vLy9BQUFBQUFCUWVFQjloeE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBDRGh4TUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBREFja0NQaHhNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2NVQ2FoeE1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBDaGh4TUFCQUFBQUZScGJXVnpMVWwwWVd4cFl3QUFBQUFnQUVIZG45RUFDd3hBYjBDYmZ4TUFCUUFBQUNFQVFmV2YwUUFMRE5CMFFLQi9Fd0FHQUFBQUlnQkJqYURSQUFzTWdIbEFwbjhUQUFnQUFBQWpBRUdsb05FQUN3eEFmMEN1ZnhNQUNnQUFBQ1FBUWIyZzBRQUxERUIvUUxoL0V3QUdBQUFBSlFCQjFhRFJBQXNNQ0lwQXZuOFRBQWNBQUFBbUFFSHRvTkVBQ3d4UWlFREZmeE1BQ1FBQUFDY0FRWVdoMFFBTEROQjBRTTUvRXdBS0FBQUFLQUJCbmFIUkFBc00wSFJBMkg4VEFBa0FBQUFwQUVHMW9kRUFDd3pRZEVEaGZ4TUFDZ0FBQUNvQVFjMmgwUUFMREVCL1FPdC9Fd0FJQUFBQUt3QkI1YUhSQUFzTW9JRkE4MzhUQUFRQUFBQXNBRUg5b2RFQUN3eEFiMEQzZnhNQUJRQUFBQzBBUVpXaTBRQUxETkIwUVB4L0V3QUdBQUFBTGdCQnJhTFJBQXNNUUc5QUFvQVRBQVlBQUFBdkFFSEZvdEVBQ3d4Z2NVQUlnQk1BQlFBQUFEQUFRZDJpMFFBTERFQi9RQTJBRXdBRUFBQUFNUUJCOWFMUkFBc01RSDlBRVlBVEFBTUFBQUF5QUVHTm85RUFDd3hBZjBBVWdCTUFBd0FBQURNQVFhV2owUUFMREVCL1FCZUFFd0FGQUFBQU5BQkJ2YVBSQUFzTVFIOUFISUFUQUFRQUFBQTFBRUhWbzlFQUN3eEFmMEFnZ0JNQUJBQUFBRFlBUWUyajBRQUxERUIvUUNTQUV3QURBQUFBTndCQmhhVFJBQXNNUUg5QUo0QVRBQVVBQUFBNEFFR2RwTkVBQ3d4QWYwQXNnQk1BQlFBQUFEa0FRYldrMFFBTERFQi9RREdBRXdBRUFBQUFPZ0JCemFUUkFBc01ZSEZBTllBVEFBVUFBQUE3QUVIbHBORUFDd3hnY1VBNmdCTUFDUUFBQUR3QVFmMmswUUFMREtDQlFFT0FFd0FFQUFBQVBRQkJsYVhSQUFzTW9JRkFSNEFUQUFVQUFBQStBRUd0cGRFQUN3eWdnVUJNZ0JNQUJ3QUFBRDhBUWNXbDBRQUxETUI3UUZPQUV3QUlBQUFBUUFCQjNhWFJBQXNNeUl4QVc0QVRBQUlBQUFCQkFFSDFwZEVBQ3d5UWhrQmRnQk1BQVFBQUFFSUFRWTJtMFFBTEROaUVRRjZBRXdBQkFBQUFRd0JCcGFiUkFBc00ySVJBWDRBVEFBRUFBQUJFQUVHOXB0RUFDd3lRaGtCZ2dCTUFBUUFBQUVVQVFkV20wUUFMREJpRFFHR0FFd0FCQUFBQVJnQkI3YWJSQUFzTVlJRkFZb0FUQUFFQUFBQkhBRUdGcDlFQUN3eVFoa0JqZ0JNQUFRQUFBRWdBUVoybjBRQUxESkNHUUdTQUV3QUJBQUFBU1FCQnRhZlJBQXNNMEhSQVpZQVRBQUVBQUFCS0FFSE5wOUVBQ3d4UWVFQm1nQk1BQVFBQUFFc0FRZVduMFFBTERKQ0dRR2VBRXdBQkFBQUFUQUJCL2FmUkFBc01HSU5BYUlBVEFBRUFBQUJOQUVHVnFORUFDd3pJaTBCcGdCTUFBUUFBQUU0QVFhMm8wUUFMREpDR1FHcUFFd0FCQUFBQVR3QkJ4YWpSQUFzTWtJWkFhNEFUQUFFQUFBQlFBRUhkcU5FQUN3eGdnVUJzZ0JNQUFRQUFBRkVBUWZXbzBRQUxESkNHUUcyQUV3QUJBQUFBVWdCQmphblJBQXNNMklSQWJvQVRBQUVBQUFCVEFFR2xxZEVBQ3d4Z2dVQnZnQk1BQVFBQUFGUUFRYjJwMFFBTERCaURRSENBRXdBQkFBQUFWUUJCMWFuUkFBc01rSVpBY1lBVEFBRUFBQUJXQUVIdHFkRUFDd3lRaGtCeWdCTUFBUUFBQUZjQVFZV3EwUUFMRElDTlFIT0FFd0FCQUFBQVdBQkJuYXJSQUFzTWtJWkFkSUFUQUFFQUFBQlpBRUcxcXRFQUN3eVFoa0IxZ0JNQUFRQUFBRm9BUWMycTBRQUxEQmlEUUhhQUV3QUJBQUFBV3dCQjVhclJBQXNNMEhSQWQ0QVRBQXNBQUFCY0FFSDlxdEVBQ3d4Z2NVQ0NnQk1BQ1FBQUFGMEFRWldyMFFBTEROQjBRSXVBRXdBTUFBQUFYZ0JCcmF2UkFBc01VSDFBbDRBVEFBc0FBQUJmQUVIRnE5RUFDd3hBZjBDaWdCTUFDZ0FBQUdBQVFkMnIwUUFMRE5CMFFLeUFFd0FKQUFBQVlRQkI5YXZSQUFzTXdIdEF0WUFUQUFFQUFBQmlBRUdOck5FQUN3eEFmMEMyZ0JNQUFRQUFBR01BUWFXczBRQUxETUI3UUxlQUV3QUJBQUFBWkFCQnZhelJBQXNNUUg5QXVJQVRBQUVBQUFCbEFFSFZyTkVBQ3d6QWUwQzVnQk1BQVFBQUFHWUFRZTJzMFFBTEROQjBRTHFBRXdBQkFBQUFad0JCaGEzUkFBc01RSDlBdTRBVEFBRUFBQUJvQUVHZHJkRUFDd3hBZjBDOGdCTUFBUUFBQUdrQVFiV3QwUUFMREdCeFFMMkFFd0FCQUFBQWFnQkJ6YTNSQUFzTVlIRkF2b0FUQUFFQUFBQnJBRUhscmRFQUN3eEFmMEMvZ0JNQUFRQUFBR3dBUWYydDBRQUxER0J4UU1DQUV3QUJBQUFBYlFCQmxhN1JBQXNNVUloQXdZQVRBQUVBQUFCdUFFR3RydEVBQ3d4QWYwRENnQk1BQVFBQUFHOEFRY1d1MFFBTERFQi9RTU9BRXdBQkFBQUFjQUJCM2E3UkFBc01RSDlBeElBVEFBRUFBQUJ4QUVIMXJ0RUFDd3hBZjBERmdCTUFBUUFBQUhJQVFZMnYwUUFMRE5CMFFNYUFFd0FCQUFBQWN3QkJwYS9SQUFzTVVIaEF4NEFUQUFFQUFBQjBBRUc5cjlFQUN3eGdjVURJZ0JNQUFRQUFBSFVBUWRXdjBRQUxERUIvUU1tQUV3QUJBQUFBZGdCQjdhL1JBQXNNUUg5QXlvQVRBQUVBQUFCM0FFR0ZzTkVBQ3d5UWhrRExnQk1BQVFBQUFIZ0FRWjJ3MFFBTERFQi9RTXlBRXdBQkFBQUFlUUJCdGJEUkFBc01RSDlBellBVEFBRUFBQUI2QUVITnNORUFDd3pBZTBET2dCTUFBUUFBQUhzQVFlYXcwUUFMQzM1QXo0QVRBQWtBQUFCOEFFSCtzTkVBQ3d0cFFOaUFFd0FEQUFBQWZRQkJsckhSQUFzTGZrRGJnQk1BQ2dBQUFINEFRYTJ4MFFBTERPaUFRT1dBRXdBS0FBQUFvUUJCeGJIUkFBc00wSFJBNzRBVEFBb0FBQUNpQUVIZHNkRUFDd3hBZjBENWdCTUFCQUFBQUtNQVFmV3gwUUFMREVCL1FQMkFFd0FJQUFBQXBBQkJqYkxSQUFzTTRHUkFCWUVUQUFnQUFBQ2xBRUdsc3RFQUN3eEFmMEFOZ1JNQUF3QUFBS1lBUWIyeTBRQUxERUIvUUJDQkV3QUdBQUFBcHdCQjFiTFJBQXNNUUg5QUZvRVRBQWNBQUFDb0FFSHRzdEVBQ3d4QWYwQWRnUk1BQ0FBQUFLa0FRWVd6MFFBTERJQm1RQ1dCRXdBTEFBQUFxZ0JCbmJQUkFBc013SHRBTUlFVEFBd0FBQUNyQUVHMXM5RUFDd3hBZjBBOGdSTUFEUUFBQUt3QVFjMnowUUFMRE5CMFFFbUJFd0FOQUFBQXJRQkI1YlBSQUFzTTBIUkFWb0VUQUE0QUFBQ3VBRUg5czlFQUN3eGdnVUJrZ1JNQUFnQUFBSzhBUVpXMDBRQUxER0NCUUdhQkV3QUNBQUFBc1FCQnJiVFJBQXNNUUg5QWFJRVRBQVlBQUFDeUFFSEZ0TkVBQ3d4QWYwQnVnUk1BQmdBQUFMTUFRZDIwMFFBTERFQi9RSFNCRXdBSkFBQUF0QUJCOWJUUkFBc01RRzlBZllFVEFBNEFBQUMyQUVHTnRkRUFDd3hRZkVDTGdSTUFDUUFBQUxjQVFhVzEwUUFMRE9CMVFKU0JFd0FHQUFBQXVBQkJ2YlhSQUFzTTBIUkFtb0VUQUE0QUFBQzVBRUhWdGRFQUN3ekFlMENvZ1JNQURBQUFBTG9BUWUyMTBRQUxETUI3UUxTQkV3QU5BQUFBdXdCQmhiYlJBQXNNUUg5QXdZRVRBQTRBQUFDOEFFR2R0dEVBQ3d4QWowRFBnUk1BQ0FBQUFMMEFRYlcyMFFBTERFQ1BRTmVCRXdBTEFBQUF2d0JCemJiUkFBc013SHRBNG9FVEFBd0FBQURCQUVIbHR0RUFDd3pRZEVEdWdSTUFCUUFBQU1JQVFmMjIwUUFMRE5CMFFQT0JFd0FGQUFBQXd3QkJsYmZSQUFzTTBIUkErSUVUQUFvQUFBREVBRUd0dDlFQUN3elFkRUFDZ2hNQUJRQUFBTVVBUWNXMzBRQUxETkIwUUFlQ0V3QUdBQUFBeGdCQjNiZlJBQXNNMEhSQURZSVRBQVVBQUFESEFFSDF0OUVBQ3d6UWRFQVNnaE1BQ1FBQUFNZ0FRWTI0MFFBTEROQjBRQnVDRXdBSUFBQUF5Z0JCcGJqUkFBc00wSFJBSTRJVEFBUUFBQURMQUVHOXVORUFDd3pRZEVBbmdoTUFCd0FBQU0wQVFkVzQwUUFMRE5CMFFDNkNFd0FNQUFBQXpnQkI3YmpSQUFzTTBIUkFPb0lUQUFZQUFBRFBBRUdGdWRFQUN3elFkRUJBZ2hNQUJRQUFBTkFBUVoyNTBRQUxERUNQUUVXQ0V3QUdBQUFBNFFCQnRiblJBQXNNeUl0QVM0SVRBQUlBQUFEakFFSE51ZEVBQ3d4QWNVQk5naE1BQ3dBQUFPZ0FRZVc1MFFBTERCaURRRmlDRXdBR0FBQUE2UUJCL2JuUkFBc01rSVpBWG9JVEFBWUFBQURxQUVHVnV0RUFDd3pJaTBCa2doTUFBZ0FBQU9zQVFhMjYwUUFMREdCelFHYUNFd0FNQUFBQThRQkJ4YnJSQUFzTTJJUkFjb0lUQUFJQUFBRDFBRUhkdXRFQUN3eGdjVUIwZ2hNQUNBQUFBUGdBUWZXNjBRQUxER0J4UUh5Q0V3QUdBQUFBK1FCQmpidlJBQXNNUUg5QWdvSVRBQVlBQUFENkFFR2x1OUVBQ3d5UWhrQ0lnaE1BQWdBQUFQc0FRYjI3MFFBTDVDUkFmMENLZ2hNQUNnQUFBUC8vLy8vLy8vLy9BQUFBQUFEUWRFQ1VnaE1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBDZGdoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBREFlMENqZ2hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQ3BnaE1BRFFBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBDMmdoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0M4Z2hNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFDZ2dVREZnaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtETGdoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0RSZ2hNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFEQWUwRGNnaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtEaWdoTUFDd0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMER0Z2hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCUWVFRHpnaE1BREFBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBEL2doTUFDd0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0FLZ3hNQUJRQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQVBneE1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBBWWd4TUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0FmZ3hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQWxneE1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUFZZzBBc2d4TUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0ExZ3hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWIwQTdneE1BQ3dBQUFQLy8vLy8vLy8vL0FBQUFBQURBaDBCR2d4TUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBQVlnMEJQZ3hNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFEQWUwQldneE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBCY2d4TUFCUUFBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0JoZ3hNQURBQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2NVQnRneE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBCemd4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQVlnMEI1Z3hNQURBQUFBUC8vLy8vLy8vLy9BQUFBQUFEWWhFQ0ZneE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBDTGd4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQVlnMENSZ3hNQUNnQUFBUC8vLy8vLy8vLy9BQUFBQUFCUWVFQ2JneE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJRZUVDaGd4TUFDQUFBQVAvLy8vLy8vLy8vQUFBQUFBQmdjVUNwZ3hNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCd2ZVQ3ZneE1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQURZaEVDMmd4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0M4Z3hNQURBQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwRElneE1BQ3dBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBEVGd4TUFDd0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0RlZ3hNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFEUWRFRGxneE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBEcmd4TUFDQUFBQVAvLy8vLy8vLy8vQUFBQUFBQVlnMER6Z3hNQUNnQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2dVRDlneE1BQlFBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtBQ2hCTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBRFloRUFKaEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2dVQVBoQk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ2tBVmhCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0FiaEJNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQWloQk1BQlFBQUFQLy8vLy8vLy8vL0FBQUFBQURBY2tBbmhCTUFEUUFBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0EwaEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQTZoQk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtCQWhCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ2dnVUJHaEJNQUNBQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQk9oQk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUFZZzBCVWhCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBREFmVUJhaEJNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQmxoQk1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtCdWhCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQmdjVUIwaEJNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFBWWcwQi9oQk1BQ3dBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBDS2hCTUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBREFlMENUaEJNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFEQWUwQ2NoQk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBDaWhCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMENvaEJNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQ3ZoQk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURRZEVDMWhCTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ2dnVUM3aEJNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFBQWFVREVoQk1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQURBaDBETmhCTUFDZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0RYaEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEUWRFRGRoQk1BQ2dBQUFQLy8vLy8vLy8vL0FBQUFBQURBZ2tEbmhCTUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBQVlnMER3aEJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEUWRFRDJoQk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBEOGhCTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQVlnMEFEaFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFBWWcwQUpoUk1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUFvZ1VBUGhSTUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0FiaFJNQUF3QUFBUC8vLy8vLy8vLy9BQUFBQUFEWWhFQWVoUk1BQ0FBQUFQLy8vLy8vLy8vL0FBQUFBQUJnY1VBbWhSTUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBQmdkRUF5aFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEQWUwQTRoUk1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtBL2hSTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0JHaFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQk1oUk1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQURBZTBCVmhSTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBREFlMEJiaFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2NVQmhoUk1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtCb2hSTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEJ1aFJNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEQWUwQjBoUk1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUJRZUVCN2hSTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQmdjVUNCaFJNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrQ0toUk1BQ3dBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtDVmhSTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQWdnMENiaFJNQUJRQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQ2doUk1BQlFBQUFQLy8vLy8vLy8vL0FBQUFBQURBY2tDbGhSTUFDd0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0N3aFJNQUNRQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQzVoUk1BQWdBQUFQLy8vLy8vLy8vL0FBQUFBQUJnY1VDN2hSTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMERCaFJNQURRQUFBUC8vLy8vLy8vLy9BQUFBQUFBWWcwRE9oUk1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBEVmhSTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQndoMERiaFJNQURRQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2dVRG9oUk1BQ0FBQUFQLy8vLy8vLy8vL0FBQUFBQUNBZFVEd2hSTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0QyaFJNQURBQUFBUC8vLy8vLy8vLy9BQUFBQUFBWWcwQUNoaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUNnamtBSWhoTUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBREFlMEFSaGhNQUNnQUFBUC8vLy8vLy8vLy9BQUFBQUFEUWRFQWJoaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQURRZEVBaGhoTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQVlnMEFvaGhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCd2gwQXVoaE1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUFvZ1VBMWhoTUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMEEraGhNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQkpoaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtCUGhoTUFEUUFBQVAvLy8vLy8vLy8vQUFBQUFBQVlnMEJjaGhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEQWUwQmloaE1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBCcGhoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQndoMEJ2aGhNQUNnQUFBUC8vLy8vLy8vLy9BQUFBQUFCZ2dVQjVoaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJnZ1VCL2hoTUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0NMaGhNQURRQUFBUC8vLy8vLy8vLy9BQUFBQUFBQWVVQ1loaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBDZWhoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBRFloRUNraGhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQ3FoaE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJRZkVDd2hoTUFCd0FBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0MzaGhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEUWRFQzloaE1BREFBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtESmhoTUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBQkFmMERQaGhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEWWhFRFZoaE1BREFBQUFQLy8vLy8vLy8vL0FBQUFBQUFZZzBEaGhoTUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0R0aGhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFDUWhrRHpoaE1BQndBQUFQLy8vLy8vLy8vL0FBQUFBQUNRaGtENmhoTUFCUUFBQVAvLy8vLy8vLy8vQUFBQUFBQ1Foa0QvaGhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFEQWUwQUZoeE1BQ2dBQUFQLy8vLy8vLy8vL0FBQUFBQUFZZzBBUGh4TUFCZ0FBQVAvLy8vLy8vLy8vQUFBQUFBRFFkRUFWaHhNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQWNoeE1BREFBQUFQLy8vLy8vLy8vL0FBQUFBQUNnZ1VBb2h4TUFCUUFBQVAvLy8vLy8vLy8vQUFBQUFBRFFkRUF0aHhNQUN3QUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQTRoeE1BQmdBQUFQLy8vLy8vLy8vL0FBQUFBQUJnY1VBK2h4TUFEQUFBQVAvLy8vLy8vLy8vQUFBQUFBQ2dnVUJLaHhNQUNnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQlVoeE1BQ1FBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBCZGh4TUFDUUFBQVAvLy8vLy8vLy8vQUFBQUFBQW9nVUJtaHhNQUNBQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQnVoeE1BREFBQUFQLy8vLy8vLy8vL0FBQUFBQUJBZjBCNmh4TUFBd0FBQVAvLy8vLy8vLy8vQUFBQUFBREFlMEI5aHhNQUJnQUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQ0RoeE1BREFBQUFQLy8vLy8vLy8vL0FBQUFBQURBY2tDUGh4TUFDd0FBQVAvLy8vLy8vLy8vQUFBQUFBQmdjVUNhaHhNQUJ3QUFBUC8vLy8vLy8vLy9BQUFBQUFCQWYwQ2hoeE1BQkFBQUFGUnBiV1Z6TFZKdmJXRnVZVEZoTW1FeU1ESmhNMkUwWVRWaE1URTVZVEV4T0dFeE1UZGhNVEZoTVRKaE1UTmhNVFJoTVRWaE1UWmhNVEExWVRFM1lURTRZVEU1WVRJd1lUSXhZVEl5WVRJellUSTBZVEkxWVRJMllUSTNZVEk0WVRaaE4yRTRZVGxoTVRCaE1qbGhNekJoTXpGaE16SmhNek5oTXpSaE16VmhNelpoTXpkaE16aGhNemxoTkRCaE5ERmhOREpoTkROaE5EUmhORFZoTkRaaE5EZGhORGhoTkRsaE5UQmhOVEZoTlRKaE5UTmhOVFJoTlRWaE5UWmhOVGRoTlRoaE5UbGhOakJoTmpGaE5qSmhOak5oTmpSaE5qVmhOalpoTmpkaE5qaGhOamxoTnpCaE56RmhOekpoTnpOaE56UmhNakF6WVRjMVlUSXdOR0UzTm1FM04yRTNPR0UzT1dFNE1XRTRNbUU0TTJFNE5HRTVOMkU1T0dFNU9XRXhNREJoT0RsaE9UQmhPVE5oT1RSaE9URmhPVEpoTWpBMVlUZzFZVEl3Tm1FNE5tRTROMkU0T0dFNU5XRTVObUV4TURGaE1UQXlZVEV3TTJFeE1EUmhNVEEyWVRFd04yRXhNRGhoTVRFeVlURXhNV0V4TVRCaE1UQTVZVEV5TUdFeE1qRmhNVEl5WVRFeU0yRXhNalJoTVRJMVlURXlObUV4TWpkaE1USTRZVEV5T1dFeE16QmhNVE14WVRFek1tRXhNek5oTVRNMFlURXpOV0V4TXpaaE1UTTNZVEV6T0dFeE16bGhNVFF3WVRFME1XRXhOREpoTVRRellURTBOR0V4TkRWaE1UUTJZVEUwTjJFeE5EaGhNVFE1WVRFMU1HRXhOVEZoTVRVeVlURTFNMkV4TlRSaE1UVTFZVEUxTm1FeE5UZGhNVFU0WVRFMU9XRXhOakJoTVRZeFlURTJNMkV4TmpSaE1UazJZVEUyTldFeE9USmhNVFkyWVRFMk4yRXhOamhoTVRZNVlURTNNR0V4TnpGaE1UY3lZVEUzTTJFeE5qSmhNVGMwWVRFM05XRXhOelpoTVRjM1lURTNPR0V4TnpsaE1Ua3pZVEU0TUdFeE9UbGhNVGd4WVRJd01HRXhPREpoTWpBeFlURTRNMkV4T0RSaE1UazNZVEU0TldFeE9UUmhNVGs0WVRFNE5tRXhPVFZoTVRnM1lURTRPR0V4T0RsaE1Ua3dZVEU1TVFBQUFBQWdBRUd0NE5FQUN3eGdjVUNiZnhNQUJRQUFBQ0VBUWNYZzBRQUxESENPUUdOdEZBQUNBQUFBSWdCQjNlRFJBQXNNQ0k1QVpXMFVBQUlBQUFBakFFSDE0TkVBQ3d4d2prQm5iUlFBQkFBQUFDUUFRWTNoMFFBTERLQ09RR3R0RkFBQ0FBQUFKUUJCcGVIUkFBc01lSVpBYlcwVUFBSUFBQUFtQUVHOTRkRUFDd3lvaUVCdmJSUUFBZ0FBQUNjQVFkWGgwUUFMRExDSVFIRnRGQUFFQUFBQUtBQkI3ZUhSQUFzTXVJaEFkVzBVQUFRQUFBQXBBRUdGNHRFQUN3eVFoVUI1YlJRQUJBQUFBQ29BUVo3aTBRQUxDNDVBZlcwVUFBTUFBQUFyQUVHMTR0RUFDd3hZalVDQWJSUUFBd0FBQUN3QVFjM2kwUUFMRENpQlFJTnRGQUFEQUFBQUxRQkI1ZUxSQUFzTXVJcEFobTBVQUFNQUFBQXVBRUg5NHRFQUN3eDRqRUNKYlJRQUF3QUFBQzhBUVpYajBRQUxEQ2lOUUl4dEZBQURBQUFBTUFCQnJlUFJBQXNNZUl4QWoyMFVBQVFBQUFBeEFFSEY0OUVBQ3d5SWpVQ1RiUlFBQXdBQUFESUFRZDNqMFFBTERIQ09RSlp0RkFBREFBQUFNd0JCOWVQUkFBc01tSWRBbVcwVUFBTUFBQUEwQUVHTjVORUFDd3h3aWtDY2JSUUFBd0FBQURVQVFhWGswUUFMRE5DSFFKOXRGQUFEQUFBQU5nQkJ2ZVRSQUFzTXlJZEFvbTBVQUFNQUFBQTNBRUhWNU5FQUN3ellnVUNsYlJRQUF3QUFBRGdBUWUzazBRQUxEQ2lGUUtodEZBQURBQUFBT1FCQmhlWFJBQXNNMklkQXEyMFVBQU1BQUFBNkFFR2Q1ZEVBQ3d6QWgwQ3ViUlFBQXdBQUFEc0FRYlhsMFFBTERMaUhRTEZ0RkFBREFBQUFQQUJCemVYUkFBc01rSWRBdEcwVUFBTUFBQUE5QUVIbDVkRUFDd3pnZmtDM2JSUUFBZ0FBQUQ0QVFmM2wwUUFMREVDQlFMbHRGQUFDQUFBQVB3QkJsZWJSQUFzTXlJQkF1MjBVQUFJQUFBQkFBRUd0NXRFQUN3d0lna0M5YlJRQUFnQUFBRUVBUWNYbTBRQUxES0NGUUw5dEZBQURBQUFBUWdCQjNlYlJBQXNNa0loQXdtMFVBQU1BQUFCREFFSDE1dEVBQ3d5Z2lFREZiUlFBQXdBQUFFUUFRWTNuMFFBTERLQ0lRTWh0RkFBREFBQUFSUUJCcGVmUkFBc01zSWhBeTIwVUFBTUFBQUJHQUVHOTU5RUFDd3pJaUVET2JSUUFBd0FBQUVjQVFkWG4wUUFMRE5DSVFORnRGQUFEQUFBQVNBQkI3ZWZSQUFzTWdJbEExRzBVQUFNQUFBQkpBRUdGNk5FQUN3eTRpVURYYlJRQUF3QUFBRW9BUVozbzBRQUxES2lJUU5wdEZBQURBQUFBU3dCQnRlalJBQXNNU0lwQTNXMFVBQU1BQUFCTUFFSE42TkVBQ3d5NGlVRGdiUlFBQXdBQUFFMEFRZVhvMFFBTERBaUtRT050RkFBREFBQUFUZ0JCL2VqUkFBc01nSWxBNW0wVUFBTUFBQUJQQUVHVjZkRUFDd3o0aVVEcGJSUUFBd0FBQUZBQVFhM3AwUUFMRE5pTVFPeHRGQUFEQUFBQVVRQkJ4ZW5SQUFzTVFJZEE3MjBVQUFNQUFBQlNBRUhkNmRFQUN3eVloa0R5YlJRQUF3QUFBRk1BUWZYcDBRQUxER2lIUVBWdEZBQURBQUFBVkFCQmplclJBQXNNc0loQStHMFVBQU1BQUFCVkFFR2w2dEVBQ3d6QWlFRDdiUlFBQXdBQUFGWUFRYjNxMFFBTERMaUZRUDV0RkFBREFBQUFWd0JCMWVyUkFBc01RSWhBQVc0VUFBTUFBQUJZQUVIdTZ0RUFDd3VJUUFSdUZBQURBQUFBV1FCQmhldlJBQXNNd0loQUIyNFVBQU1BQUFCYUFFR2Q2OUVBQ3d5NGgwQUtiaFFBQXdBQUFGc0FRYlhyMFFBTERCaUdRQTF1RkFBREFBQUFYQUJCemV2UkFBc01JSVpBRUc0VUFBTUFBQUJkQUVIbDY5RUFDd3hRaFVBVGJoUUFBd0FBQUY0QVFmM3IwUUFMRE9pRlFCWnVGQUFEQUFBQVh3QkJsZXpSQUFzTTBJbEFHVzRVQUFNQUFBQmdBRUd0N05FQUN3eDRpVUFjYmhRQUF3QUFBR0VBUWNYczBRQUxES2lJUUI5dUZBQURBQUFBWWdCQjNlelJBQXNNcUloQUltNFVBQU1BQUFCakFFSDE3TkVBQ3d3WWhrQWxiaFFBQXdBQUFHUUFRWTN0MFFBTERIaUZRQ2h1RkFBREFBQUFaUUJCcGUzUkFBc013SVZBSzI0VUFBTUFBQUJtQUVHOTdkRUFDd3lJaFVBdWJoUUFBd0FBQUdjQVFkWHQwUUFMREpDSVFERnVGQUFEQUFBQWFBQkI3ZTNSQUFzTW1JaEFORzRVQUFNQUFBQnBBRUdGN3RFQUN3eEloa0EzYmhRQUF3QUFBR29BUVozdTBRQUxETGlJUURwdUZBQURBQUFBYXdCQnRlN1JBQXNNaUloQVBXNFVBQU1BQUFCc0FFSE43dEVBQ3d5NGlFQkFiaFFBQXdBQUFHMEFRZVh1MFFBTERFaUxRRU51RkFBREFBQUFiZ0JCL2U3UkFBc015SWRBUm00VUFBTUFBQUJ2QUVHVjc5RUFDd3pRaDBCSmJoUUFBd0FBQUhBQVFhM3YwUUFMRE5DSFFFeHVGQUFFQUFBQWNRQkJ4ZS9SQUFzTXVJZEFVRzRVQUFNQUFBQnlBRUhkNzlFQUN3eTRoMEJUYmhRQUJBQUFBSE1BUWZYdjBRQUxET0NMUUZkdUZBQURBQUFBZEFCQmpmRFJBQXNNNEl0QVdtNFVBQU1BQUFCMUFFR2w4TkVBQ3d5Z2lFQmRiaFFBQXdBQUFIWUFRYjN3MFFBTERJQ0lRR0J1RkFBREFBQUFkd0JCMWZEUkFBc01ZSHRBWTI0VUFBTUFBQUI0QUVIdDhORUFDd3hBWVVCbWJoUUFBd0FBQUhrQVFZWHgwUUFMREZCeFFHbHVGQUFEQUFBQWVnQkJuZkhSQUFzTThIbEFiRzRVQUFNQUFBQjdBRUcxOGRFQUN3eUFlRUJ2YmhRQUF3QUFBSHdBUWMzeDBRQUxESUI0UUhKdUZBQURBQUFBZlFCQjVmSFJBQXNNNElSQWRXNFVBQU1BQUFCK0FFSDk4ZEVBQ3d6Z2hFQjRiaFFBQkFBQUFJQUFRWlh5MFFBTERHQjRRSHh1RkFBREFBQUFnUUJCcmZMUkFBc01ZSGhBZjI0VUFBTUFBQUNDQUVIRjh0RUFDd3pRYzBDQ2JoUUFBd0FBQUlNQVFkM3kwUUFMRE5CelFJVnVGQUFEQUFBQWhBQkI5ZkxSQUFzTVFIRkFpRzRVQUFNQUFBQ0ZBRUdOODlFQUN3eEFjVUNMYmhRQUF3QUFBSVlBUWFYejBRQUxETkIvUUk1dUZBQUVBQUFBaHdCQnZmUFJBQXNNMEg5QWttNFVBQU1BQUFDSUFFSFY4OUVBQ3d5Z2VVQ1ZiaFFBQkFBQUFJa0FRZTN6MFFBTERLQjVRSmx1RkFBREFBQUFpZ0JCaGZUUkFBc01RRzFBbkc0VUFBTUFBQUNMQUVHZDlORUFDd3hBYlVDZmJoUUFBd0FBQUl3QVFiWDAwUUFMRE9CMFFLSnVGQUFEQUFBQWpRQkJ6ZlRSQUFzTTRIUkFwVzRVQUFNQUFBQ2hBRUhsOU5FQUN3emdoa0NvYmhRQUJBQUFBS0lBUWY3MDBRQUxDNEZBckc0VUFBUUFBQUNqQUVHVzlkRUFDd3VCUUxCdUZBQUVBQUFBcEFCQnJmWFJBQXNNY0l4QXRHNFVBQVFBQUFDbEFFSEY5ZEVBQ3d6WWhFQzRiaFFBQkFBQUFLWUFRZDMxMFFBTERNQ0hRTHh1RkFBRUFBQUFwd0JCOWZYUkFBc013SWRBd0c0VUFBUUFBQUNvQUVHTjl0RUFDd3hBaUVERWJoUUFCQUFBQUtrQVFhWDIwUUFMREppQ1FNaHVGQUFFQUFBQXFnQkJ2ZmJSQUFzTXNJVkF6RzRVQUFRQUFBQ3JBRUhWOXRFQUN3eVFnMERRYmhRQUJBQUFBS3dBUWUzMjBRQUxES0NJUU5SdUZBQUVBQUFBclFCQmhmZlJBQXNNb0loQTJHNFVBQVFBQUFDdUFFR2Q5OUVBQ3d5Z2lFRGNiaFFBQkFBQUFLOEFRYlgzMFFBTERLQ0lRT0J1RkFBRUFBQUFzQUJCemZmUkFBc01vSWhBNUc0VUFBUUFBQUN4QUVIbDk5RUFDd3lnaUVEb2JoUUFCQUFBQUxJQVFmMzMwUUFMREtDSVFPeHVGQUFFQUFBQXN3QkJsZmpSQUFzTW9JaEE4RzRVQUFRQUFBQzBBRUd0K05FQUN3eWdpRUQwYmhRQUJBQUFBTFVBUWNYNDBRQUxES0NJUVBodUZBQUVBQUFBdGdCQjNmalJBQXNNb0loQS9HNFVBQVFBQUFDM0FFSDErTkVBQ3d5Z2lFQUFieFFBQkFBQUFMZ0FRWTM1MFFBTERLQ0lRQVJ2RkFBRUFBQUF1UUJCcGZuUkFBc01vSWhBQ0c4VUFBUUFBQUM2QUVHOStkRUFDd3lnaUVBTWJ4UUFCQUFBQUxzQVFkWDUwUUFMREtDSVFCQnZGQUFFQUFBQXZBQkI3Zm5SQUFzTW9JaEFGRzhVQUFRQUFBQzlBRUdGK3RFQUN3eWdpRUFZYnhRQUJBQUFBTDRBUVozNjBRQUxES0NJUUJ4dkZBQUVBQUFBdndCQnRmclJBQXNNb0loQUlHOFVBQVFBQUFEQUFFSE4rdEVBQ3d5Z2lFQWtieFFBQkFBQUFNRUFRZVg2MFFBTERLQ0lRQ2h2RkFBRUFBQUF3Z0JCL2ZyUkFBc01vSWhBTEc4VUFBUUFBQUREQUVHVis5RUFDd3lnaUVBd2J4UUFCQUFBQU1RQVFhMzcwUUFMREtDSVFEUnZGQUFFQUFBQXhRQkJ4ZnZSQUFzTW9JaEFPRzhVQUFRQUFBREdBRUhkKzlFQUN3eWdpRUE4YnhRQUJBQUFBTWNBUWZYNzBRQUxES0NJUUVCdkZBQUVBQUFBeUFCQmpmelJBQXNNb0loQVJHOFVBQVFBQUFESkFFR2wvTkVBQ3d5Z2lFQklieFFBQkFBQUFNb0FRYjM4MFFBTERLQ0lRRXh2RkFBRUFBQUF5d0JCMWZ6UkFBc01vSWhBVUc4VUFBUUFBQURNQUVIdC9ORUFDd3lnaUVCVWJ4UUFCQUFBQU0wQVFZWDkwUUFMREtDSVFGaHZGQUFFQUFBQXpnQkJuZjNSQUFzTW9JaEFYRzhVQUFRQUFBRFBBRUcxL2RFQUN3eWdpRUJnYnhRQUJBQUFBTkFBUWMzOTBRQUxES0NJUUdSdkZBQUVBQUFBMFFCQjVmM1JBQXNNb0loQWFHOFVBQVFBQUFEU0FFSDkvZEVBQ3d5Z2lFQnNieFFBQkFBQUFOTUFRWlgrMFFBTERLQ0lRSEJ2RkFBRUFBQUExQUJCcmY3UkFBc004SXRBZEc4VUFBUUFBQURWQUVIRi90RUFDd3d3aWtCNGJ4UUFCQUFBQU5ZQVFkMyswUUFMRE1DUFFIeHZGQUFFQUFBQTF3QkI5ZjdSQUFzTW9IeEFnRzhVQUFRQUFBRFlBRUdOLzlFQUN3eGdoMENFYnhRQUJBQUFBTmtBUWFYLzBRQUxET0NNUUlodkZBQUVBQUFBMmdCQnZmL1JBQXNNWUlkQWpHOFVBQVFBQUFEYkFFSFYvOUVBQ3d5d2pFQ1FieFFBQkFBQUFOd0FRZTMvMFFBTERQaU1RSlJ2RkFBRUFBQUEzUUJCaG9EU0FBc0xqVUNZYnhRQUJBQUFBTjRBUVo2QTBnQUxDNDFBbkc4VUFBUUFBQURmQUVHMWdOSUFDd3dRaWtDZ2J4UUFCQUFBQU9BQVFjMkEwZ0FMREVpTFFLUnZGQUFFQUFBQTRRQkI1WURTQUFzTTRJbEFxRzhVQUFRQUFBRGlBRUg5Z05JQUN3emdqRUNzYnhRQUJBQUFBT01BUVpXQjBnQUxET0NNUUxCdkZBQUVBQUFBNUFCQnJZSFNBQXNNcUl4QXRHOFVBQVFBQUFEbEFFSEZnZElBQ3d3UWpVQzRieFFBQkFBQUFPWUFRZDJCMGdBTERCaU5RTHh2RkFBRUFBQUE1d0JCOVlIU0FBc004SHhBd0c4VUFBUUFBQURvQUVHTmd0SUFDd3lZaTBERWJ4UUFCQUFBQU9rQVFhV0MwZ0FMRENDS1FNaHZGQUFFQUFBQTZnQkJ2WUxTQUFzTUlJcEF6RzhVQUFRQUFBRHJBRUhWZ3RJQUN3d1lpMERRYnhRQUJBQUFBT3dBUWUyQzBnQUxEQmlMUU5SdkZBQUVBQUFBN1FCQmhZUFNBQXNNd0lWQTJHOFVBQVFBQUFEdUFFR2RnOUlBQ3d6QWhVRGNieFFBQkFBQUFPOEFRYldEMGdBTERGQ0xRT0J2RkFBRUFBQUE4UUJCellQU0FBc01VSXRBNUc4VUFBUUFBQUR5QUVIbGc5SUFDd3pBaDBEb2J4UUFCQUFBQVBNQVFmMkQwZ0FMREpDTlFPeHZGQUFFQUFBQTlBQkJsWVRTQUFzTUdJaEE4RzhVQUFRQUFBRDFBRUd0aE5JQUN3d0lpMEQwYnhRQUJBQUFBUFlBUWNXRTBnQUxEQmlJUVBodkZBQUVBQUFBOXdCQjNZVFNBQXNNd0l0QS9HOFVBQVFBQUFENEFFSDFoTklBQ3d3NGprQUFjQlFBQkFBQUFQa0FRWTJGMGdBTERNQ0xRQVJ3RkFBRUFBQUErZ0JCcFlYU0FBc00rSWxBQ0hBVUFBUUFBQUQ3QUVHOWhkSUFDd3hJaTBBTWNCUUFCQUFBQVB3QVFkV0YwZ0FMRFBpTVFCQndGQUFFQUFBQS9RQkI3WVhTQUFzTVVJNUFGSEFVQUFRQUFBRCtBRUdGaHRJQUMvVTFzSXhBR0hBVUFBUUFBQUJhWVhCbVJHbHVaMkpoZEhNdmFHOXRaUzl5ZFc1dVpYSXZMbU5oY21kdkwzSmxaMmx6ZEhKNUwzTnlZeTlwYm1SbGVDNWpjbUYwWlhNdWFXOHRNVGswT1dObU9HTTJZalZpTlRVM1ppOXdaR1l0WlhoMGNtRmpkQzB3TGprdU1DOXpjbU12YkdsaUxuSnpBQUFjZ3hRQVhnQUFBTXdBQUFBZUFBQUFkM0p2Ym1jZ2RIbHdaUUFBSElNVUFGNEFBQURNQUFBQVJRQUFBRHhpZVhSbElHRnljbUY1UGk5b2IyMWxMM0oxYm01bGNpOHVZMkZ5WjI4dmNtVm5hWE4wY25rdmMzSmpMMmx1WkdWNExtTnlZWFJsY3k1cGJ5MHhPVFE1WTJZNFl6WmlOV0kxTlRkbUwzQndkaTFzYVhSbE9EWXRNQzR5TGpJeEwzTnlZeTluWlc1bGNtbGpMbkp6QUFBQUFBQUFDQUFBQUFRQUFBQlhBUUFBVTJsNlpVVnljbTl5QUFBQXRJTVVBR0lBQUFCREFnQUFOd0FBQUM5b2IyMWxMM0oxYm01bGNpOHVZMkZ5WjI4dmNtVm5hWE4wY25rdmMzSmpMMmx1WkdWNExtTnlZWFJsY3k1cGJ5MHhPVFE1WTJZNFl6WmlOV0kxTlRkbUwzSmhibVF0TUM0NUxqRXZjM0pqTDNKdVozTXZkR2h5WldGa0xuSnpZMjkxYkdRZ2JtOTBJR2x1YVhScFlXeHBlbVVnVkdoeVpXRmtVbTVuT2lBQW80UVVBQ0FBQUFCRWhCUUFYd0FBQUh3QUFBQVJBQUFBQllZVUFFNEFBQUFqQ0FBQUVRQUFBQzl5ZFhOMFl5ODJZakF3WW1Nek9EZ3dNVGs0TmpBd01UTXdaVEZqWmpZeVlqaG1PR0U1TXpRNU5EUTRPR05qTDJ4cFluSmhjbmt2WTI5eVpTOXpjbU12YVhSbGNpOTBjbUZwZEhNdlpYaGhZM1JmYzJsNlpTNXljd0FBN0lRVUFGb0FBQUI2QUFBQUNRQUFBQzlvYjIxbEwzSjFibTVsY2k4dVkyRnlaMjh2Y21WbmFYTjBjbmt2YzNKakwybHVaR1Y0TG1OeVlYUmxjeTVwYnkweE9UUTVZMlk0WXpaaU5XSTFOVGRtTDNKaGJtUmZZMjl5WlMwd0xqa3VNeTl6Y21NdmFXMXdiSE11Y25NQUFGaUZGQUJlQUFBQVlBQUFBQklBQUFCWWhSUUFYZ0FBQUZnQUFBQW9BQUFBS0NsRmJYQjBlVWx1ZG1Gc2FXUkVhV2RwZEZCdmMwOTJaWEptYkc5M1RtVm5UM1psY21ac2IzZGFaWEp2TDNKMWMzUmpMelppTURCaVl6TTRPREF4T1RnMk1EQXhNekJsTVdObU5qSmlPR1k0WVRrek5EazBORGc0WTJNdmJHbGljbUZ5ZVM5amIzSmxMM055WXk5emJHbGpaUzlwZEdWeUxuSnpBQVdHRkFCT0FBQUFnd2NBQUJFQUFBQUFBQUFBQkFBQUFBUUFBQUJZQVFBQUwzSjFjM1F2WkdWd2N5OWtiRzFoYkd4dll5MHdMakl1T0M5emNtTXZaR3h0WVd4c2IyTXVjbk5oYzNObGNuUnBiMjRnWm1GcGJHVmtPaUJ3YzJsNlpTQStQU0J6YVhwbElDc2diV2x1WDI5MlpYSm9aV0ZrQUhTR0ZBQXBBQUFBckFRQUFBa0FBQUJoYzNObGNuUnBiMjRnWm1GcGJHVmtPaUJ3YzJsNlpTQThQU0J6YVhwbElDc2diV0Y0WDI5MlpYSm9aV0ZrQUFCMGhoUUFLUUFBQUxJRUFBQU5BQUFBUVdOalpYTnpSWEp5YjNKallXNXViM1FnWVdOalpYTnpJR0VnVkdoeVpXRmtJRXh2WTJGc0lGTjBiM0poWjJVZ2RtRnNkV1VnWkhWeWFXNW5JRzl5SUdGbWRHVnlJR1JsYzNSeWRXTjBhVzl1T2lBQUo0Y1VBRWdBQUFCWGIzVnNaRUpzYjJOckFBQUJBQUFBQUFBQUFHVnVkR2wwZVNCdWIzUWdabTkxYm1Sd1pYSnRhWE56YVc5dUlHUmxibWxsWkdOdmJtNWxZM1JwYjI0Z2NtVm1kWE5sWkdOdmJtNWxZM1JwYjI0Z2NtVnpaWFJvYjNOMElIVnVjbVZoWTJoaFlteGxibVYwZDI5eWF5QjFibkpsWVdOb1lXSnNaV052Ym01bFkzUnBiMjRnWVdKdmNuUmxaRzV2ZENCamIyNXVaV04wWldSaFpHUnlaWE56SUdsdUlIVnpaV0ZrWkhKbGMzTWdibTkwSUdGMllXbHNZV0pzWlc1bGRIZHZjbXNnWkc5M2JtSnliMnRsYmlCd2FYQmxaVzUwYVhSNUlHRnNjbVZoWkhrZ1pYaHBjM1J6YjNCbGNtRjBhVzl1SUhkdmRXeGtJR0pzYjJOcmJtOTBJR0VnWkdseVpXTjBiM0o1YVhNZ1lTQmthWEpsWTNSdmNubGthWEpsWTNSdmNua2dibTkwSUdWdGNIUjVjbVZoWkMxdmJteDVJR1pwYkdWemVYTjBaVzBnYjNJZ2MzUnZjbUZuWlNCdFpXUnBkVzFtYVd4bGMzbHpkR1Z0SUd4dmIzQWdiM0lnYVc1a2FYSmxZM1JwYjI0Z2JHbHRhWFFnS0dVdVp5NGdjM2x0YkdsdWF5QnNiMjl3S1hOMFlXeGxJRzVsZEhkdmNtc2dabWxzWlNCb1lXNWtiR1ZwYm5aaGJHbGtJR2x1Y0hWMElIQmhjbUZ0WlhSbGNtbHVkbUZzYVdRZ1pHRjBZWFJwYldWa0lHOTFkSGR5YVhSbElIcGxjbTl1YnlCemRHOXlZV2RsSUhOd1lXTmxjMlZsYXlCdmJpQjFibk5sWld0aFlteGxJR1pwYkdWeGRXOTBZU0JsZUdObFpXUmxaR1pwYkdVZ2RHOXZJR3hoY21kbGNtVnpiM1Z5WTJVZ1luVnplV1Y0WldOMWRHRmliR1VnWm1sc1pTQmlkWE41WkdWaFpHeHZZMnRqY205emN5MWtaWFpwWTJVZ2JHbHVheUJ2Y2lCeVpXNWhiV1YwYjI4Z2JXRnVlU0JzYVc1cmMybHVkbUZzYVdRZ1ptbHNaVzVoYldWaGNtZDFiV1Z1ZENCc2FYTjBJSFJ2YnlCc2IyNW5iM0JsY21GMGFXOXVJR2x1ZEdWeWNuVndkR1ZrZFc1emRYQndiM0owWldSMWJtVjRjR1ZqZEdWa0lHVnVaQ0J2WmlCbWFXeGxiM1YwSUc5bUlHMWxiVzl5ZVdsdUlIQnliMmR5WlhOemIzUm9aWElnWlhKeWIzSjFibU5oZEdWbmIzSnBlbVZrSUdWeWNtOXlUM05qYjJSbFMybHVaRVZ5Y205eUlDaHZjeUJsY25KdmNpQXBBUUFBQUFBQUFBQ0lpaFFBQ3dBQUFKT0tGQUFCQUFBQVRtOTBSbTkxYm1SUVpYSnRhWE56YVc5dVJHVnVhV1ZrUTI5dWJtVmpkR2x2YmxKbFpuVnpaV1JEYjI1dVpXTjBhVzl1VW1WelpYUkliM04wVlc1eVpXRmphR0ZpYkdWT1pYUjNiM0pyVlc1eVpXRmphR0ZpYkdWRGIyNXVaV04wYVc5dVFXSnZjblJsWkU1dmRFTnZibTVsWTNSbFpFRmtaSEpKYmxWelpVRmtaSEpPYjNSQmRtRnBiR0ZpYkdWT1pYUjNiM0pyUkc5M2JrSnliMnRsYmxCcGNHVkJiSEpsWVdSNVJYaHBjM1J6VG05MFFVUnBjbVZqZEc5eWVVbHpRVVJwY21WamRHOXllVVJwY21WamRHOXllVTV2ZEVWdGNIUjVVbVZoWkU5dWJIbEdhV3hsYzNsemRHVnRSbWxzWlhONWMzUmxiVXh2YjNCVGRHRnNaVTVsZEhkdmNtdEdhV3hsU0dGdVpHeGxTVzUyWVd4cFpFbHVjSFYwU1c1MllXeHBaRVJoZEdGVWFXMWxaRTkxZEZkeWFYUmxXbVZ5YjFOMGIzSmhaMlZHZFd4c1RtOTBVMlZsYTJGaWJHVlJkVzkwWVVWNFkyVmxaR1ZrUm1sc1pWUnZiMHhoY21kbFVtVnpiM1Z5WTJWQ2RYTjVSWGhsWTNWMFlXSnNaVVpwYkdWQ2RYTjVSR1ZoWkd4dlkydERjbTl6YzJWelJHVjJhV05sYzFSdmIwMWhibmxNYVc1cmMwbHVkbUZzYVdSR2FXeGxibUZ0WlVGeVozVnRaVzUwVEdsemRGUnZiMHh2Ym1kSmJuUmxjbkoxY0hSbFpGVnVjM1Z3Y0c5eWRHVmtWVzVsZUhCbFkzUmxaRVZ2Wms5MWRFOW1UV1Z0YjNKNVNXNVFjbTluY21WemMwOTBhR1Z5Vlc1allYUmxaMjl5YVhwbFpHOXdaWEpoZEdsdmJpQnpkV05qWlhOelpuVnNMMmh2YldVdmNuVnVibVZ5THk1allYSm5ieTl5WldkcGMzUnllUzl6Y21NdmFXNWtaWGd1WTNKaGRHVnpMbWx2TFRFNU5EbGpaamhqTm1JMVlqVTFOMll2ZFc1cFkyOWtaUzF1YjNKdFlXeHBlbUYwYVc5dUxUQXVNUzR5TkM5emNtTXZaR1ZqYjIxd2IzTmxMbkp6QU5TTUZBQnZBQUFBbVFBQUFDSUFBQURVakJRQWJ3QUFBR0FBQUFBcEFBQUExSXdVQUc4QUFBQmdBQUFBR0FBQUFOU01GQUJ2QUFBQVZ3QUFBQlFBQUFCTWtCUUFYZ0FBQU9BREFBQWRBQUFBdkpBVUFGOEFBQUNnQUFBQUdnQUFBQzl5ZFhOMFl5ODJZakF3WW1Nek9EZ3dNVGs0TmpBd01UTXdaVEZqWmpZeVlqaG1PR0U1TXpRNU5EUTRPR05qTDJ4cFluSmhjbmt2WTI5eVpTOXpjbU12YzJ4cFkyVXZjMjl5ZEM5emRHRmliR1V2Y1hWcFkydHpiM0owTG5KekFLU05GQUJmQUFBQVRnQUFBQjhBQUFDa2pSUUFYd0FBQUVnQUFBQVhBQUFBTDNKMWMzUmpMelppTURCaVl6TTRPREF4T1RnMk1EQXhNekJsTVdObU5qSmlPR1k0WVRrek5EazBORGc0WTJNdmJHbGljbUZ5ZVM5amIzSmxMM055WXk5emJHbGpaUzl0YjJRdWNuTUFBQUFramhRQVRRQUFBT3dEQUFBckFBQUFMM0oxYzNSakx6WmlNREJpWXpNNE9EQXhPVGcyTURBeE16QmxNV05tTmpKaU9HWTRZVGt6TkRrME5EZzRZMk12YkdsaWNtRnllUzlqYjNKbEwzTnlZeTl6YkdsalpTOXpiM0owTDNOMFlXSnNaUzlrY21sbWRDNXljd0NFamhRQVd3QUFBUDhBQUFBWkFBQUFoSTRVQUZzQUFBRHlBQUFBRWdBQUFJU09GQUJiQUFBQXpnQUFBQ1FBQUFDRWpoUUFXd0FBQU5FQUFBQWtBQUFBaEk0VUFGc0FBQUJBQUFBQUlnQUFBSEJ5YjJocFltbDBaV1FnWTJoaGNtRmpkR1Z5SUdCZ0FEQ1BGQUFXQUFBQVJvOFVBQUVBQUFCd2NtOW9hV0pwZEdWa0lHSnBaR2x5WldOMGFXOXVZV3dnZEdWNGRBQUFBRmlQRkFBZEFBQUFjM1JoY25SeklIZHBkR2dnWTI5dFltbHVhVzVuSUdOb1lYSmhZM1JsY2dDQWp4UUFId0FBQUdWdGNIUjVJSE4wY21sdVo2aVBGQUFNQUFBQUwyaHZiV1V2Y25WdWJtVnlMeTVqWVhKbmJ5OXlaV2RwYzNSeWVTOXpjbU12YVc1a1pYZ3VZM0poZEdWekxtbHZMVEU1TkRsalpqaGpObUkxWWpVMU4yWXZjM1J5YVc1bmNISmxjQzB3TGpFdU5TOXpjbU12YkdsaUxuSnpBQUFBdkk4VUFGMEFBQUI2QUFBQU13QUFBTHlQRkFCZEFBQUFld0FBQUR3QUFBRElxaFFBU2dBQUFHSURBQUFKQUFBQUwyaHZiV1V2Y25WdWJtVnlMeTVqWVhKbmJ5OXlaV2RwYzNSeWVTOXpjbU12YVc1a1pYZ3VZM0poZEdWekxtbHZMVEU1TkRsalpqaGpObUkxWWpVMU4yWXZkR2x1ZVhabFl5MHhMamt1TUM5emNtTXZkR2x1ZVhabFl5NXljd0FBVEpBVUFGNEFBQURiQXdBQUNRQUFBQzlvYjIxbEwzSjFibTVsY2k4dVkyRnlaMjh2Y21WbmFYTjBjbmt2YzNKakwybHVaR1Y0TG1OeVlYUmxjeTVwYnkweE9UUTVZMlk0WXpaaU5XSTFOVGRtTDNScGJubDJaV010TVM0NUxqQXZjM0pqTDJGeWNtRjVkbVZqTG5KekFMeVFGQUJmQUFBQWpBY0FBQkVBQUFDOGtCUUFYd0FBQUtnQUFBQWlBQUFBSVFJQUFDRUNBQUEwQWdBQVR3SUFBSzRDQUFDdkFnQUE3d0lBQVA4Q0FBQlFBd0FBWHdNQUFIQURBQUJ6QXdBQWRnTUFBSGtEQUFCN0F3QUFmUU1BQUg4REFBQ0RBd0FBaXdNQUFJc0RBQUNOQXdBQWpRTUFBS0lEQUFDaUF3QUF6d01BQU04REFBRDNBd0FBL3dNQUFJY0VBQUNIQkFBQXp3UUFBTThFQUFEMkJBQUE5d1FBQVBvRUFBRC9CQUFBRUFVQUFEQUZBQUJYQlFBQVdBVUFBR0FGQUFCZ0JRQUFpQVVBQUlnRkFBQ0xCUUFBa0FVQUFLSUZBQUNpQlFBQXVnVUFBTG9GQUFERkJRQUF6d1VBQU9zRkFBRHZCUUFBOVFVQUFBc0dBQUFOQmdBQUdnWUFBQndHQUFBZUJnQUFJQVlBQUNBR0FBQTdCZ0FBUHdZQUFGWUdBQUJmQmdBQTdnWUFBTzhHQUFEL0JnQUEvd1lBQUE0SEFBQU9Cd0FBTFFjQUFDOEhBQUJMQndBQWZ3Y0FBTElIQUFBQUNRQUFCQWtBQUFRSkFBQTZDUUFBT3drQUFFNEpBQUJQQ1FBQVZRa0FBRmNKQUFCeENRQUFnQWtBQUlRSkFBQ0VDUUFBalFrQUFJNEpBQUNSQ1FBQWtna0FBS2tKQUFDcENRQUFzUWtBQUxFSkFBQ3pDUUFBdFFrQUFMb0pBQUM3Q1FBQXZRa0FBTDBKQUFERkNRQUF4Z2tBQU1rSkFBREtDUUFBemdrQUFOWUpBQURZQ1FBQTJ3a0FBTjRKQUFEZUNRQUE1QWtBQU9VSkFBRDdDUUFBQVFvQUFBTUtBQUFFQ2dBQUN3b0FBQTRLQUFBUkNnQUFFZ29BQUNrS0FBQXBDZ0FBTVFvQUFERUtBQUEwQ2dBQU5Bb0FBRGNLQUFBM0NnQUFPZ29BQURzS0FBQTlDZ0FBUFFvQUFFTUtBQUJHQ2dBQVNRb0FBRW9LQUFCT0NnQUFXQW9BQUYwS0FBQmRDZ0FBWHdvQUFHVUtBQUIxQ2dBQWdBb0FBSVFLQUFDRUNnQUFqQW9BQUl3S0FBQ09DZ0FBamdvQUFKSUtBQUNTQ2dBQXFRb0FBS2tLQUFDeENnQUFzUW9BQUxRS0FBQzBDZ0FBdWdvQUFMc0tBQURHQ2dBQXhnb0FBTW9LQUFES0NnQUF6Z29BQU04S0FBRFJDZ0FBM3dvQUFPRUtBQURsQ2dBQThBb0FBQUFMQUFBRUN3QUFCQXNBQUEwTEFBQU9Dd0FBRVFzQUFCSUxBQUFwQ3dBQUtRc0FBREVMQUFBeEN3QUFOQXNBQURVTEFBQTZDd0FBT3dzQUFFUUxBQUJHQ3dBQVNRc0FBRW9MQUFCT0N3QUFWUXNBQUZnTEFBQmJDd0FBWGdzQUFGNExBQUJpQ3dBQVpRc0FBSEVMQUFDQkN3QUFoQXNBQUlRTEFBQ0xDd0FBalFzQUFKRUxBQUNSQ3dBQWxnc0FBSmdMQUFDYkN3QUFtd3NBQUowTEFBQ2RDd0FBb0FzQUFLSUxBQUNsQ3dBQXB3c0FBS3NMQUFDdEN3QUF0Z3NBQUxZTEFBQzZDd0FBdlFzQUFNTUxBQURGQ3dBQXlRc0FBTWtMQUFET0N3QUExZ3NBQU5nTEFBRG1Dd0FBOHdzQUFBQU1BQUFFREFBQUJBd0FBQTBNQUFBTkRBQUFFUXdBQUJFTUFBQXBEQUFBS1F3QUFEUU1BQUEwREFBQU9nd0FBRDBNQUFCRkRBQUFSUXdBQUVrTUFBQkpEQUFBVGd3QUFGUU1BQUJYREFBQVh3d0FBR0lNQUFCbERBQUFjQXdBQUlFTUFBQ0VEQUFBaEF3QUFJME1BQUNOREFBQWtRd0FBSkVNQUFDcERBQUFxUXdBQUxRTUFBQzBEQUFBdWd3QUFMME1BQURGREFBQXhRd0FBTWtNQUFESkRBQUF6Z3dBQU5RTUFBRFhEQUFBM1F3QUFOOE1BQURmREFBQTRnd0FBT1VNQUFEd0RBQUFBUTBBQUFRTkFBQUVEUUFBRFEwQUFBME5BQUFSRFFBQUVRMEFBQ2tOQUFBcERRQUFPZzBBQUQwTkFBQkVEUUFBUlEwQUFFa05BQUJKRFFBQVRnMEFBRllOQUFCWURRQUFYdzBBQUdJTkFBQmxEUUFBY0EwQUFJRU5BQUNFRFFBQWhBMEFBSmNOQUFDWkRRQUFzZzBBQUxJTkFBQzhEUUFBdkEwQUFMNE5BQUMvRFFBQXh3MEFBTWtOQUFETERRQUF6ZzBBQU5VTkFBRFZEUUFBMXcwQUFOY05BQURnRFFBQThRMEFBUFVOQUFBQURnQUFPdzRBQUQ0T0FBQmNEZ0FBZ0E0QUFJTU9BQUNERGdBQWhRNEFBSVlPQUFDSkRnQUFpUTRBQUlzT0FBQ01EZ0FBamc0QUFKTU9BQUNZRGdBQW1BNEFBS0FPQUFDZ0RnQUFwQTRBQUtRT0FBQ21EZ0FBcGc0QUFLZ09BQUNwRGdBQXJBNEFBS3dPQUFDNkRnQUF1ZzRBQUw0T0FBQy9EZ0FBeFE0QUFNVU9BQURIRGdBQXh3NEFBTTRPQUFEUERnQUEyZzRBQU5zT0FBRGVEZ0FBL3c0QUFFZ1BBQUJJRHdBQWF3OEFBSEFQQUFDTUR3QUFqdzhBQUpnUEFBQ1lEd0FBdlE4QUFMMFBBQURORHdBQXpnOEFBTkFQQUFEL0R3QUFJaEFBQUNJUUFBQW9FQUFBS0JBQUFDc1FBQUFyRUFBQU14QUFBRFVRQUFBNkVBQUFQeEFBQUZvUUFBQ2ZFQUFBeGhBQUFNOFFBQUQ1RUFBQStoQUFBUHdRQUFEL0VBQUFXaEVBQUY0UkFBQ2pFUUFBcHhFQUFQb1JBQUQvRVFBQUJ4SUFBQWNTQUFCSEVnQUFSeElBQUVrU0FBQkpFZ0FBVGhJQUFFOFNBQUJYRWdBQVZ4SUFBRmtTQUFCWkVnQUFYaElBQUY4U0FBQ0hFZ0FBaHhJQUFJa1NBQUNKRWdBQWpoSUFBSThTQUFDdkVnQUFyeElBQUxFU0FBQ3hFZ0FBdGhJQUFMY1NBQUMvRWdBQXZ4SUFBTUVTQUFEQkVnQUF4aElBQU1jU0FBRFBFZ0FBenhJQUFOY1NBQURYRWdBQTd4SUFBTzhTQUFBUEV3QUFEeE1BQUJFVEFBQVJFd0FBRmhNQUFCY1RBQUFmRXdBQUh4TUFBRWNUQUFCSEV3QUFXeE1BQUdBVEFBQjlFd0FBbnhNQUFQVVRBQUFBRkFBQWR4WUFBSDhXQUFDZEZnQUFueFlBQVBFV0FBRC9GZ0FBRFJjQUFBMFhBQUFWRndBQUh4Y0FBRGNYQUFBL0Z3QUFWQmNBQUY4WEFBQnRGd0FBYlJjQUFIRVhBQUJ4RndBQWRCY0FBSDhYQUFEZEZ3QUEzeGNBQU9vWEFBRC9Gd0FBRHhnQUFBOFlBQUFhR0FBQUh4Z0FBSGdZQUFCL0dBQUFxaGdBQVA4ZEFBQ2NIZ0FBbng0QUFQb2VBQUQvSGdBQUZoOEFBQmNmQUFBZUh3QUFIeDhBQUVZZkFBQkhId0FBVGg4QUFFOGZBQUJZSHdBQVdCOEFBRm9mQUFCYUh3QUFYQjhBQUZ3ZkFBQmVId0FBWGg4QUFINGZBQUIvSHdBQXRSOEFBTFVmQUFERkh3QUF4UjhBQU5RZkFBRFZId0FBM0I4QUFOd2ZBQUR3SHdBQThSOEFBUFVmQUFEMUh3QUEveDhBQVA4ZkFBQlRJQUFBVmlBQUFGZ2dBQUJlSUFBQVpDQUFBR2tnQUFCeUlBQUFjeUFBQUk4Z0FBQ2ZJQUFBc2lBQUFNOGdBQURySUFBQS95QUFBRHNoQUFBOElRQUFUQ0VBQUZJaEFBQ0VJUUFBanlFQUFNOGpBQUQvSXdBQUp5UUFBRDhrQUFCTEpBQUFYeVFBQVA4a0FBRC9KQUFBRkNZQUFCVW1BQUFZSmdBQUdDWUFBSDRtQUFCL0pnQUFpaVlBQUFBbkFBQUZKd0FBQlNjQUFBb25BQUFMSndBQUtDY0FBQ2duQUFCTUp3QUFUQ2NBQUU0bkFBQk9Kd0FBVXljQUFGVW5BQUJYSndBQVZ5Y0FBRjhuQUFCZ0p3QUFsU2NBQUpjbkFBQ3dKd0FBc0NjQUFMOG5BQURQSndBQTdDY0FBTzhuQUFBQUt3QUFmeTRBQUpvdUFBQ2FMZ0FBOUM0QUFQOHVBQURXTHdBQTd5OEFBUHd2QUFEL0x3QUFRREFBQUVBd0FBQ1hNQUFBbURBQUFBQXhBQUFFTVFBQUxURUFBREF4QUFDUE1RQUFqekVBQUxneEFBRHZNUUFBSFRJQUFCOHlBQUJFTWdBQVVESUFBSHd5QUFCK01nQUF6RElBQU04eUFBRC9NZ0FBL3pJQUFIY3pBQUI2TXdBQTNqTUFBTjh6QUFEL013QUEvek1BQUxaTkFBRC9UUUFBcHA4QUFQK2ZBQUNOcEFBQWo2UUFBTWVrQUFEL3F3QUFwTmNBQVAvWEFBQXUrZ0FBTC9vQUFHdjZBQUQvK2dBQUIvc0FBQkw3QUFBWSt3QUFIUHNBQURmN0FBQTMrd0FBUGZzQUFEMzdBQUEvK3dBQVAvc0FBRUw3QUFCQyt3QUFSZnNBQUVYN0FBQ3krd0FBMHZzQUFFRDlBQUJQL1FBQWtQMEFBSkg5QUFESS9RQUF6LzBBQVAzOUFBRC8vUUFBRVA0QUFCLytBQUFrL2dBQUwvNEFBRWYrQUFCSS9nQUFVLzRBQUZQK0FBQm4vZ0FBWi80QUFHeitBQUJ2L2dBQWRmNEFBSFgrQUFEOS9nQUEvdjRBQUFEL0FBQUEvd0FBdi84QUFNSC9BQURJL3dBQXlmOEFBTkQvQUFEUi93QUEyUDhBQU5uL0FBRGQvd0FBMy84QUFPZi9BQURuL3dBQTcvOEFBUGovQUFBQUFBRUEvd0lCQUI4REFRQWZBd0VBSkFNQkFDOERBUUJMQXdFQS93TUJBQ1lFQVFBbkJBRUFUZ1FCQVAvUEFRRDIwQUVBLzlBQkFDZlJBUUFwMFFFQTN0RUJBUC9UQVFCVjFBRUFWZFFCQUozVUFRQ2QxQUVBb05RQkFLSFVBUUNqMUFFQXBOUUJBS2ZVQVFDbzFBRUFyZFFCQUszVUFRQzYxQUVBdXRRQkFMelVBUUM4MUFFQXdkUUJBTUhVQVFERTFBRUF4TlFCQUFiVkFRQUcxUUVBQzlVQkFBelZBUUFWMVFFQUZkVUJBQjNWQVFBZDFRRUFPdFVCQURyVkFRQS8xUUVBUDlVQkFFWFZBUUJGMVFFQVI5VUJBRW5WQVFCUjFRRUFVZFVCQUtUV0FRQ24xZ0VBeXRjQkFNM1hBUUFBMkFFQS9mOEJBTmVtQWdELzl3SUFIdm9DQVAzL0FnQUFBQU1BL2Y4REFBQUFCQUQ5L3dRQUFBQUZBUDMvQlFBQUFBWUEvZjhHQUFBQUJ3RDkvd2NBQUFBSUFQMy9DQUFBQUFrQS9mOEpBQUFBQ2dEOS93b0FBQUFMQVAzL0N3QUFBQXdBL2Y4TUFBQUFEUUQ5L3cwQUFBQU9BQUFBRGdBQ0FBNEFId0FPQUlBQURnRDkvdzRBbGdBQUFBd0FBQUFFQUFBQVdRRUFBRm9CQUFCYUFRQUFmQUFBQUFnQUFBQUVBQUFBV3dFQUFGd0JBQUJjQVFBQXhRQUFBQWdBQUFBRUFBQUFYUUVBQUY0QkFBQmVBUUFBZkFBQUFBZ0FBQUFFQUFBQVh3RUFBR0FCQUFCZ0FRQkJoTHpTQUF0VkFRQUFBT0FBQUFEaEFBQUE0UUFBQUh3QUFBQUlBQUFBQkFBQUFHRUJBQUJpQVFBQVlnRUFBQUFBQUFBRUFBQUFCQUFBQU9ZQUFBRG5BQUFBNXdBQUFId0FBQUFJQUFBQUJBQUFBS2NBQUFDb0FBQUFxQUJCNUx6U0FBdTlBd0VBQUFCakFRQUFaQUVBQUdRQkFBQjhBQUFBQ0FBQUFBUUFBQURvQUFBQTZRQUFBT2tBQUFBQUFBQUFCQUFBQUFRQUFBQ3hBQUFBc2dBQUFMSUFBQUNXQUFBQURBQUFBQVFBQUFCbEFRQUFaZ0VBQUdZQkFBQjhBQUFBQ0FBQUFBUUFBQUFDQVFBQUF3RUFBQU1CQUFCOEFBQUFDQUFBQUFRQUFBRFlBQUFBMlFBQUFOa0FBQUNEQUFBQUVBQUFBQVFBQUFCbkFRQUFhQUVBQUdnQkFBQjhBQUFBQ0FBQUFBUUFBQUJwQVFBQWFnRUFBR29CQUFBQUFBQUFCQUFBQUFRQUFBQ3pBQUFBdEFBQUFMUUFBQUI4QUFBQUNBQUFBQVFBQUFDckFBQUFyQUFBQUt3QUFBQjhBQUFBQ0FBQUFBUUFBQUJyQVFBQWJBRUFBR3dCQUFDREFBQUFFQUFBQUFRQUFBQnRBUUFBYmdFQUFHNEJBQUI4QUFBQUNBQUFBQVFBQUFCdkFRQUFjQUVBQUhBQkFBQUFBQUFBQkFBQUFBUUFBQUM3QUFBQXZBQUFBTHdBQUFCOEFBQUFDQUFBQUFRQUFBQnhBUUFBY2dFQUFISUJBQUFBQUFBQUJBQUFBQVFBQUFDM0FBQUF1QUFBQUxnQUFBQ0RBQUFBRUFBQUFBUUFBQUJ6QVFBQWRBRUFBSFFCQUFCOEFBQUFDQUFBQUFRQUFBQU9BUUFBRHdFQUFBOEJBQUNEQUFBQUVBQUFBQVFBQUFDbEFBQUFwZ0FBQUtZQVFhekEwZ0FMblFRQkFBQUFkUUVBQUhZQkFBQjJBUUFBZ3dBQUFCQUFBQUFFQUFBQWR3RUFBSGdCQUFCNEFRQUFmQUFBQUFnQUFBQUVBQUFBZVFFQUFIb0JBQUI2QVFBQXhRQUFBQWdBQUFBRUFBQUEvZ0FBQVA4QUFBRC9BQUFBZkFBQUFBZ0FBQUFFQUFBQXRRQUFBTFlBQUFDMkFBQUFmQUFBQUFnQUFBQUVBQUFBV3dFQUFGd0JBQUJjQVFBQWZBQUFBQWdBQUFBRUFBQUFxd0FBQUt3QUFBQ3NBQUFBZkFBQUFBZ0FBQUFFQUFBQWdRQUFBSUlBQUFDQ0FBQUFnd0FBQUJBQUFBQUVBQUFBakFBQUFJMEFBQUNOQUFBQWd3QUFBQkFBQUFBRUFBQUFoZ0FBQUljQUFBQ0hBQUFBZkFBQUFBZ0FBQUFFQUFBQWV3RUFBSHdCQUFCOEFRQUFBQUFBQUFRQUFBQUVBQUFBMWdBQUFOY0FBQURYQUFBQWd3QUFBQkFBQUFBRUFBQUFpQUFBQUlrQUFBQ0pBQUFBQUFBQUFBUUFBQUFFQUFBQWtBQUFBSkVBQUFDUkFBQUFBQUFBQUFRQUFBQUVBQUFBQmdFQUFBY0JBQUFIQVFBQWZBQUFBQWdBQUFBRUFBQUE3Z0FBQU84QUFBRHZBQUFBZ3dBQUFCQUFBQUFFQUFBQW1RQUFBSm9BQUFDYUFBQUFnd0FBQUJBQUFBQUVBQUFBakFBQUFJMEFBQUNOQUFBQWZBQUFBQWdBQUFBRUFBQUFxUUFBQUtvQUFBQ3FBQUFBZ3dBQUFCQUFBQUFFQUFBQWlBQUFBSWtBQUFDSkFBQUErQUFBQUF3QUFBQUVBQUFBZlFFQUFINEJBQUIrQVFBQWZBQUFBQWdBQUFBRUFBQUFwd0FBQUtnQUFBQ29BQUFBZ3dBQUFCQUFBQUFFQUFBQWlBQUFBSWtBQUFDSkFFSFV4TklBQyswREFRQUFBSDhBQUFDQUFBQUFnQUFBQUh3QUFBQUlBQUFBQkFBQUFJNEFBQUNQQUFBQWp3QUFBSHdBQUFBSUFBQUFCQUFBQUpRQUFBQ1ZBQUFBbFFBQUFBQUFBQUFFQUFBQUJBQUFBUElBQUFEekFBQUE4d0FBQUh3QUFBQUlBQUFBQkFBQUFJb0FBQUNMQUFBQWl3QUFBUHNBQUFBUUFBQUFCQUFBQUg4QkFBQ0FBUUFBZ0FFQUFId0FBQUFJQUFBQUJBQUFBUEFBQUFEeEFBQUE4UUFBQU1VQUFBQUlBQUFBQkFBQUFNb0FBQURMQUFBQXl3QUFBSHdBQUFBSUFBQUFCQUFBQUlFQkFBQ0NBUUFBZ2dFQUFJTUFBQUFRQUFBQUJBQUFBSWdBQUFDSkFBQUFpUUFBQUlNQUFBQVFBQUFBQkFBQUFJTUJBQUNFQVFBQWhBRUFBQUFBQUFBQkFBQUFBUUFBQU00QUFBRFBBQUFBendBQUFKWUFBQUFNQUFBQUJBQUFBSVVCQUFDR0FRQUFoZ0VBQUh3QUFBQUlBQUFBQkFBQUFJY0JBQUNJQVFBQWlBRUFBSU1BQUFBUUFBQUFCQUFBQUlRQUFBQ0ZBQUFBaFFBQUFId0FBQUFJQUFBQUJBQUFBSWtCQUFDS0FRQUFpZ0VBQUlNQUFBQVFBQUFBQkFBQUFOUUFBQURWQUFBQTFRQUFBSHdBQUFBSUFBQUFCQUFBQUtzQUFBQ3NBQUFBckFBQUFBQUFBQUFFQUFBQUJBQUFBTDhBQUFEQUFBQUF3QUFBQUlNQUFBQVFBQUFBQkFBQUFHMEJBQUJ1QVFBQWJnRUFBSHdBQUFBSUFBQUFCQUFBQUo4QUFBQ2dBQUFBb0FCQnpNalNBQXVWQWdFQUFBQUFBUUFBQVFFQUFBRUJBQUI4QUFBQUNBQUFBQVFBQUFBUUFRQUFFUUVBQUJFQkFBQ0RBQUFBRUFBQUFBUUFBQUNsQUFBQXBnQUFBS1lBQUFDV0FBQUFEQUFBQUFRQUFBQ0xBUUFBakFFQUFJd0JBQUI4QUFBQUNBQUFBQVFBQUFEc0FBQUE3UUFBQU8wQUFBQ0RBQUFBRUFBQUFBUUFBQUNOQVFBQWpnRUFBSTRCQUFDREFBQUFFQUFBQUFRQUFBQ1BBUUFBa0FFQUFKQUJBQUNXQUFBQURBQUFBQVFBQUFDUkFRQUFrZ0VBQUpJQkFBQjhBQUFBQ0FBQUFBUUFBQUNUQVFBQWxBRUFBSlFCQUFDREFBQUFFQUFBQUFRQUFBQ2pBQUFBcEFBQUFLUUFBQURGQUFBQUNBQUFBQVFBQUFDVkFRQUFsZ0VBQUpZQkFBQ0RBQUFBRUFBQUFBUUFBQUNJQUFBQWlRQUFBSWtBUWV6SzBnQUxEUUVBQUFDNUFBQUF1Z0FBQUxvQVFZVEwwZ0FMN3dRQkFBQUFtd0FBQUp3QUFBQ2NBQUFBTDJodmJXVXZjblZ1Ym1WeUx5NWpZWEpuYnk5eVpXZHBjM1J5ZVM5emNtTXZhVzVrWlhndVkzSmhkR1Z6TG1sdkxURTVORGxqWmpoak5tSTFZalUxTjJZdmNHOXRMVEV1TVM0d0wzTnlZeTl3WVhKelpYSXVjbk1BQUFDVXBSUUFXUUFBQUlJQUFBQU1BQUFBWlhod1pXTjBJSEpsY0dWaGRDQmhkQ0JzWldGemRDQWdkR2x0WlhNc0lHWnZkVzVrSUNCMGFXMWxjd0FBcGhRQUZ3QUFBQmVtRkFBT0FBQUFKYVlVQUFZQUFBQkRiMjUyWlhKemFXOXVJR1Z5Y205eU9pQUFBRVNtRkFBU0FBQUFsS1VVQUZrQUFBRG5BQUFBQ3dBQUFKU2xGQUJaQUFBQTZ3QUFBRXNBQUFCelpYRWdJR1Y0Y0dWamREb2dMQ0JtYjNWdVpEb2dBQUNBcGhRQUJBQUFBSVNtRkFBSkFBQUFqYVlVQUFrQUFBQmxlSEJsWTNRNklMQ21GQUFJQUFBQWphWVVBQWtBQUFCcGMxOWhJSEJ5WldScFkyRjBaU0JtWVdsc1pXUWdiMjQ2SUFBQXlLWVVBQm9BQUFCbGVIQmxZM1FnYjI1bElHOW1PaUFBN0tZVUFBOEFBQUNOcGhRQUNRQUFBR1Y0Y0dWamRDQnViMjVsSUc5bU9pQU1weFFBRUFBQUFJMm1GQUFKQUFBQUZBRUFBQlFBQUFBRUFBQUFId0FBQUZCaGNuTmxTVzUwUlhKeWIzSnJhVzVrQUFBQUdLZ1VBR2dBQUFBYUFBQUFTZ0FBQUJpb0ZBQm9BQUFBS3dBQUFFb0FBQUFjQVFBQUZBQUFBQVFBQUFBZkFBQUFZMkZzYkdWa0lHQlNaWE4xYkhRNk9uVnVkM0poY0NncFlDQnZiaUJoYmlCZ1JYSnlZQ0IyWVd4MVpRRElxaFFBU2dBQUFOb0NBQUFhQUFBQVJuSnZiVlYwWmpoRmNuSnZjbUo1ZEdWelpYSnliM0lBR0tnVUFHZ0FBQUIyQUFBQVh3QUFBQUFBQUFELy8vLy8vLy8vLytpbkZBQkJnTkRTQUF1VmxnR1hBUUFBR0FBQUFBUUFBQUNZQVFBQURRb3FKeUpjS0NrdmFHOXRaUzl5ZFc1dVpYSXZMbU5oY21kdkwzSmxaMmx6ZEhKNUwzTnlZeTlwYm1SbGVDNWpjbUYwWlhNdWFXOHRNVGswT1dObU9HTTJZalZpTlRVM1ppOTBlWEJsTVMxbGJtTnZaR2x1Wnkxd1lYSnpaWEl0TUM0eExqQXZjM0pqTDJ4cFlpNXljeGlvRkFCb0FBQUFTZ0FBQUJNQUFBQWdDUW9ORENncFBENWJYWHQ5THlVakt5MHdNVEl6TkRVMk56ZzVJQWtLRFFBTVBEdytQblJ5ZFdWbVlXeHpaUUFBQUFBQURBQUFBQVFBQUFBWEFRQUFHQUVBQUJrQkFBQWFBUUFBbVFFQUFHWmhhV3hsWkNCMGJ5QndZWEp6WlFBWXFCUUFhQUFBQUtrQUFBQWZBQUFBR0tnVUFHZ0FBQUN1QUFBQUZBQUFBR0Z5Y21GNUFBQUFHS2dVQUdnQUFBQ3lBQUFBU3dBQUFHRnljbUY1SUdWNGNHVmpkR1ZrSUdsdWRBQUFHS2dVQUdnQUFBQ3pBQUFBUndBQUFHVjRjR1ZqZEdWa0lHNWhiV1ZGYm1OdlpHbHVad0FBQUJpb0ZBQm9BQUFBdHdBQUFDd0FBQUJ3ZFhSa1pXWUFBQmlvRkFCb0FBQUF1d0FBQUY4QUFBQVlxQlFBYUFBQUFMd0FBQUJnQUFBQUwzSjFjM1JqTHpaaU1EQmlZek00T0RBeE9UZzJNREF4TXpCbE1XTm1OakppT0dZNFlUa3pORGswTkRnNFkyTXZiR2xpY21GeWVTOXpkR1F2YzNKakwzUm9jbVZoWkM5c2IyTmhiQzV5Y3dDY3FSUUFUd0FBQUJrQkFBQVpBQUFBU1c1amIyMXdiR1YwWlUxcGMyMWhkR05vYldWemMyRm5aWEJ2YzJsMGFXOXVRMjl1ZG1WeWMybHZia1Y0Y0dWamRHbHVibVZ5UTNWemRHOXRWWFJtT0VWeWNtOXlkbUZzYVdSZmRYQmZkRzlsY25KdmNsOXNaVzVPYjI1bFUyOXRaUzlvYjIxbEwzSjFibTVsY2k4dVkyRnlaMjh2Y21WbmFYTjBjbmt2YzNKakwybHVaR1Y0TG1OeVlYUmxjeTVwYnkweE9UUTVZMlk0WXpaaU5XSTFOVGRtTDNCdmJTMHhMakV1TUM5emNtTXZhVzV3ZFhRdWNuTUFBQUJkcWhRQVdBQUFBRFVBQUFBTUFBQUFMM0oxYzNSakx6WmlNREJpWXpNNE9EQXhPVGcyTURBeE16QmxNV05tTmpKaU9HWTRZVGt6TkRrME5EZzRZMk12YkdsaWNtRnllUzloYkd4dll5OXpjbU12YzJ4cFkyVXVjbk1BQU1pcUZBQktBQUFBdmdFQUFCMEFBQUFBQUFBQUNBQUFBQU1BQUFBSkFBQUFDUUFBQUJVQUFBQUtBQUFBQ2dBQUFBSUFBQUFMQUFBQUN3QUFBQlVBQUFBTUFBQUFEQUFBQUJZQUFBQU5BQUFBRFFBQUFBSUFBQUFPQUFBQUd3QUFBQU1BQUFBY0FBQUFIZ0FBQUFJQUFBQWZBQUFBSHdBQUFCVUFBQUFnQUFBQUlBQUFBQllBQUFBaEFBQUFJZ0FBQUE0QUFBQWpBQUFBSlFBQUFBY0FBQUFtQUFBQUtnQUFBQTRBQUFBckFBQUFLd0FBQUFZQUFBQXNBQUFBTEFBQUFBUUFBQUF0QUFBQUxRQUFBQVlBQUFBdUFBQUFMd0FBQUFRQUFBQXdBQUFBT1FBQUFBVUFBQUE2QUFBQU9nQUFBQVFBQUFBN0FBQUFRQUFBQUE0QUFBQkJBQUFBV2dBQUFBa0FBQUJiQUFBQVlBQUFBQTRBQUFCaEFBQUFlZ0FBQUFrQUFBQjdBQUFBZmdBQUFBNEFBQUIvQUFBQWhBQUFBQU1BQUFDRkFBQUFoUUFBQUFJQUFBQ0dBQUFBbndBQUFBTUFBQUNnQUFBQW9BQUFBQVFBQUFDaEFBQUFvUUFBQUE0QUFBQ2lBQUFBcFFBQUFBY0FBQUNtQUFBQXFRQUFBQTRBQUFDcUFBQUFxZ0FBQUFrQUFBQ3JBQUFBckFBQUFBNEFBQUN0QUFBQXJRQUFBQU1BQUFDdUFBQUFyd0FBQUE0QUFBQ3dBQUFBc1FBQUFBY0FBQUN5QUFBQXN3QUFBQVVBQUFDMEFBQUF0QUFBQUE0QUFBQzFBQUFBdFFBQUFBa0FBQUMyQUFBQXVBQUFBQTRBQUFDNUFBQUF1UUFBQUFVQUFBQzZBQUFBdWdBQUFBa0FBQUM3QUFBQXZ3QUFBQTRBQUFEQUFBQUExZ0FBQUFrQUFBRFhBQUFBMXdBQUFBNEFBQURZQUFBQTlnQUFBQWtBQUFEM0FBQUE5d0FBQUE0QUFBRDRBQUFBdUFJQUFBa0FBQUM1QWdBQXVnSUFBQTRBQUFDN0FnQUF3UUlBQUFrQUFBRENBZ0FBendJQUFBNEFBQURRQWdBQTBRSUFBQWtBQUFEU0FnQUEzd0lBQUE0QUFBRGdBZ0FBNUFJQUFBa0FBQURsQWdBQTdRSUFBQTRBQUFEdUFnQUE3Z0lBQUFrQUFBRHZBZ0FBL3dJQUFBNEFBQUFBQXdBQWJ3TUFBQTBBQUFCd0F3QUFjd01BQUFrQUFBQjBBd0FBZFFNQUFBNEFBQUIyQXdBQWR3TUFBQWtBQUFCNkF3QUFmUU1BQUFrQUFBQitBd0FBZmdNQUFBNEFBQUIvQXdBQWZ3TUFBQWtBQUFDRUF3QUFoUU1BQUE0QUFBQ0dBd0FBaGdNQUFBa0FBQUNIQXdBQWh3TUFBQTRBQUFDSUF3QUFpZ01BQUFrQUFBQ01Bd0FBakFNQUFBa0FBQUNPQXdBQW9RTUFBQWtBQUFDakF3QUE5UU1BQUFrQUFBRDJBd0FBOWdNQUFBNEFBQUQzQXdBQWdnUUFBQWtBQUFDREJBQUFpUVFBQUEwQUFBQ0tCQUFBTHdVQUFBa0FBQUF4QlFBQVZnVUFBQWtBQUFCWkJRQUFpUVVBQUFrQUFBQ0tCUUFBaWdVQUFBNEFBQUNOQlFBQWpnVUFBQTRBQUFDUEJRQUFqd1VBQUFjQUFBQ1FCUUFBa0FVQUFCRUFBQUNSQlFBQXZRVUFBQTBBQUFDK0JRQUF2Z1VBQUJFQUFBQy9CUUFBdndVQUFBMEFBQURBQlFBQXdBVUFBQkVBQUFEQkJRQUF3Z1VBQUEwQUFBRERCUUFBd3dVQUFCRUFBQURFQlFBQXhRVUFBQTBBQUFER0JRQUF4Z1VBQUJFQUFBREhCUUFBeHdVQUFBMEFBQURJQlFBQS93VUFBQkVBQUFBQUJnQUFCUVlBQUFFQUFBQUdCZ0FBQndZQUFBNEFBQUFJQmdBQUNBWUFBQUFBQUFBSkJnQUFDZ1lBQUFjQUFBQUxCZ0FBQ3dZQUFBQUFBQUFNQmdBQURBWUFBQVFBQUFBTkJnQUFEUVlBQUFBQUFBQU9CZ0FBRHdZQUFBNEFBQUFRQmdBQUdnWUFBQTBBQUFBYkJnQUFTZ1lBQUFBQUFBQkxCZ0FBWHdZQUFBMEFBQUJnQmdBQWFRWUFBQUVBQUFCcUJnQUFhZ1lBQUFjQUFBQnJCZ0FBYkFZQUFBRUFBQUJ0QmdBQWJ3WUFBQUFBQUFCd0JnQUFjQVlBQUEwQUFBQnhCZ0FBMVFZQUFBQUFBQURXQmdBQTNBWUFBQTBBQUFEZEJnQUEzUVlBQUFFQUFBRGVCZ0FBM2dZQUFBNEFBQURmQmdBQTVBWUFBQTBBQUFEbEJnQUE1Z1lBQUFBQUFBRG5CZ0FBNkFZQUFBMEFBQURwQmdBQTZRWUFBQTRBQUFEcUJnQUE3UVlBQUEwQUFBRHVCZ0FBN3dZQUFBQUFBQUR3QmdBQStRWUFBQVVBQUFENkJnQUFFQWNBQUFBQUFBQVJCd0FBRVFjQUFBMEFBQUFTQndBQUx3Y0FBQUFBQUFBd0J3QUFTZ2NBQUEwQUFBQkxCd0FBcFFjQUFBQUFBQUNtQndBQXNBY0FBQTBBQUFDeEJ3QUF2d2NBQUFBQUFBREFCd0FBNmdjQUFCRUFBQURyQndBQTh3Y0FBQTBBQUFEMEJ3QUE5UWNBQUJFQUFBRDJCd0FBK1FjQUFBNEFBQUQ2QndBQS9BY0FBQkVBQUFEOUJ3QUEvUWNBQUEwQUFBRCtCd0FBRlFnQUFCRUFBQUFXQ0FBQUdRZ0FBQTBBQUFBYUNBQUFHZ2dBQUJFQUFBQWJDQUFBSXdnQUFBMEFBQUFrQ0FBQUpBZ0FBQkVBQUFBbENBQUFKd2dBQUEwQUFBQW9DQUFBS0FnQUFCRUFBQUFwQ0FBQUxRZ0FBQTBBQUFBdUNBQUFXQWdBQUJFQUFBQlpDQUFBV3dnQUFBMEFBQUJjQ0FBQVh3Z0FBQkVBQUFCZ0NBQUFhZ2dBQUFBQUFBQnJDQUFBYndnQUFCRUFBQUJ3Q0FBQWpnZ0FBQUFBQUFDUENBQUFqd2dBQUJFQUFBQ1FDQUFBa1FnQUFBRUFBQUNTQ0FBQWxnZ0FBQkVBQUFDWENBQUFud2dBQUEwQUFBQ2dDQUFBeVFnQUFBQUFBQURLQ0FBQTRRZ0FBQTBBQUFEaUNBQUE0Z2dBQUFFQUFBRGpDQUFBQWdrQUFBMEFBQUFEQ1FBQU9Ra0FBQWtBQUFBNkNRQUFPZ2tBQUEwQUFBQTdDUUFBT3drQUFBa0FBQUE4Q1FBQVBBa0FBQTBBQUFBOUNRQUFRQWtBQUFrQUFBQkJDUUFBU0FrQUFBMEFBQUJKQ1FBQVRBa0FBQWtBQUFCTkNRQUFUUWtBQUEwQUFBQk9DUUFBVUFrQUFBa0FBQUJSQ1FBQVZ3a0FBQTBBQUFCWUNRQUFZUWtBQUFrQUFBQmlDUUFBWXdrQUFBMEFBQUJrQ1FBQWdBa0FBQWtBQUFDQkNRQUFnUWtBQUEwQUFBQ0NDUUFBZ3drQUFBa0FBQUNGQ1FBQWpBa0FBQWtBQUFDUENRQUFrQWtBQUFrQUFBQ1RDUUFBcUFrQUFBa0FBQUNxQ1FBQXNBa0FBQWtBQUFDeUNRQUFzZ2tBQUFrQUFBQzJDUUFBdVFrQUFBa0FBQUM4Q1FBQXZBa0FBQTBBQUFDOUNRQUF3QWtBQUFrQUFBREJDUUFBeEFrQUFBMEFBQURIQ1FBQXlBa0FBQWtBQUFETENRQUF6QWtBQUFrQUFBRE5DUUFBelFrQUFBMEFBQURPQ1FBQXpna0FBQWtBQUFEWENRQUExd2tBQUFrQUFBRGNDUUFBM1FrQUFBa0FBQURmQ1FBQTRRa0FBQWtBQUFEaUNRQUE0d2tBQUEwQUFBRG1DUUFBOFFrQUFBa0FBQUR5Q1FBQTh3a0FBQWNBQUFEMENRQUErZ2tBQUFrQUFBRDdDUUFBK3drQUFBY0FBQUQ4Q1FBQS9Ra0FBQWtBQUFEK0NRQUEvZ2tBQUEwQUFBQUJDZ0FBQWdvQUFBMEFBQUFEQ2dBQUF3b0FBQWtBQUFBRkNnQUFDZ29BQUFrQUFBQVBDZ0FBRUFvQUFBa0FBQUFUQ2dBQUtBb0FBQWtBQUFBcUNnQUFNQW9BQUFrQUFBQXlDZ0FBTXdvQUFBa0FBQUExQ2dBQU5nb0FBQWtBQUFBNENnQUFPUW9BQUFrQUFBQThDZ0FBUEFvQUFBMEFBQUErQ2dBQVFBb0FBQWtBQUFCQkNnQUFRZ29BQUEwQUFBQkhDZ0FBU0FvQUFBMEFBQUJMQ2dBQVRRb0FBQTBBQUFCUkNnQUFVUW9BQUEwQUFBQlpDZ0FBWEFvQUFBa0FBQUJlQ2dBQVhnb0FBQWtBQUFCbUNnQUFid29BQUFrQUFBQndDZ0FBY1FvQUFBMEFBQUJ5Q2dBQWRBb0FBQWtBQUFCMUNnQUFkUW9BQUEwQUFBQjJDZ0FBZGdvQUFBa0FBQUNCQ2dBQWdnb0FBQTBBQUFDRENnQUFnd29BQUFrQUFBQ0ZDZ0FBalFvQUFBa0FBQUNQQ2dBQWtRb0FBQWtBQUFDVENnQUFxQW9BQUFrQUFBQ3FDZ0FBc0FvQUFBa0FBQUN5Q2dBQXN3b0FBQWtBQUFDMUNnQUF1UW9BQUFrQUFBQzhDZ0FBdkFvQUFBMEFBQUM5Q2dBQXdBb0FBQWtBQUFEQkNnQUF4UW9BQUEwQUFBREhDZ0FBeUFvQUFBMEFBQURKQ2dBQXlRb0FBQWtBQUFETENnQUF6QW9BQUFrQUFBRE5DZ0FBelFvQUFBMEFBQURRQ2dBQTBBb0FBQWtBQUFEZ0NnQUE0UW9BQUFrQUFBRGlDZ0FBNHdvQUFBMEFBQURtQ2dBQThBb0FBQWtBQUFEeENnQUE4UW9BQUFjQUFBRDVDZ0FBK1FvQUFBa0FBQUQ2Q2dBQS93b0FBQTBBQUFBQkN3QUFBUXNBQUEwQUFBQUNDd0FBQXdzQUFBa0FBQUFGQ3dBQURBc0FBQWtBQUFBUEN3QUFFQXNBQUFrQUFBQVRDd0FBS0FzQUFBa0FBQUFxQ3dBQU1Bc0FBQWtBQUFBeUN3QUFNd3NBQUFrQUFBQTFDd0FBT1FzQUFBa0FBQUE4Q3dBQVBBc0FBQTBBQUFBOUN3QUFQZ3NBQUFrQUFBQS9Dd0FBUHdzQUFBMEFBQUJBQ3dBQVFBc0FBQWtBQUFCQkN3QUFSQXNBQUEwQUFBQkhDd0FBU0FzQUFBa0FBQUJMQ3dBQVRBc0FBQWtBQUFCTkN3QUFUUXNBQUEwQUFBQlZDd0FBVmdzQUFBMEFBQUJYQ3dBQVZ3c0FBQWtBQUFCY0N3QUFYUXNBQUFrQUFBQmZDd0FBWVFzQUFBa0FBQUJpQ3dBQVl3c0FBQTBBQUFCbUN3QUFkd3NBQUFrQUFBQ0NDd0FBZ2dzQUFBMEFBQUNEQ3dBQWd3c0FBQWtBQUFDRkN3QUFpZ3NBQUFrQUFBQ09Dd0FBa0FzQUFBa0FBQUNTQ3dBQWxRc0FBQWtBQUFDWkN3QUFtZ3NBQUFrQUFBQ2NDd0FBbkFzQUFBa0FBQUNlQ3dBQW53c0FBQWtBQUFDakN3QUFwQXNBQUFrQUFBQ29Dd0FBcWdzQUFBa0FBQUN1Q3dBQXVRc0FBQWtBQUFDK0N3QUF2d3NBQUFrQUFBREFDd0FBd0FzQUFBMEFBQURCQ3dBQXdnc0FBQWtBQUFER0N3QUF5QXNBQUFrQUFBREtDd0FBekFzQUFBa0FBQUROQ3dBQXpRc0FBQTBBQUFEUUN3QUEwQXNBQUFrQUFBRFhDd0FBMXdzQUFBa0FBQURtQ3dBQThnc0FBQWtBQUFEekN3QUErQXNBQUE0QUFBRDVDd0FBK1FzQUFBY0FBQUQ2Q3dBQStnc0FBQTRBQUFBQURBQUFBQXdBQUEwQUFBQUJEQUFBQXd3QUFBa0FBQUFFREFBQUJBd0FBQTBBQUFBRkRBQUFEQXdBQUFrQUFBQU9EQUFBRUF3QUFBa0FBQUFTREFBQUtBd0FBQWtBQUFBcURBQUFPUXdBQUFrQUFBQThEQUFBUEF3QUFBMEFBQUE5REFBQVBRd0FBQWtBQUFBK0RBQUFRQXdBQUEwQUFBQkJEQUFBUkF3QUFBa0FBQUJHREFBQVNBd0FBQTBBQUFCS0RBQUFUUXdBQUEwQUFBQlZEQUFBVmd3QUFBMEFBQUJZREFBQVdnd0FBQWtBQUFCZERBQUFYUXdBQUFrQUFBQmdEQUFBWVF3QUFBa0FBQUJpREFBQVl3d0FBQTBBQUFCbURBQUFid3dBQUFrQUFBQjNEQUFBZHd3QUFBa0FBQUI0REFBQWZnd0FBQTRBQUFCL0RBQUFnQXdBQUFrQUFBQ0JEQUFBZ1F3QUFBMEFBQUNDREFBQWpBd0FBQWtBQUFDT0RBQUFrQXdBQUFrQUFBQ1NEQUFBcUF3QUFBa0FBQUNxREFBQXN3d0FBQWtBQUFDMURBQUF1UXdBQUFrQUFBQzhEQUFBdkF3QUFBMEFBQUM5REFBQXhBd0FBQWtBQUFER0RBQUF5QXdBQUFrQUFBREtEQUFBeXd3QUFBa0FBQURNREFBQXpRd0FBQTBBQUFEVkRBQUExZ3dBQUFrQUFBRGREQUFBM2d3QUFBa0FBQURnREFBQTRRd0FBQWtBQUFEaURBQUE0d3dBQUEwQUFBRG1EQUFBN3d3QUFBa0FBQUR4REFBQTh3d0FBQWtBQUFBQURRQUFBUTBBQUEwQUFBQUNEUUFBREEwQUFBa0FBQUFPRFFBQUVBMEFBQWtBQUFBU0RRQUFPZzBBQUFrQUFBQTdEUUFBUEEwQUFBMEFBQUE5RFFBQVFBMEFBQWtBQUFCQkRRQUFSQTBBQUEwQUFBQkdEUUFBU0EwQUFBa0FBQUJLRFFBQVRBMEFBQWtBQUFCTkRRQUFUUTBBQUEwQUFBQk9EUUFBVHcwQUFBa0FBQUJVRFFBQVlRMEFBQWtBQUFCaURRQUFZdzBBQUEwQUFBQm1EUUFBZncwQUFBa0FBQUNCRFFBQWdRMEFBQTBBQUFDQ0RRQUFndzBBQUFrQUFBQ0ZEUUFBbGcwQUFBa0FBQUNhRFFBQXNRMEFBQWtBQUFDekRRQUF1dzBBQUFrQUFBQzlEUUFBdlEwQUFBa0FBQURBRFFBQXhnMEFBQWtBQUFES0RRQUF5ZzBBQUEwQUFBRFBEUUFBMFEwQUFBa0FBQURTRFFBQTFBMEFBQTBBQUFEV0RRQUExZzBBQUEwQUFBRFlEUUFBM3cwQUFBa0FBQURtRFFBQTd3MEFBQWtBQUFEeURRQUE5QTBBQUFrQUFBQUJEZ0FBTUE0QUFBa0FBQUF4RGdBQU1RNEFBQTBBQUFBeURnQUFNdzRBQUFrQUFBQTBEZ0FBT2c0QUFBMEFBQUEvRGdBQVB3NEFBQWNBQUFCQURnQUFSZzRBQUFrQUFBQkhEZ0FBVGc0QUFBMEFBQUJQRGdBQVd3NEFBQWtBQUFDQkRnQUFnZzRBQUFrQUFBQ0VEZ0FBaEE0QUFBa0FBQUNHRGdBQWlnNEFBQWtBQUFDTURnQUFvdzRBQUFrQUFBQ2xEZ0FBcFE0QUFBa0FBQUNuRGdBQXNBNEFBQWtBQUFDeERnQUFzUTRBQUEwQUFBQ3lEZ0FBc3c0QUFBa0FBQUMwRGdBQXZBNEFBQTBBQUFDOURnQUF2UTRBQUFrQUFBREFEZ0FBeEE0QUFBa0FBQURHRGdBQXhnNEFBQWtBQUFESURnQUF6ZzRBQUEwQUFBRFFEZ0FBMlE0QUFBa0FBQURjRGdBQTN3NEFBQWtBQUFBQUR3QUFGdzhBQUFrQUFBQVlEd0FBR1E4QUFBMEFBQUFhRHdBQU5BOEFBQWtBQUFBMUR3QUFOUThBQUEwQUFBQTJEd0FBTmc4QUFBa0FBQUEzRHdBQU53OEFBQTBBQUFBNER3QUFPQThBQUFrQUFBQTVEd0FBT1E4QUFBMEFBQUE2RHdBQVBROEFBQTRBQUFBK0R3QUFSdzhBQUFrQUFBQkpEd0FBYkE4QUFBa0FBQUJ4RHdBQWZnOEFBQTBBQUFCL0R3QUFmdzhBQUFrQUFBQ0FEd0FBaEE4QUFBMEFBQUNGRHdBQWhROEFBQWtBQUFDR0R3QUFodzhBQUEwQUFBQ0lEd0FBakE4QUFBa0FBQUNORHdBQWx3OEFBQTBBQUFDWkR3QUF2QThBQUEwQUFBQytEd0FBeFE4QUFBa0FBQURHRHdBQXhnOEFBQTBBQUFESER3QUF6QThBQUFrQUFBRE9Ed0FBMmc4QUFBa0FBQUFBRUFBQUxCQUFBQWtBQUFBdEVBQUFNQkFBQUEwQUFBQXhFQUFBTVJBQUFBa0FBQUF5RUFBQU54QUFBQTBBQUFBNEVBQUFPQkFBQUFrQUFBQTVFQUFBT2hBQUFBMEFBQUE3RUFBQVBCQUFBQWtBQUFBOUVBQUFQaEFBQUEwQUFBQS9FQUFBVnhBQUFBa0FBQUJZRUFBQVdSQUFBQTBBQUFCYUVBQUFYUkFBQUFrQUFBQmVFQUFBWUJBQUFBMEFBQUJoRUFBQWNCQUFBQWtBQUFCeEVBQUFkQkFBQUEwQUFBQjFFQUFBZ1JBQUFBa0FBQUNDRUFBQWdoQUFBQTBBQUFDREVBQUFoQkFBQUFrQUFBQ0ZFQUFBaGhBQUFBMEFBQUNIRUFBQWpCQUFBQWtBQUFDTkVBQUFqUkFBQUEwQUFBQ09FQUFBbkJBQUFBa0FBQUNkRUFBQW5SQUFBQTBBQUFDZUVBQUF4UkFBQUFrQUFBREhFQUFBeHhBQUFBa0FBQURORUFBQXpSQUFBQWtBQUFEUUVBQUFTQklBQUFrQUFBQktFZ0FBVFJJQUFBa0FBQUJRRWdBQVZoSUFBQWtBQUFCWUVnQUFXQklBQUFrQUFBQmFFZ0FBWFJJQUFBa0FBQUJnRWdBQWlCSUFBQWtBQUFDS0VnQUFqUklBQUFrQUFBQ1FFZ0FBc0JJQUFBa0FBQUN5RWdBQXRSSUFBQWtBQUFDNEVnQUF2aElBQUFrQUFBREFFZ0FBd0JJQUFBa0FBQURDRWdBQXhSSUFBQWtBQUFESUVnQUExaElBQUFrQUFBRFlFZ0FBRUJNQUFBa0FBQUFTRXdBQUZSTUFBQWtBQUFBWUV3QUFXaE1BQUFrQUFBQmRFd0FBWHhNQUFBMEFBQUJnRXdBQWZCTUFBQWtBQUFDQUV3QUFqeE1BQUFrQUFBQ1FFd0FBbVJNQUFBNEFBQUNnRXdBQTlSTUFBQWtBQUFENEV3QUEvUk1BQUFrQUFBQUFGQUFBQUJRQUFBNEFBQUFCRkFBQWZ4WUFBQWtBQUFDQUZnQUFnQllBQUJZQUFBQ0JGZ0FBbWhZQUFBa0FBQUNiRmdBQW5CWUFBQTRBQUFDZ0ZnQUErQllBQUFrQUFBQUFGd0FBRVJjQUFBa0FBQUFTRndBQUZCY0FBQTBBQUFBVkZ3QUFGUmNBQUFrQUFBQWZGd0FBTVJjQUFBa0FBQUF5RndBQU14Y0FBQTBBQUFBMEZ3QUFOaGNBQUFrQUFBQkFGd0FBVVJjQUFBa0FBQUJTRndBQVV4Y0FBQTBBQUFCZ0Z3QUFiQmNBQUFrQUFBQnVGd0FBY0JjQUFBa0FBQUJ5RndBQWN4Y0FBQTBBQUFDQUZ3QUFzeGNBQUFrQUFBQzBGd0FBdFJjQUFBMEFBQUMyRndBQXRoY0FBQWtBQUFDM0Z3QUF2UmNBQUEwQUFBQytGd0FBeFJjQUFBa0FBQURHRndBQXhoY0FBQTBBQUFESEZ3QUF5QmNBQUFrQUFBREpGd0FBMHhjQUFBMEFBQURVRndBQTJoY0FBQWtBQUFEYkZ3QUEyeGNBQUFjQUFBRGNGd0FBM0JjQUFBa0FBQURkRndBQTNSY0FBQTBBQUFEZ0Z3QUE2UmNBQUFrQUFBRHdGd0FBK1JjQUFBNEFBQUFBR0FBQUNoZ0FBQTRBQUFBTEdBQUFEUmdBQUEwQUFBQU9HQUFBRGhnQUFBTUFBQUFQR0FBQUR4Z0FBQTBBQUFBUUdBQUFHUmdBQUFrQUFBQWdHQUFBZUJnQUFBa0FBQUNBR0FBQWhCZ0FBQWtBQUFDRkdBQUFoaGdBQUEwQUFBQ0hHQUFBcUJnQUFBa0FBQUNwR0FBQXFSZ0FBQTBBQUFDcUdBQUFxaGdBQUFrQUFBQ3dHQUFBOVJnQUFBa0FBQUFBR1FBQUhoa0FBQWtBQUFBZ0dRQUFJaGtBQUEwQUFBQWpHUUFBSmhrQUFBa0FBQUFuR1FBQUtCa0FBQTBBQUFBcEdRQUFLeGtBQUFrQUFBQXdHUUFBTVJrQUFBa0FBQUF5R1FBQU1oa0FBQTBBQUFBekdRQUFPQmtBQUFrQUFBQTVHUUFBT3hrQUFBMEFBQUJBR1FBQVFCa0FBQTRBQUFCRUdRQUFSUmtBQUE0QUFBQkdHUUFBYlJrQUFBa0FBQUJ3R1FBQWRCa0FBQWtBQUFDQUdRQUFxeGtBQUFrQUFBQ3dHUUFBeVJrQUFBa0FBQURRR1FBQTJoa0FBQWtBQUFEZUdRQUEveGtBQUE0QUFBQUFHZ0FBRmhvQUFBa0FBQUFYR2dBQUdCb0FBQTBBQUFBWkdnQUFHaG9BQUFrQUFBQWJHZ0FBR3hvQUFBMEFBQUFlR2dBQVZSb0FBQWtBQUFCV0dnQUFWaG9BQUEwQUFBQlhHZ0FBVnhvQUFBa0FBQUJZR2dBQVhob0FBQTBBQUFCZ0dnQUFZQm9BQUEwQUFBQmhHZ0FBWVJvQUFBa0FBQUJpR2dBQVlob0FBQTBBQUFCakdnQUFaQm9BQUFrQUFBQmxHZ0FBYkJvQUFBMEFBQUJ0R2dBQWNob0FBQWtBQUFCekdnQUFmQm9BQUEwQUFBQi9HZ0FBZnhvQUFBMEFBQUNBR2dBQWlSb0FBQWtBQUFDUUdnQUFtUm9BQUFrQUFBQ2dHZ0FBclJvQUFBa0FBQUN3R2dBQXpob0FBQTBBQUFBQUd3QUFBeHNBQUEwQUFBQUVHd0FBTXhzQUFBa0FBQUEwR3dBQU5Cc0FBQTBBQUFBMUd3QUFOUnNBQUFrQUFBQTJHd0FBT2hzQUFBMEFBQUE3R3dBQU94c0FBQWtBQUFBOEd3QUFQQnNBQUEwQUFBQTlHd0FBUVJzQUFBa0FBQUJDR3dBQVFoc0FBQTBBQUFCREd3QUFUQnNBQUFrQUFBQk9Hd0FBYWhzQUFBa0FBQUJyR3dBQWN4c0FBQTBBQUFCMEd3QUFmeHNBQUFrQUFBQ0FHd0FBZ1JzQUFBMEFBQUNDR3dBQW9Sc0FBQWtBQUFDaUd3QUFwUnNBQUEwQUFBQ21Hd0FBcHhzQUFBa0FBQUNvR3dBQXFSc0FBQTBBQUFDcUd3QUFxaHNBQUFrQUFBQ3JHd0FBclJzQUFBMEFBQUN1R3dBQTVSc0FBQWtBQUFEbUd3QUE1aHNBQUEwQUFBRG5Hd0FBNXhzQUFBa0FBQURvR3dBQTZSc0FBQTBBQUFEcUd3QUE3QnNBQUFrQUFBRHRHd0FBN1JzQUFBMEFBQUR1R3dBQTdoc0FBQWtBQUFEdkd3QUE4UnNBQUEwQUFBRHlHd0FBOHhzQUFBa0FBQUQ4R3dBQUt4d0FBQWtBQUFBc0hBQUFNeHdBQUEwQUFBQTBIQUFBTlJ3QUFBa0FBQUEySEFBQU54d0FBQTBBQUFBN0hBQUFTUndBQUFrQUFBQk5IQUFBaWh3QUFBa0FBQUNRSEFBQXVod0FBQWtBQUFDOUhBQUF4eHdBQUFrQUFBRFFIQUFBMGh3QUFBMEFBQURUSEFBQTB4d0FBQWtBQUFEVUhBQUE0QndBQUEwQUFBRGhIQUFBNFJ3QUFBa0FBQURpSEFBQTZCd0FBQTBBQUFEcEhBQUE3QndBQUFrQUFBRHRIQUFBN1J3QUFBMEFBQUR1SEFBQTh4d0FBQWtBQUFEMEhBQUE5QndBQUEwQUFBRDFIQUFBOXh3QUFBa0FBQUQ0SEFBQStSd0FBQTBBQUFENkhBQUEraHdBQUFrQUFBQUFIUUFBdngwQUFBa0FBQURBSFFBQS94MEFBQTBBQUFBQUhnQUFGUjhBQUFrQUFBQVlId0FBSFI4QUFBa0FBQUFnSHdBQVJSOEFBQWtBQUFCSUh3QUFUUjhBQUFrQUFBQlFId0FBVng4QUFBa0FBQUJaSHdBQVdSOEFBQWtBQUFCYkh3QUFXeDhBQUFrQUFBQmRId0FBWFI4QUFBa0FBQUJmSHdBQWZSOEFBQWtBQUFDQUh3QUF0QjhBQUFrQUFBQzJId0FBdkI4QUFBa0FBQUM5SHdBQXZSOEFBQTRBQUFDK0h3QUF2aDhBQUFrQUFBQy9Id0FBd1I4QUFBNEFBQURDSHdBQXhCOEFBQWtBQUFER0h3QUF6QjhBQUFrQUFBRE5Id0FBeng4QUFBNEFBQURRSHdBQTB4OEFBQWtBQUFEV0h3QUEyeDhBQUFrQUFBRGRId0FBM3g4QUFBNEFBQURnSHdBQTdCOEFBQWtBQUFEdEh3QUE3eDhBQUE0QUFBRHlId0FBOUI4QUFBa0FBQUQySHdBQS9COEFBQWtBQUFEOUh3QUEvaDhBQUE0QUFBQUFJQUFBQ2lBQUFCWUFBQUFMSUFBQURTQUFBQU1BQUFBT0lBQUFEaUFBQUFrQUFBQVBJQUFBRHlBQUFCRUFBQUFRSUFBQUp5QUFBQTRBQUFBb0lBQUFLQ0FBQUJZQUFBQXBJQUFBS1NBQUFBSUFBQUFxSUFBQUtpQUFBQW9BQUFBcklBQUFLeUFBQUJJQUFBQXNJQUFBTENBQUFBOEFBQUF0SUFBQUxTQUFBQXdBQUFBdUlBQUFMaUFBQUJRQUFBQXZJQUFBTHlBQUFBUUFBQUF3SUFBQU5DQUFBQWNBQUFBMUlBQUFReUFBQUE0QUFBQkVJQUFBUkNBQUFBUUFBQUJGSUFBQVhpQUFBQTRBQUFCZklBQUFYeUFBQUJZQUFBQmdJQUFBWkNBQUFBTUFBQUJtSUFBQVppQUFBQXNBQUFCbklBQUFaeUFBQUJNQUFBQm9JQUFBYUNBQUFBZ0FBQUJwSUFBQWFTQUFBQkFBQUFCcUlBQUFieUFBQUFNQUFBQndJQUFBY0NBQUFBVUFBQUJ4SUFBQWNTQUFBQWtBQUFCMElBQUFlU0FBQUFVQUFBQjZJQUFBZXlBQUFBWUFBQUI4SUFBQWZpQUFBQTRBQUFCL0lBQUFmeUFBQUFrQUFBQ0FJQUFBaVNBQUFBVUFBQUNLSUFBQWl5QUFBQVlBQUFDTUlBQUFqaUFBQUE0QUFBQ1FJQUFBbkNBQUFBa0FBQUNnSUFBQXp5QUFBQWNBQUFEUUlBQUE4Q0FBQUEwQUFBQUFJUUFBQVNFQUFBNEFBQUFDSVFBQUFpRUFBQWtBQUFBRElRQUFCaUVBQUE0QUFBQUhJUUFBQnlFQUFBa0FBQUFJSVFBQUNTRUFBQTRBQUFBS0lRQUFFeUVBQUFrQUFBQVVJUUFBRkNFQUFBNEFBQUFWSVFBQUZTRUFBQWtBQUFBV0lRQUFHQ0VBQUE0QUFBQVpJUUFBSFNFQUFBa0FBQUFlSVFBQUl5RUFBQTRBQUFBa0lRQUFKQ0VBQUFrQUFBQWxJUUFBSlNFQUFBNEFBQUFtSVFBQUppRUFBQWtBQUFBbklRQUFKeUVBQUE0QUFBQW9JUUFBS0NFQUFBa0FBQUFwSVFBQUtTRUFBQTRBQUFBcUlRQUFMU0VBQUFrQUFBQXVJUUFBTGlFQUFBY0FBQUF2SVFBQU9TRUFBQWtBQUFBNklRQUFPeUVBQUE0QUFBQThJUUFBUHlFQUFBa0FBQUJBSVFBQVJDRUFBQTRBQUFCRklRQUFTU0VBQUFrQUFBQktJUUFBVFNFQUFBNEFBQUJPSVFBQVR5RUFBQWtBQUFCUUlRQUFYeUVBQUE0QUFBQmdJUUFBaUNFQUFBa0FBQUNKSVFBQWl5RUFBQTRBQUFDUUlRQUFFU0lBQUE0QUFBQVNJZ0FBRWlJQUFBWUFBQUFUSWdBQUV5SUFBQWNBQUFBVUlnQUFOU01BQUE0QUFBQTJJd0FBZWlNQUFBa0FBQUI3SXdBQWxDTUFBQTRBQUFDVkl3QUFsU01BQUFrQUFBQ1dJd0FBS1NRQUFBNEFBQUJBSkFBQVNpUUFBQTRBQUFCZ0pBQUFoeVFBQUE0QUFBQ0lKQUFBbXlRQUFBVUFBQUNjSkFBQTZTUUFBQWtBQUFEcUpBQUFxeVlBQUE0QUFBQ3NKZ0FBckNZQUFBa0FBQUN0SmdBQS95Y0FBQTRBQUFBQUtBQUEveWdBQUFrQUFBQUFLUUFBY3lzQUFBNEFBQUIyS3dBQWxTc0FBQTRBQUFDWEt3QUEveXNBQUE0QUFBQUFMQUFBNUN3QUFBa0FBQURsTEFBQTZpd0FBQTRBQUFEckxBQUE3aXdBQUFrQUFBRHZMQUFBOFN3QUFBMEFBQUR5TEFBQTh5d0FBQWtBQUFENUxBQUEveXdBQUE0QUFBQUFMUUFBSlMwQUFBa0FBQUFuTFFBQUp5MEFBQWtBQUFBdExRQUFMUzBBQUFrQUFBQXdMUUFBWnkwQUFBa0FBQUJ2TFFBQWNDMEFBQWtBQUFCL0xRQUFmeTBBQUEwQUFBQ0FMUUFBbGkwQUFBa0FBQUNnTFFBQXBpMEFBQWtBQUFDb0xRQUFyaTBBQUFrQUFBQ3dMUUFBdGkwQUFBa0FBQUM0TFFBQXZpMEFBQWtBQUFEQUxRQUF4aTBBQUFrQUFBRElMUUFBemkwQUFBa0FBQURRTFFBQTFpMEFBQWtBQUFEWUxRQUEzaTBBQUFrQUFBRGdMUUFBL3kwQUFBMEFBQUFBTGdBQVhTNEFBQTRBQUFDQUxnQUFtUzRBQUE0QUFBQ2JMZ0FBOHk0QUFBNEFBQUFBTHdBQTFTOEFBQTRBQUFEd0x3QUEveThBQUE0QUFBQUFNQUFBQURBQUFCWUFBQUFCTUFBQUJEQUFBQTRBQUFBRk1BQUFCekFBQUFrQUFBQUlNQUFBSURBQUFBNEFBQUFoTUFBQUtUQUFBQWtBQUFBcU1BQUFMVEFBQUEwQUFBQXVNQUFBTHpBQUFBa0FBQUF3TUFBQU1EQUFBQTRBQUFBeE1BQUFOVEFBQUFrQUFBQTJNQUFBTnpBQUFBNEFBQUE0TUFBQVBEQUFBQWtBQUFBOU1BQUFQekFBQUE0QUFBQkJNQUFBbGpBQUFBa0FBQUNaTUFBQW1qQUFBQTBBQUFDYk1BQUFuREFBQUE0QUFBQ2RNQUFBbnpBQUFBa0FBQUNnTUFBQW9EQUFBQTRBQUFDaE1BQUErakFBQUFrQUFBRDdNQUFBK3pBQUFBNEFBQUQ4TUFBQS96QUFBQWtBQUFBRk1RQUFMekVBQUFrQUFBQXhNUUFBampFQUFBa0FBQUNRTVFBQXZ6RUFBQWtBQUFEQU1RQUE1VEVBQUE0QUFBRHZNUUFBN3pFQUFBNEFBQUR3TVFBQUhESUFBQWtBQUFBZE1nQUFIaklBQUE0QUFBQWdNZ0FBVHpJQUFBa0FBQUJRTWdBQVh6SUFBQTRBQUFCZ01nQUFleklBQUFrQUFBQjhNZ0FBZmpJQUFBNEFBQUIvTWdBQXNESUFBQWtBQUFDeE1nQUF2eklBQUE0QUFBREFNZ0FBeXpJQUFBa0FBQURNTWdBQXp6SUFBQTRBQUFEUU1nQUFkak1BQUFrQUFBQjNNd0FBZWpNQUFBNEFBQUI3TXdBQTNUTUFBQWtBQUFEZU13QUEzek1BQUE0QUFBRGdNd0FBL2pNQUFBa0FBQUQvTXdBQS96TUFBQTRBQUFBQU5BQUF2MDBBQUFrQUFBREFUUUFBLzAwQUFBNEFBQUFBVGdBQWpLUUFBQWtBQUFDUXBBQUF4cVFBQUE0QUFBRFFwQUFBREtZQUFBa0FBQUFOcGdBQUQ2WUFBQTRBQUFBUXBnQUFLNllBQUFrQUFBQkFwZ0FBYnFZQUFBa0FBQUJ2cGdBQWNxWUFBQTBBQUFCenBnQUFjNllBQUE0QUFBQjBwZ0FBZmFZQUFBMEFBQUIrcGdBQWY2WUFBQTRBQUFDQXBnQUFuYVlBQUFrQUFBQ2VwZ0FBbjZZQUFBMEFBQUNncGdBQTc2WUFBQWtBQUFEd3BnQUE4YVlBQUEwQUFBRHlwZ0FBOTZZQUFBa0FBQUFBcHdBQUlhY0FBQTRBQUFBaXB3QUFoNmNBQUFrQUFBQ0lwd0FBaUtjQUFBNEFBQUNKcHdBQXphY0FBQWtBQUFEUXB3QUEwYWNBQUFrQUFBRFRwd0FBMDZjQUFBa0FBQURWcHdBQTNLY0FBQWtBQUFEeXB3QUFBYWdBQUFrQUFBQUNxQUFBQXFnQUFBMEFBQUFEcUFBQUJhZ0FBQWtBQUFBR3FBQUFCcWdBQUEwQUFBQUhxQUFBQ3FnQUFBa0FBQUFMcUFBQUM2Z0FBQTBBQUFBTXFBQUFKS2dBQUFrQUFBQWxxQUFBSnFnQUFBMEFBQUFucUFBQUo2Z0FBQWtBQUFBb3FBQUFLNmdBQUE0QUFBQXNxQUFBTEtnQUFBMEFBQUF3cUFBQU42Z0FBQWtBQUFBNHFBQUFPYWdBQUFjQUFBQkFxQUFBYzZnQUFBa0FBQUIwcUFBQWQ2Z0FBQTRBQUFDQXFBQUF3NmdBQUFrQUFBREVxQUFBeGFnQUFBMEFBQURPcUFBQTJhZ0FBQWtBQUFEZ3FBQUE4YWdBQUEwQUFBRHlxQUFBL3FnQUFBa0FBQUQvcUFBQS82Z0FBQTBBQUFBQXFRQUFKYWtBQUFrQUFBQW1xUUFBTGFrQUFBMEFBQUF1cVFBQVJxa0FBQWtBQUFCSHFRQUFVYWtBQUEwQUFBQlNxUUFBVTZrQUFBa0FBQUJmcVFBQWZLa0FBQWtBQUFDQXFRQUFncWtBQUEwQUFBQ0RxUUFBc3FrQUFBa0FBQUN6cVFBQXM2a0FBQTBBQUFDMHFRQUF0YWtBQUFrQUFBQzJxUUFBdWFrQUFBMEFBQUM2cVFBQXU2a0FBQWtBQUFDOHFRQUF2YWtBQUEwQUFBQytxUUFBemFrQUFBa0FBQURQcVFBQTJha0FBQWtBQUFEZXFRQUE1S2tBQUFrQUFBRGxxUUFBNWFrQUFBMEFBQURtcVFBQS9xa0FBQWtBQUFBQXFnQUFLS29BQUFrQUFBQXBxZ0FBTHFvQUFBMEFBQUF2cWdBQU1Lb0FBQWtBQUFBeHFnQUFNcW9BQUEwQUFBQXpxZ0FBTktvQUFBa0FBQUExcWdBQU5xb0FBQTBBQUFCQXFnQUFRcW9BQUFrQUFBQkRxZ0FBUTZvQUFBMEFBQUJFcWdBQVM2b0FBQWtBQUFCTXFnQUFUS29BQUEwQUFBQk5xZ0FBVGFvQUFBa0FBQUJRcWdBQVdhb0FBQWtBQUFCY3FnQUFlNm9BQUFrQUFBQjhxZ0FBZktvQUFBMEFBQUI5cWdBQXI2b0FBQWtBQUFDd3FnQUFzS29BQUEwQUFBQ3hxZ0FBc2FvQUFBa0FBQUN5cWdBQXRLb0FBQTBBQUFDMXFnQUF0cW9BQUFrQUFBQzNxZ0FBdUtvQUFBMEFBQUM1cWdBQXZhb0FBQWtBQUFDK3FnQUF2Nm9BQUEwQUFBREFxZ0FBd0tvQUFBa0FBQURCcWdBQXdhb0FBQTBBQUFEQ3FnQUF3cW9BQUFrQUFBRGJxZ0FBNjZvQUFBa0FBQURzcWdBQTdhb0FBQTBBQUFEdXFnQUE5YW9BQUFrQUFBRDJxZ0FBOXFvQUFBMEFBQUFCcXdBQUJxc0FBQWtBQUFBSnF3QUFEcXNBQUFrQUFBQVJxd0FBRnFzQUFBa0FBQUFncXdBQUpxc0FBQWtBQUFBb3F3QUFMcXNBQUFrQUFBQXdxd0FBYWFzQUFBa0FBQUJxcXdBQWE2c0FBQTRBQUFCd3F3QUE1S3NBQUFrQUFBRGxxd0FBNWFzQUFBMEFBQURtcXdBQTU2c0FBQWtBQUFEb3F3QUE2S3NBQUEwQUFBRHBxd0FBN0tzQUFBa0FBQUR0cXdBQTdhc0FBQTBBQUFEd3F3QUErYXNBQUFrQUFBQUFyQUFBbzljQUFBa0FBQUN3MXdBQXh0Y0FBQWtBQUFETDF3QUErOWNBQUFrQUFBQUE0QUFBYmZvQUFBa0FBQUJ3K2dBQTJmb0FBQWtBQUFBQSt3QUFCdnNBQUFrQUFBQVQrd0FBRi9zQUFBa0FBQUFkK3dBQUhmc0FBQkVBQUFBZSt3QUFIdnNBQUEwQUFBQWYrd0FBS1BzQUFCRUFBQUFwK3dBQUtmc0FBQVlBQUFBcSt3QUFUL3NBQUJFQUFBQlErd0FBUGYwQUFBQUFBQUErL1FBQVQvMEFBQTRBQUFCUS9RQUF6djBBQUFBQUFBRFAvUUFBei8wQUFBNEFBQUR3L1FBQS9QMEFBQUFBQUFEOS9RQUEvLzBBQUE0QUFBQUEvZ0FBRC80QUFBMEFBQUFRL2dBQUdmNEFBQTRBQUFBZy9nQUFMLzRBQUEwQUFBQXcvZ0FBVC80QUFBNEFBQUJRL2dBQVVQNEFBQVFBQUFCUi9nQUFVZjRBQUE0QUFBQlMvZ0FBVXY0QUFBUUFBQUJVL2dBQVZQNEFBQTRBQUFCVi9nQUFWZjRBQUFRQUFBQlcvZ0FBWHY0QUFBNEFBQUJmL2dBQVgvNEFBQWNBQUFCZy9nQUFZZjRBQUE0QUFBQmkvZ0FBWS80QUFBWUFBQUJrL2dBQVp2NEFBQTRBQUFCby9nQUFhUDRBQUE0QUFBQnAvZ0FBYXY0QUFBY0FBQUJyL2dBQWEvNEFBQTRBQUFCdy9nQUEvdjRBQUFBQUFBRC8vZ0FBLy80QUFBTUFBQUFCL3dBQUF2OEFBQTRBQUFBRC93QUFCZjhBQUFjQUFBQUcvd0FBQ3Y4QUFBNEFBQUFML3dBQUMvOEFBQVlBQUFBTS93QUFEUDhBQUFRQUFBQU4vd0FBRGY4QUFBWUFBQUFPL3dBQUQvOEFBQVFBQUFBUS93QUFHZjhBQUFVQUFBQWEvd0FBR3Y4QUFBUUFBQUFiL3dBQUlQOEFBQTRBQUFBaC93QUFPdjhBQUFrQUFBQTcvd0FBUVA4QUFBNEFBQUJCL3dBQVd2OEFBQWtBQUFCYi93QUFaZjhBQUE0QUFBQm0vd0FBdnY4QUFBa0FBQURDL3dBQXgvOEFBQWtBQUFESy93QUF6LzhBQUFrQUFBRFMvd0FBMS84QUFBa0FBQURhL3dBQTNQOEFBQWtBQUFEZy93QUE0ZjhBQUFjQUFBRGkvd0FBNVA4QUFBNEFBQURsL3dBQTV2OEFBQWNBQUFEby93QUE3djhBQUE0QUFBRDUvd0FBL2Y4QUFBNEFBQUFBQUFFQUN3QUJBQWtBQUFBTkFBRUFKZ0FCQUFrQUFBQW9BQUVBT2dBQkFBa0FBQUE4QUFFQVBRQUJBQWtBQUFBL0FBRUFUUUFCQUFrQUFBQlFBQUVBWFFBQkFBa0FBQUNBQUFFQStnQUJBQWtBQUFBQUFRRUFBQUVCQUFrQUFBQUJBUUVBQVFFQkFBNEFBQUFDQVFFQUFnRUJBQWtBQUFBSEFRRUFNd0VCQUFrQUFBQTNBUUVBUHdFQkFBa0FBQUJBQVFFQWpBRUJBQTRBQUFDTkFRRUFqZ0VCQUFrQUFBQ1FBUUVBbkFFQkFBNEFBQUNnQVFFQW9BRUJBQTRBQUFEUUFRRUEvQUVCQUFrQUFBRDlBUUVBL1FFQkFBMEFBQUNBQWdFQW5BSUJBQWtBQUFDZ0FnRUEwQUlCQUFrQUFBRGdBZ0VBNEFJQkFBMEFBQURoQWdFQSt3SUJBQVVBQUFBQUF3RUFJd01CQUFrQUFBQXRBd0VBU2dNQkFBa0FBQUJRQXdFQWRRTUJBQWtBQUFCMkF3RUFlZ01CQUEwQUFBQ0FBd0VBblFNQkFBa0FBQUNmQXdFQXd3TUJBQWtBQUFESUF3RUExUU1CQUFrQUFBQUFCQUVBblFRQkFBa0FBQUNnQkFFQXFRUUJBQWtBQUFDd0JBRUEwd1FCQUFrQUFBRFlCQUVBK3dRQkFBa0FBQUFBQlFFQUp3VUJBQWtBQUFBd0JRRUFZd1VCQUFrQUFBQnZCUUVBZWdVQkFBa0FBQUI4QlFFQWlnVUJBQWtBQUFDTUJRRUFrZ1VCQUFrQUFBQ1VCUUVBbFFVQkFBa0FBQUNYQlFFQW9RVUJBQWtBQUFDakJRRUFzUVVCQUFrQUFBQ3pCUUVBdVFVQkFBa0FBQUM3QlFFQXZBVUJBQWtBQUFEQUJRRUE4d1VCQUFrQUFBQUFCZ0VBTmdjQkFBa0FBQUJBQndFQVZRY0JBQWtBQUFCZ0J3RUFad2NCQUFrQUFBQ0FCd0VBaFFjQkFBa0FBQUNIQndFQXNBY0JBQWtBQUFDeUJ3RUF1Z2NCQUFrQUFBQUFDQUVBSGdrQkFCRUFBQUFmQ1FFQUh3a0JBQTRBQUFBZ0NRRUFBQW9CQUJFQUFBQUJDZ0VBQXdvQkFBMEFBQUFFQ2dFQUJBb0JBQkVBQUFBRkNnRUFCZ29CQUEwQUFBQUhDZ0VBQ3dvQkFCRUFBQUFNQ2dFQUR3b0JBQTBBQUFBUUNnRUFOd29CQUJFQUFBQTRDZ0VBT2dvQkFBMEFBQUE3Q2dFQVBnb0JBQkVBQUFBL0NnRUFQd29CQUEwQUFBQkFDZ0VBNUFvQkFCRUFBQURsQ2dFQTVnb0JBQTBBQUFEbkNnRUFPQXNCQUJFQUFBQTVDd0VBUHdzQkFBNEFBQUJBQ3dFQS93d0JBQkVBQUFBQURRRUFJdzBCQUFBQUFBQWtEUUVBSncwQkFBMEFBQUFvRFFFQUx3MEJBQkVBQUFBd0RRRUFPUTBCQUFFQUFBQTZEUUVBUHcwQkFCRUFBQUJBRFFFQVNRMEJBQUVBQUFCS0RRRUFhQTBCQUJFQUFBQnBEUUVBYlEwQkFBMEFBQUJ1RFFFQWJnMEJBQTRBQUFCdkRRRUFYdzRCQUJFQUFBQmdEZ0VBZmc0QkFBRUFBQUIvRGdFQXFnNEJBQkVBQUFDckRnRUFyQTRCQUEwQUFBQ3REZ0VBd1E0QkFCRUFBQURDRGdFQXhBNEJBQUFBQUFERkRnRUErdzRCQUJFQUFBRDhEZ0VBL3c0QkFBMEFBQUFBRHdFQUx3OEJBQkVBQUFBd0R3RUFSUThCQUFBQUFBQkdEd0VBVUE4QkFBMEFBQUJSRHdFQVdROEJBQUFBQUFCYUR3RUFnUThCQUJFQUFBQ0NEd0VBaFE4QkFBMEFBQUNHRHdFQS93OEJBQkVBQUFBQUVBRUFBQkFCQUFrQUFBQUJFQUVBQVJBQkFBMEFBQUFDRUFFQU54QUJBQWtBQUFBNEVBRUFSaEFCQUEwQUFBQkhFQUVBVFJBQkFBa0FBQUJTRUFFQVpSQUJBQTRBQUFCbUVBRUFieEFCQUFrQUFBQndFQUVBY0JBQkFBMEFBQUJ4RUFFQWNoQUJBQWtBQUFCekVBRUFkQkFCQUEwQUFBQjFFQUVBZFJBQkFBa0FBQUIvRUFFQWdSQUJBQTBBQUFDQ0VBRUFzaEFCQUFrQUFBQ3pFQUVBdGhBQkFBMEFBQUMzRUFFQXVCQUJBQWtBQUFDNUVBRUF1aEFCQUEwQUFBQzdFQUVBd1JBQkFBa0FBQURDRUFFQXdoQUJBQTBBQUFETkVBRUF6UkFCQUFrQUFBRFFFQUVBNkJBQkFBa0FBQUR3RUFFQStSQUJBQWtBQUFBQUVRRUFBaEVCQUEwQUFBQURFUUVBSmhFQkFBa0FBQUFuRVFFQUt4RUJBQTBBQUFBc0VRRUFMQkVCQUFrQUFBQXRFUUVBTkJFQkFBMEFBQUEyRVFFQVJ4RUJBQWtBQUFCUUVRRUFjaEVCQUFrQUFBQnpFUUVBY3hFQkFBMEFBQUIwRVFFQWRoRUJBQWtBQUFDQUVRRUFnUkVCQUEwQUFBQ0NFUUVBdFJFQkFBa0FBQUMyRVFFQXZoRUJBQTBBQUFDL0VRRUF5QkVCQUFrQUFBREpFUUVBekJFQkFBMEFBQURORVFFQXpoRUJBQWtBQUFEUEVRRUF6eEVCQUEwQUFBRFFFUUVBM3hFQkFBa0FBQURoRVFFQTlCRUJBQWtBQUFBQUVnRUFFUklCQUFrQUFBQVRFZ0VBTGhJQkFBa0FBQUF2RWdFQU1SSUJBQTBBQUFBeUVnRUFNeElCQUFrQUFBQTBFZ0VBTkJJQkFBMEFBQUExRWdFQU5SSUJBQWtBQUFBMkVnRUFOeElCQUEwQUFBQTRFZ0VBUFJJQkFBa0FBQUErRWdFQVBoSUJBQTBBQUFBL0VnRUFRQklCQUFrQUFBQkJFZ0VBUVJJQkFBMEFBQUNBRWdFQWhoSUJBQWtBQUFDSUVnRUFpQklCQUFrQUFBQ0tFZ0VBalJJQkFBa0FBQUNQRWdFQW5SSUJBQWtBQUFDZkVnRUFxUklCQUFrQUFBQ3dFZ0VBM2hJQkFBa0FBQURmRWdFQTN4SUJBQTBBQUFEZ0VnRUE0aElCQUFrQUFBRGpFZ0VBNmhJQkFBMEFBQUR3RWdFQStSSUJBQWtBQUFBQUV3RUFBUk1CQUEwQUFBQUNFd0VBQXhNQkFBa0FBQUFGRXdFQURCTUJBQWtBQUFBUEV3RUFFQk1CQUFrQUFBQVRFd0VBS0JNQkFBa0FBQUFxRXdFQU1CTUJBQWtBQUFBeUV3RUFNeE1CQUFrQUFBQTFFd0VBT1JNQkFBa0FBQUE3RXdFQVBCTUJBQTBBQUFBOUV3RUFQeE1CQUFrQUFBQkFFd0VBUUJNQkFBMEFBQUJCRXdFQVJCTUJBQWtBQUFCSEV3RUFTQk1CQUFrQUFBQkxFd0VBVFJNQkFBa0FBQUJRRXdFQVVCTUJBQWtBQUFCWEV3RUFWeE1CQUFrQUFBQmRFd0VBWXhNQkFBa0FBQUJtRXdFQWJCTUJBQTBBQUFCd0V3RUFkQk1CQUEwQUFBQ0FFd0VBaVJNQkFBa0FBQUNMRXdFQWl4TUJBQWtBQUFDT0V3RUFqaE1CQUFrQUFBQ1FFd0VBdFJNQkFBa0FBQUMzRXdFQXVoTUJBQWtBQUFDN0V3RUF3Qk1CQUEwQUFBRENFd0VBd2hNQkFBa0FBQURGRXdFQXhSTUJBQWtBQUFESEV3RUF5aE1CQUFrQUFBRE1Fd0VBelJNQkFBa0FBQURPRXdFQXpoTUJBQTBBQUFEUEV3RUF6eE1CQUFrQUFBRFFFd0VBMEJNQkFBMEFBQURSRXdFQTBSTUJBQWtBQUFEU0V3RUEwaE1CQUEwQUFBRFRFd0VBMVJNQkFBa0FBQURYRXdFQTJCTUJBQWtBQUFEaEV3RUE0aE1CQUEwQUFBQUFGQUVBTnhRQkFBa0FBQUE0RkFFQVB4UUJBQTBBQUFCQUZBRUFRUlFCQUFrQUFBQkNGQUVBUkJRQkFBMEFBQUJGRkFFQVJSUUJBQWtBQUFCR0ZBRUFSaFFCQUEwQUFBQkhGQUVBV3hRQkFBa0FBQUJkRkFFQVhSUUJBQWtBQUFCZUZBRUFYaFFCQUEwQUFBQmZGQUVBWVJRQkFBa0FBQUNBRkFFQXNoUUJBQWtBQUFDekZBRUF1QlFCQUEwQUFBQzVGQUVBdVJRQkFBa0FBQUM2RkFFQXVoUUJBQTBBQUFDN0ZBRUF2aFFCQUFrQUFBQy9GQUVBd0JRQkFBMEFBQURCRkFFQXdSUUJBQWtBQUFEQ0ZBRUF3eFFCQUEwQUFBREVGQUVBeHhRQkFBa0FBQURRRkFFQTJSUUJBQWtBQUFDQUZRRUFzUlVCQUFrQUFBQ3lGUUVBdFJVQkFBMEFBQUM0RlFFQXV4VUJBQWtBQUFDOEZRRUF2UlVCQUEwQUFBQytGUUVBdmhVQkFBa0FBQUMvRlFFQXdCVUJBQTBBQUFEQkZRRUEyeFVCQUFrQUFBRGNGUUVBM1JVQkFBMEFBQUFBRmdFQU1oWUJBQWtBQUFBekZnRUFPaFlCQUEwQUFBQTdGZ0VBUEJZQkFBa0FBQUE5RmdFQVBSWUJBQTBBQUFBK0ZnRUFQaFlCQUFrQUFBQS9GZ0VBUUJZQkFBMEFBQUJCRmdFQVJCWUJBQWtBQUFCUUZnRUFXUllCQUFrQUFBQmdGZ0VBYkJZQkFBNEFBQUNBRmdFQXFoWUJBQWtBQUFDckZnRUFxeFlCQUEwQUFBQ3NGZ0VBckJZQkFBa0FBQUN0RmdFQXJSWUJBQTBBQUFDdUZnRUFyeFlCQUFrQUFBQ3dGZ0VBdFJZQkFBMEFBQUMyRmdFQXRoWUJBQWtBQUFDM0ZnRUF0eFlCQUEwQUFBQzRGZ0VBdVJZQkFBa0FBQURBRmdFQXlSWUJBQWtBQUFEUUZnRUE0eFlCQUFrQUFBQUFGd0VBR2hjQkFBa0FBQUFkRndFQUhSY0JBQTBBQUFBZUZ3RUFIaGNCQUFrQUFBQWZGd0VBSHhjQkFBMEFBQUFnRndFQUlSY0JBQWtBQUFBaUZ3RUFKUmNCQUEwQUFBQW1Gd0VBSmhjQkFBa0FBQUFuRndFQUt4Y0JBQTBBQUFBd0Z3RUFSaGNCQUFrQUFBQUFHQUVBTGhnQkFBa0FBQUF2R0FFQU54Z0JBQTBBQUFBNEdBRUFPQmdCQUFrQUFBQTVHQUVBT2hnQkFBMEFBQUE3R0FFQU94Z0JBQWtBQUFDZ0dBRUE4aGdCQUFrQUFBRC9HQUVBQmhrQkFBa0FBQUFKR1FFQUNSa0JBQWtBQUFBTUdRRUFFeGtCQUFrQUFBQVZHUUVBRmhrQkFBa0FBQUFZR1FFQU5Sa0JBQWtBQUFBM0dRRUFPQmtCQUFrQUFBQTdHUUVBUEJrQkFBMEFBQUE5R1FFQVBSa0JBQWtBQUFBK0dRRUFQaGtCQUEwQUFBQS9HUUVBUWhrQkFBa0FBQUJER1FFQVF4a0JBQTBBQUFCRUdRRUFSaGtCQUFrQUFBQlFHUUVBV1JrQkFBa0FBQUNnR1FFQXB4a0JBQWtBQUFDcUdRRUEweGtCQUFrQUFBRFVHUUVBMXhrQkFBMEFBQURhR1FFQTJ4a0JBQTBBQUFEY0dRRUEzeGtCQUFrQUFBRGdHUUVBNEJrQkFBMEFBQURoR1FFQTVCa0JBQWtBQUFBQUdnRUFBQm9CQUFrQUFBQUJHZ0VBQmhvQkFBMEFBQUFIR2dFQUNCb0JBQWtBQUFBSkdnRUFDaG9CQUEwQUFBQUxHZ0VBTWhvQkFBa0FBQUF6R2dFQU9Cb0JBQTBBQUFBNUdnRUFPaG9CQUFrQUFBQTdHZ0VBUGhvQkFBMEFBQUEvR2dFQVJob0JBQWtBQUFCSEdnRUFSeG9CQUEwQUFBQlFHZ0VBVUJvQkFBa0FBQUJSR2dFQVZob0JBQTBBQUFCWEdnRUFXQm9CQUFrQUFBQlpHZ0VBV3hvQkFBMEFBQUJjR2dFQWlSb0JBQWtBQUFDS0dnRUFsaG9CQUEwQUFBQ1hHZ0VBbHhvQkFBa0FBQUNZR2dFQW1Sb0JBQTBBQUFDYUdnRUFvaG9CQUFrQUFBQ3dHZ0VBK0JvQkFBa0FBQUFBR3dFQUNSc0JBQWtBQUFEQUd3RUE0UnNCQUFrQUFBRHdHd0VBK1JzQkFBa0FBQUFBSEFFQUNCd0JBQWtBQUFBS0hBRUFMeHdCQUFrQUFBQXdIQUVBTmh3QkFBMEFBQUE0SEFFQVBSd0JBQTBBQUFBK0hBRUFSUndCQUFrQUFBQlFIQUVBYkJ3QkFBa0FBQUJ3SEFFQWp4d0JBQWtBQUFDU0hBRUFweHdCQUEwQUFBQ3BIQUVBcVJ3QkFBa0FBQUNxSEFFQXNCd0JBQTBBQUFDeEhBRUFzUndCQUFrQUFBQ3lIQUVBc3h3QkFBMEFBQUMwSEFFQXRCd0JBQWtBQUFDMUhBRUF0aHdCQUEwQUFBQUFIUUVBQmgwQkFBa0FBQUFJSFFFQUNSMEJBQWtBQUFBTEhRRUFNQjBCQUFrQUFBQXhIUUVBTmgwQkFBMEFBQUE2SFFFQU9oMEJBQTBBQUFBOEhRRUFQUjBCQUEwQUFBQS9IUUVBUlIwQkFBMEFBQUJHSFFFQVJoMEJBQWtBQUFCSEhRRUFSeDBCQUEwQUFBQlFIUUVBV1IwQkFBa0FBQUJnSFFFQVpSMEJBQWtBQUFCbkhRRUFhQjBCQUFrQUFBQnFIUUVBamgwQkFBa0FBQUNRSFFFQWtSMEJBQTBBQUFDVEhRRUFsQjBCQUFrQUFBQ1ZIUUVBbFIwQkFBMEFBQUNXSFFFQWxoMEJBQWtBQUFDWEhRRUFseDBCQUEwQUFBQ1lIUUVBbUIwQkFBa0FBQUNnSFFFQXFSMEJBQWtBQUFEZ0hnRUE4aDRCQUFrQUFBRHpIZ0VBOUI0QkFBMEFBQUQxSGdFQStCNEJBQWtBQUFBQUh3RUFBUjhCQUEwQUFBQUNId0VBRUI4QkFBa0FBQUFTSHdFQU5SOEJBQWtBQUFBMkh3RUFPaDhCQUEwQUFBQStId0VBUHg4QkFBa0FBQUJBSHdFQVFCOEJBQTBBQUFCQkh3RUFRUjhCQUFrQUFBQkNId0VBUWg4QkFBMEFBQUJESHdFQVdSOEJBQWtBQUFCYUh3RUFXaDhCQUEwQUFBQ3dId0VBc0I4QkFBa0FBQURBSHdFQTFCOEJBQWtBQUFEVkh3RUEzQjhCQUE0QUFBRGRId0VBNEI4QkFBY0FBQURoSHdFQThSOEJBQTRBQUFEL0h3RUFtU01CQUFrQUFBQUFKQUVBYmlRQkFBa0FBQUJ3SkFFQWRDUUJBQWtBQUFDQUpBRUFReVVCQUFrQUFBQ1FMd0VBOGk4QkFBa0FBQUFBTUFFQVB6UUJBQWtBQUFCQU5BRUFRRFFCQUEwQUFBQkJOQUVBUmpRQkFBa0FBQUJITkFFQVZUUUJBQTBBQUFCZ05BRUEra01CQUFrQUFBQUFSQUVBUmtZQkFBa0FBQUFBWVFFQUhXRUJBQWtBQUFBZVlRRUFLV0VCQUEwQUFBQXFZUUVBTEdFQkFBa0FBQUF0WVFFQUwyRUJBQTBBQUFBd1lRRUFPV0VCQUFrQUFBQUFhQUVBT0dvQkFBa0FBQUJBYWdFQVhtb0JBQWtBQUFCZ2FnRUFhV29CQUFrQUFBQnVhZ0VBdm1vQkFBa0FBQURBYWdFQXlXb0JBQWtBQUFEUWFnRUE3V29CQUFrQUFBRHdhZ0VBOUdvQkFBMEFBQUQxYWdFQTlXb0JBQWtBQUFBQWF3RUFMMnNCQUFrQUFBQXdhd0VBTm1zQkFBMEFBQUEzYXdFQVJXc0JBQWtBQUFCUWF3RUFXV3NCQUFrQUFBQmJhd0VBWVdzQkFBa0FBQUJqYXdFQWQyc0JBQWtBQUFCOWF3RUFqMnNCQUFrQUFBQkFiUUVBZVcwQkFBa0FBQUJBYmdFQW1tNEJBQWtBQUFBQWJ3RUFTbThCQUFrQUFBQlBid0VBVDI4QkFBMEFBQUJRYndFQWgyOEJBQWtBQUFDUGJ3RUFrbThCQUEwQUFBQ1Rid0VBbjI4QkFBa0FBQURnYndFQTRXOEJBQWtBQUFEaWJ3RUE0bThCQUE0QUFBRGpid0VBNDI4QkFBa0FBQURrYndFQTVHOEJBQTBBQUFEd2J3RUE4VzhCQUFrQUFBQUFjQUVBOTRjQkFBa0FBQUFBaUFFQTFZd0JBQWtBQUFEL2pBRUFDSTBCQUFrQUFBRHdyd0VBODY4QkFBa0FBQUQxcndFQSs2OEJBQWtBQUFEOXJ3RUEvcThCQUFrQUFBQUFzQUVBSXJFQkFBa0FBQUF5c1FFQU1yRUJBQWtBQUFCUXNRRUFVckVCQUFrQUFBQlZzUUVBVmJFQkFBa0FBQUJrc1FFQVo3RUJBQWtBQUFCd3NRRUErN0lCQUFrQUFBQUF2QUVBYXJ3QkFBa0FBQUJ3dkFFQWZMd0JBQWtBQUFDQXZBRUFpTHdCQUFrQUFBQ1F2QUVBbWJ3QkFBa0FBQUNjdkFFQW5Md0JBQWtBQUFDZHZBRUFucndCQUEwQUFBQ2Z2QUVBbjd3QkFBa0FBQUNndkFFQW83d0JBQU1BQUFBQXpBRUExY3dCQUE0QUFBRFd6QUVBNzh3QkFBa0FBQUR3ekFFQStjd0JBQVVBQUFBQXpRRUFzODRCQUE0QUFBQUF6d0VBTGM4QkFBMEFBQUF3endFQVJzOEJBQTBBQUFCUXp3RUF3ODhCQUFrQUFBQUEwQUVBOWRBQkFBa0FBQUFBMFFFQUp0RUJBQWtBQUFBcDBRRUFadEVCQUFrQUFBQm4wUUVBYWRFQkFBMEFBQUJxMFFFQWN0RUJBQWtBQUFCejBRRUFldEVCQUFNQUFBQjcwUUVBZ3RFQkFBMEFBQUNEMFFFQWhORUJBQWtBQUFDRjBRRUFpOUVCQUEwQUFBQ00wUUVBcWRFQkFBa0FBQUNxMFFFQXJkRUJBQTBBQUFDdTBRRUE2TkVCQUFrQUFBRHAwUUVBNnRFQkFBNEFBQUFBMGdFQVFkSUJBQTRBQUFCQzBnRUFSTklCQUEwQUFBQkYwZ0VBUmRJQkFBNEFBQURBMGdFQTA5SUJBQWtBQUFEZzBnRUE4OUlCQUFrQUFBQUEwd0VBVnRNQkFBNEFBQUJnMHdFQWVOTUJBQWtBQUFBQTFBRUFWTlFCQUFrQUFBQlcxQUVBbk5RQkFBa0FBQUNlMUFFQW45UUJBQWtBQUFDaTFBRUFvdFFCQUFrQUFBQ2wxQUVBcHRRQkFBa0FBQUNwMUFFQXJOUUJBQWtBQUFDdTFBRUF1ZFFCQUFrQUFBQzcxQUVBdTlRQkFBa0FBQUM5MUFFQXc5UUJBQWtBQUFERjFBRUFCZFVCQUFrQUFBQUgxUUVBQ3RVQkFBa0FBQUFOMVFFQUZOVUJBQWtBQUFBVzFRRUFITlVCQUFrQUFBQWUxUUVBT2RVQkFBa0FBQUE3MVFFQVB0VUJBQWtBQUFCQTFRRUFSTlVCQUFrQUFBQkcxUUVBUnRVQkFBa0FBQUJLMVFFQVVOVUJBQWtBQUFCUzFRRUFwZFlCQUFrQUFBQ28xZ0VBd05ZQkFBa0FBQURCMWdFQXdkWUJBQTRBQUFEQzFnRUEydFlCQUFrQUFBRGIxZ0VBMjlZQkFBNEFBQURjMWdFQSt0WUJBQWtBQUFENzFnRUErOVlCQUE0QUFBRDgxZ0VBRk5jQkFBa0FBQUFWMXdFQUZkY0JBQTRBQUFBVzF3RUFOTmNCQUFrQUFBQTExd0VBTmRjQkFBNEFBQUEyMXdFQVR0Y0JBQWtBQUFCUDF3RUFUOWNCQUE0QUFBQlExd0VBYnRjQkFBa0FBQUJ2MXdFQWI5Y0JBQTRBQUFCdzF3RUFpTmNCQUFrQUFBQ0oxd0VBaWRjQkFBNEFBQUNLMXdFQXFOY0JBQWtBQUFDcDF3RUFxZGNCQUE0QUFBQ3Exd0VBd3RjQkFBa0FBQUREMXdFQXc5Y0JBQTRBQUFERTF3RUF5OWNCQUFrQUFBRE8xd0VBLzljQkFBVUFBQUFBMkFFQS85a0JBQWtBQUFBQTJnRUFOdG9CQUEwQUFBQTMyZ0VBT3RvQkFBa0FBQUE3MmdFQWJOb0JBQTBBQUFCdDJnRUFkTm9CQUFrQUFBQjEyZ0VBZGRvQkFBMEFBQUIyMmdFQWc5b0JBQWtBQUFDRTJnRUFoTm9CQUEwQUFBQ0YyZ0VBaTlvQkFBa0FBQUNiMmdFQW45b0JBQTBBQUFDaDJnRUFyOW9CQUEwQUFBQUEzd0VBSHQ4QkFBa0FBQUFsM3dFQUt0OEJBQWtBQUFBQTRBRUFCdUFCQUEwQUFBQUk0QUVBR09BQkFBMEFBQUFiNEFFQUllQUJBQTBBQUFBajRBRUFKT0FCQUEwQUFBQW00QUVBS3VBQkFBMEFBQUF3NEFFQWJlQUJBQWtBQUFDUDRBRUFqK0FCQUEwQUFBQUE0UUVBTE9FQkFBa0FBQUF3NFFFQU51RUJBQTBBQUFBMzRRRUFQZUVCQUFrQUFBQkE0UUVBU2VFQkFBa0FBQUJPNFFFQVQrRUJBQWtBQUFDUTRnRUFyZUlCQUFrQUFBQ3U0Z0VBcnVJQkFBMEFBQURBNGdFQTYrSUJBQWtBQUFEczRnRUE3K0lCQUEwQUFBRHc0Z0VBK2VJQkFBa0FBQUQvNGdFQS8rSUJBQWNBQUFEUTVBRUE2K1FCQUFrQUFBRHM1QUVBNytRQkFBMEFBQUR3NUFFQStlUUJBQWtBQUFEUTVRRUE3ZVVCQUFrQUFBRHU1UUVBNytVQkFBMEFBQUR3NVFFQSt1VUJBQWtBQUFELzVRRUEvK1VCQUFrQUFBRGc1d0VBNXVjQkFBa0FBQURvNXdFQTYrY0JBQWtBQUFEdDV3RUE3dWNCQUFrQUFBRHc1d0VBL3VjQkFBa0FBQUFBNkFFQXorZ0JBQkVBQUFEUTZBRUExdWdCQUEwQUFBRFg2QUVBUStrQkFCRUFBQUJFNlFFQVN1a0JBQTBBQUFCTDZRRUFjT3dCQUJFQUFBQng3QUVBdE93QkFBQUFBQUMxN0FFQUFPMEJBQkVBQUFBQjdRRUFQZTBCQUFBQUFBQSs3UUVBLyswQkFCRUFBQUFBN2dFQTcrNEJBQUFBQUFEdzdnRUE4ZTRCQUE0QUFBRHk3Z0VBLys0QkFBQUFBQUFBN3dFQS8rOEJBQkVBQUFBQThBRUFLL0FCQUE0QUFBQXc4QUVBay9BQkFBNEFBQUNnOEFFQXJ2QUJBQTRBQUFDeDhBRUF2L0FCQUE0QUFBREI4QUVBei9BQkFBNEFBQURSOEFFQTlmQUJBQTRBQUFBQThRRUFDdkVCQUFVQUFBQUw4UUVBRC9FQkFBNEFBQUFROFFFQUx2RUJBQWtBQUFBdjhRRUFML0VCQUE0QUFBQXc4UUVBYWZFQkFBa0FBQUJxOFFFQWIvRUJBQTRBQUFCdzhRRUFyUEVCQUFrQUFBQ3Q4UUVBcmZFQkFBNEFBQURtOFFFQUF2SUJBQWtBQUFBUThnRUFPL0lCQUFrQUFBQkE4Z0VBU1BJQkFBa0FBQUJROGdFQVVmSUJBQWtBQUFCZzhnRUFaZklCQUE0QUFBQUE4d0VBMS9ZQkFBNEFBQURjOWdFQTdQWUJBQTRBQUFEdzlnRUEvUFlCQUE0QUFBQUE5d0VBZHZjQkFBNEFBQUI3OXdFQTJmY0JBQTRBQUFEZzl3RUE2L2NCQUE0QUFBRHc5d0VBOFBjQkFBNEFBQUFBK0FFQUMvZ0JBQTRBQUFBUStBRUFSL2dCQUE0QUFBQlErQUVBV2ZnQkFBNEFBQUJnK0FFQWgvZ0JBQTRBQUFDUStBRUFyZmdCQUE0QUFBQ3crQUVBdS9nQkFBNEFBQURBK0FFQXdmZ0JBQTRBQUFBQStRRUFVL29CQUE0QUFBQmcrZ0VBYmZvQkFBNEFBQUJ3K2dFQWZQb0JBQTRBQUFDQStnRUFpZm9CQUE0QUFBQ1ArZ0VBeHZvQkFBNEFBQURPK2dFQTNQb0JBQTRBQUFEZitnRUE2Zm9CQUE0QUFBRHcrZ0VBK1BvQkFBNEFBQUFBK3dFQWt2c0JBQTRBQUFDVSt3RUE3L3NCQUE0QUFBRHcrd0VBK2ZzQkFBVUFBQUFBQUFJQTM2WUNBQWtBQUFBQXB3SUFPYmNDQUFrQUFBQkF0d0lBSGJnQ0FBa0FBQUFndUFJQW9jNENBQWtBQUFDd3pnSUE0T3NDQUFrQUFBRHc2d0lBWGU0Q0FBa0FBQUFBK0FJQUhmb0NBQWtBQUFBQUFBTUFTaE1EQUFrQUFBQlFFd01BcnlNREFBa0FBQUFCQUE0QUFRQU9BQU1BQUFBZ0FBNEFmd0FPQUFNQUFBQUFBUTRBN3dFT0FBMEFBQUFBQUE4QS9mOFBBQWtBQUFBQUFCQUEvZjhRQUFrQUFBQXZhRzl0WlM5eWRXNXVaWEl2TG1OaGNtZHZMM0psWjJsemRISjVMM055WXk5cGJtUmxlQzVqY21GMFpYTXVhVzh0TVRrME9XTm1PR00yWWpWaU5UVTNaaTkxYm1samIyUmxMV0pwWkdrdE1DNHpMakU0TDNOeVl5OWphR0Z5WDJSaGRHRXZiVzlrTG5KekFBQ3c4UlFBYWdBQUFFMEFBQUFmQUFBQUwyaHZiV1V2Y25WdWJtVnlMeTVqWVhKbmJ5OXlaV2RwYzNSeWVTOXpjbU12YVc1a1pYZ3VZM0poZEdWekxtbHZMVEU1TkRsalpqaGpObUkxWWpVMU4yWXZkVzVwWTI5a1pTMXViM0p0WVd4cGVtRjBhVzl1TFRBdU1TNHlOQzl6Y21NdmJHOXZhM1Z3Y3k1eWN3QUFBQUVBNVFLRkFCUUFBQUFqQUpJQUhBQjZBQUFBQVFBQUFBQUFiQUFyQUFZQUFBQUFBQUFBRHdBQUFBRUFCd0E2QUFrQURRRUNBQm9BQUFBRUFBZ0FhUUFBQUFBQUFnQVJBQUFBSGdBQUFINEFHd0FGQUFJQUNBQUFBQWNBQkFBR0FBNEFBQUFLQUFJQVZ3QWlBQUFBRXdBQkFBVUFBQUFBQUMwQVFaN20wd0FMdHdFQkFFa0FBd0FCQUZjQUFBQVNBQUFBQUFBQUFBVUFRUUFBQUFBQUF3QUFBQU1BQWdBQ0FCMEFBQUFBQUFBQUVRQUJBQUFBQWdBQkFBQUFEZ0FBQUFzQUFRQUdBQVVBQUFBQkFBQUFGd0FBQUFBQUFRQUFBQUFBQ2dBQ0FBQUFCQUFMQUJnQUlRQU1BQUVBT0FBQUFBQUFBZ0FEQUFFQUJRQUFBQUFBQ2dBYkFBRUFBQUFBQUFBQUdRQWFBQUFBQUFBQUFBUUFKQUFEQUJrQUJBQUFBQTBBQVFBVEFBQUFFZ0FFQUFBQUJnQURBQVlBQUFBQ0FBOEFRZURuMHdBTHJRTVJBQUVBRVFBUkFBVUFBQUFMQUJNQUhnQUtBQVFBQVFBTUFBb0FBQUFBQUFVQUF3QUdBQUFBQlFBSkFBSUFBQUFBQUFrQUFBQUJBQUFBS1FBQUFCSUFHUUFFQUFBQUFBQUNBQTRBQXdBQkFBOEFCUUFDQUFFQUJBQUhBQVVBQUFBRkFBSUFBQUFBQUFrQUFBQUZBQU1BQ1FBQkFBQUFBQUFCQUFBQUFBQUpBQWNBQndBQUFBQUFBQUFHQUFNQUFBQUtBQUFBQUFBREFBY0FBUUFBQUFBQUFRQWFBQVlBQUFBQkFBa0FBZ0FJQUFBQUFRQUFBQWdBQVFBSkFBWUFGUUFCQUFBQUJBQUFBQUFBQUFBTUFBQUFCUUFEQUFBQUJnQUFBQUFBQ0FBQUFBQUFBd0FIQUFFQUFBQUZBQUVBRUFBSEFBRUFCUUFBQUFBQUJBQUVBQWtBQ3dBQkFBVUFCQUFLQUFnQUF3QVlBQUFBQVFBQ0FBTUFBQUFDQUFBQUJ3QUFBQU1BQUFBRkFBY0FDUUFQQUFZQUFBQUZBQU1BQ1FBTEFCTUFBZ0FCQUFBQUFRQUJBQUFBQVFBQUFBRUFBd0FQQUFBQUJBQUFBQUFBQndBSEFBSUFBQUFBQUFBQUFnQUVBQXNBQUFBTUFBRUFBQUFBQUFJQUJBQUlBQUlBQWdBQUFBWUFBQUFMQUFFQUFRQU1BQVlBQUFBRUFBSUFDd0FCQUFBQUFRQUFBQUFBQlFBQkFBRUFEZ0FEQUFVQVFaenIwd0FMQ1FNQUFBQUFBQW9BQXdCQnN1dlRBQXRoRXdBQUFBSUFDZ0FBQUFBQUF3QURBQUVBQXdBSEFBUUFBZ0FBQUFJQUFBQUVBQUFBQVFBQkFBNEFBUUFGQUFFQUFnQUdBQUlBQXdBRUFBWUFBZ0FEQUFFQUFRQUZBQUVBQUFBT0FBTUFBZ0FIQUFBQUFBQUtBQVFBQUFBQUFBQUFCZ0JCbk96VEFBdS9BZ1VBQUFBR0FBRUFBQUFEQUFVQUF3QUJBQWNBQVFBQ0FBZ0FDQUFDQUFFQUJBQUFBQVVBQ1FBQ0FBQUFBUUFEQUJBQUFRQUVBQVFBQkFBREFBQUFBQUFCQUFBQUFnQUFBQUFBQVFBQkFCQUFBZ0FEQUFBQUFBQUFBQU1BQVFBQkFBTUFBQUFBQUFJQUFBQUJBQUVBQUFBRkFBSUFBQUFDQUFNQUFBQUdBQUFBQUFBQkFBRUFBQUFBQUFFQUFBQUtBQUFBQndBQUFBRUFBUUFBQUFFQUFRQUVBQU1BQXdBQ0FBY0FBd0FBQUFjQUFBQUFBQU1BQUFBQkFBc0FBUUFDQUFVQUFBQURBQUVBQUFBQUFBTUFBQUFDQUFBQUFBQUFBQUlBQVFBQUFBRUFBZ0FCQUFRQUJRQUVBQUFBQXdBQ0FBQUFBQUFCQUFVQUFnQUhBQUVBQVFBQUFBRUFBQUFCQUFNQUF3QUNBQVFBQUFBQkFBRUFBUUFBQUFBQUF3QUNBQVVBQUFBRkFBOEFBZ0FBQUFFQUFRQUFBQUlBQUFBQUFBQUFBUUFBQUFNQVFlanUwd0FMUndFQUFnQUJBQUVBQXdBQUFBRUFBd0FCQUFBQUFBQUNBQUFBQlFBREFBQUFCZ0FCQUFJQUFnQURBQUVBQXdBRkFBWUFBQUFDQUFNQUNnQUFBQUVBQVFBQ0FBSUFBZ0FFQUVHNjc5TUFDM3NCQUFVQUJBQUJBQUFBQUFBREFBRUFBQUFBQUFJQUFBQUNBQUVBQVFBQ0FBTUFBQUFDQUFBQUFRQUFBQUlBQXdBQUFBSUFBZ0FCQUFBQUFRQUFBQUVBQkFBQkFBQUFCQUFFQUFFQUFBQUFBQUVBQVFBREFBRUFBQUFBQUFFQUFnQUNBQWtBQVFBRkFBSUFBZ0FCQUFBQUFnQUdBQTBBQVFBQ0FBWUFRY0R3MHdBTFFRRUFBQUFIQUFBQUJBQUNBQUFBQWdBREFBRUFBQUFDQUFBQUFRQURBQUFBQVFBQUFBRUFBQUFEQUFJQUFRQUdBQUFBQUFBQUFBRUFBQUFBQUFBQUF3QURBRUdNOGRNQUMrRUJDUUFBQUFBQUFBQUNBQUVBQVFBREFBRUFBUUFBQUFVQUFBQURBQUlBQXdBQkFBRUFBZ0FBQUFNQUFRQUJBQUFBQUFBQkFBQUFBUUFCQUFJQUF3QUJBQUVBQUFBQkFBVUFCQUFBQUFNQUF3QUFBQUlBQXdBQkFBRUFCUUFEQUFFQUFBQUFBQUVBQWdBQkFBTUFDZ0FFQUFBQUFRQURBQUVBQUFBQUFBQUFBUUFBQUFBQUJRQUNBQUFBQVFBQkFBQUFBQUFHQUFVQUF3QUFBQUFBQWdBQUFBRUFBQUFCQUFFQUFRQUJBQUVBQUFBQUFBc0FCQUFBQUFJQUFRQUNBQUlBQVFBQkFBQUFBUUFDQUFFQUFRQUJBQUlBQWdBQUFBUUFBUUFDQUFBQUFBQUJBRUgrOHRNQUMvTWdBUUFBQUFBQUFBQUlBQUVBQVFBQUFBSUFBZ0FEQUFJQUFRQUJBQUlBQUFBQkFBQUFBQUFKQUFFQUFRQUFBQUVBQUFBREFBQUFBUUFHQUFFQUFRQUFBQU1BQVFBQkFBRUFBUUFFQUFJQUFnQUJBQUFBQVFBREFBUUFBQUFEQUFBQUFBQUJBQUVBQVFBQUFPWktBd0FKT2c0QTJ2b2RBT1lZQ0FEbUlQNEE1bnltQUFIU0lBRG0vaTBBNXN3SUFOdzNCd0RtNngwQTVpYitBT2FkQ0FEbWVob0EzT29HQU9aMXBnRG05eTBBNXV1b0FBazlHUUVmVHdZQTVrRUhBT1pxRFFIY0xmNEE1aVRnQWNvaUF3RG1JK0FCNXNzYUFCUzdCUURjV1FNQTVzNElBSVIwRHdEbWJSc0E1dWFvQU9ZTkF3Q0NlZzhBQjNNUkFkeFdBd0Rta2dVQTNDditBT2J1SFFEcVlBTUE1a2ZwQVFjN0V3SG04U3dBNWlyZ0FkeUMwUUhtNWgwQTNQME9BZVkyQndEbTdCMEE1dFlJQU9ZbERRSG0vUWdBM0VRSEFIcktEZ0RtYkJNQkI3d0pBTnk1R2dEbXJkRUI1dVFJQU9aNUdnRGNUUThCNWlVSUFPYS9xZ0RtdnFvQTVsTUpBT2JwcUFEYzR3Z0FIazRHQU9iV0JnQUh5aEVCNW1rTkFlWmtBd0RjT2dvQjVzUWRBQWs2RUFEY1NRTUE2RmdEQU9hSEJBRG1zUm9BSUZBR0FPYlFIQURjS1A0QUViY0ZBT2JWSUFEbUdRZ0FCemNjQUFIemFnSGN5aDBBQ2ZNYkFPYmFIUURwWHdNQTV0MGRBT2FDRHdIcVlRTUFDVVVkQWVaU0F3RG04QjBBNWt3REFOelhIQUFCTndNQTV1M2lBZVp6RXdIbWJoc0FBZW9nQU9hckRnSG03d2NBNWgwSUFBRm8wUUhjMXVnQkFkUWNBT1puQXdEbWlORUI1dUFjQU9icUNBRG0yaHdBNWpVSEFCTEhCUUFKVFF3QTNDTURBT2FZQlFEbVNnOEI1dDhkQU56b0lBQUpseDBCNXVFZEFOd1dBd0RtZkJvQTVrWHBBZWJaSFFEY1d3Z0Flc2tPQUFsTkRRRG04QzBBQ0prd0FBblNGd0RtZXFZQTVxclJBUTYwQlFEbTR4MEFDY0FSQWVhczBRSG1Wd01BQ2VBWkFlWUxBd0RtUGdNQUFlTWNBT2I0SEFBSmhBOEE1c3NkQU53WEF3RG1nd1FBM0VzUEFkd21Bd0RtMGh3QTV0QWdBT2JFQlFEbXNCb0EzSm9JQU9ZY0NBRG01QjBBQjBZVUFRZkFGUUVIT2hnQjVra1BBZVpaQmdEbWJ4c0EzQzBEQUhhNERnQUJucndCM0RRSEFPWnFFd0hjTGdNQUFlVWdBT2I3Q0FBSmZ5MEE1a1RwQWVZWTRBSG03eDBBNWtucEFlYnVMUURtWHhNQTVna0RBT2JDR2dEbWhRUUE1UGdkQU9hR0R3RG1Fd1lBNXRrSUFOemRIQUFKUmhBQjVnUURBTnptQ0FEbUhnZ0E2UFlkQUFjOENRRG03S2dBNXF2UkFlYnNCZ0FjVEFZQTV2VUlBT1pFMGdIbUZPQUIzTVlQQU9iaHFBRGNxZ1VBNWxnR0FPWWc0QUhtMUFnQUJ6d1RBZVlDQXdEY3hCb0E1c1lkQU9hMEdnRFljTkVCNWw0VEFPYWVCUURtL3dnQTNEa0hBT2JsQ2dIYzB1Z0JDWEFRQWVZSUF3RG04Q3dBNXZNZEFPWjlwZ0RXemgwQTNEb0RBTmhtMFFIbU13Y0FDVUVmQWVackF3RGMzaHdBNWhMZ0FkeU5FQURtRVFZQUI3d0tBTnp0SEFEbUp1QUI1a01EQUFIWklBRG1TT2tCQjdjV0FkeEdCd0RtNkIwQTV0Y2dBT2J2TFFEY1ZRTUE1bmNhQUdjNERnRG1KUDRBQ1RNUkFlWnBFd0htOUMwQTNQOE9BZHp0QmdEY0tmNEEzQjREQU9uOEhRRGNOUThBM083a0FlWnREUUhZY2RFQkNaa2FBZVlEQXdEbWR3TUI1aFhnQWVZVEF3RGNNZ01BNW1nVEFlWnNEUUhjTGFrQTV1RUdBT2xpQXdEY2xnVUFJM0FHQU54UER3RUpOUklCNXNNZEFPWVBDZ0htK0MwQTV1U29BTndzQXdBSk93MEEyR1hSQVFrVUZ3QUI1aHdBNXJzYUFPYmFDQUFIUEFzQUhQRUlBTnptQ2dIYzFlZ0I1a1VIQU56QUdnRGM3aUFBM044Y0FPYjVMUURteFJvQTVwY0ZBT1FyTUFEbWx3Z0FDVUlVQWViYkJnQUpCcWdBQ2M0VEFlcGRBd0RtTC80QUI3d01BT2JISFFEbTV3WUF5aUVEQU9acEF3Q0NmQThBNkJvREFPYnhMUURtNkFnQUFmSnFBZVpBQndEYy9SMEE1dTdsQVFkQ0hRSGN1aG9BNXVLb0FBZnBFZ0VCYWRFQjVoRGdBZVlBNEFFS3NBVUEzTVVGQU9Bdk1BRG1lQm9BQ1RRUkFlWUc0QUhtNlIwQTNNOElBT2JNSFFDQ2ZROEE1dHdHQUFrMEZ3QUpPUkFBQitZYkFOd3hCd0RtRWdNQTNOVG9BZVlwQ0FEYytnZ0E1aW5nQWVZakNBRG1EQU1BM0xZYUFPWTE0UUhteUIwQTV1MGRBTnhhQXdEbU1nY0E1dTJvQU9henFnRG1LT0FCM1BZSUFPYm5DQURvN09RQjNEd0hBT1QzSFFEbXJBVUEzTzhnQU9iMEhBRG1hQU1BNWh6Z0FkeUswUUhtSWY0QTV0d2RBT2JVSUFEY213VUE1akpyQWVaYkF3RGMwZ2dBMkJzREFPWjNwZ0RtQStBQkNjb05BTndkQXdEbVRBOEIzQmtQQU56L0hRRG1YUk1BNWc4REFPYmxMUUFCT0FNQTVzNGFBT1pEQndEbU9oa0FDVDhLQVFuTkRBRG1jUnNBNWxRSkFPYWNDQUFCNWlBQUcvQUlBT1pYQmdEbUkvNEE1aEVEQU9hc0RnRUIweUFBRzBzR0FPYmJJQURtM2dnQTVsMEdBT1lKNEFIbWRLWUE1czBJQUFIbkhBQWQ4Z2dBNXA0SUFPYlJIUURjSkFNQTVqZ0tBZWJSSEFEYzFSd0E1akxoQVhySURnRHF6UjBBNWlYK0FDQWFCZ0RtQVFNQTVxRUZBT2I0Q0FEbWh0RUI1Z1VEQU9Zd2F3SG05QjBBNWpBSEFPWWhDQURtOFFjQUI4TVVBZVk5QXdEY3doMEE1aFVHQU56akJnRG1GeG9BNXA4SUFPYXdxZ0RtMVIwQTVoL2dBZVlxQ0FEY0pRTUE1blFUQWVaMkF3SG1Hd2dBNXY4dEFOaHYwUUhtaEFRQTNCZ0RBTnpRNkFIY3BnVUFDVDRaQWRnNUR3RG1ET0FCM0pFRkFPYUgwUUhjYkJzQXl0QWRBT2JZQmdBSE5Cc0E1dW90QUFrL0ZnSG0zUWdBNW9jUEFPYmpMUURtQUFNQTV2R21BT2J5TFFEY3B3VUE1dklkQU9ZZ0NBRG1aUU1BM0h2UkFkeTNHZ0RZYnRFQjNFMERBT2J1NGdFSjdhc0E1cmVxQU9idnFBRG1GQVlBQ1Q4Y0FkemdBZ0VKelFvQUNSVVhBT2JHR2dBUXRnVUFDVFFhQWVwZUF3RG1FQU1BQWZScUFlWWU0QUhjS2dNQTVyS3FBQW5BcVFEbVpnTUFEN1VGQU9iK0NRRG0zd1lBNWlMK0FOelQ2QUhtUUFNQTV0Z2RBT1pJRHdIbStpMEEzSHpSQWVaNHBnRG1KZ2dBQ1N5b0FPYmdIUURtNEtnQTNJTVBBZDR0TUFEbTlSMEE1bk1iQU9ZUDRBRUJaOUVCQ1dBYUFPYmhMUURtYkFNQTV1c0dBRnRXREFEbTV4MEFDVTBMQU9ZTjRBSG0vUzBBNXZjSUFOeFZCZ0RtZTZZQTNETURBQmpCQlFEbVpoTUI0bTNSQVI0WUJnRG1Qd01BNWticEFkd24vZ0RtOEFjQTVnTGdBUW5DRkFIbUhlQUJDVk9wQU9ZemF3SG1HK0FCQWVJY0FPYk5HZ0RtRUFZQTNDeitBT1oycGdBQjhHb0I1dFlnQU54LzBRSGNnZEVCRTdrRkFPWW5DQURjMHdnQUNiOFZBZWFnQlFBaVVnWUE1dDhJQU9aVEJnQUI1QndBQ2M4VEFlWjJHZ0RtNGdZQUNia1FBZHhHRHdFSlJ4b0I1bkFUQWViNUhBRG1YZ1lBNWhZR0FPYjdMUURtYXhNQjNGWUdBTnhJQXdEbUpnMEI1dFlkQU9iOENBRG1YaFFCNWxRR0FPYnNDQURteWdnQTV2QWdBT2JYSFFEbUNnTUF5aWdEQU9ZVUF3RGNXZ2dBNWtzREFPYUowUUhtQ3VBQjV0c0lBTnhPRHdFU3VBVUEzQ0FEQU9iZUhRRG1heHNBM01NYUFOdzdBd0RtekJvQURiTUZBT1kvQndEbXdSb0E2Q3d3QU56V0hBRGNOdzhBNXNFZEFPYitIUURrcVJnQUFlc2dBTnp2Q0FEY1J3TUFCellTQWVhR0JBRG1TUWNBNXQwWEFPWUNFUUhtRndZQUNUd05BT2JxcUFEYzdRZ0E1bEVEQUFjOENnRG03T0lCQ2JZV0FlWVI0QUhtNFNBQTVtc05BUm5DQlFEbWV4b0E1dTRIQU9adUF3RGMrUWdBNXVvZEFBbk5Dd0FMc1FVQTVyTWFBT1p5RXdIbTF3Z0EzSDdSQWVidXFBRG0zQWdBNWpGckFlYm5MUUFoVVFZQTV1UUdBT2FjQlFEbVFnTUEzTFNxQU9hVkJRRG1ObXNCNWc0REFBRTFBd0RtYndNQTVoWUlBT0F1TUFEY1V3TUEzQndEQU9nVkF3RG1jaHNBM0tJRkFPYjJMUURjN2dnQTVpMElBTnpZSEFBVHVnVUE1c2NhQU9heUdnRGNQQU1BM2prWkFBYzNFQURtOGFnQTVoSUdBT2FFRHdIY093Y0E1Z2pnQWVidEJ3RGM3U0FBYTBvT0FBYnhid0VIdWhBQjVrWURBT2IrQ0FEY01RTUFCendNQU9ZTzRBRjZ5dzRBNXFzRkFBSHhhZ0htdkJvQTVoOElBQW1xR3dEbUpBMEIzQ3lwQU9hb0JRRG1lZ01CNXAwRkFPWndHd0RtNkFZQWdYRVBBT2JrTFFEbU5Hc0I1dTB0QUFsTkNnRGNLNmtBNWl3SUFPYnY0Z0htUXRJQjNGUURBTndyQXdEY094a0EzTkVJQU53K0J3RG1CZUFCM0JrREFPYnJMUURtT2djQTVzZ2FBT2FDRHdEbU0rRUIzSURSQVFFMkF3QUp1ZzRBQ2ZhcUFPYjFMUURtQndNQTVzQWRBTnlGRHdIY0x3TUE2VndEQU9iYkhBRGNNQU1BM0xVYUFPYmJIUURtNlMwQWduSVBBT1l4NFFIbVl3TUFCdkJ2QWVic0J3QUo2aElCNW5nREFkejlCd0RhS2pBQTVsc0dBQjhaQmdEY0dBOEFDU3NYQWR4U0NRRG1ndzhBNXBnSUFOeVpDQUFCT1FvQkNVMFRBZWJ4SFFBSW1qQUE1a2NIQU9iaUhRRGMwZWdCM1A0T0FlWVQ0QUhjVGdNQURMSUZBT1kxYXdIY1dRZ0FDWDhRQWR3NEJ3RGNvd1VBNW1jVEFkektHZ0RjZnhvQTVvL2dBZVlBRVFIbVdnWUFDVVFkQWR6UEhRRGNYQVlBNXRNZEFPU3VCUURtRnVBQjV1c0lBTndmQXdCMnVRNEE1Z1RnQVFFMEF3RG1TZ2NBM1BrZEFBSG9IQUFkVFFZQTV0RWdBT2JscUFEbVE5SUJDVTBKQUd0TERnRG04d2NBM3EwRkFOeWtCUURtOUFnQUNVSWZBZWJCcWdEbWhkRUI1dXd0QU9id3FBRG01UjBBNWdZREFPYmpxQURtVVFrQTVnRVJBZWJvTFFEY1NBY0E1dWlvQU9qdDVBSG0yZ1lBQWVVY0FPYTRxZ0RjRFFvQjVpSUlBTW9uQXdBSkwyRUI1aGZnQWR3NUF3RG01aTBBNXVjZ0FQQkZBd0RtTHY0QTVua0RBU1FSQndEYy9RRUI1aXNJQUFsRUd3RGNLUU1BNWxBREFPYXZCUURtL0MwQTV0Z0lBRlJWREFEbUZ3Z0E1aUhnQWViSkdnRG1rd1VBNXRJZEFBZXpxUURteVIwQTVrRURBTnpRQ0FEbThLWUE1dUFJQU9aMUdnRG14UjBBNXA4RkFOeTlHZ0RjdnhvQTNPL2xBZWFVQlFEY3BRVUEzUElIQUFtckd3QUo4aHNBNXUva0FlYXBCUURtOHdnQTVndmdBZGh5MFFIbTF3WUE1dGtHQU9acUF3RGMyUndBM0VjUEFlYWZwZ0FWdkFVQTV1RUlBT1kwNFFIY1h3WUE1dWVvQU9ZQjRBSG1KK0FCNXE3aUFlYjdIUUJyU0E0QTNMZ2FBTndZR2dBQjJDQUFHaDc3QU9adnBnRG00aTBBNXZNdEFPYVpCUUFKT1JnQkNkQVRBV2M1RGdEZW1nVUE1aWNOQWVZOUJ3RGNVQThCNXNzSUFPYlVIUURtN3l3QTNFSUhBTnlMMFFIbTFRZ0EzTndjQU9iZ0xRRGNtd2dBNW5tbUFPYnBJQURjNlFnQTVqRGhBUUhhSUFEbTNDQUFCME1aQWViZ0JnRG1ucVlBNXVVSUFPWTI0UUhjN0NBQWEwa09BT1p0QXdEbWNSTUJGNzhGQUFuRXFBRG02d2NBM0NyK0FOeDkwUUVKelFrQUZyMEZBSUtBRHdEbVJBTUFnbnNQQUFkSzZRRUFBQUFBQUFBQUFGMENBd0JkQUFBQUFnQUpBQVFBaHdBR0FEVUJBUUFBQUFBQUJBQURBT0VBZUFBQUFBSUFLUUFJQUk4QUpBQUFBQUFBQUFBeEFBQUFBQUJ0QUFBQU13QUJBRXdBQUFBQkFBQUFBQUFJQUh3QUJnQk1BRVVBS2dBQ0FBQUFBQUFBQUFvQUFBQUFBRmtBQUFBUUFBTUFDUUFPQUFZQUFRQU1BQkFBQUFBQUFBQUFQUUFBQUFBQUtnQUFBQUFBQVFBZ0FBb0FBQUFCQUE0QUFnQVFBQ0lBQUFCaEFBQUFCQUFWQUFBQUJBQURBQUFBQUFBREFBQUFEUUFCQUFFQUpBQURBQVFBQUFBQUFCZ0FXQUFBQUFBQUNnQVpBQkFBQUFBQ0FBQUFBQUFTQUJVQUFBQU1BQWNBQXdBQUFCb0FCd0FNQUFFQUJRQUVBQ0VBQVFBQ0FBQUFBQUFCQUFvQUFBQUtBQUFBQkFBSkFBVUFEUUFGQUFBQUF3QUdBQ1lBQ3dBQUFBUUFCZ0FBQUJNQUFBQUFBQVFBQVFBQUFBQUFBQUFrQUFFQUhRQUJBQUFBQUFBUUFBQUFBUUFCQUFFQUFBQUFBQW9BQUFBTkFBQUFFQUFBQUFZQUJRQUFBQUFBQ1FBREFBRUFRZnFUMUFBTG5RRUNBQUVBQWdBQUFBQUFGZ0FCQUFJQUFBQUJBQUFBQmdBQkFDVUFCUUFBQUFvQURRQUNBQUFBQVFBQUFBQUFFZ0FBQUFBQUFRQUFBQUVBQUFBQkFBQUFCQUFKQUFBQUFRQUVBQUFBQkFBQkFBWUFDd0FEQUFZQUJ3QUFBQUFBQUFBTkFBOEFEZ0FBQUFFQUFRQUVBQThBRUFBQUFBVUFBQUFaQUFFQURnQUFBQWdBQVFBREFBQUFBQUFGQUFFQUFBQUFBQkVBQUFBRUFBVUFBQUFCQUVHZ2xkUUFDNnNCQWdBQkFBQUFBQUFDQUFFQUFRQUZBQWdBQUFBQUFBd0FDZ0FBQUFZQUNRQURBQUVBQmdBQkFBQUFHd0FCQUE0QUFBQUlBQVVBQXdBVkFBQUFBZ0FIQUFzQUF3QUFBQW9BQXdBQUFBWUFBQUFLQUFBQUFRQURBQWdBQUFBSkFBQUFBUUFDQUFBQUJRQUFBQUVBQUFBQUFBQUFGd0FBQUFBQUFnQUFBQVVBRmdBQUFCQUFBd0FFQUJFQUFRQURBQUFBQUFBQUFBUUFBUUFBQUFVQUFBQUNBQUVBQUFBQ0FBQUFBZ0FDQUVIVWx0UUFDNFVCQWdBQUFCSUFBUUFFQUFvQUN3QUVBQUFBQWdBQUFBTUFBQUFFQUFVQUFBQUFBQkVBQVFBR0FBWUFBQUFDQUFBQUFRQUFBQVFBQUFBQUFBRUFBUUFIQUFBQUF3QUtBQUFBQVFBS0FBSUFBQUFCQUFBQUFBQU5BQVVBQVFBQkFBQUFBQUFGQUFZQUNBQUVBQVVBQUFBTEFBQUFCQUFMQUFBQUFBQUJBQVVBQUFBTEFBQUFCZ0JCNHBmVUFBc2hBUUFBQUFRQUFBQUdBQUFBQUFBSEFCTUFCQUFaQUFNQUFRQUFBQUVBQmdBR0FFR01tTlFBQ3hzTUFBSUFBd0FBQUFRQUFBQUJBQUFBQVFBRkFBRUFBUUFDQUFFQVFiQ1kxQUFMTXdrQUFBQUFBQWNBQVFBSkFBWUFCQUFCQUFVQUFBQUJBQUlBQ0FBQUFBa0FBQUFBQUFFQUF3QUxBQUFBQVFBQUFBQUFCUUJCN3BqVUFBdUpBUU1BQUFBQ0FBRUFBZ0FBQUFBQUFBQUVBQUVBQUFBR0FBSUFCUUFJQUJJQUFBQUFBQUFBQXdBQkFBQUFBQUFBQUFJQUF3QURBQUFBQUFBQkFBQUFBUUFBQUFNQUFBQUFBQUlBQVFBRUFBMEFBQUFBQUFzQUFBQUJBQUFBQUFBTUFBQUFBQUFBQUFVQUNBQUNBQUFBQWdBQkFBWUFBUUFCQUFFQUFBQUNBQUFBQlFBQkFBRUFBQUFDQUVHQW10UUFDKzBCRGdBUUFBQUFCUUFFQUFJQUFRQUFBQUFBQXdBQkFBQUFBZ0FCQUFRQUFBQUFBQU1BQUFBQkFBRUFBd0FCQUFVQUFnQURBQVFBQUFBREFBTUFCZ0FBQUFBQUFRQUFBQUlBRGdBQkFBSUFBUUFFQUFJQUJRQUNBQUVBQVFBQUFBRUFBQUFGQUFVQUJnQUdBQVVBQUFBQ0FBRUFBQUFDQUFRQUFRQUFBQVVBQUFBR0FBSUFDQUFBQUFBQUJ3QUJBQUlBQWdBRkFBUUFFUUFBQUFNQUFBQUJBQUFBQVFBRUFBQUFBd0FDQUFBQUFRQURBQUFBQ3dBR0FBQUFCZ0FBQUFRQUFRQUNBQUFBQVFBQUFBSUFBUUFDQUFBQUJRQUJBQUFBQUFBQUFBRUFBd0FDQUFZQUFBQUFBQUlBQkFBR0FFSDJtOVFBQzVrQkRBQU1BQUFBQUFBQUFBUUFCQUFBQUFnQUF3QUJBQUFBQVFBQUFBTUFBQUFBQUFVQUFBQUZBQUVBQUFBREFBUUFBUUFDQUFNQUFBQUJBQWNBQUFBQUFBY0FBQUFDQUFJQUFBQUFBQUVBQVFBQkFBRUFDd0FBQUFRQUFBQUJBQUVBQUFBQ0FBRUFBUUFGQUFBQUFBQURBQVlBQUFBQUFBUUFBZ0FCQUFNQUF3QUtBQWNBQUFBRUFBRUFCZ0FBQUFFQUFBQUFBQUlBQVFBQkFFR2FuZFFBQzdFQkFnQUJBQUVBQVFBRUFBQUFBd0FBQUFFQUFBQUFBQUVBQUFBQkFBQUFCQUFBQUFFQUFBQUdBQUFBQVFBQUFBUUFBQUFCQUFJQUJnQUFBQUlBQUFBREFBY0FBQUFEQUFBQUFRQUJBQUFBQUFBREFBVUFBZ0FBQUFFQUFRQUNBQUlBQkFBQkFBQUFBQUFCQUFBQUF3QUNBQUFBQVFBQUFBSUFCQUFDQUFBQUFRQUZBQUFBQUFBQ0FBRUFBUUFBQUFBQUFRQUFBQVVBQWdBQUFBZ0FBd0FCQUFFQUFRQURBQVFBQUFBQ0FBQUFBUUFDQUVIV250UUFDODArQVFBQUFBWUFBQUFBQUFBQUF3QUFBQUFBQWdBQ0FBQUFBUUFEQUFFQUF3QUJBQUlBQUFBQkFBSUFBQUFBQUFFQUFBQURBQUVBQWdBQUFBSUFBUUFBQUFJQUJBQUFBQVVBQlFBQUFBVUFBZ0FBQUFFQUF3QUJBQUFBQWdBR0FBSUFBUUFBQUFBQUFBQURBRlFHU2dZbUJnQUFDUU5wQU1rZUFBQUdBMlVBRlFFQUFBc0RJd1R5QkFBQURBTkhBT1lCQUFBQkExY0FnaDRBQUFFRHhRRDZBUUFBT0FQU0ljOGhBQUFIQTBNQUNnRUFBQWNEZWdCOEFRQUFEQU5KQU04QkFBQUhBM0lBV1I0QUFKa3dTekJNTUFBQVJRTmhINkVmQUFBSEEwRUFKZ0lBQUNNRGF3QXpIZ0FBQkFPWkE5a2ZBQUFCQTBrZlRSOEFBRUlEeWdQWEh3QUFCQU5WQUdvQkFBQ2FNTnN3M1RBQUFFVURiaCt1SHdBQU1RTkNBQVllQUFBSUF4NEU1Z1FBQUNVRFFRQUFIZ0FBTVFOU0FGNGVBQUJGQS9ZZjl4OEFBRGdEY2lKMElnQUFPQU5JSWtraUFBQUJBNzhmemg4QUFKa3d4akRITUFBQUl3TjJBSDhlQUFBSEEzQUFWeDRBQUFFRFVSOVZId0FBS0FOMUFITUJBQUNaTUZzd1hEQUFBQW9EUVFERkFBQUFJd09oQWVNZUFBQVJBMVVBRmdJQUFBY0RVd0JnSGdBQURBUGNBTmtCQUFBQUEwOEEwZ0FBQUFjRGJ3QXZBZ0FBQVFOSEFQUUJBQUFKQTJFQW94NEFBQUVEQ0I4TUh3QUFBUU81QTY4REFBQUJBek1FVXdRQUFFVURJQitRSHdBQUJ3TmlBQU1lQUFCRkF3TWZneDhBQUFnRFZ3Q0VIZ0FBQndOYUFIc0JBQUNaTU1Fd3dqQUFBQWtEb1FIZkhnQUFWUVluQmlVR0FBQVVBNzhEUVI4QUFBRURad0QxQVFBQUFRT2ZBNHdEQUFBQkErb0F2eDRBQUF3RFl3QU5BUUFBUlFNQUg0QWZBQUFCQXhNRUF3UUFBQ01EU3dBeUhnQUFBUU41QVAwQUFBQUJBM2NBZ3g0QUFFVUREaCtPSHdBQUNBTklBQ1llQUFDWk1LWXc5REFBQUFBREFnR3dIZ0FBQVFOc0FEb0JBQUFKQTBVQXVoNEFBQUVET1I4OUh3QUFFUU5wQUFzQ0FBQUVBeU1FN2dRQUFBd0RZUURPQVFBQUFBTVFIeElmQUFBQUF6Z0VYUVFBQUNNRFNBQWtIZ0FBTlJzUkd4SWJBQUFCQTBNQUJnRUFBQ01EVkFCc0hnQUFBd05KQUNnQkFBQUNBNkVlclI0QUFBZ0ROUVJSQkFBQUJ3TmhBQ2NDQUFBQUF3QWZBaDhBQUFjRGJRQkJIZ0FBQXdOMkFIMGVBQUFuQTNNQVh3RUFBQVFEUndBZ0hnQUFCZ05IQUI0QkFBQkZBMjBmclI4QUFBTURid0QxQUFBQU1RTnJBRFVlQUFBeEEzSUFYeDRBQUFBRHNBSHJIZ0FBTlJzTEd3d2JBQUF0QTFVQWRoNEFBQW9EWVFEbEFBQUFtVEJHTUpRd0FBQTFHem9iT3hzQUFBb0RWUUJ1QVFBQVBBa29DU2tKQUFBVEE4a0RZQjhBQURBRFpRQWJIZ0FBQXdOWkFQZ2VBQUF3QTBVQUdoNEFBREVEWkFBUEhnQUFDQU81QThvREFBQ1pNSjB3bmpBQUFBc0RRd1R6QkFBQVBndEhDMHNMQUFBUEEyOEFEUUlBQUNNRGJnQkhIZ0FBQ0FOcEFPOEFBQUF0QTJVQUdSNEFBQWNEV2dGa0hnQUFBUU1ZSHh3ZkFBQUJBd2tmRFI4QUFFVURKeCtYSHdBQUFnTjZBSkVlQUFBQkExa0EzUUFBQURFRFRBQTZIZ0FBUlFOa0g2UWZBQUFDQTdrZXh4NEFBRVVESkIrVUh3QUFBQU1UQVJVZUFBQVBBMmtBQ1FJQUFERURkQUJ2SGdBQUFRTklIMHdmQUFBeEEzb0FsUjRBQUVVREtSK1pId0FBQVFQVUFOQWVBQUFFQThRQTNnRUFBQUVEbHdPSkF3QUFEQU55QUZrQkFBQUJBeEVmRlI4QUFBa0Q5QURWSGdBQUp3TkZBQ2dDQUFBYkEyOEFvUUVBQUFRRHhnRGlBUUFBQ0FPWkE2b0RBQUJGQTg0RDlCOEFBQUVEYlFBL0hnQUFDUU1EQWJNZUFBQUNBMjhBOUFBQUFBd0Rjd0JoQVFBQUFRTjFBUG9BQUFBQkEya2ZiUjhBQUFFRHFRT1BBd0FBT0FNOUFHQWlBQUJGQThZZnh4OEFBQUFEZHdDQkhnQUFCZ01vQWh3ZUFBQXhBMndBT3g0QUFKa3dyVEN1TUFBQUFnTzRIc1llQUFBQ0ExVUEyd0FBQU04TjJRM2NEUUFBQkFPbEEra2ZBQUFVQTZrRGFSOEFBQ2NEZEFCakFRQUFKZ05UQUJnQ0FBQUxBMVVBY0FFQUFKb3diekJ4TUFBQUp3TnJBRGNCQUFBd0EzVUFkUjRBQUFFRGN3QmJBUUFBUWdNd0h6WWZBQUFIQTBjQUlBRUFBTlVNeGd6SERBQUFBQU5wSDJzZkFBQUJBd01Ccng0QUFCRURkUUFYQWdBQVBBa3dDVEVKQUFDWk1HRXdZakFBQUNNRGR3Q0pIZ0FBQVFQMUFFMGVBQUFBQS93QTNBRUFBQThEU1FBSUFnQUFBZ05wQU80QUFBQkZBeU1ma3g4QUFBQUQ5QURUSGdBQUNBTkxCUGtFQUFCRkF5NGZuaDhBQUFBRFpRRG9BQUFBQ0FOSkFNOEFBQUFCQXlnZkxCOEFBQUFER0I4YUh3QUFVd1luQmlJR0FBQUJBeUFmSkI4QUFEZ0RBeUlFSWdBQUJBTjVBRE1DQUFBQUF6a2ZPeDhBQUNVRFlRQUJIZ0FBQ1FONUFQY2VBQUFEQTY4QjdoNEFBQUVEYndEekFBQUFJd05rQUEwZUFBQ1pNRTh3VURBQUFFVURBUitCSHdBQUNRUEtBTUllQUFBSUE5SUQxQU1BQUFFRFVCOVVId0FBQUFNQkh3TWZBQUJGQTZrRC9COEFBQWdESndUMEJBQUFBZ05UQUZ3QkFBQUJBMUlBVkFFQUFBWURSUUFVQVFBQUl3TlRBR0llQUFBR0EyY0FId0VBQURnRGRpSjRJZ0FBQUFNMUJGQUVBQUNaTUxVd3RqQUFBQXNEYndCUkFRQUFCQU1ZQk9JRUFBQUhBMk1BQ3dFQUFBRUQwZ1BUQXdBQU9BTjhJdUFpQUFBRUEyRUFBUUVBQUFBRHFBRHRId0FBTVFORUFBNGVBQUFSQTJVQUJ3SUFBQUVEK0FEL0FRQUFEQU4xQU5RQkFBQW5BMU1BWGdFQUFKa3dWekJZTUFBQVJRTzNBOE1mQUFBTUEya0EwQUVBQUNjRGJnQkdBUUFBQndONEFJc2VBQUJDQXdBZkJoOEFBQU1Ec0FIdkhnQUFKd05IQUNJQkFBQUpBOElBcUI0QUFDMERiQUE5SGdBQW1UQk5NRTR3QUFBREEya0FLUUVBQUNNRHJ3SHdIZ0FBQWdOUEFOUUFBQUFCQXdJQnJoNEFBQWdEUndUMUJBQUFPQU9vSXEwaUFBQUFBOFVEZWg4QUFCTURrUU1JSHdBQUxRTmtBQk1lQUFBQkE4OEFMaDRBQUE4RFlRQUJBZ0FBQmdPaEhyY2VBQUFqQTNrQTlSNEFBRGdEa0NHYUlRQUFSUU1sSDVVZkFBQUVBMDhBVEFFQUFBWURUd0JPQVFBQW1UQ3pNTFF3QUFBbkEwUUFFQjRBQU5jTGtndVVDd0FBQ0FOVkFOd0FBQUFqQTJVQXVSNEFBSmt3ZXpCOE1BQUFEQU5QQU5FQkFBQUVBMmNBSVI0QUFBd0RhZ0R3QVFBQUl3TlZBT1FlQUFBQkE2RUIyeDRBQUNNRFdRRDBIZ0FBQUFOQkFNQUFBQUNaTUxrd3VqQUFBQWdESXdUd0JBQUFBUU5UQUZvQkFBQ2FNTmd3MmpBQUFBa0RkUURuSGdBQU1BTlZBSFFlQUFBbkExSUFWZ0VBQUFnRE53VGZCQUFBQUFQS0FNQWVBQUE0QTVRaHJpRUFBQVlEc1FPd0h3QUFRZ05oSDJjZkFBQTRBendpUVNJQUFKa3cwakRUTUFBQVJRTnJINnNmQUFBSEEwa0FNQUVBQUNNRFFRQ2dIZ0FBQ1FOVkFPWWVBQUFMQTNVQWNRRUFBSmt3VXpCVU1BQUFtVEJkTUY0d0FBQWpBMHdBTmg0QUFBUURKZ0xnQVFBQUR3TjFCSGNFQUFBb0Ewa0FMZ0VBQUFBRElSOGpId0FBQVFOaEgyVWZBQUJDQXlFZkp4OEFBQUlEWndBZEFRQUFBUU5PQUVNQkFBQURBMDRBMFFBQUFBQURtUVBhSHdBQUFRTy9BOHdEQUFBQUF4VUVBQVFBQUJRRHlRTmhId0FBT0FPaUlxd2lBQUNaTU5zdzNEQUFBQlFEcFFOWkh3QUFEd05TQUJBQ0FBQWpBMDRBUmg0QUFFVUREUitOSHdBQUFnUE5IdGtlQUFBTUEvd0EyZ0VBQUFRRDFnQXFBZ0FBQVFNQUh3UWZBQUNaTU04dzBEQUFBQVlETlFUWEJBQUFPQU1MSWd3aUFBQUFBMWtBOGg0QUFBZ0RGd1RlQkFBQURBTnVBRWdCQUFBTUEwd0FQUUVBQUFFRGFRRjVIZ0FBQ0FNUUJOSUVBQUFCQTZBQjJoNEFBQThEUVFBQUFnQUFBUU55QUZVQkFBQURBMFVBdkI0QUFEVWJEUnNPR3dBQUFRTVNBUlllQUFBQ0Ewb0FOQUVBQUFBRHZ3TjRId0FBbVRCWk1Gb3dBQUFMQTA4QVVBRUFBQ2dEWVFBRkFRQUFtVERZTU5rd0FBQkZBeXNmbXg4QUFBRURRQjlFSHdBQUR3TmxBQVVDQUFCRkE2NER4QjhBQUFFRGFBRjRIZ0FBSmdOMEFCc0NBQUJDQTdrRDFoOEFBRVVEYngrdkh3QUFBUU9sQTQ0REFBQkZBd2tmaVI4QUFBQURWUURaQUFBQURBTkJBTTBCQUFBbkEwTUF4d0FBQUFjRFJnQWVIZ0FBQVFPMUE2MERBQUErRFVjTlN3MEFBQkVEWVFBREFnQUFDQVBWQUU0ZUFBQUFBOGtEZkI4QUFBWURRd1JlQkFBQUFRUCtIOTRmQUFBQkE1a0RpZ01BQUFjRGVRQ1BIZ0FBQkFOYUhsd2VBQUFQQTNVQUZRSUFBTDRKeHduTENRQUFOUnNIR3dnYkFBQXdBMmtBTFI0QUFKb3dlekI5TUFBQW1URElNTWt3QUFBNEE3TWk2eUlBQUFFRHNBSHBIZ0FBQUFONUFQTWVBQUFIQTFjQWhoNEFBQ2dEYVFBdkFRQUFJd05hQUpJZUFBQkNBOFVENWg4QUFBa0RUd0RPSGdBQVFnTXBIeThmQUFBQUE2QUIzQjRBQUVVREtoK2FId0FBQVFOTkFWTWVBQUE0QTlBaHpTRUFBQ2dEVlFCeUFRQUFNUU5vQUpZZUFBQU1BMmdBSHdJQUFBRURUQUE1QVFBQU9BT0dJb2dpQUFBVUE1OERTUjhBQUFZRHBRUG9Id0FBVmd0SEMwZ0xBQUNaTUhVd2RqQUFBQVFEV3g1ZEhnQUFSUU5xSDZvZkFBQW5BMVFBWWdFQUFBTURBZ0cwSGdBQUV3T2ZBMGdmQUFCQ0F3a2ZEeDhBQUFZREVBVFFCQUFBQUFOTkFWRWVBQUFFQTBNRTd3UUFBRGdEa2lHYklRQUFPQU5oSW1JaUFBQUVBL1VBTFFJQUFCTUR1UU13SHdBQUNBTnZBUFlBQUFBSEEzTUFZUjRBQUJzRGRRQ3dBUUFBbVRDM01MZ3dBQUFIQTJJZWFCNEFBQVlEUVFBQ0FRQUFGQU9YQXlrZkFBQUNBMk1BQ1FFQUFBSURhZ0ExQVFBQUFRUGxBUHNCQUFBbUEzTUFHUUlBQUVVRGRCL0NId0FBQ1FObEFMc2VBQUFNQTFvQWZRRUFBRGdESlNJbUlnQUFFd09wQTJnZkFBQW5BM0lBVndFQUFBQURDUjhMSHdBQUNBTTJCTjBFQUFCRkF3Z2ZpQjhBQURFRFlnQUhIZ0FBT0FOekluVWlBQUFqQTFZQWZoNEFBQ01EVHdETUhnQUFCQU11QWpBQ0FBQlVCdFVHd0FZQUFCTURzUU1BSHdBQUF3TlBBTlVBQUFBQkF3RWZCUjhBQUFRRFpRQVRBUUFBSXdORkFMZ2VBQUMrQzhZTHlnc0FBRGdEWlNKeElnQUFGQU9SQXdrZkFBQUFBeElCRkI0QUFBY0RUZ0JFSGdBQUNBTm9BQ2NlQUFBUkEwOEFEZ0lBQUFNRFZRQm9BUUFBRkFPaEErd2ZBQUFCQTdFRHJBTUFBQThEVlFBVUFnQUFPQU0rQUc4aUFBQUhBMkVCWng0QUFFVURCQitFSHdBQUFBTkZBTWdBQUFBMUd3a2JDaHNBQUprdy9URCtNQUFBQVFOb0gyd2ZBQUFEQTJVQXZSNEFBQVFEdVFQUkh3QUExd25IQ2N3SkFBQUlBeXNFK0FRQUFDY0RUZ0JGQVFBQVJRTmpINk1mQUFBR0F6Z0VPUVFBQUJRRHNRTUJId0FBSmdOVUFCb0NBQUFIQTNRQWF4NEFBQUVEeVFQT0F3QUFGQU9aQXprZkFBQ1pNTEV3c2pBQUFBSURkUUQ3QUFBQTFnekdETWdNQUFDWk1MMHd2akFBQUFBRGJnRDVBUUFBUWdNNUh6OGZBQUFFQXljQzRRRUFBRGdEQ0NJSklnQUFCZ01ZQkJrRUFBQU1BMFFBRGdFQUFBb0RkUUJ2QVFBQVZBWW5CaU1HQUFBR0EzVUFiUUVBQUFBRHR3TjBId0FBUlFObUg2WWZBQUJGQTJrZnFSOEFBQWNEV3dGbEhnQUFRZ01vSHk0ZkFBQkZBM0Fmc2g4QUFFVUREeCtQSHdBQU1RTlVBRzRlQUFBNEEzc2lnU0lBQURnRGh5S0pJZ0FBUWdNQkh3Y2ZBQUFJQTZVRHF3TUFBRVVEWlIrbEh3QUFBQVBVQU5JZUFBQUVBL1lBS3dJQUFOVU12d3pBREFBQVFnTTRIejRmQUFBNEE3SWk2aUlBQUE4RGNnQVJBZ0FBbVRDL01NQXdBQUFJQStrRTZ3UUFBRGdEZ3lLRklnQUFBQVBMQStJZkFBQUJBOG9Bdmg0QUFBUURXUUF5QWdBQUFRTnBBTzBBQUFDWk1GOHdZREFBQUFjRFJBQUtIZ0FBQWdQTUh0Z2VBQUJGQXlFZmtSOEFBQkVEUVFBQ0FnQUFFUU55QUJNQ0FBQUFBNlVENmg4QUFBQURXUjliSHdBQUJBUGtBTjhCQUFBQUExQWZVaDhBQURnRFRTSnRJZ0FBQVFOdUFFUUJBQUF0QTNVQWR4NEFBQUVEOUFEUkhnQUFRZ1BKQS9ZZkFBQUJBN2NEcmdNQUFBY0RiZ0JGSGdBQUJBTkJBQUFCQUFBQkF4a2ZIUjhBQUFRRHNRT3hId0FBbWpCNE1Ib3dBQUFqQTFjQWlCNEFBQWdEUXdUeEJBQUFMUU5GQUJnZUFBQUlBeFVFQVFRQUFDZ0RUd0RxQVFBQUNBUFpCTnNFQUFBSUF3WUVCd1FBQUFNRDlBRFhIZ0FBQmdPNUE5QWZBQUFIQTJVQUZ3RUFBRUlEYUI5dUh3QUFCQU00Qk9NRUFBQUFBMEVmUXg4QUFBQUQvaC9kSHdBQUFRTlBBTk1BQUFBbkEyUUFFUjRBQUFZREtRSWRIZ0FBQVFONkFIb0JBQUFqQTJJQUJSNEFBRVVEZkIveUh3QUFJd093QWZFZUFBQUJBMkFmWkI4QUFKa3daakJuTUFBQU9BTmtJbkFpQUFBQUF6RWZNeDhBQUNNRFlRQ2hIZ0FBQUFOSUgwb2ZBQUFCQTFVQTJnQUFBRllNUmd4SURBQUFBQVBLQTlJZkFBQU1BN2NCN2dFQUFDTURjZ0JiSGdBQVFnTWdIeVlmQUFBSUF6QUUwd1FBQURnRGdpS0VJZ0FBQVFOWkgxMGZBQUJDQXdnZkRoOEFBQ01EUkFBTUhnQUFMaEFsRUNZUUFBQUVBNUVEdVI4QUFERURTd0EwSGdBQUFBTnBBT3dBQUFBdUEwZ0FLaDRBQUFFRFl3QUhBUUFBUWdOcEgyOGZBQUFUQTdVREVCOEFBSm93enpEUk1BQUFEQU5PQUVjQkFBQlhDMGNMVEFzQUFBRURrUU9HQXdBQUtBTmxBQmtCQUFBQUE3OGZ6UjhBQUVJRHR3UEdId0FBQndORkFCWUJBQUFCQXpnZlBCOEFBSm93ZFRCM01BQUFBUU5MQURBZUFBQUFBd01Cc1I0QUFBTUQ0Z0NySGdBQUFnTkJBTUlBQUFBSUEyVUE2d0FBQUFjRFdBQ0tIZ0FBREFOVUFHUUJBQUFUQThVRFVCOEFBQlFEdFFNUkh3QUFOUnMrRzBBYkFBQUJBeEFmRkI4QUFKb3djakIwTUFBQVJRTW9INWdmQUFBNEEzY2llU0lBQURnRGVpS0FJZ0FBQWdOSEFCd0JBQUFJQTBVQXl3QUFBQ1FEVlFCeUhnQUFSUU1zSDV3ZkFBQW5BMHNBTmdFQUFBSURTUURPQUFBQUFnTm9BQ1VCQUFBSEExSUFXQjRBQUFFRFlRRGhBQUFBREFOTEFPZ0JBQUFKQTBrQXlCNEFBQXdEYkFBK0FRQUFCd05OQUVBZUFBQUVBelllT0I0QUFBUUR4UVBoSHdBQUNnTjVBSmtlQUFBVEE1Y0RLQjhBQUMwRFZBQndIZ0FBQUFOSkgwc2ZBQUExRzBJYlF4c0FBQk1EdHdNZ0h3QUFBUVB2QUM4ZUFBQUJBK2NBQ1I0QUFBZ0RhZ0Y2SGdBQUF3UEtBTVFlQUFBQUE3RURjQjhBQUZRRzBnYlRCZ0FBbVREVk1OWXdBQUJGQXk4Zm54OEFBQUFEdFFOeUh3QUFKQU4xQUhNZUFBQUdBeFVFMWdRQUFBd0RaUUFiQVFBQUFnTlhBSFFCQUFBR0E2QWV0aDRBQUVVREJ4K0hId0FBQVFPb0FJVURBQUFDQTNrQWR3RUFBQzBEYmdCTEhnQUFEQU52QU5JQkFBQkZBOGtEOHg4QUFBSURRd0FJQVFBQUF3TjVBUGtlQUFBakEzUUFiUjRBQUFrRDRnQ3BIZ0FBQUFNd0h6SWZBQUFCQTJzQU1SNEFBRGdEa2lMaklnQUFGQU9WQXhrZkFBQUJBeWtmTFI4QUFDZ0RSUUFZQVFBQVJRTzJIN2NmQUFBRUE5VUFMQUlBQUFZRE1BVFJCQUFBQ0FQMUFFOGVBQUFDQTZBZXJCNEFBQUFEYUI5cUh3QUFBQU9YQThvZkFBQUJBMFVBeVFBQUFBUURhUUFyQVFBQTF3dkdDOHdMQUFBRUEyOEFUUUVBQUFnRFR3RFdBQUFBdmd2SEM4c0xBQUFNQTFVQTB3RUFBRVVEckFPMEh3QUFRZ08vSDg4ZkFBQ2FNTkl3MURBQUFBY0RaZ0FmSGdBQUFBTk9BUGdCQUFBSUEza0Evd0FBQUM0RGFBQXJIZ0FBREFOa0FBOEJBQUFIQTA4QUxnSUFBRUlEV1I5Zkh3QUFtVEN2TUxBd0FBQUVBK1lBNHdFQUFBRUR4UVBOQXdBQUNBTjNBSVVlQUFBVUE3a0RNUjhBQUNNRGRRRGxIZ0FBQ1FOWkFQWWVBQUFNQTVJQzd3RUFBQVlEVlFCc0FRQUFBUVBtQVAwQkFBQUlBMnNCZXg0QUFBOERUd0FNQWdBQUV3Ty9BMEFmQUFBQkE5Z0EvZ0VBQUFNRHdnQ3FIZ0FBQUFOUkgxTWZBQUFKQTdBQjdSNEFBQzBEVGdCS0hnQUFDUU52QU04ZUFBQUFBeGdFRFFRQUFEZ0RxU0t1SWdBQVJRTm9INmdmQUFBMUd6d2JQUnNBQUFBRFFCOUNId0FBUlFNTEg0c2ZBQUFHQThVRDRCOEFBQzBEUkFBU0hnQUExUXpLRE1zTUFBQURBK29BeFI0QUFBWURJd1FPQkFBQUFRUEhBQWdlQUFBTUEzb0FmZ0VBQUFjRFp3QWhBUUFBRVFORkFBWUNBQUFBQTI4QThnQUFBSmt3dXpDOE1BQUFDQU1ZQk9RRUFBQ1pNRkV3VWpBQUFDTURiQUEzSGdBQUZBTzNBeUVmQUFBS0EzY0FtQjRBQUNNRGFRRExIZ0FBQXdOaEFPTUFBQUNaTVBFdytUQUFBRVVEc1FPekh3QUFQZzFHRFVvTkFBQUFBN2tEZGg4QUFEZ0QxQ0hPSVFBQVJRTmlINklmQUFBQ0EzY0FkUUVBQUFRRC9BRFdBUUFBQVFNVEFSY2VBQUNaTUdnd2FUQUFBRUlEWUI5bUh3QUFJd05vQUNVZUFBQVRBNVVER0I4QUFBQUQ2Z0RCSGdBQVFnUExBK2NmQUFBNEEwTWlSQ0lBQUprd2VEQjVNQUFBRXdPWkF6Z2ZBQUF3QTBrQUxCNEFBQWNEZHdDSEhnQUFBUU5sQU9rQUFBQW5BMmdBS1I0QUFEZ0R0U0x0SWdBQVFnT3hBN1lmQUFBR0E1RUR1QjhBQUFFRFRRQStIZ0FBQ1FOQkFLSWVBQUExR3dVYkJoc0FBRGdEUEFCdUlnQUFDQU5aQUhnQkFBQURBd01CdFI0QUFDY0RTQUFvSGdBQUl3TnRBRU1lQUFDWk1HUXdaVEFBQUFnRFZnUlhCQUFBQWdOWkFIWUJBQUJVQnNFR3dnWUFBQUVET2dSY0JBQUFBQVBpQUtjZUFBQUJBNVVEaUFNQUFDY0RZd0RuQUFBQUJ3Ti9BWnNlQUFCVUJrZ0dKQVlBQUprd3F6Q3NNQUFBSXdPZ0FlSWVBQUFJQTlnRTJnUUFBREVEV2dDVUhnQUFEQU5uQU9jQkFBQUFBNThEK0I4QUFDY0RaUUFwQWdBQUl3TkpBTW9lQUFBQUF4RWZFeDhBQUVJRFVSOVhId0FBSXdOTkFFSWVBQUFCQXpBZk5COEFBQ2NEYkFBOEFRQUFSUU1GSDRVZkFBQUFBNkVCM1I0QUFBZ0RGZ1RjQkFBQUJ3TmtBQXNlQUFBdEEwd0FQQjRBQUJRRHdRUGxId0FBQkFQcUFld0JBQUFBQXdnZkNoOEFBQUlEWlFEcUFBQUFBQU9SQTdvZkFBQUJBM0FBVlI0QUFFVURBaCtDSHdBQUNRTUNBYkllQUFBREEzVUFhUUVBQUVVRERCK01Id0FBQVFQTEE3QURBQUFJQTNRQWx4NEFBQUFEbFFQSUh3QUFPQU45SXVFaUFBQWpBM29Ba3g0QUFCRURid0FQQWdBQUtBTnZBT3NCQUFBQUF5QWZJaDhBQUFBREdSOGJId0FBQXdOV0FId2VBQUFNQTJzQTZRRUFBQWdENkFUcUJBQUFBQU9wQS9vZkFBQkNBNmdBd1I4QUFBWUROZ1RDQkFBQUFRUGNBTmNCQUFBRUEzVUFhd0VBQURnRFJTSkhJZ0FBQkFOSkFDb0JBQUFJQXpnRTVRUUFBRmNOUmcxTURRQUFBQU4xQVBrQUFBQTRBN1FpN0NJQUFBZ0RkUUQ4QUFBQUZBUEZBMUVmQUFBSEEyQUJaaDRBQUFZREZnVEJCQUFBR3dOVkFLOEJBQUE0QTZzaXJ5SUFBQUFEVEFGUUhnQUFRZ014SHpjZkFBQkZBeVlmbGg4QUFEZ0RrU0xpSWdBQUFRTlFBRlFlQUFBbkEwd0FPd0VBQUFFRFdnQjVBUUFBQndOQ0FBSWVBQUFUQThFRDVCOEFBQUVEUVI5Rkh3QUFCd05RQUZZZUFBQU1BME1BREFFQUFDTURjd0JqSGdBQW1UQlZNRll3QUFDWk1HOHdjREFBQUFnRFRRVHRCQUFBUlFObkg2Y2ZBQUFCQTY4QjZCNEFBQUFES1I4ckh3QUFOUnMvRzBFYkFBQUNBMFVBeWdBQUFBWURid0JQQVFBQUFRUDhBTmdCQUFDWk1QSXcrakFBQUVVRExSK2RId0FBQVFOTUFWSWVBQUFJQTJFQTVBQUFBRVVEWUIrZ0h3QUFSUU1LSDRvZkFBQUdBMkVBQXdFQUFBQURZQjlpSHdBQUFBT3ZBZW9lQUFBSUF6NEU1d1FBQURnREl5SWtJZ0FBQVFQS0E1QURBQUNhTU5VdzF6QUFBRVVESWgrU0h3QUFBUVBWQUV3ZUFBQkZBMndmckI4QUFBY0RWQUJxSGdBQUJBTTNIamtlQUFES0Rka04yZzBBQUFNRG9RSGhIZ0FBREFOSUFCNENBQUFKQStvQXd4NEFBQXdEVWdCWUFRQUFBd1BVQU5ZZUFBQU1BMFVBR2dFQUFKa3c3ekQzTUFBQUFnTklBQ1FCQUFBakExSUFXaDRBQUFBRHdnQ21IZ0FBTFFOMEFIRWVBQUFJQXkwRTdBUUFBTjhOMlEzZURRQUFDQU5CQU1RQUFBQVBBM1FFZGdRQUFBRUR4Z0Q4QVFBQUFRTXhIelVmQUFBQUEyRWZZeDhBQU1JTXhnektEQUFBQVFQQ0FLUWVBQUFJQThVRHl3TUFBQUVENGdDbEhnQUFRZ05RSDFZZkFBQUFBMkVBNEFBQUFCRURTUUFLQWdBQUp3Tm5BQ01CQUFBSEExa0FqaDRBQUVVRGx3UE1Id0FBQ1FQVUFOUWVBQUFEQTZBQjRCNEFBRUlEL2gvZkh3QUFBUU1hQkF3RUFBQU1BM1FBWlFFQUFBQUQzQURiQVFBQUNBTjRBSTBlQUFBRUE5d0ExUUVBQUFJRFlRRGlBQUFBQWdOYUFKQWVBQUE4Q1RNSk5Ba0FBQnNEVHdDZ0FRQUFFUU5TQUJJQ0FBQURBMjRBOFFBQUFBOERSUUFFQWdBQUNRT3ZBZXdlQUFBRUEwVUFFZ0VBQUFFRElSOGxId0FBQkFNdkFqRUNBQUFHQTVrRDJCOEFBREVEVGdCSUhnQUFBQU00SHpvZkFBQUdBMGtBTEFFQUFBWURhUUF0QVFBQVJRTUdINFlmQUFBQkEwa0F6UUFBQUFBRFZ3Q0FIZ0FBbVREd01QZ3dBQUFNQTFNQVlBRUFBQUFEU1FETUFBQUFtVEJ5TUhNd0FBQUFBeWdmS2g4QUFBY0RTQUFpSGdBQUNRT2dBZDRlQUFBRUErc0I3UUVBQUFjRFl4NXBIZ0FBSXdOdkFNMGVBQUFEQTBFQXd3QUFBRVVEa1FPOEh3QUFLQU5CQUFRQkFBQUhBMmdBSXg0QUFERURiZ0JKSGdBQXlnM2NEZDBOQUFBSUExZ0FqQjRBQUFFRFFRREJBQUFBbVRERU1NVXdBQUFqQTBJQUJCNEFBQUlEY3dCZEFRQUFjUVVEQUFBQUFBQTlBR0FCQUFCL0F2Y0FzUUVBQUFJQUJBQXpBRFlCRndBQkFBQUFrd0h1QVFBQUJnQUFBRlFBTkFBQ0FGUUFTQUlJQUFZQUF3QUFBQUFBQUFCa0FBRUFBQUFBQUFJQUJRQUFBQUFBSGdBMUFBa0FmUUFFQUJJQVdBQUFBQUFBQUFBQ0FFd0FBQUFBQUFZQWFBQUFBQVlBQUFBS0FBWUFBUUQyQUFBQUFBQUNBRVlBQUFBQkFBQUFBd0FBQUVBQkFBQUtBTjhBQVFBQUFBTUFCQUFJQUFVQUJBQVVBREFBV3dBQUFCZ0FxQUFBQUVnQUJBQUFBQVVBQUFCQ0FBQUFhQUFBQUFBQUxRQUFBQUFBQUFBeUFBWUFBQUFmQUdFQUFBQU5BQUFBRXdBRkFDY0FBZ0FDQUFJQUFnQVRBRGNBRUFBQUFCa0FCZ0FBQUN3QVh3QmZBQUFBQVFBQUFBVUFBQUFBQUFVQUJnQWlBRHdBRUFBQUFBQUFBQUFTQUFJQUJBQlJBQUFBQUFBQ0FESUFCZ0FCQUFBQUVRQUZBQVFBZFFBeUFBb0FBQUFXQUE0QUFRQVBBQ2NBQUFBRkFBRUFDZ0FIQUJBQUJBQUJBQUFBQndBUEFBSUFCUUJlQUFBQVNBQVhBQUFBQUFBRUFBQUFBZ0E4QUJ3QUN3QUFBQVFBSXdBQkFBd0FEZ0FGQUJ3QUFBQWdBQUVBQXdBQUFBY0FDQUFFQUFBQUFBQXRBQWdBQUFBQUFETUFFd0FDQUFBQUF3QUFBQVlBUEFBZ0FBQUFDUUFBQUNVQUVnQUpBQUFBQUFBNkFDSUFBQUFDQUFFQUhnQUpBQUlBQWdBREFFR3czZFFBQytrQkN3QUJBQUVBR3dBRUFBY0FEZ0FEQUFBQUF3QUhBQUFBQWdBQ0FDWUFBQUFJQUFNQUJBQUNBQUlBQ0FBSkFBQUFBUUFHQUFFQUF3QUNBQUVBQ0FBQUFBUUFDUUFNQUJNQUFBQUFBQVVBQUFBS0FBQUFGQUFBQUJRQUFBQUJBQUFBQUFBQUFCd0FGZ0FBQUFBQUFnQUVBQUFBQUFBQUFBb0FBQUFBQUFjQUFnQUFBQUFBQkFBQkFBb0FBQUFBQUFrQUJRQXBBQUFBQUFBQkFDQUFBd0FHQUFJQUFRQU9BQk1BQVFBa0FBQUFBUUFCQUFNQUJBQUNBQUlBQ2dBR0FBZ0FBQUFLQUFBQUJBQUFBQTBBQ3dBQUFCTUFDUUFBQUFBQUVnQUFBQVlBQUFBQUFBSUFBQUFBQUF3QVFhVGYxQUFMQ3dJQUFBQVRBQUlBQUFBQ0FFRzQzOVFBQzE4SUFBQUFBQUFCQUFFQUJBQVFBQUFBQ3dBTEFBSUFBUUFBQUFFQUFRQUNBQUlBQVFBQkFBSUFCQUFJQUFBQUFBQUJBQ2tBQVFBT0FBQUFBQUFPQUFBQUN3QUFBQmNBQlFBQUFCVUFDQUFHQUFnQUFBQUNBQXdBQUFBQUFBQUFDQUJCb09EVUFBdHZEQUFBQUFBQUJBQUFBQUFBQUFBUEFBQUFBQUFCQUFjQUFBQVJBQUFBRFFBSUFBNEFDd0FBQUFJQUFRQUFBQVFBQlFBREFBTUFBUUFEQUFnQUFRQWFBQUVBQlFBQkFBVUFCZ0FBQUFFQUFBQUFBQUFBRUFBUEFBSUFCQUFHQUFJQUFnQU1BQmNBQXdBQUFBTUFBQUFCQUVHZzRkUUFDd0VpQUVHdTRkUUFDNDBCSEFBVUFBRUFBQUFDQUFRQUR3QUFBQWNBQVFBQUFBSUFBUUFBQUFBQUFBQUdBQWtBQXdBc0FBa0FCUUFBQUFBQUN3QUlBQjBBQUFBQkFBQUFBQUFBQUFFQUNBQURBQVVBQUFBRUFBQUFBQUFEQUFvQUF3QUFBQVVBQWdBRUFBb0FBQUFBQUFNQUFnQUFBQUlBQUFBT0FBQUFBQUFGQUFBQUNRQVhBQU1BQkFBQUFBRUFCQUFBQUFBQUJ3QVZBRUhLNHRRQUM1OEJDUUFEQUFFQUFRQUJBQVlBQ2dBQUFBQUFCZ0FBQUFFQUFBQUFBQUlBQUFBQUFBRUFBUUFDQUFBQUFBQUFBQU1BQXdBU0FBRUFCZ0FFQUFjQUFBQUJBQUFBTGdBQ0FBRUFDd0FJQUFBQUJRQUFBQUlBQkFBSkFBQUFBQUFJQUFVQUF3QUJBQVlBQUFBQUFBTUFBQUFEQUFZQUJnQUFBQU1BQndBQUFBWUFBUUFBQUFBQUJnQUVBQUFBQUFBQkFBQUFBZ0FBQUFVQUFBQWlBQlFBQmdBQ0FFSHk0OVFBQzE4TUFBQUFDZ0FCQUFJQUJ3QUFBQUlBQVFBQkFBUUFBQUFBQUJJQUFnQUJBQUFBQUFBQUFBTUFBd0FBQUFVQUFBQUFBQU1BQUFBREFBQUFCZ0FBQUFVQUFRQUFBQWdBQkFBQUFBa0FBUUFLQUE0QUFBQUZBQTRBQndBQUFBQUFDQUJCMnVUVUFBdUhBUVFBQUFBQkFBRUFBQUFBQUFJQUFBQUJBQUFBRUFBV0FBRUFBUUFBQUFBQUFBQVJBQUFBQUFBQUFBRUFBQUFBQUFBQUFnQUFBQUVBQmdBQ0FCb0FBQUFMQUFRQUFBQUFBQU1BQmdBQkFBa0FEd0FDQUFVQUFRQWFBQUFBQUFBQUFBRUFBZ0FDQUE4QUFBQUFBQW9BQWdBREFBSUFCd0FHQUFBQUJ3QUVBQXdBQUFBQUFBRUFCd0JCN09YVUFBdHRCQUFBQUFBQUFBQUNBQUFBQUFBQUFBb0FCZ0FBQUFJQUFBQUFBQUFBRFFBQUFBTUFBUUFLQUFBQURBQUFBQUVBQUFBSEFBTUFBZ0FCQUFJQUFRQUhBQU1BQWdBQkFBUUFBUUFBQUFBQUNBQUdBQUFBQUFBQkFBMEFCQUFCQUFJQUFRQUVBQUFBQUFBQUFBY0FBZ0JCNHViVUFBc0JFd0JCN09iVUFBdHpBd0FSQUFFQUFRQURBQVlBQUFBR0FBTUFBUUFBQUFBQUFBQUxBQUFBQkFBR0FBQUFBQUFGQUFBQUFnQUFBQUVBQVFBRkFBRUFCd0FGQUFBQUFRQUJBQUFBQVFBQkFBY0FDUUFCQUF3QUJBQUNBQUVBQUFBRkFBQUFBQUFCQUFJQUFRQUlBQVVBQ3dBQ0FBQUFCd0FCQUFRQUZnQkI4dWZVQUF0MUZnQUFBQUFBRGdBQUFBQUFBZ0FFQUFBQUFBQUNBQUFBQkFBR0FBRUFBQUFBQUFBQURBQUhBQWtBQkFBREFBRUFBUUFKQUEwQUFRQUNBQU1BQUFBRUFBUUFCQUFDQUFBQUFRQUxBQUFBRWdBQUFBTUFBd0FCQUFFQUFRQU9BQUFBQVFBQkFBUUFBUUFDQUFBQUFBQUFBQUVBQUFBQkFFSHc2TlFBQ3dFVEFFSDY2TlFBQzlFQkF3QUFBQUFBQUFBSkFBQUFBUUFIQUFBQUFnQUFBQXdBQVFBREFBQUFBUUFBQUFVQUFRQUFBQUVBQXdBQ0FBa0FBUUFBQUFnQUFRQUZBQUlBQUFBRUFBQUFBUUFGQUFBQUNBQURBQUFBQkFBQUFBQUFCZ0FEQUFNQUFnQUFBQUlBQUFBQ0FBSUFDQUFBQUFvQUJBQVNBQVlBQWdBREFBSUFBQUFCQUFBQUFBQUFBQWNBQVFBR0FBQUFBUUFGQUFzQUFBQU5BQklBQlFBQ0FBUUFBQUFGQUFzQUFBQUhBQVFBQVFBREFBZ0FBd0FDQUFVQUFRQUFBQUlBQWdBQUFBQUFBUUFDQUFBQUFRQUFBQUFBQVFBSUFBTUFRZFRxMUFBTGJ3SUFDQUFBQUFJQUFBQUJBQTRBQUFBQUFBTUFBZ0FHQUFBQUFRQUlBQUlBQlFBQUFBRUFBUUFIQUFZQUFRQUFBQUFBQUFBQ0FBQUFBQUFDQUFFQUFRQUZBQUFBQXdBSkFBSUFBQUFCQUFBQUNRQUJBQUVBQWdBQkFBSUFBd0FDQUFBQUFBQUFBQVlBQVFBQUFBRUFCZ0JCek92VUFBdmZBZ0VBQUFBQUFBRUFBUUFBQUFBQUFRQUFBQUFBQUFBQkFCUUFBQUFBQUFBQUFRQUFBQVlBQVFBQUFBQUFFZ0FBQUFRQUVnQURBQVFBQWdBQUFBQUFBQUFGQUFZQUFBQUJBQUVBQUFBQUFBWUFBZ0FFQUFRQUFnQUFBQUFBQWdBQkFBRUFBQUFCQUFzQUFBQUdBQUFBQUFBQUFBSUFBUUFKQUFFQUFnQVFBQUVBQWdBQ0FBRUFBQUFCQUE4QUNRQUJBQUVBQUFBQUFBRUFBUUFCQUFBQUFBQUFBQUlBQUFBQ0FBQUFBQUFBQUFNQUFRQUhBQThBQlFBRkFBQUFBQUFBQUFFQUJBQUFBQUlBQkFBREFBRUFBUUFDQUFRQUFRQUNBQUVBQWdBQ0FBa0FBQUFCQUFBQUJRQUxBQUVBQUFBQ0FBc0FBQUFFQUFBQUFRQUJBQUVBQUFBSkFBSUFCUUFBQUFRQUF3QUNBQUVBQVFBQ0FBQUFCZ0FLQUFBQUFnQUJBQWtBQVFBQkFBRUFDQUFCQUFJQUFRQUJBQUFBQVFBREFBRUFBUUFCQUFNQUFRQUZBQUVBQXdBQkFBQUFBQUFHQUFBQUJBQUJBQU1BQVFBREFBQUFBUUJCdk83VUFBc0JDd0JCeU83VUFBdGxBd0FHQUFBQUFBQUNBQU1BQXdBQ0FBSUFBQUFFQUFJQUFBQUJBQUVBQ2dBREFBQUFBd0FFQUFFQUFRQURBQUFBQUFBRUFBUUFBUUFDQUFVQURBQUJBQUFBQndBQ0FBRUFBZ0FGQUFFQUFBQUVBQUVBQUFBQUFBRUFBQUFBQUFzQURRQUNBQU1BUWJidjFBQUxBd1VBQlFCQnpPL1VBQXRmQmdBQ0FBSUFBZ0FCQUFFQUFRQUFBQUFBQUFBQkFBQUFBUUFMQUFFQUFRQUJBQUlBQlFBQkFBRUFBd0FFQUFFQUFnQUNBQWdBQUFBQkFBUUFBd0FEQUFFQUNBQUJBQWdBQVFBQUFBUUFDQUFBQUFJQUF3QURBQUFBQUFBQ0FBRUFRYnJ3MUFBTGN3UUFBQUFBQUFBQUNnQUFBQUVBQUFBQUFBQUFBUUFEQUFrQUFBQUNBQUVBQ2dBQUFBRUFBQUFBQUFNQUFBQUJBQUVBQUFBSkFBY0FBUUFDQUFnQUFRQUZBQU1BQWdBQkFBRUFBZ0FDQUFFQUFRQUJBQVVBQUFBQUFBRUFBQUFLQUFNQUFBQUFBQUVBQUFBTUFBQUFCd0FEQUFFQVFiangxQUFMQVFJQVFjN3gxQUFMYndFQUFBQUFBQU1BQVFBQUFBRUFCQUFQQUFBQUFRQUFBQUVBQUFBQUFBQUFDQUFBQUFJQUJnQUJBQUFBQkFBQ0FBQUFBUUFFQUFBQUFnQUNBQUlBQVFBQUFBQUFBZ0FCQUFBQUF3QUJBQUFBQVFBQUFBRUFBUUFDQUFJQUFnQUtBQUVBQVFBQkFBRUFBZ0FDQUFBQUFRQkJ4dkxVQUF1REFRRUFBQUFDQUFnQUFRQUNBQVlBQVFBQUFBSUFBUUFBQUFBQUFBQUJBQUlBQVFBRUFBUUFBUUFBQUFVQUFRQUJBQUVBQUFBQ0FBRUFBQUFBQUFBQUFnQUFBQUVBQUFBQUFBRUFCQUFBQUFrQUFnQU1BQWdBQUFBQkFBQUFCQUFBQUFBQUFRQURBQVFBQWdBQUFBRUFBd0FFQUFBQUFRQUFBQWNBQWdBQkFBUUFBQUFFQUVIVTg5UUFDMGNKQUFFQUFRQUNBQUFBQkFBQkFBRUFBUUFBQUFFQUFRQUJBQUVBQUFBQUFBRUFBUUFEQUFFQUFRQUJBQUlBQUFBREFBRUFBQUFDQUFBQUJBQUJBQUFBQUFBQUFBRUFCd0JCcFBUVUFBdFBCQUFBQUFFQUJ3QUFBQUFBQUFBQkFBUUFBUUFBQUFRQUFnQUNBQUVBQUFBQkFBRUFBUUFDQUFFQUFBQUhBQUFBQUFBR0FBQUFBd0FDQUFJQUFRQUFBQUFBQWdBQUFBRUFBd0FGQUFFQUFRQkIvdlRVQUFzOUFRQUdBQUVBQVFBREFBa0FBQUFCQUFFQUFBQUdBQUFBQXdBQkFBSUFBQUFCQUFJQUJRQUZBQUlBQUFBQkFBUUFBQUFCQUFFQUFRQUJBQUFBQVFCQnhQWFVBQXMvQWdBQUFBQUFBUUFDQUFFQUFBQUFBQUlBQUFBQkFBWUFCZ0FDQUFJQUFBQURBQUlBQXdBQkFBRUFBZ0FCQUFJQUN3QUFBQUVBQUFBQkFBSUFBZ0FFQUVHTzl0UUFDMmtDQUFBQUFBQUFBQU1BQUFBQUFBRUFCZ0FBQUFJQUFRQUFBQU1BQkFBQUFBTUFBQUFCQUFRQUFRQURBQUlBQUFBQUFBSUFBUUFBQUFFQUFRQUJBQVVBQmdBRUFBQUFBQUFBQUFJQUFRQUFBQUVBQVFBRUFBRUFBUUFKQUFBQUFnQUFBQUlBQXdBRkFBSUFRWUwzMUFBTEFRSUFRWXozMUFBTEJ3RUFBQUFCQUFNQVFaejMxQUFMWlFFQUFnQUhBQUVBQUFBQUFBQUFBUUFBQUFBQUNnQUJBQUFBQVFBUUFBSUFDQUFCQUFFQUFnQUJBQUlBQVFBQUFBTUFBZ0FFQUFBQUFnQUNBQUFBQVFBQ0FBRUFBUUFCQUFFQUFBQUFBQUFBQmdBQ0FBVUFBQUFBQUFRQUJBQUJBQVVBQUFBRkFFR08rTlFBQzI4QkFBQUFBUUFBQUFVQUFBQUFBQUFBQlFBQ0FBRUFBd0FKQUFFQUF3QUFBQUFBQWdBQUFBRUFBUUFFQUFJQUFBQUlBQUlBQVFBR0FBQUFBZ0FDQUFNQUFBQURBQUVBQVFBQ0FBSUFBQUFEQUFFQUFBQUFBQUFBQWdBQ0FBQUFBZ0FGQUFFQUFBQUFBQUFBQWdBQ0FBRUFRWkQ1MUFBTEFRRUFRWnI1MUFBTHIrOEJBUUFBQUFjQUFRQUFBQUlBQWdBQUFBRUFBQUFDQUFBQUJnQUNBQUVBQ0FBQUFBSUFBZ0FCQUFRQUFRQUFBQUVBQVFBQ0FBa0FBUUFCQUFFQUJBQUJBQVVBQWdBQkFBRUFCQUFEQUFBQUFBQUJBQUFBQVFBQkFBQUFBUUFBQUFFQUFRQUFBQVFBQkFBQUFEdjVBZ0NYREFFQWFmZ0NBTVVMQVFBKytRQUFId2tCQUM0ZkFBQUtCZ01BQ3ZrQ0FHWU1BUURMK2dBQW5nb0JBSWY2QUFCYUNnRUFXL2tDQUxjTUFRQmwrUUFBUmdrQkFQdjRBZ0JYREFFQU92Z0NBSllMQVFCYkNRQUF5Z0lDQUs4ZkFBQjFCd1FBTFBrQ0FJZ01BUUNJSGdBQWdnUUNBTXNKQUFEVUFnSUFDaDhBQUxJRkF3QXBBZ0FBOGdFQ0FJdjZBQUJlQ2dFQS9mZ0NBRmtNQVFDdCtRSUFDUTBCQUhvZUFBQmtCQU1BbFBrQUFIVUpBUUR2K1FJQVN3MEJBTTc0QWdBcURBRUFyd01BQURNQ0FnQVJBZ0FBMGdFQ0FNajVBQUNwQ1FFQWxmb0FBR2dLQVFEQStRSUFIQTBCQUtrZUFBQy9CQU1BOVFBQUFGb0FBZ0F6K0FJQWp3c0JBRXI1QUFBckNRRUFiUGtBQUUwSkFRQSsrZ0FBRXdvQkFGNzZBQUF6Q2dFQWNoNEFBRklFQWdBZStnQUErZ2tCQUY4QkFBQUdBUUlBWkI4QUFJY0dBd0FISHdBQXF3VURBSWNlQUFDQUJBSUFodm9BQUZrS0FRQXYrUUFBRUFrQkFOMzRBZ0E1REFFQUYvb0NBSE1OQVFCekR3QUFKQU1DQU5BZUFBQW1CUU1BeXZrQUFLc0pBUURJRXdFQUVRc0NBRC80QWdDYkN3RUFtZmtDQVBVTUFRRDIrUUlBVWcwQkFNSWZBQUNYQndNQXZQb0FBSThLQVFEYUh3QUF4d2NDQUxuNUFnQVZEUUVBOWZrQUFOWUpBUUJ6SGdBQVZBUUNBSjM2QUFCd0NnRUFLUjRBQUt3REFnQmYrZ0FBTkFvQkFFbjRBZ0NsQ3dFQVF3OEFBQmdEQWdDaUhnQUFyQVFDQUp6NUFBQjlDUUVBS1FFQUFMUUFBZ0NGSHdBQTF3WUVBTUQ0QWdBY0RBRUFreDRBQUpnRUFnQ0FJZ0FBUlFnQ0FDSDRBZ0I5Q3dFQVVQb0FBQ1VLQVFCM01BQUFsUWdDQVAwQkFBQ3FBUUlBTUFJQUFBUUNBd0J0QVFBQUhnRUNBS0w1QUFDRENRRUFxQjRBQUx3RUF3QmgwUUVBUUFzREFKVDZBQUJuQ2dFQUdoOEFBTmdGQXdDaEFRQUFSQUVDQUNMNUFnQitEQUVBK1I4QUFBSUlBZ0E5K1FBQUhna0JBS3d3QUFDakNBSUE2ZmtBQU1vSkFRQ0pIZ0FBaEFRQ0FEVWZBQUFkQmdNQUwvb0FBQVFLQVFBSytRQUE2d2dCQVB6NUFBRGRDUUVBa2ZnQ0FPMExBUUI5TUFBQW5RZ0NBS1VmQUFCUEJ3UUFjd0VBQUNvQkFnQkord0FBNXdvQ0FNcjZBQUNkQ2dFQWUva0FBRndKQVFEOStRSUFXUTBCQUF2NUFnQm5EQUVBby9rQUFJUUpBUUFxSGdBQXJnTUNBTHNmQUFDUUJ3SUFvUGtDQVB3TUFRQWsrUUFBQlFrQkFIc2VBQUJuQkFNQXkvZ0NBQ2NNQVFEMitBSUFVZ3dCQVBFRUFBQ2dBZ0lBMEI4QUFMUUhBZ0QxSGdBQWpnVUNBRVlCQUFEZUFBSUFMaDRBQUxZREF3QmUrUUFBUHdrQkFCYjVBQUQzQ0FFQVJQb0FBQmtLQVFBVytnQUE4Z2tCQUJ3ZkFBRGVCUU1BNUFVQkFQVUtBZ0JOK1FJQXFRd0JBTG42QUFDTUNnRUFCL2tBQU9nSUFRQmVNQUFBZndnQ0FBMGVBQUJ1QXdJQVNoOEFBRkFHQXdENStRQUEyZ2tCQU1mNUFnQWpEUUVBUy9rQUFDd0pBUUIrK0FJQTJnc0JBRXdOQUFBTkF3SUE3UGtBQU0wSkFRQ3ZBUUFBUmdFQ0FCMzVBZ0I1REFFQTZCNEFBR29GQXdDdElnQUFVd2dDQURUNEFnQ1FDd0VBeUI0QUFCWUZBZ0JTSHdBQVlBWURBRS80QWdDckN3RUFKeDRBQUtnREFnQklId0FBVEFZQ0FPc2ZBQURxQndJQXhQa0FBS1VKQVFEbEhnQUFaQVVDQUxzZUFBRHlCQUlBdGZrQUFKWUpBUUNOSHdBQTlRWUVBSzhlQUFEUkJBTUFlUG9BQUVzS0FRQjErUUlBMFF3QkFMcjVBZ0FXRFFFQUloNEFBSjREQWdEcUhnQUFjQVVEQUNyN0FBQ3hDZ0lBVWZrQ0FLME1BUUF6Q2dBQTNnSUNBTno0QWdBNERBRUE1d0FBQUVBQUFnRDMrQUlBVXd3QkFPdjVBZ0JIRFFFQWRBRUFBQ3dCQWdBZEFRQUFvQUFDQUdiNUFBQkhDUUVBTnZzQUFNc0tBZ0NLK0FJQTVnc0JBRkFFQUFCWUFnSUFYREFBQUgwSUFnRDIrUUFBMXdrQkFLZjVBQUNJQ1FFQWd2b0FBRlVLQVFEWCtnQUFxZ29CQUVFYkFBQk9Bd0lBWFI0QUFDRUVBd0FTSHdBQXlBVURBQWdCQUFCNkFBSUFyQjRBQU1nRUF3RHcrUUlBVEEwQkFBQUJBQUJxQUFJQW92b0FBSFVLQVFEVEF3QUFRZ0lDQUhQNUFBQlVDUUVBQndRQUFFd0NBZ0J3TUFBQWl3Z0NBSGtlQUFCaEJBTUFaUGtBQUVVSkFRQlNEd0FBSEFNQ0FPLzVBQURRQ1FFQVdCNEFBQllFQWdCSitRSUFwUXdCQUhFQkFBQW1BUUlBS2g4QUFQNEZBd0NJQXdBQUdnSUNBRmNCQUFEMkFBSUFQUjhBQURNR0F3Q0wrUUFBYkFrQkFMNHdBQUMxQ0FJQUZ2Z0NBSElMQVFDVkhnQUFuQVFDQUpINUFBQnlDUUVBdGZnQ0FCRU1BUUFRK0FJQWJBc0JBTGo2QUFDTENnRUE3QUVBQUk0QkF3QUpIZ0FBWlFNREFMdjRBZ0FYREFFQTRma0NBRDBOQVFCTytRSUFxZ3dCQUs0ZkFBQnhCd1FBL1I4QUFBb0lBUUFBK2dBQTRRa0JBTXdMQUFENkFnSUFTL29BQUNBS0FRREQrZ0FBbGdvQkFNNGhBQUFaQ0FJQWNTSUFBRHNJQWdETEFBQUFGQUFDQUZFZkFBQmVCZ0lBbWZvQUFHd0tBUUM0TUFBQXJ3Z0NBSDRlQUFCdUJBSUFkZm9BQUVnS0FRQW9ZUUVBTHdzREFIajVBQUJaQ1FFQTVnRUFBSUlCQWdDT0hnQUFqZ1FDQU9iNUFnQkNEUUVBNC9nQ0FEOE1BUUJkQkFBQVlnSUNBTjRCQUFCeUFRTUFZeDhBQUlRR0F3QklIZ0FBN2dNQ0FORDRBZ0FzREFFQUl2b0FBUHdKQVFEUCtnQUFvZ29CQUtNZUFBQ3VCQUlBNHlJQUFGOElBZ0RVK2dBQXB3b0JBRXd3QUFCdENBSUFqZm9BQUdBS0FRRFdCQUFBZGdJQ0FBQWZBQUNZQlFJQU52b0FBQXNLQVFCeStnQUFSUW9CQUtQNUFnRC9EQUVBR3g4QUFOc0ZBd0JkSHdBQWR3WURBS3Y1QWdBSERRRUFGZm9BQVBFSkFRQysrUUFBbndrQkFML1JBUUJXQ3dNQURRRUFBSVFBQWdDMEh3QUFnZ2NEQUVMNUFBQWpDUUVBTkFrQUFNSUNBZ0N1K2dBQWdRb0JBSXI1QWdEbURBRUFQQjhBQURBR0F3RFIrUUlBTFEwQkFOa2ZBQURGQndJQU9COEFBQ1lHQWdDOE1BQUFzd2dDQVB3QUFBQmtBQUlBQlI4QUFLVUZBd0RrSGdBQVlnVUNBQXo1QUFEdENBRUFzeDRBQU4wRUF3RGcrQUlBUEF3QkFHc0JBQUFhQVFJQUVoNEFBSGdEQWdDZitRQUFnQWtCQUxNZkFBQ0FCd0lBWU5FQkFEMExBd0RQQUFBQUhBQUNBTTBBQUFBWUFBSUFOZmdDQUpFTEFRQUMrUUFBNHdnQkFFd0xBQUR1QWdJQW5Qa0NBUGdNQVFCQitnQUFGZ29CQU1YNUFBQ21DUUVBeC9rQUFLZ0pBUUQrTUFBQTN3Z0NBT0FlQUFCV0JRTUFndmdDQU40TEFRQnorUUlBend3QkFBMzZBQUR1Q1FFQVhQb0FBREVLQVFBQStRSUFYQXdCQVAzNUFBRGVDUUVBWWg4QUFJRUdBd0M1K0FJQUZRd0JBUFVCQUFDY0FRSUE4eDRBQUlvRkFnQk0rQUlBcUFzQkFOVUJBQUJhQVFNQXZQa0FBSjBKQVFEbEh3QUEzUWNDQUZzZkFBQjBCZ01BY1RBQUFJMElBZ0M3K1FJQUZ3MEJBS29mQUFCaEJ3UUFsQjhBQUE4SEJBQk9IZ0FBL0FNREFPNEJBQUNVQVFJQTdma0FBTTRKQVFDMCtRSUFFQTBCQUEvNkFnQnJEUUVBM2cwQUFCWURBZ0FWK1FBQTlnZ0JBSWNmQUFEZkJnUUFzdmtBQUpNSkFRQUdHd0FBUEFNQ0FFdjRBZ0NuQ3dFQVBma0NBSmtNQVFBVEFRQUFqQUFDQUdrZkFBQ1ZCZ0lBeHZnQ0FDSU1BUUQvQUFBQWFBQUNBSGNlQUFCY0JBSUFFdm9DQUc0TkFRQkJBd0FBRHdJQkFDZjRBZ0NEQ3dFQVF4c0FBRkFEQWdDNitBSUFGZ3dCQUlmNUFBQm9DUUVBRWhzQUFFWURBZ0RxSWdBQVlRZ0NBSDM1QWdEWkRBRUFhRzBCQURJTEFnQk0rd0FBN1FvQ0FFb2VBQUR5QXdJQUhoNEFBSllEQWdCSUN3QUE2Z0lDQU53SkFBRFlBZ0lBM1FBQUFESUFBZ0J4K1FJQXpRd0JBSi82QUFCeUNnRUFYZ1FBQUdRQ0FnQ2pId0FBUndjRUFOOEVBQUNFQWdJQTNBUUFBSDRDQWdCUUFRQUE3QUFDQU5vQUFBQXNBQUlBNXdFQUFJUUJBZ0F1K1FJQWlnd0JBQmo1QUFENUNBRUF6aDhBQUxBSEFnQXFJd0FBYWdnQkFJRWlBQUJIQ0FJQUR4NEFBSElEQWdEakFBQUFPZ0FDQUVqN0FBRGxDZ0lBQy9vQ0FHY05BUUFkK3dBQXJRb0NBSkFlQUFDU0JBSUFxZ01BQUNrQ0FnQ0IrUUFBWWdrQkFEQWVBQUM4QXdJQXZSNEFBUFlFQWdBTEhnQUFhZ01DQUdJZUFBQXNCQUlBWGZnQ0FMa0xBUUFCQkFBQVNBSUNBSC80QWdEYkN3RUFJaDhBQU9nRkF3Q2srUUlBQUEwQkFGWDRBZ0N4Q3dFQWova0NBT3NNQVFEUStRQUFzUWtCQU0waEFBQVhDQUlBZXZnQ0FOWUxBUUM1SHdBQWpBY0NBTWo0QWdBa0RBRUFaZm9BQURvS0FRQ2tIZ0FBc0FRREFFd0JBQURrQUFJQThBUUFBSjRDQWdDd0h3QUFlUWNDQUswZkFBQnRCd1FBVC9rQ0FLc01BUUIxSHdBQXN3WUNBQVg1QUFEbUNBRUFjZm9BQUVRS0FRRE9BQUFBR2dBQ0FKNzRBZ0Q2Q3dFQUEva0NBRjhNQVFBNStRQUFHZ2tCQUpRTEFBRDBBZ0lBSnZrQ0FJSU1BUUFnK2dBQSt3a0JBS3NlQUFERkJBTUE3d1FBQUp3Q0FnQk5Id0FBV1FZREFFc1RBUUFCQ3dJQUtCOEFBUG9GQWdCVitRSUFzUXdCQUx3ZkFBQ1NCd0lBUWg0QUFPSURBZ0ExK1FBQUZna0JBTHNVQVFBVEN3SUE0UGtDQUR3TkFRQmVBUUFBQkFFQ0FIc0JBQUE2QVFJQU94NEFBTlFEQWdCcUhnQUFRZ1FDQUJRQ0FBRFlBUUlBQ2hzQUFFQURBZ0FsK0FJQWdRc0JBSGdlQUFCZUJBTUE2QUVBQUlZQkFnRHRJZ0FBWndnQ0FJY0RBQUFaQWdFQXp2a0NBQ29OQVFDRStRSUE0QXdCQU9zaUFBQmpDQUlBeXg4QUFLb0hBZ0RGK2dBQW1Bb0JBQWI0QWdCaUN3RUFZUGtBQUVFSkFRQ3orUUFBbEFrQkFBTDZBQURqQ1FFQXVSNEFBTzRFQWdBK0h3QUFOZ1lEQUxFZUFBRFhCQU1BRmZvQ0FIRU5BUUF4K3dBQXdRb0NBQTBmQUFDN0JRTUFxL2tBQUl3SkFRQTUrd0FBendvQ0FGb3dBQUI3Q0FJQXNQa0FBSkVKQVFBYStRQUErd2dCQVBqNUFnQlVEUUVBZC9rQ0FOTU1BUURQQVFBQVRnRUNBQ0FlQUFDYUF3SUFwUGtBQUlVSkFRQjJBUUFBTUFFQ0FCMzZBZ0I1RFFFQTlBUUFBS1lDQWdBUStnSUFiQTBCQUc3NUFBQlBDUUVBdi9rQUFLQUpBUUNlSHdBQU5RY0VBRTM0QWdDcEN3RUFEdm9DQUdvTkFRQUgrZ0FBNkFrQkFPY0VBQUNRQWdJQTR4OEFBTmdIQXdETUF3QUFQQUlDQUtZZkFBQlRCd1FBRHdJQUFNNEJBZ0JkK2dBQU1nb0JBQWNCQUFCNEFBSUFUL29BQUNRS0FRQmsrZ0FBT1FvQkFMelJBUUJPQ3dJQW12a0FBSHNKQVFEVitRSUFNUTBCQUtjZUFBQzVCQU1BK2ZnQ0FGVU1BUUR3K1FBQTBRa0JBSFlFQUFCbUFnSUE2Z0FBQUVZQUFnQnYrQUlBeXdzQkFKTDVBZ0R1REFFQURoNEFBSEFEQWdCZCtRQUFQZ2tCQUluNkFBQmNDZ0VBTHdJQUFBSUNBZ0RMREFBQUJnTURBRUg0QWdDZEN3RUE1Z1FBQUk0Q0FnQmZIZ0FBSmdRQ0FNSUVBQUJzQWdJQTdBUUFBSllDQWdBT0d3QUFSQU1DQUpBREFBQW1BZ01BQlFFQUFIUUFBZ0FaQkFBQVZBSUNBRm41QUFBNkNRRUErREFBQU5rSUFnQWxId0FBOFFVREFNQWVBQUQrQkFNQUpBRUFBSzRBQWdBQkFRQUFiQUFDQU1jQUFBQU1BQUlBL1BrQ0FGZ05BUUF1K1FBQUR3a0JBQkQ1QWdCc0RBRUFoQ0lBQUVrSUFnRGpIZ0FBWHdVREFEUWVBQURFQXdJQXJRTUFBQzhDQWdBcytnQUFBUW9CQUhmNEFnRFRDd0VBbS9rQUFId0pBUURvQUFBQVFnQUNBQ2dlQUFDcUF3SUFvUjRBQUtvRUFnQksrUUlBcGd3QkFGN1JBUUE1Q3dJQU8vZ0NBSmNMQVFCazBRRUFTUXNEQUZUNEFnQ3dDd0VBa3ZnQ0FPNExBUUM3MFFFQVRBc0NBQThCQUFDSUFBSUFZeDRBQUM0RUFnRFRId0FBdXdjREFMWWZBQUNGQndJQVJQa0FBQ1VKQVFBcitRSUFod3dCQVA4QkFBQ3VBUUlBaGdNQUFCY0NBZ0JmK1FJQXV3d0JBREw2QUFBSENnRUFGL29BQVBNSkFRQVhIZ0FBaFFNREFERWZBQUFTQmdJQWdQa0NBTndNQVFBdCtnQUFBZ29CQUk3NEFnRHFDd0VBckI4QUFHa0hCQUE4K2dBQUVRb0JBQWtmQUFDd0JRSUEyeDhBQU1rSEFnREsrUUlBSmcwQkFDOGZBQUFOQmdNQUl3WUFBTEFDQWdENStRSUFWUTBCQUxUNkFBQ0hDZ0VBdng0QUFQc0VBd0NGK1FBQVpna0JBRzRmQUFDakJnTUFaZmtDQU1FTUFRQXArQUlBaFFzQkFDUWVBQUNpQXdJQW92Z0NBUDRMQVFETStBSUFLQXdCQU53cUFBQnJDQUlBOHdRQUFLUUNBZ0NkSHdBQU1RY0VBQ1FmQUFEdUJRTUFyL2tDQUFzTkFRQjMrZ0FBU2dvQkFKUDZBQUJtQ2dFQVlSNEFBQ29FQWdBaEFRQUFxQUFDQU13ZkFBQ3NCd0lBdHZrQ0FCSU5BUUJqK1FJQXZ3d0JBTnNlQUFCSEJRTUFxeDhBQUdVSEJBQmFIZ0FBR2dRQ0FBNzRBZ0JxQ3dFQUN2b0FBT3NKQVFDVStRSUE4QXdCQUJ2NUFnQjNEQUVBN2g0QUFId0ZBd0JuSHdBQWtBWURBTG41QUFDYUNRRUFZL29BQURnS0FRQnkrUUlBemd3QkFIa3dBQUNYQ0FJQTZ2a0FBTXNKQVFBNCt3QUF6UW9DQUo3NkFBQnhDZ0VBQWg0QUFGWURBZ0RPSGdBQUlnVUNBSFVlQUFCWUJBSUFSdm9BQUJzS0FRQkQrd0FBM1FvQ0FBcjRBZ0JtQ3dFQUZRRUFBSkFBQWdCWitRSUF0UXdCQU5Fd0FBRERDQUlBc3ZrQ0FBNE5BUUNOK1FJQTZRd0JBSDc2QUFCUkNnRUFkd0VBQURJQkFnQm4rQUlBd3dzQkFLajZBQUI3Q2dFQWZma0FBRjRKQVFDNCtRQUFtUWtCQUdqNUFBQkpDUUVBU3cwQUFBc0RBZ0JhK2dBQUx3b0JBQVFCQUFCeUFBSUFUQjhBQUZZR0F3Q09Id0FBK1FZRUFNa0ZBUUR6Q2dJQUxSOEFBQWNHQXdBcitnQUFBQW9CQU1YNEFnQWhEQUVBY3g4QUFLOEdBZ0J6K2dBQVJnb0JBRTRCQUFEb0FBSUFtUGtBQUhrSkFRQk4rUUFBTGdrQkFHYjVBZ0RDREFFQUh2a0NBSG9NQVFBNUJBQUFWZ0lDQUpnZUFBQ2lCQUlBaXZvQUFGMEtBUURwQUFBQVJBQUNBT2tmQUFEbUJ3SUFjQUVBQUNRQkFnQ2FFQUVBOXdvQ0FJTVRBUUFGQ3dJQWNDSUFBRGtJQWdDQytRSUEzZ3dCQUsvNUFBQ1FDUUVBcy9vQUFJWUtBUURpK1FBQXd3a0JBTXY1QWdBbkRRRUFSL2tBQUNnSkFRQjREd0FBS2dNQ0FCOENBQURxQVFJQUtQa0NBSVFNQVFEU0JBQUFjZ0lDQUVYNEFnQ2hDd0VBSXg4QUFPc0ZBd0NGSWdBQVN3Z0NBQVA1QUFEa0NBRUFTdmdDQUtZTEFRQS9Id0FBT1FZREFBY2VBQUJnQXdJQUkvZ0NBSDhMQVFEUitBSUFMUXdCQUJFZUFBQjJBd0lBMGg4QUFMZ0hBd0I4QVFBQVBBRUNBT1FBQUFBOEFBSUFZdmtBQUVNSkFRRDBBUUFBbWdFQ0FIb0JBQUE0QVFJQVNQa0FBQ2tKQVFEK0FRQUFyQUVDQUEvNUFnQnJEQUVBT1BnQ0FKUUxBUUFBK0FJQVhBc0JBQ3NoQUFBUENBSUFQdmdDQUpvTEFRQ1ErZ0FBWXdvQkFGMEpBQURPQWdJQWJQa0NBTWdNQVFCTitnQUFJZ29CQUFiNUFBRG5DQUVBTng4QUFDTUdBd0NzK1FBQWpRa0JBT0VmQUFEVEJ3SUF4UjRBQUEwRkF3RExIZ0FBSEFVQ0FFZjVBZ0NqREFFQWJSOEFBS0FHQXdCTUhnQUE5Z01EQU9ZZkFBRGZCd0lBUFBrQ0FKZ01BUURFK1FJQUlBMEJBTzBCQUFDUkFRTUErVEFBQU5zSUFnQ1krQUlBOUFzQkFBejZBQUR0Q1FFQTRBQUFBRFFBQWdDRytRSUE0Z3dCQUdFZkFBQi9CZ0lBZkI4QUFNRUdBZ0NoSHdBQVFBY0RBSHd3QUFDYkNBSUE3aDhBQVBBSEFnRG0rQUlBUWd3QkFGRUVBQUJhQWdJQUZoNEFBSUlEQXdCNUFRQUFOZ0VDQUJRQkFBQ09BQUlBTWg4QUFCUUdBd0ErK3dBQTF3b0NBRW41QUFBcUNRRUFOL2tDQUpNTUFRQXkrUUFBRXdrQkFKc2hBQUFUQ0FJQVR4NEFBUDhEQXdCUkhnQUFCUVFEQUk4ZUFBQ1FCQUlBMURBQUFNY0lBZ0FOK2dJQWFRMEJBT0VlQUFCWkJRTUFKaEFBQURvREFnREMrUUFBb3drQkFDMEJBQUM4QUFJQVpQZ0NBTUFMQVFDTitBSUE2UXNCQU16NUFnQW9EUUVBSkdFQkFDVUxBZ0NZK2dBQWF3b0JBQUg1QWdCZERBRUEwL2tDQUM4TkFRQ1dIZ0FBbmdRQ0FHRDZBQUExQ2dFQVl2b0FBRGNLQVFEOUFBQUFaZ0FDQUFENkFnQmNEUUVBQmg4QUFLZ0ZBd0FvQVFBQXNnQUNBQXNmQUFDMUJRTUFtdmtDQVBZTUFRQncrUUlBekF3QkFCUDZBZ0J2RFFFQUR4OEFBTUVGQXdEeEFBQUFVZ0FDQU5QNEFnQXZEQUVBR2ZrQUFQb0lBUUFwSXdBQWFRZ0JBREw3QUFERENnSUFTUG9BQUIwS0FRQlQrUUFBTkFrQkFIUDRBZ0RQQ3dFQUxnRUFBTDRBQWdCaitRQUFSQWtCQUZNZkFBQmpCZ01BVHZrQUFDOEpBUUJhQ1FBQXlBSUNBQ241QWdDRkRBRUFMQUVBQUxvQUFnQVpBUUFBbUFBQ0FKZjVBZ0R6REFFQXpmb0FBS0FLQVFBYkhnQUFqZ01DQU5ZZUFBQTRCUU1BUmZrQUFDWUpBUUNvSHdBQVd3Y0RBRHI2QUFBUENnRUFUUGtDQUtnTUFRREcrUUFBcHdrQkFFNzdBQUR4Q2dJQUlCOEFBT1FGQWdEVCtnQUFwZ29CQUhnaUFBQkJDQUlBaGg0QUFINEVBZ0F0K1FBQURna0JBRnY2QUFBd0NnRUFTZm9BQUI0S0FRREgrZ0FBbWdvQkFCMzVBQUQrQ0FFQVV2Z0NBSzRMQVFBOEhnQUExZ01DQUNVZUFBQ2tBd0lBT1BrQUFCa0pBUUFaK1FJQWRRd0JBQVVDQUFDNkFRSUFRL2dDQUo4TEFRQXord0FBeFFvQ0FMZ2ZBQUNLQndJQTEva0FBTGdKQVFCSyt3QUE2UW9DQUVjQkFBRGdBQUlBcXZvQUFIMEtBUUJZK0FJQXRBc0JBSW9lQUFDR0JBSUE0UUVBQUhzQkF3QlErUUlBckF3QkFCbjZBZ0IxRFFFQWJQb0FBRUVLQVFDVEh3QUFDd2NFQUhUNkFBQkhDZ0VBQ1FFQUFId0FBZ0JaSHdBQWNnWUNBTlg1QUFDMkNRRUFjUG9BQUVNS0FRQ3ArZ0FBZkFvQkFQVDVBZ0JRRFFFQVNQa0NBS1FNQVFEYitRQUF2QWtCQUNzZUFBQ3dBd0lBOC9rQ0FFOE5BUUJ2QVFBQUlnRUNBSmNmQUFBYkJ3UUFvaDhBQUVNSEJBQlcrUUlBc2d3QkFJRVBBQUFzQXdJQTN4NEFBRk1GQXdCQkhnQUE0QU1DQUYvUkFRQTdDd0lBWmg0QUFEWUVBd0RuK0FJQVF3d0JBTDM2QUFDUUNnRUFLdmtBQUFzSkFRQzYrZ0FBalFvQkFOVWVBQUExQlFNQUtSOEFBUHdGQWdDd0hnQUExQVFEQVBZZkFBRDdCd0lBYWZvQUFENEtBUUF4QWdBQUJ3SURBQm9CQUFDYUFBSUFGdmtDQUhJTUFRRFNBQUFBSUFBQ0FDWWVBQUNtQXdJQTZQa0NBRVFOQVFBekFnQUFEQUlDQURiNUFBQVhDUUVBN0I4QUFPd0hBZ0FDQWdBQXRBRUNBSzM1QUFDT0NRRUFKL2tDQUlNTUFRQlcrQUlBc2dzQkFERUpBQURBQWdJQWNCNEFBRTRFQWdBMUFRQUF4Z0FDQURNZUFBRENBd0lBZ2g4QUFNc0dCQUFuSHdBQTl3VURBQW40QWdCbEN3RUFJUGtBQUFFSkFRQTIrUUlBa2d3QkFFQURBQUFPQWdFQXF3TUFBQ3NDQWdCcytBSUF5QXNCQU5NZUFBQXZCUU1BQXdFQUFIQUFBZ0NvK1FBQWlRa0JBQndCQUFDZUFBSUFMUGtBQUEwSkFRREpBQUFBRUFBQ0FMVDVBQUNWQ1FFQU9ma0NBSlVNQVFBVCtRQUE5QWdCQUZMNkFBQW5DZ0VBRUFJQUFOQUJBZ0R6QUFBQVZnQUNBQVQ0QWdCZ0N3RUFmZmdDQU5rTEFRREorZ0FBbkFvQkFCd2VBQUNRQXdNQUhnRUFBS0lBQWdCc0FRQUFIQUVDQUZrS0FBRGlBZ0lBSnZvQUFQNEpBUUJGK2dBQUdnb0JBQklCQUFDS0FBSUFMdmdDQUlvTEFRQXorZ0FBQ0FvQkFDOFJBUUQvQ2dJQUJnSUFBTHdCQWdEY01BQUEwUWdDQU1zREFBQTZBZ0lBaHZrQUFHY0pBUUF0K3dBQXVBb0RBS2tmQUFCZUJ3TUFUakFBQUc4SUFnRG0rUUFBeHdrQkFMc1ZBUUFiQ3dJQWtSTUJBQXNMQWdBOUd3QUFTZ01DQU5vTkFBQVBBd0lBa3ZrQUFITUpBUUJkQVFBQUFnRUNBSGNFQUFCb0FnSUFzZmtBQUpJSkFRQU5CQUFBVUFJQ0FQY3dBQURYQ0FJQWQva0FBRmdKQVFERStnQUFsd29CQUR2NkFBQVFDZ0VBaS9nQ0FPY0xBUUI1SWdBQVF3Z0NBQUg2QUFEaUNRRUFlUjhBQUxzR0FnQmlNQUFBZ3dnQ0FOYjVBZ0F5RFFFQTdRUUFBSmdDQWdBRitnSUFZUTBCQUtzUUFRRDdDZ0lBOGZrQUFOSUpBUUJVSGdBQURnUUNBTGI0QWdBU0RBRUFKZm9BQVAwSkFRRFRBUUFBVmdFQ0FDMGVBQUMwQXdJQUlnWUFBSzRDQWdDcCtRQUFpZ2tCQU1jTUFBQUFBd0lBZWg4QUFMMEdBZ0JYK2dBQUxBb0JBS2o1QWdBRURRRUE0QUVBQUhnQkF3QUUrUUlBWUF3QkFLY2ZBQUJYQndRQXd4NEFBQWNGQXdDRCtRSUEzd3dCQU13SkFBRFdBZ0lBMUFBQUFDUUFBZ0RaK2dBQXJBb0JBQVFmQUFDaUJRTUFzUGdDQUF3TUFRRFgrQUlBTXd3QkFQdjVBQURjQ1FFQSsva0NBRmNOQVFBWEFnQUEzZ0VDQU1INUFnQWREUUVBaS9rQ0FPY01BUUJXSHdBQWJBWURBT0w1QWdBK0RRRUFKUVlBQUxRQ0FnQjZNQUFBbVFnQ0FCajRBZ0IwQ3dFQWd4NEFBSGdFQWdDM0h3QUFod2NEQU1vZUFBQWFCUUlBOHZnQ0FFNE1BUUNRK1FJQTdBd0JBTi81QWdBN0RRRUFXZmdDQUxVTEFRQUorZ0lBWlEwQkFJUDRBZ0RmQ3dFQTF4OEFBTUFIQXdCeStBSUF6Z3NCQUY3NEFnQzZDd0VBdGZrQ0FCRU5BUUQwK1FBQTFRa0JBQk1DQUFEV0FRSUE5QjRBQUl3RkFnRGErUUlBTmcwQkFEWWVBQURJQXdJQTB3WUFBTHdDQWdELytRSUFXdzBCQUh6NUFnRFlEQUVBL0I4QUFBZ0lBZ0N0K0FJQUNRd0JBUHo0QWdCWURBRUFNUjRBQUw0REFnQ3NBd0FBTFFJQ0FJQWVBQUJ5QkFJQTBnRUFBRlFCQWdBQitRQUE0Z2dCQU4vNUFBREFDUUVBZy9vQUFGWUtBUUJHK1FJQW9nd0JBR1A0QWdDL0N3RUFpeDhBQU8wR0JBQjgrZ0FBVHdvQkFGRUJBQUR1QUFJQXdSOEFBSlVIQWdENCtBSUFWQXdCQUxQNUFnQVBEUUVBcHZnQ0FBSU1BUUN1QXdBQU1RSUNBTW41QWdBbERRRUEyUGtDQURRTkFRQWMrQUlBZUFzQkFMb2VBQUR3QkFJQVUvZ0NBSzhMQVFBWUFRQUFsZ0FDQUxmNEFnQVREQUVBdVBrQ0FCUU5BUUEvK1FJQW13d0JBT0Q1QUFEQkNRRUFoUU1BQUJVQ0FnQ0krQUlBNUFzQkFKMzVBQUIrQ1FFQVd4NEFBQndFQWdERUFBQUFDQUFDQUNKaEFRQWhDd0lBV0RBQUFIa0lBZ0JvSGdBQVBBUURBQ29oQUFBT0NBRUFJZmtDQUgwTUFRQmdJZ0FBTHdnQ0FCLzdBQUN2Q2dJQUFTQUFBQXdJQVFDSUh3QUE0d1lEQUp3ZkFBQXRCd1FBTndFQUFNb0FBZ0F3K2dBQUJRb0JBRWtlQUFEd0F3SUE0ZmtBQU1JSkFRQ1ArZ0FBWWdvQkFEZ1pBUUFkQ3dJQTBma0FBTElKQVFBTEFnQUF4Z0VDQUp6NkFBQnZDZ0VBZ3ZrQUFHTUpBUUI3K1FJQTF3d0JBQUFFQUFCR0FnSUFRUG9BQUJVS0FRQnQrUUFBVGdrQkFFRWlBQUFuQ0FJQUpQa0NBSUFNQVFCeUFRQUFLQUVDQUI4ZUFBQ1lBd0lBay9rQ0FPOE1BUUQ3QVFBQXBRRURBSFVQQUFBbUF3SUFZZ0VBQUF3QkFnRGlBUUFBZmdFQ0FIUURBQUFUQWdFQWwva0FBSGdKQVFEZUJBQUFnZ0lDQU5rQUFBQXFBQUlBNnZrQ0FFWU5BUUNyK0FJQUJ3d0JBSHI2QUFCTkNnRUErdmdDQUZZTUFRQU8rUUFBN3dnQkFJUDVBQUJrQ1FFQWFnRUFBQmdCQWdCbytnQUFQUW9CQVBzQUFBQmlBQUlBRnZvQ0FISU5BUUQ2SHdBQUJBZ0NBQUlmQUFDY0JRTUFBdm9DQUY0TkFRQTZIZ0FBMGdNQ0FHa2VBQUEvQkFNQXJmb0FBSUFLQVFENEJBQUFxZ0lDQU5NRUFBQjBBZ0lBOFI0QUFJVUZBd0NPRXdFQUNRc0NBS1g0QWdBQkRBRUFOL2dDQUpNTEFRQUtIZ0FBYUFNQ0FKYjZBQUJwQ2dFQVRRRUFBT1lBQWdCaTBRRUFRd3NEQUNQNUFBQUVDUUVBdC9vQUFJb0tBUUFSSHdBQXhnVUNBTzRBQUFCT0FBSUF3akFBQUxrSUFnQXgrZ0FBQmdvQkFOWUJBQUJkQVFNQVRmc0FBTzhLQWdEc0FBQUFTZ0FDQUduNUFnREZEQUVBSWZrQUFBSUpBUUIyRHdBQUtBTUNBTFVlQUFEakJBTUFWUUVBQVBJQUFnQmgrZ0FBTmdvQkFBNENBQURNQVFJQVZCOEFBR1lHQXdEWitBSUFOUXdCQUtINkFBQjBDZ0VBaGZrQ0FPRU1BUUJ2K1FBQVVBa0JBSFQ1QWdEUURBRUF4QjRBQUFvRkF3QkVIZ0FBNWdNQ0FQRDRBZ0JNREFFQWdmb0FBRlFLQVFEZStRQUF2d2tCQUtYNUFnQUJEUUVBNmg4QUFPZ0hBZ0MvK2dBQWtnb0JBRmNFQUFCZUFnSUFJUjRBQUp3REFnQ3crZ0FBZ3dvQkFGVWVBQUFRQkFJQStCNEFBSlFGQWdBYitRQUEvQWdCQUZBZUFBQUNCQU1BNndBQUFFZ0FBZ0FLK2dJQVpnMEJBRS81QUFBd0NRRUE1QVFBQUlvQ0FnQTdBUUFBMEFBQ0FHa0JBQUFXQVFJQUFmb0NBRjBOQVFEbCtRQUF4Z2tCQUJyNkFBRDJDUUVBclBnQ0FBZ01BUUJxSHdBQWx3WURBTWdNQUFBQ0F3SUFFZmtBQVBJSUFRQW8rUUFBQ1FrQkFHd2VBQUJHQkFJQUppSUFBQ1VJQWdEcCtBSUFSUXdCQVByNUFBRGJDUUVBNlI0QUFHMEZBd0NBSHdBQXhRWURBQk1mQUFETEJRTUFqUGtDQU9nTUFRQnIrUUlBeHd3QkFQc2ZBQUFHQ0FJQUlQa0NBSHdNQVFCUitRQUFNZ2tCQUM0UkFRRDlDZ0lBM0FBQUFEQUFBZ0FjK2dJQWVBMEJBRUQ1QWdDY0RBRUFUdmdDQUtvTEFRQUQrZ0FBNUFrQkFCVDVBQUQxQ0FFQU1ma0FBQklKQVFDSytRQUFhd2tCQUdrUEFBQWlBd0lBdmZrQUFKNEpBUUN5TUFBQXFRZ0NBTDRmQUFDVUJ3RUF3dmdDQUI0TUFRRFkrZ0FBcXdvQkFONGZBQUROQndJQWp4OEFBUDBHQkFBUitnSUFiUTBCQUY0ZUFBQWtCQUlBeHZrQ0FDSU5BUUJQQVFBQTZnQUNBTll3QUFESkNBSUFhUGtDQU1RTUFRQlMrUUFBTXdrQkFPajRBZ0JFREFFQVVCOEFBRndHQWdCV0hnQUFFZ1FDQU16NUFBQ3RDUUVBMUFFQUFGZ0JBZ0MrK2dBQWtRb0JBQ01CQUFDc0FBSUFQUHNBQU5VS0FnQ1crUUFBZHdrQkFJMGVBQUNNQkFJQTIvZ0NBRGNNQVFBVkFnQUEyZ0VDQUFuNUFBRHFDQUVBSTJFQkFDTUxBZ0JyK2dBQVFBb0JBRWNpQUFBckNBSUEwREFBQU1FSUFnQyswUUVBVXdzREFORUVBQUJ3QWdJQWVmb0FBRXdLQVFCL0hnQUFjQVFDQUJMNkFBRHdDUUVBckNJQUFGRUlBZ0RVK1FBQXRRa0JBTm9lQUFCRUJRTUFEZmtBQU80SUFRQWkrUUFBQXdrQkFJd2ZBQUR4QmdRQUV4NEFBSG9EQWdEME1BQUExUWdDQUlqNkFBQmJDZ0VBeWdBQUFCSUFBZ0FNSGdBQWJBTUNBTDRVQVFBWEN3SUFaUGtDQU1BTUFRRFpNQUFBelFnQ0FBZjVBZ0JqREFFQVlRRUFBQW9CQWdEUStnQUFvd29CQUFQNkFnQmZEUUVBMWg4QUFMNEhBZ0MwK0FJQUVBd0JBSlA0QWdEdkN3RUFSUjRBQU9nREFnQW5ZUUVBTEFzREFPMEFBQUJNQUFJQU5mb0FBQW9LQVFEOEFRQUFxQUVDQUdBZUFBQW9CQUlBZlI0QUFHd0VBZ0JNK2dBQUlRb0JBQUFDQUFDd0FRSUFQL2tBQUNBSkFRQVIrUUlBYlF3QkFHZ0JBQUFVQVFJQWsva0FBSFFKQVFBMkFRQUF5QUFDQUtvZUFBRENCQU1BYWZrQUFFb0pBUURWK0FJQU1Rd0JBSmtlQUFDa0JBSUFieDRBQUV3RUFnQWIrZ0FBOXdrQkFKc2VBQUNtQkFJQUNQZ0NBR1FMQVFCREh3QUFRd1lEQUlENUFBQmhDUUVBV1BvQUFDMEtBUUNvK0FJQUJBd0JBRkl3QUFCekNBSUE2ZmtDQUVVTkFRQkVBd0FBRVFJQ0FEajZBQUFOQ2dFQU5ma0NBSkVNQVFBVUh3QUF6Z1VEQURrZkFBQW9CZ0lBY1I0QUFGQUVBZ0JyK1FBQVRBa0JBUFA1QUFEVUNRRUF0dm9BQUlrS0FRRFlId0FBd3djQ0FKWDVBQUIyQ1FFQStSNEFBSllGQWdBditBSUFpd3NCQUwvNUFnQWJEUUVBTHZvQUFBTUtBUUFVK0FJQWNBc0JBTkg2QUFDa0NnRUFIUjRBQUpNREF3Q1BBd0FBSkFJQ0FLSDRBZ0Q5Q3dFQUtBSUFBUEFCQWdBZStBSUFlZ3NCQUJINEFnQnRDd0VBelFFQUFFb0JBZ0RISHdBQW9RY0RBQ29DQUFEMEFRTUFheDhBQUpvR0F3QWtCZ0FBc2dJQ0FNZ2ZBQUNrQndJQXd2b0FBSlVLQVFEbitRQUF5QWtCQVA3NEFnQmFEQUVBeVRBQUFMOElBZ0FJK1FJQVpBd0JBT2Y1QWdCRERRRUF1L29BQUk0S0FRQWIrZ0lBZHcwQkFEa0JBQURNQUFJQUhmb0FBUGtKQVFEeUhnQUFpQVVDQUpqNUFnRDBEQUVBSC9rQ0FIc01BUUNiK2dBQWJnb0JBSUQ2QUFCVENnRUFYUGtDQUxnTUFRRDErUUlBVVEwQkFCcjVBZ0IyREFFQWNCOEFBS2tHQWdCcitBSUF4d3NCQUZyNEFnQzJDd0VBUGdFQUFOWUFBZ0JRK0FJQXJBc0JBTnNFQUFCOEFnSUFjZmdDQU0wTEFRQncrUUFBVVFrQkFOMEVBQUNBQWdJQUdoNEFBSXdEQWdBTytRSUFhZ3dCQUdVZkFBQ0tCZ01BS2ZrQUFBb0pBUURkSGdBQVRRVURBSWtmQUFEbUJnTUExd1FBQUhnQ0FnQXZIZ0FBdVFNREFHRDRBZ0M4Q3dFQVZSOEFBR2tHQXdDaytnQUFkd29CQUZuNkFBQXVDZ0VBUy9zQUFPc0tBZ0MvK0FJQUd3d0JBT2NlQUFCb0JRSUErUVFBQUt3Q0FnQ1YrUUlBOFF3QkFLOGlBQUJYQ0FJQXR2a0FBSmNKQVFDOEhnQUE5QVFDQVBVRUFBQ29BZ0lBSnZnQ0FJSUxBUUFXQVFBQWtnQUNBRk1FQUFCY0FnSUFSL3NBQU9NS0FnQUlIZ0FBWWdNREFPSDRBZ0E5REFFQTNBRUFBRzhCQXdBRitnQUE1Z2tCQUFqNUFBRHBDQUVBT2ZnQ0FKVUxBUUJmK1FBQVFBa0JBQ29CQUFDMkFBSUFEZ1FBQUZJQ0FnRFRBQUFBSWdBQ0FHa3dBQUNKQ0FJQVJQa0NBS0FNQVFBUCtRQUE4QWdCQUtINUFBQ0NDUUVBMEFFQUFGQUJBZ0NiSHdBQUtRY0VBQVQ2QWdCZ0RRRUFkQjhBQUxFR0FnQWRId0FBNFFVREFQajVBQURaQ1FFQTQva0NBRDhOQVFEaUh3QUExUWNEQUlnaUFBQk5DQUlBd3ZrQ0FCNE5BUURUTUFBQXhRZ0NBTUF3QUFDM0NBSUFieUlBQURjSUFnREkrUUlBSkEwQkFPMzRBZ0JKREFFQVhQZ0NBTGdMQVFBTUh3QUF1QVVEQU1NZkFBQ2FCd0lBOGg4QUFQTUhBd0RzK0FJQVNBd0JBSVg0QWdEaEN3RUFHdm9DQUhZTkFRQVdBZ0FBM0FFQ0FNZjRBZ0FqREFFQWNSOEFBS3NHQWdBSkFnQUF3Z0VDQUpuNUFBQjZDUUVBMFI4QUFMWUhBZ0NVTUFBQW53Z0NBSGo0QWdEVUN3RUFYQjRBQUI0RUF3RHRId0FBN2djQ0FQZjVBQURZQ1FFQTN2a0NBRG9OQVFBbCtRQUFCZ2tCQU5vQkFBQnBBUU1BMVFBQUFDWUFBZ0FJK2dBQTZRa0JBTWtlQUFBWUJRSUFGd0VBQUpRQUFnQTZId0FBS2dZREFQNzVBZ0JhRFFFQUxCOEFBQVFHQXdCTStRQUFMUWtCQUZJZUFBQUlCQU1BU1NJQUFDMElBZ0FlQWdBQTZBRUNBRVFmQUFCR0JnTUFpUGtBQUdrSkFRQkxIZ0FBOUFNQ0FPQWZBQURSQndJQWJCOEFBSjBHQXdCbStnQUFPd29CQUN2NEFnQ0hDd0VBWng0QUFEa0VBd0IyK1FJQTBnd0JBRVA2QUFBWUNnRUFOUjRBQU1ZREFnQTkrQUlBbVFzQkFONzRBZ0E2REFFQUUvZ0NBRzhMQVFCMUFRQUFMZ0VDQUhuNUFBQmFDUUVBUXZrQ0FKNE1BUUQrK1FBQTN3a0JBS1A2QUFCMkNnRUFkUGtBQUZVSkFRQ3ErUUFBaXdrQkFNSDVBQUNpQ1FFQUFDQUFBQXNJQVFBRitRSUFZUXdCQUp3UUFRRDVDZ0lBZi9vQUFGSUtBUUNRK0FJQTdBc0JBSE13QUFDUENBSUE2UGtBQU1rSkFRQ0grQUlBNHdzQkFQb0FBQUJnQUFJQUEvZ0NBRjhMQVFEUCtRSUFLdzBCQUtmNEFnQUREQUVBSVBnQ0FId0xBUUF3K3dBQXZ3b0NBTzhBQUFCUUFBSUF3TkVCQUZrTEF3QTNIZ0FBeWdNQ0FETDVBZ0NPREFFQXJpRUFBQlVJQWdERytnQUFtUW9CQUNzZkFBQUJCZ01BUC9vQUFCUUtBUUJVK2dBQUtRb0JBTnNCQUFCc0FRTUFKaDhBQVBRRkF3QVArQUlBYXdzQkFQQUJBQUNZQVFJQUMvb0FBT3dKQVFCWCtBSUFzd3NCQUJENkFBRHZDUUVBRlBvQ0FIQU5BUUQwK0FJQVVBd0JBTEFEQUFBMUFnTUEwdmtBQUxNSkFRQkMrQUlBbmdzQkFKb2ZBQUFsQndRQTdSNEFBSGtGQXdEWUhnQUFQZ1VEQUVRQkFBRGFBQUlBMUFNQUFFUUNBZ0J3K0FJQXpBc0JBRno1QUFBOUNRRUFrdm9BQUdVS0FRQmkrUUlBdmd3QkFPVDRBZ0JBREFFQUZSNEFBSDhEQXdEZ0lnQUFXUWdDQU5FQkFBQlNBUUlBWlFFQUFCSUJBZ0RTK2dBQXBRb0JBQ3o3QUFDMUNnTUFPUjRBQU04REF3Q3UrUUlBQ2cwQkFNZ0FBQUFPQUFJQXZQZ0NBQmdNQVFEckhnQUFjd1VEQUdyNUFnREdEQUVBK2dFQUFLSUJBd0ROK0FJQUtRd0JBS1Q0QWdBQURBRUFIdmtBQVA4SUFRREhFd0VBRHdzQ0FPOGZBQUR5QndFQW1mZ0NBUFVMQVFEWStBSUFOQXdCQUVjZUFBRHNBd0lBcmlJQUFGVUlBZ0NKQXdBQUhBSUNBSTc2QUFCaENnRUF6QUFBQUJZQUFnQWQrQUlBZVFzQkFFSDVBQUFpQ1FFQWRma0FBRllKQVFCYUNnQUE1QUlDQUtJUEFBQXlBd0lBc1I4QUFIc0hBZ0FHQVFBQWRnQUNBRlQ1QWdDd0RBRUE2d1FBQUpRQ0FnQnlId0FBclFZQ0FLNzRBZ0FLREFFQTFCNEFBRElGQXdDQkhnQUFkQVFDQUVMNkFBQVhDZ0VBSmdZQUFMWUNBZ0JESGdBQTVBTUNBSGNmQUFDM0JnSUE2Z0VBQUlvQkFnRFQrUUFBdEFrQkFCbjRBZ0IxQ3dFQXZ2Z0NBQm9NQVFEWkhnQUFRUVVEQURENUFBQVJDUUVBa2ZvQUFHUUtBUUJmQ1FBQTBnSUNBREQ1QWdDTURBRUFiZmdDQU1rTEFRRHFCQUFBa2dJQ0FPWWVBQUJtQlFJQUFSOEFBSm9GQWdEaUlnQUFYUWdDQU4wZkFBRExCd0lBR1BvQ0FIUU5BUUIyTUFBQWt3Z0NBQWI1QWdCaURBRUF3L2tDQUI4TkFRQUlId0FBcmdVQ0FEc2JBQUJJQXdJQUt3SUFBUGNCQXdDR0h3QUEyd1lFQU1NQUFBQUdBQUlBamdNQUFDSUNBZ0RRQkFBQWJnSUNBTWN3QUFDOUNBSUFXd29BQU9ZQ0FnRDVBQUFBWGdBQ0FIMEJBQUErQVFJQWxCNEFBSm9FQWdBOUhnQUEyQU1DQUxINkFBQ0VDZ0VBMnZnQ0FEWU1BUUJ2SHdBQXBnWURBRGY1QUFBWUNRRUE3dmdDQUVvTUFRREIrQUlBSFF3QkFCUDVBZ0J2REFFQUV2a0FBUE1JQVFCNCtRSUExQXdCQUgvNUFnRGJEQUVBN3dFQUFKWUJBZ0JsSGdBQU13UURBQzhCQUFEQUFBSUF4aDhBQUo4SEFnREErZ0FBa3dvQkFBb0NBQURFQVFJQXdBQUFBQUFBQWdBSklnQUFId2dDQU00REFBQkFBZ0lBRFFJQUFNb0JBZ0NlK1FJQStnd0JBS2NQQUFBMEF3SUFqdmtBQUc4SkFRQUYrQUlBWVFzQkFNRWVBQUFCQlFNQVdRRUFBUG9BQWdETkh3QUFyZ2NDQUVBZkFBQThCZ0lBTS9rQ0FJOE1BUUN3TUFBQXB3Z0NBREFmQUFBUUJnSUFrdzhBQUM0REFnQk1Fd0VBQXdzQ0FBYjZBZ0JpRFFFQW92a0NBUDRNQVFBTStBSUFhQXNCQU5uNUFnQTFEUUVBR1I0QUFJb0RBZ0RGQUFBQUNnQUNBSjhmQUFBNUJ3UUFYZmtDQUxrTUFRRGNEUUFBRVFNQ0FJRWZBQURJQmdNQWRoNEFBRm9FQWdCWCtRQUFPQWtCQURRQkFBREVBQUlBbHg0QUFLQUVBZ0N5SGdBQTJnUURBSnI0QWdEMkN3RUFLUGdDQUlRTEFRQmNBUUFBQUFFQ0FHZjVBQUJJQ1FFQUlnRUFBS29BQWdCbitRSUF3d3dCQUdNQkFBQU9BUUlBS3ZvQUFQOEpBUUFIQWdBQXZnRUNBTmdCQUFCakFRTUFlQjhBQUxrR0FnQlIrZ0FBSmdvQkFJajVBZ0RrREFFQUdQa0NBSFFNQVFEWE1BQUF5d2dDQUMzNUFnQ0pEQUVBb2ZrQ0FQME1BUUJDSHdBQVFBWURBR0FCQUFBSUFRSUF3QXdBQVA0Q0FnQzZNQUFBc1FnQ0FMNGVBQUQ0QkFNQUVCNEFBSFFEQWdEZUhnQUFVQVVEQUZjZkFBQnZCZ01BUVBrQUFDRUpBUUFHSGdBQVhnTUNBQW9CQUFCK0FBSUFSaDRBQU9vREFnQUErUUFBNFFnQkFPNEVBQUNhQWdJQWpQZ0NBT2dMQVFDSitBSUE1UXNCQUxrUEFBQTRBd0lBRFBrQ0FHZ01BUUR4K0FJQVRRd0JBRWdNQUFEOEFnSUFaekFBQUljSUFnQVgrUUlBY3d3QkFQUDRBZ0JQREFFQWV2a0NBTllNQVFCaCtRQUFRZ2tCQUh6NUFBQmRDUUVBZmdNQUFCUUNBUUFrK0FJQWdBc0JBTm9FQUFCNkFnSUFuZmdDQVBrTEFRQmcrUUlBdkF3QkFDd0NBQUQ2QVFNQWIva0NBTXNNQVFBekh3QUFGd1lEQU5YNkFBQ29DZ0VBOS9rQ0FGTU5BUUFsWVFFQUp3c0NBS3I1QWdBR0RRRUE3Q0lBQUdVSUFnQUVBZ0FBdUFFQ0FEc2ZBQUF0QmdNQUpma0NBSUVNQVFDNCtBSUFGQXdCQUlzZUFBQ0lCQUlBUVBnQ0FKd0xBUUF4K1FJQWpRd0JBQmdDQUFEZ0FRSUE2d0VBQUl3QkFnQ20rUUFBaHdrQkFIYjVBQUJYQ1FFQW9CNEFBS2dFQWdCdStBSUF5Z3NCQUpmNkFBQnFDZ0VBQkNJQUFCMElBZ0NsK1FBQWhna0JBSmtmQUFBaUJ3TUFnaDRBQUhZRUFnQjlId0FBd3dZQ0FPa0JBQUNJQVFJQWhQZ0NBT0FMQVFBTUFnQUF5QUVDQUdsdEFRQTBDd0lBdlBrQ0FCZ05BUUJIK0FJQW93c0JBTVQ0QWdBZ0RBRUF5d3NBQVBnQ0FnQXcrQUlBakFzQkFBTWVBQUJZQXdJQUdCNEFBSWdEQWdDMk1BQUFyUWdDQU5UNUFnQXdEUUVBdC9rQUFKZ0pBUURPQVFBQVRBRUNBRFQ1QUFBVkNRRUFzQUVBQUVnQkFnQWZBUUFBcEFBQ0FIUXdBQUNSQ0FJQW5QZ0NBUGdMQVFBbkFnQUE3Z0VDQUhuNUFnRFZEQUVBOHZrQ0FFNE5BUUNrSHdBQVN3Y0VBR0w0QWdDK0N3RUE1ZmdDQUVFTUFRQnVBUUFBSUFFQ0FJejVBQUJ0Q1FFQVh2a0NBTG9NQVFDVytRSUE4Z3dCQUlRZkFBRFRCZ1FBUmZrQ0FLRU1BUUFwQ1FBQXZnSUNBSnY0QWdEM0N3RUFKQ0lBQUNNSUFnQUlHd0FBUGdNQ0FOYjVBQUMzQ1FFQVlCOEFBSDBHQWdCVCtRSUFyd3dCQUc0ZUFBQktCQUlBWWZnQ0FMMExBUUJkQ3dBQThnSUNBRGo1QWdDVURBRUF2ZmtDQUJrTkFRRGsrUUlBUUEwQkFFUDVBZ0NmREFFQVB4NEFBTndEQWdCZ01BQUFnUWdDQUMvNUFnQ0xEQUVBZ1BnQ0FOd0xBUUJpSWdBQU1RZ0NBT3Y1QUFETUNRRUEzUGtBQUwwSkFRQkZId0FBU1FZREFHMzZBQUJDQ2dFQVV4NEFBQXNFQXdDUCtBSUE2d3NCQUZiNUFBQTNDUUVBaFBvQUFGY0tBUURYQVFBQVlBRURBTVVUQVFBTkN3SUE1UUFBQUQ0QUFnQ1FId0FBQVFjREFLYjVBZ0FDRFFFQURoOEFBTDRGQXdCZUNRQUEwQUlDQUUwZUFBRDVBd01BMWdBQUFDZ0FBZ0NXSHdBQUZ3Y0VBS1llQUFDMkJBTUFkUGdDQU5BTEFRREYrUUlBSVEwQkFJSDVBZ0RkREFFQUsva0FBQXdKQVFBRStnQUE1UWtCQUlmNUFnRGpEQUVBWkI0QUFEQUVBd0FyK3dBQXN3b0NBS3Y2QUFCK0NnRUFGZmtDQUhFTUFRQWIrQUlBZHdzQkFGZ0pBQURFQWdJQUIvb0NBR01OQVFBdUFnQUFBQUlDQU16NkFBQ2ZDZ0VBbGZnQ0FQRUxBUURqQVFBQWdBRUNBSVVUQVFBSEN3SUFOUG9BQUFrS0FRQ24rZ0FBZWdvQkFKSWZBQUFIQndRQXlmZ0NBQ1VNQVFBWStnQUE5QWtCQU5yNUFBQzdDUUVBUy9rQ0FLY01BUUFNSWdBQUlRZ0NBSjc1QUFCL0NRRUFWdzhBQUI0REFnQW1BZ0FBN0FFQ0FMZ2VBQURzQkFJQXlnd0FBQVFEQWdEZitBSUFPd3dCQUF3RUFBQk9BZ0lBSnZrQUFBY0pBUUNGSGdBQWZBUUNBRnNCQUFEK0FBSUFlL29BQUU0S0FRQm4rZ0FBUEFvQkFFYjVBQUFuQ1FFQXpma0NBQ2tOQVFCVU1BQUFkUWdDQUdqNEFnREVDd0VBZmZvQUFGQUtBUUNsSGdBQXN3UURBREw0QWdDT0N3RUFvUG9BQUhNS0FRRG9Id0FBNUFjQ0FMSDRBZ0FOREFFQUdRSUFBT0lCQWdEZCtRQUF2Z2tCQU44QkFBQjFBUU1BVnZvQUFDc0tBUURzK1FJQVNBMEJBUFg0QWdCUkRBRUFVREFBQUhFSUFnQmowUUVBUmdzREFMUWVBQURnQkFNQVd2a0FBRHNKQVFEZERRQUFFd01EQUhiNkFBQkpDZ0VBQXdJQUFMWUJBZ0JBR3dBQVRBTUNBT0lFQUFDR0FnSUFrUjRBQUpRRUFnQmErUUlBdGd3QkFPVDVBQURGQ1FFQWFtMEJBRFlMQXdDSitRQUFhZ2tCQUFNZkFBQ2ZCUU1BVkFFQUFQQUFBZ0RiQUFBQUxnQUNBQ1A1QWdCL0RBRUFNZ0lBQUFvQ0FnQklBUUFBNGdBQ0FIejRBZ0RZQ3dFQW9Qa0FBSUVKQVFETytRQUFyd2tCQU1JR0FBQzZBZ0lBUWZzQUFOc0tBZ0NxK0FJQUJnd0JBQno1QWdCNERBRUFrUGtBQUhFSkFRRGlIZ0FBWEFVREFHZ2ZBQUNUQmdJQUlSOEFBT1lGQWdDMytRSUFFdzBCQVBnZkFBQUFDQUlBQ2ZvQUFPb0pBUUMwTUFBQXF3Z0NBRFQ3QUFESENnSUF3Z0FBQUFRQUFnRGpCQUFBaUFJQ0FGa2VBQUFZQkFJQURCc0FBRUlEQWdDVStBSUE4QXNCQUZjZUFBQVVCQUlBR2dJQUFPUUJBZ0RMK1FBQXJBa0JBRzRpQUFBMUNBSUF2QlFCQUJVTEFnQ1crQUlBOGdzQkFIUWlBQUE5Q0FJQTF2b0FBS2tLQVFCMUlnQUFQd2dDQUF3QkFBQ0NBQUlBc2ZrQ0FBME5BUUE3K3dBQTB3b0NBUEg1QWdCTkRRRUFOZ29BQU9BQ0FnREtDd0FBOWdJQ0FNd2VBQUFlQlFJQVdQa0NBTFFNQVFBMSt3QUF5UW9DQUtBQkFBQkNBUUlBR2ZvQUFQVUpBUUE5QVFBQTFBQUNBUFllQUFDUUJRSUFqQU1BQUNBQ0FnQ0IrQUlBM1FzQkFObjVBQUM2Q1FFQXpSNEFBQ0FGQWdCOEhnQUFhZ1FDQU4zNUFnQTVEUUVBSm1FQkFDa0xBd0R0K1FJQVNRMEJBRkw1QWdDdURBRUFIL2tBQUFBSkFRQUMrUUlBWGd3QkFIcjVBQUJiQ1FFQS8vZ0NBRnNNQVFBMytnQUFEQW9CQUVUN0FBRGZDZ0lBN3ZrQ0FFb05BUUJlQ2dBQTZBSUNBRXNmQUFCVEJnTUE4dmtBQU5NSkFRQnRIZ0FBU0FRQ0FHUUJBQUFRQVFJQXpRTUFBRDRDQWdENk1BQUEzUWdDQUxMNkFBQ0ZDZ0VBUUI0QUFONERBZ0JXQVFBQTlBQUNBRlA2QUFBb0NnRUFuL2tDQVBzTUFRQnQrUUlBeVF3QkFLZjVBZ0FERFFFQUdSOEFBTllGQWdDNitRQUFtd2tCQVBBZUFBQ0NCUU1BMHZnQ0FDNE1BUUJjRHdBQUlBTUNBTDNSQVFCUUN3TUFzaDhBQUgwSEF3QmxNQUFBaFFnQ0FOdjVBZ0EzRFFFQWlnTUFBQjRDQWdDUkh3QUFCQWNEQURyN0FBRFJDZ0lBdnZrQ0FCb05BUUM2SHdBQWpnY0NBUFFBQUFCWUFBSUFTd3NBQU93Q0FnQVErUUFBOFFnQkFGdjVBQUE4Q1FFQWR2Z0NBTklMQVFBZitBSUFld3NCQUwzNEFnQVpEQUVBVlBrQUFEVUpBUUFpK0FJQWZnc0JBQUVDQUFDeUFRSUFoQjRBQUhvRUFnQUkrZ0lBWkEwQkFNLzVBQUN3Q1FFQXFma0NBQVVOQVFCMkh3QUF0UVlDQUdyNUFBQkxDUUVBNC9rQUFNUUpBUUJFK0FJQW9Bc0JBQzc3QUFDN0NnSUF0Zm9BQUlnS0FRREJBQUFBQWdBQ0FIZ0JBQUEwQVFJQTF2Z0NBRElNQVFCREF3QUFFQUlCQUJYNEFnQnhDd0VBWC9nQ0FMc0xBUUE3K1FBQUhBa0JBUGdCQUFDZUFRSUF0aDRBQU9ZRUF3RG5Id0FBNFFjREFFZjZBQUFjQ2dFQW0va0NBUGNNQVFEQkJBQUFhZ0lDQUVrZkFBQk9CZ0lBcWZnQ0FBVU1BUUF5SGdBQXdBTUNBUElBQUFCVUFBSUFtdm9BQUcwS0FRQmIrQUlBdHdzQkFNMzVBQUN1Q1FFQXJqQUFBS1VJQWdCN0h3QUF2d1lDQUpJZUFBQ1dCQUlBc3ZnQ0FBNE1BUUIrK1FBQVh3a0JBTGNlQUFEcEJBTUFCdm9BQU9jSkFRRFBId0FBc2djQ0FPcjRBZ0JHREFFQWZ2a0NBTm9NQVFEaStBSUFQZ3dCQUJnZkFBRFVCUUlBamZrQUFHNEpBUUJXTUFBQWR3Z0NBRHI1QWdDV0RBRUF6dm9BQUtFS0FRQ01IZ0FBaWdRQ0FGZ0JBQUQ0QUFJQVZmb0FBQ29LQVFERUh3QUFuQWNEQUxvVkFRQVpDd0lBZmdFQUFFQUJBZ0FPQVFBQWhnQUNBRkQ1QUFBeENRRUFodmdDQU9JTEFRRDNIZ0FBa2dVQ0FOejVBZ0E0RFFFQTN3a0FBTndDQWdDS0h3QUE2UVlFQU1INkFBQ1VDZ0VBTlBrQ0FKQU1BUURzSGdBQWRnVURBTzhlQUFCL0JRTUFRUjhBQUQ0R0FnQkQrUUFBSkFrQkFNY2VBQUFUQlFNQVpoOEFBSTBHQXdBUUh3QUF4QVVDQU0vNEFnQXJEQUVBb0I4QUFEMEhBd0FKK1FJQVpRd0JBS3dQQUFBMkF3SUE1UVFBQUl3Q0FnQ1IrUUlBN1F3QkFGajVBQUE1Q1FFQXloOEFBS2dIQWdES0F3QUFPQUlDQUJmNEFnQnpDd0VBVFE4QUFCb0RBZ0JEQVFBQTJBQUNBRHdCQUFEU0FBSUErUUVBQUtBQkFnRFMrUUlBTGcwQkFHYjRBZ0RDQ3dFQTBQa0NBQ3dOQVFBQkhnQUFWQU1DQUEzNUFnQnBEQUVBV2dFQUFQd0FBZ0FsQVFBQXNBQUNBSVQ1QUFCbENRRUFIUGtBQVAwSUFRQ00rZ0FBWHdvQkFCUWVBQUI4QXdNQWJTSUFBRE1JQWdCY0JBQUFZQUlDQUFJQkFBQnVBQUlBci9vQUFJSUtBUUEyK0FJQWtnc0JBTUFHQUFDNEFnSUEvL2tBQU9BSkFRQi8rUUFBWUFrQkFNcjRBZ0FtREFFQUt2a0NBSVlNQVFBckFRQUF1QUFDQUo0d0FBQ2hDQUlBVHZvQUFDTUtBUURJK2dBQW13b0JBTjhmQUFEUEJ3SUFidmtDQU1vTUFRQ2REd0FBTUFNQ0FBTDRBZ0JlQ3dFQUJSNEFBRndEQWdBTitBSUFhUXNCQUVINUFnQ2REQUVBR3dJQUFPWUJBZ0FzK0FJQWlBc0JBRWI3QUFEaENnSUFjZmtBQUZJSkFRREQrUUFBcEFrQkFEejRBZ0NZQ3dFQUd2Z0NBSFlMQVFDNytRQUFuQWtCQUt6NkFBQi9DZ0VBWHg4QUFIb0dBd0JxK2dBQVB3b0JBTFA0QWdBUERBRUF5ZmtBQUtvSkFRRHUrUUFBendrQkFHc2VBQUJFQkFJQUxCNEFBTElEQWdCUitBSUFyUXNCQUJMNEFnQnVDd0VBRlI4QUFORUZBd0JLK2dBQUh3b0JBTm93QUFEUENBSUF4aDRBQUJBRkF3QUlBZ0FBd0FFQ0FBdjVBQURzQ0FFQUFCNEFBRklEQWdCQSt3QUEyUW9DQUMzNEFnQ0pDd0VBMlFFQUFHWUJBd0NsK2dBQWVBb0JBUFlBQUFCY0FBSUE0U0lBQUZzSUFnQmgrUUlBdlF3QkFNOGhBQUFiQ0FJQTJQa0FBTGtKQVFBOStnQUFFZ29CQUMvN0FBQzlDZ0lBaGZvQUFGZ0tBUUJjQ1FBQXpBSUNBUGNmQUFEOUJ3TUFyaDRBQU00RUF3Q08rUUlBNmd3QkFJTWZBQURQQmdRQXhUQUFBTHNJQWdBREJBQUFTZ0lDQUNBQkFBQ21BQUlBOGdRQUFLSUNBZ0NQK1FBQWNBa0JBTEQ1QWdBTURRRUE4eDhBQVBZSEFnQktEUUFBQ1FNQ0FEb0JBQURPQUFJQWRCNEFBRllFQWdBeCtBSUFqUXNCQUF2NEFnQm5Dd0VBby9nQ0FQOExBUUJWK1FBQU5na0JBSi80QWdEN0N3RUFHd0VBQUp3QUFnQTgrUUFBSFFrQkFOMEpBQURhQWdJQXJQa0NBQWdOQVFBeitRQUFGQWtCQU1QNEFnQWZEQUVBSVdFQkFCOExBZ0FxK0FJQWhnc0JBRDc1QWdDYURBRUFMUUlBQVAwQkF3RFNIZ0FBTEFVREFKMzVBZ0Q1REFFQU5oOEFBQ0FHQXdEWCtRSUFNdzBCQUswZUFBRExCQU1BRlBrQ0FIQU1BUURrSHdBQTJ3Y0NBRndMQUFEd0FnSUFsUjhBQUJNSEJBQlpDUUFBeGdJQ0FNRDVBQUNoQ1FFQTF4NEFBRHNGQXdCbCtBSUF3UXNCQUFINEFnQmRDd0VBUGg0QUFOb0RBZ0JJK0FJQXBBc0JBTy80QWdCTERBRUFkZmdDQU5FTEFRQUVIZ0FBV2dNQ0FCejZBQUQ0Q1FFQUIvZ0NBR01MQVFEUEhnQUFKQVVDQU5FZUFBQXBCUU1BSi9rQUFBZ0pBUURVK0FJQU1Bd0JBRG42QUFBT0NnRUFpZmtDQU9VTUFRQU0rZ0lBYUEwQkFHcjRBZ0RHQ3dFQTNCNEFBRW9GQXdBWCtRQUErQWdCQUtENEFnRDhDd0VBbC9nQ0FQTUxBUUE0SGdBQXpBTURBT0lBQUFBNEFBSUF5UjhBQUtZSEFnQTBId0FBR2dZREFJa2lBQUJQQ0FJQSt2a0NBRllOQVFCRUlnQUFLUWdDQUtiNkFBQjVDZ0VBUnZnQ0FLSUxBUUFtSVFBQURRZ0JBQXNCQUFDQUFBSUFSUUVBQU53QUFnQXdBUUFBd2dBQ0FPWDVBZ0JCRFFFQUV2a0NBRzRNQVFDdStRQUFqd2tCQUZmNUFnQ3pEQUVBQlBrQUFPVUlBUUNZSHdBQUh3Y0RBRHI1QUFBYkNRRUFyL2dDQUFzTUFRQjUrQUlBMVFzQkFQUWZBQUQ0QndNQUl4NEFBS0FEQWdBU0FnQUExQUVDQU4wd0FBRFRDQUlBZS9nQ0FOY0xBUURyK0FJQVJ3d0JBTUllQUFBRUJRTUFtaUVBQUJFSUFnRGhBQUFBTmdBQ0FORUFBQUFlQUFJQWN2a0FBRk1KQVFCQkFBQUFBQU1BQUVFQUFBQUJBd0FBUVFBQUFBSURBQUJCQUFBQUF3TUFBRUVBQUFBSUF3QUFRUUFBQUFvREFBQkRBQUFBSndNQUFFVUFBQUFBQXdBQVJRQUFBQUVEQUFCRkFBQUFBZ01BQUVVQUFBQUlBd0FBU1FBQUFBQURBQUJKQUFBQUFRTUFBRWtBQUFBQ0F3QUFTUUFBQUFnREFBQk9BQUFBQXdNQUFFOEFBQUFBQXdBQVR3QUFBQUVEQUFCUEFBQUFBZ01BQUU4QUFBQURBd0FBVHdBQUFBZ0RBQUJWQUFBQUFBTUFBRlVBQUFBQkF3QUFWUUFBQUFJREFBQlZBQUFBQ0FNQUFGa0FBQUFCQXdBQVlRQUFBQUFEQUFCaEFBQUFBUU1BQUdFQUFBQUNBd0FBWVFBQUFBTURBQUJoQUFBQUNBTUFBR0VBQUFBS0F3QUFZd0FBQUNjREFBQmxBQUFBQUFNQUFHVUFBQUFCQXdBQVpRQUFBQUlEQUFCbEFBQUFDQU1BQUdrQUFBQUFBd0FBYVFBQUFBRURBQUJwQUFBQUFnTUFBR2tBQUFBSUF3QUFiZ0FBQUFNREFBQnZBQUFBQUFNQUFHOEFBQUFCQXdBQWJ3QUFBQUlEQUFCdkFBQUFBd01BQUc4QUFBQUlBd0FBZFFBQUFBQURBQUIxQUFBQUFRTUFBSFVBQUFBQ0F3QUFkUUFBQUFnREFBQjVBQUFBQVFNQUFIa0FBQUFJQXdBQVFRQUFBQVFEQUFCaEFBQUFCQU1BQUVFQUFBQUdBd0FBWVFBQUFBWURBQUJCQUFBQUtBTUFBR0VBQUFBb0F3QUFRd0FBQUFFREFBQmpBQUFBQVFNQUFFTUFBQUFDQXdBQVl3QUFBQUlEQUFCREFBQUFCd01BQUdNQUFBQUhBd0FBUXdBQUFBd0RBQUJqQUFBQURBTUFBRVFBQUFBTUF3QUFaQUFBQUF3REFBQkZBQUFBQkFNQUFHVUFBQUFFQXdBQVJRQUFBQVlEQUFCbEFBQUFCZ01BQUVVQUFBQUhBd0FBWlFBQUFBY0RBQUJGQUFBQUtBTUFBR1VBQUFBb0F3QUFSUUFBQUF3REFBQmxBQUFBREFNQUFFY0FBQUFDQXdBQVp3QUFBQUlEQUFCSEFBQUFCZ01BQUdjQUFBQUdBd0FBUndBQUFBY0RBQUJuQUFBQUJ3TUFBRWNBQUFBbkF3QUFad0FBQUNjREFBQklBQUFBQWdNQUFHZ0FBQUFDQXdBQVNRQUFBQU1EQUFCcEFBQUFBd01BQUVrQUFBQUVBd0FBYVFBQUFBUURBQUJKQUFBQUJnTUFBR2tBQUFBR0F3QUFTUUFBQUNnREFBQnBBQUFBS0FNQUFFa0FBQUFIQXdBQVNnQUFBQUlEQUFCcUFBQUFBZ01BQUVzQUFBQW5Bd0FBYXdBQUFDY0RBQUJNQUFBQUFRTUFBR3dBQUFBQkF3QUFUQUFBQUNjREFBQnNBQUFBSndNQUFFd0FBQUFNQXdBQWJBQUFBQXdEQUFCT0FBQUFBUU1BQUc0QUFBQUJBd0FBVGdBQUFDY0RBQUJ1QUFBQUp3TUFBRTRBQUFBTUF3QUFiZ0FBQUF3REFBQlBBQUFBQkFNQUFHOEFBQUFFQXdBQVR3QUFBQVlEQUFCdkFBQUFCZ01BQUU4QUFBQUxBd0FBYndBQUFBc0RBQUJTQUFBQUFRTUFBSElBQUFBQkF3QUFVZ0FBQUNjREFBQnlBQUFBSndNQUFGSUFBQUFNQXdBQWNnQUFBQXdEQUFCVEFBQUFBUU1BQUhNQUFBQUJBd0FBVXdBQUFBSURBQUJ6QUFBQUFnTUFBRk1BQUFBbkF3QUFjd0FBQUNjREFBQlRBQUFBREFNQUFITUFBQUFNQXdBQVZBQUFBQ2NEQUFCMEFBQUFKd01BQUZRQUFBQU1Bd0FBZEFBQUFBd0RBQUJWQUFBQUF3TUFBSFVBQUFBREF3QUFWUUFBQUFRREFBQjFBQUFBQkFNQUFGVUFBQUFHQXdBQWRRQUFBQVlEQUFCVkFBQUFDZ01BQUhVQUFBQUtBd0FBVlFBQUFBc0RBQUIxQUFBQUN3TUFBRlVBQUFBb0F3QUFkUUFBQUNnREFBQlhBQUFBQWdNQUFIY0FBQUFDQXdBQVdRQUFBQUlEQUFCNUFBQUFBZ01BQUZrQUFBQUlBd0FBV2dBQUFBRURBQUI2QUFBQUFRTUFBRm9BQUFBSEF3QUFlZ0FBQUFjREFBQmFBQUFBREFNQUFIb0FBQUFNQXdBQVR3QUFBQnNEQUFCdkFBQUFHd01BQUZVQUFBQWJBd0FBZFFBQUFCc0RBQUJCQUFBQURBTUFBR0VBQUFBTUF3QUFTUUFBQUF3REFBQnBBQUFBREFNQUFFOEFBQUFNQXdBQWJ3QUFBQXdEQUFCVkFBQUFEQU1BQUhVQUFBQU1Bd0FBVlFBQUFBZ0RBQUFFQXdBQWRRQUFBQWdEQUFBRUF3QUFWUUFBQUFnREFBQUJBd0FBZFFBQUFBZ0RBQUFCQXdBQVZRQUFBQWdEQUFBTUF3QUFkUUFBQUFnREFBQU1Bd0FBVlFBQUFBZ0RBQUFBQXdBQWRRQUFBQWdEQUFBQUF3QUFRUUFBQUFnREFBQUVBd0FBWVFBQUFBZ0RBQUFFQXdBQVFRQUFBQWNEQUFBRUF3QUFZUUFBQUFjREFBQUVBd0FBeGdBQUFBUURBQURtQUFBQUJBTUFBRWNBQUFBTUF3QUFad0FBQUF3REFBQkxBQUFBREFNQUFHc0FBQUFNQXdBQVR3QUFBQ2dEQUFCdkFBQUFLQU1BQUU4QUFBQW9Bd0FBQkFNQUFHOEFBQUFvQXdBQUJBTUFBTGNCQUFBTUF3QUFrZ0lBQUF3REFBQnFBQUFBREFNQUFFY0FBQUFCQXdBQVp3QUFBQUVEQUFCT0FBQUFBQU1BQUc0QUFBQUFBd0FBUVFBQUFBb0RBQUFCQXdBQVlRQUFBQW9EQUFBQkF3QUF4Z0FBQUFFREFBRG1BQUFBQVFNQUFOZ0FBQUFCQXdBQStBQUFBQUVEQUFCQkFBQUFEd01BQUdFQUFBQVBBd0FBUVFBQUFCRURBQUJoQUFBQUVRTUFBRVVBQUFBUEF3QUFaUUFBQUE4REFBQkZBQUFBRVFNQUFHVUFBQUFSQXdBQVNRQUFBQThEQUFCcEFBQUFEd01BQUVrQUFBQVJBd0FBYVFBQUFCRURBQUJQQUFBQUR3TUFBRzhBQUFBUEF3QUFUd0FBQUJFREFBQnZBQUFBRVFNQUFGSUFBQUFQQXdBQWNnQUFBQThEQUFCU0FBQUFFUU1BQUhJQUFBQVJBd0FBVlFBQUFBOERBQUIxQUFBQUR3TUFBRlVBQUFBUkF3QUFkUUFBQUJFREFBQlRBQUFBSmdNQUFITUFBQUFtQXdBQVZBQUFBQ1lEQUFCMEFBQUFKZ01BQUVnQUFBQU1Bd0FBYUFBQUFBd0RBQUJCQUFBQUJ3TUFBR0VBQUFBSEF3QUFSUUFBQUNjREFBQmxBQUFBSndNQUFFOEFBQUFJQXdBQUJBTUFBRzhBQUFBSUF3QUFCQU1BQUU4QUFBQURBd0FBQkFNQUFHOEFBQUFEQXdBQUJBTUFBRThBQUFBSEF3QUFid0FBQUFjREFBQlBBQUFBQndNQUFBUURBQUJ2QUFBQUJ3TUFBQVFEQUFCWkFBQUFCQU1BQUhrQUFBQUVBd0FBQUFNQUFBRURBQUFUQXdBQUNBTUFBQUVEQUFDNUFnQUFPd0FBQUtnQUFBQUJBd0FBa1FNQUFBRURBQUMzQUFBQWxRTUFBQUVEQUFDWEF3QUFBUU1BQUprREFBQUJBd0FBbndNQUFBRURBQUNsQXdBQUFRTUFBS2tEQUFBQkF3QUF1UU1BQUFnREFBQUJBd0FBbVFNQUFBZ0RBQUNsQXdBQUNBTUFBTEVEQUFBQkF3QUF0UU1BQUFFREFBQzNBd0FBQVFNQUFMa0RBQUFCQXdBQXhRTUFBQWdEQUFBQkF3QUF1UU1BQUFnREFBREZBd0FBQ0FNQUFMOERBQUFCQXdBQXhRTUFBQUVEQUFESkF3QUFBUU1BQU5JREFBQUJBd0FBMGdNQUFBZ0RBQUFWQkFBQUFBTUFBQlVFQUFBSUF3QUFFd1FBQUFFREFBQUdCQUFBQ0FNQUFCb0VBQUFCQXdBQUdBUUFBQUFEQUFBakJBQUFCZ01BQUJnRUFBQUdBd0FBT0FRQUFBWURBQUExQkFBQUFBTUFBRFVFQUFBSUF3QUFNd1FBQUFFREFBQldCQUFBQ0FNQUFEb0VBQUFCQXdBQU9BUUFBQUFEQUFCREJBQUFCZ01BQUhRRUFBQVBBd0FBZFFRQUFBOERBQUFXQkFBQUJnTUFBRFlFQUFBR0F3QUFFQVFBQUFZREFBQXdCQUFBQmdNQUFCQUVBQUFJQXdBQU1BUUFBQWdEQUFBVkJBQUFCZ01BQURVRUFBQUdBd0FBMkFRQUFBZ0RBQURaQkFBQUNBTUFBQllFQUFBSUF3QUFOZ1FBQUFnREFBQVhCQUFBQ0FNQUFEY0VBQUFJQXdBQUdBUUFBQVFEQUFBNEJBQUFCQU1BQUJnRUFBQUlBd0FBT0FRQUFBZ0RBQUFlQkFBQUNBTUFBRDRFQUFBSUF3QUE2QVFBQUFnREFBRHBCQUFBQ0FNQUFDMEVBQUFJQXdBQVRRUUFBQWdEQUFBakJBQUFCQU1BQUVNRUFBQUVBd0FBSXdRQUFBZ0RBQUJEQkFBQUNBTUFBQ01FQUFBTEF3QUFRd1FBQUFzREFBQW5CQUFBQ0FNQUFFY0VBQUFJQXdBQUt3UUFBQWdEQUFCTEJBQUFDQU1BQUNjR0FBQlRCZ0FBSndZQUFGUUdBQUJJQmdBQVZBWUFBQ2NHQUFCVkJnQUFTZ1lBQUZRR0FBRFZCZ0FBVkFZQUFNRUdBQUJVQmdBQTBnWUFBRlFHQUFBb0NRQUFQQWtBQURBSkFBQThDUUFBTXdrQUFEd0pBQUFWQ1FBQVBBa0FBQllKQUFBOENRQUFGd2tBQUR3SkFBQWNDUUFBUEFrQUFDRUpBQUE4Q1FBQUlna0FBRHdKQUFBckNRQUFQQWtBQUM4SkFBQThDUUFBeHdrQUFMNEpBQURIQ1FBQTF3a0FBS0VKQUFDOENRQUFvZ2tBQUx3SkFBQ3ZDUUFBdkFrQUFESUtBQUE4Q2dBQU9Bb0FBRHdLQUFBV0NnQUFQQW9BQUJjS0FBQThDZ0FBSEFvQUFEd0tBQUFyQ2dBQVBBb0FBRWNMQUFCV0N3QUFSd3NBQUQ0TEFBQkhDd0FBVndzQUFDRUxBQUE4Q3dBQUlnc0FBRHdMQUFDU0N3QUExd3NBQU1ZTEFBQytDd0FBeHdzQUFMNExBQURHQ3dBQTF3c0FBRVlNQUFCV0RBQUF2d3dBQU5VTUFBREdEQUFBMVF3QUFNWU1BQURXREFBQXhnd0FBTUlNQUFER0RBQUF3Z3dBQU5VTUFBQkdEUUFBUGcwQUFFY05BQUErRFFBQVJnMEFBRmNOQUFEWkRRQUF5ZzBBQU5rTkFBRFBEUUFBMlEwQUFNOE5BQURLRFFBQTJRMEFBTjhOQUFCQ0R3QUF0dzhBQUV3UEFBQzNEd0FBVVE4QUFMY1BBQUJXRHdBQXR3OEFBRnNQQUFDM0R3QUFRQThBQUxVUEFBQnhEd0FBY2c4QUFIRVBBQUIwRHdBQXNnOEFBSUFQQUFDekR3QUFnQThBQUhFUEFBQ0FEd0FBa2c4QUFMY1BBQUNjRHdBQXR3OEFBS0VQQUFDM0R3QUFwZzhBQUxjUEFBQ3JEd0FBdHc4QUFKQVBBQUMxRHdBQUpSQUFBQzRRQUFBRkd3QUFOUnNBQUFjYkFBQTFHd0FBQ1JzQUFEVWJBQUFMR3dBQU5Sc0FBQTBiQUFBMUd3QUFFUnNBQURVYkFBQTZHd0FBTlJzQUFEd2JBQUExR3dBQVBoc0FBRFViQUFBL0d3QUFOUnNBQUVJYkFBQTFHd0FBUVFBQUFDVURBQUJoQUFBQUpRTUFBRUlBQUFBSEF3QUFZZ0FBQUFjREFBQkNBQUFBSXdNQUFHSUFBQUFqQXdBQVFnQUFBREVEQUFCaUFBQUFNUU1BQUVNQUFBQW5Bd0FBQVFNQUFHTUFBQUFuQXdBQUFRTUFBRVFBQUFBSEF3QUFaQUFBQUFjREFBQkVBQUFBSXdNQUFHUUFBQUFqQXdBQVJBQUFBREVEQUFCa0FBQUFNUU1BQUVRQUFBQW5Bd0FBWkFBQUFDY0RBQUJFQUFBQUxRTUFBR1FBQUFBdEF3QUFSUUFBQUFRREFBQUFBd0FBWlFBQUFBUURBQUFBQXdBQVJRQUFBQVFEQUFBQkF3QUFaUUFBQUFRREFBQUJBd0FBUlFBQUFDMERBQUJsQUFBQUxRTUFBRVVBQUFBd0F3QUFaUUFBQURBREFBQkZBQUFBSndNQUFBWURBQUJsQUFBQUp3TUFBQVlEQUFCR0FBQUFCd01BQUdZQUFBQUhBd0FBUndBQUFBUURBQUJuQUFBQUJBTUFBRWdBQUFBSEF3QUFhQUFBQUFjREFBQklBQUFBSXdNQUFHZ0FBQUFqQXdBQVNBQUFBQWdEQUFCb0FBQUFDQU1BQUVnQUFBQW5Bd0FBYUFBQUFDY0RBQUJJQUFBQUxnTUFBR2dBQUFBdUF3QUFTUUFBQURBREFBQnBBQUFBTUFNQUFFa0FBQUFJQXdBQUFRTUFBR2tBQUFBSUF3QUFBUU1BQUVzQUFBQUJBd0FBYXdBQUFBRURBQUJMQUFBQUl3TUFBR3NBQUFBakF3QUFTd0FBQURFREFBQnJBQUFBTVFNQUFFd0FBQUFqQXdBQWJBQUFBQ01EQUFCTUFBQUFJd01BQUFRREFBQnNBQUFBSXdNQUFBUURBQUJNQUFBQU1RTUFBR3dBQUFBeEF3QUFUQUFBQUMwREFBQnNBQUFBTFFNQUFFMEFBQUFCQXdBQWJRQUFBQUVEQUFCTkFBQUFCd01BQUcwQUFBQUhBd0FBVFFBQUFDTURBQUJ0QUFBQUl3TUFBRTRBQUFBSEF3QUFiZ0FBQUFjREFBQk9BQUFBSXdNQUFHNEFBQUFqQXdBQVRnQUFBREVEQUFCdUFBQUFNUU1BQUU0QUFBQXRBd0FBYmdBQUFDMERBQUJQQUFBQUF3TUFBQUVEQUFCdkFBQUFBd01BQUFFREFBQlBBQUFBQXdNQUFBZ0RBQUJ2QUFBQUF3TUFBQWdEQUFCUEFBQUFCQU1BQUFBREFBQnZBQUFBQkFNQUFBQURBQUJQQUFBQUJBTUFBQUVEQUFCdkFBQUFCQU1BQUFFREFBQlFBQUFBQVFNQUFIQUFBQUFCQXdBQVVBQUFBQWNEQUFCd0FBQUFCd01BQUZJQUFBQUhBd0FBY2dBQUFBY0RBQUJTQUFBQUl3TUFBSElBQUFBakF3QUFVZ0FBQUNNREFBQUVBd0FBY2dBQUFDTURBQUFFQXdBQVVnQUFBREVEQUFCeUFBQUFNUU1BQUZNQUFBQUhBd0FBY3dBQUFBY0RBQUJUQUFBQUl3TUFBSE1BQUFBakF3QUFVd0FBQUFFREFBQUhBd0FBY3dBQUFBRURBQUFIQXdBQVV3QUFBQXdEQUFBSEF3QUFjd0FBQUF3REFBQUhBd0FBVXdBQUFDTURBQUFIQXdBQWN3QUFBQ01EQUFBSEF3QUFWQUFBQUFjREFBQjBBQUFBQndNQUFGUUFBQUFqQXdBQWRBQUFBQ01EQUFCVUFBQUFNUU1BQUhRQUFBQXhBd0FBVkFBQUFDMERBQUIwQUFBQUxRTUFBRlVBQUFBa0F3QUFkUUFBQUNRREFBQlZBQUFBTUFNQUFIVUFBQUF3QXdBQVZRQUFBQzBEQUFCMUFBQUFMUU1BQUZVQUFBQURBd0FBQVFNQUFIVUFBQUFEQXdBQUFRTUFBRlVBQUFBRUF3QUFDQU1BQUhVQUFBQUVBd0FBQ0FNQUFGWUFBQUFEQXdBQWRnQUFBQU1EQUFCV0FBQUFJd01BQUhZQUFBQWpBd0FBVndBQUFBQURBQUIzQUFBQUFBTUFBRmNBQUFBQkF3QUFkd0FBQUFFREFBQlhBQUFBQ0FNQUFIY0FBQUFJQXdBQVZ3QUFBQWNEQUFCM0FBQUFCd01BQUZjQUFBQWpBd0FBZHdBQUFDTURBQUJZQUFBQUJ3TUFBSGdBQUFBSEF3QUFXQUFBQUFnREFBQjRBQUFBQ0FNQUFGa0FBQUFIQXdBQWVRQUFBQWNEQUFCYUFBQUFBZ01BQUhvQUFBQUNBd0FBV2dBQUFDTURBQUI2QUFBQUl3TUFBRm9BQUFBeEF3QUFlZ0FBQURFREFBQm9BQUFBTVFNQUFIUUFBQUFJQXdBQWR3QUFBQW9EQUFCNUFBQUFDZ01BQUg4QkFBQUhBd0FBUVFBQUFDTURBQUJoQUFBQUl3TUFBRUVBQUFBSkF3QUFZUUFBQUFrREFBQkJBQUFBQWdNQUFBRURBQUJoQUFBQUFnTUFBQUVEQUFCQkFBQUFBZ01BQUFBREFBQmhBQUFBQWdNQUFBQURBQUJCQUFBQUFnTUFBQWtEQUFCaEFBQUFBZ01BQUFrREFBQkJBQUFBQWdNQUFBTURBQUJoQUFBQUFnTUFBQU1EQUFCQkFBQUFJd01BQUFJREFBQmhBQUFBSXdNQUFBSURBQUJCQUFBQUJnTUFBQUVEQUFCaEFBQUFCZ01BQUFFREFBQkJBQUFBQmdNQUFBQURBQUJoQUFBQUJnTUFBQUFEQUFCQkFBQUFCZ01BQUFrREFBQmhBQUFBQmdNQUFBa0RBQUJCQUFBQUJnTUFBQU1EQUFCaEFBQUFCZ01BQUFNREFBQkJBQUFBSXdNQUFBWURBQUJoQUFBQUl3TUFBQVlEQUFCRkFBQUFJd01BQUdVQUFBQWpBd0FBUlFBQUFBa0RBQUJsQUFBQUNRTUFBRVVBQUFBREF3QUFaUUFBQUFNREFBQkZBQUFBQWdNQUFBRURBQUJsQUFBQUFnTUFBQUVEQUFCRkFBQUFBZ01BQUFBREFBQmxBQUFBQWdNQUFBQURBQUJGQUFBQUFnTUFBQWtEQUFCbEFBQUFBZ01BQUFrREFBQkZBQUFBQWdNQUFBTURBQUJsQUFBQUFnTUFBQU1EQUFCRkFBQUFJd01BQUFJREFBQmxBQUFBSXdNQUFBSURBQUJKQUFBQUNRTUFBR2tBQUFBSkF3QUFTUUFBQUNNREFBQnBBQUFBSXdNQUFFOEFBQUFqQXdBQWJ3QUFBQ01EQUFCUEFBQUFDUU1BQUc4QUFBQUpBd0FBVHdBQUFBSURBQUFCQXdBQWJ3QUFBQUlEQUFBQkF3QUFUd0FBQUFJREFBQUFBd0FBYndBQUFBSURBQUFBQXdBQVR3QUFBQUlEQUFBSkF3QUFid0FBQUFJREFBQUpBd0FBVHdBQUFBSURBQUFEQXdBQWJ3QUFBQUlEQUFBREF3QUFUd0FBQUNNREFBQUNBd0FBYndBQUFDTURBQUFDQXdBQVR3QUFBQnNEQUFBQkF3QUFid0FBQUJzREFBQUJBd0FBVHdBQUFCc0RBQUFBQXdBQWJ3QUFBQnNEQUFBQUF3QUFUd0FBQUJzREFBQUpBd0FBYndBQUFCc0RBQUFKQXdBQVR3QUFBQnNEQUFBREF3QUFid0FBQUJzREFBQURBd0FBVHdBQUFCc0RBQUFqQXdBQWJ3QUFBQnNEQUFBakF3QUFWUUFBQUNNREFBQjFBQUFBSXdNQUFGVUFBQUFKQXdBQWRRQUFBQWtEQUFCVkFBQUFHd01BQUFFREFBQjFBQUFBR3dNQUFBRURBQUJWQUFBQUd3TUFBQUFEQUFCMUFBQUFHd01BQUFBREFBQlZBQUFBR3dNQUFBa0RBQUIxQUFBQUd3TUFBQWtEQUFCVkFBQUFHd01BQUFNREFBQjFBQUFBR3dNQUFBTURBQUJWQUFBQUd3TUFBQ01EQUFCMUFBQUFHd01BQUNNREFBQlpBQUFBQUFNQUFIa0FBQUFBQXdBQVdRQUFBQ01EQUFCNUFBQUFJd01BQUZrQUFBQUpBd0FBZVFBQUFBa0RBQUJaQUFBQUF3TUFBSGtBQUFBREF3QUFzUU1BQUJNREFBQ3hBd0FBRkFNQUFMRURBQUFUQXdBQUFBTUFBTEVEQUFBVUF3QUFBQU1BQUxFREFBQVRBd0FBQVFNQUFMRURBQUFVQXdBQUFRTUFBTEVEQUFBVEF3QUFRZ01BQUxFREFBQVVBd0FBUWdNQUFKRURBQUFUQXdBQWtRTUFBQlFEQUFDUkF3QUFFd01BQUFBREFBQ1JBd0FBRkFNQUFBQURBQUNSQXdBQUV3TUFBQUVEQUFDUkF3QUFGQU1BQUFFREFBQ1JBd0FBRXdNQUFFSURBQUNSQXdBQUZBTUFBRUlEQUFDMUF3QUFFd01BQUxVREFBQVVBd0FBdFFNQUFCTURBQUFBQXdBQXRRTUFBQlFEQUFBQUF3QUF0UU1BQUJNREFBQUJBd0FBdFFNQUFCUURBQUFCQXdBQWxRTUFBQk1EQUFDVkF3QUFGQU1BQUpVREFBQVRBd0FBQUFNQUFKVURBQUFVQXdBQUFBTUFBSlVEQUFBVEF3QUFBUU1BQUpVREFBQVVBd0FBQVFNQUFMY0RBQUFUQXdBQXR3TUFBQlFEQUFDM0F3QUFFd01BQUFBREFBQzNBd0FBRkFNQUFBQURBQUMzQXdBQUV3TUFBQUVEQUFDM0F3QUFGQU1BQUFFREFBQzNBd0FBRXdNQUFFSURBQUMzQXdBQUZBTUFBRUlEQUFDWEF3QUFFd01BQUpjREFBQVVBd0FBbHdNQUFCTURBQUFBQXdBQWx3TUFBQlFEQUFBQUF3QUFsd01BQUJNREFBQUJBd0FBbHdNQUFCUURBQUFCQXdBQWx3TUFBQk1EQUFCQ0F3QUFsd01BQUJRREFBQkNBd0FBdVFNQUFCTURBQUM1QXdBQUZBTUFBTGtEQUFBVEF3QUFBQU1BQUxrREFBQVVBd0FBQUFNQUFMa0RBQUFUQXdBQUFRTUFBTGtEQUFBVUF3QUFBUU1BQUxrREFBQVRBd0FBUWdNQUFMa0RBQUFVQXdBQVFnTUFBSmtEQUFBVEF3QUFtUU1BQUJRREFBQ1pBd0FBRXdNQUFBQURBQUNaQXdBQUZBTUFBQUFEQUFDWkF3QUFFd01BQUFFREFBQ1pBd0FBRkFNQUFBRURBQUNaQXdBQUV3TUFBRUlEQUFDWkF3QUFGQU1BQUVJREFBQy9Bd0FBRXdNQUFMOERBQUFVQXdBQXZ3TUFBQk1EQUFBQUF3QUF2d01BQUJRREFBQUFBd0FBdndNQUFCTURBQUFCQXdBQXZ3TUFBQlFEQUFBQkF3QUFud01BQUJNREFBQ2ZBd0FBRkFNQUFKOERBQUFUQXdBQUFBTUFBSjhEQUFBVUF3QUFBQU1BQUo4REFBQVRBd0FBQVFNQUFKOERBQUFVQXdBQUFRTUFBTVVEQUFBVEF3QUF4UU1BQUJRREFBREZBd0FBRXdNQUFBQURBQURGQXdBQUZBTUFBQUFEQUFERkF3QUFFd01BQUFFREFBREZBd0FBRkFNQUFBRURBQURGQXdBQUV3TUFBRUlEQUFERkF3QUFGQU1BQUVJREFBQ2xBd0FBRkFNQUFLVURBQUFVQXdBQUFBTUFBS1VEQUFBVUF3QUFBUU1BQUtVREFBQVVBd0FBUWdNQUFNa0RBQUFUQXdBQXlRTUFBQlFEQUFESkF3QUFFd01BQUFBREFBREpBd0FBRkFNQUFBQURBQURKQXdBQUV3TUFBQUVEQUFESkF3QUFGQU1BQUFFREFBREpBd0FBRXdNQUFFSURBQURKQXdBQUZBTUFBRUlEQUFDcEF3QUFFd01BQUtrREFBQVVBd0FBcVFNQUFCTURBQUFBQXdBQXFRTUFBQlFEQUFBQUF3QUFxUU1BQUJNREFBQUJBd0FBcVFNQUFCUURBQUFCQXdBQXFRTUFBQk1EQUFCQ0F3QUFxUU1BQUJRREFBQkNBd0FBc1FNQUFBQURBQUN4QXdBQUFRTUFBTFVEQUFBQUF3QUF0UU1BQUFFREFBQzNBd0FBQUFNQUFMY0RBQUFCQXdBQXVRTUFBQUFEQUFDNUF3QUFBUU1BQUw4REFBQUFBd0FBdndNQUFBRURBQURGQXdBQUFBTUFBTVVEQUFBQkF3QUF5UU1BQUFBREFBREpBd0FBQVFNQUFMRURBQUFUQXdBQVJRTUFBTEVEQUFBVUF3QUFSUU1BQUxFREFBQVRBd0FBQUFNQUFFVURBQUN4QXdBQUZBTUFBQUFEQUFCRkF3QUFzUU1BQUJNREFBQUJBd0FBUlFNQUFMRURBQUFVQXdBQUFRTUFBRVVEQUFDeEF3QUFFd01BQUVJREFBQkZBd0FBc1FNQUFCUURBQUJDQXdBQVJRTUFBSkVEQUFBVEF3QUFSUU1BQUpFREFBQVVBd0FBUlFNQUFKRURBQUFUQXdBQUFBTUFBRVVEQUFDUkF3QUFGQU1BQUFBREFBQkZBd0FBa1FNQUFCTURBQUFCQXdBQVJRTUFBSkVEQUFBVUF3QUFBUU1BQUVVREFBQ1JBd0FBRXdNQUFFSURBQUJGQXdBQWtRTUFBQlFEQUFCQ0F3QUFSUU1BQUxjREFBQVRBd0FBUlFNQUFMY0RBQUFVQXdBQVJRTUFBTGNEQUFBVEF3QUFBQU1BQUVVREFBQzNBd0FBRkFNQUFBQURBQUJGQXdBQXR3TUFBQk1EQUFBQkF3QUFSUU1BQUxjREFBQVVBd0FBQVFNQUFFVURBQUMzQXdBQUV3TUFBRUlEQUFCRkF3QUF0d01BQUJRREFBQkNBd0FBUlFNQUFKY0RBQUFUQXdBQVJRTUFBSmNEQUFBVUF3QUFSUU1BQUpjREFBQVRBd0FBQUFNQUFFVURBQUNYQXdBQUZBTUFBQUFEQUFCRkF3QUFsd01BQUJNREFBQUJBd0FBUlFNQUFKY0RBQUFVQXdBQUFRTUFBRVVEQUFDWEF3QUFFd01BQUVJREFBQkZBd0FBbHdNQUFCUURBQUJDQXdBQVJRTUFBTWtEQUFBVEF3QUFSUU1BQU1rREFBQVVBd0FBUlFNQUFNa0RBQUFUQXdBQUFBTUFBRVVEQUFESkF3QUFGQU1BQUFBREFBQkZBd0FBeVFNQUFCTURBQUFCQXdBQVJRTUFBTWtEQUFBVUF3QUFBUU1BQUVVREFBREpBd0FBRXdNQUFFSURBQUJGQXdBQXlRTUFBQlFEQUFCQ0F3QUFSUU1BQUtrREFBQVRBd0FBUlFNQUFLa0RBQUFVQXdBQVJRTUFBS2tEQUFBVEF3QUFBQU1BQUVVREFBQ3BBd0FBRkFNQUFBQURBQUJGQXdBQXFRTUFBQk1EQUFBQkF3QUFSUU1BQUtrREFBQVVBd0FBQVFNQUFFVURBQUNwQXdBQUV3TUFBRUlEQUFCRkF3QUFxUU1BQUJRREFBQkNBd0FBUlFNQUFMRURBQUFHQXdBQXNRTUFBQVFEQUFDeEF3QUFBQU1BQUVVREFBQ3hBd0FBUlFNQUFMRURBQUFCQXdBQVJRTUFBTEVEQUFCQ0F3QUFzUU1BQUVJREFBQkZBd0FBa1FNQUFBWURBQUNSQXdBQUJBTUFBSkVEQUFBQUF3QUFrUU1BQUFFREFBQ1JBd0FBUlFNQUFMa0RBQUNvQUFBQVFnTUFBTGNEQUFBQUF3QUFSUU1BQUxjREFBQkZBd0FBdHdNQUFBRURBQUJGQXdBQXR3TUFBRUlEQUFDM0F3QUFRZ01BQUVVREFBQ1ZBd0FBQUFNQUFKVURBQUFCQXdBQWx3TUFBQUFEQUFDWEF3QUFBUU1BQUpjREFBQkZBd0FBdng4QUFBQURBQUMvSHdBQUFRTUFBTDhmQUFCQ0F3QUF1UU1BQUFZREFBQzVBd0FBQkFNQUFMa0RBQUFJQXdBQUFBTUFBTGtEQUFBSUF3QUFBUU1BQUxrREFBQkNBd0FBdVFNQUFBZ0RBQUJDQXdBQW1RTUFBQVlEQUFDWkF3QUFCQU1BQUprREFBQUFBd0FBbVFNQUFBRURBQUQrSHdBQUFBTUFBUDRmQUFBQkF3QUEvaDhBQUVJREFBREZBd0FBQmdNQUFNVURBQUFFQXdBQXhRTUFBQWdEQUFBQUF3QUF4UU1BQUFnREFBQUJBd0FBd1FNQUFCTURBQURCQXdBQUZBTUFBTVVEQUFCQ0F3QUF4UU1BQUFnREFBQkNBd0FBcFFNQUFBWURBQUNsQXdBQUJBTUFBS1VEQUFBQUF3QUFwUU1BQUFFREFBQ2hBd0FBRkFNQUFLZ0FBQUFBQXdBQXFBQUFBQUVEQUFCZ0FBQUF5UU1BQUFBREFBQkZBd0FBeVFNQUFFVURBQURKQXdBQUFRTUFBRVVEQUFESkF3QUFRZ01BQU1rREFBQkNBd0FBUlFNQUFKOERBQUFBQXdBQW53TUFBQUVEQUFDcEF3QUFBQU1BQUtrREFBQUJBd0FBcVFNQUFFVURBQUMwQUFBQUFpQUFBQU1nQUFDcEF3QUFTd0FBQUVFQUFBQUtBd0FBa0NFQUFEZ0RBQUNTSVFBQU9BTUFBSlFoQUFBNEF3QUEwQ0VBQURnREFBRFVJUUFBT0FNQUFOSWhBQUE0QXdBQUF5SUFBRGdEQUFBSUlnQUFPQU1BQUFzaUFBQTRBd0FBSXlJQUFEZ0RBQUFsSWdBQU9BTUFBRHdpQUFBNEF3QUFReUlBQURnREFBQkZJZ0FBT0FNQUFFZ2lBQUE0QXdBQVBRQUFBRGdEQUFCaElnQUFPQU1BQUUwaUFBQTRBd0FBUEFBQUFEZ0RBQUErQUFBQU9BTUFBR1FpQUFBNEF3QUFaU0lBQURnREFBQnlJZ0FBT0FNQUFITWlBQUE0QXdBQWRpSUFBRGdEQUFCM0lnQUFPQU1BQUhvaUFBQTRBd0FBZXlJQUFEZ0RBQUNDSWdBQU9BTUFBSU1pQUFBNEF3QUFoaUlBQURnREFBQ0hJZ0FBT0FNQUFLSWlBQUE0QXdBQXFDSUFBRGdEQUFDcElnQUFPQU1BQUtzaUFBQTRBd0FBZkNJQUFEZ0RBQUI5SWdBQU9BTUFBSkVpQUFBNEF3QUFraUlBQURnREFBQ3lJZ0FBT0FNQUFMTWlBQUE0QXdBQXRDSUFBRGdEQUFDMUlnQUFPQU1BQUFnd0FBQUpNQUFBM1NvQUFEZ0RBQUJMTUFBQW1UQUFBRTB3QUFDWk1BQUFUekFBQUprd0FBQlJNQUFBbVRBQUFGTXdBQUNaTUFBQVZUQUFBSmt3QUFCWE1BQUFtVEFBQUZrd0FBQ1pNQUFBV3pBQUFKa3dBQUJkTUFBQW1UQUFBRjh3QUFDWk1BQUFZVEFBQUprd0FBQmtNQUFBbVRBQUFHWXdBQUNaTUFBQWFEQUFBSmt3QUFCdk1BQUFtVEFBQUc4d0FBQ2FNQUFBY2pBQUFKa3dBQUJ5TUFBQW1qQUFBSFV3QUFDWk1BQUFkVEFBQUpvd0FBQjRNQUFBbVRBQUFIZ3dBQUNhTUFBQWV6QUFBSmt3QUFCN01BQUFtakFBQUVZd0FBQ1pNQUFBblRBQUFKa3dBQUNyTUFBQW1UQUFBSzB3QUFDWk1BQUFyekFBQUprd0FBQ3hNQUFBbVRBQUFMTXdBQUNaTUFBQXRUQUFBSmt3QUFDM01BQUFtVEFBQUxrd0FBQ1pNQUFBdXpBQUFKa3dBQUM5TUFBQW1UQUFBTDh3QUFDWk1BQUF3VEFBQUprd0FBREVNQUFBbVRBQUFNWXdBQUNaTUFBQXlEQUFBSmt3QUFEUE1BQUFtVEFBQU04d0FBQ2FNQUFBMGpBQUFKa3dBQURTTUFBQW1qQUFBTlV3QUFDWk1BQUExVEFBQUpvd0FBRFlNQUFBbVRBQUFOZ3dBQUNhTUFBQTJ6QUFBSmt3QUFEYk1BQUFtakFBQUtZd0FBQ1pNQUFBN3pBQUFKa3dBQUR3TUFBQW1UQUFBUEV3QUFDWk1BQUE4akFBQUprd0FBRDlNQUFBbVRBQUFFaU1BQUQwWmdBQXlvNEFBTWlNQUFEUmJnQUFNazRBQU9WVEFBQ2Nud0FBbko4QUFGRlpBQURSa1FBQWgxVUFBRWhaQUFEMllRQUFhWFlBQUlWL0FBQS9oZ0FBdW9jQUFQaUlBQUNQa0FBQUFtb0FBQnR0QUFEWmNBQUEzbk1BQUQyRUFBQnFrUUFBOFprQUFJSk9BQUIxVXdBQUJHc0FBQnR5QUFBdGhnQUFIcDRBQUZCZEFBRHJid0FBellVQUFHU0pBQURKWWdBQTJJRUFBQitJQUFES1hnQUFGMmNBQUdwdEFBRDhjZ0FBenBBQUFJWlBBQUMzVVFBQTNsSUFBTVJrQUFEVGFnQUFFSElBQU9kMkFBQUJnQUFBQm9ZQUFGeUdBQUR2alFBQU1wY0FBRytiQUFENm5RQUFqSGdBQUg5NUFBQ2dmUUFBeVlNQUFBU1RBQUIvbmdBQTFvb0FBTjlZQUFBRVh3QUFZSHdBQUg2QUFBQmljZ0FBeW5nQUFNS01BQUQzbGdBQTJGZ0FBR0pjQUFBVGFnQUEybTBBQUE5dkFBQXZmUUFBTjM0QUFFdVdBQURTVWdBQWk0QUFBTnhSQUFETVVRQUFISG9BQUw1OUFBRHhnd0FBZFpZQUFJQ0xBQURQWWdBQUFtb0FBUDZLQUFBNVRnQUE1MXNBQUJKZ0FBQ0hjd0FBY0hVQUFCZFRBQUQ3ZUFBQXYwOEFBS2xmQUFBTlRnQUF6R3dBQUhobEFBQWlmUUFBdzFNQUFGNVlBQUFCZHdBQVNZUUFBS3FLQUFDNmF3QUFzSThBQUloc0FBRCtZZ0FBNVlJQUFLQmpBQUJsZFFBQXJrNEFBR2xSQUFESlVRQUFnV2dBQU9kOEFBQnZnZ0FBMG9vQUFNK1JBQUQxVWdBQVFsUUFBSE5aQUFEc1hnQUF4V1VBQVA1dkFBQXFlUUFBclpVQUFHcWFBQUNYbmdBQXpwNEFBSnRTQUFER1pnQUFkMnNBQUdLUEFBQjBYZ0FBa0dFQUFBQmlBQUNhWkFBQUkyOEFBRWx4QUFDSmRBQUF5bmtBQVBSOUFBQnZnQUFBSm84QUFPNkVBQUFqa0FBQVNwTUFBQmRTQUFDalVnQUF2VlFBQU1od0FBRENpQUFBcW9vQUFNbGVBQUQxWHdBQWUyTUFBSzVyQUFBK2ZBQUFkWE1BQU9ST0FBRDVWZ0FBNTFzQUFMcGRBQUFjWUFBQXNuTUFBR2wwQUFDYWZ3QUFSb0FBQURTU0FBRDJsZ0FBU0pjQUFCaVlBQUNMVHdBQXJua0FBTFNSQUFDNGxnQUE0V0FBQUlaT0FBRGFVQUFBN2xzQUFEOWNBQUNaWlFBQUFtb0FBTTV4QUFCQ2RnQUEvSVFBQUh5UUFBQ05ud0FBaUdZQUFDNldBQUNKVWdBQWUyY0FBUE5uQUFCQmJRQUFuRzRBQUFsMEFBQlpkUUFBYTNnQUFCQjlBQUJlbUFBQWJWRUFBQzVpQUFCNGxnQUFLMUFBQUJsZEFBRHFiUUFBS284QUFJdGZBQUJFWVFBQUYyZ0FBSWR6QUFDR2xnQUFLVklBQUE5VUFBQmxYQUFBRTJZQUFFNW5BQUNvYUFBQTVXd0FBQVowQUFEaWRRQUFlWDhBQU0rSUFBRGhpQUFBekpFQUFPS1dBQUEvVXdBQXVtNEFBQjFVQUFEUWNRQUFtSFFBQVBxRkFBQ2psZ0FBVjV3QUFKK2VBQUNYWndBQXkyMEFBT2lCQUFETGVnQUFJSHNBQUpKOEFBREFjZ0FBbVhBQUFGaUxBQURBVGdBQU5vTUFBRHBTQUFBSFVnQUFwbDRBQU5OaUFBRFdmQUFBaFZzQUFCNXRBQUMwWmdBQU80OEFBRXlJQUFCTmxnQUFpNGtBQU5OZUFBQkFVUUFBd0ZVQUFGcFlBQUIwWmdBQTNsRUFBQ3B6QUFES2RnQUFQSGtBQUY1NUFBQmxlUUFBajNrQUFGYVhBQUMrZkFBQXZYOEFBQktHQUFENGlnQUFPSkFBQVAyUUFBRHZtQUFBL0pnQUFDaVpBQUMwblFBQTNwQUFBTGVXQUFDdVR3QUE1MUFBQUUxUkFBREpVZ0FBNUZJQUFGRlRBQUNkVlFBQUJsWUFBR2hXQUFCQVdBQUFxRmdBQUdSY0FBQnVYQUFBbEdBQUFHaGhBQUNPWVFBQThtRUFBRTlsQUFEaVpRQUFrV1lBQUlWb0FBQjNiUUFBR200QUFDSnZBQUJ1Y1FBQUszSUFBQ0owQUFDUmVBQUFQbmtBQUVsNUFBQkllUUFBVUhrQUFGWjVBQUJkZVFBQWpYa0FBSTU1QUFCQWVnQUFnWG9BQU1CN0FBRDBmUUFBQ1g0QUFFRitBQUJ5ZndBQUJZQUFBTzJCQUFCNWdnQUFlWUlBQUZlRUFBQVFpUUFBbG9rQUFBR0xBQUE1aXdBQTA0d0FBQWlOQUFDMmp3QUFPSkFBQU9PV0FBRC9sd0FBTzVnQUFIVmdBQUR1UWdJQUdJSUFBQ1pPQUFDMVVRQUFhRkVBQUlCUEFBQkZVUUFBZ0ZFQUFNZFNBQUQ2VWdBQW5WVUFBRlZWQUFDWlZRQUE0bFVBQUZwWUFBQ3pXQUFBUkZrQUFGUlpBQUJpV2dBQUtGc0FBTkplQUFEWlhnQUFhVjhBQUsxZkFBRFlZQUFBVG1FQUFBaGhBQUNPWVFBQVlHRUFBUEpoQUFBMFlnQUF4R01BQUJ4a0FBQlNaQUFBVm1VQUFIUm1BQUFYWndBQUcyY0FBRlpuQUFCNWF3QUF1bXNBQUVGdEFBRGJiZ0FBeTI0QUFDSnZBQUFlY0FBQWJuRUFBS2QzQUFBMWNnQUFyM0lBQUNwekFBQnhkQUFBQm5VQUFEdDFBQUFkZGdBQUgzWUFBTXAyQUFEYmRnQUE5SFlBQUVwM0FBQkFkd0FBekhnQUFMRjZBQURBZXdBQWUzd0FBRnQ5QUFEMGZRQUFQbjhBQUFXQUFBQlNnd0FBNzRNQUFIbUhBQUJCaVFBQWhva0FBSmFKQUFDL2lnQUErSW9BQU11S0FBQUJpd0FBL29vQUFPMktBQUE1aXdBQWlvc0FBQWlOQUFBNGp3QUFjcEFBQUptUkFBQjJrZ0FBZkpZQUFPT1dBQUJXbHdBQTI1Y0FBUCtYQUFBTG1BQUFPNWdBQUJLYkFBQ2Nud0FBU2lnQ0FFUW9BZ0RWTXdJQW5Uc0FBQmhBQUFBNVFBQUFTVklDQU5CY0FnRFRmZ0lBUTU4QUFJNmZBQURaQlFBQXRBVUFBUElGQUFDM0JRQUE2UVVBQU1FRkFBRHBCUUFBd2dVQUFPa0ZBQUM4QlFBQXdRVUFBT2tGQUFDOEJRQUF3Z1VBQU5BRkFBQzNCUUFBMEFVQUFMZ0ZBQURRQlFBQXZBVUFBTkVGQUFDOEJRQUEwZ1VBQUx3RkFBRFRCUUFBdkFVQUFOUUZBQUM4QlFBQTFRVUFBTHdGQUFEV0JRQUF2QVVBQU5nRkFBQzhCUUFBMlFVQUFMd0ZBQURhQlFBQXZBVUFBTnNGQUFDOEJRQUEzQVVBQUx3RkFBRGVCUUFBdkFVQUFPQUZBQUM4QlFBQTRRVUFBTHdGQUFEakJRQUF2QVVBQU9RRkFBQzhCUUFBNWdVQUFMd0ZBQURuQlFBQXZBVUFBT2dGQUFDOEJRQUE2UVVBQUx3RkFBRHFCUUFBdkFVQUFOVUZBQUM1QlFBQTBRVUFBTDhGQUFEYkJRQUF2d1VBQU9RRkFBQy9CUUFBMGdVQkFBY0RBQURhQlFFQUJ3TUFBSmtRQVFDNkVBRUFteEFCQUxvUUFRQ2xFQUVBdWhBQkFERVJBUUFuRVFFQU1oRUJBQ2NSQVFCSEV3RUFQaE1CQUVjVEFRQlhFd0VBZ2hNQkFNa1RBUUNFRXdFQXV4TUJBSXNUQVFEQ0V3RUFrQk1CQU1rVEFRRENFd0VBd2hNQkFNSVRBUUM0RXdFQXdoTUJBTWtUQVFDNUZBRUF1aFFCQUxrVUFRQ3dGQUVBdVJRQkFMMFVBUUM0RlFFQXJ4VUJBTGtWQVFDdkZRRUFOUmtCQURBWkFRQWVZUUVBSG1FQkFCNWhBUUFwWVFFQUhtRUJBQjloQVFBcFlRRUFIMkVCQUI1aEFRQWdZUUVBSG1FQkFCNWhBUUFmWVFFQUhtRUJBQ2xoQVFBZllRRUFIbUVCQUI1aEFRQWdZUUVBWjIwQkFHZHRBUUJqYlFFQVoyMEJBR050QVFCbmJRRUFaMjBCQUZmUkFRQmwwUUVBV05FQkFHWFJBUUJZMFFFQVpkRUJBRzdSQVFCWTBRRUFaZEVCQUcvUkFRQlkwUUVBWmRFQkFIRFJBUUJZMFFFQVpkRUJBSEhSQVFCWTBRRUFaZEVCQUhMUkFRQzUwUUVBWmRFQkFMclJBUUJsMFFFQXVkRUJBR1hSQVFCdTBRRUF1dEVCQUdYUkFRQnUwUUVBdWRFQkFHWFJBUUJ2MFFFQXV0RUJBR1hSQVFCdjBRRUFQVTRBQURoT0FBQkJUZ0FBSWdFQ0FHQlBBQUN1VHdBQXUwOEFBQUpRQUFCNlVBQUFtVkFBQU9kUUFBRFBVQUFBbmpRQUFEb0dBZ0JOVVFBQVZGRUFBR1JSQUFCM1VRQUFIQVVDQUxrMEFBQm5VUUFBalZFQUFFc0ZBZ0NYVVFBQXBGRUFBTXhPQUFDc1VRQUF0VkVBQU4rUkFnRDFVUUFBQTFJQUFOODBBQUE3VWdBQVJsSUFBSEpTQUFCM1VnQUFGVFVBQU1kU0FBREpVZ0FBNUZJQUFQcFNBQUFGVXdBQUJsTUFBQmRUQUFCSlV3QUFVVk1BQUZwVEFBQnpVd0FBZlZNQUFIOVRBQUIvVXdBQWYxTUFBQ3dLQWdCd2NBQUF5bE1BQU45VEFBQmpDd0lBNjFNQUFQRlRBQUFHVkFBQW5sUUFBRGhVQUFCSVZBQUFhRlFBQUtKVUFBRDJWQUFBRUZVQUFGTlZBQUJqVlFBQWhGVUFBSVJWQUFDWlZRQUFxMVVBQUxOVkFBRENWUUFBRmxjQUFBWldBQUFYVndBQVVWWUFBSFJXQUFBSFVnQUE3bGdBQU01WEFBRDBWd0FBRFZnQUFJdFhBQUF5V0FBQU1WZ0FBS3hZQUFEa0ZBSUE4bGdBQVBkWUFBQUdXUUFBR2xrQUFDSlpBQUJpV1FBQXFCWUNBT29XQWdEc1dRQUFHMW9BQUNkYUFBRFlXUUFBWmxvQUFPNDJBQUQ4TmdBQUNGc0FBRDViQUFBK1d3QUF5QmtDQU1OYkFBRFlXd0FBNTFzQUFQTmJBQUFZR3dJQS8xc0FBQVpjQUFCVFh3QUFJbHdBQUlFM0FBQmdYQUFBYmx3QUFNQmNBQUNOWEFBQTVCMENBRU5kQUFEbUhRSUFibDBBQUd0ZEFBQjhYUUFBNFYwQUFPSmRBQUF2T0FBQS9WMEFBQ2hlQUFBOVhnQUFhVjRBQUdJNEFBQ0RJUUlBZkRnQUFMQmVBQUN6WGdBQXRsNEFBTXBlQUFDU293SUEvbDRBQURFakFnQXhJd0lBQVlJQUFDSmZBQUFpWHdBQXh6Z0FBTGd5QWdEYVlRSUFZbDhBQUd0ZkFBRGpPQUFBbWw4QUFNMWZBQURYWHdBQStWOEFBSUZnQUFBNk9RQUFIRGtBQUpSZ0FBRFVKZ0lBeDJBQUFFaGhBQUJNWVFBQVRtRUFBRXhoQUFCNllRQUFqbUVBQUxKaEFBQ2tZUUFBcjJFQUFONWhBQUR5WVFBQTltRUFBQkJpQUFBYllnQUFYV0lBQUxGaUFBRFVZZ0FBVUdNQUFBd3JBZ0E5WXdBQS9HSUFBR2hqQUFDRFl3QUE1R01BQVBFckFnQWlaQUFBeFdNQUFLbGpBQUF1T2dBQWFXUUFBSDVrQUFDZFpBQUFkMlFBQUd3NkFBQlBaUUFBYkdVQUFBb3dBZ0RqWlFBQStHWUFBRWxtQUFBWk93QUFrV1lBQUFnN0FBRGtPZ0FBa2xFQUFKVlJBQUFBWndBQW5HWUFBSzJBQUFEWlF3QUFGMmNBQUJ0bkFBQWhad0FBWG1jQUFGTm5BQURETXdJQVNUc0FBUHBuQUFDRlp3QUFVbWdBQUlWb0FBQnROQUlBam1nQUFCOW9BQUFVYVFBQW5Uc0FBRUpwQUFDamFRQUE2bWtBQUtocUFBQ2pOZ0lBMjJvQUFCZzhBQUFoYXdBQXB6Z0NBRlJyQUFCT1BBQUFjbXNBQUo5ckFBQzZhd0FBdTJzQUFJMDZBZ0FMSFFJQStqb0NBRTVzQUFDOFBBSUF2MndBQU0xc0FBQm5iQUFBRm0wQUFENXRBQUIzYlFBQVFXMEFBR2x0QUFCNGJRQUFoVzBBQUI0OUFnQTBiUUFBTDI0QUFHNXVBQUF6UFFBQXkyNEFBTWR1QUFEUlBnSUErVzBBQUc1dkFBQmVQd0lBamo4Q0FNWnZBQUE1Y0FBQUhuQUFBQnR3QUFDV1BRQUFTbkFBQUgxd0FBQjNjQUFBclhBQUFDVUZBZ0JGY1FBQVkwSUNBSnh4QUFDclF3SUFLSElBQURWeUFBQlFjZ0FBQ0VZQ0FJQnlBQUNWY2dBQU5VY0NBQlJJQWdCNmN3QUFpM01BQUt3K0FBQ2xjd0FBdUQ0QUFMZytBQUJIZEFBQVhIUUFBSEYwQUFDRmRBQUF5blFBQUJzL0FBQWtkUUFBTmt3Q0FENTFBQUNTVEFJQWNIVUFBSjhoQWdBUWRnQUFvVThDQUxoUEFnQkVVQUlBL0Q4QUFBaEFBQUQwZGdBQTgxQUNBUEpRQWdBWlVRSUFNMUVDQUI1M0FBQWZkd0FBSDNjQUFFcDNBQUE1UUFBQWkzY0FBRVpBQUFDV1FBQUFIVlFDQUU1NEFBQ01lQUFBekhnQUFPTkFBQUFtVmdJQVZua0FBSnBXQWdERlZnSUFqM2tBQU90NUFBQXZRUUFBUUhvQUFFcDZBQUJQZWdBQWZGa0NBS2RhQWdDbldnSUE3bm9BQUFKQ0FBQ3JXd0lBeG5zQUFNbDdBQUFuUWdBQWdGd0NBTko4QUFDZ1FnQUE2SHdBQU9OOEFBQUFmUUFBaGw4Q0FHTjlBQUFCUXdBQXgzMEFBQUorQUFCRmZnQUFORU1BQUNoaUFnQkhZZ0lBV1VNQUFObGlBZ0I2ZndBQVBtTUNBSlYvQUFENmZ3QUFCWUFBQU5wa0FnQWpaUUlBWUlBQUFLaGxBZ0J3Z0FBQVh6TUNBTlZEQUFDeWdBQUFBNEVBQUF0RUFBQStnUUFBdFZvQUFLZG5BZ0MxWndJQWt6TUNBSnd6QWdBQmdnQUFCSUlBQUo2UEFBQnJSQUFBa1lJQUFJdUNBQUNkZ2dBQXMxSUFBTEdDQUFDemdnQUF2WUlBQU9hQ0FBQThhd0lBNVlJQUFCMkRBQUJqZ3dBQXJZTUFBQ09EQUFDOWd3QUE1NE1BQUZlRUFBQlRnd0FBeW9NQUFNeURBQURjZ3dBQU5td0NBR3R0QWdEVmJBSUFLMFVBQVBHRUFBRHpoQUFBRm9VQUFNcHpBZ0JraFFBQUxHOENBRjFGQUFCaFJRQUFzVzhDQU5Kd0FnQnJSUUFBVUlZQUFGeUdBQUJuaGdBQWFZWUFBS21HQUFDSWhnQUFEb2NBQU9LR0FBQjVod0FBS0ljQUFHdUhBQUNHaHdBQTEwVUFBT0dIQUFBQmlBQUErVVVBQUdDSUFBQmppQUFBWjNZQ0FOZUlBQURlaUFBQU5VWUFBUHFJQUFDN05BQUFybmdDQUdaNUFnQytSZ0FBeDBZQUFLQ0tBQUR0aWdBQWlvc0FBRldNQUFDb2ZBSUFxNHdBQU1HTUFBQWJqUUFBZDQwQUFDOS9BZ0FFQ0FJQXk0MEFBTHlOQUFEd2pRQUEzZ2dDQU5TT0FBQTRqd0FBMG9VQ0FPMkZBZ0NVa0FBQThaQUFBQkdSQUFBdWh3SUFHNUVBQURpU0FBRFhrZ0FBMkpJQUFIeVNBQUQ1a3dBQUZaUUFBUHFMQWdDTGxRQUFsVWtBQUxlVkFBQjNqUUlBNWtrQUFNT1dBQUN5WFFBQUk1Y0FBRVdSQWdBYWtnSUFia29BQUhaS0FBRGdsd0FBQ3BRQ0FMSktBQUNXbEFJQUM1Z0FBQXVZQUFBcG1BQUF0cFVDQU9LWUFBQXpTd0FBS1prQUFLZVpBQURDbVFBQS9wa0FBTTVMQUFBd213SUFFcHNBQUVDY0FBRDluQUFBemt3QUFPMU1BQUJublFBQXpxQUNBUGhNQUFBRm9RSUFEcUlDQUpHaUFnQzduZ0FBVmswQUFQbWVBQUQrbmdBQUJaOEFBQStmQUFBV253QUFPNThBQUFDbUFnQXM4aFFBYlFBQUFEWUFBQUEwQUFBQUxQSVVBRzBBQUFBMkFBQUFSZ0FBQUFBQUFBQUtBQUFBQUFBQUFBRUFueHNFQUQ4UEJRQ0ZBUUFBQUFBQkFBQUFBUUFDQUowQkFBQ1pBQUFBUGdBQUFBb0EvQU9oQUVIUzZOWUFDNjhDQVFEcUFRQUFtd1VCQU5ZREFBQjRBQUFBOXdJWEFBNEF1Z0M0QUFBQW93Q0pBQWNBRkFBQUFBQUFBQUFEQUFBQUFBQUFBRU1DUndBRkFBQUFBQUEvQVFrQUFRQUFBQUFBQkFBVkFBRUExZ0FjQUFBQUFnRC9BTFVCQUFBQUFBSUFBUUFHQUFBQTdBQUVBRGdBOHdBQUFBb0FHZ0FCQUFBQW9RQUFBQUFBRXdETUFGd0FCd0FBQUZJQUFBQU5BQUFBQUFCREFBRUFCQUFEQUYwQUhBRUVBQUVBQUFBQUFGTUFDQUFBQUFBQUFnQUFBQjRBVFFBQUFDSUFBUUFmQUFBQUFRQUFBQUFBQUFBZUFDSUFFd0FIQUFRQUFBQmdBQVVBQUFBQUFBQUFCQUJxQUFBQUFBQUFBSWdBQVFBQUFIOEFBQUFDQUFBQUFBQU5BRGdBcHdCSkFOVUFBUUFvQUFRQUFnQUFBREFBQ2dBQkFQQUFKQUFDQURFQW13QUFBSkFBQXdBTEFBTUFBZ0FBQUZjQUFBQUVBRUdLNjlZQUMzTUZBQUFBT2dBR0FBNEFCd0FBQUlrQUFBQUFBQUVBQlFBR0FDOEFBQUJvQUFFQUFBQkRBQUFBS0FBQUFBQUFwQUExQUJNQUh3QXZBQUlBRVFCU0FBZ0FBQUFBQUJNQUZBQUFBQ1FBQUFBQUFBRUFMQUFCQUFBQUFBQVVBQXdBRmdBQUFBQUFDQUFLQUFZQUFBQUFBQTBBQUFDcEFFR0c3TllBQy9jRENRQUFBQUFBQVFBQUFBQUFBZ0FTQUFBQUFBQTJBQUlBSGdBRUFBd0FBQUFDQUFBQUVnQUJBRFVBQUFBQUFBb0FCd0FWQUFVQUhBQWtBSG9BQUFBRkFBRUFFZ0FBQUFRQUFRQUZBQkFBQ1FBQUFDQUFHd0FHQUI0QUJRQktBQUFBQkFBQUFCUUFBQUFKQUdVQUFBQUJBQUFBZEFBQUFBQUFSUUFCQUFBQUFBQUlBQUFBQUFBWEFBQUFBQUFHQUFBQUFnQUFBQVVBQUFBYkFBQUFGd0FBQUFFQUF3QXBBQUlBQWdBSEFBY0FBUUFCQURvQUFRQUJBQUFBQXdBQUFBUUFBUUFSQUJZQUFBQUNBQUFBQWdBQ0FBSUFCZ0FBQUVZQUFBQUNBQUFBQUFBTkFCRUFBQUFBQUJzQVBRQUhBQ1FBR1FBSUFGd0FBQUFvQUFRQUZBQUNBQVFBQVFBQkFBRUFBQUFJQUFnQUVnQUNBRklBRHdBQUFBQUFBQUFIQUFZQUFBQWVBQjBBQVFBUUFBQUFBQUFBQUFFQUFRQUFBQVFBQmdBWEFBWUFCQUFEQUFNQVBnQUFBQUlBQndBakFBQUFBQUFCQUFBQUFBQUVBQWNBSVFBUUFCa0FCUUFBQUFjQUFBQUJBQUFBQUFBQUFBd0FFZ0F1QUFBQUV3QW5BQUFBRXdBQUFBQUFCZ0FzQUFBQUJnQUFBQTRBQVFBQkFBVUFBZ0FFQUJZQURRQVNBQWdBQUFBQkFBTUFBQUFBQUFFQUFBQUFBQkFBQUFBQUFBc0FBQUFBQUFjQUJBQVBBQWdBQVFBR0FBRUFCQUFFQUFvQUFnQUFBQUlBQXdBRkFBQUFBQUFMQUFzQUFBQUZBQU1BQUFBQUFBUUFCQUFjQUNBQVFZYncxZ0FMS3hNQURRQUtBQU1BQUFBTUFBc0FBQUFCQUFBQUFBQURBQUVBQVFBK0FBQUFBUUFYQUFBQUdRQVFBQU1BUWJydzFnQUxLd01BQUFBSUFBRUFBQUFIQUFNQUVBQUJBQUFBQWdBSkFBQUFpd0FBQUFVQUFBQUlBQUFBQlFBU0FBOEFRZTd3MWdBTDJRRUJBQUFBQVFCR0FBQUFCQUFNQUFBQUFRQUdBQUFBRkFBRkFCb0FCd0FBQUFJQUJRQUFBQWNBQVFBZ0FBMEFDd0FyQUFBQUd3QUFBQU1BQUFBQkFCb0FBUUFFQUFBQUFBQUhBQUFBREFBYkFDTUFBZ0FBQUJrQUh3QUJBQkFBQ0FBS0FBQUFBQUFHQUFJQUFnQUNBQklBQ1FBZUFBUUFBQUFMQUFRQUNBQWVBQU1BQmdBTUFBQUFBQUFDQUFBQUNnQUFBQnNBQUFBQkFBa0FBQUFQQUFJQUFBQUtBQUFBQ0FBQUFBRUFBQUFBQUFFQUFRQU1BQXdBQVFBQUFBQUFCQUFBQUFVQUFBQWlBQUlBRHdBVkFBMEFBQUFBQUFFQUFBQVdBRUhROHRZQUM2OEJDQUFBQUFBQUFRQUFBQUFBQkFBQkFBRUFCQUFDQUFJQUR3QUtBQlFBQUFBQUFBRUFBZ0FBQUFJQUR3QUFBQUFBQndBQUFDWUFBQUExQUFrQUFBQUZBQUlBQUFBUEFBTUFBd0FHQUFBQUx3QUNBQUFBQndBQUFBQUFBUUFJQUJZQUF3QUFBQUFBRmdBQUFBSUFBQUFOQUFBQUFRQUFBQVVBQVFBS0FBQUFBQUFDQUFvQUFRQUFBQUFBQmdBQkFBQUFBd0FDQUJVQUFBQUNBQUFBQUFBREFBRUFDQUFDQUFBQUJnQUFBQUVBQVFCQml2VFdBQXZ4QVEwQUZBQUFBQUVBQUFBRUFBQUFBd0FDQUFBQUFBQUVBQmtBQmdBSEFCTUFHUUFEQUFzQUNBQVRBQWNBQWdBSkFBQUFBQUFaQUJZQUFnQVZBQUFBQkFBQUFBY0FBQUFJQUFBQUFBQUhBQUVBQmdBZUFCc0FBQUFNQUFNQUR3QUFBQUFBQVFBS0FBQUFBQUFBQUFZQUZnQUdBQUlBQUFBVkFBWUFCQUFDQUFrQUFBQUpBQUlBQUFBS0FBQUFBQUFGQUF3QUFBQUZBQUVBQkFBQUFBb0FBUUFFQUFnQURnQUFBQUVBQWdBR0FBRUFBQUFrQUFBQUFBQURBQUVBQUFBRUFBSUFBQUFXQUFFQUNRQUFBQWNBQUFBWEFBRUFBQUFGQUJZQUFnQWZBQUFBQUFBQ0FBQUFBQUFLQUFFQUNnQUFBQWNBUVlqMjFnQUxnUUVGQUFBQUJRQUxBQXdBQUFBQUFBRUFCQUFHQUFNQUFRQVdBQUVBQUFBQUFBRUFCQUFBQUFFQUdRQURBQU1BQkFBRkFBRUFIUUFBQUFBQUJ3QUJBQUVBSHdBQUFBQUFBUUFyQUFZQUVBQUFBQWtBQmdBTUFBb0FBZ0FBQUFBQUFRQU1BQUFBQUFBQUFCWUFBQUFBQUJZQURBQVBBQUFBRUFBQ0FBQUFEQUFjQUFJQVFaTDMxZ0FMV1FFQUFnQUFBQU1BRndBRUFCd0FCUUFNQUFFQUJ3QUVBQUFBQVFBQ0FBQUFEZ0FQQUFJQUNRQUJBQVlBSUFBTEFBQUFBQUFCQUFzQUFnQUNBQUFBQUFBQUFBY0FBQUFCQUFBQUFBQUJBQUVBQUFBSEFBQUFBd0FHQUVIMDk5WUFDNUVCQWdBQUFBc0FBZ0FBQUFZQUFRQUJBQUFBRGdBTUFBQUFCZ0FBQUFBQURnQUFBQU1BQVFBQUFBQUFJd0FKQUFjQUFBQUFBQkVBRWdBQUFBQUFCZ0FCQUFFQUFBQU5BQWdBQndBQ0FDa0FBd0FJQUFRQUFnQU1BQUVBQUFBQkFBNEFBUUFBQUFBQUFBQUJBQUFBQUFBQ0FBQUFCd0FGQUFRQUFBQUFBQUlBQlFBRkFBVUFBUUFIQUFJQURBQUFBQU1BQ0FCQmx2bldBQXZaQkFZQUF3QUlBQUFBQUFBR0FBTUFCQUFWQUFBQUJ3QUZBQVFBQUFBSUFBQUFCZ0FBQUFZQUJBQUNBQUFBRHdBQkFBQUFBQUFBQUFJQUJ3QUFBQm9BQ0FBQUFBQUFBUUFEQUFBQURBQUFBQUFBQVFBRkFBd0FBQUFBQUFRQUFnQUFBQU1BQmdBQkFBUUFDZ0FBQUFJQUFBQUFBQVVBQndBQkFCTUFHZ0FCQUFNQUFBQURBQUFBQUFBR0FCQUFBQUFDQUJrQUN3QUJBQTRBQUFBR0FCWUFGQUFBQUFBQUFBQUVBQUFBQUFBRkFBSUFDd0FDQUJZQUFBQUFBQU1BQVFBQUFBRUFBQUFNQUFJQUZBQUFBQUFBQkFBREFBa0FDUUFBQUFFQUFBQUFBQUlBQVFBQkFBQUFBUUFBQUFFQUJ3QUZBQVVBQUFBQUFBRUFBd0FEQUFJQUVRQWNBQUlBRVFBREFBQUFEUUFDQUFFQUFRQXdBQXNBQndBQUFBQUFIQUFCQUFFQUF3QUNBQUFBQVFBTkFBQUFDUUFBQUFFQUFRQUdBQVlBQWdBQUFBRUFBd0FOQUFRQUF3QVJBQVVBQUFBSkFBQUFBQUFBQUFJQUFnQVVBQUFBQUFBQUFBRUFCQUFCQUFBQUFRQURBQUFBQUFBQ0FBQUFDUUFEQUFBQUFBQUFBQUlBQUFBSEFBTUFBUUFBQUFNQUJRQVFBQUVBQUFBVEFBQUFBd0FGQUFBQUFnQUFBQUFBQVFBQkFBRUFBUUFEQUFRQUF3QUJBQTBBQUFBQkFBSUFBQUFJQUFjQUFRQURBQUFBQUFBQUFBNEFCQUFBQUFZQURRQUFBQUFBQUFBREFBQUFBQUFEQUFBQUFBQWdBQW9BQUFBQkFBSUFBQUFBQUFBQUJ3QUlBQUFBQ0FBZkFBRUFBQUFUQUFnQUFRQUtBQVVBQkFBSUFBRUFBUUFBQUFFQUJBQURBQVlBQWdBQkFBQUFBQUFBQUFVQUFBQUJBQUFBQUFBQUFBUUFBQUFBQUF3QUFnQUhBQUFBQUFBTUFBTUFBQUFBQUFrQUFnQUJBQVFBUWZqOTFnQUxBd2dBQVFCQmh2N1dBQXQ5Q1FBSEFBOEFBUUFrQUF3QUFnQUJBQUFBQUFBQUFBZ0FBUUFKQUFzQUFBQVBBQUlBQVFBQUFBQUFBQUFjQUFJQUFRQUJBQU1BQVFBQkFBQUFBQUFGQUFFQUFBQUFBQUFBQVFBR0FBa0FBZ0FIQUFVQURBQUNBQUVBQmdBREFBSUFBd0FDQUFRQUF3QURBQWNBQUFBQkFBUUFDZ0FBQUFFQUJBQUJBQUlBUVl6LzFnQUxtUUVEQUFNQUFRQUJBQWdBTlFBQUFBTUFBZ0FBQUFJQUFRQUFBQUVBQVFBQ0FBQUFDd0FDQUFFQUFBQUFBQVlBQUFBRUFBY0FBUUFFQUFRQUFnQUFBQUFBQXdBQ0FBRUFBQUFBQUF3QUFnQUxBQUVBREFBQUFBQUFBUUFBQUFNQUZBQUJBQU1BQVFBQkFBa0FBQUFGQUFNQUNnQUFBQUVBQ1FBSEFBQUFCUUFBQUFNQUFnQUFBQUFBREFBTUFBd0FEZ0FBQUFRQUFRQUFBQUlBUWJhQTF3QUw1d01CQUFFQUFBQUJBQU1BQkFBQkFBSUFBZ0FBQUFVQUFBQUZBQXdBQUFBQUFBUUFBUUFBQUFBQU5BQUhBQU1BQ2dBQUFBQUFBQUFDQUFRQUJRQUFBQUlBQ0FBQUFBQUFBQUFHQUFFQUFBQURBQUFBQ0FBUUFBQUFCQUFBQUFBQUFBQUVBQUFBQWdBQ0FBQUFBd0FEQUFFQUJBQUFBQVVBRVFBQkFBRUFBZ0FNQUFrQUNnQUFBQUlBQkFBQkFDRUFBQUFBQUFBQUFRQUZBQUFBQmdBQUFBRUFBQUFBQUFBQUFRQUFBQUVBREFBQUFBRUFBUUFBQUFBQUJ3QUFBQUFBQUFBQ0FBRUFBQUFCQUFFQUFnQUFBQWdBQ1FBRkFBRUFBd0FGQUFJQUFBQUVBQUlBQUFBQUFBRUFBZ0FHQUFjQUJnQURBQWtBQUFBR0FBQUFCZ0FHQUFjQUJBQUFBQ0lBQWdBQ0FBSUFBZ0FJQUFRQUFBQUVBQUFBQ1FBREFBRUFDZ0FGQUFJQUFBQUFBQUlBQndBQkFBRUFCZ0FBQUFFQUF3QUFBQUlBQVFBQUFBVUFCd0FCQUNjQUFnQUlBQUFBQVFBQ0FBTUFBQUFBQUFJQUFRQUpBQUlBQVFBQUFBSUFBUUFSQUFrQUFBQUNBQUVBQUFBTUFBY0FBd0FFQUFjQUFRQU1BQUVBQ1FBQUFBVUFBZ0FBQUFrQUFRQUJBQU1BQUFBSEFBQUFEd0FBQUFBQUFBQUNBQUlBQ1FBQUFBb0FBZ0FBQUFBQUJ3QUZBQUFBQVFBQUFBVUFBQUFKQUFBQUFRQUNBQUFBQUFBRkFBa0FCQUFEQUFRQUFBQUNBQUVBQkFBQkFBQUFBQUFDQUVHbWhOY0FDMDhKQUFjQUFBQUJBQVVBQ1FBQ0FBOEFBUUFEQUFFQUFBQUFBQU1BQUFBQ0FBQUFBd0FGQUFBQUFnQUFBQVFBQVFBQUFBQUFBQUFCQUFBQUFRQUhBQUFBQWdBQUFBSUFDQUFBQUFBQUNRQUJBRUdBaGRjQUMyRUNBQUVBQWdBR0FBQUFBQUFQQUFBQUFRQUhBQUFBQVFBQUFBMEFBQUFDQUFZQUFBQURBQU1BQVFBSEFBMEFCZ0FFQUFFQUFRQUFBQUVBQUFBQkFBVUFBZ0FBQUFBQUFBQVlBQUlBQWdBQUFBQUFCd0FBQUFBQUF3QUJBQWdBRUFBREFFSHNoZGNBQzJjRUFBY0FBQUFCQUFBQUFnQUVBQUFBQ0FBQUFBQUFBQUFMQUFBQUFRQUFBQWdBQ2dBQkFBVUFBUUFBQUFjQUJnQUFBQUVBQUFBQUFBRUFCQUFBQUFzQUJBQURBQUFBQUFBTUFBRUFBQUFEQUFnQUFBQUJBQUVBQUFBREFBc0FCZ0FBQUFFQUFnQUJBRUhlaHRjQUN6c0JBQUFBQUFBSkFBTUFCZ0FBQUFNQUF3QUJBQUVBQVFBQUFBQUFCUUFBQUFBQUJ3QURBQWdBQWdBRUFBQUFCQUFHQUFFQUFnQUJBQUlBQXdCQnBvZlhBQXN2QWdBQkFBQUFBZ0FBQUFjQUF3QUtBQU1BQVFBRUFBRUFCQUFDQUFZQUF3QUNBQUFBQUFBSUFCRUFBQUFBQUEwQVFlQ0gxd0FMbXdNR0FBVUFBQUFCQUFBQUFBQUJBQVFBQUFBQUFBUUFBUUFCQUFBQUFBQVBBQVFBQWdBREFBQUFBQUFDQUFJQUFnQUFBQUFBQUFBRkFBSUFDQUFDQUFBQUFnQUFBQVVBQmdBQkFBa0FBQUFCQUFFQUJBQUNBQUVBQUFBQUFBQUFBZ0FDQUFNQUFRQUZBQUlBQUFBQUFBUUFCUUFCQUFBQUFRQUFBQWtBQUFBQ0FBRUFBQUFEQUFBQUFnQUNBQU1BQUFBQUFBa0FBUUFEQUFBQUFRQUdBQU1BQUFBQ0FBRUFCd0FEQUFBQUJRQUFBQUVBQUFBQUFBQUFCQUFGQUFBQUFRQUFBQU1BQWdBQkFBQUFBZ0FBQUFFQUVRQUJBQUVBQkFBQUFBRUFBQUFCQUFFQUFBQUVBQU1BQUFBQUFBQUFBZ0FCQUFBQUZ3QUVBQUFBQUFBQUFBTUFEQUFBQUFnQUF3QUNBQU1BQlFBQUFBSUFBd0FDQUFFQUFBQURBQUFBQVFBQkFBQUFBUUFBQUFRQUFRQUdBQUlBSFFBRUFBUUFBQUFBQUFBQUFRQUFBQUFBQ1FBQ0FBY0FBZ0FGQUFBQUFBQUpBQUVBQkFBQUFBRUFBQUFBQUFRQUJ3QUFBQVlBQlFBQUFBRUFBUUFBQUFNQUFRQUJBQUlBQUFBQUFBQUFBZ0FBQUFBQUFBQUJBQUFBQWdBREFBVUFBUUFIQUFFQUFRQURBQUlBUVlpTDF3QUxDUUVBQUFBQUFBSUFBZ0JCbkl2WEFBdi9Bd0VBQUFBRUFBTUFBZ0FFQUFBQUFBQUJBQUFBQUFBQ0FBc0FDQUFBQUFRQUF3QUJBQWtBQXdBQ0FBRUFBd0FBQUFJQUJRQUFBQVVBQVFBREFBVUFBZ0FCQUFNQUFBQVFBQUlBQUFBQUFBQUFBUUFBQUFZQUFBQUJBQU1BQUFBSUFBQUFBQUFDQUFZQUFBQUVBQUFBQUFBQkFBQUFCQUFBQUFNQUFRQURBQUFBQWdBREFBRUFCUUFEQUFVQUJRQUJBQUVBQVFBQUFBWUFBd0FCQUFBQUFRQUJBQUFBQXdBQ0FBRUFCZ0FBQUFVQUFnQURBQWtBQndBRUFBQUFBZ0FDQUFFQUFnQUdBQUFBQUFBQUFBSUFBQUFCQUFBQUJBQURBQUFBQWdBRkFCSUFCUUFDQUFBQUFRQU5BQU1BQkFBQUFBQUFBUUFDQUFBQURRQUFBQTBBQVFBQUFBRUFBQUFCQUFFQUFRQUJBQUVBQVFBQ0FBQUFBUUFGQUFNQUFBQUZBQUFBQVFBQUFBQUFCQUFBQUFJQUFRQUFBQUVBQWdBQUFBQUFCUUFBQUFFQUFBQUFBQUFBQVFBQUFBTUFBQUFCQUFJQUFnQUFBQUFBQVFBQUFBVUFBQUFOQUFBQUFRQUNBQW9BQXdBQUFBQUFBZ0FDQUFFQUFnQUFBQUlBQVFBQkFBVUFBQUFLQUFBQUFBQURBQU1BQ1FBQkFBUUFBZ0FDQUFBQUFBQURBQVlBQUFBQUFBb0FBUUFEQUFFQURBQUFBQUFBQUFBQ0FBRUFCZ0FCQUFBQUFRQUNBQWNBQUFBQUFBVUFBZ0FCQUFBQUFRQUJBQUVBQUFBRUFBQUFBQUFCQUFBQUFRQUFBQUVBQmdBQUFBZ0FBQUFDQUFRQUFnQUVBQUlBQWdBQUFBSUFRYVNQMXdBTEtRSUFBQUFGQUFJQUJnQUFBQUVBQWdBRkFBQUFBQUFCQUFBQUFnQUFBQVVBQUFBQkFBRUFBZ0FEQUVIV2o5Y0FDOHNDQlFBQUFBQUFBUUFOQUFFQUFBQUFBQUFBQVFBQUFBVUFBZ0FBQUFjQUNRQUJBQUlBQWdBQUFBRUFDUUFIQUFBQUJRQUNBQUFBQVFBQkFBVUFCZ0FDQUFBQUR3QUFBQUVBQUFBRkFBRUFBZ0FCQUFJQUFBQUFBQUlBQXdBQUFBY0FBd0FBQUFBQUF3QUFBQUlBQWdBQkFBSUFBUUFDQUFVQUFRQUFBQWtBQUFBQUFBQUFCZ0FKQUFFQUNnQUJBQUVBQUFBQUFBTUFCZ0FBQUFBQUFBQUJBQUlBQUFBQUFBY0FBZ0FBQUFBQUFRQUFBQUFBQUFBREFBRUFBQUFFQUFFQUJnQUNBQUlBQUFBQUFBUUFDd0FCQUFBQUFBQUZBQUVBQXdBQUFBSUFCZ0FJQUFJQUFBQUdBQUFBQkFBQkFBWUFBQUFDQUFNQUFRQUJBQUVBQXdBQ0FBSUFBZ0FDQUF3QUFRQUFBQVFBQlFBQUFBUUFBQUFBQUFFQUFBQUFBQUFBQVFBQUFBSUFBQUFBQUFBQUFRQUNBQUFBQUFBSUFBUUFBUUFDQUFBQUF3QUJBQUlBQUFBREFBTUFCd0JCcXBMWEFBdGxBUUFMQUFBQUFRQUFBQUFBQWdBQkFBSUFBUUFIQUFFQUFnQURBQUlBQUFBQUFBRUFCQUFCQUFFQUFRQUJBQUVBQUFBS0FBRUFCUUFBQUFZQUFBQUFBQUFBQVFBREFBRUFCd0FDQUFBQUFBQUJBQUlBQVFBQ0FBQUFBUUFCQUFFQUFRQUFBQVlBUVppVDF3QUxSd01BQlFBQUFBTUFBUUFDQUFZQUFRQUFBQUVBQWdBQUFBSUFBd0FBQUFFQUFBQURBQUlBREFBQkFBWUFDQUFIQUFJQUFRQURBQUFBQmdBQ0FBQUFBQUFCQUFBQUFBQUNBRUhvazljQUMrRUJCUUFBQUFVQUFBQUFBQUVBQWdBQkFBQUFBUUFCQUFBQUNnQUNBQUFBQUFBTUFBQUFBUUFBQUFJQUF3QUJBQVFBQVFBQ0FBRUFBQUFIQUFFQUFRQUlBQWtBQWdBQUFBSUFBZ0FEQUFNQUFRQURBQUlBQUFBQUFBRUFBQUFHQUFVQUFBQUNBQUlBQUFBQkFBSUFCUUFFQUFJQUFRQUNBQUFBQUFBQkFBQUFBUUFCQUFJQUFBQUhBQVVBQXdBQUFBQUFBUUFBQUFRQUF3QUFBQUlBQndBQkFBQUFBZ0FBQUFJQUJBQUNBQUFBQUFBQ0FBQUFEZ0FCQUFFQUFBQUFBQU1BQUFBREFBQUFBQUFDQUFBQUFBQUdBQU1BQXdBREFBRUFBQUFCQUFBQUFBQURBRUhTbGRjQUM1RUVBUUFBQUFjQUJRQUJBQUFBQVFBQkFBTUFBUUFKQUFBQUFBQUlBQUFBQUFBUEFBSUFBZ0FBQUFRQUFBQUFBQUFBQWdBQUFBRUFCd0FDQUFFQUFBQUJBQUVBQWdBQUFBQUFBZ0FBQUFBQUFnQUFBQUlBQWdBQkFBWUFBQUFCQUFBQUFRQUVBQUFBQWdBREFBRUFBZ0FBQUFNQUFnQUJBQUFBQVFBQUFBQUFBQUFDQUFBQUFRQUVBQUVBRGdBREFBTUFBQUFGQUFFQUFBQUFBQUlBQVFBQ0FBQUFBQUFEQUFBQUFnQUJBQUFBQVFBQUFBRUFBZ0FBQUFFQUFBQUJBQUVBQVFBQkFBVUFBd0FBQUFvQUFnQUNBQUVBQUFBQUFBUUFBQUFDQUFvQUFBQUFBQWdBQkFBQUFBRUFCQUFGQUFVQUFnQUJBQUFBQUFBQUFBWUFBQUFCQUFFQUFBQUFBQUVBQVFBQ0FBRUFBQUFCQUFJQUFnQUNBQUFBQVFBQkFBRUFBZ0FBQUFFQUFBQUJBQUFBQVFBQ0FBRUFBQUFCQUFJQUFBQUNBQUlBQUFBQUFBQUFBd0FBQUFFQUF3QUJBQUlBQndBQUFBSUFCQUFFQUFBQUJRQUFBQUFBQVFBREFBTUFBQUFKQUFFQUFBQUJBQUlBQkFBREFBRUFBQUFCQUFFQUFnQURBQUVBQmdBREFBRUFBd0FCQUFVQUJBQUJBQUFBQVFBQkFBQUFCUUFCQUFBQUFRQUJBQUlBQUFBRkFBZ0FBUUFBQUFjQUFBQUFBQUFBQlFBQkFBQUFBQUFCQUFBQUFRQUFBQUFBQWdBQ0FBQUFBQUFLQUFBQUFBQUFBQUVBQUFBQkFBY0FBZ0FFQUFBQUFRQUZBQUFBQVFBQUFBQUFBQUFFQUFBQUFBQUVBQUlBQUFBQ0FBRUFBUUFBQUFJQUFRQkI3cG5YQUF2TEF3RUFBZ0FBQUFBQUJBQUFBQUVBQUFBREFBTUFBQUFCQUFNQUFRQUFBQUVBQUFBQUFBSUFBQUFLQUFBQUFRQUFBQUFBQXdBQkFBRUFCUUFFQUFNQUFBQUFBQUlBQVFBQUFBRUFBQUFCQUFJQUFnQUJBQUFBQkFBQkFBQUFBd0FCQUFFQUJRQUJBQUVBQndBQkFBTUFBQUFBQUFRQUF3QUJBQUlBQ3dBQ0FBRUFBQUFBQUFBQUFRQUNBQUVBQkFBREFBRUFBUUFDQUFBQUFBQUNBQUlBQUFBQUFBQUFBZ0FDQUFFQUFBQUNBQUFBQUFBQkFBRUFDQUFDQUFFQUFBQURBQUFBQVFBQkFBRUFBQUFEQUFRQUFnQUhBQU1BQVFBSkFBSUFCUUFDQUFJQUF3QUFBQThBQUFBQ0FBRUFBd0FFQUFFQUFBQURBQWtBQWdBQkFBZ0FBQUFCQUFFQUFBQUpBQUFBQUFBQkFBQUFDZ0FBQUFRQUFRQUFBQUlBQXdBSkFBSUFBQUFBQUFVQUFRQUNBQU1BQWdBQUFBRUFBZ0FDQUFFQUF3QUFBQUFBQWdBQkFBRUFBQUFCQUFVQUFRQUNBQUlBQWdBQ0FBSUFBZ0FJQUFVQUFBQUJBQUVBQWdBQUFBRUFBQUFMQUFRQUFBQUNBQUlBQkFBQUFBRUFBZ0FBQUFBQUFRQUJBQUVBQVFBQ0FBQUFBZ0FBQUFJQUJRQUVBQUFBQUFBQUFBVUFBQUFBQUFNQUFnQUJBQUFBQUFBQUFBTUFBQUFDQUFBQUFBQUJBQUlBQWdBQkFBQUFBUUFFQUFFQUFRQkJ4SjNYQUFzckFRQUNBQUFBQkFBQUFBRUFBZ0FBQUFFQUFnQUFBQUFBQVFBQUFBSUFBZ0FCQUFFQUFRQUFBQU1BQVFCQitwM1hBQXVMQWdFQUFBQUJBQWdBQkFBQkFBSUFCd0FGQUFBQUF3QUNBQUFBQWdBQ0FBUUFBQUFFQUFBQUJBQUNBQUVBQWdBQ0FBSUFBUUFBQUFBQUFRQURBQU1BQVFBQkFBSUFBZ0FBQUFFQUFRQUFBQUVBQUFBQkFBRUFBd0FFQUFFQUFnQUNBQVFBQUFBREFBRUFBUUFCQUFBQUF3QUJBQUFBQXdBQ0FBRUFBQUFEQUFJQUFRQUdBQVlBQUFBQUFBSUFBUUFBQUFFQUFnQURBQUlBQVFBREFBRUFBQUFCQUFVQUF3QUJBQUlBQkFBTkFBQUFBUUFBQUFBQUFRQUFBQUFBQVFBQkFBRUFBQUFBQUFFQUFRQUNBQUFBQXdBREFBQUFBUUFBQUFJQUFBQUZBQUFBQVFBQUFBRUFBQUFBQUFRQUFRQUNBQUFBQUFBQ0FBSUFBQUFBQUFFQUJBQUNBQUFBQUFBRUFBRUFBZ0JCanFEWEFBdFZBUUFCQUFJQUF3QUFBQUVBQWdBREFBRUFBQUFDQUFFQUFRQUFBQU1BQWdBQkFBRUFBQUFBQUFNQUFBQURBQUFBQUFBQUFBTUFBQUFDQUFFQUFRQUNBQUFBQkFBQUFBRUFBQUFCQUFZQUFBQUVBQUVBQWdCQjdLRFhBQXNWQVFBQ0FBQUFBZ0FBQUFJQUFBQUJBQUlBQVFBQ0FFR09vZGNBQ3lFREFBQUFBZ0FCQUFFQUFBQUNBQUFBQUFBREFBZ0FBd0FBQUFBQUFBQUNBQUVBUWJpaDF3QUx5d0lCQUFNQUF3QUVBQUFBQXdBQkFBQUFBUUFCQUFBQUFnQUVBQUVBQWdBQkFBUUFBZ0FCQUFBQUFBQUJBQUFBQUFBQUFBRUFBUUFJQUFBQUF3QUFBQUVBQVFBRUFBRUFBZ0FBQUFFQUFRQUFBQU1BQVFBQUFBZ0FBQUFBQUFJQUFRQUVBQVVBQmdBQkFBSUFBQUFEQUFNQUFBQUJBQUFBQXdBQUFBUUFBQUFGQUFFQUFnQUJBQU1BQWdBRUFBRUFBUUFDQUFFQUF3QUZBQUVBQXdBQkFBQUFBQUFEQUFBQUF3QUJBQVVBQUFBQkFBQUFBUUFDQUFFQUFBQUVBQUlBQWdBQkFBSUFBUUFGQUFBQUFRQUNBQUVBQUFBQUFBRUFDZ0FEQUFJQUFnQUFBQVFBQVFBQUFBRUFBQUFEQUFBQUFRQUJBQUFBQVFBQkFBSUFBQUFCQUFJQUFBQUNBQUFBQVFBQ0FBSUFBd0FBQUFNQUF3QUVBQU1BQUFBQUFBY0FBQUFDQUFJQUFBQUJBQUlBQUFBQUFBSUFBQUFDQUFBQUFBQUJBQUFBQVFBREFBSUFBd0FDQUFBQUFBQUNBRUdPcE5jQUM5MjNBd0VBQUFBQkFBRUFBUUFDQUFFQUFBQUJBQUVBQUFEbDFRRUF0QklCQUREVUFRQVhFUUVBOGYwQUFHME9Bd0RmSkFBQVBBTUJBQmovQUFEQUR3RUFjdjBBQUc0TkF3Q2oxUUVBY2hJQkFBQWdBQUFUQVFFQVA5UUJBQ1lSQVFDWE1RQUFud1FCQU16OEFBQWZEQUlBMmpNQUFDRUpBZ0NKTWdBQTZnVUJBT3IvQUFDR0VBRUE0U1FBQUQ0REFRQlZJUUFBd3dFREFKZ3lBQUQ1QlFFQStQNEFBSndQQXdCSC93QUE3dzhCQU96N0FBQTlDZ01BRU5RQkFQY1FBUUIzSVFBQUR3SUVBTlBVQVFDdUVRRUFZLzBBQUVFTkF3QmJNd0FBNkFjQ0FOaitBQUIyRHdFQXVESUFBQ0FHQWdEMDFRRUF3eElCQUNmL0FBRFBEd0VBVmVBQkFQQVVBUUNzL3dBQVZCQUJBSm9lQUFEcUFBSUFNdFVCQUFnU0FRQjZNd0FBT1FnQ0FFSGdBUURjRkFFQVNDRUFBTEVCQVFBZDhnRUFSUllCQUR6WEFRQUpGQUVBcUIwQUFOSUFBUUJLTHdBQW93TUJBRFgvQUFEZER3RUFqdFFCQUhRUkFRQVE3Z0VBR0JVQkFIMHZBQURXQXdFQWtpUUFBS2NDQXdCWSt3QUF3UWtCQUNmeUFRQlBGZ0VBVGk4QUFLY0RBUUJTMWdFQUlSTUJBQWJ4QVFDaUZRSUFKTmNCQVBFVEFRRGExZ0VBcHhNQkFBUXlBQUMwQkFNQTZmNEFBSWNQQVFBMThRRUFDQllCQUQ0Z0FBQTBBUUlBYnRRQkFGUVJBUUJRMXdFQUhSUUJBSmt6QUFDQUNBSUExLzhBQUhnUUFRQVJNZ0FBM2dRRUFEalZBUUFPRWdFQVplQUJBQUFWQVFBVk13QUEyUVlHQUlJekFBQkxDQUlBWVRFQUFHd0VBUUFLMWdFQTJSSUJBT1hVQVFEQUVRRUFKQzhBQUgwREFRQnIvZ0FBOVE0QkFJL1ZBUUJlRWdFQXd2NEFBR0FQQVFBdS9BQUEwZ29DQVBJeUFBQjNCZ0VBRFA4QUFMUVBBUUEzNEFFQTBoUUJBS0hYQVFCdUZBRUFZak1BQVBZSEF3QlErd0FBdVFrQkFQTFhBUUM5RkFFQXAvd0FBTlVMQWdCWjRBRUE5QlFCQUpuOUFBRGREUU1BWk5RQkFFb1JBUUI0K3dBQTRRa0JBRmorQUFEakRnRUE3aklBQUhNR0FRQ29Cd0VBc1JBQkFGejlBQUFzRFFNQWZpQUFBRTBCQVFBYU1nQUFBZ1VFQU5qWEFRQ2pGQUVBUUIwQUFKb0FBUURlL0FBQVF3d0NBUGZNQVFEa0VBRUFwVElBQUFZR0FRQU0vQUFBamdvQ0FFRC9BQURvRHdFQXdETUFBT0lJQWdCQS9BQUE5Z29DQU0zVkFRQ2NFZ0VBK05jQkFNTVVBUUNoSFFBQXl3QUJBQ1l2QUFCL0F3RUFCdGNCQU5NVEFRQTIvd0FBM2c4QkFGb3lBQUNnQlFJQWhDOEFBTjBEQVFCOU1RQUFpQVFCQUJiOEFBQ2lDZ0lBdHRVQkFJVVNBUUE3L1FBQUFnMENBRDR4QUFCSkJBRUFuOVlCQUc0VEFRQ29KQUFBNlFJREFBL1ZBUURuRVFFQVV2MEFBQTROQXdBU0lRQUFod0VCQVBEOUFBQnFEZ01BZXRjQkFFY1VBUUIrL3dBQUpoQUJBT0RYQVFDckZBRUFCL3dBQUlRS0FnQmIrd0FBeEFrQkFKelVBUUNDRVFFQVNQNEFBTkFPQVFBZzhnRUFTQllCQUlzdkFBRGtBd0VBU0NBQUFEZ0JBZ0RzL0FBQVlRd0NBSWt2QUFEaUF3RUFTZndBQUFnTEFnQ1RNZ0FBOUFVQkFJVURBQUJjQUFNQUxDSUFBQ0lDQWdDNkx3QUFFd1FCQU1ZeUFBQThCZ0lBQU5ZQkFNOFNBUUNNMVFFQVd4SUJBSEg3QUFEYUNRRUFYOVVCQUM0U0FRQ1UxQUVBZWhFQkFBd3lBQURNQkFNQTVOUUJBTDhSQVFDMEhRQUEzZ0FCQUlML0FBQXFFQUVBc1RJQUFCSUdBZ0IxSkFBQVRnSURBR3ZVQVFCUkVRRUFvQjBBQU1vQUFRRFUxQUVBcnhFQkFJLzdBQUQ0Q1FFQW90Y0JBRzhVQVFDRUlBQUFVd0VCQUpvSEFRQ2pFQUVBOE5ZQkFMMFRBUUN2QndFQXVCQUJBSmZWQVFCbUVnRUFGUHdBQUo0S0FnQ2VNUUFBcGdRQkFJSXlBQURqQlFFQWlBY0JBSkVRQVFBaTdnRUFLUlVCQUNyOUFBRGdEQUlBT2ZFQkFBd1dBUUFLL3dBQXNnOEJBSkF5QUFEeEJRRUFPZUFCQU5RVUFRQWU4Z0VBUmhZQkFBUXpBQUNYQmdVQW9kWUJBSEFUQVFDekpBQUFDZ01EQUpneEFBQ2dCQUVBbHU0QkFIY1ZBUUJCL0FBQStBb0NBRDMrQUFESERnRUFPOWNCQUFnVUFRQ2RwZ0FBaHdrQkFLL1ZBUUIrRWdFQWJ6RUFBSG9FQVFEMy9nQUFtUThEQU9nekFBQS9DUUlBdmlRQUFCc0RBUUM3TXdBQTJBZ0NBT3d6QUFCS0NRTUFueklBQUFBR0FRQUMxQUVBNlJBQkFKSWdBQUJnQVFFQTdqTUFBRkFKQXdDaS9nQUFRQThCQU5MVUFRQ3RFUUVBaWpJQUFPc0ZBUUNsL3dBQVRSQUJBSmt5QUFENkJRRUF4TlVCQUpNU0FRQzIxZ0VBZ3hNQkFBai9BQUN3RHdFQTZ0Y0JBTFVVQVFBVkx3QUFiZ01CQUtza0FBRHlBZ01BMlRNQUFCNEpBd0RqL3dBQWZ4QUNBT0xXQVFDdkV3RUFLTmNCQVBVVEFRQ3UvQUFBNHdzQ0FDRWhBQUNUQVFNQUl0UUJBQWtSQVFBZTFBRUFCUkVCQUQ4ZEFBQ1pBQUVBaHY4QUFDNFFBUURCL1FBQVZRNERBRVg4QUFBQUN3SUEyOHdCQU1nUUFRQUsxUUVBNUJFQkFKMEhBUUNtRUFFQVFBRUFBQjRBQWdCczF3RUFPUlFCQU5UK0FBQnlEd0VBZXRZQkFFa1RBUUFiOFFFQXpSVURBTGNDQUFCRkFBRUFXTlFCQUQ0UkFRQ08vUUFBd2cwREFMUCtBQUJSRHdFQVgvc0FBTWdKQVFESkx3QUFJZ1FCQU13a0FBQXBBd0VBcWRRQkFJZ1JBUUF4L1FBQTdnd0NBTVFCQUFBakFBTUFWakVBQUdFRUFRRHoxQUVBemhFQkFNZ2tBQUFsQXdFQUF2c0FBSmNKQWdEZCt3QUFLUW9DQUdqWEFRQTFGQUVBdGdJQUFFUUFBUUI4K3dBQTVRa0JBRVloQUFDdkFRRUF3djhBQUdjUUFRQ2kxZ0VBY1JNQkFBWWdBQUFaQVFFQVJkUUJBQ3dSQVFBTC93QUFzdzhCQVByVkFRREpFZ0VBQ2k4QUFHTURBUUFVTHdBQWJRTUJBR3IrQUFEMERnRUF3dFlCQUk4VEFRQjkvUUFBancwREFIQXpBQUFnQ0FNQWJ6SUFBTHdGQWdBcTdnRUFMUlVCQUliOEFBQ09Dd0lBRXY4QUFMb1BBUUFGTHdBQVhnTUJBT0g3QUFBdUNnRUFHKzRCQUNNVkFRQnFJUUFBK0FFQ0FIajhBQUJ5Q3dJQXZ0UUJBSm9SQVFCbU13QUFBZ2dEQUo3V0FRQnRFd0VBZ2pFQUFJMEVBUUFsMUFFQURCRUJBR0RYQVFBdEZBRUFPU0VBQUtVQkFRQ2wvUUFBQVE0REFMZ3pBQURTQ0FJQUEvc0FBSmtKQXdCaDFBRUFSeEVCQUl2VkFRQmFFZ0VBZnZ3QUFINExBZ0R0MXdFQXVCUUJBRWZnQVFEaUZBRUF4RE1BQU93SUFnQ3c3Z0VBaWhVQkFHY2tBQUF6QWdFQXlOUUJBS01SQVFCdy93QUFHQkFCQUREOEFBRFdDZ0lBZWU0QkFGMFZBUURGL1FBQVlRNERBQTNYQVFEYUV3RUFZZjhBQUFrUUFRRGUxd0VBcVJRQkFCYlVBUUQ5RUFFQWtQOEFBRGdRQVFDUU13QUFhZ2dDQU4zTUFRREtFQUVBalFjQkFKWVFBUUNvN2dFQWd4VUJBRkQ4QUFBV0N3SUFjdFVCQUVFU0FRRFgvZ0FBZFE4QkFDbldBUUQ0RWdFQWs5WUJBR0lUQVFDcy9RQUFGZzREQU1NekFBRHFDQUlBOHY0QUFKQVBBUUJXSVFBQXhnRURBRUh5QVFCbkZnTUFQQ0FBQURJQkFnQVAxQUVBOWhBQkFHVWhBQURzQVFJQThRTUFBR2tBQVFDaUJ3RUFxeEFCQUkzN0FBRDJDUUVBSlB3QUFMNEtBZ0FRMVFFQTZCRUJBRGt5QUFCbUJRTUFmdFlCQUUwVEFRQU5NZ0FBendRREFEQXpBQUJKQndNQU5kY0JBQUlVQVFCeSt3QUEyd2tCQUZIdUFRQkRGUUVBTmRZQkFBUVRBUUFtL0FBQXdnb0NBQmp5QVFCQUZnRUFSU0VBQUs0QkFRQzRIUUFBNGdBQkFKdlhBUUJvRkFFQVRERUFBRmNFQVFDYy9BQUF2d3NDQU8vOEFBQm5EQUlBM1RJQUFHSUdBUUFzSVFBQW1nRUJBSWpVQVFCdUVRRUFhQzhBQU1FREFRQmI0QUVBOWhRQkFEM2dBUURZRkFFQXNqSUFBQlFHQWdCMi9RQUFlZzBEQUcvOUFBQmxEUU1BUWZFQkFCUVdBUUFuMWdFQTloSUJBSmYvQUFBL0VBRUFuaThBQVBjREFRQWEvUUFBd0F3Q0FBcnhBUUNxRlFJQXR5OEFBQkFFQVFEZC9BQUFRUXdDQUJEOEFBQ1dDZ0lBUnpNQUFLRUhCUUJwTXdBQUN3Z0RBTVl6QUFEd0NBUUFEek1BQU1FR0JBQ1lMd0FBOFFNQkFJcjdBQUR6Q1FFQVZ2MEFBQm9OQXdCTTFBRUFNeEVCQUl6V0FRQmJFd0VBcy8wQUFDc09Bd0N1THdBQUJ3UUJBTmJNQVFEREVBRUFzUDhBQUZnUUFRQU8xZ0VBM1JJQkFIQWdBQUJCQVFFQWFhc0FBSklKQVFCbzRBRUFBeFVCQUVBeEFBQkxCQUVBcnY4QUFGWVFBUUJWTVFBQVlBUUJBRkg3QUFDNkNRRUF1eDBBQU9VQUFRQm1KQUFBTWdJQkFDblhBUUQyRXdFQS8vc0FBSEFLQVFEUUF3QUFYd0FCQU5JekFBQUxDUU1BRXZFQkFMSVZBd0EzSFFBQWtnQUJBRmNnQUFBOEFRUUFUekVBQUZvRUFRQ3pBZ0FBUVFBQkFHVC9BQUFNRUFFQXJ2NEFBRXdQQVFCRThnRUFjQllEQUhFdkFBREtBd0VBRS80QUFMQU9BUUExSVFBQW9RRUJBRnIvQUFBQ0VBRUFRekVBQUU0RUFRQlMxUUVBSVJJQkFEa3pBQUJ1QndNQXl2d0FBQnNNQWdBWi9RQUF2Z3dDQUlmVUFRQnRFUUVBOUFNQUFHc0FBUUExNEFFQTBCUUJBSVQ5QUFDa0RRTUErdFFCQU5VUkFRQWIxUUVBOGhFQkFIcjdBQURqQ1FFQXgvOEFBR3dRQVFCdDdnRUFVeFVCQU5Na0FBQXdBd0VBN3Y4QUFJb1FBUUIzMXdFQVJCUUJBRFQvQUFEY0R3RUEzdFVCQUswU0FRQ0MxQUVBYUJFQkFDdnVBUUF1RlFFQTVpUUFBRU1EQVFCbjdnRUFUaFVCQUFzaEFBQ0FBUUVBZGZzQUFONEpBUURXL3dBQWR4QUJBT2pWQVFDM0VnRUFWaDBBQUs4QUFRRGsrd0FBTVFvQkFEcnlBUUJpRmdFQWEvMEFBRmtOQXdBMThnRUFYUllCQVB6OUFBQ3BEZ1FBbi84QUFFY1FBUUNBN2dFQVloVUJBSVhVQVFCckVRRUFXZjBBQUNNTkF3QTAvZ0FBdmc0QkFFSC9BQURwRHdFQWF2MEFBRllOQXdDdkhRQUEyUUFCQUhZeEFBQ0JCQUVBMlBzQUFDUUtBUUNpK3dBQUN3b0JBQzh2QUFDSUF3RUFPL0VCQUE0V0FRQkExQUVBSnhFQkFNMytBQUJyRHdFQU9ERUFBRU1FQVFESC9RQUFadzREQUVyWEFRQVhGQUVBN1A0QUFJb1BBUUJxTVFBQWRRUUJBSXd2QUFEbEF3RUFzVE1BQU1RSUFnQXUvd0FBMWc4QkFEc3ZBQUNVQXdFQVA5WUJBQTRUQVFESjFRRUFtQklCQUxqVUFRQ1dFUUVBc1NRQUFBUURBd0JiMUFFQVFSRUJBSEF4QUFCN0JBRUE0OWNCQUs0VUFRQzEvZ0FBVXc4QkFKd3pBQUNHQ0FJQWpQd0FBSm9MQWdEZSt3QUFLd29CQUFyOUFBQ2dEQUlBVXVBQkFPMFVBUUNiL1FBQTR3MERBQjR6QUFBRUJ3UUFzeThBQUF3RUFRRG9KQUFBUlFNQkFLOHpBQUM4Q0FZQXJkY0JBSG9VQVFDdTdnRUFpQlVCQUFNekFBQ1VCZ01BY0NRQUFFTUNBZ0RmMWdFQXJCTUJBSXYvQUFBekVBRUFuZ2NCQUtjUUFRREIxUUVBa0JJQkFDVDdBQUN4Q1FFQW5OY0JBR2tVQVFBejhRRUFCaFlCQUZvekFBRG1Cd0lBR2Y0QUFMWU9Bd0NNSUFBQVd3RUJBSURXQVFCUEV3RUExdFVCQUtVU0FRQzQ3Z0VBa2hVQkFGZ2RBQUN4QUFFQStUSUFBSDRHQVFDRy9RQUFxZzBEQUxRSEFRQzhFQUVBampNQUFHWUlBZ0ExL0FBQTRBb0NBSDBzQUFCVkF3RUFOZTRCQURjVkFRQU8vUUFBcUF3Q0FGOHlBQUNxQlFJQThqTUFBRndKQXdCUEhRQUFxQUFCQU5MV0FRQ2ZFd0VBZHZ3QUFHNExBZ0FHMUFFQTdSQUJBTHdBQUFBUEFBTUFNZklCQUZrV0FRQ0o3Z0VBYXhVQkFCWFVBUUQ4RUFFQStQMEFBSWdPQkFBcjFBRUFFaEVCQU5YOEFBQXhEQUlBcGZ3QUFORUxBZ0FCMXdFQXpoTUJBQlAvQUFDN0R3RUFHdFFCQUFFUkFRQjExd0VBUWhRQkFHblVBUUJQRVFFQWhESUFBT1VGQVFDL01nQUFMZ1lDQUNJekFBQVdCd01BK2Z3QUFINE1BZ0JGTHdBQW5nTUJBQ2o5QUFEY0RBSUFkak1BQUM4SUFnQngxd0VBUGhRQkFIZ3ZBQURSQXdFQWdQOEFBQ2dRQVFDWTFBRUFmaEVCQUQveEFRQVNGZ0VBRU5jQkFOMFRBUUMvL2dBQVhROEJBTkV5QUFCV0JnRUF1aVFBQUJjREFRRGMxZ0VBcVJNQkFGYlZBUUFsRWdFQU9QOEFBT0FQQVFBQTF3RUF6Uk1CQUh2OEFBQjRDd0lBSlNBQUFDSUJBZ0JlL1FBQU1nMERBSkQrQUFBdUR3RUFqdGNCQUZzVUFRRGQxd0VBcUJRQkFGSC9BQUQ1RHdFQVNOWUJBQmNUQVFBLzF3RUFEQlFCQUk0eUFBRHZCUUVBbGRjQkFHSVVBUUNJSkFBQWtnSUNBS1lrQUFEakFnTUFuREVBQUtRRUFRQVgxd0VBNUJNQkFBblVBUUR3RUFFQTJOUUJBTE1SQVFEKzF3RUF5UlFCQUdjekFBQUZDQU1BZVA4QUFDQVFBUUFFMUFFQTZ4QUJBRHJVQVFBaEVRRUFpUDhBQURBUUFRQXZJQUFBSndFQkFCalVBUUQvRUFFQWpETUFBR0lJQWdEZERnQUFmZ0FDQVBIVkFRREFFZ0VBd3RRQkFKNFJBUUFrL3dBQXpBOEJBRW4rQUFEUkRnSUFiaVFBQUQ4Q0FnRFAvd0FBY2hBQkFBc3ZBQUJrQXdFQTN4OEFBQVlCQXdENjFnRUF4eE1CQUJiV0FRRGxFZ0VBYlNRQUFEMENBZ0RuL2dBQWhROEJBRnY4QUFBc0N3SUEwZ01BQUdFQUFRQWsxUUVBK2hFQkFHOHpBQUFkQ0FNQXNmc0FBQjBLQWdDdi9BQUE1UXNDQUZFaEFBQzJBUU1BZnk4QUFOZ0RBUUI3TXdBQU93Z0NBQm55QVFCQkZnRUFwKzRCQUlJVkFRQktNd0FBckFjR0FGemdBUUQzRkFFQU5USUFBRm9GQXdCYi93QUFBeEFCQUFqV0FRRFhFZ0VBZFRNQUFDMElBZ0JzTHdBQXhRTUJBUExNQVFEZkVBRUFlOVFCQUdFUkFRQXYxZ0VBL2hJQkFQTXlBQUI0QmdFQXJESUFBQTBHQVFBaDF3RUE3aE1CQUhEdUFRQldGUUVBdmdBQUFCVUFBd0RsTXdBQU9Ra0NBSC8rQUFBUUR3SUFYZFVCQUN3U0FRQjhNd0FBUFFnQ0FLZjdBQUFTQ2dFQXNkVUJBSUFTQVFEOE13QUFlZ2tEQUtyV0FRQjNFd0VBMzlRQkFMb1JBUUJmMUFFQVJSRUJBRExnQVFETkZBRUFTQjBBQUtJQUFRQnAxd0VBTmhRQkFBVFhBUURSRXdFQUlkWUJBUEFTQVFEUk13QUFDUWtDQUwvOUFBQlBEZ01BUHRjQkFBc1VBUUF0TWdBQVFnVURBQ2Y3QUFDMENRRUFLdklCQUZJV0FRQVgvZ0FBdEE0QkFERWRBQUNNQUFFQS9Qd0FBSVFNQWdBWU1nQUErZ1FFQUUzeEFRQWpGZ0lBQi8wQUFKb01BZ0FLTXdBQXJ3WURBR1F2QUFDOUF3RUFZQzhBQUxrREFRQUNJQUFBRlFFQkFITC9BQUFhRUFFQUVmMEFBSzRNQWdCdjFnRUFQaE1CQUx2dUFRQ1ZGUUVBcGgwQUFOQUFBUUFoK3dBQXJna0JBRkRVQVFBM0VRRUFjTllCQUQ4VEFRQjNKQUFBVkFJREFEYjlBQUQ0REFJQVJQd0FBUDRLQWdDMTdnRUFqeFVCQUZNaEFBQzlBUU1BaDljQkFGUVVBUUNOL0FBQW5Bc0NBQXpVQVFEekVBRUFZdndBQUQ0TEF3QzVCd0VBd1JBQkFJUXpBQUJQQ0FJQWQrNEJBRndWQVFEQi9BQUFDUXdDQUxqOEFBRDNDd0lBWFRNQUFPd0hBZ0FjOFFFQTBCVURBSzNWQVFCOEVnRUFtL3NBQUFRS0FRRE9Id0FBK2dBREFGMGRBQUMyQUFFQStqSUFBSDhHQVFEYk1nQUFZQVlCQU9YK0FBQ0REd0VBUWY0QUFNc09BUUFFL3dBQXJBOEJBSTBnQUFCY0FRRUF6aVFBQUNzREFRQ1MvUUFBeUEwREFFSFVBUUFvRVFFQWlnY0JBSk1RQVFCekx3QUF6QU1CQUJFaEFBQ0dBUUVBamdjQkFKY1FBUUROTXdBQUFRa0NBSm9rQUFDL0FnTUF6dGNCQUprVUFRQm4vd0FBRHhBQkFIVDhBQUJxQ3dJQWlmd0FBSlFMQWdCL0lRQUFIZ0lCQUdnaEFBRDFBUUlBbmRVQkFHd1NBUUJoTWdBQXJRVUJBSS9XQVFCZUV3RUFZL3NBQU13SkFRQTM3Z0VBT1JVQkFHelZBUUE3RWdFQWNURUFBSHdFQVFCdDFRRUFQQklCQUVyK0FBRFREZ0lBb3U0QkFINFZBUUJlL2dBQTZRNEJBTFRXQVFDQkV3RUFtOVlCQUdvVEFRQ09JQUFBWFFFQkFKaitBQUEyRHdFQUh0WUJBTzBTQVFBNTFBRUFJQkVCQUhJaEFBQUVBZ01BTUM4QUFJa0RBUUFyMVFFQUFSSUJBSnZVQVFDQkVRRUFDU0VBQUgwQkFnQlEvd0FBK0E4QkFGd3hBQUJuQkFFQVh6TUFBUEFIQWdCT01RQUFXUVFCQUdjeUFBQ3pCUUVBZEM4QUFNMERBUUNUL0FBQXFBc0NBSmp1QVFCNUZRRUFRL0lCQUcwV0F3QmdIUUFBdVFBQkFHTC9BQUFLRUFFQTJkWUJBS1lUQVFCbk1RQUFjZ1FCQUlBa0FBQnlBZ1FBYWYwQUFGTU5Bd0RnTXdBQUx3a0NBSFV4QUFDQUJBRUFGZndBQUtBS0FnQTIxUUVBREJJQkFQajdBQUJoQ2dNQU8vNEFBTVVPQVFBYklRQUFqZ0VCQUswa0FBRDRBZ01BNDh3QkFOQVFBUUFmTXdBQUNBY0VBSEwrQUFENkRnSUFYZFlCQUN3VEFRQnIvQUFBV0FzQ0FHdlZBUUE2RWdFQWZDRUFBQnNDQVFEazF3RUFyeFFCQUliVkFRQlZFZ0VBaS93QUFKZ0xBZ0NpMUFFQWhSRUJBRlA5QUFBUkRRTUFjS2NBQUlnSkFRQVgxUUVBN2hFQkFLclhBUUIzRkFFQWIrNEJBRlVWQVFCWjFRRUFLQklCQUhVR0FBQndBQUlBTnpNQUFHY0hBd0MyQndFQXZoQUJBTkQrQUFCdUR3RUE4d0VBQUR3QUFnRFl6QUVBeFJBQkFCZi9BQUMvRHdFQUxmSUJBRlVXQVFDUkJ3RUFtaEFCQUlyWEFRQlhGQUVBTGU0QkFEQVZBUURRTXdBQUJ3a0NBQVQ3QUFDY0NRTUFaaDBBQUw4QUFRQXJNd0FBTUFjR0FHcnhBUUFxRmdJQXI5Y0JBSHdVQVFDUS9BQUFvZ3NDQUI3L0FBREdEd0VBOGRZQkFMNFRBUUJzL1FBQVhBMERBRm43QUFEQ0NRRUFxdjRBQUVnUEFRQisvZ0FBRGc4Q0FGMHhBQUJvQkFFQWZDOEFBTlVEQVFERTF3RUFrUlFCQUc4dEFBQldBd0VBVTlZQkFDSVRBUUEyL2dBQXdBNEJBTVArQUFCaER3RUFJRElBQUJzRkF3QlAxd0VBSEJRQkFHTXZBQUM4QXdFQVdOWUJBQ2NUQVFEUDF3RUFtaFFCQUFUOEFBQjlDZ01BZ3RZQkFGRVRBUUFpMWdFQThSSUJBUG96QUFCMENRTUE3TllCQUxrVEFRQmJIUUFBdEFBQkFMcjhBQUQ3Q3dJQStETUFBRzRKQXdDLzFRRUFqaElCQUtUOEFBRFBDd0lBdE80QkFJNFZBUUFYOGdFQVB4WUJBS2NkQUFEUkFBRUFOdGNCQUFNVUFRQWcxd0VBN1JNQkFKVDlBQURPRFFNQUdkVUJBUEFSQVFBLzRBRUEyaFFCQU8vWEFRQzZGQUVBb1RNQUFKSUlBZ0JEOFFFQUZoWUJBS1hVQVFDR0VRRUFuQzhBQVBVREFRQUxNd0FBc2dZREFLY0hBUUN3RUFFQUlmOEFBTWtQQVFEQkx3QUFHZ1FCQU1yK0FBQm9Ed0VBTzlZQkFBb1RBUUJHOFFFQUdSWUJBUFBNQVFEZ0VBRUFNOVlCQUFJVEFRQzVKQUFBRmdNQkFFMHpBQUM2QndRQTZUSUFBRzRHQVFEUE13QUFCUWtDQU9uVkFRQzRFZ0VBd0NRQUFCMERBUUJNMWdFQUd4TUJBTVRXQVFDUkV3RUFST0FCQU44VUFRQUgxQUVBN2hBQkFLclVBUUNKRVFFQWp6SUFBUEFGQVFBcDFRRUEveEVCQUpza0FBRENBZ01BU0RNQUFLWUhCQUFJTHdBQVlRTUJBSjdVQVFDREVRRUFpVEVBQUpRRUFRQXMxQUVBRXhFQkFIb2dBQUJKQVFFQXhkWUJBSklUQVFBRklBQUFHQUVCQU1MVkFRQ1JFZ0VBZHZzQUFOOEpBUUQ1MWdFQXhoTUJBRWN4QUFCU0JBRUFoREVBQUk4RUFRQ1NMd0FBNndNQkFOZlZBUUNtRWdFQWcvc0FBT3dKQVFDUUlBQUFYZ0VCQUtYK0FBQkREd0VBbmRjQkFHb1VBUURaMXdFQXBCUUJBTUQ4QUFBSERBSUFlVElBQU5BRkFnQ1Axd0VBWEJRQkFCMHlBQUFPQlFjQXg5WUJBSlFUQVFEMXpBRUE0aEFCQUkvdUFRQndGUUVBRCs0QkFCY1ZBUURmL0FBQVJRd0RBQUhWQVFEY0VRRUFFTllCQU44U0FRRGd6QUVBelJBQkFDSDlBQURPREFJQTVESUFBR2tHQVFBOThRRUFFQllCQVBmOEFBQjZEQUlBUFRFQUFFZ0VBUUNkSFFBQXh3QUJBSFFrQUFCTEFnTUF2ZjhBQUdVUUFRRFExd0VBbXhRQkFETHlBUUJhRmdFQUpmSUJBRTBXQVFEeDF3RUF2QlFCQURJeUFBQlJCUU1BbmlRQUFNc0NBd0IxTHdBQXpnTUJBQkR5QVFBM0ZnRUExZFFCQUxBUkFRQWlNZ0FBSVFVREFJTFhBUUJQRkFFQWlRY0JBSklRQVFBRk13QUFuQVlEQUV2L0FBRHpEd0VBc3Z3QUFPc0xBZ0NaTVFBQW9RUUJBT3IrQUFDSUR3RUFsak1BQUhvSUFnQkhNZ0FBaWdVQkFJajhBQUNTQ3dJQXB2c0FBQkVLQVFDY0hRQUF4Z0FCQUlMOEFBQ0dDd0lBYXU0QkFGRVZBUUE0L1FBQS9Bd0NBQ1V6QUFBZ0J3TUF2OVlCQUl3VEFRQzAxQUVBa2hFQkFNcldBUUNYRXdFQW5qTUFBSW9JQWdCQjFnRUFFQk1CQUdQK0FBRHVEZ0VBMENRQUFDMERBUUNiL0FBQXZBc0RBSTMrQUFBckR3RUFwUjBBQU04QUFRRDVwd0FBalFrQkFEdlVBUUFpRVFFQXV2MEFBRUFPQXdBMDhRRUFCeFlCQUhmOEFBQndDd0lBc0M4QUFBa0VBUUFtMUFFQURSRUJBRlBVQVFBNkVRRUEzTlVCQUtzU0FRRHoxZ0VBd0JNQkFPelZBUUM3RWdFQXhTUUFBQ0lEQVFCb01RQUFjd1FCQU0vV0FRQ2NFd0VBc0NRQUFBRURBd0JvMVFFQU54SUJBQ0x4QVFEaUZRTUFMdFVCQUFRU0FRQVIxUUVBNlJFQkFMRXZBQUFLQkFFQU4vRUJBQW9XQVFDcS93QUFVaEFCQUduN0FBRFNDUUVBeng4QUFQMEFBd0NxMVFFQWVSSUJBUGJXQVFEREV3RUE3TlFCQU1jUkFRRFAxUUVBbmhJQkFLUXlBQUFGQmdFQXpqTUFBQU1KQWdDQkJ3RUFpeEFCQUc4dkFBRElBd0VBSnZFQkFPNFZBd0JhTHdBQXN3TUJBR2ovQUFBUUVBRUFpQzhBQU9FREFRQ3dIUUFBMmdBQkFORDhBQUFuREFJQXNETUFBTUlJQWdBOU13QUFmZ2NGQUduZ0FRQUVGUUVBamY4QUFEVVFBUUFNMXdFQTJSTUJBRVBXQVFBU0V3RUFvUHNBQUFrS0FRQlhNUUFBWWdRQkFGZlVBUUE5RVFFQWxmNEFBRE1QQVFDRC9RQUFvUTBEQUcvVkFRQStFZ0VBRmk4QUFHOERBUUF4MXdFQS9oTUJBRm5VQVFBL0VRRUFtTllCQUdjVEFRQkExd0VBRFJRQkFQVXpBQUJsQ1FNQW5UTUFBSWdJQWdBa01nQUFKd1VEQUJ6OEFBQ3VDZ0lBRnZFQkFMNFZBd0EvSVFBQXJBRUJBRG44QUFEb0NnSUFMUDhBQU5RUEFRREgxUUVBbGhJQkFIY3pBQUF4Q0FJQWlOY0JBRlVVQVFEVkx3QUFMZ1FCQUY3WEFRQXJGQUVBUTljQkFCQVVBUUFMTWdBQXlRUURBRGp5QVFCZ0ZnRUFvak1BQUpRSUF3QjQvZ0FBQWc4Q0FKUCtBQUF4RHdFQWc5WUJBRklUQVFCay9RQUFSQTBEQURUV0FRQURFd0VBTy84QUFPTVBBUUNlSFFBQXlBQUJBQ2N6QUFBbUJ3SUFOdklCQUY0V0FRREExUUVBanhJQkFNd3ZBQUFsQkFFQU1kUUJBQmdSQVFBTDdnRUFFeFVCQUxyWEFRQ0hGQUVBU1B3QUFBWUxBZ0R6L2dBQWtROEJBTTdVQVFDcEVRRUF3LzhBQUdnUUFRRDkxQUVBMkJFQkFCdjhBQUNzQ2dJQWpPNEJBRzBWQVFDRTF3RUFVUlFCQUdReUFBQ3dCUUVBZS84QUFDTVFBUUJaN2dFQVJ4VUJBSkRYQVFCZEZBRUFNUzhBQUlvREFRQWkvd0FBeWc4QkFCMGhBQUNRQVFFQVYrQUJBUElVQVFEKzFnRUF5eE1CQUlUVUFRQnFFUUVBYU5ZQkFEY1RBUUJmL2dBQTZnNEJBR0xWQVFBeEVnRUFuekVBQUtjRUFRQjBJQUFBUXdFQkFPL1ZBUUMrRWdFQXF3Y0JBTFFRQVFDb0lBQUFhd0VDQUdQZ0FRRCtGQUVBVi93QUFDUUxBZ0JXTXdBQTJRY0dBRDNVQVFBa0VRRUF6L3dBQUNVTUFnQkhIUUFBb1FBQkFGVFdBUUFqRXdFQTZQOEFBSVFRQVFBQ013QUFqd1lGQU5uOEFBQTVEQUlBT2RZQkFBZ1RBUUNmMXdFQWJCUUJBTExXQVFCL0V3RUFqdjRBQUN3UEFRQkk0QUVBNHhRQkFEa3dBQUF5QkFFQVpPQUJBUDhVQVFDZ013QUFqd2dEQUovVUFRQ0VFUUVBVEM4QUFLVURBUUF4L0FBQTJBb0NBSkhVQVFCM0VRRUFUZUFCQU9nVUFRQVcvd0FBdmc4QkFHZ2RBQURCQUFFQWNmOEFBQmtRQVFCMjdnRUFXeFVCQUNQVUFRQUtFUUVBelI4QUFQY0FBd0JFL2dBQXpnNEJBREx4QVFBRkZnRUFmTmNCQUVrVUFRQ1Qvd0FBT3hBQkFCc3pBQUQ2QmdRQTlkY0JBTUFVQVFDUC93QUFOeEFCQUtJeUFBQURCZ0VBRHU0QkFCWVZBUURvMWdFQXRSTUJBQ0RWQVFEMkVRRUE1RE1BQURjSkFnQk8xQUVBTlJFQkFObk1BUURHRUFFQXhDOEFBQjBFQVFBa0lBQUFJUUVCQVB3UUFBQ0hBQUVBc1AwQUFDSU9Bd0NIN2dFQWFSVUJBQUF3QUFBdkJBRUE5dnNCQUljV0FRQnYxd0VBUEJRQkFJVXpBQUJSQ0FJQVhUSUFBS1lGQWdERDFnRUFrQk1CQUFyOEFBQ0tDZ0lBZk5ZQkFFc1RBUUNiL3dBQVF4QUJBSHIrQUFBR0R3SUF0QzhBQUEwRUFRQ1dJQUFBWkFFQkFId2tBQUJqQWdNQVN0WUJBQmtUQVFDRjF3RUFVaFFCQU5yWEFRQ2xGQUVBRi9zQUFLc0pBZ0JoMXdFQUxoUUJBTWN5QUFBK0JnSUF3QjhBQVBJQUFnRGpNd0FBTlFrQ0FOdjhBQUE5REFJQXROVUJBSU1TQVFDUDFBRUFkUkVCQUNyOEFBREtDZ0lBVzlVQkFDb1NBUUNLMWdFQVdSTUJBRGZXQVFBR0V3RUF0djhBQUY0UUFRQncxd0VBUFJRQkFLUUhBUUN0RUFFQWhqRUFBSkVFQVFBWS9nQUF0UTRCQUZNeUFBQ1NCUUlBWXlFQUFPa0JBZ0JSTHdBQXFnTUJBUFVEQUFCc0FBRUFteklBQVB3RkFRQzQvd0FBWUJBQkFCVXlBQUR1QkFRQW8vOEFBRXNRQVFESzFBRUFwUkVCQUt2N0FBQVdDZ0VBWmY4QUFBMFFBUUJjL2dBQTV3NEJBRkw4QUFBYUN3SUFteThBQVBRREFRQWExUUVBOFJFQkFEUXlBQUJYQlFNQU13NEFBSGdBQWdDSy9RQUF0ZzBEQUZyOUFBQW1EUU1BbENRQUFLMENBd0NBTHdBQTJRTUJBR2Y3QUFEUUNRRUFvVElBQUFJR0FRQ1gxd0VBWkJRQkFKd3dBQUEyQkFJQTRmOEFBSDBRQVFCNy9RQUFpUTBEQUdIN0FBREtDUUVBRVA4QUFMZ1BBUUNBTWdBQTRRVUJBRGp4QVFBTEZnRUFyak1BQUxjSUJRQ1lCd0VBb1JBQkFEalhBUUFGRkFFQVhmd0FBREFMQWdBTzFRRUE1aEVCQUVzdkFBQ2tBd0VBcEM4QUFQMERBUUMyTWdBQUhBWUNBT3N5QUFCd0JnRUFOVEVBQUVBRUFRREQxUUVBa2hJQkFKZjdBQUFBQ2dFQTZQd0FBRmtNQWdBck1nQUFQQVVEQUVQOEFBRDhDZ0lBNVRJQUFHb0dBUUNsK3dBQUR3b0NBTzdXQVFDN0V3RUFnUDBBQUpnTkF3Q3NIUUFBMWdBQkFOL01BUURNRUFFQVBPQUJBTmNVQVFBM0lBQUFMd0VEQVBqVkFRREhFZ0VBYk5ZQkFEc1RBUUJRTVFBQVd3UUJBSFl5QUFES0JRSUE2dFFCQU1VUkFRQzhNZ0FBS0FZQ0FFWHhBUUFZRmdFQVBpRUFBS3NCQVFBUzFBRUErUkFCQUpBSEFRQ1pFQUVBMnY0QUFIZ1BBUUF1OFFFQUFSWUNBUEhVQVFETUVRRUEwdjRBQUhBUEFRQ0IvUUFBbXcwREFBWXpBQUNmQmdNQWN5UUFBRWtDQWdDdzFnRUFmUk1CQUovN0FBQUlDZ0VBdERNQUFNb0lBZ0FVTWdBQTZnUUVBT0xYQVFDdEZBRUFIVE1BQUFFSEF3QjQxUUVBUnhJQkFDSWhBQUNXQVFJQVJQOEFBT3dQQVFEMzFBRUEwaEVCQU5QOEFBQXREQUlBeXY4QUFHMFFBUUMxQUFBQUNnQUJBREw4QUFEYUNnSUF4ZGNCQUpJVUFRQWwxZ0VBOUJJQkFLTXlBQUFFQmdFQUVUTUFBTWtHQkFBczdnRUFMeFVCQUlBeEFBQ0xCQUVBWGZzQUFNWUpBUUFsK3dBQXNna0JBTzc3QUFCRENnTUF4eThBQUNBRUFRQXZNZ0FBU0FVREFQN1ZBUURORWdFQU5pOEFBSThEQVFCTjF3RUFHaFFCQUtYVkFRQjBFZ0VBd3k4QUFCd0VBUUJzNEFFQUJ4VUJBQWpWQVFEaUVRRUFRZGNCQUE0VUFRQWhNZ0FBSGdVREFCTFZBUURxRVFFQXp2NEFBR3dQQVFEVjFnRUFvaE1CQUtjeUFBQUlCZ0VBdU5ZQkFJVVRBUUFHL3dBQXJnOEJBT1gvQUFDQ0VBRUFQRElBQUc4RkF3RGh6QUVBemhBQkFEbitBQURERGdFQS9Qc0FBRzBLQVFBZDhRRUEweFVEQU0zOEFBQWhEQUlBUXY4QUFPb1BBUUNKSVFBQUh3SURBRWtCQUFBZ0FBSUFzeDBBQU4wQUFRQk43Z0VBUUJVQkFPZldBUUMwRXdFQW9BY0JBS2tRQVFEZEFnQUFVUUFDQUpjdkFBRHdBd0VBSHRjQkFPc1RBUUQ1MUFFQTFCRUJBQUloQUFCekFRRUF0TmNCQUlFVUFRQmJNUUFBWmdRQkFGMnJBQUNQQ1FFQXl3RUFBRFFBQWdEWi9nQUFkdzhCQUdjaEFBRHhBUVFBSVAwQUFNd01BZ0NkMWdFQWJCTUJBR0hWQVFBd0VnRUFQU0VBQUtvQkFRRDAxd0VBdnhRQkFETFdBUUFCRXdFQW12OEFBRUlRQVFDSk13QUFXZ2dFQURRZ0FBQXFBUU1BWngwQUFNQUFBUUFqL3dBQXl3OEJBSGZWQVFCR0VnRUEzUDRBQUhvUEFRQmIxd0VBS0JRQkFMblVBUUNYRVFFQXVqTUFBTllJQWdCbjFnRUFOaE1CQUJ3ekFBRCtCZ01BMTh3QkFNUVFBUURIL2dBQVpROEJBUGJNQVFEakVBRUFtZTRCQUhvVkFRRHV6QUVBMnhBQkFOclZBUUNwRWdFQVZOUUJBRHNSQVFDVTdnRUFkUlVCQVB6VUFRRFhFUUVBcGRjQkFISVVBUUFnOFFFQTNCVURBQ3pYQVFENUV3RUFVdjRBQU40T0FRQ0UxZ0VBVXhNQkFJYitBQUFkRHdJQVlETUFBUElIQWdBUEx3QUFhQU1CQU03VkFRQ2RFZ0VBQzlZQkFOb1NBUUM2MVFFQWlSSUJBQkF2QUFCcEF3RUFKdGNCQVBNVEFRRHIvd0FBaHhBQkFKRWtBQUNrQWdNQUZ2NEFBTE1PQVFCVTF3RUFJUlFCQUsweUFBQU9CZ0VBRmlFQUFJb0JBZ0RPMWdFQW14TUJBQjNYQVFEcUV3RUFxUDRBQUVZUEFRQTAxQUVBR3hFQkFJUFVBUUJwRVFFQVE5UUJBQ29SQVFBYy93QUF4QThCQUFvaEFBQi9BUUVBd2RZQkFJNFRBUUJBNEFFQTJ4UUJBRUV2QUFDYUF3RUF2UjBBQU9jQUFRQXIvQUFBekFvQ0FNb3lBQUJGQmdNQUlUTUFBQkVIQlFCa013QUEvQWNEQUREeEFRQURGZ0VBdmk4QUFCY0VBUUJvL2dBQThnNEJBTVQ4QUFBUERBSUFHZGNCQU9ZVEFRREkxUUVBbHhJQkFOelVBUUMzRVFFQU45VUJBQTBTQVFBNi9RQUFBQTBDQUdRZEFBQzlBQUVBWGpFQUFHa0VBUUFaN2dFQUlSVUJBQUgvQUFDcER3RUFPKzRCQURzVkFRRCsxQUVBMlJFQkFMOGZBQUR3QUFJQWJpRUFBUDhCQVFDejFRRUFnaElCQUVRZEFBQ2VBQUVBelRJQUFFMEdBd0JDSFFBQW5BQUJBRzdWQVFBOUVnRUEzek1BQUN3SkF3QzEvd0FBWFJBQkFFTGdBUURkRkFFQWdTOEFBTm9EQVFCcit3QUExQWtCQUwvOEFBQUZEQUlBV1AwQUFDQU5Bd0JPMWdFQUhSTUJBUHorQUFDbkR3SUFSaklBQUlrRkFRQmlNUUFBYlFRQkFHVXZBQUMrQXdFQWx2MEFBTlFOQXdEbjFRRUF0aElCQUhNeUFBREVCUUlBenZ3QUFDTU1BZ0RWQXdBQVpnQUJBR3N5QUFDM0JRRUEwRElBQUZVR0FRRHAvd0FBaFJBQkFOWFZBUUNrRWdFQUgvSUJBRWNXQVFDTCt3QUE5QWtCQU9EK0FBQitEd0VBbVM4QUFQSURBUUNqTHdBQS9BTUJBUFg3QUFCWUNnTUFQTlFCQUNNUkFRQzIxd0VBZ3hRQkFPRDdBQUF0Q2dFQURkUUJBUFFRQVFCRThRRUFGeFlCQUdVeEFBQndCQUVBUFRJQUFISUZBd0JzMUFFQVVoRUJBSzdVQVFDTUVRRUFoU0FBQUZRQkFRQ0dMd0FBM3dNQkFKWHVBUUIyRlFFQXFQMEFBQW9PQXdBb01nQUFNd1VEQUJNeUFBRG1CQVFBaFNRQUFJWUNCQUFLMXdFQTF4TUJBRmN2QUFDd0F3RUFUdkVCQUNVV0F3Q1crd0FBL3drQkFPWDhBQUJUREFJQWVqRUFBSVVFQVFDVU1nQUE5UVVCQUliWEFRQlRGQUVBNUNRQUFFRURBUUNWSkFBQXNBSURBQ1R4QVFEb0ZRTUFjaklBQU1JRkFnQ2FMd0FBOHdNQkFHSDlBQUE3RFFNQXNQd0FBT2NMQWdBQy9RQUFrQXdDQUt2dUFRQ0ZGUUVBbndjQkFLZ1FBUUN1MVFFQWZSSUJBTEhYQVFCK0ZBRUF3eVFBQUNBREFRQ08vQUFBbmdzQ0FPRFZBUUN2RWdFQXFmOEFBRkVRQVFBekhRQUFqZ0FCQUFYVkFRRGdFUUVBWjljQkFEUVVBUUE5MVFFQUVoSUJBSThIQVFDWUVBRUFQL3dBQVBRS0FnQ3AxZ0VBZGhNQkFIclVBUUJnRVFFQWN2d0FBR1lMQWdCUk1RQUFYQVFCQURVekFBQmZCd01BZWRVQkFFZ1NBUUJ5THdBQXl3TUJBQzhpQUFBbkFnSUF1Z0FBQUE0QUFRQzcxZ0VBaUJNQkFBUC9BQUNyRHdFQXRqTUFBTTRJQWdBWjFBRUFBQkVCQUdQWEFRQXdGQUVBY1NFQUFBSUNBZ0FYSUFBQUh3RUNBTFV5QUFBYUJnSUFNZ0VBQUJnQUFnQ043Z0VBYmhVQkFKc3hBQUNqQkFFQTdkVUJBTHdTQVFCWS93QUFBQkFCQUR3eEFBQkhCQUVBZmZzQUFPWUpBUUNVTXdBQWRRZ0RBQ1FoQUFDWUFRRUFVQzhBQUtrREFRQWkxUUVBK0JFQkFHYi9BQUFPRUFFQSt2MEFBSThPRWdCeC9BQUFaQXNDQUhMWEFRQS9GQUVBV3RZQkFDa1RBUURHMXdFQWt4UUJBTGorQUFCV0R3RUE3djRBQUl3UEFRQmg3Z0VBU3hVQkFHajdBQURSQ1FFQUEvRUJBSndWQWdDRjFRRUFWQklCQUZJekFBRE1Cd0lBOHYwQUFIQU9CQUFhTXdBQTlBWUdBQ3pWQVFBQ0VnRUFQd0VBQUJ3QUFnQ3ZMd0FBQ0FRQkFNRXlBQUF5QmdJQUlETUFBQXdIQlFEOTFRRUF6QklCQUxmK0FBQlZEd0VBNXY4QUFJTVFBUURwL0FBQVd3d0NBSHI5QUFDR0RRTUFoLzhBQUM4UUFRQWE3Z0VBSWhVQkFFanlBUUI4RmdNQXd0Y0JBSThVQVFDVTFnRUFZeE1CQUxVekFBRE1DQUlBUlRJQUFJZ0ZBUUFuN2dFQUt4VUJBTDc5QUFCTURnTUFrZTRCQUhJVkFRQXBNd0FBS2djREFNL1VBUUNxRVFFQTAvNEFBSEVQQVFBMElRQUFvQUVCQUljeUFBRG9CUUVBcmlRQUFQc0NBd0M1L2dBQVZ3OEJBS3N5QUFBTUJnRUFsdFVCQUdVU0FRRDQxQUVBMHhFQkFNbitBQUJuRHdFQUxQSUJBRlFXQVFBNjhRRUFEUllCQU84eUFBQjBCZ0VBZjljQkFFd1VBUUNDTHdBQTJ3TUJBT0hXQVFDdUV3RUFGRE1BQU5jR0FnQ2svZ0FBUWc4QkFCWHhBUUM3RlFNQUxTSUFBQ1FDQXdESjFBRUFwQkVCQUdmVkFRQTJFZ0VBN3RjQkFMa1VBUUR4TWdBQWRnWUJBSXovQUFBMEVBRUFwdFVCQUhVU0FRQmgvZ0FBN0E0QkFPOHpBQUJUQ1FNQVFDRUFBSzBCQVFCWjFnRUFLQk1CQUVMVkFRQVdFZ0VBTnpFQUFFSUVBUUF0THdBQWhnTUJBTzdVQVFESkVRRUE0UDhBQUh3UUFRRGcxQUVBdXhFQkFEUWRBQUNQQUFFQTdkWUJBTG9UQVFDdEhRQUExd0FCQUdiWEFRQXpGQUVBZ0RNQUFFY0lBZ0J3SVFBQUFRSUJBRFgrQUFDL0RnRUFxRE1BQUtVSUJBQlExZ0VBSHhNQkFMSWRBQURjQUFFQTNkUUJBTGdSQVFBaThnRUFTaFlCQUljRkFBQnVBQUlBZ0NBQUFFOEJBUUNLL0FBQWxnc0NBQnpYQVFEcEV3RUFLdFVCQUFBU0FRQlgxUUVBSmhJQkFKeW1BQUNHQ1FFQVp2MEFBRW9OQXdCMEtnQUFUQU1EQUdUWEFRQXhGQUVBWGRRQkFFTVJBUUMrL0FBQUF3d0NBUERYQVFDN0ZBRUE2dnNBQURjS0F3QTJJQUFBTFFFQ0FMMGZBQUR1QUFJQUo5VUJBUDBSQVFENzFRRUF5aElCQUZmOUFBQWREUU1BaXpFQUFKWUVBUUQxL1FBQWZBNEVBSXdIQVFDVkVBRUErY3dCQU9ZUUFRQzI3Z0VBa0JVQkFPUFdBUUN3RXdFQVpqRUFBSEVFQVFDS013QUFYZ2dDQU83VkFRQzlFZ0VBUVRJQUFINEZBd0JsTXdBQS93Y0RBRG45QUFEK0RBSUFGKzRCQUI4VkFRQXkxQUVBR1JFQkFHclZBUUE1RWdFQUJ0WUJBTlVTQVFEZC9nQUFldzhCQUdUK0FBRHZEZ0VBbHRRQkFId1JBUURyekFFQTJCQUJBUHJYQVFERkZBRUF1OVFCQUpnUkFRQmMxd0VBS1JRQkFNa0JBQUF3QUFJQTgvc0JBSVFXQVFCRkhRQUFud0FCQUFqWEFRRFZFd0VBZ2RjQkFFNFVBUURlSHdBQUF3RURBRS9XQVFBZUV3RUF2UzhBQUJZRUFRQUExUUVBMnhFQkFOY3pBQUFZQ1FJQW96TUFBSmNJQXdBQzFRRUEzUkVCQUVUVUFRQXJFUUVBd05jQkFJMFVBUUNKMUFFQWJ4RUJBRXI4QUFBS0N3SUF3L3dBQUEwTUFnQ2xNd0FBblFnQ0FNYldBUUNURXdFQVdESUFBSndGQWdCSklRQUFzZ0VCQUxvSEFRRENFQUVBMXY0QUFIUVBBUUFGN2dFQURSVUJBUE11QUFCWUF3RUFsUDhBQUR3UUFRQmwvQUFBUndzREFFN2dBUURwRkFFQWtmc0FBUG9KQVFBUy9RQUFzQXdDQU1qV0FRQ1ZFd0VBUy80QUFOVU9BZ0NmSkFBQXpnSURBS01kQUFETkFBRUF3aklBQURRR0FnQlJIUUFBcWdBQkFQL1hBUURLRkFFQWRpQUFBRVVCQVFBOEx3QUFsUU1CQUdQL0FBQUxFQUVBUEIwQUFKWUFBUUErNEFFQTJSUUJBUFg3QVFDR0ZnRUF6QUVBQURZQUFnQ0dNZ0FBNXdVQkFPdlVBUURHRVFFQU1QSUJBRmdXQVFDcS9BQUEyd3NDQU1VdkFBQWVCQUVBSnpJQUFEQUZBd0FBK3dBQWt3a0NBRDd4QVFBUkZnRUFkLzRBQUFBUEFnQzExd0VBZ2hRQkFMdi9BQUJqRUFFQVV6TUFBTTRIQkFDYkhRQUF4UUFCQUN2WEFRRDRFd0VBRy9JQkFFTVdBUUNMTXdBQVlBZ0NBR0V2QUFDNkF3RUFmQ3dBQUZRREFRQUEvQUFBY1FvREFKYi9BQUErRUFFQThBTUFBR2dBQVFBTjdnRUFGUlVCQUczL0FBQVZFQUVBVlAwQUFCUU5Bd0F6L2dBQXZRNEJBQWt2QUFCaUF3RUFvZFVCQUhBU0FRQXpNZ0FBVkFVREFDRXZBQUI2QXdFQTlOUUJBTThSQVFDcUx3QUFBd1FCQUZVdkFBQ3VBd0VBbXRRQkFJQVJBUUEwOGdFQVhCWUJBR0RnQVFEN0ZBRUE0TllCQUswVEFRQXoxQUVBR2hFQkFIdlhBUUJJRkFFQUl2MEFBTkFNQWdCQk1RQUFUQVFCQUp6K0FBQTZEd0VBYmRRQkFGTVJBUUNkTWdBQS9nVUJBT3d5QUFCeEJnRUF2UDhBQUdRUUFRQmYvQUFBTlFzREFIdnVBUUJmRlFFQU5qSUFBRjBGQXdCNzFnRUFTaE1CQU9FekFBQXhDUUlBR080QkFDQVZBUURqSkFBQVFBTUJBQzd5QVFCV0ZnRUFWOVlCQUNZVEFRQzMxQUVBbFJFQkFQOHdBQUE2QkFJQVpQc0FBTTBKQVFELy9BQUFpZ3dDQUxrQUFBQU5BQUVBT1RFQUFFUUVBUUErSFFBQW1BQUJBTllEQUFCbkFBRUFpQ0FBQUZjQkFRQlUvZ0FBM3c0QkFHTXlBQUN2QlFFQXhQOEFBR2tRQVFETDF3RUFtQlFCQUlUVkFRQlRFZ0VBQUNFQUFHMEJBd0F5TXdBQVR3Y0dBUEw3QUFCUENnTUFlekVBQUlZRUFRRHgrd0FBVEFvREFNWUJBQUFwQUFNQWcvd0FBSWdMQWdDbkpBQUE1Z0lEQU1uV0FRQ1dFd0VBVXgwQUFLd0FBUUM2TWdBQUpBWUNBRHp4QVFBUEZnRUFlQ0VBQUJNQ0FnQTM4Z0VBWHhZQkFGSFhBUUFlRkFFQWVkUUJBRjhSQVFCZElRQUEyd0VEQUJjdkFBQndBd0VBU1A4QUFQQVBBUUE0L0FBQTVnb0NBR1hVQVFCTEVRRUF6UzhBQUNZRUFRQlpIUUFBc2dBQkFGL1dBUUF1RXdFQWt6TUFBSElJQXdEcEpBQUFSZ01CQU5za0FBQTRBd0VBQy8wQUFLSU1BZ0NLSUFBQVdRRUJBRnIrQUFEbERnRUFTeDBBQUtVQUFRQU4vUUFBcGd3Q0FDNGRBQUNLQUFFQWlESUFBT2tGQVFDWjFnRUFhQk1CQUpMK0FBQXdEd0VBR3ZFQkFNb1ZBd0NKMVFFQVdCSUJBRXZnQVFEbUZBRUFQUzhBQUpZREFRQmExQUVBUUJFQkFFei9BQUQwRHdFQWlkY0JBRllVQVFEeXB3QUFpUWtCQUpja0FBQzJBZ01BZlA4QUFDUVFBUURXTXdBQUZRa0RBS2IvQUFCT0VBRUFNK0FCQU00VUFRQ0IxUUVBVUJJQkFDMy9BQURWRHdFQWI5UUJBRlVSQVFEMTFRRUF4QklCQUg3dUFRQmhGUUVBbDlRQkFIMFJBUUNVMVFFQVl4SUJBSm5VQVFCL0VRRUFmTlVCQUVzU0FRQXlIUUFBalFBQkFNdlZBUUNhRWdFQWc5Y0JBRkFVQVFEbzFBRUF3eEVCQUk3VkFRQmRFZ0VBRGY4QUFMVVBBUUNJK3dBQThRa0JBSFRVQVFCYUVRRUFVaThBQUtzREFRQ08xZ0VBWFJNQkFKY3lBQUQ0QlFFQWcrNEJBR1VWQVFETEx3QUFKQVFCQURML0FBRGFEd0VBcS84QUFGTVFBUUR2ekFFQTNCQUJBSlg4QUFDc0N3SUFkaW9BQUZFREF3QjAvZ0FBL0E0Q0FEcldBUUFKRXdFQXk5UUJBS1lSQVFDL013QUE0QWdDQUdUV0FRQXpFd0VBSlBJQkFFd1dBUUIyQmdBQWNnQUNBSGN5QUFETUJRSUFyTllCQUhrVEFRRHBNd0FBUVFrREFMNytBQUJjRHdFQTZQNEFBSVlQQVFBOC93QUE1QThCQUw3WEFRQ0xGQUVBb1AwQUFQSU5Bd0JMTVFBQVZnUUJBSGt2QUFEU0F3RUFadndBQUVvTEF3QWYvUUFBeWd3Q0FJSDdBQURxQ1FFQXlmd0FBQmtNQWdDMTFRRUFoQklCQVBUK0FBQ1NEd0VBbnpNQUFJd0lBd0Q5MWdFQXloTUJBQWNoQUFCOEFRRUFudjRBQUR3UEFRQkYxd0VBRWhRQkFKMGtBQURJQWdNQWp5OEFBT2dEQVFBeDdnRUFOQlVCQUxEVkFRQi9FZ0VBODlVQkFNSVNBUUJmSFFBQXVBQUJBTHZYQVFDSUZBRUFNLzhBQU5zUEFRQmI3Z0VBU0JVQkFFZlhBUUFVRkFFQWZUTUFBRDhJQWdENC9BQUFmQXdDQUpiWEFRQmpGQUVBbERFQUFKd0VBUUNXTVFBQW5nUUJBSkl5QUFEekJRRUFQZjBBQUFZTkFnQTExUUVBQ3hJQkFFa3hBQUJVQkFFQUxkWUJBUHdTQVFCVi93QUEvUThCQUxiOUFBQTBEZ01BQk5ZQkFOTVNBUUNWSUFBQVl3RUJBQmt5QUFEK0JBUUF5RElBQUVBR0FnRGF6QUVBeHhBQkFBNGhBQUNEQVFFQUxQd0FBTTRLQWdBSThRRUFwaFVDQUlmV0FRQldFd0VBQXRjQkFNOFRBUUFWMWdFQTVCSUJBQXd2QUFCbEF3RUFoVEVBQUpBRUFRQXExQUVBRVJFQkFGUXlBQUNVQlFJQXVmOEFBR0VRQVFBbzFBRUFEeEVCQUM3WEFRRDdFd0VBbWlBQUFHZ0JBUUNKMWdFQVdCTUJBT0l6QUFBekNRSUFkZndBQUd3TEFnRDIrd0FBV3dvREFOcjdBQUFtQ2dFQVN0UUJBREVSQVFCYy93QUFCQkFCQU9QK0FBQ0JEd0VBWWlFQUFPWUJBd0NCTVFBQWpBUUJBQjR5QUFBVkJRWUF2aklBQUN3R0FnQUI4Z0VBTkJZQ0FQZjlBQUNFRGdRQXBRY0JBSzRRQVFBZi9BQUF0QW9DQUlUOEFBQ0tDd0lBd2pNQUFPWUlCQUQyL1FBQWdBNEVBS0F2QUFENUF3RUFDZkVCQUtnVkFnQzBKQUFBRFFNREFMZlZBUUNHRWdFQWp5UUFBS0FDQWdCNkpBQUFYUUlEQUY2ckFBQ1FDUUVBMmpJQUFGOEdBUUJRL1FBQUNBMERBR3N6QUFBUkNBTUEyU1FBQURZREFRQVcvUUFBdUF3Q0FGRXlBQUNPQlFJQWtDOEFBT2tEQVFDUC9nQUFMUThCQUpnekFBQitDQUlBSEM4QUFIVURBUURoL0FBQVN3d0NBSndrQUFERkFnTUF5ZGNCQUpZVUFRQmkvUUFBUGcwREFCdjlBQURDREFJQWN6TUFBQ2dJQWdCVTRBRUE3eFFCQUFiOUFBQ1lEQUlBeWk4QUFDTUVBUUFtMVFFQS9CRUJBR0VrQUFBdEFnRUFOakVBQUVFRUFRQjkvQUFBZkFzQ0FJZjdBQUR3Q1FFQXJQNEFBRW9QQVFCK01RQUFpUVFCQU9jeUFBQnNCZ0VBYTljQkFEZ1VBUUNjK3dBQUJRb0JBRXZVQVFBeUVRRUFCdTRCQUE0VkFRQVdNZ0FBOGdRRUFMMHpBQURjQ0FJQVNQRUJBQnNXQVFBVzhnRUFQaFlCQUt6VUFRQ0xFUUVBRS9zQUFLTUpBZ0RNMVFFQW14SUJBQlR5QVFBOEZnRUFJUHdBQUxZS0FnQUVMd0FBWFFNQkFJM1hBUUJhRkFFQXFmd0FBTmtMQWdCaS9nQUE3UTRCQUhyOEFBQjJDd0lBOXRRQkFORVJBUUEwNEFFQXp4UUJBQjc4QUFDeUNnSUFYQjBBQUxVQUFRQk1IUUFBcGdBQkFHb2tBQUEzQWdJQTF2c0FBQ0lLQVFCN0x3QUExQU1CQU1zekFBRDlDQUlBQ1AwQUFKd01BZ0NROFFFQU1CWUNBT1RNQVFEUkVBRUFlUDBBQUlBTkF3QnRNd0FBRndnREFQU25BQUNMQ1FFQTgvd0FBSEFNQXdCOUlRQUFIQUlCQUtEVkFRQnZFZ0VBWC8wQUFEVU5Bd0MwQUFBQUNBQUNBQzR5QUFCRkJRTUF1dTRCQUpRVkFRQXA4Z0VBVVJZQkFOM1ZBUUNzRWdFQVorQUJBQUlWQVFCYS9BQUFLZ3NDQUpYOUFBRFJEUU1BR1BFQkFNUVZBd0FJN2dFQUVCVUJBTWd2QUFBaEJBRUF4dndBQUJNTUFnQ3gxZ0VBZmhNQkFNM1VBUUNvRVFFQWN0UUJBRmdSQVFCTTF3RUFHUlFCQUV6VkFRQWNFZ0VBTWVBQkFNd1VBUUNRSkFBQW9nSUNBQW44QUFDSUNnSUE5UHNCQUlVV0FRQmdKQUFBTEFJQkFBZi9BQUN2RHdFQStmc0FBR1FLQXdCVUlRQUF3QUVEQUhuV0FRQklFd0VBSXpJQUFDUUZBd0FTMXdFQTN4TUJBSm4rQUFBM0R3RUEyTllCQUtVVEFRQjMxZ0VBUmhNQkFPZk1BUURVRUFFQWNOUUJBRllSQVFCcC9BQUFVd3NEQU1ZdkFBQWZCQUVBUWRVQkFCVVNBUURoMXdFQXJCUUJBSFgvQUFBZEVBRUExRElBQUZrR0FRQ3VIUUFBMkFBQkFOei9BQUI3RUFFQTFETUFBQkFKQWdDVS9BQUFxZ3NDQUNqN0FBQzFDUUVBWi8wQUFFME5Bd0RpekFFQXp4QUJBQm9oQUFDTkFRRUFPUDRBQU1JT0FRQTVIUUFBbEFBQkFQUFhBUUMrRkFFQUgvRUJBTmtWQXdDUi93QUFPUkFCQU9JeUFBQm5CZ0VBTFNFQUFKc0JBUUJuMUFFQVRSRUJBS0l2QUFEN0F3RUFOdndBQU9JS0FnQXcxd0VBL1JNQkFDVXZBQUIrQXdFQTA5Y0JBSjRVQVFBbi9BQUF4QW9DQUhrZ0FBQklBUUVBcDlVQkFIWVNBUUI0MUFFQVhoRUJBRUx5QVFCcUZnTUFjZTRCQUZjVkFRQ2IxUUVBYWhJQkFJc0hBUUNVRUFFQTh0WUJBTDhUQVFDOC9RQUFSZzREQUhQN0FBRGNDUUVBYVM4QUFNSURBUUFLSUFBQUhRRUJBR251QVFCUUZRRUFlOVVCQUVvU0FRRHEvQUFBWFF3Q0FEOHlBQUI0QlFNQVhOUUJBRUlSQVFDZy93QUFTQkFCQUNuVUFRQVFFUUVBeXRVQkFKa1NBUUNjQndFQXBSQUJBQ2t2QUFDQ0F3RUFqZjBBQUw4TkF3QlEvZ0FBM0E0QkFKUFhBUUJnRkFFQW5DQUFBR29CQVFCQU13QUFpUWNGQUhydUFRQmVGUUVBYmpJQUFMb0ZBZ0NjMWdFQWF4TUJBSHd4QUFDSEJBRUFKTlFCQUFzUkFRQzcvQUFBL1FzQ0FINzdBQURuQ1FFQWVOWUJBRWNUQVFER0pBQUFJd01CQUd2Z0FRQUdGUUVBRVBFQkFLd1ZBd0JESFFBQW5RQUJBSmdrQUFDNUFnTUFxOVlCQUhnVEFRQisvUUFBa2cwREFKcjlBQURnRFFNQVNkUUJBREFSQVFEWjFRRUFxQklCQUlRSEFRQ09FQUVBV2gwQUFMTUFBUUFGL0FBQWdBb0NBTHdrQUFBWkF3RUErek1BQUhjSkF3QkNMd0FBbXdNQkFJOHpBQUJvQ0FJQWNQd0FBR0lMQWdDUklBQUFYd0VCQUlNeEFBQ09CQUVBYmpNQUFCb0lBd0NUSUFBQVlRRUJBSXpYQVFCWkZBRUF4dFVCQUpVU0FRQzEvUUFBTVE0REFQblZBUURJRWdFQXY5UUJBSnNSQVFDZkx3QUErQU1CQUpveEFBQ2lCQUVBZFRJQUFNZ0ZBZ0RSMVFFQW9CSUJBTzMvQUFDSkVBRUFwUDBBQVA0TkF3RFIvZ0FBYnc4QkFLZitBQUJGRHdFQW85WUJBSElUQVFEai9BQUFUd3dDQUxIdUFRQ0xGUUVBRnpNQUFPVUdCUUNBL2dBQUVnOEJBQUVoQUFCd0FRTUFqRElBQU8wRkFRRDkrd0FBYmdvQkFGOHZBQUM0QXdFQWVESUFBTTRGQWdBUi93QUF1UThCQUJvdkFBQnpBd0VBa080QkFIRVZBUURWSkFBQU1nTUJBSDRrQUFCcUFnUUFrL3NBQVB3SkFRQVEvUUFBckF3Q0FJM1dBUUJjRXdFQTZNd0JBTlVRQVFEeUF3QUFhZ0FCQUxrZEFBRGpBQUVBR0M4QUFIRURBUUJKOFFFQUhCWUJBR1VkQUFDK0FBRUFpdjRBQUNVUEFnQXA4UUVBOXhVREFBMGhBQUNDQVFFQUR0UUJBUFVRQVFBK013QUFnd2NFQUFudUFRQVJGUUVBM0RNQUFDVUpBZ0MwL1FBQUxnNERBSmtnQUFCbkFRRUFMZjBBQU9ZTUFnQ2dNZ0FBQVFZQkFMMytBQUJiRHdFQWMvOEFBQnNRQVFEWU1nQUFYUVlCQUpRSEFRQ2RFQUVBcXZzQUFCVUtBUUEzL2dBQXdRNEJBQnIvQUFEQ0R3RUFvdndBQU1zTEFnQ0YvUUFBcHcwREFJdlhBUUJZRkFFQXFOWUJBSFVUQVFCNDF3RUFSUlFCQUJzdkFBQjBBd0VBc2dBQUFBWUFBUUJaTXdBQTVBY0NBSGt4QUFDRUJBRUFtZnNBQUFJS0FRQ3kxUUVBZ1JJQkFLTUhBUUNzRUFFQUp0WUJBUFVTQVFDS01RQUFsUVFCQU1EVUFRQ2NFUUVBMy9zQUFDd0tBUUNHMWdFQVZSTUJBRUQrQUFES0RnRUFMQzhBQUlVREFRQTI4UUVBQ1JZQkFNOHZBQUFvQkFFQVB5OEFBSmdEQVFBKy9nQUF5QTRCQUh3eUFBRFdCUVVBRlA4QUFMd1BBUUErMVFFQUV4SUJBRW94QUFCVkJBRUFOdFlCQUFVVEFRREQvUUFBV3c0REFKVXZBQUR1QXdFQUUvRUJBTFVWQXdDQjFBRUFaeEVCQUtvZEFBRFVBQUVBOHRVQkFNRVNBUUM5MVFFQWpCSUJBRVhnQVFEZ0ZBRUFhaThBQU1NREFRQ00rd0FBOVFrQkFGc3ZBQUMwQXdFQTFOY0JBSjhVQVFCZU13QUE3Z2NDQUdYVkFRQTBFZ0VBUXRRQkFDa1JBUUNLMUFFQWNCRUJBUEw4QUFCdERBTUFRdkVCQUJVV0FRQkUxUUVBR0JJQkFGTFVBUUE1RVFFQTJRSUFBRWtBQWdCejFRRUFRaElCQUZUL0FBRDhEd0VBM1B3QUFEOE1BZ0JQL0FBQUZBc0NBRURWQVFBVUVnRUFyZjRBQUVzUEFRRGcvQUFBU0F3REFLYjlBQUFFRGdNQUkvc0FBTEFKQVFCRzFBRUFMUkVCQUc3V0FRQTlFd0VBQis0QkFBOFZBUUEySFFBQWtRQUJBQjc5QUFESURBSUFnZ2NCQUl3UUFRQmdNUUFBYXdRQkFEZ3pBQUJxQndRQXc5Y0JBSkFVQVFCUDhRRUFLQllDQUJ6VUFRQURFUUVBWVA4QUFBZ1FBUURCMXdFQWpoUUJBSFBVQVFCWkVRRUFQekVBQUVvRUFRQ0MxUUVBVVJJQkFBLzhBQUNVQ2dJQWFkVUJBRGdTQVFBMk13QUFZZ2NGQUZVekFBRFhCd0lBUys0QkFEOFZBUUJwTVFBQWRBUUJBR1g3QUFET0NRRUFwLzhBQUU4UUFRQWpNd0FBR1FjREFMeldBUUNKRXdFQVRSMEFBS2NBQVFENzF3RUF4aFFCQUFBekFBQ0dCZ1VBK2YwQUFJd09Bd0FrN2dFQUtoVUJBQVB1QVFBTUZRRUFNRElBQUVzRkF3QVovQUFBcUFvQ0FLTWtBQURhQWdNQU9mSUJBR0VXQVFDTU1RQUFsd1FCQUlqVkFRQlhFZ0VBYWY4QUFCRVFBUUJ2SkFBQVFRSUNBQk12QUFCc0F3RUF4Q1FBQUNFREFRQjRNUUFBZ3dRQkFJSHVBUUJqRlFFQW55NEFBRmNEQVFDdDFnRUFlaE1CQUUzOEFBQVFDd0lBci80QUFFMFBBUUQwTXdBQVlna0RBT0V5QUFCbUJnRUFHVE1BQU80R0JnREJNd0FBNUFnQ0FBRHhBUUNXRlFJQU5DOEFBSTBEQVFBdzRBRUF5eFFCQUozOUFBRHBEUU1BZjlRQkFHVVJBUUNoK3dBQUNnb0JBSTNVQVFCekVRRUFLUElCQUZBV0FRQWdJUUFBa1FFQ0FJaitBQUFoRHdJQVQvc0FBTGNKQWdCZklBQUFRQUVCQU1rekFBRDVDQUlBZnlBQUFFNEJBUUFXMXdFQTR4TUJBSFBXQVFCQ0V3RUFtdTRCQUhzVkFRRFYxd0VBb0JRQkFFbldBUUFZRXdFQVgrNEJBRW9WQVFCYTF3RUFKeFFCQU5UVkFRQ2pFZ0VBNGdJQUFGVUFBUURCL2dBQVh3OEJBSjh3QUFBNEJBSUFYdnNBQU1jSkFRQisxQUVBWkJFQkFBZlhBUURVRXdFQVhpOEFBTGNEQVFDZCt3QUFCZ29CQUNZekFBQWpCd01Bby80QUFFRVBBUUE0NEFFQTB4UUJBTUVmQUFEMEFBTUFHOWNCQU9nVEFRRDBNZ0FBZVFZQkFFWXpBQUNlQndNQW9OY0JBRzBVQVFCUEx3QUFxQU1CQUdFekFBRDBCd0lBRWZJQkFEZ1dBUUF2N2dFQU1oVUJBTzNVQVFESUVRRUFtdndBQUxrTEF3RGgxQUVBdkJFQkFLZ3lBQUFKQmdFQUp2SUJBRTRXQVFDNEFBQUFDd0FDQUZUdUFRQkZGUUVBYVIwQUFNSUFBUUI3SUFBQVNnRUJBSnNIQVFDa0VBRUFEdndBQUpJS0FnQWU3Z0VBSmhVQkFCalZBUUR2RVFFQUlOUUJBQWNSQVFDait3QUFEQW9CQU5BdkFBQXBCQUVBeHRRQkFLRVJBUUF6TVFBQVBnUUJBRFA5QUFEeURBSUFFdndBQUpvS0FnQzYvd0FBWWhBQkFGQWRBQUNwQUFFQWlpUUFBSllDQWdBRi9RQUFsZ3dDQUxuOUFBQTlEZ01BRENFQUFJRUJBUUNiTXdBQWhBZ0NBT1l6QUFBN0NRSUFFOVlCQU9JU0FRQ3kxd0VBZnhRQkFLLzdBQUFhQ2dFQW9oMEFBTXdBQVFCdU1RQUFlUVFCQUVndkFBQ2hBd0VBcndBQUFBUUFBZ0NaQndFQW9oQUJBT3Y3QUFBNkNnTUFYekVBQUdvRUFRQ3k3Z0VBakJVQkFHalVBUUJPRVFFQUw5UUJBQllSQVFCVi9BQUFJQXNDQUJ6VkFRRHpFUUVBa3Y4QUFEb1FBUUNWTXdBQWVBZ0NBSFRXQVFCREV3RUFJdGNCQU84VEFRRG0rd0FBTXdvQkFLUXpBQUNhQ0FNQTl6TUFBR3NKQXdBQklBQUFGQUVCQUV2eEFRQWZGZ0lBTTljQkFBQVVBUURBL2dBQVhnOEJBSDNXQVFCTUV3RUFJL3dBQUx3S0FnQUIxZ0VBMEJJQkFJVXZBQURlQXdFQWVnTUFBRmdBQWdEUE1nQUFVZ1lEQUFEeUFRQXlGZ0lBbVNRQUFMd0NBd0NRMUFFQWRoRUJBUEF5QUFCMUJnRUFHUzhBQUhJREFRQ1cxZ0VBWlJNQkFGN1ZBUUF0RWdFQTlmd0FBSFlNQWdCLy9BQUFnQXNDQUdUOEFBQkVDd01Bcy84QUFGc1FBUUFGOFFFQW9CVUNBRWpYQVFBVkZBRUFCZFFCQU93UUFRQVRJUUFBaUFFQkFPSCtBQUIvRHdFQVgrQUJBUG9VQVFEOS9BQUFoZ3dDQUU3L0FBRDJEd0VBOTljQkFNSVVBUURWL3dBQWRoQUJBTFA4QUFEdEN3SUFVdnNBQUxzSkFRQ1YxUUVBWkJJQkFFZnhBUUFhRmdFQVhmNEFBT2dPQVFCVjFnRUFKQk1CQUxYV0FRQ0NFd0VBdnlRQUFCd0RBUUJXTWdBQW1BVUNBUDRmQUFBUkFRSUF1eVFBQUJnREFRQ3YxZ0VBZkJNQkFHQXlBQUNzQlFFQUFTOEFBRm9EQVFDQS9BQUFnZ3NDQUZ3eUFBQ2tCUUlBb05ZQkFHOFRBUUNETXdBQVRRZ0NBQ0w3QUFDdkNRRUFITllCQU9zU0FRQnZJUUFBQUFJQkFGY2RBQUN3QUFFQTJDUUFBRFVEQVFCejF3RUFRQlFCQUY3OEFBQXlDd01BRS9JQkFEb1dBZ0FQMXdFQTNCTUJBT2JWQVFDMUVnRUFwUDhBQUV3UUFRQXQ4UUVBL3hVQ0FCYjdBQUNwQ1FJQVd1QUJBUFVVQVFCNS9BQUFkQXNDQUtjdkFBQUFCQUVBZWpJQUFOSUZBZ0Q3TWdBQWdBWUJBTmdDQUFCSEFBSUFwZTRCQUlBVkFRRHF6QUVBMXhBQkFKTWtBQUNxQWdNQVN1QUJBT1VVQVFDWTFRRUFaeElCQUtzdkFBQUVCQUVBV05jQkFDVVVBUURhMUFFQXRSRUJBTnY3QUFBbkNnRUFaQ0VBQU9zQkFRQ0Qvd0FBS3hBQkFKUXZBQUR0QXdFQWd5UUFBSDRDQkFEdE1nQUFjZ1lCQUU4ekFBRENCd01BTjljQkFBUVVBUURFL1FBQVhnNERBRlgrQUFEZ0RnRUFmZjhBQUNVUUFRQ0pKQUFBbEFJQ0FMVXZBQUFPQkFFQVBQNEFBTVlPQVFBbzFnRUE5eElCQVBVeUFBQjZCZ0VBQmY4QUFLMFBBUUNvL3dBQVVCQUJBQjN1QVFBbEZRRUFXVEVBQUdRRUFRQU1LZ0FBU0FNRUFFYlhBUUFURkFFQXovNEFBRzBQQVFENyt3QUFhZ29EQU5iV0FRQ2pFd0VBVWlFQUFMa0JCQUJENEFFQTNoUUJBSEl4QUFCOUJBRUFxZ2NCQUxNUUFRRGMrd0FBS0FvQkFGZ2hBQURNQVFNQVBkWUJBQXdUQVFEaS9nQUFnQThCQU53a0FBQTVBd0VBd1AwQUFGSU9Bd0FlTHdBQWR3TUJBRlFkQUFDdEFBRUFXZGNCQUNZVUFRQlQxUUVBSWhJQkFKVUhBUUNlRUFFQXVUTUFBTlFJQWdEUzFRRUFvUklCQUZIVUFRQTRFUUVBWERNQUFPb0hBZ0NETWdBQTVBVUJBT1l5QUFCckJnRUFnVElBQU9JRkFRQ3dCd0VBdVJBQkFIRXpBQUFqQ0FNQThmd0FBR3NNQWdDRzdnRUFhQlVCQU52L0FBQjZFQUVBUjlZQkFCWVRBUUFRTWdBQTJnUUVBTXJYQVFDWEZBRUE5UDBBQUhnT0JBQU0vUUFBcEF3Q0FBY2dBQUFhQVFFQU96TUFBSFVIQlFCMUtnQUFUd01DQURFeUFBQk9CUU1BalM4QUFPWURBUURkMWdFQXFoTUJBTFVIQVFDOUVBRUFWQzhBQUswREFRQ1krd0FBQVFvQkFHRDlBQUE0RFFNQWxkUUJBSHNSQVFCTi93QUE5UThCQURzeEFBQkdCQUVBODZjQUFJb0pBUURsMXdFQXNCUUJBUExVQVFETkVRRUFYdFlCQUMwVEFRQnRMd0FBeGdNQkFBRHVBUUFKRlFFQUF5RUFBSFFCQWdCZC93QUFCUkFCQUd2eEFRQXNGZ0lBaXY4QUFESVFBUUN6MUFFQWtSRUJBUDB5QUFDQ0JnRUFTOWNCQUJnVUFRQUQvUUFBa2d3Q0FISFVBUUJYRVFFQWR0VUJBRVVTQVFDVDFBRUFlUkVCQUdyL0FBQVNFQUVBTWY0QUFMc09BUUE2TWdBQWFRVURBRWtkQUFDakFBRUE2ZGNCQUxRVUFRQnUrd0FBMXdrQkFGSDhBQUFZQ3dJQTdUTUFBRTBKQXdBVi9nQUFzZzRCQUNndkFBQ0JBd0VBcE5ZQkFITVRBUURpMUFFQXZSRUJBTTR5QUFCUUJnSUFsQ0FBQUdJQkFRRDgxZ0VBeVJNQkFQWXlBQUI3QmdFQW12NEFBRGdQQVFDK0hRQUE2QUFCQUxjZEFBRGhBQUVBdmRRQkFKa1JBUUNoL1FBQTlRMERBTmZXQVFDa0V3RUF2OWNCQUl3VUFRQVdNd0FBM3dZR0FKRXpBQUJzQ0FNQVJOY0JBQkVVQVFBZjFBRUFCaEVCQUlUdUFRQm1GUUVBdnY4QUFHWVFBUUJFTWdBQWh3VUJBSTNWQVFCY0VnRUEwUzhBQUNvRUFRQVovd0FBd1E4QkFNWFZBUUNVRWdFQVk5WUJBRElUQVFBajF3RUE4Qk1CQUVmeUFRQjVGZ01BTy9JQkFHTVdBUURXL0FBQU13d0NBTFVkQUFEZkFBRUFneUFBQUZJQkFRREpKQUFBSmdNQkFNM1dBUUNhRXdFQXFkVUJBSGdTQVFBSE13QUFvZ1lHQU4vWEFRQ3FGQUVBa3RZQkFHRVRBUUFKMVFFQTR4RUJBSzhrQUFEK0FnTUEzc3dCQU1zUUFRQ1Q3Z0VBZEJVQkFCVDlBQUMwREFJQWJERUFBSGNFQVFCQy9BQUErZ29DQUhEN0FBRFpDUUVBQmk4QUFGOERBUUNML1FBQXVRMERBSEV5QUFEQUJRSUFRak1BQUpFSEF3QnBNZ0FBdFFVQkFQSDdBUUNDRmdFQTFqSUFBRnNHQVFDYklBQUFhUUVCQUxqWEFRQ0ZGQUVBVnY4QUFQNFBBUUJnL2dBQTZ3NEJBT1RWQVFDekVnRUFNL0lCQUZzV0FRQWQvd0FBeFE4QkFQYjhBQUI0REFJQTI5UUJBTFlSQVFCbkx3QUF3QU1CQUR2VkFRQVFFZ0VBcFBzQUFBMEtBZ0JxTXdBQURnZ0RBQno5QUFERURBSUFZZUFCQVB3VUFRQ1Yrd0FBL2drQkFGY3lBQUNhQlFJQVlOVUJBQzhTQVFERk1nQUFPZ1lDQUREdUFRQXpGUUVBWnRRQkFFd1JBUUNmL2dBQVBROEJBRGd3QUFBeEJBRUFyaklBQUE4R0FRQ3cxd0VBZlJRQkFQRE1BUURkRUFFQTV0Y0JBTEVVQVFDZy9BQUF4d3NDQUd3ekFBQVVDQU1BSy8wQUFPSU1BZ0N1K3dBQUdRb0JBTFQvQUFCY0VBRUFNeThBQUl3REFRQTgvUUFBQkEwQ0FESC9BQURaRHdFQUxETUFBRFlIQkFBcjhRRUEvUlVCQVA0ekFBQ0FDUU1BUVIwQUFKc0FBUUM0QndFQXdCQUJBQ3JXQVFENUVnRUFNZFlCQUFBVEFRQ3M3Z0VBaGhVQkFMZ3ZBQUFSQkFFQSs5UUJBTllSQVFCMi93QUFIaEFCQURmOEFBRGtDZ0lBS2Z3QUFNZ0tBZ0RtMWdFQXN4TUJBS0VIQVFDcUVBRUFuVEVBQUtVRUFRQ3MvQUFBM3dzQ0FFUXpBQUNZQndNQVRQNEFBTmNPQWdDTElBQUFXZ0VCQUtrSEFRQ3lFQUVBbHY0QUFEUVBBUUJXL0FBQUlnc0NBUHI3QUFCbkNnTUFoZnNBQU80SkFRQ0ovUUFBc3cwREFKVXlBQUQyQlFFQXFQd0FBTmNMQWdEZ0FnQUFVd0FCQUZBekFBREZCd01BUnlFQUFMQUJBUUF3SFFBQWl3QUJBSWN6QUFCVkNBSUFmekVBQUlvRUFRQUg4UUVBcEJVQ0FGWFZBUUFrRWdFQXZ0WUJBSXNUQVFEMS9nQUFrdzhEQUZFekFBRElCd1FBcTlRQkFJb1JBUUI1SkFBQVdnSURBTXNrQUFBb0F3RUFILzhBQU1jUEFRQVNNZ0FBNGdRRUFNQXlBQUF3QmdJQWRlNEJBRm9WQVFENHB3QUFqQWtCQUVYeUFRQnpGZ01BVi9zQUFNQUpBUUFWOGdFQVBSWUJBS24rQUFCSER3RUFoQ1FBQUlJQ0JBQy9Md0FBR0FRQkFOWCtBQUJ6RHdFQTF0UUJBTEVSQVFCNkx3QUEwd01CQUVJeUFBQ0JCUU1BVnRRQkFEd1JBUUFVL2dBQXNRNEJBRm44QUFBb0N3SUExL3dBQURVTUFnQkQvZ0FBelE0QkFOSFhBUUNjRkFFQVk5VUJBRElTQVFCTy9BQUFFZ3NDQUZEeUFRQi9GZ0VBOWRRQkFOQVJBUURWK3dBQUlRb0JBR0hXQVFBd0V3RUFVaklBQUpBRkFnRE0vZ0FBYWc4QkFJWC9BQUF0RUFFQVVmMEFBQXNOQXdBRjFnRUExQklCQU9YN0FBQXlDZ0VBek5RQkFLY1JBUUFaOFFFQXh4VURBRGpXQVFBSEV3RUFyLzBBQUI4T0F3QTUxd0VBQmhRQkFCcnlBUUJDRmdFQWpqRUFBSmtFQVFCdE1RQUFlQVFCQUhRekFBQXFDQU1BYVNRQUFEVUNBZ0FwK3dBQXRna0JBQUh1QVFBS0ZRRUFqaVFBQUo0Q0FnQWoxZ0VBOGhJQkFOa3lBQUJlQmdFQU1kVUJBQWNTQVFCR01RQUFVUVFCQUZIZ0FRRHNGQUVBak5RQkFISVJBUUR3L0FBQWFRd0NBSUQ3QUFEcENRRUFzZjRBQUU4UEFRRFRMd0FBTEFRQkFIZjlBQUI5RFFNQWdpUUFBSG9DQkFCU01RQUFYUVFCQUhZaEFBQU1BZ01BdUNRQUFCVURBUUFzTWdBQVB3VURBRmIrQUFEaERnRUFsek1BQUh3SUFnQjJKQUFBVVFJREFKWUhBUUNmRUFFQTBOUUJBS3NSQVFDekJ3RUF1eEFCQUhuWEFRQkdGQUVBZlAwQUFJd05Bd0FpTHdBQWV3TUJBRFQ4QUFEZUNnSUF1ZndBQVBrTEFnQjIxZ0VBUlJNQkFBalVBUUR2RUFFQWRQc0FBTjBKQVFBcU13QUFMUWNEQUxQWEFRQ0FGQUVBQWpJQUFLNEVBd0F3SWdBQUtRSURBR1grQUFEd0RnRUEzeklBQUdRR0FRQjNNUUFBZ2dRQkFDejlBQURrREFJQTdmNEFBSXNQQVFBcThRRUEraFVEQUdJdkFBQzdBd0VBcGk4QUFQOERBUUNNSkFBQW1nSUNBR3YvQUFBVEVBRUE4ZjRBQUk4UEFRQzExQUVBa3hFQkFPVFdBUUN4RXdFQUVqTUFBTTBHQkFBaDdnRUFLQlVCQUJqOUFBQzhEQUlBZXRVQkFFa1NBUUJzSVFBQS9RRUJBREV4QUFBOEJBRUFGeklBQVBZRUJBQ0dNd0FBVXdnQ0FCSFhBUURlRXdFQUFESUFBS2dFQXdBczFnRUEreElCQUpEVkFRQmZFZ0VBUE5VQkFCRVNBUURMTWdBQVNBWURBQ245QUFEZURBSUFvZTRCQUgwVkFRQlAvZ0FBMnc0QkFGVDdBQUM5Q1FFQUtqSUFBRGtGQXdCSzhRRUFIUllDQURZaEFBQ2lBUUVBSy84QUFOTVBBUUQ3L0FBQWdnd0NBTEw5QUFBb0RnTUFOdTRCQURnVkFRQXUvUUFBNkF3Q0FFYi9BQUR1RHdFQStNd0JBT1VRQVFBTTFnRUEyeElCQUtzekFBQ3VDQU1Bdk5jQkFJa1VBUURCMUFFQW5SRUJBTDM5QUFCSkRnTUFNVE1BQUV3SEF3QTA3Z0VBTmhVQkFNeldBUUNaRXdFQVQ5UUJBRFlSQVFBdU13QUFQd2NHQUc3L0FBQVdFQUVBZUIwQUFNUUFBUUNBMXdFQVRSUUJBR1hYQVFBeUZBRUFjZjRBQVBnT0FnQ1dKQUFBc3dJREFHRFVBUUJHRVFFQVZ0Y0JBQ01VQVFCYy9BQUFMZ3NDQUg4ekFBQkRDQVFBTGZ3QUFOQUtBZ0NxSkFBQTd3SURBRWJWQVFBWkVnRUFKTllCQVBNU0FRQzU3Z0VBa3hVQkFHTWRBQUM4QUFFQXlnRUFBRElBQWdCQU1nQUFld1VEQU9QVUFRQytFUUVBWXVBQkFQMFVBUUFsTWdBQUtnVURBSG4rQUFBRUR3SUFJQzhBQUhrREFRQ3QvQUFBNFFzQ0FJWDhBQUNNQ3dJQXVTOEFBQklFQVFEUzF3RUFuUlFCQUMwekFBQTZCd1VBNXRRQkFNRVJBUURpSkFBQVB3TUJBSy91QVFDSkZRRUFzRElBQUJFR0FRQjExUUVBUkJJQkFHNzlBQUJpRFFNQWNmMEFBR3NOQXdBaDFRRUE5eEVCQUozL0FBQkZFQUVBY2RZQkFFQVRBUUI3SkFBQVlBSURBTmZYQVFDaUZBRUFkREVBQUg4RUFRQ28xd0VBZFJRQkFHenhBUUF1RmdJQUZQc0FBS1VKQWdEVDFRRUFvaElCQUNQeEFRRGxGUU1BcmZzQUFCZ0tBUUFJTXdBQXFBWUVBR1F4QUFCdkJBRUFNeUFBQUNnQkFnQkUxZ0VBRXhNQkFOajhBQUEzREFJQUl2d0FBTG9LQWdCYUlRQUEwZ0VEQUV2V0FRQWFFd0VBNy9zQUFFWUtBd0MvSFFBQTZRQUJBS1l6QUFDZkNBTUFkUDBBQUhRTkF3QXoxUUVBQ1JJQkFLUWRBQURPQUFFQUN0UUJBUEVRQVFDZy9nQUFQZzhCQUdFZEFBQzZBQUVBT3VBQkFOVVVBUUMxL0FBQThRc0NBTmZVQVFDeUVRRUFSVEVBQUZBRUFRQ1kvQUFBc3dzREFEblZBUUFQRWdFQWN1NEJBRmdWQVFEeUFRQUFPZ0FDQUI3VkFRRDBFUUVBb0NRQUFORUNBd0JXK3dBQXZ3a0JBTDBrQUFBYUF3RUF0LzhBQUY4UUFRQjkxd0VBU2hRQkFINGhBQUFkQWdFQVB0UUJBQ1VSQVFEVE13QUFEZ2tDQUgzK0FBQU1Ed0lBcWdBQUFBTUFBUUNiTUFBQU5BUUNBRW9kQUFDa0FBRUFVdTRCQUVRVkFRQ21NZ0FBQndZQkFIenVBUUJnRlFFQUx6TUFBRVVIQkFCR0hRQUFvQUFCQUpMWEFRQmZGQUVBazlVQkFHSVNBUUM3TWdBQUpnWUNBRU16QUFDVUJ3UUExQzhBQUMwRUFRRFMvQUFBS3d3Q0FHdldBUUE2RXdFQXJnY0JBTGNRQVFBOC9BQUE3Z29DQUZiV0FRQWxFd0VBWkNRQUFEQUNBUUFGSVFBQWRnRURBRno3QUFERkNRRUFSLzRBQU04T0FRQ2FNZ0FBK3dVQkFFTHVBUUE4RlFFQVBSMEFBSmNBQVFEWU13QUFHZ2tFQUdiV0FRQTFFd0VBV0RNQUFPSUhBZ0JzK3dBQTFRa0JBS2pWQVFCM0VnRUFmaThBQU5jREFRQTkvd0FBNVE4QkFQMHpBQUI5Q1FNQWNQMEFBR2dOQXdDcE1nQUFDZ1lCQUNzdkFBQ0VBd0VBaTlRQkFIRVJBUUNCSUFBQVVBRUJBSjMrQUFBN0R3RUFlUThBQUlRQUF3Q2VNZ0FBL3dVQkFIOGtBQUJ1QWdRQVVoMEFBS3NBQVFCZEx3QUF0Z01CQURNaEFBQ2ZBUUVBcS80QUFFa1BBUUJqMUFFQVNSRUJBT2Y3QUFBMENnRUF2UUFBQUJJQUF3Q2NNZ0FBL1FVQkFGNGRBQUMzQUFFQU92d0FBT29LQWdEakFnQUFWZ0FCQUhYV0FRQkVFd0VBVkRNQUFOSUhCUURqMVFFQXNoSUJBSXYrQUFBbkR3SUFkLzhBQUI4UUFRQzNNZ0FBSGdZQ0FHWDlBQUJIRFFNQUF6SUFBTEVFQXdCTDFRRUFHeElCQU0wa0FBQXFBd0VBMmdJQUFFc0FBZ0FyMWdFQStoSUJBSUx1QVFCa0ZRRUFUT0FCQU9jVUFRQ0xKQUFBbUFJQ0FHTDdBQURMQ1FFQUV2SUJBRGtXQVFEODF3RUF4eFFCQUtML0FBQktFQUVBbHZ3QUFLNExBZ0R0L0FBQVl3d0NBS243QUFBVUNnRUFvdFVCQUhFU0FRQ2Uvd0FBUmhBQkFGcjdBQUREQ1FFQXBDUUFBTjBDQXdDeTFBRUFrQkVCQUJIdUFRQVpGUUVBeVB3QUFCY01BZ0JRTWdBQWl3VURBQ0hVQVFBSUVRRUE1OWNCQUxJVUFRRHpNd0FBWHdrREFLd0hBUUMxRUFFQXFUTUFBS2tJQWdDYjdnRUFmQlVCQUhjdkFBRFFBd0VBSVA4QUFNZ1BBUUNKSUFBQVdBRUJBRnYrQUFEbURnRUFvL3dBQU0wTEFnQzMxZ0VBaEJNQkFIYitBQUQrRGdJQVdmNEFBT1FPQVFEVTFnRUFvUk1CQUdzdkFBREVBd0VBSCs0QkFDY1ZBUUJPMXdFQUd4UUJBTlQvQUFCMUVBRUF4UUVBQUNZQUF3QXRIUUFBaVFBQkFEVXZBQUNPQXdFQUJQRUJBSjRWQWdEMCt3QUFWUW9EQUJIVUFRRDRFQUVBTHRRQkFCVVJBUUR1SHdBQURBRURBRlQ4QUFBZUN3SUFML0lCQUZjV0FRRGkxUUVBc1JJQkFBL1dBUURlRWdFQWIvd0FBR0FMQWdCMjFBRUFYQkVCQU1vekFBRDdDQUlBemk4QUFDY0VBUUNhMVFFQWFSSUJBSFVoQUFBS0FnSUEwTllCQUowVEFRQlFJUUFBc3dFREFLN1hBUUI3RkFFQXk5WUJBSmdUQVFBQy9BQUFkd29EQU1YL0FBQnFFQUVBYXRjQkFEY1VBUUJwL2dBQTh3NEJBR3d5QUFDNEJRRUFpZjRBQUNNUEFnQzdMd0FBRkFRQkFCVFZBUURzRVFFQU5qQUFBREFFQVFDWC9RQUExdzBEQUJIOEFBQ1lDZ0lBUkM4QUFKMERBUURUK3dBQUh3b0JBTTMvQUFCd0VBRUFpUDBBQUxBTkF3QUgxUUVBNFJFQkFBTC9BQUNxRHdFQXMrNEJBSTBWQVFEVzF3RUFvUlFCQUwweUFBQXFCZ0lBQTlZQkFOSVNBUUJNL0FBQURnc0NBTVg4QUFBUkRBSUFqaThBQU9jREFRQ3Qvd0FBVlJBQkFHajlBQUJRRFFNQU5kUUJBQndSQVFCTy9nQUEyZzRCQUkweEFBQ1lCQUVBWDljQkFDd1VBUURKTWdBQVFnWURBRG94QUFCRkJBRUFwTmNCQUhFVUFRQVg4UUVBd1JVREFNY3pBQUQwQ0FNQTVkWUJBTElUQVFBSE1nQUF2UVFEQUJUV0FRRGpFZ0VBY2RVQkFFQVNBUUQzMWdFQXhCTUJBQy9WQVFBRkVnRUEvaklBQUlNR0FRREcvUUFBWkE0REFDbnVBUUFzRlFFQTZ0VUJBTGtTQVFEYkFnQUFUUUFDQU12OEFBQWREQUlBTnlFQUFLTUJBUUNtL0FBQTB3c0NBR1loQUFEdUFRTUF2RE1BQU5vSUFnRFord0FBSlFvQkFLa3ZBQUFDQkFFQUJqSUFBTG9FQXdEaSt3QUFMd29CQU8zTUFRRGFFQUVBMVB3QUFDOE1BZ0NwN2dFQWhCVUJBR29kQUFEREFBRUFYdUFCQVBrVUFRQk4xZ0VBSEJNQkFBVFZBUURmRVFFQXJQc0FBQmNLQVFBMUhRQUFrQUFCQUNYOEFBREFDZ0lBdFFJQUFFTUFBUUNQL0FBQW9Bc0NBSnJYQVFCbkZBRUExQU1BQUdRQUFnQ1NNd0FBYndnREFJWWtBQUNLQWdRQUh5OEFBSGdEQVFBVE13QUEwUVlHQU1mVUFRQ2lFUUVBWGpJQUFLZ0ZBZ0E0TWdBQVl3VURBREw5QUFEd0RBSUFVLzhBQVBzUEFRQm0vZ0FBOFE0QkFGeXJBQUNPQ1FFQTF5UUFBRFFEQVFDREJ3RUFqUkFCQUxJa0FBQUhBd01BaHlRQUFJNENCQUJ2L3dBQUZ4QUJBR1A4QUFCQkN3TUFiZjBBQUY4TkF3QVFJUUFBaFFFQkFLajdBQUFUQ2dFQVVmSUJBSUFXQVFEdCt3QUFRQW9EQUw0ekFBRGVDQUlBQmZzQUFKOEpBZ0NaL0FBQXRnc0RBQlh1QVFBZEZRRUFFKzRCQUJzVkFRQ2hKQUFBMUFJREFONHpBQUFwQ1FNQXVkVUJBSWdTQVFDUTFnRUFYeE1CQUN3ZEFBQ0lBQUVBa1BzQUFQa0pBUUF0MUFFQUZCRUJBTUlrQUFBZkF3RUEvOVFCQU5vUkFRQzhIUUFBNWdBQkFMZjhBQUQxQ3dJQVovd0FBRTBMQXdDekFBQUFCd0FCQUMvOEFBRFVDZ0lBUlRNQUFKc0hBd0Q5SHdBQUR3RUNBT3pYQVFDM0ZBRUFwek1BQUtJSUF3QWYxUUVBOVJFQkFNd3lBQUJMQmdJQU1DRUFBSjBCQVFCZi93QUFCeEFCQUhRaEFBQUpBZ0VBZmpNQUFFRUlBZ0FqMVFFQStSRUJBSHdnQUFCTEFRRUExVE1BQUJJSkF3QmMxZ0VBS3hNQkFLa2tBQURzQWdNQW4vMEFBTzhOQXdCaTF3RUFMeFFCQUZReEFBQmZCQUVBWHlFQUFPRUJBZ0JLL3dBQThnOEJBSGZVQVFCZEVRRUFBTlFCQU9jUUFRQWwxUUVBK3hFQkFGVXlBQUNXQlFJQUVmRUJBSzhWQXdDTy93QUFOaEFCQUFuWEFRRFdFd0VBYXVBQkFBVVZBUURwMUFFQXhCRUJBT25NQVFEV0VBRUErUU1BQUcwQUFRQTYvZ0FBeEE0QkFGa3lBQUNlQlFJQXBkWUJBSFFUQVFBQ0x3QUFXd01CQUFIOUFBQ09EQUlBV3pJQUFLSUZBZ0FJSUFBQUd3RUJBSS85QUFERkRRTUEzTmNCQUtjVUFRQkgxQUVBTGhFQkFJWWdBQUJWQVFFQWt0UUJBSGdSQVFBTDF3RUEyQk1CQVB6VkFRRExFZ0VBZ2Y0QUFCTVBBZ0NHK3dBQTd3a0JBREQ5QUFEc0RBSUFPaThBQUpNREFRQzcxUUVBaWhJQkFKMzhBQURCQ3dJQVB2d0FBUElLQWdCNy9nQUFDQThDQUsvL0FBQlhFQUVBVi84QUFQOFBBUUQrK3dBQWJ3b0JBSi9WQVFCdUVnRUFSdFlCQUJVVEFRRHcrd0FBU1FvREFGb3hBQUJsQkFFQXB2NEFBRVFQQVFEbS9BQUFWUXdDQUZUVkFRQWpFZ0VBa2RjQkFGNFVBUUFkTHdBQWRnTUJBR016QUFENUJ3TUFZUHdBQURnTEF3Qm9NZ0FBdEFVQkFKWFdBUUJrRXdFQUtmOEFBTkVQQVFCWC9nQUE0ZzRCQUVjdkFBQ2dBd0VBRHlFQUFJUUJBUUJWSFFBQXJnQUJBTy9VQVFES0VRRUFzak1BQU1ZSUFnRFNKQUFBTHdNQkFFbmdBUURrRkFFQU1pOEFBSXNEQVFEMHpBRUE0UkFCQUlYdUFRQm5GUUVBVFM4QUFLWURBUUNFL3dBQUxCQUJBQlR4QVFDNEZRTUFmLzBBQUpVTkF3Qk5NUUFBV0FRQkFHSWRBQUM3QUFFQWw5WUJBR1lUQVFBQzhRRUFtaFVDQUQ4ekFBQ0hCd0lBT0NFQUFLUUJBUUJLMVFFQUdoSUJBSC83QUFEb0NRRUFCdnNBQUtFSkFnQWsvUUFBMUF3Q0FHcldBUUE1RXdFQVUvd0FBQndMQWdCZTFBRUFSQkVCQUc3WEFRQTdGQUVBZURNQUFETUlBd0FmMWdFQTdoSUJBS2JYQVFCekZBRUF4OWNCQUpRVUFRQXYvd0FBMXc4QkFCMzhBQUN3Q2dJQVc5WUJBQ29UQVFBN0lRQUFwZ0VEQUxyV0FRQ0hFd0VBUERNQUFIb0hCQUMwQWdBQVFnQUJBQ2I5QUFEWURBSUFKZjhBQU0wUEFRQjZJUUFBRmdJQ0FCUDhBQUNjQ2dJQVR0VUJBQjRTQVFCNEJnQUFkZ0FDQU9qWEFRQ3pGQUVBMGRZQkFKNFRBUUIwTWdBQXhnVUNBT015QUFCb0JnRUEvOVlCQU13VEFRQ0sxUUVBV1JJQkFMdjlBQUJERGdNQVQrQUJBT29VQVFBSi9RQUFuZ3dDQU4wa0FBQTZBd0VBNVB3QUFGRU1BZ0I4MUFFQVloRUJBRityQUFDUkNRRUFtUDhBQUVBUUFRRDMrd0FBWGdvREFJY3hBQUNTQkFFQU4vOEFBTjhQQVFDaEx3QUErZ01CQUo3N0FBQUhDZ0VBTnpJQUFHQUZBd0RuL0FBQVZ3d0NBTnpNQVFESkVBRUFWZGNCQUNJVUFRQVJJQUFBSGdFQkFMZnVBUUNSRlFFQVJ2d0FBQUlMQWdEYk13QUFJd2tDQUVzekFBQ3lCd01BbWpNQUFJSUlBZ0NEL2dBQUZ3OENBTWorQUFCbUR3RUEydjhBQUhrUUFRQTRIUUFBa3dBQkFPajdBQUExQ2dFQVhOVUJBQ3NTQVFDaUpBQUExd0lEQURIeEFRQUVGZ0VBNHY4QUFINFFBUUE2TUFBQU13UUJBRFg5QUFEMkRBSUFBVE1BQUlzR0JBRHcrd0VBZ1JZQkFOd0NBQUJQQUFJQWhmNEFBQnNQQWdBNkhRQUFsUUFCQUJmOEFBQ2tDZ0lBOS9zQkFJZ1dBUUJtK3dBQXp3a0JBS1B1QVFCL0ZRRUFCUDBBQUpRTUFnQStNZ0FBZFFVREFJMHlBQUR1QlFFQXZkY0JBSW9VQVFEQTFnRUFqUk1CQUNnekFBQW9Cd0lBQXRZQkFORVNBUUFIMWdFQTFoSUJBQ1h4QVFEckZRTUFhQ1FBQURRQ0FRQVIvZ0FBcmc0QkFKZ2dBQUJtQVFFQW1QMEFBTm9OQXdCdS9BQUFYZ3NDQVBITUFRRGVFQUVBRURNQUFNVUdCQUF3MVFFQUJoSUJBSGtoQUFBVkFnRUFkdzhBQUlFQUF3QzMxd0VBaEJRQkFPc3pBQUJIQ1FNQWJUSUFBTGtGQVFCeU13QUFKZ2dDQU5UN0FBQWdDZ0VBVU5VQkFDQVNBUUJFTVFBQVR3UUJBTGdDQUFCR0FBRUFKZGNCQVBJVEFRQXk3Z0VBTlJVQkFERWhBQUNlQVFFQXhUTUFBTzRJQWdEbHpBRUEwaEFCQUZIK0FBRGREZ0VBVGpNQUFMNEhCQUNGQndFQWp4QUJBQ2ZVQVFBT0VRRUE5TllCQU1FVEFRQjFJQUFBUkFFQkFHRFdBUUF2RXdFQVh2OEFBQVlRQVFBTC9BQUFqQW9DQURmOUFBRDZEQUlBQXk4QUFGd0RBUUMzSkFBQUZBTUJBRU12QUFDY0F3RUFIZjBBQU1ZTUFnQkNNUUFBVFFRQkFIMGtBQUJtQWdRQVB2OEFBT1lQQVFCMjF3RUFReFFCQUo4ZEFBREpBQUVBRnU0QkFCNFZBUUM5MWdFQWloTUJBRVl2QUFDZkF3RUFldjhBQUNJUUFRQzgvZ0FBV2c4QkFGbi9BQUFCRUFFQVpkWUJBRFFUQVFBczhRRUEvaFVCQUZrdkFBQ3lBd0VBdWRjQkFJWVVBUUFiTWdBQUJnVUVBTkwvQUFCekVBRUFLaThBQUlNREFRRGhBZ0FBVkFBQkFHajhBQUJRQ3dNQUtQRUJBUFFWQXdBRElBQUFGZ0VCQU1UK0FBQmlEd0VBZGYwQUFIY05Bd0FTTHdBQWF3TUJBTG5XQVFDR0V3RUFGLzBBQUxvTUFnQ3gvUUFBSlE0REFBMHpBQUM1QmdRQW5TOEFBUFlEQVFCRC93QUE2dzhCQUxReUFBQVlCZ0lBTGRjQkFQb1RBUUJwMWdFQU9CTUJBSWYrQUFBZkR3SUFrdTRCQUhNVkFRQ2dBQUFBQUFBQkFFRHhBUUFURmdFQWhkWUJBRlFUQVFDSElBQUFWZ0VCQU9uV0FRQzJFd0VBWGRjQkFDb1VBUUJBTHdBQW1RTUJBRnY5QUFBcERRTUF2UHdBQVA4TEFnQ1hJQUFBWlFFQkFQWXpBQUJvQ1FNQWxOY0JBR0VVQVFCTjFBRUFOQkVCQU8vV0FRQzhFd0VBY1A0QUFQWU9BZ0QrL0FBQWlBd0NBRWpVQVFBdkVRRUFrdndBQUtZTEFnQUwxQUVBOGhBQkFHRWhBQURrQVFJQVJ5QUFBRFlCQWdEMjF3RUF3UlFCQUpIV0FRQmdFd0VBSHZFQkFOWVZBd0JWL1FBQUZ3MERBT1QrQUFDQ0R3RUFtdFlCQUdrVEFRRFNNZ0FBVndZQkFPei9BQUNJRUFFQUcvOEFBTU1QQVFCbU1nQUFzZ1VCQUZiZ0FRRHhGQUVBRVA0QUFLME9BUUNJTXdBQVZ3Z0RBSmZ1QVFCNEZRRUFjekVBQUg0RUFRQ0QxUUVBVWhJQkFQbjdBUUNLRmdFQVRmNEFBTmtPQVFEZUpBQUFPd01CQUVQVkFRQVhFZ0VBZmRVQkFFd1NBUUIvL3dBQUp4QUJBRUR5QVFCa0ZnTUFOTlVCQUFvU0FRQWovUUFBMGd3Q0FFWC9BQUR0RHdFQXJUTUFBTFFJQXdBWTFnRUE1eElCQUczOEFBQmNDd0lBcUFBQUFBRUFBZ0IzK3dBQTRBa0JBUHIrQUFDaUR3TUFYZTRCQUVrVkFRRHFNZ0FBYndZQkFDTXZBQUI4QXdFQXF4MEFBTlVBQVFEY0RnQUFmQUFDQUpmK0FBQTFEd0VBdFB3QUFPOExBZ0NsTHdBQS9nTUJBRGpVQVFBZkVRRUFsVEVBQUowRUFRQW4xd0VBOUJNQkFHTFdBUUF4RXdFQUR0Y0JBTnNUQVFBWDFBRUEvaEFCQURiVUFRQWRFUUVBR3Z3QUFLb0tBZ0RiMXdFQXBoUUJBUHZXQVFESUV3RUE5djRBQUpZUEF3Q1RNUUFBbXdRQkFJY0hBUUNRRUFFQVUrQUJBTzRVQVFCUjFnRUFJQk1CQUViZ0FRRGhGQUVBUC80QUFNa09BUUJKL3dBQThROEJBQ1lnQUFBa0FRTUE1ek1BQUQwSkFnQWNJUUFBandFQkFGZ3ZBQUN4QXdFQS85VUJBTTRTQVFDYi9nQUFPUThCQUMvOUFBRHFEQUlBQ2Y4QUFMRVBBUUFhMWdFQTZSSUJBS3ZYQVFCNEZBRUFwTlVCQUhNU0FRQ0xNZ0FBN0FVQkFNUFVBUUNmRVFFQTVzd0JBTk1RQVFBTy93QUF0ZzhCQUhjR0FBQjBBQUlBQUM4QUFGa0RBUUNOSkFBQW5BSUNBQ2Y5QUFEYURBSUF0aDBBQU9BQUFRQnFNZ0FBdGdVQkFHYlZBUUExRWdFQXh5UUFBQ1FEQVFEL01nQUFoQVlDQUpjSEFRQ2dFQUVBcFNRQUFPQUNBd0F3L2dBQXVRNENBRGZVQVFBZUVRRUFELzhBQUxjUEFRQlkvQUFBSmdzQ0FLZlhBUUIwRkFFQVhDRUFBTmdCQXdDai9RQUErdzBEQUJiVkFRRHRFUUVBaWk4QUFPTURBUUFQL1FBQXFnd0NBQVBVQVFEcUVBRUFFOVFCQVBvUUFRQmlNZ0FBcmdVQkFBcnVBUUFTRlFFQXNmOEFBRmtRQVFBcjhnRUFVeFlCQUFQWEFRRFFFd0VBYmk4QUFNY0RBUURxSkFBQVJ3TUJBRDNYQVFBS0ZBRUEydndBQURzTUFnQkpMd0FBb2dNQkFFZ3hBQUJUQkFFQURmd0FBSkFLQWdDVEx3QUE3QU1CQUtvekFBQ3JDQU1BSnk4QUFJQURBUURvTWdBQWJRWUJBUGo3QVFDSkZnRUFBZkVCQUpnVkFnQmkxQUVBU0JFQkFFblhBUUFXRkFFQXFkY0JBSFlVQVFCLzFRRUFUaElCQURJeEFBQTlCQUVBYlA4QUFCUVFBUUNjL1FBQTVnMERBSkl4QUFDYUJBRUF3aThBQUJzRUFRQ1oxd0VBWmhRQkFEd2hBQUNwQVFFQWJlQUJBQWdWQVFEbjFBRUF3aEVCQUJYN0FBQ25DUUlBdkM4QUFCVUVBUURnSkFBQVBRTUJBQWt5QUFEREJBTUE2ak1BQUVRSkF3QnMvQUFBV2dzQ0FLd3ZBQUFGQkFFQUF2SUJBRFlXQVFEeit3QUFVZ29EQUhzeUFBRFVCUUlBT0M4QUFKRURBUUF1THdBQWh3TUJBQXdQQUFDQUFBRUFxLzBBQUJNT0F3Qms3Z0VBVFJVQkFEdjhBQURzQ2dJQWJ1NEJBRlFWQVFBKzFnRUFEUk1CQUgzVUFRQmpFUUVBS1A4QUFOQVBBUUQwL0FBQWN3d0RBSjc4QUFEREN3SUFyTmNCQUhrVUFRRDkxd0VBeUJRQkFBSDdBQUNWQ1FJQXJ2MEFBQndPQXdCck1RQUFkZ1FCQUR6V0FRQUxFd0VBdC8wQUFEY09Bd0J0MWdFQVBCTUJBRFF6QUFCWkJ3WUFhdndBQUZZTEFnQmk3Z0VBVEJVQkFJMHpBQUJrQ0FJQXJETUFBTEVJQXdBT013QUF2UVlFQUlMK0FBQVZEd0lBTXpNQUFGVUhCQUJzSkFBQU93SUNBRHJYQVFBSEZBRUFoL3dBQUpBTEFnQm00QUVBQVJVQkFBRDlBQUNNREFJQWtUSUFBUElGQVFBeTF3RUEveE1CQUdzaEFBRDZBUU1BdGk4QUFBOEVBUURuSkFBQVJBTUJBTUF2QUFBWkJBRUErVE1BQUhFSkF3Q2YvQUFBeFFzQ0FJZ3hBQUNUQkFFQWVmMEFBSU1OQXdBcE1nQUFOZ1VEQU1YVUFRQ2dFUUVBdFNRQUFCQURBd0NSMVFFQVlCSUJBR014QUFCdUJBRUEzVE1BQUNjSkFnRERNZ0FBTmdZQ0FLa2RBQURUQUFFQVMvd0FBQXdMQWdEcCt3QUFOZ29CQUIvWEFRRHNFd0VBVERNQUFMVUhCUUNUQndFQW5CQUJBRll2QUFDdkF3RUEwZFFCQUt3UkFRQlQrd0FBdkFrQkFMTU9BQUI2QUFJQUVTOEFBR29EQVFDSit3QUE4Z2tCQUFFeUFBQ3JCQU1BZ3YwQUFKNE5Bd0FEMVFFQTNoRUJBTVgrQUFCakR3RUFodFFCQUd3UkFRQlQxd0VBSUJRQkFELy9BQURuRHdFQVNUTUFBS29IQWdEMzFRRUF4aElCQUpuVkFRQm9FZ0VBV05VQkFDY1NBUUM0MVFFQWh4SUJBQWN2QUFCZ0F3RUFnVE1BQUVrSUFnQkgvQUFBQkFzQ0FBd3pBQUMxQmdRQWFTRUFBUGNCQVFDRk1nQUE1Z1VCQUJMV0FRRGhFZ0VBVmZzQUFMNEpBUUNMMWdFQVdoTUJBSmpYQVFCbEZBRUE4RE1BQUZZSkF3QzYvZ0FBV0E4QkFMSFVBUUNQRVFFQW1mOEFBRUVRQVFCWklRQUF6d0VEQURuL0FBRGhEd0VBOE5VQkFMOFNBUUNBMUFFQVpoRUJBT3YrQUFDSkR3RUFqdTRCQUc4VkFRQW9JUUFBbVFFQkFEYmdBUURSRkFFQSsvNEFBS1VQQWdEYjFnRUFxQk1CQU9yV0FRQzNFd0VBeHY0QUFHUVBBUUJzN2dFQVVoVUJBTUVrQUFBZUF3RUFzOVlCQUlBVEFRQVQxd0VBNEJNQkFJeitBQUFwRHdJQXd2d0FBQXNNQWdEbEpBQUFRZ01CQU1mOEFBQVZEQUlBTXdFQUFCb0FBZ0JBMWdFQUR4TUJBTXYvQUFCdUVBRUFyZjBBQUJrT0F3QisxUUVBVFJJQkFGZlhBUUFrRkFFQTB6SUFBRmdHQVFCMkx3QUF6d01CQUdVa0FBQXhBZ0VBSE80QkFDUVZBUURWTWdBQVdnWUJBSFA5QUFCeERRTUFzUHNBQUJzS0FnQm1Md0FBdndNQkFQYlZBUURGRWdFQXUvNEFBRmtQQVFDeEFnQUFQd0FCQUM3dUFRQXhGUUVBY1NBQUFFSUJBUUQ3L1FBQW9RNElBSUg4QUFDRUN3SUE3LzRBQUkwUEFRQnpJUUFBQndJQ0FLYnVBUUNCRlFFQWVDUUFBRmNDQXdENDFnRUF4Uk1CQUszdUFRQ0hGUUVBdk5VQkFJc1NBUUN1MWdFQWV4TUJBTi8rQUFCOUR3RUF2dFVCQUkwU0FRQnkxZ0VBUVJNQkFDWDlBQURXREFJQXVoMEFBT1FBQVFCakpBQUFMd0lCQU9MOEFBQk5EQUlBV3lFQUFOVUJBd0Q1MXdFQXhCUUJBTmN5QUFCY0JnRUFyOVFCQUkwUkFRQ1JMd0FBNmdNQkFHc2tBQUE1QWdJQXJRY0JBTFlRQVFEUkF3QUFZQUFCQU16L0FBQnZFQUVBbnYwQUFPd05Bd0FWSVFBQWlRRUJBQlhYQVFEaUV3RUEyOVVCQUtvU0FRQjAxd0VBUVJRQkFHSDhBQUE3Q3dNQUFkUUJBT2dRQVFBSk13QUFyQVlEQUdqdUFRQlBGUUVBU2U0QkFENFZBUUFaSVFBQWpBRUJBSUw3QUFEckNRRUFRdFlCQUJFVEFRQ1gvQUFBc0FzREFMY0hBUUMvRUFFQW12c0FBQU1LQVFERy93QUFheEFCQUdVeUFBQ3hCUUVBT2pNQUFIRUhCQUFkMWdFQTdCSUJBRk12QUFDc0F3RUFnaUFBQUZFQkFRQTAxd0VBQVJRQkFBWWhBQUI1QVFNQWtnY0JBSnNRQVFBYjFnRUE2aElCQUJQVkFRRHJFUUVBb2Y4QUFFa1FBUUFTL2dBQXJ3NEJBS0w5QUFENERRTUFrZndBQUtRTEFnRHRId0FBQ1FFREFOL1ZBUUN1RWdFQStESUFBSDBHQVFDeUx3QUFDd1FCQU1ReUFBQTRCZ0lBV0RFQUFHTUVBUURUMWdFQW9CTUJBSVQ3QUFEdENRRUF5aVFBQUNjREFRQUlNZ0FBd0FRREFQd3lBQUNCQmdFQWxQNEFBRElQQVFCWElRQUF5UUVEQUZjekFBRGZCd01BQ2pJQUFNWUVBd0RhSkFBQU53TUJBTUw5QUFCWURnTUFGOVlCQU9ZU0FRRGgxUUVBc0JJQkFIRFZBUUEvRWdFQWZqSUFBTjhGQWdEZEh3QUFBQUVEQUYzOUFBQXZEUU1BZ3k4QUFOd0RBUURrL3dBQWdSQUJBSWY5QUFDdERRTUEwU1FBQUM0REFRQ0VBd0FBV2dBQ0FOWWtBQUF6QXdFQVIrNEJBRDBWQVFEVEF3QUFZZ0FDQVBjeUFBQjhCZ0VBQ2RZQkFOZ1NBUUNzSkFBQTlRSURBRGt2QUFDU0F3RUExL3NBQUNNS0FRQnYrd0FBMkFrQkFCUDlBQUN5REFJQUR6SUFBTllFQkFEdS9BQUFaUXdDQUMzVkFRQURFZ0VBTHRZQkFQMFNBUUN0THdBQUJnUUJBQlRVQVFEN0VBRUFoUDRBQUJrUEFnQnQxd0VBT2hRQkFDUHlBUUJMRmdFQWh5OEFBT0FEQVFEU0x3QUFLd1FCQUpYL0FBQTlFQUVBQXU0QkFBc1ZBUUJ4SkFBQVJRSUNBQlRYQVFEaEV3RUFHTmNCQU9VVEFRRE8vd0FBY1JBQkFMQUNBQUErQUFFQVYrNEJBRVlWQVFDeEhRQUEyd0FCQU9QN0FBQXdDZ0VBV09BQkFQTVVBUUJUTVFBQVhnUUJBRkwvQUFENkR3RUFReklBQUlRRkF3QW1NZ0FBTFFVREFHcjdBQURUQ1FFQWRPNEJBRmtWQVFEY01nQUFZUVlCQUFQOEFBQjZDZ01BbXg0QUFPd0FBZ0NuL1FBQUJ3NERBQlg5QUFDMkRBSUFBZndBQUhRS0F3QjgvQUFBZWdzQ0FFRXpBQUNPQndNQUpETUFBQndIQkFDb0x3QUFBUVFCQUQ0dkFBQ1hBd0VBblA4QUFFUVFBUUFnK3dBQXJRa0JBQTB2QUFCbUF3RUE2OVVCQUxvU0FRQ2MxUUVBYXhJQkFIOEJBQUFpQUFFQW50Y0JBR3NVQVFBVTdnRUFIQlVCQUl6OUFBQzhEUU1BdmZ3QUFBRU1BZ0FoOGdFQVNSWUJBRWtnQUFBNkFRSUEyZFFCQUxRUkFRQ3EvUUFBRUE0REFBNHlBQURTQkFRQU9lNEJBRG9WQVFBcTF3RUE5eE1CQUs4eUFBQVFCZ0VBanZzQUFQY0pBUUIzSUFBQVJnRUJBS2JVQVFDSEVRRUFjQzhBQU1rREFRQm9Nd0FBQ0FnREFHMzdBQURXQ1FFQVhDOEFBTFVEQVFBME1RQUFQd1FCQUxZa0FBQVRBd0VBTU5ZQkFQOFNBUURNTXdBQS93Z0NBSkw3QUFEN0NRRUExQ1FBQURFREFRQnExQUVBVUJFQkFERC9BQURZRHdFQUNQd0FBSVlLQWdDeS93QUFXaEFCQVA4ekFBQ0RDUU1BZXlFQUFCZ0NBd0RlL2dBQWZBOEJBQVFnQUFBWEFRRUEwZndBQUNrTUFnQjlJQUFBVEFFQkFKVDdBQUQ5Q1FFQWVDQUFBRWNCQVFEZTFBRUF1UkVCQUFiOEFBQ0NDZ0lBcTlVQkFIb1NBUURyMWdFQXVCTUJBSG4vQUFBaEVBRUFCZGNCQU5JVEFRQmlKQUFBTGdJQkFLSDhBQURKQ3dJQUtQd0FBTVlLQWdCKzF3RUFTeFFCQU9iK0FBQ0VEd0VBSi9FQkFQRVZBd0NBMVFFQVR4SUJBRS91QVFCQ0ZRRUFHZFlCQU9nU0FRQTdNZ0FBYkFVREFNZ0JBQUF1QUFJQUhQSUJBRVFXQVFEeSt3RUFneFlCQUNiN0FBQ3pDUUVBTytBQkFOWVVBUUM0L1FBQU9nNERBRS9WQVFBZkVnRUFaTlVCQURNU0FRRHIxd0VBdGhRQkFGRGdBUURyRkFFQTJOVUJBS2NTQVFEdzFBRUF5eEVCQU5QL0FBQjBFQUVBM2pJQUFHTUdBUUIwMVFFQVF4SUJBT1FDQUFCWEFBRUFudFVCQUcwU0FRQjAvd0FBSEJBQkFGNGhBQURlQVFNQU5QMEFBUFFNQWdBcS93QUEwZzhCQUJYL0FBQzlEd0VBRGRVQkFPVVJBUUFoL0FBQXVBb0NBRS8vQUFEM0R3RUFvZjRBQUQ4UEFRQU4xZ0VBM0JJQkFEci9BQURpRHdFQUV1NEJBQm9WQVFBWU13QUE2Z1lFQUh6K0FBQUtEd0lBcS93QUFOMExBZ0FGTWdBQXR3UURBUEVCQUFBNEFBSUFRdjRBQU13T0FRQ1IvZ0FBTHc4QkFNY0JBQUFzQUFJQWdkWUJBRkFUQVFEZTFnRUFxeE1CQUxEVUFRQ09FUUVBUXRjQkFBOFVBUUIvMWdFQVRoTUJBRVhXQVFBVUV3RUFzUDRBQUU0UEFRQWg4UUVBM3hVREFCSFdBUURnRWdFQVV0Y0JBQjhVQVFBeS9nQUF2QTRCQUlIL0FBQXBFQUVBQ1NBQUFCd0JBUUJNOFFFQUlSWUNBTnYrQUFCNUR3RUEwTlVCQUo4U0FRRDYvQUFBZ0F3Q0FKWXlBQUQzQlFFQUd0Y0JBT2NUQVFDbUJ3RUFyeEFCQUt6VkFRQjdFZ0VBay8wQUFNc05Bd0NMN2dFQWJCVUJBTXYrQUFCcER3RUFvOWNCQUhBVUFRQ1dMd0FBN3dNQkFFN3VBUUJCRlFFQXp5UUFBQ3dEQVFDcU1nQUFDd1lCQUlqdUFRQnFGUUVBY0RJQUFMNEZBZ0RyL0FBQVh3d0NBT0F5QUFCbEJnRUFoOVVCQUZZU0FRRHN6QUVBMlJBQkFNalhBUUNWRkFFQXN2NEFBRkFQQVFCNU13QUFOZ2dEQUlqV0FRQlhFd0VBc2djQkFMb1FBUURJTXdBQTl3Z0NBQ0RXQVFEdkVnRUFQZndBQVBBS0FnQ3AvUUFBRFE0REFFYnlBUUIyRmdNQStmNEFBSjhQQXdCZ0lRQUE0d0VCQUMvWEFRRDhFd0VBYy93QUFHZ0xBZ0NCSkFBQWRnSUVBQ2pWQVFEK0VRRUFmVElBQU5zRkJBQmcrd0FBeVFrQkFMTXpBQURJQ0FJQU55OEFBSkFEQVFCTjFRRUFIUklCQURQOEFBRGNDZ0lBc3pJQUFCWUdBZ0FiMUFFQUFoRUJBSFhVQVFCYkVRRUFiU0VBQVA0QkFRQzAvZ0FBVWc4QkFCM1VBUUFFRVFFQURPNEJBQlFWQVFDMi9nQUFWQThCQUYzZ0FRRDRGQUVBSnY4QUFNNFBBUUNTMVFFQVlSSUJBQzhoQUFDY0FRRUFHUHdBQUtZS0FnRHovUUFBZEE0RUFQRXpBQUJaQ1FNQXR2d0FBUE1MQWdDNU1nQUFJZ1lDQUhuN0FBRGlDUUVBdHRRQkFKUVJBUUR3L2dBQWpnOEJBTGN6QUFEUUNBSUFlL3NBQU9RSkFRQmExUUVBS1JJQkFMSDhBQURwQ3dJQWNpUUFBRWNDQWdBY01nQUFDZ1VFQUxJQ0FBQkFBQUVBRGk4QUFHY0RBUUNKL3dBQU1SQUJBUFhXQVFEQ0V3RUFJQUFBQUNBQUFBQUlBd0FBWVFBQUFDQUFBQUFFQXdBQU1nQUFBRE1BQUFBZ0FBQUFBUU1BQUx3REFBQWdBQUFBSndNQUFERUFBQUJ2QUFBQU1RQUFBRVFnQUFBMEFBQUFNUUFBQUVRZ0FBQXlBQUFBTXdBQUFFUWdBQUEwQUFBQVNRQUFBRW9BQUFCcEFBQUFhZ0FBQUV3QUFBQzNBQUFBYkFBQUFMY0FBQUM4QWdBQWJnQUFBSE1BQUFCRUFBQUFXZ0FBQUF3REFBQkVBQUFBZWdBQUFBd0RBQUJrQUFBQWVnQUFBQXdEQUFCTUFBQUFTZ0FBQUV3QUFBQnFBQUFBYkFBQUFHb0FBQUJPQUFBQVNnQUFBRTRBQUFCcUFBQUFiZ0FBQUdvQUFBQkVBQUFBV2dBQUFFUUFBQUI2QUFBQVpBQUFBSG9BQUFCb0FBQUFaZ0lBQUdvQUFBQnlBQUFBZVFJQUFIc0NBQUNCQWdBQWR3QUFBSGtBQUFBZ0FBQUFCZ01BQUNBQUFBQUhBd0FBSUFBQUFBb0RBQUFnQUFBQUtBTUFBQ0FBQUFBREF3QUFJQUFBQUFzREFBQmpBZ0FBYkFBQUFITUFBQUI0QUFBQWxRSUFBQ0FBQUFCRkF3QUFJQUFBQUFFREFBQWdBQUFBQ0FNQUFBRURBQUN5QXdBQXVBTUFBS1VEQUFDbEF3QUFBUU1BQUtVREFBQUlBd0FBeGdNQUFNQURBQUM2QXdBQXdRTUFBTUlEQUFDWUF3QUF0UU1BQUtNREFBQmxCUUFBZ2dVQUFDY0dBQUIwQmdBQVNBWUFBSFFHQUFESEJnQUFkQVlBQUVvR0FBQjBCZ0FBVFE0QUFESU9BQURORGdBQXNnNEFBS3NPQUFDWkRnQUFxdzRBQUtFT0FBQUxEd0FBc2c4QUFIRVBBQUNBRHdBQXN3OEFBSEVQQUFDQUR3QUEzQkFBQUVFQUFBREdBQUFBUWdBQUFFUUFBQUJGQUFBQWpnRUFBRWNBQUFCSUFBQUFTUUFBQUVvQUFBQkxBQUFBVEFBQUFFMEFBQUJPQUFBQVR3QUFBQ0lDQUFCUUFBQUFVZ0FBQUZRQUFBQlZBQUFBVndBQUFHRUFBQUJRQWdBQVVRSUFBQUlkQUFCaUFBQUFaQUFBQUdVQUFBQlpBZ0FBV3dJQUFGd0NBQUJuQUFBQWF3QUFBRzBBQUFCTEFRQUFid0FBQUZRQ0FBQVdIUUFBRngwQUFIQUFBQUIwQUFBQWRRQUFBQjBkQUFCdkFnQUFkZ0FBQUNVZEFBQ3lBd0FBc3dNQUFMUURBQURHQXdBQXh3TUFBR2tBQUFCeUFBQUFkUUFBQUhZQUFBQ3lBd0FBc3dNQUFNRURBQURHQXdBQXh3TUFBRDBFQUFCU0FnQUFZd0FBQUZVQ0FBRHdBQUFBWEFJQUFHWUFBQUJmQWdBQVlRSUFBR1VDQUFCb0FnQUFhUUlBQUdvQ0FBQjdIUUFBblFJQUFHMENBQUNGSFFBQW53SUFBSEVDQUFCd0FnQUFjZ0lBQUhNQ0FBQjBBZ0FBZFFJQUFIZ0NBQUNDQWdBQWd3SUFBS3NCQUFDSkFnQUFpZ0lBQUJ3ZEFBQ0xBZ0FBakFJQUFIb0FBQUNRQWdBQWtRSUFBSklDQUFDNEF3QUFZUUFBQUw0Q0FBQnpBQUFBQndNQUFDQUFBQUFUQXdBQUlBQUFBQk1EQUFBZ0FBQUFRZ01BQUNBQUFBQUlBd0FBUWdNQUFDQUFBQUFUQXdBQUFBTUFBQ0FBQUFBVEF3QUFBUU1BQUNBQUFBQVRBd0FBUWdNQUFDQUFBQUFVQXdBQUFBTUFBQ0FBQUFBVUF3QUFBUU1BQUNBQUFBQVVBd0FBUWdNQUFDQUFBQUFJQXdBQUFBTUFBQ0FBQUFBSUF3QUFBUU1BQUNBQUFBQUJBd0FBSUFBQUFCUURBQUFnQUFBQUlBQUFBQ0FBQUFBZ0FBQUFJQUFBQUNBQUFBQWdBQUFBSUFBQUFDQUFBQUFnQUFBQUlBQUFBQkFnQUFBZ0FBQUFNd01BQUM0QUFBQXVBQUFBTGdBQUFDNEFBQUF1QUFBQUxnQUFBQ0FBQUFBeUlBQUFNaUFBQURJZ0FBQXlJQUFBTWlBQUFEVWdBQUExSUFBQU5TQUFBRFVnQUFBMUlBQUFJUUFBQUNFQUFBQWdBQUFBQlFNQUFEOEFBQUEvQUFBQVB3QUFBQ0VBQUFBaEFBQUFQd0FBQURJZ0FBQXlJQUFBTWlBQUFESWdBQUFnQUFBQU1BQUFBR2tBQUFBMEFBQUFOUUFBQURZQUFBQTNBQUFBT0FBQUFEa0FBQUFyQUFBQUVpSUFBRDBBQUFBb0FBQUFLUUFBQUc0QUFBQXdBQUFBTVFBQUFESUFBQUF6QUFBQU5BQUFBRFVBQUFBMkFBQUFOd0FBQURnQUFBQTVBQUFBS3dBQUFCSWlBQUE5QUFBQUtBQUFBQ2tBQUFCaEFBQUFaUUFBQUc4QUFBQjRBQUFBV1FJQUFHZ0FBQUJyQUFBQWJBQUFBRzBBQUFCdUFBQUFjQUFBQUhNQUFBQjBBQUFBVWdBQUFITUFBQUJoQUFBQUx3QUFBR01BQUFCaEFBQUFMd0FBQUhNQUFBQkRBQUFBc0FBQUFFTUFBQUJqQUFBQUx3QUFBRzhBQUFCakFBQUFMd0FBQUhVQUFBQ1FBUUFBc0FBQUFFWUFBQUJuQUFBQVNBQUFBRWdBQUFCSUFBQUFhQUFBQUNjQkFBQkpBQUFBU1FBQUFFd0FBQUJzQUFBQVRnQUFBRTRBQUFCdkFBQUFVQUFBQUZFQUFBQlNBQUFBVWdBQUFGSUFBQUJUQUFBQVRRQUFBRlFBQUFCRkFBQUFUQUFBQUZRQUFBQk5BQUFBV2dBQUFGb0FBQUJDQUFBQVF3QUFBR1VBQUFCRkFBQUFSZ0FBQUUwQUFBQnZBQUFBMEFVQUFORUZBQURTQlFBQTB3VUFBR2tBQUFCR0FBQUFRUUFBQUZnQUFBREFBd0FBc3dNQUFKTURBQUNnQXdBQUVTSUFBRVFBQUFCa0FBQUFaUUFBQUdrQUFBQnFBQUFBTVFBQUFFUWdBQUEzQUFBQU1RQUFBRVFnQUFBNUFBQUFNUUFBQUVRZ0FBQXhBQUFBTUFBQUFERUFBQUJFSUFBQU13QUFBRElBQUFCRUlBQUFNd0FBQURFQUFBQkVJQUFBTlFBQUFESUFBQUJFSUFBQU5RQUFBRE1BQUFCRUlBQUFOUUFBQURRQUFBQkVJQUFBTlFBQUFERUFBQUJFSUFBQU5nQUFBRFVBQUFCRUlBQUFOZ0FBQURFQUFBQkVJQUFBT0FBQUFETUFBQUJFSUFBQU9BQUFBRFVBQUFCRUlBQUFPQUFBQURjQUFBQkVJQUFBT0FBQUFERUFBQUJFSUFBQVNRQUFBRWtBQUFCSkFBQUFTUUFBQUVrQUFBQkpBQUFBU1FBQUFGWUFBQUJXQUFBQVZnQUFBRWtBQUFCV0FBQUFTUUFBQUVrQUFBQldBQUFBU1FBQUFFa0FBQUJKQUFBQVNRQUFBRmdBQUFCWUFBQUFXQUFBQUVrQUFBQllBQUFBU1FBQUFFa0FBQUJNQUFBQVF3QUFBRVFBQUFCTkFBQUFhUUFBQUdrQUFBQnBBQUFBYVFBQUFHa0FBQUJwQUFBQWFRQUFBSFlBQUFCMkFBQUFkZ0FBQUdrQUFBQjJBQUFBYVFBQUFHa0FBQUIyQUFBQWFRQUFBR2tBQUFCcEFBQUFhUUFBQUhnQUFBQjRBQUFBZUFBQUFHa0FBQUI0QUFBQWFRQUFBR2tBQUFCc0FBQUFZd0FBQUdRQUFBQnRBQUFBTUFBQUFFUWdBQUF6QUFBQUt5SUFBQ3NpQUFBcklnQUFLeUlBQUNzaUFBQXVJZ0FBTGlJQUFDNGlBQUF1SWdBQUxpSUFBREVBQUFBeUFBQUFNd0FBQURRQUFBQTFBQUFBTmdBQUFEY0FBQUE0QUFBQU9RQUFBREVBQUFBd0FBQUFNUUFBQURFQUFBQXhBQUFBTWdBQUFERUFBQUF6QUFBQU1RQUFBRFFBQUFBeEFBQUFOUUFBQURFQUFBQTJBQUFBTVFBQUFEY0FBQUF4QUFBQU9BQUFBREVBQUFBNUFBQUFNZ0FBQURBQUFBQW9BQUFBTVFBQUFDa0FBQUFvQUFBQU1nQUFBQ2tBQUFBb0FBQUFNd0FBQUNrQUFBQW9BQUFBTkFBQUFDa0FBQUFvQUFBQU5RQUFBQ2tBQUFBb0FBQUFOZ0FBQUNrQUFBQW9BQUFBTndBQUFDa0FBQUFvQUFBQU9BQUFBQ2tBQUFBb0FBQUFPUUFBQUNrQUFBQW9BQUFBTVFBQUFEQUFBQUFwQUFBQUtBQUFBREVBQUFBeEFBQUFLUUFBQUNnQUFBQXhBQUFBTWdBQUFDa0FBQUFvQUFBQU1RQUFBRE1BQUFBcEFBQUFLQUFBQURFQUFBQTBBQUFBS1FBQUFDZ0FBQUF4QUFBQU5RQUFBQ2tBQUFBb0FBQUFNUUFBQURZQUFBQXBBQUFBS0FBQUFERUFBQUEzQUFBQUtRQUFBQ2dBQUFBeEFBQUFPQUFBQUNrQUFBQW9BQUFBTVFBQUFEa0FBQUFwQUFBQUtBQUFBRElBQUFBd0FBQUFLUUFBQURFQUFBQXVBQUFBTWdBQUFDNEFBQUF6QUFBQUxnQUFBRFFBQUFBdUFBQUFOUUFBQUM0QUFBQTJBQUFBTGdBQUFEY0FBQUF1QUFBQU9BQUFBQzRBQUFBNUFBQUFMZ0FBQURFQUFBQXdBQUFBTGdBQUFERUFBQUF4QUFBQUxnQUFBREVBQUFBeUFBQUFMZ0FBQURFQUFBQXpBQUFBTGdBQUFERUFBQUEwQUFBQUxnQUFBREVBQUFBMUFBQUFMZ0FBQURFQUFBQTJBQUFBTGdBQUFERUFBQUEzQUFBQUxnQUFBREVBQUFBNEFBQUFMZ0FBQURFQUFBQTVBQUFBTGdBQUFESUFBQUF3QUFBQUxnQUFBQ2dBQUFCaEFBQUFLUUFBQUNnQUFBQmlBQUFBS1FBQUFDZ0FBQUJqQUFBQUtRQUFBQ2dBQUFCa0FBQUFLUUFBQUNnQUFBQmxBQUFBS1FBQUFDZ0FBQUJtQUFBQUtRQUFBQ2dBQUFCbkFBQUFLUUFBQUNnQUFBQm9BQUFBS1FBQUFDZ0FBQUJwQUFBQUtRQUFBQ2dBQUFCcUFBQUFLUUFBQUNnQUFBQnJBQUFBS1FBQUFDZ0FBQUJzQUFBQUtRQUFBQ2dBQUFCdEFBQUFLUUFBQUNnQUFBQnVBQUFBS1FBQUFDZ0FBQUJ2QUFBQUtRQUFBQ2dBQUFCd0FBQUFLUUFBQUNnQUFBQnhBQUFBS1FBQUFDZ0FBQUJ5QUFBQUtRQUFBQ2dBQUFCekFBQUFLUUFBQUNnQUFBQjBBQUFBS1FBQUFDZ0FBQUIxQUFBQUtRQUFBQ2dBQUFCMkFBQUFLUUFBQUNnQUFBQjNBQUFBS1FBQUFDZ0FBQUI0QUFBQUtRQUFBQ2dBQUFCNUFBQUFLUUFBQUNnQUFBQjZBQUFBS1FBQUFFRUFBQUJDQUFBQVF3QUFBRVFBQUFCRkFBQUFSZ0FBQUVjQUFBQklBQUFBU1FBQUFFb0FBQUJMQUFBQVRBQUFBRTBBQUFCT0FBQUFUd0FBQUZBQUFBQlJBQUFBVWdBQUFGTUFBQUJVQUFBQVZRQUFBRllBQUFCWEFBQUFXQUFBQUZrQUFBQmFBQUFBWVFBQUFHSUFBQUJqQUFBQVpBQUFBR1VBQUFCbUFBQUFad0FBQUdnQUFBQnBBQUFBYWdBQUFHc0FBQUJzQUFBQWJRQUFBRzRBQUFCdkFBQUFjQUFBQUhFQUFBQnlBQUFBY3dBQUFIUUFBQUIxQUFBQWRnQUFBSGNBQUFCNEFBQUFlUUFBQUhvQUFBQXdBQUFBS3lJQUFDc2lBQUFySWdBQUt5SUFBRG9BQUFBNkFBQUFQUUFBQUQwQUFBQTlBQUFBUFFBQUFEMEFBQUE5QUFBQWFnQUFBRllBQUFCaExRQUF6V3NBQUorZkFBQUFUZ0FBS0U0QUFEWk9BQUEvVGdBQVdVNEFBSVZPQUFDTVRnQUFvRTRBQUxwT0FBQS9VUUFBWlZFQUFHdFJBQUNDVVFBQWxsRUFBS3RSQUFEZ1VRQUE5VkVBQUFCU0FBQ2JVZ0FBK1ZJQUFCVlRBQUFhVXdBQU9GTUFBRUZUQUFCY1V3QUFhVk1BQUlKVEFBQzJVd0FBeUZNQUFPTlRBQURYVmdBQUgxY0FBT3RZQUFBQ1dRQUFDbGtBQUJWWkFBQW5XUUFBYzFrQUFGQmJBQUNBV3dBQStGc0FBQTljQUFBaVhBQUFPRndBQUc1Y0FBQnhYQUFBMjEwQUFPVmRBQUR4WFFBQS9sMEFBSEplQUFCNlhnQUFmMTRBQVBSZUFBRCtYZ0FBQzE4QUFCTmZBQUJRWHdBQVlWOEFBSE5mQUFERFh3QUFDR0lBQURaaUFBQkxZZ0FBTDJVQUFEUmxBQUNIWlFBQWwyVUFBS1JsQUFDNVpRQUE0R1VBQU9WbEFBRHdaZ0FBQ0djQUFDaG5BQUFnYXdBQVltc0FBSGxyQUFDemF3QUF5MnNBQU5SckFBRGJhd0FBRDJ3QUFCUnNBQUEwYkFBQWEzQUFBQ3B5QUFBMmNnQUFPM0lBQUQ5eUFBQkhjZ0FBV1hJQUFGdHlBQUNzY2dBQWhITUFBSWx6QUFEY2RBQUE1blFBQUJoMUFBQWZkUUFBS0hVQUFEQjFBQUNMZFFBQWtuVUFBSFoyQUFCOWRnQUFybllBQUw5MkFBRHVkZ0FBMjNjQUFPSjNBQUR6ZHdBQU9ua0FBTGg1QUFDK2VRQUFkSG9BQU10NkFBRDVlZ0FBYzN3QUFQaDhBQUEyZndBQVVYOEFBSXAvQUFDOWZ3QUFBWUFBQUF5QUFBQVNnQUFBTTRBQUFIK0FBQUNKZ0FBQTQ0RUFBT3FCQUFEemdRQUEvSUVBQUF5Q0FBQWJnZ0FBSDRJQUFHNkNBQUJ5Z2dBQWVJSUFBRTJHQUFCcmhnQUFRSWdBQUV5SUFBQmppQUFBZm9rQUFJdUpBQURTaVFBQUFJb0FBRGVNQUFCR2pBQUFWWXdBQUhpTUFBQ2RqQUFBWkkwQUFIQ05BQUN6alFBQXE0NEFBTXFPQUFDYmp3QUFzSThBQUxXUEFBQ1JrQUFBU1pFQUFNYVJBQURNa1FBQTBaRUFBSGVWQUFDQWxRQUFISllBQUxhV0FBQzVsZ0FBNkpZQUFGR1hBQUJlbHdBQVlwY0FBR21YQUFETGx3QUE3WmNBQVBPWEFBQUJtQUFBcUpnQUFOdVlBQURmbUFBQWxwa0FBSm1aQUFDc21RQUFxSm9BQU5pYUFBRGZtZ0FBSlpzQUFDK2JBQUF5bXdBQVBKc0FBRnFiQUFEbG5BQUFkWjRBQUgrZUFBQ2xuZ0FBdTU0QUFNT2VBQURObmdBQTBaNEFBUG1lQUFEOW5nQUFEcDhBQUJPZkFBQWdud0FBTzU4QUFFcWZBQUJTbndBQWpaOEFBSnlmQUFDZ253QUFJQUFBQUJJd0FBQkJVd0FBUkZNQUFFVlRBQUFnQUFBQW1UQUFBQ0FBQUFDYU1BQUFpREFBQUlvd0FBQ3pNQUFBeURBQUFBQVJBQUFCRVFBQXFoRUFBQUlSQUFDc0VRQUFyUkVBQUFNUkFBQUVFUUFBQlJFQUFMQVJBQUN4RVFBQXNoRUFBTE1SQUFDMEVRQUF0UkVBQUJvUkFBQUdFUUFBQnhFQUFBZ1JBQUFoRVFBQUNSRUFBQW9SQUFBTEVRQUFEQkVBQUEwUkFBQU9FUUFBRHhFQUFCQVJBQUFSRVFBQUVoRUFBR0VSQUFCaUVRQUFZeEVBQUdRUkFBQmxFUUFBWmhFQUFHY1JBQUJvRVFBQWFSRUFBR29SQUFCckVRQUFiQkVBQUcwUkFBQnVFUUFBYnhFQUFIQVJBQUJ4RVFBQWNoRUFBSE1SQUFCMEVRQUFkUkVBQUdBUkFBQVVFUUFBRlJFQUFNY1JBQURJRVFBQXpCRUFBTTRSQUFEVEVRQUExeEVBQU5rUkFBQWNFUUFBM1JFQUFOOFJBQUFkRVFBQUhoRUFBQ0FSQUFBaUVRQUFJeEVBQUNjUkFBQXBFUUFBS3hFQUFDd1JBQUF0RVFBQUxoRUFBQzhSQUFBeUVRQUFOaEVBQUVBUkFBQkhFUUFBVEJFQUFQRVJBQUR5RVFBQVZ4RUFBRmdSQUFCWkVRQUFoQkVBQUlVUkFBQ0lFUUFBa1JFQUFKSVJBQUNVRVFBQW5oRUFBS0VSQUFBQVRnQUFqRTRBQUFsT0FBRGJWZ0FBQ2s0QUFDMU9BQUFMVGdBQU1uVUFBRmxPQUFBWlRnQUFBVTRBQUNsWkFBQXdWd0FBdWs0QUFDZ0FBQUFBRVFBQUtRQUFBQ2dBQUFBQ0VRQUFLUUFBQUNnQUFBQURFUUFBS1FBQUFDZ0FBQUFGRVFBQUtRQUFBQ2dBQUFBR0VRQUFLUUFBQUNnQUFBQUhFUUFBS1FBQUFDZ0FBQUFKRVFBQUtRQUFBQ2dBQUFBTEVRQUFLUUFBQUNnQUFBQU1FUUFBS1FBQUFDZ0FBQUFPRVFBQUtRQUFBQ2dBQUFBUEVRQUFLUUFBQUNnQUFBQVFFUUFBS1FBQUFDZ0FBQUFSRVFBQUtRQUFBQ2dBQUFBU0VRQUFLUUFBQUNnQUFBQUFFUUFBWVJFQUFDa0FBQUFvQUFBQUFoRUFBR0VSQUFBcEFBQUFLQUFBQUFNUkFBQmhFUUFBS1FBQUFDZ0FBQUFGRVFBQVlSRUFBQ2tBQUFBb0FBQUFCaEVBQUdFUkFBQXBBQUFBS0FBQUFBY1JBQUJoRVFBQUtRQUFBQ2dBQUFBSkVRQUFZUkVBQUNrQUFBQW9BQUFBQ3hFQUFHRVJBQUFwQUFBQUtBQUFBQXdSQUFCaEVRQUFLUUFBQUNnQUFBQU9FUUFBWVJFQUFDa0FBQUFvQUFBQUR4RUFBR0VSQUFBcEFBQUFLQUFBQUJBUkFBQmhFUUFBS1FBQUFDZ0FBQUFSRVFBQVlSRUFBQ2tBQUFBb0FBQUFFaEVBQUdFUkFBQXBBQUFBS0FBQUFBd1JBQUJ1RVFBQUtRQUFBQ2dBQUFBTEVRQUFhUkVBQUF3UkFBQmxFUUFBcXhFQUFDa0FBQUFvQUFBQUN4RUFBR2tSQUFBU0VRQUFiaEVBQUNrQUFBQW9BQUFBQUU0QUFDa0FBQUFvQUFBQWpFNEFBQ2tBQUFBb0FBQUFDVTRBQUNrQUFBQW9BQUFBMjFZQUFDa0FBQUFvQUFBQWxFNEFBQ2tBQUFBb0FBQUFiVkVBQUNrQUFBQW9BQUFBQTA0QUFDa0FBQUFvQUFBQWExRUFBQ2tBQUFBb0FBQUFYVTRBQUNrQUFBQW9BQUFBUVZNQUFDa0FBQUFvQUFBQUNHY0FBQ2tBQUFBb0FBQUFhM0FBQUNrQUFBQW9BQUFBTkd3QUFDa0FBQUFvQUFBQUtHY0FBQ2tBQUFBb0FBQUEwWkVBQUNrQUFBQW9BQUFBSDFjQUFDa0FBQUFvQUFBQTVXVUFBQ2tBQUFBb0FBQUFLbWdBQUNrQUFBQW9BQUFBQ1djQUFDa0FBQUFvQUFBQVBua0FBQ2tBQUFBb0FBQUFEVlFBQUNrQUFBQW9BQUFBZVhJQUFDa0FBQUFvQUFBQW9Zd0FBQ2tBQUFBb0FBQUFYWGtBQUNrQUFBQW9BQUFBdEZJQUFDa0FBQUFvQUFBQTQwNEFBQ2tBQUFBb0FBQUFmRlFBQUNrQUFBQW9BQUFBWmxzQUFDa0FBQUFvQUFBQTQzWUFBQ2tBQUFBb0FBQUFBVThBQUNrQUFBQW9BQUFBeDR3QUFDa0FBQUFvQUFBQVZGTUFBQ2tBQUFBb0FBQUFiWGtBQUNrQUFBQW9BQUFBRVU4QUFDa0FBQUFvQUFBQTZvRUFBQ2tBQUFBb0FBQUE4NEVBQUNrQUFBQlBWUUFBZkY0QUFJZGxBQUNQZXdBQVVBQUFBRlFBQUFCRkFBQUFNZ0FBQURFQUFBQXlBQUFBTWdBQUFESUFBQUF6QUFBQU1nQUFBRFFBQUFBeUFBQUFOUUFBQURJQUFBQTJBQUFBTWdBQUFEY0FBQUF5QUFBQU9BQUFBRElBQUFBNUFBQUFNd0FBQURBQUFBQXpBQUFBTVFBQUFETUFBQUF5QUFBQU13QUFBRE1BQUFBekFBQUFOQUFBQURNQUFBQTFBQUFBQUJFQUFBSVJBQUFERVFBQUJSRUFBQVlSQUFBSEVRQUFDUkVBQUFzUkFBQU1FUUFBRGhFQUFBOFJBQUFRRVFBQUVSRUFBQklSQUFBQUVRQUFZUkVBQUFJUkFBQmhFUUFBQXhFQUFHRVJBQUFGRVFBQVlSRUFBQVlSQUFCaEVRQUFCeEVBQUdFUkFBQUpFUUFBWVJFQUFBc1JBQUJoRVFBQURCRUFBR0VSQUFBT0VRQUFZUkVBQUE4UkFBQmhFUUFBRUJFQUFHRVJBQUFSRVFBQVlSRUFBQklSQUFCaEVRQUFEaEVBQUdFUkFBQzNFUUFBQUJFQUFHa1JBQUFNRVFBQWJoRUFBQXNSQUFCMEVRQUFDeEVBQUc0UkFBQUFUZ0FBakU0QUFBbE9BQURiVmdBQWxFNEFBRzFSQUFBRFRnQUFhMUVBQUYxT0FBQkJVd0FBQ0djQUFHdHdBQUEwYkFBQUtHY0FBTkdSQUFBZlZ3QUE1V1VBQUNwb0FBQUpad0FBUG5rQUFBMVVBQUI1Y2dBQW9Zd0FBRjE1QUFDMFVnQUEySGtBQURkMUFBQnpXUUFBYVpBQUFDcFJBQUJ3VXdBQTZHd0FBQVdZQUFBUlR3QUFtVkVBQUdOckFBQUtUZ0FBTFU0QUFBdE9BQURtWFFBQTgxTUFBRHRUQUFDWFd3QUFabHNBQU9OMkFBQUJUd0FBeDR3QUFGUlRBQUFjV1FBQU13QUFBRFlBQUFBekFBQUFOd0FBQURNQUFBQTRBQUFBTXdBQUFEa0FBQUEwQUFBQU1BQUFBRFFBQUFBeEFBQUFOQUFBQURJQUFBQTBBQUFBTXdBQUFEUUFBQUEwQUFBQU5BQUFBRFVBQUFBMEFBQUFOZ0FBQURRQUFBQTNBQUFBTkFBQUFEZ0FBQUEwQUFBQU9RQUFBRFVBQUFBd0FBQUFNUUFBQUFobkFBQXlBQUFBQ0djQUFETUFBQUFJWndBQU5BQUFBQWhuQUFBMUFBQUFDR2NBQURZQUFBQUlad0FBTndBQUFBaG5BQUE0QUFBQUNHY0FBRGtBQUFBSVp3QUFNUUFBQURBQUFBQUlad0FBTVFBQUFERUFBQUFJWndBQU1RQUFBRElBQUFBSVp3QUFTQUFBQUdjQUFBQmxBQUFBY2dBQUFHY0FBQUJsQUFBQVZnQUFBRXdBQUFCVUFBQUFSQUFBQUtJd0FBQ2tNQUFBcGpBQUFLZ3dBQUNxTUFBQXF6QUFBSzB3QUFDdk1BQUFzVEFBQUxNd0FBQzFNQUFBdHpBQUFMa3dBQUM3TUFBQXZUQUFBTDh3QUFEQk1BQUF4REFBQU1Zd0FBRElNQUFBeWpBQUFNc3dBQURNTUFBQXpUQUFBTTR3QUFEUE1BQUEwakFBQU5Vd0FBRFlNQUFBMnpBQUFONHdBQURmTUFBQTREQUFBT0V3QUFEaU1BQUE1REFBQU9Zd0FBRG9NQUFBNlRBQUFPb3dBQURyTUFBQTdEQUFBTzB3QUFEdk1BQUE4REFBQVBFd0FBRHlNQUFBNUU0QUFJeFVBQUNpTUFBQXp6QUFBSm93QUFEOE1BQUF5REFBQUtJd0FBRHJNQUFBMVRBQUFLRXdBQUNpTUFBQTh6QUFBTmd3QUFDYU1BQUFvakFBQUtJd0FBRDhNQUFBNnpBQUFLUXdBQURMTUFBQTh6QUFBSzh3QUFDWk1BQUFwREFBQVBNd0FBREJNQUFBcGpBQUFLa3dBQUR6TUFBQXFEQUFBTGt3QUFDdk1BQUEvREFBQU1nd0FBQ1pNQUFBcURBQUFQd3dBQUNyTUFBQS9EQUFBS293QUFEek1BQUF1VEFBQUtvd0FBRDhNQUFBNERBQUFLc3dBQUNrTUFBQTZqQUFBS3N3QUFEcE1BQUF3ekFBQU1nd0FBQ3JNQUFBN1RBQUFPb3dBQUQ4TUFBQXF6QUFBSmt3QUFEdE1BQUE4ekFBQUtzd0FBQ1pNQUFBOHpBQUFONHdBQUN0TUFBQW1UQUFBS3N3QUFDWk1BQUFyVEFBQUprd0FBRExNQUFBL0RBQUFLMHdBQURsTUFBQTZqQUFBUHd3QUFDdE1BQUFtVEFBQU9zd0FBQy9NQUFBbVRBQUFQd3dBQUN0TUFBQTdUQUFBSzB3QUFEdE1BQUFyekFBQUprd0FBRHBNQUFBNERBQUFLMHdBQUR0TUFBQTRUQUFBUHd3QUFESU1BQUE2ekFBQUswd0FBRHRNQUFBN3pBQUFNTXdBQURJTUFBQXJ6QUFBSmt3QUFEcE1BQUE0REFBQUs4d0FBQ1pNQUFBNlRBQUFPQXdBQURJTUFBQTh6QUFBSzh3QUFEck1BQUF1ekFBQUprd0FBQ2tNQUFBN1RBQUFLOHdBQUR0TUFBQS9EQUFBTTB3QUFDeE1BQUEvREFBQUxrd0FBQ3pNQUFBNnpBQUFNb3dBQUN6TUFBQS9EQUFBTnN3QUFDYU1BQUF0VEFBQUtRd0FBQ3ZNQUFBNnpBQUFMVXdBQUR6TUFBQXdUQUFBUHd3QUFEZ01BQUF0ekFBQU9vd0FBRHpNQUFBcnpBQUFKa3dBQUM3TUFBQTh6QUFBTUV3QUFDN01BQUE4ekFBQU1nd0FBQy9NQUFBbVRBQUFQd3dBQUM1TUFBQXhqQUFBSmt3QUFDM01BQUF5REFBQUprd0FBRHJNQUFBeURBQUFQTXdBQURLTUFBQXpqQUFBTTR3QUFERE1BQUF5REFBQU04d0FBQ2tNQUFBeERBQUFNOHdBQUNhTUFBQS9EQUFBTHN3QUFEek1BQUF5REFBQU04d0FBQ2FNQUFBL0RBQUFNUXdBQURQTUFBQW1UQUFBUHd3QUFEc01BQUE2ekFBQU5Jd0FBQ2FNQUFBb2pBQUFMa3dBQURJTUFBQTZ6QUFBTkl3QUFDYU1BQUFyekFBQU9zd0FBRFNNQUFBbWpBQUFMTXdBQURTTUFBQW1UQUFBT3N3QUFEVk1BQUFvVEFBQU9rd0FBRERNQUFBeURBQUFKa3dBQURWTUFBQW96QUFBUHd3QUFESU1BQUExVEFBQUprd0FBRERNQUFBdHpBQUFLY3dBQURyTUFBQTFUQUFBT2t3QUFEek1BQUEyREFBQUs4d0FBQy9NQUFBL0RBQUFPc3dBQURZTUFBQW1qQUFBTDB3QUFEWU1BQUFtakFBQU1zd0FBRFNNQUFBMkRBQUFPc3dBQURFTUFBQTJEQUFBSm93QUFEek1BQUF1VEFBQU5nd0FBQ2FNQUFBL0RBQUFMY3dBQUNaTUFBQTJEQUFBSmt3QUFEOE1BQUF2ekFBQU5zd0FBQ2FNQUFBcERBQUFQTXdBQURJTUFBQTJ6QUFBSmt3QUFEck1BQUF5REFBQU5zd0FBRHpNQUFBMnpBQUFKb3dBQUR6TUFBQXlEQUFBSmt3QUFEYk1BQUEvREFBQU9zd0FBRGJNQUFBL0RBQUFQTXdBQURlTUFBQXBEQUFBSzh3QUFEdE1BQUEzakFBQUtRd0FBRHJNQUFBM2pBQUFNTXdBQURQTUFBQTNqQUFBT3N3QUFDdk1BQUEzakFBQVBNd0FBQzNNQUFBNXpBQUFQTXdBQURmTUFBQXJ6QUFBTzB3QUFEek1BQUEzekFBQU9vd0FBRGZNQUFBNmpBQUFNOHdBQUNaTUFBQS9EQUFBT3N3QUFEaE1BQUFxekFBQUprd0FBRGhNQUFBcXpBQUFKa3dBQURJTUFBQTh6QUFBT0V3QUFEOE1BQUF5REFBQU9zd0FBRGtNQUFBL0RBQUFNZ3dBQUNaTUFBQTVEQUFBUHd3QUFEck1BQUE1akFBQUtJd0FBRHpNQUFBNmpBQUFNTXdBQURJTUFBQTZ6QUFBT293QUFEcE1BQUE2ekFBQU5Jd0FBQ2FNQUFBL0RBQUFPc3dBQUQ4TUFBQTFUQUFBSmt3QUFEck1BQUE3REFBQU9Bd0FBRHNNQUFBOHpBQUFNZ3dBQUN4TUFBQW1UQUFBUE13QUFEdk1BQUF3ekFBQU1nd0FBQXdBQUFBdVhBQUFERUFBQUM1Y0FBQU1nQUFBTGx3QUFBekFBQUF1WEFBQURRQUFBQzVjQUFBTlFBQUFMbHdBQUEyQUFBQXVYQUFBRGNBQUFDNWNBQUFPQUFBQUxsd0FBQTVBQUFBdVhBQUFERUFBQUF3QUFBQXVYQUFBREVBQUFBeEFBQUF1WEFBQURFQUFBQXlBQUFBdVhBQUFERUFBQUF6QUFBQXVYQUFBREVBQUFBMEFBQUF1WEFBQURFQUFBQTFBQUFBdVhBQUFERUFBQUEyQUFBQXVYQUFBREVBQUFBM0FBQUF1WEFBQURFQUFBQTRBQUFBdVhBQUFERUFBQUE1QUFBQXVYQUFBRElBQUFBd0FBQUF1WEFBQURJQUFBQXhBQUFBdVhBQUFESUFBQUF5QUFBQXVYQUFBRElBQUFBekFBQUF1WEFBQURJQUFBQTBBQUFBdVhBQUFHZ0FBQUJRQUFBQVlRQUFBR1FBQUFCaEFBQUFRUUFBQUZVQUFBQmlBQUFBWVFBQUFISUFBQUJ2QUFBQVZnQUFBSEFBQUFCakFBQUFaQUFBQUcwQUFBQmtBQUFBYlFBQUFESUFBQUJrQUFBQWJRQUFBRE1BQUFCSkFBQUFWUUFBQUhOZUFBQVFZZ0FBTFdZQUFJeFVBQUFuV1FBQVkyc0FBQTVtQUFDN2JBQUFLbWdBQUE5ZkFBQWFUd0FBUG5rQUFIQUFBQUJCQUFBQWJnQUFBRUVBQUFDOEF3QUFRUUFBQUcwQUFBQkJBQUFBYXdBQUFFRUFBQUJMQUFBQVFnQUFBRTBBQUFCQ0FBQUFSd0FBQUVJQUFBQmpBQUFBWVFBQUFHd0FBQUJyQUFBQVl3QUFBR0VBQUFCc0FBQUFjQUFBQUVZQUFBQnVBQUFBUmdBQUFMd0RBQUJHQUFBQXZBTUFBR2NBQUFCdEFBQUFad0FBQUdzQUFBQm5BQUFBU0FBQUFIb0FBQUJyQUFBQVNBQUFBSG9BQUFCTkFBQUFTQUFBQUhvQUFBQkhBQUFBU0FBQUFIb0FBQUJVQUFBQVNBQUFBSG9BQUFDOEF3QUFiQUFBQUcwQUFBQnNBQUFBWkFBQUFHd0FBQUJyQUFBQWJBQUFBR1lBQUFCdEFBQUFiZ0FBQUcwQUFBQzhBd0FBYlFBQUFHMEFBQUJ0QUFBQVl3QUFBRzBBQUFCckFBQUFiUUFBQUcwQUFBQnRBQUFBTWdBQUFHTUFBQUJ0QUFBQU1nQUFBRzBBQUFBeUFBQUFhd0FBQUcwQUFBQXlBQUFBYlFBQUFHMEFBQUF6QUFBQVl3QUFBRzBBQUFBekFBQUFiUUFBQURNQUFBQnJBQUFBYlFBQUFETUFBQUJ0QUFBQUZTSUFBSE1BQUFCdEFBQUFGU0lBQUhNQUFBQXlBQUFBVUFBQUFHRUFBQUJyQUFBQVVBQUFBR0VBQUFCTkFBQUFVQUFBQUdFQUFBQkhBQUFBVUFBQUFHRUFBQUJ5QUFBQVlRQUFBR1FBQUFCeUFBQUFZUUFBQUdRQUFBQVZJZ0FBY3dBQUFISUFBQUJoQUFBQVpBQUFBQlVpQUFCekFBQUFNZ0FBQUhBQUFBQnpBQUFBYmdBQUFITUFBQUM4QXdBQWN3QUFBRzBBQUFCekFBQUFjQUFBQUZZQUFBQnVBQUFBVmdBQUFMd0RBQUJXQUFBQWJRQUFBRllBQUFCckFBQUFWZ0FBQUUwQUFBQldBQUFBY0FBQUFGY0FBQUJ1QUFBQVZ3QUFBTHdEQUFCWEFBQUFiUUFBQUZjQUFBQnJBQUFBVndBQUFFMEFBQUJYQUFBQWF3QUFBS2tEQUFCTkFBQUFxUU1BQUdFQUFBQXVBQUFBYlFBQUFDNEFBQUJDQUFBQWNRQUFBR01BQUFCakFBQUFZd0FBQUdRQUFBQkRBQUFBRlNJQUFHc0FBQUJuQUFBQVF3QUFBRzhBQUFBdUFBQUFaQUFBQUVJQUFBQkhBQUFBZVFBQUFHZ0FBQUJoQUFBQVNBQUFBRkFBQUFCcEFBQUFiZ0FBQUVzQUFBQkxBQUFBU3dBQUFFMEFBQUJyQUFBQWRBQUFBR3dBQUFCdEFBQUFiQUFBQUc0QUFBQnNBQUFBYndBQUFHY0FBQUJzQUFBQWVBQUFBRzBBQUFCaUFBQUFiUUFBQUdrQUFBQnNBQUFBYlFBQUFHOEFBQUJzQUFBQVVBQUFBRWdBQUFCd0FBQUFMZ0FBQUcwQUFBQXVBQUFBVUFBQUFGQUFBQUJOQUFBQVVBQUFBRklBQUFCekFBQUFjZ0FBQUZNQUFBQjJBQUFBVndBQUFHSUFBQUJXQUFBQUZTSUFBRzBBQUFCQkFBQUFGU0lBQUcwQUFBQXhBQUFBNVdVQUFESUFBQURsWlFBQU13QUFBT1ZsQUFBMEFBQUE1V1VBQURVQUFBRGxaUUFBTmdBQUFPVmxBQUEzQUFBQTVXVUFBRGdBQUFEbFpRQUFPUUFBQU9WbEFBQXhBQUFBTUFBQUFPVmxBQUF4QUFBQU1RQUFBT1ZsQUFBeEFBQUFNZ0FBQU9WbEFBQXhBQUFBTXdBQUFPVmxBQUF4QUFBQU5BQUFBT1ZsQUFBeEFBQUFOUUFBQU9WbEFBQXhBQUFBTmdBQUFPVmxBQUF4QUFBQU53QUFBT1ZsQUFBeEFBQUFPQUFBQU9WbEFBQXhBQUFBT1FBQUFPVmxBQUF5QUFBQU1BQUFBT1ZsQUFBeUFBQUFNUUFBQU9WbEFBQXlBQUFBTWdBQUFPVmxBQUF5QUFBQU13QUFBT1ZsQUFBeUFBQUFOQUFBQU9WbEFBQXlBQUFBTlFBQUFPVmxBQUF5QUFBQU5nQUFBT1ZsQUFBeUFBQUFOd0FBQU9WbEFBQXlBQUFBT0FBQUFPVmxBQUF5QUFBQU9RQUFBT1ZsQUFBekFBQUFNQUFBQU9WbEFBQXpBQUFBTVFBQUFPVmxBQUJuQUFBQVlRQUFBR3dBQUFCS0JBQUFUQVFBQUcrbkFBQkRBQUFBUmdBQUFGRUFBQUFtQVFBQVV3RUFBQ2VuQUFBM3F3QUFhd0lBQUZLckFBQ05BZ0FBWmdBQUFHWUFBQUJtQUFBQWFRQUFBR1lBQUFCc0FBQUFaZ0FBQUdZQUFBQnBBQUFBWmdBQUFHWUFBQUJzQUFBQWN3QUFBSFFBQUFCekFBQUFkQUFBQUhRRkFBQjJCUUFBZEFVQUFHVUZBQUIwQlFBQWF3VUFBSDRGQUFCMkJRQUFkQVVBQUcwRkFBRGlCUUFBMEFVQUFOTUZBQURVQlFBQTJ3VUFBTndGQUFEZEJRQUE2QVVBQU9vRkFBQXJBQUFBMEFVQUFOd0ZBQUJ4QmdBQWNRWUFBSHNHQUFCN0JnQUFld1lBQUhzR0FBQitCZ0FBZmdZQUFINEdBQUIrQmdBQWdBWUFBSUFHQUFDQUJnQUFnQVlBQUhvR0FBQjZCZ0FBZWdZQUFIb0dBQUIvQmdBQWZ3WUFBSDhHQUFCL0JnQUFlUVlBQUhrR0FBQjVCZ0FBZVFZQUFLUUdBQUNrQmdBQXBBWUFBS1FHQUFDbUJnQUFwZ1lBQUtZR0FBQ21CZ0FBaEFZQUFJUUdBQUNFQmdBQWhBWUFBSU1HQUFDREJnQUFnd1lBQUlNR0FBQ0dCZ0FBaGdZQUFJWUdBQUNHQmdBQWh3WUFBSWNHQUFDSEJnQUFod1lBQUkwR0FBQ05CZ0FBakFZQUFJd0dBQUNPQmdBQWpnWUFBSWdHQUFDSUJnQUFtQVlBQUpnR0FBQ1JCZ0FBa1FZQUFLa0dBQUNwQmdBQXFRWUFBS2tHQUFDdkJnQUFyd1lBQUs4R0FBQ3ZCZ0FBc3dZQUFMTUdBQUN6QmdBQXN3WUFBTEVHQUFDeEJnQUFzUVlBQUxFR0FBQzZCZ0FBdWdZQUFMc0dBQUM3QmdBQXV3WUFBTHNHQUFEVkJnQUFWQVlBQU5VR0FBQlVCZ0FBd1FZQUFNRUdBQURCQmdBQXdRWUFBTDRHQUFDK0JnQUF2Z1lBQUw0R0FBRFNCZ0FBMGdZQUFOSUdBQUJVQmdBQTBnWUFBRlFHQUFDdEJnQUFyUVlBQUswR0FBQ3RCZ0FBeHdZQUFNY0dBQURHQmdBQXhnWUFBTWdHQUFESUJnQUF4d1lBQUhRR0FBRExCZ0FBeXdZQUFNVUdBQURGQmdBQXlRWUFBTWtHQUFEUUJnQUEwQVlBQU5BR0FBRFFCZ0FBU1FZQUFFa0dBQUJLQmdBQVZBWUFBQ2NHQUFCS0JnQUFWQVlBQUNjR0FBQktCZ0FBVkFZQUFOVUdBQUJLQmdBQVZBWUFBTlVHQUFCS0JnQUFWQVlBQUVnR0FBQktCZ0FBVkFZQUFFZ0dBQUJLQmdBQVZBWUFBTWNHQUFCS0JnQUFWQVlBQU1jR0FBQktCZ0FBVkFZQUFNWUdBQUJLQmdBQVZBWUFBTVlHQUFCS0JnQUFWQVlBQU1nR0FBQktCZ0FBVkFZQUFNZ0dBQUJLQmdBQVZBWUFBTkFHQUFCS0JnQUFWQVlBQU5BR0FBQktCZ0FBVkFZQUFOQUdBQUJLQmdBQVZBWUFBRWtHQUFCS0JnQUFWQVlBQUVrR0FBQktCZ0FBVkFZQUFFa0dBQURNQmdBQXpBWUFBTXdHQUFETUJnQUFTZ1lBQUZRR0FBQXNCZ0FBU2dZQUFGUUdBQUF0QmdBQVNnWUFBRlFHQUFCRkJnQUFTZ1lBQUZRR0FBQkpCZ0FBU2dZQUFGUUdBQUJLQmdBQUtBWUFBQ3dHQUFBb0JnQUFMUVlBQUNnR0FBQXVCZ0FBS0FZQUFFVUdBQUFvQmdBQVNRWUFBQ2dHQUFCS0JnQUFLZ1lBQUN3R0FBQXFCZ0FBTFFZQUFDb0dBQUF1QmdBQUtnWUFBRVVHQUFBcUJnQUFTUVlBQUNvR0FBQktCZ0FBS3dZQUFDd0dBQUFyQmdBQVJRWUFBQ3NHQUFCSkJnQUFLd1lBQUVvR0FBQXNCZ0FBTFFZQUFDd0dBQUJGQmdBQUxRWUFBQ3dHQUFBdEJnQUFSUVlBQUM0R0FBQXNCZ0FBTGdZQUFDMEdBQUF1QmdBQVJRWUFBRE1HQUFBc0JnQUFNd1lBQUMwR0FBQXpCZ0FBTGdZQUFETUdBQUJGQmdBQU5RWUFBQzBHQUFBMUJnQUFSUVlBQURZR0FBQXNCZ0FBTmdZQUFDMEdBQUEyQmdBQUxnWUFBRFlHQUFCRkJnQUFOd1lBQUMwR0FBQTNCZ0FBUlFZQUFEZ0dBQUJGQmdBQU9RWUFBQ3dHQUFBNUJnQUFSUVlBQURvR0FBQXNCZ0FBT2dZQUFFVUdBQUJCQmdBQUxBWUFBRUVHQUFBdEJnQUFRUVlBQUM0R0FBQkJCZ0FBUlFZQUFFRUdBQUJKQmdBQVFRWUFBRW9HQUFCQ0JnQUFMUVlBQUVJR0FBQkZCZ0FBUWdZQUFFa0dBQUJDQmdBQVNnWUFBRU1HQUFBbkJnQUFRd1lBQUN3R0FBQkRCZ0FBTFFZQUFFTUdBQUF1QmdBQVF3WUFBRVFHQUFCREJnQUFSUVlBQUVNR0FBQkpCZ0FBUXdZQUFFb0dBQUJFQmdBQUxBWUFBRVFHQUFBdEJnQUFSQVlBQUM0R0FBQkVCZ0FBUlFZQUFFUUdBQUJKQmdBQVJBWUFBRW9HQUFCRkJnQUFMQVlBQUVVR0FBQXRCZ0FBUlFZQUFDNEdBQUJGQmdBQVJRWUFBRVVHQUFCSkJnQUFSUVlBQUVvR0FBQkdCZ0FBTEFZQUFFWUdBQUF0QmdBQVJnWUFBQzRHQUFCR0JnQUFSUVlBQUVZR0FBQkpCZ0FBUmdZQUFFb0dBQUJIQmdBQUxBWUFBRWNHQUFCRkJnQUFSd1lBQUVrR0FBQkhCZ0FBU2dZQUFFb0dBQUFzQmdBQVNnWUFBQzBHQUFCS0JnQUFMZ1lBQUVvR0FBQkZCZ0FBU2dZQUFFa0dBQUJLQmdBQVNnWUFBREFHQUFCd0JnQUFNUVlBQUhBR0FBQkpCZ0FBY0FZQUFDQUFBQUJNQmdBQVVRWUFBQ0FBQUFCTkJnQUFVUVlBQUNBQUFBQk9CZ0FBVVFZQUFDQUFBQUJQQmdBQVVRWUFBQ0FBQUFCUUJnQUFVUVlBQUNBQUFBQlJCZ0FBY0FZQUFFb0dBQUJVQmdBQU1RWUFBRW9HQUFCVUJnQUFNZ1lBQUVvR0FBQlVCZ0FBUlFZQUFFb0dBQUJVQmdBQVJnWUFBRW9HQUFCVUJnQUFTUVlBQUVvR0FBQlVCZ0FBU2dZQUFDZ0dBQUF4QmdBQUtBWUFBRElHQUFBb0JnQUFSUVlBQUNnR0FBQkdCZ0FBS0FZQUFFa0dBQUFvQmdBQVNnWUFBQ29HQUFBeEJnQUFLZ1lBQURJR0FBQXFCZ0FBUlFZQUFDb0dBQUJHQmdBQUtnWUFBRWtHQUFBcUJnQUFTZ1lBQUNzR0FBQXhCZ0FBS3dZQUFESUdBQUFyQmdBQVJRWUFBQ3NHQUFCR0JnQUFLd1lBQUVrR0FBQXJCZ0FBU2dZQUFFRUdBQUJKQmdBQVFRWUFBRW9HQUFCQ0JnQUFTUVlBQUVJR0FBQktCZ0FBUXdZQUFDY0dBQUJEQmdBQVJBWUFBRU1HQUFCRkJnQUFRd1lBQUVrR0FBQkRCZ0FBU2dZQUFFUUdBQUJGQmdBQVJBWUFBRWtHQUFCRUJnQUFTZ1lBQUVVR0FBQW5CZ0FBUlFZQUFFVUdBQUJHQmdBQU1RWUFBRVlHQUFBeUJnQUFSZ1lBQUVVR0FBQkdCZ0FBUmdZQUFFWUdBQUJKQmdBQVJnWUFBRW9HQUFCSkJnQUFjQVlBQUVvR0FBQXhCZ0FBU2dZQUFESUdBQUJLQmdBQVJRWUFBRW9HQUFCR0JnQUFTZ1lBQUVrR0FBQktCZ0FBU2dZQUFFb0dBQUJVQmdBQUxBWUFBRW9HQUFCVUJnQUFMUVlBQUVvR0FBQlVCZ0FBTGdZQUFFb0dBQUJVQmdBQVJRWUFBRW9HQUFCVUJnQUFSd1lBQUNnR0FBQXNCZ0FBS0FZQUFDMEdBQUFvQmdBQUxnWUFBQ2dHQUFCRkJnQUFLQVlBQUVjR0FBQXFCZ0FBTEFZQUFDb0dBQUF0QmdBQUtnWUFBQzRHQUFBcUJnQUFSUVlBQUNvR0FBQkhCZ0FBS3dZQUFFVUdBQUFzQmdBQUxRWUFBQ3dHQUFCRkJnQUFMUVlBQUN3R0FBQXRCZ0FBUlFZQUFDNEdBQUFzQmdBQUxnWUFBRVVHQUFBekJnQUFMQVlBQURNR0FBQXRCZ0FBTXdZQUFDNEdBQUF6QmdBQVJRWUFBRFVHQUFBdEJnQUFOUVlBQUM0R0FBQTFCZ0FBUlFZQUFEWUdBQUFzQmdBQU5nWUFBQzBHQUFBMkJnQUFMZ1lBQURZR0FBQkZCZ0FBTndZQUFDMEdBQUE0QmdBQVJRWUFBRGtHQUFBc0JnQUFPUVlBQUVVR0FBQTZCZ0FBTEFZQUFEb0dBQUJGQmdBQVFRWUFBQ3dHQUFCQkJnQUFMUVlBQUVFR0FBQXVCZ0FBUVFZQUFFVUdBQUJDQmdBQUxRWUFBRUlHQUFCRkJnQUFRd1lBQUN3R0FBQkRCZ0FBTFFZQUFFTUdBQUF1QmdBQVF3WUFBRVFHQUFCREJnQUFSUVlBQUVRR0FBQXNCZ0FBUkFZQUFDMEdBQUJFQmdBQUxnWUFBRVFHQUFCRkJnQUFSQVlBQUVjR0FBQkZCZ0FBTEFZQUFFVUdBQUF0QmdBQVJRWUFBQzRHQUFCRkJnQUFSUVlBQUVZR0FBQXNCZ0FBUmdZQUFDMEdBQUJHQmdBQUxnWUFBRVlHQUFCRkJnQUFSZ1lBQUVjR0FBQkhCZ0FBTEFZQUFFY0dBQUJGQmdBQVJ3WUFBSEFHQUFCS0JnQUFMQVlBQUVvR0FBQXRCZ0FBU2dZQUFDNEdBQUJLQmdBQVJRWUFBRW9HQUFCSEJnQUFTZ1lBQUZRR0FBQkZCZ0FBU2dZQUFGUUdBQUJIQmdBQUtBWUFBRVVHQUFBb0JnQUFSd1lBQUNvR0FBQkZCZ0FBS2dZQUFFY0dBQUFyQmdBQVJRWUFBQ3NHQUFCSEJnQUFNd1lBQUVVR0FBQXpCZ0FBUndZQUFEUUdBQUJGQmdBQU5BWUFBRWNHQUFCREJnQUFSQVlBQUVNR0FBQkZCZ0FBUkFZQUFFVUdBQUJHQmdBQVJRWUFBRVlHQUFCSEJnQUFTZ1lBQUVVR0FBQktCZ0FBUndZQUFFQUdBQUJPQmdBQVVRWUFBRUFHQUFCUEJnQUFVUVlBQUVBR0FBQlFCZ0FBVVFZQUFEY0dBQUJKQmdBQU53WUFBRW9HQUFBNUJnQUFTUVlBQURrR0FBQktCZ0FBT2dZQUFFa0dBQUE2QmdBQVNnWUFBRE1HQUFCSkJnQUFNd1lBQUVvR0FBQTBCZ0FBU1FZQUFEUUdBQUJLQmdBQUxRWUFBRWtHQUFBdEJnQUFTZ1lBQUN3R0FBQkpCZ0FBTEFZQUFFb0dBQUF1QmdBQVNRWUFBQzRHQUFCS0JnQUFOUVlBQUVrR0FBQTFCZ0FBU2dZQUFEWUdBQUJKQmdBQU5nWUFBRW9HQUFBMEJnQUFMQVlBQURRR0FBQXRCZ0FBTkFZQUFDNEdBQUEwQmdBQVJRWUFBRFFHQUFBeEJnQUFNd1lBQURFR0FBQTFCZ0FBTVFZQUFEWUdBQUF4QmdBQU53WUFBRWtHQUFBM0JnQUFTZ1lBQURrR0FBQkpCZ0FBT1FZQUFFb0dBQUE2QmdBQVNRWUFBRG9HQUFCS0JnQUFNd1lBQUVrR0FBQXpCZ0FBU2dZQUFEUUdBQUJKQmdBQU5BWUFBRW9HQUFBdEJnQUFTUVlBQUMwR0FBQktCZ0FBTEFZQUFFa0dBQUFzQmdBQVNnWUFBQzRHQUFCSkJnQUFMZ1lBQUVvR0FBQTFCZ0FBU1FZQUFEVUdBQUJLQmdBQU5nWUFBRWtHQUFBMkJnQUFTZ1lBQURRR0FBQXNCZ0FBTkFZQUFDMEdBQUEwQmdBQUxnWUFBRFFHQUFCRkJnQUFOQVlBQURFR0FBQXpCZ0FBTVFZQUFEVUdBQUF4QmdBQU5nWUFBREVHQUFBMEJnQUFMQVlBQURRR0FBQXRCZ0FBTkFZQUFDNEdBQUEwQmdBQVJRWUFBRE1HQUFCSEJnQUFOQVlBQUVjR0FBQTNCZ0FBUlFZQUFETUdBQUFzQmdBQU13WUFBQzBHQUFBekJnQUFMZ1lBQURRR0FBQXNCZ0FBTkFZQUFDMEdBQUEwQmdBQUxnWUFBRGNHQUFCRkJnQUFPQVlBQUVVR0FBQW5CZ0FBU3dZQUFDY0dBQUJMQmdBQUtnWUFBQ3dHQUFCRkJnQUFLZ1lBQUMwR0FBQXNCZ0FBS2dZQUFDMEdBQUFzQmdBQUtnWUFBQzBHQUFCRkJnQUFLZ1lBQUM0R0FBQkZCZ0FBS2dZQUFFVUdBQUFzQmdBQUtnWUFBRVVHQUFBdEJnQUFLZ1lBQUVVR0FBQXVCZ0FBTEFZQUFFVUdBQUF0QmdBQUxBWUFBRVVHQUFBdEJnQUFMUVlBQUVVR0FBQktCZ0FBTFFZQUFFVUdBQUJKQmdBQU13WUFBQzBHQUFBc0JnQUFNd1lBQUN3R0FBQXRCZ0FBTXdZQUFDd0dBQUJKQmdBQU13WUFBRVVHQUFBdEJnQUFNd1lBQUVVR0FBQXRCZ0FBTXdZQUFFVUdBQUFzQmdBQU13WUFBRVVHQUFCRkJnQUFNd1lBQUVVR0FBQkZCZ0FBTlFZQUFDMEdBQUF0QmdBQU5RWUFBQzBHQUFBdEJnQUFOUVlBQUVVR0FBQkZCZ0FBTkFZQUFDMEdBQUJGQmdBQU5BWUFBQzBHQUFCRkJnQUFOQVlBQUN3R0FBQktCZ0FBTkFZQUFFVUdBQUF1QmdBQU5BWUFBRVVHQUFBdUJnQUFOQVlBQUVVR0FBQkZCZ0FBTkFZQUFFVUdBQUJGQmdBQU5nWUFBQzBHQUFCSkJnQUFOZ1lBQUM0R0FBQkZCZ0FBTmdZQUFDNEdBQUJGQmdBQU53WUFBRVVHQUFBdEJnQUFOd1lBQUVVR0FBQXRCZ0FBTndZQUFFVUdBQUJGQmdBQU53WUFBRVVHQUFCS0JnQUFPUVlBQUN3R0FBQkZCZ0FBT1FZQUFFVUdBQUJGQmdBQU9RWUFBRVVHQUFCRkJnQUFPUVlBQUVVR0FBQkpCZ0FBT2dZQUFFVUdBQUJGQmdBQU9nWUFBRVVHQUFCS0JnQUFPZ1lBQUVVR0FBQkpCZ0FBUVFZQUFDNEdBQUJGQmdBQVFRWUFBQzRHQUFCRkJnQUFRZ1lBQUVVR0FBQXRCZ0FBUWdZQUFFVUdBQUJGQmdBQVJBWUFBQzBHQUFCRkJnQUFSQVlBQUMwR0FBQktCZ0FBUkFZQUFDMEdBQUJKQmdBQVJBWUFBQ3dHQUFBc0JnQUFSQVlBQUN3R0FBQXNCZ0FBUkFZQUFDNEdBQUJGQmdBQVJBWUFBQzRHQUFCRkJnQUFSQVlBQUVVR0FBQXRCZ0FBUkFZQUFFVUdBQUF0QmdBQVJRWUFBQzBHQUFBc0JnQUFSUVlBQUMwR0FBQkZCZ0FBUlFZQUFDMEdBQUJLQmdBQVJRWUFBQ3dHQUFBdEJnQUFSUVlBQUN3R0FBQkZCZ0FBUlFZQUFDNEdBQUFzQmdBQVJRWUFBQzRHQUFCRkJnQUFSUVlBQUN3R0FBQXVCZ0FBUndZQUFFVUdBQUFzQmdBQVJ3WUFBRVVHQUFCRkJnQUFSZ1lBQUMwR0FBQkZCZ0FBUmdZQUFDMEdBQUJKQmdBQVJnWUFBQ3dHQUFCRkJnQUFSZ1lBQUN3R0FBQkZCZ0FBUmdZQUFDd0dBQUJKQmdBQVJnWUFBRVVHQUFCS0JnQUFSZ1lBQUVVR0FBQkpCZ0FBU2dZQUFFVUdBQUJGQmdBQVNnWUFBRVVHQUFCRkJnQUFLQVlBQUM0R0FBQktCZ0FBS2dZQUFDd0dBQUJLQmdBQUtnWUFBQ3dHQUFCSkJnQUFLZ1lBQUM0R0FBQktCZ0FBS2dZQUFDNEdBQUJKQmdBQUtnWUFBRVVHQUFCS0JnQUFLZ1lBQUVVR0FBQkpCZ0FBTEFZQUFFVUdBQUJLQmdBQUxBWUFBQzBHQUFCSkJnQUFMQVlBQUVVR0FBQkpCZ0FBTXdZQUFDNEdBQUJKQmdBQU5RWUFBQzBHQUFCS0JnQUFOQVlBQUMwR0FBQktCZ0FBTmdZQUFDMEdBQUJLQmdBQVJBWUFBQ3dHQUFCS0JnQUFSQVlBQUVVR0FBQktCZ0FBU2dZQUFDMEdBQUJLQmdBQVNnWUFBQ3dHQUFCS0JnQUFTZ1lBQUVVR0FBQktCZ0FBUlFZQUFFVUdBQUJLQmdBQVFnWUFBRVVHQUFCS0JnQUFSZ1lBQUMwR0FBQktCZ0FBUWdZQUFFVUdBQUF0QmdBQVJBWUFBQzBHQUFCRkJnQUFPUVlBQUVVR0FBQktCZ0FBUXdZQUFFVUdBQUJLQmdBQVJnWUFBQ3dHQUFBdEJnQUFSUVlBQUM0R0FBQktCZ0FBUkFZQUFDd0dBQUJGQmdBQVF3WUFBRVVHQUFCRkJnQUFSQVlBQUN3R0FBQkZCZ0FBUmdZQUFDd0dBQUF0QmdBQUxBWUFBQzBHQUFCS0JnQUFMUVlBQUN3R0FBQktCZ0FBUlFZQUFDd0dBQUJLQmdBQVFRWUFBRVVHQUFCS0JnQUFLQVlBQUMwR0FBQktCZ0FBUXdZQUFFVUdBQUJGQmdBQU9RWUFBQ3dHQUFCRkJnQUFOUVlBQUVVR0FBQkZCZ0FBTXdZQUFDNEdBQUJLQmdBQVJnWUFBQ3dHQUFCS0JnQUFOUVlBQUVRR0FBRFNCZ0FBUWdZQUFFUUdBQURTQmdBQUp3WUFBRVFHQUFCRUJnQUFSd1lBQUNjR0FBQkRCZ0FBS0FZQUFERUdBQUJGQmdBQUxRWUFBRVVHQUFBdkJnQUFOUVlBQUVRR0FBQTVCZ0FBUlFZQUFERUdBQUF6QmdBQVNBWUFBRVFHQUFBNUJnQUFSQVlBQUVvR0FBQkhCZ0FBU0FZQUFETUdBQUJFQmdBQVJRWUFBRFVHQUFCRUJnQUFTUVlBQURVR0FBQkVCZ0FBU1FZQUFDQUFBQUFuQmdBQVJBWUFBRVFHQUFCSEJnQUFJQUFBQURrR0FBQkVCZ0FBU2dZQUFFY0dBQUFnQUFBQVNBWUFBRE1HQUFCRUJnQUFSUVlBQUN3R0FBQkVCZ0FBSUFBQUFDd0dBQUJFQmdBQUp3WUFBRVFHQUFCSEJnQUFNUVlBQU13R0FBQW5CZ0FBUkFZQUFDd0FBQUFCTUFBQUFqQUFBRG9BQUFBN0FBQUFJUUFBQUQ4QUFBQVdNQUFBRnpBQUFDNEFBQUF1QUFBQUxnQUFBQzRBQUFBdUFBQUFGQ0FBQUJNZ0FBQmZBQUFBWHdBQUFDZ0FBQUFwQUFBQWV3QUFBSDBBQUFBVU1BQUFGVEFBQUJBd0FBQVJNQUFBQ2pBQUFBc3dBQUFJTUFBQUNUQUFBQXd3QUFBTk1BQUFEakFBQUE4d0FBQmJBQUFBWFFBQUFDQUFBQUFGQXdBQUlBQUFBQVVEQUFBZ0FBQUFCUU1BQUNBQUFBQUZBd0FBWHdBQUFGOEFBQUJmQUFBQUxBQUFBQUV3QUFBdUFBQUFPd0FBQURvQUFBQS9BQUFBSVFBQUFCUWdBQUFvQUFBQUtRQUFBSHNBQUFCOUFBQUFGREFBQUJVd0FBQWpBQUFBSmdBQUFDb0FBQUFyQUFBQUxRQUFBRHdBQUFBK0FBQUFQUUFBQUZ3QUFBQWtBQUFBSlFBQUFFQUFBQUFnQUFBQVN3WUFBRUFHQUFCTEJnQUFJQUFBQUV3R0FBQWdBQUFBVFFZQUFDQUFBQUJPQmdBQVFBWUFBRTRHQUFBZ0FBQUFUd1lBQUVBR0FBQlBCZ0FBSUFBQUFGQUdBQUJBQmdBQVVBWUFBQ0FBQUFCUkJnQUFRQVlBQUZFR0FBQWdBQUFBVWdZQUFFQUdBQUJTQmdBQUlRWUFBQ2NHQUFCVEJnQUFKd1lBQUZNR0FBQW5CZ0FBVkFZQUFDY0dBQUJVQmdBQVNBWUFBRlFHQUFCSUJnQUFWQVlBQUNjR0FBQlZCZ0FBSndZQUFGVUdBQUJLQmdBQVZBWUFBRW9HQUFCVUJnQUFTZ1lBQUZRR0FBQktCZ0FBVkFZQUFDY0dBQUFuQmdBQUtBWUFBQ2dHQUFBb0JnQUFLQVlBQUNrR0FBQXBCZ0FBS2dZQUFDb0dBQUFxQmdBQUtnWUFBQ3NHQUFBckJnQUFLd1lBQUNzR0FBQXNCZ0FBTEFZQUFDd0dBQUFzQmdBQUxRWUFBQzBHQUFBdEJnQUFMUVlBQUM0R0FBQXVCZ0FBTGdZQUFDNEdBQUF2QmdBQUx3WUFBREFHQUFBd0JnQUFNUVlBQURFR0FBQXlCZ0FBTWdZQUFETUdBQUF6QmdBQU13WUFBRE1HQUFBMEJnQUFOQVlBQURRR0FBQTBCZ0FBTlFZQUFEVUdBQUExQmdBQU5RWUFBRFlHQUFBMkJnQUFOZ1lBQURZR0FBQTNCZ0FBTndZQUFEY0dBQUEzQmdBQU9BWUFBRGdHQUFBNEJnQUFPQVlBQURrR0FBQTVCZ0FBT1FZQUFEa0dBQUE2QmdBQU9nWUFBRG9HQUFBNkJnQUFRUVlBQUVFR0FBQkJCZ0FBUVFZQUFFSUdBQUJDQmdBQVFnWUFBRUlHQUFCREJnQUFRd1lBQUVNR0FBQkRCZ0FBUkFZQUFFUUdBQUJFQmdBQVJBWUFBRVVHQUFCRkJnQUFSUVlBQUVVR0FBQkdCZ0FBUmdZQUFFWUdBQUJHQmdBQVJ3WUFBRWNHQUFCSEJnQUFSd1lBQUVnR0FBQklCZ0FBU1FZQUFFa0dBQUJLQmdBQVNnWUFBRW9HQUFCS0JnQUFSQVlBQUNjR0FBQlRCZ0FBUkFZQUFDY0dBQUJUQmdBQVJBWUFBQ2NHQUFCVUJnQUFSQVlBQUNjR0FBQlVCZ0FBUkFZQUFDY0dBQUJWQmdBQVJBWUFBQ2NHQUFCVkJnQUFSQVlBQUNjR0FBQkVCZ0FBSndZQUFDRUFBQUFpQUFBQUl3QUFBQ1FBQUFBbEFBQUFKZ0FBQUNjQUFBQW9BQUFBS1FBQUFDb0FBQUFyQUFBQUxBQUFBQzBBQUFBdUFBQUFMd0FBQURBQUFBQXhBQUFBTWdBQUFETUFBQUEwQUFBQU5RQUFBRFlBQUFBM0FBQUFPQUFBQURrQUFBQTZBQUFBT3dBQUFEd0FBQUE5QUFBQVBnQUFBRDhBQUFCQUFBQUFRUUFBQUVJQUFBQkRBQUFBUkFBQUFFVUFBQUJHQUFBQVJ3QUFBRWdBQUFCSkFBQUFTZ0FBQUVzQUFBQk1BQUFBVFFBQUFFNEFBQUJQQUFBQVVBQUFBRkVBQUFCU0FBQUFVd0FBQUZRQUFBQlZBQUFBVmdBQUFGY0FBQUJZQUFBQVdRQUFBRm9BQUFCYkFBQUFYQUFBQUYwQUFBQmVBQUFBWHdBQUFHQUFBQUJoQUFBQVlnQUFBR01BQUFCa0FBQUFaUUFBQUdZQUFBQm5BQUFBYUFBQUFHa0FBQUJxQUFBQWF3QUFBR3dBQUFCdEFBQUFiZ0FBQUc4QUFBQndBQUFBY1FBQUFISUFBQUJ6QUFBQWRBQUFBSFVBQUFCMkFBQUFkd0FBQUhnQUFBQjVBQUFBZWdBQUFIc0FBQUI4QUFBQWZRQUFBSDRBQUFDRktRQUFoaWtBQUFJd0FBQU1NQUFBRFRBQUFBRXdBQUQ3TUFBQThqQUFBS0V3QUFDak1BQUFwVEFBQUtjd0FBQ3BNQUFBNHpBQUFPVXdBQURuTUFBQXd6QUFBUHd3QUFDaU1BQUFwREFBQUtZd0FBQ29NQUFBcWpBQUFLc3dBQUN0TUFBQXJ6QUFBTEV3QUFDek1BQUF0VEFBQUxjd0FBQzVNQUFBdXpBQUFMMHdBQUMvTUFBQXdUQUFBTVF3QUFER01BQUF5REFBQU1vd0FBRExNQUFBekRBQUFNMHdBQURPTUFBQXp6QUFBTkl3QUFEVk1BQUEyREFBQU5zd0FBRGVNQUFBM3pBQUFPQXdBQURoTUFBQTRqQUFBT1F3QUFEbU1BQUE2REFBQU9rd0FBRHFNQUFBNnpBQUFPd3dBQUR0TUFBQTd6QUFBUE13QUFDWk1BQUFtakFBQUdBUkFBQUFFUUFBQVJFQUFLb1JBQUFDRVFBQXJCRUFBSzBSQUFBREVRQUFCQkVBQUFVUkFBQ3dFUUFBc1JFQUFMSVJBQUN6RVFBQXRCRUFBTFVSQUFBYUVRQUFCaEVBQUFjUkFBQUlFUUFBSVJFQUFBa1JBQUFLRVFBQUN4RUFBQXdSQUFBTkVRQUFEaEVBQUE4UkFBQVFFUUFBRVJFQUFCSVJBQUJoRVFBQVloRUFBR01SQUFCa0VRQUFaUkVBQUdZUkFBQm5FUUFBYUJFQUFHa1JBQUJxRVFBQWF4RUFBR3dSQUFCdEVRQUFiaEVBQUc4UkFBQndFUUFBY1JFQUFISVJBQUJ6RVFBQWRCRUFBSFVSQUFDaUFBQUFvd0FBQUt3QUFBQWdBQUFBQkFNQUFLWUFBQUNsQUFBQXFTQUFBQUlsQUFDUUlRQUFrU0VBQUpJaEFBQ1RJUUFBb0NVQUFNc2xBQURRQWdBQTBRSUFBT1lBQUFDWkFnQUFVd0lBQUtNQ0FBQm1xd0FBcFFJQUFLUUNBQUJXQWdBQVZ3SUFBSkVkQUFCWUFnQUFYZ0lBQUtrQ0FBQmtBZ0FBWWdJQUFHQUNBQUNiQWdBQUp3RUFBSndDQUFCbkFnQUFoQUlBQUtvQ0FBQ3JBZ0FBYkFJQUFBVGZBUUNPcHdBQWJnSUFBQVhmQVFDT0FnQUFCdDhCQVBnQUFBQjJBZ0FBZHdJQUFIRUFBQUI2QWdBQUNOOEJBSDBDQUFCK0FnQUFnQUlBQUtnQ0FBQ21BZ0FBWjZzQUFLY0NBQUNJQWdBQWNTd0FBSThDQUFDaEFnQUFvZ0lBQUpnQ0FBREFBUUFBd1FFQUFNSUJBQUFLM3dFQUh0OEJBRUVBQUFCQ0FBQUFRd0FBQUVRQUFBQkZBQUFBUmdBQUFFY0FBQUJJQUFBQVNRQUFBRW9BQUFCTEFBQUFUQUFBQUUwQUFBQk9BQUFBVHdBQUFGQUFBQUJSQUFBQVVnQUFBRk1BQUFCVUFBQUFWUUFBQUZZQUFBQlhBQUFBV0FBQUFGa0FBQUJhQUFBQU1BQUFBREVBQUFBeUFBQUFNd0FBQURRQUFBQTFBQUFBTmdBQUFEY0FBQUE0QUFBQU9RQUFBRUVBQUFCQ0FBQUFRd0FBQUVRQUFBQkZBQUFBUmdBQUFFY0FBQUJJQUFBQVNRQUFBRW9BQUFCTEFBQUFUQUFBQUUwQUFBQk9BQUFBVHdBQUFGQUFBQUJSQUFBQVVnQUFBRk1BQUFCVUFBQUFWUUFBQUZZQUFBQlhBQUFBV0FBQUFGa0FBQUJhQUFBQVlRQUFBR0lBQUFCakFBQUFaQUFBQUdVQUFBQm1BQUFBWndBQUFHZ0FBQUJwQUFBQWFnQUFBR3NBQUFCc0FBQUFiUUFBQUc0QUFBQnZBQUFBY0FBQUFIRUFBQUJ5QUFBQWN3QUFBSFFBQUFCMUFBQUFkZ0FBQUhjQUFBQjRBQUFBZVFBQUFIb0FBQUJCQUFBQVFnQUFBRU1BQUFCRUFBQUFSUUFBQUVZQUFBQkhBQUFBU0FBQUFFa0FBQUJLQUFBQVN3QUFBRXdBQUFCTkFBQUFUZ0FBQUU4QUFBQlFBQUFBVVFBQUFGSUFBQUJUQUFBQVZBQUFBRlVBQUFCV0FBQUFWd0FBQUZnQUFBQlpBQUFBV2dBQUFHRUFBQUJpQUFBQVl3QUFBR1FBQUFCbEFBQUFaZ0FBQUdjQUFBQnBBQUFBYWdBQUFHc0FBQUJzQUFBQWJRQUFBRzRBQUFCdkFBQUFjQUFBQUhFQUFBQnlBQUFBY3dBQUFIUUFBQUIxQUFBQWRnQUFBSGNBQUFCNEFBQUFlUUFBQUhvQUFBQkJBQUFBUWdBQUFFTUFBQUJFQUFBQVJRQUFBRVlBQUFCSEFBQUFTQUFBQUVrQUFBQktBQUFBU3dBQUFFd0FBQUJOQUFBQVRnQUFBRThBQUFCUUFBQUFVUUFBQUZJQUFBQlRBQUFBVkFBQUFGVUFBQUJXQUFBQVZ3QUFBRmdBQUFCWkFBQUFXZ0FBQUdFQUFBQmlBQUFBWXdBQUFHUUFBQUJsQUFBQVpnQUFBR2NBQUFCb0FBQUFhUUFBQUdvQUFBQnJBQUFBYkFBQUFHMEFBQUJ1QUFBQWJ3QUFBSEFBQUFCeEFBQUFjZ0FBQUhNQUFBQjBBQUFBZFFBQUFIWUFBQUIzQUFBQWVBQUFBSGtBQUFCNkFBQUFRUUFBQUVNQUFBQkVBQUFBUndBQUFFb0FBQUJMQUFBQVRnQUFBRThBQUFCUUFBQUFVUUFBQUZNQUFBQlVBQUFBVlFBQUFGWUFBQUJYQUFBQVdBQUFBRmtBQUFCYUFBQUFZUUFBQUdJQUFBQmpBQUFBWkFBQUFHWUFBQUJvQUFBQWFRQUFBR29BQUFCckFBQUFiQUFBQUcwQUFBQnVBQUFBY0FBQUFIRUFBQUJ5QUFBQWN3QUFBSFFBQUFCMUFBQUFkZ0FBQUhjQUFBQjRBQUFBZVFBQUFIb0FBQUJCQUFBQVFnQUFBRU1BQUFCRUFBQUFSUUFBQUVZQUFBQkhBQUFBU0FBQUFFa0FBQUJLQUFBQVN3QUFBRXdBQUFCTkFBQUFUZ0FBQUU4QUFBQlFBQUFBVVFBQUFGSUFBQUJUQUFBQVZBQUFBRlVBQUFCV0FBQUFWd0FBQUZnQUFBQlpBQUFBV2dBQUFHRUFBQUJpQUFBQVl3QUFBR1FBQUFCbEFBQUFaZ0FBQUdjQUFBQm9BQUFBYVFBQUFHb0FBQUJyQUFBQWJBQUFBRzBBQUFCdUFBQUFid0FBQUhBQUFBQnhBQUFBY2dBQUFITUFBQUIwQUFBQWRRQUFBSFlBQUFCM0FBQUFlQUFBQUhrQUFBQjZBQUFBUVFBQUFFSUFBQUJFQUFBQVJRQUFBRVlBQUFCSEFBQUFTZ0FBQUVzQUFBQk1BQUFBVFFBQUFFNEFBQUJQQUFBQVVBQUFBRkVBQUFCVEFBQUFWQUFBQUZVQUFBQldBQUFBVndBQUFGZ0FBQUJaQUFBQVlRQUFBR0lBQUFCakFBQUFaQUFBQUdVQUFBQm1BQUFBWndBQUFHZ0FBQUJwQUFBQWFnQUFBR3NBQUFCc0FBQUFiUUFBQUc0QUFBQnZBQUFBY0FBQUFIRUFBQUJ5QUFBQWN3QUFBSFFBQUFCMUFBQUFkZ0FBQUhjQUFBQjRBQUFBZVFBQUFIb0FBQUJCQUFBQVFnQUFBRVFBQUFCRkFBQUFSZ0FBQUVjQUFBQkpBQUFBU2dBQUFFc0FBQUJNQUFBQVRRQUFBRThBQUFCVEFBQUFWQUFBQUZVQUFBQldBQUFBVndBQUFGZ0FBQUJaQUFBQVlRQUFBR0lBQUFCakFBQUFaQUFBQUdVQUFBQm1BQUFBWndBQUFHZ0FBQUJwQUFBQWFnQUFBR3NBQUFCc0FBQUFiUUFBQUc0QUFBQnZBQUFBY0FBQUFIRUFBQUJ5QUFBQWN3QUFBSFFBQUFCMUFBQUFkZ0FBQUhjQUFBQjRBQUFBZVFBQUFIb0FBQUJCQUFBQVFnQUFBRU1BQUFCRUFBQUFSUUFBQUVZQUFBQkhBQUFBU0FBQUFFa0FBQUJLQUFBQVN3QUFBRXdBQUFCTkFBQUFUZ0FBQUU4QUFBQlFBQUFBVVFBQUFGSUFBQUJUQUFBQVZBQUFBRlVBQUFCV0FBQUFWd0FBQUZnQUFBQlpBQUFBV2dBQUFHRUFBQUJpQUFBQVl3QUFBR1FBQUFCbEFBQUFaZ0FBQUdjQUFBQm9BQUFBYVFBQUFHb0FBQUJyQUFBQWJBQUFBRzBBQUFCdUFBQUFid0FBQUhBQUFBQnhBQUFBY2dBQUFITUFBQUIwQUFBQWRRQUFBSFlBQUFCM0FBQUFlQUFBQUhrQUFBQjZBQUFBUVFBQUFFSUFBQUJEQUFBQVJBQUFBRVVBQUFCR0FBQUFSd0FBQUVnQUFBQkpBQUFBU2dBQUFFc0FBQUJNQUFBQVRRQUFBRTRBQUFCUEFBQUFVQUFBQUZFQUFBQlNBQUFBVXdBQUFGUUFBQUJWQUFBQVZnQUFBRmNBQUFCWUFBQUFXUUFBQUZvQUFBQmhBQUFBWWdBQUFHTUFBQUJrQUFBQVpRQUFBR1lBQUFCbkFBQUFhQUFBQUdrQUFBQnFBQUFBYXdBQUFHd0FBQUJ0QUFBQWJnQUFBRzhBQUFCd0FBQUFjUUFBQUhJQUFBQnpBQUFBZEFBQUFIVUFBQUIyQUFBQWR3QUFBSGdBQUFCNUFBQUFlZ0FBQUVFQUFBQkNBQUFBUXdBQUFFUUFBQUJGQUFBQVJnQUFBRWNBQUFCSUFBQUFTUUFBQUVvQUFBQkxBQUFBVEFBQUFFMEFBQUJPQUFBQVR3QUFBRkFBQUFCUkFBQUFVZ0FBQUZNQUFBQlVBQUFBVlFBQUFGWUFBQUJYQUFBQVdBQUFBRmtBQUFCYUFBQUFZUUFBQUdJQUFBQmpBQUFBWkFBQUFHVUFBQUJtQUFBQVp3QUFBR2dBQUFCcEFBQUFhZ0FBQUdzQUFBQnNBQUFBYlFBQUFHNEFBQUJ2QUFBQWNBQUFBSEVBQUFCeUFBQUFjd0FBQUhRQUFBQjFBQUFBZGdBQUFIY0FBQUI0QUFBQWVRQUFBSG9BQUFCQkFBQUFRZ0FBQUVNQUFBQkVBQUFBUlFBQUFFWUFBQUJIQUFBQVNBQUFBRWtBQUFCS0FBQUFTd0FBQUV3QUFBQk5BQUFBVGdBQUFFOEFBQUJRQUFBQVVRQUFBRklBQUFCVEFBQUFWQUFBQUZVQUFBQldBQUFBVndBQUFGZ0FBQUJaQUFBQVdnQUFBR0VBQUFCaUFBQUFZd0FBQUdRQUFBQmxBQUFBWmdBQUFHY0FBQUJvQUFBQWFRQUFBR29BQUFCckFBQUFiQUFBQUcwQUFBQnVBQUFBYndBQUFIQUFBQUJ4QUFBQWNnQUFBSE1BQUFCMEFBQUFkUUFBQUhZQUFBQjNBQUFBZUFBQUFIa0FBQUI2QUFBQVFRQUFBRUlBQUFCREFBQUFSQUFBQUVVQUFBQkdBQUFBUndBQUFFZ0FBQUJKQUFBQVNnQUFBRXNBQUFCTUFBQUFUUUFBQUU0QUFBQlBBQUFBVUFBQUFGRUFBQUJTQUFBQVV3QUFBRlFBQUFCVkFBQUFWZ0FBQUZjQUFBQllBQUFBV1FBQUFGb0FBQUJoQUFBQVlnQUFBR01BQUFCa0FBQUFaUUFBQUdZQUFBQm5BQUFBYUFBQUFHa0FBQUJxQUFBQWF3QUFBR3dBQUFCdEFBQUFiZ0FBQUc4QUFBQndBQUFBY1FBQUFISUFBQUJ6QUFBQWRBQUFBSFVBQUFCMkFBQUFkd0FBQUhnQUFBQjVBQUFBZWdBQUFFRUFBQUJDQUFBQVF3QUFBRVFBQUFCRkFBQUFSZ0FBQUVjQUFBQklBQUFBU1FBQUFFb0FBQUJMQUFBQVRBQUFBRTBBQUFCT0FBQUFUd0FBQUZBQUFBQlJBQUFBVWdBQUFGTUFBQUJVQUFBQVZRQUFBRllBQUFCWEFBQUFXQUFBQUZrQUFBQmFBQUFBWVFBQUFHSUFBQUJqQUFBQVpBQUFBR1VBQUFCbUFBQUFad0FBQUdnQUFBQnBBQUFBYWdBQUFHc0FBQUJzQUFBQWJRQUFBRzRBQUFCdkFBQUFjQUFBQUhFQUFBQnlBQUFBY3dBQUFIUUFBQUIxQUFBQWRnQUFBSGNBQUFCNEFBQUFlUUFBQUhvQUFBQXhBUUFBTndJQUFKRURBQUNTQXdBQWt3TUFBSlFEQUFDVkF3QUFsZ01BQUpjREFBQ1lBd0FBbVFNQUFKb0RBQUNiQXdBQW5BTUFBSjBEQUFDZUF3QUFud01BQUtBREFBQ2hBd0FBbUFNQUFLTURBQUNrQXdBQXBRTUFBS1lEQUFDbkF3QUFxQU1BQUtrREFBQUhJZ0FBc1FNQUFMSURBQUN6QXdBQXRBTUFBTFVEQUFDMkF3QUF0d01BQUxnREFBQzVBd0FBdWdNQUFMc0RBQUM4QXdBQXZRTUFBTDREQUFDL0F3QUF3QU1BQU1FREFBRENBd0FBd3dNQUFNUURBQURGQXdBQXhnTUFBTWNEQUFESUF3QUF5UU1BQUFJaUFBQzFBd0FBdUFNQUFMb0RBQURHQXdBQXdRTUFBTUFEQUFDUkF3QUFrZ01BQUpNREFBQ1VBd0FBbFFNQUFKWURBQUNYQXdBQW1BTUFBSmtEQUFDYUF3QUFtd01BQUp3REFBQ2RBd0FBbmdNQUFKOERBQUNnQXdBQW9RTUFBSmdEQUFDakF3QUFwQU1BQUtVREFBQ21Bd0FBcHdNQUFLZ0RBQUNwQXdBQUJ5SUFBTEVEQUFDeUF3QUFzd01BQUxRREFBQzFBd0FBdGdNQUFMY0RBQUM0QXdBQXVRTUFBTG9EQUFDN0F3QUF2QU1BQUwwREFBQytBd0FBdndNQUFNQURBQURCQXdBQXdnTUFBTU1EQUFERUF3QUF4UU1BQU1ZREFBREhBd0FBeUFNQUFNa0RBQUFDSWdBQXRRTUFBTGdEQUFDNkF3QUF4Z01BQU1FREFBREFBd0FBa1FNQUFKSURBQUNUQXdBQWxBTUFBSlVEQUFDV0F3QUFsd01BQUpnREFBQ1pBd0FBbWdNQUFKc0RBQUNjQXdBQW5RTUFBSjREQUFDZkF3QUFvQU1BQUtFREFBQ1lBd0FBb3dNQUFLUURBQUNsQXdBQXBnTUFBS2NEQUFDb0F3QUFxUU1BQUFjaUFBQ3hBd0FBc2dNQUFMTURBQUMwQXdBQXRRTUFBTFlEQUFDM0F3QUF1QU1BQUxrREFBQzZBd0FBdXdNQUFMd0RBQUM5QXdBQXZnTUFBTDhEQUFEQUF3QUF3UU1BQU1JREFBRERBd0FBeEFNQUFNVURBQURHQXdBQXh3TUFBTWdEQUFESkF3QUFBaUlBQUxVREFBQzRBd0FBdWdNQUFNWURBQURCQXdBQXdBTUFBSkVEQUFDU0F3QUFrd01BQUpRREFBQ1ZBd0FBbGdNQUFKY0RBQUNZQXdBQW1RTUFBSm9EQUFDYkF3QUFuQU1BQUowREFBQ2VBd0FBbndNQUFLQURBQUNoQXdBQW1BTUFBS01EQUFDa0F3QUFwUU1BQUtZREFBQ25Bd0FBcUFNQUFLa0RBQUFISWdBQXNRTUFBTElEQUFDekF3QUF0QU1BQUxVREFBQzJBd0FBdHdNQUFMZ0RBQUM1QXdBQXVnTUFBTHNEQUFDOEF3QUF2UU1BQUw0REFBQy9Bd0FBd0FNQUFNRURBQURDQXdBQXd3TUFBTVFEQUFERkF3QUF4Z01BQU1jREFBRElBd0FBeVFNQUFBSWlBQUMxQXdBQXVBTUFBTG9EQUFER0F3QUF3UU1BQU1BREFBQ1JBd0FBa2dNQUFKTURBQUNVQXdBQWxRTUFBSllEQUFDWEF3QUFtQU1BQUprREFBQ2FBd0FBbXdNQUFKd0RBQUNkQXdBQW5nTUFBSjhEQUFDZ0F3QUFvUU1BQUpnREFBQ2pBd0FBcEFNQUFLVURBQUNtQXdBQXB3TUFBS2dEQUFDcEF3QUFCeUlBQUxFREFBQ3lBd0FBc3dNQUFMUURBQUMxQXdBQXRnTUFBTGNEQUFDNEF3QUF1UU1BQUxvREFBQzdBd0FBdkFNQUFMMERBQUMrQXdBQXZ3TUFBTUFEQUFEQkF3QUF3Z01BQU1NREFBREVBd0FBeFFNQUFNWURBQURIQXdBQXlBTUFBTWtEQUFBQ0lnQUF0UU1BQUxnREFBQzZBd0FBeGdNQUFNRURBQURBQXdBQTNBTUFBTjBEQUFBd0FBQUFNUUFBQURJQUFBQXpBQUFBTkFBQUFEVUFBQUEyQUFBQU53QUFBRGdBQUFBNUFBQUFNQUFBQURFQUFBQXlBQUFBTXdBQUFEUUFBQUExQUFBQU5nQUFBRGNBQUFBNEFBQUFPUUFBQURBQUFBQXhBQUFBTWdBQUFETUFBQUEwQUFBQU5RQUFBRFlBQUFBM0FBQUFPQUFBQURrQUFBQXdBQUFBTVFBQUFESUFBQUF6QUFBQU5BQUFBRFVBQUFBMkFBQUFOd0FBQURnQUFBQTVBQUFBTUFBQUFERUFBQUF5QUFBQU13QUFBRFFBQUFBMUFBQUFOZ0FBQURjQUFBQTRBQUFBT1FBQUFEQUVBQUF4QkFBQU1nUUFBRE1FQUFBMEJBQUFOUVFBQURZRUFBQTNCQUFBT0FRQUFEb0VBQUE3QkFBQVBBUUFBRDRFQUFBL0JBQUFRQVFBQUVFRUFBQkNCQUFBUXdRQUFFUUVBQUJGQkFBQVJnUUFBRWNFQUFCSUJBQUFTd1FBQUUwRUFBQk9CQUFBaWFZQUFOa0VBQUJXQkFBQVdBUUFBT2tFQUFDdkJBQUF6d1FBQURBRUFBQXhCQUFBTWdRQUFETUVBQUEwQkFBQU5RUUFBRFlFQUFBM0JBQUFPQVFBQURvRUFBQTdCQUFBUGdRQUFEOEVBQUJCQkFBQVF3UUFBRVFFQUFCRkJBQUFSZ1FBQUVjRUFBQklCQUFBU2dRQUFFc0VBQUNSQkFBQVZnUUFBRlVFQUFCZkJBQUFxd1FBQUZHbUFBQ3hCQUFBSndZQUFDZ0dBQUFzQmdBQUx3WUFBRWdHQUFBeUJnQUFMUVlBQURjR0FBQktCZ0FBUXdZQUFFUUdBQUJGQmdBQVJnWUFBRE1HQUFBNUJnQUFRUVlBQURVR0FBQkNCZ0FBTVFZQUFEUUdBQUFxQmdBQUt3WUFBQzRHQUFBd0JnQUFOZ1lBQURnR0FBQTZCZ0FBYmdZQUFMb0dBQUNoQmdBQWJ3WUFBQ2dHQUFBc0JnQUFSd1lBQUMwR0FBQktCZ0FBUXdZQUFFUUdBQUJGQmdBQVJnWUFBRE1HQUFBNUJnQUFRUVlBQURVR0FBQkNCZ0FBTkFZQUFDb0dBQUFyQmdBQUxnWUFBRFlHQUFBNkJnQUFMQVlBQUMwR0FBQktCZ0FBUkFZQUFFWUdBQUF6QmdBQU9RWUFBRFVHQUFCQ0JnQUFOQVlBQUM0R0FBQTJCZ0FBT2dZQUFMb0dBQUJ2QmdBQUtBWUFBQ3dHQUFCSEJnQUFMUVlBQURjR0FBQktCZ0FBUXdZQUFFVUdBQUJHQmdBQU13WUFBRGtHQUFCQkJnQUFOUVlBQUVJR0FBQTBCZ0FBS2dZQUFDc0dBQUF1QmdBQU5nWUFBRGdHQUFBNkJnQUFiZ1lBQUtFR0FBQW5CZ0FBS0FZQUFDd0dBQUF2QmdBQVJ3WUFBRWdHQUFBeUJnQUFMUVlBQURjR0FBQktCZ0FBUkFZQUFFVUdBQUJHQmdBQU13WUFBRGtHQUFCQkJnQUFOUVlBQUVJR0FBQXhCZ0FBTkFZQUFDb0dBQUFyQmdBQUxnWUFBREFHQUFBMkJnQUFPQVlBQURvR0FBQW9CZ0FBTEFZQUFDOEdBQUJJQmdBQU1nWUFBQzBHQUFBM0JnQUFTZ1lBQUVRR0FBQkZCZ0FBUmdZQUFETUdBQUE1QmdBQVFRWUFBRFVHQUFCQ0JnQUFNUVlBQURRR0FBQXFCZ0FBS3dZQUFDNEdBQUF3QmdBQU5nWUFBRGdHQUFBNkJnQUFNQUFBQUM0QUFBQXdBQUFBTEFBQUFERUFBQUFzQUFBQU1nQUFBQ3dBQUFBekFBQUFMQUFBQURRQUFBQXNBQUFBTlFBQUFDd0FBQUEyQUFBQUxBQUFBRGNBQUFBc0FBQUFPQUFBQUN3QUFBQTVBQUFBTEFBQUFDZ0FBQUJCQUFBQUtRQUFBQ2dBQUFCQ0FBQUFLUUFBQUNnQUFBQkRBQUFBS1FBQUFDZ0FBQUJFQUFBQUtRQUFBQ2dBQUFCRkFBQUFLUUFBQUNnQUFBQkdBQUFBS1FBQUFDZ0FBQUJIQUFBQUtRQUFBQ2dBQUFCSUFBQUFLUUFBQUNnQUFBQkpBQUFBS1FBQUFDZ0FBQUJLQUFBQUtRQUFBQ2dBQUFCTEFBQUFLUUFBQUNnQUFBQk1BQUFBS1FBQUFDZ0FBQUJOQUFBQUtRQUFBQ2dBQUFCT0FBQUFLUUFBQUNnQUFBQlBBQUFBS1FBQUFDZ0FBQUJRQUFBQUtRQUFBQ2dBQUFCUkFBQUFLUUFBQUNnQUFBQlNBQUFBS1FBQUFDZ0FBQUJUQUFBQUtRQUFBQ2dBQUFCVUFBQUFLUUFBQUNnQUFBQlZBQUFBS1FBQUFDZ0FBQUJXQUFBQUtRQUFBQ2dBQUFCWEFBQUFLUUFBQUNnQUFBQllBQUFBS1FBQUFDZ0FBQUJaQUFBQUtRQUFBQ2dBQUFCYUFBQUFLUUFBQUJRd0FBQlRBQUFBRlRBQUFFTUFBQUJTQUFBQVF3QUFBRVFBQUFCWEFBQUFXZ0FBQUVFQUFBQkNBQUFBUXdBQUFFUUFBQUJGQUFBQVJnQUFBRWNBQUFCSUFBQUFTUUFBQUVvQUFBQkxBQUFBVEFBQUFFMEFBQUJPQUFBQVR3QUFBRkFBQUFCUkFBQUFVZ0FBQUZNQUFBQlVBQUFBVlFBQUFGWUFBQUJYQUFBQVdBQUFBRmtBQUFCYUFBQUFTQUFBQUZZQUFBQk5BQUFBVmdBQUFGTUFBQUJFQUFBQVV3QUFBRk1BQUFCUUFBQUFVQUFBQUZZQUFBQlhBQUFBUXdBQUFFMEFBQUJEQUFBQVRRQUFBRVFBQUFCTkFBQUFVZ0FBQUVRQUFBQktBQUFBZXpBQUFFc3dBQUN6TUFBQXN6QUFBTFV3QUFCTFlnQUFWMXNBQU14VEFBREdNQUFBbVRBQUFJeE9BQUFhV1FBQTQ0a0FBQ2xaQUFDa1RnQUFJR1lBQUNGeEFBQ1paUUFBVFZJQUFJeGZBQUNOVVFBQXNHVUFBQjFTQUFCQ2ZRQUFIM1VBQUttTUFBRHdXQUFBT1ZRQUFCUnZBQUNWWWdBQVZXTUFBQUJPQUFBSlRnQUFTcEFBQU9aZEFBQXRUZ0FBODFNQUFBZGpBQUJ3alFBQVUySUFBSUY1QUFCNmVnQUFDRlFBQUlCdUFBQUpad0FBQ0djQUFETjFBQUJ5VWdBQXRsVUFBRTJSQUFBVU1BQUFMR2NBQUJVd0FBQVVNQUFBQ1U0QUFCVXdBQUFVTUFBQWpFNEFBQlV3QUFBVU1BQUFpVnNBQUJVd0FBQVVNQUFBdVhBQUFCVXdBQUFVTUFBQVUySUFBQlV3QUFBVU1BQUExM1lBQUJVd0FBQVVNQUFBM1ZJQUFCVXdBQUFVTUFBQVYyVUFBQlV3QUFDWFh3QUE3MU1BQURBQUFBQXhBQUFBTWdBQUFETUFBQUEwQUFBQU5RQUFBRFlBQUFBM0FBQUFPQUFBQURrQUFBQXM4aFFBYlFBQUFFSUFBQUE0QUFBQUxQSVVBRzBBQUFCQ0FBQUFTZ0FBQUM5b2IyMWxMM0oxYm01bGNpOHVZMkZ5WjI4dmNtVm5hWE4wY25rdmMzSmpMMmx1WkdWNExtTnlZWFJsY3k1cGJ5MHhPVFE1WTJZNFl6WmlOV0kxTlRkbUwzVnVhV052WkdVdGJtOXliV0ZzYVhwaGRHbHZiaTB3TGpFdU1qUXZjM0pqTDNCbGNtWmxZM1JmYUdGemFDNXljd0FBc0tRV0FISUFBQUFyQUFBQURRQUFBTENrRmdCeUFBQUFMQUFBQUJNQUFBQk1ZWHA1SUdsdWMzUmhibU5sSUdoaGN5QndjbVYyYVc5MWMyeDVJR0psWlc0Z2NHOXBjMjl1WldRQUFFU2xGZ0FxQUFBQUwyaHZiV1V2Y25WdWJtVnlMeTVqWVhKbmJ5OXlaV2RwYzNSeWVTOXpjbU12YVc1a1pYZ3VZM0poZEdWekxtbHZMVEU1TkRsalpqaGpObUkxWWpVMU4yWXZiMjVqWlY5alpXeHNMVEV1TWpFdU15OXpjbU12YkdsaUxuSnpBQUFBZUtVV0FGMEFBQUFJQXdBQUdRQUFBSEpsWlc1MGNtRnVkQ0JwYm1sMEFBRG9wUllBRGdBQUFIaWxGZ0JkQUFBQWVnSUFBQTBBQUFCVWNtbGxaQ0IwYnlCemFISnBibXNnZEc4Z1lTQnNZWEpuWlhJZ1kyRndZV05wZEhrUXBoWUFKQUFBQU15cEZnQlFBQUFBdVFJQUFBa0FBQUJ0YVdRZ1BpQnNaVzRBQUFCTXBoWUFDUUFBQUM5b2IyMWxMM0oxYm01bGNpOHVZMkZ5WjI4dmNtVm5hWE4wY25rdmMzSmpMMmx1WkdWNExtTnlZWFJsY3k1cGJ5MHhPVFE1WTJZNFl6WmlOV0kxTlRkbUwzZGxaWHBzTFRBdU1TNDRMM055WXk5a1pXTnZaR1V1Y25NQVlLWVdBRnNBQUFEV0FnQUFGQUFBQUdDbUZnQmJBQUFBMWdJQUFDRUFBQUJncGhZQVd3QUFBTmdDQUFBZkFBQUFZS1lXQUZzQUFBRE5BZ0FBR1FBQUFHQ21GZ0JiQUFBQUFnTUFBQ3dBQUFCZ3BoWUFXd0FBQUJnREFBQXNBQUFBWUtZV0FGc0FBQUF0QXdBQUt3QUFBR0NtRmdCYkFBQUFMUU1BQUVjQUFBQmdwaFlBV3dBQUFEQURBQUJCQUFBQVlLWVdBRnNBQUFBOEF3QUFLd0FBQUdDbUZnQmJBQUFBV0FNQUFDSUFBQUJncGhZQVd3QUFBRllEQUFBaUFBQUFZS1lXQUZzQUFBQnhBd0FBS2dBQUFHQ21GZ0JiQUFBQWVBTUFBRE1BQUFCZ3BoWUFXd0FBQUhvREFBQWJBQUFBWUtZV0FGc0FBQUI3QXdBQUd3QUFBR0NtRmdCYkFBQUFld01BQUN3QUFBQmdwaFlBV3dBQUFId0RBQUFiQUFBQVlLWVdBRnNBQUFCOEF3QUFGUUFBQUdDbUZnQmJBQUFBWkFNQUFDb0FBQUJncGhZQVd3QUFBR1FEQUFBNUFBQUFZS1lXQUZzQUFBQ2xBd0FBSGdBQUFHQ21GZ0JiQUFBQXBRTUFBQzBBQUFCZ3BoWUFXd0FBQVBZREFBQVhBQUFBWUtZV0FGc0FBQUQyQXdBQUpRQUFBR0NtRmdCYkFBQUE4QU1BQUJjQUFBQmdwaFlBV3dBQUFQQURBQUF6QUFBQVlLWVdBRnNBQUFEeEF3QUFIQUFBQUdDbUZnQmJBQUFBWEFRQUFCUUFBQUJncGhZQVd3QUFBRndFQUFBcEFBQUFZS1lXQUZzQUFBQm5CQUFBSndBQUFHQ21GZ0JiQUFBQVp3UUFBQWtBQUFCZ3BoWUFXd0FBQUhFRUFBQWhBQUFBWUtZV0FGc0FBQUIwQkFBQUhnQUFBR0NtRmdCYkFBQUFmUVFBQUJRQUFBQmdwaFlBV3dBQUFJZ0VBQUFVQUFBQVlLWVdBRnNBQUFDSkJBQUFGUUFBQUdDbUZnQmJBQUFBbXdRQUFCUUFBQUJncGhZQVd3QUFBSndFQUFBVkFBQUFZS1lXQUZzQUFBQ2VCQUFBRkFBQUFHQ21GZ0JiQUFBQW53UUFBQlVBQUFCZ3BoWUFXd0FBQUpjRUFBQVlBQUFBWUtZV0FGc0FBQUNZQkFBQUdRQUFBR0NtRmdCYkFBQUFvd1FBQUJRQUFBQmdwaFlBV3dBQUFMQUVBQUFnQUFBQVlLWVdBRnNBQUFDeEJBQUFGQUFBQUdDbUZnQmJBQUFBc2dRQUFCVUFBQUJncGhZQVd3QUFBTGdFQUFBZ0FBQUFZS1lXQUZzQUFBRERCQUFBQ1FBQUFDOXlkWE4wWXk4MllqQXdZbU16T0Rnd01UazROakF3TVRNd1pURmpaall5WWpobU9HRTVNelE1TkRRNE9HTmpMMnhwWW5KaGNua3ZZV3hzYjJNdmMzSmpMM0poZDE5MlpXTXZiVzlrTG5KenpLa1dBRkFBQUFBdUFnQUFFUUFBQUFRQUFBQUhBQUFBQndBQUFBUUFBQUFFQUFBQUJnQUFBQVVBQUFBS0FBQUFCZ0FBQUFrQUFBQ0JaeElBTjJjU0FENW5FZ0JGWnhJQXFHb1NBRWxuRWdCWVp4SUFYV2NTQUdkbkVnQlBaeElBQkFBQUFBY0FBQUFIQUFBQUJBQUFBQVFBQUFBR0FBQUFCUUFBQUFvQUFBQUdBQUFBQ1FBQUFJRm5FZ0EzWnhJQVBtY1NBRVZuRWdDb2FoSUFTV2NTQUZobkVnQmRaeElBWjJjU0FFOW5FZ0FGQUFBQUNRQUFBQXNBQUFESWRoSUF6WFlTQU5aMkVnQUtBQUFBRkFBQUFCRUFBQUFPQUFBQUN3QUFBSUIyRWdDS2RoSUFubllTQUs5MkVnQzlkaElBMFAvLy85RC8vLy93Ly8vLzJQLy8vOWovLy8vNC8vLy9CUUFBQUF3QUFBQUxBQUFBQ3dBQUFBUUFBQURhaFJRQTM0VVVBT3VGRkFEMmhSUUFBWVlVQUFnQUFBQVFBQUFBRVFBQUFBOEFBQUFQQUFBQUVnQUFBQkVBQUFBTUFBQUFDUUFBQUJBQUFBQUxBQUFBQ2dBQUFBMEFBQUFLQUFBQURRQUFBQXdBQUFBUkFBQUFFZ0FBQUE0QUFBQVdBQUFBREFBQUFBc0FBQUFJQUFBQUNRQUFBQXNBQUFBTEFBQUFEUUFBQUF3QUFBQU1BQUFBRWdBQUFBZ0FBQUFPQUFBQURBQUFBQThBQUFBVEFBQUFDd0FBQUFzQUFBQU5BQUFBQ3dBQUFBb0FBQUFGQUFBQURRQUFBS3lLRkFDMGloUUF4SW9VQU5XS0ZBRGtpaFFBODRvVUFBV0xGQUFXaXhRQUlvc1VBQ3VMRkFBN2l4UUFSb3NVQUZDTEZBQjRoeFFBWFlzVUFHcUxGQUIyaXhRQWg0c1VBSm1MRkFDbml4UUF2WXNVQU1tTEZBRFVpeFFBM0lzVUFPV0xGQUR3aXhRQSs0c1VBQWlNRkFBVWpCUUFJSXdVQURLTUZBQTZqQlFBU0l3VUFGU01GQUJqakJRQWRvd1VBSUdNRkFDTWpCUUFtWXdVQUtTTUZBQ3VqQlFBczR3VUFCQUFBQUFSQUFBQUVnQUFBQkFBQUFBUUFBQUFFd0FBQUJJQUFBQU5BQUFBRGdBQUFCVUFBQUFNQUFBQUN3QUFBQlVBQUFBVkFBQUFEd0FBQUE0QUFBQVRBQUFBSmdBQUFEZ0FBQUFaQUFBQUZ3QUFBQXdBQUFBSkFBQUFDZ0FBQUJBQUFBQVhBQUFBRGdBQUFBNEFBQUFOQUFBQUZBQUFBQWdBQUFBYkFBQUFEZ0FBQUJBQUFBQVdBQUFBRlFBQUFBc0FBQUFXQUFBQURRQUFBQXNBQUFBTEFBQUFFd0FBQUl5SEZBQ2NoeFFBclljVUFMK0hGQURQaHhRQTM0Y1VBUEtIRkFBRWlCUUFFWWdVQUIrSUZBQTBpQlFBUUlnVUFFdUlGQUJnaUJRQWRZZ1VBSVNJRkFDU2lCUUFwWWdVQU11SUZBQURpUlFBSElrVUFET0pGQUEvaVJRQVNJa1VBRktKRkFCaWlSUUFlWWtVQUllSkZBQ1ZpUlFBb29rVUFMYUpGQUMraVJRQTJZa1VBT2VKRkFEM2lSUUFEWW9VQUNLS0ZBQXRpaFFBUTRvVUFGQ0tGQUJiaWhRQVpvb1VBRUdFM05vQUN3S2FBUUI4Q1hCeWIyUjFZMlZ5Y3dJSWJHRnVaM1ZoWjJVQkJGSjFjM1FBREhCeWIyTmxjM05sWkMxaWVRTUZjblZ6ZEdNZE1TNDRPQzR3SUNnMllqQXdZbU16T0RnZ01qQXlOUzB3TmkweU15a0dkMkZzY25WekJqQXVNak11TXd4M1lYTnRMV0pwYm1SblpXNFRNQzR5TGpFd01DQW9NalF3TldWak1tSTBLUUJyRDNSaGNtZGxkRjltWldGMGRYSmxjd1lyRDIxMWRHRmliR1V0WjJ4dlltRnNjeXNUYm05dWRISmhjSEJwYm1jdFpuQjBiMmx1ZENzTFluVnNheTF0WlcxdmNua3JDSE5wWjI0dFpYaDBLdzl5WldabGNtVnVZMlV0ZEhsd1pYTXJDbTExYkhScGRtRnNkV1U9Iik7b25tZXNzYWdlPWFzeW5jIEE9Pntjb25zdCBnPVVpbnQ4QXJyYXkuZnJvbShOLChBPT5BLmNoYXJDb2RlQXQoMCkpKTthd2FpdCB3KFByb21pc2UucmVzb2x2ZShnKSk7dHJ5e2NvbnN0IGc9RShBLmRhdGEuZGF0YSk7c2VsZi5wb3N0TWVzc2FnZSh7dGV4dDpnfSl9Y2F0Y2goZyl7Y29uc29sZS5pbmZvKCJUZXh0IEV4dHJhY3RvciAtIENvdWxkIG5vdCBleHRyYWN0IHRleHQgZnJvbSAiK0EuZGF0YS5uYW1lKSxzZWxmLnBvc3RNZXNzYWdlKHt0ZXh0OiIifSl9fX0oKTsKCg==", l = null, Z = false, function(U2) { + return d = d || R(V, l, Z), new Worker(d, U2); +}); +var J = "0.5.0"; +var N = (typeof globalThis != "undefined" ? globalThis : typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" && self, {}); +!function(U2) { + var F2 = Object.prototype.hasOwnProperty, Q2 = "~"; + function B2() { + } + function R2(U3, F3, Q3) { + this.fn = U3, this.context = F3, this.once = Q3 || false; + } + function V2(U3, F3, B3, V3, l3) { + if (typeof B3 != "function") + throw new TypeError("The listener must be a function"); + var Z3 = new R2(B3, V3 || U3, l3), d2 = Q2 ? Q2 + F3 : F3; + return U3._events[d2] ? U3._events[d2].fn ? U3._events[d2] = [U3._events[d2], Z3] : U3._events[d2].push(Z3) : (U3._events[d2] = Z3, U3._eventsCount++), U3; + } + function l2(U3, F3) { + --U3._eventsCount == 0 ? U3._events = new B2() : delete U3._events[F3]; + } + function Z2() { + this._events = new B2(), this._eventsCount = 0; + } + Object.create && (B2.prototype = /* @__PURE__ */ Object.create(null), new B2().__proto__ || (Q2 = false)), Z2.prototype.eventNames = function() { + var U3, B3, R3 = []; + if (this._eventsCount === 0) + return R3; + for (B3 in U3 = this._events) + F2.call(U3, B3) && R3.push(Q2 ? B3.slice(1) : B3); + return Object.getOwnPropertySymbols ? R3.concat(Object.getOwnPropertySymbols(U3)) : R3; + }, Z2.prototype.listeners = function(U3) { + var F3 = Q2 ? Q2 + U3 : U3, B3 = this._events[F3]; + if (!B3) + return []; + if (B3.fn) + return [B3.fn]; + for (var R3 = 0, V3 = B3.length, l3 = new Array(V3); R3 < V3; R3++) + l3[R3] = B3[R3].fn; + return l3; + }, Z2.prototype.listenerCount = function(U3) { + var F3 = Q2 ? Q2 + U3 : U3, B3 = this._events[F3]; + return B3 ? B3.fn ? 1 : B3.length : 0; + }, Z2.prototype.emit = function(U3, F3, B3, R3, V3, l3) { + var Z3 = Q2 ? Q2 + U3 : U3; + if (!this._events[Z3]) + return false; + var d2, W2, J2 = this._events[Z3], N2 = arguments.length; + if (J2.fn) { + switch (J2.once && this.removeListener(U3, J2.fn, void 0, true), N2) { + case 1: + return J2.fn.call(J2.context), true; + case 2: + return J2.fn.call(J2.context, F3), true; + case 3: + return J2.fn.call(J2.context, F3, B3), true; + case 4: + return J2.fn.call(J2.context, F3, B3, R3), true; + case 5: + return J2.fn.call(J2.context, F3, B3, R3, V3), true; + case 6: + return J2.fn.call(J2.context, F3, B3, R3, V3, l3), true; + } + for (W2 = 1, d2 = new Array(N2 - 1); W2 < N2; W2++) + d2[W2 - 1] = arguments[W2]; + J2.fn.apply(J2.context, d2); + } else { + var S2, E2 = J2.length; + for (W2 = 0; W2 < E2; W2++) + switch (J2[W2].once && this.removeListener(U3, J2[W2].fn, void 0, true), N2) { + case 1: + J2[W2].fn.call(J2[W2].context); + break; + case 2: + J2[W2].fn.call(J2[W2].context, F3); + break; + case 3: + J2[W2].fn.call(J2[W2].context, F3, B3); + break; + case 4: + J2[W2].fn.call(J2[W2].context, F3, B3, R3); + break; + default: + if (!d2) + for (S2 = 1, d2 = new Array(N2 - 1); S2 < N2; S2++) + d2[S2 - 1] = arguments[S2]; + J2[W2].fn.apply(J2[W2].context, d2); + } + } + return true; + }, Z2.prototype.on = function(U3, F3, Q3) { + return V2(this, U3, F3, Q3, false); + }, Z2.prototype.once = function(U3, F3, Q3) { + return V2(this, U3, F3, Q3, true); + }, Z2.prototype.removeListener = function(U3, F3, B3, R3) { + var V3 = Q2 ? Q2 + U3 : U3; + if (!this._events[V3]) + return this; + if (!F3) + return l2(this, V3), this; + var Z3 = this._events[V3]; + if (Z3.fn) + Z3.fn !== F3 || R3 && !Z3.once || B3 && Z3.context !== B3 || l2(this, V3); + else { + for (var d2 = 0, W2 = [], J2 = Z3.length; d2 < J2; d2++) + (Z3[d2].fn !== F3 || R3 && !Z3[d2].once || B3 && Z3[d2].context !== B3) && W2.push(Z3[d2]); + W2.length ? this._events[V3] = W2.length === 1 ? W2[0] : W2 : l2(this, V3); + } + return this; + }, Z2.prototype.removeAllListeners = function(U3) { + var F3; + return U3 ? (F3 = Q2 ? Q2 + U3 : U3, this._events[F3] && l2(this, F3)) : (this._events = new B2(), this._eventsCount = 0), this; + }, Z2.prototype.off = Z2.prototype.removeListener, Z2.prototype.addListener = Z2.prototype.on, Z2.prefixed = Q2, Z2.EventEmitter = Z2, U2.exports = Z2; +}({ get exports() { + return N; +}, set exports(U2) { + N = U2; +} }); +var S = N; +var E = class extends Error { + constructor(U2) { + super(U2), this.name = "TimeoutError"; + } +}; +var T = class extends Error { + constructor(U2) { + super(), this.name = "AbortError", this.message = U2; + } +}; +var k = (U2) => globalThis.DOMException === void 0 ? new T(U2) : new DOMException(U2); +var m = (U2) => { + const F2 = U2.reason === void 0 ? k("This operation was aborted.") : U2.reason; + return F2 instanceof Error ? F2 : k(F2); +}; +var I; +var b = function(U2, F2, Q2, B2) { + if (Q2 === "a" && !B2) + throw new TypeError("Private accessor was defined without a getter"); + if (typeof F2 == "function" ? U2 !== F2 || !B2 : !F2.has(U2)) + throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return Q2 === "m" ? B2 : Q2 === "a" ? B2.call(U2) : B2 ? B2.value : F2.get(U2); +}; +var G = class { + constructor() { + I.set(this, []); + } + enqueue(U2, F2) { + const Q2 = { priority: (F2 = { priority: 0, ...F2 }).priority, run: U2 }; + if (this.size && b(this, I, "f")[this.size - 1].priority >= F2.priority) + return void b(this, I, "f").push(Q2); + const B2 = function(U3, F3, Q3) { + let B3 = 0, R2 = U3.length; + for (; R2 > 0; ) { + const V2 = Math.trunc(R2 / 2); + let l2 = B3 + V2; + Q3(U3[l2], F3) <= 0 ? (B3 = ++l2, R2 -= V2 + 1) : R2 = V2; + } + return B3; + }(b(this, I, "f"), Q2, (U3, F3) => F3.priority - U3.priority); + b(this, I, "f").splice(B2, 0, Q2); + } + dequeue() { + const U2 = b(this, I, "f").shift(); + return U2 == null ? void 0 : U2.run; + } + filter(U2) { + return b(this, I, "f").filter((F2) => F2.priority === U2.priority).map((U3) => U3.run); + } + get size() { + return b(this, I, "f").length; + } +}; +I = /* @__PURE__ */ new WeakMap(); +var n; +var i; +var X; +var Y; +var h; +var c; +var p; +var a; +var M; +var C; +var y; +var D; +var L; +var j; +var x; +var z; +var t; +var H; +var s; +var o; +var O; +var u; +var K; +var w; +var v; +var e; +var g = function(U2, F2, Q2, B2, R2) { + if (B2 === "m") + throw new TypeError("Private method is not writable"); + if (B2 === "a" && !R2) + throw new TypeError("Private accessor was defined without a setter"); + if (typeof F2 == "function" ? U2 !== F2 || !R2 : !F2.has(U2)) + throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return B2 === "a" ? R2.call(U2, Q2) : R2 ? R2.value = Q2 : F2.set(U2, Q2), Q2; +}; +var P = function(U2, F2, Q2, B2) { + if (Q2 === "a" && !B2) + throw new TypeError("Private accessor was defined without a getter"); + if (typeof F2 == "function" ? U2 !== F2 || !B2 : !F2.has(U2)) + throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return Q2 === "m" ? B2 : Q2 === "a" ? B2.call(U2) : B2 ? B2.value : F2.get(U2); +}; +var r = class extends Error { +}; +var A = class extends S { + constructor(U2) { + var F2, Q2, B2, R2; + if (super(), n.add(this), i.set(this, void 0), X.set(this, void 0), Y.set(this, 0), h.set(this, void 0), c.set(this, void 0), p.set(this, 0), a.set(this, void 0), M.set(this, void 0), C.set(this, void 0), y.set(this, void 0), D.set(this, 0), L.set(this, void 0), j.set(this, void 0), x.set(this, void 0), Object.defineProperty(this, "timeout", { enumerable: true, configurable: true, writable: true, value: void 0 }), !(typeof (U2 = { carryoverConcurrencyCount: false, intervalCap: Number.POSITIVE_INFINITY, interval: 0, concurrency: Number.POSITIVE_INFINITY, autoStart: true, queueClass: G, ...U2 }).intervalCap == "number" && U2.intervalCap >= 1)) + throw new TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${(Q2 = (F2 = U2.intervalCap) === null || F2 === void 0 ? void 0 : F2.toString()) !== null && Q2 !== void 0 ? Q2 : ""}\` (${typeof U2.intervalCap})`); + if (U2.interval === void 0 || !(Number.isFinite(U2.interval) && U2.interval >= 0)) + throw new TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${(R2 = (B2 = U2.interval) === null || B2 === void 0 ? void 0 : B2.toString()) !== null && R2 !== void 0 ? R2 : ""}\` (${typeof U2.interval})`); + g(this, i, U2.carryoverConcurrencyCount, "f"), g(this, X, U2.intervalCap === Number.POSITIVE_INFINITY || U2.interval === 0, "f"), g(this, h, U2.intervalCap, "f"), g(this, c, U2.interval, "f"), g(this, C, new U2.queueClass(), "f"), g(this, y, U2.queueClass, "f"), this.concurrency = U2.concurrency, this.timeout = U2.timeout, g(this, x, U2.throwOnTimeout === true, "f"), g(this, j, U2.autoStart === false, "f"); + } + get concurrency() { + return P(this, L, "f"); + } + set concurrency(U2) { + if (!(typeof U2 == "number" && U2 >= 1)) + throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${U2}\` (${typeof U2})`); + g(this, L, U2, "f"), P(this, n, "m", w).call(this); + } + async add(U2, F2 = {}) { + return F2 = { timeout: this.timeout, throwOnTimeout: P(this, x, "f"), ...F2 }, new Promise((Q2, B2) => { + P(this, C, "f").enqueue(async () => { + var R2, V2, l2; + g(this, D, (V2 = P(this, D, "f"), ++V2), "f"), g(this, Y, (l2 = P(this, Y, "f"), ++l2), "f"); + try { + if ((R2 = F2.signal) === null || R2 === void 0 ? void 0 : R2.aborted) + throw new r("The task was aborted."); + let B3 = U2({ signal: F2.signal }); + F2.timeout && (B3 = function(U3, F3, Q3, B4) { + let R3; + const V4 = new Promise((V5, l3) => { + if (typeof F3 != "number" || Math.sign(F3) !== 1) + throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${F3}\``); + if (F3 !== Number.POSITIVE_INFINITY) { + if ((B4 = { customTimers: { setTimeout, clearTimeout }, ...B4 }).signal) { + const { signal: U4 } = B4; + U4.aborted && l3(m(U4)), U4.addEventListener("abort", () => { + l3(m(U4)); + }); + } + R3 = B4.customTimers.setTimeout.call(void 0, () => { + if (typeof Q3 == "function") { + try { + V5(Q3()); + } catch (U4) { + l3(U4); + } + return; + } + const B5 = Q3 instanceof Error ? Q3 : new E(typeof Q3 == "string" ? Q3 : `Promise timed out after ${F3} milliseconds`); + typeof U3.cancel == "function" && U3.cancel(), l3(B5); + }, F3), (async () => { + try { + V5(await U3); + } catch (U4) { + l3(U4); + } finally { + B4.customTimers.clearTimeout.call(void 0, R3); + } + })(); + } else + V5(U3); + }); + return V4.clear = () => { + clearTimeout(R3), R3 = void 0; + }, V4; + }(Promise.resolve(B3), F2.timeout)), F2.signal && (B3 = Promise.race([B3, P(this, n, "m", v).call(this, F2.signal)])); + const V3 = await B3; + Q2(V3), this.emit("completed", V3); + } catch (U3) { + if (U3 instanceof E && !F2.throwOnTimeout) + return void Q2(); + B2(U3), this.emit("error", U3); + } finally { + P(this, n, "m", H).call(this); + } + }, F2), this.emit("add"), P(this, n, "m", O).call(this); + }); + } + async addAll(U2, F2) { + return Promise.all(U2.map(async (U3) => this.add(U3, F2))); + } + start() { + return P(this, j, "f") ? (g(this, j, false, "f"), P(this, n, "m", w).call(this), this) : this; + } + pause() { + g(this, j, true, "f"); + } + clear() { + g(this, C, new (P(this, y, "f"))(), "f"); + } + async onEmpty() { + P(this, C, "f").size !== 0 && await P(this, n, "m", e).call(this, "empty"); + } + async onSizeLessThan(U2) { + P(this, C, "f").size < U2 || await P(this, n, "m", e).call(this, "next", () => P(this, C, "f").size < U2); + } + async onIdle() { + P(this, D, "f") === 0 && P(this, C, "f").size === 0 || await P(this, n, "m", e).call(this, "idle"); + } + get size() { + return P(this, C, "f").size; + } + sizeBy(U2) { + return P(this, C, "f").filter(U2).length; + } + get pending() { + return P(this, D, "f"); + } + get isPaused() { + return P(this, j, "f"); + } +}; +i = /* @__PURE__ */ new WeakMap(), X = /* @__PURE__ */ new WeakMap(), Y = /* @__PURE__ */ new WeakMap(), h = /* @__PURE__ */ new WeakMap(), c = /* @__PURE__ */ new WeakMap(), p = /* @__PURE__ */ new WeakMap(), a = /* @__PURE__ */ new WeakMap(), M = /* @__PURE__ */ new WeakMap(), C = /* @__PURE__ */ new WeakMap(), y = /* @__PURE__ */ new WeakMap(), D = /* @__PURE__ */ new WeakMap(), L = /* @__PURE__ */ new WeakMap(), j = /* @__PURE__ */ new WeakMap(), x = /* @__PURE__ */ new WeakMap(), n = /* @__PURE__ */ new WeakSet(), z = function() { + return P(this, X, "f") || P(this, Y, "f") < P(this, h, "f"); +}, t = function() { + return P(this, D, "f") < P(this, L, "f"); +}, H = function() { + var U2; + g(this, D, (U2 = P(this, D, "f"), --U2), "f"), P(this, n, "m", O).call(this), this.emit("next"); +}, s = function() { + P(this, n, "m", K).call(this), P(this, n, "m", u).call(this), g(this, M, void 0, "f"); +}, o = function() { + const U2 = Date.now(); + if (P(this, a, "f") === void 0) { + const F2 = P(this, p, "f") - U2; + if (!(F2 < 0)) + return P(this, M, "f") === void 0 && g(this, M, setTimeout(() => { + P(this, n, "m", s).call(this); + }, F2), "f"), true; + g(this, Y, P(this, i, "f") ? P(this, D, "f") : 0, "f"); + } + return false; +}, O = function() { + if (P(this, C, "f").size === 0) + return P(this, a, "f") && clearInterval(P(this, a, "f")), g(this, a, void 0, "f"), this.emit("empty"), P(this, D, "f") === 0 && this.emit("idle"), false; + if (!P(this, j, "f")) { + const U2 = !P(this, n, "a", o); + if (P(this, n, "a", z) && P(this, n, "a", t)) { + const F2 = P(this, C, "f").dequeue(); + return !!F2 && (this.emit("active"), F2(), U2 && P(this, n, "m", u).call(this), true); + } + } + return false; +}, u = function() { + P(this, X, "f") || P(this, a, "f") !== void 0 || (g(this, a, setInterval(() => { + P(this, n, "m", K).call(this); + }, P(this, c, "f")), "f"), g(this, p, Date.now() + P(this, c, "f"), "f")); +}, K = function() { + P(this, Y, "f") === 0 && P(this, D, "f") === 0 && P(this, a, "f") && (clearInterval(P(this, a, "f")), g(this, a, void 0, "f")), g(this, Y, P(this, i, "f") ? P(this, D, "f") : 0, "f"), P(this, n, "m", w).call(this); +}, w = function() { + for (; P(this, n, "m", O).call(this); ) + ; +}, v = async function(U2) { + return new Promise((F2, Q2) => { + U2.addEventListener("abort", () => { + Q2(new r("The task was aborted.")); + }, { once: true }); + }); +}, e = async function(U2, F2) { + return new Promise((Q2) => { + const B2 = () => { + F2 && !F2() || (this.off(U2, B2), Q2()); + }; + this.on(U2, B2); + }); +}; +var f = J; +var q = import_obsidian.Platform.isMobileApp ? 1 : require("os").cpus().length; +var _ = q <= 2 ? 1 : 2; +var $ = Math.max(1, Math.floor(0.7 * q) - _ - 1); +$ == q && ($ = 1), console.info(`Text Extractor - Number of available workers: ${$} for PDFs, ${_} for OCR, 1 for Office`); +var UU = 12e4; +var FU = new A({ concurrency: $, timeout: 120100 }); +var QU = new A({ concurrency: _, timeout: 120100 }); +var BU = new A({ concurrency: 1, timeout: 120100 }); +var RU = "[Failed to extract text]"; +var VU = "[Cannot extract text on mobile]"; +var lU = {}; +typeof self != "undefined" && self, { get exports() { + return lU; +}, set exports(U2) { + lU = U2; +} }.exports = function(U2) { + var F2 = {}; + function Q2(B2) { + if (F2[B2]) + return F2[B2].exports; + var R2 = F2[B2] = { i: B2, l: false, exports: {} }; + return U2[B2].call(R2.exports, R2, R2.exports, Q2), R2.l = true, R2.exports; + } + return Q2.m = U2, Q2.c = F2, Q2.d = function(U3, F3, B2) { + Q2.o(U3, F3) || Object.defineProperty(U3, F3, { enumerable: true, get: B2 }); + }, Q2.r = function(U3) { + typeof Symbol != "undefined" && Symbol.toStringTag && Object.defineProperty(U3, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(U3, "__esModule", { value: true }); + }, Q2.t = function(U3, F3) { + if (1 & F3 && (U3 = Q2(U3)), 8 & F3) + return U3; + if (4 & F3 && typeof U3 == "object" && U3 && U3.__esModule) + return U3; + var B2 = /* @__PURE__ */ Object.create(null); + if (Q2.r(B2), Object.defineProperty(B2, "default", { enumerable: true, value: U3 }), 2 & F3 && typeof U3 != "string") + for (var R2 in U3) + Q2.d(B2, R2, function(F4) { + return U3[F4]; + }.bind(null, R2)); + return B2; + }, Q2.n = function(U3) { + var F3 = U3 && U3.__esModule ? function() { + return U3.default; + } : function() { + return U3; + }; + return Q2.d(F3, "a", F3), F3; + }, Q2.o = function(U3, F3) { + return Object.prototype.hasOwnProperty.call(U3, F3); + }, Q2.p = "", Q2(Q2.s = 0); +}([function(U2, F2, Q2) { + Q2.r(F2), Q2.d(F2, "md5", function() { + return k2; + }); + var B2 = "0123456789abcdef".split(""), R2 = function(U3) { + for (var F3 = "", Q3 = 0; Q3 < 4; Q3++) + F3 += B2[U3 >> 8 * Q3 + 4 & 15] + B2[U3 >> 8 * Q3 & 15]; + return F3; + }, V2 = function(U3) { + for (var F3 = U3.length, Q3 = 0; Q3 < F3; Q3++) + U3[Q3] = R2(U3[Q3]); + return U3.join(""); + }, l2 = function(U3, F3) { + return U3 + F3 & 4294967295; + }, Z2 = function(U3, F3, Q3, B3, R3, V3, Z3) { + return function(U4, F4, Q4) { + return l2(U4 << F4 | U4 >>> 32 - F4, Q4); + }(F3 = function(U4, F4, Q4, B4) { + return l2(l2(F4, U4), l2(Q4, B4)); + }(U3, F3, B3, V3), R3, Q3); + }, d2 = function(U3, F3, Q3, B3, R3, V3, l3, d3) { + return Z2(Q3 & B3 | ~Q3 & R3, F3, Q3, V3, l3, d3); + }, W2 = function(U3, F3, Q3, B3, R3, V3, l3, d3) { + return Z2(Q3 & R3 | B3 & ~R3, F3, Q3, V3, l3, d3); + }, J2 = function(U3, F3, Q3, B3, R3, V3, l3, d3) { + return Z2(Q3 ^ B3 ^ R3, F3, Q3, V3, l3, d3); + }, N2 = function(U3, F3, Q3, B3, R3, V3, l3, d3) { + return Z2(B3 ^ (Q3 | ~R3), F3, Q3, V3, l3, d3); + }, S2 = function(U3, F3, Q3) { + Q3 === void 0 && (Q3 = l2); + var B3 = U3[0], R3 = U3[1], V3 = U3[2], Z3 = U3[3], S3 = d2.bind(null, Q3); + B3 = S3(B3, R3, V3, Z3, F3[0], 7, -680876936), Z3 = S3(Z3, B3, R3, V3, F3[1], 12, -389564586), V3 = S3(V3, Z3, B3, R3, F3[2], 17, 606105819), R3 = S3(R3, V3, Z3, B3, F3[3], 22, -1044525330), B3 = S3(B3, R3, V3, Z3, F3[4], 7, -176418897), Z3 = S3(Z3, B3, R3, V3, F3[5], 12, 1200080426), V3 = S3(V3, Z3, B3, R3, F3[6], 17, -1473231341), R3 = S3(R3, V3, Z3, B3, F3[7], 22, -45705983), B3 = S3(B3, R3, V3, Z3, F3[8], 7, 1770035416), Z3 = S3(Z3, B3, R3, V3, F3[9], 12, -1958414417), V3 = S3(V3, Z3, B3, R3, F3[10], 17, -42063), R3 = S3(R3, V3, Z3, B3, F3[11], 22, -1990404162), B3 = S3(B3, R3, V3, Z3, F3[12], 7, 1804603682), Z3 = S3(Z3, B3, R3, V3, F3[13], 12, -40341101), V3 = S3(V3, Z3, B3, R3, F3[14], 17, -1502002290), R3 = S3(R3, V3, Z3, B3, F3[15], 22, 1236535329); + var E3 = W2.bind(null, Q3); + B3 = E3(B3, R3, V3, Z3, F3[1], 5, -165796510), Z3 = E3(Z3, B3, R3, V3, F3[6], 9, -1069501632), V3 = E3(V3, Z3, B3, R3, F3[11], 14, 643717713), R3 = E3(R3, V3, Z3, B3, F3[0], 20, -373897302), B3 = E3(B3, R3, V3, Z3, F3[5], 5, -701558691), Z3 = E3(Z3, B3, R3, V3, F3[10], 9, 38016083), V3 = E3(V3, Z3, B3, R3, F3[15], 14, -660478335), R3 = E3(R3, V3, Z3, B3, F3[4], 20, -405537848), B3 = E3(B3, R3, V3, Z3, F3[9], 5, 568446438), Z3 = E3(Z3, B3, R3, V3, F3[14], 9, -1019803690), V3 = E3(V3, Z3, B3, R3, F3[3], 14, -187363961), R3 = E3(R3, V3, Z3, B3, F3[8], 20, 1163531501), B3 = E3(B3, R3, V3, Z3, F3[13], 5, -1444681467), Z3 = E3(Z3, B3, R3, V3, F3[2], 9, -51403784), V3 = E3(V3, Z3, B3, R3, F3[7], 14, 1735328473), R3 = E3(R3, V3, Z3, B3, F3[12], 20, -1926607734); + var T3 = J2.bind(null, Q3); + B3 = T3(B3, R3, V3, Z3, F3[5], 4, -378558), Z3 = T3(Z3, B3, R3, V3, F3[8], 11, -2022574463), V3 = T3(V3, Z3, B3, R3, F3[11], 16, 1839030562), R3 = T3(R3, V3, Z3, B3, F3[14], 23, -35309556), B3 = T3(B3, R3, V3, Z3, F3[1], 4, -1530992060), Z3 = T3(Z3, B3, R3, V3, F3[4], 11, 1272893353), V3 = T3(V3, Z3, B3, R3, F3[7], 16, -155497632), R3 = T3(R3, V3, Z3, B3, F3[10], 23, -1094730640), B3 = T3(B3, R3, V3, Z3, F3[13], 4, 681279174), Z3 = T3(Z3, B3, R3, V3, F3[0], 11, -358537222), V3 = T3(V3, Z3, B3, R3, F3[3], 16, -722521979), R3 = T3(R3, V3, Z3, B3, F3[6], 23, 76029189), B3 = T3(B3, R3, V3, Z3, F3[9], 4, -640364487), Z3 = T3(Z3, B3, R3, V3, F3[12], 11, -421815835), V3 = T3(V3, Z3, B3, R3, F3[15], 16, 530742520), R3 = T3(R3, V3, Z3, B3, F3[2], 23, -995338651); + var k3 = N2.bind(null, Q3); + B3 = k3(B3, R3, V3, Z3, F3[0], 6, -198630844), Z3 = k3(Z3, B3, R3, V3, F3[7], 10, 1126891415), V3 = k3(V3, Z3, B3, R3, F3[14], 15, -1416354905), R3 = k3(R3, V3, Z3, B3, F3[5], 21, -57434055), B3 = k3(B3, R3, V3, Z3, F3[12], 6, 1700485571), Z3 = k3(Z3, B3, R3, V3, F3[3], 10, -1894986606), V3 = k3(V3, Z3, B3, R3, F3[10], 15, -1051523), R3 = k3(R3, V3, Z3, B3, F3[1], 21, -2054922799), B3 = k3(B3, R3, V3, Z3, F3[8], 6, 1873313359), Z3 = k3(Z3, B3, R3, V3, F3[15], 10, -30611744), V3 = k3(V3, Z3, B3, R3, F3[6], 15, -1560198380), R3 = k3(R3, V3, Z3, B3, F3[13], 21, 1309151649), B3 = k3(B3, R3, V3, Z3, F3[4], 6, -145523070), Z3 = k3(Z3, B3, R3, V3, F3[11], 10, -1120210379), V3 = k3(V3, Z3, B3, R3, F3[2], 15, 718787259), R3 = k3(R3, V3, Z3, B3, F3[9], 21, -343485551), U3[0] = Q3(B3, U3[0]), U3[1] = Q3(R3, U3[1]), U3[2] = Q3(V3, U3[2]), U3[3] = Q3(Z3, U3[3]); + }, E2 = function(U3) { + for (var F3 = [], Q3 = 0; Q3 < 64; Q3 += 4) + F3[Q3 >> 2] = U3.charCodeAt(Q3) + (U3.charCodeAt(Q3 + 1) << 8) + (U3.charCodeAt(Q3 + 2) << 16) + (U3.charCodeAt(Q3 + 3) << 24); + return F3; + }, T2 = function(U3, F3) { + var Q3, B3 = U3.length, R3 = [1732584193, -271733879, -1732584194, 271733878]; + for (Q3 = 64; Q3 <= B3; Q3 += 64) + S2(R3, E2(U3.substring(Q3 - 64, Q3)), F3); + var V3 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], l3 = (U3 = U3.substring(Q3 - 64)).length; + for (Q3 = 0; Q3 < l3; Q3++) + V3[Q3 >> 2] |= U3.charCodeAt(Q3) << (Q3 % 4 << 3); + if (V3[Q3 >> 2] |= 128 << (Q3 % 4 << 3), Q3 > 55) + for (S2(R3, V3, F3), Q3 = 16; Q3--; ) + V3[Q3] = 0; + return V3[14] = 8 * B3, S2(R3, V3, F3), R3; + }; + function k2(U3) { + var F3; + return V2(T2("hello")) !== "5d41402abc4b2a76b9719d911017c592" && (F3 = function(U4, F4) { + var Q3 = (65535 & U4) + (65535 & F4); + return (U4 >> 16) + (F4 >> 16) + (Q3 >> 16) << 16 | 65535 & Q3; + }), V2(T2(U3, F3)); + } +}]); +var ZU = (U2) => typeof U2 == "string" ? lU.md5(U2) : lU.md5(new TextDecoder().decode(U2)); +function dU() { + return `${app.vault.configDir}/plugins/text-extractor/cache`; +} +async function WU() { + var _a2; + const U2 = dU(); + try { + const F2 = await app.vault.adapter.list(U2); + for (const Q2 of F2.folders) { + const F3 = await app.vault.adapter.list(Q2); + for (const Q3 of F3.files) { + const F4 = (_a2 = Q3.split("-").pop()) == null ? void 0 : _a2.split(".").shift(); + if (F4) { + const B2 = `${U2}/${F4}.json`; + await app.vault.adapter.rename(Q3, B2); + } + } + } + } catch (U3) { + } +} +function JU(U2) { + const F2 = ZU(U2.path), Q2 = `${dU()}`, B2 = `${F2}.json`; + return { folder: Q2, filename: B2, fullpath: `${Q2}/${B2}` }; +} +async function NU(U2) { + const F2 = JU(U2); + if (await app.vault.adapter.exists(F2.fullpath)) { + const U3 = await app.vault.adapter.read(F2.fullpath); + return JSON.parse(U3); + } + return null; +} +async function SU(U2, F2, Q2, B2, R2) { + const V2 = `${U2}/${F2}`, l2 = { path: B2, text: Q2, libVersion: f, langs: R2 }; + return await app.vault.adapter.mkdir(U2), await app.vault.adapter.write(V2, JSON.stringify(l2)); +} +var EU; +var TU; +var kU; +var mU; +var IU; +var bU; +var GU = class { + constructor(U2) { + this.worker = U2, kU.set(this, false); + } + static getWorker() { + const U2 = Q(GU, EU, "f", TU).find((U3) => !Q(U3, kU, "f")); + if (U2) + return U2; + const F2 = new GU(new W({ name: "PDF Text Extractor" })); + return Q(GU, EU, "f", TU).push(F2), F2; + } + async run(U2) { + return new Promise((F2, R2) => { + B(this, kU, true, "f"); + const V2 = setTimeout(() => { + console.warn("Text Extractor - PDF Worker timeout for ", U2.name), R2("timeout"), Q(GU, EU, "m", mU).call(GU, this); + }, UU); + this.worker.postMessage(U2), this.worker.onmessage = (U3) => { + clearTimeout(V2), F2(U3), B(this, kU, false, "f"); + }; + }); + } +}; +EU = GU, kU = /* @__PURE__ */ new WeakMap(), mU = function(U2) { + U2.worker.terminate(), B(GU, EU, Q(GU, EU, "f", TU).filter((F2) => F2 !== U2), "f", TU); +}, TU = { value: [] }; +IU = /* @__PURE__ */ new WeakSet(), bU = async function(F2) { + var _a2; + const Q2 = await NU(F2); + if (Q2) + return (_a2 = Q2.text) != null ? _a2 : RU; + if (import_obsidian.Platform.isMobileApp) + return VU; + const B2 = JU(F2), R2 = new Uint8Array(await app.vault.readBinary(F2)), V2 = GU.getWorker(); + return new Promise(async (U2, Q3) => { + try { + const Q4 = (await V2.run({ data: R2, name: F2.basename })).data.text.replace(/\n/g, " ").replace(/ +/g, " ").trim(); + await SU(B2.folder, B2.filename, Q4, F2.path, ""), U2(Q4); + } catch (Q4) { + await SU(B2.folder, B2.filename, "", F2.path, ""), U2(""); + } + }); +}; +var nU = new class { + constructor() { + IU.add(this); + } + async getPdfText(U2) { + var _a2; + try { + return (_a2 = await FU.add(() => Q(this, IU, "m", bU).call(this, U2))) != null ? _a2 : ""; + } catch (F2) { + return console.warn(`Text Extractor - Error while extracting text from ${U2.basename}`), console.warn(F2), ""; + } + } +}(); +function iU(U2, F2, Q2) { + var B2 = F2 === void 0 ? null : F2, R2 = function(U3, F3) { + var Q3 = atob(U3); + if (F3) { + for (var B3 = new Uint8Array(Q3.length), R3 = 0, V3 = Q3.length; R3 < V3; ++R3) + B3[R3] = Q3.charCodeAt(R3); + return String.fromCharCode.apply(null, new Uint16Array(B3.buffer)); + } + return Q3; + }(U2, Q2 !== void 0 && Q2), V2 = R2.indexOf("\n", 10) + 1, l2 = R2.substring(V2) + (B2 ? "//# sourceMappingURL=" + B2 : ""), Z2 = new Blob([l2], { type: "application/javascript" }); + return URL.createObjectURL(Z2); +} +var XU; +var YU; +var hU; +var cU; +var pU; +var aU; +var MU = function(U2, F2, Q2) { + var B2; + return function(R2) { + return B2 = B2 || iU(U2, F2, Q2), new Worker(B2, R2); + }; +}("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGU9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSx0PVtdLG49W10scj0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxpPSExO2Z1bmN0aW9uIGEoKXtpPSEwO2Zvcih2YXIgZT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIscj0wO3I8NjQ7KytyKXRbcl09ZVtyXSxuW2UuY2hhckNvZGVBdChyKV09cjtuWyItIi5jaGFyQ29kZUF0KDApXT02MixuWyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiBvKGUsbixyKXtmb3IodmFyIGksYSxvPVtdLGM9bjtjPHI7Yys9MylpPShlW2NdPDwxNikrKGVbYysxXTw8OCkrZVtjKzJdLG8ucHVzaCh0WyhhPWkpPj4xOCY2M10rdFthPj4xMiY2M10rdFthPj42JjYzXSt0WzYzJmFdKTtyZXR1cm4gby5qb2luKCIiKX1mdW5jdGlvbiBjKGUpe3ZhciBuO2l8fGEoKTtmb3IodmFyIHI9ZS5sZW5ndGgsYz1yJTMscz0iIixsPVtdLHU9MTYzODMsZj0wLGQ9ci1jO2Y8ZDtmKz11KWwucHVzaChvKGUsZixmK3U+ZD9kOmYrdSkpO3JldHVybiAxPT09Yz8obj1lW3ItMV0scys9dFtuPj4yXSxzKz10W248PDQmNjNdLHMrPSI9PSIpOjI9PT1jJiYobj0oZVtyLTJdPDw4KStlW3ItMV0scys9dFtuPj4xMF0scys9dFtuPj40JjYzXSxzKz10W248PDImNjNdLHMrPSI9IiksbC5wdXNoKHMpLGwuam9pbigiIil9ZnVuY3Rpb24gcyhlLHQsbixyLGkpe3ZhciBhLG8sYz04Kmktci0xLHM9KDE8PGMpLTEsbD1zPj4xLHU9LTcsZj1uP2ktMTowLGQ9bj8tMToxLGg9ZVt0K2ZdO2ZvcihmKz1kLGE9aCYoMTw8LXUpLTEsaD4+PS11LHUrPWM7dT4wO2E9MjU2KmErZVt0K2ZdLGYrPWQsdS09OCk7Zm9yKG89YSYoMTw8LXUpLTEsYT4+PS11LHUrPXI7dT4wO289MjU2Km8rZVt0K2ZdLGYrPWQsdS09OCk7aWYoMD09PWEpYT0xLWw7ZWxzZXtpZihhPT09cylyZXR1cm4gbz9OYU46MS8wKihoPy0xOjEpO28rPU1hdGgucG93KDIsciksYS09bH1yZXR1cm4oaD8tMToxKSpvKk1hdGgucG93KDIsYS1yKX1mdW5jdGlvbiBsKGUsdCxuLHIsaSxhKXt2YXIgbyxjLHMsbD04KmEtaS0xLHU9KDE8PGwpLTEsZj11Pj4xLGQ9MjM9PT1pP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxoPXI/MDphLTEscD1yPzE6LTEsZz10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9TWF0aC5hYnModCksaXNOYU4odCl8fHQ9PT0xLzA/KGM9aXNOYU4odCk/MTowLG89dSk6KG89TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksdCoocz1NYXRoLnBvdygyLC1vKSk8MSYmKG8tLSxzKj0yKSwodCs9bytmPj0xP2QvczpkKk1hdGgucG93KDIsMS1mKSkqcz49MiYmKG8rKyxzLz0yKSxvK2Y+PXU/KGM9MCxvPXUpOm8rZj49MT8oYz0odCpzLTEpKk1hdGgucG93KDIsaSksbys9Zik6KGM9dCpNYXRoLnBvdygyLGYtMSkqTWF0aC5wb3coMixpKSxvPTApKTtpPj04O2VbbitoXT0yNTUmYyxoKz1wLGMvPTI1NixpLT04KTtmb3Iobz1vPDxpfGMsbCs9aTtsPjA7ZVtuK2hdPTI1NSZvLGgrPXAsby89MjU2LGwtPTgpO2VbbitoLXBdfD0xMjgqZ312YXIgdT17fS50b1N0cmluZyxmPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PXUuY2FsbChlKX07ZnVuY3Rpb24gZCgpe3JldHVybiBwLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIGgoZSx0KXtpZihkKCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gcC5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189cC5wcm90b3R5cGU6KG51bGw9PT1lJiYoZT1uZXcgcCh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBwKGUsdCxuKXtpZighKHAuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIHApKXJldHVybiBuZXcgcChlLHQsbik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBiKHRoaXMsZSl9cmV0dXJuIGcodGhpcyxlLHQsbil9ZnVuY3Rpb24gZyhlLHQsbixyKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQsbixyKXtpZih0LmJ5dGVMZW5ndGgsbjwwfHx0LmJ5dGVMZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxuKyhyfHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3Q9dm9pZCAwPT09biYmdm9pZCAwPT09cj9uZXcgVWludDhBcnJheSh0KTp2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KHQsbik6bmV3IFVpbnQ4QXJyYXkodCxuLHIpO3AuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT10KS5fX3Byb3RvX189cC5wcm90b3R5cGU6ZT15KGUsdCk7cmV0dXJuIGV9KGUsdCxuLHIpOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQsbil7InN0cmluZyI9PXR5cGVvZiBuJiYiIiE9PW58fChuPSJ1dGY4Iik7aWYoIXAuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgcj0wfEQodCxuKTtlPWgoZSxyKTt2YXIgaT1lLndyaXRlKHQsbik7aSE9PXImJihlPWUuc2xpY2UoMCxpKSk7cmV0dXJuIGV9KGUsdCxuKTpmdW5jdGlvbihlLHQpe2lmKHgodCkpe3ZhciBuPTB8dih0Lmxlbmd0aCk7cmV0dXJuIDA9PT0oZT1oKGUsbikpLmxlbmd0aHx8dC5jb3B5KGUsMCwwLG4pLGV9aWYodCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiB0KXJldHVybiJudW1iZXIiIT10eXBlb2YgdC5sZW5ndGh8fChyPXQubGVuZ3RoKSE9cj9oKGUsMCk6eShlLHQpO2lmKCJCdWZmZXIiPT09dC50eXBlJiZmKHQuZGF0YSkpcmV0dXJuIHkoZSx0LmRhdGEpfXZhciByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0oZSx0KX1mdW5jdGlvbiBtKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gYihlLHQpe2lmKG0odCksZT1oKGUsdDwwPzA6MHx2KHQpKSwhcC5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgbj0wO248dDsrK24pZVtuXT0wO3JldHVybiBlfWZ1bmN0aW9uIHkoZSx0KXt2YXIgbj10Lmxlbmd0aDwwPzA6MHx2KHQubGVuZ3RoKTtlPWgoZSxuKTtmb3IodmFyIHI9MDtyPG47cis9MSllW3JdPTI1NSZ0W3JdO3JldHVybiBlfWZ1bmN0aW9uIHYoZSl7aWYoZT49ZCgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IitkKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHxlfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIShudWxsPT1lfHwhZS5faXNCdWZmZXIpfWZ1bmN0aW9uIEQoZSx0KXtpZih4KGUpKXJldHVybiBlLmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpfHxlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiBlLmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiBlJiYoZT0iIitlKTt2YXIgbj1lLmxlbmd0aDtpZigwPT09bilyZXR1cm4gMDtmb3IodmFyIHI9ITE7Oylzd2l0Y2godCl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gbjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBZKGUpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqbjtjYXNlImhleCI6cmV0dXJuIG4+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gSyhlKS5sZW5ndGg7ZGVmYXVsdDppZihyKXJldHVybiBZKGUpLmxlbmd0aDt0PSgiIit0KS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIFQoZSx0LG4pe3ZhciByPSExO2lmKCh2b2lkIDA9PT10fHx0PDApJiYodD0wKSx0PnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1ufHxuPnRoaXMubGVuZ3RoKSYmKG49dGhpcy5sZW5ndGgpLG48PTApcmV0dXJuIiI7aWYoKG4+Pj49MCk8PSh0Pj4+PTApKXJldHVybiIiO2ZvcihlfHwoZT0idXRmOCIpOzspc3dpdGNoKGUpe2Nhc2UiaGV4IjpyZXR1cm4gQih0aGlzLHQsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gSSh0aGlzLHQsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIE4odGhpcyx0LG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIFAodGhpcyx0LG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gTyh0aGlzLHQsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBXKHRoaXMsdCxuKTtkZWZhdWx0OmlmKHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIitlKTtlPShlKyIiKS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIHcoZSx0LG4pe3ZhciByPWVbdF07ZVt0XT1lW25dLGVbbl09cn1mdW5jdGlvbiBfKGUsdCxuLHIsaSl7aWYoMD09PWUubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygbj8ocj1uLG49MCk6bj4yMTQ3NDgzNjQ3P249MjE0NzQ4MzY0NzpuPC0yMTQ3NDgzNjQ4JiYobj0tMjE0NzQ4MzY0OCksbj0rbixpc05hTihuKSYmKG49aT8wOmUubGVuZ3RoLTEpLG48MCYmKG49ZS5sZW5ndGgrbiksbj49ZS5sZW5ndGgpe2lmKGkpcmV0dXJuLTE7bj1lLmxlbmd0aC0xfWVsc2UgaWYobjwwKXtpZighaSlyZXR1cm4tMTtuPTB9aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD1wLmZyb20odCxyKSkseCh0KSlyZXR1cm4gMD09PXQubGVuZ3RoPy0xOkUoZSx0LG4scixpKTtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQmPTI1NSxwLlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGUsdCxuKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGUsdCxuKTpFKGUsW3RdLG4scixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBFKGUsdCxuLHIsaSl7dmFyIGEsbz0xLGM9ZS5sZW5ndGgscz10Lmxlbmd0aDtpZih2b2lkIDAhPT1yJiYoInVjczIiPT09KHI9U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09cnx8InV0ZjE2bGUiPT09cnx8InV0Zi0xNmxlIj09PXIpKXtpZihlLmxlbmd0aDwyfHx0Lmxlbmd0aDwyKXJldHVybi0xO289MixjLz0yLHMvPTIsbi89Mn1mdW5jdGlvbiBsKGUsdCl7cmV0dXJuIDE9PT1vP2VbdF06ZS5yZWFkVUludDE2QkUodCpvKX1pZihpKXt2YXIgdT0tMTtmb3IoYT1uO2E8YzthKyspaWYobChlLGEpPT09bCh0LC0xPT09dT8wOmEtdSkpe2lmKC0xPT09dSYmKHU9YSksYS11KzE9PT1zKXJldHVybiB1Km99ZWxzZS0xIT09dSYmKGEtPWEtdSksdT0tMX1lbHNlIGZvcihuK3M+YyYmKG49Yy1zKSxhPW47YT49MDthLS0pe2Zvcih2YXIgZj0hMCxkPTA7ZDxzO2QrKylpZihsKGUsYStkKSE9PWwodCxkKSl7Zj0hMTticmVha31pZihmKXJldHVybiBhfXJldHVybi0xfWZ1bmN0aW9uIFUoZSx0LG4scil7bj1OdW1iZXIobil8fDA7dmFyIGk9ZS5sZW5ndGgtbjtyPyhyPU51bWJlcihyKSk+aSYmKHI9aSk6cj1pO3ZhciBhPXQubGVuZ3RoO2lmKGElMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtyPmEvMiYmKHI9YS8yKTtmb3IodmFyIG89MDtvPHI7KytvKXt2YXIgYz1wYXJzZUludCh0LnN1YnN0cigyKm8sMiksMTYpO2lmKGlzTmFOKGMpKXJldHVybiBvO2VbbitvXT1jfXJldHVybiBvfWZ1bmN0aW9uIEEoZSx0LG4scil7cmV0dXJuIFooWSh0LGUubGVuZ3RoLW4pLGUsbixyKX1mdW5jdGlvbiBrKGUsdCxuLHIpe3JldHVybiBaKGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDsrK24pdC5wdXNoKDI1NSZlLmNoYXJDb2RlQXQobikpO3JldHVybiB0fSh0KSxlLG4scil9ZnVuY3Rpb24gUyhlLHQsbixyKXtyZXR1cm4gayhlLHQsbixyKX1mdW5jdGlvbiBDKGUsdCxuLHIpe3JldHVybiBaKEsodCksZSxuLHIpfWZ1bmN0aW9uIEYoZSx0LG4scil7cmV0dXJuIFooZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4scixpLGE9W10sbz0wO288ZS5sZW5ndGgmJiEoKHQtPTIpPDApOysrbylyPShuPWUuY2hhckNvZGVBdChvKSk+PjgsaT1uJTI1NixhLnB1c2goaSksYS5wdXNoKHIpO3JldHVybiBhfSh0LGUubGVuZ3RoLW4pLGUsbixyKX1mdW5jdGlvbiBPKGUsdCxuKXtyZXR1cm4gMD09PXQmJm49PT1lLmxlbmd0aD9jKGUpOmMoZS5zbGljZSh0LG4pKX1mdW5jdGlvbiBJKGUsdCxuKXtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgcj1bXSxpPXQ7aTxuOyl7dmFyIGEsbyxjLHMsbD1lW2ldLHU9bnVsbCxmPWw+MjM5PzQ6bD4yMjM/MzpsPjE5MT8yOjE7aWYoaStmPD1uKXN3aXRjaChmKXtjYXNlIDE6bDwxMjgmJih1PWwpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKGE9ZVtpKzFdKSkmJihzPSgzMSZsKTw8Nnw2MyZhKT4xMjcmJih1PXMpO2JyZWFrO2Nhc2UgMzphPWVbaSsxXSxvPWVbaSsyXSwxMjg9PSgxOTImYSkmJjEyOD09KDE5MiZvKSYmKHM9KDE1JmwpPDwxMnwoNjMmYSk8PDZ8NjMmbyk+MjA0NyYmKHM8NTUyOTZ8fHM+NTczNDMpJiYodT1zKTticmVhaztjYXNlIDQ6YT1lW2krMV0sbz1lW2krMl0sYz1lW2krM10sMTI4PT0oMTkyJmEpJiYxMjg9PSgxOTImbykmJjEyOD09KDE5MiZjKSYmKHM9KDE1JmwpPDwxOHwoNjMmYSk8PDEyfCg2MyZvKTw8Nnw2MyZjKT42NTUzNSYmczwxMTE0MTEyJiYodT1zKX1udWxsPT09dT8odT02NTUzMyxmPTEpOnU+NjU1MzUmJih1LT02NTUzNixyLnB1c2godT4+PjEwJjEwMjN8NTUyOTYpLHU9NTYzMjB8MTAyMyZ1KSxyLnB1c2godSksaSs9Zn1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodDw9UilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZSk7dmFyIG49IiIscj0wO2Zvcig7cjx0OyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlLnNsaWNlKHIscis9UikpO3JldHVybiBufShyKX1wLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09ZS5UWVBFRF9BUlJBWV9TVVBQT1JUfHxlLlRZUEVEX0FSUkFZX1NVUFBPUlQsZCgpLHAucG9vbFNpemU9ODE5MixwLl9hdWdtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlLl9fcHJvdG9fXz1wLnByb3RvdHlwZSxlfSxwLmZyb209ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBnKG51bGwsZSx0LG4pfSxwLlRZUEVEX0FSUkFZX1NVUFBPUlQmJihwLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUscC5fX3Byb3RvX189VWludDhBcnJheSwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnNwZWNpZXMmJnBbU3ltYm9sLnNwZWNpZXNdKSxwLmFsbG9jPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG0odCksdDw9MD9oKGUsdCk6dm9pZCAwIT09bj8ic3RyaW5nIj09dHlwZW9mIHI/aChlLHQpLmZpbGwobixyKTpoKGUsdCkuZmlsbChuKTpoKGUsdCl9KG51bGwsZSx0LG4pfSxwLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe3JldHVybiBiKG51bGwsZSl9LHAuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKGUpe3JldHVybiBiKG51bGwsZSl9LHAuaXNCdWZmZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJighIWUuX2lzQnVmZmVyfHxKKGUpfHxmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZS5yZWFkRmxvYXRMRSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc2xpY2UmJkooZS5zbGljZSgwLDApKX0oZSkpfSxwLmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtpZigheChlKXx8IXgodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKGU9PT10KXJldHVybiAwO2Zvcih2YXIgbj1lLmxlbmd0aCxyPXQubGVuZ3RoLGk9MCxhPU1hdGgubWluKG4scik7aTxhOysraSlpZihlW2ldIT09dFtpXSl7bj1lW2ldLHI9dFtpXTticmVha31yZXR1cm4gbjxyPy0xOnI8bj8xOjB9LHAuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0scC5jb25jYXQ9ZnVuY3Rpb24oZSx0KXtpZighZihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PWUubGVuZ3RoKXJldHVybiBwLmFsbG9jKDApO3ZhciBuO2lmKHZvaWQgMD09PXQpZm9yKHQ9MCxuPTA7bjxlLmxlbmd0aDsrK24pdCs9ZVtuXS5sZW5ndGg7dmFyIHI9cC5hbGxvY1Vuc2FmZSh0KSxpPTA7Zm9yKG49MDtuPGUubGVuZ3RoOysrbil7dmFyIGE9ZVtuXTtpZigheChhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7YS5jb3B5KHIsaSksaSs9YS5sZW5ndGh9cmV0dXJuIHJ9LHAuYnl0ZUxlbmd0aD1ELHAucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxwLnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTIpdyh0aGlzLHQsdCsxKTtyZXR1cm4gdGhpc30scC5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz00KXcodGhpcyx0LHQrMyksdyh0aGlzLHQrMSx0KzIpO3JldHVybiB0aGlzfSxwLnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTgpdyh0aGlzLHQsdCs3KSx3KHRoaXMsdCsxLHQrNiksdyh0aGlzLHQrMix0KzUpLHcodGhpcyx0KzMsdCs0KTtyZXR1cm4gdGhpc30scC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09ZT8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9JKHRoaXMsMCxlKTpULmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKGUpe2lmKCF4KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PWV8fDA9PT1wLmNvbXBhcmUodGhpcyxlKX0scC5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciBlPSIiO3JldHVybiB0aGlzLmxlbmd0aD4wJiYoZT10aGlzLnRvU3RyaW5nKCJoZXgiLDAsNTApLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD41MCYmKGUrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK2UrIj4ifSxwLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYoIXgoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PW4mJihuPWU/ZS5sZW5ndGg6MCksdm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLHQ8MHx8bj5lLmxlbmd0aHx8cjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPj1pJiZ0Pj1uKXJldHVybiAwO2lmKHI+PWkpcmV0dXJuLTE7aWYodD49bilyZXR1cm4gMTtpZih0aGlzPT09ZSlyZXR1cm4gMDtmb3IodmFyIGE9KGk+Pj49MCktKHI+Pj49MCksbz0obj4+Pj0wKS0odD4+Pj0wKSxjPU1hdGgubWluKGEsbykscz10aGlzLnNsaWNlKHIsaSksbD1lLnNsaWNlKHQsbiksdT0wO3U8YzsrK3UpaWYoc1t1XSE9PWxbdV0pe2E9c1t1XSxvPWxbdV07YnJlYWt9cmV0dXJuIGE8bz8tMTpvPGE/MTowfSxwLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbihlLHQsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YoZSx0LG4pfSxwLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gXyh0aGlzLGUsdCxuLCEwKX0scC5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBfKHRoaXMsZSx0LG4sITEpfSxwLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQsbixyKXtpZih2b2lkIDA9PT10KXI9InV0ZjgiLG49dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYodm9pZCAwPT09biYmInN0cmluZyI9PXR5cGVvZiB0KXI9dCxuPXRoaXMubGVuZ3RoLHQ9MDtlbHNle2lmKCFpc0Zpbml0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7dHw9MCxpc0Zpbml0ZShuKT8obnw9MCx2b2lkIDA9PT1yJiYocj0idXRmOCIpKToocj1uLG49dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC10O2lmKCh2b2lkIDA9PT1ufHxuPmkpJiYobj1pKSxlLmxlbmd0aD4wJiYobjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO3J8fChyPSJ1dGY4Iik7Zm9yKHZhciBhPSExOzspc3dpdGNoKHIpe2Nhc2UiaGV4IjpyZXR1cm4gVSh0aGlzLGUsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBBKHRoaXMsZSx0LG4pO2Nhc2UiYXNjaWkiOnJldHVybiBrKHRoaXMsZSx0LG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIFModGhpcyxlLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBDKHRoaXMsZSx0LG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gRih0aGlzLGUsdCxuKTtkZWZhdWx0OmlmKGEpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKTtyPSgiIityKS50b0xvd2VyQ2FzZSgpLGE9ITB9fSxwLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciBSPTQwOTY7ZnVuY3Rpb24gTihlLHQsbil7dmFyIHI9IiI7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIGk9dDtpPG47KytpKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JmVbaV0pO3JldHVybiByfWZ1bmN0aW9uIFAoZSx0LG4pe3ZhciByPSIiO249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciBpPXQ7aTxuOysraSlyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbaV0pO3JldHVybiByfWZ1bmN0aW9uIEIoZSx0LG4pe3ZhciByPWUubGVuZ3RoOyghdHx8dDwwKSYmKHQ9MCksKCFufHxuPDB8fG4+cikmJihuPXIpO2Zvcih2YXIgaT0iIixhPXQ7YTxuOysrYSlpKz1YKGVbYV0pO3JldHVybiBpfWZ1bmN0aW9uIFcoZSx0LG4pe2Zvcih2YXIgcj1lLnNsaWNlKHQsbiksaT0iIixhPTA7YTxyLmxlbmd0aDthKz0yKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUoclthXSsyNTYqclthKzFdKTtyZXR1cm4gaX1mdW5jdGlvbiBMKGUsdCxuKXtpZihlJTEhPTB8fGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYoZSt0Pm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBNKGUsdCxuLHIsaSxhKXtpZigheChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYodD5pfHx0PGEpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKG4rcj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gaihlLHQsbixyKXt0PDAmJih0PTY1NTM1K3QrMSk7Zm9yKHZhciBpPTAsYT1NYXRoLm1pbihlLmxlbmd0aC1uLDIpO2k8YTsrK2kpZVtuK2ldPSh0JjI1NTw8OCoocj9pOjEtaSkpPj4+OCoocj9pOjEtaSl9ZnVuY3Rpb24geihlLHQsbixyKXt0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKTtmb3IodmFyIGk9MCxhPU1hdGgubWluKGUubGVuZ3RoLW4sNCk7aTxhOysraSllW24raV09dD4+PjgqKHI/aTozLWkpJjI1NX1mdW5jdGlvbiBIKGUsdCxuLHIsaSxhKXtpZihuK3I+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gVihlLHQsbixyLGkpe3JldHVybiBpfHxIKGUsMCxuLDQpLGwoZSx0LG4sciwyMyw0KSxuKzR9ZnVuY3Rpb24gcShlLHQsbixyLGkpe3JldHVybiBpfHxIKGUsMCxuLDgpLGwoZSx0LG4sciw1Miw4KSxuKzh9cC5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXRoaXMubGVuZ3RoO2lmKChlPX5+ZSk8MD8oZSs9cik8MCYmKGU9MCk6ZT5yJiYoZT1yKSwodD12b2lkIDA9PT10P3I6fn50KTwwPyh0Kz1yKTwwJiYodD0wKTp0PnImJih0PXIpLHQ8ZSYmKHQ9ZSkscC5UWVBFRF9BUlJBWV9TVVBQT1JUKShuPXRoaXMuc3ViYXJyYXkoZSx0KSkuX19wcm90b19fPXAucHJvdG90eXBlO2Vsc2V7dmFyIGk9dC1lO249bmV3IHAoaSx2b2lkIDApO2Zvcih2YXIgYT0wO2E8aTsrK2EpblthXT10aGlzW2ErZV19cmV0dXJuIG59LHAucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxMKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbZV0saT0xLGE9MDsrK2E8dCYmKGkqPTI1Nik7KXIrPXRoaXNbZSthXSppO3JldHVybiByfSxwLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKGUsdCxuKXtlfD0wLHR8PTAsbnx8TChlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2UrLS10XSxpPTE7dD4wJiYoaSo9MjU2KTspcis9dGhpc1tlKy0tdF0qaTtyZXR1cm4gcn0scC5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEwoZSwxLHRoaXMubGVuZ3RoKSx0aGlzW2VdfSxwLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TChlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fSxwLnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TChlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDh8dGhpc1tlKzFdfSxwLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TChlLDQsdGhpcy5sZW5ndGgpLCh0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2KSsxNjc3NzIxNip0aGlzW2UrM119LHAucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxMKGUsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1tlXSsodGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdKX0scC5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKGUsdCxuKXtlfD0wLHR8PTAsbnx8TChlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2VdLGk9MSxhPTA7KythPHQmJihpKj0yNTYpOylyKz10aGlzW2UrYV0qaTtyZXR1cm4gcj49KGkqPTEyOCkmJihyLT1NYXRoLnBvdygyLDgqdCkpLHJ9LHAucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fEwoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dCxpPTEsYT10aGlzW2UrLS1yXTtyPjAmJihpKj0yNTYpOylhKz10aGlzW2UrLS1yXSppO3JldHVybiBhPj0oaSo9MTI4KSYmKGEtPU1hdGgucG93KDIsOCp0KSksYX0scC5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TChlLDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW2VdPy0xKigyNTUtdGhpc1tlXSsxKTp0aGlzW2VdfSxwLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbihlLHQpe3R8fEwoZSwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW2VdfHRoaXNbZSsxXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0scC5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24oZSx0KXt0fHxMKGUsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1tlKzFdfHRoaXNbZV08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LHAucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEwoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2fHRoaXNbZSszXTw8MjR9LHAucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEwoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdPDwyNHx0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM119LHAucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEwoZSw0LHRoaXMubGVuZ3RoKSxzKHRoaXMsZSwhMCwyMyw0KX0scC5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TChlLDQsdGhpcy5sZW5ndGgpLHModGhpcyxlLCExLDIzLDQpfSxwLnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TChlLDgsdGhpcy5sZW5ndGgpLHModGhpcyxlLCEwLDUyLDgpfSxwLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TChlLDgsdGhpcy5sZW5ndGgpLHModGhpcyxlLCExLDUyLDgpfSxwLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHQsbixyKXsoZT0rZSx0fD0wLG58PTAscil8fE0odGhpcyxlLHQsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgaT0xLGE9MDtmb3IodGhpc1t0XT0yNTUmZTsrK2E8biYmKGkqPTI1Nik7KXRoaXNbdCthXT1lL2kmMjU1O3JldHVybiB0K259LHAucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKGUsdCxuLHIpeyhlPStlLHR8PTAsbnw9MCxyKXx8TSh0aGlzLGUsdCxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBpPW4tMSxhPTE7Zm9yKHRoaXNbdCtpXT0yNTUmZTstLWk+PTAmJihhKj0yNTYpOyl0aGlzW3QraV09ZS9hJjI1NTtyZXR1cm4gdCtufSxwLnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fE0odGhpcyxlLHQsMSwyNTUsMCkscC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSx0aGlzW3RdPTI1NSZlLHQrMX0scC5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxNKHRoaXMsZSx0LDIsNjU1MzUsMCkscC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6aih0aGlzLGUsdCwhMCksdCsyfSxwLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fE0odGhpcyxlLHQsMiw2NTUzNSwwKSxwLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPTI1NSZlKTpqKHRoaXMsZSx0LCExKSx0KzJ9LHAucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8TSh0aGlzLGUsdCw0LDQyOTQ5NjcyOTUsMCkscC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3QrM109ZT4+PjI0LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdF09MjU1JmUpOnoodGhpcyxlLHQsITApLHQrNH0scC5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxNKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxwLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6eih0aGlzLGUsdCwhMSksdCs0fSxwLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9K2UsdHw9MCwhcil7dmFyIGk9TWF0aC5wb3coMiw4Km4tMSk7TSh0aGlzLGUsdCxuLGktMSwtaSl9dmFyIGE9MCxvPTEsYz0wO2Zvcih0aGlzW3RdPTI1NSZlOysrYTxuJiYobyo9MjU2KTspZTwwJiYwPT09YyYmMCE9PXRoaXNbdCthLTFdJiYoYz0xKSx0aGlzW3QrYV09KGUvbz4+MCktYyYyNTU7cmV0dXJuIHQrbn0scC5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbihlLHQsbixyKXtpZihlPStlLHR8PTAsIXIpe3ZhciBpPU1hdGgucG93KDIsOCpuLTEpO00odGhpcyxlLHQsbixpLTEsLWkpfXZhciBhPW4tMSxvPTEsYz0wO2Zvcih0aGlzW3QrYV09MjU1JmU7LS1hPj0wJiYobyo9MjU2KTspZTwwJiYwPT09YyYmMCE9PXRoaXNbdCthKzFdJiYoYz0xKSx0aGlzW3QrYV09KGUvbz4+MCktYyYyNTU7cmV0dXJuIHQrbn0scC5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fE0odGhpcyxlLHQsMSwxMjcsLTEyOCkscC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSxlPDAmJihlPTI1NStlKzEpLHRoaXNbdF09MjU1JmUsdCsxfSxwLnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8TSh0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCkscC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6aih0aGlzLGUsdCwhMCksdCsyfSxwLnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8TSh0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCkscC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6aih0aGlzLGUsdCwhMSksdCsyfSxwLnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8TSh0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHAuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrM109ZT4+PjI0KTp6KHRoaXMsZSx0LCEwKSx0KzR9LHAucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxNKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSkscC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOnoodGhpcyxlLHQsITEpLHQrNH0scC5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gVih0aGlzLGUsdCwhMCxuKX0scC5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gVih0aGlzLGUsdCwhMSxuKX0scC5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHEodGhpcyxlLHQsITAsbil9LHAucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBxKHRoaXMsZSx0LCExLG4pfSxwLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGUsdCxuLHIpe2lmKG58fChuPTApLHJ8fDA9PT1yfHwocj10aGlzLmxlbmd0aCksdD49ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSx0fHwodD0wKSxyPjAmJnI8biYmKHI9bikscj09PW4pcmV0dXJuIDA7aWYoMD09PWUubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtyPnRoaXMubGVuZ3RoJiYocj10aGlzLmxlbmd0aCksZS5sZW5ndGgtdDxyLW4mJihyPWUubGVuZ3RoLXQrbik7dmFyIGksYT1yLW47aWYodGhpcz09PWUmJm48dCYmdDxyKWZvcihpPWEtMTtpPj0wOy0taSllW2krdF09dGhpc1tpK25dO2Vsc2UgaWYoYTwxZTN8fCFwLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKGk9MDtpPGE7KytpKWVbaSt0XT10aGlzW2krbl07ZWxzZSBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChlLHRoaXMuc3ViYXJyYXkobixuK2EpLHQpO3JldHVybiBhfSxwLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0PyhyPXQsdD0wLG49dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgbiYmKHI9bixuPXRoaXMubGVuZ3RoKSwxPT09ZS5sZW5ndGgpe3ZhciBpPWUuY2hhckNvZGVBdCgwKTtpPDI1NiYmKGU9aSl9aWYodm9pZCAwIT09ciYmInN0cmluZyIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIHImJiFwLmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKX1lbHNlIm51bWJlciI9PXR5cGVvZiBlJiYoZSY9MjU1KTtpZih0PDB8fHRoaXMubGVuZ3RoPHR8fHRoaXMubGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKG48PXQpcmV0dXJuIHRoaXM7dmFyIGE7aWYodD4+Pj0wLG49dm9pZCAwPT09bj90aGlzLmxlbmd0aDpuPj4+MCxlfHwoZT0wKSwibnVtYmVyIj09dHlwZW9mIGUpZm9yKGE9dDthPG47KythKXRoaXNbYV09ZTtlbHNle3ZhciBvPXgoZSk/ZTpZKG5ldyBwKGUscikudG9TdHJpbmcoKSksYz1vLmxlbmd0aDtmb3IoYT0wO2E8bi10OysrYSl0aGlzW2ErdF09b1thJWNdfXJldHVybiB0aGlzfTt2YXIgRz0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiBYKGUpe3JldHVybiBlPDE2PyIwIitlLnRvU3RyaW5nKDE2KTplLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBZKGUsdCl7dmFyIG47dD10fHwxLzA7Zm9yKHZhciByPWUubGVuZ3RoLGk9bnVsbCxhPVtdLG89MDtvPHI7KytvKXtpZigobj1lLmNoYXJDb2RlQXQobykpPjU1Mjk1JiZuPDU3MzQ0KXtpZighaSl7aWYobj41NjMxOSl7KHQtPTMpPi0xJiZhLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKG8rMT09PXIpeyh0LT0zKT4tMSYmYS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPW47Y29udGludWV9aWYobjw1NjMyMCl7KHQtPTMpPi0xJiZhLnB1c2goMjM5LDE5MSwxODkpLGk9bjtjb250aW51ZX1uPTY1NTM2KyhpLTU1Mjk2PDwxMHxuLTU2MzIwKX1lbHNlIGkmJih0LT0zKT4tMSYmYS5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwsbjwxMjgpe2lmKCh0LT0xKTwwKWJyZWFrO2EucHVzaChuKX1lbHNlIGlmKG48MjA0OCl7aWYoKHQtPTIpPDApYnJlYWs7YS5wdXNoKG4+PjZ8MTkyLDYzJm58MTI4KX1lbHNlIGlmKG48NjU1MzYpe2lmKCh0LT0zKTwwKWJyZWFrO2EucHVzaChuPj4xMnwyMjQsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfWVsc2V7aWYoIShuPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKHQtPTQpPDApYnJlYWs7YS5wdXNoKG4+PjE4fDI0MCxuPj4xMiY2M3wxMjgsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfX1yZXR1cm4gYX1mdW5jdGlvbiBLKGUpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdCxvLGMscyxsLHU7aXx8YSgpO3ZhciBmPWUubGVuZ3RoO2lmKGYlND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO2w9Ij0iPT09ZVtmLTJdPzI6Ij0iPT09ZVtmLTFdPzE6MCx1PW5ldyByKDMqZi80LWwpLGM9bD4wP2YtNDpmO3ZhciBkPTA7Zm9yKHQ9MCxvPTA7dDxjO3QrPTQsbys9MylzPW5bZS5jaGFyQ29kZUF0KHQpXTw8MTh8bltlLmNoYXJDb2RlQXQodCsxKV08PDEyfG5bZS5jaGFyQ29kZUF0KHQrMildPDw2fG5bZS5jaGFyQ29kZUF0KHQrMyldLHVbZCsrXT1zPj4xNiYyNTUsdVtkKytdPXM+PjgmMjU1LHVbZCsrXT0yNTUmcztyZXR1cm4gMj09PWw/KHM9bltlLmNoYXJDb2RlQXQodCldPDwyfG5bZS5jaGFyQ29kZUF0KHQrMSldPj40LHVbZCsrXT0yNTUmcyk6MT09PWwmJihzPW5bZS5jaGFyQ29kZUF0KHQpXTw8MTB8bltlLmNoYXJDb2RlQXQodCsxKV08PDR8bltlLmNoYXJDb2RlQXQodCsyKV0+PjIsdVtkKytdPXM+PjgmMjU1LHVbZCsrXT0yNTUmcyksdX0oZnVuY3Rpb24oZSl7aWYoKGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0oZSkucmVwbGFjZShHLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtlLmxlbmd0aCU0IT0wOyllKz0iPSI7cmV0dXJuIGV9KGUpKX1mdW5jdGlvbiBaKGUsdCxuLHIpe2Zvcih2YXIgaT0wO2k8ciYmIShpK24+PXQubGVuZ3RofHxpPj1lLmxlbmd0aCk7KytpKXRbaStuXT1lW2ldO3JldHVybiBpfWZ1bmN0aW9uIEooZSl7cmV0dXJuISFlLmNvbnN0cnVjdG9yJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihlKX12YXIgUT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uIGVlKGUpe2lmKGUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgdD1lLmRlZmF1bHQ7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpe3ZhciBuPWZ1bmN0aW9uIGUoKXtpZih0aGlzIGluc3RhbmNlb2YgZSl7dmFyIG49W251bGxdO3JldHVybiBuLnB1c2guYXBwbHkobixhcmd1bWVudHMpLG5ldyhGdW5jdGlvbi5iaW5kLmFwcGx5KHQsbikpfXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX07bi5wcm90b3R5cGU9dC5wcm90b3R5cGV9ZWxzZSBuPXt9O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHQsci5nZXQ/cjp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVt0XX19KX0pKSxufXZhciB0ZT17fSxuZT0iMS4xMy42IixyZT0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYuc2VsZj09PXNlbGYmJnNlbGZ8fCJvYmplY3QiPT10eXBlb2YgZSYmZS5nbG9iYWw9PT1lJiZlfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfHx7fSxpZT1BcnJheS5wcm90b3R5cGUsYWU9T2JqZWN0LnByb3RvdHlwZSxvZT0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbD9TeW1ib2wucHJvdG90eXBlOm51bGwsY2U9aWUucHVzaCxzZT1pZS5zbGljZSxsZT1hZS50b1N0cmluZyx1ZT1hZS5oYXNPd25Qcm9wZXJ0eSxmZT0idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyLGRlPSJ1bmRlZmluZWQiIT10eXBlb2YgRGF0YVZpZXcsaGU9QXJyYXkuaXNBcnJheSxwZT1PYmplY3Qua2V5cyxnZT1PYmplY3QuY3JlYXRlLG1lPWZlJiZBcnJheUJ1ZmZlci5pc1ZpZXcsYmU9aXNOYU4seWU9aXNGaW5pdGUsdmU9IXt0b1N0cmluZzpudWxsfS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgidG9TdHJpbmciKSx4ZT1bInZhbHVlT2YiLCJpc1Byb3RvdHlwZU9mIiwidG9TdHJpbmciLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsImhhc093blByb3BlcnR5IiwidG9Mb2NhbGVTdHJpbmciXSxEZT1NYXRoLnBvdygyLDUzKS0xO2Z1bmN0aW9uIFRlKGUsdCl7cmV0dXJuIHQ9bnVsbD09dD9lLmxlbmd0aC0xOit0LGZ1bmN0aW9uKCl7Zm9yKHZhciBuPU1hdGgubWF4KGFyZ3VtZW50cy5sZW5ndGgtdCwwKSxyPUFycmF5KG4pLGk9MDtpPG47aSsrKXJbaV09YXJndW1lbnRzW2krdF07c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gZS5jYWxsKHRoaXMscik7Y2FzZSAxOnJldHVybiBlLmNhbGwodGhpcyxhcmd1bWVudHNbMF0scik7Y2FzZSAyOnJldHVybiBlLmNhbGwodGhpcyxhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLHIpfXZhciBhPUFycmF5KHQrMSk7Zm9yKGk9MDtpPHQ7aSsrKWFbaV09YXJndW1lbnRzW2ldO3JldHVybiBhW3RdPXIsZS5hcHBseSh0aGlzLGEpfX1mdW5jdGlvbiB3ZShlKXt2YXIgdD10eXBlb2YgZTtyZXR1cm4iZnVuY3Rpb24iPT09dHx8Im9iamVjdCI9PT10JiYhIWV9ZnVuY3Rpb24gX2UoZSl7cmV0dXJuIG51bGw9PT1lfWZ1bmN0aW9uIEVlKGUpe3JldHVybiB2b2lkIDA9PT1lfWZ1bmN0aW9uIFVlKGUpe3JldHVybiEwPT09ZXx8ITE9PT1lfHwiW29iamVjdCBCb29sZWFuXSI9PT1sZS5jYWxsKGUpfWZ1bmN0aW9uIEFlKGUpe3JldHVybiEoIWV8fDEhPT1lLm5vZGVUeXBlKX1mdW5jdGlvbiBrZShlKXt2YXIgdD0iW29iamVjdCAiK2UrIl0iO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbGUuY2FsbChlKT09PXR9fXZhciBTZT1rZSgiU3RyaW5nIiksQ2U9a2UoIk51bWJlciIpLEZlPWtlKCJEYXRlIiksT2U9a2UoIlJlZ0V4cCIpLEllPWtlKCJFcnJvciIpLFJlPWtlKCJTeW1ib2wiKSxOZT1rZSgiQXJyYXlCdWZmZXIiKSxQZT1rZSgiRnVuY3Rpb24iKSxCZT1yZS5kb2N1bWVudCYmcmUuZG9jdW1lbnQuY2hpbGROb2RlczsiZnVuY3Rpb24iIT10eXBlb2YvLi8mJiJvYmplY3QiIT10eXBlb2YgSW50OEFycmF5JiYiZnVuY3Rpb24iIT10eXBlb2YgQmUmJihQZT1mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZXx8ITF9KTt2YXIgV2U9UGUsTGU9a2UoIk9iamVjdCIpLE1lPWRlJiZMZShuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDgpKSksamU9InVuZGVmaW5lZCIhPXR5cGVvZiBNYXAmJkxlKG5ldyBNYXApLHplPWtlKCJEYXRhVmlldyIpO3ZhciBIZT1NZT9mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmV2UoZS5nZXRJbnQ4KSYmTmUoZS5idWZmZXIpfTp6ZSxWZT1oZXx8a2UoIkFycmF5Iik7ZnVuY3Rpb24gcWUoZSx0KXtyZXR1cm4gbnVsbCE9ZSYmdWUuY2FsbChlLHQpfXZhciBHZT1rZSgiQXJndW1lbnRzIik7IWZ1bmN0aW9uKCl7R2UoYXJndW1lbnRzKXx8KEdlPWZ1bmN0aW9uKGUpe3JldHVybiBxZShlLCJjYWxsZWUiKX0pfSgpO3ZhciBYZT1HZTtmdW5jdGlvbiAkZShlKXtyZXR1cm4hUmUoZSkmJnllKGUpJiYhaXNOYU4ocGFyc2VGbG9hdChlKSl9ZnVuY3Rpb24gWWUoZSl7cmV0dXJuIENlKGUpJiZiZShlKX1mdW5jdGlvbiBLZShlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZX19ZnVuY3Rpb24gWmUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPWUodCk7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBuJiZuPj0wJiZuPD1EZX19ZnVuY3Rpb24gSmUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfX12YXIgUWU9SmUoImJ5dGVMZW5ndGgiKSxldD1aZShRZSksdHQ9L1xbb2JqZWN0ICgoSXxVaSludCg4fDE2fDMyKXxGbG9hdCgzMnw2NCl8VWludDhDbGFtcGVkfEJpZyhJfFVpKW50NjQpQXJyYXlcXS87dmFyIG50PWZlP2Z1bmN0aW9uKGUpe3JldHVybiBtZT9tZShlKSYmIUhlKGUpOmV0KGUpJiZ0dC50ZXN0KGxlLmNhbGwoZSkpfTpLZSghMSkscnQ9SmUoImxlbmd0aCIpO2Z1bmN0aW9uIGl0KGUsdCl7dD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9e30sbj1lLmxlbmd0aCxyPTA7cjxuOysrcil0W2Vbcl1dPSEwO3JldHVybntjb250YWluczpmdW5jdGlvbihlKXtyZXR1cm4hMD09PXRbZV19LHB1c2g6ZnVuY3Rpb24obil7cmV0dXJuIHRbbl09ITAsZS5wdXNoKG4pfX19KHQpO3ZhciBuPXhlLmxlbmd0aCxyPWUuY29uc3RydWN0b3IsaT1XZShyKSYmci5wcm90b3R5cGV8fGFlLGE9ImNvbnN0cnVjdG9yIjtmb3IocWUoZSxhKSYmIXQuY29udGFpbnMoYSkmJnQucHVzaChhKTtuLS07KShhPXhlW25dKWluIGUmJmVbYV0hPT1pW2FdJiYhdC5jb250YWlucyhhKSYmdC5wdXNoKGEpfWZ1bmN0aW9uIGF0KGUpe2lmKCF3ZShlKSlyZXR1cm5bXTtpZihwZSlyZXR1cm4gcGUoZSk7dmFyIHQ9W107Zm9yKHZhciBuIGluIGUpcWUoZSxuKSYmdC5wdXNoKG4pO3JldHVybiB2ZSYmaXQoZSx0KSx0fWZ1bmN0aW9uIG90KGUpe2lmKG51bGw9PWUpcmV0dXJuITA7dmFyIHQ9cnQoZSk7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiYoVmUoZSl8fFNlKGUpfHxYZShlKSk/MD09PXQ6MD09PXJ0KGF0KGUpKX1mdW5jdGlvbiBjdChlLHQpe3ZhciBuPWF0KHQpLHI9bi5sZW5ndGg7aWYobnVsbD09ZSlyZXR1cm4hcjtmb3IodmFyIGk9T2JqZWN0KGUpLGE9MDthPHI7YSsrKXt2YXIgbz1uW2FdO2lmKHRbb10hPT1pW29dfHwhKG8gaW4gaSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gc3QoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBzdD9lOnRoaXMgaW5zdGFuY2VvZiBzdD92b2lkKHRoaXMuX3dyYXBwZWQ9ZSk6bmV3IHN0KGUpfWZ1bmN0aW9uIGx0KGUpe3JldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlcnx8ZSxlLmJ5dGVPZmZzZXR8fDAsUWUoZSkpfXN0LlZFUlNJT049bmUsc3QucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyYXBwZWR9LHN0LnByb3RvdHlwZS52YWx1ZU9mPXN0LnByb3RvdHlwZS50b0pTT049c3QucHJvdG90eXBlLnZhbHVlLHN0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBTdHJpbmcodGhpcy5fd3JhcHBlZCl9O3ZhciB1dD0iW29iamVjdCBEYXRhVmlld10iO2Z1bmN0aW9uIGZ0KGUsdCxuLHIpe2lmKGU9PT10KXJldHVybiAwIT09ZXx8MS9lPT0xL3Q7aWYobnVsbD09ZXx8bnVsbD09dClyZXR1cm4hMTtpZihlIT1lKXJldHVybiB0IT10O3ZhciBpPXR5cGVvZiBlO3JldHVybigiZnVuY3Rpb24iPT09aXx8Im9iamVjdCI9PT1pfHwib2JqZWN0Ij09dHlwZW9mIHQpJiZkdChlLHQsbixyKX1mdW5jdGlvbiBkdChlLHQsbixyKXtlIGluc3RhbmNlb2Ygc3QmJihlPWUuX3dyYXBwZWQpLHQgaW5zdGFuY2VvZiBzdCYmKHQ9dC5fd3JhcHBlZCk7dmFyIGk9bGUuY2FsbChlKTtpZihpIT09bGUuY2FsbCh0KSlyZXR1cm4hMTtpZihNZSYmIltvYmplY3QgT2JqZWN0XSI9PWkmJkhlKGUpKXtpZighSGUodCkpcmV0dXJuITE7aT11dH1zd2l0Y2goaSl7Y2FzZSJbb2JqZWN0IFJlZ0V4cF0iOmNhc2UiW29iamVjdCBTdHJpbmddIjpyZXR1cm4iIitlPT0iIit0O2Nhc2UiW29iamVjdCBOdW1iZXJdIjpyZXR1cm4rZSE9K2U/K3QhPSt0OjA9PStlPzEvK2U9PTEvdDorZT09K3Q7Y2FzZSJbb2JqZWN0IERhdGVdIjpjYXNlIltvYmplY3QgQm9vbGVhbl0iOnJldHVybitlPT0rdDtjYXNlIltvYmplY3QgU3ltYm9sXSI6cmV0dXJuIG9lLnZhbHVlT2YuY2FsbChlKT09PW9lLnZhbHVlT2YuY2FsbCh0KTtjYXNlIltvYmplY3QgQXJyYXlCdWZmZXJdIjpjYXNlIHV0OnJldHVybiBkdChsdChlKSxsdCh0KSxuLHIpfXZhciBhPSJbb2JqZWN0IEFycmF5XSI9PT1pO2lmKCFhJiZudChlKSl7aWYoUWUoZSkhPT1RZSh0KSlyZXR1cm4hMTtpZihlLmJ1ZmZlcj09PXQuYnVmZmVyJiZlLmJ5dGVPZmZzZXQ9PT10LmJ5dGVPZmZzZXQpcmV0dXJuITA7YT0hMH1pZighYSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHwib2JqZWN0IiE9dHlwZW9mIHQpcmV0dXJuITE7dmFyIG89ZS5jb25zdHJ1Y3RvcixjPXQuY29uc3RydWN0b3I7aWYobyE9PWMmJiEoV2UobykmJm8gaW5zdGFuY2VvZiBvJiZXZShjKSYmYyBpbnN0YW5jZW9mIGMpJiYiY29uc3RydWN0b3IiaW4gZSYmImNvbnN0cnVjdG9yImluIHQpcmV0dXJuITF9cj1yfHxbXTtmb3IodmFyIHM9KG49bnx8W10pLmxlbmd0aDtzLS07KWlmKG5bc109PT1lKXJldHVybiByW3NdPT09dDtpZihuLnB1c2goZSksci5wdXNoKHQpLGEpe2lmKChzPWUubGVuZ3RoKSE9PXQubGVuZ3RoKXJldHVybiExO2Zvcig7cy0tOylpZighZnQoZVtzXSx0W3NdLG4scikpcmV0dXJuITF9ZWxzZXt2YXIgbCx1PWF0KGUpO2lmKHM9dS5sZW5ndGgsYXQodCkubGVuZ3RoIT09cylyZXR1cm4hMTtmb3IoO3MtLTspaWYoIXFlKHQsbD11W3NdKXx8IWZ0KGVbbF0sdFtsXSxuLHIpKXJldHVybiExfXJldHVybiBuLnBvcCgpLHIucG9wKCksITB9ZnVuY3Rpb24gaHQoZSx0KXtyZXR1cm4gZnQoZSx0KX1mdW5jdGlvbiBwdChlKXtpZighd2UoZSkpcmV0dXJuW107dmFyIHQ9W107Zm9yKHZhciBuIGluIGUpdC5wdXNoKG4pO3JldHVybiB2ZSYmaXQoZSx0KSx0fWZ1bmN0aW9uIGd0KGUpe3ZhciB0PXJ0KGUpO3JldHVybiBmdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiExO3ZhciByPXB0KG4pO2lmKHJ0KHIpKXJldHVybiExO2Zvcih2YXIgaT0wO2k8dDtpKyspaWYoIVdlKG5bZVtpXV0pKXJldHVybiExO3JldHVybiBlIT09eHR8fCFXZShuW210XSl9fXZhciBtdD0iZm9yRWFjaCIsYnQ9WyJjbGVhciIsImRlbGV0ZSJdLHl0PVsiZ2V0IiwiaGFzIiwic2V0Il0sdnQ9YnQuY29uY2F0KG10LHl0KSx4dD1idC5jb25jYXQoeXQpLER0PVsiYWRkIl0uY29uY2F0KGJ0LG10LCJoYXMiKSxUdD1qZT9ndCh2dCk6a2UoIk1hcCIpLHd0PWplP2d0KHh0KTprZSgiV2Vha01hcCIpLF90PWplP2d0KER0KTprZSgiU2V0IiksRXQ9a2UoIldlYWtTZXQiKTtmdW5jdGlvbiBVdChlKXtmb3IodmFyIHQ9YXQoZSksbj10Lmxlbmd0aCxyPUFycmF5KG4pLGk9MDtpPG47aSsrKXJbaV09ZVt0W2ldXTtyZXR1cm4gcn1mdW5jdGlvbiBBdChlKXtmb3IodmFyIHQ9YXQoZSksbj10Lmxlbmd0aCxyPUFycmF5KG4pLGk9MDtpPG47aSsrKXJbaV09W3RbaV0sZVt0W2ldXV07cmV0dXJuIHJ9ZnVuY3Rpb24ga3QoZSl7Zm9yKHZhciB0PXt9LG49YXQoZSkscj0wLGk9bi5sZW5ndGg7cjxpO3IrKyl0W2VbbltyXV1dPW5bcl07cmV0dXJuIHR9ZnVuY3Rpb24gU3QoZSl7dmFyIHQ9W107Zm9yKHZhciBuIGluIGUpV2UoZVtuXSkmJnQucHVzaChuKTtyZXR1cm4gdC5zb3J0KCl9ZnVuY3Rpb24gQ3QoZSx0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDtpZih0JiYobj1PYmplY3QobikpLHI8Mnx8bnVsbD09bilyZXR1cm4gbjtmb3IodmFyIGk9MTtpPHI7aSsrKWZvcih2YXIgYT1hcmd1bWVudHNbaV0sbz1lKGEpLGM9by5sZW5ndGgscz0wO3M8YztzKyspe3ZhciBsPW9bc107dCYmdm9pZCAwIT09bltsXXx8KG5bbF09YVtsXSl9cmV0dXJuIG59fXZhciBGdD1DdChwdCksT3Q9Q3QoYXQpLEl0PUN0KHB0LCEwKTtmdW5jdGlvbiBSdChlKXtpZighd2UoZSkpcmV0dXJue307aWYoZ2UpcmV0dXJuIGdlKGUpO3ZhciB0PWZ1bmN0aW9uKCl7fTt0LnByb3RvdHlwZT1lO3ZhciBuPW5ldyB0O3JldHVybiB0LnByb3RvdHlwZT1udWxsLG59ZnVuY3Rpb24gTnQoZSx0KXt2YXIgbj1SdChlKTtyZXR1cm4gdCYmT3Qobix0KSxufWZ1bmN0aW9uIFB0KGUpe3JldHVybiB3ZShlKT9WZShlKT9lLnNsaWNlKCk6RnQoe30sZSk6ZX1mdW5jdGlvbiBCdChlLHQpe3JldHVybiB0KGUpLGV9ZnVuY3Rpb24gV3QoZSl7cmV0dXJuIFZlKGUpP2U6W2VdfWZ1bmN0aW9uIEx0KGUpe3JldHVybiBzdC50b1BhdGgoZSl9ZnVuY3Rpb24gTXQoZSx0KXtmb3IodmFyIG49dC5sZW5ndGgscj0wO3I8bjtyKyspe2lmKG51bGw9PWUpcmV0dXJuO2U9ZVt0W3JdXX1yZXR1cm4gbj9lOnZvaWQgMH1mdW5jdGlvbiBqdChlLHQsbil7dmFyIHI9TXQoZSxMdCh0KSk7cmV0dXJuIEVlKHIpP246cn1mdW5jdGlvbiB6dChlLHQpe2Zvcih2YXIgbj0odD1MdCh0KSkubGVuZ3RoLHI9MDtyPG47cisrKXt2YXIgaT10W3JdO2lmKCFxZShlLGkpKXJldHVybiExO2U9ZVtpXX1yZXR1cm4hIW59ZnVuY3Rpb24gSHQoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gVnQoZSl7cmV0dXJuIGU9T3Qoe30sZSksZnVuY3Rpb24odCl7cmV0dXJuIGN0KHQsZSl9fWZ1bmN0aW9uIHF0KGUpe3JldHVybiBlPUx0KGUpLGZ1bmN0aW9uKHQpe3JldHVybiBNdCh0LGUpfX1mdW5jdGlvbiBHdChlLHQsbil7aWYodm9pZCAwPT09dClyZXR1cm4gZTtzd2l0Y2gobnVsbD09bj8zOm4pe2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUuY2FsbCh0LG4pfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKG4scixpKXtyZXR1cm4gZS5jYWxsKHQsbixyLGkpfTtjYXNlIDQ6cmV0dXJuIGZ1bmN0aW9uKG4scixpLGEpe3JldHVybiBlLmNhbGwodCxuLHIsaSxhKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodCxhcmd1bWVudHMpfX1mdW5jdGlvbiBYdChlLHQsbil7cmV0dXJuIG51bGw9PWU/SHQ6V2UoZSk/R3QoZSx0LG4pOndlKGUpJiYhVmUoZSk/VnQoZSk6cXQoZSl9ZnVuY3Rpb24gJHQoZSx0KXtyZXR1cm4gWHQoZSx0LDEvMCl9ZnVuY3Rpb24gWXQoZSx0LG4pe3JldHVybiBzdC5pdGVyYXRlZSE9PSR0P3N0Lml0ZXJhdGVlKGUsdCk6WHQoZSx0LG4pfWZ1bmN0aW9uIEt0KGUsdCxuKXt0PVl0KHQsbik7Zm9yKHZhciByPWF0KGUpLGk9ci5sZW5ndGgsYT17fSxvPTA7bzxpO28rKyl7dmFyIGM9cltvXTthW2NdPXQoZVtjXSxjLGUpfXJldHVybiBhfWZ1bmN0aW9uIFp0KCl7fWZ1bmN0aW9uIEp0KGUpe3JldHVybiBudWxsPT1lP1p0OmZ1bmN0aW9uKHQpe3JldHVybiBqdChlLHQpfX1mdW5jdGlvbiBRdChlLHQsbil7dmFyIHI9QXJyYXkoTWF0aC5tYXgoMCxlKSk7dD1HdCh0LG4sMSk7Zm9yKHZhciBpPTA7aTxlO2krKylyW2ldPXQoaSk7cmV0dXJuIHJ9ZnVuY3Rpb24gZW4oZSx0KXtyZXR1cm4gbnVsbD09dCYmKHQ9ZSxlPTApLGUrTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKih0LWUrMSkpfXN0LnRvUGF0aD1XdCxzdC5pdGVyYXRlZT0kdDt2YXIgdG49RGF0ZS5ub3d8fGZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9O2Z1bmN0aW9uIG5uKGUpe3ZhciB0PWZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfSxuPSIoPzoiK2F0KGUpLmpvaW4oInwiKSsiKSIscj1SZWdFeHAobiksaT1SZWdFeHAobiwiZyIpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZT1udWxsPT1lPyIiOiIiK2Usci50ZXN0KGUpP2UucmVwbGFjZShpLHQpOmV9fXZhciBybj17IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjeDI3OyIsImAiOiImI3g2MDsifSxhbj1ubihybiksb249bm4oa3Qocm4pKSxjbj1zdC50ZW1wbGF0ZVNldHRpbmdzPXtldmFsdWF0ZTovPCUoW1xzXFNdKz8pJT4vZyxpbnRlcnBvbGF0ZTovPCU9KFtcc1xTXSs/KSU+L2csZXNjYXBlOi88JS0oW1xzXFNdKz8pJT4vZ30sc249LyguKV4vLGxuPXsiJyI6IiciLCJcXCI6IlxcIiwiXHIiOiJyIiwiXG4iOiJuIiwiXHUyMDI4IjoidTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9LHVuPS9cXHwnfFxyfFxufFx1MjAyOHxcdTIwMjkvZztmdW5jdGlvbiBmbihlKXtyZXR1cm4iXFwiK2xuW2VdfXZhciBkbj0vXlxzKihcd3xcJCkrXHMqJC87ZnVuY3Rpb24gaG4oZSx0LG4peyF0JiZuJiYodD1uKSx0PUl0KHt9LHQsc3QudGVtcGxhdGVTZXR0aW5ncyk7dmFyIHI9UmVnRXhwKFsodC5lc2NhcGV8fHNuKS5zb3VyY2UsKHQuaW50ZXJwb2xhdGV8fHNuKS5zb3VyY2UsKHQuZXZhbHVhdGV8fHNuKS5zb3VyY2VdLmpvaW4oInwiKSsifCQiLCJnIiksaT0wLGE9Il9fcCs9JyI7ZS5yZXBsYWNlKHIsKGZ1bmN0aW9uKHQsbixyLG8sYyl7cmV0dXJuIGErPWUuc2xpY2UoaSxjKS5yZXBsYWNlKHVuLGZuKSxpPWMrdC5sZW5ndGgsbj9hKz0iJytcbigoX190PSgiK24rIikpPT1udWxsPycnOl8uZXNjYXBlKF9fdCkpK1xuJyI6cj9hKz0iJytcbigoX190PSgiK3IrIikpPT1udWxsPycnOl9fdCkrXG4nIjpvJiYoYSs9Iic7XG4iK28rIlxuX19wKz0nIiksdH0pKSxhKz0iJztcbiI7dmFyIG8sYz10LnZhcmlhYmxlO2lmKGMpe2lmKCFkbi50ZXN0KGMpKXRocm93IG5ldyBFcnJvcigidmFyaWFibGUgaXMgbm90IGEgYmFyZSBpZGVudGlmaWVyOiAiK2MpfWVsc2UgYT0id2l0aChvYmp8fHt9KXtcbiIrYSsifVxuIixjPSJvYmoiO2E9InZhciBfX3QsX19wPScnLF9faj1BcnJheS5wcm90b3R5cGUuam9pbixwcmludD1mdW5jdGlvbigpe19fcCs9X19qLmNhbGwoYXJndW1lbnRzLCcnKTt9O1xuIithKyJyZXR1cm4gX19wO1xuIjt0cnl7bz1uZXcgRnVuY3Rpb24oYywiXyIsYSl9Y2F0Y2goZSl7dGhyb3cgZS5zb3VyY2U9YSxlfXZhciBzPWZ1bmN0aW9uKGUpe3JldHVybiBvLmNhbGwodGhpcyxlLHN0KX07cmV0dXJuIHMuc291cmNlPSJmdW5jdGlvbigiK2MrIil7XG4iK2ErIn0iLHN9ZnVuY3Rpb24gcG4oZSx0LG4pe3ZhciByPSh0PUx0KHQpKS5sZW5ndGg7aWYoIXIpcmV0dXJuIFdlKG4pP24uY2FsbChlKTpuO2Zvcih2YXIgaT0wO2k8cjtpKyspe3ZhciBhPW51bGw9PWU/dm9pZCAwOmVbdFtpXV07dm9pZCAwPT09YSYmKGE9bixpPXIpLGU9V2UoYSk/YS5jYWxsKGUpOmF9cmV0dXJuIGV9dmFyIGduPTA7ZnVuY3Rpb24gbW4oZSl7dmFyIHQ9KytnbisiIjtyZXR1cm4gZT9lK3Q6dH1mdW5jdGlvbiBibihlKXt2YXIgdD1zdChlKTtyZXR1cm4gdC5fY2hhaW49ITAsdH1mdW5jdGlvbiB5bihlLHQsbixyLGkpe2lmKCEociBpbnN0YW5jZW9mIHQpKXJldHVybiBlLmFwcGx5KG4saSk7dmFyIGE9UnQoZS5wcm90b3R5cGUpLG89ZS5hcHBseShhLGkpO3JldHVybiB3ZShvKT9vOmF9dmFyIHZuPVRlKChmdW5jdGlvbihlLHQpe3ZhciBuPXZuLnBsYWNlaG9sZGVyLHI9ZnVuY3Rpb24oKXtmb3IodmFyIGk9MCxhPXQubGVuZ3RoLG89QXJyYXkoYSksYz0wO2M8YTtjKyspb1tjXT10W2NdPT09bj9hcmd1bWVudHNbaSsrXTp0W2NdO2Zvcig7aTxhcmd1bWVudHMubGVuZ3RoOylvLnB1c2goYXJndW1lbnRzW2krK10pO3JldHVybiB5bihlLHIsdGhpcyx0aGlzLG8pfTtyZXR1cm4gcn0pKTt2bi5wbGFjZWhvbGRlcj1zdDt2YXIgeG49VGUoKGZ1bmN0aW9uKGUsdCxuKXtpZighV2UoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQmluZCBtdXN0IGJlIGNhbGxlZCBvbiBhIGZ1bmN0aW9uIik7dmFyIHI9VGUoKGZ1bmN0aW9uKGkpe3JldHVybiB5bihlLHIsdCx0aGlzLG4uY29uY2F0KGkpKX0pKTtyZXR1cm4gcn0pKSxEbj1aZShydCk7ZnVuY3Rpb24gVG4oZSx0LG4scil7aWYocj1yfHxbXSx0fHwwPT09dCl7aWYodDw9MClyZXR1cm4gci5jb25jYXQoZSl9ZWxzZSB0PTEvMDtmb3IodmFyIGk9ci5sZW5ndGgsYT0wLG89cnQoZSk7YTxvO2ErKyl7dmFyIGM9ZVthXTtpZihEbihjKSYmKFZlKGMpfHxYZShjKSkpaWYodD4xKVRuKGMsdC0xLG4sciksaT1yLmxlbmd0aDtlbHNlIGZvcih2YXIgcz0wLGw9Yy5sZW5ndGg7czxsOylyW2krK109Y1tzKytdO2Vsc2Ugbnx8KHJbaSsrXT1jKX1yZXR1cm4gcn12YXIgd249VGUoKGZ1bmN0aW9uKGUsdCl7dmFyIG49KHQ9VG4odCwhMSwhMSkpLmxlbmd0aDtpZihuPDEpdGhyb3cgbmV3IEVycm9yKCJiaW5kQWxsIG11c3QgYmUgcGFzc2VkIGZ1bmN0aW9uIG5hbWVzIik7Zm9yKDtuLS07KXt2YXIgcj10W25dO2Vbcl09eG4oZVtyXSxlKX1yZXR1cm4gZX0pKTtmdW5jdGlvbiBfbihlLHQpe3ZhciBuPWZ1bmN0aW9uKHIpe3ZhciBpPW4uY2FjaGUsYT0iIisodD90LmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyKTtyZXR1cm4gcWUoaSxhKXx8KGlbYV09ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGlbYV19O3JldHVybiBuLmNhY2hlPXt9LG59dmFyIEVuPVRlKChmdW5jdGlvbihlLHQsbil7cmV0dXJuIHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkobnVsbCxuKX0pLHQpfSkpLFVuPXZuKEVuLHN0LDEpO2Z1bmN0aW9uIEFuKGUsdCxuKXt2YXIgcixpLGEsbyxjPTA7bnx8KG49e30pO3ZhciBzPWZ1bmN0aW9uKCl7Yz0hMT09PW4ubGVhZGluZz8wOnRuKCkscj1udWxsLG89ZS5hcHBseShpLGEpLHJ8fChpPWE9bnVsbCl9LGw9ZnVuY3Rpb24oKXt2YXIgbD10bigpO2N8fCExIT09bi5sZWFkaW5nfHwoYz1sKTt2YXIgdT10LShsLWMpO3JldHVybiBpPXRoaXMsYT1hcmd1bWVudHMsdTw9MHx8dT50PyhyJiYoY2xlYXJUaW1lb3V0KHIpLHI9bnVsbCksYz1sLG89ZS5hcHBseShpLGEpLHJ8fChpPWE9bnVsbCkpOnJ8fCExPT09bi50cmFpbGluZ3x8KHI9c2V0VGltZW91dChzLHUpKSxvfTtyZXR1cm4gbC5jYW5jZWw9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQociksYz0wLHI9aT1hPW51bGx9LGx9ZnVuY3Rpb24ga24oZSx0LG4pe3ZhciByLGksYSxvLGMscz1mdW5jdGlvbigpe3ZhciBsPXRuKCktaTt0Pmw/cj1zZXRUaW1lb3V0KHMsdC1sKToocj1udWxsLG58fChvPWUuYXBwbHkoYyxhKSkscnx8KGE9Yz1udWxsKSl9LGw9VGUoKGZ1bmN0aW9uKGwpe3JldHVybiBjPXRoaXMsYT1sLGk9dG4oKSxyfHwocj1zZXRUaW1lb3V0KHMsdCksbiYmKG89ZS5hcHBseShjLGEpKSksb30pKTtyZXR1cm4gbC5jYW5jZWw9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQocikscj1hPWM9bnVsbH0sbH1mdW5jdGlvbiBTbihlLHQpe3JldHVybiB2bih0LGUpfWZ1bmN0aW9uIENuKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiFlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gRm4oKXt2YXIgZT1hcmd1bWVudHMsdD1lLmxlbmd0aC0xO3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgbj10LHI9ZVt0XS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bi0tOylyPWVbbl0uY2FsbCh0aGlzLHIpO3JldHVybiByfX1mdW5jdGlvbiBPbihlLHQpe3JldHVybiBmdW5jdGlvbigpe2lmKC0tZTwxKXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gSW4oZSx0KXt2YXIgbjtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tLWU+MCYmKG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGU8PTEmJih0PW51bGwpLG59fXZhciBSbj12bihJbiwyKTtmdW5jdGlvbiBObihlLHQsbil7dD1ZdCh0LG4pO2Zvcih2YXIgcixpPWF0KGUpLGE9MCxvPWkubGVuZ3RoO2E8bzthKyspaWYodChlW3I9aVthXV0scixlKSlyZXR1cm4gcn1mdW5jdGlvbiBQbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuLHIpe249WXQobixyKTtmb3IodmFyIGk9cnQodCksYT1lPjA/MDppLTE7YT49MCYmYTxpO2ErPWUpaWYobih0W2FdLGEsdCkpcmV0dXJuIGE7cmV0dXJuLTF9fXZhciBCbj1QbigxKSxXbj1QbigtMSk7ZnVuY3Rpb24gTG4oZSx0LG4scil7Zm9yKHZhciBpPShuPVl0KG4sciwxKSkodCksYT0wLG89cnQoZSk7YTxvOyl7dmFyIGM9TWF0aC5mbG9vcigoYStvKS8yKTtuKGVbY10pPGk/YT1jKzE6bz1jfXJldHVybiBhfWZ1bmN0aW9uIE1uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocixpLGEpe3ZhciBvPTAsYz1ydChyKTtpZigibnVtYmVyIj09dHlwZW9mIGEpZT4wP289YT49MD9hOk1hdGgubWF4KGErYyxvKTpjPWE+PTA/TWF0aC5taW4oYSsxLGMpOmErYysxO2Vsc2UgaWYobiYmYSYmYylyZXR1cm4gclthPW4ocixpKV09PT1pP2E6LTE7aWYoaSE9aSlyZXR1cm4oYT10KHNlLmNhbGwocixvLGMpLFllKSk+PTA/YStvOi0xO2ZvcihhPWU+MD9vOmMtMTthPj0wJiZhPGM7YSs9ZSlpZihyW2FdPT09aSlyZXR1cm4gYTtyZXR1cm4tMX19dmFyIGpuPU1uKDEsQm4sTG4pLHpuPU1uKC0xLFduKTtmdW5jdGlvbiBIbihlLHQsbil7dmFyIHI9KERuKGUpP0JuOk5uKShlLHQsbik7aWYodm9pZCAwIT09ciYmLTEhPT1yKXJldHVybiBlW3JdfWZ1bmN0aW9uIFZuKGUsdCl7cmV0dXJuIEhuKGUsVnQodCkpfWZ1bmN0aW9uIHFuKGUsdCxuKXt2YXIgcixpO2lmKHQ9R3QodCxuKSxEbihlKSlmb3Iocj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyl0KGVbcl0scixlKTtlbHNle3ZhciBhPWF0KGUpO2ZvcihyPTAsaT1hLmxlbmd0aDtyPGk7cisrKXQoZVthW3JdXSxhW3JdLGUpfXJldHVybiBlfWZ1bmN0aW9uIEduKGUsdCxuKXt0PVl0KHQsbik7Zm9yKHZhciByPSFEbihlKSYmYXQoZSksaT0ocnx8ZSkubGVuZ3RoLGE9QXJyYXkoaSksbz0wO288aTtvKyspe3ZhciBjPXI/cltvXTpvO2Fbb109dChlW2NdLGMsZSl9cmV0dXJuIGF9ZnVuY3Rpb24gWG4oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbixyLGkpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+PTM7cmV0dXJuIGZ1bmN0aW9uKHQsbixyLGkpe3ZhciBhPSFEbih0KSYmYXQodCksbz0oYXx8dCkubGVuZ3RoLGM9ZT4wPzA6by0xO2ZvcihpfHwocj10W2E/YVtjXTpjXSxjKz1lKTtjPj0wJiZjPG87Yys9ZSl7dmFyIHM9YT9hW2NdOmM7cj1uKHIsdFtzXSxzLHQpfXJldHVybiByfSh0LEd0KG4saSw0KSxyLGEpfX12YXIgJG49WG4oMSksWW49WG4oLTEpO2Z1bmN0aW9uIEtuKGUsdCxuKXt2YXIgcj1bXTtyZXR1cm4gdD1ZdCh0LG4pLHFuKGUsKGZ1bmN0aW9uKGUsbixpKXt0KGUsbixpKSYmci5wdXNoKGUpfSkpLHJ9ZnVuY3Rpb24gWm4oZSx0LG4pe3JldHVybiBLbihlLENuKFl0KHQpKSxuKX1mdW5jdGlvbiBKbihlLHQsbil7dD1ZdCh0LG4pO2Zvcih2YXIgcj0hRG4oZSkmJmF0KGUpLGk9KHJ8fGUpLmxlbmd0aCxhPTA7YTxpO2ErKyl7dmFyIG89cj9yW2FdOmE7aWYoIXQoZVtvXSxvLGUpKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIFFuKGUsdCxuKXt0PVl0KHQsbik7Zm9yKHZhciByPSFEbihlKSYmYXQoZSksaT0ocnx8ZSkubGVuZ3RoLGE9MDthPGk7YSsrKXt2YXIgbz1yP3JbYV06YTtpZih0KGVbb10sbyxlKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBlcihlLHQsbixyKXtyZXR1cm4gRG4oZSl8fChlPVV0KGUpKSwoIm51bWJlciIhPXR5cGVvZiBufHxyKSYmKG49MCksam4oZSx0LG4pPj0wfXZhciB0cj1UZSgoZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7cmV0dXJuIFdlKHQpP2k9dDoodD1MdCh0KSxyPXQuc2xpY2UoMCwtMSksdD10W3QubGVuZ3RoLTFdKSxHbihlLChmdW5jdGlvbihlKXt2YXIgYT1pO2lmKCFhKXtpZihyJiZyLmxlbmd0aCYmKGU9TXQoZSxyKSksbnVsbD09ZSlyZXR1cm47YT1lW3RdfXJldHVybiBudWxsPT1hP2E6YS5hcHBseShlLG4pfSkpfSkpO2Z1bmN0aW9uIG5yKGUsdCl7cmV0dXJuIEduKGUscXQodCkpfWZ1bmN0aW9uIHJyKGUsdCl7cmV0dXJuIEtuKGUsVnQodCkpfWZ1bmN0aW9uIGlyKGUsdCxuKXt2YXIgcixpLGE9LTEvMCxvPS0xLzA7aWYobnVsbD09dHx8Im51bWJlciI9PXR5cGVvZiB0JiYib2JqZWN0IiE9dHlwZW9mIGVbMF0mJm51bGwhPWUpZm9yKHZhciBjPTAscz0oZT1EbihlKT9lOlV0KGUpKS5sZW5ndGg7YzxzO2MrKyludWxsIT0ocj1lW2NdKSYmcj5hJiYoYT1yKTtlbHNlIHQ9WXQodCxuKSxxbihlLChmdW5jdGlvbihlLG4scil7KChpPXQoZSxuLHIpKT5vfHxpPT09LTEvMCYmYT09PS0xLzApJiYoYT1lLG89aSl9KSk7cmV0dXJuIGF9ZnVuY3Rpb24gYXIoZSx0LG4pe3ZhciByLGksYT0xLzAsbz0xLzA7aWYobnVsbD09dHx8Im51bWJlciI9PXR5cGVvZiB0JiYib2JqZWN0IiE9dHlwZW9mIGVbMF0mJm51bGwhPWUpZm9yKHZhciBjPTAscz0oZT1EbihlKT9lOlV0KGUpKS5sZW5ndGg7YzxzO2MrKyludWxsIT0ocj1lW2NdKSYmcjxhJiYoYT1yKTtlbHNlIHQ9WXQodCxuKSxxbihlLChmdW5jdGlvbihlLG4scil7KChpPXQoZSxuLHIpKTxvfHxpPT09MS8wJiZhPT09MS8wKSYmKGE9ZSxvPWkpfSkpO3JldHVybiBhfXZhciBvcj0vW15cdWQ4MDAtXHVkZmZmXXxbXHVkODAwLVx1ZGJmZl1bXHVkYzAwLVx1ZGZmZl18W1x1ZDgwMC1cdWRmZmZdL2c7ZnVuY3Rpb24gY3IoZSl7cmV0dXJuIGU/VmUoZSk/c2UuY2FsbChlKTpTZShlKT9lLm1hdGNoKG9yKTpEbihlKT9HbihlLEh0KTpVdChlKTpbXX1mdW5jdGlvbiBzcihlLHQsbil7aWYobnVsbD09dHx8bilyZXR1cm4gRG4oZSl8fChlPVV0KGUpKSxlW2VuKGUubGVuZ3RoLTEpXTt2YXIgcj1jcihlKSxpPXJ0KHIpO3Q9TWF0aC5tYXgoTWF0aC5taW4odCxpKSwwKTtmb3IodmFyIGE9aS0xLG89MDtvPHQ7bysrKXt2YXIgYz1lbihvLGEpLHM9cltvXTtyW29dPXJbY10scltjXT1zfXJldHVybiByLnNsaWNlKDAsdCl9ZnVuY3Rpb24gbHIoZSl7cmV0dXJuIHNyKGUsMS8wKX1mdW5jdGlvbiB1cihlLHQsbil7dmFyIHI9MDtyZXR1cm4gdD1ZdCh0LG4pLG5yKEduKGUsKGZ1bmN0aW9uKGUsbixpKXtyZXR1cm57dmFsdWU6ZSxpbmRleDpyKyssY3JpdGVyaWE6dChlLG4saSl9fSkpLnNvcnQoKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jcml0ZXJpYSxyPXQuY3JpdGVyaWE7aWYobiE9PXIpe2lmKG4+cnx8dm9pZCAwPT09bilyZXR1cm4gMTtpZihuPHJ8fHZvaWQgMD09PXIpcmV0dXJuLTF9cmV0dXJuIGUuaW5kZXgtdC5pbmRleH0pKSwidmFsdWUiKX1mdW5jdGlvbiBmcihlLHQpe3JldHVybiBmdW5jdGlvbihuLHIsaSl7dmFyIGE9dD9bW10sW11dOnt9O3JldHVybiByPVl0KHIsaSkscW4obiwoZnVuY3Rpb24odCxpKXt2YXIgbz1yKHQsaSxuKTtlKGEsdCxvKX0pKSxhfX12YXIgZHI9ZnIoKGZ1bmN0aW9uKGUsdCxuKXtxZShlLG4pP2Vbbl0ucHVzaCh0KTplW25dPVt0XX0pKSxocj1mcigoZnVuY3Rpb24oZSx0LG4pe2Vbbl09dH0pKSxwcj1mcigoZnVuY3Rpb24oZSx0LG4pe3FlKGUsbik/ZVtuXSsrOmVbbl09MX0pKSxncj1mcigoZnVuY3Rpb24oZSx0LG4pe2Vbbj8wOjFdLnB1c2godCl9KSwhMCk7ZnVuY3Rpb24gbXIoZSl7cmV0dXJuIG51bGw9PWU/MDpEbihlKT9lLmxlbmd0aDphdChlKS5sZW5ndGh9ZnVuY3Rpb24gYnIoZSx0LG4pe3JldHVybiB0IGluIG59dmFyIHlyPVRlKChmdW5jdGlvbihlLHQpe3ZhciBuPXt9LHI9dFswXTtpZihudWxsPT1lKXJldHVybiBuO1dlKHIpPyh0Lmxlbmd0aD4xJiYocj1HdChyLHRbMV0pKSx0PXB0KGUpKToocj1icix0PVRuKHQsITEsITEpLGU9T2JqZWN0KGUpKTtmb3IodmFyIGk9MCxhPXQubGVuZ3RoO2k8YTtpKyspe3ZhciBvPXRbaV0sYz1lW29dO3IoYyxvLGUpJiYobltvXT1jKX1yZXR1cm4gbn0pKSx2cj1UZSgoZnVuY3Rpb24oZSx0KXt2YXIgbixyPXRbMF07cmV0dXJuIFdlKHIpPyhyPUNuKHIpLHQubGVuZ3RoPjEmJihuPXRbMV0pKToodD1HbihUbih0LCExLCExKSxTdHJpbmcpLHI9ZnVuY3Rpb24oZSxuKXtyZXR1cm4hZXIodCxuKX0pLHlyKGUscixuKX0pKTtmdW5jdGlvbiB4cihlLHQsbil7cmV0dXJuIHNlLmNhbGwoZSwwLE1hdGgubWF4KDAsZS5sZW5ndGgtKG51bGw9PXR8fG4/MTp0KSkpfWZ1bmN0aW9uIERyKGUsdCxuKXtyZXR1cm4gbnVsbD09ZXx8ZS5sZW5ndGg8MT9udWxsPT10fHxuP3ZvaWQgMDpbXTpudWxsPT10fHxuP2VbMF06eHIoZSxlLmxlbmd0aC10KX1mdW5jdGlvbiBUcihlLHQsbil7cmV0dXJuIHNlLmNhbGwoZSxudWxsPT10fHxuPzE6dCl9ZnVuY3Rpb24gd3IoZSx0LG4pe3JldHVybiBudWxsPT1lfHxlLmxlbmd0aDwxP251bGw9PXR8fG4/dm9pZCAwOltdOm51bGw9PXR8fG4/ZVtlLmxlbmd0aC0xXTpUcihlLE1hdGgubWF4KDAsZS5sZW5ndGgtdCkpfWZ1bmN0aW9uIF9yKGUpe3JldHVybiBLbihlLEJvb2xlYW4pfWZ1bmN0aW9uIEVyKGUsdCl7cmV0dXJuIFRuKGUsdCwhMSl9dmFyIFVyPVRlKChmdW5jdGlvbihlLHQpe3JldHVybiB0PVRuKHQsITAsITApLEtuKGUsKGZ1bmN0aW9uKGUpe3JldHVybiFlcih0LGUpfSkpfSkpLEFyPVRlKChmdW5jdGlvbihlLHQpe3JldHVybiBVcihlLHQpfSkpO2Z1bmN0aW9uIGtyKGUsdCxuLHIpe1VlKHQpfHwocj1uLG49dCx0PSExKSxudWxsIT1uJiYobj1ZdChuLHIpKTtmb3IodmFyIGk9W10sYT1bXSxvPTAsYz1ydChlKTtvPGM7bysrKXt2YXIgcz1lW29dLGw9bj9uKHMsbyxlKTpzO3QmJiFuPyhvJiZhPT09bHx8aS5wdXNoKHMpLGE9bCk6bj9lcihhLGwpfHwoYS5wdXNoKGwpLGkucHVzaChzKSk6ZXIoaSxzKXx8aS5wdXNoKHMpfXJldHVybiBpfXZhciBTcj1UZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGtyKFRuKGUsITAsITApKX0pKTtmdW5jdGlvbiBDcihlKXtmb3IodmFyIHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoLHI9MCxpPXJ0KGUpO3I8aTtyKyspe3ZhciBhPWVbcl07aWYoIWVyKHQsYSkpe3ZhciBvO2ZvcihvPTE7bzxuJiZlcihhcmd1bWVudHNbb10sYSk7bysrKTtvPT09biYmdC5wdXNoKGEpfX1yZXR1cm4gdH1mdW5jdGlvbiBGcihlKXtmb3IodmFyIHQ9ZSYmaXIoZSxydCkubGVuZ3RofHwwLG49QXJyYXkodCkscj0wO3I8dDtyKyspbltyXT1ucihlLHIpO3JldHVybiBufXZhciBPcj1UZShGcik7ZnVuY3Rpb24gSXIoZSx0KXtmb3IodmFyIG49e30scj0wLGk9cnQoZSk7cjxpO3IrKyl0P25bZVtyXV09dFtyXTpuW2Vbcl1bMF1dPWVbcl1bMV07cmV0dXJuIG59ZnVuY3Rpb24gUnIoZSx0LG4pe251bGw9PXQmJih0PWV8fDAsZT0wKSxufHwobj10PGU/LTE6MSk7Zm9yKHZhciByPU1hdGgubWF4KE1hdGguY2VpbCgodC1lKS9uKSwwKSxpPUFycmF5KHIpLGE9MDthPHI7YSsrLGUrPW4paVthXT1lO3JldHVybiBpfWZ1bmN0aW9uIE5yKGUsdCl7aWYobnVsbD09dHx8dDwxKXJldHVybltdO2Zvcih2YXIgbj1bXSxyPTAsaT1lLmxlbmd0aDtyPGk7KW4ucHVzaChzZS5jYWxsKGUscixyKz10KSk7cmV0dXJuIG59ZnVuY3Rpb24gUHIoZSx0KXtyZXR1cm4gZS5fY2hhaW4/c3QodCkuY2hhaW4oKTp0fWZ1bmN0aW9uIEJyKGUpe3JldHVybiBxbihTdChlKSwoZnVuY3Rpb24odCl7dmFyIG49c3RbdF09ZVt0XTtzdC5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXt2YXIgZT1bdGhpcy5fd3JhcHBlZF07cmV0dXJuIGNlLmFwcGx5KGUsYXJndW1lbnRzKSxQcih0aGlzLG4uYXBwbHkoc3QsZSkpfX0pKSxzdH1xbihbInBvcCIsInB1c2giLCJyZXZlcnNlIiwic2hpZnQiLCJzb3J0Iiwic3BsaWNlIiwidW5zaGlmdCJdLChmdW5jdGlvbihlKXt2YXIgdD1pZVtlXTtzdC5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXt2YXIgbj10aGlzLl93cmFwcGVkO3JldHVybiBudWxsIT1uJiYodC5hcHBseShuLGFyZ3VtZW50cyksInNoaWZ0IiE9PWUmJiJzcGxpY2UiIT09ZXx8MCE9PW4ubGVuZ3RofHxkZWxldGUgblswXSksUHIodGhpcyxuKX19KSkscW4oWyJjb25jYXQiLCJqb2luIiwic2xpY2UiXSwoZnVuY3Rpb24oZSl7dmFyIHQ9aWVbZV07c3QucHJvdG90eXBlW2VdPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fd3JhcHBlZDtyZXR1cm4gbnVsbCE9ZSYmKGU9dC5hcHBseShlLGFyZ3VtZW50cykpLFByKHRoaXMsZSl9fSkpO3ZhciBXcj1CcihPYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxWRVJTSU9OOm5lLHJlc3RBcmd1bWVudHM6VGUsaXNPYmplY3Q6d2UsaXNOdWxsOl9lLGlzVW5kZWZpbmVkOkVlLGlzQm9vbGVhbjpVZSxpc0VsZW1lbnQ6QWUsaXNTdHJpbmc6U2UsaXNOdW1iZXI6Q2UsaXNEYXRlOkZlLGlzUmVnRXhwOk9lLGlzRXJyb3I6SWUsaXNTeW1ib2w6UmUsaXNBcnJheUJ1ZmZlcjpOZSxpc0RhdGFWaWV3OkhlLGlzQXJyYXk6VmUsaXNGdW5jdGlvbjpXZSxpc0FyZ3VtZW50czpYZSxpc0Zpbml0ZTokZSxpc05hTjpZZSxpc1R5cGVkQXJyYXk6bnQsaXNFbXB0eTpvdCxpc01hdGNoOmN0LGlzRXF1YWw6aHQsaXNNYXA6VHQsaXNXZWFrTWFwOnd0LGlzU2V0Ol90LGlzV2Vha1NldDpFdCxrZXlzOmF0LGFsbEtleXM6cHQsdmFsdWVzOlV0LHBhaXJzOkF0LGludmVydDprdCxmdW5jdGlvbnM6U3QsbWV0aG9kczpTdCxleHRlbmQ6RnQsZXh0ZW5kT3duOk90LGFzc2lnbjpPdCxkZWZhdWx0czpJdCxjcmVhdGU6TnQsY2xvbmU6UHQsdGFwOkJ0LGdldDpqdCxoYXM6enQsbWFwT2JqZWN0Okt0LGlkZW50aXR5Okh0LGNvbnN0YW50OktlLG5vb3A6WnQsdG9QYXRoOld0LHByb3BlcnR5OnF0LHByb3BlcnR5T2Y6SnQsbWF0Y2hlcjpWdCxtYXRjaGVzOlZ0LHRpbWVzOlF0LHJhbmRvbTplbixub3c6dG4sZXNjYXBlOmFuLHVuZXNjYXBlOm9uLHRlbXBsYXRlU2V0dGluZ3M6Y24sdGVtcGxhdGU6aG4scmVzdWx0OnBuLHVuaXF1ZUlkOm1uLGNoYWluOmJuLGl0ZXJhdGVlOiR0LHBhcnRpYWw6dm4sYmluZDp4bixiaW5kQWxsOnduLG1lbW9pemU6X24sZGVsYXk6RW4sZGVmZXI6VW4sdGhyb3R0bGU6QW4sZGVib3VuY2U6a24sd3JhcDpTbixuZWdhdGU6Q24sY29tcG9zZTpGbixhZnRlcjpPbixiZWZvcmU6SW4sb25jZTpSbixmaW5kS2V5Ok5uLGZpbmRJbmRleDpCbixmaW5kTGFzdEluZGV4OlduLHNvcnRlZEluZGV4OkxuLGluZGV4T2Y6am4sbGFzdEluZGV4T2Y6em4sZmluZDpIbixkZXRlY3Q6SG4sZmluZFdoZXJlOlZuLGVhY2g6cW4sZm9yRWFjaDpxbixtYXA6R24sY29sbGVjdDpHbixyZWR1Y2U6JG4sZm9sZGw6JG4saW5qZWN0OiRuLHJlZHVjZVJpZ2h0OlluLGZvbGRyOlluLGZpbHRlcjpLbixzZWxlY3Q6S24scmVqZWN0OlpuLGV2ZXJ5OkpuLGFsbDpKbixzb21lOlFuLGFueTpRbixjb250YWluczplcixpbmNsdWRlczplcixpbmNsdWRlOmVyLGludm9rZTp0cixwbHVjazpucix3aGVyZTpycixtYXg6aXIsbWluOmFyLHNodWZmbGU6bHIsc2FtcGxlOnNyLHNvcnRCeTp1cixncm91cEJ5OmRyLGluZGV4Qnk6aHIsY291bnRCeTpwcixwYXJ0aXRpb246Z3IsdG9BcnJheTpjcixzaXplOm1yLHBpY2s6eXIsb21pdDp2cixmaXJzdDpEcixoZWFkOkRyLHRha2U6RHIsaW5pdGlhbDp4cixsYXN0OndyLHJlc3Q6VHIsdGFpbDpUcixkcm9wOlRyLGNvbXBhY3Q6X3IsZmxhdHRlbjpFcix3aXRob3V0OkFyLHVuaXE6a3IsdW5pcXVlOmtyLHVuaW9uOlNyLGludGVyc2VjdGlvbjpDcixkaWZmZXJlbmNlOlVyLHVuemlwOkZyLHRyYW5zcG9zZTpGcix6aXA6T3Isb2JqZWN0OklyLHJhbmdlOlJyLGNodW5rOk5yLG1peGluOkJyLGRlZmF1bHQ6c3R9KSk7V3IuXz1Xcjt2YXIgTHI9ZWUoT2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZGVmYXVsdDpXcixWRVJTSU9OOm5lLHJlc3RBcmd1bWVudHM6VGUsaXNPYmplY3Q6d2UsaXNOdWxsOl9lLGlzVW5kZWZpbmVkOkVlLGlzQm9vbGVhbjpVZSxpc0VsZW1lbnQ6QWUsaXNTdHJpbmc6U2UsaXNOdW1iZXI6Q2UsaXNEYXRlOkZlLGlzUmVnRXhwOk9lLGlzRXJyb3I6SWUsaXNTeW1ib2w6UmUsaXNBcnJheUJ1ZmZlcjpOZSxpc0RhdGFWaWV3OkhlLGlzQXJyYXk6VmUsaXNGdW5jdGlvbjpXZSxpc0FyZ3VtZW50czpYZSxpc0Zpbml0ZTokZSxpc05hTjpZZSxpc1R5cGVkQXJyYXk6bnQsaXNFbXB0eTpvdCxpc01hdGNoOmN0LGlzRXF1YWw6aHQsaXNNYXA6VHQsaXNXZWFrTWFwOnd0LGlzU2V0Ol90LGlzV2Vha1NldDpFdCxrZXlzOmF0LGFsbEtleXM6cHQsdmFsdWVzOlV0LHBhaXJzOkF0LGludmVydDprdCxmdW5jdGlvbnM6U3QsbWV0aG9kczpTdCxleHRlbmQ6RnQsZXh0ZW5kT3duOk90LGFzc2lnbjpPdCxkZWZhdWx0czpJdCxjcmVhdGU6TnQsY2xvbmU6UHQsdGFwOkJ0LGdldDpqdCxoYXM6enQsbWFwT2JqZWN0Okt0LGlkZW50aXR5Okh0LGNvbnN0YW50OktlLG5vb3A6WnQsdG9QYXRoOld0LHByb3BlcnR5OnF0LHByb3BlcnR5T2Y6SnQsbWF0Y2hlcjpWdCxtYXRjaGVzOlZ0LHRpbWVzOlF0LHJhbmRvbTplbixub3c6dG4sZXNjYXBlOmFuLHVuZXNjYXBlOm9uLHRlbXBsYXRlU2V0dGluZ3M6Y24sdGVtcGxhdGU6aG4scmVzdWx0OnBuLHVuaXF1ZUlkOm1uLGNoYWluOmJuLGl0ZXJhdGVlOiR0LHBhcnRpYWw6dm4sYmluZDp4bixiaW5kQWxsOnduLG1lbW9pemU6X24sZGVsYXk6RW4sZGVmZXI6VW4sdGhyb3R0bGU6QW4sZGVib3VuY2U6a24sd3JhcDpTbixuZWdhdGU6Q24sY29tcG9zZTpGbixhZnRlcjpPbixiZWZvcmU6SW4sb25jZTpSbixmaW5kS2V5Ok5uLGZpbmRJbmRleDpCbixmaW5kTGFzdEluZGV4OlduLHNvcnRlZEluZGV4OkxuLGluZGV4T2Y6am4sbGFzdEluZGV4T2Y6em4sZmluZDpIbixkZXRlY3Q6SG4sZmluZFdoZXJlOlZuLGVhY2g6cW4sZm9yRWFjaDpxbixtYXA6R24sY29sbGVjdDpHbixyZWR1Y2U6JG4sZm9sZGw6JG4saW5qZWN0OiRuLHJlZHVjZVJpZ2h0OlluLGZvbGRyOlluLGZpbHRlcjpLbixzZWxlY3Q6S24scmVqZWN0OlpuLGV2ZXJ5OkpuLGFsbDpKbixzb21lOlFuLGFueTpRbixjb250YWluczplcixpbmNsdWRlczplcixpbmNsdWRlOmVyLGludm9rZTp0cixwbHVjazpucix3aGVyZTpycixtYXg6aXIsbWluOmFyLHNodWZmbGU6bHIsc2FtcGxlOnNyLHNvcnRCeTp1cixncm91cEJ5OmRyLGluZGV4Qnk6aHIsY291bnRCeTpwcixwYXJ0aXRpb246Z3IsdG9BcnJheTpjcixzaXplOm1yLHBpY2s6eXIsb21pdDp2cixmaXJzdDpEcixoZWFkOkRyLHRha2U6RHIsaW5pdGlhbDp4cixsYXN0OndyLHJlc3Q6VHIsdGFpbDpUcixkcm9wOlRyLGNvbXBhY3Q6X3IsZmxhdHRlbjpFcix3aXRob3V0OkFyLHVuaXE6a3IsdW5pcXVlOmtyLHVuaW9uOlNyLGludGVyc2VjdGlvbjpDcixkaWZmZXJlbmNlOlVyLHVuemlwOkZyLHRyYW5zcG9zZTpGcix6aXA6T3Isb2JqZWN0OklyLHJhbmdlOlJyLGNodW5rOk5yLG1peGluOkJyfSkpLE1yPXt9O2Z1bmN0aW9uIGpyKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aC0xO3I+PTA7ci0tKXt2YXIgaT1lW3JdOyIuIj09PWk/ZS5zcGxpY2UociwxKToiLi4iPT09aT8oZS5zcGxpY2UociwxKSxuKyspOm4mJihlLnNwbGljZShyLDEpLG4tLSl9aWYodClmb3IoO24tLTtuKWUudW5zaGlmdCgiLi4iKTtyZXR1cm4gZX12YXIgenI9L14oXC8/fCkoW1xzXFNdKj8pKCg/OlwuezEsMn18W15cL10rP3wpKFwuW14uXC9dKnwpKSg/OltcL10qKSQvLEhyPWZ1bmN0aW9uKGUpe3JldHVybiB6ci5leGVjKGUpLnNsaWNlKDEpfTtmdW5jdGlvbiBWcigpe2Zvcih2YXIgZT0iIix0PSExLG49YXJndW1lbnRzLmxlbmd0aC0xO24+PS0xJiYhdDtuLS0pe3ZhciByPW4+PTA/YXJndW1lbnRzW25dOiIvIjtpZigic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKTtyJiYoZT1yKyIvIitlLHQ9Ii8iPT09ci5jaGFyQXQoMCkpfXJldHVybih0PyIvIjoiIikrKGU9anIoUXIoZS5zcGxpdCgiLyIpLChmdW5jdGlvbihlKXtyZXR1cm4hIWV9KSksIXQpLmpvaW4oIi8iKSl8fCIuIn1mdW5jdGlvbiBxcihlKXt2YXIgdD1HcihlKSxuPSIvIj09PWVpKGUsLTEpO3JldHVybihlPWpyKFFyKGUuc3BsaXQoIi8iKSwoZnVuY3Rpb24oZSl7cmV0dXJuISFlfSkpLCF0KS5qb2luKCIvIikpfHx0fHwoZT0iLiIpLGUmJm4mJihlKz0iLyIpLCh0PyIvIjoiIikrZX1mdW5jdGlvbiBHcihlKXtyZXR1cm4iLyI9PT1lLmNoYXJBdCgwKX1mdW5jdGlvbiBYcigpe3JldHVybiBxcihRcihBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCksKGZ1bmN0aW9uKGUsdCl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyB0byBwYXRoLmpvaW4gbXVzdCBiZSBzdHJpbmdzIik7cmV0dXJuIGV9KSkuam9pbigiLyIpKX1mdW5jdGlvbiAkcihlLHQpe2Z1bmN0aW9uIG4oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aCYmIiI9PT1lW3RdO3QrKyk7Zm9yKHZhciBuPWUubGVuZ3RoLTE7bj49MCYmIiI9PT1lW25dO24tLSk7cmV0dXJuIHQ+bj9bXTplLnNsaWNlKHQsbi10KzEpfWU9VnIoZSkuc3Vic3RyKDEpLHQ9VnIodCkuc3Vic3RyKDEpO2Zvcih2YXIgcj1uKGUuc3BsaXQoIi8iKSksaT1uKHQuc3BsaXQoIi8iKSksYT1NYXRoLm1pbihyLmxlbmd0aCxpLmxlbmd0aCksbz1hLGM9MDtjPGE7YysrKWlmKHJbY10hPT1pW2NdKXtvPWM7YnJlYWt9dmFyIHM9W107Zm9yKGM9bztjPHIubGVuZ3RoO2MrKylzLnB1c2goIi4uIik7cmV0dXJuKHM9cy5jb25jYXQoaS5zbGljZShvKSkpLmpvaW4oIi8iKX1mdW5jdGlvbiBZcihlKXt2YXIgdD1IcihlKSxuPXRbMF0scj10WzFdO3JldHVybiBufHxyPyhyJiYocj1yLnN1YnN0cigwLHIubGVuZ3RoLTEpKSxuK3IpOiIuIn1mdW5jdGlvbiBLcihlLHQpe3ZhciBuPUhyKGUpWzJdO3JldHVybiB0JiZuLnN1YnN0cigtMSp0Lmxlbmd0aCk9PT10JiYobj1uLnN1YnN0cigwLG4ubGVuZ3RoLXQubGVuZ3RoKSksbn1mdW5jdGlvbiBacihlKXtyZXR1cm4gSHIoZSlbM119dmFyIEpyPXtleHRuYW1lOlpyLGJhc2VuYW1lOktyLGRpcm5hbWU6WXIsc2VwOiIvIixkZWxpbWl0ZXI6IjoiLHJlbGF0aXZlOiRyLGpvaW46WHIsaXNBYnNvbHV0ZTpHcixub3JtYWxpemU6cXIscmVzb2x2ZTpWcn07ZnVuY3Rpb24gUXIoZSx0KXtpZihlLmZpbHRlcilyZXR1cm4gZS5maWx0ZXIodCk7Zm9yKHZhciBuPVtdLHI9MDtyPGUubGVuZ3RoO3IrKyl0KGVbcl0scixlKSYmbi5wdXNoKGVbcl0pO3JldHVybiBufXZhciBlaT0iYiI9PT0iYWIiLnN1YnN0cigtMSk/ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnN1YnN0cih0LG4pfTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ8MCYmKHQ9ZS5sZW5ndGgrdCksZS5zdWJzdHIodCxuKX0sdGk9ZWUoT2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscmVzb2x2ZTpWcixub3JtYWxpemU6cXIsaXNBYnNvbHV0ZTpHcixqb2luOlhyLHJlbGF0aXZlOiRyLHNlcDoiLyIsZGVsaW1pdGVyOiI6IixkaXJuYW1lOllyLGJhc2VuYW1lOktyLGV4dG5hbWU6WnIsZGVmYXVsdDpKcn0pKSxuaT17fTtmdW5jdGlvbiByaSgpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGlpKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX12YXIgYWk9cmksb2k9aWk7ZnVuY3Rpb24gY2koZSl7aWYoYWk9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGUsMCk7aWYoKGFpPT09cml8fCFhaSkmJnNldFRpbWVvdXQpcmV0dXJuIGFpPXNldFRpbWVvdXQsc2V0VGltZW91dChlLDApO3RyeXtyZXR1cm4gYWkoZSwwKX1jYXRjaCh0KXt0cnl7cmV0dXJuIGFpLmNhbGwobnVsbCxlLDApfWNhdGNoKHQpe3JldHVybiBhaS5jYWxsKHRoaXMsZSwwKX19fSJmdW5jdGlvbiI9PXR5cGVvZiBlLnNldFRpbWVvdXQmJihhaT1zZXRUaW1lb3V0KSwiZnVuY3Rpb24iPT10eXBlb2YgZS5jbGVhclRpbWVvdXQmJihvaT1jbGVhclRpbWVvdXQpO3ZhciBzaSxsaT1bXSx1aT0hMSxmaT0tMTtmdW5jdGlvbiBkaSgpe3VpJiZzaSYmKHVpPSExLHNpLmxlbmd0aD9saT1zaS5jb25jYXQobGkpOmZpPS0xLGxpLmxlbmd0aCYmaGkoKSl9ZnVuY3Rpb24gaGkoKXtpZighdWkpe3ZhciBlPWNpKGRpKTt1aT0hMDtmb3IodmFyIHQ9bGkubGVuZ3RoO3Q7KXtmb3Ioc2k9bGksbGk9W107KytmaTx0OylzaSYmc2lbZmldLnJ1bigpO2ZpPS0xLHQ9bGkubGVuZ3RofXNpPW51bGwsdWk9ITEsZnVuY3Rpb24oZSl7aWYob2k9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChlKTtpZigob2k9PT1paXx8IW9pKSYmY2xlYXJUaW1lb3V0KXJldHVybiBvaT1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXtyZXR1cm4gb2koZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBvaS5jYWxsKG51bGwsZSl9Y2F0Y2godCl7cmV0dXJuIG9pLmNhbGwodGhpcyxlKX19fShlKX19ZnVuY3Rpb24gcGkoZSx0KXt0aGlzLmZ1bj1lLHRoaXMuYXJyYXk9dH1waS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07ZnVuY3Rpb24gZ2koKXt9dmFyIG1pPWdpLGJpPWdpLHlpPWdpLHZpPWdpLHhpPWdpLERpPWdpLFRpPWdpO3ZhciB3aT1lLnBlcmZvcm1hbmNlfHx7fSxfaT13aS5ub3d8fHdpLm1vek5vd3x8d2kubXNOb3d8fHdpLm9Ob3d8fHdpLndlYmtpdE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIEVpPW5ldyBEYXRlO3ZhciBVaSxBaSxraSxTaT17bmV4dFRpY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdFtuLTFdPWFyZ3VtZW50c1tuXTtsaS5wdXNoKG5ldyBwaShlLHQpKSwxIT09bGkubGVuZ3RofHx1aXx8Y2koaGkpfSx0aXRsZToiYnJvd3NlciIsYnJvd3NlcjohMCxlbnY6e30sYXJndjpbXSx2ZXJzaW9uOiIiLHZlcnNpb25zOnt9LG9uOm1pLGFkZExpc3RlbmVyOmJpLG9uY2U6eWksb2ZmOnZpLHJlbW92ZUxpc3RlbmVyOnhpLHJlbW92ZUFsbExpc3RlbmVyczpEaSxlbWl0OlRpLGJpbmRpbmc6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxjd2Q6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGNoZGlyOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIil9LHVtYXNrOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGhydGltZTpmdW5jdGlvbihlKXt2YXIgdD0uMDAxKl9pLmNhbGwod2kpLG49TWF0aC5mbG9vcih0KSxyPU1hdGguZmxvb3IodCUxKjFlOSk7cmV0dXJuIGUmJihuLT1lWzBdLChyLT1lWzFdKTwwJiYobi0tLHIrPTFlOSkpLFtuLHJdfSxwbGF0Zm9ybToiYnJvd3NlciIscmVsZWFzZTp7fSxjb25maWc6e30sdXB0aW1lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlLUVpKS8xZTN9fSxDaT17fSxGaT17fSxPaT17Z2V0IGV4cG9ydHMoKXtyZXR1cm4gRml9LHNldCBleHBvcnRzKGUpe0ZpPWV9fTtmdW5jdGlvbiBJaSgpe2lmKFVpKXJldHVybiBGaTtVaT0xO3ZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXRoaXN9KCk7aWYoZSlPaS5leHBvcnRzPXtmcmVlemU6T2JqZWN0LmZyZWV6ZSxkZWZpbmVQcm9wZXJ0eTpPYmplY3QuZGVmaW5lUHJvcGVydHksZ2V0RGVzY3JpcHRvcjpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLGtleXM6T2JqZWN0LmtleXMsbmFtZXM6T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMsZ2V0UHJvdG90eXBlT2Y6T2JqZWN0LmdldFByb3RvdHlwZU9mLGlzQXJyYXk6QXJyYXkuaXNBcnJheSxpc0VTNTplLHByb3BlcnR5SXNXcml0YWJsZTpmdW5jdGlvbihlLHQpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtyZXR1cm4hKG4mJiFuLndyaXRhYmxlJiYhbi5zZXQpfX07ZWxzZXt2YXIgdD17fS5oYXNPd25Qcm9wZXJ0eSxuPXt9LnRvU3RyaW5nLHI9e30uY29uc3RydWN0b3IucHJvdG90eXBlLGk9ZnVuY3Rpb24oZSl7dmFyIG49W107Zm9yKHZhciByIGluIGUpdC5jYWxsKGUscikmJm4ucHVzaChyKTtyZXR1cm4gbn07T2kuZXhwb3J0cz17aXNBcnJheTpmdW5jdGlvbihlKXt0cnl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PW4uY2FsbChlKX1jYXRjaChlKXtyZXR1cm4hMX19LGtleXM6aSxuYW1lczppLGRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZVt0XT1uLnZhbHVlLGV9LGdldERlc2NyaXB0b3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm57dmFsdWU6ZVt0XX19LGZyZWV6ZTpmdW5jdGlvbihlKXtyZXR1cm4gZX0sZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBPYmplY3QoZSkuY29uc3RydWN0b3IucHJvdG90eXBlfWNhdGNoKGUpe3JldHVybiByfX0saXNFUzU6ZSxwcm9wZXJ0eUlzV3JpdGFibGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19fXJldHVybiBGaX1mdW5jdGlvbiBSaSgpe2lmKGtpKXJldHVybiBBaTtraT0xO3ZhciBlLHQ9SWkoKSxuPSJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yLHI9e2U6e319LGk9InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnZvaWQgMCE9PVF8fHZvaWQgMCE9PVE/UTpudWxsO2Z1bmN0aW9uIGEoKXt0cnl7dmFyIHQ9ZTtyZXR1cm4gZT1udWxsLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKGUpe3JldHVybiByLmU9ZSxyfX1mdW5jdGlvbiBvKGUpe3JldHVybiBudWxsPT1lfHwhMD09PWV8fCExPT09ZXx8InN0cmluZyI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGV9ZnVuY3Rpb24gYyhlLG4scil7aWYobyhlKSlyZXR1cm4gZTt2YXIgaT17dmFsdWU6cixjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMH07cmV0dXJuIHQuZGVmaW5lUHJvcGVydHkoZSxuLGkpLGV9dmFyIHM9ZnVuY3Rpb24oKXt2YXIgZT1bQXJyYXkucHJvdG90eXBlLE9iamVjdC5wcm90b3R5cGUsRnVuY3Rpb24ucHJvdG90eXBlXSxuPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7KytuKWlmKGVbbl09PT10KXJldHVybiEwO3JldHVybiExfTtpZih0LmlzRVM1KXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciBpPVtdLGE9T2JqZWN0LmNyZWF0ZShudWxsKTtudWxsIT1lJiYhbihlKTspe3ZhciBvO3RyeXtvPXIoZSl9Y2F0Y2goZSl7cmV0dXJuIGl9Zm9yKHZhciBjPTA7YzxvLmxlbmd0aDsrK2Mpe3ZhciBzPW9bY107aWYoIWFbc10pe2Fbc109ITA7dmFyIGw9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHMpO251bGwhPWwmJm51bGw9PWwuZ2V0JiZudWxsPT1sLnNldCYmaS5wdXNoKHMpfX1lPXQuZ2V0UHJvdG90eXBlT2YoZSl9cmV0dXJuIGl9fXZhciBpPXt9Lmhhc093blByb3BlcnR5O3JldHVybiBmdW5jdGlvbih0KXtpZihuKHQpKXJldHVybltdO3ZhciByPVtdO2U6Zm9yKHZhciBhIGluIHQpaWYoaS5jYWxsKHQsYSkpci5wdXNoKGEpO2Vsc2V7Zm9yKHZhciBvPTA7bzxlLmxlbmd0aDsrK28paWYoaS5jYWxsKGVbb10sYSkpY29udGludWUgZTtyLnB1c2goYSl9cmV0dXJuIHJ9fSgpLGw9L3RoaXNccypcLlxzKlxTK1xzKj0vO3ZhciB1PS9eW2EteiRfXVthLXokXzAtOV0qJC9pO2Z1bmN0aW9uIGYoZSl7dHJ5e3JldHVybiBlKyIifWNhdGNoKGUpe3JldHVybiJbbm8gc3RyaW5nIHJlcHJlc2VudGF0aW9uXSJ9fWZ1bmN0aW9uIGQoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJzdHJpbmciPT10eXBlb2YgZS5tZXNzYWdlJiYic3RyaW5nIj09dHlwZW9mIGUubmFtZX1mdW5jdGlvbiBoKGUpe3JldHVybiBkKGUpJiZ0LnByb3BlcnR5SXNXcml0YWJsZShlLCJzdGFjayIpfXZhciBwPSJzdGFjayJpbiBuZXcgRXJyb3I/ZnVuY3Rpb24oZSl7cmV0dXJuIGgoZSk/ZTpuZXcgRXJyb3IoZihlKSl9OmZ1bmN0aW9uKGUpe2lmKGgoZSkpcmV0dXJuIGU7dHJ5e3Rocm93IG5ldyBFcnJvcihmKGUpKX1jYXRjaChlKXtyZXR1cm4gZX19O2Z1bmN0aW9uIGcoZSl7cmV0dXJue30udG9TdHJpbmcuY2FsbChlKX12YXIgbT1mdW5jdGlvbihlKXtyZXR1cm4gdC5pc0FycmF5KGUpP2U6bnVsbH07aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcil7dmFyIGI9ImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5LmZyb20/ZnVuY3Rpb24oZSl7cmV0dXJuIEFycmF5LmZyb20oZSl9OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPVtdLHI9ZVtTeW1ib2wuaXRlcmF0b3JdKCk7ISh0PXIubmV4dCgpKS5kb25lOyluLnB1c2godC52YWx1ZSk7cmV0dXJuIG59O209ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNBcnJheShlKT9lOm51bGwhPWUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlW1N5bWJvbC5pdGVyYXRvcl0/YihlKTpudWxsfX12YXIgeT12b2lkIDAhPT1TaSYmIltvYmplY3QgcHJvY2Vzc10iPT09ZyhTaSkudG9Mb3dlckNhc2UoKSx2PXZvaWQgMCE9PVNpJiZ2b2lkIDAhPT1TaS5lbnY7dmFyIHg9e2lzQ2xhc3M6ZnVuY3Rpb24oZSl7dHJ5e2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlKXt2YXIgbj10Lm5hbWVzKGUucHJvdG90eXBlKSxyPXQuaXNFUzUmJm4ubGVuZ3RoPjEsaT1uLmxlbmd0aD4wJiYhKDE9PT1uLmxlbmd0aCYmImNvbnN0cnVjdG9yIj09PW5bMF0pLGE9bC50ZXN0KGUrIiIpJiZ0Lm5hbWVzKGUpLmxlbmd0aD4wO2lmKHJ8fGl8fGEpcmV0dXJuITB9cmV0dXJuITF9Y2F0Y2goZSl7cmV0dXJuITF9fSxpc0lkZW50aWZpZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHUudGVzdChlKX0saW5oZXJpdGVkRGF0YUtleXM6cyxnZXREYXRhUHJvcGVydHlPckRlZmF1bHQ6ZnVuY3Rpb24oZSxuLHIpe2lmKCF0LmlzRVM1KXJldHVybnt9Lmhhc093blByb3BlcnR5LmNhbGwoZSxuKT9lW25dOnZvaWQgMDt2YXIgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsbik7cmV0dXJuIG51bGwhPWk/bnVsbD09aS5nZXQmJm51bGw9PWkuc2V0P2kudmFsdWU6cjp2b2lkIDB9LHRocm93ZXI6ZnVuY3Rpb24oZSl7dGhyb3cgZX0saXNBcnJheTp0LmlzQXJyYXksYXNBcnJheTptLG5vdEVudW1lcmFibGVQcm9wOmMsaXNQcmltaXRpdmU6byxpc09iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZXx8Im9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZX0saXNFcnJvcjpkLGNhbkV2YWx1YXRlOm4sZXJyb3JPYmo6cix0cnlDYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gZT10LGF9LGluaGVyaXRzOmZ1bmN0aW9uKGUsdCl7dmFyIG49e30uaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gcigpe2Zvcih2YXIgciBpbiB0aGlzLmNvbnN0cnVjdG9yPWUsdGhpcy5jb25zdHJ1Y3RvciQ9dCx0LnByb3RvdHlwZSluLmNhbGwodC5wcm90b3R5cGUscikmJiIkIiE9PXIuY2hhckF0KHIubGVuZ3RoLTEpJiYodGhpc1tyKyIkIl09dC5wcm90b3R5cGVbcl0pfXJldHVybiByLnByb3RvdHlwZT10LnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgcixlLnByb3RvdHlwZX0sd2l0aEFwcGVuZGVkOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lLmxlbmd0aCxpPW5ldyBBcnJheShyKzEpO2ZvcihuPTA7bjxyOysrbilpW25dPWVbbl07cmV0dXJuIGlbbl09dCxpfSxtYXliZVdyYXBBc0Vycm9yOmZ1bmN0aW9uKGUpe3JldHVybiBvKGUpP25ldyBFcnJvcihmKGUpKTplfSx0b0Zhc3RQcm9wZXJ0aWVzOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxmaWxsZWRSYW5nZTpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlyW2ldPXQraStuO3JldHVybiByfSx0b1N0cmluZzpmLGNhbkF0dGFjaFRyYWNlOmgsZW5zdXJlRXJyb3JPYmplY3Q6cCxvcmlnaW5hdGVzRnJvbVJlamVjdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmKGUgaW5zdGFuY2VvZiBFcnJvci5fX0JsdWViaXJkRXJyb3JUeXBlc19fLk9wZXJhdGlvbmFsRXJyb3J8fCEwPT09ZS5pc09wZXJhdGlvbmFsKX0sbWFya0FzT3JpZ2luYXRpbmdGcm9tUmVqZWN0aW9uOmZ1bmN0aW9uKGUpe3RyeXtjKGUsImlzT3BlcmF0aW9uYWwiLCEwKX1jYXRjaChlKXt9fSxjbGFzc1N0cmluZzpnLGNvcHlEZXNjcmlwdG9yczpmdW5jdGlvbihlLG4scil7Zm9yKHZhciBpPXQubmFtZXMoZSksYT0wO2E8aS5sZW5ndGg7KythKXt2YXIgbz1pW2FdO2lmKHIobykpdHJ5e3QuZGVmaW5lUHJvcGVydHkobixvLHQuZ2V0RGVzY3JpcHRvcihlLG8pKX1jYXRjaChlKXt9fX0saGFzRGV2VG9vbHM6InVuZGVmaW5lZCIhPXR5cGVvZiBjaHJvbWUmJmNocm9tZSYmImZ1bmN0aW9uIj09dHlwZW9mIGNocm9tZS5sb2FkVGltZXMsaXNOb2RlOnksaGFzRW52VmFyaWFibGVzOnYsZW52OmZ1bmN0aW9uKGUpe3JldHVybiB2P1NpLmVudltlXTp2b2lkIDB9LGdsb2JhbDppLGdldE5hdGl2ZVByb21pc2U6ZnVuY3Rpb24oKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZSl0cnl7dmFyIGU9bmV3IFByb21pc2UoKGZ1bmN0aW9uKCl7fSkpO2lmKCJbb2JqZWN0IFByb21pc2VdIj09PXt9LnRvU3RyaW5nLmNhbGwoZSkpcmV0dXJuIFByb21pc2V9Y2F0Y2goZSl7fX0sZG9tYWluQmluZDpmdW5jdGlvbihlLHQpe3JldHVybiBlLmJpbmQodCl9fTt4LmlzUmVjZW50Tm9kZT14LmlzTm9kZSYmZnVuY3Rpb24oKXt2YXIgZT1TaS52ZXJzaW9ucy5ub2RlLnNwbGl0KCIuIikubWFwKE51bWJlcik7cmV0dXJuIDA9PT1lWzBdJiZlWzFdPjEwfHxlWzBdPjB9KCkseC5pc05vZGUmJngudG9GYXN0UHJvcGVydGllcyhTaSk7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChlKXt4Lmxhc3RMaW5lRXJyb3I9ZX1yZXR1cm4gQWk9eH12YXIgTmksUGksQmksV2ksTGksTWksamksemksSGksVmkscWksR2ksWGksJGksWWksS2ksWmksSmksUWksZWEsdGEsbmEscmEsaWEsYWEsb2EsY2Esc2EsbGEsdWEsZmEsZGEsaGEscGEsZ2EsbWEsYmEseWEsdmEseGEsRGEsVGEsd2EsX2EsRWEsVWEsQWEsa2EsU2EsQ2EsRmEsT2EsSWEsUmEsTmEsUGEsQmEsV2EsTGEsTWEsamEsemEsSGEsVmEscWE9e30sR2E9e2dldCBleHBvcnRzKCl7cmV0dXJuIHFhfSxzZXQgZXhwb3J0cyhlKXtxYT1lfX07ZnVuY3Rpb24gWGEoKXtpZihQaSlyZXR1cm4gTmk7UGk9MTt2YXIgZSx0PVJpKCksbj10LmdldE5hdGl2ZVByb21pc2UoKTtpZih0LmlzTm9kZSYmInVuZGVmaW5lZCI9PXR5cGVvZiBNdXRhdGlvbk9ic2VydmVyKXt2YXIgcj1RLnNldEltbWVkaWF0ZSxpPVNpLm5leHRUaWNrO2U9dC5pc1JlY2VudE5vZGU/ZnVuY3Rpb24oZSl7ci5jYWxsKFEsZSl9OmZ1bmN0aW9uKGUpe2kuY2FsbChTaSxlKX19ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgbiYmImZ1bmN0aW9uIj09dHlwZW9mIG4ucmVzb2x2ZSl7dmFyIGE9bi5yZXNvbHZlKCk7ZT1mdW5jdGlvbihlKXthLnRoZW4oZSl9fWVsc2UgZT0idW5kZWZpbmVkIj09dHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXJ8fCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiYod2luZG93Lm5hdmlnYXRvci5zdGFuZGFsb25lfHx3aW5kb3cuY29yZG92YSk/InVuZGVmaW5lZCIhPXR5cGVvZiBzZXRJbW1lZGlhdGU/ZnVuY3Rpb24oZSl7c2V0SW1tZWRpYXRlKGUpfToidW5kZWZpbmVkIiE9dHlwZW9mIHNldFRpbWVvdXQ/ZnVuY3Rpb24oZSl7c2V0VGltZW91dChlLDApfTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiTm8gYXN5bmMgc2NoZWR1bGVyIGF2YWlsYWJsZVxuXG4gICAgU2VlIGh0dHA6Ly9nb28uZ2wvTXFyRm1YXG4iKX06ZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0PXthdHRyaWJ1dGVzOiEwfSxuPSExLHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKCl7ZS5jbGFzc0xpc3QudG9nZ2xlKCJmb28iKSxuPSExfSkpLm9ic2VydmUocix0KTtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIGE9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKCl7YS5kaXNjb25uZWN0KCksaSgpfSkpO2Eub2JzZXJ2ZShlLHQpLG58fChuPSEwLHIuY2xhc3NMaXN0LnRvZ2dsZSgiZm9vIikpfX0oKTtyZXR1cm4gTmk9ZX1mdW5jdGlvbiAkYSgpe2lmKExpKXJldHVybiBxYTt2YXIgZTtMaT0xO3RyeXt0aHJvdyBuZXcgRXJyb3J9Y2F0Y2godCl7ZT10fXZhciB0PVhhKCksbj1mdW5jdGlvbigpe2lmKFdpKXJldHVybiBCaTtmdW5jdGlvbiBlKGUpe3RoaXMuX2NhcGFjaXR5PWUsdGhpcy5fbGVuZ3RoPTAsdGhpcy5fZnJvbnQ9MH1yZXR1cm4gV2k9MSxlLnByb3RvdHlwZS5fd2lsbEJlT3ZlckNhcGFjaXR5PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9jYXBhY2l0eTxlfSxlLnByb3RvdHlwZS5fcHVzaE9uZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCgpO3RoaXMuX2NoZWNrQ2FwYWNpdHkodCsxKSx0aGlzW3RoaXMuX2Zyb250K3QmdGhpcy5fY2FwYWNpdHktMV09ZSx0aGlzLl9sZW5ndGg9dCsxfSxlLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmxlbmd0aCgpKzM7aWYodGhpcy5fd2lsbEJlT3ZlckNhcGFjaXR5KHIpKXJldHVybiB0aGlzLl9wdXNoT25lKGUpLHRoaXMuX3B1c2hPbmUodCksdm9pZCB0aGlzLl9wdXNoT25lKG4pO3ZhciBpPXRoaXMuX2Zyb250K3ItMzt0aGlzLl9jaGVja0NhcGFjaXR5KHIpO3ZhciBhPXRoaXMuX2NhcGFjaXR5LTE7dGhpc1tpKzAmYV09ZSx0aGlzW2krMSZhXT10LHRoaXNbaSsyJmFdPW4sdGhpcy5fbGVuZ3RoPXJ9LGUucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fZnJvbnQsdD10aGlzW2VdO3JldHVybiB0aGlzW2VdPXZvaWQgMCx0aGlzLl9mcm9udD1lKzEmdGhpcy5fY2FwYWNpdHktMSx0aGlzLl9sZW5ndGgtLSx0fSxlLnByb3RvdHlwZS5sZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGVuZ3RofSxlLnByb3RvdHlwZS5fY2hlY2tDYXBhY2l0eT1mdW5jdGlvbihlKXt0aGlzLl9jYXBhY2l0eTxlJiZ0aGlzLl9yZXNpemVUbyh0aGlzLl9jYXBhY2l0eTw8MSl9LGUucHJvdG90eXBlLl9yZXNpemVUbz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jYXBhY2l0eTt0aGlzLl9jYXBhY2l0eT1lLGZ1bmN0aW9uKGUsdCxuLHIsaSl7Zm9yKHZhciBhPTA7YTxpOysrYSluW2Ercl09ZVthK3RdLGVbYSt0XT12b2lkIDB9KHRoaXMsMCx0aGlzLHQsdGhpcy5fZnJvbnQrdGhpcy5fbGVuZ3RoJnQtMSl9LEJpPWV9KCkscj1SaSgpO2Z1bmN0aW9uIGkoKXt0aGlzLl9jdXN0b21TY2hlZHVsZXI9ITEsdGhpcy5faXNUaWNrVXNlZD0hMSx0aGlzLl9sYXRlUXVldWU9bmV3IG4oMTYpLHRoaXMuX25vcm1hbFF1ZXVlPW5ldyBuKDE2KSx0aGlzLl9oYXZlRHJhaW5lZFF1ZXVlcz0hMSx0aGlzLl90cmFtcG9saW5lRW5hYmxlZD0hMDt2YXIgZT10aGlzO3RoaXMuZHJhaW5RdWV1ZXM9ZnVuY3Rpb24oKXtlLl9kcmFpblF1ZXVlcygpfSx0aGlzLl9zY2hlZHVsZT10fWZ1bmN0aW9uIGEoZSx0LG4pe3RoaXMuX2xhdGVRdWV1ZS5wdXNoKGUsdCxuKSx0aGlzLl9xdWV1ZVRpY2soKX1mdW5jdGlvbiBvKGUsdCxuKXt0aGlzLl9ub3JtYWxRdWV1ZS5wdXNoKGUsdCxuKSx0aGlzLl9xdWV1ZVRpY2soKX1mdW5jdGlvbiBjKGUpe3RoaXMuX25vcm1hbFF1ZXVlLl9wdXNoT25lKGUpLHRoaXMuX3F1ZXVlVGljaygpfXJldHVybiBpLnByb3RvdHlwZS5zZXRTY2hlZHVsZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fc2NoZWR1bGU7cmV0dXJuIHRoaXMuX3NjaGVkdWxlPWUsdGhpcy5fY3VzdG9tU2NoZWR1bGVyPSEwLHR9LGkucHJvdG90eXBlLmhhc0N1c3RvbVNjaGVkdWxlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXN0b21TY2hlZHVsZXJ9LGkucHJvdG90eXBlLmVuYWJsZVRyYW1wb2xpbmU9ZnVuY3Rpb24oKXt0aGlzLl90cmFtcG9saW5lRW5hYmxlZD0hMH0saS5wcm90b3R5cGUuZGlzYWJsZVRyYW1wb2xpbmVJZk5lY2Vzc2FyeT1mdW5jdGlvbigpe3IuaGFzRGV2VG9vbHMmJih0aGlzLl90cmFtcG9saW5lRW5hYmxlZD0hMSl9LGkucHJvdG90eXBlLmhhdmVJdGVtc1F1ZXVlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1RpY2tVc2VkfHx0aGlzLl9oYXZlRHJhaW5lZFF1ZXVlc30saS5wcm90b3R5cGUuZmF0YWxFcnJvcj1mdW5jdGlvbihlLHQpe3Q/KFNpLnN0ZGVyci53cml0ZSgiRmF0YWwgIisoZSBpbnN0YW5jZW9mIEVycm9yP2Uuc3RhY2s6ZSkrIlxuIiksU2kuZXhpdCgyKSk6dGhpcy50aHJvd0xhdGVyKGUpfSxpLnByb3RvdHlwZS50aHJvd0xhdGVyPWZ1bmN0aW9uKGUsdCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgmJih0PWUsZT1mdW5jdGlvbigpe3Rocm93IHR9KSwidW5kZWZpbmVkIiE9dHlwZW9mIHNldFRpbWVvdXQpc2V0VGltZW91dCgoZnVuY3Rpb24oKXtlKHQpfSksMCk7ZWxzZSB0cnl7dGhpcy5fc2NoZWR1bGUoKGZ1bmN0aW9uKCl7ZSh0KX0pKX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoIk5vIGFzeW5jIHNjaGVkdWxlciBhdmFpbGFibGVcblxuICAgIFNlZSBodHRwOi8vZ29vLmdsL01xckZtWFxuIil9fSxyLmhhc0RldlRvb2xzPyhpLnByb3RvdHlwZS5pbnZva2VMYXRlcj1mdW5jdGlvbihlLHQsbil7dGhpcy5fdHJhbXBvbGluZUVuYWJsZWQ/YS5jYWxsKHRoaXMsZSx0LG4pOnRoaXMuX3NjaGVkdWxlKChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5jYWxsKHQsbil9KSwxMDApfSkpfSxpLnByb3RvdHlwZS5pbnZva2U9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX3RyYW1wb2xpbmVFbmFibGVkP28uY2FsbCh0aGlzLGUsdCxuKTp0aGlzLl9zY2hlZHVsZSgoZnVuY3Rpb24oKXtlLmNhbGwodCxuKX0pKX0saS5wcm90b3R5cGUuc2V0dGxlUHJvbWlzZXM9ZnVuY3Rpb24oZSl7dGhpcy5fdHJhbXBvbGluZUVuYWJsZWQ/Yy5jYWxsKHRoaXMsZSk6dGhpcy5fc2NoZWR1bGUoKGZ1bmN0aW9uKCl7ZS5fc2V0dGxlUHJvbWlzZXMoKX0pKX0pOihpLnByb3RvdHlwZS5pbnZva2VMYXRlcj1hLGkucHJvdG90eXBlLmludm9rZT1vLGkucHJvdG90eXBlLnNldHRsZVByb21pc2VzPWMpLGkucHJvdG90eXBlLl9kcmFpblF1ZXVlPWZ1bmN0aW9uKGUpe2Zvcig7ZS5sZW5ndGgoKT4wOyl7dmFyIHQ9ZS5zaGlmdCgpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0KXt2YXIgbj1lLnNoaWZ0KCkscj1lLnNoaWZ0KCk7dC5jYWxsKG4scil9ZWxzZSB0Ll9zZXR0bGVQcm9taXNlcygpfX0saS5wcm90b3R5cGUuX2RyYWluUXVldWVzPWZ1bmN0aW9uKCl7dGhpcy5fZHJhaW5RdWV1ZSh0aGlzLl9ub3JtYWxRdWV1ZSksdGhpcy5fcmVzZXQoKSx0aGlzLl9oYXZlRHJhaW5lZFF1ZXVlcz0hMCx0aGlzLl9kcmFpblF1ZXVlKHRoaXMuX2xhdGVRdWV1ZSl9LGkucHJvdG90eXBlLl9xdWV1ZVRpY2s9ZnVuY3Rpb24oKXt0aGlzLl9pc1RpY2tVc2VkfHwodGhpcy5faXNUaWNrVXNlZD0hMCx0aGlzLl9zY2hlZHVsZSh0aGlzLmRyYWluUXVldWVzKSl9LGkucHJvdG90eXBlLl9yZXNldD1mdW5jdGlvbigpe3RoaXMuX2lzVGlja1VzZWQ9ITF9LEdhLmV4cG9ydHM9aSxxYS5maXJzdExpbmVFcnJvcj1lLHFhfWZ1bmN0aW9uIFlhKCl7aWYoamkpcmV0dXJuIE1pO2ppPTE7dmFyIGUsdCxuPUlpKCkscj1uLmZyZWV6ZSxpPVJpKCksYT1pLmluaGVyaXRzLG89aS5ub3RFbnVtZXJhYmxlUHJvcDtmdW5jdGlvbiBjKGUsdCl7ZnVuY3Rpb24gbihyKXtpZighKHRoaXMgaW5zdGFuY2VvZiBuKSlyZXR1cm4gbmV3IG4ocik7byh0aGlzLCJtZXNzYWdlIiwic3RyaW5nIj09dHlwZW9mIHI/cjp0KSxvKHRoaXMsIm5hbWUiLGUpLEVycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcik6RXJyb3IuY2FsbCh0aGlzKX1yZXR1cm4gYShuLEVycm9yKSxufXZhciBzPWMoIldhcm5pbmciLCJ3YXJuaW5nIiksbD1jKCJDYW5jZWxsYXRpb25FcnJvciIsImNhbmNlbGxhdGlvbiBlcnJvciIpLHU9YygiVGltZW91dEVycm9yIiwidGltZW91dCBlcnJvciIpLGY9YygiQWdncmVnYXRlRXJyb3IiLCJhZ2dyZWdhdGUgZXJyb3IiKTt0cnl7ZT1UeXBlRXJyb3IsdD1SYW5nZUVycm9yfWNhdGNoKG4pe2U9YygiVHlwZUVycm9yIiwidHlwZSBlcnJvciIpLHQ9YygiUmFuZ2VFcnJvciIsInJhbmdlIGVycm9yIil9Zm9yKHZhciBkPSJqb2luIHBvcCBwdXNoIHNoaWZ0IHVuc2hpZnQgc2xpY2UgZmlsdGVyIGZvckVhY2ggc29tZSBldmVyeSBtYXAgaW5kZXhPZiBsYXN0SW5kZXhPZiByZWR1Y2UgcmVkdWNlUmlnaHQgc29ydCByZXZlcnNlIi5zcGxpdCgiICIpLGg9MDtoPGQubGVuZ3RoOysraCkiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXkucHJvdG90eXBlW2RbaF1dJiYoZi5wcm90b3R5cGVbZFtoXV09QXJyYXkucHJvdG90eXBlW2RbaF1dKTtuLmRlZmluZVByb3BlcnR5KGYucHJvdG90eXBlLCJsZW5ndGgiLHt2YWx1ZTowLGNvbmZpZ3VyYWJsZTohMSx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwfSksZi5wcm90b3R5cGUuaXNPcGVyYXRpb25hbD0hMDt2YXIgcD0wO2Z1bmN0aW9uIGcoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgZykpcmV0dXJuIG5ldyBnKGUpO28odGhpcywibmFtZSIsIk9wZXJhdGlvbmFsRXJyb3IiKSxvKHRoaXMsIm1lc3NhZ2UiLGUpLHRoaXMuY2F1c2U9ZSx0aGlzLmlzT3BlcmF0aW9uYWw9ITAsZSBpbnN0YW5jZW9mIEVycm9yPyhvKHRoaXMsIm1lc3NhZ2UiLGUubWVzc2FnZSksbyh0aGlzLCJzdGFjayIsZS5zdGFjaykpOkVycm9yLmNhcHR1cmVTdGFja1RyYWNlJiZFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHRoaXMuY29uc3RydWN0b3IpfWYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkoNCpwKzEpLmpvaW4oIiAiKSx0PSJcbiIrZSsiQWdncmVnYXRlRXJyb3Igb2Y6XG4iO3ArKyxlPUFycmF5KDQqcCsxKS5qb2luKCIgIik7Zm9yKHZhciBuPTA7bjx0aGlzLmxlbmd0aDsrK24pe2Zvcih2YXIgcj10aGlzW25dPT09dGhpcz8iW0NpcmN1bGFyIEFnZ3JlZ2F0ZUVycm9yXSI6dGhpc1tuXSsiIixpPXIuc3BsaXQoIlxuIiksYT0wO2E8aS5sZW5ndGg7KythKWlbYV09ZStpW2FdO3QrPShyPWkuam9pbigiXG4iKSkrIlxuIn1yZXR1cm4gcC0tLHR9LGEoZyxFcnJvcik7dmFyIG09RXJyb3IuX19CbHVlYmlyZEVycm9yVHlwZXNfXztyZXR1cm4gbXx8KG09cih7Q2FuY2VsbGF0aW9uRXJyb3I6bCxUaW1lb3V0RXJyb3I6dSxPcGVyYXRpb25hbEVycm9yOmcsUmVqZWN0aW9uRXJyb3I6ZyxBZ2dyZWdhdGVFcnJvcjpmfSksbi5kZWZpbmVQcm9wZXJ0eShFcnJvciwiX19CbHVlYmlyZEVycm9yVHlwZXNfXyIse3ZhbHVlOm0sd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITF9KSksTWk9e0Vycm9yOkVycm9yLFR5cGVFcnJvcjplLFJhbmdlRXJyb3I6dCxDYW5jZWxsYXRpb25FcnJvcjptLkNhbmNlbGxhdGlvbkVycm9yLE9wZXJhdGlvbmFsRXJyb3I6bS5PcGVyYXRpb25hbEVycm9yLFRpbWVvdXRFcnJvcjptLlRpbWVvdXRFcnJvcixBZ2dyZWdhdGVFcnJvcjptLkFnZ3JlZ2F0ZUVycm9yLFdhcm5pbmc6c319ZnVuY3Rpb24gS2EoKXtyZXR1cm4gSGl8fChIaT0xLHppPWZ1bmN0aW9uKGUsdCl7dmFyIG49UmkoKSxyPW4uZXJyb3JPYmosaT1uLmlzT2JqZWN0O3ZhciBhPXt9Lmhhc093blByb3BlcnR5O3JldHVybiBmdW5jdGlvbihvLGMpe2lmKGkobykpe2lmKG8gaW5zdGFuY2VvZiBlKXJldHVybiBvO3ZhciBzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUudGhlbn0oZSl9Y2F0Y2goZSl7cmV0dXJuIHIuZT1lLHJ9fShvKTtpZihzPT09cil7YyYmYy5fcHVzaENvbnRleHQoKTt2YXIgbD1lLnJlamVjdChzLmUpO3JldHVybiBjJiZjLl9wb3BDb250ZXh0KCksbH1pZigiZnVuY3Rpb24iPT10eXBlb2Ygcyl7aWYoZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBhLmNhbGwoZSwiX3Byb21pc2UwIil9Y2F0Y2goZSl7cmV0dXJuITF9fShvKSl7bD1uZXcgZSh0KTtyZXR1cm4gby5fdGhlbihsLl9mdWxmaWxsLGwuX3JlamVjdCx2b2lkIDAsbCxudWxsKSxsfXJldHVybiBmdW5jdGlvbihpLGEsbyl7dmFyIGM9bmV3IGUodCkscz1jO28mJm8uX3B1c2hDb250ZXh0KCk7Yy5fY2FwdHVyZVN0YWNrVHJhY2UoKSxvJiZvLl9wb3BDb250ZXh0KCk7dmFyIGw9ITAsdT1uLnRyeUNhdGNoKGEpLmNhbGwoaSxmLGQpO2w9ITEsYyYmdT09PXImJihjLl9yZWplY3RDYWxsYmFjayh1LmUsITAsITApLGM9bnVsbCk7ZnVuY3Rpb24gZihlKXtjJiYoYy5fcmVzb2x2ZUNhbGxiYWNrKGUpLGM9bnVsbCl9ZnVuY3Rpb24gZChlKXtjJiYoYy5fcmVqZWN0Q2FsbGJhY2soZSxsLCEwKSxjPW51bGwpfXJldHVybiBzfShvLHMsYyl9fXJldHVybiBvfX0pLHppfWZ1bmN0aW9uIFphKCl7cmV0dXJuIFlpfHwoWWk9MSwkaT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxhPWUuX2dldERvbWFpbixvPWUuX2FzeW5jLGM9WWEoKS5XYXJuaW5nLHM9UmkoKSxsPXMuY2FuQXR0YWNoVHJhY2UsdT0vW1xcXC9dYmx1ZWJpcmRbXFxcL11qc1tcXFwvXShyZWxlYXNlfGRlYnVnfGluc3RydW1lbnRlZCkvLGY9L1woKD86dGltZXJzXC5qcyk6XGQrOlxkK1wpLyxkPS9bXC88XChdKC4rPyk6KFxkKyk6KFxkKylcKT9ccyokLyxoPW51bGwscD1udWxsLGc9ITEsbT0hKDA9PXMuZW52KCJCTFVFQklSRF9ERUJVRyIpfHwhcy5lbnYoIkJMVUVCSVJEX0RFQlVHIikmJiJkZXZlbG9wbWVudCIhPT1zLmVudigiTk9ERV9FTlYiKSksYj0hKDA9PXMuZW52KCJCTFVFQklSRF9XQVJOSU5HUyIpfHwhbSYmIXMuZW52KCJCTFVFQklSRF9XQVJOSU5HUyIpKSx5PSEoMD09cy5lbnYoIkJMVUVCSVJEX0xPTkdfU1RBQ0tfVFJBQ0VTIil8fCFtJiYhcy5lbnYoIkJMVUVCSVJEX0xPTkdfU1RBQ0tfVFJBQ0VTIikpLHY9MCE9cy5lbnYoIkJMVUVCSVJEX1dfRk9SR09UVEVOX1JFVFVSTiIpJiYoYnx8ISFzLmVudigiQkxVRUJJUkRfV19GT1JHT1RURU5fUkVUVVJOIikpO2UucHJvdG90eXBlLnN1cHByZXNzVW5oYW5kbGVkUmVqZWN0aW9ucz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX3RhcmdldCgpO2UuX2JpdEZpZWxkPS0xMDQ4NTc3JmUuX2JpdEZpZWxkfDUyNDI4OH0sZS5wcm90b3R5cGUuX2Vuc3VyZVBvc3NpYmxlUmVqZWN0aW9uSGFuZGxlZD1mdW5jdGlvbigpezA9PSg1MjQyODgmdGhpcy5fYml0RmllbGQpJiYodGhpcy5fc2V0UmVqZWN0aW9uSXNVbmhhbmRsZWQoKSxvLmludm9rZUxhdGVyKHRoaXMuX25vdGlmeVVuaGFuZGxlZFJlamVjdGlvbix0aGlzLHZvaWQgMCkpfSxlLnByb3RvdHlwZS5fbm90aWZ5VW5oYW5kbGVkUmVqZWN0aW9uSXNIYW5kbGVkPWZ1bmN0aW9uKCl7aigicmVqZWN0aW9uSGFuZGxlZCIsbix2b2lkIDAsdGhpcyl9LGUucHJvdG90eXBlLl9zZXRSZXR1cm5lZE5vblVuZGVmaW5lZD1mdW5jdGlvbigpe3RoaXMuX2JpdEZpZWxkPTI2ODQzNTQ1Nnx0aGlzLl9iaXRGaWVsZH0sZS5wcm90b3R5cGUuX3JldHVybmVkTm9uVW5kZWZpbmVkPWZ1bmN0aW9uKCl7cmV0dXJuIDAhPSgyNjg0MzU0NTYmdGhpcy5fYml0RmllbGQpfSxlLnByb3RvdHlwZS5fbm90aWZ5VW5oYW5kbGVkUmVqZWN0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy5faXNSZWplY3Rpb25VbmhhbmRsZWQoKSl7dmFyIGU9dGhpcy5fc2V0dGxlZFZhbHVlKCk7dGhpcy5fc2V0VW5oYW5kbGVkUmVqZWN0aW9uSXNOb3RpZmllZCgpLGooInVuaGFuZGxlZFJlamVjdGlvbiIscixlLHRoaXMpfX0sZS5wcm90b3R5cGUuX3NldFVuaGFuZGxlZFJlamVjdGlvbklzTm90aWZpZWQ9ZnVuY3Rpb24oKXt0aGlzLl9iaXRGaWVsZD0yNjIxNDR8dGhpcy5fYml0RmllbGR9LGUucHJvdG90eXBlLl91bnNldFVuaGFuZGxlZFJlamVjdGlvbklzTm90aWZpZWQ9ZnVuY3Rpb24oKXt0aGlzLl9iaXRGaWVsZD0tMjYyMTQ1JnRoaXMuX2JpdEZpZWxkfSxlLnByb3RvdHlwZS5faXNVbmhhbmRsZWRSZWplY3Rpb25Ob3RpZmllZD1mdW5jdGlvbigpe3JldHVybigyNjIxNDQmdGhpcy5fYml0RmllbGQpPjB9LGUucHJvdG90eXBlLl9zZXRSZWplY3Rpb25Jc1VuaGFuZGxlZD1mdW5jdGlvbigpe3RoaXMuX2JpdEZpZWxkPTEwNDg1NzZ8dGhpcy5fYml0RmllbGR9LGUucHJvdG90eXBlLl91bnNldFJlamVjdGlvbklzVW5oYW5kbGVkPWZ1bmN0aW9uKCl7dGhpcy5fYml0RmllbGQ9LTEwNDg1NzcmdGhpcy5fYml0RmllbGQsdGhpcy5faXNVbmhhbmRsZWRSZWplY3Rpb25Ob3RpZmllZCgpJiYodGhpcy5fdW5zZXRVbmhhbmRsZWRSZWplY3Rpb25Jc05vdGlmaWVkKCksdGhpcy5fbm90aWZ5VW5oYW5kbGVkUmVqZWN0aW9uSXNIYW5kbGVkKCkpfSxlLnByb3RvdHlwZS5faXNSZWplY3Rpb25VbmhhbmRsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4oMTA0ODU3NiZ0aGlzLl9iaXRGaWVsZCk+MH0sZS5wcm90b3R5cGUuX3dhcm49ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBCKGUsdCxufHx0aGlzKX0sZS5vblBvc3NpYmx5VW5oYW5kbGVkUmVqZWN0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PWEoKTtyPSJmdW5jdGlvbiI9PXR5cGVvZiBlP251bGw9PT10P2U6cy5kb21haW5CaW5kKHQsZSk6dm9pZCAwfSxlLm9uVW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlZD1mdW5jdGlvbihlKXt2YXIgdD1hKCk7bj0iZnVuY3Rpb24iPT10eXBlb2YgZT9udWxsPT09dD9lOnMuZG9tYWluQmluZCh0LGUpOnZvaWQgMH07dmFyIHg9ZnVuY3Rpb24oKXt9O2UubG9uZ1N0YWNrVHJhY2VzPWZ1bmN0aW9uKCl7aWYoby5oYXZlSXRlbXNRdWV1ZWQoKSYmIVkubG9uZ1N0YWNrVHJhY2VzKXRocm93IG5ldyBFcnJvcigiY2Fubm90IGVuYWJsZSBsb25nIHN0YWNrIHRyYWNlcyBhZnRlciBwcm9taXNlcyBoYXZlIGJlZW4gY3JlYXRlZFxuXG4gICAgU2VlIGh0dHA6Ly9nb28uZ2wvTXFyRm1YXG4iKTtpZighWS5sb25nU3RhY2tUcmFjZXMmJkgoKSl7dmFyIG49ZS5wcm90b3R5cGUuX2NhcHR1cmVTdGFja1RyYWNlLHI9ZS5wcm90b3R5cGUuX2F0dGFjaEV4dHJhVHJhY2U7WS5sb25nU3RhY2tUcmFjZXM9ITAseD1mdW5jdGlvbigpe2lmKG8uaGF2ZUl0ZW1zUXVldWVkKCkmJiFZLmxvbmdTdGFja1RyYWNlcyl0aHJvdyBuZXcgRXJyb3IoImNhbm5vdCBlbmFibGUgbG9uZyBzdGFjayB0cmFjZXMgYWZ0ZXIgcHJvbWlzZXMgaGF2ZSBiZWVuIGNyZWF0ZWRcblxuICAgIFNlZSBodHRwOi8vZ29vLmdsL01xckZtWFxuIik7ZS5wcm90b3R5cGUuX2NhcHR1cmVTdGFja1RyYWNlPW4sZS5wcm90b3R5cGUuX2F0dGFjaEV4dHJhVHJhY2U9cix0LmRlYWN0aXZhdGVMb25nU3RhY2tUcmFjZXMoKSxvLmVuYWJsZVRyYW1wb2xpbmUoKSxZLmxvbmdTdGFja1RyYWNlcz0hMX0sZS5wcm90b3R5cGUuX2NhcHR1cmVTdGFja1RyYWNlPU4sZS5wcm90b3R5cGUuX2F0dGFjaEV4dHJhVHJhY2U9UCx0LmFjdGl2YXRlTG9uZ1N0YWNrVHJhY2VzKCksby5kaXNhYmxlVHJhbXBvbGluZUlmTmVjZXNzYXJ5KCl9fSxlLmhhc0xvbmdTdGFja1RyYWNlcz1mdW5jdGlvbigpe3JldHVybiBZLmxvbmdTdGFja1RyYWNlcyYmSCgpfTt2YXIgRD1mdW5jdGlvbigpe3RyeXtpZigiZnVuY3Rpb24iPT10eXBlb2YgQ3VzdG9tRXZlbnQpe3ZhciBlPW5ldyBDdXN0b21FdmVudCgiQ3VzdG9tRXZlbnQiKTtyZXR1cm4gcy5nbG9iYWwuZGlzcGF0Y2hFdmVudChlKSxmdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBDdXN0b21FdmVudChlLnRvTG93ZXJDYXNlKCkse2RldGFpbDp0LGNhbmNlbGFibGU6ITB9KTtyZXR1cm4hcy5nbG9iYWwuZGlzcGF0Y2hFdmVudChuKX19aWYoImZ1bmN0aW9uIj09dHlwZW9mIEV2ZW50KXtlPW5ldyBFdmVudCgiQ3VzdG9tRXZlbnQiKTtyZXR1cm4gcy5nbG9iYWwuZGlzcGF0Y2hFdmVudChlKSxmdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBFdmVudChlLnRvTG93ZXJDYXNlKCkse2NhbmNlbGFibGU6ITB9KTtyZXR1cm4gbi5kZXRhaWw9dCwhcy5nbG9iYWwuZGlzcGF0Y2hFdmVudChuKX19cmV0dXJuKGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IikpLmluaXRDdXN0b21FdmVudCgidGVzdGluZ3RoZWV2ZW50IiwhMSwhMCx7fSkscy5nbG9iYWwuZGlzcGF0Y2hFdmVudChlKSxmdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpO3JldHVybiBuLmluaXRDdXN0b21FdmVudChlLnRvTG93ZXJDYXNlKCksITEsITAsdCksIXMuZ2xvYmFsLmRpc3BhdGNoRXZlbnQobil9fWNhdGNoKGUpe31yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4hMX19KCksVD1zLmlzTm9kZT9mdW5jdGlvbigpe3JldHVybiBTaS5lbWl0LmFwcGx5KFNpLGFyZ3VtZW50cyl9OnMuZ2xvYmFsP2Z1bmN0aW9uKGUpe3ZhciB0PSJvbiIrZS50b0xvd2VyQ2FzZSgpLG49cy5nbG9iYWxbdF07cmV0dXJuISFuJiYobi5hcHBseShzLmdsb2JhbCxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSksITApfTpmdW5jdGlvbigpe3JldHVybiExfTtmdW5jdGlvbiB3KGUsdCl7cmV0dXJue3Byb21pc2U6dH19dmFyIF89e3Byb21pc2VDcmVhdGVkOncscHJvbWlzZUZ1bGZpbGxlZDp3LHByb21pc2VSZWplY3RlZDp3LHByb21pc2VSZXNvbHZlZDp3LHByb21pc2VDYW5jZWxsZWQ6dyxwcm9taXNlQ2hhaW5lZDpmdW5jdGlvbihlLHQsbil7cmV0dXJue3Byb21pc2U6dCxjaGlsZDpufX0sd2FybmluZzpmdW5jdGlvbihlLHQpe3JldHVybnt3YXJuaW5nOnR9fSx1bmhhbmRsZWRSZWplY3Rpb246ZnVuY3Rpb24oZSx0LG4pe3JldHVybntyZWFzb246dCxwcm9taXNlOm59fSxyZWplY3Rpb25IYW5kbGVkOnd9LEU9ZnVuY3Rpb24oZSl7dmFyIHQ9ITE7dHJ5e3Q9VC5hcHBseShudWxsLGFyZ3VtZW50cyl9Y2F0Y2goZSl7by50aHJvd0xhdGVyKGUpLHQ9ITB9dmFyIG49ITE7dHJ5e249RChlLF9bZV0uYXBwbHkobnVsbCxhcmd1bWVudHMpKX1jYXRjaChlKXtvLnRocm93TGF0ZXIoZSksbj0hMH1yZXR1cm4gbnx8dH07ZnVuY3Rpb24gVSgpe3JldHVybiExfWZ1bmN0aW9uIEEoZSx0LG4pe3ZhciByPXRoaXM7dHJ5e2UodCxuLChmdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvbkNhbmNlbCBtdXN0IGJlIGEgZnVuY3Rpb24sIGdvdDogIitzLnRvU3RyaW5nKGUpKTtyLl9hdHRhY2hDYW5jZWxsYXRpb25DYWxsYmFjayhlKX0pKX1jYXRjaChlKXtyZXR1cm4gZX19ZnVuY3Rpb24gayhlKXtpZighdGhpcy5faXNDYW5jZWxsYWJsZSgpKXJldHVybiB0aGlzO3ZhciB0PXRoaXMuX29uQ2FuY2VsKCk7dm9pZCAwIT09dD9zLmlzQXJyYXkodCk/dC5wdXNoKGUpOnRoaXMuX3NldE9uQ2FuY2VsKFt0LGVdKTp0aGlzLl9zZXRPbkNhbmNlbChlKX1mdW5jdGlvbiBTKCl7cmV0dXJuIHRoaXMuX29uQ2FuY2VsRmllbGR9ZnVuY3Rpb24gQyhlKXt0aGlzLl9vbkNhbmNlbEZpZWxkPWV9ZnVuY3Rpb24gRigpe3RoaXMuX2NhbmNlbGxhdGlvblBhcmVudD12b2lkIDAsdGhpcy5fb25DYW5jZWxGaWVsZD12b2lkIDB9ZnVuY3Rpb24gTyhlLHQpe2lmKDAhPSgxJnQpKXt0aGlzLl9jYW5jZWxsYXRpb25QYXJlbnQ9ZTt2YXIgbj1lLl9icmFuY2hlc1JlbWFpbmluZ1RvQ2FuY2VsO3ZvaWQgMD09PW4mJihuPTApLGUuX2JyYW5jaGVzUmVtYWluaW5nVG9DYW5jZWw9bisxfTAhPSgyJnQpJiZlLl9pc0JvdW5kKCkmJnRoaXMuX3NldEJvdW5kVG8oZS5fYm91bmRUbyl9ZS5jb25maWc9ZnVuY3Rpb24odCl7aWYoImxvbmdTdGFja1RyYWNlcyJpbih0PU9iamVjdCh0KSkmJih0LmxvbmdTdGFja1RyYWNlcz9lLmxvbmdTdGFja1RyYWNlcygpOiF0LmxvbmdTdGFja1RyYWNlcyYmZS5oYXNMb25nU3RhY2tUcmFjZXMoKSYmeCgpKSwid2FybmluZ3MiaW4gdCl7dmFyIG49dC53YXJuaW5ncztZLndhcm5pbmdzPSEhbix2PVkud2FybmluZ3Mscy5pc09iamVjdChuKSYmIndGb3Jnb3R0ZW5SZXR1cm4iaW4gbiYmKHY9ISFuLndGb3Jnb3R0ZW5SZXR1cm4pfWlmKCJjYW5jZWxsYXRpb24iaW4gdCYmdC5jYW5jZWxsYXRpb24mJiFZLmNhbmNlbGxhdGlvbil7aWYoby5oYXZlSXRlbXNRdWV1ZWQoKSl0aHJvdyBuZXcgRXJyb3IoImNhbm5vdCBlbmFibGUgY2FuY2VsbGF0aW9uIGFmdGVyIHByb21pc2VzIGFyZSBpbiB1c2UiKTtlLnByb3RvdHlwZS5fY2xlYXJDYW5jZWxsYXRpb25EYXRhPUYsZS5wcm90b3R5cGUuX3Byb3BhZ2F0ZUZyb209TyxlLnByb3RvdHlwZS5fb25DYW5jZWw9UyxlLnByb3RvdHlwZS5fc2V0T25DYW5jZWw9QyxlLnByb3RvdHlwZS5fYXR0YWNoQ2FuY2VsbGF0aW9uQ2FsbGJhY2s9ayxlLnByb3RvdHlwZS5fZXhlY3V0ZT1BLEk9TyxZLmNhbmNlbGxhdGlvbj0hMH1yZXR1cm4ibW9uaXRvcmluZyJpbiB0JiYodC5tb25pdG9yaW5nJiYhWS5tb25pdG9yaW5nPyhZLm1vbml0b3Jpbmc9ITAsZS5wcm90b3R5cGUuX2ZpcmVFdmVudD1FKTohdC5tb25pdG9yaW5nJiZZLm1vbml0b3JpbmcmJihZLm1vbml0b3Jpbmc9ITEsZS5wcm90b3R5cGUuX2ZpcmVFdmVudD1VKSksZX0sZS5wcm90b3R5cGUuX2ZpcmVFdmVudD1VLGUucHJvdG90eXBlLl9leGVjdXRlPWZ1bmN0aW9uKGUsdCxuKXt0cnl7ZSh0LG4pfWNhdGNoKGUpe3JldHVybiBlfX0sZS5wcm90b3R5cGUuX29uQ2FuY2VsPWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5fc2V0T25DYW5jZWw9ZnVuY3Rpb24oZSl7fSxlLnByb3RvdHlwZS5fYXR0YWNoQ2FuY2VsbGF0aW9uQ2FsbGJhY2s9ZnVuY3Rpb24oZSl7fSxlLnByb3RvdHlwZS5fY2FwdHVyZVN0YWNrVHJhY2U9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLl9hdHRhY2hFeHRyYVRyYWNlPWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5fY2xlYXJDYW5jZWxsYXRpb25EYXRhPWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5fcHJvcGFnYXRlRnJvbT1mdW5jdGlvbihlLHQpe307dmFyIEk9ZnVuY3Rpb24oZSx0KXswIT0oMiZ0KSYmZS5faXNCb3VuZCgpJiZ0aGlzLl9zZXRCb3VuZFRvKGUuX2JvdW5kVG8pfTtmdW5jdGlvbiBSKCl7dmFyIHQ9dGhpcy5fYm91bmRUbztyZXR1cm4gdm9pZCAwIT09dCYmdCBpbnN0YW5jZW9mIGU/dC5pc0Z1bGZpbGxlZCgpP3QudmFsdWUoKTp2b2lkIDA6dH1mdW5jdGlvbiBOKCl7dGhpcy5fdHJhY2U9bmV3IFgodGhpcy5fcGVla0NvbnRleHQoKSl9ZnVuY3Rpb24gUChlLHQpe2lmKGwoZSkpe3ZhciBuPXRoaXMuX3RyYWNlO2lmKHZvaWQgMCE9PW4mJnQmJihuPW4uX3BhcmVudCksdm9pZCAwIT09biluLmF0dGFjaEV4dHJhVHJhY2UoZSk7ZWxzZSBpZighZS5fX3N0YWNrQ2xlYW5lZF9fKXt2YXIgcj1MKGUpO3Mubm90RW51bWVyYWJsZVByb3AoZSwic3RhY2siLHIubWVzc2FnZSsiXG4iK3Iuc3RhY2suam9pbigiXG4iKSkscy5ub3RFbnVtZXJhYmxlUHJvcChlLCJfX3N0YWNrQ2xlYW5lZF9fIiwhMCl9fX1mdW5jdGlvbiBCKHQsbixyKXtpZihZLndhcm5pbmdzKXt2YXIgaSxhPW5ldyBjKHQpO2lmKG4pci5fYXR0YWNoRXh0cmFUcmFjZShhKTtlbHNlIGlmKFkubG9uZ1N0YWNrVHJhY2VzJiYoaT1lLl9wZWVrQ29udGV4dCgpKSlpLmF0dGFjaEV4dHJhVHJhY2UoYSk7ZWxzZXt2YXIgbz1MKGEpO2Euc3RhY2s9by5tZXNzYWdlKyJcbiIrby5zdGFjay5qb2luKCJcbiIpfUUoIndhcm5pbmciLGEpfHxNKGEsIiIsITApfX1mdW5jdGlvbiBXKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDsrK24pe3ZhciByPWVbbl0saT0iICAgIChObyBzdGFjayB0cmFjZSkiPT09cnx8aC50ZXN0KHIpLGE9aSYmVihyKTtpJiYhYSYmKGcmJiIgIiE9PXIuY2hhckF0KDApJiYocj0iICAgICIrciksdC5wdXNoKHIpKX1yZXR1cm4gdH1mdW5jdGlvbiBMKGUpe3ZhciB0PWUuc3RhY2ssbj1lLnRvU3RyaW5nKCk7cmV0dXJuIHQ9InN0cmluZyI9PXR5cGVvZiB0JiZ0Lmxlbmd0aD4wP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLnN0YWNrLnJlcGxhY2UoL1xzKyQvZywiIikuc3BsaXQoIlxuIiksbj0wO248dC5sZW5ndGg7KytuKXt2YXIgcj10W25dO2lmKCIgICAgKE5vIHN0YWNrIHRyYWNlKSI9PT1yfHxoLnRlc3QocikpYnJlYWt9cmV0dXJuIG4+MCYmIlN5bnRheEVycm9yIiE9ZS5uYW1lJiYodD10LnNsaWNlKG4pKSx0fShlKTpbIiAgICAoTm8gc3RhY2sgdHJhY2UpIl0se21lc3NhZ2U6bixzdGFjazoiU3ludGF4RXJyb3IiPT1lLm5hbWU/dDpXKHQpfX1mdW5jdGlvbiBNKGUsdCxuKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGNvbnNvbGUpe3ZhciByO2lmKHMuaXNPYmplY3QoZSkpe3ZhciBhPWUuc3RhY2s7cj10K3AoYSxlKX1lbHNlIHI9dCtTdHJpbmcoZSk7ImZ1bmN0aW9uIj09dHlwZW9mIGk/aShyLG4pOiJmdW5jdGlvbiIhPXR5cGVvZiBjb25zb2xlLmxvZyYmIm9iamVjdCIhPXR5cGVvZiBjb25zb2xlLmxvZ3x8Y29uc29sZS5sb2cocil9fWZ1bmN0aW9uIGooZSx0LG4scil7dmFyIGk9ITE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoaT0hMCwicmVqZWN0aW9uSGFuZGxlZCI9PT1lP3Qocik6dChuLHIpKX1jYXRjaChlKXtvLnRocm93TGF0ZXIoZSl9InVuaGFuZGxlZFJlamVjdGlvbiI9PT1lP0UoZSxuLHIpfHxpfHxNKG4sIlVuaGFuZGxlZCByZWplY3Rpb24gIik6RShlLHIpfWZ1bmN0aW9uIHooZSl7dmFyIHQ7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpdD0iW2Z1bmN0aW9uICIrKGUubmFtZXx8ImFub255bW91cyIpKyJdIjtlbHNle3Q9ZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9TdHJpbmc/ZS50b1N0cmluZygpOnMudG9TdHJpbmcoZSk7aWYoL1xbb2JqZWN0IFthLXpBLVowLTkkX10rXF0vLnRlc3QodCkpdHJ5e3Q9SlNPTi5zdHJpbmdpZnkoZSl9Y2F0Y2goZSl7fTA9PT10Lmxlbmd0aCYmKHQ9IihlbXB0eSBhcnJheSkiKX1yZXR1cm4iKDwiK2Z1bmN0aW9uKGUpe3ZhciB0PTQxO2lmKGUubGVuZ3RoPHQpcmV0dXJuIGU7cmV0dXJuIGUuc3Vic3RyKDAsdC0zKSsiLi4uIn0odCkrIj4sIG5vIHN0YWNrIHRyYWNlKSJ9ZnVuY3Rpb24gSCgpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiAkfXZhciBWPWZ1bmN0aW9uKCl7cmV0dXJuITF9LHE9L1tcLzxcKF0oW146XC9dKyk6KFxkKyk6KD86XGQrKVwpP1xzKiQvO2Z1bmN0aW9uIEcoZSl7dmFyIHQ9ZS5tYXRjaChxKTtpZih0KXJldHVybntmaWxlTmFtZTp0WzFdLGxpbmU6cGFyc2VJbnQodFsyXSwxMCl9fWZ1bmN0aW9uIFgoZSl7dGhpcy5fcGFyZW50PWUsdGhpcy5fcHJvbWlzZXNDcmVhdGVkPTA7dmFyIHQ9dGhpcy5fbGVuZ3RoPTErKHZvaWQgMD09PWU/MDplLl9sZW5ndGgpOyQodGhpcyxYKSx0PjMyJiZ0aGlzLnVuY3ljbGUoKX1zLmluaGVyaXRzKFgsRXJyb3IpLHQuQ2FwdHVyZWRUcmFjZT1YLFgucHJvdG90eXBlLnVuY3ljbGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9sZW5ndGg7aWYoIShlPDIpKXtmb3IodmFyIHQ9W10sbj17fSxyPTAsaT10aGlzO3ZvaWQgMCE9PWk7KytyKXQucHVzaChpKSxpPWkuX3BhcmVudDtmb3Iocj0oZT10aGlzLl9sZW5ndGg9ciktMTtyPj0wOy0tcil7dmFyIGE9dFtyXS5zdGFjazt2b2lkIDA9PT1uW2FdJiYoblthXT1yKX1mb3Iocj0wO3I8ZTsrK3Ipe3ZhciBvPW5bdFtyXS5zdGFja107aWYodm9pZCAwIT09byYmbyE9PXIpe28+MCYmKHRbby0xXS5fcGFyZW50PXZvaWQgMCx0W28tMV0uX2xlbmd0aD0xKSx0W3JdLl9wYXJlbnQ9dm9pZCAwLHRbcl0uX2xlbmd0aD0xO3ZhciBjPXI+MD90W3ItMV06dGhpcztvPGUtMT8oYy5fcGFyZW50PXRbbysxXSxjLl9wYXJlbnQudW5jeWNsZSgpLGMuX2xlbmd0aD1jLl9wYXJlbnQuX2xlbmd0aCsxKTooYy5fcGFyZW50PXZvaWQgMCxjLl9sZW5ndGg9MSk7Zm9yKHZhciBzPWMuX2xlbmd0aCsxLGw9ci0yO2w+PTA7LS1sKXRbbF0uX2xlbmd0aD1zLHMrKztyZXR1cm59fX19LFgucHJvdG90eXBlLmF0dGFjaEV4dHJhVHJhY2U9ZnVuY3Rpb24oZSl7aWYoIWUuX19zdGFja0NsZWFuZWRfXyl7dGhpcy51bmN5Y2xlKCk7Zm9yKHZhciB0PUwoZSksbj10Lm1lc3NhZ2Uscj1bdC5zdGFja10saT10aGlzO3ZvaWQgMCE9PWk7KXIucHVzaChXKGkuc3RhY2suc3BsaXQoIlxuIikpKSxpPWkuX3BhcmVudDshZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWVbMF0sbj0xO248ZS5sZW5ndGg7KytuKXtmb3IodmFyIHI9ZVtuXSxpPXQubGVuZ3RoLTEsYT10W2ldLG89LTEsYz1yLmxlbmd0aC0xO2M+PTA7LS1jKWlmKHJbY109PT1hKXtvPWM7YnJlYWt9Zm9yKGM9bztjPj0wOy0tYyl7dmFyIHM9cltjXTtpZih0W2ldIT09cylicmVhazt0LnBvcCgpLGktLX10PXJ9fShyKSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoOysrdCkoMD09PWVbdF0ubGVuZ3RofHx0KzE8ZS5sZW5ndGgmJmVbdF1bMF09PT1lW3QrMV1bMF0pJiYoZS5zcGxpY2UodCwxKSx0LS0pfShyKSxzLm5vdEVudW1lcmFibGVQcm9wKGUsInN0YWNrIixmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGgtMTsrK24pdFtuXS5wdXNoKCJGcm9tIHByZXZpb3VzIGV2ZW50OiIpLHRbbl09dFtuXS5qb2luKCJcbiIpO3JldHVybiBuPHQubGVuZ3RoJiYodFtuXT10W25dLmpvaW4oIlxuIikpLGUrIlxuIit0LmpvaW4oIlxuIil9KG4scikpLHMubm90RW51bWVyYWJsZVByb3AoZSwiX19zdGFja0NsZWFuZWRfXyIsITApfX07dmFyICQ9ZnVuY3Rpb24oKXt2YXIgZT0vXlxzKmF0XHMqLyx0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP2U6dm9pZCAwIT09dC5uYW1lJiZ2b2lkIDAhPT10Lm1lc3NhZ2U/dC50b1N0cmluZygpOnoodCl9O2lmKCJudW1iZXIiPT10eXBlb2YgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0JiYiZnVuY3Rpb24iPT10eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2Upe0Vycm9yLnN0YWNrVHJhY2VMaW1pdCs9NixoPWUscD10O3ZhciBuPUVycm9yLmNhcHR1cmVTdGFja1RyYWNlO3JldHVybiBWPWZ1bmN0aW9uKGUpe3JldHVybiB1LnRlc3QoZSl9LGZ1bmN0aW9uKGUsdCl7RXJyb3Iuc3RhY2tUcmFjZUxpbWl0Kz02LG4oZSx0KSxFcnJvci5zdGFja1RyYWNlTGltaXQtPTZ9fXZhciByLGk9bmV3IEVycm9yO2lmKCJzdHJpbmciPT10eXBlb2YgaS5zdGFjayYmaS5zdGFjay5zcGxpdCgiXG4iKVswXS5pbmRleE9mKCJzdGFja0RldGVjdGlvbkAiKT49MClyZXR1cm4gaD0vQC8scD10LGc9ITAsZnVuY3Rpb24oZSl7ZS5zdGFjaz0obmV3IEVycm9yKS5zdGFja307dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChlKXtyPSJzdGFjayJpbiBlfXJldHVybiEoInN0YWNrImluIGkpJiZyJiYibnVtYmVyIj09dHlwZW9mIEVycm9yLnN0YWNrVHJhY2VMaW1pdD8oaD1lLHA9dCxmdW5jdGlvbihlKXtFcnJvci5zdGFja1RyYWNlTGltaXQrPTY7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaCh0KXtlLnN0YWNrPXQuc3RhY2t9RXJyb3Iuc3RhY2tUcmFjZUxpbWl0LT02fSk6KHA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/ZToib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0fHx2b2lkIDA9PT10Lm5hbWV8fHZvaWQgMD09PXQubWVzc2FnZT96KHQpOnQudG9TdHJpbmcoKX0sbnVsbCl9KCk7InVuZGVmaW5lZCIhPXR5cGVvZiBjb25zb2xlJiZ2b2lkIDAhPT1jb25zb2xlLndhcm4mJihpPWZ1bmN0aW9uKGUpe2NvbnNvbGUud2FybihlKX0scy5pc05vZGUmJlNpLnN0ZGVyci5pc1RUWT9pPWZ1bmN0aW9uKGUsdCl7dmFyIG49dD8iG1szM20iOiIbWzMxbSI7Y29uc29sZS53YXJuKG4rZSsiG1swbVxuIil9OnMuaXNOb2RlfHwic3RyaW5nIiE9dHlwZW9mKG5ldyBFcnJvcikuc3RhY2t8fChpPWZ1bmN0aW9uKGUsdCl7Y29uc29sZS53YXJuKCIlYyIrZSx0PyJjb2xvcjogZGFya29yYW5nZSI6ImNvbG9yOiByZWQiKX0pKTt2YXIgWT17d2FybmluZ3M6Yixsb25nU3RhY2tUcmFjZXM6ITEsY2FuY2VsbGF0aW9uOiExLG1vbml0b3Jpbmc6ITF9O3JldHVybiB5JiZlLmxvbmdTdGFja1RyYWNlcygpLHtsb25nU3RhY2tUcmFjZXM6ZnVuY3Rpb24oKXtyZXR1cm4gWS5sb25nU3RhY2tUcmFjZXN9LHdhcm5pbmdzOmZ1bmN0aW9uKCl7cmV0dXJuIFkud2FybmluZ3N9LGNhbmNlbGxhdGlvbjpmdW5jdGlvbigpe3JldHVybiBZLmNhbmNlbGxhdGlvbn0sbW9uaXRvcmluZzpmdW5jdGlvbigpe3JldHVybiBZLm1vbml0b3Jpbmd9LHByb3BhZ2F0ZUZyb21GdW5jdGlvbjpmdW5jdGlvbigpe3JldHVybiBJfSxib3VuZFZhbHVlRnVuY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gUn0sY2hlY2tGb3Jnb3R0ZW5SZXR1cm5zOmZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYodm9pZCAwPT09ZSYmbnVsbCE9PXQmJnYpe2lmKHZvaWQgMCE9PWkmJmkuX3JldHVybmVkTm9uVW5kZWZpbmVkKCkpcmV0dXJuO2lmKDA9PSg2NTUzNSZyLl9iaXRGaWVsZCkpcmV0dXJuO24mJihuKz0iICIpO3ZhciBhPSIiLG89IiI7aWYodC5fdHJhY2Upe2Zvcih2YXIgYz10Ll90cmFjZS5zdGFjay5zcGxpdCgiXG4iKSxzPVcoYyksbD1zLmxlbmd0aC0xO2w+PTA7LS1sKXt2YXIgdT1zW2xdO2lmKCFmLnRlc3QodSkpe3ZhciBoPXUubWF0Y2goZCk7aCYmKGE9ImF0ICIraFsxXSsiOiIraFsyXSsiOiIraFszXSsiICIpO2JyZWFrfX1pZihzLmxlbmd0aD4wKXt2YXIgcD1zWzBdO2ZvcihsPTA7bDxjLmxlbmd0aDsrK2wpaWYoY1tsXT09PXApe2w+MCYmKG89IlxuIitjW2wtMV0pO2JyZWFrfX19dmFyIGc9ImEgcHJvbWlzZSB3YXMgY3JlYXRlZCBpbiBhICIrbisiaGFuZGxlciAiK2ErImJ1dCB3YXMgbm90IHJldHVybmVkIGZyb20gaXQsIHNlZSBodHRwOi8vZ29vLmdsL3JScU1VdyIrbztyLl93YXJuKGcsITAsdCl9fSxzZXRCb3VuZHM6ZnVuY3Rpb24oZSx0KXtpZihIKCkpe2Zvcih2YXIgbixyLGk9ZS5zdGFjay5zcGxpdCgiXG4iKSxhPXQuc3RhY2suc3BsaXQoIlxuIiksbz0tMSxjPS0xLHM9MDtzPGkubGVuZ3RoOysrcyl7aWYobD1HKGlbc10pKXtuPWwuZmlsZU5hbWUsbz1sLmxpbmU7YnJlYWt9fWZvcihzPTA7czxhLmxlbmd0aDsrK3Mpe3ZhciBsO2lmKGw9RyhhW3NdKSl7cj1sLmZpbGVOYW1lLGM9bC5saW5lO2JyZWFrfX1vPDB8fGM8MHx8IW58fCFyfHxuIT09cnx8bz49Y3x8KFY9ZnVuY3Rpb24oZSl7aWYodS50ZXN0KGUpKXJldHVybiEwO3ZhciB0PUcoZSk7cmV0dXJuISEodCYmdC5maWxlTmFtZT09PW4mJm88PXQubGluZSYmdC5saW5lPD1jKX0pfX0sd2FybjpCLGRlcHJlY2F0ZWQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lKyIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIjtyZXR1cm4gdCYmKG4rPSIgVXNlICIrdCsiIGluc3RlYWQuIiksQihuKX0sQ2FwdHVyZWRUcmFjZTpYLGZpcmVEb21FdmVudDpELGZpcmVHbG9iYWxFdmVudDpUfX0pLCRpfWZ1bmN0aW9uIEphKCl7aWYodGEpcmV0dXJuIGVhO3RhPTE7dmFyIGU9UmkoKSx0PWUubWF5YmVXcmFwQXNFcnJvcixuPVlhKCkuT3BlcmF0aW9uYWxFcnJvcixyPUlpKCk7dmFyIGk9L14oPzpuYW1lfG1lc3NhZ2V8c3RhY2t8Y2F1c2UpJC87ZnVuY3Rpb24gYSh0KXt2YXIgYTtpZihmdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEVycm9yJiZyLmdldFByb3RvdHlwZU9mKGUpPT09RXJyb3IucHJvdG90eXBlfSh0KSl7KGE9bmV3IG4odCkpLm5hbWU9dC5uYW1lLGEubWVzc2FnZT10Lm1lc3NhZ2UsYS5zdGFjaz10LnN0YWNrO2Zvcih2YXIgbz1yLmtleXModCksYz0wO2M8by5sZW5ndGg7KytjKXt2YXIgcz1vW2NdO2kudGVzdChzKXx8KGFbc109dFtzXSl9cmV0dXJuIGF9cmV0dXJuIGUubWFya0FzT3JpZ2luYXRpbmdGcm9tUmVqZWN0aW9uKHQpLHR9cmV0dXJuIGVhPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7aWYobnVsbCE9PWUpe2lmKHIpe3ZhciBvPWEodChyKSk7ZS5fYXR0YWNoRXh0cmFUcmFjZShvKSxlLl9yZWplY3Qobyl9ZWxzZSBpZihuKXtmb3IodmFyIGM9YXJndW1lbnRzLmxlbmd0aCxzPW5ldyBBcnJheShNYXRoLm1heChjLTEsMCkpLGw9MTtsPGM7KytsKXNbbC0xXT1hcmd1bWVudHNbbF07ZS5fZnVsZmlsbChzKX1lbHNlIGUuX2Z1bGZpbGwoaSk7ZT1udWxsfX19LGVhfWZ1bmN0aW9uIFFhKCl7cmV0dXJuIGZhfHwoZmE9MSx1YT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3ZvaWQgMCE9PWU/KGU9ZS5fdGFyZ2V0KCksdGhpcy5fYml0RmllbGQ9ZS5fYml0RmllbGQsdGhpcy5fc2V0dGxlZFZhbHVlRmllbGQ9ZS5faXNGYXRlU2VhbGVkKCk/ZS5fc2V0dGxlZFZhbHVlKCk6dm9pZCAwKToodGhpcy5fYml0RmllbGQ9MCx0aGlzLl9zZXR0bGVkVmFsdWVGaWVsZD12b2lkIDApfXQucHJvdG90eXBlLl9zZXR0bGVkVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0dGxlZFZhbHVlRmllbGR9O3ZhciBuPXQucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNGdWxmaWxsZWQoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3QgZ2V0IGZ1bGZpbGxtZW50IHZhbHVlIG9mIGEgbm9uLWZ1bGZpbGxlZCBwcm9taXNlXG5cbiAgICBTZWUgaHR0cDovL2dvby5nbC9NcXJGbVhcbiIpO3JldHVybiB0aGlzLl9zZXR0bGVkVmFsdWUoKX0scj10LnByb3RvdHlwZS5lcnJvcj10LnByb3RvdHlwZS5yZWFzb249ZnVuY3Rpb24oKXtpZighdGhpcy5pc1JlamVjdGVkKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2Fubm90IGdldCByZWplY3Rpb24gcmVhc29uIG9mIGEgbm9uLXJlamVjdGVkIHByb21pc2VcblxuICAgIFNlZSBodHRwOi8vZ29vLmdsL01xckZtWFxuIik7cmV0dXJuIHRoaXMuX3NldHRsZWRWYWx1ZSgpfSxpPXQucHJvdG90eXBlLmlzRnVsZmlsbGVkPWZ1bmN0aW9uKCl7cmV0dXJuIDAhPSgzMzU1NDQzMiZ0aGlzLl9iaXRGaWVsZCl9LGE9dC5wcm90b3R5cGUuaXNSZWplY3RlZD1mdW5jdGlvbigpe3JldHVybiAwIT0oMTY3NzcyMTYmdGhpcy5fYml0RmllbGQpfSxvPXQucHJvdG90eXBlLmlzUGVuZGluZz1mdW5jdGlvbigpe3JldHVybiAwPT0oNTAzOTcxODQmdGhpcy5fYml0RmllbGQpfSxjPXQucHJvdG90eXBlLmlzUmVzb2x2ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9KDUwMzMxNjQ4JnRoaXMuX2JpdEZpZWxkKX07dC5wcm90b3R5cGUuaXNDYW5jZWxsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9KDg0NTQxNDQmdGhpcy5fYml0RmllbGQpfSxlLnByb3RvdHlwZS5fX2lzQ2FuY2VsbGVkPWZ1bmN0aW9uKCl7cmV0dXJuIDY1NTM2PT0oNjU1MzYmdGhpcy5fYml0RmllbGQpfSxlLnByb3RvdHlwZS5faXNDYW5jZWxsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGFyZ2V0KCkuX19pc0NhbmNlbGxlZCgpfSxlLnByb3RvdHlwZS5pc0NhbmNlbGxlZD1mdW5jdGlvbigpe3JldHVybiAwIT0oODQ1NDE0NCZ0aGlzLl90YXJnZXQoKS5fYml0RmllbGQpfSxlLnByb3RvdHlwZS5pc1BlbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gby5jYWxsKHRoaXMuX3RhcmdldCgpKX0sZS5wcm90b3R5cGUuaXNSZWplY3RlZD1mdW5jdGlvbigpe3JldHVybiBhLmNhbGwodGhpcy5fdGFyZ2V0KCkpfSxlLnByb3RvdHlwZS5pc0Z1bGZpbGxlZD1mdW5jdGlvbigpe3JldHVybiBpLmNhbGwodGhpcy5fdGFyZ2V0KCkpfSxlLnByb3RvdHlwZS5pc1Jlc29sdmVkPWZ1bmN0aW9uKCl7cmV0dXJuIGMuY2FsbCh0aGlzLl90YXJnZXQoKSl9LGUucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIG4uY2FsbCh0aGlzLl90YXJnZXQoKSl9LGUucHJvdG90eXBlLnJlYXNvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX3RhcmdldCgpO3JldHVybiBlLl91bnNldFJlamVjdGlvbklzVW5oYW5kbGVkKCksci5jYWxsKGUpfSxlLnByb3RvdHlwZS5fdmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0dGxlZFZhbHVlKCl9LGUucHJvdG90eXBlLl9yZWFzb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW5zZXRSZWplY3Rpb25Jc1VuaGFuZGxlZCgpLHRoaXMuX3NldHRsZWRWYWx1ZSgpfSxlLlByb21pc2VJbnNwZWN0aW9uPXR9KSx1YX1mdW5jdGlvbiBlbygpe3JldHVybiBnYXx8KGdhPTEscGE9ZnVuY3Rpb24oZSx0LG4scixpLGEpe3ZhciBvPWUuX2dldERvbWFpbixjPVJpKCkscz1jLnRyeUNhdGNoLGw9Yy5lcnJvck9iaix1PWUuX2FzeW5jO2Z1bmN0aW9uIGYoZSx0LG4scil7dGhpcy5jb25zdHJ1Y3RvciQoZSksdGhpcy5fcHJvbWlzZS5fY2FwdHVyZVN0YWNrVHJhY2UoKTt2YXIgYT1vKCk7dGhpcy5fY2FsbGJhY2s9bnVsbD09PWE/dDpjLmRvbWFpbkJpbmQoYSx0KSx0aGlzLl9wcmVzZXJ2ZWRWYWx1ZXM9cj09PWk/bmV3IEFycmF5KHRoaXMubGVuZ3RoKCkpOm51bGwsdGhpcy5fbGltaXQ9bix0aGlzLl9pbkZsaWdodD0wLHRoaXMuX3F1ZXVlPVtdLHUuaW52b2tlKHRoaXMuX2FzeW5jSW5pdCx0aGlzLHZvaWQgMCl9ZnVuY3Rpb24gZCh0LHIsaSxhKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgcilyZXR1cm4gbigiZXhwZWN0aW5nIGEgZnVuY3Rpb24gYnV0IGdvdCAiK2MuY2xhc3NTdHJpbmcocikpO3ZhciBvPTA7aWYodm9pZCAwIT09aSl7aWYoIm9iamVjdCIhPXR5cGVvZiBpfHxudWxsPT09aSlyZXR1cm4gZS5yZWplY3QobmV3IFR5cGVFcnJvcigib3B0aW9ucyBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdCBidXQgaXQgaXMgIitjLmNsYXNzU3RyaW5nKGkpKSk7aWYoIm51bWJlciIhPXR5cGVvZiBpLmNvbmN1cnJlbmN5KXJldHVybiBlLnJlamVjdChuZXcgVHlwZUVycm9yKCInY29uY3VycmVuY3knIG11c3QgYmUgYSBudW1iZXIgYnV0IGl0IGlzICIrYy5jbGFzc1N0cmluZyhpLmNvbmN1cnJlbmN5KSkpO289aS5jb25jdXJyZW5jeX1yZXR1cm4gbmV3IGYodCxyLG89Im51bWJlciI9PXR5cGVvZiBvJiZpc0Zpbml0ZShvKSYmbz49MT9vOjAsYSkucHJvbWlzZSgpfWMuaW5oZXJpdHMoZix0KSxmLnByb3RvdHlwZS5fYXN5bmNJbml0PWZ1bmN0aW9uKCl7dGhpcy5faW5pdCQodm9pZCAwLC0yKX0sZi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oKXt9LGYucHJvdG90eXBlLl9wcm9taXNlRnVsZmlsbGVkPWZ1bmN0aW9uKHQsbil7dmFyIGk9dGhpcy5fdmFsdWVzLG89dGhpcy5sZW5ndGgoKSxjPXRoaXMuX3ByZXNlcnZlZFZhbHVlcyx1PXRoaXMuX2xpbWl0O2lmKG48MCl7aWYoaVtuPS0xKm4tMV09dCx1Pj0xJiYodGhpcy5faW5GbGlnaHQtLSx0aGlzLl9kcmFpblF1ZXVlKCksdGhpcy5faXNSZXNvbHZlZCgpKSlyZXR1cm4hMH1lbHNle2lmKHU+PTEmJnRoaXMuX2luRmxpZ2h0Pj11KXJldHVybiBpW25dPXQsdGhpcy5fcXVldWUucHVzaChuKSwhMTtudWxsIT09YyYmKGNbbl09dCk7dmFyIGY9dGhpcy5fcHJvbWlzZSxkPXRoaXMuX2NhbGxiYWNrLGg9Zi5fYm91bmRWYWx1ZSgpO2YuX3B1c2hDb250ZXh0KCk7dmFyIHA9cyhkKS5jYWxsKGgsdCxuLG8pLGc9Zi5fcG9wQ29udGV4dCgpO2lmKGEuY2hlY2tGb3Jnb3R0ZW5SZXR1cm5zKHAsZyxudWxsIT09Yz8iUHJvbWlzZS5maWx0ZXIiOiJQcm9taXNlLm1hcCIsZikscD09PWwpcmV0dXJuIHRoaXMuX3JlamVjdChwLmUpLCEwO3ZhciBtPXIocCx0aGlzLl9wcm9taXNlKTtpZihtIGluc3RhbmNlb2YgZSl7dmFyIGI9KG09bS5fdGFyZ2V0KCkpLl9iaXRGaWVsZDtpZigwPT0oNTAzOTcxODQmYikpcmV0dXJuIHU+PTEmJnRoaXMuX2luRmxpZ2h0KyssaVtuXT1tLG0uX3Byb3h5KHRoaXMsLTEqKG4rMSkpLCExO2lmKDA9PSgzMzU1NDQzMiZiKSlyZXR1cm4gMCE9KDE2Nzc3MjE2JmIpPyh0aGlzLl9yZWplY3QobS5fcmVhc29uKCkpLCEwKToodGhpcy5fY2FuY2VsKCksITApO3A9bS5fdmFsdWUoKX1pW25dPXB9cmV0dXJuKyt0aGlzLl90b3RhbFJlc29sdmVkPj1vJiYobnVsbCE9PWM/dGhpcy5fZmlsdGVyKGksYyk6dGhpcy5fcmVzb2x2ZShpKSwhMCl9LGYucHJvdG90eXBlLl9kcmFpblF1ZXVlPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuX3F1ZXVlLHQ9dGhpcy5fbGltaXQsbj10aGlzLl92YWx1ZXM7ZS5sZW5ndGg+MCYmdGhpcy5faW5GbGlnaHQ8dDspe2lmKHRoaXMuX2lzUmVzb2x2ZWQoKSlyZXR1cm47dmFyIHI9ZS5wb3AoKTt0aGlzLl9wcm9taXNlRnVsZmlsbGVkKG5bcl0scil9fSxmLnByb3RvdHlwZS5fZmlsdGVyPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQubGVuZ3RoLHI9bmV3IEFycmF5KG4pLGk9MCxhPTA7YTxuOysrYSllW2FdJiYocltpKytdPXRbYV0pO3IubGVuZ3RoPWksdGhpcy5fcmVzb2x2ZShyKX0sZi5wcm90b3R5cGUucHJlc2VydmVkVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZXNlcnZlZFZhbHVlc30sZS5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGQodGhpcyxlLHQsbnVsbCl9LGUubWFwPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBkKGUsdCxuLHIpfX0pLHBhfWZ1bmN0aW9uIHRvKCl7cmV0dXJuIHZhfHwodmE9MSx5YT1mdW5jdGlvbihlLHQsbixyLGksYSl7dmFyIG89UmkoKSxjPVlhKCkuVHlwZUVycm9yLHM9UmkoKS5pbmhlcml0cyxsPW8uZXJyb3JPYmosdT1vLnRyeUNhdGNoLGY9e307ZnVuY3Rpb24gZChlKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rocm93IGV9KSwwKX1mdW5jdGlvbiBoKHQscil7dmFyIGE9MCxvPXQubGVuZ3RoLGM9bmV3IGUoaSk7cmV0dXJuIGZ1bmN0aW9uIGkoKXtpZihhPj1vKXJldHVybiBjLl9mdWxmaWxsKCk7dmFyIHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bihlKTtyZXR1cm4gdCE9PWUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLl9pc0Rpc3Bvc2FibGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLl9nZXREaXNwb3NlciYmZS5faXNEaXNwb3NhYmxlKCkmJnQuX3NldERpc3Bvc2FibGUoZS5fZ2V0RGlzcG9zZXIoKSksdH0odFthKytdKTtpZihzIGluc3RhbmNlb2YgZSYmcy5faXNEaXNwb3NhYmxlKCkpe3RyeXtzPW4ocy5fZ2V0RGlzcG9zZXIoKS50cnlEaXNwb3NlKHIpLHQucHJvbWlzZSl9Y2F0Y2goZSl7cmV0dXJuIGQoZSl9aWYocyBpbnN0YW5jZW9mIGUpcmV0dXJuIHMuX3RoZW4oaSxkLG51bGwsbnVsbCxudWxsKX1pKCl9KCksY31mdW5jdGlvbiBwKGUsdCxuKXt0aGlzLl9kYXRhPWUsdGhpcy5fcHJvbWlzZT10LHRoaXMuX2NvbnRleHQ9bn1mdW5jdGlvbiBnKGUsdCxuKXt0aGlzLmNvbnN0cnVjdG9yJChlLHQsbil9ZnVuY3Rpb24gbShlKXtyZXR1cm4gcC5pc0Rpc3Bvc2VyKGUpPyh0aGlzLnJlc291cmNlc1t0aGlzLmluZGV4XS5fc2V0RGlzcG9zYWJsZShlKSxlLnByb21pc2UoKSk6ZX1mdW5jdGlvbiBiKGUpe3RoaXMubGVuZ3RoPWUsdGhpcy5wcm9taXNlPW51bGwsdGhpc1tlLTFdPW51bGx9cC5wcm90b3R5cGUuZGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfSxwLnByb3RvdHlwZS5wcm9taXNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb21pc2V9LHAucHJvdG90eXBlLnJlc291cmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvbWlzZSgpLmlzRnVsZmlsbGVkKCk/dGhpcy5wcm9taXNlKCkudmFsdWUoKTpmfSxwLnByb3RvdHlwZS50cnlEaXNwb3NlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucmVzb3VyY2UoKSxuPXRoaXMuX2NvbnRleHQ7dm9pZCAwIT09biYmbi5fcHVzaENvbnRleHQoKTt2YXIgcj10IT09Zj90aGlzLmRvRGlzcG9zZSh0LGUpOm51bGw7cmV0dXJuIHZvaWQgMCE9PW4mJm4uX3BvcENvbnRleHQoKSx0aGlzLl9wcm9taXNlLl91bnNldERpc3Bvc2FibGUoKSx0aGlzLl9kYXRhPW51bGwscn0scC5pc0Rpc3Bvc2VyPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5yZXNvdXJjZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudHJ5RGlzcG9zZX0scyhnLHApLGcucHJvdG90eXBlLmRvRGlzcG9zZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRhdGEoKS5jYWxsKGUsZSx0KX0sYi5wcm90b3R5cGUuX3Jlc3VsdENhbmNlbGxlZD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmxlbmd0aCxuPTA7bjx0Oysrbil7dmFyIHI9dGhpc1tuXTtyIGluc3RhbmNlb2YgZSYmci5jYW5jZWwoKX19LGUudXNpbmc9ZnVuY3Rpb24oKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO2lmKHI8MilyZXR1cm4gdCgieW91IG11c3QgcGFzcyBhdCBsZWFzdCAyIGFyZ3VtZW50cyB0byBQcm9taXNlLnVzaW5nIik7dmFyIGksYz1hcmd1bWVudHNbci0xXTtpZigiZnVuY3Rpb24iIT10eXBlb2YgYylyZXR1cm4gdCgiZXhwZWN0aW5nIGEgZnVuY3Rpb24gYnV0IGdvdCAiK28uY2xhc3NTdHJpbmcoYykpO3ZhciBzPSEwOzI9PT1yJiZBcnJheS5pc0FycmF5KGFyZ3VtZW50c1swXSk/KHI9KGk9YXJndW1lbnRzWzBdKS5sZW5ndGgscz0hMSk6KGk9YXJndW1lbnRzLHItLSk7Zm9yKHZhciBmPW5ldyBiKHIpLGQ9MDtkPHI7KytkKXt2YXIgZz1pW2RdO2lmKHAuaXNEaXNwb3NlcihnKSl7dmFyIHk9ZzsoZz1nLnByb21pc2UoKSkuX3NldERpc3Bvc2FibGUoeSl9ZWxzZXt2YXIgdj1uKGcpO3YgaW5zdGFuY2VvZiBlJiYoZz12Ll90aGVuKG0sbnVsbCxudWxsLHtyZXNvdXJjZXM6ZixpbmRleDpkfSx2b2lkIDApKX1mW2RdPWd9dmFyIHg9bmV3IEFycmF5KGYubGVuZ3RoKTtmb3IoZD0wO2Q8eC5sZW5ndGg7KytkKXhbZF09ZS5yZXNvbHZlKGZbZF0pLnJlZmxlY3QoKTt2YXIgRD1lLmFsbCh4KS50aGVuKChmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZVt0XTtpZihuLmlzUmVqZWN0ZWQoKSlyZXR1cm4gbC5lPW4uZXJyb3IoKSxsO2lmKCFuLmlzRnVsZmlsbGVkKCkpcmV0dXJuIHZvaWQgRC5jYW5jZWwoKTtlW3RdPW4udmFsdWUoKX1ULl9wdXNoQ29udGV4dCgpLGM9dShjKTt2YXIgcj1zP2MuYXBwbHkodm9pZCAwLGUpOmMoZSksaT1ULl9wb3BDb250ZXh0KCk7cmV0dXJuIGEuY2hlY2tGb3Jnb3R0ZW5SZXR1cm5zKHIsaSwiUHJvbWlzZS51c2luZyIsVCkscn0pKSxUPUQubGFzdGx5KChmdW5jdGlvbigpe3ZhciB0PW5ldyBlLlByb21pc2VJbnNwZWN0aW9uKEQpO3JldHVybiBoKGYsdCl9KSk7cmV0dXJuIGYucHJvbWlzZT1ULFQuX3NldE9uQ2FuY2VsKGYpLFR9LGUucHJvdG90eXBlLl9zZXREaXNwb3NhYmxlPWZ1bmN0aW9uKGUpe3RoaXMuX2JpdEZpZWxkPTEzMTA3Mnx0aGlzLl9iaXRGaWVsZCx0aGlzLl9kaXNwb3Nlcj1lfSxlLnByb3RvdHlwZS5faXNEaXNwb3NhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuKDEzMTA3MiZ0aGlzLl9iaXRGaWVsZCk+MH0sZS5wcm90b3R5cGUuX2dldERpc3Bvc2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc3Bvc2VyfSxlLnByb3RvdHlwZS5fdW5zZXREaXNwb3NhYmxlPWZ1bmN0aW9uKCl7dGhpcy5fYml0RmllbGQ9LTEzMTA3MyZ0aGlzLl9iaXRGaWVsZCx0aGlzLl9kaXNwb3Nlcj12b2lkIDB9LGUucHJvdG90eXBlLmRpc3Bvc2VyPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlKXJldHVybiBuZXcgZyhlLHRoaXMscigpKTt0aHJvdyBuZXcgY319KSx5YX1mdW5jdGlvbiBubygpe3JldHVybiBEYXx8KERhPTEseGE9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVJpKCksaT1lLlRpbWVvdXRFcnJvcjtmdW5jdGlvbiBhKGUpe3RoaXMuaGFuZGxlPWV9YS5wcm90b3R5cGUuX3Jlc3VsdENhbmNlbGxlZD1mdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLmhhbmRsZSl9O3ZhciBvPWZ1bmN0aW9uKGUpe3JldHVybiBjKCt0aGlzKS50aGVuUmV0dXJuKGUpfSxjPWUuZGVsYXk9ZnVuY3Rpb24ocixpKXt2YXIgYyxzO3JldHVybiB2b2lkIDAhPT1pPyhjPWUucmVzb2x2ZShpKS5fdGhlbihvLG51bGwsbnVsbCxyLHZvaWQgMCksbi5jYW5jZWxsYXRpb24oKSYmaSBpbnN0YW5jZW9mIGUmJmMuX3NldE9uQ2FuY2VsKGkpKTooYz1uZXcgZSh0KSxzPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7Yy5fZnVsZmlsbCgpfSksK3IpLG4uY2FuY2VsbGF0aW9uKCkmJmMuX3NldE9uQ2FuY2VsKG5ldyBhKHMpKSxjLl9jYXB0dXJlU3RhY2tUcmFjZSgpKSxjLl9zZXRBc3luY0d1YXJhbnRlZWQoKSxjfTtlLnByb3RvdHlwZS5kZWxheT1mdW5jdGlvbihlKXtyZXR1cm4gYyhlLHRoaXMpfTtmdW5jdGlvbiBzKGUpe3JldHVybiBjbGVhclRpbWVvdXQodGhpcy5oYW5kbGUpLGV9ZnVuY3Rpb24gbChlKXt0aHJvdyBjbGVhclRpbWVvdXQodGhpcy5oYW5kbGUpLGV9ZS5wcm90b3R5cGUudGltZW91dD1mdW5jdGlvbihlLHQpe3ZhciBvLGM7ZT0rZTt2YXIgdT1uZXcgYShzZXRUaW1lb3V0KChmdW5jdGlvbigpe28uaXNQZW5kaW5nKCkmJmZ1bmN0aW9uKGUsdCxuKXt2YXIgYTthPSJzdHJpbmciIT10eXBlb2YgdD90IGluc3RhbmNlb2YgRXJyb3I/dDpuZXcgaSgib3BlcmF0aW9uIHRpbWVkIG91dCIpOm5ldyBpKHQpLHIubWFya0FzT3JpZ2luYXRpbmdGcm9tUmVqZWN0aW9uKGEpLGUuX2F0dGFjaEV4dHJhVHJhY2UoYSksZS5fcmVqZWN0KGEpLG51bGwhPW4mJm4uY2FuY2VsKCl9KG8sdCxjKX0pLGUpKTtyZXR1cm4gbi5jYW5jZWxsYXRpb24oKT8oYz10aGlzLnRoZW4oKSwobz1jLl90aGVuKHMsbCx2b2lkIDAsdSx2b2lkIDApKS5fc2V0T25DYW5jZWwodSkpOm89dGhpcy5fdGhlbihzLGwsdm9pZCAwLHUsdm9pZCAwKSxvfX0pLHhhfWZ1bmN0aW9uIHJvKCl7cmV0dXJuIHdhfHwod2E9MSxUYT1mdW5jdGlvbihlLHQsbixyLGksYSl7dmFyIG89WWEoKS5UeXBlRXJyb3IsYz1SaSgpLHM9Yy5lcnJvck9iaixsPWMudHJ5Q2F0Y2gsdT1bXTtmdW5jdGlvbiBmKHQscixpLG8pe2lmKGEuY2FuY2VsbGF0aW9uKCkpe3ZhciBjPW5ldyBlKG4pLHM9dGhpcy5fZmluYWxseVByb21pc2U9bmV3IGUobik7dGhpcy5fcHJvbWlzZT1jLmxhc3RseSgoZnVuY3Rpb24oKXtyZXR1cm4gc30pKSxjLl9jYXB0dXJlU3RhY2tUcmFjZSgpLGMuX3NldE9uQ2FuY2VsKHRoaXMpfWVsc2V7KHRoaXMuX3Byb21pc2U9bmV3IGUobikpLl9jYXB0dXJlU3RhY2tUcmFjZSgpfXRoaXMuX3N0YWNrPW8sdGhpcy5fZ2VuZXJhdG9yRnVuY3Rpb249dCx0aGlzLl9yZWNlaXZlcj1yLHRoaXMuX2dlbmVyYXRvcj12b2lkIDAsdGhpcy5feWllbGRIYW5kbGVycz0iZnVuY3Rpb24iPT10eXBlb2YgaT9baV0uY29uY2F0KHUpOnUsdGhpcy5feWllbGRlZFByb21pc2U9bnVsbCx0aGlzLl9jYW5jZWxsYXRpb25QaGFzZT0hMX1jLmluaGVyaXRzKGYsaSksZi5wcm90b3R5cGUuX2lzUmVzb2x2ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMuX3Byb21pc2V9LGYucHJvdG90eXBlLl9jbGVhbnVwPWZ1bmN0aW9uKCl7dGhpcy5fcHJvbWlzZT10aGlzLl9nZW5lcmF0b3I9bnVsbCxhLmNhbmNlbGxhdGlvbigpJiZudWxsIT09dGhpcy5fZmluYWxseVByb21pc2UmJih0aGlzLl9maW5hbGx5UHJvbWlzZS5fZnVsZmlsbCgpLHRoaXMuX2ZpbmFsbHlQcm9taXNlPW51bGwpfSxmLnByb3RvdHlwZS5fcHJvbWlzZUNhbmNlbGxlZD1mdW5jdGlvbigpe2lmKCF0aGlzLl9pc1Jlc29sdmVkKCkpe3ZhciB0O2lmKHZvaWQgMCE9PXRoaXMuX2dlbmVyYXRvci5yZXR1cm4pdGhpcy5fcHJvbWlzZS5fcHVzaENvbnRleHQoKSx0PWwodGhpcy5fZ2VuZXJhdG9yLnJldHVybikuY2FsbCh0aGlzLl9nZW5lcmF0b3Isdm9pZCAwKSx0aGlzLl9wcm9taXNlLl9wb3BDb250ZXh0KCk7ZWxzZXt2YXIgbj1uZXcgZS5DYW5jZWxsYXRpb25FcnJvcigiZ2VuZXJhdG9yIC5yZXR1cm4oKSBzZW50aW5lbCIpO2UuY29yb3V0aW5lLnJldHVyblNlbnRpbmVsPW4sdGhpcy5fcHJvbWlzZS5fYXR0YWNoRXh0cmFUcmFjZShuKSx0aGlzLl9wcm9taXNlLl9wdXNoQ29udGV4dCgpLHQ9bCh0aGlzLl9nZW5lcmF0b3IudGhyb3cpLmNhbGwodGhpcy5fZ2VuZXJhdG9yLG4pLHRoaXMuX3Byb21pc2UuX3BvcENvbnRleHQoKX10aGlzLl9jYW5jZWxsYXRpb25QaGFzZT0hMCx0aGlzLl95aWVsZGVkUHJvbWlzZT1udWxsLHRoaXMuX2NvbnRpbnVlKHQpfX0sZi5wcm90b3R5cGUuX3Byb21pc2VGdWxmaWxsZWQ9ZnVuY3Rpb24oZSl7dGhpcy5feWllbGRlZFByb21pc2U9bnVsbCx0aGlzLl9wcm9taXNlLl9wdXNoQ29udGV4dCgpO3ZhciB0PWwodGhpcy5fZ2VuZXJhdG9yLm5leHQpLmNhbGwodGhpcy5fZ2VuZXJhdG9yLGUpO3RoaXMuX3Byb21pc2UuX3BvcENvbnRleHQoKSx0aGlzLl9jb250aW51ZSh0KX0sZi5wcm90b3R5cGUuX3Byb21pc2VSZWplY3RlZD1mdW5jdGlvbihlKXt0aGlzLl95aWVsZGVkUHJvbWlzZT1udWxsLHRoaXMuX3Byb21pc2UuX2F0dGFjaEV4dHJhVHJhY2UoZSksdGhpcy5fcHJvbWlzZS5fcHVzaENvbnRleHQoKTt2YXIgdD1sKHRoaXMuX2dlbmVyYXRvci50aHJvdykuY2FsbCh0aGlzLl9nZW5lcmF0b3IsZSk7dGhpcy5fcHJvbWlzZS5fcG9wQ29udGV4dCgpLHRoaXMuX2NvbnRpbnVlKHQpfSxmLnByb3RvdHlwZS5fcmVzdWx0Q2FuY2VsbGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5feWllbGRlZFByb21pc2UgaW5zdGFuY2VvZiBlKXt2YXIgdD10aGlzLl95aWVsZGVkUHJvbWlzZTt0aGlzLl95aWVsZGVkUHJvbWlzZT1udWxsLHQuY2FuY2VsKCl9fSxmLnByb3RvdHlwZS5wcm9taXNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb21pc2V9LGYucHJvdG90eXBlLl9ydW49ZnVuY3Rpb24oKXt0aGlzLl9nZW5lcmF0b3I9dGhpcy5fZ2VuZXJhdG9yRnVuY3Rpb24uY2FsbCh0aGlzLl9yZWNlaXZlciksdGhpcy5fcmVjZWl2ZXI9dGhpcy5fZ2VuZXJhdG9yRnVuY3Rpb249dm9pZCAwLHRoaXMuX3Byb21pc2VGdWxmaWxsZWQodm9pZCAwKX0sZi5wcm90b3R5cGUuX2NvbnRpbnVlPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX3Byb21pc2U7aWYodD09PXMpcmV0dXJuIHRoaXMuX2NsZWFudXAoKSx0aGlzLl9jYW5jZWxsYXRpb25QaGFzZT9uLmNhbmNlbCgpOm4uX3JlamVjdENhbGxiYWNrKHQuZSwhMSk7dmFyIGk9dC52YWx1ZTtpZighMD09PXQuZG9uZSlyZXR1cm4gdGhpcy5fY2xlYW51cCgpLHRoaXMuX2NhbmNlbGxhdGlvblBoYXNlP24uY2FuY2VsKCk6bi5fcmVzb2x2ZUNhbGxiYWNrKGkpO3ZhciBhPXIoaSx0aGlzLl9wcm9taXNlKTtpZihhIGluc3RhbmNlb2YgZXx8KGE9ZnVuY3Rpb24odCxuLGkpe2Zvcih2YXIgYT0wO2E8bi5sZW5ndGg7KythKXtpLl9wdXNoQ29udGV4dCgpO3ZhciBvPWwoblthXSkodCk7aWYoaS5fcG9wQ29udGV4dCgpLG89PT1zKXtpLl9wdXNoQ29udGV4dCgpO3ZhciBjPWUucmVqZWN0KHMuZSk7cmV0dXJuIGkuX3BvcENvbnRleHQoKSxjfXZhciB1PXIobyxpKTtpZih1IGluc3RhbmNlb2YgZSlyZXR1cm4gdX1yZXR1cm4gbnVsbH0oYSx0aGlzLl95aWVsZEhhbmRsZXJzLHRoaXMuX3Byb21pc2UpLG51bGwhPT1hKSl7dmFyIGM9KGE9YS5fdGFyZ2V0KCkpLl9iaXRGaWVsZDswPT0oNTAzOTcxODQmYyk/KHRoaXMuX3lpZWxkZWRQcm9taXNlPWEsYS5fcHJveHkodGhpcyxudWxsKSk6MCE9KDMzNTU0NDMyJmMpP2UuX2FzeW5jLmludm9rZSh0aGlzLl9wcm9taXNlRnVsZmlsbGVkLHRoaXMsYS5fdmFsdWUoKSk6MCE9KDE2Nzc3MjE2JmMpP2UuX2FzeW5jLmludm9rZSh0aGlzLl9wcm9taXNlUmVqZWN0ZWQsdGhpcyxhLl9yZWFzb24oKSk6dGhpcy5fcHJvbWlzZUNhbmNlbGxlZCgpfWVsc2UgdGhpcy5fcHJvbWlzZVJlamVjdGVkKG5ldyBvKCJBIHZhbHVlICVzIHdhcyB5aWVsZGVkIHRoYXQgY291bGQgbm90IGJlIHRyZWF0ZWQgYXMgYSBwcm9taXNlXG5cbiAgICBTZWUgaHR0cDovL2dvby5nbC9NcXJGbVhcblxuIi5yZXBsYWNlKCIlcyIsaSkrIkZyb20gY29yb3V0aW5lOlxuIit0aGlzLl9zdGFjay5zcGxpdCgiXG4iKS5zbGljZSgxLC03KS5qb2luKCJcbiIpKSl9LGUuY29yb3V0aW5lPWZ1bmN0aW9uKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IG8oImdlbmVyYXRvckZ1bmN0aW9uIG11c3QgYmUgYSBmdW5jdGlvblxuXG4gICAgU2VlIGh0dHA6Ly9nb28uZ2wvTXFyRm1YXG4iKTt2YXIgbj1PYmplY3QodCkueWllbGRIYW5kbGVyLHI9ZixpPShuZXcgRXJyb3IpLnN0YWNrO3JldHVybiBmdW5jdGlvbigpe3ZhciB0PWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGE9bmV3IHIodm9pZCAwLHZvaWQgMCxuLGkpLG89YS5wcm9taXNlKCk7cmV0dXJuIGEuX2dlbmVyYXRvcj10LGEuX3Byb21pc2VGdWxmaWxsZWQodm9pZCAwKSxvfX0sZS5jb3JvdXRpbmUuYWRkWWllbGRIYW5kbGVyPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBvKCJleHBlY3RpbmcgYSBmdW5jdGlvbiBidXQgZ290ICIrYy5jbGFzc1N0cmluZyhlKSk7dS5wdXNoKGUpfSxlLnNwYXduPWZ1bmN0aW9uKG4pe2lmKGEuZGVwcmVjYXRlZCgiUHJvbWlzZS5zcGF3bigpIiwiUHJvbWlzZS5jb3JvdXRpbmUoKSIpLCJmdW5jdGlvbiIhPXR5cGVvZiBuKXJldHVybiB0KCJnZW5lcmF0b3JGdW5jdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb25cblxuICAgIFNlZSBodHRwOi8vZ29vLmdsL01xckZtWFxuIik7dmFyIHI9bmV3IGYobix0aGlzKSxpPXIucHJvbWlzZSgpO3JldHVybiByLl9ydW4oZS5zcGF3biksaX19KSxUYX1mdW5jdGlvbiBpbygpe3JldHVybiBBYXx8KEFhPTEsVWE9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fSxyPVJpKCksaT1KYSgpLGE9ci53aXRoQXBwZW5kZWQsbz1yLm1heWJlV3JhcEFzRXJyb3IsYz1yLmNhbkV2YWx1YXRlLHM9WWEoKS5UeXBlRXJyb3IsbD17X19pc1Byb21pc2lmaWVkX186ITB9LHU9bmV3IFJlZ0V4cCgiXig/OiIrWyJhcml0eSIsImxlbmd0aCIsIm5hbWUiLCJhcmd1bWVudHMiLCJjYWxsZXIiLCJjYWxsZWUiLCJwcm90b3R5cGUiLCJfX2lzUHJvbWlzaWZpZWRfXyJdLmpvaW4oInwiKSsiKSQiKSxmPWZ1bmN0aW9uKGUpe3JldHVybiByLmlzSWRlbnRpZmllcihlKSYmIl8iIT09ZS5jaGFyQXQoMCkmJiJjb25zdHJ1Y3RvciIhPT1lfTtmdW5jdGlvbiBkKGUpe3JldHVybiF1LnRlc3QoZSl9ZnVuY3Rpb24gaChlKXt0cnl7cmV0dXJuITA9PT1lLl9faXNQcm9taXNpZmllZF9ffWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBwKGUsdCxuKXt2YXIgaT1yLmdldERhdGFQcm9wZXJ0eU9yRGVmYXVsdChlLHQrbixsKTtyZXR1cm4hIWkmJmgoaSl9ZnVuY3Rpb24gZyhlLHQsbixpKXtmb3IodmFyIGE9ci5pbmhlcml0ZWREYXRhS2V5cyhlKSxvPVtdLGM9MDtjPGEubGVuZ3RoOysrYyl7dmFyIGw9YVtjXSx1PWVbbF0sZD1pPT09Znx8ZihsKTsiZnVuY3Rpb24iIT10eXBlb2YgdXx8aCh1KXx8cChlLGwsdCl8fCFpKGwsdSxlLGQpfHxvLnB1c2gobCx1KX1yZXR1cm4gZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cis9Mil7dmFyIGk9ZVtyXTtpZihuLnRlc3QoaSkpZm9yKHZhciBhPWkucmVwbGFjZShuLCIiKSxvPTA7bzxlLmxlbmd0aDtvKz0yKWlmKGVbb109PT1hKXRocm93IG5ldyBzKCJDYW5ub3QgcHJvbWlzaWZ5IGFuIEFQSSB0aGF0IGhhcyBub3JtYWwgbWV0aG9kcyB3aXRoICclcyctc3VmZml4XG5cbiAgICBTZWUgaHR0cDovL2dvby5nbC9NcXJGbVhcbiIucmVwbGFjZSgiJXMiLHQpKX19KG8sdCxuKSxvfXZhciBtO209ZnVuY3Rpb24oYyxzLGwsdSxmLGQpe3ZhciBoPU1hdGgubWF4KDAsZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlLmxlbmd0aD9NYXRoLm1heChNYXRoLm1pbihlLmxlbmd0aCwxMDI0KSwwKTowfSh1KS0xKSxwPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bZV0sbj1NYXRoLm1heCgwLGUtMS0zKSxyPWUtMTtyPj1uOy0tcil0LnB1c2gocik7Zm9yKHI9ZSsxO3I8PTM7KytyKXQucHVzaChyKTtyZXR1cm4gdH0oaCksZz0ic3RyaW5nIj09dHlwZW9mIGN8fHM9PT1uO2Z1bmN0aW9uIG0oZSl7dmFyIHQsbj0odD1lLHIuZmlsbGVkUmFuZ2UodCwiX2FyZyIsIiIpKS5qb2luKCIsICIpLGk9ZT4wPyIsICI6IiI7cmV0dXJuKGc/InJldCA9IGNhbGxiYWNrLmNhbGwodGhpcywge3thcmdzfX0sIG5vZGViYWNrKTsgYnJlYWs7XG4iOnZvaWQgMD09PXM/InJldCA9IGNhbGxiYWNrKHt7YXJnc319LCBub2RlYmFjayk7IGJyZWFrO1xuIjoicmV0ID0gY2FsbGJhY2suY2FsbChyZWNlaXZlciwge3thcmdzfX0sIG5vZGViYWNrKTsgYnJlYWs7XG4iKS5yZXBsYWNlKCJ7e2FyZ3N9fSIsbikucmVwbGFjZSgiLCAiLGkpfXZhciBiPSJzdHJpbmciPT10eXBlb2YgYz8idGhpcyAhPSBudWxsID8gdGhpc1snIitjKyInXSA6IGZuIjoiZm4iLHk9Iid1c2Ugc3RyaWN0JzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICB2YXIgcmV0ID0gZnVuY3Rpb24gKFBhcmFtZXRlcnMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShJTlRFUk5BTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgcHJvbWlzZS5fY2FwdHVyZVN0YWNrVHJhY2UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgdmFyIG5vZGViYWNrID0gbm9kZWJhY2tGb3JQcm9taXNlKHByb21pc2UsICIrZCsiKTsgICBcblx0ICAgICAgICAgICAgdmFyIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gdHJ5Q2F0Y2goW0dldEZ1bmN0aW9uQ29kZV0pOyAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgc3dpdGNoKGxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIFtDb2RlRm9yU3dpdGNoQ2FzZV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgaWYgKHJldCA9PT0gZXJyb3JPYmopIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIHByb21pc2UuX3JlamVjdENhbGxiYWNrKG1heWJlV3JhcEFzRXJyb3IocmV0LmUpLCB0cnVlLCB0cnVlKTtcblx0ICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgaWYgKCFwcm9taXNlLl9pc0ZhdGVTZWFsZWQoKSkgcHJvbWlzZS5fc2V0QXN5bmNHdWFyYW50ZWVkKCk7ICAgICBcblx0ICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICBub3RFbnVtZXJhYmxlUHJvcChyZXQsICdfX2lzUHJvbWlzaWZpZWRfXycsIHRydWUpOyAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICByZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICIucmVwbGFjZSgiW0NvZGVGb3JTd2l0Y2hDYXNlXSIsZnVuY3Rpb24oKXtmb3IodmFyIGU9IiIsdD0wO3Q8cC5sZW5ndGg7Kyt0KWUrPSJjYXNlICIrcFt0XSsiOiIrbShwW3RdKTtyZXR1cm4gZSs9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgdmFyIGkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgYXJnc1tpXSA9IG5vZGViYWNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgW0NvZGVGb3JDYWxsXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAiLnJlcGxhY2UoIltDb2RlRm9yQ2FsbF0iLGc/InJldCA9IGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpO1xuIjoicmV0ID0gY2FsbGJhY2suYXBwbHkocmVjZWl2ZXIsIGFyZ3MpO1xuIil9KCkpLnJlcGxhY2UoIltHZXRGdW5jdGlvbkNvZGVdIixiKTtyZXR1cm4geT15LnJlcGxhY2UoIlBhcmFtZXRlcnMiLGZ1bmN0aW9uKGUpe3JldHVybiByLmZpbGxlZFJhbmdlKE1hdGgubWF4KGUsMyksIl9hcmciLCIiKX0oaCkpLG5ldyBGdW5jdGlvbigiUHJvbWlzZSIsImZuIiwicmVjZWl2ZXIiLCJ3aXRoQXBwZW5kZWQiLCJtYXliZVdyYXBBc0Vycm9yIiwibm9kZWJhY2tGb3JQcm9taXNlIiwidHJ5Q2F0Y2giLCJlcnJvck9iaiIsIm5vdEVudW1lcmFibGVQcm9wIiwiSU5URVJOQUwiLHkpKGUsdSxzLGEsbyxpLHIudHJ5Q2F0Y2gsci5lcnJvck9iaixyLm5vdEVudW1lcmFibGVQcm9wLHQpfTt2YXIgYj1jP206ZnVuY3Rpb24oYyxzLGwsdSxmLGQpe3ZhciBoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCkscD1jO2Z1bmN0aW9uIGcoKXt2YXIgcj1zO3M9PT1uJiYocj10aGlzKTt2YXIgbD1uZXcgZSh0KTtsLl9jYXB0dXJlU3RhY2tUcmFjZSgpO3ZhciB1PSJzdHJpbmciPT10eXBlb2YgcCYmdGhpcyE9PWg/dGhpc1twXTpjLGY9aShsLGQpO3RyeXt1LmFwcGx5KHIsYShhcmd1bWVudHMsZikpfWNhdGNoKGUpe2wuX3JlamVjdENhbGxiYWNrKG8oZSksITAsITApfXJldHVybiBsLl9pc0ZhdGVTZWFsZWQoKXx8bC5fc2V0QXN5bmNHdWFyYW50ZWVkKCksbH1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHAmJihjPXUpLHIubm90RW51bWVyYWJsZVByb3AoZywiX19pc1Byb21pc2lmaWVkX18iLCEwKSxnfTtmdW5jdGlvbiB5KGUsdCxpLGEsbyl7Zm9yKHZhciBjPW5ldyBSZWdFeHAodC5yZXBsYWNlKC8oWyRdKS8sIlxcJCIpKyIkIikscz1nKGUsdCxjLGkpLGw9MCx1PXMubGVuZ3RoO2w8dTtsKz0yKXt2YXIgZj1zW2xdLGQ9c1tsKzFdLGg9Zit0O2lmKGE9PT1iKWVbaF09YihmLG4sZixkLHQsbyk7ZWxzZXt2YXIgcD1hKGQsKGZ1bmN0aW9uKCl7cmV0dXJuIGIoZixuLGYsZCx0LG8pfSkpO3Iubm90RW51bWVyYWJsZVByb3AocCwiX19pc1Byb21pc2lmaWVkX18iLCEwKSxlW2hdPXB9fXJldHVybiByLnRvRmFzdFByb3BlcnRpZXMoZSksZX1lLnByb21pc2lmeT1mdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBzKCJleHBlY3RpbmcgYSBmdW5jdGlvbiBidXQgZ290ICIrci5jbGFzc1N0cmluZyhlKSk7aWYoaChlKSlyZXR1cm4gZTt2YXIgaT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGIoZSx0LHZvaWQgMCxlLG51bGwsbil9KGUsdm9pZCAwPT09KHQ9T2JqZWN0KHQpKS5jb250ZXh0P246dC5jb250ZXh0LCEhdC5tdWx0aUFyZ3MpO3JldHVybiByLmNvcHlEZXNjcmlwdG9ycyhlLGksZCksaX0sZS5wcm9taXNpZnlBbGw9ZnVuY3Rpb24oZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBzKCJ0aGUgdGFyZ2V0IG9mIHByb21pc2lmeUFsbCBtdXN0IGJlIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uXG5cbiAgICBTZWUgaHR0cDovL2dvby5nbC9NcXJGbVhcbiIpO3ZhciBuPSEhKHQ9T2JqZWN0KHQpKS5tdWx0aUFyZ3MsaT10LnN1ZmZpeDsic3RyaW5nIiE9dHlwZW9mIGkmJihpPSJBc3luYyIpO3ZhciBhPXQuZmlsdGVyOyJmdW5jdGlvbiIhPXR5cGVvZiBhJiYoYT1mKTt2YXIgbz10LnByb21pc2lmaWVyO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBvJiYobz1iKSwhci5pc0lkZW50aWZpZXIoaSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInN1ZmZpeCBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllclxuXG4gICAgU2VlIGh0dHA6Ly9nb28uZ2wvTXFyRm1YXG4iKTtmb3IodmFyIGM9ci5pbmhlcml0ZWREYXRhS2V5cyhlKSxsPTA7bDxjLmxlbmd0aDsrK2wpe3ZhciB1PWVbY1tsXV07ImNvbnN0cnVjdG9yIiE9PWNbbF0mJnIuaXNDbGFzcyh1KSYmKHkodS5wcm90b3R5cGUsaSxhLG8sbikseSh1LGksYSxvLG4pKX1yZXR1cm4geShlLGksYSxvLG4pfX0pLFVhfWZ1bmN0aW9uIGFvKCl7cmV0dXJuIFNhfHwoU2E9MSxrYT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxhPVJpKCksbz1hLmlzT2JqZWN0LGM9SWkoKTsiZnVuY3Rpb24iPT10eXBlb2YgTWFwJiYoaT1NYXApO3ZhciBzPWZ1bmN0aW9uKCl7dmFyIGU9MCx0PTA7ZnVuY3Rpb24gbihuLHIpe3RoaXNbZV09bix0aGlzW2UrdF09cixlKyt9cmV0dXJuIGZ1bmN0aW9uKHIpe3Q9ci5zaXplLGU9MDt2YXIgaT1uZXcgQXJyYXkoMipyLnNpemUpO3JldHVybiByLmZvckVhY2gobixpKSxpfX0oKTtmdW5jdGlvbiBsKGUpe3ZhciB0LG49ITE7aWYodm9pZCAwIT09aSYmZSBpbnN0YW5jZW9mIGkpdD1zKGUpLG49ITA7ZWxzZXt2YXIgcj1jLmtleXMoZSksYT1yLmxlbmd0aDt0PW5ldyBBcnJheSgyKmEpO2Zvcih2YXIgbz0wO288YTsrK28pe3ZhciBsPXJbb107dFtvXT1lW2xdLHRbbythXT1sfX10aGlzLmNvbnN0cnVjdG9yJCh0KSx0aGlzLl9pc01hcD1uLHRoaXMuX2luaXQkKHZvaWQgMCwtMyl9ZnVuY3Rpb24gdSh0KXt2YXIgaSxhPW4odCk7cmV0dXJuIG8oYSk/KGk9YSBpbnN0YW5jZW9mIGU/YS5fdGhlbihlLnByb3BzLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHZvaWQgMCk6bmV3IGwoYSkucHJvbWlzZSgpLGEgaW5zdGFuY2VvZiBlJiZpLl9wcm9wYWdhdGVGcm9tKGEsMiksaSk6cigiY2Fubm90IGF3YWl0IHByb3BlcnRpZXMgb2YgYSBub24tb2JqZWN0XG5cbiAgICBTZWUgaHR0cDovL2dvby5nbC9NcXJGbVhcbiIpfWEuaW5oZXJpdHMobCx0KSxsLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbigpe30sbC5wcm90b3R5cGUuX3Byb21pc2VGdWxmaWxsZWQ9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLl92YWx1ZXNbdF09ZSwrK3RoaXMuX3RvdGFsUmVzb2x2ZWQ+PXRoaXMuX2xlbmd0aCl7dmFyIG47aWYodGhpcy5faXNNYXApbj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9bmV3IGksbj1lLmxlbmd0aC8yfDAscj0wO3I8bjsrK3Ipe3ZhciBhPWVbbityXSxvPWVbcl07dC5zZXQoYSxvKX1yZXR1cm4gdH0odGhpcy5fdmFsdWVzKTtlbHNle249e307Zm9yKHZhciByPXRoaXMubGVuZ3RoKCksYT0wLG89dGhpcy5sZW5ndGgoKTthPG87KythKW5bdGhpcy5fdmFsdWVzW2Ercl1dPXRoaXMuX3ZhbHVlc1thXX1yZXR1cm4gdGhpcy5fcmVzb2x2ZShuKSwhMH1yZXR1cm4hMX0sbC5wcm90b3R5cGUuc2hvdWxkQ29weVZhbHVlcz1mdW5jdGlvbigpe3JldHVybiExfSxsLnByb3RvdHlwZS5nZXRBY3R1YWxMZW5ndGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PjF9LGUucHJvdG90eXBlLnByb3BzPWZ1bmN0aW9uKCl7cmV0dXJuIHUodGhpcyl9LGUucHJvcHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHUoZSl9fSksa2F9ZnVuY3Rpb24gb28oKXtyZXR1cm4gRmF8fChGYT0xLENhPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPVJpKCk7ZnVuY3Rpb24gYShvLGMpe3ZhciBzPW4obyk7aWYocyBpbnN0YW5jZW9mIGUpcmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQsZSl9KSl9KHMpO2lmKG51bGw9PT0obz1pLmFzQXJyYXkobykpKXJldHVybiByKCJleHBlY3RpbmcgYW4gYXJyYXkgb3IgYW4gaXRlcmFibGUgb2JqZWN0IGJ1dCBnb3QgIitpLmNsYXNzU3RyaW5nKG8pKTt2YXIgbD1uZXcgZSh0KTt2b2lkIDAhPT1jJiZsLl9wcm9wYWdhdGVGcm9tKGMsMyk7Zm9yKHZhciB1PWwuX2Z1bGZpbGwsZj1sLl9yZWplY3QsZD0wLGg9by5sZW5ndGg7ZDxoOysrZCl7dmFyIHA9b1tkXTsodm9pZCAwIT09cHx8ZCBpbiBvKSYmZS5jYXN0KHApLl90aGVuKHUsZix2b2lkIDAsbCxudWxsKX1yZXR1cm4gbH1lLnJhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGEoZSx2b2lkIDApfSxlLnByb3RvdHlwZS5yYWNlPWZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcyx2b2lkIDApfX0pLENhfShWYT17Z2V0IGV4cG9ydHMoKXtyZXR1cm4gQ2l9LHNldCBleHBvcnRzKGUpe0NpPWV9fSkuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBmKCJjaXJjdWxhciBwcm9taXNlIHJlc29sdXRpb24gY2hhaW5cblxuICAgIFNlZSBodHRwOi8vZ29vLmdsL01xckZtWFxuIil9LHQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFUuUHJvbWlzZUluc3BlY3Rpb24odGhpcy5fdGFyZ2V0KCkpfSxuPWZ1bmN0aW9uKGUpe3JldHVybiBVLnJlamVjdChuZXcgZihlKSl9O2Z1bmN0aW9uIHIoKXt9dmFyIGksYT17fSxvPVJpKCk7aT1vLmlzTm9kZT9mdW5jdGlvbigpe3ZhciBlPVNpLmRvbWFpbjtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9bnVsbCksZX06ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sby5ub3RFbnVtZXJhYmxlUHJvcChVLCJfZ2V0RG9tYWluIixpKTt2YXIgYz1JaSgpLHM9JGEoKSxsPW5ldyBzO2MuZGVmaW5lUHJvcGVydHkoVSwiX2FzeW5jIix7dmFsdWU6bH0pO3ZhciB1PVlhKCksZj1VLlR5cGVFcnJvcj11LlR5cGVFcnJvcjtVLlJhbmdlRXJyb3I9dS5SYW5nZUVycm9yO3ZhciBkPVUuQ2FuY2VsbGF0aW9uRXJyb3I9dS5DYW5jZWxsYXRpb25FcnJvcjtVLlRpbWVvdXRFcnJvcj11LlRpbWVvdXRFcnJvcixVLk9wZXJhdGlvbmFsRXJyb3I9dS5PcGVyYXRpb25hbEVycm9yLFUuUmVqZWN0aW9uRXJyb3I9dS5PcGVyYXRpb25hbEVycm9yLFUuQWdncmVnYXRlRXJyb3I9dS5BZ2dyZWdhdGVFcnJvcjt2YXIgaD1mdW5jdGlvbigpe30scD17fSxnPXt9LG09S2EoKShVLGgpLGI9KHFpfHwocWk9MSxWaT1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBhPVJpKCk7ZnVuY3Rpb24gbyhuKXt2YXIgcj10aGlzLl9wcm9taXNlPW5ldyBlKHQpO24gaW5zdGFuY2VvZiBlJiZyLl9wcm9wYWdhdGVGcm9tKG4sMyksci5fc2V0T25DYW5jZWwodGhpcyksdGhpcy5fdmFsdWVzPW4sdGhpcy5fbGVuZ3RoPTAsdGhpcy5fdG90YWxSZXNvbHZlZD0wLHRoaXMuX2luaXQodm9pZCAwLC0yKX1yZXR1cm4gYS5pc0FycmF5LGEuaW5oZXJpdHMobyxpKSxvLnByb3RvdHlwZS5sZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGVuZ3RofSxvLnByb3RvdHlwZS5wcm9taXNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb21pc2V9LG8ucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uIHQoaSxvKXt2YXIgYz1uKHRoaXMuX3ZhbHVlcyx0aGlzLl9wcm9taXNlKTtpZihjIGluc3RhbmNlb2YgZSl7dmFyIHM9KGM9Yy5fdGFyZ2V0KCkpLl9iaXRGaWVsZDtpZih0aGlzLl92YWx1ZXM9YywwPT0oNTAzOTcxODQmcykpcmV0dXJuIHRoaXMuX3Byb21pc2UuX3NldEFzeW5jR3VhcmFudGVlZCgpLGMuX3RoZW4odCx0aGlzLl9yZWplY3Qsdm9pZCAwLHRoaXMsbyk7aWYoMD09KDMzNTU0NDMyJnMpKXJldHVybiAwIT0oMTY3NzcyMTYmcyk/dGhpcy5fcmVqZWN0KGMuX3JlYXNvbigpKTp0aGlzLl9jYW5jZWwoKTtjPWMuX3ZhbHVlKCl9aWYobnVsbCE9PShjPWEuYXNBcnJheShjKSkpMCE9PWMubGVuZ3RoP3RoaXMuX2l0ZXJhdGUoYyk6LTU9PT1vP3RoaXMuX3Jlc29sdmVFbXB0eUFycmF5KCk6dGhpcy5fcmVzb2x2ZShmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZS0yOnJldHVybltdO2Nhc2UtMzpyZXR1cm57fX19KG8pKTtlbHNle3ZhciBsPXIoImV4cGVjdGluZyBhbiBhcnJheSBvciBhbiBpdGVyYWJsZSBvYmplY3QgYnV0IGdvdCAiK2EuY2xhc3NTdHJpbmcoYykpLnJlYXNvbigpO3RoaXMuX3Byb21pc2UuX3JlamVjdENhbGxiYWNrKGwsITEpfX0sby5wcm90b3R5cGUuX2l0ZXJhdGU9ZnVuY3Rpb24odCl7dmFyIHI9dGhpcy5nZXRBY3R1YWxMZW5ndGgodC5sZW5ndGgpO3RoaXMuX2xlbmd0aD1yLHRoaXMuX3ZhbHVlcz10aGlzLnNob3VsZENvcHlWYWx1ZXMoKT9uZXcgQXJyYXkocik6dGhpcy5fdmFsdWVzO2Zvcih2YXIgaT10aGlzLl9wcm9taXNlLGE9ITEsbz1udWxsLGM9MDtjPHI7KytjKXt2YXIgcz1uKHRbY10saSk7bz1zIGluc3RhbmNlb2YgZT8ocz1zLl90YXJnZXQoKSkuX2JpdEZpZWxkOm51bGwsYT9udWxsIT09byYmcy5zdXBwcmVzc1VuaGFuZGxlZFJlamVjdGlvbnMoKTpudWxsIT09bz8wPT0oNTAzOTcxODQmbyk/KHMuX3Byb3h5KHRoaXMsYyksdGhpcy5fdmFsdWVzW2NdPXMpOmE9MCE9KDMzNTU0NDMyJm8pP3RoaXMuX3Byb21pc2VGdWxmaWxsZWQocy5fdmFsdWUoKSxjKTowIT0oMTY3NzcyMTYmbyk/dGhpcy5fcHJvbWlzZVJlamVjdGVkKHMuX3JlYXNvbigpLGMpOnRoaXMuX3Byb21pc2VDYW5jZWxsZWQoYyk6YT10aGlzLl9wcm9taXNlRnVsZmlsbGVkKHMsYyl9YXx8aS5fc2V0QXN5bmNHdWFyYW50ZWVkKCl9LG8ucHJvdG90eXBlLl9pc1Jlc29sdmVkPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl92YWx1ZXN9LG8ucHJvdG90eXBlLl9yZXNvbHZlPWZ1bmN0aW9uKGUpe3RoaXMuX3ZhbHVlcz1udWxsLHRoaXMuX3Byb21pc2UuX2Z1bGZpbGwoZSl9LG8ucHJvdG90eXBlLl9jYW5jZWw9ZnVuY3Rpb24oKXshdGhpcy5faXNSZXNvbHZlZCgpJiZ0aGlzLl9wcm9taXNlLl9pc0NhbmNlbGxhYmxlKCkmJih0aGlzLl92YWx1ZXM9bnVsbCx0aGlzLl9wcm9taXNlLl9jYW5jZWwoKSl9LG8ucHJvdG90eXBlLl9yZWplY3Q9ZnVuY3Rpb24oZSl7dGhpcy5fdmFsdWVzPW51bGwsdGhpcy5fcHJvbWlzZS5fcmVqZWN0Q2FsbGJhY2soZSwhMSl9LG8ucHJvdG90eXBlLl9wcm9taXNlRnVsZmlsbGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3ZhbHVlc1t0XT1lLCsrdGhpcy5fdG90YWxSZXNvbHZlZD49dGhpcy5fbGVuZ3RoJiYodGhpcy5fcmVzb2x2ZSh0aGlzLl92YWx1ZXMpLCEwKX0sby5wcm90b3R5cGUuX3Byb21pc2VDYW5jZWxsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2FuY2VsKCksITB9LG8ucHJvdG90eXBlLl9wcm9taXNlUmVqZWN0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3RvdGFsUmVzb2x2ZWQrKyx0aGlzLl9yZWplY3QoZSksITB9LG8ucHJvdG90eXBlLl9yZXN1bHRDYW5jZWxsZWQ9ZnVuY3Rpb24oKXtpZighdGhpcy5faXNSZXNvbHZlZCgpKXt2YXIgdD10aGlzLl92YWx1ZXM7aWYodGhpcy5fY2FuY2VsKCksdCBpbnN0YW5jZW9mIGUpdC5jYW5jZWwoKTtlbHNlIGZvcih2YXIgbj0wO248dC5sZW5ndGg7KytuKXRbbl1pbnN0YW5jZW9mIGUmJnRbbl0uY2FuY2VsKCl9fSxvLnByb3RvdHlwZS5zaG91bGRDb3B5VmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuITB9LG8ucHJvdG90eXBlLmdldEFjdHVhbExlbmd0aD1mdW5jdGlvbihlKXtyZXR1cm4gZX0sb30pLFZpKShVLGgsbSxuLHIpLHk9KFhpP0dpOihYaT0xLEdpPWZ1bmN0aW9uKGUpe3ZhciB0PSExLG49W107ZnVuY3Rpb24gcigpe3RoaXMuX3RyYWNlPW5ldyByLkNhcHR1cmVkVHJhY2UoaSgpKX1mdW5jdGlvbiBpKCl7dmFyIGU9bi5sZW5ndGgtMTtpZihlPj0wKXJldHVybiBuW2VdfXJldHVybiBlLnByb3RvdHlwZS5fcHJvbWlzZUNyZWF0ZWQ9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLl9wdXNoQ29udGV4dD1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuX3BvcENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZS5fcGVla0NvbnRleHQ9ZS5wcm90b3R5cGUuX3BlZWtDb250ZXh0PWZ1bmN0aW9uKCl7fSxyLnByb3RvdHlwZS5fcHVzaENvbnRleHQ9ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLl90cmFjZSYmKHRoaXMuX3RyYWNlLl9wcm9taXNlQ3JlYXRlZD1udWxsLG4ucHVzaCh0aGlzLl90cmFjZSkpfSxyLnByb3RvdHlwZS5fcG9wQ29udGV4dD1mdW5jdGlvbigpe2lmKHZvaWQgMCE9PXRoaXMuX3RyYWNlKXt2YXIgZT1uLnBvcCgpLHQ9ZS5fcHJvbWlzZUNyZWF0ZWQ7cmV0dXJuIGUuX3Byb21pc2VDcmVhdGVkPW51bGwsdH1yZXR1cm4gbnVsbH0sci5DYXB0dXJlZFRyYWNlPW51bGwsci5jcmVhdGU9ZnVuY3Rpb24oKXtpZih0KXJldHVybiBuZXcgcn0sci5kZWFjdGl2YXRlTG9uZ1N0YWNrVHJhY2VzPWZ1bmN0aW9uKCl7fSxyLmFjdGl2YXRlTG9uZ1N0YWNrVHJhY2VzPWZ1bmN0aW9uKCl7dmFyIG49ZS5wcm90b3R5cGUuX3B1c2hDb250ZXh0LGE9ZS5wcm90b3R5cGUuX3BvcENvbnRleHQsbz1lLl9wZWVrQ29udGV4dCxjPWUucHJvdG90eXBlLl9wZWVrQ29udGV4dCxzPWUucHJvdG90eXBlLl9wcm9taXNlQ3JlYXRlZDtyLmRlYWN0aXZhdGVMb25nU3RhY2tUcmFjZXM9ZnVuY3Rpb24oKXtlLnByb3RvdHlwZS5fcHVzaENvbnRleHQ9bixlLnByb3RvdHlwZS5fcG9wQ29udGV4dD1hLGUuX3BlZWtDb250ZXh0PW8sZS5wcm90b3R5cGUuX3BlZWtDb250ZXh0PWMsZS5wcm90b3R5cGUuX3Byb21pc2VDcmVhdGVkPXMsdD0hMX0sdD0hMCxlLnByb3RvdHlwZS5fcHVzaENvbnRleHQ9ci5wcm90b3R5cGUuX3B1c2hDb250ZXh0LGUucHJvdG90eXBlLl9wb3BDb250ZXh0PXIucHJvdG90eXBlLl9wb3BDb250ZXh0LGUuX3BlZWtDb250ZXh0PWUucHJvdG90eXBlLl9wZWVrQ29udGV4dD1pLGUucHJvdG90eXBlLl9wcm9taXNlQ3JlYXRlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX3BlZWtDb250ZXh0KCk7ZSYmbnVsbD09ZS5fcHJvbWlzZUNyZWF0ZWQmJihlLl9wcm9taXNlQ3JlYXRlZD10aGlzKX19LHJ9KSkoVSksdj15LmNyZWF0ZSx4PVphKCkoVSx5KTt4LkNhcHR1cmVkVHJhY2U7dmFyIEQ9KFppfHwoWmk9MSxLaT1mdW5jdGlvbihlLHQpe3ZhciBuPVJpKCkscj1lLkNhbmNlbGxhdGlvbkVycm9yLGk9bi5lcnJvck9iajtmdW5jdGlvbiBhKGUsdCxuKXt0aGlzLnByb21pc2U9ZSx0aGlzLnR5cGU9dCx0aGlzLmhhbmRsZXI9bix0aGlzLmNhbGxlZD0hMSx0aGlzLmNhbmNlbFByb21pc2U9bnVsbH1mdW5jdGlvbiBvKGUpe3RoaXMuZmluYWxseUhhbmRsZXI9ZX1mdW5jdGlvbiBjKGUsdCl7cmV0dXJuIG51bGwhPWUuY2FuY2VsUHJvbWlzZSYmKGFyZ3VtZW50cy5sZW5ndGg+MT9lLmNhbmNlbFByb21pc2UuX3JlamVjdCh0KTplLmNhbmNlbFByb21pc2UuX2NhbmNlbCgpLGUuY2FuY2VsUHJvbWlzZT1udWxsLCEwKX1mdW5jdGlvbiBzKCl7cmV0dXJuIHUuY2FsbCh0aGlzLHRoaXMucHJvbWlzZS5fdGFyZ2V0KCkuX3NldHRsZWRWYWx1ZSgpKX1mdW5jdGlvbiBsKGUpe2lmKCFjKHRoaXMsZSkpcmV0dXJuIGkuZT1lLGl9ZnVuY3Rpb24gdShuKXt2YXIgYT10aGlzLnByb21pc2UsdT10aGlzLmhhbmRsZXI7aWYoIXRoaXMuY2FsbGVkKXt0aGlzLmNhbGxlZD0hMDt2YXIgZj10aGlzLmlzRmluYWxseUhhbmRsZXIoKT91LmNhbGwoYS5fYm91bmRWYWx1ZSgpKTp1LmNhbGwoYS5fYm91bmRWYWx1ZSgpLG4pO2lmKHZvaWQgMCE9PWYpe2EuX3NldFJldHVybmVkTm9uVW5kZWZpbmVkKCk7dmFyIGQ9dChmLGEpO2lmKGQgaW5zdGFuY2VvZiBlKXtpZihudWxsIT10aGlzLmNhbmNlbFByb21pc2Upe2lmKGQuX2lzQ2FuY2VsbGVkKCkpe3ZhciBoPW5ldyByKCJsYXRlIGNhbmNlbGxhdGlvbiBvYnNlcnZlciIpO3JldHVybiBhLl9hdHRhY2hFeHRyYVRyYWNlKGgpLGkuZT1oLGl9ZC5pc1BlbmRpbmcoKSYmZC5fYXR0YWNoQ2FuY2VsbGF0aW9uQ2FsbGJhY2sobmV3IG8odGhpcykpfXJldHVybiBkLl90aGVuKHMsbCx2b2lkIDAsdGhpcyx2b2lkIDApfX19cmV0dXJuIGEuaXNSZWplY3RlZCgpPyhjKHRoaXMpLGkuZT1uLGkpOihjKHRoaXMpLG4pfXJldHVybiBhLnByb3RvdHlwZS5pc0ZpbmFsbHlIYW5kbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnR5cGV9LG8ucHJvdG90eXBlLl9yZXN1bHRDYW5jZWxsZWQ9ZnVuY3Rpb24oKXtjKHRoaXMuZmluYWxseUhhbmRsZXIpfSxlLnByb3RvdHlwZS5fcGFzc1Rocm91Z2g9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIGU/dGhpcy50aGVuKCk6dGhpcy5fdGhlbihuLHIsdm9pZCAwLG5ldyBhKHRoaXMsdCxlKSx2b2lkIDApfSxlLnByb3RvdHlwZS5sYXN0bHk9ZS5wcm90b3R5cGUuZmluYWxseT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcGFzc1Rocm91Z2goZSwwLHUsdSl9LGUucHJvdG90eXBlLnRhcD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcGFzc1Rocm91Z2goZSwxLHUpfSxhfSksS2kpKFUsbSksVD0oUWl8fChRaT0xLEppPWZ1bmN0aW9uKGUpe3ZhciB0PVJpKCksbj1JaSgpLmtleXMscj10LnRyeUNhdGNoLGk9dC5lcnJvck9iajtyZXR1cm4gZnVuY3Rpb24oYSxvLGMpe3JldHVybiBmdW5jdGlvbihzKXt2YXIgbD1jLl9ib3VuZFZhbHVlKCk7ZTpmb3IodmFyIHU9MDt1PGEubGVuZ3RoOysrdSl7dmFyIGY9YVt1XTtpZihmPT09RXJyb3J8fG51bGwhPWYmJmYucHJvdG90eXBlIGluc3RhbmNlb2YgRXJyb3Ipe2lmKHMgaW5zdGFuY2VvZiBmKXJldHVybiByKG8pLmNhbGwobCxzKX1lbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBmKXt2YXIgZD1yKGYpLmNhbGwobCxzKTtpZihkPT09aSlyZXR1cm4gZDtpZihkKXJldHVybiByKG8pLmNhbGwobCxzKX1lbHNlIGlmKHQuaXNPYmplY3Qocykpe2Zvcih2YXIgaD1uKGYpLHA9MDtwPGgubGVuZ3RoOysrcCl7dmFyIGc9aFtwXTtpZihmW2ddIT1zW2ddKWNvbnRpbnVlIGV9cmV0dXJuIHIobykuY2FsbChsLHMpfX1yZXR1cm4gZX19fSksSmkpKGcpLHc9SmEoKSxfPW8uZXJyb3JPYmosRT1vLnRyeUNhdGNoO2Z1bmN0aW9uIFUoZSl7dGhpcy5fYml0RmllbGQ9MCx0aGlzLl9mdWxmaWxsbWVudEhhbmRsZXIwPXZvaWQgMCx0aGlzLl9yZWplY3Rpb25IYW5kbGVyMD12b2lkIDAsdGhpcy5fcHJvbWlzZTA9dm9pZCAwLHRoaXMuX3JlY2VpdmVyMD12b2lkIDAsZSE9PWgmJihmdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBmKCJleHBlY3RpbmcgYSBmdW5jdGlvbiBidXQgZ290ICIrby5jbGFzc1N0cmluZyh0KSk7aWYoZS5jb25zdHJ1Y3RvciE9PVUpdGhyb3cgbmV3IGYoInRoZSBwcm9taXNlIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBpbnZva2VkIGRpcmVjdGx5XG5cbiAgICBTZWUgaHR0cDovL2dvby5nbC9NcXJGbVhcbiIpfSh0aGlzLGUpLHRoaXMuX3Jlc29sdmVGcm9tRXhlY3V0b3IoZSkpLHRoaXMuX3Byb21pc2VDcmVhdGVkKCksdGhpcy5fZmlyZUV2ZW50KCJwcm9taXNlQ3JlYXRlZCIsdGhpcyl9ZnVuY3Rpb24gQShlKXt0aGlzLnByb21pc2UuX3Jlc29sdmVDYWxsYmFjayhlKX1mdW5jdGlvbiBrKGUpe3RoaXMucHJvbWlzZS5fcmVqZWN0Q2FsbGJhY2soZSwhMSl9ZnVuY3Rpb24gUyhlKXt2YXIgdD1uZXcgVShoKTt0Ll9mdWxmaWxsbWVudEhhbmRsZXIwPWUsdC5fcmVqZWN0aW9uSGFuZGxlcjA9ZSx0Ll9wcm9taXNlMD1lLHQuX3JlY2VpdmVyMD1lfXJldHVybiBVLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJbb2JqZWN0IFByb21pc2VdIn0sVS5wcm90b3R5cGUuY2F1Z2h0PVUucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg7aWYodD4xKXt2YXIgcixpPW5ldyBBcnJheSh0LTEpLGE9MDtmb3Iocj0wO3I8dC0xOysrcil7dmFyIGM9YXJndW1lbnRzW3JdO2lmKCFvLmlzT2JqZWN0KGMpKXJldHVybiBuKCJleHBlY3RpbmcgYW4gb2JqZWN0IGJ1dCBnb3QgQSBjYXRjaCBzdGF0ZW1lbnQgcHJlZGljYXRlICIrby5jbGFzc1N0cmluZyhjKSk7aVthKytdPWN9cmV0dXJuIGkubGVuZ3RoPWEsZT1hcmd1bWVudHNbcl0sdGhpcy50aGVuKHZvaWQgMCxUKGksZSx0aGlzKSl9cmV0dXJuIHRoaXMudGhlbih2b2lkIDAsZSl9LFUucHJvdG90eXBlLnJlZmxlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGhlbih0LHQsdm9pZCAwLHRoaXMsdm9pZCAwKX0sVS5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihlLHQpe2lmKHgud2FybmluZ3MoKSYmYXJndW1lbnRzLmxlbmd0aD4wJiYiZnVuY3Rpb24iIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIHQpe3ZhciBuPSIudGhlbigpIG9ubHkgYWNjZXB0cyBmdW5jdGlvbnMgYnV0IHdhcyBwYXNzZWQ6ICIrby5jbGFzc1N0cmluZyhlKTthcmd1bWVudHMubGVuZ3RoPjEmJihuKz0iLCAiK28uY2xhc3NTdHJpbmcodCkpLHRoaXMuX3dhcm4obil9cmV0dXJuIHRoaXMuX3RoZW4oZSx0LHZvaWQgMCx2b2lkIDAsdm9pZCAwKX0sVS5wcm90b3R5cGUuZG9uZT1mdW5jdGlvbihlLHQpe3RoaXMuX3RoZW4oZSx0LHZvaWQgMCx2b2lkIDAsdm9pZCAwKS5fc2V0SXNGaW5hbCgpfSxVLnByb3RvdHlwZS5zcHJlYWQ9ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIGU/bigiZXhwZWN0aW5nIGEgZnVuY3Rpb24gYnV0IGdvdCAiK28uY2xhc3NTdHJpbmcoZSkpOnRoaXMuYWxsKCkuX3RoZW4oZSx2b2lkIDAsdm9pZCAwLHAsdm9pZCAwKX0sVS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGU9e2lzRnVsZmlsbGVkOiExLGlzUmVqZWN0ZWQ6ITEsZnVsZmlsbG1lbnRWYWx1ZTp2b2lkIDAscmVqZWN0aW9uUmVhc29uOnZvaWQgMH07cmV0dXJuIHRoaXMuaXNGdWxmaWxsZWQoKT8oZS5mdWxmaWxsbWVudFZhbHVlPXRoaXMudmFsdWUoKSxlLmlzRnVsZmlsbGVkPSEwKTp0aGlzLmlzUmVqZWN0ZWQoKSYmKGUucmVqZWN0aW9uUmVhc29uPXRoaXMucmVhc29uKCksZS5pc1JlamVjdGVkPSEwKSxlfSxVLnByb3RvdHlwZS5hbGw9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wJiZ0aGlzLl93YXJuKCIuYWxsKCkgd2FzIHBhc3NlZCBhcmd1bWVudHMgYnV0IGl0IGRvZXMgbm90IHRha2UgYW55IiksbmV3IGIodGhpcykucHJvbWlzZSgpfSxVLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jYXVnaHQoby5vcmlnaW5hdGVzRnJvbVJlamVjdGlvbixlKX0sVS5nZXROZXdMaWJyYXJ5Q29weT1WYS5leHBvcnRzLFUuaXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVfSxVLmZyb21Ob2RlPVUuZnJvbUNhbGxiYWNrPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBVKGgpO3QuX2NhcHR1cmVTdGFja1RyYWNlKCk7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiYhIU9iamVjdChhcmd1bWVudHNbMV0pLm11bHRpQXJncyxyPUUoZSkodyh0LG4pKTtyZXR1cm4gcj09PV8mJnQuX3JlamVjdENhbGxiYWNrKHIuZSwhMCksdC5faXNGYXRlU2VhbGVkKCl8fHQuX3NldEFzeW5jR3VhcmFudGVlZCgpLHR9LFUuYWxsPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgYihlKS5wcm9taXNlKCl9LFUuY2FzdD1mdW5jdGlvbihlKXt2YXIgdD1tKGUpO3JldHVybiB0IGluc3RhbmNlb2YgVXx8KCh0PW5ldyBVKGgpKS5fY2FwdHVyZVN0YWNrVHJhY2UoKSx0Ll9zZXRGdWxmaWxsZWQoKSx0Ll9yZWplY3Rpb25IYW5kbGVyMD1lKSx0fSxVLnJlc29sdmU9VS5mdWxmaWxsZWQ9VS5jYXN0LFUucmVqZWN0PVUucmVqZWN0ZWQ9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFUoaCk7cmV0dXJuIHQuX2NhcHR1cmVTdGFja1RyYWNlKCksdC5fcmVqZWN0Q2FsbGJhY2soZSwhMCksdH0sVS5zZXRTY2hlZHVsZXI9ZnVuY3Rpb24oZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IGYoImV4cGVjdGluZyBhIGZ1bmN0aW9uIGJ1dCBnb3QgIitvLmNsYXNzU3RyaW5nKGUpKTtyZXR1cm4gbC5zZXRTY2hlZHVsZXIoZSl9LFUucHJvdG90eXBlLl90aGVuPWZ1bmN0aW9uKGUsdCxuLHIsYSl7dmFyIGM9dm9pZCAwIT09YSxzPWM/YTpuZXcgVShoKSx1PXRoaXMuX3RhcmdldCgpLGY9dS5fYml0RmllbGQ7Y3x8KHMuX3Byb3BhZ2F0ZUZyb20odGhpcywzKSxzLl9jYXB0dXJlU3RhY2tUcmFjZSgpLHZvaWQgMD09PXImJjAhPSgyMDk3MTUyJnRoaXMuX2JpdEZpZWxkKSYmKHI9MCE9KDUwMzk3MTg0JmYpP3RoaXMuX2JvdW5kVmFsdWUoKTp1PT09dGhpcz92b2lkIDA6dGhpcy5fYm91bmRUbyksdGhpcy5fZmlyZUV2ZW50KCJwcm9taXNlQ2hhaW5lZCIsdGhpcyxzKSk7dmFyIHA9aSgpO2lmKDAhPSg1MDM5NzE4NCZmKSl7dmFyIGcsbSxiPXUuX3NldHRsZVByb21pc2VDdHg7MCE9KDMzNTU0NDMyJmYpPyhtPXUuX3JlamVjdGlvbkhhbmRsZXIwLGc9ZSk6MCE9KDE2Nzc3MjE2JmYpPyhtPXUuX2Z1bGZpbGxtZW50SGFuZGxlcjAsZz10LHUuX3Vuc2V0UmVqZWN0aW9uSXNVbmhhbmRsZWQoKSk6KGI9dS5fc2V0dGxlUHJvbWlzZUxhdGVDYW5jZWxsYXRpb25PYnNlcnZlcixtPW5ldyBkKCJsYXRlIGNhbmNlbGxhdGlvbiBvYnNlcnZlciIpLHUuX2F0dGFjaEV4dHJhVHJhY2UobSksZz10KSxsLmludm9rZShiLHUse2hhbmRsZXI6bnVsbD09PXA/ZzoiZnVuY3Rpb24iPT10eXBlb2YgZyYmby5kb21haW5CaW5kKHAsZykscHJvbWlzZTpzLHJlY2VpdmVyOnIsdmFsdWU6bX0pfWVsc2UgdS5fYWRkQ2FsbGJhY2tzKGUsdCxzLHIscCk7cmV0dXJuIHN9LFUucHJvdG90eXBlLl9sZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gNjU1MzUmdGhpcy5fYml0RmllbGR9LFUucHJvdG90eXBlLl9pc0ZhdGVTZWFsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9KDExNzUwNjA0OCZ0aGlzLl9iaXRGaWVsZCl9LFUucHJvdG90eXBlLl9pc0ZvbGxvd2luZz1mdW5jdGlvbigpe3JldHVybiA2NzEwODg2ND09KDY3MTA4ODY0JnRoaXMuX2JpdEZpZWxkKX0sVS5wcm90b3R5cGUuX3NldExlbmd0aD1mdW5jdGlvbihlKXt0aGlzLl9iaXRGaWVsZD0tNjU1MzYmdGhpcy5fYml0RmllbGR8NjU1MzUmZX0sVS5wcm90b3R5cGUuX3NldEZ1bGZpbGxlZD1mdW5jdGlvbigpe3RoaXMuX2JpdEZpZWxkPTMzNTU0NDMyfHRoaXMuX2JpdEZpZWxkLHRoaXMuX2ZpcmVFdmVudCgicHJvbWlzZUZ1bGZpbGxlZCIsdGhpcyl9LFUucHJvdG90eXBlLl9zZXRSZWplY3RlZD1mdW5jdGlvbigpe3RoaXMuX2JpdEZpZWxkPTE2Nzc3MjE2fHRoaXMuX2JpdEZpZWxkLHRoaXMuX2ZpcmVFdmVudCgicHJvbWlzZVJlamVjdGVkIix0aGlzKX0sVS5wcm90b3R5cGUuX3NldEZvbGxvd2luZz1mdW5jdGlvbigpe3RoaXMuX2JpdEZpZWxkPTY3MTA4ODY0fHRoaXMuX2JpdEZpZWxkLHRoaXMuX2ZpcmVFdmVudCgicHJvbWlzZVJlc29sdmVkIix0aGlzKX0sVS5wcm90b3R5cGUuX3NldElzRmluYWw9ZnVuY3Rpb24oKXt0aGlzLl9iaXRGaWVsZD00MTk0MzA0fHRoaXMuX2JpdEZpZWxkfSxVLnByb3RvdHlwZS5faXNGaW5hbD1mdW5jdGlvbigpe3JldHVybig0MTk0MzA0JnRoaXMuX2JpdEZpZWxkKT4wfSxVLnByb3RvdHlwZS5fdW5zZXRDYW5jZWxsZWQ9ZnVuY3Rpb24oKXt0aGlzLl9iaXRGaWVsZD0tNjU1MzcmdGhpcy5fYml0RmllbGR9LFUucHJvdG90eXBlLl9zZXRDYW5jZWxsZWQ9ZnVuY3Rpb24oKXt0aGlzLl9iaXRGaWVsZD02NTUzNnx0aGlzLl9iaXRGaWVsZCx0aGlzLl9maXJlRXZlbnQoInByb21pc2VDYW5jZWxsZWQiLHRoaXMpfSxVLnByb3RvdHlwZS5fc2V0V2lsbEJlQ2FuY2VsbGVkPWZ1bmN0aW9uKCl7dGhpcy5fYml0RmllbGQ9ODM4ODYwOHx0aGlzLl9iaXRGaWVsZH0sVS5wcm90b3R5cGUuX3NldEFzeW5jR3VhcmFudGVlZD1mdW5jdGlvbigpe2wuaGFzQ3VzdG9tU2NoZWR1bGVyKCl8fCh0aGlzLl9iaXRGaWVsZD0xMzQyMTc3Mjh8dGhpcy5fYml0RmllbGQpfSxVLnByb3RvdHlwZS5fcmVjZWl2ZXJBdD1mdW5jdGlvbihlKXt2YXIgdD0wPT09ZT90aGlzLl9yZWNlaXZlcjA6dGhpc1s0KmUtNCszXTtpZih0IT09YSlyZXR1cm4gdm9pZCAwPT09dCYmdGhpcy5faXNCb3VuZCgpP3RoaXMuX2JvdW5kVmFsdWUoKTp0fSxVLnByb3RvdHlwZS5fcHJvbWlzZUF0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzWzQqZS00KzJdfSxVLnByb3RvdHlwZS5fZnVsZmlsbG1lbnRIYW5kbGVyQXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXNbNCplLTQrMF19LFUucHJvdG90eXBlLl9yZWplY3Rpb25IYW5kbGVyQXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXNbNCplLTQrMV19LFUucHJvdG90eXBlLl9ib3VuZFZhbHVlPWZ1bmN0aW9uKCl7fSxVLnByb3RvdHlwZS5fbWlncmF0ZUNhbGxiYWNrMD1mdW5jdGlvbihlKXtlLl9iaXRGaWVsZDt2YXIgdD1lLl9mdWxmaWxsbWVudEhhbmRsZXIwLG49ZS5fcmVqZWN0aW9uSGFuZGxlcjAscj1lLl9wcm9taXNlMCxpPWUuX3JlY2VpdmVyQXQoMCk7dm9pZCAwPT09aSYmKGk9YSksdGhpcy5fYWRkQ2FsbGJhY2tzKHQsbixyLGksbnVsbCl9LFUucHJvdG90eXBlLl9taWdyYXRlQ2FsbGJhY2tBdD1mdW5jdGlvbihlLHQpe3ZhciBuPWUuX2Z1bGZpbGxtZW50SGFuZGxlckF0KHQpLHI9ZS5fcmVqZWN0aW9uSGFuZGxlckF0KHQpLGk9ZS5fcHJvbWlzZUF0KHQpLG89ZS5fcmVjZWl2ZXJBdCh0KTt2b2lkIDA9PT1vJiYobz1hKSx0aGlzLl9hZGRDYWxsYmFja3MobixyLGksbyxudWxsKX0sVS5wcm90b3R5cGUuX2FkZENhbGxiYWNrcz1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBhPXRoaXMuX2xlbmd0aCgpO2lmKGE+PTY1NTMxJiYoYT0wLHRoaXMuX3NldExlbmd0aCgwKSksMD09PWEpdGhpcy5fcHJvbWlzZTA9bix0aGlzLl9yZWNlaXZlcjA9ciwiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHRoaXMuX2Z1bGZpbGxtZW50SGFuZGxlcjA9bnVsbD09PWk/ZTpvLmRvbWFpbkJpbmQoaSxlKSksImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0aGlzLl9yZWplY3Rpb25IYW5kbGVyMD1udWxsPT09aT90Om8uZG9tYWluQmluZChpLHQpKTtlbHNle3ZhciBjPTQqYS00O3RoaXNbYysyXT1uLHRoaXNbYyszXT1yLCJmdW5jdGlvbiI9PXR5cGVvZiBlJiYodGhpc1tjKzBdPW51bGw9PT1pP2U6by5kb21haW5CaW5kKGksZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodGhpc1tjKzFdPW51bGw9PT1pP3Q6by5kb21haW5CaW5kKGksdCkpfXJldHVybiB0aGlzLl9zZXRMZW5ndGgoYSsxKSxhfSxVLnByb3RvdHlwZS5fcHJveHk9ZnVuY3Rpb24oZSx0KXt0aGlzLl9hZGRDYWxsYmFja3Modm9pZCAwLHZvaWQgMCx0LGUsbnVsbCl9LFUucHJvdG90eXBlLl9yZXNvbHZlQ2FsbGJhY2s9ZnVuY3Rpb24odCxuKXtpZigwPT0oMTE3NTA2MDQ4JnRoaXMuX2JpdEZpZWxkKSl7aWYodD09PXRoaXMpcmV0dXJuIHRoaXMuX3JlamVjdENhbGxiYWNrKGUoKSwhMSk7dmFyIHI9bSh0LHRoaXMpO2lmKCEociBpbnN0YW5jZW9mIFUpKXJldHVybiB0aGlzLl9mdWxmaWxsKHQpO24mJnRoaXMuX3Byb3BhZ2F0ZUZyb20ociwyKTt2YXIgaT1yLl90YXJnZXQoKTtpZihpIT09dGhpcyl7dmFyIGE9aS5fYml0RmllbGQ7aWYoMD09KDUwMzk3MTg0JmEpKXt2YXIgbz10aGlzLl9sZW5ndGgoKTtvPjAmJmkuX21pZ3JhdGVDYWxsYmFjazAodGhpcyk7Zm9yKHZhciBjPTE7YzxvOysrYylpLl9taWdyYXRlQ2FsbGJhY2tBdCh0aGlzLGMpO3RoaXMuX3NldEZvbGxvd2luZygpLHRoaXMuX3NldExlbmd0aCgwKSx0aGlzLl9zZXRGb2xsb3dlZShpKX1lbHNlIGlmKDAhPSgzMzU1NDQzMiZhKSl0aGlzLl9mdWxmaWxsKGkuX3ZhbHVlKCkpO2Vsc2UgaWYoMCE9KDE2Nzc3MjE2JmEpKXRoaXMuX3JlamVjdChpLl9yZWFzb24oKSk7ZWxzZXt2YXIgcz1uZXcgZCgibGF0ZSBjYW5jZWxsYXRpb24gb2JzZXJ2ZXIiKTtpLl9hdHRhY2hFeHRyYVRyYWNlKHMpLHRoaXMuX3JlamVjdChzKX19ZWxzZSB0aGlzLl9yZWplY3QoZSgpKX19LFUucHJvdG90eXBlLl9yZWplY3RDYWxsYmFjaz1mdW5jdGlvbihlLHQsbil7dmFyIHI9by5lbnN1cmVFcnJvck9iamVjdChlKSxpPXI9PT1lO2lmKCFpJiYhbiYmeC53YXJuaW5ncygpKXt2YXIgYT0iYSBwcm9taXNlIHdhcyByZWplY3RlZCB3aXRoIGEgbm9uLWVycm9yOiAiK28uY2xhc3NTdHJpbmcoZSk7dGhpcy5fd2FybihhLCEwKX10aGlzLl9hdHRhY2hFeHRyYVRyYWNlKHIsISF0JiZpKSx0aGlzLl9yZWplY3QoZSl9LFUucHJvdG90eXBlLl9yZXNvbHZlRnJvbUV4ZWN1dG9yPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5fY2FwdHVyZVN0YWNrVHJhY2UoKSx0aGlzLl9wdXNoQ29udGV4dCgpO3ZhciBuPSEwLHI9dGhpcy5fZXhlY3V0ZShlLChmdW5jdGlvbihlKXt0Ll9yZXNvbHZlQ2FsbGJhY2soZSl9KSwoZnVuY3Rpb24oZSl7dC5fcmVqZWN0Q2FsbGJhY2soZSxuKX0pKTtuPSExLHRoaXMuX3BvcENvbnRleHQoKSx2b2lkIDAhPT1yJiZ0Ll9yZWplY3RDYWxsYmFjayhyLCEwKX0sVS5wcm90b3R5cGUuX3NldHRsZVByb21pc2VGcm9tSGFuZGxlcj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1yLl9iaXRGaWVsZDtpZigwPT0oNjU1MzYmaSkpe3ZhciBhO3IuX3B1c2hDb250ZXh0KCksdD09PXA/biYmIm51bWJlciI9PXR5cGVvZiBuLmxlbmd0aD9hPUUoZSkuYXBwbHkodGhpcy5fYm91bmRWYWx1ZSgpLG4pOihhPV8pLmU9bmV3IGYoImNhbm5vdCAuc3ByZWFkKCkgYSBub24tYXJyYXk6ICIrby5jbGFzc1N0cmluZyhuKSk6YT1FKGUpLmNhbGwodCxuKTt2YXIgYz1yLl9wb3BDb250ZXh0KCk7MD09KDY1NTM2JihpPXIuX2JpdEZpZWxkKSkmJihhPT09Zz9yLl9yZWplY3Qobik6YT09PV8/ci5fcmVqZWN0Q2FsbGJhY2soYS5lLCExKTooeC5jaGVja0ZvcmdvdHRlblJldHVybnMoYSxjLCIiLHIsdGhpcyksci5fcmVzb2x2ZUNhbGxiYWNrKGEpKSl9fSxVLnByb3RvdHlwZS5fdGFyZ2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXM7ZS5faXNGb2xsb3dpbmcoKTspZT1lLl9mb2xsb3dlZSgpO3JldHVybiBlfSxVLnByb3RvdHlwZS5fZm9sbG93ZWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVqZWN0aW9uSGFuZGxlcjB9LFUucHJvdG90eXBlLl9zZXRGb2xsb3dlZT1mdW5jdGlvbihlKXt0aGlzLl9yZWplY3Rpb25IYW5kbGVyMD1lfSxVLnByb3RvdHlwZS5fc2V0dGxlUHJvbWlzZT1mdW5jdGlvbihlLG4saSxhKXt2YXIgbz1lIGluc3RhbmNlb2YgVSxjPXRoaXMuX2JpdEZpZWxkLHM9MCE9KDEzNDIxNzcyOCZjKTswIT0oNjU1MzYmYyk/KG8mJmUuX2ludm9rZUludGVybmFsT25DYW5jZWwoKSxpIGluc3RhbmNlb2YgRCYmaS5pc0ZpbmFsbHlIYW5kbGVyKCk/KGkuY2FuY2VsUHJvbWlzZT1lLEUobikuY2FsbChpLGEpPT09XyYmZS5fcmVqZWN0KF8uZSkpOm49PT10P2UuX2Z1bGZpbGwodC5jYWxsKGkpKTppIGluc3RhbmNlb2Ygcj9pLl9wcm9taXNlQ2FuY2VsbGVkKGUpOm98fGUgaW5zdGFuY2VvZiBiP2UuX2NhbmNlbCgpOmkuY2FuY2VsKCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP28/KHMmJmUuX3NldEFzeW5jR3VhcmFudGVlZCgpLHRoaXMuX3NldHRsZVByb21pc2VGcm9tSGFuZGxlcihuLGksYSxlKSk6bi5jYWxsKGksYSxlKTppIGluc3RhbmNlb2Ygcj9pLl9pc1Jlc29sdmVkKCl8fCgwIT0oMzM1NTQ0MzImYyk/aS5fcHJvbWlzZUZ1bGZpbGxlZChhLGUpOmkuX3Byb21pc2VSZWplY3RlZChhLGUpKTpvJiYocyYmZS5fc2V0QXN5bmNHdWFyYW50ZWVkKCksMCE9KDMzNTU0NDMyJmMpP2UuX2Z1bGZpbGwoYSk6ZS5fcmVqZWN0KGEpKX0sVS5wcm90b3R5cGUuX3NldHRsZVByb21pc2VMYXRlQ2FuY2VsbGF0aW9uT2JzZXJ2ZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5oYW5kbGVyLG49ZS5wcm9taXNlLHI9ZS5yZWNlaXZlcixpPWUudmFsdWU7ImZ1bmN0aW9uIj09dHlwZW9mIHQ/biBpbnN0YW5jZW9mIFU/dGhpcy5fc2V0dGxlUHJvbWlzZUZyb21IYW5kbGVyKHQscixpLG4pOnQuY2FsbChyLGksbik6biBpbnN0YW5jZW9mIFUmJm4uX3JlamVjdChpKX0sVS5wcm90b3R5cGUuX3NldHRsZVByb21pc2VDdHg9ZnVuY3Rpb24oZSl7dGhpcy5fc2V0dGxlUHJvbWlzZShlLnByb21pc2UsZS5oYW5kbGVyLGUucmVjZWl2ZXIsZS52YWx1ZSl9LFUucHJvdG90eXBlLl9zZXR0bGVQcm9taXNlMD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fcHJvbWlzZTAsaT10aGlzLl9yZWNlaXZlckF0KDApO3RoaXMuX3Byb21pc2UwPXZvaWQgMCx0aGlzLl9yZWNlaXZlcjA9dm9pZCAwLHRoaXMuX3NldHRsZVByb21pc2UocixlLGksdCl9LFUucHJvdG90eXBlLl9jbGVhckNhbGxiYWNrRGF0YUF0SW5kZXg9ZnVuY3Rpb24oZSl7dmFyIHQ9NCplLTQ7dGhpc1t0KzJdPXRoaXNbdCszXT10aGlzW3QrMF09dGhpc1t0KzFdPXZvaWQgMH0sVS5wcm90b3R5cGUuX2Z1bGZpbGw9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fYml0RmllbGQ7aWYoISgoMTE3NTA2MDQ4Jm4pPj4+MTYpKXtpZih0PT09dGhpcyl7dmFyIHI9ZSgpO3JldHVybiB0aGlzLl9hdHRhY2hFeHRyYVRyYWNlKHIpLHRoaXMuX3JlamVjdChyKX10aGlzLl9zZXRGdWxmaWxsZWQoKSx0aGlzLl9yZWplY3Rpb25IYW5kbGVyMD10LCg2NTUzNSZuKT4wJiYoMCE9KDEzNDIxNzcyOCZuKT90aGlzLl9zZXR0bGVQcm9taXNlcygpOmwuc2V0dGxlUHJvbWlzZXModGhpcykpfX0sVS5wcm90b3R5cGUuX3JlamVjdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9iaXRGaWVsZDtpZighKCgxMTc1MDYwNDgmdCk+Pj4xNikpe2lmKHRoaXMuX3NldFJlamVjdGVkKCksdGhpcy5fZnVsZmlsbG1lbnRIYW5kbGVyMD1lLHRoaXMuX2lzRmluYWwoKSlyZXR1cm4gbC5mYXRhbEVycm9yKGUsby5pc05vZGUpOyg2NTUzNSZ0KT4wP2wuc2V0dGxlUHJvbWlzZXModGhpcyk6dGhpcy5fZW5zdXJlUG9zc2libGVSZWplY3Rpb25IYW5kbGVkKCl9fSxVLnByb3RvdHlwZS5fZnVsZmlsbFByb21pc2VzPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTE7bjxlO24rKyl7dmFyIHI9dGhpcy5fZnVsZmlsbG1lbnRIYW5kbGVyQXQobiksaT10aGlzLl9wcm9taXNlQXQobiksYT10aGlzLl9yZWNlaXZlckF0KG4pO3RoaXMuX2NsZWFyQ2FsbGJhY2tEYXRhQXRJbmRleChuKSx0aGlzLl9zZXR0bGVQcm9taXNlKGkscixhLHQpfX0sVS5wcm90b3R5cGUuX3JlamVjdFByb21pc2VzPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTE7bjxlO24rKyl7dmFyIHI9dGhpcy5fcmVqZWN0aW9uSGFuZGxlckF0KG4pLGk9dGhpcy5fcHJvbWlzZUF0KG4pLGE9dGhpcy5fcmVjZWl2ZXJBdChuKTt0aGlzLl9jbGVhckNhbGxiYWNrRGF0YUF0SW5kZXgobiksdGhpcy5fc2V0dGxlUHJvbWlzZShpLHIsYSx0KX19LFUucHJvdG90eXBlLl9zZXR0bGVQcm9taXNlcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2JpdEZpZWxkLHQ9NjU1MzUmZTtpZih0PjApe2lmKDAhPSgxNjg0Mjc1MiZlKSl7dmFyIG49dGhpcy5fZnVsZmlsbG1lbnRIYW5kbGVyMDt0aGlzLl9zZXR0bGVQcm9taXNlMCh0aGlzLl9yZWplY3Rpb25IYW5kbGVyMCxuLGUpLHRoaXMuX3JlamVjdFByb21pc2VzKHQsbil9ZWxzZXt2YXIgcj10aGlzLl9yZWplY3Rpb25IYW5kbGVyMDt0aGlzLl9zZXR0bGVQcm9taXNlMCh0aGlzLl9mdWxmaWxsbWVudEhhbmRsZXIwLHIsZSksdGhpcy5fZnVsZmlsbFByb21pc2VzKHQscil9dGhpcy5fc2V0TGVuZ3RoKDApfXRoaXMuX2NsZWFyQ2FuY2VsbGF0aW9uRGF0YSgpfSxVLnByb3RvdHlwZS5fc2V0dGxlZFZhbHVlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fYml0RmllbGQ7cmV0dXJuIDAhPSgzMzU1NDQzMiZlKT90aGlzLl9yZWplY3Rpb25IYW5kbGVyMDowIT0oMTY3NzcyMTYmZSk/dGhpcy5fZnVsZmlsbG1lbnRIYW5kbGVyMDp2b2lkIDB9LFUuZGVmZXI9VS5wZW5kaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHguZGVwcmVjYXRlZCgiUHJvbWlzZS5kZWZlciIsIm5ldyBQcm9taXNlIikse3Byb21pc2U6bmV3IFUoaCkscmVzb2x2ZTpBLHJlamVjdDprfX0sby5ub3RFbnVtZXJhYmxlUHJvcChVLCJfbWFrZVNlbGZSZXNvbHV0aW9uRXJyb3IiLGUpLChyYXx8KHJhPTEsbmE9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgYT1SaSgpLG89YS50cnlDYXRjaDtlLm1ldGhvZD1mdW5jdGlvbihuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgZS5UeXBlRXJyb3IoImV4cGVjdGluZyBhIGZ1bmN0aW9uIGJ1dCBnb3QgIithLmNsYXNzU3RyaW5nKG4pKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1uZXcgZSh0KTtyLl9jYXB0dXJlU3RhY2tUcmFjZSgpLHIuX3B1c2hDb250ZXh0KCk7dmFyIGE9byhuKS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYz1yLl9wb3BDb250ZXh0KCk7cmV0dXJuIGkuY2hlY2tGb3Jnb3R0ZW5SZXR1cm5zKGEsYywiUHJvbWlzZS5tZXRob2QiLHIpLHIuX3Jlc29sdmVGcm9tU3luY1ZhbHVlKGEpLHJ9fSxlLmF0dGVtcHQ9ZS50cnk9ZnVuY3Rpb24obil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pcmV0dXJuIHIoImV4cGVjdGluZyBhIGZ1bmN0aW9uIGJ1dCBnb3QgIithLmNsYXNzU3RyaW5nKG4pKTt2YXIgYyxzPW5ldyBlKHQpO2lmKHMuX2NhcHR1cmVTdGFja1RyYWNlKCkscy5fcHVzaENvbnRleHQoKSxhcmd1bWVudHMubGVuZ3RoPjEpe2kuZGVwcmVjYXRlZCgiY2FsbGluZyBQcm9taXNlLnRyeSB3aXRoIG1vcmUgdGhhbiAxIGFyZ3VtZW50Iik7dmFyIGw9YXJndW1lbnRzWzFdLHU9YXJndW1lbnRzWzJdO2M9YS5pc0FycmF5KGwpP28obikuYXBwbHkodSxsKTpvKG4pLmNhbGwodSxsKX1lbHNlIGM9byhuKSgpO3ZhciBmPXMuX3BvcENvbnRleHQoKTtyZXR1cm4gaS5jaGVja0ZvcmdvdHRlblJldHVybnMoYyxmLCJQcm9taXNlLnRyeSIscykscy5fcmVzb2x2ZUZyb21TeW5jVmFsdWUoYyksc30sZS5wcm90b3R5cGUuX3Jlc29sdmVGcm9tU3luY1ZhbHVlPWZ1bmN0aW9uKGUpe2U9PT1hLmVycm9yT2JqP3RoaXMuX3JlamVjdENhbGxiYWNrKGUuZSwhMSk6dGhpcy5fcmVzb2x2ZUNhbGxiYWNrKGUsITApfX0pLG5hKShVLGgsbSxuLHgpLChhYXx8KGFhPTEsaWE9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ITEsYT1mdW5jdGlvbihlLHQpe3RoaXMuX3JlamVjdCh0KX0sbz1mdW5jdGlvbihlLHQpe3QucHJvbWlzZVJlamVjdGlvblF1ZXVlZD0hMCx0LmJpbmRpbmdQcm9taXNlLl90aGVuKGEsYSxudWxsLHRoaXMsZSl9LGM9ZnVuY3Rpb24oZSx0KXswPT0oNTAzOTcxODQmdGhpcy5fYml0RmllbGQpJiZ0aGlzLl9yZXNvbHZlQ2FsbGJhY2sodC50YXJnZXQpfSxzPWZ1bmN0aW9uKGUsdCl7dC5wcm9taXNlUmVqZWN0aW9uUXVldWVkfHx0aGlzLl9yZWplY3QoZSl9O2UucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24oYSl7aXx8KGk9ITAsZS5wcm90b3R5cGUuX3Byb3BhZ2F0ZUZyb209ci5wcm9wYWdhdGVGcm9tRnVuY3Rpb24oKSxlLnByb3RvdHlwZS5fYm91bmRWYWx1ZT1yLmJvdW5kVmFsdWVGdW5jdGlvbigpKTt2YXIgbD1uKGEpLHU9bmV3IGUodCk7dS5fcHJvcGFnYXRlRnJvbSh0aGlzLDEpO3ZhciBmPXRoaXMuX3RhcmdldCgpO2lmKHUuX3NldEJvdW5kVG8obCksbCBpbnN0YW5jZW9mIGUpe3ZhciBkPXtwcm9taXNlUmVqZWN0aW9uUXVldWVkOiExLHByb21pc2U6dSx0YXJnZXQ6ZixiaW5kaW5nUHJvbWlzZTpsfTtmLl90aGVuKHQsbyx2b2lkIDAsdSxkKSxsLl90aGVuKGMscyx2b2lkIDAsdSxkKSx1Ll9zZXRPbkNhbmNlbChsKX1lbHNlIHUuX3Jlc29sdmVDYWxsYmFjayhmKTtyZXR1cm4gdX0sZS5wcm90b3R5cGUuX3NldEJvdW5kVG89ZnVuY3Rpb24oZSl7dm9pZCAwIT09ZT8odGhpcy5fYml0RmllbGQ9MjA5NzE1Mnx0aGlzLl9iaXRGaWVsZCx0aGlzLl9ib3VuZFRvPWUpOnRoaXMuX2JpdEZpZWxkPS0yMDk3MTUzJnRoaXMuX2JpdEZpZWxkfSxlLnByb3RvdHlwZS5faXNCb3VuZD1mdW5jdGlvbigpe3JldHVybiAyMDk3MTUyPT0oMjA5NzE1MiZ0aGlzLl9iaXRGaWVsZCl9LGUuYmluZD1mdW5jdGlvbih0LG4pe3JldHVybiBlLnJlc29sdmUobikuYmluZCh0KX19KSxpYSkoVSxoLG0seCksKGNhfHwoY2E9MSxvYT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1SaSgpLGE9aS50cnlDYXRjaCxvPWkuZXJyb3JPYmosYz1lLl9hc3luYztlLnByb3RvdHlwZS5icmVhaz1lLnByb3RvdHlwZS5jYW5jZWw9ZnVuY3Rpb24oKXtpZighci5jYW5jZWxsYXRpb24oKSlyZXR1cm4gdGhpcy5fd2FybigiY2FuY2VsbGF0aW9uIGlzIGRpc2FibGVkIik7Zm9yKHZhciBlPXRoaXMsdD1lO2UuX2lzQ2FuY2VsbGFibGUoKTspe2lmKCFlLl9jYW5jZWxCeSh0KSl7dC5faXNGb2xsb3dpbmcoKT90Ll9mb2xsb3dlZSgpLmNhbmNlbCgpOnQuX2NhbmNlbEJyYW5jaGVkKCk7YnJlYWt9dmFyIG49ZS5fY2FuY2VsbGF0aW9uUGFyZW50O2lmKG51bGw9PW58fCFuLl9pc0NhbmNlbGxhYmxlKCkpe2UuX2lzRm9sbG93aW5nKCk/ZS5fZm9sbG93ZWUoKS5jYW5jZWwoKTplLl9jYW5jZWxCcmFuY2hlZCgpO2JyZWFrfWUuX2lzRm9sbG93aW5nKCkmJmUuX2ZvbGxvd2VlKCkuY2FuY2VsKCksZS5fc2V0V2lsbEJlQ2FuY2VsbGVkKCksdD1lLGU9bn19LGUucHJvdG90eXBlLl9icmFuY2hIYXNDYW5jZWxsZWQ9ZnVuY3Rpb24oKXt0aGlzLl9icmFuY2hlc1JlbWFpbmluZ1RvQ2FuY2VsLS19LGUucHJvdG90eXBlLl9lbm91Z2hCcmFuY2hlc0hhdmVDYW5jZWxsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5fYnJhbmNoZXNSZW1haW5pbmdUb0NhbmNlbHx8dGhpcy5fYnJhbmNoZXNSZW1haW5pbmdUb0NhbmNlbDw9MH0sZS5wcm90b3R5cGUuX2NhbmNlbEJ5PWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dGhpcz8odGhpcy5fYnJhbmNoZXNSZW1haW5pbmdUb0NhbmNlbD0wLHRoaXMuX2ludm9rZU9uQ2FuY2VsKCksITApOih0aGlzLl9icmFuY2hIYXNDYW5jZWxsZWQoKSwhIXRoaXMuX2Vub3VnaEJyYW5jaGVzSGF2ZUNhbmNlbGxlZCgpJiYodGhpcy5faW52b2tlT25DYW5jZWwoKSwhMCkpfSxlLnByb3RvdHlwZS5fY2FuY2VsQnJhbmNoZWQ9ZnVuY3Rpb24oKXt0aGlzLl9lbm91Z2hCcmFuY2hlc0hhdmVDYW5jZWxsZWQoKSYmdGhpcy5fY2FuY2VsKCl9LGUucHJvdG90eXBlLl9jYW5jZWw9ZnVuY3Rpb24oKXt0aGlzLl9pc0NhbmNlbGxhYmxlKCkmJih0aGlzLl9zZXRDYW5jZWxsZWQoKSxjLmludm9rZSh0aGlzLl9jYW5jZWxQcm9taXNlcyx0aGlzLHZvaWQgMCkpfSxlLnByb3RvdHlwZS5fY2FuY2VsUHJvbWlzZXM9ZnVuY3Rpb24oKXt0aGlzLl9sZW5ndGgoKT4wJiZ0aGlzLl9zZXR0bGVQcm9taXNlcygpfSxlLnByb3RvdHlwZS5fdW5zZXRPbkNhbmNlbD1mdW5jdGlvbigpe3RoaXMuX29uQ2FuY2VsRmllbGQ9dm9pZCAwfSxlLnByb3RvdHlwZS5faXNDYW5jZWxsYWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzUGVuZGluZygpJiYhdGhpcy5faXNDYW5jZWxsZWQoKX0sZS5wcm90b3R5cGUuaXNDYW5jZWxsYWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzUGVuZGluZygpJiYhdGhpcy5pc0NhbmNlbGxlZCgpfSxlLnByb3RvdHlwZS5fZG9JbnZva2VPbkNhbmNlbD1mdW5jdGlvbihlLHQpe2lmKGkuaXNBcnJheShlKSlmb3IodmFyIG49MDtuPGUubGVuZ3RoOysrbil0aGlzLl9kb0ludm9rZU9uQ2FuY2VsKGVbbl0sdCk7ZWxzZSBpZih2b2lkIDAhPT1lKWlmKCJmdW5jdGlvbiI9PXR5cGVvZiBlKXtpZighdCl7dmFyIHI9YShlKS5jYWxsKHRoaXMuX2JvdW5kVmFsdWUoKSk7cj09PW8mJih0aGlzLl9hdHRhY2hFeHRyYVRyYWNlKHIuZSksYy50aHJvd0xhdGVyKHIuZSkpfX1lbHNlIGUuX3Jlc3VsdENhbmNlbGxlZCh0aGlzKX0sZS5wcm90b3R5cGUuX2ludm9rZU9uQ2FuY2VsPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fb25DYW5jZWwoKTt0aGlzLl91bnNldE9uQ2FuY2VsKCksYy5pbnZva2UodGhpcy5fZG9JbnZva2VPbkNhbmNlbCx0aGlzLGUpfSxlLnByb3RvdHlwZS5faW52b2tlSW50ZXJuYWxPbkNhbmNlbD1mdW5jdGlvbigpe3RoaXMuX2lzQ2FuY2VsbGFibGUoKSYmKHRoaXMuX2RvSW52b2tlT25DYW5jZWwodGhpcy5fb25DYW5jZWwoKSwhMCksdGhpcy5fdW5zZXRPbkNhbmNlbCgpKX0sZS5wcm90b3R5cGUuX3Jlc3VsdENhbmNlbGxlZD1mdW5jdGlvbigpe3RoaXMuY2FuY2VsKCl9fSksb2EpKFUsYixuLHgpLChsYXx8KGxhPTEsc2E9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiB0aGlzLnZhbHVlfWZ1bmN0aW9uIG4oKXt0aHJvdyB0aGlzLnJlYXNvbn1lLnByb3RvdHlwZS5yZXR1cm49ZS5wcm90b3R5cGUudGhlblJldHVybj1mdW5jdGlvbihuKXtyZXR1cm4gbiBpbnN0YW5jZW9mIGUmJm4uc3VwcHJlc3NVbmhhbmRsZWRSZWplY3Rpb25zKCksdGhpcy5fdGhlbih0LHZvaWQgMCx2b2lkIDAse3ZhbHVlOm59LHZvaWQgMCl9LGUucHJvdG90eXBlLnRocm93PWUucHJvdG90eXBlLnRoZW5UaHJvdz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fdGhlbihuLHZvaWQgMCx2b2lkIDAse3JlYXNvbjplfSx2b2lkIDApfSxlLnByb3RvdHlwZS5jYXRjaFRocm93PWZ1bmN0aW9uKGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg8PTEpcmV0dXJuIHRoaXMuX3RoZW4odm9pZCAwLG4sdm9pZCAwLHtyZWFzb246ZX0sdm9pZCAwKTt2YXIgdD1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuY2F1Z2h0KGUsKGZ1bmN0aW9uKCl7dGhyb3cgdH0pKX0sZS5wcm90b3R5cGUuY2F0Y2hSZXR1cm49ZnVuY3Rpb24obil7aWYoYXJndW1lbnRzLmxlbmd0aDw9MSlyZXR1cm4gbiBpbnN0YW5jZW9mIGUmJm4uc3VwcHJlc3NVbmhhbmRsZWRSZWplY3Rpb25zKCksdGhpcy5fdGhlbih2b2lkIDAsdCx2b2lkIDAse3ZhbHVlOm59LHZvaWQgMCk7dmFyIHI9YXJndW1lbnRzWzFdO3JldHVybiByIGluc3RhbmNlb2YgZSYmci5zdXBwcmVzc1VuaGFuZGxlZFJlamVjdGlvbnMoKSx0aGlzLmNhdWdodChuLChmdW5jdGlvbigpe3JldHVybiByfSkpfX0pLHNhKShVKSxRYSgpKFUpLChoYXx8KGhhPTEsZGE9ZnVuY3Rpb24oZSx0LG4scixpLGEpe3ZhciBvLGM9UmkoKSxzPWMuY2FuRXZhbHVhdGUsbD1jLnRyeUNhdGNoLHU9Yy5lcnJvck9iajtpZihzKXtmb3IodmFyIGY9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBGdW5jdGlvbigidmFsdWUiLCJob2xkZXIiLCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAndXNlIHN0cmljdCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICBob2xkZXIucEluZGV4ID0gdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICBob2xkZXIuY2hlY2tGdWxmaWxsbWVudCh0aGlzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAiLnJlcGxhY2UoL0luZGV4L2csZSkpfSxkPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgRnVuY3Rpb24oInByb21pc2UiLCJob2xkZXIiLCIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgaG9sZGVyLnBJbmRleCA9IHByb21pc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgIi5yZXBsYWNlKC9JbmRleC9nLGUpKX0saD1mdW5jdGlvbih0KXtmb3IodmFyIG49bmV3IEFycmF5KHQpLHI9MDtyPG4ubGVuZ3RoOysrciluW3JdPSJ0aGlzLnAiKyhyKzEpO3ZhciBhPW4uam9pbigiID0gIikrIiA9IG51bGw7IixvPSJ2YXIgcHJvbWlzZTtcbiIrbi5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIHByb21pc2UgPSAiK2UrIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgaWYgKHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgIHByb21pc2UuY2FuY2VsKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAifSkpLmpvaW4oIlxuIiksYz1uLmpvaW4oIiwgIikscz0iSG9sZGVyJCIrdCxmPSJyZXR1cm4gZnVuY3Rpb24odHJ5Q2F0Y2gsIGVycm9yT2JqLCBQcm9taXNlLCBhc3luYykgeyAgICBcblx0ICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgZnVuY3Rpb24gW1RoZU5hbWVdKGZuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIFtUaGVQcm9wZXJ0aWVzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIHRoaXMuZm4gPSBmbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIHRoaXMuYXN5bmNOZWVkZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIHRoaXMubm93ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgW1RoZU5hbWVdLnByb3RvdHlwZS5fY2FsbEZ1bmN0aW9uID0gZnVuY3Rpb24ocHJvbWlzZSkgeyAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIHByb21pc2UuX3B1c2hDb250ZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIHZhciByZXQgPSB0cnlDYXRjaCh0aGlzLmZuKShbVGhlUGFzc2VkQXJndW1lbnRzXSk7ICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIHByb21pc2UuX3BvcENvbnRleHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIGlmIChyZXQgPT09IGVycm9yT2JqKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICBwcm9taXNlLl9yZWplY3RDYWxsYmFjayhyZXQuZSwgZmFsc2UpOyAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICBwcm9taXNlLl9yZXNvbHZlQ2FsbGJhY2socmV0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgW1RoZU5hbWVdLnByb3RvdHlwZS5jaGVja0Z1bGZpbGxtZW50ID0gZnVuY3Rpb24ocHJvbWlzZSkgeyAgICAgICBcblx0ICAgICAgICAgICAgICAgIHZhciBub3cgPSArK3RoaXMubm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIGlmIChub3cgPT09IFtUaGVUb3RhbF0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hc3luY05lZWRlZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuaW52b2tlKHRoaXMuX2NhbGxGdW5jdGlvbiwgdGhpcywgcHJvbWlzZSk7ICAgICBcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbEZ1bmN0aW9uKHByb21pc2UpOyAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgW1RoZU5hbWVdLnByb3RvdHlwZS5fcmVzdWx0Q2FuY2VsbGVkID0gZnVuY3Rpb24oKSB7ICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIFtDYW5jZWxsYXRpb25Db2RlXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgcmV0dXJuIFtUaGVOYW1lXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICB9KHRyeUNhdGNoLCBlcnJvck9iaiwgUHJvbWlzZSwgYXN5bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAiO3JldHVybiBmPWYucmVwbGFjZSgvXFtUaGVOYW1lXF0vZyxzKS5yZXBsYWNlKC9cW1RoZVRvdGFsXF0vZyx0KS5yZXBsYWNlKC9cW1RoZVBhc3NlZEFyZ3VtZW50c1xdL2csYykucmVwbGFjZSgvXFtUaGVQcm9wZXJ0aWVzXF0vZyxhKS5yZXBsYWNlKC9cW0NhbmNlbGxhdGlvbkNvZGVcXS9nLG8pLG5ldyBGdW5jdGlvbigidHJ5Q2F0Y2giLCJlcnJvck9iaiIsIlByb21pc2UiLCJhc3luYyIsZikobCx1LGUsaSl9LHA9W10sZz1bXSxtPVtdLGI9MDtiPDg7KytiKXAucHVzaChoKGIrMSkpLGcucHVzaChmKGIrMSkpLG0ucHVzaChkKGIrMSkpO289ZnVuY3Rpb24oZSl7dGhpcy5fcmVqZWN0KGUpfX1lLmpvaW49ZnVuY3Rpb24oKXt2YXIgaSxsPWFyZ3VtZW50cy5sZW5ndGgtMTtpZihsPjAmJiJmdW5jdGlvbiI9PXR5cGVvZiBhcmd1bWVudHNbbF0mJihpPWFyZ3VtZW50c1tsXSxsPD04JiZzKSl7KFQ9bmV3IGUocikpLl9jYXB0dXJlU3RhY2tUcmFjZSgpO2Zvcih2YXIgdT1uZXcoMCxwW2wtMV0pKGkpLGY9ZyxkPTA7ZDxsOysrZCl7dmFyIGg9bihhcmd1bWVudHNbZF0sVCk7aWYoaCBpbnN0YW5jZW9mIGUpe3ZhciBiPShoPWguX3RhcmdldCgpKS5fYml0RmllbGQ7MD09KDUwMzk3MTg0JmIpPyhoLl90aGVuKGZbZF0sbyx2b2lkIDAsVCx1KSxtW2RdKGgsdSksdS5hc3luY05lZWRlZD0hMSk6MCE9KDMzNTU0NDMyJmIpP2ZbZF0uY2FsbChULGguX3ZhbHVlKCksdSk6MCE9KDE2Nzc3MjE2JmIpP1QuX3JlamVjdChoLl9yZWFzb24oKSk6VC5fY2FuY2VsKCl9ZWxzZSBmW2RdLmNhbGwoVCxoLHUpfWlmKCFULl9pc0ZhdGVTZWFsZWQoKSl7aWYodS5hc3luY05lZWRlZCl7dmFyIHk9YSgpO251bGwhPT15JiYodS5mbj1jLmRvbWFpbkJpbmQoeSx1LmZuKSl9VC5fc2V0QXN5bmNHdWFyYW50ZWVkKCksVC5fc2V0T25DYW5jZWwodSl9cmV0dXJuIFR9Zm9yKHZhciB2PWFyZ3VtZW50cy5sZW5ndGgseD1uZXcgQXJyYXkodiksRD0wO0Q8djsrK0QpeFtEXT1hcmd1bWVudHNbRF07aSYmeC5wb3AoKTt2YXIgVD1uZXcgdCh4KS5wcm9taXNlKCk7cmV0dXJuIHZvaWQgMCE9PWk/VC5zcHJlYWQoaSk6VH19KSxkYSkoVSxiLG0saCxsLGkpLFUuUHJvbWlzZT1VLFUudmVyc2lvbj0iMy40LjciLGVvKCkoVSxiLG4sbSxoLHgpLGZ1bmN0aW9uKCl7aWYoYmEpcmV0dXJuIG1hO2JhPTE7dmFyIGU9T2JqZWN0LmNyZWF0ZTtpZihlKXt2YXIgdD1lKG51bGwpLG49ZShudWxsKTt0WyIgc2l6ZSJdPW5bIiBzaXplIl09MH1yZXR1cm4gbWE9ZnVuY3Rpb24oZSl7dmFyIHIsaSxhPVJpKCksbz1hLmNhbkV2YWx1YXRlLGM9YS5pc0lkZW50aWZpZXIscz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IEZ1bmN0aW9uKCJlbnN1cmVNZXRob2QiLCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgJ3VzZSBzdHJpY3QnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgZW5zdXJlTWV0aG9kKG9iaiwgJ21ldGhvZE5hbWUnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgc3dpdGNoKGxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG9iai5tZXRob2ROYW1lKHRoaXNbMF0pOyAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG9iai5tZXRob2ROYW1lKHRoaXNbMF0sIHRoaXNbMV0pOyAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIG9iai5tZXRob2ROYW1lKHRoaXNbMF0sIHRoaXNbMV0sIHRoaXNbMl0pOyAgICBcblx0ICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG9iai5tZXRob2ROYW1lKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqLm1ldGhvZE5hbWUuYXBwbHkob2JqLCB0aGlzKTsgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAiLnJlcGxhY2UoL21ldGhvZE5hbWUvZyxlKSkoZil9LGw9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBGdW5jdGlvbigib2JqIiwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgJ3VzZSBzdHJpY3QnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgcmV0dXJuIG9iai5wcm9wZXJ0eU5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgIi5yZXBsYWNlKCJwcm9wZXJ0eU5hbWUiLGUpKX0sdT1mdW5jdGlvbihlLHQsbil7dmFyIHI9bltlXTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcil7aWYoIWMoZSkpcmV0dXJuIG51bGw7aWYocj10KGUpLG5bZV09cixuWyIgc2l6ZSJdKyssblsiIHNpemUiXT41MTIpe2Zvcih2YXIgaT1PYmplY3Qua2V5cyhuKSxhPTA7YTwyNTY7KythKWRlbGV0ZSBuW2lbYV1dO25bIiBzaXplIl09aS5sZW5ndGgtMjU2fX1yZXR1cm4gcn07ZnVuY3Rpb24gZih0LG4pe3ZhciByO2lmKG51bGwhPXQmJihyPXRbbl0pLCJmdW5jdGlvbiIhPXR5cGVvZiByKXt2YXIgaT0iT2JqZWN0ICIrYS5jbGFzc1N0cmluZyh0KSsiIGhhcyBubyBtZXRob2QgJyIrYS50b1N0cmluZyhuKSsiJyI7dGhyb3cgbmV3IGUuVHlwZUVycm9yKGkpfXJldHVybiByfWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGYoZSx0aGlzLnBvcCgpKS5hcHBseShlLHRoaXMpfWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGVbdGhpc119ZnVuY3Rpb24gcChlKXt2YXIgdD0rdGhpcztyZXR1cm4gdDwwJiYodD1NYXRoLm1heCgwLHQrZS5sZW5ndGgpKSxlW3RdfXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHUoZSxzLHQpfSxpPWZ1bmN0aW9uKGUpe3JldHVybiB1KGUsbCxuKX0sZS5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShNYXRoLm1heCh0LTEsMCkpLGk9MTtpPHQ7KytpKW5baS0xXT1hcmd1bWVudHNbaV07aWYobyl7dmFyIGE9cihlKTtpZihudWxsIT09YSlyZXR1cm4gdGhpcy5fdGhlbihhLHZvaWQgMCx2b2lkIDAsbix2b2lkIDApfXJldHVybiBuLnB1c2goZSksdGhpcy5fdGhlbihkLHZvaWQgMCx2b2lkIDAsbix2b2lkIDApfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIm51bWJlciI9PXR5cGVvZiBlKXQ9cDtlbHNlIGlmKG8pe3ZhciBuPWkoZSk7dD1udWxsIT09bj9uOmh9ZWxzZSB0PWg7cmV0dXJuIHRoaXMuX3RoZW4odCx2b2lkIDAsdm9pZCAwLGUsdm9pZCAwKX19LG1hfSgpKFUpLHRvKCkoVSxuLG0sdixoLHgpLG5vKCkoVSxoLHgpLHJvKCkoVSxuLGgsbSxyLHgpLChFYXx8KEVhPTEsX2E9ZnVuY3Rpb24oZSl7dmFyIHQ9UmkoKSxuPWUuX2FzeW5jLHI9dC50cnlDYXRjaCxpPXQuZXJyb3JPYmo7ZnVuY3Rpb24gYShlLGEpe2lmKCF0LmlzQXJyYXkoZSkpcmV0dXJuIG8uY2FsbCh0aGlzLGUsYSk7dmFyIGM9cihhKS5hcHBseSh0aGlzLl9ib3VuZFZhbHVlKCksW251bGxdLmNvbmNhdChlKSk7Yz09PWkmJm4udGhyb3dMYXRlcihjLmUpfWZ1bmN0aW9uIG8oZSx0KXt2YXIgYT10aGlzLl9ib3VuZFZhbHVlKCksbz12b2lkIDA9PT1lP3IodCkuY2FsbChhLG51bGwpOnIodCkuY2FsbChhLG51bGwsZSk7bz09PWkmJm4udGhyb3dMYXRlcihvLmUpfWZ1bmN0aW9uIGMoZSx0KXtpZighZSl7dmFyIGE9bmV3IEVycm9yKGUrIiIpO2EuY2F1c2U9ZSxlPWF9dmFyIG89cih0KS5jYWxsKHRoaXMuX2JvdW5kVmFsdWUoKSxlKTtvPT09aSYmbi50aHJvd0xhdGVyKG8uZSl9ZS5wcm90b3R5cGUuYXNDYWxsYmFjaz1lLnByb3RvdHlwZS5ub2RlaWZ5PWZ1bmN0aW9uKGUsdCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpe3ZhciBuPW87dm9pZCAwIT09dCYmT2JqZWN0KHQpLnNwcmVhZCYmKG49YSksdGhpcy5fdGhlbihuLGMsdm9pZCAwLHRoaXMsZSl9cmV0dXJuIHRoaXN9fSksX2EpKFUpLGlvKCkoVSxoKSxhbygpKFUsYixtLG4pLG9vKCkoVSxoLG0sbiksKElhfHwoSWE9MSxPYT1mdW5jdGlvbihlLHQsbixyLGksYSl7dmFyIG89ZS5fZ2V0RG9tYWluLGM9UmkoKSxzPWMudHJ5Q2F0Y2g7ZnVuY3Rpb24gbCh0LG4scixhKXt0aGlzLmNvbnN0cnVjdG9yJCh0KTt2YXIgcz1vKCk7dGhpcy5fZm49bnVsbD09PXM/bjpjLmRvbWFpbkJpbmQocyxuKSx2b2lkIDAhPT1yJiYocj1lLnJlc29sdmUocikpLl9hdHRhY2hDYW5jZWxsYXRpb25DYWxsYmFjayh0aGlzKSx0aGlzLl9pbml0aWFsVmFsdWU9cix0aGlzLl9jdXJyZW50Q2FuY2VsbGFibGU9bnVsbCx0aGlzLl9lYWNoVmFsdWVzPWE9PT1pP0FycmF5KHRoaXMuX2xlbmd0aCk6MD09PWE/bnVsbDp2b2lkIDAsdGhpcy5fcHJvbWlzZS5fY2FwdHVyZVN0YWNrVHJhY2UoKSx0aGlzLl9pbml0JCh2b2lkIDAsLTUpfWZ1bmN0aW9uIHUoZSx0KXt0aGlzLmlzRnVsZmlsbGVkKCk/dC5fcmVzb2x2ZShlKTp0Ll9yZWplY3QoZSl9ZnVuY3Rpb24gZihlLHQscixpKXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdD9uKCJleHBlY3RpbmcgYSBmdW5jdGlvbiBidXQgZ290ICIrYy5jbGFzc1N0cmluZyh0KSk6bmV3IGwoZSx0LHIsaSkucHJvbWlzZSgpfWZ1bmN0aW9uIGQodCl7dGhpcy5hY2N1bT10LHRoaXMuYXJyYXkuX2dvdEFjY3VtKHQpO3ZhciBuPXIodGhpcy52YWx1ZSx0aGlzLmFycmF5Ll9wcm9taXNlKTtyZXR1cm4gbiBpbnN0YW5jZW9mIGU/KHRoaXMuYXJyYXkuX2N1cnJlbnRDYW5jZWxsYWJsZT1uLG4uX3RoZW4oaCx2b2lkIDAsdm9pZCAwLHRoaXMsdm9pZCAwKSk6aC5jYWxsKHRoaXMsbil9ZnVuY3Rpb24gaCh0KXt2YXIgbixyPXRoaXMuYXJyYXksaT1yLl9wcm9taXNlLG89cyhyLl9mbik7aS5fcHVzaENvbnRleHQoKSwobj12b2lkIDAhPT1yLl9lYWNoVmFsdWVzP28uY2FsbChpLl9ib3VuZFZhbHVlKCksdCx0aGlzLmluZGV4LHRoaXMubGVuZ3RoKTpvLmNhbGwoaS5fYm91bmRWYWx1ZSgpLHRoaXMuYWNjdW0sdCx0aGlzLmluZGV4LHRoaXMubGVuZ3RoKSlpbnN0YW5jZW9mIGUmJihyLl9jdXJyZW50Q2FuY2VsbGFibGU9bik7dmFyIGM9aS5fcG9wQ29udGV4dCgpO3JldHVybiBhLmNoZWNrRm9yZ290dGVuUmV0dXJucyhuLGMsdm9pZCAwIT09ci5fZWFjaFZhbHVlcz8iUHJvbWlzZS5lYWNoIjoiUHJvbWlzZS5yZWR1Y2UiLGkpLG59Yy5pbmhlcml0cyhsLHQpLGwucHJvdG90eXBlLl9nb3RBY2N1bT1mdW5jdGlvbihlKXt2b2lkIDAhPT10aGlzLl9lYWNoVmFsdWVzJiZudWxsIT09dGhpcy5fZWFjaFZhbHVlcyYmZSE9PWkmJnRoaXMuX2VhY2hWYWx1ZXMucHVzaChlKX0sbC5wcm90b3R5cGUuX2VhY2hDb21wbGV0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2VhY2hWYWx1ZXMmJnRoaXMuX2VhY2hWYWx1ZXMucHVzaChlKSx0aGlzLl9lYWNoVmFsdWVzfSxsLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbigpe30sbC5wcm90b3R5cGUuX3Jlc29sdmVFbXB0eUFycmF5PWZ1bmN0aW9uKCl7dGhpcy5fcmVzb2x2ZSh2b2lkIDAhPT10aGlzLl9lYWNoVmFsdWVzP3RoaXMuX2VhY2hWYWx1ZXM6dGhpcy5faW5pdGlhbFZhbHVlKX0sbC5wcm90b3R5cGUuc2hvdWxkQ29weVZhbHVlcz1mdW5jdGlvbigpe3JldHVybiExfSxsLnByb3RvdHlwZS5fcmVzb2x2ZT1mdW5jdGlvbihlKXt0aGlzLl9wcm9taXNlLl9yZXNvbHZlQ2FsbGJhY2soZSksdGhpcy5fdmFsdWVzPW51bGx9LGwucHJvdG90eXBlLl9yZXN1bHRDYW5jZWxsZWQ9ZnVuY3Rpb24odCl7aWYodD09PXRoaXMuX2luaXRpYWxWYWx1ZSlyZXR1cm4gdGhpcy5fY2FuY2VsKCk7dGhpcy5faXNSZXNvbHZlZCgpfHwodGhpcy5fcmVzdWx0Q2FuY2VsbGVkJCgpLHRoaXMuX2N1cnJlbnRDYW5jZWxsYWJsZSBpbnN0YW5jZW9mIGUmJnRoaXMuX2N1cnJlbnRDYW5jZWxsYWJsZS5jYW5jZWwoKSx0aGlzLl9pbml0aWFsVmFsdWUgaW5zdGFuY2VvZiBlJiZ0aGlzLl9pbml0aWFsVmFsdWUuY2FuY2VsKCkpfSxsLnByb3RvdHlwZS5faXRlcmF0ZT1mdW5jdGlvbih0KXt2YXIgbixyO3RoaXMuX3ZhbHVlcz10O3ZhciBpPXQubGVuZ3RoO2lmKHZvaWQgMCE9PXRoaXMuX2luaXRpYWxWYWx1ZT8obj10aGlzLl9pbml0aWFsVmFsdWUscj0wKToobj1lLnJlc29sdmUodFswXSkscj0xKSx0aGlzLl9jdXJyZW50Q2FuY2VsbGFibGU9biwhbi5pc1JlamVjdGVkKCkpZm9yKDtyPGk7KytyKXt2YXIgYT17YWNjdW06bnVsbCx2YWx1ZTp0W3JdLGluZGV4OnIsbGVuZ3RoOmksYXJyYXk6dGhpc307bj1uLl90aGVuKGQsdm9pZCAwLHZvaWQgMCxhLHZvaWQgMCl9dm9pZCAwIT09dGhpcy5fZWFjaFZhbHVlcyYmKG49bi5fdGhlbih0aGlzLl9lYWNoQ29tcGxldGUsdm9pZCAwLHZvaWQgMCx0aGlzLHZvaWQgMCkpLG4uX3RoZW4odSx1LHZvaWQgMCxuLHRoaXMpfSxlLnByb3RvdHlwZS5yZWR1Y2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZih0aGlzLGUsdCxudWxsKX0sZS5yZWR1Y2U9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGYoZSx0LG4scil9fSksT2EpKFUsYixuLG0saCx4KSwoTmF8fChOYT0xLFJhPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLlByb21pc2VJbnNwZWN0aW9uO2Z1bmN0aW9uIGkoZSl7dGhpcy5jb25zdHJ1Y3RvciQoZSl9UmkoKS5pbmhlcml0cyhpLHQpLGkucHJvdG90eXBlLl9wcm9taXNlUmVzb2x2ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fdmFsdWVzW2VdPXQsKyt0aGlzLl90b3RhbFJlc29sdmVkPj10aGlzLl9sZW5ndGgmJih0aGlzLl9yZXNvbHZlKHRoaXMuX3ZhbHVlcyksITApfSxpLnByb3RvdHlwZS5fcHJvbWlzZUZ1bGZpbGxlZD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyByO3JldHVybiBuLl9iaXRGaWVsZD0zMzU1NDQzMixuLl9zZXR0bGVkVmFsdWVGaWVsZD1lLHRoaXMuX3Byb21pc2VSZXNvbHZlZCh0LG4pfSxpLnByb3RvdHlwZS5fcHJvbWlzZVJlamVjdGVkPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IHI7cmV0dXJuIG4uX2JpdEZpZWxkPTE2Nzc3MjE2LG4uX3NldHRsZWRWYWx1ZUZpZWxkPWUsdGhpcy5fcHJvbWlzZVJlc29sdmVkKHQsbil9LGUuc2V0dGxlPWZ1bmN0aW9uKGUpe3JldHVybiBuLmRlcHJlY2F0ZWQoIi5zZXR0bGUoKSIsIi5yZWZsZWN0KCkiKSxuZXcgaShlKS5wcm9taXNlKCl9LGUucHJvdG90eXBlLnNldHRsZT1mdW5jdGlvbigpe3JldHVybiBlLnNldHRsZSh0aGlzKX19KSxSYSkoVSxiLHgpLChCYXx8KEJhPTEsUGE9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVJpKCksaT1ZYSgpLlJhbmdlRXJyb3IsYT1ZYSgpLkFnZ3JlZ2F0ZUVycm9yLG89ci5pc0FycmF5LGM9e307ZnVuY3Rpb24gcyhlKXt0aGlzLmNvbnN0cnVjdG9yJChlKSx0aGlzLl9ob3dNYW55PTAsdGhpcy5fdW53cmFwPSExLHRoaXMuX2luaXRpYWxpemVkPSExfWZ1bmN0aW9uIGwoZSx0KXtpZigoMHx0KSE9PXR8fHQ8MClyZXR1cm4gbigiZXhwZWN0aW5nIGEgcG9zaXRpdmUgaW50ZWdlclxuXG4gICAgU2VlIGh0dHA6Ly9nb28uZ2wvTXFyRm1YXG4iKTt2YXIgcj1uZXcgcyhlKSxpPXIucHJvbWlzZSgpO3JldHVybiByLnNldEhvd01hbnkodCksci5pbml0KCksaX1yLmluaGVyaXRzKHMsdCkscy5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9pbml0aWFsaXplZClpZigwIT09dGhpcy5faG93TWFueSl7dGhpcy5faW5pdCQodm9pZCAwLC01KTt2YXIgZT1vKHRoaXMuX3ZhbHVlcyk7IXRoaXMuX2lzUmVzb2x2ZWQoKSYmZSYmdGhpcy5faG93TWFueT50aGlzLl9jYW5Qb3NzaWJseUZ1bGZpbGwoKSYmdGhpcy5fcmVqZWN0KHRoaXMuX2dldFJhbmdlRXJyb3IodGhpcy5sZW5ndGgoKSkpfWVsc2UgdGhpcy5fcmVzb2x2ZShbXSl9LHMucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLl9pbml0aWFsaXplZD0hMCx0aGlzLl9pbml0KCl9LHMucHJvdG90eXBlLnNldFVud3JhcD1mdW5jdGlvbigpe3RoaXMuX3Vud3JhcD0hMH0scy5wcm90b3R5cGUuaG93TWFueT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ob3dNYW55fSxzLnByb3RvdHlwZS5zZXRIb3dNYW55PWZ1bmN0aW9uKGUpe3RoaXMuX2hvd01hbnk9ZX0scy5wcm90b3R5cGUuX3Byb21pc2VGdWxmaWxsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2FkZEZ1bGZpbGxlZChlKSx0aGlzLl9mdWxmaWxsZWQoKT09PXRoaXMuaG93TWFueSgpJiYodGhpcy5fdmFsdWVzLmxlbmd0aD10aGlzLmhvd01hbnkoKSwxPT09dGhpcy5ob3dNYW55KCkmJnRoaXMuX3Vud3JhcD90aGlzLl9yZXNvbHZlKHRoaXMuX3ZhbHVlc1swXSk6dGhpcy5fcmVzb2x2ZSh0aGlzLl92YWx1ZXMpLCEwKX0scy5wcm90b3R5cGUuX3Byb21pc2VSZWplY3RlZD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fYWRkUmVqZWN0ZWQoZSksdGhpcy5fY2hlY2tPdXRjb21lKCl9LHMucHJvdG90eXBlLl9wcm9taXNlQ2FuY2VsbGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZhbHVlcyBpbnN0YW5jZW9mIGV8fG51bGw9PXRoaXMuX3ZhbHVlcz90aGlzLl9jYW5jZWwoKToodGhpcy5fYWRkUmVqZWN0ZWQoYyksdGhpcy5fY2hlY2tPdXRjb21lKCkpfSxzLnByb3RvdHlwZS5fY2hlY2tPdXRjb21lPWZ1bmN0aW9uKCl7aWYodGhpcy5ob3dNYW55KCk+dGhpcy5fY2FuUG9zc2libHlGdWxmaWxsKCkpe2Zvcih2YXIgZT1uZXcgYSx0PXRoaXMubGVuZ3RoKCk7dDx0aGlzLl92YWx1ZXMubGVuZ3RoOysrdCl0aGlzLl92YWx1ZXNbdF0hPT1jJiZlLnB1c2godGhpcy5fdmFsdWVzW3RdKTtyZXR1cm4gZS5sZW5ndGg+MD90aGlzLl9yZWplY3QoZSk6dGhpcy5fY2FuY2VsKCksITB9cmV0dXJuITF9LHMucHJvdG90eXBlLl9mdWxmaWxsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG90YWxSZXNvbHZlZH0scy5wcm90b3R5cGUuX3JlamVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZhbHVlcy5sZW5ndGgtdGhpcy5sZW5ndGgoKX0scy5wcm90b3R5cGUuX2FkZFJlamVjdGVkPWZ1bmN0aW9uKGUpe3RoaXMuX3ZhbHVlcy5wdXNoKGUpfSxzLnByb3RvdHlwZS5fYWRkRnVsZmlsbGVkPWZ1bmN0aW9uKGUpe3RoaXMuX3ZhbHVlc1t0aGlzLl90b3RhbFJlc29sdmVkKytdPWV9LHMucHJvdG90eXBlLl9jYW5Qb3NzaWJseUZ1bGZpbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGgoKS10aGlzLl9yZWplY3RlZCgpfSxzLnByb3RvdHlwZS5fZ2V0UmFuZ2VFcnJvcj1mdW5jdGlvbihlKXt2YXIgdD0iSW5wdXQgYXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0ICIrdGhpcy5faG93TWFueSsiIGl0ZW1zIGJ1dCBjb250YWlucyBvbmx5ICIrZSsiIGl0ZW1zIjtyZXR1cm4gbmV3IGkodCl9LHMucHJvdG90eXBlLl9yZXNvbHZlRW1wdHlBcnJheT1mdW5jdGlvbigpe3RoaXMuX3JlamVjdCh0aGlzLl9nZXRSYW5nZUVycm9yKDApKX0sZS5zb21lPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGwoZSx0KX0sZS5wcm90b3R5cGUuc29tZT1mdW5jdGlvbihlKXtyZXR1cm4gbCh0aGlzLGUpfSxlLl9Tb21lUHJvbWlzZUFycmF5PXN9KSxQYSkoVSxiLG4pLChMYXx8KExhPTEsV2E9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm1hcDtlLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gbih0aGlzLGUscix0KX0sZS5maWx0ZXI9ZnVuY3Rpb24oZSxyLGkpe3JldHVybiBuKGUscixpLHQpfX0pLFdhKShVLGgpLChqYXx8KGphPTEsTWE9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnJlZHVjZSxyPWUuYWxsO2Z1bmN0aW9uIGkoKXtyZXR1cm4gcih0aGlzKX1lLnByb3RvdHlwZS5lYWNoPWZ1bmN0aW9uKGUpe3JldHVybiBuKHRoaXMsZSx0LDApLl90aGVuKGksdm9pZCAwLHZvaWQgMCx0aGlzLHZvaWQgMCl9LGUucHJvdG90eXBlLm1hcFNlcmllcz1mdW5jdGlvbihlKXtyZXR1cm4gbih0aGlzLGUsdCx0KX0sZS5lYWNoPWZ1bmN0aW9uKGUscil7cmV0dXJuIG4oZSxyLHQsMCkuX3RoZW4oaSx2b2lkIDAsdm9pZCAwLGUsdm9pZCAwKX0sZS5tYXBTZXJpZXM9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gbihlLHIsdCx0KX19KSxNYSkoVSxoKSwoSGF8fChIYT0xLHphPWZ1bmN0aW9uKGUpe3ZhciB0PWUuX1NvbWVQcm9taXNlQXJyYXk7ZnVuY3Rpb24gbihlKXt2YXIgbj1uZXcgdChlKSxyPW4ucHJvbWlzZSgpO3JldHVybiBuLnNldEhvd01hbnkoMSksbi5zZXRVbndyYXAoKSxuLmluaXQoKSxyfWUuYW55PWZ1bmN0aW9uKGUpe3JldHVybiBuKGUpfSxlLnByb3RvdHlwZS5hbnk9ZnVuY3Rpb24oKXtyZXR1cm4gbih0aGlzKX19KSx6YSkoVSksby50b0Zhc3RQcm9wZXJ0aWVzKFUpLG8udG9GYXN0UHJvcGVydGllcyhVLnByb3RvdHlwZSksUyh7YToxfSksUyh7YjoyfSksUyh7YzozfSksUygxKSxTKChmdW5jdGlvbigpe30pKSxTKHZvaWQgMCksUyghMSksUyhuZXcgVShoKSkseC5zZXRCb3VuZHMocy5maXJzdExpbmVFcnJvcixvLmxhc3RMaW5lRXJyb3IpLFV9O3ZhciBjbz1Mcixzbz1DaSgpO25pLmRlZmVyPWZ1bmN0aW9uKCl7dmFyIGUsdCxuPW5ldyBzby5Qcm9taXNlKChmdW5jdGlvbihuLHIpe2U9bix0PXJ9KSk7cmV0dXJue3Jlc29sdmU6ZSxyZWplY3Q6dCxwcm9taXNlOm59fSxuaS53aGVuPXNvLnJlc29sdmUsbmkucmVzb2x2ZT1zby5yZXNvbHZlLG5pLmFsbD1zby5hbGwsbmkucHJvcHM9c28ucHJvcHMsbmkucmVqZWN0PXNvLnJlamVjdCxuaS5wcm9taXNpZnk9c28ucHJvbWlzaWZ5LG5pLm1hcFNlcmllcz1zby5tYXBTZXJpZXMsbmkuYXR0ZW1wdD1zby5hdHRlbXB0LG5pLm5mY2FsbD1mdW5jdGlvbihlKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIHNvLnByb21pc2lmeShlKS5hcHBseShudWxsLHQpfSxzby5wcm90b3R5cGUuZmFpbD1zby5wcm90b3R5cGUuY2F1Z2h0LHNvLnByb3RvdHlwZS5hbHNvPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRoZW4oKGZ1bmN0aW9uKHQpe3ZhciBuPWNvLmV4dGVuZCh7fSx0LGUodCkpO3JldHVybiBzby5wcm9wcyhuKX0pKX07dmFyIGxvPXt9LHVvPUxyLGZvPWxvLnR5cGVzPXtkb2N1bWVudDoiZG9jdW1lbnQiLHBhcmFncmFwaDoicGFyYWdyYXBoIixydW46InJ1biIsdGV4dDoidGV4dCIsdGFiOiJ0YWIiLGh5cGVybGluazoiaHlwZXJsaW5rIixub3RlUmVmZXJlbmNlOiJub3RlUmVmZXJlbmNlIixpbWFnZToiaW1hZ2UiLG5vdGU6Im5vdGUiLGNvbW1lbnRSZWZlcmVuY2U6ImNvbW1lbnRSZWZlcmVuY2UiLGNvbW1lbnQ6ImNvbW1lbnQiLHRhYmxlOiJ0YWJsZSIsdGFibGVSb3c6InRhYmxlUm93Iix0YWJsZUNlbGw6InRhYmxlQ2VsbCIsYnJlYWs6ImJyZWFrIixib29rbWFya1N0YXJ0OiJib29rbWFya1N0YXJ0In07dmFyIGhvPXtiYXNlbGluZToiYmFzZWxpbmUiLHN1cGVyc2NyaXB0OiJzdXBlcnNjcmlwdCIsc3Vic2NyaXB0OiJzdWJzY3JpcHQifTtmdW5jdGlvbiBwbyhlKXt0aGlzLl9ub3Rlcz11by5pbmRleEJ5KGUsKGZ1bmN0aW9uKGUpe3JldHVybiBnbyhlLm5vdGVUeXBlLGUubm90ZUlkKX0pKX1mdW5jdGlvbiBnbyhlLHQpe3JldHVybiBlKyItIit0fWZ1bmN0aW9uIG1vKGUpe3JldHVybnt0eXBlOmZvLmJyZWFrLGJyZWFrVHlwZTplfX1wby5wcm90b3R5cGUucmVzb2x2ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5maW5kTm90ZUJ5S2V5KGdvKGUubm90ZVR5cGUsZS5ub3RlSWQpKX0scG8ucHJvdG90eXBlLmZpbmROb3RlQnlLZXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX25vdGVzW2VdfHxudWxsfSxsby5kb2N1bWVudD1sby5Eb2N1bWVudD1mdW5jdGlvbihlLHQpe3JldHVybnt0eXBlOmZvLmRvY3VtZW50LGNoaWxkcmVuOmUsbm90ZXM6KHQ9dHx8e30pLm5vdGVzfHxuZXcgcG8oe30pLGNvbW1lbnRzOnQuY29tbWVudHN8fFtdfX0sbG8ucGFyYWdyYXBoPWxvLlBhcmFncmFwaD1mdW5jdGlvbihlLHQpe3ZhciBuPSh0PXR8fHt9KS5pbmRlbnR8fHt9O3JldHVybnt0eXBlOmZvLnBhcmFncmFwaCxjaGlsZHJlbjplLHN0eWxlSWQ6dC5zdHlsZUlkfHxudWxsLHN0eWxlTmFtZTp0LnN0eWxlTmFtZXx8bnVsbCxudW1iZXJpbmc6dC5udW1iZXJpbmd8fG51bGwsYWxpZ25tZW50OnQuYWxpZ25tZW50fHxudWxsLGluZGVudDp7c3RhcnQ6bi5zdGFydHx8bnVsbCxlbmQ6bi5lbmR8fG51bGwsZmlyc3RMaW5lOm4uZmlyc3RMaW5lfHxudWxsLGhhbmdpbmc6bi5oYW5naW5nfHxudWxsfX19LGxvLnJ1bj1sby5SdW49ZnVuY3Rpb24oZSx0KXtyZXR1cm57dHlwZTpmby5ydW4sY2hpbGRyZW46ZSxzdHlsZUlkOih0PXR8fHt9KS5zdHlsZUlkfHxudWxsLHN0eWxlTmFtZTp0LnN0eWxlTmFtZXx8bnVsbCxpc0JvbGQ6ISF0LmlzQm9sZCxpc1VuZGVybGluZTohIXQuaXNVbmRlcmxpbmUsaXNJdGFsaWM6ISF0LmlzSXRhbGljLGlzU3RyaWtldGhyb3VnaDohIXQuaXNTdHJpa2V0aHJvdWdoLGlzQWxsQ2FwczohIXQuaXNBbGxDYXBzLGlzU21hbGxDYXBzOiEhdC5pc1NtYWxsQ2Fwcyx2ZXJ0aWNhbEFsaWdubWVudDp0LnZlcnRpY2FsQWxpZ25tZW50fHxoby5iYXNlbGluZSxmb250OnQuZm9udHx8bnVsbCxmb250U2l6ZTp0LmZvbnRTaXplfHxudWxsfX0sbG8udGV4dD1sby5UZXh0PWZ1bmN0aW9uKGUpe3JldHVybnt0eXBlOmZvLnRleHQsdmFsdWU6ZX19LGxvLnRhYj1sby5UYWI9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTpmby50YWJ9fSxsby5IeXBlcmxpbms9ZnVuY3Rpb24oZSx0KXtyZXR1cm57dHlwZTpmby5oeXBlcmxpbmssY2hpbGRyZW46ZSxocmVmOnQuaHJlZixhbmNob3I6dC5hbmNob3IsdGFyZ2V0RnJhbWU6dC50YXJnZXRGcmFtZX19LGxvLm5vdGVSZWZlcmVuY2U9bG8uTm90ZVJlZmVyZW5jZT1mdW5jdGlvbihlKXtyZXR1cm57dHlwZTpmby5ub3RlUmVmZXJlbmNlLG5vdGVUeXBlOmUubm90ZVR5cGUsbm90ZUlkOmUubm90ZUlkfX0sbG8uTm90ZXM9cG8sbG8uTm90ZT1mdW5jdGlvbihlKXtyZXR1cm57dHlwZTpmby5ub3RlLG5vdGVUeXBlOmUubm90ZVR5cGUsbm90ZUlkOmUubm90ZUlkLGJvZHk6ZS5ib2R5fX0sbG8uY29tbWVudFJlZmVyZW5jZT1mdW5jdGlvbihlKXtyZXR1cm57dHlwZTpmby5jb21tZW50UmVmZXJlbmNlLGNvbW1lbnRJZDplLmNvbW1lbnRJZH19LGxvLmNvbW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJue3R5cGU6Zm8uY29tbWVudCxjb21tZW50SWQ6ZS5jb21tZW50SWQsYm9keTplLmJvZHksYXV0aG9yTmFtZTplLmF1dGhvck5hbWUsYXV0aG9ySW5pdGlhbHM6ZS5hdXRob3JJbml0aWFsc319LGxvLkltYWdlPWZ1bmN0aW9uKGUpe3JldHVybnt0eXBlOmZvLmltYWdlLHJlYWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ/ZS5yZWFkSW1hZ2UodCk6ZS5yZWFkSW1hZ2UoKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gcC5mcm9tKGUpfSkpfSxyZWFkQXNBcnJheUJ1ZmZlcjpmdW5jdGlvbigpe3JldHVybiBlLnJlYWRJbWFnZSgpfSxyZWFkQXNCYXNlNjRTdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkSW1hZ2UoImJhc2U2NCIpfSxyZWFkQXNCdWZmZXI6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkSW1hZ2UoKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gcC5mcm9tKGUpfSkpfSxhbHRUZXh0OmUuYWx0VGV4dCxjb250ZW50VHlwZTplLmNvbnRlbnRUeXBlfX0sbG8uVGFibGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm57dHlwZTpmby50YWJsZSxjaGlsZHJlbjplLHN0eWxlSWQ6KHQ9dHx8e30pLnN0eWxlSWR8fG51bGwsc3R5bGVOYW1lOnQuc3R5bGVOYW1lfHxudWxsfX0sbG8uVGFibGVSb3c9ZnVuY3Rpb24oZSx0KXtyZXR1cm57dHlwZTpmby50YWJsZVJvdyxjaGlsZHJlbjplLGlzSGVhZGVyOih0PXR8fHt9KS5pc0hlYWRlcnx8ITF9fSxsby5UYWJsZUNlbGw9ZnVuY3Rpb24oZSx0KXtyZXR1cm57dHlwZTpmby50YWJsZUNlbGwsY2hpbGRyZW46ZSxjb2xTcGFuOm51bGw9PSh0PXR8fHt9KS5jb2xTcGFuPzE6dC5jb2xTcGFuLHJvd1NwYW46bnVsbD09dC5yb3dTcGFuPzE6dC5yb3dTcGFufX0sbG8ubGluZUJyZWFrPW1vKCJsaW5lIiksbG8ucGFnZUJyZWFrPW1vKCJwYWdlIiksbG8uY29sdW1uQnJlYWs9bW8oImNvbHVtbiIpLGxvLkJvb2ttYXJrU3RhcnQ9ZnVuY3Rpb24oZSl7cmV0dXJue3R5cGU6Zm8uYm9va21hcmtTdGFydCxuYW1lOmUubmFtZX19LGxvLnZlcnRpY2FsQWxpZ25tZW50PWhvO3ZhciBibz17fSx5bz1McjtmdW5jdGlvbiB2byhlLHQpe3RoaXMudmFsdWU9ZSx0aGlzLm1lc3NhZ2VzPXR8fFtdfWZ1bmN0aW9uIHhvKGUpe3ZhciB0PVtdO3JldHVybiB5by5mbGF0dGVuKHlvLnBsdWNrKGUsIm1lc3NhZ2VzIiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpeyhmdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDAhPT15by5maW5kKGUsRG8uYmluZChudWxsLHQpKX0pKHQsZSl8fHQucHVzaChlKX0pKSx0fWZ1bmN0aW9uIERvKGUsdCl7cmV0dXJuIGUudHlwZT09PXQudHlwZSYmZS5tZXNzYWdlPT09dC5tZXNzYWdlfWJvLlJlc3VsdD12byxiby5zdWNjZXNzPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdm8oZSxbXSl9LGJvLndhcm5pbmc9ZnVuY3Rpb24oZSl7cmV0dXJue3R5cGU6Indhcm5pbmciLG1lc3NhZ2U6ZX19LGJvLmVycm9yPWZ1bmN0aW9uKGUpe3JldHVybnt0eXBlOiJlcnJvciIsbWVzc2FnZTplLm1lc3NhZ2UsZXJyb3I6ZX19LHZvLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB2byhlKHRoaXMudmFsdWUpLHRoaXMubWVzc2FnZXMpfSx2by5wcm90b3R5cGUuZmxhdE1hcD1mdW5jdGlvbihlKXt2YXIgdD1lKHRoaXMudmFsdWUpO3JldHVybiBuZXcgdm8odC52YWx1ZSx4byhbdGhpcyx0XSkpfSx2by5wcm90b3R5cGUuZmxhdE1hcFRoZW49ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZSh0aGlzLnZhbHVlKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gbmV3IHZvKGUudmFsdWUseG8oW3QsZV0pKX0pKX0sdm8uY29tYmluZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHZvKHlvLmZsYXR0ZW4oeW8ucGx1Y2soZSwidmFsdWUiKSkseG8oZSkpfTtmb3IodmFyIFRvPXt9LHdvPXtieXRlTGVuZ3RoOmZ1bmN0aW9uKGUpe3ZhciB0PVNvKGUpLG49dFswXSxyPXRbMV07cmV0dXJuIDMqKG4rcikvNC1yfSx0b0J5dGVBcnJheTpmdW5jdGlvbihlKXt2YXIgdCxuLHI9U28oZSksaT1yWzBdLGE9clsxXSxvPW5ldyBVbyhmdW5jdGlvbihlLHQsbil7cmV0dXJuIDMqKHQrbikvNC1ufSgwLGksYSkpLGM9MCxzPWE+MD9pLTQ6aTtmb3Iobj0wO248cztuKz00KXQ9RW9bZS5jaGFyQ29kZUF0KG4pXTw8MTh8RW9bZS5jaGFyQ29kZUF0KG4rMSldPDwxMnxFb1tlLmNoYXJDb2RlQXQobisyKV08PDZ8RW9bZS5jaGFyQ29kZUF0KG4rMyldLG9bYysrXT10Pj4xNiYyNTUsb1tjKytdPXQ+PjgmMjU1LG9bYysrXT0yNTUmdDsyPT09YSYmKHQ9RW9bZS5jaGFyQ29kZUF0KG4pXTw8MnxFb1tlLmNoYXJDb2RlQXQobisxKV0+PjQsb1tjKytdPTI1NSZ0KTsxPT09YSYmKHQ9RW9bZS5jaGFyQ29kZUF0KG4pXTw8MTB8RW9bZS5jaGFyQ29kZUF0KG4rMSldPDw0fEVvW2UuY2hhckNvZGVBdChuKzIpXT4+MixvW2MrK109dD4+OCYyNTUsb1tjKytdPTI1NSZ0KTtyZXR1cm4gb30sZnJvbUJ5dGVBcnJheTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbj1lLmxlbmd0aCxyPW4lMyxpPVtdLGE9MTYzODMsbz0wLGM9bi1yO288YztvKz1hKWkucHVzaChDbyhlLG8sbythPmM/YzpvK2EpKTsxPT09cj8odD1lW24tMV0saS5wdXNoKF9vW3Q+PjJdK19vW3Q8PDQmNjNdKyI9PSIpKToyPT09ciYmKHQ9KGVbbi0yXTw8OCkrZVtuLTFdLGkucHVzaChfb1t0Pj4xMF0rX29bdD4+NCY2M10rX29bdDw8MiY2M10rIj0iKSk7cmV0dXJuIGkuam9pbigiIil9fSxfbz1bXSxFbz1bXSxVbz0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxBbz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsa289MDtrbzw2NDsrK2tvKV9vW2tvXT1Bb1trb10sRW9bQW8uY2hhckNvZGVBdChrbyldPWtvO2Z1bmN0aW9uIFNvKGUpe3ZhciB0PWUubGVuZ3RoO2lmKHQlND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO3ZhciBuPWUuaW5kZXhPZigiPSIpO3JldHVybi0xPT09biYmKG49dCksW24sbj09PXQ/MDo0LW4lNF19ZnVuY3Rpb24gQ28oZSx0LG4pe2Zvcih2YXIgcixpLGE9W10sbz10O288bjtvKz0zKXI9KGVbb108PDE2JjE2NzExNjgwKSsoZVtvKzFdPDw4JjY1MjgwKSsoMjU1JmVbbysyXSksYS5wdXNoKF9vWyhpPXIpPj4xOCY2M10rX29baT4+MTImNjNdK19vW2k+PjYmNjNdK19vWzYzJmldKTtyZXR1cm4gYS5qb2luKCIiKX1mdW5jdGlvbiBGbyhlKXt0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBkeW5hbWljYWxseSByZXF1aXJlICInK2UrJyIuIFBsZWFzZSBjb25maWd1cmUgdGhlIGR5bmFtaWNSZXF1aXJlVGFyZ2V0cyBvci9hbmQgaWdub3JlRHluYW1pY1JlcXVpcmVzIG9wdGlvbiBvZiBAcm9sbHVwL3BsdWdpbi1jb21tb25qcyBhcHByb3ByaWF0ZWx5IGZvciB0aGlzIHJlcXVpcmUgY2FsbCB0byB3b3JrLicpfUVvWyItIi5jaGFyQ29kZUF0KDApXT02MixFb1siXyIuY2hhckNvZGVBdCgwKV09NjM7dmFyIE9vPXt9OyFmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBpKG8sYyl7aWYoIW5bb10pe2lmKCF0W29dKXtpZighYyYmRm8pcmV0dXJuIEZvKG8pO2lmKGEpcmV0dXJuIGEobywhMCk7dmFyIHM9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IHMuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsc312YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLChmdW5jdGlvbihlKXtyZXR1cm4gaSh0W29dWzFdW2VdfHxlKX0pLGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9Zm9yKHZhciBhPUZvLG89MDtvPHIubGVuZ3RoO28rKylpKHJbb10pO3JldHVybiBpfSh7MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vdXRpbHMiKSxpPWUoIi4vc3VwcG9ydCIpLGE9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IjtuLmVuY29kZT1mdW5jdGlvbihlKXtmb3IodmFyIHQsbixpLG8sYyxzLGwsdT1bXSxmPTAsZD1lLmxlbmd0aCxoPWQscD0ic3RyaW5nIiE9PXIuZ2V0VHlwZU9mKGUpO2Y8ZS5sZW5ndGg7KWg9ZC1mLGk9cD8odD1lW2YrK10sbj1mPGQ/ZVtmKytdOjAsZjxkP2VbZisrXTowKToodD1lLmNoYXJDb2RlQXQoZisrKSxuPWY8ZD9lLmNoYXJDb2RlQXQoZisrKTowLGY8ZD9lLmNoYXJDb2RlQXQoZisrKTowKSxvPXQ+PjIsYz0oMyZ0KTw8NHxuPj40LHM9MTxoPygxNSZuKTw8MnxpPj42OjY0LGw9MjxoPzYzJmk6NjQsdS5wdXNoKGEuY2hhckF0KG8pK2EuY2hhckF0KGMpK2EuY2hhckF0KHMpK2EuY2hhckF0KGwpKTtyZXR1cm4gdS5qb2luKCIiKX0sbi5kZWNvZGU9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLG8sYyxzLGw9MCx1PTAsZj0iZGF0YToiO2lmKGUuc3Vic3RyKDAsZi5sZW5ndGgpPT09Zil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYmFzZTY0IGlucHV0LCBpdCBsb29rcyBsaWtlIGEgZGF0YSB1cmwuIik7dmFyIGQsaD0zKihlPWUucmVwbGFjZSgvW15BLVphLXowLTkrLz1dL2csIiIpKS5sZW5ndGgvNDtpZihlLmNoYXJBdChlLmxlbmd0aC0xKT09PWEuY2hhckF0KDY0KSYmaC0tLGUuY2hhckF0KGUubGVuZ3RoLTIpPT09YS5jaGFyQXQoNjQpJiZoLS0saCUxIT0wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBiYXNlNjQgaW5wdXQsIGJhZCBjb250ZW50IGxlbmd0aC4iKTtmb3IoZD1pLnVpbnQ4YXJyYXk/bmV3IFVpbnQ4QXJyYXkoMHxoKTpuZXcgQXJyYXkoMHxoKTtsPGUubGVuZ3RoOyl0PWEuaW5kZXhPZihlLmNoYXJBdChsKyspKTw8Mnwobz1hLmluZGV4T2YoZS5jaGFyQXQobCsrKSkpPj40LG49KDE1Jm8pPDw0fChjPWEuaW5kZXhPZihlLmNoYXJBdChsKyspKSk+PjIscj0oMyZjKTw8Nnwocz1hLmluZGV4T2YoZS5jaGFyQXQobCsrKSkpLGRbdSsrXT10LDY0IT09YyYmKGRbdSsrXT1uKSw2NCE9PXMmJihkW3UrK109cik7cmV0dXJuIGR9fSx7Ii4vc3VwcG9ydCI6MzAsIi4vdXRpbHMiOjMyfV0sMjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vZXh0ZXJuYWwiKSxpPWUoIi4vc3RyZWFtL0RhdGFXb3JrZXIiKSxhPWUoIi4vc3RyZWFtL0NyYzMyUHJvYmUiKSxvPWUoIi4vc3RyZWFtL0RhdGFMZW5ndGhQcm9iZSIpO2Z1bmN0aW9uIGMoZSx0LG4scixpKXt0aGlzLmNvbXByZXNzZWRTaXplPWUsdGhpcy51bmNvbXByZXNzZWRTaXplPXQsdGhpcy5jcmMzMj1uLHRoaXMuY29tcHJlc3Npb249cix0aGlzLmNvbXByZXNzZWRDb250ZW50PWl9Yy5wcm90b3R5cGU9e2dldENvbnRlbnRXb3JrZXI6ZnVuY3Rpb24oKXt2YXIgZT1uZXcgaShyLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSkucGlwZSh0aGlzLmNvbXByZXNzaW9uLnVuY29tcHJlc3NXb3JrZXIoKSkucGlwZShuZXcgbygiZGF0YV9sZW5ndGgiKSksdD10aGlzO3JldHVybiBlLm9uKCJlbmQiLChmdW5jdGlvbigpe2lmKHRoaXMuc3RyZWFtSW5mby5kYXRhX2xlbmd0aCE9PXQudW5jb21wcmVzc2VkU2l6ZSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZyA6IHVuY29tcHJlc3NlZCBkYXRhIHNpemUgbWlzbWF0Y2giKX0pKSxlfSxnZXRDb21wcmVzc2VkV29ya2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBpKHIuUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29tcHJlc3NlZENvbnRlbnQpKS53aXRoU3RyZWFtSW5mbygiY29tcHJlc3NlZFNpemUiLHRoaXMuY29tcHJlc3NlZFNpemUpLndpdGhTdHJlYW1JbmZvKCJ1bmNvbXByZXNzZWRTaXplIix0aGlzLnVuY29tcHJlc3NlZFNpemUpLndpdGhTdHJlYW1JbmZvKCJjcmMzMiIsdGhpcy5jcmMzMikud2l0aFN0cmVhbUluZm8oImNvbXByZXNzaW9uIix0aGlzLmNvbXByZXNzaW9uKX19LGMuY3JlYXRlV29ya2VyRnJvbT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUucGlwZShuZXcgYSkucGlwZShuZXcgbygidW5jb21wcmVzc2VkU2l6ZSIpKS5waXBlKHQuY29tcHJlc3NXb3JrZXIobikpLnBpcGUobmV3IG8oImNvbXByZXNzZWRTaXplIikpLndpdGhTdHJlYW1JbmZvKCJjb21wcmVzc2lvbiIsdCl9LHQuZXhwb3J0cz1jfSx7Ii4vZXh0ZXJuYWwiOjYsIi4vc3RyZWFtL0NyYzMyUHJvYmUiOjI1LCIuL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUiOjI2LCIuL3N0cmVhbS9EYXRhV29ya2VyIjoyN31dLDM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL3N0cmVhbS9HZW5lcmljV29ya2VyIik7bi5TVE9SRT17bWFnaWM6IlwwXDAiLGNvbXByZXNzV29ya2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyByKCJTVE9SRSBjb21wcmVzc2lvbiIpfSx1bmNvbXByZXNzV29ya2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyByKCJTVE9SRSBkZWNvbXByZXNzaW9uIil9fSxuLkRFRkxBVEU9ZSgiLi9mbGF0ZSIpfSx7Ii4vZmxhdGUiOjcsIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiOjI4fV0sNDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vdXRpbHMiKSxpPWZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9W10sbj0wO248MjU2O24rKyl7ZT1uO2Zvcih2YXIgcj0wO3I8ODtyKyspZT0xJmU/Mzk4ODI5MjM4NF5lPj4+MTplPj4+MTt0W25dPWV9cmV0dXJuIHR9KCk7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMCE9PWUmJmUubGVuZ3RoPyJzdHJpbmciIT09ci5nZXRUeXBlT2YoZSk/ZnVuY3Rpb24oZSx0LG4scil7dmFyIGE9aSxvPXIrbjtlXj0tMTtmb3IodmFyIGM9cjtjPG87YysrKWU9ZT4+PjheYVsyNTUmKGVedFtjXSldO3JldHVybi0xXmV9KDB8dCxlLGUubGVuZ3RoLDApOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBhPWksbz1yK247ZV49LTE7Zm9yKHZhciBjPXI7YzxvO2MrKyllPWU+Pj44XmFbMjU1JihlXnQuY2hhckNvZGVBdChjKSldO3JldHVybi0xXmV9KDB8dCxlLGUubGVuZ3RoLDApOjB9fSx7Ii4vdXRpbHMiOjMyfV0sNTpbZnVuY3Rpb24oZSx0LG4pe24uYmFzZTY0PSExLG4uYmluYXJ5PSExLG4uZGlyPSExLG4uY3JlYXRlRm9sZGVycz0hMCxuLmRhdGU9bnVsbCxuLmNvbXByZXNzaW9uPW51bGwsbi5jb21wcmVzc2lvbk9wdGlvbnM9bnVsbCxuLmNvbW1lbnQ9bnVsbCxuLnVuaXhQZXJtaXNzaW9ucz1udWxsLG4uZG9zUGVybWlzc2lvbnM9bnVsbH0se31dLDY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1udWxsO3I9InVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlP1Byb21pc2U6ZSgibGllIiksdC5leHBvcnRzPXtQcm9taXNlOnJ9fSx7bGllOjM3fV0sNzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBVaW50MTZBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBVaW50MzJBcnJheSxpPWUoInBha28iKSxhPWUoIi4vdXRpbHMiKSxvPWUoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKSxjPXI/InVpbnQ4YXJyYXkiOiJhcnJheSI7ZnVuY3Rpb24gcyhlLHQpe28uY2FsbCh0aGlzLCJGbGF0ZVdvcmtlci8iK2UpLHRoaXMuX3Bha289bnVsbCx0aGlzLl9wYWtvQWN0aW9uPWUsdGhpcy5fcGFrb09wdGlvbnM9dCx0aGlzLm1ldGE9e319bi5tYWdpYz0iXGJcMCIsYS5pbmhlcml0cyhzLG8pLHMucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihlKXt0aGlzLm1ldGE9ZS5tZXRhLG51bGw9PT10aGlzLl9wYWtvJiZ0aGlzLl9jcmVhdGVQYWtvKCksdGhpcy5fcGFrby5wdXNoKGEudHJhbnNmb3JtVG8oYyxlLmRhdGEpLCExKX0scy5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXtvLnByb3RvdHlwZS5mbHVzaC5jYWxsKHRoaXMpLG51bGw9PT10aGlzLl9wYWtvJiZ0aGlzLl9jcmVhdGVQYWtvKCksdGhpcy5fcGFrby5wdXNoKFtdLCEwKX0scy5wcm90b3R5cGUuY2xlYW5VcD1mdW5jdGlvbigpe28ucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKSx0aGlzLl9wYWtvPW51bGx9LHMucHJvdG90eXBlLl9jcmVhdGVQYWtvPWZ1bmN0aW9uKCl7dGhpcy5fcGFrbz1uZXcgaVt0aGlzLl9wYWtvQWN0aW9uXSh7cmF3OiEwLGxldmVsOnRoaXMuX3Bha29PcHRpb25zLmxldmVsfHwtMX0pO3ZhciBlPXRoaXM7dGhpcy5fcGFrby5vbkRhdGE9ZnVuY3Rpb24odCl7ZS5wdXNoKHtkYXRhOnQsbWV0YTplLm1ldGF9KX19LG4uY29tcHJlc3NXb3JrZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBzKCJEZWZsYXRlIixlKX0sbi51bmNvbXByZXNzV29ya2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBzKCJJbmZsYXRlIix7fSl9fSx7Ii4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiOjI4LCIuL3V0aWxzIjozMixwYWtvOjM4fV0sODpbZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSx0KXt2YXIgbixyPSIiO2ZvcihuPTA7bjx0O24rKylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDI1NSZlKSxlPj4+PTg7cmV0dXJuIHJ9ZnVuY3Rpb24gaShlLHQsbixpLG8sdSl7dmFyIGYsZCxoPWUuZmlsZSxwPWUuY29tcHJlc3Npb24sZz11IT09Yy51dGY4ZW5jb2RlLG09YS50cmFuc2Zvcm1Ubygic3RyaW5nIix1KGgubmFtZSkpLGI9YS50cmFuc2Zvcm1Ubygic3RyaW5nIixjLnV0ZjhlbmNvZGUoaC5uYW1lKSkseT1oLmNvbW1lbnQsdj1hLnRyYW5zZm9ybVRvKCJzdHJpbmciLHUoeSkpLHg9YS50cmFuc2Zvcm1Ubygic3RyaW5nIixjLnV0ZjhlbmNvZGUoeSkpLEQ9Yi5sZW5ndGghPT1oLm5hbWUubGVuZ3RoLFQ9eC5sZW5ndGghPT15Lmxlbmd0aCx3PSIiLF89IiIsRT0iIixVPWguZGlyLEE9aC5kYXRlLGs9e2NyYzMyOjAsY29tcHJlc3NlZFNpemU6MCx1bmNvbXByZXNzZWRTaXplOjB9O3QmJiFufHwoay5jcmMzMj1lLmNyYzMyLGsuY29tcHJlc3NlZFNpemU9ZS5jb21wcmVzc2VkU2l6ZSxrLnVuY29tcHJlc3NlZFNpemU9ZS51bmNvbXByZXNzZWRTaXplKTt2YXIgUz0wO3QmJihTfD04KSxnfHwhRCYmIVR8fChTfD0yMDQ4KTt2YXIgQz0wLEY9MDtVJiYoQ3w9MTYpLCJVTklYIj09PW8/KEY9Nzk4LEN8PWZ1bmN0aW9uKGUsdCl7dmFyIG49ZTtyZXR1cm4gZXx8KG49dD8xNjg5MzozMzIwNCksKDY1NTM1Jm4pPDwxNn0oaC51bml4UGVybWlzc2lvbnMsVSkpOihGPTIwLEN8PWZ1bmN0aW9uKGUpe3JldHVybiA2MyYoZXx8MCl9KGguZG9zUGVybWlzc2lvbnMpKSxmPUEuZ2V0VVRDSG91cnMoKSxmPDw9NixmfD1BLmdldFVUQ01pbnV0ZXMoKSxmPDw9NSxmfD1BLmdldFVUQ1NlY29uZHMoKS8yLGQ9QS5nZXRVVENGdWxsWWVhcigpLTE5ODAsZDw8PTQsZHw9QS5nZXRVVENNb250aCgpKzEsZDw8PTUsZHw9QS5nZXRVVENEYXRlKCksRCYmKF89cigxLDEpK3IocyhtKSw0KStiLHcrPSJ1cCIrcihfLmxlbmd0aCwyKStfKSxUJiYoRT1yKDEsMSkrcihzKHYpLDQpK3gsdys9InVjIityKEUubGVuZ3RoLDIpK0UpO3ZhciBPPSIiO3JldHVybiBPKz0iXG5cMCIsTys9cihTLDIpLE8rPXAubWFnaWMsTys9cihmLDIpLE8rPXIoZCwyKSxPKz1yKGsuY3JjMzIsNCksTys9cihrLmNvbXByZXNzZWRTaXplLDQpLE8rPXIoay51bmNvbXByZXNzZWRTaXplLDQpLE8rPXIobS5sZW5ndGgsMiksTys9cih3Lmxlbmd0aCwyKSx7ZmlsZVJlY29yZDpsLkxPQ0FMX0ZJTEVfSEVBREVSK08rbSt3LGRpclJlY29yZDpsLkNFTlRSQUxfRklMRV9IRUFERVIrcihGLDIpK08rcih2Lmxlbmd0aCwyKSsiXDBcMFwwXDAiK3IoQyw0KStyKGksNCkrbSt3K3Z9fXZhciBhPWUoIi4uL3V0aWxzIiksbz1lKCIuLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLGM9ZSgiLi4vdXRmOCIpLHM9ZSgiLi4vY3JjMzIiKSxsPWUoIi4uL3NpZ25hdHVyZSIpO2Z1bmN0aW9uIHUoZSx0LG4scil7by5jYWxsKHRoaXMsIlppcEZpbGVXb3JrZXIiKSx0aGlzLmJ5dGVzV3JpdHRlbj0wLHRoaXMuemlwQ29tbWVudD10LHRoaXMuemlwUGxhdGZvcm09bix0aGlzLmVuY29kZUZpbGVOYW1lPXIsdGhpcy5zdHJlYW1GaWxlcz1lLHRoaXMuYWNjdW11bGF0ZT0hMSx0aGlzLmNvbnRlbnRCdWZmZXI9W10sdGhpcy5kaXJSZWNvcmRzPVtdLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldD0wLHRoaXMuZW50cmllc0NvdW50PTAsdGhpcy5jdXJyZW50RmlsZT1udWxsLHRoaXMuX3NvdXJjZXM9W119YS5pbmhlcml0cyh1LG8pLHUucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tZXRhLnBlcmNlbnR8fDAsbj10aGlzLmVudHJpZXNDb3VudCxyPXRoaXMuX3NvdXJjZXMubGVuZ3RoO3RoaXMuYWNjdW11bGF0ZT90aGlzLmNvbnRlbnRCdWZmZXIucHVzaChlKToodGhpcy5ieXRlc1dyaXR0ZW4rPWUuZGF0YS5sZW5ndGgsby5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMse2RhdGE6ZS5kYXRhLG1ldGE6e2N1cnJlbnRGaWxlOnRoaXMuY3VycmVudEZpbGUscGVyY2VudDpuPyh0KzEwMCoobi1yLTEpKS9uOjEwMH19KSl9LHUucHJvdG90eXBlLm9wZW5lZFNvdXJjZT1mdW5jdGlvbihlKXt0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQ9dGhpcy5ieXRlc1dyaXR0ZW4sdGhpcy5jdXJyZW50RmlsZT1lLmZpbGUubmFtZTt2YXIgdD10aGlzLnN0cmVhbUZpbGVzJiYhZS5maWxlLmRpcjtpZih0KXt2YXIgbj1pKGUsdCwhMSx0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQsdGhpcy56aXBQbGF0Zm9ybSx0aGlzLmVuY29kZUZpbGVOYW1lKTt0aGlzLnB1c2goe2RhdGE6bi5maWxlUmVjb3JkLG1ldGE6e3BlcmNlbnQ6MH19KX1lbHNlIHRoaXMuYWNjdW11bGF0ZT0hMH0sdS5wcm90b3R5cGUuY2xvc2VkU291cmNlPWZ1bmN0aW9uKGUpe3RoaXMuYWNjdW11bGF0ZT0hMTt2YXIgdD10aGlzLnN0cmVhbUZpbGVzJiYhZS5maWxlLmRpcixuPWkoZSx0LCEwLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldCx0aGlzLnppcFBsYXRmb3JtLHRoaXMuZW5jb2RlRmlsZU5hbWUpO2lmKHRoaXMuZGlyUmVjb3Jkcy5wdXNoKG4uZGlyUmVjb3JkKSx0KXRoaXMucHVzaCh7ZGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gbC5EQVRBX0RFU0NSSVBUT1IrcihlLmNyYzMyLDQpK3IoZS5jb21wcmVzc2VkU2l6ZSw0KStyKGUudW5jb21wcmVzc2VkU2l6ZSw0KX0oZSksbWV0YTp7cGVyY2VudDoxMDB9fSk7ZWxzZSBmb3IodGhpcy5wdXNoKHtkYXRhOm4uZmlsZVJlY29yZCxtZXRhOntwZXJjZW50OjB9fSk7dGhpcy5jb250ZW50QnVmZmVyLmxlbmd0aDspdGhpcy5wdXNoKHRoaXMuY29udGVudEJ1ZmZlci5zaGlmdCgpKTt0aGlzLmN1cnJlbnRGaWxlPW51bGx9LHUucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuYnl0ZXNXcml0dGVuLHQ9MDt0PHRoaXMuZGlyUmVjb3Jkcy5sZW5ndGg7dCsrKXRoaXMucHVzaCh7ZGF0YTp0aGlzLmRpclJlY29yZHNbdF0sbWV0YTp7cGVyY2VudDoxMDB9fSk7dmFyIG49dGhpcy5ieXRlc1dyaXR0ZW4tZSxpPWZ1bmN0aW9uKGUsdCxuLGksbyl7dmFyIGM9YS50cmFuc2Zvcm1Ubygic3RyaW5nIixvKGkpKTtyZXR1cm4gbC5DRU5UUkFMX0RJUkVDVE9SWV9FTkQrIlwwXDBcMFwwIityKGUsMikrcihlLDIpK3IodCw0KStyKG4sNCkrcihjLmxlbmd0aCwyKStjfSh0aGlzLmRpclJlY29yZHMubGVuZ3RoLG4sZSx0aGlzLnppcENvbW1lbnQsdGhpcy5lbmNvZGVGaWxlTmFtZSk7dGhpcy5wdXNoKHtkYXRhOmksbWV0YTp7cGVyY2VudDoxMDB9fSl9LHUucHJvdG90eXBlLnByZXBhcmVOZXh0U291cmNlPWZ1bmN0aW9uKCl7dGhpcy5wcmV2aW91cz10aGlzLl9zb3VyY2VzLnNoaWZ0KCksdGhpcy5vcGVuZWRTb3VyY2UodGhpcy5wcmV2aW91cy5zdHJlYW1JbmZvKSx0aGlzLmlzUGF1c2VkP3RoaXMucHJldmlvdXMucGF1c2UoKTp0aGlzLnByZXZpb3VzLnJlc3VtZSgpfSx1LnByb3RvdHlwZS5yZWdpc3RlclByZXZpb3VzPWZ1bmN0aW9uKGUpe3RoaXMuX3NvdXJjZXMucHVzaChlKTt2YXIgdD10aGlzO3JldHVybiBlLm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7dC5wcm9jZXNzQ2h1bmsoZSl9KSksZS5vbigiZW5kIiwoZnVuY3Rpb24oKXt0LmNsb3NlZFNvdXJjZSh0LnByZXZpb3VzLnN0cmVhbUluZm8pLHQuX3NvdXJjZXMubGVuZ3RoP3QucHJlcGFyZU5leHRTb3VyY2UoKTp0LmVuZCgpfSkpLGUub24oImVycm9yIiwoZnVuY3Rpb24oZSl7dC5lcnJvcihlKX0pKSx0aGlzfSx1LnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIW8ucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYoIXRoaXMucHJldmlvdXMmJnRoaXMuX3NvdXJjZXMubGVuZ3RoPyh0aGlzLnByZXBhcmVOZXh0U291cmNlKCksITApOnRoaXMucHJldmlvdXN8fHRoaXMuX3NvdXJjZXMubGVuZ3RofHx0aGlzLmdlbmVyYXRlZEVycm9yP3ZvaWQgMDoodGhpcy5lbmQoKSwhMCkpfSx1LnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9zb3VyY2VzO2lmKCFvLnByb3RvdHlwZS5lcnJvci5jYWxsKHRoaXMsZSkpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdHJ5e3Rbbl0uZXJyb3IoZSl9Y2F0Y2goZSl7fXJldHVybiEwfSx1LnByb3RvdHlwZS5sb2NrPWZ1bmN0aW9uKCl7by5wcm90b3R5cGUubG9jay5jYWxsKHRoaXMpO2Zvcih2YXIgZT10aGlzLl9zb3VyY2VzLHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLmxvY2soKX0sdC5leHBvcnRzPXV9LHsiLi4vY3JjMzIiOjQsIi4uL3NpZ25hdHVyZSI6MjMsIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi4vdXRmOCI6MzEsIi4uL3V0aWxzIjozMn1dLDk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb21wcmVzc2lvbnMiKSxpPWUoIi4vWmlwRmlsZVdvcmtlciIpO24uZ2VuZXJhdGVXb3JrZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciBhPW5ldyBpKHQuc3RyZWFtRmlsZXMsbix0LnBsYXRmb3JtLHQuZW5jb2RlRmlsZU5hbWUpLG89MDt0cnl7ZS5mb3JFYWNoKChmdW5jdGlvbihlLG4pe28rKzt2YXIgaT1mdW5jdGlvbihlLHQpe3ZhciBuPWV8fHQsaT1yW25dO2lmKCFpKXRocm93IG5ldyBFcnJvcihuKyIgaXMgbm90IGEgdmFsaWQgY29tcHJlc3Npb24gbWV0aG9kICEiKTtyZXR1cm4gaX0obi5vcHRpb25zLmNvbXByZXNzaW9uLHQuY29tcHJlc3Npb24pLGM9bi5vcHRpb25zLmNvbXByZXNzaW9uT3B0aW9uc3x8dC5jb21wcmVzc2lvbk9wdGlvbnN8fHt9LHM9bi5kaXIsbD1uLmRhdGU7bi5fY29tcHJlc3NXb3JrZXIoaSxjKS53aXRoU3RyZWFtSW5mbygiZmlsZSIse25hbWU6ZSxkaXI6cyxkYXRlOmwsY29tbWVudDpuLmNvbW1lbnR8fCIiLHVuaXhQZXJtaXNzaW9uczpuLnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczpuLmRvc1Blcm1pc3Npb25zfSkucGlwZShhKX0pKSxhLmVudHJpZXNDb3VudD1vfWNhdGNoKGUpe2EuZXJyb3IoZSl9cmV0dXJuIGF9fSx7Ii4uL2NvbXByZXNzaW9ucyI6MywiLi9aaXBGaWxlV29ya2VyIjo4fV0sMTA6W2Z1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpcmV0dXJuIG5ldyByO2lmKGFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIik7dGhpcy5maWxlcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuY29tbWVudD1udWxsLHRoaXMucm9vdD0iIix0aGlzLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IHI7Zm9yKHZhciB0IGluIHRoaXMpImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXNbdF0mJihlW3RdPXRoaXNbdF0pO3JldHVybiBlfX0oci5wcm90b3R5cGU9ZSgiLi9vYmplY3QiKSkubG9hZEFzeW5jPWUoIi4vbG9hZCIpLHIuc3VwcG9ydD1lKCIuL3N1cHBvcnQiKSxyLmRlZmF1bHRzPWUoIi4vZGVmYXVsdHMiKSxyLnZlcnNpb249IjMuMTAuMSIsci5sb2FkQXN5bmM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4obmV3IHIpLmxvYWRBc3luYyhlLHQpfSxyLmV4dGVybmFsPWUoIi4vZXh0ZXJuYWwiKSx0LmV4cG9ydHM9cn0seyIuL2RlZmF1bHRzIjo1LCIuL2V4dGVybmFsIjo2LCIuL2xvYWQiOjExLCIuL29iamVjdCI6MTUsIi4vc3VwcG9ydCI6MzB9XSwxMTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vdXRpbHMiKSxpPWUoIi4vZXh0ZXJuYWwiKSxhPWUoIi4vdXRmOCIpLG89ZSgiLi96aXBFbnRyaWVzIiksYz1lKCIuL3N0cmVhbS9DcmMzMlByb2JlIikscz1lKCIuL25vZGVqc1V0aWxzIik7ZnVuY3Rpb24gbChlKXtyZXR1cm4gbmV3IGkuUHJvbWlzZSgoZnVuY3Rpb24odCxuKXt2YXIgcj1lLmRlY29tcHJlc3NlZC5nZXRDb250ZW50V29ya2VyKCkucGlwZShuZXcgYyk7ci5vbigiZXJyb3IiLChmdW5jdGlvbihlKXtuKGUpfSkpLm9uKCJlbmQiLChmdW5jdGlvbigpe3Iuc3RyZWFtSW5mby5jcmMzMiE9PWUuZGVjb21wcmVzc2VkLmNyYzMyP24obmV3IEVycm9yKCJDb3JydXB0ZWQgemlwIDogQ1JDMzIgbWlzbWF0Y2giKSk6dCgpfSkpLnJlc3VtZSgpfSkpfXQuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHQ9ci5leHRlbmQodHx8e30se2Jhc2U2NDohMSxjaGVja0NSQzMyOiExLG9wdGltaXplZEJpbmFyeVN0cmluZzohMSxjcmVhdGVGb2xkZXJzOiExLGRlY29kZUZpbGVOYW1lOmEudXRmOGRlY29kZX0pLHMuaXNOb2RlJiZzLmlzU3RyZWFtKGUpP2kuUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJKU1ppcCBjYW4ndCBhY2NlcHQgYSBzdHJlYW0gd2hlbiBsb2FkaW5nIGEgemlwIGZpbGUuIikpOnIucHJlcGFyZUNvbnRlbnQoInRoZSBsb2FkZWQgemlwIGZpbGUiLGUsITAsdC5vcHRpbWl6ZWRCaW5hcnlTdHJpbmcsdC5iYXNlNjQpLnRoZW4oKGZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBvKHQpO3JldHVybiBuLmxvYWQoZSksbn0pKS50aGVuKChmdW5jdGlvbihlKXt2YXIgbj1baS5Qcm9taXNlLnJlc29sdmUoZSldLHI9ZS5maWxlcztpZih0LmNoZWNrQ1JDMzIpZm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspbi5wdXNoKGwoclthXSkpO3JldHVybiBpLlByb21pc2UuYWxsKG4pfSkpLnRoZW4oKGZ1bmN0aW9uKGUpe2Zvcih2YXIgaT1lLnNoaWZ0KCksYT1pLmZpbGVzLG89MDtvPGEubGVuZ3RoO28rKyl7dmFyIGM9YVtvXSxzPWMuZmlsZU5hbWVTdHIsbD1yLnJlc29sdmUoYy5maWxlTmFtZVN0cik7bi5maWxlKGwsYy5kZWNvbXByZXNzZWQse2JpbmFyeTohMCxvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6ITAsZGF0ZTpjLmRhdGUsZGlyOmMuZGlyLGNvbW1lbnQ6Yy5maWxlQ29tbWVudFN0ci5sZW5ndGg/Yy5maWxlQ29tbWVudFN0cjpudWxsLHVuaXhQZXJtaXNzaW9uczpjLnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczpjLmRvc1Blcm1pc3Npb25zLGNyZWF0ZUZvbGRlcnM6dC5jcmVhdGVGb2xkZXJzfSksYy5kaXJ8fChuLmZpbGUobCkudW5zYWZlT3JpZ2luYWxOYW1lPXMpfXJldHVybiBpLnppcENvbW1lbnQubGVuZ3RoJiYobi5jb21tZW50PWkuemlwQ29tbWVudCksbn0pKX19LHsiLi9leHRlcm5hbCI6NiwiLi9ub2RlanNVdGlscyI6MTQsIi4vc3RyZWFtL0NyYzMyUHJvYmUiOjI1LCIuL3V0ZjgiOjMxLCIuL3V0aWxzIjozMiwiLi96aXBFbnRyaWVzIjozM31dLDEyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbHMiKSxpPWUoIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIik7ZnVuY3Rpb24gYShlLHQpe2kuY2FsbCh0aGlzLCJOb2RlanMgc3RyZWFtIGlucHV0IGFkYXB0ZXIgZm9yICIrZSksdGhpcy5fdXBzdHJlYW1FbmRlZD0hMSx0aGlzLl9iaW5kU3RyZWFtKHQpfXIuaW5oZXJpdHMoYSxpKSxhLnByb3RvdHlwZS5fYmluZFN0cmVhbT1mdW5jdGlvbihlKXt2YXIgdD10aGlzOyh0aGlzLl9zdHJlYW09ZSkucGF1c2UoKSxlLm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7dC5wdXNoKHtkYXRhOmUsbWV0YTp7cGVyY2VudDowfX0pfSkpLm9uKCJlcnJvciIsKGZ1bmN0aW9uKGUpe3QuaXNQYXVzZWQ/dGhpcy5nZW5lcmF0ZWRFcnJvcj1lOnQuZXJyb3IoZSl9KSkub24oImVuZCIsKGZ1bmN0aW9uKCl7dC5pc1BhdXNlZD90Ll91cHN0cmVhbUVuZGVkPSEwOnQuZW5kKCl9KSl9LGEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuISFpLnByb3RvdHlwZS5wYXVzZS5jYWxsKHRoaXMpJiYodGhpcy5fc3RyZWFtLnBhdXNlKCksITApfSxhLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIWkucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYodGhpcy5fdXBzdHJlYW1FbmRlZD90aGlzLmVuZCgpOnRoaXMuX3N0cmVhbS5yZXN1bWUoKSwhMCl9LHQuZXhwb3J0cz1hfSx7Ii4uL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi4vdXRpbHMiOjMyfV0sMTM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCJyZWFkYWJsZS1zdHJlYW0iKS5SZWFkYWJsZTtmdW5jdGlvbiBpKGUsdCxuKXtyLmNhbGwodGhpcyx0KSx0aGlzLl9oZWxwZXI9ZTt2YXIgaT10aGlzO2Uub24oImRhdGEiLChmdW5jdGlvbihlLHQpe2kucHVzaChlKXx8aS5faGVscGVyLnBhdXNlKCksbiYmbih0KX0pKS5vbigiZXJyb3IiLChmdW5jdGlvbihlKXtpLmVtaXQoImVycm9yIixlKX0pKS5vbigiZW5kIiwoZnVuY3Rpb24oKXtpLnB1c2gobnVsbCl9KSl9ZSgiLi4vdXRpbHMiKS5pbmhlcml0cyhpLHIpLGkucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKCl7dGhpcy5faGVscGVyLnJlc3VtZSgpfSx0LmV4cG9ydHM9aX0seyIuLi91dGlscyI6MzIsInJlYWRhYmxlLXN0cmVhbSI6MTZ9XSwxNDpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17aXNOb2RlOnZvaWQgMCE9PXAsbmV3QnVmZmVyRnJvbTpmdW5jdGlvbihlLHQpe2lmKHAuZnJvbSYmcC5mcm9tIT09VWludDhBcnJheS5mcm9tKXJldHVybiBwLmZyb20oZSx0KTtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCdUaGUgImRhdGEiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuIG5ldyBwKGUsdCl9LGFsbG9jQnVmZmVyOmZ1bmN0aW9uKGUpe2lmKHAuYWxsb2MpcmV0dXJuIHAuYWxsb2MoZSk7dmFyIHQ9bmV3IHAoZSk7cmV0dXJuIHQuZmlsbCgwKSx0fSxpc0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gcC5pc0J1ZmZlcihlKX0saXNTdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUucmVzdW1lfX19LHt9XSwxNTpbZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSx0LG4pe3ZhciByLGk9YS5nZXRUeXBlT2YodCksYz1hLmV4dGVuZChufHx7fSxzKTtjLmRhdGU9Yy5kYXRlfHxuZXcgRGF0ZSxudWxsIT09Yy5jb21wcmVzc2lvbiYmKGMuY29tcHJlc3Npb249Yy5jb21wcmVzc2lvbi50b1VwcGVyQ2FzZSgpKSwic3RyaW5nIj09dHlwZW9mIGMudW5peFBlcm1pc3Npb25zJiYoYy51bml4UGVybWlzc2lvbnM9cGFyc2VJbnQoYy51bml4UGVybWlzc2lvbnMsOCkpLGMudW5peFBlcm1pc3Npb25zJiYxNjM4NCZjLnVuaXhQZXJtaXNzaW9ucyYmKGMuZGlyPSEwKSxjLmRvc1Blcm1pc3Npb25zJiYxNiZjLmRvc1Blcm1pc3Npb25zJiYoYy5kaXI9ITApLGMuZGlyJiYoZT1nKGUpKSxjLmNyZWF0ZUZvbGRlcnMmJihyPXAoZSkpJiZtLmNhbGwodGhpcyxyLCEwKTt2YXIgZj0ic3RyaW5nIj09PWkmJiExPT09Yy5iaW5hcnkmJiExPT09Yy5iYXNlNjQ7biYmdm9pZCAwIT09bi5iaW5hcnl8fChjLmJpbmFyeT0hZiksKHQgaW5zdGFuY2VvZiBsJiYwPT09dC51bmNvbXByZXNzZWRTaXplfHxjLmRpcnx8IXR8fDA9PT10Lmxlbmd0aCkmJihjLmJhc2U2ND0hMSxjLmJpbmFyeT0hMCx0PSIiLGMuY29tcHJlc3Npb249IlNUT1JFIixpPSJzdHJpbmciKTt2YXIgYj1udWxsO2I9dCBpbnN0YW5jZW9mIGx8fHQgaW5zdGFuY2VvZiBvP3Q6ZC5pc05vZGUmJmQuaXNTdHJlYW0odCk/bmV3IGgoZSx0KTphLnByZXBhcmVDb250ZW50KGUsdCxjLmJpbmFyeSxjLm9wdGltaXplZEJpbmFyeVN0cmluZyxjLmJhc2U2NCk7dmFyIHk9bmV3IHUoZSxiLGMpO3RoaXMuZmlsZXNbZV09eX12YXIgaT1lKCIuL3V0ZjgiKSxhPWUoIi4vdXRpbHMiKSxvPWUoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKSxjPWUoIi4vc3RyZWFtL1N0cmVhbUhlbHBlciIpLHM9ZSgiLi9kZWZhdWx0cyIpLGw9ZSgiLi9jb21wcmVzc2VkT2JqZWN0IiksdT1lKCIuL3ppcE9iamVjdCIpLGY9ZSgiLi9nZW5lcmF0ZSIpLGQ9ZSgiLi9ub2RlanNVdGlscyIpLGg9ZSgiLi9ub2RlanMvTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyIikscD1mdW5jdGlvbihlKXsiLyI9PT1lLnNsaWNlKC0xKSYmKGU9ZS5zdWJzdHJpbmcoMCxlLmxlbmd0aC0xKSk7dmFyIHQ9ZS5sYXN0SW5kZXhPZigiLyIpO3JldHVybiAwPHQ/ZS5zdWJzdHJpbmcoMCx0KToiIn0sZz1mdW5jdGlvbihlKXtyZXR1cm4iLyIhPT1lLnNsaWNlKC0xKSYmKGUrPSIvIiksZX0sbT1mdW5jdGlvbihlLHQpe3JldHVybiB0PXZvaWQgMCE9PXQ/dDpzLmNyZWF0ZUZvbGRlcnMsZT1nKGUpLHRoaXMuZmlsZXNbZV18fHIuY2FsbCh0aGlzLGUsbnVsbCx7ZGlyOiEwLGNyZWF0ZUZvbGRlcnM6dH0pLHRoaXMuZmlsZXNbZV19O2Z1bmN0aW9uIGIoZSl7cmV0dXJuIltvYmplY3QgUmVnRXhwXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9dmFyIHk9e2xvYWQ6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIil9LGZvckVhY2g6ZnVuY3Rpb24oZSl7dmFyIHQsbixyO2Zvcih0IGluIHRoaXMuZmlsZXMpcj10aGlzLmZpbGVzW3RdLChuPXQuc2xpY2UodGhpcy5yb290Lmxlbmd0aCx0Lmxlbmd0aCkpJiZ0LnNsaWNlKDAsdGhpcy5yb290Lmxlbmd0aCk9PT10aGlzLnJvb3QmJmUobixyKX0sZmlsdGVyOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiB0aGlzLmZvckVhY2goKGZ1bmN0aW9uKG4scil7ZShuLHIpJiZ0LnB1c2gocil9KSksdH0sZmlsZTpmdW5jdGlvbihlLHQsbil7aWYoMSE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGU9dGhpcy5yb290K2Usci5jYWxsKHRoaXMsZSx0LG4pLHRoaXM7aWYoYihlKSl7dmFyIGk9ZTtyZXR1cm4gdGhpcy5maWx0ZXIoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIXQuZGlyJiZpLnRlc3QoZSl9KSl9dmFyIGE9dGhpcy5maWxlc1t0aGlzLnJvb3QrZV07cmV0dXJuIGEmJiFhLmRpcj9hOm51bGx9LGZvbGRlcjpmdW5jdGlvbihlKXtpZighZSlyZXR1cm4gdGhpcztpZihiKGUpKXJldHVybiB0aGlzLmZpbHRlcigoZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5kaXImJmUudGVzdCh0KX0pKTt2YXIgdD10aGlzLnJvb3QrZSxuPW0uY2FsbCh0aGlzLHQpLHI9dGhpcy5jbG9uZSgpO3JldHVybiByLnJvb3Q9bi5uYW1lLHJ9LHJlbW92ZTpmdW5jdGlvbihlKXtlPXRoaXMucm9vdCtlO3ZhciB0PXRoaXMuZmlsZXNbZV07aWYodHx8KCIvIiE9PWUuc2xpY2UoLTEpJiYoZSs9Ii8iKSx0PXRoaXMuZmlsZXNbZV0pLHQmJiF0LmRpcilkZWxldGUgdGhpcy5maWxlc1tlXTtlbHNlIGZvcih2YXIgbj10aGlzLmZpbHRlcigoZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5uYW1lLnNsaWNlKDAsZS5sZW5ndGgpPT09ZX0pKSxyPTA7cjxuLmxlbmd0aDtyKyspZGVsZXRlIHRoaXMuZmlsZXNbbltyXS5uYW1lXTtyZXR1cm4gdGhpc30sZ2VuZXJhdGU6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIil9LGdlbmVyYXRlSW50ZXJuYWxTdHJlYW06ZnVuY3Rpb24oZSl7dmFyIHQsbj17fTt0cnl7aWYoKG49YS5leHRlbmQoZXx8e30se3N0cmVhbUZpbGVzOiExLGNvbXByZXNzaW9uOiJTVE9SRSIsY29tcHJlc3Npb25PcHRpb25zOm51bGwsdHlwZToiIixwbGF0Zm9ybToiRE9TIixjb21tZW50Om51bGwsbWltZVR5cGU6ImFwcGxpY2F0aW9uL3ppcCIsZW5jb2RlRmlsZU5hbWU6aS51dGY4ZW5jb2RlfSkpLnR5cGU9bi50eXBlLnRvTG93ZXJDYXNlKCksbi5jb21wcmVzc2lvbj1uLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCksImJpbmFyeXN0cmluZyI9PT1uLnR5cGUmJihuLnR5cGU9InN0cmluZyIpLCFuLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJObyBvdXRwdXQgdHlwZSBzcGVjaWZpZWQuIik7YS5jaGVja1N1cHBvcnQobi50eXBlKSwiZGFyd2luIiE9PW4ucGxhdGZvcm0mJiJmcmVlYnNkIiE9PW4ucGxhdGZvcm0mJiJsaW51eCIhPT1uLnBsYXRmb3JtJiYic3Vub3MiIT09bi5wbGF0Zm9ybXx8KG4ucGxhdGZvcm09IlVOSVgiKSwid2luMzIiPT09bi5wbGF0Zm9ybSYmKG4ucGxhdGZvcm09IkRPUyIpO3ZhciByPW4uY29tbWVudHx8dGhpcy5jb21tZW50fHwiIjt0PWYuZ2VuZXJhdGVXb3JrZXIodGhpcyxuLHIpfWNhdGNoKGUpeyh0PW5ldyBvKCJlcnJvciIpKS5lcnJvcihlKX1yZXR1cm4gbmV3IGModCxuLnR5cGV8fCJzdHJpbmciLG4ubWltZVR5cGUpfSxnZW5lcmF0ZUFzeW5jOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShlKS5hY2N1bXVsYXRlKHQpfSxnZW5lcmF0ZU5vZGVTdHJlYW06ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZT1lfHx7fSkudHlwZXx8KGUudHlwZT0ibm9kZWJ1ZmZlciIpLHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShlKS50b05vZGVqc1N0cmVhbSh0KX19O3QuZXhwb3J0cz15fSx7Ii4vY29tcHJlc3NlZE9iamVjdCI6MiwiLi9kZWZhdWx0cyI6NSwiLi9nZW5lcmF0ZSI6OSwiLi9ub2RlanMvTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyIjoxMiwiLi9ub2RlanNVdGlscyI6MTQsIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiOjI4LCIuL3N0cmVhbS9TdHJlYW1IZWxwZXIiOjI5LCIuL3V0ZjgiOjMxLCIuL3V0aWxzIjozMiwiLi96aXBPYmplY3QiOjM1fV0sMTY6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZSgic3RyZWFtIil9LHtzdHJlYW06dm9pZCAwfV0sMTc6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL0RhdGFSZWFkZXIiKTtmdW5jdGlvbiBpKGUpe3IuY2FsbCh0aGlzLGUpO2Zvcih2YXIgdD0wO3Q8dGhpcy5kYXRhLmxlbmd0aDt0KyspZVt0XT0yNTUmZVt0XX1lKCIuLi91dGlscyIpLmluaGVyaXRzKGksciksaS5wcm90b3R5cGUuYnl0ZUF0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRhdGFbdGhpcy56ZXJvK2VdfSxpLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5jaGFyQ29kZUF0KDApLG49ZS5jaGFyQ29kZUF0KDEpLHI9ZS5jaGFyQ29kZUF0KDIpLGk9ZS5jaGFyQ29kZUF0KDMpLGE9dGhpcy5sZW5ndGgtNDswPD1hOy0tYSlpZih0aGlzLmRhdGFbYV09PT10JiZ0aGlzLmRhdGFbYSsxXT09PW4mJnRoaXMuZGF0YVthKzJdPT09ciYmdGhpcy5kYXRhW2ErM109PT1pKXJldHVybiBhLXRoaXMuemVybztyZXR1cm4tMX0saS5wcm90b3R5cGUucmVhZEFuZENoZWNrU2lnbmF0dXJlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2hhckNvZGVBdCgwKSxuPWUuY2hhckNvZGVBdCgxKSxyPWUuY2hhckNvZGVBdCgyKSxpPWUuY2hhckNvZGVBdCgzKSxhPXRoaXMucmVhZERhdGEoNCk7cmV0dXJuIHQ9PT1hWzBdJiZuPT09YVsxXSYmcj09PWFbMl0mJmk9PT1hWzNdfSxpLnByb3RvdHlwZS5yZWFkRGF0YT1mdW5jdGlvbihlKXtpZih0aGlzLmNoZWNrT2Zmc2V0KGUpLDA9PT1lKXJldHVybltdO3ZhciB0PXRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8rdGhpcy5pbmRleCx0aGlzLnplcm8rdGhpcy5pbmRleCtlKTtyZXR1cm4gdGhpcy5pbmRleCs9ZSx0fSx0LmV4cG9ydHM9aX0seyIuLi91dGlscyI6MzIsIi4vRGF0YVJlYWRlciI6MTh9XSwxODpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWxzIik7ZnVuY3Rpb24gaShlKXt0aGlzLmRhdGE9ZSx0aGlzLmxlbmd0aD1lLmxlbmd0aCx0aGlzLmluZGV4PTAsdGhpcy56ZXJvPTB9aS5wcm90b3R5cGU9e2NoZWNrT2Zmc2V0OmZ1bmN0aW9uKGUpe3RoaXMuY2hlY2tJbmRleCh0aGlzLmluZGV4K2UpfSxjaGVja0luZGV4OmZ1bmN0aW9uKGUpe2lmKHRoaXMubGVuZ3RoPHRoaXMuemVybytlfHxlPDApdGhyb3cgbmV3IEVycm9yKCJFbmQgb2YgZGF0YSByZWFjaGVkIChkYXRhIGxlbmd0aCA9ICIrdGhpcy5sZW5ndGgrIiwgYXNrZWQgaW5kZXggPSAiK2UrIikuIENvcnJ1cHRlZCB6aXAgPyIpfSxzZXRJbmRleDpmdW5jdGlvbihlKXt0aGlzLmNoZWNrSW5kZXgoZSksdGhpcy5pbmRleD1lfSxza2lwOmZ1bmN0aW9uKGUpe3RoaXMuc2V0SW5kZXgodGhpcy5pbmRleCtlKX0sYnl0ZUF0OmZ1bmN0aW9uKCl7fSxyZWFkSW50OmZ1bmN0aW9uKGUpe3ZhciB0LG49MDtmb3IodGhpcy5jaGVja09mZnNldChlKSx0PXRoaXMuaW5kZXgrZS0xO3Q+PXRoaXMuaW5kZXg7dC0tKW49KG48PDgpK3RoaXMuYnl0ZUF0KHQpO3JldHVybiB0aGlzLmluZGV4Kz1lLG59LHJlYWRTdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIHIudHJhbnNmb3JtVG8oInN0cmluZyIsdGhpcy5yZWFkRGF0YShlKSl9LHJlYWREYXRhOmZ1bmN0aW9uKCl7fSxsYXN0SW5kZXhPZlNpZ25hdHVyZTpmdW5jdGlvbigpe30scmVhZEFuZENoZWNrU2lnbmF0dXJlOmZ1bmN0aW9uKCl7fSxyZWFkRGF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVhZEludCg0KTtyZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoMTk4MCsoZT4+MjUmMTI3KSwoZT4+MjEmMTUpLTEsZT4+MTYmMzEsZT4+MTEmMzEsZT4+NSY2MywoMzEmZSk8PDEpKX19LHQuZXhwb3J0cz1pfSx7Ii4uL3V0aWxzIjozMn1dLDE5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9VaW50OEFycmF5UmVhZGVyIik7ZnVuY3Rpb24gaShlKXtyLmNhbGwodGhpcyxlKX1lKCIuLi91dGlscyIpLmluaGVyaXRzKGksciksaS5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oZSl7dGhpcy5jaGVja09mZnNldChlKTt2YXIgdD10aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvK3RoaXMuaW5kZXgsdGhpcy56ZXJvK3RoaXMuaW5kZXgrZSk7cmV0dXJuIHRoaXMuaW5kZXgrPWUsdH0sdC5leHBvcnRzPWl9LHsiLi4vdXRpbHMiOjMyLCIuL1VpbnQ4QXJyYXlSZWFkZXIiOjIxfV0sMjA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL0RhdGFSZWFkZXIiKTtmdW5jdGlvbiBpKGUpe3IuY2FsbCh0aGlzLGUpfWUoIi4uL3V0aWxzIikuaW5oZXJpdHMoaSxyKSxpLnByb3RvdHlwZS5ieXRlQXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZGF0YS5jaGFyQ29kZUF0KHRoaXMuemVybytlKX0saS5wcm90b3R5cGUubGFzdEluZGV4T2ZTaWduYXR1cmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZGF0YS5sYXN0SW5kZXhPZihlKS10aGlzLnplcm99LGkucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXRoaXMucmVhZERhdGEoNCl9LGkucHJvdG90eXBlLnJlYWREYXRhPWZ1bmN0aW9uKGUpe3RoaXMuY2hlY2tPZmZzZXQoZSk7dmFyIHQ9dGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyt0aGlzLmluZGV4LHRoaXMuemVybyt0aGlzLmluZGV4K2UpO3JldHVybiB0aGlzLmluZGV4Kz1lLHR9LHQuZXhwb3J0cz1pfSx7Ii4uL3V0aWxzIjozMiwiLi9EYXRhUmVhZGVyIjoxOH1dLDIxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9BcnJheVJlYWRlciIpO2Z1bmN0aW9uIGkoZSl7ci5jYWxsKHRoaXMsZSl9ZSgiLi4vdXRpbHMiKS5pbmhlcml0cyhpLHIpLGkucHJvdG90eXBlLnJlYWREYXRhPWZ1bmN0aW9uKGUpe2lmKHRoaXMuY2hlY2tPZmZzZXQoZSksMD09PWUpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO3ZhciB0PXRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLnplcm8rdGhpcy5pbmRleCx0aGlzLnplcm8rdGhpcy5pbmRleCtlKTtyZXR1cm4gdGhpcy5pbmRleCs9ZSx0fSx0LmV4cG9ydHM9aX0seyIuLi91dGlscyI6MzIsIi4vQXJyYXlSZWFkZXIiOjE3fV0sMjI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlscyIpLGk9ZSgiLi4vc3VwcG9ydCIpLGE9ZSgiLi9BcnJheVJlYWRlciIpLG89ZSgiLi9TdHJpbmdSZWFkZXIiKSxjPWUoIi4vTm9kZUJ1ZmZlclJlYWRlciIpLHM9ZSgiLi9VaW50OEFycmF5UmVhZGVyIik7dC5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PXIuZ2V0VHlwZU9mKGUpO3JldHVybiByLmNoZWNrU3VwcG9ydCh0KSwic3RyaW5nIiE9PXR8fGkudWludDhhcnJheT8ibm9kZWJ1ZmZlciI9PT10P25ldyBjKGUpOmkudWludDhhcnJheT9uZXcgcyhyLnRyYW5zZm9ybVRvKCJ1aW50OGFycmF5IixlKSk6bmV3IGEoci50cmFuc2Zvcm1UbygiYXJyYXkiLGUpKTpuZXcgbyhlKX19LHsiLi4vc3VwcG9ydCI6MzAsIi4uL3V0aWxzIjozMiwiLi9BcnJheVJlYWRlciI6MTcsIi4vTm9kZUJ1ZmZlclJlYWRlciI6MTksIi4vU3RyaW5nUmVhZGVyIjoyMCwiLi9VaW50OEFycmF5UmVhZGVyIjoyMX1dLDIzOltmdW5jdGlvbihlLHQsbil7bi5MT0NBTF9GSUxFX0hFQURFUj0iUEsDBCIsbi5DRU5UUkFMX0ZJTEVfSEVBREVSPSJQSwECIixuLkNFTlRSQUxfRElSRUNUT1JZX0VORD0iUEsFBiIsbi5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SPSJQSwYHIixuLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORD0iUEsGBiIsbi5EQVRBX0RFU0NSSVBUT1I9IlBLB1xiIn0se31dLDI0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9HZW5lcmljV29ya2VyIiksaT1lKCIuLi91dGlscyIpO2Z1bmN0aW9uIGEoZSl7ci5jYWxsKHRoaXMsIkNvbnZlcnRXb3JrZXIgdG8gIitlKSx0aGlzLmRlc3RUeXBlPWV9aS5pbmhlcml0cyhhLHIpLGEucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihlKXt0aGlzLnB1c2goe2RhdGE6aS50cmFuc2Zvcm1Ubyh0aGlzLmRlc3RUeXBlLGUuZGF0YSksbWV0YTplLm1ldGF9KX0sdC5leHBvcnRzPWF9LHsiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL0dlbmVyaWNXb3JrZXIiKSxpPWUoIi4uL2NyYzMyIik7ZnVuY3Rpb24gYSgpe3IuY2FsbCh0aGlzLCJDcmMzMlByb2JlIiksdGhpcy53aXRoU3RyZWFtSW5mbygiY3JjMzIiLDApfWUoIi4uL3V0aWxzIikuaW5oZXJpdHMoYSxyKSxhLnByb3RvdHlwZS5wcm9jZXNzQ2h1bms9ZnVuY3Rpb24oZSl7dGhpcy5zdHJlYW1JbmZvLmNyYzMyPWkoZS5kYXRhLHRoaXMuc3RyZWFtSW5mby5jcmMzMnx8MCksdGhpcy5wdXNoKGUpfSx0LmV4cG9ydHM9YX0seyIuLi9jcmMzMiI6NCwiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlscyIpLGk9ZSgiLi9HZW5lcmljV29ya2VyIik7ZnVuY3Rpb24gYShlKXtpLmNhbGwodGhpcywiRGF0YUxlbmd0aFByb2JlIGZvciAiK2UpLHRoaXMucHJvcE5hbWU9ZSx0aGlzLndpdGhTdHJlYW1JbmZvKGUsMCl9ci5pbmhlcml0cyhhLGkpLGEucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihlKXtpZihlKXt2YXIgdD10aGlzLnN0cmVhbUluZm9bdGhpcy5wcm9wTmFtZV18fDA7dGhpcy5zdHJlYW1JbmZvW3RoaXMucHJvcE5hbWVdPXQrZS5kYXRhLmxlbmd0aH1pLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsuY2FsbCh0aGlzLGUpfSx0LmV4cG9ydHM9YX0seyIuLi91dGlscyI6MzIsIi4vR2VuZXJpY1dvcmtlciI6Mjh9XSwyNzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWxzIiksaT1lKCIuL0dlbmVyaWNXb3JrZXIiKTtmdW5jdGlvbiBhKGUpe2kuY2FsbCh0aGlzLCJEYXRhV29ya2VyIik7dmFyIHQ9dGhpczt0aGlzLmRhdGFJc1JlYWR5PSExLHRoaXMuaW5kZXg9MCx0aGlzLm1heD0wLHRoaXMuZGF0YT1udWxsLHRoaXMudHlwZT0iIix0aGlzLl90aWNrU2NoZWR1bGVkPSExLGUudGhlbigoZnVuY3Rpb24oZSl7dC5kYXRhSXNSZWFkeT0hMCx0LmRhdGE9ZSx0Lm1heD1lJiZlLmxlbmd0aHx8MCx0LnR5cGU9ci5nZXRUeXBlT2YoZSksdC5pc1BhdXNlZHx8dC5fdGlja0FuZFJlcGVhdCgpfSksKGZ1bmN0aW9uKGUpe3QuZXJyb3IoZSl9KSl9ci5pbmhlcml0cyhhLGkpLGEucHJvdG90eXBlLmNsZWFuVXA9ZnVuY3Rpb24oKXtpLnByb3RvdHlwZS5jbGVhblVwLmNhbGwodGhpcyksdGhpcy5kYXRhPW51bGx9LGEucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiEhaS5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykmJighdGhpcy5fdGlja1NjaGVkdWxlZCYmdGhpcy5kYXRhSXNSZWFkeSYmKHRoaXMuX3RpY2tTY2hlZHVsZWQ9ITAsci5kZWxheSh0aGlzLl90aWNrQW5kUmVwZWF0LFtdLHRoaXMpKSwhMCl9LGEucHJvdG90eXBlLl90aWNrQW5kUmVwZWF0PWZ1bmN0aW9uKCl7dGhpcy5fdGlja1NjaGVkdWxlZD0hMSx0aGlzLmlzUGF1c2VkfHx0aGlzLmlzRmluaXNoZWR8fCh0aGlzLl90aWNrKCksdGhpcy5pc0ZpbmlzaGVkfHwoci5kZWxheSh0aGlzLl90aWNrQW5kUmVwZWF0LFtdLHRoaXMpLHRoaXMuX3RpY2tTY2hlZHVsZWQ9ITApKX0sYS5wcm90b3R5cGUuX3RpY2s9ZnVuY3Rpb24oKXtpZih0aGlzLmlzUGF1c2VkfHx0aGlzLmlzRmluaXNoZWQpcmV0dXJuITE7dmFyIGU9bnVsbCx0PU1hdGgubWluKHRoaXMubWF4LHRoaXMuaW5kZXgrMTYzODQpO2lmKHRoaXMuaW5kZXg+PXRoaXMubWF4KXJldHVybiB0aGlzLmVuZCgpO3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2Uic3RyaW5nIjplPXRoaXMuZGF0YS5zdWJzdHJpbmcodGhpcy5pbmRleCx0KTticmVhaztjYXNlInVpbnQ4YXJyYXkiOmU9dGhpcy5kYXRhLnN1YmFycmF5KHRoaXMuaW5kZXgsdCk7YnJlYWs7Y2FzZSJhcnJheSI6Y2FzZSJub2RlYnVmZmVyIjplPXRoaXMuZGF0YS5zbGljZSh0aGlzLmluZGV4LHQpfXJldHVybiB0aGlzLmluZGV4PXQsdGhpcy5wdXNoKHtkYXRhOmUsbWV0YTp7cGVyY2VudDp0aGlzLm1heD90aGlzLmluZGV4L3RoaXMubWF4KjEwMDowfX0pfSx0LmV4cG9ydHM9YX0seyIuLi91dGlscyI6MzIsIi4vR2VuZXJpY1dvcmtlciI6Mjh9XSwyODpbZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSl7dGhpcy5uYW1lPWV8fCJkZWZhdWx0Iix0aGlzLnN0cmVhbUluZm89e30sdGhpcy5nZW5lcmF0ZWRFcnJvcj1udWxsLHRoaXMuZXh0cmFTdHJlYW1JbmZvPXt9LHRoaXMuaXNQYXVzZWQ9ITAsdGhpcy5pc0ZpbmlzaGVkPSExLHRoaXMuaXNMb2NrZWQ9ITEsdGhpcy5fbGlzdGVuZXJzPXtkYXRhOltdLGVuZDpbXSxlcnJvcjpbXX0sdGhpcy5wcmV2aW91cz1udWxsfXIucHJvdG90eXBlPXtwdXNoOmZ1bmN0aW9uKGUpe3RoaXMuZW1pdCgiZGF0YSIsZSl9LGVuZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNGaW5pc2hlZClyZXR1cm4hMTt0aGlzLmZsdXNoKCk7dHJ5e3RoaXMuZW1pdCgiZW5kIiksdGhpcy5jbGVhblVwKCksdGhpcy5pc0ZpbmlzaGVkPSEwfWNhdGNoKGUpe3RoaXMuZW1pdCgiZXJyb3IiLGUpfXJldHVybiEwfSxlcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4hdGhpcy5pc0ZpbmlzaGVkJiYodGhpcy5pc1BhdXNlZD90aGlzLmdlbmVyYXRlZEVycm9yPWU6KHRoaXMuaXNGaW5pc2hlZD0hMCx0aGlzLmVtaXQoImVycm9yIixlKSx0aGlzLnByZXZpb3VzJiZ0aGlzLnByZXZpb3VzLmVycm9yKGUpLHRoaXMuY2xlYW5VcCgpKSwhMCl9LG9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX2xpc3RlbmVyc1tlXS5wdXNoKHQpLHRoaXN9LGNsZWFuVXA6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbUluZm89dGhpcy5nZW5lcmF0ZWRFcnJvcj10aGlzLmV4dHJhU3RyZWFtSW5mbz1udWxsLHRoaXMuX2xpc3RlbmVycz1bXX0sZW1pdDpmdW5jdGlvbihlLHQpe2lmKHRoaXMuX2xpc3RlbmVyc1tlXSlmb3IodmFyIG49MDtuPHRoaXMuX2xpc3RlbmVyc1tlXS5sZW5ndGg7bisrKXRoaXMuX2xpc3RlbmVyc1tlXVtuXS5jYWxsKHRoaXMsdCl9LHBpcGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVnaXN0ZXJQcmV2aW91cyh0aGlzKX0scmVnaXN0ZXJQcmV2aW91czpmdW5jdGlvbihlKXtpZih0aGlzLmlzTG9ja2VkKXRocm93IG5ldyBFcnJvcigiVGhlIHN0cmVhbSAnIit0aGlzKyInIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC4iKTt0aGlzLnN0cmVhbUluZm89ZS5zdHJlYW1JbmZvLHRoaXMubWVyZ2VTdHJlYW1JbmZvKCksdGhpcy5wcmV2aW91cz1lO3ZhciB0PXRoaXM7cmV0dXJuIGUub24oImRhdGEiLChmdW5jdGlvbihlKXt0LnByb2Nlc3NDaHVuayhlKX0pKSxlLm9uKCJlbmQiLChmdW5jdGlvbigpe3QuZW5kKCl9KSksZS5vbigiZXJyb3IiLChmdW5jdGlvbihlKXt0LmVycm9yKGUpfSkpLHRoaXN9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNQYXVzZWQmJiF0aGlzLmlzRmluaXNoZWQmJih0aGlzLmlzUGF1c2VkPSEwLHRoaXMucHJldmlvdXMmJnRoaXMucHJldmlvdXMucGF1c2UoKSwhMCl9LHJlc3VtZTpmdW5jdGlvbigpe2lmKCF0aGlzLmlzUGF1c2VkfHx0aGlzLmlzRmluaXNoZWQpcmV0dXJuITE7dmFyIGU9dGhpcy5pc1BhdXNlZD0hMTtyZXR1cm4gdGhpcy5nZW5lcmF0ZWRFcnJvciYmKHRoaXMuZXJyb3IodGhpcy5nZW5lcmF0ZWRFcnJvciksZT0hMCksdGhpcy5wcmV2aW91cyYmdGhpcy5wcmV2aW91cy5yZXN1bWUoKSwhZX0sZmx1c2g6ZnVuY3Rpb24oKXt9LHByb2Nlc3NDaHVuazpmdW5jdGlvbihlKXt0aGlzLnB1c2goZSl9LHdpdGhTdHJlYW1JbmZvOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZXh0cmFTdHJlYW1JbmZvW2VdPXQsdGhpcy5tZXJnZVN0cmVhbUluZm8oKSx0aGlzfSxtZXJnZVN0cmVhbUluZm86ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5leHRyYVN0cmVhbUluZm8pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuZXh0cmFTdHJlYW1JbmZvLGUpJiYodGhpcy5zdHJlYW1JbmZvW2VdPXRoaXMuZXh0cmFTdHJlYW1JbmZvW2VdKX0sbG9jazpmdW5jdGlvbigpe2lmKHRoaXMuaXNMb2NrZWQpdGhyb3cgbmV3IEVycm9yKCJUaGUgc3RyZWFtICciK3RoaXMrIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLiIpO3RoaXMuaXNMb2NrZWQ9ITAsdGhpcy5wcmV2aW91cyYmdGhpcy5wcmV2aW91cy5sb2NrKCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGU9IldvcmtlciAiK3RoaXMubmFtZTtyZXR1cm4gdGhpcy5wcmV2aW91cz90aGlzLnByZXZpb3VzKyIgLT4gIitlOmV9fSx0LmV4cG9ydHM9cn0se31dLDI5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbHMiKSxpPWUoIi4vQ29udmVydFdvcmtlciIpLGE9ZSgiLi9HZW5lcmljV29ya2VyIiksbz1lKCIuLi9iYXNlNjQiKSxjPWUoIi4uL3N1cHBvcnQiKSxzPWUoIi4uL2V4dGVybmFsIiksbD1udWxsO2lmKGMubm9kZXN0cmVhbSl0cnl7bD1lKCIuLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlciIpfWNhdGNoKGUpe31mdW5jdGlvbiB1KGUsdCl7cmV0dXJuIG5ldyBzLlByb21pc2UoKGZ1bmN0aW9uKG4saSl7dmFyIGE9W10sYz1lLl9pbnRlcm5hbFR5cGUscz1lLl9vdXRwdXRUeXBlLGw9ZS5fbWltZVR5cGU7ZS5vbigiZGF0YSIsKGZ1bmN0aW9uKGUsbil7YS5wdXNoKGUpLHQmJnQobil9KSkub24oImVycm9yIiwoZnVuY3Rpb24oZSl7YT1bXSxpKGUpfSkpLm9uKCJlbmQiLChmdW5jdGlvbigpe3RyeXt2YXIgZT1mdW5jdGlvbihlLHQsbil7c3dpdGNoKGUpe2Nhc2UiYmxvYiI6cmV0dXJuIHIubmV3QmxvYihyLnRyYW5zZm9ybVRvKCJhcnJheWJ1ZmZlciIsdCksbik7Y2FzZSJiYXNlNjQiOnJldHVybiBvLmVuY29kZSh0KTtkZWZhdWx0OnJldHVybiByLnRyYW5zZm9ybVRvKGUsdCl9fShzLGZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLGk9bnVsbCxhPTA7Zm9yKG49MDtuPHQubGVuZ3RoO24rKylhKz10W25dLmxlbmd0aDtzd2l0Y2goZSl7Y2FzZSJzdHJpbmciOnJldHVybiB0LmpvaW4oIiIpO2Nhc2UiYXJyYXkiOnJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLHQpO2Nhc2UidWludDhhcnJheSI6Zm9yKGk9bmV3IFVpbnQ4QXJyYXkoYSksbj0wO248dC5sZW5ndGg7bisrKWkuc2V0KHRbbl0scikscis9dFtuXS5sZW5ndGg7cmV0dXJuIGk7Y2FzZSJub2RlYnVmZmVyIjpyZXR1cm4gcC5jb25jYXQodCk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImNvbmNhdCA6IHVuc3VwcG9ydGVkIHR5cGUgJyIrZSsiJyIpfX0oYyxhKSxsKTtuKGUpfWNhdGNoKGUpe2koZSl9YT1bXX0pKS5yZXN1bWUoKX0pKX1mdW5jdGlvbiBmKGUsdCxuKXt2YXIgbz10O3N3aXRjaCh0KXtjYXNlImJsb2IiOmNhc2UiYXJyYXlidWZmZXIiOm89InVpbnQ4YXJyYXkiO2JyZWFrO2Nhc2UiYmFzZTY0IjpvPSJzdHJpbmcifXRyeXt0aGlzLl9pbnRlcm5hbFR5cGU9byx0aGlzLl9vdXRwdXRUeXBlPXQsdGhpcy5fbWltZVR5cGU9bixyLmNoZWNrU3VwcG9ydChvKSx0aGlzLl93b3JrZXI9ZS5waXBlKG5ldyBpKG8pKSxlLmxvY2soKX1jYXRjaChlKXt0aGlzLl93b3JrZXI9bmV3IGEoImVycm9yIiksdGhpcy5fd29ya2VyLmVycm9yKGUpfX1mLnByb3RvdHlwZT17YWNjdW11bGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4gdSh0aGlzLGUpfSxvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuImRhdGEiPT09ZT90aGlzLl93b3JrZXIub24oZSwoZnVuY3Rpb24oZSl7dC5jYWxsKG4sZS5kYXRhLGUubWV0YSl9KSk6dGhpcy5fd29ya2VyLm9uKGUsKGZ1bmN0aW9uKCl7ci5kZWxheSh0LGFyZ3VtZW50cyxuKX0pKSx0aGlzfSxyZXN1bWU6ZnVuY3Rpb24oKXtyZXR1cm4gci5kZWxheSh0aGlzLl93b3JrZXIucmVzdW1lLFtdLHRoaXMuX3dvcmtlciksdGhpc30scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd29ya2VyLnBhdXNlKCksdGhpc30sdG9Ob2RlanNTdHJlYW06ZnVuY3Rpb24oZSl7aWYoci5jaGVja1N1cHBvcnQoIm5vZGVzdHJlYW0iKSwibm9kZWJ1ZmZlciIhPT10aGlzLl9vdXRwdXRUeXBlKXRocm93IG5ldyBFcnJvcih0aGlzLl9vdXRwdXRUeXBlKyIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIG1ldGhvZCIpO3JldHVybiBuZXcgbCh0aGlzLHtvYmplY3RNb2RlOiJub2RlYnVmZmVyIiE9PXRoaXMuX291dHB1dFR5cGV9LGUpfX0sdC5leHBvcnRzPWZ9LHsiLi4vYmFzZTY0IjoxLCIuLi9leHRlcm5hbCI6NiwiLi4vbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIiOjEzLCIuLi9zdXBwb3J0IjozMCwiLi4vdXRpbHMiOjMyLCIuL0NvbnZlcnRXb3JrZXIiOjI0LCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMzA6W2Z1bmN0aW9uKGUsdCxuKXtpZihuLmJhc2U2ND0hMCxuLmFycmF5PSEwLG4uc3RyaW5nPSEwLG4uYXJyYXlidWZmZXI9InVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmInVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5LG4ubm9kZWJ1ZmZlcj12b2lkIDAhPT1wLG4udWludDhhcnJheT0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXksInVuZGVmaW5lZCI9PXR5cGVvZiBBcnJheUJ1ZmZlciluLmJsb2I9ITE7ZWxzZXt2YXIgcj1uZXcgQXJyYXlCdWZmZXIoMCk7dHJ5e24uYmxvYj0wPT09bmV3IEJsb2IoW3JdLHt0eXBlOiJhcHBsaWNhdGlvbi96aXAifSkuc2l6ZX1jYXRjaChlKXt0cnl7dmFyIGk9bmV3KHNlbGYuQmxvYkJ1aWxkZXJ8fHNlbGYuV2ViS2l0QmxvYkJ1aWxkZXJ8fHNlbGYuTW96QmxvYkJ1aWxkZXJ8fHNlbGYuTVNCbG9iQnVpbGRlcik7aS5hcHBlbmQociksbi5ibG9iPTA9PT1pLmdldEJsb2IoImFwcGxpY2F0aW9uL3ppcCIpLnNpemV9Y2F0Y2goZSl7bi5ibG9iPSExfX19dHJ5e24ubm9kZXN0cmVhbT0hIWUoInJlYWRhYmxlLXN0cmVhbSIpLlJlYWRhYmxlfWNhdGNoKGUpe24ubm9kZXN0cmVhbT0hMX19LHsicmVhZGFibGUtc3RyZWFtIjoxNn1dLDMxOltmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPWUoIi4vdXRpbHMiKSxpPWUoIi4vc3VwcG9ydCIpLGE9ZSgiLi9ub2RlanNVdGlscyIpLG89ZSgiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLGM9bmV3IEFycmF5KDI1Nikscz0wO3M8MjU2O3MrKyljW3NdPTI1Mjw9cz82OjI0ODw9cz81OjI0MDw9cz80OjIyNDw9cz8zOjE5Mjw9cz8yOjE7ZnVuY3Rpb24gbCgpe28uY2FsbCh0aGlzLCJ1dGYtOCBkZWNvZGUiKSx0aGlzLmxlZnRPdmVyPW51bGx9ZnVuY3Rpb24gdSgpe28uY2FsbCh0aGlzLCJ1dGYtOCBlbmNvZGUiKX1jWzI1NF09Y1syNTRdPTEsbi51dGY4ZW5jb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBpLm5vZGVidWZmZXI/YS5uZXdCdWZmZXJGcm9tKGUsInV0Zi04Iik6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGEsbyxjPWUubGVuZ3RoLHM9MDtmb3IoYT0wO2E8YzthKyspNTUyOTY9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQoYSkpKSYmYSsxPGMmJjU2MzIwPT0oNjQ1MTImKHI9ZS5jaGFyQ29kZUF0KGErMSkpKSYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoci01NjMyMCksYSsrKSxzKz1uPDEyOD8xOm48MjA0OD8yOm48NjU1MzY/Mzo0O2Zvcih0PWkudWludDhhcnJheT9uZXcgVWludDhBcnJheShzKTpuZXcgQXJyYXkocyksYT1vPTA7bzxzO2ErKyk1NTI5Nj09KDY0NTEyJihuPWUuY2hhckNvZGVBdChhKSkpJiZhKzE8YyYmNTYzMjA9PSg2NDUxMiYocj1lLmNoYXJDb2RlQXQoYSsxKSkpJiYobj02NTUzNisobi01NTI5Njw8MTApKyhyLTU2MzIwKSxhKyspLG48MTI4P3RbbysrXT1uOihuPDIwNDg/dFtvKytdPTE5MnxuPj4+Njoobjw2NTUzNj90W28rK109MjI0fG4+Pj4xMjoodFtvKytdPTI0MHxuPj4+MTgsdFtvKytdPTEyOHxuPj4+MTImNjMpLHRbbysrXT0xMjh8bj4+PjYmNjMpLHRbbysrXT0xMjh8NjMmbik7cmV0dXJuIHR9KGUpfSxuLnV0ZjhkZWNvZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGkubm9kZWJ1ZmZlcj9yLnRyYW5zZm9ybVRvKCJub2RlYnVmZmVyIixlKS50b1N0cmluZygidXRmLTgiKTpmdW5jdGlvbihlKXt2YXIgdCxuLGksYSxvPWUubGVuZ3RoLHM9bmV3IEFycmF5KDIqbyk7Zm9yKHQ9bj0wO3Q8bzspaWYoKGk9ZVt0KytdKTwxMjgpc1tuKytdPWk7ZWxzZSBpZig0PChhPWNbaV0pKXNbbisrXT02NTUzMyx0Kz1hLTE7ZWxzZXtmb3IoaSY9Mj09PWE/MzE6Mz09PWE/MTU6NzsxPGEmJnQ8bzspaT1pPDw2fDYzJmVbdCsrXSxhLS07MTxhP3NbbisrXT02NTUzMzppPDY1NTM2P3NbbisrXT1pOihpLT02NTUzNixzW24rK109NTUyOTZ8aT4+MTAmMTAyMyxzW24rK109NTYzMjB8MTAyMyZpKX1yZXR1cm4gcy5sZW5ndGghPT1uJiYocy5zdWJhcnJheT9zPXMuc3ViYXJyYXkoMCxuKTpzLmxlbmd0aD1uKSxyLmFwcGx5RnJvbUNoYXJDb2RlKHMpfShlPXIudHJhbnNmb3JtVG8oaS51aW50OGFycmF5PyJ1aW50OGFycmF5IjoiYXJyYXkiLGUpKX0sci5pbmhlcml0cyhsLG8pLGwucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihlKXt2YXIgdD1yLnRyYW5zZm9ybVRvKGkudWludDhhcnJheT8idWludDhhcnJheSI6ImFycmF5IixlLmRhdGEpO2lmKHRoaXMubGVmdE92ZXImJnRoaXMubGVmdE92ZXIubGVuZ3RoKXtpZihpLnVpbnQ4YXJyYXkpe3ZhciBhPXQ7KHQ9bmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGgrdGhpcy5sZWZ0T3Zlci5sZW5ndGgpKS5zZXQodGhpcy5sZWZ0T3ZlciwwKSx0LnNldChhLHRoaXMubGVmdE92ZXIubGVuZ3RoKX1lbHNlIHQ9dGhpcy5sZWZ0T3Zlci5jb25jYXQodCk7dGhpcy5sZWZ0T3Zlcj1udWxsfXZhciBvPWZ1bmN0aW9uKGUsdCl7dmFyIG47Zm9yKCh0PXR8fGUubGVuZ3RoKT5lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLG49dC0xOzA8PW4mJjEyOD09KDE5MiZlW25dKTspbi0tO3JldHVybiBuPDB8fDA9PT1uP3Q6bitjW2Vbbl1dPnQ/bjp0fSh0KSxzPXQ7byE9PXQubGVuZ3RoJiYoaS51aW50OGFycmF5PyhzPXQuc3ViYXJyYXkoMCxvKSx0aGlzLmxlZnRPdmVyPXQuc3ViYXJyYXkobyx0Lmxlbmd0aCkpOihzPXQuc2xpY2UoMCxvKSx0aGlzLmxlZnRPdmVyPXQuc2xpY2Uobyx0Lmxlbmd0aCkpKSx0aGlzLnB1c2goe2RhdGE6bi51dGY4ZGVjb2RlKHMpLG1ldGE6ZS5tZXRhfSl9LGwucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7dGhpcy5sZWZ0T3ZlciYmdGhpcy5sZWZ0T3Zlci5sZW5ndGgmJih0aGlzLnB1c2goe2RhdGE6bi51dGY4ZGVjb2RlKHRoaXMubGVmdE92ZXIpLG1ldGE6e319KSx0aGlzLmxlZnRPdmVyPW51bGwpfSxuLlV0ZjhEZWNvZGVXb3JrZXI9bCxyLmluaGVyaXRzKHUsbyksdS5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKGUpe3RoaXMucHVzaCh7ZGF0YTpuLnV0ZjhlbmNvZGUoZS5kYXRhKSxtZXRhOmUubWV0YX0pfSxuLlV0ZjhFbmNvZGVXb3JrZXI9dX0seyIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6MjgsIi4vc3VwcG9ydCI6MzAsIi4vdXRpbHMiOjMyfV0sMzI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL3N1cHBvcnQiKSxpPWUoIi4vYmFzZTY0IiksYT1lKCIuL25vZGVqc1V0aWxzIiksbz1lKCIuL2V4dGVybmFsIik7ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZX1mdW5jdGlvbiBzKGUsdCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDsrK24pdFtuXT0yNTUmZS5jaGFyQ29kZUF0KG4pO3JldHVybiB0fWUoInNldGltbWVkaWF0ZSIpLG4ubmV3QmxvYj1mdW5jdGlvbihlLHQpe24uY2hlY2tTdXBwb3J0KCJibG9iIik7dHJ5e3JldHVybiBuZXcgQmxvYihbZV0se3R5cGU6dH0pfWNhdGNoKG4pe3RyeXt2YXIgcj1uZXcoc2VsZi5CbG9iQnVpbGRlcnx8c2VsZi5XZWJLaXRCbG9iQnVpbGRlcnx8c2VsZi5Nb3pCbG9iQnVpbGRlcnx8c2VsZi5NU0Jsb2JCdWlsZGVyKTtyZXR1cm4gci5hcHBlbmQoZSksci5nZXRCbG9iKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcigiQnVnIDogY2FuJ3QgY29uc3RydWN0IHRoZSBCbG9iLiIpfX19O3ZhciBsPXtzdHJpbmdpZnlCeUNodW5rOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxpPTAsYT1lLmxlbmd0aDtpZihhPD1uKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZSk7Zm9yKDtpPGE7KSJhcnJheSI9PT10fHwibm9kZWJ1ZmZlciI9PT10P3IucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZS5zbGljZShpLE1hdGgubWluKGkrbixhKSkpKTpyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGUuc3ViYXJyYXkoaSxNYXRoLm1pbihpK24sYSkpKSksaSs9bjtyZXR1cm4gci5qb2luKCIiKX0sc3RyaW5naWZ5QnlDaGFyOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0iIixuPTA7bjxlLmxlbmd0aDtuKyspdCs9U3RyaW5nLmZyb21DaGFyQ29kZShlW25dKTtyZXR1cm4gdH0sYXBwbHlDYW5CZVVzZWQ6e3VpbnQ4YXJyYXk6ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHIudWludDhhcnJheSYmMT09PVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheSgxKSkubGVuZ3RofWNhdGNoKGUpe3JldHVybiExfX0oKSxub2RlYnVmZmVyOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiByLm5vZGVidWZmZXImJjE9PT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsYS5hbGxvY0J1ZmZlcigxKSkubGVuZ3RofWNhdGNoKGUpe3JldHVybiExfX0oKX19O2Z1bmN0aW9uIHUoZSl7dmFyIHQ9NjU1MzYscj1uLmdldFR5cGVPZihlKSxpPSEwO2lmKCJ1aW50OGFycmF5Ij09PXI/aT1sLmFwcGx5Q2FuQmVVc2VkLnVpbnQ4YXJyYXk6Im5vZGVidWZmZXIiPT09ciYmKGk9bC5hcHBseUNhbkJlVXNlZC5ub2RlYnVmZmVyKSxpKWZvcig7MTx0Oyl0cnl7cmV0dXJuIGwuc3RyaW5naWZ5QnlDaHVuayhlLHIsdCl9Y2F0Y2goZSl7dD1NYXRoLmZsb29yKHQvMil9cmV0dXJuIGwuc3RyaW5naWZ5QnlDaGFyKGUpfWZ1bmN0aW9uIGYoZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0W25dPWVbbl07cmV0dXJuIHR9bi5hcHBseUZyb21DaGFyQ29kZT11O3ZhciBkPXt9O2Quc3RyaW5nPXtzdHJpbmc6YyxhcnJheTpmdW5jdGlvbihlKXtyZXR1cm4gcyhlLG5ldyBBcnJheShlLmxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gZC5zdHJpbmcudWludDhhcnJheShlKS5idWZmZXJ9LHVpbnQ4YXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIHMoZSxuZXcgVWludDhBcnJheShlLmxlbmd0aCkpfSxub2RlYnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBzKGUsYS5hbGxvY0J1ZmZlcihlLmxlbmd0aCkpfX0sZC5hcnJheT17c3RyaW5nOnUsYXJyYXk6YyxhcnJheWJ1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSkuYnVmZmVyfSx1aW50OGFycmF5OmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgVWludDhBcnJheShlKX0sbm9kZWJ1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gYS5uZXdCdWZmZXJGcm9tKGUpfX0sZC5hcnJheWJ1ZmZlcj17c3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiB1KG5ldyBVaW50OEFycmF5KGUpKX0sYXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIGYobmV3IFVpbnQ4QXJyYXkoZSksbmV3IEFycmF5KGUuYnl0ZUxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpjLHVpbnQ4YXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KGUpfSxub2RlYnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBhLm5ld0J1ZmZlckZyb20obmV3IFVpbnQ4QXJyYXkoZSkpfX0sZC51aW50OGFycmF5PXtzdHJpbmc6dSxhcnJheTpmdW5jdGlvbihlKXtyZXR1cm4gZihlLG5ldyBBcnJheShlLmxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gZS5idWZmZXJ9LHVpbnQ4YXJyYXk6Yyxub2RlYnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBhLm5ld0J1ZmZlckZyb20oZSl9fSxkLm5vZGVidWZmZXI9e3N0cmluZzp1LGFycmF5OmZ1bmN0aW9uKGUpe3JldHVybiBmKGUsbmV3IEFycmF5KGUubGVuZ3RoKSl9LGFycmF5YnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBkLm5vZGVidWZmZXIudWludDhhcnJheShlKS5idWZmZXJ9LHVpbnQ4YXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSxuZXcgVWludDhBcnJheShlLmxlbmd0aCkpfSxub2RlYnVmZmVyOmN9LG4udHJhbnNmb3JtVG89ZnVuY3Rpb24oZSx0KXtpZih0PXR8fCIiLCFlKXJldHVybiB0O24uY2hlY2tTdXBwb3J0KGUpO3ZhciByPW4uZ2V0VHlwZU9mKHQpO3JldHVybiBkW3JdW2VdKHQpfSxuLnJlc29sdmU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuc3BsaXQoIi8iKSxuPVtdLHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGk9dFtyXTsiLiI9PT1pfHwiIj09PWkmJjAhPT1yJiZyIT09dC5sZW5ndGgtMXx8KCIuLiI9PT1pP24ucG9wKCk6bi5wdXNoKGkpKX1yZXR1cm4gbi5qb2luKCIvIil9LG4uZ2V0VHlwZU9mPWZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpPyJhcnJheSI6ci5ub2RlYnVmZmVyJiZhLmlzQnVmZmVyKGUpPyJub2RlYnVmZmVyIjpyLnVpbnQ4YXJyYXkmJmUgaW5zdGFuY2VvZiBVaW50OEFycmF5PyJ1aW50OGFycmF5IjpyLmFycmF5YnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ImFycmF5YnVmZmVyIjp2b2lkIDB9LG4uY2hlY2tTdXBwb3J0PWZ1bmN0aW9uKGUpe2lmKCFyW2UudG9Mb3dlckNhc2UoKV0pdGhyb3cgbmV3IEVycm9yKGUrIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcGxhdGZvcm0iKX0sbi5NQVhfVkFMVUVfMTZCSVRTPTY1NTM1LG4uTUFYX1ZBTFVFXzMyQklUUz0tMSxuLnByZXR0eT1mdW5jdGlvbihlKXt2YXIgdCxuLHI9IiI7Zm9yKG49MDtuPChlfHwiIikubGVuZ3RoO24rKylyKz0iXFx4IisoKHQ9ZS5jaGFyQ29kZUF0KG4pKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7cmV0dXJuIHJ9LG4uZGVsYXk9ZnVuY3Rpb24oZSx0LG4pe3NldEltbWVkaWF0ZSgoZnVuY3Rpb24oKXtlLmFwcGx5KG58fG51bGwsdHx8W10pfSkpfSxuLmluaGVyaXRzPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbigpe31uLnByb3RvdHlwZT10LnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgbn0sbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG49e307Zm9yKGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKWZvcih0IGluIGFyZ3VtZW50c1tlXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJndW1lbnRzW2VdLHQpJiZ2b2lkIDA9PT1uW3RdJiYoblt0XT1hcmd1bWVudHNbZV1bdF0pO3JldHVybiBufSxuLnByZXBhcmVDb250ZW50PWZ1bmN0aW9uKGUsdCxhLGMsbCl7cmV0dXJuIG8uUHJvbWlzZS5yZXNvbHZlKHQpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiByLmJsb2ImJihlIGluc3RhbmNlb2YgQmxvYnx8LTEhPT1bIltvYmplY3QgRmlsZV0iLCJbb2JqZWN0IEJsb2JdIl0uaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBGaWxlUmVhZGVyP25ldyBvLlByb21pc2UoKGZ1bmN0aW9uKHQsbil7dmFyIHI9bmV3IEZpbGVSZWFkZXI7ci5vbmxvYWQ9ZnVuY3Rpb24oZSl7dChlLnRhcmdldC5yZXN1bHQpfSxyLm9uZXJyb3I9ZnVuY3Rpb24oZSl7bihlLnRhcmdldC5lcnJvcil9LHIucmVhZEFzQXJyYXlCdWZmZXIoZSl9KSk6ZX0pKS50aGVuKChmdW5jdGlvbih0KXt2YXIgdT1uLmdldFR5cGVPZih0KTtyZXR1cm4gdT8oImFycmF5YnVmZmVyIj09PXU/dD1uLnRyYW5zZm9ybVRvKCJ1aW50OGFycmF5Iix0KToic3RyaW5nIj09PXUmJihsP3Q9aS5kZWNvZGUodCk6YSYmITAhPT1jJiYodD1mdW5jdGlvbihlKXtyZXR1cm4gcyhlLHIudWludDhhcnJheT9uZXcgVWludDhBcnJheShlLmxlbmd0aCk6bmV3IEFycmF5KGUubGVuZ3RoKSl9KHQpKSksdCk6by5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkNhbid0IHJlYWQgdGhlIGRhdGEgb2YgJyIrZSsiJy4gSXMgaXQgaW4gYSBzdXBwb3J0ZWQgSmF2YVNjcmlwdCB0eXBlIChTdHJpbmcsIEJsb2IsIEFycmF5QnVmZmVyLCBldGMpID8iKSl9KSl9fSx7Ii4vYmFzZTY0IjoxLCIuL2V4dGVybmFsIjo2LCIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdXBwb3J0IjozMCxzZXRpbW1lZGlhdGU6NTR9XSwzMzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vcmVhZGVyL3JlYWRlckZvciIpLGk9ZSgiLi91dGlscyIpLGE9ZSgiLi9zaWduYXR1cmUiKSxvPWUoIi4vemlwRW50cnkiKSxjPWUoIi4vc3VwcG9ydCIpO2Z1bmN0aW9uIHMoZSl7dGhpcy5maWxlcz1bXSx0aGlzLmxvYWRPcHRpb25zPWV9cy5wcm90b3R5cGU9e2NoZWNrU2lnbmF0dXJlOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLnJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmUoZSkpe3RoaXMucmVhZGVyLmluZGV4LT00O3ZhciB0PXRoaXMucmVhZGVyLnJlYWRTdHJpbmcoNCk7dGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwIG9yIGJ1ZzogdW5leHBlY3RlZCBzaWduYXR1cmUgKCIraS5wcmV0dHkodCkrIiwgZXhwZWN0ZWQgIitpLnByZXR0eShlKSsiKSIpfX0saXNTaWduYXR1cmU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnJlYWRlci5pbmRleDt0aGlzLnJlYWRlci5zZXRJbmRleChlKTt2YXIgcj10aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpPT09dDtyZXR1cm4gdGhpcy5yZWFkZXIuc2V0SW5kZXgobikscn0scmVhZEJsb2NrRW5kT2ZDZW50cmFsOmZ1bmN0aW9uKCl7dGhpcy5kaXNrTnVtYmVyPXRoaXMucmVhZGVyLnJlYWRJbnQoMiksdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrPXRoaXMucmVhZGVyLnJlYWRJbnQoMiksdGhpcy5jZW50cmFsRGlyUmVjb3Jkcz10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuY2VudHJhbERpclNpemU9dGhpcy5yZWFkZXIucmVhZEludCg0KSx0aGlzLmNlbnRyYWxEaXJPZmZzZXQ9dGhpcy5yZWFkZXIucmVhZEludCg0KSx0aGlzLnppcENvbW1lbnRMZW5ndGg9dGhpcy5yZWFkZXIucmVhZEludCgyKTt2YXIgZT10aGlzLnJlYWRlci5yZWFkRGF0YSh0aGlzLnppcENvbW1lbnRMZW5ndGgpLHQ9Yy51aW50OGFycmF5PyJ1aW50OGFycmF5IjoiYXJyYXkiLG49aS50cmFuc2Zvcm1Ubyh0LGUpO3RoaXMuemlwQ29tbWVudD10aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKG4pfSxyZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbDpmdW5jdGlvbigpe3RoaXMuemlwNjRFbmRPZkNlbnRyYWxTaXplPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5yZWFkZXIuc2tpcCg0KSx0aGlzLmRpc2tOdW1iZXI9dGhpcy5yZWFkZXIucmVhZEludCg0KSx0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2s9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLmNlbnRyYWxEaXJSZWNvcmRzPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5jZW50cmFsRGlyU2l6ZT10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMuY2VudHJhbERpck9mZnNldD10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMuemlwNjRFeHRlbnNpYmxlRGF0YT17fTtmb3IodmFyIGUsdCxuLHI9dGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUtNDQ7MDxyOyllPXRoaXMucmVhZGVyLnJlYWRJbnQoMiksdD10aGlzLnJlYWRlci5yZWFkSW50KDQpLG49dGhpcy5yZWFkZXIucmVhZERhdGEodCksdGhpcy56aXA2NEV4dGVuc2libGVEYXRhW2VdPXtpZDplLGxlbmd0aDp0LHZhbHVlOm59fSxyZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3I6ZnVuY3Rpb24oKXtpZih0aGlzLmRpc2tXaXRoWmlwNjRDZW50cmFsRGlyU3RhcnQ9dGhpcy5yZWFkZXIucmVhZEludCg0KSx0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXI9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLmRpc2tzQ291bnQ9dGhpcy5yZWFkZXIucmVhZEludCg0KSwxPHRoaXMuZGlza3NDb3VudCl0aHJvdyBuZXcgRXJyb3IoIk11bHRpLXZvbHVtZXMgemlwIGFyZSBub3Qgc3VwcG9ydGVkIil9LHJlYWRMb2NhbEZpbGVzOmZ1bmN0aW9uKCl7dmFyIGUsdDtmb3IoZT0wO2U8dGhpcy5maWxlcy5sZW5ndGg7ZSsrKXQ9dGhpcy5maWxlc1tlXSx0aGlzLnJlYWRlci5zZXRJbmRleCh0LmxvY2FsSGVhZGVyT2Zmc2V0KSx0aGlzLmNoZWNrU2lnbmF0dXJlKGEuTE9DQUxfRklMRV9IRUFERVIpLHQucmVhZExvY2FsUGFydCh0aGlzLnJlYWRlciksdC5oYW5kbGVVVEY4KCksdC5wcm9jZXNzQXR0cmlidXRlcygpfSxyZWFkQ2VudHJhbERpcjpmdW5jdGlvbigpe3ZhciBlO2Zvcih0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLmNlbnRyYWxEaXJPZmZzZXQpO3RoaXMucmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZShhLkNFTlRSQUxfRklMRV9IRUFERVIpOykoZT1uZXcgbyh7emlwNjQ6dGhpcy56aXA2NH0sdGhpcy5sb2FkT3B0aW9ucykpLnJlYWRDZW50cmFsUGFydCh0aGlzLnJlYWRlciksdGhpcy5maWxlcy5wdXNoKGUpO2lmKHRoaXMuY2VudHJhbERpclJlY29yZHMhPT10aGlzLmZpbGVzLmxlbmd0aCYmMCE9PXRoaXMuY2VudHJhbERpclJlY29yZHMmJjA9PT10aGlzLmZpbGVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXAgb3IgYnVnOiBleHBlY3RlZCAiK3RoaXMuY2VudHJhbERpclJlY29yZHMrIiByZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3QgIit0aGlzLmZpbGVzLmxlbmd0aCl9LHJlYWRFbmRPZkNlbnRyYWw6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShhLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7aWYoZTwwKXRocm93IHRoaXMuaXNTaWduYXR1cmUoMCxhLkxPQ0FMX0ZJTEVfSEVBREVSKT9uZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXA6IGNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5Iik6bmV3IEVycm9yKCJDYW4ndCBmaW5kIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSA6IGlzIHRoaXMgYSB6aXAgZmlsZSA/IElmIGl0IGlzLCBzZWUgaHR0cHM6Ly9zdHVrLmdpdGh1Yi5pby9qc3ppcC9kb2N1bWVudGF0aW9uL2hvd3RvL3JlYWRfemlwLmh0bWwiKTt0aGlzLnJlYWRlci5zZXRJbmRleChlKTt2YXIgdD1lO2lmKHRoaXMuY2hlY2tTaWduYXR1cmUoYS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpLHRoaXMucmVhZEJsb2NrRW5kT2ZDZW50cmFsKCksdGhpcy5kaXNrTnVtYmVyPT09aS5NQVhfVkFMVUVfMTZCSVRTfHx0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PT09aS5NQVhfVkFMVUVfMTZCSVRTfHx0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzaz09PWkuTUFYX1ZBTFVFXzE2QklUU3x8dGhpcy5jZW50cmFsRGlyUmVjb3Jkcz09PWkuTUFYX1ZBTFVFXzE2QklUU3x8dGhpcy5jZW50cmFsRGlyU2l6ZT09PWkuTUFYX1ZBTFVFXzMyQklUU3x8dGhpcy5jZW50cmFsRGlyT2Zmc2V0PT09aS5NQVhfVkFMVUVfMzJCSVRTKXtpZih0aGlzLnppcDY0PSEwLChlPXRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKGEuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUikpPDApdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBjYW4ndCBmaW5kIHRoZSBaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciIpO2lmKHRoaXMucmVhZGVyLnNldEluZGV4KGUpLHRoaXMuY2hlY2tTaWduYXR1cmUoYS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKSx0aGlzLnJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsTG9jYXRvcigpLCF0aGlzLmlzU2lnbmF0dXJlKHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpcixhLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCkmJih0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXI9dGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoYS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpLHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpcjwwKSl0aHJvdyBuZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXA6IGNhbid0IGZpbmQgdGhlIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSIpO3RoaXMucmVhZGVyLnNldEluZGV4KHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciksdGhpcy5jaGVja1NpZ25hdHVyZShhLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCksdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbCgpfXZhciBuPXRoaXMuY2VudHJhbERpck9mZnNldCt0aGlzLmNlbnRyYWxEaXJTaXplO3RoaXMuemlwNjQmJihuKz0yMCxuKz0xMit0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZSk7dmFyIHI9dC1uO2lmKDA8cil0aGlzLmlzU2lnbmF0dXJlKHQsYS5DRU5UUkFMX0ZJTEVfSEVBREVSKXx8KHRoaXMucmVhZGVyLnplcm89cik7ZWxzZSBpZihyPDApdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBtaXNzaW5nICIrTWF0aC5hYnMocikrIiBieXRlcy4iKX0scHJlcGFyZVJlYWRlcjpmdW5jdGlvbihlKXt0aGlzLnJlYWRlcj1yKGUpfSxsb2FkOmZ1bmN0aW9uKGUpe3RoaXMucHJlcGFyZVJlYWRlcihlKSx0aGlzLnJlYWRFbmRPZkNlbnRyYWwoKSx0aGlzLnJlYWRDZW50cmFsRGlyKCksdGhpcy5yZWFkTG9jYWxGaWxlcygpfX0sdC5leHBvcnRzPXN9LHsiLi9yZWFkZXIvcmVhZGVyRm9yIjoyMiwiLi9zaWduYXR1cmUiOjIzLCIuL3N1cHBvcnQiOjMwLCIuL3V0aWxzIjozMiwiLi96aXBFbnRyeSI6MzR9XSwzNDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vcmVhZGVyL3JlYWRlckZvciIpLGk9ZSgiLi91dGlscyIpLGE9ZSgiLi9jb21wcmVzc2VkT2JqZWN0Iiksbz1lKCIuL2NyYzMyIiksYz1lKCIuL3V0ZjgiKSxzPWUoIi4vY29tcHJlc3Npb25zIiksbD1lKCIuL3N1cHBvcnQiKTtmdW5jdGlvbiB1KGUsdCl7dGhpcy5vcHRpb25zPWUsdGhpcy5sb2FkT3B0aW9ucz10fXUucHJvdG90eXBlPXtpc0VuY3J5cHRlZDpmdW5jdGlvbigpe3JldHVybiAxPT0oMSZ0aGlzLmJpdEZsYWcpfSx1c2VVVEY4OmZ1bmN0aW9uKCl7cmV0dXJuIDIwNDg9PSgyMDQ4JnRoaXMuYml0RmxhZyl9LHJlYWRMb2NhbFBhcnQ6ZnVuY3Rpb24oZSl7dmFyIHQsbjtpZihlLnNraXAoMjIpLHRoaXMuZmlsZU5hbWVMZW5ndGg9ZS5yZWFkSW50KDIpLG49ZS5yZWFkSW50KDIpLHRoaXMuZmlsZU5hbWU9ZS5yZWFkRGF0YSh0aGlzLmZpbGVOYW1lTGVuZ3RoKSxlLnNraXAobiksLTE9PT10aGlzLmNvbXByZXNzZWRTaXplfHwtMT09PXRoaXMudW5jb21wcmVzc2VkU2l6ZSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZyBvciBjb3JydXB0ZWQgemlwIDogZGlkbid0IGdldCBlbm91Z2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKGNvbXByZXNzZWRTaXplID09PSAtMSB8fCB1bmNvbXByZXNzZWRTaXplID09PSAtMSkiKTtpZihudWxsPT09KHQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIHMpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsdCkmJnNbdF0ubWFnaWM9PT1lKXJldHVybiBzW3RdO3JldHVybiBudWxsfSh0aGlzLmNvbXByZXNzaW9uTWV0aG9kKSkpdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwIDogY29tcHJlc3Npb24gIitpLnByZXR0eSh0aGlzLmNvbXByZXNzaW9uTWV0aG9kKSsiIHVua25vd24gKGlubmVyIGZpbGUgOiAiK2kudHJhbnNmb3JtVG8oInN0cmluZyIsdGhpcy5maWxlTmFtZSkrIikiKTt0aGlzLmRlY29tcHJlc3NlZD1uZXcgYSh0aGlzLmNvbXByZXNzZWRTaXplLHRoaXMudW5jb21wcmVzc2VkU2l6ZSx0aGlzLmNyYzMyLHQsZS5yZWFkRGF0YSh0aGlzLmNvbXByZXNzZWRTaXplKSl9LHJlYWRDZW50cmFsUGFydDpmdW5jdGlvbihlKXt0aGlzLnZlcnNpb25NYWRlQnk9ZS5yZWFkSW50KDIpLGUuc2tpcCgyKSx0aGlzLmJpdEZsYWc9ZS5yZWFkSW50KDIpLHRoaXMuY29tcHJlc3Npb25NZXRob2Q9ZS5yZWFkU3RyaW5nKDIpLHRoaXMuZGF0ZT1lLnJlYWREYXRlKCksdGhpcy5jcmMzMj1lLnJlYWRJbnQoNCksdGhpcy5jb21wcmVzc2VkU2l6ZT1lLnJlYWRJbnQoNCksdGhpcy51bmNvbXByZXNzZWRTaXplPWUucmVhZEludCg0KTt2YXIgdD1lLnJlYWRJbnQoMik7aWYodGhpcy5leHRyYUZpZWxkc0xlbmd0aD1lLnJlYWRJbnQoMiksdGhpcy5maWxlQ29tbWVudExlbmd0aD1lLnJlYWRJbnQoMiksdGhpcy5kaXNrTnVtYmVyU3RhcnQ9ZS5yZWFkSW50KDIpLHRoaXMuaW50ZXJuYWxGaWxlQXR0cmlidXRlcz1lLnJlYWRJbnQoMiksdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzPWUucmVhZEludCg0KSx0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0PWUucmVhZEludCg0KSx0aGlzLmlzRW5jcnlwdGVkKCkpdGhyb3cgbmV3IEVycm9yKCJFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkIik7ZS5za2lwKHQpLHRoaXMucmVhZEV4dHJhRmllbGRzKGUpLHRoaXMucGFyc2VaSVA2NEV4dHJhRmllbGQoZSksdGhpcy5maWxlQ29tbWVudD1lLnJlYWREYXRhKHRoaXMuZmlsZUNvbW1lbnRMZW5ndGgpfSxwcm9jZXNzQXR0cmlidXRlczpmdW5jdGlvbigpe3RoaXMudW5peFBlcm1pc3Npb25zPW51bGwsdGhpcy5kb3NQZXJtaXNzaW9ucz1udWxsO3ZhciBlPXRoaXMudmVyc2lvbk1hZGVCeT4+ODt0aGlzLmRpcj0hISgxNiZ0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpLDA9PWUmJih0aGlzLmRvc1Blcm1pc3Npb25zPTYzJnRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyksMz09ZSYmKHRoaXMudW5peFBlcm1pc3Npb25zPXRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcz4+MTYmNjU1MzUpLHRoaXMuZGlyfHwiLyIhPT10aGlzLmZpbGVOYW1lU3RyLnNsaWNlKC0xKXx8KHRoaXMuZGlyPSEwKX0scGFyc2VaSVA2NEV4dHJhRmllbGQ6ZnVuY3Rpb24oKXtpZih0aGlzLmV4dHJhRmllbGRzWzFdKXt2YXIgZT1yKHRoaXMuZXh0cmFGaWVsZHNbMV0udmFsdWUpO3RoaXMudW5jb21wcmVzc2VkU2l6ZT09PWkuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMudW5jb21wcmVzc2VkU2l6ZT1lLnJlYWRJbnQoOCkpLHRoaXMuY29tcHJlc3NlZFNpemU9PT1pLk1BWF9WQUxVRV8zMkJJVFMmJih0aGlzLmNvbXByZXNzZWRTaXplPWUucmVhZEludCg4KSksdGhpcy5sb2NhbEhlYWRlck9mZnNldD09PWkuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMubG9jYWxIZWFkZXJPZmZzZXQ9ZS5yZWFkSW50KDgpKSx0aGlzLmRpc2tOdW1iZXJTdGFydD09PWkuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMuZGlza051bWJlclN0YXJ0PWUucmVhZEludCg0KSl9fSxyZWFkRXh0cmFGaWVsZHM6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9ZS5pbmRleCt0aGlzLmV4dHJhRmllbGRzTGVuZ3RoO2Zvcih0aGlzLmV4dHJhRmllbGRzfHwodGhpcy5leHRyYUZpZWxkcz17fSk7ZS5pbmRleCs0PGk7KXQ9ZS5yZWFkSW50KDIpLG49ZS5yZWFkSW50KDIpLHI9ZS5yZWFkRGF0YShuKSx0aGlzLmV4dHJhRmllbGRzW3RdPXtpZDp0LGxlbmd0aDpuLHZhbHVlOnJ9O2Uuc2V0SW5kZXgoaSl9LGhhbmRsZVVURjg6ZnVuY3Rpb24oKXt2YXIgZT1sLnVpbnQ4YXJyYXk/InVpbnQ4YXJyYXkiOiJhcnJheSI7aWYodGhpcy51c2VVVEY4KCkpdGhpcy5maWxlTmFtZVN0cj1jLnV0ZjhkZWNvZGUodGhpcy5maWxlTmFtZSksdGhpcy5maWxlQ29tbWVudFN0cj1jLnV0ZjhkZWNvZGUodGhpcy5maWxlQ29tbWVudCk7ZWxzZXt2YXIgdD10aGlzLmZpbmRFeHRyYUZpZWxkVW5pY29kZVBhdGgoKTtpZihudWxsIT09dCl0aGlzLmZpbGVOYW1lU3RyPXQ7ZWxzZXt2YXIgbj1pLnRyYW5zZm9ybVRvKGUsdGhpcy5maWxlTmFtZSk7dGhpcy5maWxlTmFtZVN0cj10aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKG4pfXZhciByPXRoaXMuZmluZEV4dHJhRmllbGRVbmljb2RlQ29tbWVudCgpO2lmKG51bGwhPT1yKXRoaXMuZmlsZUNvbW1lbnRTdHI9cjtlbHNle3ZhciBhPWkudHJhbnNmb3JtVG8oZSx0aGlzLmZpbGVDb21tZW50KTt0aGlzLmZpbGVDb21tZW50U3RyPXRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoYSl9fX0sZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZXh0cmFGaWVsZHNbMjg3ODldO2lmKGUpe3ZhciB0PXIoZS52YWx1ZSk7cmV0dXJuIDEhPT10LnJlYWRJbnQoMSl8fG8odGhpcy5maWxlTmFtZSkhPT10LnJlYWRJbnQoNCk/bnVsbDpjLnV0ZjhkZWNvZGUodC5yZWFkRGF0YShlLmxlbmd0aC01KSl9cmV0dXJuIG51bGx9LGZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmV4dHJhRmllbGRzWzI1NDYxXTtpZihlKXt2YXIgdD1yKGUudmFsdWUpO3JldHVybiAxIT09dC5yZWFkSW50KDEpfHxvKHRoaXMuZmlsZUNvbW1lbnQpIT09dC5yZWFkSW50KDQpP251bGw6Yy51dGY4ZGVjb2RlKHQucmVhZERhdGEoZS5sZW5ndGgtNSkpfXJldHVybiBudWxsfX0sdC5leHBvcnRzPXV9LHsiLi9jb21wcmVzc2VkT2JqZWN0IjoyLCIuL2NvbXByZXNzaW9ucyI6MywiLi9jcmMzMiI6NCwiLi9yZWFkZXIvcmVhZGVyRm9yIjoyMiwiLi9zdXBwb3J0IjozMCwiLi91dGY4IjozMSwiLi91dGlscyI6MzJ9XSwzNTpbZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSx0LG4pe3RoaXMubmFtZT1lLHRoaXMuZGlyPW4uZGlyLHRoaXMuZGF0ZT1uLmRhdGUsdGhpcy5jb21tZW50PW4uY29tbWVudCx0aGlzLnVuaXhQZXJtaXNzaW9ucz1uLnVuaXhQZXJtaXNzaW9ucyx0aGlzLmRvc1Blcm1pc3Npb25zPW4uZG9zUGVybWlzc2lvbnMsdGhpcy5fZGF0YT10LHRoaXMuX2RhdGFCaW5hcnk9bi5iaW5hcnksdGhpcy5vcHRpb25zPXtjb21wcmVzc2lvbjpuLmNvbXByZXNzaW9uLGNvbXByZXNzaW9uT3B0aW9uczpuLmNvbXByZXNzaW9uT3B0aW9uc319dmFyIGk9ZSgiLi9zdHJlYW0vU3RyZWFtSGVscGVyIiksYT1lKCIuL3N0cmVhbS9EYXRhV29ya2VyIiksbz1lKCIuL3V0ZjgiKSxjPWUoIi4vY29tcHJlc3NlZE9iamVjdCIpLHM9ZSgiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpO3IucHJvdG90eXBlPXtpbnRlcm5hbFN0cmVhbTpmdW5jdGlvbihlKXt2YXIgdD1udWxsLG49InN0cmluZyI7dHJ5e2lmKCFlKXRocm93IG5ldyBFcnJvcigiTm8gb3V0cHV0IHR5cGUgc3BlY2lmaWVkLiIpO3ZhciByPSJzdHJpbmciPT09KG49ZS50b0xvd2VyQ2FzZSgpKXx8InRleHQiPT09bjsiYmluYXJ5c3RyaW5nIiE9PW4mJiJ0ZXh0IiE9PW58fChuPSJzdHJpbmciKSx0PXRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTt2YXIgYT0hdGhpcy5fZGF0YUJpbmFyeTthJiYhciYmKHQ9dC5waXBlKG5ldyBvLlV0ZjhFbmNvZGVXb3JrZXIpKSwhYSYmciYmKHQ9dC5waXBlKG5ldyBvLlV0ZjhEZWNvZGVXb3JrZXIpKX1jYXRjaChlKXsodD1uZXcgcygiZXJyb3IiKSkuZXJyb3IoZSl9cmV0dXJuIG5ldyBpKHQsbiwiIil9LGFzeW5jOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuaW50ZXJuYWxTdHJlYW0oZSkuYWNjdW11bGF0ZSh0KX0sbm9kZVN0cmVhbTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmludGVybmFsU3RyZWFtKGV8fCJub2RlYnVmZmVyIikudG9Ob2RlanNTdHJlYW0odCl9LF9jb21wcmVzc1dvcmtlcjpmdW5jdGlvbihlLHQpe2lmKHRoaXMuX2RhdGEgaW5zdGFuY2VvZiBjJiZ0aGlzLl9kYXRhLmNvbXByZXNzaW9uLm1hZ2ljPT09ZS5tYWdpYylyZXR1cm4gdGhpcy5fZGF0YS5nZXRDb21wcmVzc2VkV29ya2VyKCk7dmFyIG49dGhpcy5fZGVjb21wcmVzc1dvcmtlcigpO3JldHVybiB0aGlzLl9kYXRhQmluYXJ5fHwobj1uLnBpcGUobmV3IG8uVXRmOEVuY29kZVdvcmtlcikpLGMuY3JlYXRlV29ya2VyRnJvbShuLGUsdCl9LF9kZWNvbXByZXNzV29ya2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGEgaW5zdGFuY2VvZiBjP3RoaXMuX2RhdGEuZ2V0Q29udGVudFdvcmtlcigpOnRoaXMuX2RhdGEgaW5zdGFuY2VvZiBzP3RoaXMuX2RhdGE6bmV3IGEodGhpcy5fZGF0YSl9fTtmb3IodmFyIGw9WyJhc1RleHQiLCJhc0JpbmFyeSIsImFzTm9kZUJ1ZmZlciIsImFzVWludDhBcnJheSIsImFzQXJyYXlCdWZmZXIiXSx1PWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLiIpfSxmPTA7ZjxsLmxlbmd0aDtmKyspci5wcm90b3R5cGVbbFtmXV09dTt0LmV4cG9ydHM9cn0seyIuL2NvbXByZXNzZWRPYmplY3QiOjIsIi4vc3RyZWFtL0RhdGFXb3JrZXIiOjI3LCIuL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi9zdHJlYW0vU3RyZWFtSGVscGVyIjoyOSwiLi91dGY4IjozMX1dLDM2OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKGUpe3ZhciBuLHIsaT1lLk11dGF0aW9uT2JzZXJ2ZXJ8fGUuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtpZihpKXt2YXIgYT0wLG89bmV3IGkodSksYz1lLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKTtvLm9ic2VydmUoYyx7Y2hhcmFjdGVyRGF0YTohMH0pLG49ZnVuY3Rpb24oKXtjLmRhdGE9YT0rK2ElMn19ZWxzZSBpZihlLnNldEltbWVkaWF0ZXx8dm9pZCAwPT09ZS5NZXNzYWdlQ2hhbm5lbCluPSJkb2N1bWVudCJpbiBlJiYib25yZWFkeXN0YXRlY2hhbmdlImluIGUuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik/ZnVuY3Rpb24oKXt2YXIgdD1lLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3Qub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7dSgpLHQub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbH0sZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodCl9OmZ1bmN0aW9uKCl7c2V0VGltZW91dCh1LDApfTtlbHNle3ZhciBzPW5ldyBlLk1lc3NhZ2VDaGFubmVsO3MucG9ydDEub25tZXNzYWdlPXUsbj1mdW5jdGlvbigpe3MucG9ydDIucG9zdE1lc3NhZ2UoMCl9fXZhciBsPVtdO2Z1bmN0aW9uIHUoKXt2YXIgZSx0O3I9ITA7Zm9yKHZhciBuPWwubGVuZ3RoO247KXtmb3IodD1sLGw9W10sZT0tMTsrK2U8bjspdFtlXSgpO249bC5sZW5ndGh9cj0hMX10LmV4cG9ydHM9ZnVuY3Rpb24oZSl7MSE9PWwucHVzaChlKXx8cnx8bigpfX0pLmNhbGwodGhpcyx2b2lkIDAhPT1RP1E6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0se31dLDM3OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiaW1tZWRpYXRlIik7ZnVuY3Rpb24gaSgpe312YXIgYT17fSxvPVsiUkVKRUNURUQiXSxjPVsiRlVMRklMTEVEIl0scz1bIlBFTkRJTkciXTtmdW5jdGlvbiBsKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoInJlc29sdmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO3RoaXMuc3RhdGU9cyx0aGlzLnF1ZXVlPVtdLHRoaXMub3V0Y29tZT12b2lkIDAsZSE9PWkmJmgodGhpcyxlKX1mdW5jdGlvbiB1KGUsdCxuKXt0aGlzLnByb21pc2U9ZSwiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHRoaXMub25GdWxmaWxsZWQ9dCx0aGlzLmNhbGxGdWxmaWxsZWQ9dGhpcy5vdGhlckNhbGxGdWxmaWxsZWQpLCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYodGhpcy5vblJlamVjdGVkPW4sdGhpcy5jYWxsUmVqZWN0ZWQ9dGhpcy5vdGhlckNhbGxSZWplY3RlZCl9ZnVuY3Rpb24gZihlLHQsbil7cigoZnVuY3Rpb24oKXt2YXIgcjt0cnl7cj10KG4pfWNhdGNoKHIpe3JldHVybiBhLnJlamVjdChlLHIpfXI9PT1lP2EucmVqZWN0KGUsbmV3IFR5cGVFcnJvcigiQ2Fubm90IHJlc29sdmUgcHJvbWlzZSB3aXRoIGl0c2VsZiIpKTphLnJlc29sdmUoZSxyKX0pKX1mdW5jdGlvbiBkKGUpe3ZhciB0PWUmJmUudGhlbjtpZihlJiYoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJiJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiBmdW5jdGlvbigpe3QuYXBwbHkoZSxhcmd1bWVudHMpfX1mdW5jdGlvbiBoKGUsdCl7dmFyIG49ITE7ZnVuY3Rpb24gcih0KXtufHwobj0hMCxhLnJlamVjdChlLHQpKX1mdW5jdGlvbiBpKHQpe258fChuPSEwLGEucmVzb2x2ZShlLHQpKX12YXIgbz1wKChmdW5jdGlvbigpe3QoaSxyKX0pKTsiZXJyb3IiPT09by5zdGF0dXMmJnIoby52YWx1ZSl9ZnVuY3Rpb24gcChlLHQpe3ZhciBuPXt9O3RyeXtuLnZhbHVlPWUodCksbi5zdGF0dXM9InN1Y2Nlc3MifWNhdGNoKGUpe24uc3RhdHVzPSJlcnJvciIsbi52YWx1ZT1lfXJldHVybiBufSh0LmV4cG9ydHM9bCkucHJvdG90eXBlLmZpbmFsbHk9ZnVuY3Rpb24oZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpcmV0dXJuIHRoaXM7dmFyIHQ9dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gdGhpcy50aGVuKChmdW5jdGlvbihuKXtyZXR1cm4gdC5yZXNvbHZlKGUoKSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKX0pLChmdW5jdGlvbihuKXtyZXR1cm4gdC5yZXNvbHZlKGUoKSkudGhlbigoZnVuY3Rpb24oKXt0aHJvdyBufSkpfSkpfSxsLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsZSl9LGwucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmdGhpcy5zdGF0ZT09PWN8fCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZ0aGlzLnN0YXRlPT09bylyZXR1cm4gdGhpczt2YXIgbj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihpKTtyZXR1cm4gdGhpcy5zdGF0ZSE9PXM/ZihuLHRoaXMuc3RhdGU9PT1jP2U6dCx0aGlzLm91dGNvbWUpOnRoaXMucXVldWUucHVzaChuZXcgdShuLGUsdCkpLG59LHUucHJvdG90eXBlLmNhbGxGdWxmaWxsZWQ9ZnVuY3Rpb24oZSl7YS5yZXNvbHZlKHRoaXMucHJvbWlzZSxlKX0sdS5wcm90b3R5cGUub3RoZXJDYWxsRnVsZmlsbGVkPWZ1bmN0aW9uKGUpe2YodGhpcy5wcm9taXNlLHRoaXMub25GdWxmaWxsZWQsZSl9LHUucHJvdG90eXBlLmNhbGxSZWplY3RlZD1mdW5jdGlvbihlKXthLnJlamVjdCh0aGlzLnByb21pc2UsZSl9LHUucHJvdG90eXBlLm90aGVyQ2FsbFJlamVjdGVkPWZ1bmN0aW9uKGUpe2YodGhpcy5wcm9taXNlLHRoaXMub25SZWplY3RlZCxlKX0sYS5yZXNvbHZlPWZ1bmN0aW9uKGUsdCl7dmFyIG49cChkLHQpO2lmKCJlcnJvciI9PT1uLnN0YXR1cylyZXR1cm4gYS5yZWplY3QoZSxuLnZhbHVlKTt2YXIgcj1uLnZhbHVlO2lmKHIpaChlLHIpO2Vsc2V7ZS5zdGF0ZT1jLGUub3V0Y29tZT10O2Zvcih2YXIgaT0tMSxvPWUucXVldWUubGVuZ3RoOysraTxvOyllLnF1ZXVlW2ldLmNhbGxGdWxmaWxsZWQodCl9cmV0dXJuIGV9LGEucmVqZWN0PWZ1bmN0aW9uKGUsdCl7ZS5zdGF0ZT1vLGUub3V0Y29tZT10O2Zvcih2YXIgbj0tMSxyPWUucXVldWUubGVuZ3RoOysrbjxyOyllLnF1ZXVlW25dLmNhbGxSZWplY3RlZCh0KTtyZXR1cm4gZX0sbC5yZXNvbHZlPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdGhpcz9lOmEucmVzb2x2ZShuZXcgdGhpcyhpKSxlKX0sbC5yZWplY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHRoaXMoaSk7cmV0dXJuIGEucmVqZWN0KHQsZSl9LGwuYWxsPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoIltvYmplY3QgQXJyYXldIiE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSlyZXR1cm4gdGhpcy5yZWplY3QobmV3IFR5cGVFcnJvcigibXVzdCBiZSBhbiBhcnJheSIpKTt2YXIgbj1lLmxlbmd0aCxyPSExO2lmKCFuKXJldHVybiB0aGlzLnJlc29sdmUoW10pO2Zvcih2YXIgbz1uZXcgQXJyYXkobiksYz0wLHM9LTEsbD1uZXcgdGhpcyhpKTsrK3M8bjspdShlW3NdLHMpO3JldHVybiBsO2Z1bmN0aW9uIHUoZSxpKXt0LnJlc29sdmUoZSkudGhlbigoZnVuY3Rpb24oZSl7b1tpXT1lLCsrYyE9PW58fHJ8fChyPSEwLGEucmVzb2x2ZShsLG8pKX0pLChmdW5jdGlvbihlKXtyfHwocj0hMCxhLnJlamVjdChsLGUpKX0pKX19LGwucmFjZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKCJbb2JqZWN0IEFycmF5XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpcmV0dXJuIHRoaXMucmVqZWN0KG5ldyBUeXBlRXJyb3IoIm11c3QgYmUgYW4gYXJyYXkiKSk7dmFyIG49ZS5sZW5ndGgscj0hMTtpZighbilyZXR1cm4gdGhpcy5yZXNvbHZlKFtdKTtmb3IodmFyIG8sYz0tMSxzPW5ldyB0aGlzKGkpOysrYzxuOylvPWVbY10sdC5yZXNvbHZlKG8pLnRoZW4oKGZ1bmN0aW9uKGUpe3J8fChyPSEwLGEucmVzb2x2ZShzLGUpKX0pLChmdW5jdGlvbihlKXtyfHwocj0hMCxhLnJlamVjdChzLGUpKX0pKTtyZXR1cm4gc319LHtpbW1lZGlhdGU6MzZ9XSwzODpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9OygwLGUoIi4vbGliL3V0aWxzL2NvbW1vbiIpLmFzc2lnbikocixlKCIuL2xpYi9kZWZsYXRlIiksZSgiLi9saWIvaW5mbGF0ZSIpLGUoIi4vbGliL3psaWIvY29uc3RhbnRzIikpLHQuZXhwb3J0cz1yfSx7Ii4vbGliL2RlZmxhdGUiOjM5LCIuL2xpYi9pbmZsYXRlIjo0MCwiLi9saWIvdXRpbHMvY29tbW9uIjo0MSwiLi9saWIvemxpYi9jb25zdGFudHMiOjQ0fV0sMzk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL3psaWIvZGVmbGF0ZSIpLGk9ZSgiLi91dGlscy9jb21tb24iKSxhPWUoIi4vdXRpbHMvc3RyaW5ncyIpLG89ZSgiLi96bGliL21lc3NhZ2VzIiksYz1lKCIuL3psaWIvenN0cmVhbSIpLHM9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxsPTAsdT0tMSxmPTAsZD04O2Z1bmN0aW9uIGgoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgaCkpcmV0dXJuIG5ldyBoKGUpO3RoaXMub3B0aW9ucz1pLmFzc2lnbih7bGV2ZWw6dSxtZXRob2Q6ZCxjaHVua1NpemU6MTYzODQsd2luZG93Qml0czoxNSxtZW1MZXZlbDo4LHN0cmF0ZWd5OmYsdG86IiJ9LGV8fHt9KTt2YXIgdD10aGlzLm9wdGlvbnM7dC5yYXcmJjA8dC53aW5kb3dCaXRzP3Qud2luZG93Qml0cz0tdC53aW5kb3dCaXRzOnQuZ3ppcCYmMDx0LndpbmRvd0JpdHMmJnQud2luZG93Qml0czwxNiYmKHQud2luZG93Qml0cys9MTYpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IGMsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBuPXIuZGVmbGF0ZUluaXQyKHRoaXMuc3RybSx0LmxldmVsLHQubWV0aG9kLHQud2luZG93Qml0cyx0Lm1lbUxldmVsLHQuc3RyYXRlZ3kpO2lmKG4hPT1sKXRocm93IG5ldyBFcnJvcihvW25dKTtpZih0LmhlYWRlciYmci5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSx0LmhlYWRlciksdC5kaWN0aW9uYXJ5KXt2YXIgcDtpZihwPSJzdHJpbmciPT10eXBlb2YgdC5kaWN0aW9uYXJ5P2Euc3RyaW5nMmJ1Zih0LmRpY3Rpb25hcnkpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1zLmNhbGwodC5kaWN0aW9uYXJ5KT9uZXcgVWludDhBcnJheSh0LmRpY3Rpb25hcnkpOnQuZGljdGlvbmFyeSwobj1yLmRlZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSxwKSkhPT1sKXRocm93IG5ldyBFcnJvcihvW25dKTt0aGlzLl9kaWN0X3NldD0hMH19ZnVuY3Rpb24gcChlLHQpe3ZhciBuPW5ldyBoKHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8b1tuLmVycl07cmV0dXJuIG4ucmVzdWx0fWgucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oZSx0KXt2YXIgbixvLGM9dGhpcy5zdHJtLHU9dGhpcy5vcHRpb25zLmNodW5rU2l6ZTtpZih0aGlzLmVuZGVkKXJldHVybiExO289dD09PX5+dD90OiEwPT09dD80OjAsInN0cmluZyI9PXR5cGVvZiBlP2MuaW5wdXQ9YS5zdHJpbmcyYnVmKGUpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1zLmNhbGwoZSk/Yy5pbnB1dD1uZXcgVWludDhBcnJheShlKTpjLmlucHV0PWUsYy5uZXh0X2luPTAsYy5hdmFpbF9pbj1jLmlucHV0Lmxlbmd0aDtkb3tpZigwPT09Yy5hdmFpbF9vdXQmJihjLm91dHB1dD1uZXcgaS5CdWY4KHUpLGMubmV4dF9vdXQ9MCxjLmF2YWlsX291dD11KSwxIT09KG49ci5kZWZsYXRlKGMsbykpJiZuIT09bClyZXR1cm4gdGhpcy5vbkVuZChuKSwhKHRoaXMuZW5kZWQ9ITApOzAhPT1jLmF2YWlsX291dCYmKDAhPT1jLmF2YWlsX2lufHw0IT09byYmMiE9PW8pfHwoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/dGhpcy5vbkRhdGEoYS5idWYyYmluc3RyaW5nKGkuc2hyaW5rQnVmKGMub3V0cHV0LGMubmV4dF9vdXQpKSk6dGhpcy5vbkRhdGEoaS5zaHJpbmtCdWYoYy5vdXRwdXQsYy5uZXh0X291dCkpKX13aGlsZSgoMDxjLmF2YWlsX2lufHwwPT09Yy5hdmFpbF9vdXQpJiYxIT09bik7cmV0dXJuIDQ9PT1vPyhuPXIuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMub25FbmQobiksdGhpcy5lbmRlZD0hMCxuPT09bCk6MiE9PW98fCh0aGlzLm9uRW5kKGwpLCEoYy5hdmFpbF9vdXQ9MCkpfSxoLnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oZSl7dGhpcy5jaHVua3MucHVzaChlKX0saC5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7ZT09PWwmJigic3RyaW5nIj09PXRoaXMub3B0aW9ucy50bz90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD1pLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj1lLHRoaXMubXNnPXRoaXMuc3RybS5tc2d9LG4uRGVmbGF0ZT1oLG4uZGVmbGF0ZT1wLG4uZGVmbGF0ZVJhdz1mdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5yYXc9ITAscChlLHQpfSxuLmd6aXA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4odD10fHx7fSkuZ3ppcD0hMCxwKGUsdCl9fSx7Ii4vdXRpbHMvY29tbW9uIjo0MSwiLi91dGlscy9zdHJpbmdzIjo0MiwiLi96bGliL2RlZmxhdGUiOjQ2LCIuL3psaWIvbWVzc2FnZXMiOjUxLCIuL3psaWIvenN0cmVhbSI6NTN9XSw0MDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vemxpYi9pbmZsYXRlIiksaT1lKCIuL3V0aWxzL2NvbW1vbiIpLGE9ZSgiLi91dGlscy9zdHJpbmdzIiksbz1lKCIuL3psaWIvY29uc3RhbnRzIiksYz1lKCIuL3psaWIvbWVzc2FnZXMiKSxzPWUoIi4vemxpYi96c3RyZWFtIiksbD1lKCIuL3psaWIvZ3poZWFkZXIiKSx1PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gZihlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBmKSlyZXR1cm4gbmV3IGYoZSk7dGhpcy5vcHRpb25zPWkuYXNzaWduKHtjaHVua1NpemU6MTYzODQsd2luZG93Qml0czowLHRvOiIifSxlfHx7fSk7dmFyIHQ9dGhpcy5vcHRpb25zO3QucmF3JiYwPD10LndpbmRvd0JpdHMmJnQud2luZG93Qml0czwxNiYmKHQud2luZG93Qml0cz0tdC53aW5kb3dCaXRzLDA9PT10LndpbmRvd0JpdHMmJih0LndpbmRvd0JpdHM9LTE1KSksISgwPD10LndpbmRvd0JpdHMmJnQud2luZG93Qml0czwxNil8fGUmJmUud2luZG93Qml0c3x8KHQud2luZG93Qml0cys9MzIpLDE1PHQud2luZG93Qml0cyYmdC53aW5kb3dCaXRzPDQ4JiYwPT0oMTUmdC53aW5kb3dCaXRzKSYmKHQud2luZG93Qml0c3w9MTUpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IHMsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBuPXIuaW5mbGF0ZUluaXQyKHRoaXMuc3RybSx0LndpbmRvd0JpdHMpO2lmKG4hPT1vLlpfT0spdGhyb3cgbmV3IEVycm9yKGNbbl0pO3RoaXMuaGVhZGVyPW5ldyBsLHIuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sdGhpcy5oZWFkZXIpfWZ1bmN0aW9uIGQoZSx0KXt2YXIgbj1uZXcgZih0KTtpZihuLnB1c2goZSwhMCksbi5lcnIpdGhyb3cgbi5tc2d8fGNbbi5lcnJdO3JldHVybiBuLnJlc3VsdH1mLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCl7dmFyIG4sYyxzLGwsZixkLGg9dGhpcy5zdHJtLHA9dGhpcy5vcHRpb25zLmNodW5rU2l6ZSxnPXRoaXMub3B0aW9ucy5kaWN0aW9uYXJ5LG09ITE7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtjPXQ9PT1+fnQ/dDohMD09PXQ/by5aX0ZJTklTSDpvLlpfTk9fRkxVU0gsInN0cmluZyI9PXR5cGVvZiBlP2guaW5wdXQ9YS5iaW5zdHJpbmcyYnVmKGUpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT11LmNhbGwoZSk/aC5pbnB1dD1uZXcgVWludDhBcnJheShlKTpoLmlucHV0PWUsaC5uZXh0X2luPTAsaC5hdmFpbF9pbj1oLmlucHV0Lmxlbmd0aDtkb3tpZigwPT09aC5hdmFpbF9vdXQmJihoLm91dHB1dD1uZXcgaS5CdWY4KHApLGgubmV4dF9vdXQ9MCxoLmF2YWlsX291dD1wKSwobj1yLmluZmxhdGUoaCxvLlpfTk9fRkxVU0gpKT09PW8uWl9ORUVEX0RJQ1QmJmcmJihkPSJzdHJpbmciPT10eXBlb2YgZz9hLnN0cmluZzJidWYoZyk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXUuY2FsbChnKT9uZXcgVWludDhBcnJheShnKTpnLG49ci5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sZCkpLG49PT1vLlpfQlVGX0VSUk9SJiYhMD09PW0mJihuPW8uWl9PSyxtPSExKSxuIT09by5aX1NUUkVBTV9FTkQmJm4hPT1vLlpfT0spcmV0dXJuIHRoaXMub25FbmQobiksISh0aGlzLmVuZGVkPSEwKTtoLm5leHRfb3V0JiYoMCE9PWguYXZhaWxfb3V0JiZuIT09by5aX1NUUkVBTV9FTkQmJigwIT09aC5hdmFpbF9pbnx8YyE9PW8uWl9GSU5JU0gmJmMhPT1vLlpfU1lOQ19GTFVTSCl8fCgic3RyaW5nIj09PXRoaXMub3B0aW9ucy50bz8ocz1hLnV0Zjhib3JkZXIoaC5vdXRwdXQsaC5uZXh0X291dCksbD1oLm5leHRfb3V0LXMsZj1hLmJ1ZjJzdHJpbmcoaC5vdXRwdXQscyksaC5uZXh0X291dD1sLGguYXZhaWxfb3V0PXAtbCxsJiZpLmFycmF5U2V0KGgub3V0cHV0LGgub3V0cHV0LHMsbCwwKSx0aGlzLm9uRGF0YShmKSk6dGhpcy5vbkRhdGEoaS5zaHJpbmtCdWYoaC5vdXRwdXQsaC5uZXh0X291dCkpKSksMD09PWguYXZhaWxfaW4mJjA9PT1oLmF2YWlsX291dCYmKG09ITApfXdoaWxlKCgwPGguYXZhaWxfaW58fDA9PT1oLmF2YWlsX291dCkmJm4hPT1vLlpfU1RSRUFNX0VORCk7cmV0dXJuIG49PT1vLlpfU1RSRUFNX0VORCYmKGM9by5aX0ZJTklTSCksYz09PW8uWl9GSU5JU0g/KG49ci5pbmZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChuKSx0aGlzLmVuZGVkPSEwLG49PT1vLlpfT0spOmMhPT1vLlpfU1lOQ19GTFVTSHx8KHRoaXMub25FbmQoby5aX09LKSwhKGguYXZhaWxfb3V0PTApKX0sZi5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKGUpe3RoaXMuY2h1bmtzLnB1c2goZSl9LGYucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKGUpe2U9PT1vLlpfT0smJigic3RyaW5nIj09PXRoaXMub3B0aW9ucy50bz90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD1pLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj1lLHRoaXMubXNnPXRoaXMuc3RybS5tc2d9LG4uSW5mbGF0ZT1mLG4uaW5mbGF0ZT1kLG4uaW5mbGF0ZVJhdz1mdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5yYXc9ITAsZChlLHQpfSxuLnVuZ3ppcD1kfSx7Ii4vdXRpbHMvY29tbW9uIjo0MSwiLi91dGlscy9zdHJpbmdzIjo0MiwiLi96bGliL2NvbnN0YW50cyI6NDQsIi4vemxpYi9nemhlYWRlciI6NDcsIi4vemxpYi9pbmZsYXRlIjo0OSwiLi96bGliL21lc3NhZ2VzIjo1MSwiLi96bGliL3pzdHJlYW0iOjUzfV0sNDE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXkmJiJ1bmRlZmluZWQiIT10eXBlb2YgVWludDE2QXJyYXkmJiJ1bmRlZmluZWQiIT10eXBlb2YgSW50MzJBcnJheTtuLmFzc2lnbj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3QubGVuZ3RoOyl7dmFyIG49dC5zaGlmdCgpO2lmKG4pe2lmKCJvYmplY3QiIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKG4rIm11c3QgYmUgbm9uLW9iamVjdCIpO2Zvcih2YXIgciBpbiBuKW4uaGFzT3duUHJvcGVydHkocikmJihlW3JdPW5bcl0pfX1yZXR1cm4gZX0sbi5zaHJpbmtCdWY9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5sZW5ndGg9PT10P2U6ZS5zdWJhcnJheT9lLnN1YmFycmF5KDAsdCk6KGUubGVuZ3RoPXQsZSl9O3ZhciBpPXthcnJheVNldDpmdW5jdGlvbihlLHQsbixyLGkpe2lmKHQuc3ViYXJyYXkmJmUuc3ViYXJyYXkpZS5zZXQodC5zdWJhcnJheShuLG4rciksaSk7ZWxzZSBmb3IodmFyIGE9MDthPHI7YSsrKWVbaSthXT10W24rYV19LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksYSxvO2Zvcih0PXI9MCxuPWUubGVuZ3RoO3Q8bjt0Kyspcis9ZVt0XS5sZW5ndGg7Zm9yKG89bmV3IFVpbnQ4QXJyYXkociksdD1pPTAsbj1lLmxlbmd0aDt0PG47dCsrKWE9ZVt0XSxvLnNldChhLGkpLGkrPWEubGVuZ3RoO3JldHVybiBvfX0sYT17YXJyYXlTZXQ6ZnVuY3Rpb24oZSx0LG4scixpKXtmb3IodmFyIGE9MDthPHI7YSsrKWVbaSthXT10W24rYV19LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oZSl7cmV0dXJuW10uY29uY2F0LmFwcGx5KFtdLGUpfX07bi5zZXRUeXBlZD1mdW5jdGlvbihlKXtlPyhuLkJ1Zjg9VWludDhBcnJheSxuLkJ1ZjE2PVVpbnQxNkFycmF5LG4uQnVmMzI9SW50MzJBcnJheSxuLmFzc2lnbihuLGkpKToobi5CdWY4PUFycmF5LG4uQnVmMTY9QXJyYXksbi5CdWYzMj1BcnJheSxuLmFzc2lnbihuLGEpKX0sbi5zZXRUeXBlZChyKX0se31dLDQyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb21tb24iKSxpPSEwLGE9ITA7dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxbMF0pfWNhdGNoKGUpe2k9ITF9dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheSgxKSl9Y2F0Y2goZSl7YT0hMX1mb3IodmFyIG89bmV3IHIuQnVmOCgyNTYpLGM9MDtjPDI1NjtjKyspb1tjXT0yNTI8PWM/NjoyNDg8PWM/NToyNDA8PWM/NDoyMjQ8PWM/MzoxOTI8PWM/MjoxO2Z1bmN0aW9uIHMoZSx0KXtpZih0PDY1NTM3JiYoZS5zdWJhcnJheSYmYXx8IWUuc3ViYXJyYXkmJmkpKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsci5zaHJpbmtCdWYoZSx0KSk7Zm9yKHZhciBuPSIiLG89MDtvPHQ7bysrKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtvXSk7cmV0dXJuIG59b1syNTRdPW9bMjU0XT0xLG4uc3RyaW5nMmJ1Zj1mdW5jdGlvbihlKXt2YXIgdCxuLGksYSxvLGM9ZS5sZW5ndGgscz0wO2ZvcihhPTA7YTxjO2ErKyk1NTI5Nj09KDY0NTEyJihuPWUuY2hhckNvZGVBdChhKSkpJiZhKzE8YyYmNTYzMjA9PSg2NDUxMiYoaT1lLmNoYXJDb2RlQXQoYSsxKSkpJiYobj02NTUzNisobi01NTI5Njw8MTApKyhpLTU2MzIwKSxhKyspLHMrPW48MTI4PzE6bjwyMDQ4PzI6bjw2NTUzNj8zOjQ7Zm9yKHQ9bmV3IHIuQnVmOChzKSxhPW89MDtvPHM7YSsrKTU1Mjk2PT0oNjQ1MTImKG49ZS5jaGFyQ29kZUF0KGEpKSkmJmErMTxjJiY1NjMyMD09KDY0NTEyJihpPWUuY2hhckNvZGVBdChhKzEpKSkmJihuPTY1NTM2KyhuLTU1Mjk2PDwxMCkrKGktNTYzMjApLGErKyksbjwxMjg/dFtvKytdPW46KG48MjA0OD90W28rK109MTkyfG4+Pj42OihuPDY1NTM2P3RbbysrXT0yMjR8bj4+PjEyOih0W28rK109MjQwfG4+Pj4xOCx0W28rK109MTI4fG4+Pj4xMiY2MyksdFtvKytdPTEyOHxuPj4+NiY2MyksdFtvKytdPTEyOHw2MyZuKTtyZXR1cm4gdH0sbi5idWYyYmluc3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiBzKGUsZS5sZW5ndGgpfSxuLmJpbnN0cmluZzJidWY9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PW5ldyByLkJ1ZjgoZS5sZW5ndGgpLG49MCxpPXQubGVuZ3RoO248aTtuKyspdFtuXT1lLmNoYXJDb2RlQXQobik7cmV0dXJuIHR9LG4uYnVmMnN0cmluZz1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxhLGM9dHx8ZS5sZW5ndGgsbD1uZXcgQXJyYXkoMipjKTtmb3Iobj1yPTA7bjxjOylpZigoaT1lW24rK10pPDEyOClsW3IrK109aTtlbHNlIGlmKDQ8KGE9b1tpXSkpbFtyKytdPTY1NTMzLG4rPWEtMTtlbHNle2ZvcihpJj0yPT09YT8zMTozPT09YT8xNTo3OzE8YSYmbjxjOylpPWk8PDZ8NjMmZVtuKytdLGEtLTsxPGE/bFtyKytdPTY1NTMzOmk8NjU1MzY/bFtyKytdPWk6KGktPTY1NTM2LGxbcisrXT01NTI5NnxpPj4xMCYxMDIzLGxbcisrXT01NjMyMHwxMDIzJmkpfXJldHVybiBzKGwscil9LG4udXRmOGJvcmRlcj1mdW5jdGlvbihlLHQpe3ZhciBuO2ZvcigodD10fHxlLmxlbmd0aCk+ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSxuPXQtMTswPD1uJiYxMjg9PSgxOTImZVtuXSk7KW4tLTtyZXR1cm4gbjwwfHwwPT09bj90Om4rb1tlW25dXT50P246dH19LHsiLi9jb21tb24iOjQxfV0sNDM6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scil7Zm9yKHZhciBpPTY1NTM1JmV8MCxhPWU+Pj4xNiY2NTUzNXwwLG89MDswIT09bjspe2ZvcihuLT1vPTJlMzxuPzJlMzpuO2E9YSsoaT1pK3RbcisrXXwwKXwwLC0tbzspO2klPTY1NTIxLGElPTY1NTIxfXJldHVybiBpfGE8PDE2fDB9fSx7fV0sNDQ6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e1pfTk9fRkxVU0g6MCxaX1BBUlRJQUxfRkxVU0g6MSxaX1NZTkNfRkxVU0g6MixaX0ZVTExfRkxVU0g6MyxaX0ZJTklTSDo0LFpfQkxPQ0s6NSxaX1RSRUVTOjYsWl9PSzowLFpfU1RSRUFNX0VORDoxLFpfTkVFRF9ESUNUOjIsWl9FUlJOTzotMSxaX1NUUkVBTV9FUlJPUjotMixaX0RBVEFfRVJST1I6LTMsWl9CVUZfRVJST1I6LTUsWl9OT19DT01QUkVTU0lPTjowLFpfQkVTVF9TUEVFRDoxLFpfQkVTVF9DT01QUkVTU0lPTjo5LFpfREVGQVVMVF9DT01QUkVTU0lPTjotMSxaX0ZJTFRFUkVEOjEsWl9IVUZGTUFOX09OTFk6MixaX1JMRTozLFpfRklYRUQ6NCxaX0RFRkFVTFRfU1RSQVRFR1k6MCxaX0JJTkFSWTowLFpfVEVYVDoxLFpfVU5LTk9XTjoyLFpfREVGTEFURUQ6OH19LHt9XSw0NTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9W10sbj0wO248MjU2O24rKyl7ZT1uO2Zvcih2YXIgcj0wO3I8ODtyKyspZT0xJmU/Mzk4ODI5MjM4NF5lPj4+MTplPj4+MTt0W25dPWV9cmV0dXJuIHR9KCk7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBhPXIsbz1pK247ZV49LTE7Zm9yKHZhciBjPWk7YzxvO2MrKyllPWU+Pj44XmFbMjU1JihlXnRbY10pXTtyZXR1cm4tMV5lfX0se31dLDQ2OltmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1lKCIuLi91dGlscy9jb21tb24iKSxhPWUoIi4vdHJlZXMiKSxvPWUoIi4vYWRsZXIzMiIpLGM9ZSgiLi9jcmMzMiIpLHM9ZSgiLi9tZXNzYWdlcyIpLGw9MCx1PTQsZj0wLGQ9LTIsaD0tMSxwPTQsZz0yLG09OCxiPTkseT0yODYsdj0zMCx4PTE5LEQ9Mip5KzEsVD0xNSx3PTMsXz0yNTgsRT1fK3crMSxVPTQyLEE9MTEzLGs9MSxTPTIsQz0zLEY9NDtmdW5jdGlvbiBPKGUsdCl7cmV0dXJuIGUubXNnPXNbdF0sdH1mdW5jdGlvbiBJKGUpe3JldHVybihlPDwxKS0oNDxlPzk6MCl9ZnVuY3Rpb24gUihlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7MDw9LS10OyllW3RdPTB9ZnVuY3Rpb24gTihlKXt2YXIgdD1lLnN0YXRlLG49dC5wZW5kaW5nO24+ZS5hdmFpbF9vdXQmJihuPWUuYXZhaWxfb3V0KSwwIT09biYmKGkuYXJyYXlTZXQoZS5vdXRwdXQsdC5wZW5kaW5nX2J1Zix0LnBlbmRpbmdfb3V0LG4sZS5uZXh0X291dCksZS5uZXh0X291dCs9bix0LnBlbmRpbmdfb3V0Kz1uLGUudG90YWxfb3V0Kz1uLGUuYXZhaWxfb3V0LT1uLHQucGVuZGluZy09biwwPT09dC5wZW5kaW5nJiYodC5wZW5kaW5nX291dD0wKSl9ZnVuY3Rpb24gUChlLHQpe2EuX3RyX2ZsdXNoX2Jsb2NrKGUsMDw9ZS5ibG9ja19zdGFydD9lLmJsb2NrX3N0YXJ0Oi0xLGUuc3Ryc3RhcnQtZS5ibG9ja19zdGFydCx0KSxlLmJsb2NrX3N0YXJ0PWUuc3Ryc3RhcnQsTihlLnN0cm0pfWZ1bmN0aW9uIEIoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10fWZ1bmN0aW9uIFcoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTUsZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109MjU1JnR9ZnVuY3Rpb24gTChlLHQpe3ZhciBuLHIsaT1lLm1heF9jaGFpbl9sZW5ndGgsYT1lLnN0cnN0YXJ0LG89ZS5wcmV2X2xlbmd0aCxjPWUubmljZV9tYXRjaCxzPWUuc3Ryc3RhcnQ+ZS53X3NpemUtRT9lLnN0cnN0YXJ0LShlLndfc2l6ZS1FKTowLGw9ZS53aW5kb3csdT1lLndfbWFzayxmPWUucHJldixkPWUuc3Ryc3RhcnQrXyxoPWxbYStvLTFdLHA9bFthK29dO2UucHJldl9sZW5ndGg+PWUuZ29vZF9tYXRjaCYmKGk+Pj0yKSxjPmUubG9va2FoZWFkJiYoYz1lLmxvb2thaGVhZCk7ZG97aWYobFsobj10KStvXT09PXAmJmxbbitvLTFdPT09aCYmbFtuXT09PWxbYV0mJmxbKytuXT09PWxbYSsxXSl7YSs9MixuKys7ZG97fXdoaWxlKGxbKythXT09PWxbKytuXSYmbFsrK2FdPT09bFsrK25dJiZsWysrYV09PT1sWysrbl0mJmxbKythXT09PWxbKytuXSYmbFsrK2FdPT09bFsrK25dJiZsWysrYV09PT1sWysrbl0mJmxbKythXT09PWxbKytuXSYmbFsrK2FdPT09bFsrK25dJiZhPGQpO2lmKHI9Xy0oZC1hKSxhPWQtXyxvPHIpe2lmKGUubWF0Y2hfc3RhcnQ9dCxjPD0obz1yKSlicmVhaztoPWxbYStvLTFdLHA9bFthK29dfX19d2hpbGUoKHQ9Zlt0JnVdKT5zJiYwIT0tLWkpO3JldHVybiBvPD1lLmxvb2thaGVhZD9vOmUubG9va2FoZWFkfWZ1bmN0aW9uIE0oZSl7dmFyIHQsbixyLGEscyxsLHUsZixkLGgscD1lLndfc2l6ZTtkb3tpZihhPWUud2luZG93X3NpemUtZS5sb29rYWhlYWQtZS5zdHJzdGFydCxlLnN0cnN0YXJ0Pj1wKyhwLUUpKXtmb3IoaS5hcnJheVNldChlLndpbmRvdyxlLndpbmRvdyxwLHAsMCksZS5tYXRjaF9zdGFydC09cCxlLnN0cnN0YXJ0LT1wLGUuYmxvY2tfc3RhcnQtPXAsdD1uPWUuaGFzaF9zaXplO3I9ZS5oZWFkWy0tdF0sZS5oZWFkW3RdPXA8PXI/ci1wOjAsLS1uOyk7Zm9yKHQ9bj1wO3I9ZS5wcmV2Wy0tdF0sZS5wcmV2W3RdPXA8PXI/ci1wOjAsLS1uOyk7YSs9cH1pZigwPT09ZS5zdHJtLmF2YWlsX2luKWJyZWFrO2lmKGw9ZS5zdHJtLHU9ZS53aW5kb3csZj1lLnN0cnN0YXJ0K2UubG9va2FoZWFkLGg9dm9pZCAwLChkPWEpPChoPWwuYXZhaWxfaW4pJiYoaD1kKSxuPTA9PT1oPzA6KGwuYXZhaWxfaW4tPWgsaS5hcnJheVNldCh1LGwuaW5wdXQsbC5uZXh0X2luLGgsZiksMT09PWwuc3RhdGUud3JhcD9sLmFkbGVyPW8obC5hZGxlcix1LGgsZik6Mj09PWwuc3RhdGUud3JhcCYmKGwuYWRsZXI9YyhsLmFkbGVyLHUsaCxmKSksbC5uZXh0X2luKz1oLGwudG90YWxfaW4rPWgsaCksZS5sb29rYWhlYWQrPW4sZS5sb29rYWhlYWQrZS5pbnNlcnQ+PXcpZm9yKHM9ZS5zdHJzdGFydC1lLmluc2VydCxlLmluc19oPWUud2luZG93W3NdLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tzKzFdKSZlLmhhc2hfbWFzaztlLmluc2VydCYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tzK3ctMV0pJmUuaGFzaF9tYXNrLGUucHJldltzJmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPXMscysrLGUuaW5zZXJ0LS0sIShlLmxvb2thaGVhZCtlLmluc2VydDx3KSk7KTt9d2hpbGUoZS5sb29rYWhlYWQ8RSYmMCE9PWUuc3RybS5hdmFpbF9pbil9ZnVuY3Rpb24gaihlLHQpe2Zvcih2YXIgbixyOzspe2lmKGUubG9va2FoZWFkPEUpe2lmKE0oZSksZS5sb29rYWhlYWQ8RSYmdD09PWwpcmV0dXJuIGs7aWYoMD09PWUubG9va2FoZWFkKWJyZWFrfWlmKG49MCxlLmxvb2thaGVhZD49dyYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K3ctMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksMCE9PW4mJmUuc3Ryc3RhcnQtbjw9ZS53X3NpemUtRSYmKGUubWF0Y2hfbGVuZ3RoPUwoZSxuKSksZS5tYXRjaF9sZW5ndGg+PXcpaWYocj1hLl90cl90YWxseShlLGUuc3Ryc3RhcnQtZS5tYXRjaF9zdGFydCxlLm1hdGNoX2xlbmd0aC13KSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg8PWUubWF4X2xhenlfbWF0Y2gmJmUubG9va2FoZWFkPj13KXtmb3IoZS5tYXRjaF9sZW5ndGgtLTtlLnN0cnN0YXJ0KyssZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrdy0xXSkmZS5oYXNoX21hc2ssbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0LDAhPS0tZS5tYXRjaF9sZW5ndGg7KTtlLnN0cnN0YXJ0Kyt9ZWxzZSBlLnN0cnN0YXJ0Kz1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aD0wLGUuaW5zX2g9ZS53aW5kb3dbZS5zdHJzdGFydF0sZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrMV0pJmUuaGFzaF9tYXNrO2Vsc2Ugcj1hLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrO2lmKHImJihQKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4ga31yZXR1cm4gZS5pbnNlcnQ9ZS5zdHJzdGFydDx3LTE/ZS5zdHJzdGFydDp3LTEsdD09PXU/KFAoZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/QzpGKTplLmxhc3RfbGl0JiYoUChlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCk/azpTfWZ1bmN0aW9uIHooZSx0KXtmb3IodmFyIG4scixpOzspe2lmKGUubG9va2FoZWFkPEUpe2lmKE0oZSksZS5sb29rYWhlYWQ8RSYmdD09PWwpcmV0dXJuIGs7aWYoMD09PWUubG9va2FoZWFkKWJyZWFrfWlmKG49MCxlLmxvb2thaGVhZD49dyYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K3ctMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksZS5wcmV2X2xlbmd0aD1lLm1hdGNoX2xlbmd0aCxlLnByZXZfbWF0Y2g9ZS5tYXRjaF9zdGFydCxlLm1hdGNoX2xlbmd0aD13LTEsMCE9PW4mJmUucHJldl9sZW5ndGg8ZS5tYXhfbGF6eV9tYXRjaCYmZS5zdHJzdGFydC1uPD1lLndfc2l6ZS1FJiYoZS5tYXRjaF9sZW5ndGg9TChlLG4pLGUubWF0Y2hfbGVuZ3RoPD01JiYoMT09PWUuc3RyYXRlZ3l8fGUubWF0Y2hfbGVuZ3RoPT09dyYmNDA5NjxlLnN0cnN0YXJ0LWUubWF0Y2hfc3RhcnQpJiYoZS5tYXRjaF9sZW5ndGg9dy0xKSksZS5wcmV2X2xlbmd0aD49dyYmZS5tYXRjaF9sZW5ndGg8PWUucHJldl9sZW5ndGgpe2ZvcihpPWUuc3Ryc3RhcnQrZS5sb29rYWhlYWQtdyxyPWEuX3RyX3RhbGx5KGUsZS5zdHJzdGFydC0xLWUucHJldl9tYXRjaCxlLnByZXZfbGVuZ3RoLXcpLGUubG9va2FoZWFkLT1lLnByZXZfbGVuZ3RoLTEsZS5wcmV2X2xlbmd0aC09MjsrK2Uuc3Ryc3RhcnQ8PWkmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCt3LTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLDAhPS0tZS5wcmV2X2xlbmd0aDspO2lmKGUubWF0Y2hfYXZhaWxhYmxlPTAsZS5tYXRjaF9sZW5ndGg9dy0xLGUuc3Ryc3RhcnQrKyxyJiYoUChlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIGt9ZWxzZSBpZihlLm1hdGNoX2F2YWlsYWJsZSl7aWYoKHI9YS5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnQtMV0pKSYmUChlLCExKSxlLnN0cnN0YXJ0KyssZS5sb29rYWhlYWQtLSwwPT09ZS5zdHJtLmF2YWlsX291dClyZXR1cm4ga31lbHNlIGUubWF0Y2hfYXZhaWxhYmxlPTEsZS5zdHJzdGFydCsrLGUubG9va2FoZWFkLS19cmV0dXJuIGUubWF0Y2hfYXZhaWxhYmxlJiYocj1hLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSksZS5tYXRjaF9hdmFpbGFibGU9MCksZS5pbnNlcnQ9ZS5zdHJzdGFydDx3LTE/ZS5zdHJzdGFydDp3LTEsdD09PXU/KFAoZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/QzpGKTplLmxhc3RfbGl0JiYoUChlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCk/azpTfWZ1bmN0aW9uIEgoZSx0LG4scixpKXt0aGlzLmdvb2RfbGVuZ3RoPWUsdGhpcy5tYXhfbGF6eT10LHRoaXMubmljZV9sZW5ndGg9bix0aGlzLm1heF9jaGFpbj1yLHRoaXMuZnVuYz1pfWZ1bmN0aW9uIFYoKXt0aGlzLnN0cm09bnVsbCx0aGlzLnN0YXR1cz0wLHRoaXMucGVuZGluZ19idWY9bnVsbCx0aGlzLnBlbmRpbmdfYnVmX3NpemU9MCx0aGlzLnBlbmRpbmdfb3V0PTAsdGhpcy5wZW5kaW5nPTAsdGhpcy53cmFwPTAsdGhpcy5nemhlYWQ9bnVsbCx0aGlzLmd6aW5kZXg9MCx0aGlzLm1ldGhvZD1tLHRoaXMubGFzdF9mbHVzaD0tMSx0aGlzLndfc2l6ZT0wLHRoaXMud19iaXRzPTAsdGhpcy53X21hc2s9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMud2luZG93X3NpemU9MCx0aGlzLnByZXY9bnVsbCx0aGlzLmhlYWQ9bnVsbCx0aGlzLmluc19oPTAsdGhpcy5oYXNoX3NpemU9MCx0aGlzLmhhc2hfYml0cz0wLHRoaXMuaGFzaF9tYXNrPTAsdGhpcy5oYXNoX3NoaWZ0PTAsdGhpcy5ibG9ja19zdGFydD0wLHRoaXMubWF0Y2hfbGVuZ3RoPTAsdGhpcy5wcmV2X21hdGNoPTAsdGhpcy5tYXRjaF9hdmFpbGFibGU9MCx0aGlzLnN0cnN0YXJ0PTAsdGhpcy5tYXRjaF9zdGFydD0wLHRoaXMubG9va2FoZWFkPTAsdGhpcy5wcmV2X2xlbmd0aD0wLHRoaXMubWF4X2NoYWluX2xlbmd0aD0wLHRoaXMubWF4X2xhenlfbWF0Y2g9MCx0aGlzLmxldmVsPTAsdGhpcy5zdHJhdGVneT0wLHRoaXMuZ29vZF9tYXRjaD0wLHRoaXMubmljZV9tYXRjaD0wLHRoaXMuZHluX2x0cmVlPW5ldyBpLkJ1ZjE2KDIqRCksdGhpcy5keW5fZHRyZWU9bmV3IGkuQnVmMTYoMiooMip2KzEpKSx0aGlzLmJsX3RyZWU9bmV3IGkuQnVmMTYoMiooMip4KzEpKSxSKHRoaXMuZHluX2x0cmVlKSxSKHRoaXMuZHluX2R0cmVlKSxSKHRoaXMuYmxfdHJlZSksdGhpcy5sX2Rlc2M9bnVsbCx0aGlzLmRfZGVzYz1udWxsLHRoaXMuYmxfZGVzYz1udWxsLHRoaXMuYmxfY291bnQ9bmV3IGkuQnVmMTYoVCsxKSx0aGlzLmhlYXA9bmV3IGkuQnVmMTYoMip5KzEpLFIodGhpcy5oZWFwKSx0aGlzLmhlYXBfbGVuPTAsdGhpcy5oZWFwX21heD0wLHRoaXMuZGVwdGg9bmV3IGkuQnVmMTYoMip5KzEpLFIodGhpcy5kZXB0aCksdGhpcy5sX2J1Zj0wLHRoaXMubGl0X2J1ZnNpemU9MCx0aGlzLmxhc3RfbGl0PTAsdGhpcy5kX2J1Zj0wLHRoaXMub3B0X2xlbj0wLHRoaXMuc3RhdGljX2xlbj0wLHRoaXMubWF0Y2hlcz0wLHRoaXMuaW5zZXJ0PTAsdGhpcy5iaV9idWY9MCx0aGlzLmJpX3ZhbGlkPTB9ZnVuY3Rpb24gcShlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8oZS50b3RhbF9pbj1lLnRvdGFsX291dD0wLGUuZGF0YV90eXBlPWcsKHQ9ZS5zdGF0ZSkucGVuZGluZz0wLHQucGVuZGluZ19vdXQ9MCx0LndyYXA8MCYmKHQud3JhcD0tdC53cmFwKSx0LnN0YXR1cz10LndyYXA/VTpBLGUuYWRsZXI9Mj09PXQud3JhcD8wOjEsdC5sYXN0X2ZsdXNoPWwsYS5fdHJfaW5pdCh0KSxmKTpPKGUsZCl9ZnVuY3Rpb24gRyhlKXt2YXIgdD1xKGUpO3JldHVybiB0PT09ZiYmZnVuY3Rpb24oZSl7ZS53aW5kb3dfc2l6ZT0yKmUud19zaXplLFIoZS5oZWFkKSxlLm1heF9sYXp5X21hdGNoPXJbZS5sZXZlbF0ubWF4X2xhenksZS5nb29kX21hdGNoPXJbZS5sZXZlbF0uZ29vZF9sZW5ndGgsZS5uaWNlX21hdGNoPXJbZS5sZXZlbF0ubmljZV9sZW5ndGgsZS5tYXhfY2hhaW5fbGVuZ3RoPXJbZS5sZXZlbF0ubWF4X2NoYWluLGUuc3Ryc3RhcnQ9MCxlLmJsb2NrX3N0YXJ0PTAsZS5sb29rYWhlYWQ9MCxlLmluc2VydD0wLGUubWF0Y2hfbGVuZ3RoPWUucHJldl9sZW5ndGg9dy0xLGUubWF0Y2hfYXZhaWxhYmxlPTAsZS5pbnNfaD0wfShlLnN0YXRlKSx0fWZ1bmN0aW9uIFgoZSx0LG4scixhLG8pe2lmKCFlKXJldHVybiBkO3ZhciBjPTE7aWYodD09PWgmJih0PTYpLHI8MD8oYz0wLHI9LXIpOjE1PHImJihjPTIsci09MTYpLGE8MXx8YjxhfHxuIT09bXx8cjw4fHwxNTxyfHx0PDB8fDk8dHx8bzwwfHxwPG8pcmV0dXJuIE8oZSxkKTs4PT09ciYmKHI9OSk7dmFyIHM9bmV3IFY7cmV0dXJuKGUuc3RhdGU9cykuc3RybT1lLHMud3JhcD1jLHMuZ3poZWFkPW51bGwscy53X2JpdHM9cixzLndfc2l6ZT0xPDxzLndfYml0cyxzLndfbWFzaz1zLndfc2l6ZS0xLHMuaGFzaF9iaXRzPWErNyxzLmhhc2hfc2l6ZT0xPDxzLmhhc2hfYml0cyxzLmhhc2hfbWFzaz1zLmhhc2hfc2l6ZS0xLHMuaGFzaF9zaGlmdD1+figocy5oYXNoX2JpdHMrdy0xKS93KSxzLndpbmRvdz1uZXcgaS5CdWY4KDIqcy53X3NpemUpLHMuaGVhZD1uZXcgaS5CdWYxNihzLmhhc2hfc2l6ZSkscy5wcmV2PW5ldyBpLkJ1ZjE2KHMud19zaXplKSxzLmxpdF9idWZzaXplPTE8PGErNixzLnBlbmRpbmdfYnVmX3NpemU9NCpzLmxpdF9idWZzaXplLHMucGVuZGluZ19idWY9bmV3IGkuQnVmOChzLnBlbmRpbmdfYnVmX3NpemUpLHMuZF9idWY9MSpzLmxpdF9idWZzaXplLHMubF9idWY9MypzLmxpdF9idWZzaXplLHMubGV2ZWw9dCxzLnN0cmF0ZWd5PW8scy5tZXRob2Q9bixHKGUpfXI9W25ldyBIKDAsMCwwLDAsKGZ1bmN0aW9uKGUsdCl7dmFyIG49NjU1MzU7Zm9yKG4+ZS5wZW5kaW5nX2J1Zl9zaXplLTUmJihuPWUucGVuZGluZ19idWZfc2l6ZS01KTs7KXtpZihlLmxvb2thaGVhZDw9MSl7aWYoTShlKSwwPT09ZS5sb29rYWhlYWQmJnQ9PT1sKXJldHVybiBrO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31lLnN0cnN0YXJ0Kz1lLmxvb2thaGVhZCxlLmxvb2thaGVhZD0wO3ZhciByPWUuYmxvY2tfc3RhcnQrbjtpZigoMD09PWUuc3Ryc3RhcnR8fGUuc3Ryc3RhcnQ+PXIpJiYoZS5sb29rYWhlYWQ9ZS5zdHJzdGFydC1yLGUuc3Ryc3RhcnQ9cixQKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gaztpZihlLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQ+PWUud19zaXplLUUmJihQKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4ga31yZXR1cm4gZS5pbnNlcnQ9MCx0PT09dT8oUChlLCEwKSwwPT09ZS5zdHJtLmF2YWlsX291dD9DOkYpOihlLnN0cnN0YXJ0PmUuYmxvY2tfc3RhcnQmJihQKGUsITEpLGUuc3RybS5hdmFpbF9vdXQpLGspfSkpLG5ldyBIKDQsNCw4LDQsaiksbmV3IEgoNCw1LDE2LDgsaiksbmV3IEgoNCw2LDMyLDMyLGopLG5ldyBIKDQsNCwxNiwxNix6KSxuZXcgSCg4LDE2LDMyLDMyLHopLG5ldyBIKDgsMTYsMTI4LDEyOCx6KSxuZXcgSCg4LDMyLDEyOCwyNTYseiksbmV3IEgoMzIsMTI4LDI1OCwxMDI0LHopLG5ldyBIKDMyLDI1OCwyNTgsNDA5Nix6KV0sbi5kZWZsYXRlSW5pdD1mdW5jdGlvbihlLHQpe3JldHVybiBYKGUsdCxtLDE1LDgsMCl9LG4uZGVmbGF0ZUluaXQyPVgsbi5kZWZsYXRlUmVzZXQ9RyxuLmRlZmxhdGVSZXNldEtlZXA9cSxuLmRlZmxhdGVTZXRIZWFkZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZS5zdGF0ZT8yIT09ZS5zdGF0ZS53cmFwP2Q6KGUuc3RhdGUuZ3poZWFkPXQsZik6ZH0sbi5kZWZsYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLHM7aWYoIWV8fCFlLnN0YXRlfHw1PHR8fHQ8MClyZXR1cm4gZT9PKGUsZCk6ZDtpZihpPWUuc3RhdGUsIWUub3V0cHV0fHwhZS5pbnB1dCYmMCE9PWUuYXZhaWxfaW58fDY2Nj09PWkuc3RhdHVzJiZ0IT09dSlyZXR1cm4gTyhlLDA9PT1lLmF2YWlsX291dD8tNTpkKTtpZihpLnN0cm09ZSxuPWkubGFzdF9mbHVzaCxpLmxhc3RfZmx1c2g9dCxpLnN0YXR1cz09PVUpaWYoMj09PWkud3JhcCllLmFkbGVyPTAsQihpLDMxKSxCKGksMTM5KSxCKGksOCksaS5nemhlYWQ/KEIoaSwoaS5nemhlYWQudGV4dD8xOjApKyhpLmd6aGVhZC5oY3JjPzI6MCkrKGkuZ3poZWFkLmV4dHJhPzQ6MCkrKGkuZ3poZWFkLm5hbWU/ODowKSsoaS5nemhlYWQuY29tbWVudD8xNjowKSksQihpLDI1NSZpLmd6aGVhZC50aW1lKSxCKGksaS5nemhlYWQudGltZT4+OCYyNTUpLEIoaSxpLmd6aGVhZC50aW1lPj4xNiYyNTUpLEIoaSxpLmd6aGVhZC50aW1lPj4yNCYyNTUpLEIoaSw5PT09aS5sZXZlbD8yOjI8PWkuc3RyYXRlZ3l8fGkubGV2ZWw8Mj80OjApLEIoaSwyNTUmaS5nemhlYWQub3MpLGkuZ3poZWFkLmV4dHJhJiZpLmd6aGVhZC5leHRyYS5sZW5ndGgmJihCKGksMjU1JmkuZ3poZWFkLmV4dHJhLmxlbmd0aCksQihpLGkuZ3poZWFkLmV4dHJhLmxlbmd0aD4+OCYyNTUpKSxpLmd6aGVhZC5oY3JjJiYoZS5hZGxlcj1jKGUuYWRsZXIsaS5wZW5kaW5nX2J1ZixpLnBlbmRpbmcsMCkpLGkuZ3ppbmRleD0wLGkuc3RhdHVzPTY5KTooQihpLDApLEIoaSwwKSxCKGksMCksQihpLDApLEIoaSwwKSxCKGksOT09PWkubGV2ZWw/MjoyPD1pLnN0cmF0ZWd5fHxpLmxldmVsPDI/NDowKSxCKGksMyksaS5zdGF0dXM9QSk7ZWxzZXt2YXIgaD1tKyhpLndfYml0cy04PDw0KTw8ODtofD0oMjw9aS5zdHJhdGVneXx8aS5sZXZlbDwyPzA6aS5sZXZlbDw2PzE6Nj09PWkubGV2ZWw/MjozKTw8NiwwIT09aS5zdHJzdGFydCYmKGh8PTMyKSxoKz0zMS1oJTMxLGkuc3RhdHVzPUEsVyhpLGgpLDAhPT1pLnN0cnN0YXJ0JiYoVyhpLGUuYWRsZXI+Pj4xNiksVyhpLDY1NTM1JmUuYWRsZXIpKSxlLmFkbGVyPTF9aWYoNjk9PT1pLnN0YXR1cylpZihpLmd6aGVhZC5leHRyYSl7Zm9yKG89aS5wZW5kaW5nO2kuZ3ppbmRleDwoNjU1MzUmaS5nemhlYWQuZXh0cmEubGVuZ3RoKSYmKGkucGVuZGluZyE9PWkucGVuZGluZ19idWZfc2l6ZXx8KGkuZ3poZWFkLmhjcmMmJmkucGVuZGluZz5vJiYoZS5hZGxlcj1jKGUuYWRsZXIsaS5wZW5kaW5nX2J1ZixpLnBlbmRpbmctbyxvKSksTihlKSxvPWkucGVuZGluZyxpLnBlbmRpbmchPT1pLnBlbmRpbmdfYnVmX3NpemUpKTspQihpLDI1NSZpLmd6aGVhZC5leHRyYVtpLmd6aW5kZXhdKSxpLmd6aW5kZXgrKztpLmd6aGVhZC5oY3JjJiZpLnBlbmRpbmc+byYmKGUuYWRsZXI9YyhlLmFkbGVyLGkucGVuZGluZ19idWYsaS5wZW5kaW5nLW8sbykpLGkuZ3ppbmRleD09PWkuZ3poZWFkLmV4dHJhLmxlbmd0aCYmKGkuZ3ppbmRleD0wLGkuc3RhdHVzPTczKX1lbHNlIGkuc3RhdHVzPTczO2lmKDczPT09aS5zdGF0dXMpaWYoaS5nemhlYWQubmFtZSl7bz1pLnBlbmRpbmc7ZG97aWYoaS5wZW5kaW5nPT09aS5wZW5kaW5nX2J1Zl9zaXplJiYoaS5nemhlYWQuaGNyYyYmaS5wZW5kaW5nPm8mJihlLmFkbGVyPWMoZS5hZGxlcixpLnBlbmRpbmdfYnVmLGkucGVuZGluZy1vLG8pKSxOKGUpLG89aS5wZW5kaW5nLGkucGVuZGluZz09PWkucGVuZGluZ19idWZfc2l6ZSkpe3M9MTticmVha31zPWkuZ3ppbmRleDxpLmd6aGVhZC5uYW1lLmxlbmd0aD8yNTUmaS5nemhlYWQubmFtZS5jaGFyQ29kZUF0KGkuZ3ppbmRleCsrKTowLEIoaSxzKX13aGlsZSgwIT09cyk7aS5nemhlYWQuaGNyYyYmaS5wZW5kaW5nPm8mJihlLmFkbGVyPWMoZS5hZGxlcixpLnBlbmRpbmdfYnVmLGkucGVuZGluZy1vLG8pKSwwPT09cyYmKGkuZ3ppbmRleD0wLGkuc3RhdHVzPTkxKX1lbHNlIGkuc3RhdHVzPTkxO2lmKDkxPT09aS5zdGF0dXMpaWYoaS5nemhlYWQuY29tbWVudCl7bz1pLnBlbmRpbmc7ZG97aWYoaS5wZW5kaW5nPT09aS5wZW5kaW5nX2J1Zl9zaXplJiYoaS5nemhlYWQuaGNyYyYmaS5wZW5kaW5nPm8mJihlLmFkbGVyPWMoZS5hZGxlcixpLnBlbmRpbmdfYnVmLGkucGVuZGluZy1vLG8pKSxOKGUpLG89aS5wZW5kaW5nLGkucGVuZGluZz09PWkucGVuZGluZ19idWZfc2l6ZSkpe3M9MTticmVha31zPWkuZ3ppbmRleDxpLmd6aGVhZC5jb21tZW50Lmxlbmd0aD8yNTUmaS5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KGkuZ3ppbmRleCsrKTowLEIoaSxzKX13aGlsZSgwIT09cyk7aS5nemhlYWQuaGNyYyYmaS5wZW5kaW5nPm8mJihlLmFkbGVyPWMoZS5hZGxlcixpLnBlbmRpbmdfYnVmLGkucGVuZGluZy1vLG8pKSwwPT09cyYmKGkuc3RhdHVzPTEwMyl9ZWxzZSBpLnN0YXR1cz0xMDM7aWYoMTAzPT09aS5zdGF0dXMmJihpLmd6aGVhZC5oY3JjPyhpLnBlbmRpbmcrMj5pLnBlbmRpbmdfYnVmX3NpemUmJk4oZSksaS5wZW5kaW5nKzI8PWkucGVuZGluZ19idWZfc2l6ZSYmKEIoaSwyNTUmZS5hZGxlciksQihpLGUuYWRsZXI+PjgmMjU1KSxlLmFkbGVyPTAsaS5zdGF0dXM9QSkpOmkuc3RhdHVzPUEpLDAhPT1pLnBlbmRpbmcpe2lmKE4oZSksMD09PWUuYXZhaWxfb3V0KXJldHVybiBpLmxhc3RfZmx1c2g9LTEsZn1lbHNlIGlmKDA9PT1lLmF2YWlsX2luJiZJKHQpPD1JKG4pJiZ0IT09dSlyZXR1cm4gTyhlLC01KTtpZig2NjY9PT1pLnN0YXR1cyYmMCE9PWUuYXZhaWxfaW4pcmV0dXJuIE8oZSwtNSk7aWYoMCE9PWUuYXZhaWxfaW58fDAhPT1pLmxvb2thaGVhZHx8dCE9PWwmJjY2NiE9PWkuc3RhdHVzKXt2YXIgcD0yPT09aS5zdHJhdGVneT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbjs7KXtpZigwPT09ZS5sb29rYWhlYWQmJihNKGUpLDA9PT1lLmxvb2thaGVhZCkpe2lmKHQ9PT1sKXJldHVybiBrO2JyZWFrfWlmKGUubWF0Y2hfbGVuZ3RoPTAsbj1hLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrLG4mJihQKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4ga31yZXR1cm4gZS5pbnNlcnQ9MCx0PT09dT8oUChlLCEwKSwwPT09ZS5zdHJtLmF2YWlsX291dD9DOkYpOmUubGFzdF9saXQmJihQKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KT9rOlN9KGksdCk6Mz09PWkuc3RyYXRlZ3k/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4scixpLG8sYz1lLndpbmRvdzs7KXtpZihlLmxvb2thaGVhZDw9Xyl7aWYoTShlKSxlLmxvb2thaGVhZDw9XyYmdD09PWwpcmV0dXJuIGs7aWYoMD09PWUubG9va2FoZWFkKWJyZWFrfWlmKGUubWF0Y2hfbGVuZ3RoPTAsZS5sb29rYWhlYWQ+PXcmJjA8ZS5zdHJzdGFydCYmKHI9Y1tpPWUuc3Ryc3RhcnQtMV0pPT09Y1srK2ldJiZyPT09Y1srK2ldJiZyPT09Y1srK2ldKXtvPWUuc3Ryc3RhcnQrXztkb3t9d2hpbGUocj09PWNbKytpXSYmcj09PWNbKytpXSYmcj09PWNbKytpXSYmcj09PWNbKytpXSYmcj09PWNbKytpXSYmcj09PWNbKytpXSYmcj09PWNbKytpXSYmcj09PWNbKytpXSYmaTxvKTtlLm1hdGNoX2xlbmd0aD1fLShvLWkpLGUubWF0Y2hfbGVuZ3RoPmUubG9va2FoZWFkJiYoZS5tYXRjaF9sZW5ndGg9ZS5sb29rYWhlYWQpfWlmKGUubWF0Y2hfbGVuZ3RoPj13PyhuPWEuX3RyX3RhbGx5KGUsMSxlLm1hdGNoX2xlbmd0aC13KSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCk6KG49YS5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKyksbiYmKFAoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBrfXJldHVybiBlLmluc2VydD0wLHQ9PT11PyhQKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P0M6Rik6ZS5sYXN0X2xpdCYmKFAoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP2s6U30oaSx0KTpyW2kubGV2ZWxdLmZ1bmMoaSx0KTtpZihwIT09QyYmcCE9PUZ8fChpLnN0YXR1cz02NjYpLHA9PT1rfHxwPT09QylyZXR1cm4gMD09PWUuYXZhaWxfb3V0JiYoaS5sYXN0X2ZsdXNoPS0xKSxmO2lmKHA9PT1TJiYoMT09PXQ/YS5fdHJfYWxpZ24oaSk6NSE9PXQmJihhLl90cl9zdG9yZWRfYmxvY2soaSwwLDAsITEpLDM9PT10JiYoUihpLmhlYWQpLDA9PT1pLmxvb2thaGVhZCYmKGkuc3Ryc3RhcnQ9MCxpLmJsb2NrX3N0YXJ0PTAsaS5pbnNlcnQ9MCkpKSxOKGUpLDA9PT1lLmF2YWlsX291dCkpcmV0dXJuIGkubGFzdF9mbHVzaD0tMSxmfXJldHVybiB0IT09dT9mOmkud3JhcDw9MD8xOigyPT09aS53cmFwPyhCKGksMjU1JmUuYWRsZXIpLEIoaSxlLmFkbGVyPj44JjI1NSksQihpLGUuYWRsZXI+PjE2JjI1NSksQihpLGUuYWRsZXI+PjI0JjI1NSksQihpLDI1NSZlLnRvdGFsX2luKSxCKGksZS50b3RhbF9pbj4+OCYyNTUpLEIoaSxlLnRvdGFsX2luPj4xNiYyNTUpLEIoaSxlLnRvdGFsX2luPj4yNCYyNTUpKTooVyhpLGUuYWRsZXI+Pj4xNiksVyhpLDY1NTM1JmUuYWRsZXIpKSxOKGUpLDA8aS53cmFwJiYoaS53cmFwPS1pLndyYXApLDAhPT1pLnBlbmRpbmc/ZjoxKX0sbi5kZWZsYXRlRW5kPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBlJiZlLnN0YXRlPyh0PWUuc3RhdGUuc3RhdHVzKSE9PVUmJjY5IT09dCYmNzMhPT10JiY5MSE9PXQmJjEwMyE9PXQmJnQhPT1BJiY2NjYhPT10P08oZSxkKTooZS5zdGF0ZT1udWxsLHQ9PT1BP08oZSwtMyk6Zik6ZH0sbi5kZWZsYXRlU2V0RGljdGlvbmFyeT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsYSxjLHMsbCx1LGgscD10Lmxlbmd0aDtpZighZXx8IWUuc3RhdGUpcmV0dXJuIGQ7aWYoMj09PShjPShuPWUuc3RhdGUpLndyYXApfHwxPT09YyYmbi5zdGF0dXMhPT1VfHxuLmxvb2thaGVhZClyZXR1cm4gZDtmb3IoMT09PWMmJihlLmFkbGVyPW8oZS5hZGxlcix0LHAsMCkpLG4ud3JhcD0wLHA+PW4ud19zaXplJiYoMD09PWMmJihSKG4uaGVhZCksbi5zdHJzdGFydD0wLG4uYmxvY2tfc3RhcnQ9MCxuLmluc2VydD0wKSxoPW5ldyBpLkJ1Zjgobi53X3NpemUpLGkuYXJyYXlTZXQoaCx0LHAtbi53X3NpemUsbi53X3NpemUsMCksdD1oLHA9bi53X3NpemUpLHM9ZS5hdmFpbF9pbixsPWUubmV4dF9pbix1PWUuaW5wdXQsZS5hdmFpbF9pbj1wLGUubmV4dF9pbj0wLGUuaW5wdXQ9dCxNKG4pO24ubG9va2FoZWFkPj13Oyl7Zm9yKHI9bi5zdHJzdGFydCxhPW4ubG9va2FoZWFkLSh3LTEpO24uaW5zX2g9KG4uaW5zX2g8PG4uaGFzaF9zaGlmdF5uLndpbmRvd1tyK3ctMV0pJm4uaGFzaF9tYXNrLG4ucHJldltyJm4ud19tYXNrXT1uLmhlYWRbbi5pbnNfaF0sbi5oZWFkW24uaW5zX2hdPXIscisrLC0tYTspO24uc3Ryc3RhcnQ9cixuLmxvb2thaGVhZD13LTEsTShuKX1yZXR1cm4gbi5zdHJzdGFydCs9bi5sb29rYWhlYWQsbi5ibG9ja19zdGFydD1uLnN0cnN0YXJ0LG4uaW5zZXJ0PW4ubG9va2FoZWFkLG4ubG9va2FoZWFkPTAsbi5tYXRjaF9sZW5ndGg9bi5wcmV2X2xlbmd0aD13LTEsbi5tYXRjaF9hdmFpbGFibGU9MCxlLm5leHRfaW49bCxlLmlucHV0PXUsZS5hdmFpbF9pbj1zLG4ud3JhcD1jLGZ9LG4uZGVmbGF0ZUluZm89InBha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkifSx7Ii4uL3V0aWxzL2NvbW1vbiI6NDEsIi4vYWRsZXIzMiI6NDMsIi4vY3JjMzIiOjQ1LCIuL21lc3NhZ2VzIjo1MSwiLi90cmVlcyI6NTJ9XSw0NzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbigpe3RoaXMudGV4dD0wLHRoaXMudGltZT0wLHRoaXMueGZsYWdzPTAsdGhpcy5vcz0wLHRoaXMuZXh0cmE9bnVsbCx0aGlzLmV4dHJhX2xlbj0wLHRoaXMubmFtZT0iIix0aGlzLmNvbW1lbnQ9IiIsdGhpcy5oY3JjPTAsdGhpcy5kb25lPSExfX0se31dLDQ4OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLGEsbyxjLHMsbCx1LGYsZCxoLHAsZyxtLGIseSx2LHgsRCxULHcsXyxFLFU7bj1lLnN0YXRlLHI9ZS5uZXh0X2luLEU9ZS5pbnB1dCxpPXIrKGUuYXZhaWxfaW4tNSksYT1lLm5leHRfb3V0LFU9ZS5vdXRwdXQsbz1hLSh0LWUuYXZhaWxfb3V0KSxjPWErKGUuYXZhaWxfb3V0LTI1Nykscz1uLmRtYXgsbD1uLndzaXplLHU9bi53aGF2ZSxmPW4ud25leHQsZD1uLndpbmRvdyxoPW4uaG9sZCxwPW4uYml0cyxnPW4ubGVuY29kZSxtPW4uZGlzdGNvZGUsYj0oMTw8bi5sZW5iaXRzKS0xLHk9KDE8PG4uZGlzdGJpdHMpLTE7ZTpkb3twPDE1JiYoaCs9RVtyKytdPDxwLHArPTgsaCs9RVtyKytdPDxwLHArPTgpLHY9Z1toJmJdO3Q6Zm9yKDs7KXtpZihoPj4+PXg9dj4+PjI0LHAtPXgsMD09KHg9dj4+PjE2JjI1NSkpVVthKytdPTY1NTM1JnY7ZWxzZXtpZighKDE2JngpKXtpZigwPT0oNjQmeCkpe3Y9Z1soNjU1MzUmdikrKGgmKDE8PHgpLTEpXTtjb250aW51ZSB0fWlmKDMyJngpe24ubW9kZT0xMjticmVhayBlfWUubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiLG4ubW9kZT0zMDticmVhayBlfUQ9NjU1MzUmdiwoeCY9MTUpJiYocDx4JiYoaCs9RVtyKytdPDxwLHArPTgpLEQrPWgmKDE8PHgpLTEsaD4+Pj14LHAtPXgpLHA8MTUmJihoKz1FW3IrK108PHAscCs9OCxoKz1FW3IrK108PHAscCs9OCksdj1tW2gmeV07bjpmb3IoOzspe2lmKGg+Pj49eD12Pj4+MjQscC09eCwhKDE2Jih4PXY+Pj4xNiYyNTUpKSl7aWYoMD09KDY0JngpKXt2PW1bKDY1NTM1JnYpKyhoJigxPDx4KS0xKV07Y29udGludWUgbn1lLm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixuLm1vZGU9MzA7YnJlYWsgZX1pZihUPTY1NTM1JnYscDwoeCY9MTUpJiYoaCs9RVtyKytdPDxwLChwKz04KTx4JiYoaCs9RVtyKytdPDxwLHArPTgpKSxzPChUKz1oJigxPDx4KS0xKSl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixuLm1vZGU9MzA7YnJlYWsgZX1pZihoPj4+PXgscC09eCwoeD1hLW8pPFQpe2lmKHU8KHg9VC14KSYmbi5zYW5lKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT0zMDticmVhayBlfWlmKF89ZCwodz0wKT09PWYpe2lmKHcrPWwteCx4PEQpe2ZvcihELT14O1VbYSsrXT1kW3crK10sLS14Oyk7dz1hLVQsXz1VfX1lbHNlIGlmKGY8eCl7aWYodys9bCtmLXgsKHgtPWYpPEQpe2ZvcihELT14O1VbYSsrXT1kW3crK10sLS14Oyk7aWYodz0wLGY8RCl7Zm9yKEQtPXg9ZjtVW2ErK109ZFt3KytdLC0teDspO3c9YS1ULF89VX19fWVsc2UgaWYodys9Zi14LHg8RCl7Zm9yKEQtPXg7VVthKytdPWRbdysrXSwtLXg7KTt3PWEtVCxfPVV9Zm9yKDsyPEQ7KVVbYSsrXT1fW3crK10sVVthKytdPV9bdysrXSxVW2ErK109X1t3KytdLEQtPTM7RCYmKFVbYSsrXT1fW3crK10sMTxEJiYoVVthKytdPV9bdysrXSkpfWVsc2V7Zm9yKHc9YS1UO1VbYSsrXT1VW3crK10sVVthKytdPVVbdysrXSxVW2ErK109VVt3KytdLDI8KEQtPTMpOyk7RCYmKFVbYSsrXT1VW3crK10sMTxEJiYoVVthKytdPVVbdysrXSkpfWJyZWFrfX1icmVha319d2hpbGUocjxpJiZhPGMpO3ItPUQ9cD4+MyxoJj0oMTw8KHAtPUQ8PDMpKS0xLGUubmV4dF9pbj1yLGUubmV4dF9vdXQ9YSxlLmF2YWlsX2luPXI8aT9pLXIrNTo1LShyLWkpLGUuYXZhaWxfb3V0PWE8Yz9jLWErMjU3OjI1Ny0oYS1jKSxuLmhvbGQ9aCxuLmJpdHM9cH19LHt9XSw0OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWxzL2NvbW1vbiIpLGk9ZSgiLi9hZGxlcjMyIiksYT1lKCIuL2NyYzMyIiksbz1lKCIuL2luZmZhc3QiKSxjPWUoIi4vaW5mdHJlZXMiKSxzPTEsbD0yLHU9MCxmPS0yLGQ9MSxoPTg1MixwPTU5MjtmdW5jdGlvbiBnKGUpe3JldHVybihlPj4+MjQmMjU1KSsoZT4+PjgmNjUyODApKygoNjUyODAmZSk8PDgpKygoMjU1JmUpPDwyNCl9ZnVuY3Rpb24gbSgpe3RoaXMubW9kZT0wLHRoaXMubGFzdD0hMSx0aGlzLndyYXA9MCx0aGlzLmhhdmVkaWN0PSExLHRoaXMuZmxhZ3M9MCx0aGlzLmRtYXg9MCx0aGlzLmNoZWNrPTAsdGhpcy50b3RhbD0wLHRoaXMuaGVhZD1udWxsLHRoaXMud2JpdHM9MCx0aGlzLndzaXplPTAsdGhpcy53aGF2ZT0wLHRoaXMud25leHQ9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMuaG9sZD0wLHRoaXMuYml0cz0wLHRoaXMubGVuZ3RoPTAsdGhpcy5vZmZzZXQ9MCx0aGlzLmV4dHJhPTAsdGhpcy5sZW5jb2RlPW51bGwsdGhpcy5kaXN0Y29kZT1udWxsLHRoaXMubGVuYml0cz0wLHRoaXMuZGlzdGJpdHM9MCx0aGlzLm5jb2RlPTAsdGhpcy5ubGVuPTAsdGhpcy5uZGlzdD0wLHRoaXMuaGF2ZT0wLHRoaXMubmV4dD1udWxsLHRoaXMubGVucz1uZXcgci5CdWYxNigzMjApLHRoaXMud29yaz1uZXcgci5CdWYxNigyODgpLHRoaXMubGVuZHluPW51bGwsdGhpcy5kaXN0ZHluPW51bGwsdGhpcy5zYW5lPTAsdGhpcy5iYWNrPTAsdGhpcy53YXM9MH1mdW5jdGlvbiBiKGUpe3ZhciB0O3JldHVybiBlJiZlLnN0YXRlPyh0PWUuc3RhdGUsZS50b3RhbF9pbj1lLnRvdGFsX291dD10LnRvdGFsPTAsZS5tc2c9IiIsdC53cmFwJiYoZS5hZGxlcj0xJnQud3JhcCksdC5tb2RlPWQsdC5sYXN0PTAsdC5oYXZlZGljdD0wLHQuZG1heD0zMjc2OCx0LmhlYWQ9bnVsbCx0LmhvbGQ9MCx0LmJpdHM9MCx0LmxlbmNvZGU9dC5sZW5keW49bmV3IHIuQnVmMzIoaCksdC5kaXN0Y29kZT10LmRpc3RkeW49bmV3IHIuQnVmMzIocCksdC5zYW5lPTEsdC5iYWNrPS0xLHUpOmZ9ZnVuY3Rpb24geShlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8oKHQ9ZS5zdGF0ZSkud3NpemU9MCx0LndoYXZlPTAsdC53bmV4dD0wLGIoZSkpOmZ9ZnVuY3Rpb24gdihlLHQpe3ZhciBuLHI7cmV0dXJuIGUmJmUuc3RhdGU/KHI9ZS5zdGF0ZSx0PDA/KG49MCx0PS10KToobj0xKyh0Pj40KSx0PDQ4JiYodCY9MTUpKSx0JiYodDw4fHwxNTx0KT9mOihudWxsIT09ci53aW5kb3cmJnIud2JpdHMhPT10JiYoci53aW5kb3c9bnVsbCksci53cmFwPW4sci53Yml0cz10LHkoZSkpKTpmfWZ1bmN0aW9uIHgoZSx0KXt2YXIgbixyO3JldHVybiBlPyhyPW5ldyBtLChlLnN0YXRlPXIpLndpbmRvdz1udWxsLChuPXYoZSx0KSkhPT11JiYoZS5zdGF0ZT1udWxsKSxuKTpmfXZhciBELFQsdz0hMDtmdW5jdGlvbiBfKGUpe2lmKHcpe3ZhciB0O2ZvcihEPW5ldyByLkJ1ZjMyKDUxMiksVD1uZXcgci5CdWYzMigzMiksdD0wO3Q8MTQ0OyllLmxlbnNbdCsrXT04O2Zvcig7dDwyNTY7KWUubGVuc1t0KytdPTk7Zm9yKDt0PDI4MDspZS5sZW5zW3QrK109Nztmb3IoO3Q8Mjg4OyllLmxlbnNbdCsrXT04O2ZvcihjKHMsZS5sZW5zLDAsMjg4LEQsMCxlLndvcmsse2JpdHM6OX0pLHQ9MDt0PDMyOyllLmxlbnNbdCsrXT01O2MobCxlLmxlbnMsMCwzMixULDAsZS53b3JrLHtiaXRzOjV9KSx3PSExfWUubGVuY29kZT1ELGUubGVuYml0cz05LGUuZGlzdGNvZGU9VCxlLmRpc3RiaXRzPTV9ZnVuY3Rpb24gRShlLHQsbixpKXt2YXIgYSxvPWUuc3RhdGU7cmV0dXJuIG51bGw9PT1vLndpbmRvdyYmKG8ud3NpemU9MTw8by53Yml0cyxvLnduZXh0PTAsby53aGF2ZT0wLG8ud2luZG93PW5ldyByLkJ1Zjgoby53c2l6ZSkpLGk+PW8ud3NpemU/KHIuYXJyYXlTZXQoby53aW5kb3csdCxuLW8ud3NpemUsby53c2l6ZSwwKSxvLnduZXh0PTAsby53aGF2ZT1vLndzaXplKTooaTwoYT1vLndzaXplLW8ud25leHQpJiYoYT1pKSxyLmFycmF5U2V0KG8ud2luZG93LHQsbi1pLGEsby53bmV4dCksKGktPWEpPyhyLmFycmF5U2V0KG8ud2luZG93LHQsbi1pLGksMCksby53bmV4dD1pLG8ud2hhdmU9by53c2l6ZSk6KG8ud25leHQrPWEsby53bmV4dD09PW8ud3NpemUmJihvLnduZXh0PTApLG8ud2hhdmU8by53c2l6ZSYmKG8ud2hhdmUrPWEpKSksMH1uLmluZmxhdGVSZXNldD15LG4uaW5mbGF0ZVJlc2V0Mj12LG4uaW5mbGF0ZVJlc2V0S2VlcD1iLG4uaW5mbGF0ZUluaXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHgoZSwxNSl9LG4uaW5mbGF0ZUluaXQyPXgsbi5pbmZsYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG4saCxwLG0sYix5LHYseCxELFQsdyxVLEEsayxTLEMsRixPLEksUixOLFAsQixXLEw9MCxNPW5ldyByLkJ1ZjgoNCksaj1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07aWYoIWV8fCFlLnN0YXRlfHwhZS5vdXRwdXR8fCFlLmlucHV0JiYwIT09ZS5hdmFpbF9pbilyZXR1cm4gZjsxMj09PShuPWUuc3RhdGUpLm1vZGUmJihuLm1vZGU9MTMpLGI9ZS5uZXh0X291dCxwPWUub3V0cHV0LHY9ZS5hdmFpbF9vdXQsbT1lLm5leHRfaW4saD1lLmlucHV0LHk9ZS5hdmFpbF9pbix4PW4uaG9sZCxEPW4uYml0cyxUPXksdz12LFA9dTtlOmZvcig7Oylzd2l0Y2gobi5tb2RlKXtjYXNlIGQ6aWYoMD09PW4ud3JhcCl7bi5tb2RlPTEzO2JyZWFrfWZvcig7RDwxNjspe2lmKDA9PT15KWJyZWFrIGU7eS0tLHgrPWhbbSsrXTw8RCxEKz04fWlmKDImbi53cmFwJiYzNTYxNT09PXgpe01bbi5jaGVjaz0wXT0yNTUmeCxNWzFdPXg+Pj44JjI1NSxuLmNoZWNrPWEobi5jaGVjayxNLDIsMCksRD14PTAsbi5tb2RlPTI7YnJlYWt9aWYobi5mbGFncz0wLG4uaGVhZCYmKG4uaGVhZC5kb25lPSExKSwhKDEmbi53cmFwKXx8KCgoMjU1JngpPDw4KSsoeD4+OCkpJTMxKXtlLm1zZz0iaW5jb3JyZWN0IGhlYWRlciBjaGVjayIsbi5tb2RlPTMwO2JyZWFrfWlmKDghPSgxNSZ4KSl7ZS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixuLm1vZGU9MzA7YnJlYWt9aWYoRC09NCxOPTgrKDE1Jih4Pj4+PTQpKSwwPT09bi53Yml0cyluLndiaXRzPU47ZWxzZSBpZihOPm4ud2JpdHMpe2UubXNnPSJpbnZhbGlkIHdpbmRvdyBzaXplIixuLm1vZGU9MzA7YnJlYWt9bi5kbWF4PTE8PE4sZS5hZGxlcj1uLmNoZWNrPTEsbi5tb2RlPTUxMiZ4PzEwOjEyLEQ9eD0wO2JyZWFrO2Nhc2UgMjpmb3IoO0Q8MTY7KXtpZigwPT09eSlicmVhayBlO3ktLSx4Kz1oW20rK108PEQsRCs9OH1pZihuLmZsYWdzPXgsOCE9KDI1NSZuLmZsYWdzKSl7ZS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixuLm1vZGU9MzA7YnJlYWt9aWYoNTczNDQmbi5mbGFncyl7ZS5tc2c9InVua25vd24gaGVhZGVyIGZsYWdzIHNldCIsbi5tb2RlPTMwO2JyZWFrfW4uaGVhZCYmKG4uaGVhZC50ZXh0PXg+PjgmMSksNTEyJm4uZmxhZ3MmJihNWzBdPTI1NSZ4LE1bMV09eD4+PjgmMjU1LG4uY2hlY2s9YShuLmNoZWNrLE0sMiwwKSksRD14PTAsbi5tb2RlPTM7Y2FzZSAzOmZvcig7RDwzMjspe2lmKDA9PT15KWJyZWFrIGU7eS0tLHgrPWhbbSsrXTw8RCxEKz04fW4uaGVhZCYmKG4uaGVhZC50aW1lPXgpLDUxMiZuLmZsYWdzJiYoTVswXT0yNTUmeCxNWzFdPXg+Pj44JjI1NSxNWzJdPXg+Pj4xNiYyNTUsTVszXT14Pj4+MjQmMjU1LG4uY2hlY2s9YShuLmNoZWNrLE0sNCwwKSksRD14PTAsbi5tb2RlPTQ7Y2FzZSA0OmZvcig7RDwxNjspe2lmKDA9PT15KWJyZWFrIGU7eS0tLHgrPWhbbSsrXTw8RCxEKz04fW4uaGVhZCYmKG4uaGVhZC54ZmxhZ3M9MjU1Jngsbi5oZWFkLm9zPXg+PjgpLDUxMiZuLmZsYWdzJiYoTVswXT0yNTUmeCxNWzFdPXg+Pj44JjI1NSxuLmNoZWNrPWEobi5jaGVjayxNLDIsMCkpLEQ9eD0wLG4ubW9kZT01O2Nhc2UgNTppZigxMDI0Jm4uZmxhZ3Mpe2Zvcig7RDwxNjspe2lmKDA9PT15KWJyZWFrIGU7eS0tLHgrPWhbbSsrXTw8RCxEKz04fW4ubGVuZ3RoPXgsbi5oZWFkJiYobi5oZWFkLmV4dHJhX2xlbj14KSw1MTImbi5mbGFncyYmKE1bMF09MjU1JngsTVsxXT14Pj4+OCYyNTUsbi5jaGVjaz1hKG4uY2hlY2ssTSwyLDApKSxEPXg9MH1lbHNlIG4uaGVhZCYmKG4uaGVhZC5leHRyYT1udWxsKTtuLm1vZGU9NjtjYXNlIDY6aWYoMTAyNCZuLmZsYWdzJiYoeTwoVT1uLmxlbmd0aCkmJihVPXkpLFUmJihuLmhlYWQmJihOPW4uaGVhZC5leHRyYV9sZW4tbi5sZW5ndGgsbi5oZWFkLmV4dHJhfHwobi5oZWFkLmV4dHJhPW5ldyBBcnJheShuLmhlYWQuZXh0cmFfbGVuKSksci5hcnJheVNldChuLmhlYWQuZXh0cmEsaCxtLFUsTikpLDUxMiZuLmZsYWdzJiYobi5jaGVjaz1hKG4uY2hlY2ssaCxVLG0pKSx5LT1VLG0rPVUsbi5sZW5ndGgtPVUpLG4ubGVuZ3RoKSlicmVhayBlO24ubGVuZ3RoPTAsbi5tb2RlPTc7Y2FzZSA3OmlmKDIwNDgmbi5mbGFncyl7aWYoMD09PXkpYnJlYWsgZTtmb3IoVT0wO049aFttK1UrK10sbi5oZWFkJiZOJiZuLmxlbmd0aDw2NTUzNiYmKG4uaGVhZC5uYW1lKz1TdHJpbmcuZnJvbUNoYXJDb2RlKE4pKSxOJiZVPHk7KTtpZig1MTImbi5mbGFncyYmKG4uY2hlY2s9YShuLmNoZWNrLGgsVSxtKSkseS09VSxtKz1VLE4pYnJlYWsgZX1lbHNlIG4uaGVhZCYmKG4uaGVhZC5uYW1lPW51bGwpO24ubGVuZ3RoPTAsbi5tb2RlPTg7Y2FzZSA4OmlmKDQwOTYmbi5mbGFncyl7aWYoMD09PXkpYnJlYWsgZTtmb3IoVT0wO049aFttK1UrK10sbi5oZWFkJiZOJiZuLmxlbmd0aDw2NTUzNiYmKG4uaGVhZC5jb21tZW50Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKE4pKSxOJiZVPHk7KTtpZig1MTImbi5mbGFncyYmKG4uY2hlY2s9YShuLmNoZWNrLGgsVSxtKSkseS09VSxtKz1VLE4pYnJlYWsgZX1lbHNlIG4uaGVhZCYmKG4uaGVhZC5jb21tZW50PW51bGwpO24ubW9kZT05O2Nhc2UgOTppZig1MTImbi5mbGFncyl7Zm9yKDtEPDE2Oyl7aWYoMD09PXkpYnJlYWsgZTt5LS0seCs9aFttKytdPDxELEQrPTh9aWYoeCE9PSg2NTUzNSZuLmNoZWNrKSl7ZS5tc2c9ImhlYWRlciBjcmMgbWlzbWF0Y2giLG4ubW9kZT0zMDticmVha31EPXg9MH1uLmhlYWQmJihuLmhlYWQuaGNyYz1uLmZsYWdzPj45JjEsbi5oZWFkLmRvbmU9ITApLGUuYWRsZXI9bi5jaGVjaz0wLG4ubW9kZT0xMjticmVhaztjYXNlIDEwOmZvcig7RDwzMjspe2lmKDA9PT15KWJyZWFrIGU7eS0tLHgrPWhbbSsrXTw8RCxEKz04fWUuYWRsZXI9bi5jaGVjaz1nKHgpLEQ9eD0wLG4ubW9kZT0xMTtjYXNlIDExOmlmKDA9PT1uLmhhdmVkaWN0KXJldHVybiBlLm5leHRfb3V0PWIsZS5hdmFpbF9vdXQ9dixlLm5leHRfaW49bSxlLmF2YWlsX2luPXksbi5ob2xkPXgsbi5iaXRzPUQsMjtlLmFkbGVyPW4uY2hlY2s9MSxuLm1vZGU9MTI7Y2FzZSAxMjppZig1PT09dHx8Nj09PXQpYnJlYWsgZTtjYXNlIDEzOmlmKG4ubGFzdCl7eD4+Pj03JkQsRC09NyZELG4ubW9kZT0yNzticmVha31mb3IoO0Q8Mzspe2lmKDA9PT15KWJyZWFrIGU7eS0tLHgrPWhbbSsrXTw8RCxEKz04fXN3aXRjaChuLmxhc3Q9MSZ4LEQtPTEsMyYoeD4+Pj0xKSl7Y2FzZSAwOm4ubW9kZT0xNDticmVhaztjYXNlIDE6aWYoXyhuKSxuLm1vZGU9MjAsNiE9PXQpYnJlYWs7eD4+Pj0yLEQtPTI7YnJlYWsgZTtjYXNlIDI6bi5tb2RlPTE3O2JyZWFrO2Nhc2UgMzplLm1zZz0iaW52YWxpZCBibG9jayB0eXBlIixuLm1vZGU9MzB9eD4+Pj0yLEQtPTI7YnJlYWs7Y2FzZSAxNDpmb3IoeD4+Pj03JkQsRC09NyZEO0Q8MzI7KXtpZigwPT09eSlicmVhayBlO3ktLSx4Kz1oW20rK108PEQsRCs9OH1pZigoNjU1MzUmeCkhPSh4Pj4+MTZeNjU1MzUpKXtlLm1zZz0iaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyIsbi5tb2RlPTMwO2JyZWFrfWlmKG4ubGVuZ3RoPTY1NTM1JngsRD14PTAsbi5tb2RlPTE1LDY9PT10KWJyZWFrIGU7Y2FzZSAxNTpuLm1vZGU9MTY7Y2FzZSAxNjppZihVPW4ubGVuZ3RoKXtpZih5PFUmJihVPXkpLHY8VSYmKFU9diksMD09PVUpYnJlYWsgZTtyLmFycmF5U2V0KHAsaCxtLFUsYikseS09VSxtKz1VLHYtPVUsYis9VSxuLmxlbmd0aC09VTticmVha31uLm1vZGU9MTI7YnJlYWs7Y2FzZSAxNzpmb3IoO0Q8MTQ7KXtpZigwPT09eSlicmVhayBlO3ktLSx4Kz1oW20rK108PEQsRCs9OH1pZihuLm5sZW49MjU3KygzMSZ4KSx4Pj4+PTUsRC09NSxuLm5kaXN0PTErKDMxJngpLHg+Pj49NSxELT01LG4ubmNvZGU9NCsoMTUmeCkseD4+Pj00LEQtPTQsMjg2PG4ubmxlbnx8MzA8bi5uZGlzdCl7ZS5tc2c9InRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIixuLm1vZGU9MzA7YnJlYWt9bi5oYXZlPTAsbi5tb2RlPTE4O2Nhc2UgMTg6Zm9yKDtuLmhhdmU8bi5uY29kZTspe2Zvcig7RDwzOyl7aWYoMD09PXkpYnJlYWsgZTt5LS0seCs9aFttKytdPDxELEQrPTh9bi5sZW5zW2pbbi5oYXZlKytdXT03JngseD4+Pj0zLEQtPTN9Zm9yKDtuLmhhdmU8MTk7KW4ubGVuc1tqW24uaGF2ZSsrXV09MDtpZihuLmxlbmNvZGU9bi5sZW5keW4sbi5sZW5iaXRzPTcsQj17Yml0czpuLmxlbmJpdHN9LFA9YygwLG4ubGVucywwLDE5LG4ubGVuY29kZSwwLG4ud29yayxCKSxuLmxlbmJpdHM9Qi5iaXRzLFApe2UubXNnPSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiLG4ubW9kZT0zMDticmVha31uLmhhdmU9MCxuLm1vZGU9MTk7Y2FzZSAxOTpmb3IoO24uaGF2ZTxuLm5sZW4rbi5uZGlzdDspe2Zvcig7Qz0oTD1uLmxlbmNvZGVbeCYoMTw8bi5sZW5iaXRzKS0xXSk+Pj4xNiYyNTUsRj02NTUzNSZMLCEoKFM9TD4+PjI0KTw9RCk7KXtpZigwPT09eSlicmVhayBlO3ktLSx4Kz1oW20rK108PEQsRCs9OH1pZihGPDE2KXg+Pj49UyxELT1TLG4ubGVuc1tuLmhhdmUrK109RjtlbHNle2lmKDE2PT09Ril7Zm9yKFc9UysyO0Q8Vzspe2lmKDA9PT15KWJyZWFrIGU7eS0tLHgrPWhbbSsrXTw8RCxEKz04fWlmKHg+Pj49UyxELT1TLDA9PT1uLmhhdmUpe2UubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IixuLm1vZGU9MzA7YnJlYWt9Tj1uLmxlbnNbbi5oYXZlLTFdLFU9MysoMyZ4KSx4Pj4+PTIsRC09Mn1lbHNlIGlmKDE3PT09Ril7Zm9yKFc9UyszO0Q8Vzspe2lmKDA9PT15KWJyZWFrIGU7eS0tLHgrPWhbbSsrXTw8RCxEKz04fUQtPVMsTj0wLFU9MysoNyYoeD4+Pj1TKSkseD4+Pj0zLEQtPTN9ZWxzZXtmb3IoVz1TKzc7RDxXOyl7aWYoMD09PXkpYnJlYWsgZTt5LS0seCs9aFttKytdPDxELEQrPTh9RC09UyxOPTAsVT0xMSsoMTI3Jih4Pj4+PVMpKSx4Pj4+PTcsRC09N31pZihuLmhhdmUrVT5uLm5sZW4rbi5uZGlzdCl7ZS5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLG4ubW9kZT0zMDticmVha31mb3IoO1UtLTspbi5sZW5zW24uaGF2ZSsrXT1OfX1pZigzMD09PW4ubW9kZSlicmVhaztpZigwPT09bi5sZW5zWzI1Nl0pe2UubXNnPSJpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2siLG4ubW9kZT0zMDticmVha31pZihuLmxlbmJpdHM9OSxCPXtiaXRzOm4ubGVuYml0c30sUD1jKHMsbi5sZW5zLDAsbi5ubGVuLG4ubGVuY29kZSwwLG4ud29yayxCKSxuLmxlbmJpdHM9Qi5iaXRzLFApe2UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiLG4ubW9kZT0zMDticmVha31pZihuLmRpc3RiaXRzPTYsbi5kaXN0Y29kZT1uLmRpc3RkeW4sQj17Yml0czpuLmRpc3RiaXRzfSxQPWMobCxuLmxlbnMsbi5ubGVuLG4ubmRpc3Qsbi5kaXN0Y29kZSwwLG4ud29yayxCKSxuLmRpc3RiaXRzPUIuYml0cyxQKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0IixuLm1vZGU9MzA7YnJlYWt9aWYobi5tb2RlPTIwLDY9PT10KWJyZWFrIGU7Y2FzZSAyMDpuLm1vZGU9MjE7Y2FzZSAyMTppZig2PD15JiYyNTg8PXYpe2UubmV4dF9vdXQ9YixlLmF2YWlsX291dD12LGUubmV4dF9pbj1tLGUuYXZhaWxfaW49eSxuLmhvbGQ9eCxuLmJpdHM9RCxvKGUsdyksYj1lLm5leHRfb3V0LHA9ZS5vdXRwdXQsdj1lLmF2YWlsX291dCxtPWUubmV4dF9pbixoPWUuaW5wdXQseT1lLmF2YWlsX2luLHg9bi5ob2xkLEQ9bi5iaXRzLDEyPT09bi5tb2RlJiYobi5iYWNrPS0xKTticmVha31mb3Iobi5iYWNrPTA7Qz0oTD1uLmxlbmNvZGVbeCYoMTw8bi5sZW5iaXRzKS0xXSk+Pj4xNiYyNTUsRj02NTUzNSZMLCEoKFM9TD4+PjI0KTw9RCk7KXtpZigwPT09eSlicmVhayBlO3ktLSx4Kz1oW20rK108PEQsRCs9OH1pZihDJiYwPT0oMjQwJkMpKXtmb3IoTz1TLEk9QyxSPUY7Qz0oTD1uLmxlbmNvZGVbUisoKHgmKDE8PE8rSSktMSk+Pk8pXSk+Pj4xNiYyNTUsRj02NTUzNSZMLCEoTysoUz1MPj4+MjQpPD1EKTspe2lmKDA9PT15KWJyZWFrIGU7eS0tLHgrPWhbbSsrXTw8RCxEKz04fXg+Pj49TyxELT1PLG4uYmFjays9T31pZih4Pj4+PVMsRC09UyxuLmJhY2srPVMsbi5sZW5ndGg9RiwwPT09Qyl7bi5tb2RlPTI2O2JyZWFrfWlmKDMyJkMpe24uYmFjaz0tMSxuLm1vZGU9MTI7YnJlYWt9aWYoNjQmQyl7ZS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsbi5tb2RlPTMwO2JyZWFrfW4uZXh0cmE9MTUmQyxuLm1vZGU9MjI7Y2FzZSAyMjppZihuLmV4dHJhKXtmb3IoVz1uLmV4dHJhO0Q8Vzspe2lmKDA9PT15KWJyZWFrIGU7eS0tLHgrPWhbbSsrXTw8RCxEKz04fW4ubGVuZ3RoKz14JigxPDxuLmV4dHJhKS0xLHg+Pj49bi5leHRyYSxELT1uLmV4dHJhLG4uYmFjays9bi5leHRyYX1uLndhcz1uLmxlbmd0aCxuLm1vZGU9MjM7Y2FzZSAyMzpmb3IoO0M9KEw9bi5kaXN0Y29kZVt4JigxPDxuLmRpc3RiaXRzKS0xXSk+Pj4xNiYyNTUsRj02NTUzNSZMLCEoKFM9TD4+PjI0KTw9RCk7KXtpZigwPT09eSlicmVhayBlO3ktLSx4Kz1oW20rK108PEQsRCs9OH1pZigwPT0oMjQwJkMpKXtmb3IoTz1TLEk9QyxSPUY7Qz0oTD1uLmRpc3Rjb2RlW1IrKCh4JigxPDxPK0kpLTEpPj5PKV0pPj4+MTYmMjU1LEY9NjU1MzUmTCwhKE8rKFM9TD4+PjI0KTw9RCk7KXtpZigwPT09eSlicmVhayBlO3ktLSx4Kz1oW20rK108PEQsRCs9OH14Pj4+PU8sRC09TyxuLmJhY2srPU99aWYoeD4+Pj1TLEQtPVMsbi5iYWNrKz1TLDY0JkMpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLG4ubW9kZT0zMDticmVha31uLm9mZnNldD1GLG4uZXh0cmE9MTUmQyxuLm1vZGU9MjQ7Y2FzZSAyNDppZihuLmV4dHJhKXtmb3IoVz1uLmV4dHJhO0Q8Vzspe2lmKDA9PT15KWJyZWFrIGU7eS0tLHgrPWhbbSsrXTw8RCxEKz04fW4ub2Zmc2V0Kz14JigxPDxuLmV4dHJhKS0xLHg+Pj49bi5leHRyYSxELT1uLmV4dHJhLG4uYmFjays9bi5leHRyYX1pZihuLm9mZnNldD5uLmRtYXgpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsbi5tb2RlPTMwO2JyZWFrfW4ubW9kZT0yNTtjYXNlIDI1OmlmKDA9PT12KWJyZWFrIGU7aWYoVT13LXYsbi5vZmZzZXQ+VSl7aWYoKFU9bi5vZmZzZXQtVSk+bi53aGF2ZSYmbi5zYW5lKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT0zMDticmVha31BPVU+bi53bmV4dD8oVS09bi53bmV4dCxuLndzaXplLVUpOm4ud25leHQtVSxVPm4ubGVuZ3RoJiYoVT1uLmxlbmd0aCksaz1uLndpbmRvd31lbHNlIGs9cCxBPWItbi5vZmZzZXQsVT1uLmxlbmd0aDtmb3IodjxVJiYoVT12KSx2LT1VLG4ubGVuZ3RoLT1VO3BbYisrXT1rW0ErK10sLS1VOyk7MD09PW4ubGVuZ3RoJiYobi5tb2RlPTIxKTticmVhaztjYXNlIDI2OmlmKDA9PT12KWJyZWFrIGU7cFtiKytdPW4ubGVuZ3RoLHYtLSxuLm1vZGU9MjE7YnJlYWs7Y2FzZSAyNzppZihuLndyYXApe2Zvcig7RDwzMjspe2lmKDA9PT15KWJyZWFrIGU7eS0tLHh8PWhbbSsrXTw8RCxEKz04fWlmKHctPXYsZS50b3RhbF9vdXQrPXcsbi50b3RhbCs9dyx3JiYoZS5hZGxlcj1uLmNoZWNrPW4uZmxhZ3M/YShuLmNoZWNrLHAsdyxiLXcpOmkobi5jaGVjayxwLHcsYi13KSksdz12LChuLmZsYWdzP3g6Zyh4KSkhPT1uLmNoZWNrKXtlLm1zZz0iaW5jb3JyZWN0IGRhdGEgY2hlY2siLG4ubW9kZT0zMDticmVha31EPXg9MH1uLm1vZGU9Mjg7Y2FzZSAyODppZihuLndyYXAmJm4uZmxhZ3Mpe2Zvcig7RDwzMjspe2lmKDA9PT15KWJyZWFrIGU7eS0tLHgrPWhbbSsrXTw8RCxEKz04fWlmKHghPT0oNDI5NDk2NzI5NSZuLnRvdGFsKSl7ZS5tc2c9ImluY29ycmVjdCBsZW5ndGggY2hlY2siLG4ubW9kZT0zMDticmVha31EPXg9MH1uLm1vZGU9Mjk7Y2FzZSAyOTpQPTE7YnJlYWsgZTtjYXNlIDMwOlA9LTM7YnJlYWsgZTtjYXNlIDMxOnJldHVybi00O2RlZmF1bHQ6cmV0dXJuIGZ9cmV0dXJuIGUubmV4dF9vdXQ9YixlLmF2YWlsX291dD12LGUubmV4dF9pbj1tLGUuYXZhaWxfaW49eSxuLmhvbGQ9eCxuLmJpdHM9RCwobi53c2l6ZXx8dyE9PWUuYXZhaWxfb3V0JiZuLm1vZGU8MzAmJihuLm1vZGU8Mjd8fDQhPT10KSkmJkUoZSxlLm91dHB1dCxlLm5leHRfb3V0LHctZS5hdmFpbF9vdXQpPyhuLm1vZGU9MzEsLTQpOihULT1lLmF2YWlsX2luLHctPWUuYXZhaWxfb3V0LGUudG90YWxfaW4rPVQsZS50b3RhbF9vdXQrPXcsbi50b3RhbCs9dyxuLndyYXAmJncmJihlLmFkbGVyPW4uY2hlY2s9bi5mbGFncz9hKG4uY2hlY2sscCx3LGUubmV4dF9vdXQtdyk6aShuLmNoZWNrLHAsdyxlLm5leHRfb3V0LXcpKSxlLmRhdGFfdHlwZT1uLmJpdHMrKG4ubGFzdD82NDowKSsoMTI9PT1uLm1vZGU/MTI4OjApKygyMD09PW4ubW9kZXx8MTU9PT1uLm1vZGU/MjU2OjApLCgwPT1UJiYwPT09d3x8ND09PXQpJiZQPT09dSYmKFA9LTUpLFApfSxuLmluZmxhdGVFbmQ9ZnVuY3Rpb24oZSl7aWYoIWV8fCFlLnN0YXRlKXJldHVybiBmO3ZhciB0PWUuc3RhdGU7cmV0dXJuIHQud2luZG93JiYodC53aW5kb3c9bnVsbCksZS5zdGF0ZT1udWxsLHV9LG4uaW5mbGF0ZUdldEhlYWRlcj1mdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiBlJiZlLnN0YXRlPzA9PSgyJihuPWUuc3RhdGUpLndyYXApP2Y6KChuLmhlYWQ9dCkuZG9uZT0hMSx1KTpmfSxuLmluZmxhdGVTZXREaWN0aW9uYXJ5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10Lmxlbmd0aDtyZXR1cm4gZSYmZS5zdGF0ZT8wIT09KG49ZS5zdGF0ZSkud3JhcCYmMTEhPT1uLm1vZGU/ZjoxMT09PW4ubW9kZSYmaSgxLHQsciwwKSE9PW4uY2hlY2s/LTM6RShlLHQscixyKT8obi5tb2RlPTMxLC00KToobi5oYXZlZGljdD0xLHUpOmZ9LG4uaW5mbGF0ZUluZm89InBha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkifSx7Ii4uL3V0aWxzL2NvbW1vbiI6NDEsIi4vYWRsZXIzMiI6NDMsIi4vY3JjMzIiOjQ1LCIuL2luZmZhc3QiOjQ4LCIuL2luZnRyZWVzIjo1MH1dLDUwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbHMvY29tbW9uIiksaT1bMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdLGE9WzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE3LDE3LDE3LDE3LDE4LDE4LDE4LDE4LDE5LDE5LDE5LDE5LDIwLDIwLDIwLDIwLDIxLDIxLDIxLDIxLDE2LDcyLDc4XSxvPVsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzcsMCwwXSxjPVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF07dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHMsbCx1LGYsZCl7dmFyIGgscCxnLG0sYix5LHYseCxELFQ9ZC5iaXRzLHc9MCxfPTAsRT0wLFU9MCxBPTAsaz0wLFM9MCxDPTAsRj0wLE89MCxJPW51bGwsUj0wLE49bmV3IHIuQnVmMTYoMTYpLFA9bmV3IHIuQnVmMTYoMTYpLEI9bnVsbCxXPTA7Zm9yKHc9MDt3PD0xNTt3KyspTlt3XT0wO2ZvcihfPTA7XzxzO18rKylOW3RbbitfXV0rKztmb3IoQT1ULFU9MTU7MTw9VSYmMD09PU5bVV07VS0tKTtpZihVPEEmJihBPVUpLDA9PT1VKXJldHVybiBsW3UrK109MjA5NzE1MjAsbFt1KytdPTIwOTcxNTIwLGQuYml0cz0xLDA7Zm9yKEU9MTtFPFUmJjA9PT1OW0VdO0UrKyk7Zm9yKEE8RSYmKEE9RSksdz1DPTE7dzw9MTU7dysrKWlmKEM8PD0xLChDLT1OW3ddKTwwKXJldHVybi0xO2lmKDA8QyYmKDA9PT1lfHwxIT09VSkpcmV0dXJuLTE7Zm9yKFBbMV09MCx3PTE7dzwxNTt3KyspUFt3KzFdPVBbd10rTlt3XTtmb3IoXz0wO188cztfKyspMCE9PXRbbitfXSYmKGZbUFt0W24rX11dKytdPV8pO2lmKHk9MD09PWU/KEk9Qj1mLDE5KToxPT09ZT8oST1pLFItPTI1NyxCPWEsVy09MjU3LDI1Nik6KEk9byxCPWMsLTEpLHc9RSxiPXUsUz1fPU89MCxnPS0xLG09KEY9MTw8KGs9QSkpLTEsMT09PWUmJjg1MjxGfHwyPT09ZSYmNTkyPEYpcmV0dXJuIDE7Zm9yKDs7KXtmb3Iodj13LVMsRD1mW19dPHk/KHg9MCxmW19dKTpmW19dPnk/KHg9QltXK2ZbX11dLElbUitmW19dXSk6KHg9OTYsMCksaD0xPDx3LVMsRT1wPTE8PGs7bFtiKyhPPj5TKSsocC09aCldPXY8PDI0fHg8PDE2fER8MCwwIT09cDspO2ZvcihoPTE8PHctMTtPJmg7KWg+Pj0xO2lmKDAhPT1oPyhPJj1oLTEsTys9aCk6Tz0wLF8rKywwPT0tLU5bd10pe2lmKHc9PT1VKWJyZWFrO3c9dFtuK2ZbX11dfWlmKEE8dyYmKE8mbSkhPT1nKXtmb3IoMD09PVMmJihTPUEpLGIrPUUsQz0xPDwoaz13LVMpO2srUzxVJiYhKChDLT1OW2srU10pPD0wKTspaysrLEM8PD0xO2lmKEYrPTE8PGssMT09PWUmJjg1MjxGfHwyPT09ZSYmNTkyPEYpcmV0dXJuIDE7bFtnPU8mbV09QTw8MjR8azw8MTZ8Yi11fDB9fXJldHVybiAwIT09TyYmKGxbYitPXT13LVM8PDI0fDY0PDwxNnwwKSxkLmJpdHM9QSwwfX0seyIuLi91dGlscy9jb21tb24iOjQxfV0sNTE6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ezI6Im5lZWQgZGljdGlvbmFyeSIsMToic3RyZWFtIGVuZCIsMDoiIiwiLTEiOiJmaWxlIGVycm9yIiwiLTIiOiJzdHJlYW0gZXJyb3IiLCItMyI6ImRhdGEgZXJyb3IiLCItNCI6Imluc3VmZmljaWVudCBtZW1vcnkiLCItNSI6ImJ1ZmZlciBlcnJvciIsIi02IjoiaW5jb21wYXRpYmxlIHZlcnNpb24ifX0se31dLDUyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbHMvY29tbW9uIiksaT0wLGE9MTtmdW5jdGlvbiBvKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDswPD0tLXQ7KWVbdF09MH12YXIgYz0wLHM9MjksbD0yNTYsdT1sKzErcyxmPTMwLGQ9MTksaD0yKnUrMSxwPTE1LGc9MTYsbT03LGI9MjU2LHk9MTYsdj0xNyx4PTE4LEQ9WzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF0sVD1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sdz1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10sXz1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sRT1uZXcgQXJyYXkoMioodSsyKSk7byhFKTt2YXIgVT1uZXcgQXJyYXkoMipmKTtvKFUpO3ZhciBBPW5ldyBBcnJheSg1MTIpO28oQSk7dmFyIGs9bmV3IEFycmF5KDI1Nik7byhrKTt2YXIgUz1uZXcgQXJyYXkocyk7byhTKTt2YXIgQyxGLE8sST1uZXcgQXJyYXkoZik7ZnVuY3Rpb24gUihlLHQsbixyLGkpe3RoaXMuc3RhdGljX3RyZWU9ZSx0aGlzLmV4dHJhX2JpdHM9dCx0aGlzLmV4dHJhX2Jhc2U9bix0aGlzLmVsZW1zPXIsdGhpcy5tYXhfbGVuZ3RoPWksdGhpcy5oYXNfc3RyZWU9ZSYmZS5sZW5ndGh9ZnVuY3Rpb24gTihlLHQpe3RoaXMuZHluX3RyZWU9ZSx0aGlzLm1heF9jb2RlPTAsdGhpcy5zdGF0X2Rlc2M9dH1mdW5jdGlvbiBQKGUpe3JldHVybiBlPDI1Nj9BW2VdOkFbMjU2KyhlPj4+NyldfWZ1bmN0aW9uIEIoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT0yNTUmdCxlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTV9ZnVuY3Rpb24gVyhlLHQsbil7ZS5iaV92YWxpZD5nLW4/KGUuYmlfYnVmfD10PDxlLmJpX3ZhbGlkJjY1NTM1LEIoZSxlLmJpX2J1ZiksZS5iaV9idWY9dD4+Zy1lLmJpX3ZhbGlkLGUuYmlfdmFsaWQrPW4tZyk6KGUuYmlfYnVmfD10PDxlLmJpX3ZhbGlkJjY1NTM1LGUuYmlfdmFsaWQrPW4pfWZ1bmN0aW9uIEwoZSx0LG4pe1coZSxuWzIqdF0sblsyKnQrMV0pfWZ1bmN0aW9uIE0oZSx0KXtmb3IodmFyIG49MDtufD0xJmUsZT4+Pj0xLG48PD0xLDA8LS10Oyk7cmV0dXJuIG4+Pj4xfWZ1bmN0aW9uIGooZSx0LG4pe3ZhciByLGksYT1uZXcgQXJyYXkocCsxKSxvPTA7Zm9yKHI9MTtyPD1wO3IrKylhW3JdPW89bytuW3ItMV08PDE7Zm9yKGk9MDtpPD10O2krKyl7dmFyIGM9ZVsyKmkrMV07MCE9PWMmJihlWzIqaV09TShhW2NdKyssYykpfX1mdW5jdGlvbiB6KGUpe3ZhciB0O2Zvcih0PTA7dDx1O3QrKyllLmR5bl9sdHJlZVsyKnRdPTA7Zm9yKHQ9MDt0PGY7dCsrKWUuZHluX2R0cmVlWzIqdF09MDtmb3IodD0wO3Q8ZDt0KyspZS5ibF90cmVlWzIqdF09MDtlLmR5bl9sdHJlZVsyKmJdPTEsZS5vcHRfbGVuPWUuc3RhdGljX2xlbj0wLGUubGFzdF9saXQ9ZS5tYXRjaGVzPTB9ZnVuY3Rpb24gSChlKXs4PGUuYmlfdmFsaWQ/QihlLGUuYmlfYnVmKTowPGUuYmlfdmFsaWQmJihlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT1lLmJpX2J1ZiksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTB9ZnVuY3Rpb24gVihlLHQsbixyKXt2YXIgaT0yKnQsYT0yKm47cmV0dXJuIGVbaV08ZVthXXx8ZVtpXT09PWVbYV0mJnJbdF08PXJbbl19ZnVuY3Rpb24gcShlLHQsbil7Zm9yKHZhciByPWUuaGVhcFtuXSxpPW48PDE7aTw9ZS5oZWFwX2xlbiYmKGk8ZS5oZWFwX2xlbiYmVih0LGUuaGVhcFtpKzFdLGUuaGVhcFtpXSxlLmRlcHRoKSYmaSsrLCFWKHQscixlLmhlYXBbaV0sZS5kZXB0aCkpOyllLmhlYXBbbl09ZS5oZWFwW2ldLG49aSxpPDw9MTtlLmhlYXBbbl09cn1mdW5jdGlvbiBHKGUsdCxuKXt2YXIgcixpLGEsbyxjPTA7aWYoMCE9PWUubGFzdF9saXQpZm9yKDtyPWUucGVuZGluZ19idWZbZS5kX2J1ZisyKmNdPDw4fGUucGVuZGluZ19idWZbZS5kX2J1ZisyKmMrMV0saT1lLnBlbmRpbmdfYnVmW2UubF9idWYrY10sYysrLDA9PT1yP0woZSxpLHQpOihMKGUsKGE9a1tpXSkrbCsxLHQpLDAhPT0obz1EW2FdKSYmVyhlLGktPVNbYV0sbyksTChlLGE9UCgtLXIpLG4pLDAhPT0obz1UW2FdKSYmVyhlLHItPUlbYV0sbykpLGM8ZS5sYXN0X2xpdDspO0woZSxiLHQpfWZ1bmN0aW9uIFgoZSx0KXt2YXIgbixyLGksYT10LmR5bl90cmVlLG89dC5zdGF0X2Rlc2Muc3RhdGljX3RyZWUsYz10LnN0YXRfZGVzYy5oYXNfc3RyZWUscz10LnN0YXRfZGVzYy5lbGVtcyxsPS0xO2ZvcihlLmhlYXBfbGVuPTAsZS5oZWFwX21heD1oLG49MDtuPHM7bisrKTAhPT1hWzIqbl0/KGUuaGVhcFsrK2UuaGVhcF9sZW5dPWw9bixlLmRlcHRoW25dPTApOmFbMipuKzFdPTA7Zm9yKDtlLmhlYXBfbGVuPDI7KWFbMiooaT1lLmhlYXBbKytlLmhlYXBfbGVuXT1sPDI/KytsOjApXT0xLGUuZGVwdGhbaV09MCxlLm9wdF9sZW4tLSxjJiYoZS5zdGF0aWNfbGVuLT1vWzIqaSsxXSk7Zm9yKHQubWF4X2NvZGU9bCxuPWUuaGVhcF9sZW4+PjE7MTw9bjtuLS0pcShlLGEsbik7Zm9yKGk9cztuPWUuaGVhcFsxXSxlLmhlYXBbMV09ZS5oZWFwW2UuaGVhcF9sZW4tLV0scShlLGEsMSkscj1lLmhlYXBbMV0sZS5oZWFwWy0tZS5oZWFwX21heF09bixlLmhlYXBbLS1lLmhlYXBfbWF4XT1yLGFbMippXT1hWzIqbl0rYVsyKnJdLGUuZGVwdGhbaV09KGUuZGVwdGhbbl0+PWUuZGVwdGhbcl0/ZS5kZXB0aFtuXTplLmRlcHRoW3JdKSsxLGFbMipuKzFdPWFbMipyKzFdPWksZS5oZWFwWzFdPWkrKyxxKGUsYSwxKSwyPD1lLmhlYXBfbGVuOyk7ZS5oZWFwWy0tZS5oZWFwX21heF09ZS5oZWFwWzFdLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLGEsbyxjLHM9dC5keW5fdHJlZSxsPXQubWF4X2NvZGUsdT10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxmPXQuc3RhdF9kZXNjLmhhc19zdHJlZSxkPXQuc3RhdF9kZXNjLmV4dHJhX2JpdHMsZz10LnN0YXRfZGVzYy5leHRyYV9iYXNlLG09dC5zdGF0X2Rlc2MubWF4X2xlbmd0aCxiPTA7Zm9yKGE9MDthPD1wO2ErKyllLmJsX2NvdW50W2FdPTA7Zm9yKHNbMiplLmhlYXBbZS5oZWFwX21heF0rMV09MCxuPWUuaGVhcF9tYXgrMTtuPGg7bisrKW08KGE9c1syKnNbMioocj1lLmhlYXBbbl0pKzFdKzFdKzEpJiYoYT1tLGIrKyksc1syKnIrMV09YSxsPHJ8fChlLmJsX2NvdW50W2FdKyssbz0wLGc8PXImJihvPWRbci1nXSksYz1zWzIqcl0sZS5vcHRfbGVuKz1jKihhK28pLGYmJihlLnN0YXRpY19sZW4rPWMqKHVbMipyKzFdK28pKSk7aWYoMCE9PWIpe2Rve2ZvcihhPW0tMTswPT09ZS5ibF9jb3VudFthXTspYS0tO2UuYmxfY291bnRbYV0tLSxlLmJsX2NvdW50W2ErMV0rPTIsZS5ibF9jb3VudFttXS0tLGItPTJ9d2hpbGUoMDxiKTtmb3IoYT1tOzAhPT1hO2EtLSlmb3Iocj1lLmJsX2NvdW50W2FdOzAhPT1yOylsPChpPWUuaGVhcFstLW5dKXx8KHNbMippKzFdIT09YSYmKGUub3B0X2xlbis9KGEtc1syKmkrMV0pKnNbMippXSxzWzIqaSsxXT1hKSxyLS0pfX0oZSx0KSxqKGEsbCxlLmJsX2NvdW50KX1mdW5jdGlvbiAkKGUsdCxuKXt2YXIgcixpLGE9LTEsbz10WzFdLGM9MCxzPTcsbD00O2ZvcigwPT09byYmKHM9MTM4LGw9MyksdFsyKihuKzEpKzFdPTY1NTM1LHI9MDtyPD1uO3IrKylpPW8sbz10WzIqKHIrMSkrMV0sKytjPHMmJmk9PT1vfHwoYzxsP2UuYmxfdHJlZVsyKmldKz1jOjAhPT1pPyhpIT09YSYmZS5ibF90cmVlWzIqaV0rKyxlLmJsX3RyZWVbMip5XSsrKTpjPD0xMD9lLmJsX3RyZWVbMip2XSsrOmUuYmxfdHJlZVsyKnhdKyssYT1pLGw9KGM9MCk9PT1vPyhzPTEzOCwzKTppPT09bz8ocz02LDMpOihzPTcsNCkpfWZ1bmN0aW9uIFkoZSx0LG4pe3ZhciByLGksYT0tMSxvPXRbMV0sYz0wLHM9NyxsPTQ7Zm9yKDA9PT1vJiYocz0xMzgsbD0zKSxyPTA7cjw9bjtyKyspaWYoaT1vLG89dFsyKihyKzEpKzFdLCEoKytjPHMmJmk9PT1vKSl7aWYoYzxsKWZvcig7TChlLGksZS5ibF90cmVlKSwwIT0tLWM7KTtlbHNlIDAhPT1pPyhpIT09YSYmKEwoZSxpLGUuYmxfdHJlZSksYy0tKSxMKGUseSxlLmJsX3RyZWUpLFcoZSxjLTMsMikpOmM8PTEwPyhMKGUsdixlLmJsX3RyZWUpLFcoZSxjLTMsMykpOihMKGUseCxlLmJsX3RyZWUpLFcoZSxjLTExLDcpKTthPWksbD0oYz0wKT09PW8/KHM9MTM4LDMpOmk9PT1vPyhzPTYsMyk6KHM9Nyw0KX19byhJKTt2YXIgSz0hMTtmdW5jdGlvbiBaKGUsdCxuLGkpe1coZSwoYzw8MSkrKGk/MTowKSwzKSxmdW5jdGlvbihlLHQsbixpKXtIKGUpLGkmJihCKGUsbiksQihlLH5uKSksci5hcnJheVNldChlLnBlbmRpbmdfYnVmLGUud2luZG93LHQsbixlLnBlbmRpbmcpLGUucGVuZGluZys9bn0oZSx0LG4sITApfW4uX3RyX2luaXQ9ZnVuY3Rpb24oZSl7S3x8KGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxhPW5ldyBBcnJheShwKzEpO2ZvcihyPW49MDtyPHMtMTtyKyspZm9yKFNbcl09bixlPTA7ZTwxPDxEW3JdO2UrKylrW24rK109cjtmb3Ioa1tuLTFdPXIscj1pPTA7cjwxNjtyKyspZm9yKElbcl09aSxlPTA7ZTwxPDxUW3JdO2UrKylBW2krK109cjtmb3IoaT4+PTc7cjxmO3IrKylmb3IoSVtyXT1pPDw3LGU9MDtlPDE8PFRbcl0tNztlKyspQVsyNTYraSsrXT1yO2Zvcih0PTA7dDw9cDt0KyspYVt0XT0wO2ZvcihlPTA7ZTw9MTQzOylFWzIqZSsxXT04LGUrKyxhWzhdKys7Zm9yKDtlPD0yNTU7KUVbMiplKzFdPTksZSsrLGFbOV0rKztmb3IoO2U8PTI3OTspRVsyKmUrMV09NyxlKyssYVs3XSsrO2Zvcig7ZTw9Mjg3OylFWzIqZSsxXT04LGUrKyxhWzhdKys7Zm9yKGooRSx1KzEsYSksZT0wO2U8ZjtlKyspVVsyKmUrMV09NSxVWzIqZV09TShlLDUpO0M9bmV3IFIoRSxELGwrMSx1LHApLEY9bmV3IFIoVSxULDAsZixwKSxPPW5ldyBSKG5ldyBBcnJheSgwKSx3LDAsZCxtKX0oKSxLPSEwKSxlLmxfZGVzYz1uZXcgTihlLmR5bl9sdHJlZSxDKSxlLmRfZGVzYz1uZXcgTihlLmR5bl9kdHJlZSxGKSxlLmJsX2Rlc2M9bmV3IE4oZS5ibF90cmVlLE8pLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wLHooZSl9LG4uX3RyX3N0b3JlZF9ibG9jaz1aLG4uX3RyX2ZsdXNoX2Jsb2NrPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvLGMscz0wOzA8ZS5sZXZlbD8oMj09PWUuc3RybS5kYXRhX3R5cGUmJihlLnN0cm0uZGF0YV90eXBlPWZ1bmN0aW9uKGUpe3ZhciB0LG49NDA5MzYyNDQ0Nztmb3IodD0wO3Q8PTMxO3QrKyxuPj4+PTEpaWYoMSZuJiYwIT09ZS5keW5fbHRyZWVbMip0XSlyZXR1cm4gaTtpZigwIT09ZS5keW5fbHRyZWVbMThdfHwwIT09ZS5keW5fbHRyZWVbMjBdfHwwIT09ZS5keW5fbHRyZWVbMjZdKXJldHVybiBhO2Zvcih0PTMyO3Q8bDt0KyspaWYoMCE9PWUuZHluX2x0cmVlWzIqdF0pcmV0dXJuIGE7cmV0dXJuIGl9KGUpKSxYKGUsZS5sX2Rlc2MpLFgoZSxlLmRfZGVzYykscz1mdW5jdGlvbihlKXt2YXIgdDtmb3IoJChlLGUuZHluX2x0cmVlLGUubF9kZXNjLm1heF9jb2RlKSwkKGUsZS5keW5fZHRyZWUsZS5kX2Rlc2MubWF4X2NvZGUpLFgoZSxlLmJsX2Rlc2MpLHQ9ZC0xOzM8PXQmJjA9PT1lLmJsX3RyZWVbMipfW3RdKzFdO3QtLSk7cmV0dXJuIGUub3B0X2xlbis9MyoodCsxKSs1KzUrNCx0fShlKSxvPWUub3B0X2xlbiszKzc+Pj4zLChjPWUuc3RhdGljX2xlbiszKzc+Pj4zKTw9byYmKG89YykpOm89Yz1uKzUsbis0PD1vJiYtMSE9PXQ/WihlLHQsbixyKTo0PT09ZS5zdHJhdGVneXx8Yz09PW8/KFcoZSwyKyhyPzE6MCksMyksRyhlLEUsVSkpOihXKGUsNCsocj8xOjApLDMpLGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpO2ZvcihXKGUsdC0yNTcsNSksVyhlLG4tMSw1KSxXKGUsci00LDQpLGk9MDtpPHI7aSsrKVcoZSxlLmJsX3RyZWVbMipfW2ldKzFdLDMpO1koZSxlLmR5bl9sdHJlZSx0LTEpLFkoZSxlLmR5bl9kdHJlZSxuLTEpfShlLGUubF9kZXNjLm1heF9jb2RlKzEsZS5kX2Rlc2MubWF4X2NvZGUrMSxzKzEpLEcoZSxlLmR5bl9sdHJlZSxlLmR5bl9kdHJlZSkpLHooZSksciYmSChlKX0sbi5fdHJfdGFsbHk9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnBlbmRpbmdfYnVmW2UuZF9idWYrMiplLmxhc3RfbGl0XT10Pj4+OCYyNTUsZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqZS5sYXN0X2xpdCsxXT0yNTUmdCxlLnBlbmRpbmdfYnVmW2UubF9idWYrZS5sYXN0X2xpdF09MjU1Jm4sZS5sYXN0X2xpdCsrLDA9PT10P2UuZHluX2x0cmVlWzIqbl0rKzooZS5tYXRjaGVzKyssdC0tLGUuZHluX2x0cmVlWzIqKGtbbl0rbCsxKV0rKyxlLmR5bl9kdHJlZVsyKlAodCldKyspLGUubGFzdF9saXQ9PT1lLmxpdF9idWZzaXplLTF9LG4uX3RyX2FsaWduPWZ1bmN0aW9uKGUpe1coZSwyLDMpLEwoZSxiLEUpLGZ1bmN0aW9uKGUpezE2PT09ZS5iaV92YWxpZD8oQihlLGUuYmlfYnVmKSxlLmJpX2J1Zj0wLGUuYmlfdmFsaWQ9MCk6ODw9ZS5iaV92YWxpZCYmKGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPTI1NSZlLmJpX2J1ZixlLmJpX2J1Zj4+PTgsZS5iaV92YWxpZC09OCl9KGUpfX0seyIuLi91dGlscy9jb21tb24iOjQxfV0sNTM6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aGlzLmlucHV0PW51bGwsdGhpcy5uZXh0X2luPTAsdGhpcy5hdmFpbF9pbj0wLHRoaXMudG90YWxfaW49MCx0aGlzLm91dHB1dD1udWxsLHRoaXMubmV4dF9vdXQ9MCx0aGlzLmF2YWlsX291dD0wLHRoaXMudG90YWxfb3V0PTAsdGhpcy5tc2c9IiIsdGhpcy5zdGF0ZT1udWxsLHRoaXMuZGF0YV90eXBlPTIsdGhpcy5hZGxlcj0wfX0se31dLDU0OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlLHQpe2lmKCFlLnNldEltbWVkaWF0ZSl7dmFyIG4scixpLGEsbz0xLGM9e30scz0hMSxsPWUuZG9jdW1lbnQsdT1PYmplY3QuZ2V0UHJvdG90eXBlT2YmJk9iamVjdC5nZXRQcm90b3R5cGVPZihlKTt1PXUmJnUuc2V0VGltZW91dD91OmUsbj0iW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKGUucHJvY2Vzcyk/ZnVuY3Rpb24oZSl7U2kubmV4dFRpY2soKGZ1bmN0aW9uKCl7ZChlKX0pKX06ZnVuY3Rpb24oKXtpZihlLnBvc3RNZXNzYWdlJiYhZS5pbXBvcnRTY3JpcHRzKXt2YXIgdD0hMCxuPWUub25tZXNzYWdlO3JldHVybiBlLm9ubWVzc2FnZT1mdW5jdGlvbigpe3Q9ITF9LGUucG9zdE1lc3NhZ2UoIiIsIioiKSxlLm9ubWVzc2FnZT1uLHR9fSgpPyhhPSJzZXRJbW1lZGlhdGUkIitNYXRoLnJhbmRvbSgpKyIkIixlLmFkZEV2ZW50TGlzdGVuZXI/ZS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixoLCExKTplLmF0dGFjaEV2ZW50KCJvbm1lc3NhZ2UiLGgpLGZ1bmN0aW9uKHQpe2UucG9zdE1lc3NhZ2UoYSt0LCIqIil9KTplLk1lc3NhZ2VDaGFubmVsPygoaT1uZXcgTWVzc2FnZUNoYW5uZWwpLnBvcnQxLm9ubWVzc2FnZT1mdW5jdGlvbihlKXtkKGUuZGF0YSl9LGZ1bmN0aW9uKGUpe2kucG9ydDIucG9zdE1lc3NhZ2UoZSl9KTpsJiYib25yZWFkeXN0YXRlY2hhbmdlImluIGwuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik/KHI9bC5kb2N1bWVudEVsZW1lbnQsZnVuY3Rpb24oZSl7dmFyIHQ9bC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTt0Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2QoZSksdC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxyLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbH0sci5hcHBlbmRDaGlsZCh0KX0pOmZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoZCwwLGUpfSx1LnNldEltbWVkaWF0ZT1mdW5jdGlvbihlKXsiZnVuY3Rpb24iIT10eXBlb2YgZSYmKGU9bmV3IEZ1bmN0aW9uKCIiK2UpKTtmb3IodmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSkscj0wO3I8dC5sZW5ndGg7cisrKXRbcl09YXJndW1lbnRzW3IrMV07dmFyIGk9e2NhbGxiYWNrOmUsYXJnczp0fTtyZXR1cm4gY1tvXT1pLG4obyksbysrfSx1LmNsZWFySW1tZWRpYXRlPWZ9ZnVuY3Rpb24gZihlKXtkZWxldGUgY1tlXX1mdW5jdGlvbiBkKGUpe2lmKHMpc2V0VGltZW91dChkLDAsZSk7ZWxzZXt2YXIgbj1jW2VdO2lmKG4pe3M9ITA7dHJ5eyFmdW5jdGlvbihlKXt2YXIgbj1lLmNhbGxiYWNrLHI9ZS5hcmdzO3N3aXRjaChyLmxlbmd0aCl7Y2FzZSAwOm4oKTticmVhaztjYXNlIDE6bihyWzBdKTticmVhaztjYXNlIDI6bihyWzBdLHJbMV0pO2JyZWFrO2Nhc2UgMzpuKHJbMF0sclsxXSxyWzJdKTticmVhaztkZWZhdWx0Om4uYXBwbHkodCxyKX19KG4pfWZpbmFsbHl7ZihlKSxzPSExfX19fWZ1bmN0aW9uIGgodCl7dC5zb3VyY2U9PT1lJiYic3RyaW5nIj09dHlwZW9mIHQuZGF0YSYmMD09PXQuZGF0YS5pbmRleE9mKGEpJiZkKCt0LmRhdGEuc2xpY2UoYS5sZW5ndGgpKX19KCJ1bmRlZmluZWQiPT10eXBlb2Ygc2VsZj92b2lkIDA9PT1lP3RoaXM6ZTpzZWxmKX0pLmNhbGwodGhpcyx2b2lkIDAhPT1RP1E6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0se31dfSx7fSxbMTBdKSgxMCl9KHtnZXQgZXhwb3J0cygpe3JldHVybiBPb30sc2V0IGV4cG9ydHMoZSl7T289ZX19KTt2YXIgSW89d28sUm89T287VG8ub3BlbkFycmF5QnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiBSby5sb2FkQXN5bmMoZSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJue2V4aXN0czpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PWUuZmlsZSh0KX0scmVhZDpmdW5jdGlvbih0LG4pe3JldHVybiBlLmZpbGUodCkuYXN5bmMoInVpbnQ4YXJyYXkiKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4iYmFzZTY0Ij09PW4/SW8uZnJvbUJ5dGVBcnJheShlKTpuP25ldyBUZXh0RGVjb2RlcihuKS5kZWNvZGUoZSk6ZX0pKX0sd3JpdGU6ZnVuY3Rpb24odCxuKXtlLmZpbGUodCxuKX0sdG9BcnJheUJ1ZmZlcjpmdW5jdGlvbigpe3JldHVybiBlLmdlbmVyYXRlQXN5bmMoe3R5cGU6ImFycmF5YnVmZmVyIn0pfX19KSl9LFRvLnNwbGl0UGF0aD1mdW5jdGlvbihlKXt2YXIgdD1lLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuLTE9PT10P3tkaXJuYW1lOiIiLGJhc2VuYW1lOmV9OntkaXJuYW1lOmUuc3Vic3RyaW5nKDAsdCksYmFzZW5hbWU6ZS5zdWJzdHJpbmcodCsxKX19LFRvLmpvaW5QYXRoPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGFyZ3VtZW50cywoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSksdD1bXTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXsvXlwvLy50ZXN0KGUpP3Q9W2VdOnQucHVzaChlKX0pKSx0LmpvaW4oIi8iKX07dmFyIE5vPXt9LFBvPXt9LEJvPXt9LFdvPUxyO0JvLkVsZW1lbnQ9TW8sQm8uZWxlbWVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG5ldyBNbyhlLHQsbil9LEJvLnRleHQ9ZnVuY3Rpb24oZSl7cmV0dXJue3R5cGU6InRleHQiLHZhbHVlOmV9fTt2YXIgTG89e2ZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGZpcnN0T3JFbXB0eTpmdW5jdGlvbigpe3JldHVybiBMb30sYXR0cmlidXRlczp7fX07ZnVuY3Rpb24gTW8oZSx0LG4pe3RoaXMudHlwZT0iZWxlbWVudCIsdGhpcy5uYW1lPWUsdGhpcy5hdHRyaWJ1dGVzPXR8fHt9LHRoaXMuY2hpbGRyZW49bnx8W119TW8ucHJvdG90eXBlLmZpcnN0PWZ1bmN0aW9uKGUpe3JldHVybiBXby5maW5kKHRoaXMuY2hpbGRyZW4sKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWU9PT1lfSkpfSxNby5wcm90b3R5cGUuZmlyc3RPckVtcHR5PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmZpcnN0KGUpfHxMb30sTW8ucHJvdG90eXBlLmdldEVsZW1lbnRzQnlUYWdOYW1lPWZ1bmN0aW9uKGUpe3JldHVybiB6byhXby5maWx0ZXIodGhpcy5jaGlsZHJlbiwoZnVuY3Rpb24odCl7cmV0dXJuIHQubmFtZT09PWV9KSkpfSxNby5wcm90b3R5cGUudGV4dD1mdW5jdGlvbigpe2lmKDA9PT10aGlzLmNoaWxkcmVuLmxlbmd0aClyZXR1cm4iIjtpZigxIT09dGhpcy5jaGlsZHJlbi5sZW5ndGh8fCJ0ZXh0IiE9PXRoaXMuY2hpbGRyZW5bMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpO3JldHVybiB0aGlzLmNoaWxkcmVuWzBdLnZhbHVlfTt2YXIgam89e2dldEVsZW1lbnRzQnlUYWdOYW1lOmZ1bmN0aW9uKGUpe3JldHVybiB6byhXby5mbGF0dGVuKHRoaXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKX0pLCEwKSkpfX07ZnVuY3Rpb24gem8oZSl7cmV0dXJuIFdvLmV4dGVuZChlLGpvKX12YXIgSG89e30sVm89e30scW89e30sR289e30sWG89e307ZnVuY3Rpb24gJG8oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9T2JqZWN0KSx0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5mcmVlemU/dC5mcmVlemUoZSk6ZX12YXIgWW89JG8oe0hUTUw6InRleHQvaHRtbCIsaXNIVE1MOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09WW8uSFRNTH0sWE1MX0FQUExJQ0FUSU9OOiJhcHBsaWNhdGlvbi94bWwiLFhNTF9URVhUOiJ0ZXh0L3htbCIsWE1MX1hIVE1MX0FQUExJQ0FUSU9OOiJhcHBsaWNhdGlvbi94aHRtbCt4bWwiLFhNTF9TVkdfSU1BR0U6ImltYWdlL3N2Zyt4bWwifSksS289JG8oe0hUTUw6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLGlzSFRNTDpmdW5jdGlvbihlKXtyZXR1cm4gZT09PUtvLkhUTUx9LFNWRzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLFhNTDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIixYTUxOUzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifSk7WG8uYXNzaWduPWZ1bmN0aW9uKGUsdCl7aWYobnVsbD09PWV8fCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ0YXJnZXQgaXMgbm90IGFuIG9iamVjdCIpO2Zvcih2YXIgbiBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiYoZVtuXT10W25dKTtyZXR1cm4gZX0sWG8uZmluZD1mdW5jdGlvbihlLHQsbil7aWYodm9pZCAwPT09biYmKG49QXJyYXkucHJvdG90eXBlKSxlJiYiZnVuY3Rpb24iPT10eXBlb2Ygbi5maW5kKXJldHVybiBuLmZpbmQuY2FsbChlLHQpO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpKXt2YXIgaT1lW3JdO2lmKHQuY2FsbCh2b2lkIDAsaSxyLGUpKXJldHVybiBpfX0sWG8uZnJlZXplPSRvLFhvLk1JTUVfVFlQRT1ZbyxYby5OQU1FU1BBQ0U9S287dmFyIFpvPVhvLEpvPVpvLmZpbmQsUW89Wm8uTkFNRVNQQUNFO2Z1bmN0aW9uIGVjKGUpe3JldHVybiIiIT09ZX1mdW5jdGlvbiB0YyhlLHQpe3JldHVybiBlLmhhc093blByb3BlcnR5KHQpfHwoZVt0XT0hMCksZX1mdW5jdGlvbiBuYyhlKXtpZighZSlyZXR1cm5bXTt2YXIgdD1mdW5jdGlvbihlKXtyZXR1cm4gZT9lLnNwbGl0KC9bXHRcblxmXHIgXSsvKS5maWx0ZXIoZWMpOltdfShlKTtyZXR1cm4gT2JqZWN0LmtleXModC5yZWR1Y2UodGMse30pKX1mdW5jdGlvbiByYyhlLHQpe2Zvcih2YXIgbiBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiYodFtuXT1lW25dKX1mdW5jdGlvbiBpYyhlLHQpe3ZhciBuPWUucHJvdG90eXBlO2lmKCEobiBpbnN0YW5jZW9mIHQpKXtmdW5jdGlvbiByKCl7fXIucHJvdG90eXBlPXQucHJvdG90eXBlLHJjKG4scj1uZXcgciksZS5wcm90b3R5cGU9bj1yfW4uY29uc3RydWN0b3IhPWUmJigiZnVuY3Rpb24iIT10eXBlb2YgZSYmY29uc29sZS5lcnJvcigidW5rbm93biBDbGFzczoiK2UpLG4uY29uc3RydWN0b3I9ZSl9dmFyIGFjPXt9LG9jPWFjLkVMRU1FTlRfTk9ERT0xLGNjPWFjLkFUVFJJQlVURV9OT0RFPTIsc2M9YWMuVEVYVF9OT0RFPTMsbGM9YWMuQ0RBVEFfU0VDVElPTl9OT0RFPTQsdWM9YWMuRU5USVRZX1JFRkVSRU5DRV9OT0RFPTUsZmM9YWMuRU5USVRZX05PREU9NixkYz1hYy5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU9NyxoYz1hYy5DT01NRU5UX05PREU9OCxwYz1hYy5ET0NVTUVOVF9OT0RFPTksZ2M9YWMuRE9DVU1FTlRfVFlQRV9OT0RFPTEwLG1jPWFjLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU9MTEsYmM9YWMuTk9UQVRJT05fTk9ERT0xMix5Yz17fSx2Yz17fTt5Yy5JTkRFWF9TSVpFX0VSUj0odmNbMV09IkluZGV4IHNpemUgZXJyb3IiLDEpLHljLkRPTVNUUklOR19TSVpFX0VSUj0odmNbMl09IkRPTVN0cmluZyBzaXplIGVycm9yIiwyKTt2YXIgeGM9eWMuSElFUkFSQ0hZX1JFUVVFU1RfRVJSPSh2Y1szXT0iSGllcmFyY2h5IHJlcXVlc3QgZXJyb3IiLDMpO3ljLldST05HX0RPQ1VNRU5UX0VSUj0odmNbNF09Ildyb25nIGRvY3VtZW50Iiw0KSx5Yy5JTlZBTElEX0NIQVJBQ1RFUl9FUlI9KHZjWzVdPSJJbnZhbGlkIGNoYXJhY3RlciIsNSkseWMuTk9fREFUQV9BTExPV0VEX0VSUj0odmNbNl09Ik5vIGRhdGEgYWxsb3dlZCIsNikseWMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSPSh2Y1s3XT0iTm8gbW9kaWZpY2F0aW9uIGFsbG93ZWQiLDcpO3ZhciBEYz15Yy5OT1RfRk9VTkRfRVJSPSh2Y1s4XT0iTm90IGZvdW5kIiw4KTt5Yy5OT1RfU1VQUE9SVEVEX0VSUj0odmNbOV09Ik5vdCBzdXBwb3J0ZWQiLDkpO3ZhciBUYz15Yy5JTlVTRV9BVFRSSUJVVEVfRVJSPSh2Y1sxMF09IkF0dHJpYnV0ZSBpbiB1c2UiLDEwKTtmdW5jdGlvbiB3YyhlLHQpe2lmKHQgaW5zdGFuY2VvZiBFcnJvcil2YXIgbj10O2Vsc2Ugbj10aGlzLEVycm9yLmNhbGwodGhpcyx2Y1tlXSksdGhpcy5tZXNzYWdlPXZjW2VdLEVycm9yLmNhcHR1cmVTdGFja1RyYWNlJiZFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHdjKTtyZXR1cm4gbi5jb2RlPWUsdCYmKHRoaXMubWVzc2FnZT10aGlzLm1lc3NhZ2UrIjogIit0KSxufWZ1bmN0aW9uIF9jKCl7fWZ1bmN0aW9uIEVjKGUsdCl7dGhpcy5fbm9kZT1lLHRoaXMuX3JlZnJlc2g9dCxVYyh0aGlzKX1mdW5jdGlvbiBVYyhlKXt2YXIgdD1lLl9ub2RlLl9pbmN8fGUuX25vZGUub3duZXJEb2N1bWVudC5faW5jO2lmKGUuX2luYyE9PXQpe3ZhciBuPWUuX3JlZnJlc2goZS5fbm9kZSk7aWYoaHMoZSwibGVuZ3RoIixuLmxlbmd0aCksIWUuJCRsZW5ndGh8fG4ubGVuZ3RoPGUuJCRsZW5ndGgpZm9yKHZhciByPW4ubGVuZ3RoO3IgaW4gZTtyKyspT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJmRlbGV0ZSBlW3JdO3JjKG4sZSksZS5faW5jPXR9fWZ1bmN0aW9uIEFjKCl7fWZ1bmN0aW9uIGtjKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoO24tLTspaWYoZVtuXT09PXQpcmV0dXJuIG59ZnVuY3Rpb24gU2MoZSx0LG4scil7aWYocj90W2tjKHQscildPW46dFt0Lmxlbmd0aCsrXT1uLGUpe24ub3duZXJFbGVtZW50PWU7dmFyIGk9ZS5vd25lckRvY3VtZW50O2kmJihyJiZQYyhpLGUsciksZnVuY3Rpb24oZSx0LG4pe2UmJmUuX2luYysrO3ZhciByPW4ubmFtZXNwYWNlVVJJO3I9PT1Rby5YTUxOUyYmKHQuX25zTWFwW24ucHJlZml4P24ubG9jYWxOYW1lOiIiXT1uLnZhbHVlKX0oaSxlLG4pKX19ZnVuY3Rpb24gQ2MoZSx0LG4pe3ZhciByPWtjKHQsbik7aWYoIShyPj0wKSl0aHJvdyBuZXcgd2MoRGMsbmV3IEVycm9yKGUudGFnTmFtZSsiQCIrbikpO2Zvcih2YXIgaT10Lmxlbmd0aC0xO3I8aTspdFtyXT10Wysrcl07aWYodC5sZW5ndGg9aSxlKXt2YXIgYT1lLm93bmVyRG9jdW1lbnQ7YSYmKFBjKGEsZSxuKSxuLm93bmVyRWxlbWVudD1udWxsKX19ZnVuY3Rpb24gRmMoKXt9ZnVuY3Rpb24gT2MoKXt9ZnVuY3Rpb24gSWMoZSl7cmV0dXJuKCI8Ij09ZT8iJmx0OyI6Ij4iPT1lJiYiJmd0OyIpfHwiJiI9PWUmJiImYW1wOyJ8fCciJz09ZSYmIiZxdW90OyJ8fCImIyIrZS5jaGFyQ29kZUF0KCkrIjsifWZ1bmN0aW9uIFJjKGUsdCl7aWYodChlKSlyZXR1cm4hMDtpZihlPWUuZmlyc3RDaGlsZClkb3tpZihSYyhlLHQpKXJldHVybiEwfXdoaWxlKGU9ZS5uZXh0U2libGluZyl9ZnVuY3Rpb24gTmMoKXt0aGlzLm93bmVyRG9jdW1lbnQ9dGhpc31mdW5jdGlvbiBQYyhlLHQsbixyKXtlJiZlLl9pbmMrKyxuLm5hbWVzcGFjZVVSST09PVFvLlhNTE5TJiZkZWxldGUgdC5fbnNNYXBbbi5wcmVmaXg/bi5sb2NhbE5hbWU6IiJdfWZ1bmN0aW9uIEJjKGUsdCxuKXtpZihlJiZlLl9pbmMpe2UuX2luYysrO3ZhciByPXQuY2hpbGROb2RlcztpZihuKXJbci5sZW5ndGgrK109bjtlbHNle2Zvcih2YXIgaT10LmZpcnN0Q2hpbGQsYT0wO2k7KXJbYSsrXT1pLGk9aS5uZXh0U2libGluZztyLmxlbmd0aD1hLGRlbGV0ZSByW3IubGVuZ3RoXX19fWZ1bmN0aW9uIFdjKGUsdCl7dmFyIG49dC5wcmV2aW91c1NpYmxpbmcscj10Lm5leHRTaWJsaW5nO3JldHVybiBuP24ubmV4dFNpYmxpbmc9cjplLmZpcnN0Q2hpbGQ9cixyP3IucHJldmlvdXNTaWJsaW5nPW46ZS5sYXN0Q2hpbGQ9bix0LnBhcmVudE5vZGU9bnVsbCx0LnByZXZpb3VzU2libGluZz1udWxsLHQubmV4dFNpYmxpbmc9bnVsbCxCYyhlLm93bmVyRG9jdW1lbnQsZSksdH1mdW5jdGlvbiBMYyhlKXtyZXR1cm4gZSYmZS5ub2RlVHlwZT09PU9jLkRPQ1VNRU5UX1RZUEVfTk9ERX1mdW5jdGlvbiBNYyhlKXtyZXR1cm4gZSYmZS5ub2RlVHlwZT09PU9jLkVMRU1FTlRfTk9ERX1mdW5jdGlvbiBqYyhlKXtyZXR1cm4gZSYmZS5ub2RlVHlwZT09PU9jLlRFWFRfTk9ERX1mdW5jdGlvbiB6YyhlLHQpe3ZhciBuPWUuY2hpbGROb2Rlc3x8W107aWYoSm8obixNYyl8fExjKHQpKXJldHVybiExO3ZhciByPUpvKG4sTGMpO3JldHVybiEodCYmciYmbi5pbmRleE9mKHIpPm4uaW5kZXhPZih0KSl9ZnVuY3Rpb24gSGMoZSx0KXt2YXIgbj1lLmNoaWxkTm9kZXN8fFtdO2lmKEpvKG4sKGZ1bmN0aW9uKGUpe3JldHVybiBNYyhlKSYmZSE9PXR9KSkpcmV0dXJuITE7dmFyIHI9Sm8obixMYyk7cmV0dXJuISh0JiZyJiZuLmluZGV4T2Yocik+bi5pbmRleE9mKHQpKX1mdW5jdGlvbiBWYyhlLHQsbil7aWYoIWZ1bmN0aW9uKGUpe3JldHVybiBlJiYoZS5ub2RlVHlwZT09PU9jLkRPQ1VNRU5UX05PREV8fGUubm9kZVR5cGU9PT1PYy5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFfHxlLm5vZGVUeXBlPT09T2MuRUxFTUVOVF9OT0RFKX0oZSkpdGhyb3cgbmV3IHdjKHhjLCJVbmV4cGVjdGVkIHBhcmVudCBub2RlIHR5cGUgIitlLm5vZGVUeXBlKTtpZihuJiZuLnBhcmVudE5vZGUhPT1lKXRocm93IG5ldyB3YyhEYywiY2hpbGQgbm90IGluIHBhcmVudCIpO2lmKCFmdW5jdGlvbihlKXtyZXR1cm4gZSYmKE1jKGUpfHxqYyhlKXx8TGMoZSl8fGUubm9kZVR5cGU9PT1PYy5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFfHxlLm5vZGVUeXBlPT09T2MuQ09NTUVOVF9OT0RFfHxlLm5vZGVUeXBlPT09T2MuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKX0odCl8fExjKHQpJiZlLm5vZGVUeXBlIT09T2MuRE9DVU1FTlRfTk9ERSl0aHJvdyBuZXcgd2MoeGMsIlVuZXhwZWN0ZWQgbm9kZSB0eXBlICIrdC5ub2RlVHlwZSsiIGZvciBwYXJlbnQgbm9kZSB0eXBlICIrZS5ub2RlVHlwZSl9ZnVuY3Rpb24gcWMoZSx0LG4pe3ZhciByPWUuY2hpbGROb2Rlc3x8W10saT10LmNoaWxkTm9kZXN8fFtdO2lmKHQubm9kZVR5cGU9PT1PYy5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKXt2YXIgYT1pLmZpbHRlcihNYyk7aWYoYS5sZW5ndGg+MXx8Sm8oaSxqYykpdGhyb3cgbmV3IHdjKHhjLCJNb3JlIHRoYW4gb25lIGVsZW1lbnQgb3IgdGV4dCBpbiBmcmFnbWVudCIpO2lmKDE9PT1hLmxlbmd0aCYmIXpjKGUsbikpdGhyb3cgbmV3IHdjKHhjLCJFbGVtZW50IGluIGZyYWdtZW50IGNhbiBub3QgYmUgaW5zZXJ0ZWQgYmVmb3JlIGRvY3R5cGUiKX1pZihNYyh0KSYmIXpjKGUsbikpdGhyb3cgbmV3IHdjKHhjLCJPbmx5IG9uZSBlbGVtZW50IGNhbiBiZSBhZGRlZCBhbmQgb25seSBhZnRlciBkb2N0eXBlIik7aWYoTGModCkpe2lmKEpvKHIsTGMpKXRocm93IG5ldyB3Yyh4YywiT25seSBvbmUgZG9jdHlwZSBpcyBhbGxvd2VkIik7dmFyIG89Sm8ocixNYyk7aWYobiYmci5pbmRleE9mKG8pPHIuaW5kZXhPZihuKSl0aHJvdyBuZXcgd2MoeGMsIkRvY3R5cGUgY2FuIG9ubHkgYmUgaW5zZXJ0ZWQgYmVmb3JlIGFuIGVsZW1lbnQiKTtpZighbiYmbyl0aHJvdyBuZXcgd2MoeGMsIkRvY3R5cGUgY2FuIG5vdCBiZSBhcHBlbmRlZCBzaW5jZSBlbGVtZW50IGlzIHByZXNlbnQiKX19ZnVuY3Rpb24gR2MoZSx0LG4pe3ZhciByPWUuY2hpbGROb2Rlc3x8W10saT10LmNoaWxkTm9kZXN8fFtdO2lmKHQubm9kZVR5cGU9PT1PYy5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKXt2YXIgYT1pLmZpbHRlcihNYyk7aWYoYS5sZW5ndGg+MXx8Sm8oaSxqYykpdGhyb3cgbmV3IHdjKHhjLCJNb3JlIHRoYW4gb25lIGVsZW1lbnQgb3IgdGV4dCBpbiBmcmFnbWVudCIpO2lmKDE9PT1hLmxlbmd0aCYmIUhjKGUsbikpdGhyb3cgbmV3IHdjKHhjLCJFbGVtZW50IGluIGZyYWdtZW50IGNhbiBub3QgYmUgaW5zZXJ0ZWQgYmVmb3JlIGRvY3R5cGUiKX1pZihNYyh0KSYmIUhjKGUsbikpdGhyb3cgbmV3IHdjKHhjLCJPbmx5IG9uZSBlbGVtZW50IGNhbiBiZSBhZGRlZCBhbmQgb25seSBhZnRlciBkb2N0eXBlIik7aWYoTGModCkpe2Z1bmN0aW9uIGMoZSl7cmV0dXJuIExjKGUpJiZlIT09bn1pZihKbyhyLGMpKXRocm93IG5ldyB3Yyh4YywiT25seSBvbmUgZG9jdHlwZSBpcyBhbGxvd2VkIik7dmFyIG89Sm8ocixNYyk7aWYobiYmci5pbmRleE9mKG8pPHIuaW5kZXhPZihuKSl0aHJvdyBuZXcgd2MoeGMsIkRvY3R5cGUgY2FuIG9ubHkgYmUgaW5zZXJ0ZWQgYmVmb3JlIGFuIGVsZW1lbnQiKX19ZnVuY3Rpb24gWGMoZSx0LG4scil7VmMoZSx0LG4pLGUubm9kZVR5cGU9PT1PYy5ET0NVTUVOVF9OT0RFJiYocnx8cWMpKGUsdCxuKTt2YXIgaT10LnBhcmVudE5vZGU7aWYoaSYmaS5yZW1vdmVDaGlsZCh0KSx0Lm5vZGVUeXBlPT09bWMpe3ZhciBhPXQuZmlyc3RDaGlsZDtpZihudWxsPT1hKXJldHVybiB0O3ZhciBvPXQubGFzdENoaWxkfWVsc2UgYT1vPXQ7dmFyIGM9bj9uLnByZXZpb3VzU2libGluZzplLmxhc3RDaGlsZDthLnByZXZpb3VzU2libGluZz1jLG8ubmV4dFNpYmxpbmc9bixjP2MubmV4dFNpYmxpbmc9YTplLmZpcnN0Q2hpbGQ9YSxudWxsPT1uP2UubGFzdENoaWxkPW86bi5wcmV2aW91c1NpYmxpbmc9bztkb3thLnBhcmVudE5vZGU9ZX13aGlsZShhIT09byYmKGE9YS5uZXh0U2libGluZykpO3JldHVybiBCYyhlLm93bmVyRG9jdW1lbnR8fGUsZSksdC5ub2RlVHlwZT09bWMmJih0LmZpcnN0Q2hpbGQ9dC5sYXN0Q2hpbGQ9bnVsbCksdH1mdW5jdGlvbiAkYygpe3RoaXMuX25zTWFwPXt9fWZ1bmN0aW9uIFljKCl7fWZ1bmN0aW9uIEtjKCl7fWZ1bmN0aW9uIFpjKCl7fWZ1bmN0aW9uIEpjKCl7fWZ1bmN0aW9uIFFjKCl7fWZ1bmN0aW9uIGVzKCl7fWZ1bmN0aW9uIHRzKCl7fWZ1bmN0aW9uIG5zKCl7fWZ1bmN0aW9uIHJzKCl7fWZ1bmN0aW9uIGlzKCl7fWZ1bmN0aW9uIGFzKCl7fWZ1bmN0aW9uIG9zKCl7fWZ1bmN0aW9uIGNzKGUsdCl7dmFyIG49W10scj05PT10aGlzLm5vZGVUeXBlJiZ0aGlzLmRvY3VtZW50RWxlbWVudHx8dGhpcyxpPXIucHJlZml4LGE9ci5uYW1lc3BhY2VVUkk7aWYoYSYmbnVsbD09aSYmbnVsbD09KGk9ci5sb29rdXBQcmVmaXgoYSkpKXZhciBvPVt7bmFtZXNwYWNlOmEscHJlZml4Om51bGx9XTtyZXR1cm4gdXModGhpcyxuLGUsdCxvKSxuLmpvaW4oIiIpfWZ1bmN0aW9uIHNzKGUsdCxuKXt2YXIgcj1lLnByZWZpeHx8IiIsaT1lLm5hbWVzcGFjZVVSSTtpZighaSlyZXR1cm4hMTtpZigieG1sIj09PXImJmk9PT1Rby5YTUx8fGk9PT1Rby5YTUxOUylyZXR1cm4hMTtmb3IodmFyIGE9bi5sZW5ndGg7YS0tOyl7dmFyIG89blthXTtpZihvLnByZWZpeD09PXIpcmV0dXJuIG8ubmFtZXNwYWNlIT09aX1yZXR1cm4hMH1mdW5jdGlvbiBscyhlLHQsbil7ZS5wdXNoKCIgIix0LCc9Iicsbi5yZXBsYWNlKC9bPD4mIlx0XG5ccl0vZyxJYyksJyInKX1mdW5jdGlvbiB1cyhlLHQsbixyLGkpe2lmKGl8fChpPVtdKSxyKXtpZighKGU9cihlKSkpcmV0dXJuO2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gdm9pZCB0LnB1c2goZSl9c3dpdGNoKGUubm9kZVR5cGUpe2Nhc2Ugb2M6dmFyIGE9ZS5hdHRyaWJ1dGVzLG89YS5sZW5ndGgsYz1lLmZpcnN0Q2hpbGQscz1lLnRhZ05hbWUsbD1zO2lmKCEobj1Rby5pc0hUTUwoZS5uYW1lc3BhY2VVUkkpfHxuKSYmIWUucHJlZml4JiZlLm5hbWVzcGFjZVVSSSl7Zm9yKHZhciB1LGY9MDtmPGEubGVuZ3RoO2YrKylpZigieG1sbnMiPT09YS5pdGVtKGYpLm5hbWUpe3U9YS5pdGVtKGYpLnZhbHVlO2JyZWFrfWlmKCF1KWZvcih2YXIgZD1pLmxlbmd0aC0xO2Q+PTA7ZC0tKXtpZigiIj09PShoPWlbZF0pLnByZWZpeCYmaC5uYW1lc3BhY2U9PT1lLm5hbWVzcGFjZVVSSSl7dT1oLm5hbWVzcGFjZTticmVha319aWYodSE9PWUubmFtZXNwYWNlVVJJKWZvcihkPWkubGVuZ3RoLTE7ZD49MDtkLS0pe3ZhciBoO2lmKChoPWlbZF0pLm5hbWVzcGFjZT09PWUubmFtZXNwYWNlVVJJKXtoLnByZWZpeCYmKGw9aC5wcmVmaXgrIjoiK3MpO2JyZWFrfX19dC5wdXNoKCI8IixsKTtmb3IodmFyIHA9MDtwPG87cCsrKXsieG1sbnMiPT0oZz1hLml0ZW0ocCkpLnByZWZpeD9pLnB1c2goe3ByZWZpeDpnLmxvY2FsTmFtZSxuYW1lc3BhY2U6Zy52YWx1ZX0pOiJ4bWxucyI9PWcubm9kZU5hbWUmJmkucHVzaCh7cHJlZml4OiIiLG5hbWVzcGFjZTpnLnZhbHVlfSl9Zm9yKHA9MDtwPG87cCsrKXt2YXIgZyxtLGI7aWYoc3MoZz1hLml0ZW0ocCksMCxpKSlscyh0LChtPWcucHJlZml4fHwiIik/InhtbG5zOiIrbToieG1sbnMiLGI9Zy5uYW1lc3BhY2VVUkkpLGkucHVzaCh7cHJlZml4Om0sbmFtZXNwYWNlOmJ9KTt1cyhnLHQsbixyLGkpfWlmKHM9PT1sJiZzcyhlLDAsaSkpbHModCwobT1lLnByZWZpeHx8IiIpPyJ4bWxuczoiK206InhtbG5zIixiPWUubmFtZXNwYWNlVVJJKSxpLnB1c2goe3ByZWZpeDptLG5hbWVzcGFjZTpifSk7aWYoY3x8biYmIS9eKD86bWV0YXxsaW5rfGltZ3xicnxocnxpbnB1dCkkL2kudGVzdChzKSl7aWYodC5wdXNoKCI+IiksbiYmL15zY3JpcHQkL2kudGVzdChzKSlmb3IoO2M7KWMuZGF0YT90LnB1c2goYy5kYXRhKTp1cyhjLHQsbixyLGkuc2xpY2UoKSksYz1jLm5leHRTaWJsaW5nO2Vsc2UgZm9yKDtjOyl1cyhjLHQsbixyLGkuc2xpY2UoKSksYz1jLm5leHRTaWJsaW5nO3QucHVzaCgiPC8iLGwsIj4iKX1lbHNlIHQucHVzaCgiLz4iKTtyZXR1cm47Y2FzZSBwYzpjYXNlIG1jOmZvcihjPWUuZmlyc3RDaGlsZDtjOyl1cyhjLHQsbixyLGkuc2xpY2UoKSksYz1jLm5leHRTaWJsaW5nO3JldHVybjtjYXNlIGNjOnJldHVybiBscyh0LGUubmFtZSxlLnZhbHVlKTtjYXNlIHNjOnJldHVybiB0LnB1c2goZS5kYXRhLnJlcGxhY2UoL1s8Jj5dL2csSWMpKTtjYXNlIGxjOnJldHVybiB0LnB1c2goIjwhW0NEQVRBWyIsZS5kYXRhLCJdXT4iKTtjYXNlIGhjOnJldHVybiB0LnB1c2goIlx4M2MhLS0iLGUuZGF0YSwiLS1ceDNlIik7Y2FzZSBnYzp2YXIgeT1lLnB1YmxpY0lkLHY9ZS5zeXN0ZW1JZDtpZih0LnB1c2goIjwhRE9DVFlQRSAiLGUubmFtZSkseSl0LnB1c2goIiBQVUJMSUMgIix5KSx2JiYiLiIhPXYmJnQucHVzaCgiICIsdiksdC5wdXNoKCI+Iik7ZWxzZSBpZih2JiYiLiIhPXYpdC5wdXNoKCIgU1lTVEVNICIsdiwiPiIpO2Vsc2V7dmFyIHg9ZS5pbnRlcm5hbFN1YnNldDt4JiZ0LnB1c2goIiBbIix4LCJdIiksdC5wdXNoKCI+Iil9cmV0dXJuO2Nhc2UgZGM6cmV0dXJuIHQucHVzaCgiPD8iLGUudGFyZ2V0LCIgIixlLmRhdGEsIj8+Iik7Y2FzZSB1YzpyZXR1cm4gdC5wdXNoKCImIixlLm5vZGVOYW1lLCI7Iik7ZGVmYXVsdDp0LnB1c2goIj8/IixlLm5vZGVOYW1lKX19ZnVuY3Rpb24gZnMoZSx0LG4pe3ZhciByO3N3aXRjaCh0Lm5vZGVUeXBlKXtjYXNlIG9jOihyPXQuY2xvbmVOb2RlKCExKSkub3duZXJEb2N1bWVudD1lO2Nhc2UgbWM6YnJlYWs7Y2FzZSBjYzpuPSEwfWlmKHJ8fChyPXQuY2xvbmVOb2RlKCExKSksci5vd25lckRvY3VtZW50PWUsci5wYXJlbnROb2RlPW51bGwsbilmb3IodmFyIGk9dC5maXJzdENoaWxkO2k7KXIuYXBwZW5kQ2hpbGQoZnMoZSxpLG4pKSxpPWkubmV4dFNpYmxpbmc7cmV0dXJuIHJ9ZnVuY3Rpb24gZHMoZSx0LG4pe3ZhciByPW5ldyB0LmNvbnN0cnVjdG9yO2Zvcih2YXIgaSBpbiB0KWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpKXt2YXIgYT10W2ldOyJvYmplY3QiIT10eXBlb2YgYSYmYSE9cltpXSYmKHJbaV09YSl9c3dpdGNoKHQuY2hpbGROb2RlcyYmKHIuY2hpbGROb2Rlcz1uZXcgX2MpLHIub3duZXJEb2N1bWVudD1lLHIubm9kZVR5cGUpe2Nhc2Ugb2M6dmFyIG89dC5hdHRyaWJ1dGVzLGM9ci5hdHRyaWJ1dGVzPW5ldyBBYyxzPW8ubGVuZ3RoO2MuX293bmVyRWxlbWVudD1yO2Zvcih2YXIgbD0wO2w8cztsKyspci5zZXRBdHRyaWJ1dGVOb2RlKGRzKGUsby5pdGVtKGwpLCEwKSk7YnJlYWs7Y2FzZSBjYzpuPSEwfWlmKG4pZm9yKHZhciB1PXQuZmlyc3RDaGlsZDt1OylyLmFwcGVuZENoaWxkKGRzKGUsdSxuKSksdT11Lm5leHRTaWJsaW5nO3JldHVybiByfWZ1bmN0aW9uIGhzKGUsdCxuKXtlW3RdPW59eWMuSU5WQUxJRF9TVEFURV9FUlI9KHZjWzExXT0iSW52YWxpZCBzdGF0ZSIsMTEpLHljLlNZTlRBWF9FUlI9KHZjWzEyXT0iU3ludGF4IGVycm9yIiwxMikseWMuSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSPSh2Y1sxM109IkludmFsaWQgbW9kaWZpY2F0aW9uIiwxMykseWMuTkFNRVNQQUNFX0VSUj0odmNbMTRdPSJJbnZhbGlkIG5hbWVzcGFjZSIsMTQpLHljLklOVkFMSURfQUNDRVNTX0VSUj0odmNbMTVdPSJJbnZhbGlkIGFjY2VzcyIsMTUpLHdjLnByb3RvdHlwZT1FcnJvci5wcm90b3R5cGUscmMoeWMsd2MpLF9jLnByb3RvdHlwZT17bGVuZ3RoOjAsaXRlbTpmdW5jdGlvbihlKXtyZXR1cm4gZT49MCYmZTx0aGlzLmxlbmd0aD90aGlzW2VdOm51bGx9LHRvU3RyaW5nOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdLHI9MDtyPHRoaXMubGVuZ3RoO3IrKyl1cyh0aGlzW3JdLG4sZSx0KTtyZXR1cm4gbi5qb2luKCIiKX0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodGhpcyxlKX0saW5kZXhPZjpmdW5jdGlvbihlKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLGUpfX0sRWMucHJvdG90eXBlLml0ZW09ZnVuY3Rpb24oZSl7cmV0dXJuIFVjKHRoaXMpLHRoaXNbZV18fG51bGx9LGljKEVjLF9jKSxBYy5wcm90b3R5cGU9e2xlbmd0aDowLGl0ZW06X2MucHJvdG90eXBlLml0ZW0sZ2V0TmFtZWRJdGVtOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLmxlbmd0aDt0LS07KXt2YXIgbj10aGlzW3RdO2lmKG4ubm9kZU5hbWU9PWUpcmV0dXJuIG59fSxzZXROYW1lZEl0ZW06ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vd25lckVsZW1lbnQ7aWYodCYmdCE9dGhpcy5fb3duZXJFbGVtZW50KXRocm93IG5ldyB3YyhUYyk7dmFyIG49dGhpcy5nZXROYW1lZEl0ZW0oZS5ub2RlTmFtZSk7cmV0dXJuIFNjKHRoaXMuX293bmVyRWxlbWVudCx0aGlzLGUsbiksbn0sc2V0TmFtZWRJdGVtTlM6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLm93bmVyRWxlbWVudDtpZihuJiZuIT10aGlzLl9vd25lckVsZW1lbnQpdGhyb3cgbmV3IHdjKFRjKTtyZXR1cm4gdD10aGlzLmdldE5hbWVkSXRlbU5TKGUubmFtZXNwYWNlVVJJLGUubG9jYWxOYW1lKSxTYyh0aGlzLl9vd25lckVsZW1lbnQsdGhpcyxlLHQpLHR9LHJlbW92ZU5hbWVkSXRlbTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldE5hbWVkSXRlbShlKTtyZXR1cm4gQ2ModGhpcy5fb3duZXJFbGVtZW50LHRoaXMsdCksdH0scmVtb3ZlTmFtZWRJdGVtTlM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldE5hbWVkSXRlbU5TKGUsdCk7cmV0dXJuIENjKHRoaXMuX293bmVyRWxlbWVudCx0aGlzLG4pLG59LGdldE5hbWVkSXRlbU5TOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXRoaXMubGVuZ3RoO24tLTspe3ZhciByPXRoaXNbbl07aWYoci5sb2NhbE5hbWU9PXQmJnIubmFtZXNwYWNlVVJJPT1lKXJldHVybiByfXJldHVybiBudWxsfX0sRmMucHJvdG90eXBlPXtoYXNGZWF0dXJlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuITB9LGNyZWF0ZURvY3VtZW50OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uZXcgTmM7aWYoci5pbXBsZW1lbnRhdGlvbj10aGlzLHIuY2hpbGROb2Rlcz1uZXcgX2Msci5kb2N0eXBlPW58fG51bGwsbiYmci5hcHBlbmRDaGlsZChuKSx0KXt2YXIgaT1yLmNyZWF0ZUVsZW1lbnROUyhlLHQpO3IuYXBwZW5kQ2hpbGQoaSl9cmV0dXJuIHJ9LGNyZWF0ZURvY3VtZW50VHlwZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9bmV3IGVzO3JldHVybiByLm5hbWU9ZSxyLm5vZGVOYW1lPWUsci5wdWJsaWNJZD10fHwiIixyLnN5c3RlbUlkPW58fCIiLHJ9fSxPYy5wcm90b3R5cGU9e2ZpcnN0Q2hpbGQ6bnVsbCxsYXN0Q2hpbGQ6bnVsbCxwcmV2aW91c1NpYmxpbmc6bnVsbCxuZXh0U2libGluZzpudWxsLGF0dHJpYnV0ZXM6bnVsbCxwYXJlbnROb2RlOm51bGwsY2hpbGROb2RlczpudWxsLG93bmVyRG9jdW1lbnQ6bnVsbCxub2RlVmFsdWU6bnVsbCxuYW1lc3BhY2VVUkk6bnVsbCxwcmVmaXg6bnVsbCxsb2NhbE5hbWU6bnVsbCxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWGModGhpcyxlLHQpfSxyZXBsYWNlQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtYYyh0aGlzLGUsdCxHYyksdCYmdGhpcy5yZW1vdmVDaGlsZCh0KX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFdjKHRoaXMsZSl9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShlLG51bGwpfSxoYXNDaGlsZE5vZGVzOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXRoaXMuZmlyc3RDaGlsZH0sY2xvbmVOb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBkcyh0aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsdGhpcyxlKX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZmlyc3RDaGlsZDtlOyl7dmFyIHQ9ZS5uZXh0U2libGluZzt0JiZ0Lm5vZGVUeXBlPT1zYyYmZS5ub2RlVHlwZT09c2M/KHRoaXMucmVtb3ZlQ2hpbGQodCksZS5hcHBlbmREYXRhKHQuZGF0YSkpOihlLm5vcm1hbGl6ZSgpLGU9dCl9fSxpc1N1cHBvcnRlZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZShlLHQpfSxoYXNBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlcy5sZW5ndGg+MH0sbG9va3VwUHJlZml4OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzO3Q7KXt2YXIgbj10Ll9uc01hcDtpZihuKWZvcih2YXIgciBpbiBuKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiZuW3JdPT09ZSlyZXR1cm4gcjt0PXQubm9kZVR5cGU9PWNjP3Qub3duZXJEb2N1bWVudDp0LnBhcmVudE5vZGV9cmV0dXJuIG51bGx9LGxvb2t1cE5hbWVzcGFjZVVSSTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpczt0Oyl7dmFyIG49dC5fbnNNYXA7aWYobiYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sZSkpcmV0dXJuIG5bZV07dD10Lm5vZGVUeXBlPT1jYz90Lm93bmVyRG9jdW1lbnQ6dC5wYXJlbnROb2RlfXJldHVybiBudWxsfSxpc0RlZmF1bHROYW1lc3BhY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PXRoaXMubG9va3VwUHJlZml4KGUpfX0scmMoYWMsT2MpLHJjKGFjLE9jLnByb3RvdHlwZSksTmMucHJvdG90eXBlPXtub2RlTmFtZToiI2RvY3VtZW50Iixub2RlVHlwZTpwYyxkb2N0eXBlOm51bGwsZG9jdW1lbnRFbGVtZW50Om51bGwsX2luYzoxLGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQpe2lmKGUubm9kZVR5cGU9PW1jKXtmb3IodmFyIG49ZS5maXJzdENoaWxkO247KXt2YXIgcj1uLm5leHRTaWJsaW5nO3RoaXMuaW5zZXJ0QmVmb3JlKG4sdCksbj1yfXJldHVybiBlfXJldHVybiBYYyh0aGlzLGUsdCksZS5vd25lckRvY3VtZW50PXRoaXMsbnVsbD09PXRoaXMuZG9jdW1lbnRFbGVtZW50JiZlLm5vZGVUeXBlPT09b2MmJih0aGlzLmRvY3VtZW50RWxlbWVudD1lKSxlfSxyZW1vdmVDaGlsZDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kb2N1bWVudEVsZW1lbnQ9PWUmJih0aGlzLmRvY3VtZW50RWxlbWVudD1udWxsKSxXYyh0aGlzLGUpfSxyZXBsYWNlQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtYYyh0aGlzLGUsdCxHYyksZS5vd25lckRvY3VtZW50PXRoaXMsdCYmdGhpcy5yZW1vdmVDaGlsZCh0KSxNYyhlKSYmKHRoaXMuZG9jdW1lbnRFbGVtZW50PWUpfSxpbXBvcnROb2RlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZzKHRoaXMsZSx0KX0sZ2V0RWxlbWVudEJ5SWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9bnVsbDtyZXR1cm4gUmModGhpcy5kb2N1bWVudEVsZW1lbnQsKGZ1bmN0aW9uKG4pe2lmKG4ubm9kZVR5cGU9PW9jJiZuLmdldEF0dHJpYnV0ZSgiaWQiKT09ZSlyZXR1cm4gdD1uLCEwfSkpLHR9LGdldEVsZW1lbnRzQnlDbGFzc05hbWU6ZnVuY3Rpb24oZSl7dmFyIHQ9bmMoZSk7cmV0dXJuIG5ldyBFYyh0aGlzLChmdW5jdGlvbihuKXt2YXIgcj1bXTtyZXR1cm4gdC5sZW5ndGg+MCYmUmMobi5kb2N1bWVudEVsZW1lbnQsKGZ1bmN0aW9uKGkpe2lmKGkhPT1uJiZpLm5vZGVUeXBlPT09b2Mpe3ZhciBhPWkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpO2lmKGEpe3ZhciBvPWU9PT1hO2lmKCFvKXt2YXIgYz1uYyhhKTtvPXQuZXZlcnkoKHM9YyxmdW5jdGlvbihlKXtyZXR1cm4gcyYmLTEhPT1zLmluZGV4T2YoZSl9KSl9byYmci5wdXNoKGkpfX12YXIgc30pKSxyfSkpfSxjcmVhdGVFbGVtZW50OmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyAkYztyZXR1cm4gdC5vd25lckRvY3VtZW50PXRoaXMsdC5ub2RlTmFtZT1lLHQudGFnTmFtZT1lLHQubG9jYWxOYW1lPWUsdC5jaGlsZE5vZGVzPW5ldyBfYywodC5hdHRyaWJ1dGVzPW5ldyBBYykuX293bmVyRWxlbWVudD10LHR9LGNyZWF0ZURvY3VtZW50RnJhZ21lbnQ6ZnVuY3Rpb24oKXt2YXIgZT1uZXcgaXM7cmV0dXJuIGUub3duZXJEb2N1bWVudD10aGlzLGUuY2hpbGROb2Rlcz1uZXcgX2MsZX0sY3JlYXRlVGV4dE5vZGU6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFpjO3JldHVybiB0Lm93bmVyRG9jdW1lbnQ9dGhpcyx0LmFwcGVuZERhdGEoZSksdH0sY3JlYXRlQ29tbWVudDpmdW5jdGlvbihlKXt2YXIgdD1uZXcgSmM7cmV0dXJuIHQub3duZXJEb2N1bWVudD10aGlzLHQuYXBwZW5kRGF0YShlKSx0fSxjcmVhdGVDREFUQVNlY3Rpb246ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFFjO3JldHVybiB0Lm93bmVyRG9jdW1lbnQ9dGhpcyx0LmFwcGVuZERhdGEoZSksdH0sY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IGFzO3JldHVybiBuLm93bmVyRG9jdW1lbnQ9dGhpcyxuLnRhZ05hbWU9bi5ub2RlTmFtZT1uLnRhcmdldD1lLG4ubm9kZVZhbHVlPW4uZGF0YT10LG59LGNyZWF0ZUF0dHJpYnV0ZTpmdW5jdGlvbihlKXt2YXIgdD1uZXcgWWM7cmV0dXJuIHQub3duZXJEb2N1bWVudD10aGlzLHQubmFtZT1lLHQubm9kZU5hbWU9ZSx0LmxvY2FsTmFtZT1lLHQuc3BlY2lmaWVkPSEwLHR9LGNyZWF0ZUVudGl0eVJlZmVyZW5jZTpmdW5jdGlvbihlKXt2YXIgdD1uZXcgcnM7cmV0dXJuIHQub3duZXJEb2N1bWVudD10aGlzLHQubm9kZU5hbWU9ZSx0fSxjcmVhdGVFbGVtZW50TlM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgJGMscj10LnNwbGl0KCI6IiksaT1uLmF0dHJpYnV0ZXM9bmV3IEFjO3JldHVybiBuLmNoaWxkTm9kZXM9bmV3IF9jLG4ub3duZXJEb2N1bWVudD10aGlzLG4ubm9kZU5hbWU9dCxuLnRhZ05hbWU9dCxuLm5hbWVzcGFjZVVSST1lLDI9PXIubGVuZ3RoPyhuLnByZWZpeD1yWzBdLG4ubG9jYWxOYW1lPXJbMV0pOm4ubG9jYWxOYW1lPXQsaS5fb3duZXJFbGVtZW50PW4sbn0sY3JlYXRlQXR0cmlidXRlTlM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgWWMscj10LnNwbGl0KCI6Iik7cmV0dXJuIG4ub3duZXJEb2N1bWVudD10aGlzLG4ubm9kZU5hbWU9dCxuLm5hbWU9dCxuLm5hbWVzcGFjZVVSST1lLG4uc3BlY2lmaWVkPSEwLDI9PXIubGVuZ3RoPyhuLnByZWZpeD1yWzBdLG4ubG9jYWxOYW1lPXJbMV0pOm4ubG9jYWxOYW1lPXQsbn19LGljKE5jLE9jKSwkYy5wcm90b3R5cGU9e25vZGVUeXBlOm9jLGhhc0F0dHJpYnV0ZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9dGhpcy5nZXRBdHRyaWJ1dGVOb2RlKGUpfSxnZXRBdHRyaWJ1dGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRBdHRyaWJ1dGVOb2RlKGUpO3JldHVybiB0JiZ0LnZhbHVlfHwiIn0sZ2V0QXR0cmlidXRlTm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShlKX0sc2V0QXR0cmlidXRlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShlKTtuLnZhbHVlPW4ubm9kZVZhbHVlPSIiK3QsdGhpcy5zZXRBdHRyaWJ1dGVOb2RlKG4pfSxyZW1vdmVBdHRyaWJ1dGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRBdHRyaWJ1dGVOb2RlKGUpO3QmJnRoaXMucmVtb3ZlQXR0cmlidXRlTm9kZSh0KX0sYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZVR5cGU9PT1tYz90aGlzLmluc2VydEJlZm9yZShlLG51bGwpOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQucGFyZW50Tm9kZT1lLHQucHJldmlvdXNTaWJsaW5nPWUubGFzdENoaWxkLHQubmV4dFNpYmxpbmc9bnVsbCx0LnByZXZpb3VzU2libGluZz90LnByZXZpb3VzU2libGluZy5uZXh0U2libGluZz10OmUuZmlyc3RDaGlsZD10LGUubGFzdENoaWxkPXQsQmMoZS5vd25lckRvY3VtZW50LGUsdCksdH0odGhpcyxlKX0sc2V0QXR0cmlidXRlTm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLnNldE5hbWVkSXRlbShlKX0sc2V0QXR0cmlidXRlTm9kZU5TOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMuc2V0TmFtZWRJdGVtTlMoZSl9LHJlbW92ZUF0dHJpYnV0ZU5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0oZS5ub2RlTmFtZSl9LHJlbW92ZUF0dHJpYnV0ZU5TOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMoZSx0KTtuJiZ0aGlzLnJlbW92ZUF0dHJpYnV0ZU5vZGUobil9LGhhc0F0dHJpYnV0ZU5TOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGwhPXRoaXMuZ2V0QXR0cmlidXRlTm9kZU5TKGUsdCl9LGdldEF0dHJpYnV0ZU5TOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMoZSx0KTtyZXR1cm4gbiYmbi52YWx1ZXx8IiJ9LHNldEF0dHJpYnV0ZU5TOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlTlMoZSx0KTtyLnZhbHVlPXIubm9kZVZhbHVlPSIiK24sdGhpcy5zZXRBdHRyaWJ1dGVOb2RlKHIpfSxnZXRBdHRyaWJ1dGVOb2RlTlM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbU5TKGUsdCl9LGdldEVsZW1lbnRzQnlUYWdOYW1lOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgRWModGhpcywoZnVuY3Rpb24odCl7dmFyIG49W107cmV0dXJuIFJjKHQsKGZ1bmN0aW9uKHIpe3I9PT10fHxyLm5vZGVUeXBlIT1vY3x8IioiIT09ZSYmci50YWdOYW1lIT1lfHxuLnB1c2gocil9KSksbn0pKX0sZ2V0RWxlbWVudHNCeVRhZ05hbWVOUzpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgRWModGhpcywoZnVuY3Rpb24obil7dmFyIHI9W107cmV0dXJuIFJjKG4sKGZ1bmN0aW9uKGkpe2k9PT1ufHxpLm5vZGVUeXBlIT09b2N8fCIqIiE9PWUmJmkubmFtZXNwYWNlVVJJIT09ZXx8IioiIT09dCYmaS5sb2NhbE5hbWUhPXR8fHIucHVzaChpKX0pKSxyfSkpfX0sTmMucHJvdG90eXBlLmdldEVsZW1lbnRzQnlUYWdOYW1lPSRjLnByb3RvdHlwZS5nZXRFbGVtZW50c0J5VGFnTmFtZSxOYy5wcm90b3R5cGUuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUz0kYy5wcm90b3R5cGUuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyxpYygkYyxPYyksWWMucHJvdG90eXBlLm5vZGVUeXBlPWNjLGljKFljLE9jKSxLYy5wcm90b3R5cGU9e2RhdGE6IiIsc3Vic3RyaW5nRGF0YTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRhdGEuc3Vic3RyaW5nKGUsZSt0KX0sYXBwZW5kRGF0YTpmdW5jdGlvbihlKXtlPXRoaXMuZGF0YStlLHRoaXMubm9kZVZhbHVlPXRoaXMuZGF0YT1lLHRoaXMubGVuZ3RoPWUubGVuZ3RofSxpbnNlcnREYXRhOmZ1bmN0aW9uKGUsdCl7dGhpcy5yZXBsYWNlRGF0YShlLDAsdCl9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcih2Y1t4Y10pfSxkZWxldGVEYXRhOmZ1bmN0aW9uKGUsdCl7dGhpcy5yZXBsYWNlRGF0YShlLHQsIiIpfSxyZXBsYWNlRGF0YTpmdW5jdGlvbihlLHQsbil7bj10aGlzLmRhdGEuc3Vic3RyaW5nKDAsZSkrbit0aGlzLmRhdGEuc3Vic3RyaW5nKGUrdCksdGhpcy5ub2RlVmFsdWU9dGhpcy5kYXRhPW4sdGhpcy5sZW5ndGg9bi5sZW5ndGh9fSxpYyhLYyxPYyksWmMucHJvdG90eXBlPXtub2RlTmFtZToiI3RleHQiLG5vZGVUeXBlOnNjLHNwbGl0VGV4dDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmRhdGEsbj10LnN1YnN0cmluZyhlKTt0PXQuc3Vic3RyaW5nKDAsZSksdGhpcy5kYXRhPXRoaXMubm9kZVZhbHVlPXQsdGhpcy5sZW5ndGg9dC5sZW5ndGg7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pO3JldHVybiB0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocix0aGlzLm5leHRTaWJsaW5nKSxyfX0saWMoWmMsS2MpLEpjLnByb3RvdHlwZT17bm9kZU5hbWU6IiNjb21tZW50Iixub2RlVHlwZTpoY30saWMoSmMsS2MpLFFjLnByb3RvdHlwZT17bm9kZU5hbWU6IiNjZGF0YS1zZWN0aW9uIixub2RlVHlwZTpsY30saWMoUWMsS2MpLGVzLnByb3RvdHlwZS5ub2RlVHlwZT1nYyxpYyhlcyxPYyksdHMucHJvdG90eXBlLm5vZGVUeXBlPWJjLGljKHRzLE9jKSxucy5wcm90b3R5cGUubm9kZVR5cGU9ZmMsaWMobnMsT2MpLHJzLnByb3RvdHlwZS5ub2RlVHlwZT11YyxpYyhycyxPYyksaXMucHJvdG90eXBlLm5vZGVOYW1lPSIjZG9jdW1lbnQtZnJhZ21lbnQiLGlzLnByb3RvdHlwZS5ub2RlVHlwZT1tYyxpYyhpcyxPYyksYXMucHJvdG90eXBlLm5vZGVUeXBlPWRjLGljKGFzLE9jKSxvcy5wcm90b3R5cGUuc2VyaWFsaXplVG9TdHJpbmc9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBjcy5jYWxsKGUsdCxuKX0sT2MucHJvdG90eXBlLnRvU3RyaW5nPWNzO3RyeXtpZihPYmplY3QuZGVmaW5lUHJvcGVydHkpe2Z1bmN0aW9uIGhFKGUpe3N3aXRjaChlLm5vZGVUeXBlKXtjYXNlIG9jOmNhc2UgbWM6dmFyIHQ9W107Zm9yKGU9ZS5maXJzdENoaWxkO2U7KTchPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmdC5wdXNoKGhFKGUpKSxlPWUubmV4dFNpYmxpbmc7cmV0dXJuIHQuam9pbigiIik7ZGVmYXVsdDpyZXR1cm4gZS5ub2RlVmFsdWV9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShFYy5wcm90b3R5cGUsImxlbmd0aCIse2dldDpmdW5jdGlvbigpe3JldHVybiBVYyh0aGlzKSx0aGlzLiQkbGVuZ3RofX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYy5wcm90b3R5cGUsInRleHRDb250ZW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGhFKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oZSl7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2Ugb2M6Y2FzZSBtYzpmb3IoO3RoaXMuZmlyc3RDaGlsZDspdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmZpcnN0Q2hpbGQpOyhlfHxTdHJpbmcoZSkpJiZ0aGlzLmFwcGVuZENoaWxkKHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKSk7YnJlYWs7ZGVmYXVsdDp0aGlzLmRhdGE9ZSx0aGlzLnZhbHVlPWUsdGhpcy5ub2RlVmFsdWU9ZX19fSksaHM9ZnVuY3Rpb24oZSx0LG4pe2VbIiQkIit0XT1ufX19Y2F0Y2gocEUpe31Hby5Eb2N1bWVudFR5cGU9ZXMsR28uRE9NRXhjZXB0aW9uPXdjLEdvLkRPTUltcGxlbWVudGF0aW9uPUZjLEdvLkVsZW1lbnQ9JGMsR28uTm9kZT1PYyxHby5Ob2RlTGlzdD1fYyxHby5YTUxTZXJpYWxpemVyPW9zO3ZhciBwcz17fSxncz17fTshZnVuY3Rpb24oZSl7dmFyIHQ9WG8uZnJlZXplO2UuWE1MX0VOVElUSUVTPXQoe2FtcDoiJiIsYXBvczoiJyIsZ3Q6Ij4iLGx0OiI8IixxdW90OiciJ30pLGUuSFRNTF9FTlRJVElFUz10KHtBYWN1dGU6IsOBIixhYWN1dGU6IsOhIixBYnJldmU6IsSCIixhYnJldmU6IsSDIixhYzoi4oi+IixhY2Q6IuKIvyIsYWNFOiLiiL7MsyIsQWNpcmM6IsOCIixhY2lyYzoiw6IiLGFjdXRlOiLCtCIsQWN5OiLQkCIsYWN5OiLQsCIsQUVsaWc6IsOGIixhZWxpZzoiw6YiLGFmOiLigaEiLEFmcjoi8J2UhCIsYWZyOiLwnZSeIixBZ3JhdmU6IsOAIixhZ3JhdmU6IsOgIixhbGVmc3ltOiLihLUiLGFsZXBoOiLihLUiLEFscGhhOiLOkSIsYWxwaGE6Is6xIixBbWFjcjoixIAiLGFtYWNyOiLEgSIsYW1hbGc6IuKovyIsQU1QOiImIixhbXA6IiYiLEFuZDoi4qmTIixhbmQ6IuKIpyIsYW5kYW5kOiLiqZUiLGFuZGQ6IuKpnCIsYW5kc2xvcGU6IuKpmCIsYW5kdjoi4qmaIixhbmc6IuKIoCIsYW5nZToi4qakIixhbmdsZToi4oigIixhbmdtc2Q6IuKIoSIsYW5nbXNkYWE6IuKmqCIsYW5nbXNkYWI6IuKmqSIsYW5nbXNkYWM6IuKmqiIsYW5nbXNkYWQ6IuKmqyIsYW5nbXNkYWU6IuKmrCIsYW5nbXNkYWY6IuKmrSIsYW5nbXNkYWc6IuKmriIsYW5nbXNkYWg6IuKmryIsYW5ncnQ6IuKInyIsYW5ncnR2Yjoi4oq+IixhbmdydHZiZDoi4qadIixhbmdzcGg6IuKIoiIsYW5nc3Q6IsOFIixhbmd6YXJyOiLijbwiLEFvZ29uOiLEhCIsYW9nb246IsSFIixBb3BmOiLwnZS4Iixhb3BmOiLwnZWSIixhcDoi4omIIixhcGFjaXI6IuKpryIsYXBFOiLiqbAiLGFwZToi4omKIixhcGlkOiLiiYsiLGFwb3M6IiciLEFwcGx5RnVuY3Rpb246IuKBoSIsYXBwcm94OiLiiYgiLGFwcHJveGVxOiLiiYoiLEFyaW5nOiLDhSIsYXJpbmc6IsOlIixBc2NyOiLwnZKcIixhc2NyOiLwnZK2IixBc3NpZ246IuKJlCIsYXN0OiIqIixhc3ltcDoi4omIIixhc3ltcGVxOiLiiY0iLEF0aWxkZToiw4MiLGF0aWxkZToiw6MiLEF1bWw6IsOEIixhdW1sOiLDpCIsYXdjb25pbnQ6IuKIsyIsYXdpbnQ6IuKokSIsYmFja2Nvbmc6IuKJjCIsYmFja2Vwc2lsb246Is+2IixiYWNrcHJpbWU6IuKAtSIsYmFja3NpbToi4oi9IixiYWNrc2ltZXE6IuKLjSIsQmFja3NsYXNoOiLiiJYiLEJhcnY6IuKrpyIsYmFydmVlOiLiir0iLEJhcndlZDoi4oyGIixiYXJ3ZWQ6IuKMhSIsYmFyd2VkZ2U6IuKMhSIsYmJyazoi4o61IixiYnJrdGJyazoi4o62IixiY29uZzoi4omMIixCY3k6ItCRIixiY3k6ItCxIixiZHF1bzoi4oCeIixiZWNhdXM6IuKItSIsQmVjYXVzZToi4oi1IixiZWNhdXNlOiLiiLUiLGJlbXB0eXY6IuKmsCIsYmVwc2k6Is+2IixiZXJub3U6IuKErCIsQmVybm91bGxpczoi4oSsIixCZXRhOiLOkiIsYmV0YToizrIiLGJldGg6IuKEtiIsYmV0d2Vlbjoi4omsIixCZnI6IvCdlIUiLGJmcjoi8J2UnyIsYmlnY2FwOiLii4IiLGJpZ2NpcmM6IuKXryIsYmlnY3VwOiLii4MiLGJpZ29kb3Q6IuKogCIsYmlnb3BsdXM6IuKogSIsYmlnb3RpbWVzOiLiqIIiLGJpZ3NxY3VwOiLiqIYiLGJpZ3N0YXI6IuKYhSIsYmlndHJpYW5nbGVkb3duOiLilr0iLGJpZ3RyaWFuZ2xldXA6IuKWsyIsYmlndXBsdXM6IuKohCIsYmlndmVlOiLii4EiLGJpZ3dlZGdlOiLii4AiLGJrYXJvdzoi4qSNIixibGFja2xvemVuZ2U6IuKnqyIsYmxhY2tzcXVhcmU6IuKWqiIsYmxhY2t0cmlhbmdsZToi4pa0IixibGFja3RyaWFuZ2xlZG93bjoi4pa+IixibGFja3RyaWFuZ2xlbGVmdDoi4peCIixibGFja3RyaWFuZ2xlcmlnaHQ6IuKWuCIsYmxhbms6IuKQoyIsYmxrMTI6IuKWkiIsYmxrMTQ6IuKWkSIsYmxrMzQ6IuKWkyIsYmxvY2s6IuKWiCIsYm5lOiI94oOlIixibmVxdWl2OiLiiaHig6UiLGJOb3Q6IuKrrSIsYm5vdDoi4oyQIixCb3BmOiLwnZS5Iixib3BmOiLwnZWTIixib3Q6IuKKpSIsYm90dG9tOiLiiqUiLGJvd3RpZToi4ouIIixib3hib3g6IuKniSIsYm94REw6IuKVlyIsYm94RGw6IuKVliIsYm94ZEw6IuKVlSIsYm94ZGw6IuKUkCIsYm94RFI6IuKVlCIsYm94RHI6IuKVkyIsYm94ZFI6IuKVkiIsYm94ZHI6IuKUjCIsYm94SDoi4pWQIixib3hoOiLilIAiLGJveEhEOiLilaYiLGJveEhkOiLilaQiLGJveGhEOiLilaUiLGJveGhkOiLilKwiLGJveEhVOiLilakiLGJveEh1OiLilaciLGJveGhVOiLilagiLGJveGh1OiLilLQiLGJveG1pbnVzOiLiip8iLGJveHBsdXM6IuKKniIsYm94dGltZXM6IuKKoCIsYm94VUw6IuKVnSIsYm94VWw6IuKVnCIsYm94dUw6IuKVmyIsYm94dWw6IuKUmCIsYm94VVI6IuKVmiIsYm94VXI6IuKVmSIsYm94dVI6IuKVmCIsYm94dXI6IuKUlCIsYm94Vjoi4pWRIixib3h2OiLilIIiLGJveFZIOiLilawiLGJveFZoOiLilasiLGJveHZIOiLilaoiLGJveHZoOiLilLwiLGJveFZMOiLilaMiLGJveFZsOiLilaIiLGJveHZMOiLilaEiLGJveHZsOiLilKQiLGJveFZSOiLilaAiLGJveFZyOiLilZ8iLGJveHZSOiLilZ4iLGJveHZyOiLilJwiLGJwcmltZToi4oC1IixCcmV2ZToiy5giLGJyZXZlOiLLmCIsYnJ2YmFyOiLCpiIsQnNjcjoi4oSsIixic2NyOiLwnZK3Iixic2VtaToi4oGPIixic2ltOiLiiL0iLGJzaW1lOiLii40iLGJzb2w6IlxcIixic29sYjoi4qeFIixic29saHN1Yjoi4p+IIixidWxsOiLigKIiLGJ1bGxldDoi4oCiIixidW1wOiLiiY4iLGJ1bXBFOiLiqq4iLGJ1bXBlOiLiiY8iLEJ1bXBlcToi4omOIixidW1wZXE6IuKJjyIsQ2FjdXRlOiLEhiIsY2FjdXRlOiLEhyIsQ2FwOiLii5IiLGNhcDoi4oipIixjYXBhbmQ6IuKphCIsY2FwYnJjdXA6IuKpiSIsY2FwY2FwOiLiqYsiLGNhcGN1cDoi4qmHIixjYXBkb3Q6IuKpgCIsQ2FwaXRhbERpZmZlcmVudGlhbEQ6IuKFhSIsY2Fwczoi4oip77iAIixjYXJldDoi4oGBIixjYXJvbjoiy4ciLENheWxleXM6IuKErSIsY2NhcHM6IuKpjSIsQ2Nhcm9uOiLEjCIsY2Nhcm9uOiLEjSIsQ2NlZGlsOiLDhyIsY2NlZGlsOiLDpyIsQ2NpcmM6IsSIIixjY2lyYzoixIkiLENjb25pbnQ6IuKIsCIsY2N1cHM6IuKpjCIsY2N1cHNzbToi4qmQIixDZG90OiLEiiIsY2RvdDoixIsiLGNlZGlsOiLCuCIsQ2VkaWxsYToiwrgiLGNlbXB0eXY6IuKmsiIsY2VudDoiwqIiLENlbnRlckRvdDoiwrciLGNlbnRlcmRvdDoiwrciLENmcjoi4oStIixjZnI6IvCdlKAiLENIY3k6ItCnIixjaGN5OiLRhyIsY2hlY2s6IuKckyIsY2hlY2ttYXJrOiLinJMiLENoaToizqciLGNoaToiz4ciLGNpcjoi4peLIixjaXJjOiLLhiIsY2lyY2VxOiLiiZciLGNpcmNsZWFycm93bGVmdDoi4oa6IixjaXJjbGVhcnJvd3JpZ2h0OiLihrsiLGNpcmNsZWRhc3Q6IuKKmyIsY2lyY2xlZGNpcmM6IuKKmiIsY2lyY2xlZGRhc2g6IuKKnSIsQ2lyY2xlRG90OiLiipkiLGNpcmNsZWRSOiLCriIsY2lyY2xlZFM6IuKTiCIsQ2lyY2xlTWludXM6IuKKliIsQ2lyY2xlUGx1czoi4oqVIixDaXJjbGVUaW1lczoi4oqXIixjaXJFOiLip4MiLGNpcmU6IuKJlyIsY2lyZm5pbnQ6IuKokCIsY2lybWlkOiLiq68iLGNpcnNjaXI6IuKngiIsQ2xvY2t3aXNlQ29udG91ckludGVncmFsOiLiiLIiLENsb3NlQ3VybHlEb3VibGVRdW90ZToi4oCdIixDbG9zZUN1cmx5UXVvdGU6IuKAmSIsY2x1YnM6IuKZoyIsY2x1YnN1aXQ6IuKZoyIsQ29sb246IuKItyIsY29sb246IjoiLENvbG9uZToi4qm0Iixjb2xvbmU6IuKJlCIsY29sb25lcToi4omUIixjb21tYToiLCIsY29tbWF0OiJAIixjb21wOiLiiIEiLGNvbXBmbjoi4oiYIixjb21wbGVtZW50OiLiiIEiLGNvbXBsZXhlczoi4oSCIixjb25nOiLiiYUiLGNvbmdkb3Q6IuKprSIsQ29uZ3J1ZW50OiLiiaEiLENvbmludDoi4oivIixjb25pbnQ6IuKIriIsQ29udG91ckludGVncmFsOiLiiK4iLENvcGY6IuKEgiIsY29wZjoi8J2VlCIsY29wcm9kOiLiiJAiLENvcHJvZHVjdDoi4oiQIixDT1BZOiLCqSIsY29weToiwqkiLGNvcHlzcjoi4oSXIixDb3VudGVyQ2xvY2t3aXNlQ29udG91ckludGVncmFsOiLiiLMiLGNyYXJyOiLihrUiLENyb3NzOiLiqK8iLGNyb3NzOiLinJciLENzY3I6IvCdkp4iLGNzY3I6IvCdkrgiLGNzdWI6IuKrjyIsY3N1YmU6IuKrkSIsY3N1cDoi4quQIixjc3VwZToi4quSIixjdGRvdDoi4ouvIixjdWRhcnJsOiLipLgiLGN1ZGFycnI6IuKktSIsY3VlcHI6IuKLniIsY3Vlc2M6IuKLnyIsY3VsYXJyOiLihrYiLGN1bGFycnA6IuKkvSIsQ3VwOiLii5MiLGN1cDoi4oiqIixjdXBicmNhcDoi4qmIIixDdXBDYXA6IuKJjSIsY3VwY2FwOiLiqYYiLGN1cGN1cDoi4qmKIixjdXBkb3Q6IuKKjSIsY3Vwb3I6IuKphSIsY3Vwczoi4oiq77iAIixjdXJhcnI6IuKGtyIsY3VyYXJybToi4qS8IixjdXJseWVxcHJlYzoi4oueIixjdXJseWVxc3VjYzoi4oufIixjdXJseXZlZToi4ouOIixjdXJseXdlZGdlOiLii48iLGN1cnJlbjoiwqQiLGN1cnZlYXJyb3dsZWZ0OiLihrYiLGN1cnZlYXJyb3dyaWdodDoi4oa3IixjdXZlZToi4ouOIixjdXdlZDoi4ouPIixjd2NvbmludDoi4oiyIixjd2ludDoi4oixIixjeWxjdHk6IuKMrSIsRGFnZ2VyOiLigKEiLGRhZ2dlcjoi4oCgIixkYWxldGg6IuKEuCIsRGFycjoi4oahIixkQXJyOiLih5MiLGRhcnI6IuKGkyIsZGFzaDoi4oCQIixEYXNodjoi4qukIixkYXNodjoi4oqjIixkYmthcm93OiLipI8iLGRibGFjOiLLnSIsRGNhcm9uOiLEjiIsZGNhcm9uOiLEjyIsRGN5OiLQlCIsZGN5OiLQtCIsREQ6IuKFhSIsZGQ6IuKFhiIsZGRhZ2dlcjoi4oChIixkZGFycjoi4oeKIixERG90cmFoZDoi4qSRIixkZG90c2VxOiLiqbciLGRlZzoiwrAiLERlbDoi4oiHIixEZWx0YToizpQiLGRlbHRhOiLOtCIsZGVtcHR5djoi4qaxIixkZmlzaHQ6IuKlvyIsRGZyOiLwnZSHIixkZnI6IvCdlKEiLGRIYXI6IuKlpSIsZGhhcmw6IuKHgyIsZGhhcnI6IuKHgiIsRGlhY3JpdGljYWxBY3V0ZToiwrQiLERpYWNyaXRpY2FsRG90OiLLmSIsRGlhY3JpdGljYWxEb3VibGVBY3V0ZToiy50iLERpYWNyaXRpY2FsR3JhdmU6ImAiLERpYWNyaXRpY2FsVGlsZGU6IsucIixkaWFtOiLii4QiLERpYW1vbmQ6IuKLhCIsZGlhbW9uZDoi4ouEIixkaWFtb25kc3VpdDoi4pmmIixkaWFtczoi4pmmIixkaWU6IsKoIixEaWZmZXJlbnRpYWxEOiLihYYiLGRpZ2FtbWE6Is+dIixkaXNpbjoi4ouyIixkaXY6IsO3IixkaXZpZGU6IsO3IixkaXZpZGVvbnRpbWVzOiLii4ciLGRpdm9ueDoi4ouHIixESmN5OiLQgiIsZGpjeToi0ZIiLGRsY29ybjoi4oyeIixkbGNyb3A6IuKMjSIsZG9sbGFyOiIkIixEb3BmOiLwnZS7Iixkb3BmOiLwnZWVIixEb3Q6IsKoIixkb3Q6IsuZIixEb3REb3Q6IuKDnCIsZG90ZXE6IuKJkCIsZG90ZXFkb3Q6IuKJkSIsRG90RXF1YWw6IuKJkCIsZG90bWludXM6IuKIuCIsZG90cGx1czoi4oiUIixkb3RzcXVhcmU6IuKKoSIsZG91YmxlYmFyd2VkZ2U6IuKMhiIsRG91YmxlQ29udG91ckludGVncmFsOiLiiK8iLERvdWJsZURvdDoiwqgiLERvdWJsZURvd25BcnJvdzoi4oeTIixEb3VibGVMZWZ0QXJyb3c6IuKHkCIsRG91YmxlTGVmdFJpZ2h0QXJyb3c6IuKHlCIsRG91YmxlTGVmdFRlZToi4qukIixEb3VibGVMb25nTGVmdEFycm93OiLin7giLERvdWJsZUxvbmdMZWZ0UmlnaHRBcnJvdzoi4p+6IixEb3VibGVMb25nUmlnaHRBcnJvdzoi4p+5IixEb3VibGVSaWdodEFycm93OiLih5IiLERvdWJsZVJpZ2h0VGVlOiLiiqgiLERvdWJsZVVwQXJyb3c6IuKHkSIsRG91YmxlVXBEb3duQXJyb3c6IuKHlSIsRG91YmxlVmVydGljYWxCYXI6IuKIpSIsRG93bkFycm93OiLihpMiLERvd25hcnJvdzoi4oeTIixkb3duYXJyb3c6IuKGkyIsRG93bkFycm93QmFyOiLipJMiLERvd25BcnJvd1VwQXJyb3c6IuKHtSIsRG93bkJyZXZlOiLMkSIsZG93bmRvd25hcnJvd3M6IuKHiiIsZG93bmhhcnBvb25sZWZ0OiLih4MiLGRvd25oYXJwb29ucmlnaHQ6IuKHgiIsRG93bkxlZnRSaWdodFZlY3Rvcjoi4qWQIixEb3duTGVmdFRlZVZlY3Rvcjoi4qWeIixEb3duTGVmdFZlY3Rvcjoi4oa9IixEb3duTGVmdFZlY3RvckJhcjoi4qWWIixEb3duUmlnaHRUZWVWZWN0b3I6IuKlnyIsRG93blJpZ2h0VmVjdG9yOiLih4EiLERvd25SaWdodFZlY3RvckJhcjoi4qWXIixEb3duVGVlOiLiiqQiLERvd25UZWVBcnJvdzoi4oanIixkcmJrYXJvdzoi4qSQIixkcmNvcm46IuKMnyIsZHJjcm9wOiLijIwiLERzY3I6IvCdkp8iLGRzY3I6IvCdkrkiLERTY3k6ItCFIixkc2N5OiLRlSIsZHNvbDoi4qe2IixEc3Ryb2s6IsSQIixkc3Ryb2s6IsSRIixkdGRvdDoi4ouxIixkdHJpOiLilr8iLGR0cmlmOiLilr4iLGR1YXJyOiLih7UiLGR1aGFyOiLipa8iLGR3YW5nbGU6IuKmpiIsRFpjeToi0I8iLGR6Y3k6ItGfIixkemlncmFycjoi4p+/IixFYWN1dGU6IsOJIixlYWN1dGU6IsOpIixlYXN0ZXI6IuKpriIsRWNhcm9uOiLEmiIsZWNhcm9uOiLEmyIsZWNpcjoi4omWIixFY2lyYzoiw4oiLGVjaXJjOiLDqiIsZWNvbG9uOiLiiZUiLEVjeToi0K0iLGVjeToi0Y0iLGVERG90OiLiqbciLEVkb3Q6IsSWIixlRG90OiLiiZEiLGVkb3Q6IsSXIixlZToi4oWHIixlZkRvdDoi4omSIixFZnI6IvCdlIgiLGVmcjoi8J2UoiIsZWc6IuKqmiIsRWdyYXZlOiLDiCIsZWdyYXZlOiLDqCIsZWdzOiLiqpYiLGVnc2RvdDoi4qqYIixlbDoi4qqZIixFbGVtZW50OiLiiIgiLGVsaW50ZXJzOiLij6ciLGVsbDoi4oSTIixlbHM6IuKqlSIsZWxzZG90OiLiqpciLEVtYWNyOiLEkiIsZW1hY3I6IsSTIixlbXB0eToi4oiFIixlbXB0eXNldDoi4oiFIixFbXB0eVNtYWxsU3F1YXJlOiLil7siLGVtcHR5djoi4oiFIixFbXB0eVZlcnlTbWFsbFNxdWFyZToi4parIixlbXNwOiLigIMiLGVtc3AxMzoi4oCEIixlbXNwMTQ6IuKAhSIsRU5HOiLFiiIsZW5nOiLFiyIsZW5zcDoi4oCCIixFb2dvbjoixJgiLGVvZ29uOiLEmSIsRW9wZjoi8J2UvCIsZW9wZjoi8J2VliIsZXBhcjoi4ouVIixlcGFyc2w6IuKnoyIsZXBsdXM6IuKpsSIsZXBzaToizrUiLEVwc2lsb246Is6VIixlcHNpbG9uOiLOtSIsZXBzaXY6Is+1IixlcWNpcmM6IuKJliIsZXFjb2xvbjoi4omVIixlcXNpbToi4omCIixlcXNsYW50Z3RyOiLiqpYiLGVxc2xhbnRsZXNzOiLiqpUiLEVxdWFsOiLiqbUiLGVxdWFsczoiPSIsRXF1YWxUaWxkZToi4omCIixlcXVlc3Q6IuKJnyIsRXF1aWxpYnJpdW06IuKHjCIsZXF1aXY6IuKJoSIsZXF1aXZERDoi4qm4IixlcXZwYXJzbDoi4qelIixlcmFycjoi4qWxIixlckRvdDoi4omTIixFc2NyOiLihLAiLGVzY3I6IuKEryIsZXNkb3Q6IuKJkCIsRXNpbToi4qmzIixlc2ltOiLiiYIiLEV0YToizpciLGV0YToizrciLEVUSDoiw5AiLGV0aDoiw7AiLEV1bWw6IsOLIixldW1sOiLDqyIsZXVybzoi4oKsIixleGNsOiIhIixleGlzdDoi4oiDIixFeGlzdHM6IuKIgyIsZXhwZWN0YXRpb246IuKEsCIsRXhwb25lbnRpYWxFOiLihYciLGV4cG9uZW50aWFsZToi4oWHIixmYWxsaW5nZG90c2VxOiLiiZIiLEZjeToi0KQiLGZjeToi0YQiLGZlbWFsZToi4pmAIixmZmlsaWc6Iu+sgyIsZmZsaWc6Iu+sgCIsZmZsbGlnOiLvrIQiLEZmcjoi8J2UiSIsZmZyOiLwnZSjIixmaWxpZzoi76yBIixGaWxsZWRTbWFsbFNxdWFyZToi4pe8IixGaWxsZWRWZXJ5U21hbGxTcXVhcmU6IuKWqiIsZmpsaWc6ImZqIixmbGF0OiLima0iLGZsbGlnOiLvrIIiLGZsdG5zOiLilrEiLGZub2Y6IsaSIixGb3BmOiLwnZS9Iixmb3BmOiLwnZWXIixGb3JBbGw6IuKIgCIsZm9yYWxsOiLiiIAiLGZvcms6IuKLlCIsZm9ya3Y6IuKrmSIsRm91cmllcnRyZjoi4oSxIixmcGFydGludDoi4qiNIixmcmFjMTI6IsK9IixmcmFjMTM6IuKFkyIsZnJhYzE0OiLCvCIsZnJhYzE1OiLihZUiLGZyYWMxNjoi4oWZIixmcmFjMTg6IuKFmyIsZnJhYzIzOiLihZQiLGZyYWMyNToi4oWWIixmcmFjMzQ6IsK+IixmcmFjMzU6IuKFlyIsZnJhYzM4OiLihZwiLGZyYWM0NToi4oWYIixmcmFjNTY6IuKFmiIsZnJhYzU4OiLihZ0iLGZyYWM3ODoi4oWeIixmcmFzbDoi4oGEIixmcm93bjoi4oyiIixGc2NyOiLihLEiLGZzY3I6IvCdkrsiLGdhY3V0ZToix7UiLEdhbW1hOiLOkyIsZ2FtbWE6Is6zIixHYW1tYWQ6Is+cIixnYW1tYWQ6Is+dIixnYXA6IuKqhiIsR2JyZXZlOiLEniIsZ2JyZXZlOiLEnyIsR2NlZGlsOiLEoiIsR2NpcmM6IsScIixnY2lyYzoixJ0iLEdjeToi0JMiLGdjeToi0LMiLEdkb3Q6IsSgIixnZG90OiLEoSIsZ0U6IuKJpyIsZ2U6IuKJpSIsZ0VsOiLiqowiLGdlbDoi4oubIixnZXE6IuKJpSIsZ2VxcToi4omnIixnZXFzbGFudDoi4qm+IixnZXM6IuKpviIsZ2VzY2M6IuKqqSIsZ2VzZG90OiLiqoAiLGdlc2RvdG86IuKqgiIsZ2VzZG90b2w6IuKqhCIsZ2VzbDoi4oub77iAIixnZXNsZXM6IuKqlCIsR2ZyOiLwnZSKIixnZnI6IvCdlKQiLEdnOiLii5kiLGdnOiLiiasiLGdnZzoi4ouZIixnaW1lbDoi4oS3IixHSmN5OiLQgyIsZ2pjeToi0ZMiLGdsOiLiibciLGdsYToi4qqlIixnbEU6IuKqkiIsZ2xqOiLiqqQiLGduYXA6IuKqiiIsZ25hcHByb3g6IuKqiiIsZ25FOiLiiakiLGduZToi4qqIIixnbmVxOiLiqogiLGduZXFxOiLiiakiLGduc2ltOiLii6ciLEdvcGY6IvCdlL4iLGdvcGY6IvCdlZgiLGdyYXZlOiJgIixHcmVhdGVyRXF1YWw6IuKJpSIsR3JlYXRlckVxdWFsTGVzczoi4oubIixHcmVhdGVyRnVsbEVxdWFsOiLiiaciLEdyZWF0ZXJHcmVhdGVyOiLiqqIiLEdyZWF0ZXJMZXNzOiLiibciLEdyZWF0ZXJTbGFudEVxdWFsOiLiqb4iLEdyZWF0ZXJUaWxkZToi4omzIixHc2NyOiLwnZKiIixnc2NyOiLihIoiLGdzaW06IuKJsyIsZ3NpbWU6IuKqjiIsZ3NpbWw6IuKqkCIsR3Q6IuKJqyIsR1Q6Ij4iLGd0OiI+IixndGNjOiLiqqciLGd0Y2lyOiLiqboiLGd0ZG90OiLii5ciLGd0bFBhcjoi4qaVIixndHF1ZXN0OiLiqbwiLGd0cmFwcHJveDoi4qqGIixndHJhcnI6IuKluCIsZ3RyZG90OiLii5ciLGd0cmVxbGVzczoi4oubIixndHJlcXFsZXNzOiLiqowiLGd0cmxlc3M6IuKJtyIsZ3Ryc2ltOiLiibMiLGd2ZXJ0bmVxcToi4omp77iAIixndm5FOiLiianvuIAiLEhhY2VrOiLLhyIsaGFpcnNwOiLigIoiLGhhbGY6IsK9IixoYW1pbHQ6IuKEiyIsSEFSRGN5OiLQqiIsaGFyZGN5OiLRiiIsaEFycjoi4oeUIixoYXJyOiLihpQiLGhhcnJjaXI6IuKliCIsaGFycnc6IuKGrSIsSGF0OiJeIixoYmFyOiLihI8iLEhjaXJjOiLEpCIsaGNpcmM6IsSlIixoZWFydHM6IuKZpSIsaGVhcnRzdWl0OiLimaUiLGhlbGxpcDoi4oCmIixoZXJjb246IuKKuSIsSGZyOiLihIwiLGhmcjoi8J2UpSIsSGlsYmVydFNwYWNlOiLihIsiLGhrc2Vhcm93OiLipKUiLGhrc3dhcm93OiLipKYiLGhvYXJyOiLih78iLGhvbXRodDoi4oi7Iixob29rbGVmdGFycm93OiLihqkiLGhvb2tyaWdodGFycm93OiLihqoiLEhvcGY6IuKEjSIsaG9wZjoi8J2VmSIsaG9yYmFyOiLigJUiLEhvcml6b250YWxMaW5lOiLilIAiLEhzY3I6IuKEiyIsaHNjcjoi8J2SvSIsaHNsYXNoOiLihI8iLEhzdHJvazoixKYiLGhzdHJvazoixKciLEh1bXBEb3duSHVtcDoi4omOIixIdW1wRXF1YWw6IuKJjyIsaHlidWxsOiLigYMiLGh5cGhlbjoi4oCQIixJYWN1dGU6IsONIixpYWN1dGU6IsOtIixpYzoi4oGjIixJY2lyYzoiw44iLGljaXJjOiLDriIsSWN5OiLQmCIsaWN5OiLQuCIsSWRvdDoixLAiLElFY3k6ItCVIixpZWN5OiLQtSIsaWV4Y2w6IsKhIixpZmY6IuKHlCIsSWZyOiLihJEiLGlmcjoi8J2UpiIsSWdyYXZlOiLDjCIsaWdyYXZlOiLDrCIsaWk6IuKFiCIsaWlpaW50OiLiqIwiLGlpaW50OiLiiK0iLGlpbmZpbjoi4qecIixpaW90YToi4oSpIixJSmxpZzoixLIiLGlqbGlnOiLEsyIsSW06IuKEkSIsSW1hY3I6IsSqIixpbWFjcjoixKsiLGltYWdlOiLihJEiLEltYWdpbmFyeUk6IuKFiCIsaW1hZ2xpbmU6IuKEkCIsaW1hZ3BhcnQ6IuKEkSIsaW1hdGg6IsSxIixpbW9mOiLiirciLGltcGVkOiLGtSIsSW1wbGllczoi4oeSIixpbjoi4oiIIixpbmNhcmU6IuKEhSIsaW5maW46IuKIniIsaW5maW50aWU6IuKnnSIsaW5vZG90OiLEsSIsSW50OiLiiKwiLGludDoi4oirIixpbnRjYWw6IuKKuiIsaW50ZWdlcnM6IuKEpCIsSW50ZWdyYWw6IuKIqyIsaW50ZXJjYWw6IuKKuiIsSW50ZXJzZWN0aW9uOiLii4IiLGludGxhcmhrOiLiqJciLGludHByb2Q6IuKovCIsSW52aXNpYmxlQ29tbWE6IuKBoyIsSW52aXNpYmxlVGltZXM6IuKBoiIsSU9jeToi0IEiLGlvY3k6ItGRIixJb2dvbjoixK4iLGlvZ29uOiLEryIsSW9wZjoi8J2VgCIsaW9wZjoi8J2VmiIsSW90YToizpkiLGlvdGE6Is65IixpcHJvZDoi4qi8IixpcXVlc3Q6IsK/IixJc2NyOiLihJAiLGlzY3I6IvCdkr4iLGlzaW46IuKIiCIsaXNpbmRvdDoi4ou1Iixpc2luRToi4ou5Iixpc2luczoi4ou0Iixpc2luc3Y6IuKLsyIsaXNpbnY6IuKIiCIsaXQ6IuKBoiIsSXRpbGRlOiLEqCIsaXRpbGRlOiLEqSIsSXVrY3k6ItCGIixpdWtjeToi0ZYiLEl1bWw6IsOPIixpdW1sOiLDryIsSmNpcmM6IsS0IixqY2lyYzoixLUiLEpjeToi0JkiLGpjeToi0LkiLEpmcjoi8J2UjSIsamZyOiLwnZSnIixqbWF0aDoiyLciLEpvcGY6IvCdlYEiLGpvcGY6IvCdlZsiLEpzY3I6IvCdkqUiLGpzY3I6IvCdkr8iLEpzZXJjeToi0IgiLGpzZXJjeToi0ZgiLEp1a2N5OiLQhCIsanVrY3k6ItGUIixLYXBwYToizpoiLGthcHBhOiLOuiIsa2FwcGF2OiLPsCIsS2NlZGlsOiLEtiIsa2NlZGlsOiLEtyIsS2N5OiLQmiIsa2N5OiLQuiIsS2ZyOiLwnZSOIixrZnI6IvCdlKgiLGtncmVlbjoixLgiLEtIY3k6ItClIixraGN5OiLRhSIsS0pjeToi0IwiLGtqY3k6ItGcIixLb3BmOiLwnZWCIixrb3BmOiLwnZWcIixLc2NyOiLwnZKmIixrc2NyOiLwnZOAIixsQWFycjoi4oeaIixMYWN1dGU6IsS5IixsYWN1dGU6IsS6IixsYWVtcHR5djoi4qa0IixsYWdyYW46IuKEkiIsTGFtYmRhOiLOmyIsbGFtYmRhOiLOuyIsTGFuZzoi4p+qIixsYW5nOiLin6giLGxhbmdkOiLippEiLGxhbmdsZToi4p+oIixsYXA6IuKqhSIsTGFwbGFjZXRyZjoi4oSSIixsYXF1bzoiwqsiLExhcnI6IuKGniIsbEFycjoi4oeQIixsYXJyOiLihpAiLGxhcnJiOiLih6QiLGxhcnJiZnM6IuKknyIsbGFycmZzOiLipJ0iLGxhcnJoazoi4oapIixsYXJybHA6IuKGqyIsbGFycnBsOiLipLkiLGxhcnJzaW06IuKlsyIsbGFycnRsOiLihqIiLGxhdDoi4qqrIixsQXRhaWw6IuKkmyIsbGF0YWlsOiLipJkiLGxhdGU6IuKqrSIsbGF0ZXM6IuKqre+4gCIsbEJhcnI6IuKkjiIsbGJhcnI6IuKkjCIsbGJicms6IuKdsiIsbGJyYWNlOiJ7IixsYnJhY2s6IlsiLGxicmtlOiLiposiLGxicmtzbGQ6IuKmjyIsbGJya3NsdToi4qaNIixMY2Fyb246IsS9IixsY2Fyb246IsS+IixMY2VkaWw6IsS7IixsY2VkaWw6IsS8IixsY2VpbDoi4oyIIixsY3ViOiJ7IixMY3k6ItCbIixsY3k6ItC7IixsZGNhOiLipLYiLGxkcXVvOiLigJwiLGxkcXVvcjoi4oCeIixsZHJkaGFyOiLipaciLGxkcnVzaGFyOiLipYsiLGxkc2g6IuKGsiIsbEU6IuKJpiIsbGU6IuKJpCIsTGVmdEFuZ2xlQnJhY2tldDoi4p+oIixMZWZ0QXJyb3c6IuKGkCIsTGVmdGFycm93OiLih5AiLGxlZnRhcnJvdzoi4oaQIixMZWZ0QXJyb3dCYXI6IuKHpCIsTGVmdEFycm93UmlnaHRBcnJvdzoi4oeGIixsZWZ0YXJyb3d0YWlsOiLihqIiLExlZnRDZWlsaW5nOiLijIgiLExlZnREb3VibGVCcmFja2V0OiLin6YiLExlZnREb3duVGVlVmVjdG9yOiLipaEiLExlZnREb3duVmVjdG9yOiLih4MiLExlZnREb3duVmVjdG9yQmFyOiLipZkiLExlZnRGbG9vcjoi4oyKIixsZWZ0aGFycG9vbmRvd246IuKGvSIsbGVmdGhhcnBvb251cDoi4oa8IixsZWZ0bGVmdGFycm93czoi4oeHIixMZWZ0UmlnaHRBcnJvdzoi4oaUIixMZWZ0cmlnaHRhcnJvdzoi4oeUIixsZWZ0cmlnaHRhcnJvdzoi4oaUIixsZWZ0cmlnaHRhcnJvd3M6IuKHhiIsbGVmdHJpZ2h0aGFycG9vbnM6IuKHiyIsbGVmdHJpZ2h0c3F1aWdhcnJvdzoi4oatIixMZWZ0UmlnaHRWZWN0b3I6IuKljiIsTGVmdFRlZToi4oqjIixMZWZ0VGVlQXJyb3c6IuKGpCIsTGVmdFRlZVZlY3Rvcjoi4qWaIixsZWZ0dGhyZWV0aW1lczoi4ouLIixMZWZ0VHJpYW5nbGU6IuKKsiIsTGVmdFRyaWFuZ2xlQmFyOiLip48iLExlZnRUcmlhbmdsZUVxdWFsOiLiirQiLExlZnRVcERvd25WZWN0b3I6IuKlkSIsTGVmdFVwVGVlVmVjdG9yOiLipaAiLExlZnRVcFZlY3Rvcjoi4oa/IixMZWZ0VXBWZWN0b3JCYXI6IuKlmCIsTGVmdFZlY3Rvcjoi4oa8IixMZWZ0VmVjdG9yQmFyOiLipZIiLGxFZzoi4qqLIixsZWc6IuKLmiIsbGVxOiLiiaQiLGxlcXE6IuKJpiIsbGVxc2xhbnQ6IuKpvSIsbGVzOiLiqb0iLGxlc2NjOiLiqqgiLGxlc2RvdDoi4qm/IixsZXNkb3RvOiLiqoEiLGxlc2RvdG9yOiLiqoMiLGxlc2c6IuKLmu+4gCIsbGVzZ2VzOiLiqpMiLGxlc3NhcHByb3g6IuKqhSIsbGVzc2RvdDoi4ouWIixsZXNzZXFndHI6IuKLmiIsbGVzc2VxcWd0cjoi4qqLIixMZXNzRXF1YWxHcmVhdGVyOiLii5oiLExlc3NGdWxsRXF1YWw6IuKJpiIsTGVzc0dyZWF0ZXI6IuKJtiIsbGVzc2d0cjoi4om2IixMZXNzTGVzczoi4qqhIixsZXNzc2ltOiLiibIiLExlc3NTbGFudEVxdWFsOiLiqb0iLExlc3NUaWxkZToi4omyIixsZmlzaHQ6IuKlvCIsbGZsb29yOiLijIoiLExmcjoi8J2UjyIsbGZyOiLwnZSpIixsZzoi4om2IixsZ0U6IuKqkSIsbEhhcjoi4qWiIixsaGFyZDoi4oa9IixsaGFydToi4oa8IixsaGFydWw6IuKlqiIsbGhibGs6IuKWhCIsTEpjeToi0IkiLGxqY3k6ItGZIixMbDoi4ouYIixsbDoi4omqIixsbGFycjoi4oeHIixsbGNvcm5lcjoi4oyeIixMbGVmdGFycm93OiLih5oiLGxsaGFyZDoi4qWrIixsbHRyaToi4pe6IixMbWlkb3Q6IsS/IixsbWlkb3Q6IsWAIixsbW91c3Q6IuKOsCIsbG1vdXN0YWNoZToi4o6wIixsbmFwOiLiqokiLGxuYXBwcm94OiLiqokiLGxuRToi4omoIixsbmU6IuKqhyIsbG5lcToi4qqHIixsbmVxcToi4omoIixsbnNpbToi4oumIixsb2FuZzoi4p+sIixsb2Fycjoi4oe9Iixsb2Jyazoi4p+mIixMb25nTGVmdEFycm93OiLin7UiLExvbmdsZWZ0YXJyb3c6IuKfuCIsbG9uZ2xlZnRhcnJvdzoi4p+1IixMb25nTGVmdFJpZ2h0QXJyb3c6IuKftyIsTG9uZ2xlZnRyaWdodGFycm93OiLin7oiLGxvbmdsZWZ0cmlnaHRhcnJvdzoi4p+3Iixsb25nbWFwc3RvOiLin7wiLExvbmdSaWdodEFycm93OiLin7YiLExvbmdyaWdodGFycm93OiLin7kiLGxvbmdyaWdodGFycm93OiLin7YiLGxvb3BhcnJvd2xlZnQ6IuKGqyIsbG9vcGFycm93cmlnaHQ6IuKGrCIsbG9wYXI6IuKmhSIsTG9wZjoi8J2VgyIsbG9wZjoi8J2VnSIsbG9wbHVzOiLiqK0iLGxvdGltZXM6IuKotCIsbG93YXN0OiLiiJciLGxvd2JhcjoiXyIsTG93ZXJMZWZ0QXJyb3c6IuKGmSIsTG93ZXJSaWdodEFycm93OiLihpgiLGxvejoi4peKIixsb3plbmdlOiLil4oiLGxvemY6IuKnqyIsbHBhcjoiKCIsbHBhcmx0OiLippMiLGxyYXJyOiLih4YiLGxyY29ybmVyOiLijJ8iLGxyaGFyOiLih4siLGxyaGFyZDoi4qWtIixscm06IuKAjiIsbHJ0cmk6IuKKvyIsbHNhcXVvOiLigLkiLExzY3I6IuKEkiIsbHNjcjoi8J2TgSIsTHNoOiLihrAiLGxzaDoi4oawIixsc2ltOiLiibIiLGxzaW1lOiLiqo0iLGxzaW1nOiLiqo8iLGxzcWI6IlsiLGxzcXVvOiLigJgiLGxzcXVvcjoi4oCaIixMc3Ryb2s6IsWBIixsc3Ryb2s6IsWCIixMdDoi4omqIixMVDoiPCIsbHQ6IjwiLGx0Y2M6IuKqpiIsbHRjaXI6IuKpuSIsbHRkb3Q6IuKLliIsbHRocmVlOiLii4siLGx0aW1lczoi4ouJIixsdGxhcnI6IuKltiIsbHRxdWVzdDoi4qm7IixsdHJpOiLil4MiLGx0cmllOiLiirQiLGx0cmlmOiLil4IiLGx0clBhcjoi4qaWIixsdXJkc2hhcjoi4qWKIixsdXJ1aGFyOiLipaYiLGx2ZXJ0bmVxcToi4omo77iAIixsdm5FOiLiiajvuIAiLG1hY3I6IsKvIixtYWxlOiLimYIiLG1hbHQ6IuKcoCIsbWFsdGVzZToi4pygIixNYXA6IuKkhSIsbWFwOiLihqYiLG1hcHN0bzoi4oamIixtYXBzdG9kb3duOiLihqciLG1hcHN0b2xlZnQ6IuKGpCIsbWFwc3RvdXA6IuKGpSIsbWFya2VyOiLilq4iLG1jb21tYToi4qipIixNY3k6ItCcIixtY3k6ItC8IixtZGFzaDoi4oCUIixtRERvdDoi4oi6IixtZWFzdXJlZGFuZ2xlOiLiiKEiLE1lZGl1bVNwYWNlOiLigZ8iLE1lbGxpbnRyZjoi4oSzIixNZnI6IvCdlJAiLG1mcjoi8J2UqiIsbWhvOiLihKciLG1pY3JvOiLCtSIsbWlkOiLiiKMiLG1pZGFzdDoiKiIsbWlkY2lyOiLiq7AiLG1pZGRvdDoiwrciLG1pbnVzOiLiiJIiLG1pbnVzYjoi4oqfIixtaW51c2Q6IuKIuCIsbWludXNkdToi4qiqIixNaW51c1BsdXM6IuKIkyIsbWxjcDoi4qubIixtbGRyOiLigKYiLG1ucGx1czoi4oiTIixtb2RlbHM6IuKKpyIsTW9wZjoi8J2VhCIsbW9wZjoi8J2VniIsbXA6IuKIkyIsTXNjcjoi4oSzIixtc2NyOiLwnZOCIixtc3Rwb3M6IuKIviIsTXU6Is6cIixtdToizrwiLG11bHRpbWFwOiLiirgiLG11bWFwOiLiirgiLG5hYmxhOiLiiIciLE5hY3V0ZToixYMiLG5hY3V0ZToixYQiLG5hbmc6IuKIoOKDkiIsbmFwOiLiiYkiLG5hcEU6IuKpsMy4IixuYXBpZDoi4omLzLgiLG5hcG9zOiLFiSIsbmFwcHJveDoi4omJIixuYXR1cjoi4pmuIixuYXR1cmFsOiLima4iLG5hdHVyYWxzOiLihJUiLG5ic3A6IsKgIixuYnVtcDoi4omOzLgiLG5idW1wZToi4omPzLgiLG5jYXA6IuKpgyIsTmNhcm9uOiLFhyIsbmNhcm9uOiLFiCIsTmNlZGlsOiLFhSIsbmNlZGlsOiLFhiIsbmNvbmc6IuKJhyIsbmNvbmdkb3Q6IuKprcy4IixuY3VwOiLiqYIiLE5jeToi0J0iLG5jeToi0L0iLG5kYXNoOiLigJMiLG5lOiLiiaAiLG5lYXJoazoi4qSkIixuZUFycjoi4oeXIixuZWFycjoi4oaXIixuZWFycm93OiLihpciLG5lZG90OiLiiZDMuCIsTmVnYXRpdmVNZWRpdW1TcGFjZToi4oCLIixOZWdhdGl2ZVRoaWNrU3BhY2U6IuKAiyIsTmVnYXRpdmVUaGluU3BhY2U6IuKAiyIsTmVnYXRpdmVWZXJ5VGhpblNwYWNlOiLigIsiLG5lcXVpdjoi4omiIixuZXNlYXI6IuKkqCIsbmVzaW06IuKJgsy4IixOZXN0ZWRHcmVhdGVyR3JlYXRlcjoi4omrIixOZXN0ZWRMZXNzTGVzczoi4omqIixOZXdMaW5lOiJcbiIsbmV4aXN0OiLiiIQiLG5leGlzdHM6IuKIhCIsTmZyOiLwnZSRIixuZnI6IvCdlKsiLG5nRToi4omnzLgiLG5nZToi4omxIixuZ2VxOiLiibEiLG5nZXFxOiLiiafMuCIsbmdlcXNsYW50OiLiqb7MuCIsbmdlczoi4qm+zLgiLG5HZzoi4ouZzLgiLG5nc2ltOiLiibUiLG5HdDoi4omr4oOSIixuZ3Q6IuKJryIsbmd0cjoi4omvIixuR3R2OiLiiavMuCIsbmhBcnI6IuKHjiIsbmhhcnI6IuKGriIsbmhwYXI6IuKrsiIsbmk6IuKIiyIsbmlzOiLii7wiLG5pc2Q6IuKLuiIsbml2OiLiiIsiLE5KY3k6ItCKIixuamN5OiLRmiIsbmxBcnI6IuKHjSIsbmxhcnI6IuKGmiIsbmxkcjoi4oClIixubEU6IuKJpsy4IixubGU6IuKJsCIsbkxlZnRhcnJvdzoi4oeNIixubGVmdGFycm93OiLihpoiLG5MZWZ0cmlnaHRhcnJvdzoi4oeOIixubGVmdHJpZ2h0YXJyb3c6IuKGriIsbmxlcToi4omwIixubGVxcToi4ommzLgiLG5sZXFzbGFudDoi4qm9zLgiLG5sZXM6IuKpvcy4IixubGVzczoi4omuIixuTGw6IuKLmMy4IixubHNpbToi4om0IixuTHQ6IuKJquKDkiIsbmx0OiLiia4iLG5sdHJpOiLii6oiLG5sdHJpZToi4ousIixuTHR2OiLiiarMuCIsbm1pZDoi4oikIixOb0JyZWFrOiLigaAiLE5vbkJyZWFraW5nU3BhY2U6IsKgIixOb3BmOiLihJUiLG5vcGY6IvCdlZ8iLE5vdDoi4qusIixub3Q6IsKsIixOb3RDb25ncnVlbnQ6IuKJoiIsTm90Q3VwQ2FwOiLiia0iLE5vdERvdWJsZVZlcnRpY2FsQmFyOiLiiKYiLE5vdEVsZW1lbnQ6IuKIiSIsTm90RXF1YWw6IuKJoCIsTm90RXF1YWxUaWxkZToi4omCzLgiLE5vdEV4aXN0czoi4oiEIixOb3RHcmVhdGVyOiLiia8iLE5vdEdyZWF0ZXJFcXVhbDoi4omxIixOb3RHcmVhdGVyRnVsbEVxdWFsOiLiiafMuCIsTm90R3JlYXRlckdyZWF0ZXI6IuKJq8y4IixOb3RHcmVhdGVyTGVzczoi4om5IixOb3RHcmVhdGVyU2xhbnRFcXVhbDoi4qm+zLgiLE5vdEdyZWF0ZXJUaWxkZToi4om1IixOb3RIdW1wRG93bkh1bXA6IuKJjsy4IixOb3RIdW1wRXF1YWw6IuKJj8y4Iixub3Rpbjoi4oiJIixub3RpbmRvdDoi4ou1zLgiLG5vdGluRToi4ou5zLgiLG5vdGludmE6IuKIiSIsbm90aW52Yjoi4ou3Iixub3RpbnZjOiLii7YiLE5vdExlZnRUcmlhbmdsZToi4ouqIixOb3RMZWZ0VHJpYW5nbGVCYXI6IuKnj8y4IixOb3RMZWZ0VHJpYW5nbGVFcXVhbDoi4ousIixOb3RMZXNzOiLiia4iLE5vdExlc3NFcXVhbDoi4omwIixOb3RMZXNzR3JlYXRlcjoi4om4IixOb3RMZXNzTGVzczoi4omqzLgiLE5vdExlc3NTbGFudEVxdWFsOiLiqb3MuCIsTm90TGVzc1RpbGRlOiLiibQiLE5vdE5lc3RlZEdyZWF0ZXJHcmVhdGVyOiLiqqLMuCIsTm90TmVzdGVkTGVzc0xlc3M6IuKqocy4Iixub3RuaToi4oiMIixub3RuaXZhOiLiiIwiLG5vdG5pdmI6IuKLviIsbm90bml2Yzoi4ou9IixOb3RQcmVjZWRlczoi4oqAIixOb3RQcmVjZWRlc0VxdWFsOiLiqq/MuCIsTm90UHJlY2VkZXNTbGFudEVxdWFsOiLii6AiLE5vdFJldmVyc2VFbGVtZW50OiLiiIwiLE5vdFJpZ2h0VHJpYW5nbGU6IuKLqyIsTm90UmlnaHRUcmlhbmdsZUJhcjoi4qeQzLgiLE5vdFJpZ2h0VHJpYW5nbGVFcXVhbDoi4outIixOb3RTcXVhcmVTdWJzZXQ6IuKKj8y4IixOb3RTcXVhcmVTdWJzZXRFcXVhbDoi4ouiIixOb3RTcXVhcmVTdXBlcnNldDoi4oqQzLgiLE5vdFNxdWFyZVN1cGVyc2V0RXF1YWw6IuKLoyIsTm90U3Vic2V0OiLiioLig5IiLE5vdFN1YnNldEVxdWFsOiLiiogiLE5vdFN1Y2NlZWRzOiLiioEiLE5vdFN1Y2NlZWRzRXF1YWw6IuKqsMy4IixOb3RTdWNjZWVkc1NsYW50RXF1YWw6IuKLoSIsTm90U3VjY2VlZHNUaWxkZToi4om/zLgiLE5vdFN1cGVyc2V0OiLiioPig5IiLE5vdFN1cGVyc2V0RXF1YWw6IuKKiSIsTm90VGlsZGU6IuKJgSIsTm90VGlsZGVFcXVhbDoi4omEIixOb3RUaWxkZUZ1bGxFcXVhbDoi4omHIixOb3RUaWxkZVRpbGRlOiLiiYkiLE5vdFZlcnRpY2FsQmFyOiLiiKQiLG5wYXI6IuKIpiIsbnBhcmFsbGVsOiLiiKYiLG5wYXJzbDoi4qu94oOlIixucGFydDoi4oiCzLgiLG5wb2xpbnQ6IuKolCIsbnByOiLiioAiLG5wcmN1ZToi4ougIixucHJlOiLiqq/MuCIsbnByZWM6IuKKgCIsbnByZWNlcToi4qqvzLgiLG5yQXJyOiLih48iLG5yYXJyOiLihpsiLG5yYXJyYzoi4qSzzLgiLG5yYXJydzoi4oadzLgiLG5SaWdodGFycm93OiLih48iLG5yaWdodGFycm93OiLihpsiLG5ydHJpOiLii6siLG5ydHJpZToi4outIixuc2M6IuKKgSIsbnNjY3VlOiLii6EiLG5zY2U6IuKqsMy4IixOc2NyOiLwnZKpIixuc2NyOiLwnZODIixuc2hvcnRtaWQ6IuKIpCIsbnNob3J0cGFyYWxsZWw6IuKIpiIsbnNpbToi4omBIixuc2ltZToi4omEIixuc2ltZXE6IuKJhCIsbnNtaWQ6IuKIpCIsbnNwYXI6IuKIpiIsbnNxc3ViZToi4ouiIixuc3FzdXBlOiLii6MiLG5zdWI6IuKKhCIsbnN1YkU6IuKrhcy4Iixuc3ViZToi4oqIIixuc3Vic2V0OiLiioLig5IiLG5zdWJzZXRlcToi4oqIIixuc3Vic2V0ZXFxOiLiq4XMuCIsbnN1Y2M6IuKKgSIsbnN1Y2NlcToi4qqwzLgiLG5zdXA6IuKKhSIsbnN1cEU6IuKrhsy4Iixuc3VwZToi4oqJIixuc3Vwc2V0OiLiioPig5IiLG5zdXBzZXRlcToi4oqJIixuc3Vwc2V0ZXFxOiLiq4bMuCIsbnRnbDoi4om5IixOdGlsZGU6IsORIixudGlsZGU6IsOxIixudGxnOiLiibgiLG50cmlhbmdsZWxlZnQ6IuKLqiIsbnRyaWFuZ2xlbGVmdGVxOiLii6wiLG50cmlhbmdsZXJpZ2h0OiLii6siLG50cmlhbmdsZXJpZ2h0ZXE6IuKLrSIsTnU6Is6dIixudToizr0iLG51bToiIyIsbnVtZXJvOiLihJYiLG51bXNwOiLigIciLG52YXA6IuKJjeKDkiIsblZEYXNoOiLiiq8iLG5WZGFzaDoi4oquIixudkRhc2g6IuKKrSIsbnZkYXNoOiLiiqwiLG52Z2U6IuKJpeKDkiIsbnZndDoiPuKDkiIsbnZIYXJyOiLipIQiLG52aW5maW46IuKnniIsbnZsQXJyOiLipIIiLG52bGU6IuKJpOKDkiIsbnZsdDoiPOKDkiIsbnZsdHJpZToi4oq04oOSIixudnJBcnI6IuKkgyIsbnZydHJpZToi4oq14oOSIixudnNpbToi4oi84oOSIixud2FyaGs6IuKkoyIsbndBcnI6IuKHliIsbndhcnI6IuKGliIsbndhcnJvdzoi4oaWIixud25lYXI6IuKkpyIsT2FjdXRlOiLDkyIsb2FjdXRlOiLDsyIsb2FzdDoi4oqbIixvY2lyOiLiipoiLE9jaXJjOiLDlCIsb2NpcmM6IsO0IixPY3k6ItCeIixvY3k6ItC+IixvZGFzaDoi4oqdIixPZGJsYWM6IsWQIixvZGJsYWM6IsWRIixvZGl2OiLiqLgiLG9kb3Q6IuKKmSIsb2Rzb2xkOiLiprwiLE9FbGlnOiLFkiIsb2VsaWc6IsWTIixvZmNpcjoi4qa/IixPZnI6IvCdlJIiLG9mcjoi8J2UrCIsb2dvbjoiy5siLE9ncmF2ZToiw5IiLG9ncmF2ZToiw7IiLG9ndDoi4qeBIixvaGJhcjoi4qa1IixvaG06Is6pIixvaW50OiLiiK4iLG9sYXJyOiLihroiLG9sY2lyOiLipr4iLG9sY3Jvc3M6IuKmuyIsb2xpbmU6IuKAviIsb2x0OiLip4AiLE9tYWNyOiLFjCIsb21hY3I6IsWNIixPbWVnYToizqkiLG9tZWdhOiLPiSIsT21pY3Jvbjoizp8iLG9taWNyb246Is6/IixvbWlkOiLiprYiLG9taW51czoi4oqWIixPb3BmOiLwnZWGIixvb3BmOiLwnZWgIixvcGFyOiLiprciLE9wZW5DdXJseURvdWJsZVF1b3RlOiLigJwiLE9wZW5DdXJseVF1b3RlOiLigJgiLG9wZXJwOiLiprkiLG9wbHVzOiLiipUiLE9yOiLiqZQiLG9yOiLiiKgiLG9yYXJyOiLihrsiLG9yZDoi4qmdIixvcmRlcjoi4oS0IixvcmRlcm9mOiLihLQiLG9yZGY6IsKqIixvcmRtOiLCuiIsb3JpZ29mOiLiirYiLG9yb3I6IuKpliIsb3JzbG9wZToi4qmXIixvcnY6IuKpmyIsb1M6IuKTiCIsT3Njcjoi8J2SqiIsb3Njcjoi4oS0IixPc2xhc2g6IsOYIixvc2xhc2g6IsO4Iixvc29sOiLiipgiLE90aWxkZToiw5UiLG90aWxkZToiw7UiLE90aW1lczoi4qi3IixvdGltZXM6IuKKlyIsb3RpbWVzYXM6IuKotiIsT3VtbDoiw5YiLG91bWw6IsO2IixvdmJhcjoi4oy9IixPdmVyQmFyOiLigL4iLE92ZXJCcmFjZToi4o+eIixPdmVyQnJhY2tldDoi4o60IixPdmVyUGFyZW50aGVzaXM6IuKPnCIscGFyOiLiiKUiLHBhcmE6IsK2IixwYXJhbGxlbDoi4oilIixwYXJzaW06IuKrsyIscGFyc2w6IuKrvSIscGFydDoi4oiCIixQYXJ0aWFsRDoi4oiCIixQY3k6ItCfIixwY3k6ItC/IixwZXJjbnQ6IiUiLHBlcmlvZDoiLiIscGVybWlsOiLigLAiLHBlcnA6IuKKpSIscGVydGVuazoi4oCxIixQZnI6IvCdlJMiLHBmcjoi8J2UrSIsUGhpOiLOpiIscGhpOiLPhiIscGhpdjoiz5UiLHBobW1hdDoi4oSzIixwaG9uZToi4piOIixQaToizqAiLHBpOiLPgCIscGl0Y2hmb3JrOiLii5QiLHBpdjoiz5YiLHBsYW5jazoi4oSPIixwbGFuY2toOiLihI4iLHBsYW5rdjoi4oSPIixwbHVzOiIrIixwbHVzYWNpcjoi4qijIixwbHVzYjoi4oqeIixwbHVzY2lyOiLiqKIiLHBsdXNkbzoi4oiUIixwbHVzZHU6IuKopSIscGx1c2U6IuKpsiIsUGx1c01pbnVzOiLCsSIscGx1c21uOiLCsSIscGx1c3NpbToi4qimIixwbHVzdHdvOiLiqKciLHBtOiLCsSIsUG9pbmNhcmVwbGFuZToi4oSMIixwb2ludGludDoi4qiVIixQb3BmOiLihJkiLHBvcGY6IvCdlaEiLHBvdW5kOiLCoyIsUHI6IuKquyIscHI6IuKJuiIscHJhcDoi4qq3IixwcmN1ZToi4om8IixwckU6IuKqsyIscHJlOiLiqq8iLHByZWM6IuKJuiIscHJlY2FwcHJveDoi4qq3IixwcmVjY3VybHllcToi4om8IixQcmVjZWRlczoi4om6IixQcmVjZWRlc0VxdWFsOiLiqq8iLFByZWNlZGVzU2xhbnRFcXVhbDoi4om8IixQcmVjZWRlc1RpbGRlOiLiib4iLHByZWNlcToi4qqvIixwcmVjbmFwcHJveDoi4qq5IixwcmVjbmVxcToi4qq1IixwcmVjbnNpbToi4ouoIixwcmVjc2ltOiLiib4iLFByaW1lOiLigLMiLHByaW1lOiLigLIiLHByaW1lczoi4oSZIixwcm5hcDoi4qq5Iixwcm5FOiLiqrUiLHBybnNpbToi4ouoIixwcm9kOiLiiI8iLFByb2R1Y3Q6IuKIjyIscHJvZmFsYXI6IuKMriIscHJvZmxpbmU6IuKMkiIscHJvZnN1cmY6IuKMkyIscHJvcDoi4oidIixQcm9wb3J0aW9uOiLiiLciLFByb3BvcnRpb25hbDoi4oidIixwcm9wdG86IuKInSIscHJzaW06IuKJviIscHJ1cmVsOiLiirAiLFBzY3I6IvCdkqsiLHBzY3I6IvCdk4UiLFBzaToizqgiLHBzaToiz4giLHB1bmNzcDoi4oCIIixRZnI6IvCdlJQiLHFmcjoi8J2UriIscWludDoi4qiMIixRb3BmOiLihJoiLHFvcGY6IvCdlaIiLHFwcmltZToi4oGXIixRc2NyOiLwnZKsIixxc2NyOiLwnZOGIixxdWF0ZXJuaW9uczoi4oSNIixxdWF0aW50OiLiqJYiLHF1ZXN0OiI/IixxdWVzdGVxOiLiiZ8iLFFVT1Q6JyInLHF1b3Q6JyInLHJBYXJyOiLih5siLHJhY2U6IuKIvcyxIixSYWN1dGU6IsWUIixyYWN1dGU6IsWVIixyYWRpYzoi4oiaIixyYWVtcHR5djoi4qazIixSYW5nOiLin6siLHJhbmc6IuKfqSIscmFuZ2Q6IuKmkiIscmFuZ2U6IuKmpSIscmFuZ2xlOiLin6kiLHJhcXVvOiLCuyIsUmFycjoi4oagIixyQXJyOiLih5IiLHJhcnI6IuKGkiIscmFycmFwOiLipbUiLHJhcnJiOiLih6UiLHJhcnJiZnM6IuKkoCIscmFycmM6IuKksyIscmFycmZzOiLipJ4iLHJhcnJoazoi4oaqIixyYXJybHA6IuKGrCIscmFycnBsOiLipYUiLHJhcnJzaW06IuKltCIsUmFycnRsOiLipJYiLHJhcnJ0bDoi4oajIixyYXJydzoi4oadIixyQXRhaWw6IuKknCIscmF0YWlsOiLipJoiLHJhdGlvOiLiiLYiLHJhdGlvbmFsczoi4oSaIixSQmFycjoi4qSQIixyQmFycjoi4qSPIixyYmFycjoi4qSNIixyYmJyazoi4p2zIixyYnJhY2U6In0iLHJicmFjazoiXSIscmJya2U6IuKmjCIscmJya3NsZDoi4qaOIixyYnJrc2x1OiLippAiLFJjYXJvbjoixZgiLHJjYXJvbjoixZkiLFJjZWRpbDoixZYiLHJjZWRpbDoixZciLHJjZWlsOiLijIkiLHJjdWI6In0iLFJjeToi0KAiLHJjeToi0YAiLHJkY2E6IuKktyIscmRsZGhhcjoi4qWpIixyZHF1bzoi4oCdIixyZHF1b3I6IuKAnSIscmRzaDoi4oazIixSZToi4oScIixyZWFsOiLihJwiLHJlYWxpbmU6IuKEmyIscmVhbHBhcnQ6IuKEnCIscmVhbHM6IuKEnSIscmVjdDoi4patIixSRUc6IsKuIixyZWc6IsKuIixSZXZlcnNlRWxlbWVudDoi4oiLIixSZXZlcnNlRXF1aWxpYnJpdW06IuKHiyIsUmV2ZXJzZVVwRXF1aWxpYnJpdW06IuKlryIscmZpc2h0OiLipb0iLHJmbG9vcjoi4oyLIixSZnI6IuKEnCIscmZyOiLwnZSvIixySGFyOiLipaQiLHJoYXJkOiLih4EiLHJoYXJ1OiLih4AiLHJoYXJ1bDoi4qWsIixSaG86Is6hIixyaG86Is+BIixyaG92OiLPsSIsUmlnaHRBbmdsZUJyYWNrZXQ6IuKfqSIsUmlnaHRBcnJvdzoi4oaSIixSaWdodGFycm93OiLih5IiLHJpZ2h0YXJyb3c6IuKGkiIsUmlnaHRBcnJvd0Jhcjoi4oelIixSaWdodEFycm93TGVmdEFycm93OiLih4QiLHJpZ2h0YXJyb3d0YWlsOiLihqMiLFJpZ2h0Q2VpbGluZzoi4oyJIixSaWdodERvdWJsZUJyYWNrZXQ6IuKfpyIsUmlnaHREb3duVGVlVmVjdG9yOiLipZ0iLFJpZ2h0RG93blZlY3Rvcjoi4oeCIixSaWdodERvd25WZWN0b3JCYXI6IuKllSIsUmlnaHRGbG9vcjoi4oyLIixyaWdodGhhcnBvb25kb3duOiLih4EiLHJpZ2h0aGFycG9vbnVwOiLih4AiLHJpZ2h0bGVmdGFycm93czoi4oeEIixyaWdodGxlZnRoYXJwb29uczoi4oeMIixyaWdodHJpZ2h0YXJyb3dzOiLih4kiLHJpZ2h0c3F1aWdhcnJvdzoi4oadIixSaWdodFRlZToi4oqiIixSaWdodFRlZUFycm93OiLihqYiLFJpZ2h0VGVlVmVjdG9yOiLipZsiLHJpZ2h0dGhyZWV0aW1lczoi4ouMIixSaWdodFRyaWFuZ2xlOiLiirMiLFJpZ2h0VHJpYW5nbGVCYXI6IuKnkCIsUmlnaHRUcmlhbmdsZUVxdWFsOiLiirUiLFJpZ2h0VXBEb3duVmVjdG9yOiLipY8iLFJpZ2h0VXBUZWVWZWN0b3I6IuKlnCIsUmlnaHRVcFZlY3Rvcjoi4oa+IixSaWdodFVwVmVjdG9yQmFyOiLipZQiLFJpZ2h0VmVjdG9yOiLih4AiLFJpZ2h0VmVjdG9yQmFyOiLipZMiLHJpbmc6IsuaIixyaXNpbmdkb3RzZXE6IuKJkyIscmxhcnI6IuKHhCIscmxoYXI6IuKHjCIscmxtOiLigI8iLHJtb3VzdDoi4o6xIixybW91c3RhY2hlOiLijrEiLHJubWlkOiLiq64iLHJvYW5nOiLin60iLHJvYXJyOiLih74iLHJvYnJrOiLin6ciLHJvcGFyOiLipoYiLFJvcGY6IuKEnSIscm9wZjoi8J2VoyIscm9wbHVzOiLiqK4iLHJvdGltZXM6IuKotSIsUm91bmRJbXBsaWVzOiLipbAiLHJwYXI6IikiLHJwYXJndDoi4qaUIixycHBvbGludDoi4qiSIixycmFycjoi4oeJIixScmlnaHRhcnJvdzoi4oebIixyc2FxdW86IuKAuiIsUnNjcjoi4oSbIixyc2NyOiLwnZOHIixSc2g6IuKGsSIscnNoOiLihrEiLHJzcWI6Il0iLHJzcXVvOiLigJkiLHJzcXVvcjoi4oCZIixydGhyZWU6IuKLjCIscnRpbWVzOiLii4oiLHJ0cmk6IuKWuSIscnRyaWU6IuKKtSIscnRyaWY6IuKWuCIscnRyaWx0cmk6IuKnjiIsUnVsZURlbGF5ZWQ6IuKntCIscnVsdWhhcjoi4qWoIixyeDoi4oSeIixTYWN1dGU6IsWaIixzYWN1dGU6IsWbIixzYnF1bzoi4oCaIixTYzoi4qq8IixzYzoi4om7IixzY2FwOiLiqrgiLFNjYXJvbjoixaAiLHNjYXJvbjoixaEiLHNjY3VlOiLiib0iLHNjRToi4qq0IixzY2U6IuKqsCIsU2NlZGlsOiLFniIsc2NlZGlsOiLFnyIsU2NpcmM6IsWcIixzY2lyYzoixZ0iLHNjbmFwOiLiqroiLHNjbkU6IuKqtiIsc2Nuc2ltOiLii6kiLHNjcG9saW50OiLiqJMiLHNjc2ltOiLiib8iLFNjeToi0KEiLHNjeToi0YEiLHNkb3Q6IuKLhSIsc2RvdGI6IuKKoSIsc2RvdGU6IuKppiIsc2VhcmhrOiLipKUiLHNlQXJyOiLih5giLHNlYXJyOiLihpgiLHNlYXJyb3c6IuKGmCIsc2VjdDoiwqciLHNlbWk6IjsiLHNlc3dhcjoi4qSpIixzZXRtaW51czoi4oiWIixzZXRtbjoi4oiWIixzZXh0OiLinLYiLFNmcjoi8J2UliIsc2ZyOiLwnZSwIixzZnJvd246IuKMoiIsc2hhcnA6IuKZryIsU0hDSGN5OiLQqSIsc2hjaGN5OiLRiSIsU0hjeToi0KgiLHNoY3k6ItGIIixTaG9ydERvd25BcnJvdzoi4oaTIixTaG9ydExlZnRBcnJvdzoi4oaQIixzaG9ydG1pZDoi4oijIixzaG9ydHBhcmFsbGVsOiLiiKUiLFNob3J0UmlnaHRBcnJvdzoi4oaSIixTaG9ydFVwQXJyb3c6IuKGkSIsc2h5OiLCrSIsU2lnbWE6Is6jIixzaWdtYToiz4MiLHNpZ21hZjoiz4IiLHNpZ21hdjoiz4IiLHNpbToi4oi8IixzaW1kb3Q6IuKpqiIsc2ltZToi4omDIixzaW1lcToi4omDIixzaW1nOiLiqp4iLHNpbWdFOiLiqqAiLHNpbWw6IuKqnSIsc2ltbEU6IuKqnyIsc2ltbmU6IuKJhiIsc2ltcGx1czoi4qikIixzaW1yYXJyOiLipbIiLHNsYXJyOiLihpAiLFNtYWxsQ2lyY2xlOiLiiJgiLHNtYWxsc2V0bWludXM6IuKIliIsc21hc2hwOiLiqLMiLHNtZXBhcnNsOiLip6QiLHNtaWQ6IuKIoyIsc21pbGU6IuKMoyIsc210OiLiqqoiLHNtdGU6IuKqrCIsc210ZXM6IuKqrO+4gCIsU09GVGN5OiLQrCIsc29mdGN5OiLRjCIsc29sOiIvIixzb2xiOiLip4QiLHNvbGJhcjoi4oy/IixTb3BmOiLwnZWKIixzb3BmOiLwnZWkIixzcGFkZXM6IuKZoCIsc3BhZGVzdWl0OiLimaAiLHNwYXI6IuKIpSIsc3FjYXA6IuKKkyIsc3FjYXBzOiLiipPvuIAiLHNxY3VwOiLiipQiLHNxY3Vwczoi4oqU77iAIixTcXJ0OiLiiJoiLHNxc3ViOiLiio8iLHNxc3ViZToi4oqRIixzcXN1YnNldDoi4oqPIixzcXN1YnNldGVxOiLiipEiLHNxc3VwOiLiipAiLHNxc3VwZToi4oqSIixzcXN1cHNldDoi4oqQIixzcXN1cHNldGVxOiLiipIiLHNxdToi4pahIixTcXVhcmU6IuKWoSIsc3F1YXJlOiLilqEiLFNxdWFyZUludGVyc2VjdGlvbjoi4oqTIixTcXVhcmVTdWJzZXQ6IuKKjyIsU3F1YXJlU3Vic2V0RXF1YWw6IuKKkSIsU3F1YXJlU3VwZXJzZXQ6IuKKkCIsU3F1YXJlU3VwZXJzZXRFcXVhbDoi4oqSIixTcXVhcmVVbmlvbjoi4oqUIixzcXVhcmY6IuKWqiIsc3F1Zjoi4paqIixzcmFycjoi4oaSIixTc2NyOiLwnZKuIixzc2NyOiLwnZOIIixzc2V0bW46IuKIliIsc3NtaWxlOiLijKMiLHNzdGFyZjoi4ouGIixTdGFyOiLii4YiLHN0YXI6IuKYhiIsc3RhcmY6IuKYhSIsc3RyYWlnaHRlcHNpbG9uOiLPtSIsc3RyYWlnaHRwaGk6Is+VIixzdHJuczoiwq8iLFN1Yjoi4ouQIixzdWI6IuKKgiIsc3ViZG90OiLiqr0iLHN1YkU6IuKrhSIsc3ViZToi4oqGIixzdWJlZG90OiLiq4MiLHN1Ym11bHQ6IuKrgSIsc3VibkU6IuKriyIsc3VibmU6IuKKiiIsc3VicGx1czoi4qq/IixzdWJyYXJyOiLipbkiLFN1YnNldDoi4ouQIixzdWJzZXQ6IuKKgiIsc3Vic2V0ZXE6IuKKhiIsc3Vic2V0ZXFxOiLiq4UiLFN1YnNldEVxdWFsOiLiioYiLHN1YnNldG5lcToi4oqKIixzdWJzZXRuZXFxOiLiq4siLHN1YnNpbToi4quHIixzdWJzdWI6IuKrlSIsc3Vic3VwOiLiq5MiLHN1Y2M6IuKJuyIsc3VjY2FwcHJveDoi4qq4IixzdWNjY3VybHllcToi4om9IixTdWNjZWVkczoi4om7IixTdWNjZWVkc0VxdWFsOiLiqrAiLFN1Y2NlZWRzU2xhbnRFcXVhbDoi4om9IixTdWNjZWVkc1RpbGRlOiLiib8iLHN1Y2NlcToi4qqwIixzdWNjbmFwcHJveDoi4qq6IixzdWNjbmVxcToi4qq2IixzdWNjbnNpbToi4oupIixzdWNjc2ltOiLiib8iLFN1Y2hUaGF0OiLiiIsiLFN1bToi4oiRIixzdW06IuKIkSIsc3VuZzoi4pmqIixTdXA6IuKLkSIsc3VwOiLiioMiLHN1cDE6IsK5IixzdXAyOiLCsiIsc3VwMzoiwrMiLHN1cGRvdDoi4qq+IixzdXBkc3ViOiLiq5giLHN1cEU6IuKrhiIsc3VwZToi4oqHIixzdXBlZG90OiLiq4QiLFN1cGVyc2V0OiLiioMiLFN1cGVyc2V0RXF1YWw6IuKKhyIsc3VwaHNvbDoi4p+JIixzdXBoc3ViOiLiq5ciLHN1cGxhcnI6IuKluyIsc3VwbXVsdDoi4quCIixzdXBuRToi4quMIixzdXBuZToi4oqLIixzdXBwbHVzOiLiq4AiLFN1cHNldDoi4ouRIixzdXBzZXQ6IuKKgyIsc3Vwc2V0ZXE6IuKKhyIsc3Vwc2V0ZXFxOiLiq4YiLHN1cHNldG5lcToi4oqLIixzdXBzZXRuZXFxOiLiq4wiLHN1cHNpbToi4quIIixzdXBzdWI6IuKrlCIsc3Vwc3VwOiLiq5YiLHN3YXJoazoi4qSmIixzd0Fycjoi4oeZIixzd2Fycjoi4oaZIixzd2Fycm93OiLihpkiLHN3bndhcjoi4qSqIixzemxpZzoiw58iLFRhYjoiXHQiLHRhcmdldDoi4oyWIixUYXU6Is6kIix0YXU6Is+EIix0YnJrOiLijrQiLFRjYXJvbjoixaQiLHRjYXJvbjoixaUiLFRjZWRpbDoixaIiLHRjZWRpbDoixaMiLFRjeToi0KIiLHRjeToi0YIiLHRkb3Q6IuKDmyIsdGVscmVjOiLijJUiLFRmcjoi8J2UlyIsdGZyOiLwnZSxIix0aGVyZTQ6IuKItCIsVGhlcmVmb3JlOiLiiLQiLHRoZXJlZm9yZToi4oi0IixUaGV0YToizpgiLHRoZXRhOiLOuCIsdGhldGFzeW06Is+RIix0aGV0YXY6Is+RIix0aGlja2FwcHJveDoi4omIIix0aGlja3NpbToi4oi8IixUaGlja1NwYWNlOiLigZ/igIoiLHRoaW5zcDoi4oCJIixUaGluU3BhY2U6IuKAiSIsdGhrYXA6IuKJiCIsdGhrc2ltOiLiiLwiLFRIT1JOOiLDniIsdGhvcm46IsO+IixUaWxkZToi4oi8Iix0aWxkZToiy5wiLFRpbGRlRXF1YWw6IuKJgyIsVGlsZGVGdWxsRXF1YWw6IuKJhSIsVGlsZGVUaWxkZToi4omIIix0aW1lczoiw5ciLHRpbWVzYjoi4oqgIix0aW1lc2Jhcjoi4qixIix0aW1lc2Q6IuKosCIsdGludDoi4oitIix0b2VhOiLipKgiLHRvcDoi4oqkIix0b3Bib3Q6IuKMtiIsdG9wY2lyOiLiq7EiLFRvcGY6IvCdlYsiLHRvcGY6IvCdlaUiLHRvcGZvcms6IuKrmiIsdG9zYToi4qSpIix0cHJpbWU6IuKAtCIsVFJBREU6IuKEoiIsdHJhZGU6IuKEoiIsdHJpYW5nbGU6IuKWtSIsdHJpYW5nbGVkb3duOiLilr8iLHRyaWFuZ2xlbGVmdDoi4peDIix0cmlhbmdsZWxlZnRlcToi4oq0Iix0cmlhbmdsZXE6IuKJnCIsdHJpYW5nbGVyaWdodDoi4pa5Iix0cmlhbmdsZXJpZ2h0ZXE6IuKKtSIsdHJpZG90OiLil6wiLHRyaWU6IuKJnCIsdHJpbWludXM6IuKouiIsVHJpcGxlRG90OiLig5siLHRyaXBsdXM6IuKouSIsdHJpc2I6IuKnjSIsdHJpdGltZToi4qi7Iix0cnBleml1bToi4o+iIixUc2NyOiLwnZKvIix0c2NyOiLwnZOJIixUU2N5OiLQpiIsdHNjeToi0YYiLFRTSGN5OiLQiyIsdHNoY3k6ItGbIixUc3Ryb2s6IsWmIix0c3Ryb2s6IsWnIix0d2l4dDoi4omsIix0d29oZWFkbGVmdGFycm93OiLihp4iLHR3b2hlYWRyaWdodGFycm93OiLihqAiLFVhY3V0ZToiw5oiLHVhY3V0ZToiw7oiLFVhcnI6IuKGnyIsdUFycjoi4oeRIix1YXJyOiLihpEiLFVhcnJvY2lyOiLipYkiLFVicmN5OiLQjiIsdWJyY3k6ItGeIixVYnJldmU6IsWsIix1YnJldmU6IsWtIixVY2lyYzoiw5siLHVjaXJjOiLDuyIsVWN5OiLQoyIsdWN5OiLRgyIsdWRhcnI6IuKHhSIsVWRibGFjOiLFsCIsdWRibGFjOiLFsSIsdWRoYXI6IuKlriIsdWZpc2h0OiLipb4iLFVmcjoi8J2UmCIsdWZyOiLwnZSyIixVZ3JhdmU6IsOZIix1Z3JhdmU6IsO5Iix1SGFyOiLipaMiLHVoYXJsOiLihr8iLHVoYXJyOiLihr4iLHVoYmxrOiLiloAiLHVsY29ybjoi4oycIix1bGNvcm5lcjoi4oycIix1bGNyb3A6IuKMjyIsdWx0cmk6IuKXuCIsVW1hY3I6IsWqIix1bWFjcjoixasiLHVtbDoiwqgiLFVuZGVyQmFyOiJfIixVbmRlckJyYWNlOiLij58iLFVuZGVyQnJhY2tldDoi4o61IixVbmRlclBhcmVudGhlc2lzOiLij50iLFVuaW9uOiLii4MiLFVuaW9uUGx1czoi4oqOIixVb2dvbjoixbIiLHVvZ29uOiLFsyIsVW9wZjoi8J2VjCIsdW9wZjoi8J2VpiIsVXBBcnJvdzoi4oaRIixVcGFycm93OiLih5EiLHVwYXJyb3c6IuKGkSIsVXBBcnJvd0Jhcjoi4qSSIixVcEFycm93RG93bkFycm93OiLih4UiLFVwRG93bkFycm93OiLihpUiLFVwZG93bmFycm93OiLih5UiLHVwZG93bmFycm93OiLihpUiLFVwRXF1aWxpYnJpdW06IuKlriIsdXBoYXJwb29ubGVmdDoi4oa/Iix1cGhhcnBvb25yaWdodDoi4oa+Iix1cGx1czoi4oqOIixVcHBlckxlZnRBcnJvdzoi4oaWIixVcHBlclJpZ2h0QXJyb3c6IuKGlyIsVXBzaToiz5IiLHVwc2k6Is+FIix1cHNpaDoiz5IiLFVwc2lsb246Is6lIix1cHNpbG9uOiLPhSIsVXBUZWU6IuKKpSIsVXBUZWVBcnJvdzoi4oalIix1cHVwYXJyb3dzOiLih4giLHVyY29ybjoi4oydIix1cmNvcm5lcjoi4oydIix1cmNyb3A6IuKMjiIsVXJpbmc6IsWuIix1cmluZzoixa8iLHVydHJpOiLil7kiLFVzY3I6IvCdkrAiLHVzY3I6IvCdk4oiLHV0ZG90OiLii7AiLFV0aWxkZToixagiLHV0aWxkZToixakiLHV0cmk6IuKWtSIsdXRyaWY6IuKWtCIsdXVhcnI6IuKHiCIsVXVtbDoiw5wiLHV1bWw6IsO8Iix1d2FuZ2xlOiLipqciLHZhbmdydDoi4qacIix2YXJlcHNpbG9uOiLPtSIsdmFya2FwcGE6Is+wIix2YXJub3RoaW5nOiLiiIUiLHZhcnBoaToiz5UiLHZhcnBpOiLPliIsdmFycHJvcHRvOiLiiJ0iLHZBcnI6IuKHlSIsdmFycjoi4oaVIix2YXJyaG86Is+xIix2YXJzaWdtYToiz4IiLHZhcnN1YnNldG5lcToi4oqK77iAIix2YXJzdWJzZXRuZXFxOiLiq4vvuIAiLHZhcnN1cHNldG5lcToi4oqL77iAIix2YXJzdXBzZXRuZXFxOiLiq4zvuIAiLHZhcnRoZXRhOiLPkSIsdmFydHJpYW5nbGVsZWZ0OiLiirIiLHZhcnRyaWFuZ2xlcmlnaHQ6IuKKsyIsVmJhcjoi4qurIix2QmFyOiLiq6giLHZCYXJ2OiLiq6kiLFZjeToi0JIiLHZjeToi0LIiLFZEYXNoOiLiiqsiLFZkYXNoOiLiiqkiLHZEYXNoOiLiiqgiLHZkYXNoOiLiiqIiLFZkYXNobDoi4qumIixWZWU6IuKLgSIsdmVlOiLiiKgiLHZlZWJhcjoi4oq7Iix2ZWVlcToi4omaIix2ZWxsaXA6IuKLriIsVmVyYmFyOiLigJYiLHZlcmJhcjoifCIsVmVydDoi4oCWIix2ZXJ0OiJ8IixWZXJ0aWNhbEJhcjoi4oijIixWZXJ0aWNhbExpbmU6InwiLFZlcnRpY2FsU2VwYXJhdG9yOiLinZgiLFZlcnRpY2FsVGlsZGU6IuKJgCIsVmVyeVRoaW5TcGFjZToi4oCKIixWZnI6IvCdlJkiLHZmcjoi8J2UsyIsdmx0cmk6IuKKsiIsdm5zdWI6IuKKguKDkiIsdm5zdXA6IuKKg+KDkiIsVm9wZjoi8J2VjSIsdm9wZjoi8J2VpyIsdnByb3A6IuKInSIsdnJ0cmk6IuKKsyIsVnNjcjoi8J2SsSIsdnNjcjoi8J2TiyIsdnN1Ym5FOiLiq4vvuIAiLHZzdWJuZToi4oqK77iAIix2c3VwbkU6IuKrjO+4gCIsdnN1cG5lOiLiiovvuIAiLFZ2ZGFzaDoi4oqqIix2emlnemFnOiLippoiLFdjaXJjOiLFtCIsd2NpcmM6IsW1Iix3ZWRiYXI6IuKpnyIsV2VkZ2U6IuKLgCIsd2VkZ2U6IuKIpyIsd2VkZ2VxOiLiiZkiLHdlaWVycDoi4oSYIixXZnI6IvCdlJoiLHdmcjoi8J2UtCIsV29wZjoi8J2VjiIsd29wZjoi8J2VqCIsd3A6IuKEmCIsd3I6IuKJgCIsd3JlYXRoOiLiiYAiLFdzY3I6IvCdkrIiLHdzY3I6IvCdk4wiLHhjYXA6IuKLgiIseGNpcmM6IuKXryIseGN1cDoi4ouDIix4ZHRyaToi4pa9IixYZnI6IvCdlJsiLHhmcjoi8J2UtSIseGhBcnI6IuKfuiIseGhhcnI6IuKftyIsWGk6Is6eIix4aToizr4iLHhsQXJyOiLin7giLHhsYXJyOiLin7UiLHhtYXA6IuKfvCIseG5pczoi4ou7Iix4b2RvdDoi4qiAIixYb3BmOiLwnZWPIix4b3BmOiLwnZWpIix4b3BsdXM6IuKogSIseG90aW1lOiLiqIIiLHhyQXJyOiLin7kiLHhyYXJyOiLin7YiLFhzY3I6IvCdkrMiLHhzY3I6IvCdk40iLHhzcWN1cDoi4qiGIix4dXBsdXM6IuKohCIseHV0cmk6IuKWsyIseHZlZToi4ouBIix4d2VkZ2U6IuKLgCIsWWFjdXRlOiLDnSIseWFjdXRlOiLDvSIsWUFjeToi0K8iLHlhY3k6ItGPIixZY2lyYzoixbYiLHljaXJjOiLFtyIsWWN5OiLQqyIseWN5OiLRiyIseWVuOiLCpSIsWWZyOiLwnZScIix5ZnI6IvCdlLYiLFlJY3k6ItCHIix5aWN5OiLRlyIsWW9wZjoi8J2VkCIseW9wZjoi8J2VqiIsWXNjcjoi8J2StCIseXNjcjoi8J2TjiIsWVVjeToi0K4iLHl1Y3k6ItGOIixZdW1sOiLFuCIseXVtbDoiw78iLFphY3V0ZToixbkiLHphY3V0ZToixboiLFpjYXJvbjoixb0iLHpjYXJvbjoixb4iLFpjeToi0JciLHpjeToi0LciLFpkb3Q6IsW7Iix6ZG90OiLFvCIsemVldHJmOiLihKgiLFplcm9XaWR0aFNwYWNlOiLigIsiLFpldGE6Is6WIix6ZXRhOiLOtiIsWmZyOiLihKgiLHpmcjoi8J2UtyIsWkhjeToi0JYiLHpoY3k6ItC2Iix6aWdyYXJyOiLih50iLFpvcGY6IuKEpCIsem9wZjoi8J2VqyIsWnNjcjoi8J2StSIsenNjcjoi8J2TjyIsendqOiLigI0iLHp3bmo6IuKAjCJ9KSxlLmVudGl0eU1hcD1lLkhUTUxfRU5USVRJRVN9KGdzKTt2YXIgbXM9e30sYnM9WG8uTkFNRVNQQUNFLHlzPS9bQS1aX2Etelx4QzAtXHhENlx4RDgtXHhGNlx1MDBGOC1cdTAyRkZcdTAzNzAtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwNzAtXHUyMThGXHUyQzAwLVx1MkZFRlx1MzAwMS1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZGRF0vLHZzPW5ldyBSZWdFeHAoIltcXC1cXC4wLTkiK3lzLnNvdXJjZS5zbGljZSgxLC0xKSsiXFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MF0iKSx4cz1uZXcgUmVnRXhwKCJeIit5cy5zb3VyY2UrdnMuc291cmNlKyIqKD86OiIreXMuc291cmNlK3ZzLnNvdXJjZSsiKik/JCIpLERzPTAsVHM9MSx3cz0yLF9zPTMsRXM9NCxVcz01LEFzPTYsa3M9NztmdW5jdGlvbiBTcyhlLHQpe3RoaXMubWVzc2FnZT1lLHRoaXMubG9jYXRvcj10LEVycm9yLmNhcHR1cmVTdGFja1RyYWNlJiZFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLFNzKX1mdW5jdGlvbiBDcygpe31mdW5jdGlvbiBGcyhlLHQpe3JldHVybiB0LmxpbmVOdW1iZXI9ZS5saW5lTnVtYmVyLHQuY29sdW1uTnVtYmVyPWUuY29sdW1uTnVtYmVyLHR9ZnVuY3Rpb24gT3MoZSx0LG4scixpLGEpe2Z1bmN0aW9uIG8oZSx0LHIpe24uYXR0cmlidXRlTmFtZXMuaGFzT3duUHJvcGVydHkoZSkmJmEuZmF0YWxFcnJvcigiQXR0cmlidXRlICIrZSsiIHJlZGVmaW5lZCIpLG4uYWRkVmFsdWUoZSx0LnJlcGxhY2UoL1tcdFxuXHJdL2csIiAiKS5yZXBsYWNlKC8mIz9cdys7L2csaSkscil9Zm9yKHZhciBjLHM9Kyt0LGw9RHM7Oyl7dmFyIHU9ZS5jaGFyQXQocyk7c3dpdGNoKHUpe2Nhc2UiPSI6aWYobD09PVRzKWM9ZS5zbGljZSh0LHMpLGw9X3M7ZWxzZXtpZihsIT09d3MpdGhyb3cgbmV3IEVycm9yKCJhdHRyaWJ1dGUgZXF1YWwgbXVzdCBhZnRlciBhdHRyTmFtZSIpO2w9X3N9YnJlYWs7Y2FzZSInIjpjYXNlJyInOmlmKGw9PT1fc3x8bD09PVRzKXtpZihsPT09VHMmJihhLndhcm5pbmcoJ2F0dHJpYnV0ZSB2YWx1ZSBtdXN0IGFmdGVyICI9IicpLGM9ZS5zbGljZSh0LHMpKSx0PXMrMSwhKChzPWUuaW5kZXhPZih1LHQpKT4wKSl0aHJvdyBuZXcgRXJyb3IoImF0dHJpYnV0ZSB2YWx1ZSBubyBlbmQgJyIrdSsiJyBtYXRjaCIpO28oYyxmPWUuc2xpY2UodCxzKSx0LTEpLGw9VXN9ZWxzZXtpZihsIT1Fcyl0aHJvdyBuZXcgRXJyb3IoJ2F0dHJpYnV0ZSB2YWx1ZSBtdXN0IGFmdGVyICI9IicpO28oYyxmPWUuc2xpY2UodCxzKSx0KSxhLndhcm5pbmcoJ2F0dHJpYnV0ZSAiJytjKyciIG1pc3NlZCBzdGFydCBxdW90KCcrdSsiKSEhIiksdD1zKzEsbD1Vc31icmVhaztjYXNlIi8iOnN3aXRjaChsKXtjYXNlIERzOm4uc2V0VGFnTmFtZShlLnNsaWNlKHQscykpO2Nhc2UgVXM6Y2FzZSBBczpjYXNlIGtzOmw9a3Msbi5jbG9zZWQ9ITA7Y2FzZSBFczpjYXNlIFRzOmJyZWFrO2Nhc2Ugd3M6bi5jbG9zZWQ9ITA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImF0dHJpYnV0ZSBpbnZhbGlkIGNsb3NlIGNoYXIoJy8nKSIpfWJyZWFrO2Nhc2UiIjpyZXR1cm4gYS5lcnJvcigidW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKSxsPT1EcyYmbi5zZXRUYWdOYW1lKGUuc2xpY2UodCxzKSkscztjYXNlIj4iOnN3aXRjaChsKXtjYXNlIERzOm4uc2V0VGFnTmFtZShlLnNsaWNlKHQscykpO2Nhc2UgVXM6Y2FzZSBBczpjYXNlIGtzOmJyZWFrO2Nhc2UgRXM6Y2FzZSBUczoiLyI9PT0oZj1lLnNsaWNlKHQscykpLnNsaWNlKC0xKSYmKG4uY2xvc2VkPSEwLGY9Zi5zbGljZSgwLC0xKSk7Y2FzZSB3czpsPT09d3MmJihmPWMpLGw9PUVzPyhhLndhcm5pbmcoJ2F0dHJpYnV0ZSAiJytmKyciIG1pc3NlZCBxdW90KCIpIScpLG8oYyxmLHQpKTooYnMuaXNIVE1MKHJbIiJdKSYmZi5tYXRjaCgvXig/OmRpc2FibGVkfGNoZWNrZWR8c2VsZWN0ZWQpJC9pKXx8YS53YXJuaW5nKCdhdHRyaWJ1dGUgIicrZisnIiBtaXNzZWQgdmFsdWUhISAiJytmKyciIGluc3RlYWQhIScpLG8oZixmLHQpKTticmVhaztjYXNlIF9zOnRocm93IG5ldyBFcnJvcigiYXR0cmlidXRlIHZhbHVlIG1pc3NlZCEhIil9cmV0dXJuIHM7Y2FzZSLCgCI6dT0iICI7ZGVmYXVsdDppZih1PD0iICIpc3dpdGNoKGwpe2Nhc2UgRHM6bi5zZXRUYWdOYW1lKGUuc2xpY2UodCxzKSksbD1BczticmVhaztjYXNlIFRzOmM9ZS5zbGljZSh0LHMpLGw9d3M7YnJlYWs7Y2FzZSBFczp2YXIgZj1lLnNsaWNlKHQscyk7YS53YXJuaW5nKCdhdHRyaWJ1dGUgIicrZisnIiBtaXNzZWQgcXVvdCgiKSEhJyksbyhjLGYsdCk7Y2FzZSBVczpsPUFzfWVsc2Ugc3dpdGNoKGwpe2Nhc2Ugd3M6bi50YWdOYW1lLGJzLmlzSFRNTChyWyIiXSkmJmMubWF0Y2goL14oPzpkaXNhYmxlZHxjaGVja2VkfHNlbGVjdGVkKSQvaSl8fGEud2FybmluZygnYXR0cmlidXRlICInK2MrJyIgbWlzc2VkIHZhbHVlISEgIicrYysnIiBpbnN0ZWFkMiEhJyksbyhjLGMsdCksdD1zLGw9VHM7YnJlYWs7Y2FzZSBVczphLndhcm5pbmcoJ2F0dHJpYnV0ZSBzcGFjZSBpcyByZXF1aXJlZCInK2MrJyIhIScpO2Nhc2UgQXM6bD1Ucyx0PXM7YnJlYWs7Y2FzZSBfczpsPUVzLHQ9czticmVhaztjYXNlIGtzOnRocm93IG5ldyBFcnJvcigiZWxlbWVudHMgY2xvc2VkIGNoYXJhY3RlciAnLycgYW5kICc+JyBtdXN0IGJlIGNvbm5lY3RlZCB0byIpfX1zKyt9fWZ1bmN0aW9uIElzKGUsdCxuKXtmb3IodmFyIHI9ZS50YWdOYW1lLGk9bnVsbCxhPWUubGVuZ3RoO2EtLTspe3ZhciBvPWVbYV0sYz1vLnFOYW1lLHM9by52YWx1ZTtpZigoZD1jLmluZGV4T2YoIjoiKSk+MCl2YXIgbD1vLnByZWZpeD1jLnNsaWNlKDAsZCksdT1jLnNsaWNlKGQrMSksZj0ieG1sbnMiPT09bCYmdTtlbHNlIHU9YyxsPW51bGwsZj0ieG1sbnMiPT09YyYmIiI7by5sb2NhbE5hbWU9dSwhMSE9PWYmJihudWxsPT1pJiYoaT17fSxQcyhuLG49e30pKSxuW2ZdPWlbZl09cyxvLnVyaT1icy5YTUxOUyx0LnN0YXJ0UHJlZml4TWFwcGluZyhmLHMpKX1mb3IoYT1lLmxlbmd0aDthLS07KXsobD0obz1lW2FdKS5wcmVmaXgpJiYoInhtbCI9PT1sJiYoby51cmk9YnMuWE1MKSwieG1sbnMiIT09bCYmKG8udXJpPW5bbHx8IiJdKSl9dmFyIGQ7KGQ9ci5pbmRleE9mKCI6IikpPjA/KGw9ZS5wcmVmaXg9ci5zbGljZSgwLGQpLHU9ZS5sb2NhbE5hbWU9ci5zbGljZShkKzEpKToobD1udWxsLHU9ZS5sb2NhbE5hbWU9cik7dmFyIGg9ZS51cmk9bltsfHwiIl07aWYodC5zdGFydEVsZW1lbnQoaCx1LHIsZSksIWUuY2xvc2VkKXJldHVybiBlLmN1cnJlbnROU01hcD1uLGUubG9jYWxOU01hcD1pLCEwO2lmKHQuZW5kRWxlbWVudChoLHUsciksaSlmb3IobCBpbiBpKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLGwpJiZ0LmVuZFByZWZpeE1hcHBpbmcobCl9ZnVuY3Rpb24gUnMoZSx0LG4scixpKXtpZigvXig/OnNjcmlwdHx0ZXh0YXJlYSkkL2kudGVzdChuKSl7dmFyIGE9ZS5pbmRleE9mKCI8LyIrbisiPiIsdCksbz1lLnN1YnN0cmluZyh0KzEsYSk7aWYoL1smPF0vLnRlc3QobykpcmV0dXJuL15zY3JpcHQkL2kudGVzdChuKT8oaS5jaGFyYWN0ZXJzKG8sMCxvLmxlbmd0aCksYSk6KG89by5yZXBsYWNlKC8mIz9cdys7L2csciksaS5jaGFyYWN0ZXJzKG8sMCxvLmxlbmd0aCksYSl9cmV0dXJuIHQrMX1mdW5jdGlvbiBOcyhlLHQsbixyKXt2YXIgaT1yW25dO3JldHVybiBudWxsPT1pJiYoKGk9ZS5sYXN0SW5kZXhPZigiPC8iK24rIj4iKSk8dCYmKGk9ZS5sYXN0SW5kZXhPZigiPC8iK24pKSxyW25dPWkpLGk8dH1mdW5jdGlvbiBQcyhlLHQpe2Zvcih2YXIgbiBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiYodFtuXT1lW25dKX1mdW5jdGlvbiBCcyhlLHQsbixyKXtpZigiLSI9PT1lLmNoYXJBdCh0KzIpKXJldHVybiItIj09PWUuY2hhckF0KHQrMyk/KGk9ZS5pbmRleE9mKCItLVx4M2UiLHQrNCkpPnQ/KG4uY29tbWVudChlLHQrNCxpLXQtNCksaSszKTooci5lcnJvcigiVW5jbG9zZWQgY29tbWVudCIpLC0xKTotMTtpZigiQ0RBVEFbIj09ZS5zdWJzdHIodCszLDYpKXt2YXIgaT1lLmluZGV4T2YoIl1dPiIsdCs5KTtyZXR1cm4gbi5zdGFydENEQVRBKCksbi5jaGFyYWN0ZXJzKGUsdCs5LGktdC05KSxuLmVuZENEQVRBKCksaSszfXZhciBhPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPS8nW14nXSsnfCJbXiJdKyJ8W15cczw+XC89XSs9P3woXC8/XHMqPnw8KS9nO2kubGFzdEluZGV4PXQsaS5leGVjKGUpO2Zvcig7bj1pLmV4ZWMoZSk7KWlmKHIucHVzaChuKSxuWzFdKXJldHVybiByfShlLHQpLG89YS5sZW5ndGg7aWYobz4xJiYvIWRvY3R5cGUvaS50ZXN0KGFbMF1bMF0pKXt2YXIgYz1hWzFdWzBdLHM9ITEsbD0hMTtvPjMmJigvXnB1YmxpYyQvaS50ZXN0KGFbMl1bMF0pPyhzPWFbM11bMF0sbD1vPjQmJmFbNF1bMF0pOi9ec3lzdGVtJC9pLnRlc3QoYVsyXVswXSkmJihsPWFbM11bMF0pKTt2YXIgdT1hW28tMV07cmV0dXJuIG4uc3RhcnREVEQoYyxzLGwpLG4uZW5kRFREKCksdS5pbmRleCt1WzBdLmxlbmd0aH1yZXR1cm4tMX1mdW5jdGlvbiBXcyhlLHQsbil7dmFyIHI9ZS5pbmRleE9mKCI/PiIsdCk7aWYocil7dmFyIGk9ZS5zdWJzdHJpbmcodCxyKS5tYXRjaCgvXjxcPyhcUyopXHMqKFtcc1xTXSo/KVxzKiQvKTtyZXR1cm4gaT8oaVswXS5sZW5ndGgsbi5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oaVsxXSxpWzJdKSxyKzIpOi0xfXJldHVybi0xfWZ1bmN0aW9uIExzKCl7dGhpcy5hdHRyaWJ1dGVOYW1lcz17fX1Tcy5wcm90b3R5cGU9bmV3IEVycm9yLFNzLnByb3RvdHlwZS5uYW1lPVNzLm5hbWUsQ3MucHJvdG90eXBlPXtwYXJzZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5kb21CdWlsZGVyO3Iuc3RhcnREb2N1bWVudCgpLFBzKHQsdD17fSksZnVuY3Rpb24oZSx0LG4scixpKXtmdW5jdGlvbiBhKGUpe2lmKGU+NjU1MzUpe3ZhciB0PTU1Mjk2KygoZS09NjU1MzYpPj4xMCksbj01NjMyMCsoMTAyMyZlKTtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0LG4pfXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUpfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9ZS5zbGljZSgxLC0xKTtyZXR1cm4gT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobix0KT9uW3RdOiIjIj09PXQuY2hhckF0KDApP2EocGFyc2VJbnQodC5zdWJzdHIoMSkucmVwbGFjZSgieCIsIjB4IikpKTooaS5lcnJvcigiZW50aXR5IG5vdCBmb3VuZDoiK2UpLGUpfWZ1bmN0aW9uIGModCl7aWYodD5nKXt2YXIgbj1lLnN1YnN0cmluZyhnLHQpLnJlcGxhY2UoLyYjP1x3KzsvZyxvKTtkJiZzKGcpLHIuY2hhcmFjdGVycyhuLDAsdC1nKSxnPXR9fWZ1bmN0aW9uIHModCxuKXtmb3IoO3Q+PXUmJihuPWYuZXhlYyhlKSk7KWw9bi5pbmRleCx1PWwrblswXS5sZW5ndGgsZC5saW5lTnVtYmVyKys7ZC5jb2x1bW5OdW1iZXI9dC1sKzF9dmFyIGw9MCx1PTAsZj0vLiooPzpcclxuP3xcbil8LiokL2csZD1yLmxvY2F0b3IsaD1be2N1cnJlbnROU01hcDp0fV0scD17fSxnPTA7Zm9yKDs7KXt0cnl7dmFyIG09ZS5pbmRleE9mKCI8IixnKTtpZihtPDApe2lmKCFlLnN1YnN0cihnKS5tYXRjaCgvXlxzKiQvKSl7dmFyIGI9ci5kb2MseT1iLmNyZWF0ZVRleHROb2RlKGUuc3Vic3RyKGcpKTtiLmFwcGVuZENoaWxkKHkpLHIuY3VycmVudEVsZW1lbnQ9eX1yZXR1cm59c3dpdGNoKG0+ZyYmYyhtKSxlLmNoYXJBdChtKzEpKXtjYXNlIi8iOnZhciB2PWUuaW5kZXhPZigiPiIsbSszKSx4PWUuc3Vic3RyaW5nKG0rMix2KS5yZXBsYWNlKC9bIFx0XG5ccl0rJC9nLCIiKSxEPWgucG9wKCk7djwwPyh4PWUuc3Vic3RyaW5nKG0rMikucmVwbGFjZSgvW1xzPF0uKi8sIiIpLGkuZXJyb3IoImVuZCB0YWcgbmFtZTogIit4KyIgaXMgbm90IGNvbXBsZXRlOiIrRC50YWdOYW1lKSx2PW0rMSt4Lmxlbmd0aCk6eC5tYXRjaCgvXHM8LykmJih4PXgucmVwbGFjZSgvW1xzPF0uKi8sIiIpLGkuZXJyb3IoImVuZCB0YWcgbmFtZTogIit4KyIgbWF5YmUgbm90IGNvbXBsZXRlIiksdj1tKzEreC5sZW5ndGgpO3ZhciBUPUQubG9jYWxOU01hcCx3PUQudGFnTmFtZT09eDtpZih3fHxELnRhZ05hbWUmJkQudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT14LnRvTG93ZXJDYXNlKCkpe2lmKHIuZW5kRWxlbWVudChELnVyaSxELmxvY2FsTmFtZSx4KSxUKWZvcih2YXIgXyBpbiBUKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChULF8pJiZyLmVuZFByZWZpeE1hcHBpbmcoXyk7d3x8aS5mYXRhbEVycm9yKCJlbmQgdGFnIG5hbWU6ICIreCsiIGlzIG5vdCBtYXRjaCB0aGUgY3VycmVudCBzdGFydCB0YWdOYW1lOiIrRC50YWdOYW1lKX1lbHNlIGgucHVzaChEKTt2Kys7YnJlYWs7Y2FzZSI/IjpkJiZzKG0pLHY9V3MoZSxtLHIpO2JyZWFrO2Nhc2UiISI6ZCYmcyhtKSx2PUJzKGUsbSxyLGkpO2JyZWFrO2RlZmF1bHQ6ZCYmcyhtKTt2YXIgRT1uZXcgTHMsVT1oW2gubGVuZ3RoLTFdLmN1cnJlbnROU01hcCxBPSh2PU9zKGUsbSxFLFUsbyxpKSxFLmxlbmd0aCk7aWYoIUUuY2xvc2VkJiZOcyhlLHYsRS50YWdOYW1lLHApJiYoRS5jbG9zZWQ9ITAsbi5uYnNwfHxpLndhcm5pbmcoInVuY2xvc2VkIHhtbCBhdHRyaWJ1dGUiKSksZCYmQSl7Zm9yKHZhciBrPUZzKGQse30pLFM9MDtTPEE7UysrKXt2YXIgQz1FW1NdO3MoQy5vZmZzZXQpLEMubG9jYXRvcj1GcyhkLHt9KX1yLmxvY2F0b3I9ayxJcyhFLHIsVSkmJmgucHVzaChFKSxyLmxvY2F0b3I9ZH1lbHNlIElzKEUscixVKSYmaC5wdXNoKEUpO2JzLmlzSFRNTChFLnVyaSkmJiFFLmNsb3NlZD92PVJzKGUsdixFLnRhZ05hbWUsbyxyKTp2Kyt9fWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBTcyl0aHJvdyBlO2kuZXJyb3IoImVsZW1lbnQgcGFyc2UgZXJyb3I6ICIrZSksdj0tMX12Pmc/Zz12OmMoTWF0aC5tYXgobSxnKSsxKX19KGUsdCxuLHIsdGhpcy5lcnJvckhhbmRsZXIpLHIuZW5kRG9jdW1lbnQoKX19LExzLnByb3RvdHlwZT17c2V0VGFnTmFtZTpmdW5jdGlvbihlKXtpZigheHMudGVzdChlKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgdGFnTmFtZToiK2UpO3RoaXMudGFnTmFtZT1lfSxhZGRWYWx1ZTpmdW5jdGlvbihlLHQsbil7aWYoIXhzLnRlc3QoZSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGF0dHJpYnV0ZToiK2UpO3RoaXMuYXR0cmlidXRlTmFtZXNbZV09dGhpcy5sZW5ndGgsdGhpc1t0aGlzLmxlbmd0aCsrXT17cU5hbWU6ZSx2YWx1ZTp0LG9mZnNldDpufX0sbGVuZ3RoOjAsZ2V0TG9jYWxOYW1lOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzW2VdLmxvY2FsTmFtZX0sZ2V0TG9jYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpc1tlXS5sb2NhdG9yfSxnZXRRTmFtZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpc1tlXS5xTmFtZX0sZ2V0VVJJOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzW2VdLnVyaX0sZ2V0VmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXNbZV0udmFsdWV9fSxtcy5YTUxSZWFkZXI9Q3MsbXMuUGFyc2VFcnJvcj1Tczt2YXIgTXM9WG8sanM9Z3MsenM9bXMsSHM9R28uRE9NSW1wbGVtZW50YXRpb24sVnM9TXMuTkFNRVNQQUNFLHFzPXpzLlBhcnNlRXJyb3IsR3M9enMuWE1MUmVhZGVyO2Z1bmN0aW9uIFhzKGUpe3JldHVybiBlLnJlcGxhY2UoL1xyW1xuXHUwMDg1XS9nLCJcbiIpLnJlcGxhY2UoL1tcclx1MDA4NVx1MjAyOF0vZywiXG4iKX1mdW5jdGlvbiAkcyhlKXt0aGlzLm9wdGlvbnM9ZXx8e2xvY2F0b3I6e319fWZ1bmN0aW9uIFlzKCl7dGhpcy5jZGF0YT0hMX1mdW5jdGlvbiBLcyhlLHQpe3QubGluZU51bWJlcj1lLmxpbmVOdW1iZXIsdC5jb2x1bW5OdW1iZXI9ZS5jb2x1bW5OdW1iZXJ9ZnVuY3Rpb24gWnMoZSl7aWYoZSlyZXR1cm4iXG5AIisoZS5zeXN0ZW1JZHx8IiIpKyIjW2xpbmU6IitlLmxpbmVOdW1iZXIrIixjb2w6IitlLmNvbHVtbk51bWJlcisiXSJ9ZnVuY3Rpb24gSnMoZSx0LG4pe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9lLnN1YnN0cih0LG4pOmUubGVuZ3RoPj10K258fHQ/bmV3IGphdmEubGFuZy5TdHJpbmcoZSx0LG4pKyIiOmV9ZnVuY3Rpb24gUXMoZSx0KXtlLmN1cnJlbnRFbGVtZW50P2UuY3VycmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodCk6ZS5kb2MuYXBwZW5kQ2hpbGQodCl9JHMucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMub3B0aW9ucyxyPW5ldyBHcyxpPW4uZG9tQnVpbGRlcnx8bmV3IFlzLGE9bi5lcnJvckhhbmRsZXIsbz1uLmxvY2F0b3IsYz1uLnhtbG5zfHx7fSxzPS9cL3g/aHRtbD8kLy50ZXN0KHQpLGw9cz9qcy5IVE1MX0VOVElUSUVTOmpzLlhNTF9FTlRJVElFUztvJiZpLnNldERvY3VtZW50TG9jYXRvcihvKSxyLmVycm9ySGFuZGxlcj1mdW5jdGlvbihlLHQsbil7aWYoIWUpe2lmKHQgaW5zdGFuY2VvZiBZcylyZXR1cm4gdDtlPXR9dmFyIHI9e30saT1lIGluc3RhbmNlb2YgRnVuY3Rpb247ZnVuY3Rpb24gYSh0KXt2YXIgYT1lW3RdOyFhJiZpJiYoYT0yPT1lLmxlbmd0aD9mdW5jdGlvbihuKXtlKHQsbil9OmUpLHJbdF09YSYmZnVuY3Rpb24oZSl7YSgiW3htbGRvbSAiK3QrIl1cdCIrZStacyhuKSl9fHxmdW5jdGlvbigpe319cmV0dXJuIG49bnx8e30sYSgid2FybmluZyIpLGEoImVycm9yIiksYSgiZmF0YWxFcnJvciIpLHJ9KGEsaSxvKSxyLmRvbUJ1aWxkZXI9bi5kb21CdWlsZGVyfHxpLHMmJihjWyIiXT1Wcy5IVE1MKSxjLnhtbD1jLnhtbHx8VnMuWE1MO3ZhciB1PW4ubm9ybWFsaXplTGluZUVuZGluZ3N8fFhzO3JldHVybiBlJiYic3RyaW5nIj09dHlwZW9mIGU/ci5wYXJzZSh1KGUpLGMsbCk6ci5lcnJvckhhbmRsZXIuZXJyb3IoImludmFsaWQgZG9jIHNvdXJjZSIpLGkuZG9jfSxZcy5wcm90b3R5cGU9e3N0YXJ0RG9jdW1lbnQ6ZnVuY3Rpb24oKXt0aGlzLmRvYz0obmV3IEhzKS5jcmVhdGVEb2N1bWVudChudWxsLG51bGwsbnVsbCksdGhpcy5sb2NhdG9yJiYodGhpcy5kb2MuZG9jdW1lbnRVUkk9dGhpcy5sb2NhdG9yLnN5c3RlbUlkKX0sc3RhcnRFbGVtZW50OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuZG9jLGE9aS5jcmVhdGVFbGVtZW50TlMoZSxufHx0KSxvPXIubGVuZ3RoO1FzKHRoaXMsYSksdGhpcy5jdXJyZW50RWxlbWVudD1hLHRoaXMubG9jYXRvciYmS3ModGhpcy5sb2NhdG9yLGEpO2Zvcih2YXIgYz0wO2M8bztjKyspe2U9ci5nZXRVUkkoYyk7dmFyIHM9ci5nZXRWYWx1ZShjKSxsPShuPXIuZ2V0UU5hbWUoYyksaS5jcmVhdGVBdHRyaWJ1dGVOUyhlLG4pKTt0aGlzLmxvY2F0b3ImJktzKHIuZ2V0TG9jYXRvcihjKSxsKSxsLnZhbHVlPWwubm9kZVZhbHVlPXMsYS5zZXRBdHRyaWJ1dGVOb2RlKGwpfX0sZW5kRWxlbWVudDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5jdXJyZW50RWxlbWVudDtyLnRhZ05hbWUsdGhpcy5jdXJyZW50RWxlbWVudD1yLnBhcmVudE5vZGV9LHN0YXJ0UHJlZml4TWFwcGluZzpmdW5jdGlvbihlLHQpe30sZW5kUHJlZml4TWFwcGluZzpmdW5jdGlvbihlKXt9LHByb2Nlc3NpbmdJbnN0cnVjdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZG9jLmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihlLHQpO3RoaXMubG9jYXRvciYmS3ModGhpcy5sb2NhdG9yLG4pLFFzKHRoaXMsbil9LGlnbm9yYWJsZVdoaXRlc3BhY2U6ZnVuY3Rpb24oZSx0LG4pe30sY2hhcmFjdGVyczpmdW5jdGlvbihlLHQsbil7aWYoZT1Kcy5hcHBseSh0aGlzLGFyZ3VtZW50cykpe2lmKHRoaXMuY2RhdGEpdmFyIHI9dGhpcy5kb2MuY3JlYXRlQ0RBVEFTZWN0aW9uKGUpO2Vsc2Ugcj10aGlzLmRvYy5jcmVhdGVUZXh0Tm9kZShlKTt0aGlzLmN1cnJlbnRFbGVtZW50P3RoaXMuY3VycmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocik6L15ccyokLy50ZXN0KGUpJiZ0aGlzLmRvYy5hcHBlbmRDaGlsZChyKSx0aGlzLmxvY2F0b3ImJktzKHRoaXMubG9jYXRvcixyKX19LHNraXBwZWRFbnRpdHk6ZnVuY3Rpb24oZSl7fSxlbmREb2N1bWVudDpmdW5jdGlvbigpe3RoaXMuZG9jLm5vcm1hbGl6ZSgpfSxzZXREb2N1bWVudExvY2F0b3I6ZnVuY3Rpb24oZSl7KHRoaXMubG9jYXRvcj1lKSYmKGUubGluZU51bWJlcj0wKX0sY29tbWVudDpmdW5jdGlvbihlLHQsbil7ZT1Kcy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHI9dGhpcy5kb2MuY3JlYXRlQ29tbWVudChlKTt0aGlzLmxvY2F0b3ImJktzKHRoaXMubG9jYXRvcixyKSxRcyh0aGlzLHIpfSxzdGFydENEQVRBOmZ1bmN0aW9uKCl7dGhpcy5jZGF0YT0hMH0sZW5kQ0RBVEE6ZnVuY3Rpb24oKXt0aGlzLmNkYXRhPSExfSxzdGFydERURDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5kb2MuaW1wbGVtZW50YXRpb247aWYociYmci5jcmVhdGVEb2N1bWVudFR5cGUpe3ZhciBpPXIuY3JlYXRlRG9jdW1lbnRUeXBlKGUsdCxuKTt0aGlzLmxvY2F0b3ImJktzKHRoaXMubG9jYXRvcixpKSxRcyh0aGlzLGkpLHRoaXMuZG9jLmRvY3R5cGU9aX19LHdhcm5pbmc6ZnVuY3Rpb24oZSl7Y29uc29sZS53YXJuKCJbeG1sZG9tIHdhcm5pbmddXHQiK2UsWnModGhpcy5sb2NhdG9yKSl9LGVycm9yOmZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoIlt4bWxkb20gZXJyb3JdXHQiK2UsWnModGhpcy5sb2NhdG9yKSl9LGZhdGFsRXJyb3I6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IHFzKGUsdGhpcy5sb2NhdG9yKX19LCJlbmREVEQsc3RhcnRFbnRpdHksZW5kRW50aXR5LGF0dHJpYnV0ZURlY2wsZWxlbWVudERlY2wsZXh0ZXJuYWxFbnRpdHlEZWNsLGludGVybmFsRW50aXR5RGVjbCxyZXNvbHZlRW50aXR5LGdldEV4dGVybmFsU3Vic2V0LG5vdGF0aW9uRGVjbCx1bnBhcnNlZEVudGl0eURlY2wiLnJlcGxhY2UoL1x3Ky9nLChmdW5jdGlvbihlKXtZcy5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH19KSkscHMuX19ET01IYW5kbGVyPVlzLHBzLm5vcm1hbGl6ZUxpbmVFbmRpbmdzPVhzLHBzLkRPTVBhcnNlcj0kczt2YXIgZWw9R287cW8uRE9NSW1wbGVtZW50YXRpb249ZWwuRE9NSW1wbGVtZW50YXRpb24scW8uWE1MU2VyaWFsaXplcj1lbC5YTUxTZXJpYWxpemVyLHFvLkRPTVBhcnNlcj1wcy5ET01QYXJzZXI7dmFyIHRsPXFvLG5sPUdvO1ZvLnBhcnNlRnJvbVN0cmluZz1mdW5jdGlvbihlKXt2YXIgdD1udWxsLG49bmV3IHRsLkRPTVBhcnNlcih7ZXJyb3JIYW5kbGVyOmZ1bmN0aW9uKGUsbil7dD17bGV2ZWw6ZSxtZXNzYWdlOm59fX0pLnBhcnNlRnJvbVN0cmluZyhlKTtpZihudWxsPT09dClyZXR1cm4gbjt0aHJvdyBuZXcgRXJyb3IodC5sZXZlbCsiOiAiK3QubWVzc2FnZSl9LFZvLk5vZGU9bmwuTm9kZTt2YXIgcmw9bmksaWw9THIsYWw9Vm8sb2w9Qm8sY2w9b2wuRWxlbWVudDtIby5yZWFkU3RyaW5nPWZ1bmN0aW9uKGUsdCl7dD10fHx7fTt0cnl7dmFyIG49YWwucGFyc2VGcm9tU3RyaW5nKGUsInRleHQveG1sIil9Y2F0Y2goZSl7cmV0dXJuIHJsLnJlamVjdChlKX1pZigicGFyc2VyZXJyb3IiPT09bi5kb2N1bWVudEVsZW1lbnQudGFnTmFtZSlyZXR1cm4gcmwucmVzb2x2ZShuZXcgRXJyb3Iobi5kb2N1bWVudEVsZW1lbnQudGV4dENvbnRlbnQpKTtmdW5jdGlvbiByKGUpe3N3aXRjaChlLm5vZGVUeXBlKXtjYXNlIHNsLkVMRU1FTlRfTk9ERTpyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9aShlKSxuPVtdO2lsLmZvckVhY2goZS5jaGlsZE5vZGVzLChmdW5jdGlvbihlKXt2YXIgdD1yKGUpO3QmJm4ucHVzaCh0KX0pKTt2YXIgYT17fTtyZXR1cm4gaWwuZm9yRWFjaChlLmF0dHJpYnV0ZXMsKGZ1bmN0aW9uKGUpe2FbaShlKV09ZS52YWx1ZX0pKSxuZXcgY2wodCxhLG4pfShlKTtjYXNlIHNsLlRFWFRfTk9ERTpyZXR1cm4gb2wudGV4dChlLm5vZGVWYWx1ZSl9fWZ1bmN0aW9uIGkoZSl7aWYoZS5uYW1lc3BhY2VVUkkpe3ZhciBuPXRbZS5uYW1lc3BhY2VVUkldO3JldHVybihuP24rIjoiOiJ7IitlLm5hbWVzcGFjZVVSSSsifSIpK2UubG9jYWxOYW1lfXJldHVybiBlLmxvY2FsTmFtZX1yZXR1cm4gcmwucmVzb2x2ZShyKG4uZG9jdW1lbnRFbGVtZW50KSl9O3ZhciBzbD1hbC5Ob2RlO3ZhciBsbCx1bD17fSxmbD17fSxkbD17fTtmdW5jdGlvbiBobCgpe3JldHVybiBsbHx8KGxsPTEsZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLGEsbyxjPVtdLnNsaWNlLHM9e30uaGFzT3duUHJvcGVydHk7ZT1mdW5jdGlvbigpe3ZhciBlLHQsbixyLGEsbztpZihvPWFyZ3VtZW50c1swXSxhPTI8PWFyZ3VtZW50cy5sZW5ndGg/Yy5jYWxsKGFyZ3VtZW50cywxKTpbXSxpKE9iamVjdC5hc3NpZ24pKU9iamVjdC5hc3NpZ24uYXBwbHkobnVsbCxhcmd1bWVudHMpO2Vsc2UgZm9yKGU9MCxuPWEubGVuZ3RoO2U8bjtlKyspaWYobnVsbCE9KHI9YVtlXSkpZm9yKHQgaW4gcilzLmNhbGwocix0KSYmKG9bdF09clt0XSk7cmV0dXJuIG99LGk9ZnVuY3Rpb24oZSl7cmV0dXJuISFlJiYiW29iamVjdCBGdW5jdGlvbl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfSxhPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiEhZSYmKCJmdW5jdGlvbiI9PSh0PXR5cGVvZiBlKXx8Im9iamVjdCI9PT10KX0sbj1mdW5jdGlvbihlKXtyZXR1cm4gaShBcnJheS5pc0FycmF5KT9BcnJheS5pc0FycmF5KGUpOiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9LHI9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYobihlKSlyZXR1cm4hZS5sZW5ndGg7Zm9yKHQgaW4gZSlpZihzLmNhbGwoZSx0KSlyZXR1cm4hMTtyZXR1cm4hMH0sbz1mdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiBhKGUpJiYobj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpJiYodD1uLmNvbnN0cnVjdG9yKSYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQgaW5zdGFuY2VvZiB0JiZGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KT09PUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKE9iamVjdCl9LHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZS52YWx1ZU9mKT9lLnZhbHVlT2YoKTplfSxkbC5hc3NpZ249ZSxkbC5pc0Z1bmN0aW9uPWksZGwuaXNPYmplY3Q9YSxkbC5pc0FycmF5PW4sZGwuaXNFbXB0eT1yLGRsLmlzUGxhaW5PYmplY3Q9byxkbC5nZXRWYWx1ZT10fS5jYWxsKFEpKSxkbH12YXIgcGwsZ2wsbWw9e30sYmw9e2dldCBleHBvcnRzKCl7cmV0dXJuIG1sfSxzZXQgZXhwb3J0cyhlKXttbD1lfX0seWw9e30sdmw9e2dldCBleHBvcnRzKCl7cmV0dXJuIHlsfSxzZXQgZXhwb3J0cyhlKXt5bD1lfX0seGw9e30sRGw9e2dldCBleHBvcnRzKCl7cmV0dXJuIHhsfSxzZXQgZXhwb3J0cyhlKXt4bD1lfX0sVGw9e30sd2w9e2dldCBleHBvcnRzKCl7cmV0dXJuIFRsfSxzZXQgZXhwb3J0cyhlKXtUbD1lfX07ZnVuY3Rpb24gX2woKXtyZXR1cm4gcGx8fChwbD0xLGZ1bmN0aW9uKCl7d2wuZXhwb3J0cz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LG4pe2lmKHRoaXMub3B0aW9ucz1lLm9wdGlvbnMsdGhpcy5zdHJpbmdpZnk9ZS5zdHJpbmdpZnksdGhpcy5wYXJlbnQ9ZSxudWxsPT10KXRocm93IG5ldyBFcnJvcigiTWlzc2luZyBhdHRyaWJ1dGUgbmFtZS4gIit0aGlzLmRlYnVnSW5mbyh0KSk7aWYobnVsbD09bil0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgYXR0cmlidXRlIHZhbHVlLiAiK3RoaXMuZGVidWdJbmZvKHQpKTt0aGlzLm5hbWU9dGhpcy5zdHJpbmdpZnkuYXR0TmFtZSh0KSx0aGlzLnZhbHVlPXRoaXMuc3RyaW5naWZ5LmF0dFZhbHVlKG4pfXJldHVybiBlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpfSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5zZXQoZSkuYXR0cmlidXRlKHRoaXMpfSxlLnByb3RvdHlwZS5kZWJ1Z0luZm89ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PShlPWV8fHRoaXMubmFtZSk/InBhcmVudDogPCIrdGhpcy5wYXJlbnQubmFtZSsiPiI6ImF0dHJpYnV0ZTogeyIrZSsifSwgcGFyZW50OiA8Iit0aGlzLnBhcmVudC5uYW1lKyI+In0sZX0oKX0uY2FsbChRKSksVGx9ZnVuY3Rpb24gRWwoKXtyZXR1cm4gZ2x8fChnbD0xLGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxhLG89e30uaGFzT3duUHJvcGVydHk7YT1obCgpLGk9YS5pc09iamVjdCxyPWEuaXNGdW5jdGlvbixuPWEuZ2V0VmFsdWUsdD1EdSgpLGU9X2woKSxEbC5leHBvcnRzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGEoZSx0LG4pe2lmKGEuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxlKSxudWxsPT10KXRocm93IG5ldyBFcnJvcigiTWlzc2luZyBlbGVtZW50IG5hbWUuICIrdGhpcy5kZWJ1Z0luZm8oKSk7dGhpcy5uYW1lPXRoaXMuc3RyaW5naWZ5LmVsZU5hbWUodCksdGhpcy5hdHRyaWJ1dGVzPXt9LG51bGwhPW4mJnRoaXMuYXR0cmlidXRlKG4pLGUuaXNEb2N1bWVudCYmKHRoaXMuaXNSb290PSEwLHRoaXMuZG9jdW1lbnRPYmplY3Q9ZSxlLnJvb3RPYmplY3Q9dGhpcyl9cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpby5jYWxsKHQsbikmJihlW25dPXRbbl0pO2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPWV9ci5wcm90b3R5cGU9dC5wcm90b3R5cGUsZS5wcm90b3R5cGU9bmV3IHIsZS5fX3N1cGVyX189dC5wcm90b3R5cGV9KGEsdCksYS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scjtmb3IodCBpbihuPU9iamVjdC5jcmVhdGUodGhpcykpLmlzUm9vdCYmKG4uZG9jdW1lbnRPYmplY3Q9bnVsbCksbi5hdHRyaWJ1dGVzPXt9LHI9dGhpcy5hdHRyaWJ1dGVzKW8uY2FsbChyLHQpJiYoZT1yW3RdLG4uYXR0cmlidXRlc1t0XT1lLmNsb25lKCkpO3JldHVybiBuLmNoaWxkcmVuPVtdLHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuKHQ9ZS5jbG9uZSgpKS5wYXJlbnQ9bixuLmNoaWxkcmVuLnB1c2godCl9KSksbn0sYS5wcm90b3R5cGUuYXR0cmlidXRlPWZ1bmN0aW9uKHQsYSl7dmFyIGMscztpZihudWxsIT10JiYodD1uKHQpKSxpKHQpKWZvcihjIGluIHQpby5jYWxsKHQsYykmJihzPXRbY10sdGhpcy5hdHRyaWJ1dGUoYyxzKSk7ZWxzZSByKGEpJiYoYT1hLmFwcGx5KCkpLHRoaXMub3B0aW9ucy5za2lwTnVsbEF0dHJpYnV0ZXMmJm51bGw9PWF8fCh0aGlzLmF0dHJpYnV0ZXNbdF09bmV3IGUodGhpcyx0LGEpKTtyZXR1cm4gdGhpc30sYS5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlPWZ1bmN0aW9uKGUpe3ZhciB0LHIsaTtpZihudWxsPT1lKXRocm93IG5ldyBFcnJvcigiTWlzc2luZyBhdHRyaWJ1dGUgbmFtZS4gIit0aGlzLmRlYnVnSW5mbygpKTtpZihlPW4oZSksQXJyYXkuaXNBcnJheShlKSlmb3Iocj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyl0PWVbcl0sZGVsZXRlIHRoaXMuYXR0cmlidXRlc1t0XTtlbHNlIGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbZV07cmV0dXJuIHRoaXN9LGEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLnNldChlKS5lbGVtZW50KHRoaXMpfSxhLnByb3RvdHlwZS5hdHQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGUoZSx0KX0sYS5wcm90b3R5cGUuYT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZShlLHQpfSxhfSh0KX0uY2FsbChRKSkseGx9dmFyIFVsLEFsPXt9LGtsPXtnZXQgZXhwb3J0cygpe3JldHVybiBBbH0sc2V0IGV4cG9ydHMoZSl7QWw9ZX19O2Z1bmN0aW9uIFNsKCl7cmV0dXJuIFVsfHwoVWw9MSxmdW5jdGlvbigpe3ZhciBlLHQ9e30uaGFzT3duUHJvcGVydHk7ZT1EdSgpLGtsLmV4cG9ydHM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihlLHQpe2lmKG4uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxlKSxudWxsPT10KXRocm93IG5ldyBFcnJvcigiTWlzc2luZyBDREFUQSB0ZXh0LiAiK3RoaXMuZGVidWdJbmZvKCkpO3RoaXMudGV4dD10aGlzLnN0cmluZ2lmeS5jZGF0YSh0KX1yZXR1cm4gZnVuY3Rpb24oZSxuKXtmb3IodmFyIHIgaW4gbil0LmNhbGwobixyKSYmKGVbcl09bltyXSk7ZnVuY3Rpb24gaSgpe3RoaXMuY29uc3RydWN0b3I9ZX1pLnByb3RvdHlwZT1uLnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgaSxlLl9fc3VwZXJfXz1uLnByb3RvdHlwZX0obixlKSxuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpfSxuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5zZXQoZSkuY2RhdGEodGhpcyl9LG59KGUpfS5jYWxsKFEpKSxBbH12YXIgQ2wsRmw9e30sT2w9e2dldCBleHBvcnRzKCl7cmV0dXJuIEZsfSxzZXQgZXhwb3J0cyhlKXtGbD1lfX07ZnVuY3Rpb24gSWwoKXtyZXR1cm4gQ2x8fChDbD0xLGZ1bmN0aW9uKCl7dmFyIGUsdD17fS5oYXNPd25Qcm9wZXJ0eTtlPUR1KCksT2wuZXhwb3J0cz1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKGUsdCl7aWYobi5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLGUpLG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIGNvbW1lbnQgdGV4dC4gIit0aGlzLmRlYnVnSW5mbygpKTt0aGlzLnRleHQ9dGhpcy5zdHJpbmdpZnkuY29tbWVudCh0KX1yZXR1cm4gZnVuY3Rpb24oZSxuKXtmb3IodmFyIHIgaW4gbil0LmNhbGwobixyKSYmKGVbcl09bltyXSk7ZnVuY3Rpb24gaSgpe3RoaXMuY29uc3RydWN0b3I9ZX1pLnByb3RvdHlwZT1uLnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgaSxlLl9fc3VwZXJfXz1uLnByb3RvdHlwZX0obixlKSxuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpfSxuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5zZXQoZSkuY29tbWVudCh0aGlzKX0sbn0oZSl9LmNhbGwoUSkpLEZsfXZhciBSbCxObD17fSxQbD17Z2V0IGV4cG9ydHMoKXtyZXR1cm4gTmx9LHNldCBleHBvcnRzKGUpe05sPWV9fTtmdW5jdGlvbiBCbCgpe3JldHVybiBSbHx8KFJsPTEsZnVuY3Rpb24oKXt2YXIgZSx0LG49e30uaGFzT3duUHJvcGVydHk7dD1obCgpLmlzT2JqZWN0LGU9RHUoKSxQbC5leHBvcnRzPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoZSxuLGksYSl7dmFyIG87ci5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLGUpLHQobikmJihuPShvPW4pLnZlcnNpb24saT1vLmVuY29kaW5nLGE9by5zdGFuZGFsb25lKSxufHwobj0iMS4wIiksdGhpcy52ZXJzaW9uPXRoaXMuc3RyaW5naWZ5LnhtbFZlcnNpb24obiksbnVsbCE9aSYmKHRoaXMuZW5jb2Rpbmc9dGhpcy5zdHJpbmdpZnkueG1sRW5jb2RpbmcoaSkpLG51bGwhPWEmJih0aGlzLnN0YW5kYWxvbmU9dGhpcy5zdHJpbmdpZnkueG1sU3RhbmRhbG9uZShhKSl9cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByIGluIHQpbi5jYWxsKHQscikmJihlW3JdPXRbcl0pO2Z1bmN0aW9uIGkoKXt0aGlzLmNvbnN0cnVjdG9yPWV9aS5wcm90b3R5cGU9dC5wcm90b3R5cGUsZS5wcm90b3R5cGU9bmV3IGksZS5fX3N1cGVyX189dC5wcm90b3R5cGV9KHIsZSksci5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KGUpLmRlY2xhcmF0aW9uKHRoaXMpfSxyfShlKX0uY2FsbChRKSksTmx9dmFyIFdsLExsPXt9LE1sPXtnZXQgZXhwb3J0cygpe3JldHVybiBMbH0sc2V0IGV4cG9ydHMoZSl7TGw9ZX19LGpsPXt9LHpsPXtnZXQgZXhwb3J0cygpe3JldHVybiBqbH0sc2V0IGV4cG9ydHMoZSl7amw9ZX19O2Z1bmN0aW9uIEhsKCl7cmV0dXJuIFdsfHwoV2w9MSxmdW5jdGlvbigpe3ZhciBlLHQ9e30uaGFzT3duUHJvcGVydHk7ZT1EdSgpLHpsLmV4cG9ydHM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihlLHQscixpLGEsbyl7aWYobi5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLGUpLG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIERURCBlbGVtZW50IG5hbWUuICIrdGhpcy5kZWJ1Z0luZm8oKSk7aWYobnVsbD09cil0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgRFREIGF0dHJpYnV0ZSBuYW1lLiAiK3RoaXMuZGVidWdJbmZvKHQpKTtpZighaSl0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgRFREIGF0dHJpYnV0ZSB0eXBlLiAiK3RoaXMuZGVidWdJbmZvKHQpKTtpZighYSl0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgRFREIGF0dHJpYnV0ZSBkZWZhdWx0LiAiK3RoaXMuZGVidWdJbmZvKHQpKTtpZigwIT09YS5pbmRleE9mKCIjIikmJihhPSIjIithKSwhYS5tYXRjaCgvXigjUkVRVUlSRUR8I0lNUExJRUR8I0ZJWEVEfCNERUZBVUxUKSQvKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZGVmYXVsdCB2YWx1ZSB0eXBlOyBleHBlY3RlZDogI1JFUVVJUkVELCAjSU1QTElFRCwgI0ZJWEVEIG9yICNERUZBVUxULiAiK3RoaXMuZGVidWdJbmZvKHQpKTtpZihvJiYhYS5tYXRjaCgvXigjRklYRUR8I0RFRkFVTFQpJC8pKXRocm93IG5ldyBFcnJvcigiRGVmYXVsdCB2YWx1ZSBvbmx5IGFwcGxpZXMgdG8gI0ZJWEVEIG9yICNERUZBVUxULiAiK3RoaXMuZGVidWdJbmZvKHQpKTt0aGlzLmVsZW1lbnROYW1lPXRoaXMuc3RyaW5naWZ5LmVsZU5hbWUodCksdGhpcy5hdHRyaWJ1dGVOYW1lPXRoaXMuc3RyaW5naWZ5LmF0dE5hbWUociksdGhpcy5hdHRyaWJ1dGVUeXBlPXRoaXMuc3RyaW5naWZ5LmR0ZEF0dFR5cGUoaSksdGhpcy5kZWZhdWx0VmFsdWU9dGhpcy5zdHJpbmdpZnkuZHRkQXR0RGVmYXVsdChvKSx0aGlzLmRlZmF1bHRWYWx1ZVR5cGU9YX1yZXR1cm4gZnVuY3Rpb24oZSxuKXtmb3IodmFyIHIgaW4gbil0LmNhbGwobixyKSYmKGVbcl09bltyXSk7ZnVuY3Rpb24gaSgpe3RoaXMuY29uc3RydWN0b3I9ZX1pLnByb3RvdHlwZT1uLnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgaSxlLl9fc3VwZXJfXz1uLnByb3RvdHlwZX0obixlKSxuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5zZXQoZSkuZHRkQXR0TGlzdCh0aGlzKX0sbn0oZSl9LmNhbGwoUSkpLGpsfXZhciBWbCxxbD17fSxHbD17Z2V0IGV4cG9ydHMoKXtyZXR1cm4gcWx9LHNldCBleHBvcnRzKGUpe3FsPWV9fTtmdW5jdGlvbiBYbCgpe3JldHVybiBWbHx8KFZsPTEsZnVuY3Rpb24oKXt2YXIgZSx0LG49e30uaGFzT3duUHJvcGVydHk7dD1obCgpLmlzT2JqZWN0LGU9RHUoKSxHbC5leHBvcnRzPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoZSxuLGksYSl7aWYoci5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLGUpLG51bGw9PWkpdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIERURCBlbnRpdHkgbmFtZS4gIit0aGlzLmRlYnVnSW5mbyhpKSk7aWYobnVsbD09YSl0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgRFREIGVudGl0eSB2YWx1ZS4gIit0aGlzLmRlYnVnSW5mbyhpKSk7aWYodGhpcy5wZT0hIW4sdGhpcy5uYW1lPXRoaXMuc3RyaW5naWZ5LmVsZU5hbWUoaSksdChhKSl7aWYoIWEucHViSUQmJiFhLnN5c0lEKXRocm93IG5ldyBFcnJvcigiUHVibGljIGFuZC9vciBzeXN0ZW0gaWRlbnRpZmllcnMgYXJlIHJlcXVpcmVkIGZvciBhbiBleHRlcm5hbCBlbnRpdHkuICIrdGhpcy5kZWJ1Z0luZm8oaSkpO2lmKGEucHViSUQmJiFhLnN5c0lEKXRocm93IG5ldyBFcnJvcigiU3lzdGVtIGlkZW50aWZpZXIgaXMgcmVxdWlyZWQgZm9yIGEgcHVibGljIGV4dGVybmFsIGVudGl0eS4gIit0aGlzLmRlYnVnSW5mbyhpKSk7aWYobnVsbCE9YS5wdWJJRCYmKHRoaXMucHViSUQ9dGhpcy5zdHJpbmdpZnkuZHRkUHViSUQoYS5wdWJJRCkpLG51bGwhPWEuc3lzSUQmJih0aGlzLnN5c0lEPXRoaXMuc3RyaW5naWZ5LmR0ZFN5c0lEKGEuc3lzSUQpKSxudWxsIT1hLm5EYXRhJiYodGhpcy5uRGF0YT10aGlzLnN0cmluZ2lmeS5kdGRORGF0YShhLm5EYXRhKSksdGhpcy5wZSYmdGhpcy5uRGF0YSl0aHJvdyBuZXcgRXJyb3IoIk5vdGF0aW9uIGRlY2xhcmF0aW9uIGlzIG5vdCBhbGxvd2VkIGluIGEgcGFyYW1ldGVyIGVudGl0eS4gIit0aGlzLmRlYnVnSW5mbyhpKSl9ZWxzZSB0aGlzLnZhbHVlPXRoaXMuc3RyaW5naWZ5LmR0ZEVudGl0eVZhbHVlKGEpfXJldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgciBpbiB0KW4uY2FsbCh0LHIpJiYoZVtyXT10W3JdKTtmdW5jdGlvbiBpKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfWkucHJvdG90eXBlPXQucHJvdG90eXBlLGUucHJvdG90eXBlPW5ldyBpLGUuX19zdXBlcl9fPXQucHJvdG90eXBlfShyLGUpLHIucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLnNldChlKS5kdGRFbnRpdHkodGhpcyl9LHJ9KGUpfS5jYWxsKFEpKSxxbH12YXIgJGwsWWw9e30sS2w9e2dldCBleHBvcnRzKCl7cmV0dXJuIFlsfSxzZXQgZXhwb3J0cyhlKXtZbD1lfX07ZnVuY3Rpb24gWmwoKXtyZXR1cm4gJGx8fCgkbD0xLGZ1bmN0aW9uKCl7dmFyIGUsdD17fS5oYXNPd25Qcm9wZXJ0eTtlPUR1KCksS2wuZXhwb3J0cz1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKGUsdCxyKXtpZihuLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZSksbnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgRFREIGVsZW1lbnQgbmFtZS4gIit0aGlzLmRlYnVnSW5mbygpKTtyfHwocj0iKCNQQ0RBVEEpIiksQXJyYXkuaXNBcnJheShyKSYmKHI9IigiK3Iuam9pbigiLCIpKyIpIiksdGhpcy5uYW1lPXRoaXMuc3RyaW5naWZ5LmVsZU5hbWUodCksdGhpcy52YWx1ZT10aGlzLnN0cmluZ2lmeS5kdGRFbGVtZW50VmFsdWUocil9cmV0dXJuIGZ1bmN0aW9uKGUsbil7Zm9yKHZhciByIGluIG4pdC5jYWxsKG4scikmJihlW3JdPW5bcl0pO2Z1bmN0aW9uIGkoKXt0aGlzLmNvbnN0cnVjdG9yPWV9aS5wcm90b3R5cGU9bi5wcm90b3R5cGUsZS5wcm90b3R5cGU9bmV3IGksZS5fX3N1cGVyX189bi5wcm90b3R5cGV9KG4sZSksbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KGUpLmR0ZEVsZW1lbnQodGhpcyl9LG59KGUpfS5jYWxsKFEpKSxZbH12YXIgSmwsUWwsZXU9e30sdHU9e2dldCBleHBvcnRzKCl7cmV0dXJuIGV1fSxzZXQgZXhwb3J0cyhlKXtldT1lfX07ZnVuY3Rpb24gbnUoKXtyZXR1cm4gSmx8fChKbD0xLGZ1bmN0aW9uKCl7dmFyIGUsdD17fS5oYXNPd25Qcm9wZXJ0eTtlPUR1KCksdHUuZXhwb3J0cz1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKGUsdCxyKXtpZihuLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZSksbnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgRFREIG5vdGF0aW9uIG5hbWUuICIrdGhpcy5kZWJ1Z0luZm8odCkpO2lmKCFyLnB1YklEJiYhci5zeXNJRCl0aHJvdyBuZXcgRXJyb3IoIlB1YmxpYyBvciBzeXN0ZW0gaWRlbnRpZmllcnMgYXJlIHJlcXVpcmVkIGZvciBhbiBleHRlcm5hbCBlbnRpdHkuICIrdGhpcy5kZWJ1Z0luZm8odCkpO3RoaXMubmFtZT10aGlzLnN0cmluZ2lmeS5lbGVOYW1lKHQpLG51bGwhPXIucHViSUQmJih0aGlzLnB1YklEPXRoaXMuc3RyaW5naWZ5LmR0ZFB1YklEKHIucHViSUQpKSxudWxsIT1yLnN5c0lEJiYodGhpcy5zeXNJRD10aGlzLnN0cmluZ2lmeS5kdGRTeXNJRChyLnN5c0lEKSl9cmV0dXJuIGZ1bmN0aW9uKGUsbil7Zm9yKHZhciByIGluIG4pdC5jYWxsKG4scikmJihlW3JdPW5bcl0pO2Z1bmN0aW9uIGkoKXt0aGlzLmNvbnN0cnVjdG9yPWV9aS5wcm90b3R5cGU9bi5wcm90b3R5cGUsZS5wcm90b3R5cGU9bmV3IGksZS5fX3N1cGVyX189bi5wcm90b3R5cGV9KG4sZSksbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KGUpLmR0ZE5vdGF0aW9uKHRoaXMpfSxufShlKX0uY2FsbChRKSksZXV9ZnVuY3Rpb24gcnUoKXtyZXR1cm4gUWx8fChRbD0xLGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxhLG89e30uaGFzT3duUHJvcGVydHk7YT1obCgpLmlzT2JqZWN0LGk9RHUoKSxlPUhsKCksbj1YbCgpLHQ9WmwoKSxyPW51KCksTWwuZXhwb3J0cz1mdW5jdGlvbihpKXtmdW5jdGlvbiBjKGUsdCxuKXt2YXIgcixpO2MuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxlKSx0aGlzLm5hbWU9IiFET0NUWVBFIix0aGlzLmRvY3VtZW50T2JqZWN0PWUsYSh0KSYmKHQ9KHI9dCkucHViSUQsbj1yLnN5c0lEKSxudWxsPT1uJiYobj0oaT1bdCxuXSlbMF0sdD1pWzFdKSxudWxsIT10JiYodGhpcy5wdWJJRD10aGlzLnN0cmluZ2lmeS5kdGRQdWJJRCh0KSksbnVsbCE9biYmKHRoaXMuc3lzSUQ9dGhpcy5zdHJpbmdpZnkuZHRkU3lzSUQobikpfXJldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KW8uY2FsbCh0LG4pJiYoZVtuXT10W25dKTtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXIucHJvdG90eXBlPXQucHJvdG90eXBlLGUucHJvdG90eXBlPW5ldyByLGUuX19zdXBlcl9fPXQucHJvdG90eXBlfShjLGkpLGMucHJvdG90eXBlLmVsZW1lbnQ9ZnVuY3Rpb24oZSxuKXt2YXIgcjtyZXR1cm4gcj1uZXcgdCh0aGlzLGUsbiksdGhpcy5jaGlsZHJlbi5wdXNoKHIpLHRoaXN9LGMucHJvdG90eXBlLmF0dExpc3Q9ZnVuY3Rpb24odCxuLHIsaSxhKXt2YXIgbztyZXR1cm4gbz1uZXcgZSh0aGlzLHQsbixyLGksYSksdGhpcy5jaGlsZHJlbi5wdXNoKG8pLHRoaXN9LGMucHJvdG90eXBlLmVudGl0eT1mdW5jdGlvbihlLHQpe3ZhciByO3JldHVybiByPW5ldyBuKHRoaXMsITEsZSx0KSx0aGlzLmNoaWxkcmVuLnB1c2gociksdGhpc30sYy5wcm90b3R5cGUucEVudGl0eT1mdW5jdGlvbihlLHQpe3ZhciByO3JldHVybiByPW5ldyBuKHRoaXMsITAsZSx0KSx0aGlzLmNoaWxkcmVuLnB1c2gociksdGhpc30sYy5wcm90b3R5cGUubm90YXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gbj1uZXcgcih0aGlzLGUsdCksdGhpcy5jaGlsZHJlbi5wdXNoKG4pLHRoaXN9LGMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLnNldChlKS5kb2NUeXBlKHRoaXMpfSxjLnByb3RvdHlwZS5lbGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbGVtZW50KGUsdCl9LGMucHJvdG90eXBlLmF0dD1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiB0aGlzLmF0dExpc3QoZSx0LG4scixpKX0sYy5wcm90b3R5cGUuZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW50aXR5KGUsdCl9LGMucHJvdG90eXBlLnBlbnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5wRW50aXR5KGUsdCl9LGMucHJvdG90eXBlLm5vdD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm5vdGF0aW9uKGUsdCl9LGMucHJvdG90eXBlLnVwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm9vdCgpfHx0aGlzLmRvY3VtZW50T2JqZWN0fSxjfShpKX0uY2FsbChRKSksTGx9dmFyIGl1LGF1PXt9LG91PXtnZXQgZXhwb3J0cygpe3JldHVybiBhdX0sc2V0IGV4cG9ydHMoZSl7YXU9ZX19O2Z1bmN0aW9uIGN1KCl7cmV0dXJuIGl1fHwoaXU9MSxmdW5jdGlvbigpe3ZhciBlLHQ9e30uaGFzT3duUHJvcGVydHk7ZT1EdSgpLG91LmV4cG9ydHM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihlLHQpe2lmKG4uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxlKSxudWxsPT10KXRocm93IG5ldyBFcnJvcigiTWlzc2luZyByYXcgdGV4dC4gIit0aGlzLmRlYnVnSW5mbygpKTt0aGlzLnZhbHVlPXRoaXMuc3RyaW5naWZ5LnJhdyh0KX1yZXR1cm4gZnVuY3Rpb24oZSxuKXtmb3IodmFyIHIgaW4gbil0LmNhbGwobixyKSYmKGVbcl09bltyXSk7ZnVuY3Rpb24gaSgpe3RoaXMuY29uc3RydWN0b3I9ZX1pLnByb3RvdHlwZT1uLnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgaSxlLl9fc3VwZXJfXz1uLnByb3RvdHlwZX0obixlKSxuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpfSxuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5zZXQoZSkucmF3KHRoaXMpfSxufShlKX0uY2FsbChRKSksYXV9dmFyIHN1LGx1PXt9LHV1PXtnZXQgZXhwb3J0cygpe3JldHVybiBsdX0sc2V0IGV4cG9ydHMoZSl7bHU9ZX19O2Z1bmN0aW9uIGZ1KCl7cmV0dXJuIHN1fHwoc3U9MSxmdW5jdGlvbigpe3ZhciBlLHQ9e30uaGFzT3duUHJvcGVydHk7ZT1EdSgpLHV1LmV4cG9ydHM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihlLHQpe2lmKG4uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxlKSxudWxsPT10KXRocm93IG5ldyBFcnJvcigiTWlzc2luZyBlbGVtZW50IHRleHQuICIrdGhpcy5kZWJ1Z0luZm8oKSk7dGhpcy52YWx1ZT10aGlzLnN0cmluZ2lmeS5lbGVUZXh0KHQpfXJldHVybiBmdW5jdGlvbihlLG4pe2Zvcih2YXIgciBpbiBuKXQuY2FsbChuLHIpJiYoZVtyXT1uW3JdKTtmdW5jdGlvbiBpKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfWkucHJvdG90eXBlPW4ucHJvdG90eXBlLGUucHJvdG90eXBlPW5ldyBpLGUuX19zdXBlcl9fPW4ucHJvdG90eXBlfShuLGUpLG4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyl9LG4ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLnNldChlKS50ZXh0KHRoaXMpfSxufShlKX0uY2FsbChRKSksbHV9dmFyIGR1LGh1PXt9LHB1PXtnZXQgZXhwb3J0cygpe3JldHVybiBodX0sc2V0IGV4cG9ydHMoZSl7aHU9ZX19O2Z1bmN0aW9uIGd1KCl7cmV0dXJuIGR1fHwoZHU9MSxmdW5jdGlvbigpe3ZhciBlLHQ9e30uaGFzT3duUHJvcGVydHk7ZT1EdSgpLHB1LmV4cG9ydHM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihlLHQscil7aWYobi5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLGUpLG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIGluc3RydWN0aW9uIHRhcmdldC4gIit0aGlzLmRlYnVnSW5mbygpKTt0aGlzLnRhcmdldD10aGlzLnN0cmluZ2lmeS5pbnNUYXJnZXQodCksciYmKHRoaXMudmFsdWU9dGhpcy5zdHJpbmdpZnkuaW5zVmFsdWUocikpfXJldHVybiBmdW5jdGlvbihlLG4pe2Zvcih2YXIgciBpbiBuKXQuY2FsbChuLHIpJiYoZVtyXT1uW3JdKTtmdW5jdGlvbiBpKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfWkucHJvdG90eXBlPW4ucHJvdG90eXBlLGUucHJvdG90eXBlPW5ldyBpLGUuX19zdXBlcl9fPW4ucHJvdG90eXBlfShuLGUpLG4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyl9LG4ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLnNldChlKS5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGhpcyl9LG59KGUpfS5jYWxsKFEpKSxodX12YXIgbXUsYnUseXU9e30sdnU9e2dldCBleHBvcnRzKCl7cmV0dXJuIHl1fSxzZXQgZXhwb3J0cyhlKXt5dT1lfX07ZnVuY3Rpb24geHUoKXtyZXR1cm4gbXV8fChtdT0xLGZ1bmN0aW9uKCl7dmFyIGUsdD17fS5oYXNPd25Qcm9wZXJ0eTtlPUR1KCksdnUuZXhwb3J0cz1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKGUpe24uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxlKSx0aGlzLmlzRHVtbXk9ITB9cmV0dXJuIGZ1bmN0aW9uKGUsbil7Zm9yKHZhciByIGluIG4pdC5jYWxsKG4scikmJihlW3JdPW5bcl0pO2Z1bmN0aW9uIGkoKXt0aGlzLmNvbnN0cnVjdG9yPWV9aS5wcm90b3R5cGU9bi5wcm90b3R5cGUsZS5wcm90b3R5cGU9bmV3IGksZS5fX3N1cGVyX189bi5wcm90b3R5cGV9KG4sZSksbi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzKX0sbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIiJ9LG59KGUpfS5jYWxsKFEpKSx5dX1mdW5jdGlvbiBEdSgpe3JldHVybiBidXx8KGJ1PTEsZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLGEsbyxjLHMsbCx1LGYsZCxoLHA9e30uaGFzT3duUHJvcGVydHk7aD1obCgpLGQ9aC5pc09iamVjdCxmPWguaXNGdW5jdGlvbix1PWguaXNFbXB0eSxsPWguZ2V0VmFsdWUsYT1udWxsLGU9bnVsbCx0PW51bGwsbj1udWxsLHI9bnVsbCxjPW51bGwscz1udWxsLG89bnVsbCxpPW51bGwsdmwuZXhwb3J0cz1mdW5jdGlvbigpe2Z1bmN0aW9uIGgobCl7dGhpcy5wYXJlbnQ9bCx0aGlzLnBhcmVudCYmKHRoaXMub3B0aW9ucz10aGlzLnBhcmVudC5vcHRpb25zLHRoaXMuc3RyaW5naWZ5PXRoaXMucGFyZW50LnN0cmluZ2lmeSksdGhpcy5jaGlsZHJlbj1bXSxhfHwoYT1FbCgpLGU9U2woKSx0PUlsKCksbj1CbCgpLHI9cnUoKSxjPWN1KCkscz1mdSgpLG89Z3UoKSxpPXh1KCkpfXJldHVybiBoLnByb3RvdHlwZS5lbGVtZW50PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLGEsbyxjLHMsaCxnLG0sYix5O2lmKHM9bnVsbCxudWxsPT09dCYmbnVsbD09biYmKHQ9KG09W3t9LG51bGxdKVswXSxuPW1bMV0pLG51bGw9PXQmJih0PXt9KSx0PWwodCksZCh0KXx8KG49KGI9W3Qsbl0pWzBdLHQ9YlsxXSksbnVsbCE9ZSYmKGU9bChlKSksQXJyYXkuaXNBcnJheShlKSlmb3IoYT0wLGg9ZS5sZW5ndGg7YTxoO2ErKylpPWVbYV0scz10aGlzLmVsZW1lbnQoaSk7ZWxzZSBpZihmKGUpKXM9dGhpcy5lbGVtZW50KGUuYXBwbHkoKSk7ZWxzZSBpZihkKGUpKXtmb3IoYyBpbiBlKWlmKHAuY2FsbChlLGMpKWlmKHk9ZVtjXSxmKHkpJiYoeT15LmFwcGx5KCkpLGQoeSkmJnUoeSkmJih5PW51bGwpLCF0aGlzLm9wdGlvbnMuaWdub3JlRGVjb3JhdG9ycyYmdGhpcy5zdHJpbmdpZnkuY29udmVydEF0dEtleSYmMD09PWMuaW5kZXhPZih0aGlzLnN0cmluZ2lmeS5jb252ZXJ0QXR0S2V5KSlzPXRoaXMuYXR0cmlidXRlKGMuc3Vic3RyKHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRBdHRLZXkubGVuZ3RoKSx5KTtlbHNlIGlmKCF0aGlzLm9wdGlvbnMuc2VwYXJhdGVBcnJheUl0ZW1zJiZBcnJheS5pc0FycmF5KHkpKWZvcihvPTAsZz15Lmxlbmd0aDtvPGc7bysrKWk9eVtvXSwocj17fSlbY109aSxzPXRoaXMuZWxlbWVudChyKTtlbHNlIGQoeSk/KHM9dGhpcy5lbGVtZW50KGMpKS5lbGVtZW50KHkpOnM9dGhpcy5lbGVtZW50KGMseSl9ZWxzZSBzPXRoaXMub3B0aW9ucy5za2lwTnVsbE5vZGVzJiZudWxsPT09bj90aGlzLmR1bW15KCk6IXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzJiZ0aGlzLnN0cmluZ2lmeS5jb252ZXJ0VGV4dEtleSYmMD09PWUuaW5kZXhPZih0aGlzLnN0cmluZ2lmeS5jb252ZXJ0VGV4dEtleSk/dGhpcy50ZXh0KG4pOiF0aGlzLm9wdGlvbnMuaWdub3JlRGVjb3JhdG9ycyYmdGhpcy5zdHJpbmdpZnkuY29udmVydENEYXRhS2V5JiYwPT09ZS5pbmRleE9mKHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRDRGF0YUtleSk/dGhpcy5jZGF0YShuKTohdGhpcy5vcHRpb25zLmlnbm9yZURlY29yYXRvcnMmJnRoaXMuc3RyaW5naWZ5LmNvbnZlcnRDb21tZW50S2V5JiYwPT09ZS5pbmRleE9mKHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRDb21tZW50S2V5KT90aGlzLmNvbW1lbnQobik6IXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzJiZ0aGlzLnN0cmluZ2lmeS5jb252ZXJ0UmF3S2V5JiYwPT09ZS5pbmRleE9mKHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRSYXdLZXkpP3RoaXMucmF3KG4pOiF0aGlzLm9wdGlvbnMuaWdub3JlRGVjb3JhdG9ycyYmdGhpcy5zdHJpbmdpZnkuY29udmVydFBJS2V5JiYwPT09ZS5pbmRleE9mKHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRQSUtleSk/dGhpcy5pbnN0cnVjdGlvbihlLnN1YnN0cih0aGlzLnN0cmluZ2lmeS5jb252ZXJ0UElLZXkubGVuZ3RoKSxuKTp0aGlzLm5vZGUoZSx0LG4pO2lmKG51bGw9PXMpdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgY3JlYXRlIGFueSBlbGVtZW50cyB3aXRoOiAiK2UrIi4gIit0aGlzLmRlYnVnSW5mbygpKTtyZXR1cm4gc30saC5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLGE7aWYodGhpcy5pc1Jvb3QpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW5zZXJ0IGVsZW1lbnRzIGF0IHJvb3QgbGV2ZWwuICIrdGhpcy5kZWJ1Z0luZm8oZSkpO3JldHVybiBpPXRoaXMucGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyksYT10aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaSkscj10aGlzLnBhcmVudC5lbGVtZW50KGUsdCxuKSxBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLnBhcmVudC5jaGlsZHJlbixhKSxyfSxoLnByb3RvdHlwZS5pbnNlcnRBZnRlcj1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxhO2lmKHRoaXMuaXNSb290KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGluc2VydCBlbGVtZW50cyBhdCByb290IGxldmVsLiAiK3RoaXMuZGVidWdJbmZvKGUpKTtyZXR1cm4gaT10aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpLGE9dGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGkrMSkscj10aGlzLnBhcmVudC5lbGVtZW50KGUsdCxuKSxBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLnBhcmVudC5jaGlsZHJlbixhKSxyfSxoLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt2YXIgZTtpZih0aGlzLmlzUm9vdCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZW1vdmUgdGhlIHJvb3QgZWxlbWVudC4gIit0aGlzLmRlYnVnSW5mbygpKTtyZXR1cm4gZT10aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpLFtdLnNwbGljZS5hcHBseSh0aGlzLnBhcmVudC5jaGlsZHJlbixbZSxlLWUrMV0uY29uY2F0KFtdKSksdGhpcy5wYXJlbnR9LGgucHJvdG90eXBlLm5vZGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7cmV0dXJuIG51bGwhPWUmJihlPWwoZSkpLHR8fCh0PXt9KSx0PWwodCksZCh0KXx8KG49KGk9W3Qsbl0pWzBdLHQ9aVsxXSkscj1uZXcgYSh0aGlzLGUsdCksbnVsbCE9biYmci50ZXh0KG4pLHRoaXMuY2hpbGRyZW4ucHVzaChyKSxyfSxoLnByb3RvdHlwZS50ZXh0PWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0PW5ldyBzKHRoaXMsZSksdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHRoaXN9LGgucHJvdG90eXBlLmNkYXRhPWZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiBuPW5ldyBlKHRoaXMsdCksdGhpcy5jaGlsZHJlbi5wdXNoKG4pLHRoaXN9LGgucHJvdG90eXBlLmNvbW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG49bmV3IHQodGhpcyxlKSx0aGlzLmNoaWxkcmVuLnB1c2gobiksdGhpc30saC5wcm90b3R5cGUuY29tbWVudEJlZm9yZT1mdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiB0PXRoaXMucGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyksbj10aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UodCksdGhpcy5wYXJlbnQuY29tbWVudChlKSxBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLnBhcmVudC5jaGlsZHJlbixuKSx0aGlzfSxoLnByb3RvdHlwZS5jb21tZW50QWZ0ZXI9ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4gdD10aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpLG49dGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKHQrMSksdGhpcy5wYXJlbnQuY29tbWVudChlKSxBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLnBhcmVudC5jaGlsZHJlbixuKSx0aGlzfSxoLnByb3RvdHlwZS5yYXc9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHQ9bmV3IGModGhpcyxlKSx0aGlzLmNoaWxkcmVuLnB1c2godCksdGhpc30saC5wcm90b3R5cGUuZHVtbXk9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gZT1uZXcgaSh0aGlzKSx0aGlzLmNoaWxkcmVuLnB1c2goZSksZX0saC5wcm90b3R5cGUuaW5zdHJ1Y3Rpb249ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksYSxjO2lmKG51bGwhPWUmJihlPWwoZSkpLG51bGwhPXQmJih0PWwodCkpLEFycmF5LmlzQXJyYXkoZSkpZm9yKGE9MCxjPWUubGVuZ3RoO2E8YzthKyspbj1lW2FdLHRoaXMuaW5zdHJ1Y3Rpb24obik7ZWxzZSBpZihkKGUpKWZvcihuIGluIGUpcC5jYWxsKGUsbikmJihyPWVbbl0sdGhpcy5pbnN0cnVjdGlvbihuLHIpKTtlbHNlIGYodCkmJih0PXQuYXBwbHkoKSksaT1uZXcgbyh0aGlzLGUsdCksdGhpcy5jaGlsZHJlbi5wdXNoKGkpO3JldHVybiB0aGlzfSxoLnByb3RvdHlwZS5pbnN0cnVjdGlvbkJlZm9yZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI7cmV0dXJuIG49dGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKSxyPXRoaXMucGFyZW50LmNoaWxkcmVuLnNwbGljZShuKSx0aGlzLnBhcmVudC5pbnN0cnVjdGlvbihlLHQpLEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMucGFyZW50LmNoaWxkcmVuLHIpLHRoaXN9LGgucHJvdG90eXBlLmluc3RydWN0aW9uQWZ0ZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbixyO3JldHVybiBuPXRoaXMucGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcykscj10aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UobisxKSx0aGlzLnBhcmVudC5pbnN0cnVjdGlvbihlLHQpLEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMucGFyZW50LmNoaWxkcmVuLHIpLHRoaXN9LGgucHJvdG90eXBlLmRlY2xhcmF0aW9uPWZ1bmN0aW9uKGUsdCxyKXt2YXIgaSxhO3JldHVybiBpPXRoaXMuZG9jdW1lbnQoKSxhPW5ldyBuKGksZSx0LHIpLGkuY2hpbGRyZW5bMF1pbnN0YW5jZW9mIG4/aS5jaGlsZHJlblswXT1hOmkuY2hpbGRyZW4udW5zaGlmdChhKSxpLnJvb3QoKXx8aX0saC5wcm90b3R5cGUuZG9jdHlwZT1mdW5jdGlvbihlLHQpe3ZhciBuLGksYSxvLGMscyxsLHUsZjtmb3Iobj10aGlzLmRvY3VtZW50KCksaT1uZXcgcihuLGUsdCksYT1vPTAscz0odT1uLmNoaWxkcmVuKS5sZW5ndGg7bzxzO2E9KytvKWlmKHVbYV1pbnN0YW5jZW9mIHIpcmV0dXJuIG4uY2hpbGRyZW5bYV09aSxpO2ZvcihhPWM9MCxsPShmPW4uY2hpbGRyZW4pLmxlbmd0aDtjPGw7YT0rK2MpaWYoZlthXS5pc1Jvb3QpcmV0dXJuIG4uY2hpbGRyZW4uc3BsaWNlKGEsMCxpKSxpO3JldHVybiBuLmNoaWxkcmVuLnB1c2goaSksaX0saC5wcm90b3R5cGUudXA9ZnVuY3Rpb24oKXtpZih0aGlzLmlzUm9vdCl0aHJvdyBuZXcgRXJyb3IoIlRoZSByb290IG5vZGUgaGFzIG5vIHBhcmVudC4gVXNlIGRvYygpIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgZG9jdW1lbnQgb2JqZWN0LiIpO3JldHVybiB0aGlzLnBhcmVudH0saC5wcm90b3R5cGUucm9vdD1mdW5jdGlvbigpe3ZhciBlO2ZvcihlPXRoaXM7ZTspe2lmKGUuaXNEb2N1bWVudClyZXR1cm4gZS5yb290T2JqZWN0O2lmKGUuaXNSb290KXJldHVybiBlO2U9ZS5wYXJlbnR9fSxoLnByb3RvdHlwZS5kb2N1bWVudD1mdW5jdGlvbigpe3ZhciBlO2ZvcihlPXRoaXM7ZTspe2lmKGUuaXNEb2N1bWVudClyZXR1cm4gZTtlPWUucGFyZW50fX0saC5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRvY3VtZW50KCkuZW5kKGUpfSxoLnByb3RvdHlwZS5wcmV2PWZ1bmN0aW9uKCl7dmFyIGU7Zm9yKGU9dGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtlPjAmJnRoaXMucGFyZW50LmNoaWxkcmVuW2UtMV0uaXNEdW1teTspZS09MTtpZihlPDEpdGhyb3cgbmV3IEVycm9yKCJBbHJlYWR5IGF0IHRoZSBmaXJzdCBub2RlLiAiK3RoaXMuZGVidWdJbmZvKCkpO3JldHVybiB0aGlzLnBhcmVudC5jaGlsZHJlbltlLTFdfSxoLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dmFyIGU7Zm9yKGU9dGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtlPHRoaXMucGFyZW50LmNoaWxkcmVuLmxlbmd0aC0xJiZ0aGlzLnBhcmVudC5jaGlsZHJlbltlKzFdLmlzRHVtbXk7KWUrPTE7aWYoLTE9PT1lfHxlPT09dGhpcy5wYXJlbnQuY2hpbGRyZW4ubGVuZ3RoLTEpdGhyb3cgbmV3IEVycm9yKCJBbHJlYWR5IGF0IHRoZSBsYXN0IG5vZGUuICIrdGhpcy5kZWJ1Z0luZm8oKSk7cmV0dXJuIHRoaXMucGFyZW50LmNoaWxkcmVuW2UrMV19LGgucHJvdG90eXBlLmltcG9ydERvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybih0PWUucm9vdCgpLmNsb25lKCkpLnBhcmVudD10aGlzLHQuaXNSb290PSExLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0aGlzfSxoLnByb3RvdHlwZS5kZWJ1Z0luZm89ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4gbnVsbCE9KGU9ZXx8dGhpcy5uYW1lKXx8KG51bGwhPSh0PXRoaXMucGFyZW50KT90Lm5hbWU6dm9pZCAwKT9udWxsPT1lPyJwYXJlbnQ6IDwiK3RoaXMucGFyZW50Lm5hbWUrIj4iOihudWxsIT0obj10aGlzLnBhcmVudCk/bi5uYW1lOnZvaWQgMCk/Im5vZGU6IDwiK2UrIj4sIHBhcmVudDogPCIrdGhpcy5wYXJlbnQubmFtZSsiPiI6Im5vZGU6IDwiK2UrIj4iOiIifSxoLnByb3RvdHlwZS5lbGU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmVsZW1lbnQoZSx0LG4pfSxoLnByb3RvdHlwZS5ub2Q9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm5vZGUoZSx0LG4pfSxoLnByb3RvdHlwZS50eHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGV4dChlKX0saC5wcm90b3R5cGUuZGF0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNkYXRhKGUpfSxoLnByb3RvdHlwZS5jb209ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29tbWVudChlKX0saC5wcm90b3R5cGUuaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuaW5zdHJ1Y3Rpb24oZSx0KX0saC5wcm90b3R5cGUuZG9jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jdW1lbnQoKX0saC5wcm90b3R5cGUuZGVjPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbihlLHQsbil9LGgucHJvdG90eXBlLmR0ZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRvY3R5cGUoZSx0KX0saC5wcm90b3R5cGUuZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuZWxlbWVudChlLHQsbil9LGgucHJvdG90eXBlLm49ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm5vZGUoZSx0LG4pfSxoLnByb3RvdHlwZS50PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRleHQoZSl9LGgucHJvdG90eXBlLmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2RhdGEoZSl9LGgucHJvdG90eXBlLmM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29tbWVudChlKX0saC5wcm90b3R5cGUucj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yYXcoZSl9LGgucHJvdG90eXBlLmk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5pbnN0cnVjdGlvbihlLHQpfSxoLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXAoKX0saC5wcm90b3R5cGUuaW1wb3J0WE1MQnVpbGRlcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pbXBvcnREb2N1bWVudChlKX0saH0oKX0uY2FsbChRKSkseWx9dmFyIFR1LHd1PXt9LF91PXtnZXQgZXhwb3J0cygpe3JldHVybiB3dX0sc2V0IGV4cG9ydHMoZSl7d3U9ZX19O2Z1bmN0aW9uIEV1KCl7cmV0dXJuIFR1fHwoVHU9MSxmdW5jdGlvbigpe3ZhciBlPXt9Lmhhc093blByb3BlcnR5O191LmV4cG9ydHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBuLHIsaSxhLG87Zm9yKGkgaW4gdGhpcy5hc3NlcnRMZWdhbENoYXI9KG49dGhpcy5hc3NlcnRMZWdhbENoYXIscj10aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBwbHkocixhcmd1bWVudHMpfSksdHx8KHQ9e30pLHRoaXMubm9Eb3VibGVFbmNvZGluZz10Lm5vRG91YmxlRW5jb2RpbmcsYT10LnN0cmluZ2lmeXx8e30pZS5jYWxsKGEsaSkmJihvPWFbaV0sdGhpc1tpXT1vKX1yZXR1cm4gdC5wcm90b3R5cGUuZWxlTmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gZT0iIitlfHwiIix0aGlzLmFzc2VydExlZ2FsQ2hhcihlKX0sdC5wcm90b3R5cGUuZWxlVGV4dD1mdW5jdGlvbihlKXtyZXR1cm4gZT0iIitlfHwiIix0aGlzLmFzc2VydExlZ2FsQ2hhcih0aGlzLmVsRXNjYXBlKGUpKX0sdC5wcm90b3R5cGUuY2RhdGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9KGU9IiIrZXx8IiIpLnJlcGxhY2UoIl1dPiIsIl1dXV0+PCFbQ0RBVEFbPiIpLHRoaXMuYXNzZXJ0TGVnYWxDaGFyKGUpfSx0LnByb3RvdHlwZS5jb21tZW50PWZ1bmN0aW9uKGUpe2lmKChlPSIiK2V8fCIiKS5tYXRjaCgvLS0vKSl0aHJvdyBuZXcgRXJyb3IoIkNvbW1lbnQgdGV4dCBjYW5ub3QgY29udGFpbiBkb3VibGUtaHlwZW46ICIrZSk7cmV0dXJuIHRoaXMuYXNzZXJ0TGVnYWxDaGFyKGUpfSx0LnByb3RvdHlwZS5yYXc9ZnVuY3Rpb24oZSl7cmV0dXJuIiIrZXx8IiJ9LHQucHJvdG90eXBlLmF0dE5hbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIiIrZXx8IiJ9LHQucHJvdG90eXBlLmF0dFZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBlPSIiK2V8fCIiLHRoaXMuYXR0RXNjYXBlKGUpfSx0LnByb3RvdHlwZS5pbnNUYXJnZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIiIrZXx8IiJ9LHQucHJvdG90eXBlLmluc1ZhbHVlPWZ1bmN0aW9uKGUpe2lmKChlPSIiK2V8fCIiKS5tYXRjaCgvXD8+LykpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdmFsdWU6ICIrZSk7cmV0dXJuIGV9LHQucHJvdG90eXBlLnhtbFZlcnNpb249ZnVuY3Rpb24oZSl7aWYoIShlPSIiK2V8fCIiKS5tYXRjaCgvMVwuWzAtOV0rLykpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHZlcnNpb24gbnVtYmVyOiAiK2UpO3JldHVybiBlfSx0LnByb3RvdHlwZS54bWxFbmNvZGluZz1mdW5jdGlvbihlKXtpZighKGU9IiIrZXx8IiIpLm1hdGNoKC9eW0EtWmEtel0oPzpbQS1aYS16MC05Ll8tXSkqJC8pKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBlbmNvZGluZzogIitlKTtyZXR1cm4gZX0sdC5wcm90b3R5cGUueG1sU3RhbmRhbG9uZT1mdW5jdGlvbihlKXtyZXR1cm4gZT8ieWVzIjoibm8ifSx0LnByb3RvdHlwZS5kdGRQdWJJRD1mdW5jdGlvbihlKXtyZXR1cm4iIitlfHwiIn0sdC5wcm90b3R5cGUuZHRkU3lzSUQ9ZnVuY3Rpb24oZSl7cmV0dXJuIiIrZXx8IiJ9LHQucHJvdG90eXBlLmR0ZEVsZW1lbnRWYWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4iIitlfHwiIn0sdC5wcm90b3R5cGUuZHRkQXR0VHlwZT1mdW5jdGlvbihlKXtyZXR1cm4iIitlfHwiIn0sdC5wcm90b3R5cGUuZHRkQXR0RGVmYXVsdD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT8iIitlfHwiIjplfSx0LnByb3RvdHlwZS5kdGRFbnRpdHlWYWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4iIitlfHwiIn0sdC5wcm90b3R5cGUuZHRkTkRhdGE9ZnVuY3Rpb24oZSl7cmV0dXJuIiIrZXx8IiJ9LHQucHJvdG90eXBlLmNvbnZlcnRBdHRLZXk9IkAiLHQucHJvdG90eXBlLmNvbnZlcnRQSUtleT0iPyIsdC5wcm90b3R5cGUuY29udmVydFRleHRLZXk9IiN0ZXh0Iix0LnByb3RvdHlwZS5jb252ZXJ0Q0RhdGFLZXk9IiNjZGF0YSIsdC5wcm90b3R5cGUuY29udmVydENvbW1lbnRLZXk9IiNjb21tZW50Iix0LnByb3RvdHlwZS5jb252ZXJ0UmF3S2V5PSIjcmF3Iix0LnByb3RvdHlwZS5hc3NlcnRMZWdhbENoYXI9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYodD1lLm1hdGNoKC9bXDBcdUZGRkVcdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXS8pKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgaW4gc3RyaW5nOiAiK2UrIiBhdCBpbmRleCAiK3QuaW5kZXgpO3JldHVybiBlfSx0LnByb3RvdHlwZS5lbEVzY2FwZT1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdD10aGlzLm5vRG91YmxlRW5jb2Rpbmc/Lyg/ISZcUys7KSYvZzovJi9nLGUucmVwbGFjZSh0LCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoL1xyL2csIiYjeEQ7Iil9LHQucHJvdG90eXBlLmF0dEVzY2FwZT1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdD10aGlzLm5vRG91YmxlRW5jb2Rpbmc/Lyg/ISZcUys7KSYvZzovJi9nLGUucmVwbGFjZSh0LCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7IikucmVwbGFjZSgvXHQvZywiJiN4OTsiKS5yZXBsYWNlKC9cbi9nLCImI3hBOyIpLnJlcGxhY2UoL1xyL2csIiYjeEQ7Iil9LHR9KCl9LmNhbGwoUSkpLHd1fXZhciBVdSxBdSxrdSxTdT17fSxDdT17Z2V0IGV4cG9ydHMoKXtyZXR1cm4gU3V9LHNldCBleHBvcnRzKGUpe1N1PWV9fSxGdT17fSxPdT17Z2V0IGV4cG9ydHMoKXtyZXR1cm4gRnV9LHNldCBleHBvcnRzKGUpe0Z1PWV9fTtmdW5jdGlvbiBJdSgpe3JldHVybiBVdXx8KFV1PTEsZnVuY3Rpb24oKXt2YXIgZT17fS5oYXNPd25Qcm9wZXJ0eTtPdS5leHBvcnRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbixyLGksYSxvLGMscyxsLHU7Zm9yKG4gaW4gdHx8KHQ9e30pLHRoaXMucHJldHR5PXQucHJldHR5fHwhMSx0aGlzLmFsbG93RW1wdHk9bnVsbCE9KHI9dC5hbGxvd0VtcHR5KSYmcix0aGlzLnByZXR0eT8odGhpcy5pbmRlbnQ9bnVsbCE9KGk9dC5pbmRlbnQpP2k6IiAgIix0aGlzLm5ld2xpbmU9bnVsbCE9KGE9dC5uZXdsaW5lKT9hOiJcbiIsdGhpcy5vZmZzZXQ9bnVsbCE9KG89dC5vZmZzZXQpP286MCx0aGlzLmRvbnRwcmV0dHl0ZXh0bm9kZXM9bnVsbCE9KGM9dC5kb250cHJldHR5dGV4dG5vZGVzKT9jOjApOih0aGlzLmluZGVudD0iIix0aGlzLm5ld2xpbmU9IiIsdGhpcy5vZmZzZXQ9MCx0aGlzLmRvbnRwcmV0dHl0ZXh0bm9kZXM9MCksdGhpcy5zcGFjZWJlZm9yZXNsYXNoPW51bGwhPShzPXQuc3BhY2ViZWZvcmVzbGFzaCk/czoiIiwhMD09PXRoaXMuc3BhY2ViZWZvcmVzbGFzaCYmKHRoaXMuc3BhY2ViZWZvcmVzbGFzaD0iICIpLHRoaXMubmV3bGluZWRlZmF1bHQ9dGhpcy5uZXdsaW5lLHRoaXMucHJldHR5ZGVmYXVsdD10aGlzLnByZXR0eSxsPXQud3JpdGVyfHx7fSllLmNhbGwobCxuKSYmKHU9bFtuXSx0aGlzW25dPXUpfXJldHVybiB0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCl7dmFyIG4scixpO2ZvcihuIGluIHR8fCh0PXt9KSwicHJldHR5ImluIHQmJih0aGlzLnByZXR0eT10LnByZXR0eSksImFsbG93RW1wdHkiaW4gdCYmKHRoaXMuYWxsb3dFbXB0eT10LmFsbG93RW1wdHkpLHRoaXMucHJldHR5Pyh0aGlzLmluZGVudD0iaW5kZW50ImluIHQ/dC5pbmRlbnQ6IiAgIix0aGlzLm5ld2xpbmU9Im5ld2xpbmUiaW4gdD90Lm5ld2xpbmU6IlxuIix0aGlzLm9mZnNldD0ib2Zmc2V0ImluIHQ/dC5vZmZzZXQ6MCx0aGlzLmRvbnRwcmV0dHl0ZXh0bm9kZXM9ImRvbnRwcmV0dHl0ZXh0bm9kZXMiaW4gdD90LmRvbnRwcmV0dHl0ZXh0bm9kZXM6MCk6KHRoaXMuaW5kZW50PSIiLHRoaXMubmV3bGluZT0iIix0aGlzLm9mZnNldD0wLHRoaXMuZG9udHByZXR0eXRleHRub2Rlcz0wKSx0aGlzLnNwYWNlYmVmb3Jlc2xhc2g9InNwYWNlYmVmb3Jlc2xhc2giaW4gdD90LnNwYWNlYmVmb3Jlc2xhc2g6IiIsITA9PT10aGlzLnNwYWNlYmVmb3Jlc2xhc2gmJih0aGlzLnNwYWNlYmVmb3Jlc2xhc2g9IiAiKSx0aGlzLm5ld2xpbmVkZWZhdWx0PXRoaXMubmV3bGluZSx0aGlzLnByZXR0eWRlZmF1bHQ9dGhpcy5wcmV0dHkscj10LndyaXRlcnx8e30pZS5jYWxsKHIsbikmJihpPXJbbl0sdGhpc1tuXT1pKTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuc3BhY2U9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHRoaXMucHJldHR5JiYodD0oZXx8MCkrdGhpcy5vZmZzZXQrMSk+MD9uZXcgQXJyYXkodCkuam9pbih0aGlzLmluZGVudCk6IiJ9LHR9KCl9LmNhbGwoUSkpLEZ1fWZ1bmN0aW9uIFJ1KCl7cmV0dXJuIEF1fHwoQXU9MSxmdW5jdGlvbigpe3ZhciBlLHQsbixyLGksYSxvLGMscyxsLHUsZixkLGgscD17fS5oYXNPd25Qcm9wZXJ0eTtvPUJsKCksYz1ydSgpLGU9U2woKSx0PUlsKCksbD1FbCgpLGY9Y3UoKSxkPWZ1KCksdT1ndSgpLHM9eHUoKSxuPUhsKCkscj1abCgpLGk9WGwoKSxhPW51KCksaD1JdSgpLEN1LmV4cG9ydHM9ZnVuY3Rpb24oaCl7ZnVuY3Rpb24gZyhlKXtnLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZSl9cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpcC5jYWxsKHQsbikmJihlW25dPXRbbl0pO2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPWV9ci5wcm90b3R5cGU9dC5wcm90b3R5cGUsZS5wcm90b3R5cGU9bmV3IHIsZS5fX3N1cGVyX189dC5wcm90b3R5cGV9KGcsaCksZy5wcm90b3R5cGUuZG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIG4scixpLGEsbDtmb3IodGhpcy50ZXh0aXNwcmVzZW50PSExLGE9IiIscj0wLGk9KGw9ZS5jaGlsZHJlbikubGVuZ3RoO3I8aTtyKyspKG49bFtyXSlpbnN0YW5jZW9mIHN8fChhKz1mdW5jdGlvbigpe3N3aXRjaCghMSl7Y2FzZSEobiBpbnN0YW5jZW9mIG8pOnJldHVybiB0aGlzLmRlY2xhcmF0aW9uKG4pO2Nhc2UhKG4gaW5zdGFuY2VvZiBjKTpyZXR1cm4gdGhpcy5kb2NUeXBlKG4pO2Nhc2UhKG4gaW5zdGFuY2VvZiB0KTpyZXR1cm4gdGhpcy5jb21tZW50KG4pO2Nhc2UhKG4gaW5zdGFuY2VvZiB1KTpyZXR1cm4gdGhpcy5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24obik7ZGVmYXVsdDpyZXR1cm4gdGhpcy5lbGVtZW50KG4sMCl9fS5jYWxsKHRoaXMpKTtyZXR1cm4gdGhpcy5wcmV0dHkmJmEuc2xpY2UoLXRoaXMubmV3bGluZS5sZW5ndGgpPT09dGhpcy5uZXdsaW5lJiYoYT1hLnNsaWNlKDAsLXRoaXMubmV3bGluZS5sZW5ndGgpKSxhfSxnLnByb3RvdHlwZS5hdHRyaWJ1dGU9ZnVuY3Rpb24oZSl7cmV0dXJuIiAiK2UubmFtZSsnPSInK2UudmFsdWUrJyInfSxnLnByb3RvdHlwZS5jZGF0YT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnNwYWNlKHQpKyI8IVtDREFUQVsiK2UudGV4dCsiXV0+Iit0aGlzLm5ld2xpbmV9LGcucHJvdG90eXBlLmNvbW1lbnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zcGFjZSh0KSsiXHgzYyEtLSAiK2UudGV4dCsiIC0tXHgzZSIrdGhpcy5uZXdsaW5lfSxnLnByb3RvdHlwZS5kZWNsYXJhdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiBuPXRoaXMuc3BhY2UodCksbis9Jzw/eG1sIHZlcnNpb249IicrZS52ZXJzaW9uKyciJyxudWxsIT1lLmVuY29kaW5nJiYobis9JyBlbmNvZGluZz0iJytlLmVuY29kaW5nKyciJyksbnVsbCE9ZS5zdGFuZGFsb25lJiYobis9JyBzdGFuZGFsb25lPSInK2Uuc3RhbmRhbG9uZSsnIicpLG4rPXRoaXMuc3BhY2ViZWZvcmVzbGFzaCsiPz4iLG4rPXRoaXMubmV3bGluZX0sZy5wcm90b3R5cGUuZG9jVHlwZT1mdW5jdGlvbihvLGMpe3ZhciBzLGwsZixkLGg7aWYoY3x8KGM9MCksZD10aGlzLnNwYWNlKGMpLGQrPSI8IURPQ1RZUEUgIitvLnJvb3QoKS5uYW1lLG8ucHViSUQmJm8uc3lzSUQ/ZCs9JyBQVUJMSUMgIicrby5wdWJJRCsnIiAiJytvLnN5c0lEKyciJzpvLnN5c0lEJiYoZCs9JyBTWVNURU0gIicrby5zeXNJRCsnIicpLG8uY2hpbGRyZW4ubGVuZ3RoPjApe2ZvcihkKz0iIFsiLGQrPXRoaXMubmV3bGluZSxsPTAsZj0oaD1vLmNoaWxkcmVuKS5sZW5ndGg7bDxmO2wrKylzPWhbbF0sZCs9ZnVuY3Rpb24oKXtzd2l0Y2goITEpe2Nhc2UhKHMgaW5zdGFuY2VvZiBuKTpyZXR1cm4gdGhpcy5kdGRBdHRMaXN0KHMsYysxKTtjYXNlIShzIGluc3RhbmNlb2Ygcik6cmV0dXJuIHRoaXMuZHRkRWxlbWVudChzLGMrMSk7Y2FzZSEocyBpbnN0YW5jZW9mIGkpOnJldHVybiB0aGlzLmR0ZEVudGl0eShzLGMrMSk7Y2FzZSEocyBpbnN0YW5jZW9mIGEpOnJldHVybiB0aGlzLmR0ZE5vdGF0aW9uKHMsYysxKTtjYXNlIShzIGluc3RhbmNlb2YgZSk6cmV0dXJuIHRoaXMuY2RhdGEocyxjKzEpO2Nhc2UhKHMgaW5zdGFuY2VvZiB0KTpyZXR1cm4gdGhpcy5jb21tZW50KHMsYysxKTtjYXNlIShzIGluc3RhbmNlb2YgdSk6cmV0dXJuIHRoaXMucHJvY2Vzc2luZ0luc3RydWN0aW9uKHMsYysxKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBEVEQgbm9kZSB0eXBlOiAiK3MuY29uc3RydWN0b3IubmFtZSl9fS5jYWxsKHRoaXMpO2QrPSJdIn1yZXR1cm4gZCs9dGhpcy5zcGFjZWJlZm9yZXNsYXNoKyI+IixkKz10aGlzLm5ld2xpbmV9LGcucHJvdG90eXBlLmVsZW1lbnQ9ZnVuY3Rpb24obixyKXt2YXIgaSxhLG8sYyxoLGcsbSxiLHksdix4LEQsVDtmb3IobSBpbiByfHwocj0wKSxUPSExLHRoaXMudGV4dGlzcHJlc2VudD8odGhpcy5uZXdsaW5lPSIiLHRoaXMucHJldHR5PSExKToodGhpcy5uZXdsaW5lPXRoaXMubmV3bGluZWRlZmF1bHQsdGhpcy5wcmV0dHk9dGhpcy5wcmV0dHlkZWZhdWx0KSxiPSIiLGIrPShEPXRoaXMuc3BhY2UocikpKyI8IituLm5hbWUseT1uLmF0dHJpYnV0ZXMpcC5jYWxsKHksbSkmJihpPXlbbV0sYis9dGhpcy5hdHRyaWJ1dGUoaSkpO2lmKDA9PT1uLmNoaWxkcmVuLmxlbmd0aHx8bi5jaGlsZHJlbi5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIiI9PT1lLnZhbHVlfSkpKXRoaXMuYWxsb3dFbXB0eT9iKz0iPjwvIituLm5hbWUrIj4iK3RoaXMubmV3bGluZTpiKz10aGlzLnNwYWNlYmVmb3Jlc2xhc2grIi8+Iit0aGlzLm5ld2xpbmU7ZWxzZSBpZih0aGlzLnByZXR0eSYmMT09PW4uY2hpbGRyZW4ubGVuZ3RoJiZudWxsIT1uLmNoaWxkcmVuWzBdLnZhbHVlKWIrPSI+IixiKz1uLmNoaWxkcmVuWzBdLnZhbHVlLGIrPSI8LyIrbi5uYW1lKyI+Iit0aGlzLm5ld2xpbmU7ZWxzZXtpZih0aGlzLmRvbnRwcmV0dHl0ZXh0bm9kZXMpZm9yKG89MCxoPSh2PW4uY2hpbGRyZW4pLmxlbmd0aDtvPGg7bysrKWlmKG51bGwhPShhPXZbb10pLnZhbHVlKXt0aGlzLnRleHRpc3ByZXNlbnQrKyxUPSEwO2JyZWFrfWZvcih0aGlzLnRleHRpc3ByZXNlbnQmJih0aGlzLm5ld2xpbmU9IiIsdGhpcy5wcmV0dHk9ITEsRD10aGlzLnNwYWNlKHIpKSxiKz0iPiIrdGhpcy5uZXdsaW5lLGM9MCxnPSh4PW4uY2hpbGRyZW4pLmxlbmd0aDtjPGc7YysrKWE9eFtjXSxiKz1mdW5jdGlvbigpe3N3aXRjaCghMSl7Y2FzZSEoYSBpbnN0YW5jZW9mIGUpOnJldHVybiB0aGlzLmNkYXRhKGEscisxKTtjYXNlIShhIGluc3RhbmNlb2YgdCk6cmV0dXJuIHRoaXMuY29tbWVudChhLHIrMSk7Y2FzZSEoYSBpbnN0YW5jZW9mIGwpOnJldHVybiB0aGlzLmVsZW1lbnQoYSxyKzEpO2Nhc2UhKGEgaW5zdGFuY2VvZiBmKTpyZXR1cm4gdGhpcy5yYXcoYSxyKzEpO2Nhc2UhKGEgaW5zdGFuY2VvZiBkKTpyZXR1cm4gdGhpcy50ZXh0KGEscisxKTtjYXNlIShhIGluc3RhbmNlb2YgdSk6cmV0dXJuIHRoaXMucHJvY2Vzc2luZ0luc3RydWN0aW9uKGEscisxKTtjYXNlIShhIGluc3RhbmNlb2Ygcyk6cmV0dXJuIiI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gWE1MIG5vZGUgdHlwZTogIithLmNvbnN0cnVjdG9yLm5hbWUpfX0uY2FsbCh0aGlzKTtUJiZ0aGlzLnRleHRpc3ByZXNlbnQtLSx0aGlzLnRleHRpc3ByZXNlbnR8fCh0aGlzLm5ld2xpbmU9dGhpcy5uZXdsaW5lZGVmYXVsdCx0aGlzLnByZXR0eT10aGlzLnByZXR0eWRlZmF1bHQpLGIrPUQrIjwvIituLm5hbWUrIj4iK3RoaXMubmV3bGluZX1yZXR1cm4gYn0sZy5wcm90b3R5cGUucHJvY2Vzc2luZ0luc3RydWN0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIG49dGhpcy5zcGFjZSh0KSsiPD8iK2UudGFyZ2V0LGUudmFsdWUmJihuKz0iICIrZS52YWx1ZSksbis9dGhpcy5zcGFjZWJlZm9yZXNsYXNoKyI/PiIrdGhpcy5uZXdsaW5lfSxnLnByb3RvdHlwZS5yYXc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zcGFjZSh0KStlLnZhbHVlK3RoaXMubmV3bGluZX0sZy5wcm90b3R5cGUudGV4dD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnNwYWNlKHQpK2UudmFsdWUrdGhpcy5uZXdsaW5lfSxnLnByb3RvdHlwZS5kdGRBdHRMaXN0PWZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIG49dGhpcy5zcGFjZSh0KSsiPCFBVFRMSVNUICIrZS5lbGVtZW50TmFtZSsiICIrZS5hdHRyaWJ1dGVOYW1lKyIgIitlLmF0dHJpYnV0ZVR5cGUsIiNERUZBVUxUIiE9PWUuZGVmYXVsdFZhbHVlVHlwZSYmKG4rPSIgIitlLmRlZmF1bHRWYWx1ZVR5cGUpLGUuZGVmYXVsdFZhbHVlJiYobis9JyAiJytlLmRlZmF1bHRWYWx1ZSsnIicpLG4rPXRoaXMuc3BhY2ViZWZvcmVzbGFzaCsiPiIrdGhpcy5uZXdsaW5lfSxnLnByb3RvdHlwZS5kdGRFbGVtZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc3BhY2UodCkrIjwhRUxFTUVOVCAiK2UubmFtZSsiICIrZS52YWx1ZSt0aGlzLnNwYWNlYmVmb3Jlc2xhc2grIj4iK3RoaXMubmV3bGluZX0sZy5wcm90b3R5cGUuZHRkRW50aXR5PWZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIG49dGhpcy5zcGFjZSh0KSsiPCFFTlRJVFkiLGUucGUmJihuKz0iICUiKSxuKz0iICIrZS5uYW1lLGUudmFsdWU/bis9JyAiJytlLnZhbHVlKyciJzooZS5wdWJJRCYmZS5zeXNJRD9uKz0nIFBVQkxJQyAiJytlLnB1YklEKyciICInK2Uuc3lzSUQrJyInOmUuc3lzSUQmJihuKz0nIFNZU1RFTSAiJytlLnN5c0lEKyciJyksZS5uRGF0YSYmKG4rPSIgTkRBVEEgIitlLm5EYXRhKSksbis9dGhpcy5zcGFjZWJlZm9yZXNsYXNoKyI+Iit0aGlzLm5ld2xpbmV9LGcucHJvdG90eXBlLmR0ZE5vdGF0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIG49dGhpcy5zcGFjZSh0KSsiPCFOT1RBVElPTiAiK2UubmFtZSxlLnB1YklEJiZlLnN5c0lEP24rPScgUFVCTElDICInK2UucHViSUQrJyIgIicrZS5zeXNJRCsnIic6ZS5wdWJJRD9uKz0nIFBVQkxJQyAiJytlLnB1YklEKyciJzplLnN5c0lEJiYobis9JyBTWVNURU0gIicrZS5zeXNJRCsnIicpLG4rPXRoaXMuc3BhY2ViZWZvcmVzbGFzaCsiPiIrdGhpcy5uZXdsaW5lfSxnLnByb3RvdHlwZS5vcGVuTm9kZT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxhO2lmKHR8fCh0PTApLGUgaW5zdGFuY2VvZiBsKXtmb3IociBpbiBpPXRoaXMuc3BhY2UodCkrIjwiK2UubmFtZSxhPWUuYXR0cmlidXRlcylwLmNhbGwoYSxyKSYmKG49YVtyXSxpKz10aGlzLmF0dHJpYnV0ZShuKSk7cmV0dXJuIGkrPShlLmNoaWxkcmVuPyI+IjoiLz4iKSt0aGlzLm5ld2xpbmV9cmV0dXJuIGk9dGhpcy5zcGFjZSh0KSsiPCFET0NUWVBFICIrZS5yb290Tm9kZU5hbWUsZS5wdWJJRCYmZS5zeXNJRD9pKz0nIFBVQkxJQyAiJytlLnB1YklEKyciICInK2Uuc3lzSUQrJyInOmUuc3lzSUQmJihpKz0nIFNZU1RFTSAiJytlLnN5c0lEKyciJyksaSs9KGUuY2hpbGRyZW4/IiBbIjoiPiIpK3RoaXMubmV3bGluZX0sZy5wcm90b3R5cGUuY2xvc2VOb2RlPWZ1bmN0aW9uKGUsdCl7c3dpdGNoKHR8fCh0PTApLCExKXtjYXNlIShlIGluc3RhbmNlb2YgbCk6cmV0dXJuIHRoaXMuc3BhY2UodCkrIjwvIitlLm5hbWUrIj4iK3RoaXMubmV3bGluZTtjYXNlIShlIGluc3RhbmNlb2YgYyk6cmV0dXJuIHRoaXMuc3BhY2UodCkrIl0+Iit0aGlzLm5ld2xpbmV9fSxnfShoKX0uY2FsbChRKSksU3V9ZnVuY3Rpb24gTnUoKXtyZXR1cm4ga3V8fChrdT0xLGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaT17fS5oYXNPd25Qcm9wZXJ0eTtyPWhsKCkuaXNQbGFpbk9iamVjdCxlPUR1KCksbj1FdSgpLHQ9UnUoKSxibC5leHBvcnRzPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGEoZSl7YS5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLG51bGwpLHRoaXMubmFtZT0iP3htbCIsZXx8KGU9e30pLGUud3JpdGVyfHwoZS53cml0ZXI9bmV3IHQpLHRoaXMub3B0aW9ucz1lLHRoaXMuc3RyaW5naWZ5PW5ldyBuKGUpLHRoaXMuaXNEb2N1bWVudD0hMH1yZXR1cm4gZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdClpLmNhbGwodCxuKSYmKGVbbl09dFtuXSk7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9ZX1yLnByb3RvdHlwZT10LnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgcixlLl9fc3VwZXJfXz10LnByb3RvdHlwZX0oYSxlKSxhLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGU/cihlKSYmKHQ9ZSxlPXRoaXMub3B0aW9ucy53cml0ZXIuc2V0KHQpKTplPXRoaXMub3B0aW9ucy53cml0ZXIsZS5kb2N1bWVudCh0aGlzKX0sYS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KGUpLmRvY3VtZW50KHRoaXMpfSxhfShlKX0uY2FsbChRKSksbWx9dmFyIFB1LEJ1PXt9LFd1PXtnZXQgZXhwb3J0cygpe3JldHVybiBCdX0sc2V0IGV4cG9ydHMoZSl7QnU9ZX19O2Z1bmN0aW9uIEx1KCl7cmV0dXJuIFB1fHwoUHU9MSxmdW5jdGlvbigpe3ZhciBlLHQsbixyLGksYSxvLGMscyxsLHUsZixkLGgscCxnLG0sYix5LHYseD17fS5oYXNPd25Qcm9wZXJ0eTt2PWhsKCksYj12LmlzT2JqZWN0LG09di5pc0Z1bmN0aW9uLHk9di5pc1BsYWluT2JqZWN0LGc9di5nZXRWYWx1ZSxsPUVsKCksdD1TbCgpLG49SWwoKSxmPWN1KCkscD1mdSgpLHU9Z3UoKSxjPUJsKCkscz1ydSgpLHI9SGwoKSxhPVhsKCksaT1abCgpLG89bnUoKSxlPV9sKCksaD1FdSgpLGQ9UnUoKSxXdS5leHBvcnRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdihlLHQsbil7dmFyIHI7dGhpcy5uYW1lPSI/eG1sIixlfHwoZT17fSksZS53cml0ZXI/eShlLndyaXRlcikmJihyPWUud3JpdGVyLGUud3JpdGVyPW5ldyBkKHIpKTplLndyaXRlcj1uZXcgZChlKSx0aGlzLm9wdGlvbnM9ZSx0aGlzLndyaXRlcj1lLndyaXRlcix0aGlzLnN0cmluZ2lmeT1uZXcgaChlKSx0aGlzLm9uRGF0YUNhbGxiYWNrPXR8fGZ1bmN0aW9uKCl7fSx0aGlzLm9uRW5kQ2FsbGJhY2s9bnx8ZnVuY3Rpb24oKXt9LHRoaXMuY3VycmVudE5vZGU9bnVsbCx0aGlzLmN1cnJlbnRMZXZlbD0tMSx0aGlzLm9wZW5UYWdzPXt9LHRoaXMuZG9jdW1lbnRTdGFydGVkPSExLHRoaXMuZG9jdW1lbnRDb21wbGV0ZWQ9ITEsdGhpcy5yb290PW51bGx9cmV0dXJuIHYucHJvdG90eXBlLm5vZGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYobnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoIk1pc3Npbmcgbm9kZSBuYW1lLiIpO2lmKHRoaXMucm9vdCYmLTE9PT10aGlzLmN1cnJlbnRMZXZlbCl0aHJvdyBuZXcgRXJyb3IoIkRvY3VtZW50IGNhbiBvbmx5IGhhdmUgb25lIHJvb3Qgbm9kZS4gIit0aGlzLmRlYnVnSW5mbyhlKSk7cmV0dXJuIHRoaXMub3BlbkN1cnJlbnQoKSxlPWcoZSksbnVsbD09PXQmJm51bGw9PW4mJih0PShyPVt7fSxudWxsXSlbMF0sbj1yWzFdKSxudWxsPT10JiYodD17fSksdD1nKHQpLGIodCl8fChuPShpPVt0LG5dKVswXSx0PWlbMV0pLHRoaXMuY3VycmVudE5vZGU9bmV3IGwodGhpcyxlLHQpLHRoaXMuY3VycmVudE5vZGUuY2hpbGRyZW49ITEsdGhpcy5jdXJyZW50TGV2ZWwrKyx0aGlzLm9wZW5UYWdzW3RoaXMuY3VycmVudExldmVsXT10aGlzLmN1cnJlbnROb2RlLG51bGwhPW4mJnRoaXMudGV4dChuKSx0aGlzfSx2LnByb3RvdHlwZS5lbGVtZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5jdXJyZW50Tm9kZSYmdGhpcy5jdXJyZW50Tm9kZSBpbnN0YW5jZW9mIHM/dGhpcy5kdGRFbGVtZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLm5vZGUoZSx0LG4pfSx2LnByb3RvdHlwZS5hdHRyaWJ1dGU9ZnVuY3Rpb24odCxuKXt2YXIgcixpO2lmKCF0aGlzLmN1cnJlbnROb2RlfHx0aGlzLmN1cnJlbnROb2RlLmNoaWxkcmVuKXRocm93IG5ldyBFcnJvcigiYXR0KCkgY2FuIG9ubHkgYmUgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBhbiBlbGUoKSBjYWxsIGluIGNhbGxiYWNrIG1vZGUuICIrdGhpcy5kZWJ1Z0luZm8odCkpO2lmKG51bGwhPXQmJih0PWcodCkpLGIodCkpZm9yKHIgaW4gdCl4LmNhbGwodCxyKSYmKGk9dFtyXSx0aGlzLmF0dHJpYnV0ZShyLGkpKTtlbHNlIG0obikmJihuPW4uYXBwbHkoKSksdGhpcy5vcHRpb25zLnNraXBOdWxsQXR0cmlidXRlcyYmbnVsbD09bnx8KHRoaXMuY3VycmVudE5vZGUuYXR0cmlidXRlc1t0XT1uZXcgZSh0aGlzLHQsbikpO3JldHVybiB0aGlzfSx2LnByb3RvdHlwZS50ZXh0PWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0aGlzLm9wZW5DdXJyZW50KCksdD1uZXcgcCh0aGlzLGUpLHRoaXMub25EYXRhKHRoaXMud3JpdGVyLnRleHQodCx0aGlzLmN1cnJlbnRMZXZlbCsxKSx0aGlzLmN1cnJlbnRMZXZlbCsxKSx0aGlzfSx2LnByb3RvdHlwZS5jZGF0YT1mdW5jdGlvbihlKXt2YXIgbjtyZXR1cm4gdGhpcy5vcGVuQ3VycmVudCgpLG49bmV3IHQodGhpcyxlKSx0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5jZGF0YShuLHRoaXMuY3VycmVudExldmVsKzEpLHRoaXMuY3VycmVudExldmVsKzEpLHRoaXN9LHYucHJvdG90eXBlLmNvbW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHRoaXMub3BlbkN1cnJlbnQoKSx0PW5ldyBuKHRoaXMsZSksdGhpcy5vbkRhdGEodGhpcy53cml0ZXIuY29tbWVudCh0LHRoaXMuY3VycmVudExldmVsKzEpLHRoaXMuY3VycmVudExldmVsKzEpLHRoaXN9LHYucHJvdG90eXBlLnJhdz1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpcy5vcGVuQ3VycmVudCgpLHQ9bmV3IGYodGhpcyxlKSx0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5yYXcodCx0aGlzLmN1cnJlbnRMZXZlbCsxKSx0aGlzLmN1cnJlbnRMZXZlbCsxKSx0aGlzfSx2LnByb3RvdHlwZS5pbnN0cnVjdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxhLG87aWYodGhpcy5vcGVuQ3VycmVudCgpLG51bGwhPWUmJihlPWcoZSkpLG51bGwhPXQmJih0PWcodCkpLEFycmF5LmlzQXJyYXkoZSkpZm9yKG49MCxhPWUubGVuZ3RoO248YTtuKyspcj1lW25dLHRoaXMuaW5zdHJ1Y3Rpb24ocik7ZWxzZSBpZihiKGUpKWZvcihyIGluIGUpeC5jYWxsKGUscikmJihpPWVbcl0sdGhpcy5pbnN0cnVjdGlvbihyLGkpKTtlbHNlIG0odCkmJih0PXQuYXBwbHkoKSksbz1uZXcgdSh0aGlzLGUsdCksdGhpcy5vbkRhdGEodGhpcy53cml0ZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKG8sdGhpcy5jdXJyZW50TGV2ZWwrMSksdGhpcy5jdXJyZW50TGV2ZWwrMSk7cmV0dXJuIHRoaXN9LHYucHJvdG90eXBlLmRlY2xhcmF0aW9uPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZih0aGlzLm9wZW5DdXJyZW50KCksdGhpcy5kb2N1bWVudFN0YXJ0ZWQpdGhyb3cgbmV3IEVycm9yKCJkZWNsYXJhdGlvbigpIG11c3QgYmUgdGhlIGZpcnN0IG5vZGUuIik7cmV0dXJuIHI9bmV3IGModGhpcyxlLHQsbiksdGhpcy5vbkRhdGEodGhpcy53cml0ZXIuZGVjbGFyYXRpb24ocix0aGlzLmN1cnJlbnRMZXZlbCsxKSx0aGlzLmN1cnJlbnRMZXZlbCsxKSx0aGlzfSx2LnByb3RvdHlwZS5kb2N0eXBlPWZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLm9wZW5DdXJyZW50KCksbnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoIk1pc3Npbmcgcm9vdCBub2RlIG5hbWUuIik7aWYodGhpcy5yb290KXRocm93IG5ldyBFcnJvcigiZHRkKCkgbXVzdCBjb21lIGJlZm9yZSB0aGUgcm9vdCBub2RlLiIpO3JldHVybiB0aGlzLmN1cnJlbnROb2RlPW5ldyBzKHRoaXMsdCxuKSx0aGlzLmN1cnJlbnROb2RlLnJvb3ROb2RlTmFtZT1lLHRoaXMuY3VycmVudE5vZGUuY2hpbGRyZW49ITEsdGhpcy5jdXJyZW50TGV2ZWwrKyx0aGlzLm9wZW5UYWdzW3RoaXMuY3VycmVudExldmVsXT10aGlzLmN1cnJlbnROb2RlLHRoaXN9LHYucHJvdG90eXBlLmR0ZEVsZW1lbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gdGhpcy5vcGVuQ3VycmVudCgpLG49bmV3IGkodGhpcyxlLHQpLHRoaXMub25EYXRhKHRoaXMud3JpdGVyLmR0ZEVsZW1lbnQobix0aGlzLmN1cnJlbnRMZXZlbCsxKSx0aGlzLmN1cnJlbnRMZXZlbCsxKSx0aGlzfSx2LnByb3RvdHlwZS5hdHRMaXN0PWZ1bmN0aW9uKGUsdCxuLGksYSl7dmFyIG87cmV0dXJuIHRoaXMub3BlbkN1cnJlbnQoKSxvPW5ldyByKHRoaXMsZSx0LG4saSxhKSx0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5kdGRBdHRMaXN0KG8sdGhpcy5jdXJyZW50TGV2ZWwrMSksdGhpcy5jdXJyZW50TGV2ZWwrMSksdGhpc30sdi5wcm90b3R5cGUuZW50aXR5PWZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIHRoaXMub3BlbkN1cnJlbnQoKSxuPW5ldyBhKHRoaXMsITEsZSx0KSx0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5kdGRFbnRpdHkobix0aGlzLmN1cnJlbnRMZXZlbCsxKSx0aGlzLmN1cnJlbnRMZXZlbCsxKSx0aGlzfSx2LnByb3RvdHlwZS5wRW50aXR5PWZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIHRoaXMub3BlbkN1cnJlbnQoKSxuPW5ldyBhKHRoaXMsITAsZSx0KSx0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5kdGRFbnRpdHkobix0aGlzLmN1cnJlbnRMZXZlbCsxKSx0aGlzLmN1cnJlbnRMZXZlbCsxKSx0aGlzfSx2LnByb3RvdHlwZS5ub3RhdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiB0aGlzLm9wZW5DdXJyZW50KCksbj1uZXcgbyh0aGlzLGUsdCksdGhpcy5vbkRhdGEodGhpcy53cml0ZXIuZHRkTm90YXRpb24obix0aGlzLmN1cnJlbnRMZXZlbCsxKSx0aGlzLmN1cnJlbnRMZXZlbCsxKSx0aGlzfSx2LnByb3RvdHlwZS51cD1mdW5jdGlvbigpe2lmKHRoaXMuY3VycmVudExldmVsPDApdGhyb3cgbmV3IEVycm9yKCJUaGUgZG9jdW1lbnQgbm9kZSBoYXMgbm8gcGFyZW50LiIpO3JldHVybiB0aGlzLmN1cnJlbnROb2RlPyh0aGlzLmN1cnJlbnROb2RlLmNoaWxkcmVuP3RoaXMuY2xvc2VOb2RlKHRoaXMuY3VycmVudE5vZGUpOnRoaXMub3Blbk5vZGUodGhpcy5jdXJyZW50Tm9kZSksdGhpcy5jdXJyZW50Tm9kZT1udWxsKTp0aGlzLmNsb3NlTm9kZSh0aGlzLm9wZW5UYWdzW3RoaXMuY3VycmVudExldmVsXSksZGVsZXRlIHRoaXMub3BlblRhZ3NbdGhpcy5jdXJyZW50TGV2ZWxdLHRoaXMuY3VycmVudExldmVsLS0sdGhpc30sdi5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLmN1cnJlbnRMZXZlbD49MDspdGhpcy51cCgpO3JldHVybiB0aGlzLm9uRW5kKCl9LHYucHJvdG90eXBlLm9wZW5DdXJyZW50PWZ1bmN0aW9uKCl7aWYodGhpcy5jdXJyZW50Tm9kZSlyZXR1cm4gdGhpcy5jdXJyZW50Tm9kZS5jaGlsZHJlbj0hMCx0aGlzLm9wZW5Ob2RlKHRoaXMuY3VycmVudE5vZGUpfSx2LnByb3RvdHlwZS5vcGVuTm9kZT1mdW5jdGlvbihlKXtpZighZS5pc09wZW4pcmV0dXJuIXRoaXMucm9vdCYmMD09PXRoaXMuY3VycmVudExldmVsJiZlIGluc3RhbmNlb2YgbCYmKHRoaXMucm9vdD1lKSx0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5vcGVuTm9kZShlLHRoaXMuY3VycmVudExldmVsKSx0aGlzLmN1cnJlbnRMZXZlbCksZS5pc09wZW49ITB9LHYucHJvdG90eXBlLmNsb3NlTm9kZT1mdW5jdGlvbihlKXtpZighZS5pc0Nsb3NlZClyZXR1cm4gdGhpcy5vbkRhdGEodGhpcy53cml0ZXIuY2xvc2VOb2RlKGUsdGhpcy5jdXJyZW50TGV2ZWwpLHRoaXMuY3VycmVudExldmVsKSxlLmlzQ2xvc2VkPSEwfSx2LnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5kb2N1bWVudFN0YXJ0ZWQ9ITAsdGhpcy5vbkRhdGFDYWxsYmFjayhlLHQrMSl9LHYucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jdW1lbnRDb21wbGV0ZWQ9ITAsdGhpcy5vbkVuZENhbGxiYWNrKCl9LHYucHJvdG90eXBlLmRlYnVnSW5mbz1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjoibm9kZTogPCIrZSsiPiJ9LHYucHJvdG90eXBlLmVsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx2LnByb3RvdHlwZS5ub2Q9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm5vZGUoZSx0LG4pfSx2LnByb3RvdHlwZS50eHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGV4dChlKX0sdi5wcm90b3R5cGUuZGF0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNkYXRhKGUpfSx2LnByb3RvdHlwZS5jb209ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29tbWVudChlKX0sdi5wcm90b3R5cGUuaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuaW5zdHJ1Y3Rpb24oZSx0KX0sdi5wcm90b3R5cGUuZGVjPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbihlLHQsbil9LHYucHJvdG90eXBlLmR0ZD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuZG9jdHlwZShlLHQsbil9LHYucHJvdG90eXBlLmU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmVsZW1lbnQoZSx0LG4pfSx2LnByb3RvdHlwZS5uPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5ub2RlKGUsdCxuKX0sdi5wcm90b3R5cGUudD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50ZXh0KGUpfSx2LnByb3RvdHlwZS5kPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNkYXRhKGUpfSx2LnByb3RvdHlwZS5jPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbW1lbnQoZSl9LHYucHJvdG90eXBlLnI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmF3KGUpfSx2LnByb3RvdHlwZS5pPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuaW5zdHJ1Y3Rpb24oZSx0KX0sdi5wcm90b3R5cGUuYXR0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VycmVudE5vZGUmJnRoaXMuY3VycmVudE5vZGUgaW5zdGFuY2VvZiBzP3RoaXMuYXR0TGlzdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hdHRyaWJ1dGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx2LnByb3RvdHlwZS5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VycmVudE5vZGUmJnRoaXMuY3VycmVudE5vZGUgaW5zdGFuY2VvZiBzP3RoaXMuYXR0TGlzdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hdHRyaWJ1dGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx2LnByb3RvdHlwZS5lbnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbnRpdHkoZSx0KX0sdi5wcm90b3R5cGUucGVudD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnBFbnRpdHkoZSx0KX0sdi5wcm90b3R5cGUubm90PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubm90YXRpb24oZSx0KX0sdn0oKX0uY2FsbChRKSksQnV9dmFyIE11LGp1PXt9LHp1PXtnZXQgZXhwb3J0cygpe3JldHVybiBqdX0sc2V0IGV4cG9ydHMoZSl7anU9ZX19O2Z1bmN0aW9uIEh1KCl7cmV0dXJuIE11fHwoTXU9MSxmdW5jdGlvbigpe3ZhciBlLHQsbixyLGksYSxvLGMscyxsLHUsZixkLGgscD17fS5oYXNPd25Qcm9wZXJ0eTtvPUJsKCksYz1ydSgpLGU9U2woKSx0PUlsKCksbD1FbCgpLGY9Y3UoKSxkPWZ1KCksdT1ndSgpLHM9eHUoKSxuPUhsKCkscj1abCgpLGk9WGwoKSxhPW51KCksaD1JdSgpLHp1LmV4cG9ydHM9ZnVuY3Rpb24oaCl7ZnVuY3Rpb24gZyhlLHQpe2cuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcyx0KSx0aGlzLnN0cmVhbT1lfXJldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXAuY2FsbCh0LG4pJiYoZVtuXT10W25dKTtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXIucHJvdG90eXBlPXQucHJvdG90eXBlLGUucHJvdG90eXBlPW5ldyByLGUuX19zdXBlcl9fPXQucHJvdG90eXBlfShnLGgpLGcucHJvdG90eXBlLmRvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciBuLHIsaSxhLGwsZixkLGg7Zm9yKHI9MCxhPShmPWUuY2hpbGRyZW4pLmxlbmd0aDtyPGE7cisrKShuPWZbcl0pLmlzTGFzdFJvb3ROb2RlPSExO2ZvcihlLmNoaWxkcmVuW2UuY2hpbGRyZW4ubGVuZ3RoLTFdLmlzTGFzdFJvb3ROb2RlPSEwLGg9W10saT0wLGw9KGQ9ZS5jaGlsZHJlbikubGVuZ3RoO2k8bDtpKyspaWYoISgobj1kW2ldKWluc3RhbmNlb2Ygcykpc3dpdGNoKCExKXtjYXNlIShuIGluc3RhbmNlb2Ygbyk6aC5wdXNoKHRoaXMuZGVjbGFyYXRpb24obikpO2JyZWFrO2Nhc2UhKG4gaW5zdGFuY2VvZiBjKTpoLnB1c2godGhpcy5kb2NUeXBlKG4pKTticmVhaztjYXNlIShuIGluc3RhbmNlb2YgdCk6aC5wdXNoKHRoaXMuY29tbWVudChuKSk7YnJlYWs7Y2FzZSEobiBpbnN0YW5jZW9mIHUpOmgucHVzaCh0aGlzLnByb2Nlc3NpbmdJbnN0cnVjdGlvbihuKSk7YnJlYWs7ZGVmYXVsdDpoLnB1c2godGhpcy5lbGVtZW50KG4pKX1yZXR1cm4gaH0sZy5wcm90b3R5cGUuYXR0cmlidXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnN0cmVhbS53cml0ZSgiICIrZS5uYW1lKyc9IicrZS52YWx1ZSsnIicpfSxnLnByb3RvdHlwZS5jZGF0YT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLnNwYWNlKHQpKyI8IVtDREFUQVsiK2UudGV4dCsiXV0+Iit0aGlzLmVuZGxpbmUoZSkpfSxnLnByb3RvdHlwZS5jb21tZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuc3BhY2UodCkrIlx4M2MhLS0gIitlLnRleHQrIiAtLVx4M2UiK3RoaXMuZW5kbGluZShlKSl9LGcucHJvdG90eXBlLmRlY2xhcmF0aW9uPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuc3BhY2UodCkpLHRoaXMuc3RyZWFtLndyaXRlKCc8P3htbCB2ZXJzaW9uPSInK2UudmVyc2lvbisnIicpLG51bGwhPWUuZW5jb2RpbmcmJnRoaXMuc3RyZWFtLndyaXRlKCcgZW5jb2Rpbmc9IicrZS5lbmNvZGluZysnIicpLG51bGwhPWUuc3RhbmRhbG9uZSYmdGhpcy5zdHJlYW0ud3JpdGUoJyBzdGFuZGFsb25lPSInK2Uuc3RhbmRhbG9uZSsnIicpLHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuc3BhY2ViZWZvcmVzbGFzaCsiPz4iKSx0aGlzLnN0cmVhbS53cml0ZSh0aGlzLmVuZGxpbmUoZSkpfSxnLnByb3RvdHlwZS5kb2NUeXBlPWZ1bmN0aW9uKG8sYyl7dmFyIHMsbCxmLGQ7aWYoY3x8KGM9MCksdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZShjKSksdGhpcy5zdHJlYW0ud3JpdGUoIjwhRE9DVFlQRSAiK28ucm9vdCgpLm5hbWUpLG8ucHViSUQmJm8uc3lzSUQ/dGhpcy5zdHJlYW0ud3JpdGUoJyBQVUJMSUMgIicrby5wdWJJRCsnIiAiJytvLnN5c0lEKyciJyk6by5zeXNJRCYmdGhpcy5zdHJlYW0ud3JpdGUoJyBTWVNURU0gIicrby5zeXNJRCsnIicpLG8uY2hpbGRyZW4ubGVuZ3RoPjApe2Zvcih0aGlzLnN0cmVhbS53cml0ZSgiIFsiKSx0aGlzLnN0cmVhbS53cml0ZSh0aGlzLmVuZGxpbmUobykpLGw9MCxmPShkPW8uY2hpbGRyZW4pLmxlbmd0aDtsPGY7bCsrKXN3aXRjaChzPWRbbF0sITEpe2Nhc2UhKHMgaW5zdGFuY2VvZiBuKTp0aGlzLmR0ZEF0dExpc3QocyxjKzEpO2JyZWFrO2Nhc2UhKHMgaW5zdGFuY2VvZiByKTp0aGlzLmR0ZEVsZW1lbnQocyxjKzEpO2JyZWFrO2Nhc2UhKHMgaW5zdGFuY2VvZiBpKTp0aGlzLmR0ZEVudGl0eShzLGMrMSk7YnJlYWs7Y2FzZSEocyBpbnN0YW5jZW9mIGEpOnRoaXMuZHRkTm90YXRpb24ocyxjKzEpO2JyZWFrO2Nhc2UhKHMgaW5zdGFuY2VvZiBlKTp0aGlzLmNkYXRhKHMsYysxKTticmVhaztjYXNlIShzIGluc3RhbmNlb2YgdCk6dGhpcy5jb21tZW50KHMsYysxKTticmVhaztjYXNlIShzIGluc3RhbmNlb2YgdSk6dGhpcy5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ocyxjKzEpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIERURCBub2RlIHR5cGU6ICIrcy5jb25zdHJ1Y3Rvci5uYW1lKX10aGlzLnN0cmVhbS53cml0ZSgiXSIpfXJldHVybiB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLnNwYWNlYmVmb3Jlc2xhc2grIj4iKSx0aGlzLnN0cmVhbS53cml0ZSh0aGlzLmVuZGxpbmUobykpfSxnLnByb3RvdHlwZS5lbGVtZW50PWZ1bmN0aW9uKG4scil7dmFyIGksYSxvLGMsaCxnLG0sYjtmb3IoaCBpbiByfHwocj0wKSxiPXRoaXMuc3BhY2UociksdGhpcy5zdHJlYW0ud3JpdGUoYisiPCIrbi5uYW1lKSxnPW4uYXR0cmlidXRlcylwLmNhbGwoZyxoKSYmKGk9Z1toXSx0aGlzLmF0dHJpYnV0ZShpKSk7aWYoMD09PW4uY2hpbGRyZW4ubGVuZ3RofHxuLmNoaWxkcmVuLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4iIj09PWUudmFsdWV9KSkpdGhpcy5hbGxvd0VtcHR5P3RoaXMuc3RyZWFtLndyaXRlKCI+PC8iK24ubmFtZSsiPiIpOnRoaXMuc3RyZWFtLndyaXRlKHRoaXMuc3BhY2ViZWZvcmVzbGFzaCsiLz4iKTtlbHNlIGlmKHRoaXMucHJldHR5JiYxPT09bi5jaGlsZHJlbi5sZW5ndGgmJm51bGwhPW4uY2hpbGRyZW5bMF0udmFsdWUpdGhpcy5zdHJlYW0ud3JpdGUoIj4iKSx0aGlzLnN0cmVhbS53cml0ZShuLmNoaWxkcmVuWzBdLnZhbHVlKSx0aGlzLnN0cmVhbS53cml0ZSgiPC8iK24ubmFtZSsiPiIpO2Vsc2V7Zm9yKHRoaXMuc3RyZWFtLndyaXRlKCI+Iit0aGlzLm5ld2xpbmUpLG89MCxjPShtPW4uY2hpbGRyZW4pLmxlbmd0aDtvPGM7bysrKXN3aXRjaChhPW1bb10sITEpe2Nhc2UhKGEgaW5zdGFuY2VvZiBlKTp0aGlzLmNkYXRhKGEscisxKTticmVhaztjYXNlIShhIGluc3RhbmNlb2YgdCk6dGhpcy5jb21tZW50KGEscisxKTticmVhaztjYXNlIShhIGluc3RhbmNlb2YgbCk6dGhpcy5lbGVtZW50KGEscisxKTticmVhaztjYXNlIShhIGluc3RhbmNlb2YgZik6dGhpcy5yYXcoYSxyKzEpO2JyZWFrO2Nhc2UhKGEgaW5zdGFuY2VvZiBkKTp0aGlzLnRleHQoYSxyKzEpO2JyZWFrO2Nhc2UhKGEgaW5zdGFuY2VvZiB1KTp0aGlzLnByb2Nlc3NpbmdJbnN0cnVjdGlvbihhLHIrMSk7YnJlYWs7Y2FzZSEoYSBpbnN0YW5jZW9mIHMpOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIFhNTCBub2RlIHR5cGU6ICIrYS5jb25zdHJ1Y3Rvci5uYW1lKX10aGlzLnN0cmVhbS53cml0ZShiKyI8LyIrbi5uYW1lKyI+Iil9cmV0dXJuIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuZW5kbGluZShuKSl9LGcucHJvdG90eXBlLnByb2Nlc3NpbmdJbnN0cnVjdGlvbj1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLnNwYWNlKHQpKyI8PyIrZS50YXJnZXQpLGUudmFsdWUmJnRoaXMuc3RyZWFtLndyaXRlKCIgIitlLnZhbHVlKSx0aGlzLnN0cmVhbS53cml0ZSh0aGlzLnNwYWNlYmVmb3Jlc2xhc2grIj8+Iit0aGlzLmVuZGxpbmUoZSkpfSxnLnByb3RvdHlwZS5yYXc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZSh0KStlLnZhbHVlK3RoaXMuZW5kbGluZShlKSl9LGcucHJvdG90eXBlLnRleHQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZSh0KStlLnZhbHVlK3RoaXMuZW5kbGluZShlKSl9LGcucHJvdG90eXBlLmR0ZEF0dExpc3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZSh0KSsiPCFBVFRMSVNUICIrZS5lbGVtZW50TmFtZSsiICIrZS5hdHRyaWJ1dGVOYW1lKyIgIitlLmF0dHJpYnV0ZVR5cGUpLCIjREVGQVVMVCIhPT1lLmRlZmF1bHRWYWx1ZVR5cGUmJnRoaXMuc3RyZWFtLndyaXRlKCIgIitlLmRlZmF1bHRWYWx1ZVR5cGUpLGUuZGVmYXVsdFZhbHVlJiZ0aGlzLnN0cmVhbS53cml0ZSgnICInK2UuZGVmYXVsdFZhbHVlKyciJyksdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZWJlZm9yZXNsYXNoKyI+Iit0aGlzLmVuZGxpbmUoZSkpfSxnLnByb3RvdHlwZS5kdGRFbGVtZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuc3BhY2UodCkrIjwhRUxFTUVOVCAiK2UubmFtZSsiICIrZS52YWx1ZSksdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZWJlZm9yZXNsYXNoKyI+Iit0aGlzLmVuZGxpbmUoZSkpfSxnLnByb3RvdHlwZS5kdGRFbnRpdHk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZSh0KSsiPCFFTlRJVFkiKSxlLnBlJiZ0aGlzLnN0cmVhbS53cml0ZSgiICUiKSx0aGlzLnN0cmVhbS53cml0ZSgiICIrZS5uYW1lKSxlLnZhbHVlP3RoaXMuc3RyZWFtLndyaXRlKCcgIicrZS52YWx1ZSsnIicpOihlLnB1YklEJiZlLnN5c0lEP3RoaXMuc3RyZWFtLndyaXRlKCcgUFVCTElDICInK2UucHViSUQrJyIgIicrZS5zeXNJRCsnIicpOmUuc3lzSUQmJnRoaXMuc3RyZWFtLndyaXRlKCcgU1lTVEVNICInK2Uuc3lzSUQrJyInKSxlLm5EYXRhJiZ0aGlzLnN0cmVhbS53cml0ZSgiIE5EQVRBICIrZS5uRGF0YSkpLHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuc3BhY2ViZWZvcmVzbGFzaCsiPiIrdGhpcy5lbmRsaW5lKGUpKX0sZy5wcm90b3R5cGUuZHRkTm90YXRpb249ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZSh0KSsiPCFOT1RBVElPTiAiK2UubmFtZSksZS5wdWJJRCYmZS5zeXNJRD90aGlzLnN0cmVhbS53cml0ZSgnIFBVQkxJQyAiJytlLnB1YklEKyciICInK2Uuc3lzSUQrJyInKTplLnB1YklEP3RoaXMuc3RyZWFtLndyaXRlKCcgUFVCTElDICInK2UucHViSUQrJyInKTplLnN5c0lEJiZ0aGlzLnN0cmVhbS53cml0ZSgnIFNZU1RFTSAiJytlLnN5c0lEKyciJyksdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZWJlZm9yZXNsYXNoKyI+Iit0aGlzLmVuZGxpbmUoZSkpfSxnLnByb3RvdHlwZS5lbmRsaW5lPWZ1bmN0aW9uKGUpe3JldHVybiBlLmlzTGFzdFJvb3ROb2RlPyIiOnRoaXMubmV3bGluZX0sZ30oaCl9LmNhbGwoUSkpLGp1fShmdW5jdGlvbigpe3ZhciBlLHQsbixyLGksYSxvO289aGwoKSxpPW8uYXNzaWduLGE9by5pc0Z1bmN0aW9uLGU9TnUoKSx0PUx1KCkscj1SdSgpLG49SHUoKSxmbC5jcmVhdGU9ZnVuY3Rpb24odCxuLHIsYSl7dmFyIG8sYztpZihudWxsPT10KXRocm93IG5ldyBFcnJvcigiUm9vdCBlbGVtZW50IG5lZWRzIGEgbmFtZS4iKTtyZXR1cm4gYT1pKHt9LG4scixhKSxjPShvPW5ldyBlKGEpKS5lbGVtZW50KHQpLGEuaGVhZGxlc3N8fChvLmRlY2xhcmF0aW9uKGEpLG51bGw9PWEucHViSUQmJm51bGw9PWEuc3lzSUR8fG8uZG9jdHlwZShhKSksY30sZmwuYmVnaW49ZnVuY3Rpb24obixyLGkpe3ZhciBvO3JldHVybiBhKG4pJiYocj0obz1bbixyXSlbMF0saT1vWzFdLG49e30pLHI/bmV3IHQobixyLGkpOm5ldyBlKG4pfSxmbC5zdHJpbmdXcml0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyByKGUpfSxmbC5zdHJlYW1Xcml0ZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IG4oZSx0KX19KS5jYWxsKFEpO3ZhciBWdT1McixxdT1mbDtmdW5jdGlvbiBHdShlLHQpe2UudGV4dCh0LnZhbHVlKX11bC53cml0ZVN0cmluZz1mdW5jdGlvbihlLHQpe3ZhciBuPVZ1LmludmVydCh0KSxyPXtlbGVtZW50OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5lbGVtZW50KGEodC5uYW1lKSx0LmF0dHJpYnV0ZXMpO3QuY2hpbGRyZW4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7aShuLGUpfSkpfSx0ZXh0Okd1fTtmdW5jdGlvbiBpKGUsdCl7cmV0dXJuIHJbdC50eXBlXShlLHQpfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9L15ceyguKilcfSguKikkLy5leGVjKGUpO2lmKHQpe3ZhciByPW5bdFsxXV07cmV0dXJuIHIrKCIiPT09cj8iIjoiOiIpK3RbMl19cmV0dXJuIGV9cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPXF1LmNyZWF0ZShhKGUubmFtZSkse3ZlcnNpb246IjEuMCIsZW5jb2Rpbmc6IlVURi04IixzdGFuZGFsb25lOiEwfSk7cmV0dXJuIFZ1LmZvckVhY2godCwoZnVuY3Rpb24oZSx0KXt2YXIgcj0ieG1sbnMiKygiIj09PXQ/IiI6IjoiK3QpO24uYXR0cmlidXRlKHIsZSl9KSksZS5jaGlsZHJlbi5mb3JFYWNoKChmdW5jdGlvbihlKXtpKG4sZSl9KSksbi5lbmQoKX0oZSl9O3ZhciBYdT1CbztQby5FbGVtZW50PVh1LkVsZW1lbnQsUG8uZWxlbWVudD1YdS5lbGVtZW50LFBvLnRleHQ9WHUudGV4dCxQby5yZWFkU3RyaW5nPUhvLnJlYWRTdHJpbmcsUG8ud3JpdGVTdHJpbmc9dWwud3JpdGVTdHJpbmc7dmFyICR1PUxyLFl1PW5pLEt1PVBvO05vLnJlYWQ9SnUsTm8ucmVhZFhtbEZyb21aaXBGaWxlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuZXhpc3RzKHQpP2UucmVhZCh0LCJ1dGYtOCIpLnRoZW4oUXUpLnRoZW4oSnUpOll1LnJlc29sdmUobnVsbCl9O3ZhciBadT17Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy93b3JkcHJvY2Vzc2luZ21sLzIwMDYvbWFpbiI6InciLCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIjoiciIsImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi93b3JkcHJvY2Vzc2luZ0RyYXdpbmciOiJ3cCIsImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9tYWluIjoiYSIsImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9waWN0dXJlIjoicGljIiwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9jb250ZW50LXR5cGVzIjoiY29udGVudC10eXBlcyIsInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sIjoidiIsImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9tYXJrdXAtY29tcGF0aWJpbGl0eS8yMDA2IjoibWMiLCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIjoib2ZmaWNlLXdvcmQifTtmdW5jdGlvbiBKdShlKXtyZXR1cm4gS3UucmVhZFN0cmluZyhlLFp1KS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gZWYoZSlbMF19KSl9ZnVuY3Rpb24gUXUoZSl7cmV0dXJuIGUucmVwbGFjZSgvXlx1RkVGRi9nLCIiKX1mdW5jdGlvbiBlZihlKXtyZXR1cm4iZWxlbWVudCI9PT1lLnR5cGU/Im1jOkFsdGVybmF0ZUNvbnRlbnQiPT09ZS5uYW1lP2UuZmlyc3QoIm1jOkZhbGxiYWNrIikuY2hpbGRyZW46KGUuY2hpbGRyZW49JHUuZmxhdHRlbihlLmNoaWxkcmVuLm1hcChlZiwhMCkpLFtlXSk6W2VdfXZhciB0Zj17fSxuZj17fSxyZj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmYsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3JmLmRlZmF1bHQ9W3siVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMzIiLCJEaW5nYmF0IGhleCI6IjIwIiwiVW5pY29kZSBkZWMiOiIzMiIsIlVuaWNvZGUgaGV4IjoiMjAifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjMzIiwiRGluZ2JhdCBoZXgiOiIyMSIsIlVuaWNvZGUgZGVjIjoiMzMiLCJVbmljb2RlIGhleCI6IjIxIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIzNCIsIkRpbmdiYXQgaGV4IjoiMjIiLCJVbmljb2RlIGRlYyI6Ijg3MDQiLCJVbmljb2RlIGhleCI6IjIyMDAifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjM1IiwiRGluZ2JhdCBoZXgiOiIyMyIsIlVuaWNvZGUgZGVjIjoiMzUiLCJVbmljb2RlIGhleCI6IjIzIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIzNiIsIkRpbmdiYXQgaGV4IjoiMjQiLCJVbmljb2RlIGRlYyI6Ijg3MDciLCJVbmljb2RlIGhleCI6IjIyMDMifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjM3IiwiRGluZ2JhdCBoZXgiOiIyNSIsIlVuaWNvZGUgZGVjIjoiMzciLCJVbmljb2RlIGhleCI6IjI1In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIzOCIsIkRpbmdiYXQgaGV4IjoiMjYiLCJVbmljb2RlIGRlYyI6IjM4IiwiVW5pY29kZSBoZXgiOiIyNiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMzkiLCJEaW5nYmF0IGhleCI6IjI3IiwiVW5pY29kZSBkZWMiOiI4NzE3IiwiVW5pY29kZSBoZXgiOiIyMjBEIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI0MCIsIkRpbmdiYXQgaGV4IjoiMjgiLCJVbmljb2RlIGRlYyI6IjQwIiwiVW5pY29kZSBoZXgiOiIyOCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiNDEiLCJEaW5nYmF0IGhleCI6IjI5IiwiVW5pY29kZSBkZWMiOiI0MSIsIlVuaWNvZGUgaGV4IjoiMjkifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjQyIiwiRGluZ2JhdCBoZXgiOiIyQSIsIlVuaWNvZGUgZGVjIjoiNDIiLCJVbmljb2RlIGhleCI6IjJBIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI0MyIsIkRpbmdiYXQgaGV4IjoiMkIiLCJVbmljb2RlIGRlYyI6IjQzIiwiVW5pY29kZSBoZXgiOiIyQiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiNDQiLCJEaW5nYmF0IGhleCI6IjJDIiwiVW5pY29kZSBkZWMiOiI0NCIsIlVuaWNvZGUgaGV4IjoiMkMifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjQ1IiwiRGluZ2JhdCBoZXgiOiIyRCIsIlVuaWNvZGUgZGVjIjoiODcyMiIsIlVuaWNvZGUgaGV4IjoiMjIxMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiNDYiLCJEaW5nYmF0IGhleCI6IjJFIiwiVW5pY29kZSBkZWMiOiI0NiIsIlVuaWNvZGUgaGV4IjoiMkUifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjQ3IiwiRGluZ2JhdCBoZXgiOiIyRiIsIlVuaWNvZGUgZGVjIjoiNDciLCJVbmljb2RlIGhleCI6IjJGIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI0OCIsIkRpbmdiYXQgaGV4IjoiMzAiLCJVbmljb2RlIGRlYyI6IjQ4IiwiVW5pY29kZSBoZXgiOiIzMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiNDkiLCJEaW5nYmF0IGhleCI6IjMxIiwiVW5pY29kZSBkZWMiOiI0OSIsIlVuaWNvZGUgaGV4IjoiMzEifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjUwIiwiRGluZ2JhdCBoZXgiOiIzMiIsIlVuaWNvZGUgZGVjIjoiNTAiLCJVbmljb2RlIGhleCI6IjMyIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI1MSIsIkRpbmdiYXQgaGV4IjoiMzMiLCJVbmljb2RlIGRlYyI6IjUxIiwiVW5pY29kZSBoZXgiOiIzMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiNTIiLCJEaW5nYmF0IGhleCI6IjM0IiwiVW5pY29kZSBkZWMiOiI1MiIsIlVuaWNvZGUgaGV4IjoiMzQifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjUzIiwiRGluZ2JhdCBoZXgiOiIzNSIsIlVuaWNvZGUgZGVjIjoiNTMiLCJVbmljb2RlIGhleCI6IjM1In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI1NCIsIkRpbmdiYXQgaGV4IjoiMzYiLCJVbmljb2RlIGRlYyI6IjU0IiwiVW5pY29kZSBoZXgiOiIzNiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiNTUiLCJEaW5nYmF0IGhleCI6IjM3IiwiVW5pY29kZSBkZWMiOiI1NSIsIlVuaWNvZGUgaGV4IjoiMzcifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjU2IiwiRGluZ2JhdCBoZXgiOiIzOCIsIlVuaWNvZGUgZGVjIjoiNTYiLCJVbmljb2RlIGhleCI6IjM4In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI1NyIsIkRpbmdiYXQgaGV4IjoiMzkiLCJVbmljb2RlIGRlYyI6IjU3IiwiVW5pY29kZSBoZXgiOiIzOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiNTgiLCJEaW5nYmF0IGhleCI6IjNBIiwiVW5pY29kZSBkZWMiOiI1OCIsIlVuaWNvZGUgaGV4IjoiM0EifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjU5IiwiRGluZ2JhdCBoZXgiOiIzQiIsIlVuaWNvZGUgZGVjIjoiNTkiLCJVbmljb2RlIGhleCI6IjNCIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI2MCIsIkRpbmdiYXQgaGV4IjoiM0MiLCJVbmljb2RlIGRlYyI6IjYwIiwiVW5pY29kZSBoZXgiOiIzQyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiNjEiLCJEaW5nYmF0IGhleCI6IjNEIiwiVW5pY29kZSBkZWMiOiI2MSIsIlVuaWNvZGUgaGV4IjoiM0QifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjYyIiwiRGluZ2JhdCBoZXgiOiIzRSIsIlVuaWNvZGUgZGVjIjoiNjIiLCJVbmljb2RlIGhleCI6IjNFIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI2MyIsIkRpbmdiYXQgaGV4IjoiM0YiLCJVbmljb2RlIGRlYyI6IjYzIiwiVW5pY29kZSBoZXgiOiIzRiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiNjQiLCJEaW5nYmF0IGhleCI6IjQwIiwiVW5pY29kZSBkZWMiOiI4NzczIiwiVW5pY29kZSBoZXgiOiIyMjQ1In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI2NSIsIkRpbmdiYXQgaGV4IjoiNDEiLCJVbmljb2RlIGRlYyI6IjkxMyIsIlVuaWNvZGUgaGV4IjoiMzkxIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI2NiIsIkRpbmdiYXQgaGV4IjoiNDIiLCJVbmljb2RlIGRlYyI6IjkxNCIsIlVuaWNvZGUgaGV4IjoiMzkyIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI2NyIsIkRpbmdiYXQgaGV4IjoiNDMiLCJVbmljb2RlIGRlYyI6IjkzNSIsIlVuaWNvZGUgaGV4IjoiM0E3In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI2OCIsIkRpbmdiYXQgaGV4IjoiNDQiLCJVbmljb2RlIGRlYyI6IjkxNiIsIlVuaWNvZGUgaGV4IjoiMzk0In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI2OSIsIkRpbmdiYXQgaGV4IjoiNDUiLCJVbmljb2RlIGRlYyI6IjkxNyIsIlVuaWNvZGUgaGV4IjoiMzk1In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI3MCIsIkRpbmdiYXQgaGV4IjoiNDYiLCJVbmljb2RlIGRlYyI6IjkzNCIsIlVuaWNvZGUgaGV4IjoiM0E2In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI3MSIsIkRpbmdiYXQgaGV4IjoiNDciLCJVbmljb2RlIGRlYyI6IjkxNSIsIlVuaWNvZGUgaGV4IjoiMzkzIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI3MiIsIkRpbmdiYXQgaGV4IjoiNDgiLCJVbmljb2RlIGRlYyI6IjkxOSIsIlVuaWNvZGUgaGV4IjoiMzk3In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI3MyIsIkRpbmdiYXQgaGV4IjoiNDkiLCJVbmljb2RlIGRlYyI6IjkyMSIsIlVuaWNvZGUgaGV4IjoiMzk5In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI3NCIsIkRpbmdiYXQgaGV4IjoiNEEiLCJVbmljb2RlIGRlYyI6Ijk3NyIsIlVuaWNvZGUgaGV4IjoiM0QxIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI3NSIsIkRpbmdiYXQgaGV4IjoiNEIiLCJVbmljb2RlIGRlYyI6IjkyMiIsIlVuaWNvZGUgaGV4IjoiMzlBIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI3NiIsIkRpbmdiYXQgaGV4IjoiNEMiLCJVbmljb2RlIGRlYyI6IjkyMyIsIlVuaWNvZGUgaGV4IjoiMzlCIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI3NyIsIkRpbmdiYXQgaGV4IjoiNEQiLCJVbmljb2RlIGRlYyI6IjkyNCIsIlVuaWNvZGUgaGV4IjoiMzlDIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI3OCIsIkRpbmdiYXQgaGV4IjoiNEUiLCJVbmljb2RlIGRlYyI6IjkyNSIsIlVuaWNvZGUgaGV4IjoiMzlEIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI3OSIsIkRpbmdiYXQgaGV4IjoiNEYiLCJVbmljb2RlIGRlYyI6IjkyNyIsIlVuaWNvZGUgaGV4IjoiMzlGIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI4MCIsIkRpbmdiYXQgaGV4IjoiNTAiLCJVbmljb2RlIGRlYyI6IjkyOCIsIlVuaWNvZGUgaGV4IjoiM0EwIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI4MSIsIkRpbmdiYXQgaGV4IjoiNTEiLCJVbmljb2RlIGRlYyI6IjkyMCIsIlVuaWNvZGUgaGV4IjoiMzk4In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI4MiIsIkRpbmdiYXQgaGV4IjoiNTIiLCJVbmljb2RlIGRlYyI6IjkyOSIsIlVuaWNvZGUgaGV4IjoiM0ExIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI4MyIsIkRpbmdiYXQgaGV4IjoiNTMiLCJVbmljb2RlIGRlYyI6IjkzMSIsIlVuaWNvZGUgaGV4IjoiM0EzIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI4NCIsIkRpbmdiYXQgaGV4IjoiNTQiLCJVbmljb2RlIGRlYyI6IjkzMiIsIlVuaWNvZGUgaGV4IjoiM0E0In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI4NSIsIkRpbmdiYXQgaGV4IjoiNTUiLCJVbmljb2RlIGRlYyI6IjkzMyIsIlVuaWNvZGUgaGV4IjoiM0E1In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI4NiIsIkRpbmdiYXQgaGV4IjoiNTYiLCJVbmljb2RlIGRlYyI6Ijk2MiIsIlVuaWNvZGUgaGV4IjoiM0MyIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI4NyIsIkRpbmdiYXQgaGV4IjoiNTciLCJVbmljb2RlIGRlYyI6IjkzNyIsIlVuaWNvZGUgaGV4IjoiM0E5In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI4OCIsIkRpbmdiYXQgaGV4IjoiNTgiLCJVbmljb2RlIGRlYyI6IjkyNiIsIlVuaWNvZGUgaGV4IjoiMzlFIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI4OSIsIkRpbmdiYXQgaGV4IjoiNTkiLCJVbmljb2RlIGRlYyI6IjkzNiIsIlVuaWNvZGUgaGV4IjoiM0E4In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI5MCIsIkRpbmdiYXQgaGV4IjoiNUEiLCJVbmljb2RlIGRlYyI6IjkxOCIsIlVuaWNvZGUgaGV4IjoiMzk2In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI5MSIsIkRpbmdiYXQgaGV4IjoiNUIiLCJVbmljb2RlIGRlYyI6IjkxIiwiVW5pY29kZSBoZXgiOiI1QiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiOTIiLCJEaW5nYmF0IGhleCI6IjVDIiwiVW5pY29kZSBkZWMiOiI4NzU2IiwiVW5pY29kZSBoZXgiOiIyMjM0In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI5MyIsIkRpbmdiYXQgaGV4IjoiNUQiLCJVbmljb2RlIGRlYyI6IjkzIiwiVW5pY29kZSBoZXgiOiI1RCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiOTQiLCJEaW5nYmF0IGhleCI6IjVFIiwiVW5pY29kZSBkZWMiOiI4ODY5IiwiVW5pY29kZSBoZXgiOiIyMkE1In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI5NSIsIkRpbmdiYXQgaGV4IjoiNUYiLCJVbmljb2RlIGRlYyI6Ijk1IiwiVW5pY29kZSBoZXgiOiI1RiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiOTYiLCJEaW5nYmF0IGhleCI6IjYwIiwiVW5pY29kZSBkZWMiOiI4MjU0IiwiVW5pY29kZSBoZXgiOiIyMDNFIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI5NyIsIkRpbmdiYXQgaGV4IjoiNjEiLCJVbmljb2RlIGRlYyI6Ijk0NSIsIlVuaWNvZGUgaGV4IjoiM0IxIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI5OCIsIkRpbmdiYXQgaGV4IjoiNjIiLCJVbmljb2RlIGRlYyI6Ijk0NiIsIlVuaWNvZGUgaGV4IjoiM0IyIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiI5OSIsIkRpbmdiYXQgaGV4IjoiNjMiLCJVbmljb2RlIGRlYyI6Ijk2NyIsIlVuaWNvZGUgaGV4IjoiM0M3In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIxMDAiLCJEaW5nYmF0IGhleCI6IjY0IiwiVW5pY29kZSBkZWMiOiI5NDgiLCJVbmljb2RlIGhleCI6IjNCNCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTAxIiwiRGluZ2JhdCBoZXgiOiI2NSIsIlVuaWNvZGUgZGVjIjoiOTQ5IiwiVW5pY29kZSBoZXgiOiIzQjUifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjEwMiIsIkRpbmdiYXQgaGV4IjoiNjYiLCJVbmljb2RlIGRlYyI6Ijk2NiIsIlVuaWNvZGUgaGV4IjoiM0M2In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIxMDMiLCJEaW5nYmF0IGhleCI6IjY3IiwiVW5pY29kZSBkZWMiOiI5NDciLCJVbmljb2RlIGhleCI6IjNCMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTA0IiwiRGluZ2JhdCBoZXgiOiI2OCIsIlVuaWNvZGUgZGVjIjoiOTUxIiwiVW5pY29kZSBoZXgiOiIzQjcifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjEwNSIsIkRpbmdiYXQgaGV4IjoiNjkiLCJVbmljb2RlIGRlYyI6Ijk1MyIsIlVuaWNvZGUgaGV4IjoiM0I5In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIxMDYiLCJEaW5nYmF0IGhleCI6IjZBIiwiVW5pY29kZSBkZWMiOiI5ODEiLCJVbmljb2RlIGhleCI6IjNENSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTA3IiwiRGluZ2JhdCBoZXgiOiI2QiIsIlVuaWNvZGUgZGVjIjoiOTU0IiwiVW5pY29kZSBoZXgiOiIzQkEifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjEwOCIsIkRpbmdiYXQgaGV4IjoiNkMiLCJVbmljb2RlIGRlYyI6Ijk1NSIsIlVuaWNvZGUgaGV4IjoiM0JCIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIxMDkiLCJEaW5nYmF0IGhleCI6IjZEIiwiVW5pY29kZSBkZWMiOiI5NTYiLCJVbmljb2RlIGhleCI6IjNCQyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTEwIiwiRGluZ2JhdCBoZXgiOiI2RSIsIlVuaWNvZGUgZGVjIjoiOTU3IiwiVW5pY29kZSBoZXgiOiIzQkQifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjExMSIsIkRpbmdiYXQgaGV4IjoiNkYiLCJVbmljb2RlIGRlYyI6Ijk1OSIsIlVuaWNvZGUgaGV4IjoiM0JGIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIxMTIiLCJEaW5nYmF0IGhleCI6IjcwIiwiVW5pY29kZSBkZWMiOiI5NjAiLCJVbmljb2RlIGhleCI6IjNDMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTEzIiwiRGluZ2JhdCBoZXgiOiI3MSIsIlVuaWNvZGUgZGVjIjoiOTUyIiwiVW5pY29kZSBoZXgiOiIzQjgifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjExNCIsIkRpbmdiYXQgaGV4IjoiNzIiLCJVbmljb2RlIGRlYyI6Ijk2MSIsIlVuaWNvZGUgaGV4IjoiM0MxIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIxMTUiLCJEaW5nYmF0IGhleCI6IjczIiwiVW5pY29kZSBkZWMiOiI5NjMiLCJVbmljb2RlIGhleCI6IjNDMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTE2IiwiRGluZ2JhdCBoZXgiOiI3NCIsIlVuaWNvZGUgZGVjIjoiOTY0IiwiVW5pY29kZSBoZXgiOiIzQzQifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjExNyIsIkRpbmdiYXQgaGV4IjoiNzUiLCJVbmljb2RlIGRlYyI6Ijk2NSIsIlVuaWNvZGUgaGV4IjoiM0M1In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIxMTgiLCJEaW5nYmF0IGhleCI6Ijc2IiwiVW5pY29kZSBkZWMiOiI5ODIiLCJVbmljb2RlIGhleCI6IjNENiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTE5IiwiRGluZ2JhdCBoZXgiOiI3NyIsIlVuaWNvZGUgZGVjIjoiOTY5IiwiVW5pY29kZSBoZXgiOiIzQzkifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjEyMCIsIkRpbmdiYXQgaGV4IjoiNzgiLCJVbmljb2RlIGRlYyI6Ijk1OCIsIlVuaWNvZGUgaGV4IjoiM0JFIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIxMjEiLCJEaW5nYmF0IGhleCI6Ijc5IiwiVW5pY29kZSBkZWMiOiI5NjgiLCJVbmljb2RlIGhleCI6IjNDOCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTIyIiwiRGluZ2JhdCBoZXgiOiI3QSIsIlVuaWNvZGUgZGVjIjoiOTUwIiwiVW5pY29kZSBoZXgiOiIzQjYifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjEyMyIsIkRpbmdiYXQgaGV4IjoiN0IiLCJVbmljb2RlIGRlYyI6IjEyMyIsIlVuaWNvZGUgaGV4IjoiN0IifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjEyNCIsIkRpbmdiYXQgaGV4IjoiN0MiLCJVbmljb2RlIGRlYyI6IjEyNCIsIlVuaWNvZGUgaGV4IjoiN0MifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjEyNSIsIkRpbmdiYXQgaGV4IjoiN0QiLCJVbmljb2RlIGRlYyI6IjEyNSIsIlVuaWNvZGUgaGV4IjoiN0QifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjEyNiIsIkRpbmdiYXQgaGV4IjoiN0UiLCJVbmljb2RlIGRlYyI6IjEyNiIsIlVuaWNvZGUgaGV4IjoiN0UifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjE2MCIsIkRpbmdiYXQgaGV4IjoiQTAiLCJVbmljb2RlIGRlYyI6IjgzNjQiLCJVbmljb2RlIGhleCI6IjIwQUMifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjE2MSIsIkRpbmdiYXQgaGV4IjoiQTEiLCJVbmljb2RlIGRlYyI6Ijk3OCIsIlVuaWNvZGUgaGV4IjoiM0QyIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIxNjIiLCJEaW5nYmF0IGhleCI6IkEyIiwiVW5pY29kZSBkZWMiOiI4MjQyIiwiVW5pY29kZSBoZXgiOiIyMDMyIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIxNjMiLCJEaW5nYmF0IGhleCI6IkEzIiwiVW5pY29kZSBkZWMiOiI4ODA0IiwiVW5pY29kZSBoZXgiOiIyMjY0In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIxNjQiLCJEaW5nYmF0IGhleCI6IkE0IiwiVW5pY29kZSBkZWMiOiI4MjYwIiwiVW5pY29kZSBoZXgiOiIyMDQ0In0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIxNjUiLCJEaW5nYmF0IGhleCI6IkE1IiwiVW5pY29kZSBkZWMiOiI4NzM0IiwiVW5pY29kZSBoZXgiOiIyMjFFIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIxNjYiLCJEaW5nYmF0IGhleCI6IkE2IiwiVW5pY29kZSBkZWMiOiI0MDIiLCJVbmljb2RlIGhleCI6IjE5MiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTY3IiwiRGluZ2JhdCBoZXgiOiJBNyIsIlVuaWNvZGUgZGVjIjoiOTgyNyIsIlVuaWNvZGUgaGV4IjoiMjY2MyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTY4IiwiRGluZ2JhdCBoZXgiOiJBOCIsIlVuaWNvZGUgZGVjIjoiOTgzMCIsIlVuaWNvZGUgaGV4IjoiMjY2NiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTY5IiwiRGluZ2JhdCBoZXgiOiJBOSIsIlVuaWNvZGUgZGVjIjoiOTgyOSIsIlVuaWNvZGUgaGV4IjoiMjY2NSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTcwIiwiRGluZ2JhdCBoZXgiOiJBQSIsIlVuaWNvZGUgZGVjIjoiOTgyNCIsIlVuaWNvZGUgaGV4IjoiMjY2MCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTcxIiwiRGluZ2JhdCBoZXgiOiJBQiIsIlVuaWNvZGUgZGVjIjoiODU5NiIsIlVuaWNvZGUgaGV4IjoiMjE5NCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTcyIiwiRGluZ2JhdCBoZXgiOiJBQyIsIlVuaWNvZGUgZGVjIjoiODU5MiIsIlVuaWNvZGUgaGV4IjoiMjE5MCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTczIiwiRGluZ2JhdCBoZXgiOiJBRCIsIlVuaWNvZGUgZGVjIjoiODU5MyIsIlVuaWNvZGUgaGV4IjoiMjE5MSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTc0IiwiRGluZ2JhdCBoZXgiOiJBRSIsIlVuaWNvZGUgZGVjIjoiODU5NCIsIlVuaWNvZGUgaGV4IjoiMjE5MiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTc1IiwiRGluZ2JhdCBoZXgiOiJBRiIsIlVuaWNvZGUgZGVjIjoiODU5NSIsIlVuaWNvZGUgaGV4IjoiMjE5MyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTc2IiwiRGluZ2JhdCBoZXgiOiJCMCIsIlVuaWNvZGUgZGVjIjoiMTc2IiwiVW5pY29kZSBoZXgiOiJCMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTc3IiwiRGluZ2JhdCBoZXgiOiJCMSIsIlVuaWNvZGUgZGVjIjoiMTc3IiwiVW5pY29kZSBoZXgiOiJCMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTc4IiwiRGluZ2JhdCBoZXgiOiJCMiIsIlVuaWNvZGUgZGVjIjoiODI0MyIsIlVuaWNvZGUgaGV4IjoiMjAzMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTc5IiwiRGluZ2JhdCBoZXgiOiJCMyIsIlVuaWNvZGUgZGVjIjoiODgwNSIsIlVuaWNvZGUgaGV4IjoiMjI2NSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTgwIiwiRGluZ2JhdCBoZXgiOiJCNCIsIlVuaWNvZGUgZGVjIjoiMjE1IiwiVW5pY29kZSBoZXgiOiJENyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTgxIiwiRGluZ2JhdCBoZXgiOiJCNSIsIlVuaWNvZGUgZGVjIjoiODczMyIsIlVuaWNvZGUgaGV4IjoiMjIxRCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTgyIiwiRGluZ2JhdCBoZXgiOiJCNiIsIlVuaWNvZGUgZGVjIjoiODcwNiIsIlVuaWNvZGUgaGV4IjoiMjIwMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTgzIiwiRGluZ2JhdCBoZXgiOiJCNyIsIlVuaWNvZGUgZGVjIjoiODIyNiIsIlVuaWNvZGUgaGV4IjoiMjAyMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTg0IiwiRGluZ2JhdCBoZXgiOiJCOCIsIlVuaWNvZGUgZGVjIjoiMjQ3IiwiVW5pY29kZSBoZXgiOiJGNyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTg1IiwiRGluZ2JhdCBoZXgiOiJCOSIsIlVuaWNvZGUgZGVjIjoiODgwMCIsIlVuaWNvZGUgaGV4IjoiMjI2MCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTg2IiwiRGluZ2JhdCBoZXgiOiJCQSIsIlVuaWNvZGUgZGVjIjoiODgwMSIsIlVuaWNvZGUgaGV4IjoiMjI2MSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTg3IiwiRGluZ2JhdCBoZXgiOiJCQiIsIlVuaWNvZGUgZGVjIjoiODc3NiIsIlVuaWNvZGUgaGV4IjoiMjI0OCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTg4IiwiRGluZ2JhdCBoZXgiOiJCQyIsIlVuaWNvZGUgZGVjIjoiODIzMCIsIlVuaWNvZGUgaGV4IjoiMjAyNiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTg5IiwiRGluZ2JhdCBoZXgiOiJCRCIsIlVuaWNvZGUgZGVjIjoiOTE2OCIsIlVuaWNvZGUgaGV4IjoiMjNEMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTkwIiwiRGluZ2JhdCBoZXgiOiJCRSIsIlVuaWNvZGUgZGVjIjoiOTEzNSIsIlVuaWNvZGUgaGV4IjoiMjNBRiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTkxIiwiRGluZ2JhdCBoZXgiOiJCRiIsIlVuaWNvZGUgZGVjIjoiODYyOSIsIlVuaWNvZGUgaGV4IjoiMjFCNSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTkyIiwiRGluZ2JhdCBoZXgiOiJDMCIsIlVuaWNvZGUgZGVjIjoiODUwMSIsIlVuaWNvZGUgaGV4IjoiMjEzNSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTkzIiwiRGluZ2JhdCBoZXgiOiJDMSIsIlVuaWNvZGUgZGVjIjoiODQ2NSIsIlVuaWNvZGUgaGV4IjoiMjExMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTk0IiwiRGluZ2JhdCBoZXgiOiJDMiIsIlVuaWNvZGUgZGVjIjoiODQ3NiIsIlVuaWNvZGUgaGV4IjoiMjExQyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTk1IiwiRGluZ2JhdCBoZXgiOiJDMyIsIlVuaWNvZGUgZGVjIjoiODQ3MiIsIlVuaWNvZGUgaGV4IjoiMjExOCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTk2IiwiRGluZ2JhdCBoZXgiOiJDNCIsIlVuaWNvZGUgZGVjIjoiODg1NSIsIlVuaWNvZGUgaGV4IjoiMjI5NyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTk3IiwiRGluZ2JhdCBoZXgiOiJDNSIsIlVuaWNvZGUgZGVjIjoiODg1MyIsIlVuaWNvZGUgaGV4IjoiMjI5NSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTk4IiwiRGluZ2JhdCBoZXgiOiJDNiIsIlVuaWNvZGUgZGVjIjoiODcwOSIsIlVuaWNvZGUgaGV4IjoiMjIwNSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMTk5IiwiRGluZ2JhdCBoZXgiOiJDNyIsIlVuaWNvZGUgZGVjIjoiODc0NSIsIlVuaWNvZGUgaGV4IjoiMjIyOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjAwIiwiRGluZ2JhdCBoZXgiOiJDOCIsIlVuaWNvZGUgZGVjIjoiODc0NiIsIlVuaWNvZGUgaGV4IjoiMjIyQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjAxIiwiRGluZ2JhdCBoZXgiOiJDOSIsIlVuaWNvZGUgZGVjIjoiODgzNSIsIlVuaWNvZGUgaGV4IjoiMjI4MyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjAyIiwiRGluZ2JhdCBoZXgiOiJDQSIsIlVuaWNvZGUgZGVjIjoiODgzOSIsIlVuaWNvZGUgaGV4IjoiMjI4NyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjAzIiwiRGluZ2JhdCBoZXgiOiJDQiIsIlVuaWNvZGUgZGVjIjoiODgzNiIsIlVuaWNvZGUgaGV4IjoiMjI4NCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjA0IiwiRGluZ2JhdCBoZXgiOiJDQyIsIlVuaWNvZGUgZGVjIjoiODgzNCIsIlVuaWNvZGUgaGV4IjoiMjI4MiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjA1IiwiRGluZ2JhdCBoZXgiOiJDRCIsIlVuaWNvZGUgZGVjIjoiODgzOCIsIlVuaWNvZGUgaGV4IjoiMjI4NiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjA2IiwiRGluZ2JhdCBoZXgiOiJDRSIsIlVuaWNvZGUgZGVjIjoiODcxMiIsIlVuaWNvZGUgaGV4IjoiMjIwOCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjA3IiwiRGluZ2JhdCBoZXgiOiJDRiIsIlVuaWNvZGUgZGVjIjoiODcxMyIsIlVuaWNvZGUgaGV4IjoiMjIwOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjA4IiwiRGluZ2JhdCBoZXgiOiJEMCIsIlVuaWNvZGUgZGVjIjoiODczNiIsIlVuaWNvZGUgaGV4IjoiMjIyMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjA5IiwiRGluZ2JhdCBoZXgiOiJEMSIsIlVuaWNvZGUgZGVjIjoiODcxMSIsIlVuaWNvZGUgaGV4IjoiMjIwNyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjEwIiwiRGluZ2JhdCBoZXgiOiJEMiIsIlVuaWNvZGUgZGVjIjoiMTc0IiwiVW5pY29kZSBoZXgiOiJBRSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjExIiwiRGluZ2JhdCBoZXgiOiJEMyIsIlVuaWNvZGUgZGVjIjoiMTY5IiwiVW5pY29kZSBoZXgiOiJBOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjEyIiwiRGluZ2JhdCBoZXgiOiJENCIsIlVuaWNvZGUgZGVjIjoiODQ4MiIsIlVuaWNvZGUgaGV4IjoiMjEyMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjEzIiwiRGluZ2JhdCBoZXgiOiJENSIsIlVuaWNvZGUgZGVjIjoiODcxOSIsIlVuaWNvZGUgaGV4IjoiMjIwRiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjE0IiwiRGluZ2JhdCBoZXgiOiJENiIsIlVuaWNvZGUgZGVjIjoiODczMCIsIlVuaWNvZGUgaGV4IjoiMjIxQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjE1IiwiRGluZ2JhdCBoZXgiOiJENyIsIlVuaWNvZGUgZGVjIjoiODkwMSIsIlVuaWNvZGUgaGV4IjoiMjJDNSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjE2IiwiRGluZ2JhdCBoZXgiOiJEOCIsIlVuaWNvZGUgZGVjIjoiMTcyIiwiVW5pY29kZSBoZXgiOiJBQyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjE3IiwiRGluZ2JhdCBoZXgiOiJEOSIsIlVuaWNvZGUgZGVjIjoiODc0MyIsIlVuaWNvZGUgaGV4IjoiMjIyNyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjE4IiwiRGluZ2JhdCBoZXgiOiJEQSIsIlVuaWNvZGUgZGVjIjoiODc0NCIsIlVuaWNvZGUgaGV4IjoiMjIyOCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjE5IiwiRGluZ2JhdCBoZXgiOiJEQiIsIlVuaWNvZGUgZGVjIjoiODY2MCIsIlVuaWNvZGUgaGV4IjoiMjFENCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjIwIiwiRGluZ2JhdCBoZXgiOiJEQyIsIlVuaWNvZGUgZGVjIjoiODY1NiIsIlVuaWNvZGUgaGV4IjoiMjFEMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjIxIiwiRGluZ2JhdCBoZXgiOiJERCIsIlVuaWNvZGUgZGVjIjoiODY1NyIsIlVuaWNvZGUgaGV4IjoiMjFEMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjIyIiwiRGluZ2JhdCBoZXgiOiJERSIsIlVuaWNvZGUgZGVjIjoiODY1OCIsIlVuaWNvZGUgaGV4IjoiMjFEMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjIzIiwiRGluZ2JhdCBoZXgiOiJERiIsIlVuaWNvZGUgZGVjIjoiODY1OSIsIlVuaWNvZGUgaGV4IjoiMjFEMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjI0IiwiRGluZ2JhdCBoZXgiOiJFMCIsIlVuaWNvZGUgZGVjIjoiOTY3NCIsIlVuaWNvZGUgaGV4IjoiMjVDQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjI1IiwiRGluZ2JhdCBoZXgiOiJFMSIsIlVuaWNvZGUgZGVjIjoiMTIyOTYiLCJVbmljb2RlIGhleCI6IjMwMDgifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjIyNiIsIkRpbmdiYXQgaGV4IjoiRTIiLCJVbmljb2RlIGRlYyI6IjE3NCIsIlVuaWNvZGUgaGV4IjoiQUUifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjIyNyIsIkRpbmdiYXQgaGV4IjoiRTMiLCJVbmljb2RlIGRlYyI6IjE2OSIsIlVuaWNvZGUgaGV4IjoiQTkifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjIyOCIsIkRpbmdiYXQgaGV4IjoiRTQiLCJVbmljb2RlIGRlYyI6Ijg0ODIiLCJVbmljb2RlIGhleCI6IjIxMjIifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjIyOSIsIkRpbmdiYXQgaGV4IjoiRTUiLCJVbmljb2RlIGRlYyI6Ijg3MjEiLCJVbmljb2RlIGhleCI6IjIyMTEifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjIzMCIsIkRpbmdiYXQgaGV4IjoiRTYiLCJVbmljb2RlIGRlYyI6IjkxMTUiLCJVbmljb2RlIGhleCI6IjIzOUIifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjIzMSIsIkRpbmdiYXQgaGV4IjoiRTciLCJVbmljb2RlIGRlYyI6IjkxMTYiLCJVbmljb2RlIGhleCI6IjIzOUMifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjIzMiIsIkRpbmdiYXQgaGV4IjoiRTgiLCJVbmljb2RlIGRlYyI6IjkxMTciLCJVbmljb2RlIGhleCI6IjIzOUQifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjIzMyIsIkRpbmdiYXQgaGV4IjoiRTkiLCJVbmljb2RlIGRlYyI6IjkxMjEiLCJVbmljb2RlIGhleCI6IjIzQTEifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjIzNCIsIkRpbmdiYXQgaGV4IjoiRUEiLCJVbmljb2RlIGRlYyI6IjkxMjIiLCJVbmljb2RlIGhleCI6IjIzQTIifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjIzNSIsIkRpbmdiYXQgaGV4IjoiRUIiLCJVbmljb2RlIGRlYyI6IjkxMjMiLCJVbmljb2RlIGhleCI6IjIzQTMifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjIzNiIsIkRpbmdiYXQgaGV4IjoiRUMiLCJVbmljb2RlIGRlYyI6IjkxMjciLCJVbmljb2RlIGhleCI6IjIzQTcifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjIzNyIsIkRpbmdiYXQgaGV4IjoiRUQiLCJVbmljb2RlIGRlYyI6IjkxMjgiLCJVbmljb2RlIGhleCI6IjIzQTgifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjIzOCIsIkRpbmdiYXQgaGV4IjoiRUUiLCJVbmljb2RlIGRlYyI6IjkxMjkiLCJVbmljb2RlIGhleCI6IjIzQTkifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjIzOSIsIkRpbmdiYXQgaGV4IjoiRUYiLCJVbmljb2RlIGRlYyI6IjkxMzAiLCJVbmljb2RlIGhleCI6IjIzQUEifSx7IlR5cGVmYWNlIG5hbWUiOiJTeW1ib2wiLCJEaW5nYmF0IGRlYyI6IjI0MCIsIkRpbmdiYXQgaGV4IjoiRjAiLCJVbmljb2RlIGRlYyI6IjYzNzQzIiwiVW5pY29kZSBoZXgiOiJGOEZGIn0seyJUeXBlZmFjZSBuYW1lIjoiU3ltYm9sIiwiRGluZ2JhdCBkZWMiOiIyNDEiLCJEaW5nYmF0IGhleCI6IkYxIiwiVW5pY29kZSBkZWMiOiIxMjI5NyIsIlVuaWNvZGUgaGV4IjoiMzAwOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjQyIiwiRGluZ2JhdCBoZXgiOiJGMiIsIlVuaWNvZGUgZGVjIjoiODc0NyIsIlVuaWNvZGUgaGV4IjoiMjIyQiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjQzIiwiRGluZ2JhdCBoZXgiOiJGMyIsIlVuaWNvZGUgZGVjIjoiODk5MiIsIlVuaWNvZGUgaGV4IjoiMjMyMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjQ0IiwiRGluZ2JhdCBoZXgiOiJGNCIsIlVuaWNvZGUgZGVjIjoiOTEzNCIsIlVuaWNvZGUgaGV4IjoiMjNBRSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjQ1IiwiRGluZ2JhdCBoZXgiOiJGNSIsIlVuaWNvZGUgZGVjIjoiODk5MyIsIlVuaWNvZGUgaGV4IjoiMjMyMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjQ2IiwiRGluZ2JhdCBoZXgiOiJGNiIsIlVuaWNvZGUgZGVjIjoiOTExOCIsIlVuaWNvZGUgaGV4IjoiMjM5RSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjQ3IiwiRGluZ2JhdCBoZXgiOiJGNyIsIlVuaWNvZGUgZGVjIjoiOTExOSIsIlVuaWNvZGUgaGV4IjoiMjM5RiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjQ4IiwiRGluZ2JhdCBoZXgiOiJGOCIsIlVuaWNvZGUgZGVjIjoiOTEyMCIsIlVuaWNvZGUgaGV4IjoiMjNBMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjQ5IiwiRGluZ2JhdCBoZXgiOiJGOSIsIlVuaWNvZGUgZGVjIjoiOTEyNCIsIlVuaWNvZGUgaGV4IjoiMjNBNCJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjUwIiwiRGluZ2JhdCBoZXgiOiJGQSIsIlVuaWNvZGUgZGVjIjoiOTEyNSIsIlVuaWNvZGUgaGV4IjoiMjNBNSJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjUxIiwiRGluZ2JhdCBoZXgiOiJGQiIsIlVuaWNvZGUgZGVjIjoiOTEyNiIsIlVuaWNvZGUgaGV4IjoiMjNBNiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjUyIiwiRGluZ2JhdCBoZXgiOiJGQyIsIlVuaWNvZGUgZGVjIjoiOTEzMSIsIlVuaWNvZGUgaGV4IjoiMjNBQiJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjUzIiwiRGluZ2JhdCBoZXgiOiJGRCIsIlVuaWNvZGUgZGVjIjoiOTEzMiIsIlVuaWNvZGUgaGV4IjoiMjNBQyJ9LHsiVHlwZWZhY2UgbmFtZSI6IlN5bWJvbCIsIkRpbmdiYXQgZGVjIjoiMjU0IiwiRGluZ2JhdCBoZXgiOiJGRSIsIlVuaWNvZGUgZGVjIjoiOTEzMyIsIlVuaWNvZGUgaGV4IjoiMjNBRCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIzMiIsIkRpbmdiYXQgaGV4IjoiMjAiLCJVbmljb2RlIGRlYyI6IjMyIiwiVW5pY29kZSBoZXgiOiIyMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIzMyIsIkRpbmdiYXQgaGV4IjoiMjEiLCJVbmljb2RlIGRlYyI6IjEyODM3NSIsIlVuaWNvZGUgaGV4IjoiMUY1NzcifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMzQiLCJEaW5nYmF0IGhleCI6IjIyIiwiVW5pY29kZSBkZWMiOiIxMjgzNzYiLCJVbmljb2RlIGhleCI6IjFGNTc4In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjM1IiwiRGluZ2JhdCBoZXgiOiIyMyIsIlVuaWNvZGUgZGVjIjoiMTI4MzcwIiwiVW5pY29kZSBoZXgiOiIxRjU3MiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIzNiIsIkRpbmdiYXQgaGV4IjoiMjQiLCJVbmljb2RlIGRlYyI6IjEyODM3NCIsIlVuaWNvZGUgaGV4IjoiMUY1NzYifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMzciLCJEaW5nYmF0IGhleCI6IjI1IiwiVW5pY29kZSBkZWMiOiIxMjc5NDIiLCJVbmljb2RlIGhleCI6IjFGM0M2In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjM4IiwiRGluZ2JhdCBoZXgiOiIyNiIsIlVuaWNvZGUgZGVjIjoiMTI3ODk0IiwiVW5pY29kZSBoZXgiOiIxRjM5NiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIzOSIsIkRpbmdiYXQgaGV4IjoiMjciLCJVbmljb2RlIGRlYyI6IjEyODM5MSIsIlVuaWNvZGUgaGV4IjoiMUY1ODcifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNDAiLCJEaW5nYmF0IGhleCI6IjI4IiwiVW5pY29kZSBkZWMiOiIxMjg0ODgiLCJVbmljb2RlIGhleCI6IjFGNUU4In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjQxIiwiRGluZ2JhdCBoZXgiOiIyOSIsIlVuaWNvZGUgZGVjIjoiMTI4NDg5IiwiVW5pY29kZSBoZXgiOiIxRjVFOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI0MiIsIkRpbmdiYXQgaGV4IjoiMkEiLCJVbmljb2RlIGRlYyI6IjEyODQ5NiIsIlVuaWNvZGUgaGV4IjoiMUY1RjAifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNDMiLCJEaW5nYmF0IGhleCI6IjJCIiwiVW5pY29kZSBkZWMiOiIxMjg0OTciLCJVbmljb2RlIGhleCI6IjFGNUYxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjQ0IiwiRGluZ2JhdCBoZXgiOiIyQyIsIlVuaWNvZGUgZGVjIjoiMTI3Nzk4IiwiVW5pY29kZSBoZXgiOiIxRjMzNiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI0NSIsIkRpbmdiYXQgaGV4IjoiMkQiLCJVbmljb2RlIGRlYyI6IjEyNzg5NSIsIlVuaWNvZGUgaGV4IjoiMUYzOTcifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNDYiLCJEaW5nYmF0IGhleCI6IjJFIiwiVW5pY29kZSBkZWMiOiIxMjg2MzgiLCJVbmljb2RlIGhleCI6IjFGNjdFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjQ3IiwiRGluZ2JhdCBoZXgiOiIyRiIsIlVuaWNvZGUgZGVjIjoiMTI4NjM2IiwiVW5pY29kZSBoZXgiOiIxRjY3QyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI0OCIsIkRpbmdiYXQgaGV4IjoiMzAiLCJVbmljb2RlIGRlYyI6IjEyODQ2OSIsIlVuaWNvZGUgaGV4IjoiMUY1RDUifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNDkiLCJEaW5nYmF0IGhleCI6IjMxIiwiVW5pY29kZSBkZWMiOiIxMjg0NzAiLCJVbmljb2RlIGhleCI6IjFGNUQ2In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjUwIiwiRGluZ2JhdCBoZXgiOiIzMiIsIlVuaWNvZGUgZGVjIjoiMTI4NDcxIiwiVW5pY29kZSBoZXgiOiIxRjVENyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI1MSIsIkRpbmdiYXQgaGV4IjoiMzMiLCJVbmljb2RlIGRlYyI6IjkyMDQiLCJVbmljb2RlIGhleCI6IjIzRjQifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNTIiLCJEaW5nYmF0IGhleCI6IjM0IiwiVW5pY29kZSBkZWMiOiI5MjA1IiwiVW5pY29kZSBoZXgiOiIyM0Y1In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjUzIiwiRGluZ2JhdCBoZXgiOiIzNSIsIlVuaWNvZGUgZGVjIjoiOTIwNiIsIlVuaWNvZGUgaGV4IjoiMjNGNiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI1NCIsIkRpbmdiYXQgaGV4IjoiMzYiLCJVbmljb2RlIGRlYyI6IjkyMDciLCJVbmljb2RlIGhleCI6IjIzRjcifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNTUiLCJEaW5nYmF0IGhleCI6IjM3IiwiVW5pY29kZSBkZWMiOiI5MTk0IiwiVW5pY29kZSBoZXgiOiIyM0VBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjU2IiwiRGluZ2JhdCBoZXgiOiIzOCIsIlVuaWNvZGUgZGVjIjoiOTE5MyIsIlVuaWNvZGUgaGV4IjoiMjNFOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI1NyIsIkRpbmdiYXQgaGV4IjoiMzkiLCJVbmljb2RlIGRlYyI6IjkxOTgiLCJVbmljb2RlIGhleCI6IjIzRUUifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNTgiLCJEaW5nYmF0IGhleCI6IjNBIiwiVW5pY29kZSBkZWMiOiI5MTk3IiwiVW5pY29kZSBoZXgiOiIyM0VEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjU5IiwiRGluZ2JhdCBoZXgiOiIzQiIsIlVuaWNvZGUgZGVjIjoiOTIwOCIsIlVuaWNvZGUgaGV4IjoiMjNGOCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI2MCIsIkRpbmdiYXQgaGV4IjoiM0MiLCJVbmljb2RlIGRlYyI6IjkyMDkiLCJVbmljb2RlIGhleCI6IjIzRjkifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNjEiLCJEaW5nYmF0IGhleCI6IjNEIiwiVW5pY29kZSBkZWMiOiI5MjEwIiwiVW5pY29kZSBoZXgiOiIyM0ZBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjYyIiwiRGluZ2JhdCBoZXgiOiIzRSIsIlVuaWNvZGUgZGVjIjoiMTI4NDc0IiwiVW5pY29kZSBoZXgiOiIxRjVEQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI2MyIsIkRpbmdiYXQgaGV4IjoiM0YiLCJVbmljb2RlIGRlYyI6IjEyODQ5OSIsIlVuaWNvZGUgaGV4IjoiMUY1RjMifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNjQiLCJEaW5nYmF0IGhleCI6IjQwIiwiVW5pY29kZSBkZWMiOiIxMjg3MzYiLCJVbmljb2RlIGhleCI6IjFGNkUwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjY1IiwiRGluZ2JhdCBoZXgiOiI0MSIsIlVuaWNvZGUgZGVjIjoiMTI3OTU5IiwiVW5pY29kZSBoZXgiOiIxRjNENyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI2NiIsIkRpbmdiYXQgaGV4IjoiNDIiLCJVbmljb2RlIGRlYyI6IjEyNzk2MCIsIlVuaWNvZGUgaGV4IjoiMUYzRDgifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNjciLCJEaW5nYmF0IGhleCI6IjQzIiwiVW5pY29kZSBkZWMiOiIxMjc5NjEiLCJVbmljb2RlIGhleCI6IjFGM0Q5In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjY4IiwiRGluZ2JhdCBoZXgiOiI0NCIsIlVuaWNvZGUgZGVjIjoiMTI3OTYyIiwiVW5pY29kZSBoZXgiOiIxRjNEQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI2OSIsIkRpbmdiYXQgaGV4IjoiNDUiLCJVbmljb2RlIGRlYyI6IjEyNzk2NCIsIlVuaWNvZGUgaGV4IjoiMUYzREMifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNzAiLCJEaW5nYmF0IGhleCI6IjQ2IiwiVW5pY29kZSBkZWMiOiIxMjc5ODEiLCJVbmljb2RlIGhleCI6IjFGM0VEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjcxIiwiRGluZ2JhdCBoZXgiOiI0NyIsIlVuaWNvZGUgZGVjIjoiMTI3OTYzIiwiVW5pY29kZSBoZXgiOiIxRjNEQiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI3MiIsIkRpbmdiYXQgaGV4IjoiNDgiLCJVbmljb2RlIGRlYyI6IjEyNzk2OCIsIlVuaWNvZGUgaGV4IjoiMUYzRTAifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNzMiLCJEaW5nYmF0IGhleCI6IjQ5IiwiVW5pY29kZSBkZWMiOiIxMjc5NTgiLCJVbmljb2RlIGhleCI6IjFGM0Q2In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6Ijc0IiwiRGluZ2JhdCBoZXgiOiI0QSIsIlVuaWNvZGUgZGVjIjoiMTI3OTY1IiwiVW5pY29kZSBoZXgiOiIxRjNERCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI3NSIsIkRpbmdiYXQgaGV4IjoiNEIiLCJVbmljb2RlIGRlYyI6IjEyODczOSIsIlVuaWNvZGUgaGV4IjoiMUY2RTMifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNzYiLCJEaW5nYmF0IGhleCI6IjRDIiwiVW5pY29kZSBkZWMiOiIxMjgyNjkiLCJVbmljb2RlIGhleCI6IjFGNTBEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6Ijc3IiwiRGluZ2JhdCBoZXgiOiI0RCIsIlVuaWNvZGUgZGVjIjoiMTI3OTU2IiwiVW5pY29kZSBoZXgiOiIxRjNENCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI3OCIsIkRpbmdiYXQgaGV4IjoiNEUiLCJVbmljb2RlIGRlYyI6IjEyODA2NSIsIlVuaWNvZGUgaGV4IjoiMUY0NDEifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNzkiLCJEaW5nYmF0IGhleCI6IjRGIiwiVW5pY29kZSBkZWMiOiIxMjgwNjYiLCJVbmljb2RlIGhleCI6IjFGNDQyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjgwIiwiRGluZ2JhdCBoZXgiOiI1MCIsIlVuaWNvZGUgZGVjIjoiMTI3OTY2IiwiVW5pY29kZSBoZXgiOiIxRjNERSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI4MSIsIkRpbmdiYXQgaGV4IjoiNTEiLCJVbmljb2RlIGRlYyI6IjEyNzk1NyIsIlVuaWNvZGUgaGV4IjoiMUYzRDUifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiODIiLCJEaW5nYmF0IGhleCI6IjUyIiwiVW5pY29kZSBkZWMiOiIxMjg3NDAiLCJVbmljb2RlIGhleCI6IjFGNkU0In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjgzIiwiRGluZ2JhdCBoZXgiOiI1MyIsIlVuaWNvZGUgZGVjIjoiMTI3OTY3IiwiVW5pY29kZSBoZXgiOiIxRjNERiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI4NCIsIkRpbmdiYXQgaGV4IjoiNTQiLCJVbmljb2RlIGRlYyI6IjEyODc1NSIsIlVuaWNvZGUgaGV4IjoiMUY2RjMifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiODUiLCJEaW5nYmF0IGhleCI6IjU1IiwiVW5pY29kZSBkZWMiOiIxMjgzNjQiLCJVbmljb2RlIGhleCI6IjFGNTZDIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6Ijg2IiwiRGluZ2JhdCBoZXgiOiI1NiIsIlVuaWNvZGUgZGVjIjoiMTI4MzYzIiwiVW5pY29kZSBoZXgiOiIxRjU2QiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI4NyIsIkRpbmdiYXQgaGV4IjoiNTciLCJVbmljb2RlIGRlYyI6IjEyODM2MCIsIlVuaWNvZGUgaGV4IjoiMUY1NjgifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiODgiLCJEaW5nYmF0IGhleCI6IjU4IiwiVW5pY29kZSBkZWMiOiIxMjgyNjQiLCJVbmljb2RlIGhleCI6IjFGNTA4In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6Ijg5IiwiRGluZ2JhdCBoZXgiOiI1OSIsIlVuaWNvZGUgZGVjIjoiMTI3ODkyIiwiVW5pY29kZSBoZXgiOiIxRjM5NCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI5MCIsIkRpbmdiYXQgaGV4IjoiNUEiLCJVbmljb2RlIGRlYyI6IjEyNzg5MyIsIlVuaWNvZGUgaGV4IjoiMUYzOTUifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiOTEiLCJEaW5nYmF0IGhleCI6IjVCIiwiVW5pY29kZSBkZWMiOiIxMjg0OTIiLCJVbmljb2RlIGhleCI6IjFGNUVDIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjkyIiwiRGluZ2JhdCBoZXgiOiI1QyIsIlVuaWNvZGUgZGVjIjoiMTI4NjM3IiwiVW5pY29kZSBoZXgiOiIxRjY3RCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI5MyIsIkRpbmdiYXQgaGV4IjoiNUQiLCJVbmljb2RlIGRlYyI6IjEyODQ5MyIsIlVuaWNvZGUgaGV4IjoiMUY1RUQifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiOTQiLCJEaW5nYmF0IGhleCI6IjVFIiwiVW5pY29kZSBkZWMiOiIxMjg0OTAiLCJVbmljb2RlIGhleCI6IjFGNUVBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6Ijk1IiwiRGluZ2JhdCBoZXgiOiI1RiIsIlVuaWNvZGUgZGVjIjoiMTI4NDkxIiwiVW5pY29kZSBoZXgiOiIxRjVFQiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiI5NiIsIkRpbmdiYXQgaGV4IjoiNjAiLCJVbmljb2RlIGRlYyI6IjExMTU2IiwiVW5pY29kZSBoZXgiOiIyQjk0In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6Ijk3IiwiRGluZ2JhdCBoZXgiOiI2MSIsIlVuaWNvZGUgZGVjIjoiMTAwMDQiLCJVbmljb2RlIGhleCI6IjI3MTQifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiOTgiLCJEaW5nYmF0IGhleCI6IjYyIiwiVW5pY29kZSBkZWMiOiIxMjg2OTAiLCJVbmljb2RlIGhleCI6IjFGNkIyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6Ijk5IiwiRGluZ2JhdCBoZXgiOiI2MyIsIlVuaWNvZGUgZGVjIjoiMTEwMzYiLCJVbmljb2RlIGhleCI6IjJCMUMifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTAwIiwiRGluZ2JhdCBoZXgiOiI2NCIsIlVuaWNvZGUgZGVjIjoiMTI4NzM3IiwiVW5pY29kZSBoZXgiOiIxRjZFMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMDEiLCJEaW5nYmF0IGhleCI6IjY1IiwiVW5pY29kZSBkZWMiOiIxMjgyMzAiLCJVbmljb2RlIGhleCI6IjFGNEU2In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEwMiIsIkRpbmdiYXQgaGV4IjoiNjYiLCJVbmljb2RlIGRlYyI6IjEyODc1MyIsIlVuaWNvZGUgaGV4IjoiMUY2RjEifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTAzIiwiRGluZ2JhdCBoZXgiOiI2NyIsIlVuaWNvZGUgZGVjIjoiMTEwMzUiLCJVbmljb2RlIGhleCI6IjJCMUIifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTA0IiwiRGluZ2JhdCBoZXgiOiI2OCIsIlVuaWNvZGUgZGVjIjoiMTI4NjU3IiwiVW5pY29kZSBoZXgiOiIxRjY5MSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMDUiLCJEaW5nYmF0IGhleCI6IjY5IiwiVW5pY29kZSBkZWMiOiIxMjg3MTIiLCJVbmljb2RlIGhleCI6IjFGNkM4In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEwNiIsIkRpbmdiYXQgaGV4IjoiNkEiLCJVbmljb2RlIGRlYyI6IjEyODc0NSIsIlVuaWNvZGUgaGV4IjoiMUY2RTkifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTA3IiwiRGluZ2JhdCBoZXgiOiI2QiIsIlVuaWNvZGUgZGVjIjoiMTI4NzUyIiwiVW5pY29kZSBoZXgiOiIxRjZGMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMDgiLCJEaW5nYmF0IGhleCI6IjZDIiwiVW5pY29kZSBkZWMiOiIxMjg5NjgiLCJVbmljb2RlIGhleCI6IjFGN0M4In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEwOSIsIkRpbmdiYXQgaGV4IjoiNkQiLCJVbmljb2RlIGRlYyI6IjEyODM3MiIsIlVuaWNvZGUgaGV4IjoiMUY1NzQifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTEwIiwiRGluZ2JhdCBoZXgiOiI2RSIsIlVuaWNvZGUgZGVjIjoiMTEwNDQiLCJVbmljb2RlIGhleCI6IjJCMjQifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTExIiwiRGluZ2JhdCBoZXgiOiI2RiIsIlVuaWNvZGUgZGVjIjoiMTI4NzQxIiwiVW5pY29kZSBoZXgiOiIxRjZFNSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMTIiLCJEaW5nYmF0IGhleCI6IjcwIiwiVW5pY29kZSBkZWMiOiIxMjg2NjAiLCJVbmljb2RlIGhleCI6IjFGNjk0In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjExMyIsIkRpbmdiYXQgaGV4IjoiNzEiLCJVbmljb2RlIGRlYyI6IjEyODQ3MiIsIlVuaWNvZGUgaGV4IjoiMUY1RDgifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTE0IiwiRGluZ2JhdCBoZXgiOiI3MiIsIlVuaWNvZGUgZGVjIjoiMTI4NDczIiwiVW5pY29kZSBoZXgiOiIxRjVEOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMTUiLCJEaW5nYmF0IGhleCI6IjczIiwiVW5pY29kZSBkZWMiOiIxMDA2NyIsIlVuaWNvZGUgaGV4IjoiMjc1MyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMTYiLCJEaW5nYmF0IGhleCI6Ijc0IiwiVW5pY29kZSBkZWMiOiIxMjg3NTQiLCJVbmljb2RlIGhleCI6IjFGNkYyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjExNyIsIkRpbmdiYXQgaGV4IjoiNzUiLCJVbmljb2RlIGRlYyI6IjEyODY0NyIsIlVuaWNvZGUgaGV4IjoiMUY2ODcifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTE4IiwiRGluZ2JhdCBoZXgiOiI3NiIsIlVuaWNvZGUgZGVjIjoiMTI4NjUzIiwiVW5pY29kZSBoZXgiOiIxRjY4RCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMTkiLCJEaW5nYmF0IGhleCI6Ijc3IiwiVW5pY29kZSBkZWMiOiI5OTcxIiwiVW5pY29kZSBoZXgiOiIyNkYzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEyMCIsIkRpbmdiYXQgaGV4IjoiNzgiLCJVbmljb2RlIGRlYyI6IjEwNjgwIiwiVW5pY29kZSBoZXgiOiIyOUI4In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEyMSIsIkRpbmdiYXQgaGV4IjoiNzkiLCJVbmljb2RlIGRlYyI6Ijg4NTQiLCJVbmljb2RlIGhleCI6IjIyOTYifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTIyIiwiRGluZ2JhdCBoZXgiOiI3QSIsIlVuaWNvZGUgZGVjIjoiMTI4Njg1IiwiVW5pY29kZSBoZXgiOiIxRjZBRCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMjMiLCJEaW5nYmF0IGhleCI6IjdCIiwiVW5pY29kZSBkZWMiOiIxMjg0OTQiLCJVbmljb2RlIGhleCI6IjFGNUVFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEyNCIsIkRpbmdiYXQgaGV4IjoiN0MiLCJVbmljb2RlIGRlYyI6IjkxNjgiLCJVbmljb2RlIGhleCI6IjIzRDAifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTI1IiwiRGluZ2JhdCBoZXgiOiI3RCIsIlVuaWNvZGUgZGVjIjoiMTI4NDk1IiwiVW5pY29kZSBoZXgiOiIxRjVFRiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMjYiLCJEaW5nYmF0IGhleCI6IjdFIiwiVW5pY29kZSBkZWMiOiIxMjg0OTgiLCJVbmljb2RlIGhleCI6IjFGNUYyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEyOCIsIkRpbmdiYXQgaGV4IjoiODAiLCJVbmljb2RlIGRlYyI6IjEyODY5NyIsIlVuaWNvZGUgaGV4IjoiMUY2QjkifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTI5IiwiRGluZ2JhdCBoZXgiOiI4MSIsIlVuaWNvZGUgZGVjIjoiMTI4Njk4IiwiVW5pY29kZSBoZXgiOiIxRjZCQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMzAiLCJEaW5nYmF0IGhleCI6IjgyIiwiVW5pY29kZSBkZWMiOiIxMjg3MTMiLCJVbmljb2RlIGhleCI6IjFGNkM5In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEzMSIsIkRpbmdiYXQgaGV4IjoiODMiLCJVbmljb2RlIGRlYyI6IjEyODcxNCIsIlVuaWNvZGUgaGV4IjoiMUY2Q0EifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTMyIiwiRGluZ2JhdCBoZXgiOiI4NCIsIlVuaWNvZGUgZGVjIjoiMTI4NzAwIiwiVW5pY29kZSBoZXgiOiIxRjZCQyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMzMiLCJEaW5nYmF0IGhleCI6Ijg1IiwiVW5pY29kZSBkZWMiOiIxMjgxMjUiLCJVbmljb2RlIGhleCI6IjFGNDdEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEzNCIsIkRpbmdiYXQgaGV4IjoiODYiLCJVbmljb2RlIGRlYyI6IjEyNzk0NyIsIlVuaWNvZGUgaGV4IjoiMUYzQ0IifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTM1IiwiRGluZ2JhdCBoZXgiOiI4NyIsIlVuaWNvZGUgZGVjIjoiOTk3NSIsIlVuaWNvZGUgaGV4IjoiMjZGNyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMzYiLCJEaW5nYmF0IGhleCI6Ijg4IiwiVW5pY29kZSBkZWMiOiIxMjc5MzgiLCJVbmljb2RlIGhleCI6IjFGM0MyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEzNyIsIkRpbmdiYXQgaGV4IjoiODkiLCJVbmljb2RlIGRlYyI6IjEyNzk0OCIsIlVuaWNvZGUgaGV4IjoiMUYzQ0MifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTM4IiwiRGluZ2JhdCBoZXgiOiI4QSIsIlVuaWNvZGUgZGVjIjoiMTI3OTQ2IiwiVW5pY29kZSBoZXgiOiIxRjNDQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMzkiLCJEaW5nYmF0IGhleCI6IjhCIiwiVW5pY29kZSBkZWMiOiIxMjc5NDAiLCJVbmljb2RlIGhleCI6IjFGM0M0In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE0MCIsIkRpbmdiYXQgaGV4IjoiOEMiLCJVbmljb2RlIGRlYyI6IjEyNzk0OSIsIlVuaWNvZGUgaGV4IjoiMUYzQ0QifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTQxIiwiRGluZ2JhdCBoZXgiOiI4RCIsIlVuaWNvZGUgZGVjIjoiMTI3OTUwIiwiVW5pY29kZSBoZXgiOiIxRjNDRSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNDIiLCJEaW5nYmF0IGhleCI6IjhFIiwiVW5pY29kZSBkZWMiOiIxMjg2NjQiLCJVbmljb2RlIGhleCI6IjFGNjk4In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE0MyIsIkRpbmdiYXQgaGV4IjoiOEYiLCJVbmljb2RlIGRlYyI6IjEyODQ4MCIsIlVuaWNvZGUgaGV4IjoiMUY1RTAifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTQ0IiwiRGluZ2JhdCBoZXgiOiI5MCIsIlVuaWNvZGUgZGVjIjoiMTI4NzM4IiwiVW5pY29kZSBoZXgiOiIxRjZFMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNDUiLCJEaW5nYmF0IGhleCI6IjkxIiwiVW5pY29kZSBkZWMiOiIxMjgxNzYiLCJVbmljb2RlIGhleCI6IjFGNEIwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE0NiIsIkRpbmdiYXQgaGV4IjoiOTIiLCJVbmljb2RlIGRlYyI6IjEyNzk5MSIsIlVuaWNvZGUgaGV4IjoiMUYzRjcifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTQ3IiwiRGluZ2JhdCBoZXgiOiI5MyIsIlVuaWNvZGUgZGVjIjoiMTI4MTc5IiwiVW5pY29kZSBoZXgiOiIxRjRCMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNDgiLCJEaW5nYmF0IGhleCI6Ijk0IiwiVW5pY29kZSBkZWMiOiIxMjgxMDYiLCJVbmljb2RlIGhleCI6IjFGNDZBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE0OSIsIkRpbmdiYXQgaGV4IjoiOTUiLCJVbmljb2RlIGRlYyI6IjEyODQ4MSIsIlVuaWNvZGUgaGV4IjoiMUY1RTEifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTUwIiwiRGluZ2JhdCBoZXgiOiI5NiIsIlVuaWNvZGUgZGVjIjoiMTI4NDgyIiwiVW5pY29kZSBoZXgiOiIxRjVFMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNTEiLCJEaW5nYmF0IGhleCI6Ijk3IiwiVW5pY29kZSBkZWMiOiIxMjg0ODMiLCJVbmljb2RlIGhleCI6IjFGNUUzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE1MiIsIkRpbmdiYXQgaGV4IjoiOTgiLCJVbmljb2RlIGRlYyI6IjEwMDMxIiwiVW5pY29kZSBoZXgiOiIyNzJGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE1MyIsIkRpbmdiYXQgaGV4IjoiOTkiLCJVbmljb2RlIGRlYyI6IjEyODM4OCIsIlVuaWNvZGUgaGV4IjoiMUY1ODQifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTU0IiwiRGluZ2JhdCBoZXgiOiI5QSIsIlVuaWNvZGUgZGVjIjoiMTI4Mzg5IiwiVW5pY29kZSBoZXgiOiIxRjU4NSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNTUiLCJEaW5nYmF0IGhleCI6IjlCIiwiVW5pY29kZSBkZWMiOiIxMjgzODciLCJVbmljb2RlIGhleCI6IjFGNTgzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE1NiIsIkRpbmdiYXQgaGV4IjoiOUMiLCJVbmljb2RlIGRlYyI6IjEyODM5MCIsIlVuaWNvZGUgaGV4IjoiMUY1ODYifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTU3IiwiRGluZ2JhdCBoZXgiOiI5RCIsIlVuaWNvZGUgZGVjIjoiMTI4NDQxIiwiVW5pY29kZSBoZXgiOiIxRjVCOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNTgiLCJEaW5nYmF0IGhleCI6IjlFIiwiVW5pY29kZSBkZWMiOiIxMjg0NDIiLCJVbmljb2RlIGhleCI6IjFGNUJBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE1OSIsIkRpbmdiYXQgaGV4IjoiOUYiLCJVbmljb2RlIGRlYyI6IjEyODQ0MyIsIlVuaWNvZGUgaGV4IjoiMUY1QkIifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTYwIiwiRGluZ2JhdCBoZXgiOiJBMCIsIlVuaWNvZGUgZGVjIjoiMTI4MzczIiwiVW5pY29kZSBoZXgiOiIxRjU3NSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNjEiLCJEaW5nYmF0IGhleCI6IkExIiwiVW5pY29kZSBkZWMiOiIxMjgzNjgiLCJVbmljb2RlIGhleCI6IjFGNTcwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE2MiIsIkRpbmdiYXQgaGV4IjoiQTIiLCJVbmljb2RlIGRlYyI6IjEyODQ0NSIsIlVuaWNvZGUgaGV4IjoiMUY1QkQifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTYzIiwiRGluZ2JhdCBoZXgiOiJBMyIsIlVuaWNvZGUgZGVjIjoiMTI4NDQ2IiwiVW5pY29kZSBoZXgiOiIxRjVCRSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNjQiLCJEaW5nYmF0IGhleCI6IkE0IiwiVW5pY29kZSBkZWMiOiIxMjgyMDMiLCJVbmljb2RlIGhleCI6IjFGNENCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE2NSIsIkRpbmdiYXQgaGV4IjoiQTUiLCJVbmljb2RlIGRlYyI6IjEyODQ2NiIsIlVuaWNvZGUgaGV4IjoiMUY1RDIifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTY2IiwiRGluZ2JhdCBoZXgiOiJBNiIsIlVuaWNvZGUgZGVjIjoiMTI4NDY3IiwiVW5pY29kZSBoZXgiOiIxRjVEMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNjciLCJEaW5nYmF0IGhleCI6IkE3IiwiVW5pY29kZSBkZWMiOiIxMjgzNjYiLCJVbmljb2RlIGhleCI6IjFGNTZFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE2OCIsIkRpbmdiYXQgaGV4IjoiQTgiLCJVbmljb2RlIGRlYyI6IjEyODIxOCIsIlVuaWNvZGUgaGV4IjoiMUY0REEifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTY5IiwiRGluZ2JhdCBoZXgiOiJBOSIsIlVuaWNvZGUgZGVjIjoiMTI4NDc4IiwiVW5pY29kZSBoZXgiOiIxRjVERSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNzAiLCJEaW5nYmF0IGhleCI6IkFBIiwiVW5pY29kZSBkZWMiOiIxMjg0NzkiLCJVbmljb2RlIGhleCI6IjFGNURGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE3MSIsIkRpbmdiYXQgaGV4IjoiQUIiLCJVbmljb2RlIGRlYyI6IjEyODQ1MSIsIlVuaWNvZGUgaGV4IjoiMUY1QzMifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTcyIiwiRGluZ2JhdCBoZXgiOiJBQyIsIlVuaWNvZGUgZGVjIjoiMTI4NDUwIiwiVW5pY29kZSBoZXgiOiIxRjVDMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNzMiLCJEaW5nYmF0IGhleCI6IkFEIiwiVW5pY29kZSBkZWMiOiIxMjg0NDQiLCJVbmljb2RlIGhleCI6IjFGNUJDIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE3NCIsIkRpbmdiYXQgaGV4IjoiQUUiLCJVbmljb2RlIGRlYyI6IjEyNzkxNyIsIlVuaWNvZGUgaGV4IjoiMUYzQUQifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTc1IiwiRGluZ2JhdCBoZXgiOiJBRiIsIlVuaWNvZGUgZGVjIjoiMTI3OTAwIiwiVW5pY29kZSBoZXgiOiIxRjM5QyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNzYiLCJEaW5nYmF0IGhleCI6IkIwIiwiVW5pY29kZSBkZWMiOiIxMjc4OTYiLCJVbmljb2RlIGhleCI6IjFGMzk4In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE3NyIsIkRpbmdiYXQgaGV4IjoiQjEiLCJVbmljb2RlIGRlYyI6IjEyNzg5NyIsIlVuaWNvZGUgaGV4IjoiMUYzOTkifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTc4IiwiRGluZ2JhdCBoZXgiOiJCMiIsIlVuaWNvZGUgZGVjIjoiMTI3OTExIiwiVW5pY29kZSBoZXgiOiIxRjNBNyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNzkiLCJEaW5nYmF0IGhleCI6IkIzIiwiVW5pY29kZSBkZWMiOiIxMjgxOTEiLCJVbmljb2RlIGhleCI6IjFGNEJGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE4MCIsIkRpbmdiYXQgaGV4IjoiQjQiLCJVbmljb2RlIGRlYyI6IjEyNzkwMiIsIlVuaWNvZGUgaGV4IjoiMUYzOUUifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTgxIiwiRGluZ2JhdCBoZXgiOiJCNSIsIlVuaWNvZGUgZGVjIjoiMTI4MjQ3IiwiVW5pY29kZSBoZXgiOiIxRjRGNyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxODIiLCJEaW5nYmF0IGhleCI6IkI2IiwiVW5pY29kZSBkZWMiOiIxMjc5MDMiLCJVbmljb2RlIGhleCI6IjFGMzlGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE4MyIsIkRpbmdiYXQgaGV4IjoiQjciLCJVbmljb2RlIGRlYyI6IjEyNzkxNiIsIlVuaWNvZGUgaGV4IjoiMUYzQUMifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTg0IiwiRGluZ2JhdCBoZXgiOiJCOCIsIlVuaWNvZGUgZGVjIjoiMTI4MjUzIiwiVW5pY29kZSBoZXgiOiIxRjRGRCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxODUiLCJEaW5nYmF0IGhleCI6IkI5IiwiVW5pY29kZSBkZWMiOiIxMjgyNDkiLCJVbmljb2RlIGhleCI6IjFGNEY5In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE4NiIsIkRpbmdiYXQgaGV4IjoiQkEiLCJVbmljb2RlIGRlYyI6IjEyODI1NCIsIlVuaWNvZGUgaGV4IjoiMUY0RkUifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTg3IiwiRGluZ2JhdCBoZXgiOiJCQiIsIlVuaWNvZGUgZGVjIjoiMTI4MjUxIiwiVW5pY29kZSBoZXgiOiIxRjRGQiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxODgiLCJEaW5nYmF0IGhleCI6IkJDIiwiVW5pY29kZSBkZWMiOiIxMjc4OTgiLCJVbmljb2RlIGhleCI6IjFGMzlBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE4OSIsIkRpbmdiYXQgaGV4IjoiQkQiLCJVbmljb2RlIGRlYyI6IjEyNzg5OSIsIlVuaWNvZGUgaGV4IjoiMUYzOUIifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTkwIiwiRGluZ2JhdCBoZXgiOiJCRSIsIlVuaWNvZGUgZGVjIjoiMTI4MjUwIiwiVW5pY29kZSBoZXgiOiIxRjRGQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxOTEiLCJEaW5nYmF0IGhleCI6IkJGIiwiVW5pY29kZSBkZWMiOiIxMjgxODciLCJVbmljb2RlIGhleCI6IjFGNEJCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE5MiIsIkRpbmdiYXQgaGV4IjoiQzAiLCJVbmljb2RlIGRlYyI6IjEyODQyMSIsIlVuaWNvZGUgaGV4IjoiMUY1QTUifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTkzIiwiRGluZ2JhdCBoZXgiOiJDMSIsIlVuaWNvZGUgZGVjIjoiMTI4NDIyIiwiVW5pY29kZSBoZXgiOiIxRjVBNiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxOTQiLCJEaW5nYmF0IGhleCI6IkMyIiwiVW5pY29kZSBkZWMiOiIxMjg0MjMiLCJVbmljb2RlIGhleCI6IjFGNUE3In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE5NSIsIkRpbmdiYXQgaGV4IjoiQzMiLCJVbmljb2RlIGRlYyI6IjEyODM3NyIsIlVuaWNvZGUgaGV4IjoiMUY1NzkifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTk2IiwiRGluZ2JhdCBoZXgiOiJDNCIsIlVuaWNvZGUgZGVjIjoiMTI3OTE4IiwiVW5pY29kZSBoZXgiOiIxRjNBRSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIxOTciLCJEaW5nYmF0IGhleCI6IkM1IiwiVW5pY29kZSBkZWMiOiIxMjgzNzkiLCJVbmljb2RlIGhleCI6IjFGNTdCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE5OCIsIkRpbmdiYXQgaGV4IjoiQzYiLCJVbmljb2RlIGRlYyI6IjEyODM4MCIsIlVuaWNvZGUgaGV4IjoiMUY1N0MifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTk5IiwiRGluZ2JhdCBoZXgiOiJDNyIsIlVuaWNvZGUgZGVjIjoiMTI4MjIzIiwiVW5pY29kZSBoZXgiOiIxRjRERiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMDAiLCJEaW5nYmF0IGhleCI6IkM4IiwiVW5pY29kZSBkZWMiOiIxMjgzODUiLCJVbmljb2RlIGhleCI6IjFGNTgxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIwMSIsIkRpbmdiYXQgaGV4IjoiQzkiLCJVbmljb2RlIGRlYyI6IjEyODM4NCIsIlVuaWNvZGUgaGV4IjoiMUY1ODAifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjAyIiwiRGluZ2JhdCBoZXgiOiJDQSIsIlVuaWNvZGUgZGVjIjoiMTI4NDI0IiwiVW5pY29kZSBoZXgiOiIxRjVBOCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMDMiLCJEaW5nYmF0IGhleCI6IkNCIiwiVW5pY29kZSBkZWMiOiIxMjg0MjUiLCJVbmljb2RlIGhleCI6IjFGNUE5In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIwNCIsIkRpbmdiYXQgaGV4IjoiQ0MiLCJVbmljb2RlIGRlYyI6IjEyODQ0NyIsIlVuaWNvZGUgaGV4IjoiMUY1QkYifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjA1IiwiRGluZ2JhdCBoZXgiOiJDRCIsIlVuaWNvZGUgZGVjIjoiMTI4NDI2IiwiVW5pY29kZSBoZXgiOiIxRjVBQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMDYiLCJEaW5nYmF0IGhleCI6IkNFIiwiVW5pY29kZSBkZWMiOiIxMjg0NzYiLCJVbmljb2RlIGhleCI6IjFGNURDIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIwNyIsIkRpbmdiYXQgaGV4IjoiQ0YiLCJVbmljb2RlIGRlYyI6IjEyODI3NCIsIlVuaWNvZGUgaGV4IjoiMUY1MTIifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjA4IiwiRGluZ2JhdCBoZXgiOiJEMCIsIlVuaWNvZGUgZGVjIjoiMTI4Mjc1IiwiVW5pY29kZSBoZXgiOiIxRjUxMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMDkiLCJEaW5nYmF0IGhleCI6IkQxIiwiVW5pY29kZSBkZWMiOiIxMjg0NzciLCJVbmljb2RlIGhleCI6IjFGNUREIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIxMCIsIkRpbmdiYXQgaGV4IjoiRDIiLCJVbmljb2RlIGRlYyI6IjEyODIyOSIsIlVuaWNvZGUgaGV4IjoiMUY0RTUifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjExIiwiRGluZ2JhdCBoZXgiOiJEMyIsIlVuaWNvZGUgZGVjIjoiMTI4MjI4IiwiVW5pY29kZSBoZXgiOiIxRjRFNCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMTIiLCJEaW5nYmF0IGhleCI6IkQ0IiwiVW5pY29kZSBkZWMiOiIxMjgzNzEiLCJVbmljb2RlIGhleCI6IjFGNTczIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIxMyIsIkRpbmdiYXQgaGV4IjoiRDUiLCJVbmljb2RlIGRlYyI6IjEyNzc3OSIsIlVuaWNvZGUgaGV4IjoiMUYzMjMifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjE0IiwiRGluZ2JhdCBoZXgiOiJENiIsIlVuaWNvZGUgZGVjIjoiMTI3NzgwIiwiVW5pY29kZSBoZXgiOiIxRjMyNCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMTUiLCJEaW5nYmF0IGhleCI6IkQ3IiwiVW5pY29kZSBkZWMiOiIxMjc3ODEiLCJVbmljb2RlIGhleCI6IjFGMzI1In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIxNiIsIkRpbmdiYXQgaGV4IjoiRDgiLCJVbmljb2RlIGRlYyI6IjEyNzc4MiIsIlVuaWNvZGUgaGV4IjoiMUYzMjYifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjE3IiwiRGluZ2JhdCBoZXgiOiJEOSIsIlVuaWNvZGUgZGVjIjoiOTcyOSIsIlVuaWNvZGUgaGV4IjoiMjYwMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMTgiLCJEaW5nYmF0IGhleCI6IkRBIiwiVW5pY29kZSBkZWMiOiIxMjc3ODQiLCJVbmljb2RlIGhleCI6IjFGMzI4In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIxOSIsIkRpbmdiYXQgaGV4IjoiREIiLCJVbmljb2RlIGRlYyI6IjEyNzc4MyIsIlVuaWNvZGUgaGV4IjoiMUYzMjcifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjIwIiwiRGluZ2JhdCBoZXgiOiJEQyIsIlVuaWNvZGUgZGVjIjoiMTI3Nzg1IiwiVW5pY29kZSBoZXgiOiIxRjMyOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMjEiLCJEaW5nYmF0IGhleCI6IkREIiwiVW5pY29kZSBkZWMiOiIxMjc3ODYiLCJVbmljb2RlIGhleCI6IjFGMzJBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIyMiIsIkRpbmdiYXQgaGV4IjoiREUiLCJVbmljb2RlIGRlYyI6IjEyNzc4OCIsIlVuaWNvZGUgaGV4IjoiMUYzMkMifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjIzIiwiRGluZ2JhdCBoZXgiOiJERiIsIlVuaWNvZGUgZGVjIjoiMTI3Nzg3IiwiVW5pY29kZSBoZXgiOiIxRjMyQiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMjQiLCJEaW5nYmF0IGhleCI6IkUwIiwiVW5pY29kZSBkZWMiOiIxMjc3NzIiLCJVbmljb2RlIGhleCI6IjFGMzFDIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIyNSIsIkRpbmdiYXQgaGV4IjoiRTEiLCJVbmljb2RlIGRlYyI6IjEyNzc3NyIsIlVuaWNvZGUgaGV4IjoiMUYzMjEifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjI2IiwiRGluZ2JhdCBoZXgiOiJFMiIsIlVuaWNvZGUgZGVjIjoiMTI4NzE1IiwiVW5pY29kZSBoZXgiOiIxRjZDQiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMjciLCJEaW5nYmF0IGhleCI6IkUzIiwiVW5pY29kZSBkZWMiOiIxMjg3MTkiLCJVbmljb2RlIGhleCI6IjFGNkNGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIyOCIsIkRpbmdiYXQgaGV4IjoiRTQiLCJVbmljb2RlIGRlYyI6IjEyNzg2OSIsIlVuaWNvZGUgaGV4IjoiMUYzN0QifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjI5IiwiRGluZ2JhdCBoZXgiOiJFNSIsIlVuaWNvZGUgZGVjIjoiMTI3ODY0IiwiVW5pY29kZSBoZXgiOiIxRjM3OCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMzAiLCJEaW5nYmF0IGhleCI6IkU2IiwiVW5pY29kZSBkZWMiOiIxMjg3MTgiLCJVbmljb2RlIGhleCI6IjFGNkNFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIzMSIsIkRpbmdiYXQgaGV4IjoiRTciLCJVbmljb2RlIGRlYyI6IjEyODcxNyIsIlVuaWNvZGUgaGV4IjoiMUY2Q0QifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjMyIiwiRGluZ2JhdCBoZXgiOiJFOCIsIlVuaWNvZGUgZGVjIjoiOTQxMyIsIlVuaWNvZGUgaGV4IjoiMjRDNSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMzMiLCJEaW5nYmF0IGhleCI6IkU5IiwiVW5pY29kZSBkZWMiOiI5ODU1IiwiVW5pY29kZSBoZXgiOiIyNjdGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIzNCIsIkRpbmdiYXQgaGV4IjoiRUEiLCJVbmljb2RlIGRlYyI6IjEyODcxMCIsIlVuaWNvZGUgaGV4IjoiMUY2QzYifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjM1IiwiRGluZ2JhdCBoZXgiOiJFQiIsIlVuaWNvZGUgZGVjIjoiMTI4MzkyIiwiVW5pY29kZSBoZXgiOiIxRjU4OCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMzYiLCJEaW5nYmF0IGhleCI6IkVDIiwiVW5pY29kZSBkZWMiOiIxMjc4OTEiLCJVbmljb2RlIGhleCI6IjFGMzkzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIzNyIsIkRpbmdiYXQgaGV4IjoiRUQiLCJVbmljb2RlIGRlYyI6IjEyODQ4NCIsIlVuaWNvZGUgaGV4IjoiMUY1RTQifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjM4IiwiRGluZ2JhdCBoZXgiOiJFRSIsIlVuaWNvZGUgZGVjIjoiMTI4NDg1IiwiVW5pY29kZSBoZXgiOiIxRjVFNSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMzkiLCJEaW5nYmF0IGhleCI6IkVGIiwiVW5pY29kZSBkZWMiOiIxMjg0ODYiLCJVbmljb2RlIGhleCI6IjFGNUU2In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjI0MCIsIkRpbmdiYXQgaGV4IjoiRjAiLCJVbmljb2RlIGRlYyI6IjEyODQ4NyIsIlVuaWNvZGUgaGV4IjoiMUY1RTcifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjQxIiwiRGluZ2JhdCBoZXgiOiJGMSIsIlVuaWNvZGUgZGVjIjoiMTI4NzQ2IiwiVW5pY29kZSBoZXgiOiIxRjZFQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyNDIiLCJEaW5nYmF0IGhleCI6IkYyIiwiVW5pY29kZSBkZWMiOiIxMjgwNjMiLCJVbmljb2RlIGhleCI6IjFGNDNGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjI0MyIsIkRpbmdiYXQgaGV4IjoiRjMiLCJVbmljb2RlIGRlYyI6IjEyODAzOCIsIlVuaWNvZGUgaGV4IjoiMUY0MjYifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjQ0IiwiRGluZ2JhdCBoZXgiOiJGNCIsIlVuaWNvZGUgZGVjIjoiMTI4MDMxIiwiVW5pY29kZSBoZXgiOiIxRjQxRiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyNDUiLCJEaW5nYmF0IGhleCI6IkY1IiwiVW5pY29kZSBkZWMiOiIxMjgwMjEiLCJVbmljb2RlIGhleCI6IjFGNDE1In0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjI0NiIsIkRpbmdiYXQgaGV4IjoiRjYiLCJVbmljb2RlIGRlYyI6IjEyODAwOCIsIlVuaWNvZGUgaGV4IjoiMUY0MDgifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjQ3IiwiRGluZ2JhdCBoZXgiOiJGNyIsIlVuaWNvZGUgZGVjIjoiMTI4NjIwIiwiVW5pY29kZSBoZXgiOiIxRjY2QyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyNDgiLCJEaW5nYmF0IGhleCI6IkY4IiwiVW5pY29kZSBkZWMiOiIxMjg2MjIiLCJVbmljb2RlIGhleCI6IjFGNjZFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjI0OSIsIkRpbmdiYXQgaGV4IjoiRjkiLCJVbmljb2RlIGRlYyI6IjEyODYyMSIsIlVuaWNvZGUgaGV4IjoiMUY2NkQifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjUwIiwiRGluZ2JhdCBoZXgiOiJGQSIsIlVuaWNvZGUgZGVjIjoiMTI4NjIzIiwiVW5pY29kZSBoZXgiOiIxRjY2RiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyNTEiLCJEaW5nYmF0IGhleCI6IkZCIiwiVW5pY29kZSBkZWMiOiIxMjg1MDYiLCJVbmljb2RlIGhleCI6IjFGNUZBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjI1MiIsIkRpbmdiYXQgaGV4IjoiRkMiLCJVbmljb2RlIGRlYyI6IjEyNzc1NyIsIlVuaWNvZGUgaGV4IjoiMUYzMEQifSx7IlR5cGVmYWNlIG5hbWUiOiJXZWJkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjUzIiwiRGluZ2JhdCBoZXgiOiJGRCIsIlVuaWNvZGUgZGVjIjoiMTI3NzU5IiwiVW5pY29kZSBoZXgiOiIxRjMwRiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldlYmRpbmdzIiwiRGluZ2JhdCBkZWMiOiIyNTQiLCJEaW5nYmF0IGhleCI6IkZFIiwiVW5pY29kZSBkZWMiOiIxMjc3NTgiLCJVbmljb2RlIGhleCI6IjFGMzBFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2ViZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjI1NSIsIkRpbmdiYXQgaGV4IjoiRkYiLCJVbmljb2RlIGRlYyI6IjEyODMzMCIsIlVuaWNvZGUgaGV4IjoiMUY1NEEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjMyIiwiRGluZ2JhdCBoZXgiOiIyMCIsIlVuaWNvZGUgZGVjIjoiMzIiLCJVbmljb2RlIGhleCI6IjIwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIzMyIsIkRpbmdiYXQgaGV4IjoiMjEiLCJVbmljb2RlIGRlYyI6IjEyODM5MyIsIlVuaWNvZGUgaGV4IjoiMUY1ODkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjM0IiwiRGluZ2JhdCBoZXgiOiIyMiIsIlVuaWNvZGUgZGVjIjoiOTk4NiIsIlVuaWNvZGUgaGV4IjoiMjcwMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMzUiLCJEaW5nYmF0IGhleCI6IjIzIiwiVW5pY29kZSBkZWMiOiI5OTg1IiwiVW5pY29kZSBoZXgiOiIyNzAxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIzNiIsIkRpbmdiYXQgaGV4IjoiMjQiLCJVbmljb2RlIGRlYyI6IjEyODA4MyIsIlVuaWNvZGUgaGV4IjoiMUY0NTMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjM3IiwiRGluZ2JhdCBoZXgiOiIyNSIsIlVuaWNvZGUgZGVjIjoiMTI4MzY1IiwiVW5pY29kZSBoZXgiOiIxRjU2RCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMzgiLCJEaW5nYmF0IGhleCI6IjI2IiwiVW5pY29kZSBkZWMiOiIxMjgzNjYiLCJVbmljb2RlIGhleCI6IjFGNTZFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIzOSIsIkRpbmdiYXQgaGV4IjoiMjciLCJVbmljb2RlIGRlYyI6IjEyODM2NyIsIlVuaWNvZGUgaGV4IjoiMUY1NkYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjQwIiwiRGluZ2JhdCBoZXgiOiIyOCIsIlVuaWNvZGUgZGVjIjoiMTI4MzgzIiwiVW5pY29kZSBoZXgiOiIxRjU3RiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNDEiLCJEaW5nYmF0IGhleCI6IjI5IiwiVW5pY29kZSBkZWMiOiI5OTkwIiwiVW5pY29kZSBoZXgiOiIyNzA2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI0MiIsIkRpbmdiYXQgaGV4IjoiMkEiLCJVbmljb2RlIGRlYyI6IjEyODM4NiIsIlVuaWNvZGUgaGV4IjoiMUY1ODIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjQzIiwiRGluZ2JhdCBoZXgiOiIyQiIsIlVuaWNvZGUgZGVjIjoiMTI4Mzg3IiwiVW5pY29kZSBoZXgiOiIxRjU4MyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNDQiLCJEaW5nYmF0IGhleCI6IjJDIiwiVW5pY29kZSBkZWMiOiIxMjgyMzQiLCJVbmljb2RlIGhleCI6IjFGNEVBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI0NSIsIkRpbmdiYXQgaGV4IjoiMkQiLCJVbmljb2RlIGRlYyI6IjEyODIzNSIsIlVuaWNvZGUgaGV4IjoiMUY0RUIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjQ2IiwiRGluZ2JhdCBoZXgiOiIyRSIsIlVuaWNvZGUgZGVjIjoiMTI4MjM2IiwiVW5pY29kZSBoZXgiOiIxRjRFQyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNDciLCJEaW5nYmF0IGhleCI6IjJGIiwiVW5pY29kZSBkZWMiOiIxMjgyMzciLCJVbmljb2RlIGhleCI6IjFGNEVEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI0OCIsIkRpbmdiYXQgaGV4IjoiMzAiLCJVbmljb2RlIGRlYyI6IjEyODQ0OCIsIlVuaWNvZGUgaGV4IjoiMUY1QzAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjQ5IiwiRGluZ2JhdCBoZXgiOiIzMSIsIlVuaWNvZGUgZGVjIjoiMTI4NDQ5IiwiVW5pY29kZSBoZXgiOiIxRjVDMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNTAiLCJEaW5nYmF0IGhleCI6IjMyIiwiVW5pY29kZSBkZWMiOiIxMjg0NjIiLCJVbmljb2RlIGhleCI6IjFGNUNFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI1MSIsIkRpbmdiYXQgaGV4IjoiMzMiLCJVbmljb2RlIGRlYyI6IjEyODQ2MyIsIlVuaWNvZGUgaGV4IjoiMUY1Q0YifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjUyIiwiRGluZ2JhdCBoZXgiOiIzNCIsIlVuaWNvZGUgZGVjIjoiMTI4NDY0IiwiVW5pY29kZSBoZXgiOiIxRjVEMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNTMiLCJEaW5nYmF0IGhleCI6IjM1IiwiVW5pY29kZSBkZWMiOiIxMjg0NTIiLCJVbmljb2RlIGhleCI6IjFGNUM0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI1NCIsIkRpbmdiYXQgaGV4IjoiMzYiLCJVbmljb2RlIGRlYyI6Ijg5ODciLCJVbmljb2RlIGhleCI6IjIzMUIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjU1IiwiRGluZ2JhdCBoZXgiOiIzNyIsIlVuaWNvZGUgZGVjIjoiMTI4NDMwIiwiVW5pY29kZSBoZXgiOiIxRjVBRSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNTYiLCJEaW5nYmF0IGhleCI6IjM4IiwiVW5pY29kZSBkZWMiOiIxMjg0MzIiLCJVbmljb2RlIGhleCI6IjFGNUIwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI1NyIsIkRpbmdiYXQgaGV4IjoiMzkiLCJVbmljb2RlIGRlYyI6IjEyODQzNCIsIlVuaWNvZGUgaGV4IjoiMUY1QjIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjU4IiwiRGluZ2JhdCBoZXgiOiIzQSIsIlVuaWNvZGUgZGVjIjoiMTI4NDM1IiwiVW5pY29kZSBoZXgiOiIxRjVCMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNTkiLCJEaW5nYmF0IGhleCI6IjNCIiwiVW5pY29kZSBkZWMiOiIxMjg0MzYiLCJVbmljb2RlIGhleCI6IjFGNUI0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI2MCIsIkRpbmdiYXQgaGV4IjoiM0MiLCJVbmljb2RlIGRlYyI6IjEyODQyNyIsIlVuaWNvZGUgaGV4IjoiMUY1QUIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjYxIiwiRGluZ2JhdCBoZXgiOiIzRCIsIlVuaWNvZGUgZGVjIjoiMTI4NDI4IiwiVW5pY29kZSBoZXgiOiIxRjVBQyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNjIiLCJEaW5nYmF0IGhleCI6IjNFIiwiVW5pY29kZSBkZWMiOiI5OTkxIiwiVW5pY29kZSBoZXgiOiIyNzA3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI2MyIsIkRpbmdiYXQgaGV4IjoiM0YiLCJVbmljb2RlIGRlYyI6Ijk5OTciLCJVbmljb2RlIGhleCI6IjI3MEQifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjY0IiwiRGluZ2JhdCBoZXgiOiI0MCIsIlVuaWNvZGUgZGVjIjoiMTI4Mzk4IiwiVW5pY29kZSBoZXgiOiIxRjU4RSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNjUiLCJEaW5nYmF0IGhleCI6IjQxIiwiVW5pY29kZSBkZWMiOiI5OTk2IiwiVW5pY29kZSBoZXgiOiIyNzBDIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI2NiIsIkRpbmdiYXQgaGV4IjoiNDIiLCJVbmljb2RlIGRlYyI6IjEyODM5OSIsIlVuaWNvZGUgaGV4IjoiMUY1OEYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjY3IiwiRGluZ2JhdCBoZXgiOiI0MyIsIlVuaWNvZGUgZGVjIjoiMTI4MDc3IiwiVW5pY29kZSBoZXgiOiIxRjQ0RCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNjgiLCJEaW5nYmF0IGhleCI6IjQ0IiwiVW5pY29kZSBkZWMiOiIxMjgwNzgiLCJVbmljb2RlIGhleCI6IjFGNDRFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI2OSIsIkRpbmdiYXQgaGV4IjoiNDUiLCJVbmljb2RlIGRlYyI6Ijk3NTYiLCJVbmljb2RlIGhleCI6IjI2MUMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjcwIiwiRGluZ2JhdCBoZXgiOiI0NiIsIlVuaWNvZGUgZGVjIjoiOTc1OCIsIlVuaWNvZGUgaGV4IjoiMjYxRSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNzEiLCJEaW5nYmF0IGhleCI6IjQ3IiwiVW5pY29kZSBkZWMiOiI5NzU3IiwiVW5pY29kZSBoZXgiOiIyNjFEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI3MiIsIkRpbmdiYXQgaGV4IjoiNDgiLCJVbmljb2RlIGRlYyI6Ijk3NTkiLCJVbmljb2RlIGhleCI6IjI2MUYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjczIiwiRGluZ2JhdCBoZXgiOiI0OSIsIlVuaWNvZGUgZGVjIjoiMTI4NDAwIiwiVW5pY29kZSBoZXgiOiIxRjU5MCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNzQiLCJEaW5nYmF0IGhleCI6IjRBIiwiVW5pY29kZSBkZWMiOiI5Nzg2IiwiVW5pY29kZSBoZXgiOiIyNjNBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI3NSIsIkRpbmdiYXQgaGV4IjoiNEIiLCJVbmljb2RlIGRlYyI6IjEyODUyOCIsIlVuaWNvZGUgaGV4IjoiMUY2MTAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6Ijc2IiwiRGluZ2JhdCBoZXgiOiI0QyIsIlVuaWNvZGUgZGVjIjoiOTc4NSIsIlVuaWNvZGUgaGV4IjoiMjYzOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiNzciLCJEaW5nYmF0IGhleCI6IjREIiwiVW5pY29kZSBkZWMiOiIxMjgxNjMiLCJVbmljb2RlIGhleCI6IjFGNEEzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI3OCIsIkRpbmdiYXQgaGV4IjoiNEUiLCJVbmljb2RlIGRlYyI6IjEyODM2OSIsIlVuaWNvZGUgaGV4IjoiMUY1NzEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6Ijc5IiwiRGluZ2JhdCBoZXgiOiI0RiIsIlVuaWNvZGUgZGVjIjoiMTI3OTg3IiwiVW5pY29kZSBoZXgiOiIxRjNGMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiODAiLCJEaW5nYmF0IGhleCI6IjUwIiwiVW5pY29kZSBkZWMiOiIxMjc5ODUiLCJVbmljb2RlIGhleCI6IjFGM0YxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI4MSIsIkRpbmdiYXQgaGV4IjoiNTEiLCJVbmljb2RlIGRlYyI6Ijk5OTIiLCJVbmljb2RlIGhleCI6IjI3MDgifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjgyIiwiRGluZ2JhdCBoZXgiOiI1MiIsIlVuaWNvZGUgZGVjIjoiOTc4OCIsIlVuaWNvZGUgaGV4IjoiMjYzQyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiODMiLCJEaW5nYmF0IGhleCI6IjUzIiwiVW5pY29kZSBkZWMiOiIxMjc3NzgiLCJVbmljb2RlIGhleCI6IjFGMzIyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI4NCIsIkRpbmdiYXQgaGV4IjoiNTQiLCJVbmljb2RlIGRlYyI6IjEwMDUyIiwiVW5pY29kZSBoZXgiOiIyNzQ0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI4NSIsIkRpbmdiYXQgaGV4IjoiNTUiLCJVbmljb2RlIGRlYyI6IjEyODMyNiIsIlVuaWNvZGUgaGV4IjoiMUY1NDYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6Ijg2IiwiRGluZ2JhdCBoZXgiOiI1NiIsIlVuaWNvZGUgZGVjIjoiMTAwMTQiLCJVbmljb2RlIGhleCI6IjI3MUUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6Ijg3IiwiRGluZ2JhdCBoZXgiOiI1NyIsIlVuaWNvZGUgZGVjIjoiMTI4MzI4IiwiVW5pY29kZSBoZXgiOiIxRjU0OCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiODgiLCJEaW5nYmF0IGhleCI6IjU4IiwiVW5pY29kZSBkZWMiOiIxMDAxNiIsIlVuaWNvZGUgaGV4IjoiMjcyMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiODkiLCJEaW5nYmF0IGhleCI6IjU5IiwiVW5pY29kZSBkZWMiOiIxMDAxNyIsIlVuaWNvZGUgaGV4IjoiMjcyMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiOTAiLCJEaW5nYmF0IGhleCI6IjVBIiwiVW5pY29kZSBkZWMiOiI5NzcwIiwiVW5pY29kZSBoZXgiOiIyNjJBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI5MSIsIkRpbmdiYXQgaGV4IjoiNUIiLCJVbmljb2RlIGRlYyI6Ijk3NzUiLCJVbmljb2RlIGhleCI6IjI2MkYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjkyIiwiRGluZ2JhdCBoZXgiOiI1QyIsIlVuaWNvZGUgZGVjIjoiMTI4MzI5IiwiVW5pY29kZSBoZXgiOiIxRjU0OSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiOTMiLCJEaW5nYmF0IGhleCI6IjVEIiwiVW5pY29kZSBkZWMiOiI5Nzg0IiwiVW5pY29kZSBoZXgiOiIyNjM4In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI5NCIsIkRpbmdiYXQgaGV4IjoiNUUiLCJVbmljb2RlIGRlYyI6Ijk4MDAiLCJVbmljb2RlIGhleCI6IjI2NDgifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6Ijk1IiwiRGluZ2JhdCBoZXgiOiI1RiIsIlVuaWNvZGUgZGVjIjoiOTgwMSIsIlVuaWNvZGUgaGV4IjoiMjY0OSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiOTYiLCJEaW5nYmF0IGhleCI6IjYwIiwiVW5pY29kZSBkZWMiOiI5ODAyIiwiVW5pY29kZSBoZXgiOiIyNjRBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiI5NyIsIkRpbmdiYXQgaGV4IjoiNjEiLCJVbmljb2RlIGRlYyI6Ijk4MDMiLCJVbmljb2RlIGhleCI6IjI2NEIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6Ijk4IiwiRGluZ2JhdCBoZXgiOiI2MiIsIlVuaWNvZGUgZGVjIjoiOTgwNCIsIlVuaWNvZGUgaGV4IjoiMjY0QyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiOTkiLCJEaW5nYmF0IGhleCI6IjYzIiwiVW5pY29kZSBkZWMiOiI5ODA1IiwiVW5pY29kZSBoZXgiOiIyNjREIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMDAiLCJEaW5nYmF0IGhleCI6IjY0IiwiVW5pY29kZSBkZWMiOiI5ODA2IiwiVW5pY29kZSBoZXgiOiIyNjRFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMDEiLCJEaW5nYmF0IGhleCI6IjY1IiwiVW5pY29kZSBkZWMiOiI5ODA3IiwiVW5pY29kZSBoZXgiOiIyNjRGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMDIiLCJEaW5nYmF0IGhleCI6IjY2IiwiVW5pY29kZSBkZWMiOiI5ODA4IiwiVW5pY29kZSBoZXgiOiIyNjUwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMDMiLCJEaW5nYmF0IGhleCI6IjY3IiwiVW5pY29kZSBkZWMiOiI5ODA5IiwiVW5pY29kZSBoZXgiOiIyNjUxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMDQiLCJEaW5nYmF0IGhleCI6IjY4IiwiVW5pY29kZSBkZWMiOiI5ODEwIiwiVW5pY29kZSBoZXgiOiIyNjUyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMDUiLCJEaW5nYmF0IGhleCI6IjY5IiwiVW5pY29kZSBkZWMiOiI5ODExIiwiVW5pY29kZSBoZXgiOiIyNjUzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMDYiLCJEaW5nYmF0IGhleCI6IjZBIiwiVW5pY29kZSBkZWMiOiIxMjg2MjQiLCJVbmljb2RlIGhleCI6IjFGNjcwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMDciLCJEaW5nYmF0IGhleCI6IjZCIiwiVW5pY29kZSBkZWMiOiIxMjg2MjkiLCJVbmljb2RlIGhleCI6IjFGNjc1In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMDgiLCJEaW5nYmF0IGhleCI6IjZDIiwiVW5pY29kZSBkZWMiOiI5ODk5IiwiVW5pY29kZSBoZXgiOiIyNkFCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMDkiLCJEaW5nYmF0IGhleCI6IjZEIiwiVW5pY29kZSBkZWMiOiIxMjgzMTgiLCJVbmljb2RlIGhleCI6IjFGNTNFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMTAiLCJEaW5nYmF0IGhleCI6IjZFIiwiVW5pY29kZSBkZWMiOiI5NzI0IiwiVW5pY29kZSBoZXgiOiIyNUZDIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMTEiLCJEaW5nYmF0IGhleCI6IjZGIiwiVW5pY29kZSBkZWMiOiIxMjg5MTEiLCJVbmljb2RlIGhleCI6IjFGNzhGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMTIiLCJEaW5nYmF0IGhleCI6IjcwIiwiVW5pY29kZSBkZWMiOiIxMjg5MTIiLCJVbmljb2RlIGhleCI6IjFGNzkwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMTMiLCJEaW5nYmF0IGhleCI6IjcxIiwiVW5pY29kZSBkZWMiOiIxMDA2NSIsIlVuaWNvZGUgaGV4IjoiMjc1MSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTE0IiwiRGluZ2JhdCBoZXgiOiI3MiIsIlVuaWNvZGUgZGVjIjoiMTAwNjYiLCJVbmljb2RlIGhleCI6IjI3NTIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjExNSIsIkRpbmdiYXQgaGV4IjoiNzMiLCJVbmljb2RlIGRlYyI6IjEyODkyNyIsIlVuaWNvZGUgaGV4IjoiMUY3OUYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjExNiIsIkRpbmdiYXQgaGV4IjoiNzQiLCJVbmljb2RlIGRlYyI6IjEwNzMxIiwiVW5pY29kZSBoZXgiOiIyOUVCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMTciLCJEaW5nYmF0IGhleCI6Ijc1IiwiVW5pY29kZSBkZWMiOiI5NjcwIiwiVW5pY29kZSBoZXgiOiIyNUM2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMTgiLCJEaW5nYmF0IGhleCI6Ijc2IiwiVW5pY29kZSBkZWMiOiIxMDA3MCIsIlVuaWNvZGUgaGV4IjoiMjc1NiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTE5IiwiRGluZ2JhdCBoZXgiOiI3NyIsIlVuaWNvZGUgZGVjIjoiMTEwNDkiLCJVbmljb2RlIGhleCI6IjJCMjkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEyMCIsIkRpbmdiYXQgaGV4IjoiNzgiLCJVbmljb2RlIGRlYyI6Ijg5OTkiLCJVbmljb2RlIGhleCI6IjIzMjcifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEyMSIsIkRpbmdiYXQgaGV4IjoiNzkiLCJVbmljb2RlIGRlYyI6IjExMTkzIiwiVW5pY29kZSBoZXgiOiIyQkI5In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMjIiLCJEaW5nYmF0IGhleCI6IjdBIiwiVW5pY29kZSBkZWMiOiI4OTg0IiwiVW5pY29kZSBoZXgiOiIyMzE4In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMjMiLCJEaW5nYmF0IGhleCI6IjdCIiwiVW5pY29kZSBkZWMiOiIxMjc5ODkiLCJVbmljb2RlIGhleCI6IjFGM0Y1In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMjQiLCJEaW5nYmF0IGhleCI6IjdDIiwiVW5pY29kZSBkZWMiOiIxMjc5OTAiLCJVbmljb2RlIGhleCI6IjFGM0Y2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMjUiLCJEaW5nYmF0IGhleCI6IjdEIiwiVW5pY29kZSBkZWMiOiIxMjg2MzAiLCJVbmljb2RlIGhleCI6IjFGNjc2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMjYiLCJEaW5nYmF0IGhleCI6IjdFIiwiVW5pY29kZSBkZWMiOiIxMjg2MzEiLCJVbmljb2RlIGhleCI6IjFGNjc3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMjciLCJEaW5nYmF0IGhleCI6IjdGIiwiVW5pY29kZSBkZWMiOiI5NjQ3IiwiVW5pY29kZSBoZXgiOiIyNUFGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMjgiLCJEaW5nYmF0IGhleCI6IjgwIiwiVW5pY29kZSBkZWMiOiIxMjcyNDMiLCJVbmljb2RlIGhleCI6IjFGMTBCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMjkiLCJEaW5nYmF0IGhleCI6IjgxIiwiVW5pY29kZSBkZWMiOiIxMDExMiIsIlVuaWNvZGUgaGV4IjoiMjc4MCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTMwIiwiRGluZ2JhdCBoZXgiOiI4MiIsIlVuaWNvZGUgZGVjIjoiMTAxMTMiLCJVbmljb2RlIGhleCI6IjI3ODEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEzMSIsIkRpbmdiYXQgaGV4IjoiODMiLCJVbmljb2RlIGRlYyI6IjEwMTE0IiwiVW5pY29kZSBoZXgiOiIyNzgyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMzIiLCJEaW5nYmF0IGhleCI6Ijg0IiwiVW5pY29kZSBkZWMiOiIxMDExNSIsIlVuaWNvZGUgaGV4IjoiMjc4MyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTMzIiwiRGluZ2JhdCBoZXgiOiI4NSIsIlVuaWNvZGUgZGVjIjoiMTAxMTYiLCJVbmljb2RlIGhleCI6IjI3ODQifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEzNCIsIkRpbmdiYXQgaGV4IjoiODYiLCJVbmljb2RlIGRlYyI6IjEwMTE3IiwiVW5pY29kZSBoZXgiOiIyNzg1In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMzUiLCJEaW5nYmF0IGhleCI6Ijg3IiwiVW5pY29kZSBkZWMiOiIxMDExOCIsIlVuaWNvZGUgaGV4IjoiMjc4NiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTM2IiwiRGluZ2JhdCBoZXgiOiI4OCIsIlVuaWNvZGUgZGVjIjoiMTAxMTkiLCJVbmljb2RlIGhleCI6IjI3ODcifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjEzNyIsIkRpbmdiYXQgaGV4IjoiODkiLCJVbmljb2RlIGRlYyI6IjEwMTIwIiwiVW5pY29kZSBoZXgiOiIyNzg4In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxMzgiLCJEaW5nYmF0IGhleCI6IjhBIiwiVW5pY29kZSBkZWMiOiIxMDEyMSIsIlVuaWNvZGUgaGV4IjoiMjc4OSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTM5IiwiRGluZ2JhdCBoZXgiOiI4QiIsIlVuaWNvZGUgZGVjIjoiMTI3MjQ0IiwiVW5pY29kZSBoZXgiOiIxRjEwQyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTQwIiwiRGluZ2JhdCBoZXgiOiI4QyIsIlVuaWNvZGUgZGVjIjoiMTAxMjIiLCJVbmljb2RlIGhleCI6IjI3OEEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE0MSIsIkRpbmdiYXQgaGV4IjoiOEQiLCJVbmljb2RlIGRlYyI6IjEwMTIzIiwiVW5pY29kZSBoZXgiOiIyNzhCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNDIiLCJEaW5nYmF0IGhleCI6IjhFIiwiVW5pY29kZSBkZWMiOiIxMDEyNCIsIlVuaWNvZGUgaGV4IjoiMjc4QyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTQzIiwiRGluZ2JhdCBoZXgiOiI4RiIsIlVuaWNvZGUgZGVjIjoiMTAxMjUiLCJVbmljb2RlIGhleCI6IjI3OEQifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE0NCIsIkRpbmdiYXQgaGV4IjoiOTAiLCJVbmljb2RlIGRlYyI6IjEwMTI2IiwiVW5pY29kZSBoZXgiOiIyNzhFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNDUiLCJEaW5nYmF0IGhleCI6IjkxIiwiVW5pY29kZSBkZWMiOiIxMDEyNyIsIlVuaWNvZGUgaGV4IjoiMjc4RiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTQ2IiwiRGluZ2JhdCBoZXgiOiI5MiIsIlVuaWNvZGUgZGVjIjoiMTAxMjgiLCJVbmljb2RlIGhleCI6IjI3OTAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE0NyIsIkRpbmdiYXQgaGV4IjoiOTMiLCJVbmljb2RlIGRlYyI6IjEwMTI5IiwiVW5pY29kZSBoZXgiOiIyNzkxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNDgiLCJEaW5nYmF0IGhleCI6Ijk0IiwiVW5pY29kZSBkZWMiOiIxMDEzMCIsIlVuaWNvZGUgaGV4IjoiMjc5MiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTQ5IiwiRGluZ2JhdCBoZXgiOiI5NSIsIlVuaWNvZGUgZGVjIjoiMTAxMzEiLCJVbmljb2RlIGhleCI6IjI3OTMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE1MCIsIkRpbmdiYXQgaGV4IjoiOTYiLCJVbmljb2RlIGRlYyI6IjEyODYxMCIsIlVuaWNvZGUgaGV4IjoiMUY2NjIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE1MSIsIkRpbmdiYXQgaGV4IjoiOTciLCJVbmljb2RlIGRlYyI6IjEyODYwOCIsIlVuaWNvZGUgaGV4IjoiMUY2NjAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE1MiIsIkRpbmdiYXQgaGV4IjoiOTgiLCJVbmljb2RlIGRlYyI6IjEyODYwOSIsIlVuaWNvZGUgaGV4IjoiMUY2NjEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE1MyIsIkRpbmdiYXQgaGV4IjoiOTkiLCJVbmljb2RlIGRlYyI6IjEyODYxMSIsIlVuaWNvZGUgaGV4IjoiMUY2NjMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE1NCIsIkRpbmdiYXQgaGV4IjoiOUEiLCJVbmljb2RlIGRlYyI6IjEyODYwNiIsIlVuaWNvZGUgaGV4IjoiMUY2NUUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE1NSIsIkRpbmdiYXQgaGV4IjoiOUIiLCJVbmljb2RlIGRlYyI6IjEyODYwNCIsIlVuaWNvZGUgaGV4IjoiMUY2NUMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE1NiIsIkRpbmdiYXQgaGV4IjoiOUMiLCJVbmljb2RlIGRlYyI6IjEyODYwNSIsIlVuaWNvZGUgaGV4IjoiMUY2NUQifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE1NyIsIkRpbmdiYXQgaGV4IjoiOUQiLCJVbmljb2RlIGRlYyI6IjEyODYwNyIsIlVuaWNvZGUgaGV4IjoiMUY2NUYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE1OCIsIkRpbmdiYXQgaGV4IjoiOUUiLCJVbmljb2RlIGRlYyI6Ijg3MjkiLCJVbmljb2RlIGhleCI6IjIyMTkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE1OSIsIkRpbmdiYXQgaGV4IjoiOUYiLCJVbmljb2RlIGRlYyI6IjgyMjYiLCJVbmljb2RlIGhleCI6IjIwMjIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE2MCIsIkRpbmdiYXQgaGV4IjoiQTAiLCJVbmljb2RlIGRlYyI6IjExMDM3IiwiVW5pY29kZSBoZXgiOiIyQjFEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNjEiLCJEaW5nYmF0IGhleCI6IkExIiwiVW5pY29kZSBkZWMiOiIxMTA5NiIsIlVuaWNvZGUgaGV4IjoiMkI1OCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTYyIiwiRGluZ2JhdCBoZXgiOiJBMiIsIlVuaWNvZGUgZGVjIjoiMTI4OTAyIiwiVW5pY29kZSBoZXgiOiIxRjc4NiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTYzIiwiRGluZ2JhdCBoZXgiOiJBMyIsIlVuaWNvZGUgZGVjIjoiMTI4OTA0IiwiVW5pY29kZSBoZXgiOiIxRjc4OCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTY0IiwiRGluZ2JhdCBoZXgiOiJBNCIsIlVuaWNvZGUgZGVjIjoiMTI4OTA2IiwiVW5pY29kZSBoZXgiOiIxRjc4QSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTY1IiwiRGluZ2JhdCBoZXgiOiJBNSIsIlVuaWNvZGUgZGVjIjoiMTI4OTA3IiwiVW5pY29kZSBoZXgiOiIxRjc4QiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTY2IiwiRGluZ2JhdCBoZXgiOiJBNiIsIlVuaWNvZGUgZGVjIjoiMTI4MzE5IiwiVW5pY29kZSBoZXgiOiIxRjUzRiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTY3IiwiRGluZ2JhdCBoZXgiOiJBNyIsIlVuaWNvZGUgZGVjIjoiOTY0MiIsIlVuaWNvZGUgaGV4IjoiMjVBQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTY4IiwiRGluZ2JhdCBoZXgiOiJBOCIsIlVuaWNvZGUgZGVjIjoiMTI4OTEwIiwiVW5pY29kZSBoZXgiOiIxRjc4RSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTY5IiwiRGluZ2JhdCBoZXgiOiJBOSIsIlVuaWNvZGUgZGVjIjoiMTI4OTYxIiwiVW5pY29kZSBoZXgiOiIxRjdDMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTcwIiwiRGluZ2JhdCBoZXgiOiJBQSIsIlVuaWNvZGUgZGVjIjoiMTI4OTY1IiwiVW5pY29kZSBoZXgiOiIxRjdDNSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTcxIiwiRGluZ2JhdCBoZXgiOiJBQiIsIlVuaWNvZGUgZGVjIjoiOTczMyIsIlVuaWNvZGUgaGV4IjoiMjYwNSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTcyIiwiRGluZ2JhdCBoZXgiOiJBQyIsIlVuaWNvZGUgZGVjIjoiMTI4OTcxIiwiVW5pY29kZSBoZXgiOiIxRjdDQiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTczIiwiRGluZ2JhdCBoZXgiOiJBRCIsIlVuaWNvZGUgZGVjIjoiMTI4OTc1IiwiVW5pY29kZSBoZXgiOiIxRjdDRiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTc0IiwiRGluZ2JhdCBoZXgiOiJBRSIsIlVuaWNvZGUgZGVjIjoiMTI4OTc5IiwiVW5pY29kZSBoZXgiOiIxRjdEMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTc1IiwiRGluZ2JhdCBoZXgiOiJBRiIsIlVuaWNvZGUgZGVjIjoiMTI4OTc3IiwiVW5pY29kZSBoZXgiOiIxRjdEMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTc2IiwiRGluZ2JhdCBoZXgiOiJCMCIsIlVuaWNvZGUgZGVjIjoiMTEyMTYiLCJVbmljb2RlIGhleCI6IjJCRDAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE3NyIsIkRpbmdiYXQgaGV4IjoiQjEiLCJVbmljb2RlIGRlYyI6Ijg5ODIiLCJVbmljb2RlIGhleCI6IjIzMTYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE3OCIsIkRpbmdiYXQgaGV4IjoiQjIiLCJVbmljb2RlIGRlYyI6IjExMjE0IiwiVW5pY29kZSBoZXgiOiIyQkNFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxNzkiLCJEaW5nYmF0IGhleCI6IkIzIiwiVW5pY29kZSBkZWMiOiIxMTIxNSIsIlVuaWNvZGUgaGV4IjoiMkJDRiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTgwIiwiRGluZ2JhdCBoZXgiOiJCNCIsIlVuaWNvZGUgZGVjIjoiMTEyMTciLCJVbmljb2RlIGhleCI6IjJCRDEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE4MSIsIkRpbmdiYXQgaGV4IjoiQjUiLCJVbmljb2RlIGRlYyI6IjEwMDI2IiwiVW5pY29kZSBoZXgiOiIyNzJBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxODIiLCJEaW5nYmF0IGhleCI6IkI2IiwiVW5pY29kZSBkZWMiOiIxMDAzMiIsIlVuaWNvZGUgaGV4IjoiMjczMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTgzIiwiRGluZ2JhdCBoZXgiOiJCNyIsIlVuaWNvZGUgZGVjIjoiMTI4MzM2IiwiVW5pY29kZSBoZXgiOiIxRjU1MCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTg0IiwiRGluZ2JhdCBoZXgiOiJCOCIsIlVuaWNvZGUgZGVjIjoiMTI4MzM3IiwiVW5pY29kZSBoZXgiOiIxRjU1MSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTg1IiwiRGluZ2JhdCBoZXgiOiJCOSIsIlVuaWNvZGUgZGVjIjoiMTI4MzM4IiwiVW5pY29kZSBoZXgiOiIxRjU1MiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTg2IiwiRGluZ2JhdCBoZXgiOiJCQSIsIlVuaWNvZGUgZGVjIjoiMTI4MzM5IiwiVW5pY29kZSBoZXgiOiIxRjU1MyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTg3IiwiRGluZ2JhdCBoZXgiOiJCQiIsIlVuaWNvZGUgZGVjIjoiMTI4MzQwIiwiVW5pY29kZSBoZXgiOiIxRjU1NCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTg4IiwiRGluZ2JhdCBoZXgiOiJCQyIsIlVuaWNvZGUgZGVjIjoiMTI4MzQxIiwiVW5pY29kZSBoZXgiOiIxRjU1NSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTg5IiwiRGluZ2JhdCBoZXgiOiJCRCIsIlVuaWNvZGUgZGVjIjoiMTI4MzQyIiwiVW5pY29kZSBoZXgiOiIxRjU1NiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTkwIiwiRGluZ2JhdCBoZXgiOiJCRSIsIlVuaWNvZGUgZGVjIjoiMTI4MzQzIiwiVW5pY29kZSBoZXgiOiIxRjU1NyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTkxIiwiRGluZ2JhdCBoZXgiOiJCRiIsIlVuaWNvZGUgZGVjIjoiMTI4MzQ0IiwiVW5pY29kZSBoZXgiOiIxRjU1OCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTkyIiwiRGluZ2JhdCBoZXgiOiJDMCIsIlVuaWNvZGUgZGVjIjoiMTI4MzQ1IiwiVW5pY29kZSBoZXgiOiIxRjU1OSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTkzIiwiRGluZ2JhdCBoZXgiOiJDMSIsIlVuaWNvZGUgZGVjIjoiMTI4MzQ2IiwiVW5pY29kZSBoZXgiOiIxRjU1QSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTk0IiwiRGluZ2JhdCBoZXgiOiJDMiIsIlVuaWNvZGUgZGVjIjoiMTI4MzQ3IiwiVW5pY29kZSBoZXgiOiIxRjU1QiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTk1IiwiRGluZ2JhdCBoZXgiOiJDMyIsIlVuaWNvZGUgZGVjIjoiMTExODQiLCJVbmljb2RlIGhleCI6IjJCQjAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE5NiIsIkRpbmdiYXQgaGV4IjoiQzQiLCJVbmljb2RlIGRlYyI6IjExMTg1IiwiVW5pY29kZSBoZXgiOiIyQkIxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIxOTciLCJEaW5nYmF0IGhleCI6IkM1IiwiVW5pY29kZSBkZWMiOiIxMTE4NiIsIlVuaWNvZGUgaGV4IjoiMkJCMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMTk4IiwiRGluZ2JhdCBoZXgiOiJDNiIsIlVuaWNvZGUgZGVjIjoiMTExODciLCJVbmljb2RlIGhleCI6IjJCQjMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjE5OSIsIkRpbmdiYXQgaGV4IjoiQzciLCJVbmljb2RlIGRlYyI6IjExMTg4IiwiVW5pY29kZSBoZXgiOiIyQkI0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMDAiLCJEaW5nYmF0IGhleCI6IkM4IiwiVW5pY29kZSBkZWMiOiIxMTE4OSIsIlVuaWNvZGUgaGV4IjoiMkJCNSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjAxIiwiRGluZ2JhdCBoZXgiOiJDOSIsIlVuaWNvZGUgZGVjIjoiMTExOTAiLCJVbmljb2RlIGhleCI6IjJCQjYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIwMiIsIkRpbmdiYXQgaGV4IjoiQ0EiLCJVbmljb2RlIGRlYyI6IjExMTkxIiwiVW5pY29kZSBoZXgiOiIyQkI3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMDMiLCJEaW5nYmF0IGhleCI6IkNCIiwiVW5pY29kZSBkZWMiOiIxMjg2MTgiLCJVbmljb2RlIGhleCI6IjFGNjZBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMDQiLCJEaW5nYmF0IGhleCI6IkNDIiwiVW5pY29kZSBkZWMiOiIxMjg2MTkiLCJVbmljb2RlIGhleCI6IjFGNjZCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMDUiLCJEaW5nYmF0IGhleCI6IkNEIiwiVW5pY29kZSBkZWMiOiIxMjg1OTciLCJVbmljb2RlIGhleCI6IjFGNjU1In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMDYiLCJEaW5nYmF0IGhleCI6IkNFIiwiVW5pY29kZSBkZWMiOiIxMjg1OTYiLCJVbmljb2RlIGhleCI6IjFGNjU0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMDciLCJEaW5nYmF0IGhleCI6IkNGIiwiVW5pY29kZSBkZWMiOiIxMjg1OTkiLCJVbmljb2RlIGhleCI6IjFGNjU3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMDgiLCJEaW5nYmF0IGhleCI6IkQwIiwiVW5pY29kZSBkZWMiOiIxMjg1OTgiLCJVbmljb2RlIGhleCI6IjFGNjU2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMDkiLCJEaW5nYmF0IGhleCI6IkQxIiwiVW5pY29kZSBkZWMiOiIxMjg1OTIiLCJVbmljb2RlIGhleCI6IjFGNjUwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMTAiLCJEaW5nYmF0IGhleCI6IkQyIiwiVW5pY29kZSBkZWMiOiIxMjg1OTMiLCJVbmljb2RlIGhleCI6IjFGNjUxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMTEiLCJEaW5nYmF0IGhleCI6IkQzIiwiVW5pY29kZSBkZWMiOiIxMjg1OTQiLCJVbmljb2RlIGhleCI6IjFGNjUyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMTIiLCJEaW5nYmF0IGhleCI6IkQ0IiwiVW5pY29kZSBkZWMiOiIxMjg1OTUiLCJVbmljb2RlIGhleCI6IjFGNjUzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMTMiLCJEaW5nYmF0IGhleCI6IkQ1IiwiVW5pY29kZSBkZWMiOiI5MDAzIiwiVW5pY29kZSBoZXgiOiIyMzJCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMTQiLCJEaW5nYmF0IGhleCI6IkQ2IiwiVW5pY29kZSBkZWMiOiI4OTk4IiwiVW5pY29kZSBoZXgiOiIyMzI2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMTUiLCJEaW5nYmF0IGhleCI6IkQ3IiwiVW5pY29kZSBkZWMiOiIxMTE2MCIsIlVuaWNvZGUgaGV4IjoiMkI5OCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjE2IiwiRGluZ2JhdCBoZXgiOiJEOCIsIlVuaWNvZGUgZGVjIjoiMTExNjIiLCJVbmljb2RlIGhleCI6IjJCOUEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIxNyIsIkRpbmdiYXQgaGV4IjoiRDkiLCJVbmljb2RlIGRlYyI6IjExMTYxIiwiVW5pY29kZSBoZXgiOiIyQjk5In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMTgiLCJEaW5nYmF0IGhleCI6IkRBIiwiVW5pY29kZSBkZWMiOiIxMTE2MyIsIlVuaWNvZGUgaGV4IjoiMkI5QiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjE5IiwiRGluZ2JhdCBoZXgiOiJEQiIsIlVuaWNvZGUgZGVjIjoiMTExNDQiLCJVbmljb2RlIGhleCI6IjJCODgifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIyMCIsIkRpbmdiYXQgaGV4IjoiREMiLCJVbmljb2RlIGRlYyI6IjExMTQ2IiwiVW5pY29kZSBoZXgiOiIyQjhBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyMjEiLCJEaW5nYmF0IGhleCI6IkREIiwiVW5pY29kZSBkZWMiOiIxMTE0NSIsIlVuaWNvZGUgaGV4IjoiMkI4OSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjIyIiwiRGluZ2JhdCBoZXgiOiJERSIsIlVuaWNvZGUgZGVjIjoiMTExNDciLCJVbmljb2RlIGhleCI6IjJCOEIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIyMyIsIkRpbmdiYXQgaGV4IjoiREYiLCJVbmljb2RlIGRlYyI6IjEyOTEyOCIsIlVuaWNvZGUgaGV4IjoiMUY4NjgifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIyNCIsIkRpbmdiYXQgaGV4IjoiRTAiLCJVbmljb2RlIGRlYyI6IjEyOTEzMCIsIlVuaWNvZGUgaGV4IjoiMUY4NkEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIyNSIsIkRpbmdiYXQgaGV4IjoiRTEiLCJVbmljb2RlIGRlYyI6IjEyOTEyOSIsIlVuaWNvZGUgaGV4IjoiMUY4NjkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIyNiIsIkRpbmdiYXQgaGV4IjoiRTIiLCJVbmljb2RlIGRlYyI6IjEyOTEzMSIsIlVuaWNvZGUgaGV4IjoiMUY4NkIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIyNyIsIkRpbmdiYXQgaGV4IjoiRTMiLCJVbmljb2RlIGRlYyI6IjEyOTEzMiIsIlVuaWNvZGUgaGV4IjoiMUY4NkMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIyOCIsIkRpbmdiYXQgaGV4IjoiRTQiLCJVbmljb2RlIGRlYyI6IjEyOTEzMyIsIlVuaWNvZGUgaGV4IjoiMUY4NkQifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIyOSIsIkRpbmdiYXQgaGV4IjoiRTUiLCJVbmljb2RlIGRlYyI6IjEyOTEzNSIsIlVuaWNvZGUgaGV4IjoiMUY4NkYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIzMCIsIkRpbmdiYXQgaGV4IjoiRTYiLCJVbmljb2RlIGRlYyI6IjEyOTEzNCIsIlVuaWNvZGUgaGV4IjoiMUY4NkUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIzMSIsIkRpbmdiYXQgaGV4IjoiRTciLCJVbmljb2RlIGRlYyI6IjEyOTE0NCIsIlVuaWNvZGUgaGV4IjoiMUY4NzgifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIzMiIsIkRpbmdiYXQgaGV4IjoiRTgiLCJVbmljb2RlIGRlYyI6IjEyOTE0NiIsIlVuaWNvZGUgaGV4IjoiMUY4N0EifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIzMyIsIkRpbmdiYXQgaGV4IjoiRTkiLCJVbmljb2RlIGRlYyI6IjEyOTE0NSIsIlVuaWNvZGUgaGV4IjoiMUY4NzkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIzNCIsIkRpbmdiYXQgaGV4IjoiRUEiLCJVbmljb2RlIGRlYyI6IjEyOTE0NyIsIlVuaWNvZGUgaGV4IjoiMUY4N0IifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIzNSIsIkRpbmdiYXQgaGV4IjoiRUIiLCJVbmljb2RlIGRlYyI6IjEyOTE0OCIsIlVuaWNvZGUgaGV4IjoiMUY4N0MifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIzNiIsIkRpbmdiYXQgaGV4IjoiRUMiLCJVbmljb2RlIGRlYyI6IjEyOTE0OSIsIlVuaWNvZGUgaGV4IjoiMUY4N0QifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIzNyIsIkRpbmdiYXQgaGV4IjoiRUQiLCJVbmljb2RlIGRlYyI6IjEyOTE1MSIsIlVuaWNvZGUgaGV4IjoiMUY4N0YifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIzOCIsIkRpbmdiYXQgaGV4IjoiRUUiLCJVbmljb2RlIGRlYyI6IjEyOTE1MCIsIlVuaWNvZGUgaGV4IjoiMUY4N0UifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjIzOSIsIkRpbmdiYXQgaGV4IjoiRUYiLCJVbmljb2RlIGRlYyI6Ijg2NzgiLCJVbmljb2RlIGhleCI6IjIxRTYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjI0MCIsIkRpbmdiYXQgaGV4IjoiRjAiLCJVbmljb2RlIGRlYyI6Ijg2ODAiLCJVbmljb2RlIGhleCI6IjIxRTgifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjI0MSIsIkRpbmdiYXQgaGV4IjoiRjEiLCJVbmljb2RlIGRlYyI6Ijg2NzkiLCJVbmljb2RlIGhleCI6IjIxRTcifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjI0MiIsIkRpbmdiYXQgaGV4IjoiRjIiLCJVbmljb2RlIGRlYyI6Ijg2ODEiLCJVbmljb2RlIGhleCI6IjIxRTkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjI0MyIsIkRpbmdiYXQgaGV4IjoiRjMiLCJVbmljb2RlIGRlYyI6IjExMDEyIiwiVW5pY29kZSBoZXgiOiIyQjA0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyNDQiLCJEaW5nYmF0IGhleCI6IkY0IiwiVW5pY29kZSBkZWMiOiI4NjkxIiwiVW5pY29kZSBoZXgiOiIyMUYzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyNDUiLCJEaW5nYmF0IGhleCI6IkY1IiwiVW5pY29kZSBkZWMiOiIxMTAwOSIsIlVuaWNvZGUgaGV4IjoiMkIwMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjQ2IiwiRGluZ2JhdCBoZXgiOiJGNiIsIlVuaWNvZGUgZGVjIjoiMTEwMDgiLCJVbmljb2RlIGhleCI6IjJCMDAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjI0NyIsIkRpbmdiYXQgaGV4IjoiRjciLCJVbmljb2RlIGRlYyI6IjExMDExIiwiVW5pY29kZSBoZXgiOiIyQjAzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIiwiRGluZ2JhdCBkZWMiOiIyNDgiLCJEaW5nYmF0IGhleCI6IkY4IiwiVW5pY29kZSBkZWMiOiIxMTAxMCIsIlVuaWNvZGUgaGV4IjoiMkIwMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjQ5IiwiRGluZ2JhdCBoZXgiOiJGOSIsIlVuaWNvZGUgZGVjIjoiMTI5MTk2IiwiVW5pY29kZSBoZXgiOiIxRjhBQyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjUwIiwiRGluZ2JhdCBoZXgiOiJGQSIsIlVuaWNvZGUgZGVjIjoiMTI5MTk3IiwiVW5pY29kZSBoZXgiOiIxRjhBRCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjUxIiwiRGluZ2JhdCBoZXgiOiJGQiIsIlVuaWNvZGUgZGVjIjoiMTI4NTAyIiwiVW5pY29kZSBoZXgiOiIxRjVGNiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyIsIkRpbmdiYXQgZGVjIjoiMjUyIiwiRGluZ2JhdCBoZXgiOiJGQyIsIlVuaWNvZGUgZGVjIjoiMTAwMDMiLCJVbmljb2RlIGhleCI6IjI3MTMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjI1MyIsIkRpbmdiYXQgaGV4IjoiRkQiLCJVbmljb2RlIGRlYyI6IjEyODUwMyIsIlVuaWNvZGUgaGV4IjoiMUY1RjcifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MiLCJEaW5nYmF0IGRlYyI6IjI1NCIsIkRpbmdiYXQgaGV4IjoiRkUiLCJVbmljb2RlIGRlYyI6IjEyODUwNSIsIlVuaWNvZGUgaGV4IjoiMUY1RjkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMzIiLCJEaW5nYmF0IGhleCI6IjIwIiwiVW5pY29kZSBkZWMiOiIzMiIsIlVuaWNvZGUgaGV4IjoiMjAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMzMiLCJEaW5nYmF0IGhleCI6IjIxIiwiVW5pY29kZSBkZWMiOiIxMjgzOTQiLCJVbmljb2RlIGhleCI6IjFGNThBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjM0IiwiRGluZ2JhdCBoZXgiOiIyMiIsIlVuaWNvZGUgZGVjIjoiMTI4Mzk1IiwiVW5pY29kZSBoZXgiOiIxRjU4QiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIzNSIsIkRpbmdiYXQgaGV4IjoiMjMiLCJVbmljb2RlIGRlYyI6IjEyODM5NiIsIlVuaWNvZGUgaGV4IjoiMUY1OEMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMzYiLCJEaW5nYmF0IGhleCI6IjI0IiwiVW5pY29kZSBkZWMiOiIxMjgzOTciLCJVbmljb2RlIGhleCI6IjFGNThEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjM3IiwiRGluZ2JhdCBoZXgiOiIyNSIsIlVuaWNvZGUgZGVjIjoiOTk4OCIsIlVuaWNvZGUgaGV4IjoiMjcwNCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIzOCIsIkRpbmdiYXQgaGV4IjoiMjYiLCJVbmljb2RlIGRlYyI6Ijk5ODQiLCJVbmljb2RlIGhleCI6IjI3MDAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMzkiLCJEaW5nYmF0IGhleCI6IjI3IiwiVW5pY29kZSBkZWMiOiIxMjgzODIiLCJVbmljb2RlIGhleCI6IjFGNTdFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjQwIiwiRGluZ2JhdCBoZXgiOiIyOCIsIlVuaWNvZGUgZGVjIjoiMTI4MzgxIiwiVW5pY29kZSBoZXgiOiIxRjU3RCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI0MSIsIkRpbmdiYXQgaGV4IjoiMjkiLCJVbmljb2RlIGRlYyI6IjEyODQ1MyIsIlVuaWNvZGUgaGV4IjoiMUY1QzUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiNDIiLCJEaW5nYmF0IGhleCI6IjJBIiwiVW5pY29kZSBkZWMiOiIxMjg0NTQiLCJVbmljb2RlIGhleCI6IjFGNUM2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjQzIiwiRGluZ2JhdCBoZXgiOiIyQiIsIlVuaWNvZGUgZGVjIjoiMTI4NDU1IiwiVW5pY29kZSBoZXgiOiIxRjVDNyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI0NCIsIkRpbmdiYXQgaGV4IjoiMkMiLCJVbmljb2RlIGRlYyI6IjEyODQ1NiIsIlVuaWNvZGUgaGV4IjoiMUY1QzgifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiNDUiLCJEaW5nYmF0IGhleCI6IjJEIiwiVW5pY29kZSBkZWMiOiIxMjg0NTciLCJVbmljb2RlIGhleCI6IjFGNUM5In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjQ2IiwiRGluZ2JhdCBoZXgiOiIyRSIsIlVuaWNvZGUgZGVjIjoiMTI4NDU4IiwiVW5pY29kZSBoZXgiOiIxRjVDQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI0NyIsIkRpbmdiYXQgaGV4IjoiMkYiLCJVbmljb2RlIGRlYyI6IjEyODQ1OSIsIlVuaWNvZGUgaGV4IjoiMUY1Q0IifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiNDgiLCJEaW5nYmF0IGhleCI6IjMwIiwiVW5pY29kZSBkZWMiOiIxMjg0NjAiLCJVbmljb2RlIGhleCI6IjFGNUNDIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjQ5IiwiRGluZ2JhdCBoZXgiOiIzMSIsIlVuaWNvZGUgZGVjIjoiMTI4NDYxIiwiVW5pY29kZSBoZXgiOiIxRjVDRCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI1MCIsIkRpbmdiYXQgaGV4IjoiMzIiLCJVbmljb2RlIGRlYyI6IjEyODIwMyIsIlVuaWNvZGUgaGV4IjoiMUY0Q0IifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiNTEiLCJEaW5nYmF0IGhleCI6IjMzIiwiVW5pY29kZSBkZWMiOiIxMjg0NjUiLCJVbmljb2RlIGhleCI6IjFGNUQxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjUyIiwiRGluZ2JhdCBoZXgiOiIzNCIsIlVuaWNvZGUgZGVjIjoiMTI4NDY4IiwiVW5pY29kZSBoZXgiOiIxRjVENCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI1MyIsIkRpbmdiYXQgaGV4IjoiMzUiLCJVbmljb2RlIGRlYyI6IjEyODQzNyIsIlVuaWNvZGUgaGV4IjoiMUY1QjUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiNTQiLCJEaW5nYmF0IGhleCI6IjM2IiwiVW5pY29kZSBkZWMiOiIxMjg0MzgiLCJVbmljb2RlIGhleCI6IjFGNUI2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjU1IiwiRGluZ2JhdCBoZXgiOiIzNyIsIlVuaWNvZGUgZGVjIjoiMTI4NDM5IiwiVW5pY29kZSBoZXgiOiIxRjVCNyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI1NiIsIkRpbmdiYXQgaGV4IjoiMzgiLCJVbmljb2RlIGRlYyI6IjEyODQ0MCIsIlVuaWNvZGUgaGV4IjoiMUY1QjgifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiNTciLCJEaW5nYmF0IGhleCI6IjM5IiwiVW5pY29kZSBkZWMiOiIxMjg0MjkiLCJVbmljb2RlIGhleCI6IjFGNUFEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjU4IiwiRGluZ2JhdCBoZXgiOiIzQSIsIlVuaWNvZGUgZGVjIjoiMTI4NDMxIiwiVW5pY29kZSBoZXgiOiIxRjVBRiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI1OSIsIkRpbmdiYXQgaGV4IjoiM0IiLCJVbmljb2RlIGRlYyI6IjEyODQzMyIsIlVuaWNvZGUgaGV4IjoiMUY1QjEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiNjAiLCJEaW5nYmF0IGhleCI6IjNDIiwiVW5pY29kZSBkZWMiOiIxMjg0MDIiLCJVbmljb2RlIGhleCI6IjFGNTkyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjYxIiwiRGluZ2JhdCBoZXgiOiIzRCIsIlVuaWNvZGUgZGVjIjoiMTI4NDAzIiwiVW5pY29kZSBoZXgiOiIxRjU5MyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI2MiIsIkRpbmdiYXQgaGV4IjoiM0UiLCJVbmljb2RlIGRlYyI6IjEyODQwOCIsIlVuaWNvZGUgaGV4IjoiMUY1OTgifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiNjMiLCJEaW5nYmF0IGhleCI6IjNGIiwiVW5pY29kZSBkZWMiOiIxMjg0MDkiLCJVbmljb2RlIGhleCI6IjFGNTk5In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjY0IiwiRGluZ2JhdCBoZXgiOiI0MCIsIlVuaWNvZGUgZGVjIjoiMTI4NDEwIiwiVW5pY29kZSBoZXgiOiIxRjU5QSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI2NSIsIkRpbmdiYXQgaGV4IjoiNDEiLCJVbmljb2RlIGRlYyI6IjEyODQxMSIsIlVuaWNvZGUgaGV4IjoiMUY1OUIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiNjYiLCJEaW5nYmF0IGhleCI6IjQyIiwiVW5pY29kZSBkZWMiOiIxMjgwNzIiLCJVbmljb2RlIGhleCI6IjFGNDQ4In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjY3IiwiRGluZ2JhdCBoZXgiOiI0MyIsIlVuaWNvZGUgZGVjIjoiMTI4MDczIiwiVW5pY29kZSBoZXgiOiIxRjQ0OSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI2OCIsIkRpbmdiYXQgaGV4IjoiNDQiLCJVbmljb2RlIGRlYyI6IjEyODQxMiIsIlVuaWNvZGUgaGV4IjoiMUY1OUMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiNjkiLCJEaW5nYmF0IGhleCI6IjQ1IiwiVW5pY29kZSBkZWMiOiIxMjg0MTMiLCJVbmljb2RlIGhleCI6IjFGNTlEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjcwIiwiRGluZ2JhdCBoZXgiOiI0NiIsIlVuaWNvZGUgZGVjIjoiMTI4NDE0IiwiVW5pY29kZSBoZXgiOiIxRjU5RSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI3MSIsIkRpbmdiYXQgaGV4IjoiNDciLCJVbmljb2RlIGRlYyI6IjEyODQxNSIsIlVuaWNvZGUgaGV4IjoiMUY1OUYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiNzIiLCJEaW5nYmF0IGhleCI6IjQ4IiwiVW5pY29kZSBkZWMiOiIxMjg0MTYiLCJVbmljb2RlIGhleCI6IjFGNUEwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjczIiwiRGluZ2JhdCBoZXgiOiI0OSIsIlVuaWNvZGUgZGVjIjoiMTI4NDE3IiwiVW5pY29kZSBoZXgiOiIxRjVBMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI3NCIsIkRpbmdiYXQgaGV4IjoiNEEiLCJVbmljb2RlIGRlYyI6IjEyODA3MCIsIlVuaWNvZGUgaGV4IjoiMUY0NDYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiNzUiLCJEaW5nYmF0IGhleCI6IjRCIiwiVW5pY29kZSBkZWMiOiIxMjgwNzEiLCJVbmljb2RlIGhleCI6IjFGNDQ3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6Ijc2IiwiRGluZ2JhdCBoZXgiOiI0QyIsIlVuaWNvZGUgZGVjIjoiMTI4NDE4IiwiVW5pY29kZSBoZXgiOiIxRjVBMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI3NyIsIkRpbmdiYXQgaGV4IjoiNEQiLCJVbmljb2RlIGRlYyI6IjEyODQxOSIsIlVuaWNvZGUgaGV4IjoiMUY1QTMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiNzgiLCJEaW5nYmF0IGhleCI6IjRFIiwiVW5pY29kZSBkZWMiOiIxMjg0MDEiLCJVbmljb2RlIGhleCI6IjFGNTkxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6Ijc5IiwiRGluZ2JhdCBoZXgiOiI0RiIsIlVuaWNvZGUgZGVjIjoiMTI4NTAwIiwiVW5pY29kZSBoZXgiOiIxRjVGNCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI4MCIsIkRpbmdiYXQgaGV4IjoiNTAiLCJVbmljb2RlIGRlYyI6IjEyODUwNCIsIlVuaWNvZGUgaGV4IjoiMUY1RjgifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiODEiLCJEaW5nYmF0IGhleCI6IjUxIiwiVW5pY29kZSBkZWMiOiIxMjg1MDEiLCJVbmljb2RlIGhleCI6IjFGNUY1In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjgyIiwiRGluZ2JhdCBoZXgiOiI1MiIsIlVuaWNvZGUgZGVjIjoiOTc0NSIsIlVuaWNvZGUgaGV4IjoiMjYxMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI4MyIsIkRpbmdiYXQgaGV4IjoiNTMiLCJVbmljb2RlIGRlYyI6IjExMTk3IiwiVW5pY29kZSBoZXgiOiIyQkJEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6Ijg0IiwiRGluZ2JhdCBoZXgiOiI1NCIsIlVuaWNvZGUgZGVjIjoiOTc0NiIsIlVuaWNvZGUgaGV4IjoiMjYxMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI4NSIsIkRpbmdiYXQgaGV4IjoiNTUiLCJVbmljb2RlIGRlYyI6IjExMTk4IiwiVW5pY29kZSBoZXgiOiIyQkJFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6Ijg2IiwiRGluZ2JhdCBoZXgiOiI1NiIsIlVuaWNvZGUgZGVjIjoiMTExOTkiLCJVbmljb2RlIGhleCI6IjJCQkYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiODciLCJEaW5nYmF0IGhleCI6IjU3IiwiVW5pY29kZSBkZWMiOiIxMjg3MTEiLCJVbmljb2RlIGhleCI6IjFGNkM3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6Ijg4IiwiRGluZ2JhdCBoZXgiOiI1OCIsIlVuaWNvZGUgZGVjIjoiMTA2ODAiLCJVbmljb2RlIGhleCI6IjI5QjgifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiODkiLCJEaW5nYmF0IGhleCI6IjU5IiwiVW5pY29kZSBkZWMiOiIxMjg2MjUiLCJVbmljb2RlIGhleCI6IjFGNjcxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjkwIiwiRGluZ2JhdCBoZXgiOiI1QSIsIlVuaWNvZGUgZGVjIjoiMTI4NjI4IiwiVW5pY29kZSBoZXgiOiIxRjY3NCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI5MSIsIkRpbmdiYXQgaGV4IjoiNUIiLCJVbmljb2RlIGRlYyI6IjEyODYyNiIsIlVuaWNvZGUgaGV4IjoiMUY2NzIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiOTIiLCJEaW5nYmF0IGhleCI6IjVDIiwiVW5pY29kZSBkZWMiOiIxMjg2MjciLCJVbmljb2RlIGhleCI6IjFGNjczIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjkzIiwiRGluZ2JhdCBoZXgiOiI1RCIsIlVuaWNvZGUgZGVjIjoiODI1MyIsIlVuaWNvZGUgaGV4IjoiMjAzRCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI5NCIsIkRpbmdiYXQgaGV4IjoiNUUiLCJVbmljb2RlIGRlYyI6IjEyODYzMyIsIlVuaWNvZGUgaGV4IjoiMUY2NzkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiOTUiLCJEaW5nYmF0IGhleCI6IjVGIiwiVW5pY29kZSBkZWMiOiIxMjg2MzQiLCJVbmljb2RlIGhleCI6IjFGNjdBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6Ijk2IiwiRGluZ2JhdCBoZXgiOiI2MCIsIlVuaWNvZGUgZGVjIjoiMTI4NjM1IiwiVW5pY29kZSBoZXgiOiIxRjY3QiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiI5NyIsIkRpbmdiYXQgaGV4IjoiNjEiLCJVbmljb2RlIGRlYyI6IjEyODYxNCIsIlVuaWNvZGUgaGV4IjoiMUY2NjYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiOTgiLCJEaW5nYmF0IGhleCI6IjYyIiwiVW5pY29kZSBkZWMiOiIxMjg2MTIiLCJVbmljb2RlIGhleCI6IjFGNjY0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6Ijk5IiwiRGluZ2JhdCBoZXgiOiI2MyIsIlVuaWNvZGUgZGVjIjoiMTI4NjEzIiwiVW5pY29kZSBoZXgiOiIxRjY2NSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxMDAiLCJEaW5nYmF0IGhleCI6IjY0IiwiVW5pY29kZSBkZWMiOiIxMjg2MTUiLCJVbmljb2RlIGhleCI6IjFGNjY3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjEwMSIsIkRpbmdiYXQgaGV4IjoiNjUiLCJVbmljb2RlIGRlYyI6IjEyODYwMiIsIlVuaWNvZGUgaGV4IjoiMUY2NUEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTAyIiwiRGluZ2JhdCBoZXgiOiI2NiIsIlVuaWNvZGUgZGVjIjoiMTI4NjAwIiwiVW5pY29kZSBoZXgiOiIxRjY1OCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxMDMiLCJEaW5nYmF0IGhleCI6IjY3IiwiVW5pY29kZSBkZWMiOiIxMjg2MDEiLCJVbmljb2RlIGhleCI6IjFGNjU5In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjEwNCIsIkRpbmdiYXQgaGV4IjoiNjgiLCJVbmljb2RlIGRlYyI6IjEyODYwMyIsIlVuaWNvZGUgaGV4IjoiMUY2NUIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTA1IiwiRGluZ2JhdCBoZXgiOiI2OSIsIlVuaWNvZGUgZGVjIjoiOTQ1MCIsIlVuaWNvZGUgaGV4IjoiMjRFQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxMDYiLCJEaW5nYmF0IGhleCI6IjZBIiwiVW5pY29kZSBkZWMiOiI5MzEyIiwiVW5pY29kZSBoZXgiOiIyNDYwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjEwNyIsIkRpbmdiYXQgaGV4IjoiNkIiLCJVbmljb2RlIGRlYyI6IjkzMTMiLCJVbmljb2RlIGhleCI6IjI0NjEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTA4IiwiRGluZ2JhdCBoZXgiOiI2QyIsIlVuaWNvZGUgZGVjIjoiOTMxNCIsIlVuaWNvZGUgaGV4IjoiMjQ2MiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxMDkiLCJEaW5nYmF0IGhleCI6IjZEIiwiVW5pY29kZSBkZWMiOiI5MzE1IiwiVW5pY29kZSBoZXgiOiIyNDYzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjExMCIsIkRpbmdiYXQgaGV4IjoiNkUiLCJVbmljb2RlIGRlYyI6IjkzMTYiLCJVbmljb2RlIGhleCI6IjI0NjQifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTExIiwiRGluZ2JhdCBoZXgiOiI2RiIsIlVuaWNvZGUgZGVjIjoiOTMxNyIsIlVuaWNvZGUgaGV4IjoiMjQ2NSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxMTIiLCJEaW5nYmF0IGhleCI6IjcwIiwiVW5pY29kZSBkZWMiOiI5MzE4IiwiVW5pY29kZSBoZXgiOiIyNDY2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjExMyIsIkRpbmdiYXQgaGV4IjoiNzEiLCJVbmljb2RlIGRlYyI6IjkzMTkiLCJVbmljb2RlIGhleCI6IjI0NjcifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTE0IiwiRGluZ2JhdCBoZXgiOiI3MiIsIlVuaWNvZGUgZGVjIjoiOTMyMCIsIlVuaWNvZGUgaGV4IjoiMjQ2OCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxMTUiLCJEaW5nYmF0IGhleCI6IjczIiwiVW5pY29kZSBkZWMiOiI5MzIxIiwiVW5pY29kZSBoZXgiOiIyNDY5In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjExNiIsIkRpbmdiYXQgaGV4IjoiNzQiLCJVbmljb2RlIGRlYyI6Ijk0NzEiLCJVbmljb2RlIGhleCI6IjI0RkYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTE3IiwiRGluZ2JhdCBoZXgiOiI3NSIsIlVuaWNvZGUgZGVjIjoiMTAxMDIiLCJVbmljb2RlIGhleCI6IjI3NzYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTE4IiwiRGluZ2JhdCBoZXgiOiI3NiIsIlVuaWNvZGUgZGVjIjoiMTAxMDMiLCJVbmljb2RlIGhleCI6IjI3NzcifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTE5IiwiRGluZ2JhdCBoZXgiOiI3NyIsIlVuaWNvZGUgZGVjIjoiMTAxMDQiLCJVbmljb2RlIGhleCI6IjI3NzgifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTIwIiwiRGluZ2JhdCBoZXgiOiI3OCIsIlVuaWNvZGUgZGVjIjoiMTAxMDUiLCJVbmljb2RlIGhleCI6IjI3NzkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTIxIiwiRGluZ2JhdCBoZXgiOiI3OSIsIlVuaWNvZGUgZGVjIjoiMTAxMDYiLCJVbmljb2RlIGhleCI6IjI3N0EifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTIyIiwiRGluZ2JhdCBoZXgiOiI3QSIsIlVuaWNvZGUgZGVjIjoiMTAxMDciLCJVbmljb2RlIGhleCI6IjI3N0IifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTIzIiwiRGluZ2JhdCBoZXgiOiI3QiIsIlVuaWNvZGUgZGVjIjoiMTAxMDgiLCJVbmljb2RlIGhleCI6IjI3N0MifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTI0IiwiRGluZ2JhdCBoZXgiOiI3QyIsIlVuaWNvZGUgZGVjIjoiMTAxMDkiLCJVbmljb2RlIGhleCI6IjI3N0QifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTI1IiwiRGluZ2JhdCBoZXgiOiI3RCIsIlVuaWNvZGUgZGVjIjoiMTAxMTAiLCJVbmljb2RlIGhleCI6IjI3N0UifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTI2IiwiRGluZ2JhdCBoZXgiOiI3RSIsIlVuaWNvZGUgZGVjIjoiMTAxMTEiLCJVbmljb2RlIGhleCI6IjI3N0YifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTI4IiwiRGluZ2JhdCBoZXgiOiI4MCIsIlVuaWNvZGUgZGVjIjoiOTczNyIsIlVuaWNvZGUgaGV4IjoiMjYwOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxMjkiLCJEaW5nYmF0IGhleCI6IjgxIiwiVW5pY29kZSBkZWMiOiIxMjc3NjUiLCJVbmljb2RlIGhleCI6IjFGMzE1In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjEzMCIsIkRpbmdiYXQgaGV4IjoiODIiLCJVbmljb2RlIGRlYyI6Ijk3ODkiLCJVbmljb2RlIGhleCI6IjI2M0QifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTMxIiwiRGluZ2JhdCBoZXgiOiI4MyIsIlVuaWNvZGUgZGVjIjoiOTc5MCIsIlVuaWNvZGUgaGV4IjoiMjYzRSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxMzIiLCJEaW5nYmF0IGhleCI6Ijg0IiwiVW5pY29kZSBkZWMiOiIxMTgzOSIsIlVuaWNvZGUgaGV4IjoiMkUzRiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxMzMiLCJEaW5nYmF0IGhleCI6Ijg1IiwiVW5pY29kZSBkZWMiOiIxMDAxMyIsIlVuaWNvZGUgaGV4IjoiMjcxRCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxMzQiLCJEaW5nYmF0IGhleCI6Ijg2IiwiVW5pY29kZSBkZWMiOiIxMjgzMjciLCJVbmljb2RlIGhleCI6IjFGNTQ3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjEzNSIsIkRpbmdiYXQgaGV4IjoiODciLCJVbmljb2RlIGRlYyI6IjEyODM0OCIsIlVuaWNvZGUgaGV4IjoiMUY1NUMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTM2IiwiRGluZ2JhdCBoZXgiOiI4OCIsIlVuaWNvZGUgZGVjIjoiMTI4MzQ5IiwiVW5pY29kZSBoZXgiOiIxRjU1RCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxMzciLCJEaW5nYmF0IGhleCI6Ijg5IiwiVW5pY29kZSBkZWMiOiIxMjgzNTAiLCJVbmljb2RlIGhleCI6IjFGNTVFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjEzOCIsIkRpbmdiYXQgaGV4IjoiOEEiLCJVbmljb2RlIGRlYyI6IjEyODM1MSIsIlVuaWNvZGUgaGV4IjoiMUY1NUYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTM5IiwiRGluZ2JhdCBoZXgiOiI4QiIsIlVuaWNvZGUgZGVjIjoiMTI4MzUyIiwiVW5pY29kZSBoZXgiOiIxRjU2MCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxNDAiLCJEaW5nYmF0IGhleCI6IjhDIiwiVW5pY29kZSBkZWMiOiIxMjgzNTMiLCJVbmljb2RlIGhleCI6IjFGNTYxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE0MSIsIkRpbmdiYXQgaGV4IjoiOEQiLCJVbmljb2RlIGRlYyI6IjEyODM1NCIsIlVuaWNvZGUgaGV4IjoiMUY1NjIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTQyIiwiRGluZ2JhdCBoZXgiOiI4RSIsIlVuaWNvZGUgZGVjIjoiMTI4MzU1IiwiVW5pY29kZSBoZXgiOiIxRjU2MyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxNDMiLCJEaW5nYmF0IGhleCI6IjhGIiwiVW5pY29kZSBkZWMiOiIxMjgzNTYiLCJVbmljb2RlIGhleCI6IjFGNTY0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE0NCIsIkRpbmdiYXQgaGV4IjoiOTAiLCJVbmljb2RlIGRlYyI6IjEyODM1NyIsIlVuaWNvZGUgaGV4IjoiMUY1NjUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTQ1IiwiRGluZ2JhdCBoZXgiOiI5MSIsIlVuaWNvZGUgZGVjIjoiMTI4MzU4IiwiVW5pY29kZSBoZXgiOiIxRjU2NiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxNDYiLCJEaW5nYmF0IGhleCI6IjkyIiwiVW5pY29kZSBkZWMiOiIxMjgzNTkiLCJVbmljb2RlIGhleCI6IjFGNTY3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE0NyIsIkRpbmdiYXQgaGV4IjoiOTMiLCJVbmljb2RlIGRlYyI6IjEyODYxNiIsIlVuaWNvZGUgaGV4IjoiMUY2NjgifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTQ4IiwiRGluZ2JhdCBoZXgiOiI5NCIsIlVuaWNvZGUgZGVjIjoiMTI4NjE3IiwiVW5pY29kZSBoZXgiOiIxRjY2OSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxNDkiLCJEaW5nYmF0IGhleCI6Ijk1IiwiVW5pY29kZSBkZWMiOiI4OTAxIiwiVW5pY29kZSBoZXgiOiIyMkM1In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE1MCIsIkRpbmdiYXQgaGV4IjoiOTYiLCJVbmljb2RlIGRlYyI6IjEyODkwMCIsIlVuaWNvZGUgaGV4IjoiMUY3ODQifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTUxIiwiRGluZ2JhdCBoZXgiOiI5NyIsIlVuaWNvZGUgZGVjIjoiMTA2MjUiLCJVbmljb2RlIGhleCI6IjI5ODEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTUyIiwiRGluZ2JhdCBoZXgiOiI5OCIsIlVuaWNvZGUgZGVjIjoiOTY3OSIsIlVuaWNvZGUgaGV4IjoiMjVDRiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxNTMiLCJEaW5nYmF0IGhleCI6Ijk5IiwiVW5pY29kZSBkZWMiOiI5Njc1IiwiVW5pY29kZSBoZXgiOiIyNUNCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE1NCIsIkRpbmdiYXQgaGV4IjoiOUEiLCJVbmljb2RlIGRlYyI6IjEyODkwMSIsIlVuaWNvZGUgaGV4IjoiMUY3ODUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTU1IiwiRGluZ2JhdCBoZXgiOiI5QiIsIlVuaWNvZGUgZGVjIjoiMTI4OTAzIiwiVW5pY29kZSBoZXgiOiIxRjc4NyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxNTYiLCJEaW5nYmF0IGhleCI6IjlDIiwiVW5pY29kZSBkZWMiOiIxMjg5MDUiLCJVbmljb2RlIGhleCI6IjFGNzg5In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE1NyIsIkRpbmdiYXQgaGV4IjoiOUQiLCJVbmljb2RlIGRlYyI6Ijg4NTciLCJVbmljb2RlIGhleCI6IjIyOTkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTU4IiwiRGluZ2JhdCBoZXgiOiI5RSIsIlVuaWNvZGUgZGVjIjoiMTA2ODciLCJVbmljb2RlIGhleCI6IjI5QkYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTU5IiwiRGluZ2JhdCBoZXgiOiI5RiIsIlVuaWNvZGUgZGVjIjoiMTI4OTA4IiwiVW5pY29kZSBoZXgiOiIxRjc4QyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxNjAiLCJEaW5nYmF0IGhleCI6IkEwIiwiVW5pY29kZSBkZWMiOiIxMjg5MDkiLCJVbmljb2RlIGhleCI6IjFGNzhEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE2MSIsIkRpbmdiYXQgaGV4IjoiQTEiLCJVbmljb2RlIGRlYyI6Ijk3MjYiLCJVbmljb2RlIGhleCI6IjI1RkUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTYyIiwiRGluZ2JhdCBoZXgiOiJBMiIsIlVuaWNvZGUgZGVjIjoiOTYzMiIsIlVuaWNvZGUgaGV4IjoiMjVBMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxNjMiLCJEaW5nYmF0IGhleCI6IkEzIiwiVW5pY29kZSBkZWMiOiI5NjMzIiwiVW5pY29kZSBoZXgiOiIyNUExIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE2NCIsIkRpbmdiYXQgaGV4IjoiQTQiLCJVbmljb2RlIGRlYyI6IjEyODkxMyIsIlVuaWNvZGUgaGV4IjoiMUY3OTEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTY1IiwiRGluZ2JhdCBoZXgiOiJBNSIsIlVuaWNvZGUgZGVjIjoiMTI4OTE0IiwiVW5pY29kZSBoZXgiOiIxRjc5MiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxNjYiLCJEaW5nYmF0IGhleCI6IkE2IiwiVW5pY29kZSBkZWMiOiIxMjg5MTUiLCJVbmljb2RlIGhleCI6IjFGNzkzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE2NyIsIkRpbmdiYXQgaGV4IjoiQTciLCJVbmljb2RlIGRlYyI6IjEyODkxNiIsIlVuaWNvZGUgaGV4IjoiMUY3OTQifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTY4IiwiRGluZ2JhdCBoZXgiOiJBOCIsIlVuaWNvZGUgZGVjIjoiOTYzNSIsIlVuaWNvZGUgaGV4IjoiMjVBMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxNjkiLCJEaW5nYmF0IGhleCI6IkE5IiwiVW5pY29kZSBkZWMiOiIxMjg5MTciLCJVbmljb2RlIGhleCI6IjFGNzk1In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE3MCIsIkRpbmdiYXQgaGV4IjoiQUEiLCJVbmljb2RlIGRlYyI6IjEyODkxOCIsIlVuaWNvZGUgaGV4IjoiMUY3OTYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTcxIiwiRGluZ2JhdCBoZXgiOiJBQiIsIlVuaWNvZGUgZGVjIjoiMTI4OTE5IiwiVW5pY29kZSBoZXgiOiIxRjc5NyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxNzIiLCJEaW5nYmF0IGhleCI6IkFDIiwiVW5pY29kZSBkZWMiOiIxMjg5MjAiLCJVbmljb2RlIGhleCI6IjFGNzk4In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE3MyIsIkRpbmdiYXQgaGV4IjoiQUQiLCJVbmljb2RlIGRlYyI6IjExMDQ5IiwiVW5pY29kZSBoZXgiOiIyQjI5In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE3NCIsIkRpbmdiYXQgaGV4IjoiQUUiLCJVbmljb2RlIGRlYyI6IjExMDQ1IiwiVW5pY29kZSBoZXgiOiIyQjI1In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE3NSIsIkRpbmdiYXQgaGV4IjoiQUYiLCJVbmljb2RlIGRlYyI6Ijk2NzEiLCJVbmljb2RlIGhleCI6IjI1QzcifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTc2IiwiRGluZ2JhdCBoZXgiOiJCMCIsIlVuaWNvZGUgZGVjIjoiMTI4OTIyIiwiVW5pY29kZSBoZXgiOiIxRjc5QSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxNzciLCJEaW5nYmF0IGhleCI6IkIxIiwiVW5pY29kZSBkZWMiOiI5NjcyIiwiVW5pY29kZSBoZXgiOiIyNUM4In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE3OCIsIkRpbmdiYXQgaGV4IjoiQjIiLCJVbmljb2RlIGRlYyI6IjEyODkyMyIsIlVuaWNvZGUgaGV4IjoiMUY3OUIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTc5IiwiRGluZ2JhdCBoZXgiOiJCMyIsIlVuaWNvZGUgZGVjIjoiMTI4OTI0IiwiVW5pY29kZSBoZXgiOiIxRjc5QyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxODAiLCJEaW5nYmF0IGhleCI6IkI0IiwiVW5pY29kZSBkZWMiOiIxMjg5MjUiLCJVbmljb2RlIGhleCI6IjFGNzlEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE4MSIsIkRpbmdiYXQgaGV4IjoiQjUiLCJVbmljb2RlIGRlYyI6IjEyODkyNiIsIlVuaWNvZGUgaGV4IjoiMUY3OUUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTgyIiwiRGluZ2JhdCBoZXgiOiJCNiIsIlVuaWNvZGUgZGVjIjoiMTEwNTAiLCJVbmljb2RlIGhleCI6IjJCMkEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTgzIiwiRGluZ2JhdCBoZXgiOiJCNyIsIlVuaWNvZGUgZGVjIjoiMTEwNDciLCJVbmljb2RlIGhleCI6IjJCMjcifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTg0IiwiRGluZ2JhdCBoZXgiOiJCOCIsIlVuaWNvZGUgZGVjIjoiOTY3NCIsIlVuaWNvZGUgaGV4IjoiMjVDQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxODUiLCJEaW5nYmF0IGhleCI6IkI5IiwiVW5pY29kZSBkZWMiOiIxMjg5MjgiLCJVbmljb2RlIGhleCI6IjFGN0EwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE4NiIsIkRpbmdiYXQgaGV4IjoiQkEiLCJVbmljb2RlIGRlYyI6Ijk2ODYiLCJVbmljb2RlIGhleCI6IjI1RDYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMTg3IiwiRGluZ2JhdCBoZXgiOiJCQiIsIlVuaWNvZGUgZGVjIjoiOTY4NyIsIlVuaWNvZGUgaGV4IjoiMjVENyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxODgiLCJEaW5nYmF0IGhleCI6IkJDIiwiVW5pY29kZSBkZWMiOiIxMTIxMCIsIlVuaWNvZGUgaGV4IjoiMkJDQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxODkiLCJEaW5nYmF0IGhleCI6IkJEIiwiVW5pY29kZSBkZWMiOiIxMTIxMSIsIlVuaWNvZGUgaGV4IjoiMkJDQiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxOTAiLCJEaW5nYmF0IGhleCI6IkJFIiwiVW5pY29kZSBkZWMiOiIxMTIwMCIsIlVuaWNvZGUgaGV4IjoiMkJDMCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxOTEiLCJEaW5nYmF0IGhleCI6IkJGIiwiVW5pY29kZSBkZWMiOiIxMTIwMSIsIlVuaWNvZGUgaGV4IjoiMkJDMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxOTIiLCJEaW5nYmF0IGhleCI6IkMwIiwiVW5pY29kZSBkZWMiOiIxMTAzOSIsIlVuaWNvZGUgaGV4IjoiMkIxRiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxOTMiLCJEaW5nYmF0IGhleCI6IkMxIiwiVW5pY29kZSBkZWMiOiIxMTIwMiIsIlVuaWNvZGUgaGV4IjoiMkJDMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxOTQiLCJEaW5nYmF0IGhleCI6IkMyIiwiVW5pY29kZSBkZWMiOiIxMTA0MyIsIlVuaWNvZGUgaGV4IjoiMkIyMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxOTUiLCJEaW5nYmF0IGhleCI6IkMzIiwiVW5pY29kZSBkZWMiOiIxMTA0MiIsIlVuaWNvZGUgaGV4IjoiMkIyMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxOTYiLCJEaW5nYmF0IGhleCI6IkM0IiwiVW5pY29kZSBkZWMiOiIxMTIwMyIsIlVuaWNvZGUgaGV4IjoiMkJDMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxOTciLCJEaW5nYmF0IGhleCI6IkM1IiwiVW5pY29kZSBkZWMiOiIxMTIwNCIsIlVuaWNvZGUgaGV4IjoiMkJDNCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIxOTgiLCJEaW5nYmF0IGhleCI6IkM2IiwiVW5pY29kZSBkZWMiOiIxMjg5MjkiLCJVbmljb2RlIGhleCI6IjFGN0ExIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjE5OSIsIkRpbmdiYXQgaGV4IjoiQzciLCJVbmljb2RlIGRlYyI6IjEyODkzMCIsIlVuaWNvZGUgaGV4IjoiMUY3QTIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjAwIiwiRGluZ2JhdCBoZXgiOiJDOCIsIlVuaWNvZGUgZGVjIjoiMTI4OTMxIiwiVW5pY29kZSBoZXgiOiIxRjdBMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyMDEiLCJEaW5nYmF0IGhleCI6IkM5IiwiVW5pY29kZSBkZWMiOiIxMjg5MzIiLCJVbmljb2RlIGhleCI6IjFGN0E0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjIwMiIsIkRpbmdiYXQgaGV4IjoiQ0EiLCJVbmljb2RlIGRlYyI6IjEyODkzMyIsIlVuaWNvZGUgaGV4IjoiMUY3QTUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjAzIiwiRGluZ2JhdCBoZXgiOiJDQiIsIlVuaWNvZGUgZGVjIjoiMTI4OTM0IiwiVW5pY29kZSBoZXgiOiIxRjdBNiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyMDQiLCJEaW5nYmF0IGhleCI6IkNDIiwiVW5pY29kZSBkZWMiOiIxMjg5MzUiLCJVbmljb2RlIGhleCI6IjFGN0E3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjIwNSIsIkRpbmdiYXQgaGV4IjoiQ0QiLCJVbmljb2RlIGRlYyI6IjEyODkzNiIsIlVuaWNvZGUgaGV4IjoiMUY3QTgifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjA2IiwiRGluZ2JhdCBoZXgiOiJDRSIsIlVuaWNvZGUgZGVjIjoiMTI4OTM3IiwiVW5pY29kZSBoZXgiOiIxRjdBOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyMDciLCJEaW5nYmF0IGhleCI6IkNGIiwiVW5pY29kZSBkZWMiOiIxMjg5MzgiLCJVbmljb2RlIGhleCI6IjFGN0FBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjIwOCIsIkRpbmdiYXQgaGV4IjoiRDAiLCJVbmljb2RlIGRlYyI6IjEyODkzOSIsIlVuaWNvZGUgaGV4IjoiMUY3QUIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjA5IiwiRGluZ2JhdCBoZXgiOiJEMSIsIlVuaWNvZGUgZGVjIjoiMTI4OTQwIiwiVW5pY29kZSBoZXgiOiIxRjdBQyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyMTAiLCJEaW5nYmF0IGhleCI6IkQyIiwiVW5pY29kZSBkZWMiOiIxMjg5NDEiLCJVbmljb2RlIGhleCI6IjFGN0FEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjIxMSIsIkRpbmdiYXQgaGV4IjoiRDMiLCJVbmljb2RlIGRlYyI6IjEyODk0MiIsIlVuaWNvZGUgaGV4IjoiMUY3QUUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjEyIiwiRGluZ2JhdCBoZXgiOiJENCIsIlVuaWNvZGUgZGVjIjoiMTI4OTQzIiwiVW5pY29kZSBoZXgiOiIxRjdBRiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyMTMiLCJEaW5nYmF0IGhleCI6IkQ1IiwiVW5pY29kZSBkZWMiOiIxMjg5NDQiLCJVbmljb2RlIGhleCI6IjFGN0IwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjIxNCIsIkRpbmdiYXQgaGV4IjoiRDYiLCJVbmljb2RlIGRlYyI6IjEyODk0NSIsIlVuaWNvZGUgaGV4IjoiMUY3QjEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjE1IiwiRGluZ2JhdCBoZXgiOiJENyIsIlVuaWNvZGUgZGVjIjoiMTI4OTQ2IiwiVW5pY29kZSBoZXgiOiIxRjdCMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyMTYiLCJEaW5nYmF0IGhleCI6IkQ4IiwiVW5pY29kZSBkZWMiOiIxMjg5NDciLCJVbmljb2RlIGhleCI6IjFGN0IzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjIxNyIsIkRpbmdiYXQgaGV4IjoiRDkiLCJVbmljb2RlIGRlYyI6IjEyODk0OCIsIlVuaWNvZGUgaGV4IjoiMUY3QjQifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjE4IiwiRGluZ2JhdCBoZXgiOiJEQSIsIlVuaWNvZGUgZGVjIjoiMTI4OTQ5IiwiVW5pY29kZSBoZXgiOiIxRjdCNSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyMTkiLCJEaW5nYmF0IGhleCI6IkRCIiwiVW5pY29kZSBkZWMiOiIxMjg5NTAiLCJVbmljb2RlIGhleCI6IjFGN0I2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjIyMCIsIkRpbmdiYXQgaGV4IjoiREMiLCJVbmljb2RlIGRlYyI6IjEyODk1MSIsIlVuaWNvZGUgaGV4IjoiMUY3QjcifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjIxIiwiRGluZ2JhdCBoZXgiOiJERCIsIlVuaWNvZGUgZGVjIjoiMTI4OTUyIiwiVW5pY29kZSBoZXgiOiIxRjdCOCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyMjIiLCJEaW5nYmF0IGhleCI6IkRFIiwiVW5pY29kZSBkZWMiOiIxMjg5NTMiLCJVbmljb2RlIGhleCI6IjFGN0I5In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjIyMyIsIkRpbmdiYXQgaGV4IjoiREYiLCJVbmljb2RlIGRlYyI6IjEyODk1NCIsIlVuaWNvZGUgaGV4IjoiMUY3QkEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjI0IiwiRGluZ2JhdCBoZXgiOiJFMCIsIlVuaWNvZGUgZGVjIjoiMTI4OTU1IiwiVW5pY29kZSBoZXgiOiIxRjdCQiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyMjUiLCJEaW5nYmF0IGhleCI6IkUxIiwiVW5pY29kZSBkZWMiOiIxMjg5NTYiLCJVbmljb2RlIGhleCI6IjFGN0JDIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjIyNiIsIkRpbmdiYXQgaGV4IjoiRTIiLCJVbmljb2RlIGRlYyI6IjEyODk1NyIsIlVuaWNvZGUgaGV4IjoiMUY3QkQifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjI3IiwiRGluZ2JhdCBoZXgiOiJFMyIsIlVuaWNvZGUgZGVjIjoiMTI4OTU4IiwiVW5pY29kZSBoZXgiOiIxRjdCRSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyMjgiLCJEaW5nYmF0IGhleCI6IkU0IiwiVW5pY29kZSBkZWMiOiIxMjg5NTkiLCJVbmljb2RlIGhleCI6IjFGN0JGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjIyOSIsIkRpbmdiYXQgaGV4IjoiRTUiLCJVbmljb2RlIGRlYyI6IjEyODk2MCIsIlVuaWNvZGUgaGV4IjoiMUY3QzAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjMwIiwiRGluZ2JhdCBoZXgiOiJFNiIsIlVuaWNvZGUgZGVjIjoiMTI4OTYyIiwiVW5pY29kZSBoZXgiOiIxRjdDMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyMzEiLCJEaW5nYmF0IGhleCI6IkU3IiwiVW5pY29kZSBkZWMiOiIxMjg5NjQiLCJVbmljb2RlIGhleCI6IjFGN0M0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjIzMiIsIkRpbmdiYXQgaGV4IjoiRTgiLCJVbmljb2RlIGRlYyI6IjEyODk2NiIsIlVuaWNvZGUgaGV4IjoiMUY3QzYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjMzIiwiRGluZ2JhdCBoZXgiOiJFOSIsIlVuaWNvZGUgZGVjIjoiMTI4OTY5IiwiVW5pY29kZSBoZXgiOiIxRjdDOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyMzQiLCJEaW5nYmF0IGhleCI6IkVBIiwiVW5pY29kZSBkZWMiOiIxMjg5NzAiLCJVbmljb2RlIGhleCI6IjFGN0NBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjIzNSIsIkRpbmdiYXQgaGV4IjoiRUIiLCJVbmljb2RlIGRlYyI6IjEwMDM4IiwiVW5pY29kZSBoZXgiOiIyNzM2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjIzNiIsIkRpbmdiYXQgaGV4IjoiRUMiLCJVbmljb2RlIGRlYyI6IjEyODk3MiIsIlVuaWNvZGUgaGV4IjoiMUY3Q0MifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjM3IiwiRGluZ2JhdCBoZXgiOiJFRCIsIlVuaWNvZGUgZGVjIjoiMTI4OTc0IiwiVW5pY29kZSBoZXgiOiIxRjdDRSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyMzgiLCJEaW5nYmF0IGhleCI6IkVFIiwiVW5pY29kZSBkZWMiOiIxMjg5NzYiLCJVbmljb2RlIGhleCI6IjFGN0QwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjIzOSIsIkRpbmdiYXQgaGV4IjoiRUYiLCJVbmljb2RlIGRlYyI6IjEyODk3OCIsIlVuaWNvZGUgaGV4IjoiMUY3RDIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjQwIiwiRGluZ2JhdCBoZXgiOiJGMCIsIlVuaWNvZGUgZGVjIjoiMTAwNDEiLCJVbmljb2RlIGhleCI6IjI3MzkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjQxIiwiRGluZ2JhdCBoZXgiOiJGMSIsIlVuaWNvZGUgZGVjIjoiMTI4OTYzIiwiVW5pY29kZSBoZXgiOiIxRjdDMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyNDIiLCJEaW5nYmF0IGhleCI6IkYyIiwiVW5pY29kZSBkZWMiOiIxMjg5NjciLCJVbmljb2RlIGhleCI6IjFGN0M3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjI0MyIsIkRpbmdiYXQgaGV4IjoiRjMiLCJVbmljb2RlIGRlYyI6IjEwMDMxIiwiVW5pY29kZSBoZXgiOiIyNzJGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjI0NCIsIkRpbmdiYXQgaGV4IjoiRjQiLCJVbmljb2RlIGRlYyI6IjEyODk3MyIsIlVuaWNvZGUgaGV4IjoiMUY3Q0QifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMiIsIkRpbmdiYXQgZGVjIjoiMjQ1IiwiRGluZ2JhdCBoZXgiOiJGNSIsIlVuaWNvZGUgZGVjIjoiMTI4OTgwIiwiVW5pY29kZSBoZXgiOiIxRjdENCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyNDYiLCJEaW5nYmF0IGhleCI6IkY2IiwiVW5pY29kZSBkZWMiOiIxMTIxMiIsIlVuaWNvZGUgaGV4IjoiMkJDQyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyNDciLCJEaW5nYmF0IGhleCI6IkY3IiwiVW5pY29kZSBkZWMiOiIxMTIxMyIsIlVuaWNvZGUgaGV4IjoiMkJDRCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAyIiwiRGluZ2JhdCBkZWMiOiIyNDgiLCJEaW5nYmF0IGhleCI6IkY4IiwiVW5pY29kZSBkZWMiOiI4MjUxIiwiVW5pY29kZSBoZXgiOiIyMDNCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDIiLCJEaW5nYmF0IGRlYyI6IjI0OSIsIkRpbmdiYXQgaGV4IjoiRjkiLCJVbmljb2RlIGRlYyI6IjgyNTgiLCJVbmljb2RlIGhleCI6IjIwNDIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMzIiLCJEaW5nYmF0IGhleCI6IjIwIiwiVW5pY29kZSBkZWMiOiIzMiIsIlVuaWNvZGUgaGV4IjoiMjAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMzMiLCJEaW5nYmF0IGhleCI6IjIxIiwiVW5pY29kZSBkZWMiOiIxMTEwNCIsIlVuaWNvZGUgaGV4IjoiMkI2MCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIzNCIsIkRpbmdiYXQgaGV4IjoiMjIiLCJVbmljb2RlIGRlYyI6IjExMTA2IiwiVW5pY29kZSBoZXgiOiIyQjYyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjM1IiwiRGluZ2JhdCBoZXgiOiIyMyIsIlVuaWNvZGUgZGVjIjoiMTExMDUiLCJVbmljb2RlIGhleCI6IjJCNjEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMzYiLCJEaW5nYmF0IGhleCI6IjI0IiwiVW5pY29kZSBkZWMiOiIxMTEwNyIsIlVuaWNvZGUgaGV4IjoiMkI2MyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIzNyIsIkRpbmdiYXQgaGV4IjoiMjUiLCJVbmljb2RlIGRlYyI6IjExMTEwIiwiVW5pY29kZSBoZXgiOiIyQjY2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjM4IiwiRGluZ2JhdCBoZXgiOiIyNiIsIlVuaWNvZGUgZGVjIjoiMTExMTEiLCJVbmljb2RlIGhleCI6IjJCNjcifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMzkiLCJEaW5nYmF0IGhleCI6IjI3IiwiVW5pY29kZSBkZWMiOiIxMTExMyIsIlVuaWNvZGUgaGV4IjoiMkI2OSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI0MCIsIkRpbmdiYXQgaGV4IjoiMjgiLCJVbmljb2RlIGRlYyI6IjExMTEyIiwiVW5pY29kZSBoZXgiOiIyQjY4In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjQxIiwiRGluZ2JhdCBoZXgiOiIyOSIsIlVuaWNvZGUgZGVjIjoiMTExMjAiLCJVbmljb2RlIGhleCI6IjJCNzAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiNDIiLCJEaW5nYmF0IGhleCI6IjJBIiwiVW5pY29kZSBkZWMiOiIxMTEyMiIsIlVuaWNvZGUgaGV4IjoiMkI3MiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI0MyIsIkRpbmdiYXQgaGV4IjoiMkIiLCJVbmljb2RlIGRlYyI6IjExMTIxIiwiVW5pY29kZSBoZXgiOiIyQjcxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjQ0IiwiRGluZ2JhdCBoZXgiOiIyQyIsIlVuaWNvZGUgZGVjIjoiMTExMjMiLCJVbmljb2RlIGhleCI6IjJCNzMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiNDUiLCJEaW5nYmF0IGhleCI6IjJEIiwiVW5pY29kZSBkZWMiOiIxMTEyNiIsIlVuaWNvZGUgaGV4IjoiMkI3NiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI0NiIsIkRpbmdiYXQgaGV4IjoiMkUiLCJVbmljb2RlIGRlYyI6IjExMTI4IiwiVW5pY29kZSBoZXgiOiIyQjc4In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjQ3IiwiRGluZ2JhdCBoZXgiOiIyRiIsIlVuaWNvZGUgZGVjIjoiMTExMzEiLCJVbmljb2RlIGhleCI6IjJCN0IifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiNDgiLCJEaW5nYmF0IGhleCI6IjMwIiwiVW5pY29kZSBkZWMiOiIxMTEzMyIsIlVuaWNvZGUgaGV4IjoiMkI3RCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI0OSIsIkRpbmdiYXQgaGV4IjoiMzEiLCJVbmljb2RlIGRlYyI6IjExMTA4IiwiVW5pY29kZSBoZXgiOiIyQjY0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjUwIiwiRGluZ2JhdCBoZXgiOiIzMiIsIlVuaWNvZGUgZGVjIjoiMTExMDkiLCJVbmljb2RlIGhleCI6IjJCNjUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiNTEiLCJEaW5nYmF0IGhleCI6IjMzIiwiVW5pY29kZSBkZWMiOiIxMTExNCIsIlVuaWNvZGUgaGV4IjoiMkI2QSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI1MiIsIkRpbmdiYXQgaGV4IjoiMzQiLCJVbmljb2RlIGRlYyI6IjExMTE2IiwiVW5pY29kZSBoZXgiOiIyQjZDIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjUzIiwiRGluZ2JhdCBoZXgiOiIzNSIsIlVuaWNvZGUgZGVjIjoiMTExMTUiLCJVbmljb2RlIGhleCI6IjJCNkIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiNTQiLCJEaW5nYmF0IGhleCI6IjM2IiwiVW5pY29kZSBkZWMiOiIxMTExNyIsIlVuaWNvZGUgaGV4IjoiMkI2RCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI1NSIsIkRpbmdiYXQgaGV4IjoiMzciLCJVbmljb2RlIGRlYyI6IjExMDg1IiwiVW5pY29kZSBoZXgiOiIyQjREIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjU2IiwiRGluZ2JhdCBoZXgiOiIzOCIsIlVuaWNvZGUgZGVjIjoiMTExNjgiLCJVbmljb2RlIGhleCI6IjJCQTAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiNTciLCJEaW5nYmF0IGhleCI6IjM5IiwiVW5pY29kZSBkZWMiOiIxMTE2OSIsIlVuaWNvZGUgaGV4IjoiMkJBMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI1OCIsIkRpbmdiYXQgaGV4IjoiM0EiLCJVbmljb2RlIGRlYyI6IjExMTcwIiwiVW5pY29kZSBoZXgiOiIyQkEyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjU5IiwiRGluZ2JhdCBoZXgiOiIzQiIsIlVuaWNvZGUgZGVjIjoiMTExNzEiLCJVbmljb2RlIGhleCI6IjJCQTMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiNjAiLCJEaW5nYmF0IGhleCI6IjNDIiwiVW5pY29kZSBkZWMiOiIxMTE3MiIsIlVuaWNvZGUgaGV4IjoiMkJBNCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI2MSIsIkRpbmdiYXQgaGV4IjoiM0QiLCJVbmljb2RlIGRlYyI6IjExMTczIiwiVW5pY29kZSBoZXgiOiIyQkE1In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjYyIiwiRGluZ2JhdCBoZXgiOiIzRSIsIlVuaWNvZGUgZGVjIjoiMTExNzQiLCJVbmljb2RlIGhleCI6IjJCQTYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiNjMiLCJEaW5nYmF0IGhleCI6IjNGIiwiVW5pY29kZSBkZWMiOiIxMTE3NSIsIlVuaWNvZGUgaGV4IjoiMkJBNyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI2NCIsIkRpbmdiYXQgaGV4IjoiNDAiLCJVbmljb2RlIGRlYyI6IjExMTUyIiwiVW5pY29kZSBoZXgiOiIyQjkwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjY1IiwiRGluZ2JhdCBoZXgiOiI0MSIsIlVuaWNvZGUgZGVjIjoiMTExNTMiLCJVbmljb2RlIGhleCI6IjJCOTEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiNjYiLCJEaW5nYmF0IGhleCI6IjQyIiwiVW5pY29kZSBkZWMiOiIxMTE1NCIsIlVuaWNvZGUgaGV4IjoiMkI5MiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI2NyIsIkRpbmdiYXQgaGV4IjoiNDMiLCJVbmljb2RlIGRlYyI6IjExMTU1IiwiVW5pY29kZSBoZXgiOiIyQjkzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjY4IiwiRGluZ2JhdCBoZXgiOiI0NCIsIlVuaWNvZGUgZGVjIjoiMTExMzYiLCJVbmljb2RlIGhleCI6IjJCODAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiNjkiLCJEaW5nYmF0IGhleCI6IjQ1IiwiVW5pY29kZSBkZWMiOiIxMTEzOSIsIlVuaWNvZGUgaGV4IjoiMkI4MyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI3MCIsIkRpbmdiYXQgaGV4IjoiNDYiLCJVbmljb2RlIGRlYyI6IjExMTM0IiwiVW5pY29kZSBoZXgiOiIyQjdFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjcxIiwiRGluZ2JhdCBoZXgiOiI0NyIsIlVuaWNvZGUgZGVjIjoiMTExMzUiLCJVbmljb2RlIGhleCI6IjJCN0YifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiNzIiLCJEaW5nYmF0IGhleCI6IjQ4IiwiVW5pY29kZSBkZWMiOiIxMTE0MCIsIlVuaWNvZGUgaGV4IjoiMkI4NCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI3MyIsIkRpbmdiYXQgaGV4IjoiNDkiLCJVbmljb2RlIGRlYyI6IjExMTQyIiwiVW5pY29kZSBoZXgiOiIyQjg2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6Ijc0IiwiRGluZ2JhdCBoZXgiOiI0QSIsIlVuaWNvZGUgZGVjIjoiMTExNDEiLCJVbmljb2RlIGhleCI6IjJCODUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiNzUiLCJEaW5nYmF0IGhleCI6IjRCIiwiVW5pY29kZSBkZWMiOiIxMTE0MyIsIlVuaWNvZGUgaGV4IjoiMkI4NyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI3NiIsIkRpbmdiYXQgaGV4IjoiNEMiLCJVbmljb2RlIGRlYyI6IjExMTUxIiwiVW5pY29kZSBoZXgiOiIyQjhGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6Ijc3IiwiRGluZ2JhdCBoZXgiOiI0RCIsIlVuaWNvZGUgZGVjIjoiMTExNDkiLCJVbmljb2RlIGhleCI6IjJCOEQifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiNzgiLCJEaW5nYmF0IGhleCI6IjRFIiwiVW5pY29kZSBkZWMiOiIxMTE1MCIsIlVuaWNvZGUgaGV4IjoiMkI4RSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI3OSIsIkRpbmdiYXQgaGV4IjoiNEYiLCJVbmljb2RlIGRlYyI6IjExMTQ4IiwiVW5pY29kZSBoZXgiOiIyQjhDIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjgwIiwiRGluZ2JhdCBoZXgiOiI1MCIsIlVuaWNvZGUgZGVjIjoiMTExMTgiLCJVbmljb2RlIGhleCI6IjJCNkUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiODEiLCJEaW5nYmF0IGhleCI6IjUxIiwiVW5pY29kZSBkZWMiOiIxMTExOSIsIlVuaWNvZGUgaGV4IjoiMkI2RiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI4MiIsIkRpbmdiYXQgaGV4IjoiNTIiLCJVbmljb2RlIGRlYyI6IjkwOTkiLCJVbmljb2RlIGhleCI6IjIzOEIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiODMiLCJEaW5nYmF0IGhleCI6IjUzIiwiVW5pY29kZSBkZWMiOiI4OTk2IiwiVW5pY29kZSBoZXgiOiIyMzI0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6Ijg0IiwiRGluZ2JhdCBoZXgiOiI1NCIsIlVuaWNvZGUgZGVjIjoiODk2MyIsIlVuaWNvZGUgaGV4IjoiMjMwMyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI4NSIsIkRpbmdiYXQgaGV4IjoiNTUiLCJVbmljb2RlIGRlYyI6Ijg5OTciLCJVbmljb2RlIGhleCI6IjIzMjUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiODYiLCJEaW5nYmF0IGhleCI6IjU2IiwiVW5pY29kZSBkZWMiOiI5MjUxIiwiVW5pY29kZSBoZXgiOiIyNDIzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6Ijg3IiwiRGluZ2JhdCBoZXgiOiI1NyIsIlVuaWNvZGUgZGVjIjoiOTA4NSIsIlVuaWNvZGUgaGV4IjoiMjM3RCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI4OCIsIkRpbmdiYXQgaGV4IjoiNTgiLCJVbmljb2RlIGRlYyI6Ijg2ODIiLCJVbmljb2RlIGhleCI6IjIxRUEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiODkiLCJEaW5nYmF0IGhleCI6IjU5IiwiVW5pY29kZSBkZWMiOiIxMTE5MiIsIlVuaWNvZGUgaGV4IjoiMkJCOCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI5MCIsIkRpbmdiYXQgaGV4IjoiNUEiLCJVbmljb2RlIGRlYyI6IjEyOTE4NCIsIlVuaWNvZGUgaGV4IjoiMUY4QTAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiOTEiLCJEaW5nYmF0IGhleCI6IjVCIiwiVW5pY29kZSBkZWMiOiIxMjkxODUiLCJVbmljb2RlIGhleCI6IjFGOEExIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjkyIiwiRGluZ2JhdCBoZXgiOiI1QyIsIlVuaWNvZGUgZGVjIjoiMTI5MTg2IiwiVW5pY29kZSBoZXgiOiIxRjhBMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI5MyIsIkRpbmdiYXQgaGV4IjoiNUQiLCJVbmljb2RlIGRlYyI6IjEyOTE4NyIsIlVuaWNvZGUgaGV4IjoiMUY4QTMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiOTQiLCJEaW5nYmF0IGhleCI6IjVFIiwiVW5pY29kZSBkZWMiOiIxMjkxODgiLCJVbmljb2RlIGhleCI6IjFGOEE0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6Ijk1IiwiRGluZ2JhdCBoZXgiOiI1RiIsIlVuaWNvZGUgZGVjIjoiMTI5MTg5IiwiVW5pY29kZSBoZXgiOiIxRjhBNSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI5NiIsIkRpbmdiYXQgaGV4IjoiNjAiLCJVbmljb2RlIGRlYyI6IjEyOTE5MCIsIlVuaWNvZGUgaGV4IjoiMUY4QTYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiOTciLCJEaW5nYmF0IGhleCI6IjYxIiwiVW5pY29kZSBkZWMiOiIxMjkxOTEiLCJVbmljb2RlIGhleCI6IjFGOEE3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6Ijk4IiwiRGluZ2JhdCBoZXgiOiI2MiIsIlVuaWNvZGUgZGVjIjoiMTI5MTkyIiwiVW5pY29kZSBoZXgiOiIxRjhBOCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiI5OSIsIkRpbmdiYXQgaGV4IjoiNjMiLCJVbmljb2RlIGRlYyI6IjEyOTE5MyIsIlVuaWNvZGUgaGV4IjoiMUY4QTkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTAwIiwiRGluZ2JhdCBoZXgiOiI2NCIsIlVuaWNvZGUgZGVjIjoiMTI5MTk0IiwiVW5pY29kZSBoZXgiOiIxRjhBQSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMDEiLCJEaW5nYmF0IGhleCI6IjY1IiwiVW5pY29kZSBkZWMiOiIxMjkxOTUiLCJVbmljb2RlIGhleCI6IjFGOEFCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjEwMiIsIkRpbmdiYXQgaGV4IjoiNjYiLCJVbmljb2RlIGRlYyI6IjEyOTEwNCIsIlVuaWNvZGUgaGV4IjoiMUY4NTAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTAzIiwiRGluZ2JhdCBoZXgiOiI2NyIsIlVuaWNvZGUgZGVjIjoiMTI5MTA2IiwiVW5pY29kZSBoZXgiOiIxRjg1MiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMDQiLCJEaW5nYmF0IGhleCI6IjY4IiwiVW5pY29kZSBkZWMiOiIxMjkxMDUiLCJVbmljb2RlIGhleCI6IjFGODUxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjEwNSIsIkRpbmdiYXQgaGV4IjoiNjkiLCJVbmljb2RlIGRlYyI6IjEyOTEwNyIsIlVuaWNvZGUgaGV4IjoiMUY4NTMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTA2IiwiRGluZ2JhdCBoZXgiOiI2QSIsIlVuaWNvZGUgZGVjIjoiMTI5MTA4IiwiVW5pY29kZSBoZXgiOiIxRjg1NCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMDciLCJEaW5nYmF0IGhleCI6IjZCIiwiVW5pY29kZSBkZWMiOiIxMjkxMDkiLCJVbmljb2RlIGhleCI6IjFGODU1In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjEwOCIsIkRpbmdiYXQgaGV4IjoiNkMiLCJVbmljb2RlIGRlYyI6IjEyOTExMSIsIlVuaWNvZGUgaGV4IjoiMUY4NTcifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTA5IiwiRGluZ2JhdCBoZXgiOiI2RCIsIlVuaWNvZGUgZGVjIjoiMTI5MTEwIiwiVW5pY29kZSBoZXgiOiIxRjg1NiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMTAiLCJEaW5nYmF0IGhleCI6IjZFIiwiVW5pY29kZSBkZWMiOiIxMjkxMTIiLCJVbmljb2RlIGhleCI6IjFGODU4In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjExMSIsIkRpbmdiYXQgaGV4IjoiNkYiLCJVbmljb2RlIGRlYyI6IjEyOTExMyIsIlVuaWNvZGUgaGV4IjoiMUY4NTkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTEyIiwiRGluZ2JhdCBoZXgiOiI3MCIsIlVuaWNvZGUgZGVjIjoiOTY1MCIsIlVuaWNvZGUgaGV4IjoiMjVCMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMTMiLCJEaW5nYmF0IGhleCI6IjcxIiwiVW5pY29kZSBkZWMiOiI5NjYwIiwiVW5pY29kZSBoZXgiOiIyNUJDIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjExNCIsIkRpbmdiYXQgaGV4IjoiNzIiLCJVbmljb2RlIGRlYyI6Ijk2NTEiLCJVbmljb2RlIGhleCI6IjI1QjMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTE1IiwiRGluZ2JhdCBoZXgiOiI3MyIsIlVuaWNvZGUgZGVjIjoiOTY2MSIsIlVuaWNvZGUgaGV4IjoiMjVCRCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMTYiLCJEaW5nYmF0IGhleCI6Ijc0IiwiVW5pY29kZSBkZWMiOiI5NjY0IiwiVW5pY29kZSBoZXgiOiIyNUMwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjExNyIsIkRpbmdiYXQgaGV4IjoiNzUiLCJVbmljb2RlIGRlYyI6Ijk2NTQiLCJVbmljb2RlIGhleCI6IjI1QjYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTE4IiwiRGluZ2JhdCBoZXgiOiI3NiIsIlVuaWNvZGUgZGVjIjoiOTY2NSIsIlVuaWNvZGUgaGV4IjoiMjVDMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMTkiLCJEaW5nYmF0IGhleCI6Ijc3IiwiVW5pY29kZSBkZWMiOiI5NjU1IiwiVW5pY29kZSBoZXgiOiIyNUI3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjEyMCIsIkRpbmdiYXQgaGV4IjoiNzgiLCJVbmljb2RlIGRlYyI6Ijk2OTkiLCJVbmljb2RlIGhleCI6IjI1RTMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTIxIiwiRGluZ2JhdCBoZXgiOiI3OSIsIlVuaWNvZGUgZGVjIjoiOTY5OCIsIlVuaWNvZGUgaGV4IjoiMjVFMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMjIiLCJEaW5nYmF0IGhleCI6IjdBIiwiVW5pY29kZSBkZWMiOiI5NzAwIiwiVW5pY29kZSBoZXgiOiIyNUU0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjEyMyIsIkRpbmdiYXQgaGV4IjoiN0IiLCJVbmljb2RlIGRlYyI6Ijk3MDEiLCJVbmljb2RlIGhleCI6IjI1RTUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTI0IiwiRGluZ2JhdCBoZXgiOiI3QyIsIlVuaWNvZGUgZGVjIjoiMTI4ODk2IiwiVW5pY29kZSBoZXgiOiIxRjc4MCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMjUiLCJEaW5nYmF0IGhleCI6IjdEIiwiVW5pY29kZSBkZWMiOiIxMjg4OTgiLCJVbmljb2RlIGhleCI6IjFGNzgyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjEyNiIsIkRpbmdiYXQgaGV4IjoiN0UiLCJVbmljb2RlIGRlYyI6IjEyODg5NyIsIlVuaWNvZGUgaGV4IjoiMUY3ODEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTI4IiwiRGluZ2JhdCBoZXgiOiI4MCIsIlVuaWNvZGUgZGVjIjoiMTI4ODk5IiwiVW5pY29kZSBoZXgiOiIxRjc4MyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMjkiLCJEaW5nYmF0IGhleCI6IjgxIiwiVW5pY29kZSBkZWMiOiIxMTIwNSIsIlVuaWNvZGUgaGV4IjoiMkJDNSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMzAiLCJEaW5nYmF0IGhleCI6IjgyIiwiVW5pY29kZSBkZWMiOiIxMTIwNiIsIlVuaWNvZGUgaGV4IjoiMkJDNiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMzEiLCJEaW5nYmF0IGhleCI6IjgzIiwiVW5pY29kZSBkZWMiOiIxMTIwNyIsIlVuaWNvZGUgaGV4IjoiMkJDNyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMzIiLCJEaW5nYmF0IGhleCI6Ijg0IiwiVW5pY29kZSBkZWMiOiIxMTIwOCIsIlVuaWNvZGUgaGV4IjoiMkJDOCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMzMiLCJEaW5nYmF0IGhleCI6Ijg1IiwiVW5pY29kZSBkZWMiOiIxMTE2NCIsIlVuaWNvZGUgaGV4IjoiMkI5QyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMzQiLCJEaW5nYmF0IGhleCI6Ijg2IiwiVW5pY29kZSBkZWMiOiIxMTE2NiIsIlVuaWNvZGUgaGV4IjoiMkI5RSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMzUiLCJEaW5nYmF0IGhleCI6Ijg3IiwiVW5pY29kZSBkZWMiOiIxMTE2NSIsIlVuaWNvZGUgaGV4IjoiMkI5RCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMzYiLCJEaW5nYmF0IGhleCI6Ijg4IiwiVW5pY29kZSBkZWMiOiIxMTE2NyIsIlVuaWNvZGUgaGV4IjoiMkI5RiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxMzciLCJEaW5nYmF0IGhleCI6Ijg5IiwiVW5pY29kZSBkZWMiOiIxMjkwNDAiLCJVbmljb2RlIGhleCI6IjFGODEwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjEzOCIsIkRpbmdiYXQgaGV4IjoiOEEiLCJVbmljb2RlIGRlYyI6IjEyOTA0MiIsIlVuaWNvZGUgaGV4IjoiMUY4MTIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTM5IiwiRGluZ2JhdCBoZXgiOiI4QiIsIlVuaWNvZGUgZGVjIjoiMTI5MDQxIiwiVW5pY29kZSBoZXgiOiIxRjgxMSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxNDAiLCJEaW5nYmF0IGhleCI6IjhDIiwiVW5pY29kZSBkZWMiOiIxMjkwNDMiLCJVbmljb2RlIGhleCI6IjFGODEzIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE0MSIsIkRpbmdiYXQgaGV4IjoiOEQiLCJVbmljb2RlIGRlYyI6IjEyOTA0NCIsIlVuaWNvZGUgaGV4IjoiMUY4MTQifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTQyIiwiRGluZ2JhdCBoZXgiOiI4RSIsIlVuaWNvZGUgZGVjIjoiMTI5MDQ2IiwiVW5pY29kZSBoZXgiOiIxRjgxNiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxNDMiLCJEaW5nYmF0IGhleCI6IjhGIiwiVW5pY29kZSBkZWMiOiIxMjkwNDUiLCJVbmljb2RlIGhleCI6IjFGODE1In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE0NCIsIkRpbmdiYXQgaGV4IjoiOTAiLCJVbmljb2RlIGRlYyI6IjEyOTA0NyIsIlVuaWNvZGUgaGV4IjoiMUY4MTcifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTQ1IiwiRGluZ2JhdCBoZXgiOiI5MSIsIlVuaWNvZGUgZGVjIjoiMTI5MDQ4IiwiVW5pY29kZSBoZXgiOiIxRjgxOCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxNDYiLCJEaW5nYmF0IGhleCI6IjkyIiwiVW5pY29kZSBkZWMiOiIxMjkwNTAiLCJVbmljb2RlIGhleCI6IjFGODFBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE0NyIsIkRpbmdiYXQgaGV4IjoiOTMiLCJVbmljb2RlIGRlYyI6IjEyOTA0OSIsIlVuaWNvZGUgaGV4IjoiMUY4MTkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTQ4IiwiRGluZ2JhdCBoZXgiOiI5NCIsIlVuaWNvZGUgZGVjIjoiMTI5MDUxIiwiVW5pY29kZSBoZXgiOiIxRjgxQiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxNDkiLCJEaW5nYmF0IGhleCI6Ijk1IiwiVW5pY29kZSBkZWMiOiIxMjkwNTIiLCJVbmljb2RlIGhleCI6IjFGODFDIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE1MCIsIkRpbmdiYXQgaGV4IjoiOTYiLCJVbmljb2RlIGRlYyI6IjEyOTA1NCIsIlVuaWNvZGUgaGV4IjoiMUY4MUUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTUxIiwiRGluZ2JhdCBoZXgiOiI5NyIsIlVuaWNvZGUgZGVjIjoiMTI5MDUzIiwiVW5pY29kZSBoZXgiOiIxRjgxRCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxNTIiLCJEaW5nYmF0IGhleCI6Ijk4IiwiVW5pY29kZSBkZWMiOiIxMjkwNTUiLCJVbmljb2RlIGhleCI6IjFGODFGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE1MyIsIkRpbmdiYXQgaGV4IjoiOTkiLCJVbmljb2RlIGRlYyI6IjEyOTAyNCIsIlVuaWNvZGUgaGV4IjoiMUY4MDAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTU0IiwiRGluZ2JhdCBoZXgiOiI5QSIsIlVuaWNvZGUgZGVjIjoiMTI5MDI2IiwiVW5pY29kZSBoZXgiOiIxRjgwMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxNTUiLCJEaW5nYmF0IGhleCI6IjlCIiwiVW5pY29kZSBkZWMiOiIxMjkwMjUiLCJVbmljb2RlIGhleCI6IjFGODAxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE1NiIsIkRpbmdiYXQgaGV4IjoiOUMiLCJVbmljb2RlIGRlYyI6IjEyOTAyNyIsIlVuaWNvZGUgaGV4IjoiMUY4MDMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTU3IiwiRGluZ2JhdCBoZXgiOiI5RCIsIlVuaWNvZGUgZGVjIjoiMTI5MDI4IiwiVW5pY29kZSBoZXgiOiIxRjgwNCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxNTgiLCJEaW5nYmF0IGhleCI6IjlFIiwiVW5pY29kZSBkZWMiOiIxMjkwMzAiLCJVbmljb2RlIGhleCI6IjFGODA2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE1OSIsIkRpbmdiYXQgaGV4IjoiOUYiLCJVbmljb2RlIGRlYyI6IjEyOTAyOSIsIlVuaWNvZGUgaGV4IjoiMUY4MDUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTYwIiwiRGluZ2JhdCBoZXgiOiJBMCIsIlVuaWNvZGUgZGVjIjoiMTI5MDMxIiwiVW5pY29kZSBoZXgiOiIxRjgwNyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxNjEiLCJEaW5nYmF0IGhleCI6IkExIiwiVW5pY29kZSBkZWMiOiIxMjkwMzIiLCJVbmljb2RlIGhleCI6IjFGODA4In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE2MiIsIkRpbmdiYXQgaGV4IjoiQTIiLCJVbmljb2RlIGRlYyI6IjEyOTAzNCIsIlVuaWNvZGUgaGV4IjoiMUY4MEEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTYzIiwiRGluZ2JhdCBoZXgiOiJBMyIsIlVuaWNvZGUgZGVjIjoiMTI5MDMzIiwiVW5pY29kZSBoZXgiOiIxRjgwOSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxNjQiLCJEaW5nYmF0IGhleCI6IkE0IiwiVW5pY29kZSBkZWMiOiIxMjkwMzUiLCJVbmljb2RlIGhleCI6IjFGODBCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE2NSIsIkRpbmdiYXQgaGV4IjoiQTUiLCJVbmljb2RlIGRlYyI6IjEyOTA1NiIsIlVuaWNvZGUgaGV4IjoiMUY4MjAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTY2IiwiRGluZ2JhdCBoZXgiOiJBNiIsIlVuaWNvZGUgZGVjIjoiMTI5MDU4IiwiVW5pY29kZSBoZXgiOiIxRjgyMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxNjciLCJEaW5nYmF0IGhleCI6IkE3IiwiVW5pY29kZSBkZWMiOiIxMjkwNjAiLCJVbmljb2RlIGhleCI6IjFGODI0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE2OCIsIkRpbmdiYXQgaGV4IjoiQTgiLCJVbmljb2RlIGRlYyI6IjEyOTA2MiIsIlVuaWNvZGUgaGV4IjoiMUY4MjYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTY5IiwiRGluZ2JhdCBoZXgiOiJBOSIsIlVuaWNvZGUgZGVjIjoiMTI5MDY0IiwiVW5pY29kZSBoZXgiOiIxRjgyOCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxNzAiLCJEaW5nYmF0IGhleCI6IkFBIiwiVW5pY29kZSBkZWMiOiIxMjkwNjYiLCJVbmljb2RlIGhleCI6IjFGODJBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE3MSIsIkRpbmdiYXQgaGV4IjoiQUIiLCJVbmljb2RlIGRlYyI6IjEyOTA2OCIsIlVuaWNvZGUgaGV4IjoiMUY4MkMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTcyIiwiRGluZ2JhdCBoZXgiOiJBQyIsIlVuaWNvZGUgZGVjIjoiMTI5MTgwIiwiVW5pY29kZSBoZXgiOiIxRjg5QyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxNzMiLCJEaW5nYmF0IGhleCI6IkFEIiwiVW5pY29kZSBkZWMiOiIxMjkxODEiLCJVbmljb2RlIGhleCI6IjFGODlEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE3NCIsIkRpbmdiYXQgaGV4IjoiQUUiLCJVbmljb2RlIGRlYyI6IjEyOTE4MiIsIlVuaWNvZGUgaGV4IjoiMUY4OUUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTc1IiwiRGluZ2JhdCBoZXgiOiJBRiIsIlVuaWNvZGUgZGVjIjoiMTI5MTgzIiwiVW5pY29kZSBoZXgiOiIxRjg5RiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxNzYiLCJEaW5nYmF0IGhleCI6IkIwIiwiVW5pY29kZSBkZWMiOiIxMjkwNzAiLCJVbmljb2RlIGhleCI6IjFGODJFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE3NyIsIkRpbmdiYXQgaGV4IjoiQjEiLCJVbmljb2RlIGRlYyI6IjEyOTA3MiIsIlVuaWNvZGUgaGV4IjoiMUY4MzAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTc4IiwiRGluZ2JhdCBoZXgiOiJCMiIsIlVuaWNvZGUgZGVjIjoiMTI5MDc0IiwiVW5pY29kZSBoZXgiOiIxRjgzMiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxNzkiLCJEaW5nYmF0IGhleCI6IkIzIiwiVW5pY29kZSBkZWMiOiIxMjkwNzYiLCJVbmljb2RlIGhleCI6IjFGODM0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE4MCIsIkRpbmdiYXQgaGV4IjoiQjQiLCJVbmljb2RlIGRlYyI6IjEyOTA3OCIsIlVuaWNvZGUgaGV4IjoiMUY4MzYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTgxIiwiRGluZ2JhdCBoZXgiOiJCNSIsIlVuaWNvZGUgZGVjIjoiMTI5MDgwIiwiVW5pY29kZSBoZXgiOiIxRjgzOCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxODIiLCJEaW5nYmF0IGhleCI6IkI2IiwiVW5pY29kZSBkZWMiOiIxMjkwODIiLCJVbmljb2RlIGhleCI6IjFGODNBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE4MyIsIkRpbmdiYXQgaGV4IjoiQjciLCJVbmljb2RlIGRlYyI6IjEyOTA4MSIsIlVuaWNvZGUgaGV4IjoiMUY4MzkifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTg0IiwiRGluZ2JhdCBoZXgiOiJCOCIsIlVuaWNvZGUgZGVjIjoiMTI5MDgzIiwiVW5pY29kZSBoZXgiOiIxRjgzQiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxODUiLCJEaW5nYmF0IGhleCI6IkI5IiwiVW5pY29kZSBkZWMiOiIxMjkxNzYiLCJVbmljb2RlIGhleCI6IjFGODk4In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE4NiIsIkRpbmdiYXQgaGV4IjoiQkEiLCJVbmljb2RlIGRlYyI6IjEyOTE3OCIsIlVuaWNvZGUgaGV4IjoiMUY4OUEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTg3IiwiRGluZ2JhdCBoZXgiOiJCQiIsIlVuaWNvZGUgZGVjIjoiMTI5MTc3IiwiVW5pY29kZSBoZXgiOiIxRjg5OSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxODgiLCJEaW5nYmF0IGhleCI6IkJDIiwiVW5pY29kZSBkZWMiOiIxMjkxNzkiLCJVbmljb2RlIGhleCI6IjFGODlCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE4OSIsIkRpbmdiYXQgaGV4IjoiQkQiLCJVbmljb2RlIGRlYyI6IjEyOTA4NCIsIlVuaWNvZGUgaGV4IjoiMUY4M0MifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTkwIiwiRGluZ2JhdCBoZXgiOiJCRSIsIlVuaWNvZGUgZGVjIjoiMTI5MDg2IiwiVW5pY29kZSBoZXgiOiIxRjgzRSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxOTEiLCJEaW5nYmF0IGhleCI6IkJGIiwiVW5pY29kZSBkZWMiOiIxMjkwODUiLCJVbmljb2RlIGhleCI6IjFGODNEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE5MiIsIkRpbmdiYXQgaGV4IjoiQzAiLCJVbmljb2RlIGRlYyI6IjEyOTA4NyIsIlVuaWNvZGUgaGV4IjoiMUY4M0YifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTkzIiwiRGluZ2JhdCBoZXgiOiJDMSIsIlVuaWNvZGUgZGVjIjoiMTI5MDg4IiwiVW5pY29kZSBoZXgiOiIxRjg0MCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxOTQiLCJEaW5nYmF0IGhleCI6IkMyIiwiVW5pY29kZSBkZWMiOiIxMjkwOTAiLCJVbmljb2RlIGhleCI6IjFGODQyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE5NSIsIkRpbmdiYXQgaGV4IjoiQzMiLCJVbmljb2RlIGRlYyI6IjEyOTA4OSIsIlVuaWNvZGUgaGV4IjoiMUY4NDEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTk2IiwiRGluZ2JhdCBoZXgiOiJDNCIsIlVuaWNvZGUgZGVjIjoiMTI5MDkxIiwiVW5pY29kZSBoZXgiOiIxRjg0MyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIxOTciLCJEaW5nYmF0IGhleCI6IkM1IiwiVW5pY29kZSBkZWMiOiIxMjkwOTIiLCJVbmljb2RlIGhleCI6IjFGODQ0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjE5OCIsIkRpbmdiYXQgaGV4IjoiQzYiLCJVbmljb2RlIGRlYyI6IjEyOTA5NCIsIlVuaWNvZGUgaGV4IjoiMUY4NDYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMTk5IiwiRGluZ2JhdCBoZXgiOiJDNyIsIlVuaWNvZGUgZGVjIjoiMTI5MDkzIiwiVW5pY29kZSBoZXgiOiIxRjg0NSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIyMDAiLCJEaW5nYmF0IGhleCI6IkM4IiwiVW5pY29kZSBkZWMiOiIxMjkwOTUiLCJVbmljb2RlIGhleCI6IjFGODQ3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIwMSIsIkRpbmdiYXQgaGV4IjoiQzkiLCJVbmljb2RlIGRlYyI6IjExMTc2IiwiVW5pY29kZSBoZXgiOiIyQkE4In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIwMiIsIkRpbmdiYXQgaGV4IjoiQ0EiLCJVbmljb2RlIGRlYyI6IjExMTc3IiwiVW5pY29kZSBoZXgiOiIyQkE5In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIwMyIsIkRpbmdiYXQgaGV4IjoiQ0IiLCJVbmljb2RlIGRlYyI6IjExMTc4IiwiVW5pY29kZSBoZXgiOiIyQkFBIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIwNCIsIkRpbmdiYXQgaGV4IjoiQ0MiLCJVbmljb2RlIGRlYyI6IjExMTc5IiwiVW5pY29kZSBoZXgiOiIyQkFCIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIwNSIsIkRpbmdiYXQgaGV4IjoiQ0QiLCJVbmljb2RlIGRlYyI6IjExMTgwIiwiVW5pY29kZSBoZXgiOiIyQkFDIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIwNiIsIkRpbmdiYXQgaGV4IjoiQ0UiLCJVbmljb2RlIGRlYyI6IjExMTgxIiwiVW5pY29kZSBoZXgiOiIyQkFEIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIwNyIsIkRpbmdiYXQgaGV4IjoiQ0YiLCJVbmljb2RlIGRlYyI6IjExMTgyIiwiVW5pY29kZSBoZXgiOiIyQkFFIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIwOCIsIkRpbmdiYXQgaGV4IjoiRDAiLCJVbmljb2RlIGRlYyI6IjExMTgzIiwiVW5pY29kZSBoZXgiOiIyQkFGIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIwOSIsIkRpbmdiYXQgaGV4IjoiRDEiLCJVbmljb2RlIGRlYyI6IjEyOTEyMCIsIlVuaWNvZGUgaGV4IjoiMUY4NjAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMjEwIiwiRGluZ2JhdCBoZXgiOiJEMiIsIlVuaWNvZGUgZGVjIjoiMTI5MTIyIiwiVW5pY29kZSBoZXgiOiIxRjg2MiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIyMTEiLCJEaW5nYmF0IGhleCI6IkQzIiwiVW5pY29kZSBkZWMiOiIxMjkxMjEiLCJVbmljb2RlIGhleCI6IjFGODYxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIxMiIsIkRpbmdiYXQgaGV4IjoiRDQiLCJVbmljb2RlIGRlYyI6IjEyOTEyMyIsIlVuaWNvZGUgaGV4IjoiMUY4NjMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMjEzIiwiRGluZ2JhdCBoZXgiOiJENSIsIlVuaWNvZGUgZGVjIjoiMTI5MTI0IiwiVW5pY29kZSBoZXgiOiIxRjg2NCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIyMTQiLCJEaW5nYmF0IGhleCI6IkQ2IiwiVW5pY29kZSBkZWMiOiIxMjkxMjUiLCJVbmljb2RlIGhleCI6IjFGODY1In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIxNSIsIkRpbmdiYXQgaGV4IjoiRDciLCJVbmljb2RlIGRlYyI6IjEyOTEyNyIsIlVuaWNvZGUgaGV4IjoiMUY4NjcifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMjE2IiwiRGluZ2JhdCBoZXgiOiJEOCIsIlVuaWNvZGUgZGVjIjoiMTI5MTI2IiwiVW5pY29kZSBoZXgiOiIxRjg2NiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIyMTciLCJEaW5nYmF0IGhleCI6IkQ5IiwiVW5pY29kZSBkZWMiOiIxMjkxMzYiLCJVbmljb2RlIGhleCI6IjFGODcwIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIxOCIsIkRpbmdiYXQgaGV4IjoiREEiLCJVbmljb2RlIGRlYyI6IjEyOTEzOCIsIlVuaWNvZGUgaGV4IjoiMUY4NzIifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMjE5IiwiRGluZ2JhdCBoZXgiOiJEQiIsIlVuaWNvZGUgZGVjIjoiMTI5MTM3IiwiVW5pY29kZSBoZXgiOiIxRjg3MSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIyMjAiLCJEaW5nYmF0IGhleCI6IkRDIiwiVW5pY29kZSBkZWMiOiIxMjkxMzkiLCJVbmljb2RlIGhleCI6IjFGODczIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIyMSIsIkRpbmdiYXQgaGV4IjoiREQiLCJVbmljb2RlIGRlYyI6IjEyOTE0MCIsIlVuaWNvZGUgaGV4IjoiMUY4NzQifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMjIyIiwiRGluZ2JhdCBoZXgiOiJERSIsIlVuaWNvZGUgZGVjIjoiMTI5MTQxIiwiVW5pY29kZSBoZXgiOiIxRjg3NSJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIyMjMiLCJEaW5nYmF0IGhleCI6IkRGIiwiVW5pY29kZSBkZWMiOiIxMjkxNDMiLCJVbmljb2RlIGhleCI6IjFGODc3In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIyNCIsIkRpbmdiYXQgaGV4IjoiRTAiLCJVbmljb2RlIGRlYyI6IjEyOTE0MiIsIlVuaWNvZGUgaGV4IjoiMUY4NzYifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMjI1IiwiRGluZ2JhdCBoZXgiOiJFMSIsIlVuaWNvZGUgZGVjIjoiMTI5MTUyIiwiVW5pY29kZSBoZXgiOiIxRjg4MCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIyMjYiLCJEaW5nYmF0IGhleCI6IkUyIiwiVW5pY29kZSBkZWMiOiIxMjkxNTQiLCJVbmljb2RlIGhleCI6IjFGODgyIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIyNyIsIkRpbmdiYXQgaGV4IjoiRTMiLCJVbmljb2RlIGRlYyI6IjEyOTE1MyIsIlVuaWNvZGUgaGV4IjoiMUY4ODEifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMjI4IiwiRGluZ2JhdCBoZXgiOiJFNCIsIlVuaWNvZGUgZGVjIjoiMTI5MTU1IiwiVW5pY29kZSBoZXgiOiIxRjg4MyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIyMjkiLCJEaW5nYmF0IGhleCI6IkU1IiwiVW5pY29kZSBkZWMiOiIxMjkxNTYiLCJVbmljb2RlIGhleCI6IjFGODg0In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIzMCIsIkRpbmdiYXQgaGV4IjoiRTYiLCJVbmljb2RlIGRlYyI6IjEyOTE1NyIsIlVuaWNvZGUgaGV4IjoiMUY4ODUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMjMxIiwiRGluZ2JhdCBoZXgiOiJFNyIsIlVuaWNvZGUgZGVjIjoiMTI5MTU5IiwiVW5pY29kZSBoZXgiOiIxRjg4NyJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIyMzIiLCJEaW5nYmF0IGhleCI6IkU4IiwiVW5pY29kZSBkZWMiOiIxMjkxNTgiLCJVbmljb2RlIGhleCI6IjFGODg2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIzMyIsIkRpbmdiYXQgaGV4IjoiRTkiLCJVbmljb2RlIGRlYyI6IjEyOTE2OCIsIlVuaWNvZGUgaGV4IjoiMUY4OTAifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMjM0IiwiRGluZ2JhdCBoZXgiOiJFQSIsIlVuaWNvZGUgZGVjIjoiMTI5MTcwIiwiVW5pY29kZSBoZXgiOiIxRjg5MiJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIyMzUiLCJEaW5nYmF0IGhleCI6IkVCIiwiVW5pY29kZSBkZWMiOiIxMjkxNjkiLCJVbmljb2RlIGhleCI6IjFGODkxIn0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIzNiIsIkRpbmdiYXQgaGV4IjoiRUMiLCJVbmljb2RlIGRlYyI6IjEyOTE3MSIsIlVuaWNvZGUgaGV4IjoiMUY4OTMifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMjM3IiwiRGluZ2JhdCBoZXgiOiJFRCIsIlVuaWNvZGUgZGVjIjoiMTI5MTcyIiwiVW5pY29kZSBoZXgiOiIxRjg5NCJ9LHsiVHlwZWZhY2UgbmFtZSI6IldpbmdkaW5ncyAzIiwiRGluZ2JhdCBkZWMiOiIyMzgiLCJEaW5nYmF0IGhleCI6IkVFIiwiVW5pY29kZSBkZWMiOiIxMjkxNzQiLCJVbmljb2RlIGhleCI6IjFGODk2In0seyJUeXBlZmFjZSBuYW1lIjoiV2luZ2RpbmdzIDMiLCJEaW5nYmF0IGRlYyI6IjIzOSIsIkRpbmdiYXQgaGV4IjoiRUYiLCJVbmljb2RlIGRlYyI6IjEyOTE3MyIsIlVuaWNvZGUgaGV4IjoiMUY4OTUifSx7IlR5cGVmYWNlIG5hbWUiOiJXaW5nZGluZ3MgMyIsIkRpbmdiYXQgZGVjIjoiMjQwIiwiRGluZ2JhdCBoZXgiOiJGMCIsIlVuaWNvZGUgZGVjIjoiMTI5MTc1IiwiVW5pY29kZSBoZXgiOiIxRjg5NyJ9XTt2YXIgYWY9USYmUS5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KG5mLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuZi5oZXg9bmYuZGVjPW5mLmNvZGVQb2ludD12b2lkIDA7Zm9yKHZhciBvZj1hZihyZiksY2Y9e30sc2Y9U3RyaW5nLmZyb21Db2RlUG9pbnQ/U3RyaW5nLmZyb21Db2RlUG9pbnQ6ZnVuY3Rpb24oZSl7aWYoZTw9NjU1MzUpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZSk7dmFyIHQ9TWF0aC5mbG9vcigoZS02NTUzNikvMTAyNCkrNTUyOTYsbj0oZS02NTUzNiklMTAyNCs1NjMyMDtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0LG4pfSxsZj0wLHVmPW9mLmRlZmF1bHQ7bGY8dWYubGVuZ3RoO2xmKyspe3ZhciBmZj11ZltsZl0sZGY9cGFyc2VJbnQoZmZbIlVuaWNvZGUgZGVjIl0sMTApLGhmPXtjb2RlUG9pbnQ6ZGYsc3RyaW5nOnNmKGRmKX07Y2ZbZmZbIlR5cGVmYWNlIG5hbWUiXS50b1VwcGVyQ2FzZSgpKyJfIitmZlsiRGluZ2JhdCBkZWMiXV09aGZ9ZnVuY3Rpb24gcGYoZSx0KXtyZXR1cm4gY2ZbZS50b1VwcGVyQ2FzZSgpKyJfIit0XX1uZi5jb2RlUG9pbnQ9cGYsbmYuZGVjPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHBmKGUscGFyc2VJbnQodCwxMCkpfSxuZi5oZXg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcGYoZSxwYXJzZUludCh0LDE2KSl9O3ZhciBnZj17fTtnZi51cmlUb1ppcEVudHJ5TmFtZT1mdW5jdGlvbihlLHQpe3JldHVybiIvIj09PXQuY2hhckF0KDApP3Quc3Vic3RyKDEpOmUrIi8iK3R9LGdmLnJlcGxhY2VGcmFnbWVudD1mdW5jdGlvbihlLHQpe3ZhciBuPWUuaW5kZXhPZigiIyIpOy0xIT09biYmKGU9ZS5zdWJzdHJpbmcoMCxuKSk7cmV0dXJuIGUrIiMiK3R9LHRmLmNyZWF0ZUJvZHlSZWFkZXI9ZnVuY3Rpb24oZSl7cmV0dXJue3JlYWRYbWxFbGVtZW50OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVGYoZSkucmVhZFhtbEVsZW1lbnQodCl9LHJlYWRYbWxFbGVtZW50czpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IFRmKGUpLnJlYWRYbWxFbGVtZW50cyh0KX19fSx0Zi5fcmVhZE51bWJlcmluZ1Byb3BlcnRpZXM9d2Y7dmFyIG1mPW5mLGJmPUxyLHlmPWxvLHZmPWJvLlJlc3VsdCx4Zj1iby53YXJuaW5nLERmPWdmO2Z1bmN0aW9uIFRmKGUpe3ZhciB0PVtdLG49W10scj1bXSxpPWUucmVsYXRpb25zaGlwcyxhPWUuY29udGVudFR5cGVzLG89ZS5kb2N4RmlsZSxjPWUuZmlsZXMscz1lLm51bWJlcmluZyxsPWUuc3R5bGVzO2Z1bmN0aW9uIHUoZSl7cmV0dXJuIEZmKGUubWFwKGYpKX1mdW5jdGlvbiBmKGUpe2lmKCJlbGVtZW50Ij09PWUudHlwZSl7dmFyIHQ9RFtlLm5hbWVdO2lmKHQpcmV0dXJuIHQoZSk7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChFZixlLm5hbWUpKXJldHVybiBVZihbeGYoIkFuIHVucmVjb2duaXNlZCBlbGVtZW50IHdhcyBpZ25vcmVkOiAiK2UubmFtZSldKX1yZXR1cm4gQWYoKX1mdW5jdGlvbiBkKGUpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gYihlLCJ3OnBTdHlsZSIsIlBhcmFncmFwaCIsbC5maW5kUGFyYWdyYXBoU3R5bGVCeUlkKX0oZSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm57dHlwZToicGFyYWdyYXBoUHJvcGVydGllcyIsc3R5bGVJZDp0LnN0eWxlSWQsc3R5bGVOYW1lOnQubmFtZSxhbGlnbm1lbnQ6ZS5maXJzdE9yRW1wdHkoInc6amMiKS5hdHRyaWJ1dGVzWyJ3OnZhbCJdLG51bWJlcmluZzp3Zih0LnN0eWxlSWQsZS5maXJzdE9yRW1wdHkoInc6bnVtUHIiKSxzKSxpbmRlbnQ6aChlLmZpcnN0T3JFbXB0eSgidzppbmQiKSl9fSkpfWZ1bmN0aW9uIGgoZSl7cmV0dXJue3N0YXJ0OmUuYXR0cmlidXRlc1sidzpzdGFydCJdfHxlLmF0dHJpYnV0ZXNbInc6bGVmdCJdLGVuZDplLmF0dHJpYnV0ZXNbInc6ZW5kIl18fGUuYXR0cmlidXRlc1sidzpyaWdodCJdLGZpcnN0TGluZTplLmF0dHJpYnV0ZXNbInc6Zmlyc3RMaW5lIl0saGFuZ2luZzplLmF0dHJpYnV0ZXNbInc6aGFuZ2luZyJdfX1mdW5jdGlvbiBwKGUpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gYihlLCJ3OnJTdHlsZSIsIlJ1biIsbC5maW5kQ2hhcmFjdGVyU3R5bGVCeUlkKX0oZSkubWFwKChmdW5jdGlvbih0KXt2YXIgbj1lLmZpcnN0T3JFbXB0eSgidzpzeiIpLmF0dHJpYnV0ZXNbInc6dmFsIl0scj0vXlswLTldKyQvLnRlc3Qobik/cGFyc2VJbnQobiwxMCkvMjpudWxsO3JldHVybnt0eXBlOiJydW5Qcm9wZXJ0aWVzIixzdHlsZUlkOnQuc3R5bGVJZCxzdHlsZU5hbWU6dC5uYW1lLHZlcnRpY2FsQWxpZ25tZW50OmUuZmlyc3RPckVtcHR5KCJ3OnZlcnRBbGlnbiIpLmF0dHJpYnV0ZXNbInc6dmFsIl0sZm9udDplLmZpcnN0T3JFbXB0eSgidzpyRm9udHMiKS5hdHRyaWJ1dGVzWyJ3OmFzY2lpIl0sZm9udFNpemU6cixpc0JvbGQ6bShlLmZpcnN0KCJ3OmIiKSksaXNVbmRlcmxpbmU6ZyhlLmZpcnN0KCJ3OnUiKSksaXNJdGFsaWM6bShlLmZpcnN0KCJ3OmkiKSksaXNTdHJpa2V0aHJvdWdoOm0oZS5maXJzdCgidzpzdHJpa2UiKSksaXNBbGxDYXBzOm0oZS5maXJzdCgidzpjYXBzIikpLGlzU21hbGxDYXBzOm0oZS5maXJzdCgidzpzbWFsbENhcHMiKSl9fSkpfWZ1bmN0aW9uIGcoZSl7aWYoZSl7dmFyIHQ9ZS5hdHRyaWJ1dGVzWyJ3OnZhbCJdO3JldHVybiB2b2lkIDAhPT10JiYiZmFsc2UiIT09dCYmIjAiIT09dCYmIm5vbmUiIT09dH1yZXR1cm4hMX1mdW5jdGlvbiBtKGUpe2lmKGUpe3ZhciB0PWUuYXR0cmlidXRlc1sidzp2YWwiXTtyZXR1cm4iZmFsc2UiIT09dCYmIjAiIT09dH1yZXR1cm4hMX1mdW5jdGlvbiBiKGUsdCxuLHIpe3ZhciBpPVtdLGE9ZS5maXJzdCh0KSxvPW51bGwsYz1udWxsO2lmKGEmJihvPWEuYXR0cmlidXRlc1sidzp2YWwiXSkpe3ZhciBzPXIobyk7cz9jPXMubmFtZTppLnB1c2goZnVuY3Rpb24oZSx0KXtyZXR1cm4geGYoZSsiIHN0eWxlIHdpdGggSUQgIit0KyIgd2FzIHJlZmVyZW5jZWQgYnV0IG5vdCBkZWZpbmVkIGluIHRoZSBkb2N1bWVudCIpfShuLG8pKX1yZXR1cm4gU2Yoe3N0eWxlSWQ6byxuYW1lOmN9LGkpfXZhciB5PXt0eXBlOiJ1bmtub3duIn07ZnVuY3Rpb24gdihlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5hdHRyaWJ1dGVzWyJ3OmlkIl07cmV0dXJuIGtmKG5ldyB5Zi5Ob3RlUmVmZXJlbmNlKHtub3RlVHlwZTplLG5vdGVJZDpufSkpfX1mdW5jdGlvbiB4KGUpe3JldHVybiB1KGUuY2hpbGRyZW4pfXZhciBEPXsidzpwIjpmdW5jdGlvbihlKXt2YXIgdD1lLmZpcnN0T3JFbXB0eSgidzpwUHIiKTtpZighIXQuZmlyc3RPckVtcHR5KCJ3OnJQciIpLmZpcnN0KCJ3OmRlbCIpKXJldHVybiBlLmNoaWxkcmVuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3IucHVzaChlKX0pKSxBZigpO3ZhciBuPWUuY2hpbGRyZW47cmV0dXJuIHIubGVuZ3RoPjAmJihuPXIuY29uY2F0KG4pLHI9W10pLENmLm1hcChkKHQpLHUobiksKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyB5Zi5QYXJhZ3JhcGgodCxlKX0pKS5pbnNlcnRFeHRyYSgpfSwidzpyIjpmdW5jdGlvbihlKXtyZXR1cm4gQ2YubWFwKHAoZS5maXJzdE9yRW1wdHkoInc6clByIikpLHUoZS5jaGlsZHJlbiksKGZ1bmN0aW9uKGUsbil7dmFyIHIsaT0ocj1iZi5sYXN0KHQuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4iaHlwZXJsaW5rIj09PWUudHlwZX0pKSkpP3Iub3B0aW9uczpudWxsO3JldHVybiBudWxsIT09aSYmKG49W25ldyB5Zi5IeXBlcmxpbmsobixpKV0pLG5ldyB5Zi5SdW4obixlKX0pKX0sInc6ZmxkQ2hhciI6ZnVuY3Rpb24oZSl7dmFyIHI9ZS5hdHRyaWJ1dGVzWyJ3OmZsZENoYXJUeXBlIl07aWYoImJlZ2luIj09PXIpdC5wdXNoKHkpLG49W107ZWxzZSBpZigiZW5kIj09PXIpdC5wb3AoKTtlbHNlIGlmKCJzZXBhcmF0ZSI9PT1yKXt2YXIgaT1mdW5jdGlvbihlKXt2YXIgdD0vXHMqSFlQRVJMSU5LICIoLiopIi8uZXhlYyhlKTtpZih0KXJldHVybntocmVmOnRbMV19O3ZhciBuPS9ccypIWVBFUkxJTktccytcXGxccysiKC4qKSIvLmV4ZWMoZSk7aWYobilyZXR1cm57YW5jaG9yOm5bMV19O3JldHVybiBudWxsfShuLmpvaW4oIiIpKSxhPW51bGw9PT1pP3k6e3R5cGU6Imh5cGVybGluayIsb3B0aW9uczppfTt0LnBvcCgpLHQucHVzaChhKX1yZXR1cm4gQWYoKX0sInc6aW5zdHJUZXh0IjpmdW5jdGlvbihlKXtyZXR1cm4gbi5wdXNoKGUudGV4dCgpKSxBZigpfSwidzp0IjpmdW5jdGlvbihlKXtyZXR1cm4ga2YobmV3IHlmLlRleHQoZS50ZXh0KCkpKX0sInc6dGFiIjpmdW5jdGlvbihlKXtyZXR1cm4ga2YobmV3IHlmLlRhYil9LCJ3Om5vQnJlYWtIeXBoZW4iOmZ1bmN0aW9uKCl7cmV0dXJuIGtmKG5ldyB5Zi5UZXh0KCLigJEiKSl9LCJ3OnNvZnRIeXBoZW4iOmZ1bmN0aW9uKGUpe3JldHVybiBrZihuZXcgeWYuVGV4dCgiwq0iKSl9LCJ3OnN5bSI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdHRyaWJ1dGVzWyJ3OmZvbnQiXSxuPWUuYXR0cmlidXRlc1sidzpjaGFyIl0scj1tZi5oZXgodCxuKTtyZXR1cm4gbnVsbD09ciYmL15GMC4uJC8udGVzdChuKSYmKHI9bWYuaGV4KHQsbi5zdWJzdHJpbmcoMikpKSxudWxsPT1yP1VmKFt4ZigiQSB3OnN5bSBlbGVtZW50IHdpdGggYW4gdW5zdXBwb3J0ZWQgY2hhcmFjdGVyIHdhcyBpZ25vcmVkOiBjaGFyICIrbisiIGluIGZvbnQgIit0KV0pOmtmKG5ldyB5Zi5UZXh0KHIuc3RyaW5nKSl9LCJ3Omh5cGVybGluayI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdHRyaWJ1dGVzWyJyOmlkIl0sbj1lLmF0dHJpYnV0ZXNbInc6YW5jaG9yIl07cmV0dXJuIHUoZS5jaGlsZHJlbikubWFwKChmdW5jdGlvbihyKXtmdW5jdGlvbiBhKHQpe3ZhciBuPWUuYXR0cmlidXRlc1sidzp0Z3RGcmFtZSJdfHxudWxsO3JldHVybiBuZXcgeWYuSHlwZXJsaW5rKHIsYmYuZXh0ZW5kKHt0YXJnZXRGcmFtZTpufSx0KSl9aWYodCl7dmFyIG89aS5maW5kVGFyZ2V0QnlSZWxhdGlvbnNoaXBJZCh0KTtyZXR1cm4gbiYmKG89RGYucmVwbGFjZUZyYWdtZW50KG8sbikpLGEoe2hyZWY6b30pfXJldHVybiBuP2Eoe2FuY2hvcjpufSk6cn0pKX0sInc6dGJsIjpmdW5jdGlvbihlKXt2YXIgdD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGIoZSwidzp0YmxTdHlsZSIsIlRhYmxlIixsLmZpbmRUYWJsZVN0eWxlQnlJZCl9KGUpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJue3N0eWxlSWQ6ZS5zdHlsZUlkLHN0eWxlTmFtZTplLm5hbWV9fSkpfShlLmZpcnN0T3JFbXB0eSgidzp0YmxQciIpKTtyZXR1cm4gdShlLmNoaWxkcmVuKS5mbGF0TWFwKFQpLmZsYXRNYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHlmLlRhYmxlKGUsdCl9KSl9KSl9LCJ3OnRyIjpmdW5jdGlvbihlKXt2YXIgdD1lLmZpcnN0T3JFbXB0eSgidzp0clByIiksbj0hIXQuZmlyc3QoInc6dGJsSGVhZGVyIik7cmV0dXJuIHUoZS5jaGlsZHJlbikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4geWYuVGFibGVSb3coZSx7aXNIZWFkZXI6bn0pfSkpfSwidzp0YyI6ZnVuY3Rpb24oZSl7cmV0dXJuIHUoZS5jaGlsZHJlbikubWFwKChmdW5jdGlvbih0KXt2YXIgbj1lLmZpcnN0T3JFbXB0eSgidzp0Y1ByIikscj1uLmZpcnN0T3JFbXB0eSgidzpncmlkU3BhbiIpLmF0dHJpYnV0ZXNbInc6dmFsIl0saT1yP3BhcnNlSW50KHIsMTApOjEsYT15Zi5UYWJsZUNlbGwodCx7Y29sU3BhbjppfSk7cmV0dXJuIGEuX3ZNZXJnZT1mdW5jdGlvbihlKXt2YXIgdD1lLmZpcnN0KCJ3OnZNZXJnZSIpO2lmKHQpe3ZhciBuPXQuYXR0cmlidXRlc1sidzp2YWwiXTtyZXR1cm4iY29udGludWUiPT09bnx8IW59cmV0dXJuIG51bGx9KG4pLGF9KSl9LCJ3OmZvb3Rub3RlUmVmZXJlbmNlIjp2KCJmb290bm90ZSIpLCJ3OmVuZG5vdGVSZWZlcmVuY2UiOnYoImVuZG5vdGUiKSwidzpjb21tZW50UmVmZXJlbmNlIjpmdW5jdGlvbihlKXtyZXR1cm4ga2YoeWYuY29tbWVudFJlZmVyZW5jZSh7Y29tbWVudElkOmUuYXR0cmlidXRlc1sidzppZCJdfSkpfSwidzpiciI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdHRyaWJ1dGVzWyJ3OnR5cGUiXTtyZXR1cm4gbnVsbD09dHx8InRleHRXcmFwcGluZyI9PT10P2tmKHlmLmxpbmVCcmVhayk6InBhZ2UiPT09dD9rZih5Zi5wYWdlQnJlYWspOiJjb2x1bW4iPT09dD9rZih5Zi5jb2x1bW5CcmVhayk6VWYoW3hmKCJVbnN1cHBvcnRlZCBicmVhayB0eXBlOiAiK3QpXSl9LCJ3OmJvb2ttYXJrU3RhcnQiOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYXR0cmlidXRlc1sidzpuYW1lIl07cmV0dXJuIl9Hb0JhY2siPT09dD9BZigpOmtmKG5ldyB5Zi5Cb29rbWFya1N0YXJ0KHtuYW1lOnR9KSl9LCJtYzpBbHRlcm5hdGVDb250ZW50IjpmdW5jdGlvbihlKXtyZXR1cm4geChlLmZpcnN0KCJtYzpGYWxsYmFjayIpKX0sInc6c2R0IjpmdW5jdGlvbihlKXtyZXR1cm4gdShlLmZpcnN0T3JFbXB0eSgidzpzZHRDb250ZW50IikuY2hpbGRyZW4pfSwidzppbnMiOngsInc6b2JqZWN0Ijp4LCJ3OnNtYXJ0VGFnIjp4LCJ3OmRyYXdpbmciOngsInc6cGljdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIHgoZSkudG9FeHRyYSgpfSwidjpyb3VuZHJlY3QiOngsInY6c2hhcGUiOngsInY6dGV4dGJveCI6eCwidzp0eGJ4Q29udGVudCI6eCwid3A6aW5saW5lIjp3LCJ3cDphbmNob3IiOncsInY6aW1hZ2VkYXRhIjpmdW5jdGlvbihlKXt2YXIgdD1lLmF0dHJpYnV0ZXNbInI6aWQiXTtyZXR1cm4gdD9VKEUodCksZS5hdHRyaWJ1dGVzWyJvOnRpdGxlIl0pOlVmKFt4ZigiQSB2OmltYWdlZGF0YSBlbGVtZW50IHdpdGhvdXQgYSByZWxhdGlvbnNoaXAgSUQgd2FzIGlnbm9yZWQiKV0pfSwidjpncm91cCI6eCwidjpyZWN0Ijp4fTtyZXR1cm57cmVhZFhtbEVsZW1lbnQ6ZixyZWFkWG1sRWxlbWVudHM6dX07ZnVuY3Rpb24gVChlKXtpZihiZi5hbnkoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZSE9PXlmLnR5cGVzLnRhYmxlUm93fSkpKXJldHVybiBTZihlLFt4ZigidW5leHBlY3RlZCBub24tcm93IGVsZW1lbnQgaW4gdGFibGUsIGNlbGwgbWVyZ2luZyBtYXkgYmUgaW5jb3JyZWN0IildKTtpZihiZi5hbnkoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGJmLmFueShlLmNoaWxkcmVuLChmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlIT09eWYudHlwZXMudGFibGVDZWxsfSkpfSkpKXJldHVybiBTZihlLFt4ZigidW5leHBlY3RlZCBub24tY2VsbCBlbGVtZW50IGluIHRhYmxlIHJvdywgY2VsbCBtZXJnaW5nIG1heSBiZSBpbmNvcnJlY3QiKV0pO3ZhciB0PXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPTA7ZS5jaGlsZHJlbi5mb3JFYWNoKChmdW5jdGlvbihlKXtlLl92TWVyZ2UmJnRbbl0/dFtuXS5yb3dTcGFuKys6KHRbbl09ZSxlLl92TWVyZ2U9ITEpLG4rPWUuY29sU3Bhbn0pKX0pKSxlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuY2hpbGRyZW49ZS5jaGlsZHJlbi5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiFlLl92TWVyZ2V9KSksZS5jaGlsZHJlbi5mb3JFYWNoKChmdW5jdGlvbihlKXtkZWxldGUgZS5fdk1lcmdlfSkpfSkpLGtmKGUpfWZ1bmN0aW9uIHcoZSl7cmV0dXJuIEZmKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImE6Z3JhcGhpYyIpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhOmdyYXBoaWNEYXRhIikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBpYzpwaWMiKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGljOmJsaXBGaWxsIikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImE6YmxpcCIpLm1hcChfLmJpbmQobnVsbCxlKSkpfWZ1bmN0aW9uIF8oZSx0KXt2YXIgbixyPWUuZmlyc3QoIndwOmRvY1ByIikuYXR0cmlidXRlcyxhPW51bGw9PShuPXIuZGVzY3IpfHwvXlxzKiQvLnRlc3Qobik/ci50aXRsZTpyLmRlc2NyLG89ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdHRyaWJ1dGVzWyJyOmVtYmVkIl0sbj1lLmF0dHJpYnV0ZXNbInI6bGluayJdO2lmKHQpcmV0dXJuIEUodCk7aWYobil7dmFyIHI9aS5maW5kVGFyZ2V0QnlSZWxhdGlvbnNoaXBJZChuKTtyZXR1cm57cGF0aDpyLHJlYWQ6Yy5yZWFkLmJpbmQoYyxyKX19cmV0dXJuIG51bGx9KHQpO3JldHVybiBudWxsPT09bz9VZihbeGYoIkNvdWxkIG5vdCBmaW5kIGltYWdlIGZpbGUgZm9yIGE6YmxpcCBlbGVtZW50IildKTpVKG8sYSl9ZnVuY3Rpb24gRShlKXt2YXIgdD1EZi51cmlUb1ppcEVudHJ5TmFtZSgid29yZCIsaS5maW5kVGFyZ2V0QnlSZWxhdGlvbnNoaXBJZChlKSk7cmV0dXJue3BhdGg6dCxyZWFkOm8ucmVhZC5iaW5kKG8sdCl9fWZ1bmN0aW9uIFUoZSx0KXt2YXIgbj1hLmZpbmRDb250ZW50VHlwZShlLnBhdGgpO3JldHVybiBTZih5Zi5JbWFnZSh7cmVhZEltYWdlOmUucmVhZCxhbHRUZXh0OnQsY29udGVudFR5cGU6bn0pLF9mW25dP1tdOnhmKCJJbWFnZSBvZiB0eXBlICIrbisiIGlzIHVubGlrZWx5IHRvIGRpc3BsYXkgaW4gd2ViIGJyb3dzZXJzIikpfX1mdW5jdGlvbiB3ZihlLHQsbil7aWYobnVsbCE9ZSl7dmFyIHI9bi5maW5kTGV2ZWxCeVBhcmFncmFwaFN0eWxlSWQoZSk7aWYobnVsbCE9cilyZXR1cm4gcn12YXIgaT10LmZpcnN0T3JFbXB0eSgidzppbHZsIikuYXR0cmlidXRlc1sidzp2YWwiXSxhPXQuZmlyc3RPckVtcHR5KCJ3Om51bUlkIikuYXR0cmlidXRlc1sidzp2YWwiXTtyZXR1cm4gdm9pZCAwPT09aXx8dm9pZCAwPT09YT9udWxsOm4uZmluZExldmVsKGEsaSl9dmFyIF9mPXsiaW1hZ2UvcG5nIjohMCwiaW1hZ2UvZ2lmIjohMCwiaW1hZ2UvanBlZyI6ITAsImltYWdlL3N2Zyt4bWwiOiEwLCJpbWFnZS90aWZmIjohMH0sRWY9eyJvZmZpY2Utd29yZDp3cmFwIjohMCwidjpzaGFkb3ciOiEwLCJ2OnNoYXBldHlwZSI6ITAsInc6YW5ub3RhdGlvblJlZiI6ITAsInc6Ym9va21hcmtFbmQiOiEwLCJ3OnNlY3RQciI6ITAsInc6cHJvb2ZFcnIiOiEwLCJ3Omxhc3RSZW5kZXJlZFBhZ2VCcmVhayI6ITAsInc6Y29tbWVudFJhbmdlU3RhcnQiOiEwLCJ3OmNvbW1lbnRSYW5nZUVuZCI6ITAsInc6ZGVsIjohMCwidzpmb290bm90ZVJlZiI6ITAsInc6ZW5kbm90ZVJlZiI6ITAsInc6cFByIjohMCwidzpyUHIiOiEwLCJ3OnRibFByIjohMCwidzp0YmxHcmlkIjohMCwidzp0clByIjohMCwidzp0Y1ByIjohMH07ZnVuY3Rpb24gVWYoZSl7cmV0dXJuIG5ldyBDZihudWxsLG51bGwsZSl9ZnVuY3Rpb24gQWYoKXtyZXR1cm4gbmV3IENmKG51bGwpfWZ1bmN0aW9uIGtmKGUpe3JldHVybiBuZXcgQ2YoZSl9ZnVuY3Rpb24gU2YoZSx0KXtyZXR1cm4gbmV3IENmKGUsbnVsbCx0KX1mdW5jdGlvbiBDZihlLHQsbil7dGhpcy52YWx1ZT1lfHxbXSx0aGlzLmV4dHJhPXR8fFtdLHRoaXMuX3Jlc3VsdD1uZXcgdmYoe2VsZW1lbnQ6dGhpcy52YWx1ZSxleHRyYTp0fSxuKSx0aGlzLm1lc3NhZ2VzPXRoaXMuX3Jlc3VsdC5tZXNzYWdlc31mdW5jdGlvbiBGZihlKXt2YXIgdD12Zi5jb21iaW5lKGJmLnBsdWNrKGUsIl9yZXN1bHQiKSk7cmV0dXJuIG5ldyBDZihiZi5mbGF0dGVuKGJmLnBsdWNrKHQudmFsdWUsImVsZW1lbnQiKSksYmYuZmlsdGVyKGJmLmZsYXR0ZW4oYmYucGx1Y2sodC52YWx1ZSwiZXh0cmEiKSksSWYpLHQubWVzc2FnZXMpfWZ1bmN0aW9uIE9mKGUsdCl7cmV0dXJuIGJmLmZsYXR0ZW4oW2UsdF0pfWZ1bmN0aW9uIElmKGUpe3JldHVybiBlfUNmLnByb3RvdHlwZS50b0V4dHJhPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBDZihudWxsLE9mKHRoaXMuZXh0cmEsdGhpcy52YWx1ZSksdGhpcy5tZXNzYWdlcyl9LENmLnByb3RvdHlwZS5pbnNlcnRFeHRyYT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZXh0cmE7cmV0dXJuIGUmJmUubGVuZ3RoP25ldyBDZihPZih0aGlzLnZhbHVlLGUpLG51bGwsdGhpcy5tZXNzYWdlcyk6dGhpc30sQ2YucHJvdG90eXBlLm1hcD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZXN1bHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZSh0LmVsZW1lbnQpfSkpO3JldHVybiBuZXcgQ2YodC52YWx1ZSx0aGlzLmV4dHJhLHQubWVzc2FnZXMpfSxDZi5wcm90b3R5cGUuZmxhdE1hcD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZXN1bHQuZmxhdE1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUodC5lbGVtZW50KS5fcmVzdWx0fSkpO3JldHVybiBuZXcgQ2YodC52YWx1ZS5lbGVtZW50LE9mKHRoaXMuZXh0cmEsdC52YWx1ZS5leHRyYSksdC5tZXNzYWdlcyl9LENmLm1hcD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG5ldyBDZihuKGUudmFsdWUsdC52YWx1ZSksT2YoZS5leHRyYSx0LmV4dHJhKSxlLm1lc3NhZ2VzLmNvbmNhdCh0Lm1lc3NhZ2VzKSl9O3ZhciBSZj17RG9jdW1lbnRYbWxSZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ib2R5UmVhZGVyO3JldHVybntjb252ZXJ0WG1sVG9Eb2N1bWVudDpmdW5jdGlvbihuKXt2YXIgcj1uLmZpcnN0KCJ3OmJvZHkiKSxpPXQucmVhZFhtbEVsZW1lbnRzKHIuY2hpbGRyZW4pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBOZi5Eb2N1bWVudCh0LHtub3RlczplLm5vdGVzLGNvbW1lbnRzOmUuY29tbWVudHN9KX0pKTtyZXR1cm4gbmV3IFBmKGkudmFsdWUsaS5tZXNzYWdlcyl9fX19LE5mPWxvLFBmPWJvLlJlc3VsdDt2YXIgQmY9e307ZnVuY3Rpb24gV2YoZSl7dmFyIHQ9e307ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0W2UucmVsYXRpb25zaGlwSWRdPWUudGFyZ2V0fSkpO3ZhciBuPXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe25bZS50eXBlXXx8KG5bZS50eXBlXT1bXSksbltlLnR5cGVdLnB1c2goZS50YXJnZXQpfSkpLHtmaW5kVGFyZ2V0QnlSZWxhdGlvbnNoaXBJZDpmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0sZmluZFRhcmdldHNCeVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fFtdfX19QmYucmVhZFJlbGF0aW9uc2hpcHM9ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuIGUuY2hpbGRyZW4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoIntodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHN9UmVsYXRpb25zaGlwIj09PWUubmFtZSl7dmFyIG49e3JlbGF0aW9uc2hpcElkOmUuYXR0cmlidXRlcy5JZCx0YXJnZXQ6ZS5hdHRyaWJ1dGVzLlRhcmdldCx0eXBlOmUuYXR0cmlidXRlcy5UeXBlfTt0LnB1c2gobil9fSkpLG5ldyBXZih0KX0sQmYuZGVmYXVsdFZhbHVlPW5ldyBXZihbXSksQmYuUmVsYXRpb25zaGlwcz1XZjt2YXIgTGY9e3JlYWRDb250ZW50VHlwZXNGcm9tWG1sOmZ1bmN0aW9uKGUpe3ZhciB0PXt9LG49e307cmV0dXJuIGUuY2hpbGRyZW4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoImNvbnRlbnQtdHlwZXM6RGVmYXVsdCI9PT1lLm5hbWUmJih0W2UuYXR0cmlidXRlcy5FeHRlbnNpb25dPWUuYXR0cmlidXRlcy5Db250ZW50VHlwZSksImNvbnRlbnQtdHlwZXM6T3ZlcnJpZGUiPT09ZS5uYW1lKXt2YXIgcj1lLmF0dHJpYnV0ZXMuUGFydE5hbWU7Ii8iPT09ci5jaGFyQXQoMCkmJihyPXIuc3Vic3RyaW5nKDEpKSxuW3JdPWUuYXR0cmlidXRlcy5Db250ZW50VHlwZX19KSksamYobix0KX19LE1mPXtwbmc6InBuZyIsZ2lmOiJnaWYiLGpwZWc6ImpwZWciLGpwZzoianBlZyIsdGlmOiJ0aWZmIix0aWZmOiJ0aWZmIixibXA6ImJtcCJ9O2Z1bmN0aW9uIGpmKGUsdCl7cmV0dXJue2ZpbmRDb250ZW50VHlwZTpmdW5jdGlvbihuKXt2YXIgcj1lW25dO2lmKHIpcmV0dXJuIHI7dmFyIGk9bi5zcGxpdCgiLiIpLGE9aVtpLmxlbmd0aC0xXTtpZih0Lmhhc093blByb3BlcnR5KGEpKXJldHVybiB0W2FdO3ZhciBvPU1mW2EudG9Mb3dlckNhc2UoKV07cmV0dXJuIG8/ImltYWdlLyIrbzpudWxsfX19TGYuZGVmYXVsdENvbnRlbnRUeXBlcz1qZih7fSx7fSk7dmFyIHpmPXt9LEhmPUxyO2Z1bmN0aW9uIFZmKGUsdCxuKXt2YXIgcj1IZi5mbGF0dGVuKEhmLnZhbHVlcyh0KS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBIZi52YWx1ZXMoZS5sZXZlbHMpfSkpKSxpPUhmLmluZGV4Qnkoci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lLnBhcmFncmFwaFN0eWxlSWR9KSksInBhcmFncmFwaFN0eWxlSWQiKTtyZXR1cm57ZmluZExldmVsOmZ1bmN0aW9uIHIoaSxhKXt2YXIgbz1lW2ldO2lmKG8pe3ZhciBjPXRbby5hYnN0cmFjdE51bUlkXTtyZXR1cm4gYz9udWxsPT1jLm51bVN0eWxlTGluaz90W28uYWJzdHJhY3ROdW1JZF0ubGV2ZWxzW2FdOnIobi5maW5kTnVtYmVyaW5nU3R5bGVCeUlkKGMubnVtU3R5bGVMaW5rKS5udW1JZCxhKTpudWxsfXJldHVybiBudWxsfSxmaW5kTGV2ZWxCeVBhcmFncmFwaFN0eWxlSWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGlbZV18fG51bGx9fX16Zi5yZWFkTnVtYmVyaW5nWG1sPWZ1bmN0aW9uKGUsdCl7aWYoIXR8fCF0LnN0eWxlcyl0aHJvdyBuZXcgRXJyb3IoInN0eWxlcyBpcyBtaXNzaW5nIik7dmFyIG49ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInc6YWJzdHJhY3ROdW0iKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLmF0dHJpYnV0ZXNbInc6YWJzdHJhY3ROdW1JZCJdO3Rbbl09ZnVuY3Rpb24oZSl7dmFyIHQ9e307ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidzpsdmwiKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLmF0dHJpYnV0ZXNbInc6aWx2bCJdLHI9ZS5maXJzdCgidzpudW1GbXQiKS5hdHRyaWJ1dGVzWyJ3OnZhbCJdLGk9ZS5maXJzdE9yRW1wdHkoInc6cFN0eWxlIikuYXR0cmlidXRlc1sidzp2YWwiXTt0W25dPXtpc09yZGVyZWQ6ImJ1bGxldCIhPT1yLGxldmVsOm4scGFyYWdyYXBoU3R5bGVJZDppfX0pKTt2YXIgbj1lLmZpcnN0T3JFbXB0eSgidzpudW1TdHlsZUxpbmsiKS5hdHRyaWJ1dGVzWyJ3OnZhbCJdO3JldHVybntsZXZlbHM6dCxudW1TdHlsZUxpbms6bn19KGUpfSkpLHR9KGUpLHI9ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInc6bnVtIikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5hdHRyaWJ1dGVzWyJ3Om51bUlkIl0scj1lLmZpcnN0KCJ3OmFic3RyYWN0TnVtSWQiKS5hdHRyaWJ1dGVzWyJ3OnZhbCJdO3Rbbl09e2Fic3RyYWN0TnVtSWQ6cn19KSksdH0oZSk7cmV0dXJuIG5ldyBWZihyLG4sdC5zdHlsZXMpfSx6Zi5OdW1iZXJpbmc9VmYsemYuZGVmYXVsdE51bWJlcmluZz1uZXcgVmYoe30se30pO3ZhciBxZj17fTtmdW5jdGlvbiBHZihlLHQsbixyKXtyZXR1cm57ZmluZFBhcmFncmFwaFN0eWxlQnlJZDpmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0sZmluZENoYXJhY3RlclN0eWxlQnlJZDpmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0sZmluZFRhYmxlU3R5bGVCeUlkOmZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfSxmaW5kTnVtYmVyaW5nU3R5bGVCeUlkOmZ1bmN0aW9uKGUpe3JldHVybiByW2VdfX19cWYucmVhZFN0eWxlc1htbD1mdW5jdGlvbihlKXt2YXIgdD17fSxuPXt9LHI9e30saT17fSxhPXtwYXJhZ3JhcGg6dCxjaGFyYWN0ZXI6bix0YWJsZTpyfTtyZXR1cm4gZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidzpzdHlsZSIpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKGUpe3ZhciB0PWUuYXR0cmlidXRlc1sidzp0eXBlIl0sbj1lLmF0dHJpYnV0ZXNbInc6c3R5bGVJZCJdLHI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5maXJzdCgidzpuYW1lIik7cmV0dXJuIHQ/dC5hdHRyaWJ1dGVzWyJ3OnZhbCJdOm51bGx9KGUpO3JldHVybnt0eXBlOnQsc3R5bGVJZDpuLG5hbWU6cn19KGUpO2lmKCJudW1iZXJpbmciPT09dC50eXBlKWlbdC5zdHlsZUlkXT1mdW5jdGlvbihlKXt2YXIgdD1lLmZpcnN0T3JFbXB0eSgidzpwUHIiKS5maXJzdE9yRW1wdHkoInc6bnVtUHIiKS5maXJzdE9yRW1wdHkoInc6bnVtSWQiKS5hdHRyaWJ1dGVzWyJ3OnZhbCJdO3JldHVybntudW1JZDp0fX0oZSk7ZWxzZXt2YXIgbj1hW3QudHlwZV07biYmKG5bdC5zdHlsZUlkXT10KX19KSksbmV3IEdmKHQsbixyLGkpfSxxZi5TdHlsZXM9R2YscWYuZGVmYXVsdFN0eWxlcz1uZXcgR2Yoe30se30pLEdmLkVNUFRZPW5ldyBHZih7fSx7fSx7fSx7fSk7dmFyIFhmPXt9LCRmPWxvLFlmPWJvLlJlc3VsdDtmdW5jdGlvbiBLZihlLHQpe2Z1bmN0aW9uIG4oZSl7dmFyIHQ9ZS5hdHRyaWJ1dGVzWyJ3OnR5cGUiXTtyZXR1cm4iY29udGludWF0aW9uU2VwYXJhdG9yIiE9PXQmJiJzZXBhcmF0b3IiIT09dH1mdW5jdGlvbiByKG4pe3ZhciByPW4uYXR0cmlidXRlc1sidzppZCJdO3JldHVybiB0LnJlYWRYbWxFbGVtZW50cyhuLmNoaWxkcmVuKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiAkZi5Ob3RlKHtub3RlVHlwZTplLG5vdGVJZDpyLGJvZHk6dH0pfSkpfXJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gWWYuY29tYmluZSh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ3OiIrZSkuZmlsdGVyKG4pLm1hcChyKSl9fVhmLmNyZWF0ZUZvb3Rub3Rlc1JlYWRlcj1LZi5iaW5kKFEsImZvb3Rub3RlIiksWGYuY3JlYXRlRW5kbm90ZXNSZWFkZXI9S2YuYmluZChRLCJlbmRub3RlIik7dmFyIFpmPXt9LEpmPWxvLFFmPWJvLlJlc3VsdDtaZi5jcmVhdGVDb21tZW50c1JlYWRlcj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPXQuYXR0cmlidXRlc1sidzppZCJdO2Z1bmN0aW9uIHIoZSl7cmV0dXJuKHQuYXR0cmlidXRlc1tlXXx8IiIpLnRyaW0oKXx8bnVsbH1yZXR1cm4gZS5yZWFkWG1sRWxlbWVudHModC5jaGlsZHJlbikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gSmYuY29tbWVudCh7Y29tbWVudElkOm4sYm9keTplLGF1dGhvck5hbWU6cigidzphdXRob3IiKSxhdXRob3JJbml0aWFsczpyKCJ3OmluaXRpYWxzIil9KX0pKX1yZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIFFmLmNvbWJpbmUoZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidzpjb21tZW50IikubWFwKHQpKX19O3ZhciBlZD17fSx0ZD1uaTtlZC5GaWxlcz1mdW5jdGlvbigpe3JldHVybntyZWFkOmZ1bmN0aW9uKGUpe3JldHVybiB0ZC5yZWplY3QobmV3IEVycm9yKCJjb3VsZCBub3Qgb3BlbiBleHRlcm5hbCBpbWFnZTogJyIrZSsiJ1xuY2Fubm90IG9wZW4gbGlua2VkIGZpbGVzIGZyb20gYSB3ZWIgYnJvd3NlciIpKX19fSxNci5yZWFkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dHx8e30scmQucHJvcHMoe2NvbnRlbnRUeXBlczpUZChlKSxwYXJ0UGF0aHM6YmQoZSksZG9jeEZpbGU6ZSxmaWxlczpuZXcgbWQodC5wYXRoP25kLmRpcm5hbWUodC5wYXRoKTpudWxsKX0pLmFsc28oKGZ1bmN0aW9uKHQpe3JldHVybntzdHlsZXM6X2QoZSx0LnBhcnRQYXRocy5zdHlsZXMpfX0pKS5hbHNvKChmdW5jdGlvbih0KXtyZXR1cm57bnVtYmVyaW5nOndkKGUsdC5wYXJ0UGF0aHMubnVtYmVyaW5nLHQuc3R5bGVzKX19KSkuYWxzbygoZnVuY3Rpb24oZSl7cmV0dXJue2Zvb3Rub3Rlczp4ZChlLnBhcnRQYXRocy5mb290bm90ZXMsZSwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9wZC5jcmVhdGVGb290bm90ZXNSZWFkZXIoZSkodCk6bmV3IGFkKFtdKX0pKSxlbmRub3Rlczp4ZChlLnBhcnRQYXRocy5lbmRub3RlcyxlLChmdW5jdGlvbihlLHQpe3JldHVybiB0P3BkLmNyZWF0ZUVuZG5vdGVzUmVhZGVyKGUpKHQpOm5ldyBhZChbXSl9KSksY29tbWVudHM6eGQoZS5wYXJ0UGF0aHMuY29tbWVudHMsZSwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9nZC5jcmVhdGVDb21tZW50c1JlYWRlcihlKSh0KTpuZXcgYWQoW10pfSkpfX0pKS5hbHNvKChmdW5jdGlvbihlKXtyZXR1cm57bm90ZXM6ZS5mb290bm90ZXMuZmxhdE1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuZW5kbm90ZXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGlkLk5vdGVzKHQuY29uY2F0KGUpKX0pKX0pKX19KSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIHhkKGUucGFydFBhdGhzLm1haW5Eb2N1bWVudCxlLChmdW5jdGlvbih0LG4pe3JldHVybiBlLm5vdGVzLmZsYXRNYXAoKGZ1bmN0aW9uKHIpe3JldHVybiBlLmNvbW1lbnRzLmZsYXRNYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbGQoe2JvZHlSZWFkZXI6dCxub3RlczpyLGNvbW1lbnRzOmV9KS5jb252ZXJ0WG1sVG9Eb2N1bWVudChuKX0pKX0pKX0pKX0pKX0sTXIuX2ZpbmRQYXJ0UGF0aHM9YmQ7dmFyIG5kPXRpLHJkPW5pLGlkPWxvLGFkPWJvLlJlc3VsdCxvZD1UbyxjZD1Oby5yZWFkWG1sRnJvbVppcEZpbGUsc2Q9dGYuY3JlYXRlQm9keVJlYWRlcixsZD1SZi5Eb2N1bWVudFhtbFJlYWRlcix1ZD1CZixmZD1MZixkZD16ZixoZD1xZixwZD1YZixnZD1aZixtZD1lZC5GaWxlcztmdW5jdGlvbiBiZChlKXtyZXR1cm4gRWQoZSkudGhlbigoZnVuY3Rpb24odCl7dmFyIG49eWQoe2RvY3hGaWxlOmUscmVsYXRpb25zaGlwczp0LHJlbGF0aW9uc2hpcFR5cGU6Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvb2ZmaWNlRG9jdW1lbnQiLGJhc2VQYXRoOiIiLGZhbGxiYWNrUGF0aDoid29yZC9kb2N1bWVudC54bWwifSk7aWYoIWUuZXhpc3RzKG4pKXRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgbWFpbiBkb2N1bWVudCBwYXJ0LiBBcmUgeW91IHN1cmUgdGhpcyBpcyBhIHZhbGlkIC5kb2N4IGZpbGU/Iik7cmV0dXJuIHZkKHtmaWxlbmFtZTpEZChuKSxyZWFkRWxlbWVudDp1ZC5yZWFkUmVsYXRpb25zaGlwcyxkZWZhdWx0VmFsdWU6dWQuZGVmYXVsdFZhbHVlfSkoZSkudGhlbigoZnVuY3Rpb24odCl7ZnVuY3Rpb24gcihyKXtyZXR1cm4geWQoe2RvY3hGaWxlOmUscmVsYXRpb25zaGlwczp0LHJlbGF0aW9uc2hpcFR5cGU6Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvIityLGJhc2VQYXRoOm9kLnNwbGl0UGF0aChuKS5kaXJuYW1lLGZhbGxiYWNrUGF0aDoid29yZC8iK3IrIi54bWwifSl9cmV0dXJue21haW5Eb2N1bWVudDpuLGNvbW1lbnRzOnIoImNvbW1lbnRzIiksZW5kbm90ZXM6cigiZW5kbm90ZXMiKSxmb290bm90ZXM6cigiZm9vdG5vdGVzIiksbnVtYmVyaW5nOnIoIm51bWJlcmluZyIpLHN0eWxlczpyKCJzdHlsZXMiKX19KSl9KSl9ZnVuY3Rpb24geWQoZSl7dmFyIHQ9ZS5kb2N4RmlsZSxuPWUucmVsYXRpb25zaGlwcyxyPWUucmVsYXRpb25zaGlwVHlwZSxpPWUuYmFzZVBhdGgsYT1lLmZhbGxiYWNrUGF0aCxvPW4uZmluZFRhcmdldHNCeVR5cGUocikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdD1vZC5qb2luUGF0aChpLGUpLG49Ii8iLHQuc3Vic3RyaW5nKDAsbi5sZW5ndGgpPT09bj90LnN1YnN0cmluZyhuLmxlbmd0aCk6dDt2YXIgdCxufSkpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIHQuZXhpc3RzKGUpfSkpO3JldHVybiAwPT09by5sZW5ndGg/YTpvWzBdfWZ1bmN0aW9uIHZkKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gY2QodCxlLmZpbGVuYW1lKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gdD9lLnJlYWRFbGVtZW50KHQpOmUuZGVmYXVsdFZhbHVlfSkpfX1mdW5jdGlvbiB4ZChlLHQsbil7cmV0dXJuIHZkKHtmaWxlbmFtZTpEZChlKSxyZWFkRWxlbWVudDp1ZC5yZWFkUmVsYXRpb25zaGlwcyxkZWZhdWx0VmFsdWU6dWQuZGVmYXVsdFZhbHVlfSkodC5kb2N4RmlsZSkudGhlbigoZnVuY3Rpb24ocil7dmFyIGk9bmV3IHNkKHtyZWxhdGlvbnNoaXBzOnIsY29udGVudFR5cGVzOnQuY29udGVudFR5cGVzLGRvY3hGaWxlOnQuZG9jeEZpbGUsbnVtYmVyaW5nOnQubnVtYmVyaW5nLHN0eWxlczp0LnN0eWxlcyxmaWxlczp0LmZpbGVzfSk7cmV0dXJuIGNkKHQuZG9jeEZpbGUsZSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIG4oaSxlKX0pKX0pKX1mdW5jdGlvbiBEZChlKXt2YXIgdD1vZC5zcGxpdFBhdGgoZSk7cmV0dXJuIG9kLmpvaW5QYXRoKHQuZGlybmFtZSwiX3JlbHMiLHQuYmFzZW5hbWUrIi5yZWxzIil9dmFyIFRkPXZkKHtmaWxlbmFtZToiW0NvbnRlbnRfVHlwZXNdLnhtbCIscmVhZEVsZW1lbnQ6ZmQucmVhZENvbnRlbnRUeXBlc0Zyb21YbWwsZGVmYXVsdFZhbHVlOmZkLmRlZmF1bHRDb250ZW50VHlwZXN9KTtmdW5jdGlvbiB3ZChlLHQsbil7cmV0dXJuIHZkKHtmaWxlbmFtZTp0LHJlYWRFbGVtZW50OmZ1bmN0aW9uKGUpe3JldHVybiBkZC5yZWFkTnVtYmVyaW5nWG1sKGUse3N0eWxlczpufSl9LGRlZmF1bHRWYWx1ZTpkZC5kZWZhdWx0TnVtYmVyaW5nfSkoZSl9ZnVuY3Rpb24gX2QoZSx0KXtyZXR1cm4gdmQoe2ZpbGVuYW1lOnQscmVhZEVsZW1lbnQ6aGQucmVhZFN0eWxlc1htbCxkZWZhdWx0VmFsdWU6aGQuZGVmYXVsdFN0eWxlc30pKGUpfXZhciBFZD12ZCh7ZmlsZW5hbWU6Il9yZWxzLy5yZWxzIixyZWFkRWxlbWVudDp1ZC5yZWFkUmVsYXRpb25zaGlwcyxkZWZhdWx0VmFsdWU6dWQuZGVmYXVsdFZhbHVlfSksVWQ9e30sQWQ9THIsa2Q9bmksU2Q9UG87VWQud3JpdGVTdHlsZU1hcD1mdW5jdGlvbihlLHQpe3JldHVybiBlLndyaXRlKEZkLHQpLGZ1bmN0aW9uKGUpe3ZhciB0PSJ3b3JkL19yZWxzL2RvY3VtZW50LnhtbC5yZWxzIixuPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMiLHI9InsiK24rIn1SZWxhdGlvbnNoaXAiO3JldHVybiBlLnJlYWQodCwidXRmOCIpLnRoZW4oU2QucmVhZFN0cmluZykudGhlbigoZnVuY3Rpb24oaSl7SWQoaS5jaGlsZHJlbixyLCJJZCIse0lkOiJyTWFtbW90aFN0eWxlTWFwIixUeXBlOkNkLFRhcmdldDpPZH0pO3ZhciBhPXsiIjpufTtyZXR1cm4gZS53cml0ZSh0LFNkLndyaXRlU3RyaW5nKGksYSkpfSkpfShlKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD0iW0NvbnRlbnRfVHlwZXNdLnhtbCIsbj0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9jb250ZW50LXR5cGVzIixyPSJ7IituKyJ9T3ZlcnJpZGUiO3JldHVybiBlLnJlYWQodCwidXRmOCIpLnRoZW4oU2QucmVhZFN0cmluZykudGhlbigoZnVuY3Rpb24oaSl7SWQoaS5jaGlsZHJlbixyLCJQYXJ0TmFtZSIse1BhcnROYW1lOk9kLENvbnRlbnRUeXBlOiJ0ZXh0L3Bycy5tYW1tb3RoLnN0eWxlLW1hcCJ9KTt2YXIgYT17IiI6bn07cmV0dXJuIGUud3JpdGUodCxTZC53cml0ZVN0cmluZyhpLGEpKX0pKX0oZSl9KSl9LFVkLnJlYWRTdHlsZU1hcD1mdW5jdGlvbihlKXtyZXR1cm4gZS5leGlzdHMoRmQpP2UucmVhZChGZCwidXRmOCIpOmtkLnJlc29sdmUobnVsbCl9O3ZhciBDZD0iaHR0cDovL3NjaGVtYXMuendvYmJsZS5vcmcvbWFtbW90aC9zdHlsZS1tYXAiLEZkPSJtYW1tb3RoL3N0eWxlLW1hcCIsT2Q9Ii8iK0ZkO2Z1bmN0aW9uIElkKGUsdCxuLHIpe3ZhciBpPUFkLmZpbmQoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUubmFtZT09PXQmJmUuYXR0cmlidXRlc1tuXT09PXJbbl19KSk7aT9pLmF0dHJpYnV0ZXM9cjplLnB1c2goU2QuZWxlbWVudCh0LHIpKX12YXIgUmQsTmQsUGQsQmQsV2QsTGQ9e30sTWQ9e30samQ9e30semQ9e307ZnVuY3Rpb24gSGQoKXtpZihSZClyZXR1cm4gemQ7UmQ9MTt2YXIgZT1HZCgpO2Z1bmN0aW9uIHQoZSx0KXtyZXR1cm57dHlwZToiZWxlbWVudCIsdGFnOmUsY2hpbGRyZW46dHx8W119fXpkLmZyZXNoRWxlbWVudD1mdW5jdGlvbihuLHIsaSl7cmV0dXJuIHQoZS5lbGVtZW50KG4scix7ZnJlc2g6ITB9KSxpKX0semQubm9uRnJlc2hFbGVtZW50PWZ1bmN0aW9uKG4scixpKXtyZXR1cm4gdChlLmVsZW1lbnQobixyLHtmcmVzaDohMX0pLGkpfSx6ZC5lbGVtZW50V2l0aFRhZz10LHpkLnRleHQ9ZnVuY3Rpb24oZSl7cmV0dXJue3R5cGU6InRleHQiLHZhbHVlOmV9fSx6ZC5mb3JjZVdyaXRlPXt0eXBlOiJmb3JjZVdyaXRlIn07dmFyIG49e2JyOiEwLGhyOiEwLGltZzohMH07cmV0dXJuIHpkLmlzVm9pZEVsZW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1lLmNoaWxkcmVuLmxlbmd0aCYmbltlLnRhZy50YWdOYW1lXX0semR9ZnVuY3Rpb24gVmQoKXtpZihQZClyZXR1cm4gTmQ7UGQ9MTt2YXIgZT1Mcix0PUhkKCk7ZnVuY3Rpb24gbihlKXt2YXIgdD1bXTtyZXR1cm4gZS5tYXAocikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7byh0LGUpfSkpLHR9ZnVuY3Rpb24gcihlKXtyZXR1cm4gaVtlLnR5cGVdKGUpfXZhciBpPXtlbGVtZW50OmZ1bmN0aW9uKGUpe3JldHVybiB0LmVsZW1lbnRXaXRoVGFnKGUudGFnLG4oZS5jaGlsZHJlbikpfSx0ZXh0OmEsZm9yY2VXcml0ZTphfTtmdW5jdGlvbiBhKGUpe3JldHVybiBlfWZ1bmN0aW9uIG8oZSxuKXt2YXIgcj1lW2UubGVuZ3RoLTFdOyJlbGVtZW50Ij09PW4udHlwZSYmIW4udGFnLmZyZXNoJiZyJiYiZWxlbWVudCI9PT1yLnR5cGUmJm4udGFnLm1hdGNoZXNFbGVtZW50KHIudGFnKT8obi50YWcuc2VwYXJhdG9yJiZvKHIuY2hpbGRyZW4sdC50ZXh0KG4udGFnLnNlcGFyYXRvcikpLG4uY2hpbGRyZW4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7byhyLmNoaWxkcmVuLGUpfSkpKTplLnB1c2gobil9ZnVuY3Rpb24gYyh0KXtyZXR1cm4gZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5mbGF0dGVuKGUubWFwKHQsbiksITApfSh0LChmdW5jdGlvbihlKXtyZXR1cm4gc1tlLnR5cGVdKGUpfSkpfXZhciBzPXtlbGVtZW50OmZ1bmN0aW9uKGUpe3ZhciBuPWMoZS5jaGlsZHJlbik7cmV0dXJuIDAhPT1uLmxlbmd0aHx8dC5pc1ZvaWRFbGVtZW50KGUpP1t0LmVsZW1lbnRXaXRoVGFnKGUudGFnLG4pXTpbXX0sdGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gMD09PWUudmFsdWUubGVuZ3RoP1tdOltlXX0sZm9yY2VXcml0ZTpmdW5jdGlvbihlKXtyZXR1cm5bZV19fTtyZXR1cm4gTmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG4oYyhlKSl9LE5kfWZ1bmN0aW9uIHFkKCl7aWYoQmQpcmV0dXJuIGpkO0JkPTE7dmFyIGU9SGQoKTtmdW5jdGlvbiB0KGUsdCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXshZnVuY3Rpb24oZSx0KXtuW3QudHlwZV0oZSx0KX0oZSx0KX0pKX1qZC5mcmVzaEVsZW1lbnQ9ZS5mcmVzaEVsZW1lbnQsamQubm9uRnJlc2hFbGVtZW50PWUubm9uRnJlc2hFbGVtZW50LGpkLmVsZW1lbnRXaXRoVGFnPWUuZWxlbWVudFdpdGhUYWcsamQudGV4dD1lLnRleHQsamQuZm9yY2VXcml0ZT1lLmZvcmNlV3JpdGUsamQuc2ltcGxpZnk9VmQoKTt2YXIgbj17ZWxlbWVudDpmdW5jdGlvbihuLHIpe2UuaXNWb2lkRWxlbWVudChyKT9uLnNlbGZDbG9zaW5nKHIudGFnLnRhZ05hbWUsci50YWcuYXR0cmlidXRlcyk6KG4ub3BlbihyLnRhZy50YWdOYW1lLHIudGFnLmF0dHJpYnV0ZXMpLHQobixyLmNoaWxkcmVuKSxuLmNsb3NlKHIudGFnLnRhZ05hbWUpKX0sdGV4dDpmdW5jdGlvbihlLHQpe2UudGV4dCh0LnZhbHVlKX0sZm9yY2VXcml0ZTpmdW5jdGlvbigpe319O3JldHVybiBqZC53cml0ZT10LGpkfWZ1bmN0aW9uIEdkKCl7aWYoV2QpcmV0dXJuIE1kO1dkPTE7dmFyIGU9THIsdD1xZCgpO2Z1bmN0aW9uIG4odCl7cmV0dXJuIG5ldyByKHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZS5pc1N0cmluZyh0KT9pKHQpOnR9KSkpfWZ1bmN0aW9uIHIoZSl7dGhpcy5fZWxlbWVudHM9ZX1mdW5jdGlvbiBpKGUsdCxuKXtyZXR1cm4gbmV3IGEoZSx0LG49bnx8e30pfWZ1bmN0aW9uIGEodCxuLHIpe3ZhciBpPXt9O2UuaXNBcnJheSh0KT8odC5mb3JFYWNoKChmdW5jdGlvbihlKXtpW2VdPSEwfSkpLHQ9dFswXSk6aVt0XT0hMCx0aGlzLnRhZ05hbWU9dCx0aGlzLnRhZ05hbWVzPWksdGhpcy5hdHRyaWJ1dGVzPW58fHt9LHRoaXMuZnJlc2g9ci5mcmVzaCx0aGlzLnNlcGFyYXRvcj1yLnNlcGFyYXRvcn1yZXR1cm4gTWQudG9wTGV2ZWxFbGVtZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4oW2koZSx0LHtmcmVzaDohMH0pXSl9LE1kLmVsZW1lbnRzPW4sTWQuZWxlbWVudD1pLHIucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUoKSxuPXRoaXMuX2VsZW1lbnRzLmxlbmd0aC0xO24+PTA7bi0tKXQ9dGhpcy5fZWxlbWVudHNbbl0ud3JhcE5vZGVzKHQpO3JldHVybiB0fSxhLnByb3RvdHlwZS5tYXRjaGVzRWxlbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50YWdOYW1lc1t0LnRhZ05hbWVdJiZlLmlzRXF1YWwodGhpcy5hdHRyaWJ1dGVzfHx7fSx0LmF0dHJpYnV0ZXN8fHt9KX0sYS5wcm90b3R5cGUud3JhcD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy53cmFwTm9kZXMoZSgpKX0sYS5wcm90b3R5cGUud3JhcE5vZGVzPWZ1bmN0aW9uKGUpe3JldHVyblt0LmVsZW1lbnRXaXRoVGFnKHRoaXMsZSldfSxNZC5lbXB0eT1uKFtdKSxNZC5pZ25vcmU9e3dyYXA6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LE1kfXZhciBYZD17fTshZnVuY3Rpb24oZSl7dmFyIHQ9THIsbj1uaSxyPXFkKCk7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZnVuY3Rpb24oaSxhKXtyZXR1cm4gbi53aGVuKGUoaSkpLnRoZW4oKGZ1bmN0aW9uKGUpe3ZhciBuPXt9O3JldHVybiBpLmFsdFRleHQmJihuLmFsdD1pLmFsdFRleHQpLHQuZXh0ZW5kKG4sZSksW3IuZnJlc2hFbGVtZW50KCJpbWciLG4pXX0pKX19ZS5pbWdFbGVtZW50PWksZS5pbmxpbmU9ZS5pbWdFbGVtZW50LGUuZGF0YVVyaT1pKChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWFkQXNCYXNlNjRTdHJpbmcoKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm57c3JjOiJkYXRhOiIrZS5jb250ZW50VHlwZSsiO2Jhc2U2NCwiK3R9fSkpfSkpfShYZCk7dmFyICRkPXt9LFlkPXt9LEtkPUxyO1lkLndyaXRlcj1mdW5jdGlvbihlKXtyZXR1cm4oZT1lfHx7fSkucHJldHR5UHJpbnQ/ZnVuY3Rpb24oKXt2YXIgZT0wLHQ9IiAgIixuPVtdLHI9ITAsaT0hMSxhPUpkKCk7ZnVuY3Rpb24gbyh0LGkpe1pkW3RdJiZkKCksbi5wdXNoKHQpLGEub3Blbih0LGkpLFpkW3RdJiZlKysscj0hMX1mdW5jdGlvbiBjKHQpe1pkW3RdJiYoZS0tLGQoKSksbi5wb3AoKSxhLmNsb3NlKHQpfWZ1bmN0aW9uIHMoZSl7ZigpO3ZhciBuPWgoKT9lOmUucmVwbGFjZSgiXG4iLCJcbiIrdCk7YS50ZXh0KG4pfWZ1bmN0aW9uIGwoZSx0KXtkKCksYS5zZWxmQ2xvc2luZyhlLHQpfWZ1bmN0aW9uIHUoKXtyZXR1cm4gMD09PW4ubGVuZ3RofHxaZFtuW24ubGVuZ3RoLTFdXX1mdW5jdGlvbiBmKCl7aXx8KGQoKSxpPSEwKX1mdW5jdGlvbiBkKCl7aWYoaT0hMSwhciYmdSgpJiYhaCgpKXthLl9hcHBlbmQoIlxuIik7Zm9yKHZhciBuPTA7bjxlO24rKylhLl9hcHBlbmQodCl9fWZ1bmN0aW9uIGgoKXtyZXR1cm4gS2Quc29tZShuLChmdW5jdGlvbihlKXtyZXR1cm4icHJlIj09PWV9KSl9cmV0dXJue2FzU3RyaW5nOmEuYXNTdHJpbmcsb3BlbjpvLGNsb3NlOmMsdGV4dDpzLHNlbGZDbG9zaW5nOmx9fSgpOkpkKCl9O3ZhciBaZD17ZGl2OiEwLHA6ITAsdWw6ITAsbGk6ITB9O2Z1bmN0aW9uIEpkKCl7dmFyIGU9W107ZnVuY3Rpb24gdChlKXtyZXR1cm4gS2QubWFwKGUsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIiAiK3QrJz0iJytmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKX0oZSkrJyInfSkpLmpvaW4oIiIpfXJldHVybnthc1N0cmluZzpmdW5jdGlvbigpe3JldHVybiBlLmpvaW4oIiIpfSxvcGVuOmZ1bmN0aW9uKG4scil7dmFyIGk9dChyKTtlLnB1c2goIjwiK24raSsiPiIpfSxjbG9zZTpmdW5jdGlvbih0KXtlLnB1c2goIjwvIit0KyI+Iil9LHRleHQ6ZnVuY3Rpb24odCl7ZS5wdXNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKX0odCkpfSxzZWxmQ2xvc2luZzpmdW5jdGlvbihuLHIpe3ZhciBpPXQocik7ZS5wdXNoKCI8IituK2krIiAvPiIpfSxfYXBwZW5kOmZ1bmN0aW9uKHQpe2UucHVzaCh0KX19fXZhciBRZD17fSxlaD1McjtmdW5jdGlvbiB0aChlKXtyZXR1cm4gbmgoZSxlKX1mdW5jdGlvbiBuaChlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybntzdGFydDplLGVuZDp0fX19ZnVuY3Rpb24gcmgoZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7cmV0dXJue3N0YXJ0Om4/IlxuIjoiIixlbmQ6bj8iIjoiXG4iLGxpc3Q6e2lzT3JkZXJlZDplLmlzT3JkZXJlZCxpbmRlbnQ6bj9uLmluZGVudCsxOjAsY291bnQ6MH19fX12YXIgaWg9e3A6bmgoIiIsIlxuXG4iKSxicjpuaCgiIiwiICBcbiIpLHVsOnJoKHtpc09yZGVyZWQ6ITF9KSxvbDpyaCh7aXNPcmRlcmVkOiEwfSksbGk6ZnVuY3Rpb24oZSx0LG4peyh0PXR8fHtpbmRlbnQ6MCxpc09yZGVyZWQ6ITEsY291bnQ6MH0pLmNvdW50Kyssbi5oYXNDbG9zZWQ9ITE7dmFyIHI9dC5pc09yZGVyZWQ/dC5jb3VudCsiLiI6Ii0iO3JldHVybntzdGFydDphaCgiXHQiLHQuaW5kZW50KStyKyIgIixlbmQ6ZnVuY3Rpb24oKXtpZighbi5oYXNDbG9zZWQpcmV0dXJuIG4uaGFzQ2xvc2VkPSEwLCJcbiJ9fX0sc3Ryb25nOnRoKCJfXyIpLGVtOnRoKCIqIiksYTpmdW5jdGlvbihlKXt2YXIgdD1lLmhyZWZ8fCIiO3JldHVybiB0P3tzdGFydDoiWyIsZW5kOiJdKCIrdCsiKSIsYW5jaG9yUG9zaXRpb246ImJlZm9yZSJ9Ont9fSxpbWc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zcmN8fCIiLG49ZS5hbHR8fCIiO3JldHVybiB0fHxuP3tzdGFydDoiIVsiK24rIl0oIit0KyIpIn06e319fTtmdW5jdGlvbiBhaChlLHQpe3JldHVybiBuZXcgQXJyYXkodCsxKS5qb2luKGUpfSFmdW5jdGlvbigpe2Zvcih2YXIgZT0xO2U8PTY7ZSsrKWloWyJoIitlXT1uaChhaCgiIyIsZSkrIiAiLCJcblxuIil9KCksUWQud3JpdGVyPWZ1bmN0aW9uKCl7dmFyIGU9W10sdD1bXSxuPW51bGwscj17fTtmdW5jdGlvbiBpKGksbyl7bz1vfHx7fTt2YXIgYz0oaWhbaV18fGZ1bmN0aW9uKCl7cmV0dXJue319KShvLG4scik7dC5wdXNoKHtlbmQ6Yy5lbmQsbGlzdDpufSksYy5saXN0JiYobj1jLmxpc3QpO3ZhciBzPSJiZWZvcmUiPT09Yy5hbmNob3JQb3NpdGlvbjtzJiZhKG8pLGUucHVzaChjLnN0YXJ0fHwiIiksc3x8YShvKX1mdW5jdGlvbiBhKHQpe3QuaWQmJmUucHVzaCgnPGEgaWQ9IicrdC5pZCsnIj48L2E+Jyl9ZnVuY3Rpb24gbyhyKXt2YXIgaT10LnBvcCgpO249aS5saXN0O3ZhciBhPWVoLmlzRnVuY3Rpb24oaS5lbmQpP2kuZW5kKCk6aS5lbmQ7ZS5wdXNoKGF8fCIiKX1yZXR1cm57YXNTdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gZS5qb2luKCIiKX0sb3BlbjppLGNsb3NlOm8sdGV4dDpmdW5jdGlvbih0KXtlLnB1c2goZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXFwvZywiXFxcXCIpLnJlcGxhY2UoLyhbXGBcKl9ce1x9XFtcXVwoXClcI1wrXC1cLlwhXSkvZywiXFwkMSIpfSh0KSl9LHNlbGZDbG9zaW5nOmZ1bmN0aW9uKGUsdCl7aShlLHQpLG8oKX19fTt2YXIgb2g9WWQsY2g9UWQ7JGQud3JpdGVyPWZ1bmN0aW9uKGUpe3JldHVybiJtYXJrZG93biI9PT0oZT1lfHx7fSkub3V0cHV0Rm9ybWF0P2NoLndyaXRlcigpOm9oLndyaXRlcihlKX07dmFyIHNoPUxyLGxoPW5pLHVoPWxvLGZoPUdkKCksZGg9Ym8saGg9WGQscGg9cWQoKSxnaD0kZDtmdW5jdGlvbiBtaChlLHQpe3ZhciBuPTEscj1bXSxpPVtdLGE9dm9pZCAwPT09KGU9c2guZXh0ZW5kKHtpZ25vcmVFbXB0eVBhcmFncmFwaHM6ITB9LGUpKS5pZFByZWZpeD8iIjplLmlkUHJlZml4LG89ZS5pZ25vcmVFbXB0eVBhcmFncmFwaHMsYz1maC50b3BMZXZlbEVsZW1lbnQoInAiKSxzPWUuc3R5bGVNYXB8fFtdO2Z1bmN0aW9uIGwoZSx0LG4pe3JldHVybiB2aChlLChmdW5jdGlvbihlKXtyZXR1cm4gdShlLHQsbil9KSl9ZnVuY3Rpb24gdShlLHQsbil7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIG5vdCBzZXQiKTt2YXIgcj13W2UudHlwZV07cmV0dXJuIHI/cihlLHQsbik6W119ZnVuY3Rpb24gZihlLHQpe3ZhciBuPWQoe3R5cGU6ZX0pO3JldHVybiBufHwodD9maC5lbGVtZW50KHQse30se2ZyZXNoOiExfSk6ZmguZW1wdHkpfWZ1bmN0aW9uIGQoZSx0KXt2YXIgbj1oKGUpO3JldHVybiBuP24udG86dH1mdW5jdGlvbiBoKGUpe2Zvcih2YXIgdD0wO3Q8cy5sZW5ndGg7dCsrKWlmKHNbdF0uZnJvbS5tYXRjaGVzKGUpKXJldHVybiBzW3RdfWZ1bmN0aW9uIHAoZSl7cmV0dXJuIG0oZS5ub3RlVHlwZSxlLm5vdGVJZCl9ZnVuY3Rpb24gZyhlKXtyZXR1cm4gYihlLm5vdGVUeXBlLGUubm90ZUlkKX1mdW5jdGlvbiBtKGUsdCl7cmV0dXJuIHkoZSsiLSIrdCl9ZnVuY3Rpb24gYihlLHQpe3JldHVybiB5KGUrIi1yZWYtIit0KX1mdW5jdGlvbiB5KGUpe3JldHVybiBhK2V9dmFyIHY9ZmguZWxlbWVudHMoW2ZoLmVsZW1lbnQoInRhYmxlIix7fSx7ZnJlc2g6ITB9KV0pO2Z1bmN0aW9uIHgoZSx0LG4pe3ZhciByPWUubGFiZWwsaT1lLmNvbW1lbnQsYT1sKGkuYm9keSx0LG4pLmNvbmNhdChbcGgubm9uRnJlc2hFbGVtZW50KCJwIix7fSxbcGgudGV4dCgiICIpLHBoLmZyZXNoRWxlbWVudCgiYSIse2hyZWY6IiMiK2IoImNvbW1lbnQiLGkuY29tbWVudElkKX0sW3BoLnRleHQoIuKGkSIpXSldKV0pO3JldHVybltwaC5mcmVzaEVsZW1lbnQoImR0Iix7aWQ6bSgiY29tbWVudCIsaS5jb21tZW50SWQpfSxbcGgudGV4dCgiQ29tbWVudCAiK3IpXSkscGguZnJlc2hFbGVtZW50KCJkZCIse30sYSldfXZhciBELFQsdz17ZG9jdW1lbnQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciBhPWwoZS5jaGlsZHJlbix0LG4pLG89bChyLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUubm90ZXMucmVzb2x2ZSh0KX0pKSx0LG4pO3JldHVybiBhLmNvbmNhdChbcGguZnJlc2hFbGVtZW50KCJvbCIse30sbykscGguZnJlc2hFbGVtZW50KCJkbCIse30sdmgoaSwoZnVuY3Rpb24oZSl7cmV0dXJuIHgoZSx0LG4pfSkpKV0pfSxwYXJhZ3JhcGg6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPWgoZSk7cmV0dXJuIG4/bi50bzooZS5zdHlsZUlkJiZ0LnB1c2goeWgoInBhcmFncmFwaCIsZSkpLGMpfShlLHQpLndyYXAoKGZ1bmN0aW9uKCl7dmFyIHI9bChlLmNoaWxkcmVuLHQsbik7cmV0dXJuIG8/cjpbcGguZm9yY2VXcml0ZV0uY29uY2F0KHIpfSkpfSxydW46ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWZ1bmN0aW9uKCl7cmV0dXJuIGwoZS5jaGlsZHJlbix0LG4pfSxpPVtdO2UuaXNTbWFsbENhcHMmJmkucHVzaChmKCJzbWFsbENhcHMiKSksZS5pc0FsbENhcHMmJmkucHVzaChmKCJhbGxDYXBzIikpLGUuaXNTdHJpa2V0aHJvdWdoJiZpLnB1c2goZigic3RyaWtldGhyb3VnaCIsInMiKSksZS5pc1VuZGVybGluZSYmaS5wdXNoKGYoInVuZGVybGluZSIpKSxlLnZlcnRpY2FsQWxpZ25tZW50PT09dWgudmVydGljYWxBbGlnbm1lbnQuc3Vic2NyaXB0JiZpLnB1c2goZmguZWxlbWVudCgic3ViIix7fSx7ZnJlc2g6ITF9KSksZS52ZXJ0aWNhbEFsaWdubWVudD09PXVoLnZlcnRpY2FsQWxpZ25tZW50LnN1cGVyc2NyaXB0JiZpLnB1c2goZmguZWxlbWVudCgic3VwIix7fSx7ZnJlc2g6ITF9KSksZS5pc0l0YWxpYyYmaS5wdXNoKGYoIml0YWxpYyIsImVtIikpLGUuaXNCb2xkJiZpLnB1c2goZigiYm9sZCIsInN0cm9uZyIpKTt2YXIgYT1maC5lbXB0eSxvPWgoZSk7cmV0dXJuIG8/YT1vLnRvOmUuc3R5bGVJZCYmdC5wdXNoKHloKCJydW4iLGUpKSxpLnB1c2goYSksaS5mb3JFYWNoKChmdW5jdGlvbihlKXtyPWUud3JhcC5iaW5kKGUscil9KSkscigpfSx0ZXh0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bcGgudGV4dChlLnZhbHVlKV19LHRhYjpmdW5jdGlvbihlLHQsbil7cmV0dXJuW3BoLnRleHQoIlx0IildfSxoeXBlcmxpbms6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXtocmVmOmUuYW5jaG9yPyIjIit5KGUuYW5jaG9yKTplLmhyZWZ9O251bGwhPWUudGFyZ2V0RnJhbWUmJihyLnRhcmdldD1lLnRhcmdldEZyYW1lKTt2YXIgaT1sKGUuY2hpbGRyZW4sdCxuKTtyZXR1cm5bcGgubm9uRnJlc2hFbGVtZW50KCJhIixyLGkpXX0sYm9va21hcmtTdGFydDpmdW5jdGlvbihlLHQsbil7cmV0dXJuW3BoLmZyZXNoRWxlbWVudCgiYSIse2lkOnkoZS5uYW1lKX0sW3BoLmZvcmNlV3JpdGVdKV19LG5vdGVSZWZlcmVuY2U6ZnVuY3Rpb24oZSx0LGkpe3IucHVzaChlKTt2YXIgYT1waC5mcmVzaEVsZW1lbnQoImEiLHtocmVmOiIjIitwKGUpLGlkOmcoZSl9LFtwaC50ZXh0KCJbIituKysrIl0iKV0pO3JldHVybltwaC5mcmVzaEVsZW1lbnQoInN1cCIse30sW2FdKV19LG5vdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWwoZS5ib2R5LHQsbiksaT1waC5lbGVtZW50V2l0aFRhZyhmaC5lbGVtZW50KCJwIix7fSx7ZnJlc2g6ITF9KSxbcGgudGV4dCgiICIpLHBoLmZyZXNoRWxlbWVudCgiYSIse2hyZWY6IiMiK2coZSl9LFtwaC50ZXh0KCLihpEiKV0pXSksYT1yLmNvbmNhdChbaV0pO3JldHVybiBwaC5mcmVzaEVsZW1lbnQoImxpIix7aWQ6cChlKX0sYSl9LGNvbW1lbnRSZWZlcmVuY2U6ZnVuY3Rpb24oZSxuLHIpe3JldHVybiBkKGUsZmguaWdub3JlKS53cmFwKChmdW5jdGlvbigpe3ZhciBuPXRbZS5jb21tZW50SWRdLHI9aS5sZW5ndGgrMSxhPSJbIitEaChuKStyKyJdIjtyZXR1cm4gaS5wdXNoKHtsYWJlbDphLGNvbW1lbnQ6bn0pLFtwaC5mcmVzaEVsZW1lbnQoImEiLHtocmVmOiIjIittKCJjb21tZW50IixlLmNvbW1lbnRJZCksaWQ6YigiY29tbWVudCIsZS5jb21tZW50SWQpfSxbcGgudGV4dChhKV0pXX0pKX0sY29tbWVudDp4LGltYWdlOihUPWUuY29udmVydEltYWdlfHxoaC5kYXRhVXJpLEQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbGguYXR0ZW1wdCgoZnVuY3Rpb24oKXtyZXR1cm4gVChlLHQpfSkpLmNhdWdodCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQucHVzaChkaC5lcnJvcihlKSksW119KSl9LGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5be3R5cGU6ImRlZmVycmVkIixpZDpiaCsrLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIEQoZSx0LG4pfX1dfSksdGFibGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBkKGUsdikud3JhcCgoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9c2guZmluZEluZGV4KGUuY2hpbGRyZW4sKGZ1bmN0aW9uKGUpe3JldHVybiFlLnR5cGU9PT11aC50eXBlcy50YWJsZVJvd3x8IWUuaXNIZWFkZXJ9KSk7LTE9PT1pJiYoaT1lLmNoaWxkcmVuLmxlbmd0aCk7aWYoMD09PWkpcj1sKGUuY2hpbGRyZW4sdCxzaC5leHRlbmQoe30sbix7aXNUYWJsZUhlYWRlcjohMX0pKTtlbHNle3ZhciBhPWwoZS5jaGlsZHJlbi5zbGljZSgwLGkpLHQsc2guZXh0ZW5kKHt9LG4se2lzVGFibGVIZWFkZXI6ITB9KSksbz1sKGUuY2hpbGRyZW4uc2xpY2UoaSksdCxzaC5leHRlbmQoe30sbix7aXNUYWJsZUhlYWRlcjohMX0pKTtyPVtwaC5mcmVzaEVsZW1lbnQoInRoZWFkIix7fSxhKSxwaC5mcmVzaEVsZW1lbnQoInRib2R5Iix7fSxvKV19cmV0dXJuW3BoLmZvcmNlV3JpdGVdLmNvbmNhdChyKX0oZSx0LG4pfSkpfSx0YWJsZVJvdzpmdW5jdGlvbihlLHQsbil7dmFyIHI9bChlLmNoaWxkcmVuLHQsbik7cmV0dXJuW3BoLmZyZXNoRWxlbWVudCgidHIiLHt9LFtwaC5mb3JjZVdyaXRlXS5jb25jYXQocikpXX0sdGFibGVDZWxsOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uLmlzVGFibGVIZWFkZXI/InRoIjoidGQiLGk9bChlLmNoaWxkcmVuLHQsbiksYT17fTtyZXR1cm4gMSE9PWUuY29sU3BhbiYmKGEuY29sc3Bhbj1lLmNvbFNwYW4udG9TdHJpbmcoKSksMSE9PWUucm93U3BhbiYmKGEucm93c3Bhbj1lLnJvd1NwYW4udG9TdHJpbmcoKSksW3BoLmZyZXNoRWxlbWVudChyLGEsW3BoLmZvcmNlV3JpdGVdLmNvbmNhdChpKSldfSxicmVhazpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWgoZSk7cmV0dXJuIHQ/dC50bzoibGluZSI9PT1lLmJyZWFrVHlwZT9maC50b3BMZXZlbEVsZW1lbnQoImJyIik6ZmguZW1wdHl9KGUpLndyYXAoKGZ1bmN0aW9uKCl7cmV0dXJuW119KSl9fTtyZXR1cm57Y29udmVydFRvSHRtbDpmdW5jdGlvbih0KXt2YXIgbj1bXSxyPXUodCxuLHt9KSxpPVtdO3hoKHIsKGZ1bmN0aW9uKGUpeyJkZWZlcnJlZCI9PT1lLnR5cGUmJmkucHVzaChlKX0pKTt2YXIgYT17fTtyZXR1cm4gbGgubWFwU2VyaWVzKGksKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlKCkudGhlbigoZnVuY3Rpb24odCl7YVtlLmlkXT10fSkpfSkpLnRoZW4oKGZ1bmN0aW9uKCl7dmFyIHQ9Z2gud3JpdGVyKHtwcmV0dHlQcmludDplLnByZXR0eVByaW50LG91dHB1dEZvcm1hdDplLm91dHB1dEZvcm1hdH0pO3JldHVybiBwaC53cml0ZSh0LHBoLnNpbXBsaWZ5KGZ1bmN0aW9uIGUodCl7cmV0dXJuIHZoKHQsKGZ1bmN0aW9uKHQpe3JldHVybiJkZWZlcnJlZCI9PT10LnR5cGU/YVt0LmlkXTp0LmNoaWxkcmVuP1tzaC5leHRlbmQoe30sdCx7Y2hpbGRyZW46ZSh0LmNoaWxkcmVuKX0pXTpbdF19KSl9KHIpKSksbmV3IGRoLlJlc3VsdCh0LmFzU3RyaW5nKCksbil9KSl9fX1MZC5Eb2N1bWVudENvbnZlcnRlcj1mdW5jdGlvbihlKXtyZXR1cm57Y29udmVydFRvSHRtbDpmdW5jdGlvbih0KXt2YXIgbj1zaC5pbmRleEJ5KHQudHlwZT09PXVoLnR5cGVzLmRvY3VtZW50P3QuY29tbWVudHM6W10sImNvbW1lbnRJZCIpO3JldHVybiBuZXcgbWgoZSxuKS5jb252ZXJ0VG9IdG1sKHQpfX19O3ZhciBiaD0xO2Z1bmN0aW9uIHloKGUsdCl7cmV0dXJuIGRoLndhcm5pbmcoIlVucmVjb2duaXNlZCAiK2UrIiBzdHlsZTogJyIrdC5zdHlsZU5hbWUrIicgKFN0eWxlIElEOiAiK3Quc3R5bGVJZCsiKSIpfWZ1bmN0aW9uIHZoKGUsdCl7cmV0dXJuIHNoLmZsYXR0ZW4oZS5tYXAodCksITApfWZ1bmN0aW9uIHhoKGUsdCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0KGUpLGUuY2hpbGRyZW4mJnhoKGUuY2hpbGRyZW4sdCl9KSl9dmFyIERoPUxkLmNvbW1lbnRBdXRob3JMYWJlbD1mdW5jdGlvbihlKXtyZXR1cm4gZS5hdXRob3JJbml0aWFsc3x8IiJ9LFRoPXt9LHdoPWxvO1RoLmNvbnZlcnRFbGVtZW50VG9SYXdUZXh0PWZ1bmN0aW9uIGUodCl7aWYoInRleHQiPT09dC50eXBlKXJldHVybiB0LnZhbHVlO2lmKHQudHlwZT09PXdoLnR5cGVzLnRhYilyZXR1cm4iXHQiO3ZhciBuPSJwYXJhZ3JhcGgiPT09dC50eXBlPyJcblxuIjoiIjtyZXR1cm4odC5jaGlsZHJlbnx8W10pLm1hcChlKS5qb2luKCIiKStufTt2YXIgX2g9e30sRWg9e30sVWg9e30sQWg9e30sa2g9e2dldCBleHBvcnRzKCl7cmV0dXJuIEFofSxzZXQgZXhwb3J0cyhlKXtBaD1lfX0uZXhwb3J0cz1mdW5jdGlvbihlLHQpe3RoaXMuX3Rva2Vucz1lLHRoaXMuX3N0YXJ0SW5kZXg9dHx8MH07a2gucHJvdG90eXBlLmhlYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG9rZW5zW3RoaXMuX3N0YXJ0SW5kZXhdfSxraC5wcm90b3R5cGUudGFpbD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IGtoKHRoaXMuX3Rva2Vucyx0aGlzLl9zdGFydEluZGV4KzEpfSxraC5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90b2tlbnMuc2xpY2UodGhpcy5fc3RhcnRJbmRleCl9LGtoLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG9rZW5zW3RoaXMuX3Rva2Vucy5sZW5ndGgtMV19LGtoLnByb3RvdHlwZS50bz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmhlYWQoKS5zb3VyY2Usbj1lLmhlYWQoKXx8ZS5lbmQoKTtyZXR1cm4gdC50byhuLnNvdXJjZSl9O3ZhciBTaD1BaDtVaC5QYXJzZXI9ZnVuY3Rpb24oZSl7cmV0dXJue3BhcnNlVG9rZW5zOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUobmV3IFNoKHQpKX19fTt2YXIgQ2g9e30sRmg9e307IWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/ZSgpOmV9ZS5ub25lPU9iamVjdC5jcmVhdGUoe3ZhbHVlOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYWxsZWQgdmFsdWUgb24gbm9uZSIpfSxpc05vbmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNTb21lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG1hcDpmdW5jdGlvbigpe3JldHVybiBlLm5vbmV9LGZsYXRNYXA6ZnVuY3Rpb24oKXtyZXR1cm4gZS5ub25lfSxmaWx0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gZS5ub25lfSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuW119LG9yRWxzZTp0LHZhbHVlT3JFbHNlOnR9KSxlLnNvbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBuKGUpfTt2YXIgbj1mdW5jdGlvbihlKXt0aGlzLl92YWx1ZT1lfTtuLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl92YWx1ZX0sbi5wcm90b3R5cGUuaXNOb25lPWZ1bmN0aW9uKCl7cmV0dXJuITF9LG4ucHJvdG90eXBlLmlzU29tZT1mdW5jdGlvbigpe3JldHVybiEwfSxuLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBuKGUodGhpcy5fdmFsdWUpKX0sbi5wcm90b3R5cGUuZmxhdE1hcD1mdW5jdGlvbihlKXtyZXR1cm4gZSh0aGlzLl92YWx1ZSl9LG4ucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdCh0aGlzLl92YWx1ZSk/dGhpczplLm5vbmV9LG4ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5fdmFsdWVdfSxuLnByb3RvdHlwZS5vckVsc2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXN9LG4ucHJvdG90eXBlLnZhbHVlT3JFbHNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl92YWx1ZX0sZS5pc09wdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdD09PWUubm9uZXx8dCBpbnN0YW5jZW9mIG59LGUuZnJvbU51bGxhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P2Uubm9uZTpuZXcgbih0KX19KEZoKTt2YXIgT2g9e2ZhaWx1cmU6ZnVuY3Rpb24oZSx0KXtpZihlLmxlbmd0aDwxKXRocm93IG5ldyBFcnJvcigiRmFpbHVyZSBtdXN0IGhhdmUgZXJyb3JzIik7cmV0dXJuIG5ldyBJaCh7c3RhdHVzOiJmYWlsdXJlIixyZW1haW5pbmc6dCxlcnJvcnM6ZX0pfSxlcnJvcjpmdW5jdGlvbihlLHQpe2lmKGUubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCJGYWlsdXJlIG11c3QgaGF2ZSBlcnJvcnMiKTtyZXR1cm4gbmV3IEloKHtzdGF0dXM6ImVycm9yIixyZW1haW5pbmc6dCxlcnJvcnM6ZX0pfSxzdWNjZXNzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbmV3IEloKHtzdGF0dXM6InN1Y2Nlc3MiLHZhbHVlOmUsc291cmNlOm4scmVtYWluaW5nOnQsZXJyb3JzOltdfSl9LGN1dDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEloKHtzdGF0dXM6ImN1dCIscmVtYWluaW5nOmUsZXJyb3JzOltdfSl9fSxJaD1mdW5jdGlvbihlKXt0aGlzLl92YWx1ZT1lLnZhbHVlLHRoaXMuX3N0YXR1cz1lLnN0YXR1cyx0aGlzLl9oYXNWYWx1ZT12b2lkIDAhPT1lLnZhbHVlLHRoaXMuX3JlbWFpbmluZz1lLnJlbWFpbmluZyx0aGlzLl9zb3VyY2U9ZS5zb3VyY2UsdGhpcy5fZXJyb3JzPWUuZXJyb3JzfTtJaC5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9oYXNWYWx1ZT9uZXcgSWgoe3ZhbHVlOmUodGhpcy5fdmFsdWUsdGhpcy5fc291cmNlKSxzdGF0dXM6dGhpcy5fc3RhdHVzLHJlbWFpbmluZzp0aGlzLl9yZW1haW5pbmcsc291cmNlOnRoaXMuX3NvdXJjZSxlcnJvcnM6dGhpcy5fZXJyb3JzfSk6dGhpc30sSWgucHJvdG90eXBlLmNoYW5nZVJlbWFpbmluZz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IEloKHt2YWx1ZTp0aGlzLl92YWx1ZSxzdGF0dXM6dGhpcy5fc3RhdHVzLHJlbWFpbmluZzplLHNvdXJjZTp0aGlzLl9zb3VyY2UsZXJyb3JzOnRoaXMuX2Vycm9yc30pfSxJaC5wcm90b3R5cGUuaXNTdWNjZXNzPWZ1bmN0aW9uKCl7cmV0dXJuInN1Y2Nlc3MiPT09dGhpcy5fc3RhdHVzfHwiY3V0Ij09PXRoaXMuX3N0YXR1c30sSWgucHJvdG90eXBlLmlzRmFpbHVyZT1mdW5jdGlvbigpe3JldHVybiJmYWlsdXJlIj09PXRoaXMuX3N0YXR1c30sSWgucHJvdG90eXBlLmlzRXJyb3I9ZnVuY3Rpb24oKXtyZXR1cm4iZXJyb3IiPT09dGhpcy5fc3RhdHVzfSxJaC5wcm90b3R5cGUuaXNDdXQ9ZnVuY3Rpb24oKXtyZXR1cm4iY3V0Ij09PXRoaXMuX3N0YXR1c30sSWgucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfSxJaC5wcm90b3R5cGUucmVtYWluaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbWFpbmluZ30sSWgucHJvdG90eXBlLnNvdXJjZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zb3VyY2V9LEloLnByb3RvdHlwZS5lcnJvcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXJyb3JzfTt2YXIgUmg9e2Vycm9yOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgTmgoZSl9fSxOaD1mdW5jdGlvbihlKXt0aGlzLmV4cGVjdGVkPWUuZXhwZWN0ZWQsdGhpcy5hY3R1YWw9ZS5hY3R1YWwsdGhpcy5fbG9jYXRpb249ZS5sb2NhdGlvbn07TmgucHJvdG90eXBlLmRlc2NyaWJlPWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuX2xvY2F0aW9uP3RoaXMuX2xvY2F0aW9uLmRlc2NyaWJlKCkrIjpcbiI6IiIpKyJFeHBlY3RlZCAiK3RoaXMuZXhwZWN0ZWQrIlxuYnV0IGdvdCAiK3RoaXMuYWN0dWFsfSxOaC5wcm90b3R5cGUubGluZU51bWJlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2NhdGlvbi5saW5lTnVtYmVyKCl9LE5oLnByb3RvdHlwZS5jaGFyYWN0ZXJOdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9jYXRpb24uY2hhcmFjdGVyTnVtYmVyKCl9O3ZhciBQaD17ZnJvbUFycmF5OmZ1bmN0aW9uKGUpe3ZhciB0PTAsbj1mdW5jdGlvbigpe3JldHVybiB0PGUubGVuZ3RofTtyZXR1cm4gbmV3IEJoKHtoYXNOZXh0Om4sbmV4dDpmdW5jdGlvbigpe2lmKG4oKSlyZXR1cm4gZVt0KytdO3Rocm93IG5ldyBFcnJvcigiTm8gbW9yZSBlbGVtZW50cyIpfX0pfX0sQmg9ZnVuY3Rpb24oZSl7dGhpcy5faXRlcmF0b3I9ZX07QmgucHJvdG90eXBlLm1hcD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pdGVyYXRvcjtyZXR1cm4gbmV3IEJoKHtoYXNOZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuaGFzTmV4dCgpfSxuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIGUodC5uZXh0KCkpfX0pfSxCaC5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5faXRlcmF0b3Iscj0hMSxpPSExLGE9ZnVuY3Rpb24oKXtpZighcilmb3Iocj0hMCxpPSExO24uaGFzTmV4dCgpJiYhaTspdD1uLm5leHQoKSxpPWUodCl9O3JldHVybiBuZXcgQmgoe2hhc05leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpLGl9LG5leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpLHI9ITEsdH19KX0sQmgucHJvdG90eXBlLmZpcnN0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5faXRlcmF0b3I7cmV0dXJuIHRoaXMuX2l0ZXJhdG9yLmhhc05leHQoKT9lLm5leHQoKTpudWxsfSxCaC5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXTt0aGlzLl9pdGVyYXRvci5oYXNOZXh0KCk7KWUucHVzaCh0aGlzLl9pdGVyYXRvci5uZXh0KCkpO3JldHVybiBlfSxmdW5jdGlvbihlKXt2YXIgdD1McixuPUZoLHI9T2gsaT1SaCxhPVBoO2UudG9rZW49ZnVuY3Rpb24oZSx0KXt2YXIgbj12b2lkIDAhPT10O3JldHVybiBmdW5jdGlvbihpKXt2YXIgYT1pLmhlYWQoKTtyZXR1cm4hYXx8YS5uYW1lIT09ZXx8biYmYS52YWx1ZSE9PXQ/ZihpLHUoe25hbWU6ZSx2YWx1ZTp0fSkpOnIuc3VjY2VzcyhhLnZhbHVlLGkudGFpbCgpLGEuc291cmNlKX19LGUudG9rZW5PZlR5cGU9ZnVuY3Rpb24odCl7cmV0dXJuIGUudG9rZW4odCl9LGUuZmlyc3RPZj1mdW5jdGlvbihlLG4pe3JldHVybiB0LmlzQXJyYXkobil8fChuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSksZnVuY3Rpb24odCl7cmV0dXJuIGEuZnJvbUFycmF5KG4pLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KSkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5pc1N1Y2Nlc3MoKXx8ZS5pc0Vycm9yKCl9KSkuZmlyc3QoKXx8Zih0LGUpfX0sZS50aGVuPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciByPWUobik7cmV0dXJuIHIubWFwfHxjb25zb2xlLmxvZyhyKSxyLm1hcCh0KX19LGUuc2VxdWVuY2U9ZnVuY3Rpb24oKXt2YXIgbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCksaT1mdW5jdGlvbihpKXt2YXIgYT10LmZvbGRsKG4sKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5yZXN1bHQsYT1lLmhhc0N1dDtpZighbi5pc1N1Y2Nlc3MoKSlyZXR1cm57cmVzdWx0Om4saGFzQ3V0OmF9O3ZhciBvPXQobi5yZW1haW5pbmcoKSk7aWYoby5pc0N1dCgpKXJldHVybntyZXN1bHQ6bixoYXNDdXQ6ITB9O2lmKG8uaXNTdWNjZXNzKCkpe3ZhciBjO2M9dC5pc0NhcHR1cmVkP24udmFsdWUoKS53aXRoVmFsdWUodCxvLnZhbHVlKCkpOm4udmFsdWUoKTt2YXIgcz1vLnJlbWFpbmluZygpLGw9aS50byhzKTtyZXR1cm57cmVzdWx0OnIuc3VjY2VzcyhjLHMsbCksaGFzQ3V0OmF9fXJldHVybiBhP3tyZXN1bHQ6ci5lcnJvcihvLmVycm9ycygpLG8ucmVtYWluaW5nKCkpLGhhc0N1dDphfTp7cmVzdWx0Om8saGFzQ3V0OmF9fSkse3Jlc3VsdDpyLnN1Y2Nlc3MobmV3IG8saSksaGFzQ3V0OiExfSkucmVzdWx0LGM9aS50byhhLnJlbWFpbmluZygpKTtyZXR1cm4gYS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LndpdGhWYWx1ZShlLnNlcXVlbmNlLnNvdXJjZSxjKX0pKX07ZnVuY3Rpb24gYShlKXtyZXR1cm4gZS5pc0NhcHR1cmVkfXJldHVybiBpLmhlYWQ9ZnVuY3Rpb24oKXt2YXIgcj10LmZpbmQobixhKTtyZXR1cm4gZS50aGVuKGksZS5zZXF1ZW5jZS5leHRyYWN0KHIpKX0saS5tYXA9ZnVuY3Rpb24odCl7cmV0dXJuIGUudGhlbihpLChmdW5jdGlvbihlKXtyZXR1cm4gdC5hcHBseSh0aGlzLGUudG9BcnJheSgpKX0pKX0saX07dmFyIG89ZnVuY3Rpb24oZSx0KXt0aGlzLl92YWx1ZXM9ZXx8e30sdGhpcy5fdmFsdWVzQXJyYXk9dHx8W119O28ucHJvdG90eXBlLndpdGhWYWx1ZT1mdW5jdGlvbihlLG4pe2lmKGUuY2FwdHVyZU5hbWUmJmUuY2FwdHVyZU5hbWUgaW4gdGhpcy5fdmFsdWVzKXRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBzZWNvbmQgdmFsdWUgZm9yIGNhcHR1cmUgIicrZS5jYXB0dXJlTmFtZSsnIicpO3ZhciByPXQuY2xvbmUodGhpcy5fdmFsdWVzKTtyW2UuY2FwdHVyZU5hbWVdPW47dmFyIGk9dGhpcy5fdmFsdWVzQXJyYXkuY29uY2F0KFtuXSk7cmV0dXJuIG5ldyBvKHIsaSl9LG8ucHJvdG90eXBlLmdldD1mdW5jdGlvbihlKXtpZihlLmNhcHR1cmVOYW1lIGluIHRoaXMuX3ZhbHVlcylyZXR1cm4gdGhpcy5fdmFsdWVzW2UuY2FwdHVyZU5hbWVdO3Rocm93IG5ldyBFcnJvcignTm8gdmFsdWUgZm9yIGNhcHR1cmUgIicrZS5jYXB0dXJlTmFtZSsnIicpfSxvLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZhbHVlc0FycmF5fSxlLnNlcXVlbmNlLmNhcHR1cmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07cmV0dXJuIG4uY2FwdHVyZU5hbWU9dCxuLmlzQ2FwdHVyZWQ9ITAsbn0sZS5zZXF1ZW5jZS5leHRyYWN0PWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXQoZSl9fSxlLnNlcXVlbmNlLmFwcGx5VmFsdWVzPWZ1bmN0aW9uKGUpe3ZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIHI9dC5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBuLmdldChlKX0pKTtyZXR1cm4gZS5hcHBseSh0aGlzLHIpfX0sZS5zZXF1ZW5jZS5zb3VyY2U9e2NhcHR1cmVOYW1lOiLimINzb3VyY2XimIMifSxlLnNlcXVlbmNlLmN1dD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gci5jdXQoZSl9fSxlLm9wdGlvbmFsPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgaT1lKHQpO3JldHVybiBpLmlzU3VjY2VzcygpP2kubWFwKG4uc29tZSk6aS5pc0ZhaWx1cmUoKT9yLnN1Y2Nlc3Mobi5ub25lLHQpOml9fSxlLnplcm9Pck1vcmVXaXRoU2VwYXJhdG9yPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGwoZSx0LCExKX0sZS5vbmVPck1vcmVXaXRoU2VwYXJhdG9yPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGwoZSx0LCEwKX07dmFyIGM9ZS56ZXJvT3JNb3JlPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIG4saT1bXTsobj1lKHQpKSYmbi5pc1N1Y2Nlc3MoKTspdD1uLnJlbWFpbmluZygpLGkucHVzaChuLnZhbHVlKCkpO3JldHVybiBuLmlzRXJyb3IoKT9uOnIuc3VjY2VzcyhpLHQpfX07ZnVuY3Rpb24gcyhlKXtyZXR1cm4gci5zdWNjZXNzKG51bGwsZSl9ZS5vbmVPck1vcmU9ZnVuY3Rpb24odCl7cmV0dXJuIGUub25lT3JNb3JlV2l0aFNlcGFyYXRvcih0LHMpfTt2YXIgbD1mdW5jdGlvbih0LG4saSl7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBvPXQoYSk7aWYoby5pc1N1Y2Nlc3MoKSl7dmFyIHM9ZS5zZXF1ZW5jZS5jYXB0dXJlKHQsIm1haW4iKSxsPWMoZS50aGVuKGUuc2VxdWVuY2UobixzKSxlLnNlcXVlbmNlLmV4dHJhY3QocykpKShvLnJlbWFpbmluZygpKTtyZXR1cm4gci5zdWNjZXNzKFtvLnZhbHVlKCldLmNvbmNhdChsLnZhbHVlKCkpLGwucmVtYWluaW5nKCkpfXJldHVybiBpfHxvLmlzRXJyb3IoKT9vOnIuc3VjY2VzcyhbXSxhKX19O2UubGVmdEFzc29jaWF0aXZlPWZ1bmN0aW9uKHQsbixpKXt2YXIgYTthPShhPWk/W3tmdW5jOmkscnVsZTpufV06bikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZS50aGVuKHQucnVsZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4scil7cmV0dXJuIHQuZnVuYyhuLGUscil9fSkpfSkpO3ZhciBvPWUuZmlyc3RPZi5hcHBseShudWxsLFsicnVsZXMiXS5jb25jYXQoYSkpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1lLGk9dChlKTtpZighaS5pc1N1Y2Nlc3MoKSlyZXR1cm4gaTtmb3IodmFyIGE9byhpLnJlbWFpbmluZygpKTthLmlzU3VjY2VzcygpOyl7dmFyIGM9YS5yZW1haW5pbmcoKSxzPW4udG8oYS5yZW1haW5pbmcoKSksbD1hLnZhbHVlKCk7aT1yLnN1Y2Nlc3MobChpLnZhbHVlKCkscyksYyxzKSxhPW8oaS5yZW1haW5pbmcoKSl9cmV0dXJuIGEuaXNFcnJvcigpP2E6aX19LGUubGVmdEFzc29jaWF0aXZlLmZpcnN0T2Y9ZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApfSxlLm5vbkNvbnN1bWluZz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUodCkuY2hhbmdlUmVtYWluaW5nKHQpfX07dmFyIHU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWU/ZS5uYW1lKycgIicrZS52YWx1ZSsnIic6ZS5uYW1lfTtmdW5jdGlvbiBmKGUsdCl7dmFyIG4sYT1lLmhlYWQoKTtyZXR1cm4gbj1hP2kuZXJyb3Ioe2V4cGVjdGVkOnQsYWN0dWFsOnUoYSksbG9jYXRpb246YS5zb3VyY2V9KTppLmVycm9yKHtleHBlY3RlZDp0LGFjdHVhbDoiZW5kIG9mIHRva2VucyJ9KSxyLmZhaWx1cmUoW25dLGUpfX0oQ2gpO3ZhciBXaCxMaD17fSxNaD17Z2V0IGV4cG9ydHMoKXtyZXR1cm4gTGh9LHNldCBleHBvcnRzKGUpe0xoPWV9fTtXaD0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihlLHQpe2Uuc3VwZXJfPXQsZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSl9OmZ1bmN0aW9uKGUsdCl7ZS5zdXBlcl89dDt2YXIgbj1mdW5jdGlvbigpe307bi5wcm90b3R5cGU9dC5wcm90b3R5cGUsZS5wcm90b3R5cGU9bmV3IG4sZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZX07dmFyIGpoPVdoLHpoPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfHxmdW5jdGlvbihlKXtmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj17fSxyPTA7cjx0Lmxlbmd0aDtyKyspblt0W3JdXT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdFtyXSk7cmV0dXJuIG59LEhoPS8lW3NkaiVdL2c7ZnVuY3Rpb24gVmgoZSl7aWYoIW9wKGUpKXtmb3IodmFyIHQ9W10sbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspdC5wdXNoKFloKGFyZ3VtZW50c1tuXSkpO3JldHVybiB0LmpvaW4oIiAiKX1uPTE7Zm9yKHZhciByPWFyZ3VtZW50cyxpPXIubGVuZ3RoLGE9U3RyaW5nKGUpLnJlcGxhY2UoSGgsKGZ1bmN0aW9uKGUpe2lmKCIlJSI9PT1lKXJldHVybiIlIjtpZihuPj1pKXJldHVybiBlO3N3aXRjaChlKXtjYXNlIiVzIjpyZXR1cm4gU3RyaW5nKHJbbisrXSk7Y2FzZSIlZCI6cmV0dXJuIE51bWJlcihyW24rK10pO2Nhc2UiJWoiOnRyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkocltuKytdKX1jYXRjaChlKXtyZXR1cm4iW0NpcmN1bGFyXSJ9ZGVmYXVsdDpyZXR1cm4gZX19KSksbz1yW25dO248aTtvPXJbKytuXSlycChvKXx8IXVwKG8pP2ErPSIgIitvOmErPSIgIitZaChvKTtyZXR1cm4gYX1mdW5jdGlvbiBxaCh0LG4pe2lmKHNwKGUucHJvY2VzcykpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHFoKHQsbikuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtpZighMD09PVNpLm5vRGVwcmVjYXRpb24pcmV0dXJuIHQ7dmFyIHI9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIXIpe2lmKFNpLnRocm93RGVwcmVjYXRpb24pdGhyb3cgbmV3IEVycm9yKG4pO1NpLnRyYWNlRGVwcmVjYXRpb24/Y29uc29sZS50cmFjZShuKTpjb25zb2xlLmVycm9yKG4pLHI9ITB9cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX12YXIgR2gsWGg9e307ZnVuY3Rpb24gJGgoZSl7aWYoc3AoR2gpJiYoR2g9U2kuZW52Lk5PREVfREVCVUd8fCIiKSxlPWUudG9VcHBlckNhc2UoKSwhWGhbZV0paWYobmV3IFJlZ0V4cCgiXFxiIitlKyJcXGIiLCJpIikudGVzdChHaCkpe1hoW2VdPWZ1bmN0aW9uKCl7dmFyIHQ9VmguYXBwbHkobnVsbCxhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoIiVzICVkOiAlcyIsZSwwLHQpfX1lbHNlIFhoW2VdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gWGhbZV19ZnVuY3Rpb24gWWgoZSx0KXt2YXIgbj17c2VlbjpbXSxzdHlsaXplOlpofTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKG4uZGVwdGg9YXJndW1lbnRzWzJdKSxhcmd1bWVudHMubGVuZ3RoPj00JiYobi5jb2xvcnM9YXJndW1lbnRzWzNdKSxucCh0KT9uLnNob3dIaWRkZW49dDp0JiZ4cChuLHQpLHNwKG4uc2hvd0hpZGRlbikmJihuLnNob3dIaWRkZW49ITEpLHNwKG4uZGVwdGgpJiYobi5kZXB0aD0yKSxzcChuLmNvbG9ycykmJihuLmNvbG9ycz0hMSksc3Aobi5jdXN0b21JbnNwZWN0KSYmKG4uY3VzdG9tSW5zcGVjdD0hMCksbi5jb2xvcnMmJihuLnN0eWxpemU9S2gpLEpoKG4sZSxuLmRlcHRoKX1mdW5jdGlvbiBLaChlLHQpe3ZhciBuPVloLnN0eWxlc1t0XTtyZXR1cm4gbj8iG1siK1loLmNvbG9yc1tuXVswXSsibSIrZSsiG1siK1loLmNvbG9yc1tuXVsxXSsibSI6ZX1mdW5jdGlvbiBaaChlLHQpe3JldHVybiBlfWZ1bmN0aW9uIEpoKGUsdCxuKXtpZihlLmN1c3RvbUluc3BlY3QmJnQmJmhwKHQuaW5zcGVjdCkmJnQuaW5zcGVjdCE9PVloJiYoIXQuY29uc3RydWN0b3J8fHQuY29uc3RydWN0b3IucHJvdG90eXBlIT09dCkpe3ZhciByPXQuaW5zcGVjdChuLGUpO3JldHVybiBvcChyKXx8KHI9SmgoZSxyLG4pKSxyfXZhciBpPWZ1bmN0aW9uKGUsdCl7aWYoc3AodCkpcmV0dXJuIGUuc3R5bGl6ZSgidW5kZWZpbmVkIiwidW5kZWZpbmVkIik7aWYob3AodCkpe3ZhciBuPSInIitKU09OLnN0cmluZ2lmeSh0KS5yZXBsYWNlKC9eInwiJC9nLCIiKS5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykrIiciO3JldHVybiBlLnN0eWxpemUobiwic3RyaW5nIil9aWYoYXAodCkpcmV0dXJuIGUuc3R5bGl6ZSgiIit0LCJudW1iZXIiKTtpZihucCh0KSlyZXR1cm4gZS5zdHlsaXplKCIiK3QsImJvb2xlYW4iKTtpZihycCh0KSlyZXR1cm4gZS5zdHlsaXplKCJudWxsIiwibnVsbCIpfShlLHQpO2lmKGkpcmV0dXJuIGk7dmFyIGE9T2JqZWN0LmtleXModCksbz1mdW5jdGlvbihlKXt2YXIgdD17fTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlLG4pe3RbZV09ITB9KSksdH0oYSk7aWYoZS5zaG93SGlkZGVuJiYoYT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KSksZHAodCkmJihhLmluZGV4T2YoIm1lc3NhZ2UiKT49MHx8YS5pbmRleE9mKCJkZXNjcmlwdGlvbiIpPj0wKSlyZXR1cm4gUWgodCk7aWYoMD09PWEubGVuZ3RoKXtpZihocCh0KSl7dmFyIGM9dC5uYW1lPyI6ICIrdC5uYW1lOiIiO3JldHVybiBlLnN0eWxpemUoIltGdW5jdGlvbiIrYysiXSIsInNwZWNpYWwiKX1pZihscCh0KSlyZXR1cm4gZS5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSwicmVnZXhwIik7aWYoZnAodCkpcmV0dXJuIGUuc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLCJkYXRlIik7aWYoZHAodCkpcmV0dXJuIFFoKHQpfXZhciBzLGw9IiIsdT0hMSxmPVsieyIsIn0iXTsodHAodCkmJih1PSEwLGY9WyJbIiwiXSJdKSxocCh0KSkmJihsPSIgW0Z1bmN0aW9uIisodC5uYW1lPyI6ICIrdC5uYW1lOiIiKSsiXSIpO3JldHVybiBscCh0KSYmKGw9IiAiK1JlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSksZnAodCkmJihsPSIgIitEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHQpKSxkcCh0KSYmKGw9IiAiK1FoKHQpKSwwIT09YS5sZW5ndGh8fHUmJjAhPXQubGVuZ3RoP248MD9scCh0KT9lLnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLCJyZWdleHAiKTplLnN0eWxpemUoIltPYmplY3RdIiwic3BlY2lhbCIpOihlLnNlZW4ucHVzaCh0KSxzPXU/ZnVuY3Rpb24oZSx0LG4scixpKXtmb3IodmFyIGE9W10sbz0wLGM9dC5sZW5ndGg7bzxjOysrbylEcCh0LFN0cmluZyhvKSk/YS5wdXNoKGVwKGUsdCxuLHIsU3RyaW5nKG8pLCEwKSk6YS5wdXNoKCIiKTtyZXR1cm4gaS5mb3JFYWNoKChmdW5jdGlvbihpKXtpLm1hdGNoKC9eXGQrJC8pfHxhLnB1c2goZXAoZSx0LG4scixpLCEwKSl9KSksYX0oZSx0LG4sbyxhKTphLm1hcCgoZnVuY3Rpb24ocil7cmV0dXJuIGVwKGUsdCxuLG8scix1KX0pKSxlLnNlZW4ucG9wKCksZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUucmVkdWNlKChmdW5jdGlvbihlLHQpe3JldHVybiB0LmluZGV4T2YoIlxuIiksZSt0LnJlcGxhY2UoL1x1MDAxYlxbXGRcZD9tL2csIiIpLmxlbmd0aCsxfSksMCk7aWYocj42MClyZXR1cm4gblswXSsoIiI9PT10PyIiOnQrIlxuICIpKyIgIitlLmpvaW4oIixcbiAgIikrIiAiK25bMV07cmV0dXJuIG5bMF0rdCsiICIrZS5qb2luKCIsICIpKyIgIituWzFdfShzLGwsZikpOmZbMF0rbCtmWzFdfWZ1bmN0aW9uIFFoKGUpe3JldHVybiJbIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSsiXSJ9ZnVuY3Rpb24gZXAoZSx0LG4scixpLGEpe3ZhciBvLGMscztpZigocz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsaSl8fHt2YWx1ZTp0W2ldfSkuZ2V0P2M9cy5zZXQ/ZS5zdHlsaXplKCJbR2V0dGVyL1NldHRlcl0iLCJzcGVjaWFsIik6ZS5zdHlsaXplKCJbR2V0dGVyXSIsInNwZWNpYWwiKTpzLnNldCYmKGM9ZS5zdHlsaXplKCJbU2V0dGVyXSIsInNwZWNpYWwiKSksRHAocixpKXx8KG89IlsiK2krIl0iKSxjfHwoZS5zZWVuLmluZGV4T2Yocy52YWx1ZSk8MD8oYz1ycChuKT9KaChlLHMudmFsdWUsbnVsbCk6SmgoZSxzLnZhbHVlLG4tMSkpLmluZGV4T2YoIlxuIik+LTEmJihjPWE/Yy5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiIgICIrZX0pKS5qb2luKCJcbiIpLnN1YnN0cigyKToiXG4iK2Muc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4iICAgIitlfSkpLmpvaW4oIlxuIikpOmM9ZS5zdHlsaXplKCJbQ2lyY3VsYXJdIiwic3BlY2lhbCIpKSxzcChvKSl7aWYoYSYmaS5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gYzsobz1KU09OLnN0cmluZ2lmeSgiIitpKSkubWF0Y2goL14iKFthLXpBLVpfXVthLXpBLVpfMC05XSopIiQvKT8obz1vLnN1YnN0cigxLG8ubGVuZ3RoLTIpLG89ZS5zdHlsaXplKG8sIm5hbWUiKSk6KG89by5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykucmVwbGFjZSgvKF4ifCIkKS9nLCInIiksbz1lLnN0eWxpemUobywic3RyaW5nIikpfXJldHVybiBvKyI6ICIrY31mdW5jdGlvbiB0cChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKX1mdW5jdGlvbiBucChlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIHJwKGUpe3JldHVybiBudWxsPT09ZX1mdW5jdGlvbiBpcChlKXtyZXR1cm4gbnVsbD09ZX1mdW5jdGlvbiBhcChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9ZnVuY3Rpb24gb3AoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfWZ1bmN0aW9uIGNwKGUpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgZX1mdW5jdGlvbiBzcChlKXtyZXR1cm4gdm9pZCAwPT09ZX1mdW5jdGlvbiBscChlKXtyZXR1cm4gdXAoZSkmJiJbb2JqZWN0IFJlZ0V4cF0iPT09bXAoZSl9ZnVuY3Rpb24gdXAoZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZX1mdW5jdGlvbiBmcChlKXtyZXR1cm4gdXAoZSkmJiJbb2JqZWN0IERhdGVdIj09PW1wKGUpfWZ1bmN0aW9uIGRwKGUpe3JldHVybiB1cChlKSYmKCJbb2JqZWN0IEVycm9yXSI9PT1tcChlKXx8ZSBpbnN0YW5jZW9mIEVycm9yKX1mdW5jdGlvbiBocChlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiBwcChlKXtyZXR1cm4gbnVsbD09PWV8fCJib29sZWFuIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN0cmluZyI9PXR5cGVvZiBlfHwic3ltYm9sIj09dHlwZW9mIGV8fHZvaWQgMD09PWV9ZnVuY3Rpb24gZ3AoZSl7cmV0dXJuIHAuaXNCdWZmZXIoZSl9ZnVuY3Rpb24gbXAoZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBicChlKXtyZXR1cm4gZTwxMD8iMCIrZS50b1N0cmluZygxMCk6ZS50b1N0cmluZygxMCl9WWguY29sb3JzPXtib2xkOlsxLDIyXSxpdGFsaWM6WzMsMjNdLHVuZGVybGluZTpbNCwyNF0saW52ZXJzZTpbNywyN10sd2hpdGU6WzM3LDM5XSxncmV5Ols5MCwzOV0sYmxhY2s6WzMwLDM5XSxibHVlOlszNCwzOV0sY3lhbjpbMzYsMzldLGdyZWVuOlszMiwzOV0sbWFnZW50YTpbMzUsMzldLHJlZDpbMzEsMzldLHllbGxvdzpbMzMsMzldfSxZaC5zdHlsZXM9e3NwZWNpYWw6ImN5YW4iLG51bWJlcjoieWVsbG93Iixib29sZWFuOiJ5ZWxsb3ciLHVuZGVmaW5lZDoiZ3JleSIsbnVsbDoiYm9sZCIsc3RyaW5nOiJncmVlbiIsZGF0ZToibWFnZW50YSIscmVnZXhwOiJyZWQifTt2YXIgeXA9WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXTtmdW5jdGlvbiB2cCgpe3ZhciBlLHQ7Y29uc29sZS5sb2coIiVzIC0gJXMiLChlPW5ldyBEYXRlLHQ9W2JwKGUuZ2V0SG91cnMoKSksYnAoZS5nZXRNaW51dGVzKCkpLGJwKGUuZ2V0U2Vjb25kcygpKV0uam9pbigiOiIpLFtlLmdldERhdGUoKSx5cFtlLmdldE1vbnRoKCldLHRdLmpvaW4oIiAiKSksVmguYXBwbHkobnVsbCxhcmd1bWVudHMpKX1mdW5jdGlvbiB4cChlLHQpe2lmKCF0fHwhdXAodCkpcmV0dXJuIGU7Zm9yKHZhciBuPU9iamVjdC5rZXlzKHQpLHI9bi5sZW5ndGg7ci0tOyllW25bcl1dPXRbbltyXV07cmV0dXJuIGV9ZnVuY3Rpb24gRHAoZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9dmFyIFRwPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sP1N5bWJvbCgidXRpbC5wcm9taXNpZnkuY3VzdG9tIik6dm9pZCAwO2Z1bmN0aW9uIHdwKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAib3JpZ2luYWwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbicpO2lmKFRwJiZlW1RwXSl7dmFyIHQ7aWYoImZ1bmN0aW9uIiE9dHlwZW9mKHQ9ZVtUcF0pKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAidXRpbC5wcm9taXNpZnkuY3VzdG9tIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24nKTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsVHAse3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMSxjb25maWd1cmFibGU6ITB9KSx0fWZ1bmN0aW9uIHQoKXtmb3IodmFyIHQsbixyPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLHIpe3Q9ZSxuPXJ9KSksaT1bXSxhPTA7YTxhcmd1bWVudHMubGVuZ3RoO2ErKylpLnB1c2goYXJndW1lbnRzW2FdKTtpLnB1c2goKGZ1bmN0aW9uKGUscil7ZT9uKGUpOnQocil9KSk7dHJ5e2UuYXBwbHkodGhpcyxpKX1jYXRjaChlKXtuKGUpfXJldHVybiByfXJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YodCxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpLFRwJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxUcCx7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsemgoZSkpfWZ1bmN0aW9uIF9wKGUsdCl7aWYoIWUpe3ZhciBuPW5ldyBFcnJvcigiUHJvbWlzZSB3YXMgcmVqZWN0ZWQgd2l0aCBhIGZhbHN5IHZhbHVlIik7bi5yZWFzb249ZSxlPW59cmV0dXJuIHQoZSl9ZnVuY3Rpb24gRXAoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJvcmlnaW5hbCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uJyk7ZnVuY3Rpb24gdCgpe2Zvcih2YXIgdD1bXSxuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LnB1c2goYXJndW1lbnRzW25dKTt2YXIgcj10LnBvcCgpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBsYXN0IGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbiIpO3ZhciBpPXRoaXMsYT1mdW5jdGlvbigpe3JldHVybiByLmFwcGx5KGksYXJndW1lbnRzKX07ZS5hcHBseSh0aGlzLHQpLnRoZW4oKGZ1bmN0aW9uKGUpe1NpLm5leHRUaWNrKGEuYmluZChudWxsLG51bGwsZSkpfSksKGZ1bmN0aW9uKGUpe1NpLm5leHRUaWNrKF9wLmJpbmQobnVsbCxlLGEpKX0pKX1yZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKHQsT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LHpoKGUpKSx0fXdwLmN1c3RvbT1UcDt2YXIgVXA9e2luaGVyaXRzOmpoLF9leHRlbmQ6eHAsbG9nOnZwLGlzQnVmZmVyOmdwLGlzUHJpbWl0aXZlOnBwLGlzRnVuY3Rpb246aHAsaXNFcnJvcjpkcCxpc0RhdGU6ZnAsaXNPYmplY3Q6dXAsaXNSZWdFeHA6bHAsaXNVbmRlZmluZWQ6c3AsaXNTeW1ib2w6Y3AsaXNTdHJpbmc6b3AsaXNOdW1iZXI6YXAsaXNOdWxsT3JVbmRlZmluZWQ6aXAsaXNOdWxsOnJwLGlzQm9vbGVhbjpucCxpc0FycmF5OnRwLGluc3BlY3Q6WWgsZGVwcmVjYXRlOnFoLGZvcm1hdDpWaCxkZWJ1Z2xvZzokaCxwcm9taXNpZnk6d3AsY2FsbGJhY2tpZnk6RXB9LEFwPWVlKE9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGZvcm1hdDpWaCxkZXByZWNhdGU6cWgsZGVidWdsb2c6JGgsaW5zcGVjdDpZaCxpc0FycmF5OnRwLGlzQm9vbGVhbjpucCxpc051bGw6cnAsaXNOdWxsT3JVbmRlZmluZWQ6aXAsaXNOdW1iZXI6YXAsaXNTdHJpbmc6b3AsaXNTeW1ib2w6Y3AsaXNVbmRlZmluZWQ6c3AsaXNSZWdFeHA6bHAsaXNPYmplY3Q6dXAsaXNEYXRlOmZwLGlzRXJyb3I6ZHAsaXNGdW5jdGlvbjpocCxpc1ByaW1pdGl2ZTpwcCxpc0J1ZmZlcjpncCxsb2c6dnAsaW5oZXJpdHM6amgsX2V4dGVuZDp4cCxwcm9taXNpZnk6d3AsY2FsbGJhY2tpZnk6RXAsZGVmYXVsdDpVcH0pKTtNaC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJue2FzU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIGV9LHJhbmdlOmZ1bmN0aW9uKG4scil7cmV0dXJuIG5ldyBrcChlLHQsbixyKX19fTt2YXIga3A9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5fc3RyaW5nPWUsdGhpcy5fZGVzY3JpcHRpb249dCx0aGlzLl9zdGFydEluZGV4PW4sdGhpcy5fZW5kSW5kZXg9cn07a3AucHJvdG90eXBlLnRvPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcga3AodGhpcy5fc3RyaW5nLHRoaXMuX2Rlc2NyaXB0aW9uLHRoaXMuX3N0YXJ0SW5kZXgsZS5fZW5kSW5kZXgpfSxrcC5wcm90b3R5cGUuZGVzY3JpYmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9wb3NpdGlvbigpLHQ9dGhpcy5fZGVzY3JpcHRpb24/dGhpcy5fZGVzY3JpcHRpb24rIlxuIjoiIjtyZXR1cm4gQXAuZm9ybWF0KCIlc0xpbmUgbnVtYmVyOiAlc1xuQ2hhcmFjdGVyIG51bWJlcjogJXMiLHQsZS5saW5lTnVtYmVyLGUuY2hhcmFjdGVyTnVtYmVyKX0sa3AucHJvdG90eXBlLmxpbmVOdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9zaXRpb24oKS5saW5lTnVtYmVyfSxrcC5wcm90b3R5cGUuY2hhcmFjdGVyTnVtYmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uKCkuY2hhcmFjdGVyTnVtYmVyfSxrcC5wcm90b3R5cGUuX3Bvc2l0aW9uPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMsdD0wLG49ZnVuY3Rpb24oKXtyZXR1cm4gZS5fc3RyaW5nLmluZGV4T2YoIlxuIix0KX0scj0xOy0xIT09bigpJiZuKCk8dGhpcy5fc3RhcnRJbmRleDspdD1uKCkrMSxyKz0xO3JldHVybntsaW5lTnVtYmVyOnIsY2hhcmFjdGVyTnVtYmVyOnRoaXMuX3N0YXJ0SW5kZXgtdCsxfX07dmFyIFNwPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLm5hbWU9ZSx0aGlzLnZhbHVlPXQsbiYmKHRoaXMuc291cmNlPW4pfSxDcD17fTshZnVuY3Rpb24oZSl7dmFyIHQ9Q2gsbj1PaDtmdW5jdGlvbiByKGUpe2Z1bmN0aW9uIGkoKXtyZXR1cm4gZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWV9KSl9cmV0dXJue2FwcGx5OmZ1bmN0aW9uKHIpe2Zvcih2YXIgaSxhLG87Oyl7aWYobz1yLnJlbWFpbmluZygpLCEoaT10LmZpcnN0T2YoImluZml4IixlLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucnVsZX0pKSkobykpLmlzU3VjY2VzcygpKXJldHVybiBpLmlzRmFpbHVyZSgpP3I6aTthPXIuc291cmNlKCkudG8oaS5zb3VyY2UoKSkscj1uLnN1Y2Nlc3MoaS52YWx1ZSgpKHIudmFsdWUoKSxhKSxpLnJlbWFpbmluZygpLGEpfX0sdW50aWxFeGNsdXNpdmU6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyByKGUuc2xpY2UoMCxpKCkuaW5kZXhPZih0KSkpfSx1bnRpbEluY2x1c2l2ZTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHIoZS5zbGljZSgwLGkoKS5pbmRleE9mKHQpKzEpKX19fWUucGFyc2VyPWZ1bmN0aW9uKGUsbixhKXt2YXIgbz17cnVsZTpmdW5jdGlvbigpe3JldHVybiBsKGMpfSxsZWZ0QXNzb2NpYXRpdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIGwoYy51bnRpbEV4Y2x1c2l2ZShlKSl9LHJpZ2h0QXNzb2NpYXRpdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIGwoYy51bnRpbEluY2x1c2l2ZShlKSl9fSxjPW5ldyByKGEubWFwKChmdW5jdGlvbihlKXtyZXR1cm57bmFtZTplLm5hbWUscnVsZTppKGUucnVsZUJ1aWxkZXIuYmluZChudWxsLG8pKX19KSkpLHM9dC5maXJzdE9mKGUsbik7ZnVuY3Rpb24gbChlKXtyZXR1cm4gdS5iaW5kKG51bGwsZSl9ZnVuY3Rpb24gdShlLHQpe3ZhciBuPXModCk7cmV0dXJuIG4uaXNTdWNjZXNzKCk/ZS5hcHBseShuKTpufXJldHVybiBvfSxlLmluZml4PWZ1bmN0aW9uKHQsbil7cmV0dXJue25hbWU6dCxydWxlQnVpbGRlcjpuLG1hcDpmdW5jdGlvbihyKXtyZXR1cm4gZS5pbmZpeCh0LChmdW5jdGlvbihlKXt2YXIgdD1uKGUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LG4pe3JldHVybiByKHQsZSxuKX19KSl9fSkpfX19O3ZhciBpPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdHx8KHQ9ZSgpKSx0KG4pfX19KENwKTt2YXIgRnA9e30sT3A9U3AsSXA9TGg7RnAuUmVnZXhUb2tlbmlzZXI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LG4scil7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBhPWVbaV0ucmVnZXg7YS5sYXN0SW5kZXg9bjt2YXIgbz1hLmV4ZWModCk7aWYobyl7dmFyIGM9bitvWzBdLmxlbmd0aDtpZihvLmluZGV4PT09biYmYz5uKXt2YXIgcz1vWzFdO3JldHVybnt0b2tlbjpuZXcgT3AoZVtpXS5uYW1lLHMsci5yYW5nZShuLGMpKSxlbmRJbmRleDpjfX19fWM9bisxO3JldHVybnt0b2tlbjpuZXcgT3AoInVucmVjb2duaXNlZENoYXJhY3RlciIsdC5zdWJzdHJpbmcobixjKSxyLnJhbmdlKG4sYykpLGVuZEluZGV4OmN9fWZ1bmN0aW9uIG4oZSx0KXtyZXR1cm4gbmV3IE9wKCJlbmQiLG51bGwsdC5yYW5nZShlLmxlbmd0aCxlLmxlbmd0aCkpfXJldHVybiBlPWUubWFwKChmdW5jdGlvbihlKXtyZXR1cm57bmFtZTplLm5hbWUscmVnZXg6bmV3IFJlZ0V4cChlLnJlZ2V4LnNvdXJjZSwiZyIpfX0pKSx7dG9rZW5pc2U6ZnVuY3Rpb24oZSxyKXt2YXIgaT1uZXcgSXAoZSxyKSxhPTAsbz1bXTtmb3IoO2E8ZS5sZW5ndGg7KXt2YXIgYz10KGUsYSxpKTthPWMuZW5kSW5kZXgsby5wdXNoKGMudG9rZW4pfXJldHVybiBvLnB1c2gobihlLGkpKSxvfX19LEVoLlBhcnNlcj1VaC5QYXJzZXIsRWgucnVsZXM9Q2gsRWguZXJyb3JzPVJoLEVoLnJlc3VsdHM9T2gsRWguU3RyaW5nU291cmNlPUxoLEVoLlRva2VuPVNwLEVoLmJvdHRvbVVwPUNwLEVoLlJlZ2V4VG9rZW5pc2VyPUZwLlJlZ2V4VG9rZW5pc2VyLEVoLnJ1bGU9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0fHwodD1lKCkpLHQobil9fTt2YXIgUnA9e307ZnVuY3Rpb24gTnAoZSx0KXt0PXR8fHt9LHRoaXMuX2VsZW1lbnRUeXBlPWUsdGhpcy5fc3R5bGVJZD10LnN0eWxlSWQsdGhpcy5fc3R5bGVOYW1lPXQuc3R5bGVOYW1lLHQubGlzdCYmKHRoaXMuX2xpc3RJbmRleD10Lmxpc3QubGV2ZWxJbmRleCx0aGlzLl9saXN0SXNPcmRlcmVkPXQubGlzdC5pc09yZGVyZWQpfWZ1bmN0aW9uIFBwKGUsdCl7cmV0dXJuIGUudG9VcHBlckNhc2UoKT09PXQudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBCcChlLHQpe3JldHVybiAwPT09dC50b1VwcGVyQ2FzZSgpLmluZGV4T2YoZS50b1VwcGVyQ2FzZSgpKX1ScC5wYXJhZ3JhcGg9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBOcCgicGFyYWdyYXBoIixlKX0sUnAucnVuPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgTnAoInJ1biIsZSl9LFJwLnRhYmxlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgTnAoInRhYmxlIixlKX0sUnAuYm9sZD1uZXcgTnAoImJvbGQiKSxScC5pdGFsaWM9bmV3IE5wKCJpdGFsaWMiKSxScC51bmRlcmxpbmU9bmV3IE5wKCJ1bmRlcmxpbmUiKSxScC5zdHJpa2V0aHJvdWdoPW5ldyBOcCgic3RyaWtldGhyb3VnaCIpLFJwLmFsbENhcHM9bmV3IE5wKCJhbGxDYXBzIiksUnAuc21hbGxDYXBzPW5ldyBOcCgic21hbGxDYXBzIiksUnAuY29tbWVudFJlZmVyZW5jZT1uZXcgTnAoImNvbW1lbnRSZWZlcmVuY2UiKSxScC5saW5lQnJlYWs9bmV3IE5wKCJicmVhayIse2JyZWFrVHlwZToibGluZSJ9KSxScC5wYWdlQnJlYWs9bmV3IE5wKCJicmVhayIse2JyZWFrVHlwZToicGFnZSJ9KSxScC5jb2x1bW5CcmVhaz1uZXcgTnAoImJyZWFrIix7YnJlYWtUeXBlOiJjb2x1bW4ifSksUnAuZXF1YWxUbz1mdW5jdGlvbihlKXtyZXR1cm57b3BlcmF0b3I6UHAsb3BlcmFuZDplfX0sUnAuc3RhcnRzV2l0aD1mdW5jdGlvbihlKXtyZXR1cm57b3BlcmF0b3I6QnAsb3BlcmFuZDplfX0sTnAucHJvdG90eXBlLm1hdGNoZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09PXRoaXMuX2VsZW1lbnRUeXBlJiYodm9pZCAwPT09dGhpcy5fc3R5bGVJZHx8ZS5zdHlsZUlkPT09dGhpcy5fc3R5bGVJZCkmJih2b2lkIDA9PT10aGlzLl9zdHlsZU5hbWV8fGUuc3R5bGVOYW1lJiZ0aGlzLl9zdHlsZU5hbWUub3BlcmF0b3IodGhpcy5fc3R5bGVOYW1lLm9wZXJhbmQsZS5zdHlsZU5hbWUpKSYmKHZvaWQgMD09PXRoaXMuX2xpc3RJbmRleHx8ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLm51bWJlcmluZyYmZS5udW1iZXJpbmcubGV2ZWw9PXQmJmUubnVtYmVyaW5nLmlzT3JkZXJlZD09bn0oZSx0aGlzLl9saXN0SW5kZXgsdGhpcy5fbGlzdElzT3JkZXJlZCkpJiYodm9pZCAwPT09dGhpcy5fYnJlYWtUeXBlfHx0aGlzLl9icmVha1R5cGU9PT1lLmJyZWFrVHlwZSl9O3ZhciBXcD17fSxMcD1FaC5SZWdleFRva2VuaXNlcjtXcC50b2tlbmlzZT1mdW5jdGlvbihlKXt2YXIgdD0iKD86W2EtekEtWlxcLV9dfFxcXFwuKSIsbj1uZXcgTHAoW3tuYW1lOiJpZGVudGlmaWVyIixyZWdleDpuZXcgUmVnRXhwKCIoIit0KyIoPzoiK3QrInxbMC05XSkqKSIpfSx7bmFtZToiZG90IixyZWdleDovXC4vfSx7bmFtZToiY29sb24iLHJlZ2V4Oi86L30se25hbWU6Imd0IixyZWdleDovPi99LHtuYW1lOiJ3aGl0ZXNwYWNlIixyZWdleDovXHMrL30se25hbWU6ImFycm93IixyZWdleDovPT4vfSx7bmFtZToiZXF1YWxzIixyZWdleDovPS99LHtuYW1lOiJzdGFydHNXaXRoIixyZWdleDovXF49L30se25hbWU6Im9wZW4tcGFyZW4iLHJlZ2V4Oi9cKC99LHtuYW1lOiJjbG9zZS1wYXJlbiIscmVnZXg6L1wpL30se25hbWU6Im9wZW4tc3F1YXJlLWJyYWNrZXQiLHJlZ2V4Oi9cWy99LHtuYW1lOiJjbG9zZS1zcXVhcmUtYnJhY2tldCIscmVnZXg6L1xdL30se25hbWU6InN0cmluZyIscmVnZXg6bmV3IFJlZ0V4cChNcCsiJyIpfSx7bmFtZToidW50ZXJtaW5hdGVkLXN0cmluZyIscmVnZXg6bmV3IFJlZ0V4cChNcCl9LHtuYW1lOiJpbnRlZ2VyIixyZWdleDovKFswLTldKykvfSx7bmFtZToiY2hvaWNlIixyZWdleDovXHwvfSx7bmFtZToiYmFuZyIscmVnZXg6LyghKS99XSk7cmV0dXJuIG4udG9rZW5pc2UoZSl9O3ZhciBNcD0iJygoPzpcXFxcLnxbXiddKSopIjt2YXIganA9THIsenA9RWgsSHA9UnAsVnA9R2QoKSxxcD1XcC50b2tlbmlzZSxHcD1ibztmdW5jdGlvbiBYcCgpe3ZhciBlPXpwLnJ1bGVzLnNlcXVlbmNlLHQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4genAucnVsZXMudGhlbih6cC5ydWxlcy50b2tlbigiaWRlbnRpZmllciIsZSksKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSl9LG49dCgicCIsSHAucGFyYWdyYXBoKSxyPXQoInIiLEhwLnJ1biksaT16cC5ydWxlcy5maXJzdE9mKCJwIG9yIHIgb3IgdGFibGUiLG4sciksYT16cC5ydWxlcy50aGVuKGVnLChmdW5jdGlvbihlKXtyZXR1cm57c3R5bGVJZDplfX0pKSxvPXpwLnJ1bGVzLmZpcnN0T2YoInN0eWxlIG5hbWUgbWF0Y2hlciIsenAucnVsZXMudGhlbih6cC5ydWxlcy5zZXF1ZW5jZSh6cC5ydWxlcy50b2tlbk9mVHlwZSgiZXF1YWxzIiksenAucnVsZXMuc2VxdWVuY2UuY3V0KCksenAucnVsZXMuc2VxdWVuY2UuY2FwdHVyZShacCkpLmhlYWQoKSwoZnVuY3Rpb24oZSl7cmV0dXJue3N0eWxlTmFtZTpIcC5lcXVhbFRvKGUpfX0pKSx6cC5ydWxlcy50aGVuKHpwLnJ1bGVzLnNlcXVlbmNlKHpwLnJ1bGVzLnRva2VuT2ZUeXBlKCJzdGFydHNXaXRoIiksenAucnVsZXMuc2VxdWVuY2UuY3V0KCksenAucnVsZXMuc2VxdWVuY2UuY2FwdHVyZShacCkpLmhlYWQoKSwoZnVuY3Rpb24oZSl7cmV0dXJue3N0eWxlTmFtZTpIcC5zdGFydHNXaXRoKGUpfX0pKSksYz16cC5ydWxlcy5zZXF1ZW5jZSh6cC5ydWxlcy50b2tlbk9mVHlwZSgib3Blbi1zcXVhcmUtYnJhY2tldCIpLHpwLnJ1bGVzLnNlcXVlbmNlLmN1dCgpLHpwLnJ1bGVzLnRva2VuKCJpZGVudGlmaWVyIiwic3R5bGUtbmFtZSIpLHpwLnJ1bGVzLnNlcXVlbmNlLmNhcHR1cmUobyksenAucnVsZXMudG9rZW5PZlR5cGUoImNsb3NlLXNxdWFyZS1icmFja2V0IikpLmhlYWQoKSxzPXpwLnJ1bGVzLmZpcnN0T2YoImxpc3QgdHlwZSIsdCgib3JkZXJlZC1saXN0Iix7aXNPcmRlcmVkOiEwfSksdCgidW5vcmRlcmVkLWxpc3QiLHtpc09yZGVyZWQ6ITF9KSksbD1lKHpwLnJ1bGVzLnRva2VuT2ZUeXBlKCJjb2xvbiIpLGUuY2FwdHVyZShzKSxlLmN1dCgpLHpwLnJ1bGVzLnRva2VuT2ZUeXBlKCJvcGVuLXBhcmVuIiksZS5jYXB0dXJlKEtwKSx6cC5ydWxlcy50b2tlbk9mVHlwZSgiY2xvc2UtcGFyZW4iKSkubWFwKChmdW5jdGlvbihlLHQpe3JldHVybntsaXN0Ontpc09yZGVyZWQ6ZS5pc09yZGVyZWQsbGV2ZWxJbmRleDp0LTF9fX0pKTtmdW5jdGlvbiB1KGUpe3ZhciB0PXpwLnJ1bGVzLmZpcnN0T2YuYXBwbHkoenAucnVsZXMuZmlyc3RPZixbIm1hdGNoZXIgc3VmZml4Il0uY29uY2F0KGUpKSxuPXpwLnJ1bGVzLnplcm9Pck1vcmUodCk7cmV0dXJuIHpwLnJ1bGVzLnRoZW4obiwoZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7anAuZXh0ZW5kKHQsZSl9KSksdH0pKX12YXIgZj1lKGUuY2FwdHVyZShpKSxlLmNhcHR1cmUodShbYSxjLGxdKSkpLm1hcCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSh0KX0pKSxkPWUoenAucnVsZXMudG9rZW4oImlkZW50aWZpZXIiLCJ0YWJsZSIpLGUuY2FwdHVyZSh1KFthLGNdKSkpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIEhwLnRhYmxlKGUpfSkpLGg9dCgiYiIsSHAuYm9sZCkscD10KCJpIixIcC5pdGFsaWMpLGc9dCgidSIsSHAudW5kZXJsaW5lKSxtPXQoInN0cmlrZSIsSHAuc3RyaWtldGhyb3VnaCksYj10KCJhbGwtY2FwcyIsSHAuYWxsQ2FwcykseT10KCJzbWFsbC1jYXBzIixIcC5zbWFsbENhcHMpLHY9dCgiY29tbWVudC1yZWZlcmVuY2UiLEhwLmNvbW1lbnRSZWZlcmVuY2UpLHg9ZSh6cC5ydWxlcy50b2tlbigiaWRlbnRpZmllciIsImJyIiksZS5jdXQoKSx6cC5ydWxlcy50b2tlbk9mVHlwZSgib3Blbi1zcXVhcmUtYnJhY2tldCIpLHpwLnJ1bGVzLnRva2VuKCJpZGVudGlmaWVyIiwidHlwZSIpLHpwLnJ1bGVzLnRva2VuT2ZUeXBlKCJlcXVhbHMiKSxlLmNhcHR1cmUoWnApLHpwLnJ1bGVzLnRva2VuT2ZUeXBlKCJjbG9zZS1zcXVhcmUtYnJhY2tldCIpKS5tYXAoKGZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlImxpbmUiOnJldHVybiBIcC5saW5lQnJlYWs7Y2FzZSJwYWdlIjpyZXR1cm4gSHAucGFnZUJyZWFrO2Nhc2UiY29sdW1uIjpyZXR1cm4gSHAuY29sdW1uQnJlYWt9fSkpO3JldHVybiB6cC5ydWxlcy5maXJzdE9mKCJlbGVtZW50IHR5cGUiLGYsZCxoLHAsZyxtLGIseSx2LHgpfWZ1bmN0aW9uICRwKCl7dmFyIGU9enAucnVsZXMuc2VxdWVuY2UuY2FwdHVyZSx0PXpwLnJ1bGVzLnRva2VuT2ZUeXBlKCJ3aGl0ZXNwYWNlIiksbj16cC5ydWxlcy50aGVuKHpwLnJ1bGVzLm9wdGlvbmFsKHpwLnJ1bGVzLnNlcXVlbmNlKHpwLnJ1bGVzLnRva2VuT2ZUeXBlKCJjb2xvbiIpLHpwLnJ1bGVzLnRva2VuKCJpZGVudGlmaWVyIiwiZnJlc2giKSkpLChmdW5jdGlvbihlKXtyZXR1cm4gZS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuITB9KSkudmFsdWVPckVsc2UoITEpfSkpLHI9enAucnVsZXMudGhlbih6cC5ydWxlcy5vcHRpb25hbCh6cC5ydWxlcy5zZXF1ZW5jZSh6cC5ydWxlcy50b2tlbk9mVHlwZSgiY29sb24iKSx6cC5ydWxlcy50b2tlbigiaWRlbnRpZmllciIsInNlcGFyYXRvciIpLHpwLnJ1bGVzLnRva2VuT2ZUeXBlKCJvcGVuLXBhcmVuIiksZShacCksenAucnVsZXMudG9rZW5PZlR5cGUoImNsb3NlLXBhcmVuIikpLmhlYWQoKSksKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlT3JFbHNlKCIiKX0pKSxpPXpwLnJ1bGVzLm9uZU9yTW9yZVdpdGhTZXBhcmF0b3IoWXAsenAucnVsZXMudG9rZW5PZlR5cGUoImNob2ljZSIpKSxhPXpwLnJ1bGVzLnNlcXVlbmNlKGUoaSksZSh6cC5ydWxlcy56ZXJvT3JNb3JlKGVnKSksZShuKSxlKHIpKS5tYXAoKGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXt9LGE9e307cmV0dXJuIHQubGVuZ3RoPjAmJihpLmNsYXNzPXQuam9pbigiICIpKSxuJiYoYS5mcmVzaD0hMCksciYmKGEuc2VwYXJhdG9yPXIpLFZwLmVsZW1lbnQoZSxpLGEpfSkpO3JldHVybiB6cC5ydWxlcy5maXJzdE9mKCJodG1sIHBhdGgiLHpwLnJ1bGVzLnRoZW4oenAucnVsZXMudG9rZW5PZlR5cGUoImJhbmciKSwoZnVuY3Rpb24oKXtyZXR1cm4gVnAuaWdub3JlfSkpLHpwLnJ1bGVzLnRoZW4oenAucnVsZXMuemVyb09yTW9yZVdpdGhTZXBhcmF0b3IoYSx6cC5ydWxlcy5zZXF1ZW5jZSh0LHpwLnJ1bGVzLnRva2VuT2ZUeXBlKCJndCIpLHQpKSxWcC5lbGVtZW50cykpfV9oLnJlYWRIdG1sUGF0aD1mdW5jdGlvbihlKXtyZXR1cm4gdGcoJHAoKSxlKX0sX2gucmVhZERvY3VtZW50TWF0Y2hlcj1mdW5jdGlvbihlKXtyZXR1cm4gdGcoWHAoKSxlKX0sX2gucmVhZFN0eWxlPWZ1bmN0aW9uKGUpe3JldHVybiB0ZyhpZyxlKX07dmFyIFlwPXpwLnJ1bGVzLnRoZW4oenAucnVsZXMudG9rZW5PZlR5cGUoImlkZW50aWZpZXIiKSxRcCksS3A9enAucnVsZXMudG9rZW5PZlR5cGUoImludGVnZXIiKSxacD16cC5ydWxlcy50aGVuKHpwLnJ1bGVzLnRva2VuT2ZUeXBlKCJzdHJpbmciKSxRcCksSnA9e246IlxuIixyOiJcciIsdDoiXHQifTtmdW5jdGlvbiBRcChlKXtyZXR1cm4gZS5yZXBsYWNlKC9cXCguKS9nLChmdW5jdGlvbihlLHQpe3JldHVybiBKcFt0XXx8dH0pKX12YXIgZWc9enAucnVsZXMuc2VxdWVuY2UoenAucnVsZXMudG9rZW5PZlR5cGUoImRvdCIpLHpwLnJ1bGVzLnNlcXVlbmNlLmN1dCgpLHpwLnJ1bGVzLnNlcXVlbmNlLmNhcHR1cmUoWXApKS5oZWFkKCk7ZnVuY3Rpb24gdGcoZSx0KXt2YXIgbj1xcCh0KSxyPXpwLlBhcnNlcigpLnBhcnNlVG9rZW5zKGUsbik7cmV0dXJuIHIuaXNTdWNjZXNzKCk/R3Auc3VjY2VzcyhyLnZhbHVlKCkpOm5ldyBHcC5SZXN1bHQobnVsbCxbR3Aud2FybmluZyhuZyh0LHIpKV0pfWZ1bmN0aW9uIG5nKGUsdCl7cmV0dXJuIkRpZCBub3QgdW5kZXJzdGFuZCB0aGlzIHN0eWxlIG1hcHBpbmcsIHNvIGlnbm9yZWQgaXQ6ICIrZSsiXG4iK3QuZXJyb3JzKCkubWFwKHJnKS5qb2luKCJcbiIpfWZ1bmN0aW9uIHJnKGUpe3JldHVybiJFcnJvciB3YXMgYXQgY2hhcmFjdGVyIG51bWJlciAiK2UuY2hhcmFjdGVyTnVtYmVyKCkrIjogRXhwZWN0ZWQgIitlLmV4cGVjdGVkKyIgYnV0IGdvdCAiK2UuYWN0dWFsfXZhciBpZz16cC5ydWxlcy5zZXF1ZW5jZSh6cC5ydWxlcy5zZXF1ZW5jZS5jYXB0dXJlKFhwKCkpLHpwLnJ1bGVzLnRva2VuT2ZUeXBlKCJ3aGl0ZXNwYWNlIiksenAucnVsZXMudG9rZW5PZlR5cGUoImFycm93IiksenAucnVsZXMuc2VxdWVuY2UuY2FwdHVyZSh6cC5ydWxlcy5vcHRpb25hbCh6cC5ydWxlcy5zZXF1ZW5jZSh6cC5ydWxlcy50b2tlbk9mVHlwZSgid2hpdGVzcGFjZSIpLHpwLnJ1bGVzLnNlcXVlbmNlLmNhcHR1cmUoJHAoKSkpLmhlYWQoKSkpLHpwLnJ1bGVzLnRva2VuT2ZUeXBlKCJlbmQiKSkubWFwKChmdW5jdGlvbihlLHQpe3JldHVybntmcm9tOmUsdG86dC52YWx1ZU9yRWxzZShWcC5lbXB0eSl9fSkpLGFnPXtyZWFkT3B0aW9uczpmdW5jdGlvbihlKXtyZXR1cm4gZT1lfHx7fSxvZy5leHRlbmQoe30sc2csZSx7Y3VzdG9tU3R5bGVNYXA6bGcoZS5zdHlsZU1hcCkscmVhZFN0eWxlTWFwOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jdXN0b21TdHlsZU1hcDtyZXR1cm4gdGhpcy5pbmNsdWRlRW1iZWRkZWRTdHlsZU1hcCYmKGU9ZS5jb25jYXQobGcodGhpcy5lbWJlZGRlZFN0eWxlTWFwKSkpLHRoaXMuaW5jbHVkZURlZmF1bHRTdHlsZU1hcCYmKGU9ZS5jb25jYXQoY2cpKSxlfX0pfX0sb2c9THIsY2c9YWcuX2RlZmF1bHRTdHlsZU1hcD1bInAuSGVhZGluZzEgPT4gaDE6ZnJlc2giLCJwLkhlYWRpbmcyID0+IGgyOmZyZXNoIiwicC5IZWFkaW5nMyA9PiBoMzpmcmVzaCIsInAuSGVhZGluZzQgPT4gaDQ6ZnJlc2giLCJwLkhlYWRpbmc1ID0+IGg1OmZyZXNoIiwicC5IZWFkaW5nNiA9PiBoNjpmcmVzaCIsInBbc3R5bGUtbmFtZT0nSGVhZGluZyAxJ10gPT4gaDE6ZnJlc2giLCJwW3N0eWxlLW5hbWU9J0hlYWRpbmcgMiddID0+IGgyOmZyZXNoIiwicFtzdHlsZS1uYW1lPSdIZWFkaW5nIDMnXSA9PiBoMzpmcmVzaCIsInBbc3R5bGUtbmFtZT0nSGVhZGluZyA0J10gPT4gaDQ6ZnJlc2giLCJwW3N0eWxlLW5hbWU9J0hlYWRpbmcgNSddID0+IGg1OmZyZXNoIiwicFtzdHlsZS1uYW1lPSdIZWFkaW5nIDYnXSA9PiBoNjpmcmVzaCIsInBbc3R5bGUtbmFtZT0naGVhZGluZyAxJ10gPT4gaDE6ZnJlc2giLCJwW3N0eWxlLW5hbWU9J2hlYWRpbmcgMiddID0+IGgyOmZyZXNoIiwicFtzdHlsZS1uYW1lPSdoZWFkaW5nIDMnXSA9PiBoMzpmcmVzaCIsInBbc3R5bGUtbmFtZT0naGVhZGluZyA0J10gPT4gaDQ6ZnJlc2giLCJwW3N0eWxlLW5hbWU9J2hlYWRpbmcgNSddID0+IGg1OmZyZXNoIiwicFtzdHlsZS1uYW1lPSdoZWFkaW5nIDYnXSA9PiBoNjpmcmVzaCIsInJbc3R5bGUtbmFtZT0nU3Ryb25nJ10gPT4gc3Ryb25nIiwicFtzdHlsZS1uYW1lPSdmb290bm90ZSB0ZXh0J10gPT4gcDpmcmVzaCIsInJbc3R5bGUtbmFtZT0nZm9vdG5vdGUgcmVmZXJlbmNlJ10gPT4iLCJwW3N0eWxlLW5hbWU9J2VuZG5vdGUgdGV4dCddID0+IHA6ZnJlc2giLCJyW3N0eWxlLW5hbWU9J2VuZG5vdGUgcmVmZXJlbmNlJ10gPT4iLCJwW3N0eWxlLW5hbWU9J2Fubm90YXRpb24gdGV4dCddID0+IHA6ZnJlc2giLCJyW3N0eWxlLW5hbWU9J2Fubm90YXRpb24gcmVmZXJlbmNlJ10gPT4iLCJwW3N0eWxlLW5hbWU9J0Zvb3Rub3RlJ10gPT4gcDpmcmVzaCIsInJbc3R5bGUtbmFtZT0nRm9vdG5vdGUgYW5jaG9yJ10gPT4iLCJwW3N0eWxlLW5hbWU9J0VuZG5vdGUnXSA9PiBwOmZyZXNoIiwicltzdHlsZS1uYW1lPSdFbmRub3RlIGFuY2hvciddID0+IiwicDp1bm9yZGVyZWQtbGlzdCgxKSA9PiB1bCA+IGxpOmZyZXNoIiwicDp1bm9yZGVyZWQtbGlzdCgyKSA9PiB1bHxvbCA+IGxpID4gdWwgPiBsaTpmcmVzaCIsInA6dW5vcmRlcmVkLWxpc3QoMykgPT4gdWx8b2wgPiBsaSA+IHVsfG9sID4gbGkgPiB1bCA+IGxpOmZyZXNoIiwicDp1bm9yZGVyZWQtbGlzdCg0KSA9PiB1bHxvbCA+IGxpID4gdWx8b2wgPiBsaSA+IHVsfG9sID4gbGkgPiB1bCA+IGxpOmZyZXNoIiwicDp1bm9yZGVyZWQtbGlzdCg1KSA9PiB1bHxvbCA+IGxpID4gdWx8b2wgPiBsaSA+IHVsfG9sID4gbGkgPiB1bHxvbCA+IGxpID4gdWwgPiBsaTpmcmVzaCIsInA6b3JkZXJlZC1saXN0KDEpID0+IG9sID4gbGk6ZnJlc2giLCJwOm9yZGVyZWQtbGlzdCgyKSA9PiB1bHxvbCA+IGxpID4gb2wgPiBsaTpmcmVzaCIsInA6b3JkZXJlZC1saXN0KDMpID0+IHVsfG9sID4gbGkgPiB1bHxvbCA+IGxpID4gb2wgPiBsaTpmcmVzaCIsInA6b3JkZXJlZC1saXN0KDQpID0+IHVsfG9sID4gbGkgPiB1bHxvbCA+IGxpID4gdWx8b2wgPiBsaSA+IG9sID4gbGk6ZnJlc2giLCJwOm9yZGVyZWQtbGlzdCg1KSA9PiB1bHxvbCA+IGxpID4gdWx8b2wgPiBsaSA+IHVsfG9sID4gbGkgPiB1bHxvbCA+IGxpID4gb2wgPiBsaTpmcmVzaCIsInJbc3R5bGUtbmFtZT0nSHlwZXJsaW5rJ10gPT4iLCJwW3N0eWxlLW5hbWU9J05vcm1hbCddID0+IHA6ZnJlc2giXSxzZz1hZy5fc3RhbmRhcmRPcHRpb25zPXt0cmFuc2Zvcm1Eb2N1bWVudDpmdW5jdGlvbihlKXtyZXR1cm4gZX0saW5jbHVkZURlZmF1bHRTdHlsZU1hcDohMCxpbmNsdWRlRW1iZWRkZWRTdHlsZU1hcDohMH07ZnVuY3Rpb24gbGcoZSl7cmV0dXJuIGU/b2cuaXNTdHJpbmcoZSk/ZS5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0oKX0pKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiIiIT09ZSYmIiMiIT09ZS5jaGFyQXQoMCl9KSk6ZTpbXX12YXIgdWc9e30sZmc9bmksZGc9VG87dWcub3BlblppcD1mdW5jdGlvbihlKXtyZXR1cm4gZS5hcnJheUJ1ZmZlcj9mZy5yZXNvbHZlKGRnLm9wZW5BcnJheUJ1ZmZlcihlLmFycmF5QnVmZmVyKSk6ZmcucmVqZWN0KG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgZmlsZSBpbiBvcHRpb25zIikpfTt2YXIgaGc9e30scGc9THI7ZnVuY3Rpb24gZ2coZSx0KXtyZXR1cm4gbWcoKGZ1bmN0aW9uKG4pe3JldHVybiBuLnR5cGU9PT1lP3Qobik6bn0pKX1mdW5jdGlvbiBtZyhlKXtyZXR1cm4gZnVuY3Rpb24gdChuKXtpZihuLmNoaWxkcmVuKXt2YXIgcj1wZy5tYXAobi5jaGlsZHJlbix0KTtuPXBnLmV4dGVuZChuLHtjaGlsZHJlbjpyfSl9cmV0dXJuIGUobil9fWZ1bmN0aW9uIGJnKGUpe3ZhciB0PVtdO3JldHVybiB5ZyhlLChmdW5jdGlvbihlKXt0LnB1c2goZSl9KSksdH1mdW5jdGlvbiB5ZyhlLHQpe2UuY2hpbGRyZW4mJmUuY2hpbGRyZW4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7eWcoZSx0KSx0KGUpfSkpfWhnLnBhcmFncmFwaD1mdW5jdGlvbihlKXtyZXR1cm4gZ2coInBhcmFncmFwaCIsZSl9LGhnLnJ1bj1mdW5jdGlvbihlKXtyZXR1cm4gZ2coInJ1biIsZSl9LGhnLl9lbGVtZW50cz1tZyxoZy5nZXREZXNjZW5kYW50c09mVHlwZT1mdW5jdGlvbihlLHQpe3JldHVybiBiZyhlKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT10fSkpfSxoZy5nZXREZXNjZW5kYW50cz1iZzt2YXIgdmc9e30seGc9R2QoKSxEZz1xZCgpO3ZnLmVsZW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBEZy5lbGVtZW50V2l0aFRhZyh4Zy5lbGVtZW50KGUpLFt0XSl9fTt2YXIgVGc9THIsd2c9TXIsX2c9VWQsRWc9TGQuRG9jdW1lbnRDb252ZXJ0ZXIsVWc9VGguY29udmVydEVsZW1lbnRUb1Jhd1RleHQsQWc9X2gucmVhZFN0eWxlLGtnPWFnLnJlYWRPcHRpb25zLFNnPXVnLENnPWJvLlJlc3VsdDtmdW5jdGlvbiBGZyhlLHQpe3JldHVybiB0PWtnKHQpLFNnLm9wZW5aaXAoZSkudGFwKChmdW5jdGlvbihlKXtyZXR1cm4gX2cucmVhZFN0eWxlTWFwKGUpLnRoZW4oKGZ1bmN0aW9uKGUpe3QuZW1iZWRkZWRTdHlsZU1hcD1lfSkpfSkpLnRoZW4oKGZ1bmN0aW9uKG4pe3JldHVybiB3Zy5yZWFkKG4sZSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUubWFwKHQudHJhbnNmb3JtRG9jdW1lbnQpfSkpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPWZ1bmN0aW9uKGUpe3JldHVybiBDZy5jb21iaW5lKChlfHxbXSkubWFwKEFnKSkubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiEhZX0pKX0pKX0odC5yZWFkU3R5bGVNYXAoKSkscj1UZy5leHRlbmQoe30sdCx7c3R5bGVNYXA6bi52YWx1ZX0pLGk9bmV3IEVnKHIpO3JldHVybiBlLmZsYXRNYXBUaGVuKChmdW5jdGlvbihlKXtyZXR1cm4gbi5mbGF0TWFwVGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIGkuY29udmVydFRvSHRtbChlKX0pKX0pKX0oZSx0KX0pKX0pKX10ZS5jb252ZXJ0VG9IdG1sPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEZnKGUsdCl9LHRlLmNvbnZlcnRUb01hcmtkb3duPWZ1bmN0aW9uKGUsdCl7dmFyIG49T2JqZWN0LmNyZWF0ZSh0fHx7fSk7cmV0dXJuIG4ub3V0cHV0Rm9ybWF0PSJtYXJrZG93biIsRmcoZSxuKX0sdGUuY29udmVydD1GZyx0ZS5leHRyYWN0UmF3VGV4dD1mdW5jdGlvbihlKXtyZXR1cm4gU2cub3BlblppcChlKS50aGVuKHdnLnJlYWQpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBlLm1hcChVZyl9KSl9LHRlLmltYWdlcz1YZCx0ZS50cmFuc2Zvcm1zPWhnLHRlLnVuZGVybGluZT12Zyx0ZS5lbWJlZFN0eWxlTWFwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFNnLm9wZW5aaXAoZSkudGFwKChmdW5jdGlvbihlKXtyZXR1cm4gX2cud3JpdGVTdHlsZU1hcChlLHQpfSkpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvQXJyYXlCdWZmZXIoKX0pKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm57dG9BcnJheUJ1ZmZlcjpmdW5jdGlvbigpe3JldHVybiBlfSx0b0J1ZmZlcjpmdW5jdGlvbigpe3JldHVybiBwLmZyb20oZSl9fX0pKX0sdGUucmVhZEVtYmVkZGVkU3R5bGVNYXA9ZnVuY3Rpb24oZSl7cmV0dXJuIFNnLm9wZW5aaXAoZSkudGhlbihfZy5yZWFkU3R5bGVNYXApfSx0ZS5zdHlsZU1hcHBpbmc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlVzZSBhIHJhdyBzdHJpbmcgaW5zdGVhZCBvZiBtYW1tb3RoLnN0eWxlTWFwcGluZyBlLmcuIFwicFtzdHlsZS1uYW1lPSdUaXRsZSddID0+IGgxXCIgaW5zdGVhZCBvZiBtYW1tb3RoLnN0eWxlTWFwcGluZyhcInBbc3R5bGUtbmFtZT0nVGl0bGUnXSA9PiBoMVwiKSIpfTsKLyohIHhsc3guanMgKEMpIDIwMTMtcHJlc2VudCBTaGVldEpTIC0tIGh0dHA6Ly9zaGVldGpzLmNvbSAqLwp2YXIgT2csSWc9MTIwMCxSZz1bODc0LDkzMiw5MzYsOTQ5LDk1MCwxMjUwLDEyNTEsMTI1MiwxMjUzLDEyNTQsMTI1NSwxMjU2LDEyNTcsMTI1OCwxZTRdLE5nPXswOjEyNTIsMTo2NTAwMSwyOjY1MDAxLDc3OjFlNCwxMjg6OTMyLDEyOTo5NDksMTMwOjEzNjEsMTM0OjkzNiwxMzY6OTUwLDE2MToxMjUzLDE2MjoxMjU0LDE2MzoxMjU4LDE3NzoxMjU1LDE3ODoxMjU2LDE4NjoxMjU3LDIwNDoxMjUxLDIyMjo4NzQsMjM4OjEyNTAsMjU1OjEyNTIsNjk6Njk2OX0sUGc9ZnVuY3Rpb24oZSl7LTEhPVJnLmluZGV4T2YoZSkmJihOZ1swXT1lKX07dmFyIEJnPWZ1bmN0aW9uKGUpe0lnPWUsUGcoZSl9O2Z1bmN0aW9uIFdnKCl7QmcoMTIwMCksUGcoMTI1Mil9ZnVuY3Rpb24gTGcoZSl7Zm9yKHZhciB0PVtdLG49MCxyPWUubGVuZ3RoO248cjsrK24pdFtuXT1lLmNoYXJDb2RlQXQobik7cmV0dXJuIHR9ZnVuY3Rpb24gTWcoZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoPj4xOysrbil0W25dPVN0cmluZy5mcm9tQ2hhckNvZGUoZS5jaGFyQ29kZUF0KDIqbikrKGUuY2hhckNvZGVBdCgyKm4rMSk8PDgpKTtyZXR1cm4gdC5qb2luKCIiKX1mdW5jdGlvbiBqZyhlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg+PjE7KytuKXRbbl09U3RyaW5nLmZyb21DaGFyQ29kZShlLmNoYXJDb2RlQXQoMipuKzEpKyhlLmNoYXJDb2RlQXQoMipuKTw8OCkpO3JldHVybiB0LmpvaW4oIiIpfXZhciB6Zz1mdW5jdGlvbihlKXt2YXIgdD1lLmNoYXJDb2RlQXQoMCksbj1lLmNoYXJDb2RlQXQoMSk7cmV0dXJuIDI1NT09dCYmMjU0PT1uP01nKGUuc2xpY2UoMikpOjI1ND09dCYmMjU1PT1uP2pnKGUuc2xpY2UoMikpOjY1Mjc5PT10P2Uuc2xpY2UoMSk6ZX0sSGc9ZnVuY3Rpb24oZSl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZSl9LFZnPWZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUpfSxxZz1udWxsLEdnPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSI7ZnVuY3Rpb24gWGcoZSl7Zm9yKHZhciB0PSIiLG49MCxyPTAsaT0wLGE9MCxvPTAsYz0wLHM9MCxsPTA7bDxlLmxlbmd0aDspYT0obj1lLmNoYXJDb2RlQXQobCsrKSk+PjIsbz0oMyZuKTw8NHwocj1lLmNoYXJDb2RlQXQobCsrKSk+PjQsYz0oMTUmcik8PDJ8KGk9ZS5jaGFyQ29kZUF0KGwrKykpPj42LHM9NjMmaSxpc05hTihyKT9jPXM9NjQ6aXNOYU4oaSkmJihzPTY0KSx0Kz1HZy5jaGFyQXQoYSkrR2cuY2hhckF0KG8pK0dnLmNoYXJBdChjKStHZy5jaGFyQXQocyk7cmV0dXJuIHR9ZnVuY3Rpb24gJGcoZSl7dmFyIHQ9IiIsbj0wLHI9MCxpPTAsYT0wLG89MCxjPTA7ZT1lLnJlcGxhY2UoL15kYXRhOihbXlwvXStcL1teXC9dKyk/O2Jhc2U2NFwsLywiIikucmVwbGFjZSgvW15cd1wrXC9cPV0vZywiIik7Zm9yKHZhciBzPTA7czxlLmxlbmd0aDspbj1HZy5pbmRleE9mKGUuY2hhckF0KHMrKykpPDwyfChhPUdnLmluZGV4T2YoZS5jaGFyQXQocysrKSkpPj40LHQrPVN0cmluZy5mcm9tQ2hhckNvZGUobikscj0oMTUmYSk8PDR8KG89R2cuaW5kZXhPZihlLmNoYXJBdChzKyspKSk+PjIsNjQhPT1vJiYodCs9U3RyaW5nLmZyb21DaGFyQ29kZShyKSksaT0oMyZvKTw8NnwoYz1HZy5pbmRleE9mKGUuY2hhckF0KHMrKykpKSw2NCE9PWMmJih0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpKTtyZXR1cm4gdH12YXIgWWc9ZnVuY3Rpb24oKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEJ1ZmZlciYmInVuZGVmaW5lZCIhPXR5cGVvZiBwcm9jZXNzJiZ2b2lkIDAhPT1wcm9jZXNzLnZlcnNpb25zJiYhIXByb2Nlc3MudmVyc2lvbnMubm9kZX0oKSxLZz1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQnVmZmVyKXt2YXIgZT0hQnVmZmVyLmZyb207aWYoIWUpdHJ5e0J1ZmZlci5mcm9tKCJmb28iLCJ1dGY4Iil9Y2F0Y2godCl7ZT0hMH1yZXR1cm4gZT9mdW5jdGlvbihlLHQpe3JldHVybiB0P25ldyBCdWZmZXIoZSx0KTpuZXcgQnVmZmVyKGUpfTpCdWZmZXIuZnJvbS5iaW5kKEJ1ZmZlcil9cmV0dXJuIGZ1bmN0aW9uKCl7fX0oKSxaZz1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgQnVmZmVyKXJldHVybiExO3ZhciBlPUtnKFs2NSwwXSk7cmV0dXJuISFlJiYxPT1lLnRvU3RyaW5nKCJ1dGYxNmxlIikubGVuZ3RofSgpO2Z1bmN0aW9uIEpnKGUpe3JldHVybiBZZz9CdWZmZXIuYWxsb2M/QnVmZmVyLmFsbG9jKGUpOm5ldyBCdWZmZXIoZSk6InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P25ldyBVaW50OEFycmF5KGUpOm5ldyBBcnJheShlKX1mdW5jdGlvbiBRZyhlKXtyZXR1cm4gWWc/QnVmZmVyLmFsbG9jVW5zYWZlP0J1ZmZlci5hbGxvY1Vuc2FmZShlKTpuZXcgQnVmZmVyKGUpOiJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9uZXcgVWludDhBcnJheShlKTpuZXcgQXJyYXkoZSl9dmFyIGVtPWZ1bmN0aW9uKGUpe3JldHVybiBZZz9LZyhlLCJiaW5hcnkiKTplLnNwbGl0KCIiKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiAyNTUmZS5jaGFyQ29kZUF0KDApfSkpfTtmdW5jdGlvbiB0bShlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZSl9KSkuam9pbigiIik7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOysrbil0W25dPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtuXSk7cmV0dXJuIHQuam9pbigiIil9ZnVuY3Rpb24gbm0oZSl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBBcnJheUJ1ZmZlcil0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIik7aWYoZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXJldHVybiBubShuZXcgVWludDhBcnJheShlKSk7Zm9yKHZhciB0PW5ldyBBcnJheShlLmxlbmd0aCksbj0wO248ZS5sZW5ndGg7KytuKXRbbl09ZVtuXTtyZXR1cm4gdH12YXIgcm09WWc/ZnVuY3Rpb24oZSl7cmV0dXJuIEJ1ZmZlci5jb25jYXQoZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBCdWZmZXIuaXNCdWZmZXIoZSk/ZTpLZyhlKX0pKSl9OmZ1bmN0aW9uKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSl7dmFyIHQ9MCxuPTA7Zm9yKHQ9MDt0PGUubGVuZ3RoOysrdCluKz1lW3RdLmxlbmd0aDt2YXIgcj1uZXcgVWludDhBcnJheShuKSxpPTA7Zm9yKHQ9MCxuPTA7dDxlLmxlbmd0aDtuKz1pLCsrdClpPWVbdF0ubGVuZ3RoLGVbdF1pbnN0YW5jZW9mIFVpbnQ4QXJyYXk/ci5zZXQoZVt0XSxuKToic3RyaW5nIj09dHlwZW9mIGVbdF0/ci5zZXQobmV3IFVpbnQ4QXJyYXkoZW0oZVt0XSkpLG4pOnIuc2V0KG5ldyBVaW50OEFycmF5KGVbdF0pLG4pO3JldHVybiByfXJldHVybltdLmNvbmNhdC5hcHBseShbXSxlLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZTpbXS5zbGljZS5jYWxsKGUpfSkpKX07dmFyIGltPS9cdTAwMDAvZyxhbT0vW1x1MDAwMS1cdTAwMDZdL2c7ZnVuY3Rpb24gb20oZSl7Zm9yKHZhciB0PSIiLG49ZS5sZW5ndGgtMTtuPj0wOyl0Kz1lLmNoYXJBdChuLS0pO3JldHVybiB0fWZ1bmN0aW9uIGNtKGUsdCl7dmFyIG49IiIrZTtyZXR1cm4gbi5sZW5ndGg+PXQ/bjpmYigiMCIsdC1uLmxlbmd0aCkrbn1mdW5jdGlvbiBzbShlLHQpe3ZhciBuPSIiK2U7cmV0dXJuIG4ubGVuZ3RoPj10P246ZmIoIiAiLHQtbi5sZW5ndGgpK259ZnVuY3Rpb24gbG0oZSx0KXt2YXIgbj0iIitlO3JldHVybiBuLmxlbmd0aD49dD9uOm4rZmIoIiAiLHQtbi5sZW5ndGgpfXZhciB1bT1NYXRoLnBvdygyLDMyKTtmdW5jdGlvbiBmbShlLHQpe3JldHVybiBlPnVtfHxlPC11bT9mdW5jdGlvbihlLHQpe3ZhciBuPSIiK01hdGgucm91bmQoZSk7cmV0dXJuIG4ubGVuZ3RoPj10P246ZmIoIjAiLHQtbi5sZW5ndGgpK259KGUsdCk6ZnVuY3Rpb24oZSx0KXt2YXIgbj0iIitlO3JldHVybiBuLmxlbmd0aD49dD9uOmZiKCIwIix0LW4ubGVuZ3RoKStufShNYXRoLnJvdW5kKGUpLHQpfWZ1bmN0aW9uIGRtKGUsdCl7cmV0dXJuIHQ9dHx8MCxlLmxlbmd0aD49Nyt0JiYxMDM9PSgzMnxlLmNoYXJDb2RlQXQodCkpJiYxMDE9PSgzMnxlLmNoYXJDb2RlQXQodCsxKSkmJjExMD09KDMyfGUuY2hhckNvZGVBdCh0KzIpKSYmMTAxPT0oMzJ8ZS5jaGFyQ29kZUF0KHQrMykpJiYxMTQ9PSgzMnxlLmNoYXJDb2RlQXQodCs0KSkmJjk3PT0oMzJ8ZS5jaGFyQ29kZUF0KHQrNSkpJiYxMDg9PSgzMnxlLmNoYXJDb2RlQXQodCs2KSl9dmFyIGhtPVtbIlN1biIsIlN1bmRheSJdLFsiTW9uIiwiTW9uZGF5Il0sWyJUdWUiLCJUdWVzZGF5Il0sWyJXZWQiLCJXZWRuZXNkYXkiXSxbIlRodSIsIlRodXJzZGF5Il0sWyJGcmkiLCJGcmlkYXkiXSxbIlNhdCIsIlNhdHVyZGF5Il1dLHBtPVtbIkoiLCJKYW4iLCJKYW51YXJ5Il0sWyJGIiwiRmViIiwiRmVicnVhcnkiXSxbIk0iLCJNYXIiLCJNYXJjaCJdLFsiQSIsIkFwciIsIkFwcmlsIl0sWyJNIiwiTWF5IiwiTWF5Il0sWyJKIiwiSnVuIiwiSnVuZSJdLFsiSiIsIkp1bCIsIkp1bHkiXSxbIkEiLCJBdWciLCJBdWd1c3QiXSxbIlMiLCJTZXAiLCJTZXB0ZW1iZXIiXSxbIk8iLCJPY3QiLCJPY3RvYmVyIl0sWyJOIiwiTm92IiwiTm92ZW1iZXIiXSxbIkQiLCJEZWMiLCJEZWNlbWJlciJdXTt2YXIgZ209ezA6IkdlbmVyYWwiLDE6IjAiLDI6IjAuMDAiLDM6IiMsIyMwIiw0OiIjLCMjMC4wMCIsOToiMCUiLDEwOiIwLjAwJSIsMTE6IjAuMDBFKzAwIiwxMjoiIyA/Lz8iLDEzOiIjID8/Lz8/IiwxNDoibS9kL3l5IiwxNToiZC1tbW0teXkiLDE2OiJkLW1tbSIsMTc6Im1tbS15eSIsMTg6Img6bW0gQU0vUE0iLDE5OiJoOm1tOnNzIEFNL1BNIiwyMDoiaDptbSIsMjE6Img6bW06c3MiLDIyOiJtL2QveXkgaDptbSIsMzc6IiMsIyMwIDsoIywjIzApIiwzODoiIywjIzAgO1tSZWRdKCMsIyMwKSIsMzk6IiMsIyMwLjAwOygjLCMjMC4wMCkiLDQwOiIjLCMjMC4wMDtbUmVkXSgjLCMjMC4wMCkiLDQ1OiJtbTpzcyIsNDY6IltoXTptbTpzcyIsNDc6Im1tc3MuMCIsNDg6IiMjMC4wRSswIiw0OToiQCIsNTY6JyLkuIrljYgv5LiL5Y2IICJoaCLmmYIibW0i5YiGInNzIuenkiAiJ30sbW09ezU6MzcsNjozOCw3OjM5LDg6NDAsMjM6MCwyNDowLDI1OjAsMjY6MCwyNzoxNCwyODoxNCwyOToxNCwzMDoxNCwzMToxNCw1MDoxNCw1MToxNCw1MjoxNCw1MzoxNCw1NDoxNCw1NToxNCw1NjoxNCw1NzoxNCw1ODoxNCw1OToxLDYwOjIsNjE6Myw2Mjo0LDY3OjksNjg6MTAsNjk6MTIsNzA6MTMsNzE6MTQsNzI6MTQsNzM6MTUsNzQ6MTYsNzU6MTcsNzY6MjAsNzc6MjEsNzg6MjIsNzk6NDUsODA6NDYsODE6NDcsODI6MH0sYm09ezU6JyIkIiMsIyMwXyk7XFwoIiQiIywjIzBcXCknLDYzOiciJCIjLCMjMF8pO1xcKCIkIiMsIyMwXFwpJyw2OiciJCIjLCMjMF8pO1tSZWRdXFwoIiQiIywjIzBcXCknLDY0OiciJCIjLCMjMF8pO1tSZWRdXFwoIiQiIywjIzBcXCknLDc6JyIkIiMsIyMwLjAwXyk7XFwoIiQiIywjIzAuMDBcXCknLDY1OiciJCIjLCMjMC4wMF8pO1xcKCIkIiMsIyMwLjAwXFwpJyw4OiciJCIjLCMjMC4wMF8pO1tSZWRdXFwoIiQiIywjIzAuMDBcXCknLDY2OiciJCIjLCMjMC4wMF8pO1tSZWRdXFwoIiQiIywjIzAuMDBcXCknLDQxOidfKCogIywjIzBfKTtfKCogXFwoIywjIzBcXCk7XygqICItIl8pO18oQF8pJyw0MjonXygiJCIqICMsIyMwXyk7XygiJCIqIFxcKCMsIyMwXFwpO18oIiQiKiAiLSJfKTtfKEBfKScsNDM6J18oKiAjLCMjMC4wMF8pO18oKiBcXCgjLCMjMC4wMFxcKTtfKCogIi0iPz9fKTtfKEBfKScsNDQ6J18oIiQiKiAjLCMjMC4wMF8pO18oIiQiKiBcXCgjLCMjMC4wMFxcKTtfKCIkIiogIi0iPz9fKTtfKEBfKSd9O2Z1bmN0aW9uIHltKGUsdCxuKXtmb3IodmFyIHI9ZTwwPy0xOjEsaT1lKnIsYT0wLG89MSxjPTAscz0xLGw9MCx1PTAsZj1NYXRoLmZsb29yKGkpO2w8dCYmKGM9KGY9TWF0aC5mbG9vcihpKSkqbythLHU9ZipsK3MsIShpLWY8NWUtOCkpOylpPTEvKGktZiksYT1vLG89YyxzPWwsbD11O2lmKHU+dCYmKGw+dD8odT1zLGM9YSk6KHU9bCxjPW8pKSwhbilyZXR1cm5bMCxyKmMsdV07dmFyIGQ9TWF0aC5mbG9vcihyKmMvdSk7cmV0dXJuW2QscipjLWQqdSx1XX1mdW5jdGlvbiB2bShlLHQsbil7aWYoZT4yOTU4NDY1fHxlPDApcmV0dXJuIG51bGw7dmFyIHI9MHwoZT1mdW5jdGlvbihlKXt2YXIgdD1lLnRvUHJlY2lzaW9uKDE2KTtpZih0LmluZGV4T2YoImUiKT4tMSl7dmFyIG49dC5zbGljZSgwLHQuaW5kZXhPZigiZSIpKTtyZXR1cm4obj1uLmluZGV4T2YoIi4iKT4tMT9uLnNsaWNlKDAsIjAuIj09bi5zbGljZSgwLDIpPzE3OjE2KTpuLnNsaWNlKDAsMTUpK2ZiKCIwIixuLmxlbmd0aC0xNSkpK3Quc2xpY2UodC5pbmRleE9mKCJlIikpfXZhciByPXQuaW5kZXhPZigiLiIpPi0xP3Quc2xpY2UoMCwiMC4iPT10LnNsaWNlKDAsMik/MTc6MTYpOnQuc2xpY2UoMCwxNSkrZmIoIjAiLHQubGVuZ3RoLTE1KTtyZXR1cm4gTnVtYmVyKHIpfShlKSksaT1NYXRoLmZsb29yKDg2NDAwKihlLXIpKSxhPTAsbz1bXSxjPXtEOnIsVDppLHU6ODY0MDAqKGUtciktaSx5OjAsbTowLGQ6MCxIOjAsTTowLFM6MCxxOjB9O2lmKE1hdGguYWJzKGMudSk8MWUtNiYmKGMudT0wKSx0JiZ0LmRhdGUxOTA0JiYocis9MTQ2MiksYy51Pi45OTk5JiYoYy51PTAsODY0MDA9PSsraSYmKGMuVD1pPTAsKytyLCsrYy5EKSksNjA9PT1yKW89bj9bMTMxNywxMCwyOV06WzE5MDAsMiwyOV0sYT0zO2Vsc2UgaWYoMD09PXIpbz1uP1sxMzE3LDgsMjldOlsxOTAwLDEsMF0sYT02O2Vsc2V7cj42MCYmLS1yO3ZhciBzPW5ldyBEYXRlKDE5MDAsMCwxKTtzLnNldERhdGUocy5nZXREYXRlKCkrci0xKSxvPVtzLmdldEZ1bGxZZWFyKCkscy5nZXRNb250aCgpKzEscy5nZXREYXRlKCldLGE9cy5nZXREYXkoKSxyPDYwJiYoYT0oYSs2KSU3KSxuJiYoYT1mdW5jdGlvbihlLHQpe3RbMF0tPTU4MTt2YXIgbj1lLmdldERheSgpO2U8NjAmJihuPShuKzYpJTcpO3JldHVybiBufShzLG8pKX1yZXR1cm4gYy55PW9bMF0sYy5tPW9bMV0sYy5kPW9bMl0sYy5TPWklNjAsaT1NYXRoLmZsb29yKGkvNjApLGMuTT1pJTYwLGk9TWF0aC5mbG9vcihpLzYwKSxjLkg9aSxjLnE9YSxjfWZ1bmN0aW9uIHhtKGUpe3JldHVybi0xPT1lLmluZGV4T2YoIi4iKT9lOmUucmVwbGFjZSgvKD86XC4wKnwoXC5cZCpbMS05XSkwKykkLywiJDEiKX1mdW5jdGlvbiBEbShlKXt2YXIgdCxuPU1hdGguZmxvb3IoTWF0aC5sb2coTWF0aC5hYnMoZSkpKk1hdGguTE9HMTBFKTtyZXR1cm4gdD1uPj0tNCYmbjw9LTE/ZS50b1ByZWNpc2lvbigxMCtuKTpNYXRoLmFicyhuKTw9OT9mdW5jdGlvbihlKXt2YXIgdD1lPDA/MTI6MTEsbj14bShlLnRvRml4ZWQoMTIpKTtyZXR1cm4gbi5sZW5ndGg8PXR8fChuPWUudG9QcmVjaXNpb24oMTApKS5sZW5ndGg8PXQ/bjplLnRvRXhwb25lbnRpYWwoNSl9KGUpOjEwPT09bj9lLnRvRml4ZWQoMTApLnN1YnN0cigwLDEyKTpmdW5jdGlvbihlKXt2YXIgdD14bShlLnRvRml4ZWQoMTEpKTtyZXR1cm4gdC5sZW5ndGg+KGU8MD8xMjoxMSl8fCIwIj09PXR8fCItMCI9PT10P2UudG9QcmVjaXNpb24oNik6dH0oZSkseG0oZnVuY3Rpb24oZSl7cmV0dXJuLTE9PWUuaW5kZXhPZigiRSIpP2U6ZS5yZXBsYWNlKC8oPzpcLjAqfChcLlxkKlsxLTldKTArKVtFZV0vLCIkMUUiKS5yZXBsYWNlKC8oRVsrLV0pKFxkKSQvLCIkMTAkMiIpfSh0LnRvVXBwZXJDYXNlKCkpKX1mdW5jdGlvbiBUbShlLHQpe3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJzdHJpbmciOnJldHVybiBlO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIGU/IlRSVUUiOiJGQUxTRSI7Y2FzZSJudW1iZXIiOnJldHVybigwfGUpPT09ZT9lLnRvU3RyaW5nKDEwKTpEbShlKTtjYXNlInVuZGVmaW5lZCI6cmV0dXJuIiI7Y2FzZSJvYmplY3QiOmlmKG51bGw9PWUpcmV0dXJuIiI7aWYoZSBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIEhtKDE0LG5iKGUsdCYmdC5kYXRlMTkwNCksdCl9dGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCB2YWx1ZSBpbiBHZW5lcmFsIGZvcm1hdDogIitlKX1mdW5jdGlvbiB3bShlLHQsbixyKXt2YXIgaSxhPSIiLG89MCxjPTAscz1uLnksbD0wO3N3aXRjaChlKXtjYXNlIDk4OnM9bi55KzU0MztjYXNlIDEyMTpzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMTpjYXNlIDI6aT1zJTEwMCxsPTI7YnJlYWs7ZGVmYXVsdDppPXMlMWU0LGw9NH1icmVhaztjYXNlIDEwOTpzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMTpjYXNlIDI6aT1uLm0sbD10Lmxlbmd0aDticmVhaztjYXNlIDM6cmV0dXJuIHBtW24ubS0xXVsxXTtjYXNlIDU6cmV0dXJuIHBtW24ubS0xXVswXTtkZWZhdWx0OnJldHVybiBwbVtuLm0tMV1bMl19YnJlYWs7Y2FzZSAxMDA6c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6Y2FzZSAyOmk9bi5kLGw9dC5sZW5ndGg7YnJlYWs7Y2FzZSAzOnJldHVybiBobVtuLnFdWzBdO2RlZmF1bHQ6cmV0dXJuIGhtW24ucV1bMV19YnJlYWs7Y2FzZSAxMDQ6c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6Y2FzZSAyOmk9MSsobi5IKzExKSUxMixsPXQubGVuZ3RoO2JyZWFrO2RlZmF1bHQ6dGhyb3ciYmFkIGhvdXIgZm9ybWF0OiAiK3R9YnJlYWs7Y2FzZSA3Mjpzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMTpjYXNlIDI6aT1uLkgsbD10Lmxlbmd0aDticmVhaztkZWZhdWx0OnRocm93ImJhZCBob3VyIGZvcm1hdDogIit0fWJyZWFrO2Nhc2UgNzc6c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6Y2FzZSAyOmk9bi5NLGw9dC5sZW5ndGg7YnJlYWs7ZGVmYXVsdDp0aHJvdyJiYWQgbWludXRlIGZvcm1hdDogIit0fWJyZWFrO2Nhc2UgMTE1OmlmKCJzIiE9dCYmInNzIiE9dCYmIi4wIiE9dCYmIi4wMCIhPXQmJiIuMDAwIiE9dCl0aHJvdyJiYWQgc2Vjb25kIGZvcm1hdDogIit0O3JldHVybiAwIT09bi51fHwicyIhPXQmJiJzcyIhPXQ/KGM9cj49Mj8zPT09cj8xZTM6MTAwOjE9PT1yPzEwOjEsKG89TWF0aC5yb3VuZChjKihuLlMrbi51KSkpPj02MCpjJiYobz0wKSwicyI9PT10PzA9PT1vPyIwIjoiIitvL2M6KGE9Y20obywyK3IpLCJzcyI9PT10P2Euc3Vic3RyKDAsMik6Ii4iK2Euc3Vic3RyKDIsdC5sZW5ndGgtMSkpKTpjbShuLlMsdC5sZW5ndGgpO2Nhc2UgOTA6c3dpdGNoKHQpe2Nhc2UiW2hdIjpjYXNlIltoaF0iOmk9MjQqbi5EK24uSDticmVhaztjYXNlIlttXSI6Y2FzZSJbbW1dIjppPTYwKigyNCpuLkQrbi5IKStuLk07YnJlYWs7Y2FzZSJbc10iOmNhc2UiW3NzXSI6aT02MCooNjAqKDI0Km4uRCtuLkgpK24uTSkrKDA9PXI/TWF0aC5yb3VuZChuLlMrbi51KTpuLlMpO2JyZWFrO2RlZmF1bHQ6dGhyb3ciYmFkIGFic3RpbWUgZm9ybWF0OiAiK3R9bD0zPT09dC5sZW5ndGg/MToyO2JyZWFrO2Nhc2UgMTAxOmk9cyxsPTF9cmV0dXJuIGw+MD9jbShpLGwpOiIifWZ1bmN0aW9uIF9tKGUpe2lmKGUubGVuZ3RoPD0zKXJldHVybiBlO2Zvcih2YXIgdD1lLmxlbmd0aCUzLG49ZS5zdWJzdHIoMCx0KTt0IT1lLmxlbmd0aDt0Kz0zKW4rPShuLmxlbmd0aD4wPyIsIjoiIikrZS5zdWJzdHIodCwzKTtyZXR1cm4gbn12YXIgRW09LyUvZztmdW5jdGlvbiBVbShlLHQpe3ZhciBuLHI9ZS5pbmRleE9mKCJFIiktZS5pbmRleE9mKCIuIiktMTtpZihlLm1hdGNoKC9eIyswLjBFXCswJC8pKXtpZigwPT10KXJldHVybiIwLjBFKzAiO2lmKHQ8MClyZXR1cm4iLSIrVW0oZSwtdCk7dmFyIGk9ZS5pbmRleE9mKCIuIik7LTE9PT1pJiYoaT1lLmluZGV4T2YoIkUiKSk7dmFyIGE9TWF0aC5mbG9vcihNYXRoLmxvZyh0KSpNYXRoLkxPRzEwRSklaTtpZihhPDAmJihhKz1pKSwtMT09PShuPSh0L01hdGgucG93KDEwLGEpKS50b1ByZWNpc2lvbihyKzErKGkrYSklaSkpLmluZGV4T2YoImUiKSl7dmFyIG89TWF0aC5mbG9vcihNYXRoLmxvZyh0KSpNYXRoLkxPRzEwRSk7Zm9yKC0xPT09bi5pbmRleE9mKCIuIik/bj1uLmNoYXJBdCgwKSsiLiIrbi5zdWJzdHIoMSkrIkUrIisoby1uLmxlbmd0aCthKTpuKz0iRSsiKyhvLWEpOyIwLiI9PT1uLnN1YnN0cigwLDIpOyluPShuPW4uY2hhckF0KDApK24uc3Vic3RyKDIsaSkrIi4iK24uc3Vic3RyKDIraSkpLnJlcGxhY2UoL14wKyhbMS05XSkvLCIkMSIpLnJlcGxhY2UoL14wK1wuLywiMC4iKTtuPW4ucmVwbGFjZSgvXCstLywiLSIpfW49bi5yZXBsYWNlKC9eKFsrLV0/KShcZCopXC4oXGQqKVtFZV0vLChmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdCtuK3Iuc3Vic3RyKDAsKGkrYSklaSkrIi4iK3Iuc3Vic3RyKGEpKyJFIn0pKX1lbHNlIG49dC50b0V4cG9uZW50aWFsKHIpO3JldHVybiBlLm1hdGNoKC9FXCswMCQvKSYmbi5tYXRjaCgvZVsrLV1cZCQvKSYmKG49bi5zdWJzdHIoMCxuLmxlbmd0aC0xKSsiMCIrbi5jaGFyQXQobi5sZW5ndGgtMSkpLGUubWF0Y2goL0VcLS8pJiZuLm1hdGNoKC9lXCsvKSYmKG49bi5yZXBsYWNlKC9lXCsvLCJlIikpLG4ucmVwbGFjZSgiZSIsIkUiKX12YXIgQW09LyMgKFw/KykoID8pXC8oID8pKFxkKykvO3ZhciBrbT0vXiMqMCpcLihbMCNdKykvLFNtPS9cKS4qWzAjXS8sQ209L1woIyMjXCkgIyMjXFw/LSMjIyMvO2Z1bmN0aW9uIEZtKGUpe2Zvcih2YXIgdCxuPSIiLHI9MDtyIT1lLmxlbmd0aDsrK3Ipc3dpdGNoKHQ9ZS5jaGFyQ29kZUF0KHIpKXtjYXNlIDM1OmJyZWFrO2Nhc2UgNjM6bis9IiAiO2JyZWFrO2Nhc2UgNDg6bis9IjAiO2JyZWFrO2RlZmF1bHQ6bis9U3RyaW5nLmZyb21DaGFyQ29kZSh0KX1yZXR1cm4gbn1mdW5jdGlvbiBPbShlLHQpe3ZhciBuPU1hdGgucG93KDEwLHQpO3JldHVybiIiK01hdGgucm91bmQoZSpuKS9ufWZ1bmN0aW9uIEltKGUsdCl7dmFyIG49ZS1NYXRoLmZsb29yKGUpLHI9TWF0aC5wb3coMTAsdCk7cmV0dXJuIHQ8KCIiK01hdGgucm91bmQobipyKSkubGVuZ3RoPzA6TWF0aC5yb3VuZChuKnIpfWZ1bmN0aW9uIFJtKGUsdCxuKXtpZig0MD09PWUuY2hhckNvZGVBdCgwKSYmIXQubWF0Y2goU20pKXt2YXIgcj10LnJlcGxhY2UoL1woICovLCIiKS5yZXBsYWNlKC8gXCkvLCIiKS5yZXBsYWNlKC9cKS8sIiIpO3JldHVybiBuPj0wP1JtKCJuIixyLG4pOiIoIitSbSgibiIsciwtbikrIikifWlmKDQ0PT09dC5jaGFyQ29kZUF0KHQubGVuZ3RoLTEpKXJldHVybiBmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPXQubGVuZ3RoLTE7NDQ9PT10LmNoYXJDb2RlQXQoci0xKTspLS1yO3JldHVybiBCbShlLHQuc3Vic3RyKDAsciksbi9NYXRoLnBvdygxMCwzKih0Lmxlbmd0aC1yKSkpfShlLHQsbik7aWYoLTEhPT10LmluZGV4T2YoIiUiKSlyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQucmVwbGFjZShFbSwiIiksaT10Lmxlbmd0aC1yLmxlbmd0aDtyZXR1cm4gQm0oZSxyLG4qTWF0aC5wb3coMTAsMippKSkrZmIoIiUiLGkpfShlLHQsbik7aWYoLTEhPT10LmluZGV4T2YoIkUiKSlyZXR1cm4gVW0odCxuKTtpZigzNj09PXQuY2hhckNvZGVBdCgwKSlyZXR1cm4iJCIrUm0oZSx0LnN1YnN0cigiICI9PXQuY2hhckF0KDEpPzI6MSksbik7dmFyIGksYSxvLGMscz1NYXRoLmFicyhuKSxsPW48MD8iLSI6IiI7aWYodC5tYXRjaCgvXjAwKyQvKSlyZXR1cm4gbCtmbShzLHQubGVuZ3RoKTtpZih0Lm1hdGNoKC9eWyM/XSskLykpcmV0dXJuIjAiPT09KGk9Zm0obiwwKSkmJihpPSIiKSxpLmxlbmd0aD50Lmxlbmd0aD9pOkZtKHQuc3Vic3RyKDAsdC5sZW5ndGgtaS5sZW5ndGgpKStpO2lmKGE9dC5tYXRjaChBbSkpcmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1wYXJzZUludChlWzRdLDEwKSxpPU1hdGgucm91bmQodCpyKSxhPU1hdGguZmxvb3IoaS9yKSxvPWktYSpyLGM9cjtyZXR1cm4gbisoMD09PWE/IiI6IiIrYSkrIiAiKygwPT09bz9mYigiICIsZVsxXS5sZW5ndGgrMStlWzRdLmxlbmd0aCk6c20obyxlWzFdLmxlbmd0aCkrZVsyXSsiLyIrZVszXStjbShjLGVbNF0ubGVuZ3RoKSl9KGEscyxsKTtpZih0Lm1hdGNoKC9eIyswKyQvKSlyZXR1cm4gbCtmbShzLHQubGVuZ3RoLXQuaW5kZXhPZigiMCIpKTtpZihhPXQubWF0Y2goa20pKXJldHVybiBpPU9tKG4sYVsxXS5sZW5ndGgpLnJlcGxhY2UoL14oW15cLl0rKSQvLCIkMS4iK0ZtKGFbMV0pKS5yZXBsYWNlKC9cLiQvLCIuIitGbShhWzFdKSkucmVwbGFjZSgvXC4oXGQqKSQvLChmdW5jdGlvbihlLHQpe3JldHVybiIuIit0K2ZiKCIwIixGbShhWzFdKS5sZW5ndGgtdC5sZW5ndGgpfSkpLC0xIT09dC5pbmRleE9mKCIwLiIpP2k6aS5yZXBsYWNlKC9eMFwuLywiLiIpO2lmKHQ9dC5yZXBsYWNlKC9eIysoWzAuXSkvLCIkMSIpLGE9dC5tYXRjaCgvXigwKilcLigjKikkLykpcmV0dXJuIGwrT20ocyxhWzJdLmxlbmd0aCkucmVwbGFjZSgvXC4oXGQqWzEtOV0pMCokLywiLiQxIikucmVwbGFjZSgvXigtP1xkKikkLywiJDEuIikucmVwbGFjZSgvXjBcLi8sYVsxXS5sZW5ndGg/IjAuIjoiLiIpO2lmKGE9dC5tYXRjaCgvXiN7MSwzfSwjIzAoXC4/KSQvKSlyZXR1cm4gbCtfbShmbShzLDApKTtpZihhPXQubWF0Y2goL14jLCMjMFwuKFsjMF0qMCkkLykpcmV0dXJuIG48MD8iLSIrUm0oZSx0LC1uKTpfbSgiIisoTWF0aC5mbG9vcihuKStmdW5jdGlvbihlLHQpe3JldHVybiB0PCgiIitNYXRoLnJvdW5kKChlLU1hdGguZmxvb3IoZSkpKk1hdGgucG93KDEwLHQpKSkubGVuZ3RoPzE6MH0obixhWzFdLmxlbmd0aCkpKSsiLiIrY20oSW0obixhWzFdLmxlbmd0aCksYVsxXS5sZW5ndGgpO2lmKGE9dC5tYXRjaCgvXiMsIyosIzAvKSlyZXR1cm4gUm0oZSx0LnJlcGxhY2UoL14jLCMqLC8sIiIpLG4pO2lmKGE9dC5tYXRjaCgvXihbMCNdKykoXFw/LShbMCNdKykpKyQvKSlyZXR1cm4gaT1vbShSbShlLHQucmVwbGFjZSgvW1xcLV0vZywiIiksbikpLG89MCxvbShvbSh0LnJlcGxhY2UoL1xcL2csIiIpKS5yZXBsYWNlKC9bMCNdL2csKGZ1bmN0aW9uKGUpe3JldHVybiBvPGkubGVuZ3RoP2kuY2hhckF0KG8rKyk6IjAiPT09ZT8iMCI6IiJ9KSkpO2lmKHQubWF0Y2goQ20pKXJldHVybiIoIisoaT1SbShlLCIjIyMjIyMjIyMjIixuKSkuc3Vic3RyKDAsMykrIikgIitpLnN1YnN0cigzLDMpKyItIitpLnN1YnN0cig2KTt2YXIgdT0iIjtpZihhPXQubWF0Y2goL14oWyMwP10rKSggPylcLyggPykoWyMwP10rKS8pKXJldHVybiBvPU1hdGgubWluKGFbNF0ubGVuZ3RoLDcpLGM9eW0ocyxNYXRoLnBvdygxMCxvKS0xLCExKSxpPSIiK2wsIiAiPT0odT1CbSgibiIsYVsxXSxjWzFdKSkuY2hhckF0KHUubGVuZ3RoLTEpJiYodT11LnN1YnN0cigwLHUubGVuZ3RoLTEpKyIwIiksaSs9dSthWzJdKyIvIithWzNdLCh1PWxtKGNbMl0sbykpLmxlbmd0aDxhWzRdLmxlbmd0aCYmKHU9Rm0oYVs0XS5zdWJzdHIoYVs0XS5sZW5ndGgtdS5sZW5ndGgpKSt1KSxpKz11O2lmKGE9dC5tYXRjaCgvXiMgKFsjMD9dKykoID8pXC8oID8pKFsjMD9dKykvKSlyZXR1cm4gbz1NYXRoLm1pbihNYXRoLm1heChhWzFdLmxlbmd0aCxhWzRdLmxlbmd0aCksNyksbCsoKGM9eW0ocyxNYXRoLnBvdygxMCxvKS0xLCEwKSlbMF18fChjWzFdPyIiOiIwIikpKyIgIisoY1sxXT9zbShjWzFdLG8pK2FbMl0rIi8iK2FbM10rbG0oY1syXSxvKTpmYigiICIsMipvKzErYVsyXS5sZW5ndGgrYVszXS5sZW5ndGgpKTtpZihhPXQubWF0Y2goL15bIzA/XSskLykpcmV0dXJuIGk9Zm0obiwwKSx0Lmxlbmd0aDw9aS5sZW5ndGg/aTpGbSh0LnN1YnN0cigwLHQubGVuZ3RoLWkubGVuZ3RoKSkraTtpZihhPXQubWF0Y2goL14oWyMwP10rKVwuKFsjMF0rKSQvKSl7aT0iIituLnRvRml4ZWQoTWF0aC5taW4oYVsyXS5sZW5ndGgsMTApKS5yZXBsYWNlKC8oW14wXSkwKyQvLCIkMSIpLG89aS5pbmRleE9mKCIuIik7dmFyIGY9dC5pbmRleE9mKCIuIiktbyxkPXQubGVuZ3RoLWkubGVuZ3RoLWY7cmV0dXJuIEZtKHQuc3Vic3RyKDAsZikraSt0LnN1YnN0cih0Lmxlbmd0aC1kKSl9aWYoYT10Lm1hdGNoKC9eMDAsMDAwXC4oWyMwXSowKSQvKSlyZXR1cm4gbz1JbShuLGFbMV0ubGVuZ3RoKSxuPDA/Ii0iK1JtKGUsdCwtbik6X20oZnVuY3Rpb24oZSl7cmV0dXJuIGU8MjE0NzQ4MzY0NyYmZT4tMjE0NzQ4MzY0OD8iIisoZT49MD8wfGU6ZS0xfDApOiIiK01hdGguZmxvb3IoZSl9KG4pKS5yZXBsYWNlKC9eXGQsXGR7M30kLywiMCQmIikucmVwbGFjZSgvXlxkKiQvLChmdW5jdGlvbihlKXtyZXR1cm4iMDAsIisoZS5sZW5ndGg8Mz9jbSgwLDMtZS5sZW5ndGgpOiIiKStlfSkpKyIuIitjbShvLGFbMV0ubGVuZ3RoKTtzd2l0Y2godCl7Y2FzZSIjIyMsIyMwLjAwIjpyZXR1cm4gUm0oZSwiIywjIzAuMDAiLG4pO2Nhc2UiIyMjLCMjIyI6Y2FzZSIjIywjIyMiOmNhc2UiIywjIyMiOnZhciBoPV9tKGZtKHMsMCkpO3JldHVybiIwIiE9PWg/bCtoOiIiO2Nhc2UiIyMjLCMjIy4wMCI6cmV0dXJuIFJtKGUsIiMjIywjIzAuMDAiLG4pLnJlcGxhY2UoL14wXC4vLCIuIik7Y2FzZSIjLCMjIy4wMCI6cmV0dXJuIFJtKGUsIiMsIyMwLjAwIixuKS5yZXBsYWNlKC9eMFwuLywiLiIpfXRocm93IG5ldyBFcnJvcigidW5zdXBwb3J0ZWQgZm9ybWF0IHwiK3QrInwiKX1mdW5jdGlvbiBObShlLHQpe3ZhciBuLHI9ZS5pbmRleE9mKCJFIiktZS5pbmRleE9mKCIuIiktMTtpZihlLm1hdGNoKC9eIyswLjBFXCswJC8pKXtpZigwPT10KXJldHVybiIwLjBFKzAiO2lmKHQ8MClyZXR1cm4iLSIrTm0oZSwtdCk7dmFyIGk9ZS5pbmRleE9mKCIuIik7LTE9PT1pJiYoaT1lLmluZGV4T2YoIkUiKSk7dmFyIGE9TWF0aC5mbG9vcihNYXRoLmxvZyh0KSpNYXRoLkxPRzEwRSklaTtpZihhPDAmJihhKz1pKSwhKG49KHQvTWF0aC5wb3coMTAsYSkpLnRvUHJlY2lzaW9uKHIrMSsoaSthKSVpKSkubWF0Y2goL1tFZV0vKSl7dmFyIG89TWF0aC5mbG9vcihNYXRoLmxvZyh0KSpNYXRoLkxPRzEwRSk7LTE9PT1uLmluZGV4T2YoIi4iKT9uPW4uY2hhckF0KDApKyIuIituLnN1YnN0cigxKSsiRSsiKyhvLW4ubGVuZ3RoK2EpOm4rPSJFKyIrKG8tYSksbj1uLnJlcGxhY2UoL1wrLS8sIi0iKX1uPW4ucmVwbGFjZSgvXihbKy1dPykoXGQqKVwuKFxkKilbRWVdLywoZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHQrbityLnN1YnN0cigwLChpK2EpJWkpKyIuIityLnN1YnN0cihhKSsiRSJ9KSl9ZWxzZSBuPXQudG9FeHBvbmVudGlhbChyKTtyZXR1cm4gZS5tYXRjaCgvRVwrMDAkLykmJm4ubWF0Y2goL2VbKy1dXGQkLykmJihuPW4uc3Vic3RyKDAsbi5sZW5ndGgtMSkrIjAiK24uY2hhckF0KG4ubGVuZ3RoLTEpKSxlLm1hdGNoKC9FXC0vKSYmbi5tYXRjaCgvZVwrLykmJihuPW4ucmVwbGFjZSgvZVwrLywiZSIpKSxuLnJlcGxhY2UoImUiLCJFIil9ZnVuY3Rpb24gUG0oZSx0LG4pe2lmKDQwPT09ZS5jaGFyQ29kZUF0KDApJiYhdC5tYXRjaChTbSkpe3ZhciByPXQucmVwbGFjZSgvXCggKi8sIiIpLnJlcGxhY2UoLyBcKS8sIiIpLnJlcGxhY2UoL1wpLywiIik7cmV0dXJuIG4+PTA/UG0oIm4iLHIsbik6IigiK1BtKCJuIixyLC1uKSsiKSJ9aWYoNDQ9PT10LmNoYXJDb2RlQXQodC5sZW5ndGgtMSkpcmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9dC5sZW5ndGgtMTs0ND09PXQuY2hhckNvZGVBdChyLTEpOyktLXI7cmV0dXJuIEJtKGUsdC5zdWJzdHIoMCxyKSxuL01hdGgucG93KDEwLDMqKHQubGVuZ3RoLXIpKSl9KGUsdCxuKTtpZigtMSE9PXQuaW5kZXhPZigiJSIpKXJldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHI9dC5yZXBsYWNlKEVtLCIiKSxpPXQubGVuZ3RoLXIubGVuZ3RoO3JldHVybiBCbShlLHIsbipNYXRoLnBvdygxMCwyKmkpKStmYigiJSIsaSl9KGUsdCxuKTtpZigtMSE9PXQuaW5kZXhPZigiRSIpKXJldHVybiBObSh0LG4pO2lmKDM2PT09dC5jaGFyQ29kZUF0KDApKXJldHVybiIkIitQbShlLHQuc3Vic3RyKCIgIj09dC5jaGFyQXQoMSk/MjoxKSxuKTt2YXIgaSxhLG8sYyxzPU1hdGguYWJzKG4pLGw9bjwwPyItIjoiIjtpZih0Lm1hdGNoKC9eMDArJC8pKXJldHVybiBsK2NtKHMsdC5sZW5ndGgpO2lmKHQubWF0Y2goL15bIz9dKyQvKSlyZXR1cm4gaT0iIituLDA9PT1uJiYoaT0iIiksaS5sZW5ndGg+dC5sZW5ndGg/aTpGbSh0LnN1YnN0cigwLHQubGVuZ3RoLWkubGVuZ3RoKSkraTtpZihhPXQubWF0Y2goQW0pKXJldHVybiBmdW5jdGlvbihlLHQsbil7cmV0dXJuIG4rKDA9PT10PyIiOiIiK3QpK2ZiKCIgIixlWzFdLmxlbmd0aCsyK2VbNF0ubGVuZ3RoKX0oYSxzLGwpO2lmKHQubWF0Y2goL14jKzArJC8pKXJldHVybiBsK2NtKHMsdC5sZW5ndGgtdC5pbmRleE9mKCIwIikpO2lmKGE9dC5tYXRjaChrbSkpcmV0dXJuIGk9KGk9KCIiK24pLnJlcGxhY2UoL14oW15cLl0rKSQvLCIkMS4iK0ZtKGFbMV0pKS5yZXBsYWNlKC9cLiQvLCIuIitGbShhWzFdKSkpLnJlcGxhY2UoL1wuKFxkKikkLywoZnVuY3Rpb24oZSx0KXtyZXR1cm4iLiIrdCtmYigiMCIsRm0oYVsxXSkubGVuZ3RoLXQubGVuZ3RoKX0pKSwtMSE9PXQuaW5kZXhPZigiMC4iKT9pOmkucmVwbGFjZSgvXjBcLi8sIi4iKTtpZih0PXQucmVwbGFjZSgvXiMrKFswLl0pLywiJDEiKSxhPXQubWF0Y2goL14oMCopXC4oIyopJC8pKXJldHVybiBsKygiIitzKS5yZXBsYWNlKC9cLihcZCpbMS05XSkwKiQvLCIuJDEiKS5yZXBsYWNlKC9eKC0/XGQqKSQvLCIkMS4iKS5yZXBsYWNlKC9eMFwuLyxhWzFdLmxlbmd0aD8iMC4iOiIuIik7aWYoYT10Lm1hdGNoKC9eI3sxLDN9LCMjMChcLj8pJC8pKXJldHVybiBsK19tKCIiK3MpO2lmKGE9dC5tYXRjaCgvXiMsIyMwXC4oWyMwXSowKSQvKSlyZXR1cm4gbjwwPyItIitQbShlLHQsLW4pOl9tKCIiK24pKyIuIitmYigiMCIsYVsxXS5sZW5ndGgpO2lmKGE9dC5tYXRjaCgvXiMsIyosIzAvKSlyZXR1cm4gUG0oZSx0LnJlcGxhY2UoL14jLCMqLC8sIiIpLG4pO2lmKGE9dC5tYXRjaCgvXihbMCNdKykoXFw/LShbMCNdKykpKyQvKSlyZXR1cm4gaT1vbShQbShlLHQucmVwbGFjZSgvW1xcLV0vZywiIiksbikpLG89MCxvbShvbSh0LnJlcGxhY2UoL1xcL2csIiIpKS5yZXBsYWNlKC9bMCNdL2csKGZ1bmN0aW9uKGUpe3JldHVybiBvPGkubGVuZ3RoP2kuY2hhckF0KG8rKyk6IjAiPT09ZT8iMCI6IiJ9KSkpO2lmKHQubWF0Y2goQ20pKXJldHVybiIoIisoaT1QbShlLCIjIyMjIyMjIyMjIixuKSkuc3Vic3RyKDAsMykrIikgIitpLnN1YnN0cigzLDMpKyItIitpLnN1YnN0cig2KTt2YXIgdT0iIjtpZihhPXQubWF0Y2goL14oWyMwP10rKSggPylcLyggPykoWyMwP10rKS8pKXJldHVybiBvPU1hdGgubWluKGFbNF0ubGVuZ3RoLDcpLGM9eW0ocyxNYXRoLnBvdygxMCxvKS0xLCExKSxpPSIiK2wsIiAiPT0odT1CbSgibiIsYVsxXSxjWzFdKSkuY2hhckF0KHUubGVuZ3RoLTEpJiYodT11LnN1YnN0cigwLHUubGVuZ3RoLTEpKyIwIiksaSs9dSthWzJdKyIvIithWzNdLCh1PWxtKGNbMl0sbykpLmxlbmd0aDxhWzRdLmxlbmd0aCYmKHU9Rm0oYVs0XS5zdWJzdHIoYVs0XS5sZW5ndGgtdS5sZW5ndGgpKSt1KSxpKz11O2lmKGE9dC5tYXRjaCgvXiMgKFsjMD9dKykoID8pXC8oID8pKFsjMD9dKykvKSlyZXR1cm4gbz1NYXRoLm1pbihNYXRoLm1heChhWzFdLmxlbmd0aCxhWzRdLmxlbmd0aCksNyksbCsoKGM9eW0ocyxNYXRoLnBvdygxMCxvKS0xLCEwKSlbMF18fChjWzFdPyIiOiIwIikpKyIgIisoY1sxXT9zbShjWzFdLG8pK2FbMl0rIi8iK2FbM10rbG0oY1syXSxvKTpmYigiICIsMipvKzErYVsyXS5sZW5ndGgrYVszXS5sZW5ndGgpKTtpZihhPXQubWF0Y2goL15bIzA/XSskLykpcmV0dXJuIGk9IiIrbix0Lmxlbmd0aDw9aS5sZW5ndGg/aTpGbSh0LnN1YnN0cigwLHQubGVuZ3RoLWkubGVuZ3RoKSkraTtpZihhPXQubWF0Y2goL14oWyMwXSspXC4oWyMwXSspJC8pKXtpPSIiK24udG9GaXhlZChNYXRoLm1pbihhWzJdLmxlbmd0aCwxMCkpLnJlcGxhY2UoLyhbXjBdKTArJC8sIiQxIiksbz1pLmluZGV4T2YoIi4iKTt2YXIgZj10LmluZGV4T2YoIi4iKS1vLGQ9dC5sZW5ndGgtaS5sZW5ndGgtZjtyZXR1cm4gRm0odC5zdWJzdHIoMCxmKStpK3Quc3Vic3RyKHQubGVuZ3RoLWQpKX1pZihhPXQubWF0Y2goL14wMCwwMDBcLihbIzBdKjApJC8pKXJldHVybiBuPDA/Ii0iK1BtKGUsdCwtbik6X20oIiIrbikucmVwbGFjZSgvXlxkLFxkezN9JC8sIjAkJiIpLnJlcGxhY2UoL15cZCokLywoZnVuY3Rpb24oZSl7cmV0dXJuIjAwLCIrKGUubGVuZ3RoPDM/Y20oMCwzLWUubGVuZ3RoKToiIikrZX0pKSsiLiIrY20oMCxhWzFdLmxlbmd0aCk7c3dpdGNoKHQpe2Nhc2UiIyMjLCMjIyI6Y2FzZSIjIywjIyMiOmNhc2UiIywjIyMiOnZhciBoPV9tKCIiK3MpO3JldHVybiIwIiE9PWg/bCtoOiIiO2RlZmF1bHQ6aWYodC5tYXRjaCgvXC5bMCM/XSokLykpcmV0dXJuIFBtKGUsdC5zbGljZSgwLHQubGFzdEluZGV4T2YoIi4iKSksbikrRm0odC5zbGljZSh0Lmxhc3RJbmRleE9mKCIuIikpKX10aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIGZvcm1hdCB8Iit0KyJ8Iil9ZnVuY3Rpb24gQm0oZSx0LG4pe3JldHVybigwfG4pPT09bj9QbShlLHQsbik6Um0oZSx0LG4pfXZhciBXbT0vXFtbSGhNbVNzXHUwRTBBXHUwRTE5XHUwRTE3XSpcXS87ZnVuY3Rpb24gTG0oZSl7Zm9yKHZhciB0PTAsbj0iIixyPSIiO3Q8ZS5sZW5ndGg7KXN3aXRjaChuPWUuY2hhckF0KHQpKXtjYXNlIkciOmRtKGUsdCkmJih0Kz02KSx0Kys7YnJlYWs7Y2FzZSciJzpmb3IoOzM0IT09ZS5jaGFyQ29kZUF0KCsrdCkmJnQ8ZS5sZW5ndGg7KTsrK3Q7YnJlYWs7Y2FzZSJcXCI6Y2FzZSJfIjp0Kz0yO2JyZWFrO2Nhc2UiQCI6Kyt0O2JyZWFrO2Nhc2UiQiI6Y2FzZSJiIjppZigiMSI9PT1lLmNoYXJBdCh0KzEpfHwiMiI9PT1lLmNoYXJBdCh0KzEpKXJldHVybiEwO2Nhc2UiTSI6Y2FzZSJEIjpjYXNlIlkiOmNhc2UiSCI6Y2FzZSJTIjpjYXNlIkUiOmNhc2UibSI6Y2FzZSJkIjpjYXNlInkiOmNhc2UiaCI6Y2FzZSJzIjpjYXNlImUiOmNhc2UiZyI6cmV0dXJuITA7Y2FzZSJBIjpjYXNlImEiOmNhc2Ui5LiKIjppZigiQS9QIj09PWUuc3Vic3RyKHQsMykudG9VcHBlckNhc2UoKSlyZXR1cm4hMDtpZigiQU0vUE0iPT09ZS5zdWJzdHIodCw1KS50b1VwcGVyQ2FzZSgpKXJldHVybiEwO2lmKCLkuIrljYgv5LiL5Y2IIj09PWUuc3Vic3RyKHQsNSkudG9VcHBlckNhc2UoKSlyZXR1cm4hMDsrK3Q7YnJlYWs7Y2FzZSJbIjpmb3Iocj1uOyJdIiE9PWUuY2hhckF0KHQrKykmJnQ8ZS5sZW5ndGg7KXIrPWUuY2hhckF0KHQpO2lmKHIubWF0Y2goV20pKXJldHVybiEwO2JyZWFrO2Nhc2UiLiI6Y2FzZSIwIjpjYXNlIiMiOmZvcig7dDxlLmxlbmd0aCYmKCIwIz8uLEUrLSUiLmluZGV4T2Yobj1lLmNoYXJBdCgrK3QpKT4tMXx8IlxcIj09biYmIi0iPT1lLmNoYXJBdCh0KzEpJiYiMCMiLmluZGV4T2YoZS5jaGFyQXQodCsyKSk+LTEpOyk7YnJlYWs7Y2FzZSI/Ijpmb3IoO2UuY2hhckF0KCsrdCk9PT1uOyk7YnJlYWs7Y2FzZSIqIjorK3QsIiAiIT1lLmNoYXJBdCh0KSYmIioiIT1lLmNoYXJBdCh0KXx8Kyt0O2JyZWFrO2Nhc2UiKCI6Y2FzZSIpIjorK3Q7YnJlYWs7Y2FzZSIxIjpjYXNlIjIiOmNhc2UiMyI6Y2FzZSI0IjpjYXNlIjUiOmNhc2UiNiI6Y2FzZSI3IjpjYXNlIjgiOmNhc2UiOSI6Zm9yKDt0PGUubGVuZ3RoJiYiMDEyMzQ1Njc4OSIuaW5kZXhPZihlLmNoYXJBdCgrK3QpKT4tMTspO2JyZWFrO2RlZmF1bHQ6Kyt0fXJldHVybiExfXZhciBNbT0vXFsoPXw+Wz1dP3w8Wz49XT8pKC0/XGQrKD86XC5cZCopPylcXS87ZnVuY3Rpb24gam0oZSx0KXtpZihudWxsPT10KXJldHVybiExO3ZhciBuPXBhcnNlRmxvYXQodFsyXSk7c3dpdGNoKHRbMV0pe2Nhc2UiPSI6aWYoZT09bilyZXR1cm4hMDticmVhaztjYXNlIj4iOmlmKGU+bilyZXR1cm4hMDticmVhaztjYXNlIjwiOmlmKGU8bilyZXR1cm4hMDticmVhaztjYXNlIjw+IjppZihlIT1uKXJldHVybiEwO2JyZWFrO2Nhc2UiPj0iOmlmKGU+PW4pcmV0dXJuITA7YnJlYWs7Y2FzZSI8PSI6aWYoZTw9bilyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiB6bShlLHQpe3ZhciBuPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPSExLHI9MCxpPTA7cjxlLmxlbmd0aDsrK3Ipc3dpdGNoKGUuY2hhckNvZGVBdChyKSl7Y2FzZSAzNDpuPSFuO2JyZWFrO2Nhc2UgOTU6Y2FzZSA0MjpjYXNlIDkyOisrcjticmVhaztjYXNlIDU5OnRbdC5sZW5ndGhdPWUuc3Vic3RyKGksci1pKSxpPXIrMX1pZih0W3QubGVuZ3RoXT1lLnN1YnN0cihpKSwhMD09PW4pdGhyb3cgbmV3IEVycm9yKCJGb3JtYXQgfCIrZSsifCB1bnRlcm1pbmF0ZWQgc3RyaW5nICIpO3JldHVybiB0fShlKSxyPW4ubGVuZ3RoLGk9bltyLTFdLmluZGV4T2YoIkAiKTtpZihyPDQmJmk+LTEmJi0tcixuLmxlbmd0aD40KXRocm93IG5ldyBFcnJvcigiY2Fubm90IGZpbmQgcmlnaHQgZm9ybWF0IGZvciB8IituLmpvaW4oInwiKSsifCIpO2lmKCJudW1iZXIiIT10eXBlb2YgdClyZXR1cm5bNCw0PT09bi5sZW5ndGh8fGk+LTE/bltuLmxlbmd0aC0xXToiQCJdO3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAxOm49aT4tMT9bIkdlbmVyYWwiLCJHZW5lcmFsIiwiR2VuZXJhbCIsblswXV06W25bMF0sblswXSxuWzBdLCJAIl07YnJlYWs7Y2FzZSAyOm49aT4tMT9bblswXSxuWzBdLG5bMF0sblsxXV06W25bMF0sblsxXSxuWzBdLCJAIl07YnJlYWs7Y2FzZSAzOm49aT4tMT9bblswXSxuWzFdLG5bMF0sblsyXV06W25bMF0sblsxXSxuWzJdLCJAIl19dmFyIGE9dD4wP25bMF06dDwwP25bMV06blsyXTtpZigtMT09PW5bMF0uaW5kZXhPZigiWyIpJiYtMT09PW5bMV0uaW5kZXhPZigiWyIpKXJldHVybltyLGFdO2lmKG51bGwhPW5bMF0ubWF0Y2goL1xbWz08Pl0vKXx8bnVsbCE9blsxXS5tYXRjaCgvXFtbPTw+XS8pKXt2YXIgbz1uWzBdLm1hdGNoKE1tKSxjPW5bMV0ubWF0Y2goTW0pO3JldHVybiBqbSh0LG8pP1tyLG5bMF1dOmptKHQsYyk/W3IsblsxXV06W3IsbltudWxsIT1vJiZudWxsIT1jPzI6MV1dfXJldHVybltyLGFdfWZ1bmN0aW9uIEhtKGUsdCxuKXtudWxsPT1uJiYobj17fSk7dmFyIHI9IiI7c3dpdGNoKHR5cGVvZiBlKXtjYXNlInN0cmluZyI6cj0ibS9kL3l5Ij09ZSYmbi5kYXRlTkY/bi5kYXRlTkY6ZTticmVhaztjYXNlIm51bWJlciI6bnVsbD09KHI9MTQ9PWUmJm4uZGF0ZU5GP24uZGF0ZU5GOihudWxsIT1uLnRhYmxlP24udGFibGU6Z20pW2VdKSYmKHI9bi50YWJsZSYmbi50YWJsZVttbVtlXV18fGdtW21tW2VdXSksbnVsbD09ciYmKHI9Ym1bZV18fCJHZW5lcmFsIil9aWYoZG0ociwwKSlyZXR1cm4gVG0odCxuKTt0IGluc3RhbmNlb2YgRGF0ZSYmKHQ9bmIodCxuLmRhdGUxOTA0KSk7dmFyIGk9em0ocix0KTtpZihkbShpWzFdKSlyZXR1cm4gVG0odCxuKTtpZighMD09PXQpdD0iVFJVRSI7ZWxzZSBpZighMT09PXQpdD0iRkFMU0UiO2Vsc2UgaWYoIiI9PT10fHxudWxsPT10KXJldHVybiIiO3JldHVybiBmdW5jdGlvbihlLHQsbixyKXtmb3IodmFyIGksYSxvLGM9W10scz0iIixsPTAsdT0iIixmPSJ0IixkPSJIIjtsPGUubGVuZ3RoOylzd2l0Y2godT1lLmNoYXJBdChsKSl7Y2FzZSJHIjppZighZG0oZSxsKSl0aHJvdyBuZXcgRXJyb3IoInVucmVjb2duaXplZCBjaGFyYWN0ZXIgIit1KyIgaW4gIitlKTtjW2MubGVuZ3RoXT17dDoiRyIsdjoiR2VuZXJhbCJ9LGwrPTc7YnJlYWs7Y2FzZSciJzpmb3Iocz0iIjszNCE9PShvPWUuY2hhckNvZGVBdCgrK2wpKSYmbDxlLmxlbmd0aDspcys9U3RyaW5nLmZyb21DaGFyQ29kZShvKTtjW2MubGVuZ3RoXT17dDoidCIsdjpzfSwrK2w7YnJlYWs7Y2FzZSJcXCI6dmFyIGg9ZS5jaGFyQXQoKytsKSxwPSIoIj09PWh8fCIpIj09PWg/aDoidCI7Y1tjLmxlbmd0aF09e3Q6cCx2Omh9LCsrbDticmVhaztjYXNlIl8iOmNbYy5sZW5ndGhdPXt0OiJ0Iix2OiIgIn0sbCs9MjticmVhaztjYXNlIkAiOmNbYy5sZW5ndGhdPXt0OiJUIix2OnR9LCsrbDticmVhaztjYXNlIkIiOmNhc2UiYiI6aWYoIjEiPT09ZS5jaGFyQXQobCsxKXx8IjIiPT09ZS5jaGFyQXQobCsxKSl7aWYobnVsbD09aSYmbnVsbD09KGk9dm0odCxuLCIyIj09PWUuY2hhckF0KGwrMSkpKSlyZXR1cm4iIjtjW2MubGVuZ3RoXT17dDoiWCIsdjplLnN1YnN0cihsLDIpfSxmPXUsbCs9MjticmVha31jYXNlIk0iOmNhc2UiRCI6Y2FzZSJZIjpjYXNlIkgiOmNhc2UiUyI6Y2FzZSJFIjp1PXUudG9Mb3dlckNhc2UoKTtjYXNlIm0iOmNhc2UiZCI6Y2FzZSJ5IjpjYXNlImgiOmNhc2UicyI6Y2FzZSJlIjpjYXNlImciOmlmKHQ8MClyZXR1cm4iIjtpZihudWxsPT1pJiZudWxsPT0oaT12bSh0LG4pKSlyZXR1cm4iIjtmb3Iocz11OysrbDxlLmxlbmd0aCYmZS5jaGFyQXQobCkudG9Mb3dlckNhc2UoKT09PXU7KXMrPXU7Im0iPT09dSYmImgiPT09Zi50b0xvd2VyQ2FzZSgpJiYodT0iTSIpLCJoIj09PXUmJih1PWQpLGNbYy5sZW5ndGhdPXt0OnUsdjpzfSxmPXU7YnJlYWs7Y2FzZSJBIjpjYXNlImEiOmNhc2Ui5LiKIjp2YXIgZz17dDp1LHY6dX07aWYobnVsbD09aSYmKGk9dm0odCxuKSksIkEvUCI9PT1lLnN1YnN0cihsLDMpLnRvVXBwZXJDYXNlKCk/KG51bGwhPWkmJihnLnY9aS5IPj0xMj9lLmNoYXJBdChsKzIpOnUpLGcudD0iVCIsZD0iaCIsbCs9Myk6IkFNL1BNIj09PWUuc3Vic3RyKGwsNSkudG9VcHBlckNhc2UoKT8obnVsbCE9aSYmKGcudj1pLkg+PTEyPyJQTSI6IkFNIiksZy50PSJUIixsKz01LGQ9ImgiKToi5LiK5Y2IL+S4i+WNiCI9PT1lLnN1YnN0cihsLDUpLnRvVXBwZXJDYXNlKCk/KG51bGwhPWkmJihnLnY9aS5IPj0xMj8i5LiL5Y2IIjoi5LiK5Y2IIiksZy50PSJUIixsKz01LGQ9ImgiKTooZy50PSJ0IiwrK2wpLG51bGw9PWkmJiJUIj09PWcudClyZXR1cm4iIjtjW2MubGVuZ3RoXT1nLGY9dTticmVhaztjYXNlIlsiOmZvcihzPXU7Il0iIT09ZS5jaGFyQXQobCsrKSYmbDxlLmxlbmd0aDspcys9ZS5jaGFyQXQobCk7aWYoIl0iIT09cy5zbGljZSgtMSkpdGhyb3cndW50ZXJtaW5hdGVkICJbIiBibG9jazogfCcrcysifCI7aWYocy5tYXRjaChXbSkpe2lmKG51bGw9PWkmJm51bGw9PShpPXZtKHQsbikpKXJldHVybiIiO2NbYy5sZW5ndGhdPXt0OiJaIix2OnMudG9Mb3dlckNhc2UoKX0sZj1zLmNoYXJBdCgxKX1lbHNlIHMuaW5kZXhPZigiJCIpPi0xJiYocz0ocy5tYXRjaCgvXCQoW14tXFtcXV0qKS8pfHxbXSlbMV18fCIkIixMbShlKXx8KGNbYy5sZW5ndGhdPXt0OiJ0Iix2OnN9KSk7YnJlYWs7Y2FzZSIuIjppZihudWxsIT1pKXtmb3Iocz11OysrbDxlLmxlbmd0aCYmIjAiPT09KHU9ZS5jaGFyQXQobCkpOylzKz11O2NbYy5sZW5ndGhdPXt0OiJzIix2OnN9O2JyZWFrfWNhc2UiMCI6Y2FzZSIjIjpmb3Iocz11OysrbDxlLmxlbmd0aCYmIjAjPy4sRSstJSIuaW5kZXhPZih1PWUuY2hhckF0KGwpKT4tMTspcys9dTtjW2MubGVuZ3RoXT17dDoibiIsdjpzfTticmVhaztjYXNlIj8iOmZvcihzPXU7ZS5jaGFyQXQoKytsKT09PXU7KXMrPXU7Y1tjLmxlbmd0aF09e3Q6dSx2OnN9LGY9dTticmVhaztjYXNlIioiOisrbCwiICIhPWUuY2hhckF0KGwpJiYiKiIhPWUuY2hhckF0KGwpfHwrK2w7YnJlYWs7Y2FzZSIoIjpjYXNlIikiOmNbYy5sZW5ndGhdPXt0OjE9PT1yPyJ0Ijp1LHY6dX0sKytsO2JyZWFrO2Nhc2UiMSI6Y2FzZSIyIjpjYXNlIjMiOmNhc2UiNCI6Y2FzZSI1IjpjYXNlIjYiOmNhc2UiNyI6Y2FzZSI4IjpjYXNlIjkiOmZvcihzPXU7bDxlLmxlbmd0aCYmIjAxMjM0NTY3ODkiLmluZGV4T2YoZS5jaGFyQXQoKytsKSk+LTE7KXMrPWUuY2hhckF0KGwpO2NbYy5sZW5ndGhdPXt0OiJEIix2OnN9O2JyZWFrO2Nhc2UiICI6Y1tjLmxlbmd0aF09e3Q6dSx2OnV9LCsrbDticmVhaztjYXNlIiQiOmNbYy5sZW5ndGhdPXt0OiJ0Iix2OiIkIn0sKytsO2JyZWFrO2RlZmF1bHQ6aWYoLTE9PT0iLCQtKy8oKTohXiYnfnt9PD494oKsYWNmaWprbG9wcXJ0dXZ3eHpQIi5pbmRleE9mKHUpKXRocm93IG5ldyBFcnJvcigidW5yZWNvZ25pemVkIGNoYXJhY3RlciAiK3UrIiBpbiAiK2UpO2NbYy5sZW5ndGhdPXt0OiJ0Iix2OnV9LCsrbH12YXIgbSxiLHk9MCx2PTA7Zm9yKGw9Yy5sZW5ndGgtMSxmPSJ0IjtsPj0wOy0tbClzd2l0Y2goY1tsXS50KXtjYXNlImgiOmNhc2UiSCI6Y1tsXS50PWQsZj0iaCIseTwxJiYoeT0xKTticmVhaztjYXNlInMiOihtPWNbbF0udi5tYXRjaCgvXC4wKyQvKSkmJih2PU1hdGgubWF4KHYsbVswXS5sZW5ndGgtMSkseT00KSx5PDMmJih5PTMpO2Nhc2UiZCI6Y2FzZSJ5IjpjYXNlImUiOmY9Y1tsXS50O2JyZWFrO2Nhc2UiTSI6Zj1jW2xdLnQseTwyJiYoeT0yKTticmVhaztjYXNlIm0iOiJzIj09PWYmJihjW2xdLnQ9Ik0iLHk8MiYmKHk9MikpO2JyZWFrO2Nhc2UiWCI6YnJlYWs7Y2FzZSJaIjp5PDEmJmNbbF0udi5tYXRjaCgvW0hoXS8pJiYoeT0xKSx5PDImJmNbbF0udi5tYXRjaCgvW01tXS8pJiYoeT0yKSx5PDMmJmNbbF0udi5tYXRjaCgvW1NzXS8pJiYoeT0zKX1zd2l0Y2goeSl7Y2FzZSAwOmJyZWFrO2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOmkudT49LjUmJihpLnU9MCwrK2kuUyksaS5TPj02MCYmKGkuUz0wLCsraS5NKSxpLk0+PTYwJiYoaS5NPTAsKytpLkgpLGkuSD49MjQmJihpLkg9MCwrK2kuRCwoYj12bShpLkQpKS51PWkudSxiLlM9aS5TLGIuTT1pLk0sYi5IPWkuSCxpPWIpO2JyZWFrO2Nhc2UgNDpzd2l0Y2godil7Y2FzZSAxOmkudT1NYXRoLnJvdW5kKDEwKmkudSkvMTA7YnJlYWs7Y2FzZSAyOmkudT1NYXRoLnJvdW5kKDEwMCppLnUpLzEwMDticmVhaztjYXNlIDM6aS51PU1hdGgucm91bmQoMWUzKmkudSkvMWUzfWkudT49MSYmKGkudT0wLCsraS5TKSxpLlM+PTYwJiYoaS5TPTAsKytpLk0pLGkuTT49NjAmJihpLk09MCwrK2kuSCksaS5IPj0yNCYmKGkuSD0wLCsraS5ELChiPXZtKGkuRCkpLnU9aS51LGIuUz1pLlMsYi5NPWkuTSxiLkg9aS5ILGk9Yil9dmFyIHgsRD0iIjtmb3IobD0wO2w8Yy5sZW5ndGg7KytsKXN3aXRjaChjW2xdLnQpe2Nhc2UidCI6Y2FzZSJUIjpjYXNlIiAiOmNhc2UiRCI6YnJlYWs7Y2FzZSJYIjpjW2xdLnY9IiIsY1tsXS50PSI7IjticmVhaztjYXNlImQiOmNhc2UibSI6Y2FzZSJ5IjpjYXNlImgiOmNhc2UiSCI6Y2FzZSJNIjpjYXNlInMiOmNhc2UiZSI6Y2FzZSJiIjpjYXNlIloiOmNbbF0udj13bShjW2xdLnQuY2hhckNvZGVBdCgwKSxjW2xdLnYsaSx2KSxjW2xdLnQ9InQiO2JyZWFrO2Nhc2UibiI6Y2FzZSI/Ijpmb3IoeD1sKzE7bnVsbCE9Y1t4XSYmKCI/Ij09PSh1PWNbeF0udCl8fCJEIj09PXV8fCgiICI9PT11fHwidCI9PT11KSYmbnVsbCE9Y1t4KzFdJiYoIj8iPT09Y1t4KzFdLnR8fCJ0Ij09PWNbeCsxXS50JiYiLyI9PT1jW3grMV0udil8fCIoIj09PWNbbF0udCYmKCIgIj09PXV8fCJuIj09PXV8fCIpIj09PXUpfHwidCI9PT11JiYoIi8iPT09Y1t4XS52fHwiICI9PT1jW3hdLnYmJm51bGwhPWNbeCsxXSYmIj8iPT1jW3grMV0udCkpOyljW2xdLnYrPWNbeF0udixjW3hdPXt2OiIiLHQ6IjsifSwrK3g7RCs9Y1tsXS52LGw9eC0xO2JyZWFrO2Nhc2UiRyI6Y1tsXS50PSJ0IixjW2xdLnY9VG0odCxuKX12YXIgVCx3LF89IiI7aWYoRC5sZW5ndGg+MCl7NDA9PUQuY2hhckNvZGVBdCgwKT8oVD10PDAmJjQ1PT09RC5jaGFyQ29kZUF0KDApPy10OnQsdz1CbSgibiIsRCxUKSk6KHc9Qm0oIm4iLEQsVD10PDAmJnI+MT8tdDp0KSxUPDAmJmNbMF0mJiJ0Ij09Y1swXS50JiYodz13LnN1YnN0cigxKSxjWzBdLnY9Ii0iK2NbMF0udikpLHg9dy5sZW5ndGgtMTt2YXIgRT1jLmxlbmd0aDtmb3IobD0wO2w8Yy5sZW5ndGg7KytsKWlmKG51bGwhPWNbbF0mJiJ0IiE9Y1tsXS50JiZjW2xdLnYuaW5kZXhPZigiLiIpPi0xKXtFPWw7YnJlYWt9dmFyIFU9Yy5sZW5ndGg7aWYoRT09PWMubGVuZ3RoJiYtMT09PXcuaW5kZXhPZigiRSIpKXtmb3IobD1jLmxlbmd0aC0xO2w+PTA7LS1sKW51bGwhPWNbbF0mJi0xIT09Im4/Ii5pbmRleE9mKGNbbF0udCkmJih4Pj1jW2xdLnYubGVuZ3RoLTE/KHgtPWNbbF0udi5sZW5ndGgsY1tsXS52PXcuc3Vic3RyKHgrMSxjW2xdLnYubGVuZ3RoKSk6eDwwP2NbbF0udj0iIjooY1tsXS52PXcuc3Vic3RyKDAseCsxKSx4PS0xKSxjW2xdLnQ9InQiLFU9bCk7eD49MCYmVTxjLmxlbmd0aCYmKGNbVV0udj13LnN1YnN0cigwLHgrMSkrY1tVXS52KX1lbHNlIGlmKEUhPT1jLmxlbmd0aCYmLTE9PT13LmluZGV4T2YoIkUiKSl7Zm9yKHg9dy5pbmRleE9mKCIuIiktMSxsPUU7bD49MDstLWwpaWYobnVsbCE9Y1tsXSYmLTEhPT0ibj8iLmluZGV4T2YoY1tsXS50KSl7Zm9yKGE9Y1tsXS52LmluZGV4T2YoIi4iKT4tMSYmbD09PUU/Y1tsXS52LmluZGV4T2YoIi4iKS0xOmNbbF0udi5sZW5ndGgtMSxfPWNbbF0udi5zdWJzdHIoYSsxKTthPj0wOy0tYSl4Pj0wJiYoIjAiPT09Y1tsXS52LmNoYXJBdChhKXx8IiMiPT09Y1tsXS52LmNoYXJBdChhKSkmJihfPXcuY2hhckF0KHgtLSkrXyk7Y1tsXS52PV8sY1tsXS50PSJ0IixVPWx9Zm9yKHg+PTAmJlU8Yy5sZW5ndGgmJihjW1VdLnY9dy5zdWJzdHIoMCx4KzEpK2NbVV0udikseD13LmluZGV4T2YoIi4iKSsxLGw9RTtsPGMubGVuZ3RoOysrbClpZihudWxsIT1jW2xdJiYoLTEhPT0ibj8oIi5pbmRleE9mKGNbbF0udCl8fGw9PT1FKSl7Zm9yKGE9Y1tsXS52LmluZGV4T2YoIi4iKT4tMSYmbD09PUU/Y1tsXS52LmluZGV4T2YoIi4iKSsxOjAsXz1jW2xdLnYuc3Vic3RyKDAsYSk7YTxjW2xdLnYubGVuZ3RoOysrYSl4PHcubGVuZ3RoJiYoXys9dy5jaGFyQXQoeCsrKSk7Y1tsXS52PV8sY1tsXS50PSJ0IixVPWx9fX1mb3IobD0wO2w8Yy5sZW5ndGg7KytsKW51bGwhPWNbbF0mJiJuPyIuaW5kZXhPZihjW2xdLnQpPi0xJiYoVD1yPjEmJnQ8MCYmbD4wJiYiLSI9PT1jW2wtMV0udj8tdDp0LGNbbF0udj1CbShjW2xdLnQsY1tsXS52LFQpLGNbbF0udD0idCIpO3ZhciBBPSIiO2ZvcihsPTA7bCE9PWMubGVuZ3RoOysrbCludWxsIT1jW2xdJiYoQSs9Y1tsXS52KTtyZXR1cm4gQX0oaVsxXSx0LG4saVswXSl9ZnVuY3Rpb24gVm0oKXt2YXIgZTtlfHwoZT17fSksZVswXT0iR2VuZXJhbCIsZVsxXT0iMCIsZVsyXT0iMC4wMCIsZVszXT0iIywjIzAiLGVbNF09IiMsIyMwLjAwIixlWzldPSIwJSIsZVsxMF09IjAuMDAlIixlWzExXT0iMC4wMEUrMDAiLGVbMTJdPSIjID8vPyIsZVsxM109IiMgPz8vPz8iLGVbMTRdPSJtL2QveXkiLGVbMTVdPSJkLW1tbS15eSIsZVsxNl09ImQtbW1tIixlWzE3XT0ibW1tLXl5IixlWzE4XT0iaDptbSBBTS9QTSIsZVsxOV09Img6bW06c3MgQU0vUE0iLGVbMjBdPSJoOm1tIixlWzIxXT0iaDptbTpzcyIsZVsyMl09Im0vZC95eSBoOm1tIixlWzM3XT0iIywjIzAgOygjLCMjMCkiLGVbMzhdPSIjLCMjMCA7W1JlZF0oIywjIzApIixlWzM5XT0iIywjIzAuMDA7KCMsIyMwLjAwKSIsZVs0MF09IiMsIyMwLjAwO1tSZWRdKCMsIyMwLjAwKSIsZVs0NV09Im1tOnNzIixlWzQ2XT0iW2hdOm1tOnNzIixlWzQ3XT0ibW1zcy4wIixlWzQ4XT0iIyMwLjBFKzAiLGVbNDldPSJAIixlWzU2XT0nIuS4iuWNiC/kuIvljYggImhoIuaZgiJtbSLliIYic3Mi56eSICInLGdtPWV9dmFyIHFtPXs1OiciJCIjLCMjMF8pO1xcKCIkIiMsIyMwXFwpJyw2OiciJCIjLCMjMF8pO1tSZWRdXFwoIiQiIywjIzBcXCknLDc6JyIkIiMsIyMwLjAwXyk7XFwoIiQiIywjIzAuMDBcXCknLDg6JyIkIiMsIyMwLjAwXyk7W1JlZF1cXCgiJCIjLCMjMC4wMFxcKScsMjM6IkdlbmVyYWwiLDI0OiJHZW5lcmFsIiwyNToiR2VuZXJhbCIsMjY6IkdlbmVyYWwiLDI3OiJtL2QveXkiLDI4OiJtL2QveXkiLDI5OiJtL2QveXkiLDMwOiJtL2QveXkiLDMxOiJtL2QveXkiLDMyOiJoOm1tOnNzIiwzMzoiaDptbTpzcyIsMzQ6Img6bW06c3MiLDM1OiJoOm1tOnNzIiwzNjoibS9kL3l5Iiw0MTonXygqICMsIyMwXyk7XygqICgjLCMjMCk7XygqICItIl8pO18oQF8pJyw0MjonXygiJCIqICMsIyMwXyk7XygiJCIqICgjLCMjMCk7XygiJCIqICItIl8pO18oQF8pJyw0MzonXygqICMsIyMwLjAwXyk7XygqICgjLCMjMC4wMCk7XygqICItIj8/Xyk7XyhAXyknLDQ0OidfKCIkIiogIywjIzAuMDBfKTtfKCIkIiogKCMsIyMwLjAwKTtfKCIkIiogIi0iPz9fKTtfKEBfKScsNTA6Im0vZC95eSIsNTE6Im0vZC95eSIsNTI6Im0vZC95eSIsNTM6Im0vZC95eSIsNTQ6Im0vZC95eSIsNTU6Im0vZC95eSIsNTY6Im0vZC95eSIsNTc6Im0vZC95eSIsNTg6Im0vZC95eSIsNTk6IjAiLDYwOiIwLjAwIiw2MToiIywjIzAiLDYyOiIjLCMjMC4wMCIsNjM6JyIkIiMsIyMwXyk7XFwoIiQiIywjIzBcXCknLDY0OiciJCIjLCMjMF8pO1tSZWRdXFwoIiQiIywjIzBcXCknLDY1OiciJCIjLCMjMC4wMF8pO1xcKCIkIiMsIyMwLjAwXFwpJyw2NjonIiQiIywjIzAuMDBfKTtbUmVkXVxcKCIkIiMsIyMwLjAwXFwpJyw2NzoiMCUiLDY4OiIwLjAwJSIsNjk6IiMgPy8/Iiw3MDoiIyA/Py8/PyIsNzE6Im0vZC95eSIsNzI6Im0vZC95eSIsNzM6ImQtbW1tLXl5Iiw3NDoiZC1tbW0iLDc1OiJtbW0teXkiLDc2OiJoOm1tIiw3NzoiaDptbTpzcyIsNzg6Im0vZC95eSBoOm1tIiw3OToibW06c3MiLDgwOiJbaF06bW06c3MiLDgxOiJtbXNzLjAifSxHbT0vW2REXSt8W21NXSt8W3lZZUVdK3xbSGhdK3xbU3NdKy9nO3ZhciBYbT17ImQubSI6ImRcXC5tIn07ZnVuY3Rpb24gJG0oZSx0KXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpe3Q9K3R8fC0xO2Zvcih2YXIgbj0wO248MzkyOysrbilpZihudWxsIT1nbVtuXSl7aWYoZ21bbl09PWUpe3Q9bjticmVha319ZWxzZSB0PDAmJih0PW4pO3Q8MCYmKHQ9MzkxKX1yZXR1cm4gZ21bdF09ZSx0fShYbVtlXXx8ZSx0KX12YXIgWW09ZnVuY3Rpb24oKXt2YXIgZT17fTtlLnZlcnNpb249IjEuMi4wIjt2YXIgdD1mdW5jdGlvbigpe2Zvcih2YXIgZT0wLHQ9bmV3IEFycmF5KDI1Niksbj0wOzI1NiE9bjsrK24pZT0xJihlPTEmKGU9MSYoZT0xJihlPTEmKGU9MSYoZT0xJihlPTEmKGU9bik/LTMwNjY3NDkxMl5lPj4+MTplPj4+MSk/LTMwNjY3NDkxMl5lPj4+MTplPj4+MSk/LTMwNjY3NDkxMl5lPj4+MTplPj4+MSk/LTMwNjY3NDkxMl5lPj4+MTplPj4+MSk/LTMwNjY3NDkxMl5lPj4+MTplPj4+MSk/LTMwNjY3NDkxMl5lPj4+MTplPj4+MSk/LTMwNjY3NDkxMl5lPj4+MTplPj4+MSk/LTMwNjY3NDkxMl5lPj4+MTplPj4+MSx0W25dPWU7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBJbnQzMkFycmF5P25ldyBJbnQzMkFycmF5KHQpOnR9KCk7dmFyIG49ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPTAscj0wLGk9InVuZGVmaW5lZCIhPXR5cGVvZiBJbnQzMkFycmF5P25ldyBJbnQzMkFycmF5KDQwOTYpOm5ldyBBcnJheSg0MDk2KTtmb3Iocj0wOzI1NiE9cjsrK3IpaVtyXT1lW3JdO2ZvcihyPTA7MjU2IT1yOysrcilmb3Iobj1lW3JdLHQ9MjU2K3I7dDw0MDk2O3QrPTI1NiluPWlbdF09bj4+PjheZVsyNTUmbl07dmFyIGE9W107Zm9yKHI9MTsxNiE9cjsrK3IpYVtyLTFdPSJ1bmRlZmluZWQiIT10eXBlb2YgSW50MzJBcnJheSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuc3ViYXJyYXk/aS5zdWJhcnJheSgyNTYqciwyNTYqcisyNTYpOmkuc2xpY2UoMjU2KnIsMjU2KnIrMjU2KTtyZXR1cm4gYX0odCkscj1uWzBdLGk9blsxXSxhPW5bMl0sbz1uWzNdLGM9bls0XSxzPW5bNV0sbD1uWzZdLHU9bls3XSxmPW5bOF0sZD1uWzldLGg9blsxMF0scD1uWzExXSxnPW5bMTJdLG09blsxM10sYj1uWzE0XTtyZXR1cm4gZS50YWJsZT10LGUuYnN0cj1mdW5jdGlvbihlLG4pe2Zvcih2YXIgcj0tMV5uLGk9MCxhPWUubGVuZ3RoO2k8YTspcj1yPj4+OF50WzI1NSYocl5lLmNoYXJDb2RlQXQoaSsrKSldO3JldHVybn5yfSxlLmJ1Zj1mdW5jdGlvbihlLG4pe2Zvcih2YXIgeT0tMV5uLHY9ZS5sZW5ndGgtMTUseD0wO3g8djspeT1iW2VbeCsrXV4yNTUmeV1ebVtlW3grK11eeT4+OCYyNTVdXmdbZVt4KytdXnk+PjE2JjI1NV1ecFtlW3grK11eeT4+PjI0XV5oW2VbeCsrXV1eZFtlW3grK11dXmZbZVt4KytdXV51W2VbeCsrXV1ebFtlW3grK11dXnNbZVt4KytdXV5jW2VbeCsrXV1eb1tlW3grK11dXmFbZVt4KytdXV5pW2VbeCsrXV1ecltlW3grK11dXnRbZVt4KytdXTtmb3Iodis9MTU7eDx2Oyl5PXk+Pj44XnRbMjU1Jih5XmVbeCsrXSldO3JldHVybn55fSxlLnN0cj1mdW5jdGlvbihlLG4pe2Zvcih2YXIgcj0tMV5uLGk9MCxhPWUubGVuZ3RoLG89MCxjPTA7aTxhOykobz1lLmNoYXJDb2RlQXQoaSsrKSk8MTI4P3I9cj4+PjhedFsyNTUmKHJebyldOm88MjA0OD9yPShyPXI+Pj44XnRbMjU1JihyXigxOTJ8bz4+NiYzMSkpXSk+Pj44XnRbMjU1JihyXigxMjh8NjMmbykpXTpvPj01NTI5NiYmbzw1NzM0ND8obz02NCsoMTAyMyZvKSxjPTEwMjMmZS5jaGFyQ29kZUF0KGkrKykscj0ocj0ocj0ocj1yPj4+OF50WzI1NSYocl4oMjQwfG8+PjgmNykpXSk+Pj44XnRbMjU1JihyXigxMjh8bz4+MiY2MykpXSk+Pj44XnRbMjU1JihyXigxMjh8Yz4+NiYxNXwoMyZvKTw8NCkpXSk+Pj44XnRbMjU1JihyXigxMjh8NjMmYykpXSk6cj0ocj0ocj1yPj4+OF50WzI1NSYocl4oMjI0fG8+PjEyJjE1KSldKT4+PjhedFsyNTUmKHJeKDEyOHxvPj42JjYzKSldKT4+PjhedFsyNTUmKHJeKDEyOHw2MyZvKSldO3JldHVybn5yfSxlfSgpLEttPWZ1bmN0aW9uKCl7dmFyIGUsdD17fTtmdW5jdGlvbiBuKGUpe2lmKCIvIj09ZS5jaGFyQXQoZS5sZW5ndGgtMSkpcmV0dXJuLTE9PT1lLnNsaWNlKDAsLTEpLmluZGV4T2YoIi8iKT9lOm4oZS5zbGljZSgwLC0xKSk7dmFyIHQ9ZS5sYXN0SW5kZXhPZigiLyIpO3JldHVybi0xPT09dD9lOmUuc2xpY2UoMCx0KzEpfWZ1bmN0aW9uIHIoZSl7aWYoIi8iPT1lLmNoYXJBdChlLmxlbmd0aC0xKSlyZXR1cm4gcihlLnNsaWNlKDAsLTEpKTt2YXIgdD1lLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuLTE9PT10P2U6ZS5zbGljZSh0KzEpfWZ1bmN0aW9uIGkoZSx0KXsic3RyaW5nIj09dHlwZW9mIHQmJih0PW5ldyBEYXRlKHQpKTt2YXIgbj10LmdldEhvdXJzKCk7bj0obj1uPDw2fHQuZ2V0TWludXRlcygpKTw8NXx0LmdldFNlY29uZHMoKT4+PjEsZS53cml0ZV9zaGlmdCgyLG4pO3ZhciByPXQuZ2V0RnVsbFllYXIoKS0xOTgwO3I9KHI9cjw8NHx0LmdldE1vbnRoKCkrMSk8PDV8dC5nZXREYXRlKCksZS53cml0ZV9zaGlmdCgyLHIpfWZ1bmN0aW9uIGEoZSl7R3koZSwwKTtmb3IodmFyIHQ9e30sbj0wO2UubDw9ZS5sZW5ndGgtNDspe3ZhciByPWUucmVhZF9zaGlmdCgyKSxpPWUucmVhZF9zaGlmdCgyKSxhPWUubCtpLG89e307c3dpdGNoKHIpe2Nhc2UgMjE1ODk6MSYobj1lLnJlYWRfc2hpZnQoMSkpJiYoby5tdGltZT1lLnJlYWRfc2hpZnQoNCkpLGk+NSYmKDImbiYmKG8uYXRpbWU9ZS5yZWFkX3NoaWZ0KDQpKSw0Jm4mJihvLmN0aW1lPWUucmVhZF9zaGlmdCg0KSkpLG8ubXRpbWUmJihvLm10PW5ldyBEYXRlKDFlMypvLm10aW1lKSk7YnJlYWs7Y2FzZSAxOnZhciBjPWUucmVhZF9zaGlmdCg0KSxzPWUucmVhZF9zaGlmdCg0KTtvLnVzej1zKk1hdGgucG93KDIsMzIpK2MsYz1lLnJlYWRfc2hpZnQoNCkscz1lLnJlYWRfc2hpZnQoNCksby5jc3o9cypNYXRoLnBvdygyLDMyKStjfWUubD1hLHRbcl09b31yZXR1cm4gdH1mdW5jdGlvbiBvKCl7cmV0dXJuIGV8fChlPXVuZGVmaW5lZCl9ZnVuY3Rpb24gYyhlLHQpe2lmKDgwPT1lWzBdJiY3NT09ZVsxXSlyZXR1cm4gaWUoZSx0KTtpZigxMDk9PSgzMnxlWzBdKSYmMTA1PT0oMzJ8ZVsxXSkpcmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYoIm1pbWUtdmVyc2lvbjoiIT1UKGUuc2xpY2UoMCwxMykpLnRvTG93ZXJDYXNlKCkpdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBNQUQgaGVhZGVyIik7dmFyIG49dCYmdC5yb290fHwiIixyPShZZyYmQnVmZmVyLmlzQnVmZmVyKGUpP2UudG9TdHJpbmcoImJpbmFyeSIpOlQoZSkpLnNwbGl0KCJcclxuIiksaT0wLGE9IiI7Zm9yKGk9MDtpPHIubGVuZ3RoOysraSlpZihhPXJbaV0sL15Db250ZW50LUxvY2F0aW9uOi9pLnRlc3QoYSkmJihhPWEuc2xpY2UoYS5pbmRleE9mKCJmaWxlIikpLG58fChuPWEuc2xpY2UoMCxhLmxhc3RJbmRleE9mKCIvIikrMSkpLGEuc2xpY2UoMCxuLmxlbmd0aCkhPW4pKWZvcig7bi5sZW5ndGg+MCYmKG49KG49bi5zbGljZSgwLG4ubGVuZ3RoLTEpKS5zbGljZSgwLG4ubGFzdEluZGV4T2YoIi8iKSsxKSxhLnNsaWNlKDAsbi5sZW5ndGgpIT1uKTspO3ZhciBvPShyWzFdfHwiIikubWF0Y2goL2JvdW5kYXJ5PSIoLio/KSIvKTtpZighbyl0aHJvdyBuZXcgRXJyb3IoIk1BRCBjYW5ub3QgZmluZCBib3VuZGFyeSIpO3ZhciBjPSItLSIrKG9bMV18fCIiKSxzPVtdLGw9W10sdT17RmlsZUluZGV4OnMsRnVsbFBhdGhzOmx9O2QodSk7dmFyIGYsaD0wO2ZvcihpPTA7aTxyLmxlbmd0aDsrK2kpe3ZhciBwPXJbaV07cCE9PWMmJnAhPT1jKyItLSJ8fChoKysmJnVlKHUsci5zbGljZShmLGkpLG4pLGY9aSl9cmV0dXJuIHV9KGUsdCk7aWYoZS5sZW5ndGg8NTEyKXRocm93IG5ldyBFcnJvcigiQ0ZCIGZpbGUgc2l6ZSAiK2UubGVuZ3RoKyIgPCA1MTIiKTt2YXIgbixyLGksYSxvLGMsaD01MTIscD1bXSxnPWUuc2xpY2UoMCw1MTIpO0d5KGcsMCk7dmFyIG09ZnVuY3Rpb24oZSl7aWYoODA9PWVbZS5sXSYmNzU9PWVbZS5sKzFdKXJldHVyblswLDBdO2UuY2hrKHksIkhlYWRlciBTaWduYXR1cmU6ICIpLGUubCs9MTY7dmFyIHQ9ZS5yZWFkX3NoaWZ0KDIsInUiKTtyZXR1cm5bZS5yZWFkX3NoaWZ0KDIsInUiKSx0XX0oZyk7c3dpdGNoKG49bVswXSl7Y2FzZSAzOmg9NTEyO2JyZWFrO2Nhc2UgNDpoPTQwOTY7YnJlYWs7Y2FzZSAwOmlmKDA9PW1bMV0pcmV0dXJuIGllKGUsdCk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIk1ham9yIFZlcnNpb246IEV4cGVjdGVkIDMgb3IgNCBzYXcgIituKX01MTIhPT1oJiZHeShnPWUuc2xpY2UoMCxoKSwyOCk7dmFyIHY9ZS5zbGljZSgwLGgpOyFmdW5jdGlvbihlLHQpe3ZhciBuPTk7c3dpdGNoKGUubCs9MixuPWUucmVhZF9zaGlmdCgyKSl7Y2FzZSA5OmlmKDMhPXQpdGhyb3cgbmV3IEVycm9yKCJTZWN0b3IgU2hpZnQ6IEV4cGVjdGVkIDkgc2F3ICIrbik7YnJlYWs7Y2FzZSAxMjppZig0IT10KXRocm93IG5ldyBFcnJvcigiU2VjdG9yIFNoaWZ0OiBFeHBlY3RlZCAxMiBzYXcgIituKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiU2VjdG9yIFNoaWZ0OiBFeHBlY3RlZCA5IG9yIDEyIHNhdyAiK24pfWUuY2hrKCIwNjAwIiwiTWluaSBTZWN0b3IgU2hpZnQ6ICIpLGUuY2hrKCIwMDAwMDAwMDAwMDAiLCJSZXNlcnZlZDogIil9KGcsbik7dmFyIHg9Zy5yZWFkX3NoaWZ0KDQsImkiKTtpZigzPT09biYmMCE9PXgpdGhyb3cgbmV3IEVycm9yKCIjIERpcmVjdG9yeSBTZWN0b3JzOiBFeHBlY3RlZCAwIHNhdyAiK3gpO2cubCs9NCxhPWcucmVhZF9zaGlmdCg0LCJpIiksZy5sKz00LGcuY2hrKCIwMDEwMDAwMCIsIk1pbmkgU3RyZWFtIEN1dG9mZiBTaXplOiAiKSxvPWcucmVhZF9zaGlmdCg0LCJpIikscj1nLnJlYWRfc2hpZnQoNCwiaSIpLGM9Zy5yZWFkX3NoaWZ0KDQsImkiKSxpPWcucmVhZF9zaGlmdCg0LCJpIik7Zm9yKHZhciBEPS0xLHc9MDt3PDEwOSYmISgoRD1nLnJlYWRfc2hpZnQoNCwiaSIpKTwwKTsrK3cpcFt3XT1EO3ZhciBfPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPU1hdGguY2VpbChlLmxlbmd0aC90KS0xLHI9W10saT0xO2k8bjsrK2kpcltpLTFdPWUuc2xpY2UoaSp0LChpKzEpKnQpO3JldHVybiByW24tMV09ZS5zbGljZShuKnQpLHJ9KGUsaCk7bChjLGksXyxoLHApO3ZhciBFPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUubGVuZ3RoLGE9W10sbz1bXSxjPVtdLHM9W10sbD1yLTEsdT0wLGY9MCxkPTAsaD0wO2Zvcih1PTA7dTxpOysrdSlpZihjPVtdLChkPXUrdCk+PWkmJihkLT1pKSwhb1tkXSl7cz1bXTt2YXIgcD1bXTtmb3IoZj1kO2Y+PTA7KXtwW2ZdPSEwLG9bZl09ITAsY1tjLmxlbmd0aF09ZixzLnB1c2goZVtmXSk7dmFyIGc9bltNYXRoLmZsb29yKDQqZi9yKV07aWYocjw0KyhoPTQqZiZsKSl0aHJvdyBuZXcgRXJyb3IoIkZBVCBib3VuZGFyeSBjcm9zc2VkOiAiK2YrIiA0ICIrcik7aWYoIWVbZ10pYnJlYWs7aWYocFtmPVd5KGVbZ10saCldKWJyZWFrfWFbZF09e25vZGVzOmMsZGF0YTpweShbc10pfX1yZXR1cm4gYX0oXyxhLHAsaCk7YTxFLmxlbmd0aCYmKEVbYV0ubmFtZT0iIURpcmVjdG9yeSIpLHI+MCYmbyE9PWImJihFW29dLm5hbWU9IiFNaW5pRkFUIiksRVtwWzBdXS5uYW1lPSIhRkFUIixFLmZhdF9hZGRycz1wLEUuc3N6PWg7dmFyIFU9W10sQT1bXSxrPVtdOyFmdW5jdGlvbihlLHQsbixyLGksYSxvLGMpe2Zvcih2YXIgbCxkPTAsaD1yLmxlbmd0aD8yOjAscD10W2VdLmRhdGEsZz0wLG09MDtnPHAubGVuZ3RoO2crPTEyOCl7dmFyIHk9cC5zbGljZShnLGcrMTI4KTtHeSh5LDY0KSxtPXkucmVhZF9zaGlmdCgyKSxsPW15KHksMCxtLWgpLHIucHVzaChsKTt2YXIgdj17bmFtZTpsLHR5cGU6eS5yZWFkX3NoaWZ0KDEpLGNvbG9yOnkucmVhZF9zaGlmdCgxKSxMOnkucmVhZF9zaGlmdCg0LCJpIiksUjp5LnJlYWRfc2hpZnQoNCwiaSIpLEM6eS5yZWFkX3NoaWZ0KDQsImkiKSxjbHNpZDp5LnJlYWRfc2hpZnQoMTYpLHN0YXRlOnkucmVhZF9zaGlmdCg0LCJpIiksc3RhcnQ6MCxzaXplOjB9OzAhPT15LnJlYWRfc2hpZnQoMikreS5yZWFkX3NoaWZ0KDIpK3kucmVhZF9zaGlmdCgyKSt5LnJlYWRfc2hpZnQoMikmJih2LmN0PWYoeSx5LmwtOCkpLDAhPT15LnJlYWRfc2hpZnQoMikreS5yZWFkX3NoaWZ0KDIpK3kucmVhZF9zaGlmdCgyKSt5LnJlYWRfc2hpZnQoMikmJih2Lm10PWYoeSx5LmwtOCkpLHYuc3RhcnQ9eS5yZWFkX3NoaWZ0KDQsImkiKSx2LnNpemU9eS5yZWFkX3NoaWZ0KDQsImkiKSx2LnNpemU8MCYmdi5zdGFydDwwJiYodi5zaXplPXYudHlwZT0wLHYuc3RhcnQ9Yix2Lm5hbWU9IiIpLDU9PT12LnR5cGU/KGQ9di5zdGFydCxpPjAmJmQhPT1iJiYodFtkXS5uYW1lPSIhU3RyZWFtRGF0YSIpKTp2LnNpemU+PTQwOTY/KHYuc3RvcmFnZT0iZmF0Iix2b2lkIDA9PT10W3Yuc3RhcnRdJiYodFt2LnN0YXJ0XT11KG4sdi5zdGFydCx0LmZhdF9hZGRycyx0LnNzeikpLHRbdi5zdGFydF0ubmFtZT12Lm5hbWUsdi5jb250ZW50PXRbdi5zdGFydF0uZGF0YS5zbGljZSgwLHYuc2l6ZSkpOih2LnN0b3JhZ2U9Im1pbmlmYXQiLHYuc2l6ZTwwP3Yuc2l6ZT0wOmQhPT1iJiZ2LnN0YXJ0IT09YiYmdFtkXSYmKHYuY29udGVudD1zKHYsdFtkXS5kYXRhLCh0W2NdfHx7fSkuZGF0YSkpKSx2LmNvbnRlbnQmJkd5KHYuY29udGVudCwwKSxhW2xdPXYsby5wdXNoKHYpfX0oYSxFLF8sVSxyLHt9LEEsbyksZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wLGk9MCxhPTAsbz0wLGM9MCxzPW4ubGVuZ3RoLGw9W10sdT1bXTtyPHM7KytyKWxbcl09dVtyXT1yLHRbcl09bltyXTtmb3IoO2M8dS5sZW5ndGg7KytjKWk9ZVtyPXVbY11dLkwsYT1lW3JdLlIsbz1lW3JdLkMsbFtyXT09PXImJigtMSE9PWkmJmxbaV0hPT1pJiYobFtyXT1sW2ldKSwtMSE9PWEmJmxbYV0hPT1hJiYobFtyXT1sW2FdKSksLTEhPT1vJiYobFtvXT1yKSwtMSE9PWkmJnIhPWxbcl0mJihsW2ldPWxbcl0sdS5sYXN0SW5kZXhPZihpKTxjJiZ1LnB1c2goaSkpLC0xIT09YSYmciE9bFtyXSYmKGxbYV09bFtyXSx1Lmxhc3RJbmRleE9mKGEpPGMmJnUucHVzaChhKSk7Zm9yKHI9MTtyPHM7KytyKWxbcl09PT1yJiYoLTEhPT1hJiZsW2FdIT09YT9sW3JdPWxbYV06LTEhPT1pJiZsW2ldIT09aSYmKGxbcl09bFtpXSkpO2ZvcihyPTE7cjxzOysrcilpZigwIT09ZVtyXS50eXBlKXtpZigoYz1yKSE9bFtjXSlkb3tjPWxbY10sdFtyXT10W2NdKyIvIit0W3JdfXdoaWxlKDAhPT1jJiYtMSE9PWxbY10mJmMhPWxbY10pO2xbcl09LTF9Zm9yKHRbMF0rPSIvIixyPTE7cjxzOysrcikyIT09ZVtyXS50eXBlJiYodFtyXSs9Ii8iKX0oQSxrLFUpLFUuc2hpZnQoKTt2YXIgUz17RmlsZUluZGV4OkEsRnVsbFBhdGhzOmt9O3JldHVybiB0JiZ0LnJhdyYmKFMucmF3PXtoZWFkZXI6dixzZWN0b3JzOl99KSxTfWZ1bmN0aW9uIHMoZSx0LG4pe2Zvcih2YXIgcj1lLnN0YXJ0LGk9ZS5zaXplLGE9W10sbz1yO24mJmk+MCYmbz49MDspYS5wdXNoKHQuc2xpY2UobyptLG8qbSttKSksaS09bSxvPVd5KG4sNCpvKTtyZXR1cm4gMD09PWEubGVuZ3RoPyR5KDApOnJtKGEpLnNsaWNlKDAsZS5zaXplKX1mdW5jdGlvbiBsKGUsdCxuLHIsaSl7dmFyIGE9YjtpZihlPT09Yil7aWYoMCE9PXQpdGhyb3cgbmV3IEVycm9yKCJESUZBVCBjaGFpbiBzaG9ydGVyIHRoYW4gZXhwZWN0ZWQiKX1lbHNlIGlmKC0xIT09ZSl7dmFyIG89bltlXSxjPShyPj4+MiktMTtpZighbylyZXR1cm47Zm9yKHZhciBzPTA7czxjJiYoYT1XeShvLDQqcykpIT09YjsrK3MpaS5wdXNoKGEpO3Q+PTEmJmwoV3kobyxyLTQpLHQtMSxuLHIsaSl9fWZ1bmN0aW9uIHUoZSx0LG4scixpKXt2YXIgYT1bXSxvPVtdO2l8fChpPVtdKTt2YXIgYz1yLTEscz0wLGw9MDtmb3Iocz10O3M+PTA7KXtpW3NdPSEwLGFbYS5sZW5ndGhdPXMsby5wdXNoKGVbc10pO3ZhciB1PW5bTWF0aC5mbG9vcig0KnMvcildO2lmKHI8NCsobD00KnMmYykpdGhyb3cgbmV3IEVycm9yKCJGQVQgYm91bmRhcnkgY3Jvc3NlZDogIitzKyIgNCAiK3IpO2lmKCFlW3VdKWJyZWFrO3M9V3koZVt1XSxsKX1yZXR1cm57bm9kZXM6YSxkYXRhOnB5KFtvXSl9fWZ1bmN0aW9uIGYoZSx0KXtyZXR1cm4gbmV3IERhdGUoMWUzKihCeShlLHQrNCkvMWU3Kk1hdGgucG93KDIsMzIpK0J5KGUsdCkvMWU3LTExNjQ0NDczNjAwKSl9ZnVuY3Rpb24gZChlLHQpe3ZhciBuPXR8fHt9LHI9bi5yb290fHwiUm9vdCBFbnRyeSI7aWYoZS5GdWxsUGF0aHN8fChlLkZ1bGxQYXRocz1bXSksZS5GaWxlSW5kZXh8fChlLkZpbGVJbmRleD1bXSksZS5GdWxsUGF0aHMubGVuZ3RoIT09ZS5GaWxlSW5kZXgubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiaW5jb25zaXN0ZW50IENGQiBzdHJ1Y3R1cmUiKTswPT09ZS5GdWxsUGF0aHMubGVuZ3RoJiYoZS5GdWxsUGF0aHNbMF09cisiLyIsZS5GaWxlSW5kZXhbMF09e25hbWU6cix0eXBlOjV9KSxuLkNMU0lEJiYoZS5GaWxlSW5kZXhbMF0uY2xzaWQ9bi5DTFNJRCksZnVuY3Rpb24oZSl7dmFyIHQ9IgFTaDMzdEo1IjtpZihLbS5maW5kKGUsIi8iK3QpKXJldHVybjt2YXIgbj0keSg0KTtuWzBdPTU1LG5bMV09blszXT01MCxuWzJdPTU0LGUuRmlsZUluZGV4LnB1c2goe25hbWU6dCx0eXBlOjIsY29udGVudDpuLHNpemU6NCxMOjY5LFI6NjksQzo2OX0pLGUuRnVsbFBhdGhzLnB1c2goZS5GdWxsUGF0aHNbMF0rdCksaChlKX0oZSl9ZnVuY3Rpb24gaChlLHQpe2QoZSk7Zm9yKHZhciBpPSExLGE9ITEsbz1lLkZ1bGxQYXRocy5sZW5ndGgtMTtvPj0wOy0tbyl7dmFyIGM9ZS5GaWxlSW5kZXhbb107c3dpdGNoKGMudHlwZSl7Y2FzZSAwOmE/aT0hMDooZS5GaWxlSW5kZXgucG9wKCksZS5GdWxsUGF0aHMucG9wKCkpO2JyZWFrO2Nhc2UgMTpjYXNlIDI6Y2FzZSA1OmE9ITAsaXNOYU4oYy5SKmMuTCpjLkMpJiYoaT0hMCksYy5SPi0xJiZjLkw+LTEmJmMuUj09Yy5MJiYoaT0hMCk7YnJlYWs7ZGVmYXVsdDppPSEwfX1pZihpfHx0KXt2YXIgcz1uZXcgRGF0ZSgxOTg3LDEsMTkpLGw9MCx1PU9iamVjdC5jcmVhdGU/T2JqZWN0LmNyZWF0ZShudWxsKTp7fSxmPVtdO2ZvcihvPTA7bzxlLkZ1bGxQYXRocy5sZW5ndGg7KytvKXVbZS5GdWxsUGF0aHNbb11dPSEwLDAhPT1lLkZpbGVJbmRleFtvXS50eXBlJiZmLnB1c2goW2UuRnVsbFBhdGhzW29dLGUuRmlsZUluZGV4W29dXSk7Zm9yKG89MDtvPGYubGVuZ3RoOysrbyl7dmFyIGg9bihmW29dWzBdKTtmb3IoYT11W2hdOyFhOyl7Zm9yKDtuKGgpJiYhdVtuKGgpXTspaD1uKGgpO2YucHVzaChbaCx7bmFtZTpyKGgpLnJlcGxhY2UoIi8iLCIiKSx0eXBlOjEsY2xzaWQ6eCxjdDpzLG10OnMsY29udGVudDpudWxsfV0pLHVbaF09ITAsYT11W2g9bihmW29dWzBdKV19fWZvcihmLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUuc3BsaXQoIi8iKSxyPXQuc3BsaXQoIi8iKSxpPTAsYT0wLG89TWF0aC5taW4obi5sZW5ndGgsci5sZW5ndGgpO2k8bzsrK2kpe2lmKGE9bltpXS5sZW5ndGgtcltpXS5sZW5ndGgpcmV0dXJuIGE7aWYobltpXSE9cltpXSlyZXR1cm4gbltpXTxyW2ldPy0xOjF9cmV0dXJuIG4ubGVuZ3RoLXIubGVuZ3RofShlWzBdLHRbMF0pfSkpLGUuRnVsbFBhdGhzPVtdLGUuRmlsZUluZGV4PVtdLG89MDtvPGYubGVuZ3RoOysrbyllLkZ1bGxQYXRoc1tvXT1mW29dWzBdLGUuRmlsZUluZGV4W29dPWZbb11bMV07Zm9yKG89MDtvPGYubGVuZ3RoOysrbyl7dmFyIHA9ZS5GaWxlSW5kZXhbb10sZz1lLkZ1bGxQYXRoc1tvXTtpZihwLm5hbWU9cihnKS5yZXBsYWNlKCIvIiwiIikscC5MPXAuUj1wLkM9LShwLmNvbG9yPTEpLHAuc2l6ZT1wLmNvbnRlbnQ/cC5jb250ZW50Lmxlbmd0aDowLHAuc3RhcnQ9MCxwLmNsc2lkPXAuY2xzaWR8fHgsMD09PW8pcC5DPWYubGVuZ3RoPjE/MTotMSxwLnNpemU9MCxwLnR5cGU9NTtlbHNlIGlmKCIvIj09Zy5zbGljZSgtMSkpe2ZvcihsPW8rMTtsPGYubGVuZ3RoJiZuKGUuRnVsbFBhdGhzW2xdKSE9ZzsrK2wpO2ZvcihwLkM9bD49Zi5sZW5ndGg/LTE6bCxsPW8rMTtsPGYubGVuZ3RoJiZuKGUuRnVsbFBhdGhzW2xdKSE9bihnKTsrK2wpO3AuUj1sPj1mLmxlbmd0aD8tMTpsLHAudHlwZT0xfWVsc2UgbihlLkZ1bGxQYXRoc1tvKzFdfHwiIik9PW4oZykmJihwLlI9bysxKSxwLnR5cGU9Mn19fWZ1bmN0aW9uIHAoZSx0KXt2YXIgbj10fHx7fTtpZigibWFkIj09bi5maWxlVHlwZSlyZXR1cm4gZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dHx8e30scj1uLmJvdW5kYXJ5fHwiU2hlZXRKUyIsaT1bIk1JTUUtVmVyc2lvbjogMS4wIiwnQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvcmVsYXRlZDsgYm91bmRhcnk9IicrKHI9Ii0tLS0tLT0iK3IpLnNsaWNlKDIpKyciJywiIiwiIiwiIl0sYT1lLkZ1bGxQYXRoc1swXSxvPWEsYz1lLkZpbGVJbmRleFswXSxzPTE7czxlLkZ1bGxQYXRocy5sZW5ndGg7KytzKWlmKG89ZS5GdWxsUGF0aHNbc10uc2xpY2UoYS5sZW5ndGgpLChjPWUuRmlsZUluZGV4W3NdKS5zaXplJiZjLmNvbnRlbnQmJiIBU2gzM3RKNSIhPW8pe289by5yZXBsYWNlKC9bXHgwMC1ceDA4XHgwQlx4MENceDBFLVx4MUZceDdFLVx4RkZdL2csKGZ1bmN0aW9uKGUpe3JldHVybiJfeCIrZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSsiXyJ9KSkucmVwbGFjZSgvW1x1MDA4MC1cdUZGRkZdL2csKGZ1bmN0aW9uKGUpe3JldHVybiJfdSIrZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSsiXyJ9KSk7Zm9yKHZhciBsPWMuY29udGVudCx1PVlnJiZCdWZmZXIuaXNCdWZmZXIobCk/bC50b1N0cmluZygiYmluYXJ5Iik6VChsKSxmPTAsZD1NYXRoLm1pbigxMDI0LHUubGVuZ3RoKSxoPTAscD0wO3A8PWQ7KytwKShoPXUuY2hhckNvZGVBdChwKSk+PTMyJiZoPDEyOCYmKytmO3ZhciBnPWY+PTQqZC81O2kucHVzaChyKSxpLnB1c2goIkNvbnRlbnQtTG9jYXRpb246ICIrKG4ucm9vdHx8ImZpbGU6Ly8vQzovU2hlZXRKUy8iKStvKSxpLnB1c2goIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6ICIrKGc/InF1b3RlZC1wcmludGFibGUiOiJiYXNlNjQiKSksaS5wdXNoKCJDb250ZW50LVR5cGU6ICIrY2UoYyxvKSksaS5wdXNoKCIiKSxpLnB1c2goZz9sZSh1KTpzZSh1KSl9cmV0dXJuIGkucHVzaChyKyItLVxyXG4iKSxpLmpvaW4oIlxyXG4iKX0oZSxuKTtpZihoKGUpLCJ6aXAiPT09bi5maWxlVHlwZSlyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj10fHx7fSxyPVtdLGE9W10sbz0keSgxKSxjPW4uY29tcHJlc3Npb24/ODowLHM9MCxsPTAsdT0wLGY9MCxkPTAsaD1lLkZ1bGxQYXRoc1swXSxwPWgsZz1lLkZpbGVJbmRleFswXSxtPVtdLGI9MDtmb3IobD0xO2w8ZS5GdWxsUGF0aHMubGVuZ3RoOysrbClpZihwPWUuRnVsbFBhdGhzW2xdLnNsaWNlKGgubGVuZ3RoKSwoZz1lLkZpbGVJbmRleFtsXSkuc2l6ZSYmZy5jb250ZW50JiYiAVNoMzN0SjUiIT1wKXt2YXIgeT1mLHY9JHkocC5sZW5ndGgpO2Zvcih1PTA7dTxwLmxlbmd0aDsrK3Updi53cml0ZV9zaGlmdCgxLDEyNyZwLmNoYXJDb2RlQXQodSkpO3Y9di5zbGljZSgwLHYubCksbVtkXT0ic3RyaW5nIj09dHlwZW9mIGcuY29udGVudD9ZbS5ic3RyKGcuY29udGVudCwwKTpZbS5idWYoZy5jb250ZW50LDApO3ZhciB4PSJzdHJpbmciPT10eXBlb2YgZy5jb250ZW50P2VtKGcuY29udGVudCk6Zy5jb250ZW50Ozg9PWMmJih4PXcoeCkpLChvPSR5KDMwKSkud3JpdGVfc2hpZnQoNCw2NzMyNDc1Miksby53cml0ZV9zaGlmdCgyLDIwKSxvLndyaXRlX3NoaWZ0KDIscyksby53cml0ZV9zaGlmdCgyLGMpLGcubXQ/aShvLGcubXQpOm8ud3JpdGVfc2hpZnQoNCwwKSxvLndyaXRlX3NoaWZ0KC00LG1bZF0pLG8ud3JpdGVfc2hpZnQoNCx4Lmxlbmd0aCksby53cml0ZV9zaGlmdCg0LGcuY29udGVudC5sZW5ndGgpLG8ud3JpdGVfc2hpZnQoMix2Lmxlbmd0aCksby53cml0ZV9zaGlmdCgyLDApLGYrPW8ubGVuZ3RoLHIucHVzaChvKSxmKz12Lmxlbmd0aCxyLnB1c2godiksZis9eC5sZW5ndGgsci5wdXNoKHgpLChvPSR5KDQ2KSkud3JpdGVfc2hpZnQoNCwzMzYzOTI0OCksby53cml0ZV9zaGlmdCgyLDApLG8ud3JpdGVfc2hpZnQoMiwyMCksby53cml0ZV9zaGlmdCgyLHMpLG8ud3JpdGVfc2hpZnQoMixjKSxvLndyaXRlX3NoaWZ0KDQsMCksby53cml0ZV9zaGlmdCgtNCxtW2RdKSxvLndyaXRlX3NoaWZ0KDQseC5sZW5ndGgpLG8ud3JpdGVfc2hpZnQoNCxnLmNvbnRlbnQubGVuZ3RoKSxvLndyaXRlX3NoaWZ0KDIsdi5sZW5ndGgpLG8ud3JpdGVfc2hpZnQoMiwwKSxvLndyaXRlX3NoaWZ0KDIsMCksby53cml0ZV9zaGlmdCgyLDApLG8ud3JpdGVfc2hpZnQoMiwwKSxvLndyaXRlX3NoaWZ0KDQsMCksby53cml0ZV9zaGlmdCg0LHkpLGIrPW8ubCxhLnB1c2gobyksYis9di5sZW5ndGgsYS5wdXNoKHYpLCsrZH1yZXR1cm4gbz0keSgyMiksby53cml0ZV9zaGlmdCg0LDEwMTAxMDI1Niksby53cml0ZV9zaGlmdCgyLDApLG8ud3JpdGVfc2hpZnQoMiwwKSxvLndyaXRlX3NoaWZ0KDIsZCksby53cml0ZV9zaGlmdCgyLGQpLG8ud3JpdGVfc2hpZnQoNCxiKSxvLndyaXRlX3NoaWZ0KDQsZiksby53cml0ZV9zaGlmdCgyLDApLHJtKFtybShyKSxybShhKSxvXSl9KGUsbik7dmFyIHI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj0wLHI9MDtyPGUuRmlsZUluZGV4Lmxlbmd0aDsrK3Ipe3ZhciBpPWUuRmlsZUluZGV4W3JdO2lmKGkuY29udGVudCl7dmFyIGE9aS5jb250ZW50Lmxlbmd0aDthPjAmJihhPDQwOTY/dCs9YSs2Mz4+NjpuKz1hKzUxMT4+OSl9fWZvcih2YXIgbz1lLkZ1bGxQYXRocy5sZW5ndGgrMz4+MixjPXQrMTI3Pj43LHM9KHQrNz4+MykrbitvK2MsbD1zKzEyNz4+Nyx1PWw8PTEwOT8wOk1hdGguY2VpbCgobC0xMDkpLzEyNyk7cytsK3UrMTI3Pj43Pmw7KXU9KytsPD0xMDk/MDpNYXRoLmNlaWwoKGwtMTA5KS8xMjcpO3ZhciBmPVsxLHUsbCxjLG8sbix0LDBdO3JldHVybiBlLkZpbGVJbmRleFswXS5zaXplPXQ8PDYsZls3XT0oZS5GaWxlSW5kZXhbMF0uc3RhcnQ9ZlswXStmWzFdK2ZbMl0rZlszXStmWzRdK2ZbNV0pKyhmWzZdKzc+PjMpLGZ9KGUpLGE9JHkocls3XTw8OSksbz0wLGM9MDtmb3Iobz0wO288ODsrK28pYS53cml0ZV9zaGlmdCgxLHZbb10pO2ZvcihvPTA7bzw4OysrbylhLndyaXRlX3NoaWZ0KDIsMCk7Zm9yKGEud3JpdGVfc2hpZnQoMiw2MiksYS53cml0ZV9zaGlmdCgyLDMpLGEud3JpdGVfc2hpZnQoMiw2NTUzNCksYS53cml0ZV9zaGlmdCgyLDkpLGEud3JpdGVfc2hpZnQoMiw2KSxvPTA7bzwzOysrbylhLndyaXRlX3NoaWZ0KDIsMCk7Zm9yKGEud3JpdGVfc2hpZnQoNCwwKSxhLndyaXRlX3NoaWZ0KDQsclsyXSksYS53cml0ZV9zaGlmdCg0LHJbMF0rclsxXStyWzJdK3JbM10tMSksYS53cml0ZV9zaGlmdCg0LDApLGEud3JpdGVfc2hpZnQoNCw0MDk2KSxhLndyaXRlX3NoaWZ0KDQsclszXT9yWzBdK3JbMV0rclsyXS0xOmIpLGEud3JpdGVfc2hpZnQoNCxyWzNdKSxhLndyaXRlX3NoaWZ0KC00LHJbMV0/clswXS0xOmIpLGEud3JpdGVfc2hpZnQoNCxyWzFdKSxvPTA7bzwxMDk7KytvKWEud3JpdGVfc2hpZnQoLTQsbzxyWzJdP3JbMV0rbzotMSk7aWYoclsxXSlmb3IoYz0wO2M8clsxXTsrK2Mpe2Zvcig7bzwyMzYrMTI3KmM7KytvKWEud3JpdGVfc2hpZnQoLTQsbzxyWzJdP3JbMV0rbzotMSk7YS53cml0ZV9zaGlmdCgtNCxjPT09clsxXS0xP2I6YysxKX12YXIgcz1mdW5jdGlvbihlKXtmb3IoYys9ZTtvPGMtMTsrK28pYS53cml0ZV9zaGlmdCgtNCxvKzEpO2UmJigrK28sYS53cml0ZV9zaGlmdCgtNCxiKSl9O2ZvcihjPW89MCxjKz1yWzFdO288YzsrK28pYS53cml0ZV9zaGlmdCgtNCxELkRJRlNFQ1QpO2ZvcihjKz1yWzJdO288YzsrK28pYS53cml0ZV9zaGlmdCgtNCxELkZBVFNFQ1QpO3MoclszXSkscyhyWzRdKTtmb3IodmFyIGw9MCx1PTAsZj1lLkZpbGVJbmRleFswXTtsPGUuRmlsZUluZGV4Lmxlbmd0aDsrK2wpKGY9ZS5GaWxlSW5kZXhbbF0pLmNvbnRlbnQmJigodT1mLmNvbnRlbnQubGVuZ3RoKTw0MDk2fHwoZi5zdGFydD1jLHModSs1MTE+PjkpKSk7Zm9yKHMocls2XSs3Pj4zKTs1MTEmYS5sOylhLndyaXRlX3NoaWZ0KC00LEQuRU5ET0ZDSEFJTik7Zm9yKGM9bz0wLGw9MDtsPGUuRmlsZUluZGV4Lmxlbmd0aDsrK2wpKGY9ZS5GaWxlSW5kZXhbbF0pLmNvbnRlbnQmJighKHU9Zi5jb250ZW50Lmxlbmd0aCl8fHU+PTQwOTZ8fChmLnN0YXJ0PWMscyh1KzYzPj42KSkpO2Zvcig7NTExJmEubDspYS53cml0ZV9zaGlmdCgtNCxELkVORE9GQ0hBSU4pO2ZvcihvPTA7bzxyWzRdPDwyOysrbyl7dmFyIGQ9ZS5GdWxsUGF0aHNbb107aWYoZCYmMCE9PWQubGVuZ3RoKXtmPWUuRmlsZUluZGV4W29dLDA9PT1vJiYoZi5zdGFydD1mLnNpemU/Zi5zdGFydC0xOmIpO3ZhciBwPTA9PT1vJiZuLnJvb3R8fGYubmFtZTtpZihwLmxlbmd0aD4zMiYmKGNvbnNvbGUuZXJyb3IoIk5hbWUgIitwKyIgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gIitwLnNsaWNlKDAsMzIpKSxwPXAuc2xpY2UoMCwzMikpLHU9MioocC5sZW5ndGgrMSksYS53cml0ZV9zaGlmdCg2NCxwLCJ1dGYxNmxlIiksYS53cml0ZV9zaGlmdCgyLHUpLGEud3JpdGVfc2hpZnQoMSxmLnR5cGUpLGEud3JpdGVfc2hpZnQoMSxmLmNvbG9yKSxhLndyaXRlX3NoaWZ0KC00LGYuTCksYS53cml0ZV9zaGlmdCgtNCxmLlIpLGEud3JpdGVfc2hpZnQoLTQsZi5DKSxmLmNsc2lkKWEud3JpdGVfc2hpZnQoMTYsZi5jbHNpZCwiaGV4Iik7ZWxzZSBmb3IobD0wO2w8NDsrK2wpYS53cml0ZV9zaGlmdCg0LDApO2Eud3JpdGVfc2hpZnQoNCxmLnN0YXRlfHwwKSxhLndyaXRlX3NoaWZ0KDQsMCksYS53cml0ZV9zaGlmdCg0LDApLGEud3JpdGVfc2hpZnQoNCwwKSxhLndyaXRlX3NoaWZ0KDQsMCksYS53cml0ZV9zaGlmdCg0LGYuc3RhcnQpLGEud3JpdGVfc2hpZnQoNCxmLnNpemUpLGEud3JpdGVfc2hpZnQoNCwwKX1lbHNle2ZvcihsPTA7bDwxNzsrK2wpYS53cml0ZV9zaGlmdCg0LDApO2ZvcihsPTA7bDwzOysrbClhLndyaXRlX3NoaWZ0KDQsLTEpO2ZvcihsPTA7bDwxMjsrK2wpYS53cml0ZV9zaGlmdCg0LDApfX1mb3Iobz0xO288ZS5GaWxlSW5kZXgubGVuZ3RoOysrbylpZigoZj1lLkZpbGVJbmRleFtvXSkuc2l6ZT49NDA5NilpZihhLmw9Zi5zdGFydCsxPDw5LFlnJiZCdWZmZXIuaXNCdWZmZXIoZi5jb250ZW50KSlmLmNvbnRlbnQuY29weShhLGEubCwwLGYuc2l6ZSksYS5sKz1mLnNpemUrNTExJi01MTI7ZWxzZXtmb3IobD0wO2w8Zi5zaXplOysrbClhLndyaXRlX3NoaWZ0KDEsZi5jb250ZW50W2xdKTtmb3IoOzUxMSZsOysrbClhLndyaXRlX3NoaWZ0KDEsMCl9Zm9yKG89MTtvPGUuRmlsZUluZGV4Lmxlbmd0aDsrK28paWYoKGY9ZS5GaWxlSW5kZXhbb10pLnNpemU+MCYmZi5zaXplPDQwOTYpaWYoWWcmJkJ1ZmZlci5pc0J1ZmZlcihmLmNvbnRlbnQpKWYuY29udGVudC5jb3B5KGEsYS5sLDAsZi5zaXplKSxhLmwrPWYuc2l6ZSs2MyYtNjQ7ZWxzZXtmb3IobD0wO2w8Zi5zaXplOysrbClhLndyaXRlX3NoaWZ0KDEsZi5jb250ZW50W2xdKTtmb3IoOzYzJmw7KytsKWEud3JpdGVfc2hpZnQoMSwwKX1pZihZZylhLmw9YS5sZW5ndGg7ZWxzZSBmb3IoO2EubDxhLmxlbmd0aDspYS53cml0ZV9zaGlmdCgxLDApO3JldHVybiBhfXQudmVyc2lvbj0iMS4yLjIiO3ZhciBnLG09NjQsYj0tMix5PSJkMGNmMTFlMGExYjExYWUxIix2PVsyMDgsMjA3LDE3LDIyNCwxNjEsMTc3LDI2LDIyNV0seD0iMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLEQ9e01BWFJFR1NFQ1Q6LTYsRElGU0VDVDotNCxGQVRTRUNUOi0zLEVORE9GQ0hBSU46YixGUkVFU0VDVDotMSxIRUFERVJfU0lHTkFUVVJFOnksSEVBREVSX01JTk9SX1ZFUlNJT046IjNlMDAiLE1BWFJFR1NJRDotNixOT1NUUkVBTTotMSxIRUFERVJfQ0xTSUQ6eCxFbnRyeVR5cGVzOlsidW5rbm93biIsInN0b3JhZ2UiLCJzdHJlYW0iLCJsb2NrYnl0ZXMiLCJwcm9wZXJ0eSIsInJvb3QiXX07ZnVuY3Rpb24gVChlKXtmb3IodmFyIHQ9bmV3IEFycmF5KGUubGVuZ3RoKSxuPTA7bjxlLmxlbmd0aDsrK24pdFtuXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbbl0pO3JldHVybiB0LmpvaW4oIiIpfWZ1bmN0aW9uIHcoZSl7cmV0dXJuIGc/Zy5kZWZsYXRlUmF3U3luYyhlKTpZKGUpfXZhciBfPVsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSxFPVszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4XSxVPVsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzddO2Zvcih2YXIgQSxrLFM9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5LEM9Uz9uZXcgVWludDhBcnJheSgyNTYpOltdLEY9MDtGPDI1NjsrK0YpQ1tGXT0oaz12b2lkIDAsMjU1Jigoaz0xMzk1MzYmKChBPUYpPDwxfEE8PDExKXw1NTgxNDQmKEE8PDV8QTw8MTUpKT4+MTZ8az4+OHxrKSk7ZnVuY3Rpb24gTyhlLHQpe3ZhciBuPUNbMjU1JmVdO3JldHVybiB0PD04P24+Pj44LXQ6KG49bjw8OHxDW2U+PjgmMjU1XSx0PD0xNj9uPj4+MTYtdDoobj1uPDw4fENbZT4+MTYmMjU1XSk+Pj4yNC10KX1mdW5jdGlvbiBJKGUsdCl7dmFyIG49NyZ0LHI9dD4+PjM7cmV0dXJuKGVbcl18KG48PTY/MDplW3IrMV08PDgpKT4+Pm4mM31mdW5jdGlvbiBSKGUsdCl7dmFyIG49NyZ0LHI9dD4+PjM7cmV0dXJuKGVbcl18KG48PTU/MDplW3IrMV08PDgpKT4+Pm4mN31mdW5jdGlvbiBOKGUsdCl7dmFyIG49NyZ0LHI9dD4+PjM7cmV0dXJuKGVbcl18KG48PTM/MDplW3IrMV08PDgpKT4+Pm4mMzF9ZnVuY3Rpb24gUChlLHQpe3ZhciBuPTcmdCxyPXQ+Pj4zO3JldHVybihlW3JdfChuPD0xPzA6ZVtyKzFdPDw4KSk+Pj5uJjEyN31mdW5jdGlvbiBCKGUsdCxuKXt2YXIgcj03JnQsaT10Pj4+MyxhPSgxPDxuKS0xLG89ZVtpXT4+PnI7cmV0dXJuIG48OC1yP28mYToob3w9ZVtpKzFdPDw4LXIsbjwxNi1yP28mYToob3w9ZVtpKzJdPDwxNi1yLG48MjQtcj9vJmE6KG98PWVbaSszXTw8MjQtcikmYSkpfWZ1bmN0aW9uIFcoZSx0LG4pe3ZhciByPTcmdCxpPXQ+Pj4zO3JldHVybiByPD01P2VbaV18PSg3Jm4pPDxyOihlW2ldfD1uPDxyJjI1NSxlW2krMV09KDcmbik+PjgtciksdCszfWZ1bmN0aW9uIEwoZSx0LG4pe3JldHVybiBuPSgxJm4pPDwoNyZ0KSxlW3Q+Pj4zXXw9bix0KzF9ZnVuY3Rpb24gTShlLHQsbil7dmFyIHI9dD4+PjM7cmV0dXJuIG48PD03JnQsZVtyXXw9MjU1Jm4sbj4+Pj04LGVbcisxXT1uLHQrOH1mdW5jdGlvbiBqKGUsdCxuKXt2YXIgcj10Pj4+MztyZXR1cm4gbjw8PTcmdCxlW3JdfD0yNTUmbixuPj4+PTgsZVtyKzFdPTI1NSZuLGVbcisyXT1uPj4+OCx0KzE2fWZ1bmN0aW9uIHooZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTIqbj50PzIqbjp0KzUsaT0wO2lmKG4+PXQpcmV0dXJuIGU7aWYoWWcpe3ZhciBhPVFnKHIpO2lmKGUuY29weSllLmNvcHkoYSk7ZWxzZSBmb3IoO2k8ZS5sZW5ndGg7KytpKWFbaV09ZVtpXTtyZXR1cm4gYX1pZihTKXt2YXIgbz1uZXcgVWludDhBcnJheShyKTtpZihvLnNldClvLnNldChlKTtlbHNlIGZvcig7aTxuOysraSlvW2ldPWVbaV07cmV0dXJuIG99cmV0dXJuIGUubGVuZ3RoPXIsZX1mdW5jdGlvbiBIKGUpe2Zvcih2YXIgdD1uZXcgQXJyYXkoZSksbj0wO248ZTsrK24pdFtuXT0wO3JldHVybiB0fWZ1bmN0aW9uIFYoZSx0LG4pe3ZhciByPTEsaT0wLGE9MCxvPTAsYz0wLHM9ZS5sZW5ndGgsbD1TP25ldyBVaW50MTZBcnJheSgzMik6SCgzMik7Zm9yKGE9MDthPDMyOysrYSlsW2FdPTA7Zm9yKGE9czthPG47KythKWVbYV09MDtzPWUubGVuZ3RoO3ZhciB1PVM/bmV3IFVpbnQxNkFycmF5KHMpOkgocyk7Zm9yKGE9MDthPHM7KythKWxbaT1lW2FdXSsrLHI8aSYmKHI9aSksdVthXT0wO2ZvcihsWzBdPTAsYT0xO2E8PXI7KythKWxbYSsxNl09Yz1jK2xbYS0xXTw8MTtmb3IoYT0wO2E8czsrK2EpMCE9KGM9ZVthXSkmJih1W2FdPWxbYysxNl0rKyk7dmFyIGY9MDtmb3IoYT0wO2E8czsrK2EpaWYoMCE9KGY9ZVthXSkpZm9yKGM9Tyh1W2FdLHIpPj5yLWYsbz0oMTw8cis0LWYpLTE7bz49MDstLW8pdFtjfG88PGZdPTE1JmZ8YTw8NDtyZXR1cm4gcn12YXIgcT1TP25ldyBVaW50MTZBcnJheSg1MTIpOkgoNTEyKSxHPVM/bmV3IFVpbnQxNkFycmF5KDMyKTpIKDMyKTtpZighUyl7Zm9yKHZhciBYPTA7WDw1MTI7KytYKXFbWF09MDtmb3IoWD0wO1g8MzI7KytYKUdbWF09MH0hZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8MzI7dCsrKWUucHVzaCg1KTtWKGUsRywzMik7dmFyIG49W107Zm9yKHQ9MDt0PD0xNDM7dCsrKW4ucHVzaCg4KTtmb3IoO3Q8PTI1NTt0Kyspbi5wdXNoKDkpO2Zvcig7dDw9Mjc5O3QrKyluLnB1c2goNyk7Zm9yKDt0PD0yODc7dCsrKW4ucHVzaCg4KTtWKG4scSwyODgpfSgpO3ZhciAkPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVM/bmV3IFVpbnQ4QXJyYXkoMzI3NjgpOltdLHQ9MCxuPTA7dDxVLmxlbmd0aC0xOysrdClmb3IoO248VVt0KzFdOysrbillW25dPXQ7Zm9yKDtuPDMyNzY4OysrbillW25dPTI5O3ZhciByPVM/bmV3IFVpbnQ4QXJyYXkoMjU5KTpbXTtmb3IodD0wLG49MDt0PEUubGVuZ3RoLTE7Kyt0KWZvcig7bjxFW3QrMV07KytuKXJbbl09dDtyZXR1cm4gZnVuY3Rpb24odCxuKXtyZXR1cm4gdC5sZW5ndGg8OD9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7KXt2YXIgcj1NYXRoLm1pbig2NTUzNSxlLmxlbmd0aC1uKSxpPW4rcj09ZS5sZW5ndGg7Zm9yKHQud3JpdGVfc2hpZnQoMSwraSksdC53cml0ZV9zaGlmdCgyLHIpLHQud3JpdGVfc2hpZnQoMiw2NTUzNSZ+cik7ci0tID4wOyl0W3QubCsrXT1lW24rK119cmV0dXJuIHQubH0odCxuKTpmdW5jdGlvbih0LG4pe2Zvcih2YXIgaT0wLGE9MCxvPVM/bmV3IFVpbnQxNkFycmF5KDMyNzY4KTpbXTthPHQubGVuZ3RoOyl7dmFyIGM9TWF0aC5taW4oNjU1MzUsdC5sZW5ndGgtYSk7aWYoYzwxMCl7Zm9yKDcmKGk9VyhuLGksKyEoYStjIT10Lmxlbmd0aCkpKSYmKGkrPTgtKDcmaSkpLG4ubD1pLzh8MCxuLndyaXRlX3NoaWZ0KDIsYyksbi53cml0ZV9zaGlmdCgyLDY1NTM1Jn5jKTtjLS0gPjA7KW5bbi5sKytdPXRbYSsrXTtpPTgqbi5sfWVsc2V7aT1XKG4saSwrIShhK2MhPXQubGVuZ3RoKSsyKTtmb3IodmFyIHM9MDtjLS0gPjA7KXt2YXIgbD10W2FdLHU9LTEsZj0wO2lmKCh1PW9bcz0zMjc2NyYoczw8NV5sKV0pJiYoKHV8PS0zMjc2OCZhKT5hJiYodS09MzI3NjgpLHU8YSkpZm9yKDt0W3UrZl09PXRbYStmXSYmZjwyNTA7KSsrZjtpZihmPjIpeyhsPXJbZl0pPD0yMj9pPU0obixpLENbbCsxXT4+MSktMTooTShuLGksMyksTShuLGkrPTUsQ1tsLTIzXT4+NSksaSs9Myk7dmFyIGQ9bDw4PzA6bC00Pj4yO2Q+MCYmKGoobixpLGYtRVtsXSksaSs9ZCksbD1lW2EtdV0saT1NKG4saSxDW2xdPj4zKSxpLT0zO3ZhciBoPWw8ND8wOmwtMj4+MTtoPjAmJihqKG4saSxhLXUtVVtsXSksaSs9aCk7Zm9yKHZhciBwPTA7cDxmOysrcClvW3NdPTMyNzY3JmEscz0zMjc2NyYoczw8NV50W2FdKSwrK2E7Yy09Zi0xfWVsc2UgbDw9MTQzP2wrPTQ4Omk9TChuLGksMSksaT1NKG4saSxDW2xdKSxvW3NdPTMyNzY3JmEsKythfWk9TShuLGksMCktMX19cmV0dXJuIG4ubD0oaSs3KS84fDAsbi5sfSh0LG4pfX0oKTtmdW5jdGlvbiBZKGUpe3ZhciB0PSR5KDUwK01hdGguZmxvb3IoMS4xKmUubGVuZ3RoKSksbj0kKGUsdCk7cmV0dXJuIHQuc2xpY2UoMCxuKX12YXIgSz1TP25ldyBVaW50MTZBcnJheSgzMjc2OCk6SCgzMjc2OCksWj1TP25ldyBVaW50MTZBcnJheSgzMjc2OCk6SCgzMjc2OCksSj1TP25ldyBVaW50MTZBcnJheSgxMjgpOkgoMTI4KSxRPTEsZWU9MTtmdW5jdGlvbiB0ZShlLHQpe3ZhciBuPU4oZSx0KSsyNTcscj1OKGUsdCs9NSkrMSxpPWZ1bmN0aW9uKGUsdCl7dmFyIG49NyZ0LHI9dD4+PjM7cmV0dXJuKGVbcl18KG48PTQ/MDplW3IrMV08PDgpKT4+Pm4mMTV9KGUsdCs9NSkrNDt0Kz00O2Zvcih2YXIgYT0wLG89Uz9uZXcgVWludDhBcnJheSgxOSk6SCgxOSksYz1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0scz0xLGw9Uz9uZXcgVWludDhBcnJheSg4KTpIKDgpLHU9Uz9uZXcgVWludDhBcnJheSg4KTpIKDgpLGY9by5sZW5ndGgsZD0wO2Q8aTsrK2Qpb1tfW2RdXT1hPVIoZSx0KSxzPGEmJihzPWEpLGxbYV0rKyx0Kz0zO3ZhciBoPTA7Zm9yKGxbMF09MCxkPTE7ZDw9czsrK2QpdVtkXT1oPWgrbFtkLTFdPDwxO2ZvcihkPTA7ZDxmOysrZCkwIT0oaD1vW2RdKSYmKGNbZF09dVtoXSsrKTt2YXIgcD0wO2ZvcihkPTA7ZDxmOysrZClpZigwIT0ocD1vW2RdKSl7aD1DW2NbZF1dPj44LXA7Zm9yKHZhciBnPSgxPDw3LXApLTE7Zz49MDstLWcpSltofGc8PHBdPTcmcHxkPDwzfXZhciBtPVtdO2ZvcihzPTE7bS5sZW5ndGg8bityOylzd2l0Y2godCs9NyYoaD1KW1AoZSx0KV0pLGg+Pj49Myl7Y2FzZSAxNjpmb3IoYT0zK0koZSx0KSx0Kz0yLGg9bVttLmxlbmd0aC0xXTthLS0gPjA7KW0ucHVzaChoKTticmVhaztjYXNlIDE3OmZvcihhPTMrUihlLHQpLHQrPTM7YS0tID4wOyltLnB1c2goMCk7YnJlYWs7Y2FzZSAxODpmb3IoYT0xMStQKGUsdCksdCs9NzthLS0gPjA7KW0ucHVzaCgwKTticmVhaztkZWZhdWx0Om0ucHVzaChoKSxzPGgmJihzPWgpfXZhciBiPW0uc2xpY2UoMCxuKSx5PW0uc2xpY2Uobik7Zm9yKGQ9bjtkPDI4NjsrK2QpYltkXT0wO2ZvcihkPXI7ZDwzMDsrK2QpeVtkXT0wO3JldHVybiBRPVYoYixLLDI4NiksZWU9Vih5LFosMzApLHR9ZnVuY3Rpb24gbmUoZSx0KXt2YXIgbj1mdW5jdGlvbihlLHQpe2lmKDM9PWVbMF0mJiEoMyZlWzFdKSlyZXR1cm5bSmcodCksMl07Zm9yKHZhciBuPTAscj0wLGk9UWcodHx8MTw8MTgpLGE9MCxvPWkubGVuZ3RoPj4+MCxjPTAscz0wOzA9PSgxJnIpOylpZihyPVIoZSxuKSxuKz0zLHI+Pj4xIT0wKWZvcihyPj4xPT0xPyhjPTkscz01KToobj10ZShlLG4pLGM9USxzPWVlKTs7KXshdCYmbzxhKzMyNzY3JiYobz0oaT16KGksYSszMjc2NykpLmxlbmd0aCk7dmFyIGw9QihlLG4sYyksdT1yPj4+MT09MT9xW2xdOktbbF07aWYobis9MTUmdSwwPT0oKHU+Pj49NCk+Pj44JjI1NSkpaVthKytdPXU7ZWxzZXtpZigyNTY9PXUpYnJlYWs7dmFyIGY9KHUtPTI1Nyk8OD8wOnUtND4+MjtmPjUmJihmPTApO3ZhciBkPWErRVt1XTtmPjAmJihkKz1CKGUsbixmKSxuKz1mKSxsPUIoZSxuLHMpLG4rPTE1Jih1PXI+Pj4xPT0xP0dbbF06WltsXSk7dmFyIGg9KHU+Pj49NCk8ND8wOnUtMj4+MSxwPVVbdV07Zm9yKGg+MCYmKHArPUIoZSxuLGgpLG4rPWgpLCF0JiZvPGQmJihvPShpPXooaSxkKzEwMCkpLmxlbmd0aCk7YTxkOylpW2FdPWlbYS1wXSwrK2F9fWVsc2V7NyZuJiYobis9OC0oNyZuKSk7dmFyIGc9ZVtuPj4+M118ZVsxKyhuPj4+MyldPDw4O2lmKG4rPTMyLGc+MClmb3IoIXQmJm88YStnJiYobz0oaT16KGksYStnKSkubGVuZ3RoKTtnLS0gPjA7KWlbYSsrXT1lW24+Pj4zXSxuKz04fXJldHVybiB0P1tpLG4rNz4+PjNdOltpLnNsaWNlKDAsYSksbis3Pj4+M119KGUuc2xpY2UoZS5sfHwwKSx0KTtyZXR1cm4gZS5sKz1uWzFdLG5bMF19ZnVuY3Rpb24gcmUoZSx0KXtpZighZSl0aHJvdyBuZXcgRXJyb3IodCk7InVuZGVmaW5lZCIhPXR5cGVvZiBjb25zb2xlJiZjb25zb2xlLmVycm9yKHQpfWZ1bmN0aW9uIGllKGUsdCl7dmFyIG49ZTtHeShuLDApO3ZhciByPXtGaWxlSW5kZXg6W10sRnVsbFBhdGhzOltdfTtkKHIse3Jvb3Q6dC5yb290fSk7Zm9yKHZhciBpPW4ubGVuZ3RoLTQ7KDgwIT1uW2ldfHw3NSE9bltpKzFdfHw1IT1uW2krMl18fDYhPW5baSszXSkmJmk+PTA7KS0taTtuLmw9aSs0LG4ubCs9NDt2YXIgbz1uLnJlYWRfc2hpZnQoMik7bi5sKz02O3ZhciBjPW4ucmVhZF9zaGlmdCg0KTtmb3Iobi5sPWMsaT0wO2k8bzsrK2kpe24ubCs9MjA7dmFyIHM9bi5yZWFkX3NoaWZ0KDQpLGw9bi5yZWFkX3NoaWZ0KDQpLHU9bi5yZWFkX3NoaWZ0KDIpLGY9bi5yZWFkX3NoaWZ0KDIpLGg9bi5yZWFkX3NoaWZ0KDIpO24ubCs9ODt2YXIgcD1uLnJlYWRfc2hpZnQoNCksZz1hKG4uc2xpY2Uobi5sK3Usbi5sK3UrZikpO24ubCs9dStmK2g7dmFyIG09bi5sO24ubD1wKzQsZyYmZ1sxXSYmKChnWzFdfHx7fSkudXN6JiYobD1nWzFdLnVzeiksKGdbMV18fHt9KS5jc3omJihzPWdbMV0uY3N6KSksYWUobixzLGwscixnKSxuLmw9bX1yZXR1cm4gcn1mdW5jdGlvbiBhZShlLHQsbixyLGkpe2UubCs9Mjt2YXIgbz1lLnJlYWRfc2hpZnQoMiksYz1lLnJlYWRfc2hpZnQoMikscz1mdW5jdGlvbihlKXt2YXIgdD02NTUzNSZlLnJlYWRfc2hpZnQoMiksbj02NTUzNSZlLnJlYWRfc2hpZnQoMikscj1uZXcgRGF0ZSxpPTMxJm4sYT0xNSYobj4+Pj01KTtuPj4+PTQsci5zZXRNaWxsaXNlY29uZHMoMCksci5zZXRGdWxsWWVhcihuKzE5ODApLHIuc2V0TW9udGgoYS0xKSxyLnNldERhdGUoaSk7dmFyIG89MzEmdCxjPTYzJih0Pj4+PTUpO3JldHVybiB0Pj4+PTYsci5zZXRIb3Vycyh0KSxyLnNldE1pbnV0ZXMoYyksci5zZXRTZWNvbmRzKG88PDEpLHJ9KGUpO2lmKDgyNTcmbyl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIFpJUCBlbmNyeXB0aW9uIik7ZS5yZWFkX3NoaWZ0KDQpO2Zvcih2YXIgbD1lLnJlYWRfc2hpZnQoNCksdT1lLnJlYWRfc2hpZnQoNCksZj1lLnJlYWRfc2hpZnQoMiksZD1lLnJlYWRfc2hpZnQoMiksaD0iIixwPTA7cDxmOysrcCloKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbZS5sKytdKTtpZihkKXt2YXIgbT1hKGUuc2xpY2UoZS5sLGUubCtkKSk7KG1bMjE1ODldfHx7fSkubXQmJihzPW1bMjE1ODldLm10KSwobVsxXXx8e30pLnVzeiYmKHU9bVsxXS51c3opLChtWzFdfHx7fSkuY3N6JiYobD1tWzFdLmNzeiksaSYmKChpWzIxNTg5XXx8e30pLm10JiYocz1pWzIxNTg5XS5tdCksKGlbMV18fHt9KS51c3omJih1PW1bMV0udXN6KSwoaVsxXXx8e30pLmNzeiYmKGw9bVsxXS5jc3opKX1lLmwrPWQ7dmFyIGI9ZS5zbGljZShlLmwsZS5sK2wpO3N3aXRjaChjKXtjYXNlIDg6Yj1mdW5jdGlvbihlLHQpe2lmKCFnKXJldHVybiBuZShlLHQpO3ZhciBuPW5ldygwLGcuSW5mbGF0ZVJhdykscj1uLl9wcm9jZXNzQ2h1bmsoZS5zbGljZShlLmwpLG4uX2ZpbmlzaEZsdXNoRmxhZyk7cmV0dXJuIGUubCs9bi5ieXRlc1JlYWQscn0oZSx1KTticmVhaztjYXNlIDA6YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIFpJUCBDb21wcmVzc2lvbiBtZXRob2QgIitjKX12YXIgeT0hMTs4Jm8mJigxMzQ2OTU3NjA9PWUucmVhZF9zaGlmdCg0KSYmKGUucmVhZF9zaGlmdCg0KSx5PSEwKSxsPWUucmVhZF9zaGlmdCg0KSx1PWUucmVhZF9zaGlmdCg0KSksbCE9dCYmcmUoeSwiQmFkIGNvbXByZXNzZWQgc2l6ZTogIit0KyIgIT0gIitsKSx1IT1uJiZyZSh5LCJCYWQgdW5jb21wcmVzc2VkIHNpemU6ICIrbisiICE9ICIrdSksZmUocixoLGIse3Vuc2FmZTohMCxtdDpzfSl9dmFyIG9lPXtodG06InRleHQvaHRtbCIseG1sOiJ0ZXh0L3htbCIsZ2lmOiJpbWFnZS9naWYiLGpwZzoiaW1hZ2UvanBlZyIscG5nOiJpbWFnZS9wbmciLG1zbzoiYXBwbGljYXRpb24veC1tc28iLHRobXg6ImFwcGxpY2F0aW9uL3ZuZC5tcy1vZmZpY2V0aGVtZSIsc2gzM3RqNToiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIn07ZnVuY3Rpb24gY2UoZSx0KXtpZihlLmN0eXBlKXJldHVybiBlLmN0eXBlO3ZhciBuPWUubmFtZXx8IiIscj1uLm1hdGNoKC9cLihbXlwuXSspJC8pO3JldHVybiByJiZvZVtyWzFdXXx8dCYmKHI9KG49dCkubWF0Y2goL1tcLlxcXShbXlwuXFxdKSskLykpJiZvZVtyWzFdXT9vZVtyWzFdXToiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIn1mdW5jdGlvbiBzZShlKXtmb3IodmFyIHQ9WGcoZSksbj1bXSxyPTA7cjx0Lmxlbmd0aDtyKz03NiluLnB1c2godC5zbGljZShyLHIrNzYpKTtyZXR1cm4gbi5qb2luKCJcclxuIikrIlxyXG4ifWZ1bmN0aW9uIGxlKGUpe3ZhciB0PWUucmVwbGFjZSgvW1x4MDAtXHgwOFx4MEJceDBDXHgwRS1ceDFGXHg3RS1ceEZGPV0vZywoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO3JldHVybiI9IisoMT09dC5sZW5ndGg/IjAiK3Q6dCl9KSk7IlxuIj09KHQ9dC5yZXBsYWNlKC8gJC9nbSwiPTIwIikucmVwbGFjZSgvXHQkL2dtLCI9MDkiKSkuY2hhckF0KDApJiYodD0iPTBEIit0LnNsaWNlKDEpKTtmb3IodmFyIG49W10scj0odD10LnJlcGxhY2UoL1xyKD8hXG4pL2dtLCI9MEQiKS5yZXBsYWNlKC9cblxuL2dtLCJcbj0wQSIpLnJlcGxhY2UoLyhbXlxyXG5dKVxuL2dtLCIkMT0wQSIpKS5zcGxpdCgiXHJcbiIpLGk9MDtpPHIubGVuZ3RoOysraSl7dmFyIGE9cltpXTtpZigwIT1hLmxlbmd0aClmb3IodmFyIG89MDtvPGEubGVuZ3RoOyl7dmFyIGM9NzYscz1hLnNsaWNlKG8sbytjKTsiPSI9PXMuY2hhckF0KGMtMSk/Yy0tOiI9Ij09cy5jaGFyQXQoYy0yKT9jLT0yOiI9Ij09cy5jaGFyQXQoYy0zKSYmKGMtPTMpLHM9YS5zbGljZShvLG8rYyksKG8rPWMpPGEubGVuZ3RoJiYocys9Ij0iKSxuLnB1c2gocyl9ZWxzZSBuLnB1c2goIiIpfXJldHVybiBuLmpvaW4oIlxyXG4iKX1mdW5jdGlvbiB1ZShlLHQsbil7Zm9yKHZhciByLGk9IiIsYT0iIixvPSIiLGM9MDtjPDEwOysrYyl7dmFyIHM9dFtjXTtpZighc3x8cy5tYXRjaCgvXlxzKiQvKSlicmVhazt2YXIgbD1zLm1hdGNoKC9eKC4qPyk6XHMqKFteXHNdLiopJC8pO2lmKGwpc3dpdGNoKGxbMV0udG9Mb3dlckNhc2UoKSl7Y2FzZSJjb250ZW50LWxvY2F0aW9uIjppPWxbMl0udHJpbSgpO2JyZWFrO2Nhc2UiY29udGVudC10eXBlIjpvPWxbMl0udHJpbSgpO2JyZWFrO2Nhc2UiY29udGVudC10cmFuc2Zlci1lbmNvZGluZyI6YT1sWzJdLnRyaW0oKX19c3dpdGNoKCsrYyxhLnRvTG93ZXJDYXNlKCkpe2Nhc2UiYmFzZTY0IjpyPWVtKCRnKHQuc2xpY2UoYykuam9pbigiIikpKTticmVhaztjYXNlInF1b3RlZC1wcmludGFibGUiOnI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOysrbil7Zm9yKHZhciByPWVbbl07bjw9ZS5sZW5ndGgmJiI9Ij09ci5jaGFyQXQoci5sZW5ndGgtMSk7KXI9ci5zbGljZSgwLHIubGVuZ3RoLTEpK2VbKytuXTt0LnB1c2gocil9Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDsrK2kpdFtpXT10W2ldLnJlcGxhY2UoL1s9XVswLTlBLUZhLWZdezJ9L2csKGZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGUuc2xpY2UoMSksMTYpKX0pKTtyZXR1cm4gZW0odC5qb2luKCJcclxuIikpfSh0LnNsaWNlKGMpKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyAiK2EpfXZhciB1PWZlKGUsaS5zbGljZShuLmxlbmd0aCkscix7dW5zYWZlOiEwfSk7byYmKHUuY3R5cGU9byl9ZnVuY3Rpb24gZmUoZSx0LG4saSl7dmFyIGE9aSYmaS51bnNhZmU7YXx8ZChlKTt2YXIgbz0hYSYmS20uZmluZChlLHQpO2lmKCFvKXt2YXIgYz1lLkZ1bGxQYXRoc1swXTt0LnNsaWNlKDAsYy5sZW5ndGgpPT1jP2M9dDooIi8iIT1jLnNsaWNlKC0xKSYmKGMrPSIvIiksYz0oYyt0KS5yZXBsYWNlKCIvLyIsIi8iKSksbz17bmFtZTpyKHQpLHR5cGU6Mn0sZS5GaWxlSW5kZXgucHVzaChvKSxlLkZ1bGxQYXRocy5wdXNoKGMpLGF8fEttLnV0aWxzLmNmYl9nYyhlKX1yZXR1cm4gby5jb250ZW50PW4sby5zaXplPW4/bi5sZW5ndGg6MCxpJiYoaS5DTFNJRCYmKG8uY2xzaWQ9aS5DTFNJRCksaS5tdCYmKG8ubXQ9aS5tdCksaS5jdCYmKG8uY3Q9aS5jdCkpLG99cmV0dXJuIHQuZmluZD1mdW5jdGlvbihlLHQpe3ZhciBuPWUuRnVsbFBhdGhzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9VcHBlckNhc2UoKX0pKSxyPW4ubWFwKChmdW5jdGlvbihlKXt2YXIgdD1lLnNwbGl0KCIvIik7cmV0dXJuIHRbdC5sZW5ndGgtKCIvIj09ZS5zbGljZSgtMSk/MjoxKV19KSksaT0hMTs0Nz09PXQuY2hhckNvZGVBdCgwKT8oaT0hMCx0PW5bMF0uc2xpY2UoMCwtMSkrdCk6aT0tMSE9PXQuaW5kZXhPZigiLyIpO3ZhciBhPXQudG9VcHBlckNhc2UoKSxvPSEwPT09aT9uLmluZGV4T2YoYSk6ci5pbmRleE9mKGEpO2lmKC0xIT09bylyZXR1cm4gZS5GaWxlSW5kZXhbb107dmFyIGM9IWEubWF0Y2goYW0pO2ZvcihhPWEucmVwbGFjZShpbSwiIiksYyYmKGE9YS5yZXBsYWNlKGFtLCIhIikpLG89MDtvPG4ubGVuZ3RoOysrbyl7aWYoKGM/bltvXS5yZXBsYWNlKGFtLCIhIik6bltvXSkucmVwbGFjZShpbSwiIik9PWEpcmV0dXJuIGUuRmlsZUluZGV4W29dO2lmKChjP3Jbb10ucmVwbGFjZShhbSwiISIpOnJbb10pLnJlcGxhY2UoaW0sIiIpPT1hKXJldHVybiBlLkZpbGVJbmRleFtvXX1yZXR1cm4gbnVsbH0sdC5yZWFkPWZ1bmN0aW9uKHQsbil7dmFyIHI9biYmbi50eXBlO3N3aXRjaChyfHxZZyYmQnVmZmVyLmlzQnVmZmVyKHQpJiYocj0iYnVmZmVyIikscnx8ImJhc2U2NCIpe2Nhc2UiZmlsZSI6cmV0dXJuIGZ1bmN0aW9uKHQsbil7cmV0dXJuIG8oKSxjKGUucmVhZEZpbGVTeW5jKHQpLG4pfSh0LG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gYyhlbSgkZyh0KSksbik7Y2FzZSJiaW5hcnkiOnJldHVybiBjKGVtKHQpLG4pfXJldHVybiBjKHQsbil9LHQucGFyc2U9Yyx0LndyaXRlPWZ1bmN0aW9uKHQsbil7dmFyIHI9cCh0LG4pO3N3aXRjaChuJiZuLnR5cGV8fCJidWZmZXIiKXtjYXNlImZpbGUiOnJldHVybiBvKCksZS53cml0ZUZpbGVTeW5jKG4uZmlsZW5hbWUscikscjtjYXNlImJpbmFyeSI6cmV0dXJuInN0cmluZyI9PXR5cGVvZiByP3I6VChyKTtjYXNlImJhc2U2NCI6cmV0dXJuIFhnKCJzdHJpbmciPT10eXBlb2Ygcj9yOlQocikpO2Nhc2UiYnVmZmVyIjppZihZZylyZXR1cm4gQnVmZmVyLmlzQnVmZmVyKHIpP3I6S2cocik7Y2FzZSJhcnJheSI6cmV0dXJuInN0cmluZyI9PXR5cGVvZiByP2VtKHIpOnJ9cmV0dXJuIHJ9LHQud3JpdGVGaWxlPWZ1bmN0aW9uKHQsbixyKXtvKCk7dmFyIGk9cCh0LHIpO2Uud3JpdGVGaWxlU3luYyhuLGkpfSx0LnV0aWxzPXtjZmJfbmV3OmZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBkKHQsZSksdH0sY2ZiX2FkZDpmZSxjZmJfZGVsOmZ1bmN0aW9uKGUsdCl7ZChlKTt2YXIgbj1LbS5maW5kKGUsdCk7aWYobilmb3IodmFyIHI9MDtyPGUuRmlsZUluZGV4Lmxlbmd0aDsrK3IpaWYoZS5GaWxlSW5kZXhbcl09PW4pcmV0dXJuIGUuRmlsZUluZGV4LnNwbGljZShyLDEpLGUuRnVsbFBhdGhzLnNwbGljZShyLDEpLCEwO3JldHVybiExfSxjZmJfbW92OmZ1bmN0aW9uKGUsdCxuKXtkKGUpO3ZhciBpPUttLmZpbmQoZSx0KTtpZihpKWZvcih2YXIgYT0wO2E8ZS5GaWxlSW5kZXgubGVuZ3RoOysrYSlpZihlLkZpbGVJbmRleFthXT09aSlyZXR1cm4gZS5GaWxlSW5kZXhbYV0ubmFtZT1yKG4pLGUuRnVsbFBhdGhzW2FdPW4sITA7cmV0dXJuITF9LGNmYl9nYzpmdW5jdGlvbihlKXtoKGUsITApfSxSZWFkU2hpZnQ6TXksQ2hlY2tGaWVsZDpxeSxwcmVwX2Jsb2I6R3ksYmNvbmNhdDpybSx1c2VfemxpYjpmdW5jdGlvbihlKXt0cnl7dmFyIHQ9bmV3KDAsZS5JbmZsYXRlUmF3KTtpZih0Ll9wcm9jZXNzQ2h1bmsobmV3IFVpbnQ4QXJyYXkoWzMsMF0pLHQuX2ZpbmlzaEZsdXNoRmxhZyksIXQuYnl0ZXNSZWFkKXRocm93IG5ldyBFcnJvcigiemxpYiBkb2VzIG5vdCBleHBvc2UgYnl0ZXNSZWFkIik7Zz1lfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoImNhbm5vdCB1c2UgbmF0aXZlIHpsaWI6ICIrKGUubWVzc2FnZXx8ZSkpfX0sX2RlZmxhdGVSYXc6WSxfaW5mbGF0ZVJhdzpuZSxjb25zdHM6RH0sdH0oKTtmdW5jdGlvbiBabShlKXtmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj1bXSxyPTA7cjx0Lmxlbmd0aDsrK3IpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdFtyXSkmJm4ucHVzaCh0W3JdKTtyZXR1cm4gbn1mdW5jdGlvbiBKbShlKXtmb3IodmFyIHQ9W10sbj1abShlKSxyPTA7ciE9PW4ubGVuZ3RoOysrcil0W2VbbltyXV1dPW5bcl07cmV0dXJuIHR9dmFyIFFtPURhdGUuVVRDKDE4OTksMTEsMzAsMCwwLDApLGViPURhdGUuVVRDKDE4OTksMTEsMzEsMCwwLDApLHRiPURhdGUuVVRDKDE5MDQsMCwxLDAsMCwwKTtmdW5jdGlvbiBuYihlLHQpe3ZhciBuPShlLmdldFRpbWUoKS1RbSkvODY0ZTU7cmV0dXJuIHQ/KG4tPTE0NjIpPC0xNDAyP24tMTpuOm48NjA/bi0xOm59ZnVuY3Rpb24gcmIoZSl7aWYoZT49NjAmJmU8NjEpcmV0dXJuIGU7dmFyIHQ9bmV3IERhdGU7cmV0dXJuIHQuc2V0VGltZSgyNCooZT42MD9lOmUrMSkqNjAqNjAqMWUzK1FtKSx0fWZ1bmN0aW9uIGliKGUpe3ZhciB0PTAsbj0wLHI9ITEsaT1lLm1hdGNoKC9QKFswLTlcLl0rWSk/KFswLTlcLl0rTSk/KFswLTlcLl0rRCk/VChbMC05XC5dK0gpPyhbMC05XC5dK00pPyhbMC05XC5dK1MpPy8pO2lmKCFpKXRocm93IG5ldyBFcnJvcigifCIrZSsifCBpcyBub3QgYW4gSVNPODYwMSBEdXJhdGlvbiIpO2Zvcih2YXIgYT0xO2EhPWkubGVuZ3RoOysrYSlpZihpW2FdKXtzd2l0Y2gobj0xLGE+MyYmKHI9ITApLGlbYV0uc2xpY2UoaVthXS5sZW5ndGgtMSkpe2Nhc2UiWSI6dGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBJU08gRHVyYXRpb24gRmllbGQ6ICIraVthXS5zbGljZShpW2FdLmxlbmd0aC0xKSk7Y2FzZSJEIjpuKj0yNDtjYXNlIkgiOm4qPTYwO2Nhc2UiTSI6aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBJU08gRHVyYXRpb24gRmllbGQ6IE0iKTtuKj02MH10Kz1uKnBhcnNlSW50KGlbYV0sMTApfXJldHVybiB0fXZhciBhYj0vXihcZCspOihcZCspKDpcZCspPyhcLlxkKyk/JC8sb2I9L14oXGQrKS0oXGQrKS0oXGQrKSQvLGNiPS9eKFxkKyktKFxkKyktKFxkKylbVCBdKFxkKyk6KFxkKykoOlxkKyk/KFwuXGQrKT8kLztmdW5jdGlvbiBzYihlLHQpe2lmKGUgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBlO3ZhciBuPWUubWF0Y2goYWIpO3JldHVybiBuP25ldyBEYXRlKCh0P3RiOmViKSsxZTMqKDYwKig2MCpwYXJzZUludChuWzFdLDEwKStwYXJzZUludChuWzJdLDEwKSkrKG5bM10/cGFyc2VJbnQoblszXS5zbGljZSgxKSwxMCk6MCkpKyhuWzRdP3BhcnNlSW50KChuWzRdKyIwMDAiKS5zbGljZSgxLDQpLDEwKTowKSk6KG49ZS5tYXRjaChvYikpP25ldyBEYXRlKERhdGUuVVRDKCtuWzFdLCtuWzJdLTEsK25bM10sMCwwLDAsMCkpOihuPWUubWF0Y2goY2IpKT9uZXcgRGF0ZShEYXRlLlVUQygrblsxXSwrblsyXS0xLCtuWzNdLCtuWzRdLCtuWzVdLG5bNl0mJnBhcnNlSW50KG5bNl0uc2xpY2UoMSksMTApfHwwLG5bN10mJnBhcnNlSW50KG5bN10uc2xpY2UoMSksMTApfHwwKSk6bmV3IERhdGUoZSl9ZnVuY3Rpb24gbGIoZSx0KXtpZihZZyYmQnVmZmVyLmlzQnVmZmVyKGUpKXtpZih0JiZaZyl7aWYoMjU1PT1lWzBdJiYyNTQ9PWVbMV0pcmV0dXJuIGV5KGUuc2xpY2UoMikudG9TdHJpbmcoInV0ZjE2bGUiKSk7aWYoMjU0PT1lWzFdJiYyNTU9PWVbMl0pcmV0dXJuIGV5KGpnKGUuc2xpY2UoMikudG9TdHJpbmcoImJpbmFyeSIpKSl9cmV0dXJuIGUudG9TdHJpbmcoImJpbmFyeSIpfWlmKCJ1bmRlZmluZWQiIT10eXBlb2YgVGV4dERlY29kZXIpdHJ5e2lmKHQpe2lmKDI1NT09ZVswXSYmMjU0PT1lWzFdKXJldHVybiBleShuZXcgVGV4dERlY29kZXIoInV0Zi0xNmxlIikuZGVjb2RlKGUuc2xpY2UoMikpKTtpZigyNTQ9PWVbMF0mJjI1NT09ZVsxXSlyZXR1cm4gZXkobmV3IFRleHREZWNvZGVyKCJ1dGYtMTZiZSIpLmRlY29kZShlLnNsaWNlKDIpKSl9dmFyIG49eyLigqwiOiLCgCIsIuKAmiI6IsKCIiwixpIiOiLCgyIsIuKAniI6IsKEIiwi4oCmIjoiwoUiLCLigKAiOiLChiIsIuKAoSI6IsKHIiwiy4YiOiLCiCIsIuKAsCI6IsKJIiwixaAiOiLCiiIsIuKAuSI6IsKLIiwixZIiOiLCjCIsIsW9Ijoiwo4iLCLigJgiOiLCkSIsIuKAmSI6IsKSIiwi4oCcIjoiwpMiLCLigJ0iOiLClCIsIuKAoiI6IsKVIiwi4oCTIjoiwpYiLCLigJQiOiLClyIsIsucIjoiwpgiLCLihKIiOiLCmSIsIsWhIjoiwpoiLCLigLoiOiLCmyIsIsWTIjoiwpwiLCLFviI6IsKeIiwixbgiOiLCnyJ9O3JldHVybiBBcnJheS5pc0FycmF5KGUpJiYoZT1uZXcgVWludDhBcnJheShlKSksbmV3IFRleHREZWNvZGVyKCJsYXRpbjEiKS5kZWNvZGUoZSkucmVwbGFjZSgvW+KCrOKAmsaS4oCe4oCm4oCg4oChy4bigLDFoOKAucWSxb3igJjigJnigJzigJ3igKLigJPigJTLnOKEosWh4oC6xZPFvsW4XS9nLChmdW5jdGlvbihlKXtyZXR1cm4gbltlXXx8ZX0pKX1jYXRjaChlKXt9dmFyIHI9W10saT0wO3RyeXtmb3IoaT0wO2k8ZS5sZW5ndGgtNjU1MzY7aSs9NjU1MzYpci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoMCxlLnNsaWNlKGksaSs2NTUzNikpKTtyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSgwLGUuc2xpY2UoaSkpKX1jYXRjaCh0KXt0cnl7Zm9yKDtpPGUubGVuZ3RoLTE2Mzg0O2krPTE2Mzg0KXIucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KDAsZS5zbGljZShpLGkrMTYzODQpKSk7ci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoMCxlLnNsaWNlKGkpKSl9Y2F0Y2godCl7Zm9yKDtpIT1lLmxlbmd0aDsrK2kpci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZVtpXSkpfX1yZXR1cm4gci5qb2luKCIiKX1mdW5jdGlvbiB1YihlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEpTT04mJiFBcnJheS5pc0FycmF5KGUpKXJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKTtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PWUpcmV0dXJuIGU7aWYoZSBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIG5ldyBEYXRlKGUuZ2V0VGltZSgpKTt2YXIgdD17fTtmb3IodmFyIG4gaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmKHRbbl09dWIoZVtuXSkpO3JldHVybiB0fWZ1bmN0aW9uIGZiKGUsdCl7Zm9yKHZhciBuPSIiO24ubGVuZ3RoPHQ7KW4rPWU7cmV0dXJuIG59ZnVuY3Rpb24gZGIoZSl7dmFyIHQ9TnVtYmVyKGUpO2lmKCFpc05hTih0KSlyZXR1cm4gaXNGaW5pdGUodCk/dDpOYU47aWYoIS9cZC8udGVzdChlKSlyZXR1cm4gdDt2YXIgbj0xLHI9ZS5yZXBsYWNlKC8oW1xkXSksKFtcZF0pL2csIiQxJDIiKS5yZXBsYWNlKC9bJF0vZywiIikucmVwbGFjZSgvWyVdL2csKGZ1bmN0aW9uKCl7cmV0dXJuIG4qPTEwMCwiIn0pKTtyZXR1cm4gaXNOYU4odD1OdW1iZXIocikpPyhyPXIucmVwbGFjZSgvWyhdKC4qKVspXS8sKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG49LW4sdH0pKSxpc05hTih0PU51bWJlcihyKSk/dDp0L24pOnQvbn12YXIgaGI9L14oMD9cZHwxWzAtMl0pKD86fDooWzAtNV0/XGQpKD86fChcLlxkKykoPzp8OihbMC01XT9cZCkpfDooWzAtNV0/XGQpKHxcLlxkKykpKVxzKyhbYXBdKW0/JC8scGI9L14oWzAxXT9cZHwyWzAtM10pKD86fDooWzAtNV0/XGQpKD86fChcLlxkKykoPzp8OihbMC01XT9cZCkpfDooWzAtNV0/XGQpKHxcLlxkKykpKSQvLGdiPS9eKFxkKyktKFxkKyktKFxkKylbVCBdKFxkKyk6KFxkKykoOlxkKykoXC5cZCspP1taXT8kLyxtYj0tMTc3OTg0ZTU9PW5ldyBEYXRlKCI2LzkvNjkgMDA6MDAgVVRDIikudmFsdWVPZigpO3ZhciBiYj1bImphbnVhcnkiLCJmZWJydWFyeSIsIm1hcmNoIiwiYXByaWwiLCJtYXkiLCJqdW5lIiwianVseSIsImF1Z3VzdCIsInNlcHRlbWJlciIsIm9jdG9iZXIiLCJub3ZlbWJlciIsImRlY2VtYmVyIl07ZnVuY3Rpb24geWIoZSl7aWYoZ2IudGVzdChlKSlyZXR1cm4tMT09ZS5pbmRleE9mKCJaIik/RGIobmV3IERhdGUoZSkpOm5ldyBEYXRlKGUpO3ZhciB0PWUudG9Mb3dlckNhc2UoKSxuPXQucmVwbGFjZSgvXHMrL2csIiAiKS50cmltKCkscj1uLm1hdGNoKGhiKTtpZihyKXJldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZVsyXT9lWzNdP2VbNF0/bmV3IERhdGUoRGF0ZS5VVEMoMTg5OSwxMSwzMSwrZVsxXSUxMisoInAiPT1lWzddPzEyOjApLCtlWzJdLCtlWzRdLDFlMypwYXJzZUZsb2F0KGVbM10pKSk6bmV3IERhdGUoRGF0ZS5VVEMoMTg5OSwxMSwzMSwicCI9PWVbN10/MTI6MCwrZVsxXSwrZVsyXSwxZTMqcGFyc2VGbG9hdChlWzNdKSkpOmVbNV0/bmV3IERhdGUoRGF0ZS5VVEMoMTg5OSwxMSwzMSwrZVsxXSUxMisoInAiPT1lWzddPzEyOjApLCtlWzJdLCtlWzVdLGVbNl0/MWUzKnBhcnNlRmxvYXQoZVs2XSk6MCkpOm5ldyBEYXRlKERhdGUuVVRDKDE4OTksMTEsMzEsK2VbMV0lMTIrKCJwIj09ZVs3XT8xMjowKSwrZVsyXSwwLDApKTpuZXcgRGF0ZShEYXRlLlVUQygxODk5LDExLDMxLCtlWzFdJTEyKygicCI9PWVbN10/MTI6MCksMCwwLDApKX0ocik7aWYocj1uLm1hdGNoKHBiKSlyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGVbMl0/ZVszXT9lWzRdP25ldyBEYXRlKERhdGUuVVRDKDE4OTksMTEsMzEsK2VbMV0sK2VbMl0sK2VbNF0sMWUzKnBhcnNlRmxvYXQoZVszXSkpKTpuZXcgRGF0ZShEYXRlLlVUQygxODk5LDExLDMxLDAsK2VbMV0sK2VbMl0sMWUzKnBhcnNlRmxvYXQoZVszXSkpKTplWzVdP25ldyBEYXRlKERhdGUuVVRDKDE4OTksMTEsMzEsK2VbMV0sK2VbMl0sK2VbNV0sZVs2XT8xZTMqcGFyc2VGbG9hdChlWzZdKTowKSk6bmV3IERhdGUoRGF0ZS5VVEMoMTg5OSwxMSwzMSwrZVsxXSwrZVsyXSwwLDApKTpuZXcgRGF0ZShEYXRlLlVUQygxODk5LDExLDMxLCtlWzFdLDAsMCwwKSl9KHIpO2lmKHI9bi5tYXRjaChjYikpcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKCtyWzFdLCtyWzJdLTEsK3JbM10sK3JbNF0sK3JbNV0scls2XSYmcGFyc2VJbnQocls2XS5zbGljZSgxKSwxMCl8fDAscls3XSYmcGFyc2VJbnQocls3XS5zbGljZSgxKSwxMCl8fDApKTt2YXIgaT1uZXcgRGF0ZShtYiYmLTE9PWUuaW5kZXhPZigiVVRDIik/ZSsiIFVUQyI6ZSksYT1uZXcgRGF0ZShOYU4pLG89aS5nZXRZZWFyKCk7aS5nZXRNb250aCgpO3ZhciBjPWkuZ2V0RGF0ZSgpO2lmKGlzTmFOKGMpKXJldHVybiBhO2lmKHQubWF0Y2goL2phbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjLykpe2lmKCh0PXQucmVwbGFjZSgvW15hLXpdL2csIiIpLnJlcGxhY2UoLyhbXmEtel18XilbYXBdbT8oW15hLXpdfCQpLywiIikpLmxlbmd0aD4zJiYtMT09YmIuaW5kZXhPZih0KSlyZXR1cm4gYX1lbHNlIGlmKHQucmVwbGFjZSgvW2FwXW0/LywiIikubWF0Y2goL1thLXpdLykpcmV0dXJuIGE7cmV0dXJuIG88MHx8bz44MDk5fHxlLm1hdGNoKC9bXi0wLTk6LFwvXFxcIF0vKT9hOml9dmFyIHZiPWZ1bmN0aW9uKCl7dmFyIGU9NT09ImFiYWNhYmEiLnNwbGl0KC8oOj9iKS9pKS5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtpZihlfHwic3RyaW5nIj09dHlwZW9mIG4pcmV0dXJuIHQuc3BsaXQobik7Zm9yKHZhciBpPXQuc3BsaXQobiksYT1baVswXV0sbz0xO288aS5sZW5ndGg7KytvKWEucHVzaChyKSxhLnB1c2goaVtvXSk7cmV0dXJuIGF9fSgpO2Z1bmN0aW9uIHhiKGUpe3JldHVybiBuZXcgRGF0ZShlLmdldFVUQ0Z1bGxZZWFyKCksZS5nZXRVVENNb250aCgpLGUuZ2V0VVRDRGF0ZSgpLGUuZ2V0VVRDSG91cnMoKSxlLmdldFVUQ01pbnV0ZXMoKSxlLmdldFVUQ1NlY29uZHMoKSxlLmdldFVUQ01pbGxpc2Vjb25kcygpKX1mdW5jdGlvbiBEYihlKXtyZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoZS5nZXRGdWxsWWVhcigpLGUuZ2V0TW9udGgoKSxlLmdldERhdGUoKSxlLmdldEhvdXJzKCksZS5nZXRNaW51dGVzKCksZS5nZXRTZWNvbmRzKCksZS5nZXRNaWxsaXNlY29uZHMoKSkpfWZ1bmN0aW9uIFRiKGUpe3JldHVybiBlP2UuY29udGVudCYmZS50eXBlP2xiKGUuY29udGVudCwhMCk6ZS5kYXRhP3pnKGUuZGF0YSk6ZS5hc05vZGVCdWZmZXImJllnP3pnKGUuYXNOb2RlQnVmZmVyKCkudG9TdHJpbmcoImJpbmFyeSIpKTplLmFzQmluYXJ5P3pnKGUuYXNCaW5hcnkoKSk6ZS5fZGF0YSYmZS5fZGF0YS5nZXRDb250ZW50P3pnKGxiKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuX2RhdGEuZ2V0Q29udGVudCgpLDApKSk6bnVsbDpudWxsfWZ1bmN0aW9uIHdiKGUpe2lmKCFlKXJldHVybiBudWxsO2lmKGUuZGF0YSlyZXR1cm4gTGcoZS5kYXRhKTtpZihlLmFzTm9kZUJ1ZmZlciYmWWcpcmV0dXJuIGUuYXNOb2RlQnVmZmVyKCk7aWYoZS5fZGF0YSYmZS5fZGF0YS5nZXRDb250ZW50KXt2YXIgdD1lLl9kYXRhLmdldENvbnRlbnQoKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/TGcodCk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCl9cmV0dXJuIGUuY29udGVudCYmZS50eXBlP2UuY29udGVudDpudWxsfWZ1bmN0aW9uIF9iKGUsdCl7Zm9yKHZhciBuPWUuRnVsbFBhdGhzfHxabShlLmZpbGVzKSxyPXQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXC9dL2csIlxcIiksaT1yLnJlcGxhY2UoL1xcL2csIi8iKSxhPTA7YTxuLmxlbmd0aDsrK2Epe3ZhciBvPW5bYV0ucmVwbGFjZSgvXlJvb3QgRW50cnlbXC9dLywiIikudG9Mb3dlckNhc2UoKTtpZihyPT1vfHxpPT1vKXJldHVybiBlLmZpbGVzP2UuZmlsZXNbblthXV06ZS5GaWxlSW5kZXhbYV19cmV0dXJuIG51bGx9ZnVuY3Rpb24gRWIoZSx0KXt2YXIgbj1fYihlLHQpO2lmKG51bGw9PW4pdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBmaWxlICIrdCsiIGluIHppcCIpO3JldHVybiBufWZ1bmN0aW9uIFViKGUsdCxuKXtpZighbilyZXR1cm4ocj1FYihlLHQpKSYmIi5iaW4iPT09ci5uYW1lLnNsaWNlKC00KT93YihyKTpUYihyKTt2YXIgcjtpZighdClyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIFViKGUsdCl9Y2F0Y2goZSl7cmV0dXJuIG51bGx9fWZ1bmN0aW9uIEFiKGUsdCxuKXtpZighbilyZXR1cm4gVGIoRWIoZSx0KSk7aWYoIXQpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBBYihlLHQpfWNhdGNoKGUpe3JldHVybiBudWxsfX1mdW5jdGlvbiBrYihlLHQsbil7aWYoIW4pcmV0dXJuIHdiKEViKGUsdCkpO2lmKCF0KXJldHVybiBudWxsO3RyeXtyZXR1cm4ga2IoZSx0KX1jYXRjaChlKXtyZXR1cm4gbnVsbH19ZnVuY3Rpb24gU2IoZSl7Zm9yKHZhciB0PWUuRnVsbFBhdGhzfHxabShlLmZpbGVzKSxuPVtdLHI9MDtyPHQubGVuZ3RoOysrcikiLyIhPXRbcl0uc2xpY2UoLTEpJiZuLnB1c2godFtyXS5yZXBsYWNlKC9eUm9vdCBFbnRyeVtcL10vLCIiKSk7cmV0dXJuIG4uc29ydCgpfWZ1bmN0aW9uIENiKGUsdCxuKXtpZihlLkZ1bGxQYXRocyl7dmFyIHI7aWYoInN0cmluZyI9PXR5cGVvZiBuKXJldHVybiByPVlnP0tnKG4pOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTAscj1lLmxlbmd0aCsyNTAsaT1KZyhlLmxlbmd0aCsyNTUpLGE9MDthPGUubGVuZ3RoOysrYSl7dmFyIG89ZS5jaGFyQ29kZUF0KGEpO2lmKG88MTI4KWlbbisrXT1vO2Vsc2UgaWYobzwyMDQ4KWlbbisrXT0xOTJ8bz4+NiYzMSxpW24rK109MTI4fDYzJm87ZWxzZSBpZihvPj01NTI5NiYmbzw1NzM0NCl7bz02NCsoMTAyMyZvKTt2YXIgYz0xMDIzJmUuY2hhckNvZGVBdCgrK2EpO2lbbisrXT0yNDB8bz4+OCY3LGlbbisrXT0xMjh8bz4+MiY2MyxpW24rK109MTI4fGM+PjYmMTV8KDMmbyk8PDQsaVtuKytdPTEyOHw2MyZjfWVsc2UgaVtuKytdPTIyNHxvPj4xMiYxNSxpW24rK109MTI4fG8+PjYmNjMsaVtuKytdPTEyOHw2MyZvO24+ciYmKHQucHVzaChpLnNsaWNlKDAsbikpLG49MCxpPUpnKDY1NTM1KSxyPTY1NTMwKX1yZXR1cm4gdC5wdXNoKGkuc2xpY2UoMCxuKSkscm0odCl9KG4pLEttLnV0aWxzLmNmYl9hZGQoZSx0LHIpO0ttLnV0aWxzLmNmYl9hZGQoZSx0LG4pfWVsc2UgZS5maWxlKHQsbil9ZnVuY3Rpb24gRmIoZSx0KXtzd2l0Y2godC50eXBlKXtjYXNlImJhc2U2NCI6cmV0dXJuIEttLnJlYWQoZSx7dHlwZToiYmFzZTY0In0pO2Nhc2UiYmluYXJ5IjpyZXR1cm4gS20ucmVhZChlLHt0eXBlOiJiaW5hcnkifSk7Y2FzZSJidWZmZXIiOmNhc2UiYXJyYXkiOnJldHVybiBLbS5yZWFkKGUse3R5cGU6ImJ1ZmZlciJ9KX10aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCB0eXBlICIrdC50eXBlKX1mdW5jdGlvbiBPYihlLHQpe2lmKCIvIj09ZS5jaGFyQXQoMCkpcmV0dXJuIGUuc2xpY2UoMSk7dmFyIG49dC5zcGxpdCgiLyIpOyIvIiE9dC5zbGljZSgtMSkmJm4ucG9wKCk7Zm9yKHZhciByPWUuc3BsaXQoIi8iKTswIT09ci5sZW5ndGg7KXt2YXIgaT1yLnNoaWZ0KCk7Ii4uIj09PWk/bi5wb3AoKToiLiIhPT1pJiZuLnB1c2goaSl9cmV0dXJuIG4uam9pbigiLyIpfXZhciBJYj0nPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PlxyXG4nLFJiPS8oW14iXHM/PlwvXSspXHMqPVxzKigoPzoiKShbXiJdKikoPzoiKXwoPzonKShbXiddKikoPzonKXwoW14nIj5cc10rKSkvZyxOYj0vPFtcL1w/XT9bYS16QS1aMC05Ol8tXSsoPzpccytbXiJccz8+XC9dK1xzKj1ccyooPzoiW14iXSoifCdbXiddKid8W14nIj5ccz1dKykpKlxzKltcL1w/XT8+L2dtLFBiPUliLm1hdGNoKE5iKT9OYjovPFtePl0qPi9nLEJiPS88XHcqOi8sV2I9LzwoXC8/KVx3KzovO2Z1bmN0aW9uIExiKGUsdCxuKXtmb3IodmFyIHI9e30saT0wLGE9MDtpIT09ZS5sZW5ndGgmJigzMiE9PShhPWUuY2hhckNvZGVBdChpKSkmJjEwIT09YSYmMTMhPT1hKTsrK2kpO2lmKHR8fChyWzBdPWUuc2xpY2UoMCxpKSksaT09PWUubGVuZ3RoKXJldHVybiByO3ZhciBvPWUubWF0Y2goUmIpLGM9MCxzPSIiLGw9MCx1PSIiLGY9IiIsZD0xO2lmKG8pZm9yKGw9MDtsIT1vLmxlbmd0aDsrK2wpe2ZvcihmPW9bbF0sYT0wO2EhPWYubGVuZ3RoJiY2MSE9PWYuY2hhckNvZGVBdChhKTsrK2EpO2Zvcih1PWYuc2xpY2UoMCxhKS50cmltKCk7MzI9PWYuY2hhckNvZGVBdChhKzEpOykrK2E7Zm9yKGQ9MzQ9PShpPWYuY2hhckNvZGVBdChhKzEpKXx8Mzk9PWk/MTowLHM9Zi5zbGljZShhKzErZCxmLmxlbmd0aC1kKSxjPTA7YyE9dS5sZW5ndGgmJjU4IT09dS5jaGFyQ29kZUF0KGMpOysrYyk7aWYoYz09PXUubGVuZ3RoKXUuaW5kZXhPZigiXyIpPjAmJih1PXUuc2xpY2UoMCx1LmluZGV4T2YoIl8iKSkpLHJbdV09cyxufHwoclt1LnRvTG93ZXJDYXNlKCldPXMpO2Vsc2V7dmFyIGg9KDU9PT1jJiYieG1sbnMiPT09dS5zbGljZSgwLDUpPyJ4bWxucyI6IiIpK3Uuc2xpY2UoYysxKTtpZihyW2hdJiYiZXh0Ij09dS5zbGljZShjLTMsYykpY29udGludWU7cltoXT1zLG58fChyW2gudG9Mb3dlckNhc2UoKV09cyl9fXJldHVybiByfWZ1bmN0aW9uIE1iKGUpe3JldHVybiBlLnJlcGxhY2UoV2IsIjwkMSIpfXZhciBqYj17IiZxdW90OyI6JyInLCImYXBvczsiOiInIiwiJmd0OyI6Ij4iLCImbHQ7IjoiPCIsIiZhbXA7IjoiJiJ9LHpiPUptKGpiKSxIYj1mdW5jdGlvbigpe3ZhciBlPS8mKD86cXVvdHxhcG9zfGd0fGx0fGFtcHwjeD8oW1xkYS1mQS1GXSspKTsvZ2ksdD0vX3goW1xkYS1mQS1GXXs0fSlfL2dpO2Z1bmN0aW9uIG4ocil7dmFyIGk9cisiIixhPWkuaW5kZXhPZigiPCFbQ0RBVEFbIik7aWYoLTE9PWEpcmV0dXJuIGkucmVwbGFjZShlLChmdW5jdGlvbihlLHQpe3JldHVybiBqYltlXXx8U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludCh0LGUuaW5kZXhPZigieCIpPi0xPzE2OjEwKSl8fGV9KSkucmVwbGFjZSh0LChmdW5jdGlvbihlLHQpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KHQsMTYpKX0pKTt2YXIgbz1pLmluZGV4T2YoIl1dPiIpO3JldHVybiBuKGkuc2xpY2UoMCxhKSkraS5zbGljZShhKzksbykrbihpLnNsaWNlKG8rMykpfXJldHVybiBmdW5jdGlvbihlLHQpe3ZhciByPW4oZSk7cmV0dXJuIHQ/ci5yZXBsYWNlKC9cclxuL2csIlxuIik6cn19KCksVmI9L1smPD4nIl0vZyxxYj0vW1x1MDAwMC1cdTAwMWZdL2c7ZnVuY3Rpb24gR2IoZSl7cmV0dXJuKGUrIiIpLnJlcGxhY2UoVmIsKGZ1bmN0aW9uKGUpe3JldHVybiB6YltlXX0pKS5yZXBsYWNlKC9cbi9nLCI8YnIvPiIpLnJlcGxhY2UocWIsKGZ1bmN0aW9uKGUpe3JldHVybiImI3giKygiMDAwIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNCkrIjsifSkpfXZhciBYYj1mdW5jdGlvbigpe3ZhciBlPS8mIyhcZCspOy9nO2Z1bmN0aW9uIHQoZSx0KXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludCh0LDEwKSl9cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBuLnJlcGxhY2UoZSx0KX19KCk7ZnVuY3Rpb24gJGIoZSl7c3dpdGNoKGUpe2Nhc2UgMTpjYXNlITA6Y2FzZSIxIjpjYXNlInRydWUiOnJldHVybiEwO2Nhc2UgMDpjYXNlITE6Y2FzZSIwIjpjYXNlImZhbHNlIjpyZXR1cm4hMX1yZXR1cm4hMX1mdW5jdGlvbiBZYihlKXtmb3IodmFyIHQ9IiIsbj0wLHI9MCxpPTAsYT0wLG89MCxjPTA7bjxlLmxlbmd0aDspKHI9ZS5jaGFyQ29kZUF0KG4rKykpPDEyOD90Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKHIpOihpPWUuY2hhckNvZGVBdChuKyspLHI+MTkxJiZyPDIyND8obz0oMzEmcik8PDYsb3w9NjMmaSx0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pKTooYT1lLmNoYXJDb2RlQXQobisrKSxyPDI0MD90Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgxNSZyKTw8MTJ8KDYzJmkpPDw2fDYzJmEpOihjPSgoNyZyKTw8MTh8KDYzJmkpPDwxMnwoNjMmYSk8PDZ8NjMmKG89ZS5jaGFyQ29kZUF0KG4rKykpKS02NTUzNix0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2KyhjPj4+MTAmMTAyMykpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTYzMjArKDEwMjMmYykpKSkpO3JldHVybiB0fWZ1bmN0aW9uIEtiKGUpe3ZhciB0LG4scixpPUpnKDIqZS5sZW5ndGgpLGE9MSxvPTAsYz0wO2ZvcihuPTA7bjxlLmxlbmd0aDtuKz1hKWE9MSwocj1lLmNoYXJDb2RlQXQobikpPDEyOD90PXI6cjwyMjQ/KHQ9NjQqKDMxJnIpKyg2MyZlLmNoYXJDb2RlQXQobisxKSksYT0yKTpyPDI0MD8odD00MDk2KigxNSZyKSs2NCooNjMmZS5jaGFyQ29kZUF0KG4rMSkpKyg2MyZlLmNoYXJDb2RlQXQobisyKSksYT0zKTooYT00LHQ9MjYyMTQ0Kig3JnIpKzQwOTYqKDYzJmUuY2hhckNvZGVBdChuKzEpKSs2NCooNjMmZS5jaGFyQ29kZUF0KG4rMikpKyg2MyZlLmNoYXJDb2RlQXQobiszKSksYz01NTI5NisoKHQtPTY1NTM2KT4+PjEwJjEwMjMpLHQ9NTYzMjArKDEwMjMmdCkpLDAhPT1jJiYoaVtvKytdPTI1NSZjLGlbbysrXT1jPj4+OCxjPTApLGlbbysrXT10JTI1NixpW28rK109dD4+Pjg7cmV0dXJuIGkuc2xpY2UoMCxvKS50b1N0cmluZygidWNzMiIpfWZ1bmN0aW9uIFpiKGUpe3JldHVybiBLZyhlLCJiaW5hcnkiKS50b1N0cmluZygidXRmOCIpfXZhciBKYj0iZm9vIGJhciBiYXrDosKYwoPDsMKfwo3CoyIsUWI9WWcmJihaYihKYik9PVliKEpiKSYmWmJ8fEtiKEpiKT09WWIoSmIpJiZLYil8fFliLGV5PVlnP2Z1bmN0aW9uKGUpe3JldHVybiBLZyhlLCJ1dGY4IikudG9TdHJpbmcoImJpbmFyeSIpfTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wLHI9MCxpPTA7bjxlLmxlbmd0aDspc3dpdGNoKHI9ZS5jaGFyQ29kZUF0KG4rKyksITApe2Nhc2UgcjwxMjg6dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUocikpO2JyZWFrO2Nhc2UgcjwyMDQ4OnQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDE5Misocj4+NikpKSx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgxMjgrKDYzJnIpKSk7YnJlYWs7Y2FzZSByPj01NTI5NiYmcjw1NzM0NDpyLT01NTI5NixpPWUuY2hhckNvZGVBdChuKyspLTU2MzIwKyhyPDwxMCksdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoMjQwKyhpPj4xOCY3KSkpLHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDE0NCsoaT4+MTImNjMpKSksdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoMTI4KyhpPj42JjYzKSkpLHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDEyOCsoNjMmaSkpKTticmVhaztkZWZhdWx0OnQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDIyNCsocj4+MTIpKSksdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoMTI4KyhyPj42JjYzKSkpLHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDEyOCsoNjMmcikpKX1yZXR1cm4gdC5qb2luKCIiKX0sdHk9ZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4gZnVuY3Rpb24odCxuKXt2YXIgcj10KyJ8Iisobnx8IiIpO3JldHVybiBlW3JdP2Vbcl06ZVtyXT1uZXcgUmVnRXhwKCI8KD86XFx3KzopPyIrdCsnKD86IHhtbDpzcGFjZT0icHJlc2VydmUiKT8oPzpbXj5dKik+KFtcXHNcXFNdKj8pPC8oPzpcXHcrOik/Jyt0KyI+IixufHwiIil9fSgpLG55PWZ1bmN0aW9uKCl7dmFyIGU9W1sibmJzcCIsIiAiXSxbIm1pZGRvdCIsIsK3Il0sWyJxdW90IiwnIiddLFsiYXBvcyIsIiciXSxbImd0IiwiPiJdLFsibHQiLCI8Il0sWyJhbXAiLCImIl1dLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuW25ldyBSZWdFeHAoIiYiK2VbMF0rIjsiLCJpZyIpLGVbMV1dfSkpO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIG49dC5yZXBsYWNlKC9eW1x0XG5cciBdKy8sIiIpLnJlcGxhY2UoL1tcdFxuXHIgXSskLywiIikucmVwbGFjZSgvPlxzKy9nLCI+IikucmVwbGFjZSgvXHMrPC9nLCI8IikucmVwbGFjZSgvW1x0XG5cciBdKy9nLCIgIikucmVwbGFjZSgvPFxzKltiQl1bclJdXHMqXC8/Pi9nLCJcbiIpLnJlcGxhY2UoLzxbXj5dKj4vZywiIikscj0wO3I8ZS5sZW5ndGg7KytyKW49bi5yZXBsYWNlKGVbcl1bMF0sZVtyXVsxXSk7cmV0dXJuIG59fSgpLHJ5PWZ1bmN0aW9uKCl7dmFyIGU9e307cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT1lW3RdP2VbdF06ZVt0XT1uZXcgUmVnRXhwKCI8KD86dnQ6KT8iK3QrIj4oW1xcc1xcU10qPyk8Lyg/OnZ0Oik/Iit0KyI+IiwiZyIpfX0oKSxpeT0vPFwvPyg/OnZ0Oik/dmFyaWFudD4vZyxheT0vPCg/OnZ0OikoW14+XSopPihbXHNcU10qKTwvO2Z1bmN0aW9uIG95KGUsdCl7dmFyIG49TGIoZSkscj1lLm1hdGNoKHJ5KG4uYmFzZVR5cGUpKXx8W10saT1bXTtpZihyLmxlbmd0aCE9bi5zaXplKXtpZih0LldURil0aHJvdyBuZXcgRXJyb3IoInVuZXhwZWN0ZWQgdmVjdG9yIGxlbmd0aCAiK3IubGVuZ3RoKyIgIT0gIituLnNpemUpO3JldHVybiBpfXJldHVybiByLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShpeSwiIikubWF0Y2goYXkpO3QmJmkucHVzaCh7djpRYih0WzJdKSx0OnRbMV19KX0pKSxpfXZhciBjeT0vKF5cc3xccyR8XG4pLztmdW5jdGlvbiBzeShlLHQsbil7cmV0dXJuIjwiK2UrKG51bGwhPW4/ZnVuY3Rpb24oZSl7cmV0dXJuIFptKGUpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiAiK3QrJz0iJytlW3RdKyciJ30pKS5qb2luKCIiKX0obik6IiIpKyhudWxsIT10Pyh0Lm1hdGNoKGN5KT8nIHhtbDpzcGFjZT0icHJlc2VydmUiJzoiIikrIj4iK3QrIjwvIitlOiIvIikrIj4ifWZ1bmN0aW9uIGx5KGUpe2lmKFlnJiZCdWZmZXIuaXNCdWZmZXIoZSkpcmV0dXJuIGUudG9TdHJpbmcoInV0ZjgiKTtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGU7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5JiZlIGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gUWIodG0obm0oZSkpKTt0aHJvdyBuZXcgRXJyb3IoIkJhZCBpbnB1dCBmb3JtYXQ6IGV4cGVjdGVkIEJ1ZmZlciBvciBzdHJpbmciKX12YXIgdXk9LzwoXC8/KShbXlxzPz48IVwvOl0qOnwpKFteXHM/PD46XC9dKykoPzpbXHM/OlwvXSg/OltePj1dfD0iW14iXSo/IikqKT8+L2dtLGZ5PXtDT1JFX1BST1BTOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L21ldGFkYXRhL2NvcmUtcHJvcGVydGllcyIsQ1VTVF9QUk9QUzoiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvY3VzdG9tLXByb3BlcnRpZXMiLEVYVF9QUk9QUzoiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvZXh0ZW5kZWQtcHJvcGVydGllcyIsQ1Q6Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvY29udGVudC10eXBlcyIsUkVMUzoiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzIixUQ01OVDoiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvc3ByZWFkc2hlZXRtbC8yMDE4L3RocmVhZGVkY29tbWVudHMiLGRjOiJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIsZGN0ZXJtczoiaHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zLyIsZGNtaXR5cGU6Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS8iLG14OiJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9tYWMvZXhjZWwvMjAwOC9tYWluIixyOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIixzanM6Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvc2hlZXRqcy9jb3JlLXByb3BlcnRpZXMiLHZ0OiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9kb2NQcm9wc1ZUeXBlcyIseHNpOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIseHNkOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSJ9LGR5PVsiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIiwiaHR0cDovL3B1cmwub2NsYy5vcmcvb294bWwvc3ByZWFkc2hlZXRtbC9tYWluIiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvZXhjZWwvMjAwNi9tYWluIiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvZXhjZWwvMjAwNi8yIl07dmFyIGh5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlWzBdLmxlbmd0aDsrK24paWYoZVswXVtuXSlmb3IodmFyIHI9MCxpPWVbMF1bbl0ubGVuZ3RoO3I8aTtyKz0xMDI0MCl0LnB1c2guYXBwbHkodCxlWzBdW25dLnNsaWNlKHIscisxMDI0MCkpO3JldHVybiB0fSxweT1ZZz9mdW5jdGlvbihlKXtyZXR1cm4gZVswXS5sZW5ndGg+MCYmQnVmZmVyLmlzQnVmZmVyKGVbMF1bMF0pP0J1ZmZlci5jb25jYXQoZVswXS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBCdWZmZXIuaXNCdWZmZXIoZSk/ZTpLZyhlKX0pKSk6aHkoZSl9Omh5LGd5PWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9W10saT10O2k8bjtpKz0yKXIucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKE55KGUsaSkpKTtyZXR1cm4gci5qb2luKCIiKS5yZXBsYWNlKGltLCIiKX0sbXk9WWc/ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBCdWZmZXIuaXNCdWZmZXIoZSkmJlpnP2UudG9TdHJpbmcoInV0ZjE2bGUiLHQsbikucmVwbGFjZShpbSwiIik6Z3koZSx0LG4pfTpneSxieT1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPVtdLGk9dDtpPHQrbjsrK2kpci5wdXNoKCgiMCIrZVtpXS50b1N0cmluZygxNikpLnNsaWNlKC0yKSk7cmV0dXJuIHIuam9pbigiIil9LHl5PVlnP2Z1bmN0aW9uKGUsdCxuKXtyZXR1cm4gQnVmZmVyLmlzQnVmZmVyKGUpP2UudG9TdHJpbmcoImhleCIsdCx0K24pOmJ5KGUsdCxuKX06Ynksdnk9ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxpPXQ7aTxuO2krKylyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShSeShlLGkpKSk7cmV0dXJuIHIuam9pbigiIil9LHh5PVlnP2Z1bmN0aW9uKGUsdCxuKXtyZXR1cm4gQnVmZmVyLmlzQnVmZmVyKGUpP2UudG9TdHJpbmcoInV0ZjgiLHQsbik6dnkoZSx0LG4pfTp2eSxEeT1mdW5jdGlvbihlLHQpe3ZhciBuPUJ5KGUsdCk7cmV0dXJuIG4+MD94eShlLHQrNCx0KzQrbi0xKToiIn0sVHk9RHksd3k9ZnVuY3Rpb24oZSx0KXt2YXIgbj1CeShlLHQpO3JldHVybiBuPjA/eHkoZSx0KzQsdCs0K24tMSk6IiJ9LF95PXd5LEV5PWZ1bmN0aW9uKGUsdCl7dmFyIG49MipCeShlLHQpO3JldHVybiBuPjA/eHkoZSx0KzQsdCs0K24tMSk6IiJ9LFV5PUV5LEF5PWZ1bmN0aW9uKGUsdCl7dmFyIG49QnkoZSx0KTtyZXR1cm4gbj4wP215KGUsdCs0LHQrNCtuKToiIn0sa3k9QXksU3k9ZnVuY3Rpb24oZSx0KXt2YXIgbj1CeShlLHQpO3JldHVybiBuPjA/eHkoZSx0KzQsdCs0K24pOiIifSxDeT1TeSxGeT1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xLTIqKGVbdCs3XT4+PjcpLHI9KCgxMjcmZVt0KzddKTw8NCkrKGVbdCs2XT4+PjQmMTUpLGk9MTUmZVt0KzZdLGE9NTthPj0wOy0tYSlpPTI1NippK2VbdCthXTtyZXR1cm4gMjA0Nz09cj8wPT1pP24qKDEvMCk6TmFOOigwPT1yP3I9LTEwMjI6KHItPTEwMjMsaSs9TWF0aC5wb3coMiw1MikpLG4qTWF0aC5wb3coMixyLTUyKSppKX0oZSx0KX0sT3k9RnksSXk9ZnVuY3Rpb24oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl8fCJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSYmZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl9O1lnJiYoVHk9ZnVuY3Rpb24oZSx0KXtpZighQnVmZmVyLmlzQnVmZmVyKGUpKXJldHVybiBEeShlLHQpO3ZhciBuPWUucmVhZFVJbnQzMkxFKHQpO3JldHVybiBuPjA/ZS50b1N0cmluZygidXRmOCIsdCs0LHQrNCtuLTEpOiIifSxfeT1mdW5jdGlvbihlLHQpe2lmKCFCdWZmZXIuaXNCdWZmZXIoZSkpcmV0dXJuIHd5KGUsdCk7dmFyIG49ZS5yZWFkVUludDMyTEUodCk7cmV0dXJuIG4+MD9lLnRvU3RyaW5nKCJ1dGY4Iix0KzQsdCs0K24tMSk6IiJ9LFV5PWZ1bmN0aW9uKGUsdCl7aWYoIUJ1ZmZlci5pc0J1ZmZlcihlKXx8IVpnKXJldHVybiBFeShlLHQpO3ZhciBuPTIqZS5yZWFkVUludDMyTEUodCk7cmV0dXJuIGUudG9TdHJpbmcoInV0ZjE2bGUiLHQrNCx0KzQrbi0xKX0sa3k9ZnVuY3Rpb24oZSx0KXtpZighQnVmZmVyLmlzQnVmZmVyKGUpfHwhWmcpcmV0dXJuIEF5KGUsdCk7dmFyIG49ZS5yZWFkVUludDMyTEUodCk7cmV0dXJuIGUudG9TdHJpbmcoInV0ZjE2bGUiLHQrNCx0KzQrbil9LEN5PWZ1bmN0aW9uKGUsdCl7aWYoIUJ1ZmZlci5pc0J1ZmZlcihlKSlyZXR1cm4gU3koZSx0KTt2YXIgbj1lLnJlYWRVSW50MzJMRSh0KTtyZXR1cm4gZS50b1N0cmluZygidXRmOCIsdCs0LHQrNCtuKX0sT3k9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gQnVmZmVyLmlzQnVmZmVyKGUpP2UucmVhZERvdWJsZUxFKHQpOkZ5KGUsdCl9LEl5PWZ1bmN0aW9uKGUpe3JldHVybiBCdWZmZXIuaXNCdWZmZXIoZSl8fEFycmF5LmlzQXJyYXkoZSl8fCJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSYmZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl9KTt2YXIgUnk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0XX0sTnk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMjU2KmVbdCsxXStlW3RdfSxQeT1mdW5jdGlvbihlLHQpe3ZhciBuPTI1NiplW3QrMV0rZVt0XTtyZXR1cm4gbjwzMjc2OD9uOi0xKig2NTUzNS1uKzEpfSxCeT1mdW5jdGlvbihlLHQpe3JldHVybiBlW3QrM10qKDE8PDI0KSsoZVt0KzJdPDwxNikrKGVbdCsxXTw8OCkrZVt0XX0sV3k9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0KzNdPDwyNHxlW3QrMl08PDE2fGVbdCsxXTw8OHxlW3RdfSxMeT1mdW5jdGlvbihlLHQpe3JldHVybiBlW3RdPDwyNHxlW3QrMV08PDE2fGVbdCsyXTw8OHxlW3QrM119O2Z1bmN0aW9uIE15KGUsdCl7dmFyIG4scixpLGEsbyxjLHM9IiIsbD1bXTtzd2l0Y2godCl7Y2FzZSJkYmNzIjppZihjPXRoaXMubCxZZyYmQnVmZmVyLmlzQnVmZmVyKHRoaXMpJiZaZylzPXRoaXMuc2xpY2UodGhpcy5sLHRoaXMubCsyKmUpLnRvU3RyaW5nKCJ1dGYxNmxlIik7ZWxzZSBmb3Iobz0wO288ZTsrK28pcys9U3RyaW5nLmZyb21DaGFyQ29kZShOeSh0aGlzLGMpKSxjKz0yO2UqPTI7YnJlYWs7Y2FzZSJ1dGY4IjpzPXh5KHRoaXMsdGhpcy5sLHRoaXMubCtlKTticmVhaztjYXNlInV0ZjE2bGUiOmUqPTIscz1teSh0aGlzLHRoaXMubCx0aGlzLmwrZSk7YnJlYWs7Y2FzZSJ3c3RyIjpyZXR1cm4gTXkuY2FsbCh0aGlzLGUsImRiY3MiKTtjYXNlImxwc3RyLWFuc2kiOnM9VHkodGhpcyx0aGlzLmwpLGU9NCtCeSh0aGlzLHRoaXMubCk7YnJlYWs7Y2FzZSJscHN0ci1jcCI6cz1feSh0aGlzLHRoaXMubCksZT00K0J5KHRoaXMsdGhpcy5sKTticmVhaztjYXNlImxwd3N0ciI6cz1VeSh0aGlzLHRoaXMubCksZT00KzIqQnkodGhpcyx0aGlzLmwpO2JyZWFrO2Nhc2UibHBwNCI6ZT00K0J5KHRoaXMsdGhpcy5sKSxzPWt5KHRoaXMsdGhpcy5sKSwyJmUmJihlKz0yKTticmVhaztjYXNlIjhscHA0IjplPTQrQnkodGhpcyx0aGlzLmwpLHM9Q3kodGhpcyx0aGlzLmwpLDMmZSYmKGUrPTQtKDMmZSkpO2JyZWFrO2Nhc2UiY3N0ciI6Zm9yKGU9MCxzPSIiOzAhPT0oaT1SeSh0aGlzLHRoaXMubCtlKyspKTspbC5wdXNoKEhnKGkpKTtzPWwuam9pbigiIik7YnJlYWs7Y2FzZSJfd3N0ciI6Zm9yKGU9MCxzPSIiOzAhPT0oaT1OeSh0aGlzLHRoaXMubCtlKSk7KWwucHVzaChIZyhpKSksZSs9MjtlKz0yLHM9bC5qb2luKCIiKTticmVhaztjYXNlImRiY3MtY29udCI6Zm9yKHM9IiIsYz10aGlzLmwsbz0wO288ZTsrK28pe2lmKHRoaXMubGVucyYmLTEhPT10aGlzLmxlbnMuaW5kZXhPZihjKSlyZXR1cm4gaT1SeSh0aGlzLGMpLHRoaXMubD1jKzEsYT1NeS5jYWxsKHRoaXMsZS1vLGk/ImRiY3MtY29udCI6InNiY3MtY29udCIpLGwuam9pbigiIikrYTtsLnB1c2goSGcoTnkodGhpcyxjKSkpLGMrPTJ9cz1sLmpvaW4oIiIpLGUqPTI7YnJlYWs7Y2FzZSJjcHN0ciI6Y2FzZSJzYmNzLWNvbnQiOmZvcihzPSIiLGM9dGhpcy5sLG89MDtvIT1lOysrbyl7aWYodGhpcy5sZW5zJiYtMSE9PXRoaXMubGVucy5pbmRleE9mKGMpKXJldHVybiBpPVJ5KHRoaXMsYyksdGhpcy5sPWMrMSxhPU15LmNhbGwodGhpcyxlLW8saT8iZGJjcy1jb250Ijoic2Jjcy1jb250IiksbC5qb2luKCIiKSthO2wucHVzaChIZyhSeSh0aGlzLGMpKSksYys9MX1zPWwuam9pbigiIik7YnJlYWs7ZGVmYXVsdDpzd2l0Y2goZSl7Y2FzZSAxOnJldHVybiBuPVJ5KHRoaXMsdGhpcy5sKSx0aGlzLmwrKyxuO2Nhc2UgMjpyZXR1cm4gbj0oImkiPT09dD9QeTpOeSkodGhpcyx0aGlzLmwpLHRoaXMubCs9MixuO2Nhc2UgNDpjYXNlLTQ6cmV0dXJuImkiPT09dHx8MD09KDEyOCZ0aGlzW3RoaXMubCszXSk/KG49KGU+MD9XeTpMeSkodGhpcyx0aGlzLmwpLHRoaXMubCs9NCxuKToocj1CeSh0aGlzLHRoaXMubCksdGhpcy5sKz00LHIpO2Nhc2UgODpjYXNlLTg6aWYoImYiPT09dClyZXR1cm4gcj04PT1lP095KHRoaXMsdGhpcy5sKTpPeShbdGhpc1t0aGlzLmwrN10sdGhpc1t0aGlzLmwrNl0sdGhpc1t0aGlzLmwrNV0sdGhpc1t0aGlzLmwrNF0sdGhpc1t0aGlzLmwrM10sdGhpc1t0aGlzLmwrMl0sdGhpc1t0aGlzLmwrMV0sdGhpc1t0aGlzLmwrMF1dLDApLHRoaXMubCs9OCxyO2U9ODtjYXNlIDE2OnM9eXkodGhpcyx0aGlzLmwsZSl9fXJldHVybiB0aGlzLmwrPWUsc312YXIgank9ZnVuY3Rpb24oZSx0LG4pe2Vbbl09MjU1JnQsZVtuKzFdPXQ+Pj44JjI1NSxlW24rMl09dD4+PjE2JjI1NSxlW24rM109dD4+PjI0JjI1NX0senk9ZnVuY3Rpb24oZSx0LG4pe2Vbbl09MjU1JnQsZVtuKzFdPXQ+PjgmMjU1LGVbbisyXT10Pj4xNiYyNTUsZVtuKzNdPXQ+PjI0JjI1NX0sSHk9ZnVuY3Rpb24oZSx0LG4pe2Vbbl09MjU1JnQsZVtuKzFdPXQ+Pj44JjI1NX07ZnVuY3Rpb24gVnkoZSx0LG4pe3ZhciByPTAsaT0wO2lmKCJkYmNzIj09PW4pe2ZvcihpPTA7aSE9dC5sZW5ndGg7KytpKUh5KHRoaXMsdC5jaGFyQ29kZUF0KGkpLHRoaXMubCsyKmkpO3I9Mip0Lmxlbmd0aH1lbHNlIGlmKCJzYmNzIj09PW58fCJjcHN0ciI9PW4pe2Zvcih0PXQucmVwbGFjZSgvW15ceDAwLVx4N0ZdL2csIl8iKSxpPTA7aSE9dC5sZW5ndGg7KytpKXRoaXNbdGhpcy5sK2ldPTI1NSZ0LmNoYXJDb2RlQXQoaSk7cj10Lmxlbmd0aH1lbHNle2lmKCJoZXgiPT09bil7Zm9yKDtpPGU7KytpKXRoaXNbdGhpcy5sKytdPXBhcnNlSW50KHQuc2xpY2UoMippLDIqaSsyKSwxNil8fDA7cmV0dXJuIHRoaXN9aWYoInV0ZjE2bGUiPT09bil7dmFyIGE9TWF0aC5taW4odGhpcy5sK2UsdGhpcy5sZW5ndGgpO2ZvcihpPTA7aTxNYXRoLm1pbih0Lmxlbmd0aCxlKTsrK2kpe3ZhciBvPXQuY2hhckNvZGVBdChpKTt0aGlzW3RoaXMubCsrXT0yNTUmbyx0aGlzW3RoaXMubCsrXT1vPj44fWZvcig7dGhpcy5sPGE7KXRoaXNbdGhpcy5sKytdPTA7cmV0dXJuIHRoaXN9c3dpdGNoKGUpe2Nhc2UgMTpyPTEsdGhpc1t0aGlzLmxdPTI1NSZ0O2JyZWFrO2Nhc2UgMjpyPTIsdGhpc1t0aGlzLmxdPTI1NSZ0LHQ+Pj49OCx0aGlzW3RoaXMubCsxXT0yNTUmdDticmVhaztjYXNlIDM6cj0zLHRoaXNbdGhpcy5sXT0yNTUmdCx0Pj4+PTgsdGhpc1t0aGlzLmwrMV09MjU1JnQsdD4+Pj04LHRoaXNbdGhpcy5sKzJdPTI1NSZ0O2JyZWFrO2Nhc2UgNDpyPTQsankodGhpcyx0LHRoaXMubCk7YnJlYWs7Y2FzZSA4OmlmKHI9OCwiZiI9PT1uKXshZnVuY3Rpb24oZSx0LG4pe3ZhciByPSh0PDB8fDEvdD09LTEvMD8xOjApPDw3LGk9MCxhPTAsbz1yPy10OnQ7aXNGaW5pdGUobyk/MD09bz9pPWE9MDooaT1NYXRoLmZsb29yKE1hdGgubG9nKG8pL01hdGguTE4yKSxhPW8qTWF0aC5wb3coMiw1Mi1pKSxpPD0tMTAyMyYmKCFpc0Zpbml0ZShhKXx8YTxNYXRoLnBvdygyLDUyKSk/aT0tMTAyMjooYS09TWF0aC5wb3coMiw1MiksaSs9MTAyMykpOihpPTIwNDcsYT1pc05hTih0KT8yNjk4NTowKTtmb3IodmFyIGM9MDtjPD01OysrYyxhLz0yNTYpZVtuK2NdPTI1NSZhO2Vbbis2XT0oMTUmaSk8PDR8MTUmYSxlW24rN109aT4+NHxyfSh0aGlzLHQsdGhpcy5sKTticmVha31jYXNlIDE2OmJyZWFrO2Nhc2UtNDpyPTQsenkodGhpcyx0LHRoaXMubCl9fXJldHVybiB0aGlzLmwrPXIsdGhpc31mdW5jdGlvbiBxeShlLHQpe3ZhciBuPXl5KHRoaXMsdGhpcy5sLGUubGVuZ3RoPj4xKTtpZihuIT09ZSl0aHJvdyBuZXcgRXJyb3IodCsiRXhwZWN0ZWQgIitlKyIgc2F3ICIrbik7dGhpcy5sKz1lLmxlbmd0aD4+MX1mdW5jdGlvbiBHeShlLHQpe2UubD10LGUucmVhZF9zaGlmdD1NeSxlLmNoaz1xeSxlLndyaXRlX3NoaWZ0PVZ5fWZ1bmN0aW9uIFh5KGUsdCl7ZS5sKz10fWZ1bmN0aW9uICR5KGUpe3ZhciB0PUpnKGUpO3JldHVybiBHeSh0LDApLHR9ZnVuY3Rpb24gWXkoZSx0LG4pe2lmKGUpe3ZhciByLGksYTtHeShlLGUubHx8MCk7Zm9yKHZhciBvPWUubGVuZ3RoLGM9MCxzPTA7ZS5sPG87KXsxMjgmKGM9ZS5yZWFkX3NoaWZ0KDEpKSYmKGM9KDEyNyZjKSsoKDEyNyZlLnJlYWRfc2hpZnQoMSkpPDw3KSk7dmFyIGw9ZF9bY118fGRfWzY1NTM1XTtmb3IoYT0xMjcmKHI9ZS5yZWFkX3NoaWZ0KDEpKSxpPTE7aTw0JiYxMjgmcjsrK2kpYSs9KDEyNyYocj1lLnJlYWRfc2hpZnQoMSkpKTw8NyppO3M9ZS5sK2E7dmFyIHU9bC5mJiZsLmYoZSxhLG4pO2lmKGUubD1zLHQodSxsLGMpKXJldHVybn19fWZ1bmN0aW9uIEt5KCl7dmFyIGU9W10sdD1ZZz8yNTY6MjA0OCxuPWZ1bmN0aW9uKGUpe3ZhciB0PSR5KGUpO3JldHVybiBHeSh0LDApLHR9LHI9bih0KSxpPWZ1bmN0aW9uKCl7ciYmKHIubCYmKHIubGVuZ3RoPnIubCYmKChyPXIuc2xpY2UoMCxyLmwpKS5sPXIubGVuZ3RoKSxyLmxlbmd0aD4wJiZlLnB1c2gocikpLHI9bnVsbCl9LGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHImJmU8ci5sZW5ndGgtci5sP3I6KGkoKSxyPW4oTWF0aC5tYXgoZSsxLHQpKSl9O3JldHVybntuZXh0OmEscHVzaDpmdW5jdGlvbihlKXtpKCksbnVsbD09KHI9ZSkubCYmKHIubD1yLmxlbmd0aCksYSh0KX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIGkoKSxybShlKX0sX2J1ZnM6ZX19ZnVuY3Rpb24gWnkoZSx0LG4pe3ZhciByPXViKGUpO2lmKHQucz8oci5jUmVsJiYoci5jKz10LnMuYyksci5yUmVsJiYoci5yKz10LnMucikpOihyLmNSZWwmJihyLmMrPXQuYyksci5yUmVsJiYoci5yKz10LnIpKSwhbnx8bi5iaWZmPDEyKXtmb3IoO3IuYz49MjU2OylyLmMtPTI1Njtmb3IoO3Iucj49NjU1MzY7KXIuci09NjU1MzZ9cmV0dXJuIHJ9ZnVuY3Rpb24gSnkoZSx0LG4pe3ZhciByPXViKGUpO3JldHVybiByLnM9Wnkoci5zLHQucyxuKSxyLmU9Wnkoci5lLHQucyxuKSxyfWZ1bmN0aW9uIFF5KGUsdCl7aWYoZS5jUmVsJiZlLmM8MClmb3IoZT11YihlKTtlLmM8MDspZS5jKz10Pjg/MTYzODQ6MjU2O2lmKGUuclJlbCYmZS5yPDApZm9yKGU9dWIoZSk7ZS5yPDA7KWUucis9dD44PzEwNDg1NzY6dD41PzY1NTM2OjE2Mzg0O3ZhciBuPW92KGUpO3JldHVybiBlLmNSZWx8fG51bGw9PWUuY1JlbHx8KG49bi5yZXBsYWNlKC9eKFtBLVpdKS8sIiQkJDEiKSksZS5yUmVsfHxudWxsPT1lLnJSZWx8fChuPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbQS1aXXxeKShcZCspJC8sIiQxJCQkMiIpfShuKSksbn1mdW5jdGlvbiBldihlLHQpe3JldHVybiAwIT1lLnMucnx8ZS5zLnJSZWx8fGUuZS5yIT0odC5iaWZmPj0xMj8xMDQ4NTc1OnQuYmlmZj49OD82NTUzNjoxNjM4NCl8fGUuZS5yUmVsPzAhPWUucy5jfHxlLnMuY1JlbHx8ZS5lLmMhPSh0LmJpZmY+PTEyPzE2MzgzOjI1NSl8fGUuZS5jUmVsP1F5KGUucyx0LmJpZmYpKyI6IitReShlLmUsdC5iaWZmKTooZS5zLnJSZWw/IiI6IiQiKStudihlLnMucikrIjoiKyhlLmUuclJlbD8iIjoiJCIpK252KGUuZS5yKTooZS5zLmNSZWw/IiI6IiQiKStpdihlLnMuYykrIjoiKyhlLmUuY1JlbD8iIjoiJCIpK2l2KGUuZS5jKX1mdW5jdGlvbiB0dihlKXtyZXR1cm4gcGFyc2VJbnQoZS5yZXBsYWNlKC9cJChcZCspJC8sIiQxIiksMTApLTF9ZnVuY3Rpb24gbnYoZSl7cmV0dXJuIiIrKGUrMSl9ZnVuY3Rpb24gcnYoZSl7Zm9yKHZhciB0PWUucmVwbGFjZSgvXlwkKFtBLVpdKS8sIiQxIiksbj0wLHI9MDtyIT09dC5sZW5ndGg7KytyKW49MjYqbit0LmNoYXJDb2RlQXQociktNjQ7cmV0dXJuIG4tMX1mdW5jdGlvbiBpdihlKXtpZihlPDApdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNvbHVtbiAiK2UpO3ZhciB0PSIiO2ZvcigrK2U7ZTtlPU1hdGguZmxvb3IoKGUtMSkvMjYpKXQ9U3RyaW5nLmZyb21DaGFyQ29kZSgoZS0xKSUyNis2NSkrdDtyZXR1cm4gdH1mdW5jdGlvbiBhdihlKXtmb3IodmFyIHQ9MCxuPTAscj0wO3I8ZS5sZW5ndGg7KytyKXt2YXIgaT1lLmNoYXJDb2RlQXQocik7aT49NDgmJmk8PTU3P3Q9MTAqdCsoaS00OCk6aT49NjUmJmk8PTkwJiYobj0yNipuKyhpLTY0KSl9cmV0dXJue2M6bi0xLHI6dC0xfX1mdW5jdGlvbiBvdihlKXtmb3IodmFyIHQ9ZS5jKzEsbj0iIjt0O3Q9KHQtMSkvMjZ8MCluPVN0cmluZy5mcm9tQ2hhckNvZGUoKHQtMSklMjYrNjUpK247cmV0dXJuIG4rKGUucisxKX1mdW5jdGlvbiBjdihlKXt2YXIgdD1lLmluZGV4T2YoIjoiKTtyZXR1cm4tMT09dD97czphdihlKSxlOmF2KGUpfTp7czphdihlLnNsaWNlKDAsdCkpLGU6YXYoZS5zbGljZSh0KzEpKX19ZnVuY3Rpb24gc3YoZSx0KXtyZXR1cm4gdm9pZCAwPT09dHx8Im51bWJlciI9PXR5cGVvZiB0P3N2KGUucyxlLmUpOigic3RyaW5nIiE9dHlwZW9mIGUmJihlPW92KGUpKSwic3RyaW5nIiE9dHlwZW9mIHQmJih0PW92KHQpKSxlPT10P2U6ZSsiOiIrdCl9ZnVuY3Rpb24gbHYoZSl7dmFyIHQ9e3M6e2M6MCxyOjB9LGU6e2M6MCxyOjB9fSxuPTAscj0wLGk9MCxhPWUubGVuZ3RoO2ZvcihuPTA7cjxhJiYhKChpPWUuY2hhckNvZGVBdChyKS02NCk8MXx8aT4yNik7KytyKW49MjYqbitpO2Zvcih0LnMuYz0tLW4sbj0wO3I8YSYmISgoaT1lLmNoYXJDb2RlQXQociktNDgpPDB8fGk+OSk7KytyKW49MTAqbitpO2lmKHQucy5yPS0tbixyPT09YXx8MTAhPWkpcmV0dXJuIHQuZS5jPXQucy5jLHQuZS5yPXQucy5yLHQ7Zm9yKCsrcixuPTA7ciE9YSYmISgoaT1lLmNoYXJDb2RlQXQociktNjQpPDF8fGk+MjYpOysrciluPTI2Km4raTtmb3IodC5lLmM9LS1uLG49MDtyIT1hJiYhKChpPWUuY2hhckNvZGVBdChyKS00OCk8MHx8aT45KTsrK3Ipbj0xMCpuK2k7cmV0dXJuIHQuZS5yPS0tbix0fWZ1bmN0aW9uIHV2KGUsdCl7dmFyIG49ImQiPT1lLnQmJnQgaW5zdGFuY2VvZiBEYXRlO2lmKG51bGwhPWUueil0cnl7cmV0dXJuIGUudz1IbShlLnosbj9uYih0KTp0KX1jYXRjaChlKXt9dHJ5e3JldHVybiBlLnc9SG0oKGUuWEZ8fHt9KS5udW1GbXRJZHx8KG4/MTQ6MCksbj9uYih0KTp0KX1jYXRjaChlKXtyZXR1cm4iIit0fX1mdW5jdGlvbiBmdihlLHQsbil7cmV0dXJuIG51bGw9PWV8fG51bGw9PWUudHx8InoiPT1lLnQ/IiI6dm9pZCAwIT09ZS53P2UudzooImQiPT1lLnQmJiFlLnomJm4mJm4uZGF0ZU5GJiYoZS56PW4uZGF0ZU5GKSwiZSI9PWUudD96dltlLnZdfHxlLnY6dXYoZSxudWxsPT10P2Uudjp0KSl9ZnVuY3Rpb24gZHYoZSx0KXt2YXIgbj10JiZ0LnNoZWV0P3Quc2hlZXQ6IlNoZWV0MSIscj17fTtyZXR1cm4gcltuXT1lLHtTaGVldE5hbWVzOltuXSxTaGVldHM6cn19ZnVuY3Rpb24gaHYoZSx0LG4pe3ZhciByPW58fHt9LGk9ZT9udWxsIT1lWyIhZGF0YSJdOnIuZGVuc2UsYT1lfHx7fTtpJiYhYVsiIWRhdGEiXSYmKGFbIiFkYXRhIl09W10pO3ZhciBvPTAsYz0wO2lmKGEmJm51bGwhPXIub3JpZ2luKXtpZigibnVtYmVyIj09dHlwZW9mIHIub3JpZ2luKW89ci5vcmlnaW47ZWxzZXt2YXIgcz0ic3RyaW5nIj09dHlwZW9mIHIub3JpZ2luP2F2KHIub3JpZ2luKTpyLm9yaWdpbjtvPXMucixjPXMuY31hWyIhcmVmIl18fChhWyIhcmVmIl09IkExOkExIil9dmFyIGw9e3M6e2M6MWU3LHI6MWU3fSxlOntjOjAscjowfX07aWYoYVsiIXJlZiJdKXt2YXIgdT1sdihhWyIhcmVmIl0pO2wucy5jPXUucy5jLGwucy5yPXUucy5yLGwuZS5jPU1hdGgubWF4KGwuZS5jLHUuZS5jKSxsLmUucj1NYXRoLm1heChsLmUucix1LmUuciksLTE9PW8mJihsLmUucj1vPXUuZS5yKzEpfWZvcih2YXIgZj1bXSxkPTA7ZCE9dC5sZW5ndGg7KytkKWlmKHRbZF0pe2lmKCFBcnJheS5pc0FycmF5KHRbZF0pKXRocm93IG5ldyBFcnJvcigiYW9hX3RvX3NoZWV0IGV4cGVjdHMgYW4gYXJyYXkgb2YgYXJyYXlzIik7dmFyIGg9bytkLHA9IiIrKGgrMSk7aSYmKGFbIiFkYXRhIl1baF18fChhWyIhZGF0YSJdW2hdPVtdKSxmPWFbIiFkYXRhIl1baF0pO2Zvcih2YXIgZz0wO2chPXRbZF0ubGVuZ3RoOysrZylpZih2b2lkIDAhPT10W2RdW2ddKXt2YXIgbT17djp0W2RdW2ddfSxiPWMrZztpZihsLnMucj5oJiYobC5zLnI9aCksbC5zLmM+YiYmKGwucy5jPWIpLGwuZS5yPGgmJihsLmUucj1oKSxsLmUuYzxiJiYobC5lLmM9YiksIXRbZF1bZ118fCJvYmplY3QiIT10eXBlb2YgdFtkXVtnXXx8QXJyYXkuaXNBcnJheSh0W2RdW2ddKXx8dFtkXVtnXWluc3RhbmNlb2YgRGF0ZSlpZihBcnJheS5pc0FycmF5KG0udikmJihtLmY9dFtkXVtnXVsxXSxtLnY9bS52WzBdKSxudWxsPT09bS52KWlmKG0uZiltLnQ9Im4iO2Vsc2UgaWYoci5udWxsRXJyb3IpbS50PSJlIixtLnY9MDtlbHNle2lmKCFyLnNoZWV0U3R1YnMpY29udGludWU7bS50PSJ6In1lbHNlIm51bWJlciI9PXR5cGVvZiBtLnY/bS50PSJuIjoiYm9vbGVhbiI9PXR5cGVvZiBtLnY/bS50PSJiIjptLnYgaW5zdGFuY2VvZiBEYXRlPyhtLno9ci5kYXRlTkZ8fGdtWzE0XSxyLlVUQ3x8KG0udj1EYihtLnYpKSxyLmNlbGxEYXRlcz8obS50PSJkIixtLnc9SG0obS56LG5iKG0udixyLmRhdGUxOTA0KSkpOihtLnQ9Im4iLG0udj1uYihtLnYsci5kYXRlMTkwNCksbS53PUhtKG0ueixtLnYpKSk6bS50PSJzIjtlbHNlIG09dFtkXVtnXTtpZihpKWZbYl0mJmZbYl0ueiYmKG0uej1mW2JdLnopLGZbYl09bTtlbHNle3ZhciB5PWl2KGIpK3A7YVt5XSYmYVt5XS56JiYobS56PWFbeV0ueiksYVt5XT1tfX19cmV0dXJuIGwucy5jPDFlNyYmKGFbIiFyZWYiXT1zdihsKSksYX1mdW5jdGlvbiBwdihlLHQpe3JldHVybiBodihudWxsLGUsdCl9ZnVuY3Rpb24gZ3YoZSl7dmFyIHQ9ZS5yZWFkX3NoaWZ0KDQpO3JldHVybiAwPT09dD8iIjplLnJlYWRfc2hpZnQodCwiZGJjcyIpfWZ1bmN0aW9uIG12KGUpe3JldHVybntpY2g6ZS5yZWFkX3NoaWZ0KDIpLGlmbnQ6ZS5yZWFkX3NoaWZ0KDIpfX1mdW5jdGlvbiBidihlLHQpe3ZhciBuPWUubCxyPWUucmVhZF9zaGlmdCgxKSxpPWd2KGUpLGE9W10sbz17dDppLGg6aX07aWYoMCE9KDEmcikpe2Zvcih2YXIgYz1lLnJlYWRfc2hpZnQoNCkscz0wO3MhPWM7KytzKWEucHVzaChtdihlKSk7by5yPWF9ZWxzZSBvLnI9W3tpY2g6MCxpZm50OjB9XTtyZXR1cm4gZS5sPW4rdCxvfXZhciB5dj1idjtmdW5jdGlvbiB2dihlKXt2YXIgdD1lLnJlYWRfc2hpZnQoNCksbj1lLnJlYWRfc2hpZnQoMik7cmV0dXJuIG4rPWUucmVhZF9zaGlmdCgxKTw8MTYsZS5sKysse2M6dCxpU3R5bGVSZWY6bn19ZnVuY3Rpb24geHYoZSl7dmFyIHQ9ZS5yZWFkX3NoaWZ0KDIpO3JldHVybiB0Kz1lLnJlYWRfc2hpZnQoMSk8PDE2LGUubCsrLHtjOi0xLGlTdHlsZVJlZjp0fX12YXIgRHY9Z3Y7ZnVuY3Rpb24gVHYoZSl7dmFyIHQ9ZS5yZWFkX3NoaWZ0KDQpO3JldHVybiAwPT09dHx8NDI5NDk2NzI5NT09PXQ/IiI6ZS5yZWFkX3NoaWZ0KHQsImRiY3MiKX12YXIgd3Y9Z3YsX3Y9VHY7ZnVuY3Rpb24gRXYoZSl7dmFyIHQ9ZS5zbGljZShlLmwsZS5sKzQpLG49MSZ0WzBdLHI9MiZ0WzBdO2UubCs9NDt2YXIgaT0wPT09cj9PeShbMCwwLDAsMCwyNTImdFswXSx0WzFdLHRbMl0sdFszXV0sMCk6V3kodCwwKT4+MjtyZXR1cm4gbj9pLzEwMDppfWZ1bmN0aW9uIFV2KGUpe3ZhciB0PXtzOnt9LGU6e319O3JldHVybiB0LnMucj1lLnJlYWRfc2hpZnQoNCksdC5lLnI9ZS5yZWFkX3NoaWZ0KDQpLHQucy5jPWUucmVhZF9zaGlmdCg0KSx0LmUuYz1lLnJlYWRfc2hpZnQoNCksdH12YXIgQXY9VXY7ZnVuY3Rpb24ga3YoZSl7aWYoZS5sZW5ndGgtZS5sPDgpdGhyb3ciWExTIFhudW0gQnVmZmVyIHVuZGVyZmxvdyI7cmV0dXJuIGUucmVhZF9zaGlmdCg4LCJmIil9ZnVuY3Rpb24gU3YoZSx0KXt2YXIgbj1lLnJlYWRfc2hpZnQoNCk7c3dpdGNoKG4pe2Nhc2UgMDpyZXR1cm4iIjtjYXNlIDQyOTQ5NjcyOTU6Y2FzZSA0Mjk0OTY3Mjk0OnJldHVybnsyOiJCSVRNQVAiLDM6Ik1FVEFGSUxFUElDVCIsODoiRElCIiwxNDoiRU5ITUVUQUZJTEUifVtlLnJlYWRfc2hpZnQoNCldfHwiIn1pZihuPjQwMCl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIENsaXBib2FyZDogIituLnRvU3RyaW5nKDE2KSk7cmV0dXJuIGUubC09NCxlLnJlYWRfc2hpZnQoMCwxPT10PyJscHN0ciI6Imxwd3N0ciIpfXZhciBDdj0yLEZ2PTMsT3Y9MTIsSXY9ODAsUnY9ODEsTnY9W0l2LFJ2XSxQdj17MTp7bjoiQ29kZVBhZ2UiLHQ6Q3Z9LDI6e246IkNhdGVnb3J5Iix0Okl2fSwzOntuOiJQcmVzZW50YXRpb25Gb3JtYXQiLHQ6SXZ9LDQ6e246IkJ5dGVDb3VudCIsdDpGdn0sNTp7bjoiTGluZUNvdW50Iix0OkZ2fSw2OntuOiJQYXJhZ3JhcGhDb3VudCIsdDpGdn0sNzp7bjoiU2xpZGVDb3VudCIsdDpGdn0sODp7bjoiTm90ZUNvdW50Iix0OkZ2fSw5OntuOiJIaWRkZW5Db3VudCIsdDpGdn0sMTA6e246Ik11bHRpbWVkaWFDbGlwQ291bnQiLHQ6RnZ9LDExOntuOiJTY2FsZUNyb3AiLHQ6MTF9LDEyOntuOiJIZWFkaW5nUGFpcnMiLHQ6NDEwOH0sMTM6e246IlRpdGxlc09mUGFydHMiLHQ6NDEyNn0sMTQ6e246Ik1hbmFnZXIiLHQ6SXZ9LDE1OntuOiJDb21wYW55Iix0Okl2fSwxNjp7bjoiTGlua3NVcFRvRGF0ZSIsdDoxMX0sMTc6e246IkNoYXJhY3RlckNvdW50Iix0OkZ2fSwxOTp7bjoiU2hhcmVkRG9jIix0OjExfSwyMjp7bjoiSHlwZXJsaW5rc0NoYW5nZWQiLHQ6MTF9LDIzOntuOiJBcHBWZXJzaW9uIix0OkZ2LHA6InZlcnNpb24ifSwyNDp7bjoiRGlnU2lnIix0OjY1fSwyNjp7bjoiQ29udGVudFR5cGUiLHQ6SXZ9LDI3OntuOiJDb250ZW50U3RhdHVzIix0Okl2fSwyODp7bjoiTGFuZ3VhZ2UiLHQ6SXZ9LDI5OntuOiJWZXJzaW9uIix0Okl2fSwyNTU6e30sMjE0NzQ4MzY0ODp7bjoiTG9jYWxlIix0OjE5fSwyMTQ3NDgzNjUxOntuOiJCZWhhdmlvciIsdDoxOX0sMTkxOTA1NDQzNDp7fX0sQnY9ezE6e246IkNvZGVQYWdlIix0OkN2fSwyOntuOiJUaXRsZSIsdDpJdn0sMzp7bjoiU3ViamVjdCIsdDpJdn0sNDp7bjoiQXV0aG9yIix0Okl2fSw1OntuOiJLZXl3b3JkcyIsdDpJdn0sNjp7bjoiQ29tbWVudHMiLHQ6SXZ9LDc6e246IlRlbXBsYXRlIix0Okl2fSw4OntuOiJMYXN0QXV0aG9yIix0Okl2fSw5OntuOiJSZXZOdW1iZXIiLHQ6SXZ9LDEwOntuOiJFZGl0VGltZSIsdDo2NH0sMTE6e246Ikxhc3RQcmludGVkIix0OjY0fSwxMjp7bjoiQ3JlYXRlZERhdGUiLHQ6NjR9LDEzOntuOiJNb2RpZmllZERhdGUiLHQ6NjR9LDE0OntuOiJQYWdlQ291bnQiLHQ6RnZ9LDE1OntuOiJXb3JkQ291bnQiLHQ6RnZ9LDE2OntuOiJDaGFyQ291bnQiLHQ6RnZ9LDE3OntuOiJUaHVtYm5haWwiLHQ6NzF9LDE4OntuOiJBcHBsaWNhdGlvbiIsdDpJdn0sMTk6e246IkRvY1NlY3VyaXR5Iix0OkZ2fSwyNTU6e30sMjE0NzQ4MzY0ODp7bjoiTG9jYWxlIix0OjE5fSwyMTQ3NDgzNjUxOntuOiJCZWhhdmlvciIsdDoxOX0sMTkxOTA1NDQzNDp7fX0sV3Y9ezE6IlVTIiwyOiJDQSIsMzoiIiw3OiJSVSIsMjA6IkVHIiwzMDoiR1IiLDMxOiJOTCIsMzI6IkJFIiwzMzoiRlIiLDM0OiJFUyIsMzY6IkhVIiwzOToiSVQiLDQxOiJDSCIsNDM6IkFUIiw0NDoiR0IiLDQ1OiJESyIsNDY6IlNFIiw0NzoiTk8iLDQ4OiJQTCIsNDk6IkRFIiw1MjoiTVgiLDU1OiJCUiIsNjE6IkFVIiw2NDoiTloiLDY2OiJUSCIsODE6IkpQIiw4MjoiS1IiLDg0OiJWTiIsODY6IkNOIiw5MDoiVFIiLDEwNToiSlMiLDIxMzoiRFoiLDIxNjoiTUEiLDIxODoiTFkiLDM1MToiUFQiLDM1NDoiSVMiLDM1ODoiRkkiLDQyMDoiQ1oiLDg4NjoiVFciLDk2MToiTEIiLDk2MjoiSk8iLDk2MzoiU1kiLDk2NDoiSVEiLDk2NToiS1ciLDk2NjoiU0EiLDk3MToiQUUiLDk3MjoiSUwiLDk3NDoiUUEiLDk4MToiSVIiLDY1NTM1OiJVUyJ9LEx2PVtudWxsLCJzb2xpZCIsIm1lZGl1bUdyYXkiLCJkYXJrR3JheSIsImxpZ2h0R3JheSIsImRhcmtIb3Jpem9udGFsIiwiZGFya1ZlcnRpY2FsIiwiZGFya0Rvd24iLCJkYXJrVXAiLCJkYXJrR3JpZCIsImRhcmtUcmVsbGlzIiwibGlnaHRIb3Jpem9udGFsIiwibGlnaHRWZXJ0aWNhbCIsImxpZ2h0RG93biIsImxpZ2h0VXAiLCJsaWdodEdyaWQiLCJsaWdodFRyZWxsaXMiLCJncmF5MTI1IiwiZ3JheTA2MjUiXTtmdW5jdGlvbiBNdihlKXtyZXR1cm4gZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybltlPj4xNiYyNTUsZT4+OCYyNTUsMjU1JmVdfSkpfXZhciBqdj11YihNdihbMCwxNjc3NzIxNSwxNjcxMTY4MCw2NTI4MCwyNTUsMTY3NzY5NjAsMTY3MTE5MzUsNjU1MzUsMCwxNjc3NzIxNSwxNjcxMTY4MCw2NTI4MCwyNTUsMTY3NzY5NjAsMTY3MTE5MzUsNjU1MzUsODM4ODYwOCwzMjc2OCwxMjgsODQyMTM3Niw4Mzg4NzM2LDMyODk2LDEyNjMyMjU2LDg0MjE1MDQsMTAwNjY0MzEsMTAwNDAxNjYsMTY3NzcxNjQsMTM0MzQ4NzksNjY4NDc3NCwxNjc0NDU3NiwyNjMxNiwxMzQyMTgyMywxMjgsMTY3MTE5MzUsMTY3NzY5NjAsNjU1MzUsODM4ODczNiw4Mzg4NjA4LDMyODk2LDI1NSw1MjQ3OSwxMzQzNDg3OSwxMzQzNDgyOCwxNjc3NzExMywxMDA3OTQ4NywxNjc1MTA1MiwxMzQwODc2NywxNjc2NDA1NywzMzY4NzAzLDMzOTQ3NjQsMTAwNzkyMzIsMTY3NjM5MDQsMTY3NTA4NDgsMTY3Mzc3OTIsNjcxMDkzNyw5ODY4OTUwLDEzMTU4LDMzODE2MDYsMTMwNTYsMzM1NTM5MiwxMDA0MDA2NCwxMDA0MDE2NiwzMzU1NTQ1LDMzNTU0NDMsMCwxNjc3NzIxNSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSkpLHp2PXswOiIjTlVMTCEiLDc6IiNESVYvMCEiLDE1OiIjVkFMVUUhIiwyMzoiI1JFRiEiLDI5OiIjTkFNRT8iLDM2OiIjTlVNISIsNDI6IiNOL0EiLDQzOiIjR0VUVElOR19EQVRBIiwyNTU6IiNXVEY/In0sSHY9eyIjTlVMTCEiOjAsIiNESVYvMCEiOjcsIiNWQUxVRSEiOjE1LCIjUkVGISI6MjMsIiNOQU1FPyI6MjksIiNOVU0hIjozNiwiI04vQSI6NDIsIiNHRVRUSU5HX0RBVEEiOjQzLCIjV1RGPyI6MjU1fSxWdj1bIl94bG5tLkNvbnNvbGlkYXRlX0FyZWEiLCJfeGxubS5BdXRvX09wZW4iLCJfeGxubS5BdXRvX0Nsb3NlIiwiX3hsbm0uRXh0cmFjdCIsIl94bG5tLkRhdGFiYXNlIiwiX3hsbm0uQ3JpdGVyaWEiLCJfeGxubS5QcmludF9BcmVhIiwiX3hsbm0uUHJpbnRfVGl0bGVzIiwiX3hsbm0uUmVjb3JkZXIiLCJfeGxubS5EYXRhX0Zvcm0iLCJfeGxubS5BdXRvX0FjdGl2YXRlIiwiX3hsbm0uQXV0b19EZWFjdGl2YXRlIiwiX3hsbm0uU2hlZXRfVGl0bGUiLCJfeGxubS5fRmlsdGVyRGF0YWJhc2UiXSxxdj17ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Lm1haW4reG1sIjoid29ya2Jvb2tzIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0Lm1hY3JvRW5hYmxlZC5tYWluK3htbCI6Indvcmtib29rcyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9FbmFibGVkLm1haW4iOiJ3b3JrYm9va3MiLCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuYWRkaW4ubWFjcm9FbmFibGVkLm1haW4reG1sIjoid29ya2Jvb2tzIiwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudGVtcGxhdGUubWFpbit4bWwiOiJ3b3JrYm9va3MiLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC53b3Jrc2hlZXQreG1sIjoic2hlZXRzIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLndvcmtzaGVldCI6InNoZWV0cyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5iaW5JbmRleFdzIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNoYXJ0c2hlZXQreG1sIjoiY2hhcnRzIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmNoYXJ0c2hlZXQiOiJjaGFydHMiLCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwubWFjcm9zaGVldCt4bWwiOiJtYWNyb3MiLCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwubWFjcm9zaGVldCI6Im1hY3JvcyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5pbnRsbWFjcm9zaGVldCI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuYmluSW5kZXhNcyI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5kaWFsb2dzaGVldCt4bWwiOiJkaWFsb2dzIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmRpYWxvZ3NoZWV0IjoiZGlhbG9ncyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoYXJlZFN0cmluZ3MreG1sIjoic3RycyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGFyZWRTdHJpbmdzIjoic3RycyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnN0eWxlcyt4bWwiOiJzdHlsZXMiLCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc3R5bGVzIjoic3R5bGVzIiwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UuY29yZS1wcm9wZXJ0aWVzK3htbCI6ImNvcmVwcm9wcyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5jdXN0b20tcHJvcGVydGllcyt4bWwiOiJjdXN0cHJvcHMiLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZXh0ZW5kZWQtcHJvcGVydGllcyt4bWwiOiJleHRwcm9wcyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5jdXN0b21YbWxQcm9wZXJ0aWVzK3htbCI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5jdXN0b21Qcm9wZXJ0eSI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5jb21tZW50cyt4bWwiOiJjb21tZW50cyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5jb21tZW50cyI6ImNvbW1lbnRzIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRocmVhZGVkY29tbWVudHMreG1sIjoidGhyZWFkZWRjb21tZW50cyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5wZXJzb24reG1sIjoicGVvcGxlIiwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXRNZXRhZGF0YSt4bWwiOiJtZXRhZGF0YSIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldE1ldGFkYXRhIjoibWV0YWRhdGEiLCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwucGl2b3RUYWJsZSI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5waXZvdFRhYmxlK3htbCI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZ21sLmNoYXJ0K3htbCI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNlLmNoYXJ0Y29sb3JzdHlsZSt4bWwiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZS5jaGFydHN0eWxlK3htbCI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNlLmNoYXJ0ZXgreG1sIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5jYWxjQ2hhaW4iOiJjYWxjY2hhaW5zIiwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuY2FsY0NoYWluK3htbCI6ImNhbGNjaGFpbnMiLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5wcmludGVyU2V0dGluZ3MiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZS5hY3RpdmVYIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1vZmZpY2UuYWN0aXZlWCt4bWwiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmF0dGFjaGVkVG9vbGJhcnMiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmNvbm5lY3Rpb25zIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNvbm5lY3Rpb25zK3htbCI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuZXh0ZXJuYWxMaW5rIjoibGlua3MiLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5leHRlcm5hbExpbmsreG1sIjoibGlua3MiLCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwucGl2b3RDYWNoZURlZmluaXRpb24iOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnBpdm90Q2FjaGVSZWNvcmRzIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnBpdm90Q2FjaGVEZWZpbml0aW9uK3htbCI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5waXZvdENhY2hlUmVjb3Jkcyt4bWwiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnF1ZXJ5VGFibGUiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwucXVlcnlUYWJsZSt4bWwiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnVzZXJOYW1lcyI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwucmV2aXNpb25IZWFkZXJzIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5yZXZpc2lvbkxvZyI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5yZXZpc2lvbkhlYWRlcnMreG1sIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnJldmlzaW9uTG9nK3htbCI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC51c2VyTmFtZXMreG1sIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC50YWJsZVNpbmdsZUNlbGxzIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRhYmxlU2luZ2xlQ2VsbHMreG1sIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zbGljZXIiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNsaWNlckNhY2hlIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zbGljZXIreG1sIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zbGljZXJDYWNoZSt4bWwiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLndzU29ydE1hcCI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwudGFibGUiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudGFibGUreG1sIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC50aGVtZSt4bWwiOiJ0aGVtZXMiLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQudGhlbWVPdmVycmlkZSt4bWwiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLlRpbWVsaW5lK3htbCI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuVGltZWxpbmVDYWNoZSt4bWwiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZS52YmFQcm9qZWN0IjoidmJhIiwiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZS52YmFQcm9qZWN0U2lnbmF0dXJlIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1vZmZpY2Uudm9sYXRpbGVEZXBlbmRlbmNpZXMiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudm9sYXRpbGVEZXBlbmRlbmNpZXMreG1sIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5jb250cm9scHJvcGVydGllcyt4bWwiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50Lm1vZGVsK2RhdGEiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLlN1cnZleSt4bWwiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmcreG1sIjoiZHJhd2luZ3MiLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZ21sLmNoYXJ0c2hhcGVzK3htbCI6IlRPRE8iLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZ21sLmRpYWdyYW1Db2xvcnMreG1sIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuZGlhZ3JhbURhdGEreG1sIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuZGlhZ3JhbUxheW91dCt4bWwiOiJUT0RPIiwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5kaWFncmFtU3R5bGUreG1sIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC52bWxEcmF3aW5nIjoiVE9ETyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1wYWNrYWdlLnJlbGF0aW9uc2hpcHMreG1sIjoicmVscyIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5vbGVPYmplY3QiOiJUT0RPIiwiaW1hZ2UvcG5nIjoiVE9ETyIsc2hlZXQ6ImpzIn07dmFyIEd2PXtXQjoiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9vZmZpY2VEb2N1bWVudCIsU0hFRVQ6Imh0dHA6Ly9zaGVldGpzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvb2ZmaWNlRG9jdW1lbnQiLEhMSU5LOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2h5cGVybGluayIsVk1MOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3ZtbERyYXdpbmciLFhQQVRIOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2V4dGVybmFsTGlua1BhdGgiLFhNSVNTOiJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L3JlbGF0aW9uc2hpcHMveGxFeHRlcm5hbExpbmtQYXRoL3hsUGF0aE1pc3NpbmciLFhMSU5LOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2V4dGVybmFsTGluayIsQ1hNTDoiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9jdXN0b21YbWwiLENYTUxQOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2N1c3RvbVhtbFByb3BzIixDTU5UOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2NvbW1lbnRzIixDT1JFX1BST1BTOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMvbWV0YWRhdGEvY29yZS1wcm9wZXJ0aWVzIixFWFRfUFJPUFM6Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvZXh0ZW5kZWQtcHJvcGVydGllcyIsQ1VTVF9QUk9QUzoiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9jdXN0b20tcHJvcGVydGllcyIsU1NUOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3NoYXJlZFN0cmluZ3MiLFNUWToiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9zdHlsZXMiLFRIRU1FOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3RoZW1lIixDSEFSVDoiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9jaGFydCIsQ0hBUlRFWDoiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvMjAxNC9yZWxhdGlvbnNoaXBzL2NoYXJ0RXgiLENTOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2NoYXJ0c2hlZXQiLFdTOlsiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy93b3Jrc2hlZXQiLCJodHRwOi8vcHVybC5vY2xjLm9yZy9vb3htbC9vZmZpY2VEb2N1bWVudC9yZWxhdGlvbnNoaXBzL3dvcmtzaGVldCJdLERTOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2RpYWxvZ3NoZWV0IixNUzoiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvMjAwNi9yZWxhdGlvbnNoaXBzL3hsTWFjcm9zaGVldCIsSU1HOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2ltYWdlIixEUkFXOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2RyYXdpbmciLFhMTUVUQToiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9zaGVldE1ldGFkYXRhIixUQ01OVDoiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvMjAxNy8xMC9yZWxhdGlvbnNoaXBzL3RocmVhZGVkQ29tbWVudCIsUEVPUExFOiJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDE3LzEwL3JlbGF0aW9uc2hpcHMvcGVyc29uIixDT05OOiJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2Nvbm5lY3Rpb25zIixWQkE6Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMDYvcmVsYXRpb25zaGlwcy92YmFQcm9qZWN0In07ZnVuY3Rpb24gWHYoZSl7dmFyIHQ9ZS5sYXN0SW5kZXhPZigiLyIpO3JldHVybiBlLnNsaWNlKDAsdCsxKSsiX3JlbHMvIitlLnNsaWNlKHQrMSkrIi5yZWxzIn1mdW5jdGlvbiAkdihlLHQpe3ZhciBuPXsiIWlkIjp7fX07aWYoIWUpcmV0dXJuIG47Ii8iIT09dC5jaGFyQXQoMCkmJih0PSIvIit0KTt2YXIgcj17fTtyZXR1cm4oZS5tYXRjaChQYil8fFtdKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgaT1MYihlKTtpZigiPFJlbGF0aW9uc2hpcCI9PT1pWzBdKXt2YXIgYT17fTthLlR5cGU9aS5UeXBlLGEuVGFyZ2V0PUhiKGkuVGFyZ2V0KSxhLklkPWkuSWQsaS5UYXJnZXRNb2RlJiYoYS5UYXJnZXRNb2RlPWkuVGFyZ2V0TW9kZSk7dmFyIG89IkV4dGVybmFsIj09PWkuVGFyZ2V0TW9kZT9pLlRhcmdldDpPYihpLlRhcmdldCx0KTtuW29dPWEscltpLklkXT1hfX0pKSxuWyIhaWQiXT1yLG59dmFyIFl2PSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0Ijt2YXIgS3Y9W1siY3A6Y2F0ZWdvcnkiLCJDYXRlZ29yeSJdLFsiY3A6Y29udGVudFN0YXR1cyIsIkNvbnRlbnRTdGF0dXMiXSxbImNwOmtleXdvcmRzIiwiS2V5d29yZHMiXSxbImNwOmxhc3RNb2RpZmllZEJ5IiwiTGFzdEF1dGhvciJdLFsiY3A6bGFzdFByaW50ZWQiLCJMYXN0UHJpbnRlZCJdLFsiY3A6cmV2aXNpb24iLCJSZXZOdW1iZXIiXSxbImNwOnZlcnNpb24iLCJWZXJzaW9uIl0sWyJkYzpjcmVhdG9yIiwiQXV0aG9yIl0sWyJkYzpkZXNjcmlwdGlvbiIsIkNvbW1lbnRzIl0sWyJkYzppZGVudGlmaWVyIiwiSWRlbnRpZmllciJdLFsiZGM6bGFuZ3VhZ2UiLCJMYW5ndWFnZSJdLFsiZGM6c3ViamVjdCIsIlN1YmplY3QiXSxbImRjOnRpdGxlIiwiVGl0bGUiXSxbImRjdGVybXM6Y3JlYXRlZCIsIkNyZWF0ZWREYXRlIiwiZGF0ZSJdLFsiZGN0ZXJtczptb2RpZmllZCIsIk1vZGlmaWVkRGF0ZSIsImRhdGUiXV0sWnY9ZnVuY3Rpb24oKXtmb3IodmFyIGU9bmV3IEFycmF5KEt2Lmxlbmd0aCksdD0wO3Q8S3YubGVuZ3RoOysrdCl7dmFyIG49S3ZbdF0scj0iKD86IituWzBdLnNsaWNlKDAsblswXS5pbmRleE9mKCI6IikpKyI6KSIrblswXS5zbGljZShuWzBdLmluZGV4T2YoIjoiKSsxKTtlW3RdPW5ldyBSZWdFeHAoIjwiK3IrIltePl0qPihbXFxzXFxTXSo/KTwvIityKyI+Iil9cmV0dXJuIGV9KCk7ZnVuY3Rpb24gSnYoZSl7dmFyIHQ9e307ZT1RYihlKTtmb3IodmFyIG49MDtuPEt2Lmxlbmd0aDsrK24pe3ZhciByPUt2W25dLGk9ZS5tYXRjaChadltuXSk7bnVsbCE9aSYmaS5sZW5ndGg+MCYmKHRbclsxXV09SGIoaVsxXSkpLCJkYXRlIj09PXJbMl0mJnRbclsxXV0mJih0W3JbMV1dPXNiKHRbclsxXV0pKX1yZXR1cm4gdH12YXIgUXY9W1siQXBwbGljYXRpb24iLCJBcHBsaWNhdGlvbiIsInN0cmluZyJdLFsiQXBwVmVyc2lvbiIsIkFwcFZlcnNpb24iLCJzdHJpbmciXSxbIkNvbXBhbnkiLCJDb21wYW55Iiwic3RyaW5nIl0sWyJEb2NTZWN1cml0eSIsIkRvY1NlY3VyaXR5Iiwic3RyaW5nIl0sWyJNYW5hZ2VyIiwiTWFuYWdlciIsInN0cmluZyJdLFsiSHlwZXJsaW5rc0NoYW5nZWQiLCJIeXBlcmxpbmtzQ2hhbmdlZCIsImJvb2wiXSxbIlNoYXJlZERvYyIsIlNoYXJlZERvYyIsImJvb2wiXSxbIkxpbmtzVXBUb0RhdGUiLCJMaW5rc1VwVG9EYXRlIiwiYm9vbCJdLFsiU2NhbGVDcm9wIiwiU2NhbGVDcm9wIiwiYm9vbCJdLFsiSGVhZGluZ1BhaXJzIiwiSGVhZGluZ1BhaXJzIiwicmF3Il0sWyJUaXRsZXNPZlBhcnRzIiwiVGl0bGVzT2ZQYXJ0cyIsInJhdyJdXTtmdW5jdGlvbiBleChlLHQsbixyKXt2YXIgaT1bXTtpZigic3RyaW5nIj09dHlwZW9mIGUpaT1veShlLHIpO2Vsc2UgZm9yKHZhciBhPTA7YTxlLmxlbmd0aDsrK2EpaT1pLmNvbmNhdChlW2FdLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJue3Y6ZX19KSkpO3ZhciBvPSJzdHJpbmciPT10eXBlb2YgdD9veSh0LHIpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudn0pKTp0LGM9MCxzPTA7aWYoby5sZW5ndGg+MClmb3IodmFyIGw9MDtsIT09aS5sZW5ndGg7bCs9Mil7c3dpdGNoKHM9K2lbbCsxXS52LGlbbF0udil7Y2FzZSJXb3Jrc2hlZXRzIjpjYXNlIuW3peS9nOihqCI6Y2FzZSLQm9C40YHRgtGLIjpjYXNlItij2YjYsdin2YIg2KfZhNi52YXZhCI6Y2FzZSLjg6/jg7zjgq/jgrfjg7zjg4giOmNhc2Ui15LXnNeZ15XXoNeV16og16LXkdeV15PXlCI6Y2FzZSJBcmJlaXRzYmzDpHR0ZXIiOmNhc2Uiw4dhbMSxxZ9tYSBTYXlmYWxhcsSxIjpjYXNlIkZldWlsbGVzIGRlIGNhbGN1bCI6Y2FzZSJGb2dsaSBkaSBsYXZvcm8iOmNhc2UiRm9saGFzIGRlIGPDoWxjdWxvIjpjYXNlIlBsYW5pbGhhcyI6Y2FzZSJSZWduZWFyayI6Y2FzZSJIb2phcyBkZSBjw6FsY3VsbyI6Y2FzZSJXZXJrYmxhZGVuIjpuLldvcmtzaGVldHM9cyxuLlNoZWV0TmFtZXM9by5zbGljZShjLGMrcyk7YnJlYWs7Y2FzZSJOYW1lZCBSYW5nZXMiOmNhc2UiUmFuZ29zIGNvbiBub21icmUiOmNhc2Ui5ZCN5YmN5LuY44GN5LiA6KanIjpjYXNlIkJlbmFubnRlIEJlcmVpY2hlIjpjYXNlIk5hdm5naXZuZSBvbXLDpWRlciI6bi5OYW1lZFJhbmdlcz1zLG4uRGVmaW5lZE5hbWVzPW8uc2xpY2UoYyxjK3MpO2JyZWFrO2Nhc2UiQ2hhcnRzIjpjYXNlIkRpYWdyYW1tZSI6bi5DaGFydHNoZWV0cz1zLG4uQ2hhcnROYW1lcz1vLnNsaWNlKGMsYytzKX1jKz1zfX12YXIgdHg9LzxbXj5dKz5bXjxdKi9nO3ZhciBueCxyeD17VGl0bGU6IlRpdGxlIixTdWJqZWN0OiJTdWJqZWN0IixBdXRob3I6IkF1dGhvciIsS2V5d29yZHM6IktleXdvcmRzIixDb21tZW50czoiRGVzY3JpcHRpb24iLExhc3RBdXRob3I6Ikxhc3RBdXRob3IiLFJldk51bWJlcjoiUmV2aXNpb24iLEFwcGxpY2F0aW9uOiJBcHBOYW1lIixMYXN0UHJpbnRlZDoiTGFzdFByaW50ZWQiLENyZWF0ZWREYXRlOiJDcmVhdGVkIixNb2RpZmllZERhdGU6Ikxhc3RTYXZlZCIsQ2F0ZWdvcnk6IkNhdGVnb3J5IixNYW5hZ2VyOiJNYW5hZ2VyIixDb21wYW55OiJDb21wYW55IixBcHBWZXJzaW9uOiJWZXJzaW9uIixDb250ZW50U3RhdHVzOiJDb250ZW50U3RhdHVzIixJZGVudGlmaWVyOiJJZGVudGlmaWVyIixMYW5ndWFnZToiTGFuZ3VhZ2UifTtmdW5jdGlvbiBpeChlLHQsbil7bnh8fChueD1KbShyeCkpLGVbdD1ueFt0XXx8dF09bn1mdW5jdGlvbiBheChlKXt2YXIgdD1lLnJlYWRfc2hpZnQoNCksbj1lLnJlYWRfc2hpZnQoNCk7cmV0dXJuIG5ldyBEYXRlKDFlMyoobi8xZTcqTWF0aC5wb3coMiwzMikrdC8xZTctMTE2NDQ0NzM2MDApKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1wuMDAwLywiIil9ZnVuY3Rpb24gb3goZSx0LG4pe3ZhciByPWUubCxpPWUucmVhZF9zaGlmdCgwLCJscHN0ci1jcCIpO2lmKG4pZm9yKDtlLmwtciYzOykrK2UubDtyZXR1cm4gaX1mdW5jdGlvbiBjeChlLHQsbil7dmFyIHI9ZS5yZWFkX3NoaWZ0KDAsImxwd3N0ciIpO3JldHVybiBuJiYoZS5sKz00LShyLmxlbmd0aCsxJjMpJjMpLHJ9ZnVuY3Rpb24gc3goZSx0LG4pe3JldHVybiAzMT09PXQ/Y3goZSk6b3goZSwwLG4pfWZ1bmN0aW9uIGx4KGUsdCxuKXtyZXR1cm4gc3goZSx0LCExPT09bj8wOjQpfWZ1bmN0aW9uIHV4KGUpe3ZhciB0PWUubCxuPWh4KGUsUnYpO3JldHVybiAwPT1lW2UubF0mJjA9PWVbZS5sKzFdJiZlLmwtdCYyJiYoZS5sKz0yKSxbbixoeChlLEZ2KV19ZnVuY3Rpb24gZngoZSx0KXtmb3IodmFyIG49ZS5yZWFkX3NoaWZ0KDQpLHI9e30saT0wO2khPW47KytpKXt2YXIgYT1lLnJlYWRfc2hpZnQoNCksbz1lLnJlYWRfc2hpZnQoNCk7clthXT1lLnJlYWRfc2hpZnQobywxMjAwPT09dD8idXRmMTZsZSI6InV0ZjgiKS5yZXBsYWNlKGltLCIiKS5yZXBsYWNlKGFtLCIhIiksMTIwMD09PXQmJm8lMiYmKGUubCs9Mil9cmV0dXJuIDMmZS5sJiYoZS5sPWUubD4+Mzw8Mikscn1mdW5jdGlvbiBkeChlKXt2YXIgdD1lLnJlYWRfc2hpZnQoNCksbj1lLnNsaWNlKGUubCxlLmwrdCk7cmV0dXJuIGUubCs9dCwoMyZ0KT4wJiYoZS5sKz00LSgzJnQpJjMpLG59ZnVuY3Rpb24gaHgoZSx0LG4pe3ZhciByLGk9ZS5yZWFkX3NoaWZ0KDIpLGE9bnx8e307aWYoZS5sKz0yLHQhPT1PdiYmaSE9PXQmJi0xPT09TnYuaW5kZXhPZih0KSYmKDQxMjYhPSg2NTUzNCZ0KXx8NDEyNiE9KDY1NTM0JmkpKSl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIHR5cGUgIit0KyIgc2F3ICIraSk7c3dpdGNoKHQ9PT1Pdj9pOnQpe2Nhc2UgMjpyZXR1cm4gcj1lLnJlYWRfc2hpZnQoMiwiaSIpLGEucmF3fHwoZS5sKz0yKSxyO2Nhc2UgMzpyZXR1cm4gcj1lLnJlYWRfc2hpZnQoNCwiaSIpO2Nhc2UgMTE6cmV0dXJuIDAhPT1lLnJlYWRfc2hpZnQoNCk7Y2FzZSAxOTpyZXR1cm4gcj1lLnJlYWRfc2hpZnQoNCk7Y2FzZSAzMDpyZXR1cm4gb3goZSwwLDQpLnJlcGxhY2UoaW0sIiIpO2Nhc2UgMzE6cmV0dXJuIGN4KGUpO2Nhc2UgNjQ6cmV0dXJuIGF4KGUpO2Nhc2UgNjU6cmV0dXJuIGR4KGUpO2Nhc2UgNzE6cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiB0LlNpemU9ZS5yZWFkX3NoaWZ0KDQpLGUubCs9dC5TaXplKzMtKHQuU2l6ZS0xKSU0LHR9KGUpO2Nhc2UgODA6cmV0dXJuIGx4KGUsaSwhYS5yYXcpLnJlcGxhY2UoaW0sIiIpO2Nhc2UgODE6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJWdFVuYWxpZ25lZFN0cmluZyBtdXN0IGhhdmUgcG9zaXRpdmUgbGVuZ3RoIik7cmV0dXJuIHN4KGUsdCwwKX0oZSxpKS5yZXBsYWNlKGltLCIiKTtjYXNlIDQxMDg6cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLnJlYWRfc2hpZnQoNCksbj1bXSxyPTA7cjx0LzI7KytyKW4ucHVzaCh1eChlKSk7cmV0dXJuIG59KGUpO2Nhc2UgNDEyNjpjYXNlIDQxMjc6cmV0dXJuIDQxMjc9PWk/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUucmVhZF9zaGlmdCg0KSxuPVtdLHI9MDtyIT10Oysrcil7dmFyIGk9ZS5sO25bcl09ZS5yZWFkX3NoaWZ0KDAsImxwd3N0ciIpLnJlcGxhY2UoaW0sIiIpLGUubC1pJjImJihlLmwrPTIpfXJldHVybiBufShlKTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5yZWFkX3NoaWZ0KDQpLG49W10scj0wO3IhPXQ7KytyKW5bcl09ZS5yZWFkX3NoaWZ0KDAsImxwc3RyLWNwIikucmVwbGFjZShpbSwiIik7cmV0dXJuIG59KGUpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJUeXBlZFByb3BlcnR5VmFsdWUgdW5yZWNvZ25pemVkIHR5cGUgIit0KyIgIitpKX19ZnVuY3Rpb24gcHgoZSx0KXt2YXIgbj1lLmwscj1lLnJlYWRfc2hpZnQoNCksaT1lLnJlYWRfc2hpZnQoNCksYT1bXSxvPTAsYz0wLHM9LTEsbD17fTtmb3Iobz0wO28hPWk7KytvKXt2YXIgdT1lLnJlYWRfc2hpZnQoNCksZj1lLnJlYWRfc2hpZnQoNCk7YVtvXT1bdSxmK25dfWEuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVsxXS10WzFdfSkpO3ZhciBkPXt9O2ZvcihvPTA7byE9aTsrK28pe2lmKGUubCE9PWFbb11bMV0pe3ZhciBoPSEwO2lmKG8+MCYmdClzd2l0Y2godFthW28tMV1bMF1dLnQpe2Nhc2UgMjplLmwrMj09PWFbb11bMV0mJihlLmwrPTIsaD0hMSk7YnJlYWs7Y2FzZSA4MDpjYXNlIDQxMDg6ZS5sPD1hW29dWzFdJiYoZS5sPWFbb11bMV0saD0hMSl9aWYoKCF0fHwwPT1vKSYmZS5sPD1hW29dWzFdJiYoaD0hMSxlLmw9YVtvXVsxXSksaCl0aHJvdyBuZXcgRXJyb3IoIlJlYWQgRXJyb3I6IEV4cGVjdGVkIGFkZHJlc3MgIithW29dWzFdKyIgYXQgIitlLmwrIiA6IitvKX1pZih0KXtpZigwPT1hW29dWzBdJiZhLmxlbmd0aD5vKzEmJmFbb11bMV09PWFbbysxXVsxXSljb250aW51ZTt2YXIgcD10W2Fbb11bMF1dO2lmKGRbcC5uXT1oeChlLHAudCx7cmF3OiEwfSksInZlcnNpb24iPT09cC5wJiYoZFtwLm5dPVN0cmluZyhkW3Aubl0+PjE2KSsiLiIrKCIwMDAwIitTdHJpbmcoNjU1MzUmZFtwLm5dKSkuc2xpY2UoLTQpKSwiQ29kZVBhZ2UiPT1wLm4pc3dpdGNoKGRbcC5uXSl7Y2FzZSAwOmRbcC5uXT0xMjUyO2Nhc2UgODc0OmNhc2UgOTMyOmNhc2UgOTM2OmNhc2UgOTQ5OmNhc2UgOTUwOmNhc2UgMTI1MDpjYXNlIDEyNTE6Y2FzZSAxMjUzOmNhc2UgMTI1NDpjYXNlIDEyNTU6Y2FzZSAxMjU2OmNhc2UgMTI1NzpjYXNlIDEyNTg6Y2FzZSAxZTQ6Y2FzZSAxMjAwOmNhc2UgMTIwMTpjYXNlIDEyNTI6Y2FzZSA2NWUzOmNhc2UtNTM2OmNhc2UgNjUwMDE6Y2FzZS01MzU6QmcoYz1kW3Aubl0+Pj4wJjY1NTM1KTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgQ29kZVBhZ2U6ICIrZFtwLm5dKX19ZWxzZSBpZigxPT09YVtvXVswXSl7aWYoYz1kLkNvZGVQYWdlPWh4KGUsQ3YpLEJnKGMpLC0xIT09cyl7dmFyIGc9ZS5sO2UubD1hW3NdWzFdLGw9ZngoZSxjKSxlLmw9Z319ZWxzZSBpZigwPT09YVtvXVswXSl7aWYoMD09PWMpe3M9byxlLmw9YVtvKzFdWzFdO2NvbnRpbnVlfWw9ZngoZSxjKX1lbHNle3ZhciBtLGI9bFthW29dWzBdXTtzd2l0Y2goZVtlLmxdKXtjYXNlIDY1OmUubCs9NCxtPWR4KGUpO2JyZWFrO2Nhc2UgMzA6Y2FzZSAzMTplLmwrPTQsbT1seChlLGVbZS5sLTRdKS5yZXBsYWNlKC9cdTAwMDArJC8sIiIpO2JyZWFrO2Nhc2UgMzplLmwrPTQsbT1lLnJlYWRfc2hpZnQoNCwiaSIpO2JyZWFrO2Nhc2UgMTk6ZS5sKz00LG09ZS5yZWFkX3NoaWZ0KDQpO2JyZWFrO2Nhc2UgNTplLmwrPTQsbT1lLnJlYWRfc2hpZnQoOCwiZiIpO2JyZWFrO2Nhc2UgMTE6ZS5sKz00LG09YngoZSw0KTticmVhaztjYXNlIDY0OmUubCs9NCxtPXNiKGF4KGUpKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidW5wYXJzZWQgdmFsdWU6ICIrZVtlLmxdKX1kW2JdPW19fXJldHVybiBlLmw9bityLGR9ZnVuY3Rpb24gZ3goZSx0LG4pe3ZhciByPWUuY29udGVudDtpZighcilyZXR1cm57fTtHeShyLDApO3ZhciBpLGEsbyxjLHM9MDtyLmNoaygiZmVmZiIsIkJ5dGUgT3JkZXI6ICIpLHIucmVhZF9zaGlmdCgyKTt2YXIgbD1yLnJlYWRfc2hpZnQoNCksdT1yLnJlYWRfc2hpZnQoMTYpO2lmKHUhPT1LbS51dGlscy5jb25zdHMuSEVBREVSX0NMU0lEJiZ1IT09bil0aHJvdyBuZXcgRXJyb3IoIkJhZCBQcm9wZXJ0eVNldCBDTFNJRCAiK3UpO2lmKDEhPT0oaT1yLnJlYWRfc2hpZnQoNCkpJiYyIT09aSl0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCAjU2V0czogIitpKTtpZihhPXIucmVhZF9zaGlmdCgxNiksYz1yLnJlYWRfc2hpZnQoNCksMT09PWkmJmMhPT1yLmwpdGhyb3cgbmV3IEVycm9yKCJMZW5ndGggbWlzbWF0Y2g6ICIrYysiICE9PSAiK3IubCk7Mj09PWkmJihvPXIucmVhZF9zaGlmdCgxNikscz1yLnJlYWRfc2hpZnQoNCkpO3ZhciBmLGQ9cHgocix0KSxoPXtTeXN0ZW1JZGVudGlmaWVyOmx9O2Zvcih2YXIgcCBpbiBkKWhbcF09ZFtwXTtpZihoLkZNVElEPWEsMT09PWkpcmV0dXJuIGg7aWYocy1yLmw9PTImJihyLmwrPTIpLHIubCE9PXMpdGhyb3cgbmV3IEVycm9yKCJMZW5ndGggbWlzbWF0Y2ggMjogIityLmwrIiAhPT0gIitzKTt0cnl7Zj1weChyLG51bGwpfWNhdGNoKGUpe31mb3IocCBpbiBmKWhbcF09ZltwXTtyZXR1cm4gaC5GTVRJRD1bYSxvXSxofWZ1bmN0aW9uIG14KGUsdCl7cmV0dXJuIGUucmVhZF9zaGlmdCh0KSxudWxsfWZ1bmN0aW9uIGJ4KGUsdCl7cmV0dXJuIDE9PT1lLnJlYWRfc2hpZnQodCl9ZnVuY3Rpb24geXgoZSl7cmV0dXJuIGUucmVhZF9zaGlmdCgyLCJ1Iil9ZnVuY3Rpb24gdngoZSx0KXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxpPWUubCt0O2UubDxpOylyLnB1c2gobihlLGktZS5sKSk7aWYoaSE9PWUubCl0aHJvdyBuZXcgRXJyb3IoIlNsdXJwIGVycm9yIik7cmV0dXJuIHJ9KGUsdCx5eCl9ZnVuY3Rpb24geHgoZSl7dmFyIHQ9ZS5yZWFkX3NoaWZ0KDEpO3JldHVybiAxPT09ZS5yZWFkX3NoaWZ0KDEpP3Q6MT09PXR9ZnVuY3Rpb24gRHgoZSx0LG4pe3ZhciByPWUucmVhZF9zaGlmdChuJiZuLmJpZmY+PTEyPzI6MSksaT0ic2Jjcy1jb250IixhPUlnOyhuJiZuLmJpZmY+PTgmJihJZz0xMjAwKSxuJiY4IT1uLmJpZmYpPzEyPT1uLmJpZmYmJihpPSJ3c3RyIik6ZS5yZWFkX3NoaWZ0KDEpJiYoaT0iZGJjcy1jb250Iik7bi5iaWZmPj0yJiZuLmJpZmY8PTUmJihpPSJjcHN0ciIpO3ZhciBvPXI/ZS5yZWFkX3NoaWZ0KHIsaSk6IiI7cmV0dXJuIElnPWEsb31mdW5jdGlvbiBUeChlKXt2YXIgdD1JZztJZz0xMjAwO3ZhciBuLHI9ZS5yZWFkX3NoaWZ0KDIpLGk9ZS5yZWFkX3NoaWZ0KDEpLGE9NCZpLG89OCZpLGM9MSsoMSZpKSxzPTAsbD17fTtvJiYocz1lLnJlYWRfc2hpZnQoMikpLGEmJihuPWUucmVhZF9zaGlmdCg0KSk7dmFyIHU9Mj09Yz8iZGJjcy1jb250Ijoic2Jjcy1jb250IixmPTA9PT1yPyIiOmUucmVhZF9zaGlmdChyLHUpO3JldHVybiBvJiYoZS5sKz00KnMpLGEmJihlLmwrPW4pLGwudD1mLG98fChsLnJhdz0iPHQ+IitsLnQrIjwvdD4iLGwucj1sLnQpLElnPXQsbH1mdW5jdGlvbiB3eChlLHQsbil7aWYobil7aWYobi5iaWZmPj0yJiZuLmJpZmY8PTUpcmV0dXJuIGUucmVhZF9zaGlmdCh0LCJjcHN0ciIpO2lmKG4uYmlmZj49MTIpcmV0dXJuIGUucmVhZF9zaGlmdCh0LCJkYmNzLWNvbnQiKX1yZXR1cm4gMD09PWUucmVhZF9zaGlmdCgxKT9lLnJlYWRfc2hpZnQodCwic2Jjcy1jb250Iik6ZS5yZWFkX3NoaWZ0KHQsImRiY3MtY29udCIpfWZ1bmN0aW9uIF94KGUsdCxuKXt2YXIgcj1lLnJlYWRfc2hpZnQobiYmMj09bi5iaWZmPzE6Mik7cmV0dXJuIDA9PT1yPyhlLmwrKywiIik6d3goZSxyLG4pfWZ1bmN0aW9uIEV4KGUsdCxuKXtpZihuLmJpZmY+NSlyZXR1cm4gX3goZSwwLG4pO3ZhciByPWUucmVhZF9zaGlmdCgxKTtyZXR1cm4gMD09PXI/KGUubCsrLCIiKTplLnJlYWRfc2hpZnQocixuLmJpZmY8PTR8fCFlLmxlbnM/ImNwc3RyIjoic2Jjcy1jb250Iil9ZnVuY3Rpb24gVXgoZSx0KXt2YXIgbj1lLnJlYWRfc2hpZnQoMTYpO3N3aXRjaChuKXtjYXNlImUwYzllYTc5ZjliYWNlMTE4YzgyMDBhYTAwNGJhOTBiIjpyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZWFkX3NoaWZ0KDQpLG49ZS5sLHI9ITE7dD4yNCYmKGUubCs9dC0yNCwiNzk1ODgxZjQzYjFkN2Y0OGFmMmM4MjVkYzQ4NTI3NjMiPT09ZS5yZWFkX3NoaWZ0KDE2KSYmKHI9ITApLGUubD1uKTt2YXIgaT1lLnJlYWRfc2hpZnQoKHI/dC0yNDp0KT4+MSwidXRmMTZsZSIpLnJlcGxhY2UoaW0sIiIpO3JldHVybiByJiYoZS5sKz0yNCksaX0oZSk7Y2FzZSIwMzAzMDAwMDAwMDAwMDAwYzAwMDAwMDAwMDAwMDA0NiI6cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLnJlYWRfc2hpZnQoMiksbj0iIjt0LS0gPjA7KW4rPSIuLi8iO3ZhciByPWUucmVhZF9zaGlmdCgwLCJscHN0ci1hbnNpIik7aWYoZS5sKz0yLDU3MDA1IT1lLnJlYWRfc2hpZnQoMikpdGhyb3cgbmV3IEVycm9yKCJCYWQgRmlsZU1vbmlrZXIiKTtpZigwPT09ZS5yZWFkX3NoaWZ0KDQpKXJldHVybiBuK3IucmVwbGFjZSgvXFwvZywiLyIpO3ZhciBpPWUucmVhZF9zaGlmdCg0KTtpZigzIT1lLnJlYWRfc2hpZnQoMikpdGhyb3cgbmV3IEVycm9yKCJCYWQgRmlsZU1vbmlrZXIiKTtyZXR1cm4gbitlLnJlYWRfc2hpZnQoaT4+MSwidXRmMTZsZSIpLnJlcGxhY2UoaW0sIiIpfShlKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgTW9uaWtlciAiK24pfX1mdW5jdGlvbiBBeChlKXt2YXIgdD1lLnJlYWRfc2hpZnQoNCk7cmV0dXJuIHQ+MD9lLnJlYWRfc2hpZnQodCwidXRmMTZsZSIpLnJlcGxhY2UoaW0sIiIpOiIifWZ1bmN0aW9uIGt4KGUpe3JldHVybltlLnJlYWRfc2hpZnQoMSksZS5yZWFkX3NoaWZ0KDEpLGUucmVhZF9zaGlmdCgxKSxlLnJlYWRfc2hpZnQoMSldfWZ1bmN0aW9uIFN4KGUsdCl7dmFyIG49a3goZSk7cmV0dXJuIG5bM109MCxufWZ1bmN0aW9uIEN4KGUsdCxuKXt2YXIgcj17cjplLnJlYWRfc2hpZnQoMiksYzplLnJlYWRfc2hpZnQoMiksaXhmZTowfTtpZihuJiYyPT1uLmJpZmZ8fDc9PXQpe3ZhciBpPWUucmVhZF9zaGlmdCgxKTtyLml4ZmU9NjMmaSxlLmwrPTJ9ZWxzZSByLml4ZmU9ZS5yZWFkX3NoaWZ0KDIpO3JldHVybiByfWZ1bmN0aW9uIEZ4KGUsdCxuKXt2YXIgcj1uLmJpZmY+OD80OjI7cmV0dXJuW2UucmVhZF9zaGlmdChyKSxlLnJlYWRfc2hpZnQociwiaSIpLGUucmVhZF9zaGlmdChyLCJpIildfWZ1bmN0aW9uIE94KGUpe3JldHVybltlLnJlYWRfc2hpZnQoMiksRXYoZSldfWZ1bmN0aW9uIEl4KGUpe3ZhciB0PWUucmVhZF9zaGlmdCgyKSxuPWUucmVhZF9zaGlmdCgyKTtyZXR1cm57czp7YzplLnJlYWRfc2hpZnQoMikscjp0fSxlOntjOmUucmVhZF9zaGlmdCgyKSxyOm59fX1mdW5jdGlvbiBSeChlKXt2YXIgdD1lLnJlYWRfc2hpZnQoMiksbj1lLnJlYWRfc2hpZnQoMik7cmV0dXJue3M6e2M6ZS5yZWFkX3NoaWZ0KDEpLHI6dH0sZTp7YzplLnJlYWRfc2hpZnQoMSkscjpufX19dmFyIE54PVJ4O2Z1bmN0aW9uIFB4KGUpe2UubCs9NDt2YXIgdD1lLnJlYWRfc2hpZnQoMiksbj1lLnJlYWRfc2hpZnQoMikscj1lLnJlYWRfc2hpZnQoMik7cmV0dXJuIGUubCs9MTIsW24sdCxyXX1mdW5jdGlvbiBCeChlKXtlLmwrPTIsZS5sKz1lLnJlYWRfc2hpZnQoMil9dmFyIFd4PXswOkJ4LDQ6QngsNTpCeCw2OkJ4LDc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubCs9NCxlLmNmPWUucmVhZF9zaGlmdCgyKSx7fX0sODpCeCw5OkJ4LDEwOkJ4LDExOkJ4LDEyOkJ4LDEzOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBlLmwrPTQsZS5sKz0xNix0LmZTaGFyZWROb3RlPWUucmVhZF9zaGlmdCgyKSxlLmwrPTQsdH0sMTQ6QngsMTU6QngsMTY6QngsMTc6QngsMTg6QngsMTk6QngsMjA6QngsMjE6UHh9O2Z1bmN0aW9uIEx4KGUsdCl7dmFyIG49e0JJRkZWZXI6MCxkdDowfTtzd2l0Y2gobi5CSUZGVmVyPWUucmVhZF9zaGlmdCgyKSwodC09Mik+PTImJihuLmR0PWUucmVhZF9zaGlmdCgyKSxlLmwtPTIpLG4uQklGRlZlcil7Y2FzZSAxNTM2OmNhc2UgMTI4MDpjYXNlIDEwMjQ6Y2FzZSA3Njg6Y2FzZSA1MTI6Y2FzZSAyOmNhc2UgNzpicmVhaztkZWZhdWx0OmlmKHQ+Nil0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgQklGRiBWZXIgIituLkJJRkZWZXIpfXJldHVybiBlLnJlYWRfc2hpZnQodCksbn1mdW5jdGlvbiBNeChlLHQsbil7dmFyIHI9MDtuJiYyPT1uLmJpZmZ8fChyPWUucmVhZF9zaGlmdCgyKSk7dmFyIGk9ZS5yZWFkX3NoaWZ0KDIpO3JldHVybiBuJiYyPT1uLmJpZmYmJihyPTEtKGk+PjE1KSxpJj0zMjc2NyksW3tVbnN5bmNlZDoxJnIsRHlaZXJvOigyJnIpPj4xLEV4QXNjOig0JnIpPj4yLEV4RHNjOig4JnIpPj4zfSxpXX12YXIgang9RXg7ZnVuY3Rpb24gengoZSx0LG4pe3ZhciByPWUubCt0LGk9OCE9bi5iaWZmJiZuLmJpZmY/Mjo0LGE9ZS5yZWFkX3NoaWZ0KGkpLG89ZS5yZWFkX3NoaWZ0KGkpLGM9ZS5yZWFkX3NoaWZ0KDIpLHM9ZS5yZWFkX3NoaWZ0KDIpO3JldHVybiBlLmw9cix7czp7cjphLGM6Y30sZTp7cjpvLGM6c319fXZhciBIeD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIDA9PT10PyIiOkV4KGUsMCxuKX07ZnVuY3Rpb24gVngoZSx0LG4pe3ZhciByLGk9ZS5yZWFkX3NoaWZ0KDIpLGE9e2ZCdWlsdEluOjEmaSxmV2FudEFkdmlzZTppPj4+MSYxLGZXYW50UGljdDppPj4+MiYxLGZPbGU6aT4+PjMmMSxmT2xlTGluazppPj4+NCYxLGNmOmk+Pj41JjEwMjMsZkljb246aT4+PjE1JjF9O3JldHVybiAxNDg0OT09PW4uc2JjY2gmJihyPWZ1bmN0aW9uKGUsdCxuKXtlLmwrPTQsdC09NDt2YXIgcj1lLmwrdCxpPUR4KGUsMCxuKSxhPWUucmVhZF9zaGlmdCgyKTtpZihhIT09KHItPWUubCkpdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgQWRkaW5VZGY6IHBhZGRpbmcgPSAiK3IrIiAhPSAiK2EpO3JldHVybiBlLmwrPWEsaX0oZSx0LTIsbikpLGEuYm9keT1yfHxlLnJlYWRfc2hpZnQodC0yKSwic3RyaW5nIj09dHlwZW9mIHImJihhLk5hbWU9ciksYX1mdW5jdGlvbiBxeChlLHQsbil7dmFyIHI9ZS5sK3QsaT1lLnJlYWRfc2hpZnQoMiksYT1lLnJlYWRfc2hpZnQoMSksbz1lLnJlYWRfc2hpZnQoMSksYz1lLnJlYWRfc2hpZnQobiYmMj09bi5iaWZmPzE6Mikscz0wOyghbnx8bi5iaWZmPj01KSYmKDUhPW4uYmlmZiYmKGUubCs9Mikscz1lLnJlYWRfc2hpZnQoMiksNT09bi5iaWZmJiYoZS5sKz0yKSxlLmwrPTQpO3ZhciBsPXd4KGUsbyxuKTszMiZpJiYobD1WdltsLmNoYXJDb2RlQXQoMCldKTt2YXIgdT1yLWUubDtuJiYyPT1uLmJpZmYmJi0tdTt2YXIgZj1yIT1lLmwmJjAhPT1jJiZ1PjA/ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksYT1lLmwrdCxvPUxUKGUscixuKTthIT09ZS5sJiYoaT1XVChlLGEtZS5sLG8sbikpO3JldHVybltvLGldfShlLHUsbixjKTpbXTtyZXR1cm57Y2hLZXk6YSxOYW1lOmwsaXRhYjpzLHJnY2U6Zn19ZnVuY3Rpb24gR3goZSx0LG4pe2lmKG4uYmlmZjw4KXJldHVybiBYeChlLHQsbik7aWYoIShuLmJpZmY+OCkmJnQ9PWVbZS5sXSsoMz09ZVtlLmwrMV0/MTowKSsxKXJldHVybiBYeChlLHQsbik7Zm9yKHZhciByPVtdLGk9ZS5sK3QsYT1lLnJlYWRfc2hpZnQobi5iaWZmPjg/NDoyKTswIT1hLS07KXIucHVzaChGeChlLG4uYmlmZixuKSk7aWYoZS5sIT1pKXRocm93IG5ldyBFcnJvcigiQmFkIEV4dGVyblNoZWV0OiAiK2UubCsiICE9ICIraSk7cmV0dXJuIHJ9ZnVuY3Rpb24gWHgoZSx0LG4pezM9PWVbZS5sKzFdJiZlW2UubF0rKzt2YXIgcj1EeChlLDAsbik7cmV0dXJuIDM9PXIuY2hhckNvZGVBdCgwKT9yLnNsaWNlKDEpOnJ9ZnVuY3Rpb24gJHgoZSx0LG4pe3ZhciByPU54KGUpO3N3aXRjaChuLmJpZmYpe2Nhc2UgMjplLmwrKyx0LT03O2JyZWFrO2Nhc2UgMzpjYXNlIDQ6ZS5sKz0yLHQtPTg7YnJlYWs7ZGVmYXVsdDplLmwrPTYsdC09MTJ9cmV0dXJuW3IscVQoZSx0LG4pXX12YXIgWXg9ezg6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmwrdDtlLmwrPTEwO3ZhciByPWUucmVhZF9zaGlmdCgyKTtlLmwrPTQsZS5sKz0yLGUubCs9MixlLmwrPTIsZS5sKz00O3ZhciBpPWUucmVhZF9zaGlmdCgxKTtyZXR1cm4gZS5sKz1pLGUubD1uLHtmbXQ6cn19fTtmdW5jdGlvbiBLeChlLHQsbil7aWYoIW4uY2VsbFN0eWxlcylyZXR1cm4gWHkoZSx0KTt2YXIgcj1uJiZuLmJpZmY+PTEyPzQ6MixpPWUucmVhZF9zaGlmdChyKSxhPWUucmVhZF9zaGlmdChyKSxvPWUucmVhZF9zaGlmdChyKSxjPWUucmVhZF9zaGlmdChyKSxzPWUucmVhZF9zaGlmdCgyKTsyPT1yJiYoZS5sKz0yKTt2YXIgbD17czppLGU6YSx3Om8saXhmZTpjLGZsYWdzOnN9O3JldHVybihuLmJpZmY+PTV8fCFuLmJpZmYpJiYobC5sZXZlbD1zPj44JjcpLGx9dmFyIFp4PUN4LEp4PXZ4LFF4PV94O3ZhciBlRD1bMiwzLDQ4LDQ5LDEzMSwxMzksMTQwLDI0NV0sdEQ9ZnVuY3Rpb24oKXt2YXIgZT17MTo0MzcsMjo4NTAsMzoxMjUyLDQ6MWU0LDEwMDo4NTIsMTAxOjg2NiwxMDI6ODY1LDEwMzo4NjEsMTA0Ojg5NSwxMDU6NjIwLDEwNjo3MzcsMTA3Ojg1NywxMjA6OTUwLDEyMTo5NDksMTIyOjkzNiwxMjM6OTMyLDEyNDo4NzQsMTI1OjEyNTUsMTI2OjEyNTYsMTUwOjEwMDA3LDE1MToxMDAyOSwxNTI6MTAwMDYsMjAwOjEyNTAsMjAxOjEyNTEsMjAyOjEyNTQsMjAzOjEyNTMsMDoyMDEyNyw4Ojg2NSw5OjQzNywxMDo4NTAsMTE6NDM3LDEzOjQzNywxNDo4NTAsMTU6NDM3LDE2Ojg1MCwxNzo0MzcsMTg6ODUwLDE5OjkzMiwyMDo4NTAsMjE6NDM3LDIyOjg1MCwyMzo4NjUsMjQ6NDM3LDI1OjQzNywyNjo4NTAsMjc6NDM3LDI4Ojg2MywyOTo4NTAsMzE6ODUyLDM0Ojg1MiwzNTo4NTIsMzY6ODYwLDM3Ojg1MCwzODo4NjYsNTU6ODUwLDY0Ojg1Miw3Nzo5MzYsNzg6OTQ5LDc5Ojk1MCw4MDo4NzQsODc6MTI1Miw4ODoxMjUyLDg5OjEyNTIsMTA4Ojg2MywxMzQ6NzM3LDEzNTo4NTIsMTM2Ojg1NywyMDQ6MTI1NywyNTU6MTY5Njl9LHQ9Sm0oezE6NDM3LDI6ODUwLDM6MTI1Miw0OjFlNCwxMDA6ODUyLDEwMTo4NjYsMTAyOjg2NSwxMDM6ODYxLDEwNDo4OTUsMTA1OjYyMCwxMDY6NzM3LDEwNzo4NTcsMTIwOjk1MCwxMjE6OTQ5LDEyMjo5MzYsMTIzOjkzMiwxMjQ6ODc0LDEyNToxMjU1LDEyNjoxMjU2LDE1MDoxMDAwNywxNTE6MTAwMjksMTUyOjEwMDA2LDIwMDoxMjUwLDIwMToxMjUxLDIwMjoxMjU0LDIwMzoxMjUzLDA6MjAxMjd9KTtmdW5jdGlvbiBuKHQsbil7dmFyIHI9bnx8e307ci5kYXRlTkZ8fChyLmRhdGVORj0ieXl5eW1tZGQiKTt2YXIgaT1wdihmdW5jdGlvbih0LG4pe3ZhciByPVtdLGk9SmcoMSk7c3dpdGNoKG4udHlwZSl7Y2FzZSJiYXNlNjQiOmk9ZW0oJGcodCkpO2JyZWFrO2Nhc2UiYmluYXJ5IjppPWVtKHQpO2JyZWFrO2Nhc2UiYnVmZmVyIjpjYXNlImFycmF5IjppPXR9R3koaSwwKTt2YXIgYT1pLnJlYWRfc2hpZnQoMSksbz0hISgxMzYmYSksYz0hMSxzPSExO3N3aXRjaChhKXtjYXNlIDI6Y2FzZSAzOmNhc2UgMTMxOmNhc2UgMTM5OmNhc2UgMjQ1OmJyZWFrO2Nhc2UgNDg6Y2FzZSA0OTpjPSEwLG89ITA7YnJlYWs7Y2FzZSAxNDA6cz0hMDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiREJGIFVuc3VwcG9ydGVkIFZlcnNpb246ICIrYS50b1N0cmluZygxNikpfXZhciBsPTAsdT01MjE7Mj09YSYmKGw9aS5yZWFkX3NoaWZ0KDIpKSxpLmwrPTMsMiE9YSYmKGw9aS5yZWFkX3NoaWZ0KDQpKSxsPjEwNDg1NzYmJihsPTFlNiksMiE9YSYmKHU9aS5yZWFkX3NoaWZ0KDIpKTt2YXIgZj1pLnJlYWRfc2hpZnQoMik7bi5jb2RlcGFnZSwyIT1hJiYoaS5sKz0xNixpLnJlYWRfc2hpZnQoMSksMCE9PWlbaS5sXSYmZVtpW2kubF1dLGkubCs9MSxpLmwrPTIpLHMmJihpLmwrPTM2KTtmb3IodmFyIGQ9W10saD17fSxwPU1hdGgubWluKGkubGVuZ3RoLDI9PWE/NTIxOnUtMTAtKGM/MjY0OjApKSxnPXM/MzI6MTE7aS5sPHAmJjEzIT1pW2kubF07KXN3aXRjaCgoaD17fSkubmFtZT10bShpLnNsaWNlKGkubCxpLmwrZykpLnJlcGxhY2UoL1tcdTAwMDBcclxuXS4qJC9nLCIiKSxpLmwrPWcsaC50eXBlPVN0cmluZy5mcm9tQ2hhckNvZGUoaS5yZWFkX3NoaWZ0KDEpKSwyPT1hfHxzfHwoaC5vZmZzZXQ9aS5yZWFkX3NoaWZ0KDQpKSxoLmxlbj1pLnJlYWRfc2hpZnQoMSksMj09YSYmKGgub2Zmc2V0PWkucmVhZF9zaGlmdCgyKSksaC5kZWM9aS5yZWFkX3NoaWZ0KDEpLGgubmFtZS5sZW5ndGgmJmQucHVzaChoKSwyIT1hJiYoaS5sKz1zPzEzOjE0KSxoLnR5cGUpe2Nhc2UiQiI6YyYmOD09aC5sZW58fCFuLldURnx8Y29uc29sZS5sb2coIlNraXBwaW5nICIraC5uYW1lKyI6IitoLnR5cGUpO2JyZWFrO2Nhc2UiRyI6Y2FzZSJQIjpuLldURiYmY29uc29sZS5sb2coIlNraXBwaW5nICIraC5uYW1lKyI6IitoLnR5cGUpO2JyZWFrO2Nhc2UiKyI6Y2FzZSIwIjpjYXNlIkAiOmNhc2UiQyI6Y2FzZSJEIjpjYXNlIkYiOmNhc2UiSSI6Y2FzZSJMIjpjYXNlIk0iOmNhc2UiTiI6Y2FzZSJPIjpjYXNlIlQiOmNhc2UiWSI6YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gRmllbGQgVHlwZTogIitoLnR5cGUpfWlmKDEzIT09aVtpLmxdJiYoaS5sPXUtMSksMTMhPT1pLnJlYWRfc2hpZnQoMSkpdGhyb3cgbmV3IEVycm9yKCJEQkYgVGVybWluYXRvciBub3QgZm91bmQgIitpLmwrIiAiK2lbaS5sXSk7aS5sPXU7dmFyIG09MCxiPTA7Zm9yKHJbMF09W10sYj0wO2IhPWQubGVuZ3RoOysrYilyWzBdW2JdPWRbYl0ubmFtZTtmb3IoO2wtLSA+MDspaWYoNDIhPT1pW2kubF0pZm9yKCsraS5sLHJbKyttXT1bXSxiPTAsYj0wO2IhPWQubGVuZ3RoOysrYil7dmFyIHk9aS5zbGljZShpLmwsaS5sK2RbYl0ubGVuKTtpLmwrPWRbYl0ubGVuLEd5KHksMCk7dmFyIHY9dG0oeSk7c3dpdGNoKGRbYl0udHlwZSl7Y2FzZSJDIjp2LnRyaW0oKS5sZW5ndGgmJihyW21dW2JdPXYucmVwbGFjZSgvXHMrJC8sIiIpKTticmVhaztjYXNlIkQiOjg9PT12Lmxlbmd0aD8oclttXVtiXT1uZXcgRGF0ZShEYXRlLlVUQygrdi5zbGljZSgwLDQpLCt2LnNsaWNlKDQsNiktMSwrdi5zbGljZSg2LDgpLDAsMCwwLDApKSxuJiZuLlVUQ3x8KHJbbV1bYl09eGIoclttXVtiXSkpKTpyW21dW2JdPXY7YnJlYWs7Y2FzZSJGIjpyW21dW2JdPXBhcnNlRmxvYXQodi50cmltKCkpO2JyZWFrO2Nhc2UiKyI6Y2FzZSJJIjpyW21dW2JdPXM/MjE0NzQ4MzY0OF55LnJlYWRfc2hpZnQoLTQsImkiKTp5LnJlYWRfc2hpZnQoNCwiaSIpO2JyZWFrO2Nhc2UiTCI6c3dpdGNoKHYudHJpbSgpLnRvVXBwZXJDYXNlKCkpe2Nhc2UiWSI6Y2FzZSJUIjpyW21dW2JdPSEwO2JyZWFrO2Nhc2UiTiI6Y2FzZSJGIjpyW21dW2JdPSExO2JyZWFrO2Nhc2UiIjpjYXNlIlwwIjpjYXNlIj8iOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJEQkYgVW5yZWNvZ25pemVkIEw6fCIrdisifCIpfWJyZWFrO2Nhc2UiTSI6aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJEQkYgVW5leHBlY3RlZCBNRU1PIGZvciB0eXBlICIrYS50b1N0cmluZygxNikpO3JbbV1bYl09IiMjTUVNTyMjIisocz9wYXJzZUludCh2LnRyaW0oKSwxMCk6eS5yZWFkX3NoaWZ0KDQpKTticmVhaztjYXNlIk4iOih2PXYucmVwbGFjZSgvXHUwMDAwL2csIiIpLnRyaW0oKSkmJiIuIiE9diYmKHJbbV1bYl09K3Z8fDApO2JyZWFrO2Nhc2UiQCI6clttXVtiXT1uZXcgRGF0ZSh5LnJlYWRfc2hpZnQoLTgsImYiKS02MjEzNTY4MzJlNSk7YnJlYWs7Y2FzZSJUIjp2YXIgeD15LnJlYWRfc2hpZnQoNCksRD15LnJlYWRfc2hpZnQoNCk7aWYoMD09eCYmMD09RClicmVhaztyW21dW2JdPW5ldyBEYXRlKDg2NGU1Kih4LTI0NDA1ODgpK0QpLG4mJm4uVVRDfHwoclttXVtiXT14YihyW21dW2JdKSk7YnJlYWs7Y2FzZSJZIjpyW21dW2JdPXkucmVhZF9zaGlmdCg0LCJpIikvMWU0K3kucmVhZF9zaGlmdCg0LCJpIikvMWU0Kk1hdGgucG93KDIsMzIpO2JyZWFrO2Nhc2UiTyI6clttXVtiXT0teS5yZWFkX3NoaWZ0KC04LCJmIik7YnJlYWs7Y2FzZSJCIjppZihjJiY4PT1kW2JdLmxlbil7clttXVtiXT15LnJlYWRfc2hpZnQoOCwiZiIpO2JyZWFrfWNhc2UiRyI6Y2FzZSJQIjp5LmwrPWRbYl0ubGVuO2JyZWFrO2Nhc2UiMCI6aWYoIl9OdWxsRmxhZ3MiPT09ZFtiXS5uYW1lKWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJEQkYgVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICIrZFtiXS50eXBlKX19ZWxzZSBpLmwrPWY7aWYoMiE9YSYmaS5sPGkubGVuZ3RoJiYyNiE9aVtpLmwrK10pdGhyb3cgbmV3IEVycm9yKCJEQkYgRU9GIE1hcmtlciBtaXNzaW5nICIrKGkubC0xKSsiIG9mICIraS5sZW5ndGgrIiAiK2lbaS5sLTFdLnRvU3RyaW5nKDE2KSk7cmV0dXJuIG4mJm4uc2hlZXRSb3dzJiYocj1yLnNsaWNlKDAsbi5zaGVldFJvd3MpKSxuLkRCRj1kLHJ9KHQscikscik7cmV0dXJuIGlbIiFjb2xzIl09ci5EQkYubWFwKChmdW5jdGlvbihlKXtyZXR1cm57d2NoOmUubGVuLERCRjplfX0pKSxkZWxldGUgci5EQkYsaX12YXIgcj17Qjo4LEM6MjUwLEw6MSxEOjgsIj8iOjAsIiI6MH07cmV0dXJue3RvX3dvcmtib29rOmZ1bmN0aW9uKGUsdCl7dHJ5e3ZhciByPWR2KG4oZSx0KSx0KTtyZXR1cm4gci5ib29rVHlwZT0iZGJmIixyfWNhdGNoKGUpe2lmKHQmJnQuV1RGKXRocm93IGV9cmV0dXJue1NoZWV0TmFtZXM6W10sU2hlZXRzOnt9fX0sdG9fc2hlZXQ6bixmcm9tX3NoZWV0OmZ1bmN0aW9uKG4saSl7aWYoIW5bIiFyZWYiXSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBleHBvcnQgZW1wdHkgc2hlZXQgdG8gREJGIik7dmFyIGE9aXx8e30sbz1JZztpZigrYS5jb2RlcGFnZT49MCYmQmcoK2EuY29kZXBhZ2UpLCJzdHJpbmciPT1hLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgd3JpdGUgREJGIHRvIEpTIHN0cmluZyIpO3ZhciBjPUt5KCkscz1yRShuLHtoZWFkZXI6MSxyYXc6ITAsY2VsbERhdGVzOiEwfSksbD1zWzBdLHU9cy5zbGljZSgxKSxmPW5bIiFjb2xzIl18fFtdLGQ9MCxoPTAscD0wLGc9MTtmb3IoZD0wO2Q8bC5sZW5ndGg7KytkKWlmKCgoZltkXXx8e30pLkRCRnx8e30pLm5hbWUpbFtkXT1mW2RdLkRCRi5uYW1lLCsrcDtlbHNlIGlmKG51bGwhPWxbZF0pe2lmKCsrcCwibnVtYmVyIj09dHlwZW9mIGxbZF0mJihsW2RdPWxbZF0udG9TdHJpbmcoMTApKSwic3RyaW5nIiE9dHlwZW9mIGxbZF0pdGhyb3cgbmV3IEVycm9yKCJEQkYgSW52YWxpZCBjb2x1bW4gbmFtZSAiK2xbZF0rIiB8Iit0eXBlb2YgbFtkXSsifCIpO2lmKGwuaW5kZXhPZihsW2RdKSE9PWQpZm9yKGg9MDtoPDEwMjQ7KytoKWlmKC0xPT1sLmluZGV4T2YobFtkXSsiXyIraCkpe2xbZF0rPSJfIitoO2JyZWFrfX12YXIgbT1sdihuWyIhcmVmIl0pLGI9W10seT1bXSx2PVtdO2ZvcihkPTA7ZDw9bS5lLmMtbS5zLmM7KytkKXt2YXIgeD0iIixEPSIiLFQ9MCx3PVtdO2ZvcihoPTA7aDx1Lmxlbmd0aDsrK2gpbnVsbCE9dVtoXVtkXSYmdy5wdXNoKHVbaF1bZF0pO2lmKDAhPXcubGVuZ3RoJiZudWxsIT1sW2RdKXtmb3IoaD0wO2g8dy5sZW5ndGg7KytoKXtzd2l0Y2godHlwZW9mIHdbaF0pe2Nhc2UibnVtYmVyIjpEPSJCIjticmVhaztjYXNlInN0cmluZyI6ZGVmYXVsdDpEPSJDIjticmVhaztjYXNlImJvb2xlYW4iOkQ9IkwiO2JyZWFrO2Nhc2Uib2JqZWN0IjpEPXdbaF1pbnN0YW5jZW9mIERhdGU/IkQiOiJDIn1UPU1hdGgubWF4KFQsU3RyaW5nKHdbaF0pLmxlbmd0aCkseD14JiZ4IT1EPyJDIjpEfVQ+MjUwJiYoVD0yNTApLCJDIj09KEQ9KChmW2RdfHx7fSkuREJGfHx7fSkudHlwZSkmJmZbZF0uREJGLmxlbj5UJiYoVD1mW2RdLkRCRi5sZW4pLCJCIj09eCYmIk4iPT1EJiYoeD0iTiIsdltkXT1mW2RdLkRCRi5kZWMsVD1mW2RdLkRCRi5sZW4pLHlbZF09IkMiPT14fHwiTiI9PUQ/VDpyW3hdfHwwLGcrPXlbZF0sYltkXT14fWVsc2UgYltkXT0iPyJ9dmFyIF89Yy5uZXh0KDMyKTtmb3IoXy53cml0ZV9zaGlmdCg0LDMxODkwMjU3NiksXy53cml0ZV9zaGlmdCg0LHUubGVuZ3RoKSxfLndyaXRlX3NoaWZ0KDIsMjk2KzMyKnApLF8ud3JpdGVfc2hpZnQoMixnKSxkPTA7ZDw0OysrZClfLndyaXRlX3NoaWZ0KDQsMCk7dmFyIEU9K3RbSWddfHwzO2ZvcihfLndyaXRlX3NoaWZ0KDQsMHxFPDw4KSxlW0VdIT0rYS5jb2RlcGFnZSYmKGEuY29kZXBhZ2UmJmNvbnNvbGUuZXJyb3IoIkRCRiBVbnN1cHBvcnRlZCBjb2RlcGFnZSAiK0lnKyIsIHVzaW5nIDEyNTIiKSxJZz0xMjUyKSxkPTAsaD0wO2Q8bC5sZW5ndGg7KytkKWlmKG51bGwhPWxbZF0pe3ZhciBVPWMubmV4dCgzMiksQT0obFtkXS5zbGljZSgtMTApKyJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIikuc2xpY2UoMCwxMSk7VS53cml0ZV9zaGlmdCgxLEEsInNiY3MiKSxVLndyaXRlX3NoaWZ0KDEsIj8iPT1iW2RdPyJDIjpiW2RdLCJzYmNzIiksVS53cml0ZV9zaGlmdCg0LGgpLFUud3JpdGVfc2hpZnQoMSx5W2RdfHxyW2JbZF1dfHwwKSxVLndyaXRlX3NoaWZ0KDEsdltkXXx8MCksVS53cml0ZV9zaGlmdCgxLDIpLFUud3JpdGVfc2hpZnQoNCwwKSxVLndyaXRlX3NoaWZ0KDEsMCksVS53cml0ZV9zaGlmdCg0LDApLFUud3JpdGVfc2hpZnQoNCwwKSxoKz15W2RdfHxyW2JbZF1dfHwwfXZhciBrPWMubmV4dCgyNjQpO2ZvcihrLndyaXRlX3NoaWZ0KDQsMTMpLGQ9MDtkPDY1OysrZClrLndyaXRlX3NoaWZ0KDQsMCk7Zm9yKGQ9MDtkPHUubGVuZ3RoOysrZCl7dmFyIFM9Yy5uZXh0KGcpO2ZvcihTLndyaXRlX3NoaWZ0KDEsMCksaD0wO2g8bC5sZW5ndGg7KytoKWlmKG51bGwhPWxbaF0pc3dpdGNoKGJbaF0pe2Nhc2UiTCI6Uy53cml0ZV9zaGlmdCgxLG51bGw9PXVbZF1baF0/NjM6dVtkXVtoXT84NDo3MCk7YnJlYWs7Y2FzZSJCIjpTLndyaXRlX3NoaWZ0KDgsdVtkXVtoXXx8MCwiZiIpO2JyZWFrO2Nhc2UiTiI6dmFyIEM9IjAiO2ZvcigibnVtYmVyIj09dHlwZW9mIHVbZF1baF0mJihDPXVbZF1baF0udG9GaXhlZCh2W2hdfHwwKSksQy5sZW5ndGg+eVtoXSYmKEM9Qy5zbGljZSgwLHlbaF0pKSxwPTA7cDx5W2hdLUMubGVuZ3RoOysrcClTLndyaXRlX3NoaWZ0KDEsMzIpO1Mud3JpdGVfc2hpZnQoMSxDLCJzYmNzIik7YnJlYWs7Y2FzZSJEIjp1W2RdW2hdPyhTLndyaXRlX3NoaWZ0KDQsKCIwMDAwIit1W2RdW2hdLmdldEZ1bGxZZWFyKCkpLnNsaWNlKC00KSwic2JjcyIpLFMud3JpdGVfc2hpZnQoMiwoIjAwIisodVtkXVtoXS5nZXRNb250aCgpKzEpKS5zbGljZSgtMiksInNiY3MiKSxTLndyaXRlX3NoaWZ0KDIsKCIwMCIrdVtkXVtoXS5nZXREYXRlKCkpLnNsaWNlKC0yKSwic2JjcyIpKTpTLndyaXRlX3NoaWZ0KDgsIjAwMDAwMDAwIiwic2JjcyIpO2JyZWFrO2Nhc2UiQyI6dmFyIEY9Uy5sLE89U3RyaW5nKG51bGwhPXVbZF1baF0/dVtkXVtoXToiIikuc2xpY2UoMCx5W2hdKTtmb3IoUy53cml0ZV9zaGlmdCgxLE8sImNwc3RyIiksRis9eVtoXS1TLmwscD0wO3A8RjsrK3ApUy53cml0ZV9zaGlmdCgxLDMyKX19cmV0dXJuIElnPW8sYy5uZXh0KDEpLndyaXRlX3NoaWZ0KDEsMjYpLGMuZW5kKCl9fX0oKSxuRD1mdW5jdGlvbigpe3ZhciBlPXtBQToiw4AiLEJBOiLDgSIsQ0E6IsOCIixEQToxOTUsSEE6IsOEIixKQToxOTcsQUU6IsOIIixCRToiw4kiLENFOiLDiiIsSEU6IsOLIixBSToiw4wiLEJJOiLDjSIsQ0k6IsOOIixISToiw48iLEFPOiLDkiIsQk86IsOTIixDTzoiw5QiLERPOjIxMyxITzoiw5YiLEFVOiLDmSIsQlU6IsOaIixDVToiw5siLEhVOiLDnCIsQWE6IsOgIixCYToiw6EiLENhOiLDoiIsRGE6MjI3LEhhOiLDpCIsSmE6MjI5LEFlOiLDqCIsQmU6IsOpIixDZToiw6oiLEhlOiLDqyIsQWk6IsOsIixCaToiw60iLENpOiLDriIsSGk6IsOvIixBbzoiw7IiLEJvOiLDsyIsQ286IsO0IixEbzoyNDUsSG86IsO2IixBdToiw7kiLEJ1OiLDuiIsQ3U6IsO7IixIdToiw7wiLEtDOiLDhyIsS2M6IsOnIixxOiLDpiIsejoixZMiLGE6IsOGIixqOiLFkiIsRE46MjA5LERuOjI0MSxIeToyNTUsUzoxNjksYzoxNzAsUjoxNzQsIkIgIjoxODAsMDoxNzYsMToxNzcsMjoxNzgsMzoxNzksNToxODEsNjoxODIsNzoxODMsUToxODUsazoxODYsYjoyMDgsaToyMTYsbDoyMjIsczoyNDAseToyNDgsIiEiOjE2MSwnIic6MTYyLCIjIjoxNjMsIigiOjE2NCwiJSI6MTY1LCInIjoxNjcsIkggIjoxNjgsIisiOjE3MSwiOyI6MTg3LCI8IjoxODgsIj0iOjE4OSwiPiI6MTkwLCI/IjoxOTEsInsiOjIyM30sdD1uZXcgUmVnRXhwKCIbTigiK1ptKGUpLmpvaW4oInwiKS5yZXBsYWNlKC9cfFx8XHwvLCJ8XFx8fCIpLnJlcGxhY2UoLyhbPygpK10pL2csIlxcJDEiKS5yZXBsYWNlKCJ7IiwiXFx7IikrInxcXHwpIiwiZ20iKTt0cnl7dD1uZXcgUmVnRXhwKCIbTigiK1ptKGUpLmpvaW4oInwiKS5yZXBsYWNlKC9cfFx8XHwvLCJ8XFx8fCIpLnJlcGxhY2UoLyhbPygpK10pL2csIlxcJDEiKSsifFxcfCkiLCJnbSIpfWNhdGNoKGUpe312YXIgbj1mdW5jdGlvbih0LG4pe3ZhciByPWVbbl07cmV0dXJuIm51bWJlciI9PXR5cGVvZiByP1ZnKHIpOnJ9LHI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQuY2hhckNvZGVBdCgwKS0zMjw8NHxuLmNoYXJDb2RlQXQoMCktNDg7cmV0dXJuIDU5PT1yP2U6Vmcocil9O2VbInwiXT0yNTQ7dmFyIGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXG4vZywiGyA6IikucmVwbGFjZSgvXHIvZywiGyA9Iil9O2Z1bmN0aW9uIGEoZSxpKXt2YXIgYSxvPWUuc3BsaXQoL1tcblxyXSsvKSxjPS0xLHM9LTEsbD0wLHU9MCxmPVtdLGQ9W10saD1udWxsLHA9e30sZz1bXSxtPVtdLGI9W10seT0wLHY9e1dvcmtib29rOntXQlByb3BzOnt9LE5hbWVzOltdfX07Zm9yKCtpLmNvZGVwYWdlPj0wJiZCZygraS5jb2RlcGFnZSk7bCE9PW8ubGVuZ3RoOysrbCl7eT0wO3ZhciB4LEQ9b1tsXS50cmltKCkucmVwbGFjZSgvXHgxQihbXHgyMC1ceDJGXSkoW1x4MzAtXHgzRl0pL2cscikucmVwbGFjZSh0LG4pLFQ9RC5yZXBsYWNlKC87Oy9nLCJcMCIpLnNwbGl0KCI7IikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9cdTAwMDAvZywiOyIpfSkpLHc9VFswXTtpZihELmxlbmd0aD4wKXN3aXRjaCh3KXtjYXNlIklEIjpjYXNlIkUiOmNhc2UiQiI6Y2FzZSJXIjpicmVhaztjYXNlIk8iOmZvcih1PTE7dTxULmxlbmd0aDsrK3UpaWYoIlYiPT09VFt1XS5jaGFyQXQoMCkpe3ZhciBfPXBhcnNlSW50KFRbdV0uc2xpY2UoMSksMTApO18+PTEmJl88PTQmJih2Lldvcmtib29rLldCUHJvcHMuZGF0ZTE5MDQ9ITApfWJyZWFrO2Nhc2UiUCI6aWYoIlAiPT09VFsxXS5jaGFyQXQoMCkpZC5wdXNoKEQuc2xpY2UoMykucmVwbGFjZSgvOzsvZywiOyIpKTticmVhaztjYXNlIk5OIjp2YXIgRT17U2hlZXQ6MH07Zm9yKHU9MTt1PFQubGVuZ3RoOysrdSlzd2l0Y2goVFt1XS5jaGFyQXQoMCkpe2Nhc2UiTiI6RS5OYW1lPVRbdV0uc2xpY2UoMSk7YnJlYWs7Y2FzZSJFIjpFLlJlZj0oaSYmaS5zaGVldHx8IlNoZWV0MSIpKyIhIitoVChUW3VdLnNsaWNlKDEpKX12Lldvcmtib29rLk5hbWVzLnB1c2goRSk7YnJlYWs7Y2FzZSJDIjp2YXIgVT0hMSxBPSExLGs9ITEsUz0hMSxDPS0xLEY9LTEsTz0iIixJPSJ6IixSPSIiO2Zvcih1PTE7dTxULmxlbmd0aDsrK3Upc3dpdGNoKFRbdV0uY2hhckF0KDApKXtjYXNlIkEiOlI9VFt1XS5zbGljZSgxKTticmVhaztjYXNlIlgiOnM9cGFyc2VJbnQoVFt1XS5zbGljZSgxKSwxMCktMSxBPSEwO2JyZWFrO2Nhc2UiWSI6Zm9yKGM9cGFyc2VJbnQoVFt1XS5zbGljZSgxKSwxMCktMSxBfHwocz0wKSxhPWYubGVuZ3RoO2E8PWM7KythKWZbYV09W107YnJlYWs7Y2FzZSJLIjonIic9PT0oeD1UW3VdLnNsaWNlKDEpKS5jaGFyQXQoMCk/KHg9eC5zbGljZSgxLHgubGVuZ3RoLTEpLEk9InMiKToiVFJVRSI9PT14fHwiRkFMU0UiPT09eD8oeD0iVFJVRSI9PT14LEk9ImIiKTppc05hTihkYih4KSl8fCh4PWRiKHgpLEk9Im4iLG51bGwhPT1oJiZMbShoKSYmaS5jZWxsRGF0ZXMmJihJPSJudW1iZXIiPT10eXBlb2YoeD1yYih2Lldvcmtib29rLldCUHJvcHMuZGF0ZTE5MDQ/eCsxNDYyOngpKT8ibiI6ImQiKSksVT0hMDticmVhaztjYXNlIkUiOlM9ITAsTz1oVChUW3VdLnNsaWNlKDEpLHtyOmMsYzpzfSk7YnJlYWs7Y2FzZSJTIjprPSEwO2JyZWFrO2Nhc2UiRyI6YnJlYWs7Y2FzZSJSIjpDPXBhcnNlSW50KFRbdV0uc2xpY2UoMSksMTApLTE7YnJlYWs7Y2FzZSJDIjpGPXBhcnNlSW50KFRbdV0uc2xpY2UoMSksMTApLTE7YnJlYWs7ZGVmYXVsdDppZihpJiZpLldURil0aHJvdyBuZXcgRXJyb3IoIlNZTEsgYmFkIHJlY29yZCAiK0QpfWlmKFUmJihmW2NdW3NdPyhmW2NdW3NdLnQ9SSxmW2NdW3NdLnY9eCk6ZltjXVtzXT17dDpJLHY6eH0saCYmKGZbY11bc10uej1oKSwhMSE9PWkuY2VsbFRleHQmJmgmJihmW2NdW3NdLnc9SG0oZltjXVtzXS56LGZbY11bc10udix7ZGF0ZTE5MDQ6di5Xb3JrYm9vay5XQlByb3BzLmRhdGUxOTA0fSkpLGg9bnVsbCksayl7aWYoUyl0aHJvdyBuZXcgRXJyb3IoIlNZTEsgc2hhcmVkIGZvcm11bGEgY2Fubm90IGhhdmUgb3duIGZvcm11bGEiKTt2YXIgTj1DPi0xJiZmW0NdW0ZdO2lmKCFOfHwhTlsxXSl0aHJvdyBuZXcgRXJyb3IoIlNZTEsgc2hhcmVkIGZvcm11bGEgY2Fubm90IGZpbmQgYmFzZSIpO089bVQoTlsxXSx7cjpjLUMsYzpzLUZ9KX1PJiYoZltjXVtzXT9mW2NdW3NdLmY9TzpmW2NdW3NdPXt0OiJuIixmOk99KSxSJiYoZltjXVtzXXx8KGZbY11bc109e3Q6InoifSksZltjXVtzXS5jPVt7YToiU2hlZXRKU1lMSyIsdDpSfV0pO2JyZWFrO2Nhc2UiRiI6dmFyIFA9MDtmb3IodT0xO3U8VC5sZW5ndGg7Kyt1KXN3aXRjaChUW3VdLmNoYXJBdCgwKSl7Y2FzZSJYIjpzPXBhcnNlSW50KFRbdV0uc2xpY2UoMSksMTApLTEsKytQO2JyZWFrO2Nhc2UiWSI6Zm9yKGM9cGFyc2VJbnQoVFt1XS5zbGljZSgxKSwxMCktMSxhPWYubGVuZ3RoO2E8PWM7KythKWZbYV09W107YnJlYWs7Y2FzZSJNIjp5PXBhcnNlSW50KFRbdV0uc2xpY2UoMSksMTApLzIwO2JyZWFrO2Nhc2UiRiI6Y2FzZSJHIjpjYXNlIlMiOmNhc2UiRCI6Y2FzZSJOIjpicmVhaztjYXNlIlAiOmg9ZFtwYXJzZUludChUW3VdLnNsaWNlKDEpLDEwKV07YnJlYWs7Y2FzZSJXIjpmb3IoYj1UW3VdLnNsaWNlKDEpLnNwbGl0KCIgIiksYT1wYXJzZUludChiWzBdLDEwKTthPD1wYXJzZUludChiWzFdLDEwKTsrK2EpeT1wYXJzZUludChiWzJdLDEwKSxtW2EtMV09MD09PXk/e2hpZGRlbjohMH06e3djaDp5fTticmVhaztjYXNlIkMiOm1bcz1wYXJzZUludChUW3VdLnNsaWNlKDEpLDEwKS0xXXx8KG1bc109e30pO2JyZWFrO2Nhc2UiUiI6Z1tjPXBhcnNlSW50KFRbdV0uc2xpY2UoMSksMTApLTFdfHwoZ1tjXT17fSkseT4wPyhnW2NdLmhwdD15LGdbY10uaHB4PXFEKHkpKTowPT09eSYmKGdbY10uaGlkZGVuPSEwKTticmVhaztkZWZhdWx0OmlmKGkmJmkuV1RGKXRocm93IG5ldyBFcnJvcigiU1lMSyBiYWQgcmVjb3JkICIrRCl9UDwxJiYoaD1udWxsKTticmVhaztkZWZhdWx0OmlmKGkmJmkuV1RGKXRocm93IG5ldyBFcnJvcigiU1lMSyBiYWQgcmVjb3JkICIrRCl9fXJldHVybiBnLmxlbmd0aD4wJiYocFsiIXJvd3MiXT1nKSxtLmxlbmd0aD4wJiYocFsiIWNvbHMiXT1tKSxtLmZvckVhY2goKGZ1bmN0aW9uKGUpe3pEKGUpfSkpLGkmJmkuc2hlZXRSb3dzJiYoZj1mLnNsaWNlKDAsaS5zaGVldFJvd3MpKSxbZixwLHZdfWZ1bmN0aW9uIG8oZSx0LG4scixpLGEpe3ZhciBvPSJDO1kiKyhuKzEpKyI7WCIrKHIrMSkrIjtLIjtzd2l0Y2goZS50KXtjYXNlIm4iOm8rPWUudnx8MCxlLmYmJiFlLkYmJihvKz0iO0UiK2dUKGUuZix7cjpuLGM6cn0pKTticmVhaztjYXNlImIiOm8rPWUudj8iVFJVRSI6IkZBTFNFIjticmVhaztjYXNlImUiOm8rPWUud3x8ZS52O2JyZWFrO2Nhc2UiZCI6bys9bmIoc2IoZS52LGEpLGEpO2JyZWFrO2Nhc2UicyI6bys9JyInKyhudWxsPT1lLnY/IiI6U3RyaW5nKGUudikpLnJlcGxhY2UoLyIvZywiIikucmVwbGFjZSgvOy9nLCI7OyIpKyciJ31yZXR1cm4gb31mdW5jdGlvbiBjKGUsdCxuKXt2YXIgcj0iQztZIisodCsxKSsiO1giKyhuKzEpKyI7QSI7cmV0dXJuIHIrPWkoZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnR9KSkuam9pbigiIikpfXJldHVybnt0b193b3JrYm9vazpmdW5jdGlvbihlLHQpe3ZhciBuPWZ1bmN0aW9uKGUsdCl7c3dpdGNoKHQudHlwZSl7Y2FzZSJiYXNlNjQiOnJldHVybiBhKCRnKGUpLHQpO2Nhc2UiYmluYXJ5IjpyZXR1cm4gYShlLHQpO2Nhc2UiYnVmZmVyIjpyZXR1cm4gYShZZyYmQnVmZmVyLmlzQnVmZmVyKGUpP2UudG9TdHJpbmcoImJpbmFyeSIpOnRtKGUpLHQpO2Nhc2UiYXJyYXkiOnJldHVybiBhKGxiKGUpLHQpfXRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHR5cGUgIit0LnR5cGUpfShlLHQpLHI9blswXSxpPW5bMV0sbz1uWzJdLGM9dWIodCk7Yy5kYXRlMTkwND0oKChvfHx7fSkuV29ya2Jvb2t8fHt9KS5XQlByb3BzfHx7fSkuZGF0ZTE5MDQ7dmFyIHM9cHYocixjKTtabShpKS5mb3JFYWNoKChmdW5jdGlvbihlKXtzW2VdPWlbZV19KSk7dmFyIGw9ZHYocyx0KTtyZXR1cm4gWm0obykuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bFtlXT1vW2VdfSkpLGwuYm9va1R5cGU9InN5bGsiLGx9LGZyb21fc2hlZXQ6ZnVuY3Rpb24oZSx0LG4pe3R8fCh0PXt9KSx0Ll9mb3JtYXRzPVsiR2VuZXJhbCJdO3ZhciByLGk9WyJJRDtQU2hlZXRKUztOO0UiXSxhPVtdLHM9bHYoZVsiIXJlZiJdfHwiQTEiKSxsPW51bGwhPWVbIiFkYXRhIl0sdT0iXHJcbiIsZj0oKChufHx7fSkuV29ya2Jvb2t8fHt9KS5XQlByb3BzfHx7fSkuZGF0ZTE5MDQ7aS5wdXNoKCJQO1BHZW5lcmFsIik7dmFyIGQsaD1zLnMucixwPXMucy5jLGc9W107aWYoZVsiIXJlZiJdKWZvcihoPXMucy5yO2g8PXMuZS5yOysraClpZighbHx8ZVsiIWRhdGEiXVtoXSl7Zm9yKGc9W10scD1zLnMuYztwPD1zLmUuYzsrK3ApKHI9bD9lWyIhZGF0YSJdW2hdW3BdOmVbaXYocCkrbnYoaCldKSYmci5jJiZnLnB1c2goYyhyLmMsaCxwKSk7Zy5sZW5ndGgmJmEucHVzaChnLmpvaW4odSkpfWlmKGVbIiFyZWYiXSlmb3IoaD1zLnMucjtoPD1zLmUucjsrK2gpaWYoIWx8fGVbIiFkYXRhIl1baF0pe2ZvcihnPVtdLHA9cy5zLmM7cDw9cy5lLmM7KytwKWlmKChyPWw/ZVsiIWRhdGEiXVtoXVtwXTplW2l2KHApK252KGgpXSkmJihudWxsIT1yLnZ8fHIuZiYmIXIuRikpe2lmKCJHZW5lcmFsIiE9KHIuenx8KCJkIj09ci50P2dtWzE0XToiR2VuZXJhbCIpKSl7dmFyIG09dC5fZm9ybWF0cy5pbmRleE9mKHIueik7LTE9PW0mJih0Ll9mb3JtYXRzLnB1c2goci56KSxtPXQuX2Zvcm1hdHMubGVuZ3RoLTEsaS5wdXNoKCJQO1AiK3Iuei5yZXBsYWNlKC87L2csIjs7IikpKSxnLnB1c2goIkY7UCIrbSsiO1kiKyhoKzEpKyI7WCIrKHArMSkpfWcucHVzaChvKHIsMCxoLHAsMCxmKSl9YS5wdXNoKGcuam9pbih1KSl9cmV0dXJuIGkucHVzaCgiRjtQMDtERzBHODtNMjU1IiksZVsiIWNvbHMiXSYmKGQ9aSxlWyIhY29scyJdLmZvckVhY2goKGZ1bmN0aW9uKGUsdCl7dmFyIG49IkY7VyIrKHQrMSkrIiAiKyh0KzEpKyIgIjtlLmhpZGRlbj9uKz0iMCI6KCJudW1iZXIiIT10eXBlb2YgZS53aWR0aHx8ZS53cHh8fChlLndweD1CRChlLndpZHRoKSksIm51bWJlciIhPXR5cGVvZiBlLndweHx8ZS53Y2h8fChlLndjaD1XRChlLndweCkpLCJudW1iZXIiPT10eXBlb2YgZS53Y2gmJihuKz1NYXRoLnJvdW5kKGUud2NoKSkpLCIgIiE9bi5jaGFyQXQobi5sZW5ndGgtMSkmJmQucHVzaChuKX0pKSksZVsiIXJvd3MiXSYmZnVuY3Rpb24oZSx0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQsbil7dmFyIHI9IkY7Ijt0LmhpZGRlbj9yKz0iTTA7Ijp0LmhwdD9yKz0iTSIrMjAqdC5ocHQrIjsiOnQuaHB4JiYocis9Ik0iKzIwKlZEKHQuaHB4KSsiOyIpLHIubGVuZ3RoPjImJmUucHVzaChyKyJSIisobisxKSl9KSl9KGksZVsiIXJvd3MiXSksZVsiIXJlZiJdJiZpLnB1c2goIkI7WSIrKHMuZS5yLXMucy5yKzEpKyI7WCIrKHMuZS5jLXMucy5jKzEpKyI7RCIrW3Mucy5jLHMucy5yLHMuZS5jLHMuZS5yXS5qb2luKCIgIikpLGkucHVzaCgiTztMO0Q7QiIrKGY/IjtWNCI6IiIpKyI7SzQ3O0cxMDAgMC4wMDEiKSxkZWxldGUgdC5fZm9ybWF0cyxpLmpvaW4odSkrdSthLmpvaW4odSkrdSsiRSIrdX19fSgpLHJEPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj1lLnNwbGl0KCJcbiIpLHI9LTEsaT0tMSxhPTAsbz1bXTthIT09bi5sZW5ndGg7KythKWlmKCJCT1QiIT09blthXS50cmltKCkpe2lmKCEocjwwKSl7Zm9yKHZhciBjPW5bYV0udHJpbSgpLnNwbGl0KCIsIikscz1jWzBdLGw9Y1sxXSx1PW5bKythXXx8IiI7MSYodS5tYXRjaCgvWyJdL2cpfHxbXSkubGVuZ3RoJiZhPG4ubGVuZ3RoLTE7KXUrPSJcbiIrblsrK2FdO3N3aXRjaCh1PXUudHJpbSgpLCtzKXtjYXNlLTE6aWYoIkJPVCI9PT11KXtvWysrcl09W10saT0wO2NvbnRpbnVlfWlmKCJFT0QiIT09dSl0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCBESUYgc3BlY2lhbCBjb21tYW5kICIrdSk7YnJlYWs7Y2FzZSAwOiJUUlVFIj09PXU/b1tyXVtpXT0hMDoiRkFMU0UiPT09dT9vW3JdW2ldPSExOmlzTmFOKGRiKGwpKT9pc05hTih5YihsKS5nZXREYXRlKCkpP29bcl1baV09bDoob1tyXVtpXT1zYihsKSx0JiZ0LlVUQ3x8KG9bcl1baV09eGIob1tyXVtpXSkpKTpvW3JdW2ldPWRiKGwpLCsraTticmVhaztjYXNlIDE6KHU9KHU9dS5zbGljZSgxLHUubGVuZ3RoLTEpKS5yZXBsYWNlKC8iIi9nLCciJykpJiZ1Lm1hdGNoKC9ePSIuKiIkLykmJih1PXUuc2xpY2UoMiwtMSkpLG9bcl1baSsrXT0iIiE9PXU/dTpudWxsfWlmKCJFT0QiPT09dSlicmVha319ZWxzZSBvWysrcl09W10saT0wO3JldHVybiB0JiZ0LnNoZWV0Um93cyYmKG89by5zbGljZSgwLHQuc2hlZXRSb3dzKSksb31mdW5jdGlvbiB0KHQsbil7cmV0dXJuIHB2KGZ1bmN0aW9uKHQsbil7c3dpdGNoKG4udHlwZSl7Y2FzZSJiYXNlNjQiOnJldHVybiBlKCRnKHQpLG4pO2Nhc2UiYmluYXJ5IjpyZXR1cm4gZSh0LG4pO2Nhc2UiYnVmZmVyIjpyZXR1cm4gZShZZyYmQnVmZmVyLmlzQnVmZmVyKHQpP3QudG9TdHJpbmcoImJpbmFyeSIpOnRtKHQpLG4pO2Nhc2UiYXJyYXkiOnJldHVybiBlKGxiKHQpLG4pfXRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHR5cGUgIituLnR5cGUpfSh0LG4pLG4pfWZ1bmN0aW9uIG4oZSx0KXtyZXR1cm4iMCwiK1N0cmluZyhlKSsiXHJcbiIrdH1mdW5jdGlvbiByKGUpe3JldHVybicxLDBcclxuIicrZS5yZXBsYWNlKC8iL2csJyIiJykrJyInfXJldHVybnt0b193b3JrYm9vazpmdW5jdGlvbihlLG4pe3ZhciByPWR2KHQoZSxuKSxuKTtyZXR1cm4gci5ib29rVHlwZT0iZGlmIixyfSx0b19zaGVldDp0LGZyb21fc2hlZXQ6ZnVuY3Rpb24oZSl7aWYoIWVbIiFyZWYiXSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBleHBvcnQgZW1wdHkgc2hlZXQgdG8gRElGIik7Zm9yKHZhciB0PWx2KGVbIiFyZWYiXSksaT1udWxsIT1lWyIhZGF0YSJdLGE9WydUQUJMRVxyXG4wLDFcclxuInNoZWV0anMiXHJcbicsIlZFQ1RPUlNcclxuMCwiKyh0LmUuci10LnMucisxKSsnXHJcbiIiXHJcbicsIlRVUExFU1xyXG4wLCIrKHQuZS5jLXQucy5jKzEpKydcclxuIiJcclxuJywnREFUQVxyXG4wLDBcclxuIiJcclxuJ10sbz10LnMucjtvPD10LmUucjsrK28pe2Zvcih2YXIgYz1pP2VbIiFkYXRhIl1bb106W10scz0iLTEsMFxyXG5CT1RcclxuIixsPXQucy5jO2w8PXQuZS5jOysrbCl7dmFyIHU9aT9jJiZjW2xdOmVbb3Yoe3I6byxjOmx9KV07aWYobnVsbCE9dSl7c3dpdGNoKHUudCl7Y2FzZSJuIjpudWxsIT11Lnc/cys9IjAsIit1LncrIlxyXG5WIjpudWxsIT11LnY/cys9bih1LnYsIlYiKTpudWxsPT11LmZ8fHUuRj9zKz0nMSwwXHJcbiIiJzpzKz1yKCI9Iit1LmYpO2JyZWFrO2Nhc2UiYiI6cys9dS52P24oMSwiVFJVRSIpOm4oMCwiRkFMU0UiKTticmVhaztjYXNlInMiOnMrPXIoaXNOYU4oK3Uudik/dS52Oic9IicrdS52KyciJyk7YnJlYWs7Y2FzZSJkIjp1Lnd8fCh1Lnc9SG0odS56fHxnbVsxNF0sbmIoc2IodS52KSkpKSxzKz1uKHUudywiViIpO2JyZWFrO2RlZmF1bHQ6cys9JzEsMFxyXG4iIid9cys9IlxyXG4ifWVsc2Ugcys9JzEsMFxyXG4iIlxyXG4nfWEucHVzaChzKX1yZXR1cm4gYS5qb2luKCIiKSsiLTEsMFxyXG5FT0QifX19KCksaUQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3JldHVybiBlLnJlcGxhY2UoL1xcL2csIlxcYiIpLnJlcGxhY2UoLzovZywiXFxjIikucmVwbGFjZSgvXG4vZywiXFxuIil9ZnVuY3Rpb24gdChlLHQpe3JldHVybiBwdihmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1lLnNwbGl0KCJcbiIpLHI9LTEsaT0tMSxhPTAsbz1bXTthIT09bi5sZW5ndGg7KythKXt2YXIgYz1uW2FdLnRyaW0oKS5zcGxpdCgiOiIpO2lmKCJjZWxsIj09PWNbMF0pe3ZhciBzPWF2KGNbMV0pO2lmKG8ubGVuZ3RoPD1zLnIpZm9yKHI9by5sZW5ndGg7cjw9cy5yOysrcilvW3JdfHwob1tyXT1bXSk7c3dpdGNoKHI9cy5yLGk9cy5jLGNbMl0pe2Nhc2UidCI6b1tyXVtpXT1jWzNdLnJlcGxhY2UoL1xcYi9nLCJcXCIpLnJlcGxhY2UoL1xcYy9nLCI6IikucmVwbGFjZSgvXFxuL2csIlxuIik7YnJlYWs7Y2FzZSJ2IjpvW3JdW2ldPStjWzNdO2JyZWFrO2Nhc2UidnRmIjp2YXIgbD1jW2MubGVuZ3RoLTFdO2Nhc2UidnRjIjoibmwiPT09Y1szXT9vW3JdW2ldPSEhK2NbNF06b1tyXVtpXT0rY1s0XSwidnRmIj09Y1syXSYmKG9bcl1baV09W29bcl1baV0sbF0pfX19cmV0dXJuIHQmJnQuc2hlZXRSb3dzJiYobz1vLnNsaWNlKDAsdC5zaGVldFJvd3MpKSxvfShlLHQpLHQpfXZhciBuPVsic29jaWFsY2FsYzp2ZXJzaW9uOjEuNSIsIk1JTUUtVmVyc2lvbjogMS4wIiwiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PVNvY2lhbENhbGNTcHJlYWRzaGVldENvbnRyb2xTYXZlIl0uam9pbigiXG4iKSxyPVsiLS1Tb2NpYWxDYWxjU3ByZWFkc2hlZXRDb250cm9sU2F2ZSIsIkNvbnRlbnQtdHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOCJdLmpvaW4oIlxuIikrIlxuIixpPVsiIyBTb2NpYWxDYWxjIFNwcmVhZHNoZWV0IENvbnRyb2wgU2F2ZSIsInBhcnQ6c2hlZXQiXS5qb2luKCJcbiIpLGE9Ii0tU29jaWFsQ2FsY1NwcmVhZHNoZWV0Q29udHJvbFNhdmUtLSI7ZnVuY3Rpb24gbyh0KXtpZighdHx8IXRbIiFyZWYiXSlyZXR1cm4iIjtmb3IodmFyIG4scj1bXSxpPVtdLGE9IiIsbz1jdih0WyIhcmVmIl0pLGM9bnVsbCE9dFsiIWRhdGEiXSxzPW8ucy5yO3M8PW8uZS5yOysrcylmb3IodmFyIGw9by5zLmM7bDw9by5lLmM7KytsKWlmKGE9b3Yoe3I6cyxjOmx9KSwobj1jPyh0WyIhZGF0YSJdW3NdfHxbXSlbbF06dFthXSkmJm51bGwhPW4udiYmInoiIT09bi50KXtzd2l0Y2goaT1bImNlbGwiLGEsInQiXSxuLnQpe2Nhc2UicyI6Y2FzZSJzdHIiOmkucHVzaChlKG4udikpO2JyZWFrO2Nhc2UibiI6bi5mPyhpWzJdPSJ2dGYiLGlbM109Im4iLGlbNF09bi52LGlbNV09ZShuLmYpKTooaVsyXT0idiIsaVszXT1uLnYpO2JyZWFrO2Nhc2UiYiI6aVsyXT0idnQiKyhuLmY/ImYiOiJjIiksaVszXT0ibmwiLGlbNF09bi52PyIxIjoiMCIsaVs1XT1lKG4uZnx8KG4udj8iVFJVRSI6IkZBTFNFIikpO2JyZWFrO2Nhc2UiZCI6dmFyIHU9bmIoc2Iobi52KSk7aVsyXT0idnRjIixpWzNdPSJuZCIsaVs0XT0iIit1LGlbNV09bi53fHxIbShuLnp8fGdtWzE0XSx1KTticmVhaztjYXNlImUiOmNvbnRpbnVlfXIucHVzaChpLmpvaW4oIjoiKSl9cmV0dXJuIHIucHVzaCgic2hlZXQ6YzoiKyhvLmUuYy1vLnMuYysxKSsiOnI6Iisoby5lLnItby5zLnIrMSkrIjp0dmY6MSIpLHIucHVzaCgidmFsdWVmb3JtYXQ6MTp0ZXh0LXdpa2kiKSxyLmpvaW4oIlxuIil9cmV0dXJue3RvX3dvcmtib29rOmZ1bmN0aW9uKGUsbil7cmV0dXJuIGR2KHQoZSxuKSxuKX0sdG9fc2hlZXQ6dCxmcm9tX3NoZWV0OmZ1bmN0aW9uKGUpe3JldHVybltuLHIsaSxyLG8oZSksYV0uam9pbigiXG4iKX19fSgpLGFEPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbixyLGkpe2kucmF3P3Rbbl1bcl09ZToiIj09PWV8fCgiVFJVRSI9PT1lP3Rbbl1bcl09ITA6IkZBTFNFIj09PWU/dFtuXVtyXT0hMTppc05hTihkYihlKSk/aXNOYU4oeWIoZSkuZ2V0RGF0ZSgpKT90W25dW3JdPWU6dFtuXVtyXT1zYihlKTp0W25dW3JdPWRiKGUpKX12YXIgdD17NDQ6IiwiLDk6Ilx0Iiw1OToiOyIsMTI0OiJ8In0sbj17NDQ6Myw5OjIsNTk6MSwxMjQ6MH07ZnVuY3Rpb24gcihlKXtmb3IodmFyIHI9e30saT0hMSxhPTAsbz0wO2E8ZS5sZW5ndGg7KythKTM0PT0obz1lLmNoYXJDb2RlQXQoYSkpP2k9IWk6IWkmJm8gaW4gdCYmKHJbb109KHJbb118fDApKzEpO2ZvcihhIGluIG89W10scilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocixhKSYmby5wdXNoKFtyW2FdLGFdKTtpZighby5sZW5ndGgpZm9yKGEgaW4gcj1uKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLGEpJiZvLnB1c2goW3JbYV0sYV0pO3JldHVybiBvLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbMF0tdFswXXx8bltlWzFdXS1uW3RbMV1dfSkpLHRbby5wb3AoKVsxXV18fDQ0fWZ1bmN0aW9uIGkoZSx0KXt2YXIgbj10fHx7fSxpPSIiLGE9e307bi5kZW5zZSYmKGFbIiFkYXRhIl09W10pO3ZhciBvPXtzOntjOjAscjowfSxlOntjOjAscjowfX07InNlcD0iPT1lLnNsaWNlKDAsNCk/MTM9PWUuY2hhckNvZGVBdCg1KSYmMTA9PWUuY2hhckNvZGVBdCg2KT8oaT1lLmNoYXJBdCg0KSxlPWUuc2xpY2UoNykpOjEzPT1lLmNoYXJDb2RlQXQoNSl8fDEwPT1lLmNoYXJDb2RlQXQoNSk/KGk9ZS5jaGFyQXQoNCksZT1lLnNsaWNlKDYpKTppPXIoZS5zbGljZSgwLDEwMjQpKTppPW4mJm4uRlM/bi5GUzpyKGUuc2xpY2UoMCwxMDI0KSk7dmFyIGMscyxsPTAsdT0wLGY9MCxkPTAsaD0wLHA9aS5jaGFyQ29kZUF0KDApLGc9ITEsbT0wLGI9ZS5jaGFyQ29kZUF0KDApLHk9bnVsbCE9bi5kYXRlTkY/KGM9bi5kYXRlTkYscz0ocz0ibnVtYmVyIj09dHlwZW9mIGM/Z21bY106YykucmVwbGFjZShHbSwiKFxcZCspIiksR20ubGFzdEluZGV4PTAsbmV3IFJlZ0V4cCgiXiIrcysiJCIpKTpudWxsO2Z1bmN0aW9uIHYoKXt2YXIgdD1lLnNsaWNlKGQsaCk7IlxyIj09dC5zbGljZSgtMSkmJih0PXQuc2xpY2UoMCwtMSkpO3ZhciByPXt9O2lmKCciJz09dC5jaGFyQXQoMCkmJiciJz09dC5jaGFyQXQodC5sZW5ndGgtMSkmJih0PXQuc2xpY2UoMSwtMSkucmVwbGFjZSgvIiIvZywnIicpKSwhMSE9PW4uY2VsbFRleHQmJihyLnc9dCksMD09PXQubGVuZ3RoKXIudD0ieiI7ZWxzZSBpZihuLnJhdylyLnQ9InMiLHIudj10O2Vsc2UgaWYoMD09PXQudHJpbSgpLmxlbmd0aClyLnQ9InMiLHIudj10O2Vsc2UgaWYoNjE9PXQuY2hhckNvZGVBdCgwKSkzND09dC5jaGFyQ29kZUF0KDEpJiYzND09dC5jaGFyQ29kZUF0KHQubGVuZ3RoLTEpPyhyLnQ9InMiLHIudj10LnNsaWNlKDIsLTEpLnJlcGxhY2UoLyIiL2csJyInKSk6MSE9dC5sZW5ndGg/KHIudD0icyIsci5mPXQuc2xpY2UoMSksci52PXQpOihyLnQ9InMiLHIudj10KTtlbHNlIGlmKCJUUlVFIj09dClyLnQ9ImIiLHIudj0hMDtlbHNlIGlmKCJGQUxTRSI9PXQpci50PSJiIixyLnY9ITE7ZWxzZSBpZihpc05hTihmPWRiKHQpKSlpZighaXNOYU4oKGY9eWIodCkpLmdldERhdGUoKSl8fHkmJnQubWF0Y2goeSkpe2lmKHIuej1uLmRhdGVORnx8Z21bMTRdLHkmJnQubWF0Y2goeSkpe3ZhciBpPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0tMSxpPS0xLGE9LTEsbz0tMSxjPS0xLHM9LTE7KHQubWF0Y2goR20pfHxbXSkuZm9yRWFjaCgoZnVuY3Rpb24oZSx0KXt2YXIgbD1wYXJzZUludChuW3QrMV0sMTApO3N3aXRjaChlLnRvTG93ZXJDYXNlKCkuY2hhckF0KDApKXtjYXNlInkiOnI9bDticmVhaztjYXNlImQiOmE9bDticmVhaztjYXNlImgiOm89bDticmVhaztjYXNlInMiOnM9bDticmVhaztjYXNlIm0iOm8+PTA/Yz1sOmk9bH19KSksR20ubGFzdEluZGV4PTAscz49MCYmLTE9PWMmJmk+PTAmJihjPWksaT0tMSk7dmFyIGw9KCIiKyhyPj0wP3I6KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpKSkuc2xpY2UoLTQpKyItIisoIjAwIisoaT49MT9pOjEpKS5zbGljZSgtMikrIi0iKygiMDAiKyhhPj0xP2E6MSkpLnNsaWNlKC0yKTs3PT1sLmxlbmd0aCYmKGw9IjAiK2wpLDg9PWwubGVuZ3RoJiYobD0iMjAiK2wpO3ZhciB1PSgiMDAiKyhvPj0wP286MCkpLnNsaWNlKC0yKSsiOiIrKCIwMCIrKGM+PTA/YzowKSkuc2xpY2UoLTIpKyI6IisoIjAwIisocz49MD9zOjApKS5zbGljZSgtMik7cmV0dXJuLTE9PW8mJi0xPT1jJiYtMT09cz9sOi0xPT1yJiYtMT09aSYmLTE9PWE/dTpsKyJUIit1fSgwLG4uZGF0ZU5GLHQubWF0Y2goeSl8fFtdKTtmPXNiKGkpLG4mJiExPT09bi5VVEMmJihmPXhiKGYpKX1lbHNlIG4mJiExPT09bi5VVEM/Zj14YihmKTohMSE9PW4uY2VsbFRleHQmJm4uZGF0ZU5GJiYoci53PUhtKHIueixmKSk7bi5jZWxsRGF0ZXM/KHIudD0iZCIsci52PWYpOihyLnQ9Im4iLHIudj1uYihmKSksbi5jZWxsTkZ8fGRlbGV0ZSByLnp9ZWxzZSByLnQ9InMiLHIudj10O2Vsc2Ugci50PSJuIixyLnY9ZjtpZigieiI9PXIudHx8KG4uZGVuc2U/KGFbIiFkYXRhIl1bbF18fChhWyIhZGF0YSJdW2xdPVtdKSxhWyIhZGF0YSJdW2xdW3VdPXIpOmFbb3Yoe2M6dSxyOmx9KV09ciksZD1oKzEsYj1lLmNoYXJDb2RlQXQoZCksby5lLmM8dSYmKG8uZS5jPXUpLG8uZS5yPGwmJihvLmUucj1sKSxtPT1wKSsrdTtlbHNlIGlmKHU9MCwrK2wsbi5zaGVldFJvd3MmJm4uc2hlZXRSb3dzPD1sKXJldHVybiEwfWU6Zm9yKDtoPGUubGVuZ3RoOysraClzd2l0Y2gobT1lLmNoYXJDb2RlQXQoaCkpe2Nhc2UgMzQ6MzQ9PT1iJiYoZz0hZyk7YnJlYWs7Y2FzZSAxMzppZihnKWJyZWFrOzEwPT1lLmNoYXJDb2RlQXQoaCsxKSYmKytoO2Nhc2UgcDpjYXNlIDEwOmlmKCFnJiZ2KCkpYnJlYWsgZX1yZXR1cm4gaC1kPjAmJnYoKSxhWyIhcmVmIl09c3YobyksYX1mdW5jdGlvbiBhKHQsbil7cmV0dXJuIG4mJm4uUFJOP24uRlN8fCJzZXA9Ij09dC5zbGljZSgwLDQpfHx0LmluZGV4T2YoIlx0Iik+PTB8fHQuaW5kZXhPZigiLCIpPj0wfHx0LmluZGV4T2YoIjsiKT49MD9pKHQsbik6cHYoZnVuY3Rpb24odCxuKXt2YXIgcj1ufHx7fSxpPVtdO2lmKCF0fHwwPT09dC5sZW5ndGgpcmV0dXJuIGk7Zm9yKHZhciBhPXQuc3BsaXQoL1tcclxuXS8pLG89YS5sZW5ndGgtMTtvPj0wJiYwPT09YVtvXS5sZW5ndGg7KS0tbztmb3IodmFyIGM9MTAscz0wLGw9MDtsPD1vOysrbCktMT09KHM9YVtsXS5pbmRleE9mKCIgIikpP3M9YVtsXS5sZW5ndGg6cysrLGM9TWF0aC5tYXgoYyxzKTtmb3IobD0wO2w8PW87KytsKXtpW2xdPVtdO3ZhciB1PTA7Zm9yKGUoYVtsXS5zbGljZSgwLGMpLnRyaW0oKSxpLGwsdSxyKSx1PTE7dTw9KGFbbF0ubGVuZ3RoLWMpLzEwKzE7Kyt1KWUoYVtsXS5zbGljZShjKzEwKih1LTEpLGMrMTAqdSkudHJpbSgpLGksbCx1LHIpfXJldHVybiByLnNoZWV0Um93cyYmKGk9aS5zbGljZSgwLHIuc2hlZXRSb3dzKSksaX0odCxuKSxuKTppKHQsbil9ZnVuY3Rpb24gbyhlLHQpe3ZhciBuPSIiLHI9InN0cmluZyI9PXQudHlwZT9bMCwwLDAsMF06Wl8oZSx0KTtzd2l0Y2godC50eXBlKXtjYXNlImJhc2U2NCI6bj0kZyhlKTticmVhaztjYXNlImJpbmFyeSI6Y2FzZSJzdHJpbmciOm49ZTticmVhaztjYXNlImJ1ZmZlciI6bj02NTAwMT09dC5jb2RlcGFnZT9lLnRvU3RyaW5nKCJ1dGY4Iik6dC5jb2RlcGFnZSYmdm9pZCAwIT09T2c/T2cudXRpbHMuZGVjb2RlKHQuY29kZXBhZ2UsZSk6WWcmJkJ1ZmZlci5pc0J1ZmZlcihlKT9lLnRvU3RyaW5nKCJiaW5hcnkiKTp0bShlKTticmVhaztjYXNlImFycmF5IjpuPWxiKGUpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgdHlwZSAiK3QudHlwZSl9cmV0dXJuIDIzOT09clswXSYmMTg3PT1yWzFdJiYxOTE9PXJbMl0/bj1RYihuLnNsaWNlKDMpKToic3RyaW5nIiE9dC50eXBlJiYiYnVmZmVyIiE9dC50eXBlJiY2NTAwMT09dC5jb2RlcGFnZT9uPVFiKG4pOiJiaW5hcnkiPT10LnR5cGUmJnZvaWQgMCE9PU9nJiZ0LmNvZGVwYWdlJiYobj1PZy51dGlscy5kZWNvZGUodC5jb2RlcGFnZSxPZy51dGlscy5lbmNvZGUoMjg1OTEsbikpKSwic29jaWFsY2FsYzp2ZXJzaW9uOiI9PW4uc2xpY2UoMCwxOSk/aUQudG9fc2hlZXQoInN0cmluZyI9PXQudHlwZT9uOlFiKG4pLHQpOmEobix0KX1yZXR1cm57dG9fd29ya2Jvb2s6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZHYobyhlLHQpLHQpfSx0b19zaGVldDpvLGZyb21fc2hlZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9W107aWYoIWVbIiFyZWYiXSlyZXR1cm4iIjtmb3IodmFyIG4scj1sdihlWyIhcmVmIl0pLGk9bnVsbCE9ZVsiIWRhdGEiXSxhPXIucy5yO2E8PXIuZS5yOysrYSl7Zm9yKHZhciBvPVtdLGM9ci5zLmM7Yzw9ci5lLmM7KytjKXt2YXIgcz1vdih7cjphLGM6Y30pO2lmKChuPWk/KGVbIiFkYXRhIl1bYV18fFtdKVtjXTplW3NdKSYmbnVsbCE9bi52KXtmb3IodmFyIGw9KG4ud3x8KGZ2KG4pLG4udyl8fCIiKS5zbGljZSgwLDEwKTtsLmxlbmd0aDwxMDspbCs9IiAiO28ucHVzaChsKygwPT09Yz8iICI6IiIpKX1lbHNlIG8ucHVzaCgiICAgICAgICAgICIpfXQucHVzaChvLmpvaW4oIiIpKX1yZXR1cm4gdC5qb2luKCJcbiIpfX19KCk7dmFyIG9EPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbil7aWYoZSl7R3koZSxlLmx8fDApO2Zvcih2YXIgcj1uLkVudW18fHk7ZS5sPGUubGVuZ3RoOyl7dmFyIGk9ZS5yZWFkX3NoaWZ0KDIpLGE9cltpXXx8cls2NTUzNV0sbz1lLnJlYWRfc2hpZnQoMiksYz1lLmwrbyxzPWEuZiYmYS5mKGUsbyxuKTtpZihlLmw9Yyx0KHMsYSxpKSlyZXR1cm59fX12YXIgdD1bIm1tbW0iLCJkZC1tbW0teXl5eSIsImRkLW1tbSIsIm1tbS15eXl5IiwiQCIsIm1tL2RkIiwiaGg6bW06c3MgQU0vUE0iLCJoaDptbSBBTS9QTSIsIm1tL2RkL3l5eXkiLCJtbS9kZCIsImhoOm1tOnNzIiwiaGg6bW0iXTtmdW5jdGlvbiBuKG4scil7aWYoIW4pcmV0dXJuIG47dmFyIGk9cnx8e30sYT17fSxvPSJTaGVldDEiLGM9IiIscz0wLGw9e30sdT1bXSxmPVtdLGQ9W107aS5kZW5zZSYmKGQ9YVsiIWRhdGEiXT1bXSk7dmFyIGg9e3M6e3I6MCxjOjB9LGU6e3I6MCxjOjB9fSxwPWkuc2hlZXRSb3dzfHwwLGc9e307aWYoODE9PW5bNF0mJjgwPT1uWzVdJiY4Nz09bls2XSlyZXR1cm4gZnVuY3Rpb24oZSx0KXtHeShlLDApO3ZhciBuPXR8fHt9LHI9e307bi5kZW5zZSYmKHJbIiFkYXRhIl09W10pO3ZhciBpPVtdLGE9IiIsbz17czp7cjotMSxjOi0xfSxlOntyOi0xLGM6LTF9fSxjPTAscz0wLGw9MCx1PTAsZj17U2hlZXROYW1lczpbXSxTaGVldHM6e319LGQ9W107ZTpmb3IoO2UubDxlLmxlbmd0aDspe3ZhciBoPWUucmVhZF9zaGlmdCgyKSxwPWUucmVhZF9zaGlmdCgyKSxnPWUuc2xpY2UoZS5sLGUubCtwKTtzd2l0Y2goR3koZywwKSxoKXtjYXNlIDE6aWYoOTYyMDIzNTA1IT1nLnJlYWRfc2hpZnQoNCkpdGhyb3ciQmFkIFFQVzkgQk9GISI7YnJlYWs7Y2FzZSAyOmJyZWFrIGU7Y2FzZSA4OmNhc2UgMTAyNTpjYXNlIDEwMjY6Y2FzZSAxMDMyOmJyZWFrO2Nhc2UgMTA6Zm9yKHZhciBtPWcucmVhZF9zaGlmdCg0KSxiPShnLmxlbmd0aC1nLmwpL218MCx5PTA7eTxtOysreSl7dmFyIHY9Zy5sK2IsVD17fTtnLmwrPTIsVC5udW1GbXRJZD1nLnJlYWRfc2hpZnQoMikseFtULm51bUZtdElkXSYmKFQuej14W1QubnVtRm10SWRdKSxnLmw9dixkLnB1c2goVCl9YnJlYWs7Y2FzZSAxMDMxOmZvcihnLmwrPTEyO2cubDxnLmxlbmd0aDspYz1nLnJlYWRfc2hpZnQoMikscz1nLnJlYWRfc2hpZnQoMSksaS5wdXNoKGcucmVhZF9zaGlmdChjLCJjc3RyIikpO2JyZWFrO2Nhc2UgMTUzNzp2YXIgdz1nLnJlYWRfc2hpZnQoMik7cj17fSxuLmRlbnNlJiYoclsiIWRhdGEiXT1bXSksby5zLmM9Zy5yZWFkX3NoaWZ0KDIpLG8uZS5jPWcucmVhZF9zaGlmdCgyKSxvLnMucj1nLnJlYWRfc2hpZnQoNCksby5lLnI9Zy5yZWFkX3NoaWZ0KDQpLGcubCs9NCxnLmwrMjxnLmxlbmd0aCYmKGM9Zy5yZWFkX3NoaWZ0KDIpLHM9Zy5yZWFkX3NoaWZ0KDEpLGE9MD09Yz8iIjpnLnJlYWRfc2hpZnQoYywiY3N0ciIpKSxhfHwoYT1pdih3KSk7YnJlYWs7Y2FzZSAxNTM4OmlmKG8ucy5jPjI1NXx8by5zLnI+OTk5OTk5KWJyZWFrO28uZS5jPG8ucy5jJiYoby5lLmM9by5zLmMpLG8uZS5yPG8ucy5yJiYoby5lLnI9by5zLnIpLHJbIiFyZWYiXT1zdihvKSx1RShmLHIsYSk7YnJlYWs7Y2FzZSAyNTYxOmw9Zy5yZWFkX3NoaWZ0KDIpLG8uZS5jPGwmJihvLmUuYz1sKSxvLnMuYz5sJiYoby5zLmM9bCksdT1nLnJlYWRfc2hpZnQoNCksby5zLnI+dSYmKG8ucy5yPXUpLHU9Zy5yZWFkX3NoaWZ0KDQpLG8uZS5yPHUmJihvLmUucj11KTticmVhaztjYXNlIDMwNzM6dT1nLnJlYWRfc2hpZnQoNCksYz1nLnJlYWRfc2hpZnQoNCksby5zLnI+dSYmKG8ucy5yPXUpLG8uZS5yPHUrYy0xJiYoby5lLnI9dStjLTEpO2Zvcih2YXIgXz1pdihsKTtnLmw8Zy5sZW5ndGg7KXt2YXIgRT17dDoieiJ9LFU9Zy5yZWFkX3NoaWZ0KDEpLEE9LTE7MTI4JlUmJihBPWcucmVhZF9zaGlmdCgyKSk7dmFyIGs9NjQmVT9nLnJlYWRfc2hpZnQoMiktMTowO3N3aXRjaCgzMSZVKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2Nhc2UgMjpFPXt0OiJuIix2OmcucmVhZF9zaGlmdCgyKX07YnJlYWs7Y2FzZSAzOkU9e3Q6Im4iLHY6Zy5yZWFkX3NoaWZ0KDIsImkiKX07YnJlYWs7Y2FzZSA0OkU9e3Q6Im4iLHY6RXYoZyl9O2JyZWFrO2Nhc2UgNTpFPXt0OiJuIix2OmcucmVhZF9zaGlmdCg4LCJmIil9O2JyZWFrO2Nhc2UgNzpFPXt0OiJzIix2Omlbcz1nLnJlYWRfc2hpZnQoNCktMV19O2JyZWFrO2Nhc2UgODpFPXt0OiJuIix2OmcucmVhZF9zaGlmdCg4LCJmIil9LGcubCs9MixnLmwrPTQsaXNOYU4oRS52KSYmKEU9e3Q6ImUiLHY6MTV9KTticmVhaztkZWZhdWx0OnRocm93IlVucmVjb2duaXplZCBRUFcgY2VsbCB0eXBlICIrKDMxJlUpfS0xIT1BJiYoZFtBLTFdfHx7fSkueiYmKEUuej1kW0EtMV0ueik7dmFyIFM9MDtpZigzMiZVKXN3aXRjaCgzMSZVKXtjYXNlIDI6Y2FzZSA3OlM9Zy5yZWFkX3NoaWZ0KDIpO2JyZWFrO2Nhc2UgMzpTPWcucmVhZF9zaGlmdCgyLCJpIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyJVbnN1cHBvcnRlZCBkZWx0YSBmb3IgUVBXIGNlbGwgdHlwZSAiKygzMSZVKX1pZihuLnNoZWV0U3R1YnN8fCJ6IiE9RS50KXt2YXIgQz11YihFKTsibiI9PUUudCYmRS56JiZMbShFLnopJiZuLmNlbGxEYXRlcyYmKEMudj1yYihFLnYpLEMudD0ibnVtYmVyIj09dHlwZW9mIEMudj8ibiI6ImQiKSxudWxsIT1yWyIhZGF0YSJdPyhyWyIhZGF0YSJdW3VdfHwoclsiIWRhdGEiXVt1XT1bXSksclsiIWRhdGEiXVt1XVtsXT1DKTpyW18rbnYodSldPUN9Zm9yKCsrdSwtLWM7ay0tID4wJiZjPj0wOyl7aWYoMzImVSlzd2l0Y2goMzEmVSl7Y2FzZSAyOkU9e3Q6Im4iLHY6RS52K1MmNjU1MzV9O2JyZWFrO2Nhc2UgMzooRT17dDoibiIsdjpFLnYrUyY2NTUzNX0pLnY+MzI3NjcmJihFLnYtPTY1NTM2KTticmVhaztjYXNlIDc6RT17dDoicyIsdjppW3M9cytTPj4+MF19O2JyZWFrO2RlZmF1bHQ6dGhyb3ciQ2Fubm90IGFwcGx5IGRlbHRhIGZvciBRUFcgY2VsbCB0eXBlICIrKDMxJlUpfWVsc2Ugc3dpdGNoKDMxJlUpe2Nhc2UgMTpFPXt0OiJ6In07YnJlYWs7Y2FzZSAyOkU9e3Q6Im4iLHY6Zy5yZWFkX3NoaWZ0KDIpfTticmVhaztjYXNlIDc6RT17dDoicyIsdjppW3M9Zy5yZWFkX3NoaWZ0KDQpLTFdfTticmVhaztkZWZhdWx0OnRocm93IkNhbm5vdCBhcHBseSByZXBlYXQgZm9yIFFQVyBjZWxsIHR5cGUgIisoMzEmVSl9KG4uc2hlZXRTdHVic3x8InoiIT1FLnQpJiYobnVsbCE9clsiIWRhdGEiXT8oclsiIWRhdGEiXVt1XXx8KHJbIiFkYXRhIl1bdV09W10pLHJbIiFkYXRhIl1bdV1bbF09RSk6cltfK252KHUpXT1FKSwrK3UsLS1jfX1icmVhaztjYXNlIDMwNzQ6bD1nLnJlYWRfc2hpZnQoMiksdT1nLnJlYWRfc2hpZnQoNCk7dmFyIEY9RChnKTtudWxsIT1yWyIhZGF0YSJdPyhyWyIhZGF0YSJdW3VdfHwoclsiIWRhdGEiXVt1XT1bXSksclsiIWRhdGEiXVt1XVtsXT17dDoicyIsdjpGfSk6cltpdihsKStudih1KV09e3Q6InMiLHY6Rn19ZS5sKz1wfXJldHVybiBmfShuLHIpO2lmKDA9PW5bMl0mJig4PT1uWzNdfHw5PT1uWzNdKSYmbi5sZW5ndGg+PTE2JiY1PT1uWzE0XSYmMTA4PT09blsxNV0pdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBXb3JrcyAzIGZvciBNYWMgZmlsZSIpO2lmKDI9PW5bMl0paS5FbnVtPXksZShuLChmdW5jdGlvbihlLG4scil7c3dpdGNoKHIpe2Nhc2UgMDppLnZlcnM9ZSxlPj00MDk2JiYoaS5xcHJvPSEwKTticmVhaztjYXNlIDI1NTppLnZlcnM9ZSxpLndvcmtzPSEwO2JyZWFrO2Nhc2UgNjpoPWU7YnJlYWs7Y2FzZSAyMDQ6ZSYmKGM9ZSk7YnJlYWs7Y2FzZSAyMjI6Yz1lO2JyZWFrO2Nhc2UgMTU6Y2FzZSA1MTooIWkucXBybyYmIWkud29ya3N8fDUxPT1yKSYmZVsxXS52LmNoYXJDb2RlQXQoMCk8NDgmJihlWzFdLnY9ZVsxXS52LnNsaWNlKDEpKSwoaS53b3Jrc3x8aS53b3JrczIpJiYoZVsxXS52PWVbMV0udi5yZXBsYWNlKC9cclxuL2csIlxuIikpO2Nhc2UgMTM6Y2FzZSAxNDpjYXNlIDE2OjExMj09KDExMiZlWzJdKSYmKDE1JmVbMl0pPjEmJigxNSZlWzJdKTwxNSYmKGVbMV0uej1pLmRhdGVORnx8dFsoMTUmZVsyXSktMV18fGdtWzE0XSxpLmNlbGxEYXRlcyYmKGVbMV0udj1yYihlWzFdLnYpLGVbMV0udD0ibnVtYmVyIj09dHlwZW9mIGVbMV0udj8ibiI6ImQiKSksaS5xcHJvJiZlWzNdPnMmJihhWyIhcmVmIl09c3YoaCksbFtvXT1hLHUucHVzaChvKSxhPXt9LGkuZGVuc2UmJihkPWFbIiFkYXRhIl09W10pLGg9e3M6e3I6MCxjOjB9LGU6e3I6MCxjOjB9fSxzPWVbM10sbz1jfHwiU2hlZXQiKyhzKzEpLGM9IiIpO3ZhciBmPWkuZGVuc2U/KGRbZVswXS5yXXx8W10pW2VbMF0uY106YVtvdihlWzBdKV07aWYoZil7Zi50PWVbMV0udCxmLnY9ZVsxXS52LG51bGwhPWVbMV0ueiYmKGYuej1lWzFdLnopLG51bGwhPWVbMV0uZiYmKGYuZj1lWzFdLmYpLGc9ZjticmVha31pLmRlbnNlPyhkW2VbMF0ucl18fChkW2VbMF0ucl09W10pLGRbZVswXS5yXVtlWzBdLmNdPWVbMV0pOmFbb3YoZVswXSldPWVbMV0sZz1lWzFdO2JyZWFrO2Nhc2UgMjE1MDk6aS53b3JrczI9ITA7YnJlYWs7Y2FzZSAyMTUwNjo1MjgxPT1lJiYoZy56PSJoaDptbTpzcyIsaS5jZWxsRGF0ZXMmJiJuIj09Zy50JiYoZy52PXJiKGcudiksZy50PSJudW1iZXIiPT10eXBlb2YgZy52PyJuIjoiZCIpKX19KSxpKTtlbHNle2lmKDI2IT1uWzJdJiYxNCE9blsyXSl0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCBMT1RVUyBCT0YgIituWzJdKTtpLkVudW09diwxND09blsyXSYmKGkucXBybz0hMCxuLmw9MCksZShuLChmdW5jdGlvbihlLHQsbil7c3dpdGNoKG4pe2Nhc2UgMjA0Om89ZTticmVhaztjYXNlIDIyOmVbMV0udi5jaGFyQ29kZUF0KDApPDQ4JiYoZVsxXS52PWVbMV0udi5zbGljZSgxKSksZVsxXS52PWVbMV0udi5yZXBsYWNlKC9ceDBGLi9nLChmdW5jdGlvbihlKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlLmNoYXJDb2RlQXQoMSktMzIpfSkpLnJlcGxhY2UoL1xyXG4vZywiXG4iKTtjYXNlIDIzOmNhc2UgMjQ6Y2FzZSAyNTpjYXNlIDM3OmNhc2UgMzk6Y2FzZSA0MDppZihlWzNdPnMmJihhWyIhcmVmIl09c3YoaCksbFtvXT1hLHUucHVzaChvKSxhPXt9LGkuZGVuc2UmJihkPWFbIiFkYXRhIl09W10pLGg9e3M6e3I6MCxjOjB9LGU6e3I6MCxjOjB9fSxzPWVbM10sbz0iU2hlZXQiKyhzKzEpKSxwPjAmJmVbMF0ucj49cClicmVhaztpLmRlbnNlPyhkW2VbMF0ucl18fChkW2VbMF0ucl09W10pLGRbZVswXS5yXVtlWzBdLmNdPWVbMV0pOmFbb3YoZVswXSldPWVbMV0saC5lLmM8ZVswXS5jJiYoaC5lLmM9ZVswXS5jKSxoLmUucjxlWzBdLnImJihoLmUucj1lWzBdLnIpO2JyZWFrO2Nhc2UgMjc6ZVsxNGUzXSYmKGZbZVsxNGUzXVswXV09ZVsxNGUzXVsxXSk7YnJlYWs7Y2FzZSAxNTM3OmZbZVswXV09ZVsxXSxlWzBdPT1zJiYobz1lWzFdKX19KSxpKX1pZihhWyIhcmVmIl09c3YoaCksbFtjfHxvXT1hLHUucHVzaChjfHxvKSwhZi5sZW5ndGgpcmV0dXJue1NoZWV0TmFtZXM6dSxTaGVldHM6bH07Zm9yKHZhciBtPXt9LGI9W10sVD0wO1Q8Zi5sZW5ndGg7KytUKWxbdVtUXV0/KGIucHVzaChmW1RdfHx1W1RdKSxtW2ZbVF1dPWxbZltUXV18fGxbdVtUXV0pOihiLnB1c2goZltUXSksbVtmW1RdXT17IiFyZWYiOiJBMSJ9KTtyZXR1cm57U2hlZXROYW1lczpiLFNoZWV0czptfX1mdW5jdGlvbiByKGUsdCxuKXt2YXIgcj1be2M6MCxyOjB9LHt0OiJuIix2OjB9LDAsMF07cmV0dXJuIG4ucXBybyYmMjA3NjghPW4udmVycz8oclswXS5jPWUucmVhZF9zaGlmdCgxKSxyWzNdPWUucmVhZF9zaGlmdCgxKSxyWzBdLnI9ZS5yZWFkX3NoaWZ0KDIpLGUubCs9Mik6bi53b3Jrcz8oclswXS5jPWUucmVhZF9zaGlmdCgyKSxyWzBdLnI9ZS5yZWFkX3NoaWZ0KDIpLHJbMl09ZS5yZWFkX3NoaWZ0KDIpKTooclsyXT1lLnJlYWRfc2hpZnQoMSksclswXS5jPWUucmVhZF9zaGlmdCgyKSxyWzBdLnI9ZS5yZWFkX3NoaWZ0KDIpKSxyfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUueiYmTG0oZS56KT8yNDB8KHQuaW5kZXhPZihlLnopKzF8fDIpOjI1NX1mdW5jdGlvbiBhKGUsdCxuKXt2YXIgcj0keSg3K24ubGVuZ3RoKTtyLndyaXRlX3NoaWZ0KDEsMjU1KSxyLndyaXRlX3NoaWZ0KDIsdCksci53cml0ZV9zaGlmdCgyLGUpLHIud3JpdGVfc2hpZnQoMSwzOSk7Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDsrK2kpe3ZhciBhPW4uY2hhckNvZGVBdChpKTtyLndyaXRlX3NoaWZ0KDEsYT49MTI4Pzk1OmEpfXJldHVybiByLndyaXRlX3NoaWZ0KDEsMCkscn1mdW5jdGlvbiBvKGUsdCxuKXt2YXIgcj0keSg3KTtyZXR1cm4gci53cml0ZV9zaGlmdCgxLGkobikpLHIud3JpdGVfc2hpZnQoMix0KSxyLndyaXRlX3NoaWZ0KDIsZSksci53cml0ZV9zaGlmdCgyLG4udiwiaSIpLHJ9ZnVuY3Rpb24gYyhlLHQsbil7dmFyIHI9JHkoMTMpO3JldHVybiByLndyaXRlX3NoaWZ0KDEsaShuKSksci53cml0ZV9zaGlmdCgyLHQpLHIud3JpdGVfc2hpZnQoMixlKSxyLndyaXRlX3NoaWZ0KDgsbi52LCJmIikscn1mdW5jdGlvbiBzKGUsdCxuKXt2YXIgcj0zMjc2OCZ0O3JldHVybiB0PShyP2U6MCkrKCh0Jj0tMzI3NjkpPj04MTkyP3QtMTYzODQ6dCksKHI/IiI6IiQiKSsobj9pdih0KTpudih0KSl9dmFyIGw9ezMxOlsiTkEiLDBdLDMzOlsiQUJTIiwxXSwzNDpbIlRSVU5DIiwxXSwzNTpbIlNRUlQiLDFdLDM2OlsiTE9HIiwxXSwzNzpbIkxOIiwxXSwzODpbIlBJIiwwXSwzOTpbIlNJTiIsMV0sNDA6WyJDT1MiLDFdLDQxOlsiVEFOIiwxXSw0MjpbIkFUQU4yIiwyXSw0MzpbIkFUQU4iLDFdLDQ0OlsiQVNJTiIsMV0sNDU6WyJBQ09TIiwxXSw0NjpbIkVYUCIsMV0sNDc6WyJNT0QiLDJdLDQ5OlsiSVNOQSIsMV0sNTA6WyJJU0VSUiIsMV0sNTE6WyJGQUxTRSIsMF0sNTI6WyJUUlVFIiwwXSw1MzpbIlJBTkQiLDBdLDU0OlsiREFURSIsM10sNjM6WyJST1VORCIsMl0sNjQ6WyJUSU1FIiwzXSw2ODpbIklTTlVNQkVSIiwxXSw2OTpbIklTVEVYVCIsMV0sNzA6WyJMRU4iLDFdLDcxOlsiVkFMVUUiLDFdLDczOlsiTUlEIiwzXSw3NDpbIkNIQVIiLDFdLDgwOlsiU1VNIiw2OV0sODE6WyJBVkVSQUdFQSIsNjldLDgyOlsiQ09VTlRBIiw2OV0sODM6WyJNSU5BIiw2OV0sODQ6WyJNQVhBIiw2OV0sMTAyOlsiVVBQRVIiLDFdLDEwMzpbIkxPV0VSIiwxXSwxMDc6WyJQUk9QRVIiLDFdLDEwOTpbIlRSSU0iLDFdLDExMTpbIlQiLDFdfSx1PVsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiKyIsIi0iLCIqIiwiLyIsIl4iLCI9IiwiPD4iLCI8PSIsIj49IiwiPCIsIj4iLCIiLCIiLCIiLCIiLCImIiwiIiwiIiwiIiwiIiwiIiwiIiwiIl07ZnVuY3Rpb24gZihlKXt2YXIgdD1be2M6MCxyOjB9LHt0OiJuIix2OjB9LDBdO3JldHVybiB0WzBdLnI9ZS5yZWFkX3NoaWZ0KDIpLHRbM109ZVtlLmwrK10sdFswXS5jPWVbZS5sKytdLHR9ZnVuY3Rpb24gZChlLHQsbixyKXt2YXIgaT0keSg2K3IubGVuZ3RoKTtpLndyaXRlX3NoaWZ0KDIsZSksaS53cml0ZV9zaGlmdCgxLG4pLGkud3JpdGVfc2hpZnQoMSx0KSxpLndyaXRlX3NoaWZ0KDEsMzkpO2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7KythKXt2YXIgbz1yLmNoYXJDb2RlQXQoYSk7aS53cml0ZV9zaGlmdCgxLG8+PTEyOD85NTpvKX1yZXR1cm4gaS53cml0ZV9zaGlmdCgxLDApLGl9ZnVuY3Rpb24gaChlLHQpe3ZhciBuPWYoZSkscj1lLnJlYWRfc2hpZnQoNCksaT1lLnJlYWRfc2hpZnQoNCksYT1lLnJlYWRfc2hpZnQoMik7aWYoNjU1MzU9PWEpcmV0dXJuIDA9PT1yJiYzMjIxMjI1NDcyPT09aT8oblsxXS50PSJlIixuWzFdLnY9MTUpOjA9PT1yJiYzNDg5NjYwOTI4PT09aT8oblsxXS50PSJlIixuWzFdLnY9NDIpOm5bMV0udj0wLG47dmFyIG89MzI3NjgmYTtyZXR1cm4gYT0oMzI3NjcmYSktMTY0NDYsblsxXS52PSgxLTIqbykqKGkqTWF0aC5wb3coMixhKzMyKStyKk1hdGgucG93KDIsYSkpLG59ZnVuY3Rpb24gcChlLHQsbixyKXt2YXIgaT0keSgxNCk7aWYoaS53cml0ZV9zaGlmdCgyLGUpLGkud3JpdGVfc2hpZnQoMSxuKSxpLndyaXRlX3NoaWZ0KDEsdCksMD09cilyZXR1cm4gaS53cml0ZV9zaGlmdCg0LDApLGkud3JpdGVfc2hpZnQoNCwwKSxpLndyaXRlX3NoaWZ0KDIsNjU1MzUpLGk7dmFyIGEsbz0wLGM9MCxzPTA7cmV0dXJuIHI8MCYmKG89MSxyPS1yKSxjPTB8TWF0aC5sb2cyKHIpLDA9PSgyMTQ3NDgzNjQ4JihzPShyLz1NYXRoLnBvdygyLGMtMzEpKT4+PjApKSYmKCsrYyxzPShyLz0yKT4+PjApLHItPXMsc3w9MjE0NzQ4MzY0OCxzPj4+PTAsYT0ocio9TWF0aC5wb3coMiwzMikpPj4+MCxpLndyaXRlX3NoaWZ0KDQsYSksaS53cml0ZV9zaGlmdCg0LHMpLGMrPTE2MzgzKyhvPzMyNzY4OjApLGkud3JpdGVfc2hpZnQoMixjKSxpfWZ1bmN0aW9uIGcoZSx0KXt2YXIgbj1mKGUpLHI9ZS5yZWFkX3NoaWZ0KDgsImYiKTtyZXR1cm4gblsxXS52PXIsbn1mdW5jdGlvbiBtKGUsdCl7cmV0dXJuIDA9PWVbZS5sK3QtMV0/ZS5yZWFkX3NoaWZ0KHQsImNzdHIiKToiIn1mdW5jdGlvbiBiKGUsdCl7dmFyIG49JHkoNStlLmxlbmd0aCk7bi53cml0ZV9zaGlmdCgyLDE0ZTMpLG4ud3JpdGVfc2hpZnQoMix0KTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoOysrcil7dmFyIGk9ZS5jaGFyQ29kZUF0KHIpO25bbi5sKytdPWk+MTI3Pzk1Oml9cmV0dXJuIG5bbi5sKytdPTAsbn12YXIgeT17MDp7bjoiQk9GIixmOnl4fSwxOntuOiJFT0YifSwyOntuOiJDQUxDTU9ERSJ9LDM6e246IkNBTENPUkRFUiJ9LDQ6e246IlNQTElUIn0sNTp7bjoiU1lOQyJ9LDY6e246IlJBTkdFIixmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17czp7YzowLHI6MH0sZTp7YzowLHI6MH19O3JldHVybiA4PT10JiZuLnFwcm8/KHIucy5jPWUucmVhZF9zaGlmdCgxKSxlLmwrKyxyLnMucj1lLnJlYWRfc2hpZnQoMiksci5lLmM9ZS5yZWFkX3NoaWZ0KDEpLGUubCsrLHIuZS5yPWUucmVhZF9zaGlmdCgyKSxyKTooci5zLmM9ZS5yZWFkX3NoaWZ0KDIpLHIucy5yPWUucmVhZF9zaGlmdCgyKSwxMj09dCYmbi5xcHJvJiYoZS5sKz0yKSxyLmUuYz1lLnJlYWRfc2hpZnQoMiksci5lLnI9ZS5yZWFkX3NoaWZ0KDIpLDEyPT10JiZuLnFwcm8mJihlLmwrPTIpLDY1NTM1PT1yLnMuYyYmKHIucy5jPXIuZS5jPXIucy5yPXIuZS5yPTApLHIpfX0sNzp7bjoiV0lORE9XMSJ9LDg6e246IkNPTFcxIn0sOTp7bjoiV0lOVFdPIn0sMTA6e246IkNPTFcyIn0sMTE6e246Ik5BTUUifSwxMjp7bjoiQkxBTksifSwxMzp7bjoiSU5URUdFUiIsZjpmdW5jdGlvbihlLHQsbil7dmFyIGk9cihlLDAsbik7cmV0dXJuIGlbMV0udj1lLnJlYWRfc2hpZnQoMiwiaSIpLGl9fSwxNDp7bjoiTlVNQkVSIixmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1yKGUsMCxuKTtyZXR1cm4gaVsxXS52PWUucmVhZF9zaGlmdCg4LCJmIiksaX19LDE1OntuOiJMQUJFTCIsZjpmdW5jdGlvbihlLHQsbil7dmFyIGk9ZS5sK3QsYT1yKGUsMCxuKTtpZihhWzFdLnQ9InMiLDIwNzY4PT0oNjU1MzQmbi52ZXJzKSl7ZS5sKys7dmFyIG89ZS5yZWFkX3NoaWZ0KDEpO3JldHVybiBhWzFdLnY9ZS5yZWFkX3NoaWZ0KG8sInV0ZjgiKSxhfXJldHVybiBuLnFwcm8mJmUubCsrLGFbMV0udj1lLnJlYWRfc2hpZnQoaS1lLmwsImNzdHIiKSxhfX0sMTY6e246IkZPUk1VTEEiLGY6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPWUubCt0LGE9cihlLDAsbik7aWYoYVsxXS52PWUucmVhZF9zaGlmdCg4LCJmIiksbi5xcHJvKWUubD1pO2Vsc2V7dmFyIG89ZS5yZWFkX3NoaWZ0KDIpOyFmdW5jdGlvbihlLHQpe0d5KGUsMCk7dmFyIG49W10scj0wLGk9IiIsYT0iIixvPSIiLGM9IiI7Zm9yKDtlLmw8ZS5sZW5ndGg7KXt2YXIgZj1lW2UubCsrXTtzd2l0Y2goZil7Y2FzZSAwOm4ucHVzaChlLnJlYWRfc2hpZnQoOCwiZiIpKTticmVhaztjYXNlIDE6YT1zKHRbMF0uYyxlLnJlYWRfc2hpZnQoMiksITApLGk9cyh0WzBdLnIsZS5yZWFkX3NoaWZ0KDIpLCExKSxuLnB1c2goYStpKTticmVhaztjYXNlIDI6dmFyIGQ9cyh0WzBdLmMsZS5yZWFkX3NoaWZ0KDIpLCEwKSxoPXModFswXS5yLGUucmVhZF9zaGlmdCgyKSwhMSk7YT1zKHRbMF0uYyxlLnJlYWRfc2hpZnQoMiksITApLGk9cyh0WzBdLnIsZS5yZWFkX3NoaWZ0KDIpLCExKSxuLnB1c2goZCtoKyI6IithK2kpO2JyZWFrO2Nhc2UgMzppZihlLmw8ZS5sZW5ndGgpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiV0sxIHByZW1hdHVyZSBmb3JtdWxhIGVuZCIpO2JyZWFrO2Nhc2UgNDpuLnB1c2goIigiK24ucG9wKCkrIikiKTticmVhaztjYXNlIDU6bi5wdXNoKGUucmVhZF9zaGlmdCgyKSk7YnJlYWs7Y2FzZSA2OmZvcih2YXIgcD0iIjtmPWVbZS5sKytdOylwKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGYpO24ucHVzaCgnIicrcC5yZXBsYWNlKC8iL2csJyIiJykrJyInKTticmVhaztjYXNlIDg6bi5wdXNoKCItIituLnBvcCgpKTticmVhaztjYXNlIDIzOm4ucHVzaCgiKyIrbi5wb3AoKSk7YnJlYWs7Y2FzZSAyMjpuLnB1c2goIk5PVCgiK24ucG9wKCkrIikiKTticmVhaztjYXNlIDIwOmNhc2UgMjE6Yz1uLnBvcCgpLG89bi5wb3AoKSxuLnB1c2goWyJBTkQiLCJPUiJdW2YtMjBdKyIoIitvKyIsIitjKyIpIik7YnJlYWs7ZGVmYXVsdDppZihmPDMyJiZ1W2ZdKWM9bi5wb3AoKSxvPW4ucG9wKCksbi5wdXNoKG8rdVtmXStjKTtlbHNle2lmKCFsW2ZdKXJldHVybiBmPD03P2NvbnNvbGUuZXJyb3IoIldLMSBpbnZhbGlkIG9wY29kZSAiK2YudG9TdHJpbmcoMTYpKTpmPD0yND9jb25zb2xlLmVycm9yKCJXSzEgdW5zdXBwb3J0ZWQgb3AgIitmLnRvU3RyaW5nKDE2KSk6Zjw9MzA/Y29uc29sZS5lcnJvcigiV0sxIGludmFsaWQgb3Bjb2RlICIrZi50b1N0cmluZygxNikpOmY8PTExNT9jb25zb2xlLmVycm9yKCJXSzEgdW5zdXBwb3J0ZWQgZnVuY3Rpb24gb3Bjb2RlICIrZi50b1N0cmluZygxNikpOmNvbnNvbGUuZXJyb3IoIldLMSB1bnJlY29nbml6ZWQgb3Bjb2RlICIrZi50b1N0cmluZygxNikpO2lmKDY5PT0ocj1sW2ZdWzFdKSYmKHI9ZVtlLmwrK10pLHI+bi5sZW5ndGgpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiV0sxIGJhZCBmb3JtdWxhIHBhcnNlIDB4IitmLnRvU3RyaW5nKDE2KSsiOnwiK24uam9pbigifCIpKyJ8Iik7dmFyIGc9bi5zbGljZSgtcik7bi5sZW5ndGgtPXIsbi5wdXNoKGxbZl1bMF0rIigiK2cuam9pbigiLCIpKyIpIil9fX0xPT1uLmxlbmd0aD90WzFdLmY9IiIrblswXTpjb25zb2xlLmVycm9yKCJXSzEgYmFkIGZvcm11bGEgcGFyc2UgfCIrbi5qb2luKCJ8IikrInwiKX0oZS5zbGljZShlLmwsZS5sK28pLGEpLGUubCs9b31yZXR1cm4gYX19LDI0OntuOiJUQUJMRSJ9LDI1OntuOiJPUkFOR0UifSwyNjp7bjoiUFJBTkdFIn0sMjc6e246IlNSQU5HRSJ9LDI4OntuOiJGUkFOR0UifSwyOTp7bjoiS1JBTkdFMSJ9LDMyOntuOiJIUkFOR0UifSwzNTp7bjoiS1JBTkdFMiJ9LDM2OntuOiJQUk9URUMifSwzNzp7bjoiRk9PVEVSIn0sMzg6e246IkhFQURFUiJ9LDM5OntuOiJTRVRVUCJ9LDQwOntuOiJNQVJHSU5TIn0sNDE6e246IkxBQkVMRk1UIn0sNDI6e246IlRJVExFUyJ9LDQzOntuOiJTSEVFVEpTIn0sNDU6e246IkdSQVBIIn0sNDY6e246Ik5HUkFQSCJ9LDQ3OntuOiJDQUxDQ09VTlQifSw0ODp7bjoiVU5GT1JNQVRURUQifSw0OTp7bjoiQ1VSU09SVzEyIn0sNTA6e246IldJTkRPVyJ9LDUxOntuOiJTVFJJTkciLGY6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPWUubCt0LGE9cihlLDAsbik7aWYoYVsxXS50PSJzIiwyMDc2OD09bi52ZXJzKXt2YXIgbz1lLnJlYWRfc2hpZnQoMSk7cmV0dXJuIGFbMV0udj1lLnJlYWRfc2hpZnQobywidXRmOCIpLGF9cmV0dXJuIGFbMV0udj1lLnJlYWRfc2hpZnQoaS1lLmwsImNzdHIiKSxhfX0sNTU6e246IlBBU1NXT1JEIn0sNTY6e246IkxPQ0tFRCJ9LDYwOntuOiJRVUVSWSJ9LDYxOntuOiJRVUVSWU5BTUUifSw2Mjp7bjoiUFJJTlQifSw2Mzp7bjoiUFJJTlROQU1FIn0sNjQ6e246IkdSQVBIMiJ9LDY1OntuOiJHUkFQSE5BTUUifSw2Njp7bjoiWk9PTSJ9LDY3OntuOiJTWU1TUExJVCJ9LDY4OntuOiJOU1JPV1MifSw2OTp7bjoiTlNDT0xTIn0sNzA6e246IlJVTEVSIn0sNzE6e246Ik5OQU1FIn0sNzI6e246IkFDT01NIn0sNzM6e246IkFNQUNSTyJ9LDc0OntuOiJQQVJTRSJ9LDEwMjp7bjoiUFJBTkdFUz8/In0sMTAzOntuOiJSUkFOR0VTPz8ifSwxMDQ6e246IkZOQU1FPz8ifSwxMDU6e246Ik1SQU5HRVM/PyJ9LDIwNDp7bjoiU0hFRVROQU1FQ1MiLGY6bX0sMjIyOntuOiJTSEVFVE5BTUVMUCIsZjpmdW5jdGlvbihlLHQpe3ZhciBuPWVbZS5sKytdO24+dC0xJiYobj10LTEpO2Zvcih2YXIgcj0iIjtyLmxlbmd0aDxuOylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbZS5sKytdKTtyZXR1cm4gcn19LDI1NTp7bjoiQk9GIixmOnl4fSwyMTUwNjp7bjoiV0tTTkYiLGY6eXh9LDY1NTM1OntuOiIifX0sdj17MDp7bjoiQk9GIn0sMTp7bjoiRU9GIn0sMjp7bjoiUEFTU1dPUkQifSwzOntuOiJDQUxDU0VUIn0sNDp7bjoiV0lORE9XU0VUIn0sNTp7bjoiU0hFRVRDRUxMUFRSIn0sNjp7bjoiU0hFRVRMQVlPVVQifSw3OntuOiJDT0xVTU5XSURUSCJ9LDg6e246IkhJRERFTkNPTFVNTiJ9LDk6e246IlVTRVJSQU5HRSJ9LDEwOntuOiJTWVNURU1SQU5HRSJ9LDExOntuOiJaRVJPRk9SQ0UifSwxMjp7bjoiU09SVEtFWURJUiJ9LDEzOntuOiJGSUxFU0VBTCJ9LDE0OntuOiJEQVRBRklMTE5VTVMifSwxNTp7bjoiUFJJTlRNQUlOIn0sMTY6e246IlBSSU5UU1RSSU5HIn0sMTc6e246IkdSQVBITUFJTiJ9LDE4OntuOiJHUkFQSFNUUklORyJ9LDE5OntuOiI/PyJ9LDIwOntuOiJFUlJDRUxMIn0sMjE6e246Ik5BQ0VMTCJ9LDIyOntuOiJMQUJFTDE2IixmOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZihlKTtyZXR1cm4gblsxXS50PSJzIixuWzFdLnY9ZS5yZWFkX3NoaWZ0KHQtNCwiY3N0ciIpLG59fSwyMzp7bjoiTlVNQkVSMTciLGY6aH0sMjQ6e246Ik5VTUJFUjE4IixmOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZihlKTtuWzFdLnY9ZS5yZWFkX3NoaWZ0KDIpO3ZhciByPW5bMV0udj4+MTtpZigxJm5bMV0udilzd2l0Y2goNyZyKXtjYXNlIDA6cj01ZTMqKHI+PjMpO2JyZWFrO2Nhc2UgMTpyPTUwMCoocj4+Myk7YnJlYWs7Y2FzZSAyOnI9KHI+PjMpLzIwO2JyZWFrO2Nhc2UgMzpyPShyPj4zKS8yMDA7YnJlYWs7Y2FzZSA0OnI9KHI+PjMpLzJlMzticmVhaztjYXNlIDU6cj0ocj4+MykvMmU0O2JyZWFrO2Nhc2UgNjpyPShyPj4zKS8xNjticmVhaztjYXNlIDc6cj0ocj4+MykvNjR9cmV0dXJuIG5bMV0udj1yLG59fSwyNTp7bjoiRk9STVVMQTE5IixmOmZ1bmN0aW9uKGUsdCl7dmFyIG49aChlKTtyZXR1cm4gZS5sKz10LTE0LG59fSwyNjp7bjoiRk9STVVMQTFBIn0sMjc6e246IlhGT1JNQVQiLGY6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49e30scj1lLmwrdDtlLmw8cjspe3ZhciBpPWUucmVhZF9zaGlmdCgyKTtpZigxNGUzPT1pKXtmb3IobltpXT1bMCwiIl0sbltpXVswXT1lLnJlYWRfc2hpZnQoMik7ZVtlLmxdOyluW2ldWzFdKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbZS5sXSksZS5sKys7ZS5sKyt9fXJldHVybiBufX0sMjg6e246IkRUTEFCRUxNSVNDIn0sMjk6e246IkRUTEFCRUxDRUxMIn0sMzA6e246IkdSQVBIV0lORE9XIn0sMzE6e246IkNQQSJ9LDMyOntuOiJMUExBVVRPIn0sMzM6e246IlFVRVJZIn0sMzQ6e246IkhJRERFTlNIRUVUIn0sMzU6e246Ij8/In0sMzc6e246Ik5VTUJFUjI1IixmOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZihlKSxyPWUucmVhZF9zaGlmdCg0KTtyZXR1cm4gblsxXS52PXI+PjYsbn19LDM4OntuOiI/PyJ9LDM5OntuOiJOVU1CRVIyNyIsZjpnfSw0MDp7bjoiRk9STVVMQTI4IixmOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZyhlKTtyZXR1cm4gZS5sKz10LTEyLG59fSwxNDI6e246Ij8/In0sMTQ3OntuOiI/PyJ9LDE1MDp7bjoiPz8ifSwxNTE6e246Ij8/In0sMTUyOntuOiI/PyJ9LDE1Mzp7bjoiPz8ifSwxNTQ6e246Ij8/In0sMTU1OntuOiI/PyJ9LDE1Njp7bjoiPz8ifSwxNjM6e246Ij8/In0sMTc0OntuOiI/PyJ9LDE3NTp7bjoiPz8ifSwxNzY6e246Ij8/In0sMTc3OntuOiI/PyJ9LDE4NDp7bjoiPz8ifSwxODU6e246Ij8/In0sMTg2OntuOiI/PyJ9LDE4Nzp7bjoiPz8ifSwxODg6e246Ij8/In0sMTk1OntuOiI/PyJ9LDIwMTp7bjoiPz8ifSwyMDQ6e246IlNIRUVUTkFNRUNTIixmOm19LDIwNTp7bjoiPz8ifSwyMDY6e246Ij8/In0sMjA3OntuOiI/PyJ9LDIwODp7bjoiPz8ifSwyNTY6e246Ij8/In0sMjU5OntuOiI/PyJ9LDI2MDp7bjoiPz8ifSwyNjE6e246Ij8/In0sMjYyOntuOiI/PyJ9LDI2Mzp7bjoiPz8ifSwyNjU6e246Ij8/In0sMjY2OntuOiI/PyJ9LDI2Nzp7bjoiPz8ifSwyNjg6e246Ij8/In0sMjcwOntuOiI/PyJ9LDI3MTp7bjoiPz8ifSwzODQ6e246Ij8/In0sMzg5OntuOiI/PyJ9LDM5MDp7bjoiPz8ifSwzOTM6e246Ij8/In0sMzk2OntuOiI/PyJ9LDUxMjp7bjoiPz8ifSw1MTQ6e246Ij8/In0sNTEzOntuOiI/PyJ9LDUxNjp7bjoiPz8ifSw1MTc6e246Ij8/In0sNjQwOntuOiI/PyJ9LDY0MTp7bjoiPz8ifSw2NDI6e246Ij8/In0sNjQzOntuOiI/PyJ9LDY0NDp7bjoiPz8ifSw2NDU6e246Ij8/In0sNjQ2OntuOiI/PyJ9LDY0Nzp7bjoiPz8ifSw2NDg6e246Ij8/In0sNjU4OntuOiI/PyJ9LDY1OTp7bjoiPz8ifSw2NjA6e246Ij8/In0sNjYxOntuOiI/PyJ9LDY2Mjp7bjoiPz8ifSw2NjU6e246Ij8/In0sNjY2OntuOiI/PyJ9LDc2ODp7bjoiPz8ifSw3NzI6e246Ij8/In0sMTUzNzp7bjoiU0hFRVRJTkZPUVAiLGY6ZnVuY3Rpb24oZSx0LG4pe2lmKG4ucXBybyYmISh0PDIxKSl7dmFyIHI9ZS5yZWFkX3NoaWZ0KDEpO3JldHVybiBlLmwrPTE3LGUubCs9MSxlLmwrPTIsW3IsZS5yZWFkX3NoaWZ0KHQtMjEsImNzdHIiKV19fX0sMTYwMDp7bjoiPz8ifSwxNjAyOntuOiI/PyJ9LDE3OTM6e246Ij8/In0sMTc5NDp7bjoiPz8ifSwxNzk1OntuOiI/PyJ9LDE3OTY6e246Ij8/In0sMTkyMDp7bjoiPz8ifSwyMDQ4OntuOiI/PyJ9LDIwNDk6e246Ij8/In0sMjA1Mjp7bjoiPz8ifSwyNjg4OntuOiI/PyJ9LDEwOTk4OntuOiI/PyJ9LDEyODQ5OntuOiI/PyJ9LDI4MjMzOntuOiI/PyJ9LDI4NDg0OntuOiI/PyJ9LDY1NTM1OntuOiIifX0seD17NToiZGQtbW1tLXl5Iiw2OiJkZC1tbW0iLDc6Im1tbS15eSIsODoibW0vZGQveXkiLDEwOiJoaDptbTpzcyBBTS9QTSIsMTE6ImhoOm1tIEFNL1BNIiwxNDoiZGQtbW1tLXl5eXkiLDE1OiJtbW0teXl5eSIsMzQ6IjAuMDAiLDUwOiIwLjAwO1tSZWRdMC4wMCIsNjY6IjAuMDA7KDAuMDApIiw4MjoiMC4wMDtbUmVkXSgwLjAwKSIsMTYyOiciJCIjLCMjMC4wMDtcXCgiJCIjLCMjMC4wMFxcKScsMjg4OiIwJSIsMzA0OiIwRSswMCIsMzIwOiIjID8vPyJ9O2Z1bmN0aW9uIEQoZSl7dmFyIHQ9ZS5yZWFkX3NoaWZ0KDIpLG49ZS5yZWFkX3NoaWZ0KDEpO2lmKDAhPW4pdGhyb3cidW5zdXBwb3J0ZWQgUVBXIHN0cmluZyB0eXBlICIrbi50b1N0cmluZygxNik7cmV0dXJuIGUucmVhZF9zaGlmdCh0LCJzYmNzLWNvbnQiKX1yZXR1cm57c2hlZXRfdG9fd2sxOmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8e307aWYoK24uY29kZXBhZ2U+PTAmJkJnKCtuLmNvZGVwYWdlKSwic3RyaW5nIj09bi50eXBlKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHdyaXRlIFdLMSB0byBKUyBzdHJpbmciKTt2YXIgcj1LeSgpO2lmKCFlWyIhcmVmIl0pdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZXhwb3J0IGVtcHR5IHNoZWV0IHRvIFdLMSIpO3ZhciBpLHMsbD1sdihlWyIhcmVmIl0pLHU9bnVsbCE9ZVsiIWRhdGEiXSxmPVtdO3BfKHIsMCwoaT0xMDMwLChzPSR5KDIpKS53cml0ZV9zaGlmdCgyLGkpLHMpKSxwXyhyLDYsZnVuY3Rpb24oZSl7dmFyIHQ9JHkoOCk7cmV0dXJuIHQud3JpdGVfc2hpZnQoMixlLnMuYyksdC53cml0ZV9zaGlmdCgyLGUucy5yKSx0LndyaXRlX3NoaWZ0KDIsZS5lLmMpLHQud3JpdGVfc2hpZnQoMixlLmUuciksdH0obCkpO2Zvcih2YXIgZD1NYXRoLm1pbihsLmUuciw4MTkxKSxoPWwucy5jO2g8PWwuZS5jOysraClmW2hdPWl2KGgpO2Zvcih2YXIgcD1sLnMucjtwPD1kOysrcCl7dmFyIGc9bnYocCk7Zm9yKGg9bC5zLmM7aDw9bC5lLmM7KytoKXt2YXIgbT11PyhlWyIhZGF0YSJdW3BdfHxbXSlbaF06ZVtmW2hdK2ddO2lmKG0mJiJ6IiE9bS50KXN3aXRjaChtLnQpe2Nhc2UibiI6KDB8bS52KT09bS52JiZtLnY+PS0zMjc2OCYmbS52PD0zMjc2Nz9wXyhyLDEzLG8ocCxoLG0pKTpwXyhyLDE0LGMocCxoLG0pKTticmVhaztjYXNlImQiOnZhciBiPW5iKG0udik7KDB8Yik9PWImJmI+PS0zMjc2OCYmYjw9MzI3Njc/cF8ociwxMyxvKHAsaCx7dDoibiIsdjpiLHo6bS56fHxnbVsxNF19KSk6cF8ociwxNCxjKHAsaCx7dDoibiIsdjpiLHo6bS56fHxnbVsxNF19KSk7YnJlYWs7ZGVmYXVsdDpwXyhyLDE1LGEocCxoLGZ2KG0pLnNsaWNlKDAsMjM5KSkpfX19cmV0dXJuIHBfKHIsMSksci5lbmQoKX0sYm9va190b193azM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10fHx7fTtpZigrbi5jb2RlcGFnZT49MCYmQmcoK24uY29kZXBhZ2UpLCJzdHJpbmciPT1uLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgd3JpdGUgV0szIHRvIEpTIHN0cmluZyIpO3ZhciByPUt5KCk7cF8ociwwLGZ1bmN0aW9uKGUpe3ZhciB0PSR5KDI2KTt0LndyaXRlX3NoaWZ0KDIsNDA5NiksdC53cml0ZV9zaGlmdCgyLDQpLHQud3JpdGVfc2hpZnQoNCwwKTtmb3IodmFyIG49MCxyPTAsaT0wLGE9MDthPGUuU2hlZXROYW1lcy5sZW5ndGg7KythKXt2YXIgbz1lLlNoZWV0TmFtZXNbYV0sYz1lLlNoZWV0c1tvXTtpZihjJiZjWyIhcmVmIl0peysraTt2YXIgcz1jdihjWyIhcmVmIl0pO248cy5lLnImJihuPXMuZS5yKSxyPHMuZS5jJiYocj1zLmUuYyl9fW4+ODE5MSYmKG49ODE5MSk7cmV0dXJuIHQud3JpdGVfc2hpZnQoMixuKSx0LndyaXRlX3NoaWZ0KDEsaSksdC53cml0ZV9zaGlmdCgxLHIpLHQud3JpdGVfc2hpZnQoMiwwKSx0LndyaXRlX3NoaWZ0KDIsMCksdC53cml0ZV9zaGlmdCgxLDEpLHQud3JpdGVfc2hpZnQoMSwyKSx0LndyaXRlX3NoaWZ0KDQsMCksdC53cml0ZV9zaGlmdCg0LDApLHR9KGUpKTtmb3IodmFyIGk9MCxhPTA7aTxlLlNoZWV0TmFtZXMubGVuZ3RoOysraSkoZS5TaGVldHNbZS5TaGVldE5hbWVzW2ldXXx8e30pWyIhcmVmIl0mJnBfKHIsMjcsYihlLlNoZWV0TmFtZXNbaV0sYSsrKSk7dmFyIG89MDtmb3IoaT0wO2k8ZS5TaGVldE5hbWVzLmxlbmd0aDsrK2kpe3ZhciBjPWUuU2hlZXRzW2UuU2hlZXROYW1lc1tpXV07aWYoYyYmY1siIXJlZiJdKXtmb3IodmFyIHM9bHYoY1siIXJlZiJdKSxsPW51bGwhPWNbIiFkYXRhIl0sdT1bXSxmPU1hdGgubWluKHMuZS5yLDgxOTEpLGg9cy5zLnI7aDw9ZjsrK2gpZm9yKHZhciBnPW52KGgpLG09cy5zLmM7bTw9cy5lLmM7KyttKXtoPT09cy5zLnImJih1W21dPWl2KG0pKTt2YXIgeT11W21dK2csdj1sPyhjWyIhZGF0YSJdW2hdfHxbXSlbbV06Y1t5XTtpZih2JiYieiIhPXYudClpZigibiI9PXYudClwXyhyLDIzLHAoaCxtLG8sdi52KSk7ZWxzZSBwXyhyLDIyLGQoaCxtLG8sZnYodikuc2xpY2UoMCwyMzkpKSl9KytvfX1yZXR1cm4gcF8ociwxKSxyLmVuZCgpfSx0b193b3JrYm9vazpmdW5jdGlvbihlLHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UiYmFzZTY0IjpyZXR1cm4gbihlbSgkZyhlKSksdCk7Y2FzZSJiaW5hcnkiOnJldHVybiBuKGVtKGUpLHQpO2Nhc2UiYnVmZmVyIjpjYXNlImFycmF5IjpyZXR1cm4gbihlLHQpfXRocm93IlVuc3VwcG9ydGVkIHR5cGUgIit0LnR5cGV9fX0oKTt2YXIgY0Q9ZnVuY3Rpb24oKXt2YXIgZT10eSgidCIpLHQ9dHkoInJQciIpO2Z1bmN0aW9uIG4obil7dmFyIHI9bi5tYXRjaChlKTtpZighcilyZXR1cm57dDoicyIsdjoiIn07dmFyIGk9e3Q6InMiLHY6SGIoclsxXSl9LGE9bi5tYXRjaCh0KTtyZXR1cm4gYSYmKGkucz1mdW5jdGlvbihlKXt2YXIgdD17fSxuPWUubWF0Y2goUGIpLHI9MCxpPSExO2lmKG4pZm9yKDtyIT1uLmxlbmd0aDsrK3Ipe3ZhciBhPUxiKG5bcl0pO3N3aXRjaChhWzBdLnJlcGxhY2UoL1x3KjovZywiIikpe2Nhc2UiPGNvbmRlbnNlIjpjYXNlIjxleHRlbmQiOmJyZWFrO2Nhc2UiPHNoYWRvdyI6aWYoIWEudmFsKWJyZWFrO2Nhc2UiPHNoYWRvdz4iOmNhc2UiPHNoYWRvdy8+Ijp0LnNoYWRvdz0xO2JyZWFrO2Nhc2UiPC9zaGFkb3c+IjpicmVhaztjYXNlIjxjaGFyc2V0IjppZigiMSI9PWEudmFsKWJyZWFrO3QuY3A9TmdbcGFyc2VJbnQoYS52YWwsMTApXTticmVhaztjYXNlIjxvdXRsaW5lIjppZighYS52YWwpYnJlYWs7Y2FzZSI8b3V0bGluZT4iOmNhc2UiPG91dGxpbmUvPiI6dC5vdXRsaW5lPTE7YnJlYWs7Y2FzZSI8L291dGxpbmU+IjpicmVhaztjYXNlIjxyRm9udCI6dC5uYW1lPWEudmFsO2JyZWFrO2Nhc2UiPHN6Ijp0LnN6PWEudmFsO2JyZWFrO2Nhc2UiPHN0cmlrZSI6aWYoIWEudmFsKWJyZWFrO2Nhc2UiPHN0cmlrZT4iOmNhc2UiPHN0cmlrZS8+Ijp0LnN0cmlrZT0xO2JyZWFrO2Nhc2UiPC9zdHJpa2U+IjpicmVhaztjYXNlIjx1IjppZighYS52YWwpYnJlYWs7c3dpdGNoKGEudmFsKXtjYXNlImRvdWJsZSI6dC51dmFsPSJkb3VibGUiO2JyZWFrO2Nhc2Uic2luZ2xlQWNjb3VudGluZyI6dC51dmFsPSJzaW5nbGUtYWNjb3VudGluZyI7YnJlYWs7Y2FzZSJkb3VibGVBY2NvdW50aW5nIjp0LnV2YWw9ImRvdWJsZS1hY2NvdW50aW5nIn1jYXNlIjx1PiI6Y2FzZSI8dS8+Ijp0LnU9MTticmVhaztjYXNlIjwvdT4iOmJyZWFrO2Nhc2UiPGIiOmlmKCIwIj09YS52YWwpYnJlYWs7Y2FzZSI8Yj4iOmNhc2UiPGIvPiI6dC5iPTE7YnJlYWs7Y2FzZSI8L2I+IjpicmVhaztjYXNlIjxpIjppZigiMCI9PWEudmFsKWJyZWFrO2Nhc2UiPGk+IjpjYXNlIjxpLz4iOnQuaT0xO2JyZWFrO2Nhc2UiPC9pPiI6YnJlYWs7Y2FzZSI8Y29sb3IiOmEucmdiJiYodC5jb2xvcj1hLnJnYi5zbGljZSgyLDgpKTticmVhaztjYXNlIjxjb2xvcj4iOmNhc2UiPGNvbG9yLz4iOmNhc2UiPC9jb2xvcj4iOmJyZWFrO2Nhc2UiPGZhbWlseSI6dC5mYW1pbHk9YS52YWw7YnJlYWs7Y2FzZSI8ZmFtaWx5PiI6Y2FzZSI8ZmFtaWx5Lz4iOmNhc2UiPC9mYW1pbHk+IjpicmVhaztjYXNlIjx2ZXJ0QWxpZ24iOnQudmFsaWduPWEudmFsO2JyZWFrO2Nhc2UiPHZlcnRBbGlnbj4iOmNhc2UiPHZlcnRBbGlnbi8+IjpjYXNlIjwvdmVydEFsaWduPiI6Y2FzZSI8c2NoZW1lIjpjYXNlIjxzY2hlbWU+IjpjYXNlIjxzY2hlbWUvPiI6Y2FzZSI8L3NjaGVtZT4iOmNhc2UiPGV4dExzdCI6Y2FzZSI8ZXh0THN0PiI6Y2FzZSI8L2V4dExzdD4iOmJyZWFrO2Nhc2UiPGV4dCI6aT0hMDticmVhaztjYXNlIjwvZXh0PiI6aT0hMTticmVhaztkZWZhdWx0OmlmKDQ3IT09YVswXS5jaGFyQ29kZUF0KDEpJiYhaSl0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCByaWNoIGZvcm1hdCAiK2FbMF0pfX1yZXR1cm4gdH0oYVsxXSkpLGl9dmFyIHI9LzwoPzpcdys6KT9yPi9nLGk9LzxcLyg/Olx3KzopP3I+LztyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShyLCIiKS5zcGxpdChpKS5tYXAobikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS52fSkpfX0oKSxzRD1mdW5jdGlvbigpe3ZhciBlPS8oXHJcbnxcbikvZztmdW5jdGlvbiB0KHQpe3ZhciBuPVtbXSx0LnYsW11dO3JldHVybiB0LnY/KHQucyYmZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdO2UudSYmci5wdXNoKCJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsiKSxlLnV2YWwmJnIucHVzaCgidGV4dC11bmRlcmxpbmUtc3R5bGU6IitlLnV2YWwrIjsiKSxlLnN6JiZyLnB1c2goImZvbnQtc2l6ZToiK2Uuc3orInB0OyIpLGUub3V0bGluZSYmci5wdXNoKCJ0ZXh0LWVmZmVjdDogb3V0bGluZTsiKSxlLnNoYWRvdyYmci5wdXNoKCJ0ZXh0LXNoYWRvdzogYXV0bzsiKSx0LnB1c2goJzxzcGFuIHN0eWxlPSInK3Iuam9pbigiIikrJyI+JyksZS5iJiYodC5wdXNoKCI8Yj4iKSxuLnB1c2goIjwvYj4iKSksZS5pJiYodC5wdXNoKCI8aT4iKSxuLnB1c2goIjwvaT4iKSksZS5zdHJpa2UmJih0LnB1c2goIjxzPiIpLG4ucHVzaCgiPC9zPiIpKTt2YXIgaT1lLnZhbGlnbnx8IiI7InN1cGVyc2NyaXB0Ij09aXx8InN1cGVyIj09aT9pPSJzdXAiOiJzdWJzY3JpcHQiPT1pJiYoaT0ic3ViIiksIiIhPWkmJih0LnB1c2goIjwiK2krIj4iKSxuLnB1c2goIjwvIitpKyI+IikpLG4ucHVzaCgiPC9zcGFuPiIpfSh0LnMsblswXSxuWzJdKSxuWzBdLmpvaW4oIiIpK25bMV0ucmVwbGFjZShlLCI8YnIvPiIpK25bMl0uam9pbigiIikpOiIifXJldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5tYXAodCkuam9pbigiIil9fSgpLGxEPS88KD86XHcrOik/dFtePl0qPihbXjxdKik8XC8oPzpcdys6KT90Pi9nLHVEPS88KD86XHcrOik/clxiW14+XSo+LyxmRD0vPCg/Olx3KzopP3JQaC4qPz4oW1xzXFNdKj8pPFwvKD86XHcrOik/clBoPi9nO2Z1bmN0aW9uIGREKGUsdCl7dmFyIG49IXR8fHQuY2VsbEhUTUwscj17fTtyZXR1cm4gZT8oZS5tYXRjaCgvXlxzKjwoPzpcdys6KT90W14+XSo+Lyk/KHIudD1IYihRYihlLnNsaWNlKGUuaW5kZXhPZigiPiIpKzEpLnNwbGl0KC88XC8oPzpcdys6KT90Pi8pWzBdfHwiIiksITApLHIucj1RYihlKSxuJiYoci5oPUdiKHIudCkpKTplLm1hdGNoKHVEKSYmKHIucj1RYihlKSxyLnQ9SGIoUWIoKGUucmVwbGFjZShmRCwiIikubWF0Y2gobEQpfHxbXSkuam9pbigiIikucmVwbGFjZShQYiwiIikpLCEwKSxuJiYoci5oPXNEKGNEKHIucikpKSkscik6e3Q6IiJ9fXZhciBoRD0vPCg/Olx3KzopP3NzdChbXj5dKik+KFtcc1xTXSopPFwvKD86XHcrOik/c3N0Pi8scEQ9LzwoPzpcdys6KT8oPzpzaXxzc3RJdGVtKT4vZyxnRD0vPFwvKD86XHcrOik/KD86c2l8c3N0SXRlbSk+LztmdW5jdGlvbiBtRChlKXtmb3IodmFyIHQ9W10sbj1lLnNwbGl0KCIiKSxyPTA7cjxuLmxlbmd0aDsrK3IpdFtyXT1uW3JdLmNoYXJDb2RlQXQoMCk7cmV0dXJuIHR9ZnVuY3Rpb24gYkQoZSx0KXt2YXIgbj17fTtyZXR1cm4gbi5NYWpvcj1lLnJlYWRfc2hpZnQoMiksbi5NaW5vcj1lLnJlYWRfc2hpZnQoMiksdD49NCYmKGUubCs9dC00KSxufWZ1bmN0aW9uIHlEKGUpe2Zvcih2YXIgdD1lLnJlYWRfc2hpZnQoNCksbj1lLmwrdC00LHI9e30saT1lLnJlYWRfc2hpZnQoNCksYT1bXTtpLS0gPjA7KWEucHVzaCh7dDplLnJlYWRfc2hpZnQoNCksdjplLnJlYWRfc2hpZnQoMCwibHBwNCIpfSk7aWYoci5uYW1lPWUucmVhZF9zaGlmdCgwLCJscHA0Iiksci5jb21wcz1hLGUubCE9bil0aHJvdyBuZXcgRXJyb3IoIkJhZCBEYXRhU3BhY2VNYXBFbnRyeTogIitlLmwrIiAhPSAiK24pO3JldHVybiByfWZ1bmN0aW9uIHZEKGUpe3ZhciB0PWZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBlLnJlYWRfc2hpZnQoNCksZS5sKz00LHQuaWQ9ZS5yZWFkX3NoaWZ0KDAsImxwcDQiKSx0Lm5hbWU9ZS5yZWFkX3NoaWZ0KDAsImxwcDQiKSx0LlI9YkQoZSw0KSx0LlU9YkQoZSw0KSx0Llc9YkQoZSw0KSx0fShlKTtpZih0LmVuYW1lPWUucmVhZF9zaGlmdCgwLCI4bHBwNCIpLHQuYmxrc3o9ZS5yZWFkX3NoaWZ0KDQpLHQuY21vZGU9ZS5yZWFkX3NoaWZ0KDQpLDQhPWUucmVhZF9zaGlmdCg0KSl0aHJvdyBuZXcgRXJyb3IoIkJhZCAhUHJpbWFyeSByZWNvcmQiKTtyZXR1cm4gdH1mdW5jdGlvbiB4RChlLHQpe3ZhciBuPWUubCt0LHI9e307ci5GbGFncz02MyZlLnJlYWRfc2hpZnQoNCksZS5sKz00LHIuQWxnSUQ9ZS5yZWFkX3NoaWZ0KDQpO3ZhciBpPSExO3N3aXRjaChyLkFsZ0lEKXtjYXNlIDI2MTI2OmNhc2UgMjYxMjc6Y2FzZSAyNjEyODppPTM2PT1yLkZsYWdzO2JyZWFrO2Nhc2UgMjY2MjU6aT00PT1yLkZsYWdzO2JyZWFrO2Nhc2UgMDppPTE2PT1yLkZsYWdzfHw0PT1yLkZsYWdzfHwzNj09ci5GbGFnczticmVhaztkZWZhdWx0OnRocm93IlVucmVjb2duaXplZCBlbmNyeXB0aW9uIGFsZ29yaXRobTogIityLkFsZ0lEfWlmKCFpKXRocm93IG5ldyBFcnJvcigiRW5jcnlwdGlvbiBGbGFncy9BbGdJRCBtaXNtYXRjaCIpO3JldHVybiByLkFsZ0lESGFzaD1lLnJlYWRfc2hpZnQoNCksci5LZXlTaXplPWUucmVhZF9zaGlmdCg0KSxyLlByb3ZpZGVyVHlwZT1lLnJlYWRfc2hpZnQoNCksZS5sKz04LHIuQ1NQTmFtZT1lLnJlYWRfc2hpZnQobi1lLmw+PjEsInV0ZjE2bGUiKSxlLmw9bixyfWZ1bmN0aW9uIEREKGUsdCl7dmFyIG49e30scj1lLmwrdDtyZXR1cm4gZS5sKz00LG4uU2FsdD1lLnNsaWNlKGUubCxlLmwrMTYpLGUubCs9MTYsbi5WZXJpZmllcj1lLnNsaWNlKGUubCxlLmwrMTYpLGUubCs9MTYsZS5yZWFkX3NoaWZ0KDQpLG4uVmVyaWZpZXJIYXNoPWUuc2xpY2UoZS5sLHIpLGUubD1yLG59ZnVuY3Rpb24gVEQoZSl7aWYoMzYhPSg2MyZlLnJlYWRfc2hpZnQoNCkpKXRocm93IG5ldyBFcnJvcigiRW5jcnlwdGlvbkluZm8gbWlzbWF0Y2giKTt2YXIgdD1lLnJlYWRfc2hpZnQoNCk7cmV0dXJue3Q6IlN0ZCIsaDp4RChlLHQpLHY6REQoZSxlLmxlbmd0aC1lLmwpfX1mdW5jdGlvbiB3RCgpe3Rocm93IG5ldyBFcnJvcigiRmlsZSBpcyBwYXNzd29yZC1wcm90ZWN0ZWQ6IEVDTUEtMzc2IEV4dGVuc2libGUiKX1mdW5jdGlvbiBfRChlKXt2YXIgdD1bInNhbHRTaXplIiwiYmxvY2tTaXplIiwia2V5Qml0cyIsImhhc2hTaXplIiwiY2lwaGVyQWxnb3JpdGhtIiwiY2lwaGVyQ2hhaW5pbmciLCJoYXNoQWxnb3JpdGhtIiwic2FsdFZhbHVlIl07ZS5sKz00O3ZhciBuPWUucmVhZF9zaGlmdChlLmxlbmd0aC1lLmwsInV0ZjgiKSxyPXt9O3JldHVybiBuLnJlcGxhY2UoUGIsKGZ1bmN0aW9uKGUpe3ZhciBuPUxiKGUpO3N3aXRjaChNYihuWzBdKSl7Y2FzZSI8P3htbCI6Y2FzZSI8ZW5jcnlwdGlvbiI6Y2FzZSI8L2VuY3J5cHRpb24+IjpjYXNlIjwva2V5RW5jcnlwdG9ycz4iOmNhc2UiPC9rZXlFbmNyeXB0b3I+IjpicmVhaztjYXNlIjxrZXlEYXRhIjp0LmZvckVhY2goKGZ1bmN0aW9uKGUpe3JbZV09bltlXX0pKTticmVhaztjYXNlIjxkYXRhSW50ZWdyaXR5IjpyLmVuY3J5cHRlZEhtYWNLZXk9bi5lbmNyeXB0ZWRIbWFjS2V5LHIuZW5jcnlwdGVkSG1hY1ZhbHVlPW4uZW5jcnlwdGVkSG1hY1ZhbHVlO2JyZWFrO2Nhc2UiPGtleUVuY3J5cHRvcnM+IjpjYXNlIjxrZXlFbmNyeXB0b3JzIjpyLmVuY3M9W107YnJlYWs7Y2FzZSI8a2V5RW5jcnlwdG9yIjpyLnVyaT1uLnVyaTticmVhaztjYXNlIjxlbmNyeXB0ZWRLZXkiOnIuZW5jcy5wdXNoKG4pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgblswXX19KSkscn12YXIgRUQ9ZnVuY3Rpb24oKXt2YXIgZT1bMTg3LDI1NSwyNTUsMTg2LDI1NSwyNTUsMTg1LDEyOCwwLDE5MCwxNSwwLDE5MSwxNSwwXSx0PVs1Nzg0MCw3NDM5LDUyMzgwLDMzOTg0LDQzNjQsMzYwMCw2MTkwMiwxMjYwNiw2MjU4LDU3NjU3LDU0Mjg3LDM0MDQxLDEwMjUyLDQzMzcwLDIwMTYzXSxuPVs0NDc5NiwxOTkyOSwzOTg1OCwxMDA1MywyMDEwNiw0MDIxMiwxMDc2MSwzMTU4NSw2MzE3MCw2NDkzMyw2MDI2Nyw1MDkzNSw0MDM5OSwxMTE5OSwxNzc2MywzNTUyNiwxNDUzLDI5MDYsNTgxMiwxMTYyNCwyMzI0OCw4ODUsMTc3MCwzNTQwLDcwODAsMTQxNjAsMjgzMjAsNTY2NDAsNTUzNjksNDExMzksMjA4MDcsNDE2MTQsMjE4MjEsNDM2NDIsMTc2MjEsMjg0ODUsNTY5NzAsNDQzNDEsMTkwMTksMzgwMzgsMTQ2MDUsMjkyMTAsNjAxOTUsNTA3OTEsNDAxNzUsMTA3NTEsMjE1MDIsNDMwMDQsMjQ1MzcsMTgzODcsMzY3NzQsMzk0OSw3ODk4LDE1Nzk2LDMxNTkyLDYzMTg0LDQ3MjAxLDI0ODAzLDQ5NjA2LDM3ODA1LDE0MjAzLDI4NDA2LDU2ODEyLDE3ODI0LDM1NjQ4LDE2OTcsMzM5NCw2Nzg4LDEzNTc2LDI3MTUyLDQzNjAxLDE3NTM5LDM1MDc4LDU1NywxMTE0LDIyMjgsNDQ1NiwzMDM4OCw2MDc3Niw1MTk1MywzNDI0Myw3MDc5LDE0MTU4LDI4MzE2LDE0MTI4LDI4MjU2LDU2NTEyLDQzNDI1LDE3MjUxLDM0NTAyLDc1OTcsMTMxMDUsMjYyMTAsNTI0MjAsMzUyNDEsODgzLDE3NjYsMzUzMiw0MTI5LDgyNTgsMTY1MTYsMzMwMzIsNDY1Nyw5MzE0LDE4NjI4XSxyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIDI1NSYoKG49ZV50KS8yfDEyOCpuKTt2YXIgbn07cmV0dXJuIGZ1bmN0aW9uKGkpe2Zvcih2YXIgYSxvLGMscz1tRChpKSxsPWZ1bmN0aW9uKGUpe2Zvcih2YXIgcj10W2UubGVuZ3RoLTFdLGk9MTA0LGE9ZS5sZW5ndGgtMTthPj0wOy0tYSlmb3IodmFyIG89ZVthXSxjPTA7NyE9YzsrK2MpNjQmbyYmKHJePW5baV0pLG8qPTIsLS1pO3JldHVybiByfShzKSx1PXMubGVuZ3RoLGY9SmcoMTYpLGQ9MDsxNiE9ZDsrK2QpZltkXT0wO2ZvcigxPT0oMSZ1KSYmKGE9bD4+OCxmW3VdPXIoZVswXSxhKSwtLXUsYT0yNTUmbCxvPXNbcy5sZW5ndGgtMV0sZlt1XT1yKG8sYSkpO3U+MDspYT1sPj44LGZbLS11XT1yKHNbdV0sYSksYT0yNTUmbCxmWy0tdV09cihzW3VdLGEpO2Zvcih1PTE1LGM9MTUtcy5sZW5ndGg7Yz4wOylhPWw+PjgsZlt1XT1yKGVbY10sYSksLS1jLGE9MjU1JmwsZlstLXVdPXIoc1t1XSxhKSwtLXUsLS1jO3JldHVybiBmfX0oKSxVRD1mdW5jdGlvbihlKXt2YXIgdD0wLG49RUQoZSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIGEsbztmb3IoaXx8KGk9dCkscnx8KHI9RUQoZSkpLGE9MDthIT10Lmxlbmd0aDsrK2Epbz10W2FdLG89MjU1Jigob149cltuXSk+PjV8bzw8MyksaVthXT1vLCsrbjtyZXR1cm5baSxuLHJdfSgiIixlLHQsbik7cmV0dXJuIHQ9clsxXSxyWzBdfX07ZnVuY3Rpb24gQUQoZSx0LG4scil7dmFyIGk9e2tleTp5eChlKSx2ZXJpZmljYXRpb25CeXRlczp5eChlKX07cmV0dXJuIG4ucGFzc3dvcmQmJihpLnZlcmlmaWVyPWZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wLGk9bUQoZSksYT1pLmxlbmd0aCsxO2ZvcigodD1KZyhhKSlbMF09aS5sZW5ndGgsbj0xO24hPWE7KytuKXRbbl09aVtuLTFdO2ZvcihuPWEtMTtuPj0wOy0tbilyPSgoMD09KDE2Mzg0JnIpPzA6MSl8cjw8MSYzMjc2NyledFtuXTtyZXR1cm4gNTI4MTFecn0obi5wYXNzd29yZCkpLHIudmFsaWQ9aS52ZXJpZmljYXRpb25CeXRlcz09PWkudmVyaWZpZXIsci52YWxpZCYmKHIuaW5zaXR1PVVEKG4ucGFzc3dvcmQpKSxpfWZ1bmN0aW9uIGtEKGUsdCxuKXt2YXIgcj1ufHx7fTtyZXR1cm4gci5JbmZvPWUucmVhZF9zaGlmdCgyKSxlLmwtPTIsMT09PXIuSW5mbz9yLkRhdGE9ZnVuY3Rpb24oZSl7dmFyIHQ9e30sbj10LkVuY3J5cHRpb25WZXJzaW9uSW5mbz1iRChlLDQpO2lmKDEhPW4uTWFqb3J8fDEhPW4uTWlub3IpdGhyb3cidW5yZWNvZ25pemVkIHZlcnNpb24gY29kZSAiK24uTWFqb3IrIiA6ICIrbi5NaW5vcjtyZXR1cm4gdC5TYWx0PWUucmVhZF9zaGlmdCgxNiksdC5FbmNyeXB0ZWRWZXJpZmllcj1lLnJlYWRfc2hpZnQoMTYpLHQuRW5jcnlwdGVkVmVyaWZpZXJIYXNoPWUucmVhZF9zaGlmdCgxNiksdH0oZSk6ci5EYXRhPWZ1bmN0aW9uKGUsdCl7dmFyIG49e30scj1uLkVuY3J5cHRpb25WZXJzaW9uSW5mbz1iRChlLDQpO2lmKHQtPTQsMiE9ci5NaW5vcil0aHJvdyBuZXcgRXJyb3IoInVucmVjb2duaXplZCBtaW5vciB2ZXJzaW9uIGNvZGU6ICIrci5NaW5vcik7aWYoci5NYWpvcj40fHxyLk1ham9yPDIpdGhyb3cgbmV3IEVycm9yKCJ1bnJlY29nbml6ZWQgbWFqb3IgdmVyc2lvbiBjb2RlOiAiK3IuTWFqb3IpO24uRmxhZ3M9ZS5yZWFkX3NoaWZ0KDQpLHQtPTQ7dmFyIGk9ZS5yZWFkX3NoaWZ0KDQpO3JldHVybiB0LT00LG4uRW5jcnlwdGlvbkhlYWRlcj14RChlLGkpLHQtPWksbi5FbmNyeXB0aW9uVmVyaWZpZXI9REQoZSx0KSxufShlLHQpLHJ9ZnVuY3Rpb24gU0QoZSx0KXt2YXIgbj10fHx7fSxyPXt9LGk9bi5kZW5zZTtpJiYoclsiIWRhdGEiXT1bXSk7dmFyIGE9ZS5tYXRjaCgvXFx0cm93ZFtcc1xTXSo/XFxyb3dcYi9nKTtpZighYSl0aHJvdyBuZXcgRXJyb3IoIlJURiBtaXNzaW5nIHRhYmxlIik7dmFyIG89e3M6e2M6MCxyOjB9LGU6e2M6MCxyOmEubGVuZ3RoLTF9fSxjPVtdO3JldHVybiBhLmZvckVhY2goKGZ1bmN0aW9uKGUsdCl7aSYmKGM9clsiIWRhdGEiXVt0XT1bXSk7Zm9yKHZhciBhLHM9L1xcW1x3XC1dK1xiL2csbD0wLHU9LTEsZj1bXTtudWxsIT0oYT1zLmV4ZWMoZSkpOyl7dmFyIGQ9ZS5zbGljZShsLHMubGFzdEluZGV4LWFbMF0ubGVuZ3RoKTtzd2l0Y2goMzI9PWQuY2hhckNvZGVBdCgwKSYmKGQ9ZC5zbGljZSgxKSksZC5sZW5ndGgmJmYucHVzaChkKSxhWzBdKXtjYXNlIlxcY2VsbCI6aWYoKyt1LGYubGVuZ3RoKXt2YXIgaD17djpmLmpvaW4oIiIpLHQ6InMifTsiVFJVRSI9PWgudnx8IkZBTFNFIj09aC52PyhoLnY9IlRSVUUiPT1oLnYsaC50PSJiIik6aXNOYU4oZGIoaC52KSl8fChoLnQ9Im4iLCExIT09bi5jZWxsVGV4dCYmKGgudz1oLnYpLGgudj1kYihoLnYpKSxpP2NbdV09aDpyW292KHtyOnQsYzp1fSldPWh9Zj1bXTticmVhaztjYXNlIlxccGFyIjpmLnB1c2goIlxuIil9bD1zLmxhc3RJbmRleH11Pm8uZS5jJiYoby5lLmM9dSl9KSksclsiIXJlZiJdPXN2KG8pLHJ9ZnVuY3Rpb24gQ0QoZSx0KXt2YXIgbj1kdihmdW5jdGlvbihlLHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UiYmFzZTY0IjpyZXR1cm4gU0QoJGcoZSksdCk7Y2FzZSJiaW5hcnkiOnJldHVybiBTRChlLHQpO2Nhc2UiYnVmZmVyIjpyZXR1cm4gU0QoWWcmJkJ1ZmZlci5pc0J1ZmZlcihlKT9lLnRvU3RyaW5nKCJiaW5hcnkiKTp0bShlKSx0KTtjYXNlImFycmF5IjpyZXR1cm4gU0QobGIoZSksdCl9dGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgdHlwZSAiK3QudHlwZSl9KGUsdCksdCk7cmV0dXJuIG4uYm9va1R5cGU9InJ0ZiIsbn1mdW5jdGlvbiBGRChlKXtmb3IodmFyIHQ9MCxuPTE7MyE9dDsrK3Qpbj0yNTYqbisoZVt0XT4yNTU/MjU1OmVbdF08MD8wOmVbdF0pO3JldHVybiBuLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnNsaWNlKDEpfWZ1bmN0aW9uIE9EKGUsdCl7aWYoMD09PXQpcmV0dXJuIGU7dmFyIG4scixpPWZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0vMjU1LG49ZVsxXS8yNTUscj1lWzJdLzI1NSxpPU1hdGgubWF4KHQsbixyKSxhPU1hdGgubWluKHQsbixyKSxvPWktYTtpZigwPT09bylyZXR1cm5bMCwwLHRdO3ZhciBjLHM9MCxsPWkrYTtzd2l0Y2goYz1vLyhsPjE/Mi1sOmwpLGkpe2Nhc2UgdDpzPSgobi1yKS9vKzYpJTY7YnJlYWs7Y2FzZSBuOnM9KHItdCkvbysyO2JyZWFrO2Nhc2UgcjpzPSh0LW4pL28rNH1yZXR1cm5bcy82LGMsbC8yXX0oKHI9KG49ZSkuc2xpY2UoIiMiPT09blswXT8xOjApLnNsaWNlKDAsNiksW3BhcnNlSW50KHIuc2xpY2UoMCwyKSwxNikscGFyc2VJbnQoci5zbGljZSgyLDQpLDE2KSxwYXJzZUludChyLnNsaWNlKDQsNiksMTYpXSkpO3JldHVybiBpWzJdPXQ8MD9pWzJdKigxK3QpOjEtKDEtaVsyXSkqKDEtdCksRkQoZnVuY3Rpb24oZSl7dmFyIHQsbj1lWzBdLHI9ZVsxXSxpPWVbMl0sYT0yKnIqKGk8LjU/aToxLWkpLG89aS1hLzIsYz1bbyxvLG9dLHM9NipuO2lmKDAhPT1yKXN3aXRjaCgwfHMpe2Nhc2UgMDpjYXNlIDY6dD1hKnMsY1swXSs9YSxjWzFdKz10O2JyZWFrO2Nhc2UgMTp0PWEqKDItcyksY1swXSs9dCxjWzFdKz1hO2JyZWFrO2Nhc2UgMjp0PWEqKHMtMiksY1sxXSs9YSxjWzJdKz10O2JyZWFrO2Nhc2UgMzp0PWEqKDQtcyksY1sxXSs9dCxjWzJdKz1hO2JyZWFrO2Nhc2UgNDp0PWEqKHMtNCksY1syXSs9YSxjWzBdKz10O2JyZWFrO2Nhc2UgNTp0PWEqKDYtcyksY1syXSs9dCxjWzBdKz1hfWZvcih2YXIgbD0wOzMhPWw7KytsKWNbbF09TWF0aC5yb3VuZCgyNTUqY1tsXSk7cmV0dXJuIGN9KGkpKX12YXIgSUQ9NixSRD0xNSxORD0xLFBEPUlEO2Z1bmN0aW9uIEJEKGUpe3JldHVybiBNYXRoLmZsb29yKChlK01hdGgucm91bmQoMTI4L1BEKS8yNTYpKlBEKX1mdW5jdGlvbiBXRChlKXtyZXR1cm4gTWF0aC5mbG9vcigoZS01KS9QRCoxMDArLjUpLzEwMH1mdW5jdGlvbiBMRChlKXtyZXR1cm4gTWF0aC5yb3VuZCgoZSpQRCs1KS9QRCoyNTYpLzI1Nn1mdW5jdGlvbiBNRChlKXtyZXR1cm4gTEQoV0QoQkQoZSkpKX1mdW5jdGlvbiBqRChlKXt2YXIgdD1NYXRoLmFicyhlLU1EKGUpKSxuPVBEO2lmKHQ+LjAwNSlmb3IoUEQ9TkQ7UEQ8UkQ7KytQRClNYXRoLmFicyhlLU1EKGUpKTw9dCYmKHQ9TWF0aC5hYnMoZS1NRChlKSksbj1QRCk7UEQ9bn1mdW5jdGlvbiB6RChlKXtlLndpZHRoPyhlLndweD1CRChlLndpZHRoKSxlLndjaD1XRChlLndweCksZS5NRFc9UEQpOmUud3B4PyhlLndjaD1XRChlLndweCksZS53aWR0aD1MRChlLndjaCksZS5NRFc9UEQpOiJudW1iZXIiPT10eXBlb2YgZS53Y2gmJihlLndpZHRoPUxEKGUud2NoKSxlLndweD1CRChlLndpZHRoKSxlLk1EVz1QRCksZS5jdXN0b21XaWR0aCYmZGVsZXRlIGUuY3VzdG9tV2lkdGh9dmFyIEhEPTk2O2Z1bmN0aW9uIFZEKGUpe3JldHVybiA5NiplL0hEfWZ1bmN0aW9uIHFEKGUpe3JldHVybiBlKkhELzk2fXZhciBHRD17Tm9uZToibm9uZSIsU29saWQ6InNvbGlkIixHcmF5NTA6Im1lZGl1bUdyYXkiLEdyYXk3NToiZGFya0dyYXkiLEdyYXkyNToibGlnaHRHcmF5IixIb3J6U3RyaXBlOiJkYXJrSG9yaXpvbnRhbCIsVmVydFN0cmlwZToiZGFya1ZlcnRpY2FsIixSZXZlcnNlRGlhZ1N0cmlwZToiZGFya0Rvd24iLERpYWdTdHJpcGU6ImRhcmtVcCIsRGlhZ0Nyb3NzOiJkYXJrR3JpZCIsVGhpY2tEaWFnQ3Jvc3M6ImRhcmtUcmVsbGlzIixUaGluSG9yelN0cmlwZToibGlnaHRIb3Jpem9udGFsIixUaGluVmVydFN0cmlwZToibGlnaHRWZXJ0aWNhbCIsVGhpblJldmVyc2VEaWFnU3RyaXBlOiJsaWdodERvd24iLFRoaW5Ib3J6Q3Jvc3M6ImxpZ2h0R3JpZCJ9O3ZhciBYRD1bIm51bUZtdElkIiwiZmlsbElkIiwiZm9udElkIiwiYm9yZGVySWQiLCJ4ZklkIl0sJEQ9WyJhcHBseUFsaWdubWVudCIsImFwcGx5Qm9yZGVyIiwiYXBwbHlGaWxsIiwiYXBwbHlGb250IiwiYXBwbHlOdW1iZXJGb3JtYXQiLCJhcHBseVByb3RlY3Rpb24iLCJwaXZvdEJ1dHRvbiIsInF1b3RlUHJlZml4Il07dmFyIFlEPWZ1bmN0aW9uKCl7dmFyIGU9LzwoPzpcdys6KT9udW1GbXRzKFtePl0qKT5bXFNcc10qPzxcLyg/Olx3KzopP251bUZtdHM+Lyx0PS88KD86XHcrOik/Y2VsbFhmcyhbXj5dKik+W1xTXHNdKj88XC8oPzpcdys6KT9jZWxsWGZzPi8sbj0vPCg/Olx3KzopP2ZpbGxzKFtePl0qKT5bXFNcc10qPzxcLyg/Olx3KzopP2ZpbGxzPi8scj0vPCg/Olx3KzopP2ZvbnRzKFtePl0qKT5bXFNcc10qPzxcLyg/Olx3KzopP2ZvbnRzPi8saT0vPCg/Olx3KzopP2JvcmRlcnMoW14+XSopPltcU1xzXSo/PFwvKD86XHcrOik/Ym9yZGVycz4vO3JldHVybiBmdW5jdGlvbihhLG8sYyl7dmFyIHMsbD17fTtyZXR1cm4gYT8oKHM9KGE9YS5yZXBsYWNlKC88IS0tKFtcc1xTXSo/KS0tPi9nbSwiIikucmVwbGFjZSgvPCFET0NUWVBFW15cW10qXFtbXlxdXSpcXT4vZ20sIiIpKS5tYXRjaChlKSkmJmZ1bmN0aW9uKGUsdCxuKXt0Lk51bWJlckZtdD1bXTtmb3IodmFyIHI9Wm0oZ20pLGk9MDtpPHIubGVuZ3RoOysraSl0Lk51bWJlckZtdFtyW2ldXT1nbVtyW2ldXTt2YXIgYT1lWzBdLm1hdGNoKFBiKTtpZihhKWZvcihpPTA7aTxhLmxlbmd0aDsrK2kpe3ZhciBvPUxiKGFbaV0pO3N3aXRjaChNYihvWzBdKSl7Y2FzZSI8bnVtRm10cyI6Y2FzZSI8L251bUZtdHM+IjpjYXNlIjxudW1GbXRzLz4iOmNhc2UiPG51bUZtdHM+IjpjYXNlIjwvbnVtRm10PiI6YnJlYWs7Y2FzZSI8bnVtRm10Ijp2YXIgYz1IYihRYihvLmZvcm1hdENvZGUpKSxzPXBhcnNlSW50KG8ubnVtRm10SWQsMTApO2lmKHQuTnVtYmVyRm10W3NdPWMscz4wKXtpZihzPjM5Mil7Zm9yKHM9MzkyO3M+NjAmJm51bGwhPXQuTnVtYmVyRm10W3NdOy0tcyk7dC5OdW1iZXJGbXRbc109Y30kbShjLHMpfWJyZWFrO2RlZmF1bHQ6aWYobi5XVEYpdGhyb3cgbmV3IEVycm9yKCJ1bnJlY29nbml6ZWQgIitvWzBdKyIgaW4gbnVtRm10cyIpfX19KHMsbCxjKSwocz1hLm1hdGNoKHIpKSYmZnVuY3Rpb24oZSx0LG4scil7dC5Gb250cz1bXTt2YXIgaT17fSxhPSExOyhlWzBdLm1hdGNoKFBiKXx8W10pLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBvPUxiKGUpO3N3aXRjaChNYihvWzBdKSl7Y2FzZSI8Zm9udHMiOmNhc2UiPGZvbnRzPiI6Y2FzZSI8L2ZvbnRzPiI6Y2FzZSI8Zm9udCI6Y2FzZSI8Zm9udD4iOmNhc2UiPG5hbWUvPiI6Y2FzZSI8L25hbWU+IjpjYXNlIjxzei8+IjpjYXNlIjwvc3o+IjpjYXNlIjx2ZXJ0QWxpZ24vPiI6Y2FzZSI8L3ZlcnRBbGlnbj4iOmNhc2UiPGZhbWlseS8+IjpjYXNlIjwvZmFtaWx5PiI6Y2FzZSI8c2NoZW1lLz4iOmNhc2UiPC9zY2hlbWU+IjpjYXNlIjxjb2xvci8+IjpjYXNlIjwvY29sb3I+IjpjYXNlIjxleHRMc3QiOmNhc2UiPGV4dExzdD4iOmNhc2UiPC9leHRMc3Q+IjpicmVhaztjYXNlIjwvZm9udD4iOmNhc2UiPGZvbnQvPiI6dC5Gb250cy5wdXNoKGkpLGk9e307YnJlYWs7Y2FzZSI8bmFtZSI6by52YWwmJihpLm5hbWU9UWIoby52YWwpKTticmVhaztjYXNlIjxiIjppLmJvbGQ9by52YWw/JGIoby52YWwpOjE7YnJlYWs7Y2FzZSI8Yi8+IjppLmJvbGQ9MTticmVhaztjYXNlIjxpIjppLml0YWxpYz1vLnZhbD8kYihvLnZhbCk6MTticmVhaztjYXNlIjxpLz4iOmkuaXRhbGljPTE7YnJlYWs7Y2FzZSI8dSI6c3dpdGNoKG8udmFsKXtjYXNlIm5vbmUiOmkudW5kZXJsaW5lPTA7YnJlYWs7Y2FzZSJzaW5nbGUiOmkudW5kZXJsaW5lPTE7YnJlYWs7Y2FzZSJkb3VibGUiOmkudW5kZXJsaW5lPTI7YnJlYWs7Y2FzZSJzaW5nbGVBY2NvdW50aW5nIjppLnVuZGVybGluZT0zMzticmVhaztjYXNlImRvdWJsZUFjY291bnRpbmciOmkudW5kZXJsaW5lPTM0fWJyZWFrO2Nhc2UiPHUvPiI6aS51bmRlcmxpbmU9MTticmVhaztjYXNlIjxzdHJpa2UiOmkuc3RyaWtlPW8udmFsPyRiKG8udmFsKToxO2JyZWFrO2Nhc2UiPHN0cmlrZS8+IjppLnN0cmlrZT0xO2JyZWFrO2Nhc2UiPG91dGxpbmUiOmkub3V0bGluZT1vLnZhbD8kYihvLnZhbCk6MTticmVhaztjYXNlIjxvdXRsaW5lLz4iOmkub3V0bGluZT0xO2JyZWFrO2Nhc2UiPHNoYWRvdyI6aS5zaGFkb3c9by52YWw/JGIoby52YWwpOjE7YnJlYWs7Y2FzZSI8c2hhZG93Lz4iOmkuc2hhZG93PTE7YnJlYWs7Y2FzZSI8Y29uZGVuc2UiOmkuY29uZGVuc2U9by52YWw/JGIoby52YWwpOjE7YnJlYWs7Y2FzZSI8Y29uZGVuc2UvPiI6aS5jb25kZW5zZT0xO2JyZWFrO2Nhc2UiPGV4dGVuZCI6aS5leHRlbmQ9by52YWw/JGIoby52YWwpOjE7YnJlYWs7Y2FzZSI8ZXh0ZW5kLz4iOmkuZXh0ZW5kPTE7YnJlYWs7Y2FzZSI8c3oiOm8udmFsJiYoaS5zej0rby52YWwpO2JyZWFrO2Nhc2UiPHZlcnRBbGlnbiI6by52YWwmJihpLnZlcnRBbGlnbj1vLnZhbCk7YnJlYWs7Y2FzZSI8ZmFtaWx5IjpvLnZhbCYmKGkuZmFtaWx5PXBhcnNlSW50KG8udmFsLDEwKSk7YnJlYWs7Y2FzZSI8c2NoZW1lIjpvLnZhbCYmKGkuc2NoZW1lPW8udmFsKTticmVhaztjYXNlIjxjaGFyc2V0IjppZigiMSI9PW8udmFsKWJyZWFrO28uY29kZXBhZ2U9TmdbcGFyc2VJbnQoby52YWwsMTApXTticmVhaztjYXNlIjxjb2xvciI6aWYoaS5jb2xvcnx8KGkuY29sb3I9e30pLG8uYXV0byYmKGkuY29sb3IuYXV0bz0kYihvLmF1dG8pKSxvLnJnYilpLmNvbG9yLnJnYj1vLnJnYi5zbGljZSgtNik7ZWxzZSBpZihvLmluZGV4ZWQpe2kuY29sb3IuaW5kZXg9cGFyc2VJbnQoby5pbmRleGVkLDEwKTt2YXIgYz1qdltpLmNvbG9yLmluZGV4XTs4MT09aS5jb2xvci5pbmRleCYmKGM9anZbMV0pLGN8fChjPWp2WzFdKSxpLmNvbG9yLnJnYj1jWzBdLnRvU3RyaW5nKDE2KStjWzFdLnRvU3RyaW5nKDE2KStjWzJdLnRvU3RyaW5nKDE2KX1lbHNlIG8udGhlbWUmJihpLmNvbG9yLnRoZW1lPXBhcnNlSW50KG8udGhlbWUsMTApLG8udGludCYmKGkuY29sb3IudGludD1wYXJzZUZsb2F0KG8udGludCkpLG8udGhlbWUmJm4udGhlbWVFbGVtZW50cyYmbi50aGVtZUVsZW1lbnRzLmNsclNjaGVtZSYmKGkuY29sb3IucmdiPU9EKG4udGhlbWVFbGVtZW50cy5jbHJTY2hlbWVbaS5jb2xvci50aGVtZV0ucmdiLGkuY29sb3IudGludHx8MCkpKTticmVhaztjYXNlIjxBbHRlcm5hdGVDb250ZW50IjpjYXNlIjxleHQiOmE9ITA7YnJlYWs7Y2FzZSI8L0FsdGVybmF0ZUNvbnRlbnQ+IjpjYXNlIjwvZXh0PiI6YT0hMTticmVhaztkZWZhdWx0OmlmKHImJnIuV1RGJiYhYSl0aHJvdyBuZXcgRXJyb3IoInVucmVjb2duaXplZCAiK29bMF0rIiBpbiBmb250cyIpfX0pKX0ocyxsLG8sYyksKHM9YS5tYXRjaChuKSkmJmZ1bmN0aW9uKGUsdCxuLHIpe3QuRmlsbHM9W107dmFyIGk9e30sYT0hMTsoZVswXS5tYXRjaChQYil8fFtdKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1MYihlKTtzd2l0Y2goTWIoblswXSkpe2Nhc2UiPGZpbGxzIjpjYXNlIjxmaWxscz4iOmNhc2UiPC9maWxscz4iOmNhc2UiPC9maWxsPiI6Y2FzZSI8Z3JhZGllbnRGaWxsPiI6Y2FzZSI8cGF0dGVybkZpbGwvPiI6Y2FzZSI8L3BhdHRlcm5GaWxsPiI6Y2FzZSI8YmdDb2xvci8+IjpjYXNlIjwvYmdDb2xvcj4iOmNhc2UiPGZnQ29sb3IvPiI6Y2FzZSI8L2ZnQ29sb3I+IjpjYXNlIjxzdG9wIjpjYXNlIjxzdG9wLz4iOmNhc2UiPC9zdG9wPiI6Y2FzZSI8Y29sb3IiOmNhc2UiPGNvbG9yLz4iOmNhc2UiPC9jb2xvcj4iOmNhc2UiPGV4dExzdCI6Y2FzZSI8ZXh0THN0PiI6Y2FzZSI8L2V4dExzdD4iOmJyZWFrO2Nhc2UiPGZpbGw+IjpjYXNlIjxmaWxsIjpjYXNlIjxmaWxsLz4iOmk9e30sdC5GaWxscy5wdXNoKGkpO2JyZWFrO2Nhc2UiPGdyYWRpZW50RmlsbCI6Y2FzZSI8L2dyYWRpZW50RmlsbD4iOnQuRmlsbHMucHVzaChpKSxpPXt9O2JyZWFrO2Nhc2UiPHBhdHRlcm5GaWxsIjpjYXNlIjxwYXR0ZXJuRmlsbD4iOm4ucGF0dGVyblR5cGUmJihpLnBhdHRlcm5UeXBlPW4ucGF0dGVyblR5cGUpO2JyZWFrO2Nhc2UiPGJnQ29sb3IiOmkuYmdDb2xvcnx8KGkuYmdDb2xvcj17fSksbi5pbmRleGVkJiYoaS5iZ0NvbG9yLmluZGV4ZWQ9cGFyc2VJbnQobi5pbmRleGVkLDEwKSksbi50aGVtZSYmKGkuYmdDb2xvci50aGVtZT1wYXJzZUludChuLnRoZW1lLDEwKSksbi50aW50JiYoaS5iZ0NvbG9yLnRpbnQ9cGFyc2VGbG9hdChuLnRpbnQpKSxuLnJnYiYmKGkuYmdDb2xvci5yZ2I9bi5yZ2Iuc2xpY2UoLTYpKTticmVhaztjYXNlIjxmZ0NvbG9yIjppLmZnQ29sb3J8fChpLmZnQ29sb3I9e30pLG4udGhlbWUmJihpLmZnQ29sb3IudGhlbWU9cGFyc2VJbnQobi50aGVtZSwxMCkpLG4udGludCYmKGkuZmdDb2xvci50aW50PXBhcnNlRmxvYXQobi50aW50KSksbnVsbCE9bi5yZ2ImJihpLmZnQ29sb3IucmdiPW4ucmdiLnNsaWNlKC02KSk7YnJlYWs7Y2FzZSI8ZXh0IjphPSEwO2JyZWFrO2Nhc2UiPC9leHQ+IjphPSExO2JyZWFrO2RlZmF1bHQ6aWYociYmci5XVEYmJiFhKXRocm93IG5ldyBFcnJvcigidW5yZWNvZ25pemVkICIrblswXSsiIGluIGZpbGxzIil9fSkpfShzLGwsMCxjKSwocz1hLm1hdGNoKGkpKSYmZnVuY3Rpb24oZSx0LG4scil7dC5Cb3JkZXJzPVtdO3ZhciBpPXt9LGE9ITE7KGVbMF0ubWF0Y2goUGIpfHxbXSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49TGIoZSk7c3dpdGNoKE1iKG5bMF0pKXtjYXNlIjxib3JkZXJzIjpjYXNlIjxib3JkZXJzPiI6Y2FzZSI8L2JvcmRlcnM+IjpjYXNlIjwvYm9yZGVyPiI6Y2FzZSI8bGVmdC8+IjpjYXNlIjxsZWZ0IjpjYXNlIjxsZWZ0PiI6Y2FzZSI8L2xlZnQ+IjpjYXNlIjxyaWdodC8+IjpjYXNlIjxyaWdodCI6Y2FzZSI8cmlnaHQ+IjpjYXNlIjwvcmlnaHQ+IjpjYXNlIjx0b3AvPiI6Y2FzZSI8dG9wIjpjYXNlIjx0b3A+IjpjYXNlIjwvdG9wPiI6Y2FzZSI8Ym90dG9tLz4iOmNhc2UiPGJvdHRvbSI6Y2FzZSI8Ym90dG9tPiI6Y2FzZSI8L2JvdHRvbT4iOmNhc2UiPGRpYWdvbmFsIjpjYXNlIjxkaWFnb25hbD4iOmNhc2UiPGRpYWdvbmFsLz4iOmNhc2UiPC9kaWFnb25hbD4iOmNhc2UiPGhvcml6b250YWwiOmNhc2UiPGhvcml6b250YWw+IjpjYXNlIjxob3Jpem9udGFsLz4iOmNhc2UiPC9ob3Jpem9udGFsPiI6Y2FzZSI8dmVydGljYWwiOmNhc2UiPHZlcnRpY2FsPiI6Y2FzZSI8dmVydGljYWwvPiI6Y2FzZSI8L3ZlcnRpY2FsPiI6Y2FzZSI8c3RhcnQiOmNhc2UiPHN0YXJ0PiI6Y2FzZSI8c3RhcnQvPiI6Y2FzZSI8L3N0YXJ0PiI6Y2FzZSI8ZW5kIjpjYXNlIjxlbmQ+IjpjYXNlIjxlbmQvPiI6Y2FzZSI8L2VuZD4iOmNhc2UiPGNvbG9yIjpjYXNlIjxjb2xvcj4iOmNhc2UiPGNvbG9yLz4iOmNhc2UiPC9jb2xvcj4iOmNhc2UiPGV4dExzdCI6Y2FzZSI8ZXh0THN0PiI6Y2FzZSI8L2V4dExzdD4iOmJyZWFrO2Nhc2UiPGJvcmRlciI6Y2FzZSI8Ym9yZGVyPiI6Y2FzZSI8Ym9yZGVyLz4iOmk9e30sbi5kaWFnb25hbFVwJiYoaS5kaWFnb25hbFVwPSRiKG4uZGlhZ29uYWxVcCkpLG4uZGlhZ29uYWxEb3duJiYoaS5kaWFnb25hbERvd249JGIobi5kaWFnb25hbERvd24pKSx0LkJvcmRlcnMucHVzaChpKTticmVhaztjYXNlIjxleHQiOmE9ITA7YnJlYWs7Y2FzZSI8L2V4dD4iOmE9ITE7YnJlYWs7ZGVmYXVsdDppZihyJiZyLldURiYmIWEpdGhyb3cgbmV3IEVycm9yKCJ1bnJlY29nbml6ZWQgIituWzBdKyIgaW4gYm9yZGVycyIpfX0pKX0ocyxsLDAsYyksKHM9YS5tYXRjaCh0KSkmJmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjt0LkNlbGxYZj1bXTt2YXIgaT0hMTsoZVswXS5tYXRjaChQYil8fFtdKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgYT1MYihlKSxvPTA7c3dpdGNoKE1iKGFbMF0pKXtjYXNlIjxjZWxsWGZzIjpjYXNlIjxjZWxsWGZzPiI6Y2FzZSI8Y2VsbFhmcy8+IjpjYXNlIjwvY2VsbFhmcz4iOmNhc2UiPC94Zj4iOmNhc2UiPC9hbGlnbm1lbnQ+IjpjYXNlIjxwcm90ZWN0aW9uIjpjYXNlIjxwcm90ZWN0aW9uPiI6Y2FzZSI8L3Byb3RlY3Rpb24+IjpjYXNlIjxwcm90ZWN0aW9uLz4iOmNhc2UiPGV4dExzdCI6Y2FzZSI8ZXh0THN0PiI6Y2FzZSI8L2V4dExzdD4iOmJyZWFrO2Nhc2UiPHhmIjpjYXNlIjx4Zi8+IjpjYXNlIjx4Zj4iOmZvcihkZWxldGUocj1hKVswXSxvPTA7bzxYRC5sZW5ndGg7KytvKXJbWERbb11dJiYocltYRFtvXV09cGFyc2VJbnQocltYRFtvXV0sMTApKTtmb3Iobz0wO288JEQubGVuZ3RoOysrbylyWyREW29dXSYmKHJbJERbb11dPSRiKHJbJERbb11dKSk7aWYodC5OdW1iZXJGbXQmJnIubnVtRm10SWQ+MzkyKWZvcihvPTM5MjtvPjYwOy0tbylpZih0Lk51bWJlckZtdFtyLm51bUZtdElkXT09dC5OdW1iZXJGbXRbb10pe3IubnVtRm10SWQ9bzticmVha310LkNlbGxYZi5wdXNoKHIpO2JyZWFrO2Nhc2UiPGFsaWdubWVudCI6Y2FzZSI8YWxpZ25tZW50Lz4iOmNhc2UiPGFsaWdubWVudD4iOnZhciBjPXt9O2EudmVydGljYWwmJihjLnZlcnRpY2FsPWEudmVydGljYWwpLGEuaG9yaXpvbnRhbCYmKGMuaG9yaXpvbnRhbD1hLmhvcml6b250YWwpLG51bGwhPWEudGV4dFJvdGF0aW9uJiYoYy50ZXh0Um90YXRpb249YS50ZXh0Um90YXRpb24pLGEuaW5kZW50JiYoYy5pbmRlbnQ9YS5pbmRlbnQpLGEud3JhcFRleHQmJihjLndyYXBUZXh0PSRiKGEud3JhcFRleHQpKSxyLmFsaWdubWVudD1jO2JyZWFrO2Nhc2UiPEFsdGVybmF0ZUNvbnRlbnQiOmNhc2UiPEFsdGVybmF0ZUNvbnRlbnQ+IjpjYXNlIjxleHQiOmk9ITA7YnJlYWs7Y2FzZSI8L0FsdGVybmF0ZUNvbnRlbnQ+IjpjYXNlIjwvZXh0PiI6aT0hMTticmVhaztkZWZhdWx0OmlmKG4mJm4uV1RGJiYhaSl0aHJvdyBuZXcgRXJyb3IoInVucmVjb2duaXplZCAiK2FbMF0rIiBpbiBjZWxsWGZzIil9fSkpfShzLGwsYyksbCk6bH19KCk7dmFyIEtEPVh5O3ZhciBaRD1YeTt2YXIgSkQ9WyI8L2E6bHQxPiIsIjwvYTpkazE+IiwiPC9hOmx0Mj4iLCI8L2E6ZGsyPiIsIjwvYTphY2NlbnQxPiIsIjwvYTphY2NlbnQyPiIsIjwvYTphY2NlbnQzPiIsIjwvYTphY2NlbnQ0PiIsIjwvYTphY2NlbnQ1PiIsIjwvYTphY2NlbnQ2PiIsIjwvYTpobGluaz4iLCI8L2E6Zm9sSGxpbms+Il07ZnVuY3Rpb24gUUQoZSx0LG4pe3QudGhlbWVFbGVtZW50cy5jbHJTY2hlbWU9W107dmFyIHI9e307KGVbMF0ubWF0Y2goUGIpfHxbXSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIGk9TGIoZSk7c3dpdGNoKGlbMF0pe2Nhc2UiPGE6Y2xyU2NoZW1lIjpjYXNlIjwvYTpjbHJTY2hlbWU+IjpicmVhaztjYXNlIjxhOnNyZ2JDbHIiOnIucmdiPWkudmFsO2JyZWFrO2Nhc2UiPGE6c3lzQ2xyIjpyLnJnYj1pLmxhc3RDbHI7YnJlYWs7Y2FzZSI8YTpkazE+IjpjYXNlIjwvYTpkazE+IjpjYXNlIjxhOmx0MT4iOmNhc2UiPC9hOmx0MT4iOmNhc2UiPGE6ZGsyPiI6Y2FzZSI8L2E6ZGsyPiI6Y2FzZSI8YTpsdDI+IjpjYXNlIjwvYTpsdDI+IjpjYXNlIjxhOmFjY2VudDE+IjpjYXNlIjwvYTphY2NlbnQxPiI6Y2FzZSI8YTphY2NlbnQyPiI6Y2FzZSI8L2E6YWNjZW50Mj4iOmNhc2UiPGE6YWNjZW50Mz4iOmNhc2UiPC9hOmFjY2VudDM+IjpjYXNlIjxhOmFjY2VudDQ+IjpjYXNlIjwvYTphY2NlbnQ0PiI6Y2FzZSI8YTphY2NlbnQ1PiI6Y2FzZSI8L2E6YWNjZW50NT4iOmNhc2UiPGE6YWNjZW50Nj4iOmNhc2UiPC9hOmFjY2VudDY+IjpjYXNlIjxhOmhsaW5rPiI6Y2FzZSI8L2E6aGxpbms+IjpjYXNlIjxhOmZvbEhsaW5rPiI6Y2FzZSI8L2E6Zm9sSGxpbms+IjoiLyI9PT1pWzBdLmNoYXJBdCgxKT8odC50aGVtZUVsZW1lbnRzLmNsclNjaGVtZVtKRC5pbmRleE9mKGlbMF0pXT1yLHI9e30pOnIubmFtZT1pWzBdLnNsaWNlKDMsaVswXS5sZW5ndGgtMSk7YnJlYWs7ZGVmYXVsdDppZihuJiZuLldURil0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCAiK2lbMF0rIiBpbiBjbHJTY2hlbWUiKX19KSl9ZnVuY3Rpb24gZVQoKXt9ZnVuY3Rpb24gdFQoKXt9dmFyIG5UPS88YTpjbHJTY2hlbWUoW14+XSopPltcc1xTXSo8XC9hOmNsclNjaGVtZT4vLHJUPS88YTpmb250U2NoZW1lKFtePl0qKT5bXHNcU10qPFwvYTpmb250U2NoZW1lPi8saVQ9LzxhOmZtdFNjaGVtZShbXj5dKik+W1xzXFNdKjxcL2E6Zm10U2NoZW1lPi87dmFyIGFUPS88YTp0aGVtZUVsZW1lbnRzKFtePl0qKT5bXHNcU10qPFwvYTp0aGVtZUVsZW1lbnRzPi87ZnVuY3Rpb24gb1QoZSx0KXt2YXIgbjtlJiYwIT09ZS5sZW5ndGh8fChlPWZ1bmN0aW9uKGUsdCl7aWYodCYmdC50aGVtZVhMU1gpcmV0dXJuIHQudGhlbWVYTFNYO2lmKGUmJiJzdHJpbmciPT10eXBlb2YgZS5yYXcpcmV0dXJuIGUucmF3O3ZhciBuPVtJYl07cmV0dXJuIG5bbi5sZW5ndGhdPSc8YTp0aGVtZSB4bWxuczphPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbWFpbiIgbmFtZT0iT2ZmaWNlIFRoZW1lIj4nLG5bbi5sZW5ndGhdPSI8YTp0aGVtZUVsZW1lbnRzPiIsbltuLmxlbmd0aF09JzxhOmNsclNjaGVtZSBuYW1lPSJPZmZpY2UiPicsbltuLmxlbmd0aF09JzxhOmRrMT48YTpzeXNDbHIgdmFsPSJ3aW5kb3dUZXh0IiBsYXN0Q2xyPSIwMDAwMDAiLz48L2E6ZGsxPicsbltuLmxlbmd0aF09JzxhOmx0MT48YTpzeXNDbHIgdmFsPSJ3aW5kb3ciIGxhc3RDbHI9IkZGRkZGRiIvPjwvYTpsdDE+JyxuW24ubGVuZ3RoXT0nPGE6ZGsyPjxhOnNyZ2JDbHIgdmFsPSIxRjQ5N0QiLz48L2E6ZGsyPicsbltuLmxlbmd0aF09JzxhOmx0Mj48YTpzcmdiQ2xyIHZhbD0iRUVFQ0UxIi8+PC9hOmx0Mj4nLG5bbi5sZW5ndGhdPSc8YTphY2NlbnQxPjxhOnNyZ2JDbHIgdmFsPSI0RjgxQkQiLz48L2E6YWNjZW50MT4nLG5bbi5sZW5ndGhdPSc8YTphY2NlbnQyPjxhOnNyZ2JDbHIgdmFsPSJDMDUwNEQiLz48L2E6YWNjZW50Mj4nLG5bbi5sZW5ndGhdPSc8YTphY2NlbnQzPjxhOnNyZ2JDbHIgdmFsPSI5QkJCNTkiLz48L2E6YWNjZW50Mz4nLG5bbi5sZW5ndGhdPSc8YTphY2NlbnQ0PjxhOnNyZ2JDbHIgdmFsPSI4MDY0QTIiLz48L2E6YWNjZW50ND4nLG5bbi5sZW5ndGhdPSc8YTphY2NlbnQ1PjxhOnNyZ2JDbHIgdmFsPSI0QkFDQzYiLz48L2E6YWNjZW50NT4nLG5bbi5sZW5ndGhdPSc8YTphY2NlbnQ2PjxhOnNyZ2JDbHIgdmFsPSJGNzk2NDYiLz48L2E6YWNjZW50Nj4nLG5bbi5sZW5ndGhdPSc8YTpobGluaz48YTpzcmdiQ2xyIHZhbD0iMDAwMEZGIi8+PC9hOmhsaW5rPicsbltuLmxlbmd0aF09JzxhOmZvbEhsaW5rPjxhOnNyZ2JDbHIgdmFsPSI4MDAwODAiLz48L2E6Zm9sSGxpbms+JyxuW24ubGVuZ3RoXT0iPC9hOmNsclNjaGVtZT4iLG5bbi5sZW5ndGhdPSc8YTpmb250U2NoZW1lIG5hbWU9Ik9mZmljZSI+JyxuW24ubGVuZ3RoXT0iPGE6bWFqb3JGb250PiIsbltuLmxlbmd0aF09JzxhOmxhdGluIHR5cGVmYWNlPSJDYW1icmlhIi8+JyxuW24ubGVuZ3RoXT0nPGE6ZWEgdHlwZWZhY2U9IiIvPicsbltuLmxlbmd0aF09JzxhOmNzIHR5cGVmYWNlPSIiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iSnBhbiIgdHlwZWZhY2U9Iu+8re+8syDvvLDjgrTjgrfjg4Pjgq8iLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iSGFuZyIgdHlwZWZhY2U9IuunkeydgCDqs6DrlJUiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iSGFucyIgdHlwZWZhY2U9IuWui+S9kyIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJIYW50IiB0eXBlZmFjZT0i5paw57Sw5piO6auUIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IkFyYWIiIHR5cGVmYWNlPSJUaW1lcyBOZXcgUm9tYW4iLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iSGViciIgdHlwZWZhY2U9IlRpbWVzIE5ldyBSb21hbiIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJUaGFpIiB0eXBlZmFjZT0iVGFob21hIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IkV0aGkiIHR5cGVmYWNlPSJOeWFsYSIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJCZW5nIiB0eXBlZmFjZT0iVnJpbmRhIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9Ikd1anIiIHR5cGVmYWNlPSJTaHJ1dGkiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iS2htciIgdHlwZWZhY2U9Ik1vb2xCb3JhbiIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJLbmRhIiB0eXBlZmFjZT0iVHVuZ2EiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iR3VydSIgdHlwZWZhY2U9IlJhYXZpIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IkNhbnMiIHR5cGVmYWNlPSJFdXBoZW1pYSIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJDaGVyIiB0eXBlZmFjZT0iUGxhbnRhZ2VuZXQgQ2hlcm9rZWUiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iWWlpaSIgdHlwZWZhY2U9Ik1pY3Jvc29mdCBZaSBCYWl0aSIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJUaWJ0IiB0eXBlZmFjZT0iTWljcm9zb2Z0IEhpbWFsYXlhIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IlRoYWEiIHR5cGVmYWNlPSJNViBCb2xpIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IkRldmEiIHR5cGVmYWNlPSJNYW5nYWwiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iVGVsdSIgdHlwZWZhY2U9IkdhdXRhbWkiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iVGFtbCIgdHlwZWZhY2U9IkxhdGhhIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IlN5cmMiIHR5cGVmYWNlPSJFc3RyYW5nZWxvIEVkZXNzYSIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJPcnlhIiB0eXBlZmFjZT0iS2FsaW5nYSIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJNbHltIiB0eXBlZmFjZT0iS2FydGlrYSIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJMYW9vIiB0eXBlZmFjZT0iRG9rQ2hhbXBhIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IlNpbmgiIHR5cGVmYWNlPSJJc2tvb2xhIFBvdGEiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iTW9uZyIgdHlwZWZhY2U9Ik1vbmdvbGlhbiBCYWl0aSIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJWaWV0IiB0eXBlZmFjZT0iVGltZXMgTmV3IFJvbWFuIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IlVpZ2giIHR5cGVmYWNlPSJNaWNyb3NvZnQgVWlnaHVyIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9Ikdlb3IiIHR5cGVmYWNlPSJTeWxmYWVuIi8+JyxuW24ubGVuZ3RoXT0iPC9hOm1ham9yRm9udD4iLG5bbi5sZW5ndGhdPSI8YTptaW5vckZvbnQ+IixuW24ubGVuZ3RoXT0nPGE6bGF0aW4gdHlwZWZhY2U9IkNhbGlicmkiLz4nLG5bbi5sZW5ndGhdPSc8YTplYSB0eXBlZmFjZT0iIi8+JyxuW24ubGVuZ3RoXT0nPGE6Y3MgdHlwZWZhY2U9IiIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJKcGFuIiB0eXBlZmFjZT0i77yt77yzIO+8sOOCtOOCt+ODg+OCryIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJIYW5nIiB0eXBlZmFjZT0i66eR7J2AIOqzoOuUlSIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJIYW5zIiB0eXBlZmFjZT0i5a6L5L2TIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IkhhbnQiIHR5cGVmYWNlPSLmlrDntLDmmI7pq5QiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iQXJhYiIgdHlwZWZhY2U9IkFyaWFsIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IkhlYnIiIHR5cGVmYWNlPSJBcmlhbCIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJUaGFpIiB0eXBlZmFjZT0iVGFob21hIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IkV0aGkiIHR5cGVmYWNlPSJOeWFsYSIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJCZW5nIiB0eXBlZmFjZT0iVnJpbmRhIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9Ikd1anIiIHR5cGVmYWNlPSJTaHJ1dGkiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iS2htciIgdHlwZWZhY2U9IkRhdW5QZW5oIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IktuZGEiIHR5cGVmYWNlPSJUdW5nYSIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJHdXJ1IiB0eXBlZmFjZT0iUmFhdmkiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iQ2FucyIgdHlwZWZhY2U9IkV1cGhlbWlhIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IkNoZXIiIHR5cGVmYWNlPSJQbGFudGFnZW5ldCBDaGVyb2tlZSIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJZaWlpIiB0eXBlZmFjZT0iTWljcm9zb2Z0IFlpIEJhaXRpIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IlRpYnQiIHR5cGVmYWNlPSJNaWNyb3NvZnQgSGltYWxheWEiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iVGhhYSIgdHlwZWZhY2U9Ik1WIEJvbGkiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iRGV2YSIgdHlwZWZhY2U9Ik1hbmdhbCIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJUZWx1IiB0eXBlZmFjZT0iR2F1dGFtaSIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJUYW1sIiB0eXBlZmFjZT0iTGF0aGEiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iU3lyYyIgdHlwZWZhY2U9IkVzdHJhbmdlbG8gRWRlc3NhIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9Ik9yeWEiIHR5cGVmYWNlPSJLYWxpbmdhIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9Ik1seW0iIHR5cGVmYWNlPSJLYXJ0aWthIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9Ikxhb28iIHR5cGVmYWNlPSJEb2tDaGFtcGEiLz4nLG5bbi5sZW5ndGhdPSc8YTpmb250IHNjcmlwdD0iU2luaCIgdHlwZWZhY2U9Iklza29vbGEgUG90YSIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJNb25nIiB0eXBlZmFjZT0iTW9uZ29saWFuIEJhaXRpIi8+JyxuW24ubGVuZ3RoXT0nPGE6Zm9udCBzY3JpcHQ9IlZpZXQiIHR5cGVmYWNlPSJBcmlhbCIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJVaWdoIiB0eXBlZmFjZT0iTWljcm9zb2Z0IFVpZ2h1ciIvPicsbltuLmxlbmd0aF09JzxhOmZvbnQgc2NyaXB0PSJHZW9yIiB0eXBlZmFjZT0iU3lsZmFlbiIvPicsbltuLmxlbmd0aF09IjwvYTptaW5vckZvbnQ+IixuW24ubGVuZ3RoXT0iPC9hOmZvbnRTY2hlbWU+IixuW24ubGVuZ3RoXT0nPGE6Zm10U2NoZW1lIG5hbWU9Ik9mZmljZSI+JyxuW24ubGVuZ3RoXT0iPGE6ZmlsbFN0eWxlTHN0PiIsbltuLmxlbmd0aF09JzxhOnNvbGlkRmlsbD48YTpzY2hlbWVDbHIgdmFsPSJwaENsciIvPjwvYTpzb2xpZEZpbGw+JyxuW24ubGVuZ3RoXT0nPGE6Z3JhZEZpbGwgcm90V2l0aFNoYXBlPSIxIj4nLG5bbi5sZW5ndGhdPSI8YTpnc0xzdD4iLG5bbi5sZW5ndGhdPSc8YTpncyBwb3M9IjAiPjxhOnNjaGVtZUNsciB2YWw9InBoQ2xyIj48YTp0aW50IHZhbD0iNTAwMDAiLz48YTpzYXRNb2QgdmFsPSIzMDAwMDAiLz48L2E6c2NoZW1lQ2xyPjwvYTpncz4nLG5bbi5sZW5ndGhdPSc8YTpncyBwb3M9IjM1MDAwIj48YTpzY2hlbWVDbHIgdmFsPSJwaENsciI+PGE6dGludCB2YWw9IjM3MDAwIi8+PGE6c2F0TW9kIHZhbD0iMzAwMDAwIi8+PC9hOnNjaGVtZUNscj48L2E6Z3M+JyxuW24ubGVuZ3RoXT0nPGE6Z3MgcG9zPSIxMDAwMDAiPjxhOnNjaGVtZUNsciB2YWw9InBoQ2xyIj48YTp0aW50IHZhbD0iMTUwMDAiLz48YTpzYXRNb2QgdmFsPSIzNTAwMDAiLz48L2E6c2NoZW1lQ2xyPjwvYTpncz4nLG5bbi5sZW5ndGhdPSI8L2E6Z3NMc3Q+IixuW24ubGVuZ3RoXT0nPGE6bGluIGFuZz0iMTYyMDAwMDAiIHNjYWxlZD0iMSIvPicsbltuLmxlbmd0aF09IjwvYTpncmFkRmlsbD4iLG5bbi5sZW5ndGhdPSc8YTpncmFkRmlsbCByb3RXaXRoU2hhcGU9IjEiPicsbltuLmxlbmd0aF09IjxhOmdzTHN0PiIsbltuLmxlbmd0aF09JzxhOmdzIHBvcz0iMCI+PGE6c2NoZW1lQ2xyIHZhbD0icGhDbHIiPjxhOnRpbnQgdmFsPSIxMDAwMDAiLz48YTpzaGFkZSB2YWw9IjEwMDAwMCIvPjxhOnNhdE1vZCB2YWw9IjEzMDAwMCIvPjwvYTpzY2hlbWVDbHI+PC9hOmdzPicsbltuLmxlbmd0aF09JzxhOmdzIHBvcz0iMTAwMDAwIj48YTpzY2hlbWVDbHIgdmFsPSJwaENsciI+PGE6dGludCB2YWw9IjUwMDAwIi8+PGE6c2hhZGUgdmFsPSIxMDAwMDAiLz48YTpzYXRNb2QgdmFsPSIzNTAwMDAiLz48L2E6c2NoZW1lQ2xyPjwvYTpncz4nLG5bbi5sZW5ndGhdPSI8L2E6Z3NMc3Q+IixuW24ubGVuZ3RoXT0nPGE6bGluIGFuZz0iMTYyMDAwMDAiIHNjYWxlZD0iMCIvPicsbltuLmxlbmd0aF09IjwvYTpncmFkRmlsbD4iLG5bbi5sZW5ndGhdPSI8L2E6ZmlsbFN0eWxlTHN0PiIsbltuLmxlbmd0aF09IjxhOmxuU3R5bGVMc3Q+IixuW24ubGVuZ3RoXT0nPGE6bG4gdz0iOTUyNSIgY2FwPSJmbGF0IiBjbXBkPSJzbmciIGFsZ249ImN0ciI+PGE6c29saWRGaWxsPjxhOnNjaGVtZUNsciB2YWw9InBoQ2xyIj48YTpzaGFkZSB2YWw9Ijk1MDAwIi8+PGE6c2F0TW9kIHZhbD0iMTA1MDAwIi8+PC9hOnNjaGVtZUNscj48L2E6c29saWRGaWxsPjxhOnByc3REYXNoIHZhbD0ic29saWQiLz48L2E6bG4+JyxuW24ubGVuZ3RoXT0nPGE6bG4gdz0iMjU0MDAiIGNhcD0iZmxhdCIgY21wZD0ic25nIiBhbGduPSJjdHIiPjxhOnNvbGlkRmlsbD48YTpzY2hlbWVDbHIgdmFsPSJwaENsciIvPjwvYTpzb2xpZEZpbGw+PGE6cHJzdERhc2ggdmFsPSJzb2xpZCIvPjwvYTpsbj4nLG5bbi5sZW5ndGhdPSc8YTpsbiB3PSIzODEwMCIgY2FwPSJmbGF0IiBjbXBkPSJzbmciIGFsZ249ImN0ciI+PGE6c29saWRGaWxsPjxhOnNjaGVtZUNsciB2YWw9InBoQ2xyIi8+PC9hOnNvbGlkRmlsbD48YTpwcnN0RGFzaCB2YWw9InNvbGlkIi8+PC9hOmxuPicsbltuLmxlbmd0aF09IjwvYTpsblN0eWxlTHN0PiIsbltuLmxlbmd0aF09IjxhOmVmZmVjdFN0eWxlTHN0PiIsbltuLmxlbmd0aF09IjxhOmVmZmVjdFN0eWxlPiIsbltuLmxlbmd0aF09IjxhOmVmZmVjdExzdD4iLG5bbi5sZW5ndGhdPSc8YTpvdXRlclNoZHcgYmx1clJhZD0iNDAwMDAiIGRpc3Q9IjIwMDAwIiBkaXI9IjU0MDAwMDAiIHJvdFdpdGhTaGFwZT0iMCI+PGE6c3JnYkNsciB2YWw9IjAwMDAwMCI+PGE6YWxwaGEgdmFsPSIzODAwMCIvPjwvYTpzcmdiQ2xyPjwvYTpvdXRlclNoZHc+JyxuW24ubGVuZ3RoXT0iPC9hOmVmZmVjdExzdD4iLG5bbi5sZW5ndGhdPSI8L2E6ZWZmZWN0U3R5bGU+IixuW24ubGVuZ3RoXT0iPGE6ZWZmZWN0U3R5bGU+IixuW24ubGVuZ3RoXT0iPGE6ZWZmZWN0THN0PiIsbltuLmxlbmd0aF09JzxhOm91dGVyU2hkdyBibHVyUmFkPSI0MDAwMCIgZGlzdD0iMjMwMDAiIGRpcj0iNTQwMDAwMCIgcm90V2l0aFNoYXBlPSIwIj48YTpzcmdiQ2xyIHZhbD0iMDAwMDAwIj48YTphbHBoYSB2YWw9IjM1MDAwIi8+PC9hOnNyZ2JDbHI+PC9hOm91dGVyU2hkdz4nLG5bbi5sZW5ndGhdPSI8L2E6ZWZmZWN0THN0PiIsbltuLmxlbmd0aF09IjwvYTplZmZlY3RTdHlsZT4iLG5bbi5sZW5ndGhdPSI8YTplZmZlY3RTdHlsZT4iLG5bbi5sZW5ndGhdPSI8YTplZmZlY3RMc3Q+IixuW24ubGVuZ3RoXT0nPGE6b3V0ZXJTaGR3IGJsdXJSYWQ9IjQwMDAwIiBkaXN0PSIyMzAwMCIgZGlyPSI1NDAwMDAwIiByb3RXaXRoU2hhcGU9IjAiPjxhOnNyZ2JDbHIgdmFsPSIwMDAwMDAiPjxhOmFscGhhIHZhbD0iMzUwMDAiLz48L2E6c3JnYkNscj48L2E6b3V0ZXJTaGR3PicsbltuLmxlbmd0aF09IjwvYTplZmZlY3RMc3Q+IixuW24ubGVuZ3RoXT0nPGE6c2NlbmUzZD48YTpjYW1lcmEgcHJzdD0ib3J0aG9ncmFwaGljRnJvbnQiPjxhOnJvdCBsYXQ9IjAiIGxvbj0iMCIgcmV2PSIwIi8+PC9hOmNhbWVyYT48YTpsaWdodFJpZyByaWc9InRocmVlUHQiIGRpcj0idCI+PGE6cm90IGxhdD0iMCIgbG9uPSIwIiByZXY9IjEyMDAwMDAiLz48L2E6bGlnaHRSaWc+PC9hOnNjZW5lM2Q+JyxuW24ubGVuZ3RoXT0nPGE6c3AzZD48YTpiZXZlbFQgdz0iNjM1MDAiIGg9IjI1NDAwIi8+PC9hOnNwM2Q+JyxuW24ubGVuZ3RoXT0iPC9hOmVmZmVjdFN0eWxlPiIsbltuLmxlbmd0aF09IjwvYTplZmZlY3RTdHlsZUxzdD4iLG5bbi5sZW5ndGhdPSI8YTpiZ0ZpbGxTdHlsZUxzdD4iLG5bbi5sZW5ndGhdPSc8YTpzb2xpZEZpbGw+PGE6c2NoZW1lQ2xyIHZhbD0icGhDbHIiLz48L2E6c29saWRGaWxsPicsbltuLmxlbmd0aF09JzxhOmdyYWRGaWxsIHJvdFdpdGhTaGFwZT0iMSI+JyxuW24ubGVuZ3RoXT0iPGE6Z3NMc3Q+IixuW24ubGVuZ3RoXT0nPGE6Z3MgcG9zPSIwIj48YTpzY2hlbWVDbHIgdmFsPSJwaENsciI+PGE6dGludCB2YWw9IjQwMDAwIi8+PGE6c2F0TW9kIHZhbD0iMzUwMDAwIi8+PC9hOnNjaGVtZUNscj48L2E6Z3M+JyxuW24ubGVuZ3RoXT0nPGE6Z3MgcG9zPSI0MDAwMCI+PGE6c2NoZW1lQ2xyIHZhbD0icGhDbHIiPjxhOnRpbnQgdmFsPSI0NTAwMCIvPjxhOnNoYWRlIHZhbD0iOTkwMDAiLz48YTpzYXRNb2QgdmFsPSIzNTAwMDAiLz48L2E6c2NoZW1lQ2xyPjwvYTpncz4nLG5bbi5sZW5ndGhdPSc8YTpncyBwb3M9IjEwMDAwMCI+PGE6c2NoZW1lQ2xyIHZhbD0icGhDbHIiPjxhOnNoYWRlIHZhbD0iMjAwMDAiLz48YTpzYXRNb2QgdmFsPSIyNTUwMDAiLz48L2E6c2NoZW1lQ2xyPjwvYTpncz4nLG5bbi5sZW5ndGhdPSI8L2E6Z3NMc3Q+IixuW24ubGVuZ3RoXT0nPGE6cGF0aCBwYXRoPSJjaXJjbGUiPjxhOmZpbGxUb1JlY3QgbD0iNTAwMDAiIHQ9Ii04MDAwMCIgcj0iNTAwMDAiIGI9IjE4MDAwMCIvPjwvYTpwYXRoPicsbltuLmxlbmd0aF09IjwvYTpncmFkRmlsbD4iLG5bbi5sZW5ndGhdPSc8YTpncmFkRmlsbCByb3RXaXRoU2hhcGU9IjEiPicsbltuLmxlbmd0aF09IjxhOmdzTHN0PiIsbltuLmxlbmd0aF09JzxhOmdzIHBvcz0iMCI+PGE6c2NoZW1lQ2xyIHZhbD0icGhDbHIiPjxhOnRpbnQgdmFsPSI4MDAwMCIvPjxhOnNhdE1vZCB2YWw9IjMwMDAwMCIvPjwvYTpzY2hlbWVDbHI+PC9hOmdzPicsbltuLmxlbmd0aF09JzxhOmdzIHBvcz0iMTAwMDAwIj48YTpzY2hlbWVDbHIgdmFsPSJwaENsciI+PGE6c2hhZGUgdmFsPSIzMDAwMCIvPjxhOnNhdE1vZCB2YWw9IjIwMDAwMCIvPjwvYTpzY2hlbWVDbHI+PC9hOmdzPicsbltuLmxlbmd0aF09IjwvYTpnc0xzdD4iLG5bbi5sZW5ndGhdPSc8YTpwYXRoIHBhdGg9ImNpcmNsZSI+PGE6ZmlsbFRvUmVjdCBsPSI1MDAwMCIgdD0iNTAwMDAiIHI9IjUwMDAwIiBiPSI1MDAwMCIvPjwvYTpwYXRoPicsbltuLmxlbmd0aF09IjwvYTpncmFkRmlsbD4iLG5bbi5sZW5ndGhdPSI8L2E6YmdGaWxsU3R5bGVMc3Q+IixuW24ubGVuZ3RoXT0iPC9hOmZtdFNjaGVtZT4iLG5bbi5sZW5ndGhdPSI8L2E6dGhlbWVFbGVtZW50cz4iLG5bbi5sZW5ndGhdPSI8YTpvYmplY3REZWZhdWx0cz4iLG5bbi5sZW5ndGhdPSI8YTpzcERlZj4iLG5bbi5sZW5ndGhdPSc8YTpzcFByLz48YTpib2R5UHIvPjxhOmxzdFN0eWxlLz48YTpzdHlsZT48YTpsblJlZiBpZHg9IjEiPjxhOnNjaGVtZUNsciB2YWw9ImFjY2VudDEiLz48L2E6bG5SZWY+PGE6ZmlsbFJlZiBpZHg9IjMiPjxhOnNjaGVtZUNsciB2YWw9ImFjY2VudDEiLz48L2E6ZmlsbFJlZj48YTplZmZlY3RSZWYgaWR4PSIyIj48YTpzY2hlbWVDbHIgdmFsPSJhY2NlbnQxIi8+PC9hOmVmZmVjdFJlZj48YTpmb250UmVmIGlkeD0ibWlub3IiPjxhOnNjaGVtZUNsciB2YWw9Imx0MSIvPjwvYTpmb250UmVmPjwvYTpzdHlsZT4nLG5bbi5sZW5ndGhdPSI8L2E6c3BEZWY+IixuW24ubGVuZ3RoXT0iPGE6bG5EZWY+IixuW24ubGVuZ3RoXT0nPGE6c3BQci8+PGE6Ym9keVByLz48YTpsc3RTdHlsZS8+PGE6c3R5bGU+PGE6bG5SZWYgaWR4PSIyIj48YTpzY2hlbWVDbHIgdmFsPSJhY2NlbnQxIi8+PC9hOmxuUmVmPjxhOmZpbGxSZWYgaWR4PSIwIj48YTpzY2hlbWVDbHIgdmFsPSJhY2NlbnQxIi8+PC9hOmZpbGxSZWY+PGE6ZWZmZWN0UmVmIGlkeD0iMSI+PGE6c2NoZW1lQ2xyIHZhbD0iYWNjZW50MSIvPjwvYTplZmZlY3RSZWY+PGE6Zm9udFJlZiBpZHg9Im1pbm9yIj48YTpzY2hlbWVDbHIgdmFsPSJ0eDEiLz48L2E6Zm9udFJlZj48L2E6c3R5bGU+JyxuW24ubGVuZ3RoXT0iPC9hOmxuRGVmPiIsbltuLmxlbmd0aF09IjwvYTpvYmplY3REZWZhdWx0cz4iLG5bbi5sZW5ndGhdPSI8YTpleHRyYUNsclNjaGVtZUxzdC8+IixuW24ubGVuZ3RoXT0iPC9hOnRoZW1lPiIsbi5qb2luKCIiKX0oKSk7dmFyIHI9e307aWYoIShuPWUubWF0Y2goYVQpKSl0aHJvdyBuZXcgRXJyb3IoInRoZW1lRWxlbWVudHMgbm90IGZvdW5kIGluIHRoZW1lIik7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjt0LnRoZW1lRWxlbWVudHM9e30sW1siY2xyU2NoZW1lIixuVCxRRF0sWyJmb250U2NoZW1lIixyVCxlVF0sWyJmbXRTY2hlbWUiLGlULHRUXV0uZm9yRWFjaCgoZnVuY3Rpb24oaSl7aWYoIShyPWUubWF0Y2goaVsxXSkpKXRocm93IG5ldyBFcnJvcihpWzBdKyIgbm90IGZvdW5kIGluIHRoZW1lRWxlbWVudHMiKTtpWzJdKHIsdCxuKX0pKX0oblswXSxyLHQpLHIucmF3PWUscn1mdW5jdGlvbiBjVChlKXt2YXIgdD17fTtzd2l0Y2godC54Y2xyVHlwZT1lLnJlYWRfc2hpZnQoMiksdC5uVGludFNoYWRlPWUucmVhZF9zaGlmdCgyKSx0LnhjbHJUeXBlKXtjYXNlIDA6Y2FzZSA0OmUubCs9NDticmVhaztjYXNlIDE6dC54Y2xyVmFsdWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWHkoZSx0KX0oZSw0KTticmVhaztjYXNlIDI6dC54Y2xyVmFsdWU9a3goZSk7YnJlYWs7Y2FzZSAzOnQueGNsclZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlYWRfc2hpZnQoNCl9KGUpfXJldHVybiBlLmwrPTgsdH1mdW5jdGlvbiBzVChlKXt2YXIgdD1lLnJlYWRfc2hpZnQoMiksbj1lLnJlYWRfc2hpZnQoMiktNCxyPVt0XTtzd2l0Y2godCl7Y2FzZSA0OmNhc2UgNTpjYXNlIDc6Y2FzZSA4OmNhc2UgOTpjYXNlIDEwOmNhc2UgMTE6Y2FzZSAxMzpyWzFdPWNUKGUpO2JyZWFrO2Nhc2UgNjpyWzFdPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFh5KGUsdCl9KGUsbik7YnJlYWs7Y2FzZSAxNDpjYXNlIDE1OnJbMV09ZS5yZWFkX3NoaWZ0KDE9PT1uPzE6Mik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCBFeHRQcm9wIHR5cGU6ICIrdCsiICIrbil9cmV0dXJuIHJ9dmFyIGxUPS88KD86XHcrOik/c2hhcGUoPzpbXlx3XVtePl0qKT8+KFtcc1xTXSo/KTxcLyg/Olx3KzopP3NoYXBlPi9nO2Z1bmN0aW9uIHVUKGUsdCxuLHIpe3ZhciBpLGE9bnVsbCE9ZVsiIWRhdGEiXTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBvPWF2KHQucmVmKTtpZighKG8ucjwwfHxvLmM8MCkpe2lmKGE/KGVbIiFkYXRhIl1bby5yXXx8KGVbIiFkYXRhIl1bby5yXT1bXSksaT1lWyIhZGF0YSJdW28ucl1bby5jXSk6aT1lW3QucmVmXSwhaSl7aT17dDoieiJ9LGE/ZVsiIWRhdGEiXVtvLnJdW28uY109aTplW3QucmVmXT1pO3ZhciBjPWx2KGVbIiFyZWYiXXx8IkJEV0dPMTAwMDAwMTpBMSIpO2Mucy5yPm8uciYmKGMucy5yPW8uciksYy5lLnI8by5yJiYoYy5lLnI9by5yKSxjLnMuYz5vLmMmJihjLnMuYz1vLmMpLGMuZS5jPG8uYyYmKGMuZS5jPW8uYyk7dmFyIHM9c3YoYyk7ZVsiIXJlZiJdPXN9aS5jfHwoaS5jPVtdKTt2YXIgbD17YTp0LmF1dGhvcix0OnQudCxyOnQucixUOm59O3QuaCYmKGwuaD10LmgpO2Zvcih2YXIgdT1pLmMubGVuZ3RoLTE7dT49MDstLXUpe2lmKCFuJiZpLmNbdV0uVClyZXR1cm47biYmIWkuY1t1XS5UJiZpLmMuc3BsaWNlKHUsMSl9aWYobiYmcilmb3IodT0wO3U8ci5sZW5ndGg7Kyt1KWlmKGwuYT09clt1XS5pZCl7bC5hPXJbdV0ubmFtZXx8bC5hO2JyZWFrfWkuYy5wdXNoKGwpfX0pKX12YXIgZlQ9Z3Y7dmFyIGRUPSJhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNlLnZiYVByb2plY3QiO3ZhciBoVD1mdW5jdGlvbigpe3ZhciBlPS8oXnxbXkEtWmEtel9dKVIoXFs/LT9cZCtcXXxbMS05XVxkKnwpQyhcWz8tP1xkK1xdfFsxLTldXGQqfCkoPyFbQS1aYS16MC05X10pL2csdD17cjowLGM6MH07ZnVuY3Rpb24gbihlLG4scixpKXt2YXIgYT0hMSxvPSExOzA9PXIubGVuZ3RoP289ITA6IlsiPT1yLmNoYXJBdCgwKSYmKG89ITAscj1yLnNsaWNlKDEsLTEpKSwwPT1pLmxlbmd0aD9hPSEwOiJbIj09aS5jaGFyQXQoMCkmJihhPSEwLGk9aS5zbGljZSgxLC0xKSk7dmFyIGM9ci5sZW5ndGg+MD8wfHBhcnNlSW50KHIsMTApOjAscz1pLmxlbmd0aD4wPzB8cGFyc2VJbnQoaSwxMCk6MDtyZXR1cm4gYT9zKz10LmM6LS1zLG8/Yys9dC5yOi0tYyxuKyhhPyIiOiIkIikraXYocykrKG8/IiI6IiQiKStudihjKX1yZXR1cm4gZnVuY3Rpb24ocixpKXtyZXR1cm4gdD1pLHIucmVwbGFjZShlLG4pfX0oKSxwVD0vKF58W14uX0EtWjAtOV0pKFwkPykoW0EtWl17MSwyfXxbQS1XXVtBLVpdezJ9fFhbQS1FXVtBLVpdfFhGW0EtRF0pKFwkPykoXGR7MSw3fSkoPyFbXy5cKEEtWmEtejAtOV0pL2c7dHJ5e3BUPS8oXnxbXi5fQS1aMC05XSkoWyRdPykoW0EtWl17MSwyfXxbQS1XXVtBLVpdezJ9fFhbQS1FXVtBLVpdfFhGW0EtRF0pKFskXT8pKDEwWzAtM11cZHs0fXwxMDRbMC03XVxkezN9fDEwNDhbMC00XVxkezJ9fDEwNDg1WzAtNl1cZHwxMDQ4NTdbMC02XXxbMS05XVxkezAsNX0pKD8hW18uXChBLVphLXowLTldKS9nfWNhdGNoKGdFKXt9dmFyIGdUPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucmVwbGFjZShwVCwoZnVuY3Rpb24oZSxuLHIsaSxhLG8pe3ZhciBjPXJ2KGkpLShyPzA6dC5jKSxzPXR2KG8pLShhPzA6dC5yKTtyZXR1cm4gbisiUiIrKCIkIj09YT9zKzE6MD09cz8iIjoiWyIrcysiXSIpKyJDIisoIiQiPT1yP2MrMTowPT1jPyIiOiJbIitjKyJdIil9KSl9fSgpO2Z1bmN0aW9uIG1UKGUsdCl7cmV0dXJuIGUucmVwbGFjZShwVCwoZnVuY3Rpb24oZSxuLHIsaSxhLG8pe3JldHVybiBuKygiJCI9PXI/citpOml2KHJ2KGkpK3QuYykpKygiJCI9PWE/YStvOm52KHR2KG8pK3QucikpfSkpfWZ1bmN0aW9uIGJUKGUsdCxuKXt2YXIgcj1jdih0KS5zLGk9YXYobik7cmV0dXJuIG1UKGUse3I6aS5yLXIucixjOmkuYy1yLmN9KX1mdW5jdGlvbiB5VChlKXtyZXR1cm4gZS5yZXBsYWNlKC9feGxmblwuL2csIiIpfWZ1bmN0aW9uIHZUKGUpe2UubCs9MX1mdW5jdGlvbiB4VChlLHQpe3ZhciBuPWUucmVhZF9zaGlmdCgxPT10PzE6Mik7cmV0dXJuWzE2MzgzJm4sbj4+MTQmMSxuPj4xNSYxXX1mdW5jdGlvbiBEVChlLHQsbil7dmFyIHI9MjtpZihuKXtpZihuLmJpZmY+PTImJm4uYmlmZjw9NSlyZXR1cm4gVFQoZSk7MTI9PW4uYmlmZiYmKHI9NCl9dmFyIGk9ZS5yZWFkX3NoaWZ0KHIpLGE9ZS5yZWFkX3NoaWZ0KHIpLG89eFQoZSwyKSxjPXhUKGUsMik7cmV0dXJue3M6e3I6aSxjOm9bMF0sY1JlbDpvWzFdLHJSZWw6b1syXX0sZTp7cjphLGM6Y1swXSxjUmVsOmNbMV0sclJlbDpjWzJdfX19ZnVuY3Rpb24gVFQoZSl7dmFyIHQ9eFQoZSwyKSxuPXhUKGUsMikscj1lLnJlYWRfc2hpZnQoMSksaT1lLnJlYWRfc2hpZnQoMSk7cmV0dXJue3M6e3I6dFswXSxjOnIsY1JlbDp0WzFdLHJSZWw6dFsyXX0sZTp7cjpuWzBdLGM6aSxjUmVsOm5bMV0sclJlbDpuWzJdfX19ZnVuY3Rpb24gd1QoZSx0LG4pe2lmKG4mJm4uYmlmZj49MiYmbi5iaWZmPD01KXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD14VChlLDIpLG49ZS5yZWFkX3NoaWZ0KDEpO3JldHVybntyOnRbMF0sYzpuLGNSZWw6dFsxXSxyUmVsOnRbMl19fShlKTt2YXIgcj1lLnJlYWRfc2hpZnQobiYmMTI9PW4uYmlmZj80OjIpLGk9eFQoZSwyKTtyZXR1cm57cjpyLGM6aVswXSxjUmVsOmlbMV0sclJlbDppWzJdfX1mdW5jdGlvbiBfVChlKXt2YXIgdD1lLnJlYWRfc2hpZnQoMiksbj1lLnJlYWRfc2hpZnQoMik7cmV0dXJue3I6dCxjOjI1NSZuLGZRdW90ZWQ6ISEoMTYzODQmbiksY1JlbDpuPj4xNSxyUmVsOm4+PjE1fX1mdW5jdGlvbiBFVChlKXt2YXIgdD0xJmVbZS5sKzFdO3JldHVybiBlLmwrPTQsW3QsMV19ZnVuY3Rpb24gVVQoZSl7cmV0dXJuW2UucmVhZF9zaGlmdCgxKSxlLnJlYWRfc2hpZnQoMSldfWZ1bmN0aW9uIEFUKGUsdCl7dmFyIG49W2UucmVhZF9zaGlmdCgxKV07aWYoMTI9PXQpc3dpdGNoKG5bMF0pe2Nhc2UgMjpuWzBdPTQ7YnJlYWs7Y2FzZSA0Om5bMF09MTY7YnJlYWs7Y2FzZSAwOm5bMF09MTticmVhaztjYXNlIDE6blswXT0yfXN3aXRjaChuWzBdKXtjYXNlIDQ6blsxXT1ieChlLDEpPyJUUlVFIjoiRkFMU0UiLDEyIT10JiYoZS5sKz03KTticmVhaztjYXNlIDM3OmNhc2UgMTY6blsxXT16dltlW2UubF1dLGUubCs9MTI9PXQ/NDo4O2JyZWFrO2Nhc2UgMDplLmwrPTg7YnJlYWs7Y2FzZSAxOm5bMV09a3YoZSk7YnJlYWs7Y2FzZSAyOm5bMV09RXgoZSwwLHtiaWZmOnQ+MCYmdDw4PzI6dH0pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJCYWQgU2VyQXI6ICIrblswXSl9cmV0dXJuIG59ZnVuY3Rpb24ga1QoZSx0LG4pe2Zvcih2YXIgcj1lLnJlYWRfc2hpZnQoMTI9PW4uYmlmZj80OjIpLGk9W10sYT0wO2EhPXI7KythKWkucHVzaCgoMTI9PW4uYmlmZj9BdjpJeCkoZSkpO3JldHVybiBpfWZ1bmN0aW9uIFNUKGUsdCxuKXt2YXIgcj0wLGk9MDsxMj09bi5iaWZmPyhyPWUucmVhZF9zaGlmdCg0KSxpPWUucmVhZF9zaGlmdCg0KSk6KGk9MStlLnJlYWRfc2hpZnQoMSkscj0xK2UucmVhZF9zaGlmdCgyKSksbi5iaWZmPj0yJiZuLmJpZmY8OCYmKC0tciwwPT0tLWkmJihpPTI1NikpO2Zvcih2YXIgYT0wLG89W107YSE9ciYmKG9bYV09W10pOysrYSlmb3IodmFyIGM9MDtjIT1pOysrYylvW2FdW2NdPUFUKGUsbi5iaWZmKTtyZXR1cm4gb31mdW5jdGlvbiBDVChlLHQsbil7cmV0dXJuIGUubCs9MixbX1QoZSldfWZ1bmN0aW9uIEZUKGUpe3JldHVybiBlLmwrPTYsW119ZnVuY3Rpb24gT1QoZSl7cmV0dXJuIGUubCs9MixbeXgoZSksMSZlLnJlYWRfc2hpZnQoMildfXZhciBJVD1bIkRhdGEiLCJBbGwiLCJIZWFkZXJzIiwiPz8iLCI/RGF0YTIiLCI/PyIsIj9EYXRhSGVhZGVycyIsIj8/IiwiVG90YWxzIiwiPz8iLCI/PyIsIj8/IiwiP0RhdGFUb3RhbHMiLCI/PyIsIj8/IiwiPz8iLCI/Q3VycmVudCJdO3ZhciBSVD17MTp7bjoiUHRnRXhwIixmOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5sKyssbiYmMTI9PW4uYmlmZj9bZS5yZWFkX3NoaWZ0KDQsImkiKSwwXTpbZS5yZWFkX3NoaWZ0KDIpLGUucmVhZF9zaGlmdChuJiYyPT1uLmJpZmY/MToyKV19fSwyOntuOiJQdGdUYmwiLGY6WHl9LDM6e246IlB0Z0FkZCIsZjp2VH0sNDp7bjoiUHRnU3ViIixmOnZUfSw1OntuOiJQdGdNdWwiLGY6dlR9LDY6e246IlB0Z0RpdiIsZjp2VH0sNzp7bjoiUHRnUG93ZXIiLGY6dlR9LDg6e246IlB0Z0NvbmNhdCIsZjp2VH0sOTp7bjoiUHRnTHQiLGY6dlR9LDEwOntuOiJQdGdMZSIsZjp2VH0sMTE6e246IlB0Z0VxIixmOnZUfSwxMjp7bjoiUHRnR2UiLGY6dlR9LDEzOntuOiJQdGdHdCIsZjp2VH0sMTQ6e246IlB0Z05lIixmOnZUfSwxNTp7bjoiUHRnSXNlY3QiLGY6dlR9LDE2OntuOiJQdGdVbmlvbiIsZjp2VH0sMTc6e246IlB0Z1JhbmdlIixmOnZUfSwxODp7bjoiUHRnVXBsdXMiLGY6dlR9LDE5OntuOiJQdGdVbWludXMiLGY6dlR9LDIwOntuOiJQdGdQZXJjZW50IixmOnZUfSwyMTp7bjoiUHRnUGFyZW4iLGY6dlR9LDIyOntuOiJQdGdNaXNzQXJnIixmOnZUfSwyMzp7bjoiUHRnU3RyIixmOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5sKyssRHgoZSwwLG4pfX0sMjY6e246IlB0Z1NoZWV0IixmOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5sKz01LGUubCs9MixlLmwrPTI9PW4uYmlmZj8xOjQsWyJQVEdTSEVFVCJdfX0sMjc6e246IlB0Z0VuZFNoZWV0IixmOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5sKz0yPT1uLmJpZmY/NDo1LFsiUFRHRU5EU0hFRVQiXX19LDI4OntuOiJQdGdFcnIiLGY6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubCsrLHp2W2UucmVhZF9zaGlmdCgxKV19fSwyOTp7bjoiUHRnQm9vbCIsZjpmdW5jdGlvbihlKXtyZXR1cm4gZS5sKyssMCE9PWUucmVhZF9zaGlmdCgxKX19LDMwOntuOiJQdGdJbnQiLGY6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubCsrLGUucmVhZF9zaGlmdCgyKX19LDMxOntuOiJQdGdOdW0iLGY6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubCsrLGt2KGUpfX0sMzI6e246IlB0Z0FycmF5IixmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0oOTYmZVtlLmwrK10pPj41O3JldHVybiBlLmwrPTI9PW4uYmlmZj82OjEyPT1uLmJpZmY/MTQ6Nyxbcl19fSwzMzp7bjoiUHRnRnVuYyIsZjpmdW5jdGlvbihlLHQsbil7dmFyIHI9KDk2JmVbZS5sXSk+PjU7ZS5sKz0xO3ZhciBpPWUucmVhZF9zaGlmdChuJiZuLmJpZmY8PTM/MToyKTtyZXR1cm5bdHdbaV0sZXdbaV0scl19fSwzNDp7bjoiUHRnRnVuY1ZhciIsZjpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZVtlLmwrK10saT1lLnJlYWRfc2hpZnQoMSksYT1uJiZuLmJpZmY8PTM/Wzg4PT1yPy0xOjAsZS5yZWFkX3NoaWZ0KDEpXTpmdW5jdGlvbihlKXtyZXR1cm5bZVtlLmwrMV0+PjcsMzI3NjcmZS5yZWFkX3NoaWZ0KDIpXX0oZSk7cmV0dXJuW2ksKDA9PT1hWzBdP2V3OlFUKVthWzFdXV19fSwzNTp7bjoiUHRnTmFtZSIsZjpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5yZWFkX3NoaWZ0KDEpPj4+NSYzLGk9IW58fG4uYmlmZj49OD80OjIsYT1lLnJlYWRfc2hpZnQoaSk7c3dpdGNoKG4uYmlmZil7Y2FzZSAyOmUubCs9NTticmVhaztjYXNlIDM6Y2FzZSA0OmUubCs9ODticmVhaztjYXNlIDU6ZS5sKz0xMn1yZXR1cm5bciwwLGFdfX0sMzY6e246IlB0Z1JlZiIsZjpmdW5jdGlvbihlLHQsbil7dmFyIHI9KDk2JmVbZS5sXSk+PjU7cmV0dXJuIGUubCs9MSxbcix3VChlLDAsbildfX0sMzc6e246IlB0Z0FyZWEiLGY6ZnVuY3Rpb24oZSx0LG4pe3JldHVyblsoOTYmZVtlLmwrK10pPj41LERUKGUsbi5iaWZmPj0yJiZuLmJpZmYsbildfX0sMzg6e246IlB0Z01lbUFyZWEiLGY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUucmVhZF9zaGlmdCgxKT4+PjUmMztyZXR1cm4gZS5sKz1uJiYyPT1uLmJpZmY/Mzo0LFtyLGUucmVhZF9zaGlmdChuJiYyPT1uLmJpZmY/MToyKV19fSwzOTp7bjoiUHRnTWVtRXJyIixmOlh5fSw0MDp7bjoiUHRnTWVtTm9NZW0iLGY6WHl9LDQxOntuOiJQdGdNZW1GdW5jIixmOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bZS5yZWFkX3NoaWZ0KDEpPj4+NSYzLGUucmVhZF9zaGlmdChuJiYyPT1uLmJpZmY/MToyKV19fSw0Mjp7bjoiUHRnUmVmRXJyIixmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLnJlYWRfc2hpZnQoMSk+Pj41JjM7cmV0dXJuIGUubCs9NCxuLmJpZmY8OCYmZS5sLS0sMTI9PW4uYmlmZiYmKGUubCs9MiksW3JdfX0sNDM6e246IlB0Z0FyZWFFcnIiLGY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSg5NiZlW2UubCsrXSk+PjU7cmV0dXJuIGUubCs9biYmbi5iaWZmPjg/MTI6bi5iaWZmPDg/Njo4LFtyXX19LDQ0OntuOiJQdGdSZWZOIixmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0oOTYmZVtlLmxdKT4+NTtlLmwrPTE7dmFyIGk9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4mJm4uYmlmZj9uLmJpZmY6ODtpZihyPj0yJiZyPD01KXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLnJlYWRfc2hpZnQoMiksbj1lLnJlYWRfc2hpZnQoMSkscj0oMzI3NjgmdCk+PjE1LGk9KDE2Mzg0JnQpPj4xNDtyZXR1cm4gdCY9MTYzODMsMT09ciYmdD49ODE5MiYmKHQtPTE2Mzg0KSwxPT1pJiZuPj0xMjgmJihuLT0yNTYpLHtyOnQsYzpuLGNSZWw6aSxyUmVsOnJ9fShlKTt2YXIgaT1lLnJlYWRfc2hpZnQocj49MTI/NDoyKSxhPWUucmVhZF9zaGlmdCgyKSxvPSgxNjM4NCZhKT4+MTQsYz0oMzI3NjgmYSk+PjE1O2lmKGEmPTE2MzgzLDE9PWMpZm9yKDtpPjUyNDI4NzspaS09MTA0ODU3NjtpZigxPT1vKWZvcig7YT44MTkxOylhLT0xNjM4NDtyZXR1cm57cjppLGM6YSxjUmVsOm8sclJlbDpjfX0oZSwwLG4pO3JldHVybltyLGldfX0sNDU6e246IlB0Z0FyZWFOIixmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0oOTYmZVtlLmwrK10pPj41LGk9ZnVuY3Rpb24oZSx0LG4pe2lmKG4uYmlmZjw4KXJldHVybiBUVChlKTt2YXIgcj1lLnJlYWRfc2hpZnQoMTI9PW4uYmlmZj80OjIpLGk9ZS5yZWFkX3NoaWZ0KDEyPT1uLmJpZmY/NDoyKSxhPXhUKGUsMiksbz14VChlLDIpO3JldHVybntzOntyOnIsYzphWzBdLGNSZWw6YVsxXSxyUmVsOmFbMl19LGU6e3I6aSxjOm9bMF0sY1JlbDpvWzFdLHJSZWw6b1syXX19fShlLDAsbik7cmV0dXJuW3IsaV19fSw0Njp7bjoiUHRnTWVtQXJlYU4iLGY6ZnVuY3Rpb24oZSl7cmV0dXJuW2UucmVhZF9zaGlmdCgxKT4+PjUmMyxlLnJlYWRfc2hpZnQoMildfX0sNDc6e246IlB0Z01lbU5vTWVtTiIsZjpmdW5jdGlvbihlKXtyZXR1cm5bZS5yZWFkX3NoaWZ0KDEpPj4+NSYzLGUucmVhZF9zaGlmdCgyKV19fSw1Nzp7bjoiUHRnTmFtZVgiLGY6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiA1PT1uLmJpZmY/ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZWFkX3NoaWZ0KDEpPj4+NSYzLG49ZS5yZWFkX3NoaWZ0KDIsImkiKTtlLmwrPTg7dmFyIHI9ZS5yZWFkX3NoaWZ0KDIpO3JldHVybiBlLmwrPTEyLFt0LG4scl19KGUpOltlLnJlYWRfc2hpZnQoMSk+Pj41JjMsZS5yZWFkX3NoaWZ0KDIpLGUucmVhZF9zaGlmdCg0KV19fSw1ODp7bjoiUHRnUmVmM2QiLGY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSg5NiZlW2UubF0pPj41O2UubCs9MTt2YXIgaT1lLnJlYWRfc2hpZnQoMik7cmV0dXJuIG4mJjU9PW4uYmlmZiYmKGUubCs9MTIpLFtyLGksd1QoZSwwLG4pXX19LDU5OntuOiJQdGdBcmVhM2QiLGY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSg5NiZlW2UubCsrXSk+PjUsaT1lLnJlYWRfc2hpZnQoMiwiaSIpO2lmKG4pc3dpdGNoKG4uYmlmZil7Y2FzZSA1OmUubCs9MTIsNjticmVhaztjYXNlIDEyOjEyfXJldHVybltyLGksRFQoZSwwLG4pXX19LDYwOntuOiJQdGdSZWZFcnIzZCIsZjpmdW5jdGlvbihlLHQsbil7dmFyIHI9KDk2JmVbZS5sKytdKT4+NSxpPWUucmVhZF9zaGlmdCgyKSxhPTQ7aWYobilzd2l0Y2gobi5iaWZmKXtjYXNlIDU6YT0xNTticmVhaztjYXNlIDEyOmE9Nn1yZXR1cm4gZS5sKz1hLFtyLGldfX0sNjE6e246IlB0Z0FyZWFFcnIzZCIsZjpmdW5jdGlvbihlLHQsbil7dmFyIHI9KDk2JmVbZS5sKytdKT4+NSxpPWUucmVhZF9zaGlmdCgyKSxhPTg7aWYobilzd2l0Y2gobi5iaWZmKXtjYXNlIDU6ZS5sKz0xMixhPTY7YnJlYWs7Y2FzZSAxMjphPTEyfXJldHVybiBlLmwrPWEsW3IsaV19fSwyNTU6e319LE5UPXs2NDozMiw5NjozMiw2NTozMyw5NzozMyw2NjozNCw5ODozNCw2NzozNSw5OTozNSw2ODozNiwxMDA6MzYsNjk6MzcsMTAxOjM3LDcwOjM4LDEwMjozOCw3MTozOSwxMDM6MzksNzI6NDAsMTA0OjQwLDczOjQxLDEwNTo0MSw3NDo0MiwxMDY6NDIsNzU6NDMsMTA3OjQzLDc2OjQ0LDEwODo0NCw3Nzo0NSwxMDk6NDUsNzg6NDYsMTEwOjQ2LDc5OjQ3LDExMTo0Nyw4ODozNCwxMjA6MzQsODk6NTcsMTIxOjU3LDkwOjU4LDEyMjo1OCw5MTo1OSwxMjM6NTksOTI6NjAsMTI0OjYwLDkzOjYxLDEyNTo2MX0sUFQ9ezE6e246IlB0Z0VsZkxlbCIsZjpPVH0sMjp7bjoiUHRnRWxmUnciLGY6Q1R9LDM6e246IlB0Z0VsZkNvbCIsZjpDVH0sNjp7bjoiUHRnRWxmUndWIixmOkNUfSw3OntuOiJQdGdFbGZDb2xWIixmOkNUfSwxMDp7bjoiUHRnRWxmUmFkaWNhbCIsZjpDVH0sMTE6e246IlB0Z0VsZlJhZGljYWxTIixmOkZUfSwxMzp7bjoiUHRnRWxmQ29sUyIsZjpGVH0sMTU6e246IlB0Z0VsZkNvbFNWIixmOkZUfSwxNjp7bjoiUHRnRWxmUmFkaWNhbExlbCIsZjpPVH0sMjU6e246IlB0Z0xpc3QiLGY6ZnVuY3Rpb24oZSl7ZS5sKz0yO3ZhciB0PWUucmVhZF9zaGlmdCgyKSxuPWUucmVhZF9zaGlmdCgyKSxyPWUucmVhZF9zaGlmdCg0KSxpPWUucmVhZF9zaGlmdCgyKSxhPWUucmVhZF9zaGlmdCgyKTtyZXR1cm57aXh0aTp0LGNvbHR5cGU6MyZuLHJ0OklUW24+PjImMzFdLGlkeDpyLGM6aSxDOmF9fX0sMjk6e246IlB0Z1N4TmFtZSIsZjpmdW5jdGlvbihlKXtyZXR1cm4gZS5sKz0yLFtlLnJlYWRfc2hpZnQoNCldfX0sMjU1Ont9fSxCVD17MDp7bjoiUHRnQXR0ck5vb3AiLGY6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubCs9NCxbMCwwXX19LDE6e246IlB0Z0F0dHJTZW1pIixmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0yNTUmZVtlLmwrMV0/MTowO3JldHVybiBlLmwrPW4mJjI9PW4uYmlmZj8zOjQsW3JdfX0sMjp7bjoiUHRnQXR0cklmIixmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0yNTUmZVtlLmwrMV0/MTowO3JldHVybiBlLmwrPTIsW3IsZS5yZWFkX3NoaWZ0KG4mJjI9PW4uYmlmZj8xOjIpXX19LDQ6e246IlB0Z0F0dHJDaG9vc2UiLGY6ZnVuY3Rpb24oZSx0LG4pe2UubCs9Mjtmb3IodmFyIHI9ZS5yZWFkX3NoaWZ0KG4mJjI9PW4uYmlmZj8xOjIpLGk9W10sYT0wO2E8PXI7KythKWkucHVzaChlLnJlYWRfc2hpZnQobiYmMj09bi5iaWZmPzE6MikpO3JldHVybiBpfX0sODp7bjoiUHRnQXR0ckdvdG8iLGY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPTI1NSZlW2UubCsxXT8xOjA7cmV0dXJuIGUubCs9MixbcixlLnJlYWRfc2hpZnQobiYmMj09bi5iaWZmPzE6MildfX0sMTY6e246IlB0Z0F0dHJTdW0iLGY6ZnVuY3Rpb24oZSx0LG4pe2UubCs9biYmMj09bi5iaWZmPzM6NH19LDMyOntuOiJQdGdBdHRyQmF4Y2VsIixmOkVUfSwzMzp7bjoiUHRnQXR0ckJheGNlbCIsZjpFVH0sNjQ6e246IlB0Z0F0dHJTcGFjZSIsZjpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWFkX3NoaWZ0KDIpLFVUKGUpfX0sNjU6e246IlB0Z0F0dHJTcGFjZVNlbWkiLGY6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVhZF9zaGlmdCgyKSxVVChlKX19LDEyODp7bjoiUHRnQXR0cklmRXJyb3IiLGY6ZnVuY3Rpb24oZSl7dmFyIHQ9MjU1JmVbZS5sKzFdPzE6MDtyZXR1cm4gZS5sKz0yLFt0LGUucmVhZF9zaGlmdCgyKV19fSwyNTU6e319O2Z1bmN0aW9uIFdUKGUsdCxuLHIpe2lmKHIuYmlmZjw4KXJldHVybiBYeShlLHQpO2Zvcih2YXIgaT1lLmwrdCxhPVtdLG89MDtvIT09bi5sZW5ndGg7KytvKXN3aXRjaChuW29dWzBdKXtjYXNlIlB0Z0FycmF5IjpuW29dWzFdPVNUKGUsMCxyKSxhLnB1c2gobltvXVsxXSk7YnJlYWs7Y2FzZSJQdGdNZW1BcmVhIjpuW29dWzJdPWtUKGUsbltvXVsxXSxyKSxhLnB1c2gobltvXVsyXSk7YnJlYWs7Y2FzZSJQdGdFeHAiOnImJjEyPT1yLmJpZmYmJihuW29dWzFdWzFdPWUucmVhZF9zaGlmdCg0KSxhLnB1c2gobltvXVsxXSkpO2JyZWFrO2Nhc2UiUHRnTGlzdCI6Y2FzZSJQdGdFbGZSYWRpY2FsUyI6Y2FzZSJQdGdFbGZDb2xTIjpjYXNlIlB0Z0VsZkNvbFNWIjp0aHJvdyJVbnN1cHBvcnRlZCAiK25bb11bMF19cmV0dXJuIDAhPT0odD1pLWUubCkmJmEucHVzaChYeShlLHQpKSxhfWZ1bmN0aW9uIExUKGUsdCxuKXtmb3IodmFyIHIsaSxhPWUubCt0LG89W107YSE9ZS5sOyl0PWEtZS5sLGk9ZVtlLmxdLHI9UlRbaV18fFJUW05UW2ldXSwyNCE9PWkmJjI1IT09aXx8KHI9KDI0PT09aT9QVDpCVClbZVtlLmwrMV1dKSxyJiZyLmY/by5wdXNoKFtyLm4sci5mKGUsdCxuKV0pOlh5KGUsdCk7cmV0dXJuIG99ZnVuY3Rpb24gTVQoZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOysrbil7Zm9yKHZhciByPWVbbl0saT1bXSxhPTA7YTxyLmxlbmd0aDsrK2Epe3ZhciBvPXJbYV07aWYobylpZigyPT09b1swXSlpLnB1c2goJyInK29bMV0ucmVwbGFjZSgvIi9nLCciIicpKyciJyk7ZWxzZSBpLnB1c2gob1sxXSk7ZWxzZSBpLnB1c2goIiIpfXQucHVzaChpLmpvaW4oIiwiKSl9cmV0dXJuIHQuam9pbigiOyIpfXZhciBqVD17UHRnQWRkOiIrIixQdGdDb25jYXQ6IiYiLFB0Z0RpdjoiLyIsUHRnRXE6Ij0iLFB0Z0dlOiI+PSIsUHRnR3Q6Ij4iLFB0Z0xlOiI8PSIsUHRnTHQ6IjwiLFB0Z011bDoiKiIsUHRnTmU6Ijw+IixQdGdQb3dlcjoiXiIsUHRnU3ViOiItIn07ZnVuY3Rpb24gelQoZSx0LG4pe2lmKCFlKXJldHVybiJTSDMzVEpTRVJSMCI7aWYobi5iaWZmPjgmJighZS5YVEl8fCFlLlhUSVt0XSkpcmV0dXJuIGUuU2hlZXROYW1lc1t0XTtpZighZS5YVEkpcmV0dXJuIlNIMzNUSlNFUlI2Ijt2YXIgcj1lLlhUSVt0XTtpZihuLmJpZmY8OClyZXR1cm4gdD4xZTQmJih0LT02NTUzNiksdDwwJiYodD0tdCksMD09dD8iIjplLlhUSVt0LTFdO2lmKCFyKXJldHVybiJTSDMzVEpTRVJSMSI7dmFyIGk9IiI7aWYobi5iaWZmPjgpc3dpdGNoKGVbclswXV1bMF0pe2Nhc2UgMzU3OnJldHVybiBpPS0xPT1yWzFdPyIjUkVGIjplLlNoZWV0TmFtZXNbclsxXV0sclsxXT09clsyXT9pOmkrIjoiK2UuU2hlZXROYW1lc1tyWzJdXTtjYXNlIDM1ODpyZXR1cm4gbnVsbCE9bi5TSUQ/ZS5TaGVldE5hbWVzW24uU0lEXToiU0gzM1RKU1NBTUUiK2VbclswXV1bMF07ZGVmYXVsdDpyZXR1cm4iU0gzM1RKU1NSQyIrZVtyWzBdXVswXX1zd2l0Y2goZVtyWzBdXVswXVswXSl7Y2FzZSAxMDI1OnJldHVybiBpPS0xPT1yWzFdPyIjUkVGIjplLlNoZWV0TmFtZXNbclsxXV18fCJTSDMzVEpTRVJSMyIsclsxXT09clsyXT9pOmkrIjoiK2UuU2hlZXROYW1lc1tyWzJdXTtjYXNlIDE0ODQ5OnJldHVybiBlW3JbMF1dLnNsaWNlKDEpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuTmFtZX0pKS5qb2luKCI7OyIpO2RlZmF1bHQ6cmV0dXJuIGVbclswXV1bMF1bM10/KGk9LTE9PXJbMV0/IiNSRUYiOmVbclswXV1bMF1bM11bclsxXV18fCJTSDMzVEpTRVJSNCIsclsxXT09clsyXT9pOmkrIjoiK2VbclswXV1bMF1bM11bclsyXV0pOiJTSDMzVEpTRVJSMiJ9fWZ1bmN0aW9uIEhUKGUsdCxuKXt2YXIgcj16VChlLHQsbik7cmV0dXJuIiNSRUYiPT1yP3I6ZnVuY3Rpb24oZSx0KXtpZighKGV8fHQmJnQuYmlmZjw9NSYmdC5iaWZmPj0yKSl0aHJvdyBuZXcgRXJyb3IoImVtcHR5IHNoZWV0IG5hbWUiKTtyZXR1cm4vW15cd1x1NEUwMC1cdTlGRkZcdTMwNDAtXHUzMEZGXS8udGVzdChlKT8iJyIrZS5yZXBsYWNlKC8nL2csIicnIikrIiciOmV9KHIsbil9ZnVuY3Rpb24gVlQoZSx0LG4scixpKXt2YXIgYSxvLGMscyxsPWkmJmkuYmlmZnx8OCx1PXtzOntjOjAscjowfSxlOntjOjAscjowfX0sZj1bXSxkPTAsaD0wLHA9IiI7aWYoIWVbMF18fCFlWzBdWzBdKXJldHVybiIiO2Zvcih2YXIgZyxtLGIseSx2PS0xLHg9IiIsRD0wLFQ9ZVswXS5sZW5ndGg7RDxUOysrRCl7dmFyIHc9ZVswXVtEXTtzd2l0Y2god1swXSl7Y2FzZSJQdGdVbWludXMiOmYucHVzaCgiLSIrZi5wb3AoKSk7YnJlYWs7Y2FzZSJQdGdVcGx1cyI6Zi5wdXNoKCIrIitmLnBvcCgpKTticmVhaztjYXNlIlB0Z1BlcmNlbnQiOmYucHVzaChmLnBvcCgpKyIlIik7YnJlYWs7Y2FzZSJQdGdBZGQiOmNhc2UiUHRnQ29uY2F0IjpjYXNlIlB0Z0RpdiI6Y2FzZSJQdGdFcSI6Y2FzZSJQdGdHZSI6Y2FzZSJQdGdHdCI6Y2FzZSJQdGdMZSI6Y2FzZSJQdGdMdCI6Y2FzZSJQdGdNdWwiOmNhc2UiUHRnTmUiOmNhc2UiUHRnUG93ZXIiOmNhc2UiUHRnU3ViIjppZihhPWYucG9wKCksbz1mLnBvcCgpLHY+PTApe3N3aXRjaChlWzBdW3ZdWzFdWzBdKXtjYXNlIDA6eD1mYigiICIsZVswXVt2XVsxXVsxXSk7YnJlYWs7Y2FzZSAxOng9ZmIoIlxyIixlWzBdW3ZdWzFdWzFdKTticmVhaztkZWZhdWx0OmlmKHg9IiIsaS5XVEYpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIFB0Z0F0dHJTcGFjZVR5cGUgIitlWzBdW3ZdWzFdWzBdKX1vKz14LHY9LTF9Zi5wdXNoKG8ralRbd1swXV0rYSk7YnJlYWs7Y2FzZSJQdGdJc2VjdCI6YT1mLnBvcCgpLG89Zi5wb3AoKSxmLnB1c2gobysiICIrYSk7YnJlYWs7Y2FzZSJQdGdVbmlvbiI6YT1mLnBvcCgpLG89Zi5wb3AoKSxmLnB1c2gobysiLCIrYSk7YnJlYWs7Y2FzZSJQdGdSYW5nZSI6YT1mLnBvcCgpLG89Zi5wb3AoKSxmLnB1c2goKG09YSxiPXZvaWQgMCx5PXZvaWQgMCxiPShnPW8pLmxhc3RJbmRleE9mKCIhIikseT1tLmxhc3RJbmRleE9mKCIhIiksLTE9PWImJi0xPT15P2crIjoiK206Yj4wJiZ5PjAmJmcuc2xpY2UoMCxiKS50b0xvd2VyQ2FzZSgpPT1tLnNsaWNlKDAseSkudG9Mb3dlckNhc2UoKT9nKyI6IittLnNsaWNlKHkrMSk6KGNvbnNvbGUuZXJyb3IoIkNhbm5vdCBoeWRyYXRlIHJhbmdlIixnLG0pLGcrIjoiK20pKSk7YnJlYWs7Y2FzZSJQdGdBdHRyQ2hvb3NlIjpjYXNlIlB0Z0F0dHJHb3RvIjpjYXNlIlB0Z0F0dHJJZiI6Y2FzZSJQdGdBdHRySWZFcnJvciI6Y2FzZSJQdGdBdHRyQmF4Y2VsIjpjYXNlIlB0Z0F0dHJTZW1pIjpjYXNlIlB0Z01lbUFyZWEiOmNhc2UiUHRnVGJsIjpjYXNlIlB0Z01lbUVyciI6Y2FzZSJQdGdNZW1BcmVhTiI6Y2FzZSJQdGdNZW1Ob01lbU4iOmNhc2UiUHRnQXR0ck5vb3AiOmNhc2UiUHRnU2hlZXQiOmNhc2UiUHRnRW5kU2hlZXQiOmNhc2UiUHRnTWVtRnVuYyI6Y2FzZSJQdGdNZW1Ob01lbSI6YnJlYWs7Y2FzZSJQdGdSZWYiOmM9Wnkod1sxXVsxXSx1LGkpLGYucHVzaChReShjLGwpKTticmVhaztjYXNlIlB0Z1JlZk4iOmM9bj9aeSh3WzFdWzFdLG4saSk6d1sxXVsxXSxmLnB1c2goUXkoYyxsKSk7YnJlYWs7Y2FzZSJQdGdSZWYzZCI6ZD13WzFdWzFdLGM9Wnkod1sxXVsyXSx1LGkpLHA9SFQocixkLGkpLGYucHVzaChwKyIhIitReShjLGwpKTticmVhaztjYXNlIlB0Z0Z1bmMiOmNhc2UiUHRnRnVuY1ZhciI6dmFyIF89d1sxXVswXSxFPXdbMV1bMV07X3x8KF89MCk7dmFyIFU9MD09KF8mPTEyNyk/W106Zi5zbGljZSgtXyk7Zi5sZW5ndGgtPV8sIlVzZXIiPT09RSYmKEU9VS5zaGlmdCgpKSxmLnB1c2goRSsiKCIrVS5qb2luKCIsIikrIikiKTticmVhaztjYXNlIlB0Z0Jvb2wiOmYucHVzaCh3WzFdPyJUUlVFIjoiRkFMU0UiKTticmVhaztjYXNlIlB0Z0ludCI6Y2FzZSJQdGdFcnIiOmYucHVzaCh3WzFdKTticmVhaztjYXNlIlB0Z051bSI6Zi5wdXNoKFN0cmluZyh3WzFdKSk7YnJlYWs7Y2FzZSJQdGdTdHIiOmYucHVzaCgnIicrd1sxXS5yZXBsYWNlKC8iL2csJyIiJykrJyInKTticmVhaztjYXNlIlB0Z0FyZWFOIjpzPUp5KHdbMV1bMV0sbj97czpufTp1LGkpLGYucHVzaChldihzLGkpKTticmVhaztjYXNlIlB0Z0FyZWEiOnM9Snkod1sxXVsxXSx1LGkpLGYucHVzaChldihzLGkpKTticmVhaztjYXNlIlB0Z0FyZWEzZCI6ZD13WzFdWzFdLHM9d1sxXVsyXSxwPUhUKHIsZCxpKSxmLnB1c2gocCsiISIrZXYocyxpKSk7YnJlYWs7Y2FzZSJQdGdBdHRyU3VtIjpmLnB1c2goIlNVTSgiK2YucG9wKCkrIikiKTticmVhaztjYXNlIlB0Z05hbWUiOmg9d1sxXVsyXTt2YXIgQT0oci5uYW1lc3x8W10pW2gtMV18fChyWzBdfHxbXSlbaF0saz1BP0EuTmFtZToiU0gzM1RKU05BTUUiK1N0cmluZyhoKTtrJiYiX3hsZm4uIj09ay5zbGljZSgwLDYpJiYhaS54bGZuJiYoaz1rLnNsaWNlKDYpKSxmLnB1c2goayk7YnJlYWs7Y2FzZSJQdGdOYW1lWCI6dmFyIFMsQz13WzFdWzFdO2lmKGg9d1sxXVsyXSwhKGkuYmlmZjw9NSkpe3ZhciBGPSIiO2lmKDE0ODQ5PT0oKHJbQ118fFtdKVswXXx8W10pWzBdfHwoMTAyNT09KChyW0NdfHxbXSlbMF18fFtdKVswXT9yW0NdW2hdJiZyW0NdW2hdLml0YWI+MCYmKEY9ci5TaGVldE5hbWVzW3JbQ11baF0uaXRhYi0xXSsiISIpOkY9ci5TaGVldE5hbWVzW2gtMV0rIiEiKSxyW0NdJiZyW0NdW2hdKUYrPXJbQ11baF0uTmFtZTtlbHNlIGlmKHJbMF0mJnJbMF1baF0pRis9clswXVtoXS5OYW1lO2Vsc2V7dmFyIE89KHpUKHIsQyxpKXx8IiIpLnNwbGl0KCI7OyIpO09baC0xXT9GPU9baC0xXTpGKz0iU0gzM1RKU0VSUlgifWYucHVzaChGKTticmVha31DPDAmJihDPS1DKSxyW0NdJiYoUz1yW0NdW2hdKSxTfHwoUz17TmFtZToiU0gzM1RKU0VSUlkifSksZi5wdXNoKFMuTmFtZSk7YnJlYWs7Y2FzZSJQdGdQYXJlbiI6dmFyIEk9IigiLFI9IikiO2lmKHY+PTApe3N3aXRjaCh4PSIiLGVbMF1bdl1bMV1bMF0pe2Nhc2UgMjpJPWZiKCIgIixlWzBdW3ZdWzFdWzFdKStJO2JyZWFrO2Nhc2UgMzpJPWZiKCJcciIsZVswXVt2XVsxXVsxXSkrSTticmVhaztjYXNlIDQ6Uj1mYigiICIsZVswXVt2XVsxXVsxXSkrUjticmVhaztjYXNlIDU6Uj1mYigiXHIiLGVbMF1bdl1bMV1bMV0pK1I7YnJlYWs7ZGVmYXVsdDppZihpLldURil0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgUHRnQXR0clNwYWNlVHlwZSAiK2VbMF1bdl1bMV1bMF0pfXY9LTF9Zi5wdXNoKEkrZi5wb3AoKStSKTticmVhaztjYXNlIlB0Z1JlZkVyciI6Y2FzZSJQdGdSZWZFcnIzZCI6Y2FzZSJQdGdBcmVhRXJyIjpjYXNlIlB0Z0FyZWFFcnIzZCI6Zi5wdXNoKCIjUkVGISIpO2JyZWFrO2Nhc2UiUHRnRXhwIjpjPXtjOndbMV1bMV0scjp3WzFdWzBdfTt2YXIgTj17YzpuLmMscjpuLnJ9O2lmKHIuc2hhcmVkZltvdihjKV0pe3ZhciBQPXIuc2hhcmVkZltvdihjKV07Zi5wdXNoKFZUKFAsdSxOLHIsaSkpfWVsc2V7dmFyIEI9ITE7Zm9yKGE9MDthIT1yLmFycmF5Zi5sZW5ndGg7KythKWlmKG89ci5hcnJheWZbYV0sIShjLmM8b1swXS5zLmN8fGMuYz5vWzBdLmUuY3x8Yy5yPG9bMF0ucy5yfHxjLnI+b1swXS5lLnIpKXtmLnB1c2goVlQob1sxXSx1LE4scixpKSksQj0hMDticmVha31CfHxmLnB1c2god1sxXSl9YnJlYWs7Y2FzZSJQdGdBcnJheSI6Zi5wdXNoKCJ7IitNVCh3WzFdKSsifSIpO2JyZWFrO2Nhc2UiUHRnQXR0clNwYWNlIjpjYXNlIlB0Z0F0dHJTcGFjZVNlbWkiOnY9RDticmVhaztjYXNlIlB0Z01pc3NBcmciOmYucHVzaCgiIik7YnJlYWs7Y2FzZSJQdGdMaXN0IjpmLnB1c2goIlRhYmxlIit3WzFdLmlkeCsiWyMiK3dbMV0ucnQrIl0iKTticmVhaztjYXNlIlB0Z0VsZkNvbCI6Y2FzZSJQdGdFbGZDb2xTIjpjYXNlIlB0Z0VsZkNvbFNWIjpjYXNlIlB0Z0VsZkNvbFYiOmNhc2UiUHRnRWxmTGVsIjpjYXNlIlB0Z0VsZlJhZGljYWwiOmNhc2UiUHRnRWxmUmFkaWNhbExlbCI6Y2FzZSJQdGdFbGZSYWRpY2FsUyI6Y2FzZSJQdGdFbGZSdyI6Y2FzZSJQdGdFbGZSd1YiOnRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgRUxGcyIpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgRm9ybXVsYSBUb2tlbjogIitTdHJpbmcodykpfWlmKDMhPWkuYmlmZiYmdj49MCYmLTE9PVsiUHRnQXR0clNwYWNlIiwiUHRnQXR0clNwYWNlU2VtaSIsIlB0Z0F0dHJHb3RvIl0uaW5kZXhPZihlWzBdW0RdWzBdKSl7dmFyIFc9ITA7c3dpdGNoKCh3PWVbMF1bdl0pWzFdWzBdKXtjYXNlIDQ6Vz0hMTtjYXNlIDA6eD1mYigiICIsd1sxXVsxXSk7YnJlYWs7Y2FzZSA1Olc9ITE7Y2FzZSAxOng9ZmIoIlxyIix3WzFdWzFdKTticmVhaztkZWZhdWx0OmlmKHg9IiIsaS5XVEYpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIFB0Z0F0dHJTcGFjZVR5cGUgIit3WzFdWzBdKX1mLnB1c2goKFc/eDoiIikrZi5wb3AoKSsoVz8iIjp4KSksdj0tMX19aWYoZi5sZW5ndGg+MSYmaS5XVEYpdGhyb3cgbmV3IEVycm9yKCJiYWQgZm9ybXVsYSBzdGFjayIpO3JldHVybiJUUlVFIj09ZlswXXx8IkZBTFNFIiE9ZlswXSYmZlswXX1mdW5jdGlvbiBxVChlLHQsbil7dmFyIHIsaT1lLmwrdCxhPTI9PW4uYmlmZj8xOjIsbz1lLnJlYWRfc2hpZnQoYSk7aWYoNjU1MzU9PW8pcmV0dXJuW1tdLFh5KGUsdC0yKV07dmFyIGM9TFQoZSxvLG4pO3JldHVybiB0IT09bythJiYocj1XVChlLHQtby1hLGMsbikpLGUubD1pLFtjLHJdfWZ1bmN0aW9uIEdUKGUsdCxuKXt2YXIgcixpPWUubCt0LGE9ZS5yZWFkX3NoaWZ0KDIpLG89TFQoZSxhLG4pO3JldHVybiA2NTUzNT09YT9bW10sWHkoZSx0LTIpXToodCE9PWErMiYmKHI9V1QoZSxpLWEtMixvLG4pKSxbbyxyXSl9ZnVuY3Rpb24gWFQoZSx0LG4pe3ZhciByPWUubCt0LGk9Q3goZSw2LG4pLGE9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoNjU1MzUhPT1OeShlLGUubCs2KSlyZXR1cm5ba3YoZSksIm4iXTtzd2l0Y2goZVtlLmxdKXtjYXNlIDA6cmV0dXJuIGUubCs9OCxbIlN0cmluZyIsInMiXTtjYXNlIDE6cmV0dXJuIHQ9MT09PWVbZS5sKzJdLGUubCs9OCxbdCwiYiJdO2Nhc2UgMjpyZXR1cm4gdD1lW2UubCsyXSxlLmwrPTgsW3QsImUiXTtjYXNlIDM6cmV0dXJuIGUubCs9OCxbIiIsInMiXX1yZXR1cm5bXX0oZSksbz1lLnJlYWRfc2hpZnQoMSk7MiE9bi5iaWZmJiYoZS5yZWFkX3NoaWZ0KDEpLG4uYmlmZj49NSYmZS5yZWFkX3NoaWZ0KDQpKTt2YXIgYz1mdW5jdGlvbihlLHQsbil7dmFyIHIsaT1lLmwrdCxhPTI9PW4uYmlmZj8xOjIsbz1lLnJlYWRfc2hpZnQoYSk7aWYoNjU1MzU9PW8pcmV0dXJuW1tdLFh5KGUsdC0yKV07dmFyIGM9TFQoZSxvLG4pO3JldHVybiB0IT09bythJiYocj1XVChlLHQtby1hLGMsbikpLGUubD1pLFtjLHJdfShlLHItZS5sLG4pO3JldHVybntjZWxsOmksdmFsOmFbMF0sZm9ybXVsYTpjLHNoYXJlZDpvPj4zJjEsdHQ6YVsxXX19ZnVuY3Rpb24gJFQoZSx0LG4pe3ZhciByPWUucmVhZF9zaGlmdCg0KSxpPUxUKGUscixuKSxhPWUucmVhZF9zaGlmdCg0KTtyZXR1cm5baSxhPjA/V1QoZSxhLGksbik6bnVsbF19dmFyIFlUPSRULEtUPSRULFpUPSRULEpUPSRULFFUPXswOiJCRUVQIiwxOiJPUEVOIiwyOiJPUEVOLkxJTktTIiwzOiJDTE9TRS5BTEwiLDQ6IlNBVkUiLDU6IlNBVkUuQVMiLDY6IkZJTEUuREVMRVRFIiw3OiJQQUdFLlNFVFVQIiw4OiJQUklOVCIsOToiUFJJTlRFUi5TRVRVUCIsMTA6IlFVSVQiLDExOiJORVcuV0lORE9XIiwxMjoiQVJSQU5HRS5BTEwiLDEzOiJXSU5ET1cuU0laRSIsMTQ6IldJTkRPVy5NT1ZFIiwxNToiRlVMTCIsMTY6IkNMT1NFIiwxNzoiUlVOIiwyMjoiU0VULlBSSU5ULkFSRUEiLDIzOiJTRVQuUFJJTlQuVElUTEVTIiwyNDoiU0VULlBBR0UuQlJFQUsiLDI1OiJSRU1PVkUuUEFHRS5CUkVBSyIsMjY6IkZPTlQiLDI3OiJESVNQTEFZIiwyODoiUFJPVEVDVC5ET0NVTUVOVCIsMjk6IlBSRUNJU0lPTiIsMzA6IkExLlIxQzEiLDMxOiJDQUxDVUxBVEUuTk9XIiwzMjoiQ0FMQ1VMQVRJT04iLDM0OiJEQVRBLkZJTkQiLDM1OiJFWFRSQUNUIiwzNjoiREFUQS5ERUxFVEUiLDM3OiJTRVQuREFUQUJBU0UiLDM4OiJTRVQuQ1JJVEVSSUEiLDM5OiJTT1JUIiw0MDoiREFUQS5TRVJJRVMiLDQxOiJUQUJMRSIsNDI6IkZPUk1BVC5OVU1CRVIiLDQzOiJBTElHTk1FTlQiLDQ0OiJTVFlMRSIsNDU6IkJPUkRFUiIsNDY6IkNFTEwuUFJPVEVDVElPTiIsNDc6IkNPTFVNTi5XSURUSCIsNDg6IlVORE8iLDQ5OiJDVVQiLDUwOiJDT1BZIiw1MToiUEFTVEUiLDUyOiJDTEVBUiIsNTM6IlBBU1RFLlNQRUNJQUwiLDU0OiJFRElULkRFTEVURSIsNTU6IklOU0VSVCIsNTY6IkZJTEwuUklHSFQiLDU3OiJGSUxMLkRPV04iLDYxOiJERUZJTkUuTkFNRSIsNjI6IkNSRUFURS5OQU1FUyIsNjM6IkZPUk1VTEEuR09UTyIsNjQ6IkZPUk1VTEEuRklORCIsNjU6IlNFTEVDVC5MQVNULkNFTEwiLDY2OiJTSE9XLkFDVElWRS5DRUxMIiw2NzoiR0FMTEVSWS5BUkVBIiw2ODoiR0FMTEVSWS5CQVIiLDY5OiJHQUxMRVJZLkNPTFVNTiIsNzA6IkdBTExFUlkuTElORSIsNzE6IkdBTExFUlkuUElFIiw3MjoiR0FMTEVSWS5TQ0FUVEVSIiw3MzoiQ09NQklOQVRJT04iLDc0OiJQUkVGRVJSRUQiLDc1OiJBREQuT1ZFUkxBWSIsNzY6IkdSSURMSU5FUyIsNzc6IlNFVC5QUkVGRVJSRUQiLDc4OiJBWEVTIiw3OToiTEVHRU5EIiw4MDoiQVRUQUNILlRFWFQiLDgxOiJBREQuQVJST1ciLDgyOiJTRUxFQ1QuQ0hBUlQiLDgzOiJTRUxFQ1QuUExPVC5BUkVBIiw4NDoiUEFUVEVSTlMiLDg1OiJNQUlOLkNIQVJUIiw4NjoiT1ZFUkxBWSIsODc6IlNDQUxFIiw4ODoiRk9STUFULkxFR0VORCIsODk6IkZPUk1BVC5URVhUIiw5MDoiRURJVC5SRVBFQVQiLDkxOiJQQVJTRSIsOTI6IkpVU1RJRlkiLDkzOiJISURFIiw5NDoiVU5ISURFIiw5NToiV09SS1NQQUNFIiw5NjoiRk9STVVMQSIsOTc6IkZPUk1VTEEuRklMTCIsOTg6IkZPUk1VTEEuQVJSQVkiLDk5OiJEQVRBLkZJTkQuTkVYVCIsMTAwOiJEQVRBLkZJTkQuUFJFViIsMTAxOiJGT1JNVUxBLkZJTkQuTkVYVCIsMTAyOiJGT1JNVUxBLkZJTkQuUFJFViIsMTAzOiJBQ1RJVkFURSIsMTA0OiJBQ1RJVkFURS5ORVhUIiwxMDU6IkFDVElWQVRFLlBSRVYiLDEwNjoiVU5MT0NLRUQuTkVYVCIsMTA3OiJVTkxPQ0tFRC5QUkVWIiwxMDg6IkNPUFkuUElDVFVSRSIsMTA5OiJTRUxFQ1QiLDExMDoiREVMRVRFLk5BTUUiLDExMToiREVMRVRFLkZPUk1BVCIsMTEyOiJWTElORSIsMTEzOiJITElORSIsMTE0OiJWUEFHRSIsMTE1OiJIUEFHRSIsMTE2OiJWU0NST0xMIiwxMTc6IkhTQ1JPTEwiLDExODoiQUxFUlQiLDExOToiTkVXIiwxMjA6IkNBTkNFTC5DT1BZIiwxMjE6IlNIT1cuQ0xJUEJPQVJEIiwxMjI6Ik1FU1NBR0UiLDEyNDoiUEFTVEUuTElOSyIsMTI1OiJBUFAuQUNUSVZBVEUiLDEyNjoiREVMRVRFLkFSUk9XIiwxMjc6IlJPVy5IRUlHSFQiLDEyODoiRk9STUFULk1PVkUiLDEyOToiRk9STUFULlNJWkUiLDEzMDoiRk9STVVMQS5SRVBMQUNFIiwxMzE6IlNFTkQuS0VZUyIsMTMyOiJTRUxFQ1QuU1BFQ0lBTCIsMTMzOiJBUFBMWS5OQU1FUyIsMTM0OiJSRVBMQUNFLkZPTlQiLDEzNToiRlJFRVpFLlBBTkVTIiwxMzY6IlNIT1cuSU5GTyIsMTM3OiJTUExJVCIsMTM4OiJPTi5XSU5ET1ciLDEzOToiT04uREFUQSIsMTQwOiJESVNBQkxFLklOUFVUIiwxNDI6Ik9VVExJTkUiLDE0MzoiTElTVC5OQU1FUyIsMTQ0OiJGSUxFLkNMT1NFIiwxNDU6IlNBVkUuV09SS0JPT0siLDE0NjoiREFUQS5GT1JNIiwxNDc6IkNPUFkuQ0hBUlQiLDE0ODoiT04uVElNRSIsMTQ5OiJXQUlUIiwxNTA6IkZPUk1BVC5GT05UIiwxNTE6IkZJTEwuVVAiLDE1MjoiRklMTC5MRUZUIiwxNTM6IkRFTEVURS5PVkVSTEFZIiwxNTU6IlNIT1JULk1FTlVTIiwxNTk6IlNFVC5VUERBVEUuU1RBVFVTIiwxNjE6IkNPTE9SLlBBTEVUVEUiLDE2MjoiREVMRVRFLlNUWUxFIiwxNjM6IldJTkRPVy5SRVNUT1JFIiwxNjQ6IldJTkRPVy5NQVhJTUlaRSIsMTY2OiJDSEFOR0UuTElOSyIsMTY3OiJDQUxDVUxBVEUuRE9DVU1FTlQiLDE2ODoiT04uS0VZIiwxNjk6IkFQUC5SRVNUT1JFIiwxNzA6IkFQUC5NT1ZFIiwxNzE6IkFQUC5TSVpFIiwxNzI6IkFQUC5NSU5JTUlaRSIsMTczOiJBUFAuTUFYSU1JWkUiLDE3NDoiQlJJTkcuVE8uRlJPTlQiLDE3NToiU0VORC5UTy5CQUNLIiwxODU6Ik1BSU4uQ0hBUlQuVFlQRSIsMTg2OiJPVkVSTEFZLkNIQVJULlRZUEUiLDE4NzoiU0VMRUNULkVORCIsMTg4OiJPUEVOLk1BSUwiLDE4OToiU0VORC5NQUlMIiwxOTA6IlNUQU5EQVJELkZPTlQiLDE5MToiQ09OU09MSURBVEUiLDE5MjoiU09SVC5TUEVDSUFMIiwxOTM6IkdBTExFUlkuM0QuQVJFQSIsMTk0OiJHQUxMRVJZLjNELkNPTFVNTiIsMTk1OiJHQUxMRVJZLjNELkxJTkUiLDE5NjoiR0FMTEVSWS4zRC5QSUUiLDE5NzoiVklFVy4zRCIsMTk4OiJHT0FMLlNFRUsiLDE5OToiV09SS0dST1VQIiwyMDA6IkZJTEwuR1JPVVAiLDIwMToiVVBEQVRFLkxJTksiLDIwMjoiUFJPTU9URSIsMjAzOiJERU1PVEUiLDIwNDoiU0hPVy5ERVRBSUwiLDIwNjoiVU5HUk9VUCIsMjA3OiJPQkpFQ1QuUFJPUEVSVElFUyIsMjA4OiJTQVZFLk5FVy5PQkpFQ1QiLDIwOToiU0hBUkUiLDIxMDoiU0hBUkUuTkFNRSIsMjExOiJEVVBMSUNBVEUiLDIxMjoiQVBQTFkuU1RZTEUiLDIxMzoiQVNTSUdOLlRPLk9CSkVDVCIsMjE0OiJPQkpFQ1QuUFJPVEVDVElPTiIsMjE1OiJISURFLk9CSkVDVCIsMjE2OiJTRVQuRVhUUkFDVCIsMjE3OiJDUkVBVEUuUFVCTElTSEVSIiwyMTg6IlNVQlNDUklCRS5UTyIsMjE5OiJBVFRSSUJVVEVTIiwyMjA6IlNIT1cuVE9PTEJBUiIsMjIyOiJQUklOVC5QUkVWSUVXIiwyMjM6IkVESVQuQ09MT1IiLDIyNDoiU0hPVy5MRVZFTFMiLDIyNToiRk9STUFULk1BSU4iLDIyNjoiRk9STUFULk9WRVJMQVkiLDIyNzoiT04uUkVDQUxDIiwyMjg6IkVESVQuU0VSSUVTIiwyMjk6IkRFRklORS5TVFlMRSIsMjQwOiJMSU5FLlBSSU5UIiwyNDM6IkVOVEVSLkRBVEEiLDI0OToiR0FMTEVSWS5SQURBUiIsMjUwOiJNRVJHRS5TVFlMRVMiLDI1MToiRURJVElPTi5PUFRJT05TIiwyNTI6IlBBU1RFLlBJQ1RVUkUiLDI1MzoiUEFTVEUuUElDVFVSRS5MSU5LIiwyNTQ6IlNQRUxMSU5HIiwyNTY6IlpPT00iLDI1OToiSU5TRVJULk9CSkVDVCIsMjYwOiJXSU5ET1cuTUlOSU1JWkUiLDI2NToiU09VTkQuTk9URSIsMjY2OiJTT1VORC5QTEFZIiwyNjc6IkZPUk1BVC5TSEFQRSIsMjY4OiJFWFRFTkQuUE9MWUdPTiIsMjY5OiJGT1JNQVQuQVVUTyIsMjcyOiJHQUxMRVJZLjNELkJBUiIsMjczOiJHQUxMRVJZLjNELlNVUkZBQ0UiLDI3NDoiRklMTC5BVVRPIiwyNzY6IkNVU1RPTUlaRS5UT09MQkFSIiwyNzc6IkFERC5UT09MIiwyNzg6IkVESVQuT0JKRUNUIiwyNzk6Ik9OLkRPVUJMRUNMSUNLIiwyODA6Ik9OLkVOVFJZIiwyODE6IldPUktCT09LLkFERCIsMjgyOiJXT1JLQk9PSy5NT1ZFIiwyODM6IldPUktCT09LLkNPUFkiLDI4NDoiV09SS0JPT0suT1BUSU9OUyIsMjg1OiJTQVZFLldPUktTUEFDRSIsMjg4OiJDSEFSVC5XSVpBUkQiLDI4OToiREVMRVRFLlRPT0wiLDI5MDoiTU9WRS5UT09MIiwyOTE6IldPUktCT09LLlNFTEVDVCIsMjkyOiJXT1JLQk9PSy5BQ1RJVkFURSIsMjkzOiJBU1NJR04uVE8uVE9PTCIsMjk1OiJDT1BZLlRPT0wiLDI5NjoiUkVTRVQuVE9PTCIsMjk3OiJDT05TVFJBSU4uTlVNRVJJQyIsMjk4OiJQQVNURS5UT09MIiwzMDI6IldPUktCT09LLk5FVyIsMzA1OiJTQ0VOQVJJTy5DRUxMUyIsMzA2OiJTQ0VOQVJJTy5ERUxFVEUiLDMwNzoiU0NFTkFSSU8uQUREIiwzMDg6IlNDRU5BUklPLkVESVQiLDMwOToiU0NFTkFSSU8uU0hPVyIsMzEwOiJTQ0VOQVJJTy5TSE9XLk5FWFQiLDMxMToiU0NFTkFSSU8uU1VNTUFSWSIsMzEyOiJQSVZPVC5UQUJMRS5XSVpBUkQiLDMxMzoiUElWT1QuRklFTEQuUFJPUEVSVElFUyIsMzE0OiJQSVZPVC5GSUVMRCIsMzE1OiJQSVZPVC5JVEVNIiwzMTY6IlBJVk9ULkFERC5GSUVMRFMiLDMxODoiT1BUSU9OUy5DQUxDVUxBVElPTiIsMzE5OiJPUFRJT05TLkVESVQiLDMyMDoiT1BUSU9OUy5WSUVXIiwzMjE6IkFERElOLk1BTkFHRVIiLDMyMjoiTUVOVS5FRElUT1IiLDMyMzoiQVRUQUNILlRPT0xCQVJTIiwzMjQ6IlZCQUFjdGl2YXRlIiwzMjU6Ik9QVElPTlMuQ0hBUlQiLDMyODoiVkJBLklOU0VSVC5GSUxFIiwzMzA6IlZCQS5QUk9DRURVUkUuREVGSU5JVElPTiIsMzM2OiJST1VUSU5HLlNMSVAiLDMzODoiUk9VVEUuRE9DVU1FTlQiLDMzOToiTUFJTC5MT0dPTiIsMzQyOiJJTlNFUlQuUElDVFVSRSIsMzQzOiJFRElULlRPT0wiLDM0NDoiR0FMTEVSWS5ET1VHSE5VVCIsMzUwOiJDSEFSVC5UUkVORCIsMzUyOiJQSVZPVC5JVEVNLlBST1BFUlRJRVMiLDM1NDoiV09SS0JPT0suSU5TRVJUIiwzNTU6Ik9QVElPTlMuVFJBTlNJVElPTiIsMzU2OiJPUFRJT05TLkdFTkVSQUwiLDM3MDoiRklMVEVSLkFEVkFOQ0VEIiwzNzM6Ik1BSUwuQURELk1BSUxFUiIsMzc0OiJNQUlMLkRFTEVURS5NQUlMRVIiLDM3NToiTUFJTC5SRVBMWSIsMzc2OiJNQUlMLlJFUExZLkFMTCIsMzc3OiJNQUlMLkZPUldBUkQiLDM3ODoiTUFJTC5ORVhULkxFVFRFUiIsMzc5OiJEQVRBLkxBQkVMIiwzODA6IklOU0VSVC5USVRMRSIsMzgxOiJGT05ULlBST1BFUlRJRVMiLDM4MjoiTUFDUk8uT1BUSU9OUyIsMzgzOiJXT1JLQk9PSy5ISURFIiwzODQ6IldPUktCT09LLlVOSElERSIsMzg1OiJXT1JLQk9PSy5ERUxFVEUiLDM4NjoiV09SS0JPT0suTkFNRSIsMzg4OiJHQUxMRVJZLkNVU1RPTSIsMzkwOiJBREQuQ0hBUlQuQVVUT0ZPUk1BVCIsMzkxOiJERUxFVEUuQ0hBUlQuQVVUT0ZPUk1BVCIsMzkyOiJDSEFSVC5BREQuREFUQSIsMzkzOiJBVVRPLk9VVExJTkUiLDM5NDoiVEFCLk9SREVSIiwzOTU6IlNIT1cuRElBTE9HIiwzOTY6IlNFTEVDVC5BTEwiLDM5NzoiVU5HUk9VUC5TSEVFVFMiLDM5ODoiU1VCVE9UQUwuQ1JFQVRFIiwzOTk6IlNVQlRPVEFMLlJFTU9WRSIsNDAwOiJSRU5BTUUuT0JKRUNUIiw0MTI6IldPUktCT09LLlNDUk9MTCIsNDEzOiJXT1JLQk9PSy5ORVhUIiw0MTQ6IldPUktCT09LLlBSRVYiLDQxNToiV09SS0JPT0suVEFCLlNQTElUIiw0MTY6IkZVTEwuU0NSRUVOIiw0MTc6IldPUktCT09LLlBST1RFQ1QiLDQyMDoiU0NST0xMQkFSLlBST1BFUlRJRVMiLDQyMToiUElWT1QuU0hPVy5QQUdFUyIsNDIyOiJURVhULlRPLkNPTFVNTlMiLDQyMzoiRk9STUFULkNIQVJUVFlQRSIsNDI0OiJMSU5LLkZPUk1BVCIsNDI1OiJUUkFDRVIuRElTUExBWSIsNDMwOiJUUkFDRVIuTkFWSUdBVEUiLDQzMToiVFJBQ0VSLkNMRUFSIiw0MzI6IlRSQUNFUi5FUlJPUiIsNDMzOiJQSVZPVC5GSUVMRC5HUk9VUCIsNDM0OiJQSVZPVC5GSUVMRC5VTkdST1VQIiw0MzU6IkNIRUNLQk9YLlBST1BFUlRJRVMiLDQzNjoiTEFCRUwuUFJPUEVSVElFUyIsNDM3OiJMSVNUQk9YLlBST1BFUlRJRVMiLDQzODoiRURJVEJPWC5QUk9QRVJUSUVTIiw0Mzk6IlBJVk9ULlJFRlJFU0giLDQ0MDoiTElOSy5DT01CTyIsNDQxOiJPUEVOLlRFWFQiLDQ0MjoiSElERS5ESUFMT0ciLDQ0MzoiU0VULkRJQUxPRy5GT0NVUyIsNDQ0OiJFTkFCTEUuT0JKRUNUIiw0NDU6IlBVU0hCVVRUT04uUFJPUEVSVElFUyIsNDQ2OiJTRVQuRElBTE9HLkRFRkFVTFQiLDQ0NzoiRklMVEVSIiw0NDg6IkZJTFRFUi5TSE9XLkFMTCIsNDQ5OiJDTEVBUi5PVVRMSU5FIiw0NTA6IkZVTkNUSU9OLldJWkFSRCIsNDUxOiJBREQuTElTVC5JVEVNIiw0NTI6IlNFVC5MSVNULklURU0iLDQ1MzoiUkVNT1ZFLkxJU1QuSVRFTSIsNDU0OiJTRUxFQ1QuTElTVC5JVEVNIiw0NTU6IlNFVC5DT05UUk9MLlZBTFVFIiw0NTY6IlNBVkUuQ09QWS5BUyIsNDU4OiJPUFRJT05TLkxJU1RTLkFERCIsNDU5OiJPUFRJT05TLkxJU1RTLkRFTEVURSIsNDYwOiJTRVJJRVMuQVhFUyIsNDYxOiJTRVJJRVMuWCIsNDYyOiJTRVJJRVMuWSIsNDYzOiJFUlJPUkJBUi5YIiw0NjQ6IkVSUk9SQkFSLlkiLDQ2NToiRk9STUFULkNIQVJUIiw0NjY6IlNFUklFUy5PUkRFUiIsNDY3OiJNQUlMLkxPR09GRiIsNDY4OiJDTEVBUi5ST1VUSU5HLlNMSVAiLDQ2OToiQVBQLkFDVElWQVRFLk1JQ1JPU09GVCIsNDcwOiJNQUlMLkVESVQuTUFJTEVSIiw0NzE6Ik9OLlNIRUVUIiw0NzI6IlNUQU5EQVJELldJRFRIIiw0NzM6IlNDRU5BUklPLk1FUkdFIiw0NzQ6IlNVTU1BUlkuSU5GTyIsNDc1OiJGSU5ELkZJTEUiLDQ3NjoiQUNUSVZFLkNFTEwuRk9OVCIsNDc3OiJFTkFCTEUuVElQV0laQVJEIiw0Nzg6IlZCQS5NQUtFLkFERElOIiw0ODA6IklOU0VSVERBVEFUQUJMRSIsNDgxOiJXT1JLR1JPVVAuT1BUSU9OUyIsNDgyOiJNQUlMLlNFTkQuTUFJTEVSIiw0ODU6IkFVVE9DT1JSRUNUIiw0ODk6IlBPU1QuRE9DVU1FTlQiLDQ5MToiUElDS0xJU1QiLDQ5MzoiVklFVy5TSE9XIiw0OTQ6IlZJRVcuREVGSU5FIiw0OTU6IlZJRVcuREVMRVRFIiw1MDk6IlNIRUVULkJBQ0tHUk9VTkQiLDUxMDoiSU5TRVJULk1BUC5PQkpFQ1QiLDUxMToiT1BUSU9OUy5NRU5PTk8iLDUxNzoiTVNPQ0hFQ0tTIiw1MTg6Ik5PUk1BTCIsNTE5OiJMQVlPVVQiLDUyMDoiUk0uUFJJTlQuQVJFQSIsNTIxOiJDTEVBUi5QUklOVC5BUkVBIiw1MjI6IkFERC5QUklOVC5BUkVBIiw1MjM6Ik1PVkUuQlJLIiw1NDU6IkhJREVDVVJSLk5PVEUiLDU0NjoiSElERUFMTC5OT1RFUyIsNTQ3OiJERUxFVEUuTk9URSIsNTQ4OiJUUkFWRVJTRS5OT1RFUyIsNTQ5OiJBQ1RJVkFURS5OT1RFUyIsNjIwOiJQUk9URUNULlJFVklTSU9OUyIsNjIxOiJVTlBST1RFQ1QuUkVWSVNJT05TIiw2NDc6Ik9QVElPTlMuTUUiLDY1MzoiV0VCLlBVQkxJU0giLDY2NzoiTkVXV0VCUVVFUlkiLDY3MzoiUElWT1QuVEFCTEUuQ0hBUlQiLDc1MzoiT1BUSU9OUy5TQVZFIiw3NTU6Ik9QVElPTlMuU1BFTEwiLDgwODoiSElERUFMTC5JTktBTk5PVFMifSxldz17MDoiQ09VTlQiLDE6IklGIiwyOiJJU05BIiwzOiJJU0VSUk9SIiw0OiJTVU0iLDU6IkFWRVJBR0UiLDY6Ik1JTiIsNzoiTUFYIiw4OiJST1ciLDk6IkNPTFVNTiIsMTA6Ik5BIiwxMToiTlBWIiwxMjoiU1RERVYiLDEzOiJET0xMQVIiLDE0OiJGSVhFRCIsMTU6IlNJTiIsMTY6IkNPUyIsMTc6IlRBTiIsMTg6IkFUQU4iLDE5OiJQSSIsMjA6IlNRUlQiLDIxOiJFWFAiLDIyOiJMTiIsMjM6IkxPRzEwIiwyNDoiQUJTIiwyNToiSU5UIiwyNjoiU0lHTiIsMjc6IlJPVU5EIiwyODoiTE9PS1VQIiwyOToiSU5ERVgiLDMwOiJSRVBUIiwzMToiTUlEIiwzMjoiTEVOIiwzMzoiVkFMVUUiLDM0OiJUUlVFIiwzNToiRkFMU0UiLDM2OiJBTkQiLDM3OiJPUiIsMzg6Ik5PVCIsMzk6Ik1PRCIsNDA6IkRDT1VOVCIsNDE6IkRTVU0iLDQyOiJEQVZFUkFHRSIsNDM6IkRNSU4iLDQ0OiJETUFYIiw0NToiRFNUREVWIiw0NjoiVkFSIiw0NzoiRFZBUiIsNDg6IlRFWFQiLDQ5OiJMSU5FU1QiLDUwOiJUUkVORCIsNTE6IkxPR0VTVCIsNTI6IkdST1dUSCIsNTM6IkdPVE8iLDU0OiJIQUxUIiw1NToiUkVUVVJOIiw1NjoiUFYiLDU3OiJGViIsNTg6Ik5QRVIiLDU5OiJQTVQiLDYwOiJSQVRFIiw2MToiTUlSUiIsNjI6IklSUiIsNjM6IlJBTkQiLDY0OiJNQVRDSCIsNjU6IkRBVEUiLDY2OiJUSU1FIiw2NzoiREFZIiw2ODoiTU9OVEgiLDY5OiJZRUFSIiw3MDoiV0VFS0RBWSIsNzE6IkhPVVIiLDcyOiJNSU5VVEUiLDczOiJTRUNPTkQiLDc0OiJOT1ciLDc1OiJBUkVBUyIsNzY6IlJPV1MiLDc3OiJDT0xVTU5TIiw3ODoiT0ZGU0VUIiw3OToiQUJTUkVGIiw4MDoiUkVMUkVGIiw4MToiQVJHVU1FTlQiLDgyOiJTRUFSQ0giLDgzOiJUUkFOU1BPU0UiLDg0OiJFUlJPUiIsODU6IlNURVAiLDg2OiJUWVBFIiw4NzoiRUNITyIsODg6IlNFVC5OQU1FIiw4OToiQ0FMTEVSIiw5MDoiREVSRUYiLDkxOiJXSU5ET1dTIiw5MjoiU0VSSUVTIiw5MzoiRE9DVU1FTlRTIiw5NDoiQUNUSVZFLkNFTEwiLDk1OiJTRUxFQ1RJT04iLDk2OiJSRVNVTFQiLDk3OiJBVEFOMiIsOTg6IkFTSU4iLDk5OiJBQ09TIiwxMDA6IkNIT09TRSIsMTAxOiJITE9PS1VQIiwxMDI6IlZMT09LVVAiLDEwMzoiTElOS1MiLDEwNDoiSU5QVVQiLDEwNToiSVNSRUYiLDEwNjoiR0VULkZPUk1VTEEiLDEwNzoiR0VULk5BTUUiLDEwODoiU0VULlZBTFVFIiwxMDk6IkxPRyIsMTEwOiJFWEVDIiwxMTE6IkNIQVIiLDExMjoiTE9XRVIiLDExMzoiVVBQRVIiLDExNDoiUFJPUEVSIiwxMTU6IkxFRlQiLDExNjoiUklHSFQiLDExNzoiRVhBQ1QiLDExODoiVFJJTSIsMTE5OiJSRVBMQUNFIiwxMjA6IlNVQlNUSVRVVEUiLDEyMToiQ09ERSIsMTIyOiJOQU1FUyIsMTIzOiJESVJFQ1RPUlkiLDEyNDoiRklORCIsMTI1OiJDRUxMIiwxMjY6IklTRVJSIiwxMjc6IklTVEVYVCIsMTI4OiJJU05VTUJFUiIsMTI5OiJJU0JMQU5LIiwxMzA6IlQiLDEzMToiTiIsMTMyOiJGT1BFTiIsMTMzOiJGQ0xPU0UiLDEzNDoiRlNJWkUiLDEzNToiRlJFQURMTiIsMTM2OiJGUkVBRCIsMTM3OiJGV1JJVEVMTiIsMTM4OiJGV1JJVEUiLDEzOToiRlBPUyIsMTQwOiJEQVRFVkFMVUUiLDE0MToiVElNRVZBTFVFIiwxNDI6IlNMTiIsMTQzOiJTWUQiLDE0NDoiRERCIiwxNDU6IkdFVC5ERUYiLDE0NjoiUkVGVEVYVCIsMTQ3OiJURVhUUkVGIiwxNDg6IklORElSRUNUIiwxNDk6IlJFR0lTVEVSIiwxNTA6IkNBTEwiLDE1MToiQURELkJBUiIsMTUyOiJBREQuTUVOVSIsMTUzOiJBREQuQ09NTUFORCIsMTU0OiJFTkFCTEUuQ09NTUFORCIsMTU1OiJDSEVDSy5DT01NQU5EIiwxNTY6IlJFTkFNRS5DT01NQU5EIiwxNTc6IlNIT1cuQkFSIiwxNTg6IkRFTEVURS5NRU5VIiwxNTk6IkRFTEVURS5DT01NQU5EIiwxNjA6IkdFVC5DSEFSVC5JVEVNIiwxNjE6IkRJQUxPRy5CT1giLDE2MjoiQ0xFQU4iLDE2MzoiTURFVEVSTSIsMTY0OiJNSU5WRVJTRSIsMTY1OiJNTVVMVCIsMTY2OiJGSUxFUyIsMTY3OiJJUE1UIiwxNjg6IlBQTVQiLDE2OToiQ09VTlRBIiwxNzA6IkNBTkNFTC5LRVkiLDE3MToiRk9SIiwxNzI6IldISUxFIiwxNzM6IkJSRUFLIiwxNzQ6Ik5FWFQiLDE3NToiSU5JVElBVEUiLDE3NjoiUkVRVUVTVCIsMTc3OiJQT0tFIiwxNzg6IkVYRUNVVEUiLDE3OToiVEVSTUlOQVRFIiwxODA6IlJFU1RBUlQiLDE4MToiSEVMUCIsMTgyOiJHRVQuQkFSIiwxODM6IlBST0RVQ1QiLDE4NDoiRkFDVCIsMTg1OiJHRVQuQ0VMTCIsMTg2OiJHRVQuV09SS1NQQUNFIiwxODc6IkdFVC5XSU5ET1ciLDE4ODoiR0VULkRPQ1VNRU5UIiwxODk6IkRQUk9EVUNUIiwxOTA6IklTTk9OVEVYVCIsMTkxOiJHRVQuTk9URSIsMTkyOiJOT1RFIiwxOTM6IlNUREVWUCIsMTk0OiJWQVJQIiwxOTU6IkRTVERFVlAiLDE5NjoiRFZBUlAiLDE5NzoiVFJVTkMiLDE5ODoiSVNMT0dJQ0FMIiwxOTk6IkRDT1VOVEEiLDIwMDoiREVMRVRFLkJBUiIsMjAxOiJVTlJFR0lTVEVSIiwyMDQ6IlVTRE9MTEFSIiwyMDU6IkZJTkRCIiwyMDY6IlNFQVJDSEIiLDIwNzoiUkVQTEFDRUIiLDIwODoiTEVGVEIiLDIwOToiUklHSFRCIiwyMTA6Ik1JREIiLDIxMToiTEVOQiIsMjEyOiJST1VORFVQIiwyMTM6IlJPVU5ERE9XTiIsMjE0OiJBU0MiLDIxNToiREJDUyIsMjE2OiJSQU5LIiwyMTk6IkFERFJFU1MiLDIyMDoiREFZUzM2MCIsMjIxOiJUT0RBWSIsMjIyOiJWREIiLDIyMzoiRUxTRSIsMjI0OiJFTFNFLklGIiwyMjU6IkVORC5JRiIsMjI2OiJGT1IuQ0VMTCIsMjI3OiJNRURJQU4iLDIyODoiU1VNUFJPRFVDVCIsMjI5OiJTSU5IIiwyMzA6IkNPU0giLDIzMToiVEFOSCIsMjMyOiJBU0lOSCIsMjMzOiJBQ09TSCIsMjM0OiJBVEFOSCIsMjM1OiJER0VUIiwyMzY6IkNSRUFURS5PQkpFQ1QiLDIzNzoiVk9MQVRJTEUiLDIzODoiTEFTVC5FUlJPUiIsMjM5OiJDVVNUT00uVU5ETyIsMjQwOiJDVVNUT00uUkVQRUFUIiwyNDE6IkZPUk1VTEEuQ09OVkVSVCIsMjQyOiJHRVQuTElOSy5JTkZPIiwyNDM6IlRFWFQuQk9YIiwyNDQ6IklORk8iLDI0NToiR1JPVVAiLDI0NjoiR0VULk9CSkVDVCIsMjQ3OiJEQiIsMjQ4OiJQQVVTRSIsMjUxOiJSRVNVTUUiLDI1MjoiRlJFUVVFTkNZIiwyNTM6IkFERC5UT09MQkFSIiwyNTQ6IkRFTEVURS5UT09MQkFSIiwyNTU6IlVzZXIiLDI1NjoiUkVTRVQuVE9PTEJBUiIsMjU3OiJFVkFMVUFURSIsMjU4OiJHRVQuVE9PTEJBUiIsMjU5OiJHRVQuVE9PTCIsMjYwOiJTUEVMTElORy5DSEVDSyIsMjYxOiJFUlJPUi5UWVBFIiwyNjI6IkFQUC5USVRMRSIsMjYzOiJXSU5ET1cuVElUTEUiLDI2NDoiU0FWRS5UT09MQkFSIiwyNjU6IkVOQUJMRS5UT09MIiwyNjY6IlBSRVNTLlRPT0wiLDI2NzoiUkVHSVNURVIuSUQiLDI2ODoiR0VULldPUktCT09LIiwyNjk6IkFWRURFViIsMjcwOiJCRVRBRElTVCIsMjcxOiJHQU1NQUxOIiwyNzI6IkJFVEFJTlYiLDI3MzoiQklOT01ESVNUIiwyNzQ6IkNISURJU1QiLDI3NToiQ0hJSU5WIiwyNzY6IkNPTUJJTiIsMjc3OiJDT05GSURFTkNFIiwyNzg6IkNSSVRCSU5PTSIsMjc5OiJFVkVOIiwyODA6IkVYUE9ORElTVCIsMjgxOiJGRElTVCIsMjgyOiJGSU5WIiwyODM6IkZJU0hFUiIsMjg0OiJGSVNIRVJJTlYiLDI4NToiRkxPT1IiLDI4NjoiR0FNTUFESVNUIiwyODc6IkdBTU1BSU5WIiwyODg6IkNFSUxJTkciLDI4OToiSFlQR0VPTURJU1QiLDI5MDoiTE9HTk9STURJU1QiLDI5MToiTE9HSU5WIiwyOTI6Ik5FR0JJTk9NRElTVCIsMjkzOiJOT1JNRElTVCIsMjk0OiJOT1JNU0RJU1QiLDI5NToiTk9STUlOViIsMjk2OiJOT1JNU0lOViIsMjk3OiJTVEFOREFSRElaRSIsMjk4OiJPREQiLDI5OToiUEVSTVVUIiwzMDA6IlBPSVNTT04iLDMwMToiVERJU1QiLDMwMjoiV0VJQlVMTCIsMzAzOiJTVU1YTVkyIiwzMDQ6IlNVTVgyTVkyIiwzMDU6IlNVTVgyUFkyIiwzMDY6IkNISVRFU1QiLDMwNzoiQ09SUkVMIiwzMDg6IkNPVkFSIiwzMDk6IkZPUkVDQVNUIiwzMTA6IkZURVNUIiwzMTE6IklOVEVSQ0VQVCIsMzEyOiJQRUFSU09OIiwzMTM6IlJTUSIsMzE0OiJTVEVZWCIsMzE1OiJTTE9QRSIsMzE2OiJUVEVTVCIsMzE3OiJQUk9CIiwzMTg6IkRFVlNRIiwzMTk6IkdFT01FQU4iLDMyMDoiSEFSTUVBTiIsMzIxOiJTVU1TUSIsMzIyOiJLVVJUIiwzMjM6IlNLRVciLDMyNDoiWlRFU1QiLDMyNToiTEFSR0UiLDMyNjoiU01BTEwiLDMyNzoiUVVBUlRJTEUiLDMyODoiUEVSQ0VOVElMRSIsMzI5OiJQRVJDRU5UUkFOSyIsMzMwOiJNT0RFIiwzMzE6IlRSSU1NRUFOIiwzMzI6IlRJTlYiLDMzNDoiTU9WSUUuQ09NTUFORCIsMzM1OiJHRVQuTU9WSUUiLDMzNjoiQ09OQ0FURU5BVEUiLDMzNzoiUE9XRVIiLDMzODoiUElWT1QuQURELkRBVEEiLDMzOToiR0VULlBJVk9ULlRBQkxFIiwzNDA6IkdFVC5QSVZPVC5GSUVMRCIsMzQxOiJHRVQuUElWT1QuSVRFTSIsMzQyOiJSQURJQU5TIiwzNDM6IkRFR1JFRVMiLDM0NDoiU1VCVE9UQUwiLDM0NToiU1VNSUYiLDM0NjoiQ09VTlRJRiIsMzQ3OiJDT1VOVEJMQU5LIiwzNDg6IlNDRU5BUklPLkdFVCIsMzQ5OiJPUFRJT05TLkxJU1RTLkdFVCIsMzUwOiJJU1BNVCIsMzUxOiJEQVRFRElGIiwzNTI6IkRBVEVTVFJJTkciLDM1MzoiTlVNQkVSU1RSSU5HIiwzNTQ6IlJPTUFOIiwzNTU6Ik9QRU4uRElBTE9HIiwzNTY6IlNBVkUuRElBTE9HIiwzNTc6IlZJRVcuR0VUIiwzNTg6IkdFVFBJVk9UREFUQSIsMzU5OiJIWVBFUkxJTksiLDM2MDoiUEhPTkVUSUMiLDM2MToiQVZFUkFHRUEiLDM2MjoiTUFYQSIsMzYzOiJNSU5BIiwzNjQ6IlNUREVWUEEiLDM2NToiVkFSUEEiLDM2NjoiU1RERVZBIiwzNjc6IlZBUkEiLDM2ODoiQkFIVFRFWFQiLDM2OToiVEhBSURBWU9GV0VFSyIsMzcwOiJUSEFJRElHSVQiLDM3MToiVEhBSU1PTlRIT0ZZRUFSIiwzNzI6IlRIQUlOVU1TT1VORCIsMzczOiJUSEFJTlVNU1RSSU5HIiwzNzQ6IlRIQUlTVFJJTkdMRU5HVEgiLDM3NToiSVNUSEFJRElHSVQiLDM3NjoiUk9VTkRCQUhURE9XTiIsMzc3OiJST1VOREJBSFRVUCIsMzc4OiJUSEFJWUVBUiIsMzc5OiJSVEQiLDM4MDoiQ1VCRVZBTFVFIiwzODE6IkNVQkVNRU1CRVIiLDM4MjoiQ1VCRU1FTUJFUlBST1BFUlRZIiwzODM6IkNVQkVSQU5LRURNRU1CRVIiLDM4NDoiSEVYMkJJTiIsMzg1OiJIRVgyREVDIiwzODY6IkhFWDJPQ1QiLDM4NzoiREVDMkJJTiIsMzg4OiJERUMySEVYIiwzODk6IkRFQzJPQ1QiLDM5MDoiT0NUMkJJTiIsMzkxOiJPQ1QySEVYIiwzOTI6Ik9DVDJERUMiLDM5MzoiQklOMkRFQyIsMzk0OiJCSU4yT0NUIiwzOTU6IkJJTjJIRVgiLDM5NjoiSU1TVUIiLDM5NzoiSU1ESVYiLDM5ODoiSU1QT1dFUiIsMzk5OiJJTUFCUyIsNDAwOiJJTVNRUlQiLDQwMToiSU1MTiIsNDAyOiJJTUxPRzIiLDQwMzoiSU1MT0cxMCIsNDA0OiJJTVNJTiIsNDA1OiJJTUNPUyIsNDA2OiJJTUVYUCIsNDA3OiJJTUFSR1VNRU5UIiw0MDg6IklNQ09OSlVHQVRFIiw0MDk6IklNQUdJTkFSWSIsNDEwOiJJTVJFQUwiLDQxMToiQ09NUExFWCIsNDEyOiJJTVNVTSIsNDEzOiJJTVBST0RVQ1QiLDQxNDoiU0VSSUVTU1VNIiw0MTU6IkZBQ1RET1VCTEUiLDQxNjoiU1FSVFBJIiw0MTc6IlFVT1RJRU5UIiw0MTg6IkRFTFRBIiw0MTk6IkdFU1RFUCIsNDIwOiJJU0VWRU4iLDQyMToiSVNPREQiLDQyMjoiTVJPVU5EIiw0MjM6IkVSRiIsNDI0OiJFUkZDIiw0MjU6IkJFU1NFTEoiLDQyNjoiQkVTU0VMSyIsNDI3OiJCRVNTRUxZIiw0Mjg6IkJFU1NFTEkiLDQyOToiWElSUiIsNDMwOiJYTlBWIiw0MzE6IlBSSUNFTUFUIiw0MzI6IllJRUxETUFUIiw0MzM6IklOVFJBVEUiLDQzNDoiUkVDRUlWRUQiLDQzNToiRElTQyIsNDM2OiJQUklDRURJU0MiLDQzNzoiWUlFTERESVNDIiw0Mzg6IlRCSUxMRVEiLDQzOToiVEJJTExQUklDRSIsNDQwOiJUQklMTFlJRUxEIiw0NDE6IlBSSUNFIiw0NDI6IllJRUxEIiw0NDM6IkRPTExBUkRFIiw0NDQ6IkRPTExBUkZSIiw0NDU6Ik5PTUlOQUwiLDQ0NjoiRUZGRUNUIiw0NDc6IkNVTVBSSU5DIiw0NDg6IkNVTUlQTVQiLDQ0OToiRURBVEUiLDQ1MDoiRU9NT05USCIsNDUxOiJZRUFSRlJBQyIsNDUyOiJDT1VQREFZQlMiLDQ1MzoiQ09VUERBWVMiLDQ1NDoiQ09VUERBWVNOQyIsNDU1OiJDT1VQTkNEIiw0NTY6IkNPVVBOVU0iLDQ1NzoiQ09VUFBDRCIsNDU4OiJEVVJBVElPTiIsNDU5OiJNRFVSQVRJT04iLDQ2MDoiT0RETFBSSUNFIiw0NjE6Ik9ERExZSUVMRCIsNDYyOiJPRERGUFJJQ0UiLDQ2MzoiT0RERllJRUxEIiw0NjQ6IlJBTkRCRVRXRUVOIiw0NjU6IldFRUtOVU0iLDQ2NjoiQU1PUkRFR1JDIiw0Njc6IkFNT1JMSU5DIiw0Njg6IkNPTlZFUlQiLDcyNDoiU0hFRVRKUyIsNDY5OiJBQ0NSSU5UIiw0NzA6IkFDQ1JJTlRNIiw0NzE6IldPUktEQVkiLDQ3MjoiTkVUV09SS0RBWVMiLDQ3MzoiR0NEIiw0NzQ6Ik1VTFRJTk9NSUFMIiw0NzU6IkxDTSIsNDc2OiJGVlNDSEVEVUxFIiw0Nzc6IkNVQkVLUElNRU1CRVIiLDQ3ODoiQ1VCRVNFVCIsNDc5OiJDVUJFU0VUQ09VTlQiLDQ4MDoiSUZFUlJPUiIsNDgxOiJDT1VOVElGUyIsNDgyOiJTVU1JRlMiLDQ4MzoiQVZFUkFHRUlGIiw0ODQ6IkFWRVJBR0VJRlMifSx0dz17MjoxLDM6MSwxMDowLDE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MCwyMDoxLDIxOjEsMjI6MSwyMzoxLDI0OjEsMjU6MSwyNjoxLDI3OjIsMzA6MiwzMTozLDMyOjEsMzM6MSwzNDowLDM1OjAsMzg6MSwzOToyLDQwOjMsNDE6Myw0MjozLDQzOjMsNDQ6Myw0NTozLDQ3OjMsNDg6Miw1MzoxLDYxOjMsNjM6MCw2NTozLDY2OjMsNjc6MSw2ODoxLDY5OjEsNzA6MSw3MToxLDcyOjEsNzM6MSw3NDowLDc1OjEsNzY6MSw3NzoxLDc5OjIsODA6Miw4MzoxLDg1OjAsODY6MSw4OTowLDkwOjEsOTQ6MCw5NTowLDk3OjIsOTg6MSw5OToxLDEwMTozLDEwMjozLDEwNToxLDEwNjoxLDEwODoyLDExMToxLDExMjoxLDExMzoxLDExNDoxLDExNzoyLDExODoxLDExOTo0LDEyMToxLDEyNjoxLDEyNzoxLDEyODoxLDEyOToxLDEzMDoxLDEzMToxLDEzMzoxLDEzNDoxLDEzNToxLDEzNjoyLDEzNzoyLDEzODoyLDE0MDoxLDE0MToxLDE0MjozLDE0Mzo0LDE0NDo0LDE2MToxLDE2MjoxLDE2MzoxLDE2NDoxLDE2NToyLDE3MjoxLDE3NToyLDE3NjoyLDE3NzozLDE3ODoyLDE3OToxLDE4NDoxLDE4NjoxLDE4OTozLDE5MDoxLDE5NTozLDE5NjozLDE5NzoxLDE5ODoxLDE5OTozLDIwMToxLDIwNzo0LDIxMDozLDIxMToxLDIxMjoyLDIxMzoyLDIxNDoxLDIxNToxLDIyNTowLDIyOToxLDIzMDoxLDIzMToxLDIzMjoxLDIzMzoxLDIzNDoxLDIzNTozLDI0NDoxLDI0Nzo0LDI1MjoyLDI1NzoxLDI2MToxLDI3MToxLDI3Mzo0LDI3NDoyLDI3NToyLDI3NjoyLDI3NzozLDI3ODozLDI3OToxLDI4MDozLDI4MTozLDI4MjozLDI4MzoxLDI4NDoxLDI4NToyLDI4Njo0LDI4NzozLDI4ODoyLDI4OTo0LDI5MDozLDI5MTozLDI5MjozLDI5Mzo0LDI5NDoxLDI5NTozLDI5NjoxLDI5NzozLDI5ODoxLDI5OToyLDMwMDozLDMwMTozLDMwMjo0LDMwMzoyLDMwNDoyLDMwNToyLDMwNjoyLDMwNzoyLDMwODoyLDMwOTozLDMxMDoyLDMxMToyLDMxMjoyLDMxMzoyLDMxNDoyLDMxNToyLDMxNjo0LDMyNToyLDMyNjoyLDMyNzoyLDMyODoyLDMzMToyLDMzMjoyLDMzNzoyLDM0MjoxLDM0MzoxLDM0NjoyLDM0NzoxLDM1MDo0LDM1MTozLDM1MjoxLDM1MzoyLDM2MDoxLDM2ODoxLDM2OToxLDM3MDoxLDM3MToxLDM3MjoxLDM3MzoxLDM3NDoxLDM3NToxLDM3NjoxLDM3NzoxLDM3ODoxLDM4MjozLDM4NToxLDM5MjoxLDM5MzoxLDM5NjoyLDM5NzoyLDM5ODoyLDM5OToxLDQwMDoxLDQwMToxLDQwMjoxLDQwMzoxLDQwNDoxLDQwNToxLDQwNjoxLDQwNzoxLDQwODoxLDQwOToxLDQxMDoxLDQxNDo0LDQxNToxLDQxNjoxLDQxNzoyLDQyMDoxLDQyMToxLDQyMjoyLDQyNDoxLDQyNToyLDQyNjoyLDQyNzoyLDQyODoyLDQzMDozLDQzODozLDQzOTozLDQ0MDozLDQ0MzoyLDQ0NDoyLDQ0NToyLDQ0NjoyLDQ0Nzo2LDQ0ODo2LDQ0OToyLDQ1MDoyLDQ2NDoyLDQ2ODozLDQ3NjoyLDQ3OToxLDQ4MDoyLDY1NTM1OjB9O2Z1bmN0aW9uIG53KGUpe3JldHVybiJvZjoiPT1lLnNsaWNlKDAsMykmJihlPWUuc2xpY2UoMykpLDYxPT1lLmNoYXJDb2RlQXQoMCkmJjYxPT0oZT1lLnNsaWNlKDEpKS5jaGFyQ29kZUF0KDApJiYoZT1lLnNsaWNlKDEpKSwoZT0oZT0oZT0oZT0oZT1lLnJlcGxhY2UoL0NPTVwuTUlDUk9TT0ZUXC4vZywiIikpLnJlcGxhY2UoL1xbKCg/OlwuW0EtWl0rWzAtOV0rKSg/OjpcLltBLVpdK1swLTldKyk/KVxdL2csKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQucmVwbGFjZSgvXC4vZywiIil9KSkpLnJlcGxhY2UoL1wkJyhbXiddfCcnKSsnL2csKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNsaWNlKDEpfSkpKS5yZXBsYWNlKC9cJChbXlxdXC4gIyRdKykvZywoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5tYXRjaCgvXihbQS1aXXsxLDJ9fFtBLVddW0EtWl17Mn18WFtBLUVdW0EtWl18WEZbQS1EXSk/KDEwWzAtM11cZHs0fXwxMDRbMC03XVxkezN9fDEwNDhbMC00XVxkezJ9fDEwNDg1WzAtNl1cZHwxMDQ4NTdbMC02XXxbMS05XVxkezAsNX0pPyQvKT9lOnR9KSkpLnJlcGxhY2UoL1xbLigjW0EtWl0qWz8hXSlcXS9nLCIkMSIpKS5yZXBsYWNlKC9bO35dL2csIiwiKS5yZXBsYWNlKC9cfC9nLCI7Iil9ZnVuY3Rpb24gcncoZSl7dmFyIHQ9KGU9KGU9ZS5yZXBsYWNlKC9cJCcoW14nXXwnJykrJy9nLChmdW5jdGlvbihlKXtyZXR1cm4gZS5zbGljZSgxKX0pKSkucmVwbGFjZSgvXCQoW15cXVwuICMkXSspL2csKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQubWF0Y2goL14oW0EtWl17MSwyfXxbQS1XXVtBLVpdezJ9fFhbQS1FXVtBLVpdfFhGW0EtRF0pPygxMFswLTNdXGR7NH18MTA0WzAtN11cZHszfXwxMDQ4WzAtNF1cZHsyfXwxMDQ4NVswLTZdXGR8MTA0ODU3WzAtNl18WzEtOV1cZHswLDV9KT8kLyk/ZTp0fSkpKS5zcGxpdCgiOiIpO3JldHVyblt0WzBdLnNwbGl0KCIuIilbMF0sdFswXS5zcGxpdCgiLiIpWzFdKyh0Lmxlbmd0aD4xPyI6IisodFsxXS5zcGxpdCgiLiIpWzFdfHx0WzFdLnNwbGl0KCIuIilbMF0pOiIiKV19dmFyIGl3PXt9LGF3PXt9O2Z1bmN0aW9uIG93KGUsdCl7aWYoZSl7dmFyIG49Wy43LC43LC43NSwuNzUsLjMsLjNdOyJ4bG1sIj09dCYmKG49WzEsMSwxLDEsLjUsLjVdKSxudWxsPT1lLmxlZnQmJihlLmxlZnQ9blswXSksbnVsbD09ZS5yaWdodCYmKGUucmlnaHQ9blsxXSksbnVsbD09ZS50b3AmJihlLnRvcD1uWzJdKSxudWxsPT1lLmJvdHRvbSYmKGUuYm90dG9tPW5bM10pLG51bGw9PWUuaGVhZGVyJiYoZS5oZWFkZXI9bls0XSksbnVsbD09ZS5mb290ZXImJihlLmZvb3Rlcj1uWzVdKX19ZnVuY3Rpb24gY3coZSx0LG4scixpLGEsbyl7dHJ5e3IuY2VsbE5GJiYoZS56PWdtW3RdKX1jYXRjaChlKXtpZihyLldURil0aHJvdyBlfWlmKCJ6IiE9PWUudHx8ci5jZWxsU3R5bGVzKXtpZigiZCI9PT1lLnQmJiJzdHJpbmciPT10eXBlb2YgZS52JiYoZS52PXNiKGUudikpLCghcnx8ITEhPT1yLmNlbGxUZXh0KSYmInoiIT09ZS50KXRyeXtpZihudWxsPT1nbVt0XSYmJG0ocW1bdF18fCJHZW5lcmFsIix0KSwiZSI9PT1lLnQpZS53PWUud3x8enZbZS52XTtlbHNlIGlmKDA9PT10KWlmKCJuIj09PWUudCkoMHxlLnYpPT09ZS52P2Uudz1lLnYudG9TdHJpbmcoMTApOmUudz1EbShlLnYpO2Vsc2UgaWYoImQiPT09ZS50KXt2YXIgYz1uYihlLnYsISFvKTtlLnc9KDB8Yyk9PT1jP2MudG9TdHJpbmcoMTApOkRtKGMpfWVsc2V7aWYodm9pZCAwPT09ZS52KXJldHVybiIiO2Uudz1UbShlLnYsYXcpfWVsc2UiZCI9PT1lLnQ/ZS53PUhtKHQsbmIoZS52LCEhbyksYXcpOmUudz1IbSh0LGUudixhdyl9Y2F0Y2goZSl7aWYoci5XVEYpdGhyb3cgZX1pZihyLmNlbGxTdHlsZXMmJm51bGwhPW4pdHJ5e2Uucz1hLkZpbGxzW25dLGUucy5mZ0NvbG9yJiZlLnMuZmdDb2xvci50aGVtZSYmIWUucy5mZ0NvbG9yLnJnYiYmKGUucy5mZ0NvbG9yLnJnYj1PRChpLnRoZW1lRWxlbWVudHMuY2xyU2NoZW1lW2Uucy5mZ0NvbG9yLnRoZW1lXS5yZ2IsZS5zLmZnQ29sb3IudGludHx8MCksci5XVEYmJihlLnMuZmdDb2xvci5yYXdfcmdiPWkudGhlbWVFbGVtZW50cy5jbHJTY2hlbWVbZS5zLmZnQ29sb3IudGhlbWVdLnJnYikpLGUucy5iZ0NvbG9yJiZlLnMuYmdDb2xvci50aGVtZSYmKGUucy5iZ0NvbG9yLnJnYj1PRChpLnRoZW1lRWxlbWVudHMuY2xyU2NoZW1lW2Uucy5iZ0NvbG9yLnRoZW1lXS5yZ2IsZS5zLmJnQ29sb3IudGludHx8MCksci5XVEYmJihlLnMuYmdDb2xvci5yYXdfcmdiPWkudGhlbWVFbGVtZW50cy5jbHJTY2hlbWVbZS5zLmJnQ29sb3IudGhlbWVdLnJnYikpfWNhdGNoKGUpe2lmKHIuV1RGJiZhLkZpbGxzKXRocm93IGV9fX12YXIgc3c9LzwoPzpcdzopP21lcmdlQ2VsbCByZWY9WyInXVtBLVowLTk6XStbJyJdXHMqW1wvXT8+L2csbHc9LzwoPzpcdys6KT9zaGVldERhdGFbXj5dKj4oW1xzXFNdKik8XC8oPzpcdys6KT9zaGVldERhdGE+Lyx1dz0vPCg/Olx3Oik/aHlwZXJsaW5rIFtePl0qPi9nbSxmdz0vIihcdyo6XHcqKSIvLGR3PS88KD86XHc6KT9jb2xcYltePl0qW1wvXT8+L2csaHc9LzwoPzpcdzopP2F1dG9GaWx0ZXJbXj5dKihbXC9dfD4oW1xzXFNdKik8XC8oPzpcdzopP2F1dG9GaWx0ZXIpPi9nLHB3PS88KD86XHc6KT9wYWdlTWFyZ2luc1tePl0qXC8+L2csZ3c9LzwoPzpcdzopP3NoZWV0UHJcYig/OltePmEtel1bXj5dKik/XC8+Lyxtdz0vPCg/Olx3Oik/c2hlZXRQcltePl0qKD86W1wvXXw+KFtcc1xTXSopPFwvKD86XHc6KT9zaGVldFByKT4vLGJ3PS88KD86XHc6KT9zaGVldFZpZXdzW14+XSooPzpbXC9dfD4oW1xzXFNdKik8XC8oPzpcdzopP3NoZWV0Vmlld3MpPi87ZnVuY3Rpb24geXcoZSx0LG4scixpLGEsbyl7aWYoIWUpcmV0dXJuIGU7cnx8KHI9eyIhaWQiOnt9fSk7dmFyIGM9e307dC5kZW5zZSYmKGNbIiFkYXRhIl09W10pO3ZhciBzPXtzOntyOjJlNixjOjJlNn0sZTp7cjowLGM6MH19LGw9IiIsdT0iIixmPWUubWF0Y2gobHcpO2Y/KGw9ZS5zbGljZSgwLGYuaW5kZXgpLHU9ZS5zbGljZShmLmluZGV4K2ZbMF0ubGVuZ3RoKSk6bD11PWU7dmFyIGQ9bC5tYXRjaChndyk7ZD92dyhkWzBdLGMsaSxuKTooZD1sLm1hdGNoKG13KSkmJmZ1bmN0aW9uKGUsdCxuLHIsaSl7dncoZS5zbGljZSgwLGUuaW5kZXhPZigiPiIpKSxuLHIsaSl9KGRbMF0sZFsxXSxjLGksbik7dmFyIGg9KGwubWF0Y2goLzwoPzpcdyo6KT9kaW1lbnNpb24vKXx8e2luZGV4Oi0xfSkuaW5kZXg7aWYoaD4wKXt2YXIgcD1sLnNsaWNlKGgsaCs1MCkubWF0Y2goZncpOyFwfHx0JiZ0Lm5vZGltfHxmdW5jdGlvbihlLHQpe3ZhciBuPWx2KHQpO24ucy5yPD1uLmUuciYmbi5zLmM8PW4uZS5jJiZuLnMucj49MCYmbi5zLmM+PTAmJihlWyIhcmVmIl09c3YobikpfShjLHBbMV0pfXZhciBnPWwubWF0Y2goYncpO2cmJmdbMV0mJmZ1bmN0aW9uKGUsdCl7dC5WaWV3c3x8KHQuVmlld3M9W3t9XSk7KGUubWF0Y2goeHcpfHxbXSkuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt2YXIgcj1MYihlKTt0LlZpZXdzW25dfHwodC5WaWV3c1tuXT17fSksK3Iuem9vbVNjYWxlJiYodC5WaWV3c1tuXS56b29tPStyLnpvb21TY2FsZSksci5yaWdodFRvTGVmdCYmJGIoci5yaWdodFRvTGVmdCkmJih0LlZpZXdzW25dLlJUTD0hMCl9KSl9KGdbMV0saSk7dmFyIG09W107aWYodC5jZWxsU3R5bGVzKXt2YXIgYj1sLm1hdGNoKGR3KTtiJiZmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0hMSxyPTA7ciE9dC5sZW5ndGg7KytyKXt2YXIgaT1MYih0W3JdLCEwKTtpLmhpZGRlbiYmKGkuaGlkZGVuPSRiKGkuaGlkZGVuKSk7dmFyIGE9cGFyc2VJbnQoaS5taW4sMTApLTEsbz1wYXJzZUludChpLm1heCwxMCktMTtmb3IoaS5vdXRsaW5lTGV2ZWwmJihpLmxldmVsPStpLm91dGxpbmVMZXZlbHx8MCksZGVsZXRlIGkubWluLGRlbGV0ZSBpLm1heCxpLndpZHRoPStpLndpZHRoLCFuJiZpLndpZHRoJiYobj0hMCxqRChpLndpZHRoKSksekQoaSk7YTw9bzspZVthKytdPXViKGkpfX0obSxiKX1mJiZEdyhmWzFdLGMsdCxzLGEsbyxpKTt2YXIgeT11Lm1hdGNoKGh3KTt5JiYoY1siIWF1dG9maWx0ZXIiXT1mdW5jdGlvbihlKXt2YXIgdD17cmVmOihlLm1hdGNoKC9yZWY9IihbXiJdKikiLyl8fFtdKVsxXX07cmV0dXJuIHR9KHlbMF0pKTt2YXIgdj1bXSx4PXUubWF0Y2goc3cpO2lmKHgpZm9yKGg9MDtoIT14Lmxlbmd0aDsrK2gpdltoXT1sdih4W2hdLnNsaWNlKHhbaF0uaW5kZXhPZignIicpKzEpKTt2YXIgRD11Lm1hdGNoKHV3KTtEJiZmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW51bGwhPWVbIiFkYXRhIl0saT0wO2khPXQubGVuZ3RoOysraSl7dmFyIGE9TGIoUWIodFtpXSksITApO2lmKCFhLnJlZilyZXR1cm47dmFyIG89KChufHx7fSlbIiFpZCJdfHxbXSlbYS5pZF07bz8oYS5UYXJnZXQ9by5UYXJnZXQsYS5sb2NhdGlvbiYmKGEuVGFyZ2V0Kz0iIyIrSGIoYS5sb2NhdGlvbikpKTooYS5UYXJnZXQ9IiMiK0hiKGEubG9jYXRpb24pLG89e1RhcmdldDphLlRhcmdldCxUYXJnZXRNb2RlOiJJbnRlcm5hbCJ9KSxhLlJlbD1vLGEudG9vbHRpcCYmKGEuVG9vbHRpcD1hLnRvb2x0aXAsZGVsZXRlIGEudG9vbHRpcCk7Zm9yKHZhciBjPWx2KGEucmVmKSxzPWMucy5yO3M8PWMuZS5yOysrcylmb3IodmFyIGw9Yy5zLmM7bDw9Yy5lLmM7KytsKXt2YXIgdT1pdihsKStudihzKTtyPyhlWyIhZGF0YSJdW3NdfHwoZVsiIWRhdGEiXVtzXT1bXSksZVsiIWRhdGEiXVtzXVtsXXx8KGVbIiFkYXRhIl1bc11bbF09e3Q6InoiLHY6dm9pZCAwfSksZVsiIWRhdGEiXVtzXVtsXS5sPWEpOihlW3VdfHwoZVt1XT17dDoieiIsdjp2b2lkIDB9KSxlW3VdLmw9YSl9fX0oYyxELHIpO3ZhciBULHcsXyxFPXUubWF0Y2gocHcpO2lmKEUmJihjWyIhbWFyZ2lucyJdPShUPUxiKEVbMF0pLHc9e30sWyJsZWZ0IiwicmlnaHQiLCJ0b3AiLCJib3R0b20iLCJoZWFkZXIiLCJmb290ZXIiXS5mb3JFYWNoKChmdW5jdGlvbihlKXtUW2VdJiYod1tlXT1wYXJzZUZsb2F0KFRbZV0pKX0pKSx3KSksKF89dS5tYXRjaCgvbGVnYWN5RHJhd2luZyByOmlkPSIoLio/KSIvKSkmJihjWyIhbGVncmVsIl09X1sxXSksdCYmdC5ub2RpbSYmKHMucy5jPXMucy5yPTApLCFjWyIhcmVmIl0mJnMuZS5jPj1zLnMuYyYmcy5lLnI+PXMucy5yJiYoY1siIXJlZiJdPXN2KHMpKSx0LnNoZWV0Um93cz4wJiZjWyIhcmVmIl0pe3ZhciBVPWx2KGNbIiFyZWYiXSk7dC5zaGVldFJvd3M8PStVLmUuciYmKFUuZS5yPXQuc2hlZXRSb3dzLTEsVS5lLnI+cy5lLnImJihVLmUucj1zLmUuciksVS5lLnI8VS5zLnImJihVLnMucj1VLmUuciksVS5lLmM+cy5lLmMmJihVLmUuYz1zLmUuYyksVS5lLmM8VS5zLmMmJihVLnMuYz1VLmUuYyksY1siIWZ1bGxyZWYiXT1jWyIhcmVmIl0sY1siIXJlZiJdPXN2KFUpKX1yZXR1cm4gbS5sZW5ndGg+MCYmKGNbIiFjb2xzIl09bSksdi5sZW5ndGg+MCYmKGNbIiFtZXJnZXMiXT12KSxyWyIhaWQiXVtjWyIhbGVncmVsIl1dJiYoY1siIWxlZ2RyYXdlbCJdPXJbIiFpZCJdW2NbIiFsZWdyZWwiXV0pLGN9ZnVuY3Rpb24gdncoZSx0LG4scil7dmFyIGk9TGIoZSk7bi5TaGVldHNbcl18fChuLlNoZWV0c1tyXT17fSksaS5jb2RlTmFtZSYmKG4uU2hlZXRzW3JdLkNvZGVOYW1lPUhiKFFiKGkuY29kZU5hbWUpKSl9dmFyIHh3PS88KD86XHc6KT9zaGVldFZpZXcoPzpbXj5hLXpdW14+XSopP1wvPz4vZzt2YXIgRHc9ZnVuY3Rpb24oKXt2YXIgZT0vPCg/Olx3KzopP2NbIFwvPl0vLHQ9LzxcLyg/Olx3KzopP3Jvdz4vLG49L3I9WyInXShbXiInXSopWyInXS8scj0vPCg/Olx3KzopP2lzPihbXFNcc10qPyk8XC8oPzpcdys6KT9pcz4vLGk9L3JlZj1bIiddKFteIiddKilbIiddLyxhPXR5KCJ2Iiksbz10eSgiZiIpO3JldHVybiBmdW5jdGlvbihjLHMsbCx1LGYsZCxoKXtmb3IodmFyIHAsZyxtLGIseSx2PTAseD0iIixEPVtdLFQ9W10sdz0wLF89MCxFPTAsVT0iIixBPTAsaz0wLFM9MCxDPTAsRj1BcnJheS5pc0FycmF5KGQuQ2VsbFhmKSxPPVtdLEk9W10sUj1udWxsIT1zWyIhZGF0YSJdLE49W10sUD17fSxCPSExLFc9ISFsLnNoZWV0U3R1YnMsTD0hISgoaHx8e30pLldCUHJvcHN8fHt9KS5kYXRlMTkwNCxNPWMuc3BsaXQodCksaj0wLHo9TS5sZW5ndGg7aiE9ejsrK2ope3ZhciBIPSh4PU1bal0udHJpbSgpKS5sZW5ndGg7aWYoMCE9PUgpe3ZhciBWPTA7ZTpmb3Iodj0wO3Y8SDsrK3Ypc3dpdGNoKHhbdl0pe2Nhc2UiPiI6aWYoIi8iIT14W3YtMV0peysrdjticmVhayBlfWlmKGwmJmwuY2VsbFN0eWxlcyl7aWYoQT1udWxsIT0oZz1MYih4LnNsaWNlKFYsdiksITApKS5yP3BhcnNlSW50KGcuciwxMCk6QSsxLGs9LTEsbC5zaGVldFJvd3MmJmwuc2hlZXRSb3dzPEEpY29udGludWU7UD17fSxCPSExLGcuaHQmJihCPSEwLFAuaHB0PXBhcnNlRmxvYXQoZy5odCksUC5ocHg9cUQoUC5ocHQpKSxnLmhpZGRlbiYmJGIoZy5oaWRkZW4pJiYoQj0hMCxQLmhpZGRlbj0hMCksbnVsbCE9Zy5vdXRsaW5lTGV2ZWwmJihCPSEwLFAubGV2ZWw9K2cub3V0bGluZUxldmVsKSxCJiYoTltBLTFdPVApfWJyZWFrO2Nhc2UiPCI6Vj12fWlmKFY+PXYpYnJlYWs7aWYoQT1udWxsIT0oZz1MYih4LnNsaWNlKFYsdiksITApKS5yP3BhcnNlSW50KGcuciwxMCk6QSsxLGs9LTEsIShsLnNoZWV0Um93cyYmbC5zaGVldFJvd3M8QSkpe2wubm9kaW18fCh1LnMucj5BLTEmJih1LnMucj1BLTEpLHUuZS5yPEEtMSYmKHUuZS5yPUEtMSkpLGwmJmwuY2VsbFN0eWxlcyYmKFA9e30sQj0hMSxnLmh0JiYoQj0hMCxQLmhwdD1wYXJzZUZsb2F0KGcuaHQpLFAuaHB4PXFEKFAuaHB0KSksZy5oaWRkZW4mJiRiKGcuaGlkZGVuKSYmKEI9ITAsUC5oaWRkZW49ITApLG51bGwhPWcub3V0bGluZUxldmVsJiYoQj0hMCxQLmxldmVsPStnLm91dGxpbmVMZXZlbCksQiYmKE5bQS0xXT1QKSksRD14LnNsaWNlKHYpLnNwbGl0KGUpO2Zvcih2YXIgcT0wO3EhPUQubGVuZ3RoJiYiPCI9PURbcV0udHJpbSgpLmNoYXJBdCgwKTsrK3EpO2ZvcihEPUQuc2xpY2UocSksdj0wO3YhPUQubGVuZ3RoOysrdilpZigwIT09KHg9RFt2XS50cmltKCkpLmxlbmd0aCl7aWYoVD14Lm1hdGNoKG4pLHc9dixfPTAsRT0wLHg9IjxjICIrKCI8Ij09eC5zbGljZSgwLDEpPyI+IjoiIikreCxudWxsIT1UJiYyPT09VC5sZW5ndGgpe2Zvcih3PTAsVT1UWzFdLF89MDtfIT1VLmxlbmd0aCYmISgoRT1VLmNoYXJDb2RlQXQoXyktNjQpPDF8fEU+MjYpOysrXyl3PTI2KncrRTtrPS0td31lbHNlKytrO2ZvcihfPTA7XyE9eC5sZW5ndGgmJjYyIT09eC5jaGFyQ29kZUF0KF8pOysrXyk7aWYoKytfLChnPUxiKHguc2xpY2UoMCxfKSwhMCkpLnJ8fChnLnI9b3Yoe3I6QS0xLGM6a30pKSxwPXt0OiIifSxudWxsIT0oVD0oVT14LnNsaWNlKF8pKS5tYXRjaChhKSkmJiIiIT09VFsxXSYmKHAudj1IYihUWzFdKSksbC5jZWxsRm9ybXVsYSl7aWYobnVsbCE9KFQ9VS5tYXRjaChvKSkpe2lmKCIiPT1UWzFdKVRbMF0uaW5kZXhPZigndD0ic2hhcmVkIicpPi0xJiZJWyhiPUxiKFRbMF0pKS5zaV0mJihwLmY9YlQoSVtiLnNpXVsxXSxJW2Iuc2ldWzJdLGcucikpO2Vsc2UgaWYocC5mPUhiKFFiKFRbMV0pLCEwKSxsLnhsZm58fChwLmY9eVQocC5mKSksVFswXS5pbmRleE9mKCd0PSJhcnJheSInKT4tMSlwLkY9KFUubWF0Y2goaSl8fFtdKVsxXSxwLkYuaW5kZXhPZigiOiIpPi0xJiZPLnB1c2goW2x2KHAuRikscC5GXSk7ZWxzZSBpZihUWzBdLmluZGV4T2YoJ3Q9InNoYXJlZCInKT4tMSl7Yj1MYihUWzBdKTt2YXIgRz1IYihRYihUWzFdKSk7bC54bGZufHwoRz15VChHKSksSVtwYXJzZUludChiLnNpLDEwKV09W2IsRyxnLnJdfX1lbHNlKFQ9VS5tYXRjaCgvPGZbXj5dKlwvPi8pKSYmSVsoYj1MYihUWzBdKSkuc2ldJiYocC5mPWJUKElbYi5zaV1bMV0sSVtiLnNpXVsyXSxnLnIpKTt2YXIgWD1hdihnLnIpO2ZvcihfPTA7XzxPLmxlbmd0aDsrK18pWC5yPj1PW19dWzBdLnMuciYmWC5yPD1PW19dWzBdLmUuciYmWC5jPj1PW19dWzBdLnMuYyYmWC5jPD1PW19dWzBdLmUuYyYmKHAuRj1PW19dWzFdKX1pZihudWxsPT1nLnQmJnZvaWQgMD09PXAudilpZihwLmZ8fHAuRilwLnY9MCxwLnQ9Im4iO2Vsc2V7aWYoIVcpY29udGludWU7cC50PSJ6In1lbHNlIHAudD1nLnR8fCJuIjtzd2l0Y2godS5zLmM+ayYmKHUucy5jPWspLHUuZS5jPGsmJih1LmUuYz1rKSxwLnQpe2Nhc2UibiI6aWYoIiI9PXAudnx8bnVsbD09cC52KXtpZighVyljb250aW51ZTtwLnQ9InoifWVsc2UgcC52PXBhcnNlRmxvYXQocC52KTticmVhaztjYXNlInMiOmlmKHZvaWQgMD09PXAudil7aWYoIVcpY29udGludWU7cC50PSJ6In1lbHNlIG09aXdbcGFyc2VJbnQocC52LDEwKV0scC52PW0udCxwLnI9bS5yLGwuY2VsbEhUTUwmJihwLmg9bS5oKTticmVhaztjYXNlInN0ciI6cC50PSJzIixwLnY9bnVsbCE9cC52P0hiKFFiKHAudiksITApOiIiLGwuY2VsbEhUTUwmJihwLmg9R2IocC52KSk7YnJlYWs7Y2FzZSJpbmxpbmVTdHIiOlQ9VS5tYXRjaChyKSxwLnQ9InMiLG51bGwhPVQmJihtPWREKFRbMV0pKT8ocC52PW0udCxsLmNlbGxIVE1MJiYocC5oPW0uaCkpOnAudj0iIjticmVhaztjYXNlImIiOnAudj0kYihwLnYpO2JyZWFrO2Nhc2UiZCI6bC5jZWxsRGF0ZXM/cC52PXNiKHAudixMKToocC52PW5iKHNiKHAudixMKSxMKSxwLnQ9Im4iKTticmVhaztjYXNlImUiOmwmJiExPT09bC5jZWxsVGV4dHx8KHAudz1wLnYpLHAudj1IdltwLnZdfWlmKFM9Qz0wLHk9bnVsbCxGJiZ2b2lkIDAhPT1nLnMmJm51bGwhPSh5PWQuQ2VsbFhmW2cuc10pJiYobnVsbCE9eS5udW1GbXRJZCYmKFM9eS5udW1GbXRJZCksbC5jZWxsU3R5bGVzJiZudWxsIT15LmZpbGxJZCYmKEM9eS5maWxsSWQpKSxjdyhwLFMsQyxsLGYsZCxMKSxsLmNlbGxEYXRlcyYmRiYmIm4iPT1wLnQmJkxtKGdtW1NdKSYmKHAudj1yYihwLnYrKEw/MTQ2MjowKSkscC50PSJudW1iZXIiPT10eXBlb2YgcC52PyJuIjoiZCIpLGcuY20mJmwueGxtZXRhKXt2YXIgJD0obC54bG1ldGEuQ2VsbHx8W10pWytnLmNtLTFdOyQmJiJYTERBUFIiPT0kLnR5cGUmJihwLkQ9ITApfXZhciBZO2wubm9kaW0mJihZPWF2KGcuciksdS5zLnI+WS5yJiYodS5zLnI9WS5yKSx1LmUucjxZLnImJih1LmUucj1ZLnIpKSxSPyhZPWF2KGcuciksc1siIWRhdGEiXVtZLnJdfHwoc1siIWRhdGEiXVtZLnJdPVtdKSxzWyIhZGF0YSJdW1kucl1bWS5jXT1wKTpzW2cucl09cH19fX1OLmxlbmd0aD4wJiYoc1siIXJvd3MiXT1OKX19KCk7dmFyIFR3PUF2O2Z1bmN0aW9uIHd3KGUpe3JldHVyblt4dihlKSxrdihlKSwibiJdfXZhciBfdz1Bdjt2YXIgRXc9WyJsZWZ0IiwicmlnaHQiLCJ0b3AiLCJib3R0b20iLCJoZWFkZXIiLCJmb290ZXIiXTtmdW5jdGlvbiBVdyhlLHQsbixyLGksYSl7dmFyIG89YXx8eyIhdHlwZSI6ImNoYXJ0In07aWYoIWUpcmV0dXJuIGE7dmFyIGM9MCxzPTAsbD0iQSIsdT17czp7cjoyZTYsYzoyZTZ9LGU6e3I6MCxjOjB9fTtyZXR1cm4oZS5tYXRjaCgvPGM6bnVtQ2FjaGU+W1xzXFNdKj88XC9jOm51bUNhY2hlPi9nbSl8fFtdKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD1mdW5jdGlvbihlKXt2YXIgdCxuPVtdLHI9ZS5tYXRjaCgvXjxjOm51bUNhY2hlPi8pOyhlLm1hdGNoKC88YzpwdCBpZHg9IihcZCopIj4oLio/KTxcL2M6cHQ+L2dtKXx8W10pLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PWUubWF0Y2goLzxjOnB0IGlkeD0iKFxkKj8pIj48Yzp2PiguKik8XC9jOnY+PFwvYzpwdD4vKTt0JiYoblsrdFsxXV09cj8rdFsyXTp0WzJdKX0pKTt2YXIgaT1IYigoZS5tYXRjaCgvPGM6Zm9ybWF0Q29kZT4oW1xzXFNdKj8pPFwvYzpmb3JtYXRDb2RlPi8pfHxbIiIsIkdlbmVyYWwiXSlbMV0pO3JldHVybihlLm1hdGNoKC88YzpmPiguKj8pPFwvYzpmPi9nbSl8fFtdKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0PWUucmVwbGFjZSgvPC4qPz4vZywiIil9KSksW24saSx0XX0oZSk7dS5zLnI9dS5zLmM9MCx1LmUuYz1jLGw9aXYoYyksdFswXS5mb3JFYWNoKChmdW5jdGlvbihlLG4pe29bIiFkYXRhIl0/KG9bIiFkYXRhIl1bbl18fChvWyIhZGF0YSJdW25dPVtdKSxvWyIhZGF0YSJdW25dW2NdPXt0OiJuIix2OmUsejp0WzFdfSk6b1tsK252KG4pXT17dDoibiIsdjplLHo6dFsxXX0scz1ufSkpLHUuZS5yPHMmJih1LmUucj1zKSwrK2N9KSksYz4wJiYob1siIXJlZiJdPXN2KHUpKSxvfXZhciBBdz1bWyJhbGxvd1JlZnJlc2hRdWVyeSIsITEsImJvb2wiXSxbImF1dG9Db21wcmVzc1BpY3R1cmVzIiwhMCwiYm9vbCJdLFsiYmFja3VwRmlsZSIsITEsImJvb2wiXSxbImNoZWNrQ29tcGF0aWJpbGl0eSIsITEsImJvb2wiXSxbIkNvZGVOYW1lIiwiIl0sWyJkYXRlMTkwNCIsITEsImJvb2wiXSxbImRlZmF1bHRUaGVtZVZlcnNpb24iLDAsImludCJdLFsiZmlsdGVyUHJpdmFjeSIsITEsImJvb2wiXSxbImhpZGVQaXZvdEZpZWxkTGlzdCIsITEsImJvb2wiXSxbInByb21wdGVkU29sdXRpb25zIiwhMSwiYm9vbCJdLFsicHVibGlzaEl0ZW1zIiwhMSwiYm9vbCJdLFsicmVmcmVzaEFsbENvbm5lY3Rpb25zIiwhMSwiYm9vbCJdLFsic2F2ZUV4dGVybmFsTGlua1ZhbHVlcyIsITAsImJvb2wiXSxbInNob3dCb3JkZXJVbnNlbGVjdGVkVGFibGVzIiwhMCwiYm9vbCJdLFsic2hvd0lua0Fubm90YXRpb24iLCEwLCJib29sIl0sWyJzaG93T2JqZWN0cyIsImFsbCJdLFsic2hvd1Bpdm90Q2hhcnRGaWx0ZXIiLCExLCJib29sIl0sWyJ1cGRhdGVMaW5rcyIsInVzZXJTZXQiXV0sa3c9W1siYWN0aXZlVGFiIiwwLCJpbnQiXSxbImF1dG9GaWx0ZXJEYXRlR3JvdXBpbmciLCEwLCJib29sIl0sWyJmaXJzdFNoZWV0IiwwLCJpbnQiXSxbIm1pbmltaXplZCIsITEsImJvb2wiXSxbInNob3dIb3Jpem9udGFsU2Nyb2xsIiwhMCwiYm9vbCJdLFsic2hvd1NoZWV0VGFicyIsITAsImJvb2wiXSxbInNob3dWZXJ0aWNhbFNjcm9sbCIsITAsImJvb2wiXSxbInRhYlJhdGlvIiw2MDAsImludCJdLFsidmlzaWJpbGl0eSIsInZpc2libGUiXV0sU3c9W10sQ3c9W1siY2FsY0NvbXBsZXRlZCIsInRydWUiXSxbImNhbGNNb2RlIiwiYXV0byJdLFsiY2FsY09uU2F2ZSIsInRydWUiXSxbImNvbmN1cnJlbnRDYWxjIiwidHJ1ZSJdLFsiZnVsbENhbGNPbkxvYWQiLCJmYWxzZSJdLFsiZnVsbFByZWNpc2lvbiIsInRydWUiXSxbIml0ZXJhdGUiLCJmYWxzZSJdLFsiaXRlcmF0ZUNvdW50IiwiMTAwIl0sWyJpdGVyYXRlRGVsdGEiLCIwLjAwMSJdLFsicmVmTW9kZSIsIkExIl1dO2Z1bmN0aW9uIEZ3KGUsdCl7Zm9yKHZhciBuPTA7biE9ZS5sZW5ndGg7KytuKWZvcih2YXIgcj1lW25dLGk9MDtpIT10Lmxlbmd0aDsrK2kpe3ZhciBhPXRbaV07aWYobnVsbD09clthWzBdXSlyW2FbMF1dPWFbMV07ZWxzZSBzd2l0Y2goYVsyXSl7Y2FzZSJib29sIjoic3RyaW5nIj09dHlwZW9mIHJbYVswXV0mJihyW2FbMF1dPSRiKHJbYVswXV0pKTticmVhaztjYXNlImludCI6InN0cmluZyI9PXR5cGVvZiByW2FbMF1dJiYoclthWzBdXT1wYXJzZUludChyW2FbMF1dLDEwKSl9fX1mdW5jdGlvbiBPdyhlLHQpe2Zvcih2YXIgbj0wO24hPXQubGVuZ3RoOysrbil7dmFyIHI9dFtuXTtpZihudWxsPT1lW3JbMF1dKWVbclswXV09clsxXTtlbHNlIHN3aXRjaChyWzJdKXtjYXNlImJvb2wiOiJzdHJpbmciPT10eXBlb2YgZVtyWzBdXSYmKGVbclswXV09JGIoZVtyWzBdXSkpO2JyZWFrO2Nhc2UiaW50Ijoic3RyaW5nIj09dHlwZW9mIGVbclswXV0mJihlW3JbMF1dPXBhcnNlSW50KGVbclswXV0sMTApKX19fWZ1bmN0aW9uIEl3KGUpe093KGUuV0JQcm9wcyxBdyksT3coZS5DYWxjUHIsQ3cpLEZ3KGUuV0JWaWV3LGt3KSxGdyhlLlNoZWV0cyxTdyksYXcuZGF0ZTE5MDQ9JGIoZS5XQlByb3BzLmRhdGUxOTA0KX12YXIgUnc9IjpdWyo/L1xcIi5zcGxpdCgiIik7dmFyIE53PS88XHcrOndvcmtib29rLztmdW5jdGlvbiBQdyhlLHQpe3ZhciBuPXt9O3JldHVybiBlLnJlYWRfc2hpZnQoNCksbi5BcmNoSUQ9ZS5yZWFkX3NoaWZ0KDQpLGUubCs9dC04LG59ZnVuY3Rpb24gQncoZSx0LG4pe3JldHVybiIuYmluIj09PXQuc2xpY2UoLTQpP2Z1bmN0aW9uKGUsdCl7dmFyIG49e0FwcFZlcnNpb246e30sV0JQcm9wczp7fSxXQlZpZXc6W10sU2hlZXRzOltdLENhbGNQcjp7fSx4bWxuczoiIn0scj1bXSxpPSExO3R8fCh0PXt9KSx0LmJpZmY9MTI7dmFyIGE9W10sbz1bW11dO3JldHVybiBvLlNoZWV0TmFtZXM9W10sby5YVEk9W10sZF9bMTZdPXtuOiJCcnRGUlRBcmNoSUQkIixmOlB3fSxZeShlLChmdW5jdGlvbihlLGMscyl7c3dpdGNoKHMpe2Nhc2UgMTU2Om8uU2hlZXROYW1lcy5wdXNoKGUubmFtZSksbi5TaGVldHMucHVzaChlKTticmVhaztjYXNlIDE1MzpuLldCUHJvcHM9ZTticmVhaztjYXNlIDM5Om51bGwhPWUuU2hlZXQmJih0LlNJRD1lLlNoZWV0KSxlLlJlZj1WVChlLlB0ZywwLG51bGwsbyx0KSxkZWxldGUgdC5TSUQsZGVsZXRlIGUuUHRnLGEucHVzaChlKTticmVhaztjYXNlIDEwMzY6Y2FzZSAzNjE6Y2FzZSAyMDcxOmNhc2UgMTU4OmNhc2UgMTQzOmNhc2UgNjY0OmNhc2UgMzUzOmNhc2UgMzA3MjpjYXNlIDMwNzM6Y2FzZSA1MzQ6Y2FzZSA2Nzc6Y2FzZSAxNTc6Y2FzZSA2MTA6Y2FzZSAyMDUwOmNhc2UgMTU1OmNhc2UgNTQ4OmNhc2UgNjc2OmNhc2UgMTI4OmNhc2UgNjY1OmNhc2UgMjEyODpjYXNlIDIxMjU6Y2FzZSA1NDk6Y2FzZSAyMDUzOmNhc2UgNTk2OmNhc2UgMjA3NjpjYXNlIDIwNzU6Y2FzZSAyMDgyOmNhc2UgMzk3OmNhc2UgMTU0OmNhc2UgMTExNzpjYXNlIDU1MzpjYXNlIDIwOTE6Y2FzZSAxNjpicmVhaztjYXNlIDM1NzpjYXNlIDM1ODpjYXNlIDM1NTpjYXNlIDY2NzpvWzBdLmxlbmd0aD9vLnB1c2goW3MsZV0pOm9bMF09W3MsZV0sb1tvLmxlbmd0aC0xXS5YVEk9W107YnJlYWs7Y2FzZSAzNjI6MD09PW8ubGVuZ3RoJiYob1swXT1bXSxvWzBdLlhUST1bXSksb1tvLmxlbmd0aC0xXS5YVEk9b1tvLmxlbmd0aC0xXS5YVEkuY29uY2F0KGUpLG8uWFRJPW8uWFRJLmNvbmNhdChlKTticmVhaztjYXNlIDM1OmNhc2UgMzc6ci5wdXNoKHMpLGk9ITA7YnJlYWs7Y2FzZSAzNjpjYXNlIDM4OnIucG9wKCksaT0hMTticmVhaztkZWZhdWx0OmlmKGMuVCk7ZWxzZSBpZighaXx8dC5XVEYmJjM3IT1yW3IubGVuZ3RoLTFdJiYzNSE9cltyLmxlbmd0aC0xXSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgcmVjb3JkIDB4IitzLnRvU3RyaW5nKDE2KSl9fSksdCksSXcobiksbi5OYW1lcz1hLG4uc3VwYm9va3M9byxufShlLG4pOmZ1bmN0aW9uKGUsdCl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZmluZCBmaWxlIik7dmFyIG49e0FwcFZlcnNpb246e30sV0JQcm9wczp7fSxXQlZpZXc6W10sU2hlZXRzOltdLENhbGNQcjp7fSxOYW1lczpbXSx4bWxuczoiIn0scj0hMSxpPSJ4bWxucyIsYT17fSxvPTA7aWYoZS5yZXBsYWNlKFBiLChmdW5jdGlvbihjLHMpe3ZhciBsPUxiKGMpO3N3aXRjaChNYihsWzBdKSl7Y2FzZSI8P3htbCI6Y2FzZSI8L3dvcmtib29rPiI6Y2FzZSI8ZmlsZVZlcnNpb24vPiI6Y2FzZSI8L2ZpbGVWZXJzaW9uPiI6Y2FzZSI8ZmlsZVNoYXJpbmciOmNhc2UiPGZpbGVTaGFyaW5nLz4iOmNhc2UiPC93b3JrYm9va1ByPiI6Y2FzZSI8d29ya2Jvb2tQcm90ZWN0aW9uIjpjYXNlIjx3b3JrYm9va1Byb3RlY3Rpb24vPiI6Y2FzZSI8Ym9va1ZpZXdzIjpjYXNlIjxib29rVmlld3M+IjpjYXNlIjwvYm9va1ZpZXdzPiI6Y2FzZSI8L3dvcmtib29rVmlldz4iOmNhc2UiPHNoZWV0cyI6Y2FzZSI8c2hlZXRzPiI6Y2FzZSI8L3NoZWV0cz4iOmNhc2UiPC9zaGVldD4iOmNhc2UiPGZ1bmN0aW9uR3JvdXBzIjpjYXNlIjxmdW5jdGlvbkdyb3Vwcy8+IjpjYXNlIjxmdW5jdGlvbkdyb3VwIjpjYXNlIjxleHRlcm5hbFJlZmVyZW5jZXMiOmNhc2UiPC9leHRlcm5hbFJlZmVyZW5jZXM+IjpjYXNlIjxleHRlcm5hbFJlZmVyZW5jZXM+IjpjYXNlIjxleHRlcm5hbFJlZmVyZW5jZSI6Y2FzZSI8ZGVmaW5lZE5hbWVzLz4iOmNhc2UiPGRlZmluZWROYW1lLz4iOmNhc2UiPC9jYWxjUHI+IjpjYXNlIjxvbGVTaXplIjpjYXNlIjxjdXN0b21Xb3JrYm9va1ZpZXdzPiI6Y2FzZSI8L2N1c3RvbVdvcmtib29rVmlld3M+IjpjYXNlIjxjdXN0b21Xb3JrYm9va1ZpZXdzIjpjYXNlIjxjdXN0b21Xb3JrYm9va1ZpZXciOmNhc2UiPC9jdXN0b21Xb3JrYm9va1ZpZXc+IjpjYXNlIjxwaXZvdENhY2hlcz4iOmNhc2UiPC9waXZvdENhY2hlcz4iOmNhc2UiPHBpdm90Q2FjaGVzIjpjYXNlIjxwaXZvdENhY2hlIjpjYXNlIjxzbWFydFRhZ1ByIjpjYXNlIjxzbWFydFRhZ1ByLz4iOmNhc2UiPHNtYXJ0VGFnVHlwZXMiOmNhc2UiPHNtYXJ0VGFnVHlwZXM+IjpjYXNlIjwvc21hcnRUYWdUeXBlcz4iOmNhc2UiPHNtYXJ0VGFnVHlwZSI6Y2FzZSI8d2ViUHVibGlzaGluZyI6Y2FzZSI8d2ViUHVibGlzaGluZy8+IjpjYXNlIjxmaWxlUmVjb3ZlcnlQciI6Y2FzZSI8ZmlsZVJlY292ZXJ5UHIvPiI6Y2FzZSI8d2ViUHVibGlzaE9iamVjdHM+IjpjYXNlIjx3ZWJQdWJsaXNoT2JqZWN0cyI6Y2FzZSI8L3dlYlB1Ymxpc2hPYmplY3RzPiI6Y2FzZSI8d2ViUHVibGlzaE9iamVjdCI6Y2FzZSI8ZXh0THN0IjpjYXNlIjxleHRMc3Q+IjpjYXNlIjwvZXh0THN0PiI6Y2FzZSI8ZXh0THN0Lz4iOmNhc2UiPEFyY2hJRCI6Y2FzZSI8cmV2aXNpb25QdHIiOmJyZWFrO2Nhc2UiPHdvcmtib29rIjpjLm1hdGNoKE53KSYmKGk9InhtbG5zIitjLm1hdGNoKC88KFx3Kyk6LylbMV0pLG4ueG1sbnM9bFtpXTticmVhaztjYXNlIjxmaWxlVmVyc2lvbiI6ZGVsZXRlIGxbMF0sbi5BcHBWZXJzaW9uPWw7YnJlYWs7Y2FzZSI8d29ya2Jvb2tQciI6Y2FzZSI8d29ya2Jvb2tQci8+IjpBdy5mb3JFYWNoKChmdW5jdGlvbihlKXtpZihudWxsIT1sW2VbMF1dKXN3aXRjaChlWzJdKXtjYXNlImJvb2wiOm4uV0JQcm9wc1tlWzBdXT0kYihsW2VbMF1dKTticmVhaztjYXNlImludCI6bi5XQlByb3BzW2VbMF1dPXBhcnNlSW50KGxbZVswXV0sMTApO2JyZWFrO2RlZmF1bHQ6bi5XQlByb3BzW2VbMF1dPWxbZVswXV19fSkpLGwuY29kZU5hbWUmJihuLldCUHJvcHMuQ29kZU5hbWU9UWIobC5jb2RlTmFtZSkpO2JyZWFrO2Nhc2UiPHdvcmtib29rVmlldyI6Y2FzZSI8d29ya2Jvb2tWaWV3Lz4iOmRlbGV0ZSBsWzBdLG4uV0JWaWV3LnB1c2gobCk7YnJlYWs7Y2FzZSI8c2hlZXQiOnN3aXRjaChsLnN0YXRlKXtjYXNlImhpZGRlbiI6bC5IaWRkZW49MTticmVhaztjYXNlInZlcnlIaWRkZW4iOmwuSGlkZGVuPTI7YnJlYWs7ZGVmYXVsdDpsLkhpZGRlbj0wfWRlbGV0ZSBsLnN0YXRlLGwubmFtZT1IYihRYihsLm5hbWUpKSxkZWxldGUgbFswXSxuLlNoZWV0cy5wdXNoKGwpO2JyZWFrO2Nhc2UiPGRlZmluZWROYW1lcz4iOmNhc2UiPGRlZmluZWROYW1lcyI6Y2FzZSI8ZXh0IjpjYXNlIjxBbHRlcm5hdGVDb250ZW50IjpjYXNlIjxBbHRlcm5hdGVDb250ZW50PiI6cj0hMDticmVhaztjYXNlIjwvZGVmaW5lZE5hbWVzPiI6Y2FzZSI8L2V4dD4iOmNhc2UiPC9BbHRlcm5hdGVDb250ZW50PiI6cj0hMTticmVhaztjYXNlIjxkZWZpbmVkTmFtZSI6KGE9e30pLk5hbWU9UWIobC5uYW1lKSxsLmNvbW1lbnQmJihhLkNvbW1lbnQ9bC5jb21tZW50KSxsLmxvY2FsU2hlZXRJZCYmKGEuU2hlZXQ9K2wubG9jYWxTaGVldElkKSwkYihsLmhpZGRlbnx8IjAiKSYmKGEuSGlkZGVuPSEwKSxvPXMrYy5sZW5ndGg7YnJlYWs7Y2FzZSI8L2RlZmluZWROYW1lPiI6YS5SZWY9SGIoUWIoZS5zbGljZShvLHMpKSksbi5OYW1lcy5wdXNoKGEpO2JyZWFrO2Nhc2UiPGNhbGNQciI6Y2FzZSI8Y2FsY1ByLz4iOmRlbGV0ZSBsWzBdLG4uQ2FsY1ByPWw7YnJlYWs7ZGVmYXVsdDppZighciYmdC5XVEYpdGhyb3cgbmV3IEVycm9yKCJ1bnJlY29nbml6ZWQgIitsWzBdKyIgaW4gd29ya2Jvb2siKX1yZXR1cm4gY30pKSwtMT09PWR5LmluZGV4T2Yobi54bWxucykpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIE5hbWVzcGFjZTogIituLnhtbG5zKTtyZXR1cm4gSXcobiksbn0oZSxuKX1mdW5jdGlvbiBXdyhlLHQsbixyLGksYSxvLGMpe3JldHVybiIuYmluIj09PXQuc2xpY2UoLTQpP2Z1bmN0aW9uKGUsdCxuLHIsaSxhLG8pe2lmKCFlKXJldHVybiBlO3ZhciBjPXR8fHt9O3J8fChyPXsiIWlkIjp7fX0pO3ZhciBzLGw9e307Yy5kZW5zZSYmKGxbIiFkYXRhIl09W10pO3ZhciB1LGYsZCxoLHAsZyxtLGIseSx2PXtzOntyOjJlNixjOjJlNn0sZTp7cjowLGM6MH19LHg9ITEsRD0hMSxUPVtdO2MuYmlmZj0xMixjWyIhcm93Il09MDt2YXIgdz0wLF89ITEsRT1bXSxVPXt9LEE9Yy5zdXBib29rc3x8aS5zdXBib29rc3x8W1tdXTtpZihBLnNoYXJlZGY9VSxBLmFycmF5Zj1FLEEuU2hlZXROYW1lcz1pLlNoZWV0TmFtZXN8fGkuU2hlZXRzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUubmFtZX0pKSwhYy5zdXBib29rcyYmKGMuc3VwYm9va3M9QSxpLk5hbWVzKSlmb3IodmFyIGs9MDtrPGkuTmFtZXMubGVuZ3RoOysraylBWzBdW2srMV09aS5OYW1lc1trXTt2YXIgUyxDPVtdLEY9W10sTz0hMTtkX1sxNl09e246IkJydFNob3J0UmVhbCIsZjp3d307dmFyIEk9MTQ2MiorISEoKGl8fHt9KS5XQlByb3BzfHx7fSkuZGF0ZTE5MDQ7aWYoWXkoZSwoZnVuY3Rpb24oZSx0LGspe2lmKCFEKXN3aXRjaChrKXtjYXNlIDE0ODpzPWU7YnJlYWs7Y2FzZSAwOnU9ZSxjLnNoZWV0Um93cyYmYy5zaGVldFJvd3M8PXUuciYmKEQ9ITApLGI9bnYoaD11LnIpLGNbIiFyb3ciXT11LnIsKGUuaGlkZGVufHxlLmhwdHx8bnVsbCE9ZS5sZXZlbCkmJihlLmhwdCYmKGUuaHB4PXFEKGUuaHB0KSksRltlLnJdPWUpO2JyZWFrO2Nhc2UgMjpjYXNlIDM6Y2FzZSA0OmNhc2UgNTpjYXNlIDY6Y2FzZSA3OmNhc2UgODpjYXNlIDk6Y2FzZSAxMDpjYXNlIDExOmNhc2UgMTM6Y2FzZSAxNDpjYXNlIDE1OmNhc2UgMTY6Y2FzZSAxNzpjYXNlIDE4OmNhc2UgNjI6c3dpdGNoKGY9e3Q6ZVsyXX0sZVsyXSl7Y2FzZSJuIjpmLnY9ZVsxXTticmVhaztjYXNlInMiOm09aXdbZVsxXV0sZi52PW0udCxmLnI9bS5yO2JyZWFrO2Nhc2UiYiI6Zi52PSEhZVsxXTticmVhaztjYXNlImUiOmYudj1lWzFdLCExIT09Yy5jZWxsVGV4dCYmKGYudz16dltmLnZdKTticmVhaztjYXNlInN0ciI6Zi50PSJzIixmLnY9ZVsxXTticmVhaztjYXNlImlzIjpmLnQ9InMiLGYudj1lWzFdLnR9aWYoKGQ9by5DZWxsWGZbZVswXS5pU3R5bGVSZWZdKSYmY3coZixkLm51bUZtdElkLG51bGwsYyxhLG8sST4wKSxwPS0xPT1lWzBdLmM/cCsxOmVbMF0uYyxjLmRlbnNlPyhsWyIhZGF0YSJdW2hdfHwobFsiIWRhdGEiXVtoXT1bXSksbFsiIWRhdGEiXVtoXVtwXT1mKTpsW2l2KHApK2JdPWYsYy5jZWxsRm9ybXVsYSl7Zm9yKF89ITEsdz0wO3c8RS5sZW5ndGg7Kyt3KXt2YXIgUj1FW3ddO3Uucj49UlswXS5zLnImJnUucjw9UlswXS5lLnImJnA+PVJbMF0ucy5jJiZwPD1SWzBdLmUuYyYmKGYuRj1zdihSWzBdKSxfPSEwKX0hXyYmZS5sZW5ndGg+MyYmKGYuZj1lWzNdKX1pZih2LnMucj51LnImJih2LnMucj11LnIpLHYucy5jPnAmJih2LnMuYz1wKSx2LmUucjx1LnImJih2LmUucj11LnIpLHYuZS5jPHAmJih2LmUuYz1wKSxjLmNlbGxEYXRlcyYmZCYmIm4iPT1mLnQmJkxtKGdtW2QubnVtRm10SWRdKSl7dmFyIE49dm0oZi52K0kpO04mJihmLnQ9ImQiLGYudj1uZXcgRGF0ZShEYXRlLlVUQyhOLnksTi5tLTEsTi5kLE4uSCxOLk0sTi5TLE4udSkpKX1TJiYoIlhMREFQUiI9PVMudHlwZSYmKGYuRD0hMCksUz12b2lkIDApO2JyZWFrO2Nhc2UgMTpjYXNlIDEyOmlmKCFjLnNoZWV0U3R1YnN8fHgpYnJlYWs7Zj17dDoieiIsdjp2b2lkIDB9LHA9LTE9PWVbMF0uYz9wKzE6ZVswXS5jLGMuZGVuc2U/KGxbIiFkYXRhIl1baF18fChsWyIhZGF0YSJdW2hdPVtdKSxsWyIhZGF0YSJdW2hdW3BdPWYpOmxbaXYocCkrYl09Zix2LnMucj51LnImJih2LnMucj11LnIpLHYucy5jPnAmJih2LnMuYz1wKSx2LmUucjx1LnImJih2LmUucj11LnIpLHYuZS5jPHAmJih2LmUuYz1wKSxTJiYoIlhMREFQUiI9PVMudHlwZSYmKGYuRD0hMCksUz12b2lkIDApO2JyZWFrO2Nhc2UgMTc2OlQucHVzaChlKTticmVhaztjYXNlIDQ5OlM9KChjLnhsbWV0YXx8e30pLkNlbGx8fFtdKVtlLTFdO2JyZWFrO2Nhc2UgNDk0OnZhciBQPXJbIiFpZCJdW2UucmVsSWRdO2ZvcihQPyhlLlRhcmdldD1QLlRhcmdldCxlLmxvYyYmKGUuVGFyZ2V0Kz0iIyIrZS5sb2MpLGUuUmVsPVApOiIiPT1lLnJlbElkJiYoZS5UYXJnZXQ9IiMiK2UubG9jKSxoPWUucmZ4LnMucjtoPD1lLnJmeC5lLnI7KytoKWZvcihwPWUucmZ4LnMuYztwPD1lLnJmeC5lLmM7KytwKWMuZGVuc2U/KGxbIiFkYXRhIl1baF18fChsWyIhZGF0YSJdW2hdPVtdKSxsWyIhZGF0YSJdW2hdW3BdfHwobFsiIWRhdGEiXVtoXVtwXT17dDoieiIsdjp2b2lkIDB9KSxsWyIhZGF0YSJdW2hdW3BdLmw9ZSk6KGc9aXYocCkrbnYoaCksbFtnXXx8KGxbZ109e3Q6InoiLHY6dm9pZCAwfSksbFtnXS5sPWUpO2JyZWFrO2Nhc2UgNDI2OmlmKCFjLmNlbGxGb3JtdWxhKWJyZWFrO0UucHVzaChlKSwoeT1jLmRlbnNlP2xbIiFkYXRhIl1baF1bcF06bFtpdihwKStiXSkuZj1WVChlWzFdLDAse3I6dS5yLGM6cH0sQSxjKSx5LkY9c3YoZVswXSk7YnJlYWs7Y2FzZSA0Mjc6aWYoIWMuY2VsbEZvcm11bGEpYnJlYWs7VVtvdihlWzBdLnMpXT1lWzFdLCh5PWMuZGVuc2U/bFsiIWRhdGEiXVtoXVtwXTpsW2l2KHApK2JdKS5mPVZUKGVbMV0sMCx7cjp1LnIsYzpwfSxBLGMpO2JyZWFrO2Nhc2UgNjA6aWYoIWMuY2VsbFN0eWxlcylicmVhaztmb3IoO2UuZT49ZS5zOylDW2UuZS0tXT17d2lkdGg6ZS53LzI1NixoaWRkZW46ISEoMSZlLmZsYWdzKSxsZXZlbDplLmxldmVsfSxPfHwoTz0hMCxqRChlLncvMjU2KSksekQoQ1tlLmUrMV0pO2JyZWFrO2Nhc2UgNTUxOmUmJihsWyIhbGVncmVsIl09ZSk7YnJlYWs7Y2FzZSAxNjE6bFsiIWF1dG9maWx0ZXIiXT17cmVmOnN2KGUpfTticmVhaztjYXNlIDQ3NjpsWyIhbWFyZ2lucyJdPWU7YnJlYWs7Y2FzZSAxNDc6aS5TaGVldHNbbl18fChpLlNoZWV0c1tuXT17fSksZS5uYW1lJiYoaS5TaGVldHNbbl0uQ29kZU5hbWU9ZS5uYW1lKSwoZS5hYm92ZXx8ZS5sZWZ0KSYmKGxbIiFvdXRsaW5lIl09e2Fib3ZlOmUuYWJvdmUsbGVmdDplLmxlZnR9KTticmVhaztjYXNlIDEzNzppLlZpZXdzfHwoaS5WaWV3cz1be31dKSxpLlZpZXdzWzBdfHwoaS5WaWV3c1swXT17fSksZS5SVEwmJihpLlZpZXdzWzBdLlJUTD0hMCk7YnJlYWs7Y2FzZSA0ODU6Y2FzZSA2NDpjYXNlIDEwNTM6Y2FzZSAxNTE6Y2FzZSAxNTI6Y2FzZSAxNzU6Y2FzZSA2NDQ6Y2FzZSA2MjU6Y2FzZSA1NjI6Y2FzZSAzOTY6Y2FzZSAxMTEyOmNhc2UgMTE0NjpjYXNlIDQ3MTpjYXNlIDEwNTA6Y2FzZSA2NDk6Y2FzZSAxMTA1OmNhc2UgNTg5OmNhc2UgNjA3OmNhc2UgNTY0OmNhc2UgMTA1NTpjYXNlIDE2ODpjYXNlIDE3NDpjYXNlIDExODA6Y2FzZSA0OTk6Y2FzZSA1MDc6Y2FzZSA1NTA6Y2FzZSAxNzE6Y2FzZSAxNjc6Y2FzZSAxMTc3OmNhc2UgMTY5OmNhc2UgMTE4MTpjYXNlIDU1MjpjYXNlIDY2MTpjYXNlIDYzOTpjYXNlIDQ3ODpjYXNlIDUzNzpjYXNlIDQ3NzpjYXNlIDUzNjpjYXNlIDExMDM6Y2FzZSA2ODA6Y2FzZSAxMTA0OmNhc2UgMTAyNDpjYXNlIDY2MzpjYXNlIDUzNTpjYXNlIDY3ODpjYXNlIDUwNDpjYXNlIDEwNDM6Y2FzZSA0Mjg6Y2FzZSAxNzA6Y2FzZSAzMDcyOmNhc2UgNTA6Y2FzZSAyMDcwOmNhc2UgMTA0NTpicmVhaztjYXNlIDM1OmNhc2UgMzc6eD0hMDticmVhaztjYXNlIDM2OmNhc2UgMzg6eD0hMTticmVhaztkZWZhdWx0OmlmKHQuVCk7ZWxzZSBpZigheHx8Yy5XVEYpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHJlY29yZCAweCIray50b1N0cmluZygxNikpfX0pLGMpLGRlbGV0ZSBjLnN1cGJvb2tzLGRlbGV0ZSBjWyIhcm93Il0sIWxbIiFyZWYiXSYmKHYucy5yPDJlNnx8cyYmKHMuZS5yPjB8fHMuZS5jPjB8fHMucy5yPjB8fHMucy5jPjApKSYmKGxbIiFyZWYiXT1zdihzfHx2KSksYy5zaGVldFJvd3MmJmxbIiFyZWYiXSl7dmFyIFI9bHYobFsiIXJlZiJdKTtjLnNoZWV0Um93czw9K1IuZS5yJiYoUi5lLnI9Yy5zaGVldFJvd3MtMSxSLmUucj52LmUuciYmKFIuZS5yPXYuZS5yKSxSLmUucjxSLnMuciYmKFIucy5yPVIuZS5yKSxSLmUuYz52LmUuYyYmKFIuZS5jPXYuZS5jKSxSLmUuYzxSLnMuYyYmKFIucy5jPVIuZS5jKSxsWyIhZnVsbHJlZiJdPWxbIiFyZWYiXSxsWyIhcmVmIl09c3YoUikpfXJldHVybiBULmxlbmd0aD4wJiYobFsiIW1lcmdlcyJdPVQpLEMubGVuZ3RoPjAmJihsWyIhY29scyJdPUMpLEYubGVuZ3RoPjAmJihsWyIhcm93cyJdPUYpLHJbIiFpZCJdW2xbIiFsZWdyZWwiXV0mJihsWyIhbGVnZHJhd2VsIl09clsiIWlkIl1bbFsiIWxlZ3JlbCJdXSksbH0oZSxyLG4saSxhLG8sYyk6eXcoZSxyLG4saSxhLG8sYyl9ZnVuY3Rpb24gTHcoZSx0LG4scixpLGEsbyxjKXtyZXR1cm4iLmJpbiI9PT10LnNsaWNlKC00KT9mdW5jdGlvbihlLHQsbixyLGkpe2lmKCFlKXJldHVybiBlO3J8fChyPXsiIWlkIjp7fX0pO3ZhciBhPXsiIXR5cGUiOiJjaGFydCIsIiFkcmF3ZWwiOm51bGwsIiFyZWwiOiIifSxvPSExO3JldHVybiBZeShlLChmdW5jdGlvbihlLHIsYyl7c3dpdGNoKGMpe2Nhc2UgNTUwOmFbIiFyZWwiXT1lO2JyZWFrO2Nhc2UgNjUxOmkuU2hlZXRzW25dfHwoaS5TaGVldHNbbl09e30pLGUubmFtZSYmKGkuU2hlZXRzW25dLkNvZGVOYW1lPWUubmFtZSk7YnJlYWs7Y2FzZSA1NjI6Y2FzZSA2NTI6Y2FzZSA2Njk6Y2FzZSA2Nzk6Y2FzZSA1NTE6Y2FzZSA1NTI6Y2FzZSA0NzY6Y2FzZSAzMDcyOmNhc2UgMzc6Y2FzZSAzODpicmVhaztjYXNlIDM1Om89ITA7YnJlYWs7Y2FzZSAzNjpvPSExO2JyZWFrO2RlZmF1bHQ6aWYoci5UPjApO2Vsc2UgaWYoci5UPDApO2Vsc2UgaWYoIW98fHQuV1RGKXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCByZWNvcmQgMHgiK2MudG9TdHJpbmcoMTYpKX19KSx0KSxyWyIhaWQiXVthWyIhcmVsIl1dJiYoYVsiIWRyYXdlbCJdPXJbIiFpZCJdW2FbIiFyZWwiXV0pLGF9KGUscixuLGksYSk6ZnVuY3Rpb24oZSx0LG4scixpKXtpZighZSlyZXR1cm4gZTtyfHwocj17IiFpZCI6e319KTt2YXIgYSxvPXsiIXR5cGUiOiJjaGFydCIsIiFkcmF3ZWwiOm51bGwsIiFyZWwiOiIifSxjPWUubWF0Y2goZ3cpO3JldHVybiBjJiZ2dyhjWzBdLDAsaSxuKSwoYT1lLm1hdGNoKC9kcmF3aW5nIHI6aWQ9IiguKj8pIi8pKSYmKG9bIiFyZWwiXT1hWzFdKSxyWyIhaWQiXVtvWyIhcmVsIl1dJiYob1siIWRyYXdlbCJdPXJbIiFpZCJdW29bIiFyZWwiXV0pLG99KGUsMCxuLGksYSl9ZnVuY3Rpb24gTXcoZSx0LG4scil7cmV0dXJuIi5iaW4iPT09dC5zbGljZSgtNCk/ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXtOdW1iZXJGbXQ6W119O2Zvcih2YXIgaSBpbiBnbSlyLk51bWJlckZtdFtpXT1nbVtpXTtyLkNlbGxYZj1bXSxyLkZvbnRzPVtdO3ZhciBhPVtdLG89ITE7cmV0dXJuIFl5KGUsKGZ1bmN0aW9uKGUsaSxjKXtzd2l0Y2goYyl7Y2FzZSA0NDpyLk51bWJlckZtdFtlWzBdXT1lWzFdLCRtKGVbMV0sZVswXSk7YnJlYWs7Y2FzZSA0MzpyLkZvbnRzLnB1c2goZSksbnVsbCE9ZS5jb2xvci50aGVtZSYmdCYmdC50aGVtZUVsZW1lbnRzJiZ0LnRoZW1lRWxlbWVudHMuY2xyU2NoZW1lJiYoZS5jb2xvci5yZ2I9T0QodC50aGVtZUVsZW1lbnRzLmNsclNjaGVtZVtlLmNvbG9yLnRoZW1lXS5yZ2IsZS5jb2xvci50aW50fHwwKSk7YnJlYWs7Y2FzZSAxMDI1OmNhc2UgNDU6Y2FzZSA0NjpjYXNlIDQ4OmNhc2UgNTA3OmNhc2UgNTcyOmNhc2UgNDc1OmNhc2UgMTE3MTpjYXNlIDIxMDI6Y2FzZSAxMTMwOmNhc2UgNTEyOmNhc2UgMjA5NTpjYXNlIDMwNzI6YnJlYWs7Y2FzZSA0Nzo2MTc9PWFbYS5sZW5ndGgtMV0mJnIuQ2VsbFhmLnB1c2goZSk7YnJlYWs7Y2FzZSAzNTpvPSEwO2JyZWFrO2Nhc2UgMzY6bz0hMTticmVhaztjYXNlIDM3OmEucHVzaChjKSxvPSEwO2JyZWFrO2Nhc2UgMzg6YS5wb3AoKSxvPSExO2JyZWFrO2RlZmF1bHQ6aWYoaS5UPjApYS5wdXNoKGMpO2Vsc2UgaWYoaS5UPDApYS5wb3AoKTtlbHNlIGlmKCFvfHxuLldURiYmMzchPWFbYS5sZW5ndGgtMV0pdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHJlY29yZCAweCIrYy50b1N0cmluZygxNikpfX0pKSxyfShlLG4scik6WUQoZSxuLHIpfWZ1bmN0aW9uIGp3KGUsdCxuKXtyZXR1cm4iLmJpbiI9PT10LnNsaWNlKC00KT9mdW5jdGlvbihlLHQpe3ZhciBuPVtdLHI9ITE7cmV0dXJuIFl5KGUsKGZ1bmN0aW9uKGUsaSxhKXtzd2l0Y2goYSl7Y2FzZSAxNTk6bi5Db3VudD1lWzBdLG4uVW5pcXVlPWVbMV07YnJlYWs7Y2FzZSAxOTpuLnB1c2goZSk7YnJlYWs7Y2FzZSAxNjA6cmV0dXJuITA7Y2FzZSAzNTpyPSEwO2JyZWFrO2Nhc2UgMzY6cj0hMTticmVhaztkZWZhdWx0OmlmKGkuVCwhcnx8dC5XVEYpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHJlY29yZCAweCIrYS50b1N0cmluZygxNikpfX0pKSxufShlLG4pOmZ1bmN0aW9uKGUsdCl7dmFyIG49W10scj0iIjtpZighZSlyZXR1cm4gbjt2YXIgaT1lLm1hdGNoKGhEKTtpZihpKXtyPWlbMl0ucmVwbGFjZShwRCwiIikuc3BsaXQoZ0QpO2Zvcih2YXIgYT0wO2EhPXIubGVuZ3RoOysrYSl7dmFyIG89ZEQoclthXS50cmltKCksdCk7bnVsbCE9byYmKG5bbi5sZW5ndGhdPW8pfWk9TGIoaVsxXSksbi5Db3VudD1pLmNvdW50LG4uVW5pcXVlPWkudW5pcXVlQ291bnR9cmV0dXJuIG59KGUsbil9ZnVuY3Rpb24gencoZSx0LG4pe3JldHVybiIuYmluIj09PXQuc2xpY2UoLTQpP2Z1bmN0aW9uKGUsdCl7dmFyIG49W10scj1bXSxpPXt9LGE9ITE7cmV0dXJuIFl5KGUsKGZ1bmN0aW9uKGUsbyxjKXtzd2l0Y2goYyl7Y2FzZSA2MzI6ci5wdXNoKGUpO2JyZWFrO2Nhc2UgNjM1Omk9ZTticmVhaztjYXNlIDYzNzppLnQ9ZS50LGkuaD1lLmgsaS5yPWUucjticmVhaztjYXNlIDYzNjppZihpLmF1dGhvcj1yW2kuaWF1dGhvcl0sZGVsZXRlIGkuaWF1dGhvcix0LnNoZWV0Um93cyYmaS5yZngmJnQuc2hlZXRSb3dzPD1pLnJmeC5yKWJyZWFrO2kudHx8KGkudD0iIiksZGVsZXRlIGkucmZ4LG4ucHVzaChpKTticmVhaztjYXNlIDMwNzI6Y2FzZSAzNzpjYXNlIDM4OmJyZWFrO2Nhc2UgMzU6YT0hMDticmVhaztjYXNlIDM2OmE9ITE7YnJlYWs7ZGVmYXVsdDppZihvLlQpO2Vsc2UgaWYoIWF8fHQuV1RGKXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCByZWNvcmQgMHgiK2MudG9TdHJpbmcoMTYpKX19KSksbn0oZSxuKTpmdW5jdGlvbihlLHQpe2lmKGUubWF0Y2goLzwoPzpcdys6KT9jb21tZW50cyAqXC8+LykpcmV0dXJuW107dmFyIG49W10scj1bXSxpPWUubWF0Y2goLzwoPzpcdys6KT9hdXRob3JzPihbXHNcU10qKTxcLyg/Olx3KzopP2F1dGhvcnM+Lyk7aSYmaVsxXSYmaVsxXS5zcGxpdCgvPFwvXHcqOj9hdXRob3I+LykuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoIiIhPT1lJiYiIiE9PWUudHJpbSgpKXt2YXIgdD1lLm1hdGNoKC88KD86XHcrOik/YXV0aG9yW14+XSo+KC4qKS8pO3QmJm4ucHVzaCh0WzFdKX19KSk7dmFyIGE9ZS5tYXRjaCgvPCg/Olx3KzopP2NvbW1lbnRMaXN0PihbXHNcU10qKTxcLyg/Olx3KzopP2NvbW1lbnRMaXN0Pi8pO3JldHVybiBhJiZhWzFdJiZhWzFdLnNwbGl0KC88XC9cdyo6P2NvbW1lbnQ+LykuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoIiIhPT1lJiYiIiE9PWUudHJpbSgpKXt2YXIgaT1lLm1hdGNoKC88KD86XHcrOik/Y29tbWVudFtePl0qPi8pO2lmKGkpe3ZhciBhPUxiKGlbMF0pLG89e2F1dGhvcjphLmF1dGhvcklkJiZuW2EuYXV0aG9ySWRdfHwic2hlZXRqc2dob3N0IixyZWY6YS5yZWYsZ3VpZDphLmd1aWR9LGM9YXYoYS5yZWYpO2lmKCEodC5zaGVldFJvd3MmJnQuc2hlZXRSb3dzPD1jLnIpKXt2YXIgcz1lLm1hdGNoKC88KD86XHcrOik/dGV4dD4oW1xzXFNdKik8XC8oPzpcdys6KT90ZXh0Pi8pLGw9ISFzJiYhIXNbMV0mJmREKHNbMV0pfHx7cjoiIix0OiIiLGg6IiJ9O28ucj1sLnIsIjx0PjwvdD4iPT1sLnImJihsLnQ9bC5oPSIiKSxvLnQ9KGwudHx8IiIpLnJlcGxhY2UoL1xyXG4vZywiXG4iKS5yZXBsYWNlKC9cci9nLCJcbiIpLHQuY2VsbEhUTUwmJihvLmg9bC5oKSxyLnB1c2gobyl9fX19KSkscn0oZSxuKX1mdW5jdGlvbiBIdyhlLHQsbil7cmV0dXJuIi5iaW4iPT09dC5zbGljZSgtNCk/ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdO3JldHVybiBZeShlLChmdW5jdGlvbihlLHQsbil7aWYoNjM9PT1uKXIucHVzaChlKTtlbHNlIGlmKCF0LlQpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHJlY29yZCAweCIrbi50b1N0cmluZygxNikpfSkpLHJ9KGUpOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO2lmKCFlKXJldHVybiB0O3ZhciBuPTE7cmV0dXJuKGUubWF0Y2goUGIpfHxbXSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHI9TGIoZSk7c3dpdGNoKHJbMF0pe2Nhc2UiPD94bWwiOmNhc2UiPGNhbGNDaGFpbiI6Y2FzZSI8Y2FsY0NoYWluPiI6Y2FzZSI8L2NhbGNDaGFpbj4iOmJyZWFrO2Nhc2UiPGMiOmRlbGV0ZSByWzBdLHIuaT9uPXIuaTpyLmk9bix0LnB1c2gocil9fSkpLHR9KGUpfWZ1bmN0aW9uIFZ3KGUsdCxuLHIpe2lmKCIuYmluIj09PW4uc2xpY2UoLTQpKXJldHVybiBmdW5jdGlvbihlLHQsbixyKXtpZighZSlyZXR1cm4gZTt2YXIgaT1yfHx7fSxhPSExO1l5KGUsKGZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2gobil7Y2FzZSAzNTk6Y2FzZSAzNjM6Y2FzZSAzNjQ6Y2FzZSAzNjY6Y2FzZSAzNjc6Y2FzZSAzNjg6Y2FzZSAzNjk6Y2FzZSAzNzA6Y2FzZSAzNzE6Y2FzZSA0NzI6Y2FzZSA1Nzc6Y2FzZSA1Nzg6Y2FzZSA1Nzk6Y2FzZSA1ODA6Y2FzZSA1ODE6Y2FzZSA1ODI6Y2FzZSA1ODM6Y2FzZSA1ODQ6Y2FzZSA1ODU6Y2FzZSA1ODY6Y2FzZSA1ODc6YnJlYWs7Y2FzZSAzNTphPSEwO2JyZWFrO2Nhc2UgMzY6YT0hMTticmVhaztkZWZhdWx0OmlmKHQuVCk7ZWxzZSBpZighYXx8aS5XVEYpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHJlY29yZCAweCIrbi50b1N0cmluZygxNikpfX0pLGkpfShlLDAsMCxyKX1mdW5jdGlvbiBxdyhlLHQsbil7cmV0dXJuIi5iaW4iPT09dC5zbGljZSgtNCk/ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXtUeXBlczpbXSxDZWxsOltdLFZhbHVlOltdfSxpPW58fHt9LGE9W10sbz0hMSxjPTI7cmV0dXJuIFl5KGUsKGZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2gobil7Y2FzZSAzMzU6ci5UeXBlcy5wdXNoKHtuYW1lOmUubmFtZX0pO2JyZWFrO2Nhc2UgNTE6ZS5mb3JFYWNoKChmdW5jdGlvbihlKXsxPT1jP3IuQ2VsbC5wdXNoKHt0eXBlOnIuVHlwZXNbZVswXS0xXS5uYW1lLGluZGV4OmVbMV19KTowPT1jJiZyLlZhbHVlLnB1c2goe3R5cGU6ci5UeXBlc1tlWzBdLTFdLm5hbWUsaW5kZXg6ZVsxXX0pfSkpO2JyZWFrO2Nhc2UgMzM3OmM9ZT8xOjA7YnJlYWs7Y2FzZSAzMzg6Yz0yO2JyZWFrO2Nhc2UgMzU6YS5wdXNoKG4pLG89ITA7YnJlYWs7Y2FzZSAzNjphLnBvcCgpLG89ITE7YnJlYWs7ZGVmYXVsdDppZih0LlQpO2Vsc2UgaWYoIW98fGkuV1RGJiYzNSE9YVthLmxlbmd0aC0xXSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgcmVjb3JkIDB4IituLnRvU3RyaW5nKDE2KSl9fSkpLHJ9KGUsMCxuKTpmdW5jdGlvbihlLHQsbil7dmFyIHI9e1R5cGVzOltdLENlbGw6W10sVmFsdWU6W119O2lmKCFlKXJldHVybiByO3ZhciBpLGE9ITEsbz0yO3JldHVybiBlLnJlcGxhY2UoUGIsKGZ1bmN0aW9uKGUpe3ZhciB0PUxiKGUpO3N3aXRjaChNYih0WzBdKSl7Y2FzZSI8P3htbCI6Y2FzZSI8bWV0YWRhdGEiOmNhc2UiPC9tZXRhZGF0YT4iOmNhc2UiPG1ldGFkYXRhVHlwZXMiOmNhc2UiPC9tZXRhZGF0YVR5cGVzPiI6Y2FzZSI8L21ldGFkYXRhVHlwZT4iOmNhc2UiPC9mdXR1cmVNZXRhZGF0YT4iOmNhc2UiPGJrPiI6Y2FzZSI8L2JrPiI6Y2FzZSI8L3JjPiI6Y2FzZSI8ZXh0THN0IjpjYXNlIjxleHRMc3Q+IjpjYXNlIjwvZXh0THN0PiI6Y2FzZSI8ZXh0THN0Lz4iOmJyZWFrO2Nhc2UiPG1ldGFkYXRhVHlwZSI6ci5UeXBlcy5wdXNoKHtuYW1lOnQubmFtZX0pO2JyZWFrO2Nhc2UiPGZ1dHVyZU1ldGFkYXRhIjpmb3IodmFyIGM9MDtjPHIuVHlwZXMubGVuZ3RoOysrYylyLlR5cGVzW2NdLm5hbWU9PXQubmFtZSYmKGk9ci5UeXBlc1tjXSk7YnJlYWs7Y2FzZSI8cmMiOjE9PW8/ci5DZWxsLnB1c2goe3R5cGU6ci5UeXBlc1t0LnQtMV0ubmFtZSxpbmRleDordC52fSk6MD09byYmci5WYWx1ZS5wdXNoKHt0eXBlOnIuVHlwZXNbdC50LTFdLm5hbWUsaW5kZXg6K3Qudn0pO2JyZWFrO2Nhc2UiPGNlbGxNZXRhZGF0YSI6bz0xO2JyZWFrO2Nhc2UiPC9jZWxsTWV0YWRhdGE+IjpjYXNlIjwvdmFsdWVNZXRhZGF0YT4iOm89MjticmVhaztjYXNlIjx2YWx1ZU1ldGFkYXRhIjpvPTA7YnJlYWs7Y2FzZSI8ZXh0IjphPSEwO2JyZWFrO2Nhc2UiPC9leHQ+IjphPSExO2JyZWFrO2Nhc2UiPHJ2YiI6aWYoIWkpYnJlYWs7aS5vZmZzZXRzfHwoaS5vZmZzZXRzPVtdKSxpLm9mZnNldHMucHVzaCgrdC5pKTticmVhaztkZWZhdWx0OmlmKCFhJiYobnVsbD09bj92b2lkIDA6bi5XVEYpKXRocm93IG5ldyBFcnJvcigidW5yZWNvZ25pemVkICIrdFswXSsiIGluIG1ldGFkYXRhIil9cmV0dXJuIGV9KSkscn0oZSwwLG4pfXZhciBHdyxYdz0vKFtcdzpdKyk9KCg/OiIpKFteIl0qKSg/OiIpfCg/OicpKFteJ10qKSg/OicpKS9nLCR3PS8oW1x3Ol0rKT0oKD86IikoPzpbXiJdKikoPzoiKXwoPzonKSg/OlteJ10qKSg/OicpKS87ZnVuY3Rpb24gWXcoZSx0KXt2YXIgbj1lLnNwbGl0KC9ccysvKSxyPVtdO2lmKHR8fChyWzBdPW5bMF0pLDE9PT1uLmxlbmd0aClyZXR1cm4gcjt2YXIgaSxhLG8sYz1lLm1hdGNoKFh3KTtpZihjKWZvcihvPTA7byE9Yy5sZW5ndGg7KytvKS0xPT09KGE9KGk9Y1tvXS5tYXRjaCgkdykpWzFdLmluZGV4T2YoIjoiKSk/cltpWzFdXT1pWzJdLnNsaWNlKDEsaVsyXS5sZW5ndGgtMSk6clsieG1sbnM6Ij09PWlbMV0uc2xpY2UoMCw2KT8ieG1sbnMiK2lbMV0uc2xpY2UoNik6aVsxXS5zbGljZShhKzEpXT1pWzJdLnNsaWNlKDEsaVsyXS5sZW5ndGgtMSk7cmV0dXJuIHJ9ZnVuY3Rpb24gS3coZSl7dmFyIHQ9e307aWYoMT09PWUuc3BsaXQoL1xzKy8pLmxlbmd0aClyZXR1cm4gdDt2YXIgbixyLGksYT1lLm1hdGNoKFh3KTtpZihhKWZvcihpPTA7aSE9YS5sZW5ndGg7KytpKS0xPT09KHI9KG49YVtpXS5tYXRjaCgkdykpWzFdLmluZGV4T2YoIjoiKSk/dFtuWzFdXT1uWzJdLnNsaWNlKDEsblsyXS5sZW5ndGgtMSk6dFsieG1sbnM6Ij09PW5bMV0uc2xpY2UoMCw2KT8ieG1sbnMiK25bMV0uc2xpY2UoNik6blsxXS5zbGljZShyKzEpXT1uWzJdLnNsaWNlKDEsblsyXS5sZW5ndGgtMSk7cmV0dXJuIHR9ZnVuY3Rpb24gWncoZSx0LG4scil7dmFyIGk9cjtzd2l0Y2goKG5bMF0ubWF0Y2goL2R0OmR0PSIoW1x3Ll0rKSIvKXx8WyIiLCIiXSlbMV0pe2Nhc2UiYm9vbGVhbiI6aT0kYihyKTticmVhaztjYXNlImkyIjpjYXNlImludCI6aT1wYXJzZUludChyLDEwKTticmVhaztjYXNlInI0IjpjYXNlImZsb2F0IjppPXBhcnNlRmxvYXQocik7YnJlYWs7Y2FzZSJkYXRlIjpjYXNlImRhdGVUaW1lLnR6IjppPXNiKHIpO2JyZWFrO2Nhc2UiaTgiOmNhc2Uic3RyaW5nIjpjYXNlImZpeGVkIjpjYXNlInV1aWQiOmNhc2UiYmluLmJhc2U2NCI6YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImJhZCBjdXN0cHJvcDoiK25bMF0pfWVbSGIodCldPWl9ZnVuY3Rpb24gSncoZSx0LG4scil7aWYoInoiIT09ZS50KXtpZighbnx8ITEhPT1uLmNlbGxUZXh0KXRyeXsiZSI9PT1lLnQ/ZS53PWUud3x8enZbZS52XToiR2VuZXJhbCI9PT10PyJuIj09PWUudD8oMHxlLnYpPT09ZS52P2Uudz1lLnYudG9TdHJpbmcoMTApOmUudz1EbShlLnYpOmUudz1UbShlLnYpOmUudz1mdW5jdGlvbihlLHQsbil7dmFyIHI9R3dbZV18fEhiKGUpO3JldHVybiJHZW5lcmFsIj09PXI/VG0odCk6SG0ocix0LHtkYXRlMTkwNDohIW59KX0odHx8IkdlbmVyYWwiLGUudixyKX1jYXRjaChlKXtpZihuLldURil0aHJvdyBlfXRyeXt2YXIgaT1Hd1t0XXx8dHx8IkdlbmVyYWwiO2lmKG4uY2VsbE5GJiYoZS56PWkpLG4uY2VsbERhdGVzJiYibiI9PWUudCYmTG0oaSkpe3ZhciBhPXZtKGUudisocj8xNDYyOjApKTthJiYoZS50PSJkIixlLnY9bmV3IERhdGUoRGF0ZS5VVEMoYS55LGEubS0xLGEuZCxhLkgsYS5NLGEuUyxhLnUpKSl9fWNhdGNoKGUpe2lmKG4uV1RGKXRocm93IGV9fX1mdW5jdGlvbiBRdyhlLHQsbil7aWYobi5jZWxsU3R5bGVzJiZ0LkludGVyaW9yKXt2YXIgcj10LkludGVyaW9yO3IuUGF0dGVybiYmKHIucGF0dGVyblR5cGU9R0Rbci5QYXR0ZXJuXXx8ci5QYXR0ZXJuKX1lW3QuSURdPXR9ZnVuY3Rpb24gZV8oZSx0LG4scixpLGEsbyxjLHMsbCx1KXt2YXIgZj0iR2VuZXJhbCIsZD1yLlN0eWxlSUQsaD17fTtsPWx8fHt9O3ZhciBwPVtdLGc9MDtmb3Iodm9pZCAwPT09ZCYmYyYmKGQ9Yy5TdHlsZUlEKSx2b2lkIDA9PT1kJiZvJiYoZD1vLlN0eWxlSUQpO3ZvaWQgMCE9PWFbZF0mJihhW2RdLm5mJiYoZj1hW2RdLm5mKSxhW2RdLkludGVyaW9yJiZwLnB1c2goYVtkXS5JbnRlcmlvciksYVtkXS5QYXJlbnQpOylkPWFbZF0uUGFyZW50O3N3aXRjaChuLlR5cGUpe2Nhc2UiQm9vbGVhbiI6ci50PSJiIixyLnY9JGIoZSk7YnJlYWs7Y2FzZSJTdHJpbmciOnIudD0icyIsci5yPVhiKEhiKGUpKSxyLnY9ZS5pbmRleE9mKCI8Iik+LTE/SGIodHx8ZSkucmVwbGFjZSgvPC4qPz4vZywiIik6ci5yO2JyZWFrO2Nhc2UiRGF0ZVRpbWUiOiJaIiE9ZS5zbGljZSgtMSkmJihlKz0iWiIpLHIudj1uYihzYihlLHUpLHUpLHIudiE9ci52JiYoci52PUhiKGUpKSxmJiYiR2VuZXJhbCIhPWZ8fChmPSJ5eXl5LW1tLWRkIik7Y2FzZSJOdW1iZXIiOnZvaWQgMD09PXIudiYmKHIudj0rZSksci50fHwoci50PSJuIik7YnJlYWs7Y2FzZSJFcnJvciI6ci50PSJlIixyLnY9SHZbZV0sITEhPT1sLmNlbGxUZXh0JiYoci53PWUpO2JyZWFrO2RlZmF1bHQ6IiI9PWUmJiIiPT10P3IudD0ieiI6KHIudD0icyIsci52PVhiKHR8fGUpKX1pZihKdyhyLGYsbCx1KSwhMSE9PWwuY2VsbEZvcm11bGEpaWYoci5Gb3JtdWxhKXt2YXIgbT1IYihyLkZvcm11bGEpOzYxPT1tLmNoYXJDb2RlQXQoMCkmJihtPW0uc2xpY2UoMSkpLHIuZj1oVChtLGkpLGRlbGV0ZSByLkZvcm11bGEsIlJDIj09ci5BcnJheVJhbmdlP3IuRj1oVCgiUkM6UkMiLGkpOnIuQXJyYXlSYW5nZSYmKHIuRj1oVChyLkFycmF5UmFuZ2UsaSkscy5wdXNoKFtsdihyLkYpLHIuRl0pKX1lbHNlIGZvcihnPTA7ZzxzLmxlbmd0aDsrK2cpaS5yPj1zW2ddWzBdLnMuciYmaS5yPD1zW2ddWzBdLmUuciYmaS5jPj1zW2ddWzBdLnMuYyYmaS5jPD1zW2ddWzBdLmUuYyYmKHIuRj1zW2ddWzFdKTtsLmNlbGxTdHlsZXMmJihwLmZvckVhY2goKGZ1bmN0aW9uKGUpeyFoLnBhdHRlcm5UeXBlJiZlLnBhdHRlcm5UeXBlJiYoaC5wYXR0ZXJuVHlwZT1lLnBhdHRlcm5UeXBlKX0pKSxyLnM9aCksdm9pZCAwIT09ci5TdHlsZUlEJiYoci5peGZlPXIuU3R5bGVJRCl9ZnVuY3Rpb24gdF8oZSl7ZS50PWUudnx8IiIsZS50PWUudC5yZXBsYWNlKC9cclxuL2csIlxuIikucmVwbGFjZSgvXHIvZywiXG4iKSxlLnY9ZS53PWUuaXhmZT12b2lkIDB9ZnVuY3Rpb24gbl8oZSx0KXt2YXIgbj10fHx7fTtWbSgpO3ZhciByPXpnKGx5KGUpKTsiYmluYXJ5IiE9bi50eXBlJiYiYXJyYXkiIT1uLnR5cGUmJiJiYXNlNjQiIT1uLnR5cGV8fChyPVFiKHIpKTt2YXIgaSxhPXIuc2xpY2UoMCwxMDI0KS50b0xvd2VyQ2FzZSgpLG89ITE7aWYoKDEwMjMmKGE9YS5yZXBsYWNlKC8iLio/Ii9nLCIiKSkuaW5kZXhPZigiPiIpKT5NYXRoLm1pbigxMDIzJmEuaW5kZXhPZigiLCIpLDEwMjMmYS5pbmRleE9mKCI7IikpKXt2YXIgYz11YihuKTtyZXR1cm4gYy50eXBlPSJzdHJpbmciLGFELnRvX3dvcmtib29rKHIsYyl9aWYoLTE9PWEuaW5kZXhPZigiPD94bWwiKSYmWyJodG1sIiwidGFibGUiLCJoZWFkIiwibWV0YSIsInNjcmlwdCIsInN0eWxlIiwiZGl2Il0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7YS5pbmRleE9mKCI8IitlKT49MCYmKG89ITApfSkpLG8pcmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5tYXRjaCgvPHRhYmxlW1xzXFNdKj8+W1xzXFNdKj88XC90YWJsZT4vZ2kpO2lmKCFufHwwPT1uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgSFRNTDogY291bGQgbm90IGZpbmQgPHRhYmxlPiIpO2lmKDE9PW4ubGVuZ3RoKXt2YXIgcj1kdihnXyhuWzBdLHQpLHQpO3JldHVybiByLmJvb2tUeXBlPSJodG1sIixyfXZhciBpPWxFKCk7cmV0dXJuIG4uZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt1RShpLGdfKGUsdCksIlNoZWV0IisobisxKSl9KSksaS5ib29rVHlwZT0iaHRtbCIsaX0ocixuKTtHdz17IkdlbmVyYWwgTnVtYmVyIjoiR2VuZXJhbCIsIkdlbmVyYWwgRGF0ZSI6Z21bMjJdLCJMb25nIERhdGUiOiJkZGRkLCBtbW1tIGRkLCB5eXl5IiwiTWVkaXVtIERhdGUiOmdtWzE1XSwiU2hvcnQgRGF0ZSI6Z21bMTRdLCJMb25nIFRpbWUiOmdtWzE5XSwiTWVkaXVtIFRpbWUiOmdtWzE4XSwiU2hvcnQgVGltZSI6Z21bMjBdLEN1cnJlbmN5OiciJCIjLCMjMC4wMF8pO1tSZWRdXFwoIiQiIywjIzAuMDBcXCknLEZpeGVkOmdtWzJdLFN0YW5kYXJkOmdtWzRdLFBlcmNlbnQ6Z21bMTBdLFNjaWVudGlmaWM6Z21bMTFdLCJZZXMvTm8iOiciWWVzIjsiWWVzIjsiTm8iO0AnLCJUcnVlL0ZhbHNlIjonIlRydWUiOyJUcnVlIjsiRmFsc2UiO0AnLCJPbi9PZmYiOiciWWVzIjsiWWVzIjsiTm8iO0AnfTt2YXIgcyxsPVtdLHU9e30sZj1bXSxkPXt9LGg9IiI7bi5kZW5zZSYmKGRbIiFkYXRhIl09W10pO3ZhciBwLGc9e30sbT17fSxiPVl3KCc8RGF0YSBzczpUeXBlPSJTdHJpbmciPicpLHk9MCx2PTAseD0wLEQ9e3M6e3I6MmU2LGM6MmU2fSxlOntyOjAsYzowfX0sVD17fSx3PXt9LF89IiIsRT0wLFU9W10sQT17fSxrPXt9LFM9MCxDPVtdLEY9W10sTz17fSxJPVtdLFI9ITEsTj1bXSxQPVtdLEI9e30sVz0wLEw9MCxNPXtTaGVldHM6W10sV0JQcm9wczp7ZGF0ZTE5MDQ6ITF9fSxqPXt9O3V5Lmxhc3RJbmRleD0wLHI9ci5yZXBsYWNlKC88IS0tKFtcc1xTXSo/KS0tPi9nbSwiIik7Zm9yKHZhciB6LEg9IiI7aT11eS5leGVjKHIpOylzd2l0Y2goaVszXT0oSD1pWzNdKS50b0xvd2VyQ2FzZSgpKXtjYXNlImRhdGEiOmlmKCJkYXRhIj09SCl7aWYoIi8iPT09aVsxXSl7aWYoKHM9bC5wb3AoKSlbMF0hPT1pWzNdKXRocm93IG5ldyBFcnJvcigiQmFkIHN0YXRlOiAiK3Muam9pbigifCIpKX1lbHNlIi8iIT09aVswXS5jaGFyQXQoaVswXS5sZW5ndGgtMikmJmwucHVzaChbaVszXSwhMF0pO2JyZWFrfWlmKGxbbC5sZW5ndGgtMV1bMV0pYnJlYWs7Ii8iPT09aVsxXT9lXyhyLnNsaWNlKHksaS5pbmRleCksXyxiLCJjb21tZW50Ij09bFtsLmxlbmd0aC0xXVswXT9POmcse2M6dixyOnh9LFQsSVt2XSxtLE4sbixNLldCUHJvcHMuZGF0ZTE5MDQpOihfPSIiLGI9WXcoaVswXSkseT1pLmluZGV4K2lbMF0ubGVuZ3RoKTticmVhaztjYXNlImNlbGwiOmlmKCIvIj09PWlbMV0paWYoRi5sZW5ndGg+MCYmKGcuYz1GKSwoIW4uc2hlZXRSb3dzfHxuLnNoZWV0Um93cz54KSYmdm9pZCAwIT09Zy52JiYobi5kZW5zZT8oZFsiIWRhdGEiXVt4XXx8KGRbIiFkYXRhIl1beF09W10pLGRbIiFkYXRhIl1beF1bdl09Zyk6ZFtpdih2KStudih4KV09ZyksZy5IUmVmJiYoZy5sPXtUYXJnZXQ6SGIoZy5IUmVmKX0sZy5IUmVmU2NyZWVuVGlwJiYoZy5sLlRvb2x0aXA9Zy5IUmVmU2NyZWVuVGlwKSxkZWxldGUgZy5IUmVmLGRlbGV0ZSBnLkhSZWZTY3JlZW5UaXApLChnLk1lcmdlQWNyb3NzfHxnLk1lcmdlRG93bikmJihXPXYrKDB8cGFyc2VJbnQoZy5NZXJnZUFjcm9zcywxMCkpLEw9eCsoMHxwYXJzZUludChnLk1lcmdlRG93biwxMCkpLChXPnZ8fEw+eCkmJlUucHVzaCh7czp7Yzp2LHI6eH0sZTp7YzpXLHI6TH19KSksbi5zaGVldFN0dWJzKWlmKGcuTWVyZ2VBY3Jvc3N8fGcuTWVyZ2VEb3duKXtmb3IodmFyIFY9djtWPD1XOysrVilmb3IodmFyIHE9eDtxPD1MOysrcSkoVj52fHxxPngpJiYobi5kZW5zZT8oZFsiIWRhdGEiXVtxXXx8KGRbIiFkYXRhIl1bcV09W10pLGRbIiFkYXRhIl1bcV1bVl09e3Q6InoifSk6ZFtpdihWKStudihxKV09e3Q6InoifSk7dj1XKzF9ZWxzZSsrdjtlbHNlIGcuTWVyZ2VBY3Jvc3M/dj1XKzE6Kyt2O2Vsc2UoZz1LdyhpWzBdKSkuSW5kZXgmJih2PStnLkluZGV4LTEpLHY8RC5zLmMmJihELnMuYz12KSx2PkQuZS5jJiYoRC5lLmM9diksIi8+Ij09PWlbMF0uc2xpY2UoLTIpJiYrK3YsRj1bXTticmVhaztjYXNlInJvdyI6Ii8iPT09aVsxXXx8Ii8+Ij09PWlbMF0uc2xpY2UoLTIpPyh4PEQucy5yJiYoRC5zLnI9eCkseD5ELmUuciYmKEQuZS5yPXgpLCIvPiI9PT1pWzBdLnNsaWNlKC0yKSYmKG09WXcoaVswXSkpLkluZGV4JiYoeD0rbS5JbmRleC0xKSx2PTAsKyt4KTooKG09WXcoaVswXSkpLkluZGV4JiYoeD0rbS5JbmRleC0xKSxCPXt9LCgiMCI9PW0uQXV0b0ZpdEhlaWdodHx8bS5IZWlnaHQpJiYoQi5ocHg9cGFyc2VJbnQobS5IZWlnaHQsMTApLEIuaHB0PVZEKEIuaHB4KSxQW3hdPUIpLCIxIj09bS5IaWRkZW4mJihCLmhpZGRlbj0hMCxQW3hdPUIpKTticmVhaztjYXNlIndvcmtzaGVldCI6aWYoIi8iPT09aVsxXSl7aWYoKHM9bC5wb3AoKSlbMF0hPT1pWzNdKXRocm93IG5ldyBFcnJvcigiQmFkIHN0YXRlOiAiK3Muam9pbigifCIpKTtmLnB1c2goaCksRC5zLnI8PUQuZS5yJiZELnMuYzw9RC5lLmMmJihkWyIhcmVmIl09c3YoRCksbi5zaGVldFJvd3MmJm4uc2hlZXRSb3dzPD1ELmUuciYmKGRbIiFmdWxscmVmIl09ZFsiIXJlZiJdLEQuZS5yPW4uc2hlZXRSb3dzLTEsZFsiIXJlZiJdPXN2KEQpKSksVS5sZW5ndGgmJihkWyIhbWVyZ2VzIl09VSksSS5sZW5ndGg+MCYmKGRbIiFjb2xzIl09SSksUC5sZW5ndGg+MCYmKGRbIiFyb3dzIl09UCksdVtoXT1kfWVsc2UgRD17czp7cjoyZTYsYzoyZTZ9LGU6e3I6MCxjOjB9fSx4PXY9MCxsLnB1c2goW2lbM10sITFdKSxzPVl3KGlbMF0pLGg9SGIocy5OYW1lKSxkPXt9LG4uZGVuc2UmJihkWyIhZGF0YSJdPVtdKSxVPVtdLE49W10sUD1bXSxqPXtuYW1lOmgsSGlkZGVuOjB9LE0uU2hlZXRzLnB1c2goaik7YnJlYWs7Y2FzZSJ0YWJsZSI6aWYoIi8iPT09aVsxXSl7aWYoKHM9bC5wb3AoKSlbMF0hPT1pWzNdKXRocm93IG5ldyBFcnJvcigiQmFkIHN0YXRlOiAiK3Muam9pbigifCIpKX1lbHNle2lmKCIvPiI9PWlbMF0uc2xpY2UoLTIpKWJyZWFrO2wucHVzaChbaVszXSwhMV0pLEk9W10sUj0hMX1icmVhaztjYXNlInN0eWxlIjoiLyI9PT1pWzFdP1F3KFQsdyxuKTp3PVl3KGlbMF0pO2JyZWFrO2Nhc2UibnVtYmVyZm9ybWF0Ijp3Lm5mPUhiKFl3KGlbMF0pLkZvcm1hdHx8IkdlbmVyYWwiKSxHd1t3Lm5mXSYmKHcubmY9R3dbdy5uZl0pO2Zvcih2YXIgRz0wOzM5MiE9RyYmZ21bR10hPXcubmY7KytHKTtpZigzOTI9PUcpZm9yKEc9NTc7MzkyIT1HOysrRylpZihudWxsPT1nbVtHXSl7JG0ody5uZixHKTticmVha31icmVhaztjYXNlImNvbHVtbiI6aWYoInRhYmxlIiE9PWxbbC5sZW5ndGgtMV1bMF0pYnJlYWs7aWYoIi8iPT09aVsxXSlicmVhaztpZigocD1ZdyhpWzBdKSkuSGlkZGVuJiYocC5oaWRkZW49ITAsZGVsZXRlIHAuSGlkZGVuKSxwLldpZHRoJiYocC53cHg9cGFyc2VJbnQocC5XaWR0aCwxMCkpLCFSJiZwLndweD4xMCl7Uj0hMCxQRD1JRDtmb3IodmFyIFg9MDtYPEkubGVuZ3RoOysrWClJW1hdJiZ6RChJW1hdKX1SJiZ6RChwKSxJW3AuSW5kZXgtMXx8SS5sZW5ndGhdPXA7Zm9yKHZhciAkPTA7JDwrcC5TcGFuOysrJClJW0kubGVuZ3RoXT11YihwKTticmVhaztjYXNlIm5hbWVkcmFuZ2UiOmlmKCIvIj09PWlbMV0pYnJlYWs7TS5OYW1lc3x8KE0uTmFtZXM9W10pO3ZhciBZPUxiKGlbMF0pLEs9e05hbWU6KHo9WS5OYW1lLFZ2LmluZGV4T2YoIl94bG5tLiIreik+LTE/Il94bG5tLiIrejp6KSxSZWY6aFQoWS5SZWZlcnNUby5zbGljZSgxKSx7cjowLGM6MH0pfTtNLlNoZWV0cy5sZW5ndGg+MCYmKEsuU2hlZXQ9TS5TaGVldHMubGVuZ3RoLTEpLE0uTmFtZXMucHVzaChLKTticmVhaztjYXNlIm5hbWVkY2VsbCI6Y2FzZSJiIjpjYXNlImkiOmNhc2UidSI6Y2FzZSJzIjpjYXNlImVtIjpjYXNlImgyIjpjYXNlImgzIjpjYXNlInN1YiI6Y2FzZSJzdXAiOmNhc2Uic3BhbiI6Y2FzZSJhbGlnbm1lbnQiOmNhc2UiYm9yZGVycyI6Y2FzZSJib3JkZXIiOmNhc2UicHJvdGVjdGlvbiI6Y2FzZSJwYXJhZ3JhcGhzIjpjYXNlIm5hbWUiOmNhc2UicGl4ZWxzcGVyaW5jaCI6Y2FzZSJudWxsIjpicmVhaztjYXNlImZvbnQiOmlmKCIvPiI9PT1pWzBdLnNsaWNlKC0yKSlicmVhazsiLyI9PT1pWzFdP18rPXIuc2xpY2UoRSxpLmluZGV4KTpFPWkuaW5kZXgraVswXS5sZW5ndGg7YnJlYWs7Y2FzZSJpbnRlcmlvciI6aWYoIW4uY2VsbFN0eWxlcylicmVhazt3LkludGVyaW9yPVl3KGlbMF0pO2JyZWFrO2Nhc2UiYXV0aG9yIjpjYXNlInRpdGxlIjpjYXNlImRlc2NyaXB0aW9uIjpjYXNlImNyZWF0ZWQiOmNhc2Uia2V5d29yZHMiOmNhc2Uic3ViamVjdCI6Y2FzZSJjYXRlZ29yeSI6Y2FzZSJjb21wYW55IjpjYXNlImxhc3RhdXRob3IiOmNhc2UibGFzdHNhdmVkIjpjYXNlImxhc3RwcmludGVkIjpjYXNlInZlcnNpb24iOmNhc2UicmV2aXNpb24iOmNhc2UidG90YWx0aW1lIjpjYXNlImh5cGVybGlua2Jhc2UiOmNhc2UibWFuYWdlciI6Y2FzZSJjb250ZW50c3RhdHVzIjpjYXNlImlkZW50aWZpZXIiOmNhc2UibGFuZ3VhZ2UiOmNhc2UiYXBwbmFtZSI6aWYoIi8+Ij09PWlbMF0uc2xpY2UoLTIpKWJyZWFrOyIvIj09PWlbMV0/aXgoQSxILHIuc2xpY2UoUyxpLmluZGV4KSk6Uz1pLmluZGV4K2lbMF0ubGVuZ3RoO2JyZWFrO2Nhc2Uic3R5bGVzIjpjYXNlIndvcmtib29rIjppZigiLyI9PT1pWzFdKXtpZigocz1sLnBvcCgpKVswXSE9PWlbM10pdGhyb3cgbmV3IEVycm9yKCJCYWQgc3RhdGU6ICIrcy5qb2luKCJ8IikpfWVsc2UgbC5wdXNoKFtpWzNdLCExXSk7YnJlYWs7Y2FzZSJjb21tZW50IjppZigiLyI9PT1pWzFdKXtpZigocz1sLnBvcCgpKVswXSE9PWlbM10pdGhyb3cgbmV3IEVycm9yKCJCYWQgc3RhdGU6ICIrcy5qb2luKCJ8IikpO3RfKE8pLEYucHVzaChPKX1lbHNlIGwucHVzaChbaVszXSwhMV0pLCRiKChzPVl3KGlbMF0pKS5TaG93QWx3YXlzfHwiMCIpfHwoRi5oaWRkZW49ITApLE89e2E6cy5BdXRob3J9O2JyZWFrO2Nhc2UiYXV0b2ZpbHRlciI6aWYoIi8iPT09aVsxXSl7aWYoKHM9bC5wb3AoKSlbMF0hPT1pWzNdKXRocm93IG5ldyBFcnJvcigiQmFkIHN0YXRlOiAiK3Muam9pbigifCIpKX1lbHNlIGlmKCIvIiE9PWlbMF0uY2hhckF0KGlbMF0ubGVuZ3RoLTIpKXt2YXIgWj1ZdyhpWzBdKTtkWyIhYXV0b2ZpbHRlciJdPXtyZWY6aFQoWi5SYW5nZSkucmVwbGFjZSgvXCQvZywiIil9LGwucHVzaChbaVszXSwhMF0pfWJyZWFrO2Nhc2UiZGF0YXZhbGlkYXRpb24iOmlmKCIvIj09PWlbMV0pe2lmKChzPWwucG9wKCkpWzBdIT09aVszXSl0aHJvdyBuZXcgRXJyb3IoIkJhZCBzdGF0ZTogIitzLmpvaW4oInwiKSl9ZWxzZSIvIiE9PWlbMF0uY2hhckF0KGlbMF0ubGVuZ3RoLTIpJiZsLnB1c2goW2lbM10sITBdKTticmVhaztjYXNlImNvbXBvbmVudG9wdGlvbnMiOmNhc2UiZG9jdW1lbnRwcm9wZXJ0aWVzIjpjYXNlImN1c3RvbWRvY3VtZW50cHJvcGVydGllcyI6Y2FzZSJvZmZpY2Vkb2N1bWVudHNldHRpbmdzIjpjYXNlInBpdm90dGFibGUiOmNhc2UicGl2b3RjYWNoZSI6Y2FzZSJuYW1lcyI6Y2FzZSJtYXBpbmZvIjpjYXNlInBhZ2VicmVha3MiOmNhc2UicXVlcnl0YWJsZSI6Y2FzZSJzb3J0aW5nIjpjYXNlInNjaGVtYSI6Y2FzZSJjb25kaXRpb25hbGZvcm1hdHRpbmciOmNhc2Uic21hcnR0YWd0eXBlIjpjYXNlInNtYXJ0dGFncyI6Y2FzZSJleGNlbHdvcmtib29rIjpjYXNlIndvcmtib29rb3B0aW9ucyI6Y2FzZSJ3b3Jrc2hlZXRvcHRpb25zIjppZigiLyI9PT1pWzFdKXtpZigocz1sLnBvcCgpKVswXSE9PWlbM10pdGhyb3cgbmV3IEVycm9yKCJCYWQgc3RhdGU6ICIrcy5qb2luKCJ8IikpfWVsc2UiLyIhPT1pWzBdLmNoYXJBdChpWzBdLmxlbmd0aC0yKSYmbC5wdXNoKFtpWzNdLCEwXSk7YnJlYWs7ZGVmYXVsdDppZigwPT1sLmxlbmd0aCYmImRvY3VtZW50Ij09aVszXSlyZXR1cm4gd18ocixuKTtpZigwPT1sLmxlbmd0aCYmInVvZiI9PWlbM10pcmV0dXJuIHdfKHIsbik7dmFyIEo9ITA7c3dpdGNoKGxbbC5sZW5ndGgtMV1bMF0pe2Nhc2Uib2ZmaWNlZG9jdW1lbnRzZXR0aW5ncyI6c3dpdGNoKGlbM10pe2Nhc2UiYWxsb3dwbmciOmNhc2UicmVtb3ZlcGVyc29uYWxpbmZvcm1hdGlvbiI6Y2FzZSJkb3dubG9hZGNvbXBvbmVudHMiOmNhc2UibG9jYXRpb25vZmNvbXBvbmVudHMiOmNhc2UiY29sb3JzIjpjYXNlImNvbG9yIjpjYXNlImluZGV4IjpjYXNlInJnYiI6Y2FzZSJ0YXJnZXRzY3JlZW5zaXplIjpjYXNlInJlYWRvbmx5cmVjb21tZW5kZWQiOmJyZWFrO2RlZmF1bHQ6Sj0hMX1icmVhaztjYXNlImNvbXBvbmVudG9wdGlvbnMiOnN3aXRjaChpWzNdKXtjYXNlInRvb2xiYXIiOmNhc2UiaGlkZW9mZmljZWxvZ28iOmNhc2Uic3ByZWFkc2hlZXRhdXRvZml0IjpjYXNlImxhYmVsIjpjYXNlImNhcHRpb24iOmNhc2UibWF4aGVpZ2h0IjpjYXNlIm1heHdpZHRoIjpjYXNlIm5leHRzaGVldG51bWJlciI6YnJlYWs7ZGVmYXVsdDpKPSExfWJyZWFrO2Nhc2UiZXhjZWx3b3JrYm9vayI6c3dpdGNoKGlbM10pe2Nhc2UiZGF0ZTE5MDQiOk0uV0JQcm9wcy5kYXRlMTkwND0hMDticmVhaztjYXNlImhpZGVob3Jpem9udGFsc2Nyb2xsYmFyIjpjYXNlImhpZGV2ZXJ0aWNhbHNjcm9sbGJhciI6Y2FzZSJoaWRld29ya2Jvb2t0YWJzIjpjYXNlIndpbmRvd2hlaWdodCI6Y2FzZSJ3aW5kb3d3aWR0aCI6Y2FzZSJ3aW5kb3d0b3B4IjpjYXNlIndpbmRvd3RvcHkiOmNhc2UidGFicmF0aW8iOmNhc2UicHJvdGVjdHN0cnVjdHVyZSI6Y2FzZSJwcm90ZWN0d2luZG93IjpjYXNlInByb3RlY3R3aW5kb3dzIjpjYXNlImFjdGl2ZXNoZWV0IjpjYXNlImRpc3BsYXlpbmtub3RlcyI6Y2FzZSJmaXJzdHZpc2libGVzaGVldCI6Y2FzZSJzdXBib29rIjpjYXNlInNoZWV0bmFtZSI6Y2FzZSJzaGVldGluZGV4IjpjYXNlInNoZWV0aW5kZXhmaXJzdCI6Y2FzZSJzaGVldGluZGV4bGFzdCI6Y2FzZSJkbGwiOmNhc2UiYWNjZXB0bGFiZWxzaW5mb3JtdWxhcyI6Y2FzZSJkb25vdHNhdmVsaW5rdmFsdWVzIjpjYXNlIml0ZXJhdGlvbiI6Y2FzZSJtYXhpdGVyYXRpb25zIjpjYXNlIm1heGNoYW5nZSI6Y2FzZSJwYXRoIjpjYXNlInhjdCI6Y2FzZSJjb3VudCI6Y2FzZSJzZWxlY3RlZHNoZWV0cyI6Y2FzZSJjYWxjdWxhdGlvbiI6Y2FzZSJ1bmNhbGNlZCI6Y2FzZSJzdGFydHVwcHJvbXB0IjpjYXNlImNybiI6Y2FzZSJleHRlcm5uYW1lIjpjYXNlImZvcm11bGEiOmNhc2UiY29sZmlyc3QiOmNhc2UiY29sbGFzdCI6Y2FzZSJ3YW50YWR2aXNlIjpjYXNlImJvb2xlYW4iOmNhc2UiZXJyb3IiOmNhc2UidGV4dCI6Y2FzZSJvbGUiOmNhc2Uibm9hdXRvcmVjb3ZlciI6Y2FzZSJwdWJsaXNob2JqZWN0cyI6Y2FzZSJkb25vdGNhbGN1bGF0ZWJlZm9yZXNhdmUiOmNhc2UibnVtYmVyIjpjYXNlInJlZm1vZGVyMWMxIjpjYXNlImVtYmVkc2F2ZXNtYXJ0dGFncyI6YnJlYWs7ZGVmYXVsdDpKPSExfWJyZWFrO2Nhc2Uid29ya2Jvb2tvcHRpb25zIjpzd2l0Y2goaVszXSl7Y2FzZSJvd2N2ZXJzaW9uIjpjYXNlImhlaWdodCI6Y2FzZSJ3aWR0aCI6YnJlYWs7ZGVmYXVsdDpKPSExfWJyZWFrO2Nhc2Uid29ya3NoZWV0b3B0aW9ucyI6c3dpdGNoKGlbM10pe2Nhc2UidmlzaWJsZSI6aWYoIi8+Ij09PWlbMF0uc2xpY2UoLTIpKTtlbHNlIGlmKCIvIj09PWlbMV0pc3dpdGNoKHIuc2xpY2UoUyxpLmluZGV4KSl7Y2FzZSJTaGVldEhpZGRlbiI6ai5IaWRkZW49MTticmVhaztjYXNlIlNoZWV0VmVyeUhpZGRlbiI6ai5IaWRkZW49Mn1lbHNlIFM9aS5pbmRleCtpWzBdLmxlbmd0aDticmVhaztjYXNlImhlYWRlciI6ZFsiIW1hcmdpbnMiXXx8b3coZFsiIW1hcmdpbnMiXT17fSwieGxtbCIpLGlzTmFOKCtMYihpWzBdKS5NYXJnaW4pfHwoZFsiIW1hcmdpbnMiXS5oZWFkZXI9K0xiKGlbMF0pLk1hcmdpbik7YnJlYWs7Y2FzZSJmb290ZXIiOmRbIiFtYXJnaW5zIl18fG93KGRbIiFtYXJnaW5zIl09e30sInhsbWwiKSxpc05hTigrTGIoaVswXSkuTWFyZ2luKXx8KGRbIiFtYXJnaW5zIl0uZm9vdGVyPStMYihpWzBdKS5NYXJnaW4pO2JyZWFrO2Nhc2UicGFnZW1hcmdpbnMiOnZhciBRPUxiKGlbMF0pO2RbIiFtYXJnaW5zIl18fG93KGRbIiFtYXJnaW5zIl09e30sInhsbWwiKSxpc05hTigrUS5Ub3ApfHwoZFsiIW1hcmdpbnMiXS50b3A9K1EuVG9wKSxpc05hTigrUS5MZWZ0KXx8KGRbIiFtYXJnaW5zIl0ubGVmdD0rUS5MZWZ0KSxpc05hTigrUS5SaWdodCl8fChkWyIhbWFyZ2lucyJdLnJpZ2h0PStRLlJpZ2h0KSxpc05hTigrUS5Cb3R0b20pfHwoZFsiIW1hcmdpbnMiXS5ib3R0b209K1EuQm90dG9tKTticmVhaztjYXNlImRpc3BsYXlyaWdodHRvbGVmdCI6TS5WaWV3c3x8KE0uVmlld3M9W10pLE0uVmlld3NbMF18fChNLlZpZXdzWzBdPXt9KSxNLlZpZXdzWzBdLlJUTD0hMDticmVhaztjYXNlImZyZWV6ZXBhbmVzIjpjYXNlImZyb3plbm5vc3BsaXQiOmNhc2Uic3BsaXRob3Jpem9udGFsIjpjYXNlInNwbGl0dmVydGljYWwiOmNhc2UiZG9ub3RkaXNwbGF5Z3JpZGxpbmVzIjpjYXNlImFjdGl2ZXJvdyI6Y2FzZSJhY3RpdmVjb2wiOmNhc2UidG9wcm93Ym90dG9tcGFuZSI6Y2FzZSJsZWZ0Y29sdW1ucmlnaHRwYW5lIjpjYXNlInVuc3luY2VkIjpjYXNlInByaW50IjpjYXNlInByaW50ZXJyb3JzIjpjYXNlInBhbmVzIjpjYXNlInNjYWxlIjpjYXNlInBhbmUiOmNhc2UibnVtYmVyIjpjYXNlImxheW91dCI6Y2FzZSJwYWdlc2V0dXAiOmNhc2Uic2VsZWN0ZWQiOmNhc2UicHJvdGVjdG9iamVjdHMiOmNhc2UiZW5hYmxlc2VsZWN0aW9uIjpjYXNlInByb3RlY3RzY2VuYXJpb3MiOmNhc2UidmFsaWRwcmludGVyaW5mbyI6Y2FzZSJob3Jpem9udGFscmVzb2x1dGlvbiI6Y2FzZSJ2ZXJ0aWNhbHJlc29sdXRpb24iOmNhc2UibnVtYmVyb2Zjb3BpZXMiOmNhc2UiYWN0aXZlcGFuZSI6Y2FzZSJ0b3Byb3d2aXNpYmxlIjpjYXNlImxlZnRjb2x1bW52aXNpYmxlIjpjYXNlImZpdHRvcGFnZSI6Y2FzZSJyYW5nZXNlbGVjdGlvbiI6Y2FzZSJwYXBlcnNpemVpbmRleCI6Y2FzZSJwYWdlbGF5b3V0em9vbSI6Y2FzZSJwYWdlYnJlYWt6b29tIjpjYXNlImZpbHRlcm9uIjpjYXNlImZpdHdpZHRoIjpjYXNlImZpdGhlaWdodCI6Y2FzZSJjb21tZW50c2xheW91dCI6Y2FzZSJ6b29tIjpjYXNlImxlZnR0b3JpZ2h0IjpjYXNlImdyaWRsaW5lcyI6Y2FzZSJhbGxvd3NvcnQiOmNhc2UiYWxsb3dmaWx0ZXIiOmNhc2UiYWxsb3dpbnNlcnRyb3dzIjpjYXNlImFsbG93ZGVsZXRlcm93cyI6Y2FzZSJhbGxvd2luc2VydGNvbHMiOmNhc2UiYWxsb3dkZWxldGVjb2xzIjpjYXNlImFsbG93aW5zZXJ0aHlwZXJsaW5rcyI6Y2FzZSJhbGxvd2Zvcm1hdGNlbGxzIjpjYXNlImFsbG93c2l6ZWNvbHMiOmNhc2UiYWxsb3dzaXplcm93cyI6Y2FzZSJ0YWJjb2xvcmluZGV4IjpjYXNlImRvbm90ZGlzcGxheWhlYWRpbmdzIjpjYXNlInNob3dwYWdlbGF5b3V0em9vbSI6Y2FzZSJibGFja2FuZHdoaXRlIjpjYXNlImRvbm90ZGlzcGxheXplcm9zIjpjYXNlImRpc3BsYXlwYWdlYnJlYWsiOmNhc2Uicm93Y29saGVhZGluZ3MiOmNhc2UiZG9ub3RkaXNwbGF5b3V0bGluZSI6Y2FzZSJub29yaWVudGF0aW9uIjpjYXNlImFsbG93dXNlcGl2b3R0YWJsZXMiOmNhc2UiemVyb2hlaWdodCI6Y2FzZSJ2aWV3YWJsZXJhbmdlIjpjYXNlInNlbGVjdGlvbiI6Y2FzZSJwcm90ZWN0Y29udGVudHMiOmJyZWFrO2Nhc2Uibm9zdW1tYXJ5cm93c2JlbG93ZGV0YWlsIjpkWyIhb3V0bGluZSJdfHwoZFsiIW91dGxpbmUiXT17fSksZFsiIW91dGxpbmUiXS5hYm92ZT0hMDticmVhaztjYXNlIm5vc3VtbWFyeWNvbHVtbnNyaWdodGRldGFpbCI6ZFsiIW91dGxpbmUiXXx8KGRbIiFvdXRsaW5lIl09e30pLGRbIiFvdXRsaW5lIl0ubGVmdD0hMDticmVhaztkZWZhdWx0Oko9ITF9YnJlYWs7Y2FzZSJwaXZvdHRhYmxlIjpjYXNlInBpdm90Y2FjaGUiOnN3aXRjaChpWzNdKXtjYXNlImltbWVkaWF0ZWl0ZW1zb25kcm9wIjpjYXNlInNob3dwYWdlbXVsdGlwbGVpdGVtbGFiZWwiOmNhc2UiY29tcGFjdHJvd2luZGVudCI6Y2FzZSJsb2NhdGlvbiI6Y2FzZSJwaXZvdGZpZWxkIjpjYXNlIm9yaWVudGF0aW9uIjpjYXNlImxheW91dGZvcm0iOmNhc2UibGF5b3V0c3VidG90YWxsb2NhdGlvbiI6Y2FzZSJsYXlvdXRjb21wYWN0cm93IjpjYXNlInBvc2l0aW9uIjpjYXNlInBpdm90aXRlbSI6Y2FzZSJkYXRhdHlwZSI6Y2FzZSJkYXRhZmllbGQiOmNhc2Uic291cmNlbmFtZSI6Y2FzZSJwYXJlbnRmaWVsZCI6Y2FzZSJwdGxpbmVpdGVtcyI6Y2FzZSJwdGxpbmVpdGVtIjpjYXNlImNvdW50b2ZzYW1laXRlbXMiOmNhc2UiaXRlbSI6Y2FzZSJpdGVtdHlwZSI6Y2FzZSJwdHNvdXJjZSI6Y2FzZSJjYWNoZWluZGV4IjpjYXNlImNvbnNvbGlkYXRpb25yZWZlcmVuY2UiOmNhc2UiZmlsZW5hbWUiOmNhc2UicmVmZXJlbmNlIjpjYXNlIm5vY29sdW1uZ3JhbmQiOmNhc2Uibm9yb3dncmFuZCI6Y2FzZSJibGFua2xpbmVhZnRlcml0ZW1zIjpjYXNlImhpZGRlbiI6Y2FzZSJzdWJ0b3RhbCI6Y2FzZSJiYXNlZmllbGQiOmNhc2UibWFwY2hpbGRpdGVtcyI6Y2FzZSJmdW5jdGlvbiI6Y2FzZSJyZWZyZXNob25maWxlb3BlbiI6Y2FzZSJwcmludHNldHRpdGxlcyI6Y2FzZSJtZXJnZWxhYmVscyI6Y2FzZSJkZWZhdWx0dmVyc2lvbiI6Y2FzZSJyZWZyZXNobmFtZSI6Y2FzZSJyZWZyZXNoZGF0ZSI6Y2FzZSJyZWZyZXNoZGF0ZWNvcHkiOmNhc2UidmVyc2lvbmxhc3RyZWZyZXNoIjpjYXNlInZlcnNpb25sYXN0dXBkYXRlIjpjYXNlInZlcnNpb251cGRhdGVhYmxlbWluIjpjYXNlInZlcnNpb25yZWZyZXNoYWJsZW1pbiI6Y2FzZSJjYWxjdWxhdGlvbiI6YnJlYWs7ZGVmYXVsdDpKPSExfWJyZWFrO2Nhc2UicGFnZWJyZWFrcyI6c3dpdGNoKGlbM10pe2Nhc2UiY29sYnJlYWtzIjpjYXNlImNvbGJyZWFrIjpjYXNlInJvd2JyZWFrcyI6Y2FzZSJyb3dicmVhayI6Y2FzZSJjb2xzdGFydCI6Y2FzZSJjb2xlbmQiOmNhc2Uicm93ZW5kIjpicmVhaztkZWZhdWx0Oko9ITF9YnJlYWs7Y2FzZSJhdXRvZmlsdGVyIjpzd2l0Y2goaVszXSl7Y2FzZSJhdXRvZmlsdGVyY29sdW1uIjpjYXNlImF1dG9maWx0ZXJjb25kaXRpb24iOmNhc2UiYXV0b2ZpbHRlcmFuZCI6Y2FzZSJhdXRvZmlsdGVyb3IiOmJyZWFrO2RlZmF1bHQ6Sj0hMX1icmVhaztjYXNlInF1ZXJ5dGFibGUiOnN3aXRjaChpWzNdKXtjYXNlImlkIjpjYXNlImF1dG9mb3JtYXRmb250IjpjYXNlImF1dG9mb3JtYXRwYXR0ZXJuIjpjYXNlInF1ZXJ5c291cmNlIjpjYXNlInF1ZXJ5dHlwZSI6Y2FzZSJlbmFibGVyZWRpcmVjdGlvbnMiOmNhc2UicmVmcmVzaGVkaW54bDkiOmNhc2UidXJsc3RyaW5nIjpjYXNlImh0bWx0YWJsZXMiOmNhc2UiY29ubmVjdGlvbiI6Y2FzZSJjb21tYW5kdGV4dCI6Y2FzZSJyZWZyZXNoaW5mbyI6Y2FzZSJub3RpdGxlcyI6Y2FzZSJuZXh0aWQiOmNhc2UiY29sdW1uaW5mbyI6Y2FzZSJvdmVyd3JpdGVjZWxscyI6Y2FzZSJkb25vdHByb21wdGZvcmZpbGUiOmNhc2UidGV4dHdpemFyZHNldHRpbmdzIjpjYXNlInNvdXJjZSI6Y2FzZSJudW1iZXIiOmNhc2UiZGVjaW1hbCI6Y2FzZSJ0aG91c2FuZHNlcGFyYXRvciI6Y2FzZSJ0cmFpbGluZ21pbnVzbnVtYmVycyI6Y2FzZSJmb3JtYXRzZXR0aW5ncyI6Y2FzZSJmaWVsZHR5cGUiOmNhc2UiZGVsaW1pdGVycyI6Y2FzZSJ0YWIiOmNhc2UiY29tbWEiOmNhc2UiYXV0b2Zvcm1hdG5hbWUiOmNhc2UidmVyc2lvbmxhc3RlZGl0IjpjYXNlInZlcnNpb25sYXN0cmVmcmVzaCI6YnJlYWs7ZGVmYXVsdDpKPSExfWJyZWFrO2Nhc2UiZGF0YXZhbGlkYXRpb24iOnN3aXRjaChpWzNdKXtjYXNlInJhbmdlIjpjYXNlInR5cGUiOmNhc2UibWluIjpjYXNlIm1heCI6Y2FzZSJzb3J0IjpjYXNlImRlc2NlbmRpbmciOmNhc2Uib3JkZXIiOmNhc2UiY2FzZXNlbnNpdGl2ZSI6Y2FzZSJ2YWx1ZSI6Y2FzZSJlcnJvcnN0eWxlIjpjYXNlImVycm9ybWVzc2FnZSI6Y2FzZSJlcnJvcnRpdGxlIjpjYXNlImlucHV0bWVzc2FnZSI6Y2FzZSJpbnB1dHRpdGxlIjpjYXNlImNvbWJvaGlkZSI6Y2FzZSJpbnB1dGhpZGUiOmNhc2UiY29uZGl0aW9uIjpjYXNlInF1YWxpZmllciI6Y2FzZSJ1c2VibGFuayI6Y2FzZSJ2YWx1ZTEiOmNhc2UidmFsdWUyIjpjYXNlImZvcm1hdCI6Y2FzZSJjZWxscmFuZ2VsaXN0IjpicmVhaztkZWZhdWx0Oko9ITF9YnJlYWs7Y2FzZSJzb3J0aW5nIjpjYXNlImNvbmRpdGlvbmFsZm9ybWF0dGluZyI6c3dpdGNoKGlbM10pe2Nhc2UicmFuZ2UiOmNhc2UidHlwZSI6Y2FzZSJtaW4iOmNhc2UibWF4IjpjYXNlInNvcnQiOmNhc2UiZGVzY2VuZGluZyI6Y2FzZSJvcmRlciI6Y2FzZSJjYXNlc2Vuc2l0aXZlIjpjYXNlInZhbHVlIjpjYXNlImVycm9yc3R5bGUiOmNhc2UiZXJyb3JtZXNzYWdlIjpjYXNlImVycm9ydGl0bGUiOmNhc2UiY2VsbHJhbmdlbGlzdCI6Y2FzZSJpbnB1dG1lc3NhZ2UiOmNhc2UiaW5wdXR0aXRsZSI6Y2FzZSJjb21ib2hpZGUiOmNhc2UiaW5wdXRoaWRlIjpjYXNlImNvbmRpdGlvbiI6Y2FzZSJxdWFsaWZpZXIiOmNhc2UidXNlYmxhbmsiOmNhc2UidmFsdWUxIjpjYXNlInZhbHVlMiI6Y2FzZSJmb3JtYXQiOmJyZWFrO2RlZmF1bHQ6Sj0hMX1icmVhaztjYXNlIm1hcGluZm8iOmNhc2Uic2NoZW1hIjpjYXNlImRhdGEiOnN3aXRjaChpWzNdKXtjYXNlIm1hcCI6Y2FzZSJlbnRyeSI6Y2FzZSJyYW5nZSI6Y2FzZSJ4cGF0aCI6Y2FzZSJmaWVsZCI6Y2FzZSJ4c2R0eXBlIjpjYXNlImZpbHRlcm9uIjpjYXNlImFnZ3JlZ2F0ZSI6Y2FzZSJlbGVtZW50dHlwZSI6Y2FzZSJhdHRyaWJ1dGV0eXBlIjpjYXNlInNjaGVtYSI6Y2FzZSJlbGVtZW50IjpjYXNlImNvbXBsZXh0eXBlIjpjYXNlImRhdGF0eXBlIjpjYXNlImFsbCI6Y2FzZSJhdHRyaWJ1dGUiOmNhc2UiZXh0ZW5kcyI6Y2FzZSJyb3ciOmJyZWFrO2RlZmF1bHQ6Sj0hMX1icmVhaztjYXNlInNtYXJ0dGFncyI6YnJlYWs7ZGVmYXVsdDpKPSExfWlmKEopYnJlYWs7aWYoaVszXS5tYXRjaCgvIVxbQ0RBVEEvKSlicmVhaztpZighbFtsLmxlbmd0aC0xXVsxXSl0aHJvdyJVbnJlY29nbml6ZWQgdGFnOiAiK2lbM10rInwiK2wuam9pbigifCIpO2lmKCJjdXN0b21kb2N1bWVudHByb3BlcnRpZXMiPT09bFtsLmxlbmd0aC0xXVswXSl7aWYoIi8+Ij09PWlbMF0uc2xpY2UoLTIpKWJyZWFrOyIvIj09PWlbMV0/WncoayxILEMsci5zbGljZShTLGkuaW5kZXgpKTooQz1pLFM9aS5pbmRleCtpWzBdLmxlbmd0aCk7YnJlYWt9aWYobi5XVEYpdGhyb3ciVW5yZWNvZ25pemVkIHRhZzogIitpWzNdKyJ8IitsLmpvaW4oInwiKX12YXIgZWU9e307cmV0dXJuIG4uYm9va1NoZWV0c3x8bi5ib29rUHJvcHN8fChlZS5TaGVldHM9dSksZWUuU2hlZXROYW1lcz1mLGVlLldvcmtib29rPU0sZWUuU1NGPXViKGdtKSxlZS5Qcm9wcz1BLGVlLkN1c3Rwcm9wcz1rLGVlLmJvb2tUeXBlPSJ4bG1sIixlZX1mdW5jdGlvbiByXyhlLHQpe3N3aXRjaChxXyh0PXR8fHt9KSx0LnR5cGV8fCJiYXNlNjQiKXtjYXNlImJhc2U2NCI6cmV0dXJuIG5fKCRnKGUpLHQpO2Nhc2UiYmluYXJ5IjpjYXNlImJ1ZmZlciI6Y2FzZSJmaWxlIjpyZXR1cm4gbl8oZSx0KTtjYXNlImFycmF5IjpyZXR1cm4gbl8odG0oZSksdCl9fWZ1bmN0aW9uIGlfKGUpe3ZhciB0PXt9LG49ZS5jb250ZW50O2lmKG4ubD0yOCx0LkFuc2lVc2VyVHlwZT1uLnJlYWRfc2hpZnQoMCwibHBzdHItYW5zaSIpLHQuQW5zaUNsaXBib2FyZEZvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gU3YoZSwxKX0obiksbi5sZW5ndGgtbi5sPD00KXJldHVybiB0O3ZhciByPW4ucmVhZF9zaGlmdCg0KTtyZXR1cm4gMD09cnx8cj40MD90OihuLmwtPTQsdC5SZXNlcnZlZDE9bi5yZWFkX3NoaWZ0KDAsImxwc3RyLWFuc2kiKSxuLmxlbmd0aC1uLmw8PTR8fDE5MDc1MDU2NTIhPT0ocj1uLnJlYWRfc2hpZnQoNCkpP3Q6KHQuVW5pY29kZUNsaXBib2FyZEZvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gU3YoZSwyKX0obiksMD09KHI9bi5yZWFkX3NoaWZ0KDQpKXx8cj40MD90OihuLmwtPTQsdm9pZCh0LlJlc2VydmVkMj1uLnJlYWRfc2hpZnQoMCwibHB3c3RyIikpKSkpfXZhciBhXz1bNjAsMTA4NCwyMDY2LDIxNjUsMjE3NV07ZnVuY3Rpb24gb18oZSx0LG4scixpKXt2YXIgYT1yLG89W10sYz1uLnNsaWNlKG4ubCxuLmwrYSk7aWYoaSYmaS5lbmMmJmkuZW5jLmluc2l0dSYmYy5sZW5ndGg+MClzd2l0Y2goZSl7Y2FzZSA5OmNhc2UgNTIxOmNhc2UgMTAzMzpjYXNlIDIwNTc6Y2FzZSA0NzpjYXNlIDQwNTpjYXNlIDIyNTpjYXNlIDQwNjpjYXNlIDMxMjpjYXNlIDQwNDpjYXNlIDEwOmNhc2UgMTMzOmJyZWFrO2RlZmF1bHQ6aS5lbmMuaW5zaXR1KGMpfW8ucHVzaChjKSxuLmwrPWE7Zm9yKHZhciBzPU55KG4sbi5sKSxsPWhfW3NdLHU9MDtudWxsIT1sJiZhXy5pbmRleE9mKHMpPi0xOylhPU55KG4sbi5sKzIpLHU9bi5sKzQsMjA2Nj09cz91Kz00OjIxNjUhPXMmJjIxNzUhPXN8fCh1Kz0xMiksYz1uLnNsaWNlKHUsbi5sKzQrYSksby5wdXNoKGMpLG4ubCs9NCthLGw9aF9bcz1OeShuLG4ubCldO3ZhciBmPXJtKG8pO0d5KGYsMCk7dmFyIGQ9MDtmLmxlbnM9W107Zm9yKHZhciBoPTA7aDxvLmxlbmd0aDsrK2gpZi5sZW5zLnB1c2goZCksZCs9b1toXS5sZW5ndGg7aWYoZi5sZW5ndGg8cil0aHJvdyJYTFMgUmVjb3JkIDB4IitlLnRvU3RyaW5nKDE2KSsiIFRydW5jYXRlZDogIitmLmxlbmd0aCsiIDwgIityO3JldHVybiB0LmYoZixmLmxlbmd0aCxpKX1mdW5jdGlvbiBjXyhlLHQsbil7aWYoInoiIT09ZS50JiZlLlhGKXt2YXIgcj0wO3RyeXtyPWUuenx8ZS5YRi5udW1GbXRJZHx8MCx0LmNlbGxORiYmbnVsbD09ZS56JiYoZS56PWdtW3JdKX1jYXRjaChlKXtpZih0LldURil0aHJvdyBlfWlmKCF0fHwhMSE9PXQuY2VsbFRleHQpdHJ5eyJlIj09PWUudD9lLnc9ZS53fHx6dltlLnZdOjA9PT1yfHwiR2VuZXJhbCI9PXI/Im4iPT09ZS50PygwfGUudik9PT1lLnY/ZS53PWUudi50b1N0cmluZygxMCk6ZS53PURtKGUudik6ZS53PVRtKGUudik6ZS53PUhtKHIsZS52LHtkYXRlMTkwNDohIW4sZGF0ZU5GOnQmJnQuZGF0ZU5GfSl9Y2F0Y2goZSl7aWYodC5XVEYpdGhyb3cgZX1pZih0LmNlbGxEYXRlcyYmciYmIm4iPT1lLnQmJkxtKGdtW3JdfHxTdHJpbmcocikpKXt2YXIgaT12bShlLnYrKG4/MTQ2MjowKSk7aSYmKGUudD0iZCIsZS52PW5ldyBEYXRlKERhdGUuVVRDKGkueSxpLm0tMSxpLmQsaS5ILGkuTSxpLlMsaS51KSkpfX19ZnVuY3Rpb24gc18oZSx0LG4pe3JldHVybnt2OmUsaXhmZTp0LHQ6bn19ZnVuY3Rpb24gbF8oZSx0KXt2YXIgbj17b3B0czp7fX0scj17fSxpPXt9O3QuZGVuc2UmJihpWyIhZGF0YSJdPVtdKTt2YXIgYSxvLGMscyxsLHUsZixkLGg9e30scD17fSxnPW51bGwsbT1bXSxiPSIiLHk9e30sdj0iIix4PXt9LEQ9W10sVD1bXSx3PVtdLF89e1NoZWV0czpbXSxXQlByb3BzOntkYXRlMTkwNDohMX0sVmlld3M6W3t9XX0sRT17fSxVPSExLEE9ZnVuY3Rpb24oZSl7cmV0dXJuIGU8OD9qdltlXTplPDY0JiZ3W2UtOF18fGp2W2VdfSxrPWZ1bmN0aW9uKGUsdCxuKXtpZigoVXx8IShXPjEpKSYmIShuLnNoZWV0Um93cyYmZS5yPj1uLnNoZWV0Um93cykpe2lmKG4uY2VsbFN0eWxlcyYmdC5YRiYmdC5YRi5kYXRhJiZmdW5jdGlvbihlLHQsbil7dmFyIHIsaT10LlhGLmRhdGE7aSYmaS5wYXR0ZXJuVHlwZSYmbiYmbi5jZWxsU3R5bGVzJiYodC5zPXt9LHQucy5wYXR0ZXJuVHlwZT1pLnBhdHRlcm5UeXBlLChyPUZEKEEoaS5pY3ZGb3JlKSkpJiYodC5zLmZnQ29sb3I9e3JnYjpyfSksKHI9RkQoQShpLmljdkJhY2spKSkmJih0LnMuYmdDb2xvcj17cmdiOnJ9KSl9KDAsdCxuKSxkZWxldGUgdC5peGZlLGRlbGV0ZSB0LlhGLGE9ZSx2PW92KGUpLHAmJnAucyYmcC5lfHwocD17czp7cjowLGM6MH0sZTp7cjowLGM6MH19KSxlLnI8cC5zLnImJihwLnMucj1lLnIpLGUuYzxwLnMuYyYmKHAucy5jPWUuYyksZS5yKzE+cC5lLnImJihwLmUucj1lLnIrMSksZS5jKzE+cC5lLmMmJihwLmUuYz1lLmMrMSksbi5jZWxsRm9ybXVsYSYmdC5mKWZvcih2YXIgcj0wO3I8RC5sZW5ndGg7KytyKWlmKCEoRFtyXVswXS5zLmM+ZS5jfHxEW3JdWzBdLnMucj5lLnJ8fERbcl1bMF0uZS5jPGUuY3x8RFtyXVswXS5lLnI8ZS5yKSl7dC5GPXN2KERbcl1bMF0pLERbcl1bMF0ucy5jPT1lLmMmJkRbcl1bMF0ucy5yPT1lLnJ8fGRlbGV0ZSB0LmYsdC5mJiYodC5mPSIiK1ZUKERbcl1bMV0sMCxlLE4sUykpO2JyZWFrfW4uZGVuc2U/KGlbIiFkYXRhIl1bZS5yXXx8KGlbIiFkYXRhIl1bZS5yXT1bXSksaVsiIWRhdGEiXVtlLnJdW2UuY109dCk6aVt2XT10fX0sUz17ZW5jOiExLHNiY2NoOjAsc25hbWVzOltdLHNoYXJlZGY6eCxhcnJheWY6RCxycnRhYmlkOltdLGxhc3R1c2VyOiIiLGJpZmY6OCxjb2RlcGFnZTowLHdpbmxvY2tlZDowLGNlbGxTdHlsZXM6ISF0JiYhIXQuY2VsbFN0eWxlcyxXVEY6ISF0JiYhIXQud3RmfTt0LnBhc3N3b3JkJiYoUy5wYXNzd29yZD10LnBhc3N3b3JkKTt2YXIgQz1bXSxGPVtdLE89W10sST1bXSxSPSExLE49W107Ti5TaGVldE5hbWVzPVMuc25hbWVzLE4uc2hhcmVkZj1TLnNoYXJlZGYsTi5hcnJheWY9Uy5hcnJheWYsTi5uYW1lcz1bXSxOLlhUST1bXTt2YXIgUCxCPTAsVz0wLEw9MCxNPVtdLGo9W107Uy5jb2RlcGFnZT0xMjAwLEJnKDEyMDApO2Zvcih2YXIgej0hMTtlLmw8ZS5sZW5ndGgtMTspe3ZhciBIPWUubCxWPWUucmVhZF9zaGlmdCgyKTtpZigwPT09ViYmMTA9PT1CKWJyZWFrO3ZhciBxPWUubD09PWUubGVuZ3RoPzA6ZS5yZWFkX3NoaWZ0KDIpLEc9aF9bVl07aWYoMD09VyYmLTE9PVs5LDUyMSwxMDMzLDIwNTddLmluZGV4T2YoVikpYnJlYWs7aWYoRyYmRy5mKXtpZih0LmJvb2tTaGVldHMmJjEzMz09PUImJjEzMyE9PVYpYnJlYWs7aWYoQj1WLDI9PT1HLnJ8fDEyPT1HLnIpe3ZhciBYPWUucmVhZF9zaGlmdCgyKTtpZihxLT0yLCFTLmVuYyYmWCE9PVYmJigoMjU1JlgpPDw4fFg+PjgpIT09Vil0aHJvdyBuZXcgRXJyb3IoInJ0IG1pc21hdGNoOiAiK1grIiE9IitWKTsxMj09Ry5yJiYoZS5sKz0xMCxxLT0xMCl9dmFyICQ9e307aWYoJD0xMD09PVY/Ry5mKGUscSxTKTpvXyhWLEcsZSxxLFMpLDA9PVcmJi0xPT09WzksNTIxLDEwMzMsMjA1N10uaW5kZXhPZihCKSljb250aW51ZTtzd2l0Y2goVil7Y2FzZSAzNDpuLm9wdHMuRGF0ZTE5MDQ9Xy5XQlByb3BzLmRhdGUxOTA0PSQ7YnJlYWs7Y2FzZSAxMzQ6bi5vcHRzLldyaXRlUHJvdGVjdD0hMDticmVhaztjYXNlIDQ3OmlmKFMuZW5jfHwoZS5sPTApLFMuZW5jPSQsIXQucGFzc3dvcmQpdGhyb3cgbmV3IEVycm9yKCJGaWxlIGlzIHBhc3N3b3JkLXByb3RlY3RlZCIpO2lmKG51bGw9PSQudmFsaWQpdGhyb3cgbmV3IEVycm9yKCJFbmNyeXB0aW9uIHNjaGVtZSB1bnN1cHBvcnRlZCIpO2lmKCEkLnZhbGlkKXRocm93IG5ldyBFcnJvcigiUGFzc3dvcmQgaXMgaW5jb3JyZWN0Iik7YnJlYWs7Y2FzZSA5MjpTLmxhc3R1c2VyPSQ7YnJlYWs7Y2FzZSA2Njp2YXIgWT1OdW1iZXIoJCk7c3dpdGNoKFkpe2Nhc2UgMjEwMTA6WT0xMjAwO2JyZWFrO2Nhc2UgMzI3Njg6WT0xZTQ7YnJlYWs7Y2FzZSAzMjc2OTpZPTEyNTJ9QmcoUy5jb2RlcGFnZT1ZKSx6PSEwO2JyZWFrO2Nhc2UgMzE3OlMucnJ0YWJpZD0kO2JyZWFrO2Nhc2UgMjU6Uy53aW5sb2NrZWQ9JDticmVhaztjYXNlIDQzOTpuLm9wdHMuUmVmcmVzaEFsbD0kO2JyZWFrO2Nhc2UgMTI6bi5vcHRzLkNhbGNDb3VudD0kO2JyZWFrO2Nhc2UgMTY6bi5vcHRzLkNhbGNEZWx0YT0kO2JyZWFrO2Nhc2UgMTc6bi5vcHRzLkNhbGNJdGVyPSQ7YnJlYWs7Y2FzZSAxMzpuLm9wdHMuQ2FsY01vZGU9JDticmVhaztjYXNlIDE0Om4ub3B0cy5DYWxjUHJlY2lzaW9uPSQ7YnJlYWs7Y2FzZSA5NTpuLm9wdHMuQ2FsY1NhdmVSZWNhbGM9JDticmVhaztjYXNlIDE1OlMuQ2FsY1JlZk1vZGU9JDticmVhaztjYXNlIDIyMTE6bi5vcHRzLkZ1bGxDYWxjPSQ7YnJlYWs7Y2FzZSAxMjk6JC5mRGlhbG9nJiYoaVsiIXR5cGUiXT0iZGlhbG9nIiksJC5mQmVsb3d8fCgoaVsiIW91dGxpbmUiXXx8KGlbIiFvdXRsaW5lIl09e30pKS5hYm92ZT0hMCksJC5mUmlnaHR8fCgoaVsiIW91dGxpbmUiXXx8KGlbIiFvdXRsaW5lIl09e30pKS5sZWZ0PSEwKTticmVhaztjYXNlIDY3OmNhc2UgNTc5OmNhc2UgMTA5MTpjYXNlIDIyNDpULnB1c2goJCk7YnJlYWs7Y2FzZSA0MzA6Ti5wdXNoKFskXSksTltOLmxlbmd0aC0xXS5YVEk9W107YnJlYWs7Y2FzZSAzNTpjYXNlIDU0NzpOW04ubGVuZ3RoLTFdLnB1c2goJCk7YnJlYWs7Y2FzZSAyNDpjYXNlIDUzNjpQPXtOYW1lOiQuTmFtZSxSZWY6VlQoJC5yZ2NlLDAsbnVsbCxOLFMpfSwkLml0YWI+MCYmKFAuU2hlZXQ9JC5pdGFiLTEpLE4ubmFtZXMucHVzaChQKSxOWzBdfHwoTlswXT1bXSxOWzBdLlhUST1bXSksTltOLmxlbmd0aC0xXS5wdXNoKCQpLCJfeGxubS5fRmlsdGVyRGF0YWJhc2UiPT0kLk5hbWUmJiQuaXRhYj4wJiYkLnJnY2UmJiQucmdjZVswXSYmJC5yZ2NlWzBdWzBdJiYiUHRnQXJlYTNkIj09JC5yZ2NlWzBdWzBdWzBdJiYoalskLml0YWItMV09e3JlZjpzdigkLnJnY2VbMF1bMF1bMV1bMl0pfSk7YnJlYWs7Y2FzZSAyMjpTLkV4dGVybkNvdW50PSQ7YnJlYWs7Y2FzZSAyMzowPT1OLmxlbmd0aCYmKE5bMF09W10sTlswXS5YVEk9W10pLE5bTi5sZW5ndGgtMV0uWFRJPU5bTi5sZW5ndGgtMV0uWFRJLmNvbmNhdCgkKSxOLlhUST1OLlhUSS5jb25jYXQoJCk7YnJlYWs7Y2FzZSAyMTk2OmlmKFMuYmlmZjw4KWJyZWFrO251bGwhPVAmJihQLkNvbW1lbnQ9JFsxXSk7YnJlYWs7Y2FzZSAxODppWyIhcHJvdGVjdCJdPSQ7YnJlYWs7Y2FzZSAxOTowIT09JCYmUy5XVEYmJmNvbnNvbGUuZXJyb3IoIlBhc3N3b3JkIHZlcmlmaWVyOiAiKyQpO2JyZWFrO2Nhc2UgMTMzOmhbND09Uy5iaWZmP1Muc25hbWVzLmxlbmd0aDokLnBvc109JCxTLnNuYW1lcy5wdXNoKCQubmFtZSk7YnJlYWs7Y2FzZSAxMDppZigtLVc/IVU6VSlicmVhaztpZihwLmUpe2lmKHAuZS5yPjAmJnAuZS5jPjApe2lmKHAuZS5yLS0scC5lLmMtLSxpWyIhcmVmIl09c3YocCksdC5zaGVldFJvd3MmJnQuc2hlZXRSb3dzPD1wLmUucil7dmFyIEs9cC5lLnI7cC5lLnI9dC5zaGVldFJvd3MtMSxpWyIhZnVsbHJlZiJdPWlbIiFyZWYiXSxpWyIhcmVmIl09c3YocCkscC5lLnI9S31wLmUucisrLHAuZS5jKyt9Qy5sZW5ndGg+MCYmKGlbIiFtZXJnZXMiXT1DKSxGLmxlbmd0aD4wJiYoaVsiIW9iamVjdHMiXT1GKSxPLmxlbmd0aD4wJiYoaVsiIWNvbHMiXT1PKSxJLmxlbmd0aD4wJiYoaVsiIXJvd3MiXT1JKSxfLlNoZWV0cy5wdXNoKEUpfSIiPT09Yj95PWk6cltiXT1pLGk9e30sdC5kZW5zZSYmKGlbIiFkYXRhIl09W10pO2JyZWFrO2Nhc2UgOTpjYXNlIDUyMTpjYXNlIDEwMzM6Y2FzZSAyMDU3OmlmKDg9PT1TLmJpZmYmJihTLmJpZmY9ezk6Miw1MjE6MywxMDMzOjR9W1ZdfHx7NTEyOjIsNzY4OjMsMTAyNDo0LDEyODA6NSwxNTM2OjgsMjoyLDc6Mn1bJC5CSUZGVmVyXXx8OCksUy5iaWZmZ3Vlc3M9MD09JC5CSUZGVmVyLDA9PSQuQklGRlZlciYmNDA5Nj09JC5kdCYmKFMuYmlmZj01LHo9ITAsQmcoUy5jb2RlcGFnZT0yODU5MSkpLDQ9PVMuYmlmZiYmMjU2JiQuZHQmJihVPSEwKSw4PT1TLmJpZmYmJjA9PSQuQklGRlZlciYmMTY9PSQuZHQmJihTLmJpZmY9MiksVysrJiYhVSlicmVhaztpZihpPXt9LHQuZGVuc2UmJihpWyIhZGF0YSJdPVtdKSxTLmJpZmY8OCYmIXomJih6PSEwLEJnKFMuY29kZXBhZ2U9dC5jb2RlcGFnZXx8MTI1MikpLDQ9PVMuYmlmZiYmVSliPShoW1Muc25hbWVzLmluZGV4T2YoYikrMV18fHtuYW1lOiIifSkubmFtZTtlbHNlIGlmKFMuYmlmZjw1fHwwPT0kLkJJRkZWZXImJjQwOTY9PSQuZHQpeyIiPT09YiYmKGI9IlNoZWV0MSIpLHA9e3M6e3I6MCxjOjB9LGU6e3I6MCxjOjB9fTt2YXIgWj17cG9zOmUubC1xLG5hbWU6Yn07aFtaLnBvc109WixTLnNuYW1lcy5wdXNoKGIpfWVsc2UgYj0oaFtIXXx8e25hbWU6IiJ9KS5uYW1lOzMyPT0kLmR0JiYoaVsiIXR5cGUiXT0iY2hhcnQiKSw2ND09JC5kdCYmKGlbIiF0eXBlIl09Im1hY3JvIiksQz1bXSxGPVtdLFMuYXJyYXlmPUQ9W10sTz1bXSxJPVtdLFI9ITEsRT17SGlkZGVuOihoW0hdfHx7aHM6MH0pLmhzLG5hbWU6Yn07YnJlYWs7Y2FzZSA1MTU6Y2FzZSAzOmNhc2UgMjoiY2hhcnQiPT1pWyIhdHlwZSJdJiYodC5kZW5zZT8oaVsiIWRhdGEiXVskLnJdfHxbXSlbJC5jXTppW2l2KCQuYykrbnYoJC5yKV0pJiYrKyQuYyx1PXtpeGZlOiQuaXhmZSxYRjpUWyQuaXhmZV18fHt9LHY6JC52YWwsdDoibiJ9LEw+MCYmKHUuej11LlhGJiZ1LlhGLm51bUZtdElkJiZNW3UuWEYubnVtRm10SWRdfHxNW3UuaXhmZT4+OCY2M10pLGNfKHUsdCxuLm9wdHMuRGF0ZTE5MDQpLGsoe2M6JC5jLHI6JC5yfSx1LHQpO2JyZWFrO2Nhc2UgNTpjYXNlIDUxNzp1PXtpeGZlOiQuaXhmZSxYRjpUWyQuaXhmZV0sdjokLnZhbCx0OiQudH0sTD4wJiYodS56PXUuWEYmJnUuWEYubnVtRm10SWQmJk1bdS5YRi5udW1GbXRJZF18fE1bdS5peGZlPj44JjYzXSksY18odSx0LG4ub3B0cy5EYXRlMTkwNCksayh7YzokLmMscjokLnJ9LHUsdCk7YnJlYWs7Y2FzZSA2Mzg6dT17aXhmZTokLml4ZmUsWEY6VFskLml4ZmVdLHY6JC5ya251bSx0OiJuIn0sTD4wJiYodS56PXUuWEYmJnUuWEYubnVtRm10SWQmJk1bdS5YRi5udW1GbXRJZF18fE1bdS5peGZlPj44JjYzXSksY18odSx0LG4ub3B0cy5EYXRlMTkwNCksayh7YzokLmMscjokLnJ9LHUsdCk7YnJlYWs7Y2FzZSAxODk6Zm9yKHZhciBKPSQuYztKPD0kLkM7KytKKXt2YXIgUT0kLnJrcmVjW0otJC5jXVswXTt1PXtpeGZlOlEsWEY6VFtRXSx2OiQucmtyZWNbSi0kLmNdWzFdLHQ6Im4ifSxMPjAmJih1Lno9dS5YRiYmdS5YRi5udW1GbXRJZCYmTVt1LlhGLm51bUZtdElkXXx8TVt1Lml4ZmU+PjgmNjNdKSxjXyh1LHQsbi5vcHRzLkRhdGUxOTA0KSxrKHtjOkoscjokLnJ9LHUsdCl9YnJlYWs7Y2FzZSA2OmNhc2UgNTE4OmNhc2UgMTAzMDppZigiU3RyaW5nIj09JC52YWwpe2c9JDticmVha31pZigodT1zXygkLnZhbCwkLmNlbGwuaXhmZSwkLnR0KSkuWEY9VFt1Lml4ZmVdLHQuY2VsbEZvcm11bGEpe3ZhciBlZT0kLmZvcm11bGE7aWYoZWUmJmVlWzBdJiZlZVswXVswXSYmIlB0Z0V4cCI9PWVlWzBdWzBdWzBdKXt2YXIgdGU9ZWVbMF1bMF1bMV1bMF0sbmU9ZWVbMF1bMF1bMV1bMV0scmU9b3Yoe3I6dGUsYzpuZX0pO3hbcmVdP3UuZj0iIitWVCgkLmZvcm11bGEsMCwkLmNlbGwsTixTKTp1LkY9KCh0LmRlbnNlPyhpWyIhZGF0YSJdW3RlXXx8W10pW25lXTppW3JlXSl8fHt9KS5GfWVsc2UgdS5mPSIiK1ZUKCQuZm9ybXVsYSwwLCQuY2VsbCxOLFMpfUw+MCYmKHUuej11LlhGJiZ1LlhGLm51bUZtdElkJiZNW3UuWEYubnVtRm10SWRdfHxNW3UuaXhmZT4+OCY2M10pLGNfKHUsdCxuLm9wdHMuRGF0ZTE5MDQpLGsoJC5jZWxsLHUsdCksZz0kO2JyZWFrO2Nhc2UgNzpjYXNlIDUxOTppZighZyl0aHJvdyBuZXcgRXJyb3IoIlN0cmluZyByZWNvcmQgZXhwZWN0cyBGb3JtdWxhIik7Zy52YWw9JCwodT1zXygkLGcuY2VsbC5peGZlLCJzIikpLlhGPVRbdS5peGZlXSx0LmNlbGxGb3JtdWxhJiYodS5mPSIiK1ZUKGcuZm9ybXVsYSwwLGcuY2VsbCxOLFMpKSxMPjAmJih1Lno9dS5YRiYmdS5YRi5udW1GbXRJZCYmTVt1LlhGLm51bUZtdElkXXx8TVt1Lml4ZmU+PjgmNjNdKSxjXyh1LHQsbi5vcHRzLkRhdGUxOTA0KSxrKGcuY2VsbCx1LHQpLGc9bnVsbDticmVhaztjYXNlIDMzOmNhc2UgNTQ1OkQucHVzaCgkKTt2YXIgaWU9b3YoJFswXS5zKTtpZihvPXQuZGVuc2U/KGlbIiFkYXRhIl1bJFswXS5zLnJdfHxbXSlbJFswXS5zLmNdOmlbaWVdLHQuY2VsbEZvcm11bGEmJm8pe2lmKCFnKWJyZWFrO2lmKCFpZXx8IW8pYnJlYWs7by5mPSIiK1ZUKCRbMV0sMCwkWzBdLE4sUyksby5GPXN2KCRbMF0pfWJyZWFrO2Nhc2UgMTIxMjppZighdC5jZWxsRm9ybXVsYSlicmVhaztpZih2KXtpZighZylicmVhazt4W292KGcuY2VsbCldPSRbMF0sKChvPXQuZGVuc2U/KGlbIiFkYXRhIl1bZy5jZWxsLnJdfHxbXSlbZy5jZWxsLmNdOmlbb3YoZy5jZWxsKV0pfHx7fSkuZj0iIitWVCgkWzBdLDAsYSxOLFMpfWJyZWFrO2Nhc2UgMjUzOnU9c18obVskLmlzc3RdLnQsJC5peGZlLCJzIiksbVskLmlzc3RdLmgmJih1Lmg9bVskLmlzc3RdLmgpLHUuWEY9VFt1Lml4ZmVdLEw+MCYmKHUuej11LlhGJiZ1LlhGLm51bUZtdElkJiZNW3UuWEYubnVtRm10SWRdfHxNW3UuaXhmZT4+OCY2M10pLGNfKHUsdCxuLm9wdHMuRGF0ZTE5MDQpLGsoe2M6JC5jLHI6JC5yfSx1LHQpO2JyZWFrO2Nhc2UgNTEzOnQuc2hlZXRTdHVicyYmKHU9e2l4ZmU6JC5peGZlLFhGOlRbJC5peGZlXSx0OiJ6In0sTD4wJiYodS56PXUuWEYmJnUuWEYubnVtRm10SWQmJk1bdS5YRi5udW1GbXRJZF18fE1bdS5peGZlPj44JjYzXSksY18odSx0LG4ub3B0cy5EYXRlMTkwNCksayh7YzokLmMscjokLnJ9LHUsdCkpO2JyZWFrO2Nhc2UgMTkwOmlmKHQuc2hlZXRTdHVicylmb3IodmFyIGFlPSQuYzthZTw9JC5DOysrYWUpe3ZhciBvZT0kLml4ZmVbYWUtJC5jXTt1PXtpeGZlOm9lLFhGOlRbb2VdLHQ6InoifSxMPjAmJih1Lno9dS5YRiYmdS5YRi5udW1GbXRJZCYmTVt1LlhGLm51bUZtdElkXXx8TVt1Lml4ZmU+PjgmNjNdKSxjXyh1LHQsbi5vcHRzLkRhdGUxOTA0KSxrKHtjOmFlLHI6JC5yfSx1LHQpfWJyZWFrO2Nhc2UgMjE0OmNhc2UgNTE2OmNhc2UgNDoodT1zXygkLnZhbCwkLml4ZmUsInMiKSkuWEY9VFt1Lml4ZmVdLEw+MCYmKHUuej11LlhGJiZ1LlhGLm51bUZtdElkJiZNW3UuWEYubnVtRm10SWRdfHxNW3UuaXhmZT4+OCY2M10pLGNfKHUsdCxuLm9wdHMuRGF0ZTE5MDQpLGsoe2M6JC5jLHI6JC5yfSx1LHQpO2JyZWFrO2Nhc2UgMDpjYXNlIDUxMjoxPT09VyYmKHA9JCk7YnJlYWs7Y2FzZSAyNTI6bT0kO2JyZWFrO2Nhc2UgMTA1NDppZihTLmJpZmY+PTMmJlMuYmlmZjw9NCl7TVtMKytdPSRbMV07Zm9yKHZhciBjZT0wO2NlPEwrMTYzJiZnbVtjZV0hPSRbMV07KytjZSk7Y2U+PTE2MyYmJG0oJFsxXSxMKzE2Myl9ZWxzZSAkbSgkWzFdLCRbMF0pO2JyZWFrO2Nhc2UgMzA6TVtMKytdPSQ7Zm9yKHZhciBzZT0wO3NlPEwrMTYzJiZnbVtzZV0hPSQ7KytzZSk7c2U+PTE2MyYmJG0oJCxMKzE2Myk7YnJlYWs7Y2FzZSAyMjk6Qz1DLmNvbmNhdCgkKTticmVhaztjYXNlIDkzOkZbJC5jbW9bMF1dPVMubGFzdG9iaj0kO2JyZWFrO2Nhc2UgNDM4OlMubGFzdG9iai5UeE89JDticmVhaztjYXNlIDEyNzpTLmxhc3RvYmouSW1EYXRhPSQ7YnJlYWs7Y2FzZSA0NDA6Zm9yKGw9JFswXS5zLnI7bDw9JFswXS5lLnI7KytsKWZvcihzPSRbMF0ucy5jO3M8PSRbMF0uZS5jOysrcykobz10LmRlbnNlPyhpWyIhZGF0YSJdW2xdfHxbXSlbc106aVtvdih7YzpzLHI6bH0pXSkmJihvLmw9JFsxXSk7YnJlYWs7Y2FzZSAyMDQ4OmZvcihsPSRbMF0ucy5yO2w8PSRbMF0uZS5yOysrbClmb3Iocz0kWzBdLnMuYztzPD0kWzBdLmUuYzsrK3MpKG89dC5kZW5zZT8oaVsiIWRhdGEiXVtsXXx8W10pW3NdOmlbb3Yoe2M6cyxyOmx9KV0pJiZvLmwmJihvLmwuVG9vbHRpcD0kWzFdKTticmVhaztjYXNlIDI4OmlmKChvPXQuZGVuc2U/KGlbIiFkYXRhIl1bJFswXS5yXXx8W10pWyRbMF0uY106aVtvdigkWzBdKV0pfHwodC5kZW5zZT8oaVsiIWRhdGEiXVskWzBdLnJdfHwoaVsiIWRhdGEiXVskWzBdLnJdPVtdKSxvPWlbIiFkYXRhIl1bJFswXS5yXVskWzBdLmNdPXt0OiJ6In0pOm89aVtvdigkWzBdKV09e3Q6InoifSxwLmUucj1NYXRoLm1heChwLmUuciwkWzBdLnIpLHAucy5yPU1hdGgubWluKHAucy5yLCRbMF0ucikscC5lLmM9TWF0aC5tYXgocC5lLmMsJFswXS5jKSxwLnMuYz1NYXRoLm1pbihwLnMuYywkWzBdLmMpKSxvLmN8fChvLmM9W10pLFMuYmlmZjw9NSYmUy5iaWZmPj0yKWM9e2E6IlNoZWV0SjUiLHQ6JFsxXX07ZWxzZXt2YXIgbGU9RlskWzJdXTtjPXthOiRbMV0sdDpsZS5UeE8udH0sbnVsbD09JFszXXx8MiYkWzNdfHwoby5jLmhpZGRlbj0hMCl9by5jLnB1c2goYyk7YnJlYWs7Y2FzZSAyMTczOlRbJC5peGZlXSwkLmV4dC5mb3JFYWNoKChmdW5jdGlvbihlKXtlWzBdfSkpO2JyZWFrO2Nhc2UgMTI1OmlmKCFTLmNlbGxTdHlsZXMpYnJlYWs7Zm9yKDskLmU+PSQuczspT1skLmUtLV09e3dpZHRoOiQudy8yNTYsbGV2ZWw6JC5sZXZlbHx8MCxoaWRkZW46ISEoMSYkLmZsYWdzKX0sUnx8KFI9ITAsakQoJC53LzI1NikpLHpEKE9bJC5lKzFdKTticmVhaztjYXNlIDUyMDp2YXIgdWU9e307bnVsbCE9JC5sZXZlbCYmKElbJC5yXT11ZSx1ZS5sZXZlbD0kLmxldmVsKSwkLmhpZGRlbiYmKElbJC5yXT11ZSx1ZS5oaWRkZW49ITApLCQuaHB0JiYoSVskLnJdPXVlLHVlLmhwdD0kLmhwdCx1ZS5ocHg9cUQoJC5ocHQpKTticmVhaztjYXNlIDM4OmNhc2UgMzk6Y2FzZSA0MDpjYXNlIDQxOmlbIiFtYXJnaW5zIl18fG93KGlbIiFtYXJnaW5zIl09e30pLGlbIiFtYXJnaW5zIl1bezM4OiJsZWZ0IiwzOToicmlnaHQiLDQwOiJ0b3AiLDQxOiJib3R0b20ifVtWXV09JDticmVhaztjYXNlIDE2MTppWyIhbWFyZ2lucyJdfHxvdyhpWyIhbWFyZ2lucyJdPXt9KSxpWyIhbWFyZ2lucyJdLmhlYWRlcj0kLmhlYWRlcixpWyIhbWFyZ2lucyJdLmZvb3Rlcj0kLmZvb3RlcjticmVhaztjYXNlIDU3NDokLlJUTCYmKF8uVmlld3NbMF0uUlRMPSEwKTticmVhaztjYXNlIDE0Njp3PSQ7YnJlYWs7Y2FzZSAyMTk4OmQ9JDticmVhaztjYXNlIDE0MDpmPSQ7YnJlYWs7Y2FzZSA0NDI6Yj9FLkNvZGVOYW1lPSR8fEUubmFtZTpfLldCUHJvcHMuQ29kZU5hbWU9JHx8IlRoaXNXb3JrYm9vayJ9fWVsc2UgR3x8Y29uc29sZS5lcnJvcigiTWlzc2luZyBJbmZvIGZvciBYTFMgUmVjb3JkIDB4IitWLnRvU3RyaW5nKDE2KSksZS5sKz1xfXJldHVybiBuLlNoZWV0TmFtZXM9Wm0oaCkuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gTnVtYmVyKGUpLU51bWJlcih0KX0pKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBoW2VdLm5hbWV9KSksdC5ib29rU2hlZXRzfHwobi5TaGVldHM9ciksIW4uU2hlZXROYW1lcy5sZW5ndGgmJnlbIiFyZWYiXT8obi5TaGVldE5hbWVzLnB1c2goIlNoZWV0MSIpLG4uU2hlZXRzJiYobi5TaGVldHMuU2hlZXQxPXkpKTpuLlByZWFtYmxlPXksbi5TaGVldHMmJmouZm9yRWFjaCgoZnVuY3Rpb24oZSx0KXtuLlNoZWV0c1tuLlNoZWV0TmFtZXNbdF1dWyIhYXV0b2ZpbHRlciJdPWV9KSksbi5TdHJpbmdzPW0sbi5TU0Y9dWIoZ20pLFMuZW5jJiYobi5FbmNyeXB0aW9uPVMuZW5jKSxkJiYobi5UaGVtZXM9ZCksbi5NZXRhZGF0YT17fSx2b2lkIDAhPT1mJiYobi5NZXRhZGF0YS5Db3VudHJ5PWYpLE4ubmFtZXMubGVuZ3RoPjAmJihfLk5hbWVzPU4ubmFtZXMpLG4uV29ya2Jvb2s9XyxufXZhciB1Xz17U0k6ImUwODU5ZmYyZjk0ZjY4MTBhYjkxMDgwMDJiMjdiM2Q5IixEU0k6IjAyZDVjZGQ1OWMyZTFiMTA5Mzk3MDgwMDJiMmNmOWFlIixVREk6IjA1ZDVjZGQ1OWMyZTFiMTA5Mzk3MDgwMDJiMmNmOWFlIn07ZnVuY3Rpb24gZl8oZSx0KXt2YXIgbixyLGksYTtpZih0fHwodD17fSkscV8odCksV2coKSx0LmNvZGVwYWdlJiZQZyh0LmNvZGVwYWdlKSxlLkZ1bGxQYXRocyl7aWYoS20uZmluZChlLCIvZW5jcnlwdGlvbiIpKXRocm93IG5ldyBFcnJvcigiRmlsZSBpcyBwYXNzd29yZC1wcm90ZWN0ZWQiKTtuPUttLmZpbmQoZSwiIUNvbXBPYmoiKSxyPUttLmZpbmQoZSwiL1dvcmtib29rIil8fEttLmZpbmQoZSwiL0Jvb2siKX1lbHNle3N3aXRjaCh0LnR5cGUpe2Nhc2UiYmFzZTY0IjplPWVtKCRnKGUpKTticmVhaztjYXNlImJpbmFyeSI6ZT1lbShlKTticmVhaztjYXNlImJ1ZmZlciI6YnJlYWs7Y2FzZSJhcnJheSI6QXJyYXkuaXNBcnJheShlKXx8KGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSkpfUd5KGUsMCkscj17Y29udGVudDplfX1pZihuJiZpXyhuKSx0LmJvb2tQcm9wcyYmIXQuYm9va1NoZWV0cylpPXt9O2Vsc2V7dmFyIG89WWc/ImJ1ZmZlciI6ImFycmF5IjtpZihyJiZyLmNvbnRlbnQpaT1sXyhyLmNvbnRlbnQsdCk7ZWxzZSBpZigoYT1LbS5maW5kKGUsIlBlcmZlY3RPZmZpY2VfTUFJTiIpKSYmYS5jb250ZW50KWk9b0QudG9fd29ya2Jvb2soYS5jb250ZW50LCh0LnR5cGU9byx0KSk7ZWxzZXtpZighKGE9S20uZmluZChlLCJOYXRpdmVDb250ZW50X01BSU4iKSl8fCFhLmNvbnRlbnQpdGhyb3coYT1LbS5maW5kKGUsIk1OMCIpKSYmYS5jb250ZW50P25ldyBFcnJvcigiVW5zdXBwb3J0ZWQgV29ya3MgNCBmb3IgTWFjIGZpbGUiKTpuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIFdvcmtib29rIHN0cmVhbSIpO2k9b0QudG9fd29ya2Jvb2soYS5jb250ZW50LCh0LnR5cGU9byx0KSl9dC5ib29rVkJBJiZlLkZ1bGxQYXRocyYmS20uZmluZChlLCIvX1ZCQV9QUk9KRUNUX0NVUi9WQkEvZGlyIikmJihpLnZiYXJhdz1mdW5jdGlvbihlKXt2YXIgdD1LbS51dGlscy5jZmJfbmV3KHtyb290OiJSIn0pO3JldHVybiBlLkZ1bGxQYXRocy5mb3JFYWNoKChmdW5jdGlvbihuLHIpe2lmKCIvIiE9PW4uc2xpY2UoLTEpJiZuLm1hdGNoKC9fVkJBX1BST0pFQ1RfQ1VSLykpe3ZhciBpPW4ucmVwbGFjZSgvXlteXC9dKi8sIlIiKS5yZXBsYWNlKC9cL19WQkFfUFJPSkVDVF9DVVJcdTAwMDAqLywiIik7S20udXRpbHMuY2ZiX2FkZCh0LGksZS5GaWxlSW5kZXhbcl0uY29udGVudCl9fSkpLEttLndyaXRlKHQpfShlKSl9dmFyIGM9e307cmV0dXJuIGUuRnVsbFBhdGhzJiZmdW5jdGlvbihlLHQsbil7dmFyIHI9S20uZmluZChlLCIvIURvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9uIik7aWYociYmci5zaXplPjApdHJ5e3ZhciBpPWd4KHIsUHYsdV8uRFNJKTtmb3IodmFyIGEgaW4gaSl0W2FdPWlbYV19Y2F0Y2goZSl7aWYobi5XVEYpdGhyb3cgZX12YXIgbz1LbS5maW5kKGUsIi8hU3VtbWFyeUluZm9ybWF0aW9uIik7aWYobyYmby5zaXplPjApdHJ5e3ZhciBjPWd4KG8sQnYsdV8uU0kpO2Zvcih2YXIgcyBpbiBjKW51bGw9PXRbc10mJih0W3NdPWNbc10pfWNhdGNoKGUpe2lmKG4uV1RGKXRocm93IGV9dC5IZWFkaW5nUGFpcnMmJnQuVGl0bGVzT2ZQYXJ0cyYmKGV4KHQuSGVhZGluZ1BhaXJzLHQuVGl0bGVzT2ZQYXJ0cyx0LG4pLGRlbGV0ZSB0LkhlYWRpbmdQYWlycyxkZWxldGUgdC5UaXRsZXNPZlBhcnRzKX0oZSxjLHQpLGkuUHJvcHM9aS5DdXN0cHJvcHM9Yyx0LmJvb2tGaWxlcyYmKGkuY2ZiPWUpLGl9dmFyIGRfPXswOntmOmZ1bmN0aW9uKGUsdCl7dmFyIG49e30scj1lLmwrdDtuLnI9ZS5yZWFkX3NoaWZ0KDQpLGUubCs9NDt2YXIgaT1lLnJlYWRfc2hpZnQoMik7ZS5sKz0xO3ZhciBhPWUucmVhZF9zaGlmdCgxKTtyZXR1cm4gZS5sPXIsNyZhJiYobi5sZXZlbD03JmEpLDE2JmEmJihuLmhpZGRlbj0hMCksMzImYSYmKG4uaHB0PWkvMjApLG59fSwxOntmOmZ1bmN0aW9uKGUpe3JldHVyblt2dihlKV19fSwyOntmOmZ1bmN0aW9uKGUpe3JldHVyblt2dihlKSxFdihlKSwibiJdfX0sMzp7ZjpmdW5jdGlvbihlKXtyZXR1cm5bdnYoZSksZS5yZWFkX3NoaWZ0KDEpLCJlIl19fSw0OntmOmZ1bmN0aW9uKGUpe3JldHVyblt2dihlKSxlLnJlYWRfc2hpZnQoMSksImIiXX19LDU6e2Y6ZnVuY3Rpb24oZSl7cmV0dXJuW3Z2KGUpLGt2KGUpLCJuIl19fSw2OntmOmZ1bmN0aW9uKGUpe3JldHVyblt2dihlKSxndihlKSwic3RyIl19fSw3OntmOmZ1bmN0aW9uKGUpe3JldHVyblt2dihlKSxlLnJlYWRfc2hpZnQoNCksInMiXX19LDg6e2Y6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUubCt0LGk9dnYoZSk7aS5yPW5bIiFyb3ciXTt2YXIgYT1baSxndihlKSwic3RyIl07aWYobi5jZWxsRm9ybXVsYSl7ZS5sKz0yO3ZhciBvPUtUKGUsci1lLmwsbik7YVszXT1WVChvLDAsaSxuLnN1cGJvb2tzLG4pfWVsc2UgZS5sPXI7cmV0dXJuIGF9fSw5OntmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmwrdCxpPXZ2KGUpO2kucj1uWyIhcm93Il07dmFyIGE9W2ksa3YoZSksIm4iXTtpZihuLmNlbGxGb3JtdWxhKXtlLmwrPTI7dmFyIG89S1QoZSxyLWUubCxuKTthWzNdPVZUKG8sMCxpLG4uc3VwYm9va3Msbil9ZWxzZSBlLmw9cjtyZXR1cm4gYX19LDEwOntmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmwrdCxpPXZ2KGUpO2kucj1uWyIhcm93Il07dmFyIGE9W2ksZS5yZWFkX3NoaWZ0KDEpLCJiIl07aWYobi5jZWxsRm9ybXVsYSl7ZS5sKz0yO3ZhciBvPUtUKGUsci1lLmwsbik7YVszXT1WVChvLDAsaSxuLnN1cGJvb2tzLG4pfWVsc2UgZS5sPXI7cmV0dXJuIGF9fSwxMTp7ZjpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5sK3QsaT12dihlKTtpLnI9blsiIXJvdyJdO3ZhciBhPVtpLGUucmVhZF9zaGlmdCgxKSwiZSJdO2lmKG4uY2VsbEZvcm11bGEpe2UubCs9Mjt2YXIgbz1LVChlLHItZS5sLG4pO2FbM109VlQobywwLGksbi5zdXBib29rcyxuKX1lbHNlIGUubD1yO3JldHVybiBhfX0sMTI6e2Y6ZnVuY3Rpb24oZSl7cmV0dXJuW3h2KGUpXX19LDEzOntmOmZ1bmN0aW9uKGUpe3JldHVyblt4dihlKSxFdihlKSwibiJdfX0sMTQ6e2Y6ZnVuY3Rpb24oZSl7cmV0dXJuW3h2KGUpLGUucmVhZF9zaGlmdCgxKSwiZSJdfX0sMTU6e2Y6ZnVuY3Rpb24oZSl7cmV0dXJuW3h2KGUpLGUucmVhZF9zaGlmdCgxKSwiYiJdfX0sMTY6e2Y6d3d9LDE3OntmOmZ1bmN0aW9uKGUpe3JldHVyblt4dihlKSxndihlKSwic3RyIl19fSwxODp7ZjpmdW5jdGlvbihlKXtyZXR1cm5beHYoZSksZS5yZWFkX3NoaWZ0KDQpLCJzIl19fSwxOTp7Zjpidn0sMjA6e30sMjE6e30sMjI6e30sMjM6e30sMjQ6e30sMjU6e30sMjY6e30sMjc6e30sMjg6e30sMjk6e30sMzA6e30sMzE6e30sMzI6e30sMzM6e30sMzQ6e30sMzU6e1Q6MX0sMzY6e1Q6LTF9LDM3OntUOjF9LDM4OntUOi0xfSwzOTp7ZjpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5sK3QsaT1lLnJlYWRfc2hpZnQoNCk7ZS5sKz0xO3ZhciBhPWUucmVhZF9zaGlmdCg0KSxvPXd2KGUpLGM9WlQoZSwwLG4pLHM9VHYoZSk7MzImaSYmKG89Il94bG5tLiIrbyksZS5sPXI7dmFyIGw9e05hbWU6byxQdGc6YyxGbGFnczppfTtyZXR1cm4gYTwyNjg0MzU0NTUmJihsLlNoZWV0PWEpLHMmJihsLkNvbW1lbnQ9cyksbH19LDQwOnt9LDQyOnt9LDQzOntmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtyLnN6PWUucmVhZF9zaGlmdCgyKS8yMDt2YXIgaT1mdW5jdGlvbihlKXt2YXIgdD1lLnJlYWRfc2hpZnQoMSk7cmV0dXJuIGUubCsrLHtmQm9sZDoxJnQsZkl0YWxpYzoyJnQsZlVuZGVybGluZTo0JnQsZlN0cmlrZW91dDo4JnQsZk91dGxpbmU6MTYmdCxmU2hhZG93OjMyJnQsZkNvbmRlbnNlOjY0JnQsZkV4dGVuZDoxMjgmdH19KGUpO3N3aXRjaChpLmZJdGFsaWMmJihyLml0YWxpYz0xKSxpLmZDb25kZW5zZSYmKHIuY29uZGVuc2U9MSksaS5mRXh0ZW5kJiYoci5leHRlbmQ9MSksaS5mU2hhZG93JiYoci5zaGFkb3c9MSksaS5mT3V0bGluZSYmKHIub3V0bGluZT0xKSxpLmZTdHJpa2VvdXQmJihyLnN0cmlrZT0xKSw3MDA9PT1lLnJlYWRfc2hpZnQoMikmJihyLmJvbGQ9MSksZS5yZWFkX3NoaWZ0KDIpKXtjYXNlIDE6ci52ZXJ0QWxpZ249InN1cGVyc2NyaXB0IjticmVhaztjYXNlIDI6ci52ZXJ0QWxpZ249InN1YnNjcmlwdCJ9dmFyIGE9ZS5yZWFkX3NoaWZ0KDEpOzAhPWEmJihyLnVuZGVybGluZT1hKTt2YXIgbz1lLnJlYWRfc2hpZnQoMSk7bz4wJiYoci5mYW1pbHk9byk7dmFyIGM9ZS5yZWFkX3NoaWZ0KDEpO3N3aXRjaChjPjAmJihyLmNoYXJzZXQ9YyksZS5sKyssci5jb2xvcj1mdW5jdGlvbihlKXt2YXIgdD17fSxuPWUucmVhZF9zaGlmdCgxKT4+PjEscj1lLnJlYWRfc2hpZnQoMSksaT1lLnJlYWRfc2hpZnQoMiwiaSIpLGE9ZS5yZWFkX3NoaWZ0KDEpLG89ZS5yZWFkX3NoaWZ0KDEpLGM9ZS5yZWFkX3NoaWZ0KDEpO3N3aXRjaChlLmwrKyxuKXtjYXNlIDA6dC5hdXRvPTE7YnJlYWs7Y2FzZSAxOnQuaW5kZXg9cjt2YXIgcz1qdltyXTtzJiYodC5yZ2I9RkQocykpO2JyZWFrO2Nhc2UgMjp0LnJnYj1GRChbYSxvLGNdKTticmVhaztjYXNlIDM6dC50aGVtZT1yfXJldHVybiAwIT1pJiYodC50aW50PWk+MD9pLzMyNzY3OmkvMzI3NjgpLHR9KGUpLGUucmVhZF9zaGlmdCgxKSl7Y2FzZSAxOnIuc2NoZW1lPSJtYWpvciI7YnJlYWs7Y2FzZSAyOnIuc2NoZW1lPSJtaW5vciJ9cmV0dXJuIHIubmFtZT1ndihlKSxyfX0sNDQ6e2Y6ZnVuY3Rpb24oZSx0KXtyZXR1cm5bZS5yZWFkX3NoaWZ0KDIpLGd2KGUpXX19LDQ1OntmOktEfSw0Njp7ZjpaRH0sNDc6e2Y6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmwrdCxyPWUucmVhZF9zaGlmdCgyKSxpPWUucmVhZF9zaGlmdCgyKTtyZXR1cm4gZS5sPW4se2l4ZmU6cixudW1GbXRJZDppfX19LDQ4Ont9LDQ5OntmOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlYWRfc2hpZnQoNCwiaSIpfX0sNTA6e30sNTE6e2Y6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49ZS5yZWFkX3NoaWZ0KDQpO24tLSA+MDspdC5wdXNoKFtlLnJlYWRfc2hpZnQoNCksZS5yZWFkX3NoaWZ0KDQpXSk7cmV0dXJuIHR9fSw1Mjp7VDoxfSw1Mzp7VDotMX0sNTQ6e1Q6MX0sNTU6e1Q6LTF9LDU2OntUOjF9LDU3OntUOi0xfSw1ODp7fSw1OTp7fSw2MDp7ZjpLeH0sNjI6e2Y6ZnVuY3Rpb24oZSl7cmV0dXJuW3Z2KGUpLGJ2KGUpLCJpcyJdfX0sNjM6e2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9e307dC5pPWUucmVhZF9zaGlmdCg0KTt2YXIgbj17fTtuLnI9ZS5yZWFkX3NoaWZ0KDQpLG4uYz1lLnJlYWRfc2hpZnQoNCksdC5yPW92KG4pO3ZhciByPWUucmVhZF9zaGlmdCgxKTtyZXR1cm4gMiZyJiYodC5sPSIxIiksOCZyJiYodC5hPSIxIiksdH19LDY0OntmOmZ1bmN0aW9uKCl7fX0sNjU6e30sNjY6e30sNjc6e30sNjg6e30sNjk6e30sNzA6e30sMTI4Ont9LDEyOTp7VDoxfSwxMzA6e1Q6LTF9LDEzMTp7VDoxLGY6WHkscDowfSwxMzI6e1Q6LTF9LDEzMzp7VDoxfSwxMzQ6e1Q6LTF9LDEzNTp7VDoxfSwxMzY6e1Q6LTF9LDEzNzp7VDoxLGY6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZWFkX3NoaWZ0KDIpO3JldHVybiBlLmwrPTI4LHtSVEw6MzImdH19fSwxMzg6e1Q6LTF9LDEzOTp7VDoxfSwxNDA6e1Q6LTF9LDE0MTp7VDoxfSwxNDI6e1Q6LTF9LDE0Mzp7VDoxfSwxNDQ6e1Q6LTF9LDE0NTp7VDoxfSwxNDY6e1Q6LTF9LDE0Nzp7ZjpmdW5jdGlvbihlLHQpe3ZhciBuPXt9LHI9ZVtlLmxdO3JldHVybisrZS5sLG4uYWJvdmU9ISg2NCZyKSxuLmxlZnQ9ISgxMjgmciksZS5sKz0xOCxuLm5hbWU9RHYoZSksbn19LDE0ODp7ZjpUdyxwOjE2fSwxNTE6e2Y6ZnVuY3Rpb24oKXt9fSwxNTI6e30sMTUzOntmOmZ1bmN0aW9uKGUsdCl7dmFyIG49e30scj1lLnJlYWRfc2hpZnQoNCk7bi5kZWZhdWx0VGhlbWVWZXJzaW9uPWUucmVhZF9zaGlmdCg0KTt2YXIgaT10Pjg/Z3YoZSk6IiI7cmV0dXJuIGkubGVuZ3RoPjAmJihuLkNvZGVOYW1lPWkpLG4uYXV0b0NvbXByZXNzUGljdHVyZXM9ISEoNjU1MzYmciksbi5iYWNrdXBGaWxlPSEhKDY0JnIpLG4uY2hlY2tDb21wYXRpYmlsaXR5PSEhKDQwOTYmciksbi5kYXRlMTkwND0hISgxJnIpLG4uZmlsdGVyUHJpdmFjeT0hISg4JnIpLG4uaGlkZVBpdm90RmllbGRMaXN0PSEhKDEwMjQmciksbi5wcm9tcHRlZFNvbHV0aW9ucz0hISgxNiZyKSxuLnB1Ymxpc2hJdGVtcz0hISgyMDQ4JnIpLG4ucmVmcmVzaEFsbENvbm5lY3Rpb25zPSEhKDI2MjE0NCZyKSxuLnNhdmVFeHRlcm5hbExpbmtWYWx1ZXM9ISEoMTI4JnIpLG4uc2hvd0JvcmRlclVuc2VsZWN0ZWRUYWJsZXM9ISEoNCZyKSxuLnNob3dJbmtBbm5vdGF0aW9uPSEhKDMyJnIpLG4uc2hvd09iamVjdHM9WyJhbGwiLCJwbGFjZWhvbGRlcnMiLCJub25lIl1bcj4+MTMmM10sbi5zaG93UGl2b3RDaGFydEZpbHRlcj0hISgzMjc2OCZyKSxuLnVwZGF0ZUxpbmtzPVsidXNlclNldCIsIm5ldmVyIiwiYWx3YXlzIl1bcj4+OCYzXSxufX0sMTU0Ont9LDE1NTp7fSwxNTY6e2Y6ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtyZXR1cm4gbi5IaWRkZW49ZS5yZWFkX3NoaWZ0KDQpLG4uaVRhYklEPWUucmVhZF9zaGlmdCg0KSxuLnN0clJlbElEPV92KGUpLG4ubmFtZT1ndihlKSxufX0sMTU3Ont9LDE1ODp7fSwxNTk6e1Q6MSxmOmZ1bmN0aW9uKGUpe3JldHVybltlLnJlYWRfc2hpZnQoNCksZS5yZWFkX3NoaWZ0KDQpXX19LDE2MDp7VDotMX0sMTYxOntUOjEsZjpBdn0sMTYyOntUOi0xfSwxNjM6e1Q6MX0sMTY0OntUOi0xfSwxNjU6e1Q6MX0sMTY2OntUOi0xfSwxNjc6e30sMTY4Ont9LDE2OTp7fSwxNzA6e30sMTcxOnt9LDE3Mjp7VDoxfSwxNzM6e1Q6LTF9LDE3NDp7fSwxNzU6e30sMTc2OntmOl93fSwxNzc6e1Q6MX0sMTc4OntUOi0xfSwxNzk6e1Q6MX0sMTgwOntUOi0xfSwxODE6e1Q6MX0sMTgyOntUOi0xfSwxODM6e1Q6MX0sMTg0OntUOi0xfSwxODU6e1Q6MX0sMTg2OntUOi0xfSwxODc6e1Q6MX0sMTg4OntUOi0xfSwxODk6e1Q6MX0sMTkwOntUOi0xfSwxOTE6e1Q6MX0sMTkyOntUOi0xfSwxOTM6e1Q6MX0sMTk0OntUOi0xfSwxOTU6e1Q6MX0sMTk2OntUOi0xfSwxOTc6e1Q6MX0sMTk4OntUOi0xfSwxOTk6e1Q6MX0sMjAwOntUOi0xfSwyMDE6e1Q6MX0sMjAyOntUOi0xfSwyMDM6e1Q6MX0sMjA0OntUOi0xfSwyMDU6e1Q6MX0sMjA2OntUOi0xfSwyMDc6e1Q6MX0sMjA4OntUOi0xfSwyMDk6e1Q6MX0sMjEwOntUOi0xfSwyMTE6e1Q6MX0sMjEyOntUOi0xfSwyMTM6e1Q6MX0sMjE0OntUOi0xfSwyMTU6e1Q6MX0sMjE2OntUOi0xfSwyMTc6e1Q6MX0sMjE4OntUOi0xfSwyMTk6e1Q6MX0sMjIwOntUOi0xfSwyMjE6e1Q6MX0sMjIyOntUOi0xfSwyMjM6e1Q6MX0sMjI0OntUOi0xfSwyMjU6e1Q6MX0sMjI2OntUOi0xfSwyMjc6e1Q6MX0sMjI4OntUOi0xfSwyMjk6e1Q6MX0sMjMwOntUOi0xfSwyMzE6e1Q6MX0sMjMyOntUOi0xfSwyMzM6e1Q6MX0sMjM0OntUOi0xfSwyMzU6e1Q6MX0sMjM2OntUOi0xfSwyMzc6e1Q6MX0sMjM4OntUOi0xfSwyMzk6e1Q6MX0sMjQwOntUOi0xfSwyNDE6e1Q6MX0sMjQyOntUOi0xfSwyNDM6e1Q6MX0sMjQ0OntUOi0xfSwyNDU6e1Q6MX0sMjQ2OntUOi0xfSwyNDc6e1Q6MX0sMjQ4OntUOi0xfSwyNDk6e1Q6MX0sMjUwOntUOi0xfSwyNTE6e1Q6MX0sMjUyOntUOi0xfSwyNTM6e1Q6MX0sMjU0OntUOi0xfSwyNTU6e1Q6MX0sMjU2OntUOi0xfSwyNTc6e1Q6MX0sMjU4OntUOi0xfSwyNTk6e1Q6MX0sMjYwOntUOi0xfSwyNjE6e1Q6MX0sMjYyOntUOi0xfSwyNjM6e1Q6MX0sMjY0OntUOi0xfSwyNjU6e1Q6MX0sMjY2OntUOi0xfSwyNjc6e1Q6MX0sMjY4OntUOi0xfSwyNjk6e1Q6MX0sMjcwOntUOi0xfSwyNzE6e1Q6MX0sMjcyOntUOi0xfSwyNzM6e1Q6MX0sMjc0OntUOi0xfSwyNzU6e1Q6MX0sMjc2OntUOi0xfSwyNzc6e30sMjc4OntUOjF9LDI3OTp7VDotMX0sMjgwOntUOjF9LDI4MTp7VDotMX0sMjgyOntUOjF9LDI4Mzp7VDoxfSwyODQ6e1Q6LTF9LDI4NTp7VDoxfSwyODY6e1Q6LTF9LDI4Nzp7VDoxfSwyODg6e1Q6LTF9LDI4OTp7VDoxfSwyOTA6e1Q6LTF9LDI5MTp7VDoxfSwyOTI6e1Q6LTF9LDI5Mzp7VDoxfSwyOTQ6e1Q6LTF9LDI5NTp7VDoxfSwyOTY6e1Q6LTF9LDI5Nzp7VDoxfSwyOTg6e1Q6LTF9LDI5OTp7VDoxfSwzMDA6e1Q6LTF9LDMwMTp7VDoxfSwzMDI6e1Q6LTF9LDMwMzp7VDoxfSwzMDQ6e1Q6LTF9LDMwNTp7VDoxfSwzMDY6e1Q6LTF9LDMwNzp7VDoxfSwzMDg6e1Q6LTF9LDMwOTp7VDoxfSwzMTA6e1Q6LTF9LDMxMTp7VDoxfSwzMTI6e1Q6LTF9LDMxMzp7VDotMX0sMzE0OntUOjF9LDMxNTp7VDotMX0sMzE2OntUOjF9LDMxNzp7VDotMX0sMzE4OntUOjF9LDMxOTp7VDotMX0sMzIwOntUOjF9LDMyMTp7VDotMX0sMzIyOntUOjF9LDMyMzp7VDotMX0sMzI0OntUOjF9LDMyNTp7VDotMX0sMzI2OntUOjF9LDMyNzp7VDotMX0sMzI4OntUOjF9LDMyOTp7VDotMX0sMzMwOntUOjF9LDMzMTp7VDotMX0sMzMyOntUOjF9LDMzMzp7VDotMX0sMzM0OntUOjF9LDMzNTp7ZjpmdW5jdGlvbihlLHQpe3JldHVybntmbGFnczplLnJlYWRfc2hpZnQoNCksdmVyc2lvbjplLnJlYWRfc2hpZnQoNCksbmFtZTpndihlKX19fSwzMzY6e1Q6LTF9LDMzNzp7ZjpmdW5jdGlvbihlKXtyZXR1cm4gZS5sKz00LDAhPWUucmVhZF9zaGlmdCg0KX0sVDoxfSwzMzg6e1Q6LTF9LDMzOTp7VDoxfSwzNDA6e1Q6LTF9LDM0MTp7VDoxfSwzNDI6e1Q6LTF9LDM0Mzp7VDoxfSwzNDQ6e1Q6LTF9LDM0NTp7VDoxfSwzNDY6e1Q6LTF9LDM0Nzp7VDoxfSwzNDg6e1Q6LTF9LDM0OTp7VDoxfSwzNTA6e1Q6LTF9LDM1MTp7fSwzNTI6e30sMzUzOntUOjF9LDM1NDp7VDotMX0sMzU1OntmOl92fSwzNTc6e30sMzU4Ont9LDM1OTp7fSwzNjA6e1Q6MX0sMzYxOnt9LDM2Mjp7ZjpHeH0sMzYzOnt9LDM2NDp7fSwzNjY6e30sMzY3Ont9LDM2ODp7fSwzNjk6e30sMzcwOnt9LDM3MTp7fSwzNzI6e1Q6MX0sMzczOntUOi0xfSwzNzQ6e1Q6MX0sMzc1OntUOi0xfSwzNzY6e1Q6MX0sMzc3OntUOi0xfSwzNzg6e1Q6MX0sMzc5OntUOi0xfSwzODA6e1Q6MX0sMzgxOntUOi0xfSwzODI6e1Q6MX0sMzgzOntUOi0xfSwzODQ6e1Q6MX0sMzg1OntUOi0xfSwzODY6e1Q6MX0sMzg3OntUOi0xfSwzODg6e1Q6MX0sMzg5OntUOi0xfSwzOTA6e1Q6MX0sMzkxOntUOi0xfSwzOTI6e1Q6MX0sMzkzOntUOi0xfSwzOTQ6e1Q6MX0sMzk1OntUOi0xfSwzOTY6e30sMzk3Ont9LDM5ODp7fSwzOTk6e30sNDAwOnt9LDQwMTp7VDoxfSw0MDM6e30sNDA0Ont9LDQwNTp7fSw0MDY6e30sNDA3Ont9LDQwODp7fSw0MDk6e30sNDEwOnt9LDQxMTp7fSw0MTI6e30sNDEzOnt9LDQxNDp7fSw0MTU6e30sNDE2Ont9LDQxNzp7fSw0MTg6e30sNDE5Ont9LDQyMDp7fSw0MjE6e30sNDIyOntUOjF9LDQyMzp7VDoxfSw0MjQ6e1Q6LTF9LDQyNTp7VDotMX0sNDI2OntmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmwrdCxpPVV2KGUpLGE9ZS5yZWFkX3NoaWZ0KDEpLG89W2ldO2lmKG9bMl09YSxuLmNlbGxGb3JtdWxhKXt2YXIgYz1ZVChlLHItZS5sLG4pO29bMV09Y31lbHNlIGUubD1yO3JldHVybiBvfX0sNDI3OntmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmwrdCxpPVtBdihlKV07aWYobi5jZWxsRm9ybXVsYSl7dmFyIGE9SlQoZSxyLWUubCxuKTtpWzFdPWEsZS5sPXJ9ZWxzZSBlLmw9cjtyZXR1cm4gaX19LDQyODp7fSw0Mjk6e1Q6MX0sNDMwOntUOi0xfSw0MzE6e1Q6MX0sNDMyOntUOi0xfSw0MzM6e1Q6MX0sNDM0OntUOi0xfSw0MzU6e1Q6MX0sNDM2OntUOi0xfSw0Mzc6e1Q6MX0sNDM4OntUOi0xfSw0Mzk6e1Q6MX0sNDQwOntUOi0xfSw0NDE6e1Q6MX0sNDQyOntUOi0xfSw0NDM6e1Q6MX0sNDQ0OntUOi0xfSw0NDU6e1Q6MX0sNDQ2OntUOi0xfSw0NDc6e1Q6MX0sNDQ4OntUOi0xfSw0NDk6e1Q6MX0sNDUwOntUOi0xfSw0NTE6e1Q6MX0sNDUyOntUOi0xfSw0NTM6e1Q6MX0sNDU0OntUOi0xfSw0NTU6e1Q6MX0sNDU2OntUOi0xfSw0NTc6e1Q6MX0sNDU4OntUOi0xfSw0NTk6e1Q6MX0sNDYwOntUOi0xfSw0NjE6e1Q6MX0sNDYyOntUOi0xfSw0NjM6e1Q6MX0sNDY0OntUOi0xfSw0NjU6e1Q6MX0sNDY2OntUOi0xfSw0Njc6e1Q6MX0sNDY4OntUOi0xfSw0Njk6e1Q6MX0sNDcwOntUOi0xfSw0NzE6e30sNDcyOnt9LDQ3Mzp7VDoxfSw0NzQ6e1Q6LTF9LDQ3NTp7fSw0NzY6e2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIEV3LmZvckVhY2goKGZ1bmN0aW9uKG4pe3Rbbl09a3YoZSl9KSksdH19LDQ3Nzp7fSw0Nzg6e30sNDc5OntUOjF9LDQ4MDp7VDotMX0sNDgxOntUOjF9LDQ4Mjp7VDotMX0sNDgzOntUOjF9LDQ4NDp7VDotMX0sNDg1OntmOmZ1bmN0aW9uKCl7fX0sNDg2OntUOjF9LDQ4Nzp7VDotMX0sNDg4OntUOjF9LDQ4OTp7VDotMX0sNDkwOntUOjF9LDQ5MTp7VDotMX0sNDkyOntUOjF9LDQ5Mzp7VDotMX0sNDk0OntmOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5sK3Qscj1BdihlKSxpPVR2KGUpLGE9Z3YoZSksbz1ndihlKSxjPWd2KGUpO2UubD1uO3ZhciBzPXtyZng6cixyZWxJZDppLGxvYzphLGRpc3BsYXk6Y307cmV0dXJuIG8mJihzLlRvb2x0aXA9byksc319LDQ5NTp7VDoxfSw0OTY6e1Q6LTF9LDQ5Nzp7VDoxfSw0OTg6e1Q6LTF9LDQ5OTp7fSw1MDA6e1Q6MX0sNTAxOntUOi0xfSw1MDI6e1Q6MX0sNTAzOntUOi0xfSw1MDQ6e30sNTA1OntUOjF9LDUwNjp7VDotMX0sNTA3Ont9LDUwODp7VDoxfSw1MDk6e1Q6LTF9LDUxMDp7VDoxfSw1MTE6e1Q6LTF9LDUxMjp7fSw1MTM6e30sNTE0OntUOjF9LDUxNTp7VDotMX0sNTE2OntUOjF9LDUxNzp7VDotMX0sNTE4OntUOjF9LDUxOTp7VDotMX0sNTIwOntUOjF9LDUyMTp7VDotMX0sNTIyOnt9LDUyMzp7fSw1MjQ6e30sNTI1Ont9LDUyNjp7fSw1Mjc6e30sNTI4OntUOjF9LDUyOTp7VDotMX0sNTMwOntUOjF9LDUzMTp7VDotMX0sNTMyOntUOjF9LDUzMzp7VDotMX0sNTM0Ont9LDUzNTp7fSw1MzY6e30sNTM3Ont9LDUzODp7VDoxfSw1Mzk6e1Q6LTF9LDU0MDp7VDoxfSw1NDE6e1Q6LTF9LDU0Mjp7VDoxfSw1NDg6e30sNTQ5Ont9LDU1MDp7Zjpfdn0sNTUxOntmOlR2fSw1NTI6e30sNTUzOnt9LDU1NDp7VDoxfSw1NTU6e1Q6LTF9LDU1Njp7VDoxfSw1NTc6e1Q6LTF9LDU1ODp7VDoxfSw1NTk6e1Q6LTF9LDU2MDp7VDoxfSw1NjE6e1Q6LTF9LDU2Mjp7fSw1NjQ6e30sNTY1OntUOjF9LDU2Njp7VDotMX0sNTY5OntUOjF9LDU3MDp7VDotMX0sNTcyOnt9LDU3Mzp7VDoxfSw1NzQ6e1Q6LTF9LDU3Nzp7fSw1Nzg6e30sNTc5Ont9LDU4MDp7fSw1ODE6e30sNTgyOnt9LDU4Mzp7fSw1ODQ6e30sNTg1Ont9LDU4Njp7fSw1ODc6e30sNTg4OntUOi0xfSw1ODk6e30sNTkwOntUOjF9LDU5MTp7VDotMX0sNTkyOntUOjF9LDU5Mzp7VDotMX0sNTk0OntUOjF9LDU5NTp7VDotMX0sNTk2Ont9LDU5Nzp7VDoxfSw1OTg6e1Q6LTF9LDU5OTp7VDoxfSw2MDA6e1Q6LTF9LDYwMTp7VDoxfSw2MDI6e1Q6LTF9LDYwMzp7VDoxfSw2MDQ6e1Q6LTF9LDYwNTp7VDoxfSw2MDY6e1Q6LTF9LDYwNzp7fSw2MDg6e1Q6MX0sNjA5OntUOi0xfSw2MTA6e30sNjExOntUOjF9LDYxMjp7VDotMX0sNjEzOntUOjF9LDYxNDp7VDotMX0sNjE1OntUOjF9LDYxNjp7VDotMX0sNjE3OntUOjF9LDYxODp7VDotMX0sNjE5OntUOjF9LDYyMDp7VDotMX0sNjI1Ont9LDYyNjp7VDoxfSw2Mjc6e1Q6LTF9LDYyODp7VDoxfSw2Mjk6e1Q6LTF9LDYzMDp7VDoxfSw2MzE6e1Q6LTF9LDYzMjp7ZjpmVH0sNjMzOntUOjF9LDYzNDp7VDotMX0sNjM1OntUOjEsZjpmdW5jdGlvbihlKXt2YXIgdD17fTt0LmlhdXRob3I9ZS5yZWFkX3NoaWZ0KDQpO3ZhciBuPUF2KGUpO3JldHVybiB0LnJmeD1uLnMsdC5yZWY9b3Yobi5zKSxlLmwrPTE2LHR9fSw2MzY6e1Q6LTF9LDYzNzp7Zjp5dn0sNjM4OntUOjF9LDYzOTp7fSw2NDA6e1Q6LTF9LDY0MTp7VDoxfSw2NDI6e1Q6LTF9LDY0Mzp7VDoxfSw2NDQ6e30sNjQ1OntUOi0xfSw2NDY6e1Q6MX0sNjQ4OntUOjF9LDY0OTp7fSw2NTA6e1Q6LTF9LDY1MTp7ZjpmdW5jdGlvbihlLHQpe3JldHVybiBlLmwrPTEwLHtuYW1lOmd2KGUpfX19LDY1Mjp7fSw2NTM6e1Q6MX0sNjU0OntUOi0xfSw2NTU6e1Q6MX0sNjU2OntUOi0xfSw2NTc6e1Q6MX0sNjU4OntUOi0xfSw2NTk6e30sNjYwOntUOjF9LDY2MTp7fSw2NjI6e1Q6LTF9LDY2Mzp7fSw2NjQ6e1Q6MX0sNjY1Ont9LDY2Njp7VDotMX0sNjY3Ont9LDY2ODp7fSw2Njk6e30sNjcxOntUOjF9LDY3Mjp7VDotMX0sNjczOntUOjF9LDY3NDp7VDotMX0sNjc1Ont9LDY3Njp7fSw2Nzc6e30sNjc4Ont9LDY3OTp7fSw2ODA6e30sNjgxOnt9LDEwMjQ6e30sMTAyNTp7fSwxMDI2OntUOjF9LDEwMjc6e1Q6LTF9LDEwMjg6e1Q6MX0sMTAyOTp7VDotMX0sMTAzMDp7fSwxMDMxOntUOjF9LDEwMzI6e1Q6LTF9LDEwMzM6e1Q6MX0sMTAzNDp7VDotMX0sMTAzNTp7fSwxMDM2Ont9LDEwMzc6e30sMTAzODp7VDoxfSwxMDM5OntUOi0xfSwxMDQwOnt9LDEwNDE6e1Q6MX0sMTA0Mjp7VDotMX0sMTA0Mzp7fSwxMDQ0Ont9LDEwNDU6e30sMTA0Njp7VDoxfSwxMDQ3OntUOi0xfSwxMDQ4OntUOjF9LDEwNDk6e1Q6LTF9LDEwNTA6e30sMTA1MTp7VDoxfSwxMDUyOntUOjF9LDEwNTM6e2Y6ZnVuY3Rpb24oKXt9fSwxMDU0OntUOjF9LDEwNTU6e30sMTA1Njp7VDoxfSwxMDU3OntUOi0xfSwxMDU4OntUOjF9LDEwNTk6e1Q6LTF9LDEwNjE6e30sMTA2Mjp7VDoxfSwxMDYzOntUOi0xfSwxMDY0OntUOjF9LDEwNjU6e1Q6LTF9LDEwNjY6e1Q6MX0sMTA2Nzp7VDotMX0sMTA2ODp7VDoxfSwxMDY5OntUOi0xfSwxMDcwOntUOjF9LDEwNzE6e1Q6LTF9LDEwNzI6e1Q6MX0sMTA3Mzp7VDotMX0sMTA3NTp7VDoxfSwxMDc2OntUOi0xfSwxMDc3OntUOjF9LDEwNzg6e1Q6LTF9LDEwNzk6e1Q6MX0sMTA4MDp7VDotMX0sMTA4MTp7VDoxfSwxMDgyOntUOi0xfSwxMDgzOntUOjF9LDEwODQ6e1Q6LTF9LDEwODU6e30sMTA4Njp7VDoxfSwxMDg3OntUOi0xfSwxMDg4OntUOjF9LDEwODk6e1Q6LTF9LDEwOTA6e1Q6MX0sMTA5MTp7VDotMX0sMTA5Mjp7VDoxfSwxMDkzOntUOi0xfSwxMDk0OntUOjF9LDEwOTU6e1Q6LTF9LDEwOTY6e30sMTA5Nzp7VDoxfSwxMDk4Ont9LDEwOTk6e1Q6LTF9LDExMDA6e1Q6MX0sMTEwMTp7VDotMX0sMTEwMjp7fSwxMTAzOnt9LDExMDQ6e30sMTEwNTp7fSwxMTExOnt9LDExMTI6e30sMTExMzp7VDoxfSwxMTE0OntUOi0xfSwxMTE1OntUOjF9LDExMTY6e1Q6LTF9LDExMTc6e30sMTExODp7VDoxfSwxMTE5OntUOi0xfSwxMTIwOntUOjF9LDExMjE6e1Q6LTF9LDExMjI6e1Q6MX0sMTEyMzp7VDotMX0sMTEyNDp7VDoxfSwxMTI1OntUOi0xfSwxMTI2Ont9LDExMjg6e1Q6MX0sMTEyOTp7VDotMX0sMTEzMDp7fSwxMTMxOntUOjF9LDExMzI6e1Q6LTF9LDExMzM6e1Q6MX0sMTEzNDp7VDotMX0sMTEzNTp7VDoxfSwxMTM2OntUOi0xfSwxMTM3OntUOjF9LDExMzg6e1Q6LTF9LDExMzk6e1Q6MX0sMTE0MDp7VDotMX0sMTE0MTp7fSwxMTQyOntUOjF9LDExNDM6e1Q6LTF9LDExNDQ6e1Q6MX0sMTE0NTp7VDotMX0sMTE0Njp7fSwxMTQ3OntUOjF9LDExNDg6e1Q6LTF9LDExNDk6e1Q6MX0sMTE1MDp7VDotMX0sMTE1Mjp7VDoxfSwxMTUzOntUOi0xfSwxMTU0OntUOi0xfSwxMTU1OntUOi0xfSwxMTU2OntUOi0xfSwxMTU3OntUOjF9LDExNTg6e1Q6LTF9LDExNTk6e1Q6MX0sMTE2MDp7VDotMX0sMTE2MTp7VDoxfSwxMTYyOntUOi0xfSwxMTYzOntUOjF9LDExNjQ6e1Q6LTF9LDExNjU6e1Q6MX0sMTE2Njp7VDotMX0sMTE2Nzp7VDoxfSwxMTY4OntUOi0xfSwxMTY5OntUOjF9LDExNzA6e1Q6LTF9LDExNzE6e30sMTE3Mjp7VDoxfSwxMTczOntUOi0xfSwxMTc3Ont9LDExNzg6e1Q6MX0sMTE4MDp7fSwxMTgxOnt9LDExODI6e30sMjA0ODp7VDoxfSwyMDQ5OntUOi0xfSwyMDUwOnt9LDIwNTE6e1Q6MX0sMjA1Mjp7VDotMX0sMjA1Mzp7fSwyMDU0Ont9LDIwNTU6e1Q6MX0sMjA1Njp7VDotMX0sMjA1Nzp7VDoxfSwyMDU4OntUOi0xfSwyMDYwOnt9LDIwNjc6e30sMjA2ODp7VDoxfSwyMDY5OntUOi0xfSwyMDcwOnt9LDIwNzE6e30sMjA3Mjp7VDoxfSwyMDczOntUOi0xfSwyMDc1Ont9LDIwNzY6e30sMjA3Nzp7VDoxfSwyMDc4OntUOi0xfSwyMDc5Ont9LDIwODA6e1Q6MX0sMjA4MTp7VDotMX0sMjA4Mjp7fSwyMDgzOntUOjF9LDIwODQ6e1Q6LTF9LDIwODU6e1Q6MX0sMjA4Njp7VDotMX0sMjA4Nzp7VDoxfSwyMDg4OntUOi0xfSwyMDg5OntUOjF9LDIwOTA6e1Q6LTF9LDIwOTE6e30sMjA5Mjp7fSwyMDkzOntUOjF9LDIwOTQ6e1Q6LTF9LDIwOTU6e30sMjA5Njp7VDoxfSwyMDk3OntUOi0xfSwyMDk4OntUOjF9LDIwOTk6e1Q6LTF9LDIxMDA6e1Q6MX0sMjEwMTp7VDotMX0sMjEwMjp7fSwyMTAzOntUOjF9LDIxMDQ6e1Q6LTF9LDIxMDU6e30sMjEwNjp7VDoxfSwyMTA3OntUOi0xfSwyMTA4Ont9LDIxMDk6e1Q6MX0sMjExMDp7VDotMX0sMjExMTp7VDoxfSwyMTEyOntUOi0xfSwyMTEzOntUOjF9LDIxMTQ6e1Q6LTF9LDIxMTU6e30sMjExNjp7fSwyMTE3Ont9LDIxMTg6e1Q6MX0sMjExOTp7VDotMX0sMjEyMDp7fSwyMTIxOntUOjF9LDIxMjI6e1Q6LTF9LDIxMjM6e1Q6MX0sMjEyNDp7VDotMX0sMjEyNTp7fSwyMTI2OntUOjF9LDIxMjc6e1Q6LTF9LDIxMjg6e30sMjEyOTp7VDoxfSwyMTMwOntUOi0xfSwyMTMxOntUOjF9LDIxMzI6e1Q6LTF9LDIxMzM6e1Q6MX0sMjEzNDp7fSwyMTM1Ont9LDIxMzY6e30sMjEzNzp7VDoxfSwyMTM4OntUOi0xfSwyMTM5OntUOjF9LDIxNDA6e1Q6LTF9LDIxNDE6e30sMzA3Mjp7fSwzMDczOnt9LDQwOTY6e1Q6MX0sNDA5Nzp7VDotMX0sNTAwMjp7VDoxfSw1MDAzOntUOi0xfSw1MDgxOntUOjF9LDUwODI6e1Q6LTF9LDUwODM6e30sNTA4NDp7VDoxfSw1MDg1OntUOi0xfSw1MDg2OntUOjF9LDUwODc6e1Q6LTF9LDUwODg6e30sNTA4OTp7fSw1MDkwOnt9LDUwOTI6e1Q6MX0sNTA5Mzp7VDotMX0sNTA5NDp7fSw1MDk1OntUOjF9LDUwOTY6e1Q6LTF9LDUwOTc6e30sNTA5OTp7fSw2NTUzNTp7bjoiIn19LGhfPXs2OntmOlhUfSwxMDp7ZjpteH0sMTI6e2Y6eXh9LDEzOntmOnl4fSwxNDp7ZjpieH0sMTU6e2Y6Ynh9LDE2OntmOmt2fSwxNzp7ZjpieH0sMTg6e2Y6Ynh9LDE5OntmOnl4fSwyMDp7ZjpIeH0sMjE6e2Y6SHh9LDIzOntmOkd4fSwyNDp7ZjpxeH0sMjU6e2Y6Ynh9LDI2Ont9LDI3Ont9LDI4OntmOmZ1bmN0aW9uKGUsdCxuKXtpZihuJiZuLmJpZmY8OCl7dmFyIHI9ZS5yZWFkX3NoaWZ0KDIpLGk9ZS5yZWFkX3NoaWZ0KDIpO2lmKDY1NTM1PT1yfHwtMT09cilyZXR1cm47dmFyIGE9ZS5yZWFkX3NoaWZ0KDIpO3JldHVyblt7cjpyLGM6aX0sZS5yZWFkX3NoaWZ0KE1hdGgubWluKGEsMjA0OCksImNwc3RyIildfXJldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5yZWFkX3NoaWZ0KDIpLGk9ZS5yZWFkX3NoaWZ0KDIpLGE9ZS5yZWFkX3NoaWZ0KDIpLG89ZS5yZWFkX3NoaWZ0KDIpO3JldHVyblt7cjpyLGM6aX0sRXgoZSwwLG4pLG8sYV19KGUsMCxuKX19LDI5Ont9LDM0OntmOmJ4fSwzNTp7ZjpWeH0sMzg6e2Y6a3Z9LDM5OntmOmt2fSw0MDp7Zjprdn0sNDE6e2Y6a3Z9LDQyOntmOmJ4fSw0Mzp7ZjpieH0sNDc6e2Y6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXtUeXBlOm4uYmlmZj49OD9lLnJlYWRfc2hpZnQoMik6MH07cmV0dXJuIHIuVHlwZT9rRChlLHQtMixyKTpBRChlLG4uYmlmZixuLHIpLHJ9fSw0OTp7ZjpmdW5jdGlvbihlLHQsbil7dmFyIHI9e2R5SGVpZ2h0OmUucmVhZF9zaGlmdCgyKSxmbDplLnJlYWRfc2hpZnQoMil9O3N3aXRjaChuJiZuLmJpZmZ8fDgpe2Nhc2UgMjpicmVhaztjYXNlIDM6Y2FzZSA0OmUubCs9MjticmVhaztkZWZhdWx0OmUubCs9MTB9cmV0dXJuIHIubmFtZT1EeChlLDAsbikscn19LDUxOntmOnl4fSw2MDp7fSw2MTp7ZjpmdW5jdGlvbihlKXtyZXR1cm57UG9zOltlLnJlYWRfc2hpZnQoMiksZS5yZWFkX3NoaWZ0KDIpXSxEaW06W2UucmVhZF9zaGlmdCgyKSxlLnJlYWRfc2hpZnQoMildLEZsYWdzOmUucmVhZF9zaGlmdCgyKSxDdXJUYWI6ZS5yZWFkX3NoaWZ0KDIpLEZpcnN0VGFiOmUucmVhZF9zaGlmdCgyKSxTZWxlY3RlZDplLnJlYWRfc2hpZnQoMiksVGFiUmF0aW86ZS5yZWFkX3NoaWZ0KDIpfX19LDY0OntmOmJ4fSw2NTp7ZjpmdW5jdGlvbigpe319LDY2OntmOnl4fSw3Nzp7fSw4MDp7fSw4MTp7fSw4Mjp7fSw4NTp7Zjp5eH0sODk6e30sOTA6e30sOTE6e30sOTI6e2Y6ZnVuY3Rpb24oZSx0LG4pe2lmKG4uZW5jKXJldHVybiBlLmwrPXQsIiI7dmFyIHI9ZS5sLGk9RXgoZSwwLG4pO3JldHVybiBlLnJlYWRfc2hpZnQodCtyLWUubCksaX19LDkzOntmOmZ1bmN0aW9uKGUsdCxuKXtpZihuJiZuLmJpZmY8OClyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe2UubCs9NDt2YXIgcj1lLnJlYWRfc2hpZnQoMiksaT1lLnJlYWRfc2hpZnQoMiksYT1lLnJlYWRfc2hpZnQoMik7ZS5sKz0yLGUubCs9MixlLmwrPTIsZS5sKz0yLGUubCs9MixlLmwrPTIsZS5sKz0yLGUubCs9MixlLmwrPTIsZS5sKz02LHQtPTM2O3ZhciBvPVtdO3JldHVybiBvLnB1c2goKFl4W3JdfHxYeSkoZSx0LG4pKSx7Y21vOltpLHIsYV0sZnQ6b319KGUsdCxuKTt2YXIgcj1QeChlKSxpPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUubCt0LHI9W107ZS5sPG47KXt2YXIgaT1lLnJlYWRfc2hpZnQoMik7ZS5sLT0yO3RyeXtyW2ldPVd4W2ldKGUsbi1lLmwpfWNhdGNoKHQpe3JldHVybiBlLmw9bixyfX1yZXR1cm4gZS5sIT1uJiYoZS5sPW4pLHJ9KGUsdC0yMixyWzFdKTtyZXR1cm57Y21vOnIsZnQ6aX19fSw5NDp7fSw5NTp7ZjpieH0sOTY6e30sOTc6e30sOTk6e2Y6Ynh9LDEyNTp7ZjpLeH0sMTI4OntmOmZ1bmN0aW9uKGUpe2UubCs9NDt2YXIgdD1bZS5yZWFkX3NoaWZ0KDIpLGUucmVhZF9zaGlmdCgyKV07aWYoMCE9PXRbMF0mJnRbMF0tLSwwIT09dFsxXSYmdFsxXS0tLHRbMF0+N3x8dFsxXT43KXRocm93IG5ldyBFcnJvcigiQmFkIEd1dHRlcnM6ICIrdC5qb2luKCJ8IikpO3JldHVybiB0fX0sMTI5OntmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uJiY4PT1uLmJpZmZ8fDI9PXQ/ZS5yZWFkX3NoaWZ0KDIpOihlLmwrPXQsMCk7cmV0dXJue2ZEaWFsb2c6MTYmcixmQmVsb3c6NjQmcixmUmlnaHQ6MTI4JnJ9fX0sMTMwOntmOnl4fSwxMzE6e2Y6Ynh9LDEzMjp7ZjpieH0sMTMzOntmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iIjtpZig0PT1uLmJpZmYpcmV0dXJuIDA9PT0ocj1EeChlLDAsbikpLmxlbmd0aCYmKHI9IlNoZWV0MSIpLHtuYW1lOnJ9O3ZhciBpPWUucmVhZF9zaGlmdCg0KSxhPTMmZS5yZWFkX3NoaWZ0KDEpLG89ZS5yZWFkX3NoaWZ0KDEpO3N3aXRjaChvKXtjYXNlIDA6bz0iV29ya3NoZWV0IjticmVhaztjYXNlIDE6bz0iTWFjcm9zaGVldCI7YnJlYWs7Y2FzZSAyOm89IkNoYXJ0c2hlZXQiO2JyZWFrO2Nhc2UgNjpvPSJWQkFNb2R1bGUifXJldHVybiAwPT09KHI9RHgoZSwwLG4pKS5sZW5ndGgmJihyPSJTaGVldDEiKSx7cG9zOmksaHM6YSxkdDpvLG5hbWU6cn19fSwxMzQ6e30sMTQwOntmOmZ1bmN0aW9uKGUpe3ZhciB0LG49WzAsMF07cmV0dXJuIHQ9ZS5yZWFkX3NoaWZ0KDIpLG5bMF09V3ZbdF18fHQsdD1lLnJlYWRfc2hpZnQoMiksblsxXT1Xdlt0XXx8dCxufX0sMTQxOntmOnl4fSwxNDQ6e30sMTQ2OntmOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLnJlYWRfc2hpZnQoMiksbj1bXTt0LS0gPjA7KW4ucHVzaChTeChlKSk7cmV0dXJuIG59fSwxNTE6e30sMTUyOnt9LDE1Mzp7fSwxNTQ6e30sMTU1Ont9LDE1Njp7Zjp5eH0sMTU3Ont9LDE1ODp7fSwxNjA6e2Y6Snh9LDE2MTp7ZjpmdW5jdGlvbihlLHQpe3ZhciBuPXt9O3JldHVybiB0PDMyfHwoZS5sKz0xNixuLmhlYWRlcj1rdihlKSxuLmZvb3Rlcj1rdihlKSxlLmwrPTIpLG59fSwxNzQ6e30sMTc1Ont9LDE3Njp7fSwxNzc6e30sMTc4Ont9LDE4MDp7fSwxODE6e30sMTgyOnt9LDE4NDp7fSwxODU6e30sMTg5OntmOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUubCt0LTIscj1lLnJlYWRfc2hpZnQoMiksaT1lLnJlYWRfc2hpZnQoMiksYT1bXTtlLmw8bjspYS5wdXNoKE94KGUpKTtpZihlLmwhPT1uKXRocm93IG5ldyBFcnJvcigiTXVsUksgcmVhZCBlcnJvciIpO3ZhciBvPWUucmVhZF9zaGlmdCgyKTtpZihhLmxlbmd0aCE9by1pKzEpdGhyb3cgbmV3IEVycm9yKCJNdWxSSyBsZW5ndGggbWlzbWF0Y2giKTtyZXR1cm57cjpyLGM6aSxDOm8scmtyZWM6YX19fSwxOTA6e2Y6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49ZS5sK3QtMixyPWUucmVhZF9zaGlmdCgyKSxpPWUucmVhZF9zaGlmdCgyKSxhPVtdO2UubDxuOylhLnB1c2goZS5yZWFkX3NoaWZ0KDIpKTtpZihlLmwhPT1uKXRocm93IG5ldyBFcnJvcigiTXVsQmxhbmsgcmVhZCBlcnJvciIpO3ZhciBvPWUucmVhZF9zaGlmdCgyKTtpZihhLmxlbmd0aCE9by1pKzEpdGhyb3cgbmV3IEVycm9yKCJNdWxCbGFuayBsZW5ndGggbWlzbWF0Y2giKTtyZXR1cm57cjpyLGM6aSxDOm8saXhmZTphfX19LDE5Mzp7ZjpteH0sMTk3Ont9LDE5ODp7fSwxOTk6e30sMjAwOnt9LDIwMTp7fSwyMDI6e2Y6Ynh9LDIwMzp7fSwyMDQ6e30sMjA1Ont9LDIwNjp7fSwyMDc6e30sMjA4Ont9LDIwOTp7fSwyMTA6e30sMjExOnt9LDIxMzp7fSwyMTU6e30sMjE2Ont9LDIxNzp7fSwyMTg6e2Y6eXh9LDIyMDp7fSwyMjE6e2Y6Ynh9LDIyMjp7fSwyMjQ6e2Y6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O3JldHVybiByLmlmbnQ9ZS5yZWFkX3NoaWZ0KDIpLHIubnVtRm10SWQ9ZS5yZWFkX3NoaWZ0KDIpLHIuZmxhZ3M9ZS5yZWFkX3NoaWZ0KDIpLHIuZlN0eWxlPXIuZmxhZ3M+PjImMSw2LHIuZGF0YT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT17fSxhPWUucmVhZF9zaGlmdCg0KSxvPWUucmVhZF9zaGlmdCg0KSxjPWUucmVhZF9zaGlmdCg0KSxzPWUucmVhZF9zaGlmdCgyKTtyZXR1cm4gaS5wYXR0ZXJuVHlwZT1MdltjPj4yNl0sci5jZWxsU3R5bGVzPyhpLmFsYz03JmEsaS5mV3JhcD1hPj4zJjEsaS5hbGNWPWE+PjQmNyxpLmZKdXN0TGFzdD1hPj43JjEsaS50cm90PWE+PjgmMjU1LGkuY0luZGVudD1hPj4xNiYxNSxpLmZTaHJpbmtUb0ZpdD1hPj4yMCYxLGkuaVJlYWRPcmRlcj1hPj4yMiYyLGkuZkF0ck51bT1hPj4yNiYxLGkuZkF0ckZudD1hPj4yNyYxLGkuZkF0ckFsYz1hPj4yOCYxLGkuZkF0ckJkcj1hPj4yOSYxLGkuZkF0clBhdD1hPj4zMCYxLGkuZkF0clByb3Q9YT4+MzEmMSxpLmRnTGVmdD0xNSZvLGkuZGdSaWdodD1vPj40JjE1LGkuZGdUb3A9bz4+OCYxNSxpLmRnQm90dG9tPW8+PjEyJjE1LGkuaWN2TGVmdD1vPj4xNiYxMjcsaS5pY3ZSaWdodD1vPj4yMyYxMjcsaS5ncmJpdERpYWc9bz4+MzAmMyxpLmljdlRvcD0xMjcmYyxpLmljdkJvdHRvbT1jPj43JjEyNyxpLmljdkRpYWc9Yz4+MTQmMTI3LGkuZGdEaWFnPWM+PjIxJjE1LGkuaWN2Rm9yZT0xMjcmcyxpLmljdkJhY2s9cz4+NyYxMjcsaS5mc3hCdXR0b249cz4+MTQmMSxpKTppfShlLDAsci5mU3R5bGUsbikscn19LDIyNTp7ZjpmdW5jdGlvbihlLHQpe3JldHVybiAwPT09dHx8ZS5yZWFkX3NoaWZ0KDIpLDEyMDB9fSwyMjY6e2Y6bXh9LDIyNzp7fSwyMjk6e2Y6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W10scj1lLnJlYWRfc2hpZnQoMik7ci0tOyluLnB1c2goSXgoZSkpO3JldHVybiBufX0sMjMzOnt9LDIzNTp7fSwyMzY6e30sMjM3Ont9LDIzOTp7fSwyNDA6e30sMjQxOnt9LDI0Mjp7fSwyNDQ6e30sMjQ1Ont9LDI0Njp7fSwyNDc6e30sMjQ4Ont9LDI0OTp7fSwyNTE6e30sMjUyOntmOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUubCt0LHI9ZS5yZWFkX3NoaWZ0KDQpLGk9ZS5yZWFkX3NoaWZ0KDQpLGE9W10sbz0wO28hPWkmJmUubDxuOysrbylhLnB1c2goVHgoZSkpO3JldHVybiBhLkNvdW50PXIsYS5VbmlxdWU9aSxhfX0sMjUzOntmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1DeChlLHQsbik7cmV0dXJuIHIuaXNzdD1lLnJlYWRfc2hpZnQoNCkscn19LDI1NTp7ZjpmdW5jdGlvbihlLHQpe3ZhciBuPXt9O3JldHVybiBuLmRzc3Q9ZS5yZWFkX3NoaWZ0KDIpLGUubCs9dC0yLG59fSwyNTY6e30sMjU5Ont9LDI5MDp7fSwzMTE6e30sMzEyOnt9LDMxNTp7fSwzMTc6e2Y6dnh9LDMxODp7fSwzMTk6e30sMzIwOnt9LDMzMDp7fSwzMzE6e30sMzMzOnt9LDMzNDp7fSwzMzU6e30sMzM2Ont9LDMzNzp7fSwzMzg6e30sMzM5Ont9LDM0MDp7fSwzNTE6e30sMzUyOntmOmJ4fSwzNTM6e2Y6bXh9LDQwMTp7fSw0MDI6e30sNDAzOnt9LDQwNDp7fSw0MDU6e30sNDA2Ont9LDQwNzp7fSw0MDg6e30sNDI1Ont9LDQyNjp7fSw0Mjc6e30sNDI4Ont9LDQyOTp7fSw0MzA6e2Y6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUubCt0LGk9ZS5yZWFkX3NoaWZ0KDIpLGE9ZS5yZWFkX3NoaWZ0KDIpO2lmKG4uc2JjY2g9YSwxMDI1PT1hfHwxNDg0OT09YSlyZXR1cm5bYSxpXTtpZihhPDF8fGE+MjU1KXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBTdXBCb29rIHR5cGU6ICIrYSk7Zm9yKHZhciBvPXd4KGUsYSksYz1bXTtyPmUubDspYy5wdXNoKF94KGUpKTtyZXR1cm5bYSxpLG8sY119fSw0MzE6e2Y6Ynh9LDQzMjp7fSw0MzM6e30sNDM0Ont9LDQzNzp7fSw0Mzg6e2Y6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUubCxpPSIiO3RyeXtlLmwrPTQ7dmFyIGE9KG4ubGFzdG9ianx8e2NtbzpbMCwwXX0pLmNtb1sxXTstMT09WzAsNSw3LDExLDEyLDE0XS5pbmRleE9mKGEpP2UubCs9NjpmdW5jdGlvbihlKXt2YXIgdD1lLnJlYWRfc2hpZnQoMSk7ZS5sKys7dmFyIG49ZS5yZWFkX3NoaWZ0KDIpO3JldHVybiBlLmwrPTIsW3Qsbl19KGUpO3ZhciBvPWUucmVhZF9zaGlmdCgyKTtlLnJlYWRfc2hpZnQoMikseXgoZSk7dmFyIGM9ZS5yZWFkX3NoaWZ0KDIpO2UubCs9Yztmb3IodmFyIHM9MTtzPGUubGVucy5sZW5ndGgtMTsrK3Mpe2lmKGUubC1yIT1lLmxlbnNbc10pdGhyb3cgbmV3IEVycm9yKCJUeE86IGJhZCBjb250aW51ZSByZWNvcmQiKTt2YXIgbD1lW2UubF07aWYoKGkrPXd4KGUsZS5sZW5zW3MrMV0tZS5sZW5zW3NdLTEpKS5sZW5ndGg+PShsP286MipvKSlicmVha31pZihpLmxlbmd0aCE9PW8mJmkubGVuZ3RoIT09MipvKXRocm93IG5ldyBFcnJvcigiY2NoVGV4dDogIitvKyIgIT0gIitpLmxlbmd0aCk7cmV0dXJuIGUubD1yK3Qse3Q6aX19Y2F0Y2gobil7cmV0dXJuIGUubD1yK3Qse3Q6aX19fX0sNDM5OntmOmJ4fSw0NDA6e2Y6ZnVuY3Rpb24oZSx0KXt2YXIgbj1JeChlKTtlLmwrPTE2O3ZhciByPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5sK3Qscj1lLnJlYWRfc2hpZnQoNCk7aWYoMiE9PXIpdGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgc3RyZWFtVmVyc2lvbjogIityKTt2YXIgaT1lLnJlYWRfc2hpZnQoMik7ZS5sKz0yO3ZhciBhLG8sYyxzLGwsdSxmPSIiOzE2JmkmJihhPUF4KGUsZS5sKSksMTI4JmkmJihvPUF4KGUsZS5sKSksMjU3PT0oMjU3JmkpJiYoYz1BeChlLGUubCkpLDE9PSgyNTcmaSkmJihzPVV4KGUsZS5sKSksOCZpJiYoZj1BeChlLGUubCkpLDMyJmkmJihsPWUucmVhZF9zaGlmdCgxNikpLDY0JmkmJih1PWF4KGUpKSxlLmw9bjt2YXIgZD1vfHxjfHxzfHwiIjtkJiZmJiYoZCs9IiMiK2YpLGR8fChkPSIjIitmKSwyJmkmJiIvIj09ZC5jaGFyQXQoMCkmJiIvIiE9ZC5jaGFyQXQoMSkmJihkPSJmaWxlOi8vIitkKTt2YXIgaD17VGFyZ2V0OmR9O3JldHVybiBsJiYoaC5ndWlkPWwpLHUmJihoLnRpbWU9dSksYSYmKGguVG9vbHRpcD1hKSxofShlLHQtMjQpO3JldHVybltuLHJdfX0sNDQxOnt9LDQ0Mjp7ZjpfeH0sNDQzOnt9LDQ0NDp7Zjp5eH0sNDQ1Ont9LDQ0Njp7fSw0NDg6e2Y6bXh9LDQ0OTp7ZjpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWFkX3NoaWZ0KDIpLGUucmVhZF9zaGlmdCg0KX0scjoyfSw0NTA6e2Y6bXh9LDUxMjp7Zjp6eH0sNTEzOntmOlp4fSw1MTU6e2Y6ZnVuY3Rpb24oZSx0LG4pe24uYmlmZmd1ZXNzJiYyPT1uLmJpZmYmJihuLmJpZmY9NSk7dmFyIHI9Q3goZSw2LG4pLGk9a3YoZSk7cmV0dXJuIHIudmFsPWkscn19LDUxNjp7ZjpmdW5jdGlvbihlLHQsbil7bi5iaWZmZ3Vlc3MmJjI9PW4uYmlmZiYmKG4uYmlmZj01KSxlLmw7dmFyIHI9Q3goZSx0LG4pLGk9X3goZSxlLmwsbik7cmV0dXJuIHIudmFsPWkscn19LDUxNzp7ZjpmdW5jdGlvbihlLHQsbil7dmFyIHI9Q3goZSw2LG4pLGk9eHgoZSk7cmV0dXJuIHIudmFsPWksci50PSEwPT09aXx8ITE9PT1pPyJiIjoiZSIscn19LDUxOTp7ZjpReH0sNTIwOntmOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O3Qucj1lLnJlYWRfc2hpZnQoMiksdC5jPWUucmVhZF9zaGlmdCgyKSx0LmNudD1lLnJlYWRfc2hpZnQoMiktdC5jO3ZhciBuPWUucmVhZF9zaGlmdCgyKTtlLmwrPTQ7dmFyIHI9ZS5yZWFkX3NoaWZ0KDEpO3JldHVybiBlLmwrPTMsNyZyJiYodC5sZXZlbD03JnIpLDMyJnImJih0LmhpZGRlbj0hMCksNjQmciYmKHQuaHB0PW4vMjApLHR9fSw1MjM6e30sNTQ1OntmOiR4fSw1NDk6e2Y6TXh9LDU2Njp7fSw1NzQ6e2Y6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuJiZuLmJpZmY+PTImJm4uYmlmZjw1P3t9OntSVEw6NjQmZS5yZWFkX3NoaWZ0KDIpfX19LDYzODp7ZjpmdW5jdGlvbihlKXt2YXIgdD1lLnJlYWRfc2hpZnQoMiksbj1lLnJlYWRfc2hpZnQoMikscj1PeChlKTtyZXR1cm57cjp0LGM6bixpeGZlOnJbMF0scmtudW06clsxXX19fSw2NTk6e30sMTA0ODp7fSwxMDU0OntmOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bZS5yZWFkX3NoaWZ0KDIpLEV4KGUsMCxuKV19fSwxMDg0Ont9LDEyMTI6e2Y6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVJ4KGUpO2UubCsrO3ZhciBpPWUucmVhZF9zaGlmdCgxKTtyZXR1cm5bR1QoZSx0LT04LG4pLGkscl19fSwyMDQ4OntmOmZ1bmN0aW9uKGUsdCl7ZS5yZWFkX3NoaWZ0KDIpO3ZhciBuPUl4KGUpLHI9ZS5yZWFkX3NoaWZ0KCh0LTEwKS8yLCJkYmNzLWNvbnQiKTtyZXR1cm5bbixyPXIucmVwbGFjZShpbSwiIildfX0sMjA0OTp7fSwyMDUwOnt9LDIwNTE6e30sMjA1Mjp7fSwyMDUzOnt9LDIwNTQ6e30sMjA1NTp7fSwyMDU2Ont9LDIwNTc6e2Y6THh9LDIwNTg6e30sMjA1OTp7fSwyMDYwOnt9LDIwNjE6e30sMjA2Mjp7fSwyMDYzOnt9LDIwNjQ6e30sMjA2Njp7fSwyMDY3Ont9LDIxMjg6e30sMjEyOTp7fSwyMTMwOnt9LDIxMzE6e30sMjEzMjp7fSwyMTMzOnt9LDIxMzQ6e30sMjEzNTp7fSwyMTM2Ont9LDIxMzc6e30sMjEzODp7fSwyMTQ2Ont9LDIxNDc6e3I6MTJ9LDIxNDg6e30sMjE0OTp7fSwyMTUwOnt9LDIxNTE6e2Y6bXh9LDIxNTI6e30sMjE1NDp7fSwyMTU1Ont9LDIxNTY6e30sMjE2MTp7fSwyMTYyOnt9LDIxNjQ6e30sMjE2NTp7fSwyMTY2Ont9LDIxNjc6e30sMjE2ODp7fSwyMTY5Ont9LDIxNzA6e30sMjE3MTp7fSwyMTcyOntmOmZ1bmN0aW9uKGUpe2UubCs9Mjt2YXIgdD17Y3hmczowLGNyYzowfTtyZXR1cm4gdC5jeGZzPWUucmVhZF9zaGlmdCgyKSx0LmNyYz1lLnJlYWRfc2hpZnQoNCksdH0scjoxMn0sMjE3Mzp7ZjpmdW5jdGlvbihlLHQpe2UubCxlLmwrPTI7dmFyIG49ZS5yZWFkX3NoaWZ0KDIpO2UubCs9Mjtmb3IodmFyIHI9ZS5yZWFkX3NoaWZ0KDIpLGk9W107ci0tID4wOylpLnB1c2goc1QoZSxlLmwpKTtyZXR1cm57aXhmZTpuLGV4dDppfX0scjoxMn0sMjE3NDp7fSwyMTc1Ont9LDIxODA6e30sMjE4MTp7fSwyMTgyOnt9LDIxODM6e30sMjE4NDp7fSwyMTg1Ont9LDIxODY6e30sMjE4Nzp7fSwyMTg4OntmOmJ4LHI6MTJ9LDIxODk6e30sMjE5MDp7cjoxMn0sMjE5MTp7fSwyMTkyOnt9LDIxOTQ6e30sMjE5NTp7fSwyMTk2OntmOmZ1bmN0aW9uKGUsdCxuKXtpZighKG4uYmlmZjw4KSl7dmFyIHI9ZS5yZWFkX3NoaWZ0KDIpLGk9ZS5yZWFkX3NoaWZ0KDIpO3JldHVyblt3eChlLHIsbiksd3goZSxpLG4pXX1lLmwrPXR9LHI6MTJ9LDIxOTc6e30sMjE5ODp7ZjpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5sK3Q7aWYoMTI0MjI2IT09ZS5yZWFkX3NoaWZ0KDQpKWlmKG4uY2VsbFN0eWxlcyl7dmFyIGksYT1lLnNsaWNlKGUubCk7ZS5sPXI7dHJ5e2k9RmIoYSx7dHlwZToiYXJyYXkifSl9Y2F0Y2goZSl7cmV0dXJufXZhciBvPUFiKGksInRoZW1lL3RoZW1lL3RoZW1lMS54bWwiLCEwKTtpZihvKXJldHVybiBvVChvLG4pfWVsc2UgZS5sPXJ9LHI6MTJ9LDIxOTk6e30sMjIwMDp7fSwyMjAxOnt9LDIyMDI6e2Y6ZnVuY3Rpb24oZSl7cmV0dXJuWzAhPT1lLnJlYWRfc2hpZnQoNCksMCE9PWUucmVhZF9zaGlmdCg0KSxlLnJlYWRfc2hpZnQoNCldfSxyOjEyfSwyMjAzOntmOm14fSwyMjA0Ont9LDIyMDU6e30sMjIwNjp7fSwyMjA3Ont9LDIyMTE6e2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZWFkX3NoaWZ0KDIpLG49ZS5yZWFkX3NoaWZ0KDIpO3JldHVybiBlLmwrPTgse3R5cGU6dCxmbGFnczpufX0oZSk7aWYoMjIxMSE9dC50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBGdXR1cmUgUmVjb3JkICIrdC50eXBlKTtyZXR1cm4gMCE9PWUucmVhZF9zaGlmdCg0KX19LDIyMTI6e30sMjIxMzp7fSwyMjE0Ont9LDIyMTU6e30sNDA5Nzp7fSw0MDk4Ont9LDQwOTk6e30sNDEwMjp7fSw0MTAzOnt9LDQxMDU6e30sNDEwNjp7fSw0MTA3Ont9LDQxMDg6e30sNDEwOTp7fSw0MTE2Ont9LDQxMTc6e30sNDExODp7fSw0MTE5Ont9LDQxMjA6e30sNDEyMTp7fSw0MTIyOnt9LDQxMjM6e30sNDEyNDp7fSw0MTI1Ont9LDQxMjY6e30sNDEyNzp7fSw0MTI4Ont9LDQxMjk6e30sNDEzMDp7fSw0MTMyOnt9LDQxMzM6e30sNDEzNDp7Zjp5eH0sNDEzNTp7fSw0MTQ2Ont9LDQxNDc6e30sNDE0ODp7fSw0MTQ5Ont9LDQxNTQ6e30sNDE1Njp7fSw0MTU3Ont9LDQxNTg6e30sNDE1OTp7fSw0MTYwOnt9LDQxNjE6e30sNDE2Mzp7fSw0MTY0OntmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17YXJlYTohMX07aWYoNSE9bi5iaWZmKXJldHVybiBlLmwrPXQscjt2YXIgaT1lLnJlYWRfc2hpZnQoMSk7cmV0dXJuIGUubCs9MywxNiZpJiYoci5hcmVhPSEwKSxyfX0sNDE2NTp7fSw0MTY2Ont9LDQxNjg6e30sNDE3MDp7fSw0MTcxOnt9LDQxNzQ6e30sNDE3NTp7fSw0MTc2Ont9LDQxNzc6e30sNDE4Nzp7fSw0MTg4OntmOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLnJlYWRfc2hpZnQoMiksbj1bXTt0LS0gPjA7KW4ucHVzaChTeChlKSk7cmV0dXJuIG59fSw0MTg5Ont9LDQxOTE6e30sNDE5Mjp7fSw0MTkzOnt9LDQxOTQ6e30sNDE5NTp7fSw0MTk2Ont9LDQxOTc6e30sNDE5ODp7fSw0MTk5Ont9LDQyMDA6e30sMDp7Zjp6eH0sMTp7fSwyOntmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1DeChlLDcsbiksaT1lLnJlYWRfc2hpZnQoMik7cmV0dXJuIHIudD0ibiIsci52YWw9aSxyfX0sMzp7ZjpmdW5jdGlvbihlLHQsbil7dmFyIHI9Q3goZSw3LG4pLGk9a3YoZSk7cmV0dXJuIHIudD0ibiIsci52YWw9aSxyfX0sNDp7ZjpmdW5jdGlvbihlLHQsbil7bi5iaWZmZ3Vlc3MmJjU9PW4uYmlmZiYmKG4uYmlmZj0yKTt2YXIgcj1DeChlLDcsbiksaT1FeChlLDAsbik7cmV0dXJuIHIudD0ic3RyIixyLnZhbD1pLHJ9fSw1OntmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmwrNyxpPUN4KGUsNixuKTtlLmw9cjt2YXIgYT14eChlKTtyZXR1cm4gaS52YWw9YSxpLnQ9ITA9PT1hfHwhMT09PWE/ImIiOiJlIixpfX0sNzp7ZjpmdW5jdGlvbihlKXt2YXIgdD1lLnJlYWRfc2hpZnQoMSk7cmV0dXJuIDA9PT10PyhlLmwrKywiIik6ZS5yZWFkX3NoaWZ0KHQsInNiY3MtY29udCIpfX0sODp7fSw5OntmOkx4fSwxMTp7fSwyMjp7Zjp5eH0sMzA6e2Y6anh9LDMxOnt9LDMyOnt9LDMzOntmOiR4fSwzNjp7fSwzNzp7ZjpNeH0sNTA6e2Y6ZnVuY3Rpb24oZSx0KXtlLmwrPTYsZS5sKz0yLGUubCs9MSxlLmwrPTMsZS5sKz0xLGUubCs9dC0xM319LDYyOnt9LDUyOnt9LDY3OntmOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiB0LmlmbnQ9ZS5yZWFkX3NoaWZ0KDEpLGUubCsrLHQuZmxhZ3M9ZS5yZWFkX3NoaWZ0KDEpLHQubnVtRm10SWQ9NjMmdC5mbGFncyx0LmZsYWdzPj49Nix0LmZTdHlsZT0wLHQuZGF0YT17fSx0fX0sNjg6e2Y6eXh9LDY5Ont9LDg2Ont9LDEyNjp7fSwxMjc6e2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZWFkX3NoaWZ0KDIpLG49ZS5yZWFkX3NoaWZ0KDIpLHI9ZS5yZWFkX3NoaWZ0KDQpLGk9e2ZtdDp0LGVudjpuLGxlbjpyLGRhdGE6ZS5zbGljZShlLmwsZS5sK3IpfTtyZXR1cm4gZS5sKz1yLGl9fSwxMzU6e30sMTM2Ont9LDEzNzp7fSwxNDM6e2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZWFkX3NoaWZ0KDQpLG49ZS5yZWFkX3NoaWZ0KDEpLHI9ZS5yZWFkX3NoaWZ0KG4sInNiY3MiKTtyZXR1cm4gMD09PXIubGVuZ3RoJiYocj0iU2hlZXQxIikse2ZsYWdzOnQsbmFtZTpyfX19LDE0NTp7fSwxNDg6e30sMTQ5Ont9LDE1MDp7fSwxNjk6e30sMTcxOnt9LDE4ODp7fSwxOTE6e30sMTkyOnt9LDE5NDp7fSwxOTU6e30sMjE0OntmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmwrdCxpPUN4KGUsNixuKSxhPWUucmVhZF9zaGlmdCgyKSxvPXd4KGUsYSxuKTtyZXR1cm4gZS5sPXIsaS50PSJzdHIiLGkudmFsPW8saX19LDIyMzp7fSwyMzQ6e30sMzU0Ont9LDQyMTp7fSw1MTg6e2Y6WFR9LDUyMTp7ZjpMeH0sNTM2OntmOnF4fSw1NDc6e2Y6Vnh9LDU2MTp7fSw1Nzk6e2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIHQuaWZudD1lLnJlYWRfc2hpZnQoMSksdC5udW1GbXRJZD1lLnJlYWRfc2hpZnQoMSksdC5mbGFncz1lLnJlYWRfc2hpZnQoMiksdC5mU3R5bGU9dC5mbGFncz4+MiYxLHQuZGF0YT17fSx0fX0sMTAzMDp7ZjpYVH0sMTAzMzp7ZjpMeH0sMTA5MTp7ZjpmdW5jdGlvbihlKXt2YXIgdD17fTtyZXR1cm4gdC5pZm50PWUucmVhZF9zaGlmdCgxKSx0Lm51bUZtdElkPWUucmVhZF9zaGlmdCgxKSx0LmZsYWdzPWUucmVhZF9zaGlmdCgyKSx0LmZTdHlsZT10LmZsYWdzPj4yJjEsdC5kYXRhPXt9LHR9fSwyMTU3Ont9LDIxNjM6e30sMjE3Nzp7fSwyMjQwOnt9LDIyNDE6e30sMjI0Mjp7fSwyMjQzOnt9LDIyNDQ6e30sMjI0NTp7fSwyMjQ2Ont9LDIyNDc6e30sMjI0ODp7fSwyMjQ5Ont9LDIyNTA6e30sMjI1MTp7fSwyMjYyOntyOjEyfSwxMDE6e30sMTAyOnt9LDEwNTp7fSwxMDY6e30sMTA3Ont9LDEwOTp7fSwxMTI6e30sMTE0Ont9LDI5MjgyOnt9fTtmdW5jdGlvbiBwXyhlLHQsbixyKXt2YXIgaT10O2lmKCFpc05hTihpKSl7dmFyIGE9cnx8KG58fFtdKS5sZW5ndGh8fDAsbz1lLm5leHQoNCk7by53cml0ZV9zaGlmdCgyLGkpLG8ud3JpdGVfc2hpZnQoMixhKSxhPjAmJkl5KG4pJiZlLnB1c2gobil9fWZ1bmN0aW9uIGdfKGUsdCl7dmFyIG49dHx8e30scj1udWxsIT1uLmRlbnNlP24uZGVuc2U6cWcsaT17fTtyJiYoaVsiIWRhdGEiXT1bXSk7dmFyIGE9KGU9ZS5yZXBsYWNlKC88IS0tLio/LS0+L2csIiIpKS5tYXRjaCgvPHRhYmxlL2kpO2lmKCFhKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBIVE1MOiBjb3VsZCBub3QgZmluZCA8dGFibGU+Iik7dmFyIG89ZS5tYXRjaCgvPFwvdGFibGUvaSksYz1hLmluZGV4LHM9byYmby5pbmRleHx8ZS5sZW5ndGgsbD12YihlLnNsaWNlKGMscyksLyg6Pzx0cltePl0qPikvaSwiPHRyPiIpLHU9LTEsZj0wLGQ9MCxoPTAscD17czp7cjoxZTcsYzoxZTd9LGU6e3I6MCxjOjB9fSxnPVtdO2ZvcihjPTA7YzxsLmxlbmd0aDsrK2Mpe3ZhciBtPWxbY10udHJpbSgpLGI9bS5zbGljZSgwLDMpLnRvTG93ZXJDYXNlKCk7aWYoIjx0ciIhPWIpe2lmKCI8dGQiPT1ifHwiPHRoIj09Yil7dmFyIHk9bS5zcGxpdCgvPFwvdFtkaF0+L2kpO2ZvcihzPTA7czx5Lmxlbmd0aDsrK3Mpe3ZhciB2PXlbc10udHJpbSgpO2lmKHYubWF0Y2goLzx0W2RoXS9pKSl7Zm9yKHZhciB4PXYsRD0wOyI8Ij09eC5jaGFyQXQoMCkmJihEPXguaW5kZXhPZigiPiIpKT4tMTspeD14LnNsaWNlKEQrMSk7Zm9yKHZhciBUPTA7VDxnLmxlbmd0aDsrK1Qpe3ZhciB3PWdbVF07dy5zLmM9PWYmJncucy5yPHUmJnU8PXcuZS5yJiYoZj13LmUuYysxLFQ9LTEpfXZhciBfPUxiKHYuc2xpY2UoMCx2LmluZGV4T2YoIj4iKSkpO2g9Xy5jb2xzcGFuPytfLmNvbHNwYW46MSwoKGQ9K18ucm93c3Bhbik+MXx8aD4xKSYmZy5wdXNoKHtzOntyOnUsYzpmfSxlOntyOnUrKGR8fDEpLTEsYzpmK2gtMX19KTt2YXIgRT1fLnR8fF9bImRhdGEtdCJdfHwiIjtpZih4Lmxlbmd0aClpZih4PW55KHgpLHAucy5yPnUmJihwLnMucj11KSxwLmUucjx1JiYocC5lLnI9dSkscC5zLmM+ZiYmKHAucy5jPWYpLHAuZS5jPGYmJihwLmUuYz1mKSx4Lmxlbmd0aCl7dmFyIFU9e3Q6InMiLHY6eH07bi5yYXd8fCF4LnRyaW0oKS5sZW5ndGh8fCJzIj09RXx8KCJUUlVFIj09PXg/VT17dDoiYiIsdjohMH06IkZBTFNFIj09PXg/VT17dDoiYiIsdjohMX06aXNOYU4oZGIoeCkpP2lzTmFOKHliKHgpLmdldERhdGUoKSl8fChVPXt0OiJkIix2OnNiKHgpfSwhMT09PW4uVVRDJiYoVS52PXhiKFUudikpLG4uY2VsbERhdGVzfHwoVT17dDoibiIsdjpuYihVLnYpfSksVS56PW4uZGF0ZU5GfHxnbVsxNF0pOlU9e3Q6Im4iLHY6ZGIoeCl9KSwhMSE9PVUuY2VsbFRleHQmJihVLnc9eCkscj8oaVsiIWRhdGEiXVt1XXx8KGlbIiFkYXRhIl1bdV09W10pLGlbIiFkYXRhIl1bdV1bZl09VSk6aVtvdih7cjp1LGM6Zn0pXT1VLGYrPWh9ZWxzZSBmKz1oO2Vsc2UgZis9aH19fX1lbHNle2lmKCsrdSxuLnNoZWV0Um93cyYmbi5zaGVldFJvd3M8PXUpey0tdTticmVha31mPTB9fXJldHVybiBpWyIhcmVmIl09c3YocCksZy5sZW5ndGgmJihpWyIhbWVyZ2VzIl09ZyksaX1mdW5jdGlvbiBtXyhlLHQsbixyKXtmb3IodmFyIGk9ZVsiIW1lcmdlcyJdfHxbXSxhPVtdLG89e30sYz1udWxsIT1lWyIhZGF0YSJdLHM9dC5zLmM7czw9dC5lLmM7KytzKXtmb3IodmFyIGw9MCx1PTAsZj0wO2Y8aS5sZW5ndGg7KytmKWlmKCEoaVtmXS5zLnI+bnx8aVtmXS5zLmM+c3x8aVtmXS5lLnI8bnx8aVtmXS5lLmM8cykpe2lmKGlbZl0ucy5yPG58fGlbZl0ucy5jPHMpe2w9LTE7YnJlYWt9bD1pW2ZdLmUuci1pW2ZdLnMucisxLHU9aVtmXS5lLmMtaVtmXS5zLmMrMTticmVha31pZighKGw8MCkpe3ZhciBkPWl2KHMpK252KG4pLGg9Yz8oZVsiIWRhdGEiXVtuXXx8W10pW3NdOmVbZF0scD1oJiZudWxsIT1oLnYmJihoLmh8fEdiKGgud3x8KGZ2KGgpLGgudyl8fCIiKSl8fCIiO289e30sbD4xJiYoby5yb3dzcGFuPWwpLHU+MSYmKG8uY29sc3Bhbj11KSxyLmVkaXRhYmxlP3A9JzxzcGFuIGNvbnRlbnRlZGl0YWJsZT0idHJ1ZSI+JytwKyI8L3NwYW4+IjpoJiYob1siZGF0YS10Il09aCYmaC50fHwieiIsbnVsbCE9aC52JiYob1siZGF0YS12Il09aC52IGluc3RhbmNlb2YgRGF0ZT9oLnYudG9JU09TdHJpbmcoKTpoLnYpLG51bGwhPWgueiYmKG9bImRhdGEteiJdPWgueiksaC5sJiYiIyIhPShoLmwuVGFyZ2V0fHwiIyIpLmNoYXJBdCgwKSYmKHA9JzxhIGhyZWY9IicrR2IoaC5sLlRhcmdldCkrJyI+JytwKyI8L2E+IikpLG8uaWQ9KHIuaWR8fCJzanMiKSsiLSIrZCxhLnB1c2goc3koInRkIixwLG8pKX19cmV0dXJuIjx0cj4iK2Euam9pbigiIikrIjwvdHI+In1mdW5jdGlvbiBiXyhlLHQsbil7dmFyIHI9dC5yb3dzO2lmKCFyKXRocm93IlVuc3VwcG9ydGVkIG9yaWdpbiB3aGVuICIrdC50YWdOYW1lKyIgaXMgbm90IGEgVEFCTEUiO3ZhciBpPW58fHt9LGE9bnVsbCE9ZVsiIWRhdGEiXSxvPTAsYz0wO2lmKG51bGwhPWkub3JpZ2luKWlmKCJudW1iZXIiPT10eXBlb2YgaS5vcmlnaW4pbz1pLm9yaWdpbjtlbHNle3ZhciBzPSJzdHJpbmciPT10eXBlb2YgaS5vcmlnaW4/YXYoaS5vcmlnaW4pOmkub3JpZ2luO289cy5yLGM9cy5jfXZhciBsPU1hdGgubWluKGkuc2hlZXRSb3dzfHwxZTcsci5sZW5ndGgpLHU9e3M6e3I6MCxjOjB9LGU6e3I6byxjOmN9fTtpZihlWyIhcmVmIl0pe3ZhciBmPWN2KGVbIiFyZWYiXSk7dS5zLnI9TWF0aC5taW4odS5zLnIsZi5zLnIpLHUucy5jPU1hdGgubWluKHUucy5jLGYucy5jKSx1LmUucj1NYXRoLm1heCh1LmUucixmLmUuciksdS5lLmM9TWF0aC5tYXgodS5lLmMsZi5lLmMpLC0xPT1vJiYodS5lLnI9bz1mLmUucisxKX12YXIgZD1bXSxoPTAscD1lWyIhcm93cyJdfHwoZVsiIXJvd3MiXT1bXSksZz0wLG09MCxiPTAseT0wLHY9MCx4PTA7Zm9yKGVbIiFjb2xzIl18fChlWyIhY29scyJdPVtdKTtnPHIubGVuZ3RoJiZtPGw7KytnKXt2YXIgRD1yW2ddO2lmKHZfKEQpKXtpZihpLmRpc3BsYXkpY29udGludWU7cFttXT17aGlkZGVuOiEwfX12YXIgVD1ELmNlbGxzO2ZvcihiPXk9MDtiPFQubGVuZ3RoOysrYil7dmFyIHc9VFtiXTtpZighaS5kaXNwbGF5fHwhdl8odykpe3ZhciBfPXcuaGFzQXR0cmlidXRlKCJkYXRhLXYiKT93LmdldEF0dHJpYnV0ZSgiZGF0YS12Iik6dy5oYXNBdHRyaWJ1dGUoInYiKT93LmdldEF0dHJpYnV0ZSgidiIpOm55KHcuaW5uZXJIVE1MKSxFPXcuZ2V0QXR0cmlidXRlKCJkYXRhLXoiKXx8dy5nZXRBdHRyaWJ1dGUoInoiKTtmb3IoaD0wO2g8ZC5sZW5ndGg7KytoKXt2YXIgVT1kW2hdO1Uucy5jPT15K2MmJlUucy5yPG0rbyYmbStvPD1VLmUuciYmKHk9VS5lLmMrMS1jLGg9LTEpfXg9K3cuZ2V0QXR0cmlidXRlKCJjb2xzcGFuIil8fDEsKCh2PSt3LmdldEF0dHJpYnV0ZSgicm93c3BhbiIpfHwxKT4xfHx4PjEpJiZkLnB1c2goe3M6e3I6bStvLGM6eStjfSxlOntyOm0rbysodnx8MSktMSxjOnkrYysoeHx8MSktMX19KTt2YXIgQT17dDoicyIsdjpffSxrPXcuZ2V0QXR0cmlidXRlKCJkYXRhLXQiKXx8dy5nZXRBdHRyaWJ1dGUoInQiKXx8IiI7bnVsbCE9XyYmKDA9PV8ubGVuZ3RoP0EudD1rfHwieiI6aS5yYXd8fDA9PV8udHJpbSgpLmxlbmd0aHx8InMiPT1rfHwoIlRSVUUiPT09Xz9BPXt0OiJiIix2OiEwfToiRkFMU0UiPT09Xz9BPXt0OiJiIix2OiExfTppc05hTihkYihfKSk/aXNOYU4oeWIoXykuZ2V0RGF0ZSgpKXx8KEE9e3Q6ImQiLHY6c2IoXyl9LGkuVVRDJiYoQS52PURiKEEudikpLGkuY2VsbERhdGVzfHwoQT17dDoibiIsdjpuYihBLnYpfSksQS56PWkuZGF0ZU5GfHxnbVsxNF0pOkE9e3Q6Im4iLHY6ZGIoXyl9KSksdm9pZCAwPT09QS56JiZudWxsIT1FJiYoQS56PUUpO3ZhciBTPSIiLEM9dy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQSIpO2lmKEMmJkMubGVuZ3RoKWZvcih2YXIgRj0wO0Y8Qy5sZW5ndGgmJighQ1tGXS5oYXNBdHRyaWJ1dGUoImhyZWYiKXx8IiMiPT0oUz1DW0ZdLmdldEF0dHJpYnV0ZSgiaHJlZiIpKS5jaGFyQXQoMCkpOysrRik7UyYmIiMiIT1TLmNoYXJBdCgwKSYmImphdmFzY3JpcHQ6IiE9Uy5zbGljZSgwLDExKS50b0xvd2VyQ2FzZSgpJiYoQS5sPXtUYXJnZXQ6U30pLGE/KGVbIiFkYXRhIl1bbStvXXx8KGVbIiFkYXRhIl1bbStvXT1bXSksZVsiIWRhdGEiXVttK29dW3krY109QSk6ZVtvdih7Yzp5K2MscjptK299KV09QSx1LmUuYzx5K2MmJih1LmUuYz15K2MpLHkrPXh9fSsrbX1yZXR1cm4gZC5sZW5ndGgmJihlWyIhbWVyZ2VzIl09KGVbIiFtZXJnZXMiXXx8W10pLmNvbmNhdChkKSksdS5lLnI9TWF0aC5tYXgodS5lLnIsbS0xK28pLGVbIiFyZWYiXT1zdih1KSxtPj1sJiYoZVsiIWZ1bGxyZWYiXT1zdigodS5lLnI9ci5sZW5ndGgtZyttLTErbyx1KSkpLGV9ZnVuY3Rpb24geV8oZSx0KXt2YXIgbj17fTtyZXR1cm4odHx8e30pLmRlbnNlJiYoblsiIWRhdGEiXT1bXSksYl8obixlLHQpfWZ1bmN0aW9uIHZfKGUpe3ZhciB0PSIiLG49ZnVuY3Rpb24oZSl7cmV0dXJuIGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyYmImZ1bmN0aW9uIj09dHlwZW9mIGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlP2Uub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlOiJmdW5jdGlvbiI9PXR5cGVvZiBnZXRDb21wdXRlZFN0eWxlP2dldENvbXB1dGVkU3R5bGU6bnVsbH0oZSk7cmV0dXJuIG4mJih0PW4oZSkuZ2V0UHJvcGVydHlWYWx1ZSgiZGlzcGxheSIpKSx0fHwodD1lLnN0eWxlJiZlLnN0eWxlLmRpc3BsYXkpLCJub25lIj09PXR9ZnVuY3Rpb24geF8oZSx0LG4pe3ZhciByPW58fHt9LGk9bHkoZSk7dXkubGFzdEluZGV4PTAsaT1pLnJlcGxhY2UoLzwhLS0oW1xzXFNdKj8pLS0+L2dtLCIiKS5yZXBsYWNlKC88IURPQ1RZUEVbXlxbXSpcW1teXF1dKlxdPi9nbSwiIik7Zm9yKHZhciBhLG8sYyxzPSIiLGw9IiIsdT0wLGY9LTEsZD0iIjthPXV5LmV4ZWMoaSk7KXN3aXRjaChhWzNdPWFbM10ucmVwbGFjZSgvXy4qJC8sIiIpKXtjYXNlIm51bWJlci1zdHlsZSI6Y2FzZSJjdXJyZW5jeS1zdHlsZSI6Y2FzZSJwZXJjZW50YWdlLXN0eWxlIjpjYXNlImRhdGUtc3R5bGUiOmNhc2UidGltZS1zdHlsZSI6Y2FzZSJ0ZXh0LXN0eWxlIjoiLyI9PT1hWzFdPygiZmFsc2UiPT1vWyJ0cnVuY2F0ZS1vbi1vdmVyZmxvdyJdJiYocy5tYXRjaCgvaC8pP3M9cy5yZXBsYWNlKC9oKy8sIlskJl0iKTpzLm1hdGNoKC9tLyk/cz1zLnJlcGxhY2UoL20rLywiWyQmXSIpOnMubWF0Y2goL3MvKSYmKHM9cy5yZXBsYWNlKC9zKy8sIlskJl0iKSkpLHJbby5uYW1lXT1zLHM9IiIpOiIvIiE9PWFbMF0uY2hhckF0KGFbMF0ubGVuZ3RoLTIpJiYocz0iIixvPUxiKGFbMF0sITEpKTticmVhaztjYXNlImJvb2xlYW4tc3R5bGUiOiIvIj09PWFbMV0/KHJbby5uYW1lXT0iR2VuZXJhbCIscz0iIik6Ii8iIT09YVswXS5jaGFyQXQoYVswXS5sZW5ndGgtMikmJihzPSIiLG89TGIoYVswXSwhMSkpO2JyZWFrO2Nhc2UiYm9vbGVhbiI6cys9IkdlbmVyYWwiO2JyZWFrO2Nhc2UidGV4dCI6Ii8iPT09YVsxXT8iJSI9PShkPWkuc2xpY2UoZix1eS5sYXN0SW5kZXgtYVswXS5sZW5ndGgpKSYmIjxudW1iZXI6cGVyY2VudGFnZS1zdHlsZSI9PW9bMF0/cys9IiUiOnMrPSciJytkLnJlcGxhY2UoLyIvZywnIiInKSsnIic6Ii8iIT09YVswXS5jaGFyQXQoYVswXS5sZW5ndGgtMikmJihmPXV5Lmxhc3RJbmRleCk7YnJlYWs7Y2FzZSJkYXkiOmlmKCJzaG9ydCI9PT0oYz1MYihhWzBdLCExKSkuc3R5bGUpcys9ImQiO2Vsc2Ugcys9ImRkIjticmVhaztjYXNlImRheS1vZi13ZWVrIjpzd2l0Y2goKGM9TGIoYVswXSwhMSkpLnN0eWxlKXtjYXNlInNob3J0IjpkZWZhdWx0OnMrPSJkZGQiO2JyZWFrO2Nhc2UibG9uZyI6cys9ImRkZGQifWJyZWFrO2Nhc2UiZXJhIjppZigic2hvcnQiPT09KGM9TGIoYVswXSwhMSkpLnN0eWxlKXMrPSJlZSI7ZWxzZSBzKz0iZWVlZSI7YnJlYWs7Y2FzZSJob3VycyI6aWYoInNob3J0Ij09PShjPUxiKGFbMF0sITEpKS5zdHlsZSlzKz0iaCI7ZWxzZSBzKz0iaGgiO2JyZWFrO2Nhc2UibWludXRlcyI6aWYoInNob3J0Ij09PShjPUxiKGFbMF0sITEpKS5zdHlsZSlzKz0ibSI7ZWxzZSBzKz0ibW0iO2JyZWFrO2Nhc2UibW9udGgiOnN3aXRjaCgoYz1MYihhWzBdLCExKSkudGV4dHVhbCYmKHMrPSJtbSIpLGMuc3R5bGUpe2Nhc2Uic2hvcnQiOmRlZmF1bHQ6cys9Im0iO2JyZWFrO2Nhc2UibG9uZyI6cys9Im1tIn1icmVhaztjYXNlInNlY29uZHMiOmlmKCJzaG9ydCI9PT0oYz1MYihhWzBdLCExKSkuc3R5bGUpcys9InMiO2Vsc2Ugcys9InNzIjtjWyJkZWNpbWFsLXBsYWNlcyJdJiYocys9Ii4iK2ZiKCIwIiwrY1siZGVjaW1hbC1wbGFjZXMiXSkpO2JyZWFrO2Nhc2UieWVhciI6c3dpdGNoKChjPUxiKGFbMF0sITEpKS5zdHlsZSl7Y2FzZSJzaG9ydCI6ZGVmYXVsdDpzKz0ieXkiO2JyZWFrO2Nhc2UibG9uZyI6cys9Inl5eXkifWJyZWFrO2Nhc2UiYW0tcG0iOnMrPSJBTS9QTSI7YnJlYWs7Y2FzZSJ3ZWVrLW9mLXllYXIiOmNhc2UicXVhcnRlciI6Y29uc29sZS5lcnJvcigiRXhjZWwgZG9lcyBub3Qgc3VwcG9ydCBPRFMgZm9ybWF0IHRva2VuICIrYVszXSk7YnJlYWs7Y2FzZSJmaWxsLWNoYXJhY3RlciI6Ii8iPT09YVsxXT9zKz0nIicrKGQ9aS5zbGljZShmLHV5Lmxhc3RJbmRleC1hWzBdLmxlbmd0aCkpLnJlcGxhY2UoLyIvZywnIiInKSsnIionOiIvIiE9PWFbMF0uY2hhckF0KGFbMF0ubGVuZ3RoLTIpJiYoZj11eS5sYXN0SW5kZXgpO2JyZWFrO2Nhc2Uic2NpZW50aWZpYy1udW1iZXIiOnMrPSIwLiIrZmIoIjAiLCsoYz1MYihhWzBdLCExKSlbIm1pbi1kZWNpbWFsLXBsYWNlcyJdfHwrY1siZGVjaW1hbC1wbGFjZXMiXXx8MikrZmIoIj8iLCtjWyJkZWNpbWFsLXBsYWNlcyJdLStjWyJtaW4tZGVjaW1hbC1wbGFjZXMiXXx8MCkrIkUiKygkYihjWyJmb3JjZWQtZXhwb25lbnQtc2lnbiJdKT8iKyI6IiIpK2ZiKCIwIiwrY1sibWluLWV4cG9uZW50LWRpZ2l0cyJdfHwyKTticmVhaztjYXNlImZyYWN0aW9uIjorKGM9TGIoYVswXSwhMSkpWyJtaW4taW50ZWdlci1kaWdpdHMiXT9zKz1mYigiMCIsK2NbIm1pbi1pbnRlZ2VyLWRpZ2l0cyJdKTpzKz0iIyIscys9IiAiLHMrPWZiKCI/IiwrY1sibWluLW51bWVyYXRvci1kaWdpdHMiXXx8MSkscys9Ii8iLCtjWyJkZW5vbWluYXRvci12YWx1ZSJdP3MrPWNbImRlbm9taW5hdG9yLXZhbHVlIl06cys9ZmIoIj8iLCtjWyJtaW4tZGVub21pbmF0b3ItZGlnaXRzIl18fDEpO2JyZWFrO2Nhc2UiY3VycmVuY3ktc3ltYm9sIjoiLyI9PT1hWzFdP3MrPSciJytpLnNsaWNlKGYsdXkubGFzdEluZGV4LWFbMF0ubGVuZ3RoKS5yZXBsYWNlKC8iL2csJyIiJykrJyInOiIvIiE9PWFbMF0uY2hhckF0KGFbMF0ubGVuZ3RoLTIpP2Y9dXkubGFzdEluZGV4OnMrPSIkIjticmVhaztjYXNlInRleHQtcHJvcGVydGllcyI6c3dpdGNoKCgoYz1MYihhWzBdLCExKSkuY29sb3J8fCIiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoIiMiLCIiKSl7Y2FzZSJmZjAwMDAiOmNhc2UicmVkIjpzPSJbUmVkXSIrc31icmVhaztjYXNlInRleHQtY29udGVudCI6cys9IkAiO2JyZWFrO2Nhc2UibWFwIjpjPUxiKGFbMF0sITEpLCJ2YWx1ZSgpPj0wIj09SGIoYy5jb25kaXRpb24pP3M9cltjWyJhcHBseS1zdHlsZS1uYW1lIl1dKyI7IitzOmNvbnNvbGUuZXJyb3IoIk9EUyBudW1iZXIgZm9ybWF0IG1heSBiZSBpbmNvcnJlY3Q6ICIrYy5jb25kaXRpb24pO2JyZWFrO2Nhc2UibnVtYmVyIjppZigiLyI9PT1hWzFdKWJyZWFrO2w9IiIsbCs9ZmIoIjAiLCsoYz1MYihhWzBdLCExKSlbIm1pbi1pbnRlZ2VyLWRpZ2l0cyJdfHwxKSwkYihjLmdyb3VwaW5nKSYmKGw9X20oZmIoIiMiLE1hdGgubWF4KDAsNC1sLmxlbmd0aCkpK2wpKSwoK2NbIm1pbi1kZWNpbWFsLXBsYWNlcyJdfHwrY1siZGVjaW1hbC1wbGFjZXMiXSkmJihsKz0iLiIpLCtjWyJtaW4tZGVjaW1hbC1wbGFjZXMiXSYmKGwrPWZiKCIwIiwrY1sibWluLWRlY2ltYWwtcGxhY2VzIl18fDEpKSwrY1siZGVjaW1hbC1wbGFjZXMiXS0oK2NbIm1pbi1kZWNpbWFsLXBsYWNlcyJdfHwwKSYmKGwrPWZiKCIwIiwrY1siZGVjaW1hbC1wbGFjZXMiXS0oK2NbIm1pbi1kZWNpbWFsLXBsYWNlcyJdfHwwKSkpLHMrPWw7YnJlYWs7Y2FzZSJlbWJlZGRlZC10ZXh0IjoiLyI9PT1hWzFdPzA9PXU/cys9JyInK2kuc2xpY2UoZix1eS5sYXN0SW5kZXgtYVswXS5sZW5ndGgpLnJlcGxhY2UoLyIvZywnIiInKSsnIic6cz1zLnNsaWNlKDAsdSkrJyInK2kuc2xpY2UoZix1eS5sYXN0SW5kZXgtYVswXS5sZW5ndGgpLnJlcGxhY2UoLyIvZywnIiInKSsnIicrcy5zbGljZSh1KToiLyIhPT1hWzBdLmNoYXJBdChhWzBdLmxlbmd0aC0yKSYmKGY9dXkubGFzdEluZGV4LHU9LStMYihhWzBdLCExKS5wb3NpdGlvbnx8MCl9cmV0dXJuIHJ9ZnVuY3Rpb24gRF8oZSx0LG4pe3ZhciByLGksYSxvLGMscyxsLHU9dHx8e30sZj1seShlKSxkPVtdLGg9MCxwPXt9LGc9W10sbT17fTt1LmRlbnNlJiYobVsiIWRhdGEiXT1bXSk7dmFyIGIseSx2PXt2YWx1ZToiIn0seD0iIixEPTAsVD0iIix3PTAsXz1bXSxFPVtdLFU9LTEsQT0tMSxrPXtzOntyOjFlNixjOjFlN30sZTp7cjowLGM6MH19LFM9MCxDPW58fHt9LEY9e30sTz1bXSxJPXt9LFI9W10sTj0xLFA9MSxCPVtdLFc9e05hbWVzOltdLFdCUHJvcHM6e319LEw9e30sTT1bIiIsIiJdLGo9W10sej17fSxIPSIiLFY9MCxxPSExLEc9ITEsWD0wO2Zvcih1eS5sYXN0SW5kZXg9MCxmPWYucmVwbGFjZSgvPCEtLShbXHNcU10qPyktLT4vZ20sIiIpLnJlcGxhY2UoLzwhRE9DVFlQRVteXFtdKlxbW15cXV0qXF0+L2dtLCIiKTtzPXV5LmV4ZWMoZik7KXN3aXRjaChzWzNdPXNbM10ucmVwbGFjZSgvXy4qJC8sIiIpKXtjYXNlInRhYmxlIjpjYXNlIuW3peS9nOihqCI6Ii8iPT09c1sxXT8oay5lLmM+PWsucy5jJiZrLmUucj49ay5zLnI/bVsiIXJlZiJdPXN2KGspOm1bIiFyZWYiXT0iQTE6QTEiLHUuc2hlZXRSb3dzPjAmJnUuc2hlZXRSb3dzPD1rLmUuciYmKG1bIiFmdWxscmVmIl09bVsiIXJlZiJdLGsuZS5yPXUuc2hlZXRSb3dzLTEsbVsiIXJlZiJdPXN2KGspKSxPLmxlbmd0aCYmKG1bIiFtZXJnZXMiXT1PKSxSLmxlbmd0aCYmKG1bIiFyb3dzIl09Uiksby5uYW1lPW9bIuWQjeensCJdfHxvLm5hbWUsInVuZGVmaW5lZCIhPXR5cGVvZiBKU09OJiZKU09OLnN0cmluZ2lmeShvKSxnLnB1c2goby5uYW1lKSxwW28ubmFtZV09bSxHPSExKToiLyIhPT1zWzBdLmNoYXJBdChzWzBdLmxlbmd0aC0yKSYmKG89TGIoc1swXSwhMSksVT1BPS0xLGsucy5yPWsucy5jPTFlNyxrLmUucj1rLmUuYz0wLG09e30sdS5kZW5zZSYmKG1bIiFkYXRhIl09W10pLE89W10sUj1bXSxHPSEwKTticmVhaztjYXNlInRhYmxlLXJvdy1ncm91cCI6Ii8iPT09c1sxXT8tLVM6KytTO2JyZWFrO2Nhc2UidGFibGUtcm93IjpjYXNlIuihjCI6aWYoIi8iPT09c1sxXSl7VSs9TixOPTE7YnJlYWt9aWYoKGM9TGIoc1swXSwhMSkpWyLooYzlj7ciXT9VPWNbIuihjOWPtyJdLTE6LTE9PVUmJihVPTApLChOPStjWyJudW1iZXItcm93cy1yZXBlYXRlZCJdfHwxKTwxMClmb3IoWD0wO1g8TjsrK1gpUz4wJiYoUltVK1hdPXtsZXZlbDpTfSk7QT0tMTticmVhaztjYXNlImNvdmVyZWQtdGFibGUtY2VsbCI6Ii8iIT09c1sxXSYmKytBLHUuc2hlZXRTdHVicyYmKHUuZGVuc2U/KG1bIiFkYXRhIl1bVV18fChtWyIhZGF0YSJdW1VdPVtdKSxtWyIhZGF0YSJdW1VdW0FdPXt0OiJ6In0pOm1bb3Yoe3I6VSxjOkF9KV09e3Q6InoifSkseD0iIixfPVtdO2JyZWFrO2Nhc2UidGFibGUtY2VsbCI6Y2FzZSLmlbDmja4iOmlmKCIvIj09PXNbMF0uY2hhckF0KHNbMF0ubGVuZ3RoLTIpKSsrQSx2PUxiKHNbMF0sITEpLFA9cGFyc2VJbnQodlsibnVtYmVyLWNvbHVtbnMtcmVwZWF0ZWQiXXx8IjEiLDEwKSxsPXt0OiJ6Iix2Om51bGx9LHYuZm9ybXVsYSYmMCE9dS5jZWxsRm9ybXVsYSYmKGwuZj1udyhIYih2LmZvcm11bGEpKSksdlsic3R5bGUtbmFtZSJdJiZGW3ZbInN0eWxlLW5hbWUiXV0mJihsLno9Rlt2WyJzdHlsZS1uYW1lIl1dKSwic3RyaW5nIj09KHZbIuaVsOaNruexu+WeiyJdfHx2WyJ2YWx1ZS10eXBlIl0pJiYobC50PSJzIixsLnY9SGIodlsic3RyaW5nLXZhbHVlIl18fCIiKSx1LmRlbnNlPyhtWyIhZGF0YSJdW1VdfHwobVsiIWRhdGEiXVtVXT1bXSksbVsiIWRhdGEiXVtVXVtBXT1sKTptW2l2KEEpK252KFUpXT1sKSxBKz1QLTE7ZWxzZSBpZigiLyIhPT1zWzFdKXt4PVQ9IiIsRD13PTAsXz1bXSxFPVtdLFA9MTt2YXIgJD1OP1UrTi0xOlU7aWYoKytBPmsuZS5jJiYoay5lLmM9QSksQTxrLnMuYyYmKGsucy5jPUEpLFU8ay5zLnImJihrLnMucj1VKSwkPmsuZS5yJiYoay5lLnI9JCksaj1bXSx6PXt9LGw9e3Q6KHY9TGIoc1swXSwhMSkpWyLmlbDmja7nsbvlnosiXXx8dlsidmFsdWUtdHlwZSJdLHY6bnVsbH0sdlsic3R5bGUtbmFtZSJdJiZGW3ZbInN0eWxlLW5hbWUiXV0mJihsLno9Rlt2WyJzdHlsZS1uYW1lIl1dKSx1LmNlbGxGb3JtdWxhKWlmKHYuZm9ybXVsYSYmKHYuZm9ybXVsYT1IYih2LmZvcm11bGEpKSx2WyJudW1iZXItbWF0cml4LWNvbHVtbnMtc3Bhbm5lZCJdJiZ2WyJudW1iZXItbWF0cml4LXJvd3Mtc3Bhbm5lZCJdJiYoST17czp7cjpVLGM6QX0sZTp7cjpVKyhwYXJzZUludCh2WyJudW1iZXItbWF0cml4LXJvd3Mtc3Bhbm5lZCJdLDEwKXx8MCktMSxjOkErKHBhcnNlSW50KHZbIm51bWJlci1tYXRyaXgtY29sdW1ucy1zcGFubmVkIl0sMTApfHwwKS0xfX0sbC5GPXN2KEkpLEIucHVzaChbSSxsLkZdKSksdi5mb3JtdWxhKWwuZj1udyh2LmZvcm11bGEpO2Vsc2UgZm9yKFg9MDtYPEIubGVuZ3RoOysrWClVPj1CW1hdWzBdLnMuciYmVTw9QltYXVswXS5lLnImJkE+PUJbWF1bMF0ucy5jJiZBPD1CW1hdWzBdLmUuYyYmKGwuRj1CW1hdWzFdKTtzd2l0Y2goKHZbIm51bWJlci1jb2x1bW5zLXNwYW5uZWQiXXx8dlsibnVtYmVyLXJvd3Mtc3Bhbm5lZCJdKSYmKEk9e3M6e3I6VSxjOkF9LGU6e3I6VSsocGFyc2VJbnQodlsibnVtYmVyLXJvd3Mtc3Bhbm5lZCJdLDEwKXx8MCktMSxjOkErKHBhcnNlSW50KHZbIm51bWJlci1jb2x1bW5zLXNwYW5uZWQiXSwxMCl8fDApLTF9fSxPLnB1c2goSSkpLHZbIm51bWJlci1jb2x1bW5zLXJlcGVhdGVkIl0mJihQPXBhcnNlSW50KHZbIm51bWJlci1jb2x1bW5zLXJlcGVhdGVkIl0sMTApKSxsLnQpe2Nhc2UiYm9vbGVhbiI6bC50PSJiIixsLnY9JGIodlsiYm9vbGVhbi12YWx1ZSJdKXx8K3ZbImJvb2xlYW4tdmFsdWUiXT49MTticmVhaztjYXNlImZsb2F0IjpsLnQ9Im4iLGwudj1wYXJzZUZsb2F0KHYudmFsdWUpLHUuY2VsbERhdGVzJiZsLnomJkxtKGwueikmJihsLnY9cmIobC52KyhXLldCUHJvcHMuZGF0ZTE5MDQ/MTQ2MjowKSksbC50PSJudW1iZXIiPT10eXBlb2YgbC52PyJuIjoiZCIpO2JyZWFrO2Nhc2UicGVyY2VudGFnZSI6Y2FzZSJjdXJyZW5jeSI6bC50PSJuIixsLnY9cGFyc2VGbG9hdCh2LnZhbHVlKTticmVhaztjYXNlImRhdGUiOmwudD0iZCIsbC52PXNiKHZbImRhdGUtdmFsdWUiXSxXLldCUHJvcHMuZGF0ZTE5MDQpLHUuY2VsbERhdGVzfHwobC50PSJuIixsLnY9bmIobC52LFcuV0JQcm9wcy5kYXRlMTkwNCkpLGwuenx8KGwuej0ibS9kL3l5Iik7YnJlYWs7Y2FzZSJ0aW1lIjpsLnQ9Im4iLGwudj1pYih2WyJ0aW1lLXZhbHVlIl0pLzg2NDAwLHUuY2VsbERhdGVzJiYobC52PXJiKGwudiksbC50PSJudW1iZXIiPT10eXBlb2YgbC52PyJuIjoiZCIpLGwuenx8KGwuej0iSEg6TU06U1MiKTticmVhaztjYXNlIm51bWJlciI6bC50PSJuIixsLnY9cGFyc2VGbG9hdCh2WyLmlbDmja7mlbDlgLwiXSk7YnJlYWs7ZGVmYXVsdDppZigic3RyaW5nIiE9PWwudCYmInRleHQiIT09bC50JiZsLnQpdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCB2YWx1ZSB0eXBlICIrbC50KTtsLnQ9InMiLG51bGwhPXZbInN0cmluZy12YWx1ZSJdJiYoeD1IYih2WyJzdHJpbmctdmFsdWUiXSksXz1bXSl9fWVsc2V7aWYocT0hMSwicyI9PT1sLnQmJihsLnY9eHx8IiIsXy5sZW5ndGgmJihsLlI9XykscT0wPT1EKSxMLlRhcmdldCYmKGwubD1MKSxqLmxlbmd0aD4wJiYobC5jPWosaj1bXSkseCYmITEhPT11LmNlbGxUZXh0JiYobC53PXgpLHEmJihsLnQ9InoiLGRlbGV0ZSBsLnYpLCghcXx8dS5zaGVldFN0dWJzKSYmISh1LnNoZWV0Um93cyYmdS5zaGVldFJvd3M8PVUpKWZvcih2YXIgWT0wO1k8TjsrK1kpe2lmKFA9cGFyc2VJbnQodlsibnVtYmVyLWNvbHVtbnMtcmVwZWF0ZWQiXXx8IjEiLDEwKSx1LmRlbnNlKWZvcihtWyIhZGF0YSJdW1UrWV18fChtWyIhZGF0YSJdW1UrWV09W10pLG1bIiFkYXRhIl1bVStZXVtBXT0wPT1ZP2w6dWIobCk7LS1QPjA7KW1bIiFkYXRhIl1bVStZXVtBK1BdPXViKGwpO2Vsc2UgZm9yKG1bb3Yoe3I6VStZLGM6QX0pXT1sOy0tUD4wOyltW292KHtyOlUrWSxjOkErUH0pXT11YihsKTtrLmUuYzw9QSYmKGsuZS5jPUEpfUErPShQPXBhcnNlSW50KHZbIm51bWJlci1jb2x1bW5zLXJlcGVhdGVkIl18fCIxIiwxMCkpLTEsUD0wLGw9e30seD0iIixfPVtdfUw9e307YnJlYWs7Y2FzZSJkb2N1bWVudCI6Y2FzZSJkb2N1bWVudC1jb250ZW50IjpjYXNlIueUteWtkOihqOagvOaWh+ahoyI6Y2FzZSJzcHJlYWRzaGVldCI6Y2FzZSLkuLvkvZMiOmNhc2Uic2NyaXB0cyI6Y2FzZSJzdHlsZXMiOmNhc2UiZm9udC1mYWNlLWRlY2xzIjpjYXNlIm1hc3Rlci1zdHlsZXMiOmlmKCIvIj09PXNbMV0pe2lmKChyPWQucG9wKCkpWzBdIT09c1szXSl0aHJvdyJCYWQgc3RhdGU6ICIrcn1lbHNlIi8iIT09c1swXS5jaGFyQXQoc1swXS5sZW5ndGgtMikmJmQucHVzaChbc1szXSwhMF0pO2JyZWFrO2Nhc2UiYW5ub3RhdGlvbiI6aWYoIi8iPT09c1sxXSl7aWYoKHI9ZC5wb3AoKSlbMF0hPT1zWzNdKXRocm93IkJhZCBzdGF0ZTogIityO3oudD14LF8ubGVuZ3RoJiYoei5SPV8pLHouYT1ILGoucHVzaCh6KSx4PVQsRD13LF89RX1lbHNlIGlmKCIvIiE9PXNbMF0uY2hhckF0KHNbMF0ubGVuZ3RoLTIpKXtkLnB1c2goW3NbM10sITFdKTt2YXIgSz1MYihzWzBdLCEwKTtLLmRpc3BsYXkmJiRiKEsuZGlzcGxheSl8fChqLmhpZGRlbj0hMCksVD14LHc9RCxFPV8seD0iIixEPTAsXz1bXX1IPSIiLFY9MDticmVhaztjYXNlImNyZWF0b3IiOiIvIj09PXNbMV0/SD1mLnNsaWNlKFYscy5pbmRleCk6Vj1zLmluZGV4K3NbMF0ubGVuZ3RoO2JyZWFrO2Nhc2UibWV0YSI6Y2FzZSLlhYPmlbDmja4iOmNhc2Uic2V0dGluZ3MiOmNhc2UiY29uZmlnLWl0ZW0tc2V0IjpjYXNlImNvbmZpZy1pdGVtLW1hcC1pbmRleGVkIjpjYXNlImNvbmZpZy1pdGVtLW1hcC1lbnRyeSI6Y2FzZSJjb25maWctaXRlbS1tYXAtbmFtZWQiOmNhc2Uic2hhcGVzIjpjYXNlImZyYW1lIjpjYXNlInRleHQtYm94IjpjYXNlImltYWdlIjpjYXNlImRhdGEtcGlsb3QtdGFibGVzIjpjYXNlImxpc3Qtc3R5bGUiOmNhc2UiZm9ybSI6Y2FzZSJkZGUtbGlua3MiOmNhc2UiZXZlbnQtbGlzdGVuZXJzIjpjYXNlImNoYXJ0IjppZigiLyI9PT1zWzFdKXtpZigocj1kLnBvcCgpKVswXSE9PXNbM10pdGhyb3ciQmFkIHN0YXRlOiAiK3J9ZWxzZSIvIiE9PXNbMF0uY2hhckF0KHNbMF0ubGVuZ3RoLTIpJiZkLnB1c2goW3NbM10sITFdKTt4PSIiLEQ9MCxfPVtdO2JyZWFrO2Nhc2Uic2NpZW50aWZpYy1udW1iZXIiOmNhc2UiY3VycmVuY3ktc3ltYm9sIjpjYXNlImZpbGwtY2hhcmFjdGVyIjpjYXNlInNjcmlwdCI6Y2FzZSJsaWJyYXJpZXMiOmNhc2UiYXV0b21hdGljLXN0eWxlcyI6Y2FzZSJkZWZhdWx0LXN0eWxlIjpjYXNlInBhZ2UtbGF5b3V0IjpjYXNlIm1hcCI6Y2FzZSJmb250LWZhY2UiOmNhc2UicGFyYWdyYXBoLXByb3BlcnRpZXMiOmNhc2UidGFibGUtcHJvcGVydGllcyI6Y2FzZSJ0YWJsZS1jb2x1bW4tcHJvcGVydGllcyI6Y2FzZSJ0YWJsZS1yb3ctcHJvcGVydGllcyI6Y2FzZSJ0YWJsZS1jZWxsLXByb3BlcnRpZXMiOmNhc2UibnVtYmVyIjpjYXNlImZyYWN0aW9uIjpjYXNlImRheSI6Y2FzZSJtb250aCI6Y2FzZSJ5ZWFyIjpjYXNlImVyYSI6Y2FzZSJkYXktb2Ytd2VlayI6Y2FzZSJ3ZWVrLW9mLXllYXIiOmNhc2UicXVhcnRlciI6Y2FzZSJob3VycyI6Y2FzZSJtaW51dGVzIjpjYXNlInNlY29uZHMiOmNhc2UiYW0tcG0iOmNhc2UiYm9vbGVhbiI6Y2FzZSJ0ZXh0LWNvbnRlbnQiOmNhc2UidGV4dC1wcm9wZXJ0aWVzIjpjYXNlImVtYmVkZGVkLXRleHQiOmNhc2UiYm9keSI6Y2FzZSLnlLXlrZDooajmoLwiOmNhc2UiZm9ybXMiOmNhc2UidGFibGUtY29sdW1uIjpjYXNlInRhYmxlLWhlYWRlci1yb3dzIjpjYXNlInRhYmxlLXJvd3MiOmNhc2UidGFibGUtY29sdW1uLWdyb3VwIjpjYXNlInRhYmxlLWhlYWRlci1jb2x1bW5zIjpjYXNlInRhYmxlLWNvbHVtbnMiOmNhc2UiZ3JhcGhpYy1wcm9wZXJ0aWVzIjpjYXNlImNhbGN1bGF0aW9uLXNldHRpbmdzIjpjYXNlIm5hbWVkLWV4cHJlc3Npb25zIjpjYXNlImxhYmVsLXJhbmdlIjpjYXNlImxhYmVsLXJhbmdlcyI6Y2FzZSJuYW1lZC1leHByZXNzaW9uIjpjYXNlInNvcnQiOmNhc2Uic29ydC1ieSI6Y2FzZSJzb3J0LWdyb3VwcyI6Y2FzZSJ0YWIiOmNhc2UibGluZS1icmVhayI6Y2FzZSJzcGFuIjpjYXNlInMiOmNhc2UiZGF0ZSI6Y2FzZSJvYmplY3QiOmNhc2UidGl0bGUiOmNhc2Ui5qCH6aKYIjpjYXNlImRlc2MiOmNhc2UiYmluYXJ5LWRhdGEiOmNhc2UidGFibGUtc291cmNlIjpjYXNlInNjZW5hcmlvIjpjYXNlIml0ZXJhdGlvbiI6Y2FzZSJjb250ZW50LXZhbGlkYXRpb25zIjpjYXNlImNvbnRlbnQtdmFsaWRhdGlvbiI6Y2FzZSJoZWxwLW1lc3NhZ2UiOmNhc2UiZXJyb3ItbWVzc2FnZSI6Y2FzZSJkYXRhYmFzZS1yYW5nZXMiOmNhc2UiZmlsdGVyIjpjYXNlImZpbHRlci1hbmQiOmNhc2UiZmlsdGVyLW9yIjpjYXNlImZpbHRlci1jb25kaXRpb24iOmNhc2UiZmlsdGVyLXNldC1pdGVtIjpjYXNlImxpc3QtbGV2ZWwtc3R5bGUtYnVsbGV0IjpjYXNlImxpc3QtbGV2ZWwtc3R5bGUtbnVtYmVyIjpjYXNlImxpc3QtbGV2ZWwtcHJvcGVydGllcyI6Y2FzZSJzZW5kZXItZmlyc3RuYW1lIjpjYXNlInNlbmRlci1sYXN0bmFtZSI6Y2FzZSJzZW5kZXItaW5pdGlhbHMiOmNhc2Uic2VuZGVyLXRpdGxlIjpjYXNlInNlbmRlci1wb3NpdGlvbiI6Y2FzZSJzZW5kZXItZW1haWwiOmNhc2Uic2VuZGVyLXBob25lLXByaXZhdGUiOmNhc2Uic2VuZGVyLWZheCI6Y2FzZSJzZW5kZXItY29tcGFueSI6Y2FzZSJzZW5kZXItcGhvbmUtd29yayI6Y2FzZSJzZW5kZXItc3RyZWV0IjpjYXNlInNlbmRlci1jaXR5IjpjYXNlInNlbmRlci1wb3N0YWwtY29kZSI6Y2FzZSJzZW5kZXItY291bnRyeSI6Y2FzZSJzZW5kZXItc3RhdGUtb3ItcHJvdmluY2UiOmNhc2UiYXV0aG9yLW5hbWUiOmNhc2UiYXV0aG9yLWluaXRpYWxzIjpjYXNlImNoYXB0ZXIiOmNhc2UiZmlsZS1uYW1lIjpjYXNlInRlbXBsYXRlLW5hbWUiOmNhc2Uic2hlZXQtbmFtZSI6Y2FzZSJldmVudC1saXN0ZW5lciI6Y2FzZSJpbml0aWFsLWNyZWF0b3IiOmNhc2UiY3JlYXRpb24tZGF0ZSI6Y2FzZSJwcmludC1kYXRlIjpjYXNlImdlbmVyYXRvciI6Y2FzZSJkb2N1bWVudC1zdGF0aXN0aWMiOmNhc2UidXNlci1kZWZpbmVkIjpjYXNlImVkaXRpbmctZHVyYXRpb24iOmNhc2UiZWRpdGluZy1jeWNsZXMiOmNhc2UiY29uZmlnLWl0ZW0iOmNhc2UicGFnZS1udW1iZXIiOmNhc2UicGFnZS1jb3VudCI6Y2FzZSJ0aW1lIjpjYXNlImNlbGwtcmFuZ2Utc291cmNlIjpjYXNlImRldGVjdGl2ZSI6Y2FzZSJvcGVyYXRpb24iOmNhc2UiaGlnaGxpZ2h0ZWQtcmFuZ2UiOmNhc2UiZGF0YS1waWxvdC10YWJsZSI6Y2FzZSJzb3VyY2UtY2VsbC1yYW5nZSI6Y2FzZSJzb3VyY2Utc2VydmljZSI6Y2FzZSJkYXRhLXBpbG90LWZpZWxkIjpjYXNlImRhdGEtcGlsb3QtbGV2ZWwiOmNhc2UiZGF0YS1waWxvdC1zdWJ0b3RhbHMiOmNhc2UiZGF0YS1waWxvdC1zdWJ0b3RhbCI6Y2FzZSJkYXRhLXBpbG90LW1lbWJlcnMiOmNhc2UiZGF0YS1waWxvdC1tZW1iZXIiOmNhc2UiZGF0YS1waWxvdC1kaXNwbGF5LWluZm8iOmNhc2UiZGF0YS1waWxvdC1zb3J0LWluZm8iOmNhc2UiZGF0YS1waWxvdC1sYXlvdXQtaW5mbyI6Y2FzZSJkYXRhLXBpbG90LWZpZWxkLXJlZmVyZW5jZSI6Y2FzZSJkYXRhLXBpbG90LWdyb3VwcyI6Y2FzZSJkYXRhLXBpbG90LWdyb3VwIjpjYXNlImRhdGEtcGlsb3QtZ3JvdXAtbWVtYmVyIjpjYXNlInJlY3QiOmNhc2UiZGRlLWNvbm5lY3Rpb24tZGVjbHMiOmNhc2UiZGRlLWNvbm5lY3Rpb24tZGVjbCI6Y2FzZSJkZGUtbGluayI6Y2FzZSJkZGUtc291cmNlIjpjYXNlInByb3BlcnRpZXMiOmNhc2UicHJvcGVydHkiOmNhc2UidGFibGUtcHJvdGVjdGlvbiI6Y2FzZSJkYXRhLXBpbG90LWdyYW5kLXRvdGFsIjpjYXNlIm9mZmljZS1kb2N1bWVudC1jb21tb24tYXR0cnMiOmJyZWFrO2Nhc2UidGV4dC1zdHlsZSI6Y2FzZSJib29sZWFuLXN0eWxlIjpjYXNlIm51bWJlci1zdHlsZSI6Y2FzZSJjdXJyZW5jeS1zdHlsZSI6Y2FzZSJwZXJjZW50YWdlLXN0eWxlIjpjYXNlImRhdGUtc3R5bGUiOmNhc2UidGltZS1zdHlsZSI6aWYoIi8iPT09c1sxXSl7dmFyIFo9dXkubGFzdEluZGV4O3hfKGYuc2xpY2UoYSx1eS5sYXN0SW5kZXgpLDAsQyksdXkubGFzdEluZGV4PVp9ZWxzZSIvIiE9PXNbMF0uY2hhckF0KHNbMF0ubGVuZ3RoLTIpJiYoYT11eS5sYXN0SW5kZXgtc1swXS5sZW5ndGgpO2JyZWFrO2Nhc2Uic3R5bGUiOnZhciBKPUxiKHNbMF0sITEpOyJ0YWJsZS1jZWxsIj09Si5mYW1pbHkmJkNbSlsiZGF0YS1zdHlsZS1uYW1lIl1dJiYoRltKLm5hbWVdPUNbSlsiZGF0YS1zdHlsZS1uYW1lIl1dKTticmVhaztjYXNlInRleHQiOmlmKCIvPiI9PT1zWzBdLnNsaWNlKC0yKSlicmVhaztpZigiLyI9PT1zWzFdKXN3aXRjaChkW2QubGVuZ3RoLTFdWzBdKXtjYXNlIm51bWJlci1zdHlsZSI6Y2FzZSJkYXRlLXN0eWxlIjpjYXNlInRpbWUtc3R5bGUiOmYuc2xpY2UoaCxzLmluZGV4KX1lbHNlIGg9cy5pbmRleCtzWzBdLmxlbmd0aDticmVhaztjYXNlIm5hbWVkLXJhbmdlIjpNPXJ3KChpPUxiKHNbMF0sITEpKVsiY2VsbC1yYW5nZS1hZGRyZXNzIl0pO3ZhciBRPXtOYW1lOmkubmFtZSxSZWY6TVswXSsiISIrTVsxXX07RyYmKFEuU2hlZXQ9Zy5sZW5ndGgpLFcuTmFtZXMucHVzaChRKTticmVhaztjYXNlIm51bGwtZGF0ZSI6aWYoIjE5MDQtMDEtMDEiPT09KGk9TGIoc1swXSwhMSkpWyJkYXRlLXZhbHVlIl0pVy5XQlByb3BzLmRhdGUxOTA0PSEwO2JyZWFrO2Nhc2UicCI6Y2FzZSLmlofmnKzkuLIiOmlmKFsibWFzdGVyLXN0eWxlcyJdLmluZGV4T2YoZFtkLmxlbmd0aC0xXVswXSk+LTEpYnJlYWs7aWYoIi8iIT09c1sxXXx8diYmdlsic3RyaW5nLXZhbHVlIl0pIi8+Ij09c1swXS5zbGljZSgtMik/eCs9IlxuIjooTGIoc1swXSwhMSksRD1zLmluZGV4K3NbMF0ubGVuZ3RoKTtlbHNle3ZhciBlZT0oYj1mLnNsaWNlKEQscy5pbmRleCkseT12b2lkIDAseT1iLnJlcGxhY2UoL1tcdFxyXG5dL2csIiAiKS50cmltKCkucmVwbGFjZSgvICsvZywiICIpLnJlcGxhY2UoLzx0ZXh0OnNcLz4vZywiICIpLnJlcGxhY2UoLzx0ZXh0OnMgdGV4dDpjPSIoXGQrKSJcLz4vZywoZnVuY3Rpb24oZSx0KXtyZXR1cm4gQXJyYXkocGFyc2VJbnQodCwxMCkrMSkuam9pbigiICIpfSkpLnJlcGxhY2UoLzx0ZXh0OnRhYltePl0qXC8+L2csIlx0IikucmVwbGFjZSgvPHRleHQ6bGluZS1icmVha1wvPi9nLCJcbiIpLFtIYih5LnJlcGxhY2UoLzxbXj5dKj4vZywiIikpXSk7eD0oeC5sZW5ndGg+MD94KyJcbiI6IiIpK2VlWzBdfWJyZWFrO2Nhc2UiZGF0YWJhc2UtcmFuZ2UiOmlmKCIvIj09PXNbMV0pYnJlYWs7dHJ5e3BbKE09cncoTGIoc1swXSlbInRhcmdldC1yYW5nZS1hZGRyZXNzIl0pKVswXV1bIiFhdXRvZmlsdGVyIl09e3JlZjpNWzFdfX1jYXRjaChlKXt9YnJlYWs7Y2FzZSJhIjppZigiLyIhPT1zWzFdKXtpZighKEw9TGIoc1swXSwhMSkpLmhyZWYpYnJlYWs7TC5UYXJnZXQ9SGIoTC5ocmVmKSxkZWxldGUgTC5ocmVmLCIjIj09TC5UYXJnZXQuY2hhckF0KDApJiZMLlRhcmdldC5pbmRleE9mKCIuIik+LTE/KE09cncoTC5UYXJnZXQuc2xpY2UoMSkpLEwuVGFyZ2V0PSIjIitNWzBdKyIhIitNWzFdKTpMLlRhcmdldC5tYXRjaCgvXlwuXC5bXFxcL10vKSYmKEwuVGFyZ2V0PUwuVGFyZ2V0LnNsaWNlKDMpKX1icmVhaztkZWZhdWx0OnN3aXRjaChzWzJdKXtjYXNlImRjOiI6Y2FzZSJjYWxjZXh0OiI6Y2FzZSJsb2V4dDoiOmNhc2Uib29vOiI6Y2FzZSJjaGFydG9vbzoiOmNhc2UiZHJhdzoiOmNhc2Uic3R5bGU6IjpjYXNlImNoYXJ0OiI6Y2FzZSJmb3JtOiI6Y2FzZSJ1b2Y6IjpjYXNlIuihqDoiOmNhc2Ui5a2XOiI6YnJlYWs7ZGVmYXVsdDppZih1LldURil0aHJvdyBuZXcgRXJyb3Iocyl9fXZhciB0ZT17U2hlZXRzOnAsU2hlZXROYW1lczpnLFdvcmtib29rOld9O3JldHVybiB1LmJvb2tTaGVldHMmJmRlbGV0ZSB0ZS5TaGVldHMsdGV9ZnVuY3Rpb24gVF8oZSx0KXt0PXR8fHt9LF9iKGUsIk1FVEEtSU5GL21hbmlmZXN0LnhtbCIpJiZmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLGk9bHkoZSk7bj11eS5leGVjKGkpOylzd2l0Y2goblszXSl7Y2FzZSJtYW5pZmVzdCI6YnJlYWs7Y2FzZSJmaWxlLWVudHJ5IjppZigiLyI9PShyPUxiKG5bMF0sITEpKS5wYXRoJiZyLnR5cGUhPT1Zdil0aHJvdyBuZXcgRXJyb3IoIlRoaXMgT3BlbkRvY3VtZW50IGlzIG5vdCBhIHNwcmVhZHNoZWV0Iik7YnJlYWs7Y2FzZSJlbmNyeXB0aW9uLWRhdGEiOmNhc2UiYWxnb3JpdGhtIjpjYXNlInN0YXJ0LWtleS1nZW5lcmF0aW9uIjpjYXNlImtleS1kZXJpdmF0aW9uIjp0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIE9EUyBFbmNyeXB0aW9uIik7ZGVmYXVsdDppZih0JiZ0LldURil0aHJvdyBufX0oVWIoZSwiTUVUQS1JTkYvbWFuaWZlc3QueG1sIiksdCk7dmFyIG49QWIoZSwic3R5bGVzLnhtbCIpLHI9biYmeF8oUWIobikpLGk9QWIoZSwiY29udGVudC54bWwiKTtpZighaSl0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgY29udGVudC54bWwgaW4gT0RTIC8gVU9GIGZpbGUiKTt2YXIgYT1EXyhRYihpKSx0LHIpO3JldHVybiBfYihlLCJtZXRhLnhtbCIpJiYoYS5Qcm9wcz1KdihVYihlLCJtZXRhLnhtbCIpKSksYS5ib29rVHlwZT0ib2RzIixhfWZ1bmN0aW9uIHdfKGUsdCl7dmFyIG49RF8oZSx0KTtyZXR1cm4gbi5ib29rVHlwZT0iZm9kcyIsbn0KLyohIHNoZWV0anMgKEMpIDIwMTMtcHJlc2VudCBTaGVldEpTIC0tIGh0dHA6Ly9zaGVldGpzLmNvbSAqL3ZhciBfXz1mdW5jdGlvbigpe3RyeXtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIFVpbnQ4QXJyYXl8fHZvaWQgMD09PVVpbnQ4QXJyYXkucHJvdG90eXBlLnN1YmFycmF5PyJzbGljZSI6InVuZGVmaW5lZCIhPXR5cGVvZiBCdWZmZXI/dm9pZCAwPT09QnVmZmVyLnByb3RvdHlwZS5zdWJhcnJheT8ic2xpY2UiOigiZnVuY3Rpb24iPT10eXBlb2YgQnVmZmVyLmZyb20/QnVmZmVyLmZyb20oWzcyLDYyXSk6bmV3IEJ1ZmZlcihbNzIsNjJdKSlpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/InN1YmFycmF5Ijoic2xpY2UiOiJzdWJhcnJheSJ9Y2F0Y2goZSl7cmV0dXJuInNsaWNlIn19KCk7ZnVuY3Rpb24gRV8oZSl7cmV0dXJuIG5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKX1mdW5jdGlvbiBVXyhlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyPyhuZXcgVGV4dERlY29kZXIpLmRlY29kZShlKTpRYih0bShlKSl9ZnVuY3Rpb24gQV8oZSl7Zm9yKHZhciB0PTAsbj0wO248ZS5sZW5ndGg7KytuKXQrPWVbbl0ubGVuZ3RoO3ZhciByPW5ldyBVaW50OEFycmF5KHQpLGk9MDtmb3Iobj0wO248ZS5sZW5ndGg7KytuKXt2YXIgYT1lW25dLG89YS5sZW5ndGg7aWYobzwyNTApZm9yKHZhciBjPTA7YzxvOysrYylyW2krK109YVtjXTtlbHNlIHIuc2V0KGEsaSksaSs9b31yZXR1cm4gcn1mdW5jdGlvbiBrXyhlKXtyZXR1cm4gMTY4NDMwMDkqKChlPSg4NTg5OTM0NTkmKGUtPWU+PjEmMTQzMTY1NTc2NSkpKyhlPj4yJjg1ODk5MzQ1OSkpKyhlPj40KSYyNTI2NDUxMzUpPj4+MjR9ZnVuY3Rpb24gU18oZSx0KXt2YXIgbj10Lmwscj0xMjcmZVtuXTtlOmlmKGVbbisrXT49MTI4KXtpZihyfD0oMTI3JmVbbl0pPDw3LGVbbisrXTwxMjgpYnJlYWsgZTtpZihyfD0oMTI3JmVbbl0pPDwxNCxlW24rK108MTI4KWJyZWFrIGU7aWYocnw9KDEyNyZlW25dKTw8MjEsZVtuKytdPDEyOClicmVhayBlO2lmKHIrPSgxMjcmZVtuXSkqTWF0aC5wb3coMiwyOCksKytuLGVbbisrXTwxMjgpYnJlYWsgZTtpZihyKz0oMTI3JmVbbl0pKk1hdGgucG93KDIsMzUpLCsrbixlW24rK108MTI4KWJyZWFrIGU7aWYocis9KDEyNyZlW25dKSpNYXRoLnBvdygyLDQyKSwrK24sZVtuKytdPDEyOClicmVhayBlfXJldHVybiB0Lmw9bixyfWZ1bmN0aW9uIENfKGUpe3ZhciB0PTAsbj0xMjcmZVt0XTtyZXR1cm4gZVt0KytdPDEyOD9uOihufD0oMTI3JmVbdF0pPDw3LGVbdCsrXTwxMjg/bjoobnw9KDEyNyZlW3RdKTw8MTQsZVt0KytdPDEyOD9uOihufD0oMTI3JmVbdF0pPDwyMSxlW3QrK108MTI4P246bnw9KDE1JmVbdF0pPDwyOCkpKX1mdW5jdGlvbiBGXyhlKXtmb3IodmFyIHQ9W10sbj17bDowfTtuLmw8ZS5sZW5ndGg7KXt2YXIgcixpPW4ubCxhPVNfKGUsbiksbz03JmE7YT1hLzh8MDt2YXIgYz1uLmw7c3dpdGNoKG8pe2Nhc2UgMDpmb3IoO2VbYysrXT49MTI4Oyk7cj1lW19fXShuLmwsYyksbi5sPWM7YnJlYWs7Y2FzZSAxOnI9ZVtfX10oYyxjKzgpLG4ubD1jKzg7YnJlYWs7Y2FzZSAyOnZhciBzPVNfKGUsbik7cj1lW19fXShuLmwsbi5sK3MpLG4ubCs9czticmVhaztjYXNlIDU6cj1lW19fXShjLGMrNCksbi5sPWMrNDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiUEIgVHlwZSAiLmNvbmNhdChvLCIgZm9yIEZpZWxkICIpLmNvbmNhdChhLCIgYXQgb2Zmc2V0ICIpLmNvbmNhdChpKSl9dmFyIGw9e2RhdGE6cix0eXBlOm99O251bGw9PXRbYV0mJih0W2FdPVtdKSx0W2FdLnB1c2gobCl9cmV0dXJuIHR9ZnVuY3Rpb24gT18oZSx0KXtyZXR1cm4obnVsbD09ZT92b2lkIDA6ZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB0KGUuZGF0YSl9KSkpfHxbXX1mdW5jdGlvbiBJXyhlLHQpe2lmKDAhPWUpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIFNuYXBweSBjaHVuayB0eXBlICIuY29uY2F0KGUpKTtmb3IodmFyIG49e2w6MH0scj1TXyh0LG4pLGk9W10sYT1uLmw7YTx0Lmxlbmd0aDspe3ZhciBvPTMmdFthXTtpZigwIT1vKXt2YXIgYz0wLHM9MDtpZigxPT1vPyhzPTQrKHRbYV0+PjImNyksYz0oMjI0JnRbYSsrXSk8PDMsY3w9dFthKytdKToocz0xKyh0W2ErK10+PjIpLDI9PW8/KGM9dFthXXx0W2ErMV08PDgsYSs9Mik6KGM9KHRbYV18dFthKzFdPDw4fHRbYSsyXTw8MTZ8dFthKzNdPDwyNCk+Pj4wLGErPTQpKSwwPT1jKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBvZmZzZXQgMCIpO2Zvcih2YXIgbD1pLmxlbmd0aC0xLHU9YztsPj0wJiZ1Pj1pW2xdLmxlbmd0aDspdS09aVtsXS5sZW5ndGgsLS1sO2lmKGw8MCl7aWYoMCE9dSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgb2Zmc2V0IGJleW9uZCBsZW5ndGgiKTt1PWlbbD0wXS5sZW5ndGh9aWYoczx1KWkucHVzaChpW2xdW19fXShpW2xdLmxlbmd0aC11LGlbbF0ubGVuZ3RoLXUrcykpO2Vsc2V7Zm9yKHU+MCYmKGkucHVzaChpW2xdW19fXShpW2xdLmxlbmd0aC11KSkscy09dSksKytsO3M+PWlbbF0ubGVuZ3RoOylpLnB1c2goaVtsXSkscy09aVtsXS5sZW5ndGgsKytsO3MmJmkucHVzaChpW2xdW19fXSgwLHMpKX1pLmxlbmd0aD4yNSYmKGk9W0FfKGkpXSl9ZWxzZXt2YXIgZj10W2ErK10+PjI7aWYoZjw2MCkrK2Y7ZWxzZXt2YXIgZD1mLTU5O2Y9dFthXSxkPjEmJihmfD10W2ErMV08PDgpLGQ+MiYmKGZ8PXRbYSsyXTw8MTYpLGQ+MyYmKGZ8PXRbYSszXTw8MjQpLGY+Pj49MCxmKyssYSs9ZH1pLnB1c2godFtfX10oYSxhK2YpKSxhKz1mfX1mb3IodmFyIGg9MCxwPTA7cDxpLmxlbmd0aDsrK3ApaCs9aVtwXS5sZW5ndGg7aWYoaCE9cil0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgbGVuZ3RoOiAiLmNvbmNhdChoLCIgIT0gIikuY29uY2F0KHIpKTtyZXR1cm4gaX12YXIgUl89ZnVuY3Rpb24oKXtyZXR1cm57c3N0OltdLHJzc3Q6W10sb2ZtdDpbXSxuZm10OltdLGZtbGE6W10sZmVycjpbXSxjbW50OltdfX07ZnVuY3Rpb24gTl8oZSx0LG4scixpKXt2YXIgYSxvLGMscyxsPTI1NSZ0LHU9dD4+OCxmPXU+PTU/aTpyO2U6aWYobiYodT40Pzg6NCkmJiJuIj09ZS50JiY3PT1sKXt2YXIgZD0obnVsbD09KGE9Zls3XSk/dm9pZCAwOmFbMF0pP0NfKGZbN11bMF0uZGF0YSk6LTE7aWYoLTE9PWQpYnJlYWsgZTt2YXIgaD0obnVsbD09KG89ZlsxNV0pP3ZvaWQgMDpvWzBdKT9DXyhmWzE1XVswXS5kYXRhKTotMSxwPShudWxsPT0oYz1mWzE2XSk/dm9pZCAwOmNbMF0pP0NfKGZbMTZdWzBdLmRhdGEpOi0xLGc9KG51bGw9PShzPWZbNDBdKT92b2lkIDA6c1swXSk/Q18oZls0MF1bMF0uZGF0YSk6LTEsbT1lLnYsYj1tO3Q6aWYoZyl7aWYoMD09bSl7aD1wPTI7YnJlYWsgdH1oPW0+PTYwNDgwMD8xOm0+PTg2NDAwPzI6bT49MzYwMD80Om0+PTYwPzg6bT49MT8xNjozMixNYXRoLmZsb29yKG0pIT1tP3A9MzI6bSU2MD9wPTE2Om0lMzYwMD9wPTg6bSU4NjQwMD9wPTQ6bSU2MDQ4MDAmJihwPTIpLHA8aCYmKHA9aCl9aWYoLTE9PWh8fC0xPT1wKWJyZWFrIGU7dmFyIHk9W10sdj1bXTsxPT1oJiYoYj1tLzYwNDgwMCwxPT1wP3YucHVzaCgnZCJkIicpOm0tPTYwNDgwMCooYnw9MCkseS5wdXNoKGIrKDI9PWQ/IiB3ZWVrIisoMT09Yj8iIjoicyIpOjE9PWQ/InciOiIiKSkpLGg8PTImJnA+PTImJihiPW0vODY0MDAscD4yJiYobS09ODY0MDAqKGJ8PTApKSx2LnB1c2goJ2QiZCInKSx5LnB1c2goYisoMj09ZD8iIGRheSIrKDE9PWI/IiI6InMiKToxPT1kPyJkIjoiIikpKSxoPD00JiZwPj00JiYoYj1tLzM2MDAscD40JiYobS09MzYwMCooYnw9MCkpLHYucHVzaCgoaD49ND8iW2hdIjoiaCIpKyciaCInKSx5LnB1c2goYisoMj09ZD8iIGhvdXIiKygxPT1iPyIiOiJzIik6MT09ZD8iaCI6IiIpKSksaDw9OCYmcD49OCYmKGI9bS82MCxwPjgmJihtLT02MCooYnw9MCkpLHYucHVzaCgoaD49OD8iW21dIjoibSIpKycibSInKSwwPT1kP3kucHVzaCgoOD09aCYmOD09cHx8Yj49MTA/IiI6IjAiKStiKTp5LnB1c2goYisoMj09ZD8iIG1pbnV0ZSIrKDE9PWI/IiI6InMiKToxPT1kPyJtIjoiIikpKSxoPD0xNiYmcD49MTYmJihiPW0scD4xNiYmKG0tPWJ8PTApLHYucHVzaCgoaD49MTY/IltzXSI6InMiKSsnInMiJyksMD09ZD95LnB1c2goKDE2PT1wJiYxNj09aHx8Yj49MTA/IiI6IjAiKStiKTp5LnB1c2goYisoMj09ZD8iIHNlY29uZCIrKDE9PWI/IiI6InMiKToxPT1kPyJzIjoiIikpKSxwPj0zMiYmKGI9TWF0aC5yb3VuZCgxZTMqbSksaDwzMiYmdi5wdXNoKCcuMDAwIm1zIicpLDA9PWQ/eS5wdXNoKChiPj0xMDA/IiI6Yj49MTA/IjAiOiIwMCIpK2IpOnkucHVzaChiKygyPT1kPyIgbWlsbGlzZWNvbmQiKygxPT1iPyIiOiJzIik6MT09ZD8ibXMiOiIiKSkpLGUudz15LmpvaW4oMD09ZD8iOiI6IiAiKSxlLno9di5qb2luKDA9PWQ/JyI6Iic6IiAiKSwwPT1kJiYoZS53PWUudy5yZXBsYWNlKC86KFxkXGRcZCkkLywiLiQxIikpfX1mdW5jdGlvbiBQXyhlLHQsbil7dmFyIHI9RV8oZSk7ci5nZXRVaW50MzIoNCwhMCk7dmFyIGksYT1yLmdldFVpbnQzMig4LCEwKSxvPTEyLGM9LTEscz0tMSxsPS0xLHU9TmFOLGY9TmFOLGQ9MCxoPW5ldyBEYXRlKERhdGUuVVRDKDIwMDEsMCwxKSk7MSZhJiYodT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0oMTI3JmVbdCsxNV0pPDw3fGVbdCsxNF0+PjEscj0xJmVbdCsxNF0saT10KzEzO2k+PXQ7LS1pKXI9MjU2KnIrZVtpXTtyZXR1cm4oMTI4JmVbdCsxNV0/LXI6cikqTWF0aC5wb3coMTAsbi02MTc2KX0oZSxvKSxvKz0xNiksMiZhJiYoZj1yLmdldEZsb2F0NjQobywhMCksbys9OCksNCZhJiYoaC5zZXRUaW1lKGguZ2V0VGltZSgpKzFlMyooZD1yLmdldEZsb2F0NjQobywhMCkpKSxvKz04KSw4JmEmJihzPXIuZ2V0VWludDMyKG8sITApLG8rPTQpLDE2JmEmJihjPXIuZ2V0VWludDMyKG8sITApLG8rPTQpLG8rPTQqa18oNDgwJmEpLDUxMiZhJiYoci5nZXRVaW50MzIobywhMCksbys9NCksbys9NCprXygxMDI0JmEpLDIwNDgmYSYmKHIuZ2V0VWludDMyKG8sITApLG8rPTQpO3ZhciBwPWVbMV07c3dpdGNoKHApe2Nhc2UgMDppPXt0OiJ6In07YnJlYWs7Y2FzZSAyOmNhc2UgMTA6aT17dDoibiIsdjp1fTticmVhaztjYXNlIDM6aT17dDoicyIsdjp0LnNzdFtzXX07YnJlYWs7Y2FzZSA1Omk9KG51bGw9PW4/dm9pZCAwOm4uY2VsbERhdGVzKT97dDoiZCIsdjpofTp7dDoibiIsdjpkLzg2NDAwKzM1NDMwLHo6Z21bMTRdfTticmVhaztjYXNlIDY6aT17dDoiYiIsdjpmPjB9O2JyZWFrO2Nhc2UgNzppPXt0OiJuIix2OmZ9O2JyZWFrO2Nhc2UgODppPXt0OiJlIix2OjB9O2JyZWFrO2Nhc2UgOTppZighKGM+LTEpKXRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgY2VsbCB0eXBlICIuY29uY2F0KGVbMV0sIiA6ICIpLmNvbmNhdCgzMSZhLCIgOiAiKS5jb25jYXQoZVtfX10oMCw0KSkpO3ZhciBnPXQucnNzdFtjXTtpPXt0OiJzIix2Omcudn0sZy5sJiYoaS5sPXtUYXJnZXQ6Zy5sfSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGNlbGwgdHlwZSAiLmNvbmNhdChlWzFdLCIgOiAiKS5jb25jYXQoMzEmYSwiIDogIikuY29uY2F0KGVbX19dKDAsNCkpKX1pZihvKz00KmtfKDQwOTYmYSksNTE2MDk2JmEmJigtMT09bCYmKGw9ci5nZXRVaW50MzIobywhMCkpLG8rPTQpLDUyNDI4OCZhKXt2YXIgbT1yLmdldFVpbnQzMihvLCEwKTtvKz00LHQuY21udFttXSYmKGkuYz1mdW5jdGlvbihlKXt2YXIgdD1bXTt0LnB1c2goe3Q6ZS50fHwiIixhOmUuYSxUOmUucmVwbGllcyYmZS5yZXBsaWVzLmxlbmd0aD4wfSksZS5yZXBsaWVzJiZlLnJlcGxpZXMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5wdXNoKHt0OmUudHx8IiIsYTplLmEsVDohMH0pfSkpO3JldHVybiB0fSh0LmNtbnRbbV0pKX1yZXR1cm4gbD4tMSYmTl8oaSwxMjgwfHAsYT4+MTMsdC5vZm10W2xdLHQubmZtdFtsXSksNz09cCYmKGkudi89ODY0MDApLGl9ZnVuY3Rpb24gQl8oZSx0LG4pe3N3aXRjaChlWzBdKXtjYXNlIDA6Y2FzZSAxOmNhc2UgMjpjYXNlIDM6Y2FzZSA0OnJldHVybiBmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxhPUVfKGUpLG89YS5nZXRVaW50MzIoNCwhMCksYz0tMSxzPS0xLGw9LTEsdT1OYU4sZj0wLGQ9bmV3IERhdGUoRGF0ZS5VVEMoMjAwMSwwLDEpKSxoPW4+MT8xMjo4OzImbyYmKGw9YS5nZXRVaW50MzIoaCwhMCksaCs9NCksaCs9NCprXyhvJihuPjE/MzQ2ODozOTYpKSw1MTImbyYmKGM9YS5nZXRVaW50MzIoaCwhMCksaCs9NCksaCs9NCprXyhvJihuPjE/MTIyODg6NDA5NikpLDE2Jm8mJihzPWEuZ2V0VWludDMyKGgsITApLGgrPTQpLDMyJm8mJih1PWEuZ2V0RmxvYXQ2NChoLCEwKSxoKz04KSw2NCZvJiYoZC5zZXRUaW1lKGQuZ2V0VGltZSgpKzFlMyooZj1hLmdldEZsb2F0NjQoaCwhMCkpKSxoKz04KSxuPjEmJjI1NSYobz1hLmdldFVpbnQzMig4LCEwKT4+PjE2KSYmKC0xPT1sJiYobD1hLmdldFVpbnQzMihoLCEwKSksaCs9NCk7dmFyIHA9ZVtuPj00PzE6Ml07c3dpdGNoKHApe2Nhc2UgMDpyZXR1cm47Y2FzZSAyOmNhc2UgNzppPXt0OiJuIix2OnV9O2JyZWFrO2Nhc2UgMzppPXt0OiJzIix2OnQuc3N0W3NdfTticmVhaztjYXNlIDU6aT0obnVsbD09cj92b2lkIDA6ci5jZWxsRGF0ZXMpP3t0OiJkIix2OmR9Ont0OiJuIix2OmYvODY0MDArMzU0MzAsejpnbVsxNF19O2JyZWFrO2Nhc2UgNjppPXt0OiJiIix2OnU+MH07YnJlYWs7Y2FzZSA4Omk9e3Q6ImUiLHY6MH07YnJlYWs7Y2FzZSA5OmlmKCEoYz4tMSkpdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBjZWxsIHR5cGUgIi5jb25jYXQoZVtfX10oMCw0KSkpO3ZhciBnPXQucnNzdFtjXTtpPXt0OiJzIix2Omcudn0sZy5sJiYoaS5sPXtUYXJnZXQ6Zy5sfSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGNlbGwgdHlwZSAiLmNvbmNhdChlW19fXSgwLDQpKSl9cmV0dXJuIGw+LTEmJk5fKGkscHxuPDw4LG8sdC5vZm10W2xdLHQubmZtdFtsXSksNz09cCYmKGkudi89ODY0MDApLGl9KGUsdCxlWzBdLG4pO2Nhc2UgNTpyZXR1cm4gUF8oZSx0LG4pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBwYXlsb2FkIHZlcnNpb24gIi5jb25jYXQoZVswXSkpfX1mdW5jdGlvbiBXXyhlKXtyZXR1cm4gQ18oRl8oZSlbMV1bMF0uZGF0YSl9ZnVuY3Rpb24gTF8oZSx0KXt2YXIgbj1GXyh0LmRhdGEpLHI9Q18oblsxXVswXS5kYXRhKSxpPW5bM10sYT1bXTtyZXR1cm4oaXx8W10pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuLGksbz1GXyh0LmRhdGEpO2lmKG9bMV0pe3ZhciBjPUNfKG9bMV1bMF0uZGF0YSk+Pj4wO3N3aXRjaChyKXtjYXNlIDE6YVtjXT1VXyhvWzNdWzBdLmRhdGEpO2JyZWFrO2Nhc2UgODp2YXIgcz1GXyhlW1dfKG9bOV1bMF0uZGF0YSldWzBdLmRhdGEpLGw9ZVtXXyhzWzFdWzBdLmRhdGEpXVswXSx1PUNfKGwubWV0YVsxXVswXS5kYXRhKTtpZigyMDAxIT11KXRocm93IG5ldyBFcnJvcigiMjAwMCB1bmV4cGVjdGVkIHJlZmVyZW5jZSB0byAiLmNvbmNhdCh1KSk7dmFyIGY9Rl8obC5kYXRhKSxkPXt2OmZbM10ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gVV8oZS5kYXRhKX0pKS5qb2luKCIiKX07YVtjXT1kO2U6aWYobnVsbD09KG49bnVsbD09Zj92b2lkIDA6ZlsxMV0pP3ZvaWQgMDpuWzBdKXt2YXIgaD1udWxsPT0oaT1GXyhmWzExXVswXS5kYXRhKSk/dm9pZCAwOmlbMV07aWYoIWgpYnJlYWsgZTtoLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuLHIsaSxhPUZfKHQuZGF0YSk7aWYobnVsbD09KG49YVsyXSk/dm9pZCAwOm5bMF0pe3ZhciBvPWVbV18obnVsbD09KHI9YVsyXSk/dm9pZCAwOnJbMF0uZGF0YSldWzBdLGM9Q18oby5tZXRhWzFdWzBdLmRhdGEpO3N3aXRjaChjKXtjYXNlIDIwMzI6dmFyIHM9Rl8oby5kYXRhKTsobnVsbD09KGk9bnVsbD09cz92b2lkIDA6c1syXSk/dm9pZCAwOmlbMF0pJiYhZC5sJiYoZC5sPVVfKHNbMl1bMF0uZGF0YSkpO2JyZWFrO2Nhc2UgMjAzOTpicmVhaztkZWZhdWx0OmNvbnNvbGUubG9nKCJ1bnJlY29nbml6ZWQgT2JqZWN0QXR0cmlidXRlIHR5cGUgIi5jb25jYXQoYykpfX19KSl9YnJlYWs7Y2FzZSAyOmFbY109Rl8ob1s2XVswXS5kYXRhKTticmVhaztjYXNlIDM6YVtjXT1GXyhvWzVdWzBdLmRhdGEpO2JyZWFrO2Nhc2UgMTA6dmFyIHA9ZVtXXyhvWzEwXVswXS5kYXRhKV1bMF07YVtjXT1qXyhlLHAuZGF0YSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyByfX19KSksYX1mdW5jdGlvbiBNXyhlLHQpe3ZhciBuLHI9Rl8odC5kYXRhKSxpPS0xOyhudWxsPT0obj1udWxsPT1yP3ZvaWQgMDpyWzddKT92b2lkIDA6blswXSkmJihpPUNfKHJbN11bMF0uZGF0YSk+Pj4wPzE6MCk7dmFyIGE9T18ocls1XSwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLGEsbyxjLHMsbCx1LGYsZCxoLHAsZyxtLGIseT1GXyhlKSx2PUNfKHlbMV1bMF0uZGF0YSk+Pj4wLHg9Q18oeVsyXVswXS5kYXRhKT4+PjAsRD0obnVsbD09KHI9bnVsbD09KG49eVs4XSk/dm9pZCAwOm5bMF0pP3ZvaWQgMDpyLmRhdGEpJiZDXyh5WzhdWzBdLmRhdGEpPjB8fCExO2lmKChudWxsPT0oYT1udWxsPT0oaT15WzddKT92b2lkIDA6aVswXSk/dm9pZCAwOmEuZGF0YSkmJjAhPXQpbT1udWxsPT0oYz1udWxsPT0obz15WzddKT92b2lkIDA6b1swXSk/dm9pZCAwOmMuZGF0YSxiPW51bGw9PShsPW51bGw9PShzPXlbNl0pP3ZvaWQgMDpzWzBdKT92b2lkIDA6bC5kYXRhO2Vsc2V7aWYoIShudWxsPT0oZj1udWxsPT0odT15WzRdKT92b2lkIDA6dVswXSk/dm9pZCAwOmYuZGF0YSl8fDE9PXQpdGhyb3ciTlVNQkVSUyBUaWxlIG1pc3NpbmcgIi5jb25jYXQodCwiIGNlbGwgc3RvcmFnZSIpO209bnVsbD09KGg9bnVsbD09KGQ9eVs0XSk/dm9pZCAwOmRbMF0pP3ZvaWQgMDpoLmRhdGEsYj1udWxsPT0oZz1udWxsPT0ocD15WzNdKT92b2lkIDA6cFswXSk/dm9pZCAwOmcuZGF0YX1mb3IodmFyIFQ9RD80OjEsdz1FXyhtKSxfPVtdLEU9MDtFPG0ubGVuZ3RoLzI7KytFKXt2YXIgVT13LmdldFVpbnQxNigyKkUsITApO1U8NjU1MzUmJl8ucHVzaChbRSxVXSl9aWYoXy5sZW5ndGghPXgpdGhyb3ciRXhwZWN0ZWQgIi5jb25jYXQoeCwiIGNlbGxzLCBmb3VuZCAiKS5jb25jYXQoXy5sZW5ndGgpO3ZhciBBPVtdO2ZvcihFPTA7RTxfLmxlbmd0aC0xOysrRSlBW19bRV1bMF1dPWJbX19dKF9bRV1bMV0qVCxfW0UrMV1bMV0qVCk7cmV0dXJuIF8ubGVuZ3RoPj0xJiYoQVtfW18ubGVuZ3RoLTFdWzBdXT1iW19fXShfW18ubGVuZ3RoLTFdWzFdKlQpKSx7Ujp2LGNlbGxzOkF9fShlLGkpfSkpO3JldHVybntucm93czpDXyhyWzRdWzBdLmRhdGEpPj4+MCxkYXRhOmEucmVkdWNlKChmdW5jdGlvbihlLHQpe3JldHVybiBlW3QuUl18fChlW3QuUl09W10pLHQuY2VsbHMuZm9yRWFjaCgoZnVuY3Rpb24obixyKXtpZihlW3QuUl1bcl0pdGhyb3cgbmV3IEVycm9yKCJEdXBsaWNhdGUgY2VsbCByPSIuY29uY2F0KHQuUiwiIGM9IikuY29uY2F0KHIpKTtlW3QuUl1bcl09bn0pKSxlfSksW10pfX1mdW5jdGlvbiBqXyhlLHQpe3ZhciBuLHIsaSxhLG8sYyxzLGwsdSxmLGQ9e3Q6IiIsYToiIn0saD1GXyh0KTtpZigobnVsbD09KHI9bnVsbD09KG49bnVsbD09aD92b2lkIDA6aFsxXSk/dm9pZCAwOm5bMF0pP3ZvaWQgMDpyLmRhdGEpJiYoZC50PVVfKG51bGw9PShhPW51bGw9PShpPW51bGw9PWg/dm9pZCAwOmhbMV0pP3ZvaWQgMDppWzBdKT92b2lkIDA6YS5kYXRhKXx8IiIpLG51bGw9PShjPW51bGw9PShvPW51bGw9PWg/dm9pZCAwOmhbM10pP3ZvaWQgMDpvWzBdKT92b2lkIDA6Yy5kYXRhKXt2YXIgcD1GXyhlW1dfKG51bGw9PShsPW51bGw9PShzPW51bGw9PWg/dm9pZCAwOmhbM10pP3ZvaWQgMDpzWzBdKT92b2lkIDA6bC5kYXRhKV1bMF0uZGF0YSk7KG51bGw9PShmPW51bGw9PSh1PXBbMV0pP3ZvaWQgMDp1WzBdKT92b2lkIDA6Zi5kYXRhKSYmKGQuYT1VXyhwWzFdWzBdLmRhdGEpKX1yZXR1cm4obnVsbD09aD92b2lkIDA6aFs0XSkmJihkLnJlcGxpZXM9W10saFs0XS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj1lW1dfKHQuZGF0YSldWzBdO2QucmVwbGllcy5wdXNoKGpfKGUsbi5kYXRhKSl9KSkpLGR9ZnVuY3Rpb24gel8oZSx0LG4pe3ZhciByPUZfKHQuZGF0YSksaT17IiFyZWYiOiJBMSJ9OyhudWxsPT1uP3ZvaWQgMDpuLmRlbnNlKSYmKGlbIiFkYXRhIl09W10pO3ZhciBhPWVbV18oclsyXVswXS5kYXRhKV0sbz1DXyhhWzBdLm1ldGFbMV1bMF0uZGF0YSk7aWYoNjAwMSE9byl0aHJvdyBuZXcgRXJyb3IoIjYwMDAgdW5leHBlY3RlZCByZWZlcmVuY2UgdG8gIi5jb25jYXQobykpO3JldHVybiBmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxhLG8sYyxzLGwsdSxmLGQsaCxwPUZfKHQuZGF0YSksZz17czp7cjowLGM6MH0sZTp7cjowLGM6MH19O2lmKGcuZS5yPShDXyhwWzZdWzBdLmRhdGEpPj4+MCktMSxnLmUucjwwKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCByb3cgdmFyaW50ICIuY29uY2F0KHBbNl1bMF0uZGF0YSkpO2lmKGcuZS5jPShDXyhwWzddWzBdLmRhdGEpPj4+MCktMSxnLmUuYzwwKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2wgdmFyaW50ICIuY29uY2F0KHBbN11bMF0uZGF0YSkpO25bIiFyZWYiXT1zdihnKTt2YXIgbT1udWxsIT1uWyIhZGF0YSJdLGI9bix5PUZfKHBbNF1bMF0uZGF0YSksdj1SXygpOyhudWxsPT0oaT15WzRdKT92b2lkIDA6aVswXSkmJih2LnNzdD1MXyhlLGVbV18oeVs0XVswXS5kYXRhKV1bMF0pKSwobnVsbD09KGE9eVs2XSk/dm9pZCAwOmFbMF0pJiYodi5mbWxhPUxfKGUsZVtXXyh5WzZdWzBdLmRhdGEpXVswXSkpLChudWxsPT0obz15WzExXSk/dm9pZCAwOm9bMF0pJiYodi5vZm10PUxfKGUsZVtXXyh5WzExXVswXS5kYXRhKV1bMF0pKSwobnVsbD09KGM9eVsxMl0pP3ZvaWQgMDpjWzBdKSYmKHYuZmVycj1MXyhlLGVbV18oeVsxMl1bMF0uZGF0YSldWzBdKSksKG51bGw9PShzPXlbMTddKT92b2lkIDA6c1swXSkmJih2LnJzc3Q9TF8oZSxlW1dfKHlbMTddWzBdLmRhdGEpXVswXSkpLChudWxsPT0obD15WzE5XSk/dm9pZCAwOmxbMF0pJiYodi5jbW50PUxfKGUsZVtXXyh5WzE5XVswXS5kYXRhKV1bMF0pKSwobnVsbD09KHU9eVsyMl0pP3ZvaWQgMDp1WzBdKSYmKHYubmZtdD1MXyhlLGVbV18oeVsyMl1bMF0uZGF0YSldWzBdKSk7dmFyIHg9Rl8oeVszXVswXS5kYXRhKSxEPTA7aWYoIShudWxsPT0oZj15WzldKT92b2lkIDA6ZlswXSkpdGhyb3ciTlVNQkVSUyBmaWxlIG1pc3Npbmcgcm93IHRyZWUiO2lmKEZfKHlbOV1bMF0uZGF0YSlbMV0ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gRl8oZS5kYXRhKX0pKS5mb3JFYWNoKChmdW5jdGlvbih0KXtEPUNfKHRbMV1bMF0uZGF0YSk7dmFyIGk9Q18odFsyXVswXS5kYXRhKSxhPXhbMV1baV07aWYoIWEpdGhyb3ciTlVNQkVSUyBtaXNzaW5nIHRpbGUgIitpO3ZhciBvPUZfKGEuZGF0YSksYz1lW1dfKG9bMl1bMF0uZGF0YSldWzBdLHM9Q18oYy5tZXRhWzFdWzBdLmRhdGEpO2lmKDYwMDIhPXMpdGhyb3cgbmV3IEVycm9yKCI2MDAxIHVuZXhwZWN0ZWQgcmVmZXJlbmNlIHRvICIuY29uY2F0KHMpKTt2YXIgbD1NXygwLGMpO2wuZGF0YS5mb3JFYWNoKChmdW5jdGlvbihlLHQpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSxpKXt2YXIgYT1CXyhlLHYscik7YSYmKG0/KGJbIiFkYXRhIl1bRCt0XXx8KGJbIiFkYXRhIl1bRCt0XT1bXSksYlsiIWRhdGEiXVtEK3RdW2ldPWEpOm5baXYoaSkrbnYoRCt0KV09YSl9KSl9KSksRCs9bC5ucm93c30pKSxudWxsPT0oZD15WzEzXSk/dm9pZCAwOmRbMF0pe3ZhciBUPWVbV18oeVsxM11bMF0uZGF0YSldWzBdLHc9Q18oVC5tZXRhWzFdWzBdLmRhdGEpO2lmKDYxNDQhPXcpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBtZXJnZSB0eXBlIDYxNDQsIGZvdW5kICIuY29uY2F0KHcpKTtuWyIhbWVyZ2VzIl09bnVsbD09KGg9Rl8oVC5kYXRhKSk/dm9pZCAwOmhbMV0ubWFwKChmdW5jdGlvbihlKXt2YXIgdD1GXyhlLmRhdGEpLG49RV8oRl8odFsxXVswXS5kYXRhKVsxXVswXS5kYXRhKSxyPUVfKEZfKHRbMl1bMF0uZGF0YSlbMV1bMF0uZGF0YSk7cmV0dXJue3M6e3I6bi5nZXRVaW50MTYoMCwhMCksYzpuLmdldFVpbnQxNigyLCEwKX0sZTp7cjpuLmdldFVpbnQxNigwLCEwKStyLmdldFVpbnQxNigwLCEwKS0xLGM6bi5nZXRVaW50MTYoMiwhMCkrci5nZXRVaW50MTYoMiwhMCktMX19fSkpfX0oZSxhWzBdLGksbiksaX1mdW5jdGlvbiBIXyhlLHQsbil7dmFyIHIsaT1sRSgpO2kuV29ya2Jvb2s9e1dCUHJvcHM6e2RhdGUxOTA0OiEwfX07dmFyIGE9Rl8odC5kYXRhKTtpZihudWxsPT0ocj1hWzJdKT92b2lkIDA6clswXSl0aHJvdyBuZXcgRXJyb3IoIktleW5vdGUgcHJlc2VudGF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpO2lmKE9fKGFbMV0sV18pLmZvckVhY2goKGZ1bmN0aW9uKHQpe2VbdF0uZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoMj09Q18odC5tZXRhWzFdWzBdLmRhdGEpKXt2YXIgcj1mdW5jdGlvbihlLHQsbil7dmFyIHIsaT1GXyh0LmRhdGEpLGE9e25hbWU6KG51bGw9PShyPWlbMV0pP3ZvaWQgMDpyWzBdKT9VXyhpWzFdWzBdLmRhdGEpOiIiLHNoZWV0czpbXX07cmV0dXJuIE9fKGlbMl0sV18pLmZvckVhY2goKGZ1bmN0aW9uKHQpe2VbdF0uZm9yRWFjaCgoZnVuY3Rpb24odCl7NmUzPT1DXyh0Lm1ldGFbMV1bMF0uZGF0YSkmJmEuc2hlZXRzLnB1c2goel8oZSx0LG4pKX0pKX0pKSxhfShlLHQsbik7ci5zaGVldHMuZm9yRWFjaCgoZnVuY3Rpb24oZSx0KXt1RShpLGUsMD09dD9yLm5hbWU6ci5uYW1lKyJfIit0LCEwKX0pKX19KSl9KSksMD09aS5TaGVldE5hbWVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkVtcHR5IE5VTUJFUlMgZmlsZSIpO3JldHVybiBpLmJvb2tUeXBlPSJudW1iZXJzIixpfWZ1bmN0aW9uIFZfKGUsdCl7dmFyIG4scixpLGEsbyxjLHMsbD17fSx1PVtdO2lmKGUuRnVsbFBhdGhzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKGUubWF0Y2goL1wuaXdwdjIvKSl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHBhc3N3b3JkIHByb3RlY3Rpb24iKX0pKSxlLkZpbGVJbmRleC5mb3JFYWNoKChmdW5jdGlvbihlKXtpZihlLm5hbWUubWF0Y2goL1wuaXdhJC8pJiYwPT1lLmNvbnRlbnRbMF0pe3ZhciB0LG47dHJ5e3Q9ZnVuY3Rpb24oZSl7QXJyYXkuaXNBcnJheShlKSYmKGU9bmV3IFVpbnQ4QXJyYXkoZSkpO2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDspe3ZhciByPWVbbisrXSxpPWVbbl18ZVtuKzFdPDw4fGVbbisyXTw8MTY7bis9Myx0LnB1c2guYXBwbHkodCxJXyhyLGVbX19dKG4sbitpKSkpLG4rPWl9aWYobiE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3QgYSB2YWxpZCBmcmFtZWQgc3RyZWFtISIpO3JldHVybiAxPT10Lmxlbmd0aD90WzBdOkFfKHQpfShlLmNvbnRlbnQpfWNhdGNoKHQpe3JldHVybiBjb25zb2xlLmxvZygiPz8gIitlLmNvbnRlbnQubGVuZ3RoKyIgIisodC5tZXNzYWdlfHx0KSl9dHJ5e249ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49W10scj17bDowfTtyLmw8ZS5sZW5ndGg7KXt2YXIgaT1TXyhlLHIpLGE9Rl8oZVtfX10oci5sLHIubCtpKSk7ci5sKz1pO3ZhciBvPXtpZDpDXyhhWzFdWzBdLmRhdGEpLG1lc3NhZ2VzOltdfTthWzJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPUZfKHQuZGF0YSksaT1DXyhuWzNdWzBdLmRhdGEpO28ubWVzc2FnZXMucHVzaCh7bWV0YTpuLGRhdGE6ZVtfX10oci5sLHIubCtpKX0pLHIubCs9aX0pKSwobnVsbD09KHQ9YVszXSk/dm9pZCAwOnRbMF0pJiYoby5tZXJnZT1DXyhhWzNdWzBdLmRhdGEpPj4+MD4wKSxuLnB1c2gobyl9cmV0dXJuIG59KHQpfWNhdGNoKGUpe3JldHVybiBjb25zb2xlLmxvZygiIyMgIisoZS5tZXNzYWdlfHxlKSl9bi5mb3JFYWNoKChmdW5jdGlvbihlKXtsW2UuaWRdPWUubWVzc2FnZXMsdS5wdXNoKGUuaWQpfSkpfX0pKSwhdS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJGaWxlIGhhcyBubyBtZXNzYWdlcyIpO2lmKChudWxsPT0oaT1udWxsPT0ocj1udWxsPT0obj1udWxsPT1sP3ZvaWQgMDpsWzFdKT92b2lkIDA6blswXS5tZXRhKT92b2lkIDA6clsxXSk/dm9pZCAwOmlbMF0uZGF0YSkmJjFlND09Q18obFsxXVswXS5tZXRhWzFdWzBdLmRhdGEpKXRocm93IG5ldyBFcnJvcigiUGFnZXMgZG9jdW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIik7dmFyIGY9KG51bGw9PShzPW51bGw9PShjPW51bGw9PShvPW51bGw9PShhPW51bGw9PWw/dm9pZCAwOmxbMV0pP3ZvaWQgMDphWzBdKT92b2lkIDA6by5tZXRhKT92b2lkIDA6Y1sxXSk/dm9pZCAwOnNbMF0uZGF0YSkmJjE9PUNfKGxbMV1bMF0ubWV0YVsxXVswXS5kYXRhKSYmbFsxXVswXTtpZihmfHx1LmZvckVhY2goKGZ1bmN0aW9uKGUpe2xbZV0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoMT09Q18oZS5tZXRhWzFdWzBdLmRhdGEpPj4+MCl7aWYoZil0aHJvdyBuZXcgRXJyb3IoIkRvY3VtZW50IGhhcyBtdWx0aXBsZSByb290cyIpO2Y9ZX19KSl9KSksIWYpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBEb2N1bWVudCByb290Iik7cmV0dXJuIEhfKGwsZix0KX1mdW5jdGlvbiBxXyhlKXshZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wO24hPWUubGVuZ3RoOysrbil7dmFyIHI9ZVtuXTt2b2lkIDA9PT10W3JbMF1dJiYodFtyWzBdXT1yWzFdKSwibiI9PT1yWzJdJiYodFtyWzBdXT1OdW1iZXIodFtyWzBdXSkpfX19KFtbImNlbGxORiIsITFdLFsiY2VsbEhUTUwiLCEwXSxbImNlbGxGb3JtdWxhIiwhMF0sWyJjZWxsU3R5bGVzIiwhMV0sWyJjZWxsVGV4dCIsITBdLFsiY2VsbERhdGVzIiwhMV0sWyJzaGVldFN0dWJzIiwhMV0sWyJzaGVldFJvd3MiLDAsIm4iXSxbImJvb2tEZXBzIiwhMV0sWyJib29rU2hlZXRzIiwhMV0sWyJib29rUHJvcHMiLCExXSxbImJvb2tGaWxlcyIsITFdLFsiYm9va1ZCQSIsITFdLFsicGFzc3dvcmQiLCIiXSxbIldURiIsITFdXSkoZSl9ZnVuY3Rpb24gR18oZSx0LG4scixpLGEsbyxjKXtpZihlJiZlWyIhbGVnZHJhd2VsIl0pe3ZhciBzPUFiKG4sT2IoZVsiIWxlZ2RyYXdlbCJdLlRhcmdldCxyKSwhMCk7cyYmZnVuY3Rpb24oZSx0LG4pe3ZhciByPTA7KGUubWF0Y2gobFQpfHxbXSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIGk9IiIsYT0hMCxvPS0xLGM9LTEscz0tMTtpZihlLnJlcGxhY2UoUGIsKGZ1bmN0aW9uKHQsbil7dmFyIHI9TGIodCk7c3dpdGNoKE1iKHJbMF0pKXtjYXNlIjxDbGllbnREYXRhIjpyLk9iamVjdFR5cGUmJihpPXIuT2JqZWN0VHlwZSk7YnJlYWs7Y2FzZSI8VmlzaWJsZSI6Y2FzZSI8VmlzaWJsZS8+IjphPSExO2JyZWFrO2Nhc2UiPFJvdyI6Y2FzZSI8Um93PiI6Y2FzZSI8Q29sdW1uIjpjYXNlIjxDb2x1bW4+IjpvPW4rdC5sZW5ndGg7YnJlYWs7Y2FzZSI8L1Jvdz4iOmM9K2Uuc2xpY2UobyxuKS50cmltKCk7YnJlYWs7Y2FzZSI8L0NvbHVtbj4iOnM9K2Uuc2xpY2UobyxuKS50cmltKCl9cmV0dXJuIiJ9KSksIk5vdGUiPT09aSl7dmFyIGw9c0UodCxjPj0wJiZzPj0wP292KHtyOmMsYzpzfSk6bltyXS5yZWYpO2wuYyYmKGwuYy5oaWRkZW49YSksKytyfX0pKX0oUWIocyksZSxjfHxbXSl9fWZ1bmN0aW9uIFhfKGUsdCxuLHIsaSxhLG8sYyxzLGwsdSxmKXt0cnl7YVtyXT0kdihBYihlLG4sITApLHQpO3ZhciBkLGg9VWIoZSx0KTtzd2l0Y2goYyl7Y2FzZSJzaGVldCI6ZD1XdyhoLHQsaSxzLGFbcl0sbCx1LGYpO2JyZWFrO2Nhc2UiY2hhcnQiOmlmKCEoZD1MdyhoLHQsaSxzLGFbcl0sbCkpfHwhZFsiIWRyYXdlbCJdKWJyZWFrO3ZhciBwPU9iKGRbIiFkcmF3ZWwiXS5UYXJnZXQsdCksZz1YdihwKSxtPWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuIj8/Ijt2YXIgbj0oZS5tYXRjaCgvPGM6Y2hhcnQgW14+XSpyOmlkPSIoW14iXSopIi8pfHxbIiIsIiJdKVsxXTtyZXR1cm4gdFsiIWlkIl1bbl0uVGFyZ2V0fShBYihlLHAsITApLCR2KEFiKGUsZywhMCkscCkpLGI9T2IobSxwKSx5PVh2KGIpO2Q9VXcoQWIoZSxiLCEwKSwwLDAsJHYoQWIoZSx5LCEwKSxiKSwwLGQpO2JyZWFrO2Nhc2UibWFjcm8iOkQ9dCxhW3JdLEQuc2xpY2UoLTQpLGQ9eyIhdHlwZSI6Im1hY3JvIn07YnJlYWs7Y2FzZSJkaWFsb2ciOmQ9ZnVuY3Rpb24oZSx0LG4scixpLGEsbyxjKXtyZXR1cm4gdC5zbGljZSgtNCkseyIhdHlwZSI6ImRpYWxvZyJ9fSgwLHQsMCwwLGFbcl0pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgc2hlZXQgdHlwZSAiK2MpfW9bcl09ZDt2YXIgdj1bXSx4PVtdO2EmJmFbcl0mJlptKGFbcl0pLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPSIiO2lmKGFbcl1bbl0uVHlwZT09R3YuQ01OVCl7aWYoaT1PYihhW3JdW25dLlRhcmdldCx0KSwhKHY9encoVWIoZSxpLCEwKSxpLHMpKXx8IXYubGVuZ3RoKXJldHVybjt1VChkLHYsITEpfWFbcl1bbl0uVHlwZT09R3YuVENNTlQmJihpPU9iKGFbcl1bbl0uVGFyZ2V0LHQpLHg9eC5jb25jYXQoZnVuY3Rpb24oZSx0KXt2YXIgbj1bXSxyPSExLGk9e30sYT0wO3JldHVybiBlLnJlcGxhY2UoUGIsKGZ1bmN0aW9uKG8sYyl7dmFyIHM9TGIobyk7c3dpdGNoKE1iKHNbMF0pKXtjYXNlIjw/eG1sIjpjYXNlIjxUaHJlYWRlZENvbW1lbnRzIjpjYXNlIjwvVGhyZWFkZWRDb21tZW50cz4iOmNhc2UiPGV4dExzdCI6Y2FzZSI8ZXh0THN0PiI6Y2FzZSI8L2V4dExzdD4iOmNhc2UiPGV4dExzdC8+IjpicmVhaztjYXNlIjx0aHJlYWRlZENvbW1lbnQiOmk9e2F1dGhvcjpzLnBlcnNvbklkLGd1aWQ6cy5pZCxyZWY6cy5yZWYsVDoxfTticmVhaztjYXNlIjwvdGhyZWFkZWRDb21tZW50PiI6bnVsbCE9aS50JiZuLnB1c2goaSk7YnJlYWs7Y2FzZSI8dGV4dD4iOmNhc2UiPHRleHQiOmE9YytvLmxlbmd0aDticmVhaztjYXNlIjwvdGV4dD4iOmkudD1lLnNsaWNlKGEsYykucmVwbGFjZSgvXHJcbi9nLCJcbiIpLnJlcGxhY2UoL1xyL2csIlxuIik7YnJlYWs7Y2FzZSI8bWVudGlvbnMiOmNhc2UiPG1lbnRpb25zPiI6Y2FzZSI8ZXh0IjpyPSEwO2JyZWFrO2Nhc2UiPC9tZW50aW9ucz4iOmNhc2UiPC9leHQ+IjpyPSExO2JyZWFrO2RlZmF1bHQ6aWYoIXImJnQuV1RGKXRocm93IG5ldyBFcnJvcigidW5yZWNvZ25pemVkICIrc1swXSsiIGluIHRocmVhZGVkIGNvbW1lbnRzIil9cmV0dXJuIG99KSksbn0oVWIoZSxpLCEwKSxzKSkpfSkpLHgmJngubGVuZ3RoJiZ1VChkLHgsITAscy5wZW9wbGV8fFtdKSxHXyhkLDAsZSx0LDAsMCwwLHYpfWNhdGNoKGUpe2lmKHMuV1RGKXRocm93IGV9dmFyIER9ZnVuY3Rpb24gJF8oZSl7cmV0dXJuIi8iPT1lLmNoYXJBdCgwKT9lLnNsaWNlKDEpOmV9ZnVuY3Rpb24gWV8oZSx0KXtpZihWbSgpLHFfKHQ9dHx8e30pLF9iKGUsIk1FVEEtSU5GL21hbmlmZXN0LnhtbCIpKXJldHVybiBUXyhlLHQpO2lmKF9iKGUsIm9iamVjdGRhdGEueG1sIikpcmV0dXJuIFRfKGUsdCk7aWYoX2IoZSwiSW5kZXgvRG9jdW1lbnQuaXdhIikpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgVWludDhBcnJheSl0aHJvdyBuZXcgRXJyb3IoIk5VTUJFUlMgZmlsZSBwYXJzaW5nIHJlcXVpcmVzIFVpbnQ4QXJyYXkgc3VwcG9ydCIpO2lmKHZvaWQgMCE9PVZfKXtpZihlLkZpbGVJbmRleClyZXR1cm4gVl8oZSx0KTt2YXIgbj1LbS51dGlscy5jZmJfbmV3KCk7cmV0dXJuIFNiKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe0NiKG4sdCxrYihlLHQpKX0pKSxWXyhuLHQpfXRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgTlVNQkVSUyBmaWxlIil9aWYoIV9iKGUsIltDb250ZW50X1R5cGVzXS54bWwiKSl7aWYoX2IoZSwiaW5kZXgueG1sLmd6IikpdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBOVU1CRVJTIDA4IGZpbGUiKTtpZihfYihlLCJpbmRleC54bWwiKSl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIE5VTUJFUlMgMDkgZmlsZSIpO3ZhciByPUttLmZpbmQoZSwiSW5kZXguemlwIik7aWYocilyZXR1cm4gZGVsZXRlKHQ9dWIodCkpLnR5cGUsInN0cmluZyI9PXR5cGVvZiByLmNvbnRlbnQmJih0LnR5cGU9ImJpbmFyeSIpLCJ1bmRlZmluZWQiIT10eXBlb2YgQnVuJiZCdWZmZXIuaXNCdWZmZXIoci5jb250ZW50KT90RShuZXcgVWludDhBcnJheShyLmNvbnRlbnQpLHQpOnRFKHIuY29udGVudCx0KTt0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIFpJUCBmaWxlIil9dmFyIGksYSxvPVNiKGUpLGM9ZnVuY3Rpb24oZSl7dmFyIHQ9e3dvcmtib29rczpbXSxzaGVldHM6W10sY2hhcnRzOltdLGRpYWxvZ3M6W10sbWFjcm9zOltdLHJlbHM6W10sc3RyczpbXSxjb21tZW50czpbXSx0aHJlYWRlZGNvbW1lbnRzOltdLGxpbmtzOltdLGNvcmVwcm9wczpbXSxleHRwcm9wczpbXSxjdXN0cHJvcHM6W10sdGhlbWVzOltdLHN0eWxlczpbXSxjYWxjY2hhaW5zOltdLHZiYTpbXSxkcmF3aW5nczpbXSxtZXRhZGF0YTpbXSxwZW9wbGU6W10sVE9ETzpbXSx4bWxuczoiIn07aWYoIWV8fCFlLm1hdGNoKXJldHVybiB0O3ZhciBuPXt9O2lmKChlLm1hdGNoKFBiKXx8W10pLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciByPUxiKGUpO3N3aXRjaChyWzBdLnJlcGxhY2UoQmIsIjwiKSl7Y2FzZSI8P3htbCI6YnJlYWs7Y2FzZSI8VHlwZXMiOnQueG1sbnM9clsieG1sbnMiKyhyWzBdLm1hdGNoKC88KFx3Kyk6Lyl8fFsiIiwiIl0pWzFdXTticmVhaztjYXNlIjxEZWZhdWx0IjpuW3IuRXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCldPXIuQ29udGVudFR5cGU7YnJlYWs7Y2FzZSI8T3ZlcnJpZGUiOnZvaWQgMCE9PXRbcXZbci5Db250ZW50VHlwZV1dJiZ0W3F2W3IuQ29udGVudFR5cGVdXS5wdXNoKHIuUGFydE5hbWUpfX0pKSx0LnhtbG5zIT09ZnkuQ1QpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIE5hbWVzcGFjZTogIit0LnhtbG5zKTtyZXR1cm4gdC5jYWxjY2hhaW49dC5jYWxjY2hhaW5zLmxlbmd0aD4wP3QuY2FsY2NoYWluc1swXToiIix0LnNzdD10LnN0cnMubGVuZ3RoPjA/dC5zdHJzWzBdOiIiLHQuc3R5bGU9dC5zdHlsZXMubGVuZ3RoPjA/dC5zdHlsZXNbMF06IiIsdC5kZWZhdWx0cz1uLGRlbGV0ZSB0LmNhbGNjaGFpbnMsdH0oQWIoZSwiW0NvbnRlbnRfVHlwZXNdLnhtbCIpKSxzPSExO2lmKDA9PT1jLndvcmtib29rcy5sZW5ndGgmJlViKGUsYT0ieGwvd29ya2Jvb2sueG1sIiwhMCkmJmMud29ya2Jvb2tzLnB1c2goYSksMD09PWMud29ya2Jvb2tzLmxlbmd0aCl7aWYoIVViKGUsYT0ieGwvd29ya2Jvb2suYmluIiwhMCkpdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZmluZCB3b3JrYm9vayIpO2Mud29ya2Jvb2tzLnB1c2goYSkscz0hMH0iYmluIj09Yy53b3JrYm9va3NbMF0uc2xpY2UoLTMpJiYocz0hMCk7dmFyIGw9e30sdT17fTtpZighdC5ib29rU2hlZXRzJiYhdC5ib29rUHJvcHMpe2lmKGl3PVtdLGMuc3N0KXRyeXtpdz1qdyhVYihlLCRfKGMuc3N0KSksYy5zc3QsdCl9Y2F0Y2goZSl7aWYodC5XVEYpdGhyb3cgZX10LmNlbGxTdHlsZXMmJmMudGhlbWVzLmxlbmd0aCYmKGw9b1QoQWIoZSxjLnRoZW1lc1swXS5yZXBsYWNlKC9eXC8vLCIiKSwhMCl8fCIiLHQpKSxjLnN0eWxlJiYodT1NdyhVYihlLCRfKGMuc3R5bGUpKSxjLnN0eWxlLGwsdCkpfWMubGlua3MubWFwKChmdW5jdGlvbihuKXt0cnl7JHYoQWIoZSxYdigkXyhuKSkpLG4pO3JldHVybiBWdyhVYihlLCRfKG4pKSwwLG4sdCl9Y2F0Y2goZSl7fX0pKTt2YXIgZj1CdyhVYihlLCRfKGMud29ya2Jvb2tzWzBdKSksYy53b3JrYm9va3NbMF0sdCksZD17fSxoPSIiO2MuY29yZXByb3BzLmxlbmd0aCYmKChoPVViKGUsJF8oYy5jb3JlcHJvcHNbMF0pLCEwKSkmJihkPUp2KGgpKSwwIT09Yy5leHRwcm9wcy5sZW5ndGgmJihoPVViKGUsJF8oYy5leHRwcm9wc1swXSksITApKSYmZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O3R8fCh0PXt9KSxlPVFiKGUpLFF2LmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPShlLm1hdGNoKHR5KG5bMF0pKXx8W10pWzFdO3N3aXRjaChuWzJdKXtjYXNlInN0cmluZyI6aSYmKHRbblsxXV09SGIoaSkpO2JyZWFrO2Nhc2UiYm9vbCI6dFtuWzFdXT0idHJ1ZSI9PT1pO2JyZWFrO2Nhc2UicmF3Ijp2YXIgYT1lLm1hdGNoKG5ldyBSZWdFeHAoIjwiK25bMF0rIltePl0qPihbXFxzXFxTXSo/KTwvIituWzBdKyI+IikpO2EmJmEubGVuZ3RoPjAmJihyW25bMV1dPWFbMV0pfX0pKSxyLkhlYWRpbmdQYWlycyYmci5UaXRsZXNPZlBhcnRzJiZleChyLkhlYWRpbmdQYWlycyxyLlRpdGxlc09mUGFydHMsdCxuKX0oaCxkLHQpKTt2YXIgcD17fTt0LmJvb2tTaGVldHMmJiF0LmJvb2tQcm9wc3x8MCE9PWMuY3VzdHByb3BzLmxlbmd0aCYmKGg9QWIoZSwkXyhjLmN1c3Rwcm9wc1swXSksITApKSYmKHA9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fSxyPSIiLGk9ZS5tYXRjaCh0eCk7aWYoaSlmb3IodmFyIGE9MDthIT1pLmxlbmd0aDsrK2Epe3ZhciBvPWlbYV0sYz1MYihvKTtzd2l0Y2goTWIoY1swXSkpe2Nhc2UiPD94bWwiOmNhc2UiPFByb3BlcnRpZXMiOmJyZWFrO2Nhc2UiPHByb3BlcnR5IjpyPUhiKGMubmFtZSk7YnJlYWs7Y2FzZSI8L3Byb3BlcnR5PiI6cj1udWxsO2JyZWFrO2RlZmF1bHQ6aWYoMD09PW8uaW5kZXhPZigiPHZ0OiIpKXt2YXIgcz1vLnNwbGl0KCI+IiksbD1zWzBdLnNsaWNlKDQpLHU9c1sxXTtzd2l0Y2gobCl7Y2FzZSJscHN0ciI6Y2FzZSJic3RyIjpjYXNlImxwd3N0ciI6Y2FzZSJjeSI6Y2FzZSJlcnJvciI6bltyXT1IYih1KTticmVhaztjYXNlImJvb2wiOm5bcl09JGIodSk7YnJlYWs7Y2FzZSJpMSI6Y2FzZSJpMiI6Y2FzZSJpNCI6Y2FzZSJpOCI6Y2FzZSJpbnQiOmNhc2UidWludCI6bltyXT1wYXJzZUludCh1LDEwKTticmVhaztjYXNlInI0IjpjYXNlInI4IjpjYXNlImRlY2ltYWwiOm5bcl09cGFyc2VGbG9hdCh1KTticmVhaztjYXNlImZpbGV0aW1lIjpjYXNlImRhdGUiOm5bcl09c2IodSk7YnJlYWs7ZGVmYXVsdDppZigiLyI9PWwuc2xpY2UoLTEpKWJyZWFrO3QuV1RGJiYidW5kZWZpbmVkIiE9dHlwZW9mIGNvbnNvbGUmJmNvbnNvbGUud2FybigiVW5leHBlY3RlZCIsbyxsLHMpfX1lbHNlIGlmKCI8LyI9PT1vLnNsaWNlKDAsMikpO2Vsc2UgaWYodC5XVEYpdGhyb3cgbmV3IEVycm9yKG8pfX1yZXR1cm4gbn0oaCx0KSk7dmFyIGc9e307aWYoKHQuYm9va1NoZWV0c3x8dC5ib29rUHJvcHMpJiYoZi5TaGVldHM/aT1mLlNoZWV0cy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWV9KSk6ZC5Xb3Jrc2hlZXRzJiZkLlNoZWV0TmFtZXMubGVuZ3RoPjAmJihpPWQuU2hlZXROYW1lcyksdC5ib29rUHJvcHMmJihnLlByb3BzPWQsZy5DdXN0cHJvcHM9cCksdC5ib29rU2hlZXRzJiZ2b2lkIDAhPT1pJiYoZy5TaGVldE5hbWVzPWkpLHQuYm9va1NoZWV0cz9nLlNoZWV0TmFtZXM6dC5ib29rUHJvcHMpKXJldHVybiBnO2k9e307dmFyIG09e307dC5ib29rRGVwcyYmYy5jYWxjY2hhaW4mJihtPUh3KFViKGUsJF8oYy5jYWxjY2hhaW4pKSxjLmNhbGNjaGFpbikpO3ZhciBiLHksdj0wLHg9e30sRD1mLlNoZWV0cztkLldvcmtzaGVldHM9RC5sZW5ndGgsZC5TaGVldE5hbWVzPVtdO2Zvcih2YXIgVD0wO1QhPUQubGVuZ3RoOysrVClkLlNoZWV0TmFtZXNbVF09RFtUXS5uYW1lO3ZhciB3PXM/ImJpbiI6InhtbCIsXz1jLndvcmtib29rc1swXS5sYXN0SW5kZXhPZigiLyIpLEU9KGMud29ya2Jvb2tzWzBdLnNsaWNlKDAsXysxKSsiX3JlbHMvIitjLndvcmtib29rc1swXS5zbGljZShfKzEpKyIucmVscyIpLnJlcGxhY2UoL15cLy8sIiIpO19iKGUsRSl8fChFPSJ4bC9fcmVscy93b3JrYm9vay4iK3crIi5yZWxzIik7dmFyIFU9JHYoQWIoZSxFLCEwKSxFLnJlcGxhY2UoL19yZWxzLiovLCJzNXMiKSk7KGMubWV0YWRhdGF8fFtdKS5sZW5ndGg+PTEmJih0LnhsbWV0YT1xdyhVYihlLCRfKGMubWV0YWRhdGFbMF0pKSxjLm1ldGFkYXRhWzBdLHQpKSwoYy5wZW9wbGV8fFtdKS5sZW5ndGg+PTEmJih0LnBlb3BsZT1mdW5jdGlvbihlLHQpe3ZhciBuPVtdLHI9ITE7cmV0dXJuIGUucmVwbGFjZShQYiwoZnVuY3Rpb24oZSl7dmFyIGk9TGIoZSk7c3dpdGNoKE1iKGlbMF0pKXtjYXNlIjw/eG1sIjpjYXNlIjxwZXJzb25MaXN0IjpjYXNlIjwvcGVyc29uTGlzdD4iOmNhc2UiPC9wZXJzb24+IjpjYXNlIjxleHRMc3QiOmNhc2UiPGV4dExzdD4iOmNhc2UiPC9leHRMc3Q+IjpjYXNlIjxleHRMc3QvPiI6YnJlYWs7Y2FzZSI8cGVyc29uIjpuLnB1c2goe25hbWU6aS5kaXNwbGF5bmFtZSxpZDppLmlkfSk7YnJlYWs7Y2FzZSI8ZXh0IjpyPSEwO2JyZWFrO2Nhc2UiPC9leHQ+IjpyPSExO2JyZWFrO2RlZmF1bHQ6aWYoIXImJnQuV1RGKXRocm93IG5ldyBFcnJvcigidW5yZWNvZ25pemVkICIraVswXSsiIGluIHRocmVhZGVkIGNvbW1lbnRzIil9cmV0dXJuIGV9KSksbn0oVWIoZSwkXyhjLnBlb3BsZVswXSkpLHQpKSxVJiYoVT1mdW5jdGlvbihlLHQpe2lmKCFlKXJldHVybiAwO3RyeXtlPXQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5pZHx8KHQuaWQ9dC5zdHJSZWxJRCksW3QubmFtZSxlWyIhaWQiXVt0LmlkXS5UYXJnZXQsKG49ZVsiIWlkIl1bdC5pZF0uVHlwZSxHdi5XUy5pbmRleE9mKG4pPi0xPyJzaGVldCI6bj09R3YuQ1M/ImNoYXJ0IjpuPT1Hdi5EUz8iZGlhbG9nIjpuPT1Hdi5NUz8ibWFjcm8iOm4mJm4ubGVuZ3RoP246InNoZWV0IildO3ZhciBufSkpfWNhdGNoKGUpe3JldHVybiBudWxsfXJldHVybiBlJiYwIT09ZS5sZW5ndGg/ZTpudWxsfShVLGYuU2hlZXRzKSk7dmFyIEE9VWIoZSwieGwvd29ya3NoZWV0cy9zaGVldC54bWwiLCEwKT8xOjA7ZTpmb3Iodj0wO3YhPWQuV29ya3NoZWV0czsrK3Ype3ZhciBrPSJzaGVldCI7aWYoVSYmVVt2XT8oYj0ieGwvIitVW3ZdWzFdLnJlcGxhY2UoL1tcL10/eGxcLy8sIiIpLF9iKGUsYil8fChiPVVbdl1bMV0pLF9iKGUsYil8fChiPUUucmVwbGFjZSgvX3JlbHNcLy4qJC8sIiIpK1Vbdl1bMV0pLGs9VVt2XVsyXSk6Yj0oYj0ieGwvd29ya3NoZWV0cy9zaGVldCIrKHYrMS1BKSsiLiIrdykucmVwbGFjZSgvc2hlZXQwXC4vLCJzaGVldC4iKSx5PWIucmVwbGFjZSgvXiguKikoXC8pKFteXC9dKikkLywiJDEvX3JlbHMvJDMucmVscyIpLHQmJm51bGwhPXQuc2hlZXRzKXN3aXRjaCh0eXBlb2YgdC5zaGVldHMpe2Nhc2UibnVtYmVyIjppZih2IT10LnNoZWV0cyljb250aW51ZSBlO2JyZWFrO2Nhc2Uic3RyaW5nIjppZihkLlNoZWV0TmFtZXNbdl0udG9Mb3dlckNhc2UoKSE9dC5zaGVldHMudG9Mb3dlckNhc2UoKSljb250aW51ZSBlO2JyZWFrO2RlZmF1bHQ6aWYoQXJyYXkuaXNBcnJheSYmQXJyYXkuaXNBcnJheSh0LnNoZWV0cykpe2Zvcih2YXIgUz0hMSxDPTA7QyE9dC5zaGVldHMubGVuZ3RoOysrQykibnVtYmVyIj09dHlwZW9mIHQuc2hlZXRzW0NdJiZ0LnNoZWV0c1tDXT09diYmKFM9MSksInN0cmluZyI9PXR5cGVvZiB0LnNoZWV0c1tDXSYmdC5zaGVldHNbQ10udG9Mb3dlckNhc2UoKT09ZC5TaGVldE5hbWVzW3ZdLnRvTG93ZXJDYXNlKCkmJihTPTEpO2lmKCFTKWNvbnRpbnVlIGV9fVhfKGUsYix5LGQuU2hlZXROYW1lc1t2XSx2LHgsaSxrLHQsZixsLHUpfXJldHVybiBnPXtEaXJlY3Rvcnk6YyxXb3JrYm9vazpmLFByb3BzOmQsQ3VzdHByb3BzOnAsRGVwczptLFNoZWV0czppLFNoZWV0TmFtZXM6ZC5TaGVldE5hbWVzLFN0cmluZ3M6aXcsU3R5bGVzOnUsVGhlbWVzOmwsU1NGOnViKGdtKX0sdCYmdC5ib29rRmlsZXMmJihlLmZpbGVzPyhnLmtleXM9byxnLmZpbGVzPWUuZmlsZXMpOihnLmtleXM9W10sZy5maWxlcz17fSxlLkZ1bGxQYXRocy5mb3JFYWNoKChmdW5jdGlvbih0LG4pe3Q9dC5yZXBsYWNlKC9eUm9vdCBFbnRyeVtcL10vLCIiKSxnLmtleXMucHVzaCh0KSxnLmZpbGVzW3RdPWUuRmlsZUluZGV4W25dfSkpKSksdCYmdC5ib29rVkJBJiYoYy52YmEubGVuZ3RoPjA/Zy52YmFyYXc9VWIoZSwkXyhjLnZiYVswXSksITApOmMuZGVmYXVsdHMmJmMuZGVmYXVsdHMuYmluPT09ZFQmJihnLnZiYXJhdz1VYihlLCJ4bC92YmFQcm9qZWN0LmJpbiIsITApKSksZy5ib29rVHlwZT1zPyJ4bHNiIjoieGxzeCIsZ31mdW5jdGlvbiBLXyhlLHQpe3ZhciBuLHIsaT10fHx7fSxhPSJXb3JrYm9vayIsbz1LbS5maW5kKGUsYSk7dHJ5e2lmKGE9Ii8hRGF0YVNwYWNlcy9WZXJzaW9uIiwhKG89S20uZmluZChlLGEpKXx8IW8uY29udGVudCl0aHJvdyBuZXcgRXJyb3IoIkVDTUEtMzc2IEVuY3J5cHRlZCBmaWxlIG1pc3NpbmcgIithKTtpZihuPW8uY29udGVudCwocj17fSkuaWQ9bi5yZWFkX3NoaWZ0KDAsImxwcDQiKSxyLlI9YkQobiw0KSxyLlU9YkQobiw0KSxyLlc9YkQobiw0KSxhPSIvIURhdGFTcGFjZXMvRGF0YVNwYWNlTWFwIiwhKG89S20uZmluZChlLGEpKXx8IW8uY29udGVudCl0aHJvdyBuZXcgRXJyb3IoIkVDTUEtMzc2IEVuY3J5cHRlZCBmaWxlIG1pc3NpbmcgIithKTt2YXIgYz1mdW5jdGlvbihlKXt2YXIgdD1bXTtlLmwrPTQ7Zm9yKHZhciBuPWUucmVhZF9zaGlmdCg0KTtuLS0gPjA7KXQucHVzaCh5RChlKSk7cmV0dXJuIHR9KG8uY29udGVudCk7aWYoMSE9PWMubGVuZ3RofHwxIT09Y1swXS5jb21wcy5sZW5ndGh8fDAhPT1jWzBdLmNvbXBzWzBdLnR8fCJTdHJvbmdFbmNyeXB0aW9uRGF0YVNwYWNlIiE9PWNbMF0ubmFtZXx8IkVuY3J5cHRlZFBhY2thZ2UiIT09Y1swXS5jb21wc1swXS52KXRocm93IG5ldyBFcnJvcigiRUNNQS0zNzYgRW5jcnlwdGVkIGZpbGUgYmFkICIrYSk7aWYoYT0iLyFEYXRhU3BhY2VzL0RhdGFTcGFjZUluZm8vU3Ryb25nRW5jcnlwdGlvbkRhdGFTcGFjZSIsIShvPUttLmZpbmQoZSxhKSl8fCFvLmNvbnRlbnQpdGhyb3cgbmV3IEVycm9yKCJFQ01BLTM3NiBFbmNyeXB0ZWQgZmlsZSBtaXNzaW5nICIrYSk7dmFyIHM9ZnVuY3Rpb24oZSl7dmFyIHQ9W107ZS5sKz00O2Zvcih2YXIgbj1lLnJlYWRfc2hpZnQoNCk7bi0tID4wOyl0LnB1c2goZS5yZWFkX3NoaWZ0KDAsImxwcDQiKSk7cmV0dXJuIHR9KG8uY29udGVudCk7aWYoMSE9cy5sZW5ndGh8fCJTdHJvbmdFbmNyeXB0aW9uVHJhbnNmb3JtIiE9c1swXSl0aHJvdyBuZXcgRXJyb3IoIkVDTUEtMzc2IEVuY3J5cHRlZCBmaWxlIGJhZCAiK2EpO2lmKGE9Ii8hRGF0YVNwYWNlcy9UcmFuc2Zvcm1JbmZvL1N0cm9uZ0VuY3J5cHRpb25UcmFuc2Zvcm0vIVByaW1hcnkiLCEobz1LbS5maW5kKGUsYSkpfHwhby5jb250ZW50KXRocm93IG5ldyBFcnJvcigiRUNNQS0zNzYgRW5jcnlwdGVkIGZpbGUgbWlzc2luZyAiK2EpO3ZEKG8uY29udGVudCl9Y2F0Y2goZSl7fWlmKGE9Ii9FbmNyeXB0aW9uSW5mbyIsIShvPUttLmZpbmQoZSxhKSl8fCFvLmNvbnRlbnQpdGhyb3cgbmV3IEVycm9yKCJFQ01BLTM3NiBFbmNyeXB0ZWQgZmlsZSBtaXNzaW5nICIrYSk7dmFyIGw9ZnVuY3Rpb24oZSl7dmFyIHQ9YkQoZSk7c3dpdGNoKHQuTWlub3Ipe2Nhc2UgMjpyZXR1cm5bdC5NaW5vcixURChlKV07Y2FzZSAzOnJldHVyblt0Lk1pbm9yLHdEKCldO2Nhc2UgNDpyZXR1cm5bdC5NaW5vcixfRChlKV19dGhyb3cgbmV3IEVycm9yKCJFQ01BLTM3NiBFbmNyeXB0ZWQgZmlsZSB1bnJlY29nbml6ZWQgVmVyc2lvbjogIit0Lk1pbm9yKX0oby5jb250ZW50KTtpZihhPSIvRW5jcnlwdGVkUGFja2FnZSIsIShvPUttLmZpbmQoZSxhKSl8fCFvLmNvbnRlbnQpdGhyb3cgbmV3IEVycm9yKCJFQ01BLTM3NiBFbmNyeXB0ZWQgZmlsZSBtaXNzaW5nICIrYSk7aWYoND09bFswXSYmInVuZGVmaW5lZCIhPXR5cGVvZiBkZWNyeXB0X2FnaWxlKXJldHVybiBkZWNyeXB0X2FnaWxlKGxbMV0sby5jb250ZW50LGkucGFzc3dvcmR8fCIiLGkpO2lmKDI9PWxbMF0mJiJ1bmRlZmluZWQiIT10eXBlb2YgZGVjcnlwdF9zdGQ3NilyZXR1cm4gZGVjcnlwdF9zdGQ3NihsWzFdLG8uY29udGVudCxpLnBhc3N3b3JkfHwiIixpKTt0aHJvdyBuZXcgRXJyb3IoIkZpbGUgaXMgcGFzc3dvcmQtcHJvdGVjdGVkIil9ZnVuY3Rpb24gWl8oZSx0KXt2YXIgbj0iIjtzd2l0Y2goKHR8fHt9KS50eXBlfHwiYmFzZTY0Iil7Y2FzZSJidWZmZXIiOmNhc2UiYXJyYXkiOnJldHVybltlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdLGVbN11dO2Nhc2UiYmFzZTY0IjpuPSRnKGUuc2xpY2UoMCwxMikpO2JyZWFrO2Nhc2UiYmluYXJ5IjpuPWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCB0eXBlICIrKHQmJnQudHlwZXx8InVuZGVmaW5lZCIpKX1yZXR1cm5bbi5jaGFyQ29kZUF0KDApLG4uY2hhckNvZGVBdCgxKSxuLmNoYXJDb2RlQXQoMiksbi5jaGFyQ29kZUF0KDMpLG4uY2hhckNvZGVBdCg0KSxuLmNoYXJDb2RlQXQoNSksbi5jaGFyQ29kZUF0KDYpLG4uY2hhckNvZGVBdCg3KV19ZnVuY3Rpb24gSl8oZSx0KXt2YXIgbj0wO2U6Zm9yKDtuPGUubGVuZ3RoOylzd2l0Y2goZS5jaGFyQ29kZUF0KG4pKXtjYXNlIDEwOmNhc2UgMTM6Y2FzZSAzMjorK247YnJlYWs7Y2FzZSA2MDpyZXR1cm4gcl8oZS5zbGljZShuKSx0KTtkZWZhdWx0OmJyZWFrIGV9cmV0dXJuIGFELnRvX3dvcmtib29rKGUsdCl9ZnVuY3Rpb24gUV8oZSx0KXt2YXIgbj1lO3JldHVybiJiYXNlNjQiPT10LnR5cGUmJihuPSRnKG4pKSwidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJihuPW5ldyBVaW50OEFycmF5KGUpKSxuPVlnJiZCdWZmZXIuaXNCdWZmZXIoZSk/ZS5zbGljZSgyKS50b1N0cmluZygidXRmMTZsZSIpOiJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSYmbiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/InVuZGVmaW5lZCIhPXR5cGVvZiBUZXh0RGVjb2Rlcj9uZXcgVGV4dERlY29kZXIoInV0Zi0xNmxlIikuZGVjb2RlKG4uc2xpY2UoMikpOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aD4+MTsrK24pdFtuXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbMipuXSsoZVsyKm4rMV08PDgpKTtyZXR1cm4gdC5qb2luKCIiKX0obi5zbGljZSgyKSk6TWcobi5zbGljZSgyKSksdC50eXBlPSJiaW5hcnkiLEpfKG4sdCl9ZnVuY3Rpb24gZUUoZSx0LG4scil7cmV0dXJuIHI/KG4udHlwZT0ic3RyaW5nIixhRC50b193b3JrYm9vayhlLG4pKTphRC50b193b3JrYm9vayh0LG4pfWZ1bmN0aW9uIHRFKGUsdCl7V2coKTt2YXIgbj10fHx7fTtpZihuLmNvZGVwYWdlJiZ2b2lkIDA9PT1PZyYmY29uc29sZS5lcnJvcigiQ29kZXBhZ2UgdGFibGVzIGFyZSBub3QgbG9hZGVkLiAgTm9uLUFTQ0lJIGNoYXJhY3RlcnMgbWF5IG5vdCBnaXZlIGV4cGVjdGVkIHJlc3VsdHMiKSwidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpcmV0dXJuIHRFKG5ldyBVaW50OEFycmF5KGUpLCgobj11YihuKSkudHlwZT0iYXJyYXkiLG4pKTsidW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXkmJmUgaW5zdGFuY2VvZiBVaW50OEFycmF5JiYhbi50eXBlJiYobi50eXBlPSJ1bmRlZmluZWQiIT10eXBlb2YgRGVubz8iYnVmZmVyIjoiYXJyYXkiKTt2YXIgcixpPWUsYT0hMTtpZihuLmNlbGxTdHlsZXMmJihuLmNlbGxORj0hMCxuLnNoZWV0U3R1YnM9ITApLGF3PXt9LG4uZGF0ZU5GJiYoYXcuZGF0ZU5GPW4uZGF0ZU5GKSxuLnR5cGV8fChuLnR5cGU9WWcmJkJ1ZmZlci5pc0J1ZmZlcihlKT8iYnVmZmVyIjoiYmFzZTY0IiksImZpbGUiPT1uLnR5cGUmJihuLnR5cGU9WWc/ImJ1ZmZlciI6ImJpbmFyeSIsaT1mdW5jdGlvbihlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIERlbm8pcmV0dXJuIERlbm8ucmVhZEZpbGVTeW5jKGUpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgJCYmInVuZGVmaW5lZCIhPXR5cGVvZiBGaWxlJiYidW5kZWZpbmVkIiE9dHlwZW9mIEZvbGRlcil0cnl7dmFyIHQ9RmlsZShlKTt0Lm9wZW4oInIiKSx0LmVuY29kaW5nPSJiaW5hcnkiO3ZhciBuPXQucmVhZCgpO3JldHVybiB0LmNsb3NlKCksbn1jYXRjaChlKXtpZighZS5tZXNzYWdlfHwhZS5tZXNzYWdlLm1hdGNoKC9vbnN0cnVjdC8pKXRocm93IGV9dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgYWNjZXNzIGZpbGUgIitlKX0oZSksInVuZGVmaW5lZCI9PXR5cGVvZiBVaW50OEFycmF5fHxZZ3x8KG4udHlwZT0iYXJyYXkiKSksInN0cmluZyI9PW4udHlwZSYmKGE9ITAsbi50eXBlPSJiaW5hcnkiLG4uY29kZXBhZ2U9NjUwMDEsaT1mdW5jdGlvbihlKXtyZXR1cm4gZS5tYXRjaCgvW15ceDAwLVx4N0ZdLyk/ZXkoZSk6ZX0oZSkpLCJhcnJheSI9PW4udHlwZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5JiZlIGluc3RhbmNlb2YgVWludDhBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlcil7dmFyIG89bmV3IEFycmF5QnVmZmVyKDMpLGM9bmV3IFVpbnQ4QXJyYXkobyk7aWYoYy5mb289ImJhciIsIWMuZm9vKXJldHVybihuPXViKG4pKS50eXBlPSJhcnJheSIsdEUobm0oaSksbil9c3dpdGNoKChyPVpfKGksbikpWzBdKXtjYXNlIDIwODppZigyMDc9PT1yWzFdJiYxNz09PXJbMl0mJjIyND09PXJbM10mJjE2MT09PXJbNF0mJjE3Nz09PXJbNV0mJjI2PT09cls2XSYmMjI1PT09cls3XSlyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gS20uZmluZChlLCJFbmNyeXB0ZWRQYWNrYWdlIik/S18oZSx0KTpmXyhlLHQpfShLbS5yZWFkKGksbiksbik7YnJlYWs7Y2FzZSA5OmlmKHJbMV08PTgpcmV0dXJuIGZfKGksbik7YnJlYWs7Y2FzZSA2MDpyZXR1cm4gcl8oaSxuKTtjYXNlIDczOmlmKDczPT09clsxXSYmNDI9PT1yWzJdJiYwPT09clszXSl0aHJvdyBuZXcgRXJyb3IoIlRJRkYgSW1hZ2UgRmlsZSBpcyBub3QgYSBzcHJlYWRzaGVldCIpO2lmKDY4PT09clsxXSlyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj10fHx7fSxyPSEhbi5XVEY7bi5XVEY9ITA7dHJ5e3ZhciBpPW5ELnRvX3dvcmtib29rKGUsbik7cmV0dXJuIG4uV1RGPXIsaX1jYXRjaChpKXtpZihuLldURj1yLCFpLm1lc3NhZ2UubWF0Y2goL1NZTEsgYmFkIHJlY29yZCBJRC8pJiZyKXRocm93IGk7cmV0dXJuIGFELnRvX3dvcmtib29rKGUsdCl9fShpLG4pO2JyZWFrO2Nhc2UgODQ6aWYoNjU9PT1yWzFdJiY2Nj09PXJbMl0mJjc2PT09clszXSlyZXR1cm4gckQudG9fd29ya2Jvb2soaSxuKTticmVhaztjYXNlIDgwOnJldHVybiA3NT09PXJbMV0mJnJbMl08OSYmclszXTw5P2Z1bmN0aW9uKGUsdCl7dmFyIG49ZSxyPXR8fHt9O3JldHVybiByLnR5cGV8fChyLnR5cGU9WWcmJkJ1ZmZlci5pc0J1ZmZlcihlKT8iYnVmZmVyIjoiYmFzZTY0IiksWV8oRmIobixyKSxyKX0oaSxuKTplRShlLGksbixhKTtjYXNlIDIzOTpyZXR1cm4gNjA9PT1yWzNdP3JfKGksbik6ZUUoZSxpLG4sYSk7Y2FzZSAyNTU6aWYoMjU0PT09clsxXSlyZXR1cm4gUV8oaSxuKTtpZigwPT09clsxXSYmMj09PXJbMl0mJjA9PT1yWzNdKXJldHVybiBvRC50b193b3JrYm9vayhpLG4pO2JyZWFrO2Nhc2UgMDppZigwPT09clsxXSl7aWYoclsyXT49MiYmMD09PXJbM10pcmV0dXJuIG9ELnRvX3dvcmtib29rKGksbik7aWYoMD09PXJbMl0mJig4PT09clszXXx8OT09PXJbM10pKXJldHVybiBvRC50b193b3JrYm9vayhpLG4pfWJyZWFrO2Nhc2UgMzpjYXNlIDEzMTpjYXNlIDEzOTpjYXNlIDE0MDpyZXR1cm4gdEQudG9fd29ya2Jvb2soaSxuKTtjYXNlIDEyMzppZig5Mj09PXJbMV0mJjExND09PXJbMl0mJjExNj09PXJbM10pcmV0dXJuIENEKGksbik7YnJlYWs7Y2FzZSAxMDpjYXNlIDEzOmNhc2UgMzI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG49IiIscj1aXyhlLHQpO3N3aXRjaCh0LnR5cGUpe2Nhc2UiYmFzZTY0IjpuPSRnKGUpO2JyZWFrO2Nhc2UiYmluYXJ5IjpuPWU7YnJlYWs7Y2FzZSJidWZmZXIiOm49ZS50b1N0cmluZygiYmluYXJ5Iik7YnJlYWs7Y2FzZSJhcnJheSI6bj1sYihlKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHR5cGUgIit0LnR5cGUpfXJldHVybiAyMzk9PXJbMF0mJjE4Nz09clsxXSYmMTkxPT1yWzJdJiYobj1RYihuKSksdC50eXBlPSJiaW5hcnkiLEpfKG4sdCl9KGksbik7Y2FzZSAxMzc6aWYoODA9PT1yWzFdJiY3OD09PXJbMl0mJjcxPT09clszXSl0aHJvdyBuZXcgRXJyb3IoIlBORyBJbWFnZSBGaWxlIGlzIG5vdCBhIHNwcmVhZHNoZWV0Iik7YnJlYWs7Y2FzZSA4OmlmKDIzMT09PXJbMV0pdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBNdWx0aXBsYW4gMS54IGZpbGUhIik7YnJlYWs7Y2FzZSAxMjppZigyMzY9PT1yWzFdKXRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgTXVsdGlwbGFuIDIueCBmaWxlISIpO2lmKDIzNz09PXJbMV0pdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBNdWx0aXBsYW4gMy54IGZpbGUhIil9cmV0dXJuIGVELmluZGV4T2YoclswXSk+LTEmJnJbMl08PTEyJiZyWzNdPD0zMT90RC50b193b3JrYm9vayhpLG4pOmVFKGUsaSxuLGEpfWZ1bmN0aW9uIG5FKGUsdCxuLHIsaSxhLG8pe3ZhciBjPW52KG4pLHM9by5kZWZ2YWwsbD1vLnJhd3x8IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCJyYXciKSx1PSEwLGY9bnVsbCE9ZVsiIWRhdGEiXSxkPTE9PT1pP1tdOnt9O2lmKDEhPT1pKWlmKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSl0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGQsIl9fcm93TnVtX18iLHt2YWx1ZTpuLGVudW1lcmFibGU6ITF9KX1jYXRjaChlKXtkLl9fcm93TnVtX189bn1lbHNlIGQuX19yb3dOdW1fXz1uO2lmKCFmfHxlWyIhZGF0YSJdW25dKWZvcih2YXIgaD10LnMuYztoPD10LmUuYzsrK2gpe3ZhciBwPWY/KGVbIiFkYXRhIl1bbl18fFtdKVtoXTplW3JbaF0rY107aWYobnVsbCE9cCYmdm9pZCAwIT09cC50KXt2YXIgZz1wLnY7c3dpdGNoKHAudCl7Y2FzZSJ6IjppZihudWxsPT1nKWJyZWFrO2NvbnRpbnVlO2Nhc2UiZSI6Zz0wPT1nP251bGw6dm9pZCAwO2JyZWFrO2Nhc2UicyI6Y2FzZSJiIjpjYXNlIm4iOmlmKCFwLnp8fCFMbShwLnopKWJyZWFrO2lmKCJudW1iZXIiPT10eXBlb2YoZz1yYihnKSkpYnJlYWs7Y2FzZSJkIjpvJiYoby5VVEN8fCExPT09by5yYXcpfHwoZz14YihuZXcgRGF0ZShnKSkpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bnJlY29nbml6ZWQgdHlwZSAiK3AudCl9aWYobnVsbCE9YVtoXSl7aWYobnVsbD09ZylpZigiZSI9PXAudCYmbnVsbD09PWcpZFthW2hdXT1udWxsO2Vsc2UgaWYodm9pZCAwIT09cylkW2FbaF1dPXM7ZWxzZXtpZighbHx8bnVsbCE9PWcpY29udGludWU7ZFthW2hdXT1udWxsfWVsc2UgZFthW2hdXT0oIm4iPT09cC50JiYiYm9vbGVhbiI9PXR5cGVvZiBvLnJhd051bWJlcnM/by5yYXdOdW1iZXJzOmwpP2c6ZnYocCxnLG8pO251bGwhPWcmJih1PSExKX19ZWxzZXtpZih2b2lkIDA9PT1zKWNvbnRpbnVlO251bGwhPWFbaF0mJihkW2FbaF1dPXMpfX1yZXR1cm57cm93OmQsaXNlbXB0eTp1fX1mdW5jdGlvbiByRShlLHQpe2lmKG51bGw9PWV8fG51bGw9PWVbIiFyZWYiXSlyZXR1cm5bXTt2YXIgbj17dDoibiIsdjowfSxyPTAsaT0xLGE9W10sbz0wLGM9IiIscz17czp7cjowLGM6MH0sZTp7cjowLGM6MH19LGw9dHx8e30sdT1udWxsIT1sLnJhbmdlP2wucmFuZ2U6ZVsiIXJlZiJdO3N3aXRjaCgxPT09bC5oZWFkZXI/cj0xOiJBIj09PWwuaGVhZGVyP3I9MjpBcnJheS5pc0FycmF5KGwuaGVhZGVyKT9yPTM6bnVsbD09bC5oZWFkZXImJihyPTApLHR5cGVvZiB1KXtjYXNlInN0cmluZyI6cz1sdih1KTticmVhaztjYXNlIm51bWJlciI6KHM9bHYoZVsiIXJlZiJdKSkucy5yPXU7YnJlYWs7ZGVmYXVsdDpzPXV9cj4wJiYoaT0wKTt2YXIgZj1udihzLnMuciksZD1bXSxoPVtdLHA9MCxnPTAsbT1udWxsIT1lWyIhZGF0YSJdLGI9cy5zLnIseT0wLHY9e307bSYmIWVbIiFkYXRhIl1bYl0mJihlWyIhZGF0YSJdW2JdPVtdKTt2YXIgeD1sLnNraXBIaWRkZW4mJmVbIiFjb2xzIl18fFtdLEQ9bC5za2lwSGlkZGVuJiZlWyIhcm93cyJdfHxbXTtmb3IoeT1zLnMuYzt5PD1zLmUuYzsrK3kpaWYoISh4W3ldfHx7fSkuaGlkZGVuKXN3aXRjaChkW3ldPWl2KHkpLG49bT9lWyIhZGF0YSJdW2JdW3ldOmVbZFt5XStmXSxyKXtjYXNlIDE6YVt5XT15LXMucy5jO2JyZWFrO2Nhc2UgMjphW3ldPWRbeV07YnJlYWs7Y2FzZSAzOmFbeV09bC5oZWFkZXJbeS1zLnMuY107YnJlYWs7ZGVmYXVsdDppZihudWxsPT1uJiYobj17dzoiX19FTVBUWSIsdDoicyJ9KSxjPW89ZnYobixudWxsLGwpLGc9dltvXXx8MCl7ZG97Yz1vKyJfIitnKyt9d2hpbGUodltjXSk7dltvXT1nLHZbY109MX1lbHNlIHZbb109MTthW3ldPWN9Zm9yKGI9cy5zLnIraTtiPD1zLmUucjsrK2IpaWYoIShEW2JdfHx7fSkuaGlkZGVuKXt2YXIgVD1uRShlLHMsYixkLHIsYSxsKTsoITE9PT1ULmlzZW1wdHl8fCgxPT09cj8hMSE9PWwuYmxhbmtyb3dzOmwuYmxhbmtyb3dzKSkmJihoW3ArK109VC5yb3cpfXJldHVybiBoLmxlbmd0aD1wLGh9dmFyIGlFPS8iL2c7ZnVuY3Rpb24gYUUoZSx0LG4scixpLGEsbyxjKXtmb3IodmFyIHM9ITAsbD1bXSx1PSIiLGY9bnYobiksZD1udWxsIT1lWyIhZGF0YSJdLGg9ZCYmZVsiIWRhdGEiXVtuXXx8W10scD10LnMuYztwPD10LmUuYzsrK3ApaWYocltwXSl7dmFyIGc9ZD9oW3BdOmVbcltwXStmXTtpZihudWxsPT1nKXU9IiI7ZWxzZSBpZihudWxsIT1nLnYpe3M9ITEsdT0iIisoYy5yYXdOdW1iZXJzJiYibiI9PWcudD9nLnY6ZnYoZyxudWxsLGMpKTtmb3IodmFyIG09MCxiPTA7bSE9PXUubGVuZ3RoOysrbSlpZigoYj11LmNoYXJDb2RlQXQobSkpPT09aXx8Yj09PWF8fDM0PT09Ynx8Yy5mb3JjZVF1b3Rlcyl7dT0nIicrdS5yZXBsYWNlKGlFLCciIicpKyciJzticmVha30iSUQiPT11JiYodT0nIklEIicpfWVsc2UgbnVsbD09Zy5mfHxnLkY/dT0iIjoocz0hMSwodT0iPSIrZy5mKS5pbmRleE9mKCIsIik+PTAmJih1PSciJyt1LnJlcGxhY2UoaUUsJyIiJykrJyInKSk7bC5wdXNoKHUpfXJldHVybiExPT09Yy5ibGFua3Jvd3MmJnM/bnVsbDpsLmpvaW4obyl9ZnVuY3Rpb24gb0UoZSx0KXt2YXIgbj1bXSxyPW51bGw9PXQ/e306dDtpZihudWxsPT1lfHxudWxsPT1lWyIhcmVmIl0pcmV0dXJuIiI7Zm9yKHZhciBpPWx2KGVbIiFyZWYiXSksYT12b2lkIDAhPT1yLkZTP3IuRlM6IiwiLG89YS5jaGFyQ29kZUF0KDApLGM9dm9pZCAwIT09ci5SUz9yLlJTOiJcbiIscz1jLmNoYXJDb2RlQXQoMCksbD1uZXcgUmVnRXhwKCgifCI9PWE/IlxcfCI6YSkrIiskIiksdT0iIixmPVtdLGQ9ci5za2lwSGlkZGVuJiZlWyIhY29scyJdfHxbXSxoPXIuc2tpcEhpZGRlbiYmZVsiIXJvd3MiXXx8W10scD1pLnMuYztwPD1pLmUuYzsrK3ApKGRbcF18fHt9KS5oaWRkZW58fChmW3BdPWl2KHApKTtmb3IodmFyIGc9MCxtPWkucy5yO208PWkuZS5yOysrbSkoaFttXXx8e30pLmhpZGRlbnx8bnVsbCE9KHU9YUUoZSxpLG0sZixvLHMsYSxyKSkmJihyLnN0cmlwJiYodT11LnJlcGxhY2UobCwiIikpLCh1fHwhMSE9PXIuYmxhbmtyb3dzKSYmbi5wdXNoKChnKys/YzoiIikrdSkpO3JldHVybiBuLmpvaW4oIiIpfWZ1bmN0aW9uIGNFKGUsdCxuKXt2YXIgcj1ufHx7fSxpPWU/bnVsbCE9ZVsiIWRhdGEiXTpyLmRlbnNlLGE9KyFyLnNraXBIZWFkZXIsbz1lfHx7fTshZSYmaSYmKG9bIiFkYXRhIl09W10pO3ZhciBjPTAscz0wO2lmKG8mJm51bGwhPXIub3JpZ2luKWlmKCJudW1iZXIiPT10eXBlb2Ygci5vcmlnaW4pYz1yLm9yaWdpbjtlbHNle3ZhciBsPSJzdHJpbmciPT10eXBlb2Ygci5vcmlnaW4/YXYoci5vcmlnaW4pOnIub3JpZ2luO2M9bC5yLHM9bC5jfXZhciB1PXtzOntjOjAscjowfSxlOntjOnMscjpjK3QubGVuZ3RoLTErYX19O2lmKG9bIiFyZWYiXSl7dmFyIGY9bHYob1siIXJlZiJdKTt1LmUuYz1NYXRoLm1heCh1LmUuYyxmLmUuYyksdS5lLnI9TWF0aC5tYXgodS5lLnIsZi5lLnIpLC0xPT1jJiYoYz1mLmUucisxLHUuZS5yPWMrdC5sZW5ndGgtMSthKX1lbHNlLTE9PWMmJihjPTAsdS5lLnI9dC5sZW5ndGgtMSthKTt2YXIgZD1yLmhlYWRlcnx8W10saD0wLHA9W107dC5mb3JFYWNoKChmdW5jdGlvbihlLHQpe2kmJiFvWyIhZGF0YSJdW2MrdCthXSYmKG9bIiFkYXRhIl1bYyt0K2FdPVtdKSxpJiYocD1vWyIhZGF0YSJdW2MrdCthXSksWm0oZSkuZm9yRWFjaCgoZnVuY3Rpb24obil7LTE9PShoPWQuaW5kZXhPZihuKSkmJihkW2g9ZC5sZW5ndGhdPW4pO3ZhciBsPWVbbl0sdT0ieiIsZj0iIixnPWk/IiI6aXYocytoKStudihjK3QrYSksbT1pP3BbcytoXTpvW2ddOyFsfHwib2JqZWN0IiE9dHlwZW9mIGx8fGwgaW5zdGFuY2VvZiBEYXRlPygibnVtYmVyIj09dHlwZW9mIGw/dT0ibiI6ImJvb2xlYW4iPT10eXBlb2YgbD91PSJiIjoic3RyaW5nIj09dHlwZW9mIGw/dT0icyI6bCBpbnN0YW5jZW9mIERhdGU/KHU9ImQiLHIuVVRDfHwobD1EYihsKSksci5jZWxsRGF0ZXN8fCh1PSJuIixsPW5iKGwpKSxmPW51bGwhPW0mJm0ueiYmTG0obS56KT9tLno6ci5kYXRlTkZ8fGdtWzE0XSk6bnVsbD09PWwmJnIubnVsbEVycm9yJiYodT0iZSIsbD0wKSxtPyhtLnQ9dSxtLnY9bCxkZWxldGUgbS53LGRlbGV0ZSBtLlIsZiYmKG0uej1mKSk6aT9wW3MraF09bT17dDp1LHY6bH06b1tnXT1tPXt0OnUsdjpsfSxmJiYobS56PWYpKTppP3BbcytoXT1sOm9bZ109bH0pKX0pKSx1LmUuYz1NYXRoLm1heCh1LmUuYyxzK2QubGVuZ3RoLTEpO3ZhciBnPW52KGMpO2lmKGkmJiFvWyIhZGF0YSJdW2NdJiYob1siIWRhdGEiXVtjXT1bXSksYSlmb3IoaD0wO2g8ZC5sZW5ndGg7KytoKWk/b1siIWRhdGEiXVtjXVtoK3NdPXt0OiJzIix2OmRbaF19Om9baXYoaCtzKStnXT17dDoicyIsdjpkW2hdfTtyZXR1cm4gb1siIXJlZiJdPXN2KHUpLG99ZnVuY3Rpb24gc0UoZSx0LG4pe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYobnVsbCE9ZVsiIWRhdGEiXSl7dmFyIHI9YXYodCk7cmV0dXJuIGVbIiFkYXRhIl1bci5yXXx8KGVbIiFkYXRhIl1bci5yXT1bXSksZVsiIWRhdGEiXVtyLnJdW3IuY118fChlWyIhZGF0YSJdW3Iucl1bci5jXT17dDoieiJ9KX1yZXR1cm4gZVt0XXx8KGVbdF09e3Q6InoifSl9cmV0dXJuIHNFKGUsIm51bWJlciIhPXR5cGVvZiB0P292KHQpOml2KG58fDApK252KHQpKX1mdW5jdGlvbiBsRShlLHQpe3ZhciBuPXtTaGVldE5hbWVzOltdLFNoZWV0czp7fX07cmV0dXJuIGUmJnVFKG4sZSx0fHwiU2hlZXQxIiksbn1mdW5jdGlvbiB1RShlLHQsbixyKXt2YXIgaT0xO2lmKCFuKWZvcig7aTw9NjU1MzUmJi0xIT1lLlNoZWV0TmFtZXMuaW5kZXhPZihuPSJTaGVldCIraSk7KytpLG49dm9pZCAwKTtpZighbnx8ZS5TaGVldE5hbWVzLmxlbmd0aD49NjU1MzUpdGhyb3cgbmV3IEVycm9yKCJUb28gbWFueSB3b3Jrc2hlZXRzIik7aWYociYmZS5TaGVldE5hbWVzLmluZGV4T2Yobik+PTApe3ZhciBhPW4ubWF0Y2goLyheLio/KShcZCspJC8pO2k9YSYmK2FbMl18fDA7dmFyIG89YSYmYVsxXXx8bjtmb3IoKytpO2k8PTY1NTM1JiYtMSE9ZS5TaGVldE5hbWVzLmluZGV4T2Yobj1vK2kpOysraSk7fWlmKGZ1bmN0aW9uKGUsdCl7dHJ5e2lmKCIiPT1lKXRocm93IG5ldyBFcnJvcigiU2hlZXQgbmFtZSBjYW5ub3QgYmUgYmxhbmsiKTtpZihlLmxlbmd0aD4zMSl0aHJvdyBuZXcgRXJyb3IoIlNoZWV0IG5hbWUgY2Fubm90IGV4Y2VlZCAzMSBjaGFycyIpO2lmKDM5PT1lLmNoYXJDb2RlQXQoMCl8fDM5PT1lLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkpdGhyb3cgbmV3IEVycm9yKCJTaGVldCBuYW1lIGNhbm5vdCBzdGFydCBvciBlbmQgd2l0aCBhcG9zdHJvcGhlICgnKSIpO2lmKCJoaXN0b3J5Ij09ZS50b0xvd2VyQ2FzZSgpKXRocm93IG5ldyBFcnJvcigiU2hlZXQgbmFtZSBjYW5ub3QgYmUgJ0hpc3RvcnknIik7UncuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoLTEhPWUuaW5kZXhPZih0KSl0aHJvdyBuZXcgRXJyb3IoIlNoZWV0IG5hbWUgY2Fubm90IGNvbnRhaW4gOiBcXCAvID8gKiBbIF0iKX0pKX1jYXRjaChlKXtpZih0KXJldHVybiExO3Rocm93IGV9fShuKSxlLlNoZWV0TmFtZXMuaW5kZXhPZihuKT49MCl0aHJvdyBuZXcgRXJyb3IoIldvcmtzaGVldCB3aXRoIG5hbWUgfCIrbisifCBhbHJlYWR5IGV4aXN0cyEiKTtyZXR1cm4gZS5TaGVldE5hbWVzLnB1c2gobiksZS5TaGVldHNbbl09dCxufWZ1bmN0aW9uIGZFKGUsdCxuKXtyZXR1cm4gdD8oZS5sPXtUYXJnZXQ6dH0sbiYmKGUubC5Ub29sdGlwPW4pKTpkZWxldGUgZS5sLGV9dmFyIGRFPXtlbmNvZGVfY29sOml2LGVuY29kZV9yb3c6bnYsZW5jb2RlX2NlbGw6b3YsZW5jb2RlX3JhbmdlOnN2LGRlY29kZV9jb2w6cnYsZGVjb2RlX3Jvdzp0dixzcGxpdF9jZWxsOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyhcJD9bQS1aXSopKFwkP1xkKikvLCIkMSwkMiIpLnNwbGl0KCIsIil9LGRlY29kZV9jZWxsOmF2LGRlY29kZV9yYW5nZTpjdixmb3JtYXRfY2VsbDpmdixzaGVldF9uZXc6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuKGV8fHt9KS5kZW5zZSYmKHRbIiFkYXRhIl09W10pLHR9LHNoZWV0X2FkZF9hb2E6aHYsc2hlZXRfYWRkX2pzb246Y0Usc2hlZXRfYWRkX2RvbTpiXyxhb2FfdG9fc2hlZXQ6cHYsanNvbl90b19zaGVldDpmdW5jdGlvbihlLHQpe3JldHVybiBjRShudWxsLGUsdCl9LHRhYmxlX3RvX3NoZWV0OnlfLHRhYmxlX3RvX2Jvb2s6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZHYoeV8oZSx0KSx0KX0sc2hlZXRfdG9fY3N2Om9FLHNoZWV0X3RvX3R4dDpmdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD17fSksdC5GUz0iXHQiLHQuUlM9IlxuIixvRShlLHQpfSxzaGVldF90b19qc29uOnJFLHNoZWV0X3RvX2h0bWw6ZnVuY3Rpb24oZSx0KXt2YXIgbj10fHx7fSxyPW51bGwhPW4uaGVhZGVyP24uaGVhZGVyOic8aHRtbD48aGVhZD48bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPjx0aXRsZT5TaGVldEpTIFRhYmxlIEV4cG9ydDwvdGl0bGU+PC9oZWFkPjxib2R5PicsaT1udWxsIT1uLmZvb3Rlcj9uLmZvb3RlcjoiPC9ib2R5PjwvaHRtbD4iLGE9W3JdLG89Y3YoZVsiIXJlZiJdfHwiQTEiKTtpZihhLnB1c2goZnVuY3Rpb24oZSx0LG4pe3JldHVybltdLmpvaW4oIiIpKyI8dGFibGUiKyhuJiZuLmlkPycgaWQ9Iicrbi5pZCsnIic6IiIpKyI+In0oMCwwLG4pKSxlWyIhcmVmIl0pZm9yKHZhciBjPW8ucy5yO2M8PW8uZS5yOysrYylhLnB1c2gobV8oZSxvLGMsbikpO3JldHVybiBhLnB1c2goIjwvdGFibGU+IitpKSxhLmpvaW4oIiIpfSxzaGVldF90b19mb3JtdWxhZTpmdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9IiI7aWYobnVsbD09ZXx8bnVsbD09ZVsiIXJlZiJdKXJldHVybltdO3ZhciBpLGE9bHYoZVsiIXJlZiJdKSxvPSIiLGM9W10scz1bXSxsPW51bGwhPWVbIiFkYXRhIl07Zm9yKGk9YS5zLmM7aTw9YS5lLmM7KytpKWNbaV09aXYoaSk7Zm9yKHZhciB1PWEucy5yO3U8PWEuZS5yOysrdSlmb3Iobz1udih1KSxpPWEucy5jO2k8PWEuZS5jOysraSlpZihuPWNbaV0rbyxyPSIiLHZvaWQgMCE9PSh0PWw/KGVbIiFkYXRhIl1bdV18fFtdKVtpXTplW25dKSl7aWYobnVsbCE9dC5GKXtpZihuPXQuRiwhdC5mKWNvbnRpbnVlO3I9dC5mLC0xPT1uLmluZGV4T2YoIjoiKSYmKG49bisiOiIrbil9aWYobnVsbCE9dC5mKXI9dC5mO2Vsc2V7aWYoInoiPT10LnQpY29udGludWU7aWYoIm4iPT10LnQmJm51bGwhPXQudilyPSIiK3QudjtlbHNlIGlmKCJiIj09dC50KXI9dC52PyJUUlVFIjoiRkFMU0UiO2Vsc2UgaWYodm9pZCAwIT09dC53KXI9IiciK3QudztlbHNle2lmKHZvaWQgMD09PXQudiljb250aW51ZTtyPSJzIj09dC50PyInIit0LnY6IiIrdC52fX1zW3MubGVuZ3RoXT1uKyI9IityfXJldHVybiBzfSxzaGVldF90b19yb3dfb2JqZWN0X2FycmF5OnJFLHNoZWV0X2dldF9jZWxsOnNFLGJvb2tfbmV3OmxFLGJvb2tfYXBwZW5kX3NoZWV0OnVFLGJvb2tfc2V0X3NoZWV0X3Zpc2liaWxpdHk6ZnVuY3Rpb24oZSx0LG4pe2UuV29ya2Jvb2t8fChlLldvcmtib29rPXt9KSxlLldvcmtib29rLlNoZWV0c3x8KGUuV29ya2Jvb2suU2hlZXRzPVtdKTt2YXIgcj1mdW5jdGlvbihlLHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYodD49MCYmZS5TaGVldE5hbWVzLmxlbmd0aD50KXJldHVybiB0O3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGZpbmQgc2hlZXQgIyAiK3QpfWlmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIG49ZS5TaGVldE5hbWVzLmluZGV4T2YodCk7aWYobj4tMSlyZXR1cm4gbjt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHNoZWV0IG5hbWUgfCIrdCsifCIpfXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGZpbmQgc2hlZXQgfCIrdCsifCIpfShlLHQpO3N3aXRjaChlLldvcmtib29rLlNoZWV0c1tyXXx8KGUuV29ya2Jvb2suU2hlZXRzW3JdPXt9KSxuKXtjYXNlIDA6Y2FzZSAxOmNhc2UgMjpicmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiQmFkIHNoZWV0IHZpc2liaWxpdHkgc2V0dGluZyAiK24pfWUuV29ya2Jvb2suU2hlZXRzW3JdLkhpZGRlbj1ufSxjZWxsX3NldF9udW1iZXJfZm9ybWF0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuej10LGV9LGNlbGxfc2V0X2h5cGVybGluazpmRSxjZWxsX3NldF9pbnRlcm5hbF9saW5rOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZkUoZSwiIyIrdCxuKX0sY2VsbF9hZGRfY29tbWVudDpmdW5jdGlvbihlLHQsbil7ZS5jfHwoZS5jPVtdKSxlLmMucHVzaCh7dDp0LGE6bnx8IlNoZWV0SlMifSl9LHNoZWV0X3NldF9hcnJheV9mb3JtdWxhOmZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgaT0ic3RyaW5nIiE9dHlwZW9mIHQ/dDpsdih0KSxhPSJzdHJpbmciPT10eXBlb2YgdD90OnN2KHQpLG89aS5zLnI7bzw9aS5lLnI7KytvKWZvcih2YXIgYz1pLnMuYztjPD1pLmUuYzsrK2Mpe3ZhciBzPXNFKGUsbyxjKTtzLnQ9Im4iLHMuRj1hLGRlbGV0ZSBzLnYsbz09aS5zLnImJmM9PWkucy5jJiYocy5mPW4sciYmKHMuRD0hMCkpfXZhciBsPWN2KGVbIiFyZWYiXSk7cmV0dXJuIGwucy5yPmkucy5yJiYobC5zLnI9aS5zLnIpLGwucy5jPmkucy5jJiYobC5zLmM9aS5zLmMpLGwuZS5yPGkuZS5yJiYobC5lLnI9aS5lLnIpLGwuZS5jPGkuZS5jJiYobC5lLmM9aS5lLmMpLGVbIiFyZWYiXT1zdihsKSxlfSxjb25zdHM6e1NIRUVUX1ZJU0lCTEU6MCxTSEVFVF9ISURERU46MSxTSEVFVF9WRVJZX0hJRERFTjoyfX07b25tZXNzYWdlPWFzeW5jIGU9Pnt0cnl7bGV0IHQ9IiI7ImRvY3giPT09ZS5kYXRhLmV4dGVuc2lvbj90PWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUpe2NvbnN0IHQ9YXdhaXQgdGUuZXh0cmFjdFJhd1RleHQoe2FycmF5QnVmZmVyOmV9KTtyZXR1cm4gdC52YWx1ZX0oZS5kYXRhLmRhdGEpOiJ4bHN4Ij09PWUuZGF0YS5leHRlbnNpb24mJih0PWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUpe2NvbnN0IHQ9dEUoZSx7dHlwZToiYnVmZmVyIn0pO2xldCBuPSIiO2NvbnN0IHI9dC5TaGVldE5hbWVzO2Zvcihjb25zdCBlIG9mIHIpbis9YCR7ZX0gYCxuKz1kRS5zaGVldF90b190eHQodC5TaGVldHNbZV0pO3JldHVybiBufShlLmRhdGEuZGF0YSkpLHNlbGYucG9zdE1lc3NhZ2Uoe3RleHQ6dH0pfWNhdGNoKHQpe2NvbnNvbGUuaW5mbygiVGV4dCBFeHRyYWN0b3IgLSBDb3VsZCBub3QgZXh0cmFjdCB0ZXh0IGZyb20gIitlLmRhdGEubmFtZSksc2VsZi5wb3N0TWVzc2FnZSh7dGV4dDoiIn0pfX19KCk7Cgo=", null, false); +var CU = class { + constructor(U2) { + this.worker = U2, hU.set(this, false); + } + static getWorker() { + const U2 = Q(CU, XU, "f", YU).find((U3) => !Q(U3, hU, "f")); + if (U2) + return U2; + const F2 = new CU(new MU({ name: "Office Text Extractor" })); + return Q(CU, XU, "f", YU).push(F2), F2; + } + async run(U2) { + return new Promise((F2, R2) => { + B(this, hU, true, "f"); + const V2 = setTimeout(() => { + console.warn("Text Extractor - Office Worker timeout for ", U2.name), R2("timeout"), Q(CU, XU, "m", cU).call(CU, this); + }, UU); + this.worker.postMessage(U2), this.worker.onmessage = (U3) => { + clearTimeout(V2), F2(U3), B(this, hU, false, "f"); + }; + }); + } +}; +XU = CU, hU = /* @__PURE__ */ new WeakMap(), cU = function(U2) { + U2.worker.terminate(), B(CU, XU, Q(CU, XU, "f", YU).filter((F2) => F2 !== U2), "f", YU); +}, YU = { value: [] }; +pU = /* @__PURE__ */ new WeakSet(), aU = async function(F2) { + var _a2; + const Q2 = await NU(F2); + if (Q2) + return (_a2 = Q2.text) != null ? _a2 : RU; + if (import_obsidian.Platform.isMobileApp) + return VU; + const B2 = JU(F2), R2 = await app.vault.readBinary(F2), V2 = CU.getWorker(); + return new Promise(async (U2, Q3) => { + try { + const Q4 = (await V2.run({ data: R2, name: F2.basename, extension: F2.extension })).data.text.replace(/\n/g, " ").replace(/ +/g, " ").trim(); + await SU(B2.folder, B2.filename, Q4, F2.path, ""), U2(Q4); + } catch (Q4) { + await SU(B2.folder, B2.filename, "", F2.path, ""), U2(""); + } + }); +}; +var yU = new class { + constructor() { + pU.add(this); + } + async getOfficeText(U2) { + var _a2; + try { + return (_a2 = await BU.add(() => Q(this, pU, "m", aU).call(this, U2))) != null ? _a2 : ""; + } catch (F2) { + return console.warn(`Text Extractor - Error while extracting text from ${U2.basename}`), console.warn(F2), ""; + } + } +}(); +var DU = {}; +!function(U2) { + var F2 = function(U3) { + var F3, Q2 = Object.prototype, B2 = Q2.hasOwnProperty, R2 = Object.defineProperty || function(U4, F4, Q3) { + U4[F4] = Q3.value; + }, V2 = typeof Symbol == "function" ? Symbol : {}, l2 = V2.iterator || "@@iterator", Z2 = V2.asyncIterator || "@@asyncIterator", d2 = V2.toStringTag || "@@toStringTag"; + function W2(U4, F4, Q3) { + return Object.defineProperty(U4, F4, { value: Q3, enumerable: true, configurable: true, writable: true }), U4[F4]; + } + try { + W2({}, ""); + } catch (U4) { + W2 = function(U5, F4, Q3) { + return U5[F4] = Q3; + }; + } + function J2(U4, F4, Q3, B3) { + var V3 = F4 && F4.prototype instanceof I2 ? F4 : I2, l3 = Object.create(V3.prototype), Z3 = new y2(B3 || []); + return R2(l3, "_invoke", { value: p2(U4, Q3, Z3) }), l3; + } + function N2(U4, F4, Q3) { + try { + return { type: "normal", arg: U4.call(F4, Q3) }; + } catch (U5) { + return { type: "throw", arg: U5 }; + } + } + U3.wrap = J2; + var S2 = "suspendedStart", E2 = "suspendedYield", T2 = "executing", k2 = "completed", m2 = {}; + function I2() { + } + function b2() { + } + function G2() { + } + var n2 = {}; + W2(n2, l2, function() { + return this; + }); + var i2 = Object.getPrototypeOf, X2 = i2 && i2(i2(D2([]))); + X2 && X2 !== Q2 && B2.call(X2, l2) && (n2 = X2); + var Y2 = G2.prototype = I2.prototype = Object.create(n2); + function h2(U4) { + ["next", "throw", "return"].forEach(function(F4) { + W2(U4, F4, function(U5) { + return this._invoke(F4, U5); + }); + }); + } + function c2(U4, F4) { + function Q3(R3, V4, l3, Z3) { + var d3 = N2(U4[R3], U4, V4); + if (d3.type !== "throw") { + var W3 = d3.arg, J3 = W3.value; + return J3 && typeof J3 == "object" && B2.call(J3, "__await") ? F4.resolve(J3.__await).then(function(U5) { + Q3("next", U5, l3, Z3); + }, function(U5) { + Q3("throw", U5, l3, Z3); + }) : F4.resolve(J3).then(function(U5) { + W3.value = U5, l3(W3); + }, function(U5) { + return Q3("throw", U5, l3, Z3); + }); + } + Z3(d3.arg); + } + var V3; + R2(this, "_invoke", { value: function(U5, B3) { + function R3() { + return new F4(function(F5, R4) { + Q3(U5, B3, F5, R4); + }); + } + return V3 = V3 ? V3.then(R3, R3) : R3(); + } }); + } + function p2(U4, F4, Q3) { + var B3 = S2; + return function(R3, V3) { + if (B3 === T2) + throw new Error("Generator is already running"); + if (B3 === k2) { + if (R3 === "throw") + throw V3; + return L2(); + } + for (Q3.method = R3, Q3.arg = V3; ; ) { + var l3 = Q3.delegate; + if (l3) { + var Z3 = a2(l3, Q3); + if (Z3) { + if (Z3 === m2) + continue; + return Z3; + } + } + if (Q3.method === "next") + Q3.sent = Q3._sent = Q3.arg; + else if (Q3.method === "throw") { + if (B3 === S2) + throw B3 = k2, Q3.arg; + Q3.dispatchException(Q3.arg); + } else + Q3.method === "return" && Q3.abrupt("return", Q3.arg); + B3 = T2; + var d3 = N2(U4, F4, Q3); + if (d3.type === "normal") { + if (B3 = Q3.done ? k2 : E2, d3.arg === m2) + continue; + return { value: d3.arg, done: Q3.done }; + } + d3.type === "throw" && (B3 = k2, Q3.method = "throw", Q3.arg = d3.arg); + } + }; + } + function a2(U4, Q3) { + var B3 = Q3.method, R3 = U4.iterator[B3]; + if (R3 === F3) + return Q3.delegate = null, B3 === "throw" && U4.iterator.return && (Q3.method = "return", Q3.arg = F3, a2(U4, Q3), Q3.method === "throw") || B3 !== "return" && (Q3.method = "throw", Q3.arg = new TypeError("The iterator does not provide a '" + B3 + "' method")), m2; + var V3 = N2(R3, U4.iterator, Q3.arg); + if (V3.type === "throw") + return Q3.method = "throw", Q3.arg = V3.arg, Q3.delegate = null, m2; + var l3 = V3.arg; + return l3 ? l3.done ? (Q3[U4.resultName] = l3.value, Q3.next = U4.nextLoc, Q3.method !== "return" && (Q3.method = "next", Q3.arg = F3), Q3.delegate = null, m2) : l3 : (Q3.method = "throw", Q3.arg = new TypeError("iterator result is not an object"), Q3.delegate = null, m2); + } + function M2(U4) { + var F4 = { tryLoc: U4[0] }; + 1 in U4 && (F4.catchLoc = U4[1]), 2 in U4 && (F4.finallyLoc = U4[2], F4.afterLoc = U4[3]), this.tryEntries.push(F4); + } + function C2(U4) { + var F4 = U4.completion || {}; + F4.type = "normal", delete F4.arg, U4.completion = F4; + } + function y2(U4) { + this.tryEntries = [{ tryLoc: "root" }], U4.forEach(M2, this), this.reset(true); + } + function D2(U4) { + if (U4) { + var Q3 = U4[l2]; + if (Q3) + return Q3.call(U4); + if (typeof U4.next == "function") + return U4; + if (!isNaN(U4.length)) { + var R3 = -1, V3 = function Q4() { + for (; ++R3 < U4.length; ) + if (B2.call(U4, R3)) + return Q4.value = U4[R3], Q4.done = false, Q4; + return Q4.value = F3, Q4.done = true, Q4; + }; + return V3.next = V3; + } + } + return { next: L2 }; + } + function L2() { + return { value: F3, done: true }; + } + return b2.prototype = G2, R2(Y2, "constructor", { value: G2, configurable: true }), R2(G2, "constructor", { value: b2, configurable: true }), b2.displayName = W2(G2, d2, "GeneratorFunction"), U3.isGeneratorFunction = function(U4) { + var F4 = typeof U4 == "function" && U4.constructor; + return !!F4 && (F4 === b2 || (F4.displayName || F4.name) === "GeneratorFunction"); + }, U3.mark = function(U4) { + return Object.setPrototypeOf ? Object.setPrototypeOf(U4, G2) : (U4.__proto__ = G2, W2(U4, d2, "GeneratorFunction")), U4.prototype = Object.create(Y2), U4; + }, U3.awrap = function(U4) { + return { __await: U4 }; + }, h2(c2.prototype), W2(c2.prototype, Z2, function() { + return this; + }), U3.AsyncIterator = c2, U3.async = function(F4, Q3, B3, R3, V3) { + V3 === void 0 && (V3 = Promise); + var l3 = new c2(J2(F4, Q3, B3, R3), V3); + return U3.isGeneratorFunction(Q3) ? l3 : l3.next().then(function(U4) { + return U4.done ? U4.value : l3.next(); + }); + }, h2(Y2), W2(Y2, d2, "Generator"), W2(Y2, l2, function() { + return this; + }), W2(Y2, "toString", function() { + return "[object Generator]"; + }), U3.keys = function(U4) { + var F4 = Object(U4), Q3 = []; + for (var B3 in F4) + Q3.push(B3); + return Q3.reverse(), function U5() { + for (; Q3.length; ) { + var B4 = Q3.pop(); + if (B4 in F4) + return U5.value = B4, U5.done = false, U5; + } + return U5.done = true, U5; + }; + }, U3.values = D2, y2.prototype = { constructor: y2, reset: function(U4) { + if (this.prev = 0, this.next = 0, this.sent = this._sent = F3, this.done = false, this.delegate = null, this.method = "next", this.arg = F3, this.tryEntries.forEach(C2), !U4) + for (var Q3 in this) + Q3.charAt(0) === "t" && B2.call(this, Q3) && !isNaN(+Q3.slice(1)) && (this[Q3] = F3); + }, stop: function() { + this.done = true; + var U4 = this.tryEntries[0].completion; + if (U4.type === "throw") + throw U4.arg; + return this.rval; + }, dispatchException: function(U4) { + if (this.done) + throw U4; + var Q3 = this; + function R3(B3, R4) { + return Z3.type = "throw", Z3.arg = U4, Q3.next = B3, R4 && (Q3.method = "next", Q3.arg = F3), !!R4; + } + for (var V3 = this.tryEntries.length - 1; V3 >= 0; --V3) { + var l3 = this.tryEntries[V3], Z3 = l3.completion; + if (l3.tryLoc === "root") + return R3("end"); + if (l3.tryLoc <= this.prev) { + var d3 = B2.call(l3, "catchLoc"), W3 = B2.call(l3, "finallyLoc"); + if (d3 && W3) { + if (this.prev < l3.catchLoc) + return R3(l3.catchLoc, true); + if (this.prev < l3.finallyLoc) + return R3(l3.finallyLoc); + } else if (d3) { + if (this.prev < l3.catchLoc) + return R3(l3.catchLoc, true); + } else { + if (!W3) + throw new Error("try statement without catch or finally"); + if (this.prev < l3.finallyLoc) + return R3(l3.finallyLoc); + } + } + } + }, abrupt: function(U4, F4) { + for (var Q3 = this.tryEntries.length - 1; Q3 >= 0; --Q3) { + var R3 = this.tryEntries[Q3]; + if (R3.tryLoc <= this.prev && B2.call(R3, "finallyLoc") && this.prev < R3.finallyLoc) { + var V3 = R3; + break; + } + } + V3 && (U4 === "break" || U4 === "continue") && V3.tryLoc <= F4 && F4 <= V3.finallyLoc && (V3 = null); + var l3 = V3 ? V3.completion : {}; + return l3.type = U4, l3.arg = F4, V3 ? (this.method = "next", this.next = V3.finallyLoc, m2) : this.complete(l3); + }, complete: function(U4, F4) { + if (U4.type === "throw") + throw U4.arg; + return U4.type === "break" || U4.type === "continue" ? this.next = U4.arg : U4.type === "return" ? (this.rval = this.arg = U4.arg, this.method = "return", this.next = "end") : U4.type === "normal" && F4 && (this.next = F4), m2; + }, finish: function(U4) { + for (var F4 = this.tryEntries.length - 1; F4 >= 0; --F4) { + var Q3 = this.tryEntries[F4]; + if (Q3.finallyLoc === U4) + return this.complete(Q3.completion, Q3.afterLoc), C2(Q3), m2; + } + }, catch: function(U4) { + for (var F4 = this.tryEntries.length - 1; F4 >= 0; --F4) { + var Q3 = this.tryEntries[F4]; + if (Q3.tryLoc === U4) { + var B3 = Q3.completion; + if (B3.type === "throw") { + var R3 = B3.arg; + C2(Q3); + } + return R3; + } + } + throw new Error("illegal catch attempt"); + }, delegateYield: function(U4, Q3, B3) { + return this.delegate = { iterator: D2(U4), resultName: Q3, nextLoc: B3 }, this.method === "next" && (this.arg = F3), m2; + } }, U3; + }(U2.exports); + try { + regeneratorRuntime = F2; + } catch (U3) { + typeof globalThis == "object" ? globalThis.regeneratorRuntime = F2 : Function("r", "regeneratorRuntime = r")(F2); + } +}({ get exports() { + return DU; +}, set exports(U2) { + DU = U2; +} }); +var LU = (U2, F2) => `${U2}-${F2}-${Math.random().toString(16).slice(3, 8)}`; +var jU = LU; +var xU = 0; +var zU = ({ id: U2, action: F2, payload: Q2 = {} }) => { + let B2 = U2; + return B2 === void 0 && (B2 = jU("Job", xU), xU += 1), { id: B2, action: F2, payload: Q2 }; +}; +var tU = {}; +var HU = false; +tU.logging = HU, tU.setLogging = (U2) => { + HU = U2; +}, tU.log = (...U2) => HU ? console.log.apply(void 0, U2) : null; +var sU = zU; +var { log: oU } = tU; +var OU = LU; +var uU = 0; +var KU = typeof global != "undefined" ? global : typeof self != "undefined" ? self : typeof window != "undefined" ? window : {}; +function wU() { + throw new Error("setTimeout has not been defined"); +} +function vU() { + throw new Error("clearTimeout has not been defined"); +} +var eU = wU; +var gU = vU; +function PU(U2) { + if (eU === setTimeout) + return setTimeout(U2, 0); + if ((eU === wU || !eU) && setTimeout) + return eU = setTimeout, setTimeout(U2, 0); + try { + return eU(U2, 0); + } catch (F2) { + try { + return eU.call(null, U2, 0); + } catch (F3) { + return eU.call(this, U2, 0); + } + } +} +typeof KU.setTimeout == "function" && (eU = setTimeout), typeof KU.clearTimeout == "function" && (gU = clearTimeout); +var rU; +var AU = []; +var fU = false; +var qU = -1; +function _U() { + fU && rU && (fU = false, rU.length ? AU = rU.concat(AU) : qU = -1, AU.length && $U()); +} +function $U() { + if (!fU) { + var U2 = PU(_U); + fU = true; + for (var F2 = AU.length; F2; ) { + for (rU = AU, AU = []; ++qU < F2; ) + rU && rU[qU].run(); + qU = -1, F2 = AU.length; + } + rU = null, fU = false, function(U3) { + if (gU === clearTimeout) + return clearTimeout(U3); + if ((gU === vU || !gU) && clearTimeout) + return gU = clearTimeout, clearTimeout(U3); + try { + return gU(U3); + } catch (F3) { + try { + return gU.call(null, U3); + } catch (F4) { + return gU.call(this, U3); + } + } + }(U2); + } +} +function UF(U2, F2) { + this.fun = U2, this.array = F2; +} +UF.prototype.run = function() { + this.fun.apply(null, this.array); +}; +function FF() { +} +var QF = FF; +var BF = FF; +var RF = FF; +var VF = FF; +var lF = FF; +var ZF = FF; +var dF = FF; +var WF = KU.performance || {}; +var JF = WF.now || WF.mozNow || WF.msNow || WF.oNow || WF.webkitNow || function() { + return new Date().getTime(); +}; +var NF = new Date(); +var SF = { nextTick: function(U2) { + var F2 = new Array(arguments.length - 1); + if (arguments.length > 1) + for (var Q2 = 1; Q2 < arguments.length; Q2++) + F2[Q2 - 1] = arguments[Q2]; + AU.push(new UF(U2, F2)), AU.length !== 1 || fU || PU($U); +}, title: "browser", browser: true, env: {}, argv: [], version: "", versions: {}, on: QF, addListener: BF, once: RF, off: VF, removeListener: lF, removeAllListeners: ZF, emit: dF, binding: function(U2) { + throw new Error("process.binding is not supported"); +}, cwd: function() { + return "/"; +}, chdir: function(U2) { + throw new Error("process.chdir is not supported"); +}, umask: function() { + return 0; +}, hrtime: function(U2) { + var F2 = 1e-3 * JF.call(WF), Q2 = Math.floor(F2), B2 = Math.floor(F2 % 1 * 1e9); + return U2 && (Q2 -= U2[0], (B2 -= U2[1]) < 0 && (Q2--, B2 += 1e9)), [Q2, B2]; +}, platform: "browser", release: {}, config: {}, uptime: function() { + return (new Date() - NF) / 1e3; +} }; +var EF = function() { + return typeof window != "undefined" && typeof window.process == "object" && window.process.type === "renderer" || (!(SF === void 0 || typeof SF.versions != "object" || !SF.versions.electron) || typeof navigator == "object" && typeof navigator.userAgent == "string" && navigator.userAgent.indexOf("Electron") >= 0); +}; +var TF; +var kF = {}; +var mF = { get exports() { + return kF; +}, set exports(U2) { + kF = U2; +} }; +function IF() { + return TF || (TF = 1, mF.exports = function() { + function U2() { + var U3 = arguments.length; + if (U3 === 0) + throw new Error("resolveUrl requires at least one argument; got none."); + var F2 = document.createElement("base"); + if (F2.href = arguments[0], U3 === 1) + return F2.href; + var Q2 = document.getElementsByTagName("head")[0]; + Q2.insertBefore(F2, Q2.firstChild); + for (var B2, R2 = document.createElement("a"), V2 = 1; V2 < U3; V2++) + R2.href = arguments[V2], B2 = R2.href, F2.href = B2; + return Q2.removeChild(F2), B2; + } + return U2; + }()), kF; +} +var bF = ((U2) => { + const F2 = {}; + return typeof WorkerGlobalScope != "undefined" ? F2.type = "webworker" : EF() ? F2.type = "electron" : typeof window == "object" ? F2.type = "browser" : typeof SF == "object" && (F2.type = "node"), U2 === void 0 ? F2 : F2[U2]; +})("type") === "browser"; +var GF = bF ? IF() : (U2) => U2; +var nF = { TESSERACT_ONLY: 0, LSTM_ONLY: 1, TESSERACT_LSTM_COMBINED: 2, DEFAULT: 3 }; +var iF = { defaultOEM: nF.DEFAULT }; +var XF = { name: "tesseract.js", version: "3.0.3", description: "Pure Javascript Multilingual OCR", main: "src/index.js", types: "src/index.d.ts", unpkg: "dist/tesseract.min.js", jsdelivr: "dist/tesseract.min.js", scripts: { start: "node scripts/server.js", build: "rimraf dist && webpack --config scripts/webpack.config.prod.js && rollup -c scripts/rollup.esm.js", "profile:tesseract": "webpack-bundle-analyzer dist/tesseract-stats.json", "profile:worker": "webpack-bundle-analyzer dist/worker-stats.json", prepublishOnly: "npm run build", wait: "rimraf dist && wait-on http://localhost:3000/dist/tesseract.dev.js", test: "npm-run-all -p -r start test:all", "test:all": "npm-run-all wait test:browser:* test:node:all", "test:node": "nyc mocha --exit --bail --require ./scripts/test-helper.js", "test:node:all": "npm run test:node -- ./tests/*.test.js", "test:browser-tpl": "mocha-headless-chrome -a incognito -a no-sandbox -a disable-setuid-sandbox -a disable-logging -t 300000", "test:browser:detect": "npm run test:browser-tpl -- -f ./tests/detect.test.html", "test:browser:recognize": "npm run test:browser-tpl -- -f ./tests/recognize.test.html", "test:browser:scheduler": "npm run test:browser-tpl -- -f ./tests/scheduler.test.html", "test:browser:FS": "npm run test:browser-tpl -- -f ./tests/FS.test.html", lint: "eslint src", "lint:fix": "eslint --fix src", postinstall: "opencollective-postinstall || true" }, browser: { "./src/worker/node/index.js": "./src/worker/browser/index.js" }, author: "", contributors: ["jeromewu"], license: "Apache-2.0", devDependencies: { "@babel/core": "^7.18.7", "@babel/preset-env": "^7.18.7", "@rollup/plugin-commonjs": "^22.0.2", acorn: "^6.4.0", "babel-loader": "^8.2.0", buffer: "^6.0.3", cors: "^2.8.5", eslint: "^7.2.0", "eslint-config-airbnb-base": "^14.2.0", "eslint-plugin-import": "^2.22.1", "expect.js": "^0.3.1", express: "^4.17.1", mocha: "^8.1.3", "mocha-headless-chrome": "^2.0.3", "npm-run-all": "^4.1.5", nyc: "^15.1.0", rimraf: "^2.7.1", rollup: "^2.79.0", "wait-on": "^3.3.0", webpack: "^5.74.0", "webpack-bundle-analyzer": "^4.6.0", "webpack-cli": "^4.10.0", "webpack-dev-middleware": "^5.3.3" }, dependencies: { "babel-eslint": "^10.1.0", "bmp-js": "^0.1.0", "file-type": "^12.4.1", "idb-keyval": "^3.2.0", "is-electron": "^2.2.0", "is-url": "^1.2.4", "node-fetch": "^2.6.0", "opencollective-postinstall": "^2.0.2", "regenerator-runtime": "^0.13.3", "resolve-url": "^0.2.1", "tesseract.js-core": "^3.0.2", "wasm-feature-detect": "^1.2.11", zlibjs: "^0.3.1" }, repository: { type: "git", url: "https://github.com/naptha/tesseract.js.git" }, bugs: { url: "https://github.com/naptha/tesseract.js/issues" }, homepage: "https://github.com/naptha/tesseract.js", collective: { type: "opencollective", url: "https://opencollective.com/tesseractjs" } }; +var YF = IF(); +var { version: hF } = XF; +var cF = { ...{ langPath: "https://tessdata.projectnaptha.com/4.0.0", workerBlobURL: true, logger: () => { +} }, workerPath: SF !== void 0 && SF.env.TESS_ENV === "development" ? YF(`/dist/worker.dev.js?nocache=${Math.random().toString(36).slice(3)}`) : `https://unpkg.com/tesseract.js@v${hF}/dist/worker.min.js`, corePath: null }; +var pF = IF(); +var aF = (U2) => new Promise((F2, Q2) => { + const B2 = new FileReader(); + B2.onload = () => { + F2(B2.result); + }, B2.onerror = ({ target: { error: { code: U3 } } }) => { + Q2(Error(`File could not be read! Code=${U3}`)); + }, B2.readAsArrayBuffer(U2); +}); +var MF = async (U2) => { + let F2 = U2; + if (U2 === void 0) + return "undefined"; + if (typeof U2 == "string") + if (/data:image\/([a-zA-Z]*);base64,([^"]*)/.test(U2)) + F2 = atob(U2.split(",")[1]).split("").map((U3) => U3.charCodeAt(0)); + else { + const Q2 = await fetch(pF(U2)); + F2 = await Q2.arrayBuffer(); + } + else + U2 instanceof HTMLElement ? (U2.tagName === "IMG" && (F2 = await MF(U2.src)), U2.tagName === "VIDEO" && (F2 = await MF(U2.poster)), U2.tagName === "CANVAS" && await new Promise((Q2) => { + U2.toBlob(async (U3) => { + F2 = await aF(U3), Q2(); + }); + })) : (U2 instanceof File || U2 instanceof Blob) && (F2 = await aF(U2)); + return new Uint8Array(F2); +}; +var CF = (U2, F2) => { + U2.onmessage = ({ data: U3 }) => { + F2(U3); + }; +}; +var yF = { defaultOptions: cF, spawnWorker: ({ workerPath: U2, workerBlobURL: F2 }) => { + let Q2; + if (Blob && URL && F2) { + const F3 = new Blob([`importScripts("${U2}");`], { type: "application/javascript" }); + Q2 = new Worker(URL.createObjectURL(F3)); + } else + Q2 = new Worker(U2); + return Q2; +}, terminateWorker: (U2) => { + U2.terminate(); +}, onMessage: CF, send: async (U2, F2) => { + U2.postMessage(F2); +}, loadImage: MF }; +var DF = (U2) => { + const F2 = { ...U2 }; + return ["corePath", "workerPath", "langPath"].forEach((Q2) => { + U2[Q2] && (F2[Q2] = GF(F2[Q2])); + }), F2; +}; +var LF = (U2) => { + const F2 = [], Q2 = [], B2 = [], R2 = [], V2 = []; + return U2.blocks.forEach((l2) => { + l2.paragraphs.forEach((F3) => { + F3.lines.forEach((Q3) => { + Q3.words.forEach((B3) => { + B3.symbols.forEach((R3) => { + V2.push({ ...R3, page: U2, block: l2, paragraph: F3, line: Q3, word: B3 }); + }), R2.push({ ...B3, page: U2, block: l2, paragraph: F3, line: Q3 }); + }), B2.push({ ...Q3, page: U2, block: l2, paragraph: F3 }); + }), Q2.push({ ...F3, page: U2, block: l2 }); + }), F2.push({ ...l2, page: U2 }); + }), { ...U2, blocks: F2, paragraphs: Q2, lines: B2, words: R2, symbols: V2 }; +}; +var jF = zU; +var { log: xF } = tU; +var zF = LU; +var { defaultOEM: tF } = iF; +var { defaultOptions: HF, spawnWorker: sF, terminateWorker: oF, onMessage: OF, loadImage: uF, send: KF } = yF; +var wF = 0; +var vF = (U2 = {}) => { + const F2 = zF("Worker", wF), { logger: Q2, errorHandler: B2, ...R2 } = DF({ ...HF, ...U2 }), V2 = {}, l2 = {}; + let Z2 = sF(R2); + wF += 1; + const d2 = (U3, F3) => { + V2[U3] = F3; + }, W2 = (U3, F3) => { + l2[U3] = F3; + }, J2 = ({ id: U3, action: Q3, payload: B3 }) => new Promise((R3, V3) => { + xF(`[${F2}]: Start ${U3}, action=${Q3}`), d2(Q3, R3), W2(Q3, V3), KF(Z2, { workerId: F2, jobId: U3, action: Q3, payload: B3 }); + }); + return OF(Z2, ({ workerId: U3, jobId: F3, status: R3, action: Z3, data: d3 }) => { + if (R3 === "resolve") { + xF(`[${U3}]: Complete ${F3}`); + let Q3 = d3; + Z3 === "recognize" ? Q3 = LF(d3) : Z3 === "getPDF" && (Q3 = Array.from({ ...d3, length: Object.keys(d3).length })), V2[Z3]({ jobId: F3, data: Q3 }); + } else if (R3 === "reject") { + if (l2[Z3](d3), !B2) + throw Error(d3); + B2(d3); + } else + R3 === "progress" && Q2({ ...d3, userJobId: F3 }); + }), { id: F2, worker: Z2, setResolve: d2, setReject: W2, load: (U3) => J2(jF({ id: U3, action: "load", payload: { options: R2 } })), writeText: (U3, F3, Q3) => J2(jF({ id: Q3, action: "FS", payload: { method: "writeFile", args: [U3, F3] } })), readText: (U3, F3) => J2(jF({ id: F3, action: "FS", payload: { method: "readFile", args: [U3, { encoding: "utf8" }] } })), removeFile: (U3, F3) => J2(jF({ id: F3, action: "FS", payload: { method: "unlink", args: [U3] } })), FS: (U3, F3, Q3) => J2(jF({ id: Q3, action: "FS", payload: { method: U3, args: F3 } })), loadLanguage: (U3 = "eng", F3) => J2(jF({ id: F3, action: "loadLanguage", payload: { langs: U3, options: R2 } })), initialize: (U3 = "eng", F3 = tF, Q3) => J2(jF({ id: Q3, action: "initialize", payload: { langs: U3, oem: F3 } })), setParameters: (U3 = {}, F3) => J2(jF({ id: F3, action: "setParameters", payload: { params: U3 } })), recognize: async (U3, F3 = {}, Q3) => J2(jF({ id: Q3, action: "recognize", payload: { image: await uF(U3), options: F3 } })), getPDF: (U3 = "Tesseract OCR Result", F3 = false, Q3) => J2(jF({ id: Q3, action: "getPDF", payload: { title: U3, textonly: F3 } })), detect: async (U3, F3) => J2(jF({ id: F3, action: "detect", payload: { image: await uF(U3) } })), terminate: async () => (Z2 !== null && (oF(Z2), Z2 = null), Promise.resolve()) }; +}; +var eF = vF; +var gF = () => { + const U2 = OU("Scheduler", uU), F2 = {}, Q2 = {}; + let B2 = []; + uU += 1; + const R2 = () => Object.keys(F2).length, V2 = () => { + if (B2.length !== 0) { + const U3 = Object.keys(F2); + for (let R3 = 0; R3 < U3.length; R3 += 1) + if (Q2[U3[R3]] === void 0) { + B2[0](F2[U3[R3]]); + break; + } + } + }; + return { addWorker: (Q3) => (F2[Q3.id] = Q3, oU(`[${U2}]: Add ${Q3.id}`), oU(`[${U2}]: Number of workers=${R2()}`), V2(), Q3.id), addJob: async (F3, ...l2) => { + if (R2() === 0) + throw Error(`[${U2}]: You need to have at least one worker before adding jobs`); + return ((F4, R3) => new Promise((l3, Z2) => { + const d2 = sU({ action: F4, payload: R3 }); + B2.push(async (U3) => { + B2.shift(), Q2[U3.id] = d2; + try { + l3(await U3[F4].apply(void 0, [...R3, d2.id])); + } catch (U4) { + Z2(U4); + } finally { + delete Q2[U3.id], V2(); + } + }), oU(`[${U2}]: Add ${d2.id} to JobQueue`), oU(`[${U2}]: JobQueue length=${B2.length}`), V2(); + }))(F3, l2); + }, terminate: async () => { + Object.keys(F2).forEach(async (U3) => { + await F2[U3].terminate(); + }), B2 = []; + }, getQueueLen: () => B2.length, getNumWorkers: R2 }; +}; +var PF = vF; +var rF = { recognize: async (U2, F2, Q2) => { + const B2 = eF(Q2); + return await B2.load(), await B2.loadLanguage(F2), await B2.initialize(F2), B2.recognize(U2).finally(async () => { + await B2.terminate(); + }); +}, detect: async (U2, F2) => { + const Q2 = eF(F2); + return await Q2.load(), await Q2.loadLanguage("osd"), await Q2.initialize("osd"), Q2.detect(U2).finally(async () => { + await Q2.terminate(); + }); +} }; +var AF = { AFR: "afr", AMH: "amh", ARA: "ara", ASM: "asm", AZE: "aze", AZE_CYRL: "aze_cyrl", BEL: "bel", BEN: "ben", BOD: "bod", BOS: "bos", BUL: "bul", CAT: "cat", CEB: "ceb", CES: "ces", CHI_SIM: "chi_sim", CHI_TRA: "chi_tra", CHR: "chr", CYM: "cym", DAN: "dan", DEU: "deu", DZO: "dzo", ELL: "ell", ENG: "eng", ENM: "enm", EPO: "epo", EST: "est", EUS: "eus", FAS: "fas", FIN: "fin", FRA: "fra", FRK: "frk", FRM: "frm", GLE: "gle", GLG: "glg", GRC: "grc", GUJ: "guj", HAT: "hat", HEB: "heb", HIN: "hin", HRV: "hrv", HUN: "hun", IKU: "iku", IND: "ind", ISL: "isl", ITA: "ita", ITA_OLD: "ita_old", JAV: "jav", JPN: "jpn", KAN: "kan", KAT: "kat", KAT_OLD: "kat_old", KAZ: "kaz", KHM: "khm", KIR: "kir", KOR: "kor", KUR: "kur", LAO: "lao", LAT: "lat", LAV: "lav", LIT: "lit", MAL: "mal", MAR: "mar", MKD: "mkd", MLT: "mlt", MSA: "msa", MYA: "mya", NEP: "nep", NLD: "nld", NOR: "nor", ORI: "ori", PAN: "pan", POL: "pol", POR: "por", PUS: "pus", RON: "ron", RUS: "rus", SAN: "san", SIN: "sin", SLK: "slk", SLV: "slv", SPA: "spa", SPA_OLD: "spa_old", SQI: "sqi", SRP: "srp", SRP_LATN: "srp_latn", SWA: "swa", SWE: "swe", SYR: "syr", TAM: "tam", TEL: "tel", TGK: "tgk", TGL: "tgl", THA: "tha", TIR: "tir", TUR: "tur", UIG: "uig", UKR: "ukr", URD: "urd", UZB: "uzb", UZB_CYRL: "uzb_cyrl", VIE: "vie", YID: "yid" }; +var fF = nF; +var qF = { OSD_ONLY: "0", AUTO_OSD: "1", AUTO_ONLY: "2", AUTO: "3", SINGLE_COLUMN: "4", SINGLE_BLOCK_VERT_TEXT: "5", SINGLE_BLOCK: "6", SINGLE_LINE: "7", SINGLE_WORD: "8", CIRCLE_WORD: "9", SINGLE_CHAR: "10", SPARSE_TEXT: "11", SPARSE_TEXT_OSD: "12" }; +var { setLogging: _F } = tU; +var $F = { languages: AF, OEM: fF, PSM: qF, createScheduler: gF, createWorker: PF, setLogging: _F, ...rF }; +async function UQ(Q2) { + if (!import_obsidian.Platform.isDesktopApp || !import_obsidian.Platform.isMacOS) + throw new Error("SystemOCR is currently only supported on macOS"); + const B2 = Q2.vault.adapter; + let R2; + if (!(B2 instanceof import_obsidian.FileSystemAdapter)) + throw new Error("Can not get FileSystemAdapter"); + R2 = B2.getFullPath(Q2.path); + const { stdout: V2, stderr: l2 } = await (Z2 = ` +-- copyright https://stackoverflow.com/a/75779406 +use framework "Vision" + +on getImageText(imagePath) + -- Get image content + set theImage to current application's NSImage's alloc()'s initWithContentsOfFile:imagePath + + -- Set up request handler using image's raw data + set requestHandler to current application's VNImageRequestHandler's alloc()'s initWithData:(theImage's TIFFRepresentation()) options:(current application's NSDictionary's alloc()'s init()) + + -- Initialize text request + set theRequest to current application's VNRecognizeTextRequest's alloc()'s init() + theRequest's setAutomaticallyDetectsLanguage:true + + -- Perform the request and get the results + requestHandler's performRequests:(current application's NSArray's arrayWithObject:(theRequest)) |error|:(missing value) + set theResults to theRequest's results() + + -- Obtain and return the string values of the results + set theText to {} + repeat with observation in theResults + copy ((first item in (observation's topCandidates:1))'s |string|() as text) to end of theText + end repeat + return theText +end getImageText + +on run (argv) + if (count of argv) is 0 then error "Must provide an image path" + set text item delimiters to linefeed + getImageText(item 1 of argv) as text +end run +`, d2 = ["-", R2], new Promise((U2, F2) => { + const { spawn: Q3 } = require("child_process"), B3 = Q3("osascript", d2); + let R3 = "", V3 = ""; + B3.stdout.on("data", (U3) => { + R3 += U3.toString(); + }), B3.stderr.on("data", (U3) => { + V3 += U3.toString(); + }), B3.on("close", (Q4) => { + Q4 === 0 ? U2({ stdout: R3, stderr: V3 }) : F2(new Error(`Process exited with code ${Q4}: ${V3}`)); + }), B3.on("error", (U3) => { + F2(U3); + }), B3.stdin.write(Z2), B3.stdin.end(); + })); + var Z2, d2; + return l2 && (console.error("Text Extractor - error occurred while invoking mac OCR "), console.error(l2)), V2; +} +var FQ; +var QQ; +var BQ; +var RQ; +var VQ; +var lQ; +var ZQ; +var dQ; +function WQ(U2) { + return U2.sort().join("+"); +} +var JQ = class { + constructor(U2) { + this.worker = U2, BQ.set(this, false), RQ.set(this, false); + } + static getWorker() { + const U2 = Q(JQ, FQ, "f", QQ).find((U3) => !Q(U3, BQ, "f") && Q(U3, RQ, "f")); + if (U2) + return U2; + const F2 = new JQ($F.createWorker({ cachePath: "tesseract-" + app.appId })); + return Q(JQ, FQ, "f", QQ).push(F2), F2; + } + static clearWorkers() { + Q(JQ, FQ, "f", QQ).forEach((U2) => U2.worker.terminate()), B(JQ, FQ, [], "f", QQ); + } + async run(U2) { + return new Promise(async (F2, R2) => { + B(this, BQ, true, "f"); + const V2 = WQ(U2.options.langs); + Q(this, RQ, "f") || (await this.worker.load(), await this.worker.loadLanguage(V2), await this.worker.initialize(V2), B(this, RQ, true, "f")); + const l2 = setTimeout(() => { + this.worker.terminate(), console.warn("Text Extractor - OCR Worker timeout for " + U2.name), R2("timeout"), Q(JQ, FQ, "m", VQ).call(JQ, this); + }, UU); + try { + const { data: Q2 } = await this.worker.recognize(U2.imageData); + return clearTimeout(l2), F2({ text: Q2.text, langs: V2 }); + } catch (Q2) { + console.error("Text Extractor - OCR Worker exception for " + U2.name), console.error(Q2), F2({ text: "", langs: V2 }); + } finally { + B(this, BQ, false, "f"); + } + }); + } +}; +FQ = JQ, BQ = /* @__PURE__ */ new WeakMap(), RQ = /* @__PURE__ */ new WeakMap(), VQ = function(U2) { + U2.worker.terminate(), B(JQ, FQ, Q(JQ, FQ, "f", QQ).filter((F2) => F2 !== U2), "f", QQ); +}, QQ = { value: [] }; +lQ = /* @__PURE__ */ new WeakSet(), ZQ = async function(U2, F2) { + const Q2 = new Uint8ClampedArray(await app.vault.readBinary(U2)), B2 = JQ.getWorker(); + return (await B2.run({ imageData: Buffer.from(Q2.buffer), name: U2.basename, options: F2 })).text.replace(/\n/g, " ").replace(/ +/g, " ").trim(); +}, dQ = async function(F2, B2) { + var _a2; + const R2 = await NU(F2); + if (R2) + return (_a2 = R2.text) != null ? _a2 : RU; + if (import_obsidian.Platform.isMobileApp || !Buffer) + return VU; + const V2 = JU(F2), l2 = B2.useSystemOCR && import_obsidian.Platform.isDesktopApp && import_obsidian.Platform.isMacOS, Z2 = l2 ? "" : WQ(B2.langs); + return new Promise(async (U2, R3) => { + try { + let R4; + R4 = l2 ? await UQ(F2) : await Q(this, lQ, "m", ZQ).call(this, F2, B2), await SU(V2.folder, V2.filename, R4, F2.path, Z2), U2(R4); + } catch (Q2) { + await SU(V2.folder, V2.filename, "", F2.path, Z2), U2(""); + } + }); +}; +var NQ = new class { + constructor() { + lQ.add(this); + } + async getImageText(U2, F2) { + var _a2; + try { + return (_a2 = await QU.add(() => Q(this, lQ, "m", dQ).call(this, U2, F2))) != null ? _a2 : ""; + } catch (F3) { + return console.warn(`Text Extractor - Error while extracting text from ${U2.basename}`), console.warn(F3), ""; + } + } +}(); +function SQ() { + JQ.clearWorkers(); +} +var EQ = ["afr", "amh", "ara", "asm", "aze", "aze_cyrl", "bel", "ben", "bod", "bos", "bul", "cat", "ceb", "ces", "chi_sim", "chi_tra", "chr", "cym", "dan", "deu", "dzo", "ell", "eng", "enm", "epo", "est", "eus", "fas", "fin", "fra", "frk", "frm", "gle", "glg", "grc", "guj", "hat", "heb", "hin", "hrv", "hun", "iku", "ind", "isl", "ita", "ita_old", "jav", "jpn", "kan", "kat", "kat_old", "kaz", "khm", "kir", "kor", "kur", "lao", "lat", "lav", "lit", "mal", "mar", "mkd", "mlt", "msa", "mya", "nep", "nld", "nor", "ori", "pan", "pol", "por", "pus", "ron", "rus", "san", "sin", "slk", "slv", "spa", "spa_old", "sqi", "srp", "srp_latn", "swa", "swe", "syr", "tam", "tel", "tgk", "tgl", "tha", "tir", "tur", "uig", "ukr", "urd", "uzb", "uzb_cyrl", "vie", "yid"]; +function TQ(U2, F2) { + const Q2 = Object.assign({}, { langs: ["eng"], useSystemOCR: false }, F2); + if (kQ(U2.path)) + return nU.getPdfText(U2); + if (mQ(U2.path)) + return NQ.getImageText(U2, Q2); + if (IQ(U2.path)) + return yU.getOfficeText(U2); + throw new Error("File type not supported"); +} +function kQ(U2) { + return U2.toLowerCase().endsWith(".pdf"); +} +function mQ(U2) { + return (U2 = U2.toLowerCase()).endsWith(".png") || U2.endsWith(".jpg") || U2.endsWith(".jpeg") || U2.endsWith(".webp") || U2.endsWith(".gif") || U2.endsWith(".bmp"); +} +function IQ(U2) { + return (U2 = U2.toLowerCase()).endsWith(".docx") || U2.endsWith(".xlsx"); +} +function bQ(U2) { + return kQ(U2) || mQ(U2) || IQ(U2); +} +function GQ() { + return EQ; +} +function nQ() { + FU.clear(); +} +async function iQ(U2) { + const F2 = JU(U2); + return app.vault.adapter.exists(F2.fullpath); +} +async function XQ(U2) { + const F2 = JU(U2); + if (await iQ(U2)) + return await app.vault.adapter.remove(F2.fullpath); +} + +// src/components/LangSelector.svelte +function add_css3(target) { + append_styles(target, "svelte-b16yhr", ".text-extract.svelte-b16yhr div.multiselect{color:var(--text-primary);border:var(--input-border-width) solid var(--background-modifier-border);background-color:var(--background-secondary)}.text-extract.svelte-b16yhr div.multiselect > ul.options{background-color:var(--background-secondary)}.text-extract.svelte-b16yhr div.multiselect button{border-radius:0}.text-extract.svelte-b16yhr button:not(.clickable-icon){background-color:transparent;box-shadow:none;width:1em}"); +} +function create_fragment7(ctx) { + let div; + let multiselect; + let updating_selected; + let current; + function multiselect_selected_binding(value) { + ctx[2](value); + } + let multiselect_props = { options: ctx[1], maxSelect: 3 }; + if (ctx[0] !== void 0) { + multiselect_props.selected = ctx[0]; + } + multiselect = new MultiSelect_default({ props: multiselect_props }); + binding_callbacks.push(() => bind(multiselect, "selected", multiselect_selected_binding)); + return { + c() { + div = element("div"); + create_component(multiselect.$$.fragment); + attr(div, "class", "text-extract svelte-b16yhr"); + }, + m(target, anchor) { + insert(target, div, anchor); + mount_component(multiselect, div, null); + current = true; + }, + p(ctx2, [dirty]) { + const multiselect_changes = {}; + if (!updating_selected && dirty & 1) { + updating_selected = true; + multiselect_changes.selected = ctx2[0]; + add_flush_callback(() => updating_selected = false); + } + multiselect.$set(multiselect_changes); + }, + i(local) { + if (current) + return; + transition_in(multiselect.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(multiselect.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) + detach(div); + destroy_component(multiselect); + } + }; +} +function instance7($$self, $$props, $$invalidate) { + let $selectedLanguages; + component_subscribe($$self, selectedLanguages, ($$value) => $$invalidate(0, $selectedLanguages = $$value)); + const langs = GQ(); + function multiselect_selected_binding(value) { + $selectedLanguages = value; + selectedLanguages.set($selectedLanguages); + } + return [$selectedLanguages, langs, multiselect_selected_binding]; +} +var LangSelector = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance7, create_fragment7, safe_not_equal, {}, add_css3); + } +}; +var LangSelector_default = LangSelector; + +// src/settings.ts +var TextExtractorSettingsTab = class extends import_obsidian2.PluginSettingTab { + constructor(plugin) { + super(app, plugin); + this.plugin = plugin; + selectedLanguages.subscribe(async (value) => { + settings.ocrLanguages = value; + SQ(); + await saveSettings(this.plugin); + }); + } + display() { + const { containerEl } = this; + containerEl.empty(); + containerEl.createEl("h2", { text: "Text Extractor - Settings" }); + if (import_obsidian2.Platform.isDesktopApp && import_obsidian2.Platform.isMacOS) { + new import_obsidian2.Setting(containerEl).setName("Use system OCR").setDesc("If enabled, Text Extractor will use the system OCR instead of Tesseract. The OCR language will be detected automatically.").addToggle((toggle) => { + toggle.setValue(settings.useSystemOCR).onChange(async (v2) => { + settings.useSystemOCR = v2; + if (v2) { + SQ(); + } + await saveSettings(this.plugin); + }); + }); + } + const container = containerEl.createEl("div", { + cls: "setting-item" + }); + const info = container.createDiv({ cls: "setting-item-info" }); + info.createDiv({ cls: "setting-item-name", text: "OCR Languages" }); + info.createDiv({ + cls: "setting-item-description", + text: `A list of languages to use for OCR. e.g. if your vault contains documents in English and French, you'd want to add 'eng' and 'fra' here. + This setting only applies to images, not PDFs. You may have to clear the cache after changing this setting.` + }); + new LangSelector_default({ + target: container.createDiv({ cls: "setting-item-control" }) + }); + new import_obsidian2.Setting(containerEl).setName("Right click menu").setDesc('Add "Text Extractor" actions to the right click menu in the file explorer.').addToggle((toggle) => { + toggle.setValue(settings.rightClickMenu).onChange(async (v2) => { + settings.rightClickMenu = v2; + await saveSettings(this.plugin); + }); + }); + new import_obsidian2.Setting(containerEl).setName("Danger Zone").setHeading(); + const resetCacheDesc = new DocumentFragment(); + resetCacheDesc.createSpan({}, (span) => { + span.innerHTML = `Erase all Text Extractor cache data. Use this if you want to re-extract all your files, e.g after a change in language settings.
+ Be careful that re-extracting all your files can take a long time.`; + }); + new import_obsidian2.Setting(containerEl).setName("Clear cache data").setDesc(resetCacheDesc).addButton((cb) => { + cb.setButtonText("Clear cache"); + cb.onClick(async () => { + await app.vault.adapter.rmdir(dU(), true); + new import_obsidian2.Notice("Text Extract - Cache cleared."); + }); + }); + } +}; +var DEFAULT_SETTINGS = { + ocrLanguages: ["eng"], + rightClickMenu: true, + useSystemOCR: false +}; +var selectedLanguages = writable(DEFAULT_SETTINGS.ocrLanguages); +var settings = Object.assign({}, DEFAULT_SETTINGS); +async function loadSettings(plugin) { + settings = Object.assign({}, DEFAULT_SETTINGS, await plugin.loadData()); + if (settings.ocrLanguages.length === 0) { + settings.ocrLanguages = DEFAULT_SETTINGS.ocrLanguages; + } + selectedLanguages.set(settings.ocrLanguages); +} +async function saveSettings(plugin) { + await plugin.saveData(settings); +} + +// src/utils.ts +var import_obsidian3 = require("obsidian"); +async function createNote(name, contents = "") { + var _a2, _b, _c; + try { + let pathPrefix; + switch (app.vault.getConfig("newFileLocation")) { + case "current": + pathPrefix = (_c = (_b = (_a2 = app.workspace.getActiveFile()) == null ? void 0 : _a2.parent) == null ? void 0 : _b.path) != null ? _c : ""; + break; + case "folder": + pathPrefix = app.vault.getConfig("newFileFolderPath"); + break; + default: + pathPrefix = ""; + break; + } + if (pathPrefix) { + pathPrefix += "/"; + } + let path = `${pathPrefix}${name}`; + if (app.vault.getAbstractFileByPath(`${path}.md`)) { + let i2 = 1; + while (await app.vault.getAbstractFileByPath(`${path} ${i2}.md`)) { + i2++; + } + path += ` ${i2}`; + } + await app.vault.create(`${path}.md`, contents); + await app.workspace.openLinkText(path, ""); + } catch (e2) { + new import_obsidian3.Notice("Text Extract - Could not create note: " + e2.message); + throw e2; + } +} + +// src/main.ts +var TextExtractorPlugin = class extends import_obsidian4.Plugin { + constructor() { + super(...arguments); + this.api = { + async extractText(file) { + const langs = settings.ocrLanguages; + const useSystemOCR = settings.useSystemOCR; + return await TQ(file, { langs, useSystemOCR }); + }, + canFileBeExtracted: bQ, + isInCache: iQ + }; + } + async onload() { + await loadSettings(this); + await WU(); + this.addSettingTab(new TextExtractorSettingsTab(this)); + this.addCommand({ + id: "extract-to-clipboard", + name: "Extract text to clipboard", + callback: () => { + const file = getActiveFile(this.app); + if (file != null && bQ(file.path)) { + extractToClipboard(file); + } + } + }); + this.addCommand({ + id: "extract-to-new-note", + name: "Extract text into a new note", + callback: () => { + const file = getActiveFile(this.app); + if (file != null && bQ(file.path)) { + extractToNewNote(file); + } + } + }); + this.registerEvent(app.workspace.on("file-menu", (menu, file, _source) => { + if (file instanceof import_obsidian4.TFile && bQ(file.path)) { + if (import_obsidian4.Platform.isDesktopApp) { + menu.addItem((item) => { + item.setTitle("Text Extractor"); + const submenu = item.setSubmenu(); + submenu.addItem((item2) => { + item2.setTitle("Extract Text to clipboard").setIcon("clipboard-copy").onClick(async () => { + extractToClipboard(file); + }); + }); + submenu.addItem((item2) => { + item2.setTitle("Extract text into a new note").setIcon("document").onClick(async () => { + extractToNewNote(file); + }); + }); + if (import_obsidian4.Platform.isDesktopApp) { + submenu.addSeparator(); + submenu.addItem((item2) => { + item2.setTitle("Clear cache for this file").setIcon("trash").onClick(async () => { + await XQ(file); + new import_obsidian4.Notice(`Text Extractor - Removed ${file.path} from cache`); + }); + }); + } + }); + } else { + menu.addItem((item) => { + item.setTitle("Extract text into a new note").setIcon("document").onClick(async () => { + extractToNewNote(file); + }); + }); + } + } + })); + } + onunload() { + nQ(); + } +}; +async function extractTextWithNotice(file) { + if (!await iQ(file)) { + new import_obsidian4.Notice(`Text Extractor - Extracting text from file ${file.path}, please wait...`); + } + try { + const langs = settings.ocrLanguages; + const useSystemOCR = settings.useSystemOCR; + return await TQ(file, { langs, useSystemOCR }); + } catch (e2) { + new import_obsidian4.Notice(`Text Extractor - Error extracting text from file ${file.path}`); + throw e2; + } +} +async function extractToClipboard(file) { + const { clipboard } = require("electron"); + const text2 = await extractTextWithNotice(file); + await clipboard.writeText(text2); + new import_obsidian4.Notice("Text Extractor - Text copied to clipboard"); +} +async function extractToNewNote(file) { + let contents = await extractTextWithNotice(file); + contents = `${contents} + +![[${file.path}]]`; + await createNote(file.basename, contents); +} +function getActiveFile(app2) { + var _a2, _b; + return (_b = (_a2 = app2.workspace.activeEditor) == null ? void 0 : _a2.file) != null ? _b : app2.workspace.getActiveFile(); +} +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + +/* nosourcemap */ \ No newline at end of file diff --git a/.obsidian/plugins/text-extractor/manifest.json b/.obsidian/plugins/text-extractor/manifest.json new file mode 100644 index 00000000..9dc99634 --- /dev/null +++ b/.obsidian/plugins/text-extractor/manifest.json @@ -0,0 +1,14 @@ +{ + "id": "text-extractor", + "name": "Text Extractor", + "version": "0.6.1", + "minAppVersion": "1.4.16", + "description": "A (companion) plugin to facilitate the extraction of text from images (OCR) and PDFs.", + "author": "Simon Cambier", + "authorUrl": "https://github.com/scambier/obsidian-text-extractor", + "fundingUrl": { + "Github": "https://github.com/sponsors/scambier", + "Ko-fi": "https://ko-fi.com/scambier" + }, + "isDesktopOnly": false +} \ No newline at end of file diff --git a/.obsidian/plugins/unitade/data.json b/.obsidian/plugins/unitade/data.json new file mode 100644 index 00000000..645cee43 --- /dev/null +++ b/.obsidian/plugins/unitade/data.json @@ -0,0 +1,63 @@ +{ + "markdown_overcharge": false, + "extensions": "txt", + "is_case_insensitive": false, + "is_onload": false, + "is_onload_unsafe": false, + "forced_extensions": "", + "is_ignore": false, + "ignore_extensions": "", + "ignore_masks": "", + "is_grouped": false, + "grouped_extensions": "", + "mobile_settings": { + "enable": false, + "extensions": "txt", + "stable": true + }, + "barefiling": true, + "stable": true, + "errors": { + "": "Error from UNITADE plugin: Error: Attempting to register an existing view type \"\"" + }, + "debug_mode": false, + "silence_errors": false, + "manifest_version": "3.2.6", + "compatibility_module": true, + "safe_mode": true, + "code_editor_settings": { + "enabled": true, + "use_default_extensions": true, + "extensions": "", + "folding": true, + "line_numbers": true, + "word_wrapping": false, + "minimapping": true, + "validation_semantic": true, + "validation_syntax": true, + "theme": "auto", + "force_vanilla_paste": false, + "enable_zoom": true, + "font_size": 14, + "font_family": "'Cascadia Code', 'Fira Code', Consolas, 'Courier New', monospace", + "font_ligatures": true + }, + "SYS_FONTSIZE_MAX": 32, + "SYS_FONTSIZE_MIN": 5, + "status_bar": { + "enabled": true, + "registered_extensions": { + "enabled": false, + "include_extensions": true, + "include_extensions_grouped": true, + "include_code_editor_extensions": false + }, + "registered_views": false, + "current_processor": true, + "current_display": true, + "cursor_position": true + }, + "advanced_silencing_errors": { + "signatures": "" + } +} \ No newline at end of file diff --git a/.obsidian/plugins/unitade/main.js b/.obsidian/plugins/unitade/main.js new file mode 100644 index 00000000..77c32d59 --- /dev/null +++ b/.obsidian/plugins/unitade/main.js @@ -0,0 +1,533827 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __defProps = Object.defineProperties; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropDescs = Object.getOwnPropertyDescriptors; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __propIsEnum = Object.prototype.propertyIsEnumerable; +var __reflectGet = Reflect.get; +var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name); +var __typeError = (msg) => { + throw TypeError(msg); +}; +var __pow = Math.pow; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __spreadValues = (a3, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a3, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a3, prop, b[prop]); + } + return a3; +}; +var __spreadProps = (a3, b) => __defProps(a3, __getOwnPropDescs(b)); +var __objRest = (source, exclude) => { + var target = {}; + for (var prop in source) + if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0) + target[prop] = source[prop]; + if (source != null && __getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(source)) { + if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop)) + target[prop] = source[prop]; + } + return target; +}; +var __esm = (fn, res) => function __init() { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; +}; +var __commonJS = (cb, mod) => function __require2() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); +var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj); +var __async = (__this, __arguments, generator) => { + return new Promise((resolve2, reject) => { + var fulfilled = (value) => { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + }; + var rejected = (value) => { + try { + step(generator.throw(value)); + } catch (e) { + reject(e); + } + }; + var step = (x) => x.done ? resolve2(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); + step((generator = generator.apply(__this, __arguments)).next()); + }); +}; +var __await = function(promise, isYieldStar) { + this[0] = promise; + this[1] = isYieldStar; +}; +var __yieldStar = (value) => { + var obj = value[__knownSymbol("asyncIterator")], isAwait = false, method, it = {}; + if (obj == null) { + obj = value[__knownSymbol("iterator")](); + method = (k) => it[k] = (x) => obj[k](x); + } else { + obj = obj.call(value); + method = (k) => it[k] = (v) => { + if (isAwait) { + isAwait = false; + if (k === "throw") throw v; + return v; + } + isAwait = true; + return { + done: false, + value: new __await(new Promise((resolve2) => { + var x = obj[k](v); + if (!(x instanceof Object)) __typeError("Object expected"); + resolve2(x); + }), 1) + }; + }; + } + return it[__knownSymbol("iterator")] = () => it, method("next"), "throw" in obj ? method("throw") : it.throw = (x) => { + throw x; + }, "return" in obj && method("return"), it; +}; +var __forAwait = (obj, it, method) => (it = obj[__knownSymbol("asyncIterator")]) ? it.call(obj) : (obj = obj[__knownSymbol("iterator")](), it = {}, method = (key, fn) => (fn = obj[key]) && (it[key] = (arg) => new Promise((yes, no, done) => (arg = fn.call(obj, arg), done = arg.done, Promise.resolve(arg.value).then((value) => yes({ value, done }), no)))), method("next"), method("return"), it); + +// lib/codemirror.js +var require_codemirror = __commonJS({ + "lib/codemirror.js"(exports2, module3) { + "use strict"; + module3.exports = CodeMirror; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/arrays.js +function tail(array2, n = 0) { + return array2[array2.length - (1 + n)]; +} +function tail2(arr) { + if (arr.length === 0) { + throw new Error("Invalid tail call"); + } + return [arr.slice(0, arr.length - 1), arr[arr.length - 1]]; +} +function equals(one, other, itemEquals2 = (a3, b) => a3 === b) { + if (one === other) { + return true; + } + if (!one || !other) { + return false; + } + if (one.length !== other.length) { + return false; + } + for (let i = 0, len = one.length; i < len; i++) { + if (!itemEquals2(one[i], other[i])) { + return false; + } + } + return true; +} +function removeFastWithoutKeepingOrder(array2, index) { + const last = array2.length - 1; + if (index < last) { + array2[index] = array2[last]; + } + array2.pop(); +} +function binarySearch(array2, key, comparator) { + return binarySearch2(array2.length, (i) => comparator(array2[i], key)); +} +function binarySearch2(length, compareToKey) { + let low = 0, high = length - 1; + while (low <= high) { + const mid = (low + high) / 2 | 0; + const comp = compareToKey(mid); + if (comp < 0) { + low = mid + 1; + } else if (comp > 0) { + high = mid - 1; + } else { + return mid; + } + } + return -(low + 1); +} +function quickSelect(nth, data, compare2) { + nth = nth | 0; + if (nth >= data.length) { + throw new TypeError("invalid index"); + } + const pivotValue = data[Math.floor(data.length * Math.random())]; + const lower = []; + const higher = []; + const pivots = []; + for (const value of data) { + const val = compare2(value, pivotValue); + if (val < 0) { + lower.push(value); + } else if (val > 0) { + higher.push(value); + } else { + pivots.push(value); + } + } + if (nth < lower.length) { + return quickSelect(nth, lower, compare2); + } else if (nth < lower.length + pivots.length) { + return pivots[0]; + } else { + return quickSelect(nth - (lower.length + pivots.length), higher, compare2); + } +} +function groupBy(data, compare2) { + const result = []; + let currentGroup = void 0; + for (const element of data.slice(0).sort(compare2)) { + if (!currentGroup || compare2(currentGroup[0], element) !== 0) { + currentGroup = [element]; + result.push(currentGroup); + } else { + currentGroup.push(element); + } + } + return result; +} +function* groupAdjacentBy(items, shouldBeGrouped) { + let currentGroup; + let last; + for (const item of items) { + if (last !== void 0 && shouldBeGrouped(last, item)) { + currentGroup.push(item); + } else { + if (currentGroup) { + yield currentGroup; + } + currentGroup = [item]; + } + last = item; + } + if (currentGroup) { + yield currentGroup; + } +} +function forEachAdjacent(arr, f3) { + for (let i = 0; i <= arr.length; i++) { + f3(i === 0 ? void 0 : arr[i - 1], i === arr.length ? void 0 : arr[i]); + } +} +function forEachWithNeighbors(arr, f3) { + for (let i = 0; i < arr.length; i++) { + f3(i === 0 ? void 0 : arr[i - 1], arr[i], i + 1 === arr.length ? void 0 : arr[i + 1]); + } +} +function coalesce(array2) { + return array2.filter((e) => !!e); +} +function coalesceInPlace(array2) { + let to = 0; + for (let i = 0; i < array2.length; i++) { + if (!!array2[i]) { + array2[to] = array2[i]; + to += 1; + } + } + array2.length = to; +} +function isFalsyOrEmpty(obj) { + return !Array.isArray(obj) || obj.length === 0; +} +function isNonEmptyArray(obj) { + return Array.isArray(obj) && obj.length > 0; +} +function distinct(array2, keyFn = (value) => value) { + const seen = /* @__PURE__ */ new Set(); + return array2.filter((element) => { + const key = keyFn(element); + if (seen.has(key)) { + return false; + } + seen.add(key); + return true; + }); +} +function firstOrDefault(array2, notFoundValue) { + return array2.length > 0 ? array2[0] : notFoundValue; +} +function range(arg, to) { + let from = typeof to === "number" ? arg : 0; + if (typeof to === "number") { + from = arg; + } else { + from = 0; + to = arg; + } + const result = []; + if (from <= to) { + for (let i = from; i < to; i++) { + result.push(i); + } + } else { + for (let i = from; i > to; i--) { + result.push(i); + } + } + return result; +} +function arrayInsert(target, insertIndex, insertArr) { + const before = target.slice(0, insertIndex); + const after2 = target.slice(insertIndex); + return before.concat(insertArr, after2); +} +function pushToStart(arr, value) { + const index = arr.indexOf(value); + if (index > -1) { + arr.splice(index, 1); + arr.unshift(value); + } +} +function pushToEnd(arr, value) { + const index = arr.indexOf(value); + if (index > -1) { + arr.splice(index, 1); + arr.push(value); + } +} +function pushMany(arr, items) { + for (const item of items) { + arr.push(item); + } +} +function asArray(x) { + return Array.isArray(x) ? x : [x]; +} +function insertInto(array2, start, newItems) { + const startIdx = getActualStartIndex(array2, start); + const originalLength = array2.length; + const newItemsLength = newItems.length; + array2.length = originalLength + newItemsLength; + for (let i = originalLength - 1; i >= startIdx; i--) { + array2[i + newItemsLength] = array2[i]; + } + for (let i = 0; i < newItemsLength; i++) { + array2[i + startIdx] = newItems[i]; + } +} +function splice(array2, start, deleteCount, newItems) { + const index = getActualStartIndex(array2, start); + let result = array2.splice(index, deleteCount); + if (result === void 0) { + result = []; + } + insertInto(array2, index, newItems); + return result; +} +function getActualStartIndex(array2, start) { + return start < 0 ? Math.max(start + array2.length, 0) : Math.min(start, array2.length); +} +function compareBy(selector, comparator) { + return (a3, b) => comparator(selector(a3), selector(b)); +} +function tieBreakComparators(...comparators) { + return (item1, item2) => { + for (const comparator of comparators) { + const result = comparator(item1, item2); + if (!CompareResult.isNeitherLessOrGreaterThan(result)) { + return result; + } + } + return CompareResult.neitherLessOrGreaterThan; + }; +} +function reverseOrder(comparator) { + return (a3, b) => -comparator(a3, b); +} +var CompareResult, numberComparator, booleanComparator, ArrayQueue, CallbackIterable, Permutation; +var init_arrays = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/arrays.js"() { + (function(CompareResult2) { + function isLessThan(result) { + return result < 0; + } + CompareResult2.isLessThan = isLessThan; + function isLessThanOrEqual(result) { + return result <= 0; + } + CompareResult2.isLessThanOrEqual = isLessThanOrEqual; + function isGreaterThan(result) { + return result > 0; + } + CompareResult2.isGreaterThan = isGreaterThan; + function isNeitherLessOrGreaterThan(result) { + return result === 0; + } + CompareResult2.isNeitherLessOrGreaterThan = isNeitherLessOrGreaterThan; + CompareResult2.greaterThan = 1; + CompareResult2.lessThan = -1; + CompareResult2.neitherLessOrGreaterThan = 0; + })(CompareResult || (CompareResult = {})); + numberComparator = (a3, b) => a3 - b; + booleanComparator = (a3, b) => numberComparator(a3 ? 1 : 0, b ? 1 : 0); + ArrayQueue = class { + /** + * Constructs a queue that is backed by the given array. Runtime is O(1). + */ + constructor(items) { + this.items = items; + this.firstIdx = 0; + this.lastIdx = this.items.length - 1; + } + get length() { + return this.lastIdx - this.firstIdx + 1; + } + /** + * Consumes elements from the beginning of the queue as long as the predicate returns true. + * If no elements were consumed, `null` is returned. Has a runtime of O(result.length). + */ + takeWhile(predicate) { + let startIdx = this.firstIdx; + while (startIdx < this.items.length && predicate(this.items[startIdx])) { + startIdx++; + } + const result = startIdx === this.firstIdx ? null : this.items.slice(this.firstIdx, startIdx); + this.firstIdx = startIdx; + return result; + } + /** + * Consumes elements from the end of the queue as long as the predicate returns true. + * If no elements were consumed, `null` is returned. + * The result has the same order as the underlying array! + */ + takeFromEndWhile(predicate) { + let endIdx = this.lastIdx; + while (endIdx >= 0 && predicate(this.items[endIdx])) { + endIdx--; + } + const result = endIdx === this.lastIdx ? null : this.items.slice(endIdx + 1, this.lastIdx + 1); + this.lastIdx = endIdx; + return result; + } + peek() { + if (this.length === 0) { + return void 0; + } + return this.items[this.firstIdx]; + } + dequeue() { + const result = this.items[this.firstIdx]; + this.firstIdx++; + return result; + } + takeCount(count) { + const result = this.items.slice(this.firstIdx, this.firstIdx + count); + this.firstIdx += count; + return result; + } + }; + CallbackIterable = class _CallbackIterable { + constructor(iterate) { + this.iterate = iterate; + } + toArray() { + const result = []; + this.iterate((item) => { + result.push(item); + return true; + }); + return result; + } + filter(predicate) { + return new _CallbackIterable((cb) => this.iterate((item) => predicate(item) ? cb(item) : true)); + } + map(mapFn) { + return new _CallbackIterable((cb) => this.iterate((item) => cb(mapFn(item)))); + } + findLast(predicate) { + let result; + this.iterate((item) => { + if (predicate(item)) { + result = item; + } + return true; + }); + return result; + } + findLastMaxBy(comparator) { + let result; + let first2 = true; + this.iterate((item) => { + if (first2 || CompareResult.isGreaterThan(comparator(item, result))) { + first2 = false; + result = item; + } + return true; + }); + return result; + } + }; + CallbackIterable.empty = new CallbackIterable((_callback) => { + }); + Permutation = class _Permutation { + constructor(_indexMap) { + this._indexMap = _indexMap; + } + /** + * Returns a permutation that sorts the given array according to the given compare function. + */ + static createSortPermutation(arr, compareFn) { + const sortIndices = Array.from(arr.keys()).sort((index1, index2) => compareFn(arr[index1], arr[index2])); + return new _Permutation(sortIndices); + } + /** + * Returns a new array with the elements of the given array re-arranged according to this permutation. + */ + apply(arr) { + return arr.map((_, index) => arr[this._indexMap[index]]); + } + /** + * Returns a new permutation that undoes the re-arrangement of this permutation. + */ + inverse() { + const inverseIndexMap = this._indexMap.slice(); + for (let i = 0; i < this._indexMap.length; i++) { + inverseIndexMap[this._indexMap[i]] = i; + } + return new _Permutation(inverseIndexMap); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/types.js +function isString(str) { + return typeof str === "string"; +} +function isObject(obj) { + return typeof obj === "object" && obj !== null && !Array.isArray(obj) && !(obj instanceof RegExp) && !(obj instanceof Date); +} +function isTypedArray(obj) { + const TypedArray = Object.getPrototypeOf(Uint8Array); + return typeof obj === "object" && obj instanceof TypedArray; +} +function isNumber(obj) { + return typeof obj === "number" && !isNaN(obj); +} +function isIterable(obj) { + return !!obj && typeof obj[Symbol.iterator] === "function"; +} +function isBoolean(obj) { + return obj === true || obj === false; +} +function isUndefined(obj) { + return typeof obj === "undefined"; +} +function isDefined(arg) { + return !isUndefinedOrNull(arg); +} +function isUndefinedOrNull(obj) { + return isUndefined(obj) || obj === null; +} +function assertType(condition, type) { + if (!condition) { + throw new Error(type ? `Unexpected type, expected '${type}'` : "Unexpected type"); + } +} +function assertIsDefined(arg) { + if (isUndefinedOrNull(arg)) { + throw new Error("Assertion Failed: argument is undefined or null"); + } + return arg; +} +function isFunction(obj) { + return typeof obj === "function"; +} +function validateConstraints(args, constraints) { + const len = Math.min(args.length, constraints.length); + for (let i = 0; i < len; i++) { + validateConstraint(args[i], constraints[i]); + } +} +function validateConstraint(arg, constraint) { + if (isString(constraint)) { + if (typeof arg !== constraint) { + throw new Error(`argument does not match constraint: typeof ${constraint}`); + } + } else if (isFunction(constraint)) { + try { + if (arg instanceof constraint) { + return; + } + } catch (_a10) { + } + if (!isUndefinedOrNull(arg) && arg.constructor === constraint) { + return; + } + if (constraint.length === 1 && constraint.call(void 0, arg) === true) { + return; + } + throw new Error(`argument does not match one of these constraints: arg instanceof constraint, arg.constructor === constraint, nor constraint(arg) === true`); + } +} +var init_types = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/types.js"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/objects.js +function deepClone(obj) { + if (!obj || typeof obj !== "object") { + return obj; + } + if (obj instanceof RegExp) { + return obj; + } + const result = Array.isArray(obj) ? [] : {}; + Object.entries(obj).forEach(([key, value]) => { + result[key] = value && typeof value === "object" ? deepClone(value) : value; + }); + return result; +} +function deepFreeze(obj) { + if (!obj || typeof obj !== "object") { + return obj; + } + const stack = [obj]; + while (stack.length > 0) { + const obj2 = stack.shift(); + Object.freeze(obj2); + for (const key in obj2) { + if (_hasOwnProperty.call(obj2, key)) { + const prop = obj2[key]; + if (typeof prop === "object" && !Object.isFrozen(prop) && !isTypedArray(prop)) { + stack.push(prop); + } + } + } + } + return obj; +} +function cloneAndChange(obj, changer) { + return _cloneAndChange(obj, changer, /* @__PURE__ */ new Set()); +} +function _cloneAndChange(obj, changer, seen) { + if (isUndefinedOrNull(obj)) { + return obj; + } + const changed = changer(obj); + if (typeof changed !== "undefined") { + return changed; + } + if (Array.isArray(obj)) { + const r1 = []; + for (const e of obj) { + r1.push(_cloneAndChange(e, changer, seen)); + } + return r1; + } + if (isObject(obj)) { + if (seen.has(obj)) { + throw new Error("Cannot clone recursive data-structure"); + } + seen.add(obj); + const r2 = {}; + for (const i2 in obj) { + if (_hasOwnProperty.call(obj, i2)) { + r2[i2] = _cloneAndChange(obj[i2], changer, seen); + } + } + seen.delete(obj); + return r2; + } + return obj; +} +function mixin(destination, source, overwrite = true) { + if (!isObject(destination)) { + return source; + } + if (isObject(source)) { + Object.keys(source).forEach((key) => { + if (key in destination) { + if (overwrite) { + if (isObject(destination[key]) && isObject(source[key])) { + mixin(destination[key], source[key], overwrite); + } else { + destination[key] = source[key]; + } + } + } else { + destination[key] = source[key]; + } + }); + } + return destination; +} +function equals2(one, other) { + if (one === other) { + return true; + } + if (one === null || one === void 0 || other === null || other === void 0) { + return false; + } + if (typeof one !== typeof other) { + return false; + } + if (typeof one !== "object") { + return false; + } + if (Array.isArray(one) !== Array.isArray(other)) { + return false; + } + let i; + let key; + if (Array.isArray(one)) { + if (one.length !== other.length) { + return false; + } + for (i = 0; i < one.length; i++) { + if (!equals2(one[i], other[i])) { + return false; + } + } + } else { + const oneKeys = []; + for (key in one) { + oneKeys.push(key); + } + oneKeys.sort(); + const otherKeys = []; + for (key in other) { + otherKeys.push(key); + } + otherKeys.sort(); + if (!equals2(oneKeys, otherKeys)) { + return false; + } + for (i = 0; i < oneKeys.length; i++) { + if (!equals2(one[oneKeys[i]], other[oneKeys[i]])) { + return false; + } + } + } + return true; +} +function getAllPropertyNames(obj) { + let res = []; + while (Object.prototype !== obj) { + res = res.concat(Object.getOwnPropertyNames(obj)); + obj = Object.getPrototypeOf(obj); + } + return res; +} +function getAllMethodNames(obj) { + const methods = []; + for (const prop of getAllPropertyNames(obj)) { + if (typeof obj[prop] === "function") { + methods.push(prop); + } + } + return methods; +} +function createProxyObject(methodNames, invoke) { + const createProxyMethod = (method) => { + return function() { + const args = Array.prototype.slice.call(arguments, 0); + return invoke(method, args); + }; + }; + const result = {}; + for (const methodName of methodNames) { + result[methodName] = createProxyMethod(methodName); + } + return result; +} +var _hasOwnProperty; +var init_objects = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/objects.js"() { + init_types(); + _hasOwnProperty = Object.prototype.hasOwnProperty; + } +}); + +// node_modules/monaco-editor/esm/vs/nls.js +function _format(message, args) { + let result; + if (args.length === 0) { + result = message; + } else { + result = message.replace(/\{(\d+)\}/g, (match2, rest) => { + const index = rest[0]; + const arg = args[index]; + let result2 = match2; + if (typeof arg === "string") { + result2 = arg; + } else if (typeof arg === "number" || typeof arg === "boolean" || arg === void 0 || arg === null) { + result2 = String(arg); + } + return result2; + }); + } + if (isPseudo) { + result = "\uFF3B" + result.replace(/[aouei]/g, "$&$&") + "\uFF3D"; + } + return result; +} +function localize(data, message, ...args) { + return _format(message, args); +} +function localize2(data, message, ...args) { + const original = _format(message, args); + return { + value: original, + original + }; +} +function getConfiguredDefaultLocale(_) { + return void 0; +} +var isPseudo; +var init_nls = __esm({ + "node_modules/monaco-editor/esm/vs/nls.js"() { + isPseudo = typeof document !== "undefined" && document.location && document.location.hash.indexOf("pseudo=true") >= 0; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/platform.js +function isLittleEndian() { + if (!_isLittleEndianComputed) { + _isLittleEndianComputed = true; + const test = new Uint8Array(2); + test[0] = 1; + test[1] = 2; + const view = new Uint16Array(test.buffer); + _isLittleEndian = view[0] === (2 << 8) + 1; + } + return _isLittleEndian; +} +var _a, _b, LANGUAGE_DEFAULT, _isWindows, _isMacintosh, _isLinux, _isLinuxSnap, _isNative, _isWeb, _isElectron, _isIOS, _isCI, _isMobile, _locale, _language, _platformLocale, _translationsConfigFile, _userAgent, $globalThis, nodeProcess, isElectronProcess, isElectronRenderer, _platform, isWindows, isMacintosh, isLinux, isNative, isWeb, isWebWorker, webWorkerOrigin, isIOS, isMobile, userAgent, language, setTimeout0IsFaster, setTimeout0, OS, _isLittleEndian, _isLittleEndianComputed, isChrome, isFirefox, isSafari, isEdge, isAndroid; +var init_platform = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/platform.js"() { + init_nls(); + LANGUAGE_DEFAULT = "en"; + _isWindows = false; + _isMacintosh = false; + _isLinux = false; + _isLinuxSnap = false; + _isNative = false; + _isWeb = false; + _isElectron = false; + _isIOS = false; + _isCI = false; + _isMobile = false; + _locale = void 0; + _language = LANGUAGE_DEFAULT; + _platformLocale = LANGUAGE_DEFAULT; + _translationsConfigFile = void 0; + _userAgent = void 0; + $globalThis = globalThis; + nodeProcess = void 0; + if (typeof $globalThis.vscode !== "undefined" && typeof $globalThis.vscode.process !== "undefined") { + nodeProcess = $globalThis.vscode.process; + } else if (typeof process !== "undefined" && typeof ((_a = process === null || process === void 0 ? void 0 : process.versions) === null || _a === void 0 ? void 0 : _a.node) === "string") { + nodeProcess = process; + } + isElectronProcess = typeof ((_b = nodeProcess === null || nodeProcess === void 0 ? void 0 : nodeProcess.versions) === null || _b === void 0 ? void 0 : _b.electron) === "string"; + isElectronRenderer = isElectronProcess && (nodeProcess === null || nodeProcess === void 0 ? void 0 : nodeProcess.type) === "renderer"; + if (typeof nodeProcess === "object") { + _isWindows = nodeProcess.platform === "win32"; + _isMacintosh = nodeProcess.platform === "darwin"; + _isLinux = nodeProcess.platform === "linux"; + _isLinuxSnap = _isLinux && !!nodeProcess.env["SNAP"] && !!nodeProcess.env["SNAP_REVISION"]; + _isElectron = isElectronProcess; + _isCI = !!nodeProcess.env["CI"] || !!nodeProcess.env["BUILD_ARTIFACTSTAGINGDIRECTORY"]; + _locale = LANGUAGE_DEFAULT; + _language = LANGUAGE_DEFAULT; + const rawNlsConfig = nodeProcess.env["VSCODE_NLS_CONFIG"]; + if (rawNlsConfig) { + try { + const nlsConfig = JSON.parse(rawNlsConfig); + const resolved = nlsConfig.availableLanguages["*"]; + _locale = nlsConfig.locale; + _platformLocale = nlsConfig.osLocale; + _language = resolved ? resolved : LANGUAGE_DEFAULT; + _translationsConfigFile = nlsConfig._translationsConfigFile; + } catch (e) { + } + } + _isNative = true; + } else if (typeof navigator === "object" && !isElectronRenderer) { + _userAgent = navigator.userAgent; + _isWindows = _userAgent.indexOf("Windows") >= 0; + _isMacintosh = _userAgent.indexOf("Macintosh") >= 0; + _isIOS = (_userAgent.indexOf("Macintosh") >= 0 || _userAgent.indexOf("iPad") >= 0 || _userAgent.indexOf("iPhone") >= 0) && !!navigator.maxTouchPoints && navigator.maxTouchPoints > 0; + _isLinux = _userAgent.indexOf("Linux") >= 0; + _isMobile = (_userAgent === null || _userAgent === void 0 ? void 0 : _userAgent.indexOf("Mobi")) >= 0; + _isWeb = true; + const configuredLocale = getConfiguredDefaultLocale( + // This call _must_ be done in the file that calls `nls.getConfiguredDefaultLocale` + // to ensure that the NLS AMD Loader plugin has been loaded and configured. + // This is because the loader plugin decides what the default locale is based on + // how it's able to resolve the strings. + localize({ key: "ensureLoaderPluginIsLoaded", comment: ["{Locked}"] }, "_") + ); + _locale = configuredLocale || LANGUAGE_DEFAULT; + _language = _locale; + _platformLocale = navigator.language; + } else { + console.error("Unable to resolve platform."); + } + _platform = 0; + if (_isMacintosh) { + _platform = 1; + } else if (_isWindows) { + _platform = 3; + } else if (_isLinux) { + _platform = 2; + } + isWindows = _isWindows; + isMacintosh = _isMacintosh; + isLinux = _isLinux; + isNative = _isNative; + isWeb = _isWeb; + isWebWorker = _isWeb && typeof $globalThis.importScripts === "function"; + webWorkerOrigin = isWebWorker ? $globalThis.origin : void 0; + isIOS = _isIOS; + isMobile = _isMobile; + userAgent = _userAgent; + language = _language; + setTimeout0IsFaster = typeof $globalThis.postMessage === "function" && !$globalThis.importScripts; + setTimeout0 = (() => { + if (setTimeout0IsFaster) { + const pending = []; + $globalThis.addEventListener("message", (e) => { + if (e.data && e.data.vscodeScheduleAsyncWork) { + for (let i = 0, len = pending.length; i < len; i++) { + const candidate = pending[i]; + if (candidate.id === e.data.vscodeScheduleAsyncWork) { + pending.splice(i, 1); + candidate.callback(); + return; + } + } + } + }); + let lastId = 0; + return (callback) => { + const myId = ++lastId; + pending.push({ + id: myId, + callback + }); + $globalThis.postMessage({ vscodeScheduleAsyncWork: myId }, "*"); + }; + } + return (callback) => setTimeout(callback); + })(); + OS = _isMacintosh || _isIOS ? 2 : _isWindows ? 1 : 3; + _isLittleEndian = true; + _isLittleEndianComputed = false; + isChrome = !!(userAgent && userAgent.indexOf("Chrome") >= 0); + isFirefox = !!(userAgent && userAgent.indexOf("Firefox") >= 0); + isSafari = !!(!isChrome && (userAgent && userAgent.indexOf("Safari") >= 0)); + isEdge = !!(userAgent && userAgent.indexOf("Edg/") >= 0); + isAndroid = !!(userAgent && userAgent.indexOf("Android") >= 0); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/textModelDefaults.js +var EDITOR_MODEL_DEFAULTS; +var init_textModelDefaults = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/textModelDefaults.js"() { + EDITOR_MODEL_DEFAULTS = { + tabSize: 4, + indentSize: 4, + insertSpaces: true, + detectIndentation: true, + trimAutoWhitespace: true, + largeFileOptimizations: true, + bracketPairColorizationOptions: { + enabled: true, + independentColorPoolPerBracketType: false + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/iterator.js +var Iterable; +var init_iterator = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/iterator.js"() { + (function(Iterable2) { + function is(thing) { + return thing && typeof thing === "object" && typeof thing[Symbol.iterator] === "function"; + } + Iterable2.is = is; + const _empty2 = Object.freeze([]); + function empty2() { + return _empty2; + } + Iterable2.empty = empty2; + function* single(element) { + yield element; + } + Iterable2.single = single; + function wrap(iterableOrElement) { + if (is(iterableOrElement)) { + return iterableOrElement; + } else { + return single(iterableOrElement); + } + } + Iterable2.wrap = wrap; + function from(iterable) { + return iterable || _empty2; + } + Iterable2.from = from; + function* reverse(array2) { + for (let i = array2.length - 1; i >= 0; i--) { + yield array2[i]; + } + } + Iterable2.reverse = reverse; + function isEmpty(iterable) { + return !iterable || iterable[Symbol.iterator]().next().done === true; + } + Iterable2.isEmpty = isEmpty; + function first2(iterable) { + return iterable[Symbol.iterator]().next().value; + } + Iterable2.first = first2; + function some(iterable, predicate) { + for (const element of iterable) { + if (predicate(element)) { + return true; + } + } + return false; + } + Iterable2.some = some; + function find(iterable, predicate) { + for (const element of iterable) { + if (predicate(element)) { + return element; + } + } + return void 0; + } + Iterable2.find = find; + function* filter(iterable, predicate) { + for (const element of iterable) { + if (predicate(element)) { + yield element; + } + } + } + Iterable2.filter = filter; + function* map(iterable, fn) { + let index = 0; + for (const element of iterable) { + yield fn(element, index++); + } + } + Iterable2.map = map; + function* concat3(...iterables) { + for (const iterable of iterables) { + yield* __yieldStar(iterable); + } + } + Iterable2.concat = concat3; + function reduce(iterable, reducer, initialValue) { + let value = initialValue; + for (const element of iterable) { + value = reducer(value, element); + } + return value; + } + Iterable2.reduce = reduce; + function* slice(arr, from2, to = arr.length) { + if (from2 < 0) { + from2 += arr.length; + } + if (to < 0) { + to += arr.length; + } else if (to > arr.length) { + to = arr.length; + } + for (; from2 < to; from2++) { + yield arr[from2]; + } + } + Iterable2.slice = slice; + function consume(iterable, atMost = Number.POSITIVE_INFINITY) { + const consumed = []; + if (atMost === 0) { + return [consumed, iterable]; + } + const iterator = iterable[Symbol.iterator](); + for (let i = 0; i < atMost; i++) { + const next = iterator.next(); + if (next.done) { + return [consumed, Iterable2.empty()]; + } + consumed.push(next.value); + } + return [consumed, { [Symbol.iterator]() { + return iterator; + } }]; + } + Iterable2.consume = consume; + function asyncToArray(iterable) { + return __async(this, null, function* () { + const result = []; + try { + for (var iter = __forAwait(iterable), more, temp, error; more = !(temp = yield iter.next()).done; more = false) { + const item = temp.value; + result.push(item); + } + } catch (temp) { + error = [temp]; + } finally { + try { + more && (temp = iter.return) && (yield temp.call(iter)); + } finally { + if (error) + throw error[0]; + } + } + return Promise.resolve(result); + }); + } + Iterable2.asyncToArray = asyncToArray; + })(Iterable || (Iterable = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/linkedList.js +var Node2, LinkedList; +var init_linkedList = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/linkedList.js"() { + Node2 = class _Node { + constructor(element) { + this.element = element; + this.next = _Node.Undefined; + this.prev = _Node.Undefined; + } + }; + Node2.Undefined = new Node2(void 0); + LinkedList = class { + constructor() { + this._first = Node2.Undefined; + this._last = Node2.Undefined; + this._size = 0; + } + get size() { + return this._size; + } + isEmpty() { + return this._first === Node2.Undefined; + } + clear() { + let node = this._first; + while (node !== Node2.Undefined) { + const next = node.next; + node.prev = Node2.Undefined; + node.next = Node2.Undefined; + node = next; + } + this._first = Node2.Undefined; + this._last = Node2.Undefined; + this._size = 0; + } + unshift(element) { + return this._insert(element, false); + } + push(element) { + return this._insert(element, true); + } + _insert(element, atTheEnd) { + const newNode = new Node2(element); + if (this._first === Node2.Undefined) { + this._first = newNode; + this._last = newNode; + } else if (atTheEnd) { + const oldLast = this._last; + this._last = newNode; + newNode.prev = oldLast; + oldLast.next = newNode; + } else { + const oldFirst = this._first; + this._first = newNode; + newNode.next = oldFirst; + oldFirst.prev = newNode; + } + this._size += 1; + let didRemove = false; + return () => { + if (!didRemove) { + didRemove = true; + this._remove(newNode); + } + }; + } + shift() { + if (this._first === Node2.Undefined) { + return void 0; + } else { + const res = this._first.element; + this._remove(this._first); + return res; + } + } + pop() { + if (this._last === Node2.Undefined) { + return void 0; + } else { + const res = this._last.element; + this._remove(this._last); + return res; + } + } + _remove(node) { + if (node.prev !== Node2.Undefined && node.next !== Node2.Undefined) { + const anchor = node.prev; + anchor.next = node.next; + node.next.prev = anchor; + } else if (node.prev === Node2.Undefined && node.next === Node2.Undefined) { + this._first = Node2.Undefined; + this._last = Node2.Undefined; + } else if (node.next === Node2.Undefined) { + this._last = this._last.prev; + this._last.next = Node2.Undefined; + } else if (node.prev === Node2.Undefined) { + this._first = this._first.next; + this._first.prev = Node2.Undefined; + } + this._size -= 1; + } + *[Symbol.iterator]() { + let node = this._first; + while (node !== Node2.Undefined) { + yield node.element; + node = node.next; + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/wordHelper.js +function createWordRegExp(allowInWords = "") { + let source = "(-?\\d*\\.\\d\\w*)|([^"; + for (const sep2 of USUAL_WORD_SEPARATORS) { + if (allowInWords.indexOf(sep2) >= 0) { + continue; + } + source += "\\" + sep2; + } + source += "\\s]+)"; + return new RegExp(source, "g"); +} +function ensureValidWordDefinition(wordDefinition) { + let result = DEFAULT_WORD_REGEXP; + if (wordDefinition && wordDefinition instanceof RegExp) { + if (!wordDefinition.global) { + let flags = "g"; + if (wordDefinition.ignoreCase) { + flags += "i"; + } + if (wordDefinition.multiline) { + flags += "m"; + } + if (wordDefinition.unicode) { + flags += "u"; + } + result = new RegExp(wordDefinition.source, flags); + } else { + result = wordDefinition; + } + } + result.lastIndex = 0; + return result; +} +function getWordAtText(column, wordDefinition, text2, textOffset, config) { + wordDefinition = ensureValidWordDefinition(wordDefinition); + if (!config) { + config = Iterable.first(_defaultConfig); + } + if (text2.length > config.maxLen) { + let start = column - config.maxLen / 2; + if (start < 0) { + start = 0; + } else { + textOffset += start; + } + text2 = text2.substring(start, column + config.maxLen / 2); + return getWordAtText(column, wordDefinition, text2, textOffset, config); + } + const t1 = Date.now(); + const pos = column - 1 - textOffset; + let prevRegexIndex = -1; + let match2 = null; + for (let i = 1; ; i++) { + if (Date.now() - t1 >= config.timeBudget) { + break; + } + const regexIndex = pos - config.windowSize * i; + wordDefinition.lastIndex = Math.max(0, regexIndex); + const thisMatch = _findRegexMatchEnclosingPosition(wordDefinition, text2, pos, prevRegexIndex); + if (!thisMatch && match2) { + break; + } + match2 = thisMatch; + if (regexIndex <= 0) { + break; + } + prevRegexIndex = regexIndex; + } + if (match2) { + const result = { + word: match2[0], + startColumn: textOffset + 1 + match2.index, + endColumn: textOffset + 1 + match2.index + match2[0].length + }; + wordDefinition.lastIndex = 0; + return result; + } + return null; +} +function _findRegexMatchEnclosingPosition(wordDefinition, text2, pos, stopPos) { + let match2; + while (match2 = wordDefinition.exec(text2)) { + const matchIndex = match2.index || 0; + if (matchIndex <= pos && wordDefinition.lastIndex >= pos) { + return match2; + } else if (stopPos > 0 && matchIndex > stopPos) { + return null; + } + } + return null; +} +var USUAL_WORD_SEPARATORS, DEFAULT_WORD_REGEXP, _defaultConfig; +var init_wordHelper = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/wordHelper.js"() { + init_iterator(); + init_linkedList(); + USUAL_WORD_SEPARATORS = "`~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?"; + DEFAULT_WORD_REGEXP = createWordRegExp(); + _defaultConfig = new LinkedList(); + _defaultConfig.unshift({ + maxLen: 1e3, + windowSize: 15, + timeBudget: 150 + }); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/config/editorOptions.js +function applyUpdate(value, update) { + if (typeof value !== "object" || typeof update !== "object" || !value || !update) { + return new ApplyUpdateResult(update, value !== update); + } + if (Array.isArray(value) || Array.isArray(update)) { + const arrayEquals = Array.isArray(value) && Array.isArray(update) && equals(value, update); + return new ApplyUpdateResult(update, !arrayEquals); + } + let didChange = false; + for (const key in update) { + if (update.hasOwnProperty(key)) { + const result = applyUpdate(value[key], update[key]); + if (result.didChange) { + value[key] = result.newValue; + didChange = true; + } + } + } + return new ApplyUpdateResult(value, didChange); +} +function boolean(value, defaultValue) { + if (typeof value === "undefined") { + return defaultValue; + } + if (value === "false") { + return false; + } + return Boolean(value); +} +function clampedInt(value, defaultValue, minimum, maximum) { + if (typeof value === "undefined") { + return defaultValue; + } + let r = parseInt(value, 10); + if (isNaN(r)) { + return defaultValue; + } + r = Math.max(minimum, r); + r = Math.min(maximum, r); + return r | 0; +} +function clampedFloat(value, defaultValue, minimum, maximum) { + if (typeof value === "undefined") { + return defaultValue; + } + const r = EditorFloatOption.float(value, defaultValue); + return EditorFloatOption.clamp(r, minimum, maximum); +} +function stringSet(value, defaultValue, allowedValues, renamedValues) { + if (typeof value !== "string") { + return defaultValue; + } + if (renamedValues && value in renamedValues) { + return renamedValues[value]; + } + if (allowedValues.indexOf(value) === -1) { + return defaultValue; + } + return value; +} +function _autoIndentFromString(autoIndent) { + switch (autoIndent) { + case "none": + return 0; + case "keep": + return 1; + case "brackets": + return 2; + case "advanced": + return 3; + case "full": + return 4; + } +} +function _cursorBlinkingStyleFromString(cursorBlinkingStyle) { + switch (cursorBlinkingStyle) { + case "blink": + return 1; + case "smooth": + return 2; + case "phase": + return 3; + case "expand": + return 4; + case "solid": + return 5; + } +} +function _cursorStyleFromString(cursorStyle) { + switch (cursorStyle) { + case "line": + return TextEditorCursorStyle.Line; + case "block": + return TextEditorCursorStyle.Block; + case "underline": + return TextEditorCursorStyle.Underline; + case "line-thin": + return TextEditorCursorStyle.LineThin; + case "block-outline": + return TextEditorCursorStyle.BlockOutline; + case "underline-thin": + return TextEditorCursorStyle.UnderlineThin; + } +} +function _multiCursorModifierFromString(multiCursorModifier) { + if (multiCursorModifier === "ctrlCmd") { + return isMacintosh ? "metaKey" : "ctrlKey"; + } + return "altKey"; +} +function filterValidationDecorations(options2) { + const renderValidationDecorations = options2.get( + 98 + /* EditorOption.renderValidationDecorations */ + ); + if (renderValidationDecorations === "editable") { + return options2.get( + 91 + /* EditorOption.readOnly */ + ); + } + return renderValidationDecorations === "on" ? false : true; +} +function _scrollbarVisibilityFromString(visibility, defaultValue) { + if (typeof visibility !== "string") { + return defaultValue; + } + switch (visibility) { + case "hidden": + return 2; + case "visible": + return 3; + default: + return 1; + } +} +function primitiveSet(value, defaultValue, allowedValues) { + const idx = allowedValues.indexOf(value); + if (idx === -1) { + return defaultValue; + } + return allowedValues[idx]; +} +function register(option) { + editorOptionsRegistry[option.id] = option; + return option; +} +var MINIMAP_GUTTER_WIDTH, ConfigurationChangedEvent, ComputeOptionsMemory, BaseEditorOption, ApplyUpdateResult, ComputedEditorOption, SimpleEditorOption, EditorBooleanOption, EditorIntOption, EditorFloatOption, EditorStringOption, EditorStringEnumOption, EditorEnumOption, EditorAccessibilitySupport, EditorComments, TextEditorCursorStyle, EditorClassName, EditorEmptySelectionClipboard, EditorFind, EditorFontLigatures, EditorFontVariations, EditorFontInfo, EditorFontSize, EditorFontWeight, EditorGoToLocation, EditorHover, EditorLayoutInfoComputer, WrappingStrategy, ShowLightbulbIconMode, EditorLightbulb, EditorStickyScroll, EditorInlayHints, EditorLineDecorationsWidth, EditorLineHeight, EditorMinimap, EditorPadding, EditorParameterHints, EditorPixelRatio, EditorQuickSuggestions, EditorRenderLineNumbersOption, EditorRulers, ReadonlyMessage, EditorScrollbar, inUntrustedWorkspace, unicodeHighlightConfigKeys, UnicodeHighlight, InlineEditorSuggest, InlineEditorEdit, BracketPairColorization, GuideOptions, EditorSuggest, SmartSelect, WordSegmenterLocales, WrappingIndentOption, EditorWrappingInfoComputer, EditorDropIntoEditor, EditorPasteAs, DEFAULT_WINDOWS_FONT_FAMILY, DEFAULT_MAC_FONT_FAMILY, DEFAULT_LINUX_FONT_FAMILY, EDITOR_FONT_DEFAULTS, editorOptionsRegistry, EditorOptions; +var init_editorOptions = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/config/editorOptions.js"() { + init_arrays(); + init_objects(); + init_platform(); + init_textModelDefaults(); + init_wordHelper(); + init_nls(); + MINIMAP_GUTTER_WIDTH = 8; + ConfigurationChangedEvent = class { + /** + * @internal + */ + constructor(values2) { + this._values = values2; + } + hasChanged(id) { + return this._values[id]; + } + }; + ComputeOptionsMemory = class { + constructor() { + this.stableMinimapLayoutInput = null; + this.stableFitMaxMinimapScale = 0; + this.stableFitRemainingWidth = 0; + } + }; + BaseEditorOption = class { + constructor(id, name, defaultValue, schema) { + this.id = id; + this.name = name; + this.defaultValue = defaultValue; + this.schema = schema; + } + applyUpdate(value, update) { + return applyUpdate(value, update); + } + compute(env2, options2, value) { + return value; + } + }; + ApplyUpdateResult = class { + constructor(newValue, didChange) { + this.newValue = newValue; + this.didChange = didChange; + } + }; + ComputedEditorOption = class { + constructor(id) { + this.schema = void 0; + this.id = id; + this.name = "_never_"; + this.defaultValue = void 0; + } + applyUpdate(value, update) { + return applyUpdate(value, update); + } + validate(input) { + return this.defaultValue; + } + }; + SimpleEditorOption = class { + constructor(id, name, defaultValue, schema) { + this.id = id; + this.name = name; + this.defaultValue = defaultValue; + this.schema = schema; + } + applyUpdate(value, update) { + return applyUpdate(value, update); + } + validate(input) { + if (typeof input === "undefined") { + return this.defaultValue; + } + return input; + } + compute(env2, options2, value) { + return value; + } + }; + EditorBooleanOption = class extends SimpleEditorOption { + constructor(id, name, defaultValue, schema = void 0) { + if (typeof schema !== "undefined") { + schema.type = "boolean"; + schema.default = defaultValue; + } + super(id, name, defaultValue, schema); + } + validate(input) { + return boolean(input, this.defaultValue); + } + }; + EditorIntOption = class _EditorIntOption extends SimpleEditorOption { + static clampedInt(value, defaultValue, minimum, maximum) { + return clampedInt(value, defaultValue, minimum, maximum); + } + constructor(id, name, defaultValue, minimum, maximum, schema = void 0) { + if (typeof schema !== "undefined") { + schema.type = "integer"; + schema.default = defaultValue; + schema.minimum = minimum; + schema.maximum = maximum; + } + super(id, name, defaultValue, schema); + this.minimum = minimum; + this.maximum = maximum; + } + validate(input) { + return _EditorIntOption.clampedInt(input, this.defaultValue, this.minimum, this.maximum); + } + }; + EditorFloatOption = class _EditorFloatOption extends SimpleEditorOption { + static clamp(n, min, max) { + if (n < min) { + return min; + } + if (n > max) { + return max; + } + return n; + } + static float(value, defaultValue) { + if (typeof value === "number") { + return value; + } + if (typeof value === "undefined") { + return defaultValue; + } + const r = parseFloat(value); + return isNaN(r) ? defaultValue : r; + } + constructor(id, name, defaultValue, validationFn, schema) { + if (typeof schema !== "undefined") { + schema.type = "number"; + schema.default = defaultValue; + } + super(id, name, defaultValue, schema); + this.validationFn = validationFn; + } + validate(input) { + return this.validationFn(_EditorFloatOption.float(input, this.defaultValue)); + } + }; + EditorStringOption = class _EditorStringOption extends SimpleEditorOption { + static string(value, defaultValue) { + if (typeof value !== "string") { + return defaultValue; + } + return value; + } + constructor(id, name, defaultValue, schema = void 0) { + if (typeof schema !== "undefined") { + schema.type = "string"; + schema.default = defaultValue; + } + super(id, name, defaultValue, schema); + } + validate(input) { + return _EditorStringOption.string(input, this.defaultValue); + } + }; + EditorStringEnumOption = class extends SimpleEditorOption { + constructor(id, name, defaultValue, allowedValues, schema = void 0) { + if (typeof schema !== "undefined") { + schema.type = "string"; + schema.enum = allowedValues; + schema.default = defaultValue; + } + super(id, name, defaultValue, schema); + this._allowedValues = allowedValues; + } + validate(input) { + return stringSet(input, this.defaultValue, this._allowedValues); + } + }; + EditorEnumOption = class extends BaseEditorOption { + constructor(id, name, defaultValue, defaultStringValue, allowedValues, convert, schema = void 0) { + if (typeof schema !== "undefined") { + schema.type = "string"; + schema.enum = allowedValues; + schema.default = defaultStringValue; + } + super(id, name, defaultValue, schema); + this._allowedValues = allowedValues; + this._convert = convert; + } + validate(input) { + if (typeof input !== "string") { + return this.defaultValue; + } + if (this._allowedValues.indexOf(input) === -1) { + return this.defaultValue; + } + return this._convert(input); + } + }; + EditorAccessibilitySupport = class extends BaseEditorOption { + constructor() { + super(2, "accessibilitySupport", 0, { + type: "string", + enum: ["auto", "on", "off"], + enumDescriptions: [ + localize("accessibilitySupport.auto", "Use platform APIs to detect when a Screen Reader is attached."), + localize("accessibilitySupport.on", "Optimize for usage with a Screen Reader."), + localize("accessibilitySupport.off", "Assume a screen reader is not attached.") + ], + default: "auto", + tags: ["accessibility"], + description: localize("accessibilitySupport", "Controls if the UI should run in a mode where it is optimized for screen readers.") + }); + } + validate(input) { + switch (input) { + case "auto": + return 0; + case "off": + return 1; + case "on": + return 2; + } + return this.defaultValue; + } + compute(env2, options2, value) { + if (value === 0) { + return env2.accessibilitySupport; + } + return value; + } + }; + EditorComments = class extends BaseEditorOption { + constructor() { + const defaults = { + insertSpace: true, + ignoreEmptyLines: true + }; + super(23, "comments", defaults, { + "editor.comments.insertSpace": { + type: "boolean", + default: defaults.insertSpace, + description: localize("comments.insertSpace", "Controls whether a space character is inserted when commenting.") + }, + "editor.comments.ignoreEmptyLines": { + type: "boolean", + default: defaults.ignoreEmptyLines, + description: localize("comments.ignoreEmptyLines", "Controls if empty lines should be ignored with toggle, add or remove actions for line comments.") + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + insertSpace: boolean(input.insertSpace, this.defaultValue.insertSpace), + ignoreEmptyLines: boolean(input.ignoreEmptyLines, this.defaultValue.ignoreEmptyLines) + }; + } + }; + (function(TextEditorCursorStyle3) { + TextEditorCursorStyle3[TextEditorCursorStyle3["Line"] = 1] = "Line"; + TextEditorCursorStyle3[TextEditorCursorStyle3["Block"] = 2] = "Block"; + TextEditorCursorStyle3[TextEditorCursorStyle3["Underline"] = 3] = "Underline"; + TextEditorCursorStyle3[TextEditorCursorStyle3["LineThin"] = 4] = "LineThin"; + TextEditorCursorStyle3[TextEditorCursorStyle3["BlockOutline"] = 5] = "BlockOutline"; + TextEditorCursorStyle3[TextEditorCursorStyle3["UnderlineThin"] = 6] = "UnderlineThin"; + })(TextEditorCursorStyle || (TextEditorCursorStyle = {})); + EditorClassName = class extends ComputedEditorOption { + constructor() { + super( + 142 + /* EditorOption.editorClassName */ + ); + } + compute(env2, options2, _) { + const classNames = ["monaco-editor"]; + if (options2.get( + 39 + /* EditorOption.extraEditorClassName */ + )) { + classNames.push(options2.get( + 39 + /* EditorOption.extraEditorClassName */ + )); + } + if (env2.extraEditorClassName) { + classNames.push(env2.extraEditorClassName); + } + if (options2.get( + 74 + /* EditorOption.mouseStyle */ + ) === "default") { + classNames.push("mouse-default"); + } else if (options2.get( + 74 + /* EditorOption.mouseStyle */ + ) === "copy") { + classNames.push("mouse-copy"); + } + if (options2.get( + 111 + /* EditorOption.showUnused */ + )) { + classNames.push("showUnused"); + } + if (options2.get( + 140 + /* EditorOption.showDeprecated */ + )) { + classNames.push("showDeprecated"); + } + return classNames.join(" "); + } + }; + EditorEmptySelectionClipboard = class extends EditorBooleanOption { + constructor() { + super(37, "emptySelectionClipboard", true, { description: localize("emptySelectionClipboard", "Controls whether copying without a selection copies the current line.") }); + } + compute(env2, options2, value) { + return value && env2.emptySelectionClipboard; + } + }; + EditorFind = class extends BaseEditorOption { + constructor() { + const defaults = { + cursorMoveOnType: true, + seedSearchStringFromSelection: "always", + autoFindInSelection: "never", + globalFindClipboard: false, + addExtraSpaceOnTop: true, + loop: true + }; + super(41, "find", defaults, { + "editor.find.cursorMoveOnType": { + type: "boolean", + default: defaults.cursorMoveOnType, + description: localize("find.cursorMoveOnType", "Controls whether the cursor should jump to find matches while typing.") + }, + "editor.find.seedSearchStringFromSelection": { + type: "string", + enum: ["never", "always", "selection"], + default: defaults.seedSearchStringFromSelection, + enumDescriptions: [ + localize("editor.find.seedSearchStringFromSelection.never", "Never seed search string from the editor selection."), + localize("editor.find.seedSearchStringFromSelection.always", "Always seed search string from the editor selection, including word at cursor position."), + localize("editor.find.seedSearchStringFromSelection.selection", "Only seed search string from the editor selection.") + ], + description: localize("find.seedSearchStringFromSelection", "Controls whether the search string in the Find Widget is seeded from the editor selection.") + }, + "editor.find.autoFindInSelection": { + type: "string", + enum: ["never", "always", "multiline"], + default: defaults.autoFindInSelection, + enumDescriptions: [ + localize("editor.find.autoFindInSelection.never", "Never turn on Find in Selection automatically (default)."), + localize("editor.find.autoFindInSelection.always", "Always turn on Find in Selection automatically."), + localize("editor.find.autoFindInSelection.multiline", "Turn on Find in Selection automatically when multiple lines of content are selected.") + ], + description: localize("find.autoFindInSelection", "Controls the condition for turning on Find in Selection automatically.") + }, + "editor.find.globalFindClipboard": { + type: "boolean", + default: defaults.globalFindClipboard, + description: localize("find.globalFindClipboard", "Controls whether the Find Widget should read or modify the shared find clipboard on macOS."), + included: isMacintosh + }, + "editor.find.addExtraSpaceOnTop": { + type: "boolean", + default: defaults.addExtraSpaceOnTop, + description: localize("find.addExtraSpaceOnTop", "Controls whether the Find Widget should add extra lines on top of the editor. When true, you can scroll beyond the first line when the Find Widget is visible.") + }, + "editor.find.loop": { + type: "boolean", + default: defaults.loop, + description: localize("find.loop", "Controls whether the search automatically restarts from the beginning (or the end) when no further matches can be found.") + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + cursorMoveOnType: boolean(input.cursorMoveOnType, this.defaultValue.cursorMoveOnType), + seedSearchStringFromSelection: typeof _input.seedSearchStringFromSelection === "boolean" ? _input.seedSearchStringFromSelection ? "always" : "never" : stringSet(input.seedSearchStringFromSelection, this.defaultValue.seedSearchStringFromSelection, ["never", "always", "selection"]), + autoFindInSelection: typeof _input.autoFindInSelection === "boolean" ? _input.autoFindInSelection ? "always" : "never" : stringSet(input.autoFindInSelection, this.defaultValue.autoFindInSelection, ["never", "always", "multiline"]), + globalFindClipboard: boolean(input.globalFindClipboard, this.defaultValue.globalFindClipboard), + addExtraSpaceOnTop: boolean(input.addExtraSpaceOnTop, this.defaultValue.addExtraSpaceOnTop), + loop: boolean(input.loop, this.defaultValue.loop) + }; + } + }; + EditorFontLigatures = class _EditorFontLigatures extends BaseEditorOption { + constructor() { + super(51, "fontLigatures", _EditorFontLigatures.OFF, { + anyOf: [ + { + type: "boolean", + description: localize("fontLigatures", "Enables/Disables font ligatures ('calt' and 'liga' font features). Change this to a string for fine-grained control of the 'font-feature-settings' CSS property.") + }, + { + type: "string", + description: localize("fontFeatureSettings", "Explicit 'font-feature-settings' CSS property. A boolean can be passed instead if one only needs to turn on/off ligatures.") + } + ], + description: localize("fontLigaturesGeneral", "Configures font ligatures or font features. Can be either a boolean to enable/disable ligatures or a string for the value of the CSS 'font-feature-settings' property."), + default: false + }); + } + validate(input) { + if (typeof input === "undefined") { + return this.defaultValue; + } + if (typeof input === "string") { + if (input === "false" || input.length === 0) { + return _EditorFontLigatures.OFF; + } + if (input === "true") { + return _EditorFontLigatures.ON; + } + return input; + } + if (Boolean(input)) { + return _EditorFontLigatures.ON; + } + return _EditorFontLigatures.OFF; + } + }; + EditorFontLigatures.OFF = '"liga" off, "calt" off'; + EditorFontLigatures.ON = '"liga" on, "calt" on'; + EditorFontVariations = class _EditorFontVariations extends BaseEditorOption { + constructor() { + super(54, "fontVariations", _EditorFontVariations.OFF, { + anyOf: [ + { + type: "boolean", + description: localize("fontVariations", "Enables/Disables the translation from font-weight to font-variation-settings. Change this to a string for fine-grained control of the 'font-variation-settings' CSS property.") + }, + { + type: "string", + description: localize("fontVariationSettings", "Explicit 'font-variation-settings' CSS property. A boolean can be passed instead if one only needs to translate font-weight to font-variation-settings.") + } + ], + description: localize("fontVariationsGeneral", "Configures font variations. Can be either a boolean to enable/disable the translation from font-weight to font-variation-settings or a string for the value of the CSS 'font-variation-settings' property."), + default: false + }); + } + validate(input) { + if (typeof input === "undefined") { + return this.defaultValue; + } + if (typeof input === "string") { + if (input === "false") { + return _EditorFontVariations.OFF; + } + if (input === "true") { + return _EditorFontVariations.TRANSLATE; + } + return input; + } + if (Boolean(input)) { + return _EditorFontVariations.TRANSLATE; + } + return _EditorFontVariations.OFF; + } + compute(env2, options2, value) { + return env2.fontInfo.fontVariationSettings; + } + }; + EditorFontVariations.OFF = "normal"; + EditorFontVariations.TRANSLATE = "translate"; + EditorFontInfo = class extends ComputedEditorOption { + constructor() { + super( + 50 + /* EditorOption.fontInfo */ + ); + } + compute(env2, options2, _) { + return env2.fontInfo; + } + }; + EditorFontSize = class extends SimpleEditorOption { + constructor() { + super(52, "fontSize", EDITOR_FONT_DEFAULTS.fontSize, { + type: "number", + minimum: 6, + maximum: 100, + default: EDITOR_FONT_DEFAULTS.fontSize, + description: localize("fontSize", "Controls the font size in pixels.") + }); + } + validate(input) { + const r = EditorFloatOption.float(input, this.defaultValue); + if (r === 0) { + return EDITOR_FONT_DEFAULTS.fontSize; + } + return EditorFloatOption.clamp(r, 6, 100); + } + compute(env2, options2, value) { + return env2.fontInfo.fontSize; + } + }; + EditorFontWeight = class _EditorFontWeight extends BaseEditorOption { + constructor() { + super(53, "fontWeight", EDITOR_FONT_DEFAULTS.fontWeight, { + anyOf: [ + { + type: "number", + minimum: _EditorFontWeight.MINIMUM_VALUE, + maximum: _EditorFontWeight.MAXIMUM_VALUE, + errorMessage: localize("fontWeightErrorMessage", 'Only "normal" and "bold" keywords or numbers between 1 and 1000 are allowed.') + }, + { + type: "string", + pattern: "^(normal|bold|1000|[1-9][0-9]{0,2})$" + }, + { + enum: _EditorFontWeight.SUGGESTION_VALUES + } + ], + default: EDITOR_FONT_DEFAULTS.fontWeight, + description: localize("fontWeight", 'Controls the font weight. Accepts "normal" and "bold" keywords or numbers between 1 and 1000.') + }); + } + validate(input) { + if (input === "normal" || input === "bold") { + return input; + } + return String(EditorIntOption.clampedInt(input, EDITOR_FONT_DEFAULTS.fontWeight, _EditorFontWeight.MINIMUM_VALUE, _EditorFontWeight.MAXIMUM_VALUE)); + } + }; + EditorFontWeight.SUGGESTION_VALUES = ["normal", "bold", "100", "200", "300", "400", "500", "600", "700", "800", "900"]; + EditorFontWeight.MINIMUM_VALUE = 1; + EditorFontWeight.MAXIMUM_VALUE = 1e3; + EditorGoToLocation = class extends BaseEditorOption { + constructor() { + const defaults = { + multiple: "peek", + multipleDefinitions: "peek", + multipleTypeDefinitions: "peek", + multipleDeclarations: "peek", + multipleImplementations: "peek", + multipleReferences: "peek", + alternativeDefinitionCommand: "editor.action.goToReferences", + alternativeTypeDefinitionCommand: "editor.action.goToReferences", + alternativeDeclarationCommand: "editor.action.goToReferences", + alternativeImplementationCommand: "", + alternativeReferenceCommand: "" + }; + const jsonSubset = { + type: "string", + enum: ["peek", "gotoAndPeek", "goto"], + default: defaults.multiple, + enumDescriptions: [ + localize("editor.gotoLocation.multiple.peek", "Show Peek view of the results (default)"), + localize("editor.gotoLocation.multiple.gotoAndPeek", "Go to the primary result and show a Peek view"), + localize("editor.gotoLocation.multiple.goto", "Go to the primary result and enable Peek-less navigation to others") + ] + }; + const alternativeCommandOptions = ["", "editor.action.referenceSearch.trigger", "editor.action.goToReferences", "editor.action.peekImplementation", "editor.action.goToImplementation", "editor.action.peekTypeDefinition", "editor.action.goToTypeDefinition", "editor.action.peekDeclaration", "editor.action.revealDeclaration", "editor.action.peekDefinition", "editor.action.revealDefinitionAside", "editor.action.revealDefinition"]; + super(58, "gotoLocation", defaults, { + "editor.gotoLocation.multiple": { + deprecationMessage: localize("editor.gotoLocation.multiple.deprecated", "This setting is deprecated, please use separate settings like 'editor.editor.gotoLocation.multipleDefinitions' or 'editor.editor.gotoLocation.multipleImplementations' instead.") + }, + "editor.gotoLocation.multipleDefinitions": __spreadValues({ + description: localize("editor.editor.gotoLocation.multipleDefinitions", "Controls the behavior the 'Go to Definition'-command when multiple target locations exist.") + }, jsonSubset), + "editor.gotoLocation.multipleTypeDefinitions": __spreadValues({ + description: localize("editor.editor.gotoLocation.multipleTypeDefinitions", "Controls the behavior the 'Go to Type Definition'-command when multiple target locations exist.") + }, jsonSubset), + "editor.gotoLocation.multipleDeclarations": __spreadValues({ + description: localize("editor.editor.gotoLocation.multipleDeclarations", "Controls the behavior the 'Go to Declaration'-command when multiple target locations exist.") + }, jsonSubset), + "editor.gotoLocation.multipleImplementations": __spreadValues({ + description: localize("editor.editor.gotoLocation.multipleImplemenattions", "Controls the behavior the 'Go to Implementations'-command when multiple target locations exist.") + }, jsonSubset), + "editor.gotoLocation.multipleReferences": __spreadValues({ + description: localize("editor.editor.gotoLocation.multipleReferences", "Controls the behavior the 'Go to References'-command when multiple target locations exist.") + }, jsonSubset), + "editor.gotoLocation.alternativeDefinitionCommand": { + type: "string", + default: defaults.alternativeDefinitionCommand, + enum: alternativeCommandOptions, + description: localize("alternativeDefinitionCommand", "Alternative command id that is being executed when the result of 'Go to Definition' is the current location.") + }, + "editor.gotoLocation.alternativeTypeDefinitionCommand": { + type: "string", + default: defaults.alternativeTypeDefinitionCommand, + enum: alternativeCommandOptions, + description: localize("alternativeTypeDefinitionCommand", "Alternative command id that is being executed when the result of 'Go to Type Definition' is the current location.") + }, + "editor.gotoLocation.alternativeDeclarationCommand": { + type: "string", + default: defaults.alternativeDeclarationCommand, + enum: alternativeCommandOptions, + description: localize("alternativeDeclarationCommand", "Alternative command id that is being executed when the result of 'Go to Declaration' is the current location.") + }, + "editor.gotoLocation.alternativeImplementationCommand": { + type: "string", + default: defaults.alternativeImplementationCommand, + enum: alternativeCommandOptions, + description: localize("alternativeImplementationCommand", "Alternative command id that is being executed when the result of 'Go to Implementation' is the current location.") + }, + "editor.gotoLocation.alternativeReferenceCommand": { + type: "string", + default: defaults.alternativeReferenceCommand, + enum: alternativeCommandOptions, + description: localize("alternativeReferenceCommand", "Alternative command id that is being executed when the result of 'Go to Reference' is the current location.") + } + }); + } + validate(_input) { + var _a10, _b4, _c2, _d2, _e2; + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + multiple: stringSet(input.multiple, this.defaultValue.multiple, ["peek", "gotoAndPeek", "goto"]), + multipleDefinitions: (_a10 = input.multipleDefinitions) !== null && _a10 !== void 0 ? _a10 : stringSet(input.multipleDefinitions, "peek", ["peek", "gotoAndPeek", "goto"]), + multipleTypeDefinitions: (_b4 = input.multipleTypeDefinitions) !== null && _b4 !== void 0 ? _b4 : stringSet(input.multipleTypeDefinitions, "peek", ["peek", "gotoAndPeek", "goto"]), + multipleDeclarations: (_c2 = input.multipleDeclarations) !== null && _c2 !== void 0 ? _c2 : stringSet(input.multipleDeclarations, "peek", ["peek", "gotoAndPeek", "goto"]), + multipleImplementations: (_d2 = input.multipleImplementations) !== null && _d2 !== void 0 ? _d2 : stringSet(input.multipleImplementations, "peek", ["peek", "gotoAndPeek", "goto"]), + multipleReferences: (_e2 = input.multipleReferences) !== null && _e2 !== void 0 ? _e2 : stringSet(input.multipleReferences, "peek", ["peek", "gotoAndPeek", "goto"]), + alternativeDefinitionCommand: EditorStringOption.string(input.alternativeDefinitionCommand, this.defaultValue.alternativeDefinitionCommand), + alternativeTypeDefinitionCommand: EditorStringOption.string(input.alternativeTypeDefinitionCommand, this.defaultValue.alternativeTypeDefinitionCommand), + alternativeDeclarationCommand: EditorStringOption.string(input.alternativeDeclarationCommand, this.defaultValue.alternativeDeclarationCommand), + alternativeImplementationCommand: EditorStringOption.string(input.alternativeImplementationCommand, this.defaultValue.alternativeImplementationCommand), + alternativeReferenceCommand: EditorStringOption.string(input.alternativeReferenceCommand, this.defaultValue.alternativeReferenceCommand) + }; + } + }; + EditorHover = class extends BaseEditorOption { + constructor() { + const defaults = { + enabled: true, + delay: 300, + hidingDelay: 300, + sticky: true, + above: true + }; + super(60, "hover", defaults, { + "editor.hover.enabled": { + type: "boolean", + default: defaults.enabled, + description: localize("hover.enabled", "Controls whether the hover is shown.") + }, + "editor.hover.delay": { + type: "number", + default: defaults.delay, + minimum: 0, + maximum: 1e4, + description: localize("hover.delay", "Controls the delay in milliseconds after which the hover is shown.") + }, + "editor.hover.sticky": { + type: "boolean", + default: defaults.sticky, + description: localize("hover.sticky", "Controls whether the hover should remain visible when mouse is moved over it.") + }, + "editor.hover.hidingDelay": { + type: "integer", + minimum: 0, + default: defaults.hidingDelay, + description: localize("hover.hidingDelay", "Controls the delay in milliseconds after which the hover is hidden. Requires `editor.hover.sticky` to be enabled.") + }, + "editor.hover.above": { + type: "boolean", + default: defaults.above, + description: localize("hover.above", "Prefer showing hovers above the line, if there's space.") + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + enabled: boolean(input.enabled, this.defaultValue.enabled), + delay: EditorIntOption.clampedInt(input.delay, this.defaultValue.delay, 0, 1e4), + sticky: boolean(input.sticky, this.defaultValue.sticky), + hidingDelay: EditorIntOption.clampedInt(input.hidingDelay, this.defaultValue.hidingDelay, 0, 6e5), + above: boolean(input.above, this.defaultValue.above) + }; + } + }; + EditorLayoutInfoComputer = class _EditorLayoutInfoComputer extends ComputedEditorOption { + constructor() { + super( + 145 + /* EditorOption.layoutInfo */ + ); + } + compute(env2, options2, _) { + return _EditorLayoutInfoComputer.computeLayout(options2, { + memory: env2.memory, + outerWidth: env2.outerWidth, + outerHeight: env2.outerHeight, + isDominatedByLongLines: env2.isDominatedByLongLines, + lineHeight: env2.fontInfo.lineHeight, + viewLineCount: env2.viewLineCount, + lineNumbersDigitCount: env2.lineNumbersDigitCount, + typicalHalfwidthCharacterWidth: env2.fontInfo.typicalHalfwidthCharacterWidth, + maxDigitWidth: env2.fontInfo.maxDigitWidth, + pixelRatio: env2.pixelRatio, + glyphMarginDecorationLaneCount: env2.glyphMarginDecorationLaneCount + }); + } + static computeContainedMinimapLineCount(input) { + const typicalViewportLineCount = input.height / input.lineHeight; + const extraLinesBeforeFirstLine = Math.floor(input.paddingTop / input.lineHeight); + let extraLinesBeyondLastLine = Math.floor(input.paddingBottom / input.lineHeight); + if (input.scrollBeyondLastLine) { + extraLinesBeyondLastLine = Math.max(extraLinesBeyondLastLine, typicalViewportLineCount - 1); + } + const desiredRatio = (extraLinesBeforeFirstLine + input.viewLineCount + extraLinesBeyondLastLine) / (input.pixelRatio * input.height); + const minimapLineCount = Math.floor(input.viewLineCount / desiredRatio); + return { typicalViewportLineCount, extraLinesBeforeFirstLine, extraLinesBeyondLastLine, desiredRatio, minimapLineCount }; + } + static _computeMinimapLayout(input, memory) { + const outerWidth = input.outerWidth; + const outerHeight = input.outerHeight; + const pixelRatio = input.pixelRatio; + if (!input.minimap.enabled) { + return { + renderMinimap: 0, + minimapLeft: 0, + minimapWidth: 0, + minimapHeightIsEditorHeight: false, + minimapIsSampling: false, + minimapScale: 1, + minimapLineHeight: 1, + minimapCanvasInnerWidth: 0, + minimapCanvasInnerHeight: Math.floor(pixelRatio * outerHeight), + minimapCanvasOuterWidth: 0, + minimapCanvasOuterHeight: outerHeight + }; + } + const stableMinimapLayoutInput = memory.stableMinimapLayoutInput; + const couldUseMemory = stableMinimapLayoutInput && input.outerHeight === stableMinimapLayoutInput.outerHeight && input.lineHeight === stableMinimapLayoutInput.lineHeight && input.typicalHalfwidthCharacterWidth === stableMinimapLayoutInput.typicalHalfwidthCharacterWidth && input.pixelRatio === stableMinimapLayoutInput.pixelRatio && input.scrollBeyondLastLine === stableMinimapLayoutInput.scrollBeyondLastLine && input.paddingTop === stableMinimapLayoutInput.paddingTop && input.paddingBottom === stableMinimapLayoutInput.paddingBottom && input.minimap.enabled === stableMinimapLayoutInput.minimap.enabled && input.minimap.side === stableMinimapLayoutInput.minimap.side && input.minimap.size === stableMinimapLayoutInput.minimap.size && input.minimap.showSlider === stableMinimapLayoutInput.minimap.showSlider && input.minimap.renderCharacters === stableMinimapLayoutInput.minimap.renderCharacters && input.minimap.maxColumn === stableMinimapLayoutInput.minimap.maxColumn && input.minimap.scale === stableMinimapLayoutInput.minimap.scale && input.verticalScrollbarWidth === stableMinimapLayoutInput.verticalScrollbarWidth && input.isViewportWrapping === stableMinimapLayoutInput.isViewportWrapping; + const lineHeight = input.lineHeight; + const typicalHalfwidthCharacterWidth = input.typicalHalfwidthCharacterWidth; + const scrollBeyondLastLine = input.scrollBeyondLastLine; + const minimapRenderCharacters = input.minimap.renderCharacters; + let minimapScale = pixelRatio >= 2 ? Math.round(input.minimap.scale * 2) : input.minimap.scale; + const minimapMaxColumn = input.minimap.maxColumn; + const minimapSize = input.minimap.size; + const minimapSide = input.minimap.side; + const verticalScrollbarWidth = input.verticalScrollbarWidth; + const viewLineCount = input.viewLineCount; + const remainingWidth = input.remainingWidth; + const isViewportWrapping = input.isViewportWrapping; + const baseCharHeight = minimapRenderCharacters ? 2 : 3; + let minimapCanvasInnerHeight = Math.floor(pixelRatio * outerHeight); + const minimapCanvasOuterHeight = minimapCanvasInnerHeight / pixelRatio; + let minimapHeightIsEditorHeight = false; + let minimapIsSampling = false; + let minimapLineHeight = baseCharHeight * minimapScale; + let minimapCharWidth = minimapScale / pixelRatio; + let minimapWidthMultiplier = 1; + if (minimapSize === "fill" || minimapSize === "fit") { + const { typicalViewportLineCount, extraLinesBeforeFirstLine, extraLinesBeyondLastLine, desiredRatio, minimapLineCount } = _EditorLayoutInfoComputer.computeContainedMinimapLineCount({ + viewLineCount, + scrollBeyondLastLine, + paddingTop: input.paddingTop, + paddingBottom: input.paddingBottom, + height: outerHeight, + lineHeight, + pixelRatio + }); + const ratio = viewLineCount / minimapLineCount; + if (ratio > 1) { + minimapHeightIsEditorHeight = true; + minimapIsSampling = true; + minimapScale = 1; + minimapLineHeight = 1; + minimapCharWidth = minimapScale / pixelRatio; + } else { + let fitBecomesFill = false; + let maxMinimapScale = minimapScale + 1; + if (minimapSize === "fit") { + const effectiveMinimapHeight = Math.ceil((extraLinesBeforeFirstLine + viewLineCount + extraLinesBeyondLastLine) * minimapLineHeight); + if (isViewportWrapping && couldUseMemory && remainingWidth <= memory.stableFitRemainingWidth) { + fitBecomesFill = true; + maxMinimapScale = memory.stableFitMaxMinimapScale; + } else { + fitBecomesFill = effectiveMinimapHeight > minimapCanvasInnerHeight; + } + } + if (minimapSize === "fill" || fitBecomesFill) { + minimapHeightIsEditorHeight = true; + const configuredMinimapScale = minimapScale; + minimapLineHeight = Math.min(lineHeight * pixelRatio, Math.max(1, Math.floor(1 / desiredRatio))); + if (isViewportWrapping && couldUseMemory && remainingWidth <= memory.stableFitRemainingWidth) { + maxMinimapScale = memory.stableFitMaxMinimapScale; + } + minimapScale = Math.min(maxMinimapScale, Math.max(1, Math.floor(minimapLineHeight / baseCharHeight))); + if (minimapScale > configuredMinimapScale) { + minimapWidthMultiplier = Math.min(2, minimapScale / configuredMinimapScale); + } + minimapCharWidth = minimapScale / pixelRatio / minimapWidthMultiplier; + minimapCanvasInnerHeight = Math.ceil(Math.max(typicalViewportLineCount, extraLinesBeforeFirstLine + viewLineCount + extraLinesBeyondLastLine) * minimapLineHeight); + if (isViewportWrapping) { + memory.stableMinimapLayoutInput = input; + memory.stableFitRemainingWidth = remainingWidth; + memory.stableFitMaxMinimapScale = minimapScale; + } else { + memory.stableMinimapLayoutInput = null; + memory.stableFitRemainingWidth = 0; + } + } + } + } + const minimapMaxWidth = Math.floor(minimapMaxColumn * minimapCharWidth); + const minimapWidth = Math.min(minimapMaxWidth, Math.max(0, Math.floor((remainingWidth - verticalScrollbarWidth - 2) * minimapCharWidth / (typicalHalfwidthCharacterWidth + minimapCharWidth))) + MINIMAP_GUTTER_WIDTH); + let minimapCanvasInnerWidth = Math.floor(pixelRatio * minimapWidth); + const minimapCanvasOuterWidth = minimapCanvasInnerWidth / pixelRatio; + minimapCanvasInnerWidth = Math.floor(minimapCanvasInnerWidth * minimapWidthMultiplier); + const renderMinimap = minimapRenderCharacters ? 1 : 2; + const minimapLeft = minimapSide === "left" ? 0 : outerWidth - minimapWidth - verticalScrollbarWidth; + return { + renderMinimap, + minimapLeft, + minimapWidth, + minimapHeightIsEditorHeight, + minimapIsSampling, + minimapScale, + minimapLineHeight, + minimapCanvasInnerWidth, + minimapCanvasInnerHeight, + minimapCanvasOuterWidth, + minimapCanvasOuterHeight + }; + } + static computeLayout(options2, env2) { + const outerWidth = env2.outerWidth | 0; + const outerHeight = env2.outerHeight | 0; + const lineHeight = env2.lineHeight | 0; + const lineNumbersDigitCount = env2.lineNumbersDigitCount | 0; + const typicalHalfwidthCharacterWidth = env2.typicalHalfwidthCharacterWidth; + const maxDigitWidth = env2.maxDigitWidth; + const pixelRatio = env2.pixelRatio; + const viewLineCount = env2.viewLineCount; + const wordWrapOverride2 = options2.get( + 137 + /* EditorOption.wordWrapOverride2 */ + ); + const wordWrapOverride1 = wordWrapOverride2 === "inherit" ? options2.get( + 136 + /* EditorOption.wordWrapOverride1 */ + ) : wordWrapOverride2; + const wordWrap = wordWrapOverride1 === "inherit" ? options2.get( + 132 + /* EditorOption.wordWrap */ + ) : wordWrapOverride1; + const wordWrapColumn = options2.get( + 135 + /* EditorOption.wordWrapColumn */ + ); + const isDominatedByLongLines = env2.isDominatedByLongLines; + const showGlyphMargin = options2.get( + 57 + /* EditorOption.glyphMargin */ + ); + const showLineNumbers = options2.get( + 68 + /* EditorOption.lineNumbers */ + ).renderType !== 0; + const lineNumbersMinChars = options2.get( + 69 + /* EditorOption.lineNumbersMinChars */ + ); + const scrollBeyondLastLine = options2.get( + 105 + /* EditorOption.scrollBeyondLastLine */ + ); + const padding = options2.get( + 84 + /* EditorOption.padding */ + ); + const minimap = options2.get( + 73 + /* EditorOption.minimap */ + ); + const scrollbar = options2.get( + 103 + /* EditorOption.scrollbar */ + ); + const verticalScrollbarWidth = scrollbar.verticalScrollbarSize; + const verticalScrollbarHasArrows = scrollbar.verticalHasArrows; + const scrollbarArrowSize = scrollbar.arrowSize; + const horizontalScrollbarHeight = scrollbar.horizontalScrollbarSize; + const folding = options2.get( + 43 + /* EditorOption.folding */ + ); + const showFoldingDecoration = options2.get( + 110 + /* EditorOption.showFoldingControls */ + ) !== "never"; + let lineDecorationsWidth = options2.get( + 66 + /* EditorOption.lineDecorationsWidth */ + ); + if (folding && showFoldingDecoration) { + lineDecorationsWidth += 16; + } + let lineNumbersWidth = 0; + if (showLineNumbers) { + const digitCount2 = Math.max(lineNumbersDigitCount, lineNumbersMinChars); + lineNumbersWidth = Math.round(digitCount2 * maxDigitWidth); + } + let glyphMarginWidth = 0; + if (showGlyphMargin) { + glyphMarginWidth = lineHeight * env2.glyphMarginDecorationLaneCount; + } + let glyphMarginLeft = 0; + let lineNumbersLeft = glyphMarginLeft + glyphMarginWidth; + let decorationsLeft = lineNumbersLeft + lineNumbersWidth; + let contentLeft = decorationsLeft + lineDecorationsWidth; + const remainingWidth = outerWidth - glyphMarginWidth - lineNumbersWidth - lineDecorationsWidth; + let isWordWrapMinified = false; + let isViewportWrapping = false; + let wrappingColumn = -1; + if (wordWrapOverride1 === "inherit" && isDominatedByLongLines) { + isWordWrapMinified = true; + isViewportWrapping = true; + } else if (wordWrap === "on" || wordWrap === "bounded") { + isViewportWrapping = true; + } else if (wordWrap === "wordWrapColumn") { + wrappingColumn = wordWrapColumn; + } + const minimapLayout = _EditorLayoutInfoComputer._computeMinimapLayout({ + outerWidth, + outerHeight, + lineHeight, + typicalHalfwidthCharacterWidth, + pixelRatio, + scrollBeyondLastLine, + paddingTop: padding.top, + paddingBottom: padding.bottom, + minimap, + verticalScrollbarWidth, + viewLineCount, + remainingWidth, + isViewportWrapping + }, env2.memory || new ComputeOptionsMemory()); + if (minimapLayout.renderMinimap !== 0 && minimapLayout.minimapLeft === 0) { + glyphMarginLeft += minimapLayout.minimapWidth; + lineNumbersLeft += minimapLayout.minimapWidth; + decorationsLeft += minimapLayout.minimapWidth; + contentLeft += minimapLayout.minimapWidth; + } + const contentWidth = remainingWidth - minimapLayout.minimapWidth; + const viewportColumn = Math.max(1, Math.floor((contentWidth - verticalScrollbarWidth - 2) / typicalHalfwidthCharacterWidth)); + const verticalArrowSize = verticalScrollbarHasArrows ? scrollbarArrowSize : 0; + if (isViewportWrapping) { + wrappingColumn = Math.max(1, viewportColumn); + if (wordWrap === "bounded") { + wrappingColumn = Math.min(wrappingColumn, wordWrapColumn); + } + } + return { + width: outerWidth, + height: outerHeight, + glyphMarginLeft, + glyphMarginWidth, + glyphMarginDecorationLaneCount: env2.glyphMarginDecorationLaneCount, + lineNumbersLeft, + lineNumbersWidth, + decorationsLeft, + decorationsWidth: lineDecorationsWidth, + contentLeft, + contentWidth, + minimap: minimapLayout, + viewportColumn, + isWordWrapMinified, + isViewportWrapping, + wrappingColumn, + verticalScrollbarWidth, + horizontalScrollbarHeight, + overviewRuler: { + top: verticalArrowSize, + width: verticalScrollbarWidth, + height: outerHeight - 2 * verticalArrowSize, + right: 0 + } + }; + } + }; + WrappingStrategy = class extends BaseEditorOption { + constructor() { + super(139, "wrappingStrategy", "simple", { + "editor.wrappingStrategy": { + enumDescriptions: [ + localize("wrappingStrategy.simple", "Assumes that all characters are of the same width. This is a fast algorithm that works correctly for monospace fonts and certain scripts (like Latin characters) where glyphs are of equal width."), + localize("wrappingStrategy.advanced", "Delegates wrapping points computation to the browser. This is a slow algorithm, that might cause freezes for large files, but it works correctly in all cases.") + ], + type: "string", + enum: ["simple", "advanced"], + default: "simple", + description: localize("wrappingStrategy", "Controls the algorithm that computes wrapping points. Note that when in accessibility mode, advanced will be used for the best experience.") + } + }); + } + validate(input) { + return stringSet(input, "simple", ["simple", "advanced"]); + } + compute(env2, options2, value) { + const accessibilitySupport = options2.get( + 2 + /* EditorOption.accessibilitySupport */ + ); + if (accessibilitySupport === 2) { + return "advanced"; + } + return value; + } + }; + (function(ShowLightbulbIconMode3) { + ShowLightbulbIconMode3["Off"] = "off"; + ShowLightbulbIconMode3["OnCode"] = "onCode"; + ShowLightbulbIconMode3["On"] = "on"; + })(ShowLightbulbIconMode || (ShowLightbulbIconMode = {})); + EditorLightbulb = class extends BaseEditorOption { + constructor() { + const defaults = { enabled: ShowLightbulbIconMode.On }; + super(65, "lightbulb", defaults, { + "editor.lightbulb.enabled": { + type: "string", + tags: ["experimental"], + enum: [ShowLightbulbIconMode.Off, ShowLightbulbIconMode.OnCode, ShowLightbulbIconMode.On], + default: defaults.enabled, + enumDescriptions: [ + localize("editor.lightbulb.enabled.off", "Disable the code action menu."), + localize("editor.lightbulb.enabled.onCode", "Show the code action menu when the cursor is on lines with code."), + localize("editor.lightbulb.enabled.on", "Show the code action menu when the cursor is on lines with code or on empty lines.") + ], + description: localize("enabled", "Enables the Code Action lightbulb in the editor.") + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + enabled: stringSet(input.enabled, this.defaultValue.enabled, [ShowLightbulbIconMode.Off, ShowLightbulbIconMode.OnCode, ShowLightbulbIconMode.On]) + }; + } + }; + EditorStickyScroll = class extends BaseEditorOption { + constructor() { + const defaults = { enabled: true, maxLineCount: 5, defaultModel: "outlineModel", scrollWithEditor: true }; + super(115, "stickyScroll", defaults, { + "editor.stickyScroll.enabled": { + type: "boolean", + default: defaults.enabled, + description: localize("editor.stickyScroll.enabled", "Shows the nested current scopes during the scroll at the top of the editor."), + tags: ["experimental"] + }, + "editor.stickyScroll.maxLineCount": { + type: "number", + default: defaults.maxLineCount, + minimum: 1, + maximum: 20, + description: localize("editor.stickyScroll.maxLineCount", "Defines the maximum number of sticky lines to show.") + }, + "editor.stickyScroll.defaultModel": { + type: "string", + enum: ["outlineModel", "foldingProviderModel", "indentationModel"], + default: defaults.defaultModel, + description: localize("editor.stickyScroll.defaultModel", "Defines the model to use for determining which lines to stick. If the outline model does not exist, it will fall back on the folding provider model which falls back on the indentation model. This order is respected in all three cases.") + }, + "editor.stickyScroll.scrollWithEditor": { + type: "boolean", + default: defaults.scrollWithEditor, + description: localize("editor.stickyScroll.scrollWithEditor", "Enable scrolling of Sticky Scroll with the editor's horizontal scrollbar.") + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + enabled: boolean(input.enabled, this.defaultValue.enabled), + maxLineCount: EditorIntOption.clampedInt(input.maxLineCount, this.defaultValue.maxLineCount, 1, 20), + defaultModel: stringSet(input.defaultModel, this.defaultValue.defaultModel, ["outlineModel", "foldingProviderModel", "indentationModel"]), + scrollWithEditor: boolean(input.scrollWithEditor, this.defaultValue.scrollWithEditor) + }; + } + }; + EditorInlayHints = class extends BaseEditorOption { + constructor() { + const defaults = { enabled: "on", fontSize: 0, fontFamily: "", padding: false }; + super(141, "inlayHints", defaults, { + "editor.inlayHints.enabled": { + type: "string", + default: defaults.enabled, + description: localize("inlayHints.enable", "Enables the inlay hints in the editor."), + enum: ["on", "onUnlessPressed", "offUnlessPressed", "off"], + markdownEnumDescriptions: [ + localize("editor.inlayHints.on", "Inlay hints are enabled"), + localize("editor.inlayHints.onUnlessPressed", "Inlay hints are showing by default and hide when holding {0}", isMacintosh ? `Ctrl+Option` : `Ctrl+Alt`), + localize("editor.inlayHints.offUnlessPressed", "Inlay hints are hidden by default and show when holding {0}", isMacintosh ? `Ctrl+Option` : `Ctrl+Alt`), + localize("editor.inlayHints.off", "Inlay hints are disabled") + ] + }, + "editor.inlayHints.fontSize": { + type: "number", + default: defaults.fontSize, + markdownDescription: localize("inlayHints.fontSize", "Controls font size of inlay hints in the editor. As default the {0} is used when the configured value is less than {1} or greater than the editor font size.", "`#editor.fontSize#`", "`5`") + }, + "editor.inlayHints.fontFamily": { + type: "string", + default: defaults.fontFamily, + markdownDescription: localize("inlayHints.fontFamily", "Controls font family of inlay hints in the editor. When set to empty, the {0} is used.", "`#editor.fontFamily#`") + }, + "editor.inlayHints.padding": { + type: "boolean", + default: defaults.padding, + description: localize("inlayHints.padding", "Enables the padding around the inlay hints in the editor.") + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + if (typeof input.enabled === "boolean") { + input.enabled = input.enabled ? "on" : "off"; + } + return { + enabled: stringSet(input.enabled, this.defaultValue.enabled, ["on", "off", "offUnlessPressed", "onUnlessPressed"]), + fontSize: EditorIntOption.clampedInt(input.fontSize, this.defaultValue.fontSize, 0, 100), + fontFamily: EditorStringOption.string(input.fontFamily, this.defaultValue.fontFamily), + padding: boolean(input.padding, this.defaultValue.padding) + }; + } + }; + EditorLineDecorationsWidth = class extends BaseEditorOption { + constructor() { + super(66, "lineDecorationsWidth", 10); + } + validate(input) { + if (typeof input === "string" && /^\d+(\.\d+)?ch$/.test(input)) { + const multiple = parseFloat(input.substring(0, input.length - 2)); + return -multiple; + } else { + return EditorIntOption.clampedInt(input, this.defaultValue, 0, 1e3); + } + } + compute(env2, options2, value) { + if (value < 0) { + return EditorIntOption.clampedInt(-value * env2.fontInfo.typicalHalfwidthCharacterWidth, this.defaultValue, 0, 1e3); + } else { + return value; + } + } + }; + EditorLineHeight = class extends EditorFloatOption { + constructor() { + super(67, "lineHeight", EDITOR_FONT_DEFAULTS.lineHeight, (x) => EditorFloatOption.clamp(x, 0, 150), { markdownDescription: localize("lineHeight", "Controls the line height. \n - Use 0 to automatically compute the line height from the font size.\n - Values between 0 and 8 will be used as a multiplier with the font size.\n - Values greater than or equal to 8 will be used as effective values.") }); + } + compute(env2, options2, value) { + return env2.fontInfo.lineHeight; + } + }; + EditorMinimap = class extends BaseEditorOption { + constructor() { + const defaults = { + enabled: true, + size: "proportional", + side: "right", + showSlider: "mouseover", + autohide: false, + renderCharacters: true, + maxColumn: 120, + scale: 1, + showRegionSectionHeaders: true, + showMarkSectionHeaders: true, + sectionHeaderFontSize: 9, + sectionHeaderLetterSpacing: 1 + }; + super(73, "minimap", defaults, { + "editor.minimap.enabled": { + type: "boolean", + default: defaults.enabled, + description: localize("minimap.enabled", "Controls whether the minimap is shown.") + }, + "editor.minimap.autohide": { + type: "boolean", + default: defaults.autohide, + description: localize("minimap.autohide", "Controls whether the minimap is hidden automatically.") + }, + "editor.minimap.size": { + type: "string", + enum: ["proportional", "fill", "fit"], + enumDescriptions: [ + localize("minimap.size.proportional", "The minimap has the same size as the editor contents (and might scroll)."), + localize("minimap.size.fill", "The minimap will stretch or shrink as necessary to fill the height of the editor (no scrolling)."), + localize("minimap.size.fit", "The minimap will shrink as necessary to never be larger than the editor (no scrolling).") + ], + default: defaults.size, + description: localize("minimap.size", "Controls the size of the minimap.") + }, + "editor.minimap.side": { + type: "string", + enum: ["left", "right"], + default: defaults.side, + description: localize("minimap.side", "Controls the side where to render the minimap.") + }, + "editor.minimap.showSlider": { + type: "string", + enum: ["always", "mouseover"], + default: defaults.showSlider, + description: localize("minimap.showSlider", "Controls when the minimap slider is shown.") + }, + "editor.minimap.scale": { + type: "number", + default: defaults.scale, + minimum: 1, + maximum: 3, + enum: [1, 2, 3], + description: localize("minimap.scale", "Scale of content drawn in the minimap: 1, 2 or 3.") + }, + "editor.minimap.renderCharacters": { + type: "boolean", + default: defaults.renderCharacters, + description: localize("minimap.renderCharacters", "Render the actual characters on a line as opposed to color blocks.") + }, + "editor.minimap.maxColumn": { + type: "number", + default: defaults.maxColumn, + description: localize("minimap.maxColumn", "Limit the width of the minimap to render at most a certain number of columns.") + }, + "editor.minimap.showRegionSectionHeaders": { + type: "boolean", + default: defaults.showRegionSectionHeaders, + description: localize("minimap.showRegionSectionHeaders", "Controls whether named regions are shown as section headers in the minimap.") + }, + "editor.minimap.showMarkSectionHeaders": { + type: "boolean", + default: defaults.showMarkSectionHeaders, + description: localize("minimap.showMarkSectionHeaders", "Controls whether MARK: comments are shown as section headers in the minimap.") + }, + "editor.minimap.sectionHeaderFontSize": { + type: "number", + default: defaults.sectionHeaderFontSize, + description: localize("minimap.sectionHeaderFontSize", "Controls the font size of section headers in the minimap.") + }, + "editor.minimap.sectionHeaderLetterSpacing": { + type: "number", + default: defaults.sectionHeaderLetterSpacing, + description: localize("minimap.sectionHeaderLetterSpacing", "Controls the amount of space (in pixels) between characters of section header. This helps the readability of the header in small font sizes.") + } + }); + } + validate(_input) { + var _a10, _b4; + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + enabled: boolean(input.enabled, this.defaultValue.enabled), + autohide: boolean(input.autohide, this.defaultValue.autohide), + size: stringSet(input.size, this.defaultValue.size, ["proportional", "fill", "fit"]), + side: stringSet(input.side, this.defaultValue.side, ["right", "left"]), + showSlider: stringSet(input.showSlider, this.defaultValue.showSlider, ["always", "mouseover"]), + renderCharacters: boolean(input.renderCharacters, this.defaultValue.renderCharacters), + scale: EditorIntOption.clampedInt(input.scale, 1, 1, 3), + maxColumn: EditorIntOption.clampedInt(input.maxColumn, this.defaultValue.maxColumn, 1, 1e4), + showRegionSectionHeaders: boolean(input.showRegionSectionHeaders, this.defaultValue.showRegionSectionHeaders), + showMarkSectionHeaders: boolean(input.showMarkSectionHeaders, this.defaultValue.showMarkSectionHeaders), + sectionHeaderFontSize: EditorFloatOption.clamp((_a10 = input.sectionHeaderFontSize) !== null && _a10 !== void 0 ? _a10 : this.defaultValue.sectionHeaderFontSize, 4, 32), + sectionHeaderLetterSpacing: EditorFloatOption.clamp((_b4 = input.sectionHeaderLetterSpacing) !== null && _b4 !== void 0 ? _b4 : this.defaultValue.sectionHeaderLetterSpacing, 0, 5) + }; + } + }; + EditorPadding = class extends BaseEditorOption { + constructor() { + super(84, "padding", { top: 0, bottom: 0 }, { + "editor.padding.top": { + type: "number", + default: 0, + minimum: 0, + maximum: 1e3, + description: localize("padding.top", "Controls the amount of space between the top edge of the editor and the first line.") + }, + "editor.padding.bottom": { + type: "number", + default: 0, + minimum: 0, + maximum: 1e3, + description: localize("padding.bottom", "Controls the amount of space between the bottom edge of the editor and the last line.") + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + top: EditorIntOption.clampedInt(input.top, 0, 0, 1e3), + bottom: EditorIntOption.clampedInt(input.bottom, 0, 0, 1e3) + }; + } + }; + EditorParameterHints = class extends BaseEditorOption { + constructor() { + const defaults = { + enabled: true, + cycle: true + }; + super(86, "parameterHints", defaults, { + "editor.parameterHints.enabled": { + type: "boolean", + default: defaults.enabled, + description: localize("parameterHints.enabled", "Enables a pop-up that shows parameter documentation and type information as you type.") + }, + "editor.parameterHints.cycle": { + type: "boolean", + default: defaults.cycle, + description: localize("parameterHints.cycle", "Controls whether the parameter hints menu cycles or closes when reaching the end of the list.") + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + enabled: boolean(input.enabled, this.defaultValue.enabled), + cycle: boolean(input.cycle, this.defaultValue.cycle) + }; + } + }; + EditorPixelRatio = class extends ComputedEditorOption { + constructor() { + super( + 143 + /* EditorOption.pixelRatio */ + ); + } + compute(env2, options2, _) { + return env2.pixelRatio; + } + }; + EditorQuickSuggestions = class extends BaseEditorOption { + constructor() { + const defaults = { + other: "on", + comments: "off", + strings: "off" + }; + const types = [ + { type: "boolean" }, + { + type: "string", + enum: ["on", "inline", "off"], + enumDescriptions: [localize("on", "Quick suggestions show inside the suggest widget"), localize("inline", "Quick suggestions show as ghost text"), localize("off", "Quick suggestions are disabled")] + } + ]; + super(89, "quickSuggestions", defaults, { + type: "object", + additionalProperties: false, + properties: { + strings: { + anyOf: types, + default: defaults.strings, + description: localize("quickSuggestions.strings", "Enable quick suggestions inside strings.") + }, + comments: { + anyOf: types, + default: defaults.comments, + description: localize("quickSuggestions.comments", "Enable quick suggestions inside comments.") + }, + other: { + anyOf: types, + default: defaults.other, + description: localize("quickSuggestions.other", "Enable quick suggestions outside of strings and comments.") + } + }, + default: defaults, + markdownDescription: localize("quickSuggestions", "Controls whether suggestions should automatically show up while typing. This can be controlled for typing in comments, strings, and other code. Quick suggestion can be configured to show as ghost text or with the suggest widget. Also be aware of the '{0}'-setting which controls if suggestions are triggered by special characters.", `#editor.suggestOnTriggerCharacters#`) + }); + this.defaultValue = defaults; + } + validate(input) { + if (typeof input === "boolean") { + const value = input ? "on" : "off"; + return { comments: value, strings: value, other: value }; + } + if (!input || typeof input !== "object") { + return this.defaultValue; + } + const { other, comments, strings } = input; + const allowedValues = ["on", "inline", "off"]; + let validatedOther; + let validatedComments; + let validatedStrings; + if (typeof other === "boolean") { + validatedOther = other ? "on" : "off"; + } else { + validatedOther = stringSet(other, this.defaultValue.other, allowedValues); + } + if (typeof comments === "boolean") { + validatedComments = comments ? "on" : "off"; + } else { + validatedComments = stringSet(comments, this.defaultValue.comments, allowedValues); + } + if (typeof strings === "boolean") { + validatedStrings = strings ? "on" : "off"; + } else { + validatedStrings = stringSet(strings, this.defaultValue.strings, allowedValues); + } + return { + other: validatedOther, + comments: validatedComments, + strings: validatedStrings + }; + } + }; + EditorRenderLineNumbersOption = class extends BaseEditorOption { + constructor() { + super(68, "lineNumbers", { renderType: 1, renderFn: null }, { + type: "string", + enum: ["off", "on", "relative", "interval"], + enumDescriptions: [ + localize("lineNumbers.off", "Line numbers are not rendered."), + localize("lineNumbers.on", "Line numbers are rendered as absolute number."), + localize("lineNumbers.relative", "Line numbers are rendered as distance in lines to cursor position."), + localize("lineNumbers.interval", "Line numbers are rendered every 10 lines.") + ], + default: "on", + description: localize("lineNumbers", "Controls the display of line numbers.") + }); + } + validate(lineNumbers) { + let renderType = this.defaultValue.renderType; + let renderFn = this.defaultValue.renderFn; + if (typeof lineNumbers !== "undefined") { + if (typeof lineNumbers === "function") { + renderType = 4; + renderFn = lineNumbers; + } else if (lineNumbers === "interval") { + renderType = 3; + } else if (lineNumbers === "relative") { + renderType = 2; + } else if (lineNumbers === "on") { + renderType = 1; + } else { + renderType = 0; + } + } + return { + renderType, + renderFn + }; + } + }; + EditorRulers = class extends BaseEditorOption { + constructor() { + const defaults = []; + const columnSchema = { type: "number", description: localize("rulers.size", "Number of monospace characters at which this editor ruler will render.") }; + super(102, "rulers", defaults, { + type: "array", + items: { + anyOf: [ + columnSchema, + { + type: [ + "object" + ], + properties: { + column: columnSchema, + color: { + type: "string", + description: localize("rulers.color", "Color of this editor ruler."), + format: "color-hex" + } + } + } + ] + }, + default: defaults, + description: localize("rulers", "Render vertical rulers after a certain number of monospace characters. Use multiple values for multiple rulers. No rulers are drawn if array is empty.") + }); + } + validate(input) { + if (Array.isArray(input)) { + const rulers = []; + for (const _element of input) { + if (typeof _element === "number") { + rulers.push({ + column: EditorIntOption.clampedInt(_element, 0, 0, 1e4), + color: null + }); + } else if (_element && typeof _element === "object") { + const element = _element; + rulers.push({ + column: EditorIntOption.clampedInt(element.column, 0, 0, 1e4), + color: element.color + }); + } + } + rulers.sort((a3, b) => a3.column - b.column); + return rulers; + } + return this.defaultValue; + } + }; + ReadonlyMessage = class extends BaseEditorOption { + constructor() { + const defaults = void 0; + super(92, "readOnlyMessage", defaults); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + return _input; + } + }; + EditorScrollbar = class extends BaseEditorOption { + constructor() { + const defaults = { + vertical: 1, + horizontal: 1, + arrowSize: 11, + useShadows: true, + verticalHasArrows: false, + horizontalHasArrows: false, + horizontalScrollbarSize: 12, + horizontalSliderSize: 12, + verticalScrollbarSize: 14, + verticalSliderSize: 14, + handleMouseWheel: true, + alwaysConsumeMouseWheel: true, + scrollByPage: false, + ignoreHorizontalScrollbarInContentHeight: false + }; + super(103, "scrollbar", defaults, { + "editor.scrollbar.vertical": { + type: "string", + enum: ["auto", "visible", "hidden"], + enumDescriptions: [ + localize("scrollbar.vertical.auto", "The vertical scrollbar will be visible only when necessary."), + localize("scrollbar.vertical.visible", "The vertical scrollbar will always be visible."), + localize("scrollbar.vertical.fit", "The vertical scrollbar will always be hidden.") + ], + default: "auto", + description: localize("scrollbar.vertical", "Controls the visibility of the vertical scrollbar.") + }, + "editor.scrollbar.horizontal": { + type: "string", + enum: ["auto", "visible", "hidden"], + enumDescriptions: [ + localize("scrollbar.horizontal.auto", "The horizontal scrollbar will be visible only when necessary."), + localize("scrollbar.horizontal.visible", "The horizontal scrollbar will always be visible."), + localize("scrollbar.horizontal.fit", "The horizontal scrollbar will always be hidden.") + ], + default: "auto", + description: localize("scrollbar.horizontal", "Controls the visibility of the horizontal scrollbar.") + }, + "editor.scrollbar.verticalScrollbarSize": { + type: "number", + default: defaults.verticalScrollbarSize, + description: localize("scrollbar.verticalScrollbarSize", "The width of the vertical scrollbar.") + }, + "editor.scrollbar.horizontalScrollbarSize": { + type: "number", + default: defaults.horizontalScrollbarSize, + description: localize("scrollbar.horizontalScrollbarSize", "The height of the horizontal scrollbar.") + }, + "editor.scrollbar.scrollByPage": { + type: "boolean", + default: defaults.scrollByPage, + description: localize("scrollbar.scrollByPage", "Controls whether clicks scroll by page or jump to click position.") + }, + "editor.scrollbar.ignoreHorizontalScrollbarInContentHeight": { + type: "boolean", + default: defaults.ignoreHorizontalScrollbarInContentHeight, + description: localize("scrollbar.ignoreHorizontalScrollbarInContentHeight", "When set, the horizontal scrollbar will not increase the size of the editor's content.") + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + const horizontalScrollbarSize = EditorIntOption.clampedInt(input.horizontalScrollbarSize, this.defaultValue.horizontalScrollbarSize, 0, 1e3); + const verticalScrollbarSize = EditorIntOption.clampedInt(input.verticalScrollbarSize, this.defaultValue.verticalScrollbarSize, 0, 1e3); + return { + arrowSize: EditorIntOption.clampedInt(input.arrowSize, this.defaultValue.arrowSize, 0, 1e3), + vertical: _scrollbarVisibilityFromString(input.vertical, this.defaultValue.vertical), + horizontal: _scrollbarVisibilityFromString(input.horizontal, this.defaultValue.horizontal), + useShadows: boolean(input.useShadows, this.defaultValue.useShadows), + verticalHasArrows: boolean(input.verticalHasArrows, this.defaultValue.verticalHasArrows), + horizontalHasArrows: boolean(input.horizontalHasArrows, this.defaultValue.horizontalHasArrows), + handleMouseWheel: boolean(input.handleMouseWheel, this.defaultValue.handleMouseWheel), + alwaysConsumeMouseWheel: boolean(input.alwaysConsumeMouseWheel, this.defaultValue.alwaysConsumeMouseWheel), + horizontalScrollbarSize, + horizontalSliderSize: EditorIntOption.clampedInt(input.horizontalSliderSize, horizontalScrollbarSize, 0, 1e3), + verticalScrollbarSize, + verticalSliderSize: EditorIntOption.clampedInt(input.verticalSliderSize, verticalScrollbarSize, 0, 1e3), + scrollByPage: boolean(input.scrollByPage, this.defaultValue.scrollByPage), + ignoreHorizontalScrollbarInContentHeight: boolean(input.ignoreHorizontalScrollbarInContentHeight, this.defaultValue.ignoreHorizontalScrollbarInContentHeight) + }; + } + }; + inUntrustedWorkspace = "inUntrustedWorkspace"; + unicodeHighlightConfigKeys = { + allowedCharacters: "editor.unicodeHighlight.allowedCharacters", + invisibleCharacters: "editor.unicodeHighlight.invisibleCharacters", + nonBasicASCII: "editor.unicodeHighlight.nonBasicASCII", + ambiguousCharacters: "editor.unicodeHighlight.ambiguousCharacters", + includeComments: "editor.unicodeHighlight.includeComments", + includeStrings: "editor.unicodeHighlight.includeStrings", + allowedLocales: "editor.unicodeHighlight.allowedLocales" + }; + UnicodeHighlight = class extends BaseEditorOption { + constructor() { + const defaults = { + nonBasicASCII: inUntrustedWorkspace, + invisibleCharacters: true, + ambiguousCharacters: true, + includeComments: inUntrustedWorkspace, + includeStrings: true, + allowedCharacters: {}, + allowedLocales: { _os: true, _vscode: true } + }; + super(125, "unicodeHighlight", defaults, { + [unicodeHighlightConfigKeys.nonBasicASCII]: { + restricted: true, + type: ["boolean", "string"], + enum: [true, false, inUntrustedWorkspace], + default: defaults.nonBasicASCII, + description: localize("unicodeHighlight.nonBasicASCII", "Controls whether all non-basic ASCII characters are highlighted. Only characters between U+0020 and U+007E, tab, line-feed and carriage-return are considered basic ASCII.") + }, + [unicodeHighlightConfigKeys.invisibleCharacters]: { + restricted: true, + type: "boolean", + default: defaults.invisibleCharacters, + description: localize("unicodeHighlight.invisibleCharacters", "Controls whether characters that just reserve space or have no width at all are highlighted.") + }, + [unicodeHighlightConfigKeys.ambiguousCharacters]: { + restricted: true, + type: "boolean", + default: defaults.ambiguousCharacters, + description: localize("unicodeHighlight.ambiguousCharacters", "Controls whether characters are highlighted that can be confused with basic ASCII characters, except those that are common in the current user locale.") + }, + [unicodeHighlightConfigKeys.includeComments]: { + restricted: true, + type: ["boolean", "string"], + enum: [true, false, inUntrustedWorkspace], + default: defaults.includeComments, + description: localize("unicodeHighlight.includeComments", "Controls whether characters in comments should also be subject to Unicode highlighting.") + }, + [unicodeHighlightConfigKeys.includeStrings]: { + restricted: true, + type: ["boolean", "string"], + enum: [true, false, inUntrustedWorkspace], + default: defaults.includeStrings, + description: localize("unicodeHighlight.includeStrings", "Controls whether characters in strings should also be subject to Unicode highlighting.") + }, + [unicodeHighlightConfigKeys.allowedCharacters]: { + restricted: true, + type: "object", + default: defaults.allowedCharacters, + description: localize("unicodeHighlight.allowedCharacters", "Defines allowed characters that are not being highlighted."), + additionalProperties: { + type: "boolean" + } + }, + [unicodeHighlightConfigKeys.allowedLocales]: { + restricted: true, + type: "object", + additionalProperties: { + type: "boolean" + }, + default: defaults.allowedLocales, + description: localize("unicodeHighlight.allowedLocales", "Unicode characters that are common in allowed locales are not being highlighted.") + } + }); + } + applyUpdate(value, update) { + let didChange = false; + if (update.allowedCharacters && value) { + if (!equals2(value.allowedCharacters, update.allowedCharacters)) { + value = __spreadProps(__spreadValues({}, value), { allowedCharacters: update.allowedCharacters }); + didChange = true; + } + } + if (update.allowedLocales && value) { + if (!equals2(value.allowedLocales, update.allowedLocales)) { + value = __spreadProps(__spreadValues({}, value), { allowedLocales: update.allowedLocales }); + didChange = true; + } + } + const result = super.applyUpdate(value, update); + if (didChange) { + return new ApplyUpdateResult(result.newValue, true); + } + return result; + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + nonBasicASCII: primitiveSet(input.nonBasicASCII, inUntrustedWorkspace, [true, false, inUntrustedWorkspace]), + invisibleCharacters: boolean(input.invisibleCharacters, this.defaultValue.invisibleCharacters), + ambiguousCharacters: boolean(input.ambiguousCharacters, this.defaultValue.ambiguousCharacters), + includeComments: primitiveSet(input.includeComments, inUntrustedWorkspace, [true, false, inUntrustedWorkspace]), + includeStrings: primitiveSet(input.includeStrings, inUntrustedWorkspace, [true, false, inUntrustedWorkspace]), + allowedCharacters: this.validateBooleanMap(_input.allowedCharacters, this.defaultValue.allowedCharacters), + allowedLocales: this.validateBooleanMap(_input.allowedLocales, this.defaultValue.allowedLocales) + }; + } + validateBooleanMap(map, defaultValue) { + if (typeof map !== "object" || !map) { + return defaultValue; + } + const result = {}; + for (const [key, value] of Object.entries(map)) { + if (value === true) { + result[key] = true; + } + } + return result; + } + }; + InlineEditorSuggest = class extends BaseEditorOption { + constructor() { + const defaults = { + enabled: true, + mode: "subwordSmart", + showToolbar: "onHover", + suppressSuggestions: false, + keepOnBlur: false, + fontFamily: "default" + }; + super(62, "inlineSuggest", defaults, { + "editor.inlineSuggest.enabled": { + type: "boolean", + default: defaults.enabled, + description: localize("inlineSuggest.enabled", "Controls whether to automatically show inline suggestions in the editor.") + }, + "editor.inlineSuggest.showToolbar": { + type: "string", + default: defaults.showToolbar, + enum: ["always", "onHover", "never"], + enumDescriptions: [ + localize("inlineSuggest.showToolbar.always", "Show the inline suggestion toolbar whenever an inline suggestion is shown."), + localize("inlineSuggest.showToolbar.onHover", "Show the inline suggestion toolbar when hovering over an inline suggestion."), + localize("inlineSuggest.showToolbar.never", "Never show the inline suggestion toolbar.") + ], + description: localize("inlineSuggest.showToolbar", "Controls when to show the inline suggestion toolbar.") + }, + "editor.inlineSuggest.suppressSuggestions": { + type: "boolean", + default: defaults.suppressSuggestions, + description: localize("inlineSuggest.suppressSuggestions", "Controls how inline suggestions interact with the suggest widget. If enabled, the suggest widget is not shown automatically when inline suggestions are available.") + }, + "editor.inlineSuggest.fontFamily": { + type: "string", + default: defaults.fontFamily, + description: localize("inlineSuggest.fontFamily", "Controls the font family of the inline suggestions.") + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + enabled: boolean(input.enabled, this.defaultValue.enabled), + mode: stringSet(input.mode, this.defaultValue.mode, ["prefix", "subword", "subwordSmart"]), + showToolbar: stringSet(input.showToolbar, this.defaultValue.showToolbar, ["always", "onHover", "never"]), + suppressSuggestions: boolean(input.suppressSuggestions, this.defaultValue.suppressSuggestions), + keepOnBlur: boolean(input.keepOnBlur, this.defaultValue.keepOnBlur), + fontFamily: EditorStringOption.string(input.fontFamily, this.defaultValue.fontFamily) + }; + } + }; + InlineEditorEdit = class extends BaseEditorOption { + constructor() { + const defaults = { + enabled: false, + showToolbar: "onHover", + fontFamily: "default", + keepOnBlur: false, + backgroundColoring: false + }; + super(63, "experimentalInlineEdit", defaults, { + "editor.experimentalInlineEdit.enabled": { + type: "boolean", + default: defaults.enabled, + description: localize("inlineEdit.enabled", "Controls whether to show inline edits in the editor.") + }, + "editor.experimentalInlineEdit.showToolbar": { + type: "string", + default: defaults.showToolbar, + enum: ["always", "onHover", "never"], + enumDescriptions: [ + localize("inlineEdit.showToolbar.always", "Show the inline edit toolbar whenever an inline suggestion is shown."), + localize("inlineEdit.showToolbar.onHover", "Show the inline edit toolbar when hovering over an inline suggestion."), + localize("inlineEdit.showToolbar.never", "Never show the inline edit toolbar.") + ], + description: localize("inlineEdit.showToolbar", "Controls when to show the inline edit toolbar.") + }, + "editor.experimentalInlineEdit.fontFamily": { + type: "string", + default: defaults.fontFamily, + description: localize("inlineEdit.fontFamily", "Controls the font family of the inline edit.") + }, + "editor.experimentalInlineEdit.backgroundColoring": { + type: "boolean", + default: defaults.backgroundColoring, + description: localize("inlineEdit.backgroundColoring", "Controls whether to color the background of inline edits.") + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + enabled: boolean(input.enabled, this.defaultValue.enabled), + showToolbar: stringSet(input.showToolbar, this.defaultValue.showToolbar, ["always", "onHover", "never"]), + fontFamily: EditorStringOption.string(input.fontFamily, this.defaultValue.fontFamily), + keepOnBlur: boolean(input.keepOnBlur, this.defaultValue.keepOnBlur), + backgroundColoring: boolean(input.backgroundColoring, this.defaultValue.backgroundColoring) + }; + } + }; + BracketPairColorization = class extends BaseEditorOption { + constructor() { + const defaults = { + enabled: EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions.enabled, + independentColorPoolPerBracketType: EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions.independentColorPoolPerBracketType + }; + super(15, "bracketPairColorization", defaults, { + "editor.bracketPairColorization.enabled": { + type: "boolean", + default: defaults.enabled, + markdownDescription: localize("bracketPairColorization.enabled", "Controls whether bracket pair colorization is enabled or not. Use {0} to override the bracket highlight colors.", "`#workbench.colorCustomizations#`") + }, + "editor.bracketPairColorization.independentColorPoolPerBracketType": { + type: "boolean", + default: defaults.independentColorPoolPerBracketType, + description: localize("bracketPairColorization.independentColorPoolPerBracketType", "Controls whether each bracket type has its own independent color pool.") + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + enabled: boolean(input.enabled, this.defaultValue.enabled), + independentColorPoolPerBracketType: boolean(input.independentColorPoolPerBracketType, this.defaultValue.independentColorPoolPerBracketType) + }; + } + }; + GuideOptions = class extends BaseEditorOption { + constructor() { + const defaults = { + bracketPairs: false, + bracketPairsHorizontal: "active", + highlightActiveBracketPair: true, + indentation: true, + highlightActiveIndentation: true + }; + super(16, "guides", defaults, { + "editor.guides.bracketPairs": { + type: ["boolean", "string"], + enum: [true, "active", false], + enumDescriptions: [ + localize("editor.guides.bracketPairs.true", "Enables bracket pair guides."), + localize("editor.guides.bracketPairs.active", "Enables bracket pair guides only for the active bracket pair."), + localize("editor.guides.bracketPairs.false", "Disables bracket pair guides.") + ], + default: defaults.bracketPairs, + description: localize("editor.guides.bracketPairs", "Controls whether bracket pair guides are enabled or not.") + }, + "editor.guides.bracketPairsHorizontal": { + type: ["boolean", "string"], + enum: [true, "active", false], + enumDescriptions: [ + localize("editor.guides.bracketPairsHorizontal.true", "Enables horizontal guides as addition to vertical bracket pair guides."), + localize("editor.guides.bracketPairsHorizontal.active", "Enables horizontal guides only for the active bracket pair."), + localize("editor.guides.bracketPairsHorizontal.false", "Disables horizontal bracket pair guides.") + ], + default: defaults.bracketPairsHorizontal, + description: localize("editor.guides.bracketPairsHorizontal", "Controls whether horizontal bracket pair guides are enabled or not.") + }, + "editor.guides.highlightActiveBracketPair": { + type: "boolean", + default: defaults.highlightActiveBracketPair, + description: localize("editor.guides.highlightActiveBracketPair", "Controls whether the editor should highlight the active bracket pair.") + }, + "editor.guides.indentation": { + type: "boolean", + default: defaults.indentation, + description: localize("editor.guides.indentation", "Controls whether the editor should render indent guides.") + }, + "editor.guides.highlightActiveIndentation": { + type: ["boolean", "string"], + enum: [true, "always", false], + enumDescriptions: [ + localize("editor.guides.highlightActiveIndentation.true", "Highlights the active indent guide."), + localize("editor.guides.highlightActiveIndentation.always", "Highlights the active indent guide even if bracket guides are highlighted."), + localize("editor.guides.highlightActiveIndentation.false", "Do not highlight the active indent guide.") + ], + default: defaults.highlightActiveIndentation, + description: localize("editor.guides.highlightActiveIndentation", "Controls whether the editor should highlight the active indent guide.") + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + bracketPairs: primitiveSet(input.bracketPairs, this.defaultValue.bracketPairs, [true, false, "active"]), + bracketPairsHorizontal: primitiveSet(input.bracketPairsHorizontal, this.defaultValue.bracketPairsHorizontal, [true, false, "active"]), + highlightActiveBracketPair: boolean(input.highlightActiveBracketPair, this.defaultValue.highlightActiveBracketPair), + indentation: boolean(input.indentation, this.defaultValue.indentation), + highlightActiveIndentation: primitiveSet(input.highlightActiveIndentation, this.defaultValue.highlightActiveIndentation, [true, false, "always"]) + }; + } + }; + EditorSuggest = class extends BaseEditorOption { + constructor() { + const defaults = { + insertMode: "insert", + filterGraceful: true, + snippetsPreventQuickSuggestions: false, + localityBonus: false, + shareSuggestSelections: false, + selectionMode: "always", + showIcons: true, + showStatusBar: false, + preview: false, + previewMode: "subwordSmart", + showInlineDetails: true, + showMethods: true, + showFunctions: true, + showConstructors: true, + showDeprecated: true, + matchOnWordStartOnly: true, + showFields: true, + showVariables: true, + showClasses: true, + showStructs: true, + showInterfaces: true, + showModules: true, + showProperties: true, + showEvents: true, + showOperators: true, + showUnits: true, + showValues: true, + showConstants: true, + showEnums: true, + showEnumMembers: true, + showKeywords: true, + showWords: true, + showColors: true, + showFiles: true, + showReferences: true, + showFolders: true, + showTypeParameters: true, + showSnippets: true, + showUsers: true, + showIssues: true + }; + super(118, "suggest", defaults, { + "editor.suggest.insertMode": { + type: "string", + enum: ["insert", "replace"], + enumDescriptions: [ + localize("suggest.insertMode.insert", "Insert suggestion without overwriting text right of the cursor."), + localize("suggest.insertMode.replace", "Insert suggestion and overwrite text right of the cursor.") + ], + default: defaults.insertMode, + description: localize("suggest.insertMode", "Controls whether words are overwritten when accepting completions. Note that this depends on extensions opting into this feature.") + }, + "editor.suggest.filterGraceful": { + type: "boolean", + default: defaults.filterGraceful, + description: localize("suggest.filterGraceful", "Controls whether filtering and sorting suggestions accounts for small typos.") + }, + "editor.suggest.localityBonus": { + type: "boolean", + default: defaults.localityBonus, + description: localize("suggest.localityBonus", "Controls whether sorting favors words that appear close to the cursor.") + }, + "editor.suggest.shareSuggestSelections": { + type: "boolean", + default: defaults.shareSuggestSelections, + markdownDescription: localize("suggest.shareSuggestSelections", "Controls whether remembered suggestion selections are shared between multiple workspaces and windows (needs `#editor.suggestSelection#`).") + }, + "editor.suggest.selectionMode": { + type: "string", + enum: ["always", "never", "whenTriggerCharacter", "whenQuickSuggestion"], + enumDescriptions: [ + localize("suggest.insertMode.always", "Always select a suggestion when automatically triggering IntelliSense."), + localize("suggest.insertMode.never", "Never select a suggestion when automatically triggering IntelliSense."), + localize("suggest.insertMode.whenTriggerCharacter", "Select a suggestion only when triggering IntelliSense from a trigger character."), + localize("suggest.insertMode.whenQuickSuggestion", "Select a suggestion only when triggering IntelliSense as you type.") + ], + default: defaults.selectionMode, + markdownDescription: localize("suggest.selectionMode", "Controls whether a suggestion is selected when the widget shows. Note that this only applies to automatically triggered suggestions (`#editor.quickSuggestions#` and `#editor.suggestOnTriggerCharacters#`) and that a suggestion is always selected when explicitly invoked, e.g via `Ctrl+Space`.") + }, + "editor.suggest.snippetsPreventQuickSuggestions": { + type: "boolean", + default: defaults.snippetsPreventQuickSuggestions, + description: localize("suggest.snippetsPreventQuickSuggestions", "Controls whether an active snippet prevents quick suggestions.") + }, + "editor.suggest.showIcons": { + type: "boolean", + default: defaults.showIcons, + description: localize("suggest.showIcons", "Controls whether to show or hide icons in suggestions.") + }, + "editor.suggest.showStatusBar": { + type: "boolean", + default: defaults.showStatusBar, + description: localize("suggest.showStatusBar", "Controls the visibility of the status bar at the bottom of the suggest widget.") + }, + "editor.suggest.preview": { + type: "boolean", + default: defaults.preview, + description: localize("suggest.preview", "Controls whether to preview the suggestion outcome in the editor.") + }, + "editor.suggest.showInlineDetails": { + type: "boolean", + default: defaults.showInlineDetails, + description: localize("suggest.showInlineDetails", "Controls whether suggest details show inline with the label or only in the details widget.") + }, + "editor.suggest.maxVisibleSuggestions": { + type: "number", + deprecationMessage: localize("suggest.maxVisibleSuggestions.dep", "This setting is deprecated. The suggest widget can now be resized.") + }, + "editor.suggest.filteredTypes": { + type: "object", + deprecationMessage: localize("deprecated", "This setting is deprecated, please use separate settings like 'editor.suggest.showKeywords' or 'editor.suggest.showSnippets' instead.") + }, + "editor.suggest.showMethods": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showMethods", "When enabled IntelliSense shows `method`-suggestions.") + }, + "editor.suggest.showFunctions": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showFunctions", "When enabled IntelliSense shows `function`-suggestions.") + }, + "editor.suggest.showConstructors": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showConstructors", "When enabled IntelliSense shows `constructor`-suggestions.") + }, + "editor.suggest.showDeprecated": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showDeprecated", "When enabled IntelliSense shows `deprecated`-suggestions.") + }, + "editor.suggest.matchOnWordStartOnly": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.matchOnWordStartOnly", "When enabled IntelliSense filtering requires that the first character matches on a word start. For example, `c` on `Console` or `WebContext` but _not_ on `description`. When disabled IntelliSense will show more results but still sorts them by match quality.") + }, + "editor.suggest.showFields": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showFields", "When enabled IntelliSense shows `field`-suggestions.") + }, + "editor.suggest.showVariables": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showVariables", "When enabled IntelliSense shows `variable`-suggestions.") + }, + "editor.suggest.showClasses": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showClasss", "When enabled IntelliSense shows `class`-suggestions.") + }, + "editor.suggest.showStructs": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showStructs", "When enabled IntelliSense shows `struct`-suggestions.") + }, + "editor.suggest.showInterfaces": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showInterfaces", "When enabled IntelliSense shows `interface`-suggestions.") + }, + "editor.suggest.showModules": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showModules", "When enabled IntelliSense shows `module`-suggestions.") + }, + "editor.suggest.showProperties": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showPropertys", "When enabled IntelliSense shows `property`-suggestions.") + }, + "editor.suggest.showEvents": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showEvents", "When enabled IntelliSense shows `event`-suggestions.") + }, + "editor.suggest.showOperators": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showOperators", "When enabled IntelliSense shows `operator`-suggestions.") + }, + "editor.suggest.showUnits": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showUnits", "When enabled IntelliSense shows `unit`-suggestions.") + }, + "editor.suggest.showValues": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showValues", "When enabled IntelliSense shows `value`-suggestions.") + }, + "editor.suggest.showConstants": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showConstants", "When enabled IntelliSense shows `constant`-suggestions.") + }, + "editor.suggest.showEnums": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showEnums", "When enabled IntelliSense shows `enum`-suggestions.") + }, + "editor.suggest.showEnumMembers": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showEnumMembers", "When enabled IntelliSense shows `enumMember`-suggestions.") + }, + "editor.suggest.showKeywords": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showKeywords", "When enabled IntelliSense shows `keyword`-suggestions.") + }, + "editor.suggest.showWords": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showTexts", "When enabled IntelliSense shows `text`-suggestions.") + }, + "editor.suggest.showColors": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showColors", "When enabled IntelliSense shows `color`-suggestions.") + }, + "editor.suggest.showFiles": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showFiles", "When enabled IntelliSense shows `file`-suggestions.") + }, + "editor.suggest.showReferences": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showReferences", "When enabled IntelliSense shows `reference`-suggestions.") + }, + "editor.suggest.showCustomcolors": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showCustomcolors", "When enabled IntelliSense shows `customcolor`-suggestions.") + }, + "editor.suggest.showFolders": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showFolders", "When enabled IntelliSense shows `folder`-suggestions.") + }, + "editor.suggest.showTypeParameters": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showTypeParameters", "When enabled IntelliSense shows `typeParameter`-suggestions.") + }, + "editor.suggest.showSnippets": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showSnippets", "When enabled IntelliSense shows `snippet`-suggestions.") + }, + "editor.suggest.showUsers": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showUsers", "When enabled IntelliSense shows `user`-suggestions.") + }, + "editor.suggest.showIssues": { + type: "boolean", + default: true, + markdownDescription: localize("editor.suggest.showIssues", "When enabled IntelliSense shows `issues`-suggestions.") + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + insertMode: stringSet(input.insertMode, this.defaultValue.insertMode, ["insert", "replace"]), + filterGraceful: boolean(input.filterGraceful, this.defaultValue.filterGraceful), + snippetsPreventQuickSuggestions: boolean(input.snippetsPreventQuickSuggestions, this.defaultValue.filterGraceful), + localityBonus: boolean(input.localityBonus, this.defaultValue.localityBonus), + shareSuggestSelections: boolean(input.shareSuggestSelections, this.defaultValue.shareSuggestSelections), + selectionMode: stringSet(input.selectionMode, this.defaultValue.selectionMode, ["always", "never", "whenQuickSuggestion", "whenTriggerCharacter"]), + showIcons: boolean(input.showIcons, this.defaultValue.showIcons), + showStatusBar: boolean(input.showStatusBar, this.defaultValue.showStatusBar), + preview: boolean(input.preview, this.defaultValue.preview), + previewMode: stringSet(input.previewMode, this.defaultValue.previewMode, ["prefix", "subword", "subwordSmart"]), + showInlineDetails: boolean(input.showInlineDetails, this.defaultValue.showInlineDetails), + showMethods: boolean(input.showMethods, this.defaultValue.showMethods), + showFunctions: boolean(input.showFunctions, this.defaultValue.showFunctions), + showConstructors: boolean(input.showConstructors, this.defaultValue.showConstructors), + showDeprecated: boolean(input.showDeprecated, this.defaultValue.showDeprecated), + matchOnWordStartOnly: boolean(input.matchOnWordStartOnly, this.defaultValue.matchOnWordStartOnly), + showFields: boolean(input.showFields, this.defaultValue.showFields), + showVariables: boolean(input.showVariables, this.defaultValue.showVariables), + showClasses: boolean(input.showClasses, this.defaultValue.showClasses), + showStructs: boolean(input.showStructs, this.defaultValue.showStructs), + showInterfaces: boolean(input.showInterfaces, this.defaultValue.showInterfaces), + showModules: boolean(input.showModules, this.defaultValue.showModules), + showProperties: boolean(input.showProperties, this.defaultValue.showProperties), + showEvents: boolean(input.showEvents, this.defaultValue.showEvents), + showOperators: boolean(input.showOperators, this.defaultValue.showOperators), + showUnits: boolean(input.showUnits, this.defaultValue.showUnits), + showValues: boolean(input.showValues, this.defaultValue.showValues), + showConstants: boolean(input.showConstants, this.defaultValue.showConstants), + showEnums: boolean(input.showEnums, this.defaultValue.showEnums), + showEnumMembers: boolean(input.showEnumMembers, this.defaultValue.showEnumMembers), + showKeywords: boolean(input.showKeywords, this.defaultValue.showKeywords), + showWords: boolean(input.showWords, this.defaultValue.showWords), + showColors: boolean(input.showColors, this.defaultValue.showColors), + showFiles: boolean(input.showFiles, this.defaultValue.showFiles), + showReferences: boolean(input.showReferences, this.defaultValue.showReferences), + showFolders: boolean(input.showFolders, this.defaultValue.showFolders), + showTypeParameters: boolean(input.showTypeParameters, this.defaultValue.showTypeParameters), + showSnippets: boolean(input.showSnippets, this.defaultValue.showSnippets), + showUsers: boolean(input.showUsers, this.defaultValue.showUsers), + showIssues: boolean(input.showIssues, this.defaultValue.showIssues) + }; + } + }; + SmartSelect = class extends BaseEditorOption { + constructor() { + super(113, "smartSelect", { + selectLeadingAndTrailingWhitespace: true, + selectSubwords: true + }, { + "editor.smartSelect.selectLeadingAndTrailingWhitespace": { + description: localize("selectLeadingAndTrailingWhitespace", "Whether leading and trailing whitespace should always be selected."), + default: true, + type: "boolean" + }, + "editor.smartSelect.selectSubwords": { + description: localize("selectSubwords", "Whether subwords (like 'foo' in 'fooBar' or 'foo_bar') should be selected."), + default: true, + type: "boolean" + } + }); + } + validate(input) { + if (!input || typeof input !== "object") { + return this.defaultValue; + } + return { + selectLeadingAndTrailingWhitespace: boolean(input.selectLeadingAndTrailingWhitespace, this.defaultValue.selectLeadingAndTrailingWhitespace), + selectSubwords: boolean(input.selectSubwords, this.defaultValue.selectSubwords) + }; + } + }; + WordSegmenterLocales = class extends BaseEditorOption { + constructor() { + const defaults = []; + super(130, "wordSegmenterLocales", defaults, { + anyOf: [ + { + description: localize("wordSegmenterLocales", "Locales to be used for word segmentation when doing word related navigations or operations. Specify the BCP 47 language tag of the word you wish to recognize (e.g., ja, zh-CN, zh-Hant-TW, etc.)."), + type: "string" + }, + { + description: localize("wordSegmenterLocales", "Locales to be used for word segmentation when doing word related navigations or operations. Specify the BCP 47 language tag of the word you wish to recognize (e.g., ja, zh-CN, zh-Hant-TW, etc.)."), + type: "array", + items: { + type: "string" + } + } + ] + }); + } + validate(input) { + if (typeof input === "string") { + input = [input]; + } + if (Array.isArray(input)) { + const validLocales = []; + for (const locale of input) { + if (typeof locale === "string") { + try { + if (Intl.Segmenter.supportedLocalesOf(locale).length > 0) { + validLocales.push(locale); + } + } catch (_a10) { + } + } + } + return validLocales; + } + return this.defaultValue; + } + }; + WrappingIndentOption = class extends BaseEditorOption { + constructor() { + super(138, "wrappingIndent", 1, { + "editor.wrappingIndent": { + type: "string", + enum: ["none", "same", "indent", "deepIndent"], + enumDescriptions: [ + localize("wrappingIndent.none", "No indentation. Wrapped lines begin at column 1."), + localize("wrappingIndent.same", "Wrapped lines get the same indentation as the parent."), + localize("wrappingIndent.indent", "Wrapped lines get +1 indentation toward the parent."), + localize("wrappingIndent.deepIndent", "Wrapped lines get +2 indentation toward the parent.") + ], + description: localize("wrappingIndent", "Controls the indentation of wrapped lines."), + default: "same" + } + }); + } + validate(input) { + switch (input) { + case "none": + return 0; + case "same": + return 1; + case "indent": + return 2; + case "deepIndent": + return 3; + } + return 1; + } + compute(env2, options2, value) { + const accessibilitySupport = options2.get( + 2 + /* EditorOption.accessibilitySupport */ + ); + if (accessibilitySupport === 2) { + return 0; + } + return value; + } + }; + EditorWrappingInfoComputer = class extends ComputedEditorOption { + constructor() { + super( + 146 + /* EditorOption.wrappingInfo */ + ); + } + compute(env2, options2, _) { + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + return { + isDominatedByLongLines: env2.isDominatedByLongLines, + isWordWrapMinified: layoutInfo.isWordWrapMinified, + isViewportWrapping: layoutInfo.isViewportWrapping, + wrappingColumn: layoutInfo.wrappingColumn + }; + } + }; + EditorDropIntoEditor = class extends BaseEditorOption { + constructor() { + const defaults = { enabled: true, showDropSelector: "afterDrop" }; + super(36, "dropIntoEditor", defaults, { + "editor.dropIntoEditor.enabled": { + type: "boolean", + default: defaults.enabled, + markdownDescription: localize("dropIntoEditor.enabled", "Controls whether you can drag and drop a file into a text editor by holding down the `Shift` key (instead of opening the file in an editor).") + }, + "editor.dropIntoEditor.showDropSelector": { + type: "string", + markdownDescription: localize("dropIntoEditor.showDropSelector", "Controls if a widget is shown when dropping files into the editor. This widget lets you control how the file is dropped."), + enum: [ + "afterDrop", + "never" + ], + enumDescriptions: [ + localize("dropIntoEditor.showDropSelector.afterDrop", "Show the drop selector widget after a file is dropped into the editor."), + localize("dropIntoEditor.showDropSelector.never", "Never show the drop selector widget. Instead the default drop provider is always used.") + ], + default: "afterDrop" + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + enabled: boolean(input.enabled, this.defaultValue.enabled), + showDropSelector: stringSet(input.showDropSelector, this.defaultValue.showDropSelector, ["afterDrop", "never"]) + }; + } + }; + EditorPasteAs = class extends BaseEditorOption { + constructor() { + const defaults = { enabled: true, showPasteSelector: "afterPaste" }; + super(85, "pasteAs", defaults, { + "editor.pasteAs.enabled": { + type: "boolean", + default: defaults.enabled, + markdownDescription: localize("pasteAs.enabled", "Controls whether you can paste content in different ways.") + }, + "editor.pasteAs.showPasteSelector": { + type: "string", + markdownDescription: localize("pasteAs.showPasteSelector", "Controls if a widget is shown when pasting content in to the editor. This widget lets you control how the file is pasted."), + enum: [ + "afterPaste", + "never" + ], + enumDescriptions: [ + localize("pasteAs.showPasteSelector.afterPaste", "Show the paste selector widget after content is pasted into the editor."), + localize("pasteAs.showPasteSelector.never", "Never show the paste selector widget. Instead the default pasting behavior is always used.") + ], + default: "afterPaste" + } + }); + } + validate(_input) { + if (!_input || typeof _input !== "object") { + return this.defaultValue; + } + const input = _input; + return { + enabled: boolean(input.enabled, this.defaultValue.enabled), + showPasteSelector: stringSet(input.showPasteSelector, this.defaultValue.showPasteSelector, ["afterPaste", "never"]) + }; + } + }; + DEFAULT_WINDOWS_FONT_FAMILY = "Consolas, 'Courier New', monospace"; + DEFAULT_MAC_FONT_FAMILY = "Menlo, Monaco, 'Courier New', monospace"; + DEFAULT_LINUX_FONT_FAMILY = "'Droid Sans Mono', 'monospace', monospace"; + EDITOR_FONT_DEFAULTS = { + fontFamily: isMacintosh ? DEFAULT_MAC_FONT_FAMILY : isLinux ? DEFAULT_LINUX_FONT_FAMILY : DEFAULT_WINDOWS_FONT_FAMILY, + fontWeight: "normal", + fontSize: isMacintosh ? 12 : 14, + lineHeight: 0, + letterSpacing: 0 + }; + editorOptionsRegistry = []; + EditorOptions = { + acceptSuggestionOnCommitCharacter: register(new EditorBooleanOption(0, "acceptSuggestionOnCommitCharacter", true, { markdownDescription: localize("acceptSuggestionOnCommitCharacter", "Controls whether suggestions should be accepted on commit characters. For example, in JavaScript, the semi-colon (`;`) can be a commit character that accepts a suggestion and types that character.") })), + acceptSuggestionOnEnter: register(new EditorStringEnumOption(1, "acceptSuggestionOnEnter", "on", ["on", "smart", "off"], { + markdownEnumDescriptions: [ + "", + localize("acceptSuggestionOnEnterSmart", "Only accept a suggestion with `Enter` when it makes a textual change."), + "" + ], + markdownDescription: localize("acceptSuggestionOnEnter", "Controls whether suggestions should be accepted on `Enter`, in addition to `Tab`. Helps to avoid ambiguity between inserting new lines or accepting suggestions.") + })), + accessibilitySupport: register(new EditorAccessibilitySupport()), + accessibilityPageSize: register(new EditorIntOption(3, "accessibilityPageSize", 10, 1, 1073741824, { + description: localize("accessibilityPageSize", "Controls the number of lines in the editor that can be read out by a screen reader at once. When we detect a screen reader we automatically set the default to be 500. Warning: this has a performance implication for numbers larger than the default."), + tags: ["accessibility"] + })), + ariaLabel: register(new EditorStringOption(4, "ariaLabel", localize("editorViewAccessibleLabel", "Editor content"))), + ariaRequired: register(new EditorBooleanOption(5, "ariaRequired", false, void 0)), + screenReaderAnnounceInlineSuggestion: register(new EditorBooleanOption(8, "screenReaderAnnounceInlineSuggestion", true, { + description: localize("screenReaderAnnounceInlineSuggestion", "Control whether inline suggestions are announced by a screen reader."), + tags: ["accessibility"] + })), + autoClosingBrackets: register(new EditorStringEnumOption(6, "autoClosingBrackets", "languageDefined", ["always", "languageDefined", "beforeWhitespace", "never"], { + enumDescriptions: [ + "", + localize("editor.autoClosingBrackets.languageDefined", "Use language configurations to determine when to autoclose brackets."), + localize("editor.autoClosingBrackets.beforeWhitespace", "Autoclose brackets only when the cursor is to the left of whitespace."), + "" + ], + description: localize("autoClosingBrackets", "Controls whether the editor should automatically close brackets after the user adds an opening bracket.") + })), + autoClosingComments: register(new EditorStringEnumOption(7, "autoClosingComments", "languageDefined", ["always", "languageDefined", "beforeWhitespace", "never"], { + enumDescriptions: [ + "", + localize("editor.autoClosingComments.languageDefined", "Use language configurations to determine when to autoclose comments."), + localize("editor.autoClosingComments.beforeWhitespace", "Autoclose comments only when the cursor is to the left of whitespace."), + "" + ], + description: localize("autoClosingComments", "Controls whether the editor should automatically close comments after the user adds an opening comment.") + })), + autoClosingDelete: register(new EditorStringEnumOption(9, "autoClosingDelete", "auto", ["always", "auto", "never"], { + enumDescriptions: [ + "", + localize("editor.autoClosingDelete.auto", "Remove adjacent closing quotes or brackets only if they were automatically inserted."), + "" + ], + description: localize("autoClosingDelete", "Controls whether the editor should remove adjacent closing quotes or brackets when deleting.") + })), + autoClosingOvertype: register(new EditorStringEnumOption(10, "autoClosingOvertype", "auto", ["always", "auto", "never"], { + enumDescriptions: [ + "", + localize("editor.autoClosingOvertype.auto", "Type over closing quotes or brackets only if they were automatically inserted."), + "" + ], + description: localize("autoClosingOvertype", "Controls whether the editor should type over closing quotes or brackets.") + })), + autoClosingQuotes: register(new EditorStringEnumOption(11, "autoClosingQuotes", "languageDefined", ["always", "languageDefined", "beforeWhitespace", "never"], { + enumDescriptions: [ + "", + localize("editor.autoClosingQuotes.languageDefined", "Use language configurations to determine when to autoclose quotes."), + localize("editor.autoClosingQuotes.beforeWhitespace", "Autoclose quotes only when the cursor is to the left of whitespace."), + "" + ], + description: localize("autoClosingQuotes", "Controls whether the editor should automatically close quotes after the user adds an opening quote.") + })), + autoIndent: register(new EditorEnumOption(12, "autoIndent", 4, "full", ["none", "keep", "brackets", "advanced", "full"], _autoIndentFromString, { + enumDescriptions: [ + localize("editor.autoIndent.none", "The editor will not insert indentation automatically."), + localize("editor.autoIndent.keep", "The editor will keep the current line's indentation."), + localize("editor.autoIndent.brackets", "The editor will keep the current line's indentation and honor language defined brackets."), + localize("editor.autoIndent.advanced", "The editor will keep the current line's indentation, honor language defined brackets and invoke special onEnterRules defined by languages."), + localize("editor.autoIndent.full", "The editor will keep the current line's indentation, honor language defined brackets, invoke special onEnterRules defined by languages, and honor indentationRules defined by languages.") + ], + description: localize("autoIndent", "Controls whether the editor should automatically adjust the indentation when users type, paste, move or indent lines.") + })), + automaticLayout: register(new EditorBooleanOption(13, "automaticLayout", false)), + autoSurround: register(new EditorStringEnumOption(14, "autoSurround", "languageDefined", ["languageDefined", "quotes", "brackets", "never"], { + enumDescriptions: [ + localize("editor.autoSurround.languageDefined", "Use language configurations to determine when to automatically surround selections."), + localize("editor.autoSurround.quotes", "Surround with quotes but not brackets."), + localize("editor.autoSurround.brackets", "Surround with brackets but not quotes."), + "" + ], + description: localize("autoSurround", "Controls whether the editor should automatically surround selections when typing quotes or brackets.") + })), + bracketPairColorization: register(new BracketPairColorization()), + bracketPairGuides: register(new GuideOptions()), + stickyTabStops: register(new EditorBooleanOption(116, "stickyTabStops", false, { description: localize("stickyTabStops", "Emulate selection behavior of tab characters when using spaces for indentation. Selection will stick to tab stops.") })), + codeLens: register(new EditorBooleanOption(17, "codeLens", true, { description: localize("codeLens", "Controls whether the editor shows CodeLens.") })), + codeLensFontFamily: register(new EditorStringOption(18, "codeLensFontFamily", "", { description: localize("codeLensFontFamily", "Controls the font family for CodeLens.") })), + codeLensFontSize: register(new EditorIntOption(19, "codeLensFontSize", 0, 0, 100, { + type: "number", + default: 0, + minimum: 0, + maximum: 100, + markdownDescription: localize("codeLensFontSize", "Controls the font size in pixels for CodeLens. When set to 0, 90% of `#editor.fontSize#` is used.") + })), + colorDecorators: register(new EditorBooleanOption(20, "colorDecorators", true, { description: localize("colorDecorators", "Controls whether the editor should render the inline color decorators and color picker.") })), + colorDecoratorActivatedOn: register(new EditorStringEnumOption(148, "colorDecoratorsActivatedOn", "clickAndHover", ["clickAndHover", "hover", "click"], { + enumDescriptions: [ + localize("editor.colorDecoratorActivatedOn.clickAndHover", "Make the color picker appear both on click and hover of the color decorator"), + localize("editor.colorDecoratorActivatedOn.hover", "Make the color picker appear on hover of the color decorator"), + localize("editor.colorDecoratorActivatedOn.click", "Make the color picker appear on click of the color decorator") + ], + description: localize("colorDecoratorActivatedOn", "Controls the condition to make a color picker appear from a color decorator") + })), + colorDecoratorsLimit: register(new EditorIntOption(21, "colorDecoratorsLimit", 500, 1, 1e6, { + markdownDescription: localize("colorDecoratorsLimit", "Controls the max number of color decorators that can be rendered in an editor at once.") + })), + columnSelection: register(new EditorBooleanOption(22, "columnSelection", false, { description: localize("columnSelection", "Enable that the selection with the mouse and keys is doing column selection.") })), + comments: register(new EditorComments()), + contextmenu: register(new EditorBooleanOption(24, "contextmenu", true)), + copyWithSyntaxHighlighting: register(new EditorBooleanOption(25, "copyWithSyntaxHighlighting", true, { description: localize("copyWithSyntaxHighlighting", "Controls whether syntax highlighting should be copied into the clipboard.") })), + cursorBlinking: register(new EditorEnumOption(26, "cursorBlinking", 1, "blink", ["blink", "smooth", "phase", "expand", "solid"], _cursorBlinkingStyleFromString, { description: localize("cursorBlinking", "Control the cursor animation style.") })), + cursorSmoothCaretAnimation: register(new EditorStringEnumOption(27, "cursorSmoothCaretAnimation", "off", ["off", "explicit", "on"], { + enumDescriptions: [ + localize("cursorSmoothCaretAnimation.off", "Smooth caret animation is disabled."), + localize("cursorSmoothCaretAnimation.explicit", "Smooth caret animation is enabled only when the user moves the cursor with an explicit gesture."), + localize("cursorSmoothCaretAnimation.on", "Smooth caret animation is always enabled.") + ], + description: localize("cursorSmoothCaretAnimation", "Controls whether the smooth caret animation should be enabled.") + })), + cursorStyle: register(new EditorEnumOption(28, "cursorStyle", TextEditorCursorStyle.Line, "line", ["line", "block", "underline", "line-thin", "block-outline", "underline-thin"], _cursorStyleFromString, { description: localize("cursorStyle", "Controls the cursor style.") })), + cursorSurroundingLines: register(new EditorIntOption(29, "cursorSurroundingLines", 0, 0, 1073741824, { description: localize("cursorSurroundingLines", "Controls the minimal number of visible leading lines (minimum 0) and trailing lines (minimum 1) surrounding the cursor. Known as 'scrollOff' or 'scrollOffset' in some other editors.") })), + cursorSurroundingLinesStyle: register(new EditorStringEnumOption(30, "cursorSurroundingLinesStyle", "default", ["default", "all"], { + enumDescriptions: [ + localize("cursorSurroundingLinesStyle.default", "`cursorSurroundingLines` is enforced only when triggered via the keyboard or API."), + localize("cursorSurroundingLinesStyle.all", "`cursorSurroundingLines` is enforced always.") + ], + markdownDescription: localize("cursorSurroundingLinesStyle", "Controls when `#editor.cursorSurroundingLines#` should be enforced.") + })), + cursorWidth: register(new EditorIntOption(31, "cursorWidth", 0, 0, 1073741824, { markdownDescription: localize("cursorWidth", "Controls the width of the cursor when `#editor.cursorStyle#` is set to `line`.") })), + disableLayerHinting: register(new EditorBooleanOption(32, "disableLayerHinting", false)), + disableMonospaceOptimizations: register(new EditorBooleanOption(33, "disableMonospaceOptimizations", false)), + domReadOnly: register(new EditorBooleanOption(34, "domReadOnly", false)), + dragAndDrop: register(new EditorBooleanOption(35, "dragAndDrop", true, { description: localize("dragAndDrop", "Controls whether the editor should allow moving selections via drag and drop.") })), + emptySelectionClipboard: register(new EditorEmptySelectionClipboard()), + dropIntoEditor: register(new EditorDropIntoEditor()), + stickyScroll: register(new EditorStickyScroll()), + experimentalWhitespaceRendering: register(new EditorStringEnumOption(38, "experimentalWhitespaceRendering", "svg", ["svg", "font", "off"], { + enumDescriptions: [ + localize("experimentalWhitespaceRendering.svg", "Use a new rendering method with svgs."), + localize("experimentalWhitespaceRendering.font", "Use a new rendering method with font characters."), + localize("experimentalWhitespaceRendering.off", "Use the stable rendering method.") + ], + description: localize("experimentalWhitespaceRendering", "Controls whether whitespace is rendered with a new, experimental method.") + })), + extraEditorClassName: register(new EditorStringOption(39, "extraEditorClassName", "")), + fastScrollSensitivity: register(new EditorFloatOption(40, "fastScrollSensitivity", 5, (x) => x <= 0 ? 5 : x, { markdownDescription: localize("fastScrollSensitivity", "Scrolling speed multiplier when pressing `Alt`.") })), + find: register(new EditorFind()), + fixedOverflowWidgets: register(new EditorBooleanOption(42, "fixedOverflowWidgets", false)), + folding: register(new EditorBooleanOption(43, "folding", true, { description: localize("folding", "Controls whether the editor has code folding enabled.") })), + foldingStrategy: register(new EditorStringEnumOption(44, "foldingStrategy", "auto", ["auto", "indentation"], { + enumDescriptions: [ + localize("foldingStrategy.auto", "Use a language-specific folding strategy if available, else the indentation-based one."), + localize("foldingStrategy.indentation", "Use the indentation-based folding strategy.") + ], + description: localize("foldingStrategy", "Controls the strategy for computing folding ranges.") + })), + foldingHighlight: register(new EditorBooleanOption(45, "foldingHighlight", true, { description: localize("foldingHighlight", "Controls whether the editor should highlight folded ranges.") })), + foldingImportsByDefault: register(new EditorBooleanOption(46, "foldingImportsByDefault", false, { description: localize("foldingImportsByDefault", "Controls whether the editor automatically collapses import ranges.") })), + foldingMaximumRegions: register(new EditorIntOption( + 47, + "foldingMaximumRegions", + 5e3, + 10, + 65e3, + // limit must be less than foldingRanges MAX_FOLDING_REGIONS + { description: localize("foldingMaximumRegions", "The maximum number of foldable regions. Increasing this value may result in the editor becoming less responsive when the current source has a large number of foldable regions.") } + )), + unfoldOnClickAfterEndOfLine: register(new EditorBooleanOption(48, "unfoldOnClickAfterEndOfLine", false, { description: localize("unfoldOnClickAfterEndOfLine", "Controls whether clicking on the empty content after a folded line will unfold the line.") })), + fontFamily: register(new EditorStringOption(49, "fontFamily", EDITOR_FONT_DEFAULTS.fontFamily, { description: localize("fontFamily", "Controls the font family.") })), + fontInfo: register(new EditorFontInfo()), + fontLigatures2: register(new EditorFontLigatures()), + fontSize: register(new EditorFontSize()), + fontWeight: register(new EditorFontWeight()), + fontVariations: register(new EditorFontVariations()), + formatOnPaste: register(new EditorBooleanOption(55, "formatOnPaste", false, { description: localize("formatOnPaste", "Controls whether the editor should automatically format the pasted content. A formatter must be available and the formatter should be able to format a range in a document.") })), + formatOnType: register(new EditorBooleanOption(56, "formatOnType", false, { description: localize("formatOnType", "Controls whether the editor should automatically format the line after typing.") })), + glyphMargin: register(new EditorBooleanOption(57, "glyphMargin", true, { description: localize("glyphMargin", "Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.") })), + gotoLocation: register(new EditorGoToLocation()), + hideCursorInOverviewRuler: register(new EditorBooleanOption(59, "hideCursorInOverviewRuler", false, { description: localize("hideCursorInOverviewRuler", "Controls whether the cursor should be hidden in the overview ruler.") })), + hover: register(new EditorHover()), + inDiffEditor: register(new EditorBooleanOption(61, "inDiffEditor", false)), + letterSpacing: register(new EditorFloatOption(64, "letterSpacing", EDITOR_FONT_DEFAULTS.letterSpacing, (x) => EditorFloatOption.clamp(x, -5, 20), { description: localize("letterSpacing", "Controls the letter spacing in pixels.") })), + lightbulb: register(new EditorLightbulb()), + lineDecorationsWidth: register(new EditorLineDecorationsWidth()), + lineHeight: register(new EditorLineHeight()), + lineNumbers: register(new EditorRenderLineNumbersOption()), + lineNumbersMinChars: register(new EditorIntOption(69, "lineNumbersMinChars", 5, 1, 300)), + linkedEditing: register(new EditorBooleanOption(70, "linkedEditing", false, { description: localize("linkedEditing", "Controls whether the editor has linked editing enabled. Depending on the language, related symbols such as HTML tags, are updated while editing.") })), + links: register(new EditorBooleanOption(71, "links", true, { description: localize("links", "Controls whether the editor should detect links and make them clickable.") })), + matchBrackets: register(new EditorStringEnumOption(72, "matchBrackets", "always", ["always", "near", "never"], { description: localize("matchBrackets", "Highlight matching brackets.") })), + minimap: register(new EditorMinimap()), + mouseStyle: register(new EditorStringEnumOption(74, "mouseStyle", "text", ["text", "default", "copy"])), + mouseWheelScrollSensitivity: register(new EditorFloatOption(75, "mouseWheelScrollSensitivity", 1, (x) => x === 0 ? 1 : x, { markdownDescription: localize("mouseWheelScrollSensitivity", "A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.") })), + mouseWheelZoom: register(new EditorBooleanOption(76, "mouseWheelZoom", false, { + markdownDescription: isMacintosh ? localize("mouseWheelZoom.mac", "Zoom the font of the editor when using mouse wheel and holding `Cmd`.") : localize("mouseWheelZoom", "Zoom the font of the editor when using mouse wheel and holding `Ctrl`.") + })), + multiCursorMergeOverlapping: register(new EditorBooleanOption(77, "multiCursorMergeOverlapping", true, { description: localize("multiCursorMergeOverlapping", "Merge multiple cursors when they are overlapping.") })), + multiCursorModifier: register(new EditorEnumOption(78, "multiCursorModifier", "altKey", "alt", ["ctrlCmd", "alt"], _multiCursorModifierFromString, { + markdownEnumDescriptions: [ + localize("multiCursorModifier.ctrlCmd", "Maps to `Control` on Windows and Linux and to `Command` on macOS."), + localize("multiCursorModifier.alt", "Maps to `Alt` on Windows and Linux and to `Option` on macOS.") + ], + markdownDescription: localize({ + key: "multiCursorModifier", + comment: [ + "- `ctrlCmd` refers to a value the setting can take and should not be localized.", + "- `Control` and `Command` refer to the modifier keys Ctrl or Cmd on the keyboard and can be localized." + ] + }, "The modifier to be used to add multiple cursors with the mouse. The Go to Definition and Open Link mouse gestures will adapt such that they do not conflict with the [multicursor modifier](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).") + })), + multiCursorPaste: register(new EditorStringEnumOption(79, "multiCursorPaste", "spread", ["spread", "full"], { + markdownEnumDescriptions: [ + localize("multiCursorPaste.spread", "Each cursor pastes a single line of the text."), + localize("multiCursorPaste.full", "Each cursor pastes the full text.") + ], + markdownDescription: localize("multiCursorPaste", "Controls pasting when the line count of the pasted text matches the cursor count.") + })), + multiCursorLimit: register(new EditorIntOption(80, "multiCursorLimit", 1e4, 1, 1e5, { + markdownDescription: localize("multiCursorLimit", "Controls the max number of cursors that can be in an active editor at once.") + })), + occurrencesHighlight: register(new EditorStringEnumOption(81, "occurrencesHighlight", "singleFile", ["off", "singleFile", "multiFile"], { + markdownEnumDescriptions: [ + localize("occurrencesHighlight.off", "Does not highlight occurrences."), + localize("occurrencesHighlight.singleFile", "Highlights occurrences only in the current file."), + localize("occurrencesHighlight.multiFile", "Experimental: Highlights occurrences across all valid open files.") + ], + markdownDescription: localize("occurrencesHighlight", "Controls whether occurrences should be highlighted across open files.") + })), + overviewRulerBorder: register(new EditorBooleanOption(82, "overviewRulerBorder", true, { description: localize("overviewRulerBorder", "Controls whether a border should be drawn around the overview ruler.") })), + overviewRulerLanes: register(new EditorIntOption(83, "overviewRulerLanes", 3, 0, 3)), + padding: register(new EditorPadding()), + pasteAs: register(new EditorPasteAs()), + parameterHints: register(new EditorParameterHints()), + peekWidgetDefaultFocus: register(new EditorStringEnumOption(87, "peekWidgetDefaultFocus", "tree", ["tree", "editor"], { + enumDescriptions: [ + localize("peekWidgetDefaultFocus.tree", "Focus the tree when opening peek"), + localize("peekWidgetDefaultFocus.editor", "Focus the editor when opening peek") + ], + description: localize("peekWidgetDefaultFocus", "Controls whether to focus the inline editor or the tree in the peek widget.") + })), + definitionLinkOpensInPeek: register(new EditorBooleanOption(88, "definitionLinkOpensInPeek", false, { description: localize("definitionLinkOpensInPeek", "Controls whether the Go to Definition mouse gesture always opens the peek widget.") })), + quickSuggestions: register(new EditorQuickSuggestions()), + quickSuggestionsDelay: register(new EditorIntOption(90, "quickSuggestionsDelay", 10, 0, 1073741824, { description: localize("quickSuggestionsDelay", "Controls the delay in milliseconds after which quick suggestions will show up.") })), + readOnly: register(new EditorBooleanOption(91, "readOnly", false)), + readOnlyMessage: register(new ReadonlyMessage()), + renameOnType: register(new EditorBooleanOption(93, "renameOnType", false, { description: localize("renameOnType", "Controls whether the editor auto renames on type."), markdownDeprecationMessage: localize("renameOnTypeDeprecate", "Deprecated, use `editor.linkedEditing` instead.") })), + renderControlCharacters: register(new EditorBooleanOption(94, "renderControlCharacters", true, { description: localize("renderControlCharacters", "Controls whether the editor should render control characters."), restricted: true })), + renderFinalNewline: register(new EditorStringEnumOption(95, "renderFinalNewline", isLinux ? "dimmed" : "on", ["off", "on", "dimmed"], { description: localize("renderFinalNewline", "Render last line number when the file ends with a newline.") })), + renderLineHighlight: register(new EditorStringEnumOption(96, "renderLineHighlight", "line", ["none", "gutter", "line", "all"], { + enumDescriptions: [ + "", + "", + "", + localize("renderLineHighlight.all", "Highlights both the gutter and the current line.") + ], + description: localize("renderLineHighlight", "Controls how the editor should render the current line highlight.") + })), + renderLineHighlightOnlyWhenFocus: register(new EditorBooleanOption(97, "renderLineHighlightOnlyWhenFocus", false, { description: localize("renderLineHighlightOnlyWhenFocus", "Controls if the editor should render the current line highlight only when the editor is focused.") })), + renderValidationDecorations: register(new EditorStringEnumOption(98, "renderValidationDecorations", "editable", ["editable", "on", "off"])), + renderWhitespace: register(new EditorStringEnumOption(99, "renderWhitespace", "selection", ["none", "boundary", "selection", "trailing", "all"], { + enumDescriptions: [ + "", + localize("renderWhitespace.boundary", "Render whitespace characters except for single spaces between words."), + localize("renderWhitespace.selection", "Render whitespace characters only on selected text."), + localize("renderWhitespace.trailing", "Render only trailing whitespace characters."), + "" + ], + description: localize("renderWhitespace", "Controls how the editor should render whitespace characters.") + })), + revealHorizontalRightPadding: register(new EditorIntOption(100, "revealHorizontalRightPadding", 15, 0, 1e3)), + roundedSelection: register(new EditorBooleanOption(101, "roundedSelection", true, { description: localize("roundedSelection", "Controls whether selections should have rounded corners.") })), + rulers: register(new EditorRulers()), + scrollbar: register(new EditorScrollbar()), + scrollBeyondLastColumn: register(new EditorIntOption(104, "scrollBeyondLastColumn", 4, 0, 1073741824, { description: localize("scrollBeyondLastColumn", "Controls the number of extra characters beyond which the editor will scroll horizontally.") })), + scrollBeyondLastLine: register(new EditorBooleanOption(105, "scrollBeyondLastLine", true, { description: localize("scrollBeyondLastLine", "Controls whether the editor will scroll beyond the last line.") })), + scrollPredominantAxis: register(new EditorBooleanOption(106, "scrollPredominantAxis", true, { description: localize("scrollPredominantAxis", "Scroll only along the predominant axis when scrolling both vertically and horizontally at the same time. Prevents horizontal drift when scrolling vertically on a trackpad.") })), + selectionClipboard: register(new EditorBooleanOption(107, "selectionClipboard", true, { + description: localize("selectionClipboard", "Controls whether the Linux primary clipboard should be supported."), + included: isLinux + })), + selectionHighlight: register(new EditorBooleanOption(108, "selectionHighlight", true, { description: localize("selectionHighlight", "Controls whether the editor should highlight matches similar to the selection.") })), + selectOnLineNumbers: register(new EditorBooleanOption(109, "selectOnLineNumbers", true)), + showFoldingControls: register(new EditorStringEnumOption(110, "showFoldingControls", "mouseover", ["always", "never", "mouseover"], { + enumDescriptions: [ + localize("showFoldingControls.always", "Always show the folding controls."), + localize("showFoldingControls.never", "Never show the folding controls and reduce the gutter size."), + localize("showFoldingControls.mouseover", "Only show the folding controls when the mouse is over the gutter.") + ], + description: localize("showFoldingControls", "Controls when the folding controls on the gutter are shown.") + })), + showUnused: register(new EditorBooleanOption(111, "showUnused", true, { description: localize("showUnused", "Controls fading out of unused code.") })), + showDeprecated: register(new EditorBooleanOption(140, "showDeprecated", true, { description: localize("showDeprecated", "Controls strikethrough deprecated variables.") })), + inlayHints: register(new EditorInlayHints()), + snippetSuggestions: register(new EditorStringEnumOption(112, "snippetSuggestions", "inline", ["top", "bottom", "inline", "none"], { + enumDescriptions: [ + localize("snippetSuggestions.top", "Show snippet suggestions on top of other suggestions."), + localize("snippetSuggestions.bottom", "Show snippet suggestions below other suggestions."), + localize("snippetSuggestions.inline", "Show snippets suggestions with other suggestions."), + localize("snippetSuggestions.none", "Do not show snippet suggestions.") + ], + description: localize("snippetSuggestions", "Controls whether snippets are shown with other suggestions and how they are sorted.") + })), + smartSelect: register(new SmartSelect()), + smoothScrolling: register(new EditorBooleanOption(114, "smoothScrolling", false, { description: localize("smoothScrolling", "Controls whether the editor will scroll using an animation.") })), + stopRenderingLineAfter: register(new EditorIntOption( + 117, + "stopRenderingLineAfter", + 1e4, + -1, + 1073741824 + /* Constants.MAX_SAFE_SMALL_INTEGER */ + )), + suggest: register(new EditorSuggest()), + inlineSuggest: register(new InlineEditorSuggest()), + inlineEdit: register(new InlineEditorEdit()), + inlineCompletionsAccessibilityVerbose: register(new EditorBooleanOption(149, "inlineCompletionsAccessibilityVerbose", false, { description: localize("inlineCompletionsAccessibilityVerbose", "Controls whether the accessibility hint should be provided to screen reader users when an inline completion is shown.") })), + suggestFontSize: register(new EditorIntOption(119, "suggestFontSize", 0, 0, 1e3, { markdownDescription: localize("suggestFontSize", "Font size for the suggest widget. When set to {0}, the value of {1} is used.", "`0`", "`#editor.fontSize#`") })), + suggestLineHeight: register(new EditorIntOption(120, "suggestLineHeight", 0, 0, 1e3, { markdownDescription: localize("suggestLineHeight", "Line height for the suggest widget. When set to {0}, the value of {1} is used. The minimum value is 8.", "`0`", "`#editor.lineHeight#`") })), + suggestOnTriggerCharacters: register(new EditorBooleanOption(121, "suggestOnTriggerCharacters", true, { description: localize("suggestOnTriggerCharacters", "Controls whether suggestions should automatically show up when typing trigger characters.") })), + suggestSelection: register(new EditorStringEnumOption(122, "suggestSelection", "first", ["first", "recentlyUsed", "recentlyUsedByPrefix"], { + markdownEnumDescriptions: [ + localize("suggestSelection.first", "Always select the first suggestion."), + localize("suggestSelection.recentlyUsed", "Select recent suggestions unless further typing selects one, e.g. `console.| -> console.log` because `log` has been completed recently."), + localize("suggestSelection.recentlyUsedByPrefix", "Select suggestions based on previous prefixes that have completed those suggestions, e.g. `co -> console` and `con -> const`.") + ], + description: localize("suggestSelection", "Controls how suggestions are pre-selected when showing the suggest list.") + })), + tabCompletion: register(new EditorStringEnumOption(123, "tabCompletion", "off", ["on", "off", "onlySnippets"], { + enumDescriptions: [ + localize("tabCompletion.on", "Tab complete will insert the best matching suggestion when pressing tab."), + localize("tabCompletion.off", "Disable tab completions."), + localize("tabCompletion.onlySnippets", "Tab complete snippets when their prefix match. Works best when 'quickSuggestions' aren't enabled.") + ], + description: localize("tabCompletion", "Enables tab completions.") + })), + tabIndex: register(new EditorIntOption( + 124, + "tabIndex", + 0, + -1, + 1073741824 + /* Constants.MAX_SAFE_SMALL_INTEGER */ + )), + unicodeHighlight: register(new UnicodeHighlight()), + unusualLineTerminators: register(new EditorStringEnumOption(126, "unusualLineTerminators", "prompt", ["auto", "off", "prompt"], { + enumDescriptions: [ + localize("unusualLineTerminators.auto", "Unusual line terminators are automatically removed."), + localize("unusualLineTerminators.off", "Unusual line terminators are ignored."), + localize("unusualLineTerminators.prompt", "Unusual line terminators prompt to be removed.") + ], + description: localize("unusualLineTerminators", "Remove unusual line terminators that might cause problems.") + })), + useShadowDOM: register(new EditorBooleanOption(127, "useShadowDOM", true)), + useTabStops: register(new EditorBooleanOption(128, "useTabStops", true, { description: localize("useTabStops", "Spaces and tabs are inserted and deleted in alignment with tab stops.") })), + wordBreak: register(new EditorStringEnumOption(129, "wordBreak", "normal", ["normal", "keepAll"], { + markdownEnumDescriptions: [ + localize("wordBreak.normal", "Use the default line break rule."), + localize("wordBreak.keepAll", "Word breaks should not be used for Chinese/Japanese/Korean (CJK) text. Non-CJK text behavior is the same as for normal.") + ], + description: localize("wordBreak", "Controls the word break rules used for Chinese/Japanese/Korean (CJK) text.") + })), + wordSegmenterLocales: register(new WordSegmenterLocales()), + wordSeparators: register(new EditorStringOption(131, "wordSeparators", USUAL_WORD_SEPARATORS, { description: localize("wordSeparators", "Characters that will be used as word separators when doing word related navigations or operations.") })), + wordWrap: register(new EditorStringEnumOption(132, "wordWrap", "off", ["off", "on", "wordWrapColumn", "bounded"], { + markdownEnumDescriptions: [ + localize("wordWrap.off", "Lines will never wrap."), + localize("wordWrap.on", "Lines will wrap at the viewport width."), + localize({ + key: "wordWrap.wordWrapColumn", + comment: [ + "- `editor.wordWrapColumn` refers to a different setting and should not be localized." + ] + }, "Lines will wrap at `#editor.wordWrapColumn#`."), + localize({ + key: "wordWrap.bounded", + comment: [ + "- viewport means the edge of the visible window size.", + "- `editor.wordWrapColumn` refers to a different setting and should not be localized." + ] + }, "Lines will wrap at the minimum of viewport and `#editor.wordWrapColumn#`.") + ], + description: localize({ + key: "wordWrap", + comment: [ + "- 'off', 'on', 'wordWrapColumn' and 'bounded' refer to values the setting can take and should not be localized.", + "- `editor.wordWrapColumn` refers to a different setting and should not be localized." + ] + }, "Controls how lines should wrap.") + })), + wordWrapBreakAfterCharacters: register(new EditorStringOption( + 133, + "wordWrapBreakAfterCharacters", + // allow-any-unicode-next-line + " })]?|/&.,;\xA2\xB0\u2032\u2033\u2030\u2103\u3001\u3002\uFF61\uFF64\uFFE0\uFF0C\uFF0E\uFF1A\uFF1B\uFF1F\uFF01\uFF05\u30FB\uFF65\u309D\u309E\u30FD\u30FE\u30FC\u30A1\u30A3\u30A5\u30A7\u30A9\u30C3\u30E3\u30E5\u30E7\u30EE\u30F5\u30F6\u3041\u3043\u3045\u3047\u3049\u3063\u3083\u3085\u3087\u308E\u3095\u3096\u31F0\u31F1\u31F2\u31F3\u31F4\u31F5\u31F6\u31F7\u31F8\u31F9\u31FA\u31FB\u31FC\u31FD\u31FE\u31FF\u3005\u303B\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C\uFF6D\uFF6E\uFF6F\uFF70\u201D\u3009\u300B\u300D\u300F\u3011\u3015\uFF09\uFF3D\uFF5D\uFF63" + )), + wordWrapBreakBeforeCharacters: register(new EditorStringOption( + 134, + "wordWrapBreakBeforeCharacters", + // allow-any-unicode-next-line + "([{\u2018\u201C\u3008\u300A\u300C\u300E\u3010\u3014\uFF08\uFF3B\uFF5B\uFF62\xA3\xA5\uFF04\uFFE1\uFFE5+\uFF0B" + )), + wordWrapColumn: register(new EditorIntOption(135, "wordWrapColumn", 80, 1, 1073741824, { + markdownDescription: localize({ + key: "wordWrapColumn", + comment: [ + "- `editor.wordWrap` refers to a different setting and should not be localized.", + "- 'wordWrapColumn' and 'bounded' refer to values the different setting can take and should not be localized." + ] + }, "Controls the wrapping column of the editor when `#editor.wordWrap#` is `wordWrapColumn` or `bounded`.") + })), + wordWrapOverride1: register(new EditorStringEnumOption(136, "wordWrapOverride1", "inherit", ["off", "on", "inherit"])), + wordWrapOverride2: register(new EditorStringEnumOption(137, "wordWrapOverride2", "inherit", ["off", "on", "inherit"])), + // Leave these at the end (because they have dependencies!) + editorClassName: register(new EditorClassName()), + defaultColorDecorators: register(new EditorBooleanOption(147, "defaultColorDecorators", false, { markdownDescription: localize("defaultColorDecorators", "Controls whether inline color decorations should be shown using the default document color provider") })), + pixelRatio: register(new EditorPixelRatio()), + tabFocusMode: register(new EditorBooleanOption(144, "tabFocusMode", false, { markdownDescription: localize("tabFocusMode", "Controls whether the editor receives tabs or defers them to the workbench for navigation.") })), + layoutInfo: register(new EditorLayoutInfoComputer()), + wrappingInfo: register(new EditorWrappingInfoComputer()), + wrappingIndent: register(new WrappingIndentOption()), + wrappingStrategy: register(new WrappingStrategy()) + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/errors.js +function onUnexpectedError(e) { + if (!isCancellationError(e)) { + errorHandler.onUnexpectedError(e); + } + return void 0; +} +function onUnexpectedExternalError(e) { + if (!isCancellationError(e)) { + errorHandler.onUnexpectedExternalError(e); + } + return void 0; +} +function transformErrorForSerialization(error) { + if (error instanceof Error) { + const { name, message } = error; + const stack = error.stacktrace || error.stack; + return { + $isError: true, + name, + message, + stack, + noTelemetry: ErrorNoTelemetry.isErrorNoTelemetry(error) + }; + } + return error; +} +function isCancellationError(error) { + if (error instanceof CancellationError) { + return true; + } + return error instanceof Error && error.name === canceledName && error.message === canceledName; +} +function canceled() { + const error = new Error(canceledName); + error.name = error.message; + return error; +} +function illegalArgument(name) { + if (name) { + return new Error(`Illegal argument: ${name}`); + } else { + return new Error("Illegal argument"); + } +} +function illegalState(name) { + if (name) { + return new Error(`Illegal state: ${name}`); + } else { + return new Error("Illegal state"); + } +} +var ErrorHandler, errorHandler, canceledName, CancellationError, NotSupportedError, ErrorNoTelemetry, BugIndicatingError; +var init_errors = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/errors.js"() { + ErrorHandler = class { + constructor() { + this.listeners = []; + this.unexpectedErrorHandler = function(e) { + setTimeout(() => { + if (e.stack) { + if (ErrorNoTelemetry.isErrorNoTelemetry(e)) { + throw new ErrorNoTelemetry(e.message + "\n\n" + e.stack); + } + throw new Error(e.message + "\n\n" + e.stack); + } + throw e; + }, 0); + }; + } + emit(e) { + this.listeners.forEach((listener) => { + listener(e); + }); + } + onUnexpectedError(e) { + this.unexpectedErrorHandler(e); + this.emit(e); + } + // For external errors, we don't want the listeners to be called + onUnexpectedExternalError(e) { + this.unexpectedErrorHandler(e); + } + }; + errorHandler = new ErrorHandler(); + canceledName = "Canceled"; + CancellationError = class extends Error { + constructor() { + super(canceledName); + this.name = this.message; + } + }; + NotSupportedError = class extends Error { + constructor(message) { + super("NotSupported"); + if (message) { + this.message = message; + } + } + }; + ErrorNoTelemetry = class _ErrorNoTelemetry extends Error { + constructor(msg) { + super(msg); + this.name = "CodeExpectedError"; + } + static fromError(err) { + if (err instanceof _ErrorNoTelemetry) { + return err; + } + const result = new _ErrorNoTelemetry(); + result.message = err.message; + result.stack = err.stack; + return result; + } + static isErrorNoTelemetry(err) { + return err.name === "CodeExpectedError"; + } + }; + BugIndicatingError = class _BugIndicatingError extends Error { + constructor(message) { + super(message || "An unexpected bug occurred."); + Object.setPrototypeOf(this, _BugIndicatingError.prototype); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/functional.js +function createSingleCallFunction(fn, fnDidRunCallback) { + const _this = this; + let didCall = false; + let result; + return function() { + if (didCall) { + return result; + } + didCall = true; + if (fnDidRunCallback) { + try { + result = fn.apply(_this, arguments); + } finally { + fnDidRunCallback(); + } + } else { + result = fn.apply(_this, arguments); + } + return result; + }; +} +var init_functional = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/functional.js"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/lifecycle.js +function setDisposableTracker(tracker) { + disposableTracker = tracker; +} +function trackDisposable(x) { + disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.trackDisposable(x); + return x; +} +function markAsDisposed(disposable) { + disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.markAsDisposed(disposable); +} +function setParentOfDisposable(child, parent) { + disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.setParent(child, parent); +} +function setParentOfDisposables(children, parent) { + if (!disposableTracker) { + return; + } + for (const child of children) { + disposableTracker.setParent(child, parent); + } +} +function markAsSingleton(singleton) { + disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.markAsSingleton(singleton); + return singleton; +} +function isDisposable(thing) { + return typeof thing === "object" && thing !== null && typeof thing.dispose === "function" && thing.dispose.length === 0; +} +function dispose(arg) { + if (Iterable.is(arg)) { + const errors = []; + for (const d of arg) { + if (d) { + try { + d.dispose(); + } catch (e) { + errors.push(e); + } + } + } + if (errors.length === 1) { + throw errors[0]; + } else if (errors.length > 1) { + throw new AggregateError(errors, "Encountered errors while disposing of store"); + } + return Array.isArray(arg) ? [] : arg; + } else if (arg) { + arg.dispose(); + return arg; + } +} +function combinedDisposable(...disposables) { + const parent = toDisposable(() => dispose(disposables)); + setParentOfDisposables(disposables, parent); + return parent; +} +function toDisposable(fn) { + const self2 = trackDisposable({ + dispose: createSingleCallFunction(() => { + markAsDisposed(self2); + fn(); + }) + }); + return self2; +} +var TRACK_DISPOSABLES, disposableTracker, DisposableStore, Disposable, MutableDisposable, RefCountedDisposable, ImmortalReference, DisposableMap; +var init_lifecycle = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/lifecycle.js"() { + init_functional(); + init_iterator(); + TRACK_DISPOSABLES = false; + disposableTracker = null; + if (TRACK_DISPOSABLES) { + const __is_disposable_tracked__ = "__is_disposable_tracked__"; + setDisposableTracker(new class { + trackDisposable(x) { + const stack = new Error("Potentially leaked disposable").stack; + setTimeout(() => { + if (!x[__is_disposable_tracked__]) { + console.log(stack); + } + }, 3e3); + } + setParent(child, parent) { + if (child && child !== Disposable.None) { + try { + child[__is_disposable_tracked__] = true; + } catch (_a10) { + } + } + } + markAsDisposed(disposable) { + if (disposable && disposable !== Disposable.None) { + try { + disposable[__is_disposable_tracked__] = true; + } catch (_a10) { + } + } + } + markAsSingleton(disposable) { + } + }()); + } + DisposableStore = class _DisposableStore { + constructor() { + this._toDispose = /* @__PURE__ */ new Set(); + this._isDisposed = false; + trackDisposable(this); + } + /** + * Dispose of all registered disposables and mark this object as disposed. + * + * Any future disposables added to this object will be disposed of on `add`. + */ + dispose() { + if (this._isDisposed) { + return; + } + markAsDisposed(this); + this._isDisposed = true; + this.clear(); + } + /** + * @return `true` if this object has been disposed of. + */ + get isDisposed() { + return this._isDisposed; + } + /** + * Dispose of all registered disposables but do not mark this object as disposed. + */ + clear() { + if (this._toDispose.size === 0) { + return; + } + try { + dispose(this._toDispose); + } finally { + this._toDispose.clear(); + } + } + /** + * Add a new {@link IDisposable disposable} to the collection. + */ + add(o) { + if (!o) { + return o; + } + if (o === this) { + throw new Error("Cannot register a disposable on itself!"); + } + setParentOfDisposable(o, this); + if (this._isDisposed) { + if (!_DisposableStore.DISABLE_DISPOSED_WARNING) { + console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack); + } + } else { + this._toDispose.add(o); + } + return o; + } + /** + * Deletes the value from the store, but does not dispose it. + */ + deleteAndLeak(o) { + if (!o) { + return; + } + if (this._toDispose.has(o)) { + this._toDispose.delete(o); + setParentOfDisposable(o, null); + } + } + }; + DisposableStore.DISABLE_DISPOSED_WARNING = false; + Disposable = class { + constructor() { + this._store = new DisposableStore(); + trackDisposable(this); + setParentOfDisposable(this._store, this); + } + dispose() { + markAsDisposed(this); + this._store.dispose(); + } + /** + * Adds `o` to the collection of disposables managed by this object. + */ + _register(o) { + if (o === this) { + throw new Error("Cannot register a disposable on itself!"); + } + return this._store.add(o); + } + }; + Disposable.None = Object.freeze({ dispose() { + } }); + MutableDisposable = class { + constructor() { + this._isDisposed = false; + trackDisposable(this); + } + get value() { + return this._isDisposed ? void 0 : this._value; + } + set value(value) { + var _a10; + if (this._isDisposed || value === this._value) { + return; + } + (_a10 = this._value) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + if (value) { + setParentOfDisposable(value, this); + } + this._value = value; + } + /** + * Resets the stored value and disposed of the previously stored value. + */ + clear() { + this.value = void 0; + } + dispose() { + var _a10; + this._isDisposed = true; + markAsDisposed(this); + (_a10 = this._value) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + this._value = void 0; + } + }; + RefCountedDisposable = class { + constructor(_disposable) { + this._disposable = _disposable; + this._counter = 1; + } + acquire() { + this._counter++; + return this; + } + release() { + if (--this._counter === 0) { + this._disposable.dispose(); + } + return this; + } + }; + ImmortalReference = class { + constructor(object) { + this.object = object; + } + dispose() { + } + }; + DisposableMap = class { + constructor() { + this._store = /* @__PURE__ */ new Map(); + this._isDisposed = false; + trackDisposable(this); + } + /** + * Disposes of all stored values and mark this object as disposed. + * + * Trying to use this object after it has been disposed of is an error. + */ + dispose() { + markAsDisposed(this); + this._isDisposed = true; + this.clearAndDisposeAll(); + } + /** + * Disposes of all stored values and clear the map, but DO NOT mark this object as disposed. + */ + clearAndDisposeAll() { + if (!this._store.size) { + return; + } + try { + dispose(this._store.values()); + } finally { + this._store.clear(); + } + } + get(key) { + return this._store.get(key); + } + set(key, value, skipDisposeOnOverwrite = false) { + var _a10; + if (this._isDisposed) { + console.warn(new Error("Trying to add a disposable to a DisposableMap that has already been disposed of. The added object will be leaked!").stack); + } + if (!skipDisposeOnOverwrite) { + (_a10 = this._store.get(key)) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + } + this._store.set(key, value); + } + /** + * Delete the value stored for `key` from this map and also dispose of it. + */ + deleteAndDispose(key) { + var _a10; + (_a10 = this._store.get(key)) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + this._store.delete(key); + } + [Symbol.iterator]() { + return this._store[Symbol.iterator](); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/stopwatch.js +var hasPerformanceNow, StopWatch; +var init_stopwatch = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/stopwatch.js"() { + hasPerformanceNow = globalThis.performance && typeof globalThis.performance.now === "function"; + StopWatch = class _StopWatch { + static create(highResolution) { + return new _StopWatch(highResolution); + } + constructor(highResolution) { + this._now = hasPerformanceNow && highResolution === false ? Date.now : globalThis.performance.now.bind(globalThis.performance); + this._startTime = this._now(); + this._stopTime = -1; + } + stop() { + this._stopTime = this._now(); + } + reset() { + this._startTime = this._now(); + this._stopTime = -1; + } + elapsed() { + if (this._stopTime !== -1) { + return this._stopTime - this._startTime; + } + return this._now() - this._startTime; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/event.js +var _enableListenerGCedWarning, _enableDisposeWithListenerWarning, _enableSnapshotPotentialLeakWarning, Event, EventProfiling, _globalLeakWarningThreshold, LeakageMonitor, Stacktrace, ListenerLeakError, ListenerRefusalError, UniqueContainer, compactionThreshold, forEachListener, _listenerFinalizers, Emitter, createEventDeliveryQueue, EventDeliveryQueuePrivate, PauseableEmitter, DebounceEmitter, MicrotaskEmitter, EventMultiplexer, EventBufferer, Relay; +var init_event = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/event.js"() { + init_errors(); + init_functional(); + init_lifecycle(); + init_linkedList(); + init_stopwatch(); + _enableListenerGCedWarning = false; + _enableDisposeWithListenerWarning = false; + _enableSnapshotPotentialLeakWarning = false; + (function(Event2) { + Event2.None = () => Disposable.None; + function _addLeakageTraceLogic(options2) { + if (_enableSnapshotPotentialLeakWarning) { + const { onDidAddListener: origListenerDidAdd } = options2; + const stack = Stacktrace.create(); + let count = 0; + options2.onDidAddListener = () => { + if (++count === 2) { + console.warn("snapshotted emitter LIKELY used public and SHOULD HAVE BEEN created with DisposableStore. snapshotted here"); + stack.print(); + } + origListenerDidAdd === null || origListenerDidAdd === void 0 ? void 0 : origListenerDidAdd(); + }; + } + } + function defer(event, disposable) { + return debounce(event, () => void 0, 0, void 0, true, void 0, disposable); + } + Event2.defer = defer; + function once(event) { + return (listener, thisArgs = null, disposables) => { + let didFire = false; + let result = void 0; + result = event((e) => { + if (didFire) { + return; + } else if (result) { + result.dispose(); + } else { + didFire = true; + } + return listener.call(thisArgs, e); + }, null, disposables); + if (didFire) { + result.dispose(); + } + return result; + }; + } + Event2.once = once; + function map(event, map2, disposable) { + return snapshot((listener, thisArgs = null, disposables) => event((i) => listener.call(thisArgs, map2(i)), null, disposables), disposable); + } + Event2.map = map; + function forEach(event, each, disposable) { + return snapshot((listener, thisArgs = null, disposables) => event((i) => { + each(i); + listener.call(thisArgs, i); + }, null, disposables), disposable); + } + Event2.forEach = forEach; + function filter(event, filter2, disposable) { + return snapshot((listener, thisArgs = null, disposables) => event((e) => filter2(e) && listener.call(thisArgs, e), null, disposables), disposable); + } + Event2.filter = filter; + function signal(event) { + return event; + } + Event2.signal = signal; + function any(...events) { + return (listener, thisArgs = null, disposables) => { + const disposable = combinedDisposable(...events.map((event) => event((e) => listener.call(thisArgs, e)))); + return addAndReturnDisposable(disposable, disposables); + }; + } + Event2.any = any; + function reduce(event, merge, initial, disposable) { + let output = initial; + return map(event, (e) => { + output = merge(output, e); + return output; + }, disposable); + } + Event2.reduce = reduce; + function snapshot(event, disposable) { + let listener; + const options2 = { + onWillAddFirstListener() { + listener = event(emitter.fire, emitter); + }, + onDidRemoveLastListener() { + listener === null || listener === void 0 ? void 0 : listener.dispose(); + } + }; + if (!disposable) { + _addLeakageTraceLogic(options2); + } + const emitter = new Emitter(options2); + disposable === null || disposable === void 0 ? void 0 : disposable.add(emitter); + return emitter.event; + } + function addAndReturnDisposable(d, store) { + if (store instanceof Array) { + store.push(d); + } else if (store) { + store.add(d); + } + return d; + } + function debounce(event, merge, delay = 100, leading = false, flushOnListenerRemove = false, leakWarningThreshold, disposable) { + let subscription; + let output = void 0; + let handle = void 0; + let numDebouncedCalls = 0; + let doFire; + const options2 = { + leakWarningThreshold, + onWillAddFirstListener() { + subscription = event((cur) => { + numDebouncedCalls++; + output = merge(output, cur); + if (leading && !handle) { + emitter.fire(output); + output = void 0; + } + doFire = () => { + const _output = output; + output = void 0; + handle = void 0; + if (!leading || numDebouncedCalls > 1) { + emitter.fire(_output); + } + numDebouncedCalls = 0; + }; + if (typeof delay === "number") { + clearTimeout(handle); + handle = setTimeout(doFire, delay); + } else { + if (handle === void 0) { + handle = 0; + queueMicrotask(doFire); + } + } + }); + }, + onWillRemoveListener() { + if (flushOnListenerRemove && numDebouncedCalls > 0) { + doFire === null || doFire === void 0 ? void 0 : doFire(); + } + }, + onDidRemoveLastListener() { + doFire = void 0; + subscription.dispose(); + } + }; + if (!disposable) { + _addLeakageTraceLogic(options2); + } + const emitter = new Emitter(options2); + disposable === null || disposable === void 0 ? void 0 : disposable.add(emitter); + return emitter.event; + } + Event2.debounce = debounce; + function accumulate(event, delay = 0, disposable) { + return Event2.debounce(event, (last, e) => { + if (!last) { + return [e]; + } + last.push(e); + return last; + }, delay, void 0, true, void 0, disposable); + } + Event2.accumulate = accumulate; + function latch(event, equals4 = (a3, b) => a3 === b, disposable) { + let firstCall = true; + let cache; + return filter(event, (value) => { + const shouldEmit = firstCall || !equals4(value, cache); + firstCall = false; + cache = value; + return shouldEmit; + }, disposable); + } + Event2.latch = latch; + function split(event, isT, disposable) { + return [ + Event2.filter(event, isT, disposable), + Event2.filter(event, (e) => !isT(e), disposable) + ]; + } + Event2.split = split; + function buffer(event, flushAfterTimeout = false, _buffer = [], disposable) { + let buffer2 = _buffer.slice(); + let listener = event((e) => { + if (buffer2) { + buffer2.push(e); + } else { + emitter.fire(e); + } + }); + if (disposable) { + disposable.add(listener); + } + const flush = () => { + buffer2 === null || buffer2 === void 0 ? void 0 : buffer2.forEach((e) => emitter.fire(e)); + buffer2 = null; + }; + const emitter = new Emitter({ + onWillAddFirstListener() { + if (!listener) { + listener = event((e) => emitter.fire(e)); + if (disposable) { + disposable.add(listener); + } + } + }, + onDidAddFirstListener() { + if (buffer2) { + if (flushAfterTimeout) { + setTimeout(flush); + } else { + flush(); + } + } + }, + onDidRemoveLastListener() { + if (listener) { + listener.dispose(); + } + listener = null; + } + }); + if (disposable) { + disposable.add(emitter); + } + return emitter.event; + } + Event2.buffer = buffer; + function chain(event, sythensize) { + const fn = (listener, thisArgs, disposables) => { + const cs = sythensize(new ChainableSynthesis()); + return event(function(value) { + const result = cs.evaluate(value); + if (result !== HaltChainable) { + listener.call(thisArgs, result); + } + }, void 0, disposables); + }; + return fn; + } + Event2.chain = chain; + const HaltChainable = Symbol("HaltChainable"); + class ChainableSynthesis { + constructor() { + this.steps = []; + } + map(fn) { + this.steps.push(fn); + return this; + } + forEach(fn) { + this.steps.push((v) => { + fn(v); + return v; + }); + return this; + } + filter(fn) { + this.steps.push((v) => fn(v) ? v : HaltChainable); + return this; + } + reduce(merge, initial) { + let last = initial; + this.steps.push((v) => { + last = merge(last, v); + return last; + }); + return this; + } + latch(equals4 = (a3, b) => a3 === b) { + let firstCall = true; + let cache; + this.steps.push((value) => { + const shouldEmit = firstCall || !equals4(value, cache); + firstCall = false; + cache = value; + return shouldEmit ? value : HaltChainable; + }); + return this; + } + evaluate(value) { + for (const step of this.steps) { + value = step(value); + if (value === HaltChainable) { + break; + } + } + return value; + } + } + function fromNodeEventEmitter(emitter, eventName, map2 = (id) => id) { + const fn = (...args) => result.fire(map2(...args)); + const onFirstListenerAdd = () => emitter.on(eventName, fn); + const onLastListenerRemove = () => emitter.removeListener(eventName, fn); + const result = new Emitter({ onWillAddFirstListener: onFirstListenerAdd, onDidRemoveLastListener: onLastListenerRemove }); + return result.event; + } + Event2.fromNodeEventEmitter = fromNodeEventEmitter; + function fromDOMEventEmitter(emitter, eventName, map2 = (id) => id) { + const fn = (...args) => result.fire(map2(...args)); + const onFirstListenerAdd = () => emitter.addEventListener(eventName, fn); + const onLastListenerRemove = () => emitter.removeEventListener(eventName, fn); + const result = new Emitter({ onWillAddFirstListener: onFirstListenerAdd, onDidRemoveLastListener: onLastListenerRemove }); + return result.event; + } + Event2.fromDOMEventEmitter = fromDOMEventEmitter; + function toPromise(event) { + return new Promise((resolve2) => once(event)(resolve2)); + } + Event2.toPromise = toPromise; + function fromPromise(promise) { + const result = new Emitter(); + promise.then((res) => { + result.fire(res); + }, () => { + result.fire(void 0); + }).finally(() => { + result.dispose(); + }); + return result.event; + } + Event2.fromPromise = fromPromise; + function runAndSubscribe(event, handler, initial) { + handler(initial); + return event((e) => handler(e)); + } + Event2.runAndSubscribe = runAndSubscribe; + class EmitterObserver { + constructor(_observable, store) { + this._observable = _observable; + this._counter = 0; + this._hasChanged = false; + const options2 = { + onWillAddFirstListener: () => { + _observable.addObserver(this); + }, + onDidRemoveLastListener: () => { + _observable.removeObserver(this); + } + }; + if (!store) { + _addLeakageTraceLogic(options2); + } + this.emitter = new Emitter(options2); + if (store) { + store.add(this.emitter); + } + } + beginUpdate(_observable) { + this._counter++; + } + handlePossibleChange(_observable) { + } + handleChange(_observable, _change) { + this._hasChanged = true; + } + endUpdate(_observable) { + this._counter--; + if (this._counter === 0) { + this._observable.reportChanges(); + if (this._hasChanged) { + this._hasChanged = false; + this.emitter.fire(this._observable.get()); + } + } + } + } + function fromObservable(obs, store) { + const observer = new EmitterObserver(obs, store); + return observer.emitter.event; + } + Event2.fromObservable = fromObservable; + function fromObservableLight(observable) { + return (listener, thisArgs, disposables) => { + let count = 0; + let didChange = false; + const observer = { + beginUpdate() { + count++; + }, + endUpdate() { + count--; + if (count === 0) { + observable.reportChanges(); + if (didChange) { + didChange = false; + listener.call(thisArgs); + } + } + }, + handlePossibleChange() { + }, + handleChange() { + didChange = true; + } + }; + observable.addObserver(observer); + observable.reportChanges(); + const disposable = { + dispose() { + observable.removeObserver(observer); + } + }; + if (disposables instanceof DisposableStore) { + disposables.add(disposable); + } else if (Array.isArray(disposables)) { + disposables.push(disposable); + } + return disposable; + }; + } + Event2.fromObservableLight = fromObservableLight; + })(Event || (Event = {})); + EventProfiling = class _EventProfiling { + constructor(name) { + this.listenerCount = 0; + this.invocationCount = 0; + this.elapsedOverall = 0; + this.durations = []; + this.name = `${name}_${_EventProfiling._idPool++}`; + _EventProfiling.all.add(this); + } + start(listenerCount) { + this._stopWatch = new StopWatch(); + this.listenerCount = listenerCount; + } + stop() { + if (this._stopWatch) { + const elapsed = this._stopWatch.elapsed(); + this.durations.push(elapsed); + this.elapsedOverall += elapsed; + this.invocationCount += 1; + this._stopWatch = void 0; + } + } + }; + EventProfiling.all = /* @__PURE__ */ new Set(); + EventProfiling._idPool = 0; + _globalLeakWarningThreshold = -1; + LeakageMonitor = class { + constructor(_errorHandler, threshold, name = Math.random().toString(18).slice(2, 5)) { + this._errorHandler = _errorHandler; + this.threshold = threshold; + this.name = name; + this._warnCountdown = 0; + } + dispose() { + var _a10; + (_a10 = this._stacks) === null || _a10 === void 0 ? void 0 : _a10.clear(); + } + check(stack, listenerCount) { + const threshold = this.threshold; + if (threshold <= 0 || listenerCount < threshold) { + return void 0; + } + if (!this._stacks) { + this._stacks = /* @__PURE__ */ new Map(); + } + const count = this._stacks.get(stack.value) || 0; + this._stacks.set(stack.value, count + 1); + this._warnCountdown -= 1; + if (this._warnCountdown <= 0) { + this._warnCountdown = threshold * 0.5; + const [topStack, topCount] = this.getMostFrequentStack(); + const message = `[${this.name}] potential listener LEAK detected, having ${listenerCount} listeners already. MOST frequent listener (${topCount}):`; + console.warn(message); + console.warn(topStack); + const error = new ListenerLeakError(message, topStack); + this._errorHandler(error); + } + return () => { + const count2 = this._stacks.get(stack.value) || 0; + this._stacks.set(stack.value, count2 - 1); + }; + } + getMostFrequentStack() { + if (!this._stacks) { + return void 0; + } + let topStack; + let topCount = 0; + for (const [stack, count] of this._stacks) { + if (!topStack || topCount < count) { + topStack = [stack, count]; + topCount = count; + } + } + return topStack; + } + }; + Stacktrace = class _Stacktrace { + static create() { + var _a10; + const err = new Error(); + return new _Stacktrace((_a10 = err.stack) !== null && _a10 !== void 0 ? _a10 : ""); + } + constructor(value) { + this.value = value; + } + print() { + console.warn(this.value.split("\n").slice(2).join("\n")); + } + }; + ListenerLeakError = class extends Error { + constructor(message, stack) { + super(message); + this.name = "ListenerLeakError"; + this.stack = stack; + } + }; + ListenerRefusalError = class extends Error { + constructor(message, stack) { + super(message); + this.name = "ListenerRefusalError"; + this.stack = stack; + } + }; + UniqueContainer = class { + constructor(value) { + this.value = value; + } + }; + compactionThreshold = 2; + forEachListener = (listeners, fn) => { + if (listeners instanceof UniqueContainer) { + fn(listeners); + } else { + for (let i = 0; i < listeners.length; i++) { + const l = listeners[i]; + if (l) { + fn(l); + } + } + } + }; + _listenerFinalizers = _enableListenerGCedWarning ? new FinalizationRegistry((heldValue) => { + if (typeof heldValue === "string") { + console.warn("[LEAKING LISTENER] GC'ed a listener that was NOT yet disposed. This is where is was created:"); + console.warn(heldValue); + } + }) : void 0; + Emitter = class { + constructor(options2) { + var _a10, _b4, _c2, _d2, _e2, _f3; + this._size = 0; + this._options = options2; + this._leakageMon = _globalLeakWarningThreshold > 0 || ((_a10 = this._options) === null || _a10 === void 0 ? void 0 : _a10.leakWarningThreshold) ? new LeakageMonitor((_b4 = options2 === null || options2 === void 0 ? void 0 : options2.onListenerError) !== null && _b4 !== void 0 ? _b4 : onUnexpectedError, (_d2 = (_c2 = this._options) === null || _c2 === void 0 ? void 0 : _c2.leakWarningThreshold) !== null && _d2 !== void 0 ? _d2 : _globalLeakWarningThreshold) : void 0; + this._perfMon = ((_e2 = this._options) === null || _e2 === void 0 ? void 0 : _e2._profName) ? new EventProfiling(this._options._profName) : void 0; + this._deliveryQueue = (_f3 = this._options) === null || _f3 === void 0 ? void 0 : _f3.deliveryQueue; + } + dispose() { + var _a10, _b4, _c2, _d2; + if (!this._disposed) { + this._disposed = true; + if (((_a10 = this._deliveryQueue) === null || _a10 === void 0 ? void 0 : _a10.current) === this) { + this._deliveryQueue.reset(); + } + if (this._listeners) { + if (_enableDisposeWithListenerWarning) { + const listeners = this._listeners; + queueMicrotask(() => { + forEachListener(listeners, (l) => { + var _a11; + return (_a11 = l.stack) === null || _a11 === void 0 ? void 0 : _a11.print(); + }); + }); + } + this._listeners = void 0; + this._size = 0; + } + (_c2 = (_b4 = this._options) === null || _b4 === void 0 ? void 0 : _b4.onDidRemoveLastListener) === null || _c2 === void 0 ? void 0 : _c2.call(_b4); + (_d2 = this._leakageMon) === null || _d2 === void 0 ? void 0 : _d2.dispose(); + } + } + /** + * For the public to allow to subscribe + * to events from this Emitter + */ + get event() { + var _a10; + (_a10 = this._event) !== null && _a10 !== void 0 ? _a10 : this._event = (callback, thisArgs, disposables) => { + var _a11, _b4, _c2, _d2, _e2, _f3, _g2; + if (this._leakageMon && this._size > __pow(this._leakageMon.threshold, 2)) { + const message = `[${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (${this._size} vs ${this._leakageMon.threshold})`; + console.warn(message); + const tuple = (_a11 = this._leakageMon.getMostFrequentStack()) !== null && _a11 !== void 0 ? _a11 : ["UNKNOWN stack", -1]; + const error = new ListenerRefusalError(`${message}. HINT: Stack shows most frequent listener (${tuple[1]}-times)`, tuple[0]); + const errorHandler2 = ((_b4 = this._options) === null || _b4 === void 0 ? void 0 : _b4.onListenerError) || onUnexpectedError; + errorHandler2(error); + return Disposable.None; + } + if (this._disposed) { + return Disposable.None; + } + if (thisArgs) { + callback = callback.bind(thisArgs); + } + const contained = new UniqueContainer(callback); + let removeMonitor; + let stack; + if (this._leakageMon && this._size >= Math.ceil(this._leakageMon.threshold * 0.2)) { + contained.stack = Stacktrace.create(); + removeMonitor = this._leakageMon.check(contained.stack, this._size + 1); + } + if (_enableDisposeWithListenerWarning) { + contained.stack = stack !== null && stack !== void 0 ? stack : Stacktrace.create(); + } + if (!this._listeners) { + (_d2 = (_c2 = this._options) === null || _c2 === void 0 ? void 0 : _c2.onWillAddFirstListener) === null || _d2 === void 0 ? void 0 : _d2.call(_c2, this); + this._listeners = contained; + (_f3 = (_e2 = this._options) === null || _e2 === void 0 ? void 0 : _e2.onDidAddFirstListener) === null || _f3 === void 0 ? void 0 : _f3.call(_e2, this); + } else if (this._listeners instanceof UniqueContainer) { + (_g2 = this._deliveryQueue) !== null && _g2 !== void 0 ? _g2 : this._deliveryQueue = new EventDeliveryQueuePrivate(); + this._listeners = [this._listeners, contained]; + } else { + this._listeners.push(contained); + } + this._size++; + const result = toDisposable(() => { + _listenerFinalizers === null || _listenerFinalizers === void 0 ? void 0 : _listenerFinalizers.unregister(result); + removeMonitor === null || removeMonitor === void 0 ? void 0 : removeMonitor(); + this._removeListener(contained); + }); + if (disposables instanceof DisposableStore) { + disposables.add(result); + } else if (Array.isArray(disposables)) { + disposables.push(result); + } + if (_listenerFinalizers) { + const stack2 = new Error().stack.split("\n").slice(2).join("\n").trim(); + _listenerFinalizers.register(result, stack2, result); + } + return result; + }; + return this._event; + } + _removeListener(listener) { + var _a10, _b4, _c2, _d2; + (_b4 = (_a10 = this._options) === null || _a10 === void 0 ? void 0 : _a10.onWillRemoveListener) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, this); + if (!this._listeners) { + return; + } + if (this._size === 1) { + this._listeners = void 0; + (_d2 = (_c2 = this._options) === null || _c2 === void 0 ? void 0 : _c2.onDidRemoveLastListener) === null || _d2 === void 0 ? void 0 : _d2.call(_c2, this); + this._size = 0; + return; + } + const listeners = this._listeners; + const index = listeners.indexOf(listener); + if (index === -1) { + console.log("disposed?", this._disposed); + console.log("size?", this._size); + console.log("arr?", JSON.stringify(this._listeners)); + throw new Error("Attempted to dispose unknown listener"); + } + this._size--; + listeners[index] = void 0; + const adjustDeliveryQueue = this._deliveryQueue.current === this; + if (this._size * compactionThreshold <= listeners.length) { + let n = 0; + for (let i = 0; i < listeners.length; i++) { + if (listeners[i]) { + listeners[n++] = listeners[i]; + } else if (adjustDeliveryQueue) { + this._deliveryQueue.end--; + if (n < this._deliveryQueue.i) { + this._deliveryQueue.i--; + } + } + } + listeners.length = n; + } + } + _deliver(listener, value) { + var _a10; + if (!listener) { + return; + } + const errorHandler2 = ((_a10 = this._options) === null || _a10 === void 0 ? void 0 : _a10.onListenerError) || onUnexpectedError; + if (!errorHandler2) { + listener.value(value); + return; + } + try { + listener.value(value); + } catch (e) { + errorHandler2(e); + } + } + /** Delivers items in the queue. Assumes the queue is ready to go. */ + _deliverQueue(dq) { + const listeners = dq.current._listeners; + while (dq.i < dq.end) { + this._deliver(listeners[dq.i++], dq.value); + } + dq.reset(); + } + /** + * To be kept private to fire an event to + * subscribers + */ + fire(event) { + var _a10, _b4, _c2, _d2; + if ((_a10 = this._deliveryQueue) === null || _a10 === void 0 ? void 0 : _a10.current) { + this._deliverQueue(this._deliveryQueue); + (_b4 = this._perfMon) === null || _b4 === void 0 ? void 0 : _b4.stop(); + } + (_c2 = this._perfMon) === null || _c2 === void 0 ? void 0 : _c2.start(this._size); + if (!this._listeners) { + } else if (this._listeners instanceof UniqueContainer) { + this._deliver(this._listeners, event); + } else { + const dq = this._deliveryQueue; + dq.enqueue(this, event, this._listeners.length); + this._deliverQueue(dq); + } + (_d2 = this._perfMon) === null || _d2 === void 0 ? void 0 : _d2.stop(); + } + hasListeners() { + return this._size > 0; + } + }; + createEventDeliveryQueue = () => new EventDeliveryQueuePrivate(); + EventDeliveryQueuePrivate = class { + constructor() { + this.i = -1; + this.end = 0; + } + enqueue(emitter, value, end) { + this.i = 0; + this.end = end; + this.current = emitter; + this.value = value; + } + reset() { + this.i = this.end; + this.current = void 0; + this.value = void 0; + } + }; + PauseableEmitter = class extends Emitter { + constructor(options2) { + super(options2); + this._isPaused = 0; + this._eventQueue = new LinkedList(); + this._mergeFn = options2 === null || options2 === void 0 ? void 0 : options2.merge; + } + pause() { + this._isPaused++; + } + resume() { + if (this._isPaused !== 0 && --this._isPaused === 0) { + if (this._mergeFn) { + if (this._eventQueue.size > 0) { + const events = Array.from(this._eventQueue); + this._eventQueue.clear(); + super.fire(this._mergeFn(events)); + } + } else { + while (!this._isPaused && this._eventQueue.size !== 0) { + super.fire(this._eventQueue.shift()); + } + } + } + } + fire(event) { + if (this._size) { + if (this._isPaused !== 0) { + this._eventQueue.push(event); + } else { + super.fire(event); + } + } + } + }; + DebounceEmitter = class extends PauseableEmitter { + constructor(options2) { + var _a10; + super(options2); + this._delay = (_a10 = options2.delay) !== null && _a10 !== void 0 ? _a10 : 100; + } + fire(event) { + if (!this._handle) { + this.pause(); + this._handle = setTimeout(() => { + this._handle = void 0; + this.resume(); + }, this._delay); + } + super.fire(event); + } + }; + MicrotaskEmitter = class extends Emitter { + constructor(options2) { + super(options2); + this._queuedEvents = []; + this._mergeFn = options2 === null || options2 === void 0 ? void 0 : options2.merge; + } + fire(event) { + if (!this.hasListeners()) { + return; + } + this._queuedEvents.push(event); + if (this._queuedEvents.length === 1) { + queueMicrotask(() => { + if (this._mergeFn) { + super.fire(this._mergeFn(this._queuedEvents)); + } else { + this._queuedEvents.forEach((e) => super.fire(e)); + } + this._queuedEvents = []; + }); + } + } + }; + EventMultiplexer = class { + constructor() { + this.hasListeners = false; + this.events = []; + this.emitter = new Emitter({ + onWillAddFirstListener: () => this.onFirstListenerAdd(), + onDidRemoveLastListener: () => this.onLastListenerRemove() + }); + } + get event() { + return this.emitter.event; + } + add(event) { + const e = { event, listener: null }; + this.events.push(e); + if (this.hasListeners) { + this.hook(e); + } + const dispose2 = () => { + if (this.hasListeners) { + this.unhook(e); + } + const idx = this.events.indexOf(e); + this.events.splice(idx, 1); + }; + return toDisposable(createSingleCallFunction(dispose2)); + } + onFirstListenerAdd() { + this.hasListeners = true; + this.events.forEach((e) => this.hook(e)); + } + onLastListenerRemove() { + this.hasListeners = false; + this.events.forEach((e) => this.unhook(e)); + } + hook(e) { + e.listener = e.event((r) => this.emitter.fire(r)); + } + unhook(e) { + var _a10; + (_a10 = e.listener) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + e.listener = null; + } + dispose() { + var _a10; + this.emitter.dispose(); + for (const e of this.events) { + (_a10 = e.listener) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + } + this.events = []; + } + }; + EventBufferer = class { + constructor() { + this.data = []; + } + wrapEvent(event, reduce, initial) { + return (listener, thisArgs, disposables) => { + return event((i) => { + var _a10; + const data = this.data[this.data.length - 1]; + if (!reduce) { + if (data) { + data.buffers.push(() => listener.call(thisArgs, i)); + } else { + listener.call(thisArgs, i); + } + return; + } + const reduceData = data; + if (!reduceData) { + listener.call(thisArgs, reduce(initial, i)); + return; + } + (_a10 = reduceData.items) !== null && _a10 !== void 0 ? _a10 : reduceData.items = []; + reduceData.items.push(i); + if (reduceData.buffers.length === 0) { + data.buffers.push(() => { + var _a11; + (_a11 = reduceData.reducedResult) !== null && _a11 !== void 0 ? _a11 : reduceData.reducedResult = initial ? reduceData.items.reduce(reduce, initial) : reduceData.items.reduce(reduce); + listener.call(thisArgs, reduceData.reducedResult); + }); + } + }, void 0, disposables); + }; + } + bufferEvents(fn) { + const data = { buffers: new Array() }; + this.data.push(data); + const r = fn(); + this.data.pop(); + data.buffers.forEach((flush) => flush()); + return r; + } + }; + Relay = class { + constructor() { + this.listening = false; + this.inputEvent = Event.None; + this.inputEventListener = Disposable.None; + this.emitter = new Emitter({ + onDidAddFirstListener: () => { + this.listening = true; + this.inputEventListener = this.inputEvent(this.emitter.fire, this.emitter); + }, + onDidRemoveLastListener: () => { + this.listening = false; + this.inputEventListener.dispose(); + } + }); + this.event = this.emitter.event; + } + set input(event) { + this.inputEvent = event; + if (this.listening) { + this.inputEventListener.dispose(); + this.inputEventListener = event(this.emitter.fire, this.emitter); + } + } + dispose() { + this.inputEventListener.dispose(); + this.emitter.dispose(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/cancellation.js +function cancelOnDispose(store) { + const source = new CancellationTokenSource(); + store.add({ dispose() { + source.cancel(); + } }); + return source.token; +} +var shortcutEvent, CancellationToken, MutableToken, CancellationTokenSource; +var init_cancellation = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/cancellation.js"() { + init_event(); + shortcutEvent = Object.freeze(function(callback, context) { + const handle = setTimeout(callback.bind(context), 0); + return { dispose() { + clearTimeout(handle); + } }; + }); + (function(CancellationToken2) { + function isCancellationToken(thing) { + if (thing === CancellationToken2.None || thing === CancellationToken2.Cancelled) { + return true; + } + if (thing instanceof MutableToken) { + return true; + } + if (!thing || typeof thing !== "object") { + return false; + } + return typeof thing.isCancellationRequested === "boolean" && typeof thing.onCancellationRequested === "function"; + } + CancellationToken2.isCancellationToken = isCancellationToken; + CancellationToken2.None = Object.freeze({ + isCancellationRequested: false, + onCancellationRequested: Event.None + }); + CancellationToken2.Cancelled = Object.freeze({ + isCancellationRequested: true, + onCancellationRequested: shortcutEvent + }); + })(CancellationToken || (CancellationToken = {})); + MutableToken = class { + constructor() { + this._isCancelled = false; + this._emitter = null; + } + cancel() { + if (!this._isCancelled) { + this._isCancelled = true; + if (this._emitter) { + this._emitter.fire(void 0); + this.dispose(); + } + } + } + get isCancellationRequested() { + return this._isCancelled; + } + get onCancellationRequested() { + if (this._isCancelled) { + return shortcutEvent; + } + if (!this._emitter) { + this._emitter = new Emitter(); + } + return this._emitter.event; + } + dispose() { + if (this._emitter) { + this._emitter.dispose(); + this._emitter = null; + } + } + }; + CancellationTokenSource = class { + constructor(parent) { + this._token = void 0; + this._parentListener = void 0; + this._parentListener = parent && parent.onCancellationRequested(this.cancel, this); + } + get token() { + if (!this._token) { + this._token = new MutableToken(); + } + return this._token; + } + cancel() { + if (!this._token) { + this._token = CancellationToken.Cancelled; + } else if (this._token instanceof MutableToken) { + this._token.cancel(); + } + } + dispose(cancel = false) { + var _a10; + if (cancel) { + this.cancel(); + } + (_a10 = this._parentListener) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + if (!this._token) { + this._token = CancellationToken.None; + } else if (this._token instanceof MutableToken) { + this._token.dispose(); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/keyCodes.js +function KeyChord(firstPart, secondPart) { + const chordPart = (secondPart & 65535) << 16 >>> 0; + return (firstPart | chordPart) >>> 0; +} +var KeyCodeStrMap, uiMap, userSettingsUSMap, userSettingsGeneralMap, EVENT_KEY_CODE_MAP, NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE, scanCodeIntToStr, scanCodeStrToInt, scanCodeLowerCaseStrToInt, IMMUTABLE_CODE_TO_KEY_CODE, IMMUTABLE_KEY_CODE_TO_CODE, KeyCodeUtils; +var init_keyCodes = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/keyCodes.js"() { + KeyCodeStrMap = class { + constructor() { + this._keyCodeToStr = []; + this._strToKeyCode = /* @__PURE__ */ Object.create(null); + } + define(keyCode, str) { + this._keyCodeToStr[keyCode] = str; + this._strToKeyCode[str.toLowerCase()] = keyCode; + } + keyCodeToStr(keyCode) { + return this._keyCodeToStr[keyCode]; + } + strToKeyCode(str) { + return this._strToKeyCode[str.toLowerCase()] || 0; + } + }; + uiMap = new KeyCodeStrMap(); + userSettingsUSMap = new KeyCodeStrMap(); + userSettingsGeneralMap = new KeyCodeStrMap(); + EVENT_KEY_CODE_MAP = new Array(230); + NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE = {}; + scanCodeIntToStr = []; + scanCodeStrToInt = /* @__PURE__ */ Object.create(null); + scanCodeLowerCaseStrToInt = /* @__PURE__ */ Object.create(null); + IMMUTABLE_CODE_TO_KEY_CODE = []; + IMMUTABLE_KEY_CODE_TO_CODE = []; + for (let i = 0; i <= 193; i++) { + IMMUTABLE_CODE_TO_KEY_CODE[i] = -1; + } + for (let i = 0; i <= 132; i++) { + IMMUTABLE_KEY_CODE_TO_CODE[i] = -1; + } + (function() { + const empty2 = ""; + const mappings = [ + // immutable, scanCode, scanCodeStr, keyCode, keyCodeStr, eventKeyCode, vkey, usUserSettingsLabel, generalUserSettingsLabel + [1, 0, "None", 0, "unknown", 0, "VK_UNKNOWN", empty2, empty2], + [1, 1, "Hyper", 0, empty2, 0, empty2, empty2, empty2], + [1, 2, "Super", 0, empty2, 0, empty2, empty2, empty2], + [1, 3, "Fn", 0, empty2, 0, empty2, empty2, empty2], + [1, 4, "FnLock", 0, empty2, 0, empty2, empty2, empty2], + [1, 5, "Suspend", 0, empty2, 0, empty2, empty2, empty2], + [1, 6, "Resume", 0, empty2, 0, empty2, empty2, empty2], + [1, 7, "Turbo", 0, empty2, 0, empty2, empty2, empty2], + [1, 8, "Sleep", 0, empty2, 0, "VK_SLEEP", empty2, empty2], + [1, 9, "WakeUp", 0, empty2, 0, empty2, empty2, empty2], + [0, 10, "KeyA", 31, "A", 65, "VK_A", empty2, empty2], + [0, 11, "KeyB", 32, "B", 66, "VK_B", empty2, empty2], + [0, 12, "KeyC", 33, "C", 67, "VK_C", empty2, empty2], + [0, 13, "KeyD", 34, "D", 68, "VK_D", empty2, empty2], + [0, 14, "KeyE", 35, "E", 69, "VK_E", empty2, empty2], + [0, 15, "KeyF", 36, "F", 70, "VK_F", empty2, empty2], + [0, 16, "KeyG", 37, "G", 71, "VK_G", empty2, empty2], + [0, 17, "KeyH", 38, "H", 72, "VK_H", empty2, empty2], + [0, 18, "KeyI", 39, "I", 73, "VK_I", empty2, empty2], + [0, 19, "KeyJ", 40, "J", 74, "VK_J", empty2, empty2], + [0, 20, "KeyK", 41, "K", 75, "VK_K", empty2, empty2], + [0, 21, "KeyL", 42, "L", 76, "VK_L", empty2, empty2], + [0, 22, "KeyM", 43, "M", 77, "VK_M", empty2, empty2], + [0, 23, "KeyN", 44, "N", 78, "VK_N", empty2, empty2], + [0, 24, "KeyO", 45, "O", 79, "VK_O", empty2, empty2], + [0, 25, "KeyP", 46, "P", 80, "VK_P", empty2, empty2], + [0, 26, "KeyQ", 47, "Q", 81, "VK_Q", empty2, empty2], + [0, 27, "KeyR", 48, "R", 82, "VK_R", empty2, empty2], + [0, 28, "KeyS", 49, "S", 83, "VK_S", empty2, empty2], + [0, 29, "KeyT", 50, "T", 84, "VK_T", empty2, empty2], + [0, 30, "KeyU", 51, "U", 85, "VK_U", empty2, empty2], + [0, 31, "KeyV", 52, "V", 86, "VK_V", empty2, empty2], + [0, 32, "KeyW", 53, "W", 87, "VK_W", empty2, empty2], + [0, 33, "KeyX", 54, "X", 88, "VK_X", empty2, empty2], + [0, 34, "KeyY", 55, "Y", 89, "VK_Y", empty2, empty2], + [0, 35, "KeyZ", 56, "Z", 90, "VK_Z", empty2, empty2], + [0, 36, "Digit1", 22, "1", 49, "VK_1", empty2, empty2], + [0, 37, "Digit2", 23, "2", 50, "VK_2", empty2, empty2], + [0, 38, "Digit3", 24, "3", 51, "VK_3", empty2, empty2], + [0, 39, "Digit4", 25, "4", 52, "VK_4", empty2, empty2], + [0, 40, "Digit5", 26, "5", 53, "VK_5", empty2, empty2], + [0, 41, "Digit6", 27, "6", 54, "VK_6", empty2, empty2], + [0, 42, "Digit7", 28, "7", 55, "VK_7", empty2, empty2], + [0, 43, "Digit8", 29, "8", 56, "VK_8", empty2, empty2], + [0, 44, "Digit9", 30, "9", 57, "VK_9", empty2, empty2], + [0, 45, "Digit0", 21, "0", 48, "VK_0", empty2, empty2], + [1, 46, "Enter", 3, "Enter", 13, "VK_RETURN", empty2, empty2], + [1, 47, "Escape", 9, "Escape", 27, "VK_ESCAPE", empty2, empty2], + [1, 48, "Backspace", 1, "Backspace", 8, "VK_BACK", empty2, empty2], + [1, 49, "Tab", 2, "Tab", 9, "VK_TAB", empty2, empty2], + [1, 50, "Space", 10, "Space", 32, "VK_SPACE", empty2, empty2], + [0, 51, "Minus", 88, "-", 189, "VK_OEM_MINUS", "-", "OEM_MINUS"], + [0, 52, "Equal", 86, "=", 187, "VK_OEM_PLUS", "=", "OEM_PLUS"], + [0, 53, "BracketLeft", 92, "[", 219, "VK_OEM_4", "[", "OEM_4"], + [0, 54, "BracketRight", 94, "]", 221, "VK_OEM_6", "]", "OEM_6"], + [0, 55, "Backslash", 93, "\\", 220, "VK_OEM_5", "\\", "OEM_5"], + [0, 56, "IntlHash", 0, empty2, 0, empty2, empty2, empty2], + // has been dropped from the w3c spec + [0, 57, "Semicolon", 85, ";", 186, "VK_OEM_1", ";", "OEM_1"], + [0, 58, "Quote", 95, "'", 222, "VK_OEM_7", "'", "OEM_7"], + [0, 59, "Backquote", 91, "`", 192, "VK_OEM_3", "`", "OEM_3"], + [0, 60, "Comma", 87, ",", 188, "VK_OEM_COMMA", ",", "OEM_COMMA"], + [0, 61, "Period", 89, ".", 190, "VK_OEM_PERIOD", ".", "OEM_PERIOD"], + [0, 62, "Slash", 90, "/", 191, "VK_OEM_2", "/", "OEM_2"], + [1, 63, "CapsLock", 8, "CapsLock", 20, "VK_CAPITAL", empty2, empty2], + [1, 64, "F1", 59, "F1", 112, "VK_F1", empty2, empty2], + [1, 65, "F2", 60, "F2", 113, "VK_F2", empty2, empty2], + [1, 66, "F3", 61, "F3", 114, "VK_F3", empty2, empty2], + [1, 67, "F4", 62, "F4", 115, "VK_F4", empty2, empty2], + [1, 68, "F5", 63, "F5", 116, "VK_F5", empty2, empty2], + [1, 69, "F6", 64, "F6", 117, "VK_F6", empty2, empty2], + [1, 70, "F7", 65, "F7", 118, "VK_F7", empty2, empty2], + [1, 71, "F8", 66, "F8", 119, "VK_F8", empty2, empty2], + [1, 72, "F9", 67, "F9", 120, "VK_F9", empty2, empty2], + [1, 73, "F10", 68, "F10", 121, "VK_F10", empty2, empty2], + [1, 74, "F11", 69, "F11", 122, "VK_F11", empty2, empty2], + [1, 75, "F12", 70, "F12", 123, "VK_F12", empty2, empty2], + [1, 76, "PrintScreen", 0, empty2, 0, empty2, empty2, empty2], + [1, 77, "ScrollLock", 84, "ScrollLock", 145, "VK_SCROLL", empty2, empty2], + [1, 78, "Pause", 7, "PauseBreak", 19, "VK_PAUSE", empty2, empty2], + [1, 79, "Insert", 19, "Insert", 45, "VK_INSERT", empty2, empty2], + [1, 80, "Home", 14, "Home", 36, "VK_HOME", empty2, empty2], + [1, 81, "PageUp", 11, "PageUp", 33, "VK_PRIOR", empty2, empty2], + [1, 82, "Delete", 20, "Delete", 46, "VK_DELETE", empty2, empty2], + [1, 83, "End", 13, "End", 35, "VK_END", empty2, empty2], + [1, 84, "PageDown", 12, "PageDown", 34, "VK_NEXT", empty2, empty2], + [1, 85, "ArrowRight", 17, "RightArrow", 39, "VK_RIGHT", "Right", empty2], + [1, 86, "ArrowLeft", 15, "LeftArrow", 37, "VK_LEFT", "Left", empty2], + [1, 87, "ArrowDown", 18, "DownArrow", 40, "VK_DOWN", "Down", empty2], + [1, 88, "ArrowUp", 16, "UpArrow", 38, "VK_UP", "Up", empty2], + [1, 89, "NumLock", 83, "NumLock", 144, "VK_NUMLOCK", empty2, empty2], + [1, 90, "NumpadDivide", 113, "NumPad_Divide", 111, "VK_DIVIDE", empty2, empty2], + [1, 91, "NumpadMultiply", 108, "NumPad_Multiply", 106, "VK_MULTIPLY", empty2, empty2], + [1, 92, "NumpadSubtract", 111, "NumPad_Subtract", 109, "VK_SUBTRACT", empty2, empty2], + [1, 93, "NumpadAdd", 109, "NumPad_Add", 107, "VK_ADD", empty2, empty2], + [1, 94, "NumpadEnter", 3, empty2, 0, empty2, empty2, empty2], + [1, 95, "Numpad1", 99, "NumPad1", 97, "VK_NUMPAD1", empty2, empty2], + [1, 96, "Numpad2", 100, "NumPad2", 98, "VK_NUMPAD2", empty2, empty2], + [1, 97, "Numpad3", 101, "NumPad3", 99, "VK_NUMPAD3", empty2, empty2], + [1, 98, "Numpad4", 102, "NumPad4", 100, "VK_NUMPAD4", empty2, empty2], + [1, 99, "Numpad5", 103, "NumPad5", 101, "VK_NUMPAD5", empty2, empty2], + [1, 100, "Numpad6", 104, "NumPad6", 102, "VK_NUMPAD6", empty2, empty2], + [1, 101, "Numpad7", 105, "NumPad7", 103, "VK_NUMPAD7", empty2, empty2], + [1, 102, "Numpad8", 106, "NumPad8", 104, "VK_NUMPAD8", empty2, empty2], + [1, 103, "Numpad9", 107, "NumPad9", 105, "VK_NUMPAD9", empty2, empty2], + [1, 104, "Numpad0", 98, "NumPad0", 96, "VK_NUMPAD0", empty2, empty2], + [1, 105, "NumpadDecimal", 112, "NumPad_Decimal", 110, "VK_DECIMAL", empty2, empty2], + [0, 106, "IntlBackslash", 97, "OEM_102", 226, "VK_OEM_102", empty2, empty2], + [1, 107, "ContextMenu", 58, "ContextMenu", 93, empty2, empty2, empty2], + [1, 108, "Power", 0, empty2, 0, empty2, empty2, empty2], + [1, 109, "NumpadEqual", 0, empty2, 0, empty2, empty2, empty2], + [1, 110, "F13", 71, "F13", 124, "VK_F13", empty2, empty2], + [1, 111, "F14", 72, "F14", 125, "VK_F14", empty2, empty2], + [1, 112, "F15", 73, "F15", 126, "VK_F15", empty2, empty2], + [1, 113, "F16", 74, "F16", 127, "VK_F16", empty2, empty2], + [1, 114, "F17", 75, "F17", 128, "VK_F17", empty2, empty2], + [1, 115, "F18", 76, "F18", 129, "VK_F18", empty2, empty2], + [1, 116, "F19", 77, "F19", 130, "VK_F19", empty2, empty2], + [1, 117, "F20", 78, "F20", 131, "VK_F20", empty2, empty2], + [1, 118, "F21", 79, "F21", 132, "VK_F21", empty2, empty2], + [1, 119, "F22", 80, "F22", 133, "VK_F22", empty2, empty2], + [1, 120, "F23", 81, "F23", 134, "VK_F23", empty2, empty2], + [1, 121, "F24", 82, "F24", 135, "VK_F24", empty2, empty2], + [1, 122, "Open", 0, empty2, 0, empty2, empty2, empty2], + [1, 123, "Help", 0, empty2, 0, empty2, empty2, empty2], + [1, 124, "Select", 0, empty2, 0, empty2, empty2, empty2], + [1, 125, "Again", 0, empty2, 0, empty2, empty2, empty2], + [1, 126, "Undo", 0, empty2, 0, empty2, empty2, empty2], + [1, 127, "Cut", 0, empty2, 0, empty2, empty2, empty2], + [1, 128, "Copy", 0, empty2, 0, empty2, empty2, empty2], + [1, 129, "Paste", 0, empty2, 0, empty2, empty2, empty2], + [1, 130, "Find", 0, empty2, 0, empty2, empty2, empty2], + [1, 131, "AudioVolumeMute", 117, "AudioVolumeMute", 173, "VK_VOLUME_MUTE", empty2, empty2], + [1, 132, "AudioVolumeUp", 118, "AudioVolumeUp", 175, "VK_VOLUME_UP", empty2, empty2], + [1, 133, "AudioVolumeDown", 119, "AudioVolumeDown", 174, "VK_VOLUME_DOWN", empty2, empty2], + [1, 134, "NumpadComma", 110, "NumPad_Separator", 108, "VK_SEPARATOR", empty2, empty2], + [0, 135, "IntlRo", 115, "ABNT_C1", 193, "VK_ABNT_C1", empty2, empty2], + [1, 136, "KanaMode", 0, empty2, 0, empty2, empty2, empty2], + [0, 137, "IntlYen", 0, empty2, 0, empty2, empty2, empty2], + [1, 138, "Convert", 0, empty2, 0, empty2, empty2, empty2], + [1, 139, "NonConvert", 0, empty2, 0, empty2, empty2, empty2], + [1, 140, "Lang1", 0, empty2, 0, empty2, empty2, empty2], + [1, 141, "Lang2", 0, empty2, 0, empty2, empty2, empty2], + [1, 142, "Lang3", 0, empty2, 0, empty2, empty2, empty2], + [1, 143, "Lang4", 0, empty2, 0, empty2, empty2, empty2], + [1, 144, "Lang5", 0, empty2, 0, empty2, empty2, empty2], + [1, 145, "Abort", 0, empty2, 0, empty2, empty2, empty2], + [1, 146, "Props", 0, empty2, 0, empty2, empty2, empty2], + [1, 147, "NumpadParenLeft", 0, empty2, 0, empty2, empty2, empty2], + [1, 148, "NumpadParenRight", 0, empty2, 0, empty2, empty2, empty2], + [1, 149, "NumpadBackspace", 0, empty2, 0, empty2, empty2, empty2], + [1, 150, "NumpadMemoryStore", 0, empty2, 0, empty2, empty2, empty2], + [1, 151, "NumpadMemoryRecall", 0, empty2, 0, empty2, empty2, empty2], + [1, 152, "NumpadMemoryClear", 0, empty2, 0, empty2, empty2, empty2], + [1, 153, "NumpadMemoryAdd", 0, empty2, 0, empty2, empty2, empty2], + [1, 154, "NumpadMemorySubtract", 0, empty2, 0, empty2, empty2, empty2], + [1, 155, "NumpadClear", 131, "Clear", 12, "VK_CLEAR", empty2, empty2], + [1, 156, "NumpadClearEntry", 0, empty2, 0, empty2, empty2, empty2], + [1, 0, empty2, 5, "Ctrl", 17, "VK_CONTROL", empty2, empty2], + [1, 0, empty2, 4, "Shift", 16, "VK_SHIFT", empty2, empty2], + [1, 0, empty2, 6, "Alt", 18, "VK_MENU", empty2, empty2], + [1, 0, empty2, 57, "Meta", 91, "VK_COMMAND", empty2, empty2], + [1, 157, "ControlLeft", 5, empty2, 0, "VK_LCONTROL", empty2, empty2], + [1, 158, "ShiftLeft", 4, empty2, 0, "VK_LSHIFT", empty2, empty2], + [1, 159, "AltLeft", 6, empty2, 0, "VK_LMENU", empty2, empty2], + [1, 160, "MetaLeft", 57, empty2, 0, "VK_LWIN", empty2, empty2], + [1, 161, "ControlRight", 5, empty2, 0, "VK_RCONTROL", empty2, empty2], + [1, 162, "ShiftRight", 4, empty2, 0, "VK_RSHIFT", empty2, empty2], + [1, 163, "AltRight", 6, empty2, 0, "VK_RMENU", empty2, empty2], + [1, 164, "MetaRight", 57, empty2, 0, "VK_RWIN", empty2, empty2], + [1, 165, "BrightnessUp", 0, empty2, 0, empty2, empty2, empty2], + [1, 166, "BrightnessDown", 0, empty2, 0, empty2, empty2, empty2], + [1, 167, "MediaPlay", 0, empty2, 0, empty2, empty2, empty2], + [1, 168, "MediaRecord", 0, empty2, 0, empty2, empty2, empty2], + [1, 169, "MediaFastForward", 0, empty2, 0, empty2, empty2, empty2], + [1, 170, "MediaRewind", 0, empty2, 0, empty2, empty2, empty2], + [1, 171, "MediaTrackNext", 124, "MediaTrackNext", 176, "VK_MEDIA_NEXT_TRACK", empty2, empty2], + [1, 172, "MediaTrackPrevious", 125, "MediaTrackPrevious", 177, "VK_MEDIA_PREV_TRACK", empty2, empty2], + [1, 173, "MediaStop", 126, "MediaStop", 178, "VK_MEDIA_STOP", empty2, empty2], + [1, 174, "Eject", 0, empty2, 0, empty2, empty2, empty2], + [1, 175, "MediaPlayPause", 127, "MediaPlayPause", 179, "VK_MEDIA_PLAY_PAUSE", empty2, empty2], + [1, 176, "MediaSelect", 128, "LaunchMediaPlayer", 181, "VK_MEDIA_LAUNCH_MEDIA_SELECT", empty2, empty2], + [1, 177, "LaunchMail", 129, "LaunchMail", 180, "VK_MEDIA_LAUNCH_MAIL", empty2, empty2], + [1, 178, "LaunchApp2", 130, "LaunchApp2", 183, "VK_MEDIA_LAUNCH_APP2", empty2, empty2], + [1, 179, "LaunchApp1", 0, empty2, 0, "VK_MEDIA_LAUNCH_APP1", empty2, empty2], + [1, 180, "SelectTask", 0, empty2, 0, empty2, empty2, empty2], + [1, 181, "LaunchScreenSaver", 0, empty2, 0, empty2, empty2, empty2], + [1, 182, "BrowserSearch", 120, "BrowserSearch", 170, "VK_BROWSER_SEARCH", empty2, empty2], + [1, 183, "BrowserHome", 121, "BrowserHome", 172, "VK_BROWSER_HOME", empty2, empty2], + [1, 184, "BrowserBack", 122, "BrowserBack", 166, "VK_BROWSER_BACK", empty2, empty2], + [1, 185, "BrowserForward", 123, "BrowserForward", 167, "VK_BROWSER_FORWARD", empty2, empty2], + [1, 186, "BrowserStop", 0, empty2, 0, "VK_BROWSER_STOP", empty2, empty2], + [1, 187, "BrowserRefresh", 0, empty2, 0, "VK_BROWSER_REFRESH", empty2, empty2], + [1, 188, "BrowserFavorites", 0, empty2, 0, "VK_BROWSER_FAVORITES", empty2, empty2], + [1, 189, "ZoomToggle", 0, empty2, 0, empty2, empty2, empty2], + [1, 190, "MailReply", 0, empty2, 0, empty2, empty2, empty2], + [1, 191, "MailForward", 0, empty2, 0, empty2, empty2, empty2], + [1, 192, "MailSend", 0, empty2, 0, empty2, empty2, empty2], + // See https://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html + // If an Input Method Editor is processing key input and the event is keydown, return 229. + [1, 0, empty2, 114, "KeyInComposition", 229, empty2, empty2, empty2], + [1, 0, empty2, 116, "ABNT_C2", 194, "VK_ABNT_C2", empty2, empty2], + [1, 0, empty2, 96, "OEM_8", 223, "VK_OEM_8", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_KANA", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_HANGUL", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_JUNJA", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_FINAL", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_HANJA", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_KANJI", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_CONVERT", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_NONCONVERT", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_ACCEPT", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_MODECHANGE", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_SELECT", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_PRINT", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_EXECUTE", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_SNAPSHOT", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_HELP", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_APPS", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_PROCESSKEY", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_PACKET", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_DBE_SBCSCHAR", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_DBE_DBCSCHAR", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_ATTN", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_CRSEL", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_EXSEL", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_EREOF", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_PLAY", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_ZOOM", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_NONAME", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_PA1", empty2, empty2], + [1, 0, empty2, 0, empty2, 0, "VK_OEM_CLEAR", empty2, empty2] + ]; + const seenKeyCode = []; + const seenScanCode = []; + for (const mapping of mappings) { + const [immutable, scanCode, scanCodeStr, keyCode, keyCodeStr, eventKeyCode, vkey, usUserSettingsLabel, generalUserSettingsLabel] = mapping; + if (!seenScanCode[scanCode]) { + seenScanCode[scanCode] = true; + scanCodeIntToStr[scanCode] = scanCodeStr; + scanCodeStrToInt[scanCodeStr] = scanCode; + scanCodeLowerCaseStrToInt[scanCodeStr.toLowerCase()] = scanCode; + if (immutable) { + IMMUTABLE_CODE_TO_KEY_CODE[scanCode] = keyCode; + if (keyCode !== 0 && keyCode !== 3 && keyCode !== 5 && keyCode !== 4 && keyCode !== 6 && keyCode !== 57) { + IMMUTABLE_KEY_CODE_TO_CODE[keyCode] = scanCode; + } + } + } + if (!seenKeyCode[keyCode]) { + seenKeyCode[keyCode] = true; + if (!keyCodeStr) { + throw new Error(`String representation missing for key code ${keyCode} around scan code ${scanCodeStr}`); + } + uiMap.define(keyCode, keyCodeStr); + userSettingsUSMap.define(keyCode, usUserSettingsLabel || keyCodeStr); + userSettingsGeneralMap.define(keyCode, generalUserSettingsLabel || usUserSettingsLabel || keyCodeStr); + } + if (eventKeyCode) { + EVENT_KEY_CODE_MAP[eventKeyCode] = keyCode; + } + if (vkey) { + NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE[vkey] = keyCode; + } + } + IMMUTABLE_KEY_CODE_TO_CODE[ + 3 + /* KeyCode.Enter */ + ] = 46; + })(); + (function(KeyCodeUtils2) { + function toString(keyCode) { + return uiMap.keyCodeToStr(keyCode); + } + KeyCodeUtils2.toString = toString; + function fromString(key) { + return uiMap.strToKeyCode(key); + } + KeyCodeUtils2.fromString = fromString; + function toUserSettingsUS(keyCode) { + return userSettingsUSMap.keyCodeToStr(keyCode); + } + KeyCodeUtils2.toUserSettingsUS = toUserSettingsUS; + function toUserSettingsGeneral(keyCode) { + return userSettingsGeneralMap.keyCodeToStr(keyCode); + } + KeyCodeUtils2.toUserSettingsGeneral = toUserSettingsGeneral; + function fromUserSettings(key) { + return userSettingsUSMap.strToKeyCode(key) || userSettingsGeneralMap.strToKeyCode(key); + } + KeyCodeUtils2.fromUserSettings = fromUserSettings; + function toElectronAccelerator(keyCode) { + if (keyCode >= 98 && keyCode <= 113) { + return null; + } + switch (keyCode) { + case 16: + return "Up"; + case 18: + return "Down"; + case 15: + return "Left"; + case 17: + return "Right"; + } + return uiMap.keyCodeToStr(keyCode); + } + KeyCodeUtils2.toElectronAccelerator = toElectronAccelerator; + })(KeyCodeUtils || (KeyCodeUtils = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/process.js +var safeProcess, vscodeGlobal, cwd, env, platform; +var init_process = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/process.js"() { + init_platform(); + vscodeGlobal = globalThis.vscode; + if (typeof vscodeGlobal !== "undefined" && typeof vscodeGlobal.process !== "undefined") { + const sandboxProcess = vscodeGlobal.process; + safeProcess = { + get platform() { + return sandboxProcess.platform; + }, + get arch() { + return sandboxProcess.arch; + }, + get env() { + return sandboxProcess.env; + }, + cwd() { + return sandboxProcess.cwd(); + } + }; + } else if (typeof process !== "undefined") { + safeProcess = { + get platform() { + return process.platform; + }, + get arch() { + return process.arch; + }, + get env() { + return process.env; + }, + cwd() { + return process.env["VSCODE_CWD"] || process.cwd(); + } + }; + } else { + safeProcess = { + // Supported + get platform() { + return isWindows ? "win32" : isMacintosh ? "darwin" : "linux"; + }, + get arch() { + return void 0; + }, + // Unsupported + get env() { + return {}; + }, + cwd() { + return "/"; + } + }; + } + cwd = safeProcess.cwd; + env = safeProcess.env; + platform = safeProcess.platform; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/path.js +function validateObject(pathObject, name) { + if (pathObject === null || typeof pathObject !== "object") { + throw new ErrorInvalidArgType(name, "Object", pathObject); + } +} +function validateString(value, name) { + if (typeof value !== "string") { + throw new ErrorInvalidArgType(name, "string", value); + } +} +function isPathSeparator(code) { + return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; +} +function isPosixPathSeparator(code) { + return code === CHAR_FORWARD_SLASH; +} +function isWindowsDeviceRoot(code) { + return code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z || code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z; +} +function normalizeString(path, allowAboveRoot, separator, isPathSeparator3) { + let res = ""; + let lastSegmentLength = 0; + let lastSlash = -1; + let dots = 0; + let code = 0; + for (let i = 0; i <= path.length; ++i) { + if (i < path.length) { + code = path.charCodeAt(i); + } else if (isPathSeparator3(code)) { + break; + } else { + code = CHAR_FORWARD_SLASH; + } + if (isPathSeparator3(code)) { + if (lastSlash === i - 1 || dots === 1) { + } else if (dots === 2) { + if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== CHAR_DOT || res.charCodeAt(res.length - 2) !== CHAR_DOT) { + if (res.length > 2) { + const lastSlashIndex = res.lastIndexOf(separator); + if (lastSlashIndex === -1) { + res = ""; + lastSegmentLength = 0; + } else { + res = res.slice(0, lastSlashIndex); + lastSegmentLength = res.length - 1 - res.lastIndexOf(separator); + } + lastSlash = i; + dots = 0; + continue; + } else if (res.length !== 0) { + res = ""; + lastSegmentLength = 0; + lastSlash = i; + dots = 0; + continue; + } + } + if (allowAboveRoot) { + res += res.length > 0 ? `${separator}..` : ".."; + lastSegmentLength = 2; + } + } else { + if (res.length > 0) { + res += `${separator}${path.slice(lastSlash + 1, i)}`; + } else { + res = path.slice(lastSlash + 1, i); + } + lastSegmentLength = i - lastSlash - 1; + } + lastSlash = i; + dots = 0; + } else if (code === CHAR_DOT && dots !== -1) { + ++dots; + } else { + dots = -1; + } + } + return res; +} +function _format2(sep2, pathObject) { + validateObject(pathObject, "pathObject"); + const dir = pathObject.dir || pathObject.root; + const base = pathObject.base || `${pathObject.name || ""}${pathObject.ext || ""}`; + if (!dir) { + return base; + } + return dir === pathObject.root ? `${dir}${base}` : `${dir}${sep2}${base}`; +} +var CHAR_UPPERCASE_A, CHAR_LOWERCASE_A, CHAR_UPPERCASE_Z, CHAR_LOWERCASE_Z, CHAR_DOT, CHAR_FORWARD_SLASH, CHAR_BACKWARD_SLASH, CHAR_COLON, CHAR_QUESTION_MARK, ErrorInvalidArgType, platformIsWin32, win32, posixCwd, posix, normalize, resolve, relative, dirname, basename, extname, sep; +var init_path = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/path.js"() { + init_process(); + CHAR_UPPERCASE_A = 65; + CHAR_LOWERCASE_A = 97; + CHAR_UPPERCASE_Z = 90; + CHAR_LOWERCASE_Z = 122; + CHAR_DOT = 46; + CHAR_FORWARD_SLASH = 47; + CHAR_BACKWARD_SLASH = 92; + CHAR_COLON = 58; + CHAR_QUESTION_MARK = 63; + ErrorInvalidArgType = class extends Error { + constructor(name, expected, actual) { + let determiner; + if (typeof expected === "string" && expected.indexOf("not ") === 0) { + determiner = "must not be"; + expected = expected.replace(/^not /, ""); + } else { + determiner = "must be"; + } + const type = name.indexOf(".") !== -1 ? "property" : "argument"; + let msg = `The "${name}" ${type} ${determiner} of type ${expected}`; + msg += `. Received type ${typeof actual}`; + super(msg); + this.code = "ERR_INVALID_ARG_TYPE"; + } + }; + platformIsWin32 = platform === "win32"; + win32 = { + // path.resolve([from ...], to) + resolve(...pathSegments) { + let resolvedDevice = ""; + let resolvedTail = ""; + let resolvedAbsolute = false; + for (let i = pathSegments.length - 1; i >= -1; i--) { + let path; + if (i >= 0) { + path = pathSegments[i]; + validateString(path, "path"); + if (path.length === 0) { + continue; + } + } else if (resolvedDevice.length === 0) { + path = cwd(); + } else { + path = env[`=${resolvedDevice}`] || cwd(); + if (path === void 0 || path.slice(0, 2).toLowerCase() !== resolvedDevice.toLowerCase() && path.charCodeAt(2) === CHAR_BACKWARD_SLASH) { + path = `${resolvedDevice}\\`; + } + } + const len = path.length; + let rootEnd = 0; + let device = ""; + let isAbsolute = false; + const code = path.charCodeAt(0); + if (len === 1) { + if (isPathSeparator(code)) { + rootEnd = 1; + isAbsolute = true; + } + } else if (isPathSeparator(code)) { + isAbsolute = true; + if (isPathSeparator(path.charCodeAt(1))) { + let j = 2; + let last = j; + while (j < len && !isPathSeparator(path.charCodeAt(j))) { + j++; + } + if (j < len && j !== last) { + const firstPart = path.slice(last, j); + last = j; + while (j < len && isPathSeparator(path.charCodeAt(j))) { + j++; + } + if (j < len && j !== last) { + last = j; + while (j < len && !isPathSeparator(path.charCodeAt(j))) { + j++; + } + if (j === len || j !== last) { + device = `\\\\${firstPart}\\${path.slice(last, j)}`; + rootEnd = j; + } + } + } + } else { + rootEnd = 1; + } + } else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) { + device = path.slice(0, 2); + rootEnd = 2; + if (len > 2 && isPathSeparator(path.charCodeAt(2))) { + isAbsolute = true; + rootEnd = 3; + } + } + if (device.length > 0) { + if (resolvedDevice.length > 0) { + if (device.toLowerCase() !== resolvedDevice.toLowerCase()) { + continue; + } + } else { + resolvedDevice = device; + } + } + if (resolvedAbsolute) { + if (resolvedDevice.length > 0) { + break; + } + } else { + resolvedTail = `${path.slice(rootEnd)}\\${resolvedTail}`; + resolvedAbsolute = isAbsolute; + if (isAbsolute && resolvedDevice.length > 0) { + break; + } + } + } + resolvedTail = normalizeString(resolvedTail, !resolvedAbsolute, "\\", isPathSeparator); + return resolvedAbsolute ? `${resolvedDevice}\\${resolvedTail}` : `${resolvedDevice}${resolvedTail}` || "."; + }, + normalize(path) { + validateString(path, "path"); + const len = path.length; + if (len === 0) { + return "."; + } + let rootEnd = 0; + let device; + let isAbsolute = false; + const code = path.charCodeAt(0); + if (len === 1) { + return isPosixPathSeparator(code) ? "\\" : path; + } + if (isPathSeparator(code)) { + isAbsolute = true; + if (isPathSeparator(path.charCodeAt(1))) { + let j = 2; + let last = j; + while (j < len && !isPathSeparator(path.charCodeAt(j))) { + j++; + } + if (j < len && j !== last) { + const firstPart = path.slice(last, j); + last = j; + while (j < len && isPathSeparator(path.charCodeAt(j))) { + j++; + } + if (j < len && j !== last) { + last = j; + while (j < len && !isPathSeparator(path.charCodeAt(j))) { + j++; + } + if (j === len) { + return `\\\\${firstPart}\\${path.slice(last)}\\`; + } + if (j !== last) { + device = `\\\\${firstPart}\\${path.slice(last, j)}`; + rootEnd = j; + } + } + } + } else { + rootEnd = 1; + } + } else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) { + device = path.slice(0, 2); + rootEnd = 2; + if (len > 2 && isPathSeparator(path.charCodeAt(2))) { + isAbsolute = true; + rootEnd = 3; + } + } + let tail3 = rootEnd < len ? normalizeString(path.slice(rootEnd), !isAbsolute, "\\", isPathSeparator) : ""; + if (tail3.length === 0 && !isAbsolute) { + tail3 = "."; + } + if (tail3.length > 0 && isPathSeparator(path.charCodeAt(len - 1))) { + tail3 += "\\"; + } + if (device === void 0) { + return isAbsolute ? `\\${tail3}` : tail3; + } + return isAbsolute ? `${device}\\${tail3}` : `${device}${tail3}`; + }, + isAbsolute(path) { + validateString(path, "path"); + const len = path.length; + if (len === 0) { + return false; + } + const code = path.charCodeAt(0); + return isPathSeparator(code) || // Possible device root + len > 2 && isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON && isPathSeparator(path.charCodeAt(2)); + }, + join(...paths) { + if (paths.length === 0) { + return "."; + } + let joined; + let firstPart; + for (let i = 0; i < paths.length; ++i) { + const arg = paths[i]; + validateString(arg, "path"); + if (arg.length > 0) { + if (joined === void 0) { + joined = firstPart = arg; + } else { + joined += `\\${arg}`; + } + } + } + if (joined === void 0) { + return "."; + } + let needsReplace = true; + let slashCount = 0; + if (typeof firstPart === "string" && isPathSeparator(firstPart.charCodeAt(0))) { + ++slashCount; + const firstLen = firstPart.length; + if (firstLen > 1 && isPathSeparator(firstPart.charCodeAt(1))) { + ++slashCount; + if (firstLen > 2) { + if (isPathSeparator(firstPart.charCodeAt(2))) { + ++slashCount; + } else { + needsReplace = false; + } + } + } + } + if (needsReplace) { + while (slashCount < joined.length && isPathSeparator(joined.charCodeAt(slashCount))) { + slashCount++; + } + if (slashCount >= 2) { + joined = `\\${joined.slice(slashCount)}`; + } + } + return win32.normalize(joined); + }, + // It will solve the relative path from `from` to `to`, for instance: + // from = 'C:\\orandea\\test\\aaa' + // to = 'C:\\orandea\\impl\\bbb' + // The output of the function should be: '..\\..\\impl\\bbb' + relative(from, to) { + validateString(from, "from"); + validateString(to, "to"); + if (from === to) { + return ""; + } + const fromOrig = win32.resolve(from); + const toOrig = win32.resolve(to); + if (fromOrig === toOrig) { + return ""; + } + from = fromOrig.toLowerCase(); + to = toOrig.toLowerCase(); + if (from === to) { + return ""; + } + let fromStart = 0; + while (fromStart < from.length && from.charCodeAt(fromStart) === CHAR_BACKWARD_SLASH) { + fromStart++; + } + let fromEnd = from.length; + while (fromEnd - 1 > fromStart && from.charCodeAt(fromEnd - 1) === CHAR_BACKWARD_SLASH) { + fromEnd--; + } + const fromLen = fromEnd - fromStart; + let toStart = 0; + while (toStart < to.length && to.charCodeAt(toStart) === CHAR_BACKWARD_SLASH) { + toStart++; + } + let toEnd = to.length; + while (toEnd - 1 > toStart && to.charCodeAt(toEnd - 1) === CHAR_BACKWARD_SLASH) { + toEnd--; + } + const toLen = toEnd - toStart; + const length = fromLen < toLen ? fromLen : toLen; + let lastCommonSep = -1; + let i = 0; + for (; i < length; i++) { + const fromCode = from.charCodeAt(fromStart + i); + if (fromCode !== to.charCodeAt(toStart + i)) { + break; + } else if (fromCode === CHAR_BACKWARD_SLASH) { + lastCommonSep = i; + } + } + if (i !== length) { + if (lastCommonSep === -1) { + return toOrig; + } + } else { + if (toLen > length) { + if (to.charCodeAt(toStart + i) === CHAR_BACKWARD_SLASH) { + return toOrig.slice(toStart + i + 1); + } + if (i === 2) { + return toOrig.slice(toStart + i); + } + } + if (fromLen > length) { + if (from.charCodeAt(fromStart + i) === CHAR_BACKWARD_SLASH) { + lastCommonSep = i; + } else if (i === 2) { + lastCommonSep = 3; + } + } + if (lastCommonSep === -1) { + lastCommonSep = 0; + } + } + let out = ""; + for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) { + if (i === fromEnd || from.charCodeAt(i) === CHAR_BACKWARD_SLASH) { + out += out.length === 0 ? ".." : "\\.."; + } + } + toStart += lastCommonSep; + if (out.length > 0) { + return `${out}${toOrig.slice(toStart, toEnd)}`; + } + if (toOrig.charCodeAt(toStart) === CHAR_BACKWARD_SLASH) { + ++toStart; + } + return toOrig.slice(toStart, toEnd); + }, + toNamespacedPath(path) { + if (typeof path !== "string" || path.length === 0) { + return path; + } + const resolvedPath = win32.resolve(path); + if (resolvedPath.length <= 2) { + return path; + } + if (resolvedPath.charCodeAt(0) === CHAR_BACKWARD_SLASH) { + if (resolvedPath.charCodeAt(1) === CHAR_BACKWARD_SLASH) { + const code = resolvedPath.charCodeAt(2); + if (code !== CHAR_QUESTION_MARK && code !== CHAR_DOT) { + return `\\\\?\\UNC\\${resolvedPath.slice(2)}`; + } + } + } else if (isWindowsDeviceRoot(resolvedPath.charCodeAt(0)) && resolvedPath.charCodeAt(1) === CHAR_COLON && resolvedPath.charCodeAt(2) === CHAR_BACKWARD_SLASH) { + return `\\\\?\\${resolvedPath}`; + } + return path; + }, + dirname(path) { + validateString(path, "path"); + const len = path.length; + if (len === 0) { + return "."; + } + let rootEnd = -1; + let offset = 0; + const code = path.charCodeAt(0); + if (len === 1) { + return isPathSeparator(code) ? path : "."; + } + if (isPathSeparator(code)) { + rootEnd = offset = 1; + if (isPathSeparator(path.charCodeAt(1))) { + let j = 2; + let last = j; + while (j < len && !isPathSeparator(path.charCodeAt(j))) { + j++; + } + if (j < len && j !== last) { + last = j; + while (j < len && isPathSeparator(path.charCodeAt(j))) { + j++; + } + if (j < len && j !== last) { + last = j; + while (j < len && !isPathSeparator(path.charCodeAt(j))) { + j++; + } + if (j === len) { + return path; + } + if (j !== last) { + rootEnd = offset = j + 1; + } + } + } + } + } else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) { + rootEnd = len > 2 && isPathSeparator(path.charCodeAt(2)) ? 3 : 2; + offset = rootEnd; + } + let end = -1; + let matchedSlash = true; + for (let i = len - 1; i >= offset; --i) { + if (isPathSeparator(path.charCodeAt(i))) { + if (!matchedSlash) { + end = i; + break; + } + } else { + matchedSlash = false; + } + } + if (end === -1) { + if (rootEnd === -1) { + return "."; + } + end = rootEnd; + } + return path.slice(0, end); + }, + basename(path, ext) { + if (ext !== void 0) { + validateString(ext, "ext"); + } + validateString(path, "path"); + let start = 0; + let end = -1; + let matchedSlash = true; + let i; + if (path.length >= 2 && isWindowsDeviceRoot(path.charCodeAt(0)) && path.charCodeAt(1) === CHAR_COLON) { + start = 2; + } + if (ext !== void 0 && ext.length > 0 && ext.length <= path.length) { + if (ext === path) { + return ""; + } + let extIdx = ext.length - 1; + let firstNonSlashEnd = -1; + for (i = path.length - 1; i >= start; --i) { + const code = path.charCodeAt(i); + if (isPathSeparator(code)) { + if (!matchedSlash) { + start = i + 1; + break; + } + } else { + if (firstNonSlashEnd === -1) { + matchedSlash = false; + firstNonSlashEnd = i + 1; + } + if (extIdx >= 0) { + if (code === ext.charCodeAt(extIdx)) { + if (--extIdx === -1) { + end = i; + } + } else { + extIdx = -1; + end = firstNonSlashEnd; + } + } + } + } + if (start === end) { + end = firstNonSlashEnd; + } else if (end === -1) { + end = path.length; + } + return path.slice(start, end); + } + for (i = path.length - 1; i >= start; --i) { + if (isPathSeparator(path.charCodeAt(i))) { + if (!matchedSlash) { + start = i + 1; + break; + } + } else if (end === -1) { + matchedSlash = false; + end = i + 1; + } + } + if (end === -1) { + return ""; + } + return path.slice(start, end); + }, + extname(path) { + validateString(path, "path"); + let start = 0; + let startDot = -1; + let startPart = 0; + let end = -1; + let matchedSlash = true; + let preDotState = 0; + if (path.length >= 2 && path.charCodeAt(1) === CHAR_COLON && isWindowsDeviceRoot(path.charCodeAt(0))) { + start = startPart = 2; + } + for (let i = path.length - 1; i >= start; --i) { + const code = path.charCodeAt(i); + if (isPathSeparator(code)) { + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + matchedSlash = false; + end = i + 1; + } + if (code === CHAR_DOT) { + if (startDot === -1) { + startDot = i; + } else if (preDotState !== 1) { + preDotState = 1; + } + } else if (startDot !== -1) { + preDotState = -1; + } + } + if (startDot === -1 || end === -1 || // We saw a non-dot character immediately before the dot + preDotState === 0 || // The (right-most) trimmed path component is exactly '..' + preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) { + return ""; + } + return path.slice(startDot, end); + }, + format: _format2.bind(null, "\\"), + parse(path) { + validateString(path, "path"); + const ret = { root: "", dir: "", base: "", ext: "", name: "" }; + if (path.length === 0) { + return ret; + } + const len = path.length; + let rootEnd = 0; + let code = path.charCodeAt(0); + if (len === 1) { + if (isPathSeparator(code)) { + ret.root = ret.dir = path; + return ret; + } + ret.base = ret.name = path; + return ret; + } + if (isPathSeparator(code)) { + rootEnd = 1; + if (isPathSeparator(path.charCodeAt(1))) { + let j = 2; + let last = j; + while (j < len && !isPathSeparator(path.charCodeAt(j))) { + j++; + } + if (j < len && j !== last) { + last = j; + while (j < len && isPathSeparator(path.charCodeAt(j))) { + j++; + } + if (j < len && j !== last) { + last = j; + while (j < len && !isPathSeparator(path.charCodeAt(j))) { + j++; + } + if (j === len) { + rootEnd = j; + } else if (j !== last) { + rootEnd = j + 1; + } + } + } + } + } else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) { + if (len <= 2) { + ret.root = ret.dir = path; + return ret; + } + rootEnd = 2; + if (isPathSeparator(path.charCodeAt(2))) { + if (len === 3) { + ret.root = ret.dir = path; + return ret; + } + rootEnd = 3; + } + } + if (rootEnd > 0) { + ret.root = path.slice(0, rootEnd); + } + let startDot = -1; + let startPart = rootEnd; + let end = -1; + let matchedSlash = true; + let i = path.length - 1; + let preDotState = 0; + for (; i >= rootEnd; --i) { + code = path.charCodeAt(i); + if (isPathSeparator(code)) { + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + matchedSlash = false; + end = i + 1; + } + if (code === CHAR_DOT) { + if (startDot === -1) { + startDot = i; + } else if (preDotState !== 1) { + preDotState = 1; + } + } else if (startDot !== -1) { + preDotState = -1; + } + } + if (end !== -1) { + if (startDot === -1 || // We saw a non-dot character immediately before the dot + preDotState === 0 || // The (right-most) trimmed path component is exactly '..' + preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) { + ret.base = ret.name = path.slice(startPart, end); + } else { + ret.name = path.slice(startPart, startDot); + ret.base = path.slice(startPart, end); + ret.ext = path.slice(startDot, end); + } + } + if (startPart > 0 && startPart !== rootEnd) { + ret.dir = path.slice(0, startPart - 1); + } else { + ret.dir = ret.root; + } + return ret; + }, + sep: "\\", + delimiter: ";", + win32: null, + posix: null + }; + posixCwd = (() => { + if (platformIsWin32) { + const regexp = /\\/g; + return () => { + const cwd2 = cwd().replace(regexp, "/"); + return cwd2.slice(cwd2.indexOf("/")); + }; + } + return () => cwd(); + })(); + posix = { + // path.resolve([from ...], to) + resolve(...pathSegments) { + let resolvedPath = ""; + let resolvedAbsolute = false; + for (let i = pathSegments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + const path = i >= 0 ? pathSegments[i] : posixCwd(); + validateString(path, "path"); + if (path.length === 0) { + continue; + } + resolvedPath = `${path}/${resolvedPath}`; + resolvedAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH; + } + resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, "/", isPosixPathSeparator); + if (resolvedAbsolute) { + return `/${resolvedPath}`; + } + return resolvedPath.length > 0 ? resolvedPath : "."; + }, + normalize(path) { + validateString(path, "path"); + if (path.length === 0) { + return "."; + } + const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH; + const trailingSeparator = path.charCodeAt(path.length - 1) === CHAR_FORWARD_SLASH; + path = normalizeString(path, !isAbsolute, "/", isPosixPathSeparator); + if (path.length === 0) { + if (isAbsolute) { + return "/"; + } + return trailingSeparator ? "./" : "."; + } + if (trailingSeparator) { + path += "/"; + } + return isAbsolute ? `/${path}` : path; + }, + isAbsolute(path) { + validateString(path, "path"); + return path.length > 0 && path.charCodeAt(0) === CHAR_FORWARD_SLASH; + }, + join(...paths) { + if (paths.length === 0) { + return "."; + } + let joined; + for (let i = 0; i < paths.length; ++i) { + const arg = paths[i]; + validateString(arg, "path"); + if (arg.length > 0) { + if (joined === void 0) { + joined = arg; + } else { + joined += `/${arg}`; + } + } + } + if (joined === void 0) { + return "."; + } + return posix.normalize(joined); + }, + relative(from, to) { + validateString(from, "from"); + validateString(to, "to"); + if (from === to) { + return ""; + } + from = posix.resolve(from); + to = posix.resolve(to); + if (from === to) { + return ""; + } + const fromStart = 1; + const fromEnd = from.length; + const fromLen = fromEnd - fromStart; + const toStart = 1; + const toLen = to.length - toStart; + const length = fromLen < toLen ? fromLen : toLen; + let lastCommonSep = -1; + let i = 0; + for (; i < length; i++) { + const fromCode = from.charCodeAt(fromStart + i); + if (fromCode !== to.charCodeAt(toStart + i)) { + break; + } else if (fromCode === CHAR_FORWARD_SLASH) { + lastCommonSep = i; + } + } + if (i === length) { + if (toLen > length) { + if (to.charCodeAt(toStart + i) === CHAR_FORWARD_SLASH) { + return to.slice(toStart + i + 1); + } + if (i === 0) { + return to.slice(toStart + i); + } + } else if (fromLen > length) { + if (from.charCodeAt(fromStart + i) === CHAR_FORWARD_SLASH) { + lastCommonSep = i; + } else if (i === 0) { + lastCommonSep = 0; + } + } + } + let out = ""; + for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) { + if (i === fromEnd || from.charCodeAt(i) === CHAR_FORWARD_SLASH) { + out += out.length === 0 ? ".." : "/.."; + } + } + return `${out}${to.slice(toStart + lastCommonSep)}`; + }, + toNamespacedPath(path) { + return path; + }, + dirname(path) { + validateString(path, "path"); + if (path.length === 0) { + return "."; + } + const hasRoot = path.charCodeAt(0) === CHAR_FORWARD_SLASH; + let end = -1; + let matchedSlash = true; + for (let i = path.length - 1; i >= 1; --i) { + if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) { + if (!matchedSlash) { + end = i; + break; + } + } else { + matchedSlash = false; + } + } + if (end === -1) { + return hasRoot ? "/" : "."; + } + if (hasRoot && end === 1) { + return "//"; + } + return path.slice(0, end); + }, + basename(path, ext) { + if (ext !== void 0) { + validateString(ext, "ext"); + } + validateString(path, "path"); + let start = 0; + let end = -1; + let matchedSlash = true; + let i; + if (ext !== void 0 && ext.length > 0 && ext.length <= path.length) { + if (ext === path) { + return ""; + } + let extIdx = ext.length - 1; + let firstNonSlashEnd = -1; + for (i = path.length - 1; i >= 0; --i) { + const code = path.charCodeAt(i); + if (code === CHAR_FORWARD_SLASH) { + if (!matchedSlash) { + start = i + 1; + break; + } + } else { + if (firstNonSlashEnd === -1) { + matchedSlash = false; + firstNonSlashEnd = i + 1; + } + if (extIdx >= 0) { + if (code === ext.charCodeAt(extIdx)) { + if (--extIdx === -1) { + end = i; + } + } else { + extIdx = -1; + end = firstNonSlashEnd; + } + } + } + } + if (start === end) { + end = firstNonSlashEnd; + } else if (end === -1) { + end = path.length; + } + return path.slice(start, end); + } + for (i = path.length - 1; i >= 0; --i) { + if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) { + if (!matchedSlash) { + start = i + 1; + break; + } + } else if (end === -1) { + matchedSlash = false; + end = i + 1; + } + } + if (end === -1) { + return ""; + } + return path.slice(start, end); + }, + extname(path) { + validateString(path, "path"); + let startDot = -1; + let startPart = 0; + let end = -1; + let matchedSlash = true; + let preDotState = 0; + for (let i = path.length - 1; i >= 0; --i) { + const code = path.charCodeAt(i); + if (code === CHAR_FORWARD_SLASH) { + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + matchedSlash = false; + end = i + 1; + } + if (code === CHAR_DOT) { + if (startDot === -1) { + startDot = i; + } else if (preDotState !== 1) { + preDotState = 1; + } + } else if (startDot !== -1) { + preDotState = -1; + } + } + if (startDot === -1 || end === -1 || // We saw a non-dot character immediately before the dot + preDotState === 0 || // The (right-most) trimmed path component is exactly '..' + preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) { + return ""; + } + return path.slice(startDot, end); + }, + format: _format2.bind(null, "/"), + parse(path) { + validateString(path, "path"); + const ret = { root: "", dir: "", base: "", ext: "", name: "" }; + if (path.length === 0) { + return ret; + } + const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH; + let start; + if (isAbsolute) { + ret.root = "/"; + start = 1; + } else { + start = 0; + } + let startDot = -1; + let startPart = 0; + let end = -1; + let matchedSlash = true; + let i = path.length - 1; + let preDotState = 0; + for (; i >= start; --i) { + const code = path.charCodeAt(i); + if (code === CHAR_FORWARD_SLASH) { + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + matchedSlash = false; + end = i + 1; + } + if (code === CHAR_DOT) { + if (startDot === -1) { + startDot = i; + } else if (preDotState !== 1) { + preDotState = 1; + } + } else if (startDot !== -1) { + preDotState = -1; + } + } + if (end !== -1) { + const start2 = startPart === 0 && isAbsolute ? 1 : startPart; + if (startDot === -1 || // We saw a non-dot character immediately before the dot + preDotState === 0 || // The (right-most) trimmed path component is exactly '..' + preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) { + ret.base = ret.name = path.slice(start2, end); + } else { + ret.name = path.slice(start2, startDot); + ret.base = path.slice(start2, end); + ret.ext = path.slice(startDot, end); + } + } + if (startPart > 0) { + ret.dir = path.slice(0, startPart - 1); + } else if (isAbsolute) { + ret.dir = "/"; + } + return ret; + }, + sep: "/", + delimiter: ":", + win32: null, + posix: null + }; + posix.win32 = win32.win32 = win32; + posix.posix = win32.posix = posix; + normalize = platformIsWin32 ? win32.normalize : posix.normalize; + resolve = platformIsWin32 ? win32.resolve : posix.resolve; + relative = platformIsWin32 ? win32.relative : posix.relative; + dirname = platformIsWin32 ? win32.dirname : posix.dirname; + basename = platformIsWin32 ? win32.basename : posix.basename; + extname = platformIsWin32 ? win32.extname : posix.extname; + sep = platformIsWin32 ? win32.sep : posix.sep; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/uri.js +function _validateUri(ret, _strict) { + if (!ret.scheme && _strict) { + throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${ret.authority}", path: "${ret.path}", query: "${ret.query}", fragment: "${ret.fragment}"}`); + } + if (ret.scheme && !_schemePattern.test(ret.scheme)) { + throw new Error("[UriError]: Scheme contains illegal characters."); + } + if (ret.path) { + if (ret.authority) { + if (!_singleSlashStart.test(ret.path)) { + throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character'); + } + } else { + if (_doubleSlashStart.test(ret.path)) { + throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")'); + } + } + } +} +function _schemeFix(scheme, _strict) { + if (!scheme && !_strict) { + return "file"; + } + return scheme; +} +function _referenceResolution(scheme, path) { + switch (scheme) { + case "https": + case "http": + case "file": + if (!path) { + path = _slash; + } else if (path[0] !== _slash) { + path = _slash + path; + } + break; + } + return path; +} +function encodeURIComponentFast(uriComponent, isPath, isAuthority) { + let res = void 0; + let nativeEncodePos = -1; + for (let pos = 0; pos < uriComponent.length; pos++) { + const code = uriComponent.charCodeAt(pos); + if (code >= 97 && code <= 122 || code >= 65 && code <= 90 || code >= 48 && code <= 57 || code === 45 || code === 46 || code === 95 || code === 126 || isPath && code === 47 || isAuthority && code === 91 || isAuthority && code === 93 || isAuthority && code === 58) { + if (nativeEncodePos !== -1) { + res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos)); + nativeEncodePos = -1; + } + if (res !== void 0) { + res += uriComponent.charAt(pos); + } + } else { + if (res === void 0) { + res = uriComponent.substr(0, pos); + } + const escaped = encodeTable[code]; + if (escaped !== void 0) { + if (nativeEncodePos !== -1) { + res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos)); + nativeEncodePos = -1; + } + res += escaped; + } else if (nativeEncodePos === -1) { + nativeEncodePos = pos; + } + } + } + if (nativeEncodePos !== -1) { + res += encodeURIComponent(uriComponent.substring(nativeEncodePos)); + } + return res !== void 0 ? res : uriComponent; +} +function encodeURIComponentMinimal(path) { + let res = void 0; + for (let pos = 0; pos < path.length; pos++) { + const code = path.charCodeAt(pos); + if (code === 35 || code === 63) { + if (res === void 0) { + res = path.substr(0, pos); + } + res += encodeTable[code]; + } else { + if (res !== void 0) { + res += path[pos]; + } + } + } + return res !== void 0 ? res : path; +} +function uriToFsPath(uri, keepDriveLetterCasing) { + let value; + if (uri.authority && uri.path.length > 1 && uri.scheme === "file") { + value = `//${uri.authority}${uri.path}`; + } else if (uri.path.charCodeAt(0) === 47 && (uri.path.charCodeAt(1) >= 65 && uri.path.charCodeAt(1) <= 90 || uri.path.charCodeAt(1) >= 97 && uri.path.charCodeAt(1) <= 122) && uri.path.charCodeAt(2) === 58) { + if (!keepDriveLetterCasing) { + value = uri.path[1].toLowerCase() + uri.path.substr(2); + } else { + value = uri.path.substr(1); + } + } else { + value = uri.path; + } + if (isWindows) { + value = value.replace(/\//g, "\\"); + } + return value; +} +function _asFormatted(uri, skipEncoding) { + const encoder = !skipEncoding ? encodeURIComponentFast : encodeURIComponentMinimal; + let res = ""; + let { scheme, authority, path, query, fragment } = uri; + if (scheme) { + res += scheme; + res += ":"; + } + if (authority || scheme === "file") { + res += _slash; + res += _slash; + } + if (authority) { + let idx = authority.indexOf("@"); + if (idx !== -1) { + const userinfo = authority.substr(0, idx); + authority = authority.substr(idx + 1); + idx = userinfo.lastIndexOf(":"); + if (idx === -1) { + res += encoder(userinfo, false, false); + } else { + res += encoder(userinfo.substr(0, idx), false, false); + res += ":"; + res += encoder(userinfo.substr(idx + 1), false, true); + } + res += "@"; + } + authority = authority.toLowerCase(); + idx = authority.lastIndexOf(":"); + if (idx === -1) { + res += encoder(authority, false, true); + } else { + res += encoder(authority.substr(0, idx), false, true); + res += authority.substr(idx); + } + } + if (path) { + if (path.length >= 3 && path.charCodeAt(0) === 47 && path.charCodeAt(2) === 58) { + const code = path.charCodeAt(1); + if (code >= 65 && code <= 90) { + path = `/${String.fromCharCode(code + 32)}:${path.substr(3)}`; + } + } else if (path.length >= 2 && path.charCodeAt(1) === 58) { + const code = path.charCodeAt(0); + if (code >= 65 && code <= 90) { + path = `${String.fromCharCode(code + 32)}:${path.substr(2)}`; + } + } + res += encoder(path, true, false); + } + if (query) { + res += "?"; + res += encoder(query, false, false); + } + if (fragment) { + res += "#"; + res += !skipEncoding ? encodeURIComponentFast(fragment, false, false) : fragment; + } + return res; +} +function decodeURIComponentGraceful(str) { + try { + return decodeURIComponent(str); + } catch (_a10) { + if (str.length > 3) { + return str.substr(0, 3) + decodeURIComponentGraceful(str.substr(3)); + } else { + return str; + } + } +} +function percentDecode(str) { + if (!str.match(_rEncodedAsHex)) { + return str; + } + return str.replace(_rEncodedAsHex, (match2) => decodeURIComponentGraceful(match2)); +} +var _schemePattern, _singleSlashStart, _doubleSlashStart, _empty, _slash, _regexp, URI, _pathSepMarker, Uri, encodeTable, _rEncodedAsHex; +var init_uri = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/uri.js"() { + init_path(); + init_platform(); + _schemePattern = /^\w[\w\d+.-]*$/; + _singleSlashStart = /^\//; + _doubleSlashStart = /^\/\//; + _empty = ""; + _slash = "/"; + _regexp = /^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/; + URI = class _URI { + static isUri(thing) { + if (thing instanceof _URI) { + return true; + } + if (!thing) { + return false; + } + return typeof thing.authority === "string" && typeof thing.fragment === "string" && typeof thing.path === "string" && typeof thing.query === "string" && typeof thing.scheme === "string" && typeof thing.fsPath === "string" && typeof thing.with === "function" && typeof thing.toString === "function"; + } + /** + * @internal + */ + constructor(schemeOrData, authority, path, query, fragment, _strict = false) { + if (typeof schemeOrData === "object") { + this.scheme = schemeOrData.scheme || _empty; + this.authority = schemeOrData.authority || _empty; + this.path = schemeOrData.path || _empty; + this.query = schemeOrData.query || _empty; + this.fragment = schemeOrData.fragment || _empty; + } else { + this.scheme = _schemeFix(schemeOrData, _strict); + this.authority = authority || _empty; + this.path = _referenceResolution(this.scheme, path || _empty); + this.query = query || _empty; + this.fragment = fragment || _empty; + _validateUri(this, _strict); + } + } + // ---- filesystem path ----------------------- + /** + * Returns a string representing the corresponding file system path of this URI. + * Will handle UNC paths, normalizes windows drive letters to lower-case, and uses the + * platform specific path separator. + * + * * Will *not* validate the path for invalid characters and semantics. + * * Will *not* look at the scheme of this URI. + * * The result shall *not* be used for display purposes but for accessing a file on disk. + * + * + * The *difference* to `URI#path` is the use of the platform specific separator and the handling + * of UNC paths. See the below sample of a file-uri with an authority (UNC path). + * + * ```ts + const u = URI.parse('file://server/c$/folder/file.txt') + u.authority === 'server' + u.path === '/shares/c$/file.txt' + u.fsPath === '\\server\c$\folder\file.txt' + ``` + * + * Using `URI#path` to read a file (using fs-apis) would not be enough because parts of the path, + * namely the server name, would be missing. Therefore `URI#fsPath` exists - it's sugar to ease working + * with URIs that represent files on disk (`file` scheme). + */ + get fsPath() { + return uriToFsPath(this, false); + } + // ---- modify to new ------------------------- + with(change) { + if (!change) { + return this; + } + let { scheme, authority, path, query, fragment } = change; + if (scheme === void 0) { + scheme = this.scheme; + } else if (scheme === null) { + scheme = _empty; + } + if (authority === void 0) { + authority = this.authority; + } else if (authority === null) { + authority = _empty; + } + if (path === void 0) { + path = this.path; + } else if (path === null) { + path = _empty; + } + if (query === void 0) { + query = this.query; + } else if (query === null) { + query = _empty; + } + if (fragment === void 0) { + fragment = this.fragment; + } else if (fragment === null) { + fragment = _empty; + } + if (scheme === this.scheme && authority === this.authority && path === this.path && query === this.query && fragment === this.fragment) { + return this; + } + return new Uri(scheme, authority, path, query, fragment); + } + // ---- parse & validate ------------------------ + /** + * Creates a new URI from a string, e.g. `http://www.example.com/some/path`, + * `file:///usr/home`, or `scheme:with/path`. + * + * @param value A string which represents an URI (see `URI#toString`). + */ + static parse(value, _strict = false) { + const match2 = _regexp.exec(value); + if (!match2) { + return new Uri(_empty, _empty, _empty, _empty, _empty); + } + return new Uri(match2[2] || _empty, percentDecode(match2[4] || _empty), percentDecode(match2[5] || _empty), percentDecode(match2[7] || _empty), percentDecode(match2[9] || _empty), _strict); + } + /** + * Creates a new URI from a file system path, e.g. `c:\my\files`, + * `/usr/home`, or `\\server\share\some\path`. + * + * The *difference* between `URI#parse` and `URI#file` is that the latter treats the argument + * as path, not as stringified-uri. E.g. `URI.file(path)` is **not the same as** + * `URI.parse('file://' + path)` because the path might contain characters that are + * interpreted (# and ?). See the following sample: + * ```ts + const good = URI.file('/coding/c#/project1'); + good.scheme === 'file'; + good.path === '/coding/c#/project1'; + good.fragment === ''; + const bad = URI.parse('file://' + '/coding/c#/project1'); + bad.scheme === 'file'; + bad.path === '/coding/c'; // path is now broken + bad.fragment === '/project1'; + ``` + * + * @param path A file system path (see `URI#fsPath`) + */ + static file(path) { + let authority = _empty; + if (isWindows) { + path = path.replace(/\\/g, _slash); + } + if (path[0] === _slash && path[1] === _slash) { + const idx = path.indexOf(_slash, 2); + if (idx === -1) { + authority = path.substring(2); + path = _slash; + } else { + authority = path.substring(2, idx); + path = path.substring(idx) || _slash; + } + } + return new Uri("file", authority, path, _empty, _empty); + } + /** + * Creates new URI from uri components. + * + * Unless `strict` is `true` the scheme is defaults to be `file`. This function performs + * validation and should be used for untrusted uri components retrieved from storage, + * user input, command arguments etc + */ + static from(components, strict) { + const result = new Uri(components.scheme, components.authority, components.path, components.query, components.fragment, strict); + return result; + } + /** + * Join a URI path with path fragments and normalizes the resulting path. + * + * @param uri The input URI. + * @param pathFragment The path fragment to add to the URI path. + * @returns The resulting URI. + */ + static joinPath(uri, ...pathFragment) { + if (!uri.path) { + throw new Error(`[UriError]: cannot call joinPath on URI without path`); + } + let newPath; + if (isWindows && uri.scheme === "file") { + newPath = _URI.file(win32.join(uriToFsPath(uri, true), ...pathFragment)).path; + } else { + newPath = posix.join(uri.path, ...pathFragment); + } + return uri.with({ path: newPath }); + } + // ---- printing/externalize --------------------------- + /** + * Creates a string representation for this URI. It's guaranteed that calling + * `URI.parse` with the result of this function creates an URI which is equal + * to this URI. + * + * * The result shall *not* be used for display purposes but for externalization or transport. + * * The result will be encoded using the percentage encoding and encoding happens mostly + * ignore the scheme-specific encoding rules. + * + * @param skipEncoding Do not encode the result, default is `false` + */ + toString(skipEncoding = false) { + return _asFormatted(this, skipEncoding); + } + toJSON() { + return this; + } + static revive(data) { + var _a10, _b4; + if (!data) { + return data; + } else if (data instanceof _URI) { + return data; + } else { + const result = new Uri(data); + result._formatted = (_a10 = data.external) !== null && _a10 !== void 0 ? _a10 : null; + result._fsPath = data._sep === _pathSepMarker ? (_b4 = data.fsPath) !== null && _b4 !== void 0 ? _b4 : null : null; + return result; + } + } + }; + _pathSepMarker = isWindows ? 1 : void 0; + Uri = class extends URI { + constructor() { + super(...arguments); + this._formatted = null; + this._fsPath = null; + } + get fsPath() { + if (!this._fsPath) { + this._fsPath = uriToFsPath(this, false); + } + return this._fsPath; + } + toString(skipEncoding = false) { + if (!skipEncoding) { + if (!this._formatted) { + this._formatted = _asFormatted(this, false); + } + return this._formatted; + } else { + return _asFormatted(this, true); + } + } + toJSON() { + const res = { + $mid: 1 + /* MarshalledId.Uri */ + }; + if (this._fsPath) { + res.fsPath = this._fsPath; + res._sep = _pathSepMarker; + } + if (this._formatted) { + res.external = this._formatted; + } + if (this.path) { + res.path = this.path; + } + if (this.scheme) { + res.scheme = this.scheme; + } + if (this.authority) { + res.authority = this.authority; + } + if (this.query) { + res.query = this.query; + } + if (this.fragment) { + res.fragment = this.fragment; + } + return res; + } + }; + encodeTable = { + [ + 58 + /* CharCode.Colon */ + ]: "%3A", + // gen-delims + [ + 47 + /* CharCode.Slash */ + ]: "%2F", + [ + 63 + /* CharCode.QuestionMark */ + ]: "%3F", + [ + 35 + /* CharCode.Hash */ + ]: "%23", + [ + 91 + /* CharCode.OpenSquareBracket */ + ]: "%5B", + [ + 93 + /* CharCode.CloseSquareBracket */ + ]: "%5D", + [ + 64 + /* CharCode.AtSign */ + ]: "%40", + [ + 33 + /* CharCode.ExclamationMark */ + ]: "%21", + // sub-delims + [ + 36 + /* CharCode.DollarSign */ + ]: "%24", + [ + 38 + /* CharCode.Ampersand */ + ]: "%26", + [ + 39 + /* CharCode.SingleQuote */ + ]: "%27", + [ + 40 + /* CharCode.OpenParen */ + ]: "%28", + [ + 41 + /* CharCode.CloseParen */ + ]: "%29", + [ + 42 + /* CharCode.Asterisk */ + ]: "%2A", + [ + 43 + /* CharCode.Plus */ + ]: "%2B", + [ + 44 + /* CharCode.Comma */ + ]: "%2C", + [ + 59 + /* CharCode.Semicolon */ + ]: "%3B", + [ + 61 + /* CharCode.Equals */ + ]: "%3D", + [ + 32 + /* CharCode.Space */ + ]: "%20" + }; + _rEncodedAsHex = /(%[0-9A-Za-z][0-9A-Za-z])+/g; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/position.js +var Position; +var init_position = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/position.js"() { + Position = class _Position { + constructor(lineNumber, column) { + this.lineNumber = lineNumber; + this.column = column; + } + /** + * Create a new position from this position. + * + * @param newLineNumber new line number + * @param newColumn new column + */ + with(newLineNumber = this.lineNumber, newColumn = this.column) { + if (newLineNumber === this.lineNumber && newColumn === this.column) { + return this; + } else { + return new _Position(newLineNumber, newColumn); + } + } + /** + * Derive a new position from this position. + * + * @param deltaLineNumber line number delta + * @param deltaColumn column delta + */ + delta(deltaLineNumber = 0, deltaColumn = 0) { + return this.with(this.lineNumber + deltaLineNumber, this.column + deltaColumn); + } + /** + * Test if this position equals other position + */ + equals(other) { + return _Position.equals(this, other); + } + /** + * Test if position `a` equals position `b` + */ + static equals(a3, b) { + if (!a3 && !b) { + return true; + } + return !!a3 && !!b && a3.lineNumber === b.lineNumber && a3.column === b.column; + } + /** + * Test if this position is before other position. + * If the two positions are equal, the result will be false. + */ + isBefore(other) { + return _Position.isBefore(this, other); + } + /** + * Test if position `a` is before position `b`. + * If the two positions are equal, the result will be false. + */ + static isBefore(a3, b) { + if (a3.lineNumber < b.lineNumber) { + return true; + } + if (b.lineNumber < a3.lineNumber) { + return false; + } + return a3.column < b.column; + } + /** + * Test if this position is before other position. + * If the two positions are equal, the result will be true. + */ + isBeforeOrEqual(other) { + return _Position.isBeforeOrEqual(this, other); + } + /** + * Test if position `a` is before position `b`. + * If the two positions are equal, the result will be true. + */ + static isBeforeOrEqual(a3, b) { + if (a3.lineNumber < b.lineNumber) { + return true; + } + if (b.lineNumber < a3.lineNumber) { + return false; + } + return a3.column <= b.column; + } + /** + * A function that compares positions, useful for sorting + */ + static compare(a3, b) { + const aLineNumber = a3.lineNumber | 0; + const bLineNumber = b.lineNumber | 0; + if (aLineNumber === bLineNumber) { + const aColumn = a3.column | 0; + const bColumn = b.column | 0; + return aColumn - bColumn; + } + return aLineNumber - bLineNumber; + } + /** + * Clone this position. + */ + clone() { + return new _Position(this.lineNumber, this.column); + } + /** + * Convert to a human-readable representation. + */ + toString() { + return "(" + this.lineNumber + "," + this.column + ")"; + } + // --- + /** + * Create a `Position` from an `IPosition`. + */ + static lift(pos) { + return new _Position(pos.lineNumber, pos.column); + } + /** + * Test if `obj` is an `IPosition`. + */ + static isIPosition(obj) { + return obj && typeof obj.lineNumber === "number" && typeof obj.column === "number"; + } + toJSON() { + return { + lineNumber: this.lineNumber, + column: this.column + }; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/range.js +var Range; +var init_range = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/range.js"() { + init_position(); + Range = class _Range { + constructor(startLineNumber, startColumn, endLineNumber, endColumn) { + if (startLineNumber > endLineNumber || startLineNumber === endLineNumber && startColumn > endColumn) { + this.startLineNumber = endLineNumber; + this.startColumn = endColumn; + this.endLineNumber = startLineNumber; + this.endColumn = startColumn; + } else { + this.startLineNumber = startLineNumber; + this.startColumn = startColumn; + this.endLineNumber = endLineNumber; + this.endColumn = endColumn; + } + } + /** + * Test if this range is empty. + */ + isEmpty() { + return _Range.isEmpty(this); + } + /** + * Test if `range` is empty. + */ + static isEmpty(range2) { + return range2.startLineNumber === range2.endLineNumber && range2.startColumn === range2.endColumn; + } + /** + * Test if position is in this range. If the position is at the edges, will return true. + */ + containsPosition(position) { + return _Range.containsPosition(this, position); + } + /** + * Test if `position` is in `range`. If the position is at the edges, will return true. + */ + static containsPosition(range2, position) { + if (position.lineNumber < range2.startLineNumber || position.lineNumber > range2.endLineNumber) { + return false; + } + if (position.lineNumber === range2.startLineNumber && position.column < range2.startColumn) { + return false; + } + if (position.lineNumber === range2.endLineNumber && position.column > range2.endColumn) { + return false; + } + return true; + } + /** + * Test if `position` is in `range`. If the position is at the edges, will return false. + * @internal + */ + static strictContainsPosition(range2, position) { + if (position.lineNumber < range2.startLineNumber || position.lineNumber > range2.endLineNumber) { + return false; + } + if (position.lineNumber === range2.startLineNumber && position.column <= range2.startColumn) { + return false; + } + if (position.lineNumber === range2.endLineNumber && position.column >= range2.endColumn) { + return false; + } + return true; + } + /** + * Test if range is in this range. If the range is equal to this range, will return true. + */ + containsRange(range2) { + return _Range.containsRange(this, range2); + } + /** + * Test if `otherRange` is in `range`. If the ranges are equal, will return true. + */ + static containsRange(range2, otherRange) { + if (otherRange.startLineNumber < range2.startLineNumber || otherRange.endLineNumber < range2.startLineNumber) { + return false; + } + if (otherRange.startLineNumber > range2.endLineNumber || otherRange.endLineNumber > range2.endLineNumber) { + return false; + } + if (otherRange.startLineNumber === range2.startLineNumber && otherRange.startColumn < range2.startColumn) { + return false; + } + if (otherRange.endLineNumber === range2.endLineNumber && otherRange.endColumn > range2.endColumn) { + return false; + } + return true; + } + /** + * Test if `range` is strictly in this range. `range` must start after and end before this range for the result to be true. + */ + strictContainsRange(range2) { + return _Range.strictContainsRange(this, range2); + } + /** + * Test if `otherRange` is strictly in `range` (must start after, and end before). If the ranges are equal, will return false. + */ + static strictContainsRange(range2, otherRange) { + if (otherRange.startLineNumber < range2.startLineNumber || otherRange.endLineNumber < range2.startLineNumber) { + return false; + } + if (otherRange.startLineNumber > range2.endLineNumber || otherRange.endLineNumber > range2.endLineNumber) { + return false; + } + if (otherRange.startLineNumber === range2.startLineNumber && otherRange.startColumn <= range2.startColumn) { + return false; + } + if (otherRange.endLineNumber === range2.endLineNumber && otherRange.endColumn >= range2.endColumn) { + return false; + } + return true; + } + /** + * A reunion of the two ranges. + * The smallest position will be used as the start point, and the largest one as the end point. + */ + plusRange(range2) { + return _Range.plusRange(this, range2); + } + /** + * A reunion of the two ranges. + * The smallest position will be used as the start point, and the largest one as the end point. + */ + static plusRange(a3, b) { + let startLineNumber; + let startColumn; + let endLineNumber; + let endColumn; + if (b.startLineNumber < a3.startLineNumber) { + startLineNumber = b.startLineNumber; + startColumn = b.startColumn; + } else if (b.startLineNumber === a3.startLineNumber) { + startLineNumber = b.startLineNumber; + startColumn = Math.min(b.startColumn, a3.startColumn); + } else { + startLineNumber = a3.startLineNumber; + startColumn = a3.startColumn; + } + if (b.endLineNumber > a3.endLineNumber) { + endLineNumber = b.endLineNumber; + endColumn = b.endColumn; + } else if (b.endLineNumber === a3.endLineNumber) { + endLineNumber = b.endLineNumber; + endColumn = Math.max(b.endColumn, a3.endColumn); + } else { + endLineNumber = a3.endLineNumber; + endColumn = a3.endColumn; + } + return new _Range(startLineNumber, startColumn, endLineNumber, endColumn); + } + /** + * A intersection of the two ranges. + */ + intersectRanges(range2) { + return _Range.intersectRanges(this, range2); + } + /** + * A intersection of the two ranges. + */ + static intersectRanges(a3, b) { + let resultStartLineNumber = a3.startLineNumber; + let resultStartColumn = a3.startColumn; + let resultEndLineNumber = a3.endLineNumber; + let resultEndColumn = a3.endColumn; + const otherStartLineNumber = b.startLineNumber; + const otherStartColumn = b.startColumn; + const otherEndLineNumber = b.endLineNumber; + const otherEndColumn = b.endColumn; + if (resultStartLineNumber < otherStartLineNumber) { + resultStartLineNumber = otherStartLineNumber; + resultStartColumn = otherStartColumn; + } else if (resultStartLineNumber === otherStartLineNumber) { + resultStartColumn = Math.max(resultStartColumn, otherStartColumn); + } + if (resultEndLineNumber > otherEndLineNumber) { + resultEndLineNumber = otherEndLineNumber; + resultEndColumn = otherEndColumn; + } else if (resultEndLineNumber === otherEndLineNumber) { + resultEndColumn = Math.min(resultEndColumn, otherEndColumn); + } + if (resultStartLineNumber > resultEndLineNumber) { + return null; + } + if (resultStartLineNumber === resultEndLineNumber && resultStartColumn > resultEndColumn) { + return null; + } + return new _Range(resultStartLineNumber, resultStartColumn, resultEndLineNumber, resultEndColumn); + } + /** + * Test if this range equals other. + */ + equalsRange(other) { + return _Range.equalsRange(this, other); + } + /** + * Test if range `a` equals `b`. + */ + static equalsRange(a3, b) { + if (!a3 && !b) { + return true; + } + return !!a3 && !!b && a3.startLineNumber === b.startLineNumber && a3.startColumn === b.startColumn && a3.endLineNumber === b.endLineNumber && a3.endColumn === b.endColumn; + } + /** + * Return the end position (which will be after or equal to the start position) + */ + getEndPosition() { + return _Range.getEndPosition(this); + } + /** + * Return the end position (which will be after or equal to the start position) + */ + static getEndPosition(range2) { + return new Position(range2.endLineNumber, range2.endColumn); + } + /** + * Return the start position (which will be before or equal to the end position) + */ + getStartPosition() { + return _Range.getStartPosition(this); + } + /** + * Return the start position (which will be before or equal to the end position) + */ + static getStartPosition(range2) { + return new Position(range2.startLineNumber, range2.startColumn); + } + /** + * Transform to a user presentable string representation. + */ + toString() { + return "[" + this.startLineNumber + "," + this.startColumn + " -> " + this.endLineNumber + "," + this.endColumn + "]"; + } + /** + * Create a new range using this range's start position, and using endLineNumber and endColumn as the end position. + */ + setEndPosition(endLineNumber, endColumn) { + return new _Range(this.startLineNumber, this.startColumn, endLineNumber, endColumn); + } + /** + * Create a new range using this range's end position, and using startLineNumber and startColumn as the start position. + */ + setStartPosition(startLineNumber, startColumn) { + return new _Range(startLineNumber, startColumn, this.endLineNumber, this.endColumn); + } + /** + * Create a new empty range using this range's start position. + */ + collapseToStart() { + return _Range.collapseToStart(this); + } + /** + * Create a new empty range using this range's start position. + */ + static collapseToStart(range2) { + return new _Range(range2.startLineNumber, range2.startColumn, range2.startLineNumber, range2.startColumn); + } + /** + * Create a new empty range using this range's end position. + */ + collapseToEnd() { + return _Range.collapseToEnd(this); + } + /** + * Create a new empty range using this range's end position. + */ + static collapseToEnd(range2) { + return new _Range(range2.endLineNumber, range2.endColumn, range2.endLineNumber, range2.endColumn); + } + /** + * Moves the range by the given amount of lines. + */ + delta(lineCount) { + return new _Range(this.startLineNumber + lineCount, this.startColumn, this.endLineNumber + lineCount, this.endColumn); + } + // --- + static fromPositions(start, end = start) { + return new _Range(start.lineNumber, start.column, end.lineNumber, end.column); + } + static lift(range2) { + if (!range2) { + return null; + } + return new _Range(range2.startLineNumber, range2.startColumn, range2.endLineNumber, range2.endColumn); + } + /** + * Test if `obj` is an `IRange`. + */ + static isIRange(obj) { + return obj && typeof obj.startLineNumber === "number" && typeof obj.startColumn === "number" && typeof obj.endLineNumber === "number" && typeof obj.endColumn === "number"; + } + /** + * Test if the two ranges are touching in any way. + */ + static areIntersectingOrTouching(a3, b) { + if (a3.endLineNumber < b.startLineNumber || a3.endLineNumber === b.startLineNumber && a3.endColumn < b.startColumn) { + return false; + } + if (b.endLineNumber < a3.startLineNumber || b.endLineNumber === a3.startLineNumber && b.endColumn < a3.startColumn) { + return false; + } + return true; + } + /** + * Test if the two ranges are intersecting. If the ranges are touching it returns true. + */ + static areIntersecting(a3, b) { + if (a3.endLineNumber < b.startLineNumber || a3.endLineNumber === b.startLineNumber && a3.endColumn <= b.startColumn) { + return false; + } + if (b.endLineNumber < a3.startLineNumber || b.endLineNumber === a3.startLineNumber && b.endColumn <= a3.startColumn) { + return false; + } + return true; + } + /** + * A function that compares ranges, useful for sorting ranges + * It will first compare ranges on the startPosition and then on the endPosition + */ + static compareRangesUsingStarts(a3, b) { + if (a3 && b) { + const aStartLineNumber = a3.startLineNumber | 0; + const bStartLineNumber = b.startLineNumber | 0; + if (aStartLineNumber === bStartLineNumber) { + const aStartColumn = a3.startColumn | 0; + const bStartColumn = b.startColumn | 0; + if (aStartColumn === bStartColumn) { + const aEndLineNumber = a3.endLineNumber | 0; + const bEndLineNumber = b.endLineNumber | 0; + if (aEndLineNumber === bEndLineNumber) { + const aEndColumn = a3.endColumn | 0; + const bEndColumn = b.endColumn | 0; + return aEndColumn - bEndColumn; + } + return aEndLineNumber - bEndLineNumber; + } + return aStartColumn - bStartColumn; + } + return aStartLineNumber - bStartLineNumber; + } + const aExists = a3 ? 1 : 0; + const bExists = b ? 1 : 0; + return aExists - bExists; + } + /** + * A function that compares ranges, useful for sorting ranges + * It will first compare ranges on the endPosition and then on the startPosition + */ + static compareRangesUsingEnds(a3, b) { + if (a3.endLineNumber === b.endLineNumber) { + if (a3.endColumn === b.endColumn) { + if (a3.startLineNumber === b.startLineNumber) { + return a3.startColumn - b.startColumn; + } + return a3.startLineNumber - b.startLineNumber; + } + return a3.endColumn - b.endColumn; + } + return a3.endLineNumber - b.endLineNumber; + } + /** + * Test if the range spans multiple lines. + */ + static spansMultipleLines(range2) { + return range2.endLineNumber > range2.startLineNumber; + } + toJSON() { + return this; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/selection.js +var Selection; +var init_selection = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/selection.js"() { + init_position(); + init_range(); + Selection = class _Selection extends Range { + constructor(selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn) { + super(selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn); + this.selectionStartLineNumber = selectionStartLineNumber; + this.selectionStartColumn = selectionStartColumn; + this.positionLineNumber = positionLineNumber; + this.positionColumn = positionColumn; + } + /** + * Transform to a human-readable representation. + */ + toString() { + return "[" + this.selectionStartLineNumber + "," + this.selectionStartColumn + " -> " + this.positionLineNumber + "," + this.positionColumn + "]"; + } + /** + * Test if equals other selection. + */ + equalsSelection(other) { + return _Selection.selectionsEqual(this, other); + } + /** + * Test if the two selections are equal. + */ + static selectionsEqual(a3, b) { + return a3.selectionStartLineNumber === b.selectionStartLineNumber && a3.selectionStartColumn === b.selectionStartColumn && a3.positionLineNumber === b.positionLineNumber && a3.positionColumn === b.positionColumn; + } + /** + * Get directions (LTR or RTL). + */ + getDirection() { + if (this.selectionStartLineNumber === this.startLineNumber && this.selectionStartColumn === this.startColumn) { + return 0; + } + return 1; + } + /** + * Create a new selection with a different `positionLineNumber` and `positionColumn`. + */ + setEndPosition(endLineNumber, endColumn) { + if (this.getDirection() === 0) { + return new _Selection(this.startLineNumber, this.startColumn, endLineNumber, endColumn); + } + return new _Selection(endLineNumber, endColumn, this.startLineNumber, this.startColumn); + } + /** + * Get the position at `positionLineNumber` and `positionColumn`. + */ + getPosition() { + return new Position(this.positionLineNumber, this.positionColumn); + } + /** + * Get the position at the start of the selection. + */ + getSelectionStart() { + return new Position(this.selectionStartLineNumber, this.selectionStartColumn); + } + /** + * Create a new selection with a different `selectionStartLineNumber` and `selectionStartColumn`. + */ + setStartPosition(startLineNumber, startColumn) { + if (this.getDirection() === 0) { + return new _Selection(startLineNumber, startColumn, this.endLineNumber, this.endColumn); + } + return new _Selection(this.endLineNumber, this.endColumn, startLineNumber, startColumn); + } + // ---- + /** + * Create a `Selection` from one or two positions + */ + static fromPositions(start, end = start) { + return new _Selection(start.lineNumber, start.column, end.lineNumber, end.column); + } + /** + * Creates a `Selection` from a range, given a direction. + */ + static fromRange(range2, direction) { + if (direction === 0) { + return new _Selection(range2.startLineNumber, range2.startColumn, range2.endLineNumber, range2.endColumn); + } else { + return new _Selection(range2.endLineNumber, range2.endColumn, range2.startLineNumber, range2.startColumn); + } + } + /** + * Create a `Selection` from an `ISelection`. + */ + static liftSelection(sel) { + return new _Selection(sel.selectionStartLineNumber, sel.selectionStartColumn, sel.positionLineNumber, sel.positionColumn); + } + /** + * `a` equals `b`. + */ + static selectionsArrEqual(a3, b) { + if (a3 && !b || !a3 && b) { + return false; + } + if (!a3 && !b) { + return true; + } + if (a3.length !== b.length) { + return false; + } + for (let i = 0, len = a3.length; i < len; i++) { + if (!this.selectionsEqual(a3[i], b[i])) { + return false; + } + } + return true; + } + /** + * Test if `obj` is an `ISelection`. + */ + static isISelection(obj) { + return obj && typeof obj.selectionStartLineNumber === "number" && typeof obj.selectionStartColumn === "number" && typeof obj.positionLineNumber === "number" && typeof obj.positionColumn === "number"; + } + /** + * Create with a direction. + */ + static createWithDirection(startLineNumber, startColumn, endLineNumber, endColumn, direction) { + if (direction === 0) { + return new _Selection(startLineNumber, startColumn, endLineNumber, endColumn); + } + return new _Selection(endLineNumber, endColumn, startLineNumber, startColumn); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/codiconsUtil.js +function register2(id, fontCharacter) { + if (isString(fontCharacter)) { + const val = _codiconFontCharacters[fontCharacter]; + if (val === void 0) { + throw new Error(`${id} references an unknown codicon: ${fontCharacter}`); + } + fontCharacter = val; + } + _codiconFontCharacters[id] = fontCharacter; + return { id }; +} +function getCodiconFontCharacters() { + return _codiconFontCharacters; +} +var _codiconFontCharacters; +var init_codiconsUtil = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/codiconsUtil.js"() { + init_types(); + _codiconFontCharacters = /* @__PURE__ */ Object.create(null); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/codiconsLibrary.js +var codiconsLibrary; +var init_codiconsLibrary = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/codiconsLibrary.js"() { + init_codiconsUtil(); + codiconsLibrary = { + add: register2("add", 6e4), + plus: register2("plus", 6e4), + gistNew: register2("gist-new", 6e4), + repoCreate: register2("repo-create", 6e4), + lightbulb: register2("lightbulb", 60001), + lightBulb: register2("light-bulb", 60001), + repo: register2("repo", 60002), + repoDelete: register2("repo-delete", 60002), + gistFork: register2("gist-fork", 60003), + repoForked: register2("repo-forked", 60003), + gitPullRequest: register2("git-pull-request", 60004), + gitPullRequestAbandoned: register2("git-pull-request-abandoned", 60004), + recordKeys: register2("record-keys", 60005), + keyboard: register2("keyboard", 60005), + tag: register2("tag", 60006), + gitPullRequestLabel: register2("git-pull-request-label", 60006), + tagAdd: register2("tag-add", 60006), + tagRemove: register2("tag-remove", 60006), + person: register2("person", 60007), + personFollow: register2("person-follow", 60007), + personOutline: register2("person-outline", 60007), + personFilled: register2("person-filled", 60007), + gitBranch: register2("git-branch", 60008), + gitBranchCreate: register2("git-branch-create", 60008), + gitBranchDelete: register2("git-branch-delete", 60008), + sourceControl: register2("source-control", 60008), + mirror: register2("mirror", 60009), + mirrorPublic: register2("mirror-public", 60009), + star: register2("star", 60010), + starAdd: register2("star-add", 60010), + starDelete: register2("star-delete", 60010), + starEmpty: register2("star-empty", 60010), + comment: register2("comment", 60011), + commentAdd: register2("comment-add", 60011), + alert: register2("alert", 60012), + warning: register2("warning", 60012), + search: register2("search", 60013), + searchSave: register2("search-save", 60013), + logOut: register2("log-out", 60014), + signOut: register2("sign-out", 60014), + logIn: register2("log-in", 60015), + signIn: register2("sign-in", 60015), + eye: register2("eye", 60016), + eyeUnwatch: register2("eye-unwatch", 60016), + eyeWatch: register2("eye-watch", 60016), + circleFilled: register2("circle-filled", 60017), + primitiveDot: register2("primitive-dot", 60017), + closeDirty: register2("close-dirty", 60017), + debugBreakpoint: register2("debug-breakpoint", 60017), + debugBreakpointDisabled: register2("debug-breakpoint-disabled", 60017), + debugHint: register2("debug-hint", 60017), + terminalDecorationSuccess: register2("terminal-decoration-success", 60017), + primitiveSquare: register2("primitive-square", 60018), + edit: register2("edit", 60019), + pencil: register2("pencil", 60019), + info: register2("info", 60020), + issueOpened: register2("issue-opened", 60020), + gistPrivate: register2("gist-private", 60021), + gitForkPrivate: register2("git-fork-private", 60021), + lock: register2("lock", 60021), + mirrorPrivate: register2("mirror-private", 60021), + close: register2("close", 60022), + removeClose: register2("remove-close", 60022), + x: register2("x", 60022), + repoSync: register2("repo-sync", 60023), + sync: register2("sync", 60023), + clone: register2("clone", 60024), + desktopDownload: register2("desktop-download", 60024), + beaker: register2("beaker", 60025), + microscope: register2("microscope", 60025), + vm: register2("vm", 60026), + deviceDesktop: register2("device-desktop", 60026), + file: register2("file", 60027), + fileText: register2("file-text", 60027), + more: register2("more", 60028), + ellipsis: register2("ellipsis", 60028), + kebabHorizontal: register2("kebab-horizontal", 60028), + mailReply: register2("mail-reply", 60029), + reply: register2("reply", 60029), + organization: register2("organization", 60030), + organizationFilled: register2("organization-filled", 60030), + organizationOutline: register2("organization-outline", 60030), + newFile: register2("new-file", 60031), + fileAdd: register2("file-add", 60031), + newFolder: register2("new-folder", 60032), + fileDirectoryCreate: register2("file-directory-create", 60032), + trash: register2("trash", 60033), + trashcan: register2("trashcan", 60033), + history: register2("history", 60034), + clock: register2("clock", 60034), + folder: register2("folder", 60035), + fileDirectory: register2("file-directory", 60035), + symbolFolder: register2("symbol-folder", 60035), + logoGithub: register2("logo-github", 60036), + markGithub: register2("mark-github", 60036), + github: register2("github", 60036), + terminal: register2("terminal", 60037), + console: register2("console", 60037), + repl: register2("repl", 60037), + zap: register2("zap", 60038), + symbolEvent: register2("symbol-event", 60038), + error: register2("error", 60039), + stop: register2("stop", 60039), + variable: register2("variable", 60040), + symbolVariable: register2("symbol-variable", 60040), + array: register2("array", 60042), + symbolArray: register2("symbol-array", 60042), + symbolModule: register2("symbol-module", 60043), + symbolPackage: register2("symbol-package", 60043), + symbolNamespace: register2("symbol-namespace", 60043), + symbolObject: register2("symbol-object", 60043), + symbolMethod: register2("symbol-method", 60044), + symbolFunction: register2("symbol-function", 60044), + symbolConstructor: register2("symbol-constructor", 60044), + symbolBoolean: register2("symbol-boolean", 60047), + symbolNull: register2("symbol-null", 60047), + symbolNumeric: register2("symbol-numeric", 60048), + symbolNumber: register2("symbol-number", 60048), + symbolStructure: register2("symbol-structure", 60049), + symbolStruct: register2("symbol-struct", 60049), + symbolParameter: register2("symbol-parameter", 60050), + symbolTypeParameter: register2("symbol-type-parameter", 60050), + symbolKey: register2("symbol-key", 60051), + symbolText: register2("symbol-text", 60051), + symbolReference: register2("symbol-reference", 60052), + goToFile: register2("go-to-file", 60052), + symbolEnum: register2("symbol-enum", 60053), + symbolValue: register2("symbol-value", 60053), + symbolRuler: register2("symbol-ruler", 60054), + symbolUnit: register2("symbol-unit", 60054), + activateBreakpoints: register2("activate-breakpoints", 60055), + archive: register2("archive", 60056), + arrowBoth: register2("arrow-both", 60057), + arrowDown: register2("arrow-down", 60058), + arrowLeft: register2("arrow-left", 60059), + arrowRight: register2("arrow-right", 60060), + arrowSmallDown: register2("arrow-small-down", 60061), + arrowSmallLeft: register2("arrow-small-left", 60062), + arrowSmallRight: register2("arrow-small-right", 60063), + arrowSmallUp: register2("arrow-small-up", 60064), + arrowUp: register2("arrow-up", 60065), + bell: register2("bell", 60066), + bold: register2("bold", 60067), + book: register2("book", 60068), + bookmark: register2("bookmark", 60069), + debugBreakpointConditionalUnverified: register2("debug-breakpoint-conditional-unverified", 60070), + debugBreakpointConditional: register2("debug-breakpoint-conditional", 60071), + debugBreakpointConditionalDisabled: register2("debug-breakpoint-conditional-disabled", 60071), + debugBreakpointDataUnverified: register2("debug-breakpoint-data-unverified", 60072), + debugBreakpointData: register2("debug-breakpoint-data", 60073), + debugBreakpointDataDisabled: register2("debug-breakpoint-data-disabled", 60073), + debugBreakpointLogUnverified: register2("debug-breakpoint-log-unverified", 60074), + debugBreakpointLog: register2("debug-breakpoint-log", 60075), + debugBreakpointLogDisabled: register2("debug-breakpoint-log-disabled", 60075), + briefcase: register2("briefcase", 60076), + broadcast: register2("broadcast", 60077), + browser: register2("browser", 60078), + bug: register2("bug", 60079), + calendar: register2("calendar", 60080), + caseSensitive: register2("case-sensitive", 60081), + check: register2("check", 60082), + checklist: register2("checklist", 60083), + chevronDown: register2("chevron-down", 60084), + chevronLeft: register2("chevron-left", 60085), + chevronRight: register2("chevron-right", 60086), + chevronUp: register2("chevron-up", 60087), + chromeClose: register2("chrome-close", 60088), + chromeMaximize: register2("chrome-maximize", 60089), + chromeMinimize: register2("chrome-minimize", 60090), + chromeRestore: register2("chrome-restore", 60091), + circleOutline: register2("circle-outline", 60092), + circle: register2("circle", 60092), + debugBreakpointUnverified: register2("debug-breakpoint-unverified", 60092), + terminalDecorationIncomplete: register2("terminal-decoration-incomplete", 60092), + circleSlash: register2("circle-slash", 60093), + circuitBoard: register2("circuit-board", 60094), + clearAll: register2("clear-all", 60095), + clippy: register2("clippy", 60096), + closeAll: register2("close-all", 60097), + cloudDownload: register2("cloud-download", 60098), + cloudUpload: register2("cloud-upload", 60099), + code: register2("code", 60100), + collapseAll: register2("collapse-all", 60101), + colorMode: register2("color-mode", 60102), + commentDiscussion: register2("comment-discussion", 60103), + creditCard: register2("credit-card", 60105), + dash: register2("dash", 60108), + dashboard: register2("dashboard", 60109), + database: register2("database", 60110), + debugContinue: register2("debug-continue", 60111), + debugDisconnect: register2("debug-disconnect", 60112), + debugPause: register2("debug-pause", 60113), + debugRestart: register2("debug-restart", 60114), + debugStart: register2("debug-start", 60115), + debugStepInto: register2("debug-step-into", 60116), + debugStepOut: register2("debug-step-out", 60117), + debugStepOver: register2("debug-step-over", 60118), + debugStop: register2("debug-stop", 60119), + debug: register2("debug", 60120), + deviceCameraVideo: register2("device-camera-video", 60121), + deviceCamera: register2("device-camera", 60122), + deviceMobile: register2("device-mobile", 60123), + diffAdded: register2("diff-added", 60124), + diffIgnored: register2("diff-ignored", 60125), + diffModified: register2("diff-modified", 60126), + diffRemoved: register2("diff-removed", 60127), + diffRenamed: register2("diff-renamed", 60128), + diff: register2("diff", 60129), + diffSidebyside: register2("diff-sidebyside", 60129), + discard: register2("discard", 60130), + editorLayout: register2("editor-layout", 60131), + emptyWindow: register2("empty-window", 60132), + exclude: register2("exclude", 60133), + extensions: register2("extensions", 60134), + eyeClosed: register2("eye-closed", 60135), + fileBinary: register2("file-binary", 60136), + fileCode: register2("file-code", 60137), + fileMedia: register2("file-media", 60138), + filePdf: register2("file-pdf", 60139), + fileSubmodule: register2("file-submodule", 60140), + fileSymlinkDirectory: register2("file-symlink-directory", 60141), + fileSymlinkFile: register2("file-symlink-file", 60142), + fileZip: register2("file-zip", 60143), + files: register2("files", 60144), + filter: register2("filter", 60145), + flame: register2("flame", 60146), + foldDown: register2("fold-down", 60147), + foldUp: register2("fold-up", 60148), + fold: register2("fold", 60149), + folderActive: register2("folder-active", 60150), + folderOpened: register2("folder-opened", 60151), + gear: register2("gear", 60152), + gift: register2("gift", 60153), + gistSecret: register2("gist-secret", 60154), + gist: register2("gist", 60155), + gitCommit: register2("git-commit", 60156), + gitCompare: register2("git-compare", 60157), + compareChanges: register2("compare-changes", 60157), + gitMerge: register2("git-merge", 60158), + githubAction: register2("github-action", 60159), + githubAlt: register2("github-alt", 60160), + globe: register2("globe", 60161), + grabber: register2("grabber", 60162), + graph: register2("graph", 60163), + gripper: register2("gripper", 60164), + heart: register2("heart", 60165), + home: register2("home", 60166), + horizontalRule: register2("horizontal-rule", 60167), + hubot: register2("hubot", 60168), + inbox: register2("inbox", 60169), + issueReopened: register2("issue-reopened", 60171), + issues: register2("issues", 60172), + italic: register2("italic", 60173), + jersey: register2("jersey", 60174), + json: register2("json", 60175), + kebabVertical: register2("kebab-vertical", 60176), + key: register2("key", 60177), + law: register2("law", 60178), + lightbulbAutofix: register2("lightbulb-autofix", 60179), + linkExternal: register2("link-external", 60180), + link: register2("link", 60181), + listOrdered: register2("list-ordered", 60182), + listUnordered: register2("list-unordered", 60183), + liveShare: register2("live-share", 60184), + loading: register2("loading", 60185), + location: register2("location", 60186), + mailRead: register2("mail-read", 60187), + mail: register2("mail", 60188), + markdown: register2("markdown", 60189), + megaphone: register2("megaphone", 60190), + mention: register2("mention", 60191), + milestone: register2("milestone", 60192), + gitPullRequestMilestone: register2("git-pull-request-milestone", 60192), + mortarBoard: register2("mortar-board", 60193), + move: register2("move", 60194), + multipleWindows: register2("multiple-windows", 60195), + mute: register2("mute", 60196), + noNewline: register2("no-newline", 60197), + note: register2("note", 60198), + octoface: register2("octoface", 60199), + openPreview: register2("open-preview", 60200), + package: register2("package", 60201), + paintcan: register2("paintcan", 60202), + pin: register2("pin", 60203), + play: register2("play", 60204), + run: register2("run", 60204), + plug: register2("plug", 60205), + preserveCase: register2("preserve-case", 60206), + preview: register2("preview", 60207), + project: register2("project", 60208), + pulse: register2("pulse", 60209), + question: register2("question", 60210), + quote: register2("quote", 60211), + radioTower: register2("radio-tower", 60212), + reactions: register2("reactions", 60213), + references: register2("references", 60214), + refresh: register2("refresh", 60215), + regex: register2("regex", 60216), + remoteExplorer: register2("remote-explorer", 60217), + remote: register2("remote", 60218), + remove: register2("remove", 60219), + replaceAll: register2("replace-all", 60220), + replace: register2("replace", 60221), + repoClone: register2("repo-clone", 60222), + repoForcePush: register2("repo-force-push", 60223), + repoPull: register2("repo-pull", 60224), + repoPush: register2("repo-push", 60225), + report: register2("report", 60226), + requestChanges: register2("request-changes", 60227), + rocket: register2("rocket", 60228), + rootFolderOpened: register2("root-folder-opened", 60229), + rootFolder: register2("root-folder", 60230), + rss: register2("rss", 60231), + ruby: register2("ruby", 60232), + saveAll: register2("save-all", 60233), + saveAs: register2("save-as", 60234), + save: register2("save", 60235), + screenFull: register2("screen-full", 60236), + screenNormal: register2("screen-normal", 60237), + searchStop: register2("search-stop", 60238), + server: register2("server", 60240), + settingsGear: register2("settings-gear", 60241), + settings: register2("settings", 60242), + shield: register2("shield", 60243), + smiley: register2("smiley", 60244), + sortPrecedence: register2("sort-precedence", 60245), + splitHorizontal: register2("split-horizontal", 60246), + splitVertical: register2("split-vertical", 60247), + squirrel: register2("squirrel", 60248), + starFull: register2("star-full", 60249), + starHalf: register2("star-half", 60250), + symbolClass: register2("symbol-class", 60251), + symbolColor: register2("symbol-color", 60252), + symbolConstant: register2("symbol-constant", 60253), + symbolEnumMember: register2("symbol-enum-member", 60254), + symbolField: register2("symbol-field", 60255), + symbolFile: register2("symbol-file", 60256), + symbolInterface: register2("symbol-interface", 60257), + symbolKeyword: register2("symbol-keyword", 60258), + symbolMisc: register2("symbol-misc", 60259), + symbolOperator: register2("symbol-operator", 60260), + symbolProperty: register2("symbol-property", 60261), + wrench: register2("wrench", 60261), + wrenchSubaction: register2("wrench-subaction", 60261), + symbolSnippet: register2("symbol-snippet", 60262), + tasklist: register2("tasklist", 60263), + telescope: register2("telescope", 60264), + textSize: register2("text-size", 60265), + threeBars: register2("three-bars", 60266), + thumbsdown: register2("thumbsdown", 60267), + thumbsup: register2("thumbsup", 60268), + tools: register2("tools", 60269), + triangleDown: register2("triangle-down", 60270), + triangleLeft: register2("triangle-left", 60271), + triangleRight: register2("triangle-right", 60272), + triangleUp: register2("triangle-up", 60273), + twitter: register2("twitter", 60274), + unfold: register2("unfold", 60275), + unlock: register2("unlock", 60276), + unmute: register2("unmute", 60277), + unverified: register2("unverified", 60278), + verified: register2("verified", 60279), + versions: register2("versions", 60280), + vmActive: register2("vm-active", 60281), + vmOutline: register2("vm-outline", 60282), + vmRunning: register2("vm-running", 60283), + watch: register2("watch", 60284), + whitespace: register2("whitespace", 60285), + wholeWord: register2("whole-word", 60286), + window: register2("window", 60287), + wordWrap: register2("word-wrap", 60288), + zoomIn: register2("zoom-in", 60289), + zoomOut: register2("zoom-out", 60290), + listFilter: register2("list-filter", 60291), + listFlat: register2("list-flat", 60292), + listSelection: register2("list-selection", 60293), + selection: register2("selection", 60293), + listTree: register2("list-tree", 60294), + debugBreakpointFunctionUnverified: register2("debug-breakpoint-function-unverified", 60295), + debugBreakpointFunction: register2("debug-breakpoint-function", 60296), + debugBreakpointFunctionDisabled: register2("debug-breakpoint-function-disabled", 60296), + debugStackframeActive: register2("debug-stackframe-active", 60297), + circleSmallFilled: register2("circle-small-filled", 60298), + debugStackframeDot: register2("debug-stackframe-dot", 60298), + terminalDecorationMark: register2("terminal-decoration-mark", 60298), + debugStackframe: register2("debug-stackframe", 60299), + debugStackframeFocused: register2("debug-stackframe-focused", 60299), + debugBreakpointUnsupported: register2("debug-breakpoint-unsupported", 60300), + symbolString: register2("symbol-string", 60301), + debugReverseContinue: register2("debug-reverse-continue", 60302), + debugStepBack: register2("debug-step-back", 60303), + debugRestartFrame: register2("debug-restart-frame", 60304), + debugAlt: register2("debug-alt", 60305), + callIncoming: register2("call-incoming", 60306), + callOutgoing: register2("call-outgoing", 60307), + menu: register2("menu", 60308), + expandAll: register2("expand-all", 60309), + feedback: register2("feedback", 60310), + gitPullRequestReviewer: register2("git-pull-request-reviewer", 60310), + groupByRefType: register2("group-by-ref-type", 60311), + ungroupByRefType: register2("ungroup-by-ref-type", 60312), + account: register2("account", 60313), + gitPullRequestAssignee: register2("git-pull-request-assignee", 60313), + bellDot: register2("bell-dot", 60314), + debugConsole: register2("debug-console", 60315), + library: register2("library", 60316), + output: register2("output", 60317), + runAll: register2("run-all", 60318), + syncIgnored: register2("sync-ignored", 60319), + pinned: register2("pinned", 60320), + githubInverted: register2("github-inverted", 60321), + serverProcess: register2("server-process", 60322), + serverEnvironment: register2("server-environment", 60323), + pass: register2("pass", 60324), + issueClosed: register2("issue-closed", 60324), + stopCircle: register2("stop-circle", 60325), + playCircle: register2("play-circle", 60326), + record: register2("record", 60327), + debugAltSmall: register2("debug-alt-small", 60328), + vmConnect: register2("vm-connect", 60329), + cloud: register2("cloud", 60330), + merge: register2("merge", 60331), + export: register2("export", 60332), + graphLeft: register2("graph-left", 60333), + magnet: register2("magnet", 60334), + notebook: register2("notebook", 60335), + redo: register2("redo", 60336), + checkAll: register2("check-all", 60337), + pinnedDirty: register2("pinned-dirty", 60338), + passFilled: register2("pass-filled", 60339), + circleLargeFilled: register2("circle-large-filled", 60340), + circleLarge: register2("circle-large", 60341), + circleLargeOutline: register2("circle-large-outline", 60341), + combine: register2("combine", 60342), + gather: register2("gather", 60342), + table: register2("table", 60343), + variableGroup: register2("variable-group", 60344), + typeHierarchy: register2("type-hierarchy", 60345), + typeHierarchySub: register2("type-hierarchy-sub", 60346), + typeHierarchySuper: register2("type-hierarchy-super", 60347), + gitPullRequestCreate: register2("git-pull-request-create", 60348), + runAbove: register2("run-above", 60349), + runBelow: register2("run-below", 60350), + notebookTemplate: register2("notebook-template", 60351), + debugRerun: register2("debug-rerun", 60352), + workspaceTrusted: register2("workspace-trusted", 60353), + workspaceUntrusted: register2("workspace-untrusted", 60354), + workspaceUnknown: register2("workspace-unknown", 60355), + terminalCmd: register2("terminal-cmd", 60356), + terminalDebian: register2("terminal-debian", 60357), + terminalLinux: register2("terminal-linux", 60358), + terminalPowershell: register2("terminal-powershell", 60359), + terminalTmux: register2("terminal-tmux", 60360), + terminalUbuntu: register2("terminal-ubuntu", 60361), + terminalBash: register2("terminal-bash", 60362), + arrowSwap: register2("arrow-swap", 60363), + copy: register2("copy", 60364), + personAdd: register2("person-add", 60365), + filterFilled: register2("filter-filled", 60366), + wand: register2("wand", 60367), + debugLineByLine: register2("debug-line-by-line", 60368), + inspect: register2("inspect", 60369), + layers: register2("layers", 60370), + layersDot: register2("layers-dot", 60371), + layersActive: register2("layers-active", 60372), + compass: register2("compass", 60373), + compassDot: register2("compass-dot", 60374), + compassActive: register2("compass-active", 60375), + azure: register2("azure", 60376), + issueDraft: register2("issue-draft", 60377), + gitPullRequestClosed: register2("git-pull-request-closed", 60378), + gitPullRequestDraft: register2("git-pull-request-draft", 60379), + debugAll: register2("debug-all", 60380), + debugCoverage: register2("debug-coverage", 60381), + runErrors: register2("run-errors", 60382), + folderLibrary: register2("folder-library", 60383), + debugContinueSmall: register2("debug-continue-small", 60384), + beakerStop: register2("beaker-stop", 60385), + graphLine: register2("graph-line", 60386), + graphScatter: register2("graph-scatter", 60387), + pieChart: register2("pie-chart", 60388), + bracket: register2("bracket", 60175), + bracketDot: register2("bracket-dot", 60389), + bracketError: register2("bracket-error", 60390), + lockSmall: register2("lock-small", 60391), + azureDevops: register2("azure-devops", 60392), + verifiedFilled: register2("verified-filled", 60393), + newline: register2("newline", 60394), + layout: register2("layout", 60395), + layoutActivitybarLeft: register2("layout-activitybar-left", 60396), + layoutActivitybarRight: register2("layout-activitybar-right", 60397), + layoutPanelLeft: register2("layout-panel-left", 60398), + layoutPanelCenter: register2("layout-panel-center", 60399), + layoutPanelJustify: register2("layout-panel-justify", 60400), + layoutPanelRight: register2("layout-panel-right", 60401), + layoutPanel: register2("layout-panel", 60402), + layoutSidebarLeft: register2("layout-sidebar-left", 60403), + layoutSidebarRight: register2("layout-sidebar-right", 60404), + layoutStatusbar: register2("layout-statusbar", 60405), + layoutMenubar: register2("layout-menubar", 60406), + layoutCentered: register2("layout-centered", 60407), + target: register2("target", 60408), + indent: register2("indent", 60409), + recordSmall: register2("record-small", 60410), + errorSmall: register2("error-small", 60411), + terminalDecorationError: register2("terminal-decoration-error", 60411), + arrowCircleDown: register2("arrow-circle-down", 60412), + arrowCircleLeft: register2("arrow-circle-left", 60413), + arrowCircleRight: register2("arrow-circle-right", 60414), + arrowCircleUp: register2("arrow-circle-up", 60415), + layoutSidebarRightOff: register2("layout-sidebar-right-off", 60416), + layoutPanelOff: register2("layout-panel-off", 60417), + layoutSidebarLeftOff: register2("layout-sidebar-left-off", 60418), + blank: register2("blank", 60419), + heartFilled: register2("heart-filled", 60420), + map: register2("map", 60421), + mapHorizontal: register2("map-horizontal", 60421), + foldHorizontal: register2("fold-horizontal", 60421), + mapFilled: register2("map-filled", 60422), + mapHorizontalFilled: register2("map-horizontal-filled", 60422), + foldHorizontalFilled: register2("fold-horizontal-filled", 60422), + circleSmall: register2("circle-small", 60423), + bellSlash: register2("bell-slash", 60424), + bellSlashDot: register2("bell-slash-dot", 60425), + commentUnresolved: register2("comment-unresolved", 60426), + gitPullRequestGoToChanges: register2("git-pull-request-go-to-changes", 60427), + gitPullRequestNewChanges: register2("git-pull-request-new-changes", 60428), + searchFuzzy: register2("search-fuzzy", 60429), + commentDraft: register2("comment-draft", 60430), + send: register2("send", 60431), + sparkle: register2("sparkle", 60432), + insert: register2("insert", 60433), + mic: register2("mic", 60434), + thumbsdownFilled: register2("thumbsdown-filled", 60435), + thumbsupFilled: register2("thumbsup-filled", 60436), + coffee: register2("coffee", 60437), + snake: register2("snake", 60438), + game: register2("game", 60439), + vr: register2("vr", 60440), + chip: register2("chip", 60441), + piano: register2("piano", 60442), + music: register2("music", 60443), + micFilled: register2("mic-filled", 60444), + repoFetch: register2("repo-fetch", 60445), + copilot: register2("copilot", 60446), + lightbulbSparkle: register2("lightbulb-sparkle", 60447), + robot: register2("robot", 60448), + sparkleFilled: register2("sparkle-filled", 60449), + diffSingle: register2("diff-single", 60450), + diffMultiple: register2("diff-multiple", 60451), + surroundWith: register2("surround-with", 60452), + share: register2("share", 60453), + gitStash: register2("git-stash", 60454), + gitStashApply: register2("git-stash-apply", 60455), + gitStashPop: register2("git-stash-pop", 60456), + vscode: register2("vscode", 60457), + vscodeInsiders: register2("vscode-insiders", 60458), + codeOss: register2("code-oss", 60459), + runCoverage: register2("run-coverage", 60460), + runAllCoverage: register2("run-all-coverage", 60461), + coverage: register2("coverage", 60462), + githubProject: register2("github-project", 60463), + mapVertical: register2("map-vertical", 60464), + foldVertical: register2("fold-vertical", 60464), + mapVerticalFilled: register2("map-vertical-filled", 60465), + foldVerticalFilled: register2("fold-vertical-filled", 60465), + goToSearch: register2("go-to-search", 60466), + percentage: register2("percentage", 60467), + sortPercentage: register2("sort-percentage", 60467), + attach: register2("attach", 60468) + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/codicons.js +var codiconsDerived, Codicon; +var init_codicons = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/codicons.js"() { + init_codiconsUtil(); + init_codiconsLibrary(); + codiconsDerived = { + dialogError: register2("dialog-error", "error"), + dialogWarning: register2("dialog-warning", "warning"), + dialogInfo: register2("dialog-info", "info"), + dialogClose: register2("dialog-close", "close"), + treeItemExpanded: register2("tree-item-expanded", "chevron-down"), + // collapsed is done with rotation + treeFilterOnTypeOn: register2("tree-filter-on-type-on", "list-filter"), + treeFilterOnTypeOff: register2("tree-filter-on-type-off", "list-selection"), + treeFilterClear: register2("tree-filter-clear", "close"), + treeItemLoading: register2("tree-item-loading", "loading"), + menuSelection: register2("menu-selection", "check"), + menuSubmenu: register2("menu-submenu", "chevron-right"), + menuBarMore: register2("menubar-more", "more"), + scrollbarButtonLeft: register2("scrollbar-button-left", "triangle-left"), + scrollbarButtonRight: register2("scrollbar-button-right", "triangle-right"), + scrollbarButtonUp: register2("scrollbar-button-up", "triangle-up"), + scrollbarButtonDown: register2("scrollbar-button-down", "triangle-down"), + toolBarMore: register2("toolbar-more", "more"), + quickInputBack: register2("quick-input-back", "arrow-left"), + dropDownButton: register2("drop-down-button", 60084), + symbolCustomColor: register2("symbol-customcolor", 60252), + exportIcon: register2("export", 60332), + workspaceUnspecified: register2("workspace-unspecified", 60355), + newLine: register2("newline", 60394), + thumbsDownFilled: register2("thumbsdown-filled", 60435), + thumbsUpFilled: register2("thumbsup-filled", 60436), + gitFetch: register2("git-fetch", 60445), + lightbulbSparkleAutofix: register2("lightbulb-sparkle-autofix", 60447), + debugBreakpointPending: register2("debug-breakpoint-pending", 60377) + }; + Codicon = __spreadValues(__spreadValues({}, codiconsLibrary), codiconsDerived); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/tokenizationRegistry.js +var TokenizationRegistry, TokenizationSupportFactoryData; +var init_tokenizationRegistry = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/tokenizationRegistry.js"() { + init_event(); + init_lifecycle(); + TokenizationRegistry = class { + constructor() { + this._tokenizationSupports = /* @__PURE__ */ new Map(); + this._factories = /* @__PURE__ */ new Map(); + this._onDidChange = new Emitter(); + this.onDidChange = this._onDidChange.event; + this._colorMap = null; + } + handleChange(languageIds) { + this._onDidChange.fire({ + changedLanguages: languageIds, + changedColorMap: false + }); + } + register(languageId, support) { + this._tokenizationSupports.set(languageId, support); + this.handleChange([languageId]); + return toDisposable(() => { + if (this._tokenizationSupports.get(languageId) !== support) { + return; + } + this._tokenizationSupports.delete(languageId); + this.handleChange([languageId]); + }); + } + get(languageId) { + return this._tokenizationSupports.get(languageId) || null; + } + registerFactory(languageId, factory) { + var _a10; + (_a10 = this._factories.get(languageId)) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + const myData = new TokenizationSupportFactoryData(this, languageId, factory); + this._factories.set(languageId, myData); + return toDisposable(() => { + const v = this._factories.get(languageId); + if (!v || v !== myData) { + return; + } + this._factories.delete(languageId); + v.dispose(); + }); + } + getOrCreate(languageId) { + return __async(this, null, function* () { + const tokenizationSupport = this.get(languageId); + if (tokenizationSupport) { + return tokenizationSupport; + } + const factory = this._factories.get(languageId); + if (!factory || factory.isResolved) { + return null; + } + yield factory.resolve(); + return this.get(languageId); + }); + } + isResolved(languageId) { + const tokenizationSupport = this.get(languageId); + if (tokenizationSupport) { + return true; + } + const factory = this._factories.get(languageId); + if (!factory || factory.isResolved) { + return true; + } + return false; + } + setColorMap(colorMap) { + this._colorMap = colorMap; + this._onDidChange.fire({ + changedLanguages: Array.from(this._tokenizationSupports.keys()), + changedColorMap: true + }); + } + getColorMap() { + return this._colorMap; + } + getDefaultBackground() { + if (this._colorMap && this._colorMap.length > 2) { + return this._colorMap[ + 2 + /* ColorId.DefaultBackground */ + ]; + } + return null; + } + }; + TokenizationSupportFactoryData = class extends Disposable { + get isResolved() { + return this._isResolved; + } + constructor(_registry2, _languageId, _factory) { + super(); + this._registry = _registry2; + this._languageId = _languageId; + this._factory = _factory; + this._isDisposed = false; + this._resolvePromise = null; + this._isResolved = false; + } + dispose() { + this._isDisposed = true; + super.dispose(); + } + resolve() { + return __async(this, null, function* () { + if (!this._resolvePromise) { + this._resolvePromise = this._create(); + } + return this._resolvePromise; + }); + } + _create() { + return __async(this, null, function* () { + const value = yield this._factory.tokenizationSupport; + this._isResolved = true; + if (value && !this._isDisposed) { + this._register(this._registry.register(this._languageId, value)); + } + }); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages.js +function isLocationLink(thing) { + return thing && URI.isUri(thing.uri) && Range.isIRange(thing.range) && (Range.isIRange(thing.originSelectionRange) || Range.isIRange(thing.targetSelectionRange)); +} +function getAriaLabelForSymbol(symbolName, kind) { + return localize("symbolAriaLabel", "{0} ({1})", symbolName, symbolKindNames[kind]); +} +var Token, TokenizationResult, EncodedTokenizationResult, HoverVerbosityAction, CompletionItemKinds, InlineCompletionTriggerKind, SelectedSuggestionInfo, DocumentPasteTriggerKind, SignatureHelpTriggerKind, DocumentHighlightKind, symbolKindNames, SymbolKinds, FoldingRangeKind, NewSymbolNameTag, NewSymbolNameTriggerKind, Command, InlayHintKind, LazyTokenizationSupport, TokenizationRegistry2, InlineEditTriggerKind; +var init_languages = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages.js"() { + init_codicons(); + init_uri(); + init_range(); + init_tokenizationRegistry(); + init_nls(); + Token = class { + constructor(offset, type, language82) { + this.offset = offset; + this.type = type; + this.language = language82; + this._tokenBrand = void 0; + } + toString() { + return "(" + this.offset + ", " + this.type + ")"; + } + }; + TokenizationResult = class { + constructor(tokens, endState) { + this.tokens = tokens; + this.endState = endState; + this._tokenizationResultBrand = void 0; + } + }; + EncodedTokenizationResult = class { + constructor(tokens, endState) { + this.tokens = tokens; + this.endState = endState; + this._encodedTokenizationResultBrand = void 0; + } + }; + (function(HoverVerbosityAction3) { + HoverVerbosityAction3[HoverVerbosityAction3["Increase"] = 0] = "Increase"; + HoverVerbosityAction3[HoverVerbosityAction3["Decrease"] = 1] = "Decrease"; + })(HoverVerbosityAction || (HoverVerbosityAction = {})); + (function(CompletionItemKinds2) { + const byKind = /* @__PURE__ */ new Map(); + byKind.set(0, Codicon.symbolMethod); + byKind.set(1, Codicon.symbolFunction); + byKind.set(2, Codicon.symbolConstructor); + byKind.set(3, Codicon.symbolField); + byKind.set(4, Codicon.symbolVariable); + byKind.set(5, Codicon.symbolClass); + byKind.set(6, Codicon.symbolStruct); + byKind.set(7, Codicon.symbolInterface); + byKind.set(8, Codicon.symbolModule); + byKind.set(9, Codicon.symbolProperty); + byKind.set(10, Codicon.symbolEvent); + byKind.set(11, Codicon.symbolOperator); + byKind.set(12, Codicon.symbolUnit); + byKind.set(13, Codicon.symbolValue); + byKind.set(15, Codicon.symbolEnum); + byKind.set(14, Codicon.symbolConstant); + byKind.set(15, Codicon.symbolEnum); + byKind.set(16, Codicon.symbolEnumMember); + byKind.set(17, Codicon.symbolKeyword); + byKind.set(27, Codicon.symbolSnippet); + byKind.set(18, Codicon.symbolText); + byKind.set(19, Codicon.symbolColor); + byKind.set(20, Codicon.symbolFile); + byKind.set(21, Codicon.symbolReference); + byKind.set(22, Codicon.symbolCustomColor); + byKind.set(23, Codicon.symbolFolder); + byKind.set(24, Codicon.symbolTypeParameter); + byKind.set(25, Codicon.account); + byKind.set(26, Codicon.issues); + function toIcon(kind) { + let codicon = byKind.get(kind); + if (!codicon) { + console.info("No codicon found for CompletionItemKind " + kind); + codicon = Codicon.symbolProperty; + } + return codicon; + } + CompletionItemKinds2.toIcon = toIcon; + const data = /* @__PURE__ */ new Map(); + data.set( + "method", + 0 + /* CompletionItemKind.Method */ + ); + data.set( + "function", + 1 + /* CompletionItemKind.Function */ + ); + data.set( + "constructor", + 2 + /* CompletionItemKind.Constructor */ + ); + data.set( + "field", + 3 + /* CompletionItemKind.Field */ + ); + data.set( + "variable", + 4 + /* CompletionItemKind.Variable */ + ); + data.set( + "class", + 5 + /* CompletionItemKind.Class */ + ); + data.set( + "struct", + 6 + /* CompletionItemKind.Struct */ + ); + data.set( + "interface", + 7 + /* CompletionItemKind.Interface */ + ); + data.set( + "module", + 8 + /* CompletionItemKind.Module */ + ); + data.set( + "property", + 9 + /* CompletionItemKind.Property */ + ); + data.set( + "event", + 10 + /* CompletionItemKind.Event */ + ); + data.set( + "operator", + 11 + /* CompletionItemKind.Operator */ + ); + data.set( + "unit", + 12 + /* CompletionItemKind.Unit */ + ); + data.set( + "value", + 13 + /* CompletionItemKind.Value */ + ); + data.set( + "constant", + 14 + /* CompletionItemKind.Constant */ + ); + data.set( + "enum", + 15 + /* CompletionItemKind.Enum */ + ); + data.set( + "enum-member", + 16 + /* CompletionItemKind.EnumMember */ + ); + data.set( + "enumMember", + 16 + /* CompletionItemKind.EnumMember */ + ); + data.set( + "keyword", + 17 + /* CompletionItemKind.Keyword */ + ); + data.set( + "snippet", + 27 + /* CompletionItemKind.Snippet */ + ); + data.set( + "text", + 18 + /* CompletionItemKind.Text */ + ); + data.set( + "color", + 19 + /* CompletionItemKind.Color */ + ); + data.set( + "file", + 20 + /* CompletionItemKind.File */ + ); + data.set( + "reference", + 21 + /* CompletionItemKind.Reference */ + ); + data.set( + "customcolor", + 22 + /* CompletionItemKind.Customcolor */ + ); + data.set( + "folder", + 23 + /* CompletionItemKind.Folder */ + ); + data.set( + "type-parameter", + 24 + /* CompletionItemKind.TypeParameter */ + ); + data.set( + "typeParameter", + 24 + /* CompletionItemKind.TypeParameter */ + ); + data.set( + "account", + 25 + /* CompletionItemKind.User */ + ); + data.set( + "issue", + 26 + /* CompletionItemKind.Issue */ + ); + function fromString(value, strict) { + let res = data.get(value); + if (typeof res === "undefined" && !strict) { + res = 9; + } + return res; + } + CompletionItemKinds2.fromString = fromString; + })(CompletionItemKinds || (CompletionItemKinds = {})); + (function(InlineCompletionTriggerKind9) { + InlineCompletionTriggerKind9[InlineCompletionTriggerKind9["Automatic"] = 0] = "Automatic"; + InlineCompletionTriggerKind9[InlineCompletionTriggerKind9["Explicit"] = 1] = "Explicit"; + })(InlineCompletionTriggerKind || (InlineCompletionTriggerKind = {})); + SelectedSuggestionInfo = class { + constructor(range2, text2, completionKind, isSnippetText) { + this.range = range2; + this.text = text2; + this.completionKind = completionKind; + this.isSnippetText = isSnippetText; + } + equals(other) { + return Range.lift(this.range).equalsRange(other.range) && this.text === other.text && this.completionKind === other.completionKind && this.isSnippetText === other.isSnippetText; + } + }; + (function(DocumentPasteTriggerKind2) { + DocumentPasteTriggerKind2[DocumentPasteTriggerKind2["Automatic"] = 0] = "Automatic"; + DocumentPasteTriggerKind2[DocumentPasteTriggerKind2["PasteAs"] = 1] = "PasteAs"; + })(DocumentPasteTriggerKind || (DocumentPasteTriggerKind = {})); + (function(SignatureHelpTriggerKind3) { + SignatureHelpTriggerKind3[SignatureHelpTriggerKind3["Invoke"] = 1] = "Invoke"; + SignatureHelpTriggerKind3[SignatureHelpTriggerKind3["TriggerCharacter"] = 2] = "TriggerCharacter"; + SignatureHelpTriggerKind3[SignatureHelpTriggerKind3["ContentChange"] = 3] = "ContentChange"; + })(SignatureHelpTriggerKind || (SignatureHelpTriggerKind = {})); + (function(DocumentHighlightKind9) { + DocumentHighlightKind9[DocumentHighlightKind9["Text"] = 0] = "Text"; + DocumentHighlightKind9[DocumentHighlightKind9["Read"] = 1] = "Read"; + DocumentHighlightKind9[DocumentHighlightKind9["Write"] = 2] = "Write"; + })(DocumentHighlightKind || (DocumentHighlightKind = {})); + symbolKindNames = { + [ + 17 + /* SymbolKind.Array */ + ]: localize("Array", "array"), + [ + 16 + /* SymbolKind.Boolean */ + ]: localize("Boolean", "boolean"), + [ + 4 + /* SymbolKind.Class */ + ]: localize("Class", "class"), + [ + 13 + /* SymbolKind.Constant */ + ]: localize("Constant", "constant"), + [ + 8 + /* SymbolKind.Constructor */ + ]: localize("Constructor", "constructor"), + [ + 9 + /* SymbolKind.Enum */ + ]: localize("Enum", "enumeration"), + [ + 21 + /* SymbolKind.EnumMember */ + ]: localize("EnumMember", "enumeration member"), + [ + 23 + /* SymbolKind.Event */ + ]: localize("Event", "event"), + [ + 7 + /* SymbolKind.Field */ + ]: localize("Field", "field"), + [ + 0 + /* SymbolKind.File */ + ]: localize("File", "file"), + [ + 11 + /* SymbolKind.Function */ + ]: localize("Function", "function"), + [ + 10 + /* SymbolKind.Interface */ + ]: localize("Interface", "interface"), + [ + 19 + /* SymbolKind.Key */ + ]: localize("Key", "key"), + [ + 5 + /* SymbolKind.Method */ + ]: localize("Method", "method"), + [ + 1 + /* SymbolKind.Module */ + ]: localize("Module", "module"), + [ + 2 + /* SymbolKind.Namespace */ + ]: localize("Namespace", "namespace"), + [ + 20 + /* SymbolKind.Null */ + ]: localize("Null", "null"), + [ + 15 + /* SymbolKind.Number */ + ]: localize("Number", "number"), + [ + 18 + /* SymbolKind.Object */ + ]: localize("Object", "object"), + [ + 24 + /* SymbolKind.Operator */ + ]: localize("Operator", "operator"), + [ + 3 + /* SymbolKind.Package */ + ]: localize("Package", "package"), + [ + 6 + /* SymbolKind.Property */ + ]: localize("Property", "property"), + [ + 14 + /* SymbolKind.String */ + ]: localize("String", "string"), + [ + 22 + /* SymbolKind.Struct */ + ]: localize("Struct", "struct"), + [ + 25 + /* SymbolKind.TypeParameter */ + ]: localize("TypeParameter", "type parameter"), + [ + 12 + /* SymbolKind.Variable */ + ]: localize("Variable", "variable") + }; + (function(SymbolKinds2) { + const byKind = /* @__PURE__ */ new Map(); + byKind.set(0, Codicon.symbolFile); + byKind.set(1, Codicon.symbolModule); + byKind.set(2, Codicon.symbolNamespace); + byKind.set(3, Codicon.symbolPackage); + byKind.set(4, Codicon.symbolClass); + byKind.set(5, Codicon.symbolMethod); + byKind.set(6, Codicon.symbolProperty); + byKind.set(7, Codicon.symbolField); + byKind.set(8, Codicon.symbolConstructor); + byKind.set(9, Codicon.symbolEnum); + byKind.set(10, Codicon.symbolInterface); + byKind.set(11, Codicon.symbolFunction); + byKind.set(12, Codicon.symbolVariable); + byKind.set(13, Codicon.symbolConstant); + byKind.set(14, Codicon.symbolString); + byKind.set(15, Codicon.symbolNumber); + byKind.set(16, Codicon.symbolBoolean); + byKind.set(17, Codicon.symbolArray); + byKind.set(18, Codicon.symbolObject); + byKind.set(19, Codicon.symbolKey); + byKind.set(20, Codicon.symbolNull); + byKind.set(21, Codicon.symbolEnumMember); + byKind.set(22, Codicon.symbolStruct); + byKind.set(23, Codicon.symbolEvent); + byKind.set(24, Codicon.symbolOperator); + byKind.set(25, Codicon.symbolTypeParameter); + function toIcon(kind) { + let icon = byKind.get(kind); + if (!icon) { + console.info("No codicon found for SymbolKind " + kind); + icon = Codicon.symbolProperty; + } + return icon; + } + SymbolKinds2.toIcon = toIcon; + })(SymbolKinds || (SymbolKinds = {})); + FoldingRangeKind = class _FoldingRangeKind { + /** + * Returns a {@link FoldingRangeKind} for the given value. + * + * @param value of the kind. + */ + static fromValue(value) { + switch (value) { + case "comment": + return _FoldingRangeKind.Comment; + case "imports": + return _FoldingRangeKind.Imports; + case "region": + return _FoldingRangeKind.Region; + } + return new _FoldingRangeKind(value); + } + /** + * Creates a new {@link FoldingRangeKind}. + * + * @param value of the kind. + */ + constructor(value) { + this.value = value; + } + }; + FoldingRangeKind.Comment = new FoldingRangeKind("comment"); + FoldingRangeKind.Imports = new FoldingRangeKind("imports"); + FoldingRangeKind.Region = new FoldingRangeKind("region"); + (function(NewSymbolNameTag3) { + NewSymbolNameTag3[NewSymbolNameTag3["AIGenerated"] = 1] = "AIGenerated"; + })(NewSymbolNameTag || (NewSymbolNameTag = {})); + (function(NewSymbolNameTriggerKind3) { + NewSymbolNameTriggerKind3[NewSymbolNameTriggerKind3["Invoke"] = 0] = "Invoke"; + NewSymbolNameTriggerKind3[NewSymbolNameTriggerKind3["Automatic"] = 1] = "Automatic"; + })(NewSymbolNameTriggerKind || (NewSymbolNameTriggerKind = {})); + (function(Command9) { + function is(obj) { + if (!obj || typeof obj !== "object") { + return false; + } + return typeof obj.id === "string" && typeof obj.title === "string"; + } + Command9.is = is; + })(Command || (Command = {})); + (function(InlayHintKind9) { + InlayHintKind9[InlayHintKind9["Type"] = 1] = "Type"; + InlayHintKind9[InlayHintKind9["Parameter"] = 2] = "Parameter"; + })(InlayHintKind || (InlayHintKind = {})); + LazyTokenizationSupport = class { + constructor(createSupport) { + this.createSupport = createSupport; + this._tokenizationSupport = null; + } + dispose() { + if (this._tokenizationSupport) { + this._tokenizationSupport.then((support) => { + if (support) { + support.dispose(); + } + }); + } + } + get tokenizationSupport() { + if (!this._tokenizationSupport) { + this._tokenizationSupport = this.createSupport(); + } + return this._tokenizationSupport; + } + }; + TokenizationRegistry2 = new TokenizationRegistry(); + (function(InlineEditTriggerKind3) { + InlineEditTriggerKind3[InlineEditTriggerKind3["Invoke"] = 0] = "Invoke"; + InlineEditTriggerKind3[InlineEditTriggerKind3["Automatic"] = 1] = "Automatic"; + })(InlineEditTriggerKind || (InlineEditTriggerKind = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/standalone/standaloneEnums.js +var AccessibilitySupport, CodeActionTriggerType, CompletionItemInsertTextRule, CompletionItemKind, CompletionItemTag, CompletionTriggerKind, ContentWidgetPositionPreference, CursorChangeReason, DefaultEndOfLine, DocumentHighlightKind2, EditorAutoIndentStrategy, EditorOption, EndOfLinePreference, EndOfLineSequence, GlyphMarginLane, HoverVerbosityAction2, IndentAction, InjectedTextCursorStops, InlayHintKind2, InlineCompletionTriggerKind2, InlineEditTriggerKind2, KeyCode, MarkerSeverity, MarkerTag, MinimapPosition, MinimapSectionHeaderStyle, MouseTargetType, NewSymbolNameTag2, NewSymbolNameTriggerKind2, OverlayWidgetPositionPreference, OverviewRulerLane, PartialAcceptTriggerKind, PositionAffinity, RenderLineNumbersType, RenderMinimap, ScrollType, ScrollbarVisibility, SelectionDirection, ShowLightbulbIconMode2, SignatureHelpTriggerKind2, SymbolKind, SymbolTag, TextEditorCursorBlinkingStyle, TextEditorCursorStyle2, TrackedRangeStickiness, WrappingIndent; +var init_standaloneEnums = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/standalone/standaloneEnums.js"() { + (function(AccessibilitySupport2) { + AccessibilitySupport2[AccessibilitySupport2["Unknown"] = 0] = "Unknown"; + AccessibilitySupport2[AccessibilitySupport2["Disabled"] = 1] = "Disabled"; + AccessibilitySupport2[AccessibilitySupport2["Enabled"] = 2] = "Enabled"; + })(AccessibilitySupport || (AccessibilitySupport = {})); + (function(CodeActionTriggerType2) { + CodeActionTriggerType2[CodeActionTriggerType2["Invoke"] = 1] = "Invoke"; + CodeActionTriggerType2[CodeActionTriggerType2["Auto"] = 2] = "Auto"; + })(CodeActionTriggerType || (CodeActionTriggerType = {})); + (function(CompletionItemInsertTextRule2) { + CompletionItemInsertTextRule2[CompletionItemInsertTextRule2["None"] = 0] = "None"; + CompletionItemInsertTextRule2[CompletionItemInsertTextRule2["KeepWhitespace"] = 1] = "KeepWhitespace"; + CompletionItemInsertTextRule2[CompletionItemInsertTextRule2["InsertAsSnippet"] = 4] = "InsertAsSnippet"; + })(CompletionItemInsertTextRule || (CompletionItemInsertTextRule = {})); + (function(CompletionItemKind8) { + CompletionItemKind8[CompletionItemKind8["Method"] = 0] = "Method"; + CompletionItemKind8[CompletionItemKind8["Function"] = 1] = "Function"; + CompletionItemKind8[CompletionItemKind8["Constructor"] = 2] = "Constructor"; + CompletionItemKind8[CompletionItemKind8["Field"] = 3] = "Field"; + CompletionItemKind8[CompletionItemKind8["Variable"] = 4] = "Variable"; + CompletionItemKind8[CompletionItemKind8["Class"] = 5] = "Class"; + CompletionItemKind8[CompletionItemKind8["Struct"] = 6] = "Struct"; + CompletionItemKind8[CompletionItemKind8["Interface"] = 7] = "Interface"; + CompletionItemKind8[CompletionItemKind8["Module"] = 8] = "Module"; + CompletionItemKind8[CompletionItemKind8["Property"] = 9] = "Property"; + CompletionItemKind8[CompletionItemKind8["Event"] = 10] = "Event"; + CompletionItemKind8[CompletionItemKind8["Operator"] = 11] = "Operator"; + CompletionItemKind8[CompletionItemKind8["Unit"] = 12] = "Unit"; + CompletionItemKind8[CompletionItemKind8["Value"] = 13] = "Value"; + CompletionItemKind8[CompletionItemKind8["Constant"] = 14] = "Constant"; + CompletionItemKind8[CompletionItemKind8["Enum"] = 15] = "Enum"; + CompletionItemKind8[CompletionItemKind8["EnumMember"] = 16] = "EnumMember"; + CompletionItemKind8[CompletionItemKind8["Keyword"] = 17] = "Keyword"; + CompletionItemKind8[CompletionItemKind8["Text"] = 18] = "Text"; + CompletionItemKind8[CompletionItemKind8["Color"] = 19] = "Color"; + CompletionItemKind8[CompletionItemKind8["File"] = 20] = "File"; + CompletionItemKind8[CompletionItemKind8["Reference"] = 21] = "Reference"; + CompletionItemKind8[CompletionItemKind8["Customcolor"] = 22] = "Customcolor"; + CompletionItemKind8[CompletionItemKind8["Folder"] = 23] = "Folder"; + CompletionItemKind8[CompletionItemKind8["TypeParameter"] = 24] = "TypeParameter"; + CompletionItemKind8[CompletionItemKind8["User"] = 25] = "User"; + CompletionItemKind8[CompletionItemKind8["Issue"] = 26] = "Issue"; + CompletionItemKind8[CompletionItemKind8["Snippet"] = 27] = "Snippet"; + })(CompletionItemKind || (CompletionItemKind = {})); + (function(CompletionItemTag8) { + CompletionItemTag8[CompletionItemTag8["Deprecated"] = 1] = "Deprecated"; + })(CompletionItemTag || (CompletionItemTag = {})); + (function(CompletionTriggerKind2) { + CompletionTriggerKind2[CompletionTriggerKind2["Invoke"] = 0] = "Invoke"; + CompletionTriggerKind2[CompletionTriggerKind2["TriggerCharacter"] = 1] = "TriggerCharacter"; + CompletionTriggerKind2[CompletionTriggerKind2["TriggerForIncompleteCompletions"] = 2] = "TriggerForIncompleteCompletions"; + })(CompletionTriggerKind || (CompletionTriggerKind = {})); + (function(ContentWidgetPositionPreference2) { + ContentWidgetPositionPreference2[ContentWidgetPositionPreference2["EXACT"] = 0] = "EXACT"; + ContentWidgetPositionPreference2[ContentWidgetPositionPreference2["ABOVE"] = 1] = "ABOVE"; + ContentWidgetPositionPreference2[ContentWidgetPositionPreference2["BELOW"] = 2] = "BELOW"; + })(ContentWidgetPositionPreference || (ContentWidgetPositionPreference = {})); + (function(CursorChangeReason2) { + CursorChangeReason2[CursorChangeReason2["NotSet"] = 0] = "NotSet"; + CursorChangeReason2[CursorChangeReason2["ContentFlush"] = 1] = "ContentFlush"; + CursorChangeReason2[CursorChangeReason2["RecoverFromMarkers"] = 2] = "RecoverFromMarkers"; + CursorChangeReason2[CursorChangeReason2["Explicit"] = 3] = "Explicit"; + CursorChangeReason2[CursorChangeReason2["Paste"] = 4] = "Paste"; + CursorChangeReason2[CursorChangeReason2["Undo"] = 5] = "Undo"; + CursorChangeReason2[CursorChangeReason2["Redo"] = 6] = "Redo"; + })(CursorChangeReason || (CursorChangeReason = {})); + (function(DefaultEndOfLine2) { + DefaultEndOfLine2[DefaultEndOfLine2["LF"] = 1] = "LF"; + DefaultEndOfLine2[DefaultEndOfLine2["CRLF"] = 2] = "CRLF"; + })(DefaultEndOfLine || (DefaultEndOfLine = {})); + (function(DocumentHighlightKind9) { + DocumentHighlightKind9[DocumentHighlightKind9["Text"] = 0] = "Text"; + DocumentHighlightKind9[DocumentHighlightKind9["Read"] = 1] = "Read"; + DocumentHighlightKind9[DocumentHighlightKind9["Write"] = 2] = "Write"; + })(DocumentHighlightKind2 || (DocumentHighlightKind2 = {})); + (function(EditorAutoIndentStrategy2) { + EditorAutoIndentStrategy2[EditorAutoIndentStrategy2["None"] = 0] = "None"; + EditorAutoIndentStrategy2[EditorAutoIndentStrategy2["Keep"] = 1] = "Keep"; + EditorAutoIndentStrategy2[EditorAutoIndentStrategy2["Brackets"] = 2] = "Brackets"; + EditorAutoIndentStrategy2[EditorAutoIndentStrategy2["Advanced"] = 3] = "Advanced"; + EditorAutoIndentStrategy2[EditorAutoIndentStrategy2["Full"] = 4] = "Full"; + })(EditorAutoIndentStrategy || (EditorAutoIndentStrategy = {})); + (function(EditorOption2) { + EditorOption2[EditorOption2["acceptSuggestionOnCommitCharacter"] = 0] = "acceptSuggestionOnCommitCharacter"; + EditorOption2[EditorOption2["acceptSuggestionOnEnter"] = 1] = "acceptSuggestionOnEnter"; + EditorOption2[EditorOption2["accessibilitySupport"] = 2] = "accessibilitySupport"; + EditorOption2[EditorOption2["accessibilityPageSize"] = 3] = "accessibilityPageSize"; + EditorOption2[EditorOption2["ariaLabel"] = 4] = "ariaLabel"; + EditorOption2[EditorOption2["ariaRequired"] = 5] = "ariaRequired"; + EditorOption2[EditorOption2["autoClosingBrackets"] = 6] = "autoClosingBrackets"; + EditorOption2[EditorOption2["autoClosingComments"] = 7] = "autoClosingComments"; + EditorOption2[EditorOption2["screenReaderAnnounceInlineSuggestion"] = 8] = "screenReaderAnnounceInlineSuggestion"; + EditorOption2[EditorOption2["autoClosingDelete"] = 9] = "autoClosingDelete"; + EditorOption2[EditorOption2["autoClosingOvertype"] = 10] = "autoClosingOvertype"; + EditorOption2[EditorOption2["autoClosingQuotes"] = 11] = "autoClosingQuotes"; + EditorOption2[EditorOption2["autoIndent"] = 12] = "autoIndent"; + EditorOption2[EditorOption2["automaticLayout"] = 13] = "automaticLayout"; + EditorOption2[EditorOption2["autoSurround"] = 14] = "autoSurround"; + EditorOption2[EditorOption2["bracketPairColorization"] = 15] = "bracketPairColorization"; + EditorOption2[EditorOption2["guides"] = 16] = "guides"; + EditorOption2[EditorOption2["codeLens"] = 17] = "codeLens"; + EditorOption2[EditorOption2["codeLensFontFamily"] = 18] = "codeLensFontFamily"; + EditorOption2[EditorOption2["codeLensFontSize"] = 19] = "codeLensFontSize"; + EditorOption2[EditorOption2["colorDecorators"] = 20] = "colorDecorators"; + EditorOption2[EditorOption2["colorDecoratorsLimit"] = 21] = "colorDecoratorsLimit"; + EditorOption2[EditorOption2["columnSelection"] = 22] = "columnSelection"; + EditorOption2[EditorOption2["comments"] = 23] = "comments"; + EditorOption2[EditorOption2["contextmenu"] = 24] = "contextmenu"; + EditorOption2[EditorOption2["copyWithSyntaxHighlighting"] = 25] = "copyWithSyntaxHighlighting"; + EditorOption2[EditorOption2["cursorBlinking"] = 26] = "cursorBlinking"; + EditorOption2[EditorOption2["cursorSmoothCaretAnimation"] = 27] = "cursorSmoothCaretAnimation"; + EditorOption2[EditorOption2["cursorStyle"] = 28] = "cursorStyle"; + EditorOption2[EditorOption2["cursorSurroundingLines"] = 29] = "cursorSurroundingLines"; + EditorOption2[EditorOption2["cursorSurroundingLinesStyle"] = 30] = "cursorSurroundingLinesStyle"; + EditorOption2[EditorOption2["cursorWidth"] = 31] = "cursorWidth"; + EditorOption2[EditorOption2["disableLayerHinting"] = 32] = "disableLayerHinting"; + EditorOption2[EditorOption2["disableMonospaceOptimizations"] = 33] = "disableMonospaceOptimizations"; + EditorOption2[EditorOption2["domReadOnly"] = 34] = "domReadOnly"; + EditorOption2[EditorOption2["dragAndDrop"] = 35] = "dragAndDrop"; + EditorOption2[EditorOption2["dropIntoEditor"] = 36] = "dropIntoEditor"; + EditorOption2[EditorOption2["emptySelectionClipboard"] = 37] = "emptySelectionClipboard"; + EditorOption2[EditorOption2["experimentalWhitespaceRendering"] = 38] = "experimentalWhitespaceRendering"; + EditorOption2[EditorOption2["extraEditorClassName"] = 39] = "extraEditorClassName"; + EditorOption2[EditorOption2["fastScrollSensitivity"] = 40] = "fastScrollSensitivity"; + EditorOption2[EditorOption2["find"] = 41] = "find"; + EditorOption2[EditorOption2["fixedOverflowWidgets"] = 42] = "fixedOverflowWidgets"; + EditorOption2[EditorOption2["folding"] = 43] = "folding"; + EditorOption2[EditorOption2["foldingStrategy"] = 44] = "foldingStrategy"; + EditorOption2[EditorOption2["foldingHighlight"] = 45] = "foldingHighlight"; + EditorOption2[EditorOption2["foldingImportsByDefault"] = 46] = "foldingImportsByDefault"; + EditorOption2[EditorOption2["foldingMaximumRegions"] = 47] = "foldingMaximumRegions"; + EditorOption2[EditorOption2["unfoldOnClickAfterEndOfLine"] = 48] = "unfoldOnClickAfterEndOfLine"; + EditorOption2[EditorOption2["fontFamily"] = 49] = "fontFamily"; + EditorOption2[EditorOption2["fontInfo"] = 50] = "fontInfo"; + EditorOption2[EditorOption2["fontLigatures"] = 51] = "fontLigatures"; + EditorOption2[EditorOption2["fontSize"] = 52] = "fontSize"; + EditorOption2[EditorOption2["fontWeight"] = 53] = "fontWeight"; + EditorOption2[EditorOption2["fontVariations"] = 54] = "fontVariations"; + EditorOption2[EditorOption2["formatOnPaste"] = 55] = "formatOnPaste"; + EditorOption2[EditorOption2["formatOnType"] = 56] = "formatOnType"; + EditorOption2[EditorOption2["glyphMargin"] = 57] = "glyphMargin"; + EditorOption2[EditorOption2["gotoLocation"] = 58] = "gotoLocation"; + EditorOption2[EditorOption2["hideCursorInOverviewRuler"] = 59] = "hideCursorInOverviewRuler"; + EditorOption2[EditorOption2["hover"] = 60] = "hover"; + EditorOption2[EditorOption2["inDiffEditor"] = 61] = "inDiffEditor"; + EditorOption2[EditorOption2["inlineSuggest"] = 62] = "inlineSuggest"; + EditorOption2[EditorOption2["inlineEdit"] = 63] = "inlineEdit"; + EditorOption2[EditorOption2["letterSpacing"] = 64] = "letterSpacing"; + EditorOption2[EditorOption2["lightbulb"] = 65] = "lightbulb"; + EditorOption2[EditorOption2["lineDecorationsWidth"] = 66] = "lineDecorationsWidth"; + EditorOption2[EditorOption2["lineHeight"] = 67] = "lineHeight"; + EditorOption2[EditorOption2["lineNumbers"] = 68] = "lineNumbers"; + EditorOption2[EditorOption2["lineNumbersMinChars"] = 69] = "lineNumbersMinChars"; + EditorOption2[EditorOption2["linkedEditing"] = 70] = "linkedEditing"; + EditorOption2[EditorOption2["links"] = 71] = "links"; + EditorOption2[EditorOption2["matchBrackets"] = 72] = "matchBrackets"; + EditorOption2[EditorOption2["minimap"] = 73] = "minimap"; + EditorOption2[EditorOption2["mouseStyle"] = 74] = "mouseStyle"; + EditorOption2[EditorOption2["mouseWheelScrollSensitivity"] = 75] = "mouseWheelScrollSensitivity"; + EditorOption2[EditorOption2["mouseWheelZoom"] = 76] = "mouseWheelZoom"; + EditorOption2[EditorOption2["multiCursorMergeOverlapping"] = 77] = "multiCursorMergeOverlapping"; + EditorOption2[EditorOption2["multiCursorModifier"] = 78] = "multiCursorModifier"; + EditorOption2[EditorOption2["multiCursorPaste"] = 79] = "multiCursorPaste"; + EditorOption2[EditorOption2["multiCursorLimit"] = 80] = "multiCursorLimit"; + EditorOption2[EditorOption2["occurrencesHighlight"] = 81] = "occurrencesHighlight"; + EditorOption2[EditorOption2["overviewRulerBorder"] = 82] = "overviewRulerBorder"; + EditorOption2[EditorOption2["overviewRulerLanes"] = 83] = "overviewRulerLanes"; + EditorOption2[EditorOption2["padding"] = 84] = "padding"; + EditorOption2[EditorOption2["pasteAs"] = 85] = "pasteAs"; + EditorOption2[EditorOption2["parameterHints"] = 86] = "parameterHints"; + EditorOption2[EditorOption2["peekWidgetDefaultFocus"] = 87] = "peekWidgetDefaultFocus"; + EditorOption2[EditorOption2["definitionLinkOpensInPeek"] = 88] = "definitionLinkOpensInPeek"; + EditorOption2[EditorOption2["quickSuggestions"] = 89] = "quickSuggestions"; + EditorOption2[EditorOption2["quickSuggestionsDelay"] = 90] = "quickSuggestionsDelay"; + EditorOption2[EditorOption2["readOnly"] = 91] = "readOnly"; + EditorOption2[EditorOption2["readOnlyMessage"] = 92] = "readOnlyMessage"; + EditorOption2[EditorOption2["renameOnType"] = 93] = "renameOnType"; + EditorOption2[EditorOption2["renderControlCharacters"] = 94] = "renderControlCharacters"; + EditorOption2[EditorOption2["renderFinalNewline"] = 95] = "renderFinalNewline"; + EditorOption2[EditorOption2["renderLineHighlight"] = 96] = "renderLineHighlight"; + EditorOption2[EditorOption2["renderLineHighlightOnlyWhenFocus"] = 97] = "renderLineHighlightOnlyWhenFocus"; + EditorOption2[EditorOption2["renderValidationDecorations"] = 98] = "renderValidationDecorations"; + EditorOption2[EditorOption2["renderWhitespace"] = 99] = "renderWhitespace"; + EditorOption2[EditorOption2["revealHorizontalRightPadding"] = 100] = "revealHorizontalRightPadding"; + EditorOption2[EditorOption2["roundedSelection"] = 101] = "roundedSelection"; + EditorOption2[EditorOption2["rulers"] = 102] = "rulers"; + EditorOption2[EditorOption2["scrollbar"] = 103] = "scrollbar"; + EditorOption2[EditorOption2["scrollBeyondLastColumn"] = 104] = "scrollBeyondLastColumn"; + EditorOption2[EditorOption2["scrollBeyondLastLine"] = 105] = "scrollBeyondLastLine"; + EditorOption2[EditorOption2["scrollPredominantAxis"] = 106] = "scrollPredominantAxis"; + EditorOption2[EditorOption2["selectionClipboard"] = 107] = "selectionClipboard"; + EditorOption2[EditorOption2["selectionHighlight"] = 108] = "selectionHighlight"; + EditorOption2[EditorOption2["selectOnLineNumbers"] = 109] = "selectOnLineNumbers"; + EditorOption2[EditorOption2["showFoldingControls"] = 110] = "showFoldingControls"; + EditorOption2[EditorOption2["showUnused"] = 111] = "showUnused"; + EditorOption2[EditorOption2["snippetSuggestions"] = 112] = "snippetSuggestions"; + EditorOption2[EditorOption2["smartSelect"] = 113] = "smartSelect"; + EditorOption2[EditorOption2["smoothScrolling"] = 114] = "smoothScrolling"; + EditorOption2[EditorOption2["stickyScroll"] = 115] = "stickyScroll"; + EditorOption2[EditorOption2["stickyTabStops"] = 116] = "stickyTabStops"; + EditorOption2[EditorOption2["stopRenderingLineAfter"] = 117] = "stopRenderingLineAfter"; + EditorOption2[EditorOption2["suggest"] = 118] = "suggest"; + EditorOption2[EditorOption2["suggestFontSize"] = 119] = "suggestFontSize"; + EditorOption2[EditorOption2["suggestLineHeight"] = 120] = "suggestLineHeight"; + EditorOption2[EditorOption2["suggestOnTriggerCharacters"] = 121] = "suggestOnTriggerCharacters"; + EditorOption2[EditorOption2["suggestSelection"] = 122] = "suggestSelection"; + EditorOption2[EditorOption2["tabCompletion"] = 123] = "tabCompletion"; + EditorOption2[EditorOption2["tabIndex"] = 124] = "tabIndex"; + EditorOption2[EditorOption2["unicodeHighlighting"] = 125] = "unicodeHighlighting"; + EditorOption2[EditorOption2["unusualLineTerminators"] = 126] = "unusualLineTerminators"; + EditorOption2[EditorOption2["useShadowDOM"] = 127] = "useShadowDOM"; + EditorOption2[EditorOption2["useTabStops"] = 128] = "useTabStops"; + EditorOption2[EditorOption2["wordBreak"] = 129] = "wordBreak"; + EditorOption2[EditorOption2["wordSegmenterLocales"] = 130] = "wordSegmenterLocales"; + EditorOption2[EditorOption2["wordSeparators"] = 131] = "wordSeparators"; + EditorOption2[EditorOption2["wordWrap"] = 132] = "wordWrap"; + EditorOption2[EditorOption2["wordWrapBreakAfterCharacters"] = 133] = "wordWrapBreakAfterCharacters"; + EditorOption2[EditorOption2["wordWrapBreakBeforeCharacters"] = 134] = "wordWrapBreakBeforeCharacters"; + EditorOption2[EditorOption2["wordWrapColumn"] = 135] = "wordWrapColumn"; + EditorOption2[EditorOption2["wordWrapOverride1"] = 136] = "wordWrapOverride1"; + EditorOption2[EditorOption2["wordWrapOverride2"] = 137] = "wordWrapOverride2"; + EditorOption2[EditorOption2["wrappingIndent"] = 138] = "wrappingIndent"; + EditorOption2[EditorOption2["wrappingStrategy"] = 139] = "wrappingStrategy"; + EditorOption2[EditorOption2["showDeprecated"] = 140] = "showDeprecated"; + EditorOption2[EditorOption2["inlayHints"] = 141] = "inlayHints"; + EditorOption2[EditorOption2["editorClassName"] = 142] = "editorClassName"; + EditorOption2[EditorOption2["pixelRatio"] = 143] = "pixelRatio"; + EditorOption2[EditorOption2["tabFocusMode"] = 144] = "tabFocusMode"; + EditorOption2[EditorOption2["layoutInfo"] = 145] = "layoutInfo"; + EditorOption2[EditorOption2["wrappingInfo"] = 146] = "wrappingInfo"; + EditorOption2[EditorOption2["defaultColorDecorators"] = 147] = "defaultColorDecorators"; + EditorOption2[EditorOption2["colorDecoratorsActivatedOn"] = 148] = "colorDecoratorsActivatedOn"; + EditorOption2[EditorOption2["inlineCompletionsAccessibilityVerbose"] = 149] = "inlineCompletionsAccessibilityVerbose"; + })(EditorOption || (EditorOption = {})); + (function(EndOfLinePreference2) { + EndOfLinePreference2[EndOfLinePreference2["TextDefined"] = 0] = "TextDefined"; + EndOfLinePreference2[EndOfLinePreference2["LF"] = 1] = "LF"; + EndOfLinePreference2[EndOfLinePreference2["CRLF"] = 2] = "CRLF"; + })(EndOfLinePreference || (EndOfLinePreference = {})); + (function(EndOfLineSequence2) { + EndOfLineSequence2[EndOfLineSequence2["LF"] = 0] = "LF"; + EndOfLineSequence2[EndOfLineSequence2["CRLF"] = 1] = "CRLF"; + })(EndOfLineSequence || (EndOfLineSequence = {})); + (function(GlyphMarginLane3) { + GlyphMarginLane3[GlyphMarginLane3["Left"] = 1] = "Left"; + GlyphMarginLane3[GlyphMarginLane3["Center"] = 2] = "Center"; + GlyphMarginLane3[GlyphMarginLane3["Right"] = 3] = "Right"; + })(GlyphMarginLane || (GlyphMarginLane = {})); + (function(HoverVerbosityAction3) { + HoverVerbosityAction3[HoverVerbosityAction3["Increase"] = 0] = "Increase"; + HoverVerbosityAction3[HoverVerbosityAction3["Decrease"] = 1] = "Decrease"; + })(HoverVerbosityAction2 || (HoverVerbosityAction2 = {})); + (function(IndentAction3) { + IndentAction3[IndentAction3["None"] = 0] = "None"; + IndentAction3[IndentAction3["Indent"] = 1] = "Indent"; + IndentAction3[IndentAction3["IndentOutdent"] = 2] = "IndentOutdent"; + IndentAction3[IndentAction3["Outdent"] = 3] = "Outdent"; + })(IndentAction || (IndentAction = {})); + (function(InjectedTextCursorStops3) { + InjectedTextCursorStops3[InjectedTextCursorStops3["Both"] = 0] = "Both"; + InjectedTextCursorStops3[InjectedTextCursorStops3["Right"] = 1] = "Right"; + InjectedTextCursorStops3[InjectedTextCursorStops3["Left"] = 2] = "Left"; + InjectedTextCursorStops3[InjectedTextCursorStops3["None"] = 3] = "None"; + })(InjectedTextCursorStops || (InjectedTextCursorStops = {})); + (function(InlayHintKind9) { + InlayHintKind9[InlayHintKind9["Type"] = 1] = "Type"; + InlayHintKind9[InlayHintKind9["Parameter"] = 2] = "Parameter"; + })(InlayHintKind2 || (InlayHintKind2 = {})); + (function(InlineCompletionTriggerKind9) { + InlineCompletionTriggerKind9[InlineCompletionTriggerKind9["Automatic"] = 0] = "Automatic"; + InlineCompletionTriggerKind9[InlineCompletionTriggerKind9["Explicit"] = 1] = "Explicit"; + })(InlineCompletionTriggerKind2 || (InlineCompletionTriggerKind2 = {})); + (function(InlineEditTriggerKind3) { + InlineEditTriggerKind3[InlineEditTriggerKind3["Invoke"] = 0] = "Invoke"; + InlineEditTriggerKind3[InlineEditTriggerKind3["Automatic"] = 1] = "Automatic"; + })(InlineEditTriggerKind2 || (InlineEditTriggerKind2 = {})); + (function(KeyCode3) { + KeyCode3[KeyCode3["DependsOnKbLayout"] = -1] = "DependsOnKbLayout"; + KeyCode3[KeyCode3["Unknown"] = 0] = "Unknown"; + KeyCode3[KeyCode3["Backspace"] = 1] = "Backspace"; + KeyCode3[KeyCode3["Tab"] = 2] = "Tab"; + KeyCode3[KeyCode3["Enter"] = 3] = "Enter"; + KeyCode3[KeyCode3["Shift"] = 4] = "Shift"; + KeyCode3[KeyCode3["Ctrl"] = 5] = "Ctrl"; + KeyCode3[KeyCode3["Alt"] = 6] = "Alt"; + KeyCode3[KeyCode3["PauseBreak"] = 7] = "PauseBreak"; + KeyCode3[KeyCode3["CapsLock"] = 8] = "CapsLock"; + KeyCode3[KeyCode3["Escape"] = 9] = "Escape"; + KeyCode3[KeyCode3["Space"] = 10] = "Space"; + KeyCode3[KeyCode3["PageUp"] = 11] = "PageUp"; + KeyCode3[KeyCode3["PageDown"] = 12] = "PageDown"; + KeyCode3[KeyCode3["End"] = 13] = "End"; + KeyCode3[KeyCode3["Home"] = 14] = "Home"; + KeyCode3[KeyCode3["LeftArrow"] = 15] = "LeftArrow"; + KeyCode3[KeyCode3["UpArrow"] = 16] = "UpArrow"; + KeyCode3[KeyCode3["RightArrow"] = 17] = "RightArrow"; + KeyCode3[KeyCode3["DownArrow"] = 18] = "DownArrow"; + KeyCode3[KeyCode3["Insert"] = 19] = "Insert"; + KeyCode3[KeyCode3["Delete"] = 20] = "Delete"; + KeyCode3[KeyCode3["Digit0"] = 21] = "Digit0"; + KeyCode3[KeyCode3["Digit1"] = 22] = "Digit1"; + KeyCode3[KeyCode3["Digit2"] = 23] = "Digit2"; + KeyCode3[KeyCode3["Digit3"] = 24] = "Digit3"; + KeyCode3[KeyCode3["Digit4"] = 25] = "Digit4"; + KeyCode3[KeyCode3["Digit5"] = 26] = "Digit5"; + KeyCode3[KeyCode3["Digit6"] = 27] = "Digit6"; + KeyCode3[KeyCode3["Digit7"] = 28] = "Digit7"; + KeyCode3[KeyCode3["Digit8"] = 29] = "Digit8"; + KeyCode3[KeyCode3["Digit9"] = 30] = "Digit9"; + KeyCode3[KeyCode3["KeyA"] = 31] = "KeyA"; + KeyCode3[KeyCode3["KeyB"] = 32] = "KeyB"; + KeyCode3[KeyCode3["KeyC"] = 33] = "KeyC"; + KeyCode3[KeyCode3["KeyD"] = 34] = "KeyD"; + KeyCode3[KeyCode3["KeyE"] = 35] = "KeyE"; + KeyCode3[KeyCode3["KeyF"] = 36] = "KeyF"; + KeyCode3[KeyCode3["KeyG"] = 37] = "KeyG"; + KeyCode3[KeyCode3["KeyH"] = 38] = "KeyH"; + KeyCode3[KeyCode3["KeyI"] = 39] = "KeyI"; + KeyCode3[KeyCode3["KeyJ"] = 40] = "KeyJ"; + KeyCode3[KeyCode3["KeyK"] = 41] = "KeyK"; + KeyCode3[KeyCode3["KeyL"] = 42] = "KeyL"; + KeyCode3[KeyCode3["KeyM"] = 43] = "KeyM"; + KeyCode3[KeyCode3["KeyN"] = 44] = "KeyN"; + KeyCode3[KeyCode3["KeyO"] = 45] = "KeyO"; + KeyCode3[KeyCode3["KeyP"] = 46] = "KeyP"; + KeyCode3[KeyCode3["KeyQ"] = 47] = "KeyQ"; + KeyCode3[KeyCode3["KeyR"] = 48] = "KeyR"; + KeyCode3[KeyCode3["KeyS"] = 49] = "KeyS"; + KeyCode3[KeyCode3["KeyT"] = 50] = "KeyT"; + KeyCode3[KeyCode3["KeyU"] = 51] = "KeyU"; + KeyCode3[KeyCode3["KeyV"] = 52] = "KeyV"; + KeyCode3[KeyCode3["KeyW"] = 53] = "KeyW"; + KeyCode3[KeyCode3["KeyX"] = 54] = "KeyX"; + KeyCode3[KeyCode3["KeyY"] = 55] = "KeyY"; + KeyCode3[KeyCode3["KeyZ"] = 56] = "KeyZ"; + KeyCode3[KeyCode3["Meta"] = 57] = "Meta"; + KeyCode3[KeyCode3["ContextMenu"] = 58] = "ContextMenu"; + KeyCode3[KeyCode3["F1"] = 59] = "F1"; + KeyCode3[KeyCode3["F2"] = 60] = "F2"; + KeyCode3[KeyCode3["F3"] = 61] = "F3"; + KeyCode3[KeyCode3["F4"] = 62] = "F4"; + KeyCode3[KeyCode3["F5"] = 63] = "F5"; + KeyCode3[KeyCode3["F6"] = 64] = "F6"; + KeyCode3[KeyCode3["F7"] = 65] = "F7"; + KeyCode3[KeyCode3["F8"] = 66] = "F8"; + KeyCode3[KeyCode3["F9"] = 67] = "F9"; + KeyCode3[KeyCode3["F10"] = 68] = "F10"; + KeyCode3[KeyCode3["F11"] = 69] = "F11"; + KeyCode3[KeyCode3["F12"] = 70] = "F12"; + KeyCode3[KeyCode3["F13"] = 71] = "F13"; + KeyCode3[KeyCode3["F14"] = 72] = "F14"; + KeyCode3[KeyCode3["F15"] = 73] = "F15"; + KeyCode3[KeyCode3["F16"] = 74] = "F16"; + KeyCode3[KeyCode3["F17"] = 75] = "F17"; + KeyCode3[KeyCode3["F18"] = 76] = "F18"; + KeyCode3[KeyCode3["F19"] = 77] = "F19"; + KeyCode3[KeyCode3["F20"] = 78] = "F20"; + KeyCode3[KeyCode3["F21"] = 79] = "F21"; + KeyCode3[KeyCode3["F22"] = 80] = "F22"; + KeyCode3[KeyCode3["F23"] = 81] = "F23"; + KeyCode3[KeyCode3["F24"] = 82] = "F24"; + KeyCode3[KeyCode3["NumLock"] = 83] = "NumLock"; + KeyCode3[KeyCode3["ScrollLock"] = 84] = "ScrollLock"; + KeyCode3[KeyCode3["Semicolon"] = 85] = "Semicolon"; + KeyCode3[KeyCode3["Equal"] = 86] = "Equal"; + KeyCode3[KeyCode3["Comma"] = 87] = "Comma"; + KeyCode3[KeyCode3["Minus"] = 88] = "Minus"; + KeyCode3[KeyCode3["Period"] = 89] = "Period"; + KeyCode3[KeyCode3["Slash"] = 90] = "Slash"; + KeyCode3[KeyCode3["Backquote"] = 91] = "Backquote"; + KeyCode3[KeyCode3["BracketLeft"] = 92] = "BracketLeft"; + KeyCode3[KeyCode3["Backslash"] = 93] = "Backslash"; + KeyCode3[KeyCode3["BracketRight"] = 94] = "BracketRight"; + KeyCode3[KeyCode3["Quote"] = 95] = "Quote"; + KeyCode3[KeyCode3["OEM_8"] = 96] = "OEM_8"; + KeyCode3[KeyCode3["IntlBackslash"] = 97] = "IntlBackslash"; + KeyCode3[KeyCode3["Numpad0"] = 98] = "Numpad0"; + KeyCode3[KeyCode3["Numpad1"] = 99] = "Numpad1"; + KeyCode3[KeyCode3["Numpad2"] = 100] = "Numpad2"; + KeyCode3[KeyCode3["Numpad3"] = 101] = "Numpad3"; + KeyCode3[KeyCode3["Numpad4"] = 102] = "Numpad4"; + KeyCode3[KeyCode3["Numpad5"] = 103] = "Numpad5"; + KeyCode3[KeyCode3["Numpad6"] = 104] = "Numpad6"; + KeyCode3[KeyCode3["Numpad7"] = 105] = "Numpad7"; + KeyCode3[KeyCode3["Numpad8"] = 106] = "Numpad8"; + KeyCode3[KeyCode3["Numpad9"] = 107] = "Numpad9"; + KeyCode3[KeyCode3["NumpadMultiply"] = 108] = "NumpadMultiply"; + KeyCode3[KeyCode3["NumpadAdd"] = 109] = "NumpadAdd"; + KeyCode3[KeyCode3["NUMPAD_SEPARATOR"] = 110] = "NUMPAD_SEPARATOR"; + KeyCode3[KeyCode3["NumpadSubtract"] = 111] = "NumpadSubtract"; + KeyCode3[KeyCode3["NumpadDecimal"] = 112] = "NumpadDecimal"; + KeyCode3[KeyCode3["NumpadDivide"] = 113] = "NumpadDivide"; + KeyCode3[KeyCode3["KEY_IN_COMPOSITION"] = 114] = "KEY_IN_COMPOSITION"; + KeyCode3[KeyCode3["ABNT_C1"] = 115] = "ABNT_C1"; + KeyCode3[KeyCode3["ABNT_C2"] = 116] = "ABNT_C2"; + KeyCode3[KeyCode3["AudioVolumeMute"] = 117] = "AudioVolumeMute"; + KeyCode3[KeyCode3["AudioVolumeUp"] = 118] = "AudioVolumeUp"; + KeyCode3[KeyCode3["AudioVolumeDown"] = 119] = "AudioVolumeDown"; + KeyCode3[KeyCode3["BrowserSearch"] = 120] = "BrowserSearch"; + KeyCode3[KeyCode3["BrowserHome"] = 121] = "BrowserHome"; + KeyCode3[KeyCode3["BrowserBack"] = 122] = "BrowserBack"; + KeyCode3[KeyCode3["BrowserForward"] = 123] = "BrowserForward"; + KeyCode3[KeyCode3["MediaTrackNext"] = 124] = "MediaTrackNext"; + KeyCode3[KeyCode3["MediaTrackPrevious"] = 125] = "MediaTrackPrevious"; + KeyCode3[KeyCode3["MediaStop"] = 126] = "MediaStop"; + KeyCode3[KeyCode3["MediaPlayPause"] = 127] = "MediaPlayPause"; + KeyCode3[KeyCode3["LaunchMediaPlayer"] = 128] = "LaunchMediaPlayer"; + KeyCode3[KeyCode3["LaunchMail"] = 129] = "LaunchMail"; + KeyCode3[KeyCode3["LaunchApp2"] = 130] = "LaunchApp2"; + KeyCode3[KeyCode3["Clear"] = 131] = "Clear"; + KeyCode3[KeyCode3["MAX_VALUE"] = 132] = "MAX_VALUE"; + })(KeyCode || (KeyCode = {})); + (function(MarkerSeverity4) { + MarkerSeverity4[MarkerSeverity4["Hint"] = 1] = "Hint"; + MarkerSeverity4[MarkerSeverity4["Info"] = 2] = "Info"; + MarkerSeverity4[MarkerSeverity4["Warning"] = 4] = "Warning"; + MarkerSeverity4[MarkerSeverity4["Error"] = 8] = "Error"; + })(MarkerSeverity || (MarkerSeverity = {})); + (function(MarkerTag3) { + MarkerTag3[MarkerTag3["Unnecessary"] = 1] = "Unnecessary"; + MarkerTag3[MarkerTag3["Deprecated"] = 2] = "Deprecated"; + })(MarkerTag || (MarkerTag = {})); + (function(MinimapPosition2) { + MinimapPosition2[MinimapPosition2["Inline"] = 1] = "Inline"; + MinimapPosition2[MinimapPosition2["Gutter"] = 2] = "Gutter"; + })(MinimapPosition || (MinimapPosition = {})); + (function(MinimapSectionHeaderStyle2) { + MinimapSectionHeaderStyle2[MinimapSectionHeaderStyle2["Normal"] = 1] = "Normal"; + MinimapSectionHeaderStyle2[MinimapSectionHeaderStyle2["Underlined"] = 2] = "Underlined"; + })(MinimapSectionHeaderStyle || (MinimapSectionHeaderStyle = {})); + (function(MouseTargetType2) { + MouseTargetType2[MouseTargetType2["UNKNOWN"] = 0] = "UNKNOWN"; + MouseTargetType2[MouseTargetType2["TEXTAREA"] = 1] = "TEXTAREA"; + MouseTargetType2[MouseTargetType2["GUTTER_GLYPH_MARGIN"] = 2] = "GUTTER_GLYPH_MARGIN"; + MouseTargetType2[MouseTargetType2["GUTTER_LINE_NUMBERS"] = 3] = "GUTTER_LINE_NUMBERS"; + MouseTargetType2[MouseTargetType2["GUTTER_LINE_DECORATIONS"] = 4] = "GUTTER_LINE_DECORATIONS"; + MouseTargetType2[MouseTargetType2["GUTTER_VIEW_ZONE"] = 5] = "GUTTER_VIEW_ZONE"; + MouseTargetType2[MouseTargetType2["CONTENT_TEXT"] = 6] = "CONTENT_TEXT"; + MouseTargetType2[MouseTargetType2["CONTENT_EMPTY"] = 7] = "CONTENT_EMPTY"; + MouseTargetType2[MouseTargetType2["CONTENT_VIEW_ZONE"] = 8] = "CONTENT_VIEW_ZONE"; + MouseTargetType2[MouseTargetType2["CONTENT_WIDGET"] = 9] = "CONTENT_WIDGET"; + MouseTargetType2[MouseTargetType2["OVERVIEW_RULER"] = 10] = "OVERVIEW_RULER"; + MouseTargetType2[MouseTargetType2["SCROLLBAR"] = 11] = "SCROLLBAR"; + MouseTargetType2[MouseTargetType2["OVERLAY_WIDGET"] = 12] = "OVERLAY_WIDGET"; + MouseTargetType2[MouseTargetType2["OUTSIDE_EDITOR"] = 13] = "OUTSIDE_EDITOR"; + })(MouseTargetType || (MouseTargetType = {})); + (function(NewSymbolNameTag3) { + NewSymbolNameTag3[NewSymbolNameTag3["AIGenerated"] = 1] = "AIGenerated"; + })(NewSymbolNameTag2 || (NewSymbolNameTag2 = {})); + (function(NewSymbolNameTriggerKind3) { + NewSymbolNameTriggerKind3[NewSymbolNameTriggerKind3["Invoke"] = 0] = "Invoke"; + NewSymbolNameTriggerKind3[NewSymbolNameTriggerKind3["Automatic"] = 1] = "Automatic"; + })(NewSymbolNameTriggerKind2 || (NewSymbolNameTriggerKind2 = {})); + (function(OverlayWidgetPositionPreference2) { + OverlayWidgetPositionPreference2[OverlayWidgetPositionPreference2["TOP_RIGHT_CORNER"] = 0] = "TOP_RIGHT_CORNER"; + OverlayWidgetPositionPreference2[OverlayWidgetPositionPreference2["BOTTOM_RIGHT_CORNER"] = 1] = "BOTTOM_RIGHT_CORNER"; + OverlayWidgetPositionPreference2[OverlayWidgetPositionPreference2["TOP_CENTER"] = 2] = "TOP_CENTER"; + })(OverlayWidgetPositionPreference || (OverlayWidgetPositionPreference = {})); + (function(OverviewRulerLane3) { + OverviewRulerLane3[OverviewRulerLane3["Left"] = 1] = "Left"; + OverviewRulerLane3[OverviewRulerLane3["Center"] = 2] = "Center"; + OverviewRulerLane3[OverviewRulerLane3["Right"] = 4] = "Right"; + OverviewRulerLane3[OverviewRulerLane3["Full"] = 7] = "Full"; + })(OverviewRulerLane || (OverviewRulerLane = {})); + (function(PartialAcceptTriggerKind2) { + PartialAcceptTriggerKind2[PartialAcceptTriggerKind2["Word"] = 0] = "Word"; + PartialAcceptTriggerKind2[PartialAcceptTriggerKind2["Line"] = 1] = "Line"; + PartialAcceptTriggerKind2[PartialAcceptTriggerKind2["Suggest"] = 2] = "Suggest"; + })(PartialAcceptTriggerKind || (PartialAcceptTriggerKind = {})); + (function(PositionAffinity2) { + PositionAffinity2[PositionAffinity2["Left"] = 0] = "Left"; + PositionAffinity2[PositionAffinity2["Right"] = 1] = "Right"; + PositionAffinity2[PositionAffinity2["None"] = 2] = "None"; + PositionAffinity2[PositionAffinity2["LeftOfInjectedText"] = 3] = "LeftOfInjectedText"; + PositionAffinity2[PositionAffinity2["RightOfInjectedText"] = 4] = "RightOfInjectedText"; + })(PositionAffinity || (PositionAffinity = {})); + (function(RenderLineNumbersType2) { + RenderLineNumbersType2[RenderLineNumbersType2["Off"] = 0] = "Off"; + RenderLineNumbersType2[RenderLineNumbersType2["On"] = 1] = "On"; + RenderLineNumbersType2[RenderLineNumbersType2["Relative"] = 2] = "Relative"; + RenderLineNumbersType2[RenderLineNumbersType2["Interval"] = 3] = "Interval"; + RenderLineNumbersType2[RenderLineNumbersType2["Custom"] = 4] = "Custom"; + })(RenderLineNumbersType || (RenderLineNumbersType = {})); + (function(RenderMinimap2) { + RenderMinimap2[RenderMinimap2["None"] = 0] = "None"; + RenderMinimap2[RenderMinimap2["Text"] = 1] = "Text"; + RenderMinimap2[RenderMinimap2["Blocks"] = 2] = "Blocks"; + })(RenderMinimap || (RenderMinimap = {})); + (function(ScrollType2) { + ScrollType2[ScrollType2["Smooth"] = 0] = "Smooth"; + ScrollType2[ScrollType2["Immediate"] = 1] = "Immediate"; + })(ScrollType || (ScrollType = {})); + (function(ScrollbarVisibility2) { + ScrollbarVisibility2[ScrollbarVisibility2["Auto"] = 1] = "Auto"; + ScrollbarVisibility2[ScrollbarVisibility2["Hidden"] = 2] = "Hidden"; + ScrollbarVisibility2[ScrollbarVisibility2["Visible"] = 3] = "Visible"; + })(ScrollbarVisibility || (ScrollbarVisibility = {})); + (function(SelectionDirection3) { + SelectionDirection3[SelectionDirection3["LTR"] = 0] = "LTR"; + SelectionDirection3[SelectionDirection3["RTL"] = 1] = "RTL"; + })(SelectionDirection || (SelectionDirection = {})); + (function(ShowLightbulbIconMode3) { + ShowLightbulbIconMode3["Off"] = "off"; + ShowLightbulbIconMode3["OnCode"] = "onCode"; + ShowLightbulbIconMode3["On"] = "on"; + })(ShowLightbulbIconMode2 || (ShowLightbulbIconMode2 = {})); + (function(SignatureHelpTriggerKind3) { + SignatureHelpTriggerKind3[SignatureHelpTriggerKind3["Invoke"] = 1] = "Invoke"; + SignatureHelpTriggerKind3[SignatureHelpTriggerKind3["TriggerCharacter"] = 2] = "TriggerCharacter"; + SignatureHelpTriggerKind3[SignatureHelpTriggerKind3["ContentChange"] = 3] = "ContentChange"; + })(SignatureHelpTriggerKind2 || (SignatureHelpTriggerKind2 = {})); + (function(SymbolKind8) { + SymbolKind8[SymbolKind8["File"] = 0] = "File"; + SymbolKind8[SymbolKind8["Module"] = 1] = "Module"; + SymbolKind8[SymbolKind8["Namespace"] = 2] = "Namespace"; + SymbolKind8[SymbolKind8["Package"] = 3] = "Package"; + SymbolKind8[SymbolKind8["Class"] = 4] = "Class"; + SymbolKind8[SymbolKind8["Method"] = 5] = "Method"; + SymbolKind8[SymbolKind8["Property"] = 6] = "Property"; + SymbolKind8[SymbolKind8["Field"] = 7] = "Field"; + SymbolKind8[SymbolKind8["Constructor"] = 8] = "Constructor"; + SymbolKind8[SymbolKind8["Enum"] = 9] = "Enum"; + SymbolKind8[SymbolKind8["Interface"] = 10] = "Interface"; + SymbolKind8[SymbolKind8["Function"] = 11] = "Function"; + SymbolKind8[SymbolKind8["Variable"] = 12] = "Variable"; + SymbolKind8[SymbolKind8["Constant"] = 13] = "Constant"; + SymbolKind8[SymbolKind8["String"] = 14] = "String"; + SymbolKind8[SymbolKind8["Number"] = 15] = "Number"; + SymbolKind8[SymbolKind8["Boolean"] = 16] = "Boolean"; + SymbolKind8[SymbolKind8["Array"] = 17] = "Array"; + SymbolKind8[SymbolKind8["Object"] = 18] = "Object"; + SymbolKind8[SymbolKind8["Key"] = 19] = "Key"; + SymbolKind8[SymbolKind8["Null"] = 20] = "Null"; + SymbolKind8[SymbolKind8["EnumMember"] = 21] = "EnumMember"; + SymbolKind8[SymbolKind8["Struct"] = 22] = "Struct"; + SymbolKind8[SymbolKind8["Event"] = 23] = "Event"; + SymbolKind8[SymbolKind8["Operator"] = 24] = "Operator"; + SymbolKind8[SymbolKind8["TypeParameter"] = 25] = "TypeParameter"; + })(SymbolKind || (SymbolKind = {})); + (function(SymbolTag8) { + SymbolTag8[SymbolTag8["Deprecated"] = 1] = "Deprecated"; + })(SymbolTag || (SymbolTag = {})); + (function(TextEditorCursorBlinkingStyle2) { + TextEditorCursorBlinkingStyle2[TextEditorCursorBlinkingStyle2["Hidden"] = 0] = "Hidden"; + TextEditorCursorBlinkingStyle2[TextEditorCursorBlinkingStyle2["Blink"] = 1] = "Blink"; + TextEditorCursorBlinkingStyle2[TextEditorCursorBlinkingStyle2["Smooth"] = 2] = "Smooth"; + TextEditorCursorBlinkingStyle2[TextEditorCursorBlinkingStyle2["Phase"] = 3] = "Phase"; + TextEditorCursorBlinkingStyle2[TextEditorCursorBlinkingStyle2["Expand"] = 4] = "Expand"; + TextEditorCursorBlinkingStyle2[TextEditorCursorBlinkingStyle2["Solid"] = 5] = "Solid"; + })(TextEditorCursorBlinkingStyle || (TextEditorCursorBlinkingStyle = {})); + (function(TextEditorCursorStyle3) { + TextEditorCursorStyle3[TextEditorCursorStyle3["Line"] = 1] = "Line"; + TextEditorCursorStyle3[TextEditorCursorStyle3["Block"] = 2] = "Block"; + TextEditorCursorStyle3[TextEditorCursorStyle3["Underline"] = 3] = "Underline"; + TextEditorCursorStyle3[TextEditorCursorStyle3["LineThin"] = 4] = "LineThin"; + TextEditorCursorStyle3[TextEditorCursorStyle3["BlockOutline"] = 5] = "BlockOutline"; + TextEditorCursorStyle3[TextEditorCursorStyle3["UnderlineThin"] = 6] = "UnderlineThin"; + })(TextEditorCursorStyle2 || (TextEditorCursorStyle2 = {})); + (function(TrackedRangeStickiness2) { + TrackedRangeStickiness2[TrackedRangeStickiness2["AlwaysGrowsWhenTypingAtEdges"] = 0] = "AlwaysGrowsWhenTypingAtEdges"; + TrackedRangeStickiness2[TrackedRangeStickiness2["NeverGrowsWhenTypingAtEdges"] = 1] = "NeverGrowsWhenTypingAtEdges"; + TrackedRangeStickiness2[TrackedRangeStickiness2["GrowsOnlyWhenTypingBefore"] = 2] = "GrowsOnlyWhenTypingBefore"; + TrackedRangeStickiness2[TrackedRangeStickiness2["GrowsOnlyWhenTypingAfter"] = 3] = "GrowsOnlyWhenTypingAfter"; + })(TrackedRangeStickiness || (TrackedRangeStickiness = {})); + (function(WrappingIndent2) { + WrappingIndent2[WrappingIndent2["None"] = 0] = "None"; + WrappingIndent2[WrappingIndent2["Same"] = 1] = "Same"; + WrappingIndent2[WrappingIndent2["Indent"] = 2] = "Indent"; + WrappingIndent2[WrappingIndent2["DeepIndent"] = 3] = "DeepIndent"; + })(WrappingIndent || (WrappingIndent = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/editorBaseApi.js +function createMonacoBaseAPI() { + return { + editor: void 0, + // undefined override expected here + languages: void 0, + // undefined override expected here + CancellationTokenSource, + Emitter, + KeyCode, + KeyMod, + Position, + Range, + Selection, + SelectionDirection, + MarkerSeverity, + MarkerTag, + Uri: URI, + Token + }; +} +var KeyMod; +var init_editorBaseApi = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/editorBaseApi.js"() { + init_cancellation(); + init_event(); + init_keyCodes(); + init_uri(); + init_position(); + init_range(); + init_selection(); + init_languages(); + init_standaloneEnums(); + KeyMod = class { + static chord(firstPart, secondPart) { + return KeyChord(firstPart, secondPart); + } + }; + KeyMod.CtrlCmd = 2048; + KeyMod.Shift = 1024; + KeyMod.Alt = 512; + KeyMod.WinCtrl = 256; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/window.js +function ensureCodeWindow(targetWindow, fallbackWindowId) { + const codeWindow = targetWindow; + if (typeof codeWindow.vscodeWindowId !== "number") { + Object.defineProperty(codeWindow, "vscodeWindowId", { + get: () => fallbackWindowId + }); + } +} +var mainWindow; +var init_window = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/window.js"() { + mainWindow = window; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/cache.js +function identity(t4) { + return t4; +} +var LRUCachedFunction, CachedFunction; +var init_cache = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/cache.js"() { + LRUCachedFunction = class { + constructor(arg1, arg2) { + this.lastCache = void 0; + this.lastArgKey = void 0; + if (typeof arg1 === "function") { + this._fn = arg1; + this._computeKey = identity; + } else { + this._fn = arg2; + this._computeKey = arg1.getCacheKey; + } + } + get(arg) { + const key = this._computeKey(arg); + if (this.lastArgKey !== key) { + this.lastArgKey = key; + this.lastCache = this._fn(arg); + } + return this.lastCache; + } + }; + CachedFunction = class { + get cachedValues() { + return this._map; + } + constructor(arg1, arg2) { + this._map = /* @__PURE__ */ new Map(); + this._map2 = /* @__PURE__ */ new Map(); + if (typeof arg1 === "function") { + this._fn = arg1; + this._computeKey = identity; + } else { + this._fn = arg2; + this._computeKey = arg1.getCacheKey; + } + } + get(arg) { + const key = this._computeKey(arg); + if (this._map2.has(key)) { + return this._map2.get(key); + } + const value = this._fn(arg); + this._map.set(arg, value); + this._map2.set(key, value); + return value; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/lazy.js +var Lazy; +var init_lazy = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/lazy.js"() { + Lazy = class { + constructor(executor) { + this.executor = executor; + this._didRun = false; + } + /** + * Get the wrapped value. + * + * This will force evaluation of the lazy value if it has not been resolved yet. Lazy values are only + * resolved once. `getValue` will re-throw exceptions that are hit while resolving the value + */ + get value() { + if (!this._didRun) { + try { + this._value = this.executor(); + } catch (err) { + this._error = err; + } finally { + this._didRun = true; + } + } + if (this._error) { + throw this._error; + } + return this._value; + } + /** + * Get the wrapped value without forcing evaluation. + */ + get rawValue() { + return this._value; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/strings.js +function isFalsyOrWhitespace(str) { + if (!str || typeof str !== "string") { + return true; + } + return str.trim().length === 0; +} +function format(value, ...args) { + if (args.length === 0) { + return value; + } + return value.replace(_formatRegexp, function(match2, group) { + const idx = parseInt(group, 10); + return isNaN(idx) || idx < 0 || idx >= args.length ? match2 : args[idx]; + }); +} +function htmlAttributeEncodeValue(value) { + return value.replace(/[<>"'&]/g, (ch) => { + switch (ch) { + case "<": + return "<"; + case ">": + return ">"; + case '"': + return """; + case "'": + return "'"; + case "&": + return "&"; + } + return ch; + }); +} +function escape(html2) { + return html2.replace(/[<>&]/g, function(match2) { + switch (match2) { + case "<": + return "<"; + case ">": + return ">"; + case "&": + return "&"; + default: + return match2; + } + }); +} +function escapeRegExpCharacters(value) { + return value.replace(/[\\\{\}\*\+\?\|\^\$\.\[\]\(\)]/g, "\\$&"); +} +function trim(haystack, needle = " ") { + const trimmed = ltrim(haystack, needle); + return rtrim(trimmed, needle); +} +function ltrim(haystack, needle) { + if (!haystack || !needle) { + return haystack; + } + const needleLen = needle.length; + if (needleLen === 0 || haystack.length === 0) { + return haystack; + } + let offset = 0; + while (haystack.indexOf(needle, offset) === offset) { + offset = offset + needleLen; + } + return haystack.substring(offset); +} +function rtrim(haystack, needle) { + if (!haystack || !needle) { + return haystack; + } + const needleLen = needle.length, haystackLen = haystack.length; + if (needleLen === 0 || haystackLen === 0) { + return haystack; + } + let offset = haystackLen, idx = -1; + while (true) { + idx = haystack.lastIndexOf(needle, offset - 1); + if (idx === -1 || idx + needleLen !== offset) { + break; + } + if (idx === 0) { + return ""; + } + offset = idx; + } + return haystack.substring(0, offset); +} +function convertSimple2RegExpPattern(pattern) { + return pattern.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g, "\\$&").replace(/[\*]/g, ".*"); +} +function stripWildcards(pattern) { + return pattern.replace(/\*/g, ""); +} +function createRegExp(searchString, isRegex, options2 = {}) { + if (!searchString) { + throw new Error("Cannot create regex from empty string"); + } + if (!isRegex) { + searchString = escapeRegExpCharacters(searchString); + } + if (options2.wholeWord) { + if (!/\B/.test(searchString.charAt(0))) { + searchString = "\\b" + searchString; + } + if (!/\B/.test(searchString.charAt(searchString.length - 1))) { + searchString = searchString + "\\b"; + } + } + let modifiers = ""; + if (options2.global) { + modifiers += "g"; + } + if (!options2.matchCase) { + modifiers += "i"; + } + if (options2.multiline) { + modifiers += "m"; + } + if (options2.unicode) { + modifiers += "u"; + } + return new RegExp(searchString, modifiers); +} +function regExpLeadsToEndlessLoop(regexp) { + if (regexp.source === "^" || regexp.source === "^$" || regexp.source === "$" || regexp.source === "^\\s*$") { + return false; + } + const match2 = regexp.exec(""); + return !!(match2 && regexp.lastIndex === 0); +} +function splitLines(str) { + return str.split(/\r\n|\r|\n/); +} +function splitLinesIncludeSeparators(str) { + var _b4; + const linesWithSeparators = []; + const splitLinesAndSeparators = str.split(/(\r\n|\r|\n)/); + for (let i = 0; i < Math.ceil(splitLinesAndSeparators.length / 2); i++) { + linesWithSeparators.push(splitLinesAndSeparators[2 * i] + ((_b4 = splitLinesAndSeparators[2 * i + 1]) !== null && _b4 !== void 0 ? _b4 : "")); + } + return linesWithSeparators; +} +function firstNonWhitespaceIndex(str) { + for (let i = 0, len = str.length; i < len; i++) { + const chCode = str.charCodeAt(i); + if (chCode !== 32 && chCode !== 9) { + return i; + } + } + return -1; +} +function getLeadingWhitespace(str, start = 0, end = str.length) { + for (let i = start; i < end; i++) { + const chCode = str.charCodeAt(i); + if (chCode !== 32 && chCode !== 9) { + return str.substring(start, i); + } + } + return str.substring(start, end); +} +function lastNonWhitespaceIndex(str, startIndex = str.length - 1) { + for (let i = startIndex; i >= 0; i--) { + const chCode = str.charCodeAt(i); + if (chCode !== 32 && chCode !== 9) { + return i; + } + } + return -1; +} +function compare(a3, b) { + if (a3 < b) { + return -1; + } else if (a3 > b) { + return 1; + } else { + return 0; + } +} +function compareSubstring(a3, b, aStart = 0, aEnd = a3.length, bStart = 0, bEnd = b.length) { + for (; aStart < aEnd && bStart < bEnd; aStart++, bStart++) { + const codeA = a3.charCodeAt(aStart); + const codeB = b.charCodeAt(bStart); + if (codeA < codeB) { + return -1; + } else if (codeA > codeB) { + return 1; + } + } + const aLen = aEnd - aStart; + const bLen = bEnd - bStart; + if (aLen < bLen) { + return -1; + } else if (aLen > bLen) { + return 1; + } + return 0; +} +function compareIgnoreCase(a3, b) { + return compareSubstringIgnoreCase(a3, b, 0, a3.length, 0, b.length); +} +function compareSubstringIgnoreCase(a3, b, aStart = 0, aEnd = a3.length, bStart = 0, bEnd = b.length) { + for (; aStart < aEnd && bStart < bEnd; aStart++, bStart++) { + let codeA = a3.charCodeAt(aStart); + let codeB = b.charCodeAt(bStart); + if (codeA === codeB) { + continue; + } + if (codeA >= 128 || codeB >= 128) { + return compareSubstring(a3.toLowerCase(), b.toLowerCase(), aStart, aEnd, bStart, bEnd); + } + if (isLowerAsciiLetter(codeA)) { + codeA -= 32; + } + if (isLowerAsciiLetter(codeB)) { + codeB -= 32; + } + const diff = codeA - codeB; + if (diff === 0) { + continue; + } + return diff; + } + const aLen = aEnd - aStart; + const bLen = bEnd - bStart; + if (aLen < bLen) { + return -1; + } else if (aLen > bLen) { + return 1; + } + return 0; +} +function isAsciiDigit(code) { + return code >= 48 && code <= 57; +} +function isLowerAsciiLetter(code) { + return code >= 97 && code <= 122; +} +function isUpperAsciiLetter(code) { + return code >= 65 && code <= 90; +} +function equalsIgnoreCase(a3, b) { + return a3.length === b.length && compareSubstringIgnoreCase(a3, b) === 0; +} +function startsWithIgnoreCase(str, candidate) { + const candidateLength = candidate.length; + if (candidate.length > str.length) { + return false; + } + return compareSubstringIgnoreCase(str, candidate, 0, candidateLength) === 0; +} +function commonPrefixLength(a3, b) { + const len = Math.min(a3.length, b.length); + let i; + for (i = 0; i < len; i++) { + if (a3.charCodeAt(i) !== b.charCodeAt(i)) { + return i; + } + } + return len; +} +function commonSuffixLength(a3, b) { + const len = Math.min(a3.length, b.length); + let i; + const aLastIndex = a3.length - 1; + const bLastIndex = b.length - 1; + for (i = 0; i < len; i++) { + if (a3.charCodeAt(aLastIndex - i) !== b.charCodeAt(bLastIndex - i)) { + return i; + } + } + return len; +} +function isHighSurrogate(charCode) { + return 55296 <= charCode && charCode <= 56319; +} +function isLowSurrogate(charCode) { + return 56320 <= charCode && charCode <= 57343; +} +function computeCodePoint(highSurrogate, lowSurrogate) { + return (highSurrogate - 55296 << 10) + (lowSurrogate - 56320) + 65536; +} +function getNextCodePoint(str, len, offset) { + const charCode = str.charCodeAt(offset); + if (isHighSurrogate(charCode) && offset + 1 < len) { + const nextCharCode = str.charCodeAt(offset + 1); + if (isLowSurrogate(nextCharCode)) { + return computeCodePoint(charCode, nextCharCode); + } + } + return charCode; +} +function getPrevCodePoint(str, offset) { + const charCode = str.charCodeAt(offset - 1); + if (isLowSurrogate(charCode) && offset > 1) { + const prevCharCode = str.charCodeAt(offset - 2); + if (isHighSurrogate(prevCharCode)) { + return computeCodePoint(prevCharCode, charCode); + } + } + return charCode; +} +function nextCharLength(str, initialOffset) { + const iterator = new GraphemeIterator(str, initialOffset); + return iterator.nextGraphemeLength(); +} +function prevCharLength(str, initialOffset) { + const iterator = new GraphemeIterator(str, initialOffset); + return iterator.prevGraphemeLength(); +} +function getCharContainingOffset(str, offset) { + if (offset > 0 && isLowSurrogate(str.charCodeAt(offset))) { + offset--; + } + const endOffset = offset + nextCharLength(str, offset); + const startOffset = endOffset - prevCharLength(str, endOffset); + return [startOffset, endOffset]; +} +function makeContainsRtl() { + return /(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA\u07FE-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u088E\u08A0-\u08C9\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDC7\uFDF0-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE35\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDD23\uDE80-\uDEA9\uDEAD-\uDF45\uDF51-\uDF81\uDF86-\uDFF6]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD4B-\uDFFF]|\uD83B[\uDC00-\uDEBB])/; +} +function containsRTL(str) { + if (!CONTAINS_RTL) { + CONTAINS_RTL = makeContainsRtl(); + } + return CONTAINS_RTL.test(str); +} +function isBasicASCII(str) { + return IS_BASIC_ASCII.test(str); +} +function containsUnusualLineTerminators(str) { + return UNUSUAL_LINE_TERMINATORS.test(str); +} +function isFullWidthCharacter(charCode) { + return charCode >= 11904 && charCode <= 55215 || charCode >= 63744 && charCode <= 64255 || charCode >= 65281 && charCode <= 65374; +} +function isEmojiImprecise(x) { + return x >= 127462 && x <= 127487 || x === 8986 || x === 8987 || x === 9200 || x === 9203 || x >= 9728 && x <= 10175 || x === 11088 || x === 11093 || x >= 127744 && x <= 128591 || x >= 128640 && x <= 128764 || x >= 128992 && x <= 129008 || x >= 129280 && x <= 129535 || x >= 129648 && x <= 129782; +} +function startsWithUTF8BOM(str) { + return !!(str && str.length > 0 && str.charCodeAt(0) === 65279); +} +function containsUppercaseCharacter(target, ignoreEscapedChars = false) { + if (!target) { + return false; + } + if (ignoreEscapedChars) { + target = target.replace(/\\./g, ""); + } + return target.toLowerCase() !== target; +} +function singleLetterHash(n) { + const LETTERS_CNT = 90 - 65 + 1; + n = n % (2 * LETTERS_CNT); + if (n < LETTERS_CNT) { + return String.fromCharCode(97 + n); + } + return String.fromCharCode(65 + n - LETTERS_CNT); +} +function breakBetweenGraphemeBreakType(breakTypeA, breakTypeB) { + if (breakTypeA === 0) { + return breakTypeB !== 5 && breakTypeB !== 7; + } + if (breakTypeA === 2) { + if (breakTypeB === 3) { + return false; + } + } + if (breakTypeA === 4 || breakTypeA === 2 || breakTypeA === 3) { + return true; + } + if (breakTypeB === 4 || breakTypeB === 2 || breakTypeB === 3) { + return true; + } + if (breakTypeA === 8) { + if (breakTypeB === 8 || breakTypeB === 9 || breakTypeB === 11 || breakTypeB === 12) { + return false; + } + } + if (breakTypeA === 11 || breakTypeA === 9) { + if (breakTypeB === 9 || breakTypeB === 10) { + return false; + } + } + if (breakTypeA === 12 || breakTypeA === 10) { + if (breakTypeB === 10) { + return false; + } + } + if (breakTypeB === 5 || breakTypeB === 13) { + return false; + } + if (breakTypeB === 7) { + return false; + } + if (breakTypeA === 1) { + return false; + } + if (breakTypeA === 13 && breakTypeB === 14) { + return false; + } + if (breakTypeA === 6 && breakTypeB === 6) { + return false; + } + return true; +} +function getGraphemeBreakRawData() { + return JSON.parse("[0,0,0,51229,51255,12,44061,44087,12,127462,127487,6,7083,7085,5,47645,47671,12,54813,54839,12,128678,128678,14,3270,3270,5,9919,9923,14,45853,45879,12,49437,49463,12,53021,53047,12,71216,71218,7,128398,128399,14,129360,129374,14,2519,2519,5,4448,4519,9,9742,9742,14,12336,12336,14,44957,44983,12,46749,46775,12,48541,48567,12,50333,50359,12,52125,52151,12,53917,53943,12,69888,69890,5,73018,73018,5,127990,127990,14,128558,128559,14,128759,128760,14,129653,129655,14,2027,2035,5,2891,2892,7,3761,3761,5,6683,6683,5,8293,8293,4,9825,9826,14,9999,9999,14,43452,43453,5,44509,44535,12,45405,45431,12,46301,46327,12,47197,47223,12,48093,48119,12,48989,49015,12,49885,49911,12,50781,50807,12,51677,51703,12,52573,52599,12,53469,53495,12,54365,54391,12,65279,65279,4,70471,70472,7,72145,72147,7,119173,119179,5,127799,127818,14,128240,128244,14,128512,128512,14,128652,128652,14,128721,128722,14,129292,129292,14,129445,129450,14,129734,129743,14,1476,1477,5,2366,2368,7,2750,2752,7,3076,3076,5,3415,3415,5,4141,4144,5,6109,6109,5,6964,6964,5,7394,7400,5,9197,9198,14,9770,9770,14,9877,9877,14,9968,9969,14,10084,10084,14,43052,43052,5,43713,43713,5,44285,44311,12,44733,44759,12,45181,45207,12,45629,45655,12,46077,46103,12,46525,46551,12,46973,46999,12,47421,47447,12,47869,47895,12,48317,48343,12,48765,48791,12,49213,49239,12,49661,49687,12,50109,50135,12,50557,50583,12,51005,51031,12,51453,51479,12,51901,51927,12,52349,52375,12,52797,52823,12,53245,53271,12,53693,53719,12,54141,54167,12,54589,54615,12,55037,55063,12,69506,69509,5,70191,70193,5,70841,70841,7,71463,71467,5,72330,72342,5,94031,94031,5,123628,123631,5,127763,127765,14,127941,127941,14,128043,128062,14,128302,128317,14,128465,128467,14,128539,128539,14,128640,128640,14,128662,128662,14,128703,128703,14,128745,128745,14,129004,129007,14,129329,129330,14,129402,129402,14,129483,129483,14,129686,129704,14,130048,131069,14,173,173,4,1757,1757,1,2200,2207,5,2434,2435,7,2631,2632,5,2817,2817,5,3008,3008,5,3201,3201,5,3387,3388,5,3542,3542,5,3902,3903,7,4190,4192,5,6002,6003,5,6439,6440,5,6765,6770,7,7019,7027,5,7154,7155,7,8205,8205,13,8505,8505,14,9654,9654,14,9757,9757,14,9792,9792,14,9852,9853,14,9890,9894,14,9937,9937,14,9981,9981,14,10035,10036,14,11035,11036,14,42654,42655,5,43346,43347,7,43587,43587,5,44006,44007,7,44173,44199,12,44397,44423,12,44621,44647,12,44845,44871,12,45069,45095,12,45293,45319,12,45517,45543,12,45741,45767,12,45965,45991,12,46189,46215,12,46413,46439,12,46637,46663,12,46861,46887,12,47085,47111,12,47309,47335,12,47533,47559,12,47757,47783,12,47981,48007,12,48205,48231,12,48429,48455,12,48653,48679,12,48877,48903,12,49101,49127,12,49325,49351,12,49549,49575,12,49773,49799,12,49997,50023,12,50221,50247,12,50445,50471,12,50669,50695,12,50893,50919,12,51117,51143,12,51341,51367,12,51565,51591,12,51789,51815,12,52013,52039,12,52237,52263,12,52461,52487,12,52685,52711,12,52909,52935,12,53133,53159,12,53357,53383,12,53581,53607,12,53805,53831,12,54029,54055,12,54253,54279,12,54477,54503,12,54701,54727,12,54925,54951,12,55149,55175,12,68101,68102,5,69762,69762,7,70067,70069,7,70371,70378,5,70720,70721,7,71087,71087,5,71341,71341,5,71995,71996,5,72249,72249,7,72850,72871,5,73109,73109,5,118576,118598,5,121505,121519,5,127245,127247,14,127568,127569,14,127777,127777,14,127872,127891,14,127956,127967,14,128015,128016,14,128110,128172,14,128259,128259,14,128367,128368,14,128424,128424,14,128488,128488,14,128530,128532,14,128550,128551,14,128566,128566,14,128647,128647,14,128656,128656,14,128667,128673,14,128691,128693,14,128715,128715,14,128728,128732,14,128752,128752,14,128765,128767,14,129096,129103,14,129311,129311,14,129344,129349,14,129394,129394,14,129413,129425,14,129466,129471,14,129511,129535,14,129664,129666,14,129719,129722,14,129760,129767,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2307,2307,7,2382,2383,7,2497,2500,5,2563,2563,7,2677,2677,5,2763,2764,7,2879,2879,5,2914,2915,5,3021,3021,5,3142,3144,5,3263,3263,5,3285,3286,5,3398,3400,7,3530,3530,5,3633,3633,5,3864,3865,5,3974,3975,5,4155,4156,7,4229,4230,5,5909,5909,7,6078,6085,7,6277,6278,5,6451,6456,7,6744,6750,5,6846,6846,5,6972,6972,5,7074,7077,5,7146,7148,7,7222,7223,5,7416,7417,5,8234,8238,4,8417,8417,5,9000,9000,14,9203,9203,14,9730,9731,14,9748,9749,14,9762,9763,14,9776,9783,14,9800,9811,14,9831,9831,14,9872,9873,14,9882,9882,14,9900,9903,14,9929,9933,14,9941,9960,14,9974,9974,14,9989,9989,14,10006,10006,14,10062,10062,14,10160,10160,14,11647,11647,5,12953,12953,14,43019,43019,5,43232,43249,5,43443,43443,5,43567,43568,7,43696,43696,5,43765,43765,7,44013,44013,5,44117,44143,12,44229,44255,12,44341,44367,12,44453,44479,12,44565,44591,12,44677,44703,12,44789,44815,12,44901,44927,12,45013,45039,12,45125,45151,12,45237,45263,12,45349,45375,12,45461,45487,12,45573,45599,12,45685,45711,12,45797,45823,12,45909,45935,12,46021,46047,12,46133,46159,12,46245,46271,12,46357,46383,12,46469,46495,12,46581,46607,12,46693,46719,12,46805,46831,12,46917,46943,12,47029,47055,12,47141,47167,12,47253,47279,12,47365,47391,12,47477,47503,12,47589,47615,12,47701,47727,12,47813,47839,12,47925,47951,12,48037,48063,12,48149,48175,12,48261,48287,12,48373,48399,12,48485,48511,12,48597,48623,12,48709,48735,12,48821,48847,12,48933,48959,12,49045,49071,12,49157,49183,12,49269,49295,12,49381,49407,12,49493,49519,12,49605,49631,12,49717,49743,12,49829,49855,12,49941,49967,12,50053,50079,12,50165,50191,12,50277,50303,12,50389,50415,12,50501,50527,12,50613,50639,12,50725,50751,12,50837,50863,12,50949,50975,12,51061,51087,12,51173,51199,12,51285,51311,12,51397,51423,12,51509,51535,12,51621,51647,12,51733,51759,12,51845,51871,12,51957,51983,12,52069,52095,12,52181,52207,12,52293,52319,12,52405,52431,12,52517,52543,12,52629,52655,12,52741,52767,12,52853,52879,12,52965,52991,12,53077,53103,12,53189,53215,12,53301,53327,12,53413,53439,12,53525,53551,12,53637,53663,12,53749,53775,12,53861,53887,12,53973,53999,12,54085,54111,12,54197,54223,12,54309,54335,12,54421,54447,12,54533,54559,12,54645,54671,12,54757,54783,12,54869,54895,12,54981,55007,12,55093,55119,12,55243,55291,10,66045,66045,5,68325,68326,5,69688,69702,5,69817,69818,5,69957,69958,7,70089,70092,5,70198,70199,5,70462,70462,5,70502,70508,5,70750,70750,5,70846,70846,7,71100,71101,5,71230,71230,7,71351,71351,5,71737,71738,5,72000,72000,7,72160,72160,5,72273,72278,5,72752,72758,5,72882,72883,5,73031,73031,5,73461,73462,7,94192,94193,7,119149,119149,7,121403,121452,5,122915,122916,5,126980,126980,14,127358,127359,14,127535,127535,14,127759,127759,14,127771,127771,14,127792,127793,14,127825,127867,14,127897,127899,14,127945,127945,14,127985,127986,14,128000,128007,14,128021,128021,14,128066,128100,14,128184,128235,14,128249,128252,14,128266,128276,14,128335,128335,14,128379,128390,14,128407,128419,14,128444,128444,14,128481,128481,14,128499,128499,14,128526,128526,14,128536,128536,14,128543,128543,14,128556,128556,14,128564,128564,14,128577,128580,14,128643,128645,14,128649,128649,14,128654,128654,14,128660,128660,14,128664,128664,14,128675,128675,14,128686,128689,14,128695,128696,14,128705,128709,14,128717,128719,14,128725,128725,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129009,129023,14,129160,129167,14,129296,129304,14,129320,129327,14,129340,129342,14,129356,129356,14,129388,129392,14,129399,129400,14,129404,129407,14,129432,129442,14,129454,129455,14,129473,129474,14,129485,129487,14,129648,129651,14,129659,129660,14,129671,129679,14,129709,129711,14,129728,129730,14,129751,129753,14,129776,129782,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2274,2274,1,2363,2363,7,2377,2380,7,2402,2403,5,2494,2494,5,2507,2508,7,2558,2558,5,2622,2624,7,2641,2641,5,2691,2691,7,2759,2760,5,2786,2787,5,2876,2876,5,2881,2884,5,2901,2902,5,3006,3006,5,3014,3016,7,3072,3072,5,3134,3136,5,3157,3158,5,3260,3260,5,3266,3266,5,3274,3275,7,3328,3329,5,3391,3392,7,3405,3405,5,3457,3457,5,3536,3537,7,3551,3551,5,3636,3642,5,3764,3772,5,3895,3895,5,3967,3967,7,3993,4028,5,4146,4151,5,4182,4183,7,4226,4226,5,4253,4253,5,4957,4959,5,5940,5940,7,6070,6070,7,6087,6088,7,6158,6158,4,6432,6434,5,6448,6449,7,6679,6680,5,6742,6742,5,6754,6754,5,6783,6783,5,6912,6915,5,6966,6970,5,6978,6978,5,7042,7042,7,7080,7081,5,7143,7143,7,7150,7150,7,7212,7219,5,7380,7392,5,7412,7412,5,8203,8203,4,8232,8232,4,8265,8265,14,8400,8412,5,8421,8432,5,8617,8618,14,9167,9167,14,9200,9200,14,9410,9410,14,9723,9726,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9774,14,9786,9786,14,9794,9794,14,9823,9823,14,9828,9828,14,9833,9850,14,9855,9855,14,9875,9875,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9935,9935,14,9939,9939,14,9962,9962,14,9972,9972,14,9978,9978,14,9986,9986,14,9997,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10133,10135,14,10548,10549,14,11093,11093,14,12330,12333,5,12441,12442,5,42608,42610,5,43010,43010,5,43045,43046,5,43188,43203,7,43302,43309,5,43392,43394,5,43446,43449,5,43493,43493,5,43571,43572,7,43597,43597,7,43703,43704,5,43756,43757,5,44003,44004,7,44009,44010,7,44033,44059,12,44089,44115,12,44145,44171,12,44201,44227,12,44257,44283,12,44313,44339,12,44369,44395,12,44425,44451,12,44481,44507,12,44537,44563,12,44593,44619,12,44649,44675,12,44705,44731,12,44761,44787,12,44817,44843,12,44873,44899,12,44929,44955,12,44985,45011,12,45041,45067,12,45097,45123,12,45153,45179,12,45209,45235,12,45265,45291,12,45321,45347,12,45377,45403,12,45433,45459,12,45489,45515,12,45545,45571,12,45601,45627,12,45657,45683,12,45713,45739,12,45769,45795,12,45825,45851,12,45881,45907,12,45937,45963,12,45993,46019,12,46049,46075,12,46105,46131,12,46161,46187,12,46217,46243,12,46273,46299,12,46329,46355,12,46385,46411,12,46441,46467,12,46497,46523,12,46553,46579,12,46609,46635,12,46665,46691,12,46721,46747,12,46777,46803,12,46833,46859,12,46889,46915,12,46945,46971,12,47001,47027,12,47057,47083,12,47113,47139,12,47169,47195,12,47225,47251,12,47281,47307,12,47337,47363,12,47393,47419,12,47449,47475,12,47505,47531,12,47561,47587,12,47617,47643,12,47673,47699,12,47729,47755,12,47785,47811,12,47841,47867,12,47897,47923,12,47953,47979,12,48009,48035,12,48065,48091,12,48121,48147,12,48177,48203,12,48233,48259,12,48289,48315,12,48345,48371,12,48401,48427,12,48457,48483,12,48513,48539,12,48569,48595,12,48625,48651,12,48681,48707,12,48737,48763,12,48793,48819,12,48849,48875,12,48905,48931,12,48961,48987,12,49017,49043,12,49073,49099,12,49129,49155,12,49185,49211,12,49241,49267,12,49297,49323,12,49353,49379,12,49409,49435,12,49465,49491,12,49521,49547,12,49577,49603,12,49633,49659,12,49689,49715,12,49745,49771,12,49801,49827,12,49857,49883,12,49913,49939,12,49969,49995,12,50025,50051,12,50081,50107,12,50137,50163,12,50193,50219,12,50249,50275,12,50305,50331,12,50361,50387,12,50417,50443,12,50473,50499,12,50529,50555,12,50585,50611,12,50641,50667,12,50697,50723,12,50753,50779,12,50809,50835,12,50865,50891,12,50921,50947,12,50977,51003,12,51033,51059,12,51089,51115,12,51145,51171,12,51201,51227,12,51257,51283,12,51313,51339,12,51369,51395,12,51425,51451,12,51481,51507,12,51537,51563,12,51593,51619,12,51649,51675,12,51705,51731,12,51761,51787,12,51817,51843,12,51873,51899,12,51929,51955,12,51985,52011,12,52041,52067,12,52097,52123,12,52153,52179,12,52209,52235,12,52265,52291,12,52321,52347,12,52377,52403,12,52433,52459,12,52489,52515,12,52545,52571,12,52601,52627,12,52657,52683,12,52713,52739,12,52769,52795,12,52825,52851,12,52881,52907,12,52937,52963,12,52993,53019,12,53049,53075,12,53105,53131,12,53161,53187,12,53217,53243,12,53273,53299,12,53329,53355,12,53385,53411,12,53441,53467,12,53497,53523,12,53553,53579,12,53609,53635,12,53665,53691,12,53721,53747,12,53777,53803,12,53833,53859,12,53889,53915,12,53945,53971,12,54001,54027,12,54057,54083,12,54113,54139,12,54169,54195,12,54225,54251,12,54281,54307,12,54337,54363,12,54393,54419,12,54449,54475,12,54505,54531,12,54561,54587,12,54617,54643,12,54673,54699,12,54729,54755,12,54785,54811,12,54841,54867,12,54897,54923,12,54953,54979,12,55009,55035,12,55065,55091,12,55121,55147,12,55177,55203,12,65024,65039,5,65520,65528,4,66422,66426,5,68152,68154,5,69291,69292,5,69633,69633,5,69747,69748,5,69811,69814,5,69826,69826,5,69932,69932,7,70016,70017,5,70079,70080,7,70095,70095,5,70196,70196,5,70367,70367,5,70402,70403,7,70464,70464,5,70487,70487,5,70709,70711,7,70725,70725,7,70833,70834,7,70843,70844,7,70849,70849,7,71090,71093,5,71103,71104,5,71227,71228,7,71339,71339,5,71344,71349,5,71458,71461,5,71727,71735,5,71985,71989,7,71998,71998,5,72002,72002,7,72154,72155,5,72193,72202,5,72251,72254,5,72281,72283,5,72344,72345,5,72766,72766,7,72874,72880,5,72885,72886,5,73023,73029,5,73104,73105,5,73111,73111,5,92912,92916,5,94095,94098,5,113824,113827,4,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,125252,125258,5,127183,127183,14,127340,127343,14,127377,127386,14,127491,127503,14,127548,127551,14,127744,127756,14,127761,127761,14,127769,127769,14,127773,127774,14,127780,127788,14,127796,127797,14,127820,127823,14,127869,127869,14,127894,127895,14,127902,127903,14,127943,127943,14,127947,127950,14,127972,127972,14,127988,127988,14,127992,127994,14,128009,128011,14,128019,128019,14,128023,128041,14,128064,128064,14,128102,128107,14,128174,128181,14,128238,128238,14,128246,128247,14,128254,128254,14,128264,128264,14,128278,128299,14,128329,128330,14,128348,128359,14,128371,128377,14,128392,128393,14,128401,128404,14,128421,128421,14,128433,128434,14,128450,128452,14,128476,128478,14,128483,128483,14,128495,128495,14,128506,128506,14,128519,128520,14,128528,128528,14,128534,128534,14,128538,128538,14,128540,128542,14,128544,128549,14,128552,128555,14,128557,128557,14,128560,128563,14,128565,128565,14,128567,128576,14,128581,128591,14,128641,128642,14,128646,128646,14,128648,128648,14,128650,128651,14,128653,128653,14,128655,128655,14,128657,128659,14,128661,128661,14,128663,128663,14,128665,128666,14,128674,128674,14,128676,128677,14,128679,128685,14,128690,128690,14,128694,128694,14,128697,128702,14,128704,128704,14,128710,128714,14,128716,128716,14,128720,128720,14,128723,128724,14,128726,128727,14,128733,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129008,129008,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129661,129663,14,129667,129670,14,129680,129685,14,129705,129708,14,129712,129718,14,129723,129727,14,129731,129733,14,129744,129750,14,129754,129759,14,129768,129775,14,129783,129791,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2192,2193,1,2250,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3132,3132,5,3137,3140,7,3146,3149,5,3170,3171,5,3202,3203,7,3262,3262,7,3264,3265,7,3267,3268,7,3271,3272,7,3276,3277,5,3298,3299,5,3330,3331,7,3390,3390,5,3393,3396,5,3402,3404,7,3406,3406,1,3426,3427,5,3458,3459,7,3535,3535,5,3538,3540,5,3544,3550,7,3570,3571,7,3635,3635,7,3655,3662,5,3763,3763,7,3784,3789,5,3893,3893,5,3897,3897,5,3953,3966,5,3968,3972,5,3981,3991,5,4038,4038,5,4145,4145,7,4153,4154,5,4157,4158,5,4184,4185,5,4209,4212,5,4228,4228,7,4237,4237,5,4352,4447,8,4520,4607,10,5906,5908,5,5938,5939,5,5970,5971,5,6068,6069,5,6071,6077,5,6086,6086,5,6089,6099,5,6155,6157,5,6159,6159,5,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6862,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7679,5,8204,8204,5,8206,8207,4,8233,8233,4,8252,8252,14,8288,8292,4,8294,8303,4,8413,8416,5,8418,8420,5,8482,8482,14,8596,8601,14,8986,8987,14,9096,9096,14,9193,9196,14,9199,9199,14,9201,9202,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9729,14,9732,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9775,9775,14,9784,9785,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9874,14,9876,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9934,14,9936,9936,14,9938,9938,14,9940,9940,14,9961,9961,14,9963,9967,14,9970,9971,14,9973,9973,14,9975,9977,14,9979,9980,14,9982,9985,14,9987,9988,14,9992,9996,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10083,14,10085,10087,14,10145,10145,14,10175,10175,14,11013,11015,14,11088,11088,14,11503,11505,5,11744,11775,5,12334,12335,5,12349,12349,14,12951,12951,14,42607,42607,5,42612,42621,5,42736,42737,5,43014,43014,5,43043,43044,7,43047,43047,7,43136,43137,7,43204,43205,5,43263,43263,5,43335,43345,5,43360,43388,8,43395,43395,7,43444,43445,7,43450,43451,7,43454,43456,7,43561,43566,5,43569,43570,5,43573,43574,5,43596,43596,5,43644,43644,5,43698,43700,5,43710,43711,5,43755,43755,7,43758,43759,7,43766,43766,5,44005,44005,5,44008,44008,5,44012,44012,7,44032,44032,11,44060,44060,11,44088,44088,11,44116,44116,11,44144,44144,11,44172,44172,11,44200,44200,11,44228,44228,11,44256,44256,11,44284,44284,11,44312,44312,11,44340,44340,11,44368,44368,11,44396,44396,11,44424,44424,11,44452,44452,11,44480,44480,11,44508,44508,11,44536,44536,11,44564,44564,11,44592,44592,11,44620,44620,11,44648,44648,11,44676,44676,11,44704,44704,11,44732,44732,11,44760,44760,11,44788,44788,11,44816,44816,11,44844,44844,11,44872,44872,11,44900,44900,11,44928,44928,11,44956,44956,11,44984,44984,11,45012,45012,11,45040,45040,11,45068,45068,11,45096,45096,11,45124,45124,11,45152,45152,11,45180,45180,11,45208,45208,11,45236,45236,11,45264,45264,11,45292,45292,11,45320,45320,11,45348,45348,11,45376,45376,11,45404,45404,11,45432,45432,11,45460,45460,11,45488,45488,11,45516,45516,11,45544,45544,11,45572,45572,11,45600,45600,11,45628,45628,11,45656,45656,11,45684,45684,11,45712,45712,11,45740,45740,11,45768,45768,11,45796,45796,11,45824,45824,11,45852,45852,11,45880,45880,11,45908,45908,11,45936,45936,11,45964,45964,11,45992,45992,11,46020,46020,11,46048,46048,11,46076,46076,11,46104,46104,11,46132,46132,11,46160,46160,11,46188,46188,11,46216,46216,11,46244,46244,11,46272,46272,11,46300,46300,11,46328,46328,11,46356,46356,11,46384,46384,11,46412,46412,11,46440,46440,11,46468,46468,11,46496,46496,11,46524,46524,11,46552,46552,11,46580,46580,11,46608,46608,11,46636,46636,11,46664,46664,11,46692,46692,11,46720,46720,11,46748,46748,11,46776,46776,11,46804,46804,11,46832,46832,11,46860,46860,11,46888,46888,11,46916,46916,11,46944,46944,11,46972,46972,11,47000,47000,11,47028,47028,11,47056,47056,11,47084,47084,11,47112,47112,11,47140,47140,11,47168,47168,11,47196,47196,11,47224,47224,11,47252,47252,11,47280,47280,11,47308,47308,11,47336,47336,11,47364,47364,11,47392,47392,11,47420,47420,11,47448,47448,11,47476,47476,11,47504,47504,11,47532,47532,11,47560,47560,11,47588,47588,11,47616,47616,11,47644,47644,11,47672,47672,11,47700,47700,11,47728,47728,11,47756,47756,11,47784,47784,11,47812,47812,11,47840,47840,11,47868,47868,11,47896,47896,11,47924,47924,11,47952,47952,11,47980,47980,11,48008,48008,11,48036,48036,11,48064,48064,11,48092,48092,11,48120,48120,11,48148,48148,11,48176,48176,11,48204,48204,11,48232,48232,11,48260,48260,11,48288,48288,11,48316,48316,11,48344,48344,11,48372,48372,11,48400,48400,11,48428,48428,11,48456,48456,11,48484,48484,11,48512,48512,11,48540,48540,11,48568,48568,11,48596,48596,11,48624,48624,11,48652,48652,11,48680,48680,11,48708,48708,11,48736,48736,11,48764,48764,11,48792,48792,11,48820,48820,11,48848,48848,11,48876,48876,11,48904,48904,11,48932,48932,11,48960,48960,11,48988,48988,11,49016,49016,11,49044,49044,11,49072,49072,11,49100,49100,11,49128,49128,11,49156,49156,11,49184,49184,11,49212,49212,11,49240,49240,11,49268,49268,11,49296,49296,11,49324,49324,11,49352,49352,11,49380,49380,11,49408,49408,11,49436,49436,11,49464,49464,11,49492,49492,11,49520,49520,11,49548,49548,11,49576,49576,11,49604,49604,11,49632,49632,11,49660,49660,11,49688,49688,11,49716,49716,11,49744,49744,11,49772,49772,11,49800,49800,11,49828,49828,11,49856,49856,11,49884,49884,11,49912,49912,11,49940,49940,11,49968,49968,11,49996,49996,11,50024,50024,11,50052,50052,11,50080,50080,11,50108,50108,11,50136,50136,11,50164,50164,11,50192,50192,11,50220,50220,11,50248,50248,11,50276,50276,11,50304,50304,11,50332,50332,11,50360,50360,11,50388,50388,11,50416,50416,11,50444,50444,11,50472,50472,11,50500,50500,11,50528,50528,11,50556,50556,11,50584,50584,11,50612,50612,11,50640,50640,11,50668,50668,11,50696,50696,11,50724,50724,11,50752,50752,11,50780,50780,11,50808,50808,11,50836,50836,11,50864,50864,11,50892,50892,11,50920,50920,11,50948,50948,11,50976,50976,11,51004,51004,11,51032,51032,11,51060,51060,11,51088,51088,11,51116,51116,11,51144,51144,11,51172,51172,11,51200,51200,11,51228,51228,11,51256,51256,11,51284,51284,11,51312,51312,11,51340,51340,11,51368,51368,11,51396,51396,11,51424,51424,11,51452,51452,11,51480,51480,11,51508,51508,11,51536,51536,11,51564,51564,11,51592,51592,11,51620,51620,11,51648,51648,11,51676,51676,11,51704,51704,11,51732,51732,11,51760,51760,11,51788,51788,11,51816,51816,11,51844,51844,11,51872,51872,11,51900,51900,11,51928,51928,11,51956,51956,11,51984,51984,11,52012,52012,11,52040,52040,11,52068,52068,11,52096,52096,11,52124,52124,11,52152,52152,11,52180,52180,11,52208,52208,11,52236,52236,11,52264,52264,11,52292,52292,11,52320,52320,11,52348,52348,11,52376,52376,11,52404,52404,11,52432,52432,11,52460,52460,11,52488,52488,11,52516,52516,11,52544,52544,11,52572,52572,11,52600,52600,11,52628,52628,11,52656,52656,11,52684,52684,11,52712,52712,11,52740,52740,11,52768,52768,11,52796,52796,11,52824,52824,11,52852,52852,11,52880,52880,11,52908,52908,11,52936,52936,11,52964,52964,11,52992,52992,11,53020,53020,11,53048,53048,11,53076,53076,11,53104,53104,11,53132,53132,11,53160,53160,11,53188,53188,11,53216,53216,11,53244,53244,11,53272,53272,11,53300,53300,11,53328,53328,11,53356,53356,11,53384,53384,11,53412,53412,11,53440,53440,11,53468,53468,11,53496,53496,11,53524,53524,11,53552,53552,11,53580,53580,11,53608,53608,11,53636,53636,11,53664,53664,11,53692,53692,11,53720,53720,11,53748,53748,11,53776,53776,11,53804,53804,11,53832,53832,11,53860,53860,11,53888,53888,11,53916,53916,11,53944,53944,11,53972,53972,11,54000,54000,11,54028,54028,11,54056,54056,11,54084,54084,11,54112,54112,11,54140,54140,11,54168,54168,11,54196,54196,11,54224,54224,11,54252,54252,11,54280,54280,11,54308,54308,11,54336,54336,11,54364,54364,11,54392,54392,11,54420,54420,11,54448,54448,11,54476,54476,11,54504,54504,11,54532,54532,11,54560,54560,11,54588,54588,11,54616,54616,11,54644,54644,11,54672,54672,11,54700,54700,11,54728,54728,11,54756,54756,11,54784,54784,11,54812,54812,11,54840,54840,11,54868,54868,11,54896,54896,11,54924,54924,11,54952,54952,11,54980,54980,11,55008,55008,11,55036,55036,11,55064,55064,11,55092,55092,11,55120,55120,11,55148,55148,11,55176,55176,11,55216,55238,9,64286,64286,5,65056,65071,5,65438,65439,5,65529,65531,4,66272,66272,5,68097,68099,5,68108,68111,5,68159,68159,5,68900,68903,5,69446,69456,5,69632,69632,7,69634,69634,7,69744,69744,5,69759,69761,5,69808,69810,7,69815,69816,7,69821,69821,1,69837,69837,1,69927,69931,5,69933,69940,5,70003,70003,5,70018,70018,7,70070,70078,5,70082,70083,1,70094,70094,7,70188,70190,7,70194,70195,7,70197,70197,7,70206,70206,5,70368,70370,7,70400,70401,5,70459,70460,5,70463,70463,7,70465,70468,7,70475,70477,7,70498,70499,7,70512,70516,5,70712,70719,5,70722,70724,5,70726,70726,5,70832,70832,5,70835,70840,5,70842,70842,5,70845,70845,5,70847,70848,5,70850,70851,5,71088,71089,7,71096,71099,7,71102,71102,7,71132,71133,5,71219,71226,5,71229,71229,5,71231,71232,5,71340,71340,7,71342,71343,7,71350,71350,7,71453,71455,5,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,118528,118573,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123566,123566,5,125136,125142,5,126976,126979,14,126981,127182,14,127184,127231,14,127279,127279,14,127344,127345,14,127374,127374,14,127405,127461,14,127489,127490,14,127514,127514,14,127538,127546,14,127561,127567,14,127570,127743,14,127757,127758,14,127760,127760,14,127762,127762,14,127766,127768,14,127770,127770,14,127772,127772,14,127775,127776,14,127778,127779,14,127789,127791,14,127794,127795,14,127798,127798,14,127819,127819,14,127824,127824,14,127868,127868,14,127870,127871,14,127892,127893,14,127896,127896,14,127900,127901,14,127904,127940,14,127942,127942,14,127944,127944,14,127946,127946,14,127951,127955,14,127968,127971,14,127973,127984,14,127987,127987,14,127989,127989,14,127991,127991,14,127995,127999,5,128008,128008,14,128012,128014,14,128017,128018,14,128020,128020,14,128022,128022,14,128042,128042,14,128063,128063,14,128065,128065,14,128101,128101,14,128108,128109,14,128173,128173,14,128182,128183,14,128236,128237,14,128239,128239,14,128245,128245,14,128248,128248,14,128253,128253,14,128255,128258,14,128260,128263,14,128265,128265,14,128277,128277,14,128300,128301,14,128326,128328,14,128331,128334,14,128336,128347,14,128360,128366,14,128369,128370,14,128378,128378,14,128391,128391,14,128394,128397,14,128400,128400,14,128405,128406,14,128420,128420,14,128422,128423,14,128425,128432,14,128435,128443,14,128445,128449,14,128453,128464,14,128468,128475,14,128479,128480,14,128482,128482,14,128484,128487,14,128489,128494,14,128496,128498,14,128500,128505,14,128507,128511,14,128513,128518,14,128521,128525,14,128527,128527,14,128529,128529,14,128533,128533,14,128535,128535,14,128537,128537,14]"); +} +function getLeftDeleteOffset(offset, str) { + if (offset === 0) { + return 0; + } + const emojiOffset = getOffsetBeforeLastEmojiComponent(offset, str); + if (emojiOffset !== void 0) { + return emojiOffset; + } + const iterator = new CodePointIterator(str, offset); + iterator.prevCodePoint(); + return iterator.offset; +} +function getOffsetBeforeLastEmojiComponent(initialOffset, str) { + const iterator = new CodePointIterator(str, initialOffset); + let codePoint = iterator.prevCodePoint(); + while (isEmojiModifier(codePoint) || codePoint === 65039 || codePoint === 8419) { + if (iterator.offset === 0) { + return void 0; + } + codePoint = iterator.prevCodePoint(); + } + if (!isEmojiImprecise(codePoint)) { + return void 0; + } + let resultOffset = iterator.offset; + if (resultOffset > 0) { + const optionalZwjCodePoint = iterator.prevCodePoint(); + if (optionalZwjCodePoint === 8205) { + resultOffset = iterator.offset; + } + } + return resultOffset; +} +function isEmojiModifier(codePoint) { + return 127995 <= codePoint && codePoint <= 127999; +} +var _a2, _formatRegexp, CodePointIterator, GraphemeIterator, CONTAINS_RTL, IS_BASIC_ASCII, UNUSUAL_LINE_TERMINATORS, UTF8_BOM_CHARACTER, GraphemeBreakTree, noBreakWhitespace, AmbiguousCharacters, InvisibleCharacters; +var init_strings = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/strings.js"() { + init_cache(); + init_lazy(); + _formatRegexp = /{(\d+)}/g; + CodePointIterator = class { + get offset() { + return this._offset; + } + constructor(str, offset = 0) { + this._str = str; + this._len = str.length; + this._offset = offset; + } + setOffset(offset) { + this._offset = offset; + } + prevCodePoint() { + const codePoint = getPrevCodePoint(this._str, this._offset); + this._offset -= codePoint >= 65536 ? 2 : 1; + return codePoint; + } + nextCodePoint() { + const codePoint = getNextCodePoint(this._str, this._len, this._offset); + this._offset += codePoint >= 65536 ? 2 : 1; + return codePoint; + } + eol() { + return this._offset >= this._len; + } + }; + GraphemeIterator = class { + get offset() { + return this._iterator.offset; + } + constructor(str, offset = 0) { + this._iterator = new CodePointIterator(str, offset); + } + nextGraphemeLength() { + const graphemeBreakTree = GraphemeBreakTree.getInstance(); + const iterator = this._iterator; + const initialOffset = iterator.offset; + let graphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.nextCodePoint()); + while (!iterator.eol()) { + const offset = iterator.offset; + const nextGraphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.nextCodePoint()); + if (breakBetweenGraphemeBreakType(graphemeBreakType, nextGraphemeBreakType)) { + iterator.setOffset(offset); + break; + } + graphemeBreakType = nextGraphemeBreakType; + } + return iterator.offset - initialOffset; + } + prevGraphemeLength() { + const graphemeBreakTree = GraphemeBreakTree.getInstance(); + const iterator = this._iterator; + const initialOffset = iterator.offset; + let graphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.prevCodePoint()); + while (iterator.offset > 0) { + const offset = iterator.offset; + const prevGraphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.prevCodePoint()); + if (breakBetweenGraphemeBreakType(prevGraphemeBreakType, graphemeBreakType)) { + iterator.setOffset(offset); + break; + } + graphemeBreakType = prevGraphemeBreakType; + } + return initialOffset - iterator.offset; + } + eol() { + return this._iterator.eol(); + } + }; + CONTAINS_RTL = void 0; + IS_BASIC_ASCII = /^[\t\n\r\x20-\x7E]*$/; + UNUSUAL_LINE_TERMINATORS = /[\u2028\u2029]/; + UTF8_BOM_CHARACTER = String.fromCharCode( + 65279 + /* CharCode.UTF8_BOM */ + ); + GraphemeBreakTree = class _GraphemeBreakTree { + static getInstance() { + if (!_GraphemeBreakTree._INSTANCE) { + _GraphemeBreakTree._INSTANCE = new _GraphemeBreakTree(); + } + return _GraphemeBreakTree._INSTANCE; + } + constructor() { + this._data = getGraphemeBreakRawData(); + } + getGraphemeBreakType(codePoint) { + if (codePoint < 32) { + if (codePoint === 10) { + return 3; + } + if (codePoint === 13) { + return 2; + } + return 4; + } + if (codePoint < 127) { + return 0; + } + const data = this._data; + const nodeCount = data.length / 3; + let nodeIndex = 1; + while (nodeIndex <= nodeCount) { + if (codePoint < data[3 * nodeIndex]) { + nodeIndex = 2 * nodeIndex; + } else if (codePoint > data[3 * nodeIndex + 1]) { + nodeIndex = 2 * nodeIndex + 1; + } else { + return data[3 * nodeIndex + 2]; + } + } + return 0; + } + }; + GraphemeBreakTree._INSTANCE = null; + noBreakWhitespace = "\xA0"; + AmbiguousCharacters = class { + static getInstance(locales) { + return _a2.cache.get(Array.from(locales)); + } + static getLocales() { + return _a2._locales.value; + } + constructor(confusableDictionary) { + this.confusableDictionary = confusableDictionary; + } + isAmbiguous(codePoint) { + return this.confusableDictionary.has(codePoint); + } + /** + * Returns the non basic ASCII code point that the given code point can be confused, + * or undefined if such code point does note exist. + */ + getPrimaryConfusable(codePoint) { + return this.confusableDictionary.get(codePoint); + } + getConfusableCodePoints() { + return new Set(this.confusableDictionary.keys()); + } + }; + _a2 = AmbiguousCharacters; + AmbiguousCharacters.ambiguousCharacterData = new Lazy(() => { + return JSON.parse('{"_common":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,8218,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,8242,96,1370,96,1523,96,8175,96,65344,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71922,67,71913,67,65315,67,8557,67,8450,67,8493,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71919,87,71910,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,66293,90,71909,90,65338,90,8484,90,8488,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65297,49,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125,119846,109],"_default":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"cs":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"de":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"es":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"fr":[65374,126,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"it":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ja":[8211,45,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65292,44,65307,59],"ko":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pl":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pt-BR":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"qps-ploc":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ru":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"tr":[160,32,8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"zh-hans":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41],"zh-hant":[8211,45,65374,126,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65307,59]}'); + }); + AmbiguousCharacters.cache = new LRUCachedFunction({ getCacheKey: JSON.stringify }, (locales) => { + function arrayToMap(arr) { + const result = /* @__PURE__ */ new Map(); + for (let i = 0; i < arr.length; i += 2) { + result.set(arr[i], arr[i + 1]); + } + return result; + } + function mergeMaps(map1, map2) { + const result = new Map(map1); + for (const [key, value] of map2) { + result.set(key, value); + } + return result; + } + function intersectMaps(map1, map2) { + if (!map1) { + return map2; + } + const result = /* @__PURE__ */ new Map(); + for (const [key, value] of map1) { + if (map2.has(key)) { + result.set(key, value); + } + } + return result; + } + const data = _a2.ambiguousCharacterData.value; + let filteredLocales = locales.filter((l) => !l.startsWith("_") && l in data); + if (filteredLocales.length === 0) { + filteredLocales = ["_default"]; + } + let languageSpecificMap = void 0; + for (const locale of filteredLocales) { + const map2 = arrayToMap(data[locale]); + languageSpecificMap = intersectMaps(languageSpecificMap, map2); + } + const commonMap = arrayToMap(data["_common"]); + const map = mergeMaps(commonMap, languageSpecificMap); + return new _a2(map); + }); + AmbiguousCharacters._locales = new Lazy(() => Object.keys(_a2.ambiguousCharacterData.value).filter((k) => !k.startsWith("_"))); + InvisibleCharacters = class _InvisibleCharacters { + static getRawData() { + return JSON.parse("[9,10,11,12,13,32,127,160,173,847,1564,4447,4448,6068,6069,6155,6156,6157,6158,7355,7356,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8234,8235,8236,8237,8238,8239,8287,8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,10240,12288,12644,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65279,65440,65520,65521,65522,65523,65524,65525,65526,65527,65528,65532,78844,119155,119156,119157,119158,119159,119160,119161,119162,917504,917505,917506,917507,917508,917509,917510,917511,917512,917513,917514,917515,917516,917517,917518,917519,917520,917521,917522,917523,917524,917525,917526,917527,917528,917529,917530,917531,917532,917533,917534,917535,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999]"); + } + static getData() { + if (!this._data) { + this._data = new Set(_InvisibleCharacters.getRawData()); + } + return this._data; + } + static isInvisibleCharacter(codePoint) { + return _InvisibleCharacters.getData().has(codePoint); + } + static get codePoints() { + return _InvisibleCharacters.getData(); + } + }; + InvisibleCharacters._data = void 0; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/browser/standalone-tokens.css +var init_standalone_tokens = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/browser/standalone-tokens.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/browser.js +function addMatchMediaChangeListener(targetWindow, query, callback) { + if (typeof query === "string") { + query = targetWindow.matchMedia(query); + } + query.addEventListener("change", callback); +} +function getZoomFactor(targetWindow) { + return WindowManager.INSTANCE.getZoomFactor(targetWindow); +} +function isStandalone() { + return standalone; +} +var WindowManager, userAgent2, isFirefox2, isWebKit, isChrome2, isSafari2, isWebkitWebView, isElectron, isAndroid2, standalone; +var init_browser = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/browser.js"() { + init_window(); + WindowManager = class { + constructor() { + this.mapWindowIdToZoomFactor = /* @__PURE__ */ new Map(); + } + getZoomFactor(targetWindow) { + var _a10; + return (_a10 = this.mapWindowIdToZoomFactor.get(this.getWindowId(targetWindow))) !== null && _a10 !== void 0 ? _a10 : 1; + } + getWindowId(targetWindow) { + return targetWindow.vscodeWindowId; + } + }; + WindowManager.INSTANCE = new WindowManager(); + userAgent2 = navigator.userAgent; + isFirefox2 = userAgent2.indexOf("Firefox") >= 0; + isWebKit = userAgent2.indexOf("AppleWebKit") >= 0; + isChrome2 = userAgent2.indexOf("Chrome") >= 0; + isSafari2 = !isChrome2 && userAgent2.indexOf("Safari") >= 0; + isWebkitWebView = !isChrome2 && !isSafari2 && isWebKit; + isElectron = userAgent2.indexOf("Electron/") >= 0; + isAndroid2 = userAgent2.indexOf("Android") >= 0; + standalone = false; + if (typeof mainWindow.matchMedia === "function") { + const standaloneMatchMedia = mainWindow.matchMedia("(display-mode: standalone) or (display-mode: window-controls-overlay)"); + const fullScreenMatchMedia = mainWindow.matchMedia("(display-mode: fullscreen)"); + standalone = standaloneMatchMedia.matches; + addMatchMediaChangeListener(mainWindow, standaloneMatchMedia, ({ matches: matches2 }) => { + if (standalone && fullScreenMatchMedia.matches) { + return; + } + standalone = matches2; + }); + } + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/canIUse.js +var BrowserFeatures; +var init_canIUse = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/canIUse.js"() { + init_browser(); + init_window(); + init_platform(); + BrowserFeatures = { + clipboard: { + writeText: isNative || document.queryCommandSupported && document.queryCommandSupported("copy") || !!(navigator && navigator.clipboard && navigator.clipboard.writeText), + readText: isNative || !!(navigator && navigator.clipboard && navigator.clipboard.readText) + }, + keyboard: (() => { + if (isNative || isStandalone()) { + return 0; + } + if (navigator.keyboard || isSafari2) { + return 1; + } + return 2; + })(), + // 'ontouchstart' in window always evaluates to true with typescript's modern typings. This causes `window` to be + // `never` later in `window.navigator`. That's why we need the explicit `window as Window` cast + touch: "ontouchstart" in mainWindow || navigator.maxTouchPoints > 0, + pointerEvents: mainWindow.PointerEvent && ("ontouchstart" in mainWindow || navigator.maxTouchPoints > 0) + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/keybindings.js +function decodeKeybinding(keybinding, OS2) { + if (typeof keybinding === "number") { + if (keybinding === 0) { + return null; + } + const firstChord = (keybinding & 65535) >>> 0; + const secondChord = (keybinding & 4294901760) >>> 16; + if (secondChord !== 0) { + return new Keybinding([ + createSimpleKeybinding(firstChord, OS2), + createSimpleKeybinding(secondChord, OS2) + ]); + } + return new Keybinding([createSimpleKeybinding(firstChord, OS2)]); + } else { + const chords = []; + for (let i = 0; i < keybinding.length; i++) { + chords.push(createSimpleKeybinding(keybinding[i], OS2)); + } + return new Keybinding(chords); + } +} +function createSimpleKeybinding(keybinding, OS2) { + const ctrlCmd = keybinding & 2048 ? true : false; + const winCtrl = keybinding & 256 ? true : false; + const ctrlKey = OS2 === 2 ? winCtrl : ctrlCmd; + const shiftKey = keybinding & 1024 ? true : false; + const altKey = keybinding & 512 ? true : false; + const metaKey = OS2 === 2 ? ctrlCmd : winCtrl; + const keyCode = keybinding & 255; + return new KeyCodeChord(ctrlKey, shiftKey, altKey, metaKey, keyCode); +} +var KeyCodeChord, Keybinding, ResolvedChord, ResolvedKeybinding; +var init_keybindings = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/keybindings.js"() { + init_errors(); + KeyCodeChord = class _KeyCodeChord { + constructor(ctrlKey, shiftKey, altKey, metaKey, keyCode) { + this.ctrlKey = ctrlKey; + this.shiftKey = shiftKey; + this.altKey = altKey; + this.metaKey = metaKey; + this.keyCode = keyCode; + } + equals(other) { + return other instanceof _KeyCodeChord && this.ctrlKey === other.ctrlKey && this.shiftKey === other.shiftKey && this.altKey === other.altKey && this.metaKey === other.metaKey && this.keyCode === other.keyCode; + } + isModifierKey() { + return this.keyCode === 0 || this.keyCode === 5 || this.keyCode === 57 || this.keyCode === 6 || this.keyCode === 4; + } + /** + * Does this keybinding refer to the key code of a modifier and it also has the modifier flag? + */ + isDuplicateModifierCase() { + return this.ctrlKey && this.keyCode === 5 || this.shiftKey && this.keyCode === 4 || this.altKey && this.keyCode === 6 || this.metaKey && this.keyCode === 57; + } + }; + Keybinding = class { + constructor(chords) { + if (chords.length === 0) { + throw illegalArgument(`chords`); + } + this.chords = chords; + } + }; + ResolvedChord = class { + constructor(ctrlKey, shiftKey, altKey, metaKey, keyLabel, keyAriaLabel) { + this.ctrlKey = ctrlKey; + this.shiftKey = shiftKey; + this.altKey = altKey; + this.metaKey = metaKey; + this.keyLabel = keyLabel; + this.keyAriaLabel = keyAriaLabel; + } + }; + ResolvedKeybinding = class { + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/keyboardEvent.js +function extractKeyCode(e) { + if (e.charCode) { + const char = String.fromCharCode(e.charCode).toUpperCase(); + return KeyCodeUtils.fromString(char); + } + const keyCode = e.keyCode; + if (keyCode === 3) { + return 7; + } else if (isFirefox2) { + switch (keyCode) { + case 59: + return 85; + case 60: + if (isLinux) { + return 97; + } + break; + case 61: + return 86; + // based on: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#numpad_keys + case 107: + return 109; + case 109: + return 111; + case 173: + return 88; + case 224: + if (isMacintosh) { + return 57; + } + break; + } + } else if (isWebKit) { + if (isMacintosh && keyCode === 93) { + return 57; + } else if (!isMacintosh && keyCode === 92) { + return 57; + } + } + return EVENT_KEY_CODE_MAP[keyCode] || 0; +} +var ctrlKeyMod, altKeyMod, shiftKeyMod, metaKeyMod, StandardKeyboardEvent; +var init_keyboardEvent = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/keyboardEvent.js"() { + init_browser(); + init_keyCodes(); + init_keybindings(); + init_platform(); + ctrlKeyMod = isMacintosh ? 256 : 2048; + altKeyMod = 512; + shiftKeyMod = 1024; + metaKeyMod = isMacintosh ? 2048 : 256; + StandardKeyboardEvent = class { + constructor(source) { + var _a10; + this._standardKeyboardEventBrand = true; + const e = source; + this.browserEvent = e; + this.target = e.target; + this.ctrlKey = e.ctrlKey; + this.shiftKey = e.shiftKey; + this.altKey = e.altKey; + this.metaKey = e.metaKey; + this.altGraphKey = (_a10 = e.getModifierState) === null || _a10 === void 0 ? void 0 : _a10.call(e, "AltGraph"); + this.keyCode = extractKeyCode(e); + this.code = e.code; + this.ctrlKey = this.ctrlKey || this.keyCode === 5; + this.altKey = this.altKey || this.keyCode === 6; + this.shiftKey = this.shiftKey || this.keyCode === 4; + this.metaKey = this.metaKey || this.keyCode === 57; + this._asKeybinding = this._computeKeybinding(); + this._asKeyCodeChord = this._computeKeyCodeChord(); + } + preventDefault() { + if (this.browserEvent && this.browserEvent.preventDefault) { + this.browserEvent.preventDefault(); + } + } + stopPropagation() { + if (this.browserEvent && this.browserEvent.stopPropagation) { + this.browserEvent.stopPropagation(); + } + } + toKeyCodeChord() { + return this._asKeyCodeChord; + } + equals(other) { + return this._asKeybinding === other; + } + _computeKeybinding() { + let key = 0; + if (this.keyCode !== 5 && this.keyCode !== 4 && this.keyCode !== 6 && this.keyCode !== 57) { + key = this.keyCode; + } + let result = 0; + if (this.ctrlKey) { + result |= ctrlKeyMod; + } + if (this.altKey) { + result |= altKeyMod; + } + if (this.shiftKey) { + result |= shiftKeyMod; + } + if (this.metaKey) { + result |= metaKeyMod; + } + result |= key; + return result; + } + _computeKeyCodeChord() { + let key = 0; + if (this.keyCode !== 5 && this.keyCode !== 4 && this.keyCode !== 6 && this.keyCode !== 57) { + key = this.keyCode; + } + return new KeyCodeChord(this.ctrlKey, this.shiftKey, this.altKey, this.metaKey, key); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/iframe.js +function getParentWindowIfSameOrigin(w) { + if (!w.parent || w.parent === w) { + return null; + } + try { + const location = w.location; + const parentLocation = w.parent.location; + if (location.origin !== "null" && parentLocation.origin !== "null" && location.origin !== parentLocation.origin) { + return null; + } + } catch (e) { + return null; + } + return w.parent; +} +var sameOriginWindowChainCache, IframeUtils; +var init_iframe = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/iframe.js"() { + sameOriginWindowChainCache = /* @__PURE__ */ new WeakMap(); + IframeUtils = class { + /** + * Returns a chain of embedded windows with the same origin (which can be accessed programmatically). + * Having a chain of length 1 might mean that the current execution environment is running outside of an iframe or inside an iframe embedded in a window with a different origin. + */ + static getSameOriginWindowChain(targetWindow) { + let windowChainCache = sameOriginWindowChainCache.get(targetWindow); + if (!windowChainCache) { + windowChainCache = []; + sameOriginWindowChainCache.set(targetWindow, windowChainCache); + let w = targetWindow; + let parent; + do { + parent = getParentWindowIfSameOrigin(w); + if (parent) { + windowChainCache.push({ + window: new WeakRef(w), + iframeElement: w.frameElement || null + }); + } else { + windowChainCache.push({ + window: new WeakRef(w), + iframeElement: null + }); + } + w = parent; + } while (w); + } + return windowChainCache.slice(0); + } + /** + * Returns the position of `childWindow` relative to `ancestorWindow` + */ + static getPositionOfChildWindowRelativeToAncestorWindow(childWindow, ancestorWindow) { + var _a10, _b4; + if (!ancestorWindow || childWindow === ancestorWindow) { + return { + top: 0, + left: 0 + }; + } + let top = 0, left = 0; + const windowChain = this.getSameOriginWindowChain(childWindow); + for (const windowChainEl of windowChain) { + const windowInChain = windowChainEl.window.deref(); + top += (_a10 = windowInChain === null || windowInChain === void 0 ? void 0 : windowInChain.scrollY) !== null && _a10 !== void 0 ? _a10 : 0; + left += (_b4 = windowInChain === null || windowInChain === void 0 ? void 0 : windowInChain.scrollX) !== null && _b4 !== void 0 ? _b4 : 0; + if (windowInChain === ancestorWindow) { + break; + } + if (!windowChainEl.iframeElement) { + break; + } + const boundingRect = windowChainEl.iframeElement.getBoundingClientRect(); + top += boundingRect.top; + left += boundingRect.left; + } + return { + top, + left + }; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/mouseEvent.js +var StandardMouseEvent, StandardWheelEvent; +var init_mouseEvent = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/mouseEvent.js"() { + init_browser(); + init_iframe(); + init_platform(); + StandardMouseEvent = class { + constructor(targetWindow, e) { + this.timestamp = Date.now(); + this.browserEvent = e; + this.leftButton = e.button === 0; + this.middleButton = e.button === 1; + this.rightButton = e.button === 2; + this.buttons = e.buttons; + this.target = e.target; + this.detail = e.detail || 1; + if (e.type === "dblclick") { + this.detail = 2; + } + this.ctrlKey = e.ctrlKey; + this.shiftKey = e.shiftKey; + this.altKey = e.altKey; + this.metaKey = e.metaKey; + if (typeof e.pageX === "number") { + this.posx = e.pageX; + this.posy = e.pageY; + } else { + this.posx = e.clientX + this.target.ownerDocument.body.scrollLeft + this.target.ownerDocument.documentElement.scrollLeft; + this.posy = e.clientY + this.target.ownerDocument.body.scrollTop + this.target.ownerDocument.documentElement.scrollTop; + } + const iframeOffsets = IframeUtils.getPositionOfChildWindowRelativeToAncestorWindow(targetWindow, e.view); + this.posx -= iframeOffsets.left; + this.posy -= iframeOffsets.top; + } + preventDefault() { + this.browserEvent.preventDefault(); + } + stopPropagation() { + this.browserEvent.stopPropagation(); + } + }; + StandardWheelEvent = class { + constructor(e, deltaX = 0, deltaY = 0) { + var _a10; + this.browserEvent = e || null; + this.target = e ? e.target || e.targetNode || e.srcElement : null; + this.deltaY = deltaY; + this.deltaX = deltaX; + let shouldFactorDPR = false; + if (isChrome2) { + const chromeVersionMatch = navigator.userAgent.match(/Chrome\/(\d+)/); + const chromeMajorVersion = chromeVersionMatch ? parseInt(chromeVersionMatch[1]) : 123; + shouldFactorDPR = chromeMajorVersion <= 122; + } + if (e) { + const e1 = e; + const e2 = e; + const devicePixelRatio = ((_a10 = e.view) === null || _a10 === void 0 ? void 0 : _a10.devicePixelRatio) || 1; + if (typeof e1.wheelDeltaY !== "undefined") { + if (shouldFactorDPR) { + this.deltaY = e1.wheelDeltaY / (120 * devicePixelRatio); + } else { + this.deltaY = e1.wheelDeltaY / 120; + } + } else if (typeof e2.VERTICAL_AXIS !== "undefined" && e2.axis === e2.VERTICAL_AXIS) { + this.deltaY = -e2.detail / 3; + } else if (e.type === "wheel") { + const ev = e; + if (ev.deltaMode === ev.DOM_DELTA_LINE) { + if (isFirefox2 && !isMacintosh) { + this.deltaY = -e.deltaY / 3; + } else { + this.deltaY = -e.deltaY; + } + } else { + this.deltaY = -e.deltaY / 40; + } + } + if (typeof e1.wheelDeltaX !== "undefined") { + if (isSafari2 && isWindows) { + this.deltaX = -(e1.wheelDeltaX / 120); + } else if (shouldFactorDPR) { + this.deltaX = e1.wheelDeltaX / (120 * devicePixelRatio); + } else { + this.deltaX = e1.wheelDeltaX / 120; + } + } else if (typeof e2.HORIZONTAL_AXIS !== "undefined" && e2.axis === e2.HORIZONTAL_AXIS) { + this.deltaX = -e.detail / 3; + } else if (e.type === "wheel") { + const ev = e; + if (ev.deltaMode === ev.DOM_DELTA_LINE) { + if (isFirefox2 && !isMacintosh) { + this.deltaX = -e.deltaX / 3; + } else { + this.deltaX = -e.deltaX; + } + } else { + this.deltaX = -e.deltaX / 40; + } + } + if (this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta) { + if (shouldFactorDPR) { + this.deltaY = e.wheelDelta / (120 * devicePixelRatio); + } else { + this.deltaY = e.wheelDelta / 120; + } + } + } + } + preventDefault() { + var _a10; + (_a10 = this.browserEvent) === null || _a10 === void 0 ? void 0 : _a10.preventDefault(); + } + stopPropagation() { + var _a10; + (_a10 = this.browserEvent) === null || _a10 === void 0 ? void 0 : _a10.stopPropagation(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/symbols.js +var MicrotaskDelay; +var init_symbols = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/symbols.js"() { + MicrotaskDelay = Symbol("MicrotaskDelay"); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/async.js +function isThenable(obj) { + return !!obj && typeof obj.then === "function"; +} +function createCancelablePromise(callback) { + const source = new CancellationTokenSource(); + const thenable = callback(source.token); + const promise = new Promise((resolve2, reject) => { + const subscription = source.token.onCancellationRequested(() => { + subscription.dispose(); + reject(new CancellationError()); + }); + Promise.resolve(thenable).then((value) => { + subscription.dispose(); + source.dispose(); + resolve2(value); + }, (err) => { + subscription.dispose(); + source.dispose(); + reject(err); + }); + }); + return new class { + cancel() { + source.cancel(); + source.dispose(); + } + then(resolve2, reject) { + return promise.then(resolve2, reject); + } + catch(reject) { + return this.then(void 0, reject); + } + finally(onfinally) { + return promise.finally(onfinally); + } + }(); +} +function raceCancellation(promise, token, defaultValue) { + return new Promise((resolve2, reject) => { + const ref = token.onCancellationRequested(() => { + ref.dispose(); + resolve2(defaultValue); + }); + promise.then(resolve2, reject).finally(() => ref.dispose()); + }); +} +function timeout(millis, token) { + if (!token) { + return createCancelablePromise((token2) => timeout(millis, token2)); + } + return new Promise((resolve2, reject) => { + const handle = setTimeout(() => { + disposable.dispose(); + resolve2(); + }, millis); + const disposable = token.onCancellationRequested(() => { + clearTimeout(handle); + disposable.dispose(); + reject(new CancellationError()); + }); + }); +} +function disposableTimeout(handler, timeout2 = 0, store) { + const timer = setTimeout(() => { + handler(); + if (store) { + disposable.dispose(); + } + }, timeout2); + const disposable = toDisposable(() => { + clearTimeout(timer); + store === null || store === void 0 ? void 0 : store.deleteAndLeak(disposable); + }); + store === null || store === void 0 ? void 0 : store.add(disposable); + return disposable; +} +function first(promiseFactories, shouldStop = (t4) => !!t4, defaultValue = null) { + let index = 0; + const len = promiseFactories.length; + const loop = () => { + if (index >= len) { + return Promise.resolve(defaultValue); + } + const factory = promiseFactories[index++]; + const promise = Promise.resolve(factory()); + return promise.then((result) => { + if (shouldStop(result)) { + return Promise.resolve(result); + } + return loop(); + }); + }; + return loop(); +} +function createCancelableAsyncIterable(callback) { + const source = new CancellationTokenSource(); + const innerIterable = callback(source.token); + return new CancelableAsyncIterableObject(source, (emitter) => __async(this, null, function* () { + const subscription = source.token.onCancellationRequested(() => { + subscription.dispose(); + source.dispose(); + emitter.reject(new CancellationError()); + }); + try { + try { + for (var iter = __forAwait(innerIterable), more, temp, error; more = !(temp = yield iter.next()).done; more = false) { + const item = temp.value; + if (source.token.isCancellationRequested) { + return; + } + emitter.emitOne(item); + } + } catch (temp) { + error = [temp]; + } finally { + try { + more && (temp = iter.return) && (yield temp.call(iter)); + } finally { + if (error) + throw error[0]; + } + } + subscription.dispose(); + source.dispose(); + } catch (err) { + subscription.dispose(); + source.dispose(); + emitter.reject(err); + } + })); +} +var Throttler, timeoutDeferred, microtaskDeferred, Delayer, ThrottledDelayer, TimeoutTimer, IntervalTimer, RunOnceScheduler, runWhenGlobalIdle, _runWhenIdle, AbstractIdleValue, GlobalIdleValue, DeferredPromise, Promises, AsyncIterableObject, CancelableAsyncIterableObject; +var init_async = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/async.js"() { + init_cancellation(); + init_errors(); + init_event(); + init_lifecycle(); + init_platform(); + init_symbols(); + Throttler = class { + constructor() { + this.isDisposed = false; + this.activePromise = null; + this.queuedPromise = null; + this.queuedPromiseFactory = null; + } + queue(promiseFactory) { + if (this.isDisposed) { + return Promise.reject(new Error("Throttler is disposed")); + } + if (this.activePromise) { + this.queuedPromiseFactory = promiseFactory; + if (!this.queuedPromise) { + const onComplete = () => { + this.queuedPromise = null; + if (this.isDisposed) { + return; + } + const result = this.queue(this.queuedPromiseFactory); + this.queuedPromiseFactory = null; + return result; + }; + this.queuedPromise = new Promise((resolve2) => { + this.activePromise.then(onComplete, onComplete).then(resolve2); + }); + } + return new Promise((resolve2, reject) => { + this.queuedPromise.then(resolve2, reject); + }); + } + this.activePromise = promiseFactory(); + return new Promise((resolve2, reject) => { + this.activePromise.then((result) => { + this.activePromise = null; + resolve2(result); + }, (err) => { + this.activePromise = null; + reject(err); + }); + }); + } + dispose() { + this.isDisposed = true; + } + }; + timeoutDeferred = (timeout2, fn) => { + let scheduled = true; + const handle = setTimeout(() => { + scheduled = false; + fn(); + }, timeout2); + return { + isTriggered: () => scheduled, + dispose: () => { + clearTimeout(handle); + scheduled = false; + } + }; + }; + microtaskDeferred = (fn) => { + let scheduled = true; + queueMicrotask(() => { + if (scheduled) { + scheduled = false; + fn(); + } + }); + return { + isTriggered: () => scheduled, + dispose: () => { + scheduled = false; + } + }; + }; + Delayer = class { + constructor(defaultDelay) { + this.defaultDelay = defaultDelay; + this.deferred = null; + this.completionPromise = null; + this.doResolve = null; + this.doReject = null; + this.task = null; + } + trigger(task, delay = this.defaultDelay) { + this.task = task; + this.cancelTimeout(); + if (!this.completionPromise) { + this.completionPromise = new Promise((resolve2, reject) => { + this.doResolve = resolve2; + this.doReject = reject; + }).then(() => { + this.completionPromise = null; + this.doResolve = null; + if (this.task) { + const task2 = this.task; + this.task = null; + return task2(); + } + return void 0; + }); + } + const fn = () => { + var _a10; + this.deferred = null; + (_a10 = this.doResolve) === null || _a10 === void 0 ? void 0 : _a10.call(this, null); + }; + this.deferred = delay === MicrotaskDelay ? microtaskDeferred(fn) : timeoutDeferred(delay, fn); + return this.completionPromise; + } + isTriggered() { + var _a10; + return !!((_a10 = this.deferred) === null || _a10 === void 0 ? void 0 : _a10.isTriggered()); + } + cancel() { + var _a10; + this.cancelTimeout(); + if (this.completionPromise) { + (_a10 = this.doReject) === null || _a10 === void 0 ? void 0 : _a10.call(this, new CancellationError()); + this.completionPromise = null; + } + } + cancelTimeout() { + var _a10; + (_a10 = this.deferred) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + this.deferred = null; + } + dispose() { + this.cancel(); + } + }; + ThrottledDelayer = class { + constructor(defaultDelay) { + this.delayer = new Delayer(defaultDelay); + this.throttler = new Throttler(); + } + trigger(promiseFactory, delay) { + return this.delayer.trigger(() => this.throttler.queue(promiseFactory), delay); + } + cancel() { + this.delayer.cancel(); + } + dispose() { + this.delayer.dispose(); + this.throttler.dispose(); + } + }; + TimeoutTimer = class { + constructor(runner, timeout2) { + this._isDisposed = false; + this._token = -1; + if (typeof runner === "function" && typeof timeout2 === "number") { + this.setIfNotSet(runner, timeout2); + } + } + dispose() { + this.cancel(); + this._isDisposed = true; + } + cancel() { + if (this._token !== -1) { + clearTimeout(this._token); + this._token = -1; + } + } + cancelAndSet(runner, timeout2) { + if (this._isDisposed) { + throw new BugIndicatingError(`Calling 'cancelAndSet' on a disposed TimeoutTimer`); + } + this.cancel(); + this._token = setTimeout(() => { + this._token = -1; + runner(); + }, timeout2); + } + setIfNotSet(runner, timeout2) { + if (this._isDisposed) { + throw new BugIndicatingError(`Calling 'setIfNotSet' on a disposed TimeoutTimer`); + } + if (this._token !== -1) { + return; + } + this._token = setTimeout(() => { + this._token = -1; + runner(); + }, timeout2); + } + }; + IntervalTimer = class { + constructor() { + this.disposable = void 0; + this.isDisposed = false; + } + cancel() { + var _a10; + (_a10 = this.disposable) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + this.disposable = void 0; + } + cancelAndSet(runner, interval, context = globalThis) { + if (this.isDisposed) { + throw new BugIndicatingError(`Calling 'cancelAndSet' on a disposed IntervalTimer`); + } + this.cancel(); + const handle = context.setInterval(() => { + runner(); + }, interval); + this.disposable = toDisposable(() => { + context.clearInterval(handle); + this.disposable = void 0; + }); + } + dispose() { + this.cancel(); + this.isDisposed = true; + } + }; + RunOnceScheduler = class { + constructor(runner, delay) { + this.timeoutToken = -1; + this.runner = runner; + this.timeout = delay; + this.timeoutHandler = this.onTimeout.bind(this); + } + /** + * Dispose RunOnceScheduler + */ + dispose() { + this.cancel(); + this.runner = null; + } + /** + * Cancel current scheduled runner (if any). + */ + cancel() { + if (this.isScheduled()) { + clearTimeout(this.timeoutToken); + this.timeoutToken = -1; + } + } + /** + * Cancel previous runner (if any) & schedule a new runner. + */ + schedule(delay = this.timeout) { + this.cancel(); + this.timeoutToken = setTimeout(this.timeoutHandler, delay); + } + get delay() { + return this.timeout; + } + set delay(value) { + this.timeout = value; + } + /** + * Returns true if scheduled. + */ + isScheduled() { + return this.timeoutToken !== -1; + } + onTimeout() { + this.timeoutToken = -1; + if (this.runner) { + this.doRun(); + } + } + doRun() { + var _a10; + (_a10 = this.runner) === null || _a10 === void 0 ? void 0 : _a10.call(this); + } + }; + (function() { + if (typeof globalThis.requestIdleCallback !== "function" || typeof globalThis.cancelIdleCallback !== "function") { + _runWhenIdle = (_targetWindow, runner) => { + setTimeout0(() => { + if (disposed) { + return; + } + const end = Date.now() + 15; + const deadline = { + didTimeout: true, + timeRemaining() { + return Math.max(0, end - Date.now()); + } + }; + runner(Object.freeze(deadline)); + }); + let disposed = false; + return { + dispose() { + if (disposed) { + return; + } + disposed = true; + } + }; + }; + } else { + _runWhenIdle = (targetWindow, runner, timeout2) => { + const handle = targetWindow.requestIdleCallback(runner, typeof timeout2 === "number" ? { timeout: timeout2 } : void 0); + let disposed = false; + return { + dispose() { + if (disposed) { + return; + } + disposed = true; + targetWindow.cancelIdleCallback(handle); + } + }; + }; + } + runWhenGlobalIdle = (runner) => _runWhenIdle(globalThis, runner); + })(); + AbstractIdleValue = class { + constructor(targetWindow, executor) { + this._didRun = false; + this._executor = () => { + try { + this._value = executor(); + } catch (err) { + this._error = err; + } finally { + this._didRun = true; + } + }; + this._handle = _runWhenIdle(targetWindow, () => this._executor()); + } + dispose() { + this._handle.dispose(); + } + get value() { + if (!this._didRun) { + this._handle.dispose(); + this._executor(); + } + if (this._error) { + throw this._error; + } + return this._value; + } + get isInitialized() { + return this._didRun; + } + }; + GlobalIdleValue = class extends AbstractIdleValue { + constructor(executor) { + super(globalThis, executor); + } + }; + DeferredPromise = class { + get isRejected() { + var _a10; + return ((_a10 = this.outcome) === null || _a10 === void 0 ? void 0 : _a10.outcome) === 1; + } + get isSettled() { + return !!this.outcome; + } + constructor() { + this.p = new Promise((c, e) => { + this.completeCallback = c; + this.errorCallback = e; + }); + } + complete(value) { + return new Promise((resolve2) => { + this.completeCallback(value); + this.outcome = { outcome: 0, value }; + resolve2(); + }); + } + error(err) { + return new Promise((resolve2) => { + this.errorCallback(err); + this.outcome = { outcome: 1, value: err }; + resolve2(); + }); + } + cancel() { + return this.error(new CancellationError()); + } + }; + (function(Promises2) { + function settled(promises) { + return __async(this, null, function* () { + let firstError = void 0; + const result = yield Promise.all(promises.map((promise) => promise.then((value) => value, (error) => { + if (!firstError) { + firstError = error; + } + return void 0; + }))); + if (typeof firstError !== "undefined") { + throw firstError; + } + return result; + }); + } + Promises2.settled = settled; + function withAsyncBody(bodyFn) { + return new Promise((resolve2, reject) => __async(this, null, function* () { + try { + yield bodyFn(resolve2, reject); + } catch (error) { + reject(error); + } + })); + } + Promises2.withAsyncBody = withAsyncBody; + })(Promises || (Promises = {})); + AsyncIterableObject = class _AsyncIterableObject { + static fromArray(items) { + return new _AsyncIterableObject((writer) => { + writer.emitMany(items); + }); + } + static fromPromise(promise) { + return new _AsyncIterableObject((emitter) => __async(this, null, function* () { + emitter.emitMany(yield promise); + })); + } + static fromPromises(promises) { + return new _AsyncIterableObject((emitter) => __async(this, null, function* () { + yield Promise.all(promises.map((p) => __async(this, null, function* () { + return emitter.emitOne(yield p); + }))); + })); + } + static merge(iterables) { + return new _AsyncIterableObject((emitter) => __async(this, null, function* () { + yield Promise.all(iterables.map((iterable) => __async(this, null, function* () { + try { + for (var iter = __forAwait(iterable), more, temp, error; more = !(temp = yield iter.next()).done; more = false) { + const item = temp.value; + emitter.emitOne(item); + } + } catch (temp) { + error = [temp]; + } finally { + try { + more && (temp = iter.return) && (yield temp.call(iter)); + } finally { + if (error) + throw error[0]; + } + } + }))); + })); + } + constructor(executor, onReturn) { + this._state = 0; + this._results = []; + this._error = null; + this._onReturn = onReturn; + this._onStateChanged = new Emitter(); + queueMicrotask(() => __async(this, null, function* () { + const writer = { + emitOne: (item) => this.emitOne(item), + emitMany: (items) => this.emitMany(items), + reject: (error) => this.reject(error) + }; + try { + yield Promise.resolve(executor(writer)); + this.resolve(); + } catch (err) { + this.reject(err); + } finally { + writer.emitOne = void 0; + writer.emitMany = void 0; + writer.reject = void 0; + } + })); + } + [Symbol.asyncIterator]() { + let i = 0; + return { + next: () => __async(this, null, function* () { + do { + if (this._state === 2) { + throw this._error; + } + if (i < this._results.length) { + return { done: false, value: this._results[i++] }; + } + if (this._state === 1) { + return { done: true, value: void 0 }; + } + yield Event.toPromise(this._onStateChanged.event); + } while (true); + }), + return: () => __async(this, null, function* () { + var _a10; + (_a10 = this._onReturn) === null || _a10 === void 0 ? void 0 : _a10.call(this); + return { done: true, value: void 0 }; + }) + }; + } + static map(iterable, mapFn) { + return new _AsyncIterableObject((emitter) => __async(this, null, function* () { + try { + for (var iter = __forAwait(iterable), more, temp, error; more = !(temp = yield iter.next()).done; more = false) { + const item = temp.value; + emitter.emitOne(mapFn(item)); + } + } catch (temp) { + error = [temp]; + } finally { + try { + more && (temp = iter.return) && (yield temp.call(iter)); + } finally { + if (error) + throw error[0]; + } + } + })); + } + map(mapFn) { + return _AsyncIterableObject.map(this, mapFn); + } + static filter(iterable, filterFn) { + return new _AsyncIterableObject((emitter) => __async(this, null, function* () { + try { + for (var iter = __forAwait(iterable), more, temp, error; more = !(temp = yield iter.next()).done; more = false) { + const item = temp.value; + if (filterFn(item)) { + emitter.emitOne(item); + } + } + } catch (temp) { + error = [temp]; + } finally { + try { + more && (temp = iter.return) && (yield temp.call(iter)); + } finally { + if (error) + throw error[0]; + } + } + })); + } + filter(filterFn) { + return _AsyncIterableObject.filter(this, filterFn); + } + static coalesce(iterable) { + return _AsyncIterableObject.filter(iterable, (item) => !!item); + } + coalesce() { + return _AsyncIterableObject.coalesce(this); + } + static toPromise(iterable) { + return __async(this, null, function* () { + const result = []; + try { + for (var iter = __forAwait(iterable), more, temp, error; more = !(temp = yield iter.next()).done; more = false) { + const item = temp.value; + result.push(item); + } + } catch (temp) { + error = [temp]; + } finally { + try { + more && (temp = iter.return) && (yield temp.call(iter)); + } finally { + if (error) + throw error[0]; + } + } + return result; + }); + } + toPromise() { + return _AsyncIterableObject.toPromise(this); + } + /** + * The value will be appended at the end. + * + * **NOTE** If `resolve()` or `reject()` have already been called, this method has no effect. + */ + emitOne(value) { + if (this._state !== 0) { + return; + } + this._results.push(value); + this._onStateChanged.fire(); + } + /** + * The values will be appended at the end. + * + * **NOTE** If `resolve()` or `reject()` have already been called, this method has no effect. + */ + emitMany(values2) { + if (this._state !== 0) { + return; + } + this._results = this._results.concat(values2); + this._onStateChanged.fire(); + } + /** + * Calling `resolve()` will mark the result array as complete. + * + * **NOTE** `resolve()` must be called, otherwise all consumers of this iterable will hang indefinitely, similar to a non-resolved promise. + * **NOTE** If `resolve()` or `reject()` have already been called, this method has no effect. + */ + resolve() { + if (this._state !== 0) { + return; + } + this._state = 1; + this._onStateChanged.fire(); + } + /** + * Writing an error will permanently invalidate this iterable. + * The current users will receive an error thrown, as will all future users. + * + * **NOTE** If `resolve()` or `reject()` have already been called, this method has no effect. + */ + reject(error) { + if (this._state !== 0) { + return; + } + this._state = 2; + this._error = error; + this._onStateChanged.fire(); + } + }; + AsyncIterableObject.EMPTY = AsyncIterableObject.fromArray([]); + CancelableAsyncIterableObject = class extends AsyncIterableObject { + constructor(_source, executor) { + super(executor); + this._source = _source; + } + cancel() { + this._source.cancel(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/dompurify/dompurify.js +function unapply(func) { + return function(thisArg) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return apply(func, thisArg, args); + }; +} +function unconstruct(func) { + return function() { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + return construct(func, args); + }; +} +function addToSet(set, array2, transformCaseFunc) { + var _transformCaseFunc; + transformCaseFunc = (_transformCaseFunc = transformCaseFunc) !== null && _transformCaseFunc !== void 0 ? _transformCaseFunc : stringToLowerCase; + if (setPrototypeOf) { + setPrototypeOf(set, null); + } + let l = array2.length; + while (l--) { + let element = array2[l]; + if (typeof element === "string") { + const lcElement = transformCaseFunc(element); + if (lcElement !== element) { + if (!isFrozen(array2)) { + array2[l] = lcElement; + } + element = lcElement; + } + } + set[element] = true; + } + return set; +} +function clone(object) { + const newObject = create(null); + for (const [property, value] of entries(object)) { + newObject[property] = value; + } + return newObject; +} +function lookupGetter(object, prop) { + while (object !== null) { + const desc = getOwnPropertyDescriptor(object, prop); + if (desc) { + if (desc.get) { + return unapply(desc.get); + } + if (typeof desc.value === "function") { + return unapply(desc.value); + } + } + object = getPrototypeOf(object); + } + function fallbackValue(element) { + console.warn("fallback value for", element); + return null; + } + return fallbackValue; +} +function createDOMPurify() { + let window2 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : getGlobal(); + const DOMPurify = (root) => createDOMPurify(root); + DOMPurify.version = "3.0.5"; + DOMPurify.removed = []; + if (!window2 || !window2.document || window2.document.nodeType !== 9) { + DOMPurify.isSupported = false; + return DOMPurify; + } + const originalDocument = window2.document; + const currentScript = originalDocument.currentScript; + let { + document: document2 + } = window2; + const { + DocumentFragment, + HTMLTemplateElement, + Node: Node6, + Element: Element3, + NodeFilter, + NamedNodeMap = window2.NamedNodeMap || window2.MozNamedAttrMap, + HTMLFormElement, + DOMParser: DOMParser2, + trustedTypes + } = window2; + const ElementPrototype = Element3.prototype; + const cloneNode = lookupGetter(ElementPrototype, "cloneNode"); + const getNextSibling = lookupGetter(ElementPrototype, "nextSibling"); + const getChildNodes = lookupGetter(ElementPrototype, "childNodes"); + const getParentNode = lookupGetter(ElementPrototype, "parentNode"); + if (typeof HTMLTemplateElement === "function") { + const template = document2.createElement("template"); + if (template.content && template.content.ownerDocument) { + document2 = template.content.ownerDocument; + } + } + let trustedTypesPolicy; + let emptyHTML = ""; + const { + implementation, + createNodeIterator, + createDocumentFragment, + getElementsByTagName + } = document2; + const { + importNode + } = originalDocument; + let hooks = {}; + DOMPurify.isSupported = typeof entries === "function" && typeof getParentNode === "function" && implementation && implementation.createHTMLDocument !== void 0; + const { + MUSTACHE_EXPR: MUSTACHE_EXPR2, + ERB_EXPR: ERB_EXPR2, + TMPLIT_EXPR: TMPLIT_EXPR2, + DATA_ATTR: DATA_ATTR2, + ARIA_ATTR: ARIA_ATTR2, + IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA2, + ATTR_WHITESPACE: ATTR_WHITESPACE2 + } = EXPRESSIONS; + let { + IS_ALLOWED_URI: IS_ALLOWED_URI$1 + } = EXPRESSIONS; + let ALLOWED_TAGS = null; + const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]); + let ALLOWED_ATTR = null; + const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]); + let CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(null, { + tagNameCheck: { + writable: true, + configurable: false, + enumerable: true, + value: null + }, + attributeNameCheck: { + writable: true, + configurable: false, + enumerable: true, + value: null + }, + allowCustomizedBuiltInElements: { + writable: true, + configurable: false, + enumerable: true, + value: false + } + })); + let FORBID_TAGS = null; + let FORBID_ATTR = null; + let ALLOW_ARIA_ATTR = true; + let ALLOW_DATA_ATTR = true; + let ALLOW_UNKNOWN_PROTOCOLS = false; + let ALLOW_SELF_CLOSE_IN_ATTR = true; + let SAFE_FOR_TEMPLATES = false; + let WHOLE_DOCUMENT = false; + let SET_CONFIG = false; + let FORCE_BODY = false; + let RETURN_DOM = false; + let RETURN_DOM_FRAGMENT = false; + let RETURN_TRUSTED_TYPE = false; + let SANITIZE_DOM = true; + let SANITIZE_NAMED_PROPS = false; + const SANITIZE_NAMED_PROPS_PREFIX = "user-content-"; + let KEEP_CONTENT = true; + let IN_PLACE = false; + let USE_PROFILES = {}; + let FORBID_CONTENTS = null; + const DEFAULT_FORBID_CONTENTS = addToSet({}, ["annotation-xml", "audio", "colgroup", "desc", "foreignobject", "head", "iframe", "math", "mi", "mn", "mo", "ms", "mtext", "noembed", "noframes", "noscript", "plaintext", "script", "style", "svg", "template", "thead", "title", "video", "xmp"]); + let DATA_URI_TAGS = null; + const DEFAULT_DATA_URI_TAGS = addToSet({}, ["audio", "video", "img", "source", "image", "track"]); + let URI_SAFE_ATTRIBUTES = null; + const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ["alt", "class", "for", "id", "label", "name", "pattern", "placeholder", "role", "summary", "title", "value", "style", "xmlns"]); + const MATHML_NAMESPACE = "http://www.w3.org/1998/Math/MathML"; + const SVG_NAMESPACE = "http://www.w3.org/2000/svg"; + const HTML_NAMESPACE = "http://www.w3.org/1999/xhtml"; + let NAMESPACE = HTML_NAMESPACE; + let IS_EMPTY_INPUT = false; + let ALLOWED_NAMESPACES = null; + const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString); + let PARSER_MEDIA_TYPE; + const SUPPORTED_PARSER_MEDIA_TYPES = ["application/xhtml+xml", "text/html"]; + const DEFAULT_PARSER_MEDIA_TYPE = "text/html"; + let transformCaseFunc; + let CONFIG = null; + const formElement = document2.createElement("form"); + const isRegexOrFunction = function isRegexOrFunction2(testValue) { + return testValue instanceof RegExp || testValue instanceof Function; + }; + const _parseConfig = function _parseConfig2(cfg) { + if (CONFIG && CONFIG === cfg) { + return; + } + if (!cfg || typeof cfg !== "object") { + cfg = {}; + } + cfg = clone(cfg); + PARSER_MEDIA_TYPE = // eslint-disable-next-line unicorn/prefer-includes + SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE; + transformCaseFunc = PARSER_MEDIA_TYPE === "application/xhtml+xml" ? stringToString : stringToLowerCase; + ALLOWED_TAGS = "ALLOWED_TAGS" in cfg ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS; + ALLOWED_ATTR = "ALLOWED_ATTR" in cfg ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR; + ALLOWED_NAMESPACES = "ALLOWED_NAMESPACES" in cfg ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES; + URI_SAFE_ATTRIBUTES = "ADD_URI_SAFE_ATTR" in cfg ? addToSet( + clone(DEFAULT_URI_SAFE_ATTRIBUTES), + // eslint-disable-line indent + cfg.ADD_URI_SAFE_ATTR, + // eslint-disable-line indent + transformCaseFunc + // eslint-disable-line indent + ) : DEFAULT_URI_SAFE_ATTRIBUTES; + DATA_URI_TAGS = "ADD_DATA_URI_TAGS" in cfg ? addToSet( + clone(DEFAULT_DATA_URI_TAGS), + // eslint-disable-line indent + cfg.ADD_DATA_URI_TAGS, + // eslint-disable-line indent + transformCaseFunc + // eslint-disable-line indent + ) : DEFAULT_DATA_URI_TAGS; + FORBID_CONTENTS = "FORBID_CONTENTS" in cfg ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS; + FORBID_TAGS = "FORBID_TAGS" in cfg ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {}; + FORBID_ATTR = "FORBID_ATTR" in cfg ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {}; + USE_PROFILES = "USE_PROFILES" in cfg ? cfg.USE_PROFILES : false; + ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; + ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; + ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; + ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; + SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; + WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; + RETURN_DOM = cfg.RETURN_DOM || false; + RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; + RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; + FORCE_BODY = cfg.FORCE_BODY || false; + SANITIZE_DOM = cfg.SANITIZE_DOM !== false; + SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; + KEEP_CONTENT = cfg.KEEP_CONTENT !== false; + IN_PLACE = cfg.IN_PLACE || false; + IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI; + NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE; + CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {}; + if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) { + CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck; + } + if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) { + CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck; + } + if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === "boolean") { + CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements; + } + if (SAFE_FOR_TEMPLATES) { + ALLOW_DATA_ATTR = false; + } + if (RETURN_DOM_FRAGMENT) { + RETURN_DOM = true; + } + if (USE_PROFILES) { + ALLOWED_TAGS = addToSet({}, [...text]); + ALLOWED_ATTR = []; + if (USE_PROFILES.html === true) { + addToSet(ALLOWED_TAGS, html$1); + addToSet(ALLOWED_ATTR, html); + } + if (USE_PROFILES.svg === true) { + addToSet(ALLOWED_TAGS, svg$1); + addToSet(ALLOWED_ATTR, svg); + addToSet(ALLOWED_ATTR, xml); + } + if (USE_PROFILES.svgFilters === true) { + addToSet(ALLOWED_TAGS, svgFilters); + addToSet(ALLOWED_ATTR, svg); + addToSet(ALLOWED_ATTR, xml); + } + if (USE_PROFILES.mathMl === true) { + addToSet(ALLOWED_TAGS, mathMl$1); + addToSet(ALLOWED_ATTR, mathMl); + addToSet(ALLOWED_ATTR, xml); + } + } + if (cfg.ADD_TAGS) { + if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) { + ALLOWED_TAGS = clone(ALLOWED_TAGS); + } + addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc); + } + if (cfg.ADD_ATTR) { + if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) { + ALLOWED_ATTR = clone(ALLOWED_ATTR); + } + addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc); + } + if (cfg.ADD_URI_SAFE_ATTR) { + addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc); + } + if (cfg.FORBID_CONTENTS) { + if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) { + FORBID_CONTENTS = clone(FORBID_CONTENTS); + } + addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc); + } + if (KEEP_CONTENT) { + ALLOWED_TAGS["#text"] = true; + } + if (WHOLE_DOCUMENT) { + addToSet(ALLOWED_TAGS, ["html", "head", "body"]); + } + if (ALLOWED_TAGS.table) { + addToSet(ALLOWED_TAGS, ["tbody"]); + delete FORBID_TAGS.tbody; + } + if (cfg.TRUSTED_TYPES_POLICY) { + if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== "function") { + throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.'); + } + if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== "function") { + throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.'); + } + trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY; + emptyHTML = trustedTypesPolicy.createHTML(""); + } else { + if (trustedTypesPolicy === void 0) { + trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript); + } + if (trustedTypesPolicy !== null && typeof emptyHTML === "string") { + emptyHTML = trustedTypesPolicy.createHTML(""); + } + } + if (freeze) { + freeze(cfg); + } + CONFIG = cfg; + }; + const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ["mi", "mo", "mn", "ms", "mtext"]); + const HTML_INTEGRATION_POINTS = addToSet({}, ["foreignobject", "desc", "title", "annotation-xml"]); + const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ["title", "style", "font", "a", "script"]); + const ALL_SVG_TAGS = addToSet({}, svg$1); + addToSet(ALL_SVG_TAGS, svgFilters); + addToSet(ALL_SVG_TAGS, svgDisallowed); + const ALL_MATHML_TAGS = addToSet({}, mathMl$1); + addToSet(ALL_MATHML_TAGS, mathMlDisallowed); + const _checkValidNamespace = function _checkValidNamespace2(element) { + let parent = getParentNode(element); + if (!parent || !parent.tagName) { + parent = { + namespaceURI: NAMESPACE, + tagName: "template" + }; + } + const tagName = stringToLowerCase(element.tagName); + const parentTagName = stringToLowerCase(parent.tagName); + if (!ALLOWED_NAMESPACES[element.namespaceURI]) { + return false; + } + if (element.namespaceURI === SVG_NAMESPACE) { + if (parent.namespaceURI === HTML_NAMESPACE) { + return tagName === "svg"; + } + if (parent.namespaceURI === MATHML_NAMESPACE) { + return tagName === "svg" && (parentTagName === "annotation-xml" || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]); + } + return Boolean(ALL_SVG_TAGS[tagName]); + } + if (element.namespaceURI === MATHML_NAMESPACE) { + if (parent.namespaceURI === HTML_NAMESPACE) { + return tagName === "math"; + } + if (parent.namespaceURI === SVG_NAMESPACE) { + return tagName === "math" && HTML_INTEGRATION_POINTS[parentTagName]; + } + return Boolean(ALL_MATHML_TAGS[tagName]); + } + if (element.namespaceURI === HTML_NAMESPACE) { + if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) { + return false; + } + if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) { + return false; + } + return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]); + } + if (PARSER_MEDIA_TYPE === "application/xhtml+xml" && ALLOWED_NAMESPACES[element.namespaceURI]) { + return true; + } + return false; + }; + const _forceRemove = function _forceRemove2(node) { + arrayPush(DOMPurify.removed, { + element: node + }); + try { + node.parentNode.removeChild(node); + } catch (_) { + node.remove(); + } + }; + const _removeAttribute = function _removeAttribute2(name, node) { + try { + arrayPush(DOMPurify.removed, { + attribute: node.getAttributeNode(name), + from: node + }); + } catch (_) { + arrayPush(DOMPurify.removed, { + attribute: null, + from: node + }); + } + node.removeAttribute(name); + if (name === "is" && !ALLOWED_ATTR[name]) { + if (RETURN_DOM || RETURN_DOM_FRAGMENT) { + try { + _forceRemove(node); + } catch (_) { + } + } else { + try { + node.setAttribute(name, ""); + } catch (_) { + } + } + } + }; + const _initDocument = function _initDocument2(dirty) { + let doc; + let leadingWhitespace; + if (FORCE_BODY) { + dirty = "" + dirty; + } else { + const matches2 = stringMatch(dirty, /^[\r\n\t ]+/); + leadingWhitespace = matches2 && matches2[0]; + } + if (PARSER_MEDIA_TYPE === "application/xhtml+xml" && NAMESPACE === HTML_NAMESPACE) { + dirty = '' + dirty + ""; + } + const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty; + if (NAMESPACE === HTML_NAMESPACE) { + try { + doc = new DOMParser2().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE); + } catch (_) { + } + } + if (!doc || !doc.documentElement) { + doc = implementation.createDocument(NAMESPACE, "template", null); + try { + doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload; + } catch (_) { + } + } + const body = doc.body || doc.documentElement; + if (dirty && leadingWhitespace) { + body.insertBefore(document2.createTextNode(leadingWhitespace), body.childNodes[0] || null); + } + if (NAMESPACE === HTML_NAMESPACE) { + return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? "html" : "body")[0]; + } + return WHOLE_DOCUMENT ? doc.documentElement : body; + }; + const _createIterator = function _createIterator2(root) { + return createNodeIterator.call( + root.ownerDocument || root, + root, + // eslint-disable-next-line no-bitwise + NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, + null, + false + ); + }; + const _isClobbered = function _isClobbered2(elm) { + return elm instanceof HTMLFormElement && (typeof elm.nodeName !== "string" || typeof elm.textContent !== "string" || typeof elm.removeChild !== "function" || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== "function" || typeof elm.setAttribute !== "function" || typeof elm.namespaceURI !== "string" || typeof elm.insertBefore !== "function" || typeof elm.hasChildNodes !== "function"); + }; + const _isNode = function _isNode2(object) { + return typeof Node6 === "object" ? object instanceof Node6 : object && typeof object === "object" && typeof object.nodeType === "number" && typeof object.nodeName === "string"; + }; + const _executeHook = function _executeHook2(entryPoint, currentNode, data) { + if (!hooks[entryPoint]) { + return; + } + arrayForEach(hooks[entryPoint], (hook) => { + hook.call(DOMPurify, currentNode, data, CONFIG); + }); + }; + const _sanitizeElements = function _sanitizeElements2(currentNode) { + let content; + _executeHook("beforeSanitizeElements", currentNode, null); + if (_isClobbered(currentNode)) { + _forceRemove(currentNode); + return true; + } + const tagName = transformCaseFunc(currentNode.nodeName); + _executeHook("uponSanitizeElement", currentNode, { + tagName, + allowedTags: ALLOWED_TAGS + }); + if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) { + _forceRemove(currentNode); + return true; + } + if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) { + if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) { + if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false; + if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) return false; + } + if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) { + const parentNode = getParentNode(currentNode) || currentNode.parentNode; + const childNodes = getChildNodes(currentNode) || currentNode.childNodes; + if (childNodes && parentNode) { + const childCount = childNodes.length; + for (let i = childCount - 1; i >= 0; --i) { + parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode)); + } + } + } + _forceRemove(currentNode); + return true; + } + if (currentNode instanceof Element3 && !_checkValidNamespace(currentNode)) { + _forceRemove(currentNode); + return true; + } + if ((tagName === "noscript" || tagName === "noembed" || tagName === "noframes") && regExpTest(/<\/no(script|embed|frames)/i, currentNode.innerHTML)) { + _forceRemove(currentNode); + return true; + } + if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) { + content = currentNode.textContent; + content = stringReplace(content, MUSTACHE_EXPR2, " "); + content = stringReplace(content, ERB_EXPR2, " "); + content = stringReplace(content, TMPLIT_EXPR2, " "); + if (currentNode.textContent !== content) { + arrayPush(DOMPurify.removed, { + element: currentNode.cloneNode() + }); + currentNode.textContent = content; + } + } + _executeHook("afterSanitizeElements", currentNode, null); + return false; + }; + const _isValidAttribute = function _isValidAttribute2(lcTag, lcName, value) { + if (SANITIZE_DOM && (lcName === "id" || lcName === "name") && (value in document2 || value in formElement)) { + return false; + } + if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR2, lcName)) ; + else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR2, lcName)) ; + else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) { + if ( + // First condition does a very basic check if a) it's basically a valid custom element tagname AND + // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck + // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck + _basicCustomElementTest(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) || // Alternative, second condition checks if it's an `is`-attribute, AND + // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck + lcName === "is" && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value)) + ) ; + else { + return false; + } + } else if (URI_SAFE_ATTRIBUTES[lcName]) ; + else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE2, ""))) ; + else if ((lcName === "src" || lcName === "xlink:href" || lcName === "href") && lcTag !== "script" && stringIndexOf(value, "data:") === 0 && DATA_URI_TAGS[lcTag]) ; + else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA2, stringReplace(value, ATTR_WHITESPACE2, ""))) ; + else if (value) { + return false; + } else ; + return true; + }; + const _basicCustomElementTest = function _basicCustomElementTest2(tagName) { + return tagName.indexOf("-") > 0; + }; + const _sanitizeAttributes = function _sanitizeAttributes2(currentNode) { + let attr; + let value; + let lcName; + let l; + _executeHook("beforeSanitizeAttributes", currentNode, null); + const { + attributes + } = currentNode; + if (!attributes) { + return; + } + const hookEvent = { + attrName: "", + attrValue: "", + keepAttr: true, + allowedAttributes: ALLOWED_ATTR + }; + l = attributes.length; + while (l--) { + attr = attributes[l]; + const { + name, + namespaceURI + } = attr; + value = name === "value" ? attr.value : stringTrim(attr.value); + lcName = transformCaseFunc(name); + hookEvent.attrName = lcName; + hookEvent.attrValue = value; + hookEvent.keepAttr = true; + hookEvent.forceKeepAttr = void 0; + _executeHook("uponSanitizeAttribute", currentNode, hookEvent); + value = hookEvent.attrValue; + if (hookEvent.forceKeepAttr) { + continue; + } + _removeAttribute(name, currentNode); + if (!hookEvent.keepAttr) { + continue; + } + if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\/>/i, value)) { + _removeAttribute(name, currentNode); + continue; + } + if (SAFE_FOR_TEMPLATES) { + value = stringReplace(value, MUSTACHE_EXPR2, " "); + value = stringReplace(value, ERB_EXPR2, " "); + value = stringReplace(value, TMPLIT_EXPR2, " "); + } + const lcTag = transformCaseFunc(currentNode.nodeName); + if (!_isValidAttribute(lcTag, lcName, value)) { + continue; + } + if (SANITIZE_NAMED_PROPS && (lcName === "id" || lcName === "name")) { + _removeAttribute(name, currentNode); + value = SANITIZE_NAMED_PROPS_PREFIX + value; + } + if (trustedTypesPolicy && typeof trustedTypes === "object" && typeof trustedTypes.getAttributeType === "function") { + if (namespaceURI) ; + else { + switch (trustedTypes.getAttributeType(lcTag, lcName)) { + case "TrustedHTML": { + value = trustedTypesPolicy.createHTML(value); + break; + } + case "TrustedScriptURL": { + value = trustedTypesPolicy.createScriptURL(value); + break; + } + } + } + } + try { + if (namespaceURI) { + currentNode.setAttributeNS(namespaceURI, name, value); + } else { + currentNode.setAttribute(name, value); + } + arrayPop(DOMPurify.removed); + } catch (_) { + } + } + _executeHook("afterSanitizeAttributes", currentNode, null); + }; + const _sanitizeShadowDOM = function _sanitizeShadowDOM2(fragment) { + let shadowNode; + const shadowIterator = _createIterator(fragment); + _executeHook("beforeSanitizeShadowDOM", fragment, null); + while (shadowNode = shadowIterator.nextNode()) { + _executeHook("uponSanitizeShadowNode", shadowNode, null); + if (_sanitizeElements(shadowNode)) { + continue; + } + if (shadowNode.content instanceof DocumentFragment) { + _sanitizeShadowDOM2(shadowNode.content); + } + _sanitizeAttributes(shadowNode); + } + _executeHook("afterSanitizeShadowDOM", fragment, null); + }; + DOMPurify.sanitize = function(dirty) { + let cfg = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + let body; + let importedNode; + let currentNode; + let returnNode; + IS_EMPTY_INPUT = !dirty; + if (IS_EMPTY_INPUT) { + dirty = ""; + } + if (typeof dirty !== "string" && !_isNode(dirty)) { + if (typeof dirty.toString === "function") { + dirty = dirty.toString(); + if (typeof dirty !== "string") { + throw typeErrorCreate("dirty is not a string, aborting"); + } + } else { + throw typeErrorCreate("toString is not a function"); + } + } + if (!DOMPurify.isSupported) { + return dirty; + } + if (!SET_CONFIG) { + _parseConfig(cfg); + } + DOMPurify.removed = []; + if (typeof dirty === "string") { + IN_PLACE = false; + } + if (IN_PLACE) { + if (dirty.nodeName) { + const tagName = transformCaseFunc(dirty.nodeName); + if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) { + throw typeErrorCreate("root node is forbidden and cannot be sanitized in-place"); + } + } + } else if (dirty instanceof Node6) { + body = _initDocument(""); + importedNode = body.ownerDocument.importNode(dirty, true); + if (importedNode.nodeType === 1 && importedNode.nodeName === "BODY") { + body = importedNode; + } else if (importedNode.nodeName === "HTML") { + body = importedNode; + } else { + body.appendChild(importedNode); + } + } else { + if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && // eslint-disable-next-line unicorn/prefer-includes + dirty.indexOf("<") === -1) { + return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty; + } + body = _initDocument(dirty); + if (!body) { + return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : ""; + } + } + if (body && FORCE_BODY) { + _forceRemove(body.firstChild); + } + const nodeIterator = _createIterator(IN_PLACE ? dirty : body); + while (currentNode = nodeIterator.nextNode()) { + if (_sanitizeElements(currentNode)) { + continue; + } + if (currentNode.content instanceof DocumentFragment) { + _sanitizeShadowDOM(currentNode.content); + } + _sanitizeAttributes(currentNode); + } + if (IN_PLACE) { + return dirty; + } + if (RETURN_DOM) { + if (RETURN_DOM_FRAGMENT) { + returnNode = createDocumentFragment.call(body.ownerDocument); + while (body.firstChild) { + returnNode.appendChild(body.firstChild); + } + } else { + returnNode = body; + } + if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) { + returnNode = importNode.call(originalDocument, returnNode, true); + } + return returnNode; + } + let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML; + if (WHOLE_DOCUMENT && ALLOWED_TAGS["!doctype"] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) { + serializedHTML = "\n" + serializedHTML; + } + if (SAFE_FOR_TEMPLATES) { + serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR2, " "); + serializedHTML = stringReplace(serializedHTML, ERB_EXPR2, " "); + serializedHTML = stringReplace(serializedHTML, TMPLIT_EXPR2, " "); + } + return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML; + }; + DOMPurify.setConfig = function(cfg) { + _parseConfig(cfg); + SET_CONFIG = true; + }; + DOMPurify.clearConfig = function() { + CONFIG = null; + SET_CONFIG = false; + }; + DOMPurify.isValidAttribute = function(tag, attr, value) { + if (!CONFIG) { + _parseConfig({}); + } + const lcTag = transformCaseFunc(tag); + const lcName = transformCaseFunc(attr); + return _isValidAttribute(lcTag, lcName, value); + }; + DOMPurify.addHook = function(entryPoint, hookFunction) { + if (typeof hookFunction !== "function") { + return; + } + hooks[entryPoint] = hooks[entryPoint] || []; + arrayPush(hooks[entryPoint], hookFunction); + }; + DOMPurify.removeHook = function(entryPoint) { + if (hooks[entryPoint]) { + return arrayPop(hooks[entryPoint]); + } + }; + DOMPurify.removeHooks = function(entryPoint) { + if (hooks[entryPoint]) { + hooks[entryPoint] = []; + } + }; + DOMPurify.removeAllHooks = function() { + hooks = {}; + }; + return DOMPurify; +} +var entries, setPrototypeOf, isFrozen, getPrototypeOf, getOwnPropertyDescriptor, freeze, seal, create, apply, construct, arrayForEach, arrayPop, arrayPush, stringToLowerCase, stringToString, stringMatch, stringReplace, stringIndexOf, stringTrim, regExpTest, typeErrorCreate, html$1, svg$1, svgFilters, svgDisallowed, mathMl$1, mathMlDisallowed, text, html, svg, mathMl, xml, MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR, DATA_ATTR, ARIA_ATTR, IS_ALLOWED_URI, IS_SCRIPT_OR_DATA, ATTR_WHITESPACE, DOCTYPE_NAME, EXPRESSIONS, getGlobal, _createTrustedTypesPolicy, purify, version, isSupported, sanitize, setConfig, clearConfig, isValidAttribute, addHook, removeHook, removeHooks, removeAllHooks; +var init_dompurify = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/dompurify/dompurify.js"() { + ({ + entries, + setPrototypeOf, + isFrozen, + getPrototypeOf, + getOwnPropertyDescriptor + } = Object); + ({ + freeze, + seal, + create + } = Object); + ({ + apply, + construct + } = typeof Reflect !== "undefined" && Reflect); + if (!apply) { + apply = function apply2(fun, thisValue, args) { + return fun.apply(thisValue, args); + }; + } + if (!freeze) { + freeze = function freeze3(x) { + return x; + }; + } + if (!seal) { + seal = function seal2(x) { + return x; + }; + } + if (!construct) { + construct = function construct2(Func, args) { + return new Func(...args); + }; + } + arrayForEach = unapply(Array.prototype.forEach); + arrayPop = unapply(Array.prototype.pop); + arrayPush = unapply(Array.prototype.push); + stringToLowerCase = unapply(String.prototype.toLowerCase); + stringToString = unapply(String.prototype.toString); + stringMatch = unapply(String.prototype.match); + stringReplace = unapply(String.prototype.replace); + stringIndexOf = unapply(String.prototype.indexOf); + stringTrim = unapply(String.prototype.trim); + regExpTest = unapply(RegExp.prototype.test); + typeErrorCreate = unconstruct(TypeError); + html$1 = freeze(["a", "abbr", "acronym", "address", "area", "article", "aside", "audio", "b", "bdi", "bdo", "big", "blink", "blockquote", "body", "br", "button", "canvas", "caption", "center", "cite", "code", "col", "colgroup", "content", "data", "datalist", "dd", "decorator", "del", "details", "dfn", "dialog", "dir", "div", "dl", "dt", "element", "em", "fieldset", "figcaption", "figure", "font", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html", "i", "img", "input", "ins", "kbd", "label", "legend", "li", "main", "map", "mark", "marquee", "menu", "menuitem", "meter", "nav", "nobr", "ol", "optgroup", "option", "output", "p", "picture", "pre", "progress", "q", "rp", "rt", "ruby", "s", "samp", "section", "select", "shadow", "small", "source", "spacer", "span", "strike", "strong", "style", "sub", "summary", "sup", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "time", "tr", "track", "tt", "u", "ul", "var", "video", "wbr"]); + svg$1 = freeze(["svg", "a", "altglyph", "altglyphdef", "altglyphitem", "animatecolor", "animatemotion", "animatetransform", "circle", "clippath", "defs", "desc", "ellipse", "filter", "font", "g", "glyph", "glyphref", "hkern", "image", "line", "lineargradient", "marker", "mask", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialgradient", "rect", "stop", "style", "switch", "symbol", "text", "textpath", "title", "tref", "tspan", "view", "vkern"]); + svgFilters = freeze(["feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence"]); + svgDisallowed = freeze(["animate", "color-profile", "cursor", "discard", "font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri", "foreignobject", "hatch", "hatchpath", "mesh", "meshgradient", "meshpatch", "meshrow", "missing-glyph", "script", "set", "solidcolor", "unknown", "use"]); + mathMl$1 = freeze(["math", "menclose", "merror", "mfenced", "mfrac", "mglyph", "mi", "mlabeledtr", "mmultiscripts", "mn", "mo", "mover", "mpadded", "mphantom", "mroot", "mrow", "ms", "mspace", "msqrt", "mstyle", "msub", "msup", "msubsup", "mtable", "mtd", "mtext", "mtr", "munder", "munderover", "mprescripts"]); + mathMlDisallowed = freeze(["maction", "maligngroup", "malignmark", "mlongdiv", "mscarries", "mscarry", "msgroup", "mstack", "msline", "msrow", "semantics", "annotation", "annotation-xml", "mprescripts", "none"]); + text = freeze(["#text"]); + html = freeze(["accept", "action", "align", "alt", "autocapitalize", "autocomplete", "autopictureinpicture", "autoplay", "background", "bgcolor", "border", "capture", "cellpadding", "cellspacing", "checked", "cite", "class", "clear", "color", "cols", "colspan", "controls", "controlslist", "coords", "crossorigin", "datetime", "decoding", "default", "dir", "disabled", "disablepictureinpicture", "disableremoteplayback", "download", "draggable", "enctype", "enterkeyhint", "face", "for", "headers", "height", "hidden", "high", "href", "hreflang", "id", "inputmode", "integrity", "ismap", "kind", "label", "lang", "list", "loading", "loop", "low", "max", "maxlength", "media", "method", "min", "minlength", "multiple", "muted", "name", "nonce", "noshade", "novalidate", "nowrap", "open", "optimum", "pattern", "placeholder", "playsinline", "poster", "preload", "pubdate", "radiogroup", "readonly", "rel", "required", "rev", "reversed", "role", "rows", "rowspan", "spellcheck", "scope", "selected", "shape", "size", "sizes", "span", "srclang", "start", "src", "srcset", "step", "style", "summary", "tabindex", "title", "translate", "type", "usemap", "valign", "value", "width", "xmlns", "slot"]); + svg = freeze(["accent-height", "accumulate", "additive", "alignment-baseline", "ascent", "attributename", "attributetype", "azimuth", "basefrequency", "baseline-shift", "begin", "bias", "by", "class", "clip", "clippathunits", "clip-path", "clip-rule", "color", "color-interpolation", "color-interpolation-filters", "color-profile", "color-rendering", "cx", "cy", "d", "dx", "dy", "diffuseconstant", "direction", "display", "divisor", "dur", "edgemode", "elevation", "end", "fill", "fill-opacity", "fill-rule", "filter", "filterunits", "flood-color", "flood-opacity", "font-family", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-variant", "font-weight", "fx", "fy", "g1", "g2", "glyph-name", "glyphref", "gradientunits", "gradienttransform", "height", "href", "id", "image-rendering", "in", "in2", "k", "k1", "k2", "k3", "k4", "kerning", "keypoints", "keysplines", "keytimes", "lang", "lengthadjust", "letter-spacing", "kernelmatrix", "kernelunitlength", "lighting-color", "local", "marker-end", "marker-mid", "marker-start", "markerheight", "markerunits", "markerwidth", "maskcontentunits", "maskunits", "max", "mask", "media", "method", "mode", "min", "name", "numoctaves", "offset", "operator", "opacity", "order", "orient", "orientation", "origin", "overflow", "paint-order", "path", "pathlength", "patterncontentunits", "patterntransform", "patternunits", "points", "preservealpha", "preserveaspectratio", "primitiveunits", "r", "rx", "ry", "radius", "refx", "refy", "repeatcount", "repeatdur", "restart", "result", "rotate", "scale", "seed", "shape-rendering", "specularconstant", "specularexponent", "spreadmethod", "startoffset", "stddeviation", "stitchtiles", "stop-color", "stop-opacity", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke", "stroke-width", "style", "surfacescale", "systemlanguage", "tabindex", "targetx", "targety", "transform", "transform-origin", "text-anchor", "text-decoration", "text-rendering", "textlength", "type", "u1", "u2", "unicode", "values", "viewbox", "visibility", "version", "vert-adv-y", "vert-origin-x", "vert-origin-y", "width", "word-spacing", "wrap", "writing-mode", "xchannelselector", "ychannelselector", "x", "x1", "x2", "xmlns", "y", "y1", "y2", "z", "zoomandpan"]); + mathMl = freeze(["accent", "accentunder", "align", "bevelled", "close", "columnsalign", "columnlines", "columnspan", "denomalign", "depth", "dir", "display", "displaystyle", "encoding", "fence", "frame", "height", "href", "id", "largeop", "length", "linethickness", "lspace", "lquote", "mathbackground", "mathcolor", "mathsize", "mathvariant", "maxsize", "minsize", "movablelimits", "notation", "numalign", "open", "rowalign", "rowlines", "rowspacing", "rowspan", "rspace", "rquote", "scriptlevel", "scriptminsize", "scriptsizemultiplier", "selection", "separator", "separators", "stretchy", "subscriptshift", "supscriptshift", "symmetric", "voffset", "width", "xmlns"]); + xml = freeze(["xlink:href", "xml:id", "xlink:title", "xml:space", "xmlns:xlink"]); + MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); + ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm); + TMPLIT_EXPR = seal(/\${[\w\W]*}/gm); + DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/); + ARIA_ATTR = seal(/^aria-[\-\w]+$/); + IS_ALLOWED_URI = seal( + /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i + // eslint-disable-line no-useless-escape + ); + IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i); + ATTR_WHITESPACE = seal( + /[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g + // eslint-disable-line no-control-regex + ); + DOCTYPE_NAME = seal(/^html$/i); + EXPRESSIONS = /* @__PURE__ */ Object.freeze({ + __proto__: null, + MUSTACHE_EXPR, + ERB_EXPR, + TMPLIT_EXPR, + DATA_ATTR, + ARIA_ATTR, + IS_ALLOWED_URI, + IS_SCRIPT_OR_DATA, + ATTR_WHITESPACE, + DOCTYPE_NAME + }); + getGlobal = () => typeof window === "undefined" ? null : window; + _createTrustedTypesPolicy = function _createTrustedTypesPolicy2(trustedTypes, purifyHostElement) { + if (typeof trustedTypes !== "object" || typeof trustedTypes.createPolicy !== "function") { + return null; + } + let suffix = null; + const ATTR_NAME = "data-tt-policy-suffix"; + if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) { + suffix = purifyHostElement.getAttribute(ATTR_NAME); + } + const policyName = "dompurify" + (suffix ? "#" + suffix : ""); + try { + return trustedTypes.createPolicy(policyName, { + createHTML(html2) { + return html2; + }, + createScriptURL(scriptUrl) { + return scriptUrl; + } + }); + } catch (_) { + console.warn("TrustedTypes policy " + policyName + " could not be created."); + return null; + } + }; + purify = createDOMPurify(); + version = purify.version; + isSupported = purify.isSupported; + sanitize = purify.sanitize; + setConfig = purify.setConfig; + clearConfig = purify.clearConfig; + isValidAttribute = purify.isValidAttribute; + addHook = purify.addHook; + removeHook = purify.removeHook; + removeHooks = purify.removeHooks; + removeAllHooks = purify.removeAllHooks; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/network.js +function matchesScheme(target, scheme) { + if (URI.isUri(target)) { + return equalsIgnoreCase(target.scheme, scheme); + } else { + return startsWithIgnoreCase(target, scheme + ":"); + } +} +function matchesSomeScheme(target, ...schemes) { + return schemes.some((scheme) => matchesScheme(target, scheme)); +} +var Schemas, connectionTokenQueryName, RemoteAuthoritiesImpl, RemoteAuthorities, VSCODE_AUTHORITY, FileAccessImpl, FileAccess, COI; +var init_network = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/network.js"() { + init_errors(); + init_platform(); + init_strings(); + init_uri(); + init_path(); + (function(Schemas2) { + Schemas2.inMemory = "inmemory"; + Schemas2.vscode = "vscode"; + Schemas2.internal = "private"; + Schemas2.walkThrough = "walkThrough"; + Schemas2.walkThroughSnippet = "walkThroughSnippet"; + Schemas2.http = "http"; + Schemas2.https = "https"; + Schemas2.file = "file"; + Schemas2.mailto = "mailto"; + Schemas2.untitled = "untitled"; + Schemas2.data = "data"; + Schemas2.command = "command"; + Schemas2.vscodeRemote = "vscode-remote"; + Schemas2.vscodeRemoteResource = "vscode-remote-resource"; + Schemas2.vscodeManagedRemoteResource = "vscode-managed-remote-resource"; + Schemas2.vscodeUserData = "vscode-userdata"; + Schemas2.vscodeCustomEditor = "vscode-custom-editor"; + Schemas2.vscodeNotebookCell = "vscode-notebook-cell"; + Schemas2.vscodeNotebookCellMetadata = "vscode-notebook-cell-metadata"; + Schemas2.vscodeNotebookCellOutput = "vscode-notebook-cell-output"; + Schemas2.vscodeInteractiveInput = "vscode-interactive-input"; + Schemas2.vscodeSettings = "vscode-settings"; + Schemas2.vscodeWorkspaceTrust = "vscode-workspace-trust"; + Schemas2.vscodeTerminal = "vscode-terminal"; + Schemas2.vscodeChatCodeBlock = "vscode-chat-code-block"; + Schemas2.vscodeCopilotBackingChatCodeBlock = "vscode-copilot-chat-code-block"; + Schemas2.vscodeChatCodeCompareBlock = "vscode-chat-code-compare-block"; + Schemas2.vscodeChatSesssion = "vscode-chat-editor"; + Schemas2.webviewPanel = "webview-panel"; + Schemas2.vscodeWebview = "vscode-webview"; + Schemas2.extension = "extension"; + Schemas2.vscodeFileResource = "vscode-file"; + Schemas2.tmp = "tmp"; + Schemas2.vsls = "vsls"; + Schemas2.vscodeSourceControl = "vscode-scm"; + Schemas2.commentsInput = "comment"; + Schemas2.codeSetting = "code-setting"; + })(Schemas || (Schemas = {})); + connectionTokenQueryName = "tkn"; + RemoteAuthoritiesImpl = class { + constructor() { + this._hosts = /* @__PURE__ */ Object.create(null); + this._ports = /* @__PURE__ */ Object.create(null); + this._connectionTokens = /* @__PURE__ */ Object.create(null); + this._preferredWebSchema = "http"; + this._delegate = null; + this._serverRootPath = "/"; + } + setPreferredWebSchema(schema) { + this._preferredWebSchema = schema; + } + get _remoteResourcesPath() { + return posix.join(this._serverRootPath, Schemas.vscodeRemoteResource); + } + rewrite(uri) { + if (this._delegate) { + try { + return this._delegate(uri); + } catch (err) { + onUnexpectedError(err); + return uri; + } + } + const authority = uri.authority; + let host = this._hosts[authority]; + if (host && host.indexOf(":") !== -1 && host.indexOf("[") === -1) { + host = `[${host}]`; + } + const port = this._ports[authority]; + const connectionToken = this._connectionTokens[authority]; + let query = `path=${encodeURIComponent(uri.path)}`; + if (typeof connectionToken === "string") { + query += `&${connectionTokenQueryName}=${encodeURIComponent(connectionToken)}`; + } + return URI.from({ + scheme: isWeb ? this._preferredWebSchema : Schemas.vscodeRemoteResource, + authority: `${host}:${port}`, + path: this._remoteResourcesPath, + query + }); + } + }; + RemoteAuthorities = new RemoteAuthoritiesImpl(); + VSCODE_AUTHORITY = "vscode-app"; + FileAccessImpl = class _FileAccessImpl { + /** + * Returns a URI to use in contexts where the browser is responsible + * for loading (e.g. fetch()) or when used within the DOM. + * + * **Note:** use `dom.ts#asCSSUrl` whenever the URL is to be used in CSS context. + */ + uriToBrowserUri(uri) { + if (uri.scheme === Schemas.vscodeRemote) { + return RemoteAuthorities.rewrite(uri); + } + if ( + // ...only ever for `file` resources + uri.scheme === Schemas.file && // ...and we run in native environments + (isNative || // ...or web worker extensions on desktop + webWorkerOrigin === `${Schemas.vscodeFileResource}://${_FileAccessImpl.FALLBACK_AUTHORITY}`) + ) { + return uri.with({ + scheme: Schemas.vscodeFileResource, + // We need to provide an authority here so that it can serve + // as origin for network and loading matters in chromium. + // If the URI is not coming with an authority already, we + // add our own + authority: uri.authority || _FileAccessImpl.FALLBACK_AUTHORITY, + query: null, + fragment: null + }); + } + return uri; + } + }; + FileAccessImpl.FALLBACK_AUTHORITY = VSCODE_AUTHORITY; + FileAccess = new FileAccessImpl(); + (function(COI2) { + const coiHeaders = /* @__PURE__ */ new Map([ + ["1", { "Cross-Origin-Opener-Policy": "same-origin" }], + ["2", { "Cross-Origin-Embedder-Policy": "require-corp" }], + ["3", { "Cross-Origin-Opener-Policy": "same-origin", "Cross-Origin-Embedder-Policy": "require-corp" }] + ]); + COI2.CoopAndCoep = Object.freeze(coiHeaders.get("3")); + const coiSearchParamName = "vscode-coi"; + function getHeadersFromQuery(url) { + let params; + if (typeof url === "string") { + params = new URL(url).searchParams; + } else if (url instanceof URL) { + params = url.searchParams; + } else if (URI.isUri(url)) { + params = new URL(url.toString(true)).searchParams; + } + const value = params === null || params === void 0 ? void 0 : params.get(coiSearchParamName); + if (!value) { + return void 0; + } + return coiHeaders.get(value); + } + COI2.getHeadersFromQuery = getHeadersFromQuery; + function addSearchParam(urlOrSearch, coop, coep) { + if (!globalThis.crossOriginIsolated) { + return; + } + const value = coop && coep ? "3" : coep ? "2" : "1"; + if (urlOrSearch instanceof URLSearchParams) { + urlOrSearch.set(coiSearchParamName, value); + } else { + urlOrSearch[coiSearchParamName] = value; + } + } + COI2.addSearchParam = addSearchParam; + })(COI || (COI = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/hash.js +function hash(obj) { + return doHash(obj, 0); +} +function doHash(obj, hashVal) { + switch (typeof obj) { + case "object": + if (obj === null) { + return numberHash(349, hashVal); + } else if (Array.isArray(obj)) { + return arrayHash(obj, hashVal); + } + return objectHash(obj, hashVal); + case "string": + return stringHash(obj, hashVal); + case "boolean": + return booleanHash(obj, hashVal); + case "number": + return numberHash(obj, hashVal); + case "undefined": + return numberHash(937, hashVal); + default: + return numberHash(617, hashVal); + } +} +function numberHash(val, initialHashVal) { + return (initialHashVal << 5) - initialHashVal + val | 0; +} +function booleanHash(b, initialHashVal) { + return numberHash(b ? 433 : 863, initialHashVal); +} +function stringHash(s, hashVal) { + hashVal = numberHash(149417, hashVal); + for (let i = 0, length = s.length; i < length; i++) { + hashVal = numberHash(s.charCodeAt(i), hashVal); + } + return hashVal; +} +function arrayHash(arr, initialHashVal) { + initialHashVal = numberHash(104579, initialHashVal); + return arr.reduce((hashVal, item) => doHash(item, hashVal), initialHashVal); +} +function objectHash(obj, initialHashVal) { + initialHashVal = numberHash(181387, initialHashVal); + return Object.keys(obj).sort().reduce((hashVal, key) => { + hashVal = stringHash(key, hashVal); + return doHash(obj[key], hashVal); + }, initialHashVal); +} +function leftRotate(value, bits, totalBits = 32) { + const delta = totalBits - bits; + const mask = ~((1 << delta) - 1); + return (value << bits | (mask & value) >>> delta) >>> 0; +} +function fill(dest, index = 0, count = dest.byteLength, value = 0) { + for (let i = 0; i < count; i++) { + dest[index + i] = value; + } +} +function leftPad(value, length, char = "0") { + while (value.length < length) { + value = char + value; + } + return value; +} +function toHexString(bufferOrValue, bitsize = 32) { + if (bufferOrValue instanceof ArrayBuffer) { + return Array.from(new Uint8Array(bufferOrValue)).map((b) => b.toString(16).padStart(2, "0")).join(""); + } + return leftPad((bufferOrValue >>> 0).toString(16), bitsize / 4); +} +var StringSHA1; +var init_hash = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/hash.js"() { + init_strings(); + StringSHA1 = class _StringSHA1 { + constructor() { + this._h0 = 1732584193; + this._h1 = 4023233417; + this._h2 = 2562383102; + this._h3 = 271733878; + this._h4 = 3285377520; + this._buff = new Uint8Array( + 64 + 3 + /* to fit any utf-8 */ + ); + this._buffDV = new DataView(this._buff.buffer); + this._buffLen = 0; + this._totalLen = 0; + this._leftoverHighSurrogate = 0; + this._finished = false; + } + update(str) { + const strLen = str.length; + if (strLen === 0) { + return; + } + const buff = this._buff; + let buffLen = this._buffLen; + let leftoverHighSurrogate = this._leftoverHighSurrogate; + let charCode; + let offset; + if (leftoverHighSurrogate !== 0) { + charCode = leftoverHighSurrogate; + offset = -1; + leftoverHighSurrogate = 0; + } else { + charCode = str.charCodeAt(0); + offset = 0; + } + while (true) { + let codePoint = charCode; + if (isHighSurrogate(charCode)) { + if (offset + 1 < strLen) { + const nextCharCode = str.charCodeAt(offset + 1); + if (isLowSurrogate(nextCharCode)) { + offset++; + codePoint = computeCodePoint(charCode, nextCharCode); + } else { + codePoint = 65533; + } + } else { + leftoverHighSurrogate = charCode; + break; + } + } else if (isLowSurrogate(charCode)) { + codePoint = 65533; + } + buffLen = this._push(buff, buffLen, codePoint); + offset++; + if (offset < strLen) { + charCode = str.charCodeAt(offset); + } else { + break; + } + } + this._buffLen = buffLen; + this._leftoverHighSurrogate = leftoverHighSurrogate; + } + _push(buff, buffLen, codePoint) { + if (codePoint < 128) { + buff[buffLen++] = codePoint; + } else if (codePoint < 2048) { + buff[buffLen++] = 192 | (codePoint & 1984) >>> 6; + buff[buffLen++] = 128 | (codePoint & 63) >>> 0; + } else if (codePoint < 65536) { + buff[buffLen++] = 224 | (codePoint & 61440) >>> 12; + buff[buffLen++] = 128 | (codePoint & 4032) >>> 6; + buff[buffLen++] = 128 | (codePoint & 63) >>> 0; + } else { + buff[buffLen++] = 240 | (codePoint & 1835008) >>> 18; + buff[buffLen++] = 128 | (codePoint & 258048) >>> 12; + buff[buffLen++] = 128 | (codePoint & 4032) >>> 6; + buff[buffLen++] = 128 | (codePoint & 63) >>> 0; + } + if (buffLen >= 64) { + this._step(); + buffLen -= 64; + this._totalLen += 64; + buff[0] = buff[64 + 0]; + buff[1] = buff[64 + 1]; + buff[2] = buff[64 + 2]; + } + return buffLen; + } + digest() { + if (!this._finished) { + this._finished = true; + if (this._leftoverHighSurrogate) { + this._leftoverHighSurrogate = 0; + this._buffLen = this._push( + this._buff, + this._buffLen, + 65533 + /* SHA1Constant.UNICODE_REPLACEMENT */ + ); + } + this._totalLen += this._buffLen; + this._wrapUp(); + } + return toHexString(this._h0) + toHexString(this._h1) + toHexString(this._h2) + toHexString(this._h3) + toHexString(this._h4); + } + _wrapUp() { + this._buff[this._buffLen++] = 128; + fill(this._buff, this._buffLen); + if (this._buffLen > 56) { + this._step(); + fill(this._buff); + } + const ml = 8 * this._totalLen; + this._buffDV.setUint32(56, Math.floor(ml / 4294967296), false); + this._buffDV.setUint32(60, ml % 4294967296, false); + this._step(); + } + _step() { + const bigBlock32 = _StringSHA1._bigBlock32; + const data = this._buffDV; + for (let j = 0; j < 64; j += 4) { + bigBlock32.setUint32(j, data.getUint32(j, false), false); + } + for (let j = 64; j < 320; j += 4) { + bigBlock32.setUint32(j, leftRotate(bigBlock32.getUint32(j - 12, false) ^ bigBlock32.getUint32(j - 32, false) ^ bigBlock32.getUint32(j - 56, false) ^ bigBlock32.getUint32(j - 64, false), 1), false); + } + let a3 = this._h0; + let b = this._h1; + let c = this._h2; + let d = this._h3; + let e = this._h4; + let f3, k; + let temp; + for (let j = 0; j < 80; j++) { + if (j < 20) { + f3 = b & c | ~b & d; + k = 1518500249; + } else if (j < 40) { + f3 = b ^ c ^ d; + k = 1859775393; + } else if (j < 60) { + f3 = b & c | b & d | c & d; + k = 2400959708; + } else { + f3 = b ^ c ^ d; + k = 3395469782; + } + temp = leftRotate(a3, 5) + f3 + e + k + bigBlock32.getUint32(j * 4, false) & 4294967295; + e = d; + d = c; + c = leftRotate(b, 30); + b = a3; + a3 = temp; + } + this._h0 = this._h0 + a3 & 4294967295; + this._h1 = this._h1 + b & 4294967295; + this._h2 = this._h2 + c & 4294967295; + this._h3 = this._h3 + d & 4294967295; + this._h4 = this._h4 + e & 4294967295; + } + }; + StringSHA1._bigBlock32 = new DataView(new ArrayBuffer(320)); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/dom.js +function clearNode(node) { + while (node.firstChild) { + node.firstChild.remove(); + } +} +function addDisposableListener(node, type, handler, useCaptureOrOptions) { + return new DomListener(node, type, handler, useCaptureOrOptions); +} +function _wrapAsStandardMouseEvent(targetWindow, handler) { + return function(e) { + return handler(new StandardMouseEvent(targetWindow, e)); + }; +} +function _wrapAsStandardKeyboardEvent(handler) { + return function(e) { + return handler(new StandardKeyboardEvent(e)); + }; +} +function addDisposableGenericMouseDownListener(node, handler, useCapture) { + return addDisposableListener(node, isIOS && BrowserFeatures.pointerEvents ? EventType.POINTER_DOWN : EventType.MOUSE_DOWN, handler, useCapture); +} +function runWhenWindowIdle(targetWindow, callback, timeout2) { + return _runWhenIdle(targetWindow, callback, timeout2); +} +function getComputedStyle(el) { + return getWindow(el).getComputedStyle(el, null); +} +function getClientArea(element, fallback2) { + const elWindow = getWindow(element); + const elDocument = elWindow.document; + if (element !== elDocument.body) { + return new Dimension(element.clientWidth, element.clientHeight); + } + if (isIOS && (elWindow === null || elWindow === void 0 ? void 0 : elWindow.visualViewport)) { + return new Dimension(elWindow.visualViewport.width, elWindow.visualViewport.height); + } + if ((elWindow === null || elWindow === void 0 ? void 0 : elWindow.innerWidth) && elWindow.innerHeight) { + return new Dimension(elWindow.innerWidth, elWindow.innerHeight); + } + if (elDocument.body && elDocument.body.clientWidth && elDocument.body.clientHeight) { + return new Dimension(elDocument.body.clientWidth, elDocument.body.clientHeight); + } + if (elDocument.documentElement && elDocument.documentElement.clientWidth && elDocument.documentElement.clientHeight) { + return new Dimension(elDocument.documentElement.clientWidth, elDocument.documentElement.clientHeight); + } + if (fallback2) { + return getClientArea(fallback2); + } + throw new Error("Unable to figure out browser width and height"); +} +function getTopLeftOffset(element) { + let offsetParent = element.offsetParent; + let top = element.offsetTop; + let left = element.offsetLeft; + while ((element = element.parentNode) !== null && element !== element.ownerDocument.body && element !== element.ownerDocument.documentElement) { + top -= element.scrollTop; + const c = isShadowRoot(element) ? null : getComputedStyle(element); + if (c) { + left -= c.direction !== "rtl" ? element.scrollLeft : -element.scrollLeft; + } + if (element === offsetParent) { + left += SizeUtils.getBorderLeftWidth(element); + top += SizeUtils.getBorderTopWidth(element); + top += element.offsetTop; + left += element.offsetLeft; + offsetParent = element.offsetParent; + } + } + return { + left, + top + }; +} +function size(element, width2, height) { + if (typeof width2 === "number") { + element.style.width = `${width2}px`; + } + if (typeof height === "number") { + element.style.height = `${height}px`; + } +} +function getDomNodePagePosition(domNode) { + const bb = domNode.getBoundingClientRect(); + const window2 = getWindow(domNode); + return { + left: bb.left + window2.scrollX, + top: bb.top + window2.scrollY, + width: bb.width, + height: bb.height + }; +} +function getDomNodeZoomLevel(domNode) { + let testElement = domNode; + let zoom = 1; + do { + const elementZoomLevel = getComputedStyle(testElement).zoom; + if (elementZoomLevel !== null && elementZoomLevel !== void 0 && elementZoomLevel !== "1") { + zoom *= elementZoomLevel; + } + testElement = testElement.parentElement; + } while (testElement !== null && testElement !== testElement.ownerDocument.documentElement); + return zoom; +} +function getTotalWidth(element) { + const margin = SizeUtils.getMarginLeft(element) + SizeUtils.getMarginRight(element); + return element.offsetWidth + margin; +} +function getContentWidth(element) { + const border = SizeUtils.getBorderLeftWidth(element) + SizeUtils.getBorderRightWidth(element); + const padding = SizeUtils.getPaddingLeft(element) + SizeUtils.getPaddingRight(element); + return element.offsetWidth - border - padding; +} +function getContentHeight(element) { + const border = SizeUtils.getBorderTopWidth(element) + SizeUtils.getBorderBottomWidth(element); + const padding = SizeUtils.getPaddingTop(element) + SizeUtils.getPaddingBottom(element); + return element.offsetHeight - border - padding; +} +function getTotalHeight(element) { + const margin = SizeUtils.getMarginTop(element) + SizeUtils.getMarginBottom(element); + return element.offsetHeight + margin; +} +function isAncestor(testChild, testAncestor) { + return Boolean(testAncestor === null || testAncestor === void 0 ? void 0 : testAncestor.contains(testChild)); +} +function findParentWithClass(node, clazz, stopAtClazzOrNode) { + while (node && node.nodeType === node.ELEMENT_NODE) { + if (node.classList.contains(clazz)) { + return node; + } + if (stopAtClazzOrNode) { + if (typeof stopAtClazzOrNode === "string") { + if (node.classList.contains(stopAtClazzOrNode)) { + return null; + } + } else { + if (node === stopAtClazzOrNode) { + return null; + } + } + } + node = node.parentNode; + } + return null; +} +function hasParentWithClass(node, clazz, stopAtClazzOrNode) { + return !!findParentWithClass(node, clazz, stopAtClazzOrNode); +} +function isShadowRoot(node) { + return node && !!node.host && !!node.mode; +} +function isInShadowDOM(domNode) { + return !!getShadowRoot(domNode); +} +function getShadowRoot(domNode) { + var _a10; + while (domNode.parentNode) { + if (domNode === ((_a10 = domNode.ownerDocument) === null || _a10 === void 0 ? void 0 : _a10.body)) { + return null; + } + domNode = domNode.parentNode; + } + return isShadowRoot(domNode) ? domNode : null; +} +function getActiveElement() { + let result = getActiveDocument().activeElement; + while (result === null || result === void 0 ? void 0 : result.shadowRoot) { + result = result.shadowRoot.activeElement; + } + return result; +} +function isActiveElement(element) { + return getActiveElement() === element; +} +function isAncestorOfActiveElement(ancestor) { + return isAncestor(getActiveElement(), ancestor); +} +function getActiveDocument() { + var _a10; + if (getWindowsCount() <= 1) { + return mainWindow.document; + } + const documents = Array.from(getWindows()).map(({ window: window2 }) => window2.document); + return (_a10 = documents.find((doc) => doc.hasFocus())) !== null && _a10 !== void 0 ? _a10 : mainWindow.document; +} +function getActiveWindow() { + var _a10, _b4; + const document2 = getActiveDocument(); + return (_b4 = (_a10 = document2.defaultView) === null || _a10 === void 0 ? void 0 : _a10.window) !== null && _b4 !== void 0 ? _b4 : mainWindow; +} +function createStyleSheet2() { + return new WrappedStyleElement(); +} +function createStyleSheet(container = mainWindow.document.head, beforeAppend, disposableStore) { + const style = document.createElement("style"); + style.type = "text/css"; + style.media = "screen"; + beforeAppend === null || beforeAppend === void 0 ? void 0 : beforeAppend(style); + container.appendChild(style); + if (disposableStore) { + disposableStore.add(toDisposable(() => container.removeChild(style))); + } + if (container === mainWindow.document.head) { + const globalStylesheetClones = /* @__PURE__ */ new Set(); + globalStylesheets.set(style, globalStylesheetClones); + for (const { window: targetWindow, disposables } of getWindows()) { + if (targetWindow === mainWindow) { + continue; + } + const cloneDisposable = disposables.add(cloneGlobalStyleSheet(style, globalStylesheetClones, targetWindow)); + disposableStore === null || disposableStore === void 0 ? void 0 : disposableStore.add(cloneDisposable); + } + } + return style; +} +function cloneGlobalStyleSheet(globalStylesheet, globalStylesheetClones, targetWindow) { + var _a10, _b4; + const disposables = new DisposableStore(); + const clone2 = globalStylesheet.cloneNode(true); + targetWindow.document.head.appendChild(clone2); + disposables.add(toDisposable(() => targetWindow.document.head.removeChild(clone2))); + for (const rule of getDynamicStyleSheetRules(globalStylesheet)) { + (_a10 = clone2.sheet) === null || _a10 === void 0 ? void 0 : _a10.insertRule(rule.cssText, (_b4 = clone2.sheet) === null || _b4 === void 0 ? void 0 : _b4.cssRules.length); + } + disposables.add(sharedMutationObserver.observe(globalStylesheet, disposables, { childList: true })(() => { + clone2.textContent = globalStylesheet.textContent; + })); + globalStylesheetClones.add(clone2); + disposables.add(toDisposable(() => globalStylesheetClones.delete(clone2))); + return disposables; +} +function getSharedStyleSheet() { + if (!_sharedStyleSheet) { + _sharedStyleSheet = createStyleSheet(); + } + return _sharedStyleSheet; +} +function getDynamicStyleSheetRules(style) { + var _a10, _b4; + if ((_a10 = style === null || style === void 0 ? void 0 : style.sheet) === null || _a10 === void 0 ? void 0 : _a10.rules) { + return style.sheet.rules; + } + if ((_b4 = style === null || style === void 0 ? void 0 : style.sheet) === null || _b4 === void 0 ? void 0 : _b4.cssRules) { + return style.sheet.cssRules; + } + return []; +} +function createCSSRule(selector, cssText, style = getSharedStyleSheet()) { + var _a10, _b4; + if (!style || !cssText) { + return; + } + (_a10 = style.sheet) === null || _a10 === void 0 ? void 0 : _a10.insertRule(`${selector} {${cssText}}`, 0); + for (const clonedGlobalStylesheet of (_b4 = globalStylesheets.get(style)) !== null && _b4 !== void 0 ? _b4 : []) { + createCSSRule(selector, cssText, clonedGlobalStylesheet); + } +} +function removeCSSRulesContainingSelector(ruleName, style = getSharedStyleSheet()) { + var _a10, _b4; + if (!style) { + return; + } + const rules = getDynamicStyleSheetRules(style); + const toDelete = []; + for (let i = 0; i < rules.length; i++) { + const rule = rules[i]; + if (isCSSStyleRule(rule) && rule.selectorText.indexOf(ruleName) !== -1) { + toDelete.push(i); + } + } + for (let i = toDelete.length - 1; i >= 0; i--) { + (_a10 = style.sheet) === null || _a10 === void 0 ? void 0 : _a10.deleteRule(toDelete[i]); + } + for (const clonedGlobalStylesheet of (_b4 = globalStylesheets.get(style)) !== null && _b4 !== void 0 ? _b4 : []) { + removeCSSRulesContainingSelector(ruleName, clonedGlobalStylesheet); + } +} +function isCSSStyleRule(rule) { + return typeof rule.selectorText === "string"; +} +function isHTMLElement(e) { + return e instanceof HTMLElement || e instanceof getWindow(e).HTMLElement; +} +function isHTMLAnchorElement(e) { + return e instanceof HTMLAnchorElement || e instanceof getWindow(e).HTMLAnchorElement; +} +function isMouseEvent(e) { + return e instanceof MouseEvent || e instanceof getWindow(e).MouseEvent; +} +function isKeyboardEvent(e) { + return e instanceof KeyboardEvent || e instanceof getWindow(e).KeyboardEvent; +} +function isEventLike(obj) { + const candidate = obj; + return !!(candidate && typeof candidate.preventDefault === "function" && typeof candidate.stopPropagation === "function"); +} +function saveParentsScrollTop(node) { + const r = []; + for (let i = 0; node && node.nodeType === node.ELEMENT_NODE; i++) { + r[i] = node.scrollTop; + node = node.parentNode; + } + return r; +} +function restoreParentsScrollTop(node, state) { + for (let i = 0; node && node.nodeType === node.ELEMENT_NODE; i++) { + if (node.scrollTop !== state[i]) { + node.scrollTop = state[i]; + } + node = node.parentNode; + } +} +function trackFocus(element) { + return new FocusTracker(element); +} +function after(sibling, child) { + sibling.after(child); + return child; +} +function append(parent, ...children) { + parent.append(...children); + if (children.length === 1 && typeof children[0] !== "string") { + return children[0]; + } +} +function prepend(parent, child) { + parent.insertBefore(child, parent.firstChild); + return child; +} +function reset(parent, ...children) { + parent.innerText = ""; + append(parent, ...children); +} +function _$(namespace, description, attrs, ...children) { + const match2 = SELECTOR_REGEX.exec(description); + if (!match2) { + throw new Error("Bad use of emmet"); + } + const tagName = match2[1] || "div"; + let result; + if (namespace !== Namespace.HTML) { + result = document.createElementNS(namespace, tagName); + } else { + result = document.createElement(tagName); + } + if (match2[3]) { + result.id = match2[3]; + } + if (match2[4]) { + result.className = match2[4].replace(/\./g, " ").trim(); + } + if (attrs) { + Object.entries(attrs).forEach(([name, value]) => { + if (typeof value === "undefined") { + return; + } + if (/^on\w+$/.test(name)) { + result[name] = value; + } else if (name === "selected") { + if (value) { + result.setAttribute(name, "true"); + } + } else { + result.setAttribute(name, value); + } + }); + } + result.append(...children); + return result; +} +function $(description, attrs, ...children) { + return _$(Namespace.HTML, description, attrs, ...children); +} +function setVisibility(visible, ...elements) { + if (visible) { + show(...elements); + } else { + hide(...elements); + } +} +function show(...elements) { + for (const element of elements) { + element.style.display = ""; + element.removeAttribute("aria-hidden"); + } +} +function hide(...elements) { + for (const element of elements) { + element.style.display = "none"; + element.setAttribute("aria-hidden", "true"); + } +} +function computeScreenAwareSize(window2, cssPx) { + const screenPx = window2.devicePixelRatio * cssPx; + return Math.max(1, Math.floor(screenPx)) / window2.devicePixelRatio; +} +function windowOpenNoOpener(url) { + mainWindow.open(url, "_blank", "noopener"); +} +function animate(targetWindow, fn) { + const step = () => { + fn(); + stepDisposable = scheduleAtNextAnimationFrame(targetWindow, step); + }; + let stepDisposable = scheduleAtNextAnimationFrame(targetWindow, step); + return toDisposable(() => stepDisposable.dispose()); +} +function asCSSUrl(uri) { + if (!uri) { + return `url('')`; + } + return `url('${FileAccess.uriToBrowserUri(uri).toString(true).replace(/'/g, "%27")}')`; +} +function asCSSPropertyValue(value) { + return `'${value.replace(/'/g, "%27")}'`; +} +function asCssValueWithDefault(cssPropertyValue, dflt) { + if (cssPropertyValue !== void 0) { + const variableMatch = cssPropertyValue.match(/^\s*var\((.+)\)$/); + if (variableMatch) { + const varArguments = variableMatch[1].split(",", 2); + if (varArguments.length === 2) { + dflt = asCssValueWithDefault(varArguments[1].trim(), dflt); + } + return `var(${varArguments[0]}, ${dflt})`; + } + return cssPropertyValue; + } + return dflt; +} +function hookDomPurifyHrefAndSrcSanitizer(allowedProtocols, allowDataImages = false) { + const anchor = document.createElement("a"); + addHook("afterSanitizeAttributes", (node) => { + for (const attr of ["href", "src"]) { + if (node.hasAttribute(attr)) { + const attrValue = node.getAttribute(attr); + if (attr === "href" && attrValue.startsWith("#")) { + continue; + } + anchor.href = attrValue; + if (!allowedProtocols.includes(anchor.protocol.replace(/:$/, ""))) { + if (allowDataImages && attr === "src" && anchor.href.startsWith("data:")) { + continue; + } + node.removeAttribute(attr); + } + } + } + }); + return toDisposable(() => { + removeHook("afterSanitizeAttributes"); + }); +} +function h(tag, ...args) { + let attributes; + let children; + if (Array.isArray(args[0])) { + attributes = {}; + children = args[0]; + } else { + attributes = args[0] || {}; + children = args[1]; + } + const match2 = H_REGEX.exec(tag); + if (!match2 || !match2.groups) { + throw new Error("Bad use of h"); + } + const tagName = match2.groups["tag"] || "div"; + const el = document.createElement(tagName); + if (match2.groups["id"]) { + el.id = match2.groups["id"]; + } + const classNames = []; + if (match2.groups["class"]) { + for (const className of match2.groups["class"].split(".")) { + if (className !== "") { + classNames.push(className); + } + } + } + if (attributes.className !== void 0) { + for (const className of attributes.className.split(".")) { + if (className !== "") { + classNames.push(className); + } + } + } + if (classNames.length > 0) { + el.className = classNames.join(" "); + } + const result = {}; + if (match2.groups["name"]) { + result[match2.groups["name"]] = el; + } + if (children) { + for (const c of children) { + if (isHTMLElement(c)) { + el.appendChild(c); + } else if (typeof c === "string") { + el.append(c); + } else if ("root" in c) { + Object.assign(result, c); + el.appendChild(c.root); + } + } + } + for (const [key, value] of Object.entries(attributes)) { + if (key === "className") { + continue; + } else if (key === "style") { + for (const [cssKey, cssValue] of Object.entries(value)) { + el.style.setProperty(camelCaseToHyphenCase(cssKey), typeof cssValue === "number" ? cssValue + "px" : "" + cssValue); + } + } else if (key === "tabIndex") { + el.tabIndex = value; + } else { + el.setAttribute(camelCaseToHyphenCase(key), value.toString()); + } + } + result["root"] = el; + return result; +} +function camelCaseToHyphenCase(str) { + return str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(); +} +var registerWindow, getWindow, getDocument, getWindows, getWindowsCount, getWindowId, getWindowById, hasWindow, onDidRegisterWindow, onWillUnregisterWindow, onDidUnregisterWindow, DomListener, addStandardDisposableListener, addStandardDisposableGenericMouseDownListener, WindowIdleValue, runAtThisOrScheduleAtNextAnimationFrame, scheduleAtNextAnimationFrame, WindowIntervalTimer, AnimationFrameQueueItem, SizeUtils, Dimension, globalStylesheets, WrappedStyleElement, sharedMutationObserver, _sharedStyleSheet, EventType, EventHelper, FocusTracker, SELECTOR_REGEX, Namespace, basicMarkupHtmlTags, defaultDomPurifyConfig, ModifierKeyEmitter, DragAndDropObserver, H_REGEX; +var init_dom = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/dom.js"() { + init_browser(); + init_canIUse(); + init_keyboardEvent(); + init_mouseEvent(); + init_async(); + init_errors(); + init_event(); + init_dompurify(); + init_lifecycle(); + init_network(); + init_platform(); + init_hash(); + init_window(); + ({ registerWindow, getWindow, getDocument, getWindows, getWindowsCount, getWindowId, getWindowById, hasWindow, onDidRegisterWindow, onWillUnregisterWindow, onDidUnregisterWindow } = function() { + const windows = /* @__PURE__ */ new Map(); + ensureCodeWindow(mainWindow, 1); + const mainWindowRegistration = { window: mainWindow, disposables: new DisposableStore() }; + windows.set(mainWindow.vscodeWindowId, mainWindowRegistration); + const onDidRegisterWindow2 = new Emitter(); + const onDidUnregisterWindow2 = new Emitter(); + const onWillUnregisterWindow2 = new Emitter(); + function getWindowById2(windowId, fallbackToMain) { + const window2 = typeof windowId === "number" ? windows.get(windowId) : void 0; + return window2 !== null && window2 !== void 0 ? window2 : fallbackToMain ? mainWindowRegistration : void 0; + } + return { + onDidRegisterWindow: onDidRegisterWindow2.event, + onWillUnregisterWindow: onWillUnregisterWindow2.event, + onDidUnregisterWindow: onDidUnregisterWindow2.event, + registerWindow(window2) { + if (windows.has(window2.vscodeWindowId)) { + return Disposable.None; + } + const disposables = new DisposableStore(); + const registeredWindow = { + window: window2, + disposables: disposables.add(new DisposableStore()) + }; + windows.set(window2.vscodeWindowId, registeredWindow); + disposables.add(toDisposable(() => { + windows.delete(window2.vscodeWindowId); + onDidUnregisterWindow2.fire(window2); + })); + disposables.add(addDisposableListener(window2, EventType.BEFORE_UNLOAD, () => { + onWillUnregisterWindow2.fire(window2); + })); + onDidRegisterWindow2.fire(registeredWindow); + return disposables; + }, + getWindows() { + return windows.values(); + }, + getWindowsCount() { + return windows.size; + }, + getWindowId(targetWindow) { + return targetWindow.vscodeWindowId; + }, + hasWindow(windowId) { + return windows.has(windowId); + }, + getWindowById: getWindowById2, + getWindow(e) { + var _a10; + const candidateNode = e; + if ((_a10 = candidateNode === null || candidateNode === void 0 ? void 0 : candidateNode.ownerDocument) === null || _a10 === void 0 ? void 0 : _a10.defaultView) { + return candidateNode.ownerDocument.defaultView.window; + } + const candidateEvent = e; + if (candidateEvent === null || candidateEvent === void 0 ? void 0 : candidateEvent.view) { + return candidateEvent.view.window; + } + return mainWindow; + }, + getDocument(e) { + const candidateNode = e; + return getWindow(candidateNode).document; + } + }; + }()); + DomListener = class { + constructor(node, type, handler, options2) { + this._node = node; + this._type = type; + this._handler = handler; + this._options = options2 || false; + this._node.addEventListener(this._type, this._handler, this._options); + } + dispose() { + if (!this._handler) { + return; + } + this._node.removeEventListener(this._type, this._handler, this._options); + this._node = null; + this._handler = null; + } + }; + addStandardDisposableListener = function addStandardDisposableListener2(node, type, handler, useCapture) { + let wrapHandler = handler; + if (type === "click" || type === "mousedown" || type === "contextmenu") { + wrapHandler = _wrapAsStandardMouseEvent(getWindow(node), handler); + } else if (type === "keydown" || type === "keypress" || type === "keyup") { + wrapHandler = _wrapAsStandardKeyboardEvent(handler); + } + return addDisposableListener(node, type, wrapHandler, useCapture); + }; + addStandardDisposableGenericMouseDownListener = function addStandardDisposableListener3(node, handler, useCapture) { + const wrapHandler = _wrapAsStandardMouseEvent(getWindow(node), handler); + return addDisposableGenericMouseDownListener(node, wrapHandler, useCapture); + }; + WindowIdleValue = class extends AbstractIdleValue { + constructor(targetWindow, executor) { + super(targetWindow, executor); + } + }; + WindowIntervalTimer = class extends IntervalTimer { + /** + * + * @param node The optional node from which the target window is determined + */ + constructor(node) { + super(); + this.defaultTarget = node && getWindow(node); + } + cancelAndSet(runner, interval, targetWindow) { + return super.cancelAndSet(runner, interval, targetWindow !== null && targetWindow !== void 0 ? targetWindow : this.defaultTarget); + } + }; + AnimationFrameQueueItem = class { + constructor(runner, priority = 0) { + this._runner = runner; + this.priority = priority; + this._canceled = false; + } + dispose() { + this._canceled = true; + } + execute() { + if (this._canceled) { + return; + } + try { + this._runner(); + } catch (e) { + onUnexpectedError(e); + } + } + // Sort by priority (largest to lowest) + static sort(a3, b) { + return b.priority - a3.priority; + } + }; + (function() { + const NEXT_QUEUE = /* @__PURE__ */ new Map(); + const CURRENT_QUEUE = /* @__PURE__ */ new Map(); + const animFrameRequested = /* @__PURE__ */ new Map(); + const inAnimationFrameRunner = /* @__PURE__ */ new Map(); + const animationFrameRunner = (targetWindowId) => { + var _a10; + animFrameRequested.set(targetWindowId, false); + const currentQueue = (_a10 = NEXT_QUEUE.get(targetWindowId)) !== null && _a10 !== void 0 ? _a10 : []; + CURRENT_QUEUE.set(targetWindowId, currentQueue); + NEXT_QUEUE.set(targetWindowId, []); + inAnimationFrameRunner.set(targetWindowId, true); + while (currentQueue.length > 0) { + currentQueue.sort(AnimationFrameQueueItem.sort); + const top = currentQueue.shift(); + top.execute(); + } + inAnimationFrameRunner.set(targetWindowId, false); + }; + scheduleAtNextAnimationFrame = (targetWindow, runner, priority = 0) => { + const targetWindowId = getWindowId(targetWindow); + const item = new AnimationFrameQueueItem(runner, priority); + let nextQueue = NEXT_QUEUE.get(targetWindowId); + if (!nextQueue) { + nextQueue = []; + NEXT_QUEUE.set(targetWindowId, nextQueue); + } + nextQueue.push(item); + if (!animFrameRequested.get(targetWindowId)) { + animFrameRequested.set(targetWindowId, true); + targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindowId)); + } + return item; + }; + runAtThisOrScheduleAtNextAnimationFrame = (targetWindow, runner, priority) => { + const targetWindowId = getWindowId(targetWindow); + if (inAnimationFrameRunner.get(targetWindowId)) { + const item = new AnimationFrameQueueItem(runner, priority); + let currentQueue = CURRENT_QUEUE.get(targetWindowId); + if (!currentQueue) { + currentQueue = []; + CURRENT_QUEUE.set(targetWindowId, currentQueue); + } + currentQueue.push(item); + return item; + } else { + return scheduleAtNextAnimationFrame(targetWindow, runner, priority); + } + }; + })(); + SizeUtils = class _SizeUtils { + // Adapted from WinJS + // Converts a CSS positioning string for the specified element to pixels. + static convertToPixels(element, value) { + return parseFloat(value) || 0; + } + static getDimension(element, cssPropertyName, jsPropertyName) { + const computedStyle = getComputedStyle(element); + const value = computedStyle ? computedStyle.getPropertyValue(cssPropertyName) : "0"; + return _SizeUtils.convertToPixels(element, value); + } + static getBorderLeftWidth(element) { + return _SizeUtils.getDimension(element, "border-left-width", "borderLeftWidth"); + } + static getBorderRightWidth(element) { + return _SizeUtils.getDimension(element, "border-right-width", "borderRightWidth"); + } + static getBorderTopWidth(element) { + return _SizeUtils.getDimension(element, "border-top-width", "borderTopWidth"); + } + static getBorderBottomWidth(element) { + return _SizeUtils.getDimension(element, "border-bottom-width", "borderBottomWidth"); + } + static getPaddingLeft(element) { + return _SizeUtils.getDimension(element, "padding-left", "paddingLeft"); + } + static getPaddingRight(element) { + return _SizeUtils.getDimension(element, "padding-right", "paddingRight"); + } + static getPaddingTop(element) { + return _SizeUtils.getDimension(element, "padding-top", "paddingTop"); + } + static getPaddingBottom(element) { + return _SizeUtils.getDimension(element, "padding-bottom", "paddingBottom"); + } + static getMarginLeft(element) { + return _SizeUtils.getDimension(element, "margin-left", "marginLeft"); + } + static getMarginTop(element) { + return _SizeUtils.getDimension(element, "margin-top", "marginTop"); + } + static getMarginRight(element) { + return _SizeUtils.getDimension(element, "margin-right", "marginRight"); + } + static getMarginBottom(element) { + return _SizeUtils.getDimension(element, "margin-bottom", "marginBottom"); + } + }; + Dimension = class _Dimension { + constructor(width2, height) { + this.width = width2; + this.height = height; + } + with(width2 = this.width, height = this.height) { + if (width2 !== this.width || height !== this.height) { + return new _Dimension(width2, height); + } else { + return this; + } + } + static is(obj) { + return typeof obj === "object" && typeof obj.height === "number" && typeof obj.width === "number"; + } + static lift(obj) { + if (obj instanceof _Dimension) { + return obj; + } else { + return new _Dimension(obj.width, obj.height); + } + } + static equals(a3, b) { + if (a3 === b) { + return true; + } + if (!a3 || !b) { + return false; + } + return a3.width === b.width && a3.height === b.height; + } + }; + Dimension.None = new Dimension(0, 0); + globalStylesheets = /* @__PURE__ */ new Map(); + WrappedStyleElement = class { + constructor() { + this._currentCssStyle = ""; + this._styleSheet = void 0; + } + setStyle(cssStyle) { + if (cssStyle === this._currentCssStyle) { + return; + } + this._currentCssStyle = cssStyle; + if (!this._styleSheet) { + this._styleSheet = createStyleSheet(mainWindow.document.head, (s) => s.innerText = cssStyle); + } else { + this._styleSheet.innerText = cssStyle; + } + } + dispose() { + if (this._styleSheet) { + this._styleSheet.remove(); + this._styleSheet = void 0; + } + } + }; + sharedMutationObserver = new class { + constructor() { + this.mutationObservers = /* @__PURE__ */ new Map(); + } + observe(target, disposables, options2) { + let mutationObserversPerTarget = this.mutationObservers.get(target); + if (!mutationObserversPerTarget) { + mutationObserversPerTarget = /* @__PURE__ */ new Map(); + this.mutationObservers.set(target, mutationObserversPerTarget); + } + const optionsHash = hash(options2); + let mutationObserverPerOptions = mutationObserversPerTarget.get(optionsHash); + if (!mutationObserverPerOptions) { + const onDidMutate = new Emitter(); + const observer = new MutationObserver((mutations) => onDidMutate.fire(mutations)); + observer.observe(target, options2); + const resolvedMutationObserverPerOptions = mutationObserverPerOptions = { + users: 1, + observer, + onDidMutate: onDidMutate.event + }; + disposables.add(toDisposable(() => { + resolvedMutationObserverPerOptions.users -= 1; + if (resolvedMutationObserverPerOptions.users === 0) { + onDidMutate.dispose(); + observer.disconnect(); + mutationObserversPerTarget === null || mutationObserversPerTarget === void 0 ? void 0 : mutationObserversPerTarget.delete(optionsHash); + if ((mutationObserversPerTarget === null || mutationObserversPerTarget === void 0 ? void 0 : mutationObserversPerTarget.size) === 0) { + this.mutationObservers.delete(target); + } + } + })); + mutationObserversPerTarget.set(optionsHash, mutationObserverPerOptions); + } else { + mutationObserverPerOptions.users += 1; + } + return mutationObserverPerOptions.onDidMutate; + } + }(); + _sharedStyleSheet = null; + EventType = { + // Mouse + CLICK: "click", + AUXCLICK: "auxclick", + DBLCLICK: "dblclick", + MOUSE_UP: "mouseup", + MOUSE_DOWN: "mousedown", + MOUSE_OVER: "mouseover", + MOUSE_MOVE: "mousemove", + MOUSE_OUT: "mouseout", + MOUSE_ENTER: "mouseenter", + MOUSE_LEAVE: "mouseleave", + MOUSE_WHEEL: "wheel", + POINTER_UP: "pointerup", + POINTER_DOWN: "pointerdown", + POINTER_MOVE: "pointermove", + POINTER_LEAVE: "pointerleave", + CONTEXT_MENU: "contextmenu", + WHEEL: "wheel", + // Keyboard + KEY_DOWN: "keydown", + KEY_PRESS: "keypress", + KEY_UP: "keyup", + // HTML Document + LOAD: "load", + BEFORE_UNLOAD: "beforeunload", + UNLOAD: "unload", + PAGE_SHOW: "pageshow", + PAGE_HIDE: "pagehide", + PASTE: "paste", + ABORT: "abort", + ERROR: "error", + RESIZE: "resize", + SCROLL: "scroll", + FULLSCREEN_CHANGE: "fullscreenchange", + WK_FULLSCREEN_CHANGE: "webkitfullscreenchange", + // Form + SELECT: "select", + CHANGE: "change", + SUBMIT: "submit", + RESET: "reset", + FOCUS: "focus", + FOCUS_IN: "focusin", + FOCUS_OUT: "focusout", + BLUR: "blur", + INPUT: "input", + // Local Storage + STORAGE: "storage", + // Drag + DRAG_START: "dragstart", + DRAG: "drag", + DRAG_ENTER: "dragenter", + DRAG_LEAVE: "dragleave", + DRAG_OVER: "dragover", + DROP: "drop", + DRAG_END: "dragend", + // Animation + ANIMATION_START: isWebKit ? "webkitAnimationStart" : "animationstart", + ANIMATION_END: isWebKit ? "webkitAnimationEnd" : "animationend", + ANIMATION_ITERATION: isWebKit ? "webkitAnimationIteration" : "animationiteration" + }; + EventHelper = { + stop: (e, cancelBubble) => { + e.preventDefault(); + if (cancelBubble) { + e.stopPropagation(); + } + return e; + } + }; + FocusTracker = class _FocusTracker extends Disposable { + static hasFocusWithin(element) { + if (isHTMLElement(element)) { + const shadowRoot = getShadowRoot(element); + const activeElement = shadowRoot ? shadowRoot.activeElement : element.ownerDocument.activeElement; + return isAncestor(activeElement, element); + } else { + const window2 = element; + return isAncestor(window2.document.activeElement, window2.document); + } + } + constructor(element) { + super(); + this._onDidFocus = this._register(new Emitter()); + this.onDidFocus = this._onDidFocus.event; + this._onDidBlur = this._register(new Emitter()); + this.onDidBlur = this._onDidBlur.event; + let hasFocus = _FocusTracker.hasFocusWithin(element); + let loosingFocus = false; + const onFocus = () => { + loosingFocus = false; + if (!hasFocus) { + hasFocus = true; + this._onDidFocus.fire(); + } + }; + const onBlur = () => { + if (hasFocus) { + loosingFocus = true; + (isHTMLElement(element) ? getWindow(element) : element).setTimeout(() => { + if (loosingFocus) { + loosingFocus = false; + hasFocus = false; + this._onDidBlur.fire(); + } + }, 0); + } + }; + this._refreshStateHandler = () => { + const currentNodeHasFocus = _FocusTracker.hasFocusWithin(element); + if (currentNodeHasFocus !== hasFocus) { + if (hasFocus) { + onBlur(); + } else { + onFocus(); + } + } + }; + this._register(addDisposableListener(element, EventType.FOCUS, onFocus, true)); + this._register(addDisposableListener(element, EventType.BLUR, onBlur, true)); + if (isHTMLElement(element)) { + this._register(addDisposableListener(element, EventType.FOCUS_IN, () => this._refreshStateHandler())); + this._register(addDisposableListener(element, EventType.FOCUS_OUT, () => this._refreshStateHandler())); + } + } + }; + SELECTOR_REGEX = /([\w\-]+)?(#([\w\-]+))?((\.([\w\-]+))*)/; + (function(Namespace3) { + Namespace3["HTML"] = "http://www.w3.org/1999/xhtml"; + Namespace3["SVG"] = "http://www.w3.org/2000/svg"; + })(Namespace || (Namespace = {})); + $.SVG = function(description, attrs, ...children) { + return _$(Namespace.SVG, description, attrs, ...children); + }; + RemoteAuthorities.setPreferredWebSchema(/^https:/.test(mainWindow.location.href) ? "https" : "http"); + basicMarkupHtmlTags = Object.freeze([ + "a", + "abbr", + "b", + "bdo", + "blockquote", + "br", + "caption", + "cite", + "code", + "col", + "colgroup", + "dd", + "del", + "details", + "dfn", + "div", + "dl", + "dt", + "em", + "figcaption", + "figure", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "hr", + "i", + "img", + "input", + "ins", + "kbd", + "label", + "li", + "mark", + "ol", + "p", + "pre", + "q", + "rp", + "rt", + "ruby", + "samp", + "small", + "small", + "source", + "span", + "strike", + "strong", + "sub", + "summary", + "sup", + "table", + "tbody", + "td", + "tfoot", + "th", + "thead", + "time", + "tr", + "tt", + "u", + "ul", + "var", + "video", + "wbr" + ]); + defaultDomPurifyConfig = Object.freeze({ + ALLOWED_TAGS: ["a", "button", "blockquote", "code", "div", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "input", "label", "li", "p", "pre", "select", "small", "span", "strong", "textarea", "ul", "ol"], + ALLOWED_ATTR: ["href", "data-href", "data-command", "target", "title", "name", "src", "alt", "class", "id", "role", "tabindex", "style", "data-code", "width", "height", "align", "x-dispatch", "required", "checked", "placeholder", "type", "start"], + RETURN_DOM: false, + RETURN_DOM_FRAGMENT: false, + RETURN_TRUSTED_TYPE: true + }); + ModifierKeyEmitter = class _ModifierKeyEmitter extends Emitter { + constructor() { + super(); + this._subscriptions = new DisposableStore(); + this._keyStatus = { + altKey: false, + shiftKey: false, + ctrlKey: false, + metaKey: false + }; + this._subscriptions.add(Event.runAndSubscribe(onDidRegisterWindow, ({ window: window2, disposables }) => this.registerListeners(window2, disposables), { window: mainWindow, disposables: this._subscriptions })); + } + registerListeners(window2, disposables) { + disposables.add(addDisposableListener(window2, "keydown", (e) => { + if (e.defaultPrevented) { + return; + } + const event = new StandardKeyboardEvent(e); + if (event.keyCode === 6 && e.repeat) { + return; + } + if (e.altKey && !this._keyStatus.altKey) { + this._keyStatus.lastKeyPressed = "alt"; + } else if (e.ctrlKey && !this._keyStatus.ctrlKey) { + this._keyStatus.lastKeyPressed = "ctrl"; + } else if (e.metaKey && !this._keyStatus.metaKey) { + this._keyStatus.lastKeyPressed = "meta"; + } else if (e.shiftKey && !this._keyStatus.shiftKey) { + this._keyStatus.lastKeyPressed = "shift"; + } else if (event.keyCode !== 6) { + this._keyStatus.lastKeyPressed = void 0; + } else { + return; + } + this._keyStatus.altKey = e.altKey; + this._keyStatus.ctrlKey = e.ctrlKey; + this._keyStatus.metaKey = e.metaKey; + this._keyStatus.shiftKey = e.shiftKey; + if (this._keyStatus.lastKeyPressed) { + this._keyStatus.event = e; + this.fire(this._keyStatus); + } + }, true)); + disposables.add(addDisposableListener(window2, "keyup", (e) => { + if (e.defaultPrevented) { + return; + } + if (!e.altKey && this._keyStatus.altKey) { + this._keyStatus.lastKeyReleased = "alt"; + } else if (!e.ctrlKey && this._keyStatus.ctrlKey) { + this._keyStatus.lastKeyReleased = "ctrl"; + } else if (!e.metaKey && this._keyStatus.metaKey) { + this._keyStatus.lastKeyReleased = "meta"; + } else if (!e.shiftKey && this._keyStatus.shiftKey) { + this._keyStatus.lastKeyReleased = "shift"; + } else { + this._keyStatus.lastKeyReleased = void 0; + } + if (this._keyStatus.lastKeyPressed !== this._keyStatus.lastKeyReleased) { + this._keyStatus.lastKeyPressed = void 0; + } + this._keyStatus.altKey = e.altKey; + this._keyStatus.ctrlKey = e.ctrlKey; + this._keyStatus.metaKey = e.metaKey; + this._keyStatus.shiftKey = e.shiftKey; + if (this._keyStatus.lastKeyReleased) { + this._keyStatus.event = e; + this.fire(this._keyStatus); + } + }, true)); + disposables.add(addDisposableListener(window2.document.body, "mousedown", () => { + this._keyStatus.lastKeyPressed = void 0; + }, true)); + disposables.add(addDisposableListener(window2.document.body, "mouseup", () => { + this._keyStatus.lastKeyPressed = void 0; + }, true)); + disposables.add(addDisposableListener(window2.document.body, "mousemove", (e) => { + if (e.buttons) { + this._keyStatus.lastKeyPressed = void 0; + } + }, true)); + disposables.add(addDisposableListener(window2, "blur", () => { + this.resetKeyStatus(); + })); + } + get keyStatus() { + return this._keyStatus; + } + /** + * Allows to explicitly reset the key status based on more knowledge (#109062) + */ + resetKeyStatus() { + this.doResetKeyStatus(); + this.fire(this._keyStatus); + } + doResetKeyStatus() { + this._keyStatus = { + altKey: false, + shiftKey: false, + ctrlKey: false, + metaKey: false + }; + } + static getInstance() { + if (!_ModifierKeyEmitter.instance) { + _ModifierKeyEmitter.instance = new _ModifierKeyEmitter(); + } + return _ModifierKeyEmitter.instance; + } + dispose() { + super.dispose(); + this._subscriptions.dispose(); + } + }; + DragAndDropObserver = class extends Disposable { + constructor(element, callbacks) { + super(); + this.element = element; + this.callbacks = callbacks; + this.counter = 0; + this.dragStartTime = 0; + this.registerListeners(); + } + registerListeners() { + if (this.callbacks.onDragStart) { + this._register(addDisposableListener(this.element, EventType.DRAG_START, (e) => { + var _a10, _b4; + (_b4 = (_a10 = this.callbacks).onDragStart) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, e); + })); + } + if (this.callbacks.onDrag) { + this._register(addDisposableListener(this.element, EventType.DRAG, (e) => { + var _a10, _b4; + (_b4 = (_a10 = this.callbacks).onDrag) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, e); + })); + } + this._register(addDisposableListener(this.element, EventType.DRAG_ENTER, (e) => { + var _a10, _b4; + this.counter++; + this.dragStartTime = e.timeStamp; + (_b4 = (_a10 = this.callbacks).onDragEnter) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, e); + })); + this._register(addDisposableListener(this.element, EventType.DRAG_OVER, (e) => { + var _a10, _b4; + e.preventDefault(); + (_b4 = (_a10 = this.callbacks).onDragOver) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, e, e.timeStamp - this.dragStartTime); + })); + this._register(addDisposableListener(this.element, EventType.DRAG_LEAVE, (e) => { + var _a10, _b4; + this.counter--; + if (this.counter === 0) { + this.dragStartTime = 0; + (_b4 = (_a10 = this.callbacks).onDragLeave) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, e); + } + })); + this._register(addDisposableListener(this.element, EventType.DRAG_END, (e) => { + var _a10, _b4; + this.counter = 0; + this.dragStartTime = 0; + (_b4 = (_a10 = this.callbacks).onDragEnd) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, e); + })); + this._register(addDisposableListener(this.element, EventType.DROP, (e) => { + var _a10, _b4; + this.counter = 0; + this.dragStartTime = 0; + (_b4 = (_a10 = this.callbacks).onDrop) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, e); + })); + } + }; + H_REGEX = new RegExp("(?[\\w\\-]+)?(?:#(?[\\w\\-]+))?(?(?:\\.(?:[\\w\\-]+))*)(?:@(?(?:[\\w\\_])+))?"); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/pixelRatio.js +var DevicePixelRatioMonitor, PixelRatioMonitorImpl, PixelRatioMonitorFacade, PixelRatio; +var init_pixelRatio = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/pixelRatio.js"() { + init_dom(); + init_event(); + init_lifecycle(); + DevicePixelRatioMonitor = class extends Disposable { + constructor(targetWindow) { + super(); + this._onDidChange = this._register(new Emitter()); + this.onDidChange = this._onDidChange.event; + this._listener = () => this._handleChange(targetWindow, true); + this._mediaQueryList = null; + this._handleChange(targetWindow, false); + } + _handleChange(targetWindow, fireEvent) { + var _a10; + (_a10 = this._mediaQueryList) === null || _a10 === void 0 ? void 0 : _a10.removeEventListener("change", this._listener); + this._mediaQueryList = targetWindow.matchMedia(`(resolution: ${targetWindow.devicePixelRatio}dppx)`); + this._mediaQueryList.addEventListener("change", this._listener); + if (fireEvent) { + this._onDidChange.fire(); + } + } + }; + PixelRatioMonitorImpl = class extends Disposable { + get value() { + return this._value; + } + constructor(targetWindow) { + super(); + this._onDidChange = this._register(new Emitter()); + this.onDidChange = this._onDidChange.event; + this._value = this._getPixelRatio(targetWindow); + const dprMonitor = this._register(new DevicePixelRatioMonitor(targetWindow)); + this._register(dprMonitor.onDidChange(() => { + this._value = this._getPixelRatio(targetWindow); + this._onDidChange.fire(this._value); + })); + } + _getPixelRatio(targetWindow) { + const ctx = document.createElement("canvas").getContext("2d"); + const dpr = targetWindow.devicePixelRatio || 1; + const bsr = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1; + return dpr / bsr; + } + }; + PixelRatioMonitorFacade = class { + constructor() { + this.mapWindowIdToPixelRatioMonitor = /* @__PURE__ */ new Map(); + } + _getOrCreatePixelRatioMonitor(targetWindow) { + const targetWindowId = getWindowId(targetWindow); + let pixelRatioMonitor = this.mapWindowIdToPixelRatioMonitor.get(targetWindowId); + if (!pixelRatioMonitor) { + pixelRatioMonitor = markAsSingleton(new PixelRatioMonitorImpl(targetWindow)); + this.mapWindowIdToPixelRatioMonitor.set(targetWindowId, pixelRatioMonitor); + markAsSingleton(Event.once(onDidUnregisterWindow)(({ vscodeWindowId }) => { + if (vscodeWindowId === targetWindowId) { + pixelRatioMonitor === null || pixelRatioMonitor === void 0 ? void 0 : pixelRatioMonitor.dispose(); + this.mapWindowIdToPixelRatioMonitor.delete(targetWindowId); + } + })); + } + return pixelRatioMonitor; + } + getInstance(targetWindow) { + return this._getOrCreatePixelRatioMonitor(targetWindow); + } + }; + PixelRatio = new PixelRatioMonitorFacade(); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/fastDomNode.js +function numberAsPixels(value) { + return typeof value === "number" ? `${value}px` : value; +} +function createFastDomNode(domNode) { + return new FastDomNode(domNode); +} +var FastDomNode; +var init_fastDomNode = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/fastDomNode.js"() { + FastDomNode = class { + constructor(domNode) { + this.domNode = domNode; + this._maxWidth = ""; + this._width = ""; + this._height = ""; + this._top = ""; + this._left = ""; + this._bottom = ""; + this._right = ""; + this._paddingLeft = ""; + this._fontFamily = ""; + this._fontWeight = ""; + this._fontSize = ""; + this._fontStyle = ""; + this._fontFeatureSettings = ""; + this._fontVariationSettings = ""; + this._textDecoration = ""; + this._lineHeight = ""; + this._letterSpacing = ""; + this._className = ""; + this._display = ""; + this._position = ""; + this._visibility = ""; + this._color = ""; + this._backgroundColor = ""; + this._layerHint = false; + this._contain = "none"; + this._boxShadow = ""; + } + setMaxWidth(_maxWidth) { + const maxWidth = numberAsPixels(_maxWidth); + if (this._maxWidth === maxWidth) { + return; + } + this._maxWidth = maxWidth; + this.domNode.style.maxWidth = this._maxWidth; + } + setWidth(_width) { + const width2 = numberAsPixels(_width); + if (this._width === width2) { + return; + } + this._width = width2; + this.domNode.style.width = this._width; + } + setHeight(_height) { + const height = numberAsPixels(_height); + if (this._height === height) { + return; + } + this._height = height; + this.domNode.style.height = this._height; + } + setTop(_top) { + const top = numberAsPixels(_top); + if (this._top === top) { + return; + } + this._top = top; + this.domNode.style.top = this._top; + } + setLeft(_left) { + const left = numberAsPixels(_left); + if (this._left === left) { + return; + } + this._left = left; + this.domNode.style.left = this._left; + } + setBottom(_bottom) { + const bottom = numberAsPixels(_bottom); + if (this._bottom === bottom) { + return; + } + this._bottom = bottom; + this.domNode.style.bottom = this._bottom; + } + setRight(_right) { + const right = numberAsPixels(_right); + if (this._right === right) { + return; + } + this._right = right; + this.domNode.style.right = this._right; + } + setPaddingLeft(_paddingLeft) { + const paddingLeft = numberAsPixels(_paddingLeft); + if (this._paddingLeft === paddingLeft) { + return; + } + this._paddingLeft = paddingLeft; + this.domNode.style.paddingLeft = this._paddingLeft; + } + setFontFamily(fontFamily) { + if (this._fontFamily === fontFamily) { + return; + } + this._fontFamily = fontFamily; + this.domNode.style.fontFamily = this._fontFamily; + } + setFontWeight(fontWeight) { + if (this._fontWeight === fontWeight) { + return; + } + this._fontWeight = fontWeight; + this.domNode.style.fontWeight = this._fontWeight; + } + setFontSize(_fontSize) { + const fontSize = numberAsPixels(_fontSize); + if (this._fontSize === fontSize) { + return; + } + this._fontSize = fontSize; + this.domNode.style.fontSize = this._fontSize; + } + setFontStyle(fontStyle) { + if (this._fontStyle === fontStyle) { + return; + } + this._fontStyle = fontStyle; + this.domNode.style.fontStyle = this._fontStyle; + } + setFontFeatureSettings(fontFeatureSettings) { + if (this._fontFeatureSettings === fontFeatureSettings) { + return; + } + this._fontFeatureSettings = fontFeatureSettings; + this.domNode.style.fontFeatureSettings = this._fontFeatureSettings; + } + setFontVariationSettings(fontVariationSettings) { + if (this._fontVariationSettings === fontVariationSettings) { + return; + } + this._fontVariationSettings = fontVariationSettings; + this.domNode.style.fontVariationSettings = this._fontVariationSettings; + } + setTextDecoration(textDecoration) { + if (this._textDecoration === textDecoration) { + return; + } + this._textDecoration = textDecoration; + this.domNode.style.textDecoration = this._textDecoration; + } + setLineHeight(_lineHeight) { + const lineHeight = numberAsPixels(_lineHeight); + if (this._lineHeight === lineHeight) { + return; + } + this._lineHeight = lineHeight; + this.domNode.style.lineHeight = this._lineHeight; + } + setLetterSpacing(_letterSpacing) { + const letterSpacing = numberAsPixels(_letterSpacing); + if (this._letterSpacing === letterSpacing) { + return; + } + this._letterSpacing = letterSpacing; + this.domNode.style.letterSpacing = this._letterSpacing; + } + setClassName(className) { + if (this._className === className) { + return; + } + this._className = className; + this.domNode.className = this._className; + } + toggleClassName(className, shouldHaveIt) { + this.domNode.classList.toggle(className, shouldHaveIt); + this._className = this.domNode.className; + } + setDisplay(display) { + if (this._display === display) { + return; + } + this._display = display; + this.domNode.style.display = this._display; + } + setPosition(position) { + if (this._position === position) { + return; + } + this._position = position; + this.domNode.style.position = this._position; + } + setVisibility(visibility) { + if (this._visibility === visibility) { + return; + } + this._visibility = visibility; + this.domNode.style.visibility = this._visibility; + } + setColor(color) { + if (this._color === color) { + return; + } + this._color = color; + this.domNode.style.color = this._color; + } + setBackgroundColor(backgroundColor) { + if (this._backgroundColor === backgroundColor) { + return; + } + this._backgroundColor = backgroundColor; + this.domNode.style.backgroundColor = this._backgroundColor; + } + setLayerHinting(layerHint) { + if (this._layerHint === layerHint) { + return; + } + this._layerHint = layerHint; + this.domNode.style.transform = this._layerHint ? "translate3d(0px, 0px, 0px)" : ""; + } + setBoxShadow(boxShadow) { + if (this._boxShadow === boxShadow) { + return; + } + this._boxShadow = boxShadow; + this.domNode.style.boxShadow = boxShadow; + } + setContain(contain) { + if (this._contain === contain) { + return; + } + this._contain = contain; + this.domNode.style.contain = this._contain; + } + setAttribute(name, value) { + this.domNode.setAttribute(name, value); + } + removeAttribute(name) { + this.domNode.removeAttribute(name); + } + appendChild(child) { + this.domNode.appendChild(child.domNode); + } + removeChild(child) { + this.domNode.removeChild(child.domNode); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/config/domFontInfo.js +function applyFontInfo(domNode, fontInfo) { + if (domNode instanceof FastDomNode) { + domNode.setFontFamily(fontInfo.getMassagedFontFamily()); + domNode.setFontWeight(fontInfo.fontWeight); + domNode.setFontSize(fontInfo.fontSize); + domNode.setFontFeatureSettings(fontInfo.fontFeatureSettings); + domNode.setFontVariationSettings(fontInfo.fontVariationSettings); + domNode.setLineHeight(fontInfo.lineHeight); + domNode.setLetterSpacing(fontInfo.letterSpacing); + } else { + domNode.style.fontFamily = fontInfo.getMassagedFontFamily(); + domNode.style.fontWeight = fontInfo.fontWeight; + domNode.style.fontSize = fontInfo.fontSize + "px"; + domNode.style.fontFeatureSettings = fontInfo.fontFeatureSettings; + domNode.style.fontVariationSettings = fontInfo.fontVariationSettings; + domNode.style.lineHeight = fontInfo.lineHeight + "px"; + domNode.style.letterSpacing = fontInfo.letterSpacing + "px"; + } +} +var init_domFontInfo = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/config/domFontInfo.js"() { + init_fastDomNode(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/config/charWidthReader.js +function readCharWidths(targetWindow, bareFontInfo, requests) { + const reader = new DomCharWidthReader(bareFontInfo, requests); + reader.read(targetWindow); +} +var CharWidthRequest, DomCharWidthReader; +var init_charWidthReader = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/config/charWidthReader.js"() { + init_domFontInfo(); + CharWidthRequest = class { + constructor(chr, type) { + this.chr = chr; + this.type = type; + this.width = 0; + } + fulfill(width2) { + this.width = width2; + } + }; + DomCharWidthReader = class _DomCharWidthReader { + constructor(bareFontInfo, requests) { + this._bareFontInfo = bareFontInfo; + this._requests = requests; + this._container = null; + this._testElements = null; + } + read(targetWindow) { + this._createDomElements(); + targetWindow.document.body.appendChild(this._container); + this._readFromDomElements(); + targetWindow.document.body.removeChild(this._container); + this._container = null; + this._testElements = null; + } + _createDomElements() { + const container = document.createElement("div"); + container.style.position = "absolute"; + container.style.top = "-50000px"; + container.style.width = "50000px"; + const regularDomNode = document.createElement("div"); + applyFontInfo(regularDomNode, this._bareFontInfo); + container.appendChild(regularDomNode); + const boldDomNode = document.createElement("div"); + applyFontInfo(boldDomNode, this._bareFontInfo); + boldDomNode.style.fontWeight = "bold"; + container.appendChild(boldDomNode); + const italicDomNode = document.createElement("div"); + applyFontInfo(italicDomNode, this._bareFontInfo); + italicDomNode.style.fontStyle = "italic"; + container.appendChild(italicDomNode); + const testElements = []; + for (const request of this._requests) { + let parent; + if (request.type === 0) { + parent = regularDomNode; + } + if (request.type === 2) { + parent = boldDomNode; + } + if (request.type === 1) { + parent = italicDomNode; + } + parent.appendChild(document.createElement("br")); + const testElement = document.createElement("span"); + _DomCharWidthReader._render(testElement, request); + parent.appendChild(testElement); + testElements.push(testElement); + } + this._container = container; + this._testElements = testElements; + } + static _render(testElement, request) { + if (request.chr === " ") { + let htmlString = "\xA0"; + for (let i = 0; i < 8; i++) { + htmlString += htmlString; + } + testElement.innerText = htmlString; + } else { + let testString = request.chr; + for (let i = 0; i < 8; i++) { + testString += testString; + } + testElement.textContent = testString; + } + } + _readFromDomElements() { + for (let i = 0, len = this._requests.length; i < len; i++) { + const request = this._requests[i]; + const testElement = this._testElements[i]; + request.fulfill(testElement.offsetWidth / 256); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/config/editorZoom.js +var EditorZoom; +var init_editorZoom = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/config/editorZoom.js"() { + init_event(); + EditorZoom = new class { + constructor() { + this._zoomLevel = 0; + this._onDidChangeZoomLevel = new Emitter(); + this.onDidChangeZoomLevel = this._onDidChangeZoomLevel.event; + } + getZoomLevel() { + return this._zoomLevel; + } + setZoomLevel(zoomLevel) { + zoomLevel = Math.min(Math.max(-5, zoomLevel), 20); + if (this._zoomLevel === zoomLevel) { + return; + } + this._zoomLevel = zoomLevel; + this._onDidChangeZoomLevel.fire(this._zoomLevel); + } + }(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/config/fontInfo.js +var GOLDEN_LINE_HEIGHT_RATIO, MINIMUM_LINE_HEIGHT, BareFontInfo, SERIALIZED_FONT_INFO_VERSION, FontInfo; +var init_fontInfo = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/config/fontInfo.js"() { + init_platform(); + init_editorOptions(); + init_editorZoom(); + GOLDEN_LINE_HEIGHT_RATIO = isMacintosh ? 1.5 : 1.35; + MINIMUM_LINE_HEIGHT = 8; + BareFontInfo = class _BareFontInfo { + /** + * @internal + */ + static createFromValidatedSettings(options2, pixelRatio, ignoreEditorZoom) { + const fontFamily = options2.get( + 49 + /* EditorOption.fontFamily */ + ); + const fontWeight = options2.get( + 53 + /* EditorOption.fontWeight */ + ); + const fontSize = options2.get( + 52 + /* EditorOption.fontSize */ + ); + const fontFeatureSettings = options2.get( + 51 + /* EditorOption.fontLigatures */ + ); + const fontVariationSettings = options2.get( + 54 + /* EditorOption.fontVariations */ + ); + const lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + const letterSpacing = options2.get( + 64 + /* EditorOption.letterSpacing */ + ); + return _BareFontInfo._create(fontFamily, fontWeight, fontSize, fontFeatureSettings, fontVariationSettings, lineHeight, letterSpacing, pixelRatio, ignoreEditorZoom); + } + /** + * @internal + */ + static _create(fontFamily, fontWeight, fontSize, fontFeatureSettings, fontVariationSettings, lineHeight, letterSpacing, pixelRatio, ignoreEditorZoom) { + if (lineHeight === 0) { + lineHeight = GOLDEN_LINE_HEIGHT_RATIO * fontSize; + } else if (lineHeight < MINIMUM_LINE_HEIGHT) { + lineHeight = lineHeight * fontSize; + } + lineHeight = Math.round(lineHeight); + if (lineHeight < MINIMUM_LINE_HEIGHT) { + lineHeight = MINIMUM_LINE_HEIGHT; + } + const editorZoomLevelMultiplier = 1 + (ignoreEditorZoom ? 0 : EditorZoom.getZoomLevel() * 0.1); + fontSize *= editorZoomLevelMultiplier; + lineHeight *= editorZoomLevelMultiplier; + if (fontVariationSettings === EditorFontVariations.TRANSLATE) { + if (fontWeight === "normal" || fontWeight === "bold") { + fontVariationSettings = EditorFontVariations.OFF; + } else { + const fontWeightAsNumber = parseInt(fontWeight, 10); + fontVariationSettings = `'wght' ${fontWeightAsNumber}`; + fontWeight = "normal"; + } + } + return new _BareFontInfo({ + pixelRatio, + fontFamily, + fontWeight, + fontSize, + fontFeatureSettings, + fontVariationSettings, + lineHeight, + letterSpacing + }); + } + /** + * @internal + */ + constructor(opts) { + this._bareFontInfoBrand = void 0; + this.pixelRatio = opts.pixelRatio; + this.fontFamily = String(opts.fontFamily); + this.fontWeight = String(opts.fontWeight); + this.fontSize = opts.fontSize; + this.fontFeatureSettings = opts.fontFeatureSettings; + this.fontVariationSettings = opts.fontVariationSettings; + this.lineHeight = opts.lineHeight | 0; + this.letterSpacing = opts.letterSpacing; + } + /** + * @internal + */ + getId() { + return `${this.pixelRatio}-${this.fontFamily}-${this.fontWeight}-${this.fontSize}-${this.fontFeatureSettings}-${this.fontVariationSettings}-${this.lineHeight}-${this.letterSpacing}`; + } + /** + * @internal + */ + getMassagedFontFamily() { + const fallbackFontFamily = EDITOR_FONT_DEFAULTS.fontFamily; + const fontFamily = _BareFontInfo._wrapInQuotes(this.fontFamily); + if (fallbackFontFamily && this.fontFamily !== fallbackFontFamily) { + return `${fontFamily}, ${fallbackFontFamily}`; + } + return fontFamily; + } + static _wrapInQuotes(fontFamily) { + if (/[,"']/.test(fontFamily)) { + return fontFamily; + } + if (/[+ ]/.test(fontFamily)) { + return `"${fontFamily}"`; + } + return fontFamily; + } + }; + SERIALIZED_FONT_INFO_VERSION = 2; + FontInfo = class extends BareFontInfo { + /** + * @internal + */ + constructor(opts, isTrusted) { + super(opts); + this._editorStylingBrand = void 0; + this.version = SERIALIZED_FONT_INFO_VERSION; + this.isTrusted = isTrusted; + this.isMonospace = opts.isMonospace; + this.typicalHalfwidthCharacterWidth = opts.typicalHalfwidthCharacterWidth; + this.typicalFullwidthCharacterWidth = opts.typicalFullwidthCharacterWidth; + this.canUseHalfwidthRightwardsArrow = opts.canUseHalfwidthRightwardsArrow; + this.spaceWidth = opts.spaceWidth; + this.middotWidth = opts.middotWidth; + this.wsmiddotWidth = opts.wsmiddotWidth; + this.maxDigitWidth = opts.maxDigitWidth; + } + /** + * @internal + */ + equals(other) { + return this.fontFamily === other.fontFamily && this.fontWeight === other.fontWeight && this.fontSize === other.fontSize && this.fontFeatureSettings === other.fontFeatureSettings && this.fontVariationSettings === other.fontVariationSettings && this.lineHeight === other.lineHeight && this.letterSpacing === other.letterSpacing && this.typicalHalfwidthCharacterWidth === other.typicalHalfwidthCharacterWidth && this.typicalFullwidthCharacterWidth === other.typicalFullwidthCharacterWidth && this.canUseHalfwidthRightwardsArrow === other.canUseHalfwidthRightwardsArrow && this.spaceWidth === other.spaceWidth && this.middotWidth === other.middotWidth && this.wsmiddotWidth === other.wsmiddotWidth && this.maxDigitWidth === other.maxDigitWidth; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/config/fontMeasurements.js +var FontMeasurementsImpl, FontMeasurementsCache, FontMeasurements; +var init_fontMeasurements = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/config/fontMeasurements.js"() { + init_dom(); + init_pixelRatio(); + init_event(); + init_lifecycle(); + init_charWidthReader(); + init_editorOptions(); + init_fontInfo(); + FontMeasurementsImpl = class extends Disposable { + constructor() { + super(...arguments); + this._cache = /* @__PURE__ */ new Map(); + this._evictUntrustedReadingsTimeout = -1; + this._onDidChange = this._register(new Emitter()); + this.onDidChange = this._onDidChange.event; + } + dispose() { + if (this._evictUntrustedReadingsTimeout !== -1) { + clearTimeout(this._evictUntrustedReadingsTimeout); + this._evictUntrustedReadingsTimeout = -1; + } + super.dispose(); + } + /** + * Clear all cached font information and trigger a change event. + */ + clearAllFontInfos() { + this._cache.clear(); + this._onDidChange.fire(); + } + _ensureCache(targetWindow) { + const windowId = getWindowId(targetWindow); + let cache = this._cache.get(windowId); + if (!cache) { + cache = new FontMeasurementsCache(); + this._cache.set(windowId, cache); + } + return cache; + } + _writeToCache(targetWindow, item, value) { + const cache = this._ensureCache(targetWindow); + cache.put(item, value); + if (!value.isTrusted && this._evictUntrustedReadingsTimeout === -1) { + this._evictUntrustedReadingsTimeout = targetWindow.setTimeout(() => { + this._evictUntrustedReadingsTimeout = -1; + this._evictUntrustedReadings(targetWindow); + }, 5e3); + } + } + _evictUntrustedReadings(targetWindow) { + const cache = this._ensureCache(targetWindow); + const values2 = cache.getValues(); + let somethingRemoved = false; + for (const item of values2) { + if (!item.isTrusted) { + somethingRemoved = true; + cache.remove(item); + } + } + if (somethingRemoved) { + this._onDidChange.fire(); + } + } + /** + * Read font information. + */ + readFontInfo(targetWindow, bareFontInfo) { + const cache = this._ensureCache(targetWindow); + if (!cache.has(bareFontInfo)) { + let readConfig = this._actualReadFontInfo(targetWindow, bareFontInfo); + if (readConfig.typicalHalfwidthCharacterWidth <= 2 || readConfig.typicalFullwidthCharacterWidth <= 2 || readConfig.spaceWidth <= 2 || readConfig.maxDigitWidth <= 2) { + readConfig = new FontInfo({ + pixelRatio: PixelRatio.getInstance(targetWindow).value, + fontFamily: readConfig.fontFamily, + fontWeight: readConfig.fontWeight, + fontSize: readConfig.fontSize, + fontFeatureSettings: readConfig.fontFeatureSettings, + fontVariationSettings: readConfig.fontVariationSettings, + lineHeight: readConfig.lineHeight, + letterSpacing: readConfig.letterSpacing, + isMonospace: readConfig.isMonospace, + typicalHalfwidthCharacterWidth: Math.max(readConfig.typicalHalfwidthCharacterWidth, 5), + typicalFullwidthCharacterWidth: Math.max(readConfig.typicalFullwidthCharacterWidth, 5), + canUseHalfwidthRightwardsArrow: readConfig.canUseHalfwidthRightwardsArrow, + spaceWidth: Math.max(readConfig.spaceWidth, 5), + middotWidth: Math.max(readConfig.middotWidth, 5), + wsmiddotWidth: Math.max(readConfig.wsmiddotWidth, 5), + maxDigitWidth: Math.max(readConfig.maxDigitWidth, 5) + }, false); + } + this._writeToCache(targetWindow, bareFontInfo, readConfig); + } + return cache.get(bareFontInfo); + } + _createRequest(chr, type, all, monospace) { + const result = new CharWidthRequest(chr, type); + all.push(result); + monospace === null || monospace === void 0 ? void 0 : monospace.push(result); + return result; + } + _actualReadFontInfo(targetWindow, bareFontInfo) { + const all = []; + const monospace = []; + const typicalHalfwidthCharacter = this._createRequest("n", 0, all, monospace); + const typicalFullwidthCharacter = this._createRequest("\uFF4D", 0, all, null); + const space = this._createRequest(" ", 0, all, monospace); + const digit0 = this._createRequest("0", 0, all, monospace); + const digit1 = this._createRequest("1", 0, all, monospace); + const digit2 = this._createRequest("2", 0, all, monospace); + const digit3 = this._createRequest("3", 0, all, monospace); + const digit4 = this._createRequest("4", 0, all, monospace); + const digit5 = this._createRequest("5", 0, all, monospace); + const digit6 = this._createRequest("6", 0, all, monospace); + const digit7 = this._createRequest("7", 0, all, monospace); + const digit8 = this._createRequest("8", 0, all, monospace); + const digit9 = this._createRequest("9", 0, all, monospace); + const rightwardsArrow = this._createRequest("\u2192", 0, all, monospace); + const halfwidthRightwardsArrow = this._createRequest("\uFFEB", 0, all, null); + const middot = this._createRequest("\xB7", 0, all, monospace); + const wsmiddotWidth = this._createRequest(String.fromCharCode(11825), 0, all, null); + const monospaceTestChars = "|/-_ilm%"; + for (let i = 0, len = monospaceTestChars.length; i < len; i++) { + this._createRequest(monospaceTestChars.charAt(i), 0, all, monospace); + this._createRequest(monospaceTestChars.charAt(i), 1, all, monospace); + this._createRequest(monospaceTestChars.charAt(i), 2, all, monospace); + } + readCharWidths(targetWindow, bareFontInfo, all); + const maxDigitWidth = Math.max(digit0.width, digit1.width, digit2.width, digit3.width, digit4.width, digit5.width, digit6.width, digit7.width, digit8.width, digit9.width); + let isMonospace = bareFontInfo.fontFeatureSettings === EditorFontLigatures.OFF; + const referenceWidth = monospace[0].width; + for (let i = 1, len = monospace.length; isMonospace && i < len; i++) { + const diff = referenceWidth - monospace[i].width; + if (diff < -1e-3 || diff > 1e-3) { + isMonospace = false; + break; + } + } + let canUseHalfwidthRightwardsArrow = true; + if (isMonospace && halfwidthRightwardsArrow.width !== referenceWidth) { + canUseHalfwidthRightwardsArrow = false; + } + if (halfwidthRightwardsArrow.width > rightwardsArrow.width) { + canUseHalfwidthRightwardsArrow = false; + } + return new FontInfo({ + pixelRatio: PixelRatio.getInstance(targetWindow).value, + fontFamily: bareFontInfo.fontFamily, + fontWeight: bareFontInfo.fontWeight, + fontSize: bareFontInfo.fontSize, + fontFeatureSettings: bareFontInfo.fontFeatureSettings, + fontVariationSettings: bareFontInfo.fontVariationSettings, + lineHeight: bareFontInfo.lineHeight, + letterSpacing: bareFontInfo.letterSpacing, + isMonospace, + typicalHalfwidthCharacterWidth: typicalHalfwidthCharacter.width, + typicalFullwidthCharacterWidth: typicalFullwidthCharacter.width, + canUseHalfwidthRightwardsArrow, + spaceWidth: space.width, + middotWidth: middot.width, + wsmiddotWidth: wsmiddotWidth.width, + maxDigitWidth + }, true); + } + }; + FontMeasurementsCache = class { + constructor() { + this._keys = /* @__PURE__ */ Object.create(null); + this._values = /* @__PURE__ */ Object.create(null); + } + has(item) { + const itemId = item.getId(); + return !!this._values[itemId]; + } + get(item) { + const itemId = item.getId(); + return this._values[itemId]; + } + put(item, value) { + const itemId = item.getId(); + this._keys[itemId] = item; + this._values[itemId] = value; + } + remove(item) { + const itemId = item.getId(); + delete this._keys[itemId]; + delete this._values[itemId]; + } + getValues() { + return Object.keys(this._keys).map((id) => this._values[id]); + } + }; + FontMeasurements = new FontMeasurementsImpl(); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/instantiation/common/instantiation.js +function storeServiceDependency(id, target, index) { + if (target[_util.DI_TARGET] === target) { + target[_util.DI_DEPENDENCIES].push({ id, index }); + } else { + target[_util.DI_DEPENDENCIES] = [{ id, index }]; + target[_util.DI_TARGET] = target; + } +} +function createDecorator(serviceId) { + if (_util.serviceIds.has(serviceId)) { + return _util.serviceIds.get(serviceId); + } + const id = function(target, key, index) { + if (arguments.length !== 3) { + throw new Error("@IServiceName-decorator can only be used to decorate a parameter"); + } + storeServiceDependency(id, target, index); + }; + id.toString = () => serviceId; + _util.serviceIds.set(serviceId, id); + return id; +} +var _util, IInstantiationService; +var init_instantiation = __esm({ + "node_modules/monaco-editor/esm/vs/platform/instantiation/common/instantiation.js"() { + (function(_util2) { + _util2.serviceIds = /* @__PURE__ */ new Map(); + _util2.DI_TARGET = "$di$target"; + _util2.DI_DEPENDENCIES = "$di$dependencies"; + function getServiceDependencies(ctor) { + return ctor[_util2.DI_DEPENDENCIES] || []; + } + _util2.getServiceDependencies = getServiceDependencies; + })(_util || (_util = {})); + IInstantiationService = createDecorator("instantiationService"); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/services/codeEditorService.js +var ICodeEditorService; +var init_codeEditorService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/services/codeEditorService.js"() { + init_instantiation(); + ICodeEditorService = createDecorator("codeEditorService"); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/model.js +var IModelService; +var init_model = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/model.js"() { + init_instantiation(); + IModelService = createDecorator("modelService"); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/resolverService.js +var ITextModelService; +var init_resolverService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/resolverService.js"() { + init_instantiation(); + ITextModelService = createDecorator("textModelService"); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/actions.js +function toAction(props) { + var _a10, _b4; + return { + id: props.id, + label: props.label, + tooltip: (_a10 = props.tooltip) !== null && _a10 !== void 0 ? _a10 : props.label, + class: props.class, + enabled: (_b4 = props.enabled) !== null && _b4 !== void 0 ? _b4 : true, + checked: props.checked, + run: (...args) => __async(this, null, function* () { + return props.run(...args); + }) + }; +} +var Action, ActionRunner, Separator, SubmenuAction, EmptySubmenuAction; +var init_actions = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/actions.js"() { + init_event(); + init_lifecycle(); + init_nls(); + Action = class extends Disposable { + constructor(id, label = "", cssClass = "", enabled = true, actionCallback) { + super(); + this._onDidChange = this._register(new Emitter()); + this.onDidChange = this._onDidChange.event; + this._enabled = true; + this._id = id; + this._label = label; + this._cssClass = cssClass; + this._enabled = enabled; + this._actionCallback = actionCallback; + } + get id() { + return this._id; + } + get label() { + return this._label; + } + set label(value) { + this._setLabel(value); + } + _setLabel(value) { + if (this._label !== value) { + this._label = value; + this._onDidChange.fire({ label: value }); + } + } + get tooltip() { + return this._tooltip || ""; + } + set tooltip(value) { + this._setTooltip(value); + } + _setTooltip(value) { + if (this._tooltip !== value) { + this._tooltip = value; + this._onDidChange.fire({ tooltip: value }); + } + } + get class() { + return this._cssClass; + } + set class(value) { + this._setClass(value); + } + _setClass(value) { + if (this._cssClass !== value) { + this._cssClass = value; + this._onDidChange.fire({ class: value }); + } + } + get enabled() { + return this._enabled; + } + set enabled(value) { + this._setEnabled(value); + } + _setEnabled(value) { + if (this._enabled !== value) { + this._enabled = value; + this._onDidChange.fire({ enabled: value }); + } + } + get checked() { + return this._checked; + } + set checked(value) { + this._setChecked(value); + } + _setChecked(value) { + if (this._checked !== value) { + this._checked = value; + this._onDidChange.fire({ checked: value }); + } + } + run(event, data) { + return __async(this, null, function* () { + if (this._actionCallback) { + yield this._actionCallback(event); + } + }); + } + }; + ActionRunner = class extends Disposable { + constructor() { + super(...arguments); + this._onWillRun = this._register(new Emitter()); + this.onWillRun = this._onWillRun.event; + this._onDidRun = this._register(new Emitter()); + this.onDidRun = this._onDidRun.event; + } + run(action, context) { + return __async(this, null, function* () { + if (!action.enabled) { + return; + } + this._onWillRun.fire({ action }); + let error = void 0; + try { + yield this.runAction(action, context); + } catch (e) { + error = e; + } + this._onDidRun.fire({ action, error }); + }); + } + runAction(action, context) { + return __async(this, null, function* () { + yield action.run(context); + }); + } + }; + Separator = class _Separator { + constructor() { + this.id = _Separator.ID; + this.label = ""; + this.tooltip = ""; + this.class = "separator"; + this.enabled = false; + this.checked = false; + } + /** + * Joins all non-empty lists of actions with separators. + */ + static join(...actionLists) { + let out = []; + for (const list of actionLists) { + if (!list.length) { + } else if (out.length) { + out = [...out, new _Separator(), ...list]; + } else { + out = list; + } + } + return out; + } + run() { + return __async(this, null, function* () { + }); + } + }; + Separator.ID = "vs.actions.separator"; + SubmenuAction = class { + get actions() { + return this._actions; + } + constructor(id, label, actions, cssClass) { + this.tooltip = ""; + this.enabled = true; + this.checked = void 0; + this.id = id; + this.label = label; + this.class = cssClass; + this._actions = actions; + } + run() { + return __async(this, null, function* () { + }); + } + }; + EmptySubmenuAction = class _EmptySubmenuAction extends Action { + constructor() { + super(_EmptySubmenuAction.ID, localize("submenu.empty", "(empty)"), void 0, false); + } + }; + EmptySubmenuAction.ID = "vs.actions.empty"; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/themables.js +var ThemeColor, ThemeIcon; +var init_themables = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/themables.js"() { + init_codicons(); + (function(ThemeColor2) { + function isThemeColor(obj) { + return obj && typeof obj === "object" && typeof obj.id === "string"; + } + ThemeColor2.isThemeColor = isThemeColor; + })(ThemeColor || (ThemeColor = {})); + (function(ThemeIcon2) { + ThemeIcon2.iconNameSegment = "[A-Za-z0-9]+"; + ThemeIcon2.iconNameExpression = "[A-Za-z0-9-]+"; + ThemeIcon2.iconModifierExpression = "~[A-Za-z]+"; + ThemeIcon2.iconNameCharacter = "[A-Za-z0-9~-]"; + const ThemeIconIdRegex = new RegExp(`^(${ThemeIcon2.iconNameExpression})(${ThemeIcon2.iconModifierExpression})?$`); + function asClassNameArray(icon) { + const match2 = ThemeIconIdRegex.exec(icon.id); + if (!match2) { + return asClassNameArray(Codicon.error); + } + const [, id, modifier] = match2; + const classNames = ["codicon", "codicon-" + id]; + if (modifier) { + classNames.push("codicon-modifier-" + modifier.substring(1)); + } + return classNames; + } + ThemeIcon2.asClassNameArray = asClassNameArray; + function asClassName(icon) { + return asClassNameArray(icon).join(" "); + } + ThemeIcon2.asClassName = asClassName; + function asCSSSelector(icon) { + return "." + asClassNameArray(icon).join("."); + } + ThemeIcon2.asCSSSelector = asCSSSelector; + function isThemeIcon(obj) { + return obj && typeof obj === "object" && typeof obj.id === "string" && (typeof obj.color === "undefined" || ThemeColor.isThemeColor(obj.color)); + } + ThemeIcon2.isThemeIcon = isThemeIcon; + const _regexFromString = new RegExp(`^\\$\\((${ThemeIcon2.iconNameExpression}(?:${ThemeIcon2.iconModifierExpression})?)\\)$`); + function fromString(str) { + const match2 = _regexFromString.exec(str); + if (!match2) { + return void 0; + } + const [, name] = match2; + return { id: name }; + } + ThemeIcon2.fromString = fromString; + function fromId(id) { + return { id }; + } + ThemeIcon2.fromId = fromId; + function modify(icon, modifier) { + let id = icon.id; + const tildeIndex = id.lastIndexOf("~"); + if (tildeIndex !== -1) { + id = id.substring(0, tildeIndex); + } + if (modifier) { + id = `${id}~${modifier}`; + } + return { id }; + } + ThemeIcon2.modify = modify; + function getModifier(icon) { + const tildeIndex = icon.id.lastIndexOf("~"); + if (tildeIndex !== -1) { + return icon.id.substring(tildeIndex + 1); + } + return void 0; + } + ThemeIcon2.getModifier = getModifier; + function isEqual2(ti1, ti2) { + var _a10, _b4; + return ti1.id === ti2.id && ((_a10 = ti1.color) === null || _a10 === void 0 ? void 0 : _a10.id) === ((_b4 = ti2.color) === null || _b4 === void 0 ? void 0 : _b4.id); + } + ThemeIcon2.isEqual = isEqual2; + })(ThemeIcon || (ThemeIcon = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/commands/common/commands.js +var ICommandService, CommandsRegistry; +var init_commands = __esm({ + "node_modules/monaco-editor/esm/vs/platform/commands/common/commands.js"() { + init_event(); + init_iterator(); + init_lifecycle(); + init_linkedList(); + init_types(); + init_instantiation(); + ICommandService = createDecorator("commandService"); + CommandsRegistry = new class { + constructor() { + this._commands = /* @__PURE__ */ new Map(); + this._onDidRegisterCommand = new Emitter(); + this.onDidRegisterCommand = this._onDidRegisterCommand.event; + } + registerCommand(idOrCommand, handler) { + if (!idOrCommand) { + throw new Error(`invalid command`); + } + if (typeof idOrCommand === "string") { + if (!handler) { + throw new Error(`invalid command`); + } + return this.registerCommand({ id: idOrCommand, handler }); + } + if (idOrCommand.metadata && Array.isArray(idOrCommand.metadata.args)) { + const constraints = []; + for (const arg of idOrCommand.metadata.args) { + constraints.push(arg.constraint); + } + const actualHandler = idOrCommand.handler; + idOrCommand.handler = function(accessor, ...args) { + validateConstraints(args, constraints); + return actualHandler(accessor, ...args); + }; + } + const { id } = idOrCommand; + let commands = this._commands.get(id); + if (!commands) { + commands = new LinkedList(); + this._commands.set(id, commands); + } + const removeFn = commands.unshift(idOrCommand); + const ret = toDisposable(() => { + removeFn(); + const command = this._commands.get(id); + if (command === null || command === void 0 ? void 0 : command.isEmpty()) { + this._commands.delete(id); + } + }); + this._onDidRegisterCommand.fire(id); + return ret; + } + registerCommandAlias(oldId, newId) { + return CommandsRegistry.registerCommand(oldId, (accessor, ...args) => accessor.get(ICommandService).executeCommand(newId, ...args)); + } + getCommand(id) { + const list = this._commands.get(id); + if (!list || list.isEmpty()) { + return void 0; + } + return Iterable.first(list); + } + getCommands() { + const result = /* @__PURE__ */ new Map(); + for (const key of this._commands.keys()) { + const command = this.getCommand(key); + if (command) { + result.set(key, command); + } + } + return result; + } + }(); + CommandsRegistry.registerCommand("noop", () => { + }); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/contextkey/common/scanner.js +function hintDidYouMean(...meant) { + switch (meant.length) { + case 1: + return localize("contextkey.scanner.hint.didYouMean1", "Did you mean {0}?", meant[0]); + case 2: + return localize("contextkey.scanner.hint.didYouMean2", "Did you mean {0} or {1}?", meant[0], meant[1]); + case 3: + return localize("contextkey.scanner.hint.didYouMean3", "Did you mean {0}, {1} or {2}?", meant[0], meant[1], meant[2]); + default: + return void 0; + } +} +var hintDidYouForgetToOpenOrCloseQuote, hintDidYouForgetToEscapeSlash, Scanner; +var init_scanner = __esm({ + "node_modules/monaco-editor/esm/vs/platform/contextkey/common/scanner.js"() { + init_errors(); + init_nls(); + hintDidYouForgetToOpenOrCloseQuote = localize("contextkey.scanner.hint.didYouForgetToOpenOrCloseQuote", "Did you forget to open or close the quote?"); + hintDidYouForgetToEscapeSlash = localize("contextkey.scanner.hint.didYouForgetToEscapeSlash", "Did you forget to escape the '/' (slash) character? Put two backslashes before it to escape, e.g., '\\\\/'."); + Scanner = class _Scanner { + constructor() { + this._input = ""; + this._start = 0; + this._current = 0; + this._tokens = []; + this._errors = []; + this.stringRe = /[a-zA-Z0-9_<>\-\./\\:\*\?\+\[\]\^,#@;"%\$\p{L}-]+/uy; + } + static getLexeme(token) { + switch (token.type) { + case 0: + return "("; + case 1: + return ")"; + case 2: + return "!"; + case 3: + return token.isTripleEq ? "===" : "=="; + case 4: + return token.isTripleEq ? "!==" : "!="; + case 5: + return "<"; + case 6: + return "<="; + case 7: + return ">="; + case 8: + return ">="; + case 9: + return "=~"; + case 10: + return token.lexeme; + case 11: + return "true"; + case 12: + return "false"; + case 13: + return "in"; + case 14: + return "not"; + case 15: + return "&&"; + case 16: + return "||"; + case 17: + return token.lexeme; + case 18: + return token.lexeme; + case 19: + return token.lexeme; + case 20: + return "EOF"; + default: + throw illegalState(`unhandled token type: ${JSON.stringify(token)}; have you forgotten to add a case?`); + } + } + reset(value) { + this._input = value; + this._start = 0; + this._current = 0; + this._tokens = []; + this._errors = []; + return this; + } + scan() { + while (!this._isAtEnd()) { + this._start = this._current; + const ch = this._advance(); + switch (ch) { + case 40: + this._addToken( + 0 + /* TokenType.LParen */ + ); + break; + case 41: + this._addToken( + 1 + /* TokenType.RParen */ + ); + break; + case 33: + if (this._match( + 61 + /* CharCode.Equals */ + )) { + const isTripleEq = this._match( + 61 + /* CharCode.Equals */ + ); + this._tokens.push({ type: 4, offset: this._start, isTripleEq }); + } else { + this._addToken( + 2 + /* TokenType.Neg */ + ); + } + break; + case 39: + this._quotedString(); + break; + case 47: + this._regex(); + break; + case 61: + if (this._match( + 61 + /* CharCode.Equals */ + )) { + const isTripleEq = this._match( + 61 + /* CharCode.Equals */ + ); + this._tokens.push({ type: 3, offset: this._start, isTripleEq }); + } else if (this._match( + 126 + /* CharCode.Tilde */ + )) { + this._addToken( + 9 + /* TokenType.RegexOp */ + ); + } else { + this._error(hintDidYouMean("==", "=~")); + } + break; + case 60: + this._addToken( + this._match( + 61 + /* CharCode.Equals */ + ) ? 6 : 5 + /* TokenType.Lt */ + ); + break; + case 62: + this._addToken( + this._match( + 61 + /* CharCode.Equals */ + ) ? 8 : 7 + /* TokenType.Gt */ + ); + break; + case 38: + if (this._match( + 38 + /* CharCode.Ampersand */ + )) { + this._addToken( + 15 + /* TokenType.And */ + ); + } else { + this._error(hintDidYouMean("&&")); + } + break; + case 124: + if (this._match( + 124 + /* CharCode.Pipe */ + )) { + this._addToken( + 16 + /* TokenType.Or */ + ); + } else { + this._error(hintDidYouMean("||")); + } + break; + // TODO@ulugbekna: 1) rewrite using a regex 2) reconsider what characters are considered whitespace, including unicode, nbsp, etc. + case 32: + case 13: + case 9: + case 10: + case 160: + break; + default: + this._string(); + } + } + this._start = this._current; + this._addToken( + 20 + /* TokenType.EOF */ + ); + return Array.from(this._tokens); + } + _match(expected) { + if (this._isAtEnd()) { + return false; + } + if (this._input.charCodeAt(this._current) !== expected) { + return false; + } + this._current++; + return true; + } + _advance() { + return this._input.charCodeAt(this._current++); + } + _peek() { + return this._isAtEnd() ? 0 : this._input.charCodeAt(this._current); + } + _addToken(type) { + this._tokens.push({ type, offset: this._start }); + } + _error(additional) { + const offset = this._start; + const lexeme = this._input.substring(this._start, this._current); + const errToken = { type: 19, offset: this._start, lexeme }; + this._errors.push({ offset, lexeme, additionalInfo: additional }); + this._tokens.push(errToken); + } + _string() { + this.stringRe.lastIndex = this._start; + const match2 = this.stringRe.exec(this._input); + if (match2) { + this._current = this._start + match2[0].length; + const lexeme = this._input.substring(this._start, this._current); + const keyword = _Scanner._keywords.get(lexeme); + if (keyword) { + this._addToken(keyword); + } else { + this._tokens.push({ type: 17, lexeme, offset: this._start }); + } + } + } + // captures the lexeme without the leading and trailing ' + _quotedString() { + while (this._peek() !== 39 && !this._isAtEnd()) { + this._advance(); + } + if (this._isAtEnd()) { + this._error(hintDidYouForgetToOpenOrCloseQuote); + return; + } + this._advance(); + this._tokens.push({ type: 18, lexeme: this._input.substring(this._start + 1, this._current - 1), offset: this._start + 1 }); + } + /* + * Lexing a regex expression: /.../[igsmyu]* + * Based on https://github.com/microsoft/TypeScript/blob/9247ef115e617805983740ba795d7a8164babf89/src/compiler/scanner.ts#L2129-L2181 + * + * Note that we want slashes within a regex to be escaped, e.g., /file:\\/\\/\\// should match `file:///` + */ + _regex() { + let p = this._current; + let inEscape = false; + let inCharacterClass = false; + while (true) { + if (p >= this._input.length) { + this._current = p; + this._error(hintDidYouForgetToEscapeSlash); + return; + } + const ch = this._input.charCodeAt(p); + if (inEscape) { + inEscape = false; + } else if (ch === 47 && !inCharacterClass) { + p++; + break; + } else if (ch === 91) { + inCharacterClass = true; + } else if (ch === 92) { + inEscape = true; + } else if (ch === 93) { + inCharacterClass = false; + } + p++; + } + while (p < this._input.length && _Scanner._regexFlags.has(this._input.charCodeAt(p))) { + p++; + } + this._current = p; + const lexeme = this._input.substring(this._start, this._current); + this._tokens.push({ type: 10, lexeme, offset: this._start }); + } + _isAtEnd() { + return this._current >= this._input.length; + } + }; + Scanner._regexFlags = new Set(["i", "g", "s", "m", "y", "u"].map((ch) => ch.charCodeAt(0))); + Scanner._keywords = /* @__PURE__ */ new Map([ + [ + "not", + 14 + /* TokenType.Not */ + ], + [ + "in", + 13 + /* TokenType.In */ + ], + [ + "false", + 12 + /* TokenType.False */ + ], + [ + "true", + 11 + /* TokenType.True */ + ] + ]); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/contextkey/common/contextkey.js +function expressionsAreEqualWithConstantSubstitution(a3, b) { + const aExpr = a3 ? a3.substituteConstants() : void 0; + const bExpr = b ? b.substituteConstants() : void 0; + if (!aExpr && !bExpr) { + return true; + } + if (!aExpr || !bExpr) { + return false; + } + return aExpr.equals(bExpr); +} +function cmp(a3, b) { + return a3.cmp(b); +} +function withFloatOrStr(value, callback) { + if (typeof value === "string") { + const n = parseFloat(value); + if (!isNaN(n)) { + value = n; + } + } + if (typeof value === "string" || typeof value === "number") { + return callback(value); + } + return ContextKeyFalseExpr.INSTANCE; +} +function eliminateConstantsInArray(arr) { + let newArr = null; + for (let i = 0, len = arr.length; i < len; i++) { + const newExpr = arr[i].substituteConstants(); + if (arr[i] !== newExpr) { + if (newArr === null) { + newArr = []; + for (let j = 0; j < i; j++) { + newArr[j] = arr[j]; + } + } + } + if (newArr !== null) { + newArr[i] = newExpr; + } + } + if (newArr === null) { + return arr; + } + return newArr; +} +function cmp1(key1, key2) { + if (key1 < key2) { + return -1; + } + if (key1 > key2) { + return 1; + } + return 0; +} +function cmp2(key1, value1, key2, value2) { + if (key1 < key2) { + return -1; + } + if (key1 > key2) { + return 1; + } + if (value1 < value2) { + return -1; + } + if (value1 > value2) { + return 1; + } + return 0; +} +function implies(p, q) { + if (p.type === 0 || q.type === 1) { + return true; + } + if (p.type === 9) { + if (q.type === 9) { + return allElementsIncluded(p.expr, q.expr); + } + return false; + } + if (q.type === 9) { + for (const element of q.expr) { + if (implies(p, element)) { + return true; + } + } + return false; + } + if (p.type === 6) { + if (q.type === 6) { + return allElementsIncluded(q.expr, p.expr); + } + for (const element of p.expr) { + if (implies(element, q)) { + return true; + } + } + return false; + } + return p.equals(q); +} +function allElementsIncluded(p, q) { + let pIndex = 0; + let qIndex = 0; + while (pIndex < p.length && qIndex < q.length) { + const cmp3 = p[pIndex].cmp(q[qIndex]); + if (cmp3 < 0) { + return false; + } else if (cmp3 === 0) { + pIndex++; + qIndex++; + } else { + qIndex++; + } + } + return pIndex === p.length; +} +function getTerminals(node) { + if (node.type === 9) { + return node.expr; + } + return [node]; +} +var CONSTANT_VALUES, hasOwnProperty, defaultConfig, errorEmptyString, hintEmptyString, errorNoInAfterNot, errorClosingParenthesis, errorUnexpectedToken, hintUnexpectedToken, errorUnexpectedEOF, hintUnexpectedEOF, Parser, ContextKeyExpr, ContextKeyFalseExpr, ContextKeyTrueExpr, ContextKeyDefinedExpr, ContextKeyEqualsExpr, ContextKeyInExpr, ContextKeyNotInExpr, ContextKeyNotEqualsExpr, ContextKeyNotExpr, ContextKeyGreaterExpr, ContextKeyGreaterEqualsExpr, ContextKeySmallerExpr, ContextKeySmallerEqualsExpr, ContextKeyRegexExpr, ContextKeyNotRegexExpr, ContextKeyAndExpr, ContextKeyOrExpr, RawContextKey, IContextKeyService; +var init_contextkey = __esm({ + "node_modules/monaco-editor/esm/vs/platform/contextkey/common/contextkey.js"() { + init_platform(); + init_strings(); + init_scanner(); + init_instantiation(); + init_nls(); + CONSTANT_VALUES = /* @__PURE__ */ new Map(); + CONSTANT_VALUES.set("false", false); + CONSTANT_VALUES.set("true", true); + CONSTANT_VALUES.set("isMac", isMacintosh); + CONSTANT_VALUES.set("isLinux", isLinux); + CONSTANT_VALUES.set("isWindows", isWindows); + CONSTANT_VALUES.set("isWeb", isWeb); + CONSTANT_VALUES.set("isMacNative", isMacintosh && !isWeb); + CONSTANT_VALUES.set("isEdge", isEdge); + CONSTANT_VALUES.set("isFirefox", isFirefox); + CONSTANT_VALUES.set("isChrome", isChrome); + CONSTANT_VALUES.set("isSafari", isSafari); + hasOwnProperty = Object.prototype.hasOwnProperty; + defaultConfig = { + regexParsingWithErrorRecovery: true + }; + errorEmptyString = localize("contextkey.parser.error.emptyString", "Empty context key expression"); + hintEmptyString = localize("contextkey.parser.error.emptyString.hint", "Did you forget to write an expression? You can also put 'false' or 'true' to always evaluate to false or true, respectively."); + errorNoInAfterNot = localize("contextkey.parser.error.noInAfterNot", "'in' after 'not'."); + errorClosingParenthesis = localize("contextkey.parser.error.closingParenthesis", "closing parenthesis ')'"); + errorUnexpectedToken = localize("contextkey.parser.error.unexpectedToken", "Unexpected token"); + hintUnexpectedToken = localize("contextkey.parser.error.unexpectedToken.hint", "Did you forget to put && or || before the token?"); + errorUnexpectedEOF = localize("contextkey.parser.error.unexpectedEOF", "Unexpected end of expression"); + hintUnexpectedEOF = localize("contextkey.parser.error.unexpectedEOF.hint", "Did you forget to put a context key?"); + Parser = class _Parser { + constructor(_config = defaultConfig) { + this._config = _config; + this._scanner = new Scanner(); + this._tokens = []; + this._current = 0; + this._parsingErrors = []; + this._flagsGYRe = /g|y/g; + } + /** + * Parse a context key expression. + * + * @param input the expression to parse + * @returns the parsed expression or `undefined` if there's an error - call `lexingErrors` and `parsingErrors` to see the errors + */ + parse(input) { + if (input === "") { + this._parsingErrors.push({ message: errorEmptyString, offset: 0, lexeme: "", additionalInfo: hintEmptyString }); + return void 0; + } + this._tokens = this._scanner.reset(input).scan(); + this._current = 0; + this._parsingErrors = []; + try { + const expr = this._expr(); + if (!this._isAtEnd()) { + const peek = this._peek(); + const additionalInfo = peek.type === 17 ? hintUnexpectedToken : void 0; + this._parsingErrors.push({ message: errorUnexpectedToken, offset: peek.offset, lexeme: Scanner.getLexeme(peek), additionalInfo }); + throw _Parser._parseError; + } + return expr; + } catch (e) { + if (!(e === _Parser._parseError)) { + throw e; + } + return void 0; + } + } + _expr() { + return this._or(); + } + _or() { + const expr = [this._and()]; + while (this._matchOne( + 16 + /* TokenType.Or */ + )) { + const right = this._and(); + expr.push(right); + } + return expr.length === 1 ? expr[0] : ContextKeyExpr.or(...expr); + } + _and() { + const expr = [this._term()]; + while (this._matchOne( + 15 + /* TokenType.And */ + )) { + const right = this._term(); + expr.push(right); + } + return expr.length === 1 ? expr[0] : ContextKeyExpr.and(...expr); + } + _term() { + if (this._matchOne( + 2 + /* TokenType.Neg */ + )) { + const peek = this._peek(); + switch (peek.type) { + case 11: + this._advance(); + return ContextKeyFalseExpr.INSTANCE; + case 12: + this._advance(); + return ContextKeyTrueExpr.INSTANCE; + case 0: { + this._advance(); + const expr = this._expr(); + this._consume(1, errorClosingParenthesis); + return expr === null || expr === void 0 ? void 0 : expr.negate(); + } + case 17: + this._advance(); + return ContextKeyNotExpr.create(peek.lexeme); + default: + throw this._errExpectedButGot(`KEY | true | false | '(' expression ')'`, peek); + } + } + return this._primary(); + } + _primary() { + const peek = this._peek(); + switch (peek.type) { + case 11: + this._advance(); + return ContextKeyExpr.true(); + case 12: + this._advance(); + return ContextKeyExpr.false(); + case 0: { + this._advance(); + const expr = this._expr(); + this._consume(1, errorClosingParenthesis); + return expr; + } + case 17: { + const key = peek.lexeme; + this._advance(); + if (this._matchOne( + 9 + /* TokenType.RegexOp */ + )) { + const expr = this._peek(); + if (!this._config.regexParsingWithErrorRecovery) { + this._advance(); + if (expr.type !== 10) { + throw this._errExpectedButGot(`REGEX`, expr); + } + const regexLexeme = expr.lexeme; + const closingSlashIndex = regexLexeme.lastIndexOf("/"); + const flags = closingSlashIndex === regexLexeme.length - 1 ? void 0 : this._removeFlagsGY(regexLexeme.substring(closingSlashIndex + 1)); + let regexp; + try { + regexp = new RegExp(regexLexeme.substring(1, closingSlashIndex), flags); + } catch (e) { + throw this._errExpectedButGot(`REGEX`, expr); + } + return ContextKeyRegexExpr.create(key, regexp); + } + switch (expr.type) { + case 10: + case 19: { + const lexemeReconstruction = [expr.lexeme]; + this._advance(); + let followingToken = this._peek(); + let parenBalance = 0; + for (let i = 0; i < expr.lexeme.length; i++) { + if (expr.lexeme.charCodeAt(i) === 40) { + parenBalance++; + } else if (expr.lexeme.charCodeAt(i) === 41) { + parenBalance--; + } + } + while (!this._isAtEnd() && followingToken.type !== 15 && followingToken.type !== 16) { + switch (followingToken.type) { + case 0: + parenBalance++; + break; + case 1: + parenBalance--; + break; + case 10: + case 18: + for (let i = 0; i < followingToken.lexeme.length; i++) { + if (followingToken.lexeme.charCodeAt(i) === 40) { + parenBalance++; + } else if (expr.lexeme.charCodeAt(i) === 41) { + parenBalance--; + } + } + } + if (parenBalance < 0) { + break; + } + lexemeReconstruction.push(Scanner.getLexeme(followingToken)); + this._advance(); + followingToken = this._peek(); + } + const regexLexeme = lexemeReconstruction.join(""); + const closingSlashIndex = regexLexeme.lastIndexOf("/"); + const flags = closingSlashIndex === regexLexeme.length - 1 ? void 0 : this._removeFlagsGY(regexLexeme.substring(closingSlashIndex + 1)); + let regexp; + try { + regexp = new RegExp(regexLexeme.substring(1, closingSlashIndex), flags); + } catch (e) { + throw this._errExpectedButGot(`REGEX`, expr); + } + return ContextKeyExpr.regex(key, regexp); + } + case 18: { + const serializedValue = expr.lexeme; + this._advance(); + let regex = null; + if (!isFalsyOrWhitespace(serializedValue)) { + const start = serializedValue.indexOf("/"); + const end = serializedValue.lastIndexOf("/"); + if (start !== end && start >= 0) { + const value = serializedValue.slice(start + 1, end); + const caseIgnoreFlag = serializedValue[end + 1] === "i" ? "i" : ""; + try { + regex = new RegExp(value, caseIgnoreFlag); + } catch (_e2) { + throw this._errExpectedButGot(`REGEX`, expr); + } + } + } + if (regex === null) { + throw this._errExpectedButGot("REGEX", expr); + } + return ContextKeyRegexExpr.create(key, regex); + } + default: + throw this._errExpectedButGot("REGEX", this._peek()); + } + } + if (this._matchOne( + 14 + /* TokenType.Not */ + )) { + this._consume(13, errorNoInAfterNot); + const right = this._value(); + return ContextKeyExpr.notIn(key, right); + } + const maybeOp = this._peek().type; + switch (maybeOp) { + case 3: { + this._advance(); + const right = this._value(); + if (this._previous().type === 18) { + return ContextKeyExpr.equals(key, right); + } + switch (right) { + case "true": + return ContextKeyExpr.has(key); + case "false": + return ContextKeyExpr.not(key); + default: + return ContextKeyExpr.equals(key, right); + } + } + case 4: { + this._advance(); + const right = this._value(); + if (this._previous().type === 18) { + return ContextKeyExpr.notEquals(key, right); + } + switch (right) { + case "true": + return ContextKeyExpr.not(key); + case "false": + return ContextKeyExpr.has(key); + default: + return ContextKeyExpr.notEquals(key, right); + } + } + // TODO: ContextKeyExpr.smaller(key, right) accepts only `number` as `right` AND during eval of this node, we just eval to `false` if `right` is not a number + // consequently, package.json linter should _warn_ the user if they're passing undesired things to ops + case 5: + this._advance(); + return ContextKeySmallerExpr.create(key, this._value()); + case 6: + this._advance(); + return ContextKeySmallerEqualsExpr.create(key, this._value()); + case 7: + this._advance(); + return ContextKeyGreaterExpr.create(key, this._value()); + case 8: + this._advance(); + return ContextKeyGreaterEqualsExpr.create(key, this._value()); + case 13: + this._advance(); + return ContextKeyExpr.in(key, this._value()); + default: + return ContextKeyExpr.has(key); + } + } + case 20: + this._parsingErrors.push({ message: errorUnexpectedEOF, offset: peek.offset, lexeme: "", additionalInfo: hintUnexpectedEOF }); + throw _Parser._parseError; + default: + throw this._errExpectedButGot(`true | false | KEY + | KEY '=~' REGEX + | KEY ('==' | '!=' | '<' | '<=' | '>' | '>=' | 'in' | 'not' 'in') value`, this._peek()); + } + } + _value() { + const token = this._peek(); + switch (token.type) { + case 17: + case 18: + this._advance(); + return token.lexeme; + case 11: + this._advance(); + return "true"; + case 12: + this._advance(); + return "false"; + case 13: + this._advance(); + return "in"; + default: + return ""; + } + } + _removeFlagsGY(flags) { + return flags.replaceAll(this._flagsGYRe, ""); + } + // careful: this can throw if current token is the initial one (ie index = 0) + _previous() { + return this._tokens[this._current - 1]; + } + _matchOne(token) { + if (this._check(token)) { + this._advance(); + return true; + } + return false; + } + _advance() { + if (!this._isAtEnd()) { + this._current++; + } + return this._previous(); + } + _consume(type, message) { + if (this._check(type)) { + return this._advance(); + } + throw this._errExpectedButGot(message, this._peek()); + } + _errExpectedButGot(expected, got, additionalInfo) { + const message = localize("contextkey.parser.error.expectedButGot", "Expected: {0}\nReceived: '{1}'.", expected, Scanner.getLexeme(got)); + const offset = got.offset; + const lexeme = Scanner.getLexeme(got); + this._parsingErrors.push({ message, offset, lexeme, additionalInfo }); + return _Parser._parseError; + } + _check(type) { + return this._peek().type === type; + } + _peek() { + return this._tokens[this._current]; + } + _isAtEnd() { + return this._peek().type === 20; + } + }; + Parser._parseError = new Error(); + ContextKeyExpr = class { + static false() { + return ContextKeyFalseExpr.INSTANCE; + } + static true() { + return ContextKeyTrueExpr.INSTANCE; + } + static has(key) { + return ContextKeyDefinedExpr.create(key); + } + static equals(key, value) { + return ContextKeyEqualsExpr.create(key, value); + } + static notEquals(key, value) { + return ContextKeyNotEqualsExpr.create(key, value); + } + static regex(key, value) { + return ContextKeyRegexExpr.create(key, value); + } + static in(key, value) { + return ContextKeyInExpr.create(key, value); + } + static notIn(key, value) { + return ContextKeyNotInExpr.create(key, value); + } + static not(key) { + return ContextKeyNotExpr.create(key); + } + static and(...expr) { + return ContextKeyAndExpr.create(expr, null, true); + } + static or(...expr) { + return ContextKeyOrExpr.create(expr, null, true); + } + static deserialize(serialized) { + if (serialized === void 0 || serialized === null) { + return void 0; + } + const expr = this._parser.parse(serialized); + return expr; + } + }; + ContextKeyExpr._parser = new Parser({ regexParsingWithErrorRecovery: false }); + ContextKeyFalseExpr = class { + constructor() { + this.type = 0; + } + cmp(other) { + return this.type - other.type; + } + equals(other) { + return other.type === this.type; + } + substituteConstants() { + return this; + } + evaluate(context) { + return false; + } + serialize() { + return "false"; + } + keys() { + return []; + } + negate() { + return ContextKeyTrueExpr.INSTANCE; + } + }; + ContextKeyFalseExpr.INSTANCE = new ContextKeyFalseExpr(); + ContextKeyTrueExpr = class { + constructor() { + this.type = 1; + } + cmp(other) { + return this.type - other.type; + } + equals(other) { + return other.type === this.type; + } + substituteConstants() { + return this; + } + evaluate(context) { + return true; + } + serialize() { + return "true"; + } + keys() { + return []; + } + negate() { + return ContextKeyFalseExpr.INSTANCE; + } + }; + ContextKeyTrueExpr.INSTANCE = new ContextKeyTrueExpr(); + ContextKeyDefinedExpr = class _ContextKeyDefinedExpr { + static create(key, negated = null) { + const constantValue = CONSTANT_VALUES.get(key); + if (typeof constantValue === "boolean") { + return constantValue ? ContextKeyTrueExpr.INSTANCE : ContextKeyFalseExpr.INSTANCE; + } + return new _ContextKeyDefinedExpr(key, negated); + } + constructor(key, negated) { + this.key = key; + this.negated = negated; + this.type = 2; + } + cmp(other) { + if (other.type !== this.type) { + return this.type - other.type; + } + return cmp1(this.key, other.key); + } + equals(other) { + if (other.type === this.type) { + return this.key === other.key; + } + return false; + } + substituteConstants() { + const constantValue = CONSTANT_VALUES.get(this.key); + if (typeof constantValue === "boolean") { + return constantValue ? ContextKeyTrueExpr.INSTANCE : ContextKeyFalseExpr.INSTANCE; + } + return this; + } + evaluate(context) { + return !!context.getValue(this.key); + } + serialize() { + return this.key; + } + keys() { + return [this.key]; + } + negate() { + if (!this.negated) { + this.negated = ContextKeyNotExpr.create(this.key, this); + } + return this.negated; + } + }; + ContextKeyEqualsExpr = class _ContextKeyEqualsExpr { + static create(key, value, negated = null) { + if (typeof value === "boolean") { + return value ? ContextKeyDefinedExpr.create(key, negated) : ContextKeyNotExpr.create(key, negated); + } + const constantValue = CONSTANT_VALUES.get(key); + if (typeof constantValue === "boolean") { + const trueValue = constantValue ? "true" : "false"; + return value === trueValue ? ContextKeyTrueExpr.INSTANCE : ContextKeyFalseExpr.INSTANCE; + } + return new _ContextKeyEqualsExpr(key, value, negated); + } + constructor(key, value, negated) { + this.key = key; + this.value = value; + this.negated = negated; + this.type = 4; + } + cmp(other) { + if (other.type !== this.type) { + return this.type - other.type; + } + return cmp2(this.key, this.value, other.key, other.value); + } + equals(other) { + if (other.type === this.type) { + return this.key === other.key && this.value === other.value; + } + return false; + } + substituteConstants() { + const constantValue = CONSTANT_VALUES.get(this.key); + if (typeof constantValue === "boolean") { + const trueValue = constantValue ? "true" : "false"; + return this.value === trueValue ? ContextKeyTrueExpr.INSTANCE : ContextKeyFalseExpr.INSTANCE; + } + return this; + } + evaluate(context) { + return context.getValue(this.key) == this.value; + } + serialize() { + return `${this.key} == '${this.value}'`; + } + keys() { + return [this.key]; + } + negate() { + if (!this.negated) { + this.negated = ContextKeyNotEqualsExpr.create(this.key, this.value, this); + } + return this.negated; + } + }; + ContextKeyInExpr = class _ContextKeyInExpr { + static create(key, valueKey) { + return new _ContextKeyInExpr(key, valueKey); + } + constructor(key, valueKey) { + this.key = key; + this.valueKey = valueKey; + this.type = 10; + this.negated = null; + } + cmp(other) { + if (other.type !== this.type) { + return this.type - other.type; + } + return cmp2(this.key, this.valueKey, other.key, other.valueKey); + } + equals(other) { + if (other.type === this.type) { + return this.key === other.key && this.valueKey === other.valueKey; + } + return false; + } + substituteConstants() { + return this; + } + evaluate(context) { + const source = context.getValue(this.valueKey); + const item = context.getValue(this.key); + if (Array.isArray(source)) { + return source.includes(item); + } + if (typeof item === "string" && typeof source === "object" && source !== null) { + return hasOwnProperty.call(source, item); + } + return false; + } + serialize() { + return `${this.key} in '${this.valueKey}'`; + } + keys() { + return [this.key, this.valueKey]; + } + negate() { + if (!this.negated) { + this.negated = ContextKeyNotInExpr.create(this.key, this.valueKey); + } + return this.negated; + } + }; + ContextKeyNotInExpr = class _ContextKeyNotInExpr { + static create(key, valueKey) { + return new _ContextKeyNotInExpr(key, valueKey); + } + constructor(key, valueKey) { + this.key = key; + this.valueKey = valueKey; + this.type = 11; + this._negated = ContextKeyInExpr.create(key, valueKey); + } + cmp(other) { + if (other.type !== this.type) { + return this.type - other.type; + } + return this._negated.cmp(other._negated); + } + equals(other) { + if (other.type === this.type) { + return this._negated.equals(other._negated); + } + return false; + } + substituteConstants() { + return this; + } + evaluate(context) { + return !this._negated.evaluate(context); + } + serialize() { + return `${this.key} not in '${this.valueKey}'`; + } + keys() { + return this._negated.keys(); + } + negate() { + return this._negated; + } + }; + ContextKeyNotEqualsExpr = class _ContextKeyNotEqualsExpr { + static create(key, value, negated = null) { + if (typeof value === "boolean") { + if (value) { + return ContextKeyNotExpr.create(key, negated); + } + return ContextKeyDefinedExpr.create(key, negated); + } + const constantValue = CONSTANT_VALUES.get(key); + if (typeof constantValue === "boolean") { + const falseValue = constantValue ? "true" : "false"; + return value === falseValue ? ContextKeyFalseExpr.INSTANCE : ContextKeyTrueExpr.INSTANCE; + } + return new _ContextKeyNotEqualsExpr(key, value, negated); + } + constructor(key, value, negated) { + this.key = key; + this.value = value; + this.negated = negated; + this.type = 5; + } + cmp(other) { + if (other.type !== this.type) { + return this.type - other.type; + } + return cmp2(this.key, this.value, other.key, other.value); + } + equals(other) { + if (other.type === this.type) { + return this.key === other.key && this.value === other.value; + } + return false; + } + substituteConstants() { + const constantValue = CONSTANT_VALUES.get(this.key); + if (typeof constantValue === "boolean") { + const falseValue = constantValue ? "true" : "false"; + return this.value === falseValue ? ContextKeyFalseExpr.INSTANCE : ContextKeyTrueExpr.INSTANCE; + } + return this; + } + evaluate(context) { + return context.getValue(this.key) != this.value; + } + serialize() { + return `${this.key} != '${this.value}'`; + } + keys() { + return [this.key]; + } + negate() { + if (!this.negated) { + this.negated = ContextKeyEqualsExpr.create(this.key, this.value, this); + } + return this.negated; + } + }; + ContextKeyNotExpr = class _ContextKeyNotExpr { + static create(key, negated = null) { + const constantValue = CONSTANT_VALUES.get(key); + if (typeof constantValue === "boolean") { + return constantValue ? ContextKeyFalseExpr.INSTANCE : ContextKeyTrueExpr.INSTANCE; + } + return new _ContextKeyNotExpr(key, negated); + } + constructor(key, negated) { + this.key = key; + this.negated = negated; + this.type = 3; + } + cmp(other) { + if (other.type !== this.type) { + return this.type - other.type; + } + return cmp1(this.key, other.key); + } + equals(other) { + if (other.type === this.type) { + return this.key === other.key; + } + return false; + } + substituteConstants() { + const constantValue = CONSTANT_VALUES.get(this.key); + if (typeof constantValue === "boolean") { + return constantValue ? ContextKeyFalseExpr.INSTANCE : ContextKeyTrueExpr.INSTANCE; + } + return this; + } + evaluate(context) { + return !context.getValue(this.key); + } + serialize() { + return `!${this.key}`; + } + keys() { + return [this.key]; + } + negate() { + if (!this.negated) { + this.negated = ContextKeyDefinedExpr.create(this.key, this); + } + return this.negated; + } + }; + ContextKeyGreaterExpr = class _ContextKeyGreaterExpr { + static create(key, _value, negated = null) { + return withFloatOrStr(_value, (value) => new _ContextKeyGreaterExpr(key, value, negated)); + } + constructor(key, value, negated) { + this.key = key; + this.value = value; + this.negated = negated; + this.type = 12; + } + cmp(other) { + if (other.type !== this.type) { + return this.type - other.type; + } + return cmp2(this.key, this.value, other.key, other.value); + } + equals(other) { + if (other.type === this.type) { + return this.key === other.key && this.value === other.value; + } + return false; + } + substituteConstants() { + return this; + } + evaluate(context) { + if (typeof this.value === "string") { + return false; + } + return parseFloat(context.getValue(this.key)) > this.value; + } + serialize() { + return `${this.key} > ${this.value}`; + } + keys() { + return [this.key]; + } + negate() { + if (!this.negated) { + this.negated = ContextKeySmallerEqualsExpr.create(this.key, this.value, this); + } + return this.negated; + } + }; + ContextKeyGreaterEqualsExpr = class _ContextKeyGreaterEqualsExpr { + static create(key, _value, negated = null) { + return withFloatOrStr(_value, (value) => new _ContextKeyGreaterEqualsExpr(key, value, negated)); + } + constructor(key, value, negated) { + this.key = key; + this.value = value; + this.negated = negated; + this.type = 13; + } + cmp(other) { + if (other.type !== this.type) { + return this.type - other.type; + } + return cmp2(this.key, this.value, other.key, other.value); + } + equals(other) { + if (other.type === this.type) { + return this.key === other.key && this.value === other.value; + } + return false; + } + substituteConstants() { + return this; + } + evaluate(context) { + if (typeof this.value === "string") { + return false; + } + return parseFloat(context.getValue(this.key)) >= this.value; + } + serialize() { + return `${this.key} >= ${this.value}`; + } + keys() { + return [this.key]; + } + negate() { + if (!this.negated) { + this.negated = ContextKeySmallerExpr.create(this.key, this.value, this); + } + return this.negated; + } + }; + ContextKeySmallerExpr = class _ContextKeySmallerExpr { + static create(key, _value, negated = null) { + return withFloatOrStr(_value, (value) => new _ContextKeySmallerExpr(key, value, negated)); + } + constructor(key, value, negated) { + this.key = key; + this.value = value; + this.negated = negated; + this.type = 14; + } + cmp(other) { + if (other.type !== this.type) { + return this.type - other.type; + } + return cmp2(this.key, this.value, other.key, other.value); + } + equals(other) { + if (other.type === this.type) { + return this.key === other.key && this.value === other.value; + } + return false; + } + substituteConstants() { + return this; + } + evaluate(context) { + if (typeof this.value === "string") { + return false; + } + return parseFloat(context.getValue(this.key)) < this.value; + } + serialize() { + return `${this.key} < ${this.value}`; + } + keys() { + return [this.key]; + } + negate() { + if (!this.negated) { + this.negated = ContextKeyGreaterEqualsExpr.create(this.key, this.value, this); + } + return this.negated; + } + }; + ContextKeySmallerEqualsExpr = class _ContextKeySmallerEqualsExpr { + static create(key, _value, negated = null) { + return withFloatOrStr(_value, (value) => new _ContextKeySmallerEqualsExpr(key, value, negated)); + } + constructor(key, value, negated) { + this.key = key; + this.value = value; + this.negated = negated; + this.type = 15; + } + cmp(other) { + if (other.type !== this.type) { + return this.type - other.type; + } + return cmp2(this.key, this.value, other.key, other.value); + } + equals(other) { + if (other.type === this.type) { + return this.key === other.key && this.value === other.value; + } + return false; + } + substituteConstants() { + return this; + } + evaluate(context) { + if (typeof this.value === "string") { + return false; + } + return parseFloat(context.getValue(this.key)) <= this.value; + } + serialize() { + return `${this.key} <= ${this.value}`; + } + keys() { + return [this.key]; + } + negate() { + if (!this.negated) { + this.negated = ContextKeyGreaterExpr.create(this.key, this.value, this); + } + return this.negated; + } + }; + ContextKeyRegexExpr = class _ContextKeyRegexExpr { + static create(key, regexp) { + return new _ContextKeyRegexExpr(key, regexp); + } + constructor(key, regexp) { + this.key = key; + this.regexp = regexp; + this.type = 7; + this.negated = null; + } + cmp(other) { + if (other.type !== this.type) { + return this.type - other.type; + } + if (this.key < other.key) { + return -1; + } + if (this.key > other.key) { + return 1; + } + const thisSource = this.regexp ? this.regexp.source : ""; + const otherSource = other.regexp ? other.regexp.source : ""; + if (thisSource < otherSource) { + return -1; + } + if (thisSource > otherSource) { + return 1; + } + return 0; + } + equals(other) { + if (other.type === this.type) { + const thisSource = this.regexp ? this.regexp.source : ""; + const otherSource = other.regexp ? other.regexp.source : ""; + return this.key === other.key && thisSource === otherSource; + } + return false; + } + substituteConstants() { + return this; + } + evaluate(context) { + const value = context.getValue(this.key); + return this.regexp ? this.regexp.test(value) : false; + } + serialize() { + const value = this.regexp ? `/${this.regexp.source}/${this.regexp.flags}` : "/invalid/"; + return `${this.key} =~ ${value}`; + } + keys() { + return [this.key]; + } + negate() { + if (!this.negated) { + this.negated = ContextKeyNotRegexExpr.create(this); + } + return this.negated; + } + }; + ContextKeyNotRegexExpr = class _ContextKeyNotRegexExpr { + static create(actual) { + return new _ContextKeyNotRegexExpr(actual); + } + constructor(_actual) { + this._actual = _actual; + this.type = 8; + } + cmp(other) { + if (other.type !== this.type) { + return this.type - other.type; + } + return this._actual.cmp(other._actual); + } + equals(other) { + if (other.type === this.type) { + return this._actual.equals(other._actual); + } + return false; + } + substituteConstants() { + return this; + } + evaluate(context) { + return !this._actual.evaluate(context); + } + serialize() { + return `!(${this._actual.serialize()})`; + } + keys() { + return this._actual.keys(); + } + negate() { + return this._actual; + } + }; + ContextKeyAndExpr = class _ContextKeyAndExpr { + static create(_expr, negated, extraRedundantCheck) { + return _ContextKeyAndExpr._normalizeArr(_expr, negated, extraRedundantCheck); + } + constructor(expr, negated) { + this.expr = expr; + this.negated = negated; + this.type = 6; + } + cmp(other) { + if (other.type !== this.type) { + return this.type - other.type; + } + if (this.expr.length < other.expr.length) { + return -1; + } + if (this.expr.length > other.expr.length) { + return 1; + } + for (let i = 0, len = this.expr.length; i < len; i++) { + const r = cmp(this.expr[i], other.expr[i]); + if (r !== 0) { + return r; + } + } + return 0; + } + equals(other) { + if (other.type === this.type) { + if (this.expr.length !== other.expr.length) { + return false; + } + for (let i = 0, len = this.expr.length; i < len; i++) { + if (!this.expr[i].equals(other.expr[i])) { + return false; + } + } + return true; + } + return false; + } + substituteConstants() { + const exprArr = eliminateConstantsInArray(this.expr); + if (exprArr === this.expr) { + return this; + } + return _ContextKeyAndExpr.create(exprArr, this.negated, false); + } + evaluate(context) { + for (let i = 0, len = this.expr.length; i < len; i++) { + if (!this.expr[i].evaluate(context)) { + return false; + } + } + return true; + } + static _normalizeArr(arr, negated, extraRedundantCheck) { + const expr = []; + let hasTrue = false; + for (const e of arr) { + if (!e) { + continue; + } + if (e.type === 1) { + hasTrue = true; + continue; + } + if (e.type === 0) { + return ContextKeyFalseExpr.INSTANCE; + } + if (e.type === 6) { + expr.push(...e.expr); + continue; + } + expr.push(e); + } + if (expr.length === 0 && hasTrue) { + return ContextKeyTrueExpr.INSTANCE; + } + if (expr.length === 0) { + return void 0; + } + if (expr.length === 1) { + return expr[0]; + } + expr.sort(cmp); + for (let i = 1; i < expr.length; i++) { + if (expr[i - 1].equals(expr[i])) { + expr.splice(i, 1); + i--; + } + } + if (expr.length === 1) { + return expr[0]; + } + while (expr.length > 1) { + const lastElement = expr[expr.length - 1]; + if (lastElement.type !== 9) { + break; + } + expr.pop(); + const secondToLastElement = expr.pop(); + const isFinished = expr.length === 0; + const resultElement = ContextKeyOrExpr.create(lastElement.expr.map((el) => _ContextKeyAndExpr.create([el, secondToLastElement], null, extraRedundantCheck)), null, isFinished); + if (resultElement) { + expr.push(resultElement); + expr.sort(cmp); + } + } + if (expr.length === 1) { + return expr[0]; + } + if (extraRedundantCheck) { + for (let i = 0; i < expr.length; i++) { + for (let j = i + 1; j < expr.length; j++) { + if (expr[i].negate().equals(expr[j])) { + return ContextKeyFalseExpr.INSTANCE; + } + } + } + if (expr.length === 1) { + return expr[0]; + } + } + return new _ContextKeyAndExpr(expr, negated); + } + serialize() { + return this.expr.map((e) => e.serialize()).join(" && "); + } + keys() { + const result = []; + for (const expr of this.expr) { + result.push(...expr.keys()); + } + return result; + } + negate() { + if (!this.negated) { + const result = []; + for (const expr of this.expr) { + result.push(expr.negate()); + } + this.negated = ContextKeyOrExpr.create(result, this, true); + } + return this.negated; + } + }; + ContextKeyOrExpr = class _ContextKeyOrExpr { + static create(_expr, negated, extraRedundantCheck) { + return _ContextKeyOrExpr._normalizeArr(_expr, negated, extraRedundantCheck); + } + constructor(expr, negated) { + this.expr = expr; + this.negated = negated; + this.type = 9; + } + cmp(other) { + if (other.type !== this.type) { + return this.type - other.type; + } + if (this.expr.length < other.expr.length) { + return -1; + } + if (this.expr.length > other.expr.length) { + return 1; + } + for (let i = 0, len = this.expr.length; i < len; i++) { + const r = cmp(this.expr[i], other.expr[i]); + if (r !== 0) { + return r; + } + } + return 0; + } + equals(other) { + if (other.type === this.type) { + if (this.expr.length !== other.expr.length) { + return false; + } + for (let i = 0, len = this.expr.length; i < len; i++) { + if (!this.expr[i].equals(other.expr[i])) { + return false; + } + } + return true; + } + return false; + } + substituteConstants() { + const exprArr = eliminateConstantsInArray(this.expr); + if (exprArr === this.expr) { + return this; + } + return _ContextKeyOrExpr.create(exprArr, this.negated, false); + } + evaluate(context) { + for (let i = 0, len = this.expr.length; i < len; i++) { + if (this.expr[i].evaluate(context)) { + return true; + } + } + return false; + } + static _normalizeArr(arr, negated, extraRedundantCheck) { + let expr = []; + let hasFalse = false; + if (arr) { + for (let i = 0, len = arr.length; i < len; i++) { + const e = arr[i]; + if (!e) { + continue; + } + if (e.type === 0) { + hasFalse = true; + continue; + } + if (e.type === 1) { + return ContextKeyTrueExpr.INSTANCE; + } + if (e.type === 9) { + expr = expr.concat(e.expr); + continue; + } + expr.push(e); + } + if (expr.length === 0 && hasFalse) { + return ContextKeyFalseExpr.INSTANCE; + } + expr.sort(cmp); + } + if (expr.length === 0) { + return void 0; + } + if (expr.length === 1) { + return expr[0]; + } + for (let i = 1; i < expr.length; i++) { + if (expr[i - 1].equals(expr[i])) { + expr.splice(i, 1); + i--; + } + } + if (expr.length === 1) { + return expr[0]; + } + if (extraRedundantCheck) { + for (let i = 0; i < expr.length; i++) { + for (let j = i + 1; j < expr.length; j++) { + if (expr[i].negate().equals(expr[j])) { + return ContextKeyTrueExpr.INSTANCE; + } + } + } + if (expr.length === 1) { + return expr[0]; + } + } + return new _ContextKeyOrExpr(expr, negated); + } + serialize() { + return this.expr.map((e) => e.serialize()).join(" || "); + } + keys() { + const result = []; + for (const expr of this.expr) { + result.push(...expr.keys()); + } + return result; + } + negate() { + if (!this.negated) { + const result = []; + for (const expr of this.expr) { + result.push(expr.negate()); + } + while (result.length > 1) { + const LEFT = result.shift(); + const RIGHT = result.shift(); + const all = []; + for (const left of getTerminals(LEFT)) { + for (const right of getTerminals(RIGHT)) { + all.push(ContextKeyAndExpr.create([left, right], null, false)); + } + } + result.unshift(_ContextKeyOrExpr.create(all, null, false)); + } + this.negated = _ContextKeyOrExpr.create(result, this, true); + } + return this.negated; + } + }; + RawContextKey = class _RawContextKey extends ContextKeyDefinedExpr { + static all() { + return _RawContextKey._info.values(); + } + constructor(key, defaultValue, metaOrHide) { + super(key, null); + this._defaultValue = defaultValue; + if (typeof metaOrHide === "object") { + _RawContextKey._info.push(__spreadProps(__spreadValues({}, metaOrHide), { key })); + } else if (metaOrHide !== true) { + _RawContextKey._info.push({ key, description: metaOrHide, type: defaultValue !== null && defaultValue !== void 0 ? typeof defaultValue : void 0 }); + } + } + bindTo(target) { + return target.createKey(this.key, this._defaultValue); + } + getValue(target) { + return target.getContextKeyValue(this.key); + } + toNegated() { + return this.negate(); + } + isEqualTo(value) { + return ContextKeyEqualsExpr.create(this.key, value); + } + }; + RawContextKey._info = []; + IContextKeyService = createDecorator("contextKeyService"); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/assert.js +function ok(value, message) { + if (!value) { + throw new Error(message ? `Assertion failed (${message})` : "Assertion Failed"); + } +} +function assertNever(value, message = "Unreachable") { + throw new Error(message); +} +function softAssert(condition) { + if (!condition) { + onUnexpectedError(new BugIndicatingError("Soft Assertion Failed")); + } +} +function assertFn(condition) { + if (!condition()) { + debugger; + condition(); + onUnexpectedError(new BugIndicatingError("Assertion Failed")); + } +} +function checkAdjacentItems(items, predicate) { + let i = 0; + while (i < items.length - 1) { + const a3 = items[i]; + const b = items[i + 1]; + if (!predicate(a3, b)) { + return false; + } + i++; + } + return true; +} +var init_assert = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/assert.js"() { + init_errors(); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/registry/common/platform.js +var RegistryImpl, Registry; +var init_platform2 = __esm({ + "node_modules/monaco-editor/esm/vs/platform/registry/common/platform.js"() { + init_assert(); + init_types(); + RegistryImpl = class { + constructor() { + this.data = /* @__PURE__ */ new Map(); + } + add(id, data) { + ok(isString(id)); + ok(isObject(data)); + ok(!this.data.has(id), "There is already an extension with this id"); + this.data.set(id, data); + } + as(id) { + return this.data.get(id) || null; + } + }; + Registry = new RegistryImpl(); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/keybinding/common/keybindingsRegistry.js +function sorter(a3, b) { + if (a3.weight1 !== b.weight1) { + return a3.weight1 - b.weight1; + } + if (a3.command && b.command) { + if (a3.command < b.command) { + return -1; + } + if (a3.command > b.command) { + return 1; + } + } + return a3.weight2 - b.weight2; +} +var KeybindingsRegistryImpl, KeybindingsRegistry, Extensions; +var init_keybindingsRegistry = __esm({ + "node_modules/monaco-editor/esm/vs/platform/keybinding/common/keybindingsRegistry.js"() { + init_keybindings(); + init_platform(); + init_commands(); + init_platform2(); + init_lifecycle(); + init_linkedList(); + KeybindingsRegistryImpl = class _KeybindingsRegistryImpl { + constructor() { + this._coreKeybindings = new LinkedList(); + this._extensionKeybindings = []; + this._cachedMergedKeybindings = null; + } + /** + * Take current platform into account and reduce to primary & secondary. + */ + static bindToCurrentPlatform(kb) { + if (OS === 1) { + if (kb && kb.win) { + return kb.win; + } + } else if (OS === 2) { + if (kb && kb.mac) { + return kb.mac; + } + } else { + if (kb && kb.linux) { + return kb.linux; + } + } + return kb; + } + registerKeybindingRule(rule) { + const actualKb = _KeybindingsRegistryImpl.bindToCurrentPlatform(rule); + const result = new DisposableStore(); + if (actualKb && actualKb.primary) { + const kk = decodeKeybinding(actualKb.primary, OS); + if (kk) { + result.add(this._registerDefaultKeybinding(kk, rule.id, rule.args, rule.weight, 0, rule.when)); + } + } + if (actualKb && Array.isArray(actualKb.secondary)) { + for (let i = 0, len = actualKb.secondary.length; i < len; i++) { + const k = actualKb.secondary[i]; + const kk = decodeKeybinding(k, OS); + if (kk) { + result.add(this._registerDefaultKeybinding(kk, rule.id, rule.args, rule.weight, -i - 1, rule.when)); + } + } + } + return result; + } + registerCommandAndKeybindingRule(desc) { + return combinedDisposable(this.registerKeybindingRule(desc), CommandsRegistry.registerCommand(desc)); + } + _registerDefaultKeybinding(keybinding, commandId, commandArgs, weight1, weight22, when) { + const remove = this._coreKeybindings.push({ + keybinding, + command: commandId, + commandArgs, + when, + weight1, + weight2: weight22, + extensionId: null, + isBuiltinExtension: false + }); + this._cachedMergedKeybindings = null; + return toDisposable(() => { + remove(); + this._cachedMergedKeybindings = null; + }); + } + getDefaultKeybindings() { + if (!this._cachedMergedKeybindings) { + this._cachedMergedKeybindings = Array.from(this._coreKeybindings).concat(this._extensionKeybindings); + this._cachedMergedKeybindings.sort(sorter); + } + return this._cachedMergedKeybindings.slice(0); + } + }; + KeybindingsRegistry = new KeybindingsRegistryImpl(); + Extensions = { + EditorModes: "platform.keybindingsRegistry" + }; + Registry.add(Extensions.EditorModes, KeybindingsRegistry); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/actions/common/actions.js +function isIMenuItem(item) { + return item.command !== void 0; +} +function isISubmenuItem(item) { + return item.submenu !== void 0; +} +function registerAction2(ctor) { + const disposables = []; + const action = new ctor(); + const _a10 = action.desc, { f1, menu, keybinding } = _a10, command = __objRest(_a10, ["f1", "menu", "keybinding"]); + if (CommandsRegistry.getCommand(command.id)) { + throw new Error(`Cannot register two commands with the same id: ${command.id}`); + } + disposables.push(CommandsRegistry.registerCommand({ + id: command.id, + handler: (accessor, ...args) => action.run(accessor, ...args), + metadata: command.metadata + })); + if (Array.isArray(menu)) { + for (const item of menu) { + disposables.push(MenuRegistry.appendMenuItem(item.id, __spreadValues({ command: __spreadProps(__spreadValues({}, command), { precondition: item.precondition === null ? void 0 : command.precondition }) }, item))); + } + } else if (menu) { + disposables.push(MenuRegistry.appendMenuItem(menu.id, __spreadValues({ command: __spreadProps(__spreadValues({}, command), { precondition: menu.precondition === null ? void 0 : command.precondition }) }, menu))); + } + if (f1) { + disposables.push(MenuRegistry.appendMenuItem(MenuId.CommandPalette, { command, when: command.precondition })); + disposables.push(MenuRegistry.addCommand(command)); + } + if (Array.isArray(keybinding)) { + for (const item of keybinding) { + disposables.push(KeybindingsRegistry.registerKeybindingRule(__spreadProps(__spreadValues({}, item), { + id: command.id, + when: command.precondition ? ContextKeyExpr.and(command.precondition, item.when) : item.when + }))); + } + } else if (keybinding) { + disposables.push(KeybindingsRegistry.registerKeybindingRule(__spreadProps(__spreadValues({}, keybinding), { + id: command.id, + when: command.precondition ? ContextKeyExpr.and(command.precondition, keybinding.when) : keybinding.when + }))); + } + return { + dispose() { + dispose(disposables); + } + }; +} +var __decorate, __param, MenuItemAction_1, MenuId, IMenuService, MenuRegistryChangeEvent, MenuRegistry, SubmenuItemAction, MenuItemAction, Action2; +var init_actions2 = __esm({ + "node_modules/monaco-editor/esm/vs/platform/actions/common/actions.js"() { + init_actions(); + init_themables(); + init_event(); + init_lifecycle(); + init_linkedList(); + init_commands(); + init_contextkey(); + init_instantiation(); + init_keybindingsRegistry(); + __decorate = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + MenuId = class _MenuId { + /** + * Create a new `MenuId` with the unique identifier. Will throw if a menu + * with the identifier already exists, use `MenuId.for(ident)` or a unique + * identifier + */ + constructor(identifier3) { + if (_MenuId._instances.has(identifier3)) { + throw new TypeError(`MenuId with identifier '${identifier3}' already exists. Use MenuId.for(ident) or a unique identifier`); + } + _MenuId._instances.set(identifier3, this); + this.id = identifier3; + } + }; + MenuId._instances = /* @__PURE__ */ new Map(); + MenuId.CommandPalette = new MenuId("CommandPalette"); + MenuId.DebugBreakpointsContext = new MenuId("DebugBreakpointsContext"); + MenuId.DebugCallStackContext = new MenuId("DebugCallStackContext"); + MenuId.DebugConsoleContext = new MenuId("DebugConsoleContext"); + MenuId.DebugVariablesContext = new MenuId("DebugVariablesContext"); + MenuId.NotebookVariablesContext = new MenuId("NotebookVariablesContext"); + MenuId.DebugHoverContext = new MenuId("DebugHoverContext"); + MenuId.DebugWatchContext = new MenuId("DebugWatchContext"); + MenuId.DebugToolBar = new MenuId("DebugToolBar"); + MenuId.DebugToolBarStop = new MenuId("DebugToolBarStop"); + MenuId.EditorContext = new MenuId("EditorContext"); + MenuId.SimpleEditorContext = new MenuId("SimpleEditorContext"); + MenuId.EditorContent = new MenuId("EditorContent"); + MenuId.EditorLineNumberContext = new MenuId("EditorLineNumberContext"); + MenuId.EditorContextCopy = new MenuId("EditorContextCopy"); + MenuId.EditorContextPeek = new MenuId("EditorContextPeek"); + MenuId.EditorContextShare = new MenuId("EditorContextShare"); + MenuId.EditorTitle = new MenuId("EditorTitle"); + MenuId.EditorTitleRun = new MenuId("EditorTitleRun"); + MenuId.EditorTitleContext = new MenuId("EditorTitleContext"); + MenuId.EditorTitleContextShare = new MenuId("EditorTitleContextShare"); + MenuId.EmptyEditorGroup = new MenuId("EmptyEditorGroup"); + MenuId.EmptyEditorGroupContext = new MenuId("EmptyEditorGroupContext"); + MenuId.EditorTabsBarContext = new MenuId("EditorTabsBarContext"); + MenuId.EditorTabsBarShowTabsSubmenu = new MenuId("EditorTabsBarShowTabsSubmenu"); + MenuId.EditorTabsBarShowTabsZenModeSubmenu = new MenuId("EditorTabsBarShowTabsZenModeSubmenu"); + MenuId.EditorActionsPositionSubmenu = new MenuId("EditorActionsPositionSubmenu"); + MenuId.ExplorerContext = new MenuId("ExplorerContext"); + MenuId.ExplorerContextShare = new MenuId("ExplorerContextShare"); + MenuId.ExtensionContext = new MenuId("ExtensionContext"); + MenuId.GlobalActivity = new MenuId("GlobalActivity"); + MenuId.CommandCenter = new MenuId("CommandCenter"); + MenuId.CommandCenterCenter = new MenuId("CommandCenterCenter"); + MenuId.LayoutControlMenuSubmenu = new MenuId("LayoutControlMenuSubmenu"); + MenuId.LayoutControlMenu = new MenuId("LayoutControlMenu"); + MenuId.MenubarMainMenu = new MenuId("MenubarMainMenu"); + MenuId.MenubarAppearanceMenu = new MenuId("MenubarAppearanceMenu"); + MenuId.MenubarDebugMenu = new MenuId("MenubarDebugMenu"); + MenuId.MenubarEditMenu = new MenuId("MenubarEditMenu"); + MenuId.MenubarCopy = new MenuId("MenubarCopy"); + MenuId.MenubarFileMenu = new MenuId("MenubarFileMenu"); + MenuId.MenubarGoMenu = new MenuId("MenubarGoMenu"); + MenuId.MenubarHelpMenu = new MenuId("MenubarHelpMenu"); + MenuId.MenubarLayoutMenu = new MenuId("MenubarLayoutMenu"); + MenuId.MenubarNewBreakpointMenu = new MenuId("MenubarNewBreakpointMenu"); + MenuId.PanelAlignmentMenu = new MenuId("PanelAlignmentMenu"); + MenuId.PanelPositionMenu = new MenuId("PanelPositionMenu"); + MenuId.ActivityBarPositionMenu = new MenuId("ActivityBarPositionMenu"); + MenuId.MenubarPreferencesMenu = new MenuId("MenubarPreferencesMenu"); + MenuId.MenubarRecentMenu = new MenuId("MenubarRecentMenu"); + MenuId.MenubarSelectionMenu = new MenuId("MenubarSelectionMenu"); + MenuId.MenubarShare = new MenuId("MenubarShare"); + MenuId.MenubarSwitchEditorMenu = new MenuId("MenubarSwitchEditorMenu"); + MenuId.MenubarSwitchGroupMenu = new MenuId("MenubarSwitchGroupMenu"); + MenuId.MenubarTerminalMenu = new MenuId("MenubarTerminalMenu"); + MenuId.MenubarViewMenu = new MenuId("MenubarViewMenu"); + MenuId.MenubarHomeMenu = new MenuId("MenubarHomeMenu"); + MenuId.OpenEditorsContext = new MenuId("OpenEditorsContext"); + MenuId.OpenEditorsContextShare = new MenuId("OpenEditorsContextShare"); + MenuId.ProblemsPanelContext = new MenuId("ProblemsPanelContext"); + MenuId.SCMInputBox = new MenuId("SCMInputBox"); + MenuId.SCMChangesSeparator = new MenuId("SCMChangesSeparator"); + MenuId.SCMIncomingChanges = new MenuId("SCMIncomingChanges"); + MenuId.SCMIncomingChangesContext = new MenuId("SCMIncomingChangesContext"); + MenuId.SCMIncomingChangesSetting = new MenuId("SCMIncomingChangesSetting"); + MenuId.SCMOutgoingChanges = new MenuId("SCMOutgoingChanges"); + MenuId.SCMOutgoingChangesContext = new MenuId("SCMOutgoingChangesContext"); + MenuId.SCMOutgoingChangesSetting = new MenuId("SCMOutgoingChangesSetting"); + MenuId.SCMIncomingChangesAllChangesContext = new MenuId("SCMIncomingChangesAllChangesContext"); + MenuId.SCMIncomingChangesHistoryItemContext = new MenuId("SCMIncomingChangesHistoryItemContext"); + MenuId.SCMOutgoingChangesAllChangesContext = new MenuId("SCMOutgoingChangesAllChangesContext"); + MenuId.SCMOutgoingChangesHistoryItemContext = new MenuId("SCMOutgoingChangesHistoryItemContext"); + MenuId.SCMChangeContext = new MenuId("SCMChangeContext"); + MenuId.SCMResourceContext = new MenuId("SCMResourceContext"); + MenuId.SCMResourceContextShare = new MenuId("SCMResourceContextShare"); + MenuId.SCMResourceFolderContext = new MenuId("SCMResourceFolderContext"); + MenuId.SCMResourceGroupContext = new MenuId("SCMResourceGroupContext"); + MenuId.SCMSourceControl = new MenuId("SCMSourceControl"); + MenuId.SCMSourceControlInline = new MenuId("SCMSourceControlInline"); + MenuId.SCMSourceControlTitle = new MenuId("SCMSourceControlTitle"); + MenuId.SCMTitle = new MenuId("SCMTitle"); + MenuId.SearchContext = new MenuId("SearchContext"); + MenuId.SearchActionMenu = new MenuId("SearchActionContext"); + MenuId.StatusBarWindowIndicatorMenu = new MenuId("StatusBarWindowIndicatorMenu"); + MenuId.StatusBarRemoteIndicatorMenu = new MenuId("StatusBarRemoteIndicatorMenu"); + MenuId.StickyScrollContext = new MenuId("StickyScrollContext"); + MenuId.TestItem = new MenuId("TestItem"); + MenuId.TestItemGutter = new MenuId("TestItemGutter"); + MenuId.TestMessageContext = new MenuId("TestMessageContext"); + MenuId.TestMessageContent = new MenuId("TestMessageContent"); + MenuId.TestPeekElement = new MenuId("TestPeekElement"); + MenuId.TestPeekTitle = new MenuId("TestPeekTitle"); + MenuId.TouchBarContext = new MenuId("TouchBarContext"); + MenuId.TitleBarContext = new MenuId("TitleBarContext"); + MenuId.TitleBarTitleContext = new MenuId("TitleBarTitleContext"); + MenuId.TunnelContext = new MenuId("TunnelContext"); + MenuId.TunnelPrivacy = new MenuId("TunnelPrivacy"); + MenuId.TunnelProtocol = new MenuId("TunnelProtocol"); + MenuId.TunnelPortInline = new MenuId("TunnelInline"); + MenuId.TunnelTitle = new MenuId("TunnelTitle"); + MenuId.TunnelLocalAddressInline = new MenuId("TunnelLocalAddressInline"); + MenuId.TunnelOriginInline = new MenuId("TunnelOriginInline"); + MenuId.ViewItemContext = new MenuId("ViewItemContext"); + MenuId.ViewContainerTitle = new MenuId("ViewContainerTitle"); + MenuId.ViewContainerTitleContext = new MenuId("ViewContainerTitleContext"); + MenuId.ViewTitle = new MenuId("ViewTitle"); + MenuId.ViewTitleContext = new MenuId("ViewTitleContext"); + MenuId.CommentEditorActions = new MenuId("CommentEditorActions"); + MenuId.CommentThreadTitle = new MenuId("CommentThreadTitle"); + MenuId.CommentThreadActions = new MenuId("CommentThreadActions"); + MenuId.CommentThreadAdditionalActions = new MenuId("CommentThreadAdditionalActions"); + MenuId.CommentThreadTitleContext = new MenuId("CommentThreadTitleContext"); + MenuId.CommentThreadCommentContext = new MenuId("CommentThreadCommentContext"); + MenuId.CommentTitle = new MenuId("CommentTitle"); + MenuId.CommentActions = new MenuId("CommentActions"); + MenuId.CommentsViewThreadActions = new MenuId("CommentsViewThreadActions"); + MenuId.InteractiveToolbar = new MenuId("InteractiveToolbar"); + MenuId.InteractiveCellTitle = new MenuId("InteractiveCellTitle"); + MenuId.InteractiveCellDelete = new MenuId("InteractiveCellDelete"); + MenuId.InteractiveCellExecute = new MenuId("InteractiveCellExecute"); + MenuId.InteractiveInputExecute = new MenuId("InteractiveInputExecute"); + MenuId.IssueReporter = new MenuId("IssueReporter"); + MenuId.NotebookToolbar = new MenuId("NotebookToolbar"); + MenuId.NotebookStickyScrollContext = new MenuId("NotebookStickyScrollContext"); + MenuId.NotebookCellTitle = new MenuId("NotebookCellTitle"); + MenuId.NotebookCellDelete = new MenuId("NotebookCellDelete"); + MenuId.NotebookCellInsert = new MenuId("NotebookCellInsert"); + MenuId.NotebookCellBetween = new MenuId("NotebookCellBetween"); + MenuId.NotebookCellListTop = new MenuId("NotebookCellTop"); + MenuId.NotebookCellExecute = new MenuId("NotebookCellExecute"); + MenuId.NotebookCellExecuteGoTo = new MenuId("NotebookCellExecuteGoTo"); + MenuId.NotebookCellExecutePrimary = new MenuId("NotebookCellExecutePrimary"); + MenuId.NotebookDiffCellInputTitle = new MenuId("NotebookDiffCellInputTitle"); + MenuId.NotebookDiffCellMetadataTitle = new MenuId("NotebookDiffCellMetadataTitle"); + MenuId.NotebookDiffCellOutputsTitle = new MenuId("NotebookDiffCellOutputsTitle"); + MenuId.NotebookOutputToolbar = new MenuId("NotebookOutputToolbar"); + MenuId.NotebookOutlineFilter = new MenuId("NotebookOutlineFilter"); + MenuId.NotebookOutlineActionMenu = new MenuId("NotebookOutlineActionMenu"); + MenuId.NotebookEditorLayoutConfigure = new MenuId("NotebookEditorLayoutConfigure"); + MenuId.NotebookKernelSource = new MenuId("NotebookKernelSource"); + MenuId.BulkEditTitle = new MenuId("BulkEditTitle"); + MenuId.BulkEditContext = new MenuId("BulkEditContext"); + MenuId.TimelineItemContext = new MenuId("TimelineItemContext"); + MenuId.TimelineTitle = new MenuId("TimelineTitle"); + MenuId.TimelineTitleContext = new MenuId("TimelineTitleContext"); + MenuId.TimelineFilterSubMenu = new MenuId("TimelineFilterSubMenu"); + MenuId.AccountsContext = new MenuId("AccountsContext"); + MenuId.SidebarTitle = new MenuId("SidebarTitle"); + MenuId.PanelTitle = new MenuId("PanelTitle"); + MenuId.AuxiliaryBarTitle = new MenuId("AuxiliaryBarTitle"); + MenuId.AuxiliaryBarHeader = new MenuId("AuxiliaryBarHeader"); + MenuId.TerminalInstanceContext = new MenuId("TerminalInstanceContext"); + MenuId.TerminalEditorInstanceContext = new MenuId("TerminalEditorInstanceContext"); + MenuId.TerminalNewDropdownContext = new MenuId("TerminalNewDropdownContext"); + MenuId.TerminalTabContext = new MenuId("TerminalTabContext"); + MenuId.TerminalTabEmptyAreaContext = new MenuId("TerminalTabEmptyAreaContext"); + MenuId.TerminalStickyScrollContext = new MenuId("TerminalStickyScrollContext"); + MenuId.WebviewContext = new MenuId("WebviewContext"); + MenuId.InlineCompletionsActions = new MenuId("InlineCompletionsActions"); + MenuId.InlineEditActions = new MenuId("InlineEditActions"); + MenuId.NewFile = new MenuId("NewFile"); + MenuId.MergeInput1Toolbar = new MenuId("MergeToolbar1Toolbar"); + MenuId.MergeInput2Toolbar = new MenuId("MergeToolbar2Toolbar"); + MenuId.MergeBaseToolbar = new MenuId("MergeBaseToolbar"); + MenuId.MergeInputResultToolbar = new MenuId("MergeToolbarResultToolbar"); + MenuId.InlineSuggestionToolbar = new MenuId("InlineSuggestionToolbar"); + MenuId.InlineEditToolbar = new MenuId("InlineEditToolbar"); + MenuId.ChatContext = new MenuId("ChatContext"); + MenuId.ChatCodeBlock = new MenuId("ChatCodeblock"); + MenuId.ChatCompareBlock = new MenuId("ChatCompareBlock"); + MenuId.ChatMessageTitle = new MenuId("ChatMessageTitle"); + MenuId.ChatExecute = new MenuId("ChatExecute"); + MenuId.ChatExecuteSecondary = new MenuId("ChatExecuteSecondary"); + MenuId.ChatInputSide = new MenuId("ChatInputSide"); + MenuId.AccessibleView = new MenuId("AccessibleView"); + MenuId.MultiDiffEditorFileToolbar = new MenuId("MultiDiffEditorFileToolbar"); + MenuId.DiffEditorHunkToolbar = new MenuId("DiffEditorHunkToolbar"); + MenuId.DiffEditorSelectionToolbar = new MenuId("DiffEditorSelectionToolbar"); + IMenuService = createDecorator("menuService"); + MenuRegistryChangeEvent = class _MenuRegistryChangeEvent { + static for(id) { + let value = this._all.get(id); + if (!value) { + value = new _MenuRegistryChangeEvent(id); + this._all.set(id, value); + } + return value; + } + static merge(events) { + const ids = /* @__PURE__ */ new Set(); + for (const item of events) { + if (item instanceof _MenuRegistryChangeEvent) { + ids.add(item.id); + } + } + return ids; + } + constructor(id) { + this.id = id; + this.has = (candidate) => candidate === id; + } + }; + MenuRegistryChangeEvent._all = /* @__PURE__ */ new Map(); + MenuRegistry = new class { + constructor() { + this._commands = /* @__PURE__ */ new Map(); + this._menuItems = /* @__PURE__ */ new Map(); + this._onDidChangeMenu = new MicrotaskEmitter({ + merge: MenuRegistryChangeEvent.merge + }); + this.onDidChangeMenu = this._onDidChangeMenu.event; + } + addCommand(command) { + this._commands.set(command.id, command); + this._onDidChangeMenu.fire(MenuRegistryChangeEvent.for(MenuId.CommandPalette)); + return toDisposable(() => { + if (this._commands.delete(command.id)) { + this._onDidChangeMenu.fire(MenuRegistryChangeEvent.for(MenuId.CommandPalette)); + } + }); + } + getCommand(id) { + return this._commands.get(id); + } + getCommands() { + const map = /* @__PURE__ */ new Map(); + this._commands.forEach((value, key) => map.set(key, value)); + return map; + } + appendMenuItem(id, item) { + let list = this._menuItems.get(id); + if (!list) { + list = new LinkedList(); + this._menuItems.set(id, list); + } + const rm = list.push(item); + this._onDidChangeMenu.fire(MenuRegistryChangeEvent.for(id)); + return toDisposable(() => { + rm(); + this._onDidChangeMenu.fire(MenuRegistryChangeEvent.for(id)); + }); + } + appendMenuItems(items) { + const result = new DisposableStore(); + for (const { id, item } of items) { + result.add(this.appendMenuItem(id, item)); + } + return result; + } + getMenuItems(id) { + let result; + if (this._menuItems.has(id)) { + result = [...this._menuItems.get(id)]; + } else { + result = []; + } + if (id === MenuId.CommandPalette) { + this._appendImplicitItems(result); + } + return result; + } + _appendImplicitItems(result) { + const set = /* @__PURE__ */ new Set(); + for (const item of result) { + if (isIMenuItem(item)) { + set.add(item.command.id); + if (item.alt) { + set.add(item.alt.id); + } + } + } + this._commands.forEach((command, id) => { + if (!set.has(id)) { + result.push({ command }); + } + }); + } + }(); + SubmenuItemAction = class extends SubmenuAction { + constructor(item, hideActions, actions) { + super(`submenuitem.${item.submenu.id}`, typeof item.title === "string" ? item.title : item.title.value, actions, "submenu"); + this.item = item; + this.hideActions = hideActions; + } + }; + MenuItemAction = MenuItemAction_1 = class MenuItemAction2 { + static label(action, options2) { + return (options2 === null || options2 === void 0 ? void 0 : options2.renderShortTitle) && action.shortTitle ? typeof action.shortTitle === "string" ? action.shortTitle : action.shortTitle.value : typeof action.title === "string" ? action.title : action.title.value; + } + constructor(item, alt, options2, hideActions, menuKeybinding, contextKeyService, _commandService) { + var _a10, _b4; + this.hideActions = hideActions; + this.menuKeybinding = menuKeybinding; + this._commandService = _commandService; + this.id = item.id; + this.label = MenuItemAction_1.label(item, options2); + this.tooltip = (_b4 = typeof item.tooltip === "string" ? item.tooltip : (_a10 = item.tooltip) === null || _a10 === void 0 ? void 0 : _a10.value) !== null && _b4 !== void 0 ? _b4 : ""; + this.enabled = !item.precondition || contextKeyService.contextMatchesRules(item.precondition); + this.checked = void 0; + let icon; + if (item.toggled) { + const toggled = item.toggled.condition ? item.toggled : { condition: item.toggled }; + this.checked = contextKeyService.contextMatchesRules(toggled.condition); + if (this.checked && toggled.tooltip) { + this.tooltip = typeof toggled.tooltip === "string" ? toggled.tooltip : toggled.tooltip.value; + } + if (this.checked && ThemeIcon.isThemeIcon(toggled.icon)) { + icon = toggled.icon; + } + if (this.checked && toggled.title) { + this.label = typeof toggled.title === "string" ? toggled.title : toggled.title.value; + } + } + if (!icon) { + icon = ThemeIcon.isThemeIcon(item.icon) ? item.icon : void 0; + } + this.item = item; + this.alt = alt ? new MenuItemAction_1(alt, void 0, options2, hideActions, void 0, contextKeyService, _commandService) : void 0; + this._options = options2; + this.class = icon && ThemeIcon.asClassName(icon); + } + run(...args) { + var _a10, _b4; + let runArgs = []; + if ((_a10 = this._options) === null || _a10 === void 0 ? void 0 : _a10.arg) { + runArgs = [...runArgs, this._options.arg]; + } + if ((_b4 = this._options) === null || _b4 === void 0 ? void 0 : _b4.shouldForwardArgs) { + runArgs = [...runArgs, ...args]; + } + return this._commandService.executeCommand(this.id, ...runArgs); + } + }; + MenuItemAction = MenuItemAction_1 = __decorate([ + __param(5, IContextKeyService), + __param(6, ICommandService) + ], MenuItemAction); + Action2 = class { + constructor(desc) { + this.desc = desc; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/telemetry/common/telemetry.js +var ITelemetryService; +var init_telemetry = __esm({ + "node_modules/monaco-editor/esm/vs/platform/telemetry/common/telemetry.js"() { + init_instantiation(); + ITelemetryService = createDecorator("telemetryService"); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/log/common/log.js +function LogLevelToString(logLevel) { + switch (logLevel) { + case LogLevel.Trace: + return "trace"; + case LogLevel.Debug: + return "debug"; + case LogLevel.Info: + return "info"; + case LogLevel.Warning: + return "warn"; + case LogLevel.Error: + return "error"; + case LogLevel.Off: + return "off"; + } +} +var ILogService, LogLevel, DEFAULT_LOG_LEVEL, AbstractLogger, ConsoleLogger, MultiplexLogger, CONTEXT_LOG_LEVEL; +var init_log = __esm({ + "node_modules/monaco-editor/esm/vs/platform/log/common/log.js"() { + init_event(); + init_lifecycle(); + init_contextkey(); + init_instantiation(); + ILogService = createDecorator("logService"); + (function(LogLevel2) { + LogLevel2[LogLevel2["Off"] = 0] = "Off"; + LogLevel2[LogLevel2["Trace"] = 1] = "Trace"; + LogLevel2[LogLevel2["Debug"] = 2] = "Debug"; + LogLevel2[LogLevel2["Info"] = 3] = "Info"; + LogLevel2[LogLevel2["Warning"] = 4] = "Warning"; + LogLevel2[LogLevel2["Error"] = 5] = "Error"; + })(LogLevel || (LogLevel = {})); + DEFAULT_LOG_LEVEL = LogLevel.Info; + AbstractLogger = class extends Disposable { + constructor() { + super(...arguments); + this.level = DEFAULT_LOG_LEVEL; + this._onDidChangeLogLevel = this._register(new Emitter()); + this.onDidChangeLogLevel = this._onDidChangeLogLevel.event; + } + setLevel(level) { + if (this.level !== level) { + this.level = level; + this._onDidChangeLogLevel.fire(this.level); + } + } + getLevel() { + return this.level; + } + checkLogLevel(level) { + return this.level !== LogLevel.Off && this.level <= level; + } + }; + ConsoleLogger = class extends AbstractLogger { + constructor(logLevel = DEFAULT_LOG_LEVEL, useColors = true) { + super(); + this.useColors = useColors; + this.setLevel(logLevel); + } + trace(message, ...args) { + if (this.checkLogLevel(LogLevel.Trace)) { + if (this.useColors) { + console.log("%cTRACE", "color: #888", message, ...args); + } else { + console.log(message, ...args); + } + } + } + debug(message, ...args) { + if (this.checkLogLevel(LogLevel.Debug)) { + if (this.useColors) { + console.log("%cDEBUG", "background: #eee; color: #888", message, ...args); + } else { + console.log(message, ...args); + } + } + } + info(message, ...args) { + if (this.checkLogLevel(LogLevel.Info)) { + if (this.useColors) { + console.log("%c INFO", "color: #33f", message, ...args); + } else { + console.log(message, ...args); + } + } + } + warn(message, ...args) { + if (this.checkLogLevel(LogLevel.Warning)) { + if (this.useColors) { + console.log("%c WARN", "color: #993", message, ...args); + } else { + console.log(message, ...args); + } + } + } + error(message, ...args) { + if (this.checkLogLevel(LogLevel.Error)) { + if (this.useColors) { + console.log("%c ERR", "color: #f33", message, ...args); + } else { + console.error(message, ...args); + } + } + } + }; + MultiplexLogger = class extends AbstractLogger { + constructor(loggers) { + super(); + this.loggers = loggers; + if (loggers.length) { + this.setLevel(loggers[0].getLevel()); + } + } + setLevel(level) { + for (const logger of this.loggers) { + logger.setLevel(level); + } + super.setLevel(level); + } + trace(message, ...args) { + for (const logger of this.loggers) { + logger.trace(message, ...args); + } + } + debug(message, ...args) { + for (const logger of this.loggers) { + logger.debug(message, ...args); + } + } + info(message, ...args) { + for (const logger of this.loggers) { + logger.info(message, ...args); + } + } + warn(message, ...args) { + for (const logger of this.loggers) { + logger.warn(message, ...args); + } + } + error(message, ...args) { + for (const logger of this.loggers) { + logger.error(message, ...args); + } + } + dispose() { + for (const logger of this.loggers) { + logger.dispose(); + } + super.dispose(); + } + }; + CONTEXT_LOG_LEVEL = new RawContextKey("logLevel", LogLevelToString(LogLevel.Info)); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/editorExtensions.js +function registerModelAndPositionCommand(id, handler) { + CommandsRegistry.registerCommand(id, function(accessor, ...args) { + const instaService = accessor.get(IInstantiationService); + const [resource, position] = args; + assertType(URI.isUri(resource)); + assertType(Position.isIPosition(position)); + const model = accessor.get(IModelService).getModel(resource); + if (model) { + const editorPosition = Position.lift(position); + return instaService.invokeFunction(handler, model, editorPosition, ...args.slice(2)); + } + return accessor.get(ITextModelService).createModelReference(resource).then((reference) => { + return new Promise((resolve2, reject) => { + try { + const result = instaService.invokeFunction(handler, reference.object.textEditorModel, Position.lift(position), args.slice(2)); + resolve2(result); + } catch (err) { + reject(err); + } + }).finally(() => { + reference.dispose(); + }); + }); + }); +} +function registerEditorCommand(editorCommand) { + EditorContributionRegistry.INSTANCE.registerEditorCommand(editorCommand); + return editorCommand; +} +function registerEditorAction(ctor) { + const action = new ctor(); + EditorContributionRegistry.INSTANCE.registerEditorAction(action); + return action; +} +function registerMultiEditorAction(action) { + EditorContributionRegistry.INSTANCE.registerEditorAction(action); + return action; +} +function registerInstantiatedEditorAction(editorAction) { + EditorContributionRegistry.INSTANCE.registerEditorAction(editorAction); +} +function registerEditorContribution(id, ctor, instantiation) { + EditorContributionRegistry.INSTANCE.registerEditorContribution(id, ctor, instantiation); +} +function registerCommand(command) { + command.register(); + return command; +} +var Command2, MultiCommand, ProxyCommand, EditorCommand, EditorAction, MultiEditorAction, EditorAction2, EditorExtensionsRegistry, Extensions2, EditorContributionRegistry, UndoCommand, RedoCommand, SelectAllCommand; +var init_editorExtensions = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/editorExtensions.js"() { + init_nls(); + init_uri(); + init_codeEditorService(); + init_position(); + init_model(); + init_resolverService(); + init_actions2(); + init_commands(); + init_contextkey(); + init_instantiation(); + init_keybindingsRegistry(); + init_platform2(); + init_telemetry(); + init_types(); + init_log(); + init_dom(); + Command2 = class { + constructor(opts) { + this.id = opts.id; + this.precondition = opts.precondition; + this._kbOpts = opts.kbOpts; + this._menuOpts = opts.menuOpts; + this.metadata = opts.metadata; + } + register() { + if (Array.isArray(this._menuOpts)) { + this._menuOpts.forEach(this._registerMenuItem, this); + } else if (this._menuOpts) { + this._registerMenuItem(this._menuOpts); + } + if (this._kbOpts) { + const kbOptsArr = Array.isArray(this._kbOpts) ? this._kbOpts : [this._kbOpts]; + for (const kbOpts of kbOptsArr) { + let kbWhen = kbOpts.kbExpr; + if (this.precondition) { + if (kbWhen) { + kbWhen = ContextKeyExpr.and(kbWhen, this.precondition); + } else { + kbWhen = this.precondition; + } + } + const desc = { + id: this.id, + weight: kbOpts.weight, + args: kbOpts.args, + when: kbWhen, + primary: kbOpts.primary, + secondary: kbOpts.secondary, + win: kbOpts.win, + linux: kbOpts.linux, + mac: kbOpts.mac + }; + KeybindingsRegistry.registerKeybindingRule(desc); + } + } + CommandsRegistry.registerCommand({ + id: this.id, + handler: (accessor, args) => this.runCommand(accessor, args), + metadata: this.metadata + }); + } + _registerMenuItem(item) { + MenuRegistry.appendMenuItem(item.menuId, { + group: item.group, + command: { + id: this.id, + title: item.title, + icon: item.icon, + precondition: this.precondition + }, + when: item.when, + order: item.order + }); + } + }; + MultiCommand = class extends Command2 { + constructor() { + super(...arguments); + this._implementations = []; + } + /** + * A higher priority gets to be looked at first + */ + addImplementation(priority, name, implementation, when) { + this._implementations.push({ priority, name, implementation, when }); + this._implementations.sort((a3, b) => b.priority - a3.priority); + return { + dispose: () => { + for (let i = 0; i < this._implementations.length; i++) { + if (this._implementations[i].implementation === implementation) { + this._implementations.splice(i, 1); + return; + } + } + } + }; + } + runCommand(accessor, args) { + const logService = accessor.get(ILogService); + const contextKeyService = accessor.get(IContextKeyService); + logService.trace(`Executing Command '${this.id}' which has ${this._implementations.length} bound.`); + for (const impl of this._implementations) { + if (impl.when) { + const context = contextKeyService.getContext(getActiveElement()); + const value = impl.when.evaluate(context); + if (!value) { + continue; + } + } + const result = impl.implementation(accessor, args); + if (result) { + logService.trace(`Command '${this.id}' was handled by '${impl.name}'.`); + if (typeof result === "boolean") { + return; + } + return result; + } + } + logService.trace(`The Command '${this.id}' was not handled by any implementation.`); + } + }; + ProxyCommand = class extends Command2 { + constructor(command, opts) { + super(opts); + this.command = command; + } + runCommand(accessor, args) { + return this.command.runCommand(accessor, args); + } + }; + EditorCommand = class _EditorCommand extends Command2 { + /** + * Create a command class that is bound to a certain editor contribution. + */ + static bindToContribution(controllerGetter) { + return class EditorControllerCommandImpl extends _EditorCommand { + constructor(opts) { + super(opts); + this._callback = opts.handler; + } + runEditorCommand(accessor, editor2, args) { + const controller = controllerGetter(editor2); + if (controller) { + this._callback(controller, args); + } + } + }; + } + static runEditorCommand(accessor, args, precondition, runner) { + const codeEditorService = accessor.get(ICodeEditorService); + const editor2 = codeEditorService.getFocusedCodeEditor() || codeEditorService.getActiveCodeEditor(); + if (!editor2) { + return; + } + return editor2.invokeWithinContext((editorAccessor) => { + const kbService = editorAccessor.get(IContextKeyService); + if (!kbService.contextMatchesRules(precondition !== null && precondition !== void 0 ? precondition : void 0)) { + return; + } + return runner(editorAccessor, editor2, args); + }); + } + runCommand(accessor, args) { + return _EditorCommand.runEditorCommand(accessor, args, this.precondition, (accessor2, editor2, args2) => this.runEditorCommand(accessor2, editor2, args2)); + } + }; + EditorAction = class _EditorAction extends EditorCommand { + static convertOptions(opts) { + let menuOpts; + if (Array.isArray(opts.menuOpts)) { + menuOpts = opts.menuOpts; + } else if (opts.menuOpts) { + menuOpts = [opts.menuOpts]; + } else { + menuOpts = []; + } + function withDefaults(item) { + if (!item.menuId) { + item.menuId = MenuId.EditorContext; + } + if (!item.title) { + item.title = opts.label; + } + item.when = ContextKeyExpr.and(opts.precondition, item.when); + return item; + } + if (Array.isArray(opts.contextMenuOpts)) { + menuOpts.push(...opts.contextMenuOpts.map(withDefaults)); + } else if (opts.contextMenuOpts) { + menuOpts.push(withDefaults(opts.contextMenuOpts)); + } + opts.menuOpts = menuOpts; + return opts; + } + constructor(opts) { + super(_EditorAction.convertOptions(opts)); + this.label = opts.label; + this.alias = opts.alias; + } + runEditorCommand(accessor, editor2, args) { + this.reportTelemetry(accessor, editor2); + return this.run(accessor, editor2, args || {}); + } + reportTelemetry(accessor, editor2) { + accessor.get(ITelemetryService).publicLog2("editorActionInvoked", { name: this.label, id: this.id }); + } + }; + MultiEditorAction = class extends EditorAction { + constructor() { + super(...arguments); + this._implementations = []; + } + /** + * A higher priority gets to be looked at first + */ + addImplementation(priority, implementation) { + this._implementations.push([priority, implementation]); + this._implementations.sort((a3, b) => b[0] - a3[0]); + return { + dispose: () => { + for (let i = 0; i < this._implementations.length; i++) { + if (this._implementations[i][1] === implementation) { + this._implementations.splice(i, 1); + return; + } + } + } + }; + } + run(accessor, editor2, args) { + for (const impl of this._implementations) { + const result = impl[1](accessor, editor2, args); + if (result) { + if (typeof result === "boolean") { + return; + } + return result; + } + } + } + }; + EditorAction2 = class extends Action2 { + run(accessor, ...args) { + const codeEditorService = accessor.get(ICodeEditorService); + const editor2 = codeEditorService.getFocusedCodeEditor() || codeEditorService.getActiveCodeEditor(); + if (!editor2) { + return; + } + return editor2.invokeWithinContext((editorAccessor) => { + var _a10, _b4; + const kbService = editorAccessor.get(IContextKeyService); + const logService = editorAccessor.get(ILogService); + const enabled = kbService.contextMatchesRules((_a10 = this.desc.precondition) !== null && _a10 !== void 0 ? _a10 : void 0); + if (!enabled) { + logService.debug(`[EditorAction2] NOT running command because its precondition is FALSE`, this.desc.id, (_b4 = this.desc.precondition) === null || _b4 === void 0 ? void 0 : _b4.serialize()); + return; + } + return this.runEditorCommand(editorAccessor, editor2, ...args); + }); + } + }; + (function(EditorExtensionsRegistry2) { + function getEditorCommand(commandId) { + return EditorContributionRegistry.INSTANCE.getEditorCommand(commandId); + } + EditorExtensionsRegistry2.getEditorCommand = getEditorCommand; + function getEditorActions() { + return EditorContributionRegistry.INSTANCE.getEditorActions(); + } + EditorExtensionsRegistry2.getEditorActions = getEditorActions; + function getEditorContributions() { + return EditorContributionRegistry.INSTANCE.getEditorContributions(); + } + EditorExtensionsRegistry2.getEditorContributions = getEditorContributions; + function getSomeEditorContributions(ids) { + return EditorContributionRegistry.INSTANCE.getEditorContributions().filter((c) => ids.indexOf(c.id) >= 0); + } + EditorExtensionsRegistry2.getSomeEditorContributions = getSomeEditorContributions; + function getDiffEditorContributions() { + return EditorContributionRegistry.INSTANCE.getDiffEditorContributions(); + } + EditorExtensionsRegistry2.getDiffEditorContributions = getDiffEditorContributions; + })(EditorExtensionsRegistry || (EditorExtensionsRegistry = {})); + Extensions2 = { + EditorCommonContributions: "editor.contributions" + }; + EditorContributionRegistry = class { + constructor() { + this.editorContributions = []; + this.diffEditorContributions = []; + this.editorActions = []; + this.editorCommands = /* @__PURE__ */ Object.create(null); + } + registerEditorContribution(id, ctor, instantiation) { + this.editorContributions.push({ id, ctor, instantiation }); + } + getEditorContributions() { + return this.editorContributions.slice(0); + } + getDiffEditorContributions() { + return this.diffEditorContributions.slice(0); + } + registerEditorAction(action) { + action.register(); + this.editorActions.push(action); + } + getEditorActions() { + return this.editorActions; + } + registerEditorCommand(editorCommand) { + editorCommand.register(); + this.editorCommands[editorCommand.id] = editorCommand; + } + getEditorCommand(commandId) { + return this.editorCommands[commandId] || null; + } + }; + EditorContributionRegistry.INSTANCE = new EditorContributionRegistry(); + Registry.add(Extensions2.EditorCommonContributions, EditorContributionRegistry.INSTANCE); + UndoCommand = registerCommand(new MultiCommand({ + id: "undo", + precondition: void 0, + kbOpts: { + weight: 0, + primary: 2048 | 56 + /* KeyCode.KeyZ */ + }, + menuOpts: [{ + menuId: MenuId.MenubarEditMenu, + group: "1_do", + title: localize({ key: "miUndo", comment: ["&& denotes a mnemonic"] }, "&&Undo"), + order: 1 + }, { + menuId: MenuId.CommandPalette, + group: "", + title: localize("undo", "Undo"), + order: 1 + }] + })); + registerCommand(new ProxyCommand(UndoCommand, { id: "default:undo", precondition: void 0 })); + RedoCommand = registerCommand(new MultiCommand({ + id: "redo", + precondition: void 0, + kbOpts: { + weight: 0, + primary: 2048 | 55, + secondary: [ + 2048 | 1024 | 56 + /* KeyCode.KeyZ */ + ], + mac: { + primary: 2048 | 1024 | 56 + /* KeyCode.KeyZ */ + } + }, + menuOpts: [{ + menuId: MenuId.MenubarEditMenu, + group: "1_do", + title: localize({ key: "miRedo", comment: ["&& denotes a mnemonic"] }, "&&Redo"), + order: 2 + }, { + menuId: MenuId.CommandPalette, + group: "", + title: localize("redo", "Redo"), + order: 1 + }] + })); + registerCommand(new ProxyCommand(RedoCommand, { id: "default:redo", precondition: void 0 })); + SelectAllCommand = registerCommand(new MultiCommand({ + id: "editor.action.selectAll", + precondition: void 0, + kbOpts: { + weight: 0, + kbExpr: null, + primary: 2048 | 31 + /* KeyCode.KeyA */ + }, + menuOpts: [{ + menuId: MenuId.MenubarSelectionMenu, + group: "1_basic", + title: localize({ key: "miSelectAll", comment: ["&& denotes a mnemonic"] }, "&&Select All"), + order: 1 + }, { + menuId: MenuId.CommandPalette, + group: "", + title: localize("selectAll", "Select All"), + order: 1 + }] + })); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/worker/simpleWorker.js +function logOnceWebWorkerWarning(err) { + if (!isWeb) { + return; + } + if (!webWorkerWarningLogged) { + webWorkerWarningLogged = true; + console.warn("Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq"); + } + console.warn(err.message); +} +function propertyIsEvent(name) { + return name[0] === "o" && name[1] === "n" && isUpperAsciiLetter(name.charCodeAt(2)); +} +function propertyIsDynamicEvent(name) { + return /^onDynamic/.test(name) && isUpperAsciiLetter(name.charCodeAt(9)); +} +function createProxyObject2(methodNames, invoke, proxyListen) { + const createProxyMethod = (method) => { + return function() { + const args = Array.prototype.slice.call(arguments, 0); + return invoke(method, args); + }; + }; + const createProxyDynamicEvent = (eventName) => { + return function(arg) { + return proxyListen(eventName, arg); + }; + }; + const result = {}; + for (const methodName of methodNames) { + if (propertyIsDynamicEvent(methodName)) { + result[methodName] = createProxyDynamicEvent(methodName); + continue; + } + if (propertyIsEvent(methodName)) { + result[methodName] = proxyListen(methodName, void 0); + continue; + } + result[methodName] = createProxyMethod(methodName); + } + return result; +} +var INITIALIZE, webWorkerWarningLogged, RequestMessage, ReplyMessage, SubscribeEventMessage, EventMessage, UnsubscribeEventMessage, SimpleWorkerProtocol, SimpleWorkerClient, SimpleWorkerServer; +var init_simpleWorker = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/worker/simpleWorker.js"() { + init_errors(); + init_event(); + init_lifecycle(); + init_objects(); + init_platform(); + init_strings(); + INITIALIZE = "$initialize"; + webWorkerWarningLogged = false; + RequestMessage = class { + constructor(vsWorker, req, method, args) { + this.vsWorker = vsWorker; + this.req = req; + this.method = method; + this.args = args; + this.type = 0; + } + }; + ReplyMessage = class { + constructor(vsWorker, seq, res, err) { + this.vsWorker = vsWorker; + this.seq = seq; + this.res = res; + this.err = err; + this.type = 1; + } + }; + SubscribeEventMessage = class { + constructor(vsWorker, req, eventName, arg) { + this.vsWorker = vsWorker; + this.req = req; + this.eventName = eventName; + this.arg = arg; + this.type = 2; + } + }; + EventMessage = class { + constructor(vsWorker, req, event) { + this.vsWorker = vsWorker; + this.req = req; + this.event = event; + this.type = 3; + } + }; + UnsubscribeEventMessage = class { + constructor(vsWorker, req) { + this.vsWorker = vsWorker; + this.req = req; + this.type = 4; + } + }; + SimpleWorkerProtocol = class { + constructor(handler) { + this._workerId = -1; + this._handler = handler; + this._lastSentReq = 0; + this._pendingReplies = /* @__PURE__ */ Object.create(null); + this._pendingEmitters = /* @__PURE__ */ new Map(); + this._pendingEvents = /* @__PURE__ */ new Map(); + } + setWorkerId(workerId) { + this._workerId = workerId; + } + sendMessage(method, args) { + const req = String(++this._lastSentReq); + return new Promise((resolve2, reject) => { + this._pendingReplies[req] = { + resolve: resolve2, + reject + }; + this._send(new RequestMessage(this._workerId, req, method, args)); + }); + } + listen(eventName, arg) { + let req = null; + const emitter = new Emitter({ + onWillAddFirstListener: () => { + req = String(++this._lastSentReq); + this._pendingEmitters.set(req, emitter); + this._send(new SubscribeEventMessage(this._workerId, req, eventName, arg)); + }, + onDidRemoveLastListener: () => { + this._pendingEmitters.delete(req); + this._send(new UnsubscribeEventMessage(this._workerId, req)); + req = null; + } + }); + return emitter.event; + } + handleMessage(message) { + if (!message || !message.vsWorker) { + return; + } + if (this._workerId !== -1 && message.vsWorker !== this._workerId) { + return; + } + this._handleMessage(message); + } + _handleMessage(msg) { + switch (msg.type) { + case 1: + return this._handleReplyMessage(msg); + case 0: + return this._handleRequestMessage(msg); + case 2: + return this._handleSubscribeEventMessage(msg); + case 3: + return this._handleEventMessage(msg); + case 4: + return this._handleUnsubscribeEventMessage(msg); + } + } + _handleReplyMessage(replyMessage) { + if (!this._pendingReplies[replyMessage.seq]) { + console.warn("Got reply to unknown seq"); + return; + } + const reply = this._pendingReplies[replyMessage.seq]; + delete this._pendingReplies[replyMessage.seq]; + if (replyMessage.err) { + let err = replyMessage.err; + if (replyMessage.err.$isError) { + err = new Error(); + err.name = replyMessage.err.name; + err.message = replyMessage.err.message; + err.stack = replyMessage.err.stack; + } + reply.reject(err); + return; + } + reply.resolve(replyMessage.res); + } + _handleRequestMessage(requestMessage) { + const req = requestMessage.req; + const result = this._handler.handleMessage(requestMessage.method, requestMessage.args); + result.then((r) => { + this._send(new ReplyMessage(this._workerId, req, r, void 0)); + }, (e) => { + if (e.detail instanceof Error) { + e.detail = transformErrorForSerialization(e.detail); + } + this._send(new ReplyMessage(this._workerId, req, void 0, transformErrorForSerialization(e))); + }); + } + _handleSubscribeEventMessage(msg) { + const req = msg.req; + const disposable = this._handler.handleEvent(msg.eventName, msg.arg)((event) => { + this._send(new EventMessage(this._workerId, req, event)); + }); + this._pendingEvents.set(req, disposable); + } + _handleEventMessage(msg) { + if (!this._pendingEmitters.has(msg.req)) { + console.warn("Got event for unknown req"); + return; + } + this._pendingEmitters.get(msg.req).fire(msg.event); + } + _handleUnsubscribeEventMessage(msg) { + if (!this._pendingEvents.has(msg.req)) { + console.warn("Got unsubscribe for unknown req"); + return; + } + this._pendingEvents.get(msg.req).dispose(); + this._pendingEvents.delete(msg.req); + } + _send(msg) { + const transfer = []; + if (msg.type === 0) { + for (let i = 0; i < msg.args.length; i++) { + if (msg.args[i] instanceof ArrayBuffer) { + transfer.push(msg.args[i]); + } + } + } else if (msg.type === 1) { + if (msg.res instanceof ArrayBuffer) { + transfer.push(msg.res); + } + } + this._handler.sendMessage(msg, transfer); + } + }; + SimpleWorkerClient = class extends Disposable { + constructor(workerFactory, moduleId, host) { + super(); + let lazyProxyReject = null; + this._worker = this._register(workerFactory.create("vs/base/common/worker/simpleWorker", (msg) => { + this._protocol.handleMessage(msg); + }, (err) => { + lazyProxyReject === null || lazyProxyReject === void 0 ? void 0 : lazyProxyReject(err); + })); + this._protocol = new SimpleWorkerProtocol({ + sendMessage: (msg, transfer) => { + this._worker.postMessage(msg, transfer); + }, + handleMessage: (method, args) => { + if (typeof host[method] !== "function") { + return Promise.reject(new Error("Missing method " + method + " on main thread host.")); + } + try { + return Promise.resolve(host[method].apply(host, args)); + } catch (e) { + return Promise.reject(e); + } + }, + handleEvent: (eventName, arg) => { + if (propertyIsDynamicEvent(eventName)) { + const event = host[eventName].call(host, arg); + if (typeof event !== "function") { + throw new Error(`Missing dynamic event ${eventName} on main thread host.`); + } + return event; + } + if (propertyIsEvent(eventName)) { + const event = host[eventName]; + if (typeof event !== "function") { + throw new Error(`Missing event ${eventName} on main thread host.`); + } + return event; + } + throw new Error(`Malformed event name ${eventName}`); + } + }); + this._protocol.setWorkerId(this._worker.getId()); + let loaderConfiguration = null; + const globalRequire = globalThis.require; + if (typeof globalRequire !== "undefined" && typeof globalRequire.getConfig === "function") { + loaderConfiguration = globalRequire.getConfig(); + } else if (typeof globalThis.requirejs !== "undefined") { + loaderConfiguration = globalThis.requirejs.s.contexts._.config; + } + const hostMethods = getAllMethodNames(host); + this._onModuleLoaded = this._protocol.sendMessage(INITIALIZE, [ + this._worker.getId(), + JSON.parse(JSON.stringify(loaderConfiguration)), + moduleId, + hostMethods + ]); + const proxyMethodRequest = (method, args) => { + return this._request(method, args); + }; + const proxyListen = (eventName, arg) => { + return this._protocol.listen(eventName, arg); + }; + this._lazyProxy = new Promise((resolve2, reject) => { + lazyProxyReject = reject; + this._onModuleLoaded.then((availableMethods) => { + resolve2(createProxyObject2(availableMethods, proxyMethodRequest, proxyListen)); + }, (e) => { + reject(e); + this._onError("Worker failed to load " + moduleId, e); + }); + }); + } + getProxyObject() { + return this._lazyProxy; + } + _request(method, args) { + return new Promise((resolve2, reject) => { + this._onModuleLoaded.then(() => { + this._protocol.sendMessage(method, args).then(resolve2, reject); + }, reject); + }); + } + _onError(message, error) { + console.error(message); + console.info(error); + } + }; + SimpleWorkerServer = class { + constructor(postMessage, requestHandlerFactory) { + this._requestHandlerFactory = requestHandlerFactory; + this._requestHandler = null; + this._protocol = new SimpleWorkerProtocol({ + sendMessage: (msg, transfer) => { + postMessage(msg, transfer); + }, + handleMessage: (method, args) => this._handleMessage(method, args), + handleEvent: (eventName, arg) => this._handleEvent(eventName, arg) + }); + } + onmessage(msg) { + this._protocol.handleMessage(msg); + } + _handleMessage(method, args) { + if (method === INITIALIZE) { + return this.initialize(args[0], args[1], args[2], args[3]); + } + if (!this._requestHandler || typeof this._requestHandler[method] !== "function") { + return Promise.reject(new Error("Missing requestHandler or method: " + method)); + } + try { + return Promise.resolve(this._requestHandler[method].apply(this._requestHandler, args)); + } catch (e) { + return Promise.reject(e); + } + } + _handleEvent(eventName, arg) { + if (!this._requestHandler) { + throw new Error(`Missing requestHandler`); + } + if (propertyIsDynamicEvent(eventName)) { + const event = this._requestHandler[eventName].call(this._requestHandler, arg); + if (typeof event !== "function") { + throw new Error(`Missing dynamic event ${eventName} on request handler.`); + } + return event; + } + if (propertyIsEvent(eventName)) { + const event = this._requestHandler[eventName]; + if (typeof event !== "function") { + throw new Error(`Missing event ${eventName} on request handler.`); + } + return event; + } + throw new Error(`Malformed event name ${eventName}`); + } + initialize(workerId, loaderConfig, moduleId, hostMethods) { + this._protocol.setWorkerId(workerId); + const proxyMethodRequest = (method, args) => { + return this._protocol.sendMessage(method, args); + }; + const proxyListen = (eventName, arg) => { + return this._protocol.listen(eventName, arg); + }; + const hostProxy = createProxyObject2(hostMethods, proxyMethodRequest, proxyListen); + if (this._requestHandlerFactory) { + this._requestHandler = this._requestHandlerFactory(hostProxy); + return Promise.resolve(getAllMethodNames(this._requestHandler)); + } + if (loaderConfig) { + if (typeof loaderConfig.baseUrl !== "undefined") { + delete loaderConfig["baseUrl"]; + } + if (typeof loaderConfig.paths !== "undefined") { + if (typeof loaderConfig.paths.vs !== "undefined") { + delete loaderConfig.paths["vs"]; + } + } + if (typeof loaderConfig.trustedTypesPolicy !== "undefined") { + delete loaderConfig["trustedTypesPolicy"]; + } + loaderConfig.catchError = true; + globalThis.require.config(loaderConfig); + } + return new Promise((resolve2, reject) => { + const req = globalThis.require; + req([moduleId], (module3) => { + this._requestHandler = module3.create(hostProxy); + if (!this._requestHandler) { + reject(new Error(`No RequestHandler!`)); + return; + } + resolve2(getAllMethodNames(this._requestHandler)); + }, reject); + }); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/trustedTypes.js +function createTrustedTypesPolicy(policyName, policyOptions) { + var _a10; + const monacoEnvironment2 = globalThis.MonacoEnvironment; + if (monacoEnvironment2 === null || monacoEnvironment2 === void 0 ? void 0 : monacoEnvironment2.createTrustedTypesPolicy) { + try { + return monacoEnvironment2.createTrustedTypesPolicy(policyName, policyOptions); + } catch (err) { + onUnexpectedError(err); + return void 0; + } + } + try { + return (_a10 = mainWindow.trustedTypes) === null || _a10 === void 0 ? void 0 : _a10.createPolicy(policyName, policyOptions); + } catch (err) { + onUnexpectedError(err); + return void 0; + } +} +var init_trustedTypes = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/trustedTypes.js"() { + init_window(); + init_errors(); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/defaultWorkerFactory.js +function getWorker(label) { + const monacoEnvironment2 = globalThis.MonacoEnvironment; + if (monacoEnvironment2) { + if (typeof monacoEnvironment2.getWorker === "function") { + return monacoEnvironment2.getWorker("workerMain.js", label); + } + if (typeof monacoEnvironment2.getWorkerUrl === "function") { + const workerUrl = monacoEnvironment2.getWorkerUrl("workerMain.js", label); + return new Worker(ttPolicy ? ttPolicy.createScriptURL(workerUrl) : workerUrl, { name: label }); + } + } + throw new Error(`You must define a function MonacoEnvironment.getWorkerUrl or MonacoEnvironment.getWorker`); +} +function isPromiseLike(obj) { + if (typeof obj.then === "function") { + return true; + } + return false; +} +var ttPolicy, WebWorker, DefaultWorkerFactory; +var init_defaultWorkerFactory = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/defaultWorkerFactory.js"() { + init_trustedTypes(); + init_errors(); + init_simpleWorker(); + init_lifecycle(); + ttPolicy = createTrustedTypesPolicy("defaultWorkerFactory", { createScriptURL: (value) => value }); + WebWorker = class extends Disposable { + constructor(moduleId, id, label, onMessageCallback, onErrorCallback) { + super(); + this.id = id; + this.label = label; + const workerOrPromise = getWorker(label); + if (isPromiseLike(workerOrPromise)) { + this.worker = workerOrPromise; + } else { + this.worker = Promise.resolve(workerOrPromise); + } + this.postMessage(moduleId, []); + this.worker.then((w) => { + w.onmessage = function(ev) { + onMessageCallback(ev.data); + }; + w.onmessageerror = onErrorCallback; + if (typeof w.addEventListener === "function") { + w.addEventListener("error", onErrorCallback); + } + }); + this._register(toDisposable(() => { + var _a10; + (_a10 = this.worker) === null || _a10 === void 0 ? void 0 : _a10.then((w) => { + w.onmessage = null; + w.onmessageerror = null; + w.removeEventListener("error", onErrorCallback); + w.terminate(); + }); + this.worker = null; + })); + } + getId() { + return this.id; + } + postMessage(message, transfer) { + var _a10; + (_a10 = this.worker) === null || _a10 === void 0 ? void 0 : _a10.then((w) => { + try { + w.postMessage(message, transfer); + } catch (err) { + onUnexpectedError(err); + onUnexpectedError(new Error(`FAILED to post message to '${this.label}'-worker`, { cause: err })); + } + }); + } + }; + DefaultWorkerFactory = class _DefaultWorkerFactory { + constructor(label) { + this._label = label; + this._webWorkerFailedBeforeError = false; + } + create(moduleId, onMessageCallback, onErrorCallback) { + const workerId = ++_DefaultWorkerFactory.LAST_WORKER_ID; + if (this._webWorkerFailedBeforeError) { + throw this._webWorkerFailedBeforeError; + } + return new WebWorker(moduleId, workerId, this._label || "anonymous" + workerId, onMessageCallback, (err) => { + logOnceWebWorkerWarning(err); + this._webWorkerFailedBeforeError = err; + onErrorCallback(err); + }); + } + }; + DefaultWorkerFactory.LAST_WORKER_ID = 0; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/languageConfiguration.js +function appendEntry(target, key, value) { + if (target.has(key)) { + target.get(key).push(value); + } else { + target.set(key, [value]); + } +} +var IndentAction2, StandardAutoClosingPairConditional, AutoClosingPairs; +var init_languageConfiguration = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/languageConfiguration.js"() { + (function(IndentAction3) { + IndentAction3[IndentAction3["None"] = 0] = "None"; + IndentAction3[IndentAction3["Indent"] = 1] = "Indent"; + IndentAction3[IndentAction3["IndentOutdent"] = 2] = "IndentOutdent"; + IndentAction3[IndentAction3["Outdent"] = 3] = "Outdent"; + })(IndentAction2 || (IndentAction2 = {})); + StandardAutoClosingPairConditional = class { + constructor(source) { + this._neutralCharacter = null; + this._neutralCharacterSearched = false; + this.open = source.open; + this.close = source.close; + this._inString = true; + this._inComment = true; + this._inRegEx = true; + if (Array.isArray(source.notIn)) { + for (let i = 0, len = source.notIn.length; i < len; i++) { + const notIn = source.notIn[i]; + switch (notIn) { + case "string": + this._inString = false; + break; + case "comment": + this._inComment = false; + break; + case "regex": + this._inRegEx = false; + break; + } + } + } + } + isOK(standardToken) { + switch (standardToken) { + case 0: + return true; + case 1: + return this._inComment; + case 2: + return this._inString; + case 3: + return this._inRegEx; + } + } + shouldAutoClose(context, column) { + if (context.getTokenCount() === 0) { + return true; + } + const tokenIndex = context.findTokenIndexAtOffset(column - 2); + const standardTokenType = context.getStandardTokenType(tokenIndex); + return this.isOK(standardTokenType); + } + _findNeutralCharacterInRange(fromCharCode, toCharCode) { + for (let charCode = fromCharCode; charCode <= toCharCode; charCode++) { + const character = String.fromCharCode(charCode); + if (!this.open.includes(character) && !this.close.includes(character)) { + return character; + } + } + return null; + } + /** + * Find a character in the range [0-9a-zA-Z] that does not appear in the open or close + */ + findNeutralCharacter() { + if (!this._neutralCharacterSearched) { + this._neutralCharacterSearched = true; + if (!this._neutralCharacter) { + this._neutralCharacter = this._findNeutralCharacterInRange( + 48, + 57 + /* CharCode.Digit9 */ + ); + } + if (!this._neutralCharacter) { + this._neutralCharacter = this._findNeutralCharacterInRange( + 97, + 122 + /* CharCode.z */ + ); + } + if (!this._neutralCharacter) { + this._neutralCharacter = this._findNeutralCharacterInRange( + 65, + 90 + /* CharCode.Z */ + ); + } + } + return this._neutralCharacter; + } + }; + AutoClosingPairs = class { + constructor(autoClosingPairs) { + this.autoClosingPairsOpenByStart = /* @__PURE__ */ new Map(); + this.autoClosingPairsOpenByEnd = /* @__PURE__ */ new Map(); + this.autoClosingPairsCloseByStart = /* @__PURE__ */ new Map(); + this.autoClosingPairsCloseByEnd = /* @__PURE__ */ new Map(); + this.autoClosingPairsCloseSingleChar = /* @__PURE__ */ new Map(); + for (const pair of autoClosingPairs) { + appendEntry(this.autoClosingPairsOpenByStart, pair.open.charAt(0), pair); + appendEntry(this.autoClosingPairsOpenByEnd, pair.open.charAt(pair.open.length - 1), pair); + appendEntry(this.autoClosingPairsCloseByStart, pair.close.charAt(0), pair); + appendEntry(this.autoClosingPairsCloseByEnd, pair.close.charAt(pair.close.length - 1), pair); + if (pair.close.length === 1 && pair.open.length === 1) { + appendEntry(this.autoClosingPairsCloseSingleChar, pair.close, pair); + } + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/supports/characterPair.js +var CharacterPairSupport; +var init_characterPair = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/supports/characterPair.js"() { + init_languageConfiguration(); + CharacterPairSupport = class _CharacterPairSupport { + constructor(config) { + if (config.autoClosingPairs) { + this._autoClosingPairs = config.autoClosingPairs.map((el) => new StandardAutoClosingPairConditional(el)); + } else if (config.brackets) { + this._autoClosingPairs = config.brackets.map((b) => new StandardAutoClosingPairConditional({ open: b[0], close: b[1] })); + } else { + this._autoClosingPairs = []; + } + if (config.__electricCharacterSupport && config.__electricCharacterSupport.docComment) { + const docComment = config.__electricCharacterSupport.docComment; + this._autoClosingPairs.push(new StandardAutoClosingPairConditional({ open: docComment.open, close: docComment.close || "" })); + } + this._autoCloseBeforeForQuotes = typeof config.autoCloseBefore === "string" ? config.autoCloseBefore : _CharacterPairSupport.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_QUOTES; + this._autoCloseBeforeForBrackets = typeof config.autoCloseBefore === "string" ? config.autoCloseBefore : _CharacterPairSupport.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_BRACKETS; + this._surroundingPairs = config.surroundingPairs || this._autoClosingPairs; + } + getAutoClosingPairs() { + return this._autoClosingPairs; + } + getAutoCloseBeforeSet(forQuotes) { + return forQuotes ? this._autoCloseBeforeForQuotes : this._autoCloseBeforeForBrackets; + } + getSurroundingPairs() { + return this._surroundingPairs; + } + }; + CharacterPairSupport.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_QUOTES = ";:.,=}])> \n "; + CharacterPairSupport.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_BRACKETS = "'\"`;:.,=}])> \n "; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/supports.js +function createScopedLineTokens(context, offset) { + const tokenCount = context.getCount(); + const tokenIndex = context.findTokenIndexAtOffset(offset); + const desiredLanguageId = context.getLanguageId(tokenIndex); + let lastTokenIndex = tokenIndex; + while (lastTokenIndex + 1 < tokenCount && context.getLanguageId(lastTokenIndex + 1) === desiredLanguageId) { + lastTokenIndex++; + } + let firstTokenIndex = tokenIndex; + while (firstTokenIndex > 0 && context.getLanguageId(firstTokenIndex - 1) === desiredLanguageId) { + firstTokenIndex--; + } + return new ScopedLineTokens(context, desiredLanguageId, firstTokenIndex, lastTokenIndex + 1, context.getStartOffset(firstTokenIndex), context.getEndOffset(lastTokenIndex)); +} +function ignoreBracketsInToken(standardTokenType) { + return (standardTokenType & 3) !== 0; +} +var ScopedLineTokens; +var init_supports = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/supports.js"() { + ScopedLineTokens = class { + constructor(actual, languageId, firstTokenIndex, lastTokenIndex, firstCharOffset, lastCharOffset) { + this._scopedLineTokensBrand = void 0; + this._actual = actual; + this.languageId = languageId; + this._firstTokenIndex = firstTokenIndex; + this._lastTokenIndex = lastTokenIndex; + this.firstCharOffset = firstCharOffset; + this._lastCharOffset = lastCharOffset; + this.languageIdCodec = actual.languageIdCodec; + } + getLineContent() { + const actualLineContent = this._actual.getLineContent(); + return actualLineContent.substring(this.firstCharOffset, this._lastCharOffset); + } + getLineLength() { + return this._lastCharOffset - this.firstCharOffset; + } + getActualLineContentBefore(offset) { + const actualLineContent = this._actual.getLineContent(); + return actualLineContent.substring(0, this.firstCharOffset + offset); + } + getTokenCount() { + return this._lastTokenIndex - this._firstTokenIndex; + } + findTokenIndexAtOffset(offset) { + return this._actual.findTokenIndexAtOffset(offset + this.firstCharOffset) - this._firstTokenIndex; + } + getStandardTokenType(tokenIndex) { + return this._actual.getStandardTokenType(tokenIndex + this._firstTokenIndex); + } + toIViewLineTokens() { + return this._actual.sliceAndInflate(this.firstCharOffset, this._lastCharOffset, 0); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/buffer.js +function readUInt16LE(source, offset) { + return source[offset + 0] << 0 >>> 0 | source[offset + 1] << 8 >>> 0; +} +function writeUInt16LE(destination, value, offset) { + destination[offset + 0] = value & 255; + value = value >>> 8; + destination[offset + 1] = value & 255; +} +function readUInt32BE(source, offset) { + return source[offset] * __pow(2, 24) + source[offset + 1] * __pow(2, 16) + source[offset + 2] * __pow(2, 8) + source[offset + 3]; +} +function writeUInt32BE(destination, value, offset) { + destination[offset + 3] = value; + value = value >>> 8; + destination[offset + 2] = value; + value = value >>> 8; + destination[offset + 1] = value; + value = value >>> 8; + destination[offset] = value; +} +function readUInt8(source, offset) { + return source[offset]; +} +function writeUInt8(destination, value, offset) { + destination[offset] = value; +} +var hasBuffer, indexOfTable, textDecoder, VSBuffer; +var init_buffer = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/buffer.js"() { + init_lazy(); + hasBuffer = typeof Buffer !== "undefined"; + indexOfTable = new Lazy(() => new Uint8Array(256)); + VSBuffer = class _VSBuffer { + /** + * When running in a nodejs context, if `actual` is not a nodejs Buffer, the backing store for + * the returned `VSBuffer` instance might use a nodejs Buffer allocated from node's Buffer pool, + * which is not transferrable. + */ + static wrap(actual) { + if (hasBuffer && !Buffer.isBuffer(actual)) { + actual = Buffer.from(actual.buffer, actual.byteOffset, actual.byteLength); + } + return new _VSBuffer(actual); + } + constructor(buffer) { + this.buffer = buffer; + this.byteLength = this.buffer.byteLength; + } + toString() { + if (hasBuffer) { + return this.buffer.toString(); + } else { + if (!textDecoder) { + textDecoder = new TextDecoder(); + } + return textDecoder.decode(this.buffer); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/stringBuilder.js +function getUTF16LE_TextDecoder() { + if (!_utf16LE_TextDecoder) { + _utf16LE_TextDecoder = new TextDecoder("UTF-16LE"); + } + return _utf16LE_TextDecoder; +} +function getUTF16BE_TextDecoder() { + if (!_utf16BE_TextDecoder) { + _utf16BE_TextDecoder = new TextDecoder("UTF-16BE"); + } + return _utf16BE_TextDecoder; +} +function getPlatformTextDecoder() { + if (!_platformTextDecoder) { + _platformTextDecoder = isLittleEndian() ? getUTF16LE_TextDecoder() : getUTF16BE_TextDecoder(); + } + return _platformTextDecoder; +} +function decodeUTF16LE(source, offset, len) { + const view = new Uint16Array(source.buffer, offset, len); + if (len > 0 && (view[0] === 65279 || view[0] === 65534)) { + return compatDecodeUTF16LE(source, offset, len); + } + return getUTF16LE_TextDecoder().decode(view); +} +function compatDecodeUTF16LE(source, offset, len) { + const result = []; + let resultLen = 0; + for (let i = 0; i < len; i++) { + const charCode = readUInt16LE(source, offset); + offset += 2; + result[resultLen++] = String.fromCharCode(charCode); + } + return result.join(""); +} +var _utf16LE_TextDecoder, _utf16BE_TextDecoder, _platformTextDecoder, StringBuilder; +var init_stringBuilder = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/stringBuilder.js"() { + init_strings(); + init_platform(); + init_buffer(); + StringBuilder = class { + constructor(capacity) { + this._capacity = capacity | 0; + this._buffer = new Uint16Array(this._capacity); + this._completedStrings = null; + this._bufferLength = 0; + } + reset() { + this._completedStrings = null; + this._bufferLength = 0; + } + build() { + if (this._completedStrings !== null) { + this._flushBuffer(); + return this._completedStrings.join(""); + } + return this._buildBuffer(); + } + _buildBuffer() { + if (this._bufferLength === 0) { + return ""; + } + const view = new Uint16Array(this._buffer.buffer, 0, this._bufferLength); + return getPlatformTextDecoder().decode(view); + } + _flushBuffer() { + const bufferString = this._buildBuffer(); + this._bufferLength = 0; + if (this._completedStrings === null) { + this._completedStrings = [bufferString]; + } else { + this._completedStrings[this._completedStrings.length] = bufferString; + } + } + /** + * Append a char code (<2^16) + */ + appendCharCode(charCode) { + const remainingSpace = this._capacity - this._bufferLength; + if (remainingSpace <= 1) { + if (remainingSpace === 0 || isHighSurrogate(charCode)) { + this._flushBuffer(); + } + } + this._buffer[this._bufferLength++] = charCode; + } + /** + * Append an ASCII char code (<2^8) + */ + appendASCIICharCode(charCode) { + if (this._bufferLength === this._capacity) { + this._flushBuffer(); + } + this._buffer[this._bufferLength++] = charCode; + } + appendString(str) { + const strLen = str.length; + if (this._bufferLength + strLen >= this._capacity) { + this._flushBuffer(); + this._completedStrings[this._completedStrings.length] = str; + return; + } + for (let i = 0; i < strLen; i++) { + this._buffer[this._bufferLength++] = str.charCodeAt(i); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/supports/richEditBrackets.js +function groupFuzzyBrackets(brackets) { + const N = brackets.length; + brackets = brackets.map((b) => [b[0].toLowerCase(), b[1].toLowerCase()]); + const group = []; + for (let i = 0; i < N; i++) { + group[i] = i; + } + const areOverlapping = (a3, b) => { + const [aOpen, aClose] = a3; + const [bOpen, bClose] = b; + return aOpen === bOpen || aOpen === bClose || aClose === bOpen || aClose === bClose; + }; + const mergeGroups = (g1, g2) => { + const newG = Math.min(g1, g2); + const oldG = Math.max(g1, g2); + for (let i = 0; i < N; i++) { + if (group[i] === oldG) { + group[i] = newG; + } + } + }; + for (let i = 0; i < N; i++) { + const a3 = brackets[i]; + for (let j = i + 1; j < N; j++) { + const b = brackets[j]; + if (areOverlapping(a3, b)) { + mergeGroups(group[i], group[j]); + } + } + } + const result = []; + for (let g = 0; g < N; g++) { + const currentOpen = []; + const currentClose = []; + for (let i = 0; i < N; i++) { + if (group[i] === g) { + const [open, close] = brackets[i]; + currentOpen.push(open); + currentClose.push(close); + } + } + if (currentOpen.length > 0) { + result.push({ + open: currentOpen, + close: currentClose + }); + } + } + return result; +} +function collectSuperstrings(str, brackets, currentIndex, dest) { + for (let i = 0, len = brackets.length; i < len; i++) { + if (i === currentIndex) { + continue; + } + const bracket = brackets[i]; + for (const open of bracket.open) { + if (open.indexOf(str) >= 0) { + dest.push(open); + } + } + for (const close of bracket.close) { + if (close.indexOf(str) >= 0) { + dest.push(close); + } + } + } +} +function lengthcmp(a3, b) { + return a3.length - b.length; +} +function unique(arr) { + if (arr.length <= 1) { + return arr; + } + const result = []; + const seen = /* @__PURE__ */ new Set(); + for (const element of arr) { + if (seen.has(element)) { + continue; + } + result.push(element); + seen.add(element); + } + return result; +} +function getRegexForBracketPair(open, close, brackets, currentIndex) { + let pieces = []; + pieces = pieces.concat(open); + pieces = pieces.concat(close); + for (let i = 0, len = pieces.length; i < len; i++) { + collectSuperstrings(pieces[i], brackets, currentIndex, pieces); + } + pieces = unique(pieces); + pieces.sort(lengthcmp); + pieces.reverse(); + return createBracketOrRegExp(pieces); +} +function getReversedRegexForBracketPair(open, close, brackets, currentIndex) { + let pieces = []; + pieces = pieces.concat(open); + pieces = pieces.concat(close); + for (let i = 0, len = pieces.length; i < len; i++) { + collectSuperstrings(pieces[i], brackets, currentIndex, pieces); + } + pieces = unique(pieces); + pieces.sort(lengthcmp); + pieces.reverse(); + return createBracketOrRegExp(pieces.map(toReversedString)); +} +function getRegexForBrackets(brackets) { + let pieces = []; + for (const bracket of brackets) { + for (const open of bracket.open) { + pieces.push(open); + } + for (const close of bracket.close) { + pieces.push(close); + } + } + pieces = unique(pieces); + return createBracketOrRegExp(pieces); +} +function getReversedRegexForBrackets(brackets) { + let pieces = []; + for (const bracket of brackets) { + for (const open of bracket.open) { + pieces.push(open); + } + for (const close of bracket.close) { + pieces.push(close); + } + } + pieces = unique(pieces); + return createBracketOrRegExp(pieces.map(toReversedString)); +} +function prepareBracketForRegExp(str) { + const insertWordBoundaries = /^[\w ]+$/.test(str); + str = escapeRegExpCharacters(str); + return insertWordBoundaries ? `\\b${str}\\b` : str; +} +function createBracketOrRegExp(pieces, options2) { + const regexStr = `(${pieces.map(prepareBracketForRegExp).join(")|(")})`; + return createRegExp(regexStr, true, options2); +} +var RichEditBracket, RichEditBrackets, toReversedString, BracketsUtils; +var init_richEditBrackets = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/supports/richEditBrackets.js"() { + init_strings(); + init_stringBuilder(); + init_range(); + RichEditBracket = class _RichEditBracket { + constructor(languageId, index, open, close, forwardRegex, reversedRegex) { + this._richEditBracketBrand = void 0; + this.languageId = languageId; + this.index = index; + this.open = open; + this.close = close; + this.forwardRegex = forwardRegex; + this.reversedRegex = reversedRegex; + this._openSet = _RichEditBracket._toSet(this.open); + this._closeSet = _RichEditBracket._toSet(this.close); + } + /** + * Check if the provided `text` is an open bracket in this group. + */ + isOpen(text2) { + return this._openSet.has(text2); + } + /** + * Check if the provided `text` is a close bracket in this group. + */ + isClose(text2) { + return this._closeSet.has(text2); + } + static _toSet(arr) { + const result = /* @__PURE__ */ new Set(); + for (const element of arr) { + result.add(element); + } + return result; + } + }; + RichEditBrackets = class { + constructor(languageId, _brackets) { + this._richEditBracketsBrand = void 0; + const brackets = groupFuzzyBrackets(_brackets); + this.brackets = brackets.map((b, index) => { + return new RichEditBracket(languageId, index, b.open, b.close, getRegexForBracketPair(b.open, b.close, brackets, index), getReversedRegexForBracketPair(b.open, b.close, brackets, index)); + }); + this.forwardRegex = getRegexForBrackets(this.brackets); + this.reversedRegex = getReversedRegexForBrackets(this.brackets); + this.textIsBracket = {}; + this.textIsOpenBracket = {}; + this.maxBracketLength = 0; + for (const bracket of this.brackets) { + for (const open of bracket.open) { + this.textIsBracket[open] = bracket; + this.textIsOpenBracket[open] = true; + this.maxBracketLength = Math.max(this.maxBracketLength, open.length); + } + for (const close of bracket.close) { + this.textIsBracket[close] = bracket; + this.textIsOpenBracket[close] = false; + this.maxBracketLength = Math.max(this.maxBracketLength, close.length); + } + } + } + }; + toReversedString = /* @__PURE__ */ function() { + function reverse(str) { + const arr = new Uint16Array(str.length); + let offset = 0; + for (let i = str.length - 1; i >= 0; i--) { + arr[offset++] = str.charCodeAt(i); + } + return getPlatformTextDecoder().decode(arr); + } + let lastInput = null; + let lastOutput = null; + return function toReversedString2(str) { + if (lastInput !== str) { + lastInput = str; + lastOutput = reverse(lastInput); + } + return lastOutput; + }; + }(); + BracketsUtils = class { + static _findPrevBracketInText(reversedBracketRegex, lineNumber, reversedText, offset) { + const m = reversedText.match(reversedBracketRegex); + if (!m) { + return null; + } + const matchOffset = reversedText.length - (m.index || 0); + const matchLength = m[0].length; + const absoluteMatchOffset = offset + matchOffset; + return new Range(lineNumber, absoluteMatchOffset - matchLength + 1, lineNumber, absoluteMatchOffset + 1); + } + static findPrevBracketInRange(reversedBracketRegex, lineNumber, lineText, startOffset, endOffset) { + const reversedLineText = toReversedString(lineText); + const reversedSubstr = reversedLineText.substring(lineText.length - endOffset, lineText.length - startOffset); + return this._findPrevBracketInText(reversedBracketRegex, lineNumber, reversedSubstr, startOffset); + } + static findNextBracketInText(bracketRegex, lineNumber, text2, offset) { + const m = text2.match(bracketRegex); + if (!m) { + return null; + } + const matchOffset = m.index || 0; + const matchLength = m[0].length; + if (matchLength === 0) { + return null; + } + const absoluteMatchOffset = offset + matchOffset; + return new Range(lineNumber, absoluteMatchOffset + 1, lineNumber, absoluteMatchOffset + 1 + matchLength); + } + static findNextBracketInRange(bracketRegex, lineNumber, lineText, startOffset, endOffset) { + const substr = lineText.substring(startOffset, endOffset); + return this.findNextBracketInText(bracketRegex, lineNumber, substr, startOffset); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/supports/electricCharacter.js +var BracketElectricCharacterSupport; +var init_electricCharacter = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/supports/electricCharacter.js"() { + init_arrays(); + init_supports(); + init_richEditBrackets(); + BracketElectricCharacterSupport = class { + constructor(richEditBrackets) { + this._richEditBrackets = richEditBrackets; + } + getElectricCharacters() { + const result = []; + if (this._richEditBrackets) { + for (const bracket of this._richEditBrackets.brackets) { + for (const close of bracket.close) { + const lastChar = close.charAt(close.length - 1); + result.push(lastChar); + } + } + } + return distinct(result); + } + onElectricCharacter(character, context, column) { + if (!this._richEditBrackets || this._richEditBrackets.brackets.length === 0) { + return null; + } + const tokenIndex = context.findTokenIndexAtOffset(column - 1); + if (ignoreBracketsInToken(context.getStandardTokenType(tokenIndex))) { + return null; + } + const reversedBracketRegex = this._richEditBrackets.reversedRegex; + const text2 = context.getLineContent().substring(0, column - 1) + character; + const r = BracketsUtils.findPrevBracketInRange(reversedBracketRegex, 1, text2, 0, text2.length); + if (!r) { + return null; + } + const bracketText = text2.substring(r.startColumn - 1, r.endColumn - 1).toLowerCase(); + const isOpen = this._richEditBrackets.textIsOpenBracket[bracketText]; + if (isOpen) { + return null; + } + const textBeforeBracket = context.getActualLineContentBefore(r.startColumn - 1); + if (!/^\s*$/.test(textBeforeBracket)) { + return null; + } + return { + matchOpenBracket: bracketText + }; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/supports/indentRules.js +function resetGlobalRegex(reg) { + if (reg.global) { + reg.lastIndex = 0; + } + return true; +} +var IndentRulesSupport; +var init_indentRules = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/supports/indentRules.js"() { + IndentRulesSupport = class { + constructor(indentationRules) { + this._indentationRules = indentationRules; + } + shouldIncrease(text2) { + if (this._indentationRules) { + if (this._indentationRules.increaseIndentPattern && resetGlobalRegex(this._indentationRules.increaseIndentPattern) && this._indentationRules.increaseIndentPattern.test(text2)) { + return true; + } + } + return false; + } + shouldDecrease(text2) { + if (this._indentationRules && this._indentationRules.decreaseIndentPattern && resetGlobalRegex(this._indentationRules.decreaseIndentPattern) && this._indentationRules.decreaseIndentPattern.test(text2)) { + return true; + } + return false; + } + shouldIndentNextLine(text2) { + if (this._indentationRules && this._indentationRules.indentNextLinePattern && resetGlobalRegex(this._indentationRules.indentNextLinePattern) && this._indentationRules.indentNextLinePattern.test(text2)) { + return true; + } + return false; + } + shouldIgnore(text2) { + if (this._indentationRules && this._indentationRules.unIndentedLinePattern && resetGlobalRegex(this._indentationRules.unIndentedLinePattern) && this._indentationRules.unIndentedLinePattern.test(text2)) { + return true; + } + return false; + } + getIndentMetadata(text2) { + let ret = 0; + if (this.shouldIncrease(text2)) { + ret += 1; + } + if (this.shouldDecrease(text2)) { + ret += 2; + } + if (this.shouldIndentNextLine(text2)) { + ret += 4; + } + if (this.shouldIgnore(text2)) { + ret += 8; + } + return ret; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/supports/onEnter.js +var OnEnterSupport; +var init_onEnter = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/supports/onEnter.js"() { + init_errors(); + init_strings(); + init_languageConfiguration(); + OnEnterSupport = class _OnEnterSupport { + constructor(opts) { + opts = opts || {}; + opts.brackets = opts.brackets || [ + ["(", ")"], + ["{", "}"], + ["[", "]"] + ]; + this._brackets = []; + opts.brackets.forEach((bracket) => { + const openRegExp = _OnEnterSupport._createOpenBracketRegExp(bracket[0]); + const closeRegExp = _OnEnterSupport._createCloseBracketRegExp(bracket[1]); + if (openRegExp && closeRegExp) { + this._brackets.push({ + open: bracket[0], + openRegExp, + close: bracket[1], + closeRegExp + }); + } + }); + this._regExpRules = opts.onEnterRules || []; + } + onEnter(autoIndent, previousLineText, beforeEnterText, afterEnterText) { + if (autoIndent >= 3) { + for (let i = 0, len = this._regExpRules.length; i < len; i++) { + const rule = this._regExpRules[i]; + const regResult = [{ + reg: rule.beforeText, + text: beforeEnterText + }, { + reg: rule.afterText, + text: afterEnterText + }, { + reg: rule.previousLineText, + text: previousLineText + }].every((obj) => { + if (!obj.reg) { + return true; + } + obj.reg.lastIndex = 0; + return obj.reg.test(obj.text); + }); + if (regResult) { + return rule.action; + } + } + } + if (autoIndent >= 2) { + if (beforeEnterText.length > 0 && afterEnterText.length > 0) { + for (let i = 0, len = this._brackets.length; i < len; i++) { + const bracket = this._brackets[i]; + if (bracket.openRegExp.test(beforeEnterText) && bracket.closeRegExp.test(afterEnterText)) { + return { indentAction: IndentAction2.IndentOutdent }; + } + } + } + } + if (autoIndent >= 2) { + if (beforeEnterText.length > 0) { + for (let i = 0, len = this._brackets.length; i < len; i++) { + const bracket = this._brackets[i]; + if (bracket.openRegExp.test(beforeEnterText)) { + return { indentAction: IndentAction2.Indent }; + } + } + } + } + return null; + } + static _createOpenBracketRegExp(bracket) { + let str = escapeRegExpCharacters(bracket); + if (!/\B/.test(str.charAt(0))) { + str = "\\b" + str; + } + str += "\\s*$"; + return _OnEnterSupport._safeRegExp(str); + } + static _createCloseBracketRegExp(bracket) { + let str = escapeRegExpCharacters(bracket); + if (!/\B/.test(str.charAt(str.length - 1))) { + str = str + "\\b"; + } + str = "^\\s*" + str; + return _OnEnterSupport._safeRegExp(str); + } + static _safeRegExp(def) { + try { + return new RegExp(def); + } catch (err) { + onUnexpectedError(err); + return null; + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/configuration/common/configuration.js +function toValuesTree(properties, conflictReporter) { + const root = /* @__PURE__ */ Object.create(null); + for (const key in properties) { + addToValueTree(root, key, properties[key], conflictReporter); + } + return root; +} +function addToValueTree(settingsTreeRoot, key, value, conflictReporter) { + const segments = key.split("."); + const last = segments.pop(); + let curr = settingsTreeRoot; + for (let i = 0; i < segments.length; i++) { + const s = segments[i]; + let obj = curr[s]; + switch (typeof obj) { + case "undefined": + obj = curr[s] = /* @__PURE__ */ Object.create(null); + break; + case "object": + if (obj === null) { + conflictReporter(`Ignoring ${key} as ${segments.slice(0, i + 1).join(".")} is null`); + return; + } + break; + default: + conflictReporter(`Ignoring ${key} as ${segments.slice(0, i + 1).join(".")} is ${JSON.stringify(obj)}`); + return; + } + curr = obj; + } + if (typeof curr === "object" && curr !== null) { + try { + curr[last] = value; + } catch (e) { + conflictReporter(`Ignoring ${key} as ${segments.join(".")} is ${JSON.stringify(curr)}`); + } + } else { + conflictReporter(`Ignoring ${key} as ${segments.join(".")} is ${JSON.stringify(curr)}`); + } +} +function removeFromValueTree(valueTree, key) { + const segments = key.split("."); + doRemoveFromValueTree(valueTree, segments); +} +function doRemoveFromValueTree(valueTree, segments) { + const first2 = segments.shift(); + if (segments.length === 0) { + delete valueTree[first2]; + return; + } + if (Object.keys(valueTree).indexOf(first2) !== -1) { + const value = valueTree[first2]; + if (typeof value === "object" && !Array.isArray(value)) { + doRemoveFromValueTree(value, segments); + if (Object.keys(value).length === 0) { + delete valueTree[first2]; + } + } + } +} +function getConfigurationValue(config, settingPath, defaultValue) { + function accessSetting(config2, path2) { + let current = config2; + for (const component of path2) { + if (typeof current !== "object" || current === null) { + return void 0; + } + current = current[component]; + } + return current; + } + const path = settingPath.split("."); + const result = accessSetting(config, path); + return typeof result === "undefined" ? defaultValue : result; +} +function getLanguageTagSettingPlainKey(settingKey) { + return settingKey.replace(/[\[\]]/g, ""); +} +var IConfigurationService; +var init_configuration = __esm({ + "node_modules/monaco-editor/esm/vs/platform/configuration/common/configuration.js"() { + init_instantiation(); + IConfigurationService = createDecorator("configurationService"); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/language.js +var ILanguageService; +var init_language = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/language.js"() { + init_instantiation(); + ILanguageService = createDecorator("languageService"); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/instantiation/common/descriptors.js +var SyncDescriptor; +var init_descriptors = __esm({ + "node_modules/monaco-editor/esm/vs/platform/instantiation/common/descriptors.js"() { + SyncDescriptor = class { + constructor(ctor, staticArguments = [], supportsDelayedInstantiation = false) { + this.ctor = ctor; + this.staticArguments = staticArguments; + this.supportsDelayedInstantiation = supportsDelayedInstantiation; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/instantiation/common/extensions.js +function registerSingleton(id, ctorOrDescriptor, supportsDelayedInstantiation) { + if (!(ctorOrDescriptor instanceof SyncDescriptor)) { + ctorOrDescriptor = new SyncDescriptor(ctorOrDescriptor, [], Boolean(supportsDelayedInstantiation)); + } + _registry.push([id, ctorOrDescriptor]); +} +function getSingletonServiceDescriptors() { + return _registry; +} +var _registry; +var init_extensions = __esm({ + "node_modules/monaco-editor/esm/vs/platform/instantiation/common/extensions.js"() { + init_descriptors(); + _registry = []; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/mime.js +var Mimes; +var init_mime = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/mime.js"() { + Mimes = Object.freeze({ + text: "text/plain", + binary: "application/octet-stream", + unknown: "application/unknown", + markdown: "text/markdown", + latex: "text/latex", + uriList: "text/uri-list" + }); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/jsonschemas/common/jsonContributionRegistry.js +function normalizeId(id) { + if (id.length > 0 && id.charAt(id.length - 1) === "#") { + return id.substring(0, id.length - 1); + } + return id; +} +var Extensions3, JSONContributionRegistry, jsonContributionRegistry; +var init_jsonContributionRegistry = __esm({ + "node_modules/monaco-editor/esm/vs/platform/jsonschemas/common/jsonContributionRegistry.js"() { + init_event(); + init_platform2(); + Extensions3 = { + JSONContribution: "base.contributions.json" + }; + JSONContributionRegistry = class { + constructor() { + this._onDidChangeSchema = new Emitter(); + this.schemasById = {}; + } + registerSchema(uri, unresolvedSchemaContent) { + this.schemasById[normalizeId(uri)] = unresolvedSchemaContent; + this._onDidChangeSchema.fire(uri); + } + notifySchemaChanged(uri) { + this._onDidChangeSchema.fire(uri); + } + }; + jsonContributionRegistry = new JSONContributionRegistry(); + Registry.add(Extensions3.JSONContribution, jsonContributionRegistry); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/configuration/common/configurationRegistry.js +function overrideIdentifiersFromKey(key) { + const identifiers = []; + if (OVERRIDE_PROPERTY_REGEX.test(key)) { + let matches2 = OVERRIDE_IDENTIFIER_REGEX.exec(key); + while (matches2 === null || matches2 === void 0 ? void 0 : matches2.length) { + const identifier3 = matches2[1].trim(); + if (identifier3) { + identifiers.push(identifier3); + } + matches2 = OVERRIDE_IDENTIFIER_REGEX.exec(key); + } + } + return distinct(identifiers); +} +function getDefaultValue(type) { + const t4 = Array.isArray(type) ? type[0] : type; + switch (t4) { + case "boolean": + return false; + case "integer": + case "number": + return 0; + case "string": + return ""; + case "array": + return []; + case "object": + return {}; + default: + return null; + } +} +function validateProperty(property, schema) { + var _a10, _b4, _c2, _d2; + if (!property.trim()) { + return localize("config.property.empty", "Cannot register an empty property"); + } + if (OVERRIDE_PROPERTY_REGEX.test(property)) { + return localize("config.property.languageDefault", "Cannot register '{0}'. This matches property pattern '\\\\[.*\\\\]$' for describing language specific editor settings. Use 'configurationDefaults' contribution.", property); + } + if (configurationRegistry.getConfigurationProperties()[property] !== void 0) { + return localize("config.property.duplicate", "Cannot register '{0}'. This property is already registered.", property); + } + if (((_a10 = schema.policy) === null || _a10 === void 0 ? void 0 : _a10.name) && configurationRegistry.getPolicyConfigurations().get((_b4 = schema.policy) === null || _b4 === void 0 ? void 0 : _b4.name) !== void 0) { + return localize("config.policy.duplicate", "Cannot register '{0}'. The associated policy {1} is already registered with {2}.", property, (_c2 = schema.policy) === null || _c2 === void 0 ? void 0 : _c2.name, configurationRegistry.getPolicyConfigurations().get((_d2 = schema.policy) === null || _d2 === void 0 ? void 0 : _d2.name)); + } + return null; +} +var Extensions4, allSettings, applicationSettings, machineSettings, machineOverridableSettings, windowSettings, resourceSettings, resourceLanguageSettingsSchemaId, contributionRegistry, ConfigurationRegistry, OVERRIDE_IDENTIFIER_PATTERN, OVERRIDE_IDENTIFIER_REGEX, OVERRIDE_PROPERTY_PATTERN, OVERRIDE_PROPERTY_REGEX, configurationRegistry; +var init_configurationRegistry = __esm({ + "node_modules/monaco-editor/esm/vs/platform/configuration/common/configurationRegistry.js"() { + init_arrays(); + init_event(); + init_types(); + init_nls(); + init_configuration(); + init_jsonContributionRegistry(); + init_platform2(); + Extensions4 = { + Configuration: "base.contributions.configuration" + }; + allSettings = { properties: {}, patternProperties: {} }; + applicationSettings = { properties: {}, patternProperties: {} }; + machineSettings = { properties: {}, patternProperties: {} }; + machineOverridableSettings = { properties: {}, patternProperties: {} }; + windowSettings = { properties: {}, patternProperties: {} }; + resourceSettings = { properties: {}, patternProperties: {} }; + resourceLanguageSettingsSchemaId = "vscode://schemas/settings/resourceLanguage"; + contributionRegistry = Registry.as(Extensions3.JSONContribution); + ConfigurationRegistry = class { + constructor() { + this.overrideIdentifiers = /* @__PURE__ */ new Set(); + this._onDidSchemaChange = new Emitter(); + this._onDidUpdateConfiguration = new Emitter(); + this.configurationDefaultsOverrides = /* @__PURE__ */ new Map(); + this.defaultLanguageConfigurationOverridesNode = { + id: "defaultOverrides", + title: localize("defaultLanguageConfigurationOverrides.title", "Default Language Configuration Overrides"), + properties: {} + }; + this.configurationContributors = [this.defaultLanguageConfigurationOverridesNode]; + this.resourceLanguageSettingsSchema = { + properties: {}, + patternProperties: {}, + additionalProperties: true, + allowTrailingCommas: true, + allowComments: true + }; + this.configurationProperties = {}; + this.policyConfigurations = /* @__PURE__ */ new Map(); + this.excludedConfigurationProperties = {}; + contributionRegistry.registerSchema(resourceLanguageSettingsSchemaId, this.resourceLanguageSettingsSchema); + this.registerOverridePropertyPatternKey(); + } + registerConfiguration(configuration, validate2 = true) { + this.registerConfigurations([configuration], validate2); + } + registerConfigurations(configurations, validate2 = true) { + const properties = /* @__PURE__ */ new Set(); + this.doRegisterConfigurations(configurations, validate2, properties); + contributionRegistry.registerSchema(resourceLanguageSettingsSchemaId, this.resourceLanguageSettingsSchema); + this._onDidSchemaChange.fire(); + this._onDidUpdateConfiguration.fire({ properties }); + } + registerDefaultConfigurations(configurationDefaults) { + const properties = /* @__PURE__ */ new Set(); + this.doRegisterDefaultConfigurations(configurationDefaults, properties); + this._onDidSchemaChange.fire(); + this._onDidUpdateConfiguration.fire({ properties, defaultsOverrides: true }); + } + doRegisterDefaultConfigurations(configurationDefaults, bucket) { + var _a10; + const overrideIdentifiers = []; + for (const { overrides, source } of configurationDefaults) { + for (const key in overrides) { + bucket.add(key); + if (OVERRIDE_PROPERTY_REGEX.test(key)) { + const configurationDefaultOverride = this.configurationDefaultsOverrides.get(key); + const valuesSources = (_a10 = configurationDefaultOverride === null || configurationDefaultOverride === void 0 ? void 0 : configurationDefaultOverride.valuesSources) !== null && _a10 !== void 0 ? _a10 : /* @__PURE__ */ new Map(); + if (source) { + for (const configuration of Object.keys(overrides[key])) { + valuesSources.set(configuration, source); + } + } + const defaultValue = __spreadValues(__spreadValues({}, (configurationDefaultOverride === null || configurationDefaultOverride === void 0 ? void 0 : configurationDefaultOverride.value) || {}), overrides[key]); + this.configurationDefaultsOverrides.set(key, { source, value: defaultValue, valuesSources }); + const plainKey = getLanguageTagSettingPlainKey(key); + const property = { + type: "object", + default: defaultValue, + description: localize("defaultLanguageConfiguration.description", "Configure settings to be overridden for the {0} language.", plainKey), + $ref: resourceLanguageSettingsSchemaId, + defaultDefaultValue: defaultValue, + source: isString(source) ? void 0 : source, + defaultValueSource: source + }; + overrideIdentifiers.push(...overrideIdentifiersFromKey(key)); + this.configurationProperties[key] = property; + this.defaultLanguageConfigurationOverridesNode.properties[key] = property; + } else { + this.configurationDefaultsOverrides.set(key, { value: overrides[key], source }); + const property = this.configurationProperties[key]; + if (property) { + this.updatePropertyDefaultValue(key, property); + this.updateSchema(key, property); + } + } + } + } + this.doRegisterOverrideIdentifiers(overrideIdentifiers); + } + registerOverrideIdentifiers(overrideIdentifiers) { + this.doRegisterOverrideIdentifiers(overrideIdentifiers); + this._onDidSchemaChange.fire(); + } + doRegisterOverrideIdentifiers(overrideIdentifiers) { + for (const overrideIdentifier of overrideIdentifiers) { + this.overrideIdentifiers.add(overrideIdentifier); + } + this.updateOverridePropertyPatternKey(); + } + doRegisterConfigurations(configurations, validate2, bucket) { + configurations.forEach((configuration) => { + this.validateAndRegisterProperties(configuration, validate2, configuration.extensionInfo, configuration.restrictedProperties, void 0, bucket); + this.configurationContributors.push(configuration); + this.registerJSONConfiguration(configuration); + }); + } + validateAndRegisterProperties(configuration, validate2 = true, extensionInfo, restrictedProperties, scope = 3, bucket) { + var _a10; + scope = isUndefinedOrNull(configuration.scope) ? scope : configuration.scope; + const properties = configuration.properties; + if (properties) { + for (const key in properties) { + const property = properties[key]; + if (validate2 && validateProperty(key, property)) { + delete properties[key]; + continue; + } + property.source = extensionInfo; + property.defaultDefaultValue = properties[key].default; + this.updatePropertyDefaultValue(key, property); + if (OVERRIDE_PROPERTY_REGEX.test(key)) { + property.scope = void 0; + } else { + property.scope = isUndefinedOrNull(property.scope) ? scope : property.scope; + property.restricted = isUndefinedOrNull(property.restricted) ? !!(restrictedProperties === null || restrictedProperties === void 0 ? void 0 : restrictedProperties.includes(key)) : property.restricted; + } + if (properties[key].hasOwnProperty("included") && !properties[key].included) { + this.excludedConfigurationProperties[key] = properties[key]; + delete properties[key]; + continue; + } else { + this.configurationProperties[key] = properties[key]; + if ((_a10 = properties[key].policy) === null || _a10 === void 0 ? void 0 : _a10.name) { + this.policyConfigurations.set(properties[key].policy.name, key); + } + } + if (!properties[key].deprecationMessage && properties[key].markdownDeprecationMessage) { + properties[key].deprecationMessage = properties[key].markdownDeprecationMessage; + } + bucket.add(key); + } + } + const subNodes = configuration.allOf; + if (subNodes) { + for (const node of subNodes) { + this.validateAndRegisterProperties(node, validate2, extensionInfo, restrictedProperties, scope, bucket); + } + } + } + getConfigurationProperties() { + return this.configurationProperties; + } + getPolicyConfigurations() { + return this.policyConfigurations; + } + registerJSONConfiguration(configuration) { + const register4 = (configuration2) => { + const properties = configuration2.properties; + if (properties) { + for (const key in properties) { + this.updateSchema(key, properties[key]); + } + } + const subNodes = configuration2.allOf; + subNodes === null || subNodes === void 0 ? void 0 : subNodes.forEach(register4); + }; + register4(configuration); + } + updateSchema(key, property) { + allSettings.properties[key] = property; + switch (property.scope) { + case 1: + applicationSettings.properties[key] = property; + break; + case 2: + machineSettings.properties[key] = property; + break; + case 6: + machineOverridableSettings.properties[key] = property; + break; + case 3: + windowSettings.properties[key] = property; + break; + case 4: + resourceSettings.properties[key] = property; + break; + case 5: + resourceSettings.properties[key] = property; + this.resourceLanguageSettingsSchema.properties[key] = property; + break; + } + } + updateOverridePropertyPatternKey() { + for (const overrideIdentifier of this.overrideIdentifiers.values()) { + const overrideIdentifierProperty = `[${overrideIdentifier}]`; + const resourceLanguagePropertiesSchema = { + type: "object", + description: localize("overrideSettings.defaultDescription", "Configure editor settings to be overridden for a language."), + errorMessage: localize("overrideSettings.errorMessage", "This setting does not support per-language configuration."), + $ref: resourceLanguageSettingsSchemaId + }; + this.updatePropertyDefaultValue(overrideIdentifierProperty, resourceLanguagePropertiesSchema); + allSettings.properties[overrideIdentifierProperty] = resourceLanguagePropertiesSchema; + applicationSettings.properties[overrideIdentifierProperty] = resourceLanguagePropertiesSchema; + machineSettings.properties[overrideIdentifierProperty] = resourceLanguagePropertiesSchema; + machineOverridableSettings.properties[overrideIdentifierProperty] = resourceLanguagePropertiesSchema; + windowSettings.properties[overrideIdentifierProperty] = resourceLanguagePropertiesSchema; + resourceSettings.properties[overrideIdentifierProperty] = resourceLanguagePropertiesSchema; + } + } + registerOverridePropertyPatternKey() { + const resourceLanguagePropertiesSchema = { + type: "object", + description: localize("overrideSettings.defaultDescription", "Configure editor settings to be overridden for a language."), + errorMessage: localize("overrideSettings.errorMessage", "This setting does not support per-language configuration."), + $ref: resourceLanguageSettingsSchemaId + }; + allSettings.patternProperties[OVERRIDE_PROPERTY_PATTERN] = resourceLanguagePropertiesSchema; + applicationSettings.patternProperties[OVERRIDE_PROPERTY_PATTERN] = resourceLanguagePropertiesSchema; + machineSettings.patternProperties[OVERRIDE_PROPERTY_PATTERN] = resourceLanguagePropertiesSchema; + machineOverridableSettings.patternProperties[OVERRIDE_PROPERTY_PATTERN] = resourceLanguagePropertiesSchema; + windowSettings.patternProperties[OVERRIDE_PROPERTY_PATTERN] = resourceLanguagePropertiesSchema; + resourceSettings.patternProperties[OVERRIDE_PROPERTY_PATTERN] = resourceLanguagePropertiesSchema; + this._onDidSchemaChange.fire(); + } + updatePropertyDefaultValue(key, property) { + const configurationdefaultOverride = this.configurationDefaultsOverrides.get(key); + let defaultValue = configurationdefaultOverride === null || configurationdefaultOverride === void 0 ? void 0 : configurationdefaultOverride.value; + let defaultSource = configurationdefaultOverride === null || configurationdefaultOverride === void 0 ? void 0 : configurationdefaultOverride.source; + if (isUndefined(defaultValue)) { + defaultValue = property.defaultDefaultValue; + defaultSource = void 0; + } + if (isUndefined(defaultValue)) { + defaultValue = getDefaultValue(property.type); + } + property.default = defaultValue; + property.defaultValueSource = defaultSource; + } + }; + OVERRIDE_IDENTIFIER_PATTERN = `\\[([^\\]]+)\\]`; + OVERRIDE_IDENTIFIER_REGEX = new RegExp(OVERRIDE_IDENTIFIER_PATTERN, "g"); + OVERRIDE_PROPERTY_PATTERN = `^(${OVERRIDE_IDENTIFIER_PATTERN})+$`; + OVERRIDE_PROPERTY_REGEX = new RegExp(OVERRIDE_PROPERTY_PATTERN); + configurationRegistry = new ConfigurationRegistry(); + Registry.add(Extensions4.Configuration, configurationRegistry); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/modesRegistry.js +var Extensions5, EditorModesRegistry, ModesRegistry, PLAINTEXT_LANGUAGE_ID, PLAINTEXT_EXTENSION; +var init_modesRegistry = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/modesRegistry.js"() { + init_nls(); + init_event(); + init_platform2(); + init_mime(); + init_configurationRegistry(); + Extensions5 = { + ModesRegistry: "editor.modesRegistry" + }; + EditorModesRegistry = class { + constructor() { + this._onDidChangeLanguages = new Emitter(); + this.onDidChangeLanguages = this._onDidChangeLanguages.event; + this._languages = []; + } + registerLanguage(def) { + this._languages.push(def); + this._onDidChangeLanguages.fire(void 0); + return { + dispose: () => { + for (let i = 0, len = this._languages.length; i < len; i++) { + if (this._languages[i] === def) { + this._languages.splice(i, 1); + return; + } + } + } + }; + } + getLanguages() { + return this._languages; + } + }; + ModesRegistry = new EditorModesRegistry(); + Registry.add(Extensions5.ModesRegistry, ModesRegistry); + PLAINTEXT_LANGUAGE_ID = "plaintext"; + PLAINTEXT_EXTENSION = ".txt"; + ModesRegistry.registerLanguage({ + id: PLAINTEXT_LANGUAGE_ID, + extensions: [PLAINTEXT_EXTENSION], + aliases: [localize("plainText.alias", "Plain Text"), "text"], + mimetypes: [Mimes.text] + }); + Registry.as(Extensions4.Configuration).registerDefaultConfigurations([{ + overrides: { + "[plaintext]": { + "editor.unicodeHighlight.ambiguousCharacters": false, + "editor.unicodeHighlight.invisibleCharacters": false + } + } + }]); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/supports/languageBracketsConfiguration.js +function filterValidBrackets(bracketPairs) { + return bracketPairs.filter(([open, close]) => open !== "" && close !== ""); +} +var LanguageBracketsConfiguration, BracketKindBase, OpeningBracketKind, ClosingBracketKind; +var init_languageBracketsConfiguration = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/supports/languageBracketsConfiguration.js"() { + init_cache(); + init_richEditBrackets(); + LanguageBracketsConfiguration = class { + constructor(languageId, config) { + this.languageId = languageId; + const bracketPairs = config.brackets ? filterValidBrackets(config.brackets) : []; + const openingBracketInfos = new CachedFunction((bracket) => { + const closing = /* @__PURE__ */ new Set(); + return { + info: new OpeningBracketKind(this, bracket, closing), + closing + }; + }); + const closingBracketInfos = new CachedFunction((bracket) => { + const opening = /* @__PURE__ */ new Set(); + const openingColorized = /* @__PURE__ */ new Set(); + return { + info: new ClosingBracketKind(this, bracket, opening, openingColorized), + opening, + openingColorized + }; + }); + for (const [open, close] of bracketPairs) { + const opening = openingBracketInfos.get(open); + const closing = closingBracketInfos.get(close); + opening.closing.add(closing.info); + closing.opening.add(opening.info); + } + const colorizedBracketPairs = config.colorizedBracketPairs ? filterValidBrackets(config.colorizedBracketPairs) : bracketPairs.filter((p) => !(p[0] === "<" && p[1] === ">")); + for (const [open, close] of colorizedBracketPairs) { + const opening = openingBracketInfos.get(open); + const closing = closingBracketInfos.get(close); + opening.closing.add(closing.info); + closing.openingColorized.add(opening.info); + closing.opening.add(opening.info); + } + this._openingBrackets = new Map([...openingBracketInfos.cachedValues].map(([k, v]) => [k, v.info])); + this._closingBrackets = new Map([...closingBracketInfos.cachedValues].map(([k, v]) => [k, v.info])); + } + /** + * No two brackets have the same bracket text. + */ + get openingBrackets() { + return [...this._openingBrackets.values()]; + } + /** + * No two brackets have the same bracket text. + */ + get closingBrackets() { + return [...this._closingBrackets.values()]; + } + getOpeningBracketInfo(bracketText) { + return this._openingBrackets.get(bracketText); + } + getClosingBracketInfo(bracketText) { + return this._closingBrackets.get(bracketText); + } + getBracketInfo(bracketText) { + return this.getOpeningBracketInfo(bracketText) || this.getClosingBracketInfo(bracketText); + } + getBracketRegExp(options2) { + const brackets = Array.from([...this._openingBrackets.keys(), ...this._closingBrackets.keys()]); + return createBracketOrRegExp(brackets, options2); + } + }; + BracketKindBase = class { + constructor(config, bracketText) { + this.config = config; + this.bracketText = bracketText; + } + get languageId() { + return this.config.languageId; + } + }; + OpeningBracketKind = class extends BracketKindBase { + constructor(config, bracketText, openedBrackets) { + super(config, bracketText); + this.openedBrackets = openedBrackets; + this.isOpeningBracket = true; + } + }; + ClosingBracketKind = class extends BracketKindBase { + constructor(config, bracketText, openingBrackets, openingColorizedBrackets) { + super(config, bracketText); + this.openingBrackets = openingBrackets; + this.openingColorizedBrackets = openingColorizedBrackets; + this.isOpeningBracket = false; + } + /** + * Checks if this bracket closes the given other bracket. + * If the bracket infos come from different configurations, this method will return false. + */ + closes(other) { + if (other["config"] !== this.config) { + return false; + } + return this.openingBrackets.has(other); + } + closesColorized(other) { + if (other["config"] !== this.config) { + return false; + } + return this.openingColorizedBrackets.has(other); + } + getOpeningBrackets() { + return [...this.openingBrackets]; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/languageConfigurationRegistry.js +function computeConfig(languageId, registry, configurationService, languageService) { + let languageConfig = registry.getLanguageConfiguration(languageId); + if (!languageConfig) { + if (!languageService.isRegisteredLanguageId(languageId)) { + return new ResolvedLanguageConfiguration(languageId, {}); + } + languageConfig = new ResolvedLanguageConfiguration(languageId, {}); + } + const customizedConfig = getCustomizedLanguageConfig(languageConfig.languageId, configurationService); + const data = combineLanguageConfigurations([languageConfig.underlyingConfig, customizedConfig]); + const config = new ResolvedLanguageConfiguration(languageConfig.languageId, data); + return config; +} +function getCustomizedLanguageConfig(languageId, configurationService) { + const brackets = configurationService.getValue(customizedLanguageConfigKeys.brackets, { + overrideIdentifier: languageId + }); + const colorizedBracketPairs = configurationService.getValue(customizedLanguageConfigKeys.colorizedBracketPairs, { + overrideIdentifier: languageId + }); + return { + brackets: validateBracketPairs(brackets), + colorizedBracketPairs: validateBracketPairs(colorizedBracketPairs) + }; +} +function validateBracketPairs(data) { + if (!Array.isArray(data)) { + return void 0; + } + return data.map((pair) => { + if (!Array.isArray(pair) || pair.length !== 2) { + return void 0; + } + return [pair[0], pair[1]]; + }).filter((p) => !!p); +} +function getIndentationAtPosition(model, lineNumber, column) { + const lineText = model.getLineContent(lineNumber); + let indentation = getLeadingWhitespace(lineText); + if (indentation.length > column - 1) { + indentation = indentation.substring(0, column - 1); + } + return indentation; +} +function combineLanguageConfigurations(configs) { + let result = { + comments: void 0, + brackets: void 0, + wordPattern: void 0, + indentationRules: void 0, + onEnterRules: void 0, + autoClosingPairs: void 0, + surroundingPairs: void 0, + autoCloseBefore: void 0, + folding: void 0, + colorizedBracketPairs: void 0, + __electricCharacterSupport: void 0 + }; + for (const entry of configs) { + result = { + comments: entry.comments || result.comments, + brackets: entry.brackets || result.brackets, + wordPattern: entry.wordPattern || result.wordPattern, + indentationRules: entry.indentationRules || result.indentationRules, + onEnterRules: entry.onEnterRules || result.onEnterRules, + autoClosingPairs: entry.autoClosingPairs || result.autoClosingPairs, + surroundingPairs: entry.surroundingPairs || result.surroundingPairs, + autoCloseBefore: entry.autoCloseBefore || result.autoCloseBefore, + folding: entry.folding || result.folding, + colorizedBracketPairs: entry.colorizedBracketPairs || result.colorizedBracketPairs, + __electricCharacterSupport: entry.__electricCharacterSupport || result.__electricCharacterSupport + }; + } + return result; +} +var __decorate2, __param2, LanguageConfigurationServiceChangeEvent, ILanguageConfigurationService, LanguageConfigurationService, customizedLanguageConfigKeys, ComposedLanguageConfiguration, LanguageConfigurationContribution, LanguageConfigurationChangeEvent, LanguageConfigurationRegistry, ResolvedLanguageConfiguration; +var init_languageConfigurationRegistry = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/languageConfigurationRegistry.js"() { + init_event(); + init_lifecycle(); + init_strings(); + init_wordHelper(); + init_languageConfiguration(); + init_characterPair(); + init_electricCharacter(); + init_indentRules(); + init_onEnter(); + init_richEditBrackets(); + init_instantiation(); + init_configuration(); + init_language(); + init_extensions(); + init_modesRegistry(); + init_languageBracketsConfiguration(); + __decorate2 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param2 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + LanguageConfigurationServiceChangeEvent = class { + constructor(languageId) { + this.languageId = languageId; + } + affects(languageId) { + return !this.languageId ? true : this.languageId === languageId; + } + }; + ILanguageConfigurationService = createDecorator("languageConfigurationService"); + LanguageConfigurationService = class LanguageConfigurationService2 extends Disposable { + constructor(configurationService, languageService) { + super(); + this.configurationService = configurationService; + this.languageService = languageService; + this._registry = this._register(new LanguageConfigurationRegistry()); + this.onDidChangeEmitter = this._register(new Emitter()); + this.onDidChange = this.onDidChangeEmitter.event; + this.configurations = /* @__PURE__ */ new Map(); + const languageConfigKeys = new Set(Object.values(customizedLanguageConfigKeys)); + this._register(this.configurationService.onDidChangeConfiguration((e) => { + const globalConfigChanged = e.change.keys.some((k) => languageConfigKeys.has(k)); + const localConfigChanged = e.change.overrides.filter(([overrideLangName, keys]) => keys.some((k) => languageConfigKeys.has(k))).map(([overrideLangName]) => overrideLangName); + if (globalConfigChanged) { + this.configurations.clear(); + this.onDidChangeEmitter.fire(new LanguageConfigurationServiceChangeEvent(void 0)); + } else { + for (const languageId of localConfigChanged) { + if (this.languageService.isRegisteredLanguageId(languageId)) { + this.configurations.delete(languageId); + this.onDidChangeEmitter.fire(new LanguageConfigurationServiceChangeEvent(languageId)); + } + } + } + })); + this._register(this._registry.onDidChange((e) => { + this.configurations.delete(e.languageId); + this.onDidChangeEmitter.fire(new LanguageConfigurationServiceChangeEvent(e.languageId)); + })); + } + register(languageId, configuration, priority) { + return this._registry.register(languageId, configuration, priority); + } + getLanguageConfiguration(languageId) { + let result = this.configurations.get(languageId); + if (!result) { + result = computeConfig(languageId, this._registry, this.configurationService, this.languageService); + this.configurations.set(languageId, result); + } + return result; + } + }; + LanguageConfigurationService = __decorate2([ + __param2(0, IConfigurationService), + __param2(1, ILanguageService) + ], LanguageConfigurationService); + customizedLanguageConfigKeys = { + brackets: "editor.language.brackets", + colorizedBracketPairs: "editor.language.colorizedBracketPairs" + }; + ComposedLanguageConfiguration = class { + constructor(languageId) { + this.languageId = languageId; + this._resolved = null; + this._entries = []; + this._order = 0; + this._resolved = null; + } + register(configuration, priority) { + const entry = new LanguageConfigurationContribution(configuration, priority, ++this._order); + this._entries.push(entry); + this._resolved = null; + return toDisposable(() => { + for (let i = 0; i < this._entries.length; i++) { + if (this._entries[i] === entry) { + this._entries.splice(i, 1); + this._resolved = null; + break; + } + } + }); + } + getResolvedConfiguration() { + if (!this._resolved) { + const config = this._resolve(); + if (config) { + this._resolved = new ResolvedLanguageConfiguration(this.languageId, config); + } + } + return this._resolved; + } + _resolve() { + if (this._entries.length === 0) { + return null; + } + this._entries.sort(LanguageConfigurationContribution.cmp); + return combineLanguageConfigurations(this._entries.map((e) => e.configuration)); + } + }; + LanguageConfigurationContribution = class { + constructor(configuration, priority, order) { + this.configuration = configuration; + this.priority = priority; + this.order = order; + } + static cmp(a3, b) { + if (a3.priority === b.priority) { + return a3.order - b.order; + } + return a3.priority - b.priority; + } + }; + LanguageConfigurationChangeEvent = class { + constructor(languageId) { + this.languageId = languageId; + } + }; + LanguageConfigurationRegistry = class extends Disposable { + constructor() { + super(); + this._entries = /* @__PURE__ */ new Map(); + this._onDidChange = this._register(new Emitter()); + this.onDidChange = this._onDidChange.event; + this._register(this.register(PLAINTEXT_LANGUAGE_ID, { + brackets: [ + ["(", ")"], + ["[", "]"], + ["{", "}"] + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "<", close: ">" }, + { open: '"', close: '"' }, + { open: "'", close: "'" }, + { open: "`", close: "`" } + ], + colorizedBracketPairs: [], + folding: { + offSide: true + } + }, 0)); + } + /** + * @param priority Use a higher number for higher priority + */ + register(languageId, configuration, priority = 0) { + let entries2 = this._entries.get(languageId); + if (!entries2) { + entries2 = new ComposedLanguageConfiguration(languageId); + this._entries.set(languageId, entries2); + } + const disposable = entries2.register(configuration, priority); + this._onDidChange.fire(new LanguageConfigurationChangeEvent(languageId)); + return toDisposable(() => { + disposable.dispose(); + this._onDidChange.fire(new LanguageConfigurationChangeEvent(languageId)); + }); + } + getLanguageConfiguration(languageId) { + const entries2 = this._entries.get(languageId); + return (entries2 === null || entries2 === void 0 ? void 0 : entries2.getResolvedConfiguration()) || null; + } + }; + ResolvedLanguageConfiguration = class _ResolvedLanguageConfiguration { + constructor(languageId, underlyingConfig) { + this.languageId = languageId; + this.underlyingConfig = underlyingConfig; + this._brackets = null; + this._electricCharacter = null; + this._onEnterSupport = this.underlyingConfig.brackets || this.underlyingConfig.indentationRules || this.underlyingConfig.onEnterRules ? new OnEnterSupport(this.underlyingConfig) : null; + this.comments = _ResolvedLanguageConfiguration._handleComments(this.underlyingConfig); + this.characterPair = new CharacterPairSupport(this.underlyingConfig); + this.wordDefinition = this.underlyingConfig.wordPattern || DEFAULT_WORD_REGEXP; + this.indentationRules = this.underlyingConfig.indentationRules; + if (this.underlyingConfig.indentationRules) { + this.indentRulesSupport = new IndentRulesSupport(this.underlyingConfig.indentationRules); + } else { + this.indentRulesSupport = null; + } + this.foldingRules = this.underlyingConfig.folding || {}; + this.bracketsNew = new LanguageBracketsConfiguration(languageId, this.underlyingConfig); + } + getWordDefinition() { + return ensureValidWordDefinition(this.wordDefinition); + } + get brackets() { + if (!this._brackets && this.underlyingConfig.brackets) { + this._brackets = new RichEditBrackets(this.languageId, this.underlyingConfig.brackets); + } + return this._brackets; + } + get electricCharacter() { + if (!this._electricCharacter) { + this._electricCharacter = new BracketElectricCharacterSupport(this.brackets); + } + return this._electricCharacter; + } + onEnter(autoIndent, previousLineText, beforeEnterText, afterEnterText) { + if (!this._onEnterSupport) { + return null; + } + return this._onEnterSupport.onEnter(autoIndent, previousLineText, beforeEnterText, afterEnterText); + } + getAutoClosingPairs() { + return new AutoClosingPairs(this.characterPair.getAutoClosingPairs()); + } + getAutoCloseBeforeSet(forQuotes) { + return this.characterPair.getAutoCloseBeforeSet(forQuotes); + } + getSurroundingPairs() { + return this.characterPair.getSurroundingPairs(); + } + static _handleComments(conf81) { + const commentRule = conf81.comments; + if (!commentRule) { + return null; + } + const comments = {}; + if (commentRule.lineComment) { + comments.lineCommentToken = commentRule.lineComment; + } + if (commentRule.blockComment) { + const [blockStart, blockEnd] = commentRule.blockComment; + comments.blockCommentStartToken = blockStart; + comments.blockCommentEndToken = blockEnd; + } + return comments; + } + }; + registerSingleton( + ILanguageConfigurationService, + LanguageConfigurationService, + 1 + /* InstantiationType.Delayed */ + ); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/diff/diffChange.js +var DiffChange; +var init_diffChange = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/diff/diffChange.js"() { + DiffChange = class { + /** + * Constructs a new DiffChange with the given sequence information + * and content. + */ + constructor(originalStart, originalLength, modifiedStart, modifiedLength) { + this.originalStart = originalStart; + this.originalLength = originalLength; + this.modifiedStart = modifiedStart; + this.modifiedLength = modifiedLength; + } + /** + * The end point (exclusive) of the change in the original sequence. + */ + getOriginalEnd() { + return this.originalStart + this.originalLength; + } + /** + * The end point (exclusive) of the change in the modified sequence. + */ + getModifiedEnd() { + return this.modifiedStart + this.modifiedLength; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/diff/diff.js +function stringDiff(original, modified, pretty) { + return new LcsDiff(new StringDiffSequence(original), new StringDiffSequence(modified)).ComputeDiff(pretty).changes; +} +var StringDiffSequence, Debug, MyArray, DiffChangeHelper, LcsDiff; +var init_diff = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/diff/diff.js"() { + init_diffChange(); + init_hash(); + StringDiffSequence = class { + constructor(source) { + this.source = source; + } + getElements() { + const source = this.source; + const characters = new Int32Array(source.length); + for (let i = 0, len = source.length; i < len; i++) { + characters[i] = source.charCodeAt(i); + } + return characters; + } + }; + Debug = class { + static Assert(condition, message) { + if (!condition) { + throw new Error(message); + } + } + }; + MyArray = class { + /** + * Copies a range of elements from an Array starting at the specified source index and pastes + * them to another Array starting at the specified destination index. The length and the indexes + * are specified as 64-bit integers. + * sourceArray: + * The Array that contains the data to copy. + * sourceIndex: + * A 64-bit integer that represents the index in the sourceArray at which copying begins. + * destinationArray: + * The Array that receives the data. + * destinationIndex: + * A 64-bit integer that represents the index in the destinationArray at which storing begins. + * length: + * A 64-bit integer that represents the number of elements to copy. + */ + static Copy(sourceArray, sourceIndex, destinationArray, destinationIndex, length) { + for (let i = 0; i < length; i++) { + destinationArray[destinationIndex + i] = sourceArray[sourceIndex + i]; + } + } + static Copy2(sourceArray, sourceIndex, destinationArray, destinationIndex, length) { + for (let i = 0; i < length; i++) { + destinationArray[destinationIndex + i] = sourceArray[sourceIndex + i]; + } + } + }; + DiffChangeHelper = class { + /** + * Constructs a new DiffChangeHelper for the given DiffSequences. + */ + constructor() { + this.m_changes = []; + this.m_originalStart = 1073741824; + this.m_modifiedStart = 1073741824; + this.m_originalCount = 0; + this.m_modifiedCount = 0; + } + /** + * Marks the beginning of the next change in the set of differences. + */ + MarkNextChange() { + if (this.m_originalCount > 0 || this.m_modifiedCount > 0) { + this.m_changes.push(new DiffChange(this.m_originalStart, this.m_originalCount, this.m_modifiedStart, this.m_modifiedCount)); + } + this.m_originalCount = 0; + this.m_modifiedCount = 0; + this.m_originalStart = 1073741824; + this.m_modifiedStart = 1073741824; + } + /** + * Adds the original element at the given position to the elements + * affected by the current change. The modified index gives context + * to the change position with respect to the original sequence. + * @param originalIndex The index of the original element to add. + * @param modifiedIndex The index of the modified element that provides corresponding position in the modified sequence. + */ + AddOriginalElement(originalIndex, modifiedIndex) { + this.m_originalStart = Math.min(this.m_originalStart, originalIndex); + this.m_modifiedStart = Math.min(this.m_modifiedStart, modifiedIndex); + this.m_originalCount++; + } + /** + * Adds the modified element at the given position to the elements + * affected by the current change. The original index gives context + * to the change position with respect to the modified sequence. + * @param originalIndex The index of the original element that provides corresponding position in the original sequence. + * @param modifiedIndex The index of the modified element to add. + */ + AddModifiedElement(originalIndex, modifiedIndex) { + this.m_originalStart = Math.min(this.m_originalStart, originalIndex); + this.m_modifiedStart = Math.min(this.m_modifiedStart, modifiedIndex); + this.m_modifiedCount++; + } + /** + * Retrieves all of the changes marked by the class. + */ + getChanges() { + if (this.m_originalCount > 0 || this.m_modifiedCount > 0) { + this.MarkNextChange(); + } + return this.m_changes; + } + /** + * Retrieves all of the changes marked by the class in the reverse order + */ + getReverseChanges() { + if (this.m_originalCount > 0 || this.m_modifiedCount > 0) { + this.MarkNextChange(); + } + this.m_changes.reverse(); + return this.m_changes; + } + }; + LcsDiff = class _LcsDiff { + /** + * Constructs the DiffFinder + */ + constructor(originalSequence, modifiedSequence, continueProcessingPredicate = null) { + this.ContinueProcessingPredicate = continueProcessingPredicate; + this._originalSequence = originalSequence; + this._modifiedSequence = modifiedSequence; + const [originalStringElements, originalElementsOrHash, originalHasStrings] = _LcsDiff._getElements(originalSequence); + const [modifiedStringElements, modifiedElementsOrHash, modifiedHasStrings] = _LcsDiff._getElements(modifiedSequence); + this._hasStrings = originalHasStrings && modifiedHasStrings; + this._originalStringElements = originalStringElements; + this._originalElementsOrHash = originalElementsOrHash; + this._modifiedStringElements = modifiedStringElements; + this._modifiedElementsOrHash = modifiedElementsOrHash; + this.m_forwardHistory = []; + this.m_reverseHistory = []; + } + static _isStringArray(arr) { + return arr.length > 0 && typeof arr[0] === "string"; + } + static _getElements(sequence) { + const elements = sequence.getElements(); + if (_LcsDiff._isStringArray(elements)) { + const hashes = new Int32Array(elements.length); + for (let i = 0, len = elements.length; i < len; i++) { + hashes[i] = stringHash(elements[i], 0); + } + return [elements, hashes, true]; + } + if (elements instanceof Int32Array) { + return [[], elements, false]; + } + return [[], new Int32Array(elements), false]; + } + ElementsAreEqual(originalIndex, newIndex) { + if (this._originalElementsOrHash[originalIndex] !== this._modifiedElementsOrHash[newIndex]) { + return false; + } + return this._hasStrings ? this._originalStringElements[originalIndex] === this._modifiedStringElements[newIndex] : true; + } + ElementsAreStrictEqual(originalIndex, newIndex) { + if (!this.ElementsAreEqual(originalIndex, newIndex)) { + return false; + } + const originalElement = _LcsDiff._getStrictElement(this._originalSequence, originalIndex); + const modifiedElement = _LcsDiff._getStrictElement(this._modifiedSequence, newIndex); + return originalElement === modifiedElement; + } + static _getStrictElement(sequence, index) { + if (typeof sequence.getStrictElement === "function") { + return sequence.getStrictElement(index); + } + return null; + } + OriginalElementsAreEqual(index1, index2) { + if (this._originalElementsOrHash[index1] !== this._originalElementsOrHash[index2]) { + return false; + } + return this._hasStrings ? this._originalStringElements[index1] === this._originalStringElements[index2] : true; + } + ModifiedElementsAreEqual(index1, index2) { + if (this._modifiedElementsOrHash[index1] !== this._modifiedElementsOrHash[index2]) { + return false; + } + return this._hasStrings ? this._modifiedStringElements[index1] === this._modifiedStringElements[index2] : true; + } + ComputeDiff(pretty) { + return this._ComputeDiff(0, this._originalElementsOrHash.length - 1, 0, this._modifiedElementsOrHash.length - 1, pretty); + } + /** + * Computes the differences between the original and modified input + * sequences on the bounded range. + * @returns An array of the differences between the two input sequences. + */ + _ComputeDiff(originalStart, originalEnd, modifiedStart, modifiedEnd, pretty) { + const quitEarlyArr = [false]; + let changes = this.ComputeDiffRecursive(originalStart, originalEnd, modifiedStart, modifiedEnd, quitEarlyArr); + if (pretty) { + changes = this.PrettifyChanges(changes); + } + return { + quitEarly: quitEarlyArr[0], + changes + }; + } + /** + * Private helper method which computes the differences on the bounded range + * recursively. + * @returns An array of the differences between the two input sequences. + */ + ComputeDiffRecursive(originalStart, originalEnd, modifiedStart, modifiedEnd, quitEarlyArr) { + quitEarlyArr[0] = false; + while (originalStart <= originalEnd && modifiedStart <= modifiedEnd && this.ElementsAreEqual(originalStart, modifiedStart)) { + originalStart++; + modifiedStart++; + } + while (originalEnd >= originalStart && modifiedEnd >= modifiedStart && this.ElementsAreEqual(originalEnd, modifiedEnd)) { + originalEnd--; + modifiedEnd--; + } + if (originalStart > originalEnd || modifiedStart > modifiedEnd) { + let changes; + if (modifiedStart <= modifiedEnd) { + Debug.Assert(originalStart === originalEnd + 1, "originalStart should only be one more than originalEnd"); + changes = [ + new DiffChange(originalStart, 0, modifiedStart, modifiedEnd - modifiedStart + 1) + ]; + } else if (originalStart <= originalEnd) { + Debug.Assert(modifiedStart === modifiedEnd + 1, "modifiedStart should only be one more than modifiedEnd"); + changes = [ + new DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, 0) + ]; + } else { + Debug.Assert(originalStart === originalEnd + 1, "originalStart should only be one more than originalEnd"); + Debug.Assert(modifiedStart === modifiedEnd + 1, "modifiedStart should only be one more than modifiedEnd"); + changes = []; + } + return changes; + } + const midOriginalArr = [0]; + const midModifiedArr = [0]; + const result = this.ComputeRecursionPoint(originalStart, originalEnd, modifiedStart, modifiedEnd, midOriginalArr, midModifiedArr, quitEarlyArr); + const midOriginal = midOriginalArr[0]; + const midModified = midModifiedArr[0]; + if (result !== null) { + return result; + } else if (!quitEarlyArr[0]) { + const leftChanges = this.ComputeDiffRecursive(originalStart, midOriginal, modifiedStart, midModified, quitEarlyArr); + let rightChanges = []; + if (!quitEarlyArr[0]) { + rightChanges = this.ComputeDiffRecursive(midOriginal + 1, originalEnd, midModified + 1, modifiedEnd, quitEarlyArr); + } else { + rightChanges = [ + new DiffChange(midOriginal + 1, originalEnd - (midOriginal + 1) + 1, midModified + 1, modifiedEnd - (midModified + 1) + 1) + ]; + } + return this.ConcatenateChanges(leftChanges, rightChanges); + } + return [ + new DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, modifiedEnd - modifiedStart + 1) + ]; + } + WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr) { + let forwardChanges = null; + let reverseChanges = null; + let changeHelper = new DiffChangeHelper(); + let diagonalMin = diagonalForwardStart; + let diagonalMax = diagonalForwardEnd; + let diagonalRelative = midOriginalArr[0] - midModifiedArr[0] - diagonalForwardOffset; + let lastOriginalIndex = -1073741824; + let historyIndex = this.m_forwardHistory.length - 1; + do { + const diagonal = diagonalRelative + diagonalForwardBase; + if (diagonal === diagonalMin || diagonal < diagonalMax && forwardPoints[diagonal - 1] < forwardPoints[diagonal + 1]) { + originalIndex = forwardPoints[diagonal + 1]; + modifiedIndex = originalIndex - diagonalRelative - diagonalForwardOffset; + if (originalIndex < lastOriginalIndex) { + changeHelper.MarkNextChange(); + } + lastOriginalIndex = originalIndex; + changeHelper.AddModifiedElement(originalIndex + 1, modifiedIndex); + diagonalRelative = diagonal + 1 - diagonalForwardBase; + } else { + originalIndex = forwardPoints[diagonal - 1] + 1; + modifiedIndex = originalIndex - diagonalRelative - diagonalForwardOffset; + if (originalIndex < lastOriginalIndex) { + changeHelper.MarkNextChange(); + } + lastOriginalIndex = originalIndex - 1; + changeHelper.AddOriginalElement(originalIndex, modifiedIndex + 1); + diagonalRelative = diagonal - 1 - diagonalForwardBase; + } + if (historyIndex >= 0) { + forwardPoints = this.m_forwardHistory[historyIndex]; + diagonalForwardBase = forwardPoints[0]; + diagonalMin = 1; + diagonalMax = forwardPoints.length - 1; + } + } while (--historyIndex >= -1); + forwardChanges = changeHelper.getReverseChanges(); + if (quitEarlyArr[0]) { + let originalStartPoint = midOriginalArr[0] + 1; + let modifiedStartPoint = midModifiedArr[0] + 1; + if (forwardChanges !== null && forwardChanges.length > 0) { + const lastForwardChange = forwardChanges[forwardChanges.length - 1]; + originalStartPoint = Math.max(originalStartPoint, lastForwardChange.getOriginalEnd()); + modifiedStartPoint = Math.max(modifiedStartPoint, lastForwardChange.getModifiedEnd()); + } + reverseChanges = [ + new DiffChange(originalStartPoint, originalEnd - originalStartPoint + 1, modifiedStartPoint, modifiedEnd - modifiedStartPoint + 1) + ]; + } else { + changeHelper = new DiffChangeHelper(); + diagonalMin = diagonalReverseStart; + diagonalMax = diagonalReverseEnd; + diagonalRelative = midOriginalArr[0] - midModifiedArr[0] - diagonalReverseOffset; + lastOriginalIndex = 1073741824; + historyIndex = deltaIsEven ? this.m_reverseHistory.length - 1 : this.m_reverseHistory.length - 2; + do { + const diagonal = diagonalRelative + diagonalReverseBase; + if (diagonal === diagonalMin || diagonal < diagonalMax && reversePoints[diagonal - 1] >= reversePoints[diagonal + 1]) { + originalIndex = reversePoints[diagonal + 1] - 1; + modifiedIndex = originalIndex - diagonalRelative - diagonalReverseOffset; + if (originalIndex > lastOriginalIndex) { + changeHelper.MarkNextChange(); + } + lastOriginalIndex = originalIndex + 1; + changeHelper.AddOriginalElement(originalIndex + 1, modifiedIndex + 1); + diagonalRelative = diagonal + 1 - diagonalReverseBase; + } else { + originalIndex = reversePoints[diagonal - 1]; + modifiedIndex = originalIndex - diagonalRelative - diagonalReverseOffset; + if (originalIndex > lastOriginalIndex) { + changeHelper.MarkNextChange(); + } + lastOriginalIndex = originalIndex; + changeHelper.AddModifiedElement(originalIndex + 1, modifiedIndex + 1); + diagonalRelative = diagonal - 1 - diagonalReverseBase; + } + if (historyIndex >= 0) { + reversePoints = this.m_reverseHistory[historyIndex]; + diagonalReverseBase = reversePoints[0]; + diagonalMin = 1; + diagonalMax = reversePoints.length - 1; + } + } while (--historyIndex >= -1); + reverseChanges = changeHelper.getChanges(); + } + return this.ConcatenateChanges(forwardChanges, reverseChanges); + } + /** + * Given the range to compute the diff on, this method finds the point: + * (midOriginal, midModified) + * that exists in the middle of the LCS of the two sequences and + * is the point at which the LCS problem may be broken down recursively. + * This method will try to keep the LCS trace in memory. If the LCS recursion + * point is calculated and the full trace is available in memory, then this method + * will return the change list. + * @param originalStart The start bound of the original sequence range + * @param originalEnd The end bound of the original sequence range + * @param modifiedStart The start bound of the modified sequence range + * @param modifiedEnd The end bound of the modified sequence range + * @param midOriginal The middle point of the original sequence range + * @param midModified The middle point of the modified sequence range + * @returns The diff changes, if available, otherwise null + */ + ComputeRecursionPoint(originalStart, originalEnd, modifiedStart, modifiedEnd, midOriginalArr, midModifiedArr, quitEarlyArr) { + let originalIndex = 0, modifiedIndex = 0; + let diagonalForwardStart = 0, diagonalForwardEnd = 0; + let diagonalReverseStart = 0, diagonalReverseEnd = 0; + originalStart--; + modifiedStart--; + midOriginalArr[0] = 0; + midModifiedArr[0] = 0; + this.m_forwardHistory = []; + this.m_reverseHistory = []; + const maxDifferences = originalEnd - originalStart + (modifiedEnd - modifiedStart); + const numDiagonals = maxDifferences + 1; + const forwardPoints = new Int32Array(numDiagonals); + const reversePoints = new Int32Array(numDiagonals); + const diagonalForwardBase = modifiedEnd - modifiedStart; + const diagonalReverseBase = originalEnd - originalStart; + const diagonalForwardOffset = originalStart - modifiedStart; + const diagonalReverseOffset = originalEnd - modifiedEnd; + const delta = diagonalReverseBase - diagonalForwardBase; + const deltaIsEven = delta % 2 === 0; + forwardPoints[diagonalForwardBase] = originalStart; + reversePoints[diagonalReverseBase] = originalEnd; + quitEarlyArr[0] = false; + for (let numDifferences = 1; numDifferences <= maxDifferences / 2 + 1; numDifferences++) { + let furthestOriginalIndex = 0; + let furthestModifiedIndex = 0; + diagonalForwardStart = this.ClipDiagonalBound(diagonalForwardBase - numDifferences, numDifferences, diagonalForwardBase, numDiagonals); + diagonalForwardEnd = this.ClipDiagonalBound(diagonalForwardBase + numDifferences, numDifferences, diagonalForwardBase, numDiagonals); + for (let diagonal = diagonalForwardStart; diagonal <= diagonalForwardEnd; diagonal += 2) { + if (diagonal === diagonalForwardStart || diagonal < diagonalForwardEnd && forwardPoints[diagonal - 1] < forwardPoints[diagonal + 1]) { + originalIndex = forwardPoints[diagonal + 1]; + } else { + originalIndex = forwardPoints[diagonal - 1] + 1; + } + modifiedIndex = originalIndex - (diagonal - diagonalForwardBase) - diagonalForwardOffset; + const tempOriginalIndex = originalIndex; + while (originalIndex < originalEnd && modifiedIndex < modifiedEnd && this.ElementsAreEqual(originalIndex + 1, modifiedIndex + 1)) { + originalIndex++; + modifiedIndex++; + } + forwardPoints[diagonal] = originalIndex; + if (originalIndex + modifiedIndex > furthestOriginalIndex + furthestModifiedIndex) { + furthestOriginalIndex = originalIndex; + furthestModifiedIndex = modifiedIndex; + } + if (!deltaIsEven && Math.abs(diagonal - diagonalReverseBase) <= numDifferences - 1) { + if (originalIndex >= reversePoints[diagonal]) { + midOriginalArr[0] = originalIndex; + midModifiedArr[0] = modifiedIndex; + if (tempOriginalIndex <= reversePoints[diagonal] && 1447 > 0 && numDifferences <= 1447 + 1) { + return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr); + } else { + return null; + } + } + } + } + const matchLengthOfLongest = (furthestOriginalIndex - originalStart + (furthestModifiedIndex - modifiedStart) - numDifferences) / 2; + if (this.ContinueProcessingPredicate !== null && !this.ContinueProcessingPredicate(furthestOriginalIndex, matchLengthOfLongest)) { + quitEarlyArr[0] = true; + midOriginalArr[0] = furthestOriginalIndex; + midModifiedArr[0] = furthestModifiedIndex; + if (matchLengthOfLongest > 0 && 1447 > 0 && numDifferences <= 1447 + 1) { + return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr); + } else { + originalStart++; + modifiedStart++; + return [ + new DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, modifiedEnd - modifiedStart + 1) + ]; + } + } + diagonalReverseStart = this.ClipDiagonalBound(diagonalReverseBase - numDifferences, numDifferences, diagonalReverseBase, numDiagonals); + diagonalReverseEnd = this.ClipDiagonalBound(diagonalReverseBase + numDifferences, numDifferences, diagonalReverseBase, numDiagonals); + for (let diagonal = diagonalReverseStart; diagonal <= diagonalReverseEnd; diagonal += 2) { + if (diagonal === diagonalReverseStart || diagonal < diagonalReverseEnd && reversePoints[diagonal - 1] >= reversePoints[diagonal + 1]) { + originalIndex = reversePoints[diagonal + 1] - 1; + } else { + originalIndex = reversePoints[diagonal - 1]; + } + modifiedIndex = originalIndex - (diagonal - diagonalReverseBase) - diagonalReverseOffset; + const tempOriginalIndex = originalIndex; + while (originalIndex > originalStart && modifiedIndex > modifiedStart && this.ElementsAreEqual(originalIndex, modifiedIndex)) { + originalIndex--; + modifiedIndex--; + } + reversePoints[diagonal] = originalIndex; + if (deltaIsEven && Math.abs(diagonal - diagonalForwardBase) <= numDifferences) { + if (originalIndex <= forwardPoints[diagonal]) { + midOriginalArr[0] = originalIndex; + midModifiedArr[0] = modifiedIndex; + if (tempOriginalIndex >= forwardPoints[diagonal] && 1447 > 0 && numDifferences <= 1447 + 1) { + return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr); + } else { + return null; + } + } + } + } + if (numDifferences <= 1447) { + let temp = new Int32Array(diagonalForwardEnd - diagonalForwardStart + 2); + temp[0] = diagonalForwardBase - diagonalForwardStart + 1; + MyArray.Copy2(forwardPoints, diagonalForwardStart, temp, 1, diagonalForwardEnd - diagonalForwardStart + 1); + this.m_forwardHistory.push(temp); + temp = new Int32Array(diagonalReverseEnd - diagonalReverseStart + 2); + temp[0] = diagonalReverseBase - diagonalReverseStart + 1; + MyArray.Copy2(reversePoints, diagonalReverseStart, temp, 1, diagonalReverseEnd - diagonalReverseStart + 1); + this.m_reverseHistory.push(temp); + } + } + return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr); + } + /** + * Shifts the given changes to provide a more intuitive diff. + * While the first element in a diff matches the first element after the diff, + * we shift the diff down. + * + * @param changes The list of changes to shift + * @returns The shifted changes + */ + PrettifyChanges(changes) { + for (let i = 0; i < changes.length; i++) { + const change = changes[i]; + const originalStop = i < changes.length - 1 ? changes[i + 1].originalStart : this._originalElementsOrHash.length; + const modifiedStop = i < changes.length - 1 ? changes[i + 1].modifiedStart : this._modifiedElementsOrHash.length; + const checkOriginal = change.originalLength > 0; + const checkModified = change.modifiedLength > 0; + while (change.originalStart + change.originalLength < originalStop && change.modifiedStart + change.modifiedLength < modifiedStop && (!checkOriginal || this.OriginalElementsAreEqual(change.originalStart, change.originalStart + change.originalLength)) && (!checkModified || this.ModifiedElementsAreEqual(change.modifiedStart, change.modifiedStart + change.modifiedLength))) { + const startStrictEqual = this.ElementsAreStrictEqual(change.originalStart, change.modifiedStart); + const endStrictEqual = this.ElementsAreStrictEqual(change.originalStart + change.originalLength, change.modifiedStart + change.modifiedLength); + if (endStrictEqual && !startStrictEqual) { + break; + } + change.originalStart++; + change.modifiedStart++; + } + const mergedChangeArr = [null]; + if (i < changes.length - 1 && this.ChangesOverlap(changes[i], changes[i + 1], mergedChangeArr)) { + changes[i] = mergedChangeArr[0]; + changes.splice(i + 1, 1); + i--; + continue; + } + } + for (let i = changes.length - 1; i >= 0; i--) { + const change = changes[i]; + let originalStop = 0; + let modifiedStop = 0; + if (i > 0) { + const prevChange = changes[i - 1]; + originalStop = prevChange.originalStart + prevChange.originalLength; + modifiedStop = prevChange.modifiedStart + prevChange.modifiedLength; + } + const checkOriginal = change.originalLength > 0; + const checkModified = change.modifiedLength > 0; + let bestDelta = 0; + let bestScore = this._boundaryScore(change.originalStart, change.originalLength, change.modifiedStart, change.modifiedLength); + for (let delta = 1; ; delta++) { + const originalStart = change.originalStart - delta; + const modifiedStart = change.modifiedStart - delta; + if (originalStart < originalStop || modifiedStart < modifiedStop) { + break; + } + if (checkOriginal && !this.OriginalElementsAreEqual(originalStart, originalStart + change.originalLength)) { + break; + } + if (checkModified && !this.ModifiedElementsAreEqual(modifiedStart, modifiedStart + change.modifiedLength)) { + break; + } + const touchingPreviousChange = originalStart === originalStop && modifiedStart === modifiedStop; + const score3 = (touchingPreviousChange ? 5 : 0) + this._boundaryScore(originalStart, change.originalLength, modifiedStart, change.modifiedLength); + if (score3 > bestScore) { + bestScore = score3; + bestDelta = delta; + } + } + change.originalStart -= bestDelta; + change.modifiedStart -= bestDelta; + const mergedChangeArr = [null]; + if (i > 0 && this.ChangesOverlap(changes[i - 1], changes[i], mergedChangeArr)) { + changes[i - 1] = mergedChangeArr[0]; + changes.splice(i, 1); + i++; + continue; + } + } + if (this._hasStrings) { + for (let i = 1, len = changes.length; i < len; i++) { + const aChange = changes[i - 1]; + const bChange = changes[i]; + const matchedLength = bChange.originalStart - aChange.originalStart - aChange.originalLength; + const aOriginalStart = aChange.originalStart; + const bOriginalEnd = bChange.originalStart + bChange.originalLength; + const abOriginalLength = bOriginalEnd - aOriginalStart; + const aModifiedStart = aChange.modifiedStart; + const bModifiedEnd = bChange.modifiedStart + bChange.modifiedLength; + const abModifiedLength = bModifiedEnd - aModifiedStart; + if (matchedLength < 5 && abOriginalLength < 20 && abModifiedLength < 20) { + const t4 = this._findBetterContiguousSequence(aOriginalStart, abOriginalLength, aModifiedStart, abModifiedLength, matchedLength); + if (t4) { + const [originalMatchStart, modifiedMatchStart] = t4; + if (originalMatchStart !== aChange.originalStart + aChange.originalLength || modifiedMatchStart !== aChange.modifiedStart + aChange.modifiedLength) { + aChange.originalLength = originalMatchStart - aChange.originalStart; + aChange.modifiedLength = modifiedMatchStart - aChange.modifiedStart; + bChange.originalStart = originalMatchStart + matchedLength; + bChange.modifiedStart = modifiedMatchStart + matchedLength; + bChange.originalLength = bOriginalEnd - bChange.originalStart; + bChange.modifiedLength = bModifiedEnd - bChange.modifiedStart; + } + } + } + } + } + return changes; + } + _findBetterContiguousSequence(originalStart, originalLength, modifiedStart, modifiedLength, desiredLength) { + if (originalLength < desiredLength || modifiedLength < desiredLength) { + return null; + } + const originalMax = originalStart + originalLength - desiredLength + 1; + const modifiedMax = modifiedStart + modifiedLength - desiredLength + 1; + let bestScore = 0; + let bestOriginalStart = 0; + let bestModifiedStart = 0; + for (let i = originalStart; i < originalMax; i++) { + for (let j = modifiedStart; j < modifiedMax; j++) { + const score3 = this._contiguousSequenceScore(i, j, desiredLength); + if (score3 > 0 && score3 > bestScore) { + bestScore = score3; + bestOriginalStart = i; + bestModifiedStart = j; + } + } + } + if (bestScore > 0) { + return [bestOriginalStart, bestModifiedStart]; + } + return null; + } + _contiguousSequenceScore(originalStart, modifiedStart, length) { + let score3 = 0; + for (let l = 0; l < length; l++) { + if (!this.ElementsAreEqual(originalStart + l, modifiedStart + l)) { + return 0; + } + score3 += this._originalStringElements[originalStart + l].length; + } + return score3; + } + _OriginalIsBoundary(index) { + if (index <= 0 || index >= this._originalElementsOrHash.length - 1) { + return true; + } + return this._hasStrings && /^\s*$/.test(this._originalStringElements[index]); + } + _OriginalRegionIsBoundary(originalStart, originalLength) { + if (this._OriginalIsBoundary(originalStart) || this._OriginalIsBoundary(originalStart - 1)) { + return true; + } + if (originalLength > 0) { + const originalEnd = originalStart + originalLength; + if (this._OriginalIsBoundary(originalEnd - 1) || this._OriginalIsBoundary(originalEnd)) { + return true; + } + } + return false; + } + _ModifiedIsBoundary(index) { + if (index <= 0 || index >= this._modifiedElementsOrHash.length - 1) { + return true; + } + return this._hasStrings && /^\s*$/.test(this._modifiedStringElements[index]); + } + _ModifiedRegionIsBoundary(modifiedStart, modifiedLength) { + if (this._ModifiedIsBoundary(modifiedStart) || this._ModifiedIsBoundary(modifiedStart - 1)) { + return true; + } + if (modifiedLength > 0) { + const modifiedEnd = modifiedStart + modifiedLength; + if (this._ModifiedIsBoundary(modifiedEnd - 1) || this._ModifiedIsBoundary(modifiedEnd)) { + return true; + } + } + return false; + } + _boundaryScore(originalStart, originalLength, modifiedStart, modifiedLength) { + const originalScore = this._OriginalRegionIsBoundary(originalStart, originalLength) ? 1 : 0; + const modifiedScore = this._ModifiedRegionIsBoundary(modifiedStart, modifiedLength) ? 1 : 0; + return originalScore + modifiedScore; + } + /** + * Concatenates the two input DiffChange lists and returns the resulting + * list. + * @param The left changes + * @param The right changes + * @returns The concatenated list + */ + ConcatenateChanges(left, right) { + const mergedChangeArr = []; + if (left.length === 0 || right.length === 0) { + return right.length > 0 ? right : left; + } else if (this.ChangesOverlap(left[left.length - 1], right[0], mergedChangeArr)) { + const result = new Array(left.length + right.length - 1); + MyArray.Copy(left, 0, result, 0, left.length - 1); + result[left.length - 1] = mergedChangeArr[0]; + MyArray.Copy(right, 1, result, left.length, right.length - 1); + return result; + } else { + const result = new Array(left.length + right.length); + MyArray.Copy(left, 0, result, 0, left.length); + MyArray.Copy(right, 0, result, left.length, right.length); + return result; + } + } + /** + * Returns true if the two changes overlap and can be merged into a single + * change + * @param left The left change + * @param right The right change + * @param mergedChange The merged change if the two overlap, null otherwise + * @returns True if the two changes overlap + */ + ChangesOverlap(left, right, mergedChangeArr) { + Debug.Assert(left.originalStart <= right.originalStart, "Left change is not less than or equal to right change"); + Debug.Assert(left.modifiedStart <= right.modifiedStart, "Left change is not less than or equal to right change"); + if (left.originalStart + left.originalLength >= right.originalStart || left.modifiedStart + left.modifiedLength >= right.modifiedStart) { + const originalStart = left.originalStart; + let originalLength = left.originalLength; + const modifiedStart = left.modifiedStart; + let modifiedLength = left.modifiedLength; + if (left.originalStart + left.originalLength >= right.originalStart) { + originalLength = right.originalStart + right.originalLength - left.originalStart; + } + if (left.modifiedStart + left.modifiedLength >= right.modifiedStart) { + modifiedLength = right.modifiedStart + right.modifiedLength - left.modifiedStart; + } + mergedChangeArr[0] = new DiffChange(originalStart, originalLength, modifiedStart, modifiedLength); + return true; + } else { + mergedChangeArr[0] = null; + return false; + } + } + /** + * Helper method used to clip a diagonal index to the range of valid + * diagonals. This also decides whether or not the diagonal index, + * if it exceeds the boundary, should be clipped to the boundary or clipped + * one inside the boundary depending on the Even/Odd status of the boundary + * and numDifferences. + * @param diagonal The index of the diagonal to clip. + * @param numDifferences The current number of differences being iterated upon. + * @param diagonalBaseIndex The base reference diagonal. + * @param numDiagonals The total number of diagonals. + * @returns The clipped diagonal index. + */ + ClipDiagonalBound(diagonal, numDifferences, diagonalBaseIndex, numDiagonals) { + if (diagonal >= 0 && diagonal < numDiagonals) { + return diagonal; + } + const diagonalsBelow = diagonalBaseIndex; + const diagonalsAbove = numDiagonals - diagonalBaseIndex - 1; + const diffEven = numDifferences % 2 === 0; + if (diagonal < 0) { + const lowerBoundEven = diagonalsBelow % 2 === 0; + return diffEven === lowerBoundEven ? 0 : 1; + } else { + const upperBoundEven = diagonalsAbove % 2 === 0; + return diffEven === upperBoundEven ? numDiagonals - 1 : numDiagonals - 2; + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/uint.js +function toUint8(v) { + if (v < 0) { + return 0; + } + if (v > 255) { + return 255; + } + return v | 0; +} +function toUint32(v) { + if (v < 0) { + return 0; + } + if (v > 4294967295) { + return 4294967295; + } + return v | 0; +} +var init_uint = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/uint.js"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/prefixSumComputer.js +var PrefixSumComputer, ConstantTimePrefixSumComputer, PrefixSumIndexOfResult; +var init_prefixSumComputer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/prefixSumComputer.js"() { + init_arrays(); + init_uint(); + PrefixSumComputer = class { + constructor(values2) { + this.values = values2; + this.prefixSum = new Uint32Array(values2.length); + this.prefixSumValidIndex = new Int32Array(1); + this.prefixSumValidIndex[0] = -1; + } + insertValues(insertIndex, insertValues) { + insertIndex = toUint32(insertIndex); + const oldValues = this.values; + const oldPrefixSum = this.prefixSum; + const insertValuesLen = insertValues.length; + if (insertValuesLen === 0) { + return false; + } + this.values = new Uint32Array(oldValues.length + insertValuesLen); + this.values.set(oldValues.subarray(0, insertIndex), 0); + this.values.set(oldValues.subarray(insertIndex), insertIndex + insertValuesLen); + this.values.set(insertValues, insertIndex); + if (insertIndex - 1 < this.prefixSumValidIndex[0]) { + this.prefixSumValidIndex[0] = insertIndex - 1; + } + this.prefixSum = new Uint32Array(this.values.length); + if (this.prefixSumValidIndex[0] >= 0) { + this.prefixSum.set(oldPrefixSum.subarray(0, this.prefixSumValidIndex[0] + 1)); + } + return true; + } + setValue(index, value) { + index = toUint32(index); + value = toUint32(value); + if (this.values[index] === value) { + return false; + } + this.values[index] = value; + if (index - 1 < this.prefixSumValidIndex[0]) { + this.prefixSumValidIndex[0] = index - 1; + } + return true; + } + removeValues(startIndex, count) { + startIndex = toUint32(startIndex); + count = toUint32(count); + const oldValues = this.values; + const oldPrefixSum = this.prefixSum; + if (startIndex >= oldValues.length) { + return false; + } + const maxCount = oldValues.length - startIndex; + if (count >= maxCount) { + count = maxCount; + } + if (count === 0) { + return false; + } + this.values = new Uint32Array(oldValues.length - count); + this.values.set(oldValues.subarray(0, startIndex), 0); + this.values.set(oldValues.subarray(startIndex + count), startIndex); + this.prefixSum = new Uint32Array(this.values.length); + if (startIndex - 1 < this.prefixSumValidIndex[0]) { + this.prefixSumValidIndex[0] = startIndex - 1; + } + if (this.prefixSumValidIndex[0] >= 0) { + this.prefixSum.set(oldPrefixSum.subarray(0, this.prefixSumValidIndex[0] + 1)); + } + return true; + } + getTotalSum() { + if (this.values.length === 0) { + return 0; + } + return this._getPrefixSum(this.values.length - 1); + } + /** + * Returns the sum of the first `index + 1` many items. + * @returns `SUM(0 <= j <= index, values[j])`. + */ + getPrefixSum(index) { + if (index < 0) { + return 0; + } + index = toUint32(index); + return this._getPrefixSum(index); + } + _getPrefixSum(index) { + if (index <= this.prefixSumValidIndex[0]) { + return this.prefixSum[index]; + } + let startIndex = this.prefixSumValidIndex[0] + 1; + if (startIndex === 0) { + this.prefixSum[0] = this.values[0]; + startIndex++; + } + if (index >= this.values.length) { + index = this.values.length - 1; + } + for (let i = startIndex; i <= index; i++) { + this.prefixSum[i] = this.prefixSum[i - 1] + this.values[i]; + } + this.prefixSumValidIndex[0] = Math.max(this.prefixSumValidIndex[0], index); + return this.prefixSum[index]; + } + getIndexOf(sum) { + sum = Math.floor(sum); + this.getTotalSum(); + let low = 0; + let high = this.values.length - 1; + let mid = 0; + let midStop = 0; + let midStart = 0; + while (low <= high) { + mid = low + (high - low) / 2 | 0; + midStop = this.prefixSum[mid]; + midStart = midStop - this.values[mid]; + if (sum < midStart) { + high = mid - 1; + } else if (sum >= midStop) { + low = mid + 1; + } else { + break; + } + } + return new PrefixSumIndexOfResult(mid, sum - midStart); + } + }; + ConstantTimePrefixSumComputer = class { + constructor(values2) { + this._values = values2; + this._isValid = false; + this._validEndIndex = -1; + this._prefixSum = []; + this._indexBySum = []; + } + /** + * @returns SUM(0 <= j < values.length, values[j]) + */ + getTotalSum() { + this._ensureValid(); + return this._indexBySum.length; + } + /** + * Returns the sum of the first `count` many items. + * @returns `SUM(0 <= j < count, values[j])`. + */ + getPrefixSum(count) { + this._ensureValid(); + if (count === 0) { + return 0; + } + return this._prefixSum[count - 1]; + } + /** + * @returns `result`, such that `getPrefixSum(result.index) + result.remainder = sum` + */ + getIndexOf(sum) { + this._ensureValid(); + const idx = this._indexBySum[sum]; + const viewLinesAbove = idx > 0 ? this._prefixSum[idx - 1] : 0; + return new PrefixSumIndexOfResult(idx, sum - viewLinesAbove); + } + removeValues(start, deleteCount) { + this._values.splice(start, deleteCount); + this._invalidate(start); + } + insertValues(insertIndex, insertArr) { + this._values = arrayInsert(this._values, insertIndex, insertArr); + this._invalidate(insertIndex); + } + _invalidate(index) { + this._isValid = false; + this._validEndIndex = Math.min(this._validEndIndex, index - 1); + } + _ensureValid() { + if (this._isValid) { + return; + } + for (let i = this._validEndIndex + 1, len = this._values.length; i < len; i++) { + const value = this._values[i]; + const sumAbove = i > 0 ? this._prefixSum[i - 1] : 0; + this._prefixSum[i] = sumAbove + value; + for (let j = 0; j < value; j++) { + this._indexBySum[sumAbove + j] = i; + } + } + this._prefixSum.length = this._values.length; + this._indexBySum.length = this._prefixSum[this._prefixSum.length - 1]; + this._isValid = true; + this._validEndIndex = this._values.length - 1; + } + setValue(index, value) { + if (this._values[index] === value) { + return; + } + this._values[index] = value; + this._invalidate(index); + } + }; + PrefixSumIndexOfResult = class { + constructor(index, remainder) { + this.index = index; + this.remainder = remainder; + this._prefixSumIndexOfResultBrand = void 0; + this.index = index; + this.remainder = remainder; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/mirrorTextModel.js +var MirrorTextModel; +var init_mirrorTextModel = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/mirrorTextModel.js"() { + init_strings(); + init_position(); + init_prefixSumComputer(); + MirrorTextModel = class { + constructor(uri, lines, eol, versionId) { + this._uri = uri; + this._lines = lines; + this._eol = eol; + this._versionId = versionId; + this._lineStarts = null; + this._cachedTextValue = null; + } + dispose() { + this._lines.length = 0; + } + get version() { + return this._versionId; + } + getText() { + if (this._cachedTextValue === null) { + this._cachedTextValue = this._lines.join(this._eol); + } + return this._cachedTextValue; + } + onEvents(e) { + if (e.eol && e.eol !== this._eol) { + this._eol = e.eol; + this._lineStarts = null; + } + const changes = e.changes; + for (const change of changes) { + this._acceptDeleteRange(change.range); + this._acceptInsertText(new Position(change.range.startLineNumber, change.range.startColumn), change.text); + } + this._versionId = e.versionId; + this._cachedTextValue = null; + } + _ensureLineStarts() { + if (!this._lineStarts) { + const eolLength = this._eol.length; + const linesLength = this._lines.length; + const lineStartValues = new Uint32Array(linesLength); + for (let i = 0; i < linesLength; i++) { + lineStartValues[i] = this._lines[i].length + eolLength; + } + this._lineStarts = new PrefixSumComputer(lineStartValues); + } + } + /** + * All changes to a line's text go through this method + */ + _setLineText(lineIndex, newValue) { + this._lines[lineIndex] = newValue; + if (this._lineStarts) { + this._lineStarts.setValue(lineIndex, this._lines[lineIndex].length + this._eol.length); + } + } + _acceptDeleteRange(range2) { + if (range2.startLineNumber === range2.endLineNumber) { + if (range2.startColumn === range2.endColumn) { + return; + } + this._setLineText(range2.startLineNumber - 1, this._lines[range2.startLineNumber - 1].substring(0, range2.startColumn - 1) + this._lines[range2.startLineNumber - 1].substring(range2.endColumn - 1)); + return; + } + this._setLineText(range2.startLineNumber - 1, this._lines[range2.startLineNumber - 1].substring(0, range2.startColumn - 1) + this._lines[range2.endLineNumber - 1].substring(range2.endColumn - 1)); + this._lines.splice(range2.startLineNumber, range2.endLineNumber - range2.startLineNumber); + if (this._lineStarts) { + this._lineStarts.removeValues(range2.startLineNumber, range2.endLineNumber - range2.startLineNumber); + } + } + _acceptInsertText(position, insertText) { + if (insertText.length === 0) { + return; + } + const insertLines = splitLines(insertText); + if (insertLines.length === 1) { + this._setLineText(position.lineNumber - 1, this._lines[position.lineNumber - 1].substring(0, position.column - 1) + insertLines[0] + this._lines[position.lineNumber - 1].substring(position.column - 1)); + return; + } + insertLines[insertLines.length - 1] += this._lines[position.lineNumber - 1].substring(position.column - 1); + this._setLineText(position.lineNumber - 1, this._lines[position.lineNumber - 1].substring(0, position.column - 1) + insertLines[0]); + const newLengths = new Uint32Array(insertLines.length - 1); + for (let i = 1; i < insertLines.length; i++) { + this._lines.splice(position.lineNumber + i - 1, 0, insertLines[i]); + newLengths[i - 1] = insertLines[i].length + this._eol.length; + } + if (this._lineStarts) { + this._lineStarts.insertValues(position.lineNumber, newLengths); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/characterClassifier.js +var CharacterClassifier, CharacterSet; +var init_characterClassifier = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/characterClassifier.js"() { + init_uint(); + CharacterClassifier = class _CharacterClassifier { + constructor(_defaultValue) { + const defaultValue = toUint8(_defaultValue); + this._defaultValue = defaultValue; + this._asciiMap = _CharacterClassifier._createAsciiMap(defaultValue); + this._map = /* @__PURE__ */ new Map(); + } + static _createAsciiMap(defaultValue) { + const asciiMap = new Uint8Array(256); + asciiMap.fill(defaultValue); + return asciiMap; + } + set(charCode, _value) { + const value = toUint8(_value); + if (charCode >= 0 && charCode < 256) { + this._asciiMap[charCode] = value; + } else { + this._map.set(charCode, value); + } + } + get(charCode) { + if (charCode >= 0 && charCode < 256) { + return this._asciiMap[charCode]; + } else { + return this._map.get(charCode) || this._defaultValue; + } + } + clear() { + this._asciiMap.fill(this._defaultValue); + this._map.clear(); + } + }; + CharacterSet = class { + constructor() { + this._actual = new CharacterClassifier( + 0 + /* Boolean.False */ + ); + } + add(charCode) { + this._actual.set( + charCode, + 1 + /* Boolean.True */ + ); + } + has(charCode) { + return this._actual.get(charCode) === 1; + } + clear() { + return this._actual.clear(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/linkComputer.js +function getStateMachine() { + if (_stateMachine === null) { + _stateMachine = new StateMachine([ + [ + 1, + 104, + 2 + /* State.H */ + ], + [ + 1, + 72, + 2 + /* State.H */ + ], + [ + 1, + 102, + 6 + /* State.F */ + ], + [ + 1, + 70, + 6 + /* State.F */ + ], + [ + 2, + 116, + 3 + /* State.HT */ + ], + [ + 2, + 84, + 3 + /* State.HT */ + ], + [ + 3, + 116, + 4 + /* State.HTT */ + ], + [ + 3, + 84, + 4 + /* State.HTT */ + ], + [ + 4, + 112, + 5 + /* State.HTTP */ + ], + [ + 4, + 80, + 5 + /* State.HTTP */ + ], + [ + 5, + 115, + 9 + /* State.BeforeColon */ + ], + [ + 5, + 83, + 9 + /* State.BeforeColon */ + ], + [ + 5, + 58, + 10 + /* State.AfterColon */ + ], + [ + 6, + 105, + 7 + /* State.FI */ + ], + [ + 6, + 73, + 7 + /* State.FI */ + ], + [ + 7, + 108, + 8 + /* State.FIL */ + ], + [ + 7, + 76, + 8 + /* State.FIL */ + ], + [ + 8, + 101, + 9 + /* State.BeforeColon */ + ], + [ + 8, + 69, + 9 + /* State.BeforeColon */ + ], + [ + 9, + 58, + 10 + /* State.AfterColon */ + ], + [ + 10, + 47, + 11 + /* State.AlmostThere */ + ], + [ + 11, + 47, + 12 + /* State.End */ + ] + ]); + } + return _stateMachine; +} +function getClassifier() { + if (_classifier === null) { + _classifier = new CharacterClassifier( + 0 + /* CharacterClass.None */ + ); + const FORCE_TERMINATION_CHARACTERS = ` <>'"\u3001\u3002\uFF61\uFF64\uFF0C\uFF0E\uFF1A\uFF1B\u2018\u3008\u300C\u300E\u3014\uFF08\uFF3B\uFF5B\uFF62\uFF63\uFF5D\uFF3D\uFF09\u3015\u300F\u300D\u3009\u2019\uFF40\uFF5E\u2026`; + for (let i = 0; i < FORCE_TERMINATION_CHARACTERS.length; i++) { + _classifier.set( + FORCE_TERMINATION_CHARACTERS.charCodeAt(i), + 1 + /* CharacterClass.ForceTermination */ + ); + } + const CANNOT_END_WITH_CHARACTERS = ".,;:"; + for (let i = 0; i < CANNOT_END_WITH_CHARACTERS.length; i++) { + _classifier.set( + CANNOT_END_WITH_CHARACTERS.charCodeAt(i), + 2 + /* CharacterClass.CannotEndIn */ + ); + } + } + return _classifier; +} +function computeLinks(model) { + if (!model || typeof model.getLineCount !== "function" || typeof model.getLineContent !== "function") { + return []; + } + return LinkComputer.computeLinks(model); +} +var Uint8Matrix, StateMachine, _stateMachine, _classifier, LinkComputer; +var init_linkComputer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/linkComputer.js"() { + init_characterClassifier(); + Uint8Matrix = class { + constructor(rows, cols, defaultValue) { + const data = new Uint8Array(rows * cols); + for (let i = 0, len = rows * cols; i < len; i++) { + data[i] = defaultValue; + } + this._data = data; + this.rows = rows; + this.cols = cols; + } + get(row, col) { + return this._data[row * this.cols + col]; + } + set(row, col, value) { + this._data[row * this.cols + col] = value; + } + }; + StateMachine = class { + constructor(edges) { + let maxCharCode = 0; + let maxState = 0; + for (let i = 0, len = edges.length; i < len; i++) { + const [from, chCode, to] = edges[i]; + if (chCode > maxCharCode) { + maxCharCode = chCode; + } + if (from > maxState) { + maxState = from; + } + if (to > maxState) { + maxState = to; + } + } + maxCharCode++; + maxState++; + const states = new Uint8Matrix( + maxState, + maxCharCode, + 0 + /* State.Invalid */ + ); + for (let i = 0, len = edges.length; i < len; i++) { + const [from, chCode, to] = edges[i]; + states.set(from, chCode, to); + } + this._states = states; + this._maxCharCode = maxCharCode; + } + nextState(currentState, chCode) { + if (chCode < 0 || chCode >= this._maxCharCode) { + return 0; + } + return this._states.get(currentState, chCode); + } + }; + _stateMachine = null; + _classifier = null; + LinkComputer = class _LinkComputer { + static _createLink(classifier, line, lineNumber, linkBeginIndex, linkEndIndex) { + let lastIncludedCharIndex = linkEndIndex - 1; + do { + const chCode = line.charCodeAt(lastIncludedCharIndex); + const chClass = classifier.get(chCode); + if (chClass !== 2) { + break; + } + lastIncludedCharIndex--; + } while (lastIncludedCharIndex > linkBeginIndex); + if (linkBeginIndex > 0) { + const charCodeBeforeLink = line.charCodeAt(linkBeginIndex - 1); + const lastCharCodeInLink = line.charCodeAt(lastIncludedCharIndex); + if (charCodeBeforeLink === 40 && lastCharCodeInLink === 41 || charCodeBeforeLink === 91 && lastCharCodeInLink === 93 || charCodeBeforeLink === 123 && lastCharCodeInLink === 125) { + lastIncludedCharIndex--; + } + } + return { + range: { + startLineNumber: lineNumber, + startColumn: linkBeginIndex + 1, + endLineNumber: lineNumber, + endColumn: lastIncludedCharIndex + 2 + }, + url: line.substring(linkBeginIndex, lastIncludedCharIndex + 1) + }; + } + static computeLinks(model, stateMachine = getStateMachine()) { + const classifier = getClassifier(); + const result = []; + for (let i = 1, lineCount = model.getLineCount(); i <= lineCount; i++) { + const line = model.getLineContent(i); + const len = line.length; + let j = 0; + let linkBeginIndex = 0; + let linkBeginChCode = 0; + let state = 1; + let hasOpenParens = false; + let hasOpenSquareBracket = false; + let inSquareBrackets = false; + let hasOpenCurlyBracket = false; + while (j < len) { + let resetStateMachine = false; + const chCode = line.charCodeAt(j); + if (state === 13) { + let chClass; + switch (chCode) { + case 40: + hasOpenParens = true; + chClass = 0; + break; + case 41: + chClass = hasOpenParens ? 0 : 1; + break; + case 91: + inSquareBrackets = true; + hasOpenSquareBracket = true; + chClass = 0; + break; + case 93: + inSquareBrackets = false; + chClass = hasOpenSquareBracket ? 0 : 1; + break; + case 123: + hasOpenCurlyBracket = true; + chClass = 0; + break; + case 125: + chClass = hasOpenCurlyBracket ? 0 : 1; + break; + // The following three rules make it that ' or " or ` are allowed inside links + // only if the link is wrapped by some other quote character + case 39: + case 34: + case 96: + if (linkBeginChCode === chCode) { + chClass = 1; + } else if (linkBeginChCode === 39 || linkBeginChCode === 34 || linkBeginChCode === 96) { + chClass = 0; + } else { + chClass = 1; + } + break; + case 42: + chClass = linkBeginChCode === 42 ? 1 : 0; + break; + case 124: + chClass = linkBeginChCode === 124 ? 1 : 0; + break; + case 32: + chClass = inSquareBrackets ? 0 : 1; + break; + default: + chClass = classifier.get(chCode); + } + if (chClass === 1) { + result.push(_LinkComputer._createLink(classifier, line, i, linkBeginIndex, j)); + resetStateMachine = true; + } + } else if (state === 12) { + let chClass; + if (chCode === 91) { + hasOpenSquareBracket = true; + chClass = 0; + } else { + chClass = classifier.get(chCode); + } + if (chClass === 1) { + resetStateMachine = true; + } else { + state = 13; + } + } else { + state = stateMachine.nextState(state, chCode); + if (state === 0) { + resetStateMachine = true; + } + } + if (resetStateMachine) { + state = 1; + hasOpenParens = false; + hasOpenSquareBracket = false; + hasOpenCurlyBracket = false; + linkBeginIndex = j + 1; + linkBeginChCode = chCode; + } + j++; + } + if (state === 13) { + result.push(_LinkComputer._createLink(classifier, line, i, linkBeginIndex, len)); + } + } + return result; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/supports/inplaceReplaceSupport.js +var BasicInplaceReplace; +var init_inplaceReplaceSupport = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/supports/inplaceReplaceSupport.js"() { + BasicInplaceReplace = class { + constructor() { + this._defaultValueSet = [ + ["true", "false"], + ["True", "False"], + ["Private", "Public", "Friend", "ReadOnly", "Partial", "Protected", "WriteOnly"], + ["public", "protected", "private"] + ]; + } + navigateValueSet(range1, text1, range2, text2, up) { + if (range1 && text1) { + const result = this.doNavigateValueSet(text1, up); + if (result) { + return { + range: range1, + value: result + }; + } + } + if (range2 && text2) { + const result = this.doNavigateValueSet(text2, up); + if (result) { + return { + range: range2, + value: result + }; + } + } + return null; + } + doNavigateValueSet(text2, up) { + const numberResult = this.numberReplace(text2, up); + if (numberResult !== null) { + return numberResult; + } + return this.textReplace(text2, up); + } + numberReplace(value, up) { + const precision = Math.pow(10, value.length - (value.lastIndexOf(".") + 1)); + let n1 = Number(value); + const n2 = parseFloat(value); + if (!isNaN(n1) && !isNaN(n2) && n1 === n2) { + if (n1 === 0 && !up) { + return null; + } else { + n1 = Math.floor(n1 * precision); + n1 += up ? precision : -precision; + return String(n1 / precision); + } + } + return null; + } + textReplace(value, up) { + return this.valueSetsReplace(this._defaultValueSet, value, up); + } + valueSetsReplace(valueSets, value, up) { + let result = null; + for (let i = 0, len = valueSets.length; result === null && i < len; i++) { + result = this.valueSetReplace(valueSets[i], value, up); + } + return result; + } + valueSetReplace(valueSet, value, up) { + let idx = valueSet.indexOf(value); + if (idx >= 0) { + idx += up ? 1 : -1; + if (idx < 0) { + idx = valueSet.length - 1; + } else { + idx %= valueSet.length; + } + return valueSet[idx]; + } + return null; + } + }; + BasicInplaceReplace.INSTANCE = new BasicInplaceReplace(); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/map.js +function isEntries(arg) { + return Array.isArray(arg); +} +var _a3, _b2, ResourceMapEntry, ResourceMap, LinkedMap, Cache, LRUCache, BidirectionalMap, SetMap; +var init_map = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/map.js"() { + ResourceMapEntry = class { + constructor(uri, value) { + this.uri = uri; + this.value = value; + } + }; + ResourceMap = class _ResourceMap { + constructor(arg, toKey) { + this[_a3] = "ResourceMap"; + if (arg instanceof _ResourceMap) { + this.map = new Map(arg.map); + this.toKey = toKey !== null && toKey !== void 0 ? toKey : _ResourceMap.defaultToKey; + } else if (isEntries(arg)) { + this.map = /* @__PURE__ */ new Map(); + this.toKey = toKey !== null && toKey !== void 0 ? toKey : _ResourceMap.defaultToKey; + for (const [resource, value] of arg) { + this.set(resource, value); + } + } else { + this.map = /* @__PURE__ */ new Map(); + this.toKey = arg !== null && arg !== void 0 ? arg : _ResourceMap.defaultToKey; + } + } + set(resource, value) { + this.map.set(this.toKey(resource), new ResourceMapEntry(resource, value)); + return this; + } + get(resource) { + var _c2; + return (_c2 = this.map.get(this.toKey(resource))) === null || _c2 === void 0 ? void 0 : _c2.value; + } + has(resource) { + return this.map.has(this.toKey(resource)); + } + get size() { + return this.map.size; + } + clear() { + this.map.clear(); + } + delete(resource) { + return this.map.delete(this.toKey(resource)); + } + forEach(clb, thisArg) { + if (typeof thisArg !== "undefined") { + clb = clb.bind(thisArg); + } + for (const [_, entry] of this.map) { + clb(entry.value, entry.uri, this); + } + } + *values() { + for (const entry of this.map.values()) { + yield entry.value; + } + } + *keys() { + for (const entry of this.map.values()) { + yield entry.uri; + } + } + *entries() { + for (const entry of this.map.values()) { + yield [entry.uri, entry.value]; + } + } + *[(_a3 = Symbol.toStringTag, Symbol.iterator)]() { + for (const [, entry] of this.map) { + yield [entry.uri, entry.value]; + } + } + }; + ResourceMap.defaultToKey = (resource) => resource.toString(); + LinkedMap = class { + constructor() { + this[_b2] = "LinkedMap"; + this._map = /* @__PURE__ */ new Map(); + this._head = void 0; + this._tail = void 0; + this._size = 0; + this._state = 0; + } + clear() { + this._map.clear(); + this._head = void 0; + this._tail = void 0; + this._size = 0; + this._state++; + } + isEmpty() { + return !this._head && !this._tail; + } + get size() { + return this._size; + } + get first() { + var _c2; + return (_c2 = this._head) === null || _c2 === void 0 ? void 0 : _c2.value; + } + get last() { + var _c2; + return (_c2 = this._tail) === null || _c2 === void 0 ? void 0 : _c2.value; + } + has(key) { + return this._map.has(key); + } + get(key, touch = 0) { + const item = this._map.get(key); + if (!item) { + return void 0; + } + if (touch !== 0) { + this.touch(item, touch); + } + return item.value; + } + set(key, value, touch = 0) { + let item = this._map.get(key); + if (item) { + item.value = value; + if (touch !== 0) { + this.touch(item, touch); + } + } else { + item = { key, value, next: void 0, previous: void 0 }; + switch (touch) { + case 0: + this.addItemLast(item); + break; + case 1: + this.addItemFirst(item); + break; + case 2: + this.addItemLast(item); + break; + default: + this.addItemLast(item); + break; + } + this._map.set(key, item); + this._size++; + } + return this; + } + delete(key) { + return !!this.remove(key); + } + remove(key) { + const item = this._map.get(key); + if (!item) { + return void 0; + } + this._map.delete(key); + this.removeItem(item); + this._size--; + return item.value; + } + shift() { + if (!this._head && !this._tail) { + return void 0; + } + if (!this._head || !this._tail) { + throw new Error("Invalid list"); + } + const item = this._head; + this._map.delete(item.key); + this.removeItem(item); + this._size--; + return item.value; + } + forEach(callbackfn, thisArg) { + const state = this._state; + let current = this._head; + while (current) { + if (thisArg) { + callbackfn.bind(thisArg)(current.value, current.key, this); + } else { + callbackfn(current.value, current.key, this); + } + if (this._state !== state) { + throw new Error(`LinkedMap got modified during iteration.`); + } + current = current.next; + } + } + keys() { + const map = this; + const state = this._state; + let current = this._head; + const iterator = { + [Symbol.iterator]() { + return iterator; + }, + next() { + if (map._state !== state) { + throw new Error(`LinkedMap got modified during iteration.`); + } + if (current) { + const result = { value: current.key, done: false }; + current = current.next; + return result; + } else { + return { value: void 0, done: true }; + } + } + }; + return iterator; + } + values() { + const map = this; + const state = this._state; + let current = this._head; + const iterator = { + [Symbol.iterator]() { + return iterator; + }, + next() { + if (map._state !== state) { + throw new Error(`LinkedMap got modified during iteration.`); + } + if (current) { + const result = { value: current.value, done: false }; + current = current.next; + return result; + } else { + return { value: void 0, done: true }; + } + } + }; + return iterator; + } + entries() { + const map = this; + const state = this._state; + let current = this._head; + const iterator = { + [Symbol.iterator]() { + return iterator; + }, + next() { + if (map._state !== state) { + throw new Error(`LinkedMap got modified during iteration.`); + } + if (current) { + const result = { value: [current.key, current.value], done: false }; + current = current.next; + return result; + } else { + return { value: void 0, done: true }; + } + } + }; + return iterator; + } + [(_b2 = Symbol.toStringTag, Symbol.iterator)]() { + return this.entries(); + } + trimOld(newSize) { + if (newSize >= this.size) { + return; + } + if (newSize === 0) { + this.clear(); + return; + } + let current = this._head; + let currentSize = this.size; + while (current && currentSize > newSize) { + this._map.delete(current.key); + current = current.next; + currentSize--; + } + this._head = current; + this._size = currentSize; + if (current) { + current.previous = void 0; + } + this._state++; + } + trimNew(newSize) { + if (newSize >= this.size) { + return; + } + if (newSize === 0) { + this.clear(); + return; + } + let current = this._tail; + let currentSize = this.size; + while (current && currentSize > newSize) { + this._map.delete(current.key); + current = current.previous; + currentSize--; + } + this._tail = current; + this._size = currentSize; + if (current) { + current.next = void 0; + } + this._state++; + } + addItemFirst(item) { + if (!this._head && !this._tail) { + this._tail = item; + } else if (!this._head) { + throw new Error("Invalid list"); + } else { + item.next = this._head; + this._head.previous = item; + } + this._head = item; + this._state++; + } + addItemLast(item) { + if (!this._head && !this._tail) { + this._head = item; + } else if (!this._tail) { + throw new Error("Invalid list"); + } else { + item.previous = this._tail; + this._tail.next = item; + } + this._tail = item; + this._state++; + } + removeItem(item) { + if (item === this._head && item === this._tail) { + this._head = void 0; + this._tail = void 0; + } else if (item === this._head) { + if (!item.next) { + throw new Error("Invalid list"); + } + item.next.previous = void 0; + this._head = item.next; + } else if (item === this._tail) { + if (!item.previous) { + throw new Error("Invalid list"); + } + item.previous.next = void 0; + this._tail = item.previous; + } else { + const next = item.next; + const previous = item.previous; + if (!next || !previous) { + throw new Error("Invalid list"); + } + next.previous = previous; + previous.next = next; + } + item.next = void 0; + item.previous = void 0; + this._state++; + } + touch(item, touch) { + if (!this._head || !this._tail) { + throw new Error("Invalid list"); + } + if (touch !== 1 && touch !== 2) { + return; + } + if (touch === 1) { + if (item === this._head) { + return; + } + const next = item.next; + const previous = item.previous; + if (item === this._tail) { + previous.next = void 0; + this._tail = previous; + } else { + next.previous = previous; + previous.next = next; + } + item.previous = void 0; + item.next = this._head; + this._head.previous = item; + this._head = item; + this._state++; + } else if (touch === 2) { + if (item === this._tail) { + return; + } + const next = item.next; + const previous = item.previous; + if (item === this._head) { + next.previous = void 0; + this._head = next; + } else { + next.previous = previous; + previous.next = next; + } + item.next = void 0; + item.previous = this._tail; + this._tail.next = item; + this._tail = item; + this._state++; + } + } + toJSON() { + const data = []; + this.forEach((value, key) => { + data.push([key, value]); + }); + return data; + } + fromJSON(data) { + this.clear(); + for (const [key, value] of data) { + this.set(key, value); + } + } + }; + Cache = class extends LinkedMap { + constructor(limit, ratio = 1) { + super(); + this._limit = limit; + this._ratio = Math.min(Math.max(0, ratio), 1); + } + get limit() { + return this._limit; + } + set limit(limit) { + this._limit = limit; + this.checkTrim(); + } + get(key, touch = 2) { + return super.get(key, touch); + } + peek(key) { + return super.get( + key, + 0 + /* Touch.None */ + ); + } + set(key, value) { + super.set( + key, + value, + 2 + /* Touch.AsNew */ + ); + return this; + } + checkTrim() { + if (this.size > this._limit) { + this.trim(Math.round(this._limit * this._ratio)); + } + } + }; + LRUCache = class extends Cache { + constructor(limit, ratio = 1) { + super(limit, ratio); + } + trim(newSize) { + this.trimOld(newSize); + } + set(key, value) { + super.set(key, value); + this.checkTrim(); + return this; + } + }; + BidirectionalMap = class { + constructor(entries2) { + this._m1 = /* @__PURE__ */ new Map(); + this._m2 = /* @__PURE__ */ new Map(); + if (entries2) { + for (const [key, value] of entries2) { + this.set(key, value); + } + } + } + clear() { + this._m1.clear(); + this._m2.clear(); + } + set(key, value) { + this._m1.set(key, value); + this._m2.set(value, key); + } + get(key) { + return this._m1.get(key); + } + getKey(value) { + return this._m2.get(value); + } + delete(key) { + const value = this._m1.get(key); + if (value === void 0) { + return false; + } + this._m1.delete(key); + this._m2.delete(value); + return true; + } + keys() { + return this._m1.keys(); + } + values() { + return this._m1.values(); + } + }; + SetMap = class { + constructor() { + this.map = /* @__PURE__ */ new Map(); + } + add(key, value) { + let values2 = this.map.get(key); + if (!values2) { + values2 = /* @__PURE__ */ new Set(); + this.map.set(key, values2); + } + values2.add(value); + } + delete(key, value) { + const values2 = this.map.get(key); + if (!values2) { + return; + } + values2.delete(value); + if (values2.size === 0) { + this.map.delete(key); + } + } + forEach(key, fn) { + const values2 = this.map.get(key); + if (!values2) { + return; + } + values2.forEach(fn); + } + get(key) { + const values2 = this.map.get(key); + if (!values2) { + return /* @__PURE__ */ new Set(); + } + return values2; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/wordCharacterClassifier.js +function getMapForWordSeparators(wordSeparators2, intlSegmenterLocales) { + const key = `${wordSeparators2}/${intlSegmenterLocales.join(",")}`; + let result = wordClassifierCache.get(key); + if (!result) { + result = new WordCharacterClassifier(wordSeparators2, intlSegmenterLocales); + wordClassifierCache.set(key, result); + } + return result; +} +var WordCharacterClassifier, wordClassifierCache; +var init_wordCharacterClassifier = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/wordCharacterClassifier.js"() { + init_map(); + init_characterClassifier(); + WordCharacterClassifier = class extends CharacterClassifier { + constructor(wordSeparators2, intlSegmenterLocales) { + super( + 0 + /* WordCharacterClass.Regular */ + ); + this._segmenter = null; + this._cachedLine = null; + this._cachedSegments = []; + this.intlSegmenterLocales = intlSegmenterLocales; + if (this.intlSegmenterLocales.length > 0) { + this._segmenter = new Intl.Segmenter(this.intlSegmenterLocales, { granularity: "word" }); + } else { + this._segmenter = null; + } + for (let i = 0, len = wordSeparators2.length; i < len; i++) { + this.set( + wordSeparators2.charCodeAt(i), + 2 + /* WordCharacterClass.WordSeparator */ + ); + } + this.set( + 32, + 1 + /* WordCharacterClass.Whitespace */ + ); + this.set( + 9, + 1 + /* WordCharacterClass.Whitespace */ + ); + } + findPrevIntlWordBeforeOrAtOffset(line, offset) { + let candidate = null; + for (const segment of this._getIntlSegmenterWordsOnLine(line)) { + if (segment.index > offset) { + break; + } + candidate = segment; + } + return candidate; + } + findNextIntlWordAtOrAfterOffset(lineContent, offset) { + for (const segment of this._getIntlSegmenterWordsOnLine(lineContent)) { + if (segment.index < offset) { + continue; + } + return segment; + } + return null; + } + _getIntlSegmenterWordsOnLine(line) { + if (!this._segmenter) { + return []; + } + if (this._cachedLine === line) { + return this._cachedSegments; + } + this._cachedLine = line; + this._cachedSegments = this._filterWordSegments(this._segmenter.segment(line)); + return this._cachedSegments; + } + _filterWordSegments(segments) { + const result = []; + for (const segment of segments) { + if (this._isWordLike(segment)) { + result.push(segment); + } + } + return result; + } + _isWordLike(segment) { + if (segment.isWordLike) { + return true; + } + return false; + } + }; + wordClassifierCache = new LRUCache(10); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model.js +function isITextSnapshot(obj) { + return obj && typeof obj.read === "function"; +} +function shouldSynchronizeModel(model) { + return !model.isTooLargeForSyncing() && !model.isForSimpleWidget; +} +var OverviewRulerLane2, GlyphMarginLane2, InjectedTextCursorStops2, TextModelResolvedOptions, FindMatch, ValidAnnotatedEditOperation, SearchData, ApplyEditsResult; +var init_model2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model.js"() { + init_objects(); + (function(OverviewRulerLane3) { + OverviewRulerLane3[OverviewRulerLane3["Left"] = 1] = "Left"; + OverviewRulerLane3[OverviewRulerLane3["Center"] = 2] = "Center"; + OverviewRulerLane3[OverviewRulerLane3["Right"] = 4] = "Right"; + OverviewRulerLane3[OverviewRulerLane3["Full"] = 7] = "Full"; + })(OverviewRulerLane2 || (OverviewRulerLane2 = {})); + (function(GlyphMarginLane3) { + GlyphMarginLane3[GlyphMarginLane3["Left"] = 1] = "Left"; + GlyphMarginLane3[GlyphMarginLane3["Center"] = 2] = "Center"; + GlyphMarginLane3[GlyphMarginLane3["Right"] = 3] = "Right"; + })(GlyphMarginLane2 || (GlyphMarginLane2 = {})); + (function(InjectedTextCursorStops3) { + InjectedTextCursorStops3[InjectedTextCursorStops3["Both"] = 0] = "Both"; + InjectedTextCursorStops3[InjectedTextCursorStops3["Right"] = 1] = "Right"; + InjectedTextCursorStops3[InjectedTextCursorStops3["Left"] = 2] = "Left"; + InjectedTextCursorStops3[InjectedTextCursorStops3["None"] = 3] = "None"; + })(InjectedTextCursorStops2 || (InjectedTextCursorStops2 = {})); + TextModelResolvedOptions = class { + get originalIndentSize() { + return this._indentSizeIsTabSize ? "tabSize" : this.indentSize; + } + /** + * @internal + */ + constructor(src) { + this._textModelResolvedOptionsBrand = void 0; + this.tabSize = Math.max(1, src.tabSize | 0); + if (src.indentSize === "tabSize") { + this.indentSize = this.tabSize; + this._indentSizeIsTabSize = true; + } else { + this.indentSize = Math.max(1, src.indentSize | 0); + this._indentSizeIsTabSize = false; + } + this.insertSpaces = Boolean(src.insertSpaces); + this.defaultEOL = src.defaultEOL | 0; + this.trimAutoWhitespace = Boolean(src.trimAutoWhitespace); + this.bracketPairColorizationOptions = src.bracketPairColorizationOptions; + } + /** + * @internal + */ + equals(other) { + return this.tabSize === other.tabSize && this._indentSizeIsTabSize === other._indentSizeIsTabSize && this.indentSize === other.indentSize && this.insertSpaces === other.insertSpaces && this.defaultEOL === other.defaultEOL && this.trimAutoWhitespace === other.trimAutoWhitespace && equals2(this.bracketPairColorizationOptions, other.bracketPairColorizationOptions); + } + /** + * @internal + */ + createChangeEvent(newOpts) { + return { + tabSize: this.tabSize !== newOpts.tabSize, + indentSize: this.indentSize !== newOpts.indentSize, + insertSpaces: this.insertSpaces !== newOpts.insertSpaces, + trimAutoWhitespace: this.trimAutoWhitespace !== newOpts.trimAutoWhitespace + }; + } + }; + FindMatch = class { + /** + * @internal + */ + constructor(range2, matches2) { + this._findMatchBrand = void 0; + this.range = range2; + this.matches = matches2; + } + }; + ValidAnnotatedEditOperation = class { + constructor(identifier3, range2, text2, forceMoveMarkers, isAutoWhitespaceEdit, _isTracked) { + this.identifier = identifier3; + this.range = range2; + this.text = text2; + this.forceMoveMarkers = forceMoveMarkers; + this.isAutoWhitespaceEdit = isAutoWhitespaceEdit; + this._isTracked = _isTracked; + } + }; + SearchData = class { + constructor(regex, wordSeparators2, simpleSearch) { + this.regex = regex; + this.wordSeparators = wordSeparators2; + this.simpleSearch = simpleSearch; + } + }; + ApplyEditsResult = class { + constructor(reverseEdits, changes, trimAutoWhitespaceLineNumbers) { + this.reverseEdits = reverseEdits; + this.changes = changes; + this.trimAutoWhitespaceLineNumbers = trimAutoWhitespaceLineNumbers; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/textModelSearch.js +function isMultilineRegexSource(searchString) { + if (!searchString || searchString.length === 0) { + return false; + } + for (let i = 0, len = searchString.length; i < len; i++) { + const chCode = searchString.charCodeAt(i); + if (chCode === 10) { + return true; + } + if (chCode === 92) { + i++; + if (i >= len) { + break; + } + const nextChCode = searchString.charCodeAt(i); + if (nextChCode === 110 || nextChCode === 114 || nextChCode === 87) { + return true; + } + } + } + return false; +} +function createFindMatch(range2, rawMatches, captureMatches) { + if (!captureMatches) { + return new FindMatch(range2, null); + } + const matches2 = []; + for (let i = 0, len = rawMatches.length; i < len; i++) { + matches2[i] = rawMatches[i]; + } + return new FindMatch(range2, matches2); +} +function leftIsWordBounday(wordSeparators2, text2, textLength, matchStartIndex, matchLength) { + if (matchStartIndex === 0) { + return true; + } + const charBefore = text2.charCodeAt(matchStartIndex - 1); + if (wordSeparators2.get(charBefore) !== 0) { + return true; + } + if (charBefore === 13 || charBefore === 10) { + return true; + } + if (matchLength > 0) { + const firstCharInMatch = text2.charCodeAt(matchStartIndex); + if (wordSeparators2.get(firstCharInMatch) !== 0) { + return true; + } + } + return false; +} +function rightIsWordBounday(wordSeparators2, text2, textLength, matchStartIndex, matchLength) { + if (matchStartIndex + matchLength === textLength) { + return true; + } + const charAfter = text2.charCodeAt(matchStartIndex + matchLength); + if (wordSeparators2.get(charAfter) !== 0) { + return true; + } + if (charAfter === 13 || charAfter === 10) { + return true; + } + if (matchLength > 0) { + const lastCharInMatch = text2.charCodeAt(matchStartIndex + matchLength - 1); + if (wordSeparators2.get(lastCharInMatch) !== 0) { + return true; + } + } + return false; +} +function isValidMatch(wordSeparators2, text2, textLength, matchStartIndex, matchLength) { + return leftIsWordBounday(wordSeparators2, text2, textLength, matchStartIndex, matchLength) && rightIsWordBounday(wordSeparators2, text2, textLength, matchStartIndex, matchLength); +} +var LIMIT_FIND_COUNT, SearchParams, LineFeedCounter, TextModelSearch, Searcher; +var init_textModelSearch = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/textModelSearch.js"() { + init_strings(); + init_wordCharacterClassifier(); + init_position(); + init_range(); + init_model2(); + LIMIT_FIND_COUNT = 999; + SearchParams = class { + constructor(searchString, isRegex, matchCase, wordSeparators2) { + this.searchString = searchString; + this.isRegex = isRegex; + this.matchCase = matchCase; + this.wordSeparators = wordSeparators2; + } + parseSearchRequest() { + if (this.searchString === "") { + return null; + } + let multiline; + if (this.isRegex) { + multiline = isMultilineRegexSource(this.searchString); + } else { + multiline = this.searchString.indexOf("\n") >= 0; + } + let regex = null; + try { + regex = createRegExp(this.searchString, this.isRegex, { + matchCase: this.matchCase, + wholeWord: false, + multiline, + global: true, + unicode: true + }); + } catch (err) { + return null; + } + if (!regex) { + return null; + } + let canUseSimpleSearch = !this.isRegex && !multiline; + if (canUseSimpleSearch && this.searchString.toLowerCase() !== this.searchString.toUpperCase()) { + canUseSimpleSearch = this.matchCase; + } + return new SearchData(regex, this.wordSeparators ? getMapForWordSeparators(this.wordSeparators, []) : null, canUseSimpleSearch ? this.searchString : null); + } + }; + LineFeedCounter = class { + constructor(text2) { + const lineFeedsOffsets = []; + let lineFeedsOffsetsLen = 0; + for (let i = 0, textLen = text2.length; i < textLen; i++) { + if (text2.charCodeAt(i) === 10) { + lineFeedsOffsets[lineFeedsOffsetsLen++] = i; + } + } + this._lineFeedsOffsets = lineFeedsOffsets; + } + findLineFeedCountBeforeOffset(offset) { + const lineFeedsOffsets = this._lineFeedsOffsets; + let min = 0; + let max = lineFeedsOffsets.length - 1; + if (max === -1) { + return 0; + } + if (offset <= lineFeedsOffsets[0]) { + return 0; + } + while (min < max) { + const mid = min + ((max - min) / 2 >> 0); + if (lineFeedsOffsets[mid] >= offset) { + max = mid - 1; + } else { + if (lineFeedsOffsets[mid + 1] >= offset) { + min = mid; + max = mid; + } else { + min = mid + 1; + } + } + } + return min + 1; + } + }; + TextModelSearch = class { + static findMatches(model, searchParams, searchRange, captureMatches, limitResultCount) { + const searchData = searchParams.parseSearchRequest(); + if (!searchData) { + return []; + } + if (searchData.regex.multiline) { + return this._doFindMatchesMultiline(model, searchRange, new Searcher(searchData.wordSeparators, searchData.regex), captureMatches, limitResultCount); + } + return this._doFindMatchesLineByLine(model, searchRange, searchData, captureMatches, limitResultCount); + } + /** + * Multiline search always executes on the lines concatenated with \n. + * We must therefore compensate for the count of \n in case the model is CRLF + */ + static _getMultilineMatchRange(model, deltaOffset, text2, lfCounter, matchIndex, match0) { + let startOffset; + let lineFeedCountBeforeMatch = 0; + if (lfCounter) { + lineFeedCountBeforeMatch = lfCounter.findLineFeedCountBeforeOffset(matchIndex); + startOffset = deltaOffset + matchIndex + lineFeedCountBeforeMatch; + } else { + startOffset = deltaOffset + matchIndex; + } + let endOffset; + if (lfCounter) { + const lineFeedCountBeforeEndOfMatch = lfCounter.findLineFeedCountBeforeOffset(matchIndex + match0.length); + const lineFeedCountInMatch = lineFeedCountBeforeEndOfMatch - lineFeedCountBeforeMatch; + endOffset = startOffset + match0.length + lineFeedCountInMatch; + } else { + endOffset = startOffset + match0.length; + } + const startPosition = model.getPositionAt(startOffset); + const endPosition = model.getPositionAt(endOffset); + return new Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column); + } + static _doFindMatchesMultiline(model, searchRange, searcher, captureMatches, limitResultCount) { + const deltaOffset = model.getOffsetAt(searchRange.getStartPosition()); + const text2 = model.getValueInRange( + searchRange, + 1 + /* EndOfLinePreference.LF */ + ); + const lfCounter = model.getEOL() === "\r\n" ? new LineFeedCounter(text2) : null; + const result = []; + let counter = 0; + let m; + searcher.reset(0); + while (m = searcher.next(text2)) { + result[counter++] = createFindMatch(this._getMultilineMatchRange(model, deltaOffset, text2, lfCounter, m.index, m[0]), m, captureMatches); + if (counter >= limitResultCount) { + return result; + } + } + return result; + } + static _doFindMatchesLineByLine(model, searchRange, searchData, captureMatches, limitResultCount) { + const result = []; + let resultLen = 0; + if (searchRange.startLineNumber === searchRange.endLineNumber) { + const text3 = model.getLineContent(searchRange.startLineNumber).substring(searchRange.startColumn - 1, searchRange.endColumn - 1); + resultLen = this._findMatchesInLine(searchData, text3, searchRange.startLineNumber, searchRange.startColumn - 1, resultLen, result, captureMatches, limitResultCount); + return result; + } + const text2 = model.getLineContent(searchRange.startLineNumber).substring(searchRange.startColumn - 1); + resultLen = this._findMatchesInLine(searchData, text2, searchRange.startLineNumber, searchRange.startColumn - 1, resultLen, result, captureMatches, limitResultCount); + for (let lineNumber = searchRange.startLineNumber + 1; lineNumber < searchRange.endLineNumber && resultLen < limitResultCount; lineNumber++) { + resultLen = this._findMatchesInLine(searchData, model.getLineContent(lineNumber), lineNumber, 0, resultLen, result, captureMatches, limitResultCount); + } + if (resultLen < limitResultCount) { + const text3 = model.getLineContent(searchRange.endLineNumber).substring(0, searchRange.endColumn - 1); + resultLen = this._findMatchesInLine(searchData, text3, searchRange.endLineNumber, 0, resultLen, result, captureMatches, limitResultCount); + } + return result; + } + static _findMatchesInLine(searchData, text2, lineNumber, deltaOffset, resultLen, result, captureMatches, limitResultCount) { + const wordSeparators2 = searchData.wordSeparators; + if (!captureMatches && searchData.simpleSearch) { + const searchString = searchData.simpleSearch; + const searchStringLen = searchString.length; + const textLength = text2.length; + let lastMatchIndex = -searchStringLen; + while ((lastMatchIndex = text2.indexOf(searchString, lastMatchIndex + searchStringLen)) !== -1) { + if (!wordSeparators2 || isValidMatch(wordSeparators2, text2, textLength, lastMatchIndex, searchStringLen)) { + result[resultLen++] = new FindMatch(new Range(lineNumber, lastMatchIndex + 1 + deltaOffset, lineNumber, lastMatchIndex + 1 + searchStringLen + deltaOffset), null); + if (resultLen >= limitResultCount) { + return resultLen; + } + } + } + return resultLen; + } + const searcher = new Searcher(searchData.wordSeparators, searchData.regex); + let m; + searcher.reset(0); + do { + m = searcher.next(text2); + if (m) { + result[resultLen++] = createFindMatch(new Range(lineNumber, m.index + 1 + deltaOffset, lineNumber, m.index + 1 + m[0].length + deltaOffset), m, captureMatches); + if (resultLen >= limitResultCount) { + return resultLen; + } + } + } while (m); + return resultLen; + } + static findNextMatch(model, searchParams, searchStart, captureMatches) { + const searchData = searchParams.parseSearchRequest(); + if (!searchData) { + return null; + } + const searcher = new Searcher(searchData.wordSeparators, searchData.regex); + if (searchData.regex.multiline) { + return this._doFindNextMatchMultiline(model, searchStart, searcher, captureMatches); + } + return this._doFindNextMatchLineByLine(model, searchStart, searcher, captureMatches); + } + static _doFindNextMatchMultiline(model, searchStart, searcher, captureMatches) { + const searchTextStart = new Position(searchStart.lineNumber, 1); + const deltaOffset = model.getOffsetAt(searchTextStart); + const lineCount = model.getLineCount(); + const text2 = model.getValueInRange( + new Range(searchTextStart.lineNumber, searchTextStart.column, lineCount, model.getLineMaxColumn(lineCount)), + 1 + /* EndOfLinePreference.LF */ + ); + const lfCounter = model.getEOL() === "\r\n" ? new LineFeedCounter(text2) : null; + searcher.reset(searchStart.column - 1); + const m = searcher.next(text2); + if (m) { + return createFindMatch(this._getMultilineMatchRange(model, deltaOffset, text2, lfCounter, m.index, m[0]), m, captureMatches); + } + if (searchStart.lineNumber !== 1 || searchStart.column !== 1) { + return this._doFindNextMatchMultiline(model, new Position(1, 1), searcher, captureMatches); + } + return null; + } + static _doFindNextMatchLineByLine(model, searchStart, searcher, captureMatches) { + const lineCount = model.getLineCount(); + const startLineNumber = searchStart.lineNumber; + const text2 = model.getLineContent(startLineNumber); + const r = this._findFirstMatchInLine(searcher, text2, startLineNumber, searchStart.column, captureMatches); + if (r) { + return r; + } + for (let i = 1; i <= lineCount; i++) { + const lineIndex = (startLineNumber + i - 1) % lineCount; + const text3 = model.getLineContent(lineIndex + 1); + const r2 = this._findFirstMatchInLine(searcher, text3, lineIndex + 1, 1, captureMatches); + if (r2) { + return r2; + } + } + return null; + } + static _findFirstMatchInLine(searcher, text2, lineNumber, fromColumn, captureMatches) { + searcher.reset(fromColumn - 1); + const m = searcher.next(text2); + if (m) { + return createFindMatch(new Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length), m, captureMatches); + } + return null; + } + static findPreviousMatch(model, searchParams, searchStart, captureMatches) { + const searchData = searchParams.parseSearchRequest(); + if (!searchData) { + return null; + } + const searcher = new Searcher(searchData.wordSeparators, searchData.regex); + if (searchData.regex.multiline) { + return this._doFindPreviousMatchMultiline(model, searchStart, searcher, captureMatches); + } + return this._doFindPreviousMatchLineByLine(model, searchStart, searcher, captureMatches); + } + static _doFindPreviousMatchMultiline(model, searchStart, searcher, captureMatches) { + const matches2 = this._doFindMatchesMultiline(model, new Range(1, 1, searchStart.lineNumber, searchStart.column), searcher, captureMatches, 10 * LIMIT_FIND_COUNT); + if (matches2.length > 0) { + return matches2[matches2.length - 1]; + } + const lineCount = model.getLineCount(); + if (searchStart.lineNumber !== lineCount || searchStart.column !== model.getLineMaxColumn(lineCount)) { + return this._doFindPreviousMatchMultiline(model, new Position(lineCount, model.getLineMaxColumn(lineCount)), searcher, captureMatches); + } + return null; + } + static _doFindPreviousMatchLineByLine(model, searchStart, searcher, captureMatches) { + const lineCount = model.getLineCount(); + const startLineNumber = searchStart.lineNumber; + const text2 = model.getLineContent(startLineNumber).substring(0, searchStart.column - 1); + const r = this._findLastMatchInLine(searcher, text2, startLineNumber, captureMatches); + if (r) { + return r; + } + for (let i = 1; i <= lineCount; i++) { + const lineIndex = (lineCount + startLineNumber - i - 1) % lineCount; + const text3 = model.getLineContent(lineIndex + 1); + const r2 = this._findLastMatchInLine(searcher, text3, lineIndex + 1, captureMatches); + if (r2) { + return r2; + } + } + return null; + } + static _findLastMatchInLine(searcher, text2, lineNumber, captureMatches) { + let bestResult = null; + let m; + searcher.reset(0); + while (m = searcher.next(text2)) { + bestResult = createFindMatch(new Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length), m, captureMatches); + } + return bestResult; + } + }; + Searcher = class { + constructor(wordSeparators2, searchRegex) { + this._wordSeparators = wordSeparators2; + this._searchRegex = searchRegex; + this._prevMatchStartIndex = -1; + this._prevMatchLength = 0; + } + reset(lastIndex) { + this._searchRegex.lastIndex = lastIndex; + this._prevMatchStartIndex = -1; + this._prevMatchLength = 0; + } + next(text2) { + const textLength = text2.length; + let m; + do { + if (this._prevMatchStartIndex + this._prevMatchLength === textLength) { + return null; + } + m = this._searchRegex.exec(text2); + if (!m) { + return null; + } + const matchStartIndex = m.index; + const matchLength = m[0].length; + if (matchStartIndex === this._prevMatchStartIndex && matchLength === this._prevMatchLength) { + if (matchLength === 0) { + if (getNextCodePoint(text2, textLength, this._searchRegex.lastIndex) > 65535) { + this._searchRegex.lastIndex += 2; + } else { + this._searchRegex.lastIndex += 1; + } + continue; + } + return null; + } + this._prevMatchStartIndex = matchStartIndex; + this._prevMatchLength = matchLength; + if (!this._wordSeparators || isValidMatch(this._wordSeparators, text2, textLength, matchStartIndex, matchLength)) { + return m; + } + } while (m); + return null; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/unicodeTextModelHighlighter.js +function buildRegExpCharClassExpr(codePoints, flags) { + const src = `[${escapeRegExpCharacters(codePoints.map((i) => String.fromCodePoint(i)).join(""))}]`; + return src; +} +function isAllowedInvisibleCharacter(character) { + return character === " " || character === "\n" || character === " "; +} +var UnicodeTextModelHighlighter, CodePointHighlighter; +var init_unicodeTextModelHighlighter = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/unicodeTextModelHighlighter.js"() { + init_range(); + init_textModelSearch(); + init_strings(); + init_assert(); + init_wordHelper(); + UnicodeTextModelHighlighter = class { + static computeUnicodeHighlights(model, options2, range2) { + const startLine = range2 ? range2.startLineNumber : 1; + const endLine = range2 ? range2.endLineNumber : model.getLineCount(); + const codePointHighlighter = new CodePointHighlighter(options2); + const candidates = codePointHighlighter.getCandidateCodePoints(); + let regex; + if (candidates === "allNonBasicAscii") { + regex = new RegExp("[^\\t\\n\\r\\x20-\\x7E]", "g"); + } else { + regex = new RegExp(`${buildRegExpCharClassExpr(Array.from(candidates))}`, "g"); + } + const searcher = new Searcher(null, regex); + const ranges = []; + let hasMore = false; + let m; + let ambiguousCharacterCount = 0; + let invisibleCharacterCount = 0; + let nonBasicAsciiCharacterCount = 0; + forLoop: for (let lineNumber = startLine, lineCount = endLine; lineNumber <= lineCount; lineNumber++) { + const lineContent = model.getLineContent(lineNumber); + const lineLength = lineContent.length; + searcher.reset(0); + do { + m = searcher.next(lineContent); + if (m) { + let startIndex = m.index; + let endIndex = m.index + m[0].length; + if (startIndex > 0) { + const charCodeBefore = lineContent.charCodeAt(startIndex - 1); + if (isHighSurrogate(charCodeBefore)) { + startIndex--; + } + } + if (endIndex + 1 < lineLength) { + const charCodeBefore = lineContent.charCodeAt(endIndex - 1); + if (isHighSurrogate(charCodeBefore)) { + endIndex++; + } + } + const str = lineContent.substring(startIndex, endIndex); + let word = getWordAtText(startIndex + 1, DEFAULT_WORD_REGEXP, lineContent, 0); + if (word && word.endColumn <= startIndex + 1) { + word = null; + } + const highlightReason = codePointHighlighter.shouldHighlightNonBasicASCII(str, word ? word.word : null); + if (highlightReason !== 0) { + if (highlightReason === 3) { + ambiguousCharacterCount++; + } else if (highlightReason === 2) { + invisibleCharacterCount++; + } else if (highlightReason === 1) { + nonBasicAsciiCharacterCount++; + } else { + assertNever(highlightReason); + } + const MAX_RESULT_LENGTH = 1e3; + if (ranges.length >= MAX_RESULT_LENGTH) { + hasMore = true; + break forLoop; + } + ranges.push(new Range(lineNumber, startIndex + 1, lineNumber, endIndex + 1)); + } + } + } while (m); + } + return { + ranges, + hasMore, + ambiguousCharacterCount, + invisibleCharacterCount, + nonBasicAsciiCharacterCount + }; + } + static computeUnicodeHighlightReason(char, options2) { + const codePointHighlighter = new CodePointHighlighter(options2); + const reason = codePointHighlighter.shouldHighlightNonBasicASCII(char, null); + switch (reason) { + case 0: + return null; + case 2: + return { + kind: 1 + /* UnicodeHighlighterReasonKind.Invisible */ + }; + case 3: { + const codePoint = char.codePointAt(0); + const primaryConfusable = codePointHighlighter.ambiguousCharacters.getPrimaryConfusable(codePoint); + const notAmbiguousInLocales = AmbiguousCharacters.getLocales().filter((l) => !AmbiguousCharacters.getInstance(/* @__PURE__ */ new Set([...options2.allowedLocales, l])).isAmbiguous(codePoint)); + return { kind: 0, confusableWith: String.fromCodePoint(primaryConfusable), notAmbiguousInLocales }; + } + case 1: + return { + kind: 2 + /* UnicodeHighlighterReasonKind.NonBasicAscii */ + }; + } + } + }; + CodePointHighlighter = class { + constructor(options2) { + this.options = options2; + this.allowedCodePoints = new Set(options2.allowedCodePoints); + this.ambiguousCharacters = AmbiguousCharacters.getInstance(new Set(options2.allowedLocales)); + } + getCandidateCodePoints() { + if (this.options.nonBasicASCII) { + return "allNonBasicAscii"; + } + const set = /* @__PURE__ */ new Set(); + if (this.options.invisibleCharacters) { + for (const cp of InvisibleCharacters.codePoints) { + if (!isAllowedInvisibleCharacter(String.fromCodePoint(cp))) { + set.add(cp); + } + } + } + if (this.options.ambiguousCharacters) { + for (const cp of this.ambiguousCharacters.getConfusableCodePoints()) { + set.add(cp); + } + } + for (const cp of this.allowedCodePoints) { + set.delete(cp); + } + return set; + } + shouldHighlightNonBasicASCII(character, wordContext) { + const codePoint = character.codePointAt(0); + if (this.allowedCodePoints.has(codePoint)) { + return 0; + } + if (this.options.nonBasicASCII) { + return 1; + } + let hasBasicASCIICharacters = false; + let hasNonConfusableNonBasicAsciiCharacter = false; + if (wordContext) { + for (const char of wordContext) { + const codePoint2 = char.codePointAt(0); + const isBasicASCII2 = isBasicASCII(char); + hasBasicASCIICharacters = hasBasicASCIICharacters || isBasicASCII2; + if (!isBasicASCII2 && !this.ambiguousCharacters.isAmbiguous(codePoint2) && !InvisibleCharacters.isInvisibleCharacter(codePoint2)) { + hasNonConfusableNonBasicAsciiCharacter = true; + } + } + } + if ( + /* Don't allow mixing weird looking characters with ASCII */ + !hasBasicASCIICharacters && /* Is there an obviously weird looking character? */ + hasNonConfusableNonBasicAsciiCharacter + ) { + return 0; + } + if (this.options.invisibleCharacters) { + if (!isAllowedInvisibleCharacter(character) && InvisibleCharacters.isInvisibleCharacter(codePoint)) { + return 2; + } + } + if (this.options.ambiguousCharacters) { + if (this.ambiguousCharacters.isAmbiguous(codePoint)) { + return 3; + } + } + return 0; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/diff/linesDiffComputer.js +var LinesDiff, MovedText; +var init_linesDiffComputer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/diff/linesDiffComputer.js"() { + LinesDiff = class { + constructor(changes, moves, hitTimeout) { + this.changes = changes; + this.moves = moves; + this.hitTimeout = hitTimeout; + } + }; + MovedText = class { + constructor(lineRangeMapping, changes) { + this.lineRangeMapping = lineRangeMapping; + this.changes = changes; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/offsetRange.js +var OffsetRange, OffsetRangeSet; +var init_offsetRange = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/offsetRange.js"() { + init_errors(); + OffsetRange = class _OffsetRange { + static addRange(range2, sortedRanges) { + let i = 0; + while (i < sortedRanges.length && sortedRanges[i].endExclusive < range2.start) { + i++; + } + let j = i; + while (j < sortedRanges.length && sortedRanges[j].start <= range2.endExclusive) { + j++; + } + if (i === j) { + sortedRanges.splice(i, 0, range2); + } else { + const start = Math.min(range2.start, sortedRanges[i].start); + const end = Math.max(range2.endExclusive, sortedRanges[j - 1].endExclusive); + sortedRanges.splice(i, j - i, new _OffsetRange(start, end)); + } + } + static tryCreate(start, endExclusive) { + if (start > endExclusive) { + return void 0; + } + return new _OffsetRange(start, endExclusive); + } + static ofLength(length) { + return new _OffsetRange(0, length); + } + static ofStartAndLength(start, length) { + return new _OffsetRange(start, start + length); + } + constructor(start, endExclusive) { + this.start = start; + this.endExclusive = endExclusive; + if (start > endExclusive) { + throw new BugIndicatingError(`Invalid range: ${this.toString()}`); + } + } + get isEmpty() { + return this.start === this.endExclusive; + } + delta(offset) { + return new _OffsetRange(this.start + offset, this.endExclusive + offset); + } + deltaStart(offset) { + return new _OffsetRange(this.start + offset, this.endExclusive); + } + deltaEnd(offset) { + return new _OffsetRange(this.start, this.endExclusive + offset); + } + get length() { + return this.endExclusive - this.start; + } + toString() { + return `[${this.start}, ${this.endExclusive})`; + } + contains(offset) { + return this.start <= offset && offset < this.endExclusive; + } + /** + * for all numbers n: range1.contains(n) or range2.contains(n) => range1.join(range2).contains(n) + * The joined range is the smallest range that contains both ranges. + */ + join(other) { + return new _OffsetRange(Math.min(this.start, other.start), Math.max(this.endExclusive, other.endExclusive)); + } + /** + * for all numbers n: range1.contains(n) and range2.contains(n) <=> range1.intersect(range2).contains(n) + * + * The resulting range is empty if the ranges do not intersect, but touch. + * If the ranges don't even touch, the result is undefined. + */ + intersect(other) { + const start = Math.max(this.start, other.start); + const end = Math.min(this.endExclusive, other.endExclusive); + if (start <= end) { + return new _OffsetRange(start, end); + } + return void 0; + } + intersects(other) { + const start = Math.max(this.start, other.start); + const end = Math.min(this.endExclusive, other.endExclusive); + return start < end; + } + isBefore(other) { + return this.endExclusive <= other.start; + } + isAfter(other) { + return this.start >= other.endExclusive; + } + slice(arr) { + return arr.slice(this.start, this.endExclusive); + } + substring(str) { + return str.substring(this.start, this.endExclusive); + } + /** + * Returns the given value if it is contained in this instance, otherwise the closest value that is contained. + * The range must not be empty. + */ + clip(value) { + if (this.isEmpty) { + throw new BugIndicatingError(`Invalid clipping range: ${this.toString()}`); + } + return Math.max(this.start, Math.min(this.endExclusive - 1, value)); + } + /** + * Returns `r := value + k * length` such that `r` is contained in this range. + * The range must not be empty. + * + * E.g. `[5, 10).clipCyclic(10) === 5`, `[5, 10).clipCyclic(11) === 6` and `[5, 10).clipCyclic(4) === 9`. + */ + clipCyclic(value) { + if (this.isEmpty) { + throw new BugIndicatingError(`Invalid clipping range: ${this.toString()}`); + } + if (value < this.start) { + return this.endExclusive - (this.start - value) % this.length; + } + if (value >= this.endExclusive) { + return this.start + (value - this.start) % this.length; + } + return value; + } + forEach(f3) { + for (let i = this.start; i < this.endExclusive; i++) { + f3(i); + } + } + }; + OffsetRangeSet = class _OffsetRangeSet { + constructor() { + this._sortedRanges = []; + } + addRange(range2) { + let i = 0; + while (i < this._sortedRanges.length && this._sortedRanges[i].endExclusive < range2.start) { + i++; + } + let j = i; + while (j < this._sortedRanges.length && this._sortedRanges[j].start <= range2.endExclusive) { + j++; + } + if (i === j) { + this._sortedRanges.splice(i, 0, range2); + } else { + const start = Math.min(range2.start, this._sortedRanges[i].start); + const end = Math.max(range2.endExclusive, this._sortedRanges[j - 1].endExclusive); + this._sortedRanges.splice(i, j - i, new OffsetRange(start, end)); + } + } + toString() { + return this._sortedRanges.map((r) => r.toString()).join(", "); + } + /** + * Returns of there is a value that is contained in this instance and the given range. + */ + intersectsStrict(other) { + let i = 0; + while (i < this._sortedRanges.length && this._sortedRanges[i].endExclusive <= other.start) { + i++; + } + return i < this._sortedRanges.length && this._sortedRanges[i].start < other.endExclusive; + } + intersectWithRange(other) { + const result = new _OffsetRangeSet(); + for (const range2 of this._sortedRanges) { + const intersection2 = range2.intersect(other); + if (intersection2) { + result.addRange(intersection2); + } + } + return result; + } + intersectWithRangeLength(other) { + return this.intersectWithRange(other).length; + } + get length() { + return this._sortedRanges.reduce((prev, cur) => prev + cur.length, 0); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/arraysFind.js +function findLast(array2, predicate) { + const idx = findLastIdx(array2, predicate); + if (idx === -1) { + return void 0; + } + return array2[idx]; +} +function findLastIdx(array2, predicate, fromIndex = array2.length - 1) { + for (let i = fromIndex; i >= 0; i--) { + const element = array2[i]; + if (predicate(element)) { + return i; + } + } + return -1; +} +function findLastMonotonous(array2, predicate) { + const idx = findLastIdxMonotonous(array2, predicate); + return idx === -1 ? void 0 : array2[idx]; +} +function findLastIdxMonotonous(array2, predicate, startIdx = 0, endIdxEx = array2.length) { + let i = startIdx; + let j = endIdxEx; + while (i < j) { + const k = Math.floor((i + j) / 2); + if (predicate(array2[k])) { + i = k + 1; + } else { + j = k; + } + } + return i - 1; +} +function findFirstMonotonous(array2, predicate) { + const idx = findFirstIdxMonotonousOrArrLen(array2, predicate); + return idx === array2.length ? void 0 : array2[idx]; +} +function findFirstIdxMonotonousOrArrLen(array2, predicate, startIdx = 0, endIdxEx = array2.length) { + let i = startIdx; + let j = endIdxEx; + while (i < j) { + const k = Math.floor((i + j) / 2); + if (predicate(array2[k])) { + j = k; + } else { + i = k + 1; + } + } + return i; +} +function findFirstMax(array2, comparator) { + if (array2.length === 0) { + return void 0; + } + let max = array2[0]; + for (let i = 1; i < array2.length; i++) { + const item = array2[i]; + if (comparator(item, max) > 0) { + max = item; + } + } + return max; +} +function findLastMax(array2, comparator) { + if (array2.length === 0) { + return void 0; + } + let max = array2[0]; + for (let i = 1; i < array2.length; i++) { + const item = array2[i]; + if (comparator(item, max) >= 0) { + max = item; + } + } + return max; +} +function findFirstMin(array2, comparator) { + return findFirstMax(array2, (a3, b) => -comparator(a3, b)); +} +function findMaxIdx(array2, comparator) { + if (array2.length === 0) { + return -1; + } + let maxIdx = 0; + for (let i = 1; i < array2.length; i++) { + const item = array2[i]; + if (comparator(item, array2[maxIdx]) > 0) { + maxIdx = i; + } + } + return maxIdx; +} +function mapFindFirst(items, mapFn) { + for (const value of items) { + const mapped = mapFn(value); + if (mapped !== void 0) { + return mapped; + } + } + return void 0; +} +var MonotonousArray; +var init_arraysFind = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/arraysFind.js"() { + MonotonousArray = class _MonotonousArray { + constructor(_array) { + this._array = _array; + this._findLastMonotonousLastIdx = 0; + } + /** + * The predicate must be monotonous, i.e. `arr.map(predicate)` must be like `[true, ..., true, false, ..., false]`! + * For subsequent calls, current predicate must be weaker than (or equal to) the previous predicate, i.e. more entries must be `true`. + */ + findLastMonotonous(predicate) { + if (_MonotonousArray.assertInvariants) { + if (this._prevFindLastPredicate) { + for (const item of this._array) { + if (this._prevFindLastPredicate(item) && !predicate(item)) { + throw new Error("MonotonousArray: current predicate must be weaker than (or equal to) the previous predicate."); + } + } + } + this._prevFindLastPredicate = predicate; + } + const idx = findLastIdxMonotonous(this._array, predicate, this._findLastMonotonousLastIdx); + this._findLastMonotonousLastIdx = idx + 1; + return idx === -1 ? void 0 : this._array[idx]; + } + }; + MonotonousArray.assertInvariants = false; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/lineRange.js +var LineRange, LineRangeSet; +var init_lineRange = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/lineRange.js"() { + init_errors(); + init_offsetRange(); + init_range(); + init_arraysFind(); + LineRange = class _LineRange { + static fromRangeInclusive(range2) { + return new _LineRange(range2.startLineNumber, range2.endLineNumber + 1); + } + /** + * @param lineRanges An array of sorted line ranges. + */ + static joinMany(lineRanges) { + if (lineRanges.length === 0) { + return []; + } + let result = new LineRangeSet(lineRanges[0].slice()); + for (let i = 1; i < lineRanges.length; i++) { + result = result.getUnion(new LineRangeSet(lineRanges[i].slice())); + } + return result.ranges; + } + static join(lineRanges) { + if (lineRanges.length === 0) { + throw new BugIndicatingError("lineRanges cannot be empty"); + } + let startLineNumber = lineRanges[0].startLineNumber; + let endLineNumberExclusive = lineRanges[0].endLineNumberExclusive; + for (let i = 1; i < lineRanges.length; i++) { + startLineNumber = Math.min(startLineNumber, lineRanges[i].startLineNumber); + endLineNumberExclusive = Math.max(endLineNumberExclusive, lineRanges[i].endLineNumberExclusive); + } + return new _LineRange(startLineNumber, endLineNumberExclusive); + } + static ofLength(startLineNumber, length) { + return new _LineRange(startLineNumber, startLineNumber + length); + } + /** + * @internal + */ + static deserialize(lineRange) { + return new _LineRange(lineRange[0], lineRange[1]); + } + constructor(startLineNumber, endLineNumberExclusive) { + if (startLineNumber > endLineNumberExclusive) { + throw new BugIndicatingError(`startLineNumber ${startLineNumber} cannot be after endLineNumberExclusive ${endLineNumberExclusive}`); + } + this.startLineNumber = startLineNumber; + this.endLineNumberExclusive = endLineNumberExclusive; + } + /** + * Indicates if this line range contains the given line number. + */ + contains(lineNumber) { + return this.startLineNumber <= lineNumber && lineNumber < this.endLineNumberExclusive; + } + /** + * Indicates if this line range is empty. + */ + get isEmpty() { + return this.startLineNumber === this.endLineNumberExclusive; + } + /** + * Moves this line range by the given offset of line numbers. + */ + delta(offset) { + return new _LineRange(this.startLineNumber + offset, this.endLineNumberExclusive + offset); + } + deltaLength(offset) { + return new _LineRange(this.startLineNumber, this.endLineNumberExclusive + offset); + } + /** + * The number of lines this line range spans. + */ + get length() { + return this.endLineNumberExclusive - this.startLineNumber; + } + /** + * Creates a line range that combines this and the given line range. + */ + join(other) { + return new _LineRange(Math.min(this.startLineNumber, other.startLineNumber), Math.max(this.endLineNumberExclusive, other.endLineNumberExclusive)); + } + toString() { + return `[${this.startLineNumber},${this.endLineNumberExclusive})`; + } + /** + * The resulting range is empty if the ranges do not intersect, but touch. + * If the ranges don't even touch, the result is undefined. + */ + intersect(other) { + const startLineNumber = Math.max(this.startLineNumber, other.startLineNumber); + const endLineNumberExclusive = Math.min(this.endLineNumberExclusive, other.endLineNumberExclusive); + if (startLineNumber <= endLineNumberExclusive) { + return new _LineRange(startLineNumber, endLineNumberExclusive); + } + return void 0; + } + intersectsStrict(other) { + return this.startLineNumber < other.endLineNumberExclusive && other.startLineNumber < this.endLineNumberExclusive; + } + overlapOrTouch(other) { + return this.startLineNumber <= other.endLineNumberExclusive && other.startLineNumber <= this.endLineNumberExclusive; + } + equals(b) { + return this.startLineNumber === b.startLineNumber && this.endLineNumberExclusive === b.endLineNumberExclusive; + } + toInclusiveRange() { + if (this.isEmpty) { + return null; + } + return new Range(this.startLineNumber, 1, this.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER); + } + /** + * @deprecated Using this function is discouraged because it might lead to bugs: The end position is not guaranteed to be a valid position! + */ + toExclusiveRange() { + return new Range(this.startLineNumber, 1, this.endLineNumberExclusive, 1); + } + mapToLineArray(f3) { + const result = []; + for (let lineNumber = this.startLineNumber; lineNumber < this.endLineNumberExclusive; lineNumber++) { + result.push(f3(lineNumber)); + } + return result; + } + forEach(f3) { + for (let lineNumber = this.startLineNumber; lineNumber < this.endLineNumberExclusive; lineNumber++) { + f3(lineNumber); + } + } + /** + * @internal + */ + serialize() { + return [this.startLineNumber, this.endLineNumberExclusive]; + } + includes(lineNumber) { + return this.startLineNumber <= lineNumber && lineNumber < this.endLineNumberExclusive; + } + /** + * Converts this 1-based line range to a 0-based offset range (subtracts 1!). + * @internal + */ + toOffsetRange() { + return new OffsetRange(this.startLineNumber - 1, this.endLineNumberExclusive - 1); + } + }; + LineRangeSet = class _LineRangeSet { + constructor(_normalizedRanges = []) { + this._normalizedRanges = _normalizedRanges; + } + get ranges() { + return this._normalizedRanges; + } + addRange(range2) { + if (range2.length === 0) { + return; + } + const joinRangeStartIdx = findFirstIdxMonotonousOrArrLen(this._normalizedRanges, (r) => r.endLineNumberExclusive >= range2.startLineNumber); + const joinRangeEndIdxExclusive = findLastIdxMonotonous(this._normalizedRanges, (r) => r.startLineNumber <= range2.endLineNumberExclusive) + 1; + if (joinRangeStartIdx === joinRangeEndIdxExclusive) { + this._normalizedRanges.splice(joinRangeStartIdx, 0, range2); + } else if (joinRangeStartIdx === joinRangeEndIdxExclusive - 1) { + const joinRange = this._normalizedRanges[joinRangeStartIdx]; + this._normalizedRanges[joinRangeStartIdx] = joinRange.join(range2); + } else { + const joinRange = this._normalizedRanges[joinRangeStartIdx].join(this._normalizedRanges[joinRangeEndIdxExclusive - 1]).join(range2); + this._normalizedRanges.splice(joinRangeStartIdx, joinRangeEndIdxExclusive - joinRangeStartIdx, joinRange); + } + } + contains(lineNumber) { + const rangeThatStartsBeforeEnd = findLastMonotonous(this._normalizedRanges, (r) => r.startLineNumber <= lineNumber); + return !!rangeThatStartsBeforeEnd && rangeThatStartsBeforeEnd.endLineNumberExclusive > lineNumber; + } + intersects(range2) { + const rangeThatStartsBeforeEnd = findLastMonotonous(this._normalizedRanges, (r) => r.startLineNumber < range2.endLineNumberExclusive); + return !!rangeThatStartsBeforeEnd && rangeThatStartsBeforeEnd.endLineNumberExclusive > range2.startLineNumber; + } + getUnion(other) { + if (this._normalizedRanges.length === 0) { + return other; + } + if (other._normalizedRanges.length === 0) { + return this; + } + const result = []; + let i1 = 0; + let i2 = 0; + let current = null; + while (i1 < this._normalizedRanges.length || i2 < other._normalizedRanges.length) { + let next = null; + if (i1 < this._normalizedRanges.length && i2 < other._normalizedRanges.length) { + const lineRange1 = this._normalizedRanges[i1]; + const lineRange2 = other._normalizedRanges[i2]; + if (lineRange1.startLineNumber < lineRange2.startLineNumber) { + next = lineRange1; + i1++; + } else { + next = lineRange2; + i2++; + } + } else if (i1 < this._normalizedRanges.length) { + next = this._normalizedRanges[i1]; + i1++; + } else { + next = other._normalizedRanges[i2]; + i2++; + } + if (current === null) { + current = next; + } else { + if (current.endLineNumberExclusive >= next.startLineNumber) { + current = new LineRange(current.startLineNumber, Math.max(current.endLineNumberExclusive, next.endLineNumberExclusive)); + } else { + result.push(current); + current = next; + } + } + } + if (current !== null) { + result.push(current); + } + return new _LineRangeSet(result); + } + /** + * Subtracts all ranges in this set from `range` and returns the result. + */ + subtractFrom(range2) { + const joinRangeStartIdx = findFirstIdxMonotonousOrArrLen(this._normalizedRanges, (r) => r.endLineNumberExclusive >= range2.startLineNumber); + const joinRangeEndIdxExclusive = findLastIdxMonotonous(this._normalizedRanges, (r) => r.startLineNumber <= range2.endLineNumberExclusive) + 1; + if (joinRangeStartIdx === joinRangeEndIdxExclusive) { + return new _LineRangeSet([range2]); + } + const result = []; + let startLineNumber = range2.startLineNumber; + for (let i = joinRangeStartIdx; i < joinRangeEndIdxExclusive; i++) { + const r = this._normalizedRanges[i]; + if (r.startLineNumber > startLineNumber) { + result.push(new LineRange(startLineNumber, r.startLineNumber)); + } + startLineNumber = r.endLineNumberExclusive; + } + if (startLineNumber < range2.endLineNumberExclusive) { + result.push(new LineRange(startLineNumber, range2.endLineNumberExclusive)); + } + return new _LineRangeSet(result); + } + toString() { + return this._normalizedRanges.map((r) => r.toString()).join(", "); + } + getIntersection(other) { + const result = []; + let i1 = 0; + let i2 = 0; + while (i1 < this._normalizedRanges.length && i2 < other._normalizedRanges.length) { + const r1 = this._normalizedRanges[i1]; + const r2 = other._normalizedRanges[i2]; + const i = r1.intersect(r2); + if (i && !i.isEmpty) { + result.push(i); + } + if (r1.endLineNumberExclusive < r2.endLineNumberExclusive) { + i1++; + } else { + i2++; + } + } + return new _LineRangeSet(result); + } + getWithDelta(value) { + return new _LineRangeSet(this._normalizedRanges.map((r) => r.delta(value))); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/textLength.js +var TextLength; +var init_textLength = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/textLength.js"() { + init_position(); + init_range(); + TextLength = class _TextLength { + static betweenPositions(position1, position2) { + if (position1.lineNumber === position2.lineNumber) { + return new _TextLength(0, position2.column - position1.column); + } else { + return new _TextLength(position2.lineNumber - position1.lineNumber, position2.column - 1); + } + } + static ofRange(range2) { + return _TextLength.betweenPositions(range2.getStartPosition(), range2.getEndPosition()); + } + static ofText(text2) { + let line = 0; + let column = 0; + for (const c of text2) { + if (c === "\n") { + line++; + column = 0; + } else { + column++; + } + } + return new _TextLength(line, column); + } + constructor(lineCount, columnCount) { + this.lineCount = lineCount; + this.columnCount = columnCount; + } + isGreaterThanOrEqualTo(other) { + if (this.lineCount !== other.lineCount) { + return this.lineCount > other.lineCount; + } + return this.columnCount >= other.columnCount; + } + createRange(startPosition) { + if (this.lineCount === 0) { + return new Range(startPosition.lineNumber, startPosition.column, startPosition.lineNumber, startPosition.column + this.columnCount); + } else { + return new Range(startPosition.lineNumber, startPosition.column, startPosition.lineNumber + this.lineCount, this.columnCount + 1); + } + } + addToPosition(position) { + if (this.lineCount === 0) { + return new Position(position.lineNumber, position.column + this.columnCount); + } else { + return new Position(position.lineNumber + this.lineCount, this.columnCount + 1); + } + } + toString() { + return `${this.lineCount},${this.columnCount}`; + } + }; + TextLength.zero = new TextLength(0, 0); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/positionToOffset.js +var PositionOffsetTransformer; +var init_positionToOffset = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/positionToOffset.js"() { + init_offsetRange(); + init_textLength(); + PositionOffsetTransformer = class { + constructor(text2) { + this.text = text2; + this.lineStartOffsetByLineIdx = []; + this.lineStartOffsetByLineIdx.push(0); + for (let i = 0; i < text2.length; i++) { + if (text2.charAt(i) === "\n") { + this.lineStartOffsetByLineIdx.push(i + 1); + } + } + } + getOffset(position) { + return this.lineStartOffsetByLineIdx[position.lineNumber - 1] + position.column - 1; + } + getOffsetRange(range2) { + return new OffsetRange(this.getOffset(range2.getStartPosition()), this.getOffset(range2.getEndPosition())); + } + get textLength() { + const lineIdx = this.lineStartOffsetByLineIdx.length - 1; + return new TextLength(lineIdx, this.text.length - this.lineStartOffsetByLineIdx[lineIdx]); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/textEdit.js +function rangeFromPositions(start, end) { + if (start.lineNumber === end.lineNumber && start.column === Number.MAX_SAFE_INTEGER) { + return Range.fromPositions(end, end); + } else if (!start.isBeforeOrEqual(end)) { + throw new BugIndicatingError("start must be before end"); + } + return new Range(start.lineNumber, start.column, end.lineNumber, end.column); +} +var TextEdit, SingleTextEdit, AbstractText, StringText; +var init_textEdit = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/textEdit.js"() { + init_assert(); + init_errors(); + init_position(); + init_positionToOffset(); + init_range(); + init_textLength(); + TextEdit = class { + constructor(edits) { + this.edits = edits; + assertFn(() => checkAdjacentItems(edits, (a3, b) => a3.range.getEndPosition().isBeforeOrEqual(b.range.getStartPosition()))); + } + apply(text2) { + let result = ""; + let lastEditEnd = new Position(1, 1); + for (const edit of this.edits) { + const editRange = edit.range; + const editStart = editRange.getStartPosition(); + const editEnd = editRange.getEndPosition(); + const r2 = rangeFromPositions(lastEditEnd, editStart); + if (!r2.isEmpty()) { + result += text2.getValueOfRange(r2); + } + result += edit.text; + lastEditEnd = editEnd; + } + const r = rangeFromPositions(lastEditEnd, text2.endPositionExclusive); + if (!r.isEmpty()) { + result += text2.getValueOfRange(r); + } + return result; + } + applyToString(str) { + const strText = new StringText(str); + return this.apply(strText); + } + getNewRanges() { + const newRanges = []; + let previousEditEndLineNumber = 0; + let lineOffset = 0; + let columnOffset = 0; + for (const edit of this.edits) { + const textLength = TextLength.ofText(edit.text); + const newRangeStart = Position.lift({ + lineNumber: edit.range.startLineNumber + lineOffset, + column: edit.range.startColumn + (edit.range.startLineNumber === previousEditEndLineNumber ? columnOffset : 0) + }); + const newRange = textLength.createRange(newRangeStart); + newRanges.push(newRange); + lineOffset = newRange.endLineNumber - edit.range.endLineNumber; + columnOffset = newRange.endColumn - edit.range.endColumn; + previousEditEndLineNumber = edit.range.endLineNumber; + } + return newRanges; + } + }; + SingleTextEdit = class { + constructor(range2, text2) { + this.range = range2; + this.text = text2; + } + }; + AbstractText = class { + get endPositionExclusive() { + return this.length.addToPosition(new Position(1, 1)); + } + }; + StringText = class extends AbstractText { + constructor(value) { + super(); + this.value = value; + this._t = new PositionOffsetTransformer(this.value); + } + getValueOfRange(range2) { + return this._t.getOffsetRange(range2).substring(this.value); + } + get length() { + return this._t.textLength; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/diff/rangeMapping.js +var LineRangeMapping, DetailedLineRangeMapping, RangeMapping; +var init_rangeMapping = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/diff/rangeMapping.js"() { + init_errors(); + init_lineRange(); + init_range(); + init_textEdit(); + LineRangeMapping = class _LineRangeMapping { + static inverse(mapping, originalLineCount, modifiedLineCount) { + const result = []; + let lastOriginalEndLineNumber = 1; + let lastModifiedEndLineNumber = 1; + for (const m of mapping) { + const r2 = new _LineRangeMapping(new LineRange(lastOriginalEndLineNumber, m.original.startLineNumber), new LineRange(lastModifiedEndLineNumber, m.modified.startLineNumber)); + if (!r2.modified.isEmpty) { + result.push(r2); + } + lastOriginalEndLineNumber = m.original.endLineNumberExclusive; + lastModifiedEndLineNumber = m.modified.endLineNumberExclusive; + } + const r = new _LineRangeMapping(new LineRange(lastOriginalEndLineNumber, originalLineCount + 1), new LineRange(lastModifiedEndLineNumber, modifiedLineCount + 1)); + if (!r.modified.isEmpty) { + result.push(r); + } + return result; + } + static clip(mapping, originalRange, modifiedRange) { + const result = []; + for (const m of mapping) { + const original = m.original.intersect(originalRange); + const modified = m.modified.intersect(modifiedRange); + if (original && !original.isEmpty && modified && !modified.isEmpty) { + result.push(new _LineRangeMapping(original, modified)); + } + } + return result; + } + constructor(originalRange, modifiedRange) { + this.original = originalRange; + this.modified = modifiedRange; + } + toString() { + return `{${this.original.toString()}->${this.modified.toString()}}`; + } + flip() { + return new _LineRangeMapping(this.modified, this.original); + } + join(other) { + return new _LineRangeMapping(this.original.join(other.original), this.modified.join(other.modified)); + } + /** + * This method assumes that the LineRangeMapping describes a valid diff! + * I.e. if one range is empty, the other range cannot be the entire document. + * It avoids various problems when the line range points to non-existing line-numbers. + */ + toRangeMapping() { + const origInclusiveRange = this.original.toInclusiveRange(); + const modInclusiveRange = this.modified.toInclusiveRange(); + if (origInclusiveRange && modInclusiveRange) { + return new RangeMapping(origInclusiveRange, modInclusiveRange); + } else if (this.original.startLineNumber === 1 || this.modified.startLineNumber === 1) { + if (!(this.modified.startLineNumber === 1 && this.original.startLineNumber === 1)) { + throw new BugIndicatingError("not a valid diff"); + } + return new RangeMapping(new Range(this.original.startLineNumber, 1, this.original.endLineNumberExclusive, 1), new Range(this.modified.startLineNumber, 1, this.modified.endLineNumberExclusive, 1)); + } else { + return new RangeMapping(new Range(this.original.startLineNumber - 1, Number.MAX_SAFE_INTEGER, this.original.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), new Range(this.modified.startLineNumber - 1, Number.MAX_SAFE_INTEGER, this.modified.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER)); + } + } + }; + DetailedLineRangeMapping = class _DetailedLineRangeMapping extends LineRangeMapping { + static fromRangeMappings(rangeMappings) { + const originalRange = LineRange.join(rangeMappings.map((r) => LineRange.fromRangeInclusive(r.originalRange))); + const modifiedRange = LineRange.join(rangeMappings.map((r) => LineRange.fromRangeInclusive(r.modifiedRange))); + return new _DetailedLineRangeMapping(originalRange, modifiedRange, rangeMappings); + } + constructor(originalRange, modifiedRange, innerChanges) { + super(originalRange, modifiedRange); + this.innerChanges = innerChanges; + } + flip() { + var _a10; + return new _DetailedLineRangeMapping(this.modified, this.original, (_a10 = this.innerChanges) === null || _a10 === void 0 ? void 0 : _a10.map((c) => c.flip())); + } + withInnerChangesFromLineRanges() { + return new _DetailedLineRangeMapping(this.original, this.modified, [this.toRangeMapping()]); + } + }; + RangeMapping = class _RangeMapping { + constructor(originalRange, modifiedRange) { + this.originalRange = originalRange; + this.modifiedRange = modifiedRange; + } + toString() { + return `{${this.originalRange.toString()}->${this.modifiedRange.toString()}}`; + } + flip() { + return new _RangeMapping(this.modifiedRange, this.originalRange); + } + /** + * Creates a single text edit that describes the change from the original to the modified text. + */ + toTextEdit(modified) { + const newText = modified.getValueOfRange(this.modifiedRange); + return new SingleTextEdit(this.originalRange, newText); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/diff/legacyLinesDiffComputer.js +function computeDiff(originalSequence, modifiedSequence, continueProcessingPredicate, pretty) { + const diffAlgo = new LcsDiff(originalSequence, modifiedSequence, continueProcessingPredicate); + return diffAlgo.ComputeDiff(pretty); +} +function postProcessCharChanges(rawChanges) { + if (rawChanges.length <= 1) { + return rawChanges; + } + const result = [rawChanges[0]]; + let prevChange = result[0]; + for (let i = 1, len = rawChanges.length; i < len; i++) { + const currChange = rawChanges[i]; + const originalMatchingLength = currChange.originalStart - (prevChange.originalStart + prevChange.originalLength); + const modifiedMatchingLength = currChange.modifiedStart - (prevChange.modifiedStart + prevChange.modifiedLength); + const matchingLength = Math.min(originalMatchingLength, modifiedMatchingLength); + if (matchingLength < MINIMUM_MATCHING_CHARACTER_LENGTH) { + prevChange.originalLength = currChange.originalStart + currChange.originalLength - prevChange.originalStart; + prevChange.modifiedLength = currChange.modifiedStart + currChange.modifiedLength - prevChange.modifiedStart; + } else { + result.push(currChange); + prevChange = currChange; + } + } + return result; +} +function getFirstNonBlankColumn(txt, defaultValue) { + const r = firstNonWhitespaceIndex(txt); + if (r === -1) { + return defaultValue; + } + return r + 1; +} +function getLastNonBlankColumn(txt, defaultValue) { + const r = lastNonWhitespaceIndex(txt); + if (r === -1) { + return defaultValue; + } + return r + 2; +} +function createContinueProcessingPredicate(maximumRuntime) { + if (maximumRuntime === 0) { + return () => true; + } + const startTime = Date.now(); + return () => { + return Date.now() - startTime < maximumRuntime; + }; +} +var MINIMUM_MATCHING_CHARACTER_LENGTH, LegacyLinesDiffComputer, LineSequence, CharSequence, CharChange, LineChange, DiffComputer; +var init_legacyLinesDiffComputer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/diff/legacyLinesDiffComputer.js"() { + init_diff(); + init_linesDiffComputer(); + init_rangeMapping(); + init_strings(); + init_range(); + init_assert(); + init_lineRange(); + MINIMUM_MATCHING_CHARACTER_LENGTH = 3; + LegacyLinesDiffComputer = class { + computeDiff(originalLines, modifiedLines, options2) { + var _a10; + const diffComputer = new DiffComputer(originalLines, modifiedLines, { + maxComputationTime: options2.maxComputationTimeMs, + shouldIgnoreTrimWhitespace: options2.ignoreTrimWhitespace, + shouldComputeCharChanges: true, + shouldMakePrettyDiff: true, + shouldPostProcessCharChanges: true + }); + const result = diffComputer.computeDiff(); + const changes = []; + let lastChange = null; + for (const c of result.changes) { + let originalRange; + if (c.originalEndLineNumber === 0) { + originalRange = new LineRange(c.originalStartLineNumber + 1, c.originalStartLineNumber + 1); + } else { + originalRange = new LineRange(c.originalStartLineNumber, c.originalEndLineNumber + 1); + } + let modifiedRange; + if (c.modifiedEndLineNumber === 0) { + modifiedRange = new LineRange(c.modifiedStartLineNumber + 1, c.modifiedStartLineNumber + 1); + } else { + modifiedRange = new LineRange(c.modifiedStartLineNumber, c.modifiedEndLineNumber + 1); + } + let change = new DetailedLineRangeMapping(originalRange, modifiedRange, (_a10 = c.charChanges) === null || _a10 === void 0 ? void 0 : _a10.map((c2) => new RangeMapping(new Range(c2.originalStartLineNumber, c2.originalStartColumn, c2.originalEndLineNumber, c2.originalEndColumn), new Range(c2.modifiedStartLineNumber, c2.modifiedStartColumn, c2.modifiedEndLineNumber, c2.modifiedEndColumn)))); + if (lastChange) { + if (lastChange.modified.endLineNumberExclusive === change.modified.startLineNumber || lastChange.original.endLineNumberExclusive === change.original.startLineNumber) { + change = new DetailedLineRangeMapping(lastChange.original.join(change.original), lastChange.modified.join(change.modified), lastChange.innerChanges && change.innerChanges ? lastChange.innerChanges.concat(change.innerChanges) : void 0); + changes.pop(); + } + } + changes.push(change); + lastChange = change; + } + assertFn(() => { + return checkAdjacentItems(changes, (m1, m2) => m2.original.startLineNumber - m1.original.endLineNumberExclusive === m2.modified.startLineNumber - m1.modified.endLineNumberExclusive && // There has to be an unchanged line in between (otherwise both diffs should have been joined) + m1.original.endLineNumberExclusive < m2.original.startLineNumber && m1.modified.endLineNumberExclusive < m2.modified.startLineNumber); + }); + return new LinesDiff(changes, [], result.quitEarly); + } + }; + LineSequence = class { + constructor(lines) { + const startColumns = []; + const endColumns = []; + for (let i = 0, length = lines.length; i < length; i++) { + startColumns[i] = getFirstNonBlankColumn(lines[i], 1); + endColumns[i] = getLastNonBlankColumn(lines[i], 1); + } + this.lines = lines; + this._startColumns = startColumns; + this._endColumns = endColumns; + } + getElements() { + const elements = []; + for (let i = 0, len = this.lines.length; i < len; i++) { + elements[i] = this.lines[i].substring(this._startColumns[i] - 1, this._endColumns[i] - 1); + } + return elements; + } + getStrictElement(index) { + return this.lines[index]; + } + getStartLineNumber(i) { + return i + 1; + } + getEndLineNumber(i) { + return i + 1; + } + createCharSequence(shouldIgnoreTrimWhitespace, startIndex, endIndex) { + const charCodes = []; + const lineNumbers = []; + const columns = []; + let len = 0; + for (let index = startIndex; index <= endIndex; index++) { + const lineContent = this.lines[index]; + const startColumn = shouldIgnoreTrimWhitespace ? this._startColumns[index] : 1; + const endColumn = shouldIgnoreTrimWhitespace ? this._endColumns[index] : lineContent.length + 1; + for (let col = startColumn; col < endColumn; col++) { + charCodes[len] = lineContent.charCodeAt(col - 1); + lineNumbers[len] = index + 1; + columns[len] = col; + len++; + } + if (!shouldIgnoreTrimWhitespace && index < endIndex) { + charCodes[len] = 10; + lineNumbers[len] = index + 1; + columns[len] = lineContent.length + 1; + len++; + } + } + return new CharSequence(charCodes, lineNumbers, columns); + } + }; + CharSequence = class { + constructor(charCodes, lineNumbers, columns) { + this._charCodes = charCodes; + this._lineNumbers = lineNumbers; + this._columns = columns; + } + toString() { + return "[" + this._charCodes.map((s, idx) => (s === 10 ? "\\n" : String.fromCharCode(s)) + `-(${this._lineNumbers[idx]},${this._columns[idx]})`).join(", ") + "]"; + } + _assertIndex(index, arr) { + if (index < 0 || index >= arr.length) { + throw new Error(`Illegal index`); + } + } + getElements() { + return this._charCodes; + } + getStartLineNumber(i) { + if (i > 0 && i === this._lineNumbers.length) { + return this.getEndLineNumber(i - 1); + } + this._assertIndex(i, this._lineNumbers); + return this._lineNumbers[i]; + } + getEndLineNumber(i) { + if (i === -1) { + return this.getStartLineNumber(i + 1); + } + this._assertIndex(i, this._lineNumbers); + if (this._charCodes[i] === 10) { + return this._lineNumbers[i] + 1; + } + return this._lineNumbers[i]; + } + getStartColumn(i) { + if (i > 0 && i === this._columns.length) { + return this.getEndColumn(i - 1); + } + this._assertIndex(i, this._columns); + return this._columns[i]; + } + getEndColumn(i) { + if (i === -1) { + return this.getStartColumn(i + 1); + } + this._assertIndex(i, this._columns); + if (this._charCodes[i] === 10) { + return 1; + } + return this._columns[i] + 1; + } + }; + CharChange = class _CharChange { + constructor(originalStartLineNumber, originalStartColumn, originalEndLineNumber, originalEndColumn, modifiedStartLineNumber, modifiedStartColumn, modifiedEndLineNumber, modifiedEndColumn) { + this.originalStartLineNumber = originalStartLineNumber; + this.originalStartColumn = originalStartColumn; + this.originalEndLineNumber = originalEndLineNumber; + this.originalEndColumn = originalEndColumn; + this.modifiedStartLineNumber = modifiedStartLineNumber; + this.modifiedStartColumn = modifiedStartColumn; + this.modifiedEndLineNumber = modifiedEndLineNumber; + this.modifiedEndColumn = modifiedEndColumn; + } + static createFromDiffChange(diffChange, originalCharSequence, modifiedCharSequence) { + const originalStartLineNumber = originalCharSequence.getStartLineNumber(diffChange.originalStart); + const originalStartColumn = originalCharSequence.getStartColumn(diffChange.originalStart); + const originalEndLineNumber = originalCharSequence.getEndLineNumber(diffChange.originalStart + diffChange.originalLength - 1); + const originalEndColumn = originalCharSequence.getEndColumn(diffChange.originalStart + diffChange.originalLength - 1); + const modifiedStartLineNumber = modifiedCharSequence.getStartLineNumber(diffChange.modifiedStart); + const modifiedStartColumn = modifiedCharSequence.getStartColumn(diffChange.modifiedStart); + const modifiedEndLineNumber = modifiedCharSequence.getEndLineNumber(diffChange.modifiedStart + diffChange.modifiedLength - 1); + const modifiedEndColumn = modifiedCharSequence.getEndColumn(diffChange.modifiedStart + diffChange.modifiedLength - 1); + return new _CharChange(originalStartLineNumber, originalStartColumn, originalEndLineNumber, originalEndColumn, modifiedStartLineNumber, modifiedStartColumn, modifiedEndLineNumber, modifiedEndColumn); + } + }; + LineChange = class _LineChange { + constructor(originalStartLineNumber, originalEndLineNumber, modifiedStartLineNumber, modifiedEndLineNumber, charChanges) { + this.originalStartLineNumber = originalStartLineNumber; + this.originalEndLineNumber = originalEndLineNumber; + this.modifiedStartLineNumber = modifiedStartLineNumber; + this.modifiedEndLineNumber = modifiedEndLineNumber; + this.charChanges = charChanges; + } + static createFromDiffResult(shouldIgnoreTrimWhitespace, diffChange, originalLineSequence, modifiedLineSequence, continueCharDiff, shouldComputeCharChanges, shouldPostProcessCharChanges) { + let originalStartLineNumber; + let originalEndLineNumber; + let modifiedStartLineNumber; + let modifiedEndLineNumber; + let charChanges = void 0; + if (diffChange.originalLength === 0) { + originalStartLineNumber = originalLineSequence.getStartLineNumber(diffChange.originalStart) - 1; + originalEndLineNumber = 0; + } else { + originalStartLineNumber = originalLineSequence.getStartLineNumber(diffChange.originalStart); + originalEndLineNumber = originalLineSequence.getEndLineNumber(diffChange.originalStart + diffChange.originalLength - 1); + } + if (diffChange.modifiedLength === 0) { + modifiedStartLineNumber = modifiedLineSequence.getStartLineNumber(diffChange.modifiedStart) - 1; + modifiedEndLineNumber = 0; + } else { + modifiedStartLineNumber = modifiedLineSequence.getStartLineNumber(diffChange.modifiedStart); + modifiedEndLineNumber = modifiedLineSequence.getEndLineNumber(diffChange.modifiedStart + diffChange.modifiedLength - 1); + } + if (shouldComputeCharChanges && diffChange.originalLength > 0 && diffChange.originalLength < 20 && diffChange.modifiedLength > 0 && diffChange.modifiedLength < 20 && continueCharDiff()) { + const originalCharSequence = originalLineSequence.createCharSequence(shouldIgnoreTrimWhitespace, diffChange.originalStart, diffChange.originalStart + diffChange.originalLength - 1); + const modifiedCharSequence = modifiedLineSequence.createCharSequence(shouldIgnoreTrimWhitespace, diffChange.modifiedStart, diffChange.modifiedStart + diffChange.modifiedLength - 1); + if (originalCharSequence.getElements().length > 0 && modifiedCharSequence.getElements().length > 0) { + let rawChanges = computeDiff(originalCharSequence, modifiedCharSequence, continueCharDiff, true).changes; + if (shouldPostProcessCharChanges) { + rawChanges = postProcessCharChanges(rawChanges); + } + charChanges = []; + for (let i = 0, length = rawChanges.length; i < length; i++) { + charChanges.push(CharChange.createFromDiffChange(rawChanges[i], originalCharSequence, modifiedCharSequence)); + } + } + } + return new _LineChange(originalStartLineNumber, originalEndLineNumber, modifiedStartLineNumber, modifiedEndLineNumber, charChanges); + } + }; + DiffComputer = class { + constructor(originalLines, modifiedLines, opts) { + this.shouldComputeCharChanges = opts.shouldComputeCharChanges; + this.shouldPostProcessCharChanges = opts.shouldPostProcessCharChanges; + this.shouldIgnoreTrimWhitespace = opts.shouldIgnoreTrimWhitespace; + this.shouldMakePrettyDiff = opts.shouldMakePrettyDiff; + this.originalLines = originalLines; + this.modifiedLines = modifiedLines; + this.original = new LineSequence(originalLines); + this.modified = new LineSequence(modifiedLines); + this.continueLineDiff = createContinueProcessingPredicate(opts.maxComputationTime); + this.continueCharDiff = createContinueProcessingPredicate(opts.maxComputationTime === 0 ? 0 : Math.min(opts.maxComputationTime, 5e3)); + } + computeDiff() { + if (this.original.lines.length === 1 && this.original.lines[0].length === 0) { + if (this.modified.lines.length === 1 && this.modified.lines[0].length === 0) { + return { + quitEarly: false, + changes: [] + }; + } + return { + quitEarly: false, + changes: [{ + originalStartLineNumber: 1, + originalEndLineNumber: 1, + modifiedStartLineNumber: 1, + modifiedEndLineNumber: this.modified.lines.length, + charChanges: void 0 + }] + }; + } + if (this.modified.lines.length === 1 && this.modified.lines[0].length === 0) { + return { + quitEarly: false, + changes: [{ + originalStartLineNumber: 1, + originalEndLineNumber: this.original.lines.length, + modifiedStartLineNumber: 1, + modifiedEndLineNumber: 1, + charChanges: void 0 + }] + }; + } + const diffResult = computeDiff(this.original, this.modified, this.continueLineDiff, this.shouldMakePrettyDiff); + const rawChanges = diffResult.changes; + const quitEarly = diffResult.quitEarly; + if (this.shouldIgnoreTrimWhitespace) { + const lineChanges = []; + for (let i = 0, length = rawChanges.length; i < length; i++) { + lineChanges.push(LineChange.createFromDiffResult(this.shouldIgnoreTrimWhitespace, rawChanges[i], this.original, this.modified, this.continueCharDiff, this.shouldComputeCharChanges, this.shouldPostProcessCharChanges)); + } + return { + quitEarly, + changes: lineChanges + }; + } + const result = []; + let originalLineIndex = 0; + let modifiedLineIndex = 0; + for (let i = -1, len = rawChanges.length; i < len; i++) { + const nextChange = i + 1 < len ? rawChanges[i + 1] : null; + const originalStop = nextChange ? nextChange.originalStart : this.originalLines.length; + const modifiedStop = nextChange ? nextChange.modifiedStart : this.modifiedLines.length; + while (originalLineIndex < originalStop && modifiedLineIndex < modifiedStop) { + const originalLine = this.originalLines[originalLineIndex]; + const modifiedLine = this.modifiedLines[modifiedLineIndex]; + if (originalLine !== modifiedLine) { + { + let originalStartColumn = getFirstNonBlankColumn(originalLine, 1); + let modifiedStartColumn = getFirstNonBlankColumn(modifiedLine, 1); + while (originalStartColumn > 1 && modifiedStartColumn > 1) { + const originalChar = originalLine.charCodeAt(originalStartColumn - 2); + const modifiedChar = modifiedLine.charCodeAt(modifiedStartColumn - 2); + if (originalChar !== modifiedChar) { + break; + } + originalStartColumn--; + modifiedStartColumn--; + } + if (originalStartColumn > 1 || modifiedStartColumn > 1) { + this._pushTrimWhitespaceCharChange(result, originalLineIndex + 1, 1, originalStartColumn, modifiedLineIndex + 1, 1, modifiedStartColumn); + } + } + { + let originalEndColumn = getLastNonBlankColumn(originalLine, 1); + let modifiedEndColumn = getLastNonBlankColumn(modifiedLine, 1); + const originalMaxColumn = originalLine.length + 1; + const modifiedMaxColumn = modifiedLine.length + 1; + while (originalEndColumn < originalMaxColumn && modifiedEndColumn < modifiedMaxColumn) { + const originalChar = originalLine.charCodeAt(originalEndColumn - 1); + const modifiedChar = originalLine.charCodeAt(modifiedEndColumn - 1); + if (originalChar !== modifiedChar) { + break; + } + originalEndColumn++; + modifiedEndColumn++; + } + if (originalEndColumn < originalMaxColumn || modifiedEndColumn < modifiedMaxColumn) { + this._pushTrimWhitespaceCharChange(result, originalLineIndex + 1, originalEndColumn, originalMaxColumn, modifiedLineIndex + 1, modifiedEndColumn, modifiedMaxColumn); + } + } + } + originalLineIndex++; + modifiedLineIndex++; + } + if (nextChange) { + result.push(LineChange.createFromDiffResult(this.shouldIgnoreTrimWhitespace, nextChange, this.original, this.modified, this.continueCharDiff, this.shouldComputeCharChanges, this.shouldPostProcessCharChanges)); + originalLineIndex += nextChange.originalLength; + modifiedLineIndex += nextChange.modifiedLength; + } + } + return { + quitEarly, + changes: result + }; + } + _pushTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn) { + if (this._mergeTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn)) { + return; + } + let charChanges = void 0; + if (this.shouldComputeCharChanges) { + charChanges = [new CharChange(originalLineNumber, originalStartColumn, originalLineNumber, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedLineNumber, modifiedEndColumn)]; + } + result.push(new LineChange(originalLineNumber, originalLineNumber, modifiedLineNumber, modifiedLineNumber, charChanges)); + } + _mergeTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn) { + const len = result.length; + if (len === 0) { + return false; + } + const prevChange = result[len - 1]; + if (prevChange.originalEndLineNumber === 0 || prevChange.modifiedEndLineNumber === 0) { + return false; + } + if (prevChange.originalEndLineNumber === originalLineNumber && prevChange.modifiedEndLineNumber === modifiedLineNumber) { + if (this.shouldComputeCharChanges && prevChange.charChanges) { + prevChange.charChanges.push(new CharChange(originalLineNumber, originalStartColumn, originalLineNumber, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedLineNumber, modifiedEndColumn)); + } + return true; + } + if (prevChange.originalEndLineNumber + 1 === originalLineNumber && prevChange.modifiedEndLineNumber + 1 === modifiedLineNumber) { + prevChange.originalEndLineNumber = originalLineNumber; + prevChange.modifiedEndLineNumber = modifiedLineNumber; + if (this.shouldComputeCharChanges && prevChange.charChanges) { + prevChange.charChanges.push(new CharChange(originalLineNumber, originalStartColumn, originalLineNumber, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedLineNumber, modifiedEndColumn)); + } + return true; + } + return false; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/algorithms/diffAlgorithm.js +var DiffAlgorithmResult, SequenceDiff, OffsetPair, InfiniteTimeout, DateTimeout; +var init_diffAlgorithm = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/algorithms/diffAlgorithm.js"() { + init_arrays(); + init_errors(); + init_offsetRange(); + DiffAlgorithmResult = class _DiffAlgorithmResult { + static trivial(seq1, seq2) { + return new _DiffAlgorithmResult([new SequenceDiff(OffsetRange.ofLength(seq1.length), OffsetRange.ofLength(seq2.length))], false); + } + static trivialTimedOut(seq1, seq2) { + return new _DiffAlgorithmResult([new SequenceDiff(OffsetRange.ofLength(seq1.length), OffsetRange.ofLength(seq2.length))], true); + } + constructor(diffs, hitTimeout) { + this.diffs = diffs; + this.hitTimeout = hitTimeout; + } + }; + SequenceDiff = class _SequenceDiff { + static invert(sequenceDiffs, doc1Length) { + const result = []; + forEachAdjacent(sequenceDiffs, (a3, b) => { + result.push(_SequenceDiff.fromOffsetPairs(a3 ? a3.getEndExclusives() : OffsetPair.zero, b ? b.getStarts() : new OffsetPair(doc1Length, (a3 ? a3.seq2Range.endExclusive - a3.seq1Range.endExclusive : 0) + doc1Length))); + }); + return result; + } + static fromOffsetPairs(start, endExclusive) { + return new _SequenceDiff(new OffsetRange(start.offset1, endExclusive.offset1), new OffsetRange(start.offset2, endExclusive.offset2)); + } + constructor(seq1Range, seq2Range) { + this.seq1Range = seq1Range; + this.seq2Range = seq2Range; + } + swap() { + return new _SequenceDiff(this.seq2Range, this.seq1Range); + } + toString() { + return `${this.seq1Range} <-> ${this.seq2Range}`; + } + join(other) { + return new _SequenceDiff(this.seq1Range.join(other.seq1Range), this.seq2Range.join(other.seq2Range)); + } + delta(offset) { + if (offset === 0) { + return this; + } + return new _SequenceDiff(this.seq1Range.delta(offset), this.seq2Range.delta(offset)); + } + deltaStart(offset) { + if (offset === 0) { + return this; + } + return new _SequenceDiff(this.seq1Range.deltaStart(offset), this.seq2Range.deltaStart(offset)); + } + deltaEnd(offset) { + if (offset === 0) { + return this; + } + return new _SequenceDiff(this.seq1Range.deltaEnd(offset), this.seq2Range.deltaEnd(offset)); + } + intersect(other) { + const i1 = this.seq1Range.intersect(other.seq1Range); + const i2 = this.seq2Range.intersect(other.seq2Range); + if (!i1 || !i2) { + return void 0; + } + return new _SequenceDiff(i1, i2); + } + getStarts() { + return new OffsetPair(this.seq1Range.start, this.seq2Range.start); + } + getEndExclusives() { + return new OffsetPair(this.seq1Range.endExclusive, this.seq2Range.endExclusive); + } + }; + OffsetPair = class _OffsetPair { + constructor(offset1, offset2) { + this.offset1 = offset1; + this.offset2 = offset2; + } + toString() { + return `${this.offset1} <-> ${this.offset2}`; + } + delta(offset) { + if (offset === 0) { + return this; + } + return new _OffsetPair(this.offset1 + offset, this.offset2 + offset); + } + equals(other) { + return this.offset1 === other.offset1 && this.offset2 === other.offset2; + } + }; + OffsetPair.zero = new OffsetPair(0, 0); + OffsetPair.max = new OffsetPair(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER); + InfiniteTimeout = class { + isValid() { + return true; + } + }; + InfiniteTimeout.instance = new InfiniteTimeout(); + DateTimeout = class { + constructor(timeout2) { + this.timeout = timeout2; + this.startTime = Date.now(); + this.valid = true; + if (timeout2 <= 0) { + throw new BugIndicatingError("timeout must be positive"); + } + } + // Recommendation: Set a log-point `{this.disable()}` in the body + isValid() { + const valid = Date.now() - this.startTime < this.timeout; + if (!valid && this.valid) { + this.valid = false; + debugger; + } + return this.valid; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/utils.js +function isSpace(charCode) { + return charCode === 32 || charCode === 9; +} +var Array2D, LineRangeFragment; +var init_utils = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/utils.js"() { + Array2D = class { + constructor(width2, height) { + this.width = width2; + this.height = height; + this.array = []; + this.array = new Array(width2 * height); + } + get(x, y) { + return this.array[x + y * this.width]; + } + set(x, y, value) { + this.array[x + y * this.width] = value; + } + }; + LineRangeFragment = class _LineRangeFragment { + static getKey(chr) { + let key = this.chrKeys.get(chr); + if (key === void 0) { + key = this.chrKeys.size; + this.chrKeys.set(chr, key); + } + return key; + } + constructor(range2, lines, source) { + this.range = range2; + this.lines = lines; + this.source = source; + this.histogram = []; + let counter = 0; + for (let i = range2.startLineNumber - 1; i < range2.endLineNumberExclusive - 1; i++) { + const line = lines[i]; + for (let j = 0; j < line.length; j++) { + counter++; + const chr = line[j]; + const key2 = _LineRangeFragment.getKey(chr); + this.histogram[key2] = (this.histogram[key2] || 0) + 1; + } + counter++; + const key = _LineRangeFragment.getKey("\n"); + this.histogram[key] = (this.histogram[key] || 0) + 1; + } + this.totalCount = counter; + } + computeSimilarity(other) { + var _a10, _b4; + let sumDifferences = 0; + const maxLength = Math.max(this.histogram.length, other.histogram.length); + for (let i = 0; i < maxLength; i++) { + sumDifferences += Math.abs(((_a10 = this.histogram[i]) !== null && _a10 !== void 0 ? _a10 : 0) - ((_b4 = other.histogram[i]) !== null && _b4 !== void 0 ? _b4 : 0)); + } + return 1 - sumDifferences / (this.totalCount + other.totalCount); + } + }; + LineRangeFragment.chrKeys = /* @__PURE__ */ new Map(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/algorithms/dynamicProgrammingDiffing.js +var DynamicProgrammingDiffing; +var init_dynamicProgrammingDiffing = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/algorithms/dynamicProgrammingDiffing.js"() { + init_offsetRange(); + init_diffAlgorithm(); + init_utils(); + DynamicProgrammingDiffing = class { + compute(sequence1, sequence2, timeout2 = InfiniteTimeout.instance, equalityScore) { + if (sequence1.length === 0 || sequence2.length === 0) { + return DiffAlgorithmResult.trivial(sequence1, sequence2); + } + const lcsLengths = new Array2D(sequence1.length, sequence2.length); + const directions = new Array2D(sequence1.length, sequence2.length); + const lengths = new Array2D(sequence1.length, sequence2.length); + for (let s12 = 0; s12 < sequence1.length; s12++) { + for (let s22 = 0; s22 < sequence2.length; s22++) { + if (!timeout2.isValid()) { + return DiffAlgorithmResult.trivialTimedOut(sequence1, sequence2); + } + const horizontalLen = s12 === 0 ? 0 : lcsLengths.get(s12 - 1, s22); + const verticalLen = s22 === 0 ? 0 : lcsLengths.get(s12, s22 - 1); + let extendedSeqScore; + if (sequence1.getElement(s12) === sequence2.getElement(s22)) { + if (s12 === 0 || s22 === 0) { + extendedSeqScore = 0; + } else { + extendedSeqScore = lcsLengths.get(s12 - 1, s22 - 1); + } + if (s12 > 0 && s22 > 0 && directions.get(s12 - 1, s22 - 1) === 3) { + extendedSeqScore += lengths.get(s12 - 1, s22 - 1); + } + extendedSeqScore += equalityScore ? equalityScore(s12, s22) : 1; + } else { + extendedSeqScore = -1; + } + const newValue = Math.max(horizontalLen, verticalLen, extendedSeqScore); + if (newValue === extendedSeqScore) { + const prevLen = s12 > 0 && s22 > 0 ? lengths.get(s12 - 1, s22 - 1) : 0; + lengths.set(s12, s22, prevLen + 1); + directions.set(s12, s22, 3); + } else if (newValue === horizontalLen) { + lengths.set(s12, s22, 0); + directions.set(s12, s22, 1); + } else if (newValue === verticalLen) { + lengths.set(s12, s22, 0); + directions.set(s12, s22, 2); + } + lcsLengths.set(s12, s22, newValue); + } + } + const result = []; + let lastAligningPosS1 = sequence1.length; + let lastAligningPosS2 = sequence2.length; + function reportDecreasingAligningPositions(s12, s22) { + if (s12 + 1 !== lastAligningPosS1 || s22 + 1 !== lastAligningPosS2) { + result.push(new SequenceDiff(new OffsetRange(s12 + 1, lastAligningPosS1), new OffsetRange(s22 + 1, lastAligningPosS2))); + } + lastAligningPosS1 = s12; + lastAligningPosS2 = s22; + } + let s1 = sequence1.length - 1; + let s2 = sequence2.length - 1; + while (s1 >= 0 && s2 >= 0) { + if (directions.get(s1, s2) === 3) { + reportDecreasingAligningPositions(s1, s2); + s1--; + s2--; + } else { + if (directions.get(s1, s2) === 1) { + s1--; + } else { + s2--; + } + } + } + reportDecreasingAligningPositions(-1, -1); + result.reverse(); + return new DiffAlgorithmResult(result, false); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/algorithms/myersDiffAlgorithm.js +var MyersDiffAlgorithm, SnakePath, FastInt32Array, FastArrayNegativeIndices; +var init_myersDiffAlgorithm = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/algorithms/myersDiffAlgorithm.js"() { + init_offsetRange(); + init_diffAlgorithm(); + MyersDiffAlgorithm = class { + compute(seq1, seq2, timeout2 = InfiniteTimeout.instance) { + if (seq1.length === 0 || seq2.length === 0) { + return DiffAlgorithmResult.trivial(seq1, seq2); + } + const seqX = seq1; + const seqY = seq2; + function getXAfterSnake(x, y) { + while (x < seqX.length && y < seqY.length && seqX.getElement(x) === seqY.getElement(y)) { + x++; + y++; + } + return x; + } + let d = 0; + const V = new FastInt32Array(); + V.set(0, getXAfterSnake(0, 0)); + const paths = new FastArrayNegativeIndices(); + paths.set(0, V.get(0) === 0 ? null : new SnakePath(null, 0, 0, V.get(0))); + let k = 0; + loop: while (true) { + d++; + if (!timeout2.isValid()) { + return DiffAlgorithmResult.trivialTimedOut(seqX, seqY); + } + const lowerBound = -Math.min(d, seqY.length + d % 2); + const upperBound = Math.min(d, seqX.length + d % 2); + for (k = lowerBound; k <= upperBound; k += 2) { + let step = 0; + const maxXofDLineTop = k === upperBound ? -1 : V.get(k + 1); + const maxXofDLineLeft = k === lowerBound ? -1 : V.get(k - 1) + 1; + step++; + const x = Math.min(Math.max(maxXofDLineTop, maxXofDLineLeft), seqX.length); + const y = x - k; + step++; + if (x > seqX.length || y > seqY.length) { + continue; + } + const newMaxX = getXAfterSnake(x, y); + V.set(k, newMaxX); + const lastPath = x === maxXofDLineTop ? paths.get(k + 1) : paths.get(k - 1); + paths.set(k, newMaxX !== x ? new SnakePath(lastPath, x, y, newMaxX - x) : lastPath); + if (V.get(k) === seqX.length && V.get(k) - k === seqY.length) { + break loop; + } + } + } + let path = paths.get(k); + const result = []; + let lastAligningPosS1 = seqX.length; + let lastAligningPosS2 = seqY.length; + while (true) { + const endX = path ? path.x + path.length : 0; + const endY = path ? path.y + path.length : 0; + if (endX !== lastAligningPosS1 || endY !== lastAligningPosS2) { + result.push(new SequenceDiff(new OffsetRange(endX, lastAligningPosS1), new OffsetRange(endY, lastAligningPosS2))); + } + if (!path) { + break; + } + lastAligningPosS1 = path.x; + lastAligningPosS2 = path.y; + path = path.prev; + } + result.reverse(); + return new DiffAlgorithmResult(result, false); + } + }; + SnakePath = class { + constructor(prev, x, y, length) { + this.prev = prev; + this.x = x; + this.y = y; + this.length = length; + } + }; + FastInt32Array = class { + constructor() { + this.positiveArr = new Int32Array(10); + this.negativeArr = new Int32Array(10); + } + get(idx) { + if (idx < 0) { + idx = -idx - 1; + return this.negativeArr[idx]; + } else { + return this.positiveArr[idx]; + } + } + set(idx, value) { + if (idx < 0) { + idx = -idx - 1; + if (idx >= this.negativeArr.length) { + const arr = this.negativeArr; + this.negativeArr = new Int32Array(arr.length * 2); + this.negativeArr.set(arr); + } + this.negativeArr[idx] = value; + } else { + if (idx >= this.positiveArr.length) { + const arr = this.positiveArr; + this.positiveArr = new Int32Array(arr.length * 2); + this.positiveArr.set(arr); + } + this.positiveArr[idx] = value; + } + } + }; + FastArrayNegativeIndices = class { + constructor() { + this.positiveArr = []; + this.negativeArr = []; + } + get(idx) { + if (idx < 0) { + idx = -idx - 1; + return this.negativeArr[idx]; + } else { + return this.positiveArr[idx]; + } + } + set(idx, value) { + if (idx < 0) { + idx = -idx - 1; + this.negativeArr[idx] = value; + } else { + this.positiveArr[idx] = value; + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence.js +function isWordChar(charCode) { + return charCode >= 97 && charCode <= 122 || charCode >= 65 && charCode <= 90 || charCode >= 48 && charCode <= 57; +} +function getCategoryBoundaryScore(category) { + return score[category]; +} +function getCategory(charCode) { + if (charCode === 10) { + return 8; + } else if (charCode === 13) { + return 7; + } else if (isSpace(charCode)) { + return 6; + } else if (charCode >= 97 && charCode <= 122) { + return 0; + } else if (charCode >= 65 && charCode <= 90) { + return 1; + } else if (charCode >= 48 && charCode <= 57) { + return 2; + } else if (charCode === -1) { + return 3; + } else if (charCode === 44 || charCode === 59) { + return 5; + } else { + return 4; + } +} +var LinesSliceCharSequence, score; +var init_linesSliceCharSequence = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence.js"() { + init_arraysFind(); + init_offsetRange(); + init_position(); + init_range(); + init_utils(); + LinesSliceCharSequence = class { + constructor(lines, lineRange, considerWhitespaceChanges) { + this.lines = lines; + this.considerWhitespaceChanges = considerWhitespaceChanges; + this.elements = []; + this.firstCharOffsetByLine = []; + this.additionalOffsetByLine = []; + let trimFirstLineFully = false; + if (lineRange.start > 0 && lineRange.endExclusive >= lines.length) { + lineRange = new OffsetRange(lineRange.start - 1, lineRange.endExclusive); + trimFirstLineFully = true; + } + this.lineRange = lineRange; + this.firstCharOffsetByLine[0] = 0; + for (let i = this.lineRange.start; i < this.lineRange.endExclusive; i++) { + let line = lines[i]; + let offset = 0; + if (trimFirstLineFully) { + offset = line.length; + line = ""; + trimFirstLineFully = false; + } else if (!considerWhitespaceChanges) { + const trimmedStartLine = line.trimStart(); + offset = line.length - trimmedStartLine.length; + line = trimmedStartLine.trimEnd(); + } + this.additionalOffsetByLine.push(offset); + for (let i2 = 0; i2 < line.length; i2++) { + this.elements.push(line.charCodeAt(i2)); + } + if (i < lines.length - 1) { + this.elements.push("\n".charCodeAt(0)); + this.firstCharOffsetByLine[i - this.lineRange.start + 1] = this.elements.length; + } + } + this.additionalOffsetByLine.push(0); + } + toString() { + return `Slice: "${this.text}"`; + } + get text() { + return this.getText(new OffsetRange(0, this.length)); + } + getText(range2) { + return this.elements.slice(range2.start, range2.endExclusive).map((e) => String.fromCharCode(e)).join(""); + } + getElement(offset) { + return this.elements[offset]; + } + get length() { + return this.elements.length; + } + getBoundaryScore(length) { + const prevCategory = getCategory(length > 0 ? this.elements[length - 1] : -1); + const nextCategory = getCategory(length < this.elements.length ? this.elements[length] : -1); + if (prevCategory === 7 && nextCategory === 8) { + return 0; + } + if (prevCategory === 8) { + return 150; + } + let score3 = 0; + if (prevCategory !== nextCategory) { + score3 += 10; + if (prevCategory === 0 && nextCategory === 1) { + score3 += 1; + } + } + score3 += getCategoryBoundaryScore(prevCategory); + score3 += getCategoryBoundaryScore(nextCategory); + return score3; + } + translateOffset(offset) { + if (this.lineRange.isEmpty) { + return new Position(this.lineRange.start + 1, 1); + } + const i = findLastIdxMonotonous(this.firstCharOffsetByLine, (value) => value <= offset); + return new Position(this.lineRange.start + i + 1, offset - this.firstCharOffsetByLine[i] + this.additionalOffsetByLine[i] + 1); + } + translateRange(range2) { + return Range.fromPositions(this.translateOffset(range2.start), this.translateOffset(range2.endExclusive)); + } + /** + * Finds the word that contains the character at the given offset + */ + findWordContaining(offset) { + if (offset < 0 || offset >= this.elements.length) { + return void 0; + } + if (!isWordChar(this.elements[offset])) { + return void 0; + } + let start = offset; + while (start > 0 && isWordChar(this.elements[start - 1])) { + start--; + } + let end = offset; + while (end < this.elements.length && isWordChar(this.elements[end])) { + end++; + } + return new OffsetRange(start, end); + } + countLinesIn(range2) { + return this.translateOffset(range2.endExclusive).lineNumber - this.translateOffset(range2.start).lineNumber; + } + isStronglyEqual(offset1, offset2) { + return this.elements[offset1] === this.elements[offset2]; + } + extendToFullLines(range2) { + var _a10, _b4; + const start = (_a10 = findLastMonotonous(this.firstCharOffsetByLine, (x) => x <= range2.start)) !== null && _a10 !== void 0 ? _a10 : 0; + const end = (_b4 = findFirstMonotonous(this.firstCharOffsetByLine, (x) => range2.endExclusive <= x)) !== null && _b4 !== void 0 ? _b4 : this.elements.length; + return new OffsetRange(start, end); + } + }; + score = { + [ + 0 + /* CharBoundaryCategory.WordLower */ + ]: 0, + [ + 1 + /* CharBoundaryCategory.WordUpper */ + ]: 0, + [ + 2 + /* CharBoundaryCategory.WordNumber */ + ]: 0, + [ + 3 + /* CharBoundaryCategory.End */ + ]: 10, + [ + 4 + /* CharBoundaryCategory.Other */ + ]: 2, + [ + 5 + /* CharBoundaryCategory.Separator */ + ]: 30, + [ + 6 + /* CharBoundaryCategory.Space */ + ]: 3, + [ + 7 + /* CharBoundaryCategory.LineBreakCR */ + ]: 10, + [ + 8 + /* CharBoundaryCategory.LineBreakLF */ + ]: 10 + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/computeMovedLines.js +function computeMovedLines(changes, originalLines, modifiedLines, hashedOriginalLines, hashedModifiedLines, timeout2) { + let { moves, excludedChanges } = computeMovesFromSimpleDeletionsToSimpleInsertions(changes, originalLines, modifiedLines, timeout2); + if (!timeout2.isValid()) { + return []; + } + const filteredChanges = changes.filter((c) => !excludedChanges.has(c)); + const unchangedMoves = computeUnchangedMoves(filteredChanges, hashedOriginalLines, hashedModifiedLines, originalLines, modifiedLines, timeout2); + pushMany(moves, unchangedMoves); + moves = joinCloseConsecutiveMoves(moves); + moves = moves.filter((current) => { + const lines = current.original.toOffsetRange().slice(originalLines).map((l) => l.trim()); + const originalText = lines.join("\n"); + return originalText.length >= 15 && countWhere(lines, (l) => l.length >= 2) >= 2; + }); + moves = removeMovesInSameDiff(changes, moves); + return moves; +} +function countWhere(arr, predicate) { + let count = 0; + for (const t4 of arr) { + if (predicate(t4)) { + count++; + } + } + return count; +} +function computeMovesFromSimpleDeletionsToSimpleInsertions(changes, originalLines, modifiedLines, timeout2) { + const moves = []; + const deletions = changes.filter((c) => c.modified.isEmpty && c.original.length >= 3).map((d) => new LineRangeFragment(d.original, originalLines, d)); + const insertions = new Set(changes.filter((c) => c.original.isEmpty && c.modified.length >= 3).map((d) => new LineRangeFragment(d.modified, modifiedLines, d))); + const excludedChanges = /* @__PURE__ */ new Set(); + for (const deletion of deletions) { + let highestSimilarity = -1; + let best; + for (const insertion of insertions) { + const similarity = deletion.computeSimilarity(insertion); + if (similarity > highestSimilarity) { + highestSimilarity = similarity; + best = insertion; + } + } + if (highestSimilarity > 0.9 && best) { + insertions.delete(best); + moves.push(new LineRangeMapping(deletion.range, best.range)); + excludedChanges.add(deletion.source); + excludedChanges.add(best.source); + } + if (!timeout2.isValid()) { + return { moves, excludedChanges }; + } + } + return { moves, excludedChanges }; +} +function computeUnchangedMoves(changes, hashedOriginalLines, hashedModifiedLines, originalLines, modifiedLines, timeout2) { + const moves = []; + const original3LineHashes = new SetMap(); + for (const change of changes) { + for (let i = change.original.startLineNumber; i < change.original.endLineNumberExclusive - 2; i++) { + const key = `${hashedOriginalLines[i - 1]}:${hashedOriginalLines[i + 1 - 1]}:${hashedOriginalLines[i + 2 - 1]}`; + original3LineHashes.add(key, { range: new LineRange(i, i + 3) }); + } + } + const possibleMappings = []; + changes.sort(compareBy((c) => c.modified.startLineNumber, numberComparator)); + for (const change of changes) { + let lastMappings = []; + for (let i = change.modified.startLineNumber; i < change.modified.endLineNumberExclusive - 2; i++) { + const key = `${hashedModifiedLines[i - 1]}:${hashedModifiedLines[i + 1 - 1]}:${hashedModifiedLines[i + 2 - 1]}`; + const currentModifiedRange = new LineRange(i, i + 3); + const nextMappings = []; + original3LineHashes.forEach(key, ({ range: range2 }) => { + for (const lastMapping of lastMappings) { + if (lastMapping.originalLineRange.endLineNumberExclusive + 1 === range2.endLineNumberExclusive && lastMapping.modifiedLineRange.endLineNumberExclusive + 1 === currentModifiedRange.endLineNumberExclusive) { + lastMapping.originalLineRange = new LineRange(lastMapping.originalLineRange.startLineNumber, range2.endLineNumberExclusive); + lastMapping.modifiedLineRange = new LineRange(lastMapping.modifiedLineRange.startLineNumber, currentModifiedRange.endLineNumberExclusive); + nextMappings.push(lastMapping); + return; + } + } + const mapping = { + modifiedLineRange: currentModifiedRange, + originalLineRange: range2 + }; + possibleMappings.push(mapping); + nextMappings.push(mapping); + }); + lastMappings = nextMappings; + } + if (!timeout2.isValid()) { + return []; + } + } + possibleMappings.sort(reverseOrder(compareBy((m) => m.modifiedLineRange.length, numberComparator))); + const modifiedSet = new LineRangeSet(); + const originalSet = new LineRangeSet(); + for (const mapping of possibleMappings) { + const diffOrigToMod = mapping.modifiedLineRange.startLineNumber - mapping.originalLineRange.startLineNumber; + const modifiedSections = modifiedSet.subtractFrom(mapping.modifiedLineRange); + const originalTranslatedSections = originalSet.subtractFrom(mapping.originalLineRange).getWithDelta(diffOrigToMod); + const modifiedIntersectedSections = modifiedSections.getIntersection(originalTranslatedSections); + for (const s of modifiedIntersectedSections.ranges) { + if (s.length < 3) { + continue; + } + const modifiedLineRange = s; + const originalLineRange = s.delta(-diffOrigToMod); + moves.push(new LineRangeMapping(originalLineRange, modifiedLineRange)); + modifiedSet.addRange(modifiedLineRange); + originalSet.addRange(originalLineRange); + } + } + moves.sort(compareBy((m) => m.original.startLineNumber, numberComparator)); + const monotonousChanges = new MonotonousArray(changes); + for (let i = 0; i < moves.length; i++) { + const move = moves[i]; + const firstTouchingChangeOrig = monotonousChanges.findLastMonotonous((c) => c.original.startLineNumber <= move.original.startLineNumber); + const firstTouchingChangeMod = findLastMonotonous(changes, (c) => c.modified.startLineNumber <= move.modified.startLineNumber); + const linesAbove = Math.max(move.original.startLineNumber - firstTouchingChangeOrig.original.startLineNumber, move.modified.startLineNumber - firstTouchingChangeMod.modified.startLineNumber); + const lastTouchingChangeOrig = monotonousChanges.findLastMonotonous((c) => c.original.startLineNumber < move.original.endLineNumberExclusive); + const lastTouchingChangeMod = findLastMonotonous(changes, (c) => c.modified.startLineNumber < move.modified.endLineNumberExclusive); + const linesBelow = Math.max(lastTouchingChangeOrig.original.endLineNumberExclusive - move.original.endLineNumberExclusive, lastTouchingChangeMod.modified.endLineNumberExclusive - move.modified.endLineNumberExclusive); + let extendToTop; + for (extendToTop = 0; extendToTop < linesAbove; extendToTop++) { + const origLine = move.original.startLineNumber - extendToTop - 1; + const modLine = move.modified.startLineNumber - extendToTop - 1; + if (origLine > originalLines.length || modLine > modifiedLines.length) { + break; + } + if (modifiedSet.contains(modLine) || originalSet.contains(origLine)) { + break; + } + if (!areLinesSimilar(originalLines[origLine - 1], modifiedLines[modLine - 1], timeout2)) { + break; + } + } + if (extendToTop > 0) { + originalSet.addRange(new LineRange(move.original.startLineNumber - extendToTop, move.original.startLineNumber)); + modifiedSet.addRange(new LineRange(move.modified.startLineNumber - extendToTop, move.modified.startLineNumber)); + } + let extendToBottom; + for (extendToBottom = 0; extendToBottom < linesBelow; extendToBottom++) { + const origLine = move.original.endLineNumberExclusive + extendToBottom; + const modLine = move.modified.endLineNumberExclusive + extendToBottom; + if (origLine > originalLines.length || modLine > modifiedLines.length) { + break; + } + if (modifiedSet.contains(modLine) || originalSet.contains(origLine)) { + break; + } + if (!areLinesSimilar(originalLines[origLine - 1], modifiedLines[modLine - 1], timeout2)) { + break; + } + } + if (extendToBottom > 0) { + originalSet.addRange(new LineRange(move.original.endLineNumberExclusive, move.original.endLineNumberExclusive + extendToBottom)); + modifiedSet.addRange(new LineRange(move.modified.endLineNumberExclusive, move.modified.endLineNumberExclusive + extendToBottom)); + } + if (extendToTop > 0 || extendToBottom > 0) { + moves[i] = new LineRangeMapping(new LineRange(move.original.startLineNumber - extendToTop, move.original.endLineNumberExclusive + extendToBottom), new LineRange(move.modified.startLineNumber - extendToTop, move.modified.endLineNumberExclusive + extendToBottom)); + } + } + return moves; +} +function areLinesSimilar(line1, line2, timeout2) { + if (line1.trim() === line2.trim()) { + return true; + } + if (line1.length > 300 && line2.length > 300) { + return false; + } + const myersDiffingAlgorithm = new MyersDiffAlgorithm(); + const result = myersDiffingAlgorithm.compute(new LinesSliceCharSequence([line1], new OffsetRange(0, 1), false), new LinesSliceCharSequence([line2], new OffsetRange(0, 1), false), timeout2); + let commonNonSpaceCharCount = 0; + const inverted = SequenceDiff.invert(result.diffs, line1.length); + for (const seq of inverted) { + seq.seq1Range.forEach((idx) => { + if (!isSpace(line1.charCodeAt(idx))) { + commonNonSpaceCharCount++; + } + }); + } + function countNonWsChars(str) { + let count = 0; + for (let i = 0; i < line1.length; i++) { + if (!isSpace(str.charCodeAt(i))) { + count++; + } + } + return count; + } + const longerLineLength = countNonWsChars(line1.length > line2.length ? line1 : line2); + const r = commonNonSpaceCharCount / longerLineLength > 0.6 && longerLineLength > 10; + return r; +} +function joinCloseConsecutiveMoves(moves) { + if (moves.length === 0) { + return moves; + } + moves.sort(compareBy((m) => m.original.startLineNumber, numberComparator)); + const result = [moves[0]]; + for (let i = 1; i < moves.length; i++) { + const last = result[result.length - 1]; + const current = moves[i]; + const originalDist = current.original.startLineNumber - last.original.endLineNumberExclusive; + const modifiedDist = current.modified.startLineNumber - last.modified.endLineNumberExclusive; + const currentMoveAfterLast = originalDist >= 0 && modifiedDist >= 0; + if (currentMoveAfterLast && originalDist + modifiedDist <= 2) { + result[result.length - 1] = last.join(current); + continue; + } + result.push(current); + } + return result; +} +function removeMovesInSameDiff(changes, moves) { + const changesMonotonous = new MonotonousArray(changes); + moves = moves.filter((m) => { + const diffBeforeEndOfMoveOriginal = changesMonotonous.findLastMonotonous((c) => c.original.startLineNumber < m.original.endLineNumberExclusive) || new LineRangeMapping(new LineRange(1, 1), new LineRange(1, 1)); + const diffBeforeEndOfMoveModified = findLastMonotonous(changes, (c) => c.modified.startLineNumber < m.modified.endLineNumberExclusive); + const differentDiffs = diffBeforeEndOfMoveOriginal !== diffBeforeEndOfMoveModified; + return differentDiffs; + }); + return moves; +} +var init_computeMovedLines = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/computeMovedLines.js"() { + init_diffAlgorithm(); + init_rangeMapping(); + init_arrays(); + init_arraysFind(); + init_map(); + init_lineRange(); + init_offsetRange(); + init_linesSliceCharSequence(); + init_utils(); + init_myersDiffAlgorithm(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/heuristicSequenceOptimizations.js +function optimizeSequenceDiffs(sequence1, sequence2, sequenceDiffs) { + let result = sequenceDiffs; + result = joinSequenceDiffsByShifting(sequence1, sequence2, result); + result = joinSequenceDiffsByShifting(sequence1, sequence2, result); + result = shiftSequenceDiffs(sequence1, sequence2, result); + return result; +} +function joinSequenceDiffsByShifting(sequence1, sequence2, sequenceDiffs) { + if (sequenceDiffs.length === 0) { + return sequenceDiffs; + } + const result = []; + result.push(sequenceDiffs[0]); + for (let i = 1; i < sequenceDiffs.length; i++) { + const prevResult = result[result.length - 1]; + let cur = sequenceDiffs[i]; + if (cur.seq1Range.isEmpty || cur.seq2Range.isEmpty) { + const length = cur.seq1Range.start - prevResult.seq1Range.endExclusive; + let d; + for (d = 1; d <= length; d++) { + if (sequence1.getElement(cur.seq1Range.start - d) !== sequence1.getElement(cur.seq1Range.endExclusive - d) || sequence2.getElement(cur.seq2Range.start - d) !== sequence2.getElement(cur.seq2Range.endExclusive - d)) { + break; + } + } + d--; + if (d === length) { + result[result.length - 1] = new SequenceDiff(new OffsetRange(prevResult.seq1Range.start, cur.seq1Range.endExclusive - length), new OffsetRange(prevResult.seq2Range.start, cur.seq2Range.endExclusive - length)); + continue; + } + cur = cur.delta(-d); + } + result.push(cur); + } + const result2 = []; + for (let i = 0; i < result.length - 1; i++) { + const nextResult = result[i + 1]; + let cur = result[i]; + if (cur.seq1Range.isEmpty || cur.seq2Range.isEmpty) { + const length = nextResult.seq1Range.start - cur.seq1Range.endExclusive; + let d; + for (d = 0; d < length; d++) { + if (!sequence1.isStronglyEqual(cur.seq1Range.start + d, cur.seq1Range.endExclusive + d) || !sequence2.isStronglyEqual(cur.seq2Range.start + d, cur.seq2Range.endExclusive + d)) { + break; + } + } + if (d === length) { + result[i + 1] = new SequenceDiff(new OffsetRange(cur.seq1Range.start + length, nextResult.seq1Range.endExclusive), new OffsetRange(cur.seq2Range.start + length, nextResult.seq2Range.endExclusive)); + continue; + } + if (d > 0) { + cur = cur.delta(d); + } + } + result2.push(cur); + } + if (result.length > 0) { + result2.push(result[result.length - 1]); + } + return result2; +} +function shiftSequenceDiffs(sequence1, sequence2, sequenceDiffs) { + if (!sequence1.getBoundaryScore || !sequence2.getBoundaryScore) { + return sequenceDiffs; + } + for (let i = 0; i < sequenceDiffs.length; i++) { + const prevDiff = i > 0 ? sequenceDiffs[i - 1] : void 0; + const diff = sequenceDiffs[i]; + const nextDiff = i + 1 < sequenceDiffs.length ? sequenceDiffs[i + 1] : void 0; + const seq1ValidRange = new OffsetRange(prevDiff ? prevDiff.seq1Range.endExclusive + 1 : 0, nextDiff ? nextDiff.seq1Range.start - 1 : sequence1.length); + const seq2ValidRange = new OffsetRange(prevDiff ? prevDiff.seq2Range.endExclusive + 1 : 0, nextDiff ? nextDiff.seq2Range.start - 1 : sequence2.length); + if (diff.seq1Range.isEmpty) { + sequenceDiffs[i] = shiftDiffToBetterPosition(diff, sequence1, sequence2, seq1ValidRange, seq2ValidRange); + } else if (diff.seq2Range.isEmpty) { + sequenceDiffs[i] = shiftDiffToBetterPosition(diff.swap(), sequence2, sequence1, seq2ValidRange, seq1ValidRange).swap(); + } + } + return sequenceDiffs; +} +function shiftDiffToBetterPosition(diff, sequence1, sequence2, seq1ValidRange, seq2ValidRange) { + const maxShiftLimit = 100; + let deltaBefore = 1; + while (diff.seq1Range.start - deltaBefore >= seq1ValidRange.start && diff.seq2Range.start - deltaBefore >= seq2ValidRange.start && sequence2.isStronglyEqual(diff.seq2Range.start - deltaBefore, diff.seq2Range.endExclusive - deltaBefore) && deltaBefore < maxShiftLimit) { + deltaBefore++; + } + deltaBefore--; + let deltaAfter = 0; + while (diff.seq1Range.start + deltaAfter < seq1ValidRange.endExclusive && diff.seq2Range.endExclusive + deltaAfter < seq2ValidRange.endExclusive && sequence2.isStronglyEqual(diff.seq2Range.start + deltaAfter, diff.seq2Range.endExclusive + deltaAfter) && deltaAfter < maxShiftLimit) { + deltaAfter++; + } + if (deltaBefore === 0 && deltaAfter === 0) { + return diff; + } + let bestDelta = 0; + let bestScore = -1; + for (let delta = -deltaBefore; delta <= deltaAfter; delta++) { + const seq2OffsetStart = diff.seq2Range.start + delta; + const seq2OffsetEndExclusive = diff.seq2Range.endExclusive + delta; + const seq1Offset = diff.seq1Range.start + delta; + const score3 = sequence1.getBoundaryScore(seq1Offset) + sequence2.getBoundaryScore(seq2OffsetStart) + sequence2.getBoundaryScore(seq2OffsetEndExclusive); + if (score3 > bestScore) { + bestScore = score3; + bestDelta = delta; + } + } + return diff.delta(bestDelta); +} +function removeShortMatches(sequence1, sequence2, sequenceDiffs) { + const result = []; + for (const s of sequenceDiffs) { + const last = result[result.length - 1]; + if (!last) { + result.push(s); + continue; + } + if (s.seq1Range.start - last.seq1Range.endExclusive <= 2 || s.seq2Range.start - last.seq2Range.endExclusive <= 2) { + result[result.length - 1] = new SequenceDiff(last.seq1Range.join(s.seq1Range), last.seq2Range.join(s.seq2Range)); + } else { + result.push(s); + } + } + return result; +} +function extendDiffsToEntireWordIfAppropriate(sequence1, sequence2, sequenceDiffs) { + const equalMappings = SequenceDiff.invert(sequenceDiffs, sequence1.length); + const additional = []; + let lastPoint = new OffsetPair(0, 0); + function scanWord(pair, equalMapping) { + if (pair.offset1 < lastPoint.offset1 || pair.offset2 < lastPoint.offset2) { + return; + } + const w1 = sequence1.findWordContaining(pair.offset1); + const w2 = sequence2.findWordContaining(pair.offset2); + if (!w1 || !w2) { + return; + } + let w = new SequenceDiff(w1, w2); + const equalPart = w.intersect(equalMapping); + let equalChars1 = equalPart.seq1Range.length; + let equalChars2 = equalPart.seq2Range.length; + while (equalMappings.length > 0) { + const next = equalMappings[0]; + const intersects2 = next.seq1Range.intersects(w.seq1Range) || next.seq2Range.intersects(w.seq2Range); + if (!intersects2) { + break; + } + const v1 = sequence1.findWordContaining(next.seq1Range.start); + const v2 = sequence2.findWordContaining(next.seq2Range.start); + const v = new SequenceDiff(v1, v2); + const equalPart2 = v.intersect(next); + equalChars1 += equalPart2.seq1Range.length; + equalChars2 += equalPart2.seq2Range.length; + w = w.join(v); + if (w.seq1Range.endExclusive >= next.seq1Range.endExclusive) { + equalMappings.shift(); + } else { + break; + } + } + if (equalChars1 + equalChars2 < (w.seq1Range.length + w.seq2Range.length) * 2 / 3) { + additional.push(w); + } + lastPoint = w.getEndExclusives(); + } + while (equalMappings.length > 0) { + const next = equalMappings.shift(); + if (next.seq1Range.isEmpty) { + continue; + } + scanWord(next.getStarts(), next); + scanWord(next.getEndExclusives().delta(-1), next); + } + const merged = mergeSequenceDiffs(sequenceDiffs, additional); + return merged; +} +function mergeSequenceDiffs(sequenceDiffs1, sequenceDiffs2) { + const result = []; + while (sequenceDiffs1.length > 0 || sequenceDiffs2.length > 0) { + const sd1 = sequenceDiffs1[0]; + const sd2 = sequenceDiffs2[0]; + let next; + if (sd1 && (!sd2 || sd1.seq1Range.start < sd2.seq1Range.start)) { + next = sequenceDiffs1.shift(); + } else { + next = sequenceDiffs2.shift(); + } + if (result.length > 0 && result[result.length - 1].seq1Range.endExclusive >= next.seq1Range.start) { + result[result.length - 1] = result[result.length - 1].join(next); + } else { + result.push(next); + } + } + return result; +} +function removeVeryShortMatchingLinesBetweenDiffs(sequence1, _sequence2, sequenceDiffs) { + let diffs = sequenceDiffs; + if (diffs.length === 0) { + return diffs; + } + let counter = 0; + let shouldRepeat; + do { + shouldRepeat = false; + const result = [ + diffs[0] + ]; + for (let i = 1; i < diffs.length; i++) { + let shouldJoinDiffs = function(before, after2) { + const unchangedRange = new OffsetRange(lastResult.seq1Range.endExclusive, cur.seq1Range.start); + const unchangedText = sequence1.getText(unchangedRange); + const unchangedTextWithoutWs = unchangedText.replace(/\s/g, ""); + if (unchangedTextWithoutWs.length <= 4 && (before.seq1Range.length + before.seq2Range.length > 5 || after2.seq1Range.length + after2.seq2Range.length > 5)) { + return true; + } + return false; + }; + const cur = diffs[i]; + const lastResult = result[result.length - 1]; + const shouldJoin = shouldJoinDiffs(lastResult, cur); + if (shouldJoin) { + shouldRepeat = true; + result[result.length - 1] = result[result.length - 1].join(cur); + } else { + result.push(cur); + } + } + diffs = result; + } while (counter++ < 10 && shouldRepeat); + return diffs; +} +function removeVeryShortMatchingTextBetweenLongDiffs(sequence1, sequence2, sequenceDiffs) { + let diffs = sequenceDiffs; + if (diffs.length === 0) { + return diffs; + } + let counter = 0; + let shouldRepeat; + do { + shouldRepeat = false; + const result = [ + diffs[0] + ]; + for (let i = 1; i < diffs.length; i++) { + let shouldJoinDiffs = function(before, after2) { + const unchangedRange = new OffsetRange(lastResult.seq1Range.endExclusive, cur.seq1Range.start); + const unchangedLineCount = sequence1.countLinesIn(unchangedRange); + if (unchangedLineCount > 5 || unchangedRange.length > 500) { + return false; + } + const unchangedText = sequence1.getText(unchangedRange).trim(); + if (unchangedText.length > 20 || unchangedText.split(/\r\n|\r|\n/).length > 1) { + return false; + } + const beforeLineCount1 = sequence1.countLinesIn(before.seq1Range); + const beforeSeq1Length = before.seq1Range.length; + const beforeLineCount2 = sequence2.countLinesIn(before.seq2Range); + const beforeSeq2Length = before.seq2Range.length; + const afterLineCount1 = sequence1.countLinesIn(after2.seq1Range); + const afterSeq1Length = after2.seq1Range.length; + const afterLineCount2 = sequence2.countLinesIn(after2.seq2Range); + const afterSeq2Length = after2.seq2Range.length; + const max = 2 * 40 + 50; + function cap(v) { + return Math.min(v, max); + } + if (Math.pow(Math.pow(cap(beforeLineCount1 * 40 + beforeSeq1Length), 1.5) + Math.pow(cap(beforeLineCount2 * 40 + beforeSeq2Length), 1.5), 1.5) + Math.pow(Math.pow(cap(afterLineCount1 * 40 + afterSeq1Length), 1.5) + Math.pow(cap(afterLineCount2 * 40 + afterSeq2Length), 1.5), 1.5) > __pow(__pow(max, 1.5), 1.5) * 1.3) { + return true; + } + return false; + }; + const cur = diffs[i]; + const lastResult = result[result.length - 1]; + const shouldJoin = shouldJoinDiffs(lastResult, cur); + if (shouldJoin) { + shouldRepeat = true; + result[result.length - 1] = result[result.length - 1].join(cur); + } else { + result.push(cur); + } + } + diffs = result; + } while (counter++ < 10 && shouldRepeat); + const newDiffs = []; + forEachWithNeighbors(diffs, (prev, cur, next) => { + let newDiff = cur; + function shouldMarkAsChanged(text2) { + return text2.length > 0 && text2.trim().length <= 3 && cur.seq1Range.length + cur.seq2Range.length > 100; + } + const fullRange1 = sequence1.extendToFullLines(cur.seq1Range); + const prefix = sequence1.getText(new OffsetRange(fullRange1.start, cur.seq1Range.start)); + if (shouldMarkAsChanged(prefix)) { + newDiff = newDiff.deltaStart(-prefix.length); + } + const suffix = sequence1.getText(new OffsetRange(cur.seq1Range.endExclusive, fullRange1.endExclusive)); + if (shouldMarkAsChanged(suffix)) { + newDiff = newDiff.deltaEnd(suffix.length); + } + const availableSpace = SequenceDiff.fromOffsetPairs(prev ? prev.getEndExclusives() : OffsetPair.zero, next ? next.getStarts() : OffsetPair.max); + const result = newDiff.intersect(availableSpace); + if (newDiffs.length > 0 && result.getStarts().equals(newDiffs[newDiffs.length - 1].getEndExclusives())) { + newDiffs[newDiffs.length - 1] = newDiffs[newDiffs.length - 1].join(result); + } else { + newDiffs.push(result); + } + }); + return newDiffs; +} +var init_heuristicSequenceOptimizations = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/heuristicSequenceOptimizations.js"() { + init_arrays(); + init_offsetRange(); + init_diffAlgorithm(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/lineSequence.js +function getIndentation(str) { + let i = 0; + while (i < str.length && (str.charCodeAt(i) === 32 || str.charCodeAt(i) === 9)) { + i++; + } + return i; +} +var LineSequence2; +var init_lineSequence = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/lineSequence.js"() { + LineSequence2 = class { + constructor(trimmedHash, lines) { + this.trimmedHash = trimmedHash; + this.lines = lines; + } + getElement(offset) { + return this.trimmedHash[offset]; + } + get length() { + return this.trimmedHash.length; + } + getBoundaryScore(length) { + const indentationBefore = length === 0 ? 0 : getIndentation(this.lines[length - 1]); + const indentationAfter = length === this.lines.length ? 0 : getIndentation(this.lines[length]); + return 1e3 - (indentationBefore + indentationAfter); + } + getText(range2) { + return this.lines.slice(range2.start, range2.endExclusive).join("\n"); + } + isStronglyEqual(offset1, offset2) { + return this.lines[offset1] === this.lines[offset2]; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer.js +function lineRangeMappingFromRangeMappings(alignments, originalLines, modifiedLines, dontAssertStartLine = false) { + const changes = []; + for (const g of groupAdjacentBy(alignments.map((a3) => getLineRangeMapping(a3, originalLines, modifiedLines)), (a1, a22) => a1.original.overlapOrTouch(a22.original) || a1.modified.overlapOrTouch(a22.modified))) { + const first2 = g[0]; + const last = g[g.length - 1]; + changes.push(new DetailedLineRangeMapping(first2.original.join(last.original), first2.modified.join(last.modified), g.map((a3) => a3.innerChanges[0]))); + } + assertFn(() => { + if (!dontAssertStartLine && changes.length > 0) { + if (changes[0].modified.startLineNumber !== changes[0].original.startLineNumber) { + return false; + } + if (modifiedLines.length - changes[changes.length - 1].modified.endLineNumberExclusive !== originalLines.length - changes[changes.length - 1].original.endLineNumberExclusive) { + return false; + } + } + return checkAdjacentItems(changes, (m1, m2) => m2.original.startLineNumber - m1.original.endLineNumberExclusive === m2.modified.startLineNumber - m1.modified.endLineNumberExclusive && // There has to be an unchanged line in between (otherwise both diffs should have been joined) + m1.original.endLineNumberExclusive < m2.original.startLineNumber && m1.modified.endLineNumberExclusive < m2.modified.startLineNumber); + }); + return changes; +} +function getLineRangeMapping(rangeMapping, originalLines, modifiedLines) { + let lineStartDelta = 0; + let lineEndDelta = 0; + if (rangeMapping.modifiedRange.endColumn === 1 && rangeMapping.originalRange.endColumn === 1 && rangeMapping.originalRange.startLineNumber + lineStartDelta <= rangeMapping.originalRange.endLineNumber && rangeMapping.modifiedRange.startLineNumber + lineStartDelta <= rangeMapping.modifiedRange.endLineNumber) { + lineEndDelta = -1; + } + if (rangeMapping.modifiedRange.startColumn - 1 >= modifiedLines[rangeMapping.modifiedRange.startLineNumber - 1].length && rangeMapping.originalRange.startColumn - 1 >= originalLines[rangeMapping.originalRange.startLineNumber - 1].length && rangeMapping.originalRange.startLineNumber <= rangeMapping.originalRange.endLineNumber + lineEndDelta && rangeMapping.modifiedRange.startLineNumber <= rangeMapping.modifiedRange.endLineNumber + lineEndDelta) { + lineStartDelta = 1; + } + const originalLineRange = new LineRange(rangeMapping.originalRange.startLineNumber + lineStartDelta, rangeMapping.originalRange.endLineNumber + 1 + lineEndDelta); + const modifiedLineRange = new LineRange(rangeMapping.modifiedRange.startLineNumber + lineStartDelta, rangeMapping.modifiedRange.endLineNumber + 1 + lineEndDelta); + return new DetailedLineRangeMapping(originalLineRange, modifiedLineRange, [rangeMapping]); +} +var DefaultLinesDiffComputer; +var init_defaultLinesDiffComputer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer.js"() { + init_arrays(); + init_assert(); + init_lineRange(); + init_offsetRange(); + init_range(); + init_diffAlgorithm(); + init_dynamicProgrammingDiffing(); + init_myersDiffAlgorithm(); + init_computeMovedLines(); + init_heuristicSequenceOptimizations(); + init_lineSequence(); + init_linesSliceCharSequence(); + init_linesDiffComputer(); + init_rangeMapping(); + DefaultLinesDiffComputer = class { + constructor() { + this.dynamicProgrammingDiffing = new DynamicProgrammingDiffing(); + this.myersDiffingAlgorithm = new MyersDiffAlgorithm(); + } + computeDiff(originalLines, modifiedLines, options2) { + if (originalLines.length <= 1 && equals(originalLines, modifiedLines, (a3, b) => a3 === b)) { + return new LinesDiff([], [], false); + } + if (originalLines.length === 1 && originalLines[0].length === 0 || modifiedLines.length === 1 && modifiedLines[0].length === 0) { + return new LinesDiff([ + new DetailedLineRangeMapping(new LineRange(1, originalLines.length + 1), new LineRange(1, modifiedLines.length + 1), [ + new RangeMapping(new Range(1, 1, originalLines.length, originalLines[originalLines.length - 1].length + 1), new Range(1, 1, modifiedLines.length, modifiedLines[modifiedLines.length - 1].length + 1)) + ]) + ], [], false); + } + const timeout2 = options2.maxComputationTimeMs === 0 ? InfiniteTimeout.instance : new DateTimeout(options2.maxComputationTimeMs); + const considerWhitespaceChanges = !options2.ignoreTrimWhitespace; + const perfectHashes = /* @__PURE__ */ new Map(); + function getOrCreateHash(text2) { + let hash2 = perfectHashes.get(text2); + if (hash2 === void 0) { + hash2 = perfectHashes.size; + perfectHashes.set(text2, hash2); + } + return hash2; + } + const originalLinesHashes = originalLines.map((l) => getOrCreateHash(l.trim())); + const modifiedLinesHashes = modifiedLines.map((l) => getOrCreateHash(l.trim())); + const sequence1 = new LineSequence2(originalLinesHashes, originalLines); + const sequence2 = new LineSequence2(modifiedLinesHashes, modifiedLines); + const lineAlignmentResult = (() => { + if (sequence1.length + sequence2.length < 1700) { + return this.dynamicProgrammingDiffing.compute(sequence1, sequence2, timeout2, (offset1, offset2) => originalLines[offset1] === modifiedLines[offset2] ? modifiedLines[offset2].length === 0 ? 0.1 : 1 + Math.log(1 + modifiedLines[offset2].length) : 0.99); + } + return this.myersDiffingAlgorithm.compute(sequence1, sequence2, timeout2); + })(); + let lineAlignments = lineAlignmentResult.diffs; + let hitTimeout = lineAlignmentResult.hitTimeout; + lineAlignments = optimizeSequenceDiffs(sequence1, sequence2, lineAlignments); + lineAlignments = removeVeryShortMatchingLinesBetweenDiffs(sequence1, sequence2, lineAlignments); + const alignments = []; + const scanForWhitespaceChanges = (equalLinesCount) => { + if (!considerWhitespaceChanges) { + return; + } + for (let i = 0; i < equalLinesCount; i++) { + const seq1Offset = seq1LastStart + i; + const seq2Offset = seq2LastStart + i; + if (originalLines[seq1Offset] !== modifiedLines[seq2Offset]) { + const characterDiffs = this.refineDiff(originalLines, modifiedLines, new SequenceDiff(new OffsetRange(seq1Offset, seq1Offset + 1), new OffsetRange(seq2Offset, seq2Offset + 1)), timeout2, considerWhitespaceChanges); + for (const a3 of characterDiffs.mappings) { + alignments.push(a3); + } + if (characterDiffs.hitTimeout) { + hitTimeout = true; + } + } + } + }; + let seq1LastStart = 0; + let seq2LastStart = 0; + for (const diff of lineAlignments) { + assertFn(() => diff.seq1Range.start - seq1LastStart === diff.seq2Range.start - seq2LastStart); + const equalLinesCount = diff.seq1Range.start - seq1LastStart; + scanForWhitespaceChanges(equalLinesCount); + seq1LastStart = diff.seq1Range.endExclusive; + seq2LastStart = diff.seq2Range.endExclusive; + const characterDiffs = this.refineDiff(originalLines, modifiedLines, diff, timeout2, considerWhitespaceChanges); + if (characterDiffs.hitTimeout) { + hitTimeout = true; + } + for (const a3 of characterDiffs.mappings) { + alignments.push(a3); + } + } + scanForWhitespaceChanges(originalLines.length - seq1LastStart); + const changes = lineRangeMappingFromRangeMappings(alignments, originalLines, modifiedLines); + let moves = []; + if (options2.computeMoves) { + moves = this.computeMoves(changes, originalLines, modifiedLines, originalLinesHashes, modifiedLinesHashes, timeout2, considerWhitespaceChanges); + } + assertFn(() => { + function validatePosition(pos, lines) { + if (pos.lineNumber < 1 || pos.lineNumber > lines.length) { + return false; + } + const line = lines[pos.lineNumber - 1]; + if (pos.column < 1 || pos.column > line.length + 1) { + return false; + } + return true; + } + function validateRange(range2, lines) { + if (range2.startLineNumber < 1 || range2.startLineNumber > lines.length + 1) { + return false; + } + if (range2.endLineNumberExclusive < 1 || range2.endLineNumberExclusive > lines.length + 1) { + return false; + } + return true; + } + for (const c of changes) { + if (!c.innerChanges) { + return false; + } + for (const ic of c.innerChanges) { + const valid = validatePosition(ic.modifiedRange.getStartPosition(), modifiedLines) && validatePosition(ic.modifiedRange.getEndPosition(), modifiedLines) && validatePosition(ic.originalRange.getStartPosition(), originalLines) && validatePosition(ic.originalRange.getEndPosition(), originalLines); + if (!valid) { + return false; + } + } + if (!validateRange(c.modified, modifiedLines) || !validateRange(c.original, originalLines)) { + return false; + } + } + return true; + }); + return new LinesDiff(changes, moves, hitTimeout); + } + computeMoves(changes, originalLines, modifiedLines, hashedOriginalLines, hashedModifiedLines, timeout2, considerWhitespaceChanges) { + const moves = computeMovedLines(changes, originalLines, modifiedLines, hashedOriginalLines, hashedModifiedLines, timeout2); + const movesWithDiffs = moves.map((m) => { + const moveChanges = this.refineDiff(originalLines, modifiedLines, new SequenceDiff(m.original.toOffsetRange(), m.modified.toOffsetRange()), timeout2, considerWhitespaceChanges); + const mappings = lineRangeMappingFromRangeMappings(moveChanges.mappings, originalLines, modifiedLines, true); + return new MovedText(m, mappings); + }); + return movesWithDiffs; + } + refineDiff(originalLines, modifiedLines, diff, timeout2, considerWhitespaceChanges) { + const slice1 = new LinesSliceCharSequence(originalLines, diff.seq1Range, considerWhitespaceChanges); + const slice2 = new LinesSliceCharSequence(modifiedLines, diff.seq2Range, considerWhitespaceChanges); + const diffResult = slice1.length + slice2.length < 500 ? this.dynamicProgrammingDiffing.compute(slice1, slice2, timeout2) : this.myersDiffingAlgorithm.compute(slice1, slice2, timeout2); + let diffs = diffResult.diffs; + diffs = optimizeSequenceDiffs(slice1, slice2, diffs); + diffs = extendDiffsToEntireWordIfAppropriate(slice1, slice2, diffs); + diffs = removeShortMatches(slice1, slice2, diffs); + diffs = removeVeryShortMatchingTextBetweenLongDiffs(slice1, slice2, diffs); + const result = diffs.map((d) => new RangeMapping(slice1.translateRange(d.seq1Range), slice2.translateRange(d.seq2Range))); + return { + mappings: result, + hitTimeout: diffResult.hitTimeout + }; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/diff/linesDiffComputers.js +var linesDiffComputers; +var init_linesDiffComputers = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/diff/linesDiffComputers.js"() { + init_legacyLinesDiffComputer(); + init_defaultLinesDiffComputer(); + linesDiffComputers = { + getLegacy: () => new LegacyLinesDiffComputer(), + getDefault: () => new DefaultLinesDiffComputer() + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/color.js +function roundFloat(number, decimalPoints) { + const decimal = Math.pow(10, decimalPoints); + return Math.round(number * decimal) / decimal; +} +var RGBA, HSLA, HSVA, Color; +var init_color = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/color.js"() { + RGBA = class { + constructor(r, g, b, a3 = 1) { + this._rgbaBrand = void 0; + this.r = Math.min(255, Math.max(0, r)) | 0; + this.g = Math.min(255, Math.max(0, g)) | 0; + this.b = Math.min(255, Math.max(0, b)) | 0; + this.a = roundFloat(Math.max(Math.min(1, a3), 0), 3); + } + static equals(a3, b) { + return a3.r === b.r && a3.g === b.g && a3.b === b.b && a3.a === b.a; + } + }; + HSLA = class _HSLA { + constructor(h2, s, l, a3) { + this._hslaBrand = void 0; + this.h = Math.max(Math.min(360, h2), 0) | 0; + this.s = roundFloat(Math.max(Math.min(1, s), 0), 3); + this.l = roundFloat(Math.max(Math.min(1, l), 0), 3); + this.a = roundFloat(Math.max(Math.min(1, a3), 0), 3); + } + static equals(a3, b) { + return a3.h === b.h && a3.s === b.s && a3.l === b.l && a3.a === b.a; + } + /** + * Converts an RGB color value to HSL. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * Assumes r, g, and b are contained in the set [0, 255] and + * returns h in the set [0, 360], s, and l in the set [0, 1]. + */ + static fromRGBA(rgba) { + const r = rgba.r / 255; + const g = rgba.g / 255; + const b = rgba.b / 255; + const a3 = rgba.a; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + let h2 = 0; + let s = 0; + const l = (min + max) / 2; + const chroma = max - min; + if (chroma > 0) { + s = Math.min(l <= 0.5 ? chroma / (2 * l) : chroma / (2 - 2 * l), 1); + switch (max) { + case r: + h2 = (g - b) / chroma + (g < b ? 6 : 0); + break; + case g: + h2 = (b - r) / chroma + 2; + break; + case b: + h2 = (r - g) / chroma + 4; + break; + } + h2 *= 60; + h2 = Math.round(h2); + } + return new _HSLA(h2, s, l, a3); + } + static _hue2rgb(p, q, t4) { + if (t4 < 0) { + t4 += 1; + } + if (t4 > 1) { + t4 -= 1; + } + if (t4 < 1 / 6) { + return p + (q - p) * 6 * t4; + } + if (t4 < 1 / 2) { + return q; + } + if (t4 < 2 / 3) { + return p + (q - p) * (2 / 3 - t4) * 6; + } + return p; + } + /** + * Converts an HSL color value to RGB. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * Assumes h in the set [0, 360] s, and l are contained in the set [0, 1] and + * returns r, g, and b in the set [0, 255]. + */ + static toRGBA(hsla) { + const h2 = hsla.h / 360; + const { s, l, a: a3 } = hsla; + let r, g, b; + if (s === 0) { + r = g = b = l; + } else { + const q = l < 0.5 ? l * (1 + s) : l + s - l * s; + const p = 2 * l - q; + r = _HSLA._hue2rgb(p, q, h2 + 1 / 3); + g = _HSLA._hue2rgb(p, q, h2); + b = _HSLA._hue2rgb(p, q, h2 - 1 / 3); + } + return new RGBA(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), a3); + } + }; + HSVA = class _HSVA { + constructor(h2, s, v, a3) { + this._hsvaBrand = void 0; + this.h = Math.max(Math.min(360, h2), 0) | 0; + this.s = roundFloat(Math.max(Math.min(1, s), 0), 3); + this.v = roundFloat(Math.max(Math.min(1, v), 0), 3); + this.a = roundFloat(Math.max(Math.min(1, a3), 0), 3); + } + static equals(a3, b) { + return a3.h === b.h && a3.s === b.s && a3.v === b.v && a3.a === b.a; + } + // from http://www.rapidtables.com/convert/color/rgb-to-hsv.htm + static fromRGBA(rgba) { + const r = rgba.r / 255; + const g = rgba.g / 255; + const b = rgba.b / 255; + const cmax = Math.max(r, g, b); + const cmin = Math.min(r, g, b); + const delta = cmax - cmin; + const s = cmax === 0 ? 0 : delta / cmax; + let m; + if (delta === 0) { + m = 0; + } else if (cmax === r) { + m = ((g - b) / delta % 6 + 6) % 6; + } else if (cmax === g) { + m = (b - r) / delta + 2; + } else { + m = (r - g) / delta + 4; + } + return new _HSVA(Math.round(m * 60), s, cmax, rgba.a); + } + // from http://www.rapidtables.com/convert/color/hsv-to-rgb.htm + static toRGBA(hsva) { + const { h: h2, s, v, a: a3 } = hsva; + const c = v * s; + const x = c * (1 - Math.abs(h2 / 60 % 2 - 1)); + const m = v - c; + let [r, g, b] = [0, 0, 0]; + if (h2 < 60) { + r = c; + g = x; + } else if (h2 < 120) { + r = x; + g = c; + } else if (h2 < 180) { + g = c; + b = x; + } else if (h2 < 240) { + g = x; + b = c; + } else if (h2 < 300) { + r = x; + b = c; + } else if (h2 <= 360) { + r = c; + b = x; + } + r = Math.round((r + m) * 255); + g = Math.round((g + m) * 255); + b = Math.round((b + m) * 255); + return new RGBA(r, g, b, a3); + } + }; + Color = class _Color { + static fromHex(hex) { + return _Color.Format.CSS.parseHex(hex) || _Color.red; + } + static equals(a3, b) { + if (!a3 && !b) { + return true; + } + if (!a3 || !b) { + return false; + } + return a3.equals(b); + } + get hsla() { + if (this._hsla) { + return this._hsla; + } else { + return HSLA.fromRGBA(this.rgba); + } + } + get hsva() { + if (this._hsva) { + return this._hsva; + } + return HSVA.fromRGBA(this.rgba); + } + constructor(arg) { + if (!arg) { + throw new Error("Color needs a value"); + } else if (arg instanceof RGBA) { + this.rgba = arg; + } else if (arg instanceof HSLA) { + this._hsla = arg; + this.rgba = HSLA.toRGBA(arg); + } else if (arg instanceof HSVA) { + this._hsva = arg; + this.rgba = HSVA.toRGBA(arg); + } else { + throw new Error("Invalid color ctor argument"); + } + } + equals(other) { + return !!other && RGBA.equals(this.rgba, other.rgba) && HSLA.equals(this.hsla, other.hsla) && HSVA.equals(this.hsva, other.hsva); + } + /** + * http://www.w3.org/TR/WCAG20/#relativeluminancedef + * Returns the number in the set [0, 1]. O => Darkest Black. 1 => Lightest white. + */ + getRelativeLuminance() { + const R = _Color._relativeLuminanceForComponent(this.rgba.r); + const G = _Color._relativeLuminanceForComponent(this.rgba.g); + const B = _Color._relativeLuminanceForComponent(this.rgba.b); + const luminance = 0.2126 * R + 0.7152 * G + 0.0722 * B; + return roundFloat(luminance, 4); + } + static _relativeLuminanceForComponent(color) { + const c = color / 255; + return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4); + } + /** + * http://24ways.org/2010/calculating-color-contrast + * Return 'true' if lighter color otherwise 'false' + */ + isLighter() { + const yiq = (this.rgba.r * 299 + this.rgba.g * 587 + this.rgba.b * 114) / 1e3; + return yiq >= 128; + } + isLighterThan(another) { + const lum1 = this.getRelativeLuminance(); + const lum2 = another.getRelativeLuminance(); + return lum1 > lum2; + } + isDarkerThan(another) { + const lum1 = this.getRelativeLuminance(); + const lum2 = another.getRelativeLuminance(); + return lum1 < lum2; + } + lighten(factor2) { + return new _Color(new HSLA(this.hsla.h, this.hsla.s, this.hsla.l + this.hsla.l * factor2, this.hsla.a)); + } + darken(factor2) { + return new _Color(new HSLA(this.hsla.h, this.hsla.s, this.hsla.l - this.hsla.l * factor2, this.hsla.a)); + } + transparent(factor2) { + const { r, g, b, a: a3 } = this.rgba; + return new _Color(new RGBA(r, g, b, a3 * factor2)); + } + isTransparent() { + return this.rgba.a === 0; + } + isOpaque() { + return this.rgba.a === 1; + } + opposite() { + return new _Color(new RGBA(255 - this.rgba.r, 255 - this.rgba.g, 255 - this.rgba.b, this.rgba.a)); + } + makeOpaque(opaqueBackground) { + if (this.isOpaque() || opaqueBackground.rgba.a !== 1) { + return this; + } + const { r, g, b, a: a3 } = this.rgba; + return new _Color(new RGBA(opaqueBackground.rgba.r - a3 * (opaqueBackground.rgba.r - r), opaqueBackground.rgba.g - a3 * (opaqueBackground.rgba.g - g), opaqueBackground.rgba.b - a3 * (opaqueBackground.rgba.b - b), 1)); + } + toString() { + if (!this._toString) { + this._toString = _Color.Format.CSS.format(this); + } + return this._toString; + } + static getLighterColor(of, relative2, factor2) { + if (of.isLighterThan(relative2)) { + return of; + } + factor2 = factor2 ? factor2 : 0.5; + const lum1 = of.getRelativeLuminance(); + const lum2 = relative2.getRelativeLuminance(); + factor2 = factor2 * (lum2 - lum1) / lum2; + return of.lighten(factor2); + } + static getDarkerColor(of, relative2, factor2) { + if (of.isDarkerThan(relative2)) { + return of; + } + factor2 = factor2 ? factor2 : 0.5; + const lum1 = of.getRelativeLuminance(); + const lum2 = relative2.getRelativeLuminance(); + factor2 = factor2 * (lum1 - lum2) / lum1; + return of.darken(factor2); + } + }; + Color.white = new Color(new RGBA(255, 255, 255, 1)); + Color.black = new Color(new RGBA(0, 0, 0, 1)); + Color.red = new Color(new RGBA(255, 0, 0, 1)); + Color.blue = new Color(new RGBA(0, 0, 255, 1)); + Color.green = new Color(new RGBA(0, 255, 0, 1)); + Color.cyan = new Color(new RGBA(0, 255, 255, 1)); + Color.lightgrey = new Color(new RGBA(211, 211, 211, 1)); + Color.transparent = new Color(new RGBA(0, 0, 0, 0)); + (function(Color8) { + let Format; + (function(Format2) { + let CSS; + (function(CSS2) { + function formatRGB(color) { + if (color.rgba.a === 1) { + return `rgb(${color.rgba.r}, ${color.rgba.g}, ${color.rgba.b})`; + } + return Color8.Format.CSS.formatRGBA(color); + } + CSS2.formatRGB = formatRGB; + function formatRGBA(color) { + return `rgba(${color.rgba.r}, ${color.rgba.g}, ${color.rgba.b}, ${+color.rgba.a.toFixed(2)})`; + } + CSS2.formatRGBA = formatRGBA; + function formatHSL(color) { + if (color.hsla.a === 1) { + return `hsl(${color.hsla.h}, ${(color.hsla.s * 100).toFixed(2)}%, ${(color.hsla.l * 100).toFixed(2)}%)`; + } + return Color8.Format.CSS.formatHSLA(color); + } + CSS2.formatHSL = formatHSL; + function formatHSLA(color) { + return `hsla(${color.hsla.h}, ${(color.hsla.s * 100).toFixed(2)}%, ${(color.hsla.l * 100).toFixed(2)}%, ${color.hsla.a.toFixed(2)})`; + } + CSS2.formatHSLA = formatHSLA; + function _toTwoDigitHex(n) { + const r = n.toString(16); + return r.length !== 2 ? "0" + r : r; + } + function formatHex(color) { + return `#${_toTwoDigitHex(color.rgba.r)}${_toTwoDigitHex(color.rgba.g)}${_toTwoDigitHex(color.rgba.b)}`; + } + CSS2.formatHex = formatHex; + function formatHexA(color, compact = false) { + if (compact && color.rgba.a === 1) { + return Color8.Format.CSS.formatHex(color); + } + return `#${_toTwoDigitHex(color.rgba.r)}${_toTwoDigitHex(color.rgba.g)}${_toTwoDigitHex(color.rgba.b)}${_toTwoDigitHex(Math.round(color.rgba.a * 255))}`; + } + CSS2.formatHexA = formatHexA; + function format7(color) { + if (color.isOpaque()) { + return Color8.Format.CSS.formatHex(color); + } + return Color8.Format.CSS.formatRGBA(color); + } + CSS2.format = format7; + function parseHex(hex) { + const length = hex.length; + if (length === 0) { + return null; + } + if (hex.charCodeAt(0) !== 35) { + return null; + } + if (length === 7) { + const r = 16 * _parseHexDigit(hex.charCodeAt(1)) + _parseHexDigit(hex.charCodeAt(2)); + const g = 16 * _parseHexDigit(hex.charCodeAt(3)) + _parseHexDigit(hex.charCodeAt(4)); + const b = 16 * _parseHexDigit(hex.charCodeAt(5)) + _parseHexDigit(hex.charCodeAt(6)); + return new Color8(new RGBA(r, g, b, 1)); + } + if (length === 9) { + const r = 16 * _parseHexDigit(hex.charCodeAt(1)) + _parseHexDigit(hex.charCodeAt(2)); + const g = 16 * _parseHexDigit(hex.charCodeAt(3)) + _parseHexDigit(hex.charCodeAt(4)); + const b = 16 * _parseHexDigit(hex.charCodeAt(5)) + _parseHexDigit(hex.charCodeAt(6)); + const a3 = 16 * _parseHexDigit(hex.charCodeAt(7)) + _parseHexDigit(hex.charCodeAt(8)); + return new Color8(new RGBA(r, g, b, a3 / 255)); + } + if (length === 4) { + const r = _parseHexDigit(hex.charCodeAt(1)); + const g = _parseHexDigit(hex.charCodeAt(2)); + const b = _parseHexDigit(hex.charCodeAt(3)); + return new Color8(new RGBA(16 * r + r, 16 * g + g, 16 * b + b)); + } + if (length === 5) { + const r = _parseHexDigit(hex.charCodeAt(1)); + const g = _parseHexDigit(hex.charCodeAt(2)); + const b = _parseHexDigit(hex.charCodeAt(3)); + const a3 = _parseHexDigit(hex.charCodeAt(4)); + return new Color8(new RGBA(16 * r + r, 16 * g + g, 16 * b + b, (16 * a3 + a3) / 255)); + } + return null; + } + CSS2.parseHex = parseHex; + function _parseHexDigit(charCode) { + switch (charCode) { + case 48: + return 0; + case 49: + return 1; + case 50: + return 2; + case 51: + return 3; + case 52: + return 4; + case 53: + return 5; + case 54: + return 6; + case 55: + return 7; + case 56: + return 8; + case 57: + return 9; + case 97: + return 10; + case 65: + return 10; + case 98: + return 11; + case 66: + return 11; + case 99: + return 12; + case 67: + return 12; + case 100: + return 13; + case 68: + return 13; + case 101: + return 14; + case 69: + return 14; + case 102: + return 15; + case 70: + return 15; + } + return 0; + } + })(CSS = Format2.CSS || (Format2.CSS = {})); + })(Format = Color8.Format || (Color8.Format = {})); + })(Color || (Color = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/defaultDocumentColorsComputer.js +function _parseCaptureGroups(captureGroups) { + const values2 = []; + for (const captureGroup of captureGroups) { + const parsedNumber = Number(captureGroup); + if (parsedNumber || parsedNumber === 0 && captureGroup.replace(/\s/g, "") !== "") { + values2.push(parsedNumber); + } + } + return values2; +} +function _toIColor(r, g, b, a3) { + return { + red: r / 255, + blue: b / 255, + green: g / 255, + alpha: a3 + }; +} +function _findRange(model, match2) { + const index = match2.index; + const length = match2[0].length; + if (!index) { + return; + } + const startPosition = model.positionAt(index); + const range2 = { + startLineNumber: startPosition.lineNumber, + startColumn: startPosition.column, + endLineNumber: startPosition.lineNumber, + endColumn: startPosition.column + length + }; + return range2; +} +function _findHexColorInformation(range2, hexValue) { + if (!range2) { + return; + } + const parsedHexColor = Color.Format.CSS.parseHex(hexValue); + if (!parsedHexColor) { + return; + } + return { + range: range2, + color: _toIColor(parsedHexColor.rgba.r, parsedHexColor.rgba.g, parsedHexColor.rgba.b, parsedHexColor.rgba.a) + }; +} +function _findRGBColorInformation(range2, matches2, isAlpha) { + if (!range2 || matches2.length !== 1) { + return; + } + const match2 = matches2[0]; + const captureGroups = match2.values(); + const parsedRegex = _parseCaptureGroups(captureGroups); + return { + range: range2, + color: _toIColor(parsedRegex[0], parsedRegex[1], parsedRegex[2], isAlpha ? parsedRegex[3] : 1) + }; +} +function _findHSLColorInformation(range2, matches2, isAlpha) { + if (!range2 || matches2.length !== 1) { + return; + } + const match2 = matches2[0]; + const captureGroups = match2.values(); + const parsedRegex = _parseCaptureGroups(captureGroups); + const colorEquivalent = new Color(new HSLA(parsedRegex[0], parsedRegex[1] / 100, parsedRegex[2] / 100, isAlpha ? parsedRegex[3] : 1)); + return { + range: range2, + color: _toIColor(colorEquivalent.rgba.r, colorEquivalent.rgba.g, colorEquivalent.rgba.b, colorEquivalent.rgba.a) + }; +} +function _findMatches(model, regex) { + if (typeof model === "string") { + return [...model.matchAll(regex)]; + } else { + return model.findMatches(regex); + } +} +function computeColors(model) { + const result = []; + const initialValidationRegex = /\b(rgb|rgba|hsl|hsla)(\([0-9\s,.\%]*\))|(#)([A-Fa-f0-9]{3})\b|(#)([A-Fa-f0-9]{4})\b|(#)([A-Fa-f0-9]{6})\b|(#)([A-Fa-f0-9]{8})\b/gm; + const initialValidationMatches = _findMatches(model, initialValidationRegex); + if (initialValidationMatches.length > 0) { + for (const initialMatch of initialValidationMatches) { + const initialCaptureGroups = initialMatch.filter((captureGroup) => captureGroup !== void 0); + const colorScheme = initialCaptureGroups[1]; + const colorParameters = initialCaptureGroups[2]; + if (!colorParameters) { + continue; + } + let colorInformation; + if (colorScheme === "rgb") { + const regexParameters = /^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*\)$/gm; + colorInformation = _findRGBColorInformation(_findRange(model, initialMatch), _findMatches(colorParameters, regexParameters), false); + } else if (colorScheme === "rgba") { + const regexParameters = /^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm; + colorInformation = _findRGBColorInformation(_findRange(model, initialMatch), _findMatches(colorParameters, regexParameters), true); + } else if (colorScheme === "hsl") { + const regexParameters = /^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*\)$/gm; + colorInformation = _findHSLColorInformation(_findRange(model, initialMatch), _findMatches(colorParameters, regexParameters), false); + } else if (colorScheme === "hsla") { + const regexParameters = /^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm; + colorInformation = _findHSLColorInformation(_findRange(model, initialMatch), _findMatches(colorParameters, regexParameters), true); + } else if (colorScheme === "#") { + colorInformation = _findHexColorInformation(_findRange(model, initialMatch), colorScheme + colorParameters); + } + if (colorInformation) { + result.push(colorInformation); + } + } + } + return result; +} +function computeDefaultDocumentColors(model) { + if (!model || typeof model.getValue !== "function" || typeof model.positionAt !== "function") { + return []; + } + return computeColors(model); +} +var init_defaultDocumentColorsComputer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/defaultDocumentColorsComputer.js"() { + init_color(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/findSectionHeaders.js +function findSectionHeaders(model, options2) { + var _a10; + let headers = []; + if (options2.findRegionSectionHeaders && ((_a10 = options2.foldingRules) === null || _a10 === void 0 ? void 0 : _a10.markers)) { + const regionHeaders = collectRegionHeaders(model, options2); + headers = headers.concat(regionHeaders); + } + if (options2.findMarkSectionHeaders) { + const markHeaders = collectMarkHeaders(model); + headers = headers.concat(markHeaders); + } + return headers; +} +function collectRegionHeaders(model, options2) { + const regionHeaders = []; + const endLineNumber = model.getLineCount(); + for (let lineNumber = 1; lineNumber <= endLineNumber; lineNumber++) { + const lineContent = model.getLineContent(lineNumber); + const match2 = lineContent.match(options2.foldingRules.markers.start); + if (match2) { + const range2 = { startLineNumber: lineNumber, startColumn: match2[0].length + 1, endLineNumber: lineNumber, endColumn: lineContent.length + 1 }; + if (range2.endColumn > range2.startColumn) { + const sectionHeader = __spreadProps(__spreadValues({ + range: range2 + }, getHeaderText(lineContent.substring(match2[0].length))), { + shouldBeInComments: false + }); + if (sectionHeader.text || sectionHeader.hasSeparatorLine) { + regionHeaders.push(sectionHeader); + } + } + } + } + return regionHeaders; +} +function collectMarkHeaders(model) { + const markHeaders = []; + const endLineNumber = model.getLineCount(); + for (let lineNumber = 1; lineNumber <= endLineNumber; lineNumber++) { + const lineContent = model.getLineContent(lineNumber); + addMarkHeaderIfFound(lineContent, lineNumber, markHeaders); + } + return markHeaders; +} +function addMarkHeaderIfFound(lineContent, lineNumber, sectionHeaders) { + markRegex.lastIndex = 0; + const match2 = markRegex.exec(lineContent); + if (match2) { + const column = match2.indices[1][0] + 1; + const endColumn = match2.indices[1][1] + 1; + const range2 = { startLineNumber: lineNumber, startColumn: column, endLineNumber: lineNumber, endColumn }; + if (range2.endColumn > range2.startColumn) { + const sectionHeader = __spreadProps(__spreadValues({ + range: range2 + }, getHeaderText(match2[1])), { + shouldBeInComments: true + }); + if (sectionHeader.text || sectionHeader.hasSeparatorLine) { + sectionHeaders.push(sectionHeader); + } + } + } +} +function getHeaderText(text2) { + text2 = text2.trim(); + const hasSeparatorLine = text2.startsWith("-"); + text2 = text2.replace(trimDashesRegex, ""); + return { text: text2, hasSeparatorLine }; +} +var markRegex, trimDashesRegex; +var init_findSectionHeaders = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/findSectionHeaders.js"() { + markRegex = new RegExp("\\bMARK:\\s*(.*)$", "d"); + trimDashesRegex = /^-+|-+$/g; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/editorSimpleWorker.js +var MirrorModel, EditorSimpleWorker; +var init_editorSimpleWorker = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/editorSimpleWorker.js"() { + init_diff(); + init_uri(); + init_position(); + init_range(); + init_mirrorTextModel(); + init_wordHelper(); + init_linkComputer(); + init_inplaceReplaceSupport(); + init_editorBaseApi(); + init_stopwatch(); + init_unicodeTextModelHighlighter(); + init_linesDiffComputers(); + init_objects(); + init_defaultDocumentColorsComputer(); + init_findSectionHeaders(); + MirrorModel = class extends MirrorTextModel { + get uri() { + return this._uri; + } + get eol() { + return this._eol; + } + getValue() { + return this.getText(); + } + findMatches(regex) { + const matches2 = []; + for (let i = 0; i < this._lines.length; i++) { + const line = this._lines[i]; + const offsetToAdd = this.offsetAt(new Position(i + 1, 1)); + const iteratorOverMatches = line.matchAll(regex); + for (const match2 of iteratorOverMatches) { + if (match2.index || match2.index === 0) { + match2.index = match2.index + offsetToAdd; + } + matches2.push(match2); + } + } + return matches2; + } + getLinesContent() { + return this._lines.slice(0); + } + getLineCount() { + return this._lines.length; + } + getLineContent(lineNumber) { + return this._lines[lineNumber - 1]; + } + getWordAtPosition(position, wordDefinition) { + const wordAtText = getWordAtText(position.column, ensureValidWordDefinition(wordDefinition), this._lines[position.lineNumber - 1], 0); + if (wordAtText) { + return new Range(position.lineNumber, wordAtText.startColumn, position.lineNumber, wordAtText.endColumn); + } + return null; + } + words(wordDefinition) { + const lines = this._lines; + const wordenize = this._wordenize.bind(this); + let lineNumber = 0; + let lineText = ""; + let wordRangesIdx = 0; + let wordRanges = []; + return { + *[Symbol.iterator]() { + while (true) { + if (wordRangesIdx < wordRanges.length) { + const value = lineText.substring(wordRanges[wordRangesIdx].start, wordRanges[wordRangesIdx].end); + wordRangesIdx += 1; + yield value; + } else { + if (lineNumber < lines.length) { + lineText = lines[lineNumber]; + wordRanges = wordenize(lineText, wordDefinition); + wordRangesIdx = 0; + lineNumber += 1; + } else { + break; + } + } + } + } + }; + } + getLineWords(lineNumber, wordDefinition) { + const content = this._lines[lineNumber - 1]; + const ranges = this._wordenize(content, wordDefinition); + const words = []; + for (const range2 of ranges) { + words.push({ + word: content.substring(range2.start, range2.end), + startColumn: range2.start + 1, + endColumn: range2.end + 1 + }); + } + return words; + } + _wordenize(content, wordDefinition) { + const result = []; + let match2; + wordDefinition.lastIndex = 0; + while (match2 = wordDefinition.exec(content)) { + if (match2[0].length === 0) { + break; + } + result.push({ start: match2.index, end: match2.index + match2[0].length }); + } + return result; + } + getValueInRange(range2) { + range2 = this._validateRange(range2); + if (range2.startLineNumber === range2.endLineNumber) { + return this._lines[range2.startLineNumber - 1].substring(range2.startColumn - 1, range2.endColumn - 1); + } + const lineEnding = this._eol; + const startLineIndex = range2.startLineNumber - 1; + const endLineIndex = range2.endLineNumber - 1; + const resultLines = []; + resultLines.push(this._lines[startLineIndex].substring(range2.startColumn - 1)); + for (let i = startLineIndex + 1; i < endLineIndex; i++) { + resultLines.push(this._lines[i]); + } + resultLines.push(this._lines[endLineIndex].substring(0, range2.endColumn - 1)); + return resultLines.join(lineEnding); + } + offsetAt(position) { + position = this._validatePosition(position); + this._ensureLineStarts(); + return this._lineStarts.getPrefixSum(position.lineNumber - 2) + (position.column - 1); + } + positionAt(offset) { + offset = Math.floor(offset); + offset = Math.max(0, offset); + this._ensureLineStarts(); + const out = this._lineStarts.getIndexOf(offset); + const lineLength = this._lines[out.index].length; + return { + lineNumber: 1 + out.index, + column: 1 + Math.min(out.remainder, lineLength) + }; + } + _validateRange(range2) { + const start = this._validatePosition({ lineNumber: range2.startLineNumber, column: range2.startColumn }); + const end = this._validatePosition({ lineNumber: range2.endLineNumber, column: range2.endColumn }); + if (start.lineNumber !== range2.startLineNumber || start.column !== range2.startColumn || end.lineNumber !== range2.endLineNumber || end.column !== range2.endColumn) { + return { + startLineNumber: start.lineNumber, + startColumn: start.column, + endLineNumber: end.lineNumber, + endColumn: end.column + }; + } + return range2; + } + _validatePosition(position) { + if (!Position.isIPosition(position)) { + throw new Error("bad position"); + } + let { lineNumber, column } = position; + let hasChanged = false; + if (lineNumber < 1) { + lineNumber = 1; + column = 1; + hasChanged = true; + } else if (lineNumber > this._lines.length) { + lineNumber = this._lines.length; + column = this._lines[lineNumber - 1].length + 1; + hasChanged = true; + } else { + const maxCharacter = this._lines[lineNumber - 1].length + 1; + if (column < 1) { + column = 1; + hasChanged = true; + } else if (column > maxCharacter) { + column = maxCharacter; + hasChanged = true; + } + } + if (!hasChanged) { + return position; + } else { + return { lineNumber, column }; + } + } + }; + EditorSimpleWorker = class _EditorSimpleWorker { + constructor(host, foreignModuleFactory) { + this._host = host; + this._models = /* @__PURE__ */ Object.create(null); + this._foreignModuleFactory = foreignModuleFactory; + this._foreignModule = null; + } + dispose() { + this._models = /* @__PURE__ */ Object.create(null); + } + _getModel(uri) { + return this._models[uri]; + } + _getModels() { + const all = []; + Object.keys(this._models).forEach((key) => all.push(this._models[key])); + return all; + } + acceptNewModel(data) { + this._models[data.url] = new MirrorModel(URI.parse(data.url), data.lines, data.EOL, data.versionId); + } + acceptModelChanged(strURL, e) { + if (!this._models[strURL]) { + return; + } + const model = this._models[strURL]; + model.onEvents(e); + } + acceptRemovedModel(strURL) { + if (!this._models[strURL]) { + return; + } + delete this._models[strURL]; + } + computeUnicodeHighlights(url, options2, range2) { + return __async(this, null, function* () { + const model = this._getModel(url); + if (!model) { + return { ranges: [], hasMore: false, ambiguousCharacterCount: 0, invisibleCharacterCount: 0, nonBasicAsciiCharacterCount: 0 }; + } + return UnicodeTextModelHighlighter.computeUnicodeHighlights(model, options2, range2); + }); + } + findSectionHeaders(url, options2) { + return __async(this, null, function* () { + const model = this._getModel(url); + if (!model) { + return []; + } + return findSectionHeaders(model, options2); + }); + } + // ---- BEGIN diff -------------------------------------------------------------------------- + computeDiff(originalUrl, modifiedUrl, options2, algorithm) { + return __async(this, null, function* () { + const original = this._getModel(originalUrl); + const modified = this._getModel(modifiedUrl); + if (!original || !modified) { + return null; + } + const result = _EditorSimpleWorker.computeDiff(original, modified, options2, algorithm); + return result; + }); + } + static computeDiff(originalTextModel, modifiedTextModel, options2, algorithm) { + const diffAlgorithm = algorithm === "advanced" ? linesDiffComputers.getDefault() : linesDiffComputers.getLegacy(); + const originalLines = originalTextModel.getLinesContent(); + const modifiedLines = modifiedTextModel.getLinesContent(); + const result = diffAlgorithm.computeDiff(originalLines, modifiedLines, options2); + const identical = result.changes.length > 0 ? false : this._modelsAreIdentical(originalTextModel, modifiedTextModel); + function getLineChanges(changes) { + return changes.map((m) => { + var _a10; + return [m.original.startLineNumber, m.original.endLineNumberExclusive, m.modified.startLineNumber, m.modified.endLineNumberExclusive, (_a10 = m.innerChanges) === null || _a10 === void 0 ? void 0 : _a10.map((m2) => [ + m2.originalRange.startLineNumber, + m2.originalRange.startColumn, + m2.originalRange.endLineNumber, + m2.originalRange.endColumn, + m2.modifiedRange.startLineNumber, + m2.modifiedRange.startColumn, + m2.modifiedRange.endLineNumber, + m2.modifiedRange.endColumn + ])]; + }); + } + return { + identical, + quitEarly: result.hitTimeout, + changes: getLineChanges(result.changes), + moves: result.moves.map((m) => [ + m.lineRangeMapping.original.startLineNumber, + m.lineRangeMapping.original.endLineNumberExclusive, + m.lineRangeMapping.modified.startLineNumber, + m.lineRangeMapping.modified.endLineNumberExclusive, + getLineChanges(m.changes) + ]) + }; + } + static _modelsAreIdentical(original, modified) { + const originalLineCount = original.getLineCount(); + const modifiedLineCount = modified.getLineCount(); + if (originalLineCount !== modifiedLineCount) { + return false; + } + for (let line = 1; line <= originalLineCount; line++) { + const originalLine = original.getLineContent(line); + const modifiedLine = modified.getLineContent(line); + if (originalLine !== modifiedLine) { + return false; + } + } + return true; + } + computeMoreMinimalEdits(modelUrl, edits, pretty) { + return __async(this, null, function* () { + const model = this._getModel(modelUrl); + if (!model) { + return edits; + } + const result = []; + let lastEol = void 0; + edits = edits.slice(0).sort((a3, b) => { + if (a3.range && b.range) { + return Range.compareRangesUsingStarts(a3.range, b.range); + } + const aRng = a3.range ? 0 : 1; + const bRng = b.range ? 0 : 1; + return aRng - bRng; + }); + let writeIndex = 0; + for (let readIndex = 1; readIndex < edits.length; readIndex++) { + if (Range.getEndPosition(edits[writeIndex].range).equals(Range.getStartPosition(edits[readIndex].range))) { + edits[writeIndex].range = Range.fromPositions(Range.getStartPosition(edits[writeIndex].range), Range.getEndPosition(edits[readIndex].range)); + edits[writeIndex].text += edits[readIndex].text; + } else { + writeIndex++; + edits[writeIndex] = edits[readIndex]; + } + } + edits.length = writeIndex + 1; + for (let { range: range2, text: text2, eol } of edits) { + if (typeof eol === "number") { + lastEol = eol; + } + if (Range.isEmpty(range2) && !text2) { + continue; + } + const original = model.getValueInRange(range2); + text2 = text2.replace(/\r\n|\n|\r/g, model.eol); + if (original === text2) { + continue; + } + if (Math.max(text2.length, original.length) > _EditorSimpleWorker._diffLimit) { + result.push({ range: range2, text: text2 }); + continue; + } + const changes = stringDiff(original, text2, pretty); + const editOffset = model.offsetAt(Range.lift(range2).getStartPosition()); + for (const change of changes) { + const start = model.positionAt(editOffset + change.originalStart); + const end = model.positionAt(editOffset + change.originalStart + change.originalLength); + const newEdit = { + text: text2.substr(change.modifiedStart, change.modifiedLength), + range: { startLineNumber: start.lineNumber, startColumn: start.column, endLineNumber: end.lineNumber, endColumn: end.column } + }; + if (model.getValueInRange(newEdit.range) !== newEdit.text) { + result.push(newEdit); + } + } + } + if (typeof lastEol === "number") { + result.push({ eol: lastEol, text: "", range: { startLineNumber: 0, startColumn: 0, endLineNumber: 0, endColumn: 0 } }); + } + return result; + }); + } + // ---- END minimal edits --------------------------------------------------------------- + computeLinks(modelUrl) { + return __async(this, null, function* () { + const model = this._getModel(modelUrl); + if (!model) { + return null; + } + return computeLinks(model); + }); + } + // --- BEGIN default document colors ----------------------------------------------------------- + computeDefaultDocumentColors(modelUrl) { + return __async(this, null, function* () { + const model = this._getModel(modelUrl); + if (!model) { + return null; + } + return computeDefaultDocumentColors(model); + }); + } + textualSuggest(modelUrls, leadingWord, wordDef, wordDefFlags) { + return __async(this, null, function* () { + const sw = new StopWatch(); + const wordDefRegExp = new RegExp(wordDef, wordDefFlags); + const seen = /* @__PURE__ */ new Set(); + outer: for (const url of modelUrls) { + const model = this._getModel(url); + if (!model) { + continue; + } + for (const word of model.words(wordDefRegExp)) { + if (word === leadingWord || !isNaN(Number(word))) { + continue; + } + seen.add(word); + if (seen.size > _EditorSimpleWorker._suggestionsLimit) { + break outer; + } + } + } + return { words: Array.from(seen), duration: sw.elapsed() }; + }); + } + // ---- END suggest -------------------------------------------------------------------------- + //#region -- word ranges -- + computeWordRanges(modelUrl, range2, wordDef, wordDefFlags) { + return __async(this, null, function* () { + const model = this._getModel(modelUrl); + if (!model) { + return /* @__PURE__ */ Object.create(null); + } + const wordDefRegExp = new RegExp(wordDef, wordDefFlags); + const result = /* @__PURE__ */ Object.create(null); + for (let line = range2.startLineNumber; line < range2.endLineNumber; line++) { + const words = model.getLineWords(line, wordDefRegExp); + for (const word of words) { + if (!isNaN(Number(word.word))) { + continue; + } + let array2 = result[word.word]; + if (!array2) { + array2 = []; + result[word.word] = array2; + } + array2.push({ + startLineNumber: line, + startColumn: word.startColumn, + endLineNumber: line, + endColumn: word.endColumn + }); + } + } + return result; + }); + } + //#endregion + navigateValueSet(modelUrl, range2, up, wordDef, wordDefFlags) { + return __async(this, null, function* () { + const model = this._getModel(modelUrl); + if (!model) { + return null; + } + const wordDefRegExp = new RegExp(wordDef, wordDefFlags); + if (range2.startColumn === range2.endColumn) { + range2 = { + startLineNumber: range2.startLineNumber, + startColumn: range2.startColumn, + endLineNumber: range2.endLineNumber, + endColumn: range2.endColumn + 1 + }; + } + const selectionText = model.getValueInRange(range2); + const wordRange = model.getWordAtPosition({ lineNumber: range2.startLineNumber, column: range2.startColumn }, wordDefRegExp); + if (!wordRange) { + return null; + } + const word = model.getValueInRange(wordRange); + const result = BasicInplaceReplace.INSTANCE.navigateValueSet(range2, selectionText, wordRange, word, up); + return result; + }); + } + // ---- BEGIN foreign module support -------------------------------------------------------------------------- + loadForeignModule(moduleId, createData, foreignHostMethods) { + const proxyMethodRequest = (method, args) => { + return this._host.fhr(method, args); + }; + const foreignHost = createProxyObject(foreignHostMethods, proxyMethodRequest); + const ctx = { + host: foreignHost, + getMirrorModels: () => { + return this._getModels(); + } + }; + if (this._foreignModuleFactory) { + this._foreignModule = this._foreignModuleFactory(ctx, createData); + return Promise.resolve(getAllMethodNames(this._foreignModule)); + } + return Promise.reject(new Error(`Unexpected usage`)); + } + // foreign method request + fmr(method, args) { + if (!this._foreignModule || typeof this._foreignModule[method] !== "function") { + return Promise.reject(new Error("Missing requestHandler or method: " + method)); + } + try { + return Promise.resolve(this._foreignModule[method].apply(this._foreignModule, args)); + } catch (e) { + return Promise.reject(e); + } + } + }; + EditorSimpleWorker._diffLimit = 1e5; + EditorSimpleWorker._suggestionsLimit = 1e4; + if (typeof importScripts === "function") { + globalThis.monaco = createMonacoBaseAPI(); + } + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/textResourceConfiguration.js +var ITextResourceConfigurationService, ITextResourcePropertiesService; +var init_textResourceConfiguration = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/textResourceConfiguration.js"() { + init_instantiation(); + ITextResourceConfigurationService = createDecorator("textResourceConfigurationService"); + ITextResourcePropertiesService = createDecorator("textResourcePropertiesService"); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/languageFeatures.js +var ILanguageFeaturesService; +var init_languageFeatures = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/languageFeatures.js"() { + init_instantiation(); + ILanguageFeaturesService = createDecorator("ILanguageFeaturesService"); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/services/editorWorkerService.js +function canSyncModel(modelService, resource) { + const model = modelService.getModel(resource); + if (!model) { + return false; + } + if (model.isTooLargeForSyncing()) { + return false; + } + return true; +} +var __decorate3, __param3, STOP_SYNC_MODEL_DELTA_TIME_MS, STOP_WORKER_DELTA_TIME_MS, EditorWorkerService, WordBasedCompletionItemProvider, WorkerManager, EditorModelManager, SynchronousWorkerClient, EditorWorkerHost, EditorWorkerClient; +var init_editorWorkerService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/services/editorWorkerService.js"() { + init_async(); + init_lifecycle(); + init_simpleWorker(); + init_defaultWorkerFactory(); + init_range(); + init_languageConfigurationRegistry(); + init_editorSimpleWorker(); + init_model(); + init_textResourceConfiguration(); + init_arrays(); + init_log(); + init_stopwatch(); + init_errors(); + init_languageFeatures(); + init_linesDiffComputer(); + init_rangeMapping(); + init_lineRange(); + init_window(); + init_dom(); + __decorate3 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param3 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + STOP_SYNC_MODEL_DELTA_TIME_MS = 60 * 1e3; + STOP_WORKER_DELTA_TIME_MS = 5 * 60 * 1e3; + EditorWorkerService = class EditorWorkerService2 extends Disposable { + constructor(modelService, configurationService, logService, languageConfigurationService, languageFeaturesService) { + super(); + this._modelService = modelService; + this._workerManager = this._register(new WorkerManager(this._modelService, languageConfigurationService)); + this._logService = logService; + this._register(languageFeaturesService.linkProvider.register({ language: "*", hasAccessToAllModels: true }, { + provideLinks: (model, token) => { + if (!canSyncModel(this._modelService, model.uri)) { + return Promise.resolve({ links: [] }); + } + return this._workerManager.withWorker().then((client) => client.computeLinks(model.uri)).then((links) => { + return links && { links }; + }); + } + })); + this._register(languageFeaturesService.completionProvider.register("*", new WordBasedCompletionItemProvider(this._workerManager, configurationService, this._modelService, languageConfigurationService))); + } + dispose() { + super.dispose(); + } + canComputeUnicodeHighlights(uri) { + return canSyncModel(this._modelService, uri); + } + computedUnicodeHighlights(uri, options2, range2) { + return this._workerManager.withWorker().then((client) => client.computedUnicodeHighlights(uri, options2, range2)); + } + computeDiff(original, modified, options2, algorithm) { + return __async(this, null, function* () { + const result = yield this._workerManager.withWorker().then((client) => client.computeDiff(original, modified, options2, algorithm)); + if (!result) { + return null; + } + const diff = { + identical: result.identical, + quitEarly: result.quitEarly, + changes: toLineRangeMappings(result.changes), + moves: result.moves.map((m) => new MovedText(new LineRangeMapping(new LineRange(m[0], m[1]), new LineRange(m[2], m[3])), toLineRangeMappings(m[4]))) + }; + return diff; + function toLineRangeMappings(changes) { + return changes.map((c) => { + var _a10; + return new DetailedLineRangeMapping(new LineRange(c[0], c[1]), new LineRange(c[2], c[3]), (_a10 = c[4]) === null || _a10 === void 0 ? void 0 : _a10.map((c2) => new RangeMapping(new Range(c2[0], c2[1], c2[2], c2[3]), new Range(c2[4], c2[5], c2[6], c2[7])))); + }); + } + }); + } + computeMoreMinimalEdits(resource, edits, pretty = false) { + if (isNonEmptyArray(edits)) { + if (!canSyncModel(this._modelService, resource)) { + return Promise.resolve(edits); + } + const sw = StopWatch.create(); + const result = this._workerManager.withWorker().then((client) => client.computeMoreMinimalEdits(resource, edits, pretty)); + result.finally(() => this._logService.trace("FORMAT#computeMoreMinimalEdits", resource.toString(true), sw.elapsed())); + return Promise.race([result, timeout(1e3).then(() => edits)]); + } else { + return Promise.resolve(void 0); + } + } + canNavigateValueSet(resource) { + return canSyncModel(this._modelService, resource); + } + navigateValueSet(resource, range2, up) { + return this._workerManager.withWorker().then((client) => client.navigateValueSet(resource, range2, up)); + } + canComputeWordRanges(resource) { + return canSyncModel(this._modelService, resource); + } + computeWordRanges(resource, range2) { + return this._workerManager.withWorker().then((client) => client.computeWordRanges(resource, range2)); + } + findSectionHeaders(uri, options2) { + return this._workerManager.withWorker().then((client) => client.findSectionHeaders(uri, options2)); + } + }; + EditorWorkerService = __decorate3([ + __param3(0, IModelService), + __param3(1, ITextResourceConfigurationService), + __param3(2, ILogService), + __param3(3, ILanguageConfigurationService), + __param3(4, ILanguageFeaturesService) + ], EditorWorkerService); + WordBasedCompletionItemProvider = class { + constructor(workerManager, configurationService, modelService, languageConfigurationService) { + this.languageConfigurationService = languageConfigurationService; + this._debugDisplayName = "wordbasedCompletions"; + this._workerManager = workerManager; + this._configurationService = configurationService; + this._modelService = modelService; + } + provideCompletionItems(model, position) { + return __async(this, null, function* () { + const config = this._configurationService.getValue(model.uri, position, "editor"); + if (config.wordBasedSuggestions === "off") { + return void 0; + } + const models = []; + if (config.wordBasedSuggestions === "currentDocument") { + if (canSyncModel(this._modelService, model.uri)) { + models.push(model.uri); + } + } else { + for (const candidate of this._modelService.getModels()) { + if (!canSyncModel(this._modelService, candidate.uri)) { + continue; + } + if (candidate === model) { + models.unshift(candidate.uri); + } else if (config.wordBasedSuggestions === "allDocuments" || candidate.getLanguageId() === model.getLanguageId()) { + models.push(candidate.uri); + } + } + } + if (models.length === 0) { + return void 0; + } + const wordDefRegExp = this.languageConfigurationService.getLanguageConfiguration(model.getLanguageId()).getWordDefinition(); + const word = model.getWordAtPosition(position); + const replace = !word ? Range.fromPositions(position) : new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn); + const insert = replace.setEndPosition(position.lineNumber, position.column); + const client = yield this._workerManager.withWorker(); + const data = yield client.textualSuggest(models, word === null || word === void 0 ? void 0 : word.word, wordDefRegExp); + if (!data) { + return void 0; + } + return { + duration: data.duration, + suggestions: data.words.map((word2) => { + return { + kind: 18, + label: word2, + insertText: word2, + range: { insert, replace } + }; + }) + }; + }); + } + }; + WorkerManager = class extends Disposable { + constructor(modelService, languageConfigurationService) { + super(); + this.languageConfigurationService = languageConfigurationService; + this._modelService = modelService; + this._editorWorkerClient = null; + this._lastWorkerUsedTime = (/* @__PURE__ */ new Date()).getTime(); + const stopWorkerInterval = this._register(new WindowIntervalTimer()); + stopWorkerInterval.cancelAndSet(() => this._checkStopIdleWorker(), Math.round(STOP_WORKER_DELTA_TIME_MS / 2), mainWindow); + this._register(this._modelService.onModelRemoved((_) => this._checkStopEmptyWorker())); + } + dispose() { + if (this._editorWorkerClient) { + this._editorWorkerClient.dispose(); + this._editorWorkerClient = null; + } + super.dispose(); + } + /** + * Check if the model service has no more models and stop the worker if that is the case. + */ + _checkStopEmptyWorker() { + if (!this._editorWorkerClient) { + return; + } + const models = this._modelService.getModels(); + if (models.length === 0) { + this._editorWorkerClient.dispose(); + this._editorWorkerClient = null; + } + } + /** + * Check if the worker has been idle for a while and then stop it. + */ + _checkStopIdleWorker() { + if (!this._editorWorkerClient) { + return; + } + const timeSinceLastWorkerUsedTime = (/* @__PURE__ */ new Date()).getTime() - this._lastWorkerUsedTime; + if (timeSinceLastWorkerUsedTime > STOP_WORKER_DELTA_TIME_MS) { + this._editorWorkerClient.dispose(); + this._editorWorkerClient = null; + } + } + withWorker() { + this._lastWorkerUsedTime = (/* @__PURE__ */ new Date()).getTime(); + if (!this._editorWorkerClient) { + this._editorWorkerClient = new EditorWorkerClient(this._modelService, false, "editorWorkerService", this.languageConfigurationService); + } + return Promise.resolve(this._editorWorkerClient); + } + }; + EditorModelManager = class extends Disposable { + constructor(proxy, modelService, keepIdleModels) { + super(); + this._syncedModels = /* @__PURE__ */ Object.create(null); + this._syncedModelsLastUsedTime = /* @__PURE__ */ Object.create(null); + this._proxy = proxy; + this._modelService = modelService; + if (!keepIdleModels) { + const timer = new IntervalTimer(); + timer.cancelAndSet(() => this._checkStopModelSync(), Math.round(STOP_SYNC_MODEL_DELTA_TIME_MS / 2)); + this._register(timer); + } + } + dispose() { + for (const modelUrl in this._syncedModels) { + dispose(this._syncedModels[modelUrl]); + } + this._syncedModels = /* @__PURE__ */ Object.create(null); + this._syncedModelsLastUsedTime = /* @__PURE__ */ Object.create(null); + super.dispose(); + } + ensureSyncedResources(resources, forceLargeModels) { + for (const resource of resources) { + const resourceStr = resource.toString(); + if (!this._syncedModels[resourceStr]) { + this._beginModelSync(resource, forceLargeModels); + } + if (this._syncedModels[resourceStr]) { + this._syncedModelsLastUsedTime[resourceStr] = (/* @__PURE__ */ new Date()).getTime(); + } + } + } + _checkStopModelSync() { + const currentTime = (/* @__PURE__ */ new Date()).getTime(); + const toRemove = []; + for (const modelUrl in this._syncedModelsLastUsedTime) { + const elapsedTime = currentTime - this._syncedModelsLastUsedTime[modelUrl]; + if (elapsedTime > STOP_SYNC_MODEL_DELTA_TIME_MS) { + toRemove.push(modelUrl); + } + } + for (const e of toRemove) { + this._stopModelSync(e); + } + } + _beginModelSync(resource, forceLargeModels) { + const model = this._modelService.getModel(resource); + if (!model) { + return; + } + if (!forceLargeModels && model.isTooLargeForSyncing()) { + return; + } + const modelUrl = resource.toString(); + this._proxy.acceptNewModel({ + url: model.uri.toString(), + lines: model.getLinesContent(), + EOL: model.getEOL(), + versionId: model.getVersionId() + }); + const toDispose = new DisposableStore(); + toDispose.add(model.onDidChangeContent((e) => { + this._proxy.acceptModelChanged(modelUrl.toString(), e); + })); + toDispose.add(model.onWillDispose(() => { + this._stopModelSync(modelUrl); + })); + toDispose.add(toDisposable(() => { + this._proxy.acceptRemovedModel(modelUrl); + })); + this._syncedModels[modelUrl] = toDispose; + } + _stopModelSync(modelUrl) { + const toDispose = this._syncedModels[modelUrl]; + delete this._syncedModels[modelUrl]; + delete this._syncedModelsLastUsedTime[modelUrl]; + dispose(toDispose); + } + }; + SynchronousWorkerClient = class { + constructor(instance) { + this._instance = instance; + this._proxyObj = Promise.resolve(this._instance); + } + dispose() { + this._instance.dispose(); + } + getProxyObject() { + return this._proxyObj; + } + }; + EditorWorkerHost = class { + constructor(workerClient) { + this._workerClient = workerClient; + } + // foreign host request + fhr(method, args) { + return this._workerClient.fhr(method, args); + } + }; + EditorWorkerClient = class extends Disposable { + constructor(modelService, keepIdleModels, label, languageConfigurationService) { + super(); + this.languageConfigurationService = languageConfigurationService; + this._disposed = false; + this._modelService = modelService; + this._keepIdleModels = keepIdleModels; + this._workerFactory = new DefaultWorkerFactory(label); + this._worker = null; + this._modelManager = null; + } + // foreign host request + fhr(method, args) { + throw new Error(`Not implemented!`); + } + _getOrCreateWorker() { + if (!this._worker) { + try { + this._worker = this._register(new SimpleWorkerClient(this._workerFactory, "vs/editor/common/services/editorSimpleWorker", new EditorWorkerHost(this))); + } catch (err) { + logOnceWebWorkerWarning(err); + this._worker = new SynchronousWorkerClient(new EditorSimpleWorker(new EditorWorkerHost(this), null)); + } + } + return this._worker; + } + _getProxy() { + return this._getOrCreateWorker().getProxyObject().then(void 0, (err) => { + logOnceWebWorkerWarning(err); + this._worker = new SynchronousWorkerClient(new EditorSimpleWorker(new EditorWorkerHost(this), null)); + return this._getOrCreateWorker().getProxyObject(); + }); + } + _getOrCreateModelManager(proxy) { + if (!this._modelManager) { + this._modelManager = this._register(new EditorModelManager(proxy, this._modelService, this._keepIdleModels)); + } + return this._modelManager; + } + _withSyncedResources(resources, forceLargeModels = false) { + return __async(this, null, function* () { + if (this._disposed) { + return Promise.reject(canceled()); + } + return this._getProxy().then((proxy) => { + this._getOrCreateModelManager(proxy).ensureSyncedResources(resources, forceLargeModels); + return proxy; + }); + }); + } + computedUnicodeHighlights(uri, options2, range2) { + return this._withSyncedResources([uri]).then((proxy) => { + return proxy.computeUnicodeHighlights(uri.toString(), options2, range2); + }); + } + computeDiff(original, modified, options2, algorithm) { + return this._withSyncedResources( + [original, modified], + /* forceLargeModels */ + true + ).then((proxy) => { + return proxy.computeDiff(original.toString(), modified.toString(), options2, algorithm); + }); + } + computeMoreMinimalEdits(resource, edits, pretty) { + return this._withSyncedResources([resource]).then((proxy) => { + return proxy.computeMoreMinimalEdits(resource.toString(), edits, pretty); + }); + } + computeLinks(resource) { + return this._withSyncedResources([resource]).then((proxy) => { + return proxy.computeLinks(resource.toString()); + }); + } + computeDefaultDocumentColors(resource) { + return this._withSyncedResources([resource]).then((proxy) => { + return proxy.computeDefaultDocumentColors(resource.toString()); + }); + } + textualSuggest(resources, leadingWord, wordDefRegExp) { + return __async(this, null, function* () { + const proxy = yield this._withSyncedResources(resources); + const wordDef = wordDefRegExp.source; + const wordDefFlags = wordDefRegExp.flags; + return proxy.textualSuggest(resources.map((r) => r.toString()), leadingWord, wordDef, wordDefFlags); + }); + } + computeWordRanges(resource, range2) { + return this._withSyncedResources([resource]).then((proxy) => { + const model = this._modelService.getModel(resource); + if (!model) { + return Promise.resolve(null); + } + const wordDefRegExp = this.languageConfigurationService.getLanguageConfiguration(model.getLanguageId()).getWordDefinition(); + const wordDef = wordDefRegExp.source; + const wordDefFlags = wordDefRegExp.flags; + return proxy.computeWordRanges(resource.toString(), range2, wordDef, wordDefFlags); + }); + } + navigateValueSet(resource, range2, up) { + return this._withSyncedResources([resource]).then((proxy) => { + const model = this._modelService.getModel(resource); + if (!model) { + return null; + } + const wordDefRegExp = this.languageConfigurationService.getLanguageConfiguration(model.getLanguageId()).getWordDefinition(); + const wordDef = wordDefRegExp.source; + const wordDefFlags = wordDefRegExp.flags; + return proxy.navigateValueSet(resource.toString(), range2, up, wordDef, wordDefFlags); + }); + } + findSectionHeaders(uri, options2) { + return this._withSyncedResources([uri]).then((proxy) => { + return proxy.findSectionHeaders(uri.toString(), options2); + }); + } + dispose() { + super.dispose(); + this._disposed = true; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/services/webWorker.js +function createWebWorker(modelService, languageConfigurationService, opts) { + return new MonacoWebWorkerImpl(modelService, languageConfigurationService, opts); +} +var MonacoWebWorkerImpl; +var init_webWorker = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/services/webWorker.js"() { + init_objects(); + init_editorWorkerService(); + MonacoWebWorkerImpl = class extends EditorWorkerClient { + constructor(modelService, languageConfigurationService, opts) { + super(modelService, opts.keepIdleModels || false, opts.label, languageConfigurationService); + this._foreignModuleId = opts.moduleId; + this._foreignModuleCreateData = opts.createData || null; + this._foreignModuleHost = opts.host || null; + this._foreignProxy = null; + } + // foreign host request + fhr(method, args) { + if (!this._foreignModuleHost || typeof this._foreignModuleHost[method] !== "function") { + return Promise.reject(new Error("Missing method " + method + " or missing main thread foreign host.")); + } + try { + return Promise.resolve(this._foreignModuleHost[method].apply(this._foreignModuleHost, args)); + } catch (e) { + return Promise.reject(e); + } + } + _getForeignProxy() { + if (!this._foreignProxy) { + this._foreignProxy = this._getProxy().then((proxy) => { + const foreignHostMethods = this._foreignModuleHost ? getAllMethodNames(this._foreignModuleHost) : []; + return proxy.loadForeignModule(this._foreignModuleId, this._foreignModuleCreateData, foreignHostMethods).then((foreignMethods) => { + this._foreignModuleCreateData = null; + const proxyMethodRequest = (method, args) => { + return proxy.fmr(method, args); + }; + const createProxyMethod = (method, proxyMethodRequest2) => { + return function() { + const args = Array.prototype.slice.call(arguments, 0); + return proxyMethodRequest2(method, args); + }; + }; + const foreignProxy = {}; + for (const foreignMethod of foreignMethods) { + foreignProxy[foreignMethod] = createProxyMethod(foreignMethod, proxyMethodRequest); + } + return foreignProxy; + }); + }); + } + return this._foreignProxy; + } + getProxy() { + return this._getForeignProxy(); + } + withSyncedResources(resources) { + return this._withSyncedResources(resources).then((_) => this.getProxy()); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/editorCommon.js +var EditorType; +var init_editorCommon = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/editorCommon.js"() { + EditorType = { + ICodeEditor: "vs.editor.ICodeEditor", + IDiffEditor: "vs.editor.IDiffEditor" + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/nullTokenize.js +function nullTokenize(languageId, state) { + return new TokenizationResult([new Token(0, "", languageId)], state); +} +function nullTokenizeEncoded(languageId, state) { + const tokens = new Uint32Array(2); + tokens[0] = 0; + tokens[1] = (languageId << 0 | 0 << 8 | 0 << 11 | 1 << 15 | 2 << 24) >>> 0; + return new EncodedTokenizationResult(tokens, state === null ? NullState : state); +} +var NullState; +var init_nullTokenize = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/nullTokenize.js"() { + init_languages(); + NullState = new class { + clone() { + return this; + } + equals(other) { + return this === other; + } + }(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/encodedTokenAttributes.js +var TokenMetadata; +var init_encodedTokenAttributes = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/encodedTokenAttributes.js"() { + TokenMetadata = class { + static getLanguageId(metadata) { + return (metadata & 255) >>> 0; + } + static getTokenType(metadata) { + return (metadata & 768) >>> 8; + } + static containsBalancedBrackets(metadata) { + return (metadata & 1024) !== 0; + } + static getFontStyle(metadata) { + return (metadata & 30720) >>> 11; + } + static getForeground(metadata) { + return (metadata & 16744448) >>> 15; + } + static getBackground(metadata) { + return (metadata & 4278190080) >>> 24; + } + static getClassNameFromMetadata(metadata) { + const foreground2 = this.getForeground(metadata); + let className = "mtk" + foreground2; + const fontStyle = this.getFontStyle(metadata); + if (fontStyle & 1) { + className += " mtki"; + } + if (fontStyle & 2) { + className += " mtkb"; + } + if (fontStyle & 4) { + className += " mtku"; + } + if (fontStyle & 8) { + className += " mtks"; + } + return className; + } + static getInlineStyleFromMetadata(metadata, colorMap) { + const foreground2 = this.getForeground(metadata); + const fontStyle = this.getFontStyle(metadata); + let result = `color: ${colorMap[foreground2]};`; + if (fontStyle & 1) { + result += "font-style: italic;"; + } + if (fontStyle & 2) { + result += "font-weight: bold;"; + } + let textDecoration = ""; + if (fontStyle & 4) { + textDecoration += " underline"; + } + if (fontStyle & 8) { + textDecoration += " line-through"; + } + if (textDecoration) { + result += `text-decoration:${textDecoration};`; + } + return result; + } + static getPresentationFromMetadata(metadata) { + const foreground2 = this.getForeground(metadata); + const fontStyle = this.getFontStyle(metadata); + return { + foreground: foreground2, + italic: Boolean( + fontStyle & 1 + /* FontStyle.Italic */ + ), + bold: Boolean( + fontStyle & 2 + /* FontStyle.Bold */ + ), + underline: Boolean( + fontStyle & 4 + /* FontStyle.Underline */ + ), + strikethrough: Boolean( + fontStyle & 8 + /* FontStyle.Strikethrough */ + ) + }; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/tokens/lineTokens.js +function getStandardTokenTypeAtPosition(model, position) { + const lineNumber = position.lineNumber; + if (!model.tokenization.isCheapToTokenize(lineNumber)) { + return void 0; + } + model.tokenization.forceTokenization(lineNumber); + const lineTokens = model.tokenization.getLineTokens(lineNumber); + const tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1); + const tokenType = lineTokens.getStandardTokenType(tokenIndex); + return tokenType; +} +var LineTokens, SliceLineTokens; +var init_lineTokens = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/tokens/lineTokens.js"() { + init_encodedTokenAttributes(); + LineTokens = class _LineTokens { + static createEmpty(lineContent, decoder) { + const defaultMetadata = _LineTokens.defaultTokenMetadata; + const tokens = new Uint32Array(2); + tokens[0] = lineContent.length; + tokens[1] = defaultMetadata; + return new _LineTokens(tokens, lineContent, decoder); + } + static createFromTextAndMetadata(data, decoder) { + let offset = 0; + let fullText = ""; + const tokens = new Array(); + for (const { text: text2, metadata } of data) { + tokens.push(offset + text2.length, metadata); + offset += text2.length; + fullText += text2; + } + return new _LineTokens(new Uint32Array(tokens), fullText, decoder); + } + constructor(tokens, text2, decoder) { + this._lineTokensBrand = void 0; + this._tokens = tokens; + this._tokensCount = this._tokens.length >>> 1; + this._text = text2; + this.languageIdCodec = decoder; + } + equals(other) { + if (other instanceof _LineTokens) { + return this.slicedEquals(other, 0, this._tokensCount); + } + return false; + } + slicedEquals(other, sliceFromTokenIndex, sliceTokenCount) { + if (this._text !== other._text) { + return false; + } + if (this._tokensCount !== other._tokensCount) { + return false; + } + const from = sliceFromTokenIndex << 1; + const to = from + (sliceTokenCount << 1); + for (let i = from; i < to; i++) { + if (this._tokens[i] !== other._tokens[i]) { + return false; + } + } + return true; + } + getLineContent() { + return this._text; + } + getCount() { + return this._tokensCount; + } + getStartOffset(tokenIndex) { + if (tokenIndex > 0) { + return this._tokens[tokenIndex - 1 << 1]; + } + return 0; + } + getMetadata(tokenIndex) { + const metadata = this._tokens[(tokenIndex << 1) + 1]; + return metadata; + } + getLanguageId(tokenIndex) { + const metadata = this._tokens[(tokenIndex << 1) + 1]; + const languageId = TokenMetadata.getLanguageId(metadata); + return this.languageIdCodec.decodeLanguageId(languageId); + } + getStandardTokenType(tokenIndex) { + const metadata = this._tokens[(tokenIndex << 1) + 1]; + return TokenMetadata.getTokenType(metadata); + } + getForeground(tokenIndex) { + const metadata = this._tokens[(tokenIndex << 1) + 1]; + return TokenMetadata.getForeground(metadata); + } + getClassName(tokenIndex) { + const metadata = this._tokens[(tokenIndex << 1) + 1]; + return TokenMetadata.getClassNameFromMetadata(metadata); + } + getInlineStyle(tokenIndex, colorMap) { + const metadata = this._tokens[(tokenIndex << 1) + 1]; + return TokenMetadata.getInlineStyleFromMetadata(metadata, colorMap); + } + getPresentation(tokenIndex) { + const metadata = this._tokens[(tokenIndex << 1) + 1]; + return TokenMetadata.getPresentationFromMetadata(metadata); + } + getEndOffset(tokenIndex) { + return this._tokens[tokenIndex << 1]; + } + /** + * Find the token containing offset `offset`. + * @param offset The search offset + * @return The index of the token containing the offset. + */ + findTokenIndexAtOffset(offset) { + return _LineTokens.findIndexInTokensArray(this._tokens, offset); + } + inflate() { + return this; + } + sliceAndInflate(startOffset, endOffset, deltaOffset) { + return new SliceLineTokens(this, startOffset, endOffset, deltaOffset); + } + static convertToEndOffset(tokens, lineTextLength) { + const tokenCount = tokens.length >>> 1; + const lastTokenIndex = tokenCount - 1; + for (let tokenIndex = 0; tokenIndex < lastTokenIndex; tokenIndex++) { + tokens[tokenIndex << 1] = tokens[tokenIndex + 1 << 1]; + } + tokens[lastTokenIndex << 1] = lineTextLength; + } + static findIndexInTokensArray(tokens, desiredIndex) { + if (tokens.length <= 2) { + return 0; + } + let low = 0; + let high = (tokens.length >>> 1) - 1; + while (low < high) { + const mid = low + Math.floor((high - low) / 2); + const endOffset = tokens[mid << 1]; + if (endOffset === desiredIndex) { + return mid + 1; + } else if (endOffset < desiredIndex) { + low = mid + 1; + } else if (endOffset > desiredIndex) { + high = mid; + } + } + return low; + } + /** + * @pure + * @param insertTokens Must be sorted by offset. + */ + withInserted(insertTokens) { + if (insertTokens.length === 0) { + return this; + } + let nextOriginalTokenIdx = 0; + let nextInsertTokenIdx = 0; + let text2 = ""; + const newTokens = new Array(); + let originalEndOffset = 0; + while (true) { + const nextOriginalTokenEndOffset = nextOriginalTokenIdx < this._tokensCount ? this._tokens[nextOriginalTokenIdx << 1] : -1; + const nextInsertToken = nextInsertTokenIdx < insertTokens.length ? insertTokens[nextInsertTokenIdx] : null; + if (nextOriginalTokenEndOffset !== -1 && (nextInsertToken === null || nextOriginalTokenEndOffset <= nextInsertToken.offset)) { + text2 += this._text.substring(originalEndOffset, nextOriginalTokenEndOffset); + const metadata = this._tokens[(nextOriginalTokenIdx << 1) + 1]; + newTokens.push(text2.length, metadata); + nextOriginalTokenIdx++; + originalEndOffset = nextOriginalTokenEndOffset; + } else if (nextInsertToken) { + if (nextInsertToken.offset > originalEndOffset) { + text2 += this._text.substring(originalEndOffset, nextInsertToken.offset); + const metadata = this._tokens[(nextOriginalTokenIdx << 1) + 1]; + newTokens.push(text2.length, metadata); + originalEndOffset = nextInsertToken.offset; + } + text2 += nextInsertToken.text; + newTokens.push(text2.length, nextInsertToken.tokenMetadata); + nextInsertTokenIdx++; + } else { + break; + } + } + return new _LineTokens(new Uint32Array(newTokens), text2, this.languageIdCodec); + } + getTokenText(tokenIndex) { + const startOffset = this.getStartOffset(tokenIndex); + const endOffset = this.getEndOffset(tokenIndex); + const text2 = this._text.substring(startOffset, endOffset); + return text2; + } + forEach(callback) { + const tokenCount = this.getCount(); + for (let tokenIndex = 0; tokenIndex < tokenCount; tokenIndex++) { + callback(tokenIndex); + } + } + }; + LineTokens.defaultTokenMetadata = (0 << 11 | 1 << 15 | 2 << 24) >>> 0; + SliceLineTokens = class _SliceLineTokens { + constructor(source, startOffset, endOffset, deltaOffset) { + this._source = source; + this._startOffset = startOffset; + this._endOffset = endOffset; + this._deltaOffset = deltaOffset; + this._firstTokenIndex = source.findTokenIndexAtOffset(startOffset); + this.languageIdCodec = source.languageIdCodec; + this._tokensCount = 0; + for (let i = this._firstTokenIndex, len = source.getCount(); i < len; i++) { + const tokenStartOffset = source.getStartOffset(i); + if (tokenStartOffset >= endOffset) { + break; + } + this._tokensCount++; + } + } + getMetadata(tokenIndex) { + return this._source.getMetadata(this._firstTokenIndex + tokenIndex); + } + getLanguageId(tokenIndex) { + return this._source.getLanguageId(this._firstTokenIndex + tokenIndex); + } + getLineContent() { + return this._source.getLineContent().substring(this._startOffset, this._endOffset); + } + equals(other) { + if (other instanceof _SliceLineTokens) { + return this._startOffset === other._startOffset && this._endOffset === other._endOffset && this._deltaOffset === other._deltaOffset && this._source.slicedEquals(other._source, this._firstTokenIndex, this._tokensCount); + } + return false; + } + getCount() { + return this._tokensCount; + } + getStandardTokenType(tokenIndex) { + return this._source.getStandardTokenType(this._firstTokenIndex + tokenIndex); + } + getForeground(tokenIndex) { + return this._source.getForeground(this._firstTokenIndex + tokenIndex); + } + getEndOffset(tokenIndex) { + const tokenEndOffset = this._source.getEndOffset(this._firstTokenIndex + tokenIndex); + return Math.min(this._endOffset, tokenEndOffset) - this._startOffset + this._deltaOffset; + } + getClassName(tokenIndex) { + return this._source.getClassName(this._firstTokenIndex + tokenIndex); + } + getInlineStyle(tokenIndex, colorMap) { + return this._source.getInlineStyle(this._firstTokenIndex + tokenIndex, colorMap); + } + getPresentation(tokenIndex) { + return this._source.getPresentation(this._firstTokenIndex + tokenIndex); + } + findTokenIndexAtOffset(offset) { + return this._source.findTokenIndexAtOffset(offset + this._startOffset - this._deltaOffset) - this._firstTokenIndex; + } + getTokenText(tokenIndex) { + const adjustedTokenIndex = this._firstTokenIndex + tokenIndex; + const tokenStartOffset = this._source.getStartOffset(adjustedTokenIndex); + const tokenEndOffset = this._source.getEndOffset(adjustedTokenIndex); + let text2 = this._source.getTokenText(adjustedTokenIndex); + if (tokenStartOffset < this._startOffset) { + text2 = text2.substring(this._startOffset - tokenStartOffset); + } + if (tokenEndOffset > this._endOffset) { + text2 = text2.substring(0, text2.length - (tokenEndOffset - this._endOffset)); + } + return text2; + } + forEach(callback) { + for (let tokenIndex = 0; tokenIndex < this.getCount(); tokenIndex++) { + callback(tokenIndex); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewLayout/lineDecorations.js +var LineDecoration, DecorationSegment, Stack, LineDecorationsNormalizer; +var init_lineDecorations = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewLayout/lineDecorations.js"() { + init_strings(); + LineDecoration = class _LineDecoration { + constructor(startColumn, endColumn, className, type) { + this.startColumn = startColumn; + this.endColumn = endColumn; + this.className = className; + this.type = type; + this._lineDecorationBrand = void 0; + } + static _equals(a3, b) { + return a3.startColumn === b.startColumn && a3.endColumn === b.endColumn && a3.className === b.className && a3.type === b.type; + } + static equalsArr(a3, b) { + const aLen = a3.length; + const bLen = b.length; + if (aLen !== bLen) { + return false; + } + for (let i = 0; i < aLen; i++) { + if (!_LineDecoration._equals(a3[i], b[i])) { + return false; + } + } + return true; + } + static extractWrapped(arr, startOffset, endOffset) { + if (arr.length === 0) { + return arr; + } + const startColumn = startOffset + 1; + const endColumn = endOffset + 1; + const lineLength = endOffset - startOffset; + const r = []; + let rLength = 0; + for (const dec of arr) { + if (dec.endColumn <= startColumn || dec.startColumn >= endColumn) { + continue; + } + r[rLength++] = new _LineDecoration(Math.max(1, dec.startColumn - startColumn + 1), Math.min(lineLength + 1, dec.endColumn - startColumn + 1), dec.className, dec.type); + } + return r; + } + static filter(lineDecorations, lineNumber, minLineColumn, maxLineColumn) { + if (lineDecorations.length === 0) { + return []; + } + const result = []; + let resultLen = 0; + for (let i = 0, len = lineDecorations.length; i < len; i++) { + const d = lineDecorations[i]; + const range2 = d.range; + if (range2.endLineNumber < lineNumber || range2.startLineNumber > lineNumber) { + continue; + } + if (range2.isEmpty() && (d.type === 0 || d.type === 3)) { + continue; + } + const startColumn = range2.startLineNumber === lineNumber ? range2.startColumn : minLineColumn; + const endColumn = range2.endLineNumber === lineNumber ? range2.endColumn : maxLineColumn; + result[resultLen++] = new _LineDecoration(startColumn, endColumn, d.inlineClassName, d.type); + } + return result; + } + static _typeCompare(a3, b) { + const ORDER = [2, 0, 1, 3]; + return ORDER[a3] - ORDER[b]; + } + static compare(a3, b) { + if (a3.startColumn !== b.startColumn) { + return a3.startColumn - b.startColumn; + } + if (a3.endColumn !== b.endColumn) { + return a3.endColumn - b.endColumn; + } + const typeCmp = _LineDecoration._typeCompare(a3.type, b.type); + if (typeCmp !== 0) { + return typeCmp; + } + if (a3.className !== b.className) { + return a3.className < b.className ? -1 : 1; + } + return 0; + } + }; + DecorationSegment = class { + constructor(startOffset, endOffset, className, metadata) { + this.startOffset = startOffset; + this.endOffset = endOffset; + this.className = className; + this.metadata = metadata; + } + }; + Stack = class _Stack { + constructor() { + this.stopOffsets = []; + this.classNames = []; + this.metadata = []; + this.count = 0; + } + static _metadata(metadata) { + let result = 0; + for (let i = 0, len = metadata.length; i < len; i++) { + result |= metadata[i]; + } + return result; + } + consumeLowerThan(maxStopOffset, nextStartOffset, result) { + while (this.count > 0 && this.stopOffsets[0] < maxStopOffset) { + let i = 0; + while (i + 1 < this.count && this.stopOffsets[i] === this.stopOffsets[i + 1]) { + i++; + } + result.push(new DecorationSegment(nextStartOffset, this.stopOffsets[i], this.classNames.join(" "), _Stack._metadata(this.metadata))); + nextStartOffset = this.stopOffsets[i] + 1; + this.stopOffsets.splice(0, i + 1); + this.classNames.splice(0, i + 1); + this.metadata.splice(0, i + 1); + this.count -= i + 1; + } + if (this.count > 0 && nextStartOffset < maxStopOffset) { + result.push(new DecorationSegment(nextStartOffset, maxStopOffset - 1, this.classNames.join(" "), _Stack._metadata(this.metadata))); + nextStartOffset = maxStopOffset; + } + return nextStartOffset; + } + insert(stopOffset, className, metadata) { + if (this.count === 0 || this.stopOffsets[this.count - 1] <= stopOffset) { + this.stopOffsets.push(stopOffset); + this.classNames.push(className); + this.metadata.push(metadata); + } else { + for (let i = 0; i < this.count; i++) { + if (this.stopOffsets[i] >= stopOffset) { + this.stopOffsets.splice(i, 0, stopOffset); + this.classNames.splice(i, 0, className); + this.metadata.splice(i, 0, metadata); + break; + } + } + } + this.count++; + return; + } + }; + LineDecorationsNormalizer = class { + /** + * Normalize line decorations. Overlapping decorations will generate multiple segments + */ + static normalize(lineContent, lineDecorations) { + if (lineDecorations.length === 0) { + return []; + } + const result = []; + const stack = new Stack(); + let nextStartOffset = 0; + for (let i = 0, len = lineDecorations.length; i < len; i++) { + const d = lineDecorations[i]; + let startColumn = d.startColumn; + let endColumn = d.endColumn; + const className = d.className; + const metadata = d.type === 1 ? 2 : d.type === 2 ? 4 : 0; + if (startColumn > 1) { + const charCodeBefore = lineContent.charCodeAt(startColumn - 2); + if (isHighSurrogate(charCodeBefore)) { + startColumn--; + } + } + if (endColumn > 1) { + const charCodeBefore = lineContent.charCodeAt(endColumn - 2); + if (isHighSurrogate(charCodeBefore)) { + endColumn--; + } + } + const currentStartOffset = startColumn - 1; + const currentEndOffset = endColumn - 2; + nextStartOffset = stack.consumeLowerThan(currentStartOffset, nextStartOffset, result); + if (stack.count === 0) { + nextStartOffset = currentStartOffset; + } + stack.insert(currentEndOffset, className, metadata); + } + stack.consumeLowerThan(1073741824, nextStartOffset, result); + return result; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewLayout/linePart.js +var LinePart; +var init_linePart = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewLayout/linePart.js"() { + LinePart = class { + constructor(endIndex, type, metadata, containsRTL2) { + this.endIndex = endIndex; + this.type = type; + this.metadata = metadata; + this.containsRTL = containsRTL2; + this._linePartBrand = void 0; + } + isWhitespace() { + return this.metadata & 1 ? true : false; + } + isPseudoAfter() { + return this.metadata & 4 ? true : false; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewLayout/viewLineRenderer.js +function renderViewLine(input, sb) { + if (input.lineContent.length === 0) { + if (input.lineDecorations.length > 0) { + sb.appendString(``); + let beforeCount = 0; + let afterCount = 0; + let containsForeignElements = 0; + for (const lineDecoration of input.lineDecorations) { + if (lineDecoration.type === 1 || lineDecoration.type === 2) { + sb.appendString(``); + if (lineDecoration.type === 1) { + containsForeignElements |= 1; + beforeCount++; + } + if (lineDecoration.type === 2) { + containsForeignElements |= 2; + afterCount++; + } + } + } + sb.appendString(``); + const characterMapping = new CharacterMapping(1, beforeCount + afterCount); + characterMapping.setColumnInfo(1, beforeCount, 0, 0); + return new RenderLineOutput(characterMapping, false, containsForeignElements); + } + sb.appendString(""); + return new RenderLineOutput( + new CharacterMapping(0, 0), + false, + 0 + /* ForeignElementType.None */ + ); + } + return _renderLine(resolveRenderLineInput(input), sb); +} +function renderViewLine2(input) { + const sb = new StringBuilder(1e4); + const out = renderViewLine(input, sb); + return new RenderLineOutput2(out.characterMapping, sb.build(), out.containsRTL, out.containsForeignElements); +} +function resolveRenderLineInput(input) { + const lineContent = input.lineContent; + let isOverflowing; + let overflowingCharCount; + let len; + if (input.stopRenderingLineAfter !== -1 && input.stopRenderingLineAfter < lineContent.length) { + isOverflowing = true; + overflowingCharCount = lineContent.length - input.stopRenderingLineAfter; + len = input.stopRenderingLineAfter; + } else { + isOverflowing = false; + overflowingCharCount = 0; + len = lineContent.length; + } + let tokens = transformAndRemoveOverflowing(lineContent, input.containsRTL, input.lineTokens, input.fauxIndentLength, len); + if (input.renderControlCharacters && !input.isBasicASCII) { + tokens = extractControlCharacters(lineContent, tokens); + } + if (input.renderWhitespace === 4 || input.renderWhitespace === 1 || input.renderWhitespace === 2 && !!input.selectionsOnLine || input.renderWhitespace === 3 && !input.continuesWithWrappedLine) { + tokens = _applyRenderWhitespace(input, lineContent, len, tokens); + } + let containsForeignElements = 0; + if (input.lineDecorations.length > 0) { + for (let i = 0, len2 = input.lineDecorations.length; i < len2; i++) { + const lineDecoration = input.lineDecorations[i]; + if (lineDecoration.type === 3) { + containsForeignElements |= 1; + } else if (lineDecoration.type === 1) { + containsForeignElements |= 1; + } else if (lineDecoration.type === 2) { + containsForeignElements |= 2; + } + } + tokens = _applyInlineDecorations(lineContent, len, tokens, input.lineDecorations); + } + if (!input.containsRTL) { + tokens = splitLargeTokens(lineContent, tokens, !input.isBasicASCII || input.fontLigatures); + } + return new ResolvedRenderLineInput(input.useMonospaceOptimizations, input.canUseHalfwidthRightwardsArrow, lineContent, len, isOverflowing, overflowingCharCount, tokens, containsForeignElements, input.fauxIndentLength, input.tabSize, input.startVisibleColumn, input.containsRTL, input.spaceWidth, input.renderSpaceCharCode, input.renderWhitespace, input.renderControlCharacters); +} +function transformAndRemoveOverflowing(lineContent, lineContainsRTL, tokens, fauxIndentLength, len) { + const result = []; + let resultLen = 0; + if (fauxIndentLength > 0) { + result[resultLen++] = new LinePart(fauxIndentLength, "", 0, false); + } + let startOffset = fauxIndentLength; + for (let tokenIndex = 0, tokensLen = tokens.getCount(); tokenIndex < tokensLen; tokenIndex++) { + const endIndex = tokens.getEndOffset(tokenIndex); + if (endIndex <= fauxIndentLength) { + continue; + } + const type = tokens.getClassName(tokenIndex); + if (endIndex >= len) { + const tokenContainsRTL2 = lineContainsRTL ? containsRTL(lineContent.substring(startOffset, len)) : false; + result[resultLen++] = new LinePart(len, type, 0, tokenContainsRTL2); + break; + } + const tokenContainsRTL = lineContainsRTL ? containsRTL(lineContent.substring(startOffset, endIndex)) : false; + result[resultLen++] = new LinePart(endIndex, type, 0, tokenContainsRTL); + startOffset = endIndex; + } + return result; +} +function splitLargeTokens(lineContent, tokens, onlyAtSpaces) { + let lastTokenEndIndex = 0; + const result = []; + let resultLen = 0; + if (onlyAtSpaces) { + for (let i = 0, len = tokens.length; i < len; i++) { + const token = tokens[i]; + const tokenEndIndex = token.endIndex; + if (lastTokenEndIndex + 50 < tokenEndIndex) { + const tokenType = token.type; + const tokenMetadata = token.metadata; + const tokenContainsRTL = token.containsRTL; + let lastSpaceOffset = -1; + let currTokenStart = lastTokenEndIndex; + for (let j = lastTokenEndIndex; j < tokenEndIndex; j++) { + if (lineContent.charCodeAt(j) === 32) { + lastSpaceOffset = j; + } + if (lastSpaceOffset !== -1 && j - currTokenStart >= 50) { + result[resultLen++] = new LinePart(lastSpaceOffset + 1, tokenType, tokenMetadata, tokenContainsRTL); + currTokenStart = lastSpaceOffset + 1; + lastSpaceOffset = -1; + } + } + if (currTokenStart !== tokenEndIndex) { + result[resultLen++] = new LinePart(tokenEndIndex, tokenType, tokenMetadata, tokenContainsRTL); + } + } else { + result[resultLen++] = token; + } + lastTokenEndIndex = tokenEndIndex; + } + } else { + for (let i = 0, len = tokens.length; i < len; i++) { + const token = tokens[i]; + const tokenEndIndex = token.endIndex; + const diff = tokenEndIndex - lastTokenEndIndex; + if (diff > 50) { + const tokenType = token.type; + const tokenMetadata = token.metadata; + const tokenContainsRTL = token.containsRTL; + const piecesCount = Math.ceil( + diff / 50 + /* Constants.LongToken */ + ); + for (let j = 1; j < piecesCount; j++) { + const pieceEndIndex = lastTokenEndIndex + j * 50; + result[resultLen++] = new LinePart(pieceEndIndex, tokenType, tokenMetadata, tokenContainsRTL); + } + result[resultLen++] = new LinePart(tokenEndIndex, tokenType, tokenMetadata, tokenContainsRTL); + } else { + result[resultLen++] = token; + } + lastTokenEndIndex = tokenEndIndex; + } + } + return result; +} +function isControlCharacter(charCode) { + if (charCode < 32) { + return charCode !== 9; + } + if (charCode === 127) { + return true; + } + if (charCode >= 8234 && charCode <= 8238 || charCode >= 8294 && charCode <= 8297 || charCode >= 8206 && charCode <= 8207 || charCode === 1564) { + return true; + } + return false; +} +function extractControlCharacters(lineContent, tokens) { + const result = []; + let lastLinePart = new LinePart(0, "", 0, false); + let charOffset = 0; + for (const token of tokens) { + const tokenEndIndex = token.endIndex; + for (; charOffset < tokenEndIndex; charOffset++) { + const charCode = lineContent.charCodeAt(charOffset); + if (isControlCharacter(charCode)) { + if (charOffset > lastLinePart.endIndex) { + lastLinePart = new LinePart(charOffset, token.type, token.metadata, token.containsRTL); + result.push(lastLinePart); + } + lastLinePart = new LinePart(charOffset + 1, "mtkcontrol", token.metadata, false); + result.push(lastLinePart); + } + } + if (charOffset > lastLinePart.endIndex) { + lastLinePart = new LinePart(tokenEndIndex, token.type, token.metadata, token.containsRTL); + result.push(lastLinePart); + } + } + return result; +} +function _applyRenderWhitespace(input, lineContent, len, tokens) { + const continuesWithWrappedLine = input.continuesWithWrappedLine; + const fauxIndentLength = input.fauxIndentLength; + const tabSize = input.tabSize; + const startVisibleColumn = input.startVisibleColumn; + const useMonospaceOptimizations = input.useMonospaceOptimizations; + const selections = input.selectionsOnLine; + const onlyBoundary = input.renderWhitespace === 1; + const onlyTrailing = input.renderWhitespace === 3; + const generateLinePartForEachWhitespace = input.renderSpaceWidth !== input.spaceWidth; + const result = []; + let resultLen = 0; + let tokenIndex = 0; + let tokenType = tokens[tokenIndex].type; + let tokenContainsRTL = tokens[tokenIndex].containsRTL; + let tokenEndIndex = tokens[tokenIndex].endIndex; + const tokensLength = tokens.length; + let lineIsEmptyOrWhitespace = false; + let firstNonWhitespaceIndex2 = firstNonWhitespaceIndex(lineContent); + let lastNonWhitespaceIndex2; + if (firstNonWhitespaceIndex2 === -1) { + lineIsEmptyOrWhitespace = true; + firstNonWhitespaceIndex2 = len; + lastNonWhitespaceIndex2 = len; + } else { + lastNonWhitespaceIndex2 = lastNonWhitespaceIndex(lineContent); + } + let wasInWhitespace = false; + let currentSelectionIndex = 0; + let currentSelection = selections && selections[currentSelectionIndex]; + let tmpIndent = startVisibleColumn % tabSize; + for (let charIndex = fauxIndentLength; charIndex < len; charIndex++) { + const chCode = lineContent.charCodeAt(charIndex); + if (currentSelection && charIndex >= currentSelection.endOffset) { + currentSelectionIndex++; + currentSelection = selections && selections[currentSelectionIndex]; + } + let isInWhitespace; + if (charIndex < firstNonWhitespaceIndex2 || charIndex > lastNonWhitespaceIndex2) { + isInWhitespace = true; + } else if (chCode === 9) { + isInWhitespace = true; + } else if (chCode === 32) { + if (onlyBoundary) { + if (wasInWhitespace) { + isInWhitespace = true; + } else { + const nextChCode = charIndex + 1 < len ? lineContent.charCodeAt(charIndex + 1) : 0; + isInWhitespace = nextChCode === 32 || nextChCode === 9; + } + } else { + isInWhitespace = true; + } + } else { + isInWhitespace = false; + } + if (isInWhitespace && selections) { + isInWhitespace = !!currentSelection && currentSelection.startOffset <= charIndex && currentSelection.endOffset > charIndex; + } + if (isInWhitespace && onlyTrailing) { + isInWhitespace = lineIsEmptyOrWhitespace || charIndex > lastNonWhitespaceIndex2; + } + if (isInWhitespace && tokenContainsRTL) { + if (charIndex >= firstNonWhitespaceIndex2 && charIndex <= lastNonWhitespaceIndex2) { + isInWhitespace = false; + } + } + if (wasInWhitespace) { + if (!isInWhitespace || !useMonospaceOptimizations && tmpIndent >= tabSize) { + if (generateLinePartForEachWhitespace) { + const lastEndIndex = resultLen > 0 ? result[resultLen - 1].endIndex : fauxIndentLength; + for (let i = lastEndIndex + 1; i <= charIndex; i++) { + result[resultLen++] = new LinePart(i, "mtkw", 1, false); + } + } else { + result[resultLen++] = new LinePart(charIndex, "mtkw", 1, false); + } + tmpIndent = tmpIndent % tabSize; + } + } else { + if (charIndex === tokenEndIndex || isInWhitespace && charIndex > fauxIndentLength) { + result[resultLen++] = new LinePart(charIndex, tokenType, 0, tokenContainsRTL); + tmpIndent = tmpIndent % tabSize; + } + } + if (chCode === 9) { + tmpIndent = tabSize; + } else if (isFullWidthCharacter(chCode)) { + tmpIndent += 2; + } else { + tmpIndent++; + } + wasInWhitespace = isInWhitespace; + while (charIndex === tokenEndIndex) { + tokenIndex++; + if (tokenIndex < tokensLength) { + tokenType = tokens[tokenIndex].type; + tokenContainsRTL = tokens[tokenIndex].containsRTL; + tokenEndIndex = tokens[tokenIndex].endIndex; + } else { + break; + } + } + } + let generateWhitespace = false; + if (wasInWhitespace) { + if (continuesWithWrappedLine && onlyBoundary) { + const lastCharCode = len > 0 ? lineContent.charCodeAt(len - 1) : 0; + const prevCharCode = len > 1 ? lineContent.charCodeAt(len - 2) : 0; + const isSingleTrailingSpace = lastCharCode === 32 && (prevCharCode !== 32 && prevCharCode !== 9); + if (!isSingleTrailingSpace) { + generateWhitespace = true; + } + } else { + generateWhitespace = true; + } + } + if (generateWhitespace) { + if (generateLinePartForEachWhitespace) { + const lastEndIndex = resultLen > 0 ? result[resultLen - 1].endIndex : fauxIndentLength; + for (let i = lastEndIndex + 1; i <= len; i++) { + result[resultLen++] = new LinePart(i, "mtkw", 1, false); + } + } else { + result[resultLen++] = new LinePart(len, "mtkw", 1, false); + } + } else { + result[resultLen++] = new LinePart(len, tokenType, 0, tokenContainsRTL); + } + return result; +} +function _applyInlineDecorations(lineContent, len, tokens, _lineDecorations) { + _lineDecorations.sort(LineDecoration.compare); + const lineDecorations = LineDecorationsNormalizer.normalize(lineContent, _lineDecorations); + const lineDecorationsLen = lineDecorations.length; + let lineDecorationIndex = 0; + const result = []; + let resultLen = 0; + let lastResultEndIndex = 0; + for (let tokenIndex = 0, len2 = tokens.length; tokenIndex < len2; tokenIndex++) { + const token = tokens[tokenIndex]; + const tokenEndIndex = token.endIndex; + const tokenType = token.type; + const tokenMetadata = token.metadata; + const tokenContainsRTL = token.containsRTL; + while (lineDecorationIndex < lineDecorationsLen && lineDecorations[lineDecorationIndex].startOffset < tokenEndIndex) { + const lineDecoration = lineDecorations[lineDecorationIndex]; + if (lineDecoration.startOffset > lastResultEndIndex) { + lastResultEndIndex = lineDecoration.startOffset; + result[resultLen++] = new LinePart(lastResultEndIndex, tokenType, tokenMetadata, tokenContainsRTL); + } + if (lineDecoration.endOffset + 1 <= tokenEndIndex) { + lastResultEndIndex = lineDecoration.endOffset + 1; + result[resultLen++] = new LinePart(lastResultEndIndex, tokenType + " " + lineDecoration.className, tokenMetadata | lineDecoration.metadata, tokenContainsRTL); + lineDecorationIndex++; + } else { + lastResultEndIndex = tokenEndIndex; + result[resultLen++] = new LinePart(lastResultEndIndex, tokenType + " " + lineDecoration.className, tokenMetadata | lineDecoration.metadata, tokenContainsRTL); + break; + } + } + if (tokenEndIndex > lastResultEndIndex) { + lastResultEndIndex = tokenEndIndex; + result[resultLen++] = new LinePart(lastResultEndIndex, tokenType, tokenMetadata, tokenContainsRTL); + } + } + const lastTokenEndIndex = tokens[tokens.length - 1].endIndex; + if (lineDecorationIndex < lineDecorationsLen && lineDecorations[lineDecorationIndex].startOffset === lastTokenEndIndex) { + while (lineDecorationIndex < lineDecorationsLen && lineDecorations[lineDecorationIndex].startOffset === lastTokenEndIndex) { + const lineDecoration = lineDecorations[lineDecorationIndex]; + result[resultLen++] = new LinePart(lastResultEndIndex, lineDecoration.className, lineDecoration.metadata, false); + lineDecorationIndex++; + } + } + return result; +} +function _renderLine(input, sb) { + const fontIsMonospace = input.fontIsMonospace; + const canUseHalfwidthRightwardsArrow = input.canUseHalfwidthRightwardsArrow; + const containsForeignElements = input.containsForeignElements; + const lineContent = input.lineContent; + const len = input.len; + const isOverflowing = input.isOverflowing; + const overflowingCharCount = input.overflowingCharCount; + const parts = input.parts; + const fauxIndentLength = input.fauxIndentLength; + const tabSize = input.tabSize; + const startVisibleColumn = input.startVisibleColumn; + const containsRTL2 = input.containsRTL; + const spaceWidth = input.spaceWidth; + const renderSpaceCharCode = input.renderSpaceCharCode; + const renderWhitespace = input.renderWhitespace; + const renderControlCharacters = input.renderControlCharacters; + const characterMapping = new CharacterMapping(len + 1, parts.length); + let lastCharacterMappingDefined = false; + let charIndex = 0; + let visibleColumn = startVisibleColumn; + let charOffsetInPart = 0; + let charHorizontalOffset = 0; + let partDisplacement = 0; + if (containsRTL2) { + sb.appendString(''); + } else { + sb.appendString(""); + } + for (let partIndex = 0, tokensLen = parts.length; partIndex < tokensLen; partIndex++) { + const part = parts[partIndex]; + const partEndIndex = part.endIndex; + const partType = part.type; + const partContainsRTL = part.containsRTL; + const partRendersWhitespace = renderWhitespace !== 0 && part.isWhitespace(); + const partRendersWhitespaceWithWidth = partRendersWhitespace && !fontIsMonospace && (partType === "mtkw" || !containsForeignElements); + const partIsEmptyAndHasPseudoAfter = charIndex === partEndIndex && part.isPseudoAfter(); + charOffsetInPart = 0; + sb.appendString("= fauxIndentLength) { + _visibleColumn += charWidth; + } + } + } + if (partRendersWhitespaceWithWidth) { + sb.appendString(' style="width:'); + sb.appendString(String(spaceWidth * partWidth)); + sb.appendString('px"'); + } + sb.appendASCIICharCode( + 62 + /* CharCode.GreaterThan */ + ); + for (; charIndex < partEndIndex; charIndex++) { + characterMapping.setColumnInfo(charIndex + 1, partIndex - partDisplacement, charOffsetInPart, charHorizontalOffset); + partDisplacement = 0; + const charCode = lineContent.charCodeAt(charIndex); + let producedCharacters; + let charWidth; + if (charCode === 9) { + producedCharacters = tabSize - visibleColumn % tabSize | 0; + charWidth = producedCharacters; + if (!canUseHalfwidthRightwardsArrow || charWidth > 1) { + sb.appendCharCode(8594); + } else { + sb.appendCharCode(65515); + } + for (let space = 2; space <= charWidth; space++) { + sb.appendCharCode(160); + } + } else { + producedCharacters = 2; + charWidth = 1; + sb.appendCharCode(renderSpaceCharCode); + sb.appendCharCode(8204); + } + charOffsetInPart += producedCharacters; + charHorizontalOffset += charWidth; + if (charIndex >= fauxIndentLength) { + visibleColumn += charWidth; + } + } + } else { + sb.appendASCIICharCode( + 62 + /* CharCode.GreaterThan */ + ); + for (; charIndex < partEndIndex; charIndex++) { + characterMapping.setColumnInfo(charIndex + 1, partIndex - partDisplacement, charOffsetInPart, charHorizontalOffset); + partDisplacement = 0; + const charCode = lineContent.charCodeAt(charIndex); + let producedCharacters = 1; + let charWidth = 1; + switch (charCode) { + case 9: + producedCharacters = tabSize - visibleColumn % tabSize; + charWidth = producedCharacters; + for (let space = 1; space <= producedCharacters; space++) { + sb.appendCharCode(160); + } + break; + case 32: + sb.appendCharCode(160); + break; + case 60: + sb.appendString("<"); + break; + case 62: + sb.appendString(">"); + break; + case 38: + sb.appendString("&"); + break; + case 0: + if (renderControlCharacters) { + sb.appendCharCode(9216); + } else { + sb.appendString("�"); + } + break; + case 65279: + case 8232: + case 8233: + case 133: + sb.appendCharCode(65533); + break; + default: + if (isFullWidthCharacter(charCode)) { + charWidth++; + } + if (renderControlCharacters && charCode < 32) { + sb.appendCharCode(9216 + charCode); + } else if (renderControlCharacters && charCode === 127) { + sb.appendCharCode(9249); + } else if (renderControlCharacters && isControlCharacter(charCode)) { + sb.appendString("[U+"); + sb.appendString(to4CharHex(charCode)); + sb.appendString("]"); + producedCharacters = 8; + charWidth = producedCharacters; + } else { + sb.appendCharCode(charCode); + } + } + charOffsetInPart += producedCharacters; + charHorizontalOffset += charWidth; + if (charIndex >= fauxIndentLength) { + visibleColumn += charWidth; + } + } + } + if (partIsEmptyAndHasPseudoAfter) { + partDisplacement++; + } else { + partDisplacement = 0; + } + if (charIndex >= len && !lastCharacterMappingDefined && part.isPseudoAfter()) { + lastCharacterMappingDefined = true; + characterMapping.setColumnInfo(charIndex + 1, partIndex, charOffsetInPart, charHorizontalOffset); + } + sb.appendString(""); + } + if (!lastCharacterMappingDefined) { + characterMapping.setColumnInfo(len + 1, parts.length - 1, charOffsetInPart, charHorizontalOffset); + } + if (isOverflowing) { + sb.appendString(''); + sb.appendString(localize("showMore", "Show more ({0})", renderOverflowingCharCount(overflowingCharCount))); + sb.appendString(""); + } + sb.appendString(""); + return new RenderLineOutput(characterMapping, containsRTL2, containsForeignElements); +} +function to4CharHex(n) { + return n.toString(16).toUpperCase().padStart(4, "0"); +} +function renderOverflowingCharCount(n) { + if (n < 1024) { + return localize("overflow.chars", "{0} chars", n); + } + if (n < 1024 * 1024) { + return `${(n / 1024).toFixed(1)} KB`; + } + return `${(n / 1024 / 1024).toFixed(1)} MB`; +} +var LineRange2, RenderLineInput, DomPosition, CharacterMapping, RenderLineOutput, RenderLineOutput2, ResolvedRenderLineInput; +var init_viewLineRenderer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewLayout/viewLineRenderer.js"() { + init_nls(); + init_strings(); + init_stringBuilder(); + init_lineDecorations(); + init_linePart(); + LineRange2 = class { + constructor(startIndex, endIndex) { + this.startOffset = startIndex; + this.endOffset = endIndex; + } + equals(otherLineRange) { + return this.startOffset === otherLineRange.startOffset && this.endOffset === otherLineRange.endOffset; + } + }; + RenderLineInput = class { + constructor(useMonospaceOptimizations, canUseHalfwidthRightwardsArrow, lineContent, continuesWithWrappedLine, isBasicASCII2, containsRTL2, fauxIndentLength, lineTokens, lineDecorations, tabSize, startVisibleColumn, spaceWidth, middotWidth, wsmiddotWidth, stopRenderingLineAfter, renderWhitespace, renderControlCharacters, fontLigatures, selectionsOnLine) { + this.useMonospaceOptimizations = useMonospaceOptimizations; + this.canUseHalfwidthRightwardsArrow = canUseHalfwidthRightwardsArrow; + this.lineContent = lineContent; + this.continuesWithWrappedLine = continuesWithWrappedLine; + this.isBasicASCII = isBasicASCII2; + this.containsRTL = containsRTL2; + this.fauxIndentLength = fauxIndentLength; + this.lineTokens = lineTokens; + this.lineDecorations = lineDecorations.sort(LineDecoration.compare); + this.tabSize = tabSize; + this.startVisibleColumn = startVisibleColumn; + this.spaceWidth = spaceWidth; + this.stopRenderingLineAfter = stopRenderingLineAfter; + this.renderWhitespace = renderWhitespace === "all" ? 4 : renderWhitespace === "boundary" ? 1 : renderWhitespace === "selection" ? 2 : renderWhitespace === "trailing" ? 3 : 0; + this.renderControlCharacters = renderControlCharacters; + this.fontLigatures = fontLigatures; + this.selectionsOnLine = selectionsOnLine && selectionsOnLine.sort((a3, b) => a3.startOffset < b.startOffset ? -1 : 1); + const wsmiddotDiff = Math.abs(wsmiddotWidth - spaceWidth); + const middotDiff = Math.abs(middotWidth - spaceWidth); + if (wsmiddotDiff < middotDiff) { + this.renderSpaceWidth = wsmiddotWidth; + this.renderSpaceCharCode = 11825; + } else { + this.renderSpaceWidth = middotWidth; + this.renderSpaceCharCode = 183; + } + } + sameSelection(otherSelections) { + if (this.selectionsOnLine === null) { + return otherSelections === null; + } + if (otherSelections === null) { + return false; + } + if (otherSelections.length !== this.selectionsOnLine.length) { + return false; + } + for (let i = 0; i < this.selectionsOnLine.length; i++) { + if (!this.selectionsOnLine[i].equals(otherSelections[i])) { + return false; + } + } + return true; + } + equals(other) { + return this.useMonospaceOptimizations === other.useMonospaceOptimizations && this.canUseHalfwidthRightwardsArrow === other.canUseHalfwidthRightwardsArrow && this.lineContent === other.lineContent && this.continuesWithWrappedLine === other.continuesWithWrappedLine && this.isBasicASCII === other.isBasicASCII && this.containsRTL === other.containsRTL && this.fauxIndentLength === other.fauxIndentLength && this.tabSize === other.tabSize && this.startVisibleColumn === other.startVisibleColumn && this.spaceWidth === other.spaceWidth && this.renderSpaceWidth === other.renderSpaceWidth && this.renderSpaceCharCode === other.renderSpaceCharCode && this.stopRenderingLineAfter === other.stopRenderingLineAfter && this.renderWhitespace === other.renderWhitespace && this.renderControlCharacters === other.renderControlCharacters && this.fontLigatures === other.fontLigatures && LineDecoration.equalsArr(this.lineDecorations, other.lineDecorations) && this.lineTokens.equals(other.lineTokens) && this.sameSelection(other.selectionsOnLine); + } + }; + DomPosition = class { + constructor(partIndex, charIndex) { + this.partIndex = partIndex; + this.charIndex = charIndex; + } + }; + CharacterMapping = class _CharacterMapping { + static getPartIndex(partData) { + return (partData & 4294901760) >>> 16; + } + static getCharIndex(partData) { + return (partData & 65535) >>> 0; + } + constructor(length, partCount) { + this.length = length; + this._data = new Uint32Array(this.length); + this._horizontalOffset = new Uint32Array(this.length); + } + setColumnInfo(column, partIndex, charIndex, horizontalOffset) { + const partData = (partIndex << 16 | charIndex << 0) >>> 0; + this._data[column - 1] = partData; + this._horizontalOffset[column - 1] = horizontalOffset; + } + getHorizontalOffset(column) { + if (this._horizontalOffset.length === 0) { + return 0; + } + return this._horizontalOffset[column - 1]; + } + charOffsetToPartData(charOffset) { + if (this.length === 0) { + return 0; + } + if (charOffset < 0) { + return this._data[0]; + } + if (charOffset >= this.length) { + return this._data[this.length - 1]; + } + return this._data[charOffset]; + } + getDomPosition(column) { + const partData = this.charOffsetToPartData(column - 1); + const partIndex = _CharacterMapping.getPartIndex(partData); + const charIndex = _CharacterMapping.getCharIndex(partData); + return new DomPosition(partIndex, charIndex); + } + getColumn(domPosition, partLength) { + const charOffset = this.partDataToCharOffset(domPosition.partIndex, partLength, domPosition.charIndex); + return charOffset + 1; + } + partDataToCharOffset(partIndex, partLength, charIndex) { + if (this.length === 0) { + return 0; + } + const searchEntry = (partIndex << 16 | charIndex << 0) >>> 0; + let min = 0; + let max = this.length - 1; + while (min + 1 < max) { + const mid = min + max >>> 1; + const midEntry = this._data[mid]; + if (midEntry === searchEntry) { + return mid; + } else if (midEntry > searchEntry) { + max = mid; + } else { + min = mid; + } + } + if (min === max) { + return min; + } + const minEntry = this._data[min]; + const maxEntry = this._data[max]; + if (minEntry === searchEntry) { + return min; + } + if (maxEntry === searchEntry) { + return max; + } + const minPartIndex = _CharacterMapping.getPartIndex(minEntry); + const minCharIndex = _CharacterMapping.getCharIndex(minEntry); + const maxPartIndex = _CharacterMapping.getPartIndex(maxEntry); + let maxCharIndex; + if (minPartIndex !== maxPartIndex) { + maxCharIndex = partLength; + } else { + maxCharIndex = _CharacterMapping.getCharIndex(maxEntry); + } + const minEntryDistance = charIndex - minCharIndex; + const maxEntryDistance = maxCharIndex - charIndex; + if (minEntryDistance <= maxEntryDistance) { + return min; + } + return max; + } + }; + RenderLineOutput = class { + constructor(characterMapping, containsRTL2, containsForeignElements) { + this._renderLineOutputBrand = void 0; + this.characterMapping = characterMapping; + this.containsRTL = containsRTL2; + this.containsForeignElements = containsForeignElements; + } + }; + RenderLineOutput2 = class { + constructor(characterMapping, html2, containsRTL2, containsForeignElements) { + this.characterMapping = characterMapping; + this.html = html2; + this.containsRTL = containsRTL2; + this.containsForeignElements = containsForeignElements; + } + }; + ResolvedRenderLineInput = class { + constructor(fontIsMonospace, canUseHalfwidthRightwardsArrow, lineContent, len, isOverflowing, overflowingCharCount, parts, containsForeignElements, fauxIndentLength, tabSize, startVisibleColumn, containsRTL2, spaceWidth, renderSpaceCharCode, renderWhitespace, renderControlCharacters) { + this.fontIsMonospace = fontIsMonospace; + this.canUseHalfwidthRightwardsArrow = canUseHalfwidthRightwardsArrow; + this.lineContent = lineContent; + this.len = len; + this.isOverflowing = isOverflowing; + this.overflowingCharCount = overflowingCharCount; + this.parts = parts; + this.containsForeignElements = containsForeignElements; + this.fauxIndentLength = fauxIndentLength; + this.tabSize = tabSize; + this.startVisibleColumn = startVisibleColumn; + this.containsRTL = containsRTL2; + this.spaceWidth = spaceWidth; + this.renderSpaceCharCode = renderSpaceCharCode; + this.renderWhitespace = renderWhitespace; + this.renderControlCharacters = renderControlCharacters; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewModel.js +var Viewport, MinimapLinesRenderingData, ViewLineData, ViewLineRenderingData, InlineDecoration, SingleLineInlineDecoration, ViewModelDecoration, OverviewRulerDecorationsGroup; +var init_viewModel = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewModel.js"() { + init_arrays(); + init_strings(); + init_range(); + Viewport = class { + constructor(top, left, width2, height) { + this._viewportBrand = void 0; + this.top = top | 0; + this.left = left | 0; + this.width = width2 | 0; + this.height = height | 0; + } + }; + MinimapLinesRenderingData = class { + constructor(tabSize, data) { + this.tabSize = tabSize; + this.data = data; + } + }; + ViewLineData = class { + constructor(content, continuesWithWrappedLine, minColumn, maxColumn, startVisibleColumn, tokens, inlineDecorations) { + this._viewLineDataBrand = void 0; + this.content = content; + this.continuesWithWrappedLine = continuesWithWrappedLine; + this.minColumn = minColumn; + this.maxColumn = maxColumn; + this.startVisibleColumn = startVisibleColumn; + this.tokens = tokens; + this.inlineDecorations = inlineDecorations; + } + }; + ViewLineRenderingData = class _ViewLineRenderingData { + constructor(minColumn, maxColumn, content, continuesWithWrappedLine, mightContainRTL, mightContainNonBasicASCII, tokens, inlineDecorations, tabSize, startVisibleColumn) { + this.minColumn = minColumn; + this.maxColumn = maxColumn; + this.content = content; + this.continuesWithWrappedLine = continuesWithWrappedLine; + this.isBasicASCII = _ViewLineRenderingData.isBasicASCII(content, mightContainNonBasicASCII); + this.containsRTL = _ViewLineRenderingData.containsRTL(content, this.isBasicASCII, mightContainRTL); + this.tokens = tokens; + this.inlineDecorations = inlineDecorations; + this.tabSize = tabSize; + this.startVisibleColumn = startVisibleColumn; + } + static isBasicASCII(lineContent, mightContainNonBasicASCII) { + if (mightContainNonBasicASCII) { + return isBasicASCII(lineContent); + } + return true; + } + static containsRTL(lineContent, isBasicASCII2, mightContainRTL) { + if (!isBasicASCII2 && mightContainRTL) { + return containsRTL(lineContent); + } + return false; + } + }; + InlineDecoration = class { + constructor(range2, inlineClassName, type) { + this.range = range2; + this.inlineClassName = inlineClassName; + this.type = type; + } + }; + SingleLineInlineDecoration = class { + constructor(startOffset, endOffset, inlineClassName, inlineClassNameAffectsLetterSpacing) { + this.startOffset = startOffset; + this.endOffset = endOffset; + this.inlineClassName = inlineClassName; + this.inlineClassNameAffectsLetterSpacing = inlineClassNameAffectsLetterSpacing; + } + toInlineDecoration(lineNumber) { + return new InlineDecoration( + new Range(lineNumber, this.startOffset + 1, lineNumber, this.endOffset + 1), + this.inlineClassName, + this.inlineClassNameAffectsLetterSpacing ? 3 : 0 + /* InlineDecorationType.Regular */ + ); + } + }; + ViewModelDecoration = class { + constructor(range2, options2) { + this._viewModelDecorationBrand = void 0; + this.range = range2; + this.options = options2; + } + }; + OverviewRulerDecorationsGroup = class _OverviewRulerDecorationsGroup { + constructor(color, zIndex, data) { + this.color = color; + this.zIndex = zIndex; + this.data = data; + } + static compareByRenderingProps(a3, b) { + if (a3.zIndex === b.zIndex) { + if (a3.color < b.color) { + return -1; + } + if (a3.color > b.color) { + return 1; + } + return 0; + } + return a3.zIndex - b.zIndex; + } + static equals(a3, b) { + return a3.color === b.color && a3.zIndex === b.zIndex && equals(a3.data, b.data); + } + static equalsArr(a3, b) { + return equals(a3, b, _OverviewRulerDecorationsGroup.equals); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/common/monarch/monarchCommon.js +function isFuzzyActionArr(what) { + return Array.isArray(what); +} +function isFuzzyAction(what) { + return !isFuzzyActionArr(what); +} +function isString2(what) { + return typeof what === "string"; +} +function isIAction(what) { + return !isString2(what); +} +function empty(s) { + return s ? false : true; +} +function fixCase(lexer2, str) { + return lexer2.ignoreCase && str ? str.toLowerCase() : str; +} +function sanitize2(s) { + return s.replace(/[&<>'"_]/g, "-"); +} +function log(lexer2, msg) { + console.log(`${lexer2.languageId}: ${msg}`); +} +function createError(lexer2, msg) { + return new Error(`${lexer2.languageId}: ${msg}`); +} +function substituteMatches(lexer2, str, id, matches2, state) { + const re = /\$((\$)|(#)|(\d\d?)|[sS](\d\d?)|@(\w+))/g; + let stateMatches = null; + return str.replace(re, function(full, sub, dollar, hash2, n, s, attr, ofs, total) { + if (!empty(dollar)) { + return "$"; + } + if (!empty(hash2)) { + return fixCase(lexer2, id); + } + if (!empty(n) && n < matches2.length) { + return fixCase(lexer2, matches2[n]); + } + if (!empty(attr) && lexer2 && typeof lexer2[attr] === "string") { + return lexer2[attr]; + } + if (stateMatches === null) { + stateMatches = state.split("."); + stateMatches.unshift(state); + } + if (!empty(s) && s < stateMatches.length) { + return fixCase(lexer2, stateMatches[s]); + } + return ""; + }); +} +function substituteMatchesRe(lexer2, str, state) { + const re = /\$[sS](\d\d?)/g; + let stateMatches = null; + return str.replace(re, function(full, s) { + if (stateMatches === null) { + stateMatches = state.split("."); + stateMatches.unshift(state); + } + if (!empty(s) && s < stateMatches.length) { + return fixCase(lexer2, stateMatches[s]); + } + return ""; + }); +} +function findRules(lexer2, inState) { + let state = inState; + while (state && state.length > 0) { + const rules = lexer2.tokenizer[state]; + if (rules) { + return rules; + } + const idx = state.lastIndexOf("."); + if (idx < 0) { + state = null; + } else { + state = state.substr(0, idx); + } + } + return null; +} +function stateExists(lexer2, inState) { + let state = inState; + while (state && state.length > 0) { + const exist = lexer2.stateNames[state]; + if (exist) { + return true; + } + const idx = state.lastIndexOf("."); + if (idx < 0) { + state = null; + } else { + state = state.substr(0, idx); + } + } + return false; +} +var init_monarchCommon = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/common/monarch/monarchCommon.js"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/common/monarch/monarchLexer.js +function findBracket(lexer2, matched) { + if (!matched) { + return null; + } + matched = fixCase(lexer2, matched); + const brackets = lexer2.brackets; + for (const bracket of brackets) { + if (bracket.open === matched) { + return { + token: bracket.token, + bracketType: 1 + /* monarchCommon.MonarchBracket.Open */ + }; + } else if (bracket.close === matched) { + return { + token: bracket.token, + bracketType: -1 + /* monarchCommon.MonarchBracket.Close */ + }; + } + } + return null; +} +var __decorate4, __param4, MonarchTokenizer_1, CACHE_STACK_DEPTH, MonarchStackElementFactory, MonarchStackElement, EmbeddedLanguageData, MonarchLineStateFactory, MonarchLineState, MonarchClassicTokensCollector, MonarchModernTokensCollector, MonarchTokenizer; +var init_monarchLexer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/common/monarch/monarchLexer.js"() { + init_lifecycle(); + init_languages(); + init_nullTokenize(); + init_monarchCommon(); + init_configuration(); + __decorate4 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param4 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + CACHE_STACK_DEPTH = 5; + MonarchStackElementFactory = class { + static create(parent, state) { + return this._INSTANCE.create(parent, state); + } + constructor(maxCacheDepth) { + this._maxCacheDepth = maxCacheDepth; + this._entries = /* @__PURE__ */ Object.create(null); + } + create(parent, state) { + if (parent !== null && parent.depth >= this._maxCacheDepth) { + return new MonarchStackElement(parent, state); + } + let stackElementId = MonarchStackElement.getStackElementId(parent); + if (stackElementId.length > 0) { + stackElementId += "|"; + } + stackElementId += state; + let result = this._entries[stackElementId]; + if (result) { + return result; + } + result = new MonarchStackElement(parent, state); + this._entries[stackElementId] = result; + return result; + } + }; + MonarchStackElementFactory._INSTANCE = new MonarchStackElementFactory(CACHE_STACK_DEPTH); + MonarchStackElement = class _MonarchStackElement { + constructor(parent, state) { + this.parent = parent; + this.state = state; + this.depth = (this.parent ? this.parent.depth : 0) + 1; + } + static getStackElementId(element) { + let result = ""; + while (element !== null) { + if (result.length > 0) { + result += "|"; + } + result += element.state; + element = element.parent; + } + return result; + } + static _equals(a3, b) { + while (a3 !== null && b !== null) { + if (a3 === b) { + return true; + } + if (a3.state !== b.state) { + return false; + } + a3 = a3.parent; + b = b.parent; + } + if (a3 === null && b === null) { + return true; + } + return false; + } + equals(other) { + return _MonarchStackElement._equals(this, other); + } + push(state) { + return MonarchStackElementFactory.create(this, state); + } + pop() { + return this.parent; + } + popall() { + let result = this; + while (result.parent) { + result = result.parent; + } + return result; + } + switchTo(state) { + return MonarchStackElementFactory.create(this.parent, state); + } + }; + EmbeddedLanguageData = class _EmbeddedLanguageData { + constructor(languageId, state) { + this.languageId = languageId; + this.state = state; + } + equals(other) { + return this.languageId === other.languageId && this.state.equals(other.state); + } + clone() { + const stateClone = this.state.clone(); + if (stateClone === this.state) { + return this; + } + return new _EmbeddedLanguageData(this.languageId, this.state); + } + }; + MonarchLineStateFactory = class { + static create(stack, embeddedLanguageData) { + return this._INSTANCE.create(stack, embeddedLanguageData); + } + constructor(maxCacheDepth) { + this._maxCacheDepth = maxCacheDepth; + this._entries = /* @__PURE__ */ Object.create(null); + } + create(stack, embeddedLanguageData) { + if (embeddedLanguageData !== null) { + return new MonarchLineState(stack, embeddedLanguageData); + } + if (stack !== null && stack.depth >= this._maxCacheDepth) { + return new MonarchLineState(stack, embeddedLanguageData); + } + const stackElementId = MonarchStackElement.getStackElementId(stack); + let result = this._entries[stackElementId]; + if (result) { + return result; + } + result = new MonarchLineState(stack, null); + this._entries[stackElementId] = result; + return result; + } + }; + MonarchLineStateFactory._INSTANCE = new MonarchLineStateFactory(CACHE_STACK_DEPTH); + MonarchLineState = class _MonarchLineState { + constructor(stack, embeddedLanguageData) { + this.stack = stack; + this.embeddedLanguageData = embeddedLanguageData; + } + clone() { + const embeddedlanguageDataClone = this.embeddedLanguageData ? this.embeddedLanguageData.clone() : null; + if (embeddedlanguageDataClone === this.embeddedLanguageData) { + return this; + } + return MonarchLineStateFactory.create(this.stack, this.embeddedLanguageData); + } + equals(other) { + if (!(other instanceof _MonarchLineState)) { + return false; + } + if (!this.stack.equals(other.stack)) { + return false; + } + if (this.embeddedLanguageData === null && other.embeddedLanguageData === null) { + return true; + } + if (this.embeddedLanguageData === null || other.embeddedLanguageData === null) { + return false; + } + return this.embeddedLanguageData.equals(other.embeddedLanguageData); + } + }; + MonarchClassicTokensCollector = class { + constructor() { + this._tokens = []; + this._languageId = null; + this._lastTokenType = null; + this._lastTokenLanguage = null; + } + enterLanguage(languageId) { + this._languageId = languageId; + } + emit(startOffset, type) { + if (this._lastTokenType === type && this._lastTokenLanguage === this._languageId) { + return; + } + this._lastTokenType = type; + this._lastTokenLanguage = this._languageId; + this._tokens.push(new Token(startOffset, type, this._languageId)); + } + nestedLanguageTokenize(embeddedLanguageLine, hasEOL, embeddedLanguageData, offsetDelta) { + const nestedLanguageId = embeddedLanguageData.languageId; + const embeddedModeState = embeddedLanguageData.state; + const nestedLanguageTokenizationSupport = TokenizationRegistry2.get(nestedLanguageId); + if (!nestedLanguageTokenizationSupport) { + this.enterLanguage(nestedLanguageId); + this.emit(offsetDelta, ""); + return embeddedModeState; + } + const nestedResult = nestedLanguageTokenizationSupport.tokenize(embeddedLanguageLine, hasEOL, embeddedModeState); + if (offsetDelta !== 0) { + for (const token of nestedResult.tokens) { + this._tokens.push(new Token(token.offset + offsetDelta, token.type, token.language)); + } + } else { + this._tokens = this._tokens.concat(nestedResult.tokens); + } + this._lastTokenType = null; + this._lastTokenLanguage = null; + this._languageId = null; + return nestedResult.endState; + } + finalize(endState) { + return new TokenizationResult(this._tokens, endState); + } + }; + MonarchModernTokensCollector = class _MonarchModernTokensCollector { + constructor(languageService, theme) { + this._languageService = languageService; + this._theme = theme; + this._prependTokens = null; + this._tokens = []; + this._currentLanguageId = 0; + this._lastTokenMetadata = 0; + } + enterLanguage(languageId) { + this._currentLanguageId = this._languageService.languageIdCodec.encodeLanguageId(languageId); + } + emit(startOffset, type) { + const metadata = this._theme.match(this._currentLanguageId, type) | 1024; + if (this._lastTokenMetadata === metadata) { + return; + } + this._lastTokenMetadata = metadata; + this._tokens.push(startOffset); + this._tokens.push(metadata); + } + static _merge(a3, b, c) { + const aLen = a3 !== null ? a3.length : 0; + const bLen = b.length; + const cLen = c !== null ? c.length : 0; + if (aLen === 0 && bLen === 0 && cLen === 0) { + return new Uint32Array(0); + } + if (aLen === 0 && bLen === 0) { + return c; + } + if (bLen === 0 && cLen === 0) { + return a3; + } + const result = new Uint32Array(aLen + bLen + cLen); + if (a3 !== null) { + result.set(a3); + } + for (let i = 0; i < bLen; i++) { + result[aLen + i] = b[i]; + } + if (c !== null) { + result.set(c, aLen + bLen); + } + return result; + } + nestedLanguageTokenize(embeddedLanguageLine, hasEOL, embeddedLanguageData, offsetDelta) { + const nestedLanguageId = embeddedLanguageData.languageId; + const embeddedModeState = embeddedLanguageData.state; + const nestedLanguageTokenizationSupport = TokenizationRegistry2.get(nestedLanguageId); + if (!nestedLanguageTokenizationSupport) { + this.enterLanguage(nestedLanguageId); + this.emit(offsetDelta, ""); + return embeddedModeState; + } + const nestedResult = nestedLanguageTokenizationSupport.tokenizeEncoded(embeddedLanguageLine, hasEOL, embeddedModeState); + if (offsetDelta !== 0) { + for (let i = 0, len = nestedResult.tokens.length; i < len; i += 2) { + nestedResult.tokens[i] += offsetDelta; + } + } + this._prependTokens = _MonarchModernTokensCollector._merge(this._prependTokens, this._tokens, nestedResult.tokens); + this._tokens = []; + this._currentLanguageId = 0; + this._lastTokenMetadata = 0; + return nestedResult.endState; + } + finalize(endState) { + return new EncodedTokenizationResult(_MonarchModernTokensCollector._merge(this._prependTokens, this._tokens, null), endState); + } + }; + MonarchTokenizer = MonarchTokenizer_1 = class MonarchTokenizer2 extends Disposable { + constructor(languageService, standaloneThemeService, languageId, lexer2, _configurationService) { + super(); + this._configurationService = _configurationService; + this._languageService = languageService; + this._standaloneThemeService = standaloneThemeService; + this._languageId = languageId; + this._lexer = lexer2; + this._embeddedLanguages = /* @__PURE__ */ Object.create(null); + this.embeddedLoaded = Promise.resolve(void 0); + let emitting = false; + this._register(TokenizationRegistry2.onDidChange((e) => { + if (emitting) { + return; + } + let isOneOfMyEmbeddedModes = false; + for (let i = 0, len = e.changedLanguages.length; i < len; i++) { + const language82 = e.changedLanguages[i]; + if (this._embeddedLanguages[language82]) { + isOneOfMyEmbeddedModes = true; + break; + } + } + if (isOneOfMyEmbeddedModes) { + emitting = true; + TokenizationRegistry2.handleChange([this._languageId]); + emitting = false; + } + })); + this._maxTokenizationLineLength = this._configurationService.getValue("editor.maxTokenizationLineLength", { + overrideIdentifier: this._languageId + }); + this._register(this._configurationService.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration("editor.maxTokenizationLineLength")) { + this._maxTokenizationLineLength = this._configurationService.getValue("editor.maxTokenizationLineLength", { + overrideIdentifier: this._languageId + }); + } + })); + } + getLoadStatus() { + const promises = []; + for (const nestedLanguageId in this._embeddedLanguages) { + const tokenizationSupport = TokenizationRegistry2.get(nestedLanguageId); + if (tokenizationSupport) { + if (tokenizationSupport instanceof MonarchTokenizer_1) { + const nestedModeStatus = tokenizationSupport.getLoadStatus(); + if (nestedModeStatus.loaded === false) { + promises.push(nestedModeStatus.promise); + } + } + continue; + } + if (!TokenizationRegistry2.isResolved(nestedLanguageId)) { + promises.push(TokenizationRegistry2.getOrCreate(nestedLanguageId)); + } + } + if (promises.length === 0) { + return { + loaded: true + }; + } + return { + loaded: false, + promise: Promise.all(promises).then((_) => void 0) + }; + } + getInitialState() { + const rootState = MonarchStackElementFactory.create(null, this._lexer.start); + return MonarchLineStateFactory.create(rootState, null); + } + tokenize(line, hasEOL, lineState) { + if (line.length >= this._maxTokenizationLineLength) { + return nullTokenize(this._languageId, lineState); + } + const tokensCollector = new MonarchClassicTokensCollector(); + const endLineState = this._tokenize(line, hasEOL, lineState, tokensCollector); + return tokensCollector.finalize(endLineState); + } + tokenizeEncoded(line, hasEOL, lineState) { + if (line.length >= this._maxTokenizationLineLength) { + return nullTokenizeEncoded(this._languageService.languageIdCodec.encodeLanguageId(this._languageId), lineState); + } + const tokensCollector = new MonarchModernTokensCollector(this._languageService, this._standaloneThemeService.getColorTheme().tokenTheme); + const endLineState = this._tokenize(line, hasEOL, lineState, tokensCollector); + return tokensCollector.finalize(endLineState); + } + _tokenize(line, hasEOL, lineState, collector) { + if (lineState.embeddedLanguageData) { + return this._nestedTokenize(line, hasEOL, lineState, 0, collector); + } else { + return this._myTokenize(line, hasEOL, lineState, 0, collector); + } + } + _findLeavingNestedLanguageOffset(line, state) { + let rules = this._lexer.tokenizer[state.stack.state]; + if (!rules) { + rules = findRules(this._lexer, state.stack.state); + if (!rules) { + throw createError(this._lexer, "tokenizer state is not defined: " + state.stack.state); + } + } + let popOffset = -1; + let hasEmbeddedPopRule = false; + for (const rule of rules) { + if (!isIAction(rule.action) || rule.action.nextEmbedded !== "@pop") { + continue; + } + hasEmbeddedPopRule = true; + let regex = rule.resolveRegex(state.stack.state); + const regexSource = regex.source; + if (regexSource.substr(0, 4) === "^(?:" && regexSource.substr(regexSource.length - 1, 1) === ")") { + const flags = (regex.ignoreCase ? "i" : "") + (regex.unicode ? "u" : ""); + regex = new RegExp(regexSource.substr(4, regexSource.length - 5), flags); + } + const result = line.search(regex); + if (result === -1 || result !== 0 && rule.matchOnlyAtLineStart) { + continue; + } + if (popOffset === -1 || result < popOffset) { + popOffset = result; + } + } + if (!hasEmbeddedPopRule) { + throw createError(this._lexer, 'no rule containing nextEmbedded: "@pop" in tokenizer embedded state: ' + state.stack.state); + } + return popOffset; + } + _nestedTokenize(line, hasEOL, lineState, offsetDelta, tokensCollector) { + const popOffset = this._findLeavingNestedLanguageOffset(line, lineState); + if (popOffset === -1) { + const nestedEndState = tokensCollector.nestedLanguageTokenize(line, hasEOL, lineState.embeddedLanguageData, offsetDelta); + return MonarchLineStateFactory.create(lineState.stack, new EmbeddedLanguageData(lineState.embeddedLanguageData.languageId, nestedEndState)); + } + const nestedLanguageLine = line.substring(0, popOffset); + if (nestedLanguageLine.length > 0) { + tokensCollector.nestedLanguageTokenize(nestedLanguageLine, false, lineState.embeddedLanguageData, offsetDelta); + } + const restOfTheLine = line.substring(popOffset); + return this._myTokenize(restOfTheLine, hasEOL, lineState, offsetDelta + popOffset, tokensCollector); + } + _safeRuleName(rule) { + if (rule) { + return rule.name; + } + return "(unknown)"; + } + _myTokenize(lineWithoutLF, hasEOL, lineState, offsetDelta, tokensCollector) { + tokensCollector.enterLanguage(this._languageId); + const lineWithoutLFLength = lineWithoutLF.length; + const line = hasEOL && this._lexer.includeLF ? lineWithoutLF + "\n" : lineWithoutLF; + const lineLength = line.length; + let embeddedLanguageData = lineState.embeddedLanguageData; + let stack = lineState.stack; + let pos = 0; + let groupMatching = null; + let forceEvaluation = true; + while (forceEvaluation || pos < lineLength) { + const pos0 = pos; + const stackLen0 = stack.depth; + const groupLen0 = groupMatching ? groupMatching.groups.length : 0; + const state = stack.state; + let matches2 = null; + let matched = null; + let action = null; + let rule = null; + let enteringEmbeddedLanguage = null; + if (groupMatching) { + matches2 = groupMatching.matches; + const groupEntry = groupMatching.groups.shift(); + matched = groupEntry.matched; + action = groupEntry.action; + rule = groupMatching.rule; + if (groupMatching.groups.length === 0) { + groupMatching = null; + } + } else { + if (!forceEvaluation && pos >= lineLength) { + break; + } + forceEvaluation = false; + let rules = this._lexer.tokenizer[state]; + if (!rules) { + rules = findRules(this._lexer, state); + if (!rules) { + throw createError(this._lexer, "tokenizer state is not defined: " + state); + } + } + const restOfLine = line.substr(pos); + for (const rule2 of rules) { + if (pos === 0 || !rule2.matchOnlyAtLineStart) { + matches2 = restOfLine.match(rule2.resolveRegex(state)); + if (matches2) { + matched = matches2[0]; + action = rule2.action; + break; + } + } + } + } + if (!matches2) { + matches2 = [""]; + matched = ""; + } + if (!action) { + if (pos < lineLength) { + matches2 = [line.charAt(pos)]; + matched = matches2[0]; + } + action = this._lexer.defaultToken; + } + if (matched === null) { + break; + } + pos += matched.length; + while (isFuzzyAction(action) && isIAction(action) && action.test) { + action = action.test(matched, matches2, state, pos === lineLength); + } + let result = null; + if (typeof action === "string" || Array.isArray(action)) { + result = action; + } else if (action.group) { + result = action.group; + } else if (action.token !== null && action.token !== void 0) { + if (action.tokenSubst) { + result = substituteMatches(this._lexer, action.token, matched, matches2, state); + } else { + result = action.token; + } + if (action.nextEmbedded) { + if (action.nextEmbedded === "@pop") { + if (!embeddedLanguageData) { + throw createError(this._lexer, "cannot pop embedded language if not inside one"); + } + embeddedLanguageData = null; + } else if (embeddedLanguageData) { + throw createError(this._lexer, "cannot enter embedded language from within an embedded language"); + } else { + enteringEmbeddedLanguage = substituteMatches(this._lexer, action.nextEmbedded, matched, matches2, state); + } + } + if (action.goBack) { + pos = Math.max(0, pos - action.goBack); + } + if (action.switchTo && typeof action.switchTo === "string") { + let nextState = substituteMatches(this._lexer, action.switchTo, matched, matches2, state); + if (nextState[0] === "@") { + nextState = nextState.substr(1); + } + if (!findRules(this._lexer, nextState)) { + throw createError(this._lexer, "trying to switch to a state '" + nextState + "' that is undefined in rule: " + this._safeRuleName(rule)); + } else { + stack = stack.switchTo(nextState); + } + } else if (action.transform && typeof action.transform === "function") { + throw createError(this._lexer, "action.transform not supported"); + } else if (action.next) { + if (action.next === "@push") { + if (stack.depth >= this._lexer.maxStack) { + throw createError(this._lexer, "maximum tokenizer stack size reached: [" + stack.state + "," + stack.parent.state + ",...]"); + } else { + stack = stack.push(state); + } + } else if (action.next === "@pop") { + if (stack.depth <= 1) { + throw createError(this._lexer, "trying to pop an empty stack in rule: " + this._safeRuleName(rule)); + } else { + stack = stack.pop(); + } + } else if (action.next === "@popall") { + stack = stack.popall(); + } else { + let nextState = substituteMatches(this._lexer, action.next, matched, matches2, state); + if (nextState[0] === "@") { + nextState = nextState.substr(1); + } + if (!findRules(this._lexer, nextState)) { + throw createError(this._lexer, "trying to set a next state '" + nextState + "' that is undefined in rule: " + this._safeRuleName(rule)); + } else { + stack = stack.push(nextState); + } + } + } + if (action.log && typeof action.log === "string") { + log(this._lexer, this._lexer.languageId + ": " + substituteMatches(this._lexer, action.log, matched, matches2, state)); + } + } + if (result === null) { + throw createError(this._lexer, "lexer rule has no well-defined action in rule: " + this._safeRuleName(rule)); + } + const computeNewStateForEmbeddedLanguage = (enteringEmbeddedLanguage2) => { + const languageId = this._languageService.getLanguageIdByLanguageName(enteringEmbeddedLanguage2) || this._languageService.getLanguageIdByMimeType(enteringEmbeddedLanguage2) || enteringEmbeddedLanguage2; + const embeddedLanguageData2 = this._getNestedEmbeddedLanguageData(languageId); + if (pos < lineLength) { + const restOfLine = lineWithoutLF.substr(pos); + return this._nestedTokenize(restOfLine, hasEOL, MonarchLineStateFactory.create(stack, embeddedLanguageData2), offsetDelta + pos, tokensCollector); + } else { + return MonarchLineStateFactory.create(stack, embeddedLanguageData2); + } + }; + if (Array.isArray(result)) { + if (groupMatching && groupMatching.groups.length > 0) { + throw createError(this._lexer, "groups cannot be nested: " + this._safeRuleName(rule)); + } + if (matches2.length !== result.length + 1) { + throw createError(this._lexer, "matched number of groups does not match the number of actions in rule: " + this._safeRuleName(rule)); + } + let totalLen = 0; + for (let i = 1; i < matches2.length; i++) { + totalLen += matches2[i].length; + } + if (totalLen !== matched.length) { + throw createError(this._lexer, "with groups, all characters should be matched in consecutive groups in rule: " + this._safeRuleName(rule)); + } + groupMatching = { + rule, + matches: matches2, + groups: [] + }; + for (let i = 0; i < result.length; i++) { + groupMatching.groups[i] = { + action: result[i], + matched: matches2[i + 1] + }; + } + pos -= matched.length; + continue; + } else { + if (result === "@rematch") { + pos -= matched.length; + matched = ""; + matches2 = null; + result = ""; + if (enteringEmbeddedLanguage !== null) { + return computeNewStateForEmbeddedLanguage(enteringEmbeddedLanguage); + } + } + if (matched.length === 0) { + if (lineLength === 0 || stackLen0 !== stack.depth || state !== stack.state || (!groupMatching ? 0 : groupMatching.groups.length) !== groupLen0) { + continue; + } else { + throw createError(this._lexer, "no progress in tokenizer in rule: " + this._safeRuleName(rule)); + } + } + let tokenType = null; + if (isString2(result) && result.indexOf("@brackets") === 0) { + const rest = result.substr("@brackets".length); + const bracket = findBracket(this._lexer, matched); + if (!bracket) { + throw createError(this._lexer, "@brackets token returned but no bracket defined as: " + matched); + } + tokenType = sanitize2(bracket.token + rest); + } else { + const token = result === "" ? "" : result + this._lexer.tokenPostfix; + tokenType = sanitize2(token); + } + if (pos0 < lineWithoutLFLength) { + tokensCollector.emit(pos0 + offsetDelta, tokenType); + } + } + if (enteringEmbeddedLanguage !== null) { + return computeNewStateForEmbeddedLanguage(enteringEmbeddedLanguage); + } + } + return MonarchLineStateFactory.create(stack, embeddedLanguageData); + } + _getNestedEmbeddedLanguageData(languageId) { + if (!this._languageService.isRegisteredLanguageId(languageId)) { + return new EmbeddedLanguageData(languageId, NullState); + } + if (languageId !== this._languageId) { + this._languageService.requestBasicLanguageFeatures(languageId); + TokenizationRegistry2.getOrCreate(languageId); + this._embeddedLanguages[languageId] = true; + } + const tokenizationSupport = TokenizationRegistry2.get(languageId); + if (tokenizationSupport) { + return new EmbeddedLanguageData(languageId, tokenizationSupport.getInitialState()); + } + return new EmbeddedLanguageData(languageId, NullState); + } + }; + MonarchTokenizer = MonarchTokenizer_1 = __decorate4([ + __param4(4, IConfigurationService) + ], MonarchTokenizer); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/browser/colorizer.js +function _colorize(lines, tabSize, tokenizationSupport, languageIdCodec) { + return new Promise((c, e) => { + const execute = () => { + const result = _actualColorize(lines, tabSize, tokenizationSupport, languageIdCodec); + if (tokenizationSupport instanceof MonarchTokenizer) { + const status2 = tokenizationSupport.getLoadStatus(); + if (status2.loaded === false) { + status2.promise.then(execute, e); + return; + } + } + c(result); + }; + execute(); + }); +} +function _fakeColorize(lines, tabSize, languageIdCodec) { + let html2 = []; + const defaultMetadata = (0 << 11 | 1 << 15 | 2 << 24) >>> 0; + const tokens = new Uint32Array(2); + tokens[0] = 0; + tokens[1] = defaultMetadata; + for (let i = 0, length = lines.length; i < length; i++) { + const line = lines[i]; + tokens[0] = line.length; + const lineTokens = new LineTokens(tokens, line, languageIdCodec); + const isBasicASCII2 = ViewLineRenderingData.isBasicASCII( + line, + /* check for basic ASCII */ + true + ); + const containsRTL2 = ViewLineRenderingData.containsRTL( + line, + isBasicASCII2, + /* check for RTL */ + true + ); + const renderResult = renderViewLine2(new RenderLineInput(false, true, line, false, isBasicASCII2, containsRTL2, 0, lineTokens, [], tabSize, 0, 0, 0, 0, -1, "none", false, false, null)); + html2 = html2.concat(renderResult.html); + html2.push("
"); + } + return html2.join(""); +} +function _actualColorize(lines, tabSize, tokenizationSupport, languageIdCodec) { + let html2 = []; + let state = tokenizationSupport.getInitialState(); + for (let i = 0, length = lines.length; i < length; i++) { + const line = lines[i]; + const tokenizeResult = tokenizationSupport.tokenizeEncoded(line, true, state); + LineTokens.convertToEndOffset(tokenizeResult.tokens, line.length); + const lineTokens = new LineTokens(tokenizeResult.tokens, line, languageIdCodec); + const isBasicASCII2 = ViewLineRenderingData.isBasicASCII( + line, + /* check for basic ASCII */ + true + ); + const containsRTL2 = ViewLineRenderingData.containsRTL( + line, + isBasicASCII2, + /* check for RTL */ + true + ); + const renderResult = renderViewLine2(new RenderLineInput(false, true, line, false, isBasicASCII2, containsRTL2, 0, lineTokens.inflate(), [], tabSize, 0, 0, 0, 0, -1, "none", false, false, null)); + html2 = html2.concat(renderResult.html); + html2.push("
"); + state = tokenizeResult.endState; + } + return html2.join(""); +} +var ttPolicy2, Colorizer; +var init_colorizer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/browser/colorizer.js"() { + init_trustedTypes(); + init_strings(); + init_languages(); + init_lineTokens(); + init_viewLineRenderer(); + init_viewModel(); + init_monarchLexer(); + ttPolicy2 = createTrustedTypesPolicy("standaloneColorizer", { createHTML: (value) => value }); + Colorizer = class { + static colorizeElement(themeService, languageService, domNode, options2) { + options2 = options2 || {}; + const theme = options2.theme || "vs"; + const mimeType = options2.mimeType || domNode.getAttribute("lang") || domNode.getAttribute("data-lang"); + if (!mimeType) { + console.error("Mode not detected"); + return Promise.resolve(); + } + const languageId = languageService.getLanguageIdByMimeType(mimeType) || mimeType; + themeService.setTheme(theme); + const text2 = domNode.firstChild ? domNode.firstChild.nodeValue : ""; + domNode.className += " " + theme; + const render = (str) => { + var _a10; + const trustedhtml = (_a10 = ttPolicy2 === null || ttPolicy2 === void 0 ? void 0 : ttPolicy2.createHTML(str)) !== null && _a10 !== void 0 ? _a10 : str; + domNode.innerHTML = trustedhtml; + }; + return this.colorize(languageService, text2 || "", languageId, options2).then(render, (err) => console.error(err)); + } + static colorize(languageService, text2, languageId, options2) { + return __async(this, null, function* () { + const languageIdCodec = languageService.languageIdCodec; + let tabSize = 4; + if (options2 && typeof options2.tabSize === "number") { + tabSize = options2.tabSize; + } + if (startsWithUTF8BOM(text2)) { + text2 = text2.substr(1); + } + const lines = splitLines(text2); + if (!languageService.isRegisteredLanguageId(languageId)) { + return _fakeColorize(lines, tabSize, languageIdCodec); + } + const tokenizationSupport = yield TokenizationRegistry2.getOrCreate(languageId); + if (tokenizationSupport) { + return _colorize(lines, tabSize, tokenizationSupport, languageIdCodec); + } + return _fakeColorize(lines, tabSize, languageIdCodec); + }); + } + static colorizeLine(line, mightContainNonBasicASCII, mightContainRTL, tokens, tabSize = 4) { + const isBasicASCII2 = ViewLineRenderingData.isBasicASCII(line, mightContainNonBasicASCII); + const containsRTL2 = ViewLineRenderingData.containsRTL(line, isBasicASCII2, mightContainRTL); + const renderResult = renderViewLine2(new RenderLineInput(false, true, line, false, isBasicASCII2, containsRTL2, 0, tokens, [], tabSize, 0, 0, 0, 0, -1, "none", false, false, null)); + return renderResult.html; + } + static colorizeModelLine(model, lineNumber, tabSize = 4) { + const content = model.getLineContent(lineNumber); + model.tokenization.forceTokenization(lineNumber); + const tokens = model.tokenization.getLineTokens(lineNumber); + const inflatedTokens = tokens.inflate(); + return this.colorizeLine(content, model.mightContainNonBasicASCII(), model.mightContainRTL(), inflatedTokens, tabSize); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/aria/aria.css +var init_aria = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/aria/aria.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/aria/aria.js +function setARIAContainer(parent) { + ariaContainer = document.createElement("div"); + ariaContainer.className = "monaco-aria-container"; + const createAlertContainer = () => { + const element = document.createElement("div"); + element.className = "monaco-alert"; + element.setAttribute("role", "alert"); + element.setAttribute("aria-atomic", "true"); + ariaContainer.appendChild(element); + return element; + }; + alertContainer = createAlertContainer(); + alertContainer2 = createAlertContainer(); + const createStatusContainer = () => { + const element = document.createElement("div"); + element.className = "monaco-status"; + element.setAttribute("aria-live", "polite"); + element.setAttribute("aria-atomic", "true"); + ariaContainer.appendChild(element); + return element; + }; + statusContainer = createStatusContainer(); + statusContainer2 = createStatusContainer(); + parent.appendChild(ariaContainer); +} +function alert(msg) { + if (!ariaContainer) { + return; + } + if (alertContainer.textContent !== msg) { + clearNode(alertContainer2); + insertMessage(alertContainer, msg); + } else { + clearNode(alertContainer); + insertMessage(alertContainer2, msg); + } +} +function status(msg) { + if (!ariaContainer) { + return; + } + if (statusContainer.textContent !== msg) { + clearNode(statusContainer2); + insertMessage(statusContainer, msg); + } else { + clearNode(statusContainer); + insertMessage(statusContainer2, msg); + } +} +function insertMessage(target, msg) { + clearNode(target); + if (msg.length > MAX_MESSAGE_LENGTH) { + msg = msg.substr(0, MAX_MESSAGE_LENGTH); + } + target.textContent = msg; + target.style.visibility = "hidden"; + target.style.visibility = "visible"; +} +var MAX_MESSAGE_LENGTH, ariaContainer, alertContainer, alertContainer2, statusContainer, statusContainer2; +var init_aria2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/aria/aria.js"() { + init_dom(); + init_aria(); + MAX_MESSAGE_LENGTH = 2e4; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/markerDecorations.js +var IMarkerDecorationsService; +var init_markerDecorations = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/markerDecorations.js"() { + init_instantiation(); + IMarkerDecorationsService = createDecorator("markerDecorationsService"); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/services/markerDecorations.js +var __decorate5, __param5, MarkerDecorationsContribution; +var init_markerDecorations2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/services/markerDecorations.js"() { + init_markerDecorations(); + init_editorExtensions(); + __decorate5 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param5 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + MarkerDecorationsContribution = class MarkerDecorationsContribution2 { + constructor(_editor, _markerDecorationsService) { + } + dispose() { + } + }; + MarkerDecorationsContribution.ID = "editor.contrib.markerDecorations"; + MarkerDecorationsContribution = __decorate5([ + __param5(1, IMarkerDecorationsService) + ], MarkerDecorationsContribution); + registerEditorContribution( + MarkerDecorationsContribution.ID, + MarkerDecorationsContribution, + 0 + /* EditorContributionInstantiation.Eager */ + ); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/codeEditor/editor.css +var init_editor = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/codeEditor/editor.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/config/elementSizeObserver.js +var ElementSizeObserver; +var init_elementSizeObserver = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/config/elementSizeObserver.js"() { + init_lifecycle(); + init_event(); + init_dom(); + ElementSizeObserver = class extends Disposable { + constructor(referenceDomElement, dimension) { + super(); + this._onDidChange = this._register(new Emitter()); + this.onDidChange = this._onDidChange.event; + this._referenceDomElement = referenceDomElement; + this._width = -1; + this._height = -1; + this._resizeObserver = null; + this.measureReferenceDomElement(false, dimension); + } + dispose() { + this.stopObserving(); + super.dispose(); + } + getWidth() { + return this._width; + } + getHeight() { + return this._height; + } + startObserving() { + if (!this._resizeObserver && this._referenceDomElement) { + let observedDimenstion = null; + const observeNow = () => { + if (observedDimenstion) { + this.observe({ width: observedDimenstion.width, height: observedDimenstion.height }); + } else { + this.observe(); + } + }; + let shouldObserve = false; + let alreadyObservedThisAnimationFrame = false; + const update = () => { + if (shouldObserve && !alreadyObservedThisAnimationFrame) { + try { + shouldObserve = false; + alreadyObservedThisAnimationFrame = true; + observeNow(); + } finally { + scheduleAtNextAnimationFrame(getWindow(this._referenceDomElement), () => { + alreadyObservedThisAnimationFrame = false; + update(); + }); + } + } + }; + this._resizeObserver = new ResizeObserver((entries2) => { + if (entries2 && entries2[0] && entries2[0].contentRect) { + observedDimenstion = { width: entries2[0].contentRect.width, height: entries2[0].contentRect.height }; + } else { + observedDimenstion = null; + } + shouldObserve = true; + update(); + }); + this._resizeObserver.observe(this._referenceDomElement); + } + } + stopObserving() { + if (this._resizeObserver) { + this._resizeObserver.disconnect(); + this._resizeObserver = null; + } + } + observe(dimension) { + this.measureReferenceDomElement(true, dimension); + } + measureReferenceDomElement(emitEvent, dimension) { + let observedWidth = 0; + let observedHeight = 0; + if (dimension) { + observedWidth = dimension.width; + observedHeight = dimension.height; + } else if (this._referenceDomElement) { + observedWidth = this._referenceDomElement.clientWidth; + observedHeight = this._referenceDomElement.clientHeight; + } + observedWidth = Math.max(5, observedWidth); + observedHeight = Math.max(5, observedHeight); + if (this._width !== observedWidth || this._height !== observedHeight) { + this._width = observedWidth; + this._height = observedHeight; + if (emitEvent) { + this._onDidChange.fire(); + } + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/config/migrateOptions.js +function registerEditorSettingMigration(key, migrate) { + EditorSettingMigration.items.push(new EditorSettingMigration(key, migrate)); +} +function registerSimpleEditorSettingMigration(key, values2) { + registerEditorSettingMigration(key, (value, read, write) => { + if (typeof value !== "undefined") { + for (const [oldValue, newValue] of values2) { + if (value === oldValue) { + write(key, newValue); + return; + } + } + } + }); +} +function migrateOptions(options2) { + EditorSettingMigration.items.forEach((migration) => migration.apply(options2)); +} +var EditorSettingMigration, suggestFilteredTypesMapping; +var init_migrateOptions = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/config/migrateOptions.js"() { + EditorSettingMigration = class _EditorSettingMigration { + constructor(key, migrate) { + this.key = key; + this.migrate = migrate; + } + apply(options2) { + const value = _EditorSettingMigration._read(options2, this.key); + const read = (key) => _EditorSettingMigration._read(options2, key); + const write = (key, value2) => _EditorSettingMigration._write(options2, key, value2); + this.migrate(value, read, write); + } + static _read(source, key) { + if (typeof source === "undefined") { + return void 0; + } + const firstDotIndex = key.indexOf("."); + if (firstDotIndex >= 0) { + const firstSegment = key.substring(0, firstDotIndex); + return this._read(source[firstSegment], key.substring(firstDotIndex + 1)); + } + return source[key]; + } + static _write(target, key, value) { + const firstDotIndex = key.indexOf("."); + if (firstDotIndex >= 0) { + const firstSegment = key.substring(0, firstDotIndex); + target[firstSegment] = target[firstSegment] || {}; + this._write(target[firstSegment], key.substring(firstDotIndex + 1), value); + return; + } + target[key] = value; + } + }; + EditorSettingMigration.items = []; + registerSimpleEditorSettingMigration("wordWrap", [[true, "on"], [false, "off"]]); + registerSimpleEditorSettingMigration("lineNumbers", [[true, "on"], [false, "off"]]); + registerSimpleEditorSettingMigration("cursorBlinking", [["visible", "solid"]]); + registerSimpleEditorSettingMigration("renderWhitespace", [[true, "boundary"], [false, "none"]]); + registerSimpleEditorSettingMigration("renderLineHighlight", [[true, "line"], [false, "none"]]); + registerSimpleEditorSettingMigration("acceptSuggestionOnEnter", [[true, "on"], [false, "off"]]); + registerSimpleEditorSettingMigration("tabCompletion", [[false, "off"], [true, "onlySnippets"]]); + registerSimpleEditorSettingMigration("hover", [[true, { enabled: true }], [false, { enabled: false }]]); + registerSimpleEditorSettingMigration("parameterHints", [[true, { enabled: true }], [false, { enabled: false }]]); + registerSimpleEditorSettingMigration("autoIndent", [[false, "advanced"], [true, "full"]]); + registerSimpleEditorSettingMigration("matchBrackets", [[true, "always"], [false, "never"]]); + registerSimpleEditorSettingMigration("renderFinalNewline", [[true, "on"], [false, "off"]]); + registerSimpleEditorSettingMigration("cursorSmoothCaretAnimation", [[true, "on"], [false, "off"]]); + registerSimpleEditorSettingMigration("occurrencesHighlight", [[true, "singleFile"], [false, "off"]]); + registerSimpleEditorSettingMigration("wordBasedSuggestions", [[true, "matchingDocuments"], [false, "off"]]); + registerEditorSettingMigration("autoClosingBrackets", (value, read, write) => { + if (value === false) { + write("autoClosingBrackets", "never"); + if (typeof read("autoClosingQuotes") === "undefined") { + write("autoClosingQuotes", "never"); + } + if (typeof read("autoSurround") === "undefined") { + write("autoSurround", "never"); + } + } + }); + registerEditorSettingMigration("renderIndentGuides", (value, read, write) => { + if (typeof value !== "undefined") { + write("renderIndentGuides", void 0); + if (typeof read("guides.indentation") === "undefined") { + write("guides.indentation", !!value); + } + } + }); + registerEditorSettingMigration("highlightActiveIndentGuide", (value, read, write) => { + if (typeof value !== "undefined") { + write("highlightActiveIndentGuide", void 0); + if (typeof read("guides.highlightActiveIndentation") === "undefined") { + write("guides.highlightActiveIndentation", !!value); + } + } + }); + suggestFilteredTypesMapping = { + method: "showMethods", + function: "showFunctions", + constructor: "showConstructors", + deprecated: "showDeprecated", + field: "showFields", + variable: "showVariables", + class: "showClasses", + struct: "showStructs", + interface: "showInterfaces", + module: "showModules", + property: "showProperties", + event: "showEvents", + operator: "showOperators", + unit: "showUnits", + value: "showValues", + constant: "showConstants", + enum: "showEnums", + enumMember: "showEnumMembers", + keyword: "showKeywords", + text: "showWords", + color: "showColors", + file: "showFiles", + reference: "showReferences", + folder: "showFolders", + typeParameter: "showTypeParameters", + snippet: "showSnippets" + }; + registerEditorSettingMigration("suggest.filteredTypes", (value, read, write) => { + if (value && typeof value === "object") { + for (const entry of Object.entries(suggestFilteredTypesMapping)) { + const v = value[entry[0]]; + if (v === false) { + if (typeof read(`suggest.${entry[1]}`) === "undefined") { + write(`suggest.${entry[1]}`, false); + } + } + } + write("suggest.filteredTypes", void 0); + } + }); + registerEditorSettingMigration("quickSuggestions", (input, read, write) => { + if (typeof input === "boolean") { + const value = input ? "on" : "off"; + const newValue = { comments: value, strings: value, other: value }; + write("quickSuggestions", newValue); + } + }); + registerEditorSettingMigration("experimental.stickyScroll.enabled", (value, read, write) => { + if (typeof value === "boolean") { + write("experimental.stickyScroll.enabled", void 0); + if (typeof read("stickyScroll.enabled") === "undefined") { + write("stickyScroll.enabled", value); + } + } + }); + registerEditorSettingMigration("experimental.stickyScroll.maxLineCount", (value, read, write) => { + if (typeof value === "number") { + write("experimental.stickyScroll.maxLineCount", void 0); + if (typeof read("stickyScroll.maxLineCount") === "undefined") { + write("stickyScroll.maxLineCount", value); + } + } + }); + registerEditorSettingMigration("codeActionsOnSave", (value, read, write) => { + if (value && typeof value === "object") { + let toBeModified = false; + const newValue = {}; + for (const entry of Object.entries(value)) { + if (typeof entry[1] === "boolean") { + toBeModified = true; + newValue[entry[0]] = entry[1] ? "explicit" : "never"; + } else { + newValue[entry[0]] = entry[1]; + } + } + if (toBeModified) { + write(`codeActionsOnSave`, newValue); + } + } + }); + registerEditorSettingMigration("codeActionWidget.includeNearbyQuickfixes", (value, read, write) => { + if (typeof value === "boolean") { + write("codeActionWidget.includeNearbyQuickfixes", void 0); + if (typeof read("codeActionWidget.includeNearbyQuickFixes") === "undefined") { + write("codeActionWidget.includeNearbyQuickFixes", value); + } + } + }); + registerEditorSettingMigration("lightbulb.enabled", (value, read, write) => { + if (typeof value === "boolean") { + write("lightbulb.enabled", value ? void 0 : "off"); + } + }); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/config/tabFocus.js +var TabFocusImpl, TabFocus; +var init_tabFocus = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/config/tabFocus.js"() { + init_event(); + TabFocusImpl = class { + constructor() { + this._tabFocus = false; + this._onDidChangeTabFocus = new Emitter(); + this.onDidChangeTabFocus = this._onDidChangeTabFocus.event; + } + getTabFocusMode() { + return this._tabFocus; + } + setTabFocusMode(tabFocusMode) { + this._tabFocus = tabFocusMode; + this._onDidChangeTabFocus.fire(this._tabFocus); + } + }; + TabFocus = new TabFocusImpl(); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/accessibility/common/accessibility.js +var IAccessibilityService, CONTEXT_ACCESSIBILITY_MODE_ENABLED; +var init_accessibility = __esm({ + "node_modules/monaco-editor/esm/vs/platform/accessibility/common/accessibility.js"() { + init_contextkey(); + init_instantiation(); + IAccessibilityService = createDecorator("accessibilityService"); + CONTEXT_ACCESSIBILITY_MODE_ENABLED = new RawContextKey("accessibilityModeEnabled", false); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/config/editorConfiguration.js +function digitCount(n) { + let r = 0; + while (n) { + n = Math.floor(n / 10); + r++; + } + return r ? r : 1; +} +function getExtraEditorClassName() { + let extra = ""; + if (!isSafari2 && !isWebkitWebView) { + extra += "no-user-select "; + } + if (isSafari2) { + extra += "no-minimap-shadow "; + extra += "enable-user-select "; + } + if (isMacintosh) { + extra += "mac "; + } + return extra; +} +function deepCloneAndMigrateOptions(_options) { + const options2 = deepClone(_options); + migrateOptions(options2); + return options2; +} +var __decorate6, __param6, EditorConfiguration, ValidatedEditorOptions, ComputedEditorOptions, EditorOptionsUtil; +var init_editorConfiguration = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/config/editorConfiguration.js"() { + init_browser(); + init_arrays(); + init_event(); + init_lifecycle(); + init_objects(); + init_platform(); + init_elementSizeObserver(); + init_fontMeasurements(); + init_migrateOptions(); + init_tabFocus(); + init_editorOptions(); + init_editorZoom(); + init_fontInfo(); + init_accessibility(); + init_dom(); + init_pixelRatio(); + __decorate6 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param6 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + EditorConfiguration = class EditorConfiguration2 extends Disposable { + constructor(isSimpleWidget, contextMenuId, options2, container, _accessibilityService) { + super(); + this._accessibilityService = _accessibilityService; + this._onDidChange = this._register(new Emitter()); + this.onDidChange = this._onDidChange.event; + this._onDidChangeFast = this._register(new Emitter()); + this.onDidChangeFast = this._onDidChangeFast.event; + this._isDominatedByLongLines = false; + this._viewLineCount = 1; + this._lineNumbersDigitCount = 1; + this._reservedHeight = 0; + this._glyphMarginDecorationLaneCount = 1; + this._computeOptionsMemory = new ComputeOptionsMemory(); + this.isSimpleWidget = isSimpleWidget; + this.contextMenuId = contextMenuId; + this._containerObserver = this._register(new ElementSizeObserver(container, options2.dimension)); + this._targetWindowId = getWindow(container).vscodeWindowId; + this._rawOptions = deepCloneAndMigrateOptions(options2); + this._validatedOptions = EditorOptionsUtil.validateOptions(this._rawOptions); + this.options = this._computeOptions(); + if (this.options.get( + 13 + /* EditorOption.automaticLayout */ + )) { + this._containerObserver.startObserving(); + } + this._register(EditorZoom.onDidChangeZoomLevel(() => this._recomputeOptions())); + this._register(TabFocus.onDidChangeTabFocus(() => this._recomputeOptions())); + this._register(this._containerObserver.onDidChange(() => this._recomputeOptions())); + this._register(FontMeasurements.onDidChange(() => this._recomputeOptions())); + this._register(PixelRatio.getInstance(getWindow(container)).onDidChange(() => this._recomputeOptions())); + this._register(this._accessibilityService.onDidChangeScreenReaderOptimized(() => this._recomputeOptions())); + } + _recomputeOptions() { + const newOptions = this._computeOptions(); + const changeEvent = EditorOptionsUtil.checkEquals(this.options, newOptions); + if (changeEvent === null) { + return; + } + this.options = newOptions; + this._onDidChangeFast.fire(changeEvent); + this._onDidChange.fire(changeEvent); + } + _computeOptions() { + const partialEnv = this._readEnvConfiguration(); + const bareFontInfo = BareFontInfo.createFromValidatedSettings(this._validatedOptions, partialEnv.pixelRatio, this.isSimpleWidget); + const fontInfo = this._readFontInfo(bareFontInfo); + const env2 = { + memory: this._computeOptionsMemory, + outerWidth: partialEnv.outerWidth, + outerHeight: partialEnv.outerHeight - this._reservedHeight, + fontInfo, + extraEditorClassName: partialEnv.extraEditorClassName, + isDominatedByLongLines: this._isDominatedByLongLines, + viewLineCount: this._viewLineCount, + lineNumbersDigitCount: this._lineNumbersDigitCount, + emptySelectionClipboard: partialEnv.emptySelectionClipboard, + pixelRatio: partialEnv.pixelRatio, + tabFocusMode: TabFocus.getTabFocusMode(), + accessibilitySupport: partialEnv.accessibilitySupport, + glyphMarginDecorationLaneCount: this._glyphMarginDecorationLaneCount + }; + return EditorOptionsUtil.computeOptions(this._validatedOptions, env2); + } + _readEnvConfiguration() { + return { + extraEditorClassName: getExtraEditorClassName(), + outerWidth: this._containerObserver.getWidth(), + outerHeight: this._containerObserver.getHeight(), + emptySelectionClipboard: isWebKit || isFirefox2, + pixelRatio: PixelRatio.getInstance(getWindowById(this._targetWindowId, true).window).value, + accessibilitySupport: this._accessibilityService.isScreenReaderOptimized() ? 2 : this._accessibilityService.getAccessibilitySupport() + }; + } + _readFontInfo(bareFontInfo) { + return FontMeasurements.readFontInfo(getWindowById(this._targetWindowId, true).window, bareFontInfo); + } + getRawOptions() { + return this._rawOptions; + } + updateOptions(_newOptions) { + const newOptions = deepCloneAndMigrateOptions(_newOptions); + const didChange = EditorOptionsUtil.applyUpdate(this._rawOptions, newOptions); + if (!didChange) { + return; + } + this._validatedOptions = EditorOptionsUtil.validateOptions(this._rawOptions); + this._recomputeOptions(); + } + observeContainer(dimension) { + this._containerObserver.observe(dimension); + } + setIsDominatedByLongLines(isDominatedByLongLines) { + if (this._isDominatedByLongLines === isDominatedByLongLines) { + return; + } + this._isDominatedByLongLines = isDominatedByLongLines; + this._recomputeOptions(); + } + setModelLineCount(modelLineCount) { + const lineNumbersDigitCount = digitCount(modelLineCount); + if (this._lineNumbersDigitCount === lineNumbersDigitCount) { + return; + } + this._lineNumbersDigitCount = lineNumbersDigitCount; + this._recomputeOptions(); + } + setViewLineCount(viewLineCount) { + if (this._viewLineCount === viewLineCount) { + return; + } + this._viewLineCount = viewLineCount; + this._recomputeOptions(); + } + setReservedHeight(reservedHeight) { + if (this._reservedHeight === reservedHeight) { + return; + } + this._reservedHeight = reservedHeight; + this._recomputeOptions(); + } + setGlyphMarginDecorationLaneCount(decorationLaneCount) { + if (this._glyphMarginDecorationLaneCount === decorationLaneCount) { + return; + } + this._glyphMarginDecorationLaneCount = decorationLaneCount; + this._recomputeOptions(); + } + }; + EditorConfiguration = __decorate6([ + __param6(4, IAccessibilityService) + ], EditorConfiguration); + ValidatedEditorOptions = class { + constructor() { + this._values = []; + } + _read(option) { + return this._values[option]; + } + get(id) { + return this._values[id]; + } + _write(option, value) { + this._values[option] = value; + } + }; + ComputedEditorOptions = class { + constructor() { + this._values = []; + } + _read(id) { + if (id >= this._values.length) { + throw new Error("Cannot read uninitialized value"); + } + return this._values[id]; + } + get(id) { + return this._read(id); + } + _write(id, value) { + this._values[id] = value; + } + }; + EditorOptionsUtil = class _EditorOptionsUtil { + static validateOptions(options2) { + const result = new ValidatedEditorOptions(); + for (const editorOption of editorOptionsRegistry) { + const value = editorOption.name === "_never_" ? void 0 : options2[editorOption.name]; + result._write(editorOption.id, editorOption.validate(value)); + } + return result; + } + static computeOptions(options2, env2) { + const result = new ComputedEditorOptions(); + for (const editorOption of editorOptionsRegistry) { + result._write(editorOption.id, editorOption.compute(env2, result, options2._read(editorOption.id))); + } + return result; + } + static _deepEquals(a3, b) { + if (typeof a3 !== "object" || typeof b !== "object" || !a3 || !b) { + return a3 === b; + } + if (Array.isArray(a3) || Array.isArray(b)) { + return Array.isArray(a3) && Array.isArray(b) ? equals(a3, b) : false; + } + if (Object.keys(a3).length !== Object.keys(b).length) { + return false; + } + for (const key in a3) { + if (!_EditorOptionsUtil._deepEquals(a3[key], b[key])) { + return false; + } + } + return true; + } + static checkEquals(a3, b) { + const result = []; + let somethingChanged = false; + for (const editorOption of editorOptionsRegistry) { + const changed = !_EditorOptionsUtil._deepEquals(a3._read(editorOption.id), b._read(editorOption.id)); + result[editorOption.id] = changed; + if (changed) { + somethingChanged = true; + } + } + return somethingChanged ? new ConfigurationChangedEvent(result) : null; + } + /** + * Returns true if something changed. + * Modifies `options`. + */ + static applyUpdate(options2, update) { + let changed = false; + for (const editorOption of editorOptionsRegistry) { + if (update.hasOwnProperty(editorOption.name)) { + const result = editorOption.applyUpdate(options2[editorOption.name], update[editorOption.name]); + options2[editorOption.name] = result.newValue; + changed = changed || result.didChange; + } + } + return changed; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/performance.js +var inputLatency; +var init_performance = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/performance.js"() { + (function(inputLatency2) { + const totalKeydownTime = { total: 0, min: Number.MAX_VALUE, max: 0 }; + const totalInputTime = __spreadValues({}, totalKeydownTime); + const totalRenderTime = __spreadValues({}, totalKeydownTime); + const totalInputLatencyTime = __spreadValues({}, totalKeydownTime); + let measurementsCount = 0; + const state = { + keydown: 0, + input: 0, + render: 0 + }; + function onKeyDown() { + recordIfFinished(); + performance.mark("inputlatency/start"); + performance.mark("keydown/start"); + state.keydown = 1; + queueMicrotask(markKeyDownEnd); + } + inputLatency2.onKeyDown = onKeyDown; + function markKeyDownEnd() { + if (state.keydown === 1) { + performance.mark("keydown/end"); + state.keydown = 2; + } + } + function onBeforeInput() { + performance.mark("input/start"); + state.input = 1; + scheduleRecordIfFinishedTask(); + } + inputLatency2.onBeforeInput = onBeforeInput; + function onInput() { + if (state.input === 0) { + onBeforeInput(); + } + queueMicrotask(markInputEnd); + } + inputLatency2.onInput = onInput; + function markInputEnd() { + if (state.input === 1) { + performance.mark("input/end"); + state.input = 2; + } + } + function onKeyUp() { + recordIfFinished(); + } + inputLatency2.onKeyUp = onKeyUp; + function onSelectionChange() { + recordIfFinished(); + } + inputLatency2.onSelectionChange = onSelectionChange; + function onRenderStart() { + if (state.keydown === 2 && state.input === 2 && state.render === 0) { + performance.mark("render/start"); + state.render = 1; + queueMicrotask(markRenderEnd); + scheduleRecordIfFinishedTask(); + } + } + inputLatency2.onRenderStart = onRenderStart; + function markRenderEnd() { + if (state.render === 1) { + performance.mark("render/end"); + state.render = 2; + } + } + function scheduleRecordIfFinishedTask() { + setTimeout(recordIfFinished); + } + function recordIfFinished() { + if (state.keydown === 2 && state.input === 2 && state.render === 2) { + performance.mark("inputlatency/end"); + performance.measure("keydown", "keydown/start", "keydown/end"); + performance.measure("input", "input/start", "input/end"); + performance.measure("render", "render/start", "render/end"); + performance.measure("inputlatency", "inputlatency/start", "inputlatency/end"); + addMeasure("keydown", totalKeydownTime); + addMeasure("input", totalInputTime); + addMeasure("render", totalRenderTime); + addMeasure("inputlatency", totalInputLatencyTime); + measurementsCount++; + reset2(); + } + } + function addMeasure(entryName, cumulativeMeasurement) { + const duration = performance.getEntriesByName(entryName)[0].duration; + cumulativeMeasurement.total += duration; + cumulativeMeasurement.min = Math.min(cumulativeMeasurement.min, duration); + cumulativeMeasurement.max = Math.max(cumulativeMeasurement.max, duration); + } + function reset2() { + performance.clearMarks("keydown/start"); + performance.clearMarks("keydown/end"); + performance.clearMarks("input/start"); + performance.clearMarks("input/end"); + performance.clearMarks("render/start"); + performance.clearMarks("render/end"); + performance.clearMarks("inputlatency/start"); + performance.clearMarks("inputlatency/end"); + performance.clearMeasures("keydown"); + performance.clearMeasures("input"); + performance.clearMeasures("render"); + performance.clearMeasures("inputlatency"); + state.keydown = 0; + state.input = 0; + state.render = 0; + } + function getAndClearMeasurements() { + if (measurementsCount === 0) { + return void 0; + } + const result = { + keydown: cumulativeToFinalMeasurement(totalKeydownTime), + input: cumulativeToFinalMeasurement(totalInputTime), + render: cumulativeToFinalMeasurement(totalRenderTime), + total: cumulativeToFinalMeasurement(totalInputLatencyTime), + sampleCount: measurementsCount + }; + clearCumulativeMeasurement(totalKeydownTime); + clearCumulativeMeasurement(totalInputTime); + clearCumulativeMeasurement(totalRenderTime); + clearCumulativeMeasurement(totalInputLatencyTime); + measurementsCount = 0; + return result; + } + inputLatency2.getAndClearMeasurements = getAndClearMeasurements; + function cumulativeToFinalMeasurement(cumulative) { + return { + average: cumulative.total / measurementsCount, + max: cumulative.max, + min: cumulative.min + }; + } + function clearCumulativeMeasurement(cumulative) { + cumulative.total = 0; + cumulative.min = Number.MAX_VALUE; + cumulative.max = 0; + } + })(inputLatency || (inputLatency = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/globalPointerMoveMonitor.js +var GlobalPointerMoveMonitor; +var init_globalPointerMoveMonitor = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/globalPointerMoveMonitor.js"() { + init_dom(); + init_lifecycle(); + GlobalPointerMoveMonitor = class { + constructor() { + this._hooks = new DisposableStore(); + this._pointerMoveCallback = null; + this._onStopCallback = null; + } + dispose() { + this.stopMonitoring(false); + this._hooks.dispose(); + } + stopMonitoring(invokeStopCallback, browserEvent) { + if (!this.isMonitoring()) { + return; + } + this._hooks.clear(); + this._pointerMoveCallback = null; + const onStopCallback = this._onStopCallback; + this._onStopCallback = null; + if (invokeStopCallback && onStopCallback) { + onStopCallback(browserEvent); + } + } + isMonitoring() { + return !!this._pointerMoveCallback; + } + startMonitoring(initialElement, pointerId, initialButtons, pointerMoveCallback, onStopCallback) { + if (this.isMonitoring()) { + this.stopMonitoring(false); + } + this._pointerMoveCallback = pointerMoveCallback; + this._onStopCallback = onStopCallback; + let eventSource = initialElement; + try { + initialElement.setPointerCapture(pointerId); + this._hooks.add(toDisposable(() => { + try { + initialElement.releasePointerCapture(pointerId); + } catch (err) { + } + })); + } catch (err) { + eventSource = getWindow(initialElement); + } + this._hooks.add(addDisposableListener(eventSource, EventType.POINTER_MOVE, (e) => { + if (e.buttons !== initialButtons) { + this.stopMonitoring(true); + return; + } + e.preventDefault(); + this._pointerMoveCallback(e); + })); + this._hooks.add(addDisposableListener(eventSource, EventType.POINTER_UP, (e) => this.stopMonitoring(true))); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/colorUtils.js +function asCssVariableName(colorIdent) { + return `--vscode-${colorIdent.replace(/\./g, "-")}`; +} +function asCssVariable(color) { + return `var(${asCssVariableName(color)})`; +} +function asCssVariableWithDefault(color, defaultCssValue) { + return `var(${asCssVariableName(color)}, ${defaultCssValue})`; +} +function registerColor(id, defaults, description, needsTransparency, deprecationMessage) { + return colorRegistry.registerColor(id, defaults, description, needsTransparency, deprecationMessage); +} +function executeTransform(transform, theme) { + var _a10, _b4, _c2, _d2; + switch (transform.op) { + case 0: + return (_a10 = resolveColorValue(transform.value, theme)) === null || _a10 === void 0 ? void 0 : _a10.darken(transform.factor); + case 1: + return (_b4 = resolveColorValue(transform.value, theme)) === null || _b4 === void 0 ? void 0 : _b4.lighten(transform.factor); + case 2: + return (_c2 = resolveColorValue(transform.value, theme)) === null || _c2 === void 0 ? void 0 : _c2.transparent(transform.factor); + case 3: { + const backgroundColor = resolveColorValue(transform.background, theme); + if (!backgroundColor) { + return resolveColorValue(transform.value, theme); + } + return (_d2 = resolveColorValue(transform.value, theme)) === null || _d2 === void 0 ? void 0 : _d2.makeOpaque(backgroundColor); + } + case 4: + for (const candidate of transform.values) { + const color = resolveColorValue(candidate, theme); + if (color) { + return color; + } + } + return void 0; + case 6: + return resolveColorValue(theme.defines(transform.if) ? transform.then : transform.else, theme); + case 5: { + const from = resolveColorValue(transform.value, theme); + if (!from) { + return void 0; + } + const backgroundColor = resolveColorValue(transform.background, theme); + if (!backgroundColor) { + return from.transparent(transform.factor * transform.transparency); + } + return from.isDarkerThan(backgroundColor) ? Color.getLighterColor(from, backgroundColor, transform.factor).transparent(transform.transparency) : Color.getDarkerColor(from, backgroundColor, transform.factor).transparent(transform.transparency); + } + default: + throw assertNever(transform); + } +} +function darken(colorValue, factor2) { + return { op: 0, value: colorValue, factor: factor2 }; +} +function lighten(colorValue, factor2) { + return { op: 1, value: colorValue, factor: factor2 }; +} +function transparent(colorValue, factor2) { + return { op: 2, value: colorValue, factor: factor2 }; +} +function oneOf(...colorValues) { + return { op: 4, values: colorValues }; +} +function ifDefinedThenElse(ifArg, thenArg, elseArg) { + return { op: 6, if: ifArg, then: thenArg, else: elseArg }; +} +function lessProminent(colorValue, backgroundColorValue, factor2, transparency) { + return { op: 5, value: colorValue, background: backgroundColorValue, factor: factor2, transparency }; +} +function resolveColorValue(colorValue, theme) { + if (colorValue === null) { + return void 0; + } else if (typeof colorValue === "string") { + if (colorValue[0] === "#") { + return Color.fromHex(colorValue); + } + return theme.getColor(colorValue); + } else if (colorValue instanceof Color) { + return colorValue; + } else if (typeof colorValue === "object") { + return executeTransform(colorValue, theme); + } + return void 0; +} +var Extensions6, ColorRegistry, colorRegistry, workbenchColorsSchemaId, schemaRegistry, delayer; +var init_colorUtils = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/colorUtils.js"() { + init_assert(); + init_async(); + init_color(); + init_event(); + init_jsonContributionRegistry(); + init_platform2(); + Extensions6 = { + ColorContribution: "base.contributions.colors" + }; + ColorRegistry = class { + constructor() { + this._onDidChangeSchema = new Emitter(); + this.onDidChangeSchema = this._onDidChangeSchema.event; + this.colorSchema = { type: "object", properties: {} }; + this.colorReferenceSchema = { type: "string", enum: [], enumDescriptions: [] }; + this.colorsById = {}; + } + registerColor(id, defaults, description, needsTransparency = false, deprecationMessage) { + const colorContribution = { id, description, defaults, needsTransparency, deprecationMessage }; + this.colorsById[id] = colorContribution; + const propertySchema = { type: "string", description, format: "color-hex", defaultSnippets: [{ body: "${1:#ff0000}" }] }; + if (deprecationMessage) { + propertySchema.deprecationMessage = deprecationMessage; + } + if (needsTransparency) { + propertySchema.pattern = "^#(?:(?[0-9a-fA-f]{3}[0-9a-eA-E])|(?:[0-9a-fA-F]{6}(?:(?![fF]{2})(?:[0-9a-fA-F]{2}))))?$"; + propertySchema.patternErrorMessage = "This color must be transparent or it will obscure content"; + } + this.colorSchema.properties[id] = propertySchema; + this.colorReferenceSchema.enum.push(id); + this.colorReferenceSchema.enumDescriptions.push(description); + this._onDidChangeSchema.fire(); + return id; + } + getColors() { + return Object.keys(this.colorsById).map((id) => this.colorsById[id]); + } + resolveDefaultColor(id, theme) { + const colorDesc = this.colorsById[id]; + if (colorDesc && colorDesc.defaults) { + const colorValue = colorDesc.defaults[theme.type]; + return resolveColorValue(colorValue, theme); + } + return void 0; + } + getColorSchema() { + return this.colorSchema; + } + toString() { + const sorter2 = (a3, b) => { + const cat1 = a3.indexOf(".") === -1 ? 0 : 1; + const cat2 = b.indexOf(".") === -1 ? 0 : 1; + if (cat1 !== cat2) { + return cat1 - cat2; + } + return a3.localeCompare(b); + }; + return Object.keys(this.colorsById).sort(sorter2).map((k) => `- \`${k}\`: ${this.colorsById[k].description}`).join("\n"); + } + }; + colorRegistry = new ColorRegistry(); + Registry.add(Extensions6.ColorContribution, colorRegistry); + workbenchColorsSchemaId = "vscode://schemas/workbench-colors"; + schemaRegistry = Registry.as(Extensions3.JSONContribution); + schemaRegistry.registerSchema(workbenchColorsSchemaId, colorRegistry.getColorSchema()); + delayer = new RunOnceScheduler(() => schemaRegistry.notifySchemaChanged(workbenchColorsSchemaId), 200); + colorRegistry.onDidChangeSchema(() => { + if (!delayer.isScheduled()) { + delayer.schedule(); + } + }); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/colors/baseColors.js +var foreground, disabledForeground, errorForeground, descriptionForeground, iconForeground, focusBorder, contrastBorder, activeContrastBorder, selectionBackground, textLinkForeground, textLinkActiveForeground, textSeparatorForeground, textPreformatForeground, textPreformatBackground, textBlockQuoteBackground, textBlockQuoteBorder, textCodeBlockBackground; +var init_baseColors = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/colors/baseColors.js"() { + init_nls(); + init_color(); + init_colorUtils(); + foreground = registerColor("foreground", { dark: "#CCCCCC", light: "#616161", hcDark: "#FFFFFF", hcLight: "#292929" }, localize("foreground", "Overall foreground color. This color is only used if not overridden by a component.")); + disabledForeground = registerColor("disabledForeground", { dark: "#CCCCCC80", light: "#61616180", hcDark: "#A5A5A5", hcLight: "#7F7F7F" }, localize("disabledForeground", "Overall foreground for disabled elements. This color is only used if not overridden by a component.")); + errorForeground = registerColor("errorForeground", { dark: "#F48771", light: "#A1260D", hcDark: "#F48771", hcLight: "#B5200D" }, localize("errorForeground", "Overall foreground color for error messages. This color is only used if not overridden by a component.")); + descriptionForeground = registerColor("descriptionForeground", { light: "#717171", dark: transparent(foreground, 0.7), hcDark: transparent(foreground, 0.7), hcLight: transparent(foreground, 0.7) }, localize("descriptionForeground", "Foreground color for description text providing additional information, for example for a label.")); + iconForeground = registerColor("icon.foreground", { dark: "#C5C5C5", light: "#424242", hcDark: "#FFFFFF", hcLight: "#292929" }, localize("iconForeground", "The default color for icons in the workbench.")); + focusBorder = registerColor("focusBorder", { dark: "#007FD4", light: "#0090F1", hcDark: "#F38518", hcLight: "#006BBD" }, localize("focusBorder", "Overall border color for focused elements. This color is only used if not overridden by a component.")); + contrastBorder = registerColor("contrastBorder", { light: null, dark: null, hcDark: "#6FC3DF", hcLight: "#0F4A85" }, localize("contrastBorder", "An extra border around elements to separate them from others for greater contrast.")); + activeContrastBorder = registerColor("contrastActiveBorder", { light: null, dark: null, hcDark: focusBorder, hcLight: focusBorder }, localize("activeContrastBorder", "An extra border around active elements to separate them from others for greater contrast.")); + selectionBackground = registerColor("selection.background", { light: null, dark: null, hcDark: null, hcLight: null }, localize("selectionBackground", "The background color of text selections in the workbench (e.g. for input fields or text areas). Note that this does not apply to selections within the editor.")); + textLinkForeground = registerColor("textLink.foreground", { light: "#006AB1", dark: "#3794FF", hcDark: "#21A6FF", hcLight: "#0F4A85" }, localize("textLinkForeground", "Foreground color for links in text.")); + textLinkActiveForeground = registerColor("textLink.activeForeground", { light: "#006AB1", dark: "#3794FF", hcDark: "#21A6FF", hcLight: "#0F4A85" }, localize("textLinkActiveForeground", "Foreground color for links in text when clicked on and on mouse hover.")); + textSeparatorForeground = registerColor("textSeparator.foreground", { light: "#0000002e", dark: "#ffffff2e", hcDark: Color.black, hcLight: "#292929" }, localize("textSeparatorForeground", "Color for text separators.")); + textPreformatForeground = registerColor("textPreformat.foreground", { light: "#A31515", dark: "#D7BA7D", hcDark: "#000000", hcLight: "#FFFFFF" }, localize("textPreformatForeground", "Foreground color for preformatted text segments.")); + textPreformatBackground = registerColor("textPreformat.background", { light: "#0000001A", dark: "#FFFFFF1A", hcDark: "#FFFFFF", hcLight: "#09345f" }, localize("textPreformatBackground", "Background color for preformatted text segments.")); + textBlockQuoteBackground = registerColor("textBlockQuote.background", { light: "#f2f2f2", dark: "#222222", hcDark: null, hcLight: "#F2F2F2" }, localize("textBlockQuoteBackground", "Background color for block quotes in text.")); + textBlockQuoteBorder = registerColor("textBlockQuote.border", { light: "#007acc80", dark: "#007acc80", hcDark: Color.white, hcLight: "#292929" }, localize("textBlockQuoteBorder", "Border color for block quotes in text.")); + textCodeBlockBackground = registerColor("textCodeBlock.background", { light: "#dcdcdc66", dark: "#0a0a0a66", hcDark: Color.black, hcLight: "#F2F2F2" }, localize("textCodeBlockBackground", "Background color for code blocks in text.")); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/colors/miscColors.js +var sashHoverBorder, badgeBackground, badgeForeground, scrollbarShadow, scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground, progressBarBackground; +var init_miscColors = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/colors/miscColors.js"() { + init_nls(); + init_color(); + init_colorUtils(); + init_baseColors(); + sashHoverBorder = registerColor("sash.hoverBorder", { dark: focusBorder, light: focusBorder, hcDark: focusBorder, hcLight: focusBorder }, localize("sashActiveBorder", "Border color of active sashes.")); + badgeBackground = registerColor("badge.background", { dark: "#4D4D4D", light: "#C4C4C4", hcDark: Color.black, hcLight: "#0F4A85" }, localize("badgeBackground", "Badge background color. Badges are small information labels, e.g. for search results count.")); + badgeForeground = registerColor("badge.foreground", { dark: Color.white, light: "#333", hcDark: Color.white, hcLight: Color.white }, localize("badgeForeground", "Badge foreground color. Badges are small information labels, e.g. for search results count.")); + scrollbarShadow = registerColor("scrollbar.shadow", { dark: "#000000", light: "#DDDDDD", hcDark: null, hcLight: null }, localize("scrollbarShadow", "Scrollbar shadow to indicate that the view is scrolled.")); + scrollbarSliderBackground = registerColor("scrollbarSlider.background", { dark: Color.fromHex("#797979").transparent(0.4), light: Color.fromHex("#646464").transparent(0.4), hcDark: transparent(contrastBorder, 0.6), hcLight: transparent(contrastBorder, 0.4) }, localize("scrollbarSliderBackground", "Scrollbar slider background color.")); + scrollbarSliderHoverBackground = registerColor("scrollbarSlider.hoverBackground", { dark: Color.fromHex("#646464").transparent(0.7), light: Color.fromHex("#646464").transparent(0.7), hcDark: transparent(contrastBorder, 0.8), hcLight: transparent(contrastBorder, 0.8) }, localize("scrollbarSliderHoverBackground", "Scrollbar slider background color when hovering.")); + scrollbarSliderActiveBackground = registerColor("scrollbarSlider.activeBackground", { dark: Color.fromHex("#BFBFBF").transparent(0.4), light: Color.fromHex("#000000").transparent(0.6), hcDark: contrastBorder, hcLight: contrastBorder }, localize("scrollbarSliderActiveBackground", "Scrollbar slider background color when clicked on.")); + progressBarBackground = registerColor("progressBar.background", { dark: Color.fromHex("#0E70C0"), light: Color.fromHex("#0E70C0"), hcDark: contrastBorder, hcLight: contrastBorder }, localize("progressBarBackground", "Background color of the progress bar that can show for long running operations.")); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/colors/editorColors.js +var editorBackground, editorForeground, editorStickyScrollBackground, editorStickyScrollHoverBackground, editorStickyScrollBorder, editorStickyScrollShadow, editorWidgetBackground, editorWidgetForeground, editorWidgetBorder, editorWidgetResizeBorder, editorErrorBackground, editorErrorForeground, editorErrorBorder, editorWarningBackground, editorWarningForeground, editorWarningBorder, editorInfoBackground, editorInfoForeground, editorInfoBorder, editorHintForeground, editorHintBorder, editorActiveLinkForeground, editorSelectionBackground, editorSelectionForeground, editorInactiveSelection, editorSelectionHighlight, editorSelectionHighlightBorder, editorFindMatch, editorFindMatchForeground, editorFindMatchHighlight, editorFindMatchHighlightForeground, editorFindRangeHighlight, editorFindMatchBorder, editorFindMatchHighlightBorder, editorFindRangeHighlightBorder, editorHoverHighlight, editorHoverBackground, editorHoverForeground, editorHoverBorder, editorHoverStatusBarBackground, editorInlayHintForeground, editorInlayHintBackground, editorInlayHintTypeForeground, editorInlayHintTypeBackground, editorInlayHintParameterForeground, editorInlayHintParameterBackground, editorLightBulbForeground, editorLightBulbAutoFixForeground, editorLightBulbAiForeground, snippetTabstopHighlightBackground, snippetTabstopHighlightBorder, snippetFinalTabstopHighlightBackground, snippetFinalTabstopHighlightBorder, defaultInsertColor, defaultRemoveColor, diffInserted, diffRemoved, diffInsertedLine, diffRemovedLine, diffInsertedLineGutter, diffRemovedLineGutter, diffOverviewRulerInserted, diffOverviewRulerRemoved, diffInsertedOutline, diffRemovedOutline, diffBorder, diffDiagonalFill, diffUnchangedRegionBackground, diffUnchangedRegionForeground, diffUnchangedTextBackground, widgetShadow, widgetBorder, toolbarHoverBackground, toolbarHoverOutline, toolbarActiveBackground, breadcrumbsForeground, breadcrumbsBackground, breadcrumbsFocusForeground, breadcrumbsActiveSelectionForeground, breadcrumbsPickerBackground, headerTransparency, currentBaseColor, incomingBaseColor, commonBaseColor, contentTransparency, rulerTransparency, mergeCurrentHeaderBackground, mergeCurrentContentBackground, mergeIncomingHeaderBackground, mergeIncomingContentBackground, mergeCommonHeaderBackground, mergeCommonContentBackground, mergeBorder, overviewRulerCurrentContentForeground, overviewRulerIncomingContentForeground, overviewRulerCommonContentForeground, overviewRulerFindMatchForeground, overviewRulerSelectionHighlightForeground, problemsErrorIconForeground, problemsWarningIconForeground, problemsInfoIconForeground; +var init_editorColors = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/colors/editorColors.js"() { + init_nls(); + init_color(); + init_colorUtils(); + init_baseColors(); + init_miscColors(); + editorBackground = registerColor("editor.background", { light: "#ffffff", dark: "#1E1E1E", hcDark: Color.black, hcLight: Color.white }, localize("editorBackground", "Editor background color.")); + editorForeground = registerColor("editor.foreground", { light: "#333333", dark: "#BBBBBB", hcDark: Color.white, hcLight: foreground }, localize("editorForeground", "Editor default foreground color.")); + editorStickyScrollBackground = registerColor("editorStickyScroll.background", { light: editorBackground, dark: editorBackground, hcDark: editorBackground, hcLight: editorBackground }, localize("editorStickyScrollBackground", "Background color of sticky scroll in the editor")); + editorStickyScrollHoverBackground = registerColor("editorStickyScrollHover.background", { dark: "#2A2D2E", light: "#F0F0F0", hcDark: null, hcLight: Color.fromHex("#0F4A85").transparent(0.1) }, localize("editorStickyScrollHoverBackground", "Background color of sticky scroll on hover in the editor")); + editorStickyScrollBorder = registerColor("editorStickyScroll.border", { dark: null, light: null, hcDark: contrastBorder, hcLight: contrastBorder }, localize("editorStickyScrollBorder", "Border color of sticky scroll in the editor")); + editorStickyScrollShadow = registerColor("editorStickyScroll.shadow", { dark: scrollbarShadow, light: scrollbarShadow, hcDark: scrollbarShadow, hcLight: scrollbarShadow }, localize("editorStickyScrollShadow", " Shadow color of sticky scroll in the editor")); + editorWidgetBackground = registerColor("editorWidget.background", { dark: "#252526", light: "#F3F3F3", hcDark: "#0C141F", hcLight: Color.white }, localize("editorWidgetBackground", "Background color of editor widgets, such as find/replace.")); + editorWidgetForeground = registerColor("editorWidget.foreground", { dark: foreground, light: foreground, hcDark: foreground, hcLight: foreground }, localize("editorWidgetForeground", "Foreground color of editor widgets, such as find/replace.")); + editorWidgetBorder = registerColor("editorWidget.border", { dark: "#454545", light: "#C8C8C8", hcDark: contrastBorder, hcLight: contrastBorder }, localize("editorWidgetBorder", "Border color of editor widgets. The color is only used if the widget chooses to have a border and if the color is not overridden by a widget.")); + editorWidgetResizeBorder = registerColor("editorWidget.resizeBorder", { light: null, dark: null, hcDark: null, hcLight: null }, localize("editorWidgetResizeBorder", "Border color of the resize bar of editor widgets. The color is only used if the widget chooses to have a resize border and if the color is not overridden by a widget.")); + editorErrorBackground = registerColor("editorError.background", { dark: null, light: null, hcDark: null, hcLight: null }, localize("editorError.background", "Background color of error text in the editor. The color must not be opaque so as not to hide underlying decorations."), true); + editorErrorForeground = registerColor("editorError.foreground", { dark: "#F14C4C", light: "#E51400", hcDark: "#F48771", hcLight: "#B5200D" }, localize("editorError.foreground", "Foreground color of error squigglies in the editor.")); + editorErrorBorder = registerColor("editorError.border", { dark: null, light: null, hcDark: Color.fromHex("#E47777").transparent(0.8), hcLight: "#B5200D" }, localize("errorBorder", "If set, color of double underlines for errors in the editor.")); + editorWarningBackground = registerColor("editorWarning.background", { dark: null, light: null, hcDark: null, hcLight: null }, localize("editorWarning.background", "Background color of warning text in the editor. The color must not be opaque so as not to hide underlying decorations."), true); + editorWarningForeground = registerColor("editorWarning.foreground", { dark: "#CCA700", light: "#BF8803", hcDark: "#FFD370", hcLight: "#895503" }, localize("editorWarning.foreground", "Foreground color of warning squigglies in the editor.")); + editorWarningBorder = registerColor("editorWarning.border", { dark: null, light: null, hcDark: Color.fromHex("#FFCC00").transparent(0.8), hcLight: Color.fromHex("#FFCC00").transparent(0.8) }, localize("warningBorder", "If set, color of double underlines for warnings in the editor.")); + editorInfoBackground = registerColor("editorInfo.background", { dark: null, light: null, hcDark: null, hcLight: null }, localize("editorInfo.background", "Background color of info text in the editor. The color must not be opaque so as not to hide underlying decorations."), true); + editorInfoForeground = registerColor("editorInfo.foreground", { dark: "#3794FF", light: "#1a85ff", hcDark: "#3794FF", hcLight: "#1a85ff" }, localize("editorInfo.foreground", "Foreground color of info squigglies in the editor.")); + editorInfoBorder = registerColor("editorInfo.border", { dark: null, light: null, hcDark: Color.fromHex("#3794FF").transparent(0.8), hcLight: "#292929" }, localize("infoBorder", "If set, color of double underlines for infos in the editor.")); + editorHintForeground = registerColor("editorHint.foreground", { dark: Color.fromHex("#eeeeee").transparent(0.7), light: "#6c6c6c", hcDark: null, hcLight: null }, localize("editorHint.foreground", "Foreground color of hint squigglies in the editor.")); + editorHintBorder = registerColor("editorHint.border", { dark: null, light: null, hcDark: Color.fromHex("#eeeeee").transparent(0.8), hcLight: "#292929" }, localize("hintBorder", "If set, color of double underlines for hints in the editor.")); + editorActiveLinkForeground = registerColor("editorLink.activeForeground", { dark: "#4E94CE", light: Color.blue, hcDark: Color.cyan, hcLight: "#292929" }, localize("activeLinkForeground", "Color of active links.")); + editorSelectionBackground = registerColor("editor.selectionBackground", { light: "#ADD6FF", dark: "#264F78", hcDark: "#f3f518", hcLight: "#0F4A85" }, localize("editorSelectionBackground", "Color of the editor selection.")); + editorSelectionForeground = registerColor("editor.selectionForeground", { light: null, dark: null, hcDark: "#000000", hcLight: Color.white }, localize("editorSelectionForeground", "Color of the selected text for high contrast.")); + editorInactiveSelection = registerColor("editor.inactiveSelectionBackground", { light: transparent(editorSelectionBackground, 0.5), dark: transparent(editorSelectionBackground, 0.5), hcDark: transparent(editorSelectionBackground, 0.7), hcLight: transparent(editorSelectionBackground, 0.5) }, localize("editorInactiveSelection", "Color of the selection in an inactive editor. The color must not be opaque so as not to hide underlying decorations."), true); + editorSelectionHighlight = registerColor("editor.selectionHighlightBackground", { light: lessProminent(editorSelectionBackground, editorBackground, 0.3, 0.6), dark: lessProminent(editorSelectionBackground, editorBackground, 0.3, 0.6), hcDark: null, hcLight: null }, localize("editorSelectionHighlight", "Color for regions with the same content as the selection. The color must not be opaque so as not to hide underlying decorations."), true); + editorSelectionHighlightBorder = registerColor("editor.selectionHighlightBorder", { light: null, dark: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize("editorSelectionHighlightBorder", "Border color for regions with the same content as the selection.")); + editorFindMatch = registerColor("editor.findMatchBackground", { light: "#A8AC94", dark: "#515C6A", hcDark: null, hcLight: null }, localize("editorFindMatch", "Color of the current search match.")); + editorFindMatchForeground = registerColor("editor.findMatchForeground", { light: null, dark: null, hcDark: null, hcLight: null }, localize("editorFindMatchForeground", "Text color of the current search match.")); + editorFindMatchHighlight = registerColor("editor.findMatchHighlightBackground", { light: "#EA5C0055", dark: "#EA5C0055", hcDark: null, hcLight: null }, localize("findMatchHighlight", "Color of the other search matches. The color must not be opaque so as not to hide underlying decorations."), true); + editorFindMatchHighlightForeground = registerColor("editor.findMatchHighlightForeground", { light: null, dark: null, hcDark: null, hcLight: null }, localize("findMatchHighlightForeground", "Foreground color of the other search matches."), true); + editorFindRangeHighlight = registerColor("editor.findRangeHighlightBackground", { dark: "#3a3d4166", light: "#b4b4b44d", hcDark: null, hcLight: null }, localize("findRangeHighlight", "Color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations."), true); + editorFindMatchBorder = registerColor("editor.findMatchBorder", { light: null, dark: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize("editorFindMatchBorder", "Border color of the current search match.")); + editorFindMatchHighlightBorder = registerColor("editor.findMatchHighlightBorder", { light: null, dark: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize("findMatchHighlightBorder", "Border color of the other search matches.")); + editorFindRangeHighlightBorder = registerColor("editor.findRangeHighlightBorder", { dark: null, light: null, hcDark: transparent(activeContrastBorder, 0.4), hcLight: transparent(activeContrastBorder, 0.4) }, localize("findRangeHighlightBorder", "Border color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations."), true); + editorHoverHighlight = registerColor("editor.hoverHighlightBackground", { light: "#ADD6FF26", dark: "#264f7840", hcDark: "#ADD6FF26", hcLight: null }, localize("hoverHighlight", "Highlight below the word for which a hover is shown. The color must not be opaque so as not to hide underlying decorations."), true); + editorHoverBackground = registerColor("editorHoverWidget.background", { light: editorWidgetBackground, dark: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, localize("hoverBackground", "Background color of the editor hover.")); + editorHoverForeground = registerColor("editorHoverWidget.foreground", { light: editorWidgetForeground, dark: editorWidgetForeground, hcDark: editorWidgetForeground, hcLight: editorWidgetForeground }, localize("hoverForeground", "Foreground color of the editor hover.")); + editorHoverBorder = registerColor("editorHoverWidget.border", { light: editorWidgetBorder, dark: editorWidgetBorder, hcDark: editorWidgetBorder, hcLight: editorWidgetBorder }, localize("hoverBorder", "Border color of the editor hover.")); + editorHoverStatusBarBackground = registerColor("editorHoverWidget.statusBarBackground", { dark: lighten(editorHoverBackground, 0.2), light: darken(editorHoverBackground, 0.05), hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, localize("statusBarBackground", "Background color of the editor hover status bar.")); + editorInlayHintForeground = registerColor("editorInlayHint.foreground", { dark: "#969696", light: "#969696", hcDark: Color.white, hcLight: Color.black }, localize("editorInlayHintForeground", "Foreground color of inline hints")); + editorInlayHintBackground = registerColor("editorInlayHint.background", { dark: transparent(badgeBackground, 0.1), light: transparent(badgeBackground, 0.1), hcDark: transparent(Color.white, 0.1), hcLight: transparent(badgeBackground, 0.1) }, localize("editorInlayHintBackground", "Background color of inline hints")); + editorInlayHintTypeForeground = registerColor("editorInlayHint.typeForeground", { dark: editorInlayHintForeground, light: editorInlayHintForeground, hcDark: editorInlayHintForeground, hcLight: editorInlayHintForeground }, localize("editorInlayHintForegroundTypes", "Foreground color of inline hints for types")); + editorInlayHintTypeBackground = registerColor("editorInlayHint.typeBackground", { dark: editorInlayHintBackground, light: editorInlayHintBackground, hcDark: editorInlayHintBackground, hcLight: editorInlayHintBackground }, localize("editorInlayHintBackgroundTypes", "Background color of inline hints for types")); + editorInlayHintParameterForeground = registerColor("editorInlayHint.parameterForeground", { dark: editorInlayHintForeground, light: editorInlayHintForeground, hcDark: editorInlayHintForeground, hcLight: editorInlayHintForeground }, localize("editorInlayHintForegroundParameter", "Foreground color of inline hints for parameters")); + editorInlayHintParameterBackground = registerColor("editorInlayHint.parameterBackground", { dark: editorInlayHintBackground, light: editorInlayHintBackground, hcDark: editorInlayHintBackground, hcLight: editorInlayHintBackground }, localize("editorInlayHintBackgroundParameter", "Background color of inline hints for parameters")); + editorLightBulbForeground = registerColor("editorLightBulb.foreground", { dark: "#FFCC00", light: "#DDB100", hcDark: "#FFCC00", hcLight: "#007ACC" }, localize("editorLightBulbForeground", "The color used for the lightbulb actions icon.")); + editorLightBulbAutoFixForeground = registerColor("editorLightBulbAutoFix.foreground", { dark: "#75BEFF", light: "#007ACC", hcDark: "#75BEFF", hcLight: "#007ACC" }, localize("editorLightBulbAutoFixForeground", "The color used for the lightbulb auto fix actions icon.")); + editorLightBulbAiForeground = registerColor("editorLightBulbAi.foreground", { dark: editorLightBulbForeground, light: editorLightBulbForeground, hcDark: editorLightBulbForeground, hcLight: editorLightBulbForeground }, localize("editorLightBulbAiForeground", "The color used for the lightbulb AI icon.")); + snippetTabstopHighlightBackground = registerColor("editor.snippetTabstopHighlightBackground", { dark: new Color(new RGBA(124, 124, 124, 0.3)), light: new Color(new RGBA(10, 50, 100, 0.2)), hcDark: new Color(new RGBA(124, 124, 124, 0.3)), hcLight: new Color(new RGBA(10, 50, 100, 0.2)) }, localize("snippetTabstopHighlightBackground", "Highlight background color of a snippet tabstop.")); + snippetTabstopHighlightBorder = registerColor("editor.snippetTabstopHighlightBorder", { dark: null, light: null, hcDark: null, hcLight: null }, localize("snippetTabstopHighlightBorder", "Highlight border color of a snippet tabstop.")); + snippetFinalTabstopHighlightBackground = registerColor("editor.snippetFinalTabstopHighlightBackground", { dark: null, light: null, hcDark: null, hcLight: null }, localize("snippetFinalTabstopHighlightBackground", "Highlight background color of the final tabstop of a snippet.")); + snippetFinalTabstopHighlightBorder = registerColor("editor.snippetFinalTabstopHighlightBorder", { dark: "#525252", light: new Color(new RGBA(10, 50, 100, 0.5)), hcDark: "#525252", hcLight: "#292929" }, localize("snippetFinalTabstopHighlightBorder", "Highlight border color of the final tabstop of a snippet.")); + defaultInsertColor = new Color(new RGBA(155, 185, 85, 0.2)); + defaultRemoveColor = new Color(new RGBA(255, 0, 0, 0.2)); + diffInserted = registerColor("diffEditor.insertedTextBackground", { dark: "#9ccc2c33", light: "#9ccc2c40", hcDark: null, hcLight: null }, localize("diffEditorInserted", "Background color for text that got inserted. The color must not be opaque so as not to hide underlying decorations."), true); + diffRemoved = registerColor("diffEditor.removedTextBackground", { dark: "#ff000033", light: "#ff000033", hcDark: null, hcLight: null }, localize("diffEditorRemoved", "Background color for text that got removed. The color must not be opaque so as not to hide underlying decorations."), true); + diffInsertedLine = registerColor("diffEditor.insertedLineBackground", { dark: defaultInsertColor, light: defaultInsertColor, hcDark: null, hcLight: null }, localize("diffEditorInsertedLines", "Background color for lines that got inserted. The color must not be opaque so as not to hide underlying decorations."), true); + diffRemovedLine = registerColor("diffEditor.removedLineBackground", { dark: defaultRemoveColor, light: defaultRemoveColor, hcDark: null, hcLight: null }, localize("diffEditorRemovedLines", "Background color for lines that got removed. The color must not be opaque so as not to hide underlying decorations."), true); + diffInsertedLineGutter = registerColor("diffEditorGutter.insertedLineBackground", { dark: null, light: null, hcDark: null, hcLight: null }, localize("diffEditorInsertedLineGutter", "Background color for the margin where lines got inserted.")); + diffRemovedLineGutter = registerColor("diffEditorGutter.removedLineBackground", { dark: null, light: null, hcDark: null, hcLight: null }, localize("diffEditorRemovedLineGutter", "Background color for the margin where lines got removed.")); + diffOverviewRulerInserted = registerColor("diffEditorOverview.insertedForeground", { dark: null, light: null, hcDark: null, hcLight: null }, localize("diffEditorOverviewInserted", "Diff overview ruler foreground for inserted content.")); + diffOverviewRulerRemoved = registerColor("diffEditorOverview.removedForeground", { dark: null, light: null, hcDark: null, hcLight: null }, localize("diffEditorOverviewRemoved", "Diff overview ruler foreground for removed content.")); + diffInsertedOutline = registerColor("diffEditor.insertedTextBorder", { dark: null, light: null, hcDark: "#33ff2eff", hcLight: "#374E06" }, localize("diffEditorInsertedOutline", "Outline color for the text that got inserted.")); + diffRemovedOutline = registerColor("diffEditor.removedTextBorder", { dark: null, light: null, hcDark: "#FF008F", hcLight: "#AD0707" }, localize("diffEditorRemovedOutline", "Outline color for text that got removed.")); + diffBorder = registerColor("diffEditor.border", { dark: null, light: null, hcDark: contrastBorder, hcLight: contrastBorder }, localize("diffEditorBorder", "Border color between the two text editors.")); + diffDiagonalFill = registerColor("diffEditor.diagonalFill", { dark: "#cccccc33", light: "#22222233", hcDark: null, hcLight: null }, localize("diffDiagonalFill", "Color of the diff editor's diagonal fill. The diagonal fill is used in side-by-side diff views.")); + diffUnchangedRegionBackground = registerColor("diffEditor.unchangedRegionBackground", { dark: "sideBar.background", light: "sideBar.background", hcDark: "sideBar.background", hcLight: "sideBar.background" }, localize("diffEditor.unchangedRegionBackground", "The background color of unchanged blocks in the diff editor.")); + diffUnchangedRegionForeground = registerColor("diffEditor.unchangedRegionForeground", { dark: "foreground", light: "foreground", hcDark: "foreground", hcLight: "foreground" }, localize("diffEditor.unchangedRegionForeground", "The foreground color of unchanged blocks in the diff editor.")); + diffUnchangedTextBackground = registerColor("diffEditor.unchangedCodeBackground", { dark: "#74747429", light: "#b8b8b829", hcDark: null, hcLight: null }, localize("diffEditor.unchangedCodeBackground", "The background color of unchanged code in the diff editor.")); + widgetShadow = registerColor("widget.shadow", { dark: transparent(Color.black, 0.36), light: transparent(Color.black, 0.16), hcDark: null, hcLight: null }, localize("widgetShadow", "Shadow color of widgets such as find/replace inside the editor.")); + widgetBorder = registerColor("widget.border", { dark: null, light: null, hcDark: contrastBorder, hcLight: contrastBorder }, localize("widgetBorder", "Border color of widgets such as find/replace inside the editor.")); + toolbarHoverBackground = registerColor("toolbar.hoverBackground", { dark: "#5a5d5e50", light: "#b8b8b850", hcDark: null, hcLight: null }, localize("toolbarHoverBackground", "Toolbar background when hovering over actions using the mouse")); + toolbarHoverOutline = registerColor("toolbar.hoverOutline", { dark: null, light: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize("toolbarHoverOutline", "Toolbar outline when hovering over actions using the mouse")); + toolbarActiveBackground = registerColor("toolbar.activeBackground", { dark: lighten(toolbarHoverBackground, 0.1), light: darken(toolbarHoverBackground, 0.1), hcDark: null, hcLight: null }, localize("toolbarActiveBackground", "Toolbar background when holding the mouse over actions")); + breadcrumbsForeground = registerColor("breadcrumb.foreground", { light: transparent(foreground, 0.8), dark: transparent(foreground, 0.8), hcDark: transparent(foreground, 0.8), hcLight: transparent(foreground, 0.8) }, localize("breadcrumbsFocusForeground", "Color of focused breadcrumb items.")); + breadcrumbsBackground = registerColor("breadcrumb.background", { light: editorBackground, dark: editorBackground, hcDark: editorBackground, hcLight: editorBackground }, localize("breadcrumbsBackground", "Background color of breadcrumb items.")); + breadcrumbsFocusForeground = registerColor("breadcrumb.focusForeground", { light: darken(foreground, 0.2), dark: lighten(foreground, 0.1), hcDark: lighten(foreground, 0.1), hcLight: lighten(foreground, 0.1) }, localize("breadcrumbsFocusForeground", "Color of focused breadcrumb items.")); + breadcrumbsActiveSelectionForeground = registerColor("breadcrumb.activeSelectionForeground", { light: darken(foreground, 0.2), dark: lighten(foreground, 0.1), hcDark: lighten(foreground, 0.1), hcLight: lighten(foreground, 0.1) }, localize("breadcrumbsSelectedForeground", "Color of selected breadcrumb items.")); + breadcrumbsPickerBackground = registerColor("breadcrumbPicker.background", { light: editorWidgetBackground, dark: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, localize("breadcrumbsSelectedBackground", "Background color of breadcrumb item picker.")); + headerTransparency = 0.5; + currentBaseColor = Color.fromHex("#40C8AE").transparent(headerTransparency); + incomingBaseColor = Color.fromHex("#40A6FF").transparent(headerTransparency); + commonBaseColor = Color.fromHex("#606060").transparent(0.4); + contentTransparency = 0.4; + rulerTransparency = 1; + mergeCurrentHeaderBackground = registerColor("merge.currentHeaderBackground", { dark: currentBaseColor, light: currentBaseColor, hcDark: null, hcLight: null }, localize("mergeCurrentHeaderBackground", "Current header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), true); + mergeCurrentContentBackground = registerColor("merge.currentContentBackground", { dark: transparent(mergeCurrentHeaderBackground, contentTransparency), light: transparent(mergeCurrentHeaderBackground, contentTransparency), hcDark: transparent(mergeCurrentHeaderBackground, contentTransparency), hcLight: transparent(mergeCurrentHeaderBackground, contentTransparency) }, localize("mergeCurrentContentBackground", "Current content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), true); + mergeIncomingHeaderBackground = registerColor("merge.incomingHeaderBackground", { dark: incomingBaseColor, light: incomingBaseColor, hcDark: null, hcLight: null }, localize("mergeIncomingHeaderBackground", "Incoming header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), true); + mergeIncomingContentBackground = registerColor("merge.incomingContentBackground", { dark: transparent(mergeIncomingHeaderBackground, contentTransparency), light: transparent(mergeIncomingHeaderBackground, contentTransparency), hcDark: transparent(mergeIncomingHeaderBackground, contentTransparency), hcLight: transparent(mergeIncomingHeaderBackground, contentTransparency) }, localize("mergeIncomingContentBackground", "Incoming content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), true); + mergeCommonHeaderBackground = registerColor("merge.commonHeaderBackground", { dark: commonBaseColor, light: commonBaseColor, hcDark: null, hcLight: null }, localize("mergeCommonHeaderBackground", "Common ancestor header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), true); + mergeCommonContentBackground = registerColor("merge.commonContentBackground", { dark: transparent(mergeCommonHeaderBackground, contentTransparency), light: transparent(mergeCommonHeaderBackground, contentTransparency), hcDark: transparent(mergeCommonHeaderBackground, contentTransparency), hcLight: transparent(mergeCommonHeaderBackground, contentTransparency) }, localize("mergeCommonContentBackground", "Common ancestor content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), true); + mergeBorder = registerColor("merge.border", { dark: null, light: null, hcDark: "#C3DF6F", hcLight: "#007ACC" }, localize("mergeBorder", "Border color on headers and the splitter in inline merge-conflicts.")); + overviewRulerCurrentContentForeground = registerColor("editorOverviewRuler.currentContentForeground", { dark: transparent(mergeCurrentHeaderBackground, rulerTransparency), light: transparent(mergeCurrentHeaderBackground, rulerTransparency), hcDark: mergeBorder, hcLight: mergeBorder }, localize("overviewRulerCurrentContentForeground", "Current overview ruler foreground for inline merge-conflicts.")); + overviewRulerIncomingContentForeground = registerColor("editorOverviewRuler.incomingContentForeground", { dark: transparent(mergeIncomingHeaderBackground, rulerTransparency), light: transparent(mergeIncomingHeaderBackground, rulerTransparency), hcDark: mergeBorder, hcLight: mergeBorder }, localize("overviewRulerIncomingContentForeground", "Incoming overview ruler foreground for inline merge-conflicts.")); + overviewRulerCommonContentForeground = registerColor("editorOverviewRuler.commonContentForeground", { dark: transparent(mergeCommonHeaderBackground, rulerTransparency), light: transparent(mergeCommonHeaderBackground, rulerTransparency), hcDark: mergeBorder, hcLight: mergeBorder }, localize("overviewRulerCommonContentForeground", "Common ancestor overview ruler foreground for inline merge-conflicts.")); + overviewRulerFindMatchForeground = registerColor("editorOverviewRuler.findMatchForeground", { dark: "#d186167e", light: "#d186167e", hcDark: "#AB5A00", hcLight: "" }, localize("overviewRulerFindMatchForeground", "Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations."), true); + overviewRulerSelectionHighlightForeground = registerColor("editorOverviewRuler.selectionHighlightForeground", { dark: "#A0A0A0CC", light: "#A0A0A0CC", hcDark: "#A0A0A0CC", hcLight: "#A0A0A0CC" }, localize("overviewRulerSelectionHighlightForeground", "Overview ruler marker color for selection highlights. The color must not be opaque so as not to hide underlying decorations."), true); + problemsErrorIconForeground = registerColor("problemsErrorIcon.foreground", { dark: editorErrorForeground, light: editorErrorForeground, hcDark: editorErrorForeground, hcLight: editorErrorForeground }, localize("problemsErrorIconForeground", "The color used for the problems error icon.")); + problemsWarningIconForeground = registerColor("problemsWarningIcon.foreground", { dark: editorWarningForeground, light: editorWarningForeground, hcDark: editorWarningForeground, hcLight: editorWarningForeground }, localize("problemsWarningIconForeground", "The color used for the problems warning icon.")); + problemsInfoIconForeground = registerColor("problemsInfoIcon.foreground", { dark: editorInfoForeground, light: editorInfoForeground, hcDark: editorInfoForeground, hcLight: editorInfoForeground }, localize("problemsInfoIconForeground", "The color used for the problems info icon.")); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/colors/minimapColors.js +var minimapFindMatch, minimapSelectionOccurrenceHighlight, minimapSelection, minimapInfo, minimapWarning, minimapError, minimapBackground, minimapForegroundOpacity, minimapSliderBackground, minimapSliderHoverBackground, minimapSliderActiveBackground; +var init_minimapColors = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/colors/minimapColors.js"() { + init_nls(); + init_color(); + init_colorUtils(); + init_editorColors(); + init_miscColors(); + minimapFindMatch = registerColor("minimap.findMatchHighlight", { light: "#d18616", dark: "#d18616", hcDark: "#AB5A00", hcLight: "#0F4A85" }, localize("minimapFindMatchHighlight", "Minimap marker color for find matches."), true); + minimapSelectionOccurrenceHighlight = registerColor("minimap.selectionOccurrenceHighlight", { light: "#c9c9c9", dark: "#676767", hcDark: "#ffffff", hcLight: "#0F4A85" }, localize("minimapSelectionOccurrenceHighlight", "Minimap marker color for repeating editor selections."), true); + minimapSelection = registerColor("minimap.selectionHighlight", { light: "#ADD6FF", dark: "#264F78", hcDark: "#ffffff", hcLight: "#0F4A85" }, localize("minimapSelectionHighlight", "Minimap marker color for the editor selection."), true); + minimapInfo = registerColor("minimap.infoHighlight", { dark: editorInfoForeground, light: editorInfoForeground, hcDark: editorInfoBorder, hcLight: editorInfoBorder }, localize("minimapInfo", "Minimap marker color for infos.")); + minimapWarning = registerColor("minimap.warningHighlight", { dark: editorWarningForeground, light: editorWarningForeground, hcDark: editorWarningBorder, hcLight: editorWarningBorder }, localize("overviewRuleWarning", "Minimap marker color for warnings.")); + minimapError = registerColor("minimap.errorHighlight", { dark: new Color(new RGBA(255, 18, 18, 0.7)), light: new Color(new RGBA(255, 18, 18, 0.7)), hcDark: new Color(new RGBA(255, 50, 50, 1)), hcLight: "#B5200D" }, localize("minimapError", "Minimap marker color for errors.")); + minimapBackground = registerColor("minimap.background", { dark: null, light: null, hcDark: null, hcLight: null }, localize("minimapBackground", "Minimap background color.")); + minimapForegroundOpacity = registerColor("minimap.foregroundOpacity", { dark: Color.fromHex("#000f"), light: Color.fromHex("#000f"), hcDark: Color.fromHex("#000f"), hcLight: Color.fromHex("#000f") }, localize("minimapForegroundOpacity", 'Opacity of foreground elements rendered in the minimap. For example, "#000000c0" will render the elements with 75% opacity.')); + minimapSliderBackground = registerColor("minimapSlider.background", { light: transparent(scrollbarSliderBackground, 0.5), dark: transparent(scrollbarSliderBackground, 0.5), hcDark: transparent(scrollbarSliderBackground, 0.5), hcLight: transparent(scrollbarSliderBackground, 0.5) }, localize("minimapSliderBackground", "Minimap slider background color.")); + minimapSliderHoverBackground = registerColor("minimapSlider.hoverBackground", { light: transparent(scrollbarSliderHoverBackground, 0.5), dark: transparent(scrollbarSliderHoverBackground, 0.5), hcDark: transparent(scrollbarSliderHoverBackground, 0.5), hcLight: transparent(scrollbarSliderHoverBackground, 0.5) }, localize("minimapSliderHoverBackground", "Minimap slider background color when hovering.")); + minimapSliderActiveBackground = registerColor("minimapSlider.activeBackground", { light: transparent(scrollbarSliderActiveBackground, 0.5), dark: transparent(scrollbarSliderActiveBackground, 0.5), hcDark: transparent(scrollbarSliderActiveBackground, 0.5), hcLight: transparent(scrollbarSliderActiveBackground, 0.5) }, localize("minimapSliderActiveBackground", "Minimap slider background color when clicked on.")); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/colors/chartsColors.js +var chartsForeground, chartsLines, chartsRed, chartsBlue, chartsYellow, chartsOrange, chartsGreen, chartsPurple; +var init_chartsColors = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/colors/chartsColors.js"() { + init_nls(); + init_colorUtils(); + init_baseColors(); + init_editorColors(); + init_minimapColors(); + chartsForeground = registerColor("charts.foreground", { dark: foreground, light: foreground, hcDark: foreground, hcLight: foreground }, localize("chartsForeground", "The foreground color used in charts.")); + chartsLines = registerColor("charts.lines", { dark: transparent(foreground, 0.5), light: transparent(foreground, 0.5), hcDark: transparent(foreground, 0.5), hcLight: transparent(foreground, 0.5) }, localize("chartsLines", "The color used for horizontal lines in charts.")); + chartsRed = registerColor("charts.red", { dark: editorErrorForeground, light: editorErrorForeground, hcDark: editorErrorForeground, hcLight: editorErrorForeground }, localize("chartsRed", "The red color used in chart visualizations.")); + chartsBlue = registerColor("charts.blue", { dark: editorInfoForeground, light: editorInfoForeground, hcDark: editorInfoForeground, hcLight: editorInfoForeground }, localize("chartsBlue", "The blue color used in chart visualizations.")); + chartsYellow = registerColor("charts.yellow", { dark: editorWarningForeground, light: editorWarningForeground, hcDark: editorWarningForeground, hcLight: editorWarningForeground }, localize("chartsYellow", "The yellow color used in chart visualizations.")); + chartsOrange = registerColor("charts.orange", { dark: minimapFindMatch, light: minimapFindMatch, hcDark: minimapFindMatch, hcLight: minimapFindMatch }, localize("chartsOrange", "The orange color used in chart visualizations.")); + chartsGreen = registerColor("charts.green", { dark: "#89D185", light: "#388A34", hcDark: "#89D185", hcLight: "#374e06" }, localize("chartsGreen", "The green color used in chart visualizations.")); + chartsPurple = registerColor("charts.purple", { dark: "#B180D7", light: "#652D90", hcDark: "#B180D7", hcLight: "#652D90" }, localize("chartsPurple", "The purple color used in chart visualizations.")); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/colors/inputColors.js +var inputBackground, inputForeground, inputBorder, inputActiveOptionBorder, inputActiveOptionHoverBackground, inputActiveOptionBackground, inputActiveOptionForeground, inputPlaceholderForeground, inputValidationInfoBackground, inputValidationInfoForeground, inputValidationInfoBorder, inputValidationWarningBackground, inputValidationWarningForeground, inputValidationWarningBorder, inputValidationErrorBackground, inputValidationErrorForeground, inputValidationErrorBorder, selectBackground, selectListBackground, selectForeground, selectBorder, buttonForeground, buttonSeparator, buttonBackground, buttonHoverBackground, buttonBorder, buttonSecondaryForeground, buttonSecondaryBackground, buttonSecondaryHoverBackground, checkboxBackground, checkboxSelectBackground, checkboxForeground, checkboxBorder, checkboxSelectBorder, keybindingLabelBackground, keybindingLabelForeground, keybindingLabelBorder, keybindingLabelBottomBorder; +var init_inputColors = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/colors/inputColors.js"() { + init_nls(); + init_color(); + init_colorUtils(); + init_baseColors(); + init_editorColors(); + inputBackground = registerColor("input.background", { dark: "#3C3C3C", light: Color.white, hcDark: Color.black, hcLight: Color.white }, localize("inputBoxBackground", "Input box background.")); + inputForeground = registerColor("input.foreground", { dark: foreground, light: foreground, hcDark: foreground, hcLight: foreground }, localize("inputBoxForeground", "Input box foreground.")); + inputBorder = registerColor("input.border", { dark: null, light: null, hcDark: contrastBorder, hcLight: contrastBorder }, localize("inputBoxBorder", "Input box border.")); + inputActiveOptionBorder = registerColor("inputOption.activeBorder", { dark: "#007ACC", light: "#007ACC", hcDark: contrastBorder, hcLight: contrastBorder }, localize("inputBoxActiveOptionBorder", "Border color of activated options in input fields.")); + inputActiveOptionHoverBackground = registerColor("inputOption.hoverBackground", { dark: "#5a5d5e80", light: "#b8b8b850", hcDark: null, hcLight: null }, localize("inputOption.hoverBackground", "Background color of activated options in input fields.")); + inputActiveOptionBackground = registerColor("inputOption.activeBackground", { dark: transparent(focusBorder, 0.4), light: transparent(focusBorder, 0.2), hcDark: Color.transparent, hcLight: Color.transparent }, localize("inputOption.activeBackground", "Background hover color of options in input fields.")); + inputActiveOptionForeground = registerColor("inputOption.activeForeground", { dark: Color.white, light: Color.black, hcDark: foreground, hcLight: foreground }, localize("inputOption.activeForeground", "Foreground color of activated options in input fields.")); + inputPlaceholderForeground = registerColor("input.placeholderForeground", { light: transparent(foreground, 0.5), dark: transparent(foreground, 0.5), hcDark: transparent(foreground, 0.7), hcLight: transparent(foreground, 0.7) }, localize("inputPlaceholderForeground", "Input box foreground color for placeholder text.")); + inputValidationInfoBackground = registerColor("inputValidation.infoBackground", { dark: "#063B49", light: "#D6ECF2", hcDark: Color.black, hcLight: Color.white }, localize("inputValidationInfoBackground", "Input validation background color for information severity.")); + inputValidationInfoForeground = registerColor("inputValidation.infoForeground", { dark: null, light: null, hcDark: null, hcLight: foreground }, localize("inputValidationInfoForeground", "Input validation foreground color for information severity.")); + inputValidationInfoBorder = registerColor("inputValidation.infoBorder", { dark: "#007acc", light: "#007acc", hcDark: contrastBorder, hcLight: contrastBorder }, localize("inputValidationInfoBorder", "Input validation border color for information severity.")); + inputValidationWarningBackground = registerColor("inputValidation.warningBackground", { dark: "#352A05", light: "#F6F5D2", hcDark: Color.black, hcLight: Color.white }, localize("inputValidationWarningBackground", "Input validation background color for warning severity.")); + inputValidationWarningForeground = registerColor("inputValidation.warningForeground", { dark: null, light: null, hcDark: null, hcLight: foreground }, localize("inputValidationWarningForeground", "Input validation foreground color for warning severity.")); + inputValidationWarningBorder = registerColor("inputValidation.warningBorder", { dark: "#B89500", light: "#B89500", hcDark: contrastBorder, hcLight: contrastBorder }, localize("inputValidationWarningBorder", "Input validation border color for warning severity.")); + inputValidationErrorBackground = registerColor("inputValidation.errorBackground", { dark: "#5A1D1D", light: "#F2DEDE", hcDark: Color.black, hcLight: Color.white }, localize("inputValidationErrorBackground", "Input validation background color for error severity.")); + inputValidationErrorForeground = registerColor("inputValidation.errorForeground", { dark: null, light: null, hcDark: null, hcLight: foreground }, localize("inputValidationErrorForeground", "Input validation foreground color for error severity.")); + inputValidationErrorBorder = registerColor("inputValidation.errorBorder", { dark: "#BE1100", light: "#BE1100", hcDark: contrastBorder, hcLight: contrastBorder }, localize("inputValidationErrorBorder", "Input validation border color for error severity.")); + selectBackground = registerColor("dropdown.background", { dark: "#3C3C3C", light: Color.white, hcDark: Color.black, hcLight: Color.white }, localize("dropdownBackground", "Dropdown background.")); + selectListBackground = registerColor("dropdown.listBackground", { dark: null, light: null, hcDark: Color.black, hcLight: Color.white }, localize("dropdownListBackground", "Dropdown list background.")); + selectForeground = registerColor("dropdown.foreground", { dark: "#F0F0F0", light: foreground, hcDark: Color.white, hcLight: foreground }, localize("dropdownForeground", "Dropdown foreground.")); + selectBorder = registerColor("dropdown.border", { dark: selectBackground, light: "#CECECE", hcDark: contrastBorder, hcLight: contrastBorder }, localize("dropdownBorder", "Dropdown border.")); + buttonForeground = registerColor("button.foreground", { dark: Color.white, light: Color.white, hcDark: Color.white, hcLight: Color.white }, localize("buttonForeground", "Button foreground color.")); + buttonSeparator = registerColor("button.separator", { dark: transparent(buttonForeground, 0.4), light: transparent(buttonForeground, 0.4), hcDark: transparent(buttonForeground, 0.4), hcLight: transparent(buttonForeground, 0.4) }, localize("buttonSeparator", "Button separator color.")); + buttonBackground = registerColor("button.background", { dark: "#0E639C", light: "#007ACC", hcDark: null, hcLight: "#0F4A85" }, localize("buttonBackground", "Button background color.")); + buttonHoverBackground = registerColor("button.hoverBackground", { dark: lighten(buttonBackground, 0.2), light: darken(buttonBackground, 0.2), hcDark: buttonBackground, hcLight: buttonBackground }, localize("buttonHoverBackground", "Button background color when hovering.")); + buttonBorder = registerColor("button.border", { dark: contrastBorder, light: contrastBorder, hcDark: contrastBorder, hcLight: contrastBorder }, localize("buttonBorder", "Button border color.")); + buttonSecondaryForeground = registerColor("button.secondaryForeground", { dark: Color.white, light: Color.white, hcDark: Color.white, hcLight: foreground }, localize("buttonSecondaryForeground", "Secondary button foreground color.")); + buttonSecondaryBackground = registerColor("button.secondaryBackground", { dark: "#3A3D41", light: "#5F6A79", hcDark: null, hcLight: Color.white }, localize("buttonSecondaryBackground", "Secondary button background color.")); + buttonSecondaryHoverBackground = registerColor("button.secondaryHoverBackground", { dark: lighten(buttonSecondaryBackground, 0.2), light: darken(buttonSecondaryBackground, 0.2), hcDark: null, hcLight: null }, localize("buttonSecondaryHoverBackground", "Secondary button background color when hovering.")); + checkboxBackground = registerColor("checkbox.background", { dark: selectBackground, light: selectBackground, hcDark: selectBackground, hcLight: selectBackground }, localize("checkbox.background", "Background color of checkbox widget.")); + checkboxSelectBackground = registerColor("checkbox.selectBackground", { dark: editorWidgetBackground, light: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, localize("checkbox.select.background", "Background color of checkbox widget when the element it's in is selected.")); + checkboxForeground = registerColor("checkbox.foreground", { dark: selectForeground, light: selectForeground, hcDark: selectForeground, hcLight: selectForeground }, localize("checkbox.foreground", "Foreground color of checkbox widget.")); + checkboxBorder = registerColor("checkbox.border", { dark: selectBorder, light: selectBorder, hcDark: selectBorder, hcLight: selectBorder }, localize("checkbox.border", "Border color of checkbox widget.")); + checkboxSelectBorder = registerColor("checkbox.selectBorder", { dark: iconForeground, light: iconForeground, hcDark: iconForeground, hcLight: iconForeground }, localize("checkbox.select.border", "Border color of checkbox widget when the element it's in is selected.")); + keybindingLabelBackground = registerColor("keybindingLabel.background", { dark: new Color(new RGBA(128, 128, 128, 0.17)), light: new Color(new RGBA(221, 221, 221, 0.4)), hcDark: Color.transparent, hcLight: Color.transparent }, localize("keybindingLabelBackground", "Keybinding label background color. The keybinding label is used to represent a keyboard shortcut.")); + keybindingLabelForeground = registerColor("keybindingLabel.foreground", { dark: Color.fromHex("#CCCCCC"), light: Color.fromHex("#555555"), hcDark: Color.white, hcLight: foreground }, localize("keybindingLabelForeground", "Keybinding label foreground color. The keybinding label is used to represent a keyboard shortcut.")); + keybindingLabelBorder = registerColor("keybindingLabel.border", { dark: new Color(new RGBA(51, 51, 51, 0.6)), light: new Color(new RGBA(204, 204, 204, 0.4)), hcDark: new Color(new RGBA(111, 195, 223)), hcLight: contrastBorder }, localize("keybindingLabelBorder", "Keybinding label border color. The keybinding label is used to represent a keyboard shortcut.")); + keybindingLabelBottomBorder = registerColor("keybindingLabel.bottomBorder", { dark: new Color(new RGBA(68, 68, 68, 0.6)), light: new Color(new RGBA(187, 187, 187, 0.4)), hcDark: new Color(new RGBA(111, 195, 223)), hcLight: foreground }, localize("keybindingLabelBottomBorder", "Keybinding label border bottom color. The keybinding label is used to represent a keyboard shortcut.")); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/colors/listColors.js +var listFocusBackground, listFocusForeground, listFocusOutline, listFocusAndSelectionOutline, listActiveSelectionBackground, listActiveSelectionForeground, listActiveSelectionIconForeground, listInactiveSelectionBackground, listInactiveSelectionForeground, listInactiveSelectionIconForeground, listInactiveFocusBackground, listInactiveFocusOutline, listHoverBackground, listHoverForeground, listDropOverBackground, listDropBetweenBackground, listHighlightForeground, listFocusHighlightForeground, listInvalidItemForeground, listErrorForeground, listWarningForeground, listFilterWidgetBackground, listFilterWidgetOutline, listFilterWidgetNoMatchesOutline, listFilterWidgetShadow, listFilterMatchHighlight, listFilterMatchHighlightBorder, listDeemphasizedForeground, treeIndentGuidesStroke, treeInactiveIndentGuidesStroke, tableColumnsBorder, tableOddRowsBackgroundColor; +var init_listColors = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/colors/listColors.js"() { + init_nls(); + init_color(); + init_colorUtils(); + init_baseColors(); + init_editorColors(); + listFocusBackground = registerColor("list.focusBackground", { dark: null, light: null, hcDark: null, hcLight: null }, localize("listFocusBackground", "List/Tree background color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); + listFocusForeground = registerColor("list.focusForeground", { dark: null, light: null, hcDark: null, hcLight: null }, localize("listFocusForeground", "List/Tree foreground color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); + listFocusOutline = registerColor("list.focusOutline", { dark: focusBorder, light: focusBorder, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize("listFocusOutline", "List/Tree outline color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); + listFocusAndSelectionOutline = registerColor("list.focusAndSelectionOutline", { dark: null, light: null, hcDark: null, hcLight: null }, localize("listFocusAndSelectionOutline", "List/Tree outline color for the focused item when the list/tree is active and selected. An active list/tree has keyboard focus, an inactive does not.")); + listActiveSelectionBackground = registerColor("list.activeSelectionBackground", { dark: "#04395E", light: "#0060C0", hcDark: null, hcLight: Color.fromHex("#0F4A85").transparent(0.1) }, localize("listActiveSelectionBackground", "List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); + listActiveSelectionForeground = registerColor("list.activeSelectionForeground", { dark: Color.white, light: Color.white, hcDark: null, hcLight: null }, localize("listActiveSelectionForeground", "List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); + listActiveSelectionIconForeground = registerColor("list.activeSelectionIconForeground", { dark: null, light: null, hcDark: null, hcLight: null }, localize("listActiveSelectionIconForeground", "List/Tree icon foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); + listInactiveSelectionBackground = registerColor("list.inactiveSelectionBackground", { dark: "#37373D", light: "#E4E6F1", hcDark: null, hcLight: Color.fromHex("#0F4A85").transparent(0.1) }, localize("listInactiveSelectionBackground", "List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); + listInactiveSelectionForeground = registerColor("list.inactiveSelectionForeground", { dark: null, light: null, hcDark: null, hcLight: null }, localize("listInactiveSelectionForeground", "List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); + listInactiveSelectionIconForeground = registerColor("list.inactiveSelectionIconForeground", { dark: null, light: null, hcDark: null, hcLight: null }, localize("listInactiveSelectionIconForeground", "List/Tree icon foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); + listInactiveFocusBackground = registerColor("list.inactiveFocusBackground", { dark: null, light: null, hcDark: null, hcLight: null }, localize("listInactiveFocusBackground", "List/Tree background color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); + listInactiveFocusOutline = registerColor("list.inactiveFocusOutline", { dark: null, light: null, hcDark: null, hcLight: null }, localize("listInactiveFocusOutline", "List/Tree outline color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); + listHoverBackground = registerColor("list.hoverBackground", { dark: "#2A2D2E", light: "#F0F0F0", hcDark: Color.white.transparent(0.1), hcLight: Color.fromHex("#0F4A85").transparent(0.1) }, localize("listHoverBackground", "List/Tree background when hovering over items using the mouse.")); + listHoverForeground = registerColor("list.hoverForeground", { dark: null, light: null, hcDark: null, hcLight: null }, localize("listHoverForeground", "List/Tree foreground when hovering over items using the mouse.")); + listDropOverBackground = registerColor("list.dropBackground", { dark: "#062F4A", light: "#D6EBFF", hcDark: null, hcLight: null }, localize("listDropBackground", "List/Tree drag and drop background when moving items over other items when using the mouse.")); + listDropBetweenBackground = registerColor("list.dropBetweenBackground", { dark: iconForeground, light: iconForeground, hcDark: null, hcLight: null }, localize("listDropBetweenBackground", "List/Tree drag and drop border color when moving items between items when using the mouse.")); + listHighlightForeground = registerColor("list.highlightForeground", { dark: "#2AAAFF", light: "#0066BF", hcDark: focusBorder, hcLight: focusBorder }, localize("highlight", "List/Tree foreground color of the match highlights when searching inside the list/tree.")); + listFocusHighlightForeground = registerColor("list.focusHighlightForeground", { dark: listHighlightForeground, light: ifDefinedThenElse(listActiveSelectionBackground, listHighlightForeground, "#BBE7FF"), hcDark: listHighlightForeground, hcLight: listHighlightForeground }, localize("listFocusHighlightForeground", "List/Tree foreground color of the match highlights on actively focused items when searching inside the list/tree.")); + listInvalidItemForeground = registerColor("list.invalidItemForeground", { dark: "#B89500", light: "#B89500", hcDark: "#B89500", hcLight: "#B5200D" }, localize("invalidItemForeground", "List/Tree foreground color for invalid items, for example an unresolved root in explorer.")); + listErrorForeground = registerColor("list.errorForeground", { dark: "#F88070", light: "#B01011", hcDark: null, hcLight: null }, localize("listErrorForeground", "Foreground color of list items containing errors.")); + listWarningForeground = registerColor("list.warningForeground", { dark: "#CCA700", light: "#855F00", hcDark: null, hcLight: null }, localize("listWarningForeground", "Foreground color of list items containing warnings.")); + listFilterWidgetBackground = registerColor("listFilterWidget.background", { light: darken(editorWidgetBackground, 0), dark: lighten(editorWidgetBackground, 0), hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, localize("listFilterWidgetBackground", "Background color of the type filter widget in lists and trees.")); + listFilterWidgetOutline = registerColor("listFilterWidget.outline", { dark: Color.transparent, light: Color.transparent, hcDark: "#f38518", hcLight: "#007ACC" }, localize("listFilterWidgetOutline", "Outline color of the type filter widget in lists and trees.")); + listFilterWidgetNoMatchesOutline = registerColor("listFilterWidget.noMatchesOutline", { dark: "#BE1100", light: "#BE1100", hcDark: contrastBorder, hcLight: contrastBorder }, localize("listFilterWidgetNoMatchesOutline", "Outline color of the type filter widget in lists and trees, when there are no matches.")); + listFilterWidgetShadow = registerColor("listFilterWidget.shadow", { dark: widgetShadow, light: widgetShadow, hcDark: widgetShadow, hcLight: widgetShadow }, localize("listFilterWidgetShadow", "Shadow color of the type filter widget in lists and trees.")); + listFilterMatchHighlight = registerColor("list.filterMatchBackground", { dark: editorFindMatchHighlight, light: editorFindMatchHighlight, hcDark: null, hcLight: null }, localize("listFilterMatchHighlight", "Background color of the filtered match.")); + listFilterMatchHighlightBorder = registerColor("list.filterMatchBorder", { dark: editorFindMatchHighlightBorder, light: editorFindMatchHighlightBorder, hcDark: contrastBorder, hcLight: activeContrastBorder }, localize("listFilterMatchHighlightBorder", "Border color of the filtered match.")); + listDeemphasizedForeground = registerColor("list.deemphasizedForeground", { dark: "#8C8C8C", light: "#8E8E90", hcDark: "#A7A8A9", hcLight: "#666666" }, localize("listDeemphasizedForeground", "List/Tree foreground color for items that are deemphasized.")); + treeIndentGuidesStroke = registerColor("tree.indentGuidesStroke", { dark: "#585858", light: "#a9a9a9", hcDark: "#a9a9a9", hcLight: "#a5a5a5" }, localize("treeIndentGuidesStroke", "Tree stroke color for the indentation guides.")); + treeInactiveIndentGuidesStroke = registerColor("tree.inactiveIndentGuidesStroke", { dark: transparent(treeIndentGuidesStroke, 0.4), light: transparent(treeIndentGuidesStroke, 0.4), hcDark: transparent(treeIndentGuidesStroke, 0.4), hcLight: transparent(treeIndentGuidesStroke, 0.4) }, localize("treeInactiveIndentGuidesStroke", "Tree stroke color for the indentation guides that are not active.")); + tableColumnsBorder = registerColor("tree.tableColumnsBorder", { dark: "#CCCCCC20", light: "#61616120", hcDark: null, hcLight: null }, localize("tableColumnsBorder", "Table border color between columns.")); + tableOddRowsBackgroundColor = registerColor("tree.tableOddRowsBackground", { dark: transparent(foreground, 0.04), light: transparent(foreground, 0.04), hcDark: null, hcLight: null }, localize("tableOddRowsBackgroundColor", "Background color for odd table rows.")); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/colors/menuColors.js +var menuBorder, menuForeground, menuBackground, menuSelectionForeground, menuSelectionBackground, menuSelectionBorder, menuSeparatorBackground; +var init_menuColors = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/colors/menuColors.js"() { + init_nls(); + init_colorUtils(); + init_baseColors(); + init_inputColors(); + init_listColors(); + menuBorder = registerColor("menu.border", { dark: null, light: null, hcDark: contrastBorder, hcLight: contrastBorder }, localize("menuBorder", "Border color of menus.")); + menuForeground = registerColor("menu.foreground", { dark: selectForeground, light: selectForeground, hcDark: selectForeground, hcLight: selectForeground }, localize("menuForeground", "Foreground color of menu items.")); + menuBackground = registerColor("menu.background", { dark: selectBackground, light: selectBackground, hcDark: selectBackground, hcLight: selectBackground }, localize("menuBackground", "Background color of menu items.")); + menuSelectionForeground = registerColor("menu.selectionForeground", { dark: listActiveSelectionForeground, light: listActiveSelectionForeground, hcDark: listActiveSelectionForeground, hcLight: listActiveSelectionForeground }, localize("menuSelectionForeground", "Foreground color of the selected menu item in menus.")); + menuSelectionBackground = registerColor("menu.selectionBackground", { dark: listActiveSelectionBackground, light: listActiveSelectionBackground, hcDark: listActiveSelectionBackground, hcLight: listActiveSelectionBackground }, localize("menuSelectionBackground", "Background color of the selected menu item in menus.")); + menuSelectionBorder = registerColor("menu.selectionBorder", { dark: null, light: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize("menuSelectionBorder", "Border color of the selected menu item in menus.")); + menuSeparatorBackground = registerColor("menu.separatorBackground", { dark: "#606060", light: "#D4D4D4", hcDark: contrastBorder, hcLight: contrastBorder }, localize("menuSeparatorBackground", "Color of a separator menu item in menus.")); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/colors/quickpickColors.js +var quickInputBackground, quickInputForeground, quickInputTitleBackground, pickerGroupForeground, pickerGroupBorder, _deprecatedQuickInputListFocusBackground, quickInputListFocusForeground, quickInputListFocusIconForeground, quickInputListFocusBackground; +var init_quickpickColors = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/colors/quickpickColors.js"() { + init_nls(); + init_color(); + init_colorUtils(); + init_editorColors(); + init_listColors(); + quickInputBackground = registerColor("quickInput.background", { dark: editorWidgetBackground, light: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, localize("pickerBackground", "Quick picker background color. The quick picker widget is the container for pickers like the command palette.")); + quickInputForeground = registerColor("quickInput.foreground", { dark: editorWidgetForeground, light: editorWidgetForeground, hcDark: editorWidgetForeground, hcLight: editorWidgetForeground }, localize("pickerForeground", "Quick picker foreground color. The quick picker widget is the container for pickers like the command palette.")); + quickInputTitleBackground = registerColor("quickInputTitle.background", { dark: new Color(new RGBA(255, 255, 255, 0.105)), light: new Color(new RGBA(0, 0, 0, 0.06)), hcDark: "#000000", hcLight: Color.white }, localize("pickerTitleBackground", "Quick picker title background color. The quick picker widget is the container for pickers like the command palette.")); + pickerGroupForeground = registerColor("pickerGroup.foreground", { dark: "#3794FF", light: "#0066BF", hcDark: Color.white, hcLight: "#0F4A85" }, localize("pickerGroupForeground", "Quick picker color for grouping labels.")); + pickerGroupBorder = registerColor("pickerGroup.border", { dark: "#3F3F46", light: "#CCCEDB", hcDark: Color.white, hcLight: "#0F4A85" }, localize("pickerGroupBorder", "Quick picker color for grouping borders.")); + _deprecatedQuickInputListFocusBackground = registerColor("quickInput.list.focusBackground", { dark: null, light: null, hcDark: null, hcLight: null }, "", void 0, localize("quickInput.list.focusBackground deprecation", "Please use quickInputList.focusBackground instead")); + quickInputListFocusForeground = registerColor("quickInputList.focusForeground", { dark: listActiveSelectionForeground, light: listActiveSelectionForeground, hcDark: listActiveSelectionForeground, hcLight: listActiveSelectionForeground }, localize("quickInput.listFocusForeground", "Quick picker foreground color for the focused item.")); + quickInputListFocusIconForeground = registerColor("quickInputList.focusIconForeground", { dark: listActiveSelectionIconForeground, light: listActiveSelectionIconForeground, hcDark: listActiveSelectionIconForeground, hcLight: listActiveSelectionIconForeground }, localize("quickInput.listFocusIconForeground", "Quick picker icon foreground color for the focused item.")); + quickInputListFocusBackground = registerColor("quickInputList.focusBackground", { dark: oneOf(_deprecatedQuickInputListFocusBackground, listActiveSelectionBackground), light: oneOf(_deprecatedQuickInputListFocusBackground, listActiveSelectionBackground), hcDark: null, hcLight: null }, localize("quickInput.listFocusBackground", "Quick picker background color for the focused item.")); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/colors/searchColors.js +var searchResultsInfoForeground, searchEditorFindMatch, searchEditorFindMatchBorder; +var init_searchColors = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/colors/searchColors.js"() { + init_nls(); + init_colorUtils(); + init_baseColors(); + init_editorColors(); + searchResultsInfoForeground = registerColor("search.resultsInfoForeground", { light: foreground, dark: transparent(foreground, 0.65), hcDark: foreground, hcLight: foreground }, localize("search.resultsInfoForeground", "Color of the text in the search viewlet's completion message.")); + searchEditorFindMatch = registerColor("searchEditor.findMatchBackground", { light: transparent(editorFindMatchHighlight, 0.66), dark: transparent(editorFindMatchHighlight, 0.66), hcDark: editorFindMatchHighlight, hcLight: editorFindMatchHighlight }, localize("searchEditor.queryMatch", "Color of the Search Editor query matches.")); + searchEditorFindMatchBorder = registerColor("searchEditor.findMatchBorder", { light: transparent(editorFindMatchHighlightBorder, 0.66), dark: transparent(editorFindMatchHighlightBorder, 0.66), hcDark: editorFindMatchHighlightBorder, hcLight: editorFindMatchHighlightBorder }, localize("searchEditor.editorFindMatchBorder", "Border color of the Search Editor query matches.")); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/colorRegistry.js +var init_colorRegistry = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/colorRegistry.js"() { + init_colorUtils(); + init_baseColors(); + init_chartsColors(); + init_editorColors(); + init_inputColors(); + init_listColors(); + init_menuColors(); + init_minimapColors(); + init_miscColors(); + init_quickpickColors(); + init_searchColors(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/editorDom.js +function createEditorPagePosition(editorViewDomNode) { + const editorPos = getDomNodePagePosition(editorViewDomNode); + return new EditorPagePosition(editorPos.left, editorPos.top, editorPos.width, editorPos.height); +} +function createCoordinatesRelativeToEditor(editorViewDomNode, editorPagePosition, pos) { + const scaleX = editorPagePosition.width / editorViewDomNode.offsetWidth; + const scaleY = editorPagePosition.height / editorViewDomNode.offsetHeight; + const relativeX = (pos.x - editorPagePosition.x) / scaleX; + const relativeY = (pos.y - editorPagePosition.y) / scaleY; + return new CoordinatesRelativeToEditor(relativeX, relativeY); +} +function camelToDashes(str) { + return str.replace(/(^[A-Z])/, ([first2]) => first2.toLowerCase()).replace(/([A-Z])/g, ([letter]) => `-${letter.toLowerCase()}`); +} +var PageCoordinates, ClientCoordinates, EditorPagePosition, CoordinatesRelativeToEditor, EditorMouseEvent, EditorMouseEventFactory, EditorPointerEventFactory, GlobalEditorPointerMoveMonitor, DynamicCssRules, RefCountedCssRule; +var init_editorDom = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/editorDom.js"() { + init_dom(); + init_globalPointerMoveMonitor(); + init_mouseEvent(); + init_async(); + init_lifecycle(); + init_colorRegistry(); + PageCoordinates = class { + constructor(x, y) { + this.x = x; + this.y = y; + this._pageCoordinatesBrand = void 0; + } + toClientCoordinates(targetWindow) { + return new ClientCoordinates(this.x - targetWindow.scrollX, this.y - targetWindow.scrollY); + } + }; + ClientCoordinates = class { + constructor(clientX, clientY) { + this.clientX = clientX; + this.clientY = clientY; + this._clientCoordinatesBrand = void 0; + } + toPageCoordinates(targetWindow) { + return new PageCoordinates(this.clientX + targetWindow.scrollX, this.clientY + targetWindow.scrollY); + } + }; + EditorPagePosition = class { + constructor(x, y, width2, height) { + this.x = x; + this.y = y; + this.width = width2; + this.height = height; + this._editorPagePositionBrand = void 0; + } + }; + CoordinatesRelativeToEditor = class { + constructor(x, y) { + this.x = x; + this.y = y; + this._positionRelativeToEditorBrand = void 0; + } + }; + EditorMouseEvent = class extends StandardMouseEvent { + constructor(e, isFromPointerCapture, editorViewDomNode) { + super(getWindow(editorViewDomNode), e); + this._editorMouseEventBrand = void 0; + this.isFromPointerCapture = isFromPointerCapture; + this.pos = new PageCoordinates(this.posx, this.posy); + this.editorPos = createEditorPagePosition(editorViewDomNode); + this.relativePos = createCoordinatesRelativeToEditor(editorViewDomNode, this.editorPos, this.pos); + } + }; + EditorMouseEventFactory = class { + constructor(editorViewDomNode) { + this._editorViewDomNode = editorViewDomNode; + } + _create(e) { + return new EditorMouseEvent(e, false, this._editorViewDomNode); + } + onContextMenu(target, callback) { + return addDisposableListener(target, "contextmenu", (e) => { + callback(this._create(e)); + }); + } + onMouseUp(target, callback) { + return addDisposableListener(target, "mouseup", (e) => { + callback(this._create(e)); + }); + } + onMouseDown(target, callback) { + return addDisposableListener(target, EventType.MOUSE_DOWN, (e) => { + callback(this._create(e)); + }); + } + onPointerDown(target, callback) { + return addDisposableListener(target, EventType.POINTER_DOWN, (e) => { + callback(this._create(e), e.pointerId); + }); + } + onMouseLeave(target, callback) { + return addDisposableListener(target, EventType.MOUSE_LEAVE, (e) => { + callback(this._create(e)); + }); + } + onMouseMove(target, callback) { + return addDisposableListener(target, "mousemove", (e) => callback(this._create(e))); + } + }; + EditorPointerEventFactory = class { + constructor(editorViewDomNode) { + this._editorViewDomNode = editorViewDomNode; + } + _create(e) { + return new EditorMouseEvent(e, false, this._editorViewDomNode); + } + onPointerUp(target, callback) { + return addDisposableListener(target, "pointerup", (e) => { + callback(this._create(e)); + }); + } + onPointerDown(target, callback) { + return addDisposableListener(target, EventType.POINTER_DOWN, (e) => { + callback(this._create(e), e.pointerId); + }); + } + onPointerLeave(target, callback) { + return addDisposableListener(target, EventType.POINTER_LEAVE, (e) => { + callback(this._create(e)); + }); + } + onPointerMove(target, callback) { + return addDisposableListener(target, "pointermove", (e) => callback(this._create(e))); + } + }; + GlobalEditorPointerMoveMonitor = class extends Disposable { + constructor(editorViewDomNode) { + super(); + this._editorViewDomNode = editorViewDomNode; + this._globalPointerMoveMonitor = this._register(new GlobalPointerMoveMonitor()); + this._keydownListener = null; + } + startMonitoring(initialElement, pointerId, initialButtons, pointerMoveCallback, onStopCallback) { + this._keydownListener = addStandardDisposableListener(initialElement.ownerDocument, "keydown", (e) => { + const chord = e.toKeyCodeChord(); + if (chord.isModifierKey()) { + return; + } + this._globalPointerMoveMonitor.stopMonitoring(true, e.browserEvent); + }, true); + this._globalPointerMoveMonitor.startMonitoring(initialElement, pointerId, initialButtons, (e) => { + pointerMoveCallback(new EditorMouseEvent(e, true, this._editorViewDomNode)); + }, (e) => { + this._keydownListener.dispose(); + onStopCallback(e); + }); + } + stopMonitoring() { + this._globalPointerMoveMonitor.stopMonitoring(true); + } + }; + DynamicCssRules = class _DynamicCssRules { + constructor(_editor) { + this._editor = _editor; + this._instanceId = ++_DynamicCssRules._idPool; + this._counter = 0; + this._rules = /* @__PURE__ */ new Map(); + this._garbageCollectionScheduler = new RunOnceScheduler(() => this.garbageCollect(), 1e3); + } + createClassNameRef(options2) { + const rule = this.getOrCreateRule(options2); + rule.increaseRefCount(); + return { + className: rule.className, + dispose: () => { + rule.decreaseRefCount(); + this._garbageCollectionScheduler.schedule(); + } + }; + } + getOrCreateRule(properties) { + const key = this.computeUniqueKey(properties); + let existingRule = this._rules.get(key); + if (!existingRule) { + const counter = this._counter++; + existingRule = new RefCountedCssRule(key, `dyn-rule-${this._instanceId}-${counter}`, isInShadowDOM(this._editor.getContainerDomNode()) ? this._editor.getContainerDomNode() : void 0, properties); + this._rules.set(key, existingRule); + } + return existingRule; + } + computeUniqueKey(properties) { + return JSON.stringify(properties); + } + garbageCollect() { + for (const rule of this._rules.values()) { + if (!rule.hasReferences()) { + this._rules.delete(rule.key); + rule.dispose(); + } + } + } + }; + DynamicCssRules._idPool = 0; + RefCountedCssRule = class { + constructor(key, className, _containerElement, properties) { + this.key = key; + this.className = className; + this.properties = properties; + this._referenceCount = 0; + this._styleElementDisposables = new DisposableStore(); + this._styleElement = createStyleSheet(_containerElement, void 0, this._styleElementDisposables); + this._styleElement.textContent = this.getCssText(this.className, this.properties); + } + getCssText(className, properties) { + let str = `.${className} {`; + for (const prop in properties) { + const value = properties[prop]; + let cssValue; + if (typeof value === "object") { + cssValue = asCssVariable(value.id); + } else { + cssValue = value; + } + const cssPropName = camelToDashes(prop); + str += ` + ${cssPropName}: ${cssValue};`; + } + str += ` +}`; + return str; + } + dispose() { + this._styleElementDisposables.dispose(); + this._styleElement = void 0; + } + increaseRefCount() { + this._referenceCount++; + } + decreaseRefCount() { + this._referenceCount--; + } + hasReferences() { + return this._referenceCount > 0; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewEventHandler.js +var ViewEventHandler; +var init_viewEventHandler = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewEventHandler.js"() { + init_lifecycle(); + ViewEventHandler = class extends Disposable { + constructor() { + super(); + this._shouldRender = true; + } + shouldRender() { + return this._shouldRender; + } + forceShouldRender() { + this._shouldRender = true; + } + setShouldRender() { + this._shouldRender = true; + } + onDidRender() { + this._shouldRender = false; + } + // --- begin event handlers + onCompositionStart(e) { + return false; + } + onCompositionEnd(e) { + return false; + } + onConfigurationChanged(e) { + return false; + } + onCursorStateChanged(e) { + return false; + } + onDecorationsChanged(e) { + return false; + } + onFlushed(e) { + return false; + } + onFocusChanged(e) { + return false; + } + onLanguageConfigurationChanged(e) { + return false; + } + onLineMappingChanged(e) { + return false; + } + onLinesChanged(e) { + return false; + } + onLinesDeleted(e) { + return false; + } + onLinesInserted(e) { + return false; + } + onRevealRangeRequest(e) { + return false; + } + onScrollChanged(e) { + return false; + } + onThemeChanged(e) { + return false; + } + onTokensChanged(e) { + return false; + } + onTokensColorsChanged(e) { + return false; + } + onZonesChanged(e) { + return false; + } + // --- end event handlers + handleEvents(events) { + let shouldRender = false; + for (let i = 0, len = events.length; i < len; i++) { + const e = events[i]; + switch (e.type) { + case 0: + if (this.onCompositionStart(e)) { + shouldRender = true; + } + break; + case 1: + if (this.onCompositionEnd(e)) { + shouldRender = true; + } + break; + case 2: + if (this.onConfigurationChanged(e)) { + shouldRender = true; + } + break; + case 3: + if (this.onCursorStateChanged(e)) { + shouldRender = true; + } + break; + case 4: + if (this.onDecorationsChanged(e)) { + shouldRender = true; + } + break; + case 5: + if (this.onFlushed(e)) { + shouldRender = true; + } + break; + case 6: + if (this.onFocusChanged(e)) { + shouldRender = true; + } + break; + case 7: + if (this.onLanguageConfigurationChanged(e)) { + shouldRender = true; + } + break; + case 8: + if (this.onLineMappingChanged(e)) { + shouldRender = true; + } + break; + case 9: + if (this.onLinesChanged(e)) { + shouldRender = true; + } + break; + case 10: + if (this.onLinesDeleted(e)) { + shouldRender = true; + } + break; + case 11: + if (this.onLinesInserted(e)) { + shouldRender = true; + } + break; + case 12: + if (this.onRevealRangeRequest(e)) { + shouldRender = true; + } + break; + case 13: + if (this.onScrollChanged(e)) { + shouldRender = true; + } + break; + case 15: + if (this.onTokensChanged(e)) { + shouldRender = true; + } + break; + case 14: + if (this.onThemeChanged(e)) { + shouldRender = true; + } + break; + case 16: + if (this.onTokensColorsChanged(e)) { + shouldRender = true; + } + break; + case 17: + if (this.onZonesChanged(e)) { + shouldRender = true; + } + break; + default: + console.info("View received unknown event: "); + console.info(e); + } + } + if (shouldRender) { + this._shouldRender = true; + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/view/viewPart.js +var ViewPart, PartFingerprints; +var init_viewPart = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/view/viewPart.js"() { + init_viewEventHandler(); + ViewPart = class extends ViewEventHandler { + constructor(context) { + super(); + this._context = context; + this._context.addEventHandler(this); + } + dispose() { + this._context.removeEventHandler(this); + super.dispose(); + } + }; + PartFingerprints = class { + static write(target, partId) { + target.setAttribute("data-mprt", String(partId)); + } + static read(target) { + const r = target.getAttribute("data-mprt"); + if (r === null) { + return 0; + } + return parseInt(r, 10); + } + static collect(child, stopAt) { + const result = []; + let resultLen = 0; + while (child && child !== child.ownerDocument.body) { + if (child === stopAt) { + break; + } + if (child.nodeType === child.ELEMENT_NODE) { + result[resultLen++] = this.read(child); + } + child = child.parentElement; + } + const r = new Uint8Array(resultLen); + for (let i = 0; i < resultLen; i++) { + r[i] = result[resultLen - i - 1]; + } + return r; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/view/renderingContext.js +var RestrictedRenderingContext, RenderingContext, LineVisibleRanges, HorizontalRange, FloatHorizontalRange, HorizontalPosition, VisibleRanges; +var init_renderingContext = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/view/renderingContext.js"() { + RestrictedRenderingContext = class { + constructor(viewLayout, viewportData) { + this._restrictedRenderingContextBrand = void 0; + this._viewLayout = viewLayout; + this.viewportData = viewportData; + this.scrollWidth = this._viewLayout.getScrollWidth(); + this.scrollHeight = this._viewLayout.getScrollHeight(); + this.visibleRange = this.viewportData.visibleRange; + this.bigNumbersDelta = this.viewportData.bigNumbersDelta; + const vInfo = this._viewLayout.getCurrentViewport(); + this.scrollTop = vInfo.top; + this.scrollLeft = vInfo.left; + this.viewportWidth = vInfo.width; + this.viewportHeight = vInfo.height; + } + getScrolledTopFromAbsoluteTop(absoluteTop) { + return absoluteTop - this.scrollTop; + } + getVerticalOffsetForLineNumber(lineNumber, includeViewZones) { + return this._viewLayout.getVerticalOffsetForLineNumber(lineNumber, includeViewZones); + } + getVerticalOffsetAfterLineNumber(lineNumber, includeViewZones) { + return this._viewLayout.getVerticalOffsetAfterLineNumber(lineNumber, includeViewZones); + } + getDecorationsInViewport() { + return this.viewportData.getDecorationsInViewport(); + } + }; + RenderingContext = class extends RestrictedRenderingContext { + constructor(viewLayout, viewportData, viewLines) { + super(viewLayout, viewportData); + this._renderingContextBrand = void 0; + this._viewLines = viewLines; + } + linesVisibleRangesForRange(range2, includeNewLines) { + return this._viewLines.linesVisibleRangesForRange(range2, includeNewLines); + } + visibleRangeForPosition(position) { + return this._viewLines.visibleRangeForPosition(position); + } + }; + LineVisibleRanges = class { + constructor(outsideRenderedLine, lineNumber, ranges, continuesOnNextLine) { + this.outsideRenderedLine = outsideRenderedLine; + this.lineNumber = lineNumber; + this.ranges = ranges; + this.continuesOnNextLine = continuesOnNextLine; + } + }; + HorizontalRange = class _HorizontalRange { + static from(ranges) { + const result = new Array(ranges.length); + for (let i = 0, len = ranges.length; i < len; i++) { + const range2 = ranges[i]; + result[i] = new _HorizontalRange(range2.left, range2.width); + } + return result; + } + constructor(left, width2) { + this._horizontalRangeBrand = void 0; + this.left = Math.round(left); + this.width = Math.round(width2); + } + toString() { + return `[${this.left},${this.width}]`; + } + }; + FloatHorizontalRange = class { + constructor(left, width2) { + this._floatHorizontalRangeBrand = void 0; + this.left = left; + this.width = width2; + } + toString() { + return `[${this.left},${this.width}]`; + } + static compare(a3, b) { + return a3.left - b.left; + } + }; + HorizontalPosition = class { + constructor(outsideRenderedLine, left) { + this.outsideRenderedLine = outsideRenderedLine; + this.originalLeft = left; + this.left = Math.round(this.originalLeft); + } + }; + VisibleRanges = class { + constructor(outsideRenderedLine, ranges) { + this.outsideRenderedLine = outsideRenderedLine; + this.ranges = ranges; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/lines/rangeUtil.js +var RangeUtil; +var init_rangeUtil = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/lines/rangeUtil.js"() { + init_renderingContext(); + RangeUtil = class { + static _createRange() { + if (!this._handyReadyRange) { + this._handyReadyRange = document.createRange(); + } + return this._handyReadyRange; + } + static _detachRange(range2, endNode) { + range2.selectNodeContents(endNode); + } + static _readClientRects(startElement, startOffset, endElement, endOffset, endNode) { + const range2 = this._createRange(); + try { + range2.setStart(startElement, startOffset); + range2.setEnd(endElement, endOffset); + return range2.getClientRects(); + } catch (e) { + return null; + } finally { + this._detachRange(range2, endNode); + } + } + static _mergeAdjacentRanges(ranges) { + if (ranges.length === 1) { + return ranges; + } + ranges.sort(FloatHorizontalRange.compare); + const result = []; + let resultLen = 0; + let prev = ranges[0]; + for (let i = 1, len = ranges.length; i < len; i++) { + const range2 = ranges[i]; + if (prev.left + prev.width + 0.9 >= range2.left) { + prev.width = Math.max(prev.width, range2.left + range2.width - prev.left); + } else { + result[resultLen++] = prev; + prev = range2; + } + } + result[resultLen++] = prev; + return result; + } + static _createHorizontalRangesFromClientRects(clientRects, clientRectDeltaLeft, clientRectScale) { + if (!clientRects || clientRects.length === 0) { + return null; + } + const result = []; + for (let i = 0, len = clientRects.length; i < len; i++) { + const clientRect = clientRects[i]; + result[i] = new FloatHorizontalRange(Math.max(0, (clientRect.left - clientRectDeltaLeft) / clientRectScale), clientRect.width / clientRectScale); + } + return this._mergeAdjacentRanges(result); + } + static readHorizontalRanges(domNode, startChildIndex, startOffset, endChildIndex, endOffset, context) { + const min = 0; + const max = domNode.children.length - 1; + if (min > max) { + return null; + } + startChildIndex = Math.min(max, Math.max(min, startChildIndex)); + endChildIndex = Math.min(max, Math.max(min, endChildIndex)); + if (startChildIndex === endChildIndex && startOffset === endOffset && startOffset === 0 && !domNode.children[startChildIndex].firstChild) { + const clientRects2 = domNode.children[startChildIndex].getClientRects(); + context.markDidDomLayout(); + return this._createHorizontalRangesFromClientRects(clientRects2, context.clientRectDeltaLeft, context.clientRectScale); + } + if (startChildIndex !== endChildIndex) { + if (endChildIndex > 0 && endOffset === 0) { + endChildIndex--; + endOffset = 1073741824; + } + } + let startElement = domNode.children[startChildIndex].firstChild; + let endElement = domNode.children[endChildIndex].firstChild; + if (!startElement || !endElement) { + if (!startElement && startOffset === 0 && startChildIndex > 0) { + startElement = domNode.children[startChildIndex - 1].firstChild; + startOffset = 1073741824; + } + if (!endElement && endOffset === 0 && endChildIndex > 0) { + endElement = domNode.children[endChildIndex - 1].firstChild; + endOffset = 1073741824; + } + } + if (!startElement || !endElement) { + return null; + } + startOffset = Math.min(startElement.textContent.length, Math.max(0, startOffset)); + endOffset = Math.min(endElement.textContent.length, Math.max(0, endOffset)); + const clientRects = this._readClientRects(startElement, startOffset, endElement, endOffset, context.endNode); + context.markDidDomLayout(); + return this._createHorizontalRangesFromClientRects(clientRects, context.clientRectDeltaLeft, context.clientRectScale); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/theme.js +function isHighContrast(scheme) { + return scheme === ColorScheme.HIGH_CONTRAST_DARK || scheme === ColorScheme.HIGH_CONTRAST_LIGHT; +} +function isDark(scheme) { + return scheme === ColorScheme.DARK || scheme === ColorScheme.HIGH_CONTRAST_DARK; +} +var ColorScheme; +var init_theme = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/theme.js"() { + (function(ColorScheme2) { + ColorScheme2["DARK"] = "dark"; + ColorScheme2["LIGHT"] = "light"; + ColorScheme2["HIGH_CONTRAST_DARK"] = "hcDark"; + ColorScheme2["HIGH_CONTRAST_LIGHT"] = "hcLight"; + })(ColorScheme || (ColorScheme = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/lines/viewLine.js +function createWebKitRenderedLine(domNode, renderLineInput, characterMapping, containsRTL2, containsForeignElements) { + return new WebKitRenderedViewLine(domNode, renderLineInput, characterMapping, containsRTL2, containsForeignElements); +} +function createNormalRenderedLine(domNode, renderLineInput, characterMapping, containsRTL2, containsForeignElements) { + return new RenderedViewLine(domNode, renderLineInput, characterMapping, containsRTL2, containsForeignElements); +} +function getColumnOfNodeOffset(characterMapping, spanNode, offset) { + const spanNodeTextContentLength = spanNode.textContent.length; + let spanIndex = -1; + while (spanNode) { + spanNode = spanNode.previousSibling; + spanIndex++; + } + return characterMapping.getColumn(new DomPosition(spanIndex, offset), spanNodeTextContentLength); +} +var canUseFastRenderedViewLine, monospaceAssumptionsAreValid, ViewLineOptions, ViewLine, FastRenderedViewLine, RenderedViewLine, WebKitRenderedViewLine, createRenderedLine; +var init_viewLine = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/lines/viewLine.js"() { + init_browser(); + init_fastDomNode(); + init_platform(); + init_rangeUtil(); + init_renderingContext(); + init_lineDecorations(); + init_viewLineRenderer(); + init_theme(); + init_editorOptions(); + canUseFastRenderedViewLine = function() { + if (isNative) { + return true; + } + if (isLinux || isFirefox2 || isSafari2) { + return false; + } + return true; + }(); + monospaceAssumptionsAreValid = true; + ViewLineOptions = class { + constructor(config, themeType) { + this.themeType = themeType; + const options2 = config.options; + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + const experimentalWhitespaceRendering = options2.get( + 38 + /* EditorOption.experimentalWhitespaceRendering */ + ); + if (experimentalWhitespaceRendering === "off") { + this.renderWhitespace = options2.get( + 99 + /* EditorOption.renderWhitespace */ + ); + } else { + this.renderWhitespace = "none"; + } + this.renderControlCharacters = options2.get( + 94 + /* EditorOption.renderControlCharacters */ + ); + this.spaceWidth = fontInfo.spaceWidth; + this.middotWidth = fontInfo.middotWidth; + this.wsmiddotWidth = fontInfo.wsmiddotWidth; + this.useMonospaceOptimizations = fontInfo.isMonospace && !options2.get( + 33 + /* EditorOption.disableMonospaceOptimizations */ + ); + this.canUseHalfwidthRightwardsArrow = fontInfo.canUseHalfwidthRightwardsArrow; + this.lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this.stopRenderingLineAfter = options2.get( + 117 + /* EditorOption.stopRenderingLineAfter */ + ); + this.fontLigatures = options2.get( + 51 + /* EditorOption.fontLigatures */ + ); + } + equals(other) { + return this.themeType === other.themeType && this.renderWhitespace === other.renderWhitespace && this.renderControlCharacters === other.renderControlCharacters && this.spaceWidth === other.spaceWidth && this.middotWidth === other.middotWidth && this.wsmiddotWidth === other.wsmiddotWidth && this.useMonospaceOptimizations === other.useMonospaceOptimizations && this.canUseHalfwidthRightwardsArrow === other.canUseHalfwidthRightwardsArrow && this.lineHeight === other.lineHeight && this.stopRenderingLineAfter === other.stopRenderingLineAfter && this.fontLigatures === other.fontLigatures; + } + }; + ViewLine = class _ViewLine { + constructor(options2) { + this._options = options2; + this._isMaybeInvalid = true; + this._renderedViewLine = null; + } + // --- begin IVisibleLineData + getDomNode() { + if (this._renderedViewLine && this._renderedViewLine.domNode) { + return this._renderedViewLine.domNode.domNode; + } + return null; + } + setDomNode(domNode) { + if (this._renderedViewLine) { + this._renderedViewLine.domNode = createFastDomNode(domNode); + } else { + throw new Error("I have no rendered view line to set the dom node to..."); + } + } + onContentChanged() { + this._isMaybeInvalid = true; + } + onTokensChanged() { + this._isMaybeInvalid = true; + } + onDecorationsChanged() { + this._isMaybeInvalid = true; + } + onOptionsChanged(newOptions) { + this._isMaybeInvalid = true; + this._options = newOptions; + } + onSelectionChanged() { + if (isHighContrast(this._options.themeType) || this._options.renderWhitespace === "selection") { + this._isMaybeInvalid = true; + return true; + } + return false; + } + renderLine(lineNumber, deltaTop, lineHeight, viewportData, sb) { + if (this._isMaybeInvalid === false) { + return false; + } + this._isMaybeInvalid = false; + const lineData = viewportData.getViewLineRenderingData(lineNumber); + const options2 = this._options; + const actualInlineDecorations = LineDecoration.filter(lineData.inlineDecorations, lineNumber, lineData.minColumn, lineData.maxColumn); + let selectionsOnLine = null; + if (isHighContrast(options2.themeType) || this._options.renderWhitespace === "selection") { + const selections = viewportData.selections; + for (const selection of selections) { + if (selection.endLineNumber < lineNumber || selection.startLineNumber > lineNumber) { + continue; + } + const startColumn = selection.startLineNumber === lineNumber ? selection.startColumn : lineData.minColumn; + const endColumn = selection.endLineNumber === lineNumber ? selection.endColumn : lineData.maxColumn; + if (startColumn < endColumn) { + if (isHighContrast(options2.themeType)) { + actualInlineDecorations.push(new LineDecoration( + startColumn, + endColumn, + "inline-selected-text", + 0 + /* InlineDecorationType.Regular */ + )); + } + if (this._options.renderWhitespace === "selection") { + if (!selectionsOnLine) { + selectionsOnLine = []; + } + selectionsOnLine.push(new LineRange2(startColumn - 1, endColumn - 1)); + } + } + } + } + const renderLineInput = new RenderLineInput(options2.useMonospaceOptimizations, options2.canUseHalfwidthRightwardsArrow, lineData.content, lineData.continuesWithWrappedLine, lineData.isBasicASCII, lineData.containsRTL, lineData.minColumn - 1, lineData.tokens, actualInlineDecorations, lineData.tabSize, lineData.startVisibleColumn, options2.spaceWidth, options2.middotWidth, options2.wsmiddotWidth, options2.stopRenderingLineAfter, options2.renderWhitespace, options2.renderControlCharacters, options2.fontLigatures !== EditorFontLigatures.OFF, selectionsOnLine); + if (this._renderedViewLine && this._renderedViewLine.input.equals(renderLineInput)) { + return false; + } + sb.appendString('
'); + const output = renderViewLine(renderLineInput, sb); + sb.appendString("
"); + let renderedViewLine = null; + if (monospaceAssumptionsAreValid && canUseFastRenderedViewLine && lineData.isBasicASCII && options2.useMonospaceOptimizations && output.containsForeignElements === 0) { + renderedViewLine = new FastRenderedViewLine(this._renderedViewLine ? this._renderedViewLine.domNode : null, renderLineInput, output.characterMapping); + } + if (!renderedViewLine) { + renderedViewLine = createRenderedLine(this._renderedViewLine ? this._renderedViewLine.domNode : null, renderLineInput, output.characterMapping, output.containsRTL, output.containsForeignElements); + } + this._renderedViewLine = renderedViewLine; + return true; + } + layoutLine(lineNumber, deltaTop, lineHeight) { + if (this._renderedViewLine && this._renderedViewLine.domNode) { + this._renderedViewLine.domNode.setTop(deltaTop); + this._renderedViewLine.domNode.setHeight(lineHeight); + } + } + // --- end IVisibleLineData + getWidth(context) { + if (!this._renderedViewLine) { + return 0; + } + return this._renderedViewLine.getWidth(context); + } + getWidthIsFast() { + if (!this._renderedViewLine) { + return true; + } + return this._renderedViewLine.getWidthIsFast(); + } + needsMonospaceFontCheck() { + if (!this._renderedViewLine) { + return false; + } + return this._renderedViewLine instanceof FastRenderedViewLine; + } + monospaceAssumptionsAreValid() { + if (!this._renderedViewLine) { + return monospaceAssumptionsAreValid; + } + if (this._renderedViewLine instanceof FastRenderedViewLine) { + return this._renderedViewLine.monospaceAssumptionsAreValid(); + } + return monospaceAssumptionsAreValid; + } + onMonospaceAssumptionsInvalidated() { + if (this._renderedViewLine && this._renderedViewLine instanceof FastRenderedViewLine) { + this._renderedViewLine = this._renderedViewLine.toSlowRenderedLine(); + } + } + getVisibleRangesForRange(lineNumber, startColumn, endColumn, context) { + if (!this._renderedViewLine) { + return null; + } + startColumn = Math.min(this._renderedViewLine.input.lineContent.length + 1, Math.max(1, startColumn)); + endColumn = Math.min(this._renderedViewLine.input.lineContent.length + 1, Math.max(1, endColumn)); + const stopRenderingLineAfter = this._renderedViewLine.input.stopRenderingLineAfter; + if (stopRenderingLineAfter !== -1 && startColumn > stopRenderingLineAfter + 1 && endColumn > stopRenderingLineAfter + 1) { + return new VisibleRanges(true, [new FloatHorizontalRange(this.getWidth(context), 0)]); + } + if (stopRenderingLineAfter !== -1 && startColumn > stopRenderingLineAfter + 1) { + startColumn = stopRenderingLineAfter + 1; + } + if (stopRenderingLineAfter !== -1 && endColumn > stopRenderingLineAfter + 1) { + endColumn = stopRenderingLineAfter + 1; + } + const horizontalRanges = this._renderedViewLine.getVisibleRangesForRange(lineNumber, startColumn, endColumn, context); + if (horizontalRanges && horizontalRanges.length > 0) { + return new VisibleRanges(false, horizontalRanges); + } + return null; + } + getColumnOfNodeOffset(spanNode, offset) { + if (!this._renderedViewLine) { + return 1; + } + return this._renderedViewLine.getColumnOfNodeOffset(spanNode, offset); + } + }; + ViewLine.CLASS_NAME = "view-line"; + FastRenderedViewLine = class { + constructor(domNode, renderLineInput, characterMapping) { + this._cachedWidth = -1; + this.domNode = domNode; + this.input = renderLineInput; + const keyColumnCount = Math.floor( + renderLineInput.lineContent.length / 300 + /* Constants.MaxMonospaceDistance */ + ); + if (keyColumnCount > 0) { + this._keyColumnPixelOffsetCache = new Float32Array(keyColumnCount); + for (let i = 0; i < keyColumnCount; i++) { + this._keyColumnPixelOffsetCache[i] = -1; + } + } else { + this._keyColumnPixelOffsetCache = null; + } + this._characterMapping = characterMapping; + this._charWidth = renderLineInput.spaceWidth; + } + getWidth(context) { + if (!this.domNode || this.input.lineContent.length < 300) { + const horizontalOffset = this._characterMapping.getHorizontalOffset(this._characterMapping.length); + return Math.round(this._charWidth * horizontalOffset); + } + if (this._cachedWidth === -1) { + this._cachedWidth = this._getReadingTarget(this.domNode).offsetWidth; + context === null || context === void 0 ? void 0 : context.markDidDomLayout(); + } + return this._cachedWidth; + } + getWidthIsFast() { + return this.input.lineContent.length < 300 || this._cachedWidth !== -1; + } + monospaceAssumptionsAreValid() { + if (!this.domNode) { + return monospaceAssumptionsAreValid; + } + if (this.input.lineContent.length < 300) { + const expectedWidth = this.getWidth(null); + const actualWidth = this.domNode.domNode.firstChild.offsetWidth; + if (Math.abs(expectedWidth - actualWidth) >= 2) { + console.warn(`monospace assumptions have been violated, therefore disabling monospace optimizations!`); + monospaceAssumptionsAreValid = false; + } + } + return monospaceAssumptionsAreValid; + } + toSlowRenderedLine() { + return createRenderedLine( + this.domNode, + this.input, + this._characterMapping, + false, + 0 + /* ForeignElementType.None */ + ); + } + getVisibleRangesForRange(lineNumber, startColumn, endColumn, context) { + const startPosition = this._getColumnPixelOffset(lineNumber, startColumn, context); + const endPosition = this._getColumnPixelOffset(lineNumber, endColumn, context); + return [new FloatHorizontalRange(startPosition, endPosition - startPosition)]; + } + _getColumnPixelOffset(lineNumber, column, context) { + if (column <= 300) { + const horizontalOffset2 = this._characterMapping.getHorizontalOffset(column); + return this._charWidth * horizontalOffset2; + } + const keyColumnOrdinal = Math.floor( + (column - 1) / 300 + /* Constants.MaxMonospaceDistance */ + ) - 1; + const keyColumn = (keyColumnOrdinal + 1) * 300 + 1; + let keyColumnPixelOffset = -1; + if (this._keyColumnPixelOffsetCache) { + keyColumnPixelOffset = this._keyColumnPixelOffsetCache[keyColumnOrdinal]; + if (keyColumnPixelOffset === -1) { + keyColumnPixelOffset = this._actualReadPixelOffset(lineNumber, keyColumn, context); + this._keyColumnPixelOffsetCache[keyColumnOrdinal] = keyColumnPixelOffset; + } + } + if (keyColumnPixelOffset === -1) { + const horizontalOffset2 = this._characterMapping.getHorizontalOffset(column); + return this._charWidth * horizontalOffset2; + } + const keyColumnHorizontalOffset = this._characterMapping.getHorizontalOffset(keyColumn); + const horizontalOffset = this._characterMapping.getHorizontalOffset(column); + return keyColumnPixelOffset + this._charWidth * (horizontalOffset - keyColumnHorizontalOffset); + } + _getReadingTarget(myDomNode) { + return myDomNode.domNode.firstChild; + } + _actualReadPixelOffset(lineNumber, column, context) { + if (!this.domNode) { + return -1; + } + const domPosition = this._characterMapping.getDomPosition(column); + const r = RangeUtil.readHorizontalRanges(this._getReadingTarget(this.domNode), domPosition.partIndex, domPosition.charIndex, domPosition.partIndex, domPosition.charIndex, context); + if (!r || r.length === 0) { + return -1; + } + return r[0].left; + } + getColumnOfNodeOffset(spanNode, offset) { + return getColumnOfNodeOffset(this._characterMapping, spanNode, offset); + } + }; + RenderedViewLine = class { + constructor(domNode, renderLineInput, characterMapping, containsRTL2, containsForeignElements) { + this.domNode = domNode; + this.input = renderLineInput; + this._characterMapping = characterMapping; + this._isWhitespaceOnly = /^\s*$/.test(renderLineInput.lineContent); + this._containsForeignElements = containsForeignElements; + this._cachedWidth = -1; + this._pixelOffsetCache = null; + if (!containsRTL2 || this._characterMapping.length === 0) { + this._pixelOffsetCache = new Float32Array(Math.max(2, this._characterMapping.length + 1)); + for (let column = 0, len = this._characterMapping.length; column <= len; column++) { + this._pixelOffsetCache[column] = -1; + } + } + } + // --- Reading from the DOM methods + _getReadingTarget(myDomNode) { + return myDomNode.domNode.firstChild; + } + /** + * Width of the line in pixels + */ + getWidth(context) { + if (!this.domNode) { + return 0; + } + if (this._cachedWidth === -1) { + this._cachedWidth = this._getReadingTarget(this.domNode).offsetWidth; + context === null || context === void 0 ? void 0 : context.markDidDomLayout(); + } + return this._cachedWidth; + } + getWidthIsFast() { + if (this._cachedWidth === -1) { + return false; + } + return true; + } + /** + * Visible ranges for a model range + */ + getVisibleRangesForRange(lineNumber, startColumn, endColumn, context) { + if (!this.domNode) { + return null; + } + if (this._pixelOffsetCache !== null) { + const startOffset = this._readPixelOffset(this.domNode, lineNumber, startColumn, context); + if (startOffset === -1) { + return null; + } + const endOffset = this._readPixelOffset(this.domNode, lineNumber, endColumn, context); + if (endOffset === -1) { + return null; + } + return [new FloatHorizontalRange(startOffset, endOffset - startOffset)]; + } + return this._readVisibleRangesForRange(this.domNode, lineNumber, startColumn, endColumn, context); + } + _readVisibleRangesForRange(domNode, lineNumber, startColumn, endColumn, context) { + if (startColumn === endColumn) { + const pixelOffset = this._readPixelOffset(domNode, lineNumber, startColumn, context); + if (pixelOffset === -1) { + return null; + } else { + return [new FloatHorizontalRange(pixelOffset, 0)]; + } + } else { + return this._readRawVisibleRangesForRange(domNode, startColumn, endColumn, context); + } + } + _readPixelOffset(domNode, lineNumber, column, context) { + if (this._characterMapping.length === 0) { + if (this._containsForeignElements === 0) { + return 0; + } + if (this._containsForeignElements === 2) { + return 0; + } + if (this._containsForeignElements === 1) { + return this.getWidth(context); + } + const readingTarget = this._getReadingTarget(domNode); + if (readingTarget.firstChild) { + context.markDidDomLayout(); + return readingTarget.firstChild.offsetWidth; + } else { + return 0; + } + } + if (this._pixelOffsetCache !== null) { + const cachedPixelOffset = this._pixelOffsetCache[column]; + if (cachedPixelOffset !== -1) { + return cachedPixelOffset; + } + const result = this._actualReadPixelOffset(domNode, lineNumber, column, context); + this._pixelOffsetCache[column] = result; + return result; + } + return this._actualReadPixelOffset(domNode, lineNumber, column, context); + } + _actualReadPixelOffset(domNode, lineNumber, column, context) { + if (this._characterMapping.length === 0) { + const r2 = RangeUtil.readHorizontalRanges(this._getReadingTarget(domNode), 0, 0, 0, 0, context); + if (!r2 || r2.length === 0) { + return -1; + } + return r2[0].left; + } + if (column === this._characterMapping.length && this._isWhitespaceOnly && this._containsForeignElements === 0) { + return this.getWidth(context); + } + const domPosition = this._characterMapping.getDomPosition(column); + const r = RangeUtil.readHorizontalRanges(this._getReadingTarget(domNode), domPosition.partIndex, domPosition.charIndex, domPosition.partIndex, domPosition.charIndex, context); + if (!r || r.length === 0) { + return -1; + } + const result = r[0].left; + if (this.input.isBasicASCII) { + const horizontalOffset = this._characterMapping.getHorizontalOffset(column); + const expectedResult = Math.round(this.input.spaceWidth * horizontalOffset); + if (Math.abs(expectedResult - result) <= 1) { + return expectedResult; + } + } + return result; + } + _readRawVisibleRangesForRange(domNode, startColumn, endColumn, context) { + if (startColumn === 1 && endColumn === this._characterMapping.length) { + return [new FloatHorizontalRange(0, this.getWidth(context))]; + } + const startDomPosition = this._characterMapping.getDomPosition(startColumn); + const endDomPosition = this._characterMapping.getDomPosition(endColumn); + return RangeUtil.readHorizontalRanges(this._getReadingTarget(domNode), startDomPosition.partIndex, startDomPosition.charIndex, endDomPosition.partIndex, endDomPosition.charIndex, context); + } + /** + * Returns the column for the text found at a specific offset inside a rendered dom node + */ + getColumnOfNodeOffset(spanNode, offset) { + return getColumnOfNodeOffset(this._characterMapping, spanNode, offset); + } + }; + WebKitRenderedViewLine = class extends RenderedViewLine { + _readVisibleRangesForRange(domNode, lineNumber, startColumn, endColumn, context) { + const output = super._readVisibleRangesForRange(domNode, lineNumber, startColumn, endColumn, context); + if (!output || output.length === 0 || startColumn === endColumn || startColumn === 1 && endColumn === this._characterMapping.length) { + return output; + } + if (!this.input.containsRTL) { + const endPixelOffset = this._readPixelOffset(domNode, lineNumber, endColumn, context); + if (endPixelOffset !== -1) { + const lastRange = output[output.length - 1]; + if (lastRange.left < endPixelOffset) { + lastRange.width = endPixelOffset - lastRange.left; + } + } + } + return output; + } + }; + createRenderedLine = function() { + if (isWebKit) { + return createWebKitRenderedLine; + } + return createNormalRenderedLine; + }(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/cursorColumns.js +var CursorColumns; +var init_cursorColumns = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/cursorColumns.js"() { + init_strings(); + CursorColumns = class _CursorColumns { + static _nextVisibleColumn(codePoint, visibleColumn, tabSize) { + if (codePoint === 9) { + return _CursorColumns.nextRenderTabStop(visibleColumn, tabSize); + } + if (isFullWidthCharacter(codePoint) || isEmojiImprecise(codePoint)) { + return visibleColumn + 2; + } + return visibleColumn + 1; + } + /** + * Returns a visible column from a column. + * @see {@link CursorColumns} + */ + static visibleColumnFromColumn(lineContent, column, tabSize) { + const textLen = Math.min(column - 1, lineContent.length); + const text2 = lineContent.substring(0, textLen); + const iterator = new GraphemeIterator(text2); + let result = 0; + while (!iterator.eol()) { + const codePoint = getNextCodePoint(text2, textLen, iterator.offset); + iterator.nextGraphemeLength(); + result = this._nextVisibleColumn(codePoint, result, tabSize); + } + return result; + } + /** + * Returns a column from a visible column. + * @see {@link CursorColumns} + */ + static columnFromVisibleColumn(lineContent, visibleColumn, tabSize) { + if (visibleColumn <= 0) { + return 1; + } + const lineContentLength = lineContent.length; + const iterator = new GraphemeIterator(lineContent); + let beforeVisibleColumn = 0; + let beforeColumn = 1; + while (!iterator.eol()) { + const codePoint = getNextCodePoint(lineContent, lineContentLength, iterator.offset); + iterator.nextGraphemeLength(); + const afterVisibleColumn = this._nextVisibleColumn(codePoint, beforeVisibleColumn, tabSize); + const afterColumn = iterator.offset + 1; + if (afterVisibleColumn >= visibleColumn) { + const beforeDelta = visibleColumn - beforeVisibleColumn; + const afterDelta = afterVisibleColumn - visibleColumn; + if (afterDelta < beforeDelta) { + return afterColumn; + } else { + return beforeColumn; + } + } + beforeVisibleColumn = afterVisibleColumn; + beforeColumn = afterColumn; + } + return lineContentLength + 1; + } + /** + * ATTENTION: This works with 0-based columns (as opposed to the regular 1-based columns) + * @see {@link CursorColumns} + */ + static nextRenderTabStop(visibleColumn, tabSize) { + return visibleColumn + tabSize - visibleColumn % tabSize; + } + /** + * ATTENTION: This works with 0-based columns (as opposed to the regular 1-based columns) + * @see {@link CursorColumns} + */ + static nextIndentTabStop(visibleColumn, indentSize) { + return visibleColumn + indentSize - visibleColumn % indentSize; + } + /** + * ATTENTION: This works with 0-based columns (as opposed to the regular 1-based columns) + * @see {@link CursorColumns} + */ + static prevRenderTabStop(column, tabSize) { + return Math.max(0, column - 1 - (column - 1) % tabSize); + } + /** + * ATTENTION: This works with 0-based columns (as opposed to the regular 1-based columns) + * @see {@link CursorColumns} + */ + static prevIndentTabStop(column, indentSize) { + return Math.max(0, column - 1 - (column - 1) % indentSize); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorAtomicMoveOperations.js +var AtomicTabMoveOperations; +var init_cursorAtomicMoveOperations = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorAtomicMoveOperations.js"() { + init_cursorColumns(); + AtomicTabMoveOperations = class _AtomicTabMoveOperations { + /** + * Get the visible column at the position. If we get to a non-whitespace character first + * or past the end of string then return -1. + * + * **Note** `position` and the return value are 0-based. + */ + static whitespaceVisibleColumn(lineContent, position, tabSize) { + const lineLength = lineContent.length; + let visibleColumn = 0; + let prevTabStopPosition = -1; + let prevTabStopVisibleColumn = -1; + for (let i = 0; i < lineLength; i++) { + if (i === position) { + return [prevTabStopPosition, prevTabStopVisibleColumn, visibleColumn]; + } + if (visibleColumn % tabSize === 0) { + prevTabStopPosition = i; + prevTabStopVisibleColumn = visibleColumn; + } + const chCode = lineContent.charCodeAt(i); + switch (chCode) { + case 32: + visibleColumn += 1; + break; + case 9: + visibleColumn = CursorColumns.nextRenderTabStop(visibleColumn, tabSize); + break; + default: + return [-1, -1, -1]; + } + } + if (position === lineLength) { + return [prevTabStopPosition, prevTabStopVisibleColumn, visibleColumn]; + } + return [-1, -1, -1]; + } + /** + * Return the position that should result from a move left, right or to the + * nearest tab, if atomic tabs are enabled. Left and right are used for the + * arrow key movements, nearest is used for mouse selection. It returns + * -1 if atomic tabs are not relevant and you should fall back to normal + * behaviour. + * + * **Note**: `position` and the return value are 0-based. + */ + static atomicPosition(lineContent, position, tabSize, direction) { + const lineLength = lineContent.length; + const [prevTabStopPosition, prevTabStopVisibleColumn, visibleColumn] = _AtomicTabMoveOperations.whitespaceVisibleColumn(lineContent, position, tabSize); + if (visibleColumn === -1) { + return -1; + } + let left; + switch (direction) { + case 0: + left = true; + break; + case 1: + left = false; + break; + case 2: + if (visibleColumn % tabSize === 0) { + return position; + } + left = visibleColumn % tabSize <= tabSize / 2; + break; + } + if (left) { + if (prevTabStopPosition === -1) { + return -1; + } + let currentVisibleColumn2 = prevTabStopVisibleColumn; + for (let i = prevTabStopPosition; i < lineLength; ++i) { + if (currentVisibleColumn2 === prevTabStopVisibleColumn + tabSize) { + return prevTabStopPosition; + } + const chCode = lineContent.charCodeAt(i); + switch (chCode) { + case 32: + currentVisibleColumn2 += 1; + break; + case 9: + currentVisibleColumn2 = CursorColumns.nextRenderTabStop(currentVisibleColumn2, tabSize); + break; + default: + return -1; + } + } + if (currentVisibleColumn2 === prevTabStopVisibleColumn + tabSize) { + return prevTabStopPosition; + } + return -1; + } + const targetVisibleColumn = CursorColumns.nextRenderTabStop(visibleColumn, tabSize); + let currentVisibleColumn = visibleColumn; + for (let i = position; i < lineLength; i++) { + if (currentVisibleColumn === targetVisibleColumn) { + return i; + } + const chCode = lineContent.charCodeAt(i); + switch (chCode) { + case 32: + currentVisibleColumn += 1; + break; + case 9: + currentVisibleColumn = CursorColumns.nextRenderTabStop(currentVisibleColumn, tabSize); + break; + default: + return -1; + } + } + if (currentVisibleColumn === targetVisibleColumn) { + return lineLength; + } + return -1; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/controller/mouseTarget.js +function createEmptyContentDataInLines(horizontalDistanceToText) { + return { + isAfterLines: false, + horizontalDistanceToText + }; +} +function shadowCaretRangeFromPoint(shadowRoot, x, y) { + const range2 = document.createRange(); + let el = shadowRoot.elementFromPoint(x, y); + if (el !== null) { + while (el && el.firstChild && el.firstChild.nodeType !== el.firstChild.TEXT_NODE && el.lastChild && el.lastChild.firstChild) { + el = el.lastChild; + } + const rect = el.getBoundingClientRect(); + const elWindow = getWindow(el); + const fontStyle = elWindow.getComputedStyle(el, null).getPropertyValue("font-style"); + const fontVariant = elWindow.getComputedStyle(el, null).getPropertyValue("font-variant"); + const fontWeight = elWindow.getComputedStyle(el, null).getPropertyValue("font-weight"); + const fontSize = elWindow.getComputedStyle(el, null).getPropertyValue("font-size"); + const lineHeight = elWindow.getComputedStyle(el, null).getPropertyValue("line-height"); + const fontFamily = elWindow.getComputedStyle(el, null).getPropertyValue("font-family"); + const font = `${fontStyle} ${fontVariant} ${fontWeight} ${fontSize}/${lineHeight} ${fontFamily}`; + const text2 = el.innerText; + let pixelCursor = rect.left; + let offset = 0; + let step; + if (x > rect.left + rect.width) { + offset = text2.length; + } else { + const charWidthReader = CharWidthReader.getInstance(); + for (let i = 0; i < text2.length + 1; i++) { + step = charWidthReader.getCharWidth(text2.charAt(i), font) / 2; + pixelCursor += step; + if (x < pixelCursor) { + offset = i; + break; + } + pixelCursor += step; + } + } + range2.setStart(el.firstChild, offset); + range2.setEnd(el.firstChild, offset); + } + return range2; +} +var UnknownHitTestResult, ContentHitTestResult, HitTestResult, PointerHandlerLastRenderData, MouseTarget, ElementPath, HitTestContext, BareHitTestRequest, HitTestRequest, EMPTY_CONTENT_AFTER_LINES, MouseTargetFactory, CharWidthReader; +var init_mouseTarget = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/controller/mouseTarget.js"() { + init_editorDom(); + init_viewPart(); + init_viewLine(); + init_position(); + init_range(); + init_cursorColumns(); + init_dom(); + init_cursorAtomicMoveOperations(); + init_lazy(); + UnknownHitTestResult = class { + constructor(hitTarget = null) { + this.hitTarget = hitTarget; + this.type = 0; + } + }; + ContentHitTestResult = class { + get hitTarget() { + return this.spanNode; + } + constructor(position, spanNode, injectedText) { + this.position = position; + this.spanNode = spanNode; + this.injectedText = injectedText; + this.type = 1; + } + }; + (function(HitTestResult2) { + function createFromDOMInfo(ctx, spanNode, offset) { + const position = ctx.getPositionFromDOMInfo(spanNode, offset); + if (position) { + return new ContentHitTestResult(position, spanNode, null); + } + return new UnknownHitTestResult(spanNode); + } + HitTestResult2.createFromDOMInfo = createFromDOMInfo; + })(HitTestResult || (HitTestResult = {})); + PointerHandlerLastRenderData = class { + constructor(lastViewCursorsRenderData, lastTextareaPosition) { + this.lastViewCursorsRenderData = lastViewCursorsRenderData; + this.lastTextareaPosition = lastTextareaPosition; + } + }; + MouseTarget = class { + static _deduceRage(position, range2 = null) { + if (!range2 && position) { + return new Range(position.lineNumber, position.column, position.lineNumber, position.column); + } + return range2 !== null && range2 !== void 0 ? range2 : null; + } + static createUnknown(element, mouseColumn, position) { + return { type: 0, element, mouseColumn, position, range: this._deduceRage(position) }; + } + static createTextarea(element, mouseColumn) { + return { type: 1, element, mouseColumn, position: null, range: null }; + } + static createMargin(type, element, mouseColumn, position, range2, detail) { + return { type, element, mouseColumn, position, range: range2, detail }; + } + static createViewZone(type, element, mouseColumn, position, detail) { + return { type, element, mouseColumn, position, range: this._deduceRage(position), detail }; + } + static createContentText(element, mouseColumn, position, range2, detail) { + return { type: 6, element, mouseColumn, position, range: this._deduceRage(position, range2), detail }; + } + static createContentEmpty(element, mouseColumn, position, detail) { + return { type: 7, element, mouseColumn, position, range: this._deduceRage(position), detail }; + } + static createContentWidget(element, mouseColumn, detail) { + return { type: 9, element, mouseColumn, position: null, range: null, detail }; + } + static createScrollbar(element, mouseColumn, position) { + return { type: 11, element, mouseColumn, position, range: this._deduceRage(position) }; + } + static createOverlayWidget(element, mouseColumn, detail) { + return { type: 12, element, mouseColumn, position: null, range: null, detail }; + } + static createOutsideEditor(mouseColumn, position, outsidePosition, outsideDistance) { + return { type: 13, element: null, mouseColumn, position, range: this._deduceRage(position), outsidePosition, outsideDistance }; + } + static _typeToString(type) { + if (type === 1) { + return "TEXTAREA"; + } + if (type === 2) { + return "GUTTER_GLYPH_MARGIN"; + } + if (type === 3) { + return "GUTTER_LINE_NUMBERS"; + } + if (type === 4) { + return "GUTTER_LINE_DECORATIONS"; + } + if (type === 5) { + return "GUTTER_VIEW_ZONE"; + } + if (type === 6) { + return "CONTENT_TEXT"; + } + if (type === 7) { + return "CONTENT_EMPTY"; + } + if (type === 8) { + return "CONTENT_VIEW_ZONE"; + } + if (type === 9) { + return "CONTENT_WIDGET"; + } + if (type === 10) { + return "OVERVIEW_RULER"; + } + if (type === 11) { + return "SCROLLBAR"; + } + if (type === 12) { + return "OVERLAY_WIDGET"; + } + return "UNKNOWN"; + } + static toString(target) { + return this._typeToString(target.type) + ": " + target.position + " - " + target.range + " - " + JSON.stringify(target.detail); + } + }; + ElementPath = class { + static isTextArea(path) { + return path.length === 2 && path[0] === 3 && path[1] === 7; + } + static isChildOfViewLines(path) { + return path.length >= 4 && path[0] === 3 && path[3] === 8; + } + static isStrictChildOfViewLines(path) { + return path.length > 4 && path[0] === 3 && path[3] === 8; + } + static isChildOfScrollableElement(path) { + return path.length >= 2 && path[0] === 3 && path[1] === 6; + } + static isChildOfMinimap(path) { + return path.length >= 2 && path[0] === 3 && path[1] === 9; + } + static isChildOfContentWidgets(path) { + return path.length >= 4 && path[0] === 3 && path[3] === 1; + } + static isChildOfOverflowGuard(path) { + return path.length >= 1 && path[0] === 3; + } + static isChildOfOverflowingContentWidgets(path) { + return path.length >= 1 && path[0] === 2; + } + static isChildOfOverlayWidgets(path) { + return path.length >= 2 && path[0] === 3 && path[1] === 4; + } + static isChildOfOverflowingOverlayWidgets(path) { + return path.length >= 1 && path[0] === 5; + } + }; + HitTestContext = class _HitTestContext { + constructor(context, viewHelper, lastRenderData) { + this.viewModel = context.viewModel; + const options2 = context.configuration.options; + this.layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this.viewDomNode = viewHelper.viewDomNode; + this.lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this.stickyTabStops = options2.get( + 116 + /* EditorOption.stickyTabStops */ + ); + this.typicalHalfwidthCharacterWidth = options2.get( + 50 + /* EditorOption.fontInfo */ + ).typicalHalfwidthCharacterWidth; + this.lastRenderData = lastRenderData; + this._context = context; + this._viewHelper = viewHelper; + } + getZoneAtCoord(mouseVerticalOffset) { + return _HitTestContext.getZoneAtCoord(this._context, mouseVerticalOffset); + } + static getZoneAtCoord(context, mouseVerticalOffset) { + const viewZoneWhitespace = context.viewLayout.getWhitespaceAtVerticalOffset(mouseVerticalOffset); + if (viewZoneWhitespace) { + const viewZoneMiddle = viewZoneWhitespace.verticalOffset + viewZoneWhitespace.height / 2; + const lineCount = context.viewModel.getLineCount(); + let positionBefore = null; + let position; + let positionAfter = null; + if (viewZoneWhitespace.afterLineNumber !== lineCount) { + positionAfter = new Position(viewZoneWhitespace.afterLineNumber + 1, 1); + } + if (viewZoneWhitespace.afterLineNumber > 0) { + positionBefore = new Position(viewZoneWhitespace.afterLineNumber, context.viewModel.getLineMaxColumn(viewZoneWhitespace.afterLineNumber)); + } + if (positionAfter === null) { + position = positionBefore; + } else if (positionBefore === null) { + position = positionAfter; + } else if (mouseVerticalOffset < viewZoneMiddle) { + position = positionBefore; + } else { + position = positionAfter; + } + return { + viewZoneId: viewZoneWhitespace.id, + afterLineNumber: viewZoneWhitespace.afterLineNumber, + positionBefore, + positionAfter, + position + }; + } + return null; + } + getFullLineRangeAtCoord(mouseVerticalOffset) { + if (this._context.viewLayout.isAfterLines(mouseVerticalOffset)) { + const lineNumber2 = this._context.viewModel.getLineCount(); + const maxLineColumn2 = this._context.viewModel.getLineMaxColumn(lineNumber2); + return { + range: new Range(lineNumber2, maxLineColumn2, lineNumber2, maxLineColumn2), + isAfterLines: true + }; + } + const lineNumber = this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset); + const maxLineColumn = this._context.viewModel.getLineMaxColumn(lineNumber); + return { + range: new Range(lineNumber, 1, lineNumber, maxLineColumn), + isAfterLines: false + }; + } + getLineNumberAtVerticalOffset(mouseVerticalOffset) { + return this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset); + } + isAfterLines(mouseVerticalOffset) { + return this._context.viewLayout.isAfterLines(mouseVerticalOffset); + } + isInTopPadding(mouseVerticalOffset) { + return this._context.viewLayout.isInTopPadding(mouseVerticalOffset); + } + isInBottomPadding(mouseVerticalOffset) { + return this._context.viewLayout.isInBottomPadding(mouseVerticalOffset); + } + getVerticalOffsetForLineNumber(lineNumber) { + return this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber); + } + findAttribute(element, attr) { + return _HitTestContext._findAttribute(element, attr, this._viewHelper.viewDomNode); + } + static _findAttribute(element, attr, stopAt) { + while (element && element !== element.ownerDocument.body) { + if (element.hasAttribute && element.hasAttribute(attr)) { + return element.getAttribute(attr); + } + if (element === stopAt) { + return null; + } + element = element.parentNode; + } + return null; + } + getLineWidth(lineNumber) { + return this._viewHelper.getLineWidth(lineNumber); + } + visibleRangeForPosition(lineNumber, column) { + return this._viewHelper.visibleRangeForPosition(lineNumber, column); + } + getPositionFromDOMInfo(spanNode, offset) { + return this._viewHelper.getPositionFromDOMInfo(spanNode, offset); + } + getCurrentScrollTop() { + return this._context.viewLayout.getCurrentScrollTop(); + } + getCurrentScrollLeft() { + return this._context.viewLayout.getCurrentScrollLeft(); + } + }; + BareHitTestRequest = class { + constructor(ctx, editorPos, pos, relativePos) { + this.editorPos = editorPos; + this.pos = pos; + this.relativePos = relativePos; + this.mouseVerticalOffset = Math.max(0, ctx.getCurrentScrollTop() + this.relativePos.y); + this.mouseContentHorizontalOffset = ctx.getCurrentScrollLeft() + this.relativePos.x - ctx.layoutInfo.contentLeft; + this.isInMarginArea = this.relativePos.x < ctx.layoutInfo.contentLeft && this.relativePos.x >= ctx.layoutInfo.glyphMarginLeft; + this.isInContentArea = !this.isInMarginArea; + this.mouseColumn = Math.max(0, MouseTargetFactory._getMouseColumn(this.mouseContentHorizontalOffset, ctx.typicalHalfwidthCharacterWidth)); + } + }; + HitTestRequest = class extends BareHitTestRequest { + get target() { + if (this._useHitTestTarget) { + return this.hitTestResult.value.hitTarget; + } + return this._eventTarget; + } + get targetPath() { + if (this._targetPathCacheElement !== this.target) { + this._targetPathCacheElement = this.target; + this._targetPathCacheValue = PartFingerprints.collect(this.target, this._ctx.viewDomNode); + } + return this._targetPathCacheValue; + } + constructor(ctx, editorPos, pos, relativePos, eventTarget) { + super(ctx, editorPos, pos, relativePos); + this.hitTestResult = new Lazy(() => MouseTargetFactory.doHitTest(this._ctx, this)); + this._targetPathCacheElement = null; + this._targetPathCacheValue = new Uint8Array(0); + this._ctx = ctx; + this._eventTarget = eventTarget; + const hasEventTarget = Boolean(this._eventTarget); + this._useHitTestTarget = !hasEventTarget; + } + toString() { + return `pos(${this.pos.x},${this.pos.y}), editorPos(${this.editorPos.x},${this.editorPos.y}), relativePos(${this.relativePos.x},${this.relativePos.y}), mouseVerticalOffset: ${this.mouseVerticalOffset}, mouseContentHorizontalOffset: ${this.mouseContentHorizontalOffset} + target: ${this.target ? this.target.outerHTML : null}`; + } + get wouldBenefitFromHitTestTargetSwitch() { + return !this._useHitTestTarget && this.hitTestResult.value.hitTarget !== null && this.target !== this.hitTestResult.value.hitTarget; + } + switchToHitTestTarget() { + this._useHitTestTarget = true; + } + _getMouseColumn(position = null) { + if (position && position.column < this._ctx.viewModel.getLineMaxColumn(position.lineNumber)) { + return CursorColumns.visibleColumnFromColumn(this._ctx.viewModel.getLineContent(position.lineNumber), position.column, this._ctx.viewModel.model.getOptions().tabSize) + 1; + } + return this.mouseColumn; + } + fulfillUnknown(position = null) { + return MouseTarget.createUnknown(this.target, this._getMouseColumn(position), position); + } + fulfillTextarea() { + return MouseTarget.createTextarea(this.target, this._getMouseColumn()); + } + fulfillMargin(type, position, range2, detail) { + return MouseTarget.createMargin(type, this.target, this._getMouseColumn(position), position, range2, detail); + } + fulfillViewZone(type, position, detail) { + return MouseTarget.createViewZone(type, this.target, this._getMouseColumn(position), position, detail); + } + fulfillContentText(position, range2, detail) { + return MouseTarget.createContentText(this.target, this._getMouseColumn(position), position, range2, detail); + } + fulfillContentEmpty(position, detail) { + return MouseTarget.createContentEmpty(this.target, this._getMouseColumn(position), position, detail); + } + fulfillContentWidget(detail) { + return MouseTarget.createContentWidget(this.target, this._getMouseColumn(), detail); + } + fulfillScrollbar(position) { + return MouseTarget.createScrollbar(this.target, this._getMouseColumn(position), position); + } + fulfillOverlayWidget(detail) { + return MouseTarget.createOverlayWidget(this.target, this._getMouseColumn(), detail); + } + }; + EMPTY_CONTENT_AFTER_LINES = { isAfterLines: true }; + MouseTargetFactory = class _MouseTargetFactory { + constructor(context, viewHelper) { + this._context = context; + this._viewHelper = viewHelper; + } + mouseTargetIsWidget(e) { + const t4 = e.target; + const path = PartFingerprints.collect(t4, this._viewHelper.viewDomNode); + if (ElementPath.isChildOfContentWidgets(path) || ElementPath.isChildOfOverflowingContentWidgets(path)) { + return true; + } + if (ElementPath.isChildOfOverlayWidgets(path) || ElementPath.isChildOfOverflowingOverlayWidgets(path)) { + return true; + } + return false; + } + createMouseTarget(lastRenderData, editorPos, pos, relativePos, target) { + const ctx = new HitTestContext(this._context, this._viewHelper, lastRenderData); + const request = new HitTestRequest(ctx, editorPos, pos, relativePos, target); + try { + const r = _MouseTargetFactory._createMouseTarget(ctx, request); + if (r.type === 6) { + if (ctx.stickyTabStops && r.position !== null) { + const position = _MouseTargetFactory._snapToSoftTabBoundary(r.position, ctx.viewModel); + const range2 = Range.fromPositions(position, position).plusRange(r.range); + return request.fulfillContentText(position, range2, r.detail); + } + } + return r; + } catch (err) { + return request.fulfillUnknown(); + } + } + static _createMouseTarget(ctx, request) { + if (request.target === null) { + return request.fulfillUnknown(); + } + const resolvedRequest = request; + let result = null; + if (!ElementPath.isChildOfOverflowGuard(request.targetPath) && !ElementPath.isChildOfOverflowingContentWidgets(request.targetPath) && !ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath)) { + result = result || request.fulfillUnknown(); + } + result = result || _MouseTargetFactory._hitTestContentWidget(ctx, resolvedRequest); + result = result || _MouseTargetFactory._hitTestOverlayWidget(ctx, resolvedRequest); + result = result || _MouseTargetFactory._hitTestMinimap(ctx, resolvedRequest); + result = result || _MouseTargetFactory._hitTestScrollbarSlider(ctx, resolvedRequest); + result = result || _MouseTargetFactory._hitTestViewZone(ctx, resolvedRequest); + result = result || _MouseTargetFactory._hitTestMargin(ctx, resolvedRequest); + result = result || _MouseTargetFactory._hitTestViewCursor(ctx, resolvedRequest); + result = result || _MouseTargetFactory._hitTestTextArea(ctx, resolvedRequest); + result = result || _MouseTargetFactory._hitTestViewLines(ctx, resolvedRequest); + result = result || _MouseTargetFactory._hitTestScrollbar(ctx, resolvedRequest); + return result || request.fulfillUnknown(); + } + static _hitTestContentWidget(ctx, request) { + if (ElementPath.isChildOfContentWidgets(request.targetPath) || ElementPath.isChildOfOverflowingContentWidgets(request.targetPath)) { + const widgetId = ctx.findAttribute(request.target, "widgetId"); + if (widgetId) { + return request.fulfillContentWidget(widgetId); + } else { + return request.fulfillUnknown(); + } + } + return null; + } + static _hitTestOverlayWidget(ctx, request) { + if (ElementPath.isChildOfOverlayWidgets(request.targetPath) || ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath)) { + const widgetId = ctx.findAttribute(request.target, "widgetId"); + if (widgetId) { + return request.fulfillOverlayWidget(widgetId); + } else { + return request.fulfillUnknown(); + } + } + return null; + } + static _hitTestViewCursor(ctx, request) { + if (request.target) { + const lastViewCursorsRenderData = ctx.lastRenderData.lastViewCursorsRenderData; + for (const d of lastViewCursorsRenderData) { + if (request.target === d.domNode) { + return request.fulfillContentText(d.position, null, { mightBeForeignElement: false, injectedText: null }); + } + } + } + if (request.isInContentArea) { + const lastViewCursorsRenderData = ctx.lastRenderData.lastViewCursorsRenderData; + const mouseContentHorizontalOffset = request.mouseContentHorizontalOffset; + const mouseVerticalOffset = request.mouseVerticalOffset; + for (const d of lastViewCursorsRenderData) { + if (mouseContentHorizontalOffset < d.contentLeft) { + continue; + } + if (mouseContentHorizontalOffset > d.contentLeft + d.width) { + continue; + } + const cursorVerticalOffset = ctx.getVerticalOffsetForLineNumber(d.position.lineNumber); + if (cursorVerticalOffset <= mouseVerticalOffset && mouseVerticalOffset <= cursorVerticalOffset + d.height) { + return request.fulfillContentText(d.position, null, { mightBeForeignElement: false, injectedText: null }); + } + } + } + return null; + } + static _hitTestViewZone(ctx, request) { + const viewZoneData = ctx.getZoneAtCoord(request.mouseVerticalOffset); + if (viewZoneData) { + const mouseTargetType = request.isInContentArea ? 8 : 5; + return request.fulfillViewZone(mouseTargetType, viewZoneData.position, viewZoneData); + } + return null; + } + static _hitTestTextArea(ctx, request) { + if (ElementPath.isTextArea(request.targetPath)) { + if (ctx.lastRenderData.lastTextareaPosition) { + return request.fulfillContentText(ctx.lastRenderData.lastTextareaPosition, null, { mightBeForeignElement: false, injectedText: null }); + } + return request.fulfillTextarea(); + } + return null; + } + static _hitTestMargin(ctx, request) { + if (request.isInMarginArea) { + const res = ctx.getFullLineRangeAtCoord(request.mouseVerticalOffset); + const pos = res.range.getStartPosition(); + let offset = Math.abs(request.relativePos.x); + const detail = { + isAfterLines: res.isAfterLines, + glyphMarginLeft: ctx.layoutInfo.glyphMarginLeft, + glyphMarginWidth: ctx.layoutInfo.glyphMarginWidth, + lineNumbersWidth: ctx.layoutInfo.lineNumbersWidth, + offsetX: offset + }; + offset -= ctx.layoutInfo.glyphMarginLeft; + if (offset <= ctx.layoutInfo.glyphMarginWidth) { + const modelCoordinate = ctx.viewModel.coordinatesConverter.convertViewPositionToModelPosition(res.range.getStartPosition()); + const lanes = ctx.viewModel.glyphLanes.getLanesAtLine(modelCoordinate.lineNumber); + detail.glyphMarginLane = lanes[Math.floor(offset / ctx.lineHeight)]; + return request.fulfillMargin(2, pos, res.range, detail); + } + offset -= ctx.layoutInfo.glyphMarginWidth; + if (offset <= ctx.layoutInfo.lineNumbersWidth) { + return request.fulfillMargin(3, pos, res.range, detail); + } + offset -= ctx.layoutInfo.lineNumbersWidth; + return request.fulfillMargin(4, pos, res.range, detail); + } + return null; + } + static _hitTestViewLines(ctx, request) { + if (!ElementPath.isChildOfViewLines(request.targetPath)) { + return null; + } + if (ctx.isInTopPadding(request.mouseVerticalOffset)) { + return request.fulfillContentEmpty(new Position(1, 1), EMPTY_CONTENT_AFTER_LINES); + } + if (ctx.isAfterLines(request.mouseVerticalOffset) || ctx.isInBottomPadding(request.mouseVerticalOffset)) { + const lineCount = ctx.viewModel.getLineCount(); + const maxLineColumn = ctx.viewModel.getLineMaxColumn(lineCount); + return request.fulfillContentEmpty(new Position(lineCount, maxLineColumn), EMPTY_CONTENT_AFTER_LINES); + } + if (ElementPath.isStrictChildOfViewLines(request.targetPath)) { + const lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset); + if (ctx.viewModel.getLineLength(lineNumber) === 0) { + const lineWidth2 = ctx.getLineWidth(lineNumber); + const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth2); + return request.fulfillContentEmpty(new Position(lineNumber, 1), detail); + } + const lineWidth = ctx.getLineWidth(lineNumber); + if (request.mouseContentHorizontalOffset >= lineWidth) { + const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth); + const pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber)); + return request.fulfillContentEmpty(pos, detail); + } + } + const hitTestResult = request.hitTestResult.value; + if (hitTestResult.type === 1) { + return _MouseTargetFactory.createMouseTargetFromHitTestPosition(ctx, request, hitTestResult.spanNode, hitTestResult.position, hitTestResult.injectedText); + } + if (request.wouldBenefitFromHitTestTargetSwitch) { + request.switchToHitTestTarget(); + return this._createMouseTarget(ctx, request); + } + return request.fulfillUnknown(); + } + static _hitTestMinimap(ctx, request) { + if (ElementPath.isChildOfMinimap(request.targetPath)) { + const possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset); + const maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber); + return request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn)); + } + return null; + } + static _hitTestScrollbarSlider(ctx, request) { + if (ElementPath.isChildOfScrollableElement(request.targetPath)) { + if (request.target && request.target.nodeType === 1) { + const className = request.target.className; + if (className && /\b(slider|scrollbar)\b/.test(className)) { + const possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset); + const maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber); + return request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn)); + } + } + } + return null; + } + static _hitTestScrollbar(ctx, request) { + if (ElementPath.isChildOfScrollableElement(request.targetPath)) { + const possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset); + const maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber); + return request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn)); + } + return null; + } + getMouseColumn(relativePos) { + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + const mouseContentHorizontalOffset = this._context.viewLayout.getCurrentScrollLeft() + relativePos.x - layoutInfo.contentLeft; + return _MouseTargetFactory._getMouseColumn(mouseContentHorizontalOffset, options2.get( + 50 + /* EditorOption.fontInfo */ + ).typicalHalfwidthCharacterWidth); + } + static _getMouseColumn(mouseContentHorizontalOffset, typicalHalfwidthCharacterWidth) { + if (mouseContentHorizontalOffset < 0) { + return 1; + } + const chars = Math.round(mouseContentHorizontalOffset / typicalHalfwidthCharacterWidth); + return chars + 1; + } + static createMouseTargetFromHitTestPosition(ctx, request, spanNode, pos, injectedText) { + const lineNumber = pos.lineNumber; + const column = pos.column; + const lineWidth = ctx.getLineWidth(lineNumber); + if (request.mouseContentHorizontalOffset > lineWidth) { + const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth); + return request.fulfillContentEmpty(pos, detail); + } + const visibleRange = ctx.visibleRangeForPosition(lineNumber, column); + if (!visibleRange) { + return request.fulfillUnknown(pos); + } + const columnHorizontalOffset = visibleRange.left; + if (Math.abs(request.mouseContentHorizontalOffset - columnHorizontalOffset) < 1) { + return request.fulfillContentText(pos, null, { mightBeForeignElement: !!injectedText, injectedText }); + } + const points = []; + points.push({ offset: visibleRange.left, column }); + if (column > 1) { + const visibleRange2 = ctx.visibleRangeForPosition(lineNumber, column - 1); + if (visibleRange2) { + points.push({ offset: visibleRange2.left, column: column - 1 }); + } + } + const lineMaxColumn = ctx.viewModel.getLineMaxColumn(lineNumber); + if (column < lineMaxColumn) { + const visibleRange2 = ctx.visibleRangeForPosition(lineNumber, column + 1); + if (visibleRange2) { + points.push({ offset: visibleRange2.left, column: column + 1 }); + } + } + points.sort((a3, b) => a3.offset - b.offset); + const mouseCoordinates = request.pos.toClientCoordinates(getWindow(ctx.viewDomNode)); + const spanNodeClientRect = spanNode.getBoundingClientRect(); + const mouseIsOverSpanNode = spanNodeClientRect.left <= mouseCoordinates.clientX && mouseCoordinates.clientX <= spanNodeClientRect.right; + let rng = null; + for (let i = 1; i < points.length; i++) { + const prev = points[i - 1]; + const curr = points[i]; + if (prev.offset <= request.mouseContentHorizontalOffset && request.mouseContentHorizontalOffset <= curr.offset) { + rng = new Range(lineNumber, prev.column, lineNumber, curr.column); + const prevDelta = Math.abs(prev.offset - request.mouseContentHorizontalOffset); + const nextDelta = Math.abs(curr.offset - request.mouseContentHorizontalOffset); + pos = prevDelta < nextDelta ? new Position(lineNumber, prev.column) : new Position(lineNumber, curr.column); + break; + } + } + return request.fulfillContentText(pos, rng, { mightBeForeignElement: !mouseIsOverSpanNode || !!injectedText, injectedText }); + } + /** + * Most probably WebKit browsers and Edge + */ + static _doHitTestWithCaretRangeFromPoint(ctx, request) { + const lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset); + const lineStartVerticalOffset = ctx.getVerticalOffsetForLineNumber(lineNumber); + const lineEndVerticalOffset = lineStartVerticalOffset + ctx.lineHeight; + const isBelowLastLine = lineNumber === ctx.viewModel.getLineCount() && request.mouseVerticalOffset > lineEndVerticalOffset; + if (!isBelowLastLine) { + const lineCenteredVerticalOffset = Math.floor((lineStartVerticalOffset + lineEndVerticalOffset) / 2); + let adjustedPageY = request.pos.y + (lineCenteredVerticalOffset - request.mouseVerticalOffset); + if (adjustedPageY <= request.editorPos.y) { + adjustedPageY = request.editorPos.y + 1; + } + if (adjustedPageY >= request.editorPos.y + request.editorPos.height) { + adjustedPageY = request.editorPos.y + request.editorPos.height - 1; + } + const adjustedPage = new PageCoordinates(request.pos.x, adjustedPageY); + const r = this._actualDoHitTestWithCaretRangeFromPoint(ctx, adjustedPage.toClientCoordinates(getWindow(ctx.viewDomNode))); + if (r.type === 1) { + return r; + } + } + return this._actualDoHitTestWithCaretRangeFromPoint(ctx, request.pos.toClientCoordinates(getWindow(ctx.viewDomNode))); + } + static _actualDoHitTestWithCaretRangeFromPoint(ctx, coords) { + const shadowRoot = getShadowRoot(ctx.viewDomNode); + let range2; + if (shadowRoot) { + if (typeof shadowRoot.caretRangeFromPoint === "undefined") { + range2 = shadowCaretRangeFromPoint(shadowRoot, coords.clientX, coords.clientY); + } else { + range2 = shadowRoot.caretRangeFromPoint(coords.clientX, coords.clientY); + } + } else { + range2 = ctx.viewDomNode.ownerDocument.caretRangeFromPoint(coords.clientX, coords.clientY); + } + if (!range2 || !range2.startContainer) { + return new UnknownHitTestResult(); + } + const startContainer = range2.startContainer; + if (startContainer.nodeType === startContainer.TEXT_NODE) { + const parent1 = startContainer.parentNode; + const parent2 = parent1 ? parent1.parentNode : null; + const parent3 = parent2 ? parent2.parentNode : null; + const parent3ClassName = parent3 && parent3.nodeType === parent3.ELEMENT_NODE ? parent3.className : null; + if (parent3ClassName === ViewLine.CLASS_NAME) { + return HitTestResult.createFromDOMInfo(ctx, parent1, range2.startOffset); + } else { + return new UnknownHitTestResult(startContainer.parentNode); + } + } else if (startContainer.nodeType === startContainer.ELEMENT_NODE) { + const parent1 = startContainer.parentNode; + const parent2 = parent1 ? parent1.parentNode : null; + const parent2ClassName = parent2 && parent2.nodeType === parent2.ELEMENT_NODE ? parent2.className : null; + if (parent2ClassName === ViewLine.CLASS_NAME) { + return HitTestResult.createFromDOMInfo(ctx, startContainer, startContainer.textContent.length); + } else { + return new UnknownHitTestResult(startContainer); + } + } + return new UnknownHitTestResult(); + } + /** + * Most probably Gecko + */ + static _doHitTestWithCaretPositionFromPoint(ctx, coords) { + const hitResult = ctx.viewDomNode.ownerDocument.caretPositionFromPoint(coords.clientX, coords.clientY); + if (hitResult.offsetNode.nodeType === hitResult.offsetNode.TEXT_NODE) { + const parent1 = hitResult.offsetNode.parentNode; + const parent2 = parent1 ? parent1.parentNode : null; + const parent3 = parent2 ? parent2.parentNode : null; + const parent3ClassName = parent3 && parent3.nodeType === parent3.ELEMENT_NODE ? parent3.className : null; + if (parent3ClassName === ViewLine.CLASS_NAME) { + return HitTestResult.createFromDOMInfo(ctx, hitResult.offsetNode.parentNode, hitResult.offset); + } else { + return new UnknownHitTestResult(hitResult.offsetNode.parentNode); + } + } + if (hitResult.offsetNode.nodeType === hitResult.offsetNode.ELEMENT_NODE) { + const parent1 = hitResult.offsetNode.parentNode; + const parent1ClassName = parent1 && parent1.nodeType === parent1.ELEMENT_NODE ? parent1.className : null; + const parent2 = parent1 ? parent1.parentNode : null; + const parent2ClassName = parent2 && parent2.nodeType === parent2.ELEMENT_NODE ? parent2.className : null; + if (parent1ClassName === ViewLine.CLASS_NAME) { + const tokenSpan = hitResult.offsetNode.childNodes[Math.min(hitResult.offset, hitResult.offsetNode.childNodes.length - 1)]; + if (tokenSpan) { + return HitTestResult.createFromDOMInfo(ctx, tokenSpan, 0); + } + } else if (parent2ClassName === ViewLine.CLASS_NAME) { + return HitTestResult.createFromDOMInfo(ctx, hitResult.offsetNode, 0); + } + } + return new UnknownHitTestResult(hitResult.offsetNode); + } + static _snapToSoftTabBoundary(position, viewModel) { + const lineContent = viewModel.getLineContent(position.lineNumber); + const { tabSize } = viewModel.model.getOptions(); + const newPosition = AtomicTabMoveOperations.atomicPosition( + lineContent, + position.column - 1, + tabSize, + 2 + /* Direction.Nearest */ + ); + if (newPosition !== -1) { + return new Position(position.lineNumber, newPosition + 1); + } + return position; + } + static doHitTest(ctx, request) { + let result = new UnknownHitTestResult(); + if (typeof ctx.viewDomNode.ownerDocument.caretRangeFromPoint === "function") { + result = this._doHitTestWithCaretRangeFromPoint(ctx, request); + } else if (ctx.viewDomNode.ownerDocument.caretPositionFromPoint) { + result = this._doHitTestWithCaretPositionFromPoint(ctx, request.pos.toClientCoordinates(getWindow(ctx.viewDomNode))); + } + if (result.type === 1) { + const injectedText = ctx.viewModel.getInjectedTextAt(result.position); + const normalizedPosition = ctx.viewModel.normalizePosition( + result.position, + 2 + /* PositionAffinity.None */ + ); + if (injectedText || !normalizedPosition.equals(result.position)) { + result = new ContentHitTestResult(normalizedPosition, result.spanNode, injectedText); + } + } + return result; + } + }; + CharWidthReader = class _CharWidthReader { + static getInstance() { + if (!_CharWidthReader._INSTANCE) { + _CharWidthReader._INSTANCE = new _CharWidthReader(); + } + return _CharWidthReader._INSTANCE; + } + constructor() { + this._cache = {}; + this._canvas = document.createElement("canvas"); + } + getCharWidth(char, font) { + const cacheKey = char + font; + if (this._cache[cacheKey]) { + return this._cache[cacheKey]; + } + const context = this._canvas.getContext("2d"); + context.font = font; + const metrics = context.measureText(char); + const width2 = metrics.width; + this._cache[cacheKey] = width2; + return width2; + } + }; + CharWidthReader._INSTANCE = null; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/decorators.js +function memoize(_target, key, descriptor) { + let fnKey = null; + let fn = null; + if (typeof descriptor.value === "function") { + fnKey = "value"; + fn = descriptor.value; + if (fn.length !== 0) { + console.warn("Memoize should only be used in functions with zero parameters"); + } + } else if (typeof descriptor.get === "function") { + fnKey = "get"; + fn = descriptor.get; + } + if (!fn) { + throw new Error("not supported"); + } + const memoizeKey = `$memoize$${key}`; + descriptor[fnKey] = function(...args) { + if (!this.hasOwnProperty(memoizeKey)) { + Object.defineProperty(this, memoizeKey, { + configurable: false, + enumerable: false, + writable: false, + value: fn.apply(this, args) + }); + } + return this[memoizeKey]; + }; +} +var init_decorators = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/decorators.js"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/touch.js +var __decorate7, EventType2, Gesture; +var init_touch = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/touch.js"() { + init_dom(); + init_window(); + init_arrays(); + init_decorators(); + init_event(); + init_lifecycle(); + init_linkedList(); + __decorate7 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + (function(EventType3) { + EventType3.Tap = "-monaco-gesturetap"; + EventType3.Change = "-monaco-gesturechange"; + EventType3.Start = "-monaco-gesturestart"; + EventType3.End = "-monaco-gesturesend"; + EventType3.Contextmenu = "-monaco-gesturecontextmenu"; + })(EventType2 || (EventType2 = {})); + Gesture = class _Gesture extends Disposable { + constructor() { + super(); + this.dispatched = false; + this.targets = new LinkedList(); + this.ignoreTargets = new LinkedList(); + this.activeTouches = {}; + this.handle = null; + this._lastSetTapCountTime = 0; + this._register(Event.runAndSubscribe(onDidRegisterWindow, ({ window: window2, disposables }) => { + disposables.add(addDisposableListener(window2.document, "touchstart", (e) => this.onTouchStart(e), { passive: false })); + disposables.add(addDisposableListener(window2.document, "touchend", (e) => this.onTouchEnd(window2, e))); + disposables.add(addDisposableListener(window2.document, "touchmove", (e) => this.onTouchMove(e), { passive: false })); + }, { window: mainWindow, disposables: this._store })); + } + static addTarget(element) { + if (!_Gesture.isTouchDevice()) { + return Disposable.None; + } + if (!_Gesture.INSTANCE) { + _Gesture.INSTANCE = markAsSingleton(new _Gesture()); + } + const remove = _Gesture.INSTANCE.targets.push(element); + return toDisposable(remove); + } + static ignoreTarget(element) { + if (!_Gesture.isTouchDevice()) { + return Disposable.None; + } + if (!_Gesture.INSTANCE) { + _Gesture.INSTANCE = markAsSingleton(new _Gesture()); + } + const remove = _Gesture.INSTANCE.ignoreTargets.push(element); + return toDisposable(remove); + } + static isTouchDevice() { + return "ontouchstart" in mainWindow || navigator.maxTouchPoints > 0; + } + dispose() { + if (this.handle) { + this.handle.dispose(); + this.handle = null; + } + super.dispose(); + } + onTouchStart(e) { + const timestamp = Date.now(); + if (this.handle) { + this.handle.dispose(); + this.handle = null; + } + for (let i = 0, len = e.targetTouches.length; i < len; i++) { + const touch = e.targetTouches.item(i); + this.activeTouches[touch.identifier] = { + id: touch.identifier, + initialTarget: touch.target, + initialTimeStamp: timestamp, + initialPageX: touch.pageX, + initialPageY: touch.pageY, + rollingTimestamps: [timestamp], + rollingPageX: [touch.pageX], + rollingPageY: [touch.pageY] + }; + const evt = this.newGestureEvent(EventType2.Start, touch.target); + evt.pageX = touch.pageX; + evt.pageY = touch.pageY; + this.dispatchEvent(evt); + } + if (this.dispatched) { + e.preventDefault(); + e.stopPropagation(); + this.dispatched = false; + } + } + onTouchEnd(targetWindow, e) { + const timestamp = Date.now(); + const activeTouchCount = Object.keys(this.activeTouches).length; + for (let i = 0, len = e.changedTouches.length; i < len; i++) { + const touch = e.changedTouches.item(i); + if (!this.activeTouches.hasOwnProperty(String(touch.identifier))) { + console.warn("move of an UNKNOWN touch", touch); + continue; + } + const data = this.activeTouches[touch.identifier], holdTime = Date.now() - data.initialTimeStamp; + if (holdTime < _Gesture.HOLD_DELAY && Math.abs(data.initialPageX - tail(data.rollingPageX)) < 30 && Math.abs(data.initialPageY - tail(data.rollingPageY)) < 30) { + const evt = this.newGestureEvent(EventType2.Tap, data.initialTarget); + evt.pageX = tail(data.rollingPageX); + evt.pageY = tail(data.rollingPageY); + this.dispatchEvent(evt); + } else if (holdTime >= _Gesture.HOLD_DELAY && Math.abs(data.initialPageX - tail(data.rollingPageX)) < 30 && Math.abs(data.initialPageY - tail(data.rollingPageY)) < 30) { + const evt = this.newGestureEvent(EventType2.Contextmenu, data.initialTarget); + evt.pageX = tail(data.rollingPageX); + evt.pageY = tail(data.rollingPageY); + this.dispatchEvent(evt); + } else if (activeTouchCount === 1) { + const finalX = tail(data.rollingPageX); + const finalY = tail(data.rollingPageY); + const deltaT = tail(data.rollingTimestamps) - data.rollingTimestamps[0]; + const deltaX = finalX - data.rollingPageX[0]; + const deltaY = finalY - data.rollingPageY[0]; + const dispatchTo = [...this.targets].filter((t4) => data.initialTarget instanceof Node && t4.contains(data.initialTarget)); + this.inertia( + targetWindow, + dispatchTo, + timestamp, + // time now + Math.abs(deltaX) / deltaT, + // speed + deltaX > 0 ? 1 : -1, + // x direction + finalX, + // x now + Math.abs(deltaY) / deltaT, + // y speed + deltaY > 0 ? 1 : -1, + // y direction + finalY + // y now + ); + } + this.dispatchEvent(this.newGestureEvent(EventType2.End, data.initialTarget)); + delete this.activeTouches[touch.identifier]; + } + if (this.dispatched) { + e.preventDefault(); + e.stopPropagation(); + this.dispatched = false; + } + } + newGestureEvent(type, initialTarget) { + const event = document.createEvent("CustomEvent"); + event.initEvent(type, false, true); + event.initialTarget = initialTarget; + event.tapCount = 0; + return event; + } + dispatchEvent(event) { + if (event.type === EventType2.Tap) { + const currentTime = (/* @__PURE__ */ new Date()).getTime(); + let setTapCount = 0; + if (currentTime - this._lastSetTapCountTime > _Gesture.CLEAR_TAP_COUNT_TIME) { + setTapCount = 1; + } else { + setTapCount = 2; + } + this._lastSetTapCountTime = currentTime; + event.tapCount = setTapCount; + } else if (event.type === EventType2.Change || event.type === EventType2.Contextmenu) { + this._lastSetTapCountTime = 0; + } + if (event.initialTarget instanceof Node) { + for (const ignoreTarget of this.ignoreTargets) { + if (ignoreTarget.contains(event.initialTarget)) { + return; + } + } + const targets = []; + for (const target of this.targets) { + if (target.contains(event.initialTarget)) { + let depth = 0; + let now = event.initialTarget; + while (now && now !== target) { + depth++; + now = now.parentElement; + } + targets.push([depth, target]); + } + } + targets.sort((a3, b) => a3[0] - b[0]); + for (const [_, target] of targets) { + target.dispatchEvent(event); + this.dispatched = true; + } + } + } + inertia(targetWindow, dispatchTo, t1, vX, dirX, x, vY, dirY, y) { + this.handle = scheduleAtNextAnimationFrame(targetWindow, () => { + const now = Date.now(); + const deltaT = now - t1; + let delta_pos_x = 0, delta_pos_y = 0; + let stopped = true; + vX += _Gesture.SCROLL_FRICTION * deltaT; + vY += _Gesture.SCROLL_FRICTION * deltaT; + if (vX > 0) { + stopped = false; + delta_pos_x = dirX * vX * deltaT; + } + if (vY > 0) { + stopped = false; + delta_pos_y = dirY * vY * deltaT; + } + const evt = this.newGestureEvent(EventType2.Change); + evt.translationX = delta_pos_x; + evt.translationY = delta_pos_y; + dispatchTo.forEach((d) => d.dispatchEvent(evt)); + if (!stopped) { + this.inertia(targetWindow, dispatchTo, now, vX, dirX, x + delta_pos_x, vY, dirY, y + delta_pos_y); + } + }); + } + onTouchMove(e) { + const timestamp = Date.now(); + for (let i = 0, len = e.changedTouches.length; i < len; i++) { + const touch = e.changedTouches.item(i); + if (!this.activeTouches.hasOwnProperty(String(touch.identifier))) { + console.warn("end of an UNKNOWN touch", touch); + continue; + } + const data = this.activeTouches[touch.identifier]; + const evt = this.newGestureEvent(EventType2.Change, data.initialTarget); + evt.translationX = touch.pageX - tail(data.rollingPageX); + evt.translationY = touch.pageY - tail(data.rollingPageY); + evt.pageX = touch.pageX; + evt.pageY = touch.pageY; + this.dispatchEvent(evt); + if (data.rollingPageX.length > 3) { + data.rollingPageX.shift(); + data.rollingPageY.shift(); + data.rollingTimestamps.shift(); + } + data.rollingPageX.push(touch.pageX); + data.rollingPageY.push(touch.pageY); + data.rollingTimestamps.push(timestamp); + } + if (this.dispatched) { + e.preventDefault(); + e.stopPropagation(); + this.dispatched = false; + } + } + }; + Gesture.SCROLL_FRICTION = -5e-3; + Gesture.HOLD_DELAY = 700; + Gesture.CLEAR_TAP_COUNT_TIME = 400; + __decorate7([ + memoize + ], Gesture, "isTouchDevice", null); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/widget.js +var Widget; +var init_widget = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/widget.js"() { + init_dom(); + init_keyboardEvent(); + init_mouseEvent(); + init_touch(); + init_lifecycle(); + Widget = class extends Disposable { + onclick(domNode, listener) { + this._register(addDisposableListener(domNode, EventType.CLICK, (e) => listener(new StandardMouseEvent(getWindow(domNode), e)))); + } + onmousedown(domNode, listener) { + this._register(addDisposableListener(domNode, EventType.MOUSE_DOWN, (e) => listener(new StandardMouseEvent(getWindow(domNode), e)))); + } + onmouseover(domNode, listener) { + this._register(addDisposableListener(domNode, EventType.MOUSE_OVER, (e) => listener(new StandardMouseEvent(getWindow(domNode), e)))); + } + onmouseleave(domNode, listener) { + this._register(addDisposableListener(domNode, EventType.MOUSE_LEAVE, (e) => listener(new StandardMouseEvent(getWindow(domNode), e)))); + } + onkeydown(domNode, listener) { + this._register(addDisposableListener(domNode, EventType.KEY_DOWN, (e) => listener(new StandardKeyboardEvent(e)))); + } + onkeyup(domNode, listener) { + this._register(addDisposableListener(domNode, EventType.KEY_UP, (e) => listener(new StandardKeyboardEvent(e)))); + } + oninput(domNode, listener) { + this._register(addDisposableListener(domNode, EventType.INPUT, listener)); + } + onblur(domNode, listener) { + this._register(addDisposableListener(domNode, EventType.BLUR, listener)); + } + onfocus(domNode, listener) { + this._register(addDisposableListener(domNode, EventType.FOCUS, listener)); + } + ignoreGesture(domNode) { + return Gesture.ignoreTarget(domNode); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/scrollbarArrow.js +var ARROW_IMG_SIZE, ScrollbarArrow; +var init_scrollbarArrow = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/scrollbarArrow.js"() { + init_globalPointerMoveMonitor(); + init_widget(); + init_async(); + init_themables(); + init_dom(); + ARROW_IMG_SIZE = 11; + ScrollbarArrow = class extends Widget { + constructor(opts) { + super(); + this._onActivate = opts.onActivate; + this.bgDomNode = document.createElement("div"); + this.bgDomNode.className = "arrow-background"; + this.bgDomNode.style.position = "absolute"; + this.bgDomNode.style.width = opts.bgWidth + "px"; + this.bgDomNode.style.height = opts.bgHeight + "px"; + if (typeof opts.top !== "undefined") { + this.bgDomNode.style.top = "0px"; + } + if (typeof opts.left !== "undefined") { + this.bgDomNode.style.left = "0px"; + } + if (typeof opts.bottom !== "undefined") { + this.bgDomNode.style.bottom = "0px"; + } + if (typeof opts.right !== "undefined") { + this.bgDomNode.style.right = "0px"; + } + this.domNode = document.createElement("div"); + this.domNode.className = opts.className; + this.domNode.classList.add(...ThemeIcon.asClassNameArray(opts.icon)); + this.domNode.style.position = "absolute"; + this.domNode.style.width = ARROW_IMG_SIZE + "px"; + this.domNode.style.height = ARROW_IMG_SIZE + "px"; + if (typeof opts.top !== "undefined") { + this.domNode.style.top = opts.top + "px"; + } + if (typeof opts.left !== "undefined") { + this.domNode.style.left = opts.left + "px"; + } + if (typeof opts.bottom !== "undefined") { + this.domNode.style.bottom = opts.bottom + "px"; + } + if (typeof opts.right !== "undefined") { + this.domNode.style.right = opts.right + "px"; + } + this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor()); + this._register(addStandardDisposableListener(this.bgDomNode, EventType.POINTER_DOWN, (e) => this._arrowPointerDown(e))); + this._register(addStandardDisposableListener(this.domNode, EventType.POINTER_DOWN, (e) => this._arrowPointerDown(e))); + this._pointerdownRepeatTimer = this._register(new WindowIntervalTimer()); + this._pointerdownScheduleRepeatTimer = this._register(new TimeoutTimer()); + } + _arrowPointerDown(e) { + if (!e.target || !(e.target instanceof Element)) { + return; + } + const scheduleRepeater = () => { + this._pointerdownRepeatTimer.cancelAndSet(() => this._onActivate(), 1e3 / 24, getWindow(e)); + }; + this._onActivate(); + this._pointerdownRepeatTimer.cancel(); + this._pointerdownScheduleRepeatTimer.cancelAndSet(scheduleRepeater, 200); + this._pointerMoveMonitor.startMonitoring(e.target, e.pointerId, e.buttons, (pointerMoveData) => { + }, () => { + this._pointerdownRepeatTimer.cancel(); + this._pointerdownScheduleRepeatTimer.cancel(); + }); + e.preventDefault(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.js +var ScrollbarVisibilityController; +var init_scrollbarVisibilityController = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.js"() { + init_async(); + init_lifecycle(); + ScrollbarVisibilityController = class extends Disposable { + constructor(visibility, visibleClassName, invisibleClassName) { + super(); + this._visibility = visibility; + this._visibleClassName = visibleClassName; + this._invisibleClassName = invisibleClassName; + this._domNode = null; + this._isVisible = false; + this._isNeeded = false; + this._rawShouldBeVisible = false; + this._shouldBeVisible = false; + this._revealTimer = this._register(new TimeoutTimer()); + } + setVisibility(visibility) { + if (this._visibility !== visibility) { + this._visibility = visibility; + this._updateShouldBeVisible(); + } + } + // ----------------- Hide / Reveal + setShouldBeVisible(rawShouldBeVisible) { + this._rawShouldBeVisible = rawShouldBeVisible; + this._updateShouldBeVisible(); + } + _applyVisibilitySetting() { + if (this._visibility === 2) { + return false; + } + if (this._visibility === 3) { + return true; + } + return this._rawShouldBeVisible; + } + _updateShouldBeVisible() { + const shouldBeVisible = this._applyVisibilitySetting(); + if (this._shouldBeVisible !== shouldBeVisible) { + this._shouldBeVisible = shouldBeVisible; + this.ensureVisibility(); + } + } + setIsNeeded(isNeeded) { + if (this._isNeeded !== isNeeded) { + this._isNeeded = isNeeded; + this.ensureVisibility(); + } + } + setDomNode(domNode) { + this._domNode = domNode; + this._domNode.setClassName(this._invisibleClassName); + this.setShouldBeVisible(false); + } + ensureVisibility() { + if (!this._isNeeded) { + this._hide(false); + return; + } + if (this._shouldBeVisible) { + this._reveal(); + } else { + this._hide(true); + } + } + _reveal() { + if (this._isVisible) { + return; + } + this._isVisible = true; + this._revealTimer.setIfNotSet(() => { + var _a10; + (_a10 = this._domNode) === null || _a10 === void 0 ? void 0 : _a10.setClassName(this._visibleClassName); + }, 0); + } + _hide(withFadeAway) { + var _a10; + this._revealTimer.cancel(); + if (!this._isVisible) { + return; + } + this._isVisible = false; + (_a10 = this._domNode) === null || _a10 === void 0 ? void 0 : _a10.setClassName(this._invisibleClassName + (withFadeAway ? " fade" : "")); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/abstractScrollbar.js +var POINTER_DRAG_RESET_DISTANCE, AbstractScrollbar; +var init_abstractScrollbar = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/abstractScrollbar.js"() { + init_dom(); + init_fastDomNode(); + init_globalPointerMoveMonitor(); + init_scrollbarArrow(); + init_scrollbarVisibilityController(); + init_widget(); + init_platform(); + POINTER_DRAG_RESET_DISTANCE = 140; + AbstractScrollbar = class extends Widget { + constructor(opts) { + super(); + this._lazyRender = opts.lazyRender; + this._host = opts.host; + this._scrollable = opts.scrollable; + this._scrollByPage = opts.scrollByPage; + this._scrollbarState = opts.scrollbarState; + this._visibilityController = this._register(new ScrollbarVisibilityController(opts.visibility, "visible scrollbar " + opts.extraScrollbarClassName, "invisible scrollbar " + opts.extraScrollbarClassName)); + this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()); + this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor()); + this._shouldRender = true; + this.domNode = createFastDomNode(document.createElement("div")); + this.domNode.setAttribute("role", "presentation"); + this.domNode.setAttribute("aria-hidden", "true"); + this._visibilityController.setDomNode(this.domNode); + this.domNode.setPosition("absolute"); + this._register(addDisposableListener(this.domNode.domNode, EventType.POINTER_DOWN, (e) => this._domNodePointerDown(e))); + } + // ----------------- creation + /** + * Creates the dom node for an arrow & adds it to the container + */ + _createArrow(opts) { + const arrow = this._register(new ScrollbarArrow(opts)); + this.domNode.domNode.appendChild(arrow.bgDomNode); + this.domNode.domNode.appendChild(arrow.domNode); + } + /** + * Creates the slider dom node, adds it to the container & hooks up the events + */ + _createSlider(top, left, width2, height) { + this.slider = createFastDomNode(document.createElement("div")); + this.slider.setClassName("slider"); + this.slider.setPosition("absolute"); + this.slider.setTop(top); + this.slider.setLeft(left); + if (typeof width2 === "number") { + this.slider.setWidth(width2); + } + if (typeof height === "number") { + this.slider.setHeight(height); + } + this.slider.setLayerHinting(true); + this.slider.setContain("strict"); + this.domNode.domNode.appendChild(this.slider.domNode); + this._register(addDisposableListener(this.slider.domNode, EventType.POINTER_DOWN, (e) => { + if (e.button === 0) { + e.preventDefault(); + this._sliderPointerDown(e); + } + })); + this.onclick(this.slider.domNode, (e) => { + if (e.leftButton) { + e.stopPropagation(); + } + }); + } + // ----------------- Update state + _onElementSize(visibleSize) { + if (this._scrollbarState.setVisibleSize(visibleSize)) { + this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()); + this._shouldRender = true; + if (!this._lazyRender) { + this.render(); + } + } + return this._shouldRender; + } + _onElementScrollSize(elementScrollSize) { + if (this._scrollbarState.setScrollSize(elementScrollSize)) { + this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()); + this._shouldRender = true; + if (!this._lazyRender) { + this.render(); + } + } + return this._shouldRender; + } + _onElementScrollPosition(elementScrollPosition) { + if (this._scrollbarState.setScrollPosition(elementScrollPosition)) { + this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()); + this._shouldRender = true; + if (!this._lazyRender) { + this.render(); + } + } + return this._shouldRender; + } + // ----------------- rendering + beginReveal() { + this._visibilityController.setShouldBeVisible(true); + } + beginHide() { + this._visibilityController.setShouldBeVisible(false); + } + render() { + if (!this._shouldRender) { + return; + } + this._shouldRender = false; + this._renderDomNode(this._scrollbarState.getRectangleLargeSize(), this._scrollbarState.getRectangleSmallSize()); + this._updateSlider(this._scrollbarState.getSliderSize(), this._scrollbarState.getArrowSize() + this._scrollbarState.getSliderPosition()); + } + // ----------------- DOM events + _domNodePointerDown(e) { + if (e.target !== this.domNode.domNode) { + return; + } + this._onPointerDown(e); + } + delegatePointerDown(e) { + const domTop = this.domNode.domNode.getClientRects()[0].top; + const sliderStart = domTop + this._scrollbarState.getSliderPosition(); + const sliderStop = domTop + this._scrollbarState.getSliderPosition() + this._scrollbarState.getSliderSize(); + const pointerPos = this._sliderPointerPosition(e); + if (sliderStart <= pointerPos && pointerPos <= sliderStop) { + if (e.button === 0) { + e.preventDefault(); + this._sliderPointerDown(e); + } + } else { + this._onPointerDown(e); + } + } + _onPointerDown(e) { + let offsetX; + let offsetY; + if (e.target === this.domNode.domNode && typeof e.offsetX === "number" && typeof e.offsetY === "number") { + offsetX = e.offsetX; + offsetY = e.offsetY; + } else { + const domNodePosition = getDomNodePagePosition(this.domNode.domNode); + offsetX = e.pageX - domNodePosition.left; + offsetY = e.pageY - domNodePosition.top; + } + const offset = this._pointerDownRelativePosition(offsetX, offsetY); + this._setDesiredScrollPositionNow(this._scrollByPage ? this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(offset) : this._scrollbarState.getDesiredScrollPositionFromOffset(offset)); + if (e.button === 0) { + e.preventDefault(); + this._sliderPointerDown(e); + } + } + _sliderPointerDown(e) { + if (!e.target || !(e.target instanceof Element)) { + return; + } + const initialPointerPosition = this._sliderPointerPosition(e); + const initialPointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(e); + const initialScrollbarState = this._scrollbarState.clone(); + this.slider.toggleClassName("active", true); + this._pointerMoveMonitor.startMonitoring(e.target, e.pointerId, e.buttons, (pointerMoveData) => { + const pointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(pointerMoveData); + const pointerOrthogonalDelta = Math.abs(pointerOrthogonalPosition - initialPointerOrthogonalPosition); + if (isWindows && pointerOrthogonalDelta > POINTER_DRAG_RESET_DISTANCE) { + this._setDesiredScrollPositionNow(initialScrollbarState.getScrollPosition()); + return; + } + const pointerPosition = this._sliderPointerPosition(pointerMoveData); + const pointerDelta = pointerPosition - initialPointerPosition; + this._setDesiredScrollPositionNow(initialScrollbarState.getDesiredScrollPositionFromDelta(pointerDelta)); + }, () => { + this.slider.toggleClassName("active", false); + this._host.onDragEnd(); + }); + this._host.onDragStart(); + } + _setDesiredScrollPositionNow(_desiredScrollPosition) { + const desiredScrollPosition = {}; + this.writeScrollPosition(desiredScrollPosition, _desiredScrollPosition); + this._scrollable.setScrollPositionNow(desiredScrollPosition); + } + updateScrollbarSize(scrollbarSize) { + this._updateScrollbarSize(scrollbarSize); + this._scrollbarState.setScrollbarSize(scrollbarSize); + this._shouldRender = true; + if (!this._lazyRender) { + this.render(); + } + } + isNeeded() { + return this._scrollbarState.isNeeded(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/scrollbarState.js +var MINIMUM_SLIDER_SIZE, ScrollbarState; +var init_scrollbarState = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/scrollbarState.js"() { + MINIMUM_SLIDER_SIZE = 20; + ScrollbarState = class _ScrollbarState { + constructor(arrowSize, scrollbarSize, oppositeScrollbarSize, visibleSize, scrollSize, scrollPosition) { + this._scrollbarSize = Math.round(scrollbarSize); + this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize); + this._arrowSize = Math.round(arrowSize); + this._visibleSize = visibleSize; + this._scrollSize = scrollSize; + this._scrollPosition = scrollPosition; + this._computedAvailableSize = 0; + this._computedIsNeeded = false; + this._computedSliderSize = 0; + this._computedSliderRatio = 0; + this._computedSliderPosition = 0; + this._refreshComputedValues(); + } + clone() { + return new _ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition); + } + setVisibleSize(visibleSize) { + const iVisibleSize = Math.round(visibleSize); + if (this._visibleSize !== iVisibleSize) { + this._visibleSize = iVisibleSize; + this._refreshComputedValues(); + return true; + } + return false; + } + setScrollSize(scrollSize) { + const iScrollSize = Math.round(scrollSize); + if (this._scrollSize !== iScrollSize) { + this._scrollSize = iScrollSize; + this._refreshComputedValues(); + return true; + } + return false; + } + setScrollPosition(scrollPosition) { + const iScrollPosition = Math.round(scrollPosition); + if (this._scrollPosition !== iScrollPosition) { + this._scrollPosition = iScrollPosition; + this._refreshComputedValues(); + return true; + } + return false; + } + setScrollbarSize(scrollbarSize) { + this._scrollbarSize = Math.round(scrollbarSize); + } + setOppositeScrollbarSize(oppositeScrollbarSize) { + this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize); + } + static _computeValues(oppositeScrollbarSize, arrowSize, visibleSize, scrollSize, scrollPosition) { + const computedAvailableSize = Math.max(0, visibleSize - oppositeScrollbarSize); + const computedRepresentableSize = Math.max(0, computedAvailableSize - 2 * arrowSize); + const computedIsNeeded = scrollSize > 0 && scrollSize > visibleSize; + if (!computedIsNeeded) { + return { + computedAvailableSize: Math.round(computedAvailableSize), + computedIsNeeded, + computedSliderSize: Math.round(computedRepresentableSize), + computedSliderRatio: 0, + computedSliderPosition: 0 + }; + } + const computedSliderSize = Math.round(Math.max(MINIMUM_SLIDER_SIZE, Math.floor(visibleSize * computedRepresentableSize / scrollSize))); + const computedSliderRatio = (computedRepresentableSize - computedSliderSize) / (scrollSize - visibleSize); + const computedSliderPosition = scrollPosition * computedSliderRatio; + return { + computedAvailableSize: Math.round(computedAvailableSize), + computedIsNeeded, + computedSliderSize: Math.round(computedSliderSize), + computedSliderRatio, + computedSliderPosition: Math.round(computedSliderPosition) + }; + } + _refreshComputedValues() { + const r = _ScrollbarState._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition); + this._computedAvailableSize = r.computedAvailableSize; + this._computedIsNeeded = r.computedIsNeeded; + this._computedSliderSize = r.computedSliderSize; + this._computedSliderRatio = r.computedSliderRatio; + this._computedSliderPosition = r.computedSliderPosition; + } + getArrowSize() { + return this._arrowSize; + } + getScrollPosition() { + return this._scrollPosition; + } + getRectangleLargeSize() { + return this._computedAvailableSize; + } + getRectangleSmallSize() { + return this._scrollbarSize; + } + isNeeded() { + return this._computedIsNeeded; + } + getSliderSize() { + return this._computedSliderSize; + } + getSliderPosition() { + return this._computedSliderPosition; + } + /** + * Compute a desired `scrollPosition` such that `offset` ends up in the center of the slider. + * `offset` is based on the same coordinate system as the `sliderPosition`. + */ + getDesiredScrollPositionFromOffset(offset) { + if (!this._computedIsNeeded) { + return 0; + } + const desiredSliderPosition = offset - this._arrowSize - this._computedSliderSize / 2; + return Math.round(desiredSliderPosition / this._computedSliderRatio); + } + /** + * Compute a desired `scrollPosition` from if offset is before or after the slider position. + * If offset is before slider, treat as a page up (or left). If after, page down (or right). + * `offset` and `_computedSliderPosition` are based on the same coordinate system. + * `_visibleSize` corresponds to a "page" of lines in the returned coordinate system. + */ + getDesiredScrollPositionFromOffsetPaged(offset) { + if (!this._computedIsNeeded) { + return 0; + } + const correctedOffset = offset - this._arrowSize; + let desiredScrollPosition = this._scrollPosition; + if (correctedOffset < this._computedSliderPosition) { + desiredScrollPosition -= this._visibleSize; + } else { + desiredScrollPosition += this._visibleSize; + } + return desiredScrollPosition; + } + /** + * Compute a desired `scrollPosition` such that the slider moves by `delta`. + */ + getDesiredScrollPositionFromDelta(delta) { + if (!this._computedIsNeeded) { + return 0; + } + const desiredSliderPosition = this._computedSliderPosition + delta; + return Math.round(desiredSliderPosition / this._computedSliderRatio); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/horizontalScrollbar.js +var HorizontalScrollbar; +var init_horizontalScrollbar = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/horizontalScrollbar.js"() { + init_mouseEvent(); + init_abstractScrollbar(); + init_scrollbarArrow(); + init_scrollbarState(); + init_codicons(); + HorizontalScrollbar = class extends AbstractScrollbar { + constructor(scrollable, options2, host) { + const scrollDimensions = scrollable.getScrollDimensions(); + const scrollPosition = scrollable.getCurrentScrollPosition(); + super({ + lazyRender: options2.lazyRender, + host, + scrollbarState: new ScrollbarState(options2.horizontalHasArrows ? options2.arrowSize : 0, options2.horizontal === 2 ? 0 : options2.horizontalScrollbarSize, options2.vertical === 2 ? 0 : options2.verticalScrollbarSize, scrollDimensions.width, scrollDimensions.scrollWidth, scrollPosition.scrollLeft), + visibility: options2.horizontal, + extraScrollbarClassName: "horizontal", + scrollable, + scrollByPage: options2.scrollByPage + }); + if (options2.horizontalHasArrows) { + const arrowDelta = (options2.arrowSize - ARROW_IMG_SIZE) / 2; + const scrollbarDelta = (options2.horizontalScrollbarSize - ARROW_IMG_SIZE) / 2; + this._createArrow({ + className: "scra", + icon: Codicon.scrollbarButtonLeft, + top: scrollbarDelta, + left: arrowDelta, + bottom: void 0, + right: void 0, + bgWidth: options2.arrowSize, + bgHeight: options2.horizontalScrollbarSize, + onActivate: () => this._host.onMouseWheel(new StandardWheelEvent(null, 1, 0)) + }); + this._createArrow({ + className: "scra", + icon: Codicon.scrollbarButtonRight, + top: scrollbarDelta, + left: void 0, + bottom: void 0, + right: arrowDelta, + bgWidth: options2.arrowSize, + bgHeight: options2.horizontalScrollbarSize, + onActivate: () => this._host.onMouseWheel(new StandardWheelEvent(null, -1, 0)) + }); + } + this._createSlider(Math.floor((options2.horizontalScrollbarSize - options2.horizontalSliderSize) / 2), 0, void 0, options2.horizontalSliderSize); + } + _updateSlider(sliderSize, sliderPosition) { + this.slider.setWidth(sliderSize); + this.slider.setLeft(sliderPosition); + } + _renderDomNode(largeSize, smallSize) { + this.domNode.setWidth(largeSize); + this.domNode.setHeight(smallSize); + this.domNode.setLeft(0); + this.domNode.setBottom(0); + } + onDidScroll(e) { + this._shouldRender = this._onElementScrollSize(e.scrollWidth) || this._shouldRender; + this._shouldRender = this._onElementScrollPosition(e.scrollLeft) || this._shouldRender; + this._shouldRender = this._onElementSize(e.width) || this._shouldRender; + return this._shouldRender; + } + _pointerDownRelativePosition(offsetX, offsetY) { + return offsetX; + } + _sliderPointerPosition(e) { + return e.pageX; + } + _sliderOrthogonalPointerPosition(e) { + return e.pageY; + } + _updateScrollbarSize(size2) { + this.slider.setHeight(size2); + } + writeScrollPosition(target, scrollPosition) { + target.scrollLeft = scrollPosition; + } + updateOptions(options2) { + this.updateScrollbarSize(options2.horizontal === 2 ? 0 : options2.horizontalScrollbarSize); + this._scrollbarState.setOppositeScrollbarSize(options2.vertical === 2 ? 0 : options2.verticalScrollbarSize); + this._visibilityController.setVisibility(options2.horizontal); + this._scrollByPage = options2.scrollByPage; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/verticalScrollbar.js +var VerticalScrollbar; +var init_verticalScrollbar = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/verticalScrollbar.js"() { + init_mouseEvent(); + init_abstractScrollbar(); + init_scrollbarArrow(); + init_scrollbarState(); + init_codicons(); + VerticalScrollbar = class extends AbstractScrollbar { + constructor(scrollable, options2, host) { + const scrollDimensions = scrollable.getScrollDimensions(); + const scrollPosition = scrollable.getCurrentScrollPosition(); + super({ + lazyRender: options2.lazyRender, + host, + scrollbarState: new ScrollbarState( + options2.verticalHasArrows ? options2.arrowSize : 0, + options2.vertical === 2 ? 0 : options2.verticalScrollbarSize, + // give priority to vertical scroll bar over horizontal and let it scroll all the way to the bottom + 0, + scrollDimensions.height, + scrollDimensions.scrollHeight, + scrollPosition.scrollTop + ), + visibility: options2.vertical, + extraScrollbarClassName: "vertical", + scrollable, + scrollByPage: options2.scrollByPage + }); + if (options2.verticalHasArrows) { + const arrowDelta = (options2.arrowSize - ARROW_IMG_SIZE) / 2; + const scrollbarDelta = (options2.verticalScrollbarSize - ARROW_IMG_SIZE) / 2; + this._createArrow({ + className: "scra", + icon: Codicon.scrollbarButtonUp, + top: arrowDelta, + left: scrollbarDelta, + bottom: void 0, + right: void 0, + bgWidth: options2.verticalScrollbarSize, + bgHeight: options2.arrowSize, + onActivate: () => this._host.onMouseWheel(new StandardWheelEvent(null, 0, 1)) + }); + this._createArrow({ + className: "scra", + icon: Codicon.scrollbarButtonDown, + top: void 0, + left: scrollbarDelta, + bottom: arrowDelta, + right: void 0, + bgWidth: options2.verticalScrollbarSize, + bgHeight: options2.arrowSize, + onActivate: () => this._host.onMouseWheel(new StandardWheelEvent(null, 0, -1)) + }); + } + this._createSlider(0, Math.floor((options2.verticalScrollbarSize - options2.verticalSliderSize) / 2), options2.verticalSliderSize, void 0); + } + _updateSlider(sliderSize, sliderPosition) { + this.slider.setHeight(sliderSize); + this.slider.setTop(sliderPosition); + } + _renderDomNode(largeSize, smallSize) { + this.domNode.setWidth(smallSize); + this.domNode.setHeight(largeSize); + this.domNode.setRight(0); + this.domNode.setTop(0); + } + onDidScroll(e) { + this._shouldRender = this._onElementScrollSize(e.scrollHeight) || this._shouldRender; + this._shouldRender = this._onElementScrollPosition(e.scrollTop) || this._shouldRender; + this._shouldRender = this._onElementSize(e.height) || this._shouldRender; + return this._shouldRender; + } + _pointerDownRelativePosition(offsetX, offsetY) { + return offsetY; + } + _sliderPointerPosition(e) { + return e.pageY; + } + _sliderOrthogonalPointerPosition(e) { + return e.pageX; + } + _updateScrollbarSize(size2) { + this.slider.setWidth(size2); + } + writeScrollPosition(target, scrollPosition) { + target.scrollTop = scrollPosition; + } + updateOptions(options2) { + this.updateScrollbarSize(options2.vertical === 2 ? 0 : options2.verticalScrollbarSize); + this._scrollbarState.setOppositeScrollbarSize(0); + this._visibilityController.setVisibility(options2.vertical); + this._scrollByPage = options2.scrollByPage; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/scrollable.js +function createEaseOutCubic(from, to) { + const delta = to - from; + return function(completion) { + return from + delta * easeOutCubic(completion); + }; +} +function createComposed(a3, b, cut) { + return function(completion) { + if (completion < cut) { + return a3(completion / cut); + } + return b((completion - cut) / (1 - cut)); + }; +} +function easeInCubic(t4) { + return Math.pow(t4, 3); +} +function easeOutCubic(t4) { + return 1 - easeInCubic(1 - t4); +} +var ScrollState, Scrollable, SmoothScrollingUpdate, SmoothScrollingOperation; +var init_scrollable = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/scrollable.js"() { + init_event(); + init_lifecycle(); + ScrollState = class _ScrollState { + constructor(_forceIntegerValues, width2, scrollWidth, scrollLeft, height, scrollHeight, scrollTop) { + this._forceIntegerValues = _forceIntegerValues; + this._scrollStateBrand = void 0; + if (this._forceIntegerValues) { + width2 = width2 | 0; + scrollWidth = scrollWidth | 0; + scrollLeft = scrollLeft | 0; + height = height | 0; + scrollHeight = scrollHeight | 0; + scrollTop = scrollTop | 0; + } + this.rawScrollLeft = scrollLeft; + this.rawScrollTop = scrollTop; + if (width2 < 0) { + width2 = 0; + } + if (scrollLeft + width2 > scrollWidth) { + scrollLeft = scrollWidth - width2; + } + if (scrollLeft < 0) { + scrollLeft = 0; + } + if (height < 0) { + height = 0; + } + if (scrollTop + height > scrollHeight) { + scrollTop = scrollHeight - height; + } + if (scrollTop < 0) { + scrollTop = 0; + } + this.width = width2; + this.scrollWidth = scrollWidth; + this.scrollLeft = scrollLeft; + this.height = height; + this.scrollHeight = scrollHeight; + this.scrollTop = scrollTop; + } + equals(other) { + return this.rawScrollLeft === other.rawScrollLeft && this.rawScrollTop === other.rawScrollTop && this.width === other.width && this.scrollWidth === other.scrollWidth && this.scrollLeft === other.scrollLeft && this.height === other.height && this.scrollHeight === other.scrollHeight && this.scrollTop === other.scrollTop; + } + withScrollDimensions(update, useRawScrollPositions) { + return new _ScrollState(this._forceIntegerValues, typeof update.width !== "undefined" ? update.width : this.width, typeof update.scrollWidth !== "undefined" ? update.scrollWidth : this.scrollWidth, useRawScrollPositions ? this.rawScrollLeft : this.scrollLeft, typeof update.height !== "undefined" ? update.height : this.height, typeof update.scrollHeight !== "undefined" ? update.scrollHeight : this.scrollHeight, useRawScrollPositions ? this.rawScrollTop : this.scrollTop); + } + withScrollPosition(update) { + return new _ScrollState(this._forceIntegerValues, this.width, this.scrollWidth, typeof update.scrollLeft !== "undefined" ? update.scrollLeft : this.rawScrollLeft, this.height, this.scrollHeight, typeof update.scrollTop !== "undefined" ? update.scrollTop : this.rawScrollTop); + } + createScrollEvent(previous, inSmoothScrolling) { + const widthChanged = this.width !== previous.width; + const scrollWidthChanged = this.scrollWidth !== previous.scrollWidth; + const scrollLeftChanged = this.scrollLeft !== previous.scrollLeft; + const heightChanged = this.height !== previous.height; + const scrollHeightChanged = this.scrollHeight !== previous.scrollHeight; + const scrollTopChanged = this.scrollTop !== previous.scrollTop; + return { + inSmoothScrolling, + oldWidth: previous.width, + oldScrollWidth: previous.scrollWidth, + oldScrollLeft: previous.scrollLeft, + width: this.width, + scrollWidth: this.scrollWidth, + scrollLeft: this.scrollLeft, + oldHeight: previous.height, + oldScrollHeight: previous.scrollHeight, + oldScrollTop: previous.scrollTop, + height: this.height, + scrollHeight: this.scrollHeight, + scrollTop: this.scrollTop, + widthChanged, + scrollWidthChanged, + scrollLeftChanged, + heightChanged, + scrollHeightChanged, + scrollTopChanged + }; + } + }; + Scrollable = class extends Disposable { + constructor(options2) { + super(); + this._scrollableBrand = void 0; + this._onScroll = this._register(new Emitter()); + this.onScroll = this._onScroll.event; + this._smoothScrollDuration = options2.smoothScrollDuration; + this._scheduleAtNextAnimationFrame = options2.scheduleAtNextAnimationFrame; + this._state = new ScrollState(options2.forceIntegerValues, 0, 0, 0, 0, 0, 0); + this._smoothScrolling = null; + } + dispose() { + if (this._smoothScrolling) { + this._smoothScrolling.dispose(); + this._smoothScrolling = null; + } + super.dispose(); + } + setSmoothScrollDuration(smoothScrollDuration) { + this._smoothScrollDuration = smoothScrollDuration; + } + validateScrollPosition(scrollPosition) { + return this._state.withScrollPosition(scrollPosition); + } + getScrollDimensions() { + return this._state; + } + setScrollDimensions(dimensions, useRawScrollPositions) { + var _a10; + const newState = this._state.withScrollDimensions(dimensions, useRawScrollPositions); + this._setState(newState, Boolean(this._smoothScrolling)); + (_a10 = this._smoothScrolling) === null || _a10 === void 0 ? void 0 : _a10.acceptScrollDimensions(this._state); + } + /** + * Returns the final scroll position that the instance will have once the smooth scroll animation concludes. + * If no scroll animation is occurring, it will return the current scroll position instead. + */ + getFutureScrollPosition() { + if (this._smoothScrolling) { + return this._smoothScrolling.to; + } + return this._state; + } + /** + * Returns the current scroll position. + * Note: This result might be an intermediate scroll position, as there might be an ongoing smooth scroll animation. + */ + getCurrentScrollPosition() { + return this._state; + } + setScrollPositionNow(update) { + const newState = this._state.withScrollPosition(update); + if (this._smoothScrolling) { + this._smoothScrolling.dispose(); + this._smoothScrolling = null; + } + this._setState(newState, false); + } + setScrollPositionSmooth(update, reuseAnimation) { + if (this._smoothScrollDuration === 0) { + return this.setScrollPositionNow(update); + } + if (this._smoothScrolling) { + update = { + scrollLeft: typeof update.scrollLeft === "undefined" ? this._smoothScrolling.to.scrollLeft : update.scrollLeft, + scrollTop: typeof update.scrollTop === "undefined" ? this._smoothScrolling.to.scrollTop : update.scrollTop + }; + const validTarget = this._state.withScrollPosition(update); + if (this._smoothScrolling.to.scrollLeft === validTarget.scrollLeft && this._smoothScrolling.to.scrollTop === validTarget.scrollTop) { + return; + } + let newSmoothScrolling; + if (reuseAnimation) { + newSmoothScrolling = new SmoothScrollingOperation(this._smoothScrolling.from, validTarget, this._smoothScrolling.startTime, this._smoothScrolling.duration); + } else { + newSmoothScrolling = this._smoothScrolling.combine(this._state, validTarget, this._smoothScrollDuration); + } + this._smoothScrolling.dispose(); + this._smoothScrolling = newSmoothScrolling; + } else { + const validTarget = this._state.withScrollPosition(update); + this._smoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration); + } + this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => { + if (!this._smoothScrolling) { + return; + } + this._smoothScrolling.animationFrameDisposable = null; + this._performSmoothScrolling(); + }); + } + hasPendingScrollAnimation() { + return Boolean(this._smoothScrolling); + } + _performSmoothScrolling() { + if (!this._smoothScrolling) { + return; + } + const update = this._smoothScrolling.tick(); + const newState = this._state.withScrollPosition(update); + this._setState(newState, true); + if (!this._smoothScrolling) { + return; + } + if (update.isDone) { + this._smoothScrolling.dispose(); + this._smoothScrolling = null; + return; + } + this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => { + if (!this._smoothScrolling) { + return; + } + this._smoothScrolling.animationFrameDisposable = null; + this._performSmoothScrolling(); + }); + } + _setState(newState, inSmoothScrolling) { + const oldState = this._state; + if (oldState.equals(newState)) { + return; + } + this._state = newState; + this._onScroll.fire(this._state.createScrollEvent(oldState, inSmoothScrolling)); + } + }; + SmoothScrollingUpdate = class { + constructor(scrollLeft, scrollTop, isDone) { + this.scrollLeft = scrollLeft; + this.scrollTop = scrollTop; + this.isDone = isDone; + } + }; + SmoothScrollingOperation = class _SmoothScrollingOperation { + constructor(from, to, startTime, duration) { + this.from = from; + this.to = to; + this.duration = duration; + this.startTime = startTime; + this.animationFrameDisposable = null; + this._initAnimations(); + } + _initAnimations() { + this.scrollLeft = this._initAnimation(this.from.scrollLeft, this.to.scrollLeft, this.to.width); + this.scrollTop = this._initAnimation(this.from.scrollTop, this.to.scrollTop, this.to.height); + } + _initAnimation(from, to, viewportSize) { + const delta = Math.abs(from - to); + if (delta > 2.5 * viewportSize) { + let stop1, stop2; + if (from < to) { + stop1 = from + 0.75 * viewportSize; + stop2 = to - 0.75 * viewportSize; + } else { + stop1 = from - 0.75 * viewportSize; + stop2 = to + 0.75 * viewportSize; + } + return createComposed(createEaseOutCubic(from, stop1), createEaseOutCubic(stop2, to), 0.33); + } + return createEaseOutCubic(from, to); + } + dispose() { + if (this.animationFrameDisposable !== null) { + this.animationFrameDisposable.dispose(); + this.animationFrameDisposable = null; + } + } + acceptScrollDimensions(state) { + this.to = state.withScrollPosition(this.to); + this._initAnimations(); + } + tick() { + return this._tick(Date.now()); + } + _tick(now) { + const completion = (now - this.startTime) / this.duration; + if (completion < 1) { + const newScrollLeft = this.scrollLeft(completion); + const newScrollTop = this.scrollTop(completion); + return new SmoothScrollingUpdate(newScrollLeft, newScrollTop, false); + } + return new SmoothScrollingUpdate(this.to.scrollLeft, this.to.scrollTop, true); + } + combine(from, to, duration) { + return _SmoothScrollingOperation.start(from, to, duration); + } + static start(from, to, duration) { + duration = duration + 10; + const startTime = Date.now() - 10; + return new _SmoothScrollingOperation(from, to, startTime, duration); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/media/scrollbars.css +var init_scrollbars = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/media/scrollbars.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/scrollableElement.js +function resolveOptions(opts) { + const result = { + lazyRender: typeof opts.lazyRender !== "undefined" ? opts.lazyRender : false, + className: typeof opts.className !== "undefined" ? opts.className : "", + useShadows: typeof opts.useShadows !== "undefined" ? opts.useShadows : true, + handleMouseWheel: typeof opts.handleMouseWheel !== "undefined" ? opts.handleMouseWheel : true, + flipAxes: typeof opts.flipAxes !== "undefined" ? opts.flipAxes : false, + consumeMouseWheelIfScrollbarIsNeeded: typeof opts.consumeMouseWheelIfScrollbarIsNeeded !== "undefined" ? opts.consumeMouseWheelIfScrollbarIsNeeded : false, + alwaysConsumeMouseWheel: typeof opts.alwaysConsumeMouseWheel !== "undefined" ? opts.alwaysConsumeMouseWheel : false, + scrollYToX: typeof opts.scrollYToX !== "undefined" ? opts.scrollYToX : false, + mouseWheelScrollSensitivity: typeof opts.mouseWheelScrollSensitivity !== "undefined" ? opts.mouseWheelScrollSensitivity : 1, + fastScrollSensitivity: typeof opts.fastScrollSensitivity !== "undefined" ? opts.fastScrollSensitivity : 5, + scrollPredominantAxis: typeof opts.scrollPredominantAxis !== "undefined" ? opts.scrollPredominantAxis : true, + mouseWheelSmoothScroll: typeof opts.mouseWheelSmoothScroll !== "undefined" ? opts.mouseWheelSmoothScroll : true, + arrowSize: typeof opts.arrowSize !== "undefined" ? opts.arrowSize : 11, + listenOnDomNode: typeof opts.listenOnDomNode !== "undefined" ? opts.listenOnDomNode : null, + horizontal: typeof opts.horizontal !== "undefined" ? opts.horizontal : 1, + horizontalScrollbarSize: typeof opts.horizontalScrollbarSize !== "undefined" ? opts.horizontalScrollbarSize : 10, + horizontalSliderSize: typeof opts.horizontalSliderSize !== "undefined" ? opts.horizontalSliderSize : 0, + horizontalHasArrows: typeof opts.horizontalHasArrows !== "undefined" ? opts.horizontalHasArrows : false, + vertical: typeof opts.vertical !== "undefined" ? opts.vertical : 1, + verticalScrollbarSize: typeof opts.verticalScrollbarSize !== "undefined" ? opts.verticalScrollbarSize : 10, + verticalHasArrows: typeof opts.verticalHasArrows !== "undefined" ? opts.verticalHasArrows : false, + verticalSliderSize: typeof opts.verticalSliderSize !== "undefined" ? opts.verticalSliderSize : 0, + scrollByPage: typeof opts.scrollByPage !== "undefined" ? opts.scrollByPage : false + }; + result.horizontalSliderSize = typeof opts.horizontalSliderSize !== "undefined" ? opts.horizontalSliderSize : result.horizontalScrollbarSize; + result.verticalSliderSize = typeof opts.verticalSliderSize !== "undefined" ? opts.verticalSliderSize : result.verticalScrollbarSize; + if (isMacintosh) { + result.className += " mac"; + } + return result; +} +var HIDE_TIMEOUT, SCROLL_WHEEL_SENSITIVITY, SCROLL_WHEEL_SMOOTH_SCROLL_ENABLED, MouseWheelClassifierItem, MouseWheelClassifier, AbstractScrollableElement, ScrollableElement, SmoothScrollableElement, DomScrollableElement; +var init_scrollableElement = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/scrollbar/scrollableElement.js"() { + init_browser(); + init_dom(); + init_fastDomNode(); + init_mouseEvent(); + init_horizontalScrollbar(); + init_verticalScrollbar(); + init_widget(); + init_async(); + init_event(); + init_lifecycle(); + init_platform(); + init_scrollable(); + init_scrollbars(); + HIDE_TIMEOUT = 500; + SCROLL_WHEEL_SENSITIVITY = 50; + SCROLL_WHEEL_SMOOTH_SCROLL_ENABLED = true; + MouseWheelClassifierItem = class { + constructor(timestamp, deltaX, deltaY) { + this.timestamp = timestamp; + this.deltaX = deltaX; + this.deltaY = deltaY; + this.score = 0; + } + }; + MouseWheelClassifier = class { + constructor() { + this._capacity = 5; + this._memory = []; + this._front = -1; + this._rear = -1; + } + isPhysicalMouseWheel() { + if (this._front === -1 && this._rear === -1) { + return false; + } + let remainingInfluence = 1; + let score3 = 0; + let iteration = 1; + let index = this._rear; + do { + const influence = index === this._front ? remainingInfluence : Math.pow(2, -iteration); + remainingInfluence -= influence; + score3 += this._memory[index].score * influence; + if (index === this._front) { + break; + } + index = (this._capacity + index - 1) % this._capacity; + iteration++; + } while (true); + return score3 <= 0.5; + } + acceptStandardWheelEvent(e) { + if (isChrome2) { + const targetWindow = getWindow(e.browserEvent); + const pageZoomFactor = getZoomFactor(targetWindow); + this.accept(Date.now(), e.deltaX * pageZoomFactor, e.deltaY * pageZoomFactor); + } else { + this.accept(Date.now(), e.deltaX, e.deltaY); + } + } + accept(timestamp, deltaX, deltaY) { + let previousItem = null; + const item = new MouseWheelClassifierItem(timestamp, deltaX, deltaY); + if (this._front === -1 && this._rear === -1) { + this._memory[0] = item; + this._front = 0; + this._rear = 0; + } else { + previousItem = this._memory[this._rear]; + this._rear = (this._rear + 1) % this._capacity; + if (this._rear === this._front) { + this._front = (this._front + 1) % this._capacity; + } + this._memory[this._rear] = item; + } + item.score = this._computeScore(item, previousItem); + } + /** + * A score between 0 and 1 for `item`. + * - a score towards 0 indicates that the source appears to be a physical mouse wheel + * - a score towards 1 indicates that the source appears to be a touchpad or magic mouse, etc. + */ + _computeScore(item, previousItem) { + if (Math.abs(item.deltaX) > 0 && Math.abs(item.deltaY) > 0) { + return 1; + } + let score3 = 0.5; + if (!this._isAlmostInt(item.deltaX) || !this._isAlmostInt(item.deltaY)) { + score3 += 0.25; + } + if (previousItem) { + const absDeltaX = Math.abs(item.deltaX); + const absDeltaY = Math.abs(item.deltaY); + const absPreviousDeltaX = Math.abs(previousItem.deltaX); + const absPreviousDeltaY = Math.abs(previousItem.deltaY); + const minDeltaX = Math.max(Math.min(absDeltaX, absPreviousDeltaX), 1); + const minDeltaY = Math.max(Math.min(absDeltaY, absPreviousDeltaY), 1); + const maxDeltaX = Math.max(absDeltaX, absPreviousDeltaX); + const maxDeltaY = Math.max(absDeltaY, absPreviousDeltaY); + const isSameModulo = maxDeltaX % minDeltaX === 0 && maxDeltaY % minDeltaY === 0; + if (isSameModulo) { + score3 -= 0.5; + } + } + return Math.min(Math.max(score3, 0), 1); + } + _isAlmostInt(value) { + const delta = Math.abs(Math.round(value) - value); + return delta < 0.01; + } + }; + MouseWheelClassifier.INSTANCE = new MouseWheelClassifier(); + AbstractScrollableElement = class extends Widget { + get options() { + return this._options; + } + constructor(element, options2, scrollable) { + super(); + this._onScroll = this._register(new Emitter()); + this.onScroll = this._onScroll.event; + this._onWillScroll = this._register(new Emitter()); + element.style.overflow = "hidden"; + this._options = resolveOptions(options2); + this._scrollable = scrollable; + this._register(this._scrollable.onScroll((e) => { + this._onWillScroll.fire(e); + this._onDidScroll(e); + this._onScroll.fire(e); + })); + const scrollbarHost = { + onMouseWheel: (mouseWheelEvent) => this._onMouseWheel(mouseWheelEvent), + onDragStart: () => this._onDragStart(), + onDragEnd: () => this._onDragEnd() + }; + this._verticalScrollbar = this._register(new VerticalScrollbar(this._scrollable, this._options, scrollbarHost)); + this._horizontalScrollbar = this._register(new HorizontalScrollbar(this._scrollable, this._options, scrollbarHost)); + this._domNode = document.createElement("div"); + this._domNode.className = "monaco-scrollable-element " + this._options.className; + this._domNode.setAttribute("role", "presentation"); + this._domNode.style.position = "relative"; + this._domNode.style.overflow = "hidden"; + this._domNode.appendChild(element); + this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode); + this._domNode.appendChild(this._verticalScrollbar.domNode.domNode); + if (this._options.useShadows) { + this._leftShadowDomNode = createFastDomNode(document.createElement("div")); + this._leftShadowDomNode.setClassName("shadow"); + this._domNode.appendChild(this._leftShadowDomNode.domNode); + this._topShadowDomNode = createFastDomNode(document.createElement("div")); + this._topShadowDomNode.setClassName("shadow"); + this._domNode.appendChild(this._topShadowDomNode.domNode); + this._topLeftShadowDomNode = createFastDomNode(document.createElement("div")); + this._topLeftShadowDomNode.setClassName("shadow"); + this._domNode.appendChild(this._topLeftShadowDomNode.domNode); + } else { + this._leftShadowDomNode = null; + this._topShadowDomNode = null; + this._topLeftShadowDomNode = null; + } + this._listenOnDomNode = this._options.listenOnDomNode || this._domNode; + this._mouseWheelToDispose = []; + this._setListeningToMouseWheel(this._options.handleMouseWheel); + this.onmouseover(this._listenOnDomNode, (e) => this._onMouseOver(e)); + this.onmouseleave(this._listenOnDomNode, (e) => this._onMouseLeave(e)); + this._hideTimeout = this._register(new TimeoutTimer()); + this._isDragging = false; + this._mouseIsOver = false; + this._shouldRender = true; + this._revealOnScroll = true; + } + dispose() { + this._mouseWheelToDispose = dispose(this._mouseWheelToDispose); + super.dispose(); + } + /** + * Get the generated 'scrollable' dom node + */ + getDomNode() { + return this._domNode; + } + getOverviewRulerLayoutInfo() { + return { + parent: this._domNode, + insertBefore: this._verticalScrollbar.domNode.domNode + }; + } + /** + * Delegate a pointer down event to the vertical scrollbar. + * This is to help with clicking somewhere else and having the scrollbar react. + */ + delegateVerticalScrollbarPointerDown(browserEvent) { + this._verticalScrollbar.delegatePointerDown(browserEvent); + } + getScrollDimensions() { + return this._scrollable.getScrollDimensions(); + } + setScrollDimensions(dimensions) { + this._scrollable.setScrollDimensions(dimensions, false); + } + /** + * Update the class name of the scrollable element. + */ + updateClassName(newClassName) { + this._options.className = newClassName; + if (isMacintosh) { + this._options.className += " mac"; + } + this._domNode.className = "monaco-scrollable-element " + this._options.className; + } + /** + * Update configuration options for the scrollbar. + */ + updateOptions(newOptions) { + if (typeof newOptions.handleMouseWheel !== "undefined") { + this._options.handleMouseWheel = newOptions.handleMouseWheel; + this._setListeningToMouseWheel(this._options.handleMouseWheel); + } + if (typeof newOptions.mouseWheelScrollSensitivity !== "undefined") { + this._options.mouseWheelScrollSensitivity = newOptions.mouseWheelScrollSensitivity; + } + if (typeof newOptions.fastScrollSensitivity !== "undefined") { + this._options.fastScrollSensitivity = newOptions.fastScrollSensitivity; + } + if (typeof newOptions.scrollPredominantAxis !== "undefined") { + this._options.scrollPredominantAxis = newOptions.scrollPredominantAxis; + } + if (typeof newOptions.horizontal !== "undefined") { + this._options.horizontal = newOptions.horizontal; + } + if (typeof newOptions.vertical !== "undefined") { + this._options.vertical = newOptions.vertical; + } + if (typeof newOptions.horizontalScrollbarSize !== "undefined") { + this._options.horizontalScrollbarSize = newOptions.horizontalScrollbarSize; + } + if (typeof newOptions.verticalScrollbarSize !== "undefined") { + this._options.verticalScrollbarSize = newOptions.verticalScrollbarSize; + } + if (typeof newOptions.scrollByPage !== "undefined") { + this._options.scrollByPage = newOptions.scrollByPage; + } + this._horizontalScrollbar.updateOptions(this._options); + this._verticalScrollbar.updateOptions(this._options); + if (!this._options.lazyRender) { + this._render(); + } + } + delegateScrollFromMouseWheelEvent(browserEvent) { + this._onMouseWheel(new StandardWheelEvent(browserEvent)); + } + // -------------------- mouse wheel scrolling -------------------- + _setListeningToMouseWheel(shouldListen) { + const isListening = this._mouseWheelToDispose.length > 0; + if (isListening === shouldListen) { + return; + } + this._mouseWheelToDispose = dispose(this._mouseWheelToDispose); + if (shouldListen) { + const onMouseWheel = (browserEvent) => { + this._onMouseWheel(new StandardWheelEvent(browserEvent)); + }; + this._mouseWheelToDispose.push(addDisposableListener(this._listenOnDomNode, EventType.MOUSE_WHEEL, onMouseWheel, { passive: false })); + } + } + _onMouseWheel(e) { + var _a10; + if ((_a10 = e.browserEvent) === null || _a10 === void 0 ? void 0 : _a10.defaultPrevented) { + return; + } + const classifier = MouseWheelClassifier.INSTANCE; + if (SCROLL_WHEEL_SMOOTH_SCROLL_ENABLED) { + classifier.acceptStandardWheelEvent(e); + } + let didScroll = false; + if (e.deltaY || e.deltaX) { + let deltaY = e.deltaY * this._options.mouseWheelScrollSensitivity; + let deltaX = e.deltaX * this._options.mouseWheelScrollSensitivity; + if (this._options.scrollPredominantAxis) { + if (this._options.scrollYToX && deltaX + deltaY === 0) { + deltaX = deltaY = 0; + } else if (Math.abs(deltaY) >= Math.abs(deltaX)) { + deltaX = 0; + } else { + deltaY = 0; + } + } + if (this._options.flipAxes) { + [deltaY, deltaX] = [deltaX, deltaY]; + } + const shiftConvert = !isMacintosh && e.browserEvent && e.browserEvent.shiftKey; + if ((this._options.scrollYToX || shiftConvert) && !deltaX) { + deltaX = deltaY; + deltaY = 0; + } + if (e.browserEvent && e.browserEvent.altKey) { + deltaX = deltaX * this._options.fastScrollSensitivity; + deltaY = deltaY * this._options.fastScrollSensitivity; + } + const futureScrollPosition = this._scrollable.getFutureScrollPosition(); + let desiredScrollPosition = {}; + if (deltaY) { + const deltaScrollTop = SCROLL_WHEEL_SENSITIVITY * deltaY; + const desiredScrollTop = futureScrollPosition.scrollTop - (deltaScrollTop < 0 ? Math.floor(deltaScrollTop) : Math.ceil(deltaScrollTop)); + this._verticalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollTop); + } + if (deltaX) { + const deltaScrollLeft = SCROLL_WHEEL_SENSITIVITY * deltaX; + const desiredScrollLeft = futureScrollPosition.scrollLeft - (deltaScrollLeft < 0 ? Math.floor(deltaScrollLeft) : Math.ceil(deltaScrollLeft)); + this._horizontalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollLeft); + } + desiredScrollPosition = this._scrollable.validateScrollPosition(desiredScrollPosition); + if (futureScrollPosition.scrollLeft !== desiredScrollPosition.scrollLeft || futureScrollPosition.scrollTop !== desiredScrollPosition.scrollTop) { + const canPerformSmoothScroll = SCROLL_WHEEL_SMOOTH_SCROLL_ENABLED && this._options.mouseWheelSmoothScroll && classifier.isPhysicalMouseWheel(); + if (canPerformSmoothScroll) { + this._scrollable.setScrollPositionSmooth(desiredScrollPosition); + } else { + this._scrollable.setScrollPositionNow(desiredScrollPosition); + } + didScroll = true; + } + } + let consumeMouseWheel = didScroll; + if (!consumeMouseWheel && this._options.alwaysConsumeMouseWheel) { + consumeMouseWheel = true; + } + if (!consumeMouseWheel && this._options.consumeMouseWheelIfScrollbarIsNeeded && (this._verticalScrollbar.isNeeded() || this._horizontalScrollbar.isNeeded())) { + consumeMouseWheel = true; + } + if (consumeMouseWheel) { + e.preventDefault(); + e.stopPropagation(); + } + } + _onDidScroll(e) { + this._shouldRender = this._horizontalScrollbar.onDidScroll(e) || this._shouldRender; + this._shouldRender = this._verticalScrollbar.onDidScroll(e) || this._shouldRender; + if (this._options.useShadows) { + this._shouldRender = true; + } + if (this._revealOnScroll) { + this._reveal(); + } + if (!this._options.lazyRender) { + this._render(); + } + } + /** + * Render / mutate the DOM now. + * Should be used together with the ctor option `lazyRender`. + */ + renderNow() { + if (!this._options.lazyRender) { + throw new Error("Please use `lazyRender` together with `renderNow`!"); + } + this._render(); + } + _render() { + if (!this._shouldRender) { + return; + } + this._shouldRender = false; + this._horizontalScrollbar.render(); + this._verticalScrollbar.render(); + if (this._options.useShadows) { + const scrollState = this._scrollable.getCurrentScrollPosition(); + const enableTop = scrollState.scrollTop > 0; + const enableLeft = scrollState.scrollLeft > 0; + const leftClassName = enableLeft ? " left" : ""; + const topClassName = enableTop ? " top" : ""; + const topLeftClassName = enableLeft || enableTop ? " top-left-corner" : ""; + this._leftShadowDomNode.setClassName(`shadow${leftClassName}`); + this._topShadowDomNode.setClassName(`shadow${topClassName}`); + this._topLeftShadowDomNode.setClassName(`shadow${topLeftClassName}${topClassName}${leftClassName}`); + } + } + // -------------------- fade in / fade out -------------------- + _onDragStart() { + this._isDragging = true; + this._reveal(); + } + _onDragEnd() { + this._isDragging = false; + this._hide(); + } + _onMouseLeave(e) { + this._mouseIsOver = false; + this._hide(); + } + _onMouseOver(e) { + this._mouseIsOver = true; + this._reveal(); + } + _reveal() { + this._verticalScrollbar.beginReveal(); + this._horizontalScrollbar.beginReveal(); + this._scheduleHide(); + } + _hide() { + if (!this._mouseIsOver && !this._isDragging) { + this._verticalScrollbar.beginHide(); + this._horizontalScrollbar.beginHide(); + } + } + _scheduleHide() { + if (!this._mouseIsOver && !this._isDragging) { + this._hideTimeout.cancelAndSet(() => this._hide(), HIDE_TIMEOUT); + } + } + }; + ScrollableElement = class extends AbstractScrollableElement { + constructor(element, options2) { + options2 = options2 || {}; + options2.mouseWheelSmoothScroll = false; + const scrollable = new Scrollable({ + forceIntegerValues: true, + smoothScrollDuration: 0, + scheduleAtNextAnimationFrame: (callback) => scheduleAtNextAnimationFrame(getWindow(element), callback) + }); + super(element, options2, scrollable); + this._register(scrollable); + } + setScrollPosition(update) { + this._scrollable.setScrollPositionNow(update); + } + }; + SmoothScrollableElement = class extends AbstractScrollableElement { + constructor(element, options2, scrollable) { + super(element, options2, scrollable); + } + setScrollPosition(update) { + if (update.reuseAnimation) { + this._scrollable.setScrollPositionSmooth(update, update.reuseAnimation); + } else { + this._scrollable.setScrollPositionNow(update); + } + } + getScrollPosition() { + return this._scrollable.getCurrentScrollPosition(); + } + }; + DomScrollableElement = class extends AbstractScrollableElement { + constructor(element, options2) { + options2 = options2 || {}; + options2.mouseWheelSmoothScroll = false; + const scrollable = new Scrollable({ + forceIntegerValues: false, + // See https://github.com/microsoft/vscode/issues/139877 + smoothScrollDuration: 0, + scheduleAtNextAnimationFrame: (callback) => scheduleAtNextAnimationFrame(getWindow(element), callback) + }); + super(element, options2, scrollable); + this._register(scrollable); + this._element = element; + this._register(this.onScroll((e) => { + if (e.scrollTopChanged) { + this._element.scrollTop = e.scrollTop; + } + if (e.scrollLeftChanged) { + this._element.scrollLeft = e.scrollLeft; + } + })); + this.scanDomNode(); + } + setScrollPosition(update) { + this._scrollable.setScrollPositionNow(update); + } + getScrollPosition() { + return this._scrollable.getCurrentScrollPosition(); + } + scanDomNode() { + this.setScrollDimensions({ + width: this._element.clientWidth, + scrollWidth: this._element.scrollWidth, + height: this._element.clientHeight, + scrollHeight: this._element.scrollHeight + }); + this.setScrollPosition({ + scrollLeft: this._element.scrollLeft, + scrollTop: this._element.scrollTop + }); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/controller/mouseHandler.js +var MouseHandler, MouseDownOperation, TopBottomDragScrolling, TopBottomDragScrollingOperation, MouseDownState; +var init_mouseHandler = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/controller/mouseHandler.js"() { + init_dom(); + init_mouseEvent(); + init_lifecycle(); + init_platform(); + init_mouseTarget(); + init_editorDom(); + init_editorZoom(); + init_position(); + init_selection(); + init_viewEventHandler(); + init_scrollableElement(); + MouseHandler = class extends ViewEventHandler { + constructor(context, viewController, viewHelper) { + super(); + this._mouseLeaveMonitor = null; + this._context = context; + this.viewController = viewController; + this.viewHelper = viewHelper; + this.mouseTargetFactory = new MouseTargetFactory(this._context, viewHelper); + this._mouseDownOperation = this._register(new MouseDownOperation(this._context, this.viewController, this.viewHelper, this.mouseTargetFactory, (e, testEventTarget) => this._createMouseTarget(e, testEventTarget), (e) => this._getMouseColumn(e))); + this.lastMouseLeaveTime = -1; + this._height = this._context.configuration.options.get( + 145 + /* EditorOption.layoutInfo */ + ).height; + const mouseEvents = new EditorMouseEventFactory(this.viewHelper.viewDomNode); + this._register(mouseEvents.onContextMenu(this.viewHelper.viewDomNode, (e) => this._onContextMenu(e, true))); + this._register(mouseEvents.onMouseMove(this.viewHelper.viewDomNode, (e) => { + this._onMouseMove(e); + if (!this._mouseLeaveMonitor) { + this._mouseLeaveMonitor = addDisposableListener(this.viewHelper.viewDomNode.ownerDocument, "mousemove", (e2) => { + if (!this.viewHelper.viewDomNode.contains(e2.target)) { + this._onMouseLeave(new EditorMouseEvent(e2, false, this.viewHelper.viewDomNode)); + } + }); + } + })); + this._register(mouseEvents.onMouseUp(this.viewHelper.viewDomNode, (e) => this._onMouseUp(e))); + this._register(mouseEvents.onMouseLeave(this.viewHelper.viewDomNode, (e) => this._onMouseLeave(e))); + let capturePointerId = 0; + this._register(mouseEvents.onPointerDown(this.viewHelper.viewDomNode, (e, pointerId) => { + capturePointerId = pointerId; + })); + this._register(addDisposableListener(this.viewHelper.viewDomNode, EventType.POINTER_UP, (e) => { + this._mouseDownOperation.onPointerUp(); + })); + this._register(mouseEvents.onMouseDown(this.viewHelper.viewDomNode, (e) => this._onMouseDown(e, capturePointerId))); + this._setupMouseWheelZoomListener(); + this._context.addEventHandler(this); + } + _setupMouseWheelZoomListener() { + const classifier = MouseWheelClassifier.INSTANCE; + let prevMouseWheelTime = 0; + let gestureStartZoomLevel = EditorZoom.getZoomLevel(); + let gestureHasZoomModifiers = false; + let gestureAccumulatedDelta = 0; + const onMouseWheel = (browserEvent) => { + this.viewController.emitMouseWheel(browserEvent); + if (!this._context.configuration.options.get( + 76 + /* EditorOption.mouseWheelZoom */ + )) { + return; + } + const e = new StandardWheelEvent(browserEvent); + classifier.acceptStandardWheelEvent(e); + if (classifier.isPhysicalMouseWheel()) { + if (hasMouseWheelZoomModifiers(browserEvent)) { + const zoomLevel = EditorZoom.getZoomLevel(); + const delta = e.deltaY > 0 ? 1 : -1; + EditorZoom.setZoomLevel(zoomLevel + delta); + e.preventDefault(); + e.stopPropagation(); + } + } else { + if (Date.now() - prevMouseWheelTime > 50) { + gestureStartZoomLevel = EditorZoom.getZoomLevel(); + gestureHasZoomModifiers = hasMouseWheelZoomModifiers(browserEvent); + gestureAccumulatedDelta = 0; + } + prevMouseWheelTime = Date.now(); + gestureAccumulatedDelta += e.deltaY; + if (gestureHasZoomModifiers) { + EditorZoom.setZoomLevel(gestureStartZoomLevel + gestureAccumulatedDelta / 5); + e.preventDefault(); + e.stopPropagation(); + } + } + }; + this._register(addDisposableListener(this.viewHelper.viewDomNode, EventType.MOUSE_WHEEL, onMouseWheel, { capture: true, passive: false })); + function hasMouseWheelZoomModifiers(browserEvent) { + return isMacintosh ? (browserEvent.metaKey || browserEvent.ctrlKey) && !browserEvent.shiftKey && !browserEvent.altKey : browserEvent.ctrlKey && !browserEvent.metaKey && !browserEvent.shiftKey && !browserEvent.altKey; + } + } + dispose() { + this._context.removeEventHandler(this); + if (this._mouseLeaveMonitor) { + this._mouseLeaveMonitor.dispose(); + this._mouseLeaveMonitor = null; + } + super.dispose(); + } + // --- begin event handlers + onConfigurationChanged(e) { + if (e.hasChanged( + 145 + /* EditorOption.layoutInfo */ + )) { + const height = this._context.configuration.options.get( + 145 + /* EditorOption.layoutInfo */ + ).height; + if (this._height !== height) { + this._height = height; + this._mouseDownOperation.onHeightChanged(); + } + } + return false; + } + onCursorStateChanged(e) { + this._mouseDownOperation.onCursorStateChanged(e); + return false; + } + onFocusChanged(e) { + return false; + } + // --- end event handlers + getTargetAtClientPoint(clientX, clientY) { + const clientPos = new ClientCoordinates(clientX, clientY); + const pos = clientPos.toPageCoordinates(getWindow(this.viewHelper.viewDomNode)); + const editorPos = createEditorPagePosition(this.viewHelper.viewDomNode); + if (pos.y < editorPos.y || pos.y > editorPos.y + editorPos.height || pos.x < editorPos.x || pos.x > editorPos.x + editorPos.width) { + return null; + } + const relativePos = createCoordinatesRelativeToEditor(this.viewHelper.viewDomNode, editorPos, pos); + return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(), editorPos, pos, relativePos, null); + } + _createMouseTarget(e, testEventTarget) { + let target = e.target; + if (!this.viewHelper.viewDomNode.contains(target)) { + const shadowRoot = getShadowRoot(this.viewHelper.viewDomNode); + if (shadowRoot) { + target = shadowRoot.elementsFromPoint(e.posx, e.posy).find((el) => this.viewHelper.viewDomNode.contains(el)); + } + } + return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(), e.editorPos, e.pos, e.relativePos, testEventTarget ? target : null); + } + _getMouseColumn(e) { + return this.mouseTargetFactory.getMouseColumn(e.relativePos); + } + _onContextMenu(e, testEventTarget) { + this.viewController.emitContextMenu({ + event: e, + target: this._createMouseTarget(e, testEventTarget) + }); + } + _onMouseMove(e) { + const targetIsWidget = this.mouseTargetFactory.mouseTargetIsWidget(e); + if (!targetIsWidget) { + e.preventDefault(); + } + if (this._mouseDownOperation.isActive()) { + return; + } + const actualMouseMoveTime = e.timestamp; + if (actualMouseMoveTime < this.lastMouseLeaveTime) { + return; + } + this.viewController.emitMouseMove({ + event: e, + target: this._createMouseTarget(e, true) + }); + } + _onMouseLeave(e) { + if (this._mouseLeaveMonitor) { + this._mouseLeaveMonitor.dispose(); + this._mouseLeaveMonitor = null; + } + this.lastMouseLeaveTime = (/* @__PURE__ */ new Date()).getTime(); + this.viewController.emitMouseLeave({ + event: e, + target: null + }); + } + _onMouseUp(e) { + this.viewController.emitMouseUp({ + event: e, + target: this._createMouseTarget(e, true) + }); + } + _onMouseDown(e, pointerId) { + const t4 = this._createMouseTarget(e, true); + const targetIsContent = t4.type === 6 || t4.type === 7; + const targetIsGutter = t4.type === 2 || t4.type === 3 || t4.type === 4; + const targetIsLineNumbers = t4.type === 3; + const selectOnLineNumbers = this._context.configuration.options.get( + 109 + /* EditorOption.selectOnLineNumbers */ + ); + const targetIsViewZone = t4.type === 8 || t4.type === 5; + const targetIsWidget = t4.type === 9; + let shouldHandle = e.leftButton || e.middleButton; + if (isMacintosh && e.leftButton && e.ctrlKey) { + shouldHandle = false; + } + const focus = () => { + e.preventDefault(); + this.viewHelper.focusTextArea(); + }; + if (shouldHandle && (targetIsContent || targetIsLineNumbers && selectOnLineNumbers)) { + focus(); + this._mouseDownOperation.start(t4.type, e, pointerId); + } else if (targetIsGutter) { + e.preventDefault(); + } else if (targetIsViewZone) { + const viewZoneData = t4.detail; + if (shouldHandle && this.viewHelper.shouldSuppressMouseDownOnViewZone(viewZoneData.viewZoneId)) { + focus(); + this._mouseDownOperation.start(t4.type, e, pointerId); + e.preventDefault(); + } + } else if (targetIsWidget && this.viewHelper.shouldSuppressMouseDownOnWidget(t4.detail)) { + focus(); + e.preventDefault(); + } + this.viewController.emitMouseDown({ + event: e, + target: t4 + }); + } + }; + MouseDownOperation = class extends Disposable { + constructor(_context, _viewController, _viewHelper, _mouseTargetFactory, createMouseTarget, getMouseColumn) { + super(); + this._context = _context; + this._viewController = _viewController; + this._viewHelper = _viewHelper; + this._mouseTargetFactory = _mouseTargetFactory; + this._createMouseTarget = createMouseTarget; + this._getMouseColumn = getMouseColumn; + this._mouseMoveMonitor = this._register(new GlobalEditorPointerMoveMonitor(this._viewHelper.viewDomNode)); + this._topBottomDragScrolling = this._register(new TopBottomDragScrolling(this._context, this._viewHelper, this._mouseTargetFactory, (position, inSelectionMode, revealType) => this._dispatchMouse(position, inSelectionMode, revealType))); + this._mouseState = new MouseDownState(); + this._currentSelection = new Selection(1, 1, 1, 1); + this._isActive = false; + this._lastMouseEvent = null; + } + dispose() { + super.dispose(); + } + isActive() { + return this._isActive; + } + _onMouseDownThenMove(e) { + this._lastMouseEvent = e; + this._mouseState.setModifiers(e); + const position = this._findMousePosition(e, false); + if (!position) { + return; + } + if (this._mouseState.isDragAndDrop) { + this._viewController.emitMouseDrag({ + event: e, + target: position + }); + } else { + if (position.type === 13 && (position.outsidePosition === "above" || position.outsidePosition === "below")) { + this._topBottomDragScrolling.start(position, e); + } else { + this._topBottomDragScrolling.stop(); + this._dispatchMouse( + position, + true, + 1 + /* NavigationCommandRevealType.Minimal */ + ); + } + } + } + start(targetType, e, pointerId) { + this._lastMouseEvent = e; + this._mouseState.setStartedOnLineNumbers( + targetType === 3 + /* MouseTargetType.GUTTER_LINE_NUMBERS */ + ); + this._mouseState.setStartButtons(e); + this._mouseState.setModifiers(e); + const position = this._findMousePosition(e, true); + if (!position || !position.position) { + return; + } + this._mouseState.trySetCount(e.detail, position.position); + e.detail = this._mouseState.count; + const options2 = this._context.configuration.options; + if (!options2.get( + 91 + /* EditorOption.readOnly */ + ) && options2.get( + 35 + /* EditorOption.dragAndDrop */ + ) && !options2.get( + 22 + /* EditorOption.columnSelection */ + ) && !this._mouseState.altKey && e.detail < 2 && !this._isActive && !this._currentSelection.isEmpty() && position.type === 6 && position.position && this._currentSelection.containsPosition(position.position)) { + this._mouseState.isDragAndDrop = true; + this._isActive = true; + this._mouseMoveMonitor.startMonitoring(this._viewHelper.viewLinesDomNode, pointerId, e.buttons, (e2) => this._onMouseDownThenMove(e2), (browserEvent) => { + const position2 = this._findMousePosition(this._lastMouseEvent, false); + if (isKeyboardEvent(browserEvent)) { + this._viewController.emitMouseDropCanceled(); + } else { + this._viewController.emitMouseDrop({ + event: this._lastMouseEvent, + target: position2 ? this._createMouseTarget(this._lastMouseEvent, true) : null + // Ignoring because position is unknown, e.g., Content View Zone + }); + } + this._stop(); + }); + return; + } + this._mouseState.isDragAndDrop = false; + this._dispatchMouse( + position, + e.shiftKey, + 1 + /* NavigationCommandRevealType.Minimal */ + ); + if (!this._isActive) { + this._isActive = true; + this._mouseMoveMonitor.startMonitoring(this._viewHelper.viewLinesDomNode, pointerId, e.buttons, (e2) => this._onMouseDownThenMove(e2), () => this._stop()); + } + } + _stop() { + this._isActive = false; + this._topBottomDragScrolling.stop(); + } + onHeightChanged() { + this._mouseMoveMonitor.stopMonitoring(); + } + onPointerUp() { + this._mouseMoveMonitor.stopMonitoring(); + } + onCursorStateChanged(e) { + this._currentSelection = e.selections[0]; + } + _getPositionOutsideEditor(e) { + const editorContent = e.editorPos; + const model = this._context.viewModel; + const viewLayout = this._context.viewLayout; + const mouseColumn = this._getMouseColumn(e); + if (e.posy < editorContent.y) { + const outsideDistance = editorContent.y - e.posy; + const verticalOffset = Math.max(viewLayout.getCurrentScrollTop() - outsideDistance, 0); + const viewZoneData = HitTestContext.getZoneAtCoord(this._context, verticalOffset); + if (viewZoneData) { + const newPosition = this._helpPositionJumpOverViewZone(viewZoneData); + if (newPosition) { + return MouseTarget.createOutsideEditor(mouseColumn, newPosition, "above", outsideDistance); + } + } + const aboveLineNumber = viewLayout.getLineNumberAtVerticalOffset(verticalOffset); + return MouseTarget.createOutsideEditor(mouseColumn, new Position(aboveLineNumber, 1), "above", outsideDistance); + } + if (e.posy > editorContent.y + editorContent.height) { + const outsideDistance = e.posy - editorContent.y - editorContent.height; + const verticalOffset = viewLayout.getCurrentScrollTop() + e.relativePos.y; + const viewZoneData = HitTestContext.getZoneAtCoord(this._context, verticalOffset); + if (viewZoneData) { + const newPosition = this._helpPositionJumpOverViewZone(viewZoneData); + if (newPosition) { + return MouseTarget.createOutsideEditor(mouseColumn, newPosition, "below", outsideDistance); + } + } + const belowLineNumber = viewLayout.getLineNumberAtVerticalOffset(verticalOffset); + return MouseTarget.createOutsideEditor(mouseColumn, new Position(belowLineNumber, model.getLineMaxColumn(belowLineNumber)), "below", outsideDistance); + } + const possibleLineNumber = viewLayout.getLineNumberAtVerticalOffset(viewLayout.getCurrentScrollTop() + e.relativePos.y); + if (e.posx < editorContent.x) { + const outsideDistance = editorContent.x - e.posx; + return MouseTarget.createOutsideEditor(mouseColumn, new Position(possibleLineNumber, 1), "left", outsideDistance); + } + if (e.posx > editorContent.x + editorContent.width) { + const outsideDistance = e.posx - editorContent.x - editorContent.width; + return MouseTarget.createOutsideEditor(mouseColumn, new Position(possibleLineNumber, model.getLineMaxColumn(possibleLineNumber)), "right", outsideDistance); + } + return null; + } + _findMousePosition(e, testEventTarget) { + const positionOutsideEditor = this._getPositionOutsideEditor(e); + if (positionOutsideEditor) { + return positionOutsideEditor; + } + const t4 = this._createMouseTarget(e, testEventTarget); + const hintedPosition = t4.position; + if (!hintedPosition) { + return null; + } + if (t4.type === 8 || t4.type === 5) { + const newPosition = this._helpPositionJumpOverViewZone(t4.detail); + if (newPosition) { + return MouseTarget.createViewZone(t4.type, t4.element, t4.mouseColumn, newPosition, t4.detail); + } + } + return t4; + } + _helpPositionJumpOverViewZone(viewZoneData) { + const selectionStart = new Position(this._currentSelection.selectionStartLineNumber, this._currentSelection.selectionStartColumn); + const positionBefore = viewZoneData.positionBefore; + const positionAfter = viewZoneData.positionAfter; + if (positionBefore && positionAfter) { + if (positionBefore.isBefore(selectionStart)) { + return positionBefore; + } else { + return positionAfter; + } + } + return null; + } + _dispatchMouse(position, inSelectionMode, revealType) { + if (!position.position) { + return; + } + this._viewController.dispatchMouse({ + position: position.position, + mouseColumn: position.mouseColumn, + startedOnLineNumbers: this._mouseState.startedOnLineNumbers, + revealType, + inSelectionMode, + mouseDownCount: this._mouseState.count, + altKey: this._mouseState.altKey, + ctrlKey: this._mouseState.ctrlKey, + metaKey: this._mouseState.metaKey, + shiftKey: this._mouseState.shiftKey, + leftButton: this._mouseState.leftButton, + middleButton: this._mouseState.middleButton, + onInjectedText: position.type === 6 && position.detail.injectedText !== null + }); + } + }; + TopBottomDragScrolling = class extends Disposable { + constructor(_context, _viewHelper, _mouseTargetFactory, _dispatchMouse) { + super(); + this._context = _context; + this._viewHelper = _viewHelper; + this._mouseTargetFactory = _mouseTargetFactory; + this._dispatchMouse = _dispatchMouse; + this._operation = null; + } + dispose() { + super.dispose(); + this.stop(); + } + start(position, mouseEvent) { + if (this._operation) { + this._operation.setPosition(position, mouseEvent); + } else { + this._operation = new TopBottomDragScrollingOperation(this._context, this._viewHelper, this._mouseTargetFactory, this._dispatchMouse, position, mouseEvent); + } + } + stop() { + if (this._operation) { + this._operation.dispose(); + this._operation = null; + } + } + }; + TopBottomDragScrollingOperation = class extends Disposable { + constructor(_context, _viewHelper, _mouseTargetFactory, _dispatchMouse, position, mouseEvent) { + super(); + this._context = _context; + this._viewHelper = _viewHelper; + this._mouseTargetFactory = _mouseTargetFactory; + this._dispatchMouse = _dispatchMouse; + this._position = position; + this._mouseEvent = mouseEvent; + this._lastTime = Date.now(); + this._animationFrameDisposable = scheduleAtNextAnimationFrame(getWindow(mouseEvent.browserEvent), () => this._execute()); + } + dispose() { + this._animationFrameDisposable.dispose(); + super.dispose(); + } + setPosition(position, mouseEvent) { + this._position = position; + this._mouseEvent = mouseEvent; + } + /** + * update internal state and return elapsed ms since last time + */ + _tick() { + const now = Date.now(); + const elapsed = now - this._lastTime; + this._lastTime = now; + return elapsed; + } + /** + * get the number of lines per second to auto-scroll + */ + _getScrollSpeed() { + const lineHeight = this._context.configuration.options.get( + 67 + /* EditorOption.lineHeight */ + ); + const viewportInLines = this._context.configuration.options.get( + 145 + /* EditorOption.layoutInfo */ + ).height / lineHeight; + const outsideDistanceInLines = this._position.outsideDistance / lineHeight; + if (outsideDistanceInLines <= 1.5) { + return Math.max(30, viewportInLines * (1 + outsideDistanceInLines)); + } + if (outsideDistanceInLines <= 3) { + return Math.max(60, viewportInLines * (2 + outsideDistanceInLines)); + } + return Math.max(200, viewportInLines * (7 + outsideDistanceInLines)); + } + _execute() { + const lineHeight = this._context.configuration.options.get( + 67 + /* EditorOption.lineHeight */ + ); + const scrollSpeedInLines = this._getScrollSpeed(); + const elapsed = this._tick(); + const scrollInPixels = scrollSpeedInLines * (elapsed / 1e3) * lineHeight; + const scrollValue = this._position.outsidePosition === "above" ? -scrollInPixels : scrollInPixels; + this._context.viewModel.viewLayout.deltaScrollNow(0, scrollValue); + this._viewHelper.renderNow(); + const viewportData = this._context.viewLayout.getLinesViewportData(); + const edgeLineNumber = this._position.outsidePosition === "above" ? viewportData.startLineNumber : viewportData.endLineNumber; + let mouseTarget; + { + const editorPos = createEditorPagePosition(this._viewHelper.viewDomNode); + const horizontalScrollbarHeight = this._context.configuration.options.get( + 145 + /* EditorOption.layoutInfo */ + ).horizontalScrollbarHeight; + const pos = new PageCoordinates(this._mouseEvent.pos.x, editorPos.y + editorPos.height - horizontalScrollbarHeight - 0.1); + const relativePos = createCoordinatesRelativeToEditor(this._viewHelper.viewDomNode, editorPos, pos); + mouseTarget = this._mouseTargetFactory.createMouseTarget(this._viewHelper.getLastRenderData(), editorPos, pos, relativePos, null); + } + if (!mouseTarget.position || mouseTarget.position.lineNumber !== edgeLineNumber) { + if (this._position.outsidePosition === "above") { + mouseTarget = MouseTarget.createOutsideEditor(this._position.mouseColumn, new Position(edgeLineNumber, 1), "above", this._position.outsideDistance); + } else { + mouseTarget = MouseTarget.createOutsideEditor(this._position.mouseColumn, new Position(edgeLineNumber, this._context.viewModel.getLineMaxColumn(edgeLineNumber)), "below", this._position.outsideDistance); + } + } + this._dispatchMouse( + mouseTarget, + true, + 2 + /* NavigationCommandRevealType.None */ + ); + this._animationFrameDisposable = scheduleAtNextAnimationFrame(getWindow(mouseTarget.element), () => this._execute()); + } + }; + MouseDownState = class _MouseDownState { + get altKey() { + return this._altKey; + } + get ctrlKey() { + return this._ctrlKey; + } + get metaKey() { + return this._metaKey; + } + get shiftKey() { + return this._shiftKey; + } + get leftButton() { + return this._leftButton; + } + get middleButton() { + return this._middleButton; + } + get startedOnLineNumbers() { + return this._startedOnLineNumbers; + } + constructor() { + this._altKey = false; + this._ctrlKey = false; + this._metaKey = false; + this._shiftKey = false; + this._leftButton = false; + this._middleButton = false; + this._startedOnLineNumbers = false; + this._lastMouseDownPosition = null; + this._lastMouseDownPositionEqualCount = 0; + this._lastMouseDownCount = 0; + this._lastSetMouseDownCountTime = 0; + this.isDragAndDrop = false; + } + get count() { + return this._lastMouseDownCount; + } + setModifiers(source) { + this._altKey = source.altKey; + this._ctrlKey = source.ctrlKey; + this._metaKey = source.metaKey; + this._shiftKey = source.shiftKey; + } + setStartButtons(source) { + this._leftButton = source.leftButton; + this._middleButton = source.middleButton; + } + setStartedOnLineNumbers(startedOnLineNumbers) { + this._startedOnLineNumbers = startedOnLineNumbers; + } + trySetCount(setMouseDownCount, newMouseDownPosition) { + const currentTime = (/* @__PURE__ */ new Date()).getTime(); + if (currentTime - this._lastSetMouseDownCountTime > _MouseDownState.CLEAR_MOUSE_DOWN_COUNT_TIME) { + setMouseDownCount = 1; + } + this._lastSetMouseDownCountTime = currentTime; + if (setMouseDownCount > this._lastMouseDownCount + 1) { + setMouseDownCount = this._lastMouseDownCount + 1; + } + if (this._lastMouseDownPosition && this._lastMouseDownPosition.equals(newMouseDownPosition)) { + this._lastMouseDownPositionEqualCount++; + } else { + this._lastMouseDownPositionEqualCount = 1; + } + this._lastMouseDownPosition = newMouseDownPosition; + this._lastMouseDownCount = Math.min(setMouseDownCount, this._lastMouseDownPositionEqualCount); + } + }; + MouseDownState.CLEAR_MOUSE_DOWN_COUNT_TIME = 400; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/event.js +var DomEmitter; +var init_event2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/event.js"() { + init_event(); + DomEmitter = class { + get event() { + return this.emitter.event; + } + constructor(element, type, useCapture) { + const fn = (e) => this.emitter.fire(e); + this.emitter = new Emitter({ + onWillAddFirstListener: () => element.addEventListener(type, fn, useCapture), + onDidRemoveLastListener: () => element.removeEventListener(type, fn, useCapture) + }); + } + dispose() { + this.emitter.dispose(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/controller/textAreaState.js +var _debugComposition, TextAreaState, PagedScreenReaderStrategy; +var init_textAreaState = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/controller/textAreaState.js"() { + init_strings(); + init_range(); + _debugComposition = false; + TextAreaState = class _TextAreaState { + constructor(value, selectionStart, selectionEnd, selection, newlineCountBeforeSelection) { + this.value = value; + this.selectionStart = selectionStart; + this.selectionEnd = selectionEnd; + this.selection = selection; + this.newlineCountBeforeSelection = newlineCountBeforeSelection; + } + toString() { + return `[ <${this.value}>, selectionStart: ${this.selectionStart}, selectionEnd: ${this.selectionEnd}]`; + } + static readFromTextArea(textArea, previousState) { + const value = textArea.getValue(); + const selectionStart = textArea.getSelectionStart(); + const selectionEnd = textArea.getSelectionEnd(); + let newlineCountBeforeSelection = void 0; + if (previousState) { + const valueBeforeSelectionStart = value.substring(0, selectionStart); + const previousValueBeforeSelectionStart = previousState.value.substring(0, previousState.selectionStart); + if (valueBeforeSelectionStart === previousValueBeforeSelectionStart) { + newlineCountBeforeSelection = previousState.newlineCountBeforeSelection; + } + } + return new _TextAreaState(value, selectionStart, selectionEnd, null, newlineCountBeforeSelection); + } + collapseSelection() { + if (this.selectionStart === this.value.length) { + return this; + } + return new _TextAreaState(this.value, this.value.length, this.value.length, null, void 0); + } + writeToTextArea(reason, textArea, select) { + if (_debugComposition) { + console.log(`writeToTextArea ${reason}: ${this.toString()}`); + } + textArea.setValue(reason, this.value); + if (select) { + textArea.setSelectionRange(reason, this.selectionStart, this.selectionEnd); + } + } + deduceEditorPosition(offset) { + var _a10, _b4, _c2, _d2, _e2, _f3, _g2, _h2; + if (offset <= this.selectionStart) { + const str = this.value.substring(offset, this.selectionStart); + return this._finishDeduceEditorPosition((_b4 = (_a10 = this.selection) === null || _a10 === void 0 ? void 0 : _a10.getStartPosition()) !== null && _b4 !== void 0 ? _b4 : null, str, -1); + } + if (offset >= this.selectionEnd) { + const str = this.value.substring(this.selectionEnd, offset); + return this._finishDeduceEditorPosition((_d2 = (_c2 = this.selection) === null || _c2 === void 0 ? void 0 : _c2.getEndPosition()) !== null && _d2 !== void 0 ? _d2 : null, str, 1); + } + const str1 = this.value.substring(this.selectionStart, offset); + if (str1.indexOf(String.fromCharCode(8230)) === -1) { + return this._finishDeduceEditorPosition((_f3 = (_e2 = this.selection) === null || _e2 === void 0 ? void 0 : _e2.getStartPosition()) !== null && _f3 !== void 0 ? _f3 : null, str1, 1); + } + const str2 = this.value.substring(offset, this.selectionEnd); + return this._finishDeduceEditorPosition((_h2 = (_g2 = this.selection) === null || _g2 === void 0 ? void 0 : _g2.getEndPosition()) !== null && _h2 !== void 0 ? _h2 : null, str2, -1); + } + _finishDeduceEditorPosition(anchor, deltaText, signum) { + let lineFeedCnt = 0; + let lastLineFeedIndex = -1; + while ((lastLineFeedIndex = deltaText.indexOf("\n", lastLineFeedIndex + 1)) !== -1) { + lineFeedCnt++; + } + return [anchor, signum * deltaText.length, lineFeedCnt]; + } + static deduceInput(previousState, currentState, couldBeEmojiInput) { + if (!previousState) { + return { + text: "", + replacePrevCharCnt: 0, + replaceNextCharCnt: 0, + positionDelta: 0 + }; + } + if (_debugComposition) { + console.log("------------------------deduceInput"); + console.log(`PREVIOUS STATE: ${previousState.toString()}`); + console.log(`CURRENT STATE: ${currentState.toString()}`); + } + const prefixLength = Math.min(commonPrefixLength(previousState.value, currentState.value), previousState.selectionStart, currentState.selectionStart); + const suffixLength = Math.min(commonSuffixLength(previousState.value, currentState.value), previousState.value.length - previousState.selectionEnd, currentState.value.length - currentState.selectionEnd); + const previousValue = previousState.value.substring(prefixLength, previousState.value.length - suffixLength); + const currentValue = currentState.value.substring(prefixLength, currentState.value.length - suffixLength); + const previousSelectionStart = previousState.selectionStart - prefixLength; + const previousSelectionEnd = previousState.selectionEnd - prefixLength; + const currentSelectionStart = currentState.selectionStart - prefixLength; + const currentSelectionEnd = currentState.selectionEnd - prefixLength; + if (_debugComposition) { + console.log(`AFTER DIFFING PREVIOUS STATE: <${previousValue}>, selectionStart: ${previousSelectionStart}, selectionEnd: ${previousSelectionEnd}`); + console.log(`AFTER DIFFING CURRENT STATE: <${currentValue}>, selectionStart: ${currentSelectionStart}, selectionEnd: ${currentSelectionEnd}`); + } + if (currentSelectionStart === currentSelectionEnd) { + const replacePreviousCharacters2 = previousState.selectionStart - prefixLength; + if (_debugComposition) { + console.log(`REMOVE PREVIOUS: ${replacePreviousCharacters2} chars`); + } + return { + text: currentValue, + replacePrevCharCnt: replacePreviousCharacters2, + replaceNextCharCnt: 0, + positionDelta: 0 + }; + } + const replacePreviousCharacters = previousSelectionEnd - previousSelectionStart; + return { + text: currentValue, + replacePrevCharCnt: replacePreviousCharacters, + replaceNextCharCnt: 0, + positionDelta: 0 + }; + } + static deduceAndroidCompositionInput(previousState, currentState) { + if (!previousState) { + return { + text: "", + replacePrevCharCnt: 0, + replaceNextCharCnt: 0, + positionDelta: 0 + }; + } + if (_debugComposition) { + console.log("------------------------deduceAndroidCompositionInput"); + console.log(`PREVIOUS STATE: ${previousState.toString()}`); + console.log(`CURRENT STATE: ${currentState.toString()}`); + } + if (previousState.value === currentState.value) { + return { + text: "", + replacePrevCharCnt: 0, + replaceNextCharCnt: 0, + positionDelta: currentState.selectionEnd - previousState.selectionEnd + }; + } + const prefixLength = Math.min(commonPrefixLength(previousState.value, currentState.value), previousState.selectionEnd); + const suffixLength = Math.min(commonSuffixLength(previousState.value, currentState.value), previousState.value.length - previousState.selectionEnd); + const previousValue = previousState.value.substring(prefixLength, previousState.value.length - suffixLength); + const currentValue = currentState.value.substring(prefixLength, currentState.value.length - suffixLength); + const previousSelectionStart = previousState.selectionStart - prefixLength; + const previousSelectionEnd = previousState.selectionEnd - prefixLength; + const currentSelectionStart = currentState.selectionStart - prefixLength; + const currentSelectionEnd = currentState.selectionEnd - prefixLength; + if (_debugComposition) { + console.log(`AFTER DIFFING PREVIOUS STATE: <${previousValue}>, selectionStart: ${previousSelectionStart}, selectionEnd: ${previousSelectionEnd}`); + console.log(`AFTER DIFFING CURRENT STATE: <${currentValue}>, selectionStart: ${currentSelectionStart}, selectionEnd: ${currentSelectionEnd}`); + } + return { + text: currentValue, + replacePrevCharCnt: previousSelectionEnd, + replaceNextCharCnt: previousValue.length - previousSelectionEnd, + positionDelta: currentSelectionEnd - currentValue.length + }; + } + }; + TextAreaState.EMPTY = new TextAreaState("", 0, 0, null, void 0); + PagedScreenReaderStrategy = class _PagedScreenReaderStrategy { + static _getPageOfLine(lineNumber, linesPerPage) { + return Math.floor((lineNumber - 1) / linesPerPage); + } + static _getRangeForPage(page, linesPerPage) { + const offset = page * linesPerPage; + const startLineNumber = offset + 1; + const endLineNumber = offset + linesPerPage; + return new Range(startLineNumber, 1, endLineNumber + 1, 1); + } + static fromEditorSelection(model, selection, linesPerPage, trimLongText) { + const LIMIT_CHARS = 500; + const selectionStartPage = _PagedScreenReaderStrategy._getPageOfLine(selection.startLineNumber, linesPerPage); + const selectionStartPageRange = _PagedScreenReaderStrategy._getRangeForPage(selectionStartPage, linesPerPage); + const selectionEndPage = _PagedScreenReaderStrategy._getPageOfLine(selection.endLineNumber, linesPerPage); + const selectionEndPageRange = _PagedScreenReaderStrategy._getRangeForPage(selectionEndPage, linesPerPage); + let pretextRange = selectionStartPageRange.intersectRanges(new Range(1, 1, selection.startLineNumber, selection.startColumn)); + if (trimLongText && model.getValueLengthInRange( + pretextRange, + 1 + /* EndOfLinePreference.LF */ + ) > LIMIT_CHARS) { + const pretextStart = model.modifyPosition(pretextRange.getEndPosition(), -LIMIT_CHARS); + pretextRange = Range.fromPositions(pretextStart, pretextRange.getEndPosition()); + } + const pretext = model.getValueInRange( + pretextRange, + 1 + /* EndOfLinePreference.LF */ + ); + const lastLine = model.getLineCount(); + const lastLineMaxColumn = model.getLineMaxColumn(lastLine); + let posttextRange = selectionEndPageRange.intersectRanges(new Range(selection.endLineNumber, selection.endColumn, lastLine, lastLineMaxColumn)); + if (trimLongText && model.getValueLengthInRange( + posttextRange, + 1 + /* EndOfLinePreference.LF */ + ) > LIMIT_CHARS) { + const posttextEnd = model.modifyPosition(posttextRange.getStartPosition(), LIMIT_CHARS); + posttextRange = Range.fromPositions(posttextRange.getStartPosition(), posttextEnd); + } + const posttext = model.getValueInRange( + posttextRange, + 1 + /* EndOfLinePreference.LF */ + ); + let text2; + if (selectionStartPage === selectionEndPage || selectionStartPage + 1 === selectionEndPage) { + text2 = model.getValueInRange( + selection, + 1 + /* EndOfLinePreference.LF */ + ); + } else { + const selectionRange1 = selectionStartPageRange.intersectRanges(selection); + const selectionRange2 = selectionEndPageRange.intersectRanges(selection); + text2 = model.getValueInRange( + selectionRange1, + 1 + /* EndOfLinePreference.LF */ + ) + String.fromCharCode(8230) + model.getValueInRange( + selectionRange2, + 1 + /* EndOfLinePreference.LF */ + ); + } + if (trimLongText && text2.length > 2 * LIMIT_CHARS) { + text2 = text2.substring(0, LIMIT_CHARS) + String.fromCharCode(8230) + text2.substring(text2.length - LIMIT_CHARS, text2.length); + } + return new TextAreaState(pretext + text2 + posttext, pretext.length, pretext.length + text2.length, selection, pretextRange.endLineNumber - pretextRange.startLineNumber); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/controller/textAreaInput.js +var __decorate8, __param7, TextAreaSyntethicEvents, CopyOptions, InMemoryClipboardMetadataManager, CompositionContext, TextAreaInput, ClipboardEventUtils, TextAreaWrapper; +var init_textAreaInput = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/controller/textAreaInput.js"() { + init_browser(); + init_dom(); + init_event2(); + init_keyboardEvent(); + init_performance(); + init_async(); + init_event(); + init_lifecycle(); + init_mime(); + init_strings(); + init_textAreaState(); + init_selection(); + init_accessibility(); + init_log(); + __decorate8 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param7 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + (function(TextAreaSyntethicEvents2) { + TextAreaSyntethicEvents2.Tap = "-monaco-textarea-synthetic-tap"; + })(TextAreaSyntethicEvents || (TextAreaSyntethicEvents = {})); + CopyOptions = { + forceCopyWithSyntaxHighlighting: false + }; + InMemoryClipboardMetadataManager = class { + constructor() { + this._lastState = null; + } + set(lastCopiedValue, data) { + this._lastState = { lastCopiedValue, data }; + } + get(pastedText) { + if (this._lastState && this._lastState.lastCopiedValue === pastedText) { + return this._lastState.data; + } + this._lastState = null; + return null; + } + }; + InMemoryClipboardMetadataManager.INSTANCE = new InMemoryClipboardMetadataManager(); + CompositionContext = class { + constructor() { + this._lastTypeTextLength = 0; + } + handleCompositionUpdate(text2) { + text2 = text2 || ""; + const typeInput = { + text: text2, + replacePrevCharCnt: this._lastTypeTextLength, + replaceNextCharCnt: 0, + positionDelta: 0 + }; + this._lastTypeTextLength = text2.length; + return typeInput; + } + }; + TextAreaInput = class TextAreaInput2 extends Disposable { + get textAreaState() { + return this._textAreaState; + } + constructor(_host, _textArea, _OS, _browser, _accessibilityService, _logService) { + super(); + this._host = _host; + this._textArea = _textArea; + this._OS = _OS; + this._browser = _browser; + this._accessibilityService = _accessibilityService; + this._logService = _logService; + this._onFocus = this._register(new Emitter()); + this.onFocus = this._onFocus.event; + this._onBlur = this._register(new Emitter()); + this.onBlur = this._onBlur.event; + this._onKeyDown = this._register(new Emitter()); + this.onKeyDown = this._onKeyDown.event; + this._onKeyUp = this._register(new Emitter()); + this.onKeyUp = this._onKeyUp.event; + this._onCut = this._register(new Emitter()); + this.onCut = this._onCut.event; + this._onPaste = this._register(new Emitter()); + this.onPaste = this._onPaste.event; + this._onType = this._register(new Emitter()); + this.onType = this._onType.event; + this._onCompositionStart = this._register(new Emitter()); + this.onCompositionStart = this._onCompositionStart.event; + this._onCompositionUpdate = this._register(new Emitter()); + this.onCompositionUpdate = this._onCompositionUpdate.event; + this._onCompositionEnd = this._register(new Emitter()); + this.onCompositionEnd = this._onCompositionEnd.event; + this._onSelectionChangeRequest = this._register(new Emitter()); + this.onSelectionChangeRequest = this._onSelectionChangeRequest.event; + this._asyncFocusGainWriteScreenReaderContent = this._register(new MutableDisposable()); + this._asyncTriggerCut = this._register(new RunOnceScheduler(() => this._onCut.fire(), 0)); + this._textAreaState = TextAreaState.EMPTY; + this._selectionChangeListener = null; + if (this._accessibilityService.isScreenReaderOptimized()) { + this.writeNativeTextAreaContent("ctor"); + } + this._register(Event.runAndSubscribe(this._accessibilityService.onDidChangeScreenReaderOptimized, () => { + if (this._accessibilityService.isScreenReaderOptimized() && !this._asyncFocusGainWriteScreenReaderContent.value) { + this._asyncFocusGainWriteScreenReaderContent.value = this._register(new RunOnceScheduler(() => this.writeNativeTextAreaContent("asyncFocusGain"), 0)); + } else { + this._asyncFocusGainWriteScreenReaderContent.clear(); + } + })); + this._hasFocus = false; + this._currentComposition = null; + let lastKeyDown = null; + this._register(this._textArea.onKeyDown((_e2) => { + const e = new StandardKeyboardEvent(_e2); + if (e.keyCode === 114 || this._currentComposition && e.keyCode === 1) { + e.stopPropagation(); + } + if (e.equals( + 9 + /* KeyCode.Escape */ + )) { + e.preventDefault(); + } + lastKeyDown = e; + this._onKeyDown.fire(e); + })); + this._register(this._textArea.onKeyUp((_e2) => { + const e = new StandardKeyboardEvent(_e2); + this._onKeyUp.fire(e); + })); + this._register(this._textArea.onCompositionStart((e) => { + if (_debugComposition) { + console.log(`[compositionstart]`, e); + } + const currentComposition = new CompositionContext(); + if (this._currentComposition) { + this._currentComposition = currentComposition; + return; + } + this._currentComposition = currentComposition; + if (this._OS === 2 && lastKeyDown && lastKeyDown.equals( + 114 + /* KeyCode.KEY_IN_COMPOSITION */ + ) && this._textAreaState.selectionStart === this._textAreaState.selectionEnd && this._textAreaState.selectionStart > 0 && this._textAreaState.value.substr(this._textAreaState.selectionStart - 1, 1) === e.data && (lastKeyDown.code === "ArrowRight" || lastKeyDown.code === "ArrowLeft")) { + if (_debugComposition) { + console.log(`[compositionstart] Handling long press case on macOS + arrow key`, e); + } + currentComposition.handleCompositionUpdate("x"); + this._onCompositionStart.fire({ data: e.data }); + return; + } + if (this._browser.isAndroid) { + this._onCompositionStart.fire({ data: e.data }); + return; + } + this._onCompositionStart.fire({ data: e.data }); + })); + this._register(this._textArea.onCompositionUpdate((e) => { + if (_debugComposition) { + console.log(`[compositionupdate]`, e); + } + const currentComposition = this._currentComposition; + if (!currentComposition) { + return; + } + if (this._browser.isAndroid) { + const newState = TextAreaState.readFromTextArea(this._textArea, this._textAreaState); + const typeInput2 = TextAreaState.deduceAndroidCompositionInput(this._textAreaState, newState); + this._textAreaState = newState; + this._onType.fire(typeInput2); + this._onCompositionUpdate.fire(e); + return; + } + const typeInput = currentComposition.handleCompositionUpdate(e.data); + this._textAreaState = TextAreaState.readFromTextArea(this._textArea, this._textAreaState); + this._onType.fire(typeInput); + this._onCompositionUpdate.fire(e); + })); + this._register(this._textArea.onCompositionEnd((e) => { + if (_debugComposition) { + console.log(`[compositionend]`, e); + } + const currentComposition = this._currentComposition; + if (!currentComposition) { + return; + } + this._currentComposition = null; + if (this._browser.isAndroid) { + const newState = TextAreaState.readFromTextArea(this._textArea, this._textAreaState); + const typeInput2 = TextAreaState.deduceAndroidCompositionInput(this._textAreaState, newState); + this._textAreaState = newState; + this._onType.fire(typeInput2); + this._onCompositionEnd.fire(); + return; + } + const typeInput = currentComposition.handleCompositionUpdate(e.data); + this._textAreaState = TextAreaState.readFromTextArea(this._textArea, this._textAreaState); + this._onType.fire(typeInput); + this._onCompositionEnd.fire(); + })); + this._register(this._textArea.onInput((e) => { + if (_debugComposition) { + console.log(`[input]`, e); + } + this._textArea.setIgnoreSelectionChangeTime("received input event"); + if (this._currentComposition) { + return; + } + const newState = TextAreaState.readFromTextArea(this._textArea, this._textAreaState); + const typeInput = TextAreaState.deduceInput( + this._textAreaState, + newState, + /*couldBeEmojiInput*/ + this._OS === 2 + /* OperatingSystem.Macintosh */ + ); + if (typeInput.replacePrevCharCnt === 0 && typeInput.text.length === 1) { + if (isHighSurrogate(typeInput.text.charCodeAt(0)) || typeInput.text.charCodeAt(0) === 127) { + return; + } + } + this._textAreaState = newState; + if (typeInput.text !== "" || typeInput.replacePrevCharCnt !== 0 || typeInput.replaceNextCharCnt !== 0 || typeInput.positionDelta !== 0) { + this._onType.fire(typeInput); + } + })); + this._register(this._textArea.onCut((e) => { + this._textArea.setIgnoreSelectionChangeTime("received cut event"); + this._ensureClipboardGetsEditorSelection(e); + this._asyncTriggerCut.schedule(); + })); + this._register(this._textArea.onCopy((e) => { + this._ensureClipboardGetsEditorSelection(e); + })); + this._register(this._textArea.onPaste((e) => { + this._textArea.setIgnoreSelectionChangeTime("received paste event"); + e.preventDefault(); + if (!e.clipboardData) { + return; + } + let [text2, metadata] = ClipboardEventUtils.getTextData(e.clipboardData); + if (!text2) { + return; + } + metadata = metadata || InMemoryClipboardMetadataManager.INSTANCE.get(text2); + this._onPaste.fire({ + text: text2, + metadata + }); + })); + this._register(this._textArea.onFocus(() => { + const hadFocus = this._hasFocus; + this._setHasFocus(true); + if (this._accessibilityService.isScreenReaderOptimized() && this._browser.isSafari && !hadFocus && this._hasFocus) { + if (!this._asyncFocusGainWriteScreenReaderContent.value) { + this._asyncFocusGainWriteScreenReaderContent.value = new RunOnceScheduler(() => this.writeNativeTextAreaContent("asyncFocusGain"), 0); + } + this._asyncFocusGainWriteScreenReaderContent.value.schedule(); + } + })); + this._register(this._textArea.onBlur(() => { + if (this._currentComposition) { + this._currentComposition = null; + this.writeNativeTextAreaContent("blurWithoutCompositionEnd"); + this._onCompositionEnd.fire(); + } + this._setHasFocus(false); + })); + this._register(this._textArea.onSyntheticTap(() => { + if (this._browser.isAndroid && this._currentComposition) { + this._currentComposition = null; + this.writeNativeTextAreaContent("tapWithoutCompositionEnd"); + this._onCompositionEnd.fire(); + } + })); + } + _installSelectionChangeListener() { + let previousSelectionChangeEventTime = 0; + return addDisposableListener(this._textArea.ownerDocument, "selectionchange", (e) => { + inputLatency.onSelectionChange(); + if (!this._hasFocus) { + return; + } + if (this._currentComposition) { + return; + } + if (!this._browser.isChrome) { + return; + } + const now = Date.now(); + const delta1 = now - previousSelectionChangeEventTime; + previousSelectionChangeEventTime = now; + if (delta1 < 5) { + return; + } + const delta2 = now - this._textArea.getIgnoreSelectionChangeTime(); + this._textArea.resetSelectionChangeTime(); + if (delta2 < 100) { + return; + } + if (!this._textAreaState.selection) { + return; + } + const newValue = this._textArea.getValue(); + if (this._textAreaState.value !== newValue) { + return; + } + const newSelectionStart = this._textArea.getSelectionStart(); + const newSelectionEnd = this._textArea.getSelectionEnd(); + if (this._textAreaState.selectionStart === newSelectionStart && this._textAreaState.selectionEnd === newSelectionEnd) { + return; + } + const _newSelectionStartPosition = this._textAreaState.deduceEditorPosition(newSelectionStart); + const newSelectionStartPosition = this._host.deduceModelPosition(_newSelectionStartPosition[0], _newSelectionStartPosition[1], _newSelectionStartPosition[2]); + const _newSelectionEndPosition = this._textAreaState.deduceEditorPosition(newSelectionEnd); + const newSelectionEndPosition = this._host.deduceModelPosition(_newSelectionEndPosition[0], _newSelectionEndPosition[1], _newSelectionEndPosition[2]); + const newSelection = new Selection(newSelectionStartPosition.lineNumber, newSelectionStartPosition.column, newSelectionEndPosition.lineNumber, newSelectionEndPosition.column); + this._onSelectionChangeRequest.fire(newSelection); + }); + } + dispose() { + super.dispose(); + if (this._selectionChangeListener) { + this._selectionChangeListener.dispose(); + this._selectionChangeListener = null; + } + } + focusTextArea() { + this._setHasFocus(true); + this.refreshFocusState(); + } + isFocused() { + return this._hasFocus; + } + refreshFocusState() { + this._setHasFocus(this._textArea.hasFocus()); + } + _setHasFocus(newHasFocus) { + if (this._hasFocus === newHasFocus) { + return; + } + this._hasFocus = newHasFocus; + if (this._selectionChangeListener) { + this._selectionChangeListener.dispose(); + this._selectionChangeListener = null; + } + if (this._hasFocus) { + this._selectionChangeListener = this._installSelectionChangeListener(); + } + if (this._hasFocus) { + this.writeNativeTextAreaContent("focusgain"); + } + if (this._hasFocus) { + this._onFocus.fire(); + } else { + this._onBlur.fire(); + } + } + _setAndWriteTextAreaState(reason, textAreaState) { + if (!this._hasFocus) { + textAreaState = textAreaState.collapseSelection(); + } + textAreaState.writeToTextArea(reason, this._textArea, this._hasFocus); + this._textAreaState = textAreaState; + } + writeNativeTextAreaContent(reason) { + if (!this._accessibilityService.isScreenReaderOptimized() && reason === "render" || this._currentComposition) { + return; + } + this._logService.trace(`writeTextAreaState(reason: ${reason})`); + this._setAndWriteTextAreaState(reason, this._host.getScreenReaderContent()); + } + _ensureClipboardGetsEditorSelection(e) { + const dataToCopy = this._host.getDataToCopy(); + const storedMetadata = { + version: 1, + isFromEmptySelection: dataToCopy.isFromEmptySelection, + multicursorText: dataToCopy.multicursorText, + mode: dataToCopy.mode + }; + InMemoryClipboardMetadataManager.INSTANCE.set( + // When writing "LINE\r\n" to the clipboard and then pasting, + // Firefox pastes "LINE\n", so let's work around this quirk + this._browser.isFirefox ? dataToCopy.text.replace(/\r\n/g, "\n") : dataToCopy.text, + storedMetadata + ); + e.preventDefault(); + if (e.clipboardData) { + ClipboardEventUtils.setTextData(e.clipboardData, dataToCopy.text, dataToCopy.html, storedMetadata); + } + } + }; + TextAreaInput = __decorate8([ + __param7(4, IAccessibilityService), + __param7(5, ILogService) + ], TextAreaInput); + ClipboardEventUtils = { + getTextData(clipboardData) { + const text2 = clipboardData.getData(Mimes.text); + let metadata = null; + const rawmetadata = clipboardData.getData("vscode-editor-data"); + if (typeof rawmetadata === "string") { + try { + metadata = JSON.parse(rawmetadata); + if (metadata.version !== 1) { + metadata = null; + } + } catch (err) { + } + } + if (text2.length === 0 && metadata === null && clipboardData.files.length > 0) { + const files = Array.prototype.slice.call(clipboardData.files, 0); + return [files.map((file) => file.name).join("\n"), null]; + } + return [text2, metadata]; + }, + setTextData(clipboardData, text2, html2, metadata) { + clipboardData.setData(Mimes.text, text2); + if (typeof html2 === "string") { + clipboardData.setData("text/html", html2); + } + clipboardData.setData("vscode-editor-data", JSON.stringify(metadata)); + } + }; + TextAreaWrapper = class extends Disposable { + get ownerDocument() { + return this._actual.ownerDocument; + } + constructor(_actual) { + super(); + this._actual = _actual; + this.onKeyDown = this._register(new DomEmitter(this._actual, "keydown")).event; + this.onKeyUp = this._register(new DomEmitter(this._actual, "keyup")).event; + this.onCompositionStart = this._register(new DomEmitter(this._actual, "compositionstart")).event; + this.onCompositionUpdate = this._register(new DomEmitter(this._actual, "compositionupdate")).event; + this.onCompositionEnd = this._register(new DomEmitter(this._actual, "compositionend")).event; + this.onBeforeInput = this._register(new DomEmitter(this._actual, "beforeinput")).event; + this.onInput = this._register(new DomEmitter(this._actual, "input")).event; + this.onCut = this._register(new DomEmitter(this._actual, "cut")).event; + this.onCopy = this._register(new DomEmitter(this._actual, "copy")).event; + this.onPaste = this._register(new DomEmitter(this._actual, "paste")).event; + this.onFocus = this._register(new DomEmitter(this._actual, "focus")).event; + this.onBlur = this._register(new DomEmitter(this._actual, "blur")).event; + this._onSyntheticTap = this._register(new Emitter()); + this.onSyntheticTap = this._onSyntheticTap.event; + this._ignoreSelectionChangeTime = 0; + this._register(this.onKeyDown(() => inputLatency.onKeyDown())); + this._register(this.onBeforeInput(() => inputLatency.onBeforeInput())); + this._register(this.onInput(() => inputLatency.onInput())); + this._register(this.onKeyUp(() => inputLatency.onKeyUp())); + this._register(addDisposableListener(this._actual, TextAreaSyntethicEvents.Tap, () => this._onSyntheticTap.fire())); + } + hasFocus() { + const shadowRoot = getShadowRoot(this._actual); + if (shadowRoot) { + return shadowRoot.activeElement === this._actual; + } else if (this._actual.isConnected) { + return getActiveElement() === this._actual; + } else { + return false; + } + } + setIgnoreSelectionChangeTime(reason) { + this._ignoreSelectionChangeTime = Date.now(); + } + getIgnoreSelectionChangeTime() { + return this._ignoreSelectionChangeTime; + } + resetSelectionChangeTime() { + this._ignoreSelectionChangeTime = 0; + } + getValue() { + return this._actual.value; + } + setValue(reason, value) { + const textArea = this._actual; + if (textArea.value === value) { + return; + } + this.setIgnoreSelectionChangeTime("setValue"); + textArea.value = value; + } + getSelectionStart() { + return this._actual.selectionDirection === "backward" ? this._actual.selectionEnd : this._actual.selectionStart; + } + getSelectionEnd() { + return this._actual.selectionDirection === "backward" ? this._actual.selectionStart : this._actual.selectionEnd; + } + setSelectionRange(reason, selectionStart, selectionEnd) { + const textArea = this._actual; + let activeElement = null; + const shadowRoot = getShadowRoot(textArea); + if (shadowRoot) { + activeElement = shadowRoot.activeElement; + } else { + activeElement = getActiveElement(); + } + const activeWindow = getWindow(activeElement); + const currentIsFocused = activeElement === textArea; + const currentSelectionStart = textArea.selectionStart; + const currentSelectionEnd = textArea.selectionEnd; + if (currentIsFocused && currentSelectionStart === selectionStart && currentSelectionEnd === selectionEnd) { + if (isFirefox2 && activeWindow.parent !== activeWindow) { + textArea.focus(); + } + return; + } + if (currentIsFocused) { + this.setIgnoreSelectionChangeTime("setSelectionRange"); + textArea.setSelectionRange(selectionStart, selectionEnd); + if (isFirefox2 && activeWindow.parent !== activeWindow) { + textArea.focus(); + } + return; + } + try { + const scrollState = saveParentsScrollTop(textArea); + this.setIgnoreSelectionChangeTime("setSelectionRange"); + textArea.focus(); + textArea.setSelectionRange(selectionStart, selectionEnd); + restoreParentsScrollTop(textArea, scrollState); + } catch (e) { + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/controller/pointerHandler.js +var PointerEventHandler, TouchHandler, PointerHandler; +var init_pointerHandler = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/controller/pointerHandler.js"() { + init_canIUse(); + init_dom(); + init_touch(); + init_window(); + init_lifecycle(); + init_platform(); + init_mouseHandler(); + init_textAreaInput(); + init_editorDom(); + PointerEventHandler = class extends MouseHandler { + constructor(context, viewController, viewHelper) { + super(context, viewController, viewHelper); + this._register(Gesture.addTarget(this.viewHelper.linesContentDomNode)); + this._register(addDisposableListener(this.viewHelper.linesContentDomNode, EventType2.Tap, (e) => this.onTap(e))); + this._register(addDisposableListener(this.viewHelper.linesContentDomNode, EventType2.Change, (e) => this.onChange(e))); + this._register(addDisposableListener(this.viewHelper.linesContentDomNode, EventType2.Contextmenu, (e) => this._onContextMenu(new EditorMouseEvent(e, false, this.viewHelper.viewDomNode), false))); + this._lastPointerType = "mouse"; + this._register(addDisposableListener(this.viewHelper.linesContentDomNode, "pointerdown", (e) => { + const pointerType = e.pointerType; + if (pointerType === "mouse") { + this._lastPointerType = "mouse"; + return; + } else if (pointerType === "touch") { + this._lastPointerType = "touch"; + } else { + this._lastPointerType = "pen"; + } + })); + const pointerEvents = new EditorPointerEventFactory(this.viewHelper.viewDomNode); + this._register(pointerEvents.onPointerMove(this.viewHelper.viewDomNode, (e) => this._onMouseMove(e))); + this._register(pointerEvents.onPointerUp(this.viewHelper.viewDomNode, (e) => this._onMouseUp(e))); + this._register(pointerEvents.onPointerLeave(this.viewHelper.viewDomNode, (e) => this._onMouseLeave(e))); + this._register(pointerEvents.onPointerDown(this.viewHelper.viewDomNode, (e, pointerId) => this._onMouseDown(e, pointerId))); + } + onTap(event) { + if (!event.initialTarget || !this.viewHelper.linesContentDomNode.contains(event.initialTarget)) { + return; + } + event.preventDefault(); + this.viewHelper.focusTextArea(); + this._dispatchGesture( + event, + /*inSelectionMode*/ + false + ); + } + onChange(event) { + if (this._lastPointerType === "touch") { + this._context.viewModel.viewLayout.deltaScrollNow(-event.translationX, -event.translationY); + } + if (this._lastPointerType === "pen") { + this._dispatchGesture( + event, + /*inSelectionMode*/ + true + ); + } + } + _dispatchGesture(event, inSelectionMode) { + const target = this._createMouseTarget(new EditorMouseEvent(event, false, this.viewHelper.viewDomNode), false); + if (target.position) { + this.viewController.dispatchMouse({ + position: target.position, + mouseColumn: target.position.column, + startedOnLineNumbers: false, + revealType: 1, + mouseDownCount: event.tapCount, + inSelectionMode, + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + leftButton: false, + middleButton: false, + onInjectedText: target.type === 6 && target.detail.injectedText !== null + }); + } + } + _onMouseDown(e, pointerId) { + if (e.browserEvent.pointerType === "touch") { + return; + } + super._onMouseDown(e, pointerId); + } + }; + TouchHandler = class extends MouseHandler { + constructor(context, viewController, viewHelper) { + super(context, viewController, viewHelper); + this._register(Gesture.addTarget(this.viewHelper.linesContentDomNode)); + this._register(addDisposableListener(this.viewHelper.linesContentDomNode, EventType2.Tap, (e) => this.onTap(e))); + this._register(addDisposableListener(this.viewHelper.linesContentDomNode, EventType2.Change, (e) => this.onChange(e))); + this._register(addDisposableListener(this.viewHelper.linesContentDomNode, EventType2.Contextmenu, (e) => this._onContextMenu(new EditorMouseEvent(e, false, this.viewHelper.viewDomNode), false))); + } + onTap(event) { + event.preventDefault(); + this.viewHelper.focusTextArea(); + const target = this._createMouseTarget(new EditorMouseEvent(event, false, this.viewHelper.viewDomNode), false); + if (target.position) { + const event2 = document.createEvent("CustomEvent"); + event2.initEvent(TextAreaSyntethicEvents.Tap, false, true); + this.viewHelper.dispatchTextAreaEvent(event2); + this.viewController.moveTo( + target.position, + 1 + /* NavigationCommandRevealType.Minimal */ + ); + } + } + onChange(e) { + this._context.viewModel.viewLayout.deltaScrollNow(-e.translationX, -e.translationY); + } + }; + PointerHandler = class extends Disposable { + constructor(context, viewController, viewHelper) { + super(); + const isPhone = isIOS || isAndroid && isMobile; + if (isPhone && BrowserFeatures.pointerEvents) { + this.handler = this._register(new PointerEventHandler(context, viewController, viewHelper)); + } else if (mainWindow.TouchEvent) { + this.handler = this._register(new TouchHandler(context, viewController, viewHelper)); + } else { + this.handler = this._register(new MouseHandler(context, viewController, viewHelper)); + } + } + getTargetAtClientPoint(clientX, clientY) { + return this.handler.getTargetAtClientPoint(clientX, clientY); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/controller/textAreaHandler.css +var init_textAreaHandler = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/controller/textAreaHandler.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/lineNumbers/lineNumbers.css +var init_lineNumbers = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/lineNumbers/lineNumbers.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/view/dynamicViewOverlay.js +var DynamicViewOverlay; +var init_dynamicViewOverlay = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/view/dynamicViewOverlay.js"() { + init_viewEventHandler(); + DynamicViewOverlay = class extends ViewEventHandler { + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/themeService.js +function themeColorFromId(id) { + return { id }; +} +function getThemeTypeSelector(type) { + switch (type) { + case ColorScheme.DARK: + return "vs-dark"; + case ColorScheme.HIGH_CONTRAST_DARK: + return "hc-black"; + case ColorScheme.HIGH_CONTRAST_LIGHT: + return "hc-light"; + default: + return "vs"; + } +} +function registerThemingParticipant(participant) { + return themingRegistry.onColorThemeChange(participant); +} +var IThemeService, Extensions7, ThemingRegistry, themingRegistry, Themable; +var init_themeService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/themeService.js"() { + init_event(); + init_lifecycle(); + init_instantiation(); + init_platform2(); + init_theme(); + IThemeService = createDecorator("themeService"); + Extensions7 = { + ThemingContribution: "base.contributions.theming" + }; + ThemingRegistry = class { + constructor() { + this.themingParticipants = []; + this.themingParticipants = []; + this.onThemingParticipantAddedEmitter = new Emitter(); + } + onColorThemeChange(participant) { + this.themingParticipants.push(participant); + this.onThemingParticipantAddedEmitter.fire(participant); + return toDisposable(() => { + const idx = this.themingParticipants.indexOf(participant); + this.themingParticipants.splice(idx, 1); + }); + } + getThemingParticipants() { + return this.themingParticipants; + } + }; + themingRegistry = new ThemingRegistry(); + Registry.add(Extensions7.ThemingContribution, themingRegistry); + Themable = class extends Disposable { + constructor(themeService) { + super(); + this.themeService = themeService; + this.theme = themeService.getColorTheme(); + this._register(this.themeService.onDidColorThemeChange((theme) => this.onThemeChange(theme))); + } + onThemeChange(theme) { + this.theme = theme; + this.updateStyles(); + } + updateStyles() { + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/editorColorRegistry.js +var editorLineHighlight, editorLineHighlightBorder, editorRangeHighlight, editorRangeHighlightBorder, editorSymbolHighlight, editorSymbolHighlightBorder, editorCursorForeground, editorCursorBackground, editorMultiCursorPrimaryForeground, editorMultiCursorPrimaryBackground, editorMultiCursorSecondaryForeground, editorMultiCursorSecondaryBackground, editorWhitespaces, editorLineNumbers, deprecatedEditorIndentGuides, deprecatedEditorActiveIndentGuides, editorIndentGuide1, editorIndentGuide2, editorIndentGuide3, editorIndentGuide4, editorIndentGuide5, editorIndentGuide6, editorActiveIndentGuide1, editorActiveIndentGuide2, editorActiveIndentGuide3, editorActiveIndentGuide4, editorActiveIndentGuide5, editorActiveIndentGuide6, deprecatedEditorActiveLineNumber, editorActiveLineNumber, editorDimmedLineNumber, editorRuler, editorCodeLensForeground, editorBracketMatchBackground, editorBracketMatchBorder, editorOverviewRulerBorder, editorOverviewRulerBackground, editorGutter, editorUnnecessaryCodeBorder, editorUnnecessaryCodeOpacity, ghostTextBorder, ghostTextForeground, ghostTextBackground, rulerRangeDefault, overviewRulerRangeHighlight, overviewRulerError, overviewRulerWarning, overviewRulerInfo, editorBracketHighlightingForeground1, editorBracketHighlightingForeground2, editorBracketHighlightingForeground3, editorBracketHighlightingForeground4, editorBracketHighlightingForeground5, editorBracketHighlightingForeground6, editorBracketHighlightingUnexpectedBracketForeground, editorBracketPairGuideBackground1, editorBracketPairGuideBackground2, editorBracketPairGuideBackground3, editorBracketPairGuideBackground4, editorBracketPairGuideBackground5, editorBracketPairGuideBackground6, editorBracketPairGuideActiveBackground1, editorBracketPairGuideActiveBackground2, editorBracketPairGuideActiveBackground3, editorBracketPairGuideActiveBackground4, editorBracketPairGuideActiveBackground5, editorBracketPairGuideActiveBackground6, editorUnicodeHighlightBorder, editorUnicodeHighlightBackground; +var init_editorColorRegistry = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/editorColorRegistry.js"() { + init_nls(); + init_color(); + init_colorRegistry(); + init_themeService(); + editorLineHighlight = registerColor("editor.lineHighlightBackground", { dark: null, light: null, hcDark: null, hcLight: null }, localize("lineHighlight", "Background color for the highlight of line at the cursor position.")); + editorLineHighlightBorder = registerColor("editor.lineHighlightBorder", { dark: "#282828", light: "#eeeeee", hcDark: "#f38518", hcLight: contrastBorder }, localize("lineHighlightBorderBox", "Background color for the border around the line at the cursor position.")); + editorRangeHighlight = registerColor("editor.rangeHighlightBackground", { dark: "#ffffff0b", light: "#fdff0033", hcDark: null, hcLight: null }, localize("rangeHighlight", "Background color of highlighted ranges, like by quick open and find features. The color must not be opaque so as not to hide underlying decorations."), true); + editorRangeHighlightBorder = registerColor("editor.rangeHighlightBorder", { dark: null, light: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize("rangeHighlightBorder", "Background color of the border around highlighted ranges.")); + editorSymbolHighlight = registerColor("editor.symbolHighlightBackground", { dark: editorFindMatchHighlight, light: editorFindMatchHighlight, hcDark: null, hcLight: null }, localize("symbolHighlight", "Background color of highlighted symbol, like for go to definition or go next/previous symbol. The color must not be opaque so as not to hide underlying decorations."), true); + editorSymbolHighlightBorder = registerColor("editor.symbolHighlightBorder", { dark: null, light: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize("symbolHighlightBorder", "Background color of the border around highlighted symbols.")); + editorCursorForeground = registerColor("editorCursor.foreground", { dark: "#AEAFAD", light: Color.black, hcDark: Color.white, hcLight: "#0F4A85" }, localize("caret", "Color of the editor cursor.")); + editorCursorBackground = registerColor("editorCursor.background", null, localize("editorCursorBackground", "The background color of the editor cursor. Allows customizing the color of a character overlapped by a block cursor.")); + editorMultiCursorPrimaryForeground = registerColor("editorMultiCursor.primary.foreground", { dark: editorCursorForeground, light: editorCursorForeground, hcDark: editorCursorForeground, hcLight: editorCursorForeground }, localize("editorMultiCursorPrimaryForeground", "Color of the primary editor cursor when multiple cursors are present.")); + editorMultiCursorPrimaryBackground = registerColor("editorMultiCursor.primary.background", { dark: editorCursorBackground, light: editorCursorBackground, hcDark: editorCursorBackground, hcLight: editorCursorBackground }, localize("editorMultiCursorPrimaryBackground", "The background color of the primary editor cursor when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.")); + editorMultiCursorSecondaryForeground = registerColor("editorMultiCursor.secondary.foreground", { dark: editorCursorForeground, light: editorCursorForeground, hcDark: editorCursorForeground, hcLight: editorCursorForeground }, localize("editorMultiCursorSecondaryForeground", "Color of secondary editor cursors when multiple cursors are present.")); + editorMultiCursorSecondaryBackground = registerColor("editorMultiCursor.secondary.background", { dark: editorCursorBackground, light: editorCursorBackground, hcDark: editorCursorBackground, hcLight: editorCursorBackground }, localize("editorMultiCursorSecondaryBackground", "The background color of secondary editor cursors when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.")); + editorWhitespaces = registerColor("editorWhitespace.foreground", { dark: "#e3e4e229", light: "#33333333", hcDark: "#e3e4e229", hcLight: "#CCCCCC" }, localize("editorWhitespaces", "Color of whitespace characters in the editor.")); + editorLineNumbers = registerColor("editorLineNumber.foreground", { dark: "#858585", light: "#237893", hcDark: Color.white, hcLight: "#292929" }, localize("editorLineNumbers", "Color of editor line numbers.")); + deprecatedEditorIndentGuides = registerColor("editorIndentGuide.background", { dark: editorWhitespaces, light: editorWhitespaces, hcDark: editorWhitespaces, hcLight: editorWhitespaces }, localize("editorIndentGuides", "Color of the editor indentation guides."), false, localize("deprecatedEditorIndentGuides", "'editorIndentGuide.background' is deprecated. Use 'editorIndentGuide.background1' instead.")); + deprecatedEditorActiveIndentGuides = registerColor("editorIndentGuide.activeBackground", { dark: editorWhitespaces, light: editorWhitespaces, hcDark: editorWhitespaces, hcLight: editorWhitespaces }, localize("editorActiveIndentGuide", "Color of the active editor indentation guides."), false, localize("deprecatedEditorActiveIndentGuide", "'editorIndentGuide.activeBackground' is deprecated. Use 'editorIndentGuide.activeBackground1' instead.")); + editorIndentGuide1 = registerColor("editorIndentGuide.background1", { dark: deprecatedEditorIndentGuides, light: deprecatedEditorIndentGuides, hcDark: deprecatedEditorIndentGuides, hcLight: deprecatedEditorIndentGuides }, localize("editorIndentGuides1", "Color of the editor indentation guides (1).")); + editorIndentGuide2 = registerColor("editorIndentGuide.background2", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorIndentGuides2", "Color of the editor indentation guides (2).")); + editorIndentGuide3 = registerColor("editorIndentGuide.background3", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorIndentGuides3", "Color of the editor indentation guides (3).")); + editorIndentGuide4 = registerColor("editorIndentGuide.background4", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorIndentGuides4", "Color of the editor indentation guides (4).")); + editorIndentGuide5 = registerColor("editorIndentGuide.background5", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorIndentGuides5", "Color of the editor indentation guides (5).")); + editorIndentGuide6 = registerColor("editorIndentGuide.background6", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorIndentGuides6", "Color of the editor indentation guides (6).")); + editorActiveIndentGuide1 = registerColor("editorIndentGuide.activeBackground1", { dark: deprecatedEditorActiveIndentGuides, light: deprecatedEditorActiveIndentGuides, hcDark: deprecatedEditorActiveIndentGuides, hcLight: deprecatedEditorActiveIndentGuides }, localize("editorActiveIndentGuide1", "Color of the active editor indentation guides (1).")); + editorActiveIndentGuide2 = registerColor("editorIndentGuide.activeBackground2", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorActiveIndentGuide2", "Color of the active editor indentation guides (2).")); + editorActiveIndentGuide3 = registerColor("editorIndentGuide.activeBackground3", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorActiveIndentGuide3", "Color of the active editor indentation guides (3).")); + editorActiveIndentGuide4 = registerColor("editorIndentGuide.activeBackground4", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorActiveIndentGuide4", "Color of the active editor indentation guides (4).")); + editorActiveIndentGuide5 = registerColor("editorIndentGuide.activeBackground5", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorActiveIndentGuide5", "Color of the active editor indentation guides (5).")); + editorActiveIndentGuide6 = registerColor("editorIndentGuide.activeBackground6", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorActiveIndentGuide6", "Color of the active editor indentation guides (6).")); + deprecatedEditorActiveLineNumber = registerColor("editorActiveLineNumber.foreground", { dark: "#c6c6c6", light: "#0B216F", hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize("editorActiveLineNumber", "Color of editor active line number"), false, localize("deprecatedEditorActiveLineNumber", "Id is deprecated. Use 'editorLineNumber.activeForeground' instead.")); + editorActiveLineNumber = registerColor("editorLineNumber.activeForeground", { dark: deprecatedEditorActiveLineNumber, light: deprecatedEditorActiveLineNumber, hcDark: deprecatedEditorActiveLineNumber, hcLight: deprecatedEditorActiveLineNumber }, localize("editorActiveLineNumber", "Color of editor active line number")); + editorDimmedLineNumber = registerColor("editorLineNumber.dimmedForeground", { dark: null, light: null, hcDark: null, hcLight: null }, localize("editorDimmedLineNumber", "Color of the final editor line when editor.renderFinalNewline is set to dimmed.")); + editorRuler = registerColor("editorRuler.foreground", { dark: "#5A5A5A", light: Color.lightgrey, hcDark: Color.white, hcLight: "#292929" }, localize("editorRuler", "Color of the editor rulers.")); + editorCodeLensForeground = registerColor("editorCodeLens.foreground", { dark: "#999999", light: "#919191", hcDark: "#999999", hcLight: "#292929" }, localize("editorCodeLensForeground", "Foreground color of editor CodeLens")); + editorBracketMatchBackground = registerColor("editorBracketMatch.background", { dark: "#0064001a", light: "#0064001a", hcDark: "#0064001a", hcLight: "#0000" }, localize("editorBracketMatchBackground", "Background color behind matching brackets")); + editorBracketMatchBorder = registerColor("editorBracketMatch.border", { dark: "#888", light: "#B9B9B9", hcDark: contrastBorder, hcLight: contrastBorder }, localize("editorBracketMatchBorder", "Color for matching brackets boxes")); + editorOverviewRulerBorder = registerColor("editorOverviewRuler.border", { dark: "#7f7f7f4d", light: "#7f7f7f4d", hcDark: "#7f7f7f4d", hcLight: "#666666" }, localize("editorOverviewRulerBorder", "Color of the overview ruler border.")); + editorOverviewRulerBackground = registerColor("editorOverviewRuler.background", null, localize("editorOverviewRulerBackground", "Background color of the editor overview ruler.")); + editorGutter = registerColor("editorGutter.background", { dark: editorBackground, light: editorBackground, hcDark: editorBackground, hcLight: editorBackground }, localize("editorGutter", "Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.")); + editorUnnecessaryCodeBorder = registerColor("editorUnnecessaryCode.border", { dark: null, light: null, hcDark: Color.fromHex("#fff").transparent(0.8), hcLight: contrastBorder }, localize("unnecessaryCodeBorder", "Border color of unnecessary (unused) source code in the editor.")); + editorUnnecessaryCodeOpacity = registerColor("editorUnnecessaryCode.opacity", { dark: Color.fromHex("#000a"), light: Color.fromHex("#0007"), hcDark: null, hcLight: null }, localize("unnecessaryCodeOpacity", `Opacity of unnecessary (unused) source code in the editor. For example, "#000000c0" will render the code with 75% opacity. For high contrast themes, use the 'editorUnnecessaryCode.border' theme color to underline unnecessary code instead of fading it out.`)); + ghostTextBorder = registerColor("editorGhostText.border", { dark: null, light: null, hcDark: Color.fromHex("#fff").transparent(0.8), hcLight: Color.fromHex("#292929").transparent(0.8) }, localize("editorGhostTextBorder", "Border color of ghost text in the editor.")); + ghostTextForeground = registerColor("editorGhostText.foreground", { dark: Color.fromHex("#ffffff56"), light: Color.fromHex("#0007"), hcDark: null, hcLight: null }, localize("editorGhostTextForeground", "Foreground color of the ghost text in the editor.")); + ghostTextBackground = registerColor("editorGhostText.background", { dark: null, light: null, hcDark: null, hcLight: null }, localize("editorGhostTextBackground", "Background color of the ghost text in the editor.")); + rulerRangeDefault = new Color(new RGBA(0, 122, 204, 0.6)); + overviewRulerRangeHighlight = registerColor("editorOverviewRuler.rangeHighlightForeground", { dark: rulerRangeDefault, light: rulerRangeDefault, hcDark: rulerRangeDefault, hcLight: rulerRangeDefault }, localize("overviewRulerRangeHighlight", "Overview ruler marker color for range highlights. The color must not be opaque so as not to hide underlying decorations."), true); + overviewRulerError = registerColor("editorOverviewRuler.errorForeground", { dark: new Color(new RGBA(255, 18, 18, 0.7)), light: new Color(new RGBA(255, 18, 18, 0.7)), hcDark: new Color(new RGBA(255, 50, 50, 1)), hcLight: "#B5200D" }, localize("overviewRuleError", "Overview ruler marker color for errors.")); + overviewRulerWarning = registerColor("editorOverviewRuler.warningForeground", { dark: editorWarningForeground, light: editorWarningForeground, hcDark: editorWarningBorder, hcLight: editorWarningBorder }, localize("overviewRuleWarning", "Overview ruler marker color for warnings.")); + overviewRulerInfo = registerColor("editorOverviewRuler.infoForeground", { dark: editorInfoForeground, light: editorInfoForeground, hcDark: editorInfoBorder, hcLight: editorInfoBorder }, localize("overviewRuleInfo", "Overview ruler marker color for infos.")); + editorBracketHighlightingForeground1 = registerColor("editorBracketHighlight.foreground1", { dark: "#FFD700", light: "#0431FAFF", hcDark: "#FFD700", hcLight: "#0431FAFF" }, localize("editorBracketHighlightForeground1", "Foreground color of brackets (1). Requires enabling bracket pair colorization.")); + editorBracketHighlightingForeground2 = registerColor("editorBracketHighlight.foreground2", { dark: "#DA70D6", light: "#319331FF", hcDark: "#DA70D6", hcLight: "#319331FF" }, localize("editorBracketHighlightForeground2", "Foreground color of brackets (2). Requires enabling bracket pair colorization.")); + editorBracketHighlightingForeground3 = registerColor("editorBracketHighlight.foreground3", { dark: "#179FFF", light: "#7B3814FF", hcDark: "#87CEFA", hcLight: "#7B3814FF" }, localize("editorBracketHighlightForeground3", "Foreground color of brackets (3). Requires enabling bracket pair colorization.")); + editorBracketHighlightingForeground4 = registerColor("editorBracketHighlight.foreground4", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketHighlightForeground4", "Foreground color of brackets (4). Requires enabling bracket pair colorization.")); + editorBracketHighlightingForeground5 = registerColor("editorBracketHighlight.foreground5", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketHighlightForeground5", "Foreground color of brackets (5). Requires enabling bracket pair colorization.")); + editorBracketHighlightingForeground6 = registerColor("editorBracketHighlight.foreground6", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketHighlightForeground6", "Foreground color of brackets (6). Requires enabling bracket pair colorization.")); + editorBracketHighlightingUnexpectedBracketForeground = registerColor("editorBracketHighlight.unexpectedBracket.foreground", { dark: new Color(new RGBA(255, 18, 18, 0.8)), light: new Color(new RGBA(255, 18, 18, 0.8)), hcDark: new Color(new RGBA(255, 50, 50, 1)), hcLight: "" }, localize("editorBracketHighlightUnexpectedBracketForeground", "Foreground color of unexpected brackets.")); + editorBracketPairGuideBackground1 = registerColor("editorBracketPairGuide.background1", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketPairGuide.background1", "Background color of inactive bracket pair guides (1). Requires enabling bracket pair guides.")); + editorBracketPairGuideBackground2 = registerColor("editorBracketPairGuide.background2", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketPairGuide.background2", "Background color of inactive bracket pair guides (2). Requires enabling bracket pair guides.")); + editorBracketPairGuideBackground3 = registerColor("editorBracketPairGuide.background3", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketPairGuide.background3", "Background color of inactive bracket pair guides (3). Requires enabling bracket pair guides.")); + editorBracketPairGuideBackground4 = registerColor("editorBracketPairGuide.background4", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketPairGuide.background4", "Background color of inactive bracket pair guides (4). Requires enabling bracket pair guides.")); + editorBracketPairGuideBackground5 = registerColor("editorBracketPairGuide.background5", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketPairGuide.background5", "Background color of inactive bracket pair guides (5). Requires enabling bracket pair guides.")); + editorBracketPairGuideBackground6 = registerColor("editorBracketPairGuide.background6", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketPairGuide.background6", "Background color of inactive bracket pair guides (6). Requires enabling bracket pair guides.")); + editorBracketPairGuideActiveBackground1 = registerColor("editorBracketPairGuide.activeBackground1", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketPairGuide.activeBackground1", "Background color of active bracket pair guides (1). Requires enabling bracket pair guides.")); + editorBracketPairGuideActiveBackground2 = registerColor("editorBracketPairGuide.activeBackground2", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketPairGuide.activeBackground2", "Background color of active bracket pair guides (2). Requires enabling bracket pair guides.")); + editorBracketPairGuideActiveBackground3 = registerColor("editorBracketPairGuide.activeBackground3", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketPairGuide.activeBackground3", "Background color of active bracket pair guides (3). Requires enabling bracket pair guides.")); + editorBracketPairGuideActiveBackground4 = registerColor("editorBracketPairGuide.activeBackground4", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketPairGuide.activeBackground4", "Background color of active bracket pair guides (4). Requires enabling bracket pair guides.")); + editorBracketPairGuideActiveBackground5 = registerColor("editorBracketPairGuide.activeBackground5", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketPairGuide.activeBackground5", "Background color of active bracket pair guides (5). Requires enabling bracket pair guides.")); + editorBracketPairGuideActiveBackground6 = registerColor("editorBracketPairGuide.activeBackground6", { dark: "#00000000", light: "#00000000", hcDark: "#00000000", hcLight: "#00000000" }, localize("editorBracketPairGuide.activeBackground6", "Background color of active bracket pair guides (6). Requires enabling bracket pair guides.")); + editorUnicodeHighlightBorder = registerColor("editorUnicodeHighlight.border", { dark: editorWarningForeground, light: editorWarningForeground, hcDark: editorWarningForeground, hcLight: editorWarningForeground }, localize("editorUnicodeHighlight.border", "Border color used to highlight unicode characters.")); + editorUnicodeHighlightBackground = registerColor("editorUnicodeHighlight.background", { dark: editorWarningBackground, light: editorWarningBackground, hcDark: editorWarningBackground, hcLight: editorWarningBackground }, localize("editorUnicodeHighlight.background", "Background color used to highlight unicode characters.")); + registerThemingParticipant((theme, collector) => { + const background = theme.getColor(editorBackground); + const lineHighlight = theme.getColor(editorLineHighlight); + const imeBackground = lineHighlight && !lineHighlight.isTransparent() ? lineHighlight : background; + if (imeBackground) { + collector.addRule(`.monaco-editor .inputarea.ime-input { background-color: ${imeBackground}; }`); + } + }); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/lineNumbers/lineNumbers.js +var LineNumbersOverlay; +var init_lineNumbers2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/lineNumbers/lineNumbers.js"() { + init_lineNumbers(); + init_platform(); + init_dynamicViewOverlay(); + init_position(); + init_range(); + init_themeService(); + init_editorColorRegistry(); + LineNumbersOverlay = class _LineNumbersOverlay extends DynamicViewOverlay { + constructor(context) { + super(); + this._context = context; + this._readConfig(); + this._lastCursorModelPosition = new Position(1, 1); + this._renderResult = null; + this._activeLineNumber = 1; + this._context.addEventHandler(this); + } + _readConfig() { + const options2 = this._context.configuration.options; + this._lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + const lineNumbers = options2.get( + 68 + /* EditorOption.lineNumbers */ + ); + this._renderLineNumbers = lineNumbers.renderType; + this._renderCustomLineNumbers = lineNumbers.renderFn; + this._renderFinalNewline = options2.get( + 95 + /* EditorOption.renderFinalNewline */ + ); + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._lineNumbersLeft = layoutInfo.lineNumbersLeft; + this._lineNumbersWidth = layoutInfo.lineNumbersWidth; + } + dispose() { + this._context.removeEventHandler(this); + this._renderResult = null; + super.dispose(); + } + // --- begin event handlers + onConfigurationChanged(e) { + this._readConfig(); + return true; + } + onCursorStateChanged(e) { + const primaryViewPosition = e.selections[0].getPosition(); + this._lastCursorModelPosition = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(primaryViewPosition); + let shouldRender = false; + if (this._activeLineNumber !== primaryViewPosition.lineNumber) { + this._activeLineNumber = primaryViewPosition.lineNumber; + shouldRender = true; + } + if (this._renderLineNumbers === 2 || this._renderLineNumbers === 3) { + shouldRender = true; + } + return shouldRender; + } + onFlushed(e) { + return true; + } + onLinesChanged(e) { + return true; + } + onLinesDeleted(e) { + return true; + } + onLinesInserted(e) { + return true; + } + onScrollChanged(e) { + return e.scrollTopChanged; + } + onZonesChanged(e) { + return true; + } + onDecorationsChanged(e) { + return e.affectsLineNumber; + } + // --- end event handlers + _getLineRenderLineNumber(viewLineNumber) { + const modelPosition = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(viewLineNumber, 1)); + if (modelPosition.column !== 1) { + return ""; + } + const modelLineNumber = modelPosition.lineNumber; + if (this._renderCustomLineNumbers) { + return this._renderCustomLineNumbers(modelLineNumber); + } + if (this._renderLineNumbers === 2) { + const diff = Math.abs(this._lastCursorModelPosition.lineNumber - modelLineNumber); + if (diff === 0) { + return '' + modelLineNumber + ""; + } + return String(diff); + } + if (this._renderLineNumbers === 3) { + if (this._lastCursorModelPosition.lineNumber === modelLineNumber) { + return String(modelLineNumber); + } + if (modelLineNumber % 10 === 0) { + return String(modelLineNumber); + } + const finalLineNumber = this._context.viewModel.getLineCount(); + if (modelLineNumber === finalLineNumber) { + return String(modelLineNumber); + } + return ""; + } + return String(modelLineNumber); + } + prepareRender(ctx) { + if (this._renderLineNumbers === 0) { + this._renderResult = null; + return; + } + const lineHeightClassName = isLinux ? this._lineHeight % 2 === 0 ? " lh-even" : " lh-odd" : ""; + const visibleStartLineNumber = ctx.visibleRange.startLineNumber; + const visibleEndLineNumber = ctx.visibleRange.endLineNumber; + const lineNoDecorations = this._context.viewModel.getDecorationsInViewport(ctx.visibleRange).filter((d) => !!d.options.lineNumberClassName); + lineNoDecorations.sort((a3, b) => Range.compareRangesUsingEnds(a3.range, b.range)); + let decorationStartIndex = 0; + const lineCount = this._context.viewModel.getLineCount(); + const output = []; + for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) { + const lineIndex = lineNumber - visibleStartLineNumber; + let renderLineNumber = this._getLineRenderLineNumber(lineNumber); + let extraClassNames = ""; + while (decorationStartIndex < lineNoDecorations.length && lineNoDecorations[decorationStartIndex].range.endLineNumber < lineNumber) { + decorationStartIndex++; + } + for (let i = decorationStartIndex; i < lineNoDecorations.length; i++) { + const { range: range2, options: options2 } = lineNoDecorations[i]; + if (range2.startLineNumber <= lineNumber) { + extraClassNames += " " + options2.lineNumberClassName; + } + } + if (!renderLineNumber && !extraClassNames) { + output[lineIndex] = ""; + continue; + } + if (lineNumber === lineCount && this._context.viewModel.getLineLength(lineNumber) === 0) { + if (this._renderFinalNewline === "off") { + renderLineNumber = ""; + } + if (this._renderFinalNewline === "dimmed") { + extraClassNames += " dimmed-line-number"; + } + } + if (lineNumber === this._activeLineNumber) { + extraClassNames += " active-line-number"; + } + output[lineIndex] = `
${renderLineNumber}
`; + } + this._renderResult = output; + } + render(startLineNumber, lineNumber) { + if (!this._renderResult) { + return ""; + } + const lineIndex = lineNumber - startLineNumber; + if (lineIndex < 0 || lineIndex >= this._renderResult.length) { + return ""; + } + return this._renderResult[lineIndex]; + } + }; + LineNumbersOverlay.CLASS_NAME = "line-numbers"; + registerThemingParticipant((theme, collector) => { + const editorLineNumbersColor = theme.getColor(editorLineNumbers); + const editorDimmedLineNumberColor = theme.getColor(editorDimmedLineNumber); + if (editorDimmedLineNumberColor) { + collector.addRule(`.monaco-editor .line-numbers.dimmed-line-number { color: ${editorDimmedLineNumberColor}; }`); + } else if (editorLineNumbersColor) { + collector.addRule(`.monaco-editor .line-numbers.dimmed-line-number { color: ${editorLineNumbersColor.transparent(0.4)}; }`); + } + }); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/margin/margin.css +var init_margin = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/margin/margin.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/margin/margin.js +var Margin; +var init_margin2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/margin/margin.js"() { + init_margin(); + init_fastDomNode(); + init_viewPart(); + Margin = class _Margin extends ViewPart { + constructor(context) { + super(context); + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._canUseLayerHinting = !options2.get( + 32 + /* EditorOption.disableLayerHinting */ + ); + this._contentLeft = layoutInfo.contentLeft; + this._glyphMarginLeft = layoutInfo.glyphMarginLeft; + this._glyphMarginWidth = layoutInfo.glyphMarginWidth; + this._domNode = createFastDomNode(document.createElement("div")); + this._domNode.setClassName(_Margin.OUTER_CLASS_NAME); + this._domNode.setPosition("absolute"); + this._domNode.setAttribute("role", "presentation"); + this._domNode.setAttribute("aria-hidden", "true"); + this._glyphMarginBackgroundDomNode = createFastDomNode(document.createElement("div")); + this._glyphMarginBackgroundDomNode.setClassName(_Margin.CLASS_NAME); + this._domNode.appendChild(this._glyphMarginBackgroundDomNode); + } + dispose() { + super.dispose(); + } + getDomNode() { + return this._domNode; + } + // --- begin event handlers + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._canUseLayerHinting = !options2.get( + 32 + /* EditorOption.disableLayerHinting */ + ); + this._contentLeft = layoutInfo.contentLeft; + this._glyphMarginLeft = layoutInfo.glyphMarginLeft; + this._glyphMarginWidth = layoutInfo.glyphMarginWidth; + return true; + } + onScrollChanged(e) { + return super.onScrollChanged(e) || e.scrollTopChanged; + } + // --- end event handlers + prepareRender(ctx) { + } + render(ctx) { + this._domNode.setLayerHinting(this._canUseLayerHinting); + this._domNode.setContain("strict"); + const adjustedScrollTop = ctx.scrollTop - ctx.bigNumbersDelta; + this._domNode.setTop(-adjustedScrollTop); + const height = Math.min(ctx.scrollHeight, 1e6); + this._domNode.setHeight(height); + this._domNode.setWidth(this._contentLeft); + this._glyphMarginBackgroundDomNode.setLeft(this._glyphMarginLeft); + this._glyphMarginBackgroundDomNode.setWidth(this._glyphMarginWidth); + this._glyphMarginBackgroundDomNode.setHeight(height); + } + }; + Margin.CLASS_NAME = "glyph-margin"; + Margin.OUTER_CLASS_NAME = "margin"; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/mouseCursor/mouseCursor.css +var init_mouseCursor = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/mouseCursor/mouseCursor.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/mouseCursor/mouseCursor.js +var MOUSE_CURSOR_TEXT_CSS_CLASS_NAME; +var init_mouseCursor2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/mouseCursor/mouseCursor.js"() { + init_mouseCursor(); + MOUSE_CURSOR_TEXT_CSS_CLASS_NAME = `monaco-mouse-cursor-text`; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/ime.js +var IMEImpl, IME; +var init_ime = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/ime.js"() { + init_event(); + IMEImpl = class { + constructor() { + this._onDidChange = new Emitter(); + this.onDidChange = this._onDidChange.event; + this._enabled = true; + } + get enabled() { + return this._enabled; + } + /** + * Enable IME + */ + enable() { + this._enabled = true; + this._onDidChange.fire(); + } + /** + * Disable IME + */ + disable() { + this._enabled = false; + this._onDidChange.fire(); + } + }; + IME = new IMEImpl(); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/keybinding/common/keybinding.js +var IKeybindingService; +var init_keybinding = __esm({ + "node_modules/monaco-editor/esm/vs/platform/keybinding/common/keybinding.js"() { + init_instantiation(); + IKeybindingService = createDecorator("keybindingService"); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/controller/textAreaHandler.js +function measureText(targetDocument, text2, fontInfo, tabSize) { + if (text2.length === 0) { + return 0; + } + const container = targetDocument.createElement("div"); + container.style.position = "absolute"; + container.style.top = "-50000px"; + container.style.width = "50000px"; + const regularDomNode = targetDocument.createElement("span"); + applyFontInfo(regularDomNode, fontInfo); + regularDomNode.style.whiteSpace = "pre"; + regularDomNode.style.tabSize = `${tabSize * fontInfo.spaceWidth}px`; + regularDomNode.append(text2); + container.appendChild(regularDomNode); + targetDocument.body.appendChild(container); + const res = regularDomNode.offsetWidth; + targetDocument.body.removeChild(container); + return res; +} +var __decorate9, __param8, VisibleTextAreaData, canUseZeroSizeTextarea, TextAreaHandler; +var init_textAreaHandler2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/controller/textAreaHandler.js"() { + init_textAreaHandler(); + init_nls(); + init_browser(); + init_fastDomNode(); + init_platform(); + init_strings(); + init_domFontInfo(); + init_textAreaInput(); + init_textAreaState(); + init_viewPart(); + init_lineNumbers2(); + init_margin2(); + init_editorOptions(); + init_wordCharacterClassifier(); + init_position(); + init_range(); + init_selection(); + init_mouseCursor2(); + init_languages(); + init_color(); + init_ime(); + init_keybinding(); + init_instantiation(); + __decorate9 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param8 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + VisibleTextAreaData = class { + constructor(_context, modelLineNumber, distanceToModelLineStart, widthOfHiddenLineTextBefore, distanceToModelLineEnd) { + this._context = _context; + this.modelLineNumber = modelLineNumber; + this.distanceToModelLineStart = distanceToModelLineStart; + this.widthOfHiddenLineTextBefore = widthOfHiddenLineTextBefore; + this.distanceToModelLineEnd = distanceToModelLineEnd; + this._visibleTextAreaBrand = void 0; + this.startPosition = null; + this.endPosition = null; + this.visibleTextareaStart = null; + this.visibleTextareaEnd = null; + this._previousPresentation = null; + } + prepareRender(visibleRangeProvider) { + const startModelPosition = new Position(this.modelLineNumber, this.distanceToModelLineStart + 1); + const endModelPosition = new Position(this.modelLineNumber, this._context.viewModel.model.getLineMaxColumn(this.modelLineNumber) - this.distanceToModelLineEnd); + this.startPosition = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(startModelPosition); + this.endPosition = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(endModelPosition); + if (this.startPosition.lineNumber === this.endPosition.lineNumber) { + this.visibleTextareaStart = visibleRangeProvider.visibleRangeForPosition(this.startPosition); + this.visibleTextareaEnd = visibleRangeProvider.visibleRangeForPosition(this.endPosition); + } else { + this.visibleTextareaStart = null; + this.visibleTextareaEnd = null; + } + } + definePresentation(tokenPresentation) { + if (!this._previousPresentation) { + if (tokenPresentation) { + this._previousPresentation = tokenPresentation; + } else { + this._previousPresentation = { + foreground: 1, + italic: false, + bold: false, + underline: false, + strikethrough: false + }; + } + } + return this._previousPresentation; + } + }; + canUseZeroSizeTextarea = isFirefox2; + TextAreaHandler = class TextAreaHandler2 extends ViewPart { + constructor(context, viewController, visibleRangeProvider, _keybindingService, _instantiationService) { + super(context); + this._keybindingService = _keybindingService; + this._instantiationService = _instantiationService; + this._primaryCursorPosition = new Position(1, 1); + this._primaryCursorVisibleRange = null; + this._viewController = viewController; + this._visibleRangeProvider = visibleRangeProvider; + this._scrollLeft = 0; + this._scrollTop = 0; + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._setAccessibilityOptions(options2); + this._contentLeft = layoutInfo.contentLeft; + this._contentWidth = layoutInfo.contentWidth; + this._contentHeight = layoutInfo.height; + this._fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + this._lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this._emptySelectionClipboard = options2.get( + 37 + /* EditorOption.emptySelectionClipboard */ + ); + this._copyWithSyntaxHighlighting = options2.get( + 25 + /* EditorOption.copyWithSyntaxHighlighting */ + ); + this._visibleTextArea = null; + this._selections = [new Selection(1, 1, 1, 1)]; + this._modelSelections = [new Selection(1, 1, 1, 1)]; + this._lastRenderPosition = null; + this.textArea = createFastDomNode(document.createElement("textarea")); + PartFingerprints.write( + this.textArea, + 7 + /* PartFingerprint.TextArea */ + ); + this.textArea.setClassName(`inputarea ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`); + this.textArea.setAttribute("wrap", this._textAreaWrapping && !this._visibleTextArea ? "on" : "off"); + const { tabSize } = this._context.viewModel.model.getOptions(); + this.textArea.domNode.style.tabSize = `${tabSize * this._fontInfo.spaceWidth}px`; + this.textArea.setAttribute("autocorrect", "off"); + this.textArea.setAttribute("autocapitalize", "off"); + this.textArea.setAttribute("autocomplete", "off"); + this.textArea.setAttribute("spellcheck", "false"); + this.textArea.setAttribute("aria-label", this._getAriaLabel(options2)); + this.textArea.setAttribute("aria-required", options2.get( + 5 + /* EditorOption.ariaRequired */ + ) ? "true" : "false"); + this.textArea.setAttribute("tabindex", String(options2.get( + 124 + /* EditorOption.tabIndex */ + ))); + this.textArea.setAttribute("role", "textbox"); + this.textArea.setAttribute("aria-roledescription", localize("editor", "editor")); + this.textArea.setAttribute("aria-multiline", "true"); + this.textArea.setAttribute("aria-autocomplete", options2.get( + 91 + /* EditorOption.readOnly */ + ) ? "none" : "both"); + this._ensureReadOnlyAttribute(); + this.textAreaCover = createFastDomNode(document.createElement("div")); + this.textAreaCover.setPosition("absolute"); + const simpleModel = { + getLineCount: () => { + return this._context.viewModel.getLineCount(); + }, + getLineMaxColumn: (lineNumber) => { + return this._context.viewModel.getLineMaxColumn(lineNumber); + }, + getValueInRange: (range2, eol) => { + return this._context.viewModel.getValueInRange(range2, eol); + }, + getValueLengthInRange: (range2, eol) => { + return this._context.viewModel.getValueLengthInRange(range2, eol); + }, + modifyPosition: (position, offset) => { + return this._context.viewModel.modifyPosition(position, offset); + } + }; + const textAreaInputHost = { + getDataToCopy: () => { + const rawTextToCopy = this._context.viewModel.getPlainTextToCopy(this._modelSelections, this._emptySelectionClipboard, isWindows); + const newLineCharacter = this._context.viewModel.model.getEOL(); + const isFromEmptySelection = this._emptySelectionClipboard && this._modelSelections.length === 1 && this._modelSelections[0].isEmpty(); + const multicursorText = Array.isArray(rawTextToCopy) ? rawTextToCopy : null; + const text2 = Array.isArray(rawTextToCopy) ? rawTextToCopy.join(newLineCharacter) : rawTextToCopy; + let html2 = void 0; + let mode = null; + if (CopyOptions.forceCopyWithSyntaxHighlighting || this._copyWithSyntaxHighlighting && text2.length < 65536) { + const richText = this._context.viewModel.getRichTextToCopy(this._modelSelections, this._emptySelectionClipboard); + if (richText) { + html2 = richText.html; + mode = richText.mode; + } + } + return { + isFromEmptySelection, + multicursorText, + text: text2, + html: html2, + mode + }; + }, + getScreenReaderContent: () => { + if (this._accessibilitySupport === 1) { + const selection = this._selections[0]; + if (isMacintosh && selection.isEmpty()) { + const position = selection.getStartPosition(); + let textBefore = this._getWordBeforePosition(position); + if (textBefore.length === 0) { + textBefore = this._getCharacterBeforePosition(position); + } + if (textBefore.length > 0) { + return new TextAreaState(textBefore, textBefore.length, textBefore.length, Range.fromPositions(position), 0); + } + } + const LIMIT_CHARS = 500; + if (isMacintosh && !selection.isEmpty() && simpleModel.getValueLengthInRange( + selection, + 0 + /* EndOfLinePreference.TextDefined */ + ) < LIMIT_CHARS) { + const text2 = simpleModel.getValueInRange( + selection, + 0 + /* EndOfLinePreference.TextDefined */ + ); + return new TextAreaState(text2, 0, text2.length, selection, 0); + } + if (isSafari2 && !selection.isEmpty()) { + const placeholderText = "vscode-placeholder"; + return new TextAreaState(placeholderText, 0, placeholderText.length, null, void 0); + } + return TextAreaState.EMPTY; + } + if (isAndroid2) { + const selection = this._selections[0]; + if (selection.isEmpty()) { + const position = selection.getStartPosition(); + const [wordAtPosition, positionOffsetInWord] = this._getAndroidWordAtPosition(position); + if (wordAtPosition.length > 0) { + return new TextAreaState(wordAtPosition, positionOffsetInWord, positionOffsetInWord, Range.fromPositions(position), 0); + } + } + return TextAreaState.EMPTY; + } + return PagedScreenReaderStrategy.fromEditorSelection( + simpleModel, + this._selections[0], + this._accessibilityPageSize, + this._accessibilitySupport === 0 + /* AccessibilitySupport.Unknown */ + ); + }, + deduceModelPosition: (viewAnchorPosition, deltaOffset, lineFeedCnt) => { + return this._context.viewModel.deduceModelPositionRelativeToViewPosition(viewAnchorPosition, deltaOffset, lineFeedCnt); + } + }; + const textAreaWrapper = this._register(new TextAreaWrapper(this.textArea.domNode)); + this._textAreaInput = this._register(this._instantiationService.createInstance(TextAreaInput, textAreaInputHost, textAreaWrapper, OS, { + isAndroid: isAndroid2, + isChrome: isChrome2, + isFirefox: isFirefox2, + isSafari: isSafari2 + })); + this._register(this._textAreaInput.onKeyDown((e) => { + this._viewController.emitKeyDown(e); + })); + this._register(this._textAreaInput.onKeyUp((e) => { + this._viewController.emitKeyUp(e); + })); + this._register(this._textAreaInput.onPaste((e) => { + let pasteOnNewLine = false; + let multicursorText = null; + let mode = null; + if (e.metadata) { + pasteOnNewLine = this._emptySelectionClipboard && !!e.metadata.isFromEmptySelection; + multicursorText = typeof e.metadata.multicursorText !== "undefined" ? e.metadata.multicursorText : null; + mode = e.metadata.mode; + } + this._viewController.paste(e.text, pasteOnNewLine, multicursorText, mode); + })); + this._register(this._textAreaInput.onCut(() => { + this._viewController.cut(); + })); + this._register(this._textAreaInput.onType((e) => { + if (e.replacePrevCharCnt || e.replaceNextCharCnt || e.positionDelta) { + if (_debugComposition) { + console.log(` => compositionType: <<${e.text}>>, ${e.replacePrevCharCnt}, ${e.replaceNextCharCnt}, ${e.positionDelta}`); + } + this._viewController.compositionType(e.text, e.replacePrevCharCnt, e.replaceNextCharCnt, e.positionDelta); + } else { + if (_debugComposition) { + console.log(` => type: <<${e.text}>>`); + } + this._viewController.type(e.text); + } + })); + this._register(this._textAreaInput.onSelectionChangeRequest((modelSelection) => { + this._viewController.setSelection(modelSelection); + })); + this._register(this._textAreaInput.onCompositionStart((e) => { + const ta = this.textArea.domNode; + const modelSelection = this._modelSelections[0]; + const { distanceToModelLineStart, widthOfHiddenTextBefore } = (() => { + const textBeforeSelection = ta.value.substring(0, Math.min(ta.selectionStart, ta.selectionEnd)); + const lineFeedOffset1 = textBeforeSelection.lastIndexOf("\n"); + const lineTextBeforeSelection = textBeforeSelection.substring(lineFeedOffset1 + 1); + const tabOffset1 = lineTextBeforeSelection.lastIndexOf(" "); + const desiredVisibleBeforeCharCount = lineTextBeforeSelection.length - tabOffset1 - 1; + const startModelPosition = modelSelection.getStartPosition(); + const visibleBeforeCharCount = Math.min(startModelPosition.column - 1, desiredVisibleBeforeCharCount); + const distanceToModelLineStart2 = startModelPosition.column - 1 - visibleBeforeCharCount; + const hiddenLineTextBefore = lineTextBeforeSelection.substring(0, lineTextBeforeSelection.length - visibleBeforeCharCount); + const { tabSize: tabSize2 } = this._context.viewModel.model.getOptions(); + const widthOfHiddenTextBefore2 = measureText(this.textArea.domNode.ownerDocument, hiddenLineTextBefore, this._fontInfo, tabSize2); + return { distanceToModelLineStart: distanceToModelLineStart2, widthOfHiddenTextBefore: widthOfHiddenTextBefore2 }; + })(); + const { distanceToModelLineEnd } = (() => { + const textAfterSelection = ta.value.substring(Math.max(ta.selectionStart, ta.selectionEnd)); + const lineFeedOffset2 = textAfterSelection.indexOf("\n"); + const lineTextAfterSelection = lineFeedOffset2 === -1 ? textAfterSelection : textAfterSelection.substring(0, lineFeedOffset2); + const tabOffset2 = lineTextAfterSelection.indexOf(" "); + const desiredVisibleAfterCharCount = tabOffset2 === -1 ? lineTextAfterSelection.length : lineTextAfterSelection.length - tabOffset2 - 1; + const endModelPosition = modelSelection.getEndPosition(); + const visibleAfterCharCount = Math.min(this._context.viewModel.model.getLineMaxColumn(endModelPosition.lineNumber) - endModelPosition.column, desiredVisibleAfterCharCount); + const distanceToModelLineEnd2 = this._context.viewModel.model.getLineMaxColumn(endModelPosition.lineNumber) - endModelPosition.column - visibleAfterCharCount; + return { distanceToModelLineEnd: distanceToModelLineEnd2 }; + })(); + this._context.viewModel.revealRange( + "keyboard", + true, + Range.fromPositions(this._selections[0].getStartPosition()), + 0, + 1 + /* ScrollType.Immediate */ + ); + this._visibleTextArea = new VisibleTextAreaData(this._context, modelSelection.startLineNumber, distanceToModelLineStart, widthOfHiddenTextBefore, distanceToModelLineEnd); + this.textArea.setAttribute("wrap", this._textAreaWrapping && !this._visibleTextArea ? "on" : "off"); + this._visibleTextArea.prepareRender(this._visibleRangeProvider); + this._render(); + this.textArea.setClassName(`inputarea ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME} ime-input`); + this._viewController.compositionStart(); + this._context.viewModel.onCompositionStart(); + })); + this._register(this._textAreaInput.onCompositionUpdate((e) => { + if (!this._visibleTextArea) { + return; + } + this._visibleTextArea.prepareRender(this._visibleRangeProvider); + this._render(); + })); + this._register(this._textAreaInput.onCompositionEnd(() => { + this._visibleTextArea = null; + this.textArea.setAttribute("wrap", this._textAreaWrapping && !this._visibleTextArea ? "on" : "off"); + this._render(); + this.textArea.setClassName(`inputarea ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`); + this._viewController.compositionEnd(); + this._context.viewModel.onCompositionEnd(); + })); + this._register(this._textAreaInput.onFocus(() => { + this._context.viewModel.setHasFocus(true); + })); + this._register(this._textAreaInput.onBlur(() => { + this._context.viewModel.setHasFocus(false); + })); + this._register(IME.onDidChange(() => { + this._ensureReadOnlyAttribute(); + })); + } + writeScreenReaderContent(reason) { + this._textAreaInput.writeNativeTextAreaContent(reason); + } + dispose() { + super.dispose(); + } + _getAndroidWordAtPosition(position) { + const ANDROID_WORD_SEPARATORS = '`~!@#$%^&*()-=+[{]}\\|;:",.<>/?'; + const lineContent = this._context.viewModel.getLineContent(position.lineNumber); + const wordSeparators2 = getMapForWordSeparators(ANDROID_WORD_SEPARATORS, []); + let goingLeft = true; + let startColumn = position.column; + let goingRight = true; + let endColumn = position.column; + let distance = 0; + while (distance < 50 && (goingLeft || goingRight)) { + if (goingLeft && startColumn <= 1) { + goingLeft = false; + } + if (goingLeft) { + const charCode = lineContent.charCodeAt(startColumn - 2); + const charClass = wordSeparators2.get(charCode); + if (charClass !== 0) { + goingLeft = false; + } else { + startColumn--; + } + } + if (goingRight && endColumn > lineContent.length) { + goingRight = false; + } + if (goingRight) { + const charCode = lineContent.charCodeAt(endColumn - 1); + const charClass = wordSeparators2.get(charCode); + if (charClass !== 0) { + goingRight = false; + } else { + endColumn++; + } + } + distance++; + } + return [lineContent.substring(startColumn - 1, endColumn - 1), position.column - startColumn]; + } + _getWordBeforePosition(position) { + const lineContent = this._context.viewModel.getLineContent(position.lineNumber); + const wordSeparators2 = getMapForWordSeparators(this._context.configuration.options.get( + 131 + /* EditorOption.wordSeparators */ + ), []); + let column = position.column; + let distance = 0; + while (column > 1) { + const charCode = lineContent.charCodeAt(column - 2); + const charClass = wordSeparators2.get(charCode); + if (charClass !== 0 || distance > 50) { + return lineContent.substring(column - 1, position.column - 1); + } + distance++; + column--; + } + return lineContent.substring(0, position.column - 1); + } + _getCharacterBeforePosition(position) { + if (position.column > 1) { + const lineContent = this._context.viewModel.getLineContent(position.lineNumber); + const charBefore = lineContent.charAt(position.column - 2); + if (!isHighSurrogate(charBefore.charCodeAt(0))) { + return charBefore; + } + } + return ""; + } + _getAriaLabel(options2) { + var _a10, _b4, _c2; + const accessibilitySupport = options2.get( + 2 + /* EditorOption.accessibilitySupport */ + ); + if (accessibilitySupport === 1) { + const toggleKeybindingLabel = (_a10 = this._keybindingService.lookupKeybinding("editor.action.toggleScreenReaderAccessibilityMode")) === null || _a10 === void 0 ? void 0 : _a10.getAriaLabel(); + const runCommandKeybindingLabel = (_b4 = this._keybindingService.lookupKeybinding("workbench.action.showCommands")) === null || _b4 === void 0 ? void 0 : _b4.getAriaLabel(); + const keybindingEditorKeybindingLabel = (_c2 = this._keybindingService.lookupKeybinding("workbench.action.openGlobalKeybindings")) === null || _c2 === void 0 ? void 0 : _c2.getAriaLabel(); + const editorNotAccessibleMessage = localize("accessibilityModeOff", "The editor is not accessible at this time."); + if (toggleKeybindingLabel) { + return localize("accessibilityOffAriaLabel", "{0} To enable screen reader optimized mode, use {1}", editorNotAccessibleMessage, toggleKeybindingLabel); + } else if (runCommandKeybindingLabel) { + return localize("accessibilityOffAriaLabelNoKb", "{0} To enable screen reader optimized mode, open the quick pick with {1} and run the command Toggle Screen Reader Accessibility Mode, which is currently not triggerable via keyboard.", editorNotAccessibleMessage, runCommandKeybindingLabel); + } else if (keybindingEditorKeybindingLabel) { + return localize("accessibilityOffAriaLabelNoKbs", "{0} Please assign a keybinding for the command Toggle Screen Reader Accessibility Mode by accessing the keybindings editor with {1} and run it.", editorNotAccessibleMessage, keybindingEditorKeybindingLabel); + } else { + return editorNotAccessibleMessage; + } + } + return options2.get( + 4 + /* EditorOption.ariaLabel */ + ); + } + _setAccessibilityOptions(options2) { + this._accessibilitySupport = options2.get( + 2 + /* EditorOption.accessibilitySupport */ + ); + const accessibilityPageSize = options2.get( + 3 + /* EditorOption.accessibilityPageSize */ + ); + if (this._accessibilitySupport === 2 && accessibilityPageSize === EditorOptions.accessibilityPageSize.defaultValue) { + this._accessibilityPageSize = 500; + } else { + this._accessibilityPageSize = accessibilityPageSize; + } + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + const wrappingColumn = layoutInfo.wrappingColumn; + if (wrappingColumn !== -1 && this._accessibilitySupport !== 1) { + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + this._textAreaWrapping = true; + this._textAreaWidth = Math.round(wrappingColumn * fontInfo.typicalHalfwidthCharacterWidth); + } else { + this._textAreaWrapping = false; + this._textAreaWidth = canUseZeroSizeTextarea ? 0 : 1; + } + } + // --- begin event handlers + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._setAccessibilityOptions(options2); + this._contentLeft = layoutInfo.contentLeft; + this._contentWidth = layoutInfo.contentWidth; + this._contentHeight = layoutInfo.height; + this._fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + this._lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this._emptySelectionClipboard = options2.get( + 37 + /* EditorOption.emptySelectionClipboard */ + ); + this._copyWithSyntaxHighlighting = options2.get( + 25 + /* EditorOption.copyWithSyntaxHighlighting */ + ); + this.textArea.setAttribute("wrap", this._textAreaWrapping && !this._visibleTextArea ? "on" : "off"); + const { tabSize } = this._context.viewModel.model.getOptions(); + this.textArea.domNode.style.tabSize = `${tabSize * this._fontInfo.spaceWidth}px`; + this.textArea.setAttribute("aria-label", this._getAriaLabel(options2)); + this.textArea.setAttribute("aria-required", options2.get( + 5 + /* EditorOption.ariaRequired */ + ) ? "true" : "false"); + this.textArea.setAttribute("tabindex", String(options2.get( + 124 + /* EditorOption.tabIndex */ + ))); + if (e.hasChanged( + 34 + /* EditorOption.domReadOnly */ + ) || e.hasChanged( + 91 + /* EditorOption.readOnly */ + )) { + this._ensureReadOnlyAttribute(); + } + if (e.hasChanged( + 2 + /* EditorOption.accessibilitySupport */ + )) { + this._textAreaInput.writeNativeTextAreaContent("strategy changed"); + } + return true; + } + onCursorStateChanged(e) { + this._selections = e.selections.slice(0); + this._modelSelections = e.modelSelections.slice(0); + this._textAreaInput.writeNativeTextAreaContent("selection changed"); + return true; + } + onDecorationsChanged(e) { + return true; + } + onFlushed(e) { + return true; + } + onLinesChanged(e) { + return true; + } + onLinesDeleted(e) { + return true; + } + onLinesInserted(e) { + return true; + } + onScrollChanged(e) { + this._scrollLeft = e.scrollLeft; + this._scrollTop = e.scrollTop; + return true; + } + onZonesChanged(e) { + return true; + } + // --- end event handlers + // --- begin view API + isFocused() { + return this._textAreaInput.isFocused(); + } + focusTextArea() { + this._textAreaInput.focusTextArea(); + } + getLastRenderData() { + return this._lastRenderPosition; + } + setAriaOptions(options2) { + if (options2.activeDescendant) { + this.textArea.setAttribute("aria-haspopup", "true"); + this.textArea.setAttribute("aria-autocomplete", "list"); + this.textArea.setAttribute("aria-activedescendant", options2.activeDescendant); + } else { + this.textArea.setAttribute("aria-haspopup", "false"); + this.textArea.setAttribute("aria-autocomplete", "both"); + this.textArea.removeAttribute("aria-activedescendant"); + } + if (options2.role) { + this.textArea.setAttribute("role", options2.role); + } + } + // --- end view API + _ensureReadOnlyAttribute() { + const options2 = this._context.configuration.options; + const useReadOnly = !IME.enabled || options2.get( + 34 + /* EditorOption.domReadOnly */ + ) && options2.get( + 91 + /* EditorOption.readOnly */ + ); + if (useReadOnly) { + this.textArea.setAttribute("readonly", "true"); + } else { + this.textArea.removeAttribute("readonly"); + } + } + prepareRender(ctx) { + var _a10; + this._primaryCursorPosition = new Position(this._selections[0].positionLineNumber, this._selections[0].positionColumn); + this._primaryCursorVisibleRange = ctx.visibleRangeForPosition(this._primaryCursorPosition); + (_a10 = this._visibleTextArea) === null || _a10 === void 0 ? void 0 : _a10.prepareRender(ctx); + } + render(ctx) { + this._textAreaInput.writeNativeTextAreaContent("render"); + this._render(); + } + _render() { + var _a10; + if (this._visibleTextArea) { + const visibleStart = this._visibleTextArea.visibleTextareaStart; + const visibleEnd = this._visibleTextArea.visibleTextareaEnd; + const startPosition = this._visibleTextArea.startPosition; + const endPosition = this._visibleTextArea.endPosition; + if (startPosition && endPosition && visibleStart && visibleEnd && visibleEnd.left >= this._scrollLeft && visibleStart.left <= this._scrollLeft + this._contentWidth) { + const top2 = this._context.viewLayout.getVerticalOffsetForLineNumber(this._primaryCursorPosition.lineNumber) - this._scrollTop; + const lineCount = this._newlinecount(this.textArea.domNode.value.substr(0, this.textArea.domNode.selectionStart)); + let scrollLeft = this._visibleTextArea.widthOfHiddenLineTextBefore; + let left2 = this._contentLeft + visibleStart.left - this._scrollLeft; + let width2 = visibleEnd.left - visibleStart.left + 1; + if (left2 < this._contentLeft) { + const delta = this._contentLeft - left2; + left2 += delta; + scrollLeft += delta; + width2 -= delta; + } + if (width2 > this._contentWidth) { + width2 = this._contentWidth; + } + const viewLineData = this._context.viewModel.getViewLineData(startPosition.lineNumber); + const startTokenIndex = viewLineData.tokens.findTokenIndexAtOffset(startPosition.column - 1); + const endTokenIndex = viewLineData.tokens.findTokenIndexAtOffset(endPosition.column - 1); + const textareaSpansSingleToken = startTokenIndex === endTokenIndex; + const presentation = this._visibleTextArea.definePresentation(textareaSpansSingleToken ? viewLineData.tokens.getPresentation(startTokenIndex) : null); + this.textArea.domNode.scrollTop = lineCount * this._lineHeight; + this.textArea.domNode.scrollLeft = scrollLeft; + this._doRender({ + lastRenderPosition: null, + top: top2, + left: left2, + width: width2, + height: this._lineHeight, + useCover: false, + color: (TokenizationRegistry2.getColorMap() || [])[presentation.foreground], + italic: presentation.italic, + bold: presentation.bold, + underline: presentation.underline, + strikethrough: presentation.strikethrough + }); + } + return; + } + if (!this._primaryCursorVisibleRange) { + this._renderAtTopLeft(); + return; + } + const left = this._contentLeft + this._primaryCursorVisibleRange.left - this._scrollLeft; + if (left < this._contentLeft || left > this._contentLeft + this._contentWidth) { + this._renderAtTopLeft(); + return; + } + const top = this._context.viewLayout.getVerticalOffsetForLineNumber(this._selections[0].positionLineNumber) - this._scrollTop; + if (top < 0 || top > this._contentHeight) { + this._renderAtTopLeft(); + return; + } + if (isMacintosh || this._accessibilitySupport === 2) { + this._doRender({ + lastRenderPosition: this._primaryCursorPosition, + top, + left: this._textAreaWrapping ? this._contentLeft : left, + width: this._textAreaWidth, + height: this._lineHeight, + useCover: false + }); + this.textArea.domNode.scrollLeft = this._primaryCursorVisibleRange.left; + const lineCount = (_a10 = this._textAreaInput.textAreaState.newlineCountBeforeSelection) !== null && _a10 !== void 0 ? _a10 : this._newlinecount(this.textArea.domNode.value.substr(0, this.textArea.domNode.selectionStart)); + this.textArea.domNode.scrollTop = lineCount * this._lineHeight; + return; + } + this._doRender({ + lastRenderPosition: this._primaryCursorPosition, + top, + left: this._textAreaWrapping ? this._contentLeft : left, + width: this._textAreaWidth, + height: canUseZeroSizeTextarea ? 0 : 1, + useCover: false + }); + } + _newlinecount(text2) { + let result = 0; + let startIndex = -1; + do { + startIndex = text2.indexOf("\n", startIndex + 1); + if (startIndex === -1) { + break; + } + result++; + } while (true); + return result; + } + _renderAtTopLeft() { + this._doRender({ + lastRenderPosition: null, + top: 0, + left: 0, + width: this._textAreaWidth, + height: canUseZeroSizeTextarea ? 0 : 1, + useCover: true + }); + } + _doRender(renderData) { + this._lastRenderPosition = renderData.lastRenderPosition; + const ta = this.textArea; + const tac = this.textAreaCover; + applyFontInfo(ta, this._fontInfo); + ta.setTop(renderData.top); + ta.setLeft(renderData.left); + ta.setWidth(renderData.width); + ta.setHeight(renderData.height); + ta.setColor(renderData.color ? Color.Format.CSS.formatHex(renderData.color) : ""); + ta.setFontStyle(renderData.italic ? "italic" : ""); + if (renderData.bold) { + ta.setFontWeight("bold"); + } + ta.setTextDecoration(`${renderData.underline ? " underline" : ""}${renderData.strikethrough ? " line-through" : ""}`); + tac.setTop(renderData.useCover ? renderData.top : 0); + tac.setLeft(renderData.useCover ? renderData.left : 0); + tac.setWidth(renderData.useCover ? renderData.width : 0); + tac.setHeight(renderData.useCover ? renderData.height : 0); + const options2 = this._context.configuration.options; + if (options2.get( + 57 + /* EditorOption.glyphMargin */ + )) { + tac.setClassName("monaco-editor-background textAreaCover " + Margin.OUTER_CLASS_NAME); + } else { + if (options2.get( + 68 + /* EditorOption.lineNumbers */ + ).renderType !== 0) { + tac.setClassName("monaco-editor-background textAreaCover " + LineNumbersOverlay.CLASS_NAME); + } else { + tac.setClassName("monaco-editor-background textAreaCover"); + } + } + } + }; + TextAreaHandler = __decorate9([ + __param8(3, IKeybindingService), + __param8(4, IInstantiationService) + ], TextAreaHandler); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/indentation.js +function _normalizeIndentationFromWhitespace(str, indentSize, insertSpaces) { + let spacesCnt = 0; + for (let i = 0; i < str.length; i++) { + if (str.charAt(i) === " ") { + spacesCnt = CursorColumns.nextIndentTabStop(spacesCnt, indentSize); + } else { + spacesCnt++; + } + } + let result = ""; + if (!insertSpaces) { + const tabsCnt = Math.floor(spacesCnt / indentSize); + spacesCnt = spacesCnt % indentSize; + for (let i = 0; i < tabsCnt; i++) { + result += " "; + } + } + for (let i = 0; i < spacesCnt; i++) { + result += " "; + } + return result; +} +function normalizeIndentation(str, indentSize, insertSpaces) { + let firstNonWhitespaceIndex2 = firstNonWhitespaceIndex(str); + if (firstNonWhitespaceIndex2 === -1) { + firstNonWhitespaceIndex2 = str.length; + } + return _normalizeIndentationFromWhitespace(str.substring(0, firstNonWhitespaceIndex2), indentSize, insertSpaces) + str.substring(firstNonWhitespaceIndex2); +} +var init_indentation = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/indentation.js"() { + init_strings(); + init_cursorColumns(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/cursorCommon.js +function isQuote(ch) { + return ch === "'" || ch === '"' || ch === "`"; +} +var autoCloseAlways, autoCloseNever, autoCloseBeforeWhitespace, CursorConfiguration, CursorState, PartialModelCursorState, PartialViewCursorState, SingleCursorState, EditOperationResult; +var init_cursorCommon = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/cursorCommon.js"() { + init_position(); + init_range(); + init_selection(); + init_supports(); + init_cursorColumns(); + init_indentation(); + autoCloseAlways = () => true; + autoCloseNever = () => false; + autoCloseBeforeWhitespace = (chr) => chr === " " || chr === " "; + CursorConfiguration = class { + static shouldRecreate(e) { + return e.hasChanged( + 145 + /* EditorOption.layoutInfo */ + ) || e.hasChanged( + 131 + /* EditorOption.wordSeparators */ + ) || e.hasChanged( + 37 + /* EditorOption.emptySelectionClipboard */ + ) || e.hasChanged( + 77 + /* EditorOption.multiCursorMergeOverlapping */ + ) || e.hasChanged( + 79 + /* EditorOption.multiCursorPaste */ + ) || e.hasChanged( + 80 + /* EditorOption.multiCursorLimit */ + ) || e.hasChanged( + 6 + /* EditorOption.autoClosingBrackets */ + ) || e.hasChanged( + 7 + /* EditorOption.autoClosingComments */ + ) || e.hasChanged( + 11 + /* EditorOption.autoClosingQuotes */ + ) || e.hasChanged( + 9 + /* EditorOption.autoClosingDelete */ + ) || e.hasChanged( + 10 + /* EditorOption.autoClosingOvertype */ + ) || e.hasChanged( + 14 + /* EditorOption.autoSurround */ + ) || e.hasChanged( + 128 + /* EditorOption.useTabStops */ + ) || e.hasChanged( + 50 + /* EditorOption.fontInfo */ + ) || e.hasChanged( + 91 + /* EditorOption.readOnly */ + ) || e.hasChanged( + 130 + /* EditorOption.wordSegmenterLocales */ + ); + } + constructor(languageId, modelOptions, configuration, languageConfigurationService) { + var _a10; + this.languageConfigurationService = languageConfigurationService; + this._cursorMoveConfigurationBrand = void 0; + this._languageId = languageId; + const options2 = configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + this.readOnly = options2.get( + 91 + /* EditorOption.readOnly */ + ); + this.tabSize = modelOptions.tabSize; + this.indentSize = modelOptions.indentSize; + this.insertSpaces = modelOptions.insertSpaces; + this.stickyTabStops = options2.get( + 116 + /* EditorOption.stickyTabStops */ + ); + this.lineHeight = fontInfo.lineHeight; + this.typicalHalfwidthCharacterWidth = fontInfo.typicalHalfwidthCharacterWidth; + this.pageSize = Math.max(1, Math.floor(layoutInfo.height / this.lineHeight) - 2); + this.useTabStops = options2.get( + 128 + /* EditorOption.useTabStops */ + ); + this.wordSeparators = options2.get( + 131 + /* EditorOption.wordSeparators */ + ); + this.emptySelectionClipboard = options2.get( + 37 + /* EditorOption.emptySelectionClipboard */ + ); + this.copyWithSyntaxHighlighting = options2.get( + 25 + /* EditorOption.copyWithSyntaxHighlighting */ + ); + this.multiCursorMergeOverlapping = options2.get( + 77 + /* EditorOption.multiCursorMergeOverlapping */ + ); + this.multiCursorPaste = options2.get( + 79 + /* EditorOption.multiCursorPaste */ + ); + this.multiCursorLimit = options2.get( + 80 + /* EditorOption.multiCursorLimit */ + ); + this.autoClosingBrackets = options2.get( + 6 + /* EditorOption.autoClosingBrackets */ + ); + this.autoClosingComments = options2.get( + 7 + /* EditorOption.autoClosingComments */ + ); + this.autoClosingQuotes = options2.get( + 11 + /* EditorOption.autoClosingQuotes */ + ); + this.autoClosingDelete = options2.get( + 9 + /* EditorOption.autoClosingDelete */ + ); + this.autoClosingOvertype = options2.get( + 10 + /* EditorOption.autoClosingOvertype */ + ); + this.autoSurround = options2.get( + 14 + /* EditorOption.autoSurround */ + ); + this.autoIndent = options2.get( + 12 + /* EditorOption.autoIndent */ + ); + this.wordSegmenterLocales = options2.get( + 130 + /* EditorOption.wordSegmenterLocales */ + ); + this.surroundingPairs = {}; + this._electricChars = null; + this.shouldAutoCloseBefore = { + quote: this._getShouldAutoClose(languageId, this.autoClosingQuotes, true), + comment: this._getShouldAutoClose(languageId, this.autoClosingComments, false), + bracket: this._getShouldAutoClose(languageId, this.autoClosingBrackets, false) + }; + this.autoClosingPairs = this.languageConfigurationService.getLanguageConfiguration(languageId).getAutoClosingPairs(); + const surroundingPairs = this.languageConfigurationService.getLanguageConfiguration(languageId).getSurroundingPairs(); + if (surroundingPairs) { + for (const pair of surroundingPairs) { + this.surroundingPairs[pair.open] = pair.close; + } + } + const commentsConfiguration = this.languageConfigurationService.getLanguageConfiguration(languageId).comments; + this.blockCommentStartToken = (_a10 = commentsConfiguration === null || commentsConfiguration === void 0 ? void 0 : commentsConfiguration.blockCommentStartToken) !== null && _a10 !== void 0 ? _a10 : null; + } + get electricChars() { + var _a10; + if (!this._electricChars) { + this._electricChars = {}; + const electricChars = (_a10 = this.languageConfigurationService.getLanguageConfiguration(this._languageId).electricCharacter) === null || _a10 === void 0 ? void 0 : _a10.getElectricCharacters(); + if (electricChars) { + for (const char of electricChars) { + this._electricChars[char] = true; + } + } + } + return this._electricChars; + } + /** + * Should return opening bracket type to match indentation with + */ + onElectricCharacter(character, context, column) { + const scopedLineTokens = createScopedLineTokens(context, column - 1); + const electricCharacterSupport = this.languageConfigurationService.getLanguageConfiguration(scopedLineTokens.languageId).electricCharacter; + if (!electricCharacterSupport) { + return null; + } + return electricCharacterSupport.onElectricCharacter(character, scopedLineTokens, column - scopedLineTokens.firstCharOffset); + } + normalizeIndentation(str) { + return normalizeIndentation(str, this.indentSize, this.insertSpaces); + } + _getShouldAutoClose(languageId, autoCloseConfig, forQuotes) { + switch (autoCloseConfig) { + case "beforeWhitespace": + return autoCloseBeforeWhitespace; + case "languageDefined": + return this._getLanguageDefinedShouldAutoClose(languageId, forQuotes); + case "always": + return autoCloseAlways; + case "never": + return autoCloseNever; + } + } + _getLanguageDefinedShouldAutoClose(languageId, forQuotes) { + const autoCloseBeforeSet = this.languageConfigurationService.getLanguageConfiguration(languageId).getAutoCloseBeforeSet(forQuotes); + return (c) => autoCloseBeforeSet.indexOf(c) !== -1; + } + /** + * Returns a visible column from a column. + * @see {@link CursorColumns} + */ + visibleColumnFromColumn(model, position) { + return CursorColumns.visibleColumnFromColumn(model.getLineContent(position.lineNumber), position.column, this.tabSize); + } + /** + * Returns a visible column from a column. + * @see {@link CursorColumns} + */ + columnFromVisibleColumn(model, lineNumber, visibleColumn) { + const result = CursorColumns.columnFromVisibleColumn(model.getLineContent(lineNumber), visibleColumn, this.tabSize); + const minColumn = model.getLineMinColumn(lineNumber); + if (result < minColumn) { + return minColumn; + } + const maxColumn = model.getLineMaxColumn(lineNumber); + if (result > maxColumn) { + return maxColumn; + } + return result; + } + }; + CursorState = class _CursorState { + static fromModelState(modelState) { + return new PartialModelCursorState(modelState); + } + static fromViewState(viewState) { + return new PartialViewCursorState(viewState); + } + static fromModelSelection(modelSelection) { + const selection = Selection.liftSelection(modelSelection); + const modelState = new SingleCursorState(Range.fromPositions(selection.getSelectionStart()), 0, 0, selection.getPosition(), 0); + return _CursorState.fromModelState(modelState); + } + static fromModelSelections(modelSelections) { + const states = []; + for (let i = 0, len = modelSelections.length; i < len; i++) { + states[i] = this.fromModelSelection(modelSelections[i]); + } + return states; + } + constructor(modelState, viewState) { + this._cursorStateBrand = void 0; + this.modelState = modelState; + this.viewState = viewState; + } + equals(other) { + return this.viewState.equals(other.viewState) && this.modelState.equals(other.modelState); + } + }; + PartialModelCursorState = class { + constructor(modelState) { + this.modelState = modelState; + this.viewState = null; + } + }; + PartialViewCursorState = class { + constructor(viewState) { + this.modelState = null; + this.viewState = viewState; + } + }; + SingleCursorState = class _SingleCursorState { + constructor(selectionStart, selectionStartKind, selectionStartLeftoverVisibleColumns, position, leftoverVisibleColumns) { + this.selectionStart = selectionStart; + this.selectionStartKind = selectionStartKind; + this.selectionStartLeftoverVisibleColumns = selectionStartLeftoverVisibleColumns; + this.position = position; + this.leftoverVisibleColumns = leftoverVisibleColumns; + this._singleCursorStateBrand = void 0; + this.selection = _SingleCursorState._computeSelection(this.selectionStart, this.position); + } + equals(other) { + return this.selectionStartLeftoverVisibleColumns === other.selectionStartLeftoverVisibleColumns && this.leftoverVisibleColumns === other.leftoverVisibleColumns && this.selectionStartKind === other.selectionStartKind && this.position.equals(other.position) && this.selectionStart.equalsRange(other.selectionStart); + } + hasSelection() { + return !this.selection.isEmpty() || !this.selectionStart.isEmpty(); + } + move(inSelectionMode, lineNumber, column, leftoverVisibleColumns) { + if (inSelectionMode) { + return new _SingleCursorState(this.selectionStart, this.selectionStartKind, this.selectionStartLeftoverVisibleColumns, new Position(lineNumber, column), leftoverVisibleColumns); + } else { + return new _SingleCursorState(new Range(lineNumber, column, lineNumber, column), 0, leftoverVisibleColumns, new Position(lineNumber, column), leftoverVisibleColumns); + } + } + static _computeSelection(selectionStart, position) { + if (selectionStart.isEmpty() || !position.isBeforeOrEqual(selectionStart.getStartPosition())) { + return Selection.fromPositions(selectionStart.getStartPosition(), position); + } else { + return Selection.fromPositions(selectionStart.getEndPosition(), position); + } + } + }; + EditOperationResult = class { + constructor(type, commands, opts) { + this._editOperationResultBrand = void 0; + this.type = type; + this.commands = commands; + this.shouldPushStackElementBefore = opts.shouldPushStackElementBefore; + this.shouldPushStackElementAfter = opts.shouldPushStackElementAfter; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorColumnSelection.js +var ColumnSelection; +var init_cursorColumnSelection = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorColumnSelection.js"() { + init_cursorCommon(); + init_position(); + init_range(); + ColumnSelection = class _ColumnSelection { + static columnSelect(config, model, fromLineNumber, fromVisibleColumn, toLineNumber, toVisibleColumn) { + const lineCount = Math.abs(toLineNumber - fromLineNumber) + 1; + const reversed = fromLineNumber > toLineNumber; + const isRTL = fromVisibleColumn > toVisibleColumn; + const isLTR = fromVisibleColumn < toVisibleColumn; + const result = []; + for (let i = 0; i < lineCount; i++) { + const lineNumber = fromLineNumber + (reversed ? -i : i); + const startColumn = config.columnFromVisibleColumn(model, lineNumber, fromVisibleColumn); + const endColumn = config.columnFromVisibleColumn(model, lineNumber, toVisibleColumn); + const visibleStartColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, startColumn)); + const visibleEndColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, endColumn)); + if (isLTR) { + if (visibleStartColumn > toVisibleColumn) { + continue; + } + if (visibleEndColumn < fromVisibleColumn) { + continue; + } + } + if (isRTL) { + if (visibleEndColumn > fromVisibleColumn) { + continue; + } + if (visibleStartColumn < toVisibleColumn) { + continue; + } + } + result.push(new SingleCursorState(new Range(lineNumber, startColumn, lineNumber, startColumn), 0, 0, new Position(lineNumber, endColumn), 0)); + } + if (result.length === 0) { + for (let i = 0; i < lineCount; i++) { + const lineNumber = fromLineNumber + (reversed ? -i : i); + const maxColumn = model.getLineMaxColumn(lineNumber); + result.push(new SingleCursorState(new Range(lineNumber, maxColumn, lineNumber, maxColumn), 0, 0, new Position(lineNumber, maxColumn), 0)); + } + } + return { + viewStates: result, + reversed, + fromLineNumber, + fromVisualColumn: fromVisibleColumn, + toLineNumber, + toVisualColumn: toVisibleColumn + }; + } + static columnSelectLeft(config, model, prevColumnSelectData) { + let toViewVisualColumn = prevColumnSelectData.toViewVisualColumn; + if (toViewVisualColumn > 0) { + toViewVisualColumn--; + } + return _ColumnSelection.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, prevColumnSelectData.toViewLineNumber, toViewVisualColumn); + } + static columnSelectRight(config, model, prevColumnSelectData) { + let maxVisualViewColumn = 0; + const minViewLineNumber = Math.min(prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.toViewLineNumber); + const maxViewLineNumber = Math.max(prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.toViewLineNumber); + for (let lineNumber = minViewLineNumber; lineNumber <= maxViewLineNumber; lineNumber++) { + const lineMaxViewColumn = model.getLineMaxColumn(lineNumber); + const lineMaxVisualViewColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, lineMaxViewColumn)); + maxVisualViewColumn = Math.max(maxVisualViewColumn, lineMaxVisualViewColumn); + } + let toViewVisualColumn = prevColumnSelectData.toViewVisualColumn; + if (toViewVisualColumn < maxVisualViewColumn) { + toViewVisualColumn++; + } + return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, prevColumnSelectData.toViewLineNumber, toViewVisualColumn); + } + static columnSelectUp(config, model, prevColumnSelectData, isPaged) { + const linesCount = isPaged ? config.pageSize : 1; + const toViewLineNumber = Math.max(1, prevColumnSelectData.toViewLineNumber - linesCount); + return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, toViewLineNumber, prevColumnSelectData.toViewVisualColumn); + } + static columnSelectDown(config, model, prevColumnSelectData, isPaged) { + const linesCount = isPaged ? config.pageSize : 1; + const toViewLineNumber = Math.min(model.getLineCount(), prevColumnSelectData.toViewLineNumber + linesCount); + return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, toViewLineNumber, prevColumnSelectData.toViewVisualColumn); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/commands/replaceCommand.js +var ReplaceCommand, ReplaceCommandThatSelectsText, ReplaceCommandWithoutChangingPosition, ReplaceCommandWithOffsetCursorState, ReplaceCommandThatPreservesSelection; +var init_replaceCommand = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/commands/replaceCommand.js"() { + init_selection(); + ReplaceCommand = class { + constructor(range2, text2, insertsAutoWhitespace = false) { + this._range = range2; + this._text = text2; + this.insertsAutoWhitespace = insertsAutoWhitespace; + } + getEditOperations(model, builder) { + builder.addTrackedEditOperation(this._range, this._text); + } + computeCursorState(model, helper) { + const inverseEditOperations = helper.getInverseEditOperations(); + const srcRange = inverseEditOperations[0].range; + return Selection.fromPositions(srcRange.getEndPosition()); + } + }; + ReplaceCommandThatSelectsText = class { + constructor(range2, text2) { + this._range = range2; + this._text = text2; + } + getEditOperations(model, builder) { + builder.addTrackedEditOperation(this._range, this._text); + } + computeCursorState(model, helper) { + const inverseEditOperations = helper.getInverseEditOperations(); + const srcRange = inverseEditOperations[0].range; + return Selection.fromRange( + srcRange, + 0 + /* SelectionDirection.LTR */ + ); + } + }; + ReplaceCommandWithoutChangingPosition = class { + constructor(range2, text2, insertsAutoWhitespace = false) { + this._range = range2; + this._text = text2; + this.insertsAutoWhitespace = insertsAutoWhitespace; + } + getEditOperations(model, builder) { + builder.addTrackedEditOperation(this._range, this._text); + } + computeCursorState(model, helper) { + const inverseEditOperations = helper.getInverseEditOperations(); + const srcRange = inverseEditOperations[0].range; + return Selection.fromPositions(srcRange.getStartPosition()); + } + }; + ReplaceCommandWithOffsetCursorState = class { + constructor(range2, text2, lineNumberDeltaOffset, columnDeltaOffset, insertsAutoWhitespace = false) { + this._range = range2; + this._text = text2; + this._columnDeltaOffset = columnDeltaOffset; + this._lineNumberDeltaOffset = lineNumberDeltaOffset; + this.insertsAutoWhitespace = insertsAutoWhitespace; + } + getEditOperations(model, builder) { + builder.addTrackedEditOperation(this._range, this._text); + } + computeCursorState(model, helper) { + const inverseEditOperations = helper.getInverseEditOperations(); + const srcRange = inverseEditOperations[0].range; + return Selection.fromPositions(srcRange.getEndPosition().delta(this._lineNumberDeltaOffset, this._columnDeltaOffset)); + } + }; + ReplaceCommandThatPreservesSelection = class { + constructor(editRange, text2, initialSelection, forceMoveMarkers = false) { + this._range = editRange; + this._text = text2; + this._initialSelection = initialSelection; + this._forceMoveMarkers = forceMoveMarkers; + this._selectionId = null; + } + getEditOperations(model, builder) { + builder.addTrackedEditOperation(this._range, this._text, this._forceMoveMarkers); + this._selectionId = builder.trackSelection(this._initialSelection); + } + computeCursorState(model, helper) { + return helper.getTrackedSelection(this._selectionId); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorMoveOperations.js +var CursorPosition, MoveOperations; +var init_cursorMoveOperations = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorMoveOperations.js"() { + init_strings(); + init_cursorColumns(); + init_position(); + init_range(); + init_cursorAtomicMoveOperations(); + init_cursorCommon(); + CursorPosition = class { + constructor(lineNumber, column, leftoverVisibleColumns) { + this._cursorPositionBrand = void 0; + this.lineNumber = lineNumber; + this.column = column; + this.leftoverVisibleColumns = leftoverVisibleColumns; + } + }; + MoveOperations = class _MoveOperations { + static leftPosition(model, position) { + if (position.column > model.getLineMinColumn(position.lineNumber)) { + return position.delta(void 0, -prevCharLength(model.getLineContent(position.lineNumber), position.column - 1)); + } else if (position.lineNumber > 1) { + const newLineNumber = position.lineNumber - 1; + return new Position(newLineNumber, model.getLineMaxColumn(newLineNumber)); + } else { + return position; + } + } + static leftPositionAtomicSoftTabs(model, position, tabSize) { + if (position.column <= model.getLineIndentColumn(position.lineNumber)) { + const minColumn = model.getLineMinColumn(position.lineNumber); + const lineContent = model.getLineContent(position.lineNumber); + const newPosition = AtomicTabMoveOperations.atomicPosition( + lineContent, + position.column - 1, + tabSize, + 0 + /* Direction.Left */ + ); + if (newPosition !== -1 && newPosition + 1 >= minColumn) { + return new Position(position.lineNumber, newPosition + 1); + } + } + return this.leftPosition(model, position); + } + static left(config, model, position) { + const pos = config.stickyTabStops ? _MoveOperations.leftPositionAtomicSoftTabs(model, position, config.tabSize) : _MoveOperations.leftPosition(model, position); + return new CursorPosition(pos.lineNumber, pos.column, 0); + } + /** + * @param noOfColumns Must be either `1` + * or `Math.round(viewModel.getLineContent(viewLineNumber).length / 2)` (for half lines). + */ + static moveLeft(config, model, cursor, inSelectionMode, noOfColumns) { + let lineNumber, column; + if (cursor.hasSelection() && !inSelectionMode) { + lineNumber = cursor.selection.startLineNumber; + column = cursor.selection.startColumn; + } else { + const pos = cursor.position.delta(void 0, -(noOfColumns - 1)); + const normalizedPos = model.normalizePosition( + _MoveOperations.clipPositionColumn(pos, model), + 0 + /* PositionAffinity.Left */ + ); + const p = _MoveOperations.left(config, model, normalizedPos); + lineNumber = p.lineNumber; + column = p.column; + } + return cursor.move(inSelectionMode, lineNumber, column, 0); + } + /** + * Adjusts the column so that it is within min/max of the line. + */ + static clipPositionColumn(position, model) { + return new Position(position.lineNumber, _MoveOperations.clipRange(position.column, model.getLineMinColumn(position.lineNumber), model.getLineMaxColumn(position.lineNumber))); + } + static clipRange(value, min, max) { + if (value < min) { + return min; + } + if (value > max) { + return max; + } + return value; + } + static rightPosition(model, lineNumber, column) { + if (column < model.getLineMaxColumn(lineNumber)) { + column = column + nextCharLength(model.getLineContent(lineNumber), column - 1); + } else if (lineNumber < model.getLineCount()) { + lineNumber = lineNumber + 1; + column = model.getLineMinColumn(lineNumber); + } + return new Position(lineNumber, column); + } + static rightPositionAtomicSoftTabs(model, lineNumber, column, tabSize, indentSize) { + if (column < model.getLineIndentColumn(lineNumber)) { + const lineContent = model.getLineContent(lineNumber); + const newPosition = AtomicTabMoveOperations.atomicPosition( + lineContent, + column - 1, + tabSize, + 1 + /* Direction.Right */ + ); + if (newPosition !== -1) { + return new Position(lineNumber, newPosition + 1); + } + } + return this.rightPosition(model, lineNumber, column); + } + static right(config, model, position) { + const pos = config.stickyTabStops ? _MoveOperations.rightPositionAtomicSoftTabs(model, position.lineNumber, position.column, config.tabSize, config.indentSize) : _MoveOperations.rightPosition(model, position.lineNumber, position.column); + return new CursorPosition(pos.lineNumber, pos.column, 0); + } + static moveRight(config, model, cursor, inSelectionMode, noOfColumns) { + let lineNumber, column; + if (cursor.hasSelection() && !inSelectionMode) { + lineNumber = cursor.selection.endLineNumber; + column = cursor.selection.endColumn; + } else { + const pos = cursor.position.delta(void 0, noOfColumns - 1); + const normalizedPos = model.normalizePosition( + _MoveOperations.clipPositionColumn(pos, model), + 1 + /* PositionAffinity.Right */ + ); + const r = _MoveOperations.right(config, model, normalizedPos); + lineNumber = r.lineNumber; + column = r.column; + } + return cursor.move(inSelectionMode, lineNumber, column, 0); + } + static vertical(config, model, lineNumber, column, leftoverVisibleColumns, newLineNumber, allowMoveOnEdgeLine, normalizationAffinity) { + const currentVisibleColumn = CursorColumns.visibleColumnFromColumn(model.getLineContent(lineNumber), column, config.tabSize) + leftoverVisibleColumns; + const lineCount = model.getLineCount(); + const wasOnFirstPosition = lineNumber === 1 && column === 1; + const wasOnLastPosition = lineNumber === lineCount && column === model.getLineMaxColumn(lineNumber); + const wasAtEdgePosition = newLineNumber < lineNumber ? wasOnFirstPosition : wasOnLastPosition; + lineNumber = newLineNumber; + if (lineNumber < 1) { + lineNumber = 1; + if (allowMoveOnEdgeLine) { + column = model.getLineMinColumn(lineNumber); + } else { + column = Math.min(model.getLineMaxColumn(lineNumber), column); + } + } else if (lineNumber > lineCount) { + lineNumber = lineCount; + if (allowMoveOnEdgeLine) { + column = model.getLineMaxColumn(lineNumber); + } else { + column = Math.min(model.getLineMaxColumn(lineNumber), column); + } + } else { + column = config.columnFromVisibleColumn(model, lineNumber, currentVisibleColumn); + } + if (wasAtEdgePosition) { + leftoverVisibleColumns = 0; + } else { + leftoverVisibleColumns = currentVisibleColumn - CursorColumns.visibleColumnFromColumn(model.getLineContent(lineNumber), column, config.tabSize); + } + if (normalizationAffinity !== void 0) { + const position = new Position(lineNumber, column); + const newPosition = model.normalizePosition(position, normalizationAffinity); + leftoverVisibleColumns = leftoverVisibleColumns + (column - newPosition.column); + lineNumber = newPosition.lineNumber; + column = newPosition.column; + } + return new CursorPosition(lineNumber, column, leftoverVisibleColumns); + } + static down(config, model, lineNumber, column, leftoverVisibleColumns, count, allowMoveOnLastLine) { + return this.vertical( + config, + model, + lineNumber, + column, + leftoverVisibleColumns, + lineNumber + count, + allowMoveOnLastLine, + 4 + /* PositionAffinity.RightOfInjectedText */ + ); + } + static moveDown(config, model, cursor, inSelectionMode, linesCount) { + let lineNumber, column; + if (cursor.hasSelection() && !inSelectionMode) { + lineNumber = cursor.selection.endLineNumber; + column = cursor.selection.endColumn; + } else { + lineNumber = cursor.position.lineNumber; + column = cursor.position.column; + } + let i = 0; + let r; + do { + r = _MoveOperations.down(config, model, lineNumber + i, column, cursor.leftoverVisibleColumns, linesCount, true); + const np = model.normalizePosition( + new Position(r.lineNumber, r.column), + 2 + /* PositionAffinity.None */ + ); + if (np.lineNumber > lineNumber) { + break; + } + } while (i++ < 10 && lineNumber + i < model.getLineCount()); + return cursor.move(inSelectionMode, r.lineNumber, r.column, r.leftoverVisibleColumns); + } + static translateDown(config, model, cursor) { + const selection = cursor.selection; + const selectionStart = _MoveOperations.down(config, model, selection.selectionStartLineNumber, selection.selectionStartColumn, cursor.selectionStartLeftoverVisibleColumns, 1, false); + const position = _MoveOperations.down(config, model, selection.positionLineNumber, selection.positionColumn, cursor.leftoverVisibleColumns, 1, false); + return new SingleCursorState(new Range(selectionStart.lineNumber, selectionStart.column, selectionStart.lineNumber, selectionStart.column), 0, selectionStart.leftoverVisibleColumns, new Position(position.lineNumber, position.column), position.leftoverVisibleColumns); + } + static up(config, model, lineNumber, column, leftoverVisibleColumns, count, allowMoveOnFirstLine) { + return this.vertical( + config, + model, + lineNumber, + column, + leftoverVisibleColumns, + lineNumber - count, + allowMoveOnFirstLine, + 3 + /* PositionAffinity.LeftOfInjectedText */ + ); + } + static moveUp(config, model, cursor, inSelectionMode, linesCount) { + let lineNumber, column; + if (cursor.hasSelection() && !inSelectionMode) { + lineNumber = cursor.selection.startLineNumber; + column = cursor.selection.startColumn; + } else { + lineNumber = cursor.position.lineNumber; + column = cursor.position.column; + } + const r = _MoveOperations.up(config, model, lineNumber, column, cursor.leftoverVisibleColumns, linesCount, true); + return cursor.move(inSelectionMode, r.lineNumber, r.column, r.leftoverVisibleColumns); + } + static translateUp(config, model, cursor) { + const selection = cursor.selection; + const selectionStart = _MoveOperations.up(config, model, selection.selectionStartLineNumber, selection.selectionStartColumn, cursor.selectionStartLeftoverVisibleColumns, 1, false); + const position = _MoveOperations.up(config, model, selection.positionLineNumber, selection.positionColumn, cursor.leftoverVisibleColumns, 1, false); + return new SingleCursorState(new Range(selectionStart.lineNumber, selectionStart.column, selectionStart.lineNumber, selectionStart.column), 0, selectionStart.leftoverVisibleColumns, new Position(position.lineNumber, position.column), position.leftoverVisibleColumns); + } + static _isBlankLine(model, lineNumber) { + if (model.getLineFirstNonWhitespaceColumn(lineNumber) === 0) { + return true; + } + return false; + } + static moveToPrevBlankLine(config, model, cursor, inSelectionMode) { + let lineNumber = cursor.position.lineNumber; + while (lineNumber > 1 && this._isBlankLine(model, lineNumber)) { + lineNumber--; + } + while (lineNumber > 1 && !this._isBlankLine(model, lineNumber)) { + lineNumber--; + } + return cursor.move(inSelectionMode, lineNumber, model.getLineMinColumn(lineNumber), 0); + } + static moveToNextBlankLine(config, model, cursor, inSelectionMode) { + const lineCount = model.getLineCount(); + let lineNumber = cursor.position.lineNumber; + while (lineNumber < lineCount && this._isBlankLine(model, lineNumber)) { + lineNumber++; + } + while (lineNumber < lineCount && !this._isBlankLine(model, lineNumber)) { + lineNumber++; + } + return cursor.move(inSelectionMode, lineNumber, model.getLineMinColumn(lineNumber), 0); + } + static moveToBeginningOfLine(config, model, cursor, inSelectionMode) { + const lineNumber = cursor.position.lineNumber; + const minColumn = model.getLineMinColumn(lineNumber); + const firstNonBlankColumn = model.getLineFirstNonWhitespaceColumn(lineNumber) || minColumn; + let column; + const relevantColumnNumber = cursor.position.column; + if (relevantColumnNumber === firstNonBlankColumn) { + column = minColumn; + } else { + column = firstNonBlankColumn; + } + return cursor.move(inSelectionMode, lineNumber, column, 0); + } + static moveToEndOfLine(config, model, cursor, inSelectionMode, sticky) { + const lineNumber = cursor.position.lineNumber; + const maxColumn = model.getLineMaxColumn(lineNumber); + return cursor.move(inSelectionMode, lineNumber, maxColumn, sticky ? 1073741824 - maxColumn : 0); + } + static moveToBeginningOfBuffer(config, model, cursor, inSelectionMode) { + return cursor.move(inSelectionMode, 1, 1, 0); + } + static moveToEndOfBuffer(config, model, cursor, inSelectionMode) { + const lastLineNumber = model.getLineCount(); + const lastColumn = model.getLineMaxColumn(lastLineNumber); + return cursor.move(inSelectionMode, lastLineNumber, lastColumn, 0); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorDeleteOperations.js +var DeleteOperations; +var init_cursorDeleteOperations = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorDeleteOperations.js"() { + init_strings(); + init_replaceCommand(); + init_cursorCommon(); + init_cursorColumns(); + init_cursorMoveOperations(); + init_range(); + init_position(); + DeleteOperations = class _DeleteOperations { + static deleteRight(prevEditOperationType, config, model, selections) { + const commands = []; + let shouldPushStackElementBefore = prevEditOperationType !== 3; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + let deleteSelection = selection; + if (deleteSelection.isEmpty()) { + const position = selection.getPosition(); + const rightOfPosition = MoveOperations.right(config, model, position); + deleteSelection = new Range(rightOfPosition.lineNumber, rightOfPosition.column, position.lineNumber, position.column); + } + if (deleteSelection.isEmpty()) { + commands[i] = null; + continue; + } + if (deleteSelection.startLineNumber !== deleteSelection.endLineNumber) { + shouldPushStackElementBefore = true; + } + commands[i] = new ReplaceCommand(deleteSelection, ""); + } + return [shouldPushStackElementBefore, commands]; + } + static isAutoClosingPairDelete(autoClosingDelete, autoClosingBrackets, autoClosingQuotes, autoClosingPairsOpen, model, selections, autoClosedCharacters) { + if (autoClosingBrackets === "never" && autoClosingQuotes === "never") { + return false; + } + if (autoClosingDelete === "never") { + return false; + } + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + const position = selection.getPosition(); + if (!selection.isEmpty()) { + return false; + } + const lineText = model.getLineContent(position.lineNumber); + if (position.column < 2 || position.column >= lineText.length + 1) { + return false; + } + const character = lineText.charAt(position.column - 2); + const autoClosingPairCandidates = autoClosingPairsOpen.get(character); + if (!autoClosingPairCandidates) { + return false; + } + if (isQuote(character)) { + if (autoClosingQuotes === "never") { + return false; + } + } else { + if (autoClosingBrackets === "never") { + return false; + } + } + const afterCharacter = lineText.charAt(position.column - 1); + let foundAutoClosingPair = false; + for (const autoClosingPairCandidate of autoClosingPairCandidates) { + if (autoClosingPairCandidate.open === character && autoClosingPairCandidate.close === afterCharacter) { + foundAutoClosingPair = true; + } + } + if (!foundAutoClosingPair) { + return false; + } + if (autoClosingDelete === "auto") { + let found = false; + for (let j = 0, lenJ = autoClosedCharacters.length; j < lenJ; j++) { + const autoClosedCharacter = autoClosedCharacters[j]; + if (position.lineNumber === autoClosedCharacter.startLineNumber && position.column === autoClosedCharacter.startColumn) { + found = true; + break; + } + } + if (!found) { + return false; + } + } + } + return true; + } + static _runAutoClosingPairDelete(config, model, selections) { + const commands = []; + for (let i = 0, len = selections.length; i < len; i++) { + const position = selections[i].getPosition(); + const deleteSelection = new Range(position.lineNumber, position.column - 1, position.lineNumber, position.column + 1); + commands[i] = new ReplaceCommand(deleteSelection, ""); + } + return [true, commands]; + } + static deleteLeft(prevEditOperationType, config, model, selections, autoClosedCharacters) { + if (this.isAutoClosingPairDelete(config.autoClosingDelete, config.autoClosingBrackets, config.autoClosingQuotes, config.autoClosingPairs.autoClosingPairsOpenByEnd, model, selections, autoClosedCharacters)) { + return this._runAutoClosingPairDelete(config, model, selections); + } + const commands = []; + let shouldPushStackElementBefore = prevEditOperationType !== 2; + for (let i = 0, len = selections.length; i < len; i++) { + const deleteRange = _DeleteOperations.getDeleteRange(selections[i], model, config); + if (deleteRange.isEmpty()) { + commands[i] = null; + continue; + } + if (deleteRange.startLineNumber !== deleteRange.endLineNumber) { + shouldPushStackElementBefore = true; + } + commands[i] = new ReplaceCommand(deleteRange, ""); + } + return [shouldPushStackElementBefore, commands]; + } + static getDeleteRange(selection, model, config) { + if (!selection.isEmpty()) { + return selection; + } + const position = selection.getPosition(); + if (config.useTabStops && position.column > 1) { + const lineContent = model.getLineContent(position.lineNumber); + const firstNonWhitespaceIndex2 = firstNonWhitespaceIndex(lineContent); + const lastIndentationColumn = firstNonWhitespaceIndex2 === -1 ? ( + /* entire string is whitespace */ + lineContent.length + 1 + ) : firstNonWhitespaceIndex2 + 1; + if (position.column <= lastIndentationColumn) { + const fromVisibleColumn = config.visibleColumnFromColumn(model, position); + const toVisibleColumn = CursorColumns.prevIndentTabStop(fromVisibleColumn, config.indentSize); + const toColumn = config.columnFromVisibleColumn(model, position.lineNumber, toVisibleColumn); + return new Range(position.lineNumber, toColumn, position.lineNumber, position.column); + } + } + return Range.fromPositions(_DeleteOperations.getPositionAfterDeleteLeft(position, model), position); + } + static getPositionAfterDeleteLeft(position, model) { + if (position.column > 1) { + const idx = getLeftDeleteOffset(position.column - 1, model.getLineContent(position.lineNumber)); + return position.with(void 0, idx + 1); + } else if (position.lineNumber > 1) { + const newLine = position.lineNumber - 1; + return new Position(newLine, model.getLineMaxColumn(newLine)); + } else { + return position; + } + } + static cut(config, model, selections) { + const commands = []; + let lastCutRange = null; + selections.sort((a3, b) => Position.compare(a3.getStartPosition(), b.getEndPosition())); + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + if (selection.isEmpty()) { + if (config.emptySelectionClipboard) { + const position = selection.getPosition(); + let startLineNumber, startColumn, endLineNumber, endColumn; + if (position.lineNumber < model.getLineCount()) { + startLineNumber = position.lineNumber; + startColumn = 1; + endLineNumber = position.lineNumber + 1; + endColumn = 1; + } else if (position.lineNumber > 1 && (lastCutRange === null || lastCutRange === void 0 ? void 0 : lastCutRange.endLineNumber) !== position.lineNumber) { + startLineNumber = position.lineNumber - 1; + startColumn = model.getLineMaxColumn(position.lineNumber - 1); + endLineNumber = position.lineNumber; + endColumn = model.getLineMaxColumn(position.lineNumber); + } else { + startLineNumber = position.lineNumber; + startColumn = 1; + endLineNumber = position.lineNumber; + endColumn = model.getLineMaxColumn(position.lineNumber); + } + const deleteSelection = new Range(startLineNumber, startColumn, endLineNumber, endColumn); + lastCutRange = deleteSelection; + if (!deleteSelection.isEmpty()) { + commands[i] = new ReplaceCommand(deleteSelection, ""); + } else { + commands[i] = null; + } + } else { + commands[i] = null; + } + } else { + commands[i] = new ReplaceCommand(selection, ""); + } + } + return new EditOperationResult(0, commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: true + }); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorWordOperations.js +function enforceDefined(arr) { + return arr.filter((el) => Boolean(el)); +} +var WordOperations, WordPartOperations; +var init_cursorWordOperations = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorWordOperations.js"() { + init_strings(); + init_cursorCommon(); + init_cursorDeleteOperations(); + init_wordCharacterClassifier(); + init_position(); + init_range(); + WordOperations = class _WordOperations { + static _createWord(lineContent, wordType, nextCharClass, start, end) { + return { start, end, wordType, nextCharClass }; + } + static _createIntlWord(intlWord, nextCharClass) { + return { start: intlWord.index, end: intlWord.index + intlWord.segment.length, wordType: 1, nextCharClass }; + } + static _findPreviousWordOnLine(wordSeparators2, model, position) { + const lineContent = model.getLineContent(position.lineNumber); + return this._doFindPreviousWordOnLine(lineContent, wordSeparators2, position); + } + static _doFindPreviousWordOnLine(lineContent, wordSeparators2, position) { + let wordType = 0; + const previousIntlWord = wordSeparators2.findPrevIntlWordBeforeOrAtOffset(lineContent, position.column - 2); + for (let chIndex = position.column - 2; chIndex >= 0; chIndex--) { + const chCode = lineContent.charCodeAt(chIndex); + const chClass = wordSeparators2.get(chCode); + if (previousIntlWord && chIndex === previousIntlWord.index) { + return this._createIntlWord(previousIntlWord, chClass); + } + if (chClass === 0) { + if (wordType === 2) { + return this._createWord(lineContent, wordType, chClass, chIndex + 1, this._findEndOfWord(lineContent, wordSeparators2, wordType, chIndex + 1)); + } + wordType = 1; + } else if (chClass === 2) { + if (wordType === 1) { + return this._createWord(lineContent, wordType, chClass, chIndex + 1, this._findEndOfWord(lineContent, wordSeparators2, wordType, chIndex + 1)); + } + wordType = 2; + } else if (chClass === 1) { + if (wordType !== 0) { + return this._createWord(lineContent, wordType, chClass, chIndex + 1, this._findEndOfWord(lineContent, wordSeparators2, wordType, chIndex + 1)); + } + } + } + if (wordType !== 0) { + return this._createWord(lineContent, wordType, 1, 0, this._findEndOfWord(lineContent, wordSeparators2, wordType, 0)); + } + return null; + } + static _findEndOfWord(lineContent, wordSeparators2, wordType, startIndex) { + const nextIntlWord = wordSeparators2.findNextIntlWordAtOrAfterOffset(lineContent, startIndex); + const len = lineContent.length; + for (let chIndex = startIndex; chIndex < len; chIndex++) { + const chCode = lineContent.charCodeAt(chIndex); + const chClass = wordSeparators2.get(chCode); + if (nextIntlWord && chIndex === nextIntlWord.index + nextIntlWord.segment.length) { + return chIndex; + } + if (chClass === 1) { + return chIndex; + } + if (wordType === 1 && chClass === 2) { + return chIndex; + } + if (wordType === 2 && chClass === 0) { + return chIndex; + } + } + return len; + } + static _findNextWordOnLine(wordSeparators2, model, position) { + const lineContent = model.getLineContent(position.lineNumber); + return this._doFindNextWordOnLine(lineContent, wordSeparators2, position); + } + static _doFindNextWordOnLine(lineContent, wordSeparators2, position) { + let wordType = 0; + const len = lineContent.length; + const nextIntlWord = wordSeparators2.findNextIntlWordAtOrAfterOffset(lineContent, position.column - 1); + for (let chIndex = position.column - 1; chIndex < len; chIndex++) { + const chCode = lineContent.charCodeAt(chIndex); + const chClass = wordSeparators2.get(chCode); + if (nextIntlWord && chIndex === nextIntlWord.index) { + return this._createIntlWord(nextIntlWord, chClass); + } + if (chClass === 0) { + if (wordType === 2) { + return this._createWord(lineContent, wordType, chClass, this._findStartOfWord(lineContent, wordSeparators2, wordType, chIndex - 1), chIndex); + } + wordType = 1; + } else if (chClass === 2) { + if (wordType === 1) { + return this._createWord(lineContent, wordType, chClass, this._findStartOfWord(lineContent, wordSeparators2, wordType, chIndex - 1), chIndex); + } + wordType = 2; + } else if (chClass === 1) { + if (wordType !== 0) { + return this._createWord(lineContent, wordType, chClass, this._findStartOfWord(lineContent, wordSeparators2, wordType, chIndex - 1), chIndex); + } + } + } + if (wordType !== 0) { + return this._createWord(lineContent, wordType, 1, this._findStartOfWord(lineContent, wordSeparators2, wordType, len - 1), len); + } + return null; + } + static _findStartOfWord(lineContent, wordSeparators2, wordType, startIndex) { + const previousIntlWord = wordSeparators2.findPrevIntlWordBeforeOrAtOffset(lineContent, startIndex); + for (let chIndex = startIndex; chIndex >= 0; chIndex--) { + const chCode = lineContent.charCodeAt(chIndex); + const chClass = wordSeparators2.get(chCode); + if (previousIntlWord && chIndex === previousIntlWord.index) { + return chIndex; + } + if (chClass === 1) { + return chIndex + 1; + } + if (wordType === 1 && chClass === 2) { + return chIndex + 1; + } + if (wordType === 2 && chClass === 0) { + return chIndex + 1; + } + } + return 0; + } + static moveWordLeft(wordSeparators2, model, position, wordNavigationType) { + let lineNumber = position.lineNumber; + let column = position.column; + if (column === 1) { + if (lineNumber > 1) { + lineNumber = lineNumber - 1; + column = model.getLineMaxColumn(lineNumber); + } + } + let prevWordOnLine = _WordOperations._findPreviousWordOnLine(wordSeparators2, model, new Position(lineNumber, column)); + if (wordNavigationType === 0) { + return new Position(lineNumber, prevWordOnLine ? prevWordOnLine.start + 1 : 1); + } + if (wordNavigationType === 1) { + if (prevWordOnLine && prevWordOnLine.wordType === 2 && prevWordOnLine.end - prevWordOnLine.start === 1 && prevWordOnLine.nextCharClass === 0) { + prevWordOnLine = _WordOperations._findPreviousWordOnLine(wordSeparators2, model, new Position(lineNumber, prevWordOnLine.start + 1)); + } + return new Position(lineNumber, prevWordOnLine ? prevWordOnLine.start + 1 : 1); + } + if (wordNavigationType === 3) { + while (prevWordOnLine && prevWordOnLine.wordType === 2) { + prevWordOnLine = _WordOperations._findPreviousWordOnLine(wordSeparators2, model, new Position(lineNumber, prevWordOnLine.start + 1)); + } + return new Position(lineNumber, prevWordOnLine ? prevWordOnLine.start + 1 : 1); + } + if (prevWordOnLine && column <= prevWordOnLine.end + 1) { + prevWordOnLine = _WordOperations._findPreviousWordOnLine(wordSeparators2, model, new Position(lineNumber, prevWordOnLine.start + 1)); + } + return new Position(lineNumber, prevWordOnLine ? prevWordOnLine.end + 1 : 1); + } + static _moveWordPartLeft(model, position) { + const lineNumber = position.lineNumber; + const maxColumn = model.getLineMaxColumn(lineNumber); + if (position.column === 1) { + return lineNumber > 1 ? new Position(lineNumber - 1, model.getLineMaxColumn(lineNumber - 1)) : position; + } + const lineContent = model.getLineContent(lineNumber); + for (let column = position.column - 1; column > 1; column--) { + const left = lineContent.charCodeAt(column - 2); + const right = lineContent.charCodeAt(column - 1); + if (left === 95 && right !== 95) { + return new Position(lineNumber, column); + } + if (left === 45 && right !== 45) { + return new Position(lineNumber, column); + } + if ((isLowerAsciiLetter(left) || isAsciiDigit(left)) && isUpperAsciiLetter(right)) { + return new Position(lineNumber, column); + } + if (isUpperAsciiLetter(left) && isUpperAsciiLetter(right)) { + if (column + 1 < maxColumn) { + const rightRight = lineContent.charCodeAt(column); + if (isLowerAsciiLetter(rightRight) || isAsciiDigit(rightRight)) { + return new Position(lineNumber, column); + } + } + } + } + return new Position(lineNumber, 1); + } + static moveWordRight(wordSeparators2, model, position, wordNavigationType) { + let lineNumber = position.lineNumber; + let column = position.column; + let movedDown = false; + if (column === model.getLineMaxColumn(lineNumber)) { + if (lineNumber < model.getLineCount()) { + movedDown = true; + lineNumber = lineNumber + 1; + column = 1; + } + } + let nextWordOnLine = _WordOperations._findNextWordOnLine(wordSeparators2, model, new Position(lineNumber, column)); + if (wordNavigationType === 2) { + if (nextWordOnLine && nextWordOnLine.wordType === 2) { + if (nextWordOnLine.end - nextWordOnLine.start === 1 && nextWordOnLine.nextCharClass === 0) { + nextWordOnLine = _WordOperations._findNextWordOnLine(wordSeparators2, model, new Position(lineNumber, nextWordOnLine.end + 1)); + } + } + if (nextWordOnLine) { + column = nextWordOnLine.end + 1; + } else { + column = model.getLineMaxColumn(lineNumber); + } + } else if (wordNavigationType === 3) { + if (movedDown) { + column = 0; + } + while (nextWordOnLine && (nextWordOnLine.wordType === 2 || nextWordOnLine.start + 1 <= column)) { + nextWordOnLine = _WordOperations._findNextWordOnLine(wordSeparators2, model, new Position(lineNumber, nextWordOnLine.end + 1)); + } + if (nextWordOnLine) { + column = nextWordOnLine.start + 1; + } else { + column = model.getLineMaxColumn(lineNumber); + } + } else { + if (nextWordOnLine && !movedDown && column >= nextWordOnLine.start + 1) { + nextWordOnLine = _WordOperations._findNextWordOnLine(wordSeparators2, model, new Position(lineNumber, nextWordOnLine.end + 1)); + } + if (nextWordOnLine) { + column = nextWordOnLine.start + 1; + } else { + column = model.getLineMaxColumn(lineNumber); + } + } + return new Position(lineNumber, column); + } + static _moveWordPartRight(model, position) { + const lineNumber = position.lineNumber; + const maxColumn = model.getLineMaxColumn(lineNumber); + if (position.column === maxColumn) { + return lineNumber < model.getLineCount() ? new Position(lineNumber + 1, 1) : position; + } + const lineContent = model.getLineContent(lineNumber); + for (let column = position.column + 1; column < maxColumn; column++) { + const left = lineContent.charCodeAt(column - 2); + const right = lineContent.charCodeAt(column - 1); + if (left !== 95 && right === 95) { + return new Position(lineNumber, column); + } + if (left !== 45 && right === 45) { + return new Position(lineNumber, column); + } + if ((isLowerAsciiLetter(left) || isAsciiDigit(left)) && isUpperAsciiLetter(right)) { + return new Position(lineNumber, column); + } + if (isUpperAsciiLetter(left) && isUpperAsciiLetter(right)) { + if (column + 1 < maxColumn) { + const rightRight = lineContent.charCodeAt(column); + if (isLowerAsciiLetter(rightRight) || isAsciiDigit(rightRight)) { + return new Position(lineNumber, column); + } + } + } + } + return new Position(lineNumber, maxColumn); + } + static _deleteWordLeftWhitespace(model, position) { + const lineContent = model.getLineContent(position.lineNumber); + const startIndex = position.column - 2; + const lastNonWhitespace = lastNonWhitespaceIndex(lineContent, startIndex); + if (lastNonWhitespace + 1 < startIndex) { + return new Range(position.lineNumber, lastNonWhitespace + 2, position.lineNumber, position.column); + } + return null; + } + static deleteWordLeft(ctx, wordNavigationType) { + const wordSeparators2 = ctx.wordSeparators; + const model = ctx.model; + const selection = ctx.selection; + const whitespaceHeuristics = ctx.whitespaceHeuristics; + if (!selection.isEmpty()) { + return selection; + } + if (DeleteOperations.isAutoClosingPairDelete(ctx.autoClosingDelete, ctx.autoClosingBrackets, ctx.autoClosingQuotes, ctx.autoClosingPairs.autoClosingPairsOpenByEnd, ctx.model, [ctx.selection], ctx.autoClosedCharacters)) { + const position2 = ctx.selection.getPosition(); + return new Range(position2.lineNumber, position2.column - 1, position2.lineNumber, position2.column + 1); + } + const position = new Position(selection.positionLineNumber, selection.positionColumn); + let lineNumber = position.lineNumber; + let column = position.column; + if (lineNumber === 1 && column === 1) { + return null; + } + if (whitespaceHeuristics) { + const r = this._deleteWordLeftWhitespace(model, position); + if (r) { + return r; + } + } + let prevWordOnLine = _WordOperations._findPreviousWordOnLine(wordSeparators2, model, position); + if (wordNavigationType === 0) { + if (prevWordOnLine) { + column = prevWordOnLine.start + 1; + } else { + if (column > 1) { + column = 1; + } else { + lineNumber--; + column = model.getLineMaxColumn(lineNumber); + } + } + } else { + if (prevWordOnLine && column <= prevWordOnLine.end + 1) { + prevWordOnLine = _WordOperations._findPreviousWordOnLine(wordSeparators2, model, new Position(lineNumber, prevWordOnLine.start + 1)); + } + if (prevWordOnLine) { + column = prevWordOnLine.end + 1; + } else { + if (column > 1) { + column = 1; + } else { + lineNumber--; + column = model.getLineMaxColumn(lineNumber); + } + } + } + return new Range(lineNumber, column, position.lineNumber, position.column); + } + static deleteInsideWord(wordSeparators2, model, selection) { + if (!selection.isEmpty()) { + return selection; + } + const position = new Position(selection.positionLineNumber, selection.positionColumn); + const r = this._deleteInsideWordWhitespace(model, position); + if (r) { + return r; + } + return this._deleteInsideWordDetermineDeleteRange(wordSeparators2, model, position); + } + static _charAtIsWhitespace(str, index) { + const charCode = str.charCodeAt(index); + return charCode === 32 || charCode === 9; + } + static _deleteInsideWordWhitespace(model, position) { + const lineContent = model.getLineContent(position.lineNumber); + const lineContentLength = lineContent.length; + if (lineContentLength === 0) { + return null; + } + let leftIndex = Math.max(position.column - 2, 0); + if (!this._charAtIsWhitespace(lineContent, leftIndex)) { + return null; + } + let rightIndex = Math.min(position.column - 1, lineContentLength - 1); + if (!this._charAtIsWhitespace(lineContent, rightIndex)) { + return null; + } + while (leftIndex > 0 && this._charAtIsWhitespace(lineContent, leftIndex - 1)) { + leftIndex--; + } + while (rightIndex + 1 < lineContentLength && this._charAtIsWhitespace(lineContent, rightIndex + 1)) { + rightIndex++; + } + return new Range(position.lineNumber, leftIndex + 1, position.lineNumber, rightIndex + 2); + } + static _deleteInsideWordDetermineDeleteRange(wordSeparators2, model, position) { + const lineContent = model.getLineContent(position.lineNumber); + const lineLength = lineContent.length; + if (lineLength === 0) { + if (position.lineNumber > 1) { + return new Range(position.lineNumber - 1, model.getLineMaxColumn(position.lineNumber - 1), position.lineNumber, 1); + } else { + if (position.lineNumber < model.getLineCount()) { + return new Range(position.lineNumber, 1, position.lineNumber + 1, 1); + } else { + return new Range(position.lineNumber, 1, position.lineNumber, 1); + } + } + } + const touchesWord = (word) => { + return word.start + 1 <= position.column && position.column <= word.end + 1; + }; + const createRangeWithPosition = (startColumn, endColumn) => { + startColumn = Math.min(startColumn, position.column); + endColumn = Math.max(endColumn, position.column); + return new Range(position.lineNumber, startColumn, position.lineNumber, endColumn); + }; + const deleteWordAndAdjacentWhitespace = (word) => { + let startColumn = word.start + 1; + let endColumn = word.end + 1; + let expandedToTheRight = false; + while (endColumn - 1 < lineLength && this._charAtIsWhitespace(lineContent, endColumn - 1)) { + expandedToTheRight = true; + endColumn++; + } + if (!expandedToTheRight) { + while (startColumn > 1 && this._charAtIsWhitespace(lineContent, startColumn - 2)) { + startColumn--; + } + } + return createRangeWithPosition(startColumn, endColumn); + }; + const prevWordOnLine = _WordOperations._findPreviousWordOnLine(wordSeparators2, model, position); + if (prevWordOnLine && touchesWord(prevWordOnLine)) { + return deleteWordAndAdjacentWhitespace(prevWordOnLine); + } + const nextWordOnLine = _WordOperations._findNextWordOnLine(wordSeparators2, model, position); + if (nextWordOnLine && touchesWord(nextWordOnLine)) { + return deleteWordAndAdjacentWhitespace(nextWordOnLine); + } + if (prevWordOnLine && nextWordOnLine) { + return createRangeWithPosition(prevWordOnLine.end + 1, nextWordOnLine.start + 1); + } + if (prevWordOnLine) { + return createRangeWithPosition(prevWordOnLine.start + 1, prevWordOnLine.end + 1); + } + if (nextWordOnLine) { + return createRangeWithPosition(nextWordOnLine.start + 1, nextWordOnLine.end + 1); + } + return createRangeWithPosition(1, lineLength + 1); + } + static _deleteWordPartLeft(model, selection) { + if (!selection.isEmpty()) { + return selection; + } + const pos = selection.getPosition(); + const toPosition = _WordOperations._moveWordPartLeft(model, pos); + return new Range(pos.lineNumber, pos.column, toPosition.lineNumber, toPosition.column); + } + static _findFirstNonWhitespaceChar(str, startIndex) { + const len = str.length; + for (let chIndex = startIndex; chIndex < len; chIndex++) { + const ch = str.charAt(chIndex); + if (ch !== " " && ch !== " ") { + return chIndex; + } + } + return len; + } + static _deleteWordRightWhitespace(model, position) { + const lineContent = model.getLineContent(position.lineNumber); + const startIndex = position.column - 1; + const firstNonWhitespace = this._findFirstNonWhitespaceChar(lineContent, startIndex); + if (startIndex + 1 < firstNonWhitespace) { + return new Range(position.lineNumber, position.column, position.lineNumber, firstNonWhitespace + 1); + } + return null; + } + static deleteWordRight(ctx, wordNavigationType) { + const wordSeparators2 = ctx.wordSeparators; + const model = ctx.model; + const selection = ctx.selection; + const whitespaceHeuristics = ctx.whitespaceHeuristics; + if (!selection.isEmpty()) { + return selection; + } + const position = new Position(selection.positionLineNumber, selection.positionColumn); + let lineNumber = position.lineNumber; + let column = position.column; + const lineCount = model.getLineCount(); + const maxColumn = model.getLineMaxColumn(lineNumber); + if (lineNumber === lineCount && column === maxColumn) { + return null; + } + if (whitespaceHeuristics) { + const r = this._deleteWordRightWhitespace(model, position); + if (r) { + return r; + } + } + let nextWordOnLine = _WordOperations._findNextWordOnLine(wordSeparators2, model, position); + if (wordNavigationType === 2) { + if (nextWordOnLine) { + column = nextWordOnLine.end + 1; + } else { + if (column < maxColumn || lineNumber === lineCount) { + column = maxColumn; + } else { + lineNumber++; + nextWordOnLine = _WordOperations._findNextWordOnLine(wordSeparators2, model, new Position(lineNumber, 1)); + if (nextWordOnLine) { + column = nextWordOnLine.start + 1; + } else { + column = model.getLineMaxColumn(lineNumber); + } + } + } + } else { + if (nextWordOnLine && column >= nextWordOnLine.start + 1) { + nextWordOnLine = _WordOperations._findNextWordOnLine(wordSeparators2, model, new Position(lineNumber, nextWordOnLine.end + 1)); + } + if (nextWordOnLine) { + column = nextWordOnLine.start + 1; + } else { + if (column < maxColumn || lineNumber === lineCount) { + column = maxColumn; + } else { + lineNumber++; + nextWordOnLine = _WordOperations._findNextWordOnLine(wordSeparators2, model, new Position(lineNumber, 1)); + if (nextWordOnLine) { + column = nextWordOnLine.start + 1; + } else { + column = model.getLineMaxColumn(lineNumber); + } + } + } + } + return new Range(lineNumber, column, position.lineNumber, position.column); + } + static _deleteWordPartRight(model, selection) { + if (!selection.isEmpty()) { + return selection; + } + const pos = selection.getPosition(); + const toPosition = _WordOperations._moveWordPartRight(model, pos); + return new Range(pos.lineNumber, pos.column, toPosition.lineNumber, toPosition.column); + } + static _createWordAtPosition(model, lineNumber, word) { + const range2 = new Range(lineNumber, word.start + 1, lineNumber, word.end + 1); + return { + word: model.getValueInRange(range2), + startColumn: range2.startColumn, + endColumn: range2.endColumn + }; + } + static getWordAtPosition(model, _wordSeparators, _intlSegmenterLocales, position) { + const wordSeparators2 = getMapForWordSeparators(_wordSeparators, _intlSegmenterLocales); + const prevWord = _WordOperations._findPreviousWordOnLine(wordSeparators2, model, position); + if (prevWord && prevWord.wordType === 1 && prevWord.start <= position.column - 1 && position.column - 1 <= prevWord.end) { + return _WordOperations._createWordAtPosition(model, position.lineNumber, prevWord); + } + const nextWord2 = _WordOperations._findNextWordOnLine(wordSeparators2, model, position); + if (nextWord2 && nextWord2.wordType === 1 && nextWord2.start <= position.column - 1 && position.column - 1 <= nextWord2.end) { + return _WordOperations._createWordAtPosition(model, position.lineNumber, nextWord2); + } + return null; + } + static word(config, model, cursor, inSelectionMode, position) { + const wordSeparators2 = getMapForWordSeparators(config.wordSeparators, config.wordSegmenterLocales); + const prevWord = _WordOperations._findPreviousWordOnLine(wordSeparators2, model, position); + const nextWord2 = _WordOperations._findNextWordOnLine(wordSeparators2, model, position); + if (!inSelectionMode) { + let startColumn2; + let endColumn2; + if (prevWord && prevWord.wordType === 1 && prevWord.start <= position.column - 1 && position.column - 1 <= prevWord.end) { + startColumn2 = prevWord.start + 1; + endColumn2 = prevWord.end + 1; + } else if (nextWord2 && nextWord2.wordType === 1 && nextWord2.start <= position.column - 1 && position.column - 1 <= nextWord2.end) { + startColumn2 = nextWord2.start + 1; + endColumn2 = nextWord2.end + 1; + } else { + if (prevWord) { + startColumn2 = prevWord.end + 1; + } else { + startColumn2 = 1; + } + if (nextWord2) { + endColumn2 = nextWord2.start + 1; + } else { + endColumn2 = model.getLineMaxColumn(position.lineNumber); + } + } + return new SingleCursorState(new Range(position.lineNumber, startColumn2, position.lineNumber, endColumn2), 1, 0, new Position(position.lineNumber, endColumn2), 0); + } + let startColumn; + let endColumn; + if (prevWord && prevWord.wordType === 1 && prevWord.start < position.column - 1 && position.column - 1 < prevWord.end) { + startColumn = prevWord.start + 1; + endColumn = prevWord.end + 1; + } else if (nextWord2 && nextWord2.wordType === 1 && nextWord2.start < position.column - 1 && position.column - 1 < nextWord2.end) { + startColumn = nextWord2.start + 1; + endColumn = nextWord2.end + 1; + } else { + startColumn = position.column; + endColumn = position.column; + } + const lineNumber = position.lineNumber; + let column; + if (cursor.selectionStart.containsPosition(position)) { + column = cursor.selectionStart.endColumn; + } else if (position.isBeforeOrEqual(cursor.selectionStart.getStartPosition())) { + column = startColumn; + const possiblePosition = new Position(lineNumber, column); + if (cursor.selectionStart.containsPosition(possiblePosition)) { + column = cursor.selectionStart.endColumn; + } + } else { + column = endColumn; + const possiblePosition = new Position(lineNumber, column); + if (cursor.selectionStart.containsPosition(possiblePosition)) { + column = cursor.selectionStart.startColumn; + } + } + return cursor.move(true, lineNumber, column, 0); + } + }; + WordPartOperations = class extends WordOperations { + static deleteWordPartLeft(ctx) { + const candidates = enforceDefined([ + WordOperations.deleteWordLeft( + ctx, + 0 + /* WordNavigationType.WordStart */ + ), + WordOperations.deleteWordLeft( + ctx, + 2 + /* WordNavigationType.WordEnd */ + ), + WordOperations._deleteWordPartLeft(ctx.model, ctx.selection) + ]); + candidates.sort(Range.compareRangesUsingEnds); + return candidates[2]; + } + static deleteWordPartRight(ctx) { + const candidates = enforceDefined([ + WordOperations.deleteWordRight( + ctx, + 0 + /* WordNavigationType.WordStart */ + ), + WordOperations.deleteWordRight( + ctx, + 2 + /* WordNavigationType.WordEnd */ + ), + WordOperations._deleteWordPartRight(ctx.model, ctx.selection) + ]); + candidates.sort(Range.compareRangesUsingStarts); + return candidates[0]; + } + static moveWordPartLeft(wordSeparators2, model, position) { + const candidates = enforceDefined([ + WordOperations.moveWordLeft( + wordSeparators2, + model, + position, + 0 + /* WordNavigationType.WordStart */ + ), + WordOperations.moveWordLeft( + wordSeparators2, + model, + position, + 2 + /* WordNavigationType.WordEnd */ + ), + WordOperations._moveWordPartLeft(model, position) + ]); + candidates.sort(Position.compare); + return candidates[2]; + } + static moveWordPartRight(wordSeparators2, model, position) { + const candidates = enforceDefined([ + WordOperations.moveWordRight( + wordSeparators2, + model, + position, + 0 + /* WordNavigationType.WordStart */ + ), + WordOperations.moveWordRight( + wordSeparators2, + model, + position, + 2 + /* WordNavigationType.WordEnd */ + ), + WordOperations._moveWordPartRight(model, position) + ]); + candidates.sort(Position.compare); + return candidates[0]; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorMoveCommands.js +var CursorMoveCommands, CursorMove; +var init_cursorMoveCommands = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorMoveCommands.js"() { + init_types(); + init_cursorCommon(); + init_cursorMoveOperations(); + init_cursorWordOperations(); + init_position(); + init_range(); + CursorMoveCommands = class { + static addCursorDown(viewModel, cursors, useLogicalLine) { + const result = []; + let resultLen = 0; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + result[resultLen++] = new CursorState(cursor.modelState, cursor.viewState); + if (useLogicalLine) { + result[resultLen++] = CursorState.fromModelState(MoveOperations.translateDown(viewModel.cursorConfig, viewModel.model, cursor.modelState)); + } else { + result[resultLen++] = CursorState.fromViewState(MoveOperations.translateDown(viewModel.cursorConfig, viewModel, cursor.viewState)); + } + } + return result; + } + static addCursorUp(viewModel, cursors, useLogicalLine) { + const result = []; + let resultLen = 0; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + result[resultLen++] = new CursorState(cursor.modelState, cursor.viewState); + if (useLogicalLine) { + result[resultLen++] = CursorState.fromModelState(MoveOperations.translateUp(viewModel.cursorConfig, viewModel.model, cursor.modelState)); + } else { + result[resultLen++] = CursorState.fromViewState(MoveOperations.translateUp(viewModel.cursorConfig, viewModel, cursor.viewState)); + } + } + return result; + } + static moveToBeginningOfLine(viewModel, cursors, inSelectionMode) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + result[i] = this._moveToLineStart(viewModel, cursor, inSelectionMode); + } + return result; + } + static _moveToLineStart(viewModel, cursor, inSelectionMode) { + const currentViewStateColumn = cursor.viewState.position.column; + const currentModelStateColumn = cursor.modelState.position.column; + const isFirstLineOfWrappedLine = currentViewStateColumn === currentModelStateColumn; + const currentViewStatelineNumber = cursor.viewState.position.lineNumber; + const firstNonBlankColumn = viewModel.getLineFirstNonWhitespaceColumn(currentViewStatelineNumber); + const isBeginningOfViewLine = currentViewStateColumn === firstNonBlankColumn; + if (!isFirstLineOfWrappedLine && !isBeginningOfViewLine) { + return this._moveToLineStartByView(viewModel, cursor, inSelectionMode); + } else { + return this._moveToLineStartByModel(viewModel, cursor, inSelectionMode); + } + } + static _moveToLineStartByView(viewModel, cursor, inSelectionMode) { + return CursorState.fromViewState(MoveOperations.moveToBeginningOfLine(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode)); + } + static _moveToLineStartByModel(viewModel, cursor, inSelectionMode) { + return CursorState.fromModelState(MoveOperations.moveToBeginningOfLine(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode)); + } + static moveToEndOfLine(viewModel, cursors, inSelectionMode, sticky) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + result[i] = this._moveToLineEnd(viewModel, cursor, inSelectionMode, sticky); + } + return result; + } + static _moveToLineEnd(viewModel, cursor, inSelectionMode, sticky) { + const viewStatePosition = cursor.viewState.position; + const viewModelMaxColumn = viewModel.getLineMaxColumn(viewStatePosition.lineNumber); + const isEndOfViewLine = viewStatePosition.column === viewModelMaxColumn; + const modelStatePosition = cursor.modelState.position; + const modelMaxColumn = viewModel.model.getLineMaxColumn(modelStatePosition.lineNumber); + const isEndLineOfWrappedLine = viewModelMaxColumn - viewStatePosition.column === modelMaxColumn - modelStatePosition.column; + if (isEndOfViewLine || isEndLineOfWrappedLine) { + return this._moveToLineEndByModel(viewModel, cursor, inSelectionMode, sticky); + } else { + return this._moveToLineEndByView(viewModel, cursor, inSelectionMode, sticky); + } + } + static _moveToLineEndByView(viewModel, cursor, inSelectionMode, sticky) { + return CursorState.fromViewState(MoveOperations.moveToEndOfLine(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, sticky)); + } + static _moveToLineEndByModel(viewModel, cursor, inSelectionMode, sticky) { + return CursorState.fromModelState(MoveOperations.moveToEndOfLine(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode, sticky)); + } + static expandLineSelection(viewModel, cursors) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + const startLineNumber = cursor.modelState.selection.startLineNumber; + const lineCount = viewModel.model.getLineCount(); + let endLineNumber = cursor.modelState.selection.endLineNumber; + let endColumn; + if (endLineNumber === lineCount) { + endColumn = viewModel.model.getLineMaxColumn(lineCount); + } else { + endLineNumber++; + endColumn = 1; + } + result[i] = CursorState.fromModelState(new SingleCursorState(new Range(startLineNumber, 1, startLineNumber, 1), 0, 0, new Position(endLineNumber, endColumn), 0)); + } + return result; + } + static moveToBeginningOfBuffer(viewModel, cursors, inSelectionMode) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + result[i] = CursorState.fromModelState(MoveOperations.moveToBeginningOfBuffer(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode)); + } + return result; + } + static moveToEndOfBuffer(viewModel, cursors, inSelectionMode) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + result[i] = CursorState.fromModelState(MoveOperations.moveToEndOfBuffer(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode)); + } + return result; + } + static selectAll(viewModel, cursor) { + const lineCount = viewModel.model.getLineCount(); + const maxColumn = viewModel.model.getLineMaxColumn(lineCount); + return CursorState.fromModelState(new SingleCursorState(new Range(1, 1, 1, 1), 0, 0, new Position(lineCount, maxColumn), 0)); + } + static line(viewModel, cursor, inSelectionMode, _position, _viewPosition) { + const position = viewModel.model.validatePosition(_position); + const viewPosition = _viewPosition ? viewModel.coordinatesConverter.validateViewPosition(new Position(_viewPosition.lineNumber, _viewPosition.column), position) : viewModel.coordinatesConverter.convertModelPositionToViewPosition(position); + if (!inSelectionMode) { + const lineCount = viewModel.model.getLineCount(); + let selectToLineNumber = position.lineNumber + 1; + let selectToColumn = 1; + if (selectToLineNumber > lineCount) { + selectToLineNumber = lineCount; + selectToColumn = viewModel.model.getLineMaxColumn(selectToLineNumber); + } + return CursorState.fromModelState(new SingleCursorState(new Range(position.lineNumber, 1, selectToLineNumber, selectToColumn), 2, 0, new Position(selectToLineNumber, selectToColumn), 0)); + } + const enteringLineNumber = cursor.modelState.selectionStart.getStartPosition().lineNumber; + if (position.lineNumber < enteringLineNumber) { + return CursorState.fromViewState(cursor.viewState.move(true, viewPosition.lineNumber, 1, 0)); + } else if (position.lineNumber > enteringLineNumber) { + const lineCount = viewModel.getLineCount(); + let selectToViewLineNumber = viewPosition.lineNumber + 1; + let selectToViewColumn = 1; + if (selectToViewLineNumber > lineCount) { + selectToViewLineNumber = lineCount; + selectToViewColumn = viewModel.getLineMaxColumn(selectToViewLineNumber); + } + return CursorState.fromViewState(cursor.viewState.move(true, selectToViewLineNumber, selectToViewColumn, 0)); + } else { + const endPositionOfSelectionStart = cursor.modelState.selectionStart.getEndPosition(); + return CursorState.fromModelState(cursor.modelState.move(true, endPositionOfSelectionStart.lineNumber, endPositionOfSelectionStart.column, 0)); + } + } + static word(viewModel, cursor, inSelectionMode, _position) { + const position = viewModel.model.validatePosition(_position); + return CursorState.fromModelState(WordOperations.word(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode, position)); + } + static cancelSelection(viewModel, cursor) { + if (!cursor.modelState.hasSelection()) { + return new CursorState(cursor.modelState, cursor.viewState); + } + const lineNumber = cursor.viewState.position.lineNumber; + const column = cursor.viewState.position.column; + return CursorState.fromViewState(new SingleCursorState(new Range(lineNumber, column, lineNumber, column), 0, 0, new Position(lineNumber, column), 0)); + } + static moveTo(viewModel, cursor, inSelectionMode, _position, _viewPosition) { + if (inSelectionMode) { + if (cursor.modelState.selectionStartKind === 1) { + return this.word(viewModel, cursor, inSelectionMode, _position); + } + if (cursor.modelState.selectionStartKind === 2) { + return this.line(viewModel, cursor, inSelectionMode, _position, _viewPosition); + } + } + const position = viewModel.model.validatePosition(_position); + const viewPosition = _viewPosition ? viewModel.coordinatesConverter.validateViewPosition(new Position(_viewPosition.lineNumber, _viewPosition.column), position) : viewModel.coordinatesConverter.convertModelPositionToViewPosition(position); + return CursorState.fromViewState(cursor.viewState.move(inSelectionMode, viewPosition.lineNumber, viewPosition.column, 0)); + } + static simpleMove(viewModel, cursors, direction, inSelectionMode, value, unit) { + switch (direction) { + case 0: { + if (unit === 4) { + return this._moveHalfLineLeft(viewModel, cursors, inSelectionMode); + } else { + return this._moveLeft(viewModel, cursors, inSelectionMode, value); + } + } + case 1: { + if (unit === 4) { + return this._moveHalfLineRight(viewModel, cursors, inSelectionMode); + } else { + return this._moveRight(viewModel, cursors, inSelectionMode, value); + } + } + case 2: { + if (unit === 2) { + return this._moveUpByViewLines(viewModel, cursors, inSelectionMode, value); + } else { + return this._moveUpByModelLines(viewModel, cursors, inSelectionMode, value); + } + } + case 3: { + if (unit === 2) { + return this._moveDownByViewLines(viewModel, cursors, inSelectionMode, value); + } else { + return this._moveDownByModelLines(viewModel, cursors, inSelectionMode, value); + } + } + case 4: { + if (unit === 2) { + return cursors.map((cursor) => CursorState.fromViewState(MoveOperations.moveToPrevBlankLine(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode))); + } else { + return cursors.map((cursor) => CursorState.fromModelState(MoveOperations.moveToPrevBlankLine(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode))); + } + } + case 5: { + if (unit === 2) { + return cursors.map((cursor) => CursorState.fromViewState(MoveOperations.moveToNextBlankLine(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode))); + } else { + return cursors.map((cursor) => CursorState.fromModelState(MoveOperations.moveToNextBlankLine(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode))); + } + } + case 6: { + return this._moveToViewMinColumn(viewModel, cursors, inSelectionMode); + } + case 7: { + return this._moveToViewFirstNonWhitespaceColumn(viewModel, cursors, inSelectionMode); + } + case 8: { + return this._moveToViewCenterColumn(viewModel, cursors, inSelectionMode); + } + case 9: { + return this._moveToViewMaxColumn(viewModel, cursors, inSelectionMode); + } + case 10: { + return this._moveToViewLastNonWhitespaceColumn(viewModel, cursors, inSelectionMode); + } + default: + return null; + } + } + static viewportMove(viewModel, cursors, direction, inSelectionMode, value) { + const visibleViewRange = viewModel.getCompletelyVisibleViewRange(); + const visibleModelRange = viewModel.coordinatesConverter.convertViewRangeToModelRange(visibleViewRange); + switch (direction) { + case 11: { + const modelLineNumber = this._firstLineNumberInRange(viewModel.model, visibleModelRange, value); + const modelColumn = viewModel.model.getLineFirstNonWhitespaceColumn(modelLineNumber); + return [this._moveToModelPosition(viewModel, cursors[0], inSelectionMode, modelLineNumber, modelColumn)]; + } + case 13: { + const modelLineNumber = this._lastLineNumberInRange(viewModel.model, visibleModelRange, value); + const modelColumn = viewModel.model.getLineFirstNonWhitespaceColumn(modelLineNumber); + return [this._moveToModelPosition(viewModel, cursors[0], inSelectionMode, modelLineNumber, modelColumn)]; + } + case 12: { + const modelLineNumber = Math.round((visibleModelRange.startLineNumber + visibleModelRange.endLineNumber) / 2); + const modelColumn = viewModel.model.getLineFirstNonWhitespaceColumn(modelLineNumber); + return [this._moveToModelPosition(viewModel, cursors[0], inSelectionMode, modelLineNumber, modelColumn)]; + } + case 14: { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + result[i] = this.findPositionInViewportIfOutside(viewModel, cursor, visibleViewRange, inSelectionMode); + } + return result; + } + default: + return null; + } + } + static findPositionInViewportIfOutside(viewModel, cursor, visibleViewRange, inSelectionMode) { + const viewLineNumber = cursor.viewState.position.lineNumber; + if (visibleViewRange.startLineNumber <= viewLineNumber && viewLineNumber <= visibleViewRange.endLineNumber - 1) { + return new CursorState(cursor.modelState, cursor.viewState); + } else { + let newViewLineNumber; + if (viewLineNumber > visibleViewRange.endLineNumber - 1) { + newViewLineNumber = visibleViewRange.endLineNumber - 1; + } else if (viewLineNumber < visibleViewRange.startLineNumber) { + newViewLineNumber = visibleViewRange.startLineNumber; + } else { + newViewLineNumber = viewLineNumber; + } + const position = MoveOperations.vertical(viewModel.cursorConfig, viewModel, viewLineNumber, cursor.viewState.position.column, cursor.viewState.leftoverVisibleColumns, newViewLineNumber, false); + return CursorState.fromViewState(cursor.viewState.move(inSelectionMode, position.lineNumber, position.column, position.leftoverVisibleColumns)); + } + } + /** + * Find the nth line start included in the range (from the start). + */ + static _firstLineNumberInRange(model, range2, count) { + let startLineNumber = range2.startLineNumber; + if (range2.startColumn !== model.getLineMinColumn(startLineNumber)) { + startLineNumber++; + } + return Math.min(range2.endLineNumber, startLineNumber + count - 1); + } + /** + * Find the nth line start included in the range (from the end). + */ + static _lastLineNumberInRange(model, range2, count) { + let startLineNumber = range2.startLineNumber; + if (range2.startColumn !== model.getLineMinColumn(startLineNumber)) { + startLineNumber++; + } + return Math.max(startLineNumber, range2.endLineNumber - count + 1); + } + static _moveLeft(viewModel, cursors, inSelectionMode, noOfColumns) { + return cursors.map((cursor) => CursorState.fromViewState(MoveOperations.moveLeft(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, noOfColumns))); + } + static _moveHalfLineLeft(viewModel, cursors, inSelectionMode) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + const viewLineNumber = cursor.viewState.position.lineNumber; + const halfLine = Math.round(viewModel.getLineLength(viewLineNumber) / 2); + result[i] = CursorState.fromViewState(MoveOperations.moveLeft(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, halfLine)); + } + return result; + } + static _moveRight(viewModel, cursors, inSelectionMode, noOfColumns) { + return cursors.map((cursor) => CursorState.fromViewState(MoveOperations.moveRight(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, noOfColumns))); + } + static _moveHalfLineRight(viewModel, cursors, inSelectionMode) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + const viewLineNumber = cursor.viewState.position.lineNumber; + const halfLine = Math.round(viewModel.getLineLength(viewLineNumber) / 2); + result[i] = CursorState.fromViewState(MoveOperations.moveRight(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, halfLine)); + } + return result; + } + static _moveDownByViewLines(viewModel, cursors, inSelectionMode, linesCount) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + result[i] = CursorState.fromViewState(MoveOperations.moveDown(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, linesCount)); + } + return result; + } + static _moveDownByModelLines(viewModel, cursors, inSelectionMode, linesCount) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + result[i] = CursorState.fromModelState(MoveOperations.moveDown(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode, linesCount)); + } + return result; + } + static _moveUpByViewLines(viewModel, cursors, inSelectionMode, linesCount) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + result[i] = CursorState.fromViewState(MoveOperations.moveUp(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, linesCount)); + } + return result; + } + static _moveUpByModelLines(viewModel, cursors, inSelectionMode, linesCount) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + result[i] = CursorState.fromModelState(MoveOperations.moveUp(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode, linesCount)); + } + return result; + } + static _moveToViewPosition(viewModel, cursor, inSelectionMode, toViewLineNumber, toViewColumn) { + return CursorState.fromViewState(cursor.viewState.move(inSelectionMode, toViewLineNumber, toViewColumn, 0)); + } + static _moveToModelPosition(viewModel, cursor, inSelectionMode, toModelLineNumber, toModelColumn) { + return CursorState.fromModelState(cursor.modelState.move(inSelectionMode, toModelLineNumber, toModelColumn, 0)); + } + static _moveToViewMinColumn(viewModel, cursors, inSelectionMode) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + const viewLineNumber = cursor.viewState.position.lineNumber; + const viewColumn = viewModel.getLineMinColumn(viewLineNumber); + result[i] = this._moveToViewPosition(viewModel, cursor, inSelectionMode, viewLineNumber, viewColumn); + } + return result; + } + static _moveToViewFirstNonWhitespaceColumn(viewModel, cursors, inSelectionMode) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + const viewLineNumber = cursor.viewState.position.lineNumber; + const viewColumn = viewModel.getLineFirstNonWhitespaceColumn(viewLineNumber); + result[i] = this._moveToViewPosition(viewModel, cursor, inSelectionMode, viewLineNumber, viewColumn); + } + return result; + } + static _moveToViewCenterColumn(viewModel, cursors, inSelectionMode) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + const viewLineNumber = cursor.viewState.position.lineNumber; + const viewColumn = Math.round((viewModel.getLineMaxColumn(viewLineNumber) + viewModel.getLineMinColumn(viewLineNumber)) / 2); + result[i] = this._moveToViewPosition(viewModel, cursor, inSelectionMode, viewLineNumber, viewColumn); + } + return result; + } + static _moveToViewMaxColumn(viewModel, cursors, inSelectionMode) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + const viewLineNumber = cursor.viewState.position.lineNumber; + const viewColumn = viewModel.getLineMaxColumn(viewLineNumber); + result[i] = this._moveToViewPosition(viewModel, cursor, inSelectionMode, viewLineNumber, viewColumn); + } + return result; + } + static _moveToViewLastNonWhitespaceColumn(viewModel, cursors, inSelectionMode) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + const viewLineNumber = cursor.viewState.position.lineNumber; + const viewColumn = viewModel.getLineLastNonWhitespaceColumn(viewLineNumber); + result[i] = this._moveToViewPosition(viewModel, cursor, inSelectionMode, viewLineNumber, viewColumn); + } + return result; + } + }; + (function(CursorMove2) { + const isCursorMoveArgs = function(arg) { + if (!isObject(arg)) { + return false; + } + const cursorMoveArg = arg; + if (!isString(cursorMoveArg.to)) { + return false; + } + if (!isUndefined(cursorMoveArg.select) && !isBoolean(cursorMoveArg.select)) { + return false; + } + if (!isUndefined(cursorMoveArg.by) && !isString(cursorMoveArg.by)) { + return false; + } + if (!isUndefined(cursorMoveArg.value) && !isNumber(cursorMoveArg.value)) { + return false; + } + return true; + }; + CursorMove2.metadata = { + description: "Move cursor to a logical position in the view", + args: [ + { + name: "Cursor move argument object", + description: `Property-value pairs that can be passed through this argument: + * 'to': A mandatory logical position value providing where to move the cursor. + \`\`\` + 'left', 'right', 'up', 'down', 'prevBlankLine', 'nextBlankLine', + 'wrappedLineStart', 'wrappedLineEnd', 'wrappedLineColumnCenter' + 'wrappedLineFirstNonWhitespaceCharacter', 'wrappedLineLastNonWhitespaceCharacter' + 'viewPortTop', 'viewPortCenter', 'viewPortBottom', 'viewPortIfOutside' + \`\`\` + * 'by': Unit to move. Default is computed based on 'to' value. + \`\`\` + 'line', 'wrappedLine', 'character', 'halfLine' + \`\`\` + * 'value': Number of units to move. Default is '1'. + * 'select': If 'true' makes the selection. Default is 'false'. + `, + constraint: isCursorMoveArgs, + schema: { + "type": "object", + "required": ["to"], + "properties": { + "to": { + "type": "string", + "enum": ["left", "right", "up", "down", "prevBlankLine", "nextBlankLine", "wrappedLineStart", "wrappedLineEnd", "wrappedLineColumnCenter", "wrappedLineFirstNonWhitespaceCharacter", "wrappedLineLastNonWhitespaceCharacter", "viewPortTop", "viewPortCenter", "viewPortBottom", "viewPortIfOutside"] + }, + "by": { + "type": "string", + "enum": ["line", "wrappedLine", "character", "halfLine"] + }, + "value": { + "type": "number", + "default": 1 + }, + "select": { + "type": "boolean", + "default": false + } + } + } + } + ] + }; + CursorMove2.RawDirection = { + Left: "left", + Right: "right", + Up: "up", + Down: "down", + PrevBlankLine: "prevBlankLine", + NextBlankLine: "nextBlankLine", + WrappedLineStart: "wrappedLineStart", + WrappedLineFirstNonWhitespaceCharacter: "wrappedLineFirstNonWhitespaceCharacter", + WrappedLineColumnCenter: "wrappedLineColumnCenter", + WrappedLineEnd: "wrappedLineEnd", + WrappedLineLastNonWhitespaceCharacter: "wrappedLineLastNonWhitespaceCharacter", + ViewPortTop: "viewPortTop", + ViewPortCenter: "viewPortCenter", + ViewPortBottom: "viewPortBottom", + ViewPortIfOutside: "viewPortIfOutside" + }; + CursorMove2.RawUnit = { + Line: "line", + WrappedLine: "wrappedLine", + Character: "character", + HalfLine: "halfLine" + }; + function parse5(args) { + if (!args.to) { + return null; + } + let direction; + switch (args.to) { + case CursorMove2.RawDirection.Left: + direction = 0; + break; + case CursorMove2.RawDirection.Right: + direction = 1; + break; + case CursorMove2.RawDirection.Up: + direction = 2; + break; + case CursorMove2.RawDirection.Down: + direction = 3; + break; + case CursorMove2.RawDirection.PrevBlankLine: + direction = 4; + break; + case CursorMove2.RawDirection.NextBlankLine: + direction = 5; + break; + case CursorMove2.RawDirection.WrappedLineStart: + direction = 6; + break; + case CursorMove2.RawDirection.WrappedLineFirstNonWhitespaceCharacter: + direction = 7; + break; + case CursorMove2.RawDirection.WrappedLineColumnCenter: + direction = 8; + break; + case CursorMove2.RawDirection.WrappedLineEnd: + direction = 9; + break; + case CursorMove2.RawDirection.WrappedLineLastNonWhitespaceCharacter: + direction = 10; + break; + case CursorMove2.RawDirection.ViewPortTop: + direction = 11; + break; + case CursorMove2.RawDirection.ViewPortBottom: + direction = 13; + break; + case CursorMove2.RawDirection.ViewPortCenter: + direction = 12; + break; + case CursorMove2.RawDirection.ViewPortIfOutside: + direction = 14; + break; + default: + return null; + } + let unit = 0; + switch (args.by) { + case CursorMove2.RawUnit.Line: + unit = 1; + break; + case CursorMove2.RawUnit.WrappedLine: + unit = 2; + break; + case CursorMove2.RawUnit.Character: + unit = 3; + break; + case CursorMove2.RawUnit.HalfLine: + unit = 4; + break; + } + return { + direction, + unit, + select: !!args.select, + value: args.value || 1 + }; + } + CursorMove2.parse = parse5; + })(CursorMove || (CursorMove = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/supports/indentationLineProcessor.js +function isLanguageDifferentFromLineStart(model, position) { + model.tokenization.forceTokenization(position.lineNumber); + const lineTokens = model.tokenization.getLineTokens(position.lineNumber); + const scopedLineTokens = createScopedLineTokens(lineTokens, position.column - 1); + const doesScopeStartAtOffsetZero = scopedLineTokens.firstCharOffset === 0; + const isScopedLanguageEqualToFirstLanguageOnLine = lineTokens.getLanguageId(0) === scopedLineTokens.languageId; + const languageIsDifferentFromLineStart = !doesScopeStartAtOffsetZero && !isScopedLanguageEqualToFirstLanguageOnLine; + return languageIsDifferentFromLineStart; +} +var ProcessedIndentRulesSupport, IndentationContextProcessor, IndentationLineProcessor; +var init_indentationLineProcessor = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/supports/indentationLineProcessor.js"() { + init_strings(); + init_supports(); + init_lineTokens(); + ProcessedIndentRulesSupport = class { + constructor(model, indentRulesSupport, languageConfigurationService) { + this._indentRulesSupport = indentRulesSupport; + this._indentationLineProcessor = new IndentationLineProcessor(model, languageConfigurationService); + } + /** + * Apply the new indentation and return whether the indentation level should be increased after the given line number + */ + shouldIncrease(lineNumber, newIndentation) { + const processedLine = this._indentationLineProcessor.getProcessedLine(lineNumber, newIndentation); + return this._indentRulesSupport.shouldIncrease(processedLine); + } + /** + * Apply the new indentation and return whether the indentation level should be decreased after the given line number + */ + shouldDecrease(lineNumber, newIndentation) { + const processedLine = this._indentationLineProcessor.getProcessedLine(lineNumber, newIndentation); + return this._indentRulesSupport.shouldDecrease(processedLine); + } + /** + * Apply the new indentation and return whether the indentation level should remain unchanged at the given line number + */ + shouldIgnore(lineNumber, newIndentation) { + const processedLine = this._indentationLineProcessor.getProcessedLine(lineNumber, newIndentation); + return this._indentRulesSupport.shouldIgnore(processedLine); + } + /** + * Apply the new indentation and return whether the indentation level should increase on the line after the given line number + */ + shouldIndentNextLine(lineNumber, newIndentation) { + const processedLine = this._indentationLineProcessor.getProcessedLine(lineNumber, newIndentation); + return this._indentRulesSupport.shouldIndentNextLine(processedLine); + } + }; + IndentationContextProcessor = class { + constructor(model, languageConfigurationService) { + this.model = model; + this.indentationLineProcessor = new IndentationLineProcessor(model, languageConfigurationService); + } + /** + * Returns the processed text, stripped from the language configuration brackets within the string, comment and regex tokens, around the given range + */ + getProcessedTokenContextAroundRange(range2) { + const beforeRangeProcessedTokens = this._getProcessedTokensBeforeRange(range2); + const afterRangeProcessedTokens = this._getProcessedTokensAfterRange(range2); + const previousLineProcessedTokens = this._getProcessedPreviousLineTokens(range2); + return { beforeRangeProcessedTokens, afterRangeProcessedTokens, previousLineProcessedTokens }; + } + _getProcessedTokensBeforeRange(range2) { + this.model.tokenization.forceTokenization(range2.startLineNumber); + const lineTokens = this.model.tokenization.getLineTokens(range2.startLineNumber); + const scopedLineTokens = createScopedLineTokens(lineTokens, range2.startColumn - 1); + let slicedTokens; + if (isLanguageDifferentFromLineStart(this.model, range2.getStartPosition())) { + const columnIndexWithinScope = range2.startColumn - 1 - scopedLineTokens.firstCharOffset; + const firstCharacterOffset = scopedLineTokens.firstCharOffset; + const lastCharacterOffset = firstCharacterOffset + columnIndexWithinScope; + slicedTokens = lineTokens.sliceAndInflate(firstCharacterOffset, lastCharacterOffset, 0); + } else { + const columnWithinLine = range2.startColumn - 1; + slicedTokens = lineTokens.sliceAndInflate(0, columnWithinLine, 0); + } + const processedTokens = this.indentationLineProcessor.getProcessedTokens(slicedTokens); + return processedTokens; + } + _getProcessedTokensAfterRange(range2) { + const position = range2.isEmpty() ? range2.getStartPosition() : range2.getEndPosition(); + this.model.tokenization.forceTokenization(position.lineNumber); + const lineTokens = this.model.tokenization.getLineTokens(position.lineNumber); + const scopedLineTokens = createScopedLineTokens(lineTokens, position.column - 1); + const columnIndexWithinScope = position.column - 1 - scopedLineTokens.firstCharOffset; + const firstCharacterOffset = scopedLineTokens.firstCharOffset + columnIndexWithinScope; + const lastCharacterOffset = scopedLineTokens.firstCharOffset + scopedLineTokens.getLineLength(); + const slicedTokens = lineTokens.sliceAndInflate(firstCharacterOffset, lastCharacterOffset, 0); + const processedTokens = this.indentationLineProcessor.getProcessedTokens(slicedTokens); + return processedTokens; + } + _getProcessedPreviousLineTokens(range2) { + const getScopedLineTokensAtEndColumnOfLine = (lineNumber) => { + this.model.tokenization.forceTokenization(lineNumber); + const lineTokens2 = this.model.tokenization.getLineTokens(lineNumber); + const endColumnOfLine = this.model.getLineMaxColumn(lineNumber) - 1; + const scopedLineTokensAtEndColumn = createScopedLineTokens(lineTokens2, endColumnOfLine); + return scopedLineTokensAtEndColumn; + }; + this.model.tokenization.forceTokenization(range2.startLineNumber); + const lineTokens = this.model.tokenization.getLineTokens(range2.startLineNumber); + const scopedLineTokens = createScopedLineTokens(lineTokens, range2.startColumn - 1); + const emptyTokens = LineTokens.createEmpty("", scopedLineTokens.languageIdCodec); + const previousLineNumber = range2.startLineNumber - 1; + const isFirstLine = previousLineNumber === 0; + if (isFirstLine) { + return emptyTokens; + } + const canScopeExtendOnPreviousLine = scopedLineTokens.firstCharOffset === 0; + if (!canScopeExtendOnPreviousLine) { + return emptyTokens; + } + const scopedLineTokensAtEndColumnOfPreviousLine = getScopedLineTokensAtEndColumnOfLine(previousLineNumber); + const doesLanguageContinueOnPreviousLine = scopedLineTokens.languageId === scopedLineTokensAtEndColumnOfPreviousLine.languageId; + if (!doesLanguageContinueOnPreviousLine) { + return emptyTokens; + } + const previousSlicedLineTokens = scopedLineTokensAtEndColumnOfPreviousLine.toIViewLineTokens(); + const processedTokens = this.indentationLineProcessor.getProcessedTokens(previousSlicedLineTokens); + return processedTokens; + } + }; + IndentationLineProcessor = class { + constructor(model, languageConfigurationService) { + this.model = model; + this.languageConfigurationService = languageConfigurationService; + } + /** + * Get the processed line for the given line number and potentially adjust the indentation level. + * Remove the language configuration brackets from the regex, string and comment tokens. + */ + getProcessedLine(lineNumber, newIndentation) { + var _a10, _b4; + const replaceIndentation = (line, newIndentation2) => { + const currentIndentation = getLeadingWhitespace(line); + const adjustedLine = newIndentation2 + line.substring(currentIndentation.length); + return adjustedLine; + }; + (_b4 = (_a10 = this.model.tokenization).forceTokenization) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, lineNumber); + const tokens = this.model.tokenization.getLineTokens(lineNumber); + let processedLine = this.getProcessedTokens(tokens).getLineContent(); + if (newIndentation !== void 0) { + processedLine = replaceIndentation(processedLine, newIndentation); + } + return processedLine; + } + /** + * Process the line with the given tokens, remove the language configuration brackets from the regex, string and comment tokens. + */ + getProcessedTokens(tokens) { + const shouldRemoveBracketsFromTokenType = (tokenType) => { + return tokenType === 2 || tokenType === 3 || tokenType === 1; + }; + const languageId = tokens.getLanguageId(0); + const bracketsConfiguration = this.languageConfigurationService.getLanguageConfiguration(languageId).bracketsNew; + const bracketsRegExp = bracketsConfiguration.getBracketRegExp({ global: true }); + const textAndMetadata = []; + tokens.forEach((tokenIndex) => { + const tokenType = tokens.getStandardTokenType(tokenIndex); + let text2 = tokens.getTokenText(tokenIndex); + if (shouldRemoveBracketsFromTokenType(tokenType)) { + text2 = text2.replace(bracketsRegExp, ""); + } + const metadata = tokens.getMetadata(tokenIndex); + textAndMetadata.push({ text: text2, metadata }); + }); + const processedLineTokens = LineTokens.createFromTextAndMetadata(textAndMetadata, tokens.languageIdCodec); + return processedLineTokens; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/enterAction.js +function getEnterAction(autoIndent, model, range2, languageConfigurationService) { + model.tokenization.forceTokenization(range2.startLineNumber); + const languageId = model.getLanguageIdAtPosition(range2.startLineNumber, range2.startColumn); + const richEditSupport = languageConfigurationService.getLanguageConfiguration(languageId); + if (!richEditSupport) { + return null; + } + const indentationContextProcessor = new IndentationContextProcessor(model, languageConfigurationService); + const processedContextTokens = indentationContextProcessor.getProcessedTokenContextAroundRange(range2); + const previousLineText = processedContextTokens.previousLineProcessedTokens.getLineContent(); + const beforeEnterText = processedContextTokens.beforeRangeProcessedTokens.getLineContent(); + const afterEnterText = processedContextTokens.afterRangeProcessedTokens.getLineContent(); + const enterResult = richEditSupport.onEnter(autoIndent, previousLineText, beforeEnterText, afterEnterText); + if (!enterResult) { + return null; + } + const indentAction = enterResult.indentAction; + let appendText = enterResult.appendText; + const removeText = enterResult.removeText || 0; + if (!appendText) { + if (indentAction === IndentAction2.Indent || indentAction === IndentAction2.IndentOutdent) { + appendText = " "; + } else { + appendText = ""; + } + } else if (indentAction === IndentAction2.Indent) { + appendText = " " + appendText; + } + let indentation = getIndentationAtPosition(model, range2.startLineNumber, range2.startColumn); + if (removeText) { + indentation = indentation.substring(0, indentation.length - removeText); + } + return { + indentAction, + appendText, + removeText, + indentation + }; +} +var init_enterAction = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/enterAction.js"() { + init_languageConfiguration(); + init_languageConfigurationRegistry(); + init_indentationLineProcessor(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/commands/shiftCommand.js +function cachedStringRepeat(str, count) { + if (count <= 0) { + return ""; + } + if (!repeatCache[str]) { + repeatCache[str] = ["", str]; + } + const cache = repeatCache[str]; + for (let i = cache.length; i <= count; i++) { + cache[i] = cache[i - 1] + str; + } + return cache[count]; +} +var __decorate10, __param9, ShiftCommand_1, repeatCache, ShiftCommand; +var init_shiftCommand = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/commands/shiftCommand.js"() { + init_strings(); + init_cursorColumns(); + init_range(); + init_selection(); + init_enterAction(); + init_languageConfigurationRegistry(); + __decorate10 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param9 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + repeatCache = /* @__PURE__ */ Object.create(null); + ShiftCommand = ShiftCommand_1 = class ShiftCommand2 { + static unshiftIndent(line, column, tabSize, indentSize, insertSpaces) { + const contentStartVisibleColumn = CursorColumns.visibleColumnFromColumn(line, column, tabSize); + if (insertSpaces) { + const indent = cachedStringRepeat(" ", indentSize); + const desiredTabStop = CursorColumns.prevIndentTabStop(contentStartVisibleColumn, indentSize); + const indentCount = desiredTabStop / indentSize; + return cachedStringRepeat(indent, indentCount); + } else { + const indent = " "; + const desiredTabStop = CursorColumns.prevRenderTabStop(contentStartVisibleColumn, tabSize); + const indentCount = desiredTabStop / tabSize; + return cachedStringRepeat(indent, indentCount); + } + } + static shiftIndent(line, column, tabSize, indentSize, insertSpaces) { + const contentStartVisibleColumn = CursorColumns.visibleColumnFromColumn(line, column, tabSize); + if (insertSpaces) { + const indent = cachedStringRepeat(" ", indentSize); + const desiredTabStop = CursorColumns.nextIndentTabStop(contentStartVisibleColumn, indentSize); + const indentCount = desiredTabStop / indentSize; + return cachedStringRepeat(indent, indentCount); + } else { + const indent = " "; + const desiredTabStop = CursorColumns.nextRenderTabStop(contentStartVisibleColumn, tabSize); + const indentCount = desiredTabStop / tabSize; + return cachedStringRepeat(indent, indentCount); + } + } + constructor(range2, opts, _languageConfigurationService) { + this._languageConfigurationService = _languageConfigurationService; + this._opts = opts; + this._selection = range2; + this._selectionId = null; + this._useLastEditRangeForCursorEndPosition = false; + this._selectionStartColumnStaysPut = false; + } + _addEditOperation(builder, range2, text2) { + if (this._useLastEditRangeForCursorEndPosition) { + builder.addTrackedEditOperation(range2, text2); + } else { + builder.addEditOperation(range2, text2); + } + } + getEditOperations(model, builder) { + const startLine = this._selection.startLineNumber; + let endLine = this._selection.endLineNumber; + if (this._selection.endColumn === 1 && startLine !== endLine) { + endLine = endLine - 1; + } + const { tabSize, indentSize, insertSpaces } = this._opts; + const shouldIndentEmptyLines = startLine === endLine; + if (this._opts.useTabStops) { + if (this._selection.isEmpty()) { + if (/^\s*$/.test(model.getLineContent(startLine))) { + this._useLastEditRangeForCursorEndPosition = true; + } + } + let previousLineExtraSpaces = 0, extraSpaces = 0; + for (let lineNumber = startLine; lineNumber <= endLine; lineNumber++, previousLineExtraSpaces = extraSpaces) { + extraSpaces = 0; + const lineText = model.getLineContent(lineNumber); + let indentationEndIndex = firstNonWhitespaceIndex(lineText); + if (this._opts.isUnshift && (lineText.length === 0 || indentationEndIndex === 0)) { + continue; + } + if (!shouldIndentEmptyLines && !this._opts.isUnshift && lineText.length === 0) { + continue; + } + if (indentationEndIndex === -1) { + indentationEndIndex = lineText.length; + } + if (lineNumber > 1) { + const contentStartVisibleColumn = CursorColumns.visibleColumnFromColumn(lineText, indentationEndIndex + 1, tabSize); + if (contentStartVisibleColumn % indentSize !== 0) { + if (model.tokenization.isCheapToTokenize(lineNumber - 1)) { + const enterAction = getEnterAction(this._opts.autoIndent, model, new Range(lineNumber - 1, model.getLineMaxColumn(lineNumber - 1), lineNumber - 1, model.getLineMaxColumn(lineNumber - 1)), this._languageConfigurationService); + if (enterAction) { + extraSpaces = previousLineExtraSpaces; + if (enterAction.appendText) { + for (let j = 0, lenJ = enterAction.appendText.length; j < lenJ && extraSpaces < indentSize; j++) { + if (enterAction.appendText.charCodeAt(j) === 32) { + extraSpaces++; + } else { + break; + } + } + } + if (enterAction.removeText) { + extraSpaces = Math.max(0, extraSpaces - enterAction.removeText); + } + for (let j = 0; j < extraSpaces; j++) { + if (indentationEndIndex === 0 || lineText.charCodeAt(indentationEndIndex - 1) !== 32) { + break; + } + indentationEndIndex--; + } + } + } + } + } + if (this._opts.isUnshift && indentationEndIndex === 0) { + continue; + } + let desiredIndent; + if (this._opts.isUnshift) { + desiredIndent = ShiftCommand_1.unshiftIndent(lineText, indentationEndIndex + 1, tabSize, indentSize, insertSpaces); + } else { + desiredIndent = ShiftCommand_1.shiftIndent(lineText, indentationEndIndex + 1, tabSize, indentSize, insertSpaces); + } + this._addEditOperation(builder, new Range(lineNumber, 1, lineNumber, indentationEndIndex + 1), desiredIndent); + if (lineNumber === startLine && !this._selection.isEmpty()) { + this._selectionStartColumnStaysPut = this._selection.startColumn <= indentationEndIndex + 1; + } + } + } else { + if (!this._opts.isUnshift && this._selection.isEmpty() && model.getLineLength(startLine) === 0) { + this._useLastEditRangeForCursorEndPosition = true; + } + const oneIndent = insertSpaces ? cachedStringRepeat(" ", indentSize) : " "; + for (let lineNumber = startLine; lineNumber <= endLine; lineNumber++) { + const lineText = model.getLineContent(lineNumber); + let indentationEndIndex = firstNonWhitespaceIndex(lineText); + if (this._opts.isUnshift && (lineText.length === 0 || indentationEndIndex === 0)) { + continue; + } + if (!shouldIndentEmptyLines && !this._opts.isUnshift && lineText.length === 0) { + continue; + } + if (indentationEndIndex === -1) { + indentationEndIndex = lineText.length; + } + if (this._opts.isUnshift && indentationEndIndex === 0) { + continue; + } + if (this._opts.isUnshift) { + indentationEndIndex = Math.min(indentationEndIndex, indentSize); + for (let i = 0; i < indentationEndIndex; i++) { + const chr = lineText.charCodeAt(i); + if (chr === 9) { + indentationEndIndex = i + 1; + break; + } + } + this._addEditOperation(builder, new Range(lineNumber, 1, lineNumber, indentationEndIndex + 1), ""); + } else { + this._addEditOperation(builder, new Range(lineNumber, 1, lineNumber, 1), oneIndent); + if (lineNumber === startLine && !this._selection.isEmpty()) { + this._selectionStartColumnStaysPut = this._selection.startColumn === 1; + } + } + } + } + this._selectionId = builder.trackSelection(this._selection); + } + computeCursorState(model, helper) { + if (this._useLastEditRangeForCursorEndPosition) { + const lastOp = helper.getInverseEditOperations()[0]; + return new Selection(lastOp.range.endLineNumber, lastOp.range.endColumn, lastOp.range.endLineNumber, lastOp.range.endColumn); + } + const result = helper.getTrackedSelection(this._selectionId); + if (this._selectionStartColumnStaysPut) { + const initialStartColumn = this._selection.startColumn; + const resultStartColumn = result.startColumn; + if (resultStartColumn <= initialStartColumn) { + return result; + } + if (result.getDirection() === 0) { + return new Selection(result.startLineNumber, initialStartColumn, result.endLineNumber, result.endColumn); + } + return new Selection(result.endLineNumber, result.endColumn, result.startLineNumber, initialStartColumn); + } + return result; + } + }; + ShiftCommand = ShiftCommand_1 = __decorate10([ + __param9(2, ILanguageConfigurationService) + ], ShiftCommand); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/commands/surroundSelectionCommand.js +var SurroundSelectionCommand, CompositionSurroundSelectionCommand; +var init_surroundSelectionCommand = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/commands/surroundSelectionCommand.js"() { + init_range(); + init_selection(); + SurroundSelectionCommand = class { + constructor(range2, charBeforeSelection, charAfterSelection) { + this._range = range2; + this._charBeforeSelection = charBeforeSelection; + this._charAfterSelection = charAfterSelection; + } + getEditOperations(model, builder) { + builder.addTrackedEditOperation(new Range(this._range.startLineNumber, this._range.startColumn, this._range.startLineNumber, this._range.startColumn), this._charBeforeSelection); + builder.addTrackedEditOperation(new Range(this._range.endLineNumber, this._range.endColumn, this._range.endLineNumber, this._range.endColumn), this._charAfterSelection); + } + computeCursorState(model, helper) { + const inverseEditOperations = helper.getInverseEditOperations(); + const firstOperationRange = inverseEditOperations[0].range; + const secondOperationRange = inverseEditOperations[1].range; + return new Selection(firstOperationRange.endLineNumber, firstOperationRange.endColumn, secondOperationRange.endLineNumber, secondOperationRange.endColumn - this._charAfterSelection.length); + } + }; + CompositionSurroundSelectionCommand = class { + constructor(_position, _text, _charAfter) { + this._position = _position; + this._text = _text; + this._charAfter = _charAfter; + } + getEditOperations(model, builder) { + builder.addTrackedEditOperation(new Range(this._position.lineNumber, this._position.column, this._position.lineNumber, this._position.column), this._text + this._charAfter); + } + computeCursorState(model, helper) { + const inverseEditOperations = helper.getInverseEditOperations(); + const opRange = inverseEditOperations[0].range; + return new Selection(opRange.endLineNumber, opRange.startColumn, opRange.endLineNumber, opRange.endColumn - this._charAfter.length); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/autoIndent.js +function getPrecedingValidLine(model, lineNumber, processedIndentRulesSupport) { + const languageId = model.tokenization.getLanguageIdAtPosition(lineNumber, 0); + if (lineNumber > 1) { + let lastLineNumber; + let resultLineNumber = -1; + for (lastLineNumber = lineNumber - 1; lastLineNumber >= 1; lastLineNumber--) { + if (model.tokenization.getLanguageIdAtPosition(lastLineNumber, 0) !== languageId) { + return resultLineNumber; + } + const text2 = model.getLineContent(lastLineNumber); + if (processedIndentRulesSupport.shouldIgnore(lastLineNumber) || /^\s+$/.test(text2) || text2 === "") { + resultLineNumber = lastLineNumber; + continue; + } + return lastLineNumber; + } + } + return -1; +} +function getInheritIndentForLine(autoIndent, model, lineNumber, honorIntentialIndent = true, languageConfigurationService) { + if (autoIndent < 4) { + return null; + } + const indentRulesSupport = languageConfigurationService.getLanguageConfiguration(model.tokenization.getLanguageId()).indentRulesSupport; + if (!indentRulesSupport) { + return null; + } + const processedIndentRulesSupport = new ProcessedIndentRulesSupport(model, indentRulesSupport, languageConfigurationService); + if (lineNumber <= 1) { + return { + indentation: "", + action: null + }; + } + for (let priorLineNumber = lineNumber - 1; priorLineNumber > 0; priorLineNumber--) { + if (model.getLineContent(priorLineNumber) !== "") { + break; + } + if (priorLineNumber === 1) { + return { + indentation: "", + action: null + }; + } + } + const precedingUnIgnoredLine = getPrecedingValidLine(model, lineNumber, processedIndentRulesSupport); + if (precedingUnIgnoredLine < 0) { + return null; + } else if (precedingUnIgnoredLine < 1) { + return { + indentation: "", + action: null + }; + } + if (processedIndentRulesSupport.shouldIncrease(precedingUnIgnoredLine) || processedIndentRulesSupport.shouldIndentNextLine(precedingUnIgnoredLine)) { + const precedingUnIgnoredLineContent = model.getLineContent(precedingUnIgnoredLine); + return { + indentation: getLeadingWhitespace(precedingUnIgnoredLineContent), + action: IndentAction2.Indent, + line: precedingUnIgnoredLine + }; + } else if (processedIndentRulesSupport.shouldDecrease(precedingUnIgnoredLine)) { + const precedingUnIgnoredLineContent = model.getLineContent(precedingUnIgnoredLine); + return { + indentation: getLeadingWhitespace(precedingUnIgnoredLineContent), + action: null, + line: precedingUnIgnoredLine + }; + } else { + if (precedingUnIgnoredLine === 1) { + return { + indentation: getLeadingWhitespace(model.getLineContent(precedingUnIgnoredLine)), + action: null, + line: precedingUnIgnoredLine + }; + } + const previousLine = precedingUnIgnoredLine - 1; + const previousLineIndentMetadata = indentRulesSupport.getIndentMetadata(model.getLineContent(previousLine)); + if (!(previousLineIndentMetadata & (1 | 2)) && previousLineIndentMetadata & 4) { + let stopLine = 0; + for (let i = previousLine - 1; i > 0; i--) { + if (processedIndentRulesSupport.shouldIndentNextLine(i)) { + continue; + } + stopLine = i; + break; + } + return { + indentation: getLeadingWhitespace(model.getLineContent(stopLine + 1)), + action: null, + line: stopLine + 1 + }; + } + if (honorIntentialIndent) { + return { + indentation: getLeadingWhitespace(model.getLineContent(precedingUnIgnoredLine)), + action: null, + line: precedingUnIgnoredLine + }; + } else { + for (let i = precedingUnIgnoredLine; i > 0; i--) { + if (processedIndentRulesSupport.shouldIncrease(i)) { + return { + indentation: getLeadingWhitespace(model.getLineContent(i)), + action: IndentAction2.Indent, + line: i + }; + } else if (processedIndentRulesSupport.shouldIndentNextLine(i)) { + let stopLine = 0; + for (let j = i - 1; j > 0; j--) { + if (processedIndentRulesSupport.shouldIndentNextLine(i)) { + continue; + } + stopLine = j; + break; + } + return { + indentation: getLeadingWhitespace(model.getLineContent(stopLine + 1)), + action: null, + line: stopLine + 1 + }; + } else if (processedIndentRulesSupport.shouldDecrease(i)) { + return { + indentation: getLeadingWhitespace(model.getLineContent(i)), + action: null, + line: i + }; + } + } + return { + indentation: getLeadingWhitespace(model.getLineContent(1)), + action: null, + line: 1 + }; + } + } +} +function getGoodIndentForLine(autoIndent, virtualModel, languageId, lineNumber, indentConverter, languageConfigurationService) { + if (autoIndent < 4) { + return null; + } + const richEditSupport = languageConfigurationService.getLanguageConfiguration(languageId); + if (!richEditSupport) { + return null; + } + const indentRulesSupport = languageConfigurationService.getLanguageConfiguration(languageId).indentRulesSupport; + if (!indentRulesSupport) { + return null; + } + const processedIndentRulesSupport = new ProcessedIndentRulesSupport(virtualModel, indentRulesSupport, languageConfigurationService); + const indent = getInheritIndentForLine(autoIndent, virtualModel, lineNumber, void 0, languageConfigurationService); + if (indent) { + const inheritLine = indent.line; + if (inheritLine !== void 0) { + let shouldApplyEnterRules = true; + for (let inBetweenLine = inheritLine; inBetweenLine < lineNumber - 1; inBetweenLine++) { + if (!/^\s*$/.test(virtualModel.getLineContent(inBetweenLine))) { + shouldApplyEnterRules = false; + break; + } + } + if (shouldApplyEnterRules) { + const enterResult = richEditSupport.onEnter(autoIndent, "", virtualModel.getLineContent(inheritLine), ""); + if (enterResult) { + let indentation = getLeadingWhitespace(virtualModel.getLineContent(inheritLine)); + if (enterResult.removeText) { + indentation = indentation.substring(0, indentation.length - enterResult.removeText); + } + if (enterResult.indentAction === IndentAction2.Indent || enterResult.indentAction === IndentAction2.IndentOutdent) { + indentation = indentConverter.shiftIndent(indentation); + } else if (enterResult.indentAction === IndentAction2.Outdent) { + indentation = indentConverter.unshiftIndent(indentation); + } + if (processedIndentRulesSupport.shouldDecrease(lineNumber)) { + indentation = indentConverter.unshiftIndent(indentation); + } + if (enterResult.appendText) { + indentation += enterResult.appendText; + } + return getLeadingWhitespace(indentation); + } + } + } + if (processedIndentRulesSupport.shouldDecrease(lineNumber)) { + if (indent.action === IndentAction2.Indent) { + return indent.indentation; + } else { + return indentConverter.unshiftIndent(indent.indentation); + } + } else { + if (indent.action === IndentAction2.Indent) { + return indentConverter.shiftIndent(indent.indentation); + } else { + return indent.indentation; + } + } + } + return null; +} +function getIndentForEnter(autoIndent, model, range2, indentConverter, languageConfigurationService) { + if (autoIndent < 4) { + return null; + } + const languageId = model.getLanguageIdAtPosition(range2.startLineNumber, range2.startColumn); + const indentRulesSupport = languageConfigurationService.getLanguageConfiguration(languageId).indentRulesSupport; + if (!indentRulesSupport) { + return null; + } + model.tokenization.forceTokenization(range2.startLineNumber); + const indentationContextProcessor = new IndentationContextProcessor(model, languageConfigurationService); + const processedContextTokens = indentationContextProcessor.getProcessedTokenContextAroundRange(range2); + const afterEnterProcessedTokens = processedContextTokens.afterRangeProcessedTokens; + const beforeEnterProcessedTokens = processedContextTokens.beforeRangeProcessedTokens; + const beforeEnterIndent = getLeadingWhitespace(beforeEnterProcessedTokens.getLineContent()); + const virtualModel = createVirtualModelWithModifiedTokensAtLine(model, range2.startLineNumber, beforeEnterProcessedTokens); + const languageIsDifferentFromLineStart = isLanguageDifferentFromLineStart(model, range2.getStartPosition()); + const currentLine = model.getLineContent(range2.startLineNumber); + const currentLineIndent = getLeadingWhitespace(currentLine); + const afterEnterAction = getInheritIndentForLine(autoIndent, virtualModel, range2.startLineNumber + 1, void 0, languageConfigurationService); + if (!afterEnterAction) { + const beforeEnter = languageIsDifferentFromLineStart ? currentLineIndent : beforeEnterIndent; + return { + beforeEnter, + afterEnter: beforeEnter + }; + } + let afterEnterIndent = languageIsDifferentFromLineStart ? currentLineIndent : afterEnterAction.indentation; + if (afterEnterAction.action === IndentAction2.Indent) { + afterEnterIndent = indentConverter.shiftIndent(afterEnterIndent); + } + if (indentRulesSupport.shouldDecrease(afterEnterProcessedTokens.getLineContent())) { + afterEnterIndent = indentConverter.unshiftIndent(afterEnterIndent); + } + return { + beforeEnter: languageIsDifferentFromLineStart ? currentLineIndent : beforeEnterIndent, + afterEnter: afterEnterIndent + }; +} +function getIndentActionForType(autoIndent, model, range2, ch, indentConverter, languageConfigurationService) { + if (autoIndent < 4) { + return null; + } + const languageIsDifferentFromLineStart = isLanguageDifferentFromLineStart(model, range2.getStartPosition()); + if (languageIsDifferentFromLineStart) { + return null; + } + const languageId = model.getLanguageIdAtPosition(range2.startLineNumber, range2.startColumn); + const indentRulesSupport = languageConfigurationService.getLanguageConfiguration(languageId).indentRulesSupport; + if (!indentRulesSupport) { + return null; + } + const indentationContextProcessor = new IndentationContextProcessor(model, languageConfigurationService); + const processedContextTokens = indentationContextProcessor.getProcessedTokenContextAroundRange(range2); + const beforeRangeText = processedContextTokens.beforeRangeProcessedTokens.getLineContent(); + const afterRangeText = processedContextTokens.afterRangeProcessedTokens.getLineContent(); + const textAroundRange = beforeRangeText + afterRangeText; + const textAroundRangeWithCharacter = beforeRangeText + ch + afterRangeText; + if (!indentRulesSupport.shouldDecrease(textAroundRange) && indentRulesSupport.shouldDecrease(textAroundRangeWithCharacter)) { + const r = getInheritIndentForLine(autoIndent, model, range2.startLineNumber, false, languageConfigurationService); + if (!r) { + return null; + } + let indentation = r.indentation; + if (r.action !== IndentAction2.Indent) { + indentation = indentConverter.unshiftIndent(indentation); + } + return indentation; + } + return null; +} +function getIndentMetadata(model, lineNumber, languageConfigurationService) { + const indentRulesSupport = languageConfigurationService.getLanguageConfiguration(model.getLanguageId()).indentRulesSupport; + if (!indentRulesSupport) { + return null; + } + if (lineNumber < 1 || lineNumber > model.getLineCount()) { + return null; + } + return indentRulesSupport.getIndentMetadata(model.getLineContent(lineNumber)); +} +function createVirtualModelWithModifiedTokensAtLine(model, modifiedLineNumber, modifiedTokens) { + const virtualModel = { + tokenization: { + getLineTokens: (lineNumber) => { + if (lineNumber === modifiedLineNumber) { + return modifiedTokens; + } else { + return model.tokenization.getLineTokens(lineNumber); + } + }, + getLanguageId: () => { + return model.getLanguageId(); + }, + getLanguageIdAtPosition: (lineNumber, column) => { + return model.getLanguageIdAtPosition(lineNumber, column); + } + }, + getLineContent: (lineNumber) => { + if (lineNumber === modifiedLineNumber) { + return modifiedTokens.getLineContent(); + } else { + return model.getLineContent(lineNumber); + } + } + }; + return virtualModel; +} +var init_autoIndent = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/autoIndent.js"() { + init_strings(); + init_languageConfiguration(); + init_indentationLineProcessor(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorTypeOperations.js +function getTypingOperation(typedText, previousTypingOperation) { + if (typedText === " ") { + return previousTypingOperation === 5 || previousTypingOperation === 6 ? 6 : 5; + } + return 4; +} +function shouldPushStackElementBetween(previousTypingOperation, typingOperation) { + if (isTypingOperation(previousTypingOperation) && !isTypingOperation(typingOperation)) { + return true; + } + if (previousTypingOperation === 5) { + return false; + } + return normalizeOperationType(previousTypingOperation) !== normalizeOperationType(typingOperation); +} +function normalizeOperationType(type) { + return type === 6 || type === 5 ? "space" : type; +} +function isTypingOperation(type) { + return type === 4 || type === 5 || type === 6; +} +var TypeOperations, TypeWithAutoClosingCommand, CompositionOutcome; +var init_cursorTypeOperations = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorTypeOperations.js"() { + init_errors(); + init_strings(); + init_replaceCommand(); + init_shiftCommand(); + init_surroundSelectionCommand(); + init_cursorCommon(); + init_wordCharacterClassifier(); + init_range(); + init_position(); + init_languageConfiguration(); + init_languageConfigurationRegistry(); + init_supports(); + init_autoIndent(); + init_enterAction(); + TypeOperations = class _TypeOperations { + static indent(config, model, selections) { + if (model === null || selections === null) { + return []; + } + const commands = []; + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = new ShiftCommand(selections[i], { + isUnshift: false, + tabSize: config.tabSize, + indentSize: config.indentSize, + insertSpaces: config.insertSpaces, + useTabStops: config.useTabStops, + autoIndent: config.autoIndent + }, config.languageConfigurationService); + } + return commands; + } + static outdent(config, model, selections) { + const commands = []; + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = new ShiftCommand(selections[i], { + isUnshift: true, + tabSize: config.tabSize, + indentSize: config.indentSize, + insertSpaces: config.insertSpaces, + useTabStops: config.useTabStops, + autoIndent: config.autoIndent + }, config.languageConfigurationService); + } + return commands; + } + static shiftIndent(config, indentation, count) { + count = count || 1; + return ShiftCommand.shiftIndent(indentation, indentation.length + count, config.tabSize, config.indentSize, config.insertSpaces); + } + static unshiftIndent(config, indentation, count) { + count = count || 1; + return ShiftCommand.unshiftIndent(indentation, indentation.length + count, config.tabSize, config.indentSize, config.insertSpaces); + } + static _distributedPaste(config, model, selections, text2) { + const commands = []; + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = new ReplaceCommand(selections[i], text2[i]); + } + return new EditOperationResult(0, commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: true + }); + } + static _simplePaste(config, model, selections, text2, pasteOnNewLine) { + const commands = []; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + const position = selection.getPosition(); + if (pasteOnNewLine && !selection.isEmpty()) { + pasteOnNewLine = false; + } + if (pasteOnNewLine && text2.indexOf("\n") !== text2.length - 1) { + pasteOnNewLine = false; + } + if (pasteOnNewLine) { + const typeSelection = new Range(position.lineNumber, 1, position.lineNumber, 1); + commands[i] = new ReplaceCommandThatPreservesSelection(typeSelection, text2, selection, true); + } else { + commands[i] = new ReplaceCommand(selection, text2); + } + } + return new EditOperationResult(0, commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: true + }); + } + static _distributePasteToCursors(config, selections, text2, pasteOnNewLine, multicursorText) { + if (pasteOnNewLine) { + return null; + } + if (selections.length === 1) { + return null; + } + if (multicursorText && multicursorText.length === selections.length) { + return multicursorText; + } + if (config.multiCursorPaste === "spread") { + if (text2.charCodeAt(text2.length - 1) === 10) { + text2 = text2.substr(0, text2.length - 1); + } + if (text2.charCodeAt(text2.length - 1) === 13) { + text2 = text2.substr(0, text2.length - 1); + } + const lines = splitLines(text2); + if (lines.length === selections.length) { + return lines; + } + } + return null; + } + static paste(config, model, selections, text2, pasteOnNewLine, multicursorText) { + const distributedPaste = this._distributePasteToCursors(config, selections, text2, pasteOnNewLine, multicursorText); + if (distributedPaste) { + selections = selections.sort(Range.compareRangesUsingStarts); + return this._distributedPaste(config, model, selections, distributedPaste); + } else { + return this._simplePaste(config, model, selections, text2, pasteOnNewLine); + } + } + static _goodIndentForLine(config, model, lineNumber) { + let action = null; + let indentation = ""; + const expectedIndentAction = getInheritIndentForLine(config.autoIndent, model, lineNumber, false, config.languageConfigurationService); + if (expectedIndentAction) { + action = expectedIndentAction.action; + indentation = expectedIndentAction.indentation; + } else if (lineNumber > 1) { + let lastLineNumber; + for (lastLineNumber = lineNumber - 1; lastLineNumber >= 1; lastLineNumber--) { + const lineText = model.getLineContent(lastLineNumber); + const nonWhitespaceIdx = lastNonWhitespaceIndex(lineText); + if (nonWhitespaceIdx >= 0) { + break; + } + } + if (lastLineNumber < 1) { + return null; + } + const maxColumn = model.getLineMaxColumn(lastLineNumber); + const expectedEnterAction = getEnterAction(config.autoIndent, model, new Range(lastLineNumber, maxColumn, lastLineNumber, maxColumn), config.languageConfigurationService); + if (expectedEnterAction) { + indentation = expectedEnterAction.indentation + expectedEnterAction.appendText; + } + } + if (action) { + if (action === IndentAction2.Indent) { + indentation = _TypeOperations.shiftIndent(config, indentation); + } + if (action === IndentAction2.Outdent) { + indentation = _TypeOperations.unshiftIndent(config, indentation); + } + indentation = config.normalizeIndentation(indentation); + } + if (!indentation) { + return null; + } + return indentation; + } + static _replaceJumpToNextIndent(config, model, selection, insertsAutoWhitespace) { + let typeText = ""; + const position = selection.getStartPosition(); + if (config.insertSpaces) { + const visibleColumnFromColumn = config.visibleColumnFromColumn(model, position); + const indentSize = config.indentSize; + const spacesCnt = indentSize - visibleColumnFromColumn % indentSize; + for (let i = 0; i < spacesCnt; i++) { + typeText += " "; + } + } else { + typeText = " "; + } + return new ReplaceCommand(selection, typeText, insertsAutoWhitespace); + } + static tab(config, model, selections) { + const commands = []; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + if (selection.isEmpty()) { + const lineText = model.getLineContent(selection.startLineNumber); + if (/^\s*$/.test(lineText) && model.tokenization.isCheapToTokenize(selection.startLineNumber)) { + let goodIndent = this._goodIndentForLine(config, model, selection.startLineNumber); + goodIndent = goodIndent || " "; + const possibleTypeText = config.normalizeIndentation(goodIndent); + if (!lineText.startsWith(possibleTypeText)) { + commands[i] = new ReplaceCommand(new Range(selection.startLineNumber, 1, selection.startLineNumber, lineText.length + 1), possibleTypeText, true); + continue; + } + } + commands[i] = this._replaceJumpToNextIndent(config, model, selection, true); + } else { + if (selection.startLineNumber === selection.endLineNumber) { + const lineMaxColumn = model.getLineMaxColumn(selection.startLineNumber); + if (selection.startColumn !== 1 || selection.endColumn !== lineMaxColumn) { + commands[i] = this._replaceJumpToNextIndent(config, model, selection, false); + continue; + } + } + commands[i] = new ShiftCommand(selection, { + isUnshift: false, + tabSize: config.tabSize, + indentSize: config.indentSize, + insertSpaces: config.insertSpaces, + useTabStops: config.useTabStops, + autoIndent: config.autoIndent + }, config.languageConfigurationService); + } + } + return commands; + } + static compositionType(prevEditOperationType, config, model, selections, text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta) { + const commands = selections.map((selection) => this._compositionType(model, selection, text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta)); + return new EditOperationResult(4, commands, { + shouldPushStackElementBefore: shouldPushStackElementBetween( + prevEditOperationType, + 4 + /* EditOperationType.TypingOther */ + ), + shouldPushStackElementAfter: false + }); + } + static _compositionType(model, selection, text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta) { + if (!selection.isEmpty()) { + return null; + } + const pos = selection.getPosition(); + const startColumn = Math.max(1, pos.column - replacePrevCharCnt); + const endColumn = Math.min(model.getLineMaxColumn(pos.lineNumber), pos.column + replaceNextCharCnt); + const range2 = new Range(pos.lineNumber, startColumn, pos.lineNumber, endColumn); + const oldText = model.getValueInRange(range2); + if (oldText === text2 && positionDelta === 0) { + return null; + } + return new ReplaceCommandWithOffsetCursorState(range2, text2, 0, positionDelta); + } + static _typeCommand(range2, text2, keepPosition) { + if (keepPosition) { + return new ReplaceCommandWithoutChangingPosition(range2, text2, true); + } else { + return new ReplaceCommand(range2, text2, true); + } + } + static _enter(config, model, keepPosition, range2) { + if (config.autoIndent === 0) { + return _TypeOperations._typeCommand(range2, "\n", keepPosition); + } + if (!model.tokenization.isCheapToTokenize(range2.getStartPosition().lineNumber) || config.autoIndent === 1) { + const lineText2 = model.getLineContent(range2.startLineNumber); + const indentation2 = getLeadingWhitespace(lineText2).substring(0, range2.startColumn - 1); + return _TypeOperations._typeCommand(range2, "\n" + config.normalizeIndentation(indentation2), keepPosition); + } + const r = getEnterAction(config.autoIndent, model, range2, config.languageConfigurationService); + if (r) { + if (r.indentAction === IndentAction2.None) { + return _TypeOperations._typeCommand(range2, "\n" + config.normalizeIndentation(r.indentation + r.appendText), keepPosition); + } else if (r.indentAction === IndentAction2.Indent) { + return _TypeOperations._typeCommand(range2, "\n" + config.normalizeIndentation(r.indentation + r.appendText), keepPosition); + } else if (r.indentAction === IndentAction2.IndentOutdent) { + const normalIndent = config.normalizeIndentation(r.indentation); + const increasedIndent = config.normalizeIndentation(r.indentation + r.appendText); + const typeText = "\n" + increasedIndent + "\n" + normalIndent; + if (keepPosition) { + return new ReplaceCommandWithoutChangingPosition(range2, typeText, true); + } else { + return new ReplaceCommandWithOffsetCursorState(range2, typeText, -1, increasedIndent.length - normalIndent.length, true); + } + } else if (r.indentAction === IndentAction2.Outdent) { + const actualIndentation = _TypeOperations.unshiftIndent(config, r.indentation); + return _TypeOperations._typeCommand(range2, "\n" + config.normalizeIndentation(actualIndentation + r.appendText), keepPosition); + } + } + const lineText = model.getLineContent(range2.startLineNumber); + const indentation = getLeadingWhitespace(lineText).substring(0, range2.startColumn - 1); + if (config.autoIndent >= 4) { + const ir = getIndentForEnter(config.autoIndent, model, range2, { + unshiftIndent: (indent) => { + return _TypeOperations.unshiftIndent(config, indent); + }, + shiftIndent: (indent) => { + return _TypeOperations.shiftIndent(config, indent); + }, + normalizeIndentation: (indent) => { + return config.normalizeIndentation(indent); + } + }, config.languageConfigurationService); + if (ir) { + let oldEndViewColumn = config.visibleColumnFromColumn(model, range2.getEndPosition()); + const oldEndColumn = range2.endColumn; + const newLineContent = model.getLineContent(range2.endLineNumber); + const firstNonWhitespace = firstNonWhitespaceIndex(newLineContent); + if (firstNonWhitespace >= 0) { + range2 = range2.setEndPosition(range2.endLineNumber, Math.max(range2.endColumn, firstNonWhitespace + 1)); + } else { + range2 = range2.setEndPosition(range2.endLineNumber, model.getLineMaxColumn(range2.endLineNumber)); + } + if (keepPosition) { + return new ReplaceCommandWithoutChangingPosition(range2, "\n" + config.normalizeIndentation(ir.afterEnter), true); + } else { + let offset = 0; + if (oldEndColumn <= firstNonWhitespace + 1) { + if (!config.insertSpaces) { + oldEndViewColumn = Math.ceil(oldEndViewColumn / config.indentSize); + } + offset = Math.min(oldEndViewColumn + 1 - config.normalizeIndentation(ir.afterEnter).length - 1, 0); + } + return new ReplaceCommandWithOffsetCursorState(range2, "\n" + config.normalizeIndentation(ir.afterEnter), 0, offset, true); + } + } + } + return _TypeOperations._typeCommand(range2, "\n" + config.normalizeIndentation(indentation), keepPosition); + } + static _isAutoIndentType(config, model, selections) { + if (config.autoIndent < 4) { + return false; + } + for (let i = 0, len = selections.length; i < len; i++) { + if (!model.tokenization.isCheapToTokenize(selections[i].getEndPosition().lineNumber)) { + return false; + } + } + return true; + } + static _runAutoIndentType(config, model, range2, ch) { + const currentIndentation = getIndentationAtPosition(model, range2.startLineNumber, range2.startColumn); + const actualIndentation = getIndentActionForType(config.autoIndent, model, range2, ch, { + shiftIndent: (indentation) => { + return _TypeOperations.shiftIndent(config, indentation); + }, + unshiftIndent: (indentation) => { + return _TypeOperations.unshiftIndent(config, indentation); + } + }, config.languageConfigurationService); + if (actualIndentation === null) { + return null; + } + if (actualIndentation !== config.normalizeIndentation(currentIndentation)) { + const firstNonWhitespace = model.getLineFirstNonWhitespaceColumn(range2.startLineNumber); + if (firstNonWhitespace === 0) { + return _TypeOperations._typeCommand(new Range(range2.startLineNumber, 1, range2.endLineNumber, range2.endColumn), config.normalizeIndentation(actualIndentation) + ch, false); + } else { + return _TypeOperations._typeCommand(new Range(range2.startLineNumber, 1, range2.endLineNumber, range2.endColumn), config.normalizeIndentation(actualIndentation) + model.getLineContent(range2.startLineNumber).substring(firstNonWhitespace - 1, range2.startColumn - 1) + ch, false); + } + } + return null; + } + static _isAutoClosingOvertype(config, model, selections, autoClosedCharacters, ch) { + if (config.autoClosingOvertype === "never") { + return false; + } + if (!config.autoClosingPairs.autoClosingPairsCloseSingleChar.has(ch)) { + return false; + } + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + if (!selection.isEmpty()) { + return false; + } + const position = selection.getPosition(); + const lineText = model.getLineContent(position.lineNumber); + const afterCharacter = lineText.charAt(position.column - 1); + if (afterCharacter !== ch) { + return false; + } + const chIsQuote = isQuote(ch); + const beforeCharacter = position.column > 2 ? lineText.charCodeAt(position.column - 2) : 0; + if (beforeCharacter === 92 && chIsQuote) { + return false; + } + if (config.autoClosingOvertype === "auto") { + let found = false; + for (let j = 0, lenJ = autoClosedCharacters.length; j < lenJ; j++) { + const autoClosedCharacter = autoClosedCharacters[j]; + if (position.lineNumber === autoClosedCharacter.startLineNumber && position.column === autoClosedCharacter.startColumn) { + found = true; + break; + } + } + if (!found) { + return false; + } + } + } + return true; + } + static _runAutoClosingOvertype(prevEditOperationType, config, model, selections, ch) { + const commands = []; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + const position = selection.getPosition(); + const typeSelection = new Range(position.lineNumber, position.column, position.lineNumber, position.column + 1); + commands[i] = new ReplaceCommand(typeSelection, ch); + } + return new EditOperationResult(4, commands, { + shouldPushStackElementBefore: shouldPushStackElementBetween( + prevEditOperationType, + 4 + /* EditOperationType.TypingOther */ + ), + shouldPushStackElementAfter: false + }); + } + static _isBeforeClosingBrace(config, lineAfter) { + const nextChar = lineAfter.charAt(0); + const potentialStartingBraces = config.autoClosingPairs.autoClosingPairsOpenByStart.get(nextChar) || []; + const potentialClosingBraces = config.autoClosingPairs.autoClosingPairsCloseByStart.get(nextChar) || []; + const isBeforeStartingBrace = potentialStartingBraces.some((x) => lineAfter.startsWith(x.open)); + const isBeforeClosingBrace = potentialClosingBraces.some((x) => lineAfter.startsWith(x.close)); + return !isBeforeStartingBrace && isBeforeClosingBrace; + } + /** + * Determine if typing `ch` at all `positions` in the `model` results in an + * auto closing open sequence being typed. + * + * Auto closing open sequences can consist of multiple characters, which + * can lead to ambiguities. In such a case, the longest auto-closing open + * sequence is returned. + */ + static _findAutoClosingPairOpen(config, model, positions, ch) { + const candidates = config.autoClosingPairs.autoClosingPairsOpenByEnd.get(ch); + if (!candidates) { + return null; + } + let result = null; + for (const candidate of candidates) { + if (result === null || candidate.open.length > result.open.length) { + let candidateIsMatch = true; + for (const position of positions) { + const relevantText = model.getValueInRange(new Range(position.lineNumber, position.column - candidate.open.length + 1, position.lineNumber, position.column)); + if (relevantText + ch !== candidate.open) { + candidateIsMatch = false; + break; + } + } + if (candidateIsMatch) { + result = candidate; + } + } + } + return result; + } + /** + * Find another auto-closing pair that is contained by the one passed in. + * + * e.g. when having [(,)] and [(*,*)] as auto-closing pairs + * this method will find [(,)] as a containment pair for [(*,*)] + */ + static _findContainedAutoClosingPair(config, pair) { + if (pair.open.length <= 1) { + return null; + } + const lastChar = pair.close.charAt(pair.close.length - 1); + const candidates = config.autoClosingPairs.autoClosingPairsCloseByEnd.get(lastChar) || []; + let result = null; + for (const candidate of candidates) { + if (candidate.open !== pair.open && pair.open.includes(candidate.open) && pair.close.endsWith(candidate.close)) { + if (!result || candidate.open.length > result.open.length) { + result = candidate; + } + } + } + return result; + } + static _getAutoClosingPairClose(config, model, selections, ch, chIsAlreadyTyped) { + for (const selection of selections) { + if (!selection.isEmpty()) { + return null; + } + } + const positions = selections.map((s) => { + const position = s.getPosition(); + if (chIsAlreadyTyped) { + return { lineNumber: position.lineNumber, beforeColumn: position.column - ch.length, afterColumn: position.column }; + } else { + return { lineNumber: position.lineNumber, beforeColumn: position.column, afterColumn: position.column }; + } + }); + const pair = this._findAutoClosingPairOpen(config, model, positions.map((p) => new Position(p.lineNumber, p.beforeColumn)), ch); + if (!pair) { + return null; + } + let autoCloseConfig; + let shouldAutoCloseBefore; + const chIsQuote = isQuote(ch); + if (chIsQuote) { + autoCloseConfig = config.autoClosingQuotes; + shouldAutoCloseBefore = config.shouldAutoCloseBefore.quote; + } else { + const pairIsForComments = config.blockCommentStartToken ? pair.open.includes(config.blockCommentStartToken) : false; + if (pairIsForComments) { + autoCloseConfig = config.autoClosingComments; + shouldAutoCloseBefore = config.shouldAutoCloseBefore.comment; + } else { + autoCloseConfig = config.autoClosingBrackets; + shouldAutoCloseBefore = config.shouldAutoCloseBefore.bracket; + } + } + if (autoCloseConfig === "never") { + return null; + } + const containedPair = this._findContainedAutoClosingPair(config, pair); + const containedPairClose = containedPair ? containedPair.close : ""; + let isContainedPairPresent = true; + for (const position of positions) { + const { lineNumber, beforeColumn, afterColumn } = position; + const lineText = model.getLineContent(lineNumber); + const lineBefore = lineText.substring(0, beforeColumn - 1); + const lineAfter = lineText.substring(afterColumn - 1); + if (!lineAfter.startsWith(containedPairClose)) { + isContainedPairPresent = false; + } + if (lineAfter.length > 0) { + const characterAfter = lineAfter.charAt(0); + const isBeforeCloseBrace = _TypeOperations._isBeforeClosingBrace(config, lineAfter); + if (!isBeforeCloseBrace && !shouldAutoCloseBefore(characterAfter)) { + return null; + } + } + if (pair.open.length === 1 && (ch === "'" || ch === '"') && autoCloseConfig !== "always") { + const wordSeparators2 = getMapForWordSeparators(config.wordSeparators, []); + if (lineBefore.length > 0) { + const characterBefore = lineBefore.charCodeAt(lineBefore.length - 1); + if (wordSeparators2.get(characterBefore) === 0) { + return null; + } + } + } + if (!model.tokenization.isCheapToTokenize(lineNumber)) { + return null; + } + model.tokenization.forceTokenization(lineNumber); + const lineTokens = model.tokenization.getLineTokens(lineNumber); + const scopedLineTokens = createScopedLineTokens(lineTokens, beforeColumn - 1); + if (!pair.shouldAutoClose(scopedLineTokens, beforeColumn - scopedLineTokens.firstCharOffset)) { + return null; + } + const neutralCharacter = pair.findNeutralCharacter(); + if (neutralCharacter) { + const tokenType = model.tokenization.getTokenTypeIfInsertingCharacter(lineNumber, beforeColumn, neutralCharacter); + if (!pair.isOK(tokenType)) { + return null; + } + } + } + if (isContainedPairPresent) { + return pair.close.substring(0, pair.close.length - containedPairClose.length); + } else { + return pair.close; + } + } + static _runAutoClosingOpenCharType(prevEditOperationType, config, model, selections, ch, chIsAlreadyTyped, autoClosingPairClose) { + const commands = []; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + commands[i] = new TypeWithAutoClosingCommand(selection, ch, !chIsAlreadyTyped, autoClosingPairClose); + } + return new EditOperationResult(4, commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: false + }); + } + static _shouldSurroundChar(config, ch) { + if (isQuote(ch)) { + return config.autoSurround === "quotes" || config.autoSurround === "languageDefined"; + } else { + return config.autoSurround === "brackets" || config.autoSurround === "languageDefined"; + } + } + static _isSurroundSelectionType(config, model, selections, ch) { + if (!_TypeOperations._shouldSurroundChar(config, ch) || !config.surroundingPairs.hasOwnProperty(ch)) { + return false; + } + const isTypingAQuoteCharacter = isQuote(ch); + for (const selection of selections) { + if (selection.isEmpty()) { + return false; + } + let selectionContainsOnlyWhitespace = true; + for (let lineNumber = selection.startLineNumber; lineNumber <= selection.endLineNumber; lineNumber++) { + const lineText = model.getLineContent(lineNumber); + const startIndex = lineNumber === selection.startLineNumber ? selection.startColumn - 1 : 0; + const endIndex = lineNumber === selection.endLineNumber ? selection.endColumn - 1 : lineText.length; + const selectedText = lineText.substring(startIndex, endIndex); + if (/[^ \t]/.test(selectedText)) { + selectionContainsOnlyWhitespace = false; + break; + } + } + if (selectionContainsOnlyWhitespace) { + return false; + } + if (isTypingAQuoteCharacter && selection.startLineNumber === selection.endLineNumber && selection.startColumn + 1 === selection.endColumn) { + const selectionText = model.getValueInRange(selection); + if (isQuote(selectionText)) { + return false; + } + } + } + return true; + } + static _runSurroundSelectionType(prevEditOperationType, config, model, selections, ch) { + const commands = []; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + const closeCharacter = config.surroundingPairs[ch]; + commands[i] = new SurroundSelectionCommand(selection, ch, closeCharacter); + } + return new EditOperationResult(0, commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: true + }); + } + static _isTypeInterceptorElectricChar(config, model, selections) { + if (selections.length === 1 && model.tokenization.isCheapToTokenize(selections[0].getEndPosition().lineNumber)) { + return true; + } + return false; + } + static _typeInterceptorElectricChar(prevEditOperationType, config, model, selection, ch) { + if (!config.electricChars.hasOwnProperty(ch) || !selection.isEmpty()) { + return null; + } + const position = selection.getPosition(); + model.tokenization.forceTokenization(position.lineNumber); + const lineTokens = model.tokenization.getLineTokens(position.lineNumber); + let electricAction; + try { + electricAction = config.onElectricCharacter(ch, lineTokens, position.column); + } catch (e) { + onUnexpectedError(e); + return null; + } + if (!electricAction) { + return null; + } + if (electricAction.matchOpenBracket) { + const endColumn = (lineTokens.getLineContent() + ch).lastIndexOf(electricAction.matchOpenBracket) + 1; + const match2 = model.bracketPairs.findMatchingBracketUp( + electricAction.matchOpenBracket, + { + lineNumber: position.lineNumber, + column: endColumn + }, + 500 + /* give at most 500ms to compute */ + ); + if (match2) { + if (match2.startLineNumber === position.lineNumber) { + return null; + } + const matchLine = model.getLineContent(match2.startLineNumber); + const matchLineIndentation = getLeadingWhitespace(matchLine); + const newIndentation = config.normalizeIndentation(matchLineIndentation); + const lineText = model.getLineContent(position.lineNumber); + const lineFirstNonBlankColumn = model.getLineFirstNonWhitespaceColumn(position.lineNumber) || position.column; + const prefix = lineText.substring(lineFirstNonBlankColumn - 1, position.column - 1); + const typeText = newIndentation + prefix + ch; + const typeSelection = new Range(position.lineNumber, 1, position.lineNumber, position.column); + const command = new ReplaceCommand(typeSelection, typeText); + return new EditOperationResult(getTypingOperation(typeText, prevEditOperationType), [command], { + shouldPushStackElementBefore: false, + shouldPushStackElementAfter: true + }); + } + } + return null; + } + /** + * This is very similar with typing, but the character is already in the text buffer! + */ + static compositionEndWithInterceptors(prevEditOperationType, config, model, compositions, selections, autoClosedCharacters) { + if (!compositions) { + return null; + } + let insertedText = null; + for (const composition of compositions) { + if (insertedText === null) { + insertedText = composition.insertedText; + } else if (insertedText !== composition.insertedText) { + return null; + } + } + if (!insertedText || insertedText.length !== 1) { + return null; + } + const ch = insertedText; + let hasDeletion = false; + for (const composition of compositions) { + if (composition.deletedText.length !== 0) { + hasDeletion = true; + break; + } + } + if (hasDeletion) { + if (!_TypeOperations._shouldSurroundChar(config, ch) || !config.surroundingPairs.hasOwnProperty(ch)) { + return null; + } + const isTypingAQuoteCharacter = isQuote(ch); + for (const composition of compositions) { + if (composition.deletedSelectionStart !== 0 || composition.deletedSelectionEnd !== composition.deletedText.length) { + return null; + } + if (/^[ \t]+$/.test(composition.deletedText)) { + return null; + } + if (isTypingAQuoteCharacter && isQuote(composition.deletedText)) { + return null; + } + } + const positions = []; + for (const selection of selections) { + if (!selection.isEmpty()) { + return null; + } + positions.push(selection.getPosition()); + } + if (positions.length !== compositions.length) { + return null; + } + const commands = []; + for (let i = 0, len = positions.length; i < len; i++) { + commands.push(new CompositionSurroundSelectionCommand(positions[i], compositions[i].deletedText, config.surroundingPairs[ch])); + } + return new EditOperationResult(4, commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: false + }); + } + if (this._isAutoClosingOvertype(config, model, selections, autoClosedCharacters, ch)) { + const commands = selections.map((s) => new ReplaceCommand(new Range(s.positionLineNumber, s.positionColumn, s.positionLineNumber, s.positionColumn + 1), "", false)); + return new EditOperationResult(4, commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: false + }); + } + const autoClosingPairClose = this._getAutoClosingPairClose(config, model, selections, ch, true); + if (autoClosingPairClose !== null) { + return this._runAutoClosingOpenCharType(prevEditOperationType, config, model, selections, ch, true, autoClosingPairClose); + } + return null; + } + static typeWithInterceptors(isDoingComposition, prevEditOperationType, config, model, selections, autoClosedCharacters, ch) { + if (!isDoingComposition && ch === "\n") { + const commands2 = []; + for (let i = 0, len = selections.length; i < len; i++) { + commands2[i] = _TypeOperations._enter(config, model, false, selections[i]); + } + return new EditOperationResult(4, commands2, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: false + }); + } + if (!isDoingComposition && this._isAutoIndentType(config, model, selections)) { + const commands2 = []; + let autoIndentFails = false; + for (let i = 0, len = selections.length; i < len; i++) { + commands2[i] = this._runAutoIndentType(config, model, selections[i], ch); + if (!commands2[i]) { + autoIndentFails = true; + break; + } + } + if (!autoIndentFails) { + return new EditOperationResult(4, commands2, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: false + }); + } + } + if (this._isAutoClosingOvertype(config, model, selections, autoClosedCharacters, ch)) { + return this._runAutoClosingOvertype(prevEditOperationType, config, model, selections, ch); + } + if (!isDoingComposition) { + const autoClosingPairClose = this._getAutoClosingPairClose(config, model, selections, ch, false); + if (autoClosingPairClose) { + return this._runAutoClosingOpenCharType(prevEditOperationType, config, model, selections, ch, false, autoClosingPairClose); + } + } + if (!isDoingComposition && this._isSurroundSelectionType(config, model, selections, ch)) { + return this._runSurroundSelectionType(prevEditOperationType, config, model, selections, ch); + } + if (!isDoingComposition && this._isTypeInterceptorElectricChar(config, model, selections)) { + const r = this._typeInterceptorElectricChar(prevEditOperationType, config, model, selections[0], ch); + if (r) { + return r; + } + } + const commands = []; + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = new ReplaceCommand(selections[i], ch); + } + const opType = getTypingOperation(ch, prevEditOperationType); + return new EditOperationResult(opType, commands, { + shouldPushStackElementBefore: shouldPushStackElementBetween(prevEditOperationType, opType), + shouldPushStackElementAfter: false + }); + } + static typeWithoutInterceptors(prevEditOperationType, config, model, selections, str) { + const commands = []; + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = new ReplaceCommand(selections[i], str); + } + const opType = getTypingOperation(str, prevEditOperationType); + return new EditOperationResult(opType, commands, { + shouldPushStackElementBefore: shouldPushStackElementBetween(prevEditOperationType, opType), + shouldPushStackElementAfter: false + }); + } + static lineInsertBefore(config, model, selections) { + if (model === null || selections === null) { + return []; + } + const commands = []; + for (let i = 0, len = selections.length; i < len; i++) { + let lineNumber = selections[i].positionLineNumber; + if (lineNumber === 1) { + commands[i] = new ReplaceCommandWithoutChangingPosition(new Range(1, 1, 1, 1), "\n"); + } else { + lineNumber--; + const column = model.getLineMaxColumn(lineNumber); + commands[i] = this._enter(config, model, false, new Range(lineNumber, column, lineNumber, column)); + } + } + return commands; + } + static lineInsertAfter(config, model, selections) { + if (model === null || selections === null) { + return []; + } + const commands = []; + for (let i = 0, len = selections.length; i < len; i++) { + const lineNumber = selections[i].positionLineNumber; + const column = model.getLineMaxColumn(lineNumber); + commands[i] = this._enter(config, model, false, new Range(lineNumber, column, lineNumber, column)); + } + return commands; + } + static lineBreakInsert(config, model, selections) { + const commands = []; + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = this._enter(config, model, true, selections[i]); + } + return commands; + } + }; + TypeWithAutoClosingCommand = class extends ReplaceCommandWithOffsetCursorState { + constructor(selection, openCharacter, insertOpenCharacter, closeCharacter) { + super(selection, (insertOpenCharacter ? openCharacter : "") + closeCharacter, 0, -closeCharacter.length); + this._openCharacter = openCharacter; + this._closeCharacter = closeCharacter; + this.closeCharacterRange = null; + this.enclosingRange = null; + } + computeCursorState(model, helper) { + const inverseEditOperations = helper.getInverseEditOperations(); + const range2 = inverseEditOperations[0].range; + this.closeCharacterRange = new Range(range2.startLineNumber, range2.endColumn - this._closeCharacter.length, range2.endLineNumber, range2.endColumn); + this.enclosingRange = new Range(range2.startLineNumber, range2.endColumn - this._openCharacter.length - this._closeCharacter.length, range2.endLineNumber, range2.endColumn); + return super.computeCursorState(model, helper); + } + }; + CompositionOutcome = class { + constructor(deletedText, deletedSelectionStart, deletedSelectionEnd, insertedText, insertedSelectionStart, insertedSelectionEnd) { + this.deletedText = deletedText; + this.deletedSelectionStart = deletedSelectionStart; + this.deletedSelectionEnd = deletedSelectionEnd; + this.insertedText = insertedText; + this.insertedSelectionStart = insertedSelectionStart; + this.insertedSelectionEnd = insertedSelectionEnd; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/editorContextKeys.js +var EditorContextKeys; +var init_editorContextKeys = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/editorContextKeys.js"() { + init_nls(); + init_contextkey(); + (function(EditorContextKeys2) { + EditorContextKeys2.editorSimpleInput = new RawContextKey("editorSimpleInput", false, true); + EditorContextKeys2.editorTextFocus = new RawContextKey("editorTextFocus", false, localize("editorTextFocus", "Whether the editor text has focus (cursor is blinking)")); + EditorContextKeys2.focus = new RawContextKey("editorFocus", false, localize("editorFocus", "Whether the editor or an editor widget has focus (e.g. focus is in the find widget)")); + EditorContextKeys2.textInputFocus = new RawContextKey("textInputFocus", false, localize("textInputFocus", "Whether an editor or a rich text input has focus (cursor is blinking)")); + EditorContextKeys2.readOnly = new RawContextKey("editorReadonly", false, localize("editorReadonly", "Whether the editor is read-only")); + EditorContextKeys2.inDiffEditor = new RawContextKey("inDiffEditor", false, localize("inDiffEditor", "Whether the context is a diff editor")); + EditorContextKeys2.isEmbeddedDiffEditor = new RawContextKey("isEmbeddedDiffEditor", false, localize("isEmbeddedDiffEditor", "Whether the context is an embedded diff editor")); + EditorContextKeys2.inMultiDiffEditor = new RawContextKey("inMultiDiffEditor", false, localize("inMultiDiffEditor", "Whether the context is a multi diff editor")); + EditorContextKeys2.multiDiffEditorAllCollapsed = new RawContextKey("multiDiffEditorAllCollapsed", void 0, localize("multiDiffEditorAllCollapsed", "Whether all files in multi diff editor are collapsed")); + EditorContextKeys2.hasChanges = new RawContextKey("diffEditorHasChanges", false, localize("diffEditorHasChanges", "Whether the diff editor has changes")); + EditorContextKeys2.comparingMovedCode = new RawContextKey("comparingMovedCode", false, localize("comparingMovedCode", "Whether a moved code block is selected for comparison")); + EditorContextKeys2.accessibleDiffViewerVisible = new RawContextKey("accessibleDiffViewerVisible", false, localize("accessibleDiffViewerVisible", "Whether the accessible diff viewer is visible")); + EditorContextKeys2.diffEditorRenderSideBySideInlineBreakpointReached = new RawContextKey("diffEditorRenderSideBySideInlineBreakpointReached", false, localize("diffEditorRenderSideBySideInlineBreakpointReached", "Whether the diff editor render side by side inline breakpoint is reached")); + EditorContextKeys2.diffEditorInlineMode = new RawContextKey("diffEditorInlineMode", false, localize("diffEditorInlineMode", "Whether inline mode is active")); + EditorContextKeys2.diffEditorOriginalWritable = new RawContextKey("diffEditorOriginalWritable", false, localize("diffEditorOriginalWritable", "Whether modified is writable in the diff editor")); + EditorContextKeys2.diffEditorModifiedWritable = new RawContextKey("diffEditorModifiedWritable", false, localize("diffEditorModifiedWritable", "Whether modified is writable in the diff editor")); + EditorContextKeys2.diffEditorOriginalUri = new RawContextKey("diffEditorOriginalUri", "", localize("diffEditorOriginalUri", "The uri of the original document")); + EditorContextKeys2.diffEditorModifiedUri = new RawContextKey("diffEditorModifiedUri", "", localize("diffEditorModifiedUri", "The uri of the modified document")); + EditorContextKeys2.columnSelection = new RawContextKey("editorColumnSelection", false, localize("editorColumnSelection", "Whether `editor.columnSelection` is enabled")); + EditorContextKeys2.writable = EditorContextKeys2.readOnly.toNegated(); + EditorContextKeys2.hasNonEmptySelection = new RawContextKey("editorHasSelection", false, localize("editorHasSelection", "Whether the editor has text selected")); + EditorContextKeys2.hasOnlyEmptySelection = EditorContextKeys2.hasNonEmptySelection.toNegated(); + EditorContextKeys2.hasMultipleSelections = new RawContextKey("editorHasMultipleSelections", false, localize("editorHasMultipleSelections", "Whether the editor has multiple selections")); + EditorContextKeys2.hasSingleSelection = EditorContextKeys2.hasMultipleSelections.toNegated(); + EditorContextKeys2.tabMovesFocus = new RawContextKey("editorTabMovesFocus", false, localize("editorTabMovesFocus", "Whether `Tab` will move focus out of the editor")); + EditorContextKeys2.tabDoesNotMoveFocus = EditorContextKeys2.tabMovesFocus.toNegated(); + EditorContextKeys2.isInEmbeddedEditor = new RawContextKey("isInEmbeddedEditor", false, true); + EditorContextKeys2.canUndo = new RawContextKey("canUndo", false, true); + EditorContextKeys2.canRedo = new RawContextKey("canRedo", false, true); + EditorContextKeys2.hoverVisible = new RawContextKey("editorHoverVisible", false, localize("editorHoverVisible", "Whether the editor hover is visible")); + EditorContextKeys2.hoverFocused = new RawContextKey("editorHoverFocused", false, localize("editorHoverFocused", "Whether the editor hover is focused")); + EditorContextKeys2.stickyScrollFocused = new RawContextKey("stickyScrollFocused", false, localize("stickyScrollFocused", "Whether the sticky scroll is focused")); + EditorContextKeys2.stickyScrollVisible = new RawContextKey("stickyScrollVisible", false, localize("stickyScrollVisible", "Whether the sticky scroll is visible")); + EditorContextKeys2.standaloneColorPickerVisible = new RawContextKey("standaloneColorPickerVisible", false, localize("standaloneColorPickerVisible", "Whether the standalone color picker is visible")); + EditorContextKeys2.standaloneColorPickerFocused = new RawContextKey("standaloneColorPickerFocused", false, localize("standaloneColorPickerFocused", "Whether the standalone color picker is focused")); + EditorContextKeys2.inCompositeEditor = new RawContextKey("inCompositeEditor", void 0, localize("inCompositeEditor", "Whether the editor is part of a larger editor (e.g. notebooks)")); + EditorContextKeys2.notInCompositeEditor = EditorContextKeys2.inCompositeEditor.toNegated(); + EditorContextKeys2.languageId = new RawContextKey("editorLangId", "", localize("editorLangId", "The language identifier of the editor")); + EditorContextKeys2.hasCompletionItemProvider = new RawContextKey("editorHasCompletionItemProvider", false, localize("editorHasCompletionItemProvider", "Whether the editor has a completion item provider")); + EditorContextKeys2.hasCodeActionsProvider = new RawContextKey("editorHasCodeActionsProvider", false, localize("editorHasCodeActionsProvider", "Whether the editor has a code actions provider")); + EditorContextKeys2.hasCodeLensProvider = new RawContextKey("editorHasCodeLensProvider", false, localize("editorHasCodeLensProvider", "Whether the editor has a code lens provider")); + EditorContextKeys2.hasDefinitionProvider = new RawContextKey("editorHasDefinitionProvider", false, localize("editorHasDefinitionProvider", "Whether the editor has a definition provider")); + EditorContextKeys2.hasDeclarationProvider = new RawContextKey("editorHasDeclarationProvider", false, localize("editorHasDeclarationProvider", "Whether the editor has a declaration provider")); + EditorContextKeys2.hasImplementationProvider = new RawContextKey("editorHasImplementationProvider", false, localize("editorHasImplementationProvider", "Whether the editor has an implementation provider")); + EditorContextKeys2.hasTypeDefinitionProvider = new RawContextKey("editorHasTypeDefinitionProvider", false, localize("editorHasTypeDefinitionProvider", "Whether the editor has a type definition provider")); + EditorContextKeys2.hasHoverProvider = new RawContextKey("editorHasHoverProvider", false, localize("editorHasHoverProvider", "Whether the editor has a hover provider")); + EditorContextKeys2.hasDocumentHighlightProvider = new RawContextKey("editorHasDocumentHighlightProvider", false, localize("editorHasDocumentHighlightProvider", "Whether the editor has a document highlight provider")); + EditorContextKeys2.hasDocumentSymbolProvider = new RawContextKey("editorHasDocumentSymbolProvider", false, localize("editorHasDocumentSymbolProvider", "Whether the editor has a document symbol provider")); + EditorContextKeys2.hasReferenceProvider = new RawContextKey("editorHasReferenceProvider", false, localize("editorHasReferenceProvider", "Whether the editor has a reference provider")); + EditorContextKeys2.hasRenameProvider = new RawContextKey("editorHasRenameProvider", false, localize("editorHasRenameProvider", "Whether the editor has a rename provider")); + EditorContextKeys2.hasSignatureHelpProvider = new RawContextKey("editorHasSignatureHelpProvider", false, localize("editorHasSignatureHelpProvider", "Whether the editor has a signature help provider")); + EditorContextKeys2.hasInlayHintsProvider = new RawContextKey("editorHasInlayHintsProvider", false, localize("editorHasInlayHintsProvider", "Whether the editor has an inline hints provider")); + EditorContextKeys2.hasDocumentFormattingProvider = new RawContextKey("editorHasDocumentFormattingProvider", false, localize("editorHasDocumentFormattingProvider", "Whether the editor has a document formatting provider")); + EditorContextKeys2.hasDocumentSelectionFormattingProvider = new RawContextKey("editorHasDocumentSelectionFormattingProvider", false, localize("editorHasDocumentSelectionFormattingProvider", "Whether the editor has a document selection formatting provider")); + EditorContextKeys2.hasMultipleDocumentFormattingProvider = new RawContextKey("editorHasMultipleDocumentFormattingProvider", false, localize("editorHasMultipleDocumentFormattingProvider", "Whether the editor has multiple document formatting providers")); + EditorContextKeys2.hasMultipleDocumentSelectionFormattingProvider = new RawContextKey("editorHasMultipleDocumentSelectionFormattingProvider", false, localize("editorHasMultipleDocumentSelectionFormattingProvider", "Whether the editor has multiple document selection formatting providers")); + })(EditorContextKeys || (EditorContextKeys = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/coreCommands.js +function registerColumnSelection(id, keybinding) { + KeybindingsRegistry.registerKeybindingRule({ + id, + primary: keybinding, + when: columnSelectionCondition, + weight: CORE_WEIGHT + 1 + }); +} +function registerCommand2(command) { + command.register(); + return command; +} +function registerOverwritableCommand(handlerId, metadata) { + registerCommand2(new EditorHandlerCommand("default:" + handlerId, handlerId)); + registerCommand2(new EditorHandlerCommand(handlerId, handlerId, metadata)); +} +var CORE_WEIGHT, CoreEditorCommand, EditorScroll_, RevealLine_, EditorOrNativeTextInputCommand, CoreNavigationCommands, columnSelectionCondition, CoreEditingCommands, EditorHandlerCommand; +var init_coreCommands = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/coreCommands.js"() { + init_nls(); + init_browser(); + init_types(); + init_aria2(); + init_editorExtensions(); + init_codeEditorService(); + init_cursorColumnSelection(); + init_cursorCommon(); + init_cursorDeleteOperations(); + init_cursorMoveCommands(); + init_cursorTypeOperations(); + init_position(); + init_range(); + init_editorContextKeys(); + init_contextkey(); + init_keybindingsRegistry(); + init_dom(); + CORE_WEIGHT = 0; + CoreEditorCommand = class extends EditorCommand { + runEditorCommand(accessor, editor2, args) { + const viewModel = editor2._getViewModel(); + if (!viewModel) { + return; + } + this.runCoreEditorCommand(viewModel, args || {}); + } + }; + (function(EditorScroll_2) { + const isEditorScrollArgs = function(arg) { + if (!isObject(arg)) { + return false; + } + const scrollArg = arg; + if (!isString(scrollArg.to)) { + return false; + } + if (!isUndefined(scrollArg.by) && !isString(scrollArg.by)) { + return false; + } + if (!isUndefined(scrollArg.value) && !isNumber(scrollArg.value)) { + return false; + } + if (!isUndefined(scrollArg.revealCursor) && !isBoolean(scrollArg.revealCursor)) { + return false; + } + return true; + }; + EditorScroll_2.metadata = { + description: "Scroll editor in the given direction", + args: [ + { + name: "Editor scroll argument object", + description: `Property-value pairs that can be passed through this argument: + * 'to': A mandatory direction value. + \`\`\` + 'up', 'down' + \`\`\` + * 'by': Unit to move. Default is computed based on 'to' value. + \`\`\` + 'line', 'wrappedLine', 'page', 'halfPage', 'editor' + \`\`\` + * 'value': Number of units to move. Default is '1'. + * 'revealCursor': If 'true' reveals the cursor if it is outside view port. + `, + constraint: isEditorScrollArgs, + schema: { + "type": "object", + "required": ["to"], + "properties": { + "to": { + "type": "string", + "enum": ["up", "down"] + }, + "by": { + "type": "string", + "enum": ["line", "wrappedLine", "page", "halfPage", "editor"] + }, + "value": { + "type": "number", + "default": 1 + }, + "revealCursor": { + "type": "boolean" + } + } + } + } + ] + }; + EditorScroll_2.RawDirection = { + Up: "up", + Right: "right", + Down: "down", + Left: "left" + }; + EditorScroll_2.RawUnit = { + Line: "line", + WrappedLine: "wrappedLine", + Page: "page", + HalfPage: "halfPage", + Editor: "editor", + Column: "column" + }; + function parse5(args) { + let direction; + switch (args.to) { + case EditorScroll_2.RawDirection.Up: + direction = 1; + break; + case EditorScroll_2.RawDirection.Right: + direction = 2; + break; + case EditorScroll_2.RawDirection.Down: + direction = 3; + break; + case EditorScroll_2.RawDirection.Left: + direction = 4; + break; + default: + return null; + } + let unit; + switch (args.by) { + case EditorScroll_2.RawUnit.Line: + unit = 1; + break; + case EditorScroll_2.RawUnit.WrappedLine: + unit = 2; + break; + case EditorScroll_2.RawUnit.Page: + unit = 3; + break; + case EditorScroll_2.RawUnit.HalfPage: + unit = 4; + break; + case EditorScroll_2.RawUnit.Editor: + unit = 5; + break; + case EditorScroll_2.RawUnit.Column: + unit = 6; + break; + default: + unit = 2; + } + const value = Math.floor(args.value || 1); + const revealCursor = !!args.revealCursor; + return { + direction, + unit, + value, + revealCursor, + select: !!args.select + }; + } + EditorScroll_2.parse = parse5; + })(EditorScroll_ || (EditorScroll_ = {})); + (function(RevealLine_2) { + const isRevealLineArgs = function(arg) { + if (!isObject(arg)) { + return false; + } + const reveaLineArg = arg; + if (!isNumber(reveaLineArg.lineNumber) && !isString(reveaLineArg.lineNumber)) { + return false; + } + if (!isUndefined(reveaLineArg.at) && !isString(reveaLineArg.at)) { + return false; + } + return true; + }; + RevealLine_2.metadata = { + description: "Reveal the given line at the given logical position", + args: [ + { + name: "Reveal line argument object", + description: `Property-value pairs that can be passed through this argument: + * 'lineNumber': A mandatory line number value. + * 'at': Logical position at which line has to be revealed. + \`\`\` + 'top', 'center', 'bottom' + \`\`\` + `, + constraint: isRevealLineArgs, + schema: { + "type": "object", + "required": ["lineNumber"], + "properties": { + "lineNumber": { + "type": ["number", "string"] + }, + "at": { + "type": "string", + "enum": ["top", "center", "bottom"] + } + } + } + } + ] + }; + RevealLine_2.RawAtArgument = { + Top: "top", + Center: "center", + Bottom: "bottom" + }; + })(RevealLine_ || (RevealLine_ = {})); + EditorOrNativeTextInputCommand = class { + constructor(target) { + target.addImplementation(1e4, "code-editor", (accessor, args) => { + const focusedEditor = accessor.get(ICodeEditorService).getFocusedCodeEditor(); + if (focusedEditor && focusedEditor.hasTextFocus()) { + return this._runEditorCommand(accessor, focusedEditor, args); + } + return false; + }); + target.addImplementation(1e3, "generic-dom-input-textarea", (accessor, args) => { + const activeElement = getActiveElement(); + if (activeElement && ["input", "textarea"].indexOf(activeElement.tagName.toLowerCase()) >= 0) { + this.runDOMCommand(activeElement); + return true; + } + return false; + }); + target.addImplementation(0, "generic-dom", (accessor, args) => { + const activeEditor = accessor.get(ICodeEditorService).getActiveCodeEditor(); + if (activeEditor) { + activeEditor.focus(); + return this._runEditorCommand(accessor, activeEditor, args); + } + return false; + }); + } + _runEditorCommand(accessor, editor2, args) { + const result = this.runEditorCommand(accessor, editor2, args); + if (result) { + return result; + } + return true; + } + }; + (function(CoreNavigationCommands2) { + class BaseMoveToCommand extends CoreEditorCommand { + constructor(opts) { + super(opts); + this._inSelectionMode = opts.inSelectionMode; + } + runCoreEditorCommand(viewModel, args) { + if (!args.position) { + return; + } + viewModel.model.pushStackElement(); + const cursorStateChanged = viewModel.setCursorStates(args.source, 3, [ + CursorMoveCommands.moveTo(viewModel, viewModel.getPrimaryCursorState(), this._inSelectionMode, args.position, args.viewPosition) + ]); + if (cursorStateChanged && args.revealType !== 2) { + viewModel.revealAllCursors(args.source, true, true); + } + } + } + CoreNavigationCommands2.MoveTo = registerEditorCommand(new BaseMoveToCommand({ + id: "_moveTo", + inSelectionMode: false, + precondition: void 0 + })); + CoreNavigationCommands2.MoveToSelect = registerEditorCommand(new BaseMoveToCommand({ + id: "_moveToSelect", + inSelectionMode: true, + precondition: void 0 + })); + class ColumnSelectCommand extends CoreEditorCommand { + runCoreEditorCommand(viewModel, args) { + viewModel.model.pushStackElement(); + const result = this._getColumnSelectResult(viewModel, viewModel.getPrimaryCursorState(), viewModel.getCursorColumnSelectData(), args); + if (result === null) { + return; + } + viewModel.setCursorStates(args.source, 3, result.viewStates.map((viewState) => CursorState.fromViewState(viewState))); + viewModel.setCursorColumnSelectData({ + isReal: true, + fromViewLineNumber: result.fromLineNumber, + fromViewVisualColumn: result.fromVisualColumn, + toViewLineNumber: result.toLineNumber, + toViewVisualColumn: result.toVisualColumn + }); + if (result.reversed) { + viewModel.revealTopMostCursor(args.source); + } else { + viewModel.revealBottomMostCursor(args.source); + } + } + } + CoreNavigationCommands2.ColumnSelect = registerEditorCommand(new class extends ColumnSelectCommand { + constructor() { + super({ + id: "columnSelect", + precondition: void 0 + }); + } + _getColumnSelectResult(viewModel, primary, prevColumnSelectData, args) { + if (typeof args.position === "undefined" || typeof args.viewPosition === "undefined" || typeof args.mouseColumn === "undefined") { + return null; + } + const validatedPosition = viewModel.model.validatePosition(args.position); + const validatedViewPosition = viewModel.coordinatesConverter.validateViewPosition(new Position(args.viewPosition.lineNumber, args.viewPosition.column), validatedPosition); + const fromViewLineNumber = args.doColumnSelect ? prevColumnSelectData.fromViewLineNumber : validatedViewPosition.lineNumber; + const fromViewVisualColumn = args.doColumnSelect ? prevColumnSelectData.fromViewVisualColumn : args.mouseColumn - 1; + return ColumnSelection.columnSelect(viewModel.cursorConfig, viewModel, fromViewLineNumber, fromViewVisualColumn, validatedViewPosition.lineNumber, args.mouseColumn - 1); + } + }()); + CoreNavigationCommands2.CursorColumnSelectLeft = registerEditorCommand(new class extends ColumnSelectCommand { + constructor() { + super({ + id: "cursorColumnSelectLeft", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 2048 | 1024 | 512 | 15, + linux: { primary: 0 } + } + }); + } + _getColumnSelectResult(viewModel, primary, prevColumnSelectData, args) { + return ColumnSelection.columnSelectLeft(viewModel.cursorConfig, viewModel, prevColumnSelectData); + } + }()); + CoreNavigationCommands2.CursorColumnSelectRight = registerEditorCommand(new class extends ColumnSelectCommand { + constructor() { + super({ + id: "cursorColumnSelectRight", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 2048 | 1024 | 512 | 17, + linux: { primary: 0 } + } + }); + } + _getColumnSelectResult(viewModel, primary, prevColumnSelectData, args) { + return ColumnSelection.columnSelectRight(viewModel.cursorConfig, viewModel, prevColumnSelectData); + } + }()); + class ColumnSelectUpCommand extends ColumnSelectCommand { + constructor(opts) { + super(opts); + this._isPaged = opts.isPaged; + } + _getColumnSelectResult(viewModel, primary, prevColumnSelectData, args) { + return ColumnSelection.columnSelectUp(viewModel.cursorConfig, viewModel, prevColumnSelectData, this._isPaged); + } + } + CoreNavigationCommands2.CursorColumnSelectUp = registerEditorCommand(new ColumnSelectUpCommand({ + isPaged: false, + id: "cursorColumnSelectUp", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 2048 | 1024 | 512 | 16, + linux: { primary: 0 } + } + })); + CoreNavigationCommands2.CursorColumnSelectPageUp = registerEditorCommand(new ColumnSelectUpCommand({ + isPaged: true, + id: "cursorColumnSelectPageUp", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 2048 | 1024 | 512 | 11, + linux: { primary: 0 } + } + })); + class ColumnSelectDownCommand extends ColumnSelectCommand { + constructor(opts) { + super(opts); + this._isPaged = opts.isPaged; + } + _getColumnSelectResult(viewModel, primary, prevColumnSelectData, args) { + return ColumnSelection.columnSelectDown(viewModel.cursorConfig, viewModel, prevColumnSelectData, this._isPaged); + } + } + CoreNavigationCommands2.CursorColumnSelectDown = registerEditorCommand(new ColumnSelectDownCommand({ + isPaged: false, + id: "cursorColumnSelectDown", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 2048 | 1024 | 512 | 18, + linux: { primary: 0 } + } + })); + CoreNavigationCommands2.CursorColumnSelectPageDown = registerEditorCommand(new ColumnSelectDownCommand({ + isPaged: true, + id: "cursorColumnSelectPageDown", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 2048 | 1024 | 512 | 12, + linux: { primary: 0 } + } + })); + class CursorMoveImpl extends CoreEditorCommand { + constructor() { + super({ + id: "cursorMove", + precondition: void 0, + metadata: CursorMove.metadata + }); + } + runCoreEditorCommand(viewModel, args) { + const parsed = CursorMove.parse(args); + if (!parsed) { + return; + } + this._runCursorMove(viewModel, args.source, parsed); + } + _runCursorMove(viewModel, source, args) { + viewModel.model.pushStackElement(); + viewModel.setCursorStates(source, 3, CursorMoveImpl._move(viewModel, viewModel.getCursorStates(), args)); + viewModel.revealAllCursors(source, true); + } + static _move(viewModel, cursors, args) { + const inSelectionMode = args.select; + const value = args.value; + switch (args.direction) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + return CursorMoveCommands.simpleMove(viewModel, cursors, args.direction, inSelectionMode, value, args.unit); + case 11: + case 13: + case 12: + case 14: + return CursorMoveCommands.viewportMove(viewModel, cursors, args.direction, inSelectionMode, value); + default: + return null; + } + } + } + CoreNavigationCommands2.CursorMoveImpl = CursorMoveImpl; + CoreNavigationCommands2.CursorMove = registerEditorCommand(new CursorMoveImpl()); + class CursorMoveBasedCommand extends CoreEditorCommand { + constructor(opts) { + super(opts); + this._staticArgs = opts.args; + } + runCoreEditorCommand(viewModel, dynamicArgs) { + let args = this._staticArgs; + if (this._staticArgs.value === -1) { + args = { + direction: this._staticArgs.direction, + unit: this._staticArgs.unit, + select: this._staticArgs.select, + value: dynamicArgs.pageSize || viewModel.cursorConfig.pageSize + }; + } + viewModel.model.pushStackElement(); + viewModel.setCursorStates(dynamicArgs.source, 3, CursorMoveCommands.simpleMove(viewModel, viewModel.getCursorStates(), args.direction, args.select, args.value, args.unit)); + viewModel.revealAllCursors(dynamicArgs.source, true); + } + } + CoreNavigationCommands2.CursorLeft = registerEditorCommand(new CursorMoveBasedCommand({ + args: { + direction: 0, + unit: 0, + select: false, + value: 1 + }, + id: "cursorLeft", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 15, + mac: { primary: 15, secondary: [ + 256 | 32 + /* KeyCode.KeyB */ + ] } + } + })); + CoreNavigationCommands2.CursorLeftSelect = registerEditorCommand(new CursorMoveBasedCommand({ + args: { + direction: 0, + unit: 0, + select: true, + value: 1 + }, + id: "cursorLeftSelect", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 1024 | 15 + /* KeyCode.LeftArrow */ + } + })); + CoreNavigationCommands2.CursorRight = registerEditorCommand(new CursorMoveBasedCommand({ + args: { + direction: 1, + unit: 0, + select: false, + value: 1 + }, + id: "cursorRight", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 17, + mac: { primary: 17, secondary: [ + 256 | 36 + /* KeyCode.KeyF */ + ] } + } + })); + CoreNavigationCommands2.CursorRightSelect = registerEditorCommand(new CursorMoveBasedCommand({ + args: { + direction: 1, + unit: 0, + select: true, + value: 1 + }, + id: "cursorRightSelect", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 1024 | 17 + /* KeyCode.RightArrow */ + } + })); + CoreNavigationCommands2.CursorUp = registerEditorCommand(new CursorMoveBasedCommand({ + args: { + direction: 2, + unit: 2, + select: false, + value: 1 + }, + id: "cursorUp", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 16, + mac: { primary: 16, secondary: [ + 256 | 46 + /* KeyCode.KeyP */ + ] } + } + })); + CoreNavigationCommands2.CursorUpSelect = registerEditorCommand(new CursorMoveBasedCommand({ + args: { + direction: 2, + unit: 2, + select: true, + value: 1 + }, + id: "cursorUpSelect", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 1024 | 16, + secondary: [ + 2048 | 1024 | 16 + /* KeyCode.UpArrow */ + ], + mac: { + primary: 1024 | 16 + /* KeyCode.UpArrow */ + }, + linux: { + primary: 1024 | 16 + /* KeyCode.UpArrow */ + } + } + })); + CoreNavigationCommands2.CursorPageUp = registerEditorCommand(new CursorMoveBasedCommand({ + args: { + direction: 2, + unit: 2, + select: false, + value: -1 + /* Constants.PAGE_SIZE_MARKER */ + }, + id: "cursorPageUp", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 11 + /* KeyCode.PageUp */ + } + })); + CoreNavigationCommands2.CursorPageUpSelect = registerEditorCommand(new CursorMoveBasedCommand({ + args: { + direction: 2, + unit: 2, + select: true, + value: -1 + /* Constants.PAGE_SIZE_MARKER */ + }, + id: "cursorPageUpSelect", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 1024 | 11 + /* KeyCode.PageUp */ + } + })); + CoreNavigationCommands2.CursorDown = registerEditorCommand(new CursorMoveBasedCommand({ + args: { + direction: 3, + unit: 2, + select: false, + value: 1 + }, + id: "cursorDown", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 18, + mac: { primary: 18, secondary: [ + 256 | 44 + /* KeyCode.KeyN */ + ] } + } + })); + CoreNavigationCommands2.CursorDownSelect = registerEditorCommand(new CursorMoveBasedCommand({ + args: { + direction: 3, + unit: 2, + select: true, + value: 1 + }, + id: "cursorDownSelect", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 1024 | 18, + secondary: [ + 2048 | 1024 | 18 + /* KeyCode.DownArrow */ + ], + mac: { + primary: 1024 | 18 + /* KeyCode.DownArrow */ + }, + linux: { + primary: 1024 | 18 + /* KeyCode.DownArrow */ + } + } + })); + CoreNavigationCommands2.CursorPageDown = registerEditorCommand(new CursorMoveBasedCommand({ + args: { + direction: 3, + unit: 2, + select: false, + value: -1 + /* Constants.PAGE_SIZE_MARKER */ + }, + id: "cursorPageDown", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 12 + /* KeyCode.PageDown */ + } + })); + CoreNavigationCommands2.CursorPageDownSelect = registerEditorCommand(new CursorMoveBasedCommand({ + args: { + direction: 3, + unit: 2, + select: true, + value: -1 + /* Constants.PAGE_SIZE_MARKER */ + }, + id: "cursorPageDownSelect", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 1024 | 12 + /* KeyCode.PageDown */ + } + })); + CoreNavigationCommands2.CreateCursor = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "createCursor", + precondition: void 0 + }); + } + runCoreEditorCommand(viewModel, args) { + if (!args.position) { + return; + } + let newState; + if (args.wholeLine) { + newState = CursorMoveCommands.line(viewModel, viewModel.getPrimaryCursorState(), false, args.position, args.viewPosition); + } else { + newState = CursorMoveCommands.moveTo(viewModel, viewModel.getPrimaryCursorState(), false, args.position, args.viewPosition); + } + const states = viewModel.getCursorStates(); + if (states.length > 1) { + const newModelPosition = newState.modelState ? newState.modelState.position : null; + const newViewPosition = newState.viewState ? newState.viewState.position : null; + for (let i = 0, len = states.length; i < len; i++) { + const state = states[i]; + if (newModelPosition && !state.modelState.selection.containsPosition(newModelPosition)) { + continue; + } + if (newViewPosition && !state.viewState.selection.containsPosition(newViewPosition)) { + continue; + } + states.splice(i, 1); + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, states); + return; + } + } + states.push(newState); + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, states); + } + }()); + CoreNavigationCommands2.LastCursorMoveToSelect = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "_lastCursorMoveToSelect", + precondition: void 0 + }); + } + runCoreEditorCommand(viewModel, args) { + if (!args.position) { + return; + } + const lastAddedCursorIndex = viewModel.getLastAddedCursorIndex(); + const states = viewModel.getCursorStates(); + const newStates = states.slice(0); + newStates[lastAddedCursorIndex] = CursorMoveCommands.moveTo(viewModel, states[lastAddedCursorIndex], true, args.position, args.viewPosition); + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, newStates); + } + }()); + class HomeCommand extends CoreEditorCommand { + constructor(opts) { + super(opts); + this._inSelectionMode = opts.inSelectionMode; + } + runCoreEditorCommand(viewModel, args) { + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, CursorMoveCommands.moveToBeginningOfLine(viewModel, viewModel.getCursorStates(), this._inSelectionMode)); + viewModel.revealAllCursors(args.source, true); + } + } + CoreNavigationCommands2.CursorHome = registerEditorCommand(new HomeCommand({ + inSelectionMode: false, + id: "cursorHome", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 14, + mac: { primary: 14, secondary: [ + 2048 | 15 + /* KeyCode.LeftArrow */ + ] } + } + })); + CoreNavigationCommands2.CursorHomeSelect = registerEditorCommand(new HomeCommand({ + inSelectionMode: true, + id: "cursorHomeSelect", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 1024 | 14, + mac: { primary: 1024 | 14, secondary: [ + 2048 | 1024 | 15 + /* KeyCode.LeftArrow */ + ] } + } + })); + class LineStartCommand extends CoreEditorCommand { + constructor(opts) { + super(opts); + this._inSelectionMode = opts.inSelectionMode; + } + runCoreEditorCommand(viewModel, args) { + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, this._exec(viewModel.getCursorStates())); + viewModel.revealAllCursors(args.source, true); + } + _exec(cursors) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + const lineNumber = cursor.modelState.position.lineNumber; + result[i] = CursorState.fromModelState(cursor.modelState.move(this._inSelectionMode, lineNumber, 1, 0)); + } + return result; + } + } + CoreNavigationCommands2.CursorLineStart = registerEditorCommand(new LineStartCommand({ + inSelectionMode: false, + id: "cursorLineStart", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 0, + mac: { + primary: 256 | 31 + /* KeyCode.KeyA */ + } + } + })); + CoreNavigationCommands2.CursorLineStartSelect = registerEditorCommand(new LineStartCommand({ + inSelectionMode: true, + id: "cursorLineStartSelect", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 0, + mac: { + primary: 256 | 1024 | 31 + /* KeyCode.KeyA */ + } + } + })); + class EndCommand extends CoreEditorCommand { + constructor(opts) { + super(opts); + this._inSelectionMode = opts.inSelectionMode; + } + runCoreEditorCommand(viewModel, args) { + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, CursorMoveCommands.moveToEndOfLine(viewModel, viewModel.getCursorStates(), this._inSelectionMode, args.sticky || false)); + viewModel.revealAllCursors(args.source, true); + } + } + CoreNavigationCommands2.CursorEnd = registerEditorCommand(new EndCommand({ + inSelectionMode: false, + id: "cursorEnd", + precondition: void 0, + kbOpts: { + args: { sticky: false }, + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 13, + mac: { primary: 13, secondary: [ + 2048 | 17 + /* KeyCode.RightArrow */ + ] } + }, + metadata: { + description: `Go to End`, + args: [{ + name: "args", + schema: { + type: "object", + properties: { + "sticky": { + description: localize("stickydesc", "Stick to the end even when going to longer lines"), + type: "boolean", + default: false + } + } + } + }] + } + })); + CoreNavigationCommands2.CursorEndSelect = registerEditorCommand(new EndCommand({ + inSelectionMode: true, + id: "cursorEndSelect", + precondition: void 0, + kbOpts: { + args: { sticky: false }, + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 1024 | 13, + mac: { primary: 1024 | 13, secondary: [ + 2048 | 1024 | 17 + /* KeyCode.RightArrow */ + ] } + }, + metadata: { + description: `Select to End`, + args: [{ + name: "args", + schema: { + type: "object", + properties: { + "sticky": { + description: localize("stickydesc", "Stick to the end even when going to longer lines"), + type: "boolean", + default: false + } + } + } + }] + } + })); + class LineEndCommand extends CoreEditorCommand { + constructor(opts) { + super(opts); + this._inSelectionMode = opts.inSelectionMode; + } + runCoreEditorCommand(viewModel, args) { + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, this._exec(viewModel, viewModel.getCursorStates())); + viewModel.revealAllCursors(args.source, true); + } + _exec(viewModel, cursors) { + const result = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + const lineNumber = cursor.modelState.position.lineNumber; + const maxColumn = viewModel.model.getLineMaxColumn(lineNumber); + result[i] = CursorState.fromModelState(cursor.modelState.move(this._inSelectionMode, lineNumber, maxColumn, 0)); + } + return result; + } + } + CoreNavigationCommands2.CursorLineEnd = registerEditorCommand(new LineEndCommand({ + inSelectionMode: false, + id: "cursorLineEnd", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 0, + mac: { + primary: 256 | 35 + /* KeyCode.KeyE */ + } + } + })); + CoreNavigationCommands2.CursorLineEndSelect = registerEditorCommand(new LineEndCommand({ + inSelectionMode: true, + id: "cursorLineEndSelect", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 0, + mac: { + primary: 256 | 1024 | 35 + /* KeyCode.KeyE */ + } + } + })); + class TopCommand extends CoreEditorCommand { + constructor(opts) { + super(opts); + this._inSelectionMode = opts.inSelectionMode; + } + runCoreEditorCommand(viewModel, args) { + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, CursorMoveCommands.moveToBeginningOfBuffer(viewModel, viewModel.getCursorStates(), this._inSelectionMode)); + viewModel.revealAllCursors(args.source, true); + } + } + CoreNavigationCommands2.CursorTop = registerEditorCommand(new TopCommand({ + inSelectionMode: false, + id: "cursorTop", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 2048 | 14, + mac: { + primary: 2048 | 16 + /* KeyCode.UpArrow */ + } + } + })); + CoreNavigationCommands2.CursorTopSelect = registerEditorCommand(new TopCommand({ + inSelectionMode: true, + id: "cursorTopSelect", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 2048 | 1024 | 14, + mac: { + primary: 2048 | 1024 | 16 + /* KeyCode.UpArrow */ + } + } + })); + class BottomCommand extends CoreEditorCommand { + constructor(opts) { + super(opts); + this._inSelectionMode = opts.inSelectionMode; + } + runCoreEditorCommand(viewModel, args) { + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, CursorMoveCommands.moveToEndOfBuffer(viewModel, viewModel.getCursorStates(), this._inSelectionMode)); + viewModel.revealAllCursors(args.source, true); + } + } + CoreNavigationCommands2.CursorBottom = registerEditorCommand(new BottomCommand({ + inSelectionMode: false, + id: "cursorBottom", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 2048 | 13, + mac: { + primary: 2048 | 18 + /* KeyCode.DownArrow */ + } + } + })); + CoreNavigationCommands2.CursorBottomSelect = registerEditorCommand(new BottomCommand({ + inSelectionMode: true, + id: "cursorBottomSelect", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 2048 | 1024 | 13, + mac: { + primary: 2048 | 1024 | 18 + /* KeyCode.DownArrow */ + } + } + })); + class EditorScrollImpl extends CoreEditorCommand { + constructor() { + super({ + id: "editorScroll", + precondition: void 0, + metadata: EditorScroll_.metadata + }); + } + determineScrollMethod(args) { + const horizontalUnits = [ + 6 + /* EditorScroll_.Unit.Column */ + ]; + const verticalUnits = [ + 1, + 2, + 3, + 4, + 5, + 6 + /* EditorScroll_.Unit.Column */ + ]; + const horizontalDirections = [ + 4, + 2 + /* EditorScroll_.Direction.Right */ + ]; + const verticalDirections = [ + 1, + 3 + /* EditorScroll_.Direction.Down */ + ]; + if (horizontalUnits.includes(args.unit) && horizontalDirections.includes(args.direction)) { + return this._runHorizontalEditorScroll.bind(this); + } + if (verticalUnits.includes(args.unit) && verticalDirections.includes(args.direction)) { + return this._runVerticalEditorScroll.bind(this); + } + return null; + } + runCoreEditorCommand(viewModel, args) { + const parsed = EditorScroll_.parse(args); + if (!parsed) { + return; + } + const runEditorScroll = this.determineScrollMethod(parsed); + if (!runEditorScroll) { + return; + } + runEditorScroll(viewModel, args.source, parsed); + } + _runVerticalEditorScroll(viewModel, source, args) { + const desiredScrollTop = this._computeDesiredScrollTop(viewModel, args); + if (args.revealCursor) { + const desiredVisibleViewRange = viewModel.getCompletelyVisibleViewRangeAtScrollTop(desiredScrollTop); + viewModel.setCursorStates(source, 3, [ + CursorMoveCommands.findPositionInViewportIfOutside(viewModel, viewModel.getPrimaryCursorState(), desiredVisibleViewRange, args.select) + ]); + } + viewModel.viewLayout.setScrollPosition( + { scrollTop: desiredScrollTop }, + 0 + /* ScrollType.Smooth */ + ); + } + _computeDesiredScrollTop(viewModel, args) { + if (args.unit === 1) { + const futureViewport = viewModel.viewLayout.getFutureViewport(); + const visibleViewRange = viewModel.getCompletelyVisibleViewRangeAtScrollTop(futureViewport.top); + const visibleModelRange = viewModel.coordinatesConverter.convertViewRangeToModelRange(visibleViewRange); + let desiredTopModelLineNumber; + if (args.direction === 1) { + desiredTopModelLineNumber = Math.max(1, visibleModelRange.startLineNumber - args.value); + } else { + desiredTopModelLineNumber = Math.min(viewModel.model.getLineCount(), visibleModelRange.startLineNumber + args.value); + } + const viewPosition = viewModel.coordinatesConverter.convertModelPositionToViewPosition(new Position(desiredTopModelLineNumber, 1)); + return viewModel.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber); + } + if (args.unit === 5) { + let desiredTopModelLineNumber = 0; + if (args.direction === 3) { + desiredTopModelLineNumber = viewModel.model.getLineCount() - viewModel.cursorConfig.pageSize; + } + return viewModel.viewLayout.getVerticalOffsetForLineNumber(desiredTopModelLineNumber); + } + let noOfLines; + if (args.unit === 3) { + noOfLines = viewModel.cursorConfig.pageSize * args.value; + } else if (args.unit === 4) { + noOfLines = Math.round(viewModel.cursorConfig.pageSize / 2) * args.value; + } else { + noOfLines = args.value; + } + const deltaLines = (args.direction === 1 ? -1 : 1) * noOfLines; + return viewModel.viewLayout.getCurrentScrollTop() + deltaLines * viewModel.cursorConfig.lineHeight; + } + _runHorizontalEditorScroll(viewModel, source, args) { + const desiredScrollLeft = this._computeDesiredScrollLeft(viewModel, args); + viewModel.viewLayout.setScrollPosition( + { scrollLeft: desiredScrollLeft }, + 0 + /* ScrollType.Smooth */ + ); + } + _computeDesiredScrollLeft(viewModel, args) { + const deltaColumns = (args.direction === 4 ? -1 : 1) * args.value; + return viewModel.viewLayout.getCurrentScrollLeft() + deltaColumns * viewModel.cursorConfig.typicalHalfwidthCharacterWidth; + } + } + CoreNavigationCommands2.EditorScrollImpl = EditorScrollImpl; + CoreNavigationCommands2.EditorScroll = registerEditorCommand(new EditorScrollImpl()); + CoreNavigationCommands2.ScrollLineUp = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "scrollLineUp", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 2048 | 16, + mac: { + primary: 256 | 11 + /* KeyCode.PageUp */ + } + } + }); + } + runCoreEditorCommand(viewModel, args) { + CoreNavigationCommands2.EditorScroll.runCoreEditorCommand(viewModel, { + to: EditorScroll_.RawDirection.Up, + by: EditorScroll_.RawUnit.WrappedLine, + value: 1, + revealCursor: false, + select: false, + source: args.source + }); + } + }()); + CoreNavigationCommands2.ScrollPageUp = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "scrollPageUp", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 2048 | 11, + win: { + primary: 512 | 11 + /* KeyCode.PageUp */ + }, + linux: { + primary: 512 | 11 + /* KeyCode.PageUp */ + } + } + }); + } + runCoreEditorCommand(viewModel, args) { + CoreNavigationCommands2.EditorScroll.runCoreEditorCommand(viewModel, { + to: EditorScroll_.RawDirection.Up, + by: EditorScroll_.RawUnit.Page, + value: 1, + revealCursor: false, + select: false, + source: args.source + }); + } + }()); + CoreNavigationCommands2.ScrollEditorTop = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "scrollEditorTop", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus + } + }); + } + runCoreEditorCommand(viewModel, args) { + CoreNavigationCommands2.EditorScroll.runCoreEditorCommand(viewModel, { + to: EditorScroll_.RawDirection.Up, + by: EditorScroll_.RawUnit.Editor, + value: 1, + revealCursor: false, + select: false, + source: args.source + }); + } + }()); + CoreNavigationCommands2.ScrollLineDown = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "scrollLineDown", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 2048 | 18, + mac: { + primary: 256 | 12 + /* KeyCode.PageDown */ + } + } + }); + } + runCoreEditorCommand(viewModel, args) { + CoreNavigationCommands2.EditorScroll.runCoreEditorCommand(viewModel, { + to: EditorScroll_.RawDirection.Down, + by: EditorScroll_.RawUnit.WrappedLine, + value: 1, + revealCursor: false, + select: false, + source: args.source + }); + } + }()); + CoreNavigationCommands2.ScrollPageDown = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "scrollPageDown", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 2048 | 12, + win: { + primary: 512 | 12 + /* KeyCode.PageDown */ + }, + linux: { + primary: 512 | 12 + /* KeyCode.PageDown */ + } + } + }); + } + runCoreEditorCommand(viewModel, args) { + CoreNavigationCommands2.EditorScroll.runCoreEditorCommand(viewModel, { + to: EditorScroll_.RawDirection.Down, + by: EditorScroll_.RawUnit.Page, + value: 1, + revealCursor: false, + select: false, + source: args.source + }); + } + }()); + CoreNavigationCommands2.ScrollEditorBottom = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "scrollEditorBottom", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus + } + }); + } + runCoreEditorCommand(viewModel, args) { + CoreNavigationCommands2.EditorScroll.runCoreEditorCommand(viewModel, { + to: EditorScroll_.RawDirection.Down, + by: EditorScroll_.RawUnit.Editor, + value: 1, + revealCursor: false, + select: false, + source: args.source + }); + } + }()); + CoreNavigationCommands2.ScrollLeft = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "scrollLeft", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus + } + }); + } + runCoreEditorCommand(viewModel, args) { + CoreNavigationCommands2.EditorScroll.runCoreEditorCommand(viewModel, { + to: EditorScroll_.RawDirection.Left, + by: EditorScroll_.RawUnit.Column, + value: 2, + revealCursor: false, + select: false, + source: args.source + }); + } + }()); + CoreNavigationCommands2.ScrollRight = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "scrollRight", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus + } + }); + } + runCoreEditorCommand(viewModel, args) { + CoreNavigationCommands2.EditorScroll.runCoreEditorCommand(viewModel, { + to: EditorScroll_.RawDirection.Right, + by: EditorScroll_.RawUnit.Column, + value: 2, + revealCursor: false, + select: false, + source: args.source + }); + } + }()); + class WordCommand extends CoreEditorCommand { + constructor(opts) { + super(opts); + this._inSelectionMode = opts.inSelectionMode; + } + runCoreEditorCommand(viewModel, args) { + if (!args.position) { + return; + } + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, [ + CursorMoveCommands.word(viewModel, viewModel.getPrimaryCursorState(), this._inSelectionMode, args.position) + ]); + if (args.revealType !== 2) { + viewModel.revealAllCursors(args.source, true, true); + } + } + } + CoreNavigationCommands2.WordSelect = registerEditorCommand(new WordCommand({ + inSelectionMode: false, + id: "_wordSelect", + precondition: void 0 + })); + CoreNavigationCommands2.WordSelectDrag = registerEditorCommand(new WordCommand({ + inSelectionMode: true, + id: "_wordSelectDrag", + precondition: void 0 + })); + CoreNavigationCommands2.LastCursorWordSelect = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "lastCursorWordSelect", + precondition: void 0 + }); + } + runCoreEditorCommand(viewModel, args) { + if (!args.position) { + return; + } + const lastAddedCursorIndex = viewModel.getLastAddedCursorIndex(); + const states = viewModel.getCursorStates(); + const newStates = states.slice(0); + const lastAddedState = states[lastAddedCursorIndex]; + newStates[lastAddedCursorIndex] = CursorMoveCommands.word(viewModel, lastAddedState, lastAddedState.modelState.hasSelection(), args.position); + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, newStates); + } + }()); + class LineCommand extends CoreEditorCommand { + constructor(opts) { + super(opts); + this._inSelectionMode = opts.inSelectionMode; + } + runCoreEditorCommand(viewModel, args) { + if (!args.position) { + return; + } + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, [ + CursorMoveCommands.line(viewModel, viewModel.getPrimaryCursorState(), this._inSelectionMode, args.position, args.viewPosition) + ]); + if (args.revealType !== 2) { + viewModel.revealAllCursors(args.source, false, true); + } + } + } + CoreNavigationCommands2.LineSelect = registerEditorCommand(new LineCommand({ + inSelectionMode: false, + id: "_lineSelect", + precondition: void 0 + })); + CoreNavigationCommands2.LineSelectDrag = registerEditorCommand(new LineCommand({ + inSelectionMode: true, + id: "_lineSelectDrag", + precondition: void 0 + })); + class LastCursorLineCommand extends CoreEditorCommand { + constructor(opts) { + super(opts); + this._inSelectionMode = opts.inSelectionMode; + } + runCoreEditorCommand(viewModel, args) { + if (!args.position) { + return; + } + const lastAddedCursorIndex = viewModel.getLastAddedCursorIndex(); + const states = viewModel.getCursorStates(); + const newStates = states.slice(0); + newStates[lastAddedCursorIndex] = CursorMoveCommands.line(viewModel, states[lastAddedCursorIndex], this._inSelectionMode, args.position, args.viewPosition); + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, newStates); + } + } + CoreNavigationCommands2.LastCursorLineSelect = registerEditorCommand(new LastCursorLineCommand({ + inSelectionMode: false, + id: "lastCursorLineSelect", + precondition: void 0 + })); + CoreNavigationCommands2.LastCursorLineSelectDrag = registerEditorCommand(new LastCursorLineCommand({ + inSelectionMode: true, + id: "lastCursorLineSelectDrag", + precondition: void 0 + })); + CoreNavigationCommands2.CancelSelection = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "cancelSelection", + precondition: EditorContextKeys.hasNonEmptySelection, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 9, + secondary: [ + 1024 | 9 + /* KeyCode.Escape */ + ] + } + }); + } + runCoreEditorCommand(viewModel, args) { + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, [ + CursorMoveCommands.cancelSelection(viewModel, viewModel.getPrimaryCursorState()) + ]); + viewModel.revealAllCursors(args.source, true); + } + }()); + CoreNavigationCommands2.RemoveSecondaryCursors = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "removeSecondaryCursors", + precondition: EditorContextKeys.hasMultipleSelections, + kbOpts: { + weight: CORE_WEIGHT + 1, + kbExpr: EditorContextKeys.textInputFocus, + primary: 9, + secondary: [ + 1024 | 9 + /* KeyCode.Escape */ + ] + } + }); + } + runCoreEditorCommand(viewModel, args) { + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, [ + viewModel.getPrimaryCursorState() + ]); + viewModel.revealAllCursors(args.source, true); + status(localize("removedCursor", "Removed secondary cursors")); + } + }()); + CoreNavigationCommands2.RevealLine = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "revealLine", + precondition: void 0, + metadata: RevealLine_.metadata + }); + } + runCoreEditorCommand(viewModel, args) { + const revealLineArg = args; + const lineNumberArg = revealLineArg.lineNumber || 0; + let lineNumber = typeof lineNumberArg === "number" ? lineNumberArg + 1 : parseInt(lineNumberArg) + 1; + if (lineNumber < 1) { + lineNumber = 1; + } + const lineCount = viewModel.model.getLineCount(); + if (lineNumber > lineCount) { + lineNumber = lineCount; + } + const range2 = new Range(lineNumber, 1, lineNumber, viewModel.model.getLineMaxColumn(lineNumber)); + let revealAt = 0; + if (revealLineArg.at) { + switch (revealLineArg.at) { + case RevealLine_.RawAtArgument.Top: + revealAt = 3; + break; + case RevealLine_.RawAtArgument.Center: + revealAt = 1; + break; + case RevealLine_.RawAtArgument.Bottom: + revealAt = 4; + break; + default: + break; + } + } + const viewRange = viewModel.coordinatesConverter.convertModelRangeToViewRange(range2); + viewModel.revealRange( + args.source, + false, + viewRange, + revealAt, + 0 + /* ScrollType.Smooth */ + ); + } + }()); + CoreNavigationCommands2.SelectAll = new class extends EditorOrNativeTextInputCommand { + constructor() { + super(SelectAllCommand); + } + runDOMCommand(activeElement) { + if (isFirefox2) { + activeElement.focus(); + activeElement.select(); + } + activeElement.ownerDocument.execCommand("selectAll"); + } + runEditorCommand(accessor, editor2, args) { + const viewModel = editor2._getViewModel(); + if (!viewModel) { + return; + } + this.runCoreEditorCommand(viewModel, args); + } + runCoreEditorCommand(viewModel, args) { + viewModel.model.pushStackElement(); + viewModel.setCursorStates("keyboard", 3, [ + CursorMoveCommands.selectAll(viewModel, viewModel.getPrimaryCursorState()) + ]); + } + }(); + CoreNavigationCommands2.SetSelection = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: "setSelection", + precondition: void 0 + }); + } + runCoreEditorCommand(viewModel, args) { + if (!args.selection) { + return; + } + viewModel.model.pushStackElement(); + viewModel.setCursorStates(args.source, 3, [ + CursorState.fromModelSelection(args.selection) + ]); + } + }()); + })(CoreNavigationCommands || (CoreNavigationCommands = {})); + columnSelectionCondition = ContextKeyExpr.and(EditorContextKeys.textInputFocus, EditorContextKeys.columnSelection); + registerColumnSelection( + CoreNavigationCommands.CursorColumnSelectLeft.id, + 1024 | 15 + /* KeyCode.LeftArrow */ + ); + registerColumnSelection( + CoreNavigationCommands.CursorColumnSelectRight.id, + 1024 | 17 + /* KeyCode.RightArrow */ + ); + registerColumnSelection( + CoreNavigationCommands.CursorColumnSelectUp.id, + 1024 | 16 + /* KeyCode.UpArrow */ + ); + registerColumnSelection( + CoreNavigationCommands.CursorColumnSelectPageUp.id, + 1024 | 11 + /* KeyCode.PageUp */ + ); + registerColumnSelection( + CoreNavigationCommands.CursorColumnSelectDown.id, + 1024 | 18 + /* KeyCode.DownArrow */ + ); + registerColumnSelection( + CoreNavigationCommands.CursorColumnSelectPageDown.id, + 1024 | 12 + /* KeyCode.PageDown */ + ); + (function(CoreEditingCommands2) { + class CoreEditingCommand extends EditorCommand { + runEditorCommand(accessor, editor2, args) { + const viewModel = editor2._getViewModel(); + if (!viewModel) { + return; + } + this.runCoreEditingCommand(editor2, viewModel, args || {}); + } + } + CoreEditingCommands2.CoreEditingCommand = CoreEditingCommand; + CoreEditingCommands2.LineBreakInsert = registerEditorCommand(new class extends CoreEditingCommand { + constructor() { + super({ + id: "lineBreakInsert", + precondition: EditorContextKeys.writable, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 0, + mac: { + primary: 256 | 45 + /* KeyCode.KeyO */ + } + } + }); + } + runCoreEditingCommand(editor2, viewModel, args) { + editor2.pushUndoStop(); + editor2.executeCommands(this.id, TypeOperations.lineBreakInsert(viewModel.cursorConfig, viewModel.model, viewModel.getCursorStates().map((s) => s.modelState.selection))); + } + }()); + CoreEditingCommands2.Outdent = registerEditorCommand(new class extends CoreEditingCommand { + constructor() { + super({ + id: "outdent", + precondition: EditorContextKeys.writable, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: ContextKeyExpr.and(EditorContextKeys.editorTextFocus, EditorContextKeys.tabDoesNotMoveFocus), + primary: 1024 | 2 + /* KeyCode.Tab */ + } + }); + } + runCoreEditingCommand(editor2, viewModel, args) { + editor2.pushUndoStop(); + editor2.executeCommands(this.id, TypeOperations.outdent(viewModel.cursorConfig, viewModel.model, viewModel.getCursorStates().map((s) => s.modelState.selection))); + editor2.pushUndoStop(); + } + }()); + CoreEditingCommands2.Tab = registerEditorCommand(new class extends CoreEditingCommand { + constructor() { + super({ + id: "tab", + precondition: EditorContextKeys.writable, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: ContextKeyExpr.and(EditorContextKeys.editorTextFocus, EditorContextKeys.tabDoesNotMoveFocus), + primary: 2 + /* KeyCode.Tab */ + } + }); + } + runCoreEditingCommand(editor2, viewModel, args) { + editor2.pushUndoStop(); + editor2.executeCommands(this.id, TypeOperations.tab(viewModel.cursorConfig, viewModel.model, viewModel.getCursorStates().map((s) => s.modelState.selection))); + editor2.pushUndoStop(); + } + }()); + CoreEditingCommands2.DeleteLeft = registerEditorCommand(new class extends CoreEditingCommand { + constructor() { + super({ + id: "deleteLeft", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 1, + secondary: [ + 1024 | 1 + /* KeyCode.Backspace */ + ], + mac: { primary: 1, secondary: [ + 1024 | 1, + 256 | 38, + 256 | 1 + /* KeyCode.Backspace */ + ] } + } + }); + } + runCoreEditingCommand(editor2, viewModel, args) { + const [shouldPushStackElementBefore, commands] = DeleteOperations.deleteLeft(viewModel.getPrevEditOperationType(), viewModel.cursorConfig, viewModel.model, viewModel.getCursorStates().map((s) => s.modelState.selection), viewModel.getCursorAutoClosedCharacters()); + if (shouldPushStackElementBefore) { + editor2.pushUndoStop(); + } + editor2.executeCommands(this.id, commands); + viewModel.setPrevEditOperationType( + 2 + /* EditOperationType.DeletingLeft */ + ); + } + }()); + CoreEditingCommands2.DeleteRight = registerEditorCommand(new class extends CoreEditingCommand { + constructor() { + super({ + id: "deleteRight", + precondition: void 0, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textInputFocus, + primary: 20, + mac: { primary: 20, secondary: [ + 256 | 34, + 256 | 20 + /* KeyCode.Delete */ + ] } + } + }); + } + runCoreEditingCommand(editor2, viewModel, args) { + const [shouldPushStackElementBefore, commands] = DeleteOperations.deleteRight(viewModel.getPrevEditOperationType(), viewModel.cursorConfig, viewModel.model, viewModel.getCursorStates().map((s) => s.modelState.selection)); + if (shouldPushStackElementBefore) { + editor2.pushUndoStop(); + } + editor2.executeCommands(this.id, commands); + viewModel.setPrevEditOperationType( + 3 + /* EditOperationType.DeletingRight */ + ); + } + }()); + CoreEditingCommands2.Undo = new class extends EditorOrNativeTextInputCommand { + constructor() { + super(UndoCommand); + } + runDOMCommand(activeElement) { + activeElement.ownerDocument.execCommand("undo"); + } + runEditorCommand(accessor, editor2, args) { + if (!editor2.hasModel() || editor2.getOption( + 91 + /* EditorOption.readOnly */ + ) === true) { + return; + } + return editor2.getModel().undo(); + } + }(); + CoreEditingCommands2.Redo = new class extends EditorOrNativeTextInputCommand { + constructor() { + super(RedoCommand); + } + runDOMCommand(activeElement) { + activeElement.ownerDocument.execCommand("redo"); + } + runEditorCommand(accessor, editor2, args) { + if (!editor2.hasModel() || editor2.getOption( + 91 + /* EditorOption.readOnly */ + ) === true) { + return; + } + return editor2.getModel().redo(); + } + }(); + })(CoreEditingCommands || (CoreEditingCommands = {})); + EditorHandlerCommand = class extends Command2 { + constructor(id, handlerId, metadata) { + super({ + id, + precondition: void 0, + metadata + }); + this._handlerId = handlerId; + } + runCommand(accessor, args) { + const editor2 = accessor.get(ICodeEditorService).getFocusedCodeEditor(); + if (!editor2) { + return; + } + editor2.trigger("keyboard", this._handlerId, args); + } + }; + registerOverwritableCommand("type", { + description: `Type`, + args: [{ + name: "args", + schema: { + "type": "object", + "required": ["text"], + "properties": { + "text": { + "type": "string" + } + } + } + }] + }); + registerOverwritableCommand( + "replacePreviousChar" + /* Handler.ReplacePreviousChar */ + ); + registerOverwritableCommand( + "compositionType" + /* Handler.CompositionType */ + ); + registerOverwritableCommand( + "compositionStart" + /* Handler.CompositionStart */ + ); + registerOverwritableCommand( + "compositionEnd" + /* Handler.CompositionEnd */ + ); + registerOverwritableCommand( + "paste" + /* Handler.Paste */ + ); + registerOverwritableCommand( + "cut" + /* Handler.Cut */ + ); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/view/viewController.js +var ViewController; +var init_viewController = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/view/viewController.js"() { + init_coreCommands(); + init_position(); + init_platform(); + ViewController = class { + constructor(configuration, viewModel, userInputEvents, commandDelegate) { + this.configuration = configuration; + this.viewModel = viewModel; + this.userInputEvents = userInputEvents; + this.commandDelegate = commandDelegate; + } + paste(text2, pasteOnNewLine, multicursorText, mode) { + this.commandDelegate.paste(text2, pasteOnNewLine, multicursorText, mode); + } + type(text2) { + this.commandDelegate.type(text2); + } + compositionType(text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta) { + this.commandDelegate.compositionType(text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta); + } + compositionStart() { + this.commandDelegate.startComposition(); + } + compositionEnd() { + this.commandDelegate.endComposition(); + } + cut() { + this.commandDelegate.cut(); + } + setSelection(modelSelection) { + CoreNavigationCommands.SetSelection.runCoreEditorCommand(this.viewModel, { + source: "keyboard", + selection: modelSelection + }); + } + _validateViewColumn(viewPosition) { + const minColumn = this.viewModel.getLineMinColumn(viewPosition.lineNumber); + if (viewPosition.column < minColumn) { + return new Position(viewPosition.lineNumber, minColumn); + } + return viewPosition; + } + _hasMulticursorModifier(data) { + switch (this.configuration.options.get( + 78 + /* EditorOption.multiCursorModifier */ + )) { + case "altKey": + return data.altKey; + case "ctrlKey": + return data.ctrlKey; + case "metaKey": + return data.metaKey; + default: + return false; + } + } + _hasNonMulticursorModifier(data) { + switch (this.configuration.options.get( + 78 + /* EditorOption.multiCursorModifier */ + )) { + case "altKey": + return data.ctrlKey || data.metaKey; + case "ctrlKey": + return data.altKey || data.metaKey; + case "metaKey": + return data.ctrlKey || data.altKey; + default: + return false; + } + } + dispatchMouse(data) { + const options2 = this.configuration.options; + const selectionClipboardIsOn = isLinux && options2.get( + 107 + /* EditorOption.selectionClipboard */ + ); + const columnSelection = options2.get( + 22 + /* EditorOption.columnSelection */ + ); + if (data.middleButton && !selectionClipboardIsOn) { + this._columnSelect(data.position, data.mouseColumn, data.inSelectionMode); + } else if (data.startedOnLineNumbers) { + if (this._hasMulticursorModifier(data)) { + if (data.inSelectionMode) { + this._lastCursorLineSelect(data.position, data.revealType); + } else { + this._createCursor(data.position, true); + } + } else { + if (data.inSelectionMode) { + this._lineSelectDrag(data.position, data.revealType); + } else { + this._lineSelect(data.position, data.revealType); + } + } + } else if (data.mouseDownCount >= 4) { + this._selectAll(); + } else if (data.mouseDownCount === 3) { + if (this._hasMulticursorModifier(data)) { + if (data.inSelectionMode) { + this._lastCursorLineSelectDrag(data.position, data.revealType); + } else { + this._lastCursorLineSelect(data.position, data.revealType); + } + } else { + if (data.inSelectionMode) { + this._lineSelectDrag(data.position, data.revealType); + } else { + this._lineSelect(data.position, data.revealType); + } + } + } else if (data.mouseDownCount === 2) { + if (!data.onInjectedText) { + if (this._hasMulticursorModifier(data)) { + this._lastCursorWordSelect(data.position, data.revealType); + } else { + if (data.inSelectionMode) { + this._wordSelectDrag(data.position, data.revealType); + } else { + this._wordSelect(data.position, data.revealType); + } + } + } + } else { + if (this._hasMulticursorModifier(data)) { + if (!this._hasNonMulticursorModifier(data)) { + if (data.shiftKey) { + this._columnSelect(data.position, data.mouseColumn, true); + } else { + if (data.inSelectionMode) { + this._lastCursorMoveToSelect(data.position, data.revealType); + } else { + this._createCursor(data.position, false); + } + } + } + } else { + if (data.inSelectionMode) { + if (data.altKey) { + this._columnSelect(data.position, data.mouseColumn, true); + } else { + if (columnSelection) { + this._columnSelect(data.position, data.mouseColumn, true); + } else { + this._moveToSelect(data.position, data.revealType); + } + } + } else { + this.moveTo(data.position, data.revealType); + } + } + } + } + _usualArgs(viewPosition, revealType) { + viewPosition = this._validateViewColumn(viewPosition); + return { + source: "mouse", + position: this._convertViewToModelPosition(viewPosition), + viewPosition, + revealType + }; + } + moveTo(viewPosition, revealType) { + CoreNavigationCommands.MoveTo.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType)); + } + _moveToSelect(viewPosition, revealType) { + CoreNavigationCommands.MoveToSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType)); + } + _columnSelect(viewPosition, mouseColumn, doColumnSelect) { + viewPosition = this._validateViewColumn(viewPosition); + CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(this.viewModel, { + source: "mouse", + position: this._convertViewToModelPosition(viewPosition), + viewPosition, + mouseColumn, + doColumnSelect + }); + } + _createCursor(viewPosition, wholeLine) { + viewPosition = this._validateViewColumn(viewPosition); + CoreNavigationCommands.CreateCursor.runCoreEditorCommand(this.viewModel, { + source: "mouse", + position: this._convertViewToModelPosition(viewPosition), + viewPosition, + wholeLine + }); + } + _lastCursorMoveToSelect(viewPosition, revealType) { + CoreNavigationCommands.LastCursorMoveToSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType)); + } + _wordSelect(viewPosition, revealType) { + CoreNavigationCommands.WordSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType)); + } + _wordSelectDrag(viewPosition, revealType) { + CoreNavigationCommands.WordSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType)); + } + _lastCursorWordSelect(viewPosition, revealType) { + CoreNavigationCommands.LastCursorWordSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType)); + } + _lineSelect(viewPosition, revealType) { + CoreNavigationCommands.LineSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType)); + } + _lineSelectDrag(viewPosition, revealType) { + CoreNavigationCommands.LineSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType)); + } + _lastCursorLineSelect(viewPosition, revealType) { + CoreNavigationCommands.LastCursorLineSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType)); + } + _lastCursorLineSelectDrag(viewPosition, revealType) { + CoreNavigationCommands.LastCursorLineSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType)); + } + _selectAll() { + CoreNavigationCommands.SelectAll.runCoreEditorCommand(this.viewModel, { source: "mouse" }); + } + // ---------------------- + _convertViewToModelPosition(viewPosition) { + return this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(viewPosition); + } + emitKeyDown(e) { + this.userInputEvents.emitKeyDown(e); + } + emitKeyUp(e) { + this.userInputEvents.emitKeyUp(e); + } + emitContextMenu(e) { + this.userInputEvents.emitContextMenu(e); + } + emitMouseMove(e) { + this.userInputEvents.emitMouseMove(e); + } + emitMouseLeave(e) { + this.userInputEvents.emitMouseLeave(e); + } + emitMouseUp(e) { + this.userInputEvents.emitMouseUp(e); + } + emitMouseDown(e) { + this.userInputEvents.emitMouseDown(e); + } + emitMouseDrag(e) { + this.userInputEvents.emitMouseDrag(e); + } + emitMouseDrop(e) { + this.userInputEvents.emitMouseDrop(e); + } + emitMouseDropCanceled() { + this.userInputEvents.emitMouseDropCanceled(); + } + emitMouseWheel(e) { + this.userInputEvents.emitMouseWheel(e); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/view/viewLayer.js +var RenderedLinesCollection, VisibleLinesCollection, ViewLayerRenderer; +var init_viewLayer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/view/viewLayer.js"() { + init_fastDomNode(); + init_trustedTypes(); + init_errors(); + init_stringBuilder(); + RenderedLinesCollection = class { + constructor(createLine) { + this._createLine = createLine; + this._set(1, []); + } + flush() { + this._set(1, []); + } + _set(rendLineNumberStart, lines) { + this._lines = lines; + this._rendLineNumberStart = rendLineNumberStart; + } + _get() { + return { + rendLineNumberStart: this._rendLineNumberStart, + lines: this._lines + }; + } + /** + * @returns Inclusive line number that is inside this collection + */ + getStartLineNumber() { + return this._rendLineNumberStart; + } + /** + * @returns Inclusive line number that is inside this collection + */ + getEndLineNumber() { + return this._rendLineNumberStart + this._lines.length - 1; + } + getCount() { + return this._lines.length; + } + getLine(lineNumber) { + const lineIndex = lineNumber - this._rendLineNumberStart; + if (lineIndex < 0 || lineIndex >= this._lines.length) { + throw new BugIndicatingError("Illegal value for lineNumber"); + } + return this._lines[lineIndex]; + } + /** + * @returns Lines that were removed from this collection + */ + onLinesDeleted(deleteFromLineNumber, deleteToLineNumber) { + if (this.getCount() === 0) { + return null; + } + const startLineNumber = this.getStartLineNumber(); + const endLineNumber = this.getEndLineNumber(); + if (deleteToLineNumber < startLineNumber) { + const deleteCnt = deleteToLineNumber - deleteFromLineNumber + 1; + this._rendLineNumberStart -= deleteCnt; + return null; + } + if (deleteFromLineNumber > endLineNumber) { + return null; + } + let deleteStartIndex = 0; + let deleteCount = 0; + for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { + const lineIndex = lineNumber - this._rendLineNumberStart; + if (deleteFromLineNumber <= lineNumber && lineNumber <= deleteToLineNumber) { + if (deleteCount === 0) { + deleteStartIndex = lineIndex; + deleteCount = 1; + } else { + deleteCount++; + } + } + } + if (deleteFromLineNumber < startLineNumber) { + let deleteAboveCount = 0; + if (deleteToLineNumber < startLineNumber) { + deleteAboveCount = deleteToLineNumber - deleteFromLineNumber + 1; + } else { + deleteAboveCount = startLineNumber - deleteFromLineNumber; + } + this._rendLineNumberStart -= deleteAboveCount; + } + const deleted = this._lines.splice(deleteStartIndex, deleteCount); + return deleted; + } + onLinesChanged(changeFromLineNumber, changeCount) { + const changeToLineNumber = changeFromLineNumber + changeCount - 1; + if (this.getCount() === 0) { + return false; + } + const startLineNumber = this.getStartLineNumber(); + const endLineNumber = this.getEndLineNumber(); + let someoneNotified = false; + for (let changedLineNumber = changeFromLineNumber; changedLineNumber <= changeToLineNumber; changedLineNumber++) { + if (changedLineNumber >= startLineNumber && changedLineNumber <= endLineNumber) { + this._lines[changedLineNumber - this._rendLineNumberStart].onContentChanged(); + someoneNotified = true; + } + } + return someoneNotified; + } + onLinesInserted(insertFromLineNumber, insertToLineNumber) { + if (this.getCount() === 0) { + return null; + } + const insertCnt = insertToLineNumber - insertFromLineNumber + 1; + const startLineNumber = this.getStartLineNumber(); + const endLineNumber = this.getEndLineNumber(); + if (insertFromLineNumber <= startLineNumber) { + this._rendLineNumberStart += insertCnt; + return null; + } + if (insertFromLineNumber > endLineNumber) { + return null; + } + if (insertCnt + insertFromLineNumber > endLineNumber) { + const deleted = this._lines.splice(insertFromLineNumber - this._rendLineNumberStart, endLineNumber - insertFromLineNumber + 1); + return deleted; + } + const newLines = []; + for (let i = 0; i < insertCnt; i++) { + newLines[i] = this._createLine(); + } + const insertIndex = insertFromLineNumber - this._rendLineNumberStart; + const beforeLines = this._lines.slice(0, insertIndex); + const afterLines = this._lines.slice(insertIndex, this._lines.length - insertCnt); + const deletedLines = this._lines.slice(this._lines.length - insertCnt, this._lines.length); + this._lines = beforeLines.concat(newLines).concat(afterLines); + return deletedLines; + } + onTokensChanged(ranges) { + if (this.getCount() === 0) { + return false; + } + const startLineNumber = this.getStartLineNumber(); + const endLineNumber = this.getEndLineNumber(); + let notifiedSomeone = false; + for (let i = 0, len = ranges.length; i < len; i++) { + const rng = ranges[i]; + if (rng.toLineNumber < startLineNumber || rng.fromLineNumber > endLineNumber) { + continue; + } + const from = Math.max(startLineNumber, rng.fromLineNumber); + const to = Math.min(endLineNumber, rng.toLineNumber); + for (let lineNumber = from; lineNumber <= to; lineNumber++) { + const lineIndex = lineNumber - this._rendLineNumberStart; + this._lines[lineIndex].onTokensChanged(); + notifiedSomeone = true; + } + } + return notifiedSomeone; + } + }; + VisibleLinesCollection = class { + constructor(host) { + this._host = host; + this.domNode = this._createDomNode(); + this._linesCollection = new RenderedLinesCollection(() => this._host.createVisibleLine()); + } + _createDomNode() { + const domNode = createFastDomNode(document.createElement("div")); + domNode.setClassName("view-layer"); + domNode.setPosition("absolute"); + domNode.domNode.setAttribute("role", "presentation"); + domNode.domNode.setAttribute("aria-hidden", "true"); + return domNode; + } + // ---- begin view event handlers + onConfigurationChanged(e) { + if (e.hasChanged( + 145 + /* EditorOption.layoutInfo */ + )) { + return true; + } + return false; + } + onFlushed(e) { + this._linesCollection.flush(); + return true; + } + onLinesChanged(e) { + return this._linesCollection.onLinesChanged(e.fromLineNumber, e.count); + } + onLinesDeleted(e) { + const deleted = this._linesCollection.onLinesDeleted(e.fromLineNumber, e.toLineNumber); + if (deleted) { + for (let i = 0, len = deleted.length; i < len; i++) { + const lineDomNode = deleted[i].getDomNode(); + if (lineDomNode) { + this.domNode.domNode.removeChild(lineDomNode); + } + } + } + return true; + } + onLinesInserted(e) { + const deleted = this._linesCollection.onLinesInserted(e.fromLineNumber, e.toLineNumber); + if (deleted) { + for (let i = 0, len = deleted.length; i < len; i++) { + const lineDomNode = deleted[i].getDomNode(); + if (lineDomNode) { + this.domNode.domNode.removeChild(lineDomNode); + } + } + } + return true; + } + onScrollChanged(e) { + return e.scrollTopChanged; + } + onTokensChanged(e) { + return this._linesCollection.onTokensChanged(e.ranges); + } + onZonesChanged(e) { + return true; + } + // ---- end view event handlers + getStartLineNumber() { + return this._linesCollection.getStartLineNumber(); + } + getEndLineNumber() { + return this._linesCollection.getEndLineNumber(); + } + getVisibleLine(lineNumber) { + return this._linesCollection.getLine(lineNumber); + } + renderLines(viewportData) { + const inp = this._linesCollection._get(); + const renderer = new ViewLayerRenderer(this.domNode.domNode, this._host, viewportData); + const ctx = { + rendLineNumberStart: inp.rendLineNumberStart, + lines: inp.lines, + linesLength: inp.lines.length + }; + const resCtx = renderer.render(ctx, viewportData.startLineNumber, viewportData.endLineNumber, viewportData.relativeVerticalOffset); + this._linesCollection._set(resCtx.rendLineNumberStart, resCtx.lines); + } + }; + ViewLayerRenderer = class _ViewLayerRenderer { + constructor(domNode, host, viewportData) { + this.domNode = domNode; + this.host = host; + this.viewportData = viewportData; + } + render(inContext, startLineNumber, stopLineNumber, deltaTop) { + const ctx = { + rendLineNumberStart: inContext.rendLineNumberStart, + lines: inContext.lines.slice(0), + linesLength: inContext.linesLength + }; + if (ctx.rendLineNumberStart + ctx.linesLength - 1 < startLineNumber || stopLineNumber < ctx.rendLineNumberStart) { + ctx.rendLineNumberStart = startLineNumber; + ctx.linesLength = stopLineNumber - startLineNumber + 1; + ctx.lines = []; + for (let x = startLineNumber; x <= stopLineNumber; x++) { + ctx.lines[x - startLineNumber] = this.host.createVisibleLine(); + } + this._finishRendering(ctx, true, deltaTop); + return ctx; + } + this._renderUntouchedLines(ctx, Math.max(startLineNumber - ctx.rendLineNumberStart, 0), Math.min(stopLineNumber - ctx.rendLineNumberStart, ctx.linesLength - 1), deltaTop, startLineNumber); + if (ctx.rendLineNumberStart > startLineNumber) { + const fromLineNumber = startLineNumber; + const toLineNumber = Math.min(stopLineNumber, ctx.rendLineNumberStart - 1); + if (fromLineNumber <= toLineNumber) { + this._insertLinesBefore(ctx, fromLineNumber, toLineNumber, deltaTop, startLineNumber); + ctx.linesLength += toLineNumber - fromLineNumber + 1; + } + } else if (ctx.rendLineNumberStart < startLineNumber) { + const removeCnt = Math.min(ctx.linesLength, startLineNumber - ctx.rendLineNumberStart); + if (removeCnt > 0) { + this._removeLinesBefore(ctx, removeCnt); + ctx.linesLength -= removeCnt; + } + } + ctx.rendLineNumberStart = startLineNumber; + if (ctx.rendLineNumberStart + ctx.linesLength - 1 < stopLineNumber) { + const fromLineNumber = ctx.rendLineNumberStart + ctx.linesLength; + const toLineNumber = stopLineNumber; + if (fromLineNumber <= toLineNumber) { + this._insertLinesAfter(ctx, fromLineNumber, toLineNumber, deltaTop, startLineNumber); + ctx.linesLength += toLineNumber - fromLineNumber + 1; + } + } else if (ctx.rendLineNumberStart + ctx.linesLength - 1 > stopLineNumber) { + const fromLineNumber = Math.max(0, stopLineNumber - ctx.rendLineNumberStart + 1); + const toLineNumber = ctx.linesLength - 1; + const removeCnt = toLineNumber - fromLineNumber + 1; + if (removeCnt > 0) { + this._removeLinesAfter(ctx, removeCnt); + ctx.linesLength -= removeCnt; + } + } + this._finishRendering(ctx, false, deltaTop); + return ctx; + } + _renderUntouchedLines(ctx, startIndex, endIndex, deltaTop, deltaLN) { + const rendLineNumberStart = ctx.rendLineNumberStart; + const lines = ctx.lines; + for (let i = startIndex; i <= endIndex; i++) { + const lineNumber = rendLineNumberStart + i; + lines[i].layoutLine(lineNumber, deltaTop[lineNumber - deltaLN], this.viewportData.lineHeight); + } + } + _insertLinesBefore(ctx, fromLineNumber, toLineNumber, deltaTop, deltaLN) { + const newLines = []; + let newLinesLen = 0; + for (let lineNumber = fromLineNumber; lineNumber <= toLineNumber; lineNumber++) { + newLines[newLinesLen++] = this.host.createVisibleLine(); + } + ctx.lines = newLines.concat(ctx.lines); + } + _removeLinesBefore(ctx, removeCount) { + for (let i = 0; i < removeCount; i++) { + const lineDomNode = ctx.lines[i].getDomNode(); + if (lineDomNode) { + this.domNode.removeChild(lineDomNode); + } + } + ctx.lines.splice(0, removeCount); + } + _insertLinesAfter(ctx, fromLineNumber, toLineNumber, deltaTop, deltaLN) { + const newLines = []; + let newLinesLen = 0; + for (let lineNumber = fromLineNumber; lineNumber <= toLineNumber; lineNumber++) { + newLines[newLinesLen++] = this.host.createVisibleLine(); + } + ctx.lines = ctx.lines.concat(newLines); + } + _removeLinesAfter(ctx, removeCount) { + const removeIndex = ctx.linesLength - removeCount; + for (let i = 0; i < removeCount; i++) { + const lineDomNode = ctx.lines[removeIndex + i].getDomNode(); + if (lineDomNode) { + this.domNode.removeChild(lineDomNode); + } + } + ctx.lines.splice(removeIndex, removeCount); + } + _finishRenderingNewLines(ctx, domNodeIsEmpty, newLinesHTML, wasNew) { + if (_ViewLayerRenderer._ttPolicy) { + newLinesHTML = _ViewLayerRenderer._ttPolicy.createHTML(newLinesHTML); + } + const lastChild = this.domNode.lastChild; + if (domNodeIsEmpty || !lastChild) { + this.domNode.innerHTML = newLinesHTML; + } else { + lastChild.insertAdjacentHTML("afterend", newLinesHTML); + } + let currChild = this.domNode.lastChild; + for (let i = ctx.linesLength - 1; i >= 0; i--) { + const line = ctx.lines[i]; + if (wasNew[i]) { + line.setDomNode(currChild); + currChild = currChild.previousSibling; + } + } + } + _finishRenderingInvalidLines(ctx, invalidLinesHTML, wasInvalid) { + const hugeDomNode = document.createElement("div"); + if (_ViewLayerRenderer._ttPolicy) { + invalidLinesHTML = _ViewLayerRenderer._ttPolicy.createHTML(invalidLinesHTML); + } + hugeDomNode.innerHTML = invalidLinesHTML; + for (let i = 0; i < ctx.linesLength; i++) { + const line = ctx.lines[i]; + if (wasInvalid[i]) { + const source = hugeDomNode.firstChild; + const lineDomNode = line.getDomNode(); + lineDomNode.parentNode.replaceChild(source, lineDomNode); + line.setDomNode(source); + } + } + } + _finishRendering(ctx, domNodeIsEmpty, deltaTop) { + const sb = _ViewLayerRenderer._sb; + const linesLength = ctx.linesLength; + const lines = ctx.lines; + const rendLineNumberStart = ctx.rendLineNumberStart; + const wasNew = []; + { + sb.reset(); + let hadNewLine = false; + for (let i = 0; i < linesLength; i++) { + const line = lines[i]; + wasNew[i] = false; + const lineDomNode = line.getDomNode(); + if (lineDomNode) { + continue; + } + const renderResult = line.renderLine(i + rendLineNumberStart, deltaTop[i], this.viewportData.lineHeight, this.viewportData, sb); + if (!renderResult) { + continue; + } + wasNew[i] = true; + hadNewLine = true; + } + if (hadNewLine) { + this._finishRenderingNewLines(ctx, domNodeIsEmpty, sb.build(), wasNew); + } + } + { + sb.reset(); + let hadInvalidLine = false; + const wasInvalid = []; + for (let i = 0; i < linesLength; i++) { + const line = lines[i]; + wasInvalid[i] = false; + if (wasNew[i]) { + continue; + } + const renderResult = line.renderLine(i + rendLineNumberStart, deltaTop[i], this.viewportData.lineHeight, this.viewportData, sb); + if (!renderResult) { + continue; + } + wasInvalid[i] = true; + hadInvalidLine = true; + } + if (hadInvalidLine) { + this._finishRenderingInvalidLines(ctx, sb.build(), wasInvalid); + } + } + } + }; + ViewLayerRenderer._ttPolicy = createTrustedTypesPolicy("editorViewLayer", { createHTML: (value) => value }); + ViewLayerRenderer._sb = new StringBuilder(1e5); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/view/viewOverlays.js +var ViewOverlays, ViewOverlayLine, ContentViewOverlays, MarginViewOverlays; +var init_viewOverlays = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/view/viewOverlays.js"() { + init_fastDomNode(); + init_domFontInfo(); + init_viewLayer(); + init_viewPart(); + ViewOverlays = class extends ViewPart { + constructor(context) { + super(context); + this._visibleLines = new VisibleLinesCollection(this); + this.domNode = this._visibleLines.domNode; + const options2 = this._context.configuration.options; + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + applyFontInfo(this.domNode, fontInfo); + this._dynamicOverlays = []; + this._isFocused = false; + this.domNode.setClassName("view-overlays"); + } + shouldRender() { + if (super.shouldRender()) { + return true; + } + for (let i = 0, len = this._dynamicOverlays.length; i < len; i++) { + const dynamicOverlay = this._dynamicOverlays[i]; + if (dynamicOverlay.shouldRender()) { + return true; + } + } + return false; + } + dispose() { + super.dispose(); + for (let i = 0, len = this._dynamicOverlays.length; i < len; i++) { + const dynamicOverlay = this._dynamicOverlays[i]; + dynamicOverlay.dispose(); + } + this._dynamicOverlays = []; + } + getDomNode() { + return this.domNode; + } + // ---- begin IVisibleLinesHost + createVisibleLine() { + return new ViewOverlayLine(this._dynamicOverlays); + } + // ---- end IVisibleLinesHost + addDynamicOverlay(overlay) { + this._dynamicOverlays.push(overlay); + } + // ----- event handlers + onConfigurationChanged(e) { + this._visibleLines.onConfigurationChanged(e); + const options2 = this._context.configuration.options; + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + applyFontInfo(this.domNode, fontInfo); + return true; + } + onFlushed(e) { + return this._visibleLines.onFlushed(e); + } + onFocusChanged(e) { + this._isFocused = e.isFocused; + return true; + } + onLinesChanged(e) { + return this._visibleLines.onLinesChanged(e); + } + onLinesDeleted(e) { + return this._visibleLines.onLinesDeleted(e); + } + onLinesInserted(e) { + return this._visibleLines.onLinesInserted(e); + } + onScrollChanged(e) { + return this._visibleLines.onScrollChanged(e) || true; + } + onTokensChanged(e) { + return this._visibleLines.onTokensChanged(e); + } + onZonesChanged(e) { + return this._visibleLines.onZonesChanged(e); + } + // ----- end event handlers + prepareRender(ctx) { + const toRender = this._dynamicOverlays.filter((overlay) => overlay.shouldRender()); + for (let i = 0, len = toRender.length; i < len; i++) { + const dynamicOverlay = toRender[i]; + dynamicOverlay.prepareRender(ctx); + dynamicOverlay.onDidRender(); + } + } + render(ctx) { + this._viewOverlaysRender(ctx); + this.domNode.toggleClassName("focused", this._isFocused); + } + _viewOverlaysRender(ctx) { + this._visibleLines.renderLines(ctx.viewportData); + } + }; + ViewOverlayLine = class { + constructor(dynamicOverlays) { + this._dynamicOverlays = dynamicOverlays; + this._domNode = null; + this._renderedContent = null; + } + getDomNode() { + if (!this._domNode) { + return null; + } + return this._domNode.domNode; + } + setDomNode(domNode) { + this._domNode = createFastDomNode(domNode); + } + onContentChanged() { + } + onTokensChanged() { + } + renderLine(lineNumber, deltaTop, lineHeight, viewportData, sb) { + let result = ""; + for (let i = 0, len = this._dynamicOverlays.length; i < len; i++) { + const dynamicOverlay = this._dynamicOverlays[i]; + result += dynamicOverlay.render(viewportData.startLineNumber, lineNumber); + } + if (this._renderedContent === result) { + return false; + } + this._renderedContent = result; + sb.appendString('
'); + sb.appendString(result); + sb.appendString("
"); + return true; + } + layoutLine(lineNumber, deltaTop, lineHeight) { + if (this._domNode) { + this._domNode.setTop(deltaTop); + this._domNode.setHeight(lineHeight); + } + } + }; + ContentViewOverlays = class extends ViewOverlays { + constructor(context) { + super(context); + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._contentWidth = layoutInfo.contentWidth; + this.domNode.setHeight(0); + } + // --- begin event handlers + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._contentWidth = layoutInfo.contentWidth; + return super.onConfigurationChanged(e) || true; + } + onScrollChanged(e) { + return super.onScrollChanged(e) || e.scrollWidthChanged; + } + // --- end event handlers + _viewOverlaysRender(ctx) { + super._viewOverlaysRender(ctx); + this.domNode.setWidth(Math.max(ctx.scrollWidth, this._contentWidth)); + } + }; + MarginViewOverlays = class extends ViewOverlays { + constructor(context) { + super(context); + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._contentLeft = layoutInfo.contentLeft; + this.domNode.setClassName("margin-view-overlays"); + this.domNode.setWidth(1); + applyFontInfo(this.domNode, options2.get( + 50 + /* EditorOption.fontInfo */ + )); + } + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + applyFontInfo(this.domNode, options2.get( + 50 + /* EditorOption.fontInfo */ + )); + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._contentLeft = layoutInfo.contentLeft; + return super.onConfigurationChanged(e) || true; + } + onScrollChanged(e) { + return super.onScrollChanged(e) || e.scrollHeightChanged; + } + _viewOverlaysRender(ctx) { + super._viewOverlaysRender(ctx); + const height = Math.min(ctx.scrollHeight, 1e6); + this.domNode.setHeight(height); + this.domNode.setWidth(this._contentLeft); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/view/viewUserInputEvents.js +var ViewUserInputEvents; +var init_viewUserInputEvents = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/view/viewUserInputEvents.js"() { + init_position(); + ViewUserInputEvents = class _ViewUserInputEvents { + constructor(coordinatesConverter) { + this.onKeyDown = null; + this.onKeyUp = null; + this.onContextMenu = null; + this.onMouseMove = null; + this.onMouseLeave = null; + this.onMouseDown = null; + this.onMouseUp = null; + this.onMouseDrag = null; + this.onMouseDrop = null; + this.onMouseDropCanceled = null; + this.onMouseWheel = null; + this._coordinatesConverter = coordinatesConverter; + } + emitKeyDown(e) { + var _a10; + (_a10 = this.onKeyDown) === null || _a10 === void 0 ? void 0 : _a10.call(this, e); + } + emitKeyUp(e) { + var _a10; + (_a10 = this.onKeyUp) === null || _a10 === void 0 ? void 0 : _a10.call(this, e); + } + emitContextMenu(e) { + var _a10; + (_a10 = this.onContextMenu) === null || _a10 === void 0 ? void 0 : _a10.call(this, this._convertViewToModelMouseEvent(e)); + } + emitMouseMove(e) { + var _a10; + (_a10 = this.onMouseMove) === null || _a10 === void 0 ? void 0 : _a10.call(this, this._convertViewToModelMouseEvent(e)); + } + emitMouseLeave(e) { + var _a10; + (_a10 = this.onMouseLeave) === null || _a10 === void 0 ? void 0 : _a10.call(this, this._convertViewToModelMouseEvent(e)); + } + emitMouseDown(e) { + var _a10; + (_a10 = this.onMouseDown) === null || _a10 === void 0 ? void 0 : _a10.call(this, this._convertViewToModelMouseEvent(e)); + } + emitMouseUp(e) { + var _a10; + (_a10 = this.onMouseUp) === null || _a10 === void 0 ? void 0 : _a10.call(this, this._convertViewToModelMouseEvent(e)); + } + emitMouseDrag(e) { + var _a10; + (_a10 = this.onMouseDrag) === null || _a10 === void 0 ? void 0 : _a10.call(this, this._convertViewToModelMouseEvent(e)); + } + emitMouseDrop(e) { + var _a10; + (_a10 = this.onMouseDrop) === null || _a10 === void 0 ? void 0 : _a10.call(this, this._convertViewToModelMouseEvent(e)); + } + emitMouseDropCanceled() { + var _a10; + (_a10 = this.onMouseDropCanceled) === null || _a10 === void 0 ? void 0 : _a10.call(this); + } + emitMouseWheel(e) { + var _a10; + (_a10 = this.onMouseWheel) === null || _a10 === void 0 ? void 0 : _a10.call(this, e); + } + _convertViewToModelMouseEvent(e) { + if (e.target) { + return { + event: e.event, + target: this._convertViewToModelMouseTarget(e.target) + }; + } + return e; + } + _convertViewToModelMouseTarget(target) { + return _ViewUserInputEvents.convertViewToModelMouseTarget(target, this._coordinatesConverter); + } + static convertViewToModelMouseTarget(target, coordinatesConverter) { + const result = __spreadValues({}, target); + if (result.position) { + result.position = coordinatesConverter.convertViewPositionToModelPosition(result.position); + } + if (result.range) { + result.range = coordinatesConverter.convertViewRangeToModelRange(result.range); + } + if (result.type === 5 || result.type === 8) { + result.detail = this.convertViewToModelViewZoneData(result.detail, coordinatesConverter); + } + return result; + } + static convertViewToModelViewZoneData(data, coordinatesConverter) { + return { + viewZoneId: data.viewZoneId, + positionBefore: data.positionBefore ? coordinatesConverter.convertViewPositionToModelPosition(data.positionBefore) : data.positionBefore, + positionAfter: data.positionAfter ? coordinatesConverter.convertViewPositionToModelPosition(data.positionAfter) : data.positionAfter, + position: coordinatesConverter.convertViewPositionToModelPosition(data.position), + afterLineNumber: coordinatesConverter.convertViewPositionToModelPosition(new Position(data.afterLineNumber, 1)).lineNumber + }; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/blockDecorations/blockDecorations.css +var init_blockDecorations = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/blockDecorations/blockDecorations.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/blockDecorations/blockDecorations.js +var BlockDecorations; +var init_blockDecorations2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/blockDecorations/blockDecorations.js"() { + init_fastDomNode(); + init_blockDecorations(); + init_viewPart(); + BlockDecorations = class extends ViewPart { + constructor(context) { + super(context); + this.blocks = []; + this.contentWidth = -1; + this.contentLeft = 0; + this.domNode = createFastDomNode(document.createElement("div")); + this.domNode.setAttribute("role", "presentation"); + this.domNode.setAttribute("aria-hidden", "true"); + this.domNode.setClassName("blockDecorations-container"); + this.update(); + } + update() { + let didChange = false; + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + const newContentWidth = layoutInfo.contentWidth - layoutInfo.verticalScrollbarWidth; + if (this.contentWidth !== newContentWidth) { + this.contentWidth = newContentWidth; + didChange = true; + } + const newContentLeft = layoutInfo.contentLeft; + if (this.contentLeft !== newContentLeft) { + this.contentLeft = newContentLeft; + didChange = true; + } + return didChange; + } + dispose() { + super.dispose(); + } + // --- begin event handlers + onConfigurationChanged(e) { + return this.update(); + } + onScrollChanged(e) { + return e.scrollTopChanged || e.scrollLeftChanged; + } + onDecorationsChanged(e) { + return true; + } + onZonesChanged(e) { + return true; + } + // --- end event handlers + prepareRender(ctx) { + } + render(ctx) { + var _a10; + let count = 0; + const decorations = ctx.getDecorationsInViewport(); + for (const decoration3 of decorations) { + if (!decoration3.options.blockClassName) { + continue; + } + let block = this.blocks[count]; + if (!block) { + block = this.blocks[count] = createFastDomNode(document.createElement("div")); + this.domNode.appendChild(block); + } + let top; + let bottom; + if (decoration3.options.blockIsAfterEnd) { + top = ctx.getVerticalOffsetAfterLineNumber(decoration3.range.endLineNumber, false); + bottom = ctx.getVerticalOffsetAfterLineNumber(decoration3.range.endLineNumber, true); + } else { + top = ctx.getVerticalOffsetForLineNumber(decoration3.range.startLineNumber, true); + bottom = decoration3.range.isEmpty() && !decoration3.options.blockDoesNotCollapse ? ctx.getVerticalOffsetForLineNumber(decoration3.range.startLineNumber, false) : ctx.getVerticalOffsetAfterLineNumber(decoration3.range.endLineNumber, true); + } + const [paddingTop, paddingRight, paddingBottom, paddingLeft] = (_a10 = decoration3.options.blockPadding) !== null && _a10 !== void 0 ? _a10 : [0, 0, 0, 0]; + block.setClassName("blockDecorations-block " + decoration3.options.blockClassName); + block.setLeft(this.contentLeft - paddingLeft); + block.setWidth(this.contentWidth + paddingLeft + paddingRight); + block.setTop(top - ctx.scrollTop - paddingTop); + block.setHeight(bottom - top + paddingTop + paddingBottom); + count++; + } + for (let i = count; i < this.blocks.length; i++) { + this.blocks[i].domNode.remove(); + } + this.blocks.length = count; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/contentWidgets/contentWidgets.js +function safeInvoke(fn, thisArg, ...args) { + try { + return fn.call(thisArg, ...args); + } catch (_a10) { + return null; + } +} +var ViewContentWidgets, Widget2, PositionPair, Coordinate, AnchorCoordinate; +var init_contentWidgets = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/contentWidgets/contentWidgets.js"() { + init_dom(); + init_fastDomNode(); + init_viewPart(); + ViewContentWidgets = class extends ViewPart { + constructor(context, viewDomNode) { + super(context); + this._viewDomNode = viewDomNode; + this._widgets = {}; + this.domNode = createFastDomNode(document.createElement("div")); + PartFingerprints.write( + this.domNode, + 1 + /* PartFingerprint.ContentWidgets */ + ); + this.domNode.setClassName("contentWidgets"); + this.domNode.setPosition("absolute"); + this.domNode.setTop(0); + this.overflowingContentWidgetsDomNode = createFastDomNode(document.createElement("div")); + PartFingerprints.write( + this.overflowingContentWidgetsDomNode, + 2 + /* PartFingerprint.OverflowingContentWidgets */ + ); + this.overflowingContentWidgetsDomNode.setClassName("overflowingContentWidgets"); + } + dispose() { + super.dispose(); + this._widgets = {}; + } + // --- begin event handlers + onConfigurationChanged(e) { + const keys = Object.keys(this._widgets); + for (const widgetId of keys) { + this._widgets[widgetId].onConfigurationChanged(e); + } + return true; + } + onDecorationsChanged(e) { + return true; + } + onFlushed(e) { + return true; + } + onLineMappingChanged(e) { + this._updateAnchorsViewPositions(); + return true; + } + onLinesChanged(e) { + this._updateAnchorsViewPositions(); + return true; + } + onLinesDeleted(e) { + this._updateAnchorsViewPositions(); + return true; + } + onLinesInserted(e) { + this._updateAnchorsViewPositions(); + return true; + } + onScrollChanged(e) { + return true; + } + onZonesChanged(e) { + return true; + } + // ---- end view event handlers + _updateAnchorsViewPositions() { + const keys = Object.keys(this._widgets); + for (const widgetId of keys) { + this._widgets[widgetId].updateAnchorViewPosition(); + } + } + addWidget(_widget) { + const myWidget = new Widget2(this._context, this._viewDomNode, _widget); + this._widgets[myWidget.id] = myWidget; + if (myWidget.allowEditorOverflow) { + this.overflowingContentWidgetsDomNode.appendChild(myWidget.domNode); + } else { + this.domNode.appendChild(myWidget.domNode); + } + this.setShouldRender(); + } + setWidgetPosition(widget, primaryAnchor, secondaryAnchor, preference, affinity) { + const myWidget = this._widgets[widget.getId()]; + myWidget.setPosition(primaryAnchor, secondaryAnchor, preference, affinity); + this.setShouldRender(); + } + removeWidget(widget) { + const widgetId = widget.getId(); + if (this._widgets.hasOwnProperty(widgetId)) { + const myWidget = this._widgets[widgetId]; + delete this._widgets[widgetId]; + const domNode = myWidget.domNode.domNode; + domNode.parentNode.removeChild(domNode); + domNode.removeAttribute("monaco-visible-content-widget"); + this.setShouldRender(); + } + } + shouldSuppressMouseDownOnWidget(widgetId) { + if (this._widgets.hasOwnProperty(widgetId)) { + return this._widgets[widgetId].suppressMouseDown; + } + return false; + } + onBeforeRender(viewportData) { + const keys = Object.keys(this._widgets); + for (const widgetId of keys) { + this._widgets[widgetId].onBeforeRender(viewportData); + } + } + prepareRender(ctx) { + const keys = Object.keys(this._widgets); + for (const widgetId of keys) { + this._widgets[widgetId].prepareRender(ctx); + } + } + render(ctx) { + const keys = Object.keys(this._widgets); + for (const widgetId of keys) { + this._widgets[widgetId].render(ctx); + } + } + }; + Widget2 = class { + constructor(context, viewDomNode, actual) { + this._primaryAnchor = new PositionPair(null, null); + this._secondaryAnchor = new PositionPair(null, null); + this._context = context; + this._viewDomNode = viewDomNode; + this._actual = actual; + this.domNode = createFastDomNode(this._actual.getDomNode()); + this.id = this._actual.getId(); + this.allowEditorOverflow = this._actual.allowEditorOverflow || false; + this.suppressMouseDown = this._actual.suppressMouseDown || false; + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._fixedOverflowWidgets = options2.get( + 42 + /* EditorOption.fixedOverflowWidgets */ + ); + this._contentWidth = layoutInfo.contentWidth; + this._contentLeft = layoutInfo.contentLeft; + this._lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this._affinity = null; + this._preference = []; + this._cachedDomNodeOffsetWidth = -1; + this._cachedDomNodeOffsetHeight = -1; + this._maxWidth = this._getMaxWidth(); + this._isVisible = false; + this._renderData = null; + this.domNode.setPosition(this._fixedOverflowWidgets && this.allowEditorOverflow ? "fixed" : "absolute"); + this.domNode.setDisplay("none"); + this.domNode.setVisibility("hidden"); + this.domNode.setAttribute("widgetId", this.id); + this.domNode.setMaxWidth(this._maxWidth); + } + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + this._lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + if (e.hasChanged( + 145 + /* EditorOption.layoutInfo */ + )) { + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._contentLeft = layoutInfo.contentLeft; + this._contentWidth = layoutInfo.contentWidth; + this._maxWidth = this._getMaxWidth(); + } + } + updateAnchorViewPosition() { + this._setPosition(this._affinity, this._primaryAnchor.modelPosition, this._secondaryAnchor.modelPosition); + } + _setPosition(affinity, primaryAnchor, secondaryAnchor) { + this._affinity = affinity; + this._primaryAnchor = getValidPositionPair(primaryAnchor, this._context.viewModel, this._affinity); + this._secondaryAnchor = getValidPositionPair(secondaryAnchor, this._context.viewModel, this._affinity); + function getValidPositionPair(position, viewModel, affinity2) { + if (!position) { + return new PositionPair(null, null); + } + const validModelPosition = viewModel.model.validatePosition(position); + if (viewModel.coordinatesConverter.modelPositionIsVisible(validModelPosition)) { + const viewPosition = viewModel.coordinatesConverter.convertModelPositionToViewPosition(validModelPosition, affinity2 !== null && affinity2 !== void 0 ? affinity2 : void 0); + return new PositionPair(position, viewPosition); + } + return new PositionPair(position, null); + } + } + _getMaxWidth() { + const elDocument = this.domNode.domNode.ownerDocument; + const elWindow = elDocument.defaultView; + return this.allowEditorOverflow ? (elWindow === null || elWindow === void 0 ? void 0 : elWindow.innerWidth) || elDocument.documentElement.offsetWidth || elDocument.body.offsetWidth : this._contentWidth; + } + setPosition(primaryAnchor, secondaryAnchor, preference, affinity) { + this._setPosition(affinity, primaryAnchor, secondaryAnchor); + this._preference = preference; + if (this._primaryAnchor.viewPosition && this._preference && this._preference.length > 0) { + this.domNode.setDisplay("block"); + } else { + this.domNode.setDisplay("none"); + } + this._cachedDomNodeOffsetWidth = -1; + this._cachedDomNodeOffsetHeight = -1; + } + _layoutBoxInViewport(anchor, width2, height, ctx) { + const aboveLineTop = anchor.top; + const heightAvailableAboveLine = aboveLineTop; + const underLineTop = anchor.top + anchor.height; + const heightAvailableUnderLine = ctx.viewportHeight - underLineTop; + const aboveTop = aboveLineTop - height; + const fitsAbove = heightAvailableAboveLine >= height; + const belowTop = underLineTop; + const fitsBelow = heightAvailableUnderLine >= height; + let left = anchor.left; + if (left + width2 > ctx.scrollLeft + ctx.viewportWidth) { + left = ctx.scrollLeft + ctx.viewportWidth - width2; + } + if (left < ctx.scrollLeft) { + left = ctx.scrollLeft; + } + return { fitsAbove, aboveTop, fitsBelow, belowTop, left }; + } + _layoutHorizontalSegmentInPage(windowSize, domNodePosition, left, width2) { + var _a10; + const LEFT_PADDING = 15; + const RIGHT_PADDING = 15; + const MIN_LIMIT = Math.max(LEFT_PADDING, domNodePosition.left - width2); + const MAX_LIMIT = Math.min(domNodePosition.left + domNodePosition.width + width2, windowSize.width - RIGHT_PADDING); + const elDocument = this._viewDomNode.domNode.ownerDocument; + const elWindow = elDocument.defaultView; + let absoluteLeft = domNodePosition.left + left - ((_a10 = elWindow === null || elWindow === void 0 ? void 0 : elWindow.scrollX) !== null && _a10 !== void 0 ? _a10 : 0); + if (absoluteLeft + width2 > MAX_LIMIT) { + const delta = absoluteLeft - (MAX_LIMIT - width2); + absoluteLeft -= delta; + left -= delta; + } + if (absoluteLeft < MIN_LIMIT) { + const delta = absoluteLeft - MIN_LIMIT; + absoluteLeft -= delta; + left -= delta; + } + return [left, absoluteLeft]; + } + _layoutBoxInPage(anchor, width2, height, ctx) { + var _a10, _b4; + const aboveTop = anchor.top - height; + const belowTop = anchor.top + anchor.height; + const domNodePosition = getDomNodePagePosition(this._viewDomNode.domNode); + const elDocument = this._viewDomNode.domNode.ownerDocument; + const elWindow = elDocument.defaultView; + const absoluteAboveTop = domNodePosition.top + aboveTop - ((_a10 = elWindow === null || elWindow === void 0 ? void 0 : elWindow.scrollY) !== null && _a10 !== void 0 ? _a10 : 0); + const absoluteBelowTop = domNodePosition.top + belowTop - ((_b4 = elWindow === null || elWindow === void 0 ? void 0 : elWindow.scrollY) !== null && _b4 !== void 0 ? _b4 : 0); + const windowSize = getClientArea(elDocument.body); + const [left, absoluteAboveLeft] = this._layoutHorizontalSegmentInPage(windowSize, domNodePosition, anchor.left - ctx.scrollLeft + this._contentLeft, width2); + const TOP_PADDING = 22; + const BOTTOM_PADDING = 22; + const fitsAbove = absoluteAboveTop >= TOP_PADDING; + const fitsBelow = absoluteBelowTop + height <= windowSize.height - BOTTOM_PADDING; + if (this._fixedOverflowWidgets) { + return { + fitsAbove, + aboveTop: Math.max(absoluteAboveTop, TOP_PADDING), + fitsBelow, + belowTop: absoluteBelowTop, + left: absoluteAboveLeft + }; + } + return { fitsAbove, aboveTop, fitsBelow, belowTop, left }; + } + _prepareRenderWidgetAtExactPositionOverflowing(topLeft) { + return new Coordinate(topLeft.top, topLeft.left + this._contentLeft); + } + /** + * Compute the coordinates above and below the primary and secondary anchors. + * The content widget *must* touch the primary anchor. + * The content widget should touch if possible the secondary anchor. + */ + _getAnchorsCoordinates(ctx) { + var _a10, _b4; + const primary = getCoordinates(this._primaryAnchor.viewPosition, this._affinity, this._lineHeight); + const secondaryViewPosition = ((_a10 = this._secondaryAnchor.viewPosition) === null || _a10 === void 0 ? void 0 : _a10.lineNumber) === ((_b4 = this._primaryAnchor.viewPosition) === null || _b4 === void 0 ? void 0 : _b4.lineNumber) ? this._secondaryAnchor.viewPosition : null; + const secondary = getCoordinates(secondaryViewPosition, this._affinity, this._lineHeight); + return { primary, secondary }; + function getCoordinates(position, affinity, lineHeight) { + if (!position) { + return null; + } + const horizontalPosition = ctx.visibleRangeForPosition(position); + if (!horizontalPosition) { + return null; + } + const left = position.column === 1 && affinity === 3 ? 0 : horizontalPosition.left; + const top = ctx.getVerticalOffsetForLineNumber(position.lineNumber) - ctx.scrollTop; + return new AnchorCoordinate(top, left, lineHeight); + } + } + _reduceAnchorCoordinates(primary, secondary, width2) { + if (!secondary) { + return primary; + } + const fontInfo = this._context.configuration.options.get( + 50 + /* EditorOption.fontInfo */ + ); + let left = secondary.left; + if (left < primary.left) { + left = Math.max(left, primary.left - width2 + fontInfo.typicalFullwidthCharacterWidth); + } else { + left = Math.min(left, primary.left + width2 - fontInfo.typicalFullwidthCharacterWidth); + } + return new AnchorCoordinate(primary.top, left, primary.height); + } + _prepareRenderWidget(ctx) { + if (!this._preference || this._preference.length === 0) { + return null; + } + const { primary, secondary } = this._getAnchorsCoordinates(ctx); + if (!primary) { + return { + kind: "offViewport", + preserveFocus: this.domNode.domNode.contains(this.domNode.domNode.ownerDocument.activeElement) + }; + } + if (this._cachedDomNodeOffsetWidth === -1 || this._cachedDomNodeOffsetHeight === -1) { + let preferredDimensions = null; + if (typeof this._actual.beforeRender === "function") { + preferredDimensions = safeInvoke(this._actual.beforeRender, this._actual); + } + if (preferredDimensions) { + this._cachedDomNodeOffsetWidth = preferredDimensions.width; + this._cachedDomNodeOffsetHeight = preferredDimensions.height; + } else { + const domNode = this.domNode.domNode; + const clientRect = domNode.getBoundingClientRect(); + this._cachedDomNodeOffsetWidth = Math.round(clientRect.width); + this._cachedDomNodeOffsetHeight = Math.round(clientRect.height); + } + } + const anchor = this._reduceAnchorCoordinates(primary, secondary, this._cachedDomNodeOffsetWidth); + let placement; + if (this.allowEditorOverflow) { + placement = this._layoutBoxInPage(anchor, this._cachedDomNodeOffsetWidth, this._cachedDomNodeOffsetHeight, ctx); + } else { + placement = this._layoutBoxInViewport(anchor, this._cachedDomNodeOffsetWidth, this._cachedDomNodeOffsetHeight, ctx); + } + for (let pass = 1; pass <= 2; pass++) { + for (const pref of this._preference) { + if (pref === 1) { + if (!placement) { + return null; + } + if (pass === 2 || placement.fitsAbove) { + return { + kind: "inViewport", + coordinate: new Coordinate(placement.aboveTop, placement.left), + position: 1 + /* ContentWidgetPositionPreference.ABOVE */ + }; + } + } else if (pref === 2) { + if (!placement) { + return null; + } + if (pass === 2 || placement.fitsBelow) { + return { + kind: "inViewport", + coordinate: new Coordinate(placement.belowTop, placement.left), + position: 2 + /* ContentWidgetPositionPreference.BELOW */ + }; + } + } else { + if (this.allowEditorOverflow) { + return { + kind: "inViewport", + coordinate: this._prepareRenderWidgetAtExactPositionOverflowing(new Coordinate(anchor.top, anchor.left)), + position: 0 + /* ContentWidgetPositionPreference.EXACT */ + }; + } else { + return { + kind: "inViewport", + coordinate: new Coordinate(anchor.top, anchor.left), + position: 0 + /* ContentWidgetPositionPreference.EXACT */ + }; + } + } + } + } + return null; + } + /** + * On this first pass, we ensure that the content widget (if it is in the viewport) has the max width set correctly. + */ + onBeforeRender(viewportData) { + if (!this._primaryAnchor.viewPosition || !this._preference) { + return; + } + if (this._primaryAnchor.viewPosition.lineNumber < viewportData.startLineNumber || this._primaryAnchor.viewPosition.lineNumber > viewportData.endLineNumber) { + return; + } + this.domNode.setMaxWidth(this._maxWidth); + } + prepareRender(ctx) { + this._renderData = this._prepareRenderWidget(ctx); + } + render(ctx) { + var _a10; + if (!this._renderData || this._renderData.kind === "offViewport") { + if (this._isVisible) { + this.domNode.removeAttribute("monaco-visible-content-widget"); + this._isVisible = false; + if (((_a10 = this._renderData) === null || _a10 === void 0 ? void 0 : _a10.kind) === "offViewport" && this._renderData.preserveFocus) { + this.domNode.setTop(-1e3); + } else { + this.domNode.setVisibility("hidden"); + } + } + if (typeof this._actual.afterRender === "function") { + safeInvoke(this._actual.afterRender, this._actual, null); + } + return; + } + if (this.allowEditorOverflow) { + this.domNode.setTop(this._renderData.coordinate.top); + this.domNode.setLeft(this._renderData.coordinate.left); + } else { + this.domNode.setTop(this._renderData.coordinate.top + ctx.scrollTop - ctx.bigNumbersDelta); + this.domNode.setLeft(this._renderData.coordinate.left); + } + if (!this._isVisible) { + this.domNode.setVisibility("inherit"); + this.domNode.setAttribute("monaco-visible-content-widget", "true"); + this._isVisible = true; + } + if (typeof this._actual.afterRender === "function") { + safeInvoke(this._actual.afterRender, this._actual, this._renderData.position); + } + } + }; + PositionPair = class { + constructor(modelPosition, viewPosition) { + this.modelPosition = modelPosition; + this.viewPosition = viewPosition; + } + }; + Coordinate = class { + constructor(top, left) { + this.top = top; + this.left = left; + this._coordinateBrand = void 0; + } + }; + AnchorCoordinate = class { + constructor(top, left, height) { + this.top = top; + this.left = left; + this.height = height; + this._anchorCoordinateBrand = void 0; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.css +var init_currentLineHighlight = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.js +var AbstractLineHighlightOverlay, CurrentLineHighlightOverlay, CurrentLineMarginHighlightOverlay; +var init_currentLineHighlight2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.js"() { + init_currentLineHighlight(); + init_dynamicViewOverlay(); + init_editorColorRegistry(); + init_arrays(); + init_themeService(); + init_selection(); + init_theme(); + init_position(); + AbstractLineHighlightOverlay = class extends DynamicViewOverlay { + constructor(context) { + super(); + this._context = context; + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._renderLineHighlight = options2.get( + 96 + /* EditorOption.renderLineHighlight */ + ); + this._renderLineHighlightOnlyWhenFocus = options2.get( + 97 + /* EditorOption.renderLineHighlightOnlyWhenFocus */ + ); + this._wordWrap = layoutInfo.isViewportWrapping; + this._contentLeft = layoutInfo.contentLeft; + this._contentWidth = layoutInfo.contentWidth; + this._selectionIsEmpty = true; + this._focused = false; + this._cursorLineNumbers = [1]; + this._selections = [new Selection(1, 1, 1, 1)]; + this._renderData = null; + this._context.addEventHandler(this); + } + dispose() { + this._context.removeEventHandler(this); + super.dispose(); + } + _readFromSelections() { + let hasChanged = false; + const lineNumbers = /* @__PURE__ */ new Set(); + for (const selection of this._selections) { + lineNumbers.add(selection.positionLineNumber); + } + const cursorsLineNumbers = Array.from(lineNumbers); + cursorsLineNumbers.sort((a3, b) => a3 - b); + if (!equals(this._cursorLineNumbers, cursorsLineNumbers)) { + this._cursorLineNumbers = cursorsLineNumbers; + hasChanged = true; + } + const selectionIsEmpty = this._selections.every((s) => s.isEmpty()); + if (this._selectionIsEmpty !== selectionIsEmpty) { + this._selectionIsEmpty = selectionIsEmpty; + hasChanged = true; + } + return hasChanged; + } + // --- begin event handlers + onThemeChanged(e) { + return this._readFromSelections(); + } + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._renderLineHighlight = options2.get( + 96 + /* EditorOption.renderLineHighlight */ + ); + this._renderLineHighlightOnlyWhenFocus = options2.get( + 97 + /* EditorOption.renderLineHighlightOnlyWhenFocus */ + ); + this._wordWrap = layoutInfo.isViewportWrapping; + this._contentLeft = layoutInfo.contentLeft; + this._contentWidth = layoutInfo.contentWidth; + return true; + } + onCursorStateChanged(e) { + this._selections = e.selections; + return this._readFromSelections(); + } + onFlushed(e) { + return true; + } + onLinesDeleted(e) { + return true; + } + onLinesInserted(e) { + return true; + } + onScrollChanged(e) { + return e.scrollWidthChanged || e.scrollTopChanged; + } + onZonesChanged(e) { + return true; + } + onFocusChanged(e) { + if (!this._renderLineHighlightOnlyWhenFocus) { + return false; + } + this._focused = e.isFocused; + return true; + } + // --- end event handlers + prepareRender(ctx) { + if (!this._shouldRenderThis()) { + this._renderData = null; + return; + } + const visibleStartLineNumber = ctx.visibleRange.startLineNumber; + const visibleEndLineNumber = ctx.visibleRange.endLineNumber; + const renderData = []; + for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) { + const lineIndex = lineNumber - visibleStartLineNumber; + renderData[lineIndex] = ""; + } + if (this._wordWrap) { + const renderedLineWrapped = this._renderOne(ctx, false); + for (const cursorLineNumber of this._cursorLineNumbers) { + const coordinatesConverter = this._context.viewModel.coordinatesConverter; + const modelLineNumber = coordinatesConverter.convertViewPositionToModelPosition(new Position(cursorLineNumber, 1)).lineNumber; + const firstViewLineNumber = coordinatesConverter.convertModelPositionToViewPosition(new Position(modelLineNumber, 1)).lineNumber; + const lastViewLineNumber = coordinatesConverter.convertModelPositionToViewPosition(new Position(modelLineNumber, this._context.viewModel.model.getLineMaxColumn(modelLineNumber))).lineNumber; + const firstLine = Math.max(firstViewLineNumber, visibleStartLineNumber); + const lastLine = Math.min(lastViewLineNumber, visibleEndLineNumber); + for (let lineNumber = firstLine; lineNumber <= lastLine; lineNumber++) { + const lineIndex = lineNumber - visibleStartLineNumber; + renderData[lineIndex] = renderedLineWrapped; + } + } + } + const renderedLineExact = this._renderOne(ctx, true); + for (const cursorLineNumber of this._cursorLineNumbers) { + if (cursorLineNumber < visibleStartLineNumber || cursorLineNumber > visibleEndLineNumber) { + continue; + } + const lineIndex = cursorLineNumber - visibleStartLineNumber; + renderData[lineIndex] = renderedLineExact; + } + this._renderData = renderData; + } + render(startLineNumber, lineNumber) { + if (!this._renderData) { + return ""; + } + const lineIndex = lineNumber - startLineNumber; + if (lineIndex >= this._renderData.length) { + return ""; + } + return this._renderData[lineIndex]; + } + _shouldRenderInMargin() { + return (this._renderLineHighlight === "gutter" || this._renderLineHighlight === "all") && (!this._renderLineHighlightOnlyWhenFocus || this._focused); + } + _shouldRenderInContent() { + return (this._renderLineHighlight === "line" || this._renderLineHighlight === "all") && this._selectionIsEmpty && (!this._renderLineHighlightOnlyWhenFocus || this._focused); + } + }; + CurrentLineHighlightOverlay = class extends AbstractLineHighlightOverlay { + _renderOne(ctx, exact) { + const className = "current-line" + (this._shouldRenderInMargin() ? " current-line-both" : "") + (exact ? " current-line-exact" : ""); + return `
`; + } + _shouldRenderThis() { + return this._shouldRenderInContent(); + } + _shouldRenderOther() { + return this._shouldRenderInMargin(); + } + }; + CurrentLineMarginHighlightOverlay = class extends AbstractLineHighlightOverlay { + _renderOne(ctx, exact) { + const className = "current-line" + (this._shouldRenderInMargin() ? " current-line-margin" : "") + (this._shouldRenderOther() ? " current-line-margin-both" : "") + (this._shouldRenderInMargin() && exact ? " current-line-exact-margin" : ""); + return `
`; + } + _shouldRenderThis() { + return true; + } + _shouldRenderOther() { + return this._shouldRenderInContent(); + } + }; + registerThemingParticipant((theme, collector) => { + const lineHighlight = theme.getColor(editorLineHighlight); + if (lineHighlight) { + collector.addRule(`.monaco-editor .view-overlays .current-line { background-color: ${lineHighlight}; }`); + collector.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { background-color: ${lineHighlight}; border: none; }`); + } + if (!lineHighlight || lineHighlight.isTransparent() || theme.defines(editorLineHighlightBorder)) { + const lineHighlightBorder = theme.getColor(editorLineHighlightBorder); + if (lineHighlightBorder) { + collector.addRule(`.monaco-editor .view-overlays .current-line-exact { border: 2px solid ${lineHighlightBorder}; }`); + collector.addRule(`.monaco-editor .margin-view-overlays .current-line-exact-margin { border: 2px solid ${lineHighlightBorder}; }`); + if (isHighContrast(theme.type)) { + collector.addRule(`.monaco-editor .view-overlays .current-line-exact { border-width: 1px; }`); + collector.addRule(`.monaco-editor .margin-view-overlays .current-line-exact-margin { border-width: 1px; }`); + } + } + } + }); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/decorations/decorations.css +var init_decorations = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/decorations/decorations.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/decorations/decorations.js +var DecorationsOverlay; +var init_decorations2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/decorations/decorations.js"() { + init_decorations(); + init_dynamicViewOverlay(); + init_renderingContext(); + init_range(); + DecorationsOverlay = class extends DynamicViewOverlay { + constructor(context) { + super(); + this._context = context; + const options2 = this._context.configuration.options; + this._typicalHalfwidthCharacterWidth = options2.get( + 50 + /* EditorOption.fontInfo */ + ).typicalHalfwidthCharacterWidth; + this._renderResult = null; + this._context.addEventHandler(this); + } + dispose() { + this._context.removeEventHandler(this); + this._renderResult = null; + super.dispose(); + } + // --- begin event handlers + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + this._typicalHalfwidthCharacterWidth = options2.get( + 50 + /* EditorOption.fontInfo */ + ).typicalHalfwidthCharacterWidth; + return true; + } + onDecorationsChanged(e) { + return true; + } + onFlushed(e) { + return true; + } + onLinesChanged(e) { + return true; + } + onLinesDeleted(e) { + return true; + } + onLinesInserted(e) { + return true; + } + onScrollChanged(e) { + return e.scrollTopChanged || e.scrollWidthChanged; + } + onZonesChanged(e) { + return true; + } + // --- end event handlers + prepareRender(ctx) { + const _decorations = ctx.getDecorationsInViewport(); + let decorations = []; + let decorationsLen = 0; + for (let i = 0, len = _decorations.length; i < len; i++) { + const d = _decorations[i]; + if (d.options.className) { + decorations[decorationsLen++] = d; + } + } + decorations = decorations.sort((a3, b) => { + if (a3.options.zIndex < b.options.zIndex) { + return -1; + } + if (a3.options.zIndex > b.options.zIndex) { + return 1; + } + const aClassName = a3.options.className; + const bClassName = b.options.className; + if (aClassName < bClassName) { + return -1; + } + if (aClassName > bClassName) { + return 1; + } + return Range.compareRangesUsingStarts(a3.range, b.range); + }); + const visibleStartLineNumber = ctx.visibleRange.startLineNumber; + const visibleEndLineNumber = ctx.visibleRange.endLineNumber; + const output = []; + for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) { + const lineIndex = lineNumber - visibleStartLineNumber; + output[lineIndex] = ""; + } + this._renderWholeLineDecorations(ctx, decorations, output); + this._renderNormalDecorations(ctx, decorations, output); + this._renderResult = output; + } + _renderWholeLineDecorations(ctx, decorations, output) { + const visibleStartLineNumber = ctx.visibleRange.startLineNumber; + const visibleEndLineNumber = ctx.visibleRange.endLineNumber; + for (let i = 0, lenI = decorations.length; i < lenI; i++) { + const d = decorations[i]; + if (!d.options.isWholeLine) { + continue; + } + const decorationOutput = '
'; + const startLineNumber = Math.max(d.range.startLineNumber, visibleStartLineNumber); + const endLineNumber = Math.min(d.range.endLineNumber, visibleEndLineNumber); + for (let j = startLineNumber; j <= endLineNumber; j++) { + const lineIndex = j - visibleStartLineNumber; + output[lineIndex] += decorationOutput; + } + } + } + _renderNormalDecorations(ctx, decorations, output) { + var _a10; + const visibleStartLineNumber = ctx.visibleRange.startLineNumber; + let prevClassName = null; + let prevShowIfCollapsed = false; + let prevRange = null; + let prevShouldFillLineOnLineBreak = false; + for (let i = 0, lenI = decorations.length; i < lenI; i++) { + const d = decorations[i]; + if (d.options.isWholeLine) { + continue; + } + const className = d.options.className; + const showIfCollapsed = Boolean(d.options.showIfCollapsed); + let range2 = d.range; + if (showIfCollapsed && range2.endColumn === 1 && range2.endLineNumber !== range2.startLineNumber) { + range2 = new Range(range2.startLineNumber, range2.startColumn, range2.endLineNumber - 1, this._context.viewModel.getLineMaxColumn(range2.endLineNumber - 1)); + } + if (prevClassName === className && prevShowIfCollapsed === showIfCollapsed && Range.areIntersectingOrTouching(prevRange, range2)) { + prevRange = Range.plusRange(prevRange, range2); + continue; + } + if (prevClassName !== null) { + this._renderNormalDecoration(ctx, prevRange, prevClassName, prevShouldFillLineOnLineBreak, prevShowIfCollapsed, visibleStartLineNumber, output); + } + prevClassName = className; + prevShowIfCollapsed = showIfCollapsed; + prevRange = range2; + prevShouldFillLineOnLineBreak = (_a10 = d.options.shouldFillLineOnLineBreak) !== null && _a10 !== void 0 ? _a10 : false; + } + if (prevClassName !== null) { + this._renderNormalDecoration(ctx, prevRange, prevClassName, prevShouldFillLineOnLineBreak, prevShowIfCollapsed, visibleStartLineNumber, output); + } + } + _renderNormalDecoration(ctx, range2, className, shouldFillLineOnLineBreak, showIfCollapsed, visibleStartLineNumber, output) { + const linesVisibleRanges = ctx.linesVisibleRangesForRange( + range2, + /*TODO@Alex*/ + className === "findMatch" + ); + if (!linesVisibleRanges) { + return; + } + for (let j = 0, lenJ = linesVisibleRanges.length; j < lenJ; j++) { + const lineVisibleRanges = linesVisibleRanges[j]; + if (lineVisibleRanges.outsideRenderedLine) { + continue; + } + const lineIndex = lineVisibleRanges.lineNumber - visibleStartLineNumber; + if (showIfCollapsed && lineVisibleRanges.ranges.length === 1) { + const singleVisibleRange = lineVisibleRanges.ranges[0]; + if (singleVisibleRange.width < this._typicalHalfwidthCharacterWidth) { + const center = Math.round(singleVisibleRange.left + singleVisibleRange.width / 2); + const left = Math.max(0, Math.round(center - this._typicalHalfwidthCharacterWidth / 2)); + lineVisibleRanges.ranges[0] = new HorizontalRange(left, this._typicalHalfwidthCharacterWidth); + } + } + for (let k = 0, lenK = lineVisibleRanges.ranges.length; k < lenK; k++) { + const expandToLeft = shouldFillLineOnLineBreak && lineVisibleRanges.continuesOnNextLine && lenK === 1; + const visibleRange = lineVisibleRanges.ranges[k]; + const decorationOutput = '
'; + output[lineIndex] += decorationOutput; + } + } + } + render(startLineNumber, lineNumber) { + if (!this._renderResult) { + return ""; + } + const lineIndex = lineNumber - startLineNumber; + if (lineIndex < 0 || lineIndex >= this._renderResult.length) { + return ""; + } + return this._renderResult[lineIndex]; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.js +var EditorScrollbar2; +var init_editorScrollbar = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.js"() { + init_dom(); + init_fastDomNode(); + init_scrollableElement(); + init_viewPart(); + init_themeService(); + EditorScrollbar2 = class extends ViewPart { + constructor(context, linesContent, viewDomNode, overflowGuardDomNode) { + super(context); + const options2 = this._context.configuration.options; + const scrollbar = options2.get( + 103 + /* EditorOption.scrollbar */ + ); + const mouseWheelScrollSensitivity = options2.get( + 75 + /* EditorOption.mouseWheelScrollSensitivity */ + ); + const fastScrollSensitivity = options2.get( + 40 + /* EditorOption.fastScrollSensitivity */ + ); + const scrollPredominantAxis = options2.get( + 106 + /* EditorOption.scrollPredominantAxis */ + ); + const scrollbarOptions = { + listenOnDomNode: viewDomNode.domNode, + className: "editor-scrollable " + getThemeTypeSelector(context.theme.type), + useShadows: false, + lazyRender: true, + vertical: scrollbar.vertical, + horizontal: scrollbar.horizontal, + verticalHasArrows: scrollbar.verticalHasArrows, + horizontalHasArrows: scrollbar.horizontalHasArrows, + verticalScrollbarSize: scrollbar.verticalScrollbarSize, + verticalSliderSize: scrollbar.verticalSliderSize, + horizontalScrollbarSize: scrollbar.horizontalScrollbarSize, + horizontalSliderSize: scrollbar.horizontalSliderSize, + handleMouseWheel: scrollbar.handleMouseWheel, + alwaysConsumeMouseWheel: scrollbar.alwaysConsumeMouseWheel, + arrowSize: scrollbar.arrowSize, + mouseWheelScrollSensitivity, + fastScrollSensitivity, + scrollPredominantAxis, + scrollByPage: scrollbar.scrollByPage + }; + this.scrollbar = this._register(new SmoothScrollableElement(linesContent.domNode, scrollbarOptions, this._context.viewLayout.getScrollable())); + PartFingerprints.write( + this.scrollbar.getDomNode(), + 6 + /* PartFingerprint.ScrollableElement */ + ); + this.scrollbarDomNode = createFastDomNode(this.scrollbar.getDomNode()); + this.scrollbarDomNode.setPosition("absolute"); + this._setLayout(); + const onBrowserDesperateReveal = (domNode, lookAtScrollTop, lookAtScrollLeft) => { + const newScrollPosition = {}; + if (lookAtScrollTop) { + const deltaTop = domNode.scrollTop; + if (deltaTop) { + newScrollPosition.scrollTop = this._context.viewLayout.getCurrentScrollTop() + deltaTop; + domNode.scrollTop = 0; + } + } + if (lookAtScrollLeft) { + const deltaLeft = domNode.scrollLeft; + if (deltaLeft) { + newScrollPosition.scrollLeft = this._context.viewLayout.getCurrentScrollLeft() + deltaLeft; + domNode.scrollLeft = 0; + } + } + this._context.viewModel.viewLayout.setScrollPosition( + newScrollPosition, + 1 + /* ScrollType.Immediate */ + ); + }; + this._register(addDisposableListener(viewDomNode.domNode, "scroll", (e) => onBrowserDesperateReveal(viewDomNode.domNode, true, true))); + this._register(addDisposableListener(linesContent.domNode, "scroll", (e) => onBrowserDesperateReveal(linesContent.domNode, true, false))); + this._register(addDisposableListener(overflowGuardDomNode.domNode, "scroll", (e) => onBrowserDesperateReveal(overflowGuardDomNode.domNode, true, false))); + this._register(addDisposableListener(this.scrollbarDomNode.domNode, "scroll", (e) => onBrowserDesperateReveal(this.scrollbarDomNode.domNode, true, false))); + } + dispose() { + super.dispose(); + } + _setLayout() { + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this.scrollbarDomNode.setLeft(layoutInfo.contentLeft); + const minimap = options2.get( + 73 + /* EditorOption.minimap */ + ); + const side = minimap.side; + if (side === "right") { + this.scrollbarDomNode.setWidth(layoutInfo.contentWidth + layoutInfo.minimap.minimapWidth); + } else { + this.scrollbarDomNode.setWidth(layoutInfo.contentWidth); + } + this.scrollbarDomNode.setHeight(layoutInfo.height); + } + getOverviewRulerLayoutInfo() { + return this.scrollbar.getOverviewRulerLayoutInfo(); + } + getDomNode() { + return this.scrollbarDomNode; + } + delegateVerticalScrollbarPointerDown(browserEvent) { + this.scrollbar.delegateVerticalScrollbarPointerDown(browserEvent); + } + delegateScrollFromMouseWheelEvent(browserEvent) { + this.scrollbar.delegateScrollFromMouseWheelEvent(browserEvent); + } + // --- begin event handlers + onConfigurationChanged(e) { + if (e.hasChanged( + 103 + /* EditorOption.scrollbar */ + ) || e.hasChanged( + 75 + /* EditorOption.mouseWheelScrollSensitivity */ + ) || e.hasChanged( + 40 + /* EditorOption.fastScrollSensitivity */ + )) { + const options2 = this._context.configuration.options; + const scrollbar = options2.get( + 103 + /* EditorOption.scrollbar */ + ); + const mouseWheelScrollSensitivity = options2.get( + 75 + /* EditorOption.mouseWheelScrollSensitivity */ + ); + const fastScrollSensitivity = options2.get( + 40 + /* EditorOption.fastScrollSensitivity */ + ); + const scrollPredominantAxis = options2.get( + 106 + /* EditorOption.scrollPredominantAxis */ + ); + const newOpts = { + vertical: scrollbar.vertical, + horizontal: scrollbar.horizontal, + verticalScrollbarSize: scrollbar.verticalScrollbarSize, + horizontalScrollbarSize: scrollbar.horizontalScrollbarSize, + scrollByPage: scrollbar.scrollByPage, + handleMouseWheel: scrollbar.handleMouseWheel, + mouseWheelScrollSensitivity, + fastScrollSensitivity, + scrollPredominantAxis + }; + this.scrollbar.updateOptions(newOpts); + } + if (e.hasChanged( + 145 + /* EditorOption.layoutInfo */ + )) { + this._setLayout(); + } + return true; + } + onScrollChanged(e) { + return true; + } + onThemeChanged(e) { + this.scrollbar.updateClassName("editor-scrollable " + getThemeTypeSelector(this._context.theme.type)); + return true; + } + // --- end event handlers + prepareRender(ctx) { + } + render(ctx) { + this.scrollbar.renderNow(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/glyphMargin/glyphMargin.css +var init_glyphMargin = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/glyphMargin/glyphMargin.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/glyphMargin/glyphMargin.js +var DecorationToRender, LineDecorationToRender, VisibleLineDecorationsToRender, DedupOverlay, GlyphMarginWidgets, DecorationBasedGlyphRenderRequest, WidgetBasedGlyphRenderRequest, DecorationBasedGlyph; +var init_glyphMargin2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/glyphMargin/glyphMargin.js"() { + init_fastDomNode(); + init_arrays(); + init_glyphMargin(); + init_dynamicViewOverlay(); + init_viewPart(); + init_position(); + init_range(); + init_model2(); + DecorationToRender = class { + constructor(startLineNumber, endLineNumber, className, tooltip, zIndex) { + this.startLineNumber = startLineNumber; + this.endLineNumber = endLineNumber; + this.className = className; + this.tooltip = tooltip; + this._decorationToRenderBrand = void 0; + this.zIndex = zIndex !== null && zIndex !== void 0 ? zIndex : 0; + } + }; + LineDecorationToRender = class { + constructor(className, zIndex, tooltip) { + this.className = className; + this.zIndex = zIndex; + this.tooltip = tooltip; + } + }; + VisibleLineDecorationsToRender = class { + constructor() { + this.decorations = []; + } + add(decoration3) { + this.decorations.push(decoration3); + } + getDecorations() { + return this.decorations; + } + }; + DedupOverlay = class extends DynamicViewOverlay { + /** + * Returns an array with an element for each visible line number. + */ + _render(visibleStartLineNumber, visibleEndLineNumber, decorations) { + const output = []; + for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) { + const lineIndex = lineNumber - visibleStartLineNumber; + output[lineIndex] = new VisibleLineDecorationsToRender(); + } + if (decorations.length === 0) { + return output; + } + decorations.sort((a3, b) => { + if (a3.className === b.className) { + if (a3.startLineNumber === b.startLineNumber) { + return a3.endLineNumber - b.endLineNumber; + } + return a3.startLineNumber - b.startLineNumber; + } + return a3.className < b.className ? -1 : 1; + }); + let prevClassName = null; + let prevEndLineIndex = 0; + for (let i = 0, len = decorations.length; i < len; i++) { + const d = decorations[i]; + const className = d.className; + const zIndex = d.zIndex; + let startLineIndex = Math.max(d.startLineNumber, visibleStartLineNumber) - visibleStartLineNumber; + const endLineIndex = Math.min(d.endLineNumber, visibleEndLineNumber) - visibleStartLineNumber; + if (prevClassName === className) { + startLineIndex = Math.max(prevEndLineIndex + 1, startLineIndex); + prevEndLineIndex = Math.max(prevEndLineIndex, endLineIndex); + } else { + prevClassName = className; + prevEndLineIndex = endLineIndex; + } + for (let i2 = startLineIndex; i2 <= prevEndLineIndex; i2++) { + output[i2].add(new LineDecorationToRender(className, zIndex, d.tooltip)); + } + } + return output; + } + }; + GlyphMarginWidgets = class extends ViewPart { + constructor(context) { + super(context); + this._widgets = {}; + this._context = context; + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this.domNode = createFastDomNode(document.createElement("div")); + this.domNode.setClassName("glyph-margin-widgets"); + this.domNode.setPosition("absolute"); + this.domNode.setTop(0); + this._lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this._glyphMargin = options2.get( + 57 + /* EditorOption.glyphMargin */ + ); + this._glyphMarginLeft = layoutInfo.glyphMarginLeft; + this._glyphMarginWidth = layoutInfo.glyphMarginWidth; + this._glyphMarginDecorationLaneCount = layoutInfo.glyphMarginDecorationLaneCount; + this._managedDomNodes = []; + this._decorationGlyphsToRender = []; + } + dispose() { + this._managedDomNodes = []; + this._decorationGlyphsToRender = []; + this._widgets = {}; + super.dispose(); + } + getWidgets() { + return Object.values(this._widgets); + } + // --- begin event handlers + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this._glyphMargin = options2.get( + 57 + /* EditorOption.glyphMargin */ + ); + this._glyphMarginLeft = layoutInfo.glyphMarginLeft; + this._glyphMarginWidth = layoutInfo.glyphMarginWidth; + this._glyphMarginDecorationLaneCount = layoutInfo.glyphMarginDecorationLaneCount; + return true; + } + onDecorationsChanged(e) { + return true; + } + onFlushed(e) { + return true; + } + onLinesChanged(e) { + return true; + } + onLinesDeleted(e) { + return true; + } + onLinesInserted(e) { + return true; + } + onScrollChanged(e) { + return e.scrollTopChanged; + } + onZonesChanged(e) { + return true; + } + // --- end event handlers + // --- begin widget management + addWidget(widget) { + const domNode = createFastDomNode(widget.getDomNode()); + this._widgets[widget.getId()] = { + widget, + preference: widget.getPosition(), + domNode, + renderInfo: null + }; + domNode.setPosition("absolute"); + domNode.setDisplay("none"); + domNode.setAttribute("widgetId", widget.getId()); + this.domNode.appendChild(domNode); + this.setShouldRender(); + } + setWidgetPosition(widget, preference) { + const myWidget = this._widgets[widget.getId()]; + if (myWidget.preference.lane === preference.lane && myWidget.preference.zIndex === preference.zIndex && Range.equalsRange(myWidget.preference.range, preference.range)) { + return false; + } + myWidget.preference = preference; + this.setShouldRender(); + return true; + } + removeWidget(widget) { + var _a10; + const widgetId = widget.getId(); + if (this._widgets[widgetId]) { + const widgetData = this._widgets[widgetId]; + const domNode = widgetData.domNode.domNode; + delete this._widgets[widgetId]; + (_a10 = domNode.parentNode) === null || _a10 === void 0 ? void 0 : _a10.removeChild(domNode); + this.setShouldRender(); + } + } + // --- end widget management + _collectDecorationBasedGlyphRenderRequest(ctx, requests) { + var _a10, _b4, _c2; + const visibleStartLineNumber = ctx.visibleRange.startLineNumber; + const visibleEndLineNumber = ctx.visibleRange.endLineNumber; + const decorations = ctx.getDecorationsInViewport(); + for (const d of decorations) { + const glyphMarginClassName = d.options.glyphMarginClassName; + if (!glyphMarginClassName) { + continue; + } + const startLineNumber = Math.max(d.range.startLineNumber, visibleStartLineNumber); + const endLineNumber = Math.min(d.range.endLineNumber, visibleEndLineNumber); + const lane = (_b4 = (_a10 = d.options.glyphMargin) === null || _a10 === void 0 ? void 0 : _a10.position) !== null && _b4 !== void 0 ? _b4 : GlyphMarginLane2.Center; + const zIndex = (_c2 = d.options.zIndex) !== null && _c2 !== void 0 ? _c2 : 0; + for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { + const modelPosition = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(lineNumber, 0)); + const laneIndex = this._context.viewModel.glyphLanes.getLanesAtLine(modelPosition.lineNumber).indexOf(lane); + requests.push(new DecorationBasedGlyphRenderRequest(lineNumber, laneIndex, zIndex, glyphMarginClassName)); + } + } + } + _collectWidgetBasedGlyphRenderRequest(ctx, requests) { + const visibleStartLineNumber = ctx.visibleRange.startLineNumber; + const visibleEndLineNumber = ctx.visibleRange.endLineNumber; + for (const widget of Object.values(this._widgets)) { + const range2 = widget.preference.range; + const { startLineNumber, endLineNumber } = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(Range.lift(range2)); + if (!startLineNumber || !endLineNumber || endLineNumber < visibleStartLineNumber || startLineNumber > visibleEndLineNumber) { + continue; + } + const widgetLineNumber = Math.max(startLineNumber, visibleStartLineNumber); + const modelPosition = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(widgetLineNumber, 0)); + const laneIndex = this._context.viewModel.glyphLanes.getLanesAtLine(modelPosition.lineNumber).indexOf(widget.preference.lane); + requests.push(new WidgetBasedGlyphRenderRequest(widgetLineNumber, laneIndex, widget.preference.zIndex, widget)); + } + } + _collectSortedGlyphRenderRequests(ctx) { + const requests = []; + this._collectDecorationBasedGlyphRenderRequest(ctx, requests); + this._collectWidgetBasedGlyphRenderRequest(ctx, requests); + requests.sort((a3, b) => { + if (a3.lineNumber === b.lineNumber) { + if (a3.laneIndex === b.laneIndex) { + if (a3.zIndex === b.zIndex) { + if (b.type === a3.type) { + if (a3.type === 0 && b.type === 0) { + return a3.className < b.className ? -1 : 1; + } + return 0; + } + return b.type - a3.type; + } + return b.zIndex - a3.zIndex; + } + return a3.laneIndex - b.laneIndex; + } + return a3.lineNumber - b.lineNumber; + }); + return requests; + } + /** + * Will store render information in each widget's renderInfo and in `_decorationGlyphsToRender`. + */ + prepareRender(ctx) { + if (!this._glyphMargin) { + this._decorationGlyphsToRender = []; + return; + } + for (const widget of Object.values(this._widgets)) { + widget.renderInfo = null; + } + const requests = new ArrayQueue(this._collectSortedGlyphRenderRequests(ctx)); + const decorationGlyphsToRender = []; + while (requests.length > 0) { + const first2 = requests.peek(); + if (!first2) { + break; + } + const requestsAtLocation = requests.takeWhile((el) => el.lineNumber === first2.lineNumber && el.laneIndex === first2.laneIndex); + if (!requestsAtLocation || requestsAtLocation.length === 0) { + break; + } + const winner = requestsAtLocation[0]; + if (winner.type === 0) { + const classNames = []; + for (const request of requestsAtLocation) { + if (request.zIndex !== winner.zIndex || request.type !== winner.type) { + break; + } + if (classNames.length === 0 || classNames[classNames.length - 1] !== request.className) { + classNames.push(request.className); + } + } + decorationGlyphsToRender.push(winner.accept(classNames.join(" "))); + } else { + winner.widget.renderInfo = { + lineNumber: winner.lineNumber, + laneIndex: winner.laneIndex + }; + } + } + this._decorationGlyphsToRender = decorationGlyphsToRender; + } + render(ctx) { + if (!this._glyphMargin) { + for (const widget of Object.values(this._widgets)) { + widget.domNode.setDisplay("none"); + } + while (this._managedDomNodes.length > 0) { + const domNode = this._managedDomNodes.pop(); + domNode === null || domNode === void 0 ? void 0 : domNode.domNode.remove(); + } + return; + } + const width2 = Math.round(this._glyphMarginWidth / this._glyphMarginDecorationLaneCount); + for (const widget of Object.values(this._widgets)) { + if (!widget.renderInfo) { + widget.domNode.setDisplay("none"); + } else { + const top = ctx.viewportData.relativeVerticalOffset[widget.renderInfo.lineNumber - ctx.viewportData.startLineNumber]; + const left = this._glyphMarginLeft + widget.renderInfo.laneIndex * this._lineHeight; + widget.domNode.setDisplay("block"); + widget.domNode.setTop(top); + widget.domNode.setLeft(left); + widget.domNode.setWidth(width2); + widget.domNode.setHeight(this._lineHeight); + } + } + for (let i = 0; i < this._decorationGlyphsToRender.length; i++) { + const dec = this._decorationGlyphsToRender[i]; + const top = ctx.viewportData.relativeVerticalOffset[dec.lineNumber - ctx.viewportData.startLineNumber]; + const left = this._glyphMarginLeft + dec.laneIndex * this._lineHeight; + let domNode; + if (i < this._managedDomNodes.length) { + domNode = this._managedDomNodes[i]; + } else { + domNode = createFastDomNode(document.createElement("div")); + this._managedDomNodes.push(domNode); + this.domNode.appendChild(domNode); + } + domNode.setClassName(`cgmr codicon ` + dec.combinedClassName); + domNode.setPosition(`absolute`); + domNode.setTop(top); + domNode.setLeft(left); + domNode.setWidth(width2); + domNode.setHeight(this._lineHeight); + } + while (this._managedDomNodes.length > this._decorationGlyphsToRender.length) { + const domNode = this._managedDomNodes.pop(); + domNode === null || domNode === void 0 ? void 0 : domNode.domNode.remove(); + } + } + }; + DecorationBasedGlyphRenderRequest = class { + constructor(lineNumber, laneIndex, zIndex, className) { + this.lineNumber = lineNumber; + this.laneIndex = laneIndex; + this.zIndex = zIndex; + this.className = className; + this.type = 0; + } + accept(combinedClassName) { + return new DecorationBasedGlyph(this.lineNumber, this.laneIndex, combinedClassName); + } + }; + WidgetBasedGlyphRenderRequest = class { + constructor(lineNumber, laneIndex, zIndex, widget) { + this.lineNumber = lineNumber; + this.laneIndex = laneIndex; + this.zIndex = zIndex; + this.widget = widget; + this.type = 1; + } + }; + DecorationBasedGlyph = class { + constructor(lineNumber, laneIndex, combinedClassName) { + this.lineNumber = lineNumber; + this.laneIndex = laneIndex; + this.combinedClassName = combinedClassName; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/indentGuides/indentGuides.css +var init_indentGuides = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/indentGuides/indentGuides.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/textModelPart.js +var TextModelPart; +var init_textModelPart = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/textModelPart.js"() { + init_lifecycle(); + TextModelPart = class extends Disposable { + constructor() { + super(...arguments); + this._isDisposed = false; + } + dispose() { + super.dispose(); + this._isDisposed = true; + } + assertNotDisposed() { + if (this._isDisposed) { + throw new Error("TextModelPart is disposed!"); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/utils.js +function computeIndentLevel(line, tabSize) { + let indent = 0; + let i = 0; + const len = line.length; + while (i < len) { + const chCode = line.charCodeAt(i); + if (chCode === 32) { + indent++; + } else if (chCode === 9) { + indent = indent - indent % tabSize + tabSize; + } else { + break; + } + i++; + } + if (i === len) { + return -1; + } + return indent; +} +var init_utils2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/utils.js"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/textModelGuides.js +var HorizontalGuidesState, IndentGuide, IndentGuideHorizontalLine; +var init_textModelGuides = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/textModelGuides.js"() { + (function(HorizontalGuidesState2) { + HorizontalGuidesState2[HorizontalGuidesState2["Disabled"] = 0] = "Disabled"; + HorizontalGuidesState2[HorizontalGuidesState2["EnabledForActive"] = 1] = "EnabledForActive"; + HorizontalGuidesState2[HorizontalGuidesState2["Enabled"] = 2] = "Enabled"; + })(HorizontalGuidesState || (HorizontalGuidesState = {})); + IndentGuide = class { + constructor(visibleColumn, column, className, horizontalLine, forWrappedLinesAfterColumn, forWrappedLinesBeforeOrAtColumn) { + this.visibleColumn = visibleColumn; + this.column = column; + this.className = className; + this.horizontalLine = horizontalLine; + this.forWrappedLinesAfterColumn = forWrappedLinesAfterColumn; + this.forWrappedLinesBeforeOrAtColumn = forWrappedLinesBeforeOrAtColumn; + if (visibleColumn !== -1 === (column !== -1)) { + throw new Error(); + } + } + }; + IndentGuideHorizontalLine = class { + constructor(top, endColumn) { + this.top = top; + this.endColumn = endColumn; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/guidesTextModelPart.js +var GuidesTextModelPart, BracketPairGuidesClassNames; +var init_guidesTextModelPart = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/guidesTextModelPart.js"() { + init_arraysFind(); + init_strings(); + init_cursorColumns(); + init_range(); + init_textModelPart(); + init_utils2(); + init_textModelGuides(); + init_errors(); + GuidesTextModelPart = class extends TextModelPart { + constructor(textModel, languageConfigurationService) { + super(); + this.textModel = textModel; + this.languageConfigurationService = languageConfigurationService; + } + getLanguageConfiguration(languageId) { + return this.languageConfigurationService.getLanguageConfiguration(languageId); + } + _computeIndentLevel(lineIndex) { + return computeIndentLevel(this.textModel.getLineContent(lineIndex + 1), this.textModel.getOptions().tabSize); + } + getActiveIndentGuide(lineNumber, minLineNumber, maxLineNumber) { + this.assertNotDisposed(); + const lineCount = this.textModel.getLineCount(); + if (lineNumber < 1 || lineNumber > lineCount) { + throw new BugIndicatingError("Illegal value for lineNumber"); + } + const foldingRules = this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules; + const offSide = Boolean(foldingRules && foldingRules.offSide); + let up_aboveContentLineIndex = -2; + let up_aboveContentLineIndent = -1; + let up_belowContentLineIndex = -2; + let up_belowContentLineIndent = -1; + const up_resolveIndents = (lineNumber2) => { + if (up_aboveContentLineIndex !== -1 && (up_aboveContentLineIndex === -2 || up_aboveContentLineIndex > lineNumber2 - 1)) { + up_aboveContentLineIndex = -1; + up_aboveContentLineIndent = -1; + for (let lineIndex = lineNumber2 - 2; lineIndex >= 0; lineIndex--) { + const indent2 = this._computeIndentLevel(lineIndex); + if (indent2 >= 0) { + up_aboveContentLineIndex = lineIndex; + up_aboveContentLineIndent = indent2; + break; + } + } + } + if (up_belowContentLineIndex === -2) { + up_belowContentLineIndex = -1; + up_belowContentLineIndent = -1; + for (let lineIndex = lineNumber2; lineIndex < lineCount; lineIndex++) { + const indent2 = this._computeIndentLevel(lineIndex); + if (indent2 >= 0) { + up_belowContentLineIndex = lineIndex; + up_belowContentLineIndent = indent2; + break; + } + } + } + }; + let down_aboveContentLineIndex = -2; + let down_aboveContentLineIndent = -1; + let down_belowContentLineIndex = -2; + let down_belowContentLineIndent = -1; + const down_resolveIndents = (lineNumber2) => { + if (down_aboveContentLineIndex === -2) { + down_aboveContentLineIndex = -1; + down_aboveContentLineIndent = -1; + for (let lineIndex = lineNumber2 - 2; lineIndex >= 0; lineIndex--) { + const indent2 = this._computeIndentLevel(lineIndex); + if (indent2 >= 0) { + down_aboveContentLineIndex = lineIndex; + down_aboveContentLineIndent = indent2; + break; + } + } + } + if (down_belowContentLineIndex !== -1 && (down_belowContentLineIndex === -2 || down_belowContentLineIndex < lineNumber2 - 1)) { + down_belowContentLineIndex = -1; + down_belowContentLineIndent = -1; + for (let lineIndex = lineNumber2; lineIndex < lineCount; lineIndex++) { + const indent2 = this._computeIndentLevel(lineIndex); + if (indent2 >= 0) { + down_belowContentLineIndex = lineIndex; + down_belowContentLineIndent = indent2; + break; + } + } + } + }; + let startLineNumber = 0; + let goUp = true; + let endLineNumber = 0; + let goDown = true; + let indent = 0; + let initialIndent = 0; + for (let distance = 0; goUp || goDown; distance++) { + const upLineNumber = lineNumber - distance; + const downLineNumber = lineNumber + distance; + if (distance > 1 && (upLineNumber < 1 || upLineNumber < minLineNumber)) { + goUp = false; + } + if (distance > 1 && (downLineNumber > lineCount || downLineNumber > maxLineNumber)) { + goDown = false; + } + if (distance > 5e4) { + goUp = false; + goDown = false; + } + let upLineIndentLevel = -1; + if (goUp && upLineNumber >= 1) { + const currentIndent = this._computeIndentLevel(upLineNumber - 1); + if (currentIndent >= 0) { + up_belowContentLineIndex = upLineNumber - 1; + up_belowContentLineIndent = currentIndent; + upLineIndentLevel = Math.ceil(currentIndent / this.textModel.getOptions().indentSize); + } else { + up_resolveIndents(upLineNumber); + upLineIndentLevel = this._getIndentLevelForWhitespaceLine(offSide, up_aboveContentLineIndent, up_belowContentLineIndent); + } + } + let downLineIndentLevel = -1; + if (goDown && downLineNumber <= lineCount) { + const currentIndent = this._computeIndentLevel(downLineNumber - 1); + if (currentIndent >= 0) { + down_aboveContentLineIndex = downLineNumber - 1; + down_aboveContentLineIndent = currentIndent; + downLineIndentLevel = Math.ceil(currentIndent / this.textModel.getOptions().indentSize); + } else { + down_resolveIndents(downLineNumber); + downLineIndentLevel = this._getIndentLevelForWhitespaceLine(offSide, down_aboveContentLineIndent, down_belowContentLineIndent); + } + } + if (distance === 0) { + initialIndent = upLineIndentLevel; + continue; + } + if (distance === 1) { + if (downLineNumber <= lineCount && downLineIndentLevel >= 0 && initialIndent + 1 === downLineIndentLevel) { + goUp = false; + startLineNumber = downLineNumber; + endLineNumber = downLineNumber; + indent = downLineIndentLevel; + continue; + } + if (upLineNumber >= 1 && upLineIndentLevel >= 0 && upLineIndentLevel - 1 === initialIndent) { + goDown = false; + startLineNumber = upLineNumber; + endLineNumber = upLineNumber; + indent = upLineIndentLevel; + continue; + } + startLineNumber = lineNumber; + endLineNumber = lineNumber; + indent = initialIndent; + if (indent === 0) { + return { startLineNumber, endLineNumber, indent }; + } + } + if (goUp) { + if (upLineIndentLevel >= indent) { + startLineNumber = upLineNumber; + } else { + goUp = false; + } + } + if (goDown) { + if (downLineIndentLevel >= indent) { + endLineNumber = downLineNumber; + } else { + goDown = false; + } + } + } + return { startLineNumber, endLineNumber, indent }; + } + getLinesBracketGuides(startLineNumber, endLineNumber, activePosition, options2) { + var _a10; + const result = []; + for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { + result.push([]); + } + const includeSingleLinePairs = true; + const bracketPairs = this.textModel.bracketPairs.getBracketPairsInRangeWithMinIndentation(new Range(startLineNumber, 1, endLineNumber, this.textModel.getLineMaxColumn(endLineNumber))).toArray(); + let activeBracketPairRange = void 0; + if (activePosition && bracketPairs.length > 0) { + const bracketsContainingActivePosition = (startLineNumber <= activePosition.lineNumber && activePosition.lineNumber <= endLineNumber ? bracketPairs : this.textModel.bracketPairs.getBracketPairsInRange(Range.fromPositions(activePosition)).toArray()).filter((bp) => Range.strictContainsPosition(bp.range, activePosition)); + activeBracketPairRange = (_a10 = findLast(bracketsContainingActivePosition, (i) => includeSingleLinePairs || i.range.startLineNumber !== i.range.endLineNumber)) === null || _a10 === void 0 ? void 0 : _a10.range; + } + const independentColorPoolPerBracketType = this.textModel.getOptions().bracketPairColorizationOptions.independentColorPoolPerBracketType; + const colorProvider = new BracketPairGuidesClassNames(); + for (const pair of bracketPairs) { + if (!pair.closingBracketRange) { + continue; + } + const isActive = activeBracketPairRange && pair.range.equalsRange(activeBracketPairRange); + if (!isActive && !options2.includeInactive) { + continue; + } + const className = colorProvider.getInlineClassName(pair.nestingLevel, pair.nestingLevelOfEqualBracketType, independentColorPoolPerBracketType) + (options2.highlightActive && isActive ? " " + colorProvider.activeClassName : ""); + const start = pair.openingBracketRange.getStartPosition(); + const end = pair.closingBracketRange.getStartPosition(); + const horizontalGuides = options2.horizontalGuides === HorizontalGuidesState.Enabled || options2.horizontalGuides === HorizontalGuidesState.EnabledForActive && isActive; + if (pair.range.startLineNumber === pair.range.endLineNumber) { + if (includeSingleLinePairs && horizontalGuides) { + result[pair.range.startLineNumber - startLineNumber].push(new IndentGuide(-1, pair.openingBracketRange.getEndPosition().column, className, new IndentGuideHorizontalLine(false, end.column), -1, -1)); + } + continue; + } + const endVisibleColumn = this.getVisibleColumnFromPosition(end); + const startVisibleColumn = this.getVisibleColumnFromPosition(pair.openingBracketRange.getStartPosition()); + const guideVisibleColumn = Math.min(startVisibleColumn, endVisibleColumn, pair.minVisibleColumnIndentation + 1); + let renderHorizontalEndLineAtTheBottom = false; + const firstNonWsIndex = firstNonWhitespaceIndex(this.textModel.getLineContent(pair.closingBracketRange.startLineNumber)); + const hasTextBeforeClosingBracket = firstNonWsIndex < pair.closingBracketRange.startColumn - 1; + if (hasTextBeforeClosingBracket) { + renderHorizontalEndLineAtTheBottom = true; + } + const visibleGuideStartLineNumber = Math.max(start.lineNumber, startLineNumber); + const visibleGuideEndLineNumber = Math.min(end.lineNumber, endLineNumber); + const offset = renderHorizontalEndLineAtTheBottom ? 1 : 0; + for (let l = visibleGuideStartLineNumber; l < visibleGuideEndLineNumber + offset; l++) { + result[l - startLineNumber].push(new IndentGuide(guideVisibleColumn, -1, className, null, l === start.lineNumber ? start.column : -1, l === end.lineNumber ? end.column : -1)); + } + if (horizontalGuides) { + if (start.lineNumber >= startLineNumber && startVisibleColumn > guideVisibleColumn) { + result[start.lineNumber - startLineNumber].push(new IndentGuide(guideVisibleColumn, -1, className, new IndentGuideHorizontalLine(false, start.column), -1, -1)); + } + if (end.lineNumber <= endLineNumber && endVisibleColumn > guideVisibleColumn) { + result[end.lineNumber - startLineNumber].push(new IndentGuide(guideVisibleColumn, -1, className, new IndentGuideHorizontalLine(!renderHorizontalEndLineAtTheBottom, end.column), -1, -1)); + } + } + } + for (const guides of result) { + guides.sort((a3, b) => a3.visibleColumn - b.visibleColumn); + } + return result; + } + getVisibleColumnFromPosition(position) { + return CursorColumns.visibleColumnFromColumn(this.textModel.getLineContent(position.lineNumber), position.column, this.textModel.getOptions().tabSize) + 1; + } + getLinesIndentGuides(startLineNumber, endLineNumber) { + this.assertNotDisposed(); + const lineCount = this.textModel.getLineCount(); + if (startLineNumber < 1 || startLineNumber > lineCount) { + throw new Error("Illegal value for startLineNumber"); + } + if (endLineNumber < 1 || endLineNumber > lineCount) { + throw new Error("Illegal value for endLineNumber"); + } + const options2 = this.textModel.getOptions(); + const foldingRules = this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules; + const offSide = Boolean(foldingRules && foldingRules.offSide); + const result = new Array(endLineNumber - startLineNumber + 1); + let aboveContentLineIndex = -2; + let aboveContentLineIndent = -1; + let belowContentLineIndex = -2; + let belowContentLineIndent = -1; + for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { + const resultIndex = lineNumber - startLineNumber; + const currentIndent = this._computeIndentLevel(lineNumber - 1); + if (currentIndent >= 0) { + aboveContentLineIndex = lineNumber - 1; + aboveContentLineIndent = currentIndent; + result[resultIndex] = Math.ceil(currentIndent / options2.indentSize); + continue; + } + if (aboveContentLineIndex === -2) { + aboveContentLineIndex = -1; + aboveContentLineIndent = -1; + for (let lineIndex = lineNumber - 2; lineIndex >= 0; lineIndex--) { + const indent = this._computeIndentLevel(lineIndex); + if (indent >= 0) { + aboveContentLineIndex = lineIndex; + aboveContentLineIndent = indent; + break; + } + } + } + if (belowContentLineIndex !== -1 && (belowContentLineIndex === -2 || belowContentLineIndex < lineNumber - 1)) { + belowContentLineIndex = -1; + belowContentLineIndent = -1; + for (let lineIndex = lineNumber; lineIndex < lineCount; lineIndex++) { + const indent = this._computeIndentLevel(lineIndex); + if (indent >= 0) { + belowContentLineIndex = lineIndex; + belowContentLineIndent = indent; + break; + } + } + } + result[resultIndex] = this._getIndentLevelForWhitespaceLine(offSide, aboveContentLineIndent, belowContentLineIndent); + } + return result; + } + _getIndentLevelForWhitespaceLine(offSide, aboveContentLineIndent, belowContentLineIndent) { + const options2 = this.textModel.getOptions(); + if (aboveContentLineIndent === -1 || belowContentLineIndent === -1) { + return 0; + } else if (aboveContentLineIndent < belowContentLineIndent) { + return 1 + Math.floor(aboveContentLineIndent / options2.indentSize); + } else if (aboveContentLineIndent === belowContentLineIndent) { + return Math.ceil(belowContentLineIndent / options2.indentSize); + } else { + if (offSide) { + return Math.ceil(belowContentLineIndent / options2.indentSize); + } else { + return 1 + Math.floor(belowContentLineIndent / options2.indentSize); + } + } + } + }; + BracketPairGuidesClassNames = class { + constructor() { + this.activeClassName = "indent-active"; + } + getInlineClassName(nestingLevel, nestingLevelOfEqualBracketType, independentColorPoolPerBracketType) { + return this.getInlineClassNameOfLevel(independentColorPoolPerBracketType ? nestingLevelOfEqualBracketType : nestingLevel); + } + getInlineClassNameOfLevel(level) { + return `bracket-indent-guide lvl-${level % 30}`; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/indentGuides/indentGuides.js +function transparentToUndefined(color) { + if (color && color.isTransparent()) { + return void 0; + } + return color; +} +var IndentGuidesOverlay; +var init_indentGuides2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/indentGuides/indentGuides.js"() { + init_indentGuides(); + init_dynamicViewOverlay(); + init_editorColorRegistry(); + init_themeService(); + init_position(); + init_arrays(); + init_types(); + init_guidesTextModelPart(); + init_textModelGuides(); + IndentGuidesOverlay = class extends DynamicViewOverlay { + constructor(context) { + super(); + this._context = context; + this._primaryPosition = null; + const options2 = this._context.configuration.options; + const wrappingInfo = options2.get( + 146 + /* EditorOption.wrappingInfo */ + ); + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + this._spaceWidth = fontInfo.spaceWidth; + this._maxIndentLeft = wrappingInfo.wrappingColumn === -1 ? -1 : wrappingInfo.wrappingColumn * fontInfo.typicalHalfwidthCharacterWidth; + this._bracketPairGuideOptions = options2.get( + 16 + /* EditorOption.guides */ + ); + this._renderResult = null; + this._context.addEventHandler(this); + } + dispose() { + this._context.removeEventHandler(this); + this._renderResult = null; + super.dispose(); + } + // --- begin event handlers + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + const wrappingInfo = options2.get( + 146 + /* EditorOption.wrappingInfo */ + ); + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + this._spaceWidth = fontInfo.spaceWidth; + this._maxIndentLeft = wrappingInfo.wrappingColumn === -1 ? -1 : wrappingInfo.wrappingColumn * fontInfo.typicalHalfwidthCharacterWidth; + this._bracketPairGuideOptions = options2.get( + 16 + /* EditorOption.guides */ + ); + return true; + } + onCursorStateChanged(e) { + var _a10; + const selection = e.selections[0]; + const newPosition = selection.getPosition(); + if (!((_a10 = this._primaryPosition) === null || _a10 === void 0 ? void 0 : _a10.equals(newPosition))) { + this._primaryPosition = newPosition; + return true; + } + return false; + } + onDecorationsChanged(e) { + return true; + } + onFlushed(e) { + return true; + } + onLinesChanged(e) { + return true; + } + onLinesDeleted(e) { + return true; + } + onLinesInserted(e) { + return true; + } + onScrollChanged(e) { + return e.scrollTopChanged; + } + onZonesChanged(e) { + return true; + } + onLanguageConfigurationChanged(e) { + return true; + } + // --- end event handlers + prepareRender(ctx) { + var _a10, _b4, _c2, _d2; + if (!this._bracketPairGuideOptions.indentation && this._bracketPairGuideOptions.bracketPairs === false) { + this._renderResult = null; + return; + } + const visibleStartLineNumber = ctx.visibleRange.startLineNumber; + const visibleEndLineNumber = ctx.visibleRange.endLineNumber; + const scrollWidth = ctx.scrollWidth; + const activeCursorPosition = this._primaryPosition; + const indents = this.getGuidesByLine(visibleStartLineNumber, Math.min(visibleEndLineNumber + 1, this._context.viewModel.getLineCount()), activeCursorPosition); + const output = []; + for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) { + const lineIndex = lineNumber - visibleStartLineNumber; + const indent = indents[lineIndex]; + let result = ""; + const leftOffset = (_b4 = (_a10 = ctx.visibleRangeForPosition(new Position(lineNumber, 1))) === null || _a10 === void 0 ? void 0 : _a10.left) !== null && _b4 !== void 0 ? _b4 : 0; + for (const guide of indent) { + const left = guide.column === -1 ? leftOffset + (guide.visibleColumn - 1) * this._spaceWidth : ctx.visibleRangeForPosition(new Position(lineNumber, guide.column)).left; + if (left > scrollWidth || this._maxIndentLeft > 0 && left > this._maxIndentLeft) { + break; + } + const className = guide.horizontalLine ? guide.horizontalLine.top ? "horizontal-top" : "horizontal-bottom" : "vertical"; + const width2 = guide.horizontalLine ? ((_d2 = (_c2 = ctx.visibleRangeForPosition(new Position(lineNumber, guide.horizontalLine.endColumn))) === null || _c2 === void 0 ? void 0 : _c2.left) !== null && _d2 !== void 0 ? _d2 : left + this._spaceWidth) - left : this._spaceWidth; + result += `
`; + } + output[lineIndex] = result; + } + this._renderResult = output; + } + getGuidesByLine(visibleStartLineNumber, visibleEndLineNumber, activeCursorPosition) { + const bracketGuides = this._bracketPairGuideOptions.bracketPairs !== false ? this._context.viewModel.getBracketGuidesInRangeByLine(visibleStartLineNumber, visibleEndLineNumber, activeCursorPosition, { + highlightActive: this._bracketPairGuideOptions.highlightActiveBracketPair, + horizontalGuides: this._bracketPairGuideOptions.bracketPairsHorizontal === true ? HorizontalGuidesState.Enabled : this._bracketPairGuideOptions.bracketPairsHorizontal === "active" ? HorizontalGuidesState.EnabledForActive : HorizontalGuidesState.Disabled, + includeInactive: this._bracketPairGuideOptions.bracketPairs === true + }) : null; + const indentGuides = this._bracketPairGuideOptions.indentation ? this._context.viewModel.getLinesIndentGuides(visibleStartLineNumber, visibleEndLineNumber) : null; + let activeIndentStartLineNumber = 0; + let activeIndentEndLineNumber = 0; + let activeIndentLevel = 0; + if (this._bracketPairGuideOptions.highlightActiveIndentation !== false && activeCursorPosition) { + const activeIndentInfo = this._context.viewModel.getActiveIndentGuide(activeCursorPosition.lineNumber, visibleStartLineNumber, visibleEndLineNumber); + activeIndentStartLineNumber = activeIndentInfo.startLineNumber; + activeIndentEndLineNumber = activeIndentInfo.endLineNumber; + activeIndentLevel = activeIndentInfo.indent; + } + const { indentSize } = this._context.viewModel.model.getOptions(); + const result = []; + for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) { + const lineGuides = new Array(); + result.push(lineGuides); + const bracketGuidesInLine = bracketGuides ? bracketGuides[lineNumber - visibleStartLineNumber] : []; + const bracketGuidesInLineQueue = new ArrayQueue(bracketGuidesInLine); + const indentGuidesInLine = indentGuides ? indentGuides[lineNumber - visibleStartLineNumber] : 0; + for (let indentLvl = 1; indentLvl <= indentGuidesInLine; indentLvl++) { + const indentGuide = (indentLvl - 1) * indentSize + 1; + const isActive = ( + // Disable active indent guide if there are bracket guides. + (this._bracketPairGuideOptions.highlightActiveIndentation === "always" || bracketGuidesInLine.length === 0) && activeIndentStartLineNumber <= lineNumber && lineNumber <= activeIndentEndLineNumber && indentLvl === activeIndentLevel + ); + lineGuides.push(...bracketGuidesInLineQueue.takeWhile((g) => g.visibleColumn < indentGuide) || []); + const peeked = bracketGuidesInLineQueue.peek(); + if (!peeked || peeked.visibleColumn !== indentGuide || peeked.horizontalLine) { + lineGuides.push(new IndentGuide(indentGuide, -1, `core-guide-indent lvl-${(indentLvl - 1) % 30}` + (isActive ? " indent-active" : ""), null, -1, -1)); + } + } + lineGuides.push(...bracketGuidesInLineQueue.takeWhile((g) => true) || []); + } + return result; + } + render(startLineNumber, lineNumber) { + if (!this._renderResult) { + return ""; + } + const lineIndex = lineNumber - startLineNumber; + if (lineIndex < 0 || lineIndex >= this._renderResult.length) { + return ""; + } + return this._renderResult[lineIndex]; + } + }; + registerThemingParticipant((theme, collector) => { + const colors2 = [ + { bracketColor: editorBracketHighlightingForeground1, guideColor: editorBracketPairGuideBackground1, guideColorActive: editorBracketPairGuideActiveBackground1 }, + { bracketColor: editorBracketHighlightingForeground2, guideColor: editorBracketPairGuideBackground2, guideColorActive: editorBracketPairGuideActiveBackground2 }, + { bracketColor: editorBracketHighlightingForeground3, guideColor: editorBracketPairGuideBackground3, guideColorActive: editorBracketPairGuideActiveBackground3 }, + { bracketColor: editorBracketHighlightingForeground4, guideColor: editorBracketPairGuideBackground4, guideColorActive: editorBracketPairGuideActiveBackground4 }, + { bracketColor: editorBracketHighlightingForeground5, guideColor: editorBracketPairGuideBackground5, guideColorActive: editorBracketPairGuideActiveBackground5 }, + { bracketColor: editorBracketHighlightingForeground6, guideColor: editorBracketPairGuideBackground6, guideColorActive: editorBracketPairGuideActiveBackground6 } + ]; + const colorProvider = new BracketPairGuidesClassNames(); + const indentColors = [ + { indentColor: editorIndentGuide1, indentColorActive: editorActiveIndentGuide1 }, + { indentColor: editorIndentGuide2, indentColorActive: editorActiveIndentGuide2 }, + { indentColor: editorIndentGuide3, indentColorActive: editorActiveIndentGuide3 }, + { indentColor: editorIndentGuide4, indentColorActive: editorActiveIndentGuide4 }, + { indentColor: editorIndentGuide5, indentColorActive: editorActiveIndentGuide5 }, + { indentColor: editorIndentGuide6, indentColorActive: editorActiveIndentGuide6 } + ]; + const colorValues = colors2.map((c) => { + var _a10, _b4; + const bracketColor = theme.getColor(c.bracketColor); + const guideColor = theme.getColor(c.guideColor); + const guideColorActive = theme.getColor(c.guideColorActive); + const effectiveGuideColor = transparentToUndefined((_a10 = transparentToUndefined(guideColor)) !== null && _a10 !== void 0 ? _a10 : bracketColor === null || bracketColor === void 0 ? void 0 : bracketColor.transparent(0.3)); + const effectiveGuideColorActive = transparentToUndefined((_b4 = transparentToUndefined(guideColorActive)) !== null && _b4 !== void 0 ? _b4 : bracketColor); + if (!effectiveGuideColor || !effectiveGuideColorActive) { + return void 0; + } + return { + guideColor: effectiveGuideColor, + guideColorActive: effectiveGuideColorActive + }; + }).filter(isDefined); + const indentColorValues = indentColors.map((c) => { + const indentColor = theme.getColor(c.indentColor); + const indentColorActive = theme.getColor(c.indentColorActive); + const effectiveIndentColor = transparentToUndefined(indentColor); + const effectiveIndentColorActive = transparentToUndefined(indentColorActive); + if (!effectiveIndentColor || !effectiveIndentColorActive) { + return void 0; + } + return { + indentColor: effectiveIndentColor, + indentColorActive: effectiveIndentColorActive + }; + }).filter(isDefined); + if (colorValues.length > 0) { + for (let level = 0; level < 30; level++) { + const colors3 = colorValues[level % colorValues.length]; + collector.addRule(`.monaco-editor .${colorProvider.getInlineClassNameOfLevel(level).replace(/ /g, ".")} { --guide-color: ${colors3.guideColor}; --guide-color-active: ${colors3.guideColorActive}; }`); + } + collector.addRule(`.monaco-editor .vertical { box-shadow: 1px 0 0 0 var(--guide-color) inset; }`); + collector.addRule(`.monaco-editor .horizontal-top { border-top: 1px solid var(--guide-color); }`); + collector.addRule(`.monaco-editor .horizontal-bottom { border-bottom: 1px solid var(--guide-color); }`); + collector.addRule(`.monaco-editor .vertical.${colorProvider.activeClassName} { box-shadow: 1px 0 0 0 var(--guide-color-active) inset; }`); + collector.addRule(`.monaco-editor .horizontal-top.${colorProvider.activeClassName} { border-top: 1px solid var(--guide-color-active); }`); + collector.addRule(`.monaco-editor .horizontal-bottom.${colorProvider.activeClassName} { border-bottom: 1px solid var(--guide-color-active); }`); + } + if (indentColorValues.length > 0) { + for (let level = 0; level < 30; level++) { + const colors3 = indentColorValues[level % indentColorValues.length]; + collector.addRule(`.monaco-editor .lines-content .core-guide-indent.lvl-${level} { --indent-color: ${colors3.indentColor}; --indent-color-active: ${colors3.indentColorActive}; }`); + } + collector.addRule(`.monaco-editor .lines-content .core-guide-indent { box-shadow: 1px 0 0 0 var(--indent-color) inset; }`); + collector.addRule(`.monaco-editor .lines-content .core-guide-indent.indent-active { box-shadow: 1px 0 0 0 var(--indent-color-active) inset; }`); + } + }); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/lines/viewLines.css +var init_viewLines = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/lines/viewLines.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/lines/domReadingContext.js +var DomReadingContext; +var init_domReadingContext = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/lines/domReadingContext.js"() { + DomReadingContext = class { + get didDomLayout() { + return this._didDomLayout; + } + readClientRect() { + if (!this._clientRectRead) { + this._clientRectRead = true; + const rect = this._domNode.getBoundingClientRect(); + this.markDidDomLayout(); + this._clientRectDeltaLeft = rect.left; + this._clientRectScale = rect.width / this._domNode.offsetWidth; + } + } + get clientRectDeltaLeft() { + if (!this._clientRectRead) { + this.readClientRect(); + } + return this._clientRectDeltaLeft; + } + get clientRectScale() { + if (!this._clientRectRead) { + this.readClientRect(); + } + return this._clientRectScale; + } + constructor(_domNode, endNode) { + this._domNode = _domNode; + this.endNode = endNode; + this._didDomLayout = false; + this._clientRectDeltaLeft = 0; + this._clientRectScale = 1; + this._clientRectRead = false; + } + markDidDomLayout() { + this._didDomLayout = true; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/lines/viewLines.js +var LastRenderedData, HorizontalRevealRangeRequest, HorizontalRevealSelectionsRequest, ViewLines; +var init_viewLines2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/lines/viewLines.js"() { + init_mouseCursor2(); + init_async(); + init_platform(); + init_viewLines(); + init_domFontInfo(); + init_renderingContext(); + init_viewLayer(); + init_viewPart(); + init_domReadingContext(); + init_viewLine(); + init_position(); + init_range(); + LastRenderedData = class { + constructor() { + this._currentVisibleRange = new Range(1, 1, 1, 1); + } + getCurrentVisibleRange() { + return this._currentVisibleRange; + } + setCurrentVisibleRange(currentVisibleRange) { + this._currentVisibleRange = currentVisibleRange; + } + }; + HorizontalRevealRangeRequest = class { + constructor(minimalReveal, lineNumber, startColumn, endColumn, startScrollTop, stopScrollTop, scrollType) { + this.minimalReveal = minimalReveal; + this.lineNumber = lineNumber; + this.startColumn = startColumn; + this.endColumn = endColumn; + this.startScrollTop = startScrollTop; + this.stopScrollTop = stopScrollTop; + this.scrollType = scrollType; + this.type = "range"; + this.minLineNumber = lineNumber; + this.maxLineNumber = lineNumber; + } + }; + HorizontalRevealSelectionsRequest = class { + constructor(minimalReveal, selections, startScrollTop, stopScrollTop, scrollType) { + this.minimalReveal = minimalReveal; + this.selections = selections; + this.startScrollTop = startScrollTop; + this.stopScrollTop = stopScrollTop; + this.scrollType = scrollType; + this.type = "selections"; + let minLineNumber = selections[0].startLineNumber; + let maxLineNumber = selections[0].endLineNumber; + for (let i = 1, len = selections.length; i < len; i++) { + const selection = selections[i]; + minLineNumber = Math.min(minLineNumber, selection.startLineNumber); + maxLineNumber = Math.max(maxLineNumber, selection.endLineNumber); + } + this.minLineNumber = minLineNumber; + this.maxLineNumber = maxLineNumber; + } + }; + ViewLines = class _ViewLines extends ViewPart { + constructor(context, linesContent) { + super(context); + this._linesContent = linesContent; + this._textRangeRestingSpot = document.createElement("div"); + this._visibleLines = new VisibleLinesCollection(this); + this.domNode = this._visibleLines.domNode; + const conf81 = this._context.configuration; + const options2 = this._context.configuration.options; + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + const wrappingInfo = options2.get( + 146 + /* EditorOption.wrappingInfo */ + ); + this._lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this._typicalHalfwidthCharacterWidth = fontInfo.typicalHalfwidthCharacterWidth; + this._isViewportWrapping = wrappingInfo.isViewportWrapping; + this._revealHorizontalRightPadding = options2.get( + 100 + /* EditorOption.revealHorizontalRightPadding */ + ); + this._cursorSurroundingLines = options2.get( + 29 + /* EditorOption.cursorSurroundingLines */ + ); + this._cursorSurroundingLinesStyle = options2.get( + 30 + /* EditorOption.cursorSurroundingLinesStyle */ + ); + this._canUseLayerHinting = !options2.get( + 32 + /* EditorOption.disableLayerHinting */ + ); + this._viewLineOptions = new ViewLineOptions(conf81, this._context.theme.type); + PartFingerprints.write( + this.domNode, + 8 + /* PartFingerprint.ViewLines */ + ); + this.domNode.setClassName(`view-lines ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`); + applyFontInfo(this.domNode, fontInfo); + this._maxLineWidth = 0; + this._asyncUpdateLineWidths = new RunOnceScheduler(() => { + this._updateLineWidthsSlow(); + }, 200); + this._asyncCheckMonospaceFontAssumptions = new RunOnceScheduler(() => { + this._checkMonospaceFontAssumptions(); + }, 2e3); + this._lastRenderedData = new LastRenderedData(); + this._horizontalRevealRequest = null; + this._stickyScrollEnabled = options2.get( + 115 + /* EditorOption.stickyScroll */ + ).enabled; + this._maxNumberStickyLines = options2.get( + 115 + /* EditorOption.stickyScroll */ + ).maxLineCount; + } + dispose() { + this._asyncUpdateLineWidths.dispose(); + this._asyncCheckMonospaceFontAssumptions.dispose(); + super.dispose(); + } + getDomNode() { + return this.domNode; + } + // ---- begin IVisibleLinesHost + createVisibleLine() { + return new ViewLine(this._viewLineOptions); + } + // ---- end IVisibleLinesHost + // ---- begin view event handlers + onConfigurationChanged(e) { + this._visibleLines.onConfigurationChanged(e); + if (e.hasChanged( + 146 + /* EditorOption.wrappingInfo */ + )) { + this._maxLineWidth = 0; + } + const options2 = this._context.configuration.options; + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + const wrappingInfo = options2.get( + 146 + /* EditorOption.wrappingInfo */ + ); + this._lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this._typicalHalfwidthCharacterWidth = fontInfo.typicalHalfwidthCharacterWidth; + this._isViewportWrapping = wrappingInfo.isViewportWrapping; + this._revealHorizontalRightPadding = options2.get( + 100 + /* EditorOption.revealHorizontalRightPadding */ + ); + this._cursorSurroundingLines = options2.get( + 29 + /* EditorOption.cursorSurroundingLines */ + ); + this._cursorSurroundingLinesStyle = options2.get( + 30 + /* EditorOption.cursorSurroundingLinesStyle */ + ); + this._canUseLayerHinting = !options2.get( + 32 + /* EditorOption.disableLayerHinting */ + ); + this._stickyScrollEnabled = options2.get( + 115 + /* EditorOption.stickyScroll */ + ).enabled; + this._maxNumberStickyLines = options2.get( + 115 + /* EditorOption.stickyScroll */ + ).maxLineCount; + applyFontInfo(this.domNode, fontInfo); + this._onOptionsMaybeChanged(); + if (e.hasChanged( + 145 + /* EditorOption.layoutInfo */ + )) { + this._maxLineWidth = 0; + } + return true; + } + _onOptionsMaybeChanged() { + const conf81 = this._context.configuration; + const newViewLineOptions = new ViewLineOptions(conf81, this._context.theme.type); + if (!this._viewLineOptions.equals(newViewLineOptions)) { + this._viewLineOptions = newViewLineOptions; + const startLineNumber = this._visibleLines.getStartLineNumber(); + const endLineNumber = this._visibleLines.getEndLineNumber(); + for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { + const line = this._visibleLines.getVisibleLine(lineNumber); + line.onOptionsChanged(this._viewLineOptions); + } + return true; + } + return false; + } + onCursorStateChanged(e) { + const rendStartLineNumber = this._visibleLines.getStartLineNumber(); + const rendEndLineNumber = this._visibleLines.getEndLineNumber(); + let r = false; + for (let lineNumber = rendStartLineNumber; lineNumber <= rendEndLineNumber; lineNumber++) { + r = this._visibleLines.getVisibleLine(lineNumber).onSelectionChanged() || r; + } + return r; + } + onDecorationsChanged(e) { + if (true) { + const rendStartLineNumber = this._visibleLines.getStartLineNumber(); + const rendEndLineNumber = this._visibleLines.getEndLineNumber(); + for (let lineNumber = rendStartLineNumber; lineNumber <= rendEndLineNumber; lineNumber++) { + this._visibleLines.getVisibleLine(lineNumber).onDecorationsChanged(); + } + } + return true; + } + onFlushed(e) { + const shouldRender = this._visibleLines.onFlushed(e); + this._maxLineWidth = 0; + return shouldRender; + } + onLinesChanged(e) { + return this._visibleLines.onLinesChanged(e); + } + onLinesDeleted(e) { + return this._visibleLines.onLinesDeleted(e); + } + onLinesInserted(e) { + return this._visibleLines.onLinesInserted(e); + } + onRevealRangeRequest(e) { + const desiredScrollTop = this._computeScrollTopToRevealRange(this._context.viewLayout.getFutureViewport(), e.source, e.minimalReveal, e.range, e.selections, e.verticalType); + if (desiredScrollTop === -1) { + return false; + } + let newScrollPosition = this._context.viewLayout.validateScrollPosition({ scrollTop: desiredScrollTop }); + if (e.revealHorizontal) { + if (e.range && e.range.startLineNumber !== e.range.endLineNumber) { + newScrollPosition = { + scrollTop: newScrollPosition.scrollTop, + scrollLeft: 0 + }; + } else if (e.range) { + this._horizontalRevealRequest = new HorizontalRevealRangeRequest(e.minimalReveal, e.range.startLineNumber, e.range.startColumn, e.range.endColumn, this._context.viewLayout.getCurrentScrollTop(), newScrollPosition.scrollTop, e.scrollType); + } else if (e.selections && e.selections.length > 0) { + this._horizontalRevealRequest = new HorizontalRevealSelectionsRequest(e.minimalReveal, e.selections, this._context.viewLayout.getCurrentScrollTop(), newScrollPosition.scrollTop, e.scrollType); + } + } else { + this._horizontalRevealRequest = null; + } + const scrollTopDelta = Math.abs(this._context.viewLayout.getCurrentScrollTop() - newScrollPosition.scrollTop); + const scrollType = scrollTopDelta <= this._lineHeight ? 1 : e.scrollType; + this._context.viewModel.viewLayout.setScrollPosition(newScrollPosition, scrollType); + return true; + } + onScrollChanged(e) { + if (this._horizontalRevealRequest && e.scrollLeftChanged) { + this._horizontalRevealRequest = null; + } + if (this._horizontalRevealRequest && e.scrollTopChanged) { + const min = Math.min(this._horizontalRevealRequest.startScrollTop, this._horizontalRevealRequest.stopScrollTop); + const max = Math.max(this._horizontalRevealRequest.startScrollTop, this._horizontalRevealRequest.stopScrollTop); + if (e.scrollTop < min || e.scrollTop > max) { + this._horizontalRevealRequest = null; + } + } + this.domNode.setWidth(e.scrollWidth); + return this._visibleLines.onScrollChanged(e) || true; + } + onTokensChanged(e) { + return this._visibleLines.onTokensChanged(e); + } + onZonesChanged(e) { + this._context.viewModel.viewLayout.setMaxLineWidth(this._maxLineWidth); + return this._visibleLines.onZonesChanged(e); + } + onThemeChanged(e) { + return this._onOptionsMaybeChanged(); + } + // ---- end view event handlers + // ----------- HELPERS FOR OTHERS + getPositionFromDOMInfo(spanNode, offset) { + const viewLineDomNode = this._getViewLineDomNode(spanNode); + if (viewLineDomNode === null) { + return null; + } + const lineNumber = this._getLineNumberFor(viewLineDomNode); + if (lineNumber === -1) { + return null; + } + if (lineNumber < 1 || lineNumber > this._context.viewModel.getLineCount()) { + return null; + } + if (this._context.viewModel.getLineMaxColumn(lineNumber) === 1) { + return new Position(lineNumber, 1); + } + const rendStartLineNumber = this._visibleLines.getStartLineNumber(); + const rendEndLineNumber = this._visibleLines.getEndLineNumber(); + if (lineNumber < rendStartLineNumber || lineNumber > rendEndLineNumber) { + return null; + } + let column = this._visibleLines.getVisibleLine(lineNumber).getColumnOfNodeOffset(spanNode, offset); + const minColumn = this._context.viewModel.getLineMinColumn(lineNumber); + if (column < minColumn) { + column = minColumn; + } + return new Position(lineNumber, column); + } + _getViewLineDomNode(node) { + while (node && node.nodeType === 1) { + if (node.className === ViewLine.CLASS_NAME) { + return node; + } + node = node.parentElement; + } + return null; + } + /** + * @returns the line number of this view line dom node. + */ + _getLineNumberFor(domNode) { + const startLineNumber = this._visibleLines.getStartLineNumber(); + const endLineNumber = this._visibleLines.getEndLineNumber(); + for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { + const line = this._visibleLines.getVisibleLine(lineNumber); + if (domNode === line.getDomNode()) { + return lineNumber; + } + } + return -1; + } + getLineWidth(lineNumber) { + const rendStartLineNumber = this._visibleLines.getStartLineNumber(); + const rendEndLineNumber = this._visibleLines.getEndLineNumber(); + if (lineNumber < rendStartLineNumber || lineNumber > rendEndLineNumber) { + return -1; + } + const context = new DomReadingContext(this.domNode.domNode, this._textRangeRestingSpot); + const result = this._visibleLines.getVisibleLine(lineNumber).getWidth(context); + this._updateLineWidthsSlowIfDomDidLayout(context); + return result; + } + linesVisibleRangesForRange(_range, includeNewLines) { + if (this.shouldRender()) { + return null; + } + const originalEndLineNumber = _range.endLineNumber; + const range2 = Range.intersectRanges(_range, this._lastRenderedData.getCurrentVisibleRange()); + if (!range2) { + return null; + } + const visibleRanges = []; + let visibleRangesLen = 0; + const domReadingContext = new DomReadingContext(this.domNode.domNode, this._textRangeRestingSpot); + let nextLineModelLineNumber = 0; + if (includeNewLines) { + nextLineModelLineNumber = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(range2.startLineNumber, 1)).lineNumber; + } + const rendStartLineNumber = this._visibleLines.getStartLineNumber(); + const rendEndLineNumber = this._visibleLines.getEndLineNumber(); + for (let lineNumber = range2.startLineNumber; lineNumber <= range2.endLineNumber; lineNumber++) { + if (lineNumber < rendStartLineNumber || lineNumber > rendEndLineNumber) { + continue; + } + const startColumn = lineNumber === range2.startLineNumber ? range2.startColumn : 1; + const continuesInNextLine = lineNumber !== range2.endLineNumber; + const endColumn = continuesInNextLine ? this._context.viewModel.getLineMaxColumn(lineNumber) : range2.endColumn; + const visibleRangesForLine = this._visibleLines.getVisibleLine(lineNumber).getVisibleRangesForRange(lineNumber, startColumn, endColumn, domReadingContext); + if (!visibleRangesForLine) { + continue; + } + if (includeNewLines && lineNumber < originalEndLineNumber) { + const currentLineModelLineNumber = nextLineModelLineNumber; + nextLineModelLineNumber = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(lineNumber + 1, 1)).lineNumber; + if (currentLineModelLineNumber !== nextLineModelLineNumber) { + visibleRangesForLine.ranges[visibleRangesForLine.ranges.length - 1].width += this._typicalHalfwidthCharacterWidth; + } + } + visibleRanges[visibleRangesLen++] = new LineVisibleRanges(visibleRangesForLine.outsideRenderedLine, lineNumber, HorizontalRange.from(visibleRangesForLine.ranges), continuesInNextLine); + } + this._updateLineWidthsSlowIfDomDidLayout(domReadingContext); + if (visibleRangesLen === 0) { + return null; + } + return visibleRanges; + } + _visibleRangesForLineRange(lineNumber, startColumn, endColumn) { + if (this.shouldRender()) { + return null; + } + if (lineNumber < this._visibleLines.getStartLineNumber() || lineNumber > this._visibleLines.getEndLineNumber()) { + return null; + } + const domReadingContext = new DomReadingContext(this.domNode.domNode, this._textRangeRestingSpot); + const result = this._visibleLines.getVisibleLine(lineNumber).getVisibleRangesForRange(lineNumber, startColumn, endColumn, domReadingContext); + this._updateLineWidthsSlowIfDomDidLayout(domReadingContext); + return result; + } + visibleRangeForPosition(position) { + const visibleRanges = this._visibleRangesForLineRange(position.lineNumber, position.column, position.column); + if (!visibleRanges) { + return null; + } + return new HorizontalPosition(visibleRanges.outsideRenderedLine, visibleRanges.ranges[0].left); + } + /** + * Updates the max line width if it is fast to compute. + * Returns true if all lines were taken into account. + * Returns false if some lines need to be reevaluated (in a slow fashion). + */ + _updateLineWidthsFast() { + return this._updateLineWidths(true); + } + _updateLineWidthsSlow() { + this._updateLineWidths(false); + } + /** + * Update the line widths using DOM layout information after someone else + * has caused a synchronous layout. + */ + _updateLineWidthsSlowIfDomDidLayout(domReadingContext) { + if (!domReadingContext.didDomLayout) { + return; + } + if (this._asyncUpdateLineWidths.isScheduled()) { + return; + } + this._asyncUpdateLineWidths.cancel(); + this._updateLineWidthsSlow(); + } + _updateLineWidths(fast) { + const rendStartLineNumber = this._visibleLines.getStartLineNumber(); + const rendEndLineNumber = this._visibleLines.getEndLineNumber(); + let localMaxLineWidth = 1; + let allWidthsComputed = true; + for (let lineNumber = rendStartLineNumber; lineNumber <= rendEndLineNumber; lineNumber++) { + const visibleLine = this._visibleLines.getVisibleLine(lineNumber); + if (fast && !visibleLine.getWidthIsFast()) { + allWidthsComputed = false; + continue; + } + localMaxLineWidth = Math.max(localMaxLineWidth, visibleLine.getWidth(null)); + } + if (allWidthsComputed && rendStartLineNumber === 1 && rendEndLineNumber === this._context.viewModel.getLineCount()) { + this._maxLineWidth = 0; + } + this._ensureMaxLineWidth(localMaxLineWidth); + return allWidthsComputed; + } + _checkMonospaceFontAssumptions() { + let longestLineNumber = -1; + let longestWidth = -1; + const rendStartLineNumber = this._visibleLines.getStartLineNumber(); + const rendEndLineNumber = this._visibleLines.getEndLineNumber(); + for (let lineNumber = rendStartLineNumber; lineNumber <= rendEndLineNumber; lineNumber++) { + const visibleLine = this._visibleLines.getVisibleLine(lineNumber); + if (visibleLine.needsMonospaceFontCheck()) { + const lineWidth = visibleLine.getWidth(null); + if (lineWidth > longestWidth) { + longestWidth = lineWidth; + longestLineNumber = lineNumber; + } + } + } + if (longestLineNumber === -1) { + return; + } + if (!this._visibleLines.getVisibleLine(longestLineNumber).monospaceAssumptionsAreValid()) { + for (let lineNumber = rendStartLineNumber; lineNumber <= rendEndLineNumber; lineNumber++) { + const visibleLine = this._visibleLines.getVisibleLine(lineNumber); + visibleLine.onMonospaceAssumptionsInvalidated(); + } + } + } + prepareRender() { + throw new Error("Not supported"); + } + render() { + throw new Error("Not supported"); + } + renderText(viewportData) { + this._visibleLines.renderLines(viewportData); + this._lastRenderedData.setCurrentVisibleRange(viewportData.visibleRange); + this.domNode.setWidth(this._context.viewLayout.getScrollWidth()); + this.domNode.setHeight(Math.min(this._context.viewLayout.getScrollHeight(), 1e6)); + if (this._horizontalRevealRequest) { + const horizontalRevealRequest = this._horizontalRevealRequest; + if (viewportData.startLineNumber <= horizontalRevealRequest.minLineNumber && horizontalRevealRequest.maxLineNumber <= viewportData.endLineNumber) { + this._horizontalRevealRequest = null; + this.onDidRender(); + const newScrollLeft = this._computeScrollLeftToReveal(horizontalRevealRequest); + if (newScrollLeft) { + if (!this._isViewportWrapping) { + this._ensureMaxLineWidth(newScrollLeft.maxHorizontalOffset); + } + this._context.viewModel.viewLayout.setScrollPosition({ + scrollLeft: newScrollLeft.scrollLeft + }, horizontalRevealRequest.scrollType); + } + } + } + if (!this._updateLineWidthsFast()) { + this._asyncUpdateLineWidths.schedule(); + } else { + this._asyncUpdateLineWidths.cancel(); + } + if (isLinux && !this._asyncCheckMonospaceFontAssumptions.isScheduled()) { + const rendStartLineNumber = this._visibleLines.getStartLineNumber(); + const rendEndLineNumber = this._visibleLines.getEndLineNumber(); + for (let lineNumber = rendStartLineNumber; lineNumber <= rendEndLineNumber; lineNumber++) { + const visibleLine = this._visibleLines.getVisibleLine(lineNumber); + if (visibleLine.needsMonospaceFontCheck()) { + this._asyncCheckMonospaceFontAssumptions.schedule(); + break; + } + } + } + this._linesContent.setLayerHinting(this._canUseLayerHinting); + this._linesContent.setContain("strict"); + const adjustedScrollTop = this._context.viewLayout.getCurrentScrollTop() - viewportData.bigNumbersDelta; + this._linesContent.setTop(-adjustedScrollTop); + this._linesContent.setLeft(-this._context.viewLayout.getCurrentScrollLeft()); + } + // --- width + _ensureMaxLineWidth(lineWidth) { + const iLineWidth = Math.ceil(lineWidth); + if (this._maxLineWidth < iLineWidth) { + this._maxLineWidth = iLineWidth; + this._context.viewModel.viewLayout.setMaxLineWidth(this._maxLineWidth); + } + } + _computeScrollTopToRevealRange(viewport, source, minimalReveal, range2, selections, verticalType) { + const viewportStartY = viewport.top; + const viewportHeight = viewport.height; + const viewportEndY = viewportStartY + viewportHeight; + let boxIsSingleRange; + let boxStartY; + let boxEndY; + if (selections && selections.length > 0) { + let minLineNumber = selections[0].startLineNumber; + let maxLineNumber = selections[0].endLineNumber; + for (let i = 1, len = selections.length; i < len; i++) { + const selection = selections[i]; + minLineNumber = Math.min(minLineNumber, selection.startLineNumber); + maxLineNumber = Math.max(maxLineNumber, selection.endLineNumber); + } + boxIsSingleRange = false; + boxStartY = this._context.viewLayout.getVerticalOffsetForLineNumber(minLineNumber); + boxEndY = this._context.viewLayout.getVerticalOffsetForLineNumber(maxLineNumber) + this._lineHeight; + } else if (range2) { + boxIsSingleRange = true; + boxStartY = this._context.viewLayout.getVerticalOffsetForLineNumber(range2.startLineNumber); + boxEndY = this._context.viewLayout.getVerticalOffsetForLineNumber(range2.endLineNumber) + this._lineHeight; + } else { + return -1; + } + const shouldIgnoreScrollOff = (source === "mouse" || minimalReveal) && this._cursorSurroundingLinesStyle === "default"; + let paddingTop = 0; + let paddingBottom = 0; + if (!shouldIgnoreScrollOff) { + const context = Math.min(viewportHeight / this._lineHeight / 2, this._cursorSurroundingLines); + if (this._stickyScrollEnabled) { + paddingTop = Math.max(context, this._maxNumberStickyLines) * this._lineHeight; + } else { + paddingTop = context * this._lineHeight; + } + paddingBottom = Math.max(0, context - 1) * this._lineHeight; + } else { + if (!minimalReveal) { + paddingTop = this._lineHeight; + } + } + if (!minimalReveal) { + if (verticalType === 0 || verticalType === 4) { + paddingBottom += this._lineHeight; + } + } + boxStartY -= paddingTop; + boxEndY += paddingBottom; + let newScrollTop; + if (boxEndY - boxStartY > viewportHeight) { + if (!boxIsSingleRange) { + return -1; + } + newScrollTop = boxStartY; + } else if (verticalType === 5 || verticalType === 6) { + if (verticalType === 6 && viewportStartY <= boxStartY && boxEndY <= viewportEndY) { + newScrollTop = viewportStartY; + } else { + const desiredGapAbove = Math.max(5 * this._lineHeight, viewportHeight * 0.2); + const desiredScrollTop = boxStartY - desiredGapAbove; + const minScrollTop = boxEndY - viewportHeight; + newScrollTop = Math.max(minScrollTop, desiredScrollTop); + } + } else if (verticalType === 1 || verticalType === 2) { + if (verticalType === 2 && viewportStartY <= boxStartY && boxEndY <= viewportEndY) { + newScrollTop = viewportStartY; + } else { + const boxMiddleY = (boxStartY + boxEndY) / 2; + newScrollTop = Math.max(0, boxMiddleY - viewportHeight / 2); + } + } else { + newScrollTop = this._computeMinimumScrolling( + viewportStartY, + viewportEndY, + boxStartY, + boxEndY, + verticalType === 3, + verticalType === 4 + /* viewEvents.VerticalRevealType.Bottom */ + ); + } + return newScrollTop; + } + _computeScrollLeftToReveal(horizontalRevealRequest) { + const viewport = this._context.viewLayout.getCurrentViewport(); + const layoutInfo = this._context.configuration.options.get( + 145 + /* EditorOption.layoutInfo */ + ); + const viewportStartX = viewport.left; + const viewportEndX = viewportStartX + viewport.width - layoutInfo.verticalScrollbarWidth; + let boxStartX = 1073741824; + let boxEndX = 0; + if (horizontalRevealRequest.type === "range") { + const visibleRanges = this._visibleRangesForLineRange(horizontalRevealRequest.lineNumber, horizontalRevealRequest.startColumn, horizontalRevealRequest.endColumn); + if (!visibleRanges) { + return null; + } + for (const visibleRange of visibleRanges.ranges) { + boxStartX = Math.min(boxStartX, Math.round(visibleRange.left)); + boxEndX = Math.max(boxEndX, Math.round(visibleRange.left + visibleRange.width)); + } + } else { + for (const selection of horizontalRevealRequest.selections) { + if (selection.startLineNumber !== selection.endLineNumber) { + return null; + } + const visibleRanges = this._visibleRangesForLineRange(selection.startLineNumber, selection.startColumn, selection.endColumn); + if (!visibleRanges) { + return null; + } + for (const visibleRange of visibleRanges.ranges) { + boxStartX = Math.min(boxStartX, Math.round(visibleRange.left)); + boxEndX = Math.max(boxEndX, Math.round(visibleRange.left + visibleRange.width)); + } + } + } + if (!horizontalRevealRequest.minimalReveal) { + boxStartX = Math.max(0, boxStartX - _ViewLines.HORIZONTAL_EXTRA_PX); + boxEndX += this._revealHorizontalRightPadding; + } + if (horizontalRevealRequest.type === "selections" && boxEndX - boxStartX > viewport.width) { + return null; + } + const newScrollLeft = this._computeMinimumScrolling(viewportStartX, viewportEndX, boxStartX, boxEndX); + return { + scrollLeft: newScrollLeft, + maxHorizontalOffset: boxEndX + }; + } + _computeMinimumScrolling(viewportStart, viewportEnd, boxStart, boxEnd, revealAtStart, revealAtEnd) { + viewportStart = viewportStart | 0; + viewportEnd = viewportEnd | 0; + boxStart = boxStart | 0; + boxEnd = boxEnd | 0; + revealAtStart = !!revealAtStart; + revealAtEnd = !!revealAtEnd; + const viewportLength = viewportEnd - viewportStart; + const boxLength = boxEnd - boxStart; + if (boxLength < viewportLength) { + if (revealAtStart) { + return boxStart; + } + if (revealAtEnd) { + return Math.max(0, boxEnd - viewportLength); + } + if (boxStart < viewportStart) { + return boxStart; + } else if (boxEnd > viewportEnd) { + return Math.max(0, boxEnd - viewportLength); + } + } else { + return boxStart; + } + return viewportStart; + } + }; + ViewLines.HORIZONTAL_EXTRA_PX = 30; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/linesDecorations/linesDecorations.css +var init_linesDecorations = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/linesDecorations/linesDecorations.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/linesDecorations/linesDecorations.js +var LinesDecorationsOverlay; +var init_linesDecorations2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/linesDecorations/linesDecorations.js"() { + init_linesDecorations(); + init_glyphMargin2(); + LinesDecorationsOverlay = class extends DedupOverlay { + constructor(context) { + super(); + this._context = context; + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._decorationsLeft = layoutInfo.decorationsLeft; + this._decorationsWidth = layoutInfo.decorationsWidth; + this._renderResult = null; + this._context.addEventHandler(this); + } + dispose() { + this._context.removeEventHandler(this); + this._renderResult = null; + super.dispose(); + } + // --- begin event handlers + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._decorationsLeft = layoutInfo.decorationsLeft; + this._decorationsWidth = layoutInfo.decorationsWidth; + return true; + } + onDecorationsChanged(e) { + return true; + } + onFlushed(e) { + return true; + } + onLinesChanged(e) { + return true; + } + onLinesDeleted(e) { + return true; + } + onLinesInserted(e) { + return true; + } + onScrollChanged(e) { + return e.scrollTopChanged; + } + onZonesChanged(e) { + return true; + } + // --- end event handlers + _getDecorations(ctx) { + var _a10, _b4; + const decorations = ctx.getDecorationsInViewport(); + const r = []; + let rLen = 0; + for (let i = 0, len = decorations.length; i < len; i++) { + const d = decorations[i]; + const linesDecorationsClassName = d.options.linesDecorationsClassName; + const zIndex = d.options.zIndex; + if (linesDecorationsClassName) { + r[rLen++] = new DecorationToRender(d.range.startLineNumber, d.range.endLineNumber, linesDecorationsClassName, (_a10 = d.options.linesDecorationsTooltip) !== null && _a10 !== void 0 ? _a10 : null, zIndex); + } + const firstLineDecorationClassName = d.options.firstLineDecorationClassName; + if (firstLineDecorationClassName) { + r[rLen++] = new DecorationToRender(d.range.startLineNumber, d.range.startLineNumber, firstLineDecorationClassName, (_b4 = d.options.linesDecorationsTooltip) !== null && _b4 !== void 0 ? _b4 : null, zIndex); + } + } + return r; + } + prepareRender(ctx) { + const visibleStartLineNumber = ctx.visibleRange.startLineNumber; + const visibleEndLineNumber = ctx.visibleRange.endLineNumber; + const toRender = this._render(visibleStartLineNumber, visibleEndLineNumber, this._getDecorations(ctx)); + const left = this._decorationsLeft.toString(); + const width2 = this._decorationsWidth.toString(); + const common = '" style="left:' + left + "px;width:" + width2 + 'px;">'; + const output = []; + for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) { + const lineIndex = lineNumber - visibleStartLineNumber; + const decorations = toRender[lineIndex].getDecorations(); + let lineOutput = ""; + for (const decoration3 of decorations) { + let addition = '
'; + } + output[lineIndex] = lineOutput; + } + this._renderResult = output; + } + render(startLineNumber, lineNumber) { + if (!this._renderResult) { + return ""; + } + return this._renderResult[lineNumber - startLineNumber]; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/minimap/minimap.css +var init_minimap = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/minimap/minimap.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/rgba.js +var RGBA8; +var init_rgba = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/rgba.js"() { + RGBA8 = class _RGBA8 { + constructor(r, g, b, a3) { + this._rgba8Brand = void 0; + this.r = _RGBA8._clamp(r); + this.g = _RGBA8._clamp(g); + this.b = _RGBA8._clamp(b); + this.a = _RGBA8._clamp(a3); + } + equals(other) { + return this.r === other.r && this.g === other.g && this.b === other.b && this.a === other.a; + } + static _clamp(c) { + if (c < 0) { + return 0; + } + if (c > 255) { + return 255; + } + return c | 0; + } + }; + RGBA8.Empty = new RGBA8(0, 0, 0, 0); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewModel/minimapTokensColorTracker.js +var MinimapTokensColorTracker; +var init_minimapTokensColorTracker = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewModel/minimapTokensColorTracker.js"() { + init_event(); + init_lifecycle(); + init_rgba(); + init_languages(); + MinimapTokensColorTracker = class _MinimapTokensColorTracker extends Disposable { + static getInstance() { + if (!this._INSTANCE) { + this._INSTANCE = markAsSingleton(new _MinimapTokensColorTracker()); + } + return this._INSTANCE; + } + constructor() { + super(); + this._onDidChange = new Emitter(); + this.onDidChange = this._onDidChange.event; + this._updateColorMap(); + this._register(TokenizationRegistry2.onDidChange((e) => { + if (e.changedColorMap) { + this._updateColorMap(); + } + })); + } + _updateColorMap() { + const colorMap = TokenizationRegistry2.getColorMap(); + if (!colorMap) { + this._colors = [RGBA8.Empty]; + this._backgroundIsLight = true; + return; + } + this._colors = [RGBA8.Empty]; + for (let colorId = 1; colorId < colorMap.length; colorId++) { + const source = colorMap[colorId].rgba; + this._colors[colorId] = new RGBA8(source.r, source.g, source.b, Math.round(source.a * 255)); + } + const backgroundLuminosity = colorMap[ + 2 + /* ColorId.DefaultBackground */ + ].getRelativeLuminance(); + this._backgroundIsLight = backgroundLuminosity >= 0.5; + this._onDidChange.fire(void 0); + } + getColor(colorId) { + if (colorId < 1 || colorId >= this._colors.length) { + colorId = 2; + } + return this._colors[colorId]; + } + backgroundIsLight() { + return this._backgroundIsLight; + } + }; + MinimapTokensColorTracker._INSTANCE = null; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/minimap/minimapCharSheet.js +var allCharCodes, getCharIndex; +var init_minimapCharSheet = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/minimap/minimapCharSheet.js"() { + allCharCodes = (() => { + const v = []; + for (let i = 32; i <= 126; i++) { + v.push(i); + } + v.push( + 65533 + /* Constants.UNKNOWN_CODE */ + ); + return v; + })(); + getCharIndex = (chCode, fontScale) => { + chCode -= 32; + if (chCode < 0 || chCode > 96) { + if (fontScale <= 2) { + return (chCode + 96) % 96; + } + return 96 - 1; + } + return chCode; + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/minimap/minimapCharRenderer.js +var MinimapCharRenderer; +var init_minimapCharRenderer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/minimap/minimapCharRenderer.js"() { + init_minimapCharSheet(); + init_uint(); + MinimapCharRenderer = class _MinimapCharRenderer { + constructor(charData, scale) { + this.scale = scale; + this._minimapCharRendererBrand = void 0; + this.charDataNormal = _MinimapCharRenderer.soften(charData, 12 / 15); + this.charDataLight = _MinimapCharRenderer.soften(charData, 50 / 60); + } + static soften(input, ratio) { + const result = new Uint8ClampedArray(input.length); + for (let i = 0, len = input.length; i < len; i++) { + result[i] = toUint8(input[i] * ratio); + } + return result; + } + renderChar(target, dx, dy, chCode, color, foregroundAlpha, backgroundColor, backgroundAlpha, fontScale, useLighterFont, force1pxHeight) { + const charWidth = 1 * this.scale; + const charHeight = 2 * this.scale; + const renderHeight = force1pxHeight ? 1 : charHeight; + if (dx + charWidth > target.width || dy + renderHeight > target.height) { + console.warn("bad render request outside image data"); + return; + } + const charData = useLighterFont ? this.charDataLight : this.charDataNormal; + const charIndex = getCharIndex(chCode, fontScale); + const destWidth = target.width * 4; + const backgroundR = backgroundColor.r; + const backgroundG = backgroundColor.g; + const backgroundB = backgroundColor.b; + const deltaR = color.r - backgroundR; + const deltaG = color.g - backgroundG; + const deltaB = color.b - backgroundB; + const destAlpha = Math.max(foregroundAlpha, backgroundAlpha); + const dest = target.data; + let sourceOffset = charIndex * charWidth * charHeight; + let row = dy * destWidth + dx * 4; + for (let y = 0; y < renderHeight; y++) { + let column = row; + for (let x = 0; x < charWidth; x++) { + const c = charData[sourceOffset++] / 255 * (foregroundAlpha / 255); + dest[column++] = backgroundR + deltaR * c; + dest[column++] = backgroundG + deltaG * c; + dest[column++] = backgroundB + deltaB * c; + dest[column++] = destAlpha; + } + row += destWidth; + } + } + blockRenderChar(target, dx, dy, color, foregroundAlpha, backgroundColor, backgroundAlpha, force1pxHeight) { + const charWidth = 1 * this.scale; + const charHeight = 2 * this.scale; + const renderHeight = force1pxHeight ? 1 : charHeight; + if (dx + charWidth > target.width || dy + renderHeight > target.height) { + console.warn("bad render request outside image data"); + return; + } + const destWidth = target.width * 4; + const c = 0.5 * (foregroundAlpha / 255); + const backgroundR = backgroundColor.r; + const backgroundG = backgroundColor.g; + const backgroundB = backgroundColor.b; + const deltaR = color.r - backgroundR; + const deltaG = color.g - backgroundG; + const deltaB = color.b - backgroundB; + const colorR = backgroundR + deltaR * c; + const colorG = backgroundG + deltaG * c; + const colorB = backgroundB + deltaB * c; + const destAlpha = Math.max(foregroundAlpha, backgroundAlpha); + const dest = target.data; + let row = dy * destWidth + dx * 4; + for (let y = 0; y < renderHeight; y++) { + let column = row; + for (let x = 0; x < charWidth; x++) { + dest[column++] = colorR; + dest[column++] = colorG; + dest[column++] = colorB; + dest[column++] = destAlpha; + } + row += destWidth; + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/minimap/minimapPreBaked.js +var charTable, decodeData, prebakedMiniMaps; +var init_minimapPreBaked = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/minimap/minimapPreBaked.js"() { + init_functional(); + charTable = { + "0": 0, + "1": 1, + "2": 2, + "3": 3, + "4": 4, + "5": 5, + "6": 6, + "7": 7, + "8": 8, + "9": 9, + A: 10, + B: 11, + C: 12, + D: 13, + E: 14, + F: 15 + }; + decodeData = (str) => { + const output = new Uint8ClampedArray(str.length / 2); + for (let i = 0; i < str.length; i += 2) { + output[i >> 1] = charTable[str[i]] << 4 | charTable[str[i + 1]] & 15; + } + return output; + }; + prebakedMiniMaps = { + 1: createSingleCallFunction(() => decodeData("0000511D6300CF609C709645A78432005642574171487021003C451900274D35D762755E8B629C5BA856AF57BA649530C167D1512A272A3F6038604460398526BCA2A968DB6F8957C768BE5FBE2FB467CF5D8D5B795DC7625B5DFF50DE64C466DB2FC47CD860A65E9A2EB96CB54CE06DA763AB2EA26860524D3763536601005116008177A8705E53AB738E6A982F88BAA35B5F5B626D9C636B449B737E5B7B678598869A662F6B5B8542706C704C80736A607578685B70594A49715A4522E792")), + 2: createSingleCallFunction(() => decodeData("000000000000000055394F383D2800008B8B1F210002000081B1CBCBCC820000847AAF6B9AAF2119BE08B8881AD60000A44FD07DCCF107015338130C00000000385972265F390B406E2437634B4B48031B12B8A0847000001E15B29A402F0000000000004B33460B00007A752C2A0000000000004D3900000084394B82013400ABA5CFC7AD9C0302A45A3E5A98AB000089A43382D97900008BA54AA087A70A0248A6A7AE6DBE0000BF6F94987EA40A01A06DCFA7A7A9030496C32F77891D0000A99FB1A0AFA80603B29AB9CA75930D010C0948354D3900000C0948354F37460D0028BE673D8400000000AF9D7B6E00002B007AA8933400007AA642675C2700007984CFB9C3985B768772A8A6B7B20000CAAECAAFC4B700009F94A6009F840009D09F9BA4CA9C0000CC8FC76DC87F0000C991C472A2000000A894A48CA7B501079BA2C9C69BA20000B19A5D3FA89000005CA6009DA2960901B0A7F0669FB200009D009E00B7890000DAD0F5D092820000D294D4C48BD10000B5A7A4A3B1A50402CAB6CBA6A2000000B5A7A4A3B1A8044FCDADD19D9CB00000B7778F7B8AAE0803C9AB5D3F5D3F00009EA09EA0BAB006039EA0989A8C7900009B9EF4D6B7C00000A9A7816CACA80000ABAC84705D3F000096DA635CDC8C00006F486F266F263D4784006124097B00374F6D2D6D2D6D4A3A95872322000000030000000000008D8939130000000000002E22A5C9CBC70600AB25C0B5C9B400061A2DB04CA67001082AA6BEBEBFC606002321DACBC19E03087AA08B6768380000282FBAC0B8CA7A88AD25BBA5A29900004C396C5894A6000040485A6E356E9442A32CD17EADA70000B4237923628600003E2DE9C1D7B500002F25BBA5A2990000231DB6AFB4A804023025C0B5CAB588062B2CBDBEC0C706882435A75CA20000002326BD6A82A908048B4B9A5A668000002423A09CB4BB060025259C9D8A7900001C1FCAB2C7C700002A2A9387ABA200002626A4A47D6E9D14333163A0C87500004B6F9C2D643A257049364936493647358A34438355497F1A0000A24C1D590000D38DFFBDD4CD3126")) + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/minimap/minimapCharRendererFactory.js +var MinimapCharRendererFactory; +var init_minimapCharRendererFactory = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/minimap/minimapCharRendererFactory.js"() { + init_minimapCharRenderer(); + init_minimapCharSheet(); + init_minimapPreBaked(); + init_uint(); + MinimapCharRendererFactory = class _MinimapCharRendererFactory { + /** + * Creates a new character renderer factory with the given scale. + */ + static create(scale, fontFamily) { + if (this.lastCreated && scale === this.lastCreated.scale && fontFamily === this.lastFontFamily) { + return this.lastCreated; + } + let factory; + if (prebakedMiniMaps[scale]) { + factory = new MinimapCharRenderer(prebakedMiniMaps[scale](), scale); + } else { + factory = _MinimapCharRendererFactory.createFromSampleData(_MinimapCharRendererFactory.createSampleData(fontFamily).data, scale); + } + this.lastFontFamily = fontFamily; + this.lastCreated = factory; + return factory; + } + /** + * Creates the font sample data, writing to a canvas. + */ + static createSampleData(fontFamily) { + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + canvas.style.height = `${16}px`; + canvas.height = 16; + canvas.width = 96 * 10; + canvas.style.width = 96 * 10 + "px"; + ctx.fillStyle = "#ffffff"; + ctx.font = `bold ${16}px ${fontFamily}`; + ctx.textBaseline = "middle"; + let x = 0; + for (const code of allCharCodes) { + ctx.fillText(String.fromCharCode(code), x, 16 / 2); + x += 10; + } + return ctx.getImageData( + 0, + 0, + 96 * 10, + 16 + /* Constants.SAMPLED_CHAR_HEIGHT */ + ); + } + /** + * Creates a character renderer from the canvas sample data. + */ + static createFromSampleData(source, scale) { + const expectedLength = 16 * 10 * 4 * 96; + if (source.length !== expectedLength) { + throw new Error("Unexpected source in MinimapCharRenderer"); + } + const charData = _MinimapCharRendererFactory._downsample(source, scale); + return new MinimapCharRenderer(charData, scale); + } + static _downsampleChar(source, sourceOffset, dest, destOffset, scale) { + const width2 = 1 * scale; + const height = 2 * scale; + let targetIndex = destOffset; + let brightest = 0; + for (let y = 0; y < height; y++) { + const sourceY1 = y / height * 16; + const sourceY2 = (y + 1) / height * 16; + for (let x = 0; x < width2; x++) { + const sourceX1 = x / width2 * 10; + const sourceX2 = (x + 1) / width2 * 10; + let value = 0; + let samples = 0; + for (let sy = sourceY1; sy < sourceY2; sy++) { + const sourceRow = sourceOffset + Math.floor(sy) * 3840; + const yBalance = 1 - (sy - Math.floor(sy)); + for (let sx = sourceX1; sx < sourceX2; sx++) { + const xBalance = 1 - (sx - Math.floor(sx)); + const sourceIndex = sourceRow + Math.floor(sx) * 4; + const weight5 = xBalance * yBalance; + samples += weight5; + value += source[sourceIndex] * source[sourceIndex + 3] / 255 * weight5; + } + } + const final = value / samples; + brightest = Math.max(brightest, final); + dest[targetIndex++] = toUint8(final); + } + } + return brightest; + } + static _downsample(data, scale) { + const pixelsPerCharacter = 2 * scale * 1 * scale; + const resultLen = pixelsPerCharacter * 96; + const result = new Uint8ClampedArray(resultLen); + let resultOffset = 0; + let sourceOffset = 0; + let brightest = 0; + for (let charIndex = 0; charIndex < 96; charIndex++) { + brightest = Math.max(brightest, this._downsampleChar(data, sourceOffset, result, resultOffset, scale)); + resultOffset += pixelsPerCharacter; + sourceOffset += 10 * 4; + } + if (brightest > 0) { + const adjust = 255 / brightest; + for (let i = 0; i < resultLen; i++) { + result[i] *= adjust; + } + } + return result; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/fonts.js +var DEFAULT_FONT_FAMILY; +var init_fonts = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/fonts.js"() { + init_platform(); + DEFAULT_FONT_FAMILY = isWindows ? '"Segoe WPC", "Segoe UI", sans-serif' : isMacintosh ? "-apple-system, BlinkMacSystemFont, sans-serif" : 'system-ui, "Ubuntu", "Droid Sans", sans-serif'; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/minimap/minimap.js +var POINTER_DRAG_RESET_DISTANCE2, GUTTER_DECORATION_WIDTH, MinimapOptions, MinimapLayout, MinimapLine, RenderData, MinimapBuffers, MinimapSamplingState, Minimap, InnerMinimap, ContiguousLineMap; +var init_minimap2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/minimap/minimap.js"() { + init_minimap(); + init_dom(); + init_fastDomNode(); + init_globalPointerMoveMonitor(); + init_lifecycle(); + init_platform(); + init_strings(); + init_viewLayer(); + init_viewPart(); + init_editorOptions(); + init_range(); + init_rgba(); + init_minimapTokensColorTracker(); + init_viewModel(); + init_colorRegistry(); + init_selection(); + init_touch(); + init_minimapCharRendererFactory(); + init_functional(); + init_map(); + init_fonts(); + POINTER_DRAG_RESET_DISTANCE2 = 140; + GUTTER_DECORATION_WIDTH = 2; + MinimapOptions = class _MinimapOptions { + constructor(configuration, theme, tokensColorTracker) { + const options2 = configuration.options; + const pixelRatio = options2.get( + 143 + /* EditorOption.pixelRatio */ + ); + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + const minimapLayout = layoutInfo.minimap; + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + const minimapOpts = options2.get( + 73 + /* EditorOption.minimap */ + ); + this.renderMinimap = minimapLayout.renderMinimap; + this.size = minimapOpts.size; + this.minimapHeightIsEditorHeight = minimapLayout.minimapHeightIsEditorHeight; + this.scrollBeyondLastLine = options2.get( + 105 + /* EditorOption.scrollBeyondLastLine */ + ); + this.paddingTop = options2.get( + 84 + /* EditorOption.padding */ + ).top; + this.paddingBottom = options2.get( + 84 + /* EditorOption.padding */ + ).bottom; + this.showSlider = minimapOpts.showSlider; + this.autohide = minimapOpts.autohide; + this.pixelRatio = pixelRatio; + this.typicalHalfwidthCharacterWidth = fontInfo.typicalHalfwidthCharacterWidth; + this.lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this.minimapLeft = minimapLayout.minimapLeft; + this.minimapWidth = minimapLayout.minimapWidth; + this.minimapHeight = layoutInfo.height; + this.canvasInnerWidth = minimapLayout.minimapCanvasInnerWidth; + this.canvasInnerHeight = minimapLayout.minimapCanvasInnerHeight; + this.canvasOuterWidth = minimapLayout.minimapCanvasOuterWidth; + this.canvasOuterHeight = minimapLayout.minimapCanvasOuterHeight; + this.isSampling = minimapLayout.minimapIsSampling; + this.editorHeight = layoutInfo.height; + this.fontScale = minimapLayout.minimapScale; + this.minimapLineHeight = minimapLayout.minimapLineHeight; + this.minimapCharWidth = 1 * this.fontScale; + this.sectionHeaderFontFamily = DEFAULT_FONT_FAMILY; + this.sectionHeaderFontSize = minimapOpts.sectionHeaderFontSize * pixelRatio; + this.sectionHeaderLetterSpacing = minimapOpts.sectionHeaderLetterSpacing; + this.sectionHeaderFontColor = _MinimapOptions._getSectionHeaderColor(theme, tokensColorTracker.getColor( + 1 + /* ColorId.DefaultForeground */ + )); + this.charRenderer = createSingleCallFunction(() => MinimapCharRendererFactory.create(this.fontScale, fontInfo.fontFamily)); + this.defaultBackgroundColor = tokensColorTracker.getColor( + 2 + /* ColorId.DefaultBackground */ + ); + this.backgroundColor = _MinimapOptions._getMinimapBackground(theme, this.defaultBackgroundColor); + this.foregroundAlpha = _MinimapOptions._getMinimapForegroundOpacity(theme); + } + static _getMinimapBackground(theme, defaultBackgroundColor) { + const themeColor = theme.getColor(minimapBackground); + if (themeColor) { + return new RGBA8(themeColor.rgba.r, themeColor.rgba.g, themeColor.rgba.b, Math.round(255 * themeColor.rgba.a)); + } + return defaultBackgroundColor; + } + static _getMinimapForegroundOpacity(theme) { + const themeColor = theme.getColor(minimapForegroundOpacity); + if (themeColor) { + return RGBA8._clamp(Math.round(255 * themeColor.rgba.a)); + } + return 255; + } + static _getSectionHeaderColor(theme, defaultForegroundColor) { + const themeColor = theme.getColor(editorForeground); + if (themeColor) { + return new RGBA8(themeColor.rgba.r, themeColor.rgba.g, themeColor.rgba.b, Math.round(255 * themeColor.rgba.a)); + } + return defaultForegroundColor; + } + equals(other) { + return this.renderMinimap === other.renderMinimap && this.size === other.size && this.minimapHeightIsEditorHeight === other.minimapHeightIsEditorHeight && this.scrollBeyondLastLine === other.scrollBeyondLastLine && this.paddingTop === other.paddingTop && this.paddingBottom === other.paddingBottom && this.showSlider === other.showSlider && this.autohide === other.autohide && this.pixelRatio === other.pixelRatio && this.typicalHalfwidthCharacterWidth === other.typicalHalfwidthCharacterWidth && this.lineHeight === other.lineHeight && this.minimapLeft === other.minimapLeft && this.minimapWidth === other.minimapWidth && this.minimapHeight === other.minimapHeight && this.canvasInnerWidth === other.canvasInnerWidth && this.canvasInnerHeight === other.canvasInnerHeight && this.canvasOuterWidth === other.canvasOuterWidth && this.canvasOuterHeight === other.canvasOuterHeight && this.isSampling === other.isSampling && this.editorHeight === other.editorHeight && this.fontScale === other.fontScale && this.minimapLineHeight === other.minimapLineHeight && this.minimapCharWidth === other.minimapCharWidth && this.sectionHeaderFontSize === other.sectionHeaderFontSize && this.sectionHeaderLetterSpacing === other.sectionHeaderLetterSpacing && this.defaultBackgroundColor && this.defaultBackgroundColor.equals(other.defaultBackgroundColor) && this.backgroundColor && this.backgroundColor.equals(other.backgroundColor) && this.foregroundAlpha === other.foregroundAlpha; + } + }; + MinimapLayout = class _MinimapLayout { + constructor(scrollTop, scrollHeight, sliderNeeded, _computedSliderRatio, sliderTop, sliderHeight, topPaddingLineCount, startLineNumber, endLineNumber) { + this.scrollTop = scrollTop; + this.scrollHeight = scrollHeight; + this.sliderNeeded = sliderNeeded; + this._computedSliderRatio = _computedSliderRatio; + this.sliderTop = sliderTop; + this.sliderHeight = sliderHeight; + this.topPaddingLineCount = topPaddingLineCount; + this.startLineNumber = startLineNumber; + this.endLineNumber = endLineNumber; + } + /** + * Compute a desired `scrollPosition` such that the slider moves by `delta`. + */ + getDesiredScrollTopFromDelta(delta) { + return Math.round(this.scrollTop + delta / this._computedSliderRatio); + } + getDesiredScrollTopFromTouchLocation(pageY) { + return Math.round((pageY - this.sliderHeight / 2) / this._computedSliderRatio); + } + /** + * Intersect a line range with `this.startLineNumber` and `this.endLineNumber`. + */ + intersectWithViewport(range2) { + const startLineNumber = Math.max(this.startLineNumber, range2.startLineNumber); + const endLineNumber = Math.min(this.endLineNumber, range2.endLineNumber); + if (startLineNumber > endLineNumber) { + return null; + } + return [startLineNumber, endLineNumber]; + } + /** + * Get the inner minimap y coordinate for a line number. + */ + getYForLineNumber(lineNumber, minimapLineHeight) { + return +(lineNumber - this.startLineNumber + this.topPaddingLineCount) * minimapLineHeight; + } + static create(options2, viewportStartLineNumber, viewportEndLineNumber, viewportStartLineNumberVerticalOffset, viewportHeight, viewportContainsWhitespaceGaps, lineCount, realLineCount, scrollTop, scrollHeight, previousLayout) { + const pixelRatio = options2.pixelRatio; + const minimapLineHeight = options2.minimapLineHeight; + const minimapLinesFitting = Math.floor(options2.canvasInnerHeight / minimapLineHeight); + const lineHeight = options2.lineHeight; + if (options2.minimapHeightIsEditorHeight) { + let logicalScrollHeight = realLineCount * options2.lineHeight + options2.paddingTop + options2.paddingBottom; + if (options2.scrollBeyondLastLine) { + logicalScrollHeight += Math.max(0, viewportHeight - options2.lineHeight - options2.paddingBottom); + } + const sliderHeight2 = Math.max(1, Math.floor(viewportHeight * viewportHeight / logicalScrollHeight)); + const maxMinimapSliderTop2 = Math.max(0, options2.minimapHeight - sliderHeight2); + const computedSliderRatio2 = maxMinimapSliderTop2 / (scrollHeight - viewportHeight); + const sliderTop2 = scrollTop * computedSliderRatio2; + const sliderNeeded = maxMinimapSliderTop2 > 0; + const maxLinesFitting = Math.floor(options2.canvasInnerHeight / options2.minimapLineHeight); + const topPaddingLineCount = Math.floor(options2.paddingTop / options2.lineHeight); + return new _MinimapLayout(scrollTop, scrollHeight, sliderNeeded, computedSliderRatio2, sliderTop2, sliderHeight2, topPaddingLineCount, 1, Math.min(lineCount, maxLinesFitting)); + } + let sliderHeight; + if (viewportContainsWhitespaceGaps && viewportEndLineNumber !== lineCount) { + const viewportLineCount = viewportEndLineNumber - viewportStartLineNumber + 1; + sliderHeight = Math.floor(viewportLineCount * minimapLineHeight / pixelRatio); + } else { + const expectedViewportLineCount = viewportHeight / lineHeight; + sliderHeight = Math.floor(expectedViewportLineCount * minimapLineHeight / pixelRatio); + } + const extraLinesAtTheTop = Math.floor(options2.paddingTop / lineHeight); + let extraLinesAtTheBottom = Math.floor(options2.paddingBottom / lineHeight); + if (options2.scrollBeyondLastLine) { + const expectedViewportLineCount = viewportHeight / lineHeight; + extraLinesAtTheBottom = Math.max(extraLinesAtTheBottom, expectedViewportLineCount - 1); + } + let maxMinimapSliderTop; + if (extraLinesAtTheBottom > 0) { + const expectedViewportLineCount = viewportHeight / lineHeight; + maxMinimapSliderTop = (extraLinesAtTheTop + lineCount + extraLinesAtTheBottom - expectedViewportLineCount - 1) * minimapLineHeight / pixelRatio; + } else { + maxMinimapSliderTop = Math.max(0, (extraLinesAtTheTop + lineCount) * minimapLineHeight / pixelRatio - sliderHeight); + } + maxMinimapSliderTop = Math.min(options2.minimapHeight - sliderHeight, maxMinimapSliderTop); + const computedSliderRatio = maxMinimapSliderTop / (scrollHeight - viewportHeight); + const sliderTop = scrollTop * computedSliderRatio; + if (minimapLinesFitting >= extraLinesAtTheTop + lineCount + extraLinesAtTheBottom) { + const sliderNeeded = maxMinimapSliderTop > 0; + return new _MinimapLayout(scrollTop, scrollHeight, sliderNeeded, computedSliderRatio, sliderTop, sliderHeight, extraLinesAtTheTop, 1, lineCount); + } else { + let consideringStartLineNumber; + if (viewportStartLineNumber > 1) { + consideringStartLineNumber = viewportStartLineNumber + extraLinesAtTheTop; + } else { + consideringStartLineNumber = Math.max(1, scrollTop / lineHeight); + } + let topPaddingLineCount; + let startLineNumber = Math.max(1, Math.floor(consideringStartLineNumber - sliderTop * pixelRatio / minimapLineHeight)); + if (startLineNumber < extraLinesAtTheTop) { + topPaddingLineCount = extraLinesAtTheTop - startLineNumber + 1; + startLineNumber = 1; + } else { + topPaddingLineCount = 0; + startLineNumber = Math.max(1, startLineNumber - extraLinesAtTheTop); + } + if (previousLayout && previousLayout.scrollHeight === scrollHeight) { + if (previousLayout.scrollTop > scrollTop) { + startLineNumber = Math.min(startLineNumber, previousLayout.startLineNumber); + topPaddingLineCount = Math.max(topPaddingLineCount, previousLayout.topPaddingLineCount); + } + if (previousLayout.scrollTop < scrollTop) { + startLineNumber = Math.max(startLineNumber, previousLayout.startLineNumber); + topPaddingLineCount = Math.min(topPaddingLineCount, previousLayout.topPaddingLineCount); + } + } + const endLineNumber = Math.min(lineCount, startLineNumber - topPaddingLineCount + minimapLinesFitting - 1); + const partialLine = (scrollTop - viewportStartLineNumberVerticalOffset) / lineHeight; + let sliderTopAligned; + if (scrollTop >= options2.paddingTop) { + sliderTopAligned = (viewportStartLineNumber - startLineNumber + topPaddingLineCount + partialLine) * minimapLineHeight / pixelRatio; + } else { + sliderTopAligned = scrollTop / options2.paddingTop * (topPaddingLineCount + partialLine) * minimapLineHeight / pixelRatio; + } + return new _MinimapLayout(scrollTop, scrollHeight, true, computedSliderRatio, sliderTopAligned, sliderHeight, topPaddingLineCount, startLineNumber, endLineNumber); + } + } + }; + MinimapLine = class { + constructor(dy) { + this.dy = dy; + } + onContentChanged() { + this.dy = -1; + } + onTokensChanged() { + this.dy = -1; + } + }; + MinimapLine.INVALID = new MinimapLine(-1); + RenderData = class { + constructor(renderedLayout, imageData, lines) { + this.renderedLayout = renderedLayout; + this._imageData = imageData; + this._renderedLines = new RenderedLinesCollection(() => MinimapLine.INVALID); + this._renderedLines._set(renderedLayout.startLineNumber, lines); + } + /** + * Check if the current RenderData matches accurately the new desired layout and no painting is needed. + */ + linesEquals(layout2) { + if (!this.scrollEquals(layout2)) { + return false; + } + const tmp = this._renderedLines._get(); + const lines = tmp.lines; + for (let i = 0, len = lines.length; i < len; i++) { + if (lines[i].dy === -1) { + return false; + } + } + return true; + } + /** + * Check if the current RenderData matches the new layout's scroll position + */ + scrollEquals(layout2) { + return this.renderedLayout.startLineNumber === layout2.startLineNumber && this.renderedLayout.endLineNumber === layout2.endLineNumber; + } + _get() { + const tmp = this._renderedLines._get(); + return { + imageData: this._imageData, + rendLineNumberStart: tmp.rendLineNumberStart, + lines: tmp.lines + }; + } + onLinesChanged(changeFromLineNumber, changeCount) { + return this._renderedLines.onLinesChanged(changeFromLineNumber, changeCount); + } + onLinesDeleted(deleteFromLineNumber, deleteToLineNumber) { + this._renderedLines.onLinesDeleted(deleteFromLineNumber, deleteToLineNumber); + } + onLinesInserted(insertFromLineNumber, insertToLineNumber) { + this._renderedLines.onLinesInserted(insertFromLineNumber, insertToLineNumber); + } + onTokensChanged(ranges) { + return this._renderedLines.onTokensChanged(ranges); + } + }; + MinimapBuffers = class _MinimapBuffers { + constructor(ctx, WIDTH, HEIGHT, background) { + this._backgroundFillData = _MinimapBuffers._createBackgroundFillData(WIDTH, HEIGHT, background); + this._buffers = [ + ctx.createImageData(WIDTH, HEIGHT), + ctx.createImageData(WIDTH, HEIGHT) + ]; + this._lastUsedBuffer = 0; + } + getBuffer() { + this._lastUsedBuffer = 1 - this._lastUsedBuffer; + const result = this._buffers[this._lastUsedBuffer]; + result.data.set(this._backgroundFillData); + return result; + } + static _createBackgroundFillData(WIDTH, HEIGHT, background) { + const backgroundR = background.r; + const backgroundG = background.g; + const backgroundB = background.b; + const backgroundA = background.a; + const result = new Uint8ClampedArray(WIDTH * HEIGHT * 4); + let offset = 0; + for (let i = 0; i < HEIGHT; i++) { + for (let j = 0; j < WIDTH; j++) { + result[offset] = backgroundR; + result[offset + 1] = backgroundG; + result[offset + 2] = backgroundB; + result[offset + 3] = backgroundA; + offset += 4; + } + } + return result; + } + }; + MinimapSamplingState = class _MinimapSamplingState { + static compute(options2, viewLineCount, oldSamplingState) { + if (options2.renderMinimap === 0 || !options2.isSampling) { + return [null, []]; + } + const { minimapLineCount } = EditorLayoutInfoComputer.computeContainedMinimapLineCount({ + viewLineCount, + scrollBeyondLastLine: options2.scrollBeyondLastLine, + paddingTop: options2.paddingTop, + paddingBottom: options2.paddingBottom, + height: options2.editorHeight, + lineHeight: options2.lineHeight, + pixelRatio: options2.pixelRatio + }); + const ratio = viewLineCount / minimapLineCount; + const halfRatio = ratio / 2; + if (!oldSamplingState || oldSamplingState.minimapLines.length === 0) { + const result2 = []; + result2[0] = 1; + if (minimapLineCount > 1) { + for (let i = 0, lastIndex = minimapLineCount - 1; i < lastIndex; i++) { + result2[i] = Math.round(i * ratio + halfRatio); + } + result2[minimapLineCount - 1] = viewLineCount; + } + return [new _MinimapSamplingState(ratio, result2), []]; + } + const oldMinimapLines = oldSamplingState.minimapLines; + const oldLength = oldMinimapLines.length; + const result = []; + let oldIndex = 0; + let oldDeltaLineCount = 0; + let minViewLineNumber = 1; + const MAX_EVENT_COUNT = 10; + let events = []; + let lastEvent = null; + for (let i = 0; i < minimapLineCount; i++) { + const fromViewLineNumber = Math.max(minViewLineNumber, Math.round(i * ratio)); + const toViewLineNumber = Math.max(fromViewLineNumber, Math.round((i + 1) * ratio)); + while (oldIndex < oldLength && oldMinimapLines[oldIndex] < fromViewLineNumber) { + if (events.length < MAX_EVENT_COUNT) { + const oldMinimapLineNumber = oldIndex + 1 + oldDeltaLineCount; + if (lastEvent && lastEvent.type === "deleted" && lastEvent._oldIndex === oldIndex - 1) { + lastEvent.deleteToLineNumber++; + } else { + lastEvent = { type: "deleted", _oldIndex: oldIndex, deleteFromLineNumber: oldMinimapLineNumber, deleteToLineNumber: oldMinimapLineNumber }; + events.push(lastEvent); + } + oldDeltaLineCount--; + } + oldIndex++; + } + let selectedViewLineNumber; + if (oldIndex < oldLength && oldMinimapLines[oldIndex] <= toViewLineNumber) { + selectedViewLineNumber = oldMinimapLines[oldIndex]; + oldIndex++; + } else { + if (i === 0) { + selectedViewLineNumber = 1; + } else if (i + 1 === minimapLineCount) { + selectedViewLineNumber = viewLineCount; + } else { + selectedViewLineNumber = Math.round(i * ratio + halfRatio); + } + if (events.length < MAX_EVENT_COUNT) { + const oldMinimapLineNumber = oldIndex + 1 + oldDeltaLineCount; + if (lastEvent && lastEvent.type === "inserted" && lastEvent._i === i - 1) { + lastEvent.insertToLineNumber++; + } else { + lastEvent = { type: "inserted", _i: i, insertFromLineNumber: oldMinimapLineNumber, insertToLineNumber: oldMinimapLineNumber }; + events.push(lastEvent); + } + oldDeltaLineCount++; + } + } + result[i] = selectedViewLineNumber; + minViewLineNumber = selectedViewLineNumber; + } + if (events.length < MAX_EVENT_COUNT) { + while (oldIndex < oldLength) { + const oldMinimapLineNumber = oldIndex + 1 + oldDeltaLineCount; + if (lastEvent && lastEvent.type === "deleted" && lastEvent._oldIndex === oldIndex - 1) { + lastEvent.deleteToLineNumber++; + } else { + lastEvent = { type: "deleted", _oldIndex: oldIndex, deleteFromLineNumber: oldMinimapLineNumber, deleteToLineNumber: oldMinimapLineNumber }; + events.push(lastEvent); + } + oldDeltaLineCount--; + oldIndex++; + } + } else { + events = [{ type: "flush" }]; + } + return [new _MinimapSamplingState(ratio, result), events]; + } + constructor(samplingRatio, minimapLines) { + this.samplingRatio = samplingRatio; + this.minimapLines = minimapLines; + } + modelLineToMinimapLine(lineNumber) { + return Math.min(this.minimapLines.length, Math.max(1, Math.round(lineNumber / this.samplingRatio))); + } + /** + * Will return null if the model line ranges are not intersecting with a sampled model line. + */ + modelLineRangeToMinimapLineRange(fromLineNumber, toLineNumber) { + let fromLineIndex = this.modelLineToMinimapLine(fromLineNumber) - 1; + while (fromLineIndex > 0 && this.minimapLines[fromLineIndex - 1] >= fromLineNumber) { + fromLineIndex--; + } + let toLineIndex = this.modelLineToMinimapLine(toLineNumber) - 1; + while (toLineIndex + 1 < this.minimapLines.length && this.minimapLines[toLineIndex + 1] <= toLineNumber) { + toLineIndex++; + } + if (fromLineIndex === toLineIndex) { + const sampledLineNumber = this.minimapLines[fromLineIndex]; + if (sampledLineNumber < fromLineNumber || sampledLineNumber > toLineNumber) { + return null; + } + } + return [fromLineIndex + 1, toLineIndex + 1]; + } + /** + * Will always return a range, even if it is not intersecting with a sampled model line. + */ + decorationLineRangeToMinimapLineRange(startLineNumber, endLineNumber) { + let minimapLineStart = this.modelLineToMinimapLine(startLineNumber); + let minimapLineEnd = this.modelLineToMinimapLine(endLineNumber); + if (startLineNumber !== endLineNumber && minimapLineEnd === minimapLineStart) { + if (minimapLineEnd === this.minimapLines.length) { + if (minimapLineStart > 1) { + minimapLineStart--; + } + } else { + minimapLineEnd++; + } + } + return [minimapLineStart, minimapLineEnd]; + } + onLinesDeleted(e) { + const deletedLineCount = e.toLineNumber - e.fromLineNumber + 1; + let changeStartIndex = this.minimapLines.length; + let changeEndIndex = 0; + for (let i = this.minimapLines.length - 1; i >= 0; i--) { + if (this.minimapLines[i] < e.fromLineNumber) { + break; + } + if (this.minimapLines[i] <= e.toLineNumber) { + this.minimapLines[i] = Math.max(1, e.fromLineNumber - 1); + changeStartIndex = Math.min(changeStartIndex, i); + changeEndIndex = Math.max(changeEndIndex, i); + } else { + this.minimapLines[i] -= deletedLineCount; + } + } + return [changeStartIndex, changeEndIndex]; + } + onLinesInserted(e) { + const insertedLineCount = e.toLineNumber - e.fromLineNumber + 1; + for (let i = this.minimapLines.length - 1; i >= 0; i--) { + if (this.minimapLines[i] < e.fromLineNumber) { + break; + } + this.minimapLines[i] += insertedLineCount; + } + } + }; + Minimap = class extends ViewPart { + constructor(context) { + super(context); + this._sectionHeaderCache = new LRUCache(10, 1.5); + this.tokensColorTracker = MinimapTokensColorTracker.getInstance(); + this._selections = []; + this._minimapSelections = null; + this.options = new MinimapOptions(this._context.configuration, this._context.theme, this.tokensColorTracker); + const [samplingState] = MinimapSamplingState.compute(this.options, this._context.viewModel.getLineCount(), null); + this._samplingState = samplingState; + this._shouldCheckSampling = false; + this._actual = new InnerMinimap(context.theme, this); + } + dispose() { + this._actual.dispose(); + super.dispose(); + } + getDomNode() { + return this._actual.getDomNode(); + } + _onOptionsMaybeChanged() { + const opts = new MinimapOptions(this._context.configuration, this._context.theme, this.tokensColorTracker); + if (this.options.equals(opts)) { + return false; + } + this.options = opts; + this._recreateLineSampling(); + this._actual.onDidChangeOptions(); + return true; + } + // ---- begin view event handlers + onConfigurationChanged(e) { + return this._onOptionsMaybeChanged(); + } + onCursorStateChanged(e) { + this._selections = e.selections; + this._minimapSelections = null; + return this._actual.onSelectionChanged(); + } + onDecorationsChanged(e) { + if (e.affectsMinimap) { + return this._actual.onDecorationsChanged(); + } + return false; + } + onFlushed(e) { + if (this._samplingState) { + this._shouldCheckSampling = true; + } + return this._actual.onFlushed(); + } + onLinesChanged(e) { + if (this._samplingState) { + const minimapLineRange = this._samplingState.modelLineRangeToMinimapLineRange(e.fromLineNumber, e.fromLineNumber + e.count - 1); + if (minimapLineRange) { + return this._actual.onLinesChanged(minimapLineRange[0], minimapLineRange[1] - minimapLineRange[0] + 1); + } else { + return false; + } + } else { + return this._actual.onLinesChanged(e.fromLineNumber, e.count); + } + } + onLinesDeleted(e) { + if (this._samplingState) { + const [changeStartIndex, changeEndIndex] = this._samplingState.onLinesDeleted(e); + if (changeStartIndex <= changeEndIndex) { + this._actual.onLinesChanged(changeStartIndex + 1, changeEndIndex - changeStartIndex + 1); + } + this._shouldCheckSampling = true; + return true; + } else { + return this._actual.onLinesDeleted(e.fromLineNumber, e.toLineNumber); + } + } + onLinesInserted(e) { + if (this._samplingState) { + this._samplingState.onLinesInserted(e); + this._shouldCheckSampling = true; + return true; + } else { + return this._actual.onLinesInserted(e.fromLineNumber, e.toLineNumber); + } + } + onScrollChanged(e) { + return this._actual.onScrollChanged(); + } + onThemeChanged(e) { + this._actual.onThemeChanged(); + this._onOptionsMaybeChanged(); + return true; + } + onTokensChanged(e) { + if (this._samplingState) { + const ranges = []; + for (const range2 of e.ranges) { + const minimapLineRange = this._samplingState.modelLineRangeToMinimapLineRange(range2.fromLineNumber, range2.toLineNumber); + if (minimapLineRange) { + ranges.push({ fromLineNumber: minimapLineRange[0], toLineNumber: minimapLineRange[1] }); + } + } + if (ranges.length) { + return this._actual.onTokensChanged(ranges); + } else { + return false; + } + } else { + return this._actual.onTokensChanged(e.ranges); + } + } + onTokensColorsChanged(e) { + this._onOptionsMaybeChanged(); + return this._actual.onTokensColorsChanged(); + } + onZonesChanged(e) { + return this._actual.onZonesChanged(); + } + // --- end event handlers + prepareRender(ctx) { + if (this._shouldCheckSampling) { + this._shouldCheckSampling = false; + this._recreateLineSampling(); + } + } + render(ctx) { + let viewportStartLineNumber = ctx.visibleRange.startLineNumber; + let viewportEndLineNumber = ctx.visibleRange.endLineNumber; + if (this._samplingState) { + viewportStartLineNumber = this._samplingState.modelLineToMinimapLine(viewportStartLineNumber); + viewportEndLineNumber = this._samplingState.modelLineToMinimapLine(viewportEndLineNumber); + } + const minimapCtx = { + viewportContainsWhitespaceGaps: ctx.viewportData.whitespaceViewportData.length > 0, + scrollWidth: ctx.scrollWidth, + scrollHeight: ctx.scrollHeight, + viewportStartLineNumber, + viewportEndLineNumber, + viewportStartLineNumberVerticalOffset: ctx.getVerticalOffsetForLineNumber(viewportStartLineNumber), + scrollTop: ctx.scrollTop, + scrollLeft: ctx.scrollLeft, + viewportWidth: ctx.viewportWidth, + viewportHeight: ctx.viewportHeight + }; + this._actual.render(minimapCtx); + } + //#region IMinimapModel + _recreateLineSampling() { + this._minimapSelections = null; + const wasSampling = Boolean(this._samplingState); + const [samplingState, events] = MinimapSamplingState.compute(this.options, this._context.viewModel.getLineCount(), this._samplingState); + this._samplingState = samplingState; + if (wasSampling && this._samplingState) { + for (const event of events) { + switch (event.type) { + case "deleted": + this._actual.onLinesDeleted(event.deleteFromLineNumber, event.deleteToLineNumber); + break; + case "inserted": + this._actual.onLinesInserted(event.insertFromLineNumber, event.insertToLineNumber); + break; + case "flush": + this._actual.onFlushed(); + break; + } + } + } + } + getLineCount() { + if (this._samplingState) { + return this._samplingState.minimapLines.length; + } + return this._context.viewModel.getLineCount(); + } + getRealLineCount() { + return this._context.viewModel.getLineCount(); + } + getLineContent(lineNumber) { + if (this._samplingState) { + return this._context.viewModel.getLineContent(this._samplingState.minimapLines[lineNumber - 1]); + } + return this._context.viewModel.getLineContent(lineNumber); + } + getLineMaxColumn(lineNumber) { + if (this._samplingState) { + return this._context.viewModel.getLineMaxColumn(this._samplingState.minimapLines[lineNumber - 1]); + } + return this._context.viewModel.getLineMaxColumn(lineNumber); + } + getMinimapLinesRenderingData(startLineNumber, endLineNumber, needed) { + if (this._samplingState) { + const result = []; + for (let lineIndex = 0, lineCount = endLineNumber - startLineNumber + 1; lineIndex < lineCount; lineIndex++) { + if (needed[lineIndex]) { + result[lineIndex] = this._context.viewModel.getViewLineData(this._samplingState.minimapLines[startLineNumber + lineIndex - 1]); + } else { + result[lineIndex] = null; + } + } + return result; + } + return this._context.viewModel.getMinimapLinesRenderingData(startLineNumber, endLineNumber, needed).data; + } + getSelections() { + if (this._minimapSelections === null) { + if (this._samplingState) { + this._minimapSelections = []; + for (const selection of this._selections) { + const [minimapLineStart, minimapLineEnd] = this._samplingState.decorationLineRangeToMinimapLineRange(selection.startLineNumber, selection.endLineNumber); + this._minimapSelections.push(new Selection(minimapLineStart, selection.startColumn, minimapLineEnd, selection.endColumn)); + } + } else { + this._minimapSelections = this._selections; + } + } + return this._minimapSelections; + } + getMinimapDecorationsInViewport(startLineNumber, endLineNumber) { + const decorations = this._getMinimapDecorationsInViewport(startLineNumber, endLineNumber).filter((decoration3) => { + var _a10; + return !((_a10 = decoration3.options.minimap) === null || _a10 === void 0 ? void 0 : _a10.sectionHeaderStyle); + }); + if (this._samplingState) { + const result = []; + for (const decoration3 of decorations) { + if (!decoration3.options.minimap) { + continue; + } + const range2 = decoration3.range; + const minimapStartLineNumber = this._samplingState.modelLineToMinimapLine(range2.startLineNumber); + const minimapEndLineNumber = this._samplingState.modelLineToMinimapLine(range2.endLineNumber); + result.push(new ViewModelDecoration(new Range(minimapStartLineNumber, range2.startColumn, minimapEndLineNumber, range2.endColumn), decoration3.options)); + } + return result; + } + return decorations; + } + getSectionHeaderDecorationsInViewport(startLineNumber, endLineNumber) { + const minimapLineHeight = this.options.minimapLineHeight; + const sectionHeaderFontSize = this.options.sectionHeaderFontSize; + const headerHeightInMinimapLines = sectionHeaderFontSize / minimapLineHeight; + startLineNumber = Math.floor(Math.max(1, startLineNumber - headerHeightInMinimapLines)); + return this._getMinimapDecorationsInViewport(startLineNumber, endLineNumber).filter((decoration3) => { + var _a10; + return !!((_a10 = decoration3.options.minimap) === null || _a10 === void 0 ? void 0 : _a10.sectionHeaderStyle); + }); + } + _getMinimapDecorationsInViewport(startLineNumber, endLineNumber) { + let visibleRange; + if (this._samplingState) { + const modelStartLineNumber = this._samplingState.minimapLines[startLineNumber - 1]; + const modelEndLineNumber = this._samplingState.minimapLines[endLineNumber - 1]; + visibleRange = new Range(modelStartLineNumber, 1, modelEndLineNumber, this._context.viewModel.getLineMaxColumn(modelEndLineNumber)); + } else { + visibleRange = new Range(startLineNumber, 1, endLineNumber, this._context.viewModel.getLineMaxColumn(endLineNumber)); + } + return this._context.viewModel.getMinimapDecorationsInRange(visibleRange); + } + getSectionHeaderText(decoration3, fitWidth) { + var _a10; + const headerText = (_a10 = decoration3.options.minimap) === null || _a10 === void 0 ? void 0 : _a10.sectionHeaderText; + if (!headerText) { + return null; + } + const cachedText = this._sectionHeaderCache.get(headerText); + if (cachedText) { + return cachedText; + } + const fittedText = fitWidth(headerText); + this._sectionHeaderCache.set(headerText, fittedText); + return fittedText; + } + getOptions() { + return this._context.viewModel.model.getOptions(); + } + revealLineNumber(lineNumber) { + if (this._samplingState) { + lineNumber = this._samplingState.minimapLines[lineNumber - 1]; + } + this._context.viewModel.revealRange( + "mouse", + false, + new Range(lineNumber, 1, lineNumber, 1), + 1, + 0 + /* ScrollType.Smooth */ + ); + } + setScrollTop(scrollTop) { + this._context.viewModel.viewLayout.setScrollPosition( + { + scrollTop + }, + 1 + /* ScrollType.Immediate */ + ); + } + }; + InnerMinimap = class _InnerMinimap extends Disposable { + constructor(theme, model) { + super(); + this._renderDecorations = false; + this._gestureInProgress = false; + this._theme = theme; + this._model = model; + this._lastRenderData = null; + this._buffers = null; + this._selectionColor = this._theme.getColor(minimapSelection); + this._domNode = createFastDomNode(document.createElement("div")); + PartFingerprints.write( + this._domNode, + 9 + /* PartFingerprint.Minimap */ + ); + this._domNode.setClassName(this._getMinimapDomNodeClassName()); + this._domNode.setPosition("absolute"); + this._domNode.setAttribute("role", "presentation"); + this._domNode.setAttribute("aria-hidden", "true"); + this._shadow = createFastDomNode(document.createElement("div")); + this._shadow.setClassName("minimap-shadow-hidden"); + this._domNode.appendChild(this._shadow); + this._canvas = createFastDomNode(document.createElement("canvas")); + this._canvas.setPosition("absolute"); + this._canvas.setLeft(0); + this._domNode.appendChild(this._canvas); + this._decorationsCanvas = createFastDomNode(document.createElement("canvas")); + this._decorationsCanvas.setPosition("absolute"); + this._decorationsCanvas.setClassName("minimap-decorations-layer"); + this._decorationsCanvas.setLeft(0); + this._domNode.appendChild(this._decorationsCanvas); + this._slider = createFastDomNode(document.createElement("div")); + this._slider.setPosition("absolute"); + this._slider.setClassName("minimap-slider"); + this._slider.setLayerHinting(true); + this._slider.setContain("strict"); + this._domNode.appendChild(this._slider); + this._sliderHorizontal = createFastDomNode(document.createElement("div")); + this._sliderHorizontal.setPosition("absolute"); + this._sliderHorizontal.setClassName("minimap-slider-horizontal"); + this._slider.appendChild(this._sliderHorizontal); + this._applyLayout(); + this._pointerDownListener = addStandardDisposableListener(this._domNode.domNode, EventType.POINTER_DOWN, (e) => { + e.preventDefault(); + const renderMinimap = this._model.options.renderMinimap; + if (renderMinimap === 0) { + return; + } + if (!this._lastRenderData) { + return; + } + if (this._model.options.size !== "proportional") { + if (e.button === 0 && this._lastRenderData) { + const position = getDomNodePagePosition(this._slider.domNode); + const initialPosY = position.top + position.height / 2; + this._startSliderDragging(e, initialPosY, this._lastRenderData.renderedLayout); + } + return; + } + const minimapLineHeight = this._model.options.minimapLineHeight; + const internalOffsetY = this._model.options.canvasInnerHeight / this._model.options.canvasOuterHeight * e.offsetY; + const lineIndex = Math.floor(internalOffsetY / minimapLineHeight); + let lineNumber = lineIndex + this._lastRenderData.renderedLayout.startLineNumber - this._lastRenderData.renderedLayout.topPaddingLineCount; + lineNumber = Math.min(lineNumber, this._model.getLineCount()); + this._model.revealLineNumber(lineNumber); + }); + this._sliderPointerMoveMonitor = new GlobalPointerMoveMonitor(); + this._sliderPointerDownListener = addStandardDisposableListener(this._slider.domNode, EventType.POINTER_DOWN, (e) => { + e.preventDefault(); + e.stopPropagation(); + if (e.button === 0 && this._lastRenderData) { + this._startSliderDragging(e, e.pageY, this._lastRenderData.renderedLayout); + } + }); + this._gestureDisposable = Gesture.addTarget(this._domNode.domNode); + this._sliderTouchStartListener = addDisposableListener(this._domNode.domNode, EventType2.Start, (e) => { + e.preventDefault(); + e.stopPropagation(); + if (this._lastRenderData) { + this._slider.toggleClassName("active", true); + this._gestureInProgress = true; + this.scrollDueToTouchEvent(e); + } + }, { passive: false }); + this._sliderTouchMoveListener = addDisposableListener(this._domNode.domNode, EventType2.Change, (e) => { + e.preventDefault(); + e.stopPropagation(); + if (this._lastRenderData && this._gestureInProgress) { + this.scrollDueToTouchEvent(e); + } + }, { passive: false }); + this._sliderTouchEndListener = addStandardDisposableListener(this._domNode.domNode, EventType2.End, (e) => { + e.preventDefault(); + e.stopPropagation(); + this._gestureInProgress = false; + this._slider.toggleClassName("active", false); + }); + } + _startSliderDragging(e, initialPosY, initialSliderState) { + if (!e.target || !(e.target instanceof Element)) { + return; + } + const initialPosX = e.pageX; + this._slider.toggleClassName("active", true); + const handlePointerMove = (posy, posx) => { + const minimapPosition = getDomNodePagePosition(this._domNode.domNode); + const pointerOrthogonalDelta = Math.min(Math.abs(posx - initialPosX), Math.abs(posx - minimapPosition.left), Math.abs(posx - minimapPosition.left - minimapPosition.width)); + if (isWindows && pointerOrthogonalDelta > POINTER_DRAG_RESET_DISTANCE2) { + this._model.setScrollTop(initialSliderState.scrollTop); + return; + } + const pointerDelta = posy - initialPosY; + this._model.setScrollTop(initialSliderState.getDesiredScrollTopFromDelta(pointerDelta)); + }; + if (e.pageY !== initialPosY) { + handlePointerMove(e.pageY, initialPosX); + } + this._sliderPointerMoveMonitor.startMonitoring(e.target, e.pointerId, e.buttons, (pointerMoveData) => handlePointerMove(pointerMoveData.pageY, pointerMoveData.pageX), () => { + this._slider.toggleClassName("active", false); + }); + } + scrollDueToTouchEvent(touch) { + const startY = this._domNode.domNode.getBoundingClientRect().top; + const scrollTop = this._lastRenderData.renderedLayout.getDesiredScrollTopFromTouchLocation(touch.pageY - startY); + this._model.setScrollTop(scrollTop); + } + dispose() { + this._pointerDownListener.dispose(); + this._sliderPointerMoveMonitor.dispose(); + this._sliderPointerDownListener.dispose(); + this._gestureDisposable.dispose(); + this._sliderTouchStartListener.dispose(); + this._sliderTouchMoveListener.dispose(); + this._sliderTouchEndListener.dispose(); + super.dispose(); + } + _getMinimapDomNodeClassName() { + const class_ = ["minimap"]; + if (this._model.options.showSlider === "always") { + class_.push("slider-always"); + } else { + class_.push("slider-mouseover"); + } + if (this._model.options.autohide) { + class_.push("autohide"); + } + return class_.join(" "); + } + getDomNode() { + return this._domNode; + } + _applyLayout() { + this._domNode.setLeft(this._model.options.minimapLeft); + this._domNode.setWidth(this._model.options.minimapWidth); + this._domNode.setHeight(this._model.options.minimapHeight); + this._shadow.setHeight(this._model.options.minimapHeight); + this._canvas.setWidth(this._model.options.canvasOuterWidth); + this._canvas.setHeight(this._model.options.canvasOuterHeight); + this._canvas.domNode.width = this._model.options.canvasInnerWidth; + this._canvas.domNode.height = this._model.options.canvasInnerHeight; + this._decorationsCanvas.setWidth(this._model.options.canvasOuterWidth); + this._decorationsCanvas.setHeight(this._model.options.canvasOuterHeight); + this._decorationsCanvas.domNode.width = this._model.options.canvasInnerWidth; + this._decorationsCanvas.domNode.height = this._model.options.canvasInnerHeight; + this._slider.setWidth(this._model.options.minimapWidth); + } + _getBuffer() { + if (!this._buffers) { + if (this._model.options.canvasInnerWidth > 0 && this._model.options.canvasInnerHeight > 0) { + this._buffers = new MinimapBuffers(this._canvas.domNode.getContext("2d"), this._model.options.canvasInnerWidth, this._model.options.canvasInnerHeight, this._model.options.backgroundColor); + } + } + return this._buffers ? this._buffers.getBuffer() : null; + } + // ---- begin view event handlers + onDidChangeOptions() { + this._lastRenderData = null; + this._buffers = null; + this._applyLayout(); + this._domNode.setClassName(this._getMinimapDomNodeClassName()); + } + onSelectionChanged() { + this._renderDecorations = true; + return true; + } + onDecorationsChanged() { + this._renderDecorations = true; + return true; + } + onFlushed() { + this._lastRenderData = null; + return true; + } + onLinesChanged(changeFromLineNumber, changeCount) { + if (this._lastRenderData) { + return this._lastRenderData.onLinesChanged(changeFromLineNumber, changeCount); + } + return false; + } + onLinesDeleted(deleteFromLineNumber, deleteToLineNumber) { + var _a10; + (_a10 = this._lastRenderData) === null || _a10 === void 0 ? void 0 : _a10.onLinesDeleted(deleteFromLineNumber, deleteToLineNumber); + return true; + } + onLinesInserted(insertFromLineNumber, insertToLineNumber) { + var _a10; + (_a10 = this._lastRenderData) === null || _a10 === void 0 ? void 0 : _a10.onLinesInserted(insertFromLineNumber, insertToLineNumber); + return true; + } + onScrollChanged() { + this._renderDecorations = true; + return true; + } + onThemeChanged() { + this._selectionColor = this._theme.getColor(minimapSelection); + this._renderDecorations = true; + return true; + } + onTokensChanged(ranges) { + if (this._lastRenderData) { + return this._lastRenderData.onTokensChanged(ranges); + } + return false; + } + onTokensColorsChanged() { + this._lastRenderData = null; + this._buffers = null; + return true; + } + onZonesChanged() { + this._lastRenderData = null; + return true; + } + // --- end event handlers + render(renderingCtx) { + const renderMinimap = this._model.options.renderMinimap; + if (renderMinimap === 0) { + this._shadow.setClassName("minimap-shadow-hidden"); + this._sliderHorizontal.setWidth(0); + this._sliderHorizontal.setHeight(0); + return; + } + if (renderingCtx.scrollLeft + renderingCtx.viewportWidth >= renderingCtx.scrollWidth) { + this._shadow.setClassName("minimap-shadow-hidden"); + } else { + this._shadow.setClassName("minimap-shadow-visible"); + } + const layout2 = MinimapLayout.create(this._model.options, renderingCtx.viewportStartLineNumber, renderingCtx.viewportEndLineNumber, renderingCtx.viewportStartLineNumberVerticalOffset, renderingCtx.viewportHeight, renderingCtx.viewportContainsWhitespaceGaps, this._model.getLineCount(), this._model.getRealLineCount(), renderingCtx.scrollTop, renderingCtx.scrollHeight, this._lastRenderData ? this._lastRenderData.renderedLayout : null); + this._slider.setDisplay(layout2.sliderNeeded ? "block" : "none"); + this._slider.setTop(layout2.sliderTop); + this._slider.setHeight(layout2.sliderHeight); + this._sliderHorizontal.setLeft(0); + this._sliderHorizontal.setWidth(this._model.options.minimapWidth); + this._sliderHorizontal.setTop(0); + this._sliderHorizontal.setHeight(layout2.sliderHeight); + this.renderDecorations(layout2); + this._lastRenderData = this.renderLines(layout2); + } + renderDecorations(layout2) { + if (this._renderDecorations) { + this._renderDecorations = false; + const selections = this._model.getSelections(); + selections.sort(Range.compareRangesUsingStarts); + const decorations = this._model.getMinimapDecorationsInViewport(layout2.startLineNumber, layout2.endLineNumber); + decorations.sort((a3, b) => (a3.options.zIndex || 0) - (b.options.zIndex || 0)); + const { canvasInnerWidth, canvasInnerHeight } = this._model.options; + const minimapLineHeight = this._model.options.minimapLineHeight; + const minimapCharWidth = this._model.options.minimapCharWidth; + const tabSize = this._model.getOptions().tabSize; + const canvasContext = this._decorationsCanvas.domNode.getContext("2d"); + canvasContext.clearRect(0, 0, canvasInnerWidth, canvasInnerHeight); + const highlightedLines = new ContiguousLineMap(layout2.startLineNumber, layout2.endLineNumber, false); + this._renderSelectionLineHighlights(canvasContext, selections, highlightedLines, layout2, minimapLineHeight); + this._renderDecorationsLineHighlights(canvasContext, decorations, highlightedLines, layout2, minimapLineHeight); + const lineOffsetMap = new ContiguousLineMap(layout2.startLineNumber, layout2.endLineNumber, null); + this._renderSelectionsHighlights(canvasContext, selections, lineOffsetMap, layout2, minimapLineHeight, tabSize, minimapCharWidth, canvasInnerWidth); + this._renderDecorationsHighlights(canvasContext, decorations, lineOffsetMap, layout2, minimapLineHeight, tabSize, minimapCharWidth, canvasInnerWidth); + this._renderSectionHeaders(layout2); + } + } + _renderSelectionLineHighlights(canvasContext, selections, highlightedLines, layout2, minimapLineHeight) { + if (!this._selectionColor || this._selectionColor.isTransparent()) { + return; + } + canvasContext.fillStyle = this._selectionColor.transparent(0.5).toString(); + let y1 = 0; + let y2 = 0; + for (const selection of selections) { + const intersection2 = layout2.intersectWithViewport(selection); + if (!intersection2) { + continue; + } + const [startLineNumber, endLineNumber] = intersection2; + for (let line = startLineNumber; line <= endLineNumber; line++) { + highlightedLines.set(line, true); + } + const yy1 = layout2.getYForLineNumber(startLineNumber, minimapLineHeight); + const yy2 = layout2.getYForLineNumber(endLineNumber, minimapLineHeight); + if (y2 >= yy1) { + y2 = yy2; + } else { + if (y2 > y1) { + canvasContext.fillRect(MINIMAP_GUTTER_WIDTH, y1, canvasContext.canvas.width, y2 - y1); + } + y1 = yy1; + y2 = yy2; + } + } + if (y2 > y1) { + canvasContext.fillRect(MINIMAP_GUTTER_WIDTH, y1, canvasContext.canvas.width, y2 - y1); + } + } + _renderDecorationsLineHighlights(canvasContext, decorations, highlightedLines, layout2, minimapLineHeight) { + const highlightColors = /* @__PURE__ */ new Map(); + for (let i = decorations.length - 1; i >= 0; i--) { + const decoration3 = decorations[i]; + const minimapOptions = decoration3.options.minimap; + if (!minimapOptions || minimapOptions.position !== 1) { + continue; + } + const intersection2 = layout2.intersectWithViewport(decoration3.range); + if (!intersection2) { + continue; + } + const [startLineNumber, endLineNumber] = intersection2; + const decorationColor = minimapOptions.getColor(this._theme.value); + if (!decorationColor || decorationColor.isTransparent()) { + continue; + } + let highlightColor = highlightColors.get(decorationColor.toString()); + if (!highlightColor) { + highlightColor = decorationColor.transparent(0.5).toString(); + highlightColors.set(decorationColor.toString(), highlightColor); + } + canvasContext.fillStyle = highlightColor; + for (let line = startLineNumber; line <= endLineNumber; line++) { + if (highlightedLines.has(line)) { + continue; + } + highlightedLines.set(line, true); + const y = layout2.getYForLineNumber(startLineNumber, minimapLineHeight); + canvasContext.fillRect(MINIMAP_GUTTER_WIDTH, y, canvasContext.canvas.width, minimapLineHeight); + } + } + } + _renderSelectionsHighlights(canvasContext, selections, lineOffsetMap, layout2, lineHeight, tabSize, characterWidth, canvasInnerWidth) { + if (!this._selectionColor || this._selectionColor.isTransparent()) { + return; + } + for (const selection of selections) { + const intersection2 = layout2.intersectWithViewport(selection); + if (!intersection2) { + continue; + } + const [startLineNumber, endLineNumber] = intersection2; + for (let line = startLineNumber; line <= endLineNumber; line++) { + this.renderDecorationOnLine(canvasContext, lineOffsetMap, selection, this._selectionColor, layout2, line, lineHeight, lineHeight, tabSize, characterWidth, canvasInnerWidth); + } + } + } + _renderDecorationsHighlights(canvasContext, decorations, lineOffsetMap, layout2, minimapLineHeight, tabSize, characterWidth, canvasInnerWidth) { + for (const decoration3 of decorations) { + const minimapOptions = decoration3.options.minimap; + if (!minimapOptions) { + continue; + } + const intersection2 = layout2.intersectWithViewport(decoration3.range); + if (!intersection2) { + continue; + } + const [startLineNumber, endLineNumber] = intersection2; + const decorationColor = minimapOptions.getColor(this._theme.value); + if (!decorationColor || decorationColor.isTransparent()) { + continue; + } + for (let line = startLineNumber; line <= endLineNumber; line++) { + switch (minimapOptions.position) { + case 1: + this.renderDecorationOnLine(canvasContext, lineOffsetMap, decoration3.range, decorationColor, layout2, line, minimapLineHeight, minimapLineHeight, tabSize, characterWidth, canvasInnerWidth); + continue; + case 2: { + const y = layout2.getYForLineNumber(line, minimapLineHeight); + const x = 2; + this.renderDecoration(canvasContext, decorationColor, x, y, GUTTER_DECORATION_WIDTH, minimapLineHeight); + continue; + } + } + } + } + } + renderDecorationOnLine(canvasContext, lineOffsetMap, decorationRange, decorationColor, layout2, lineNumber, height, minimapLineHeight, tabSize, charWidth, canvasInnerWidth) { + const y = layout2.getYForLineNumber(lineNumber, minimapLineHeight); + if (y + height < 0 || y > this._model.options.canvasInnerHeight) { + return; + } + const { startLineNumber, endLineNumber } = decorationRange; + const startColumn = startLineNumber === lineNumber ? decorationRange.startColumn : 1; + const endColumn = endLineNumber === lineNumber ? decorationRange.endColumn : this._model.getLineMaxColumn(lineNumber); + const x1 = this.getXOffsetForPosition(lineOffsetMap, lineNumber, startColumn, tabSize, charWidth, canvasInnerWidth); + const x2 = this.getXOffsetForPosition(lineOffsetMap, lineNumber, endColumn, tabSize, charWidth, canvasInnerWidth); + this.renderDecoration(canvasContext, decorationColor, x1, y, x2 - x1, height); + } + getXOffsetForPosition(lineOffsetMap, lineNumber, column, tabSize, charWidth, canvasInnerWidth) { + if (column === 1) { + return MINIMAP_GUTTER_WIDTH; + } + const minimumXOffset = (column - 1) * charWidth; + if (minimumXOffset >= canvasInnerWidth) { + return canvasInnerWidth; + } + let lineIndexToXOffset = lineOffsetMap.get(lineNumber); + if (!lineIndexToXOffset) { + const lineData = this._model.getLineContent(lineNumber); + lineIndexToXOffset = [MINIMAP_GUTTER_WIDTH]; + let prevx = MINIMAP_GUTTER_WIDTH; + for (let i = 1; i < lineData.length + 1; i++) { + const charCode = lineData.charCodeAt(i - 1); + const dx = charCode === 9 ? tabSize * charWidth : isFullWidthCharacter(charCode) ? 2 * charWidth : charWidth; + const x = prevx + dx; + if (x >= canvasInnerWidth) { + lineIndexToXOffset[i] = canvasInnerWidth; + break; + } + lineIndexToXOffset[i] = x; + prevx = x; + } + lineOffsetMap.set(lineNumber, lineIndexToXOffset); + } + if (column - 1 < lineIndexToXOffset.length) { + return lineIndexToXOffset[column - 1]; + } + return canvasInnerWidth; + } + renderDecoration(canvasContext, decorationColor, x, y, width2, height) { + canvasContext.fillStyle = decorationColor && decorationColor.toString() || ""; + canvasContext.fillRect(x, y, width2, height); + } + _renderSectionHeaders(layout2) { + var _a10; + const minimapLineHeight = this._model.options.minimapLineHeight; + const sectionHeaderFontSize = this._model.options.sectionHeaderFontSize; + const sectionHeaderLetterSpacing = this._model.options.sectionHeaderLetterSpacing; + const backgroundFillHeight = sectionHeaderFontSize * 1.5; + const { canvasInnerWidth } = this._model.options; + const backgroundColor = this._model.options.backgroundColor; + const backgroundFill = `rgb(${backgroundColor.r} ${backgroundColor.g} ${backgroundColor.b} / .7)`; + const foregroundColor = this._model.options.sectionHeaderFontColor; + const foregroundFill = `rgb(${foregroundColor.r} ${foregroundColor.g} ${foregroundColor.b})`; + const separatorStroke = foregroundFill; + const canvasContext = this._decorationsCanvas.domNode.getContext("2d"); + canvasContext.letterSpacing = sectionHeaderLetterSpacing + "px"; + canvasContext.font = "500 " + sectionHeaderFontSize + "px " + this._model.options.sectionHeaderFontFamily; + canvasContext.strokeStyle = separatorStroke; + canvasContext.lineWidth = 0.2; + const decorations = this._model.getSectionHeaderDecorationsInViewport(layout2.startLineNumber, layout2.endLineNumber); + decorations.sort((a3, b) => a3.range.startLineNumber - b.range.startLineNumber); + const fitWidth = _InnerMinimap._fitSectionHeader.bind(null, canvasContext, canvasInnerWidth - MINIMAP_GUTTER_WIDTH); + for (const decoration3 of decorations) { + const y = layout2.getYForLineNumber(decoration3.range.startLineNumber, minimapLineHeight) + sectionHeaderFontSize; + const backgroundFillY = y - sectionHeaderFontSize; + const separatorY = backgroundFillY + 2; + const headerText = this._model.getSectionHeaderText(decoration3, fitWidth); + _InnerMinimap._renderSectionLabel(canvasContext, headerText, ((_a10 = decoration3.options.minimap) === null || _a10 === void 0 ? void 0 : _a10.sectionHeaderStyle) === 2, backgroundFill, foregroundFill, canvasInnerWidth, backgroundFillY, backgroundFillHeight, y, separatorY); + } + } + static _fitSectionHeader(target, maxWidth, headerText) { + if (!headerText) { + return headerText; + } + const ellipsis = "\u2026"; + const width2 = target.measureText(headerText).width; + const ellipsisWidth = target.measureText(ellipsis).width; + if (width2 <= maxWidth || width2 <= ellipsisWidth) { + return headerText; + } + const len = headerText.length; + const averageCharWidth = width2 / headerText.length; + const maxCharCount = Math.floor((maxWidth - ellipsisWidth) / averageCharWidth) - 1; + let halfCharCount = Math.ceil(maxCharCount / 2); + while (halfCharCount > 0 && /\s/.test(headerText[halfCharCount - 1])) { + --halfCharCount; + } + return headerText.substring(0, halfCharCount) + ellipsis + headerText.substring(len - (maxCharCount - halfCharCount)); + } + static _renderSectionLabel(target, headerText, hasSeparatorLine, backgroundFill, foregroundFill, minimapWidth, backgroundFillY, backgroundFillHeight, textY, separatorY) { + if (headerText) { + target.fillStyle = backgroundFill; + target.fillRect(0, backgroundFillY, minimapWidth, backgroundFillHeight); + target.fillStyle = foregroundFill; + target.fillText(headerText, MINIMAP_GUTTER_WIDTH, textY); + } + if (hasSeparatorLine) { + target.beginPath(); + target.moveTo(0, separatorY); + target.lineTo(minimapWidth, separatorY); + target.closePath(); + target.stroke(); + } + } + renderLines(layout2) { + const startLineNumber = layout2.startLineNumber; + const endLineNumber = layout2.endLineNumber; + const minimapLineHeight = this._model.options.minimapLineHeight; + if (this._lastRenderData && this._lastRenderData.linesEquals(layout2)) { + const _lastData = this._lastRenderData._get(); + return new RenderData(layout2, _lastData.imageData, _lastData.lines); + } + const imageData = this._getBuffer(); + if (!imageData) { + return null; + } + const [_dirtyY1, _dirtyY2, needed] = _InnerMinimap._renderUntouchedLines(imageData, layout2.topPaddingLineCount, startLineNumber, endLineNumber, minimapLineHeight, this._lastRenderData); + const lineInfo = this._model.getMinimapLinesRenderingData(startLineNumber, endLineNumber, needed); + const tabSize = this._model.getOptions().tabSize; + const defaultBackground = this._model.options.defaultBackgroundColor; + const background = this._model.options.backgroundColor; + const foregroundAlpha = this._model.options.foregroundAlpha; + const tokensColorTracker = this._model.tokensColorTracker; + const useLighterFont = tokensColorTracker.backgroundIsLight(); + const renderMinimap = this._model.options.renderMinimap; + const charRenderer = this._model.options.charRenderer(); + const fontScale = this._model.options.fontScale; + const minimapCharWidth = this._model.options.minimapCharWidth; + const baseCharHeight = renderMinimap === 1 ? 2 : 2 + 1; + const renderMinimapLineHeight = baseCharHeight * fontScale; + const innerLinePadding = minimapLineHeight > renderMinimapLineHeight ? Math.floor((minimapLineHeight - renderMinimapLineHeight) / 2) : 0; + const backgroundA = background.a / 255; + const renderBackground = new RGBA8(Math.round((background.r - defaultBackground.r) * backgroundA + defaultBackground.r), Math.round((background.g - defaultBackground.g) * backgroundA + defaultBackground.g), Math.round((background.b - defaultBackground.b) * backgroundA + defaultBackground.b), 255); + let dy = layout2.topPaddingLineCount * minimapLineHeight; + const renderedLines = []; + for (let lineIndex = 0, lineCount = endLineNumber - startLineNumber + 1; lineIndex < lineCount; lineIndex++) { + if (needed[lineIndex]) { + _InnerMinimap._renderLine(imageData, renderBackground, background.a, useLighterFont, renderMinimap, minimapCharWidth, tokensColorTracker, foregroundAlpha, charRenderer, dy, innerLinePadding, tabSize, lineInfo[lineIndex], fontScale, minimapLineHeight); + } + renderedLines[lineIndex] = new MinimapLine(dy); + dy += minimapLineHeight; + } + const dirtyY1 = _dirtyY1 === -1 ? 0 : _dirtyY1; + const dirtyY2 = _dirtyY2 === -1 ? imageData.height : _dirtyY2; + const dirtyHeight = dirtyY2 - dirtyY1; + const ctx = this._canvas.domNode.getContext("2d"); + ctx.putImageData(imageData, 0, 0, 0, dirtyY1, imageData.width, dirtyHeight); + return new RenderData(layout2, imageData, renderedLines); + } + static _renderUntouchedLines(target, topPaddingLineCount, startLineNumber, endLineNumber, minimapLineHeight, lastRenderData) { + const needed = []; + if (!lastRenderData) { + for (let i = 0, len = endLineNumber - startLineNumber + 1; i < len; i++) { + needed[i] = true; + } + return [-1, -1, needed]; + } + const _lastData = lastRenderData._get(); + const lastTargetData = _lastData.imageData.data; + const lastStartLineNumber = _lastData.rendLineNumberStart; + const lastLines = _lastData.lines; + const lastLinesLength = lastLines.length; + const WIDTH = target.width; + const targetData = target.data; + const maxDestPixel = (endLineNumber - startLineNumber + 1) * minimapLineHeight * WIDTH * 4; + let dirtyPixel1 = -1; + let dirtyPixel2 = -1; + let copySourceStart = -1; + let copySourceEnd = -1; + let copyDestStart = -1; + let copyDestEnd = -1; + let dest_dy = topPaddingLineCount * minimapLineHeight; + for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { + const lineIndex = lineNumber - startLineNumber; + const lastLineIndex = lineNumber - lastStartLineNumber; + const source_dy = lastLineIndex >= 0 && lastLineIndex < lastLinesLength ? lastLines[lastLineIndex].dy : -1; + if (source_dy === -1) { + needed[lineIndex] = true; + dest_dy += minimapLineHeight; + continue; + } + const sourceStart = source_dy * WIDTH * 4; + const sourceEnd = (source_dy + minimapLineHeight) * WIDTH * 4; + const destStart = dest_dy * WIDTH * 4; + const destEnd = (dest_dy + minimapLineHeight) * WIDTH * 4; + if (copySourceEnd === sourceStart && copyDestEnd === destStart) { + copySourceEnd = sourceEnd; + copyDestEnd = destEnd; + } else { + if (copySourceStart !== -1) { + targetData.set(lastTargetData.subarray(copySourceStart, copySourceEnd), copyDestStart); + if (dirtyPixel1 === -1 && copySourceStart === 0 && copySourceStart === copyDestStart) { + dirtyPixel1 = copySourceEnd; + } + if (dirtyPixel2 === -1 && copySourceEnd === maxDestPixel && copySourceStart === copyDestStart) { + dirtyPixel2 = copySourceStart; + } + } + copySourceStart = sourceStart; + copySourceEnd = sourceEnd; + copyDestStart = destStart; + copyDestEnd = destEnd; + } + needed[lineIndex] = false; + dest_dy += minimapLineHeight; + } + if (copySourceStart !== -1) { + targetData.set(lastTargetData.subarray(copySourceStart, copySourceEnd), copyDestStart); + if (dirtyPixel1 === -1 && copySourceStart === 0 && copySourceStart === copyDestStart) { + dirtyPixel1 = copySourceEnd; + } + if (dirtyPixel2 === -1 && copySourceEnd === maxDestPixel && copySourceStart === copyDestStart) { + dirtyPixel2 = copySourceStart; + } + } + const dirtyY1 = dirtyPixel1 === -1 ? -1 : dirtyPixel1 / (WIDTH * 4); + const dirtyY2 = dirtyPixel2 === -1 ? -1 : dirtyPixel2 / (WIDTH * 4); + return [dirtyY1, dirtyY2, needed]; + } + static _renderLine(target, backgroundColor, backgroundAlpha, useLighterFont, renderMinimap, charWidth, colorTracker, foregroundAlpha, minimapCharRenderer, dy, innerLinePadding, tabSize, lineData, fontScale, minimapLineHeight) { + const content = lineData.content; + const tokens = lineData.tokens; + const maxDx = target.width - charWidth; + const force1pxHeight = minimapLineHeight === 1; + let dx = MINIMAP_GUTTER_WIDTH; + let charIndex = 0; + let tabsCharDelta = 0; + for (let tokenIndex = 0, tokensLen = tokens.getCount(); tokenIndex < tokensLen; tokenIndex++) { + const tokenEndIndex = tokens.getEndOffset(tokenIndex); + const tokenColorId = tokens.getForeground(tokenIndex); + const tokenColor = colorTracker.getColor(tokenColorId); + for (; charIndex < tokenEndIndex; charIndex++) { + if (dx > maxDx) { + return; + } + const charCode = content.charCodeAt(charIndex); + if (charCode === 9) { + const insertSpacesCount = tabSize - (charIndex + tabsCharDelta) % tabSize; + tabsCharDelta += insertSpacesCount - 1; + dx += insertSpacesCount * charWidth; + } else if (charCode === 32) { + dx += charWidth; + } else { + const count = isFullWidthCharacter(charCode) ? 2 : 1; + for (let i = 0; i < count; i++) { + if (renderMinimap === 2) { + minimapCharRenderer.blockRenderChar(target, dx, dy + innerLinePadding, tokenColor, foregroundAlpha, backgroundColor, backgroundAlpha, force1pxHeight); + } else { + minimapCharRenderer.renderChar(target, dx, dy + innerLinePadding, charCode, tokenColor, foregroundAlpha, backgroundColor, backgroundAlpha, fontScale, useLighterFont, force1pxHeight); + } + dx += charWidth; + if (dx > maxDx) { + return; + } + } + } + } + } + } + }; + ContiguousLineMap = class { + constructor(startLineNumber, endLineNumber, defaultValue) { + this._startLineNumber = startLineNumber; + this._endLineNumber = endLineNumber; + this._defaultValue = defaultValue; + this._values = []; + for (let i = 0, count = this._endLineNumber - this._startLineNumber + 1; i < count; i++) { + this._values[i] = defaultValue; + } + } + has(lineNumber) { + return this.get(lineNumber) !== this._defaultValue; + } + set(lineNumber, value) { + if (lineNumber < this._startLineNumber || lineNumber > this._endLineNumber) { + return; + } + this._values[lineNumber - this._startLineNumber] = value; + } + get(lineNumber) { + if (lineNumber < this._startLineNumber || lineNumber > this._endLineNumber) { + return this._defaultValue; + } + return this._values[lineNumber - this._startLineNumber]; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets.css +var init_overlayWidgets = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets.js +var ViewOverlayWidgets; +var init_overlayWidgets2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets.js"() { + init_overlayWidgets(); + init_fastDomNode(); + init_viewPart(); + init_dom(); + ViewOverlayWidgets = class extends ViewPart { + constructor(context, viewDomNode) { + super(context); + this._viewDomNode = viewDomNode; + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._widgets = {}; + this._verticalScrollbarWidth = layoutInfo.verticalScrollbarWidth; + this._minimapWidth = layoutInfo.minimap.minimapWidth; + this._horizontalScrollbarHeight = layoutInfo.horizontalScrollbarHeight; + this._editorHeight = layoutInfo.height; + this._editorWidth = layoutInfo.width; + this._viewDomNodeRect = { top: 0, left: 0, width: 0, height: 0 }; + this._domNode = createFastDomNode(document.createElement("div")); + PartFingerprints.write( + this._domNode, + 4 + /* PartFingerprint.OverlayWidgets */ + ); + this._domNode.setClassName("overlayWidgets"); + this.overflowingOverlayWidgetsDomNode = createFastDomNode(document.createElement("div")); + PartFingerprints.write( + this.overflowingOverlayWidgetsDomNode, + 5 + /* PartFingerprint.OverflowingOverlayWidgets */ + ); + this.overflowingOverlayWidgetsDomNode.setClassName("overflowingOverlayWidgets"); + } + dispose() { + super.dispose(); + this._widgets = {}; + } + getDomNode() { + return this._domNode; + } + // ---- begin view event handlers + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._verticalScrollbarWidth = layoutInfo.verticalScrollbarWidth; + this._minimapWidth = layoutInfo.minimap.minimapWidth; + this._horizontalScrollbarHeight = layoutInfo.horizontalScrollbarHeight; + this._editorHeight = layoutInfo.height; + this._editorWidth = layoutInfo.width; + return true; + } + // ---- end view event handlers + addWidget(widget) { + const domNode = createFastDomNode(widget.getDomNode()); + this._widgets[widget.getId()] = { + widget, + preference: null, + domNode + }; + domNode.setPosition("absolute"); + domNode.setAttribute("widgetId", widget.getId()); + if (widget.allowEditorOverflow) { + this.overflowingOverlayWidgetsDomNode.appendChild(domNode); + } else { + this._domNode.appendChild(domNode); + } + this.setShouldRender(); + this._updateMaxMinWidth(); + } + setWidgetPosition(widget, position) { + const widgetData = this._widgets[widget.getId()]; + const preference = position ? position.preference : null; + const stack = position === null || position === void 0 ? void 0 : position.stackOridinal; + if (widgetData.preference === preference && widgetData.stack === stack) { + this._updateMaxMinWidth(); + return false; + } + widgetData.preference = preference; + widgetData.stack = stack; + this.setShouldRender(); + this._updateMaxMinWidth(); + return true; + } + removeWidget(widget) { + const widgetId = widget.getId(); + if (this._widgets.hasOwnProperty(widgetId)) { + const widgetData = this._widgets[widgetId]; + const domNode = widgetData.domNode.domNode; + delete this._widgets[widgetId]; + domNode.remove(); + this.setShouldRender(); + this._updateMaxMinWidth(); + } + } + _updateMaxMinWidth() { + var _a10, _b4; + let maxMinWidth = 0; + const keys = Object.keys(this._widgets); + for (let i = 0, len = keys.length; i < len; i++) { + const widgetId = keys[i]; + const widget = this._widgets[widgetId]; + const widgetMinWidthInPx = (_b4 = (_a10 = widget.widget).getMinContentWidthInPx) === null || _b4 === void 0 ? void 0 : _b4.call(_a10); + if (typeof widgetMinWidthInPx !== "undefined") { + maxMinWidth = Math.max(maxMinWidth, widgetMinWidthInPx); + } + } + this._context.viewLayout.setOverlayWidgetsMinWidth(maxMinWidth); + } + _renderWidget(widgetData, stackCoordinates) { + const domNode = widgetData.domNode; + if (widgetData.preference === null) { + domNode.setTop(""); + return; + } + const maxRight = 2 * this._verticalScrollbarWidth + this._minimapWidth; + if (widgetData.preference === 0 || widgetData.preference === 1) { + if (widgetData.preference === 1) { + const widgetHeight = domNode.domNode.clientHeight; + domNode.setTop(this._editorHeight - widgetHeight - 2 * this._horizontalScrollbarHeight); + } else { + domNode.setTop(0); + } + if (widgetData.stack !== void 0) { + domNode.setTop(stackCoordinates[widgetData.preference]); + stackCoordinates[widgetData.preference] += domNode.domNode.clientWidth; + } else { + domNode.setRight(maxRight); + } + } else if (widgetData.preference === 2) { + domNode.domNode.style.right = "50%"; + if (widgetData.stack !== void 0) { + domNode.setTop(stackCoordinates[ + 2 + /* OverlayWidgetPositionPreference.TOP_CENTER */ + ]); + stackCoordinates[ + 2 + /* OverlayWidgetPositionPreference.TOP_CENTER */ + ] += domNode.domNode.clientHeight; + } else { + domNode.setTop(0); + } + } else { + const { top, left } = widgetData.preference; + const fixedOverflowWidgets = this._context.configuration.options.get( + 42 + /* EditorOption.fixedOverflowWidgets */ + ); + if (fixedOverflowWidgets && widgetData.widget.allowEditorOverflow) { + const editorBoundingBox = this._viewDomNodeRect; + domNode.setTop(top + editorBoundingBox.top); + domNode.setLeft(left + editorBoundingBox.left); + domNode.setPosition("fixed"); + } else { + domNode.setTop(top); + domNode.setLeft(left); + domNode.setPosition("absolute"); + } + } + } + prepareRender(ctx) { + this._viewDomNodeRect = getDomNodePagePosition(this._viewDomNode.domNode); + } + render(ctx) { + this._domNode.setWidth(this._editorWidth); + const keys = Object.keys(this._widgets); + const stackCoordinates = Array.from({ length: 2 + 1 }, () => 0); + keys.sort((a3, b) => (this._widgets[a3].stack || 0) - (this._widgets[b].stack || 0)); + for (let i = 0, len = keys.length; i < len; i++) { + const widgetId = keys[i]; + this._renderWidget(this._widgets[widgetId], stackCoordinates); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.js +var Settings, DecorationsOverviewRuler; +var init_decorationsOverviewRuler = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.js"() { + init_fastDomNode(); + init_color(); + init_viewPart(); + init_position(); + init_languages(); + init_editorColorRegistry(); + init_viewModel(); + init_arrays(); + Settings = class { + constructor(config, theme) { + const options2 = config.options; + this.lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this.pixelRatio = options2.get( + 143 + /* EditorOption.pixelRatio */ + ); + this.overviewRulerLanes = options2.get( + 83 + /* EditorOption.overviewRulerLanes */ + ); + this.renderBorder = options2.get( + 82 + /* EditorOption.overviewRulerBorder */ + ); + const borderColor = theme.getColor(editorOverviewRulerBorder); + this.borderColor = borderColor ? borderColor.toString() : null; + this.hideCursor = options2.get( + 59 + /* EditorOption.hideCursorInOverviewRuler */ + ); + const cursorColorSingle = theme.getColor(editorCursorForeground); + this.cursorColorSingle = cursorColorSingle ? cursorColorSingle.transparent(0.7).toString() : null; + const cursorColorPrimary = theme.getColor(editorMultiCursorPrimaryForeground); + this.cursorColorPrimary = cursorColorPrimary ? cursorColorPrimary.transparent(0.7).toString() : null; + const cursorColorSecondary = theme.getColor(editorMultiCursorSecondaryForeground); + this.cursorColorSecondary = cursorColorSecondary ? cursorColorSecondary.transparent(0.7).toString() : null; + this.themeType = theme.type; + const minimapOpts = options2.get( + 73 + /* EditorOption.minimap */ + ); + const minimapEnabled = minimapOpts.enabled; + const minimapSide = minimapOpts.side; + const themeColor = theme.getColor(editorOverviewRulerBackground); + const defaultBackground = TokenizationRegistry2.getDefaultBackground(); + if (themeColor) { + this.backgroundColor = themeColor; + } else if (minimapEnabled && minimapSide === "right") { + this.backgroundColor = defaultBackground; + } else { + this.backgroundColor = null; + } + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + const position = layoutInfo.overviewRuler; + this.top = position.top; + this.right = position.right; + this.domWidth = position.width; + this.domHeight = position.height; + if (this.overviewRulerLanes === 0) { + this.canvasWidth = 0; + this.canvasHeight = 0; + } else { + this.canvasWidth = this.domWidth * this.pixelRatio | 0; + this.canvasHeight = this.domHeight * this.pixelRatio | 0; + } + const [x, w] = this._initLanes(1, this.canvasWidth, this.overviewRulerLanes); + this.x = x; + this.w = w; + } + _initLanes(canvasLeftOffset, canvasWidth, laneCount) { + const remainingWidth = canvasWidth - canvasLeftOffset; + if (laneCount >= 3) { + const leftWidth = Math.floor(remainingWidth / 3); + const rightWidth = Math.floor(remainingWidth / 3); + const centerWidth = remainingWidth - leftWidth - rightWidth; + const leftOffset = canvasLeftOffset; + const centerOffset = leftOffset + leftWidth; + const rightOffset = leftOffset + leftWidth + centerWidth; + return [ + [ + 0, + leftOffset, + // Left + centerOffset, + // Center + leftOffset, + // Left | Center + rightOffset, + // Right + leftOffset, + // Left | Right + centerOffset, + // Center | Right + leftOffset + // Left | Center | Right + ], + [ + 0, + leftWidth, + // Left + centerWidth, + // Center + leftWidth + centerWidth, + // Left | Center + rightWidth, + // Right + leftWidth + centerWidth + rightWidth, + // Left | Right + centerWidth + rightWidth, + // Center | Right + leftWidth + centerWidth + rightWidth + // Left | Center | Right + ] + ]; + } else if (laneCount === 2) { + const leftWidth = Math.floor(remainingWidth / 2); + const rightWidth = remainingWidth - leftWidth; + const leftOffset = canvasLeftOffset; + const rightOffset = leftOffset + leftWidth; + return [ + [ + 0, + leftOffset, + // Left + leftOffset, + // Center + leftOffset, + // Left | Center + rightOffset, + // Right + leftOffset, + // Left | Right + leftOffset, + // Center | Right + leftOffset + // Left | Center | Right + ], + [ + 0, + leftWidth, + // Left + leftWidth, + // Center + leftWidth, + // Left | Center + rightWidth, + // Right + leftWidth + rightWidth, + // Left | Right + leftWidth + rightWidth, + // Center | Right + leftWidth + rightWidth + // Left | Center | Right + ] + ]; + } else { + const offset = canvasLeftOffset; + const width2 = remainingWidth; + return [ + [ + 0, + offset, + // Left + offset, + // Center + offset, + // Left | Center + offset, + // Right + offset, + // Left | Right + offset, + // Center | Right + offset + // Left | Center | Right + ], + [ + 0, + width2, + // Left + width2, + // Center + width2, + // Left | Center + width2, + // Right + width2, + // Left | Right + width2, + // Center | Right + width2 + // Left | Center | Right + ] + ]; + } + } + equals(other) { + return this.lineHeight === other.lineHeight && this.pixelRatio === other.pixelRatio && this.overviewRulerLanes === other.overviewRulerLanes && this.renderBorder === other.renderBorder && this.borderColor === other.borderColor && this.hideCursor === other.hideCursor && this.cursorColorSingle === other.cursorColorSingle && this.cursorColorPrimary === other.cursorColorPrimary && this.cursorColorSecondary === other.cursorColorSecondary && this.themeType === other.themeType && Color.equals(this.backgroundColor, other.backgroundColor) && this.top === other.top && this.right === other.right && this.domWidth === other.domWidth && this.domHeight === other.domHeight && this.canvasWidth === other.canvasWidth && this.canvasHeight === other.canvasHeight; + } + }; + DecorationsOverviewRuler = class extends ViewPart { + constructor(context) { + super(context); + this._actualShouldRender = 0; + this._renderedDecorations = []; + this._renderedCursorPositions = []; + this._domNode = createFastDomNode(document.createElement("canvas")); + this._domNode.setClassName("decorationsOverviewRuler"); + this._domNode.setPosition("absolute"); + this._domNode.setLayerHinting(true); + this._domNode.setContain("strict"); + this._domNode.setAttribute("aria-hidden", "true"); + this._updateSettings(false); + this._tokensColorTrackerListener = TokenizationRegistry2.onDidChange((e) => { + if (e.changedColorMap) { + this._updateSettings(true); + } + }); + this._cursorPositions = [{ position: new Position(1, 1), color: this._settings.cursorColorSingle }]; + } + dispose() { + super.dispose(); + this._tokensColorTrackerListener.dispose(); + } + _updateSettings(renderNow) { + const newSettings = new Settings(this._context.configuration, this._context.theme); + if (this._settings && this._settings.equals(newSettings)) { + return false; + } + this._settings = newSettings; + this._domNode.setTop(this._settings.top); + this._domNode.setRight(this._settings.right); + this._domNode.setWidth(this._settings.domWidth); + this._domNode.setHeight(this._settings.domHeight); + this._domNode.domNode.width = this._settings.canvasWidth; + this._domNode.domNode.height = this._settings.canvasHeight; + if (renderNow) { + this._render(); + } + return true; + } + // ---- begin view event handlers + _markRenderingIsNeeded() { + this._actualShouldRender = 2; + return true; + } + _markRenderingIsMaybeNeeded() { + this._actualShouldRender = 1; + return true; + } + onConfigurationChanged(e) { + return this._updateSettings(false) ? this._markRenderingIsNeeded() : false; + } + onCursorStateChanged(e) { + this._cursorPositions = []; + for (let i = 0, len = e.selections.length; i < len; i++) { + let color = this._settings.cursorColorSingle; + if (len > 1) { + color = i === 0 ? this._settings.cursorColorPrimary : this._settings.cursorColorSecondary; + } + this._cursorPositions.push({ position: e.selections[i].getPosition(), color }); + } + this._cursorPositions.sort((a3, b) => Position.compare(a3.position, b.position)); + return this._markRenderingIsMaybeNeeded(); + } + onDecorationsChanged(e) { + if (e.affectsOverviewRuler) { + return this._markRenderingIsMaybeNeeded(); + } + return false; + } + onFlushed(e) { + return this._markRenderingIsNeeded(); + } + onScrollChanged(e) { + return e.scrollHeightChanged ? this._markRenderingIsNeeded() : false; + } + onZonesChanged(e) { + return this._markRenderingIsNeeded(); + } + onThemeChanged(e) { + return this._updateSettings(false) ? this._markRenderingIsNeeded() : false; + } + // ---- end view event handlers + getDomNode() { + return this._domNode.domNode; + } + prepareRender(ctx) { + } + render(editorCtx) { + this._render(); + this._actualShouldRender = 0; + } + _render() { + const backgroundColor = this._settings.backgroundColor; + if (this._settings.overviewRulerLanes === 0) { + this._domNode.setBackgroundColor(backgroundColor ? Color.Format.CSS.formatHexA(backgroundColor) : ""); + this._domNode.setDisplay("none"); + return; + } + const decorations = this._context.viewModel.getAllOverviewRulerDecorations(this._context.theme); + decorations.sort(OverviewRulerDecorationsGroup.compareByRenderingProps); + if (this._actualShouldRender === 1 && !OverviewRulerDecorationsGroup.equalsArr(this._renderedDecorations, decorations)) { + this._actualShouldRender = 2; + } + if (this._actualShouldRender === 1 && !equals(this._renderedCursorPositions, this._cursorPositions, (a3, b) => a3.position.lineNumber === b.position.lineNumber && a3.color === b.color)) { + this._actualShouldRender = 2; + } + if (this._actualShouldRender === 1) { + return; + } + this._renderedDecorations = decorations; + this._renderedCursorPositions = this._cursorPositions; + this._domNode.setDisplay("block"); + const canvasWidth = this._settings.canvasWidth; + const canvasHeight = this._settings.canvasHeight; + const lineHeight = this._settings.lineHeight; + const viewLayout = this._context.viewLayout; + const outerHeight = this._context.viewLayout.getScrollHeight(); + const heightRatio = canvasHeight / outerHeight; + const minDecorationHeight = 6 * this._settings.pixelRatio | 0; + const halfMinDecorationHeight = minDecorationHeight / 2 | 0; + const canvasCtx = this._domNode.domNode.getContext("2d"); + if (backgroundColor) { + if (backgroundColor.isOpaque()) { + canvasCtx.fillStyle = Color.Format.CSS.formatHexA(backgroundColor); + canvasCtx.fillRect(0, 0, canvasWidth, canvasHeight); + } else { + canvasCtx.clearRect(0, 0, canvasWidth, canvasHeight); + canvasCtx.fillStyle = Color.Format.CSS.formatHexA(backgroundColor); + canvasCtx.fillRect(0, 0, canvasWidth, canvasHeight); + } + } else { + canvasCtx.clearRect(0, 0, canvasWidth, canvasHeight); + } + const x = this._settings.x; + const w = this._settings.w; + for (const decorationGroup of decorations) { + const color = decorationGroup.color; + const decorationGroupData = decorationGroup.data; + canvasCtx.fillStyle = color; + let prevLane = 0; + let prevY1 = 0; + let prevY2 = 0; + for (let i = 0, len = decorationGroupData.length / 3; i < len; i++) { + const lane = decorationGroupData[3 * i]; + const startLineNumber = decorationGroupData[3 * i + 1]; + const endLineNumber = decorationGroupData[3 * i + 2]; + let y1 = viewLayout.getVerticalOffsetForLineNumber(startLineNumber) * heightRatio | 0; + let y2 = (viewLayout.getVerticalOffsetForLineNumber(endLineNumber) + lineHeight) * heightRatio | 0; + const height = y2 - y1; + if (height < minDecorationHeight) { + let yCenter = (y1 + y2) / 2 | 0; + if (yCenter < halfMinDecorationHeight) { + yCenter = halfMinDecorationHeight; + } else if (yCenter + halfMinDecorationHeight > canvasHeight) { + yCenter = canvasHeight - halfMinDecorationHeight; + } + y1 = yCenter - halfMinDecorationHeight; + y2 = yCenter + halfMinDecorationHeight; + } + if (y1 > prevY2 + 1 || lane !== prevLane) { + if (i !== 0) { + canvasCtx.fillRect(x[prevLane], prevY1, w[prevLane], prevY2 - prevY1); + } + prevLane = lane; + prevY1 = y1; + prevY2 = y2; + } else { + if (y2 > prevY2) { + prevY2 = y2; + } + } + } + canvasCtx.fillRect(x[prevLane], prevY1, w[prevLane], prevY2 - prevY1); + } + if (!this._settings.hideCursor) { + const cursorHeight = 2 * this._settings.pixelRatio | 0; + const halfCursorHeight = cursorHeight / 2 | 0; + const cursorX = this._settings.x[ + 7 + /* OverviewRulerLane.Full */ + ]; + const cursorW = this._settings.w[ + 7 + /* OverviewRulerLane.Full */ + ]; + let prevY1 = -100; + let prevY2 = -100; + let prevColor = null; + for (let i = 0, len = this._cursorPositions.length; i < len; i++) { + const color = this._cursorPositions[i].color; + if (!color) { + continue; + } + const cursor = this._cursorPositions[i].position; + let yCenter = viewLayout.getVerticalOffsetForLineNumber(cursor.lineNumber) * heightRatio | 0; + if (yCenter < halfCursorHeight) { + yCenter = halfCursorHeight; + } else if (yCenter + halfCursorHeight > canvasHeight) { + yCenter = canvasHeight - halfCursorHeight; + } + const y1 = yCenter - halfCursorHeight; + const y2 = y1 + cursorHeight; + if (y1 > prevY2 + 1 || color !== prevColor) { + if (i !== 0 && prevColor) { + canvasCtx.fillRect(cursorX, prevY1, cursorW, prevY2 - prevY1); + } + prevY1 = y1; + prevY2 = y2; + } else { + if (y2 > prevY2) { + prevY2 = y2; + } + } + prevColor = color; + canvasCtx.fillStyle = color; + } + if (prevColor) { + canvasCtx.fillRect(cursorX, prevY1, cursorW, prevY2 - prevY1); + } + } + if (this._settings.renderBorder && this._settings.borderColor && this._settings.overviewRulerLanes > 0) { + canvasCtx.beginPath(); + canvasCtx.lineWidth = 1; + canvasCtx.strokeStyle = this._settings.borderColor; + canvasCtx.moveTo(0, 0); + canvasCtx.lineTo(0, canvasHeight); + canvasCtx.stroke(); + canvasCtx.moveTo(0, 0); + canvasCtx.lineTo(canvasWidth, 0); + canvasCtx.stroke(); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewModel/overviewZoneManager.js +var ColorZone, OverviewRulerZone, OverviewZoneManager; +var init_overviewZoneManager = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewModel/overviewZoneManager.js"() { + ColorZone = class { + constructor(from, to, colorId) { + this._colorZoneBrand = void 0; + this.from = from | 0; + this.to = to | 0; + this.colorId = colorId | 0; + } + static compare(a3, b) { + if (a3.colorId === b.colorId) { + if (a3.from === b.from) { + return a3.to - b.to; + } + return a3.from - b.from; + } + return a3.colorId - b.colorId; + } + }; + OverviewRulerZone = class { + constructor(startLineNumber, endLineNumber, heightInLines, color) { + this._overviewRulerZoneBrand = void 0; + this.startLineNumber = startLineNumber; + this.endLineNumber = endLineNumber; + this.heightInLines = heightInLines; + this.color = color; + this._colorZone = null; + } + static compare(a3, b) { + if (a3.color === b.color) { + if (a3.startLineNumber === b.startLineNumber) { + if (a3.heightInLines === b.heightInLines) { + return a3.endLineNumber - b.endLineNumber; + } + return a3.heightInLines - b.heightInLines; + } + return a3.startLineNumber - b.startLineNumber; + } + return a3.color < b.color ? -1 : 1; + } + setColorZone(colorZone) { + this._colorZone = colorZone; + } + getColorZones() { + return this._colorZone; + } + }; + OverviewZoneManager = class { + constructor(getVerticalOffsetForLine) { + this._getVerticalOffsetForLine = getVerticalOffsetForLine; + this._zones = []; + this._colorZonesInvalid = false; + this._lineHeight = 0; + this._domWidth = 0; + this._domHeight = 0; + this._outerHeight = 0; + this._pixelRatio = 1; + this._lastAssignedId = 0; + this._color2Id = /* @__PURE__ */ Object.create(null); + this._id2Color = []; + } + getId2Color() { + return this._id2Color; + } + setZones(newZones) { + this._zones = newZones; + this._zones.sort(OverviewRulerZone.compare); + } + setLineHeight(lineHeight) { + if (this._lineHeight === lineHeight) { + return false; + } + this._lineHeight = lineHeight; + this._colorZonesInvalid = true; + return true; + } + setPixelRatio(pixelRatio) { + this._pixelRatio = pixelRatio; + this._colorZonesInvalid = true; + } + getDOMWidth() { + return this._domWidth; + } + getCanvasWidth() { + return this._domWidth * this._pixelRatio; + } + setDOMWidth(width2) { + if (this._domWidth === width2) { + return false; + } + this._domWidth = width2; + this._colorZonesInvalid = true; + return true; + } + getDOMHeight() { + return this._domHeight; + } + getCanvasHeight() { + return this._domHeight * this._pixelRatio; + } + setDOMHeight(height) { + if (this._domHeight === height) { + return false; + } + this._domHeight = height; + this._colorZonesInvalid = true; + return true; + } + getOuterHeight() { + return this._outerHeight; + } + setOuterHeight(outerHeight) { + if (this._outerHeight === outerHeight) { + return false; + } + this._outerHeight = outerHeight; + this._colorZonesInvalid = true; + return true; + } + resolveColorZones() { + const colorZonesInvalid = this._colorZonesInvalid; + const lineHeight = Math.floor(this._lineHeight); + const totalHeight = Math.floor(this.getCanvasHeight()); + const outerHeight = Math.floor(this._outerHeight); + const heightRatio = totalHeight / outerHeight; + const halfMinimumHeight = Math.floor(4 * this._pixelRatio / 2); + const allColorZones = []; + for (let i = 0, len = this._zones.length; i < len; i++) { + const zone = this._zones[i]; + if (!colorZonesInvalid) { + const colorZone2 = zone.getColorZones(); + if (colorZone2) { + allColorZones.push(colorZone2); + continue; + } + } + const offset1 = this._getVerticalOffsetForLine(zone.startLineNumber); + const offset2 = zone.heightInLines === 0 ? this._getVerticalOffsetForLine(zone.endLineNumber) + lineHeight : offset1 + zone.heightInLines * lineHeight; + const y1 = Math.floor(heightRatio * offset1); + const y2 = Math.floor(heightRatio * offset2); + let ycenter = Math.floor((y1 + y2) / 2); + let halfHeight = y2 - ycenter; + if (halfHeight < halfMinimumHeight) { + halfHeight = halfMinimumHeight; + } + if (ycenter - halfHeight < 0) { + ycenter = halfHeight; + } + if (ycenter + halfHeight > totalHeight) { + ycenter = totalHeight - halfHeight; + } + const color = zone.color; + let colorId = this._color2Id[color]; + if (!colorId) { + colorId = ++this._lastAssignedId; + this._color2Id[color] = colorId; + this._id2Color[colorId] = color; + } + const colorZone = new ColorZone(ycenter - halfHeight, ycenter + halfHeight, colorId); + zone.setColorZone(colorZone); + allColorZones.push(colorZone); + } + this._colorZonesInvalid = false; + allColorZones.sort(ColorZone.compare); + return allColorZones; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/overviewRuler/overviewRuler.js +var OverviewRuler; +var init_overviewRuler = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/overviewRuler/overviewRuler.js"() { + init_fastDomNode(); + init_overviewZoneManager(); + init_viewEventHandler(); + OverviewRuler = class extends ViewEventHandler { + constructor(context, cssClassName) { + super(); + this._context = context; + const options2 = this._context.configuration.options; + this._domNode = createFastDomNode(document.createElement("canvas")); + this._domNode.setClassName(cssClassName); + this._domNode.setPosition("absolute"); + this._domNode.setLayerHinting(true); + this._domNode.setContain("strict"); + this._zoneManager = new OverviewZoneManager((lineNumber) => this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber)); + this._zoneManager.setDOMWidth(0); + this._zoneManager.setDOMHeight(0); + this._zoneManager.setOuterHeight(this._context.viewLayout.getScrollHeight()); + this._zoneManager.setLineHeight(options2.get( + 67 + /* EditorOption.lineHeight */ + )); + this._zoneManager.setPixelRatio(options2.get( + 143 + /* EditorOption.pixelRatio */ + )); + this._context.addEventHandler(this); + } + dispose() { + this._context.removeEventHandler(this); + super.dispose(); + } + // ---- begin view event handlers + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + if (e.hasChanged( + 67 + /* EditorOption.lineHeight */ + )) { + this._zoneManager.setLineHeight(options2.get( + 67 + /* EditorOption.lineHeight */ + )); + this._render(); + } + if (e.hasChanged( + 143 + /* EditorOption.pixelRatio */ + )) { + this._zoneManager.setPixelRatio(options2.get( + 143 + /* EditorOption.pixelRatio */ + )); + this._domNode.setWidth(this._zoneManager.getDOMWidth()); + this._domNode.setHeight(this._zoneManager.getDOMHeight()); + this._domNode.domNode.width = this._zoneManager.getCanvasWidth(); + this._domNode.domNode.height = this._zoneManager.getCanvasHeight(); + this._render(); + } + return true; + } + onFlushed(e) { + this._render(); + return true; + } + onScrollChanged(e) { + if (e.scrollHeightChanged) { + this._zoneManager.setOuterHeight(e.scrollHeight); + this._render(); + } + return true; + } + onZonesChanged(e) { + this._render(); + return true; + } + // ---- end view event handlers + getDomNode() { + return this._domNode.domNode; + } + setLayout(position) { + this._domNode.setTop(position.top); + this._domNode.setRight(position.right); + let hasChanged = false; + hasChanged = this._zoneManager.setDOMWidth(position.width) || hasChanged; + hasChanged = this._zoneManager.setDOMHeight(position.height) || hasChanged; + if (hasChanged) { + this._domNode.setWidth(this._zoneManager.getDOMWidth()); + this._domNode.setHeight(this._zoneManager.getDOMHeight()); + this._domNode.domNode.width = this._zoneManager.getCanvasWidth(); + this._domNode.domNode.height = this._zoneManager.getCanvasHeight(); + this._render(); + } + } + setZones(zones) { + this._zoneManager.setZones(zones); + this._render(); + } + _render() { + if (this._zoneManager.getOuterHeight() === 0) { + return false; + } + const width2 = this._zoneManager.getCanvasWidth(); + const height = this._zoneManager.getCanvasHeight(); + const colorZones = this._zoneManager.resolveColorZones(); + const id2Color = this._zoneManager.getId2Color(); + const ctx = this._domNode.domNode.getContext("2d"); + ctx.clearRect(0, 0, width2, height); + if (colorZones.length > 0) { + this._renderOneLane(ctx, colorZones, id2Color, width2); + } + return true; + } + _renderOneLane(ctx, colorZones, id2Color, width2) { + let currentColorId = 0; + let currentFrom = 0; + let currentTo = 0; + for (const zone of colorZones) { + const zoneColorId = zone.colorId; + const zoneFrom = zone.from; + const zoneTo = zone.to; + if (zoneColorId !== currentColorId) { + ctx.fillRect(0, currentFrom, width2, currentTo - currentFrom); + currentColorId = zoneColorId; + ctx.fillStyle = id2Color[currentColorId]; + currentFrom = zoneFrom; + currentTo = zoneTo; + } else { + if (currentTo >= zoneFrom) { + currentTo = Math.max(currentTo, zoneTo); + } else { + ctx.fillRect(0, currentFrom, width2, currentTo - currentFrom); + currentFrom = zoneFrom; + currentTo = zoneTo; + } + } + } + ctx.fillRect(0, currentFrom, width2, currentTo - currentFrom); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/rulers/rulers.css +var init_rulers = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/rulers/rulers.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/rulers/rulers.js +var Rulers; +var init_rulers2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/rulers/rulers.js"() { + init_rulers(); + init_fastDomNode(); + init_viewPart(); + Rulers = class extends ViewPart { + constructor(context) { + super(context); + this.domNode = createFastDomNode(document.createElement("div")); + this.domNode.setAttribute("role", "presentation"); + this.domNode.setAttribute("aria-hidden", "true"); + this.domNode.setClassName("view-rulers"); + this._renderedRulers = []; + const options2 = this._context.configuration.options; + this._rulers = options2.get( + 102 + /* EditorOption.rulers */ + ); + this._typicalHalfwidthCharacterWidth = options2.get( + 50 + /* EditorOption.fontInfo */ + ).typicalHalfwidthCharacterWidth; + } + dispose() { + super.dispose(); + } + // --- begin event handlers + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + this._rulers = options2.get( + 102 + /* EditorOption.rulers */ + ); + this._typicalHalfwidthCharacterWidth = options2.get( + 50 + /* EditorOption.fontInfo */ + ).typicalHalfwidthCharacterWidth; + return true; + } + onScrollChanged(e) { + return e.scrollHeightChanged; + } + // --- end event handlers + prepareRender(ctx) { + } + _ensureRulersCount() { + const currentCount = this._renderedRulers.length; + const desiredCount = this._rulers.length; + if (currentCount === desiredCount) { + return; + } + if (currentCount < desiredCount) { + const { tabSize } = this._context.viewModel.model.getOptions(); + const rulerWidth = tabSize; + let addCount = desiredCount - currentCount; + while (addCount > 0) { + const node = createFastDomNode(document.createElement("div")); + node.setClassName("view-ruler"); + node.setWidth(rulerWidth); + this.domNode.appendChild(node); + this._renderedRulers.push(node); + addCount--; + } + return; + } + let removeCount = currentCount - desiredCount; + while (removeCount > 0) { + const node = this._renderedRulers.pop(); + this.domNode.removeChild(node); + removeCount--; + } + } + render(ctx) { + this._ensureRulersCount(); + for (let i = 0, len = this._rulers.length; i < len; i++) { + const node = this._renderedRulers[i]; + const ruler = this._rulers[i]; + node.setBoxShadow(ruler.color ? `1px 0 0 0 ${ruler.color} inset` : ``); + node.setHeight(Math.min(ctx.scrollHeight, 1e6)); + node.setLeft(ruler.column * this._typicalHalfwidthCharacterWidth); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.css +var init_scrollDecoration = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.js +var ScrollDecorationViewPart; +var init_scrollDecoration2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.js"() { + init_scrollDecoration(); + init_fastDomNode(); + init_viewPart(); + ScrollDecorationViewPart = class extends ViewPart { + constructor(context) { + super(context); + this._scrollTop = 0; + this._width = 0; + this._updateWidth(); + this._shouldShow = false; + const options2 = this._context.configuration.options; + const scrollbar = options2.get( + 103 + /* EditorOption.scrollbar */ + ); + this._useShadows = scrollbar.useShadows; + this._domNode = createFastDomNode(document.createElement("div")); + this._domNode.setAttribute("role", "presentation"); + this._domNode.setAttribute("aria-hidden", "true"); + } + dispose() { + super.dispose(); + } + _updateShouldShow() { + const newShouldShow = this._useShadows && this._scrollTop > 0; + if (this._shouldShow !== newShouldShow) { + this._shouldShow = newShouldShow; + return true; + } + return false; + } + getDomNode() { + return this._domNode; + } + _updateWidth() { + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + if (layoutInfo.minimap.renderMinimap === 0 || layoutInfo.minimap.minimapWidth > 0 && layoutInfo.minimap.minimapLeft === 0) { + this._width = layoutInfo.width; + } else { + this._width = layoutInfo.width - layoutInfo.verticalScrollbarWidth; + } + } + // --- begin event handlers + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + const scrollbar = options2.get( + 103 + /* EditorOption.scrollbar */ + ); + this._useShadows = scrollbar.useShadows; + this._updateWidth(); + this._updateShouldShow(); + return true; + } + onScrollChanged(e) { + this._scrollTop = e.scrollTop; + return this._updateShouldShow(); + } + // --- end event handlers + prepareRender(ctx) { + } + render(ctx) { + this._domNode.setWidth(this._width); + this._domNode.setClassName(this._shouldShow ? "scroll-decoration" : ""); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/selections/selections.css +var init_selections = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/selections/selections.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/selections/selections.js +function toStyledRange(item) { + return new HorizontalRangeWithStyle(item); +} +function toStyled(item) { + return new LineVisibleRangesWithStyle(item.lineNumber, item.ranges.map(toStyledRange)); +} +function abs(n) { + return n < 0 ? -n : n; +} +var HorizontalRangeWithStyle, LineVisibleRangesWithStyle, SelectionsOverlay; +var init_selections2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/selections/selections.js"() { + init_selections(); + init_dynamicViewOverlay(); + init_colorRegistry(); + init_themeService(); + HorizontalRangeWithStyle = class { + constructor(other) { + this.left = other.left; + this.width = other.width; + this.startStyle = null; + this.endStyle = null; + } + }; + LineVisibleRangesWithStyle = class { + constructor(lineNumber, ranges) { + this.lineNumber = lineNumber; + this.ranges = ranges; + } + }; + SelectionsOverlay = class _SelectionsOverlay extends DynamicViewOverlay { + constructor(context) { + super(); + this._previousFrameVisibleRangesWithStyle = []; + this._context = context; + const options2 = this._context.configuration.options; + this._roundedSelection = options2.get( + 101 + /* EditorOption.roundedSelection */ + ); + this._typicalHalfwidthCharacterWidth = options2.get( + 50 + /* EditorOption.fontInfo */ + ).typicalHalfwidthCharacterWidth; + this._selections = []; + this._renderResult = null; + this._context.addEventHandler(this); + } + dispose() { + this._context.removeEventHandler(this); + this._renderResult = null; + super.dispose(); + } + // --- begin event handlers + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + this._roundedSelection = options2.get( + 101 + /* EditorOption.roundedSelection */ + ); + this._typicalHalfwidthCharacterWidth = options2.get( + 50 + /* EditorOption.fontInfo */ + ).typicalHalfwidthCharacterWidth; + return true; + } + onCursorStateChanged(e) { + this._selections = e.selections.slice(0); + return true; + } + onDecorationsChanged(e) { + return true; + } + onFlushed(e) { + return true; + } + onLinesChanged(e) { + return true; + } + onLinesDeleted(e) { + return true; + } + onLinesInserted(e) { + return true; + } + onScrollChanged(e) { + return e.scrollTopChanged; + } + onZonesChanged(e) { + return true; + } + // --- end event handlers + _visibleRangesHaveGaps(linesVisibleRanges) { + for (let i = 0, len = linesVisibleRanges.length; i < len; i++) { + const lineVisibleRanges = linesVisibleRanges[i]; + if (lineVisibleRanges.ranges.length > 1) { + return true; + } + } + return false; + } + _enrichVisibleRangesWithStyle(viewport, linesVisibleRanges, previousFrame) { + const epsilon = this._typicalHalfwidthCharacterWidth / 4; + let previousFrameTop = null; + let previousFrameBottom = null; + if (previousFrame && previousFrame.length > 0 && linesVisibleRanges.length > 0) { + const topLineNumber = linesVisibleRanges[0].lineNumber; + if (topLineNumber === viewport.startLineNumber) { + for (let i = 0; !previousFrameTop && i < previousFrame.length; i++) { + if (previousFrame[i].lineNumber === topLineNumber) { + previousFrameTop = previousFrame[i].ranges[0]; + } + } + } + const bottomLineNumber = linesVisibleRanges[linesVisibleRanges.length - 1].lineNumber; + if (bottomLineNumber === viewport.endLineNumber) { + for (let i = previousFrame.length - 1; !previousFrameBottom && i >= 0; i--) { + if (previousFrame[i].lineNumber === bottomLineNumber) { + previousFrameBottom = previousFrame[i].ranges[0]; + } + } + } + if (previousFrameTop && !previousFrameTop.startStyle) { + previousFrameTop = null; + } + if (previousFrameBottom && !previousFrameBottom.startStyle) { + previousFrameBottom = null; + } + } + for (let i = 0, len = linesVisibleRanges.length; i < len; i++) { + const curLineRange = linesVisibleRanges[i].ranges[0]; + const curLeft = curLineRange.left; + const curRight = curLineRange.left + curLineRange.width; + const startStyle = { + top: 0, + bottom: 0 + /* CornerStyle.EXTERN */ + }; + const endStyle = { + top: 0, + bottom: 0 + /* CornerStyle.EXTERN */ + }; + if (i > 0) { + const prevLeft = linesVisibleRanges[i - 1].ranges[0].left; + const prevRight = linesVisibleRanges[i - 1].ranges[0].left + linesVisibleRanges[i - 1].ranges[0].width; + if (abs(curLeft - prevLeft) < epsilon) { + startStyle.top = 2; + } else if (curLeft > prevLeft) { + startStyle.top = 1; + } + if (abs(curRight - prevRight) < epsilon) { + endStyle.top = 2; + } else if (prevLeft < curRight && curRight < prevRight) { + endStyle.top = 1; + } + } else if (previousFrameTop) { + startStyle.top = previousFrameTop.startStyle.top; + endStyle.top = previousFrameTop.endStyle.top; + } + if (i + 1 < len) { + const nextLeft = linesVisibleRanges[i + 1].ranges[0].left; + const nextRight = linesVisibleRanges[i + 1].ranges[0].left + linesVisibleRanges[i + 1].ranges[0].width; + if (abs(curLeft - nextLeft) < epsilon) { + startStyle.bottom = 2; + } else if (nextLeft < curLeft && curLeft < nextRight) { + startStyle.bottom = 1; + } + if (abs(curRight - nextRight) < epsilon) { + endStyle.bottom = 2; + } else if (curRight < nextRight) { + endStyle.bottom = 1; + } + } else if (previousFrameBottom) { + startStyle.bottom = previousFrameBottom.startStyle.bottom; + endStyle.bottom = previousFrameBottom.endStyle.bottom; + } + curLineRange.startStyle = startStyle; + curLineRange.endStyle = endStyle; + } + } + _getVisibleRangesWithStyle(selection, ctx, previousFrame) { + const _linesVisibleRanges = ctx.linesVisibleRangesForRange(selection, true) || []; + const linesVisibleRanges = _linesVisibleRanges.map(toStyled); + const visibleRangesHaveGaps = this._visibleRangesHaveGaps(linesVisibleRanges); + if (!visibleRangesHaveGaps && this._roundedSelection) { + this._enrichVisibleRangesWithStyle(ctx.visibleRange, linesVisibleRanges, previousFrame); + } + return linesVisibleRanges; + } + _createSelectionPiece(top, bottom, className, left, width2) { + return '
'; + } + _actualRenderOneSelection(output2, visibleStartLineNumber, hasMultipleSelections, visibleRanges) { + if (visibleRanges.length === 0) { + return; + } + const visibleRangesHaveStyle = !!visibleRanges[0].ranges[0].startStyle; + const firstLineNumber = visibleRanges[0].lineNumber; + const lastLineNumber = visibleRanges[visibleRanges.length - 1].lineNumber; + for (let i = 0, len = visibleRanges.length; i < len; i++) { + const lineVisibleRanges = visibleRanges[i]; + const lineNumber = lineVisibleRanges.lineNumber; + const lineIndex = lineNumber - visibleStartLineNumber; + const top = hasMultipleSelections ? lineNumber === firstLineNumber ? 1 : 0 : 0; + const bottom = hasMultipleSelections ? lineNumber !== firstLineNumber && lineNumber === lastLineNumber ? 1 : 0 : 0; + let innerCornerOutput = ""; + let restOfSelectionOutput = ""; + for (let j = 0, lenJ = lineVisibleRanges.ranges.length; j < lenJ; j++) { + const visibleRange = lineVisibleRanges.ranges[j]; + if (visibleRangesHaveStyle) { + const startStyle = visibleRange.startStyle; + const endStyle = visibleRange.endStyle; + if (startStyle.top === 1 || startStyle.bottom === 1) { + innerCornerOutput += this._createSelectionPiece(top, bottom, _SelectionsOverlay.SELECTION_CLASS_NAME, visibleRange.left - _SelectionsOverlay.ROUNDED_PIECE_WIDTH, _SelectionsOverlay.ROUNDED_PIECE_WIDTH); + let className2 = _SelectionsOverlay.EDITOR_BACKGROUND_CLASS_NAME; + if (startStyle.top === 1) { + className2 += " " + _SelectionsOverlay.SELECTION_TOP_RIGHT; + } + if (startStyle.bottom === 1) { + className2 += " " + _SelectionsOverlay.SELECTION_BOTTOM_RIGHT; + } + innerCornerOutput += this._createSelectionPiece(top, bottom, className2, visibleRange.left - _SelectionsOverlay.ROUNDED_PIECE_WIDTH, _SelectionsOverlay.ROUNDED_PIECE_WIDTH); + } + if (endStyle.top === 1 || endStyle.bottom === 1) { + innerCornerOutput += this._createSelectionPiece(top, bottom, _SelectionsOverlay.SELECTION_CLASS_NAME, visibleRange.left + visibleRange.width, _SelectionsOverlay.ROUNDED_PIECE_WIDTH); + let className2 = _SelectionsOverlay.EDITOR_BACKGROUND_CLASS_NAME; + if (endStyle.top === 1) { + className2 += " " + _SelectionsOverlay.SELECTION_TOP_LEFT; + } + if (endStyle.bottom === 1) { + className2 += " " + _SelectionsOverlay.SELECTION_BOTTOM_LEFT; + } + innerCornerOutput += this._createSelectionPiece(top, bottom, className2, visibleRange.left + visibleRange.width, _SelectionsOverlay.ROUNDED_PIECE_WIDTH); + } + } + let className = _SelectionsOverlay.SELECTION_CLASS_NAME; + if (visibleRangesHaveStyle) { + const startStyle = visibleRange.startStyle; + const endStyle = visibleRange.endStyle; + if (startStyle.top === 0) { + className += " " + _SelectionsOverlay.SELECTION_TOP_LEFT; + } + if (startStyle.bottom === 0) { + className += " " + _SelectionsOverlay.SELECTION_BOTTOM_LEFT; + } + if (endStyle.top === 0) { + className += " " + _SelectionsOverlay.SELECTION_TOP_RIGHT; + } + if (endStyle.bottom === 0) { + className += " " + _SelectionsOverlay.SELECTION_BOTTOM_RIGHT; + } + } + restOfSelectionOutput += this._createSelectionPiece(top, bottom, className, visibleRange.left, visibleRange.width); + } + output2[lineIndex][0] += innerCornerOutput; + output2[lineIndex][1] += restOfSelectionOutput; + } + } + prepareRender(ctx) { + const output = []; + const visibleStartLineNumber = ctx.visibleRange.startLineNumber; + const visibleEndLineNumber = ctx.visibleRange.endLineNumber; + for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) { + const lineIndex = lineNumber - visibleStartLineNumber; + output[lineIndex] = ["", ""]; + } + const thisFrameVisibleRangesWithStyle = []; + for (let i = 0, len = this._selections.length; i < len; i++) { + const selection = this._selections[i]; + if (selection.isEmpty()) { + thisFrameVisibleRangesWithStyle[i] = null; + continue; + } + const visibleRangesWithStyle = this._getVisibleRangesWithStyle(selection, ctx, this._previousFrameVisibleRangesWithStyle[i]); + thisFrameVisibleRangesWithStyle[i] = visibleRangesWithStyle; + this._actualRenderOneSelection(output, visibleStartLineNumber, this._selections.length > 1, visibleRangesWithStyle); + } + this._previousFrameVisibleRangesWithStyle = thisFrameVisibleRangesWithStyle; + this._renderResult = output.map(([internalCorners, restOfSelection]) => internalCorners + restOfSelection); + } + render(startLineNumber, lineNumber) { + if (!this._renderResult) { + return ""; + } + const lineIndex = lineNumber - startLineNumber; + if (lineIndex < 0 || lineIndex >= this._renderResult.length) { + return ""; + } + return this._renderResult[lineIndex]; + } + }; + SelectionsOverlay.SELECTION_CLASS_NAME = "selected-text"; + SelectionsOverlay.SELECTION_TOP_LEFT = "top-left-radius"; + SelectionsOverlay.SELECTION_BOTTOM_LEFT = "bottom-left-radius"; + SelectionsOverlay.SELECTION_TOP_RIGHT = "top-right-radius"; + SelectionsOverlay.SELECTION_BOTTOM_RIGHT = "bottom-right-radius"; + SelectionsOverlay.EDITOR_BACKGROUND_CLASS_NAME = "monaco-editor-background"; + SelectionsOverlay.ROUNDED_PIECE_WIDTH = 10; + registerThemingParticipant((theme, collector) => { + const editorSelectionForegroundColor = theme.getColor(editorSelectionForeground); + if (editorSelectionForegroundColor && !editorSelectionForegroundColor.isTransparent()) { + collector.addRule(`.monaco-editor .view-line span.inline-selected-text { color: ${editorSelectionForegroundColor}; }`); + } + }); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/viewCursors/viewCursors.css +var init_viewCursors = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/viewCursors/viewCursors.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/viewCursors/viewCursor.js +var ViewCursorRenderData, CursorPlurality, ViewCursor; +var init_viewCursor = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/viewCursors/viewCursor.js"() { + init_dom(); + init_fastDomNode(); + init_strings(); + init_domFontInfo(); + init_editorOptions(); + init_position(); + init_range(); + init_mouseCursor2(); + ViewCursorRenderData = class { + constructor(top, left, paddingLeft, width2, height, textContent, textContentClassName) { + this.top = top; + this.left = left; + this.paddingLeft = paddingLeft; + this.width = width2; + this.height = height; + this.textContent = textContent; + this.textContentClassName = textContentClassName; + } + }; + (function(CursorPlurality2) { + CursorPlurality2[CursorPlurality2["Single"] = 0] = "Single"; + CursorPlurality2[CursorPlurality2["MultiPrimary"] = 1] = "MultiPrimary"; + CursorPlurality2[CursorPlurality2["MultiSecondary"] = 2] = "MultiSecondary"; + })(CursorPlurality || (CursorPlurality = {})); + ViewCursor = class { + constructor(context, plurality) { + this._context = context; + const options2 = this._context.configuration.options; + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + this._cursorStyle = options2.get( + 28 + /* EditorOption.cursorStyle */ + ); + this._lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this._typicalHalfwidthCharacterWidth = fontInfo.typicalHalfwidthCharacterWidth; + this._lineCursorWidth = Math.min(options2.get( + 31 + /* EditorOption.cursorWidth */ + ), this._typicalHalfwidthCharacterWidth); + this._isVisible = true; + this._domNode = createFastDomNode(document.createElement("div")); + this._domNode.setClassName(`cursor ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`); + this._domNode.setHeight(this._lineHeight); + this._domNode.setTop(0); + this._domNode.setLeft(0); + applyFontInfo(this._domNode, fontInfo); + this._domNode.setDisplay("none"); + this._position = new Position(1, 1); + this._pluralityClass = ""; + this.setPlurality(plurality); + this._lastRenderedContent = ""; + this._renderData = null; + } + getDomNode() { + return this._domNode; + } + getPosition() { + return this._position; + } + setPlurality(plurality) { + switch (plurality) { + default: + case CursorPlurality.Single: + this._pluralityClass = ""; + break; + case CursorPlurality.MultiPrimary: + this._pluralityClass = "cursor-primary"; + break; + case CursorPlurality.MultiSecondary: + this._pluralityClass = "cursor-secondary"; + break; + } + } + show() { + if (!this._isVisible) { + this._domNode.setVisibility("inherit"); + this._isVisible = true; + } + } + hide() { + if (this._isVisible) { + this._domNode.setVisibility("hidden"); + this._isVisible = false; + } + } + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + this._cursorStyle = options2.get( + 28 + /* EditorOption.cursorStyle */ + ); + this._lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this._typicalHalfwidthCharacterWidth = fontInfo.typicalHalfwidthCharacterWidth; + this._lineCursorWidth = Math.min(options2.get( + 31 + /* EditorOption.cursorWidth */ + ), this._typicalHalfwidthCharacterWidth); + applyFontInfo(this._domNode, fontInfo); + return true; + } + onCursorPositionChanged(position, pauseAnimation) { + if (pauseAnimation) { + this._domNode.domNode.style.transitionProperty = "none"; + } else { + this._domNode.domNode.style.transitionProperty = ""; + } + this._position = position; + return true; + } + /** + * If `this._position` is inside a grapheme, returns the position where the grapheme starts. + * Also returns the next grapheme. + */ + _getGraphemeAwarePosition() { + const { lineNumber, column } = this._position; + const lineContent = this._context.viewModel.getLineContent(lineNumber); + const [startOffset, endOffset] = getCharContainingOffset(lineContent, column - 1); + return [new Position(lineNumber, startOffset + 1), lineContent.substring(startOffset, endOffset)]; + } + _prepareRender(ctx) { + let textContent = ""; + let textContentClassName = ""; + const [position, nextGrapheme] = this._getGraphemeAwarePosition(); + if (this._cursorStyle === TextEditorCursorStyle.Line || this._cursorStyle === TextEditorCursorStyle.LineThin) { + const visibleRange = ctx.visibleRangeForPosition(position); + if (!visibleRange || visibleRange.outsideRenderedLine) { + return null; + } + const window2 = getWindow(this._domNode.domNode); + let width3; + if (this._cursorStyle === TextEditorCursorStyle.Line) { + width3 = computeScreenAwareSize(window2, this._lineCursorWidth > 0 ? this._lineCursorWidth : 2); + if (width3 > 2) { + textContent = nextGrapheme; + textContentClassName = this._getTokenClassName(position); + } + } else { + width3 = computeScreenAwareSize(window2, 1); + } + let left = visibleRange.left; + let paddingLeft = 0; + if (width3 >= 2 && left >= 1) { + paddingLeft = 1; + left -= paddingLeft; + } + const top2 = ctx.getVerticalOffsetForLineNumber(position.lineNumber) - ctx.bigNumbersDelta; + return new ViewCursorRenderData(top2, left, paddingLeft, width3, this._lineHeight, textContent, textContentClassName); + } + const visibleRangeForCharacter = ctx.linesVisibleRangesForRange(new Range(position.lineNumber, position.column, position.lineNumber, position.column + nextGrapheme.length), false); + if (!visibleRangeForCharacter || visibleRangeForCharacter.length === 0) { + return null; + } + const firstVisibleRangeForCharacter = visibleRangeForCharacter[0]; + if (firstVisibleRangeForCharacter.outsideRenderedLine || firstVisibleRangeForCharacter.ranges.length === 0) { + return null; + } + const range2 = firstVisibleRangeForCharacter.ranges[0]; + const width2 = nextGrapheme === " " ? this._typicalHalfwidthCharacterWidth : range2.width < 1 ? this._typicalHalfwidthCharacterWidth : range2.width; + if (this._cursorStyle === TextEditorCursorStyle.Block) { + textContent = nextGrapheme; + textContentClassName = this._getTokenClassName(position); + } + let top = ctx.getVerticalOffsetForLineNumber(position.lineNumber) - ctx.bigNumbersDelta; + let height = this._lineHeight; + if (this._cursorStyle === TextEditorCursorStyle.Underline || this._cursorStyle === TextEditorCursorStyle.UnderlineThin) { + top += this._lineHeight - 2; + height = 2; + } + return new ViewCursorRenderData(top, range2.left, 0, width2, height, textContent, textContentClassName); + } + _getTokenClassName(position) { + const lineData = this._context.viewModel.getViewLineData(position.lineNumber); + const tokenIndex = lineData.tokens.findTokenIndexAtOffset(position.column - 1); + return lineData.tokens.getClassName(tokenIndex); + } + prepareRender(ctx) { + this._renderData = this._prepareRender(ctx); + } + render(ctx) { + if (!this._renderData) { + this._domNode.setDisplay("none"); + return null; + } + if (this._lastRenderedContent !== this._renderData.textContent) { + this._lastRenderedContent = this._renderData.textContent; + this._domNode.domNode.textContent = this._lastRenderedContent; + } + this._domNode.setClassName(`cursor ${this._pluralityClass} ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME} ${this._renderData.textContentClassName}`); + this._domNode.setDisplay("block"); + this._domNode.setTop(this._renderData.top); + this._domNode.setLeft(this._renderData.left); + this._domNode.setPaddingLeft(this._renderData.paddingLeft); + this._domNode.setWidth(this._renderData.width); + this._domNode.setLineHeight(this._renderData.height); + this._domNode.setHeight(this._renderData.height); + return { + domNode: this._domNode.domNode, + position: this._position, + contentLeft: this._renderData.left, + height: this._renderData.height, + width: 2 + }; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/viewCursors/viewCursors.js +var ViewCursors; +var init_viewCursors2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/viewCursors/viewCursors.js"() { + init_viewCursors(); + init_fastDomNode(); + init_async(); + init_viewPart(); + init_viewCursor(); + init_editorOptions(); + init_editorColorRegistry(); + init_themeService(); + init_theme(); + init_dom(); + ViewCursors = class _ViewCursors extends ViewPart { + constructor(context) { + super(context); + const options2 = this._context.configuration.options; + this._readOnly = options2.get( + 91 + /* EditorOption.readOnly */ + ); + this._cursorBlinking = options2.get( + 26 + /* EditorOption.cursorBlinking */ + ); + this._cursorStyle = options2.get( + 28 + /* EditorOption.cursorStyle */ + ); + this._cursorSmoothCaretAnimation = options2.get( + 27 + /* EditorOption.cursorSmoothCaretAnimation */ + ); + this._selectionIsEmpty = true; + this._isComposingInput = false; + this._isVisible = false; + this._primaryCursor = new ViewCursor(this._context, CursorPlurality.Single); + this._secondaryCursors = []; + this._renderData = []; + this._domNode = createFastDomNode(document.createElement("div")); + this._domNode.setAttribute("role", "presentation"); + this._domNode.setAttribute("aria-hidden", "true"); + this._updateDomClassName(); + this._domNode.appendChild(this._primaryCursor.getDomNode()); + this._startCursorBlinkAnimation = new TimeoutTimer(); + this._cursorFlatBlinkInterval = new WindowIntervalTimer(); + this._blinkingEnabled = false; + this._editorHasFocus = false; + this._updateBlinking(); + } + dispose() { + super.dispose(); + this._startCursorBlinkAnimation.dispose(); + this._cursorFlatBlinkInterval.dispose(); + } + getDomNode() { + return this._domNode; + } + // --- begin event handlers + onCompositionStart(e) { + this._isComposingInput = true; + this._updateBlinking(); + return true; + } + onCompositionEnd(e) { + this._isComposingInput = false; + this._updateBlinking(); + return true; + } + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + this._readOnly = options2.get( + 91 + /* EditorOption.readOnly */ + ); + this._cursorBlinking = options2.get( + 26 + /* EditorOption.cursorBlinking */ + ); + this._cursorStyle = options2.get( + 28 + /* EditorOption.cursorStyle */ + ); + this._cursorSmoothCaretAnimation = options2.get( + 27 + /* EditorOption.cursorSmoothCaretAnimation */ + ); + this._updateBlinking(); + this._updateDomClassName(); + this._primaryCursor.onConfigurationChanged(e); + for (let i = 0, len = this._secondaryCursors.length; i < len; i++) { + this._secondaryCursors[i].onConfigurationChanged(e); + } + return true; + } + _onCursorPositionChanged(position, secondaryPositions, reason) { + const pauseAnimation = this._secondaryCursors.length !== secondaryPositions.length || this._cursorSmoothCaretAnimation === "explicit" && reason !== 3; + this._primaryCursor.setPlurality(secondaryPositions.length ? CursorPlurality.MultiPrimary : CursorPlurality.Single); + this._primaryCursor.onCursorPositionChanged(position, pauseAnimation); + this._updateBlinking(); + if (this._secondaryCursors.length < secondaryPositions.length) { + const addCnt = secondaryPositions.length - this._secondaryCursors.length; + for (let i = 0; i < addCnt; i++) { + const newCursor = new ViewCursor(this._context, CursorPlurality.MultiSecondary); + this._domNode.domNode.insertBefore(newCursor.getDomNode().domNode, this._primaryCursor.getDomNode().domNode.nextSibling); + this._secondaryCursors.push(newCursor); + } + } else if (this._secondaryCursors.length > secondaryPositions.length) { + const removeCnt = this._secondaryCursors.length - secondaryPositions.length; + for (let i = 0; i < removeCnt; i++) { + this._domNode.removeChild(this._secondaryCursors[0].getDomNode()); + this._secondaryCursors.splice(0, 1); + } + } + for (let i = 0; i < secondaryPositions.length; i++) { + this._secondaryCursors[i].onCursorPositionChanged(secondaryPositions[i], pauseAnimation); + } + } + onCursorStateChanged(e) { + const positions = []; + for (let i = 0, len = e.selections.length; i < len; i++) { + positions[i] = e.selections[i].getPosition(); + } + this._onCursorPositionChanged(positions[0], positions.slice(1), e.reason); + const selectionIsEmpty = e.selections[0].isEmpty(); + if (this._selectionIsEmpty !== selectionIsEmpty) { + this._selectionIsEmpty = selectionIsEmpty; + this._updateDomClassName(); + } + return true; + } + onDecorationsChanged(e) { + return true; + } + onFlushed(e) { + return true; + } + onFocusChanged(e) { + this._editorHasFocus = e.isFocused; + this._updateBlinking(); + return false; + } + onLinesChanged(e) { + return true; + } + onLinesDeleted(e) { + return true; + } + onLinesInserted(e) { + return true; + } + onScrollChanged(e) { + return true; + } + onTokensChanged(e) { + const shouldRender = (position) => { + for (let i = 0, len = e.ranges.length; i < len; i++) { + if (e.ranges[i].fromLineNumber <= position.lineNumber && position.lineNumber <= e.ranges[i].toLineNumber) { + return true; + } + } + return false; + }; + if (shouldRender(this._primaryCursor.getPosition())) { + return true; + } + for (const secondaryCursor of this._secondaryCursors) { + if (shouldRender(secondaryCursor.getPosition())) { + return true; + } + } + return false; + } + onZonesChanged(e) { + return true; + } + // --- end event handlers + // ---- blinking logic + _getCursorBlinking() { + if (this._isComposingInput) { + return 0; + } + if (!this._editorHasFocus) { + return 0; + } + if (this._readOnly) { + return 5; + } + return this._cursorBlinking; + } + _updateBlinking() { + this._startCursorBlinkAnimation.cancel(); + this._cursorFlatBlinkInterval.cancel(); + const blinkingStyle = this._getCursorBlinking(); + const isHidden = blinkingStyle === 0; + const isSolid = blinkingStyle === 5; + if (isHidden) { + this._hide(); + } else { + this._show(); + } + this._blinkingEnabled = false; + this._updateDomClassName(); + if (!isHidden && !isSolid) { + if (blinkingStyle === 1) { + this._cursorFlatBlinkInterval.cancelAndSet(() => { + if (this._isVisible) { + this._hide(); + } else { + this._show(); + } + }, _ViewCursors.BLINK_INTERVAL, getWindow(this._domNode.domNode)); + } else { + this._startCursorBlinkAnimation.setIfNotSet(() => { + this._blinkingEnabled = true; + this._updateDomClassName(); + }, _ViewCursors.BLINK_INTERVAL); + } + } + } + // --- end blinking logic + _updateDomClassName() { + this._domNode.setClassName(this._getClassName()); + } + _getClassName() { + let result = "cursors-layer"; + if (!this._selectionIsEmpty) { + result += " has-selection"; + } + switch (this._cursorStyle) { + case TextEditorCursorStyle.Line: + result += " cursor-line-style"; + break; + case TextEditorCursorStyle.Block: + result += " cursor-block-style"; + break; + case TextEditorCursorStyle.Underline: + result += " cursor-underline-style"; + break; + case TextEditorCursorStyle.LineThin: + result += " cursor-line-thin-style"; + break; + case TextEditorCursorStyle.BlockOutline: + result += " cursor-block-outline-style"; + break; + case TextEditorCursorStyle.UnderlineThin: + result += " cursor-underline-thin-style"; + break; + default: + result += " cursor-line-style"; + } + if (this._blinkingEnabled) { + switch (this._getCursorBlinking()) { + case 1: + result += " cursor-blink"; + break; + case 2: + result += " cursor-smooth"; + break; + case 3: + result += " cursor-phase"; + break; + case 4: + result += " cursor-expand"; + break; + case 5: + result += " cursor-solid"; + break; + default: + result += " cursor-solid"; + } + } else { + result += " cursor-solid"; + } + if (this._cursorSmoothCaretAnimation === "on" || this._cursorSmoothCaretAnimation === "explicit") { + result += " cursor-smooth-caret-animation"; + } + return result; + } + _show() { + this._primaryCursor.show(); + for (let i = 0, len = this._secondaryCursors.length; i < len; i++) { + this._secondaryCursors[i].show(); + } + this._isVisible = true; + } + _hide() { + this._primaryCursor.hide(); + for (let i = 0, len = this._secondaryCursors.length; i < len; i++) { + this._secondaryCursors[i].hide(); + } + this._isVisible = false; + } + // ---- IViewPart implementation + prepareRender(ctx) { + this._primaryCursor.prepareRender(ctx); + for (let i = 0, len = this._secondaryCursors.length; i < len; i++) { + this._secondaryCursors[i].prepareRender(ctx); + } + } + render(ctx) { + const renderData = []; + let renderDataLen = 0; + const primaryRenderData = this._primaryCursor.render(ctx); + if (primaryRenderData) { + renderData[renderDataLen++] = primaryRenderData; + } + for (let i = 0, len = this._secondaryCursors.length; i < len; i++) { + const secondaryRenderData = this._secondaryCursors[i].render(ctx); + if (secondaryRenderData) { + renderData[renderDataLen++] = secondaryRenderData; + } + } + this._renderData = renderData; + } + getLastRenderData() { + return this._renderData; + } + }; + ViewCursors.BLINK_INTERVAL = 500; + registerThemingParticipant((theme, collector) => { + const cursorThemes = [ + { class: ".cursor", foreground: editorCursorForeground, background: editorCursorBackground }, + { class: ".cursor-primary", foreground: editorMultiCursorPrimaryForeground, background: editorMultiCursorPrimaryBackground }, + { class: ".cursor-secondary", foreground: editorMultiCursorSecondaryForeground, background: editorMultiCursorSecondaryBackground } + ]; + for (const cursorTheme of cursorThemes) { + const caret = theme.getColor(cursorTheme.foreground); + if (caret) { + let caretBackground = theme.getColor(cursorTheme.background); + if (!caretBackground) { + caretBackground = caret.opposite(); + } + collector.addRule(`.monaco-editor .cursors-layer ${cursorTheme.class} { background-color: ${caret}; border-color: ${caret}; color: ${caretBackground}; }`); + if (isHighContrast(theme.type)) { + collector.addRule(`.monaco-editor .cursors-layer.has-selection ${cursorTheme.class} { border-left: 1px solid ${caretBackground}; border-right: 1px solid ${caretBackground}; }`); + } + } + } + }); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/viewZones/viewZones.js +function safeInvoke1Arg(func, arg1) { + try { + return func(arg1); + } catch (e) { + onUnexpectedError(e); + } +} +var invalidFunc, ViewZones; +var init_viewZones = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/viewZones/viewZones.js"() { + init_fastDomNode(); + init_errors(); + init_viewPart(); + init_position(); + invalidFunc = () => { + throw new Error(`Invalid change accessor`); + }; + ViewZones = class extends ViewPart { + constructor(context) { + super(context); + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this._contentWidth = layoutInfo.contentWidth; + this._contentLeft = layoutInfo.contentLeft; + this.domNode = createFastDomNode(document.createElement("div")); + this.domNode.setClassName("view-zones"); + this.domNode.setPosition("absolute"); + this.domNode.setAttribute("role", "presentation"); + this.domNode.setAttribute("aria-hidden", "true"); + this.marginDomNode = createFastDomNode(document.createElement("div")); + this.marginDomNode.setClassName("margin-view-zones"); + this.marginDomNode.setPosition("absolute"); + this.marginDomNode.setAttribute("role", "presentation"); + this.marginDomNode.setAttribute("aria-hidden", "true"); + this._zones = {}; + } + dispose() { + super.dispose(); + this._zones = {}; + } + // ---- begin view event handlers + _recomputeWhitespacesProps() { + const whitespaces = this._context.viewLayout.getWhitespaces(); + const oldWhitespaces = /* @__PURE__ */ new Map(); + for (const whitespace of whitespaces) { + oldWhitespaces.set(whitespace.id, whitespace); + } + let hadAChange = false; + this._context.viewModel.changeWhitespace((whitespaceAccessor) => { + const keys = Object.keys(this._zones); + for (let i = 0, len = keys.length; i < len; i++) { + const id = keys[i]; + const zone = this._zones[id]; + const props = this._computeWhitespaceProps(zone.delegate); + zone.isInHiddenArea = props.isInHiddenArea; + const oldWhitespace = oldWhitespaces.get(id); + if (oldWhitespace && (oldWhitespace.afterLineNumber !== props.afterViewLineNumber || oldWhitespace.height !== props.heightInPx)) { + whitespaceAccessor.changeOneWhitespace(id, props.afterViewLineNumber, props.heightInPx); + this._safeCallOnComputedHeight(zone.delegate, props.heightInPx); + hadAChange = true; + } + } + }); + return hadAChange; + } + onConfigurationChanged(e) { + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this._contentWidth = layoutInfo.contentWidth; + this._contentLeft = layoutInfo.contentLeft; + if (e.hasChanged( + 67 + /* EditorOption.lineHeight */ + )) { + this._recomputeWhitespacesProps(); + } + return true; + } + onLineMappingChanged(e) { + return this._recomputeWhitespacesProps(); + } + onLinesDeleted(e) { + return true; + } + onScrollChanged(e) { + return e.scrollTopChanged || e.scrollWidthChanged; + } + onZonesChanged(e) { + return true; + } + onLinesInserted(e) { + return true; + } + // ---- end view event handlers + _getZoneOrdinal(zone) { + var _a10, _b4; + return (_b4 = (_a10 = zone.ordinal) !== null && _a10 !== void 0 ? _a10 : zone.afterColumn) !== null && _b4 !== void 0 ? _b4 : 1e4; + } + _computeWhitespaceProps(zone) { + if (zone.afterLineNumber === 0) { + return { + isInHiddenArea: false, + afterViewLineNumber: 0, + heightInPx: this._heightInPixels(zone), + minWidthInPx: this._minWidthInPixels(zone) + }; + } + let zoneAfterModelPosition; + if (typeof zone.afterColumn !== "undefined") { + zoneAfterModelPosition = this._context.viewModel.model.validatePosition({ + lineNumber: zone.afterLineNumber, + column: zone.afterColumn + }); + } else { + const validAfterLineNumber = this._context.viewModel.model.validatePosition({ + lineNumber: zone.afterLineNumber, + column: 1 + }).lineNumber; + zoneAfterModelPosition = new Position(validAfterLineNumber, this._context.viewModel.model.getLineMaxColumn(validAfterLineNumber)); + } + let zoneBeforeModelPosition; + if (zoneAfterModelPosition.column === this._context.viewModel.model.getLineMaxColumn(zoneAfterModelPosition.lineNumber)) { + zoneBeforeModelPosition = this._context.viewModel.model.validatePosition({ + lineNumber: zoneAfterModelPosition.lineNumber + 1, + column: 1 + }); + } else { + zoneBeforeModelPosition = this._context.viewModel.model.validatePosition({ + lineNumber: zoneAfterModelPosition.lineNumber, + column: zoneAfterModelPosition.column + 1 + }); + } + const viewPosition = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(zoneAfterModelPosition, zone.afterColumnAffinity, true); + const isVisible = zone.showInHiddenAreas || this._context.viewModel.coordinatesConverter.modelPositionIsVisible(zoneBeforeModelPosition); + return { + isInHiddenArea: !isVisible, + afterViewLineNumber: viewPosition.lineNumber, + heightInPx: isVisible ? this._heightInPixels(zone) : 0, + minWidthInPx: this._minWidthInPixels(zone) + }; + } + changeViewZones(callback) { + let zonesHaveChanged = false; + this._context.viewModel.changeWhitespace((whitespaceAccessor) => { + const changeAccessor = { + addZone: (zone) => { + zonesHaveChanged = true; + return this._addZone(whitespaceAccessor, zone); + }, + removeZone: (id) => { + if (!id) { + return; + } + zonesHaveChanged = this._removeZone(whitespaceAccessor, id) || zonesHaveChanged; + }, + layoutZone: (id) => { + if (!id) { + return; + } + zonesHaveChanged = this._layoutZone(whitespaceAccessor, id) || zonesHaveChanged; + } + }; + safeInvoke1Arg(callback, changeAccessor); + changeAccessor.addZone = invalidFunc; + changeAccessor.removeZone = invalidFunc; + changeAccessor.layoutZone = invalidFunc; + }); + return zonesHaveChanged; + } + _addZone(whitespaceAccessor, zone) { + const props = this._computeWhitespaceProps(zone); + const whitespaceId = whitespaceAccessor.insertWhitespace(props.afterViewLineNumber, this._getZoneOrdinal(zone), props.heightInPx, props.minWidthInPx); + const myZone = { + whitespaceId, + delegate: zone, + isInHiddenArea: props.isInHiddenArea, + isVisible: false, + domNode: createFastDomNode(zone.domNode), + marginDomNode: zone.marginDomNode ? createFastDomNode(zone.marginDomNode) : null + }; + this._safeCallOnComputedHeight(myZone.delegate, props.heightInPx); + myZone.domNode.setPosition("absolute"); + myZone.domNode.domNode.style.width = "100%"; + myZone.domNode.setDisplay("none"); + myZone.domNode.setAttribute("monaco-view-zone", myZone.whitespaceId); + this.domNode.appendChild(myZone.domNode); + if (myZone.marginDomNode) { + myZone.marginDomNode.setPosition("absolute"); + myZone.marginDomNode.domNode.style.width = "100%"; + myZone.marginDomNode.setDisplay("none"); + myZone.marginDomNode.setAttribute("monaco-view-zone", myZone.whitespaceId); + this.marginDomNode.appendChild(myZone.marginDomNode); + } + this._zones[myZone.whitespaceId] = myZone; + this.setShouldRender(); + return myZone.whitespaceId; + } + _removeZone(whitespaceAccessor, id) { + if (this._zones.hasOwnProperty(id)) { + const zone = this._zones[id]; + delete this._zones[id]; + whitespaceAccessor.removeWhitespace(zone.whitespaceId); + zone.domNode.removeAttribute("monaco-visible-view-zone"); + zone.domNode.removeAttribute("monaco-view-zone"); + zone.domNode.domNode.parentNode.removeChild(zone.domNode.domNode); + if (zone.marginDomNode) { + zone.marginDomNode.removeAttribute("monaco-visible-view-zone"); + zone.marginDomNode.removeAttribute("monaco-view-zone"); + zone.marginDomNode.domNode.parentNode.removeChild(zone.marginDomNode.domNode); + } + this.setShouldRender(); + return true; + } + return false; + } + _layoutZone(whitespaceAccessor, id) { + if (this._zones.hasOwnProperty(id)) { + const zone = this._zones[id]; + const props = this._computeWhitespaceProps(zone.delegate); + zone.isInHiddenArea = props.isInHiddenArea; + whitespaceAccessor.changeOneWhitespace(zone.whitespaceId, props.afterViewLineNumber, props.heightInPx); + this._safeCallOnComputedHeight(zone.delegate, props.heightInPx); + this.setShouldRender(); + return true; + } + return false; + } + shouldSuppressMouseDownOnViewZone(id) { + if (this._zones.hasOwnProperty(id)) { + const zone = this._zones[id]; + return Boolean(zone.delegate.suppressMouseDown); + } + return false; + } + _heightInPixels(zone) { + if (typeof zone.heightInPx === "number") { + return zone.heightInPx; + } + if (typeof zone.heightInLines === "number") { + return this._lineHeight * zone.heightInLines; + } + return this._lineHeight; + } + _minWidthInPixels(zone) { + if (typeof zone.minWidthInPx === "number") { + return zone.minWidthInPx; + } + return 0; + } + _safeCallOnComputedHeight(zone, height) { + if (typeof zone.onComputedHeight === "function") { + try { + zone.onComputedHeight(height); + } catch (e) { + onUnexpectedError(e); + } + } + } + _safeCallOnDomNodeTop(zone, top) { + if (typeof zone.onDomNodeTop === "function") { + try { + zone.onDomNodeTop(top); + } catch (e) { + onUnexpectedError(e); + } + } + } + prepareRender(ctx) { + } + render(ctx) { + const visibleWhitespaces = ctx.viewportData.whitespaceViewportData; + const visibleZones = {}; + let hasVisibleZone = false; + for (const visibleWhitespace of visibleWhitespaces) { + if (this._zones[visibleWhitespace.id].isInHiddenArea) { + continue; + } + visibleZones[visibleWhitespace.id] = visibleWhitespace; + hasVisibleZone = true; + } + const keys = Object.keys(this._zones); + for (let i = 0, len = keys.length; i < len; i++) { + const id = keys[i]; + const zone = this._zones[id]; + let newTop = 0; + let newHeight = 0; + let newDisplay = "none"; + if (visibleZones.hasOwnProperty(id)) { + newTop = visibleZones[id].verticalOffset - ctx.bigNumbersDelta; + newHeight = visibleZones[id].height; + newDisplay = "block"; + if (!zone.isVisible) { + zone.domNode.setAttribute("monaco-visible-view-zone", "true"); + zone.isVisible = true; + } + this._safeCallOnDomNodeTop(zone.delegate, ctx.getScrolledTopFromAbsoluteTop(visibleZones[id].verticalOffset)); + } else { + if (zone.isVisible) { + zone.domNode.removeAttribute("monaco-visible-view-zone"); + zone.isVisible = false; + } + this._safeCallOnDomNodeTop(zone.delegate, ctx.getScrolledTopFromAbsoluteTop(-1e6)); + } + zone.domNode.setTop(newTop); + zone.domNode.setHeight(newHeight); + zone.domNode.setDisplay(newDisplay); + if (zone.marginDomNode) { + zone.marginDomNode.setTop(newTop); + zone.marginDomNode.setHeight(newHeight); + zone.marginDomNode.setDisplay(newDisplay); + } + } + if (hasVisibleZone) { + this.domNode.setWidth(Math.max(ctx.scrollWidth, this._contentWidth)); + this.marginDomNode.setWidth(this._contentLeft); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/whitespace/whitespace.css +var init_whitespace = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/whitespace/whitespace.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/viewParts/whitespace/whitespace.js +var WhitespaceOverlay, WhitespaceOptions; +var init_whitespace2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/viewParts/whitespace/whitespace.js"() { + init_whitespace(); + init_dynamicViewOverlay(); + init_strings(); + init_viewLineRenderer(); + init_position(); + init_editorColorRegistry(); + WhitespaceOverlay = class extends DynamicViewOverlay { + constructor(context) { + super(); + this._context = context; + this._options = new WhitespaceOptions(this._context.configuration); + this._selection = []; + this._renderResult = null; + this._context.addEventHandler(this); + } + dispose() { + this._context.removeEventHandler(this); + this._renderResult = null; + super.dispose(); + } + // --- begin event handlers + onConfigurationChanged(e) { + const newOptions = new WhitespaceOptions(this._context.configuration); + if (this._options.equals(newOptions)) { + return e.hasChanged( + 145 + /* EditorOption.layoutInfo */ + ); + } + this._options = newOptions; + return true; + } + onCursorStateChanged(e) { + this._selection = e.selections; + if (this._options.renderWhitespace === "selection") { + return true; + } + return false; + } + onDecorationsChanged(e) { + return true; + } + onFlushed(e) { + return true; + } + onLinesChanged(e) { + return true; + } + onLinesDeleted(e) { + return true; + } + onLinesInserted(e) { + return true; + } + onScrollChanged(e) { + return e.scrollTopChanged; + } + onZonesChanged(e) { + return true; + } + // --- end event handlers + prepareRender(ctx) { + if (this._options.renderWhitespace === "none") { + this._renderResult = null; + return; + } + const startLineNumber = ctx.visibleRange.startLineNumber; + const endLineNumber = ctx.visibleRange.endLineNumber; + const lineCount = endLineNumber - startLineNumber + 1; + const needed = new Array(lineCount); + for (let i = 0; i < lineCount; i++) { + needed[i] = true; + } + const viewportData = this._context.viewModel.getMinimapLinesRenderingData(ctx.viewportData.startLineNumber, ctx.viewportData.endLineNumber, needed); + this._renderResult = []; + for (let lineNumber = ctx.viewportData.startLineNumber; lineNumber <= ctx.viewportData.endLineNumber; lineNumber++) { + const lineIndex = lineNumber - ctx.viewportData.startLineNumber; + const lineData = viewportData.data[lineIndex]; + let selectionsOnLine = null; + if (this._options.renderWhitespace === "selection") { + const selections = this._selection; + for (const selection of selections) { + if (selection.endLineNumber < lineNumber || selection.startLineNumber > lineNumber) { + continue; + } + const startColumn = selection.startLineNumber === lineNumber ? selection.startColumn : lineData.minColumn; + const endColumn = selection.endLineNumber === lineNumber ? selection.endColumn : lineData.maxColumn; + if (startColumn < endColumn) { + if (!selectionsOnLine) { + selectionsOnLine = []; + } + selectionsOnLine.push(new LineRange2(startColumn - 1, endColumn - 1)); + } + } + } + this._renderResult[lineIndex] = this._applyRenderWhitespace(ctx, lineNumber, selectionsOnLine, lineData); + } + } + _applyRenderWhitespace(ctx, lineNumber, selections, lineData) { + if (this._options.renderWhitespace === "selection" && !selections) { + return ""; + } + if (this._options.renderWhitespace === "trailing" && lineData.continuesWithWrappedLine) { + return ""; + } + const color = this._context.theme.getColor(editorWhitespaces); + const USE_SVG = this._options.renderWithSVG; + const lineContent = lineData.content; + const len = this._options.stopRenderingLineAfter === -1 ? lineContent.length : Math.min(this._options.stopRenderingLineAfter, lineContent.length); + const continuesWithWrappedLine = lineData.continuesWithWrappedLine; + const fauxIndentLength = lineData.minColumn - 1; + const onlyBoundary = this._options.renderWhitespace === "boundary"; + const onlyTrailing = this._options.renderWhitespace === "trailing"; + const lineHeight = this._options.lineHeight; + const middotWidth = this._options.middotWidth; + const wsmiddotWidth = this._options.wsmiddotWidth; + const spaceWidth = this._options.spaceWidth; + const wsmiddotDiff = Math.abs(wsmiddotWidth - spaceWidth); + const middotDiff = Math.abs(middotWidth - spaceWidth); + const renderSpaceCharCode = wsmiddotDiff < middotDiff ? 11825 : 183; + const canUseHalfwidthRightwardsArrow = this._options.canUseHalfwidthRightwardsArrow; + let result = ""; + let lineIsEmptyOrWhitespace = false; + let firstNonWhitespaceIndex2 = firstNonWhitespaceIndex(lineContent); + let lastNonWhitespaceIndex2; + if (firstNonWhitespaceIndex2 === -1) { + lineIsEmptyOrWhitespace = true; + firstNonWhitespaceIndex2 = len; + lastNonWhitespaceIndex2 = len; + } else { + lastNonWhitespaceIndex2 = lastNonWhitespaceIndex(lineContent); + } + let currentSelectionIndex = 0; + let currentSelection = selections && selections[currentSelectionIndex]; + let maxLeft = 0; + for (let charIndex = fauxIndentLength; charIndex < len; charIndex++) { + const chCode = lineContent.charCodeAt(charIndex); + if (currentSelection && charIndex >= currentSelection.endOffset) { + currentSelectionIndex++; + currentSelection = selections && selections[currentSelectionIndex]; + } + if (chCode !== 9 && chCode !== 32) { + continue; + } + if (onlyTrailing && !lineIsEmptyOrWhitespace && charIndex <= lastNonWhitespaceIndex2) { + continue; + } + if (onlyBoundary && charIndex >= firstNonWhitespaceIndex2 && charIndex <= lastNonWhitespaceIndex2 && chCode === 32) { + const prevChCode = charIndex - 1 >= 0 ? lineContent.charCodeAt(charIndex - 1) : 0; + const nextChCode = charIndex + 1 < len ? lineContent.charCodeAt(charIndex + 1) : 0; + if (prevChCode !== 32 && nextChCode !== 32) { + continue; + } + } + if (onlyBoundary && continuesWithWrappedLine && charIndex === len - 1) { + const prevCharCode = charIndex - 1 >= 0 ? lineContent.charCodeAt(charIndex - 1) : 0; + const isSingleTrailingSpace = chCode === 32 && (prevCharCode !== 32 && prevCharCode !== 9); + if (isSingleTrailingSpace) { + continue; + } + } + if (selections && (!currentSelection || currentSelection.startOffset > charIndex || currentSelection.endOffset <= charIndex)) { + continue; + } + const visibleRange = ctx.visibleRangeForPosition(new Position(lineNumber, charIndex + 1)); + if (!visibleRange) { + continue; + } + if (USE_SVG) { + maxLeft = Math.max(maxLeft, visibleRange.left); + if (chCode === 9) { + result += this._renderArrow(lineHeight, spaceWidth, visibleRange.left); + } else { + result += ``; + } + } else { + if (chCode === 9) { + result += `
${canUseHalfwidthRightwardsArrow ? String.fromCharCode(65515) : String.fromCharCode(8594)}
`; + } else { + result += `
${String.fromCharCode(renderSpaceCharCode)}
`; + } + } + } + if (USE_SVG) { + maxLeft = Math.round(maxLeft + spaceWidth); + return `` + result + ``; + } + return result; + } + _renderArrow(lineHeight, spaceWidth, left) { + const strokeWidth = spaceWidth / 7; + const width2 = spaceWidth; + const dy = lineHeight / 2; + const dx = left; + const p1 = { x: 0, y: strokeWidth / 2 }; + const p2 = { x: 100 / 125 * width2, y: p1.y }; + const p3 = { x: p2.x - 0.2 * p2.x, y: p2.y + 0.2 * p2.x }; + const p4 = { x: p3.x + 0.1 * p2.x, y: p3.y + 0.1 * p2.x }; + const p5 = { x: p4.x + 0.35 * p2.x, y: p4.y - 0.35 * p2.x }; + const p6 = { x: p5.x, y: -p5.y }; + const p7 = { x: p4.x, y: -p4.y }; + const p8 = { x: p3.x, y: -p3.y }; + const p9 = { x: p2.x, y: -p2.y }; + const p10 = { x: p1.x, y: -p1.y }; + const p = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10]; + const parts = p.map((p11) => `${(dx + p11.x).toFixed(2)} ${(dy + p11.y).toFixed(2)}`).join(" L "); + return ``; + } + render(startLineNumber, lineNumber) { + if (!this._renderResult) { + return ""; + } + const lineIndex = lineNumber - startLineNumber; + if (lineIndex < 0 || lineIndex >= this._renderResult.length) { + return ""; + } + return this._renderResult[lineIndex]; + } + }; + WhitespaceOptions = class { + constructor(config) { + const options2 = config.options; + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + const experimentalWhitespaceRendering = options2.get( + 38 + /* EditorOption.experimentalWhitespaceRendering */ + ); + if (experimentalWhitespaceRendering === "off") { + this.renderWhitespace = "none"; + this.renderWithSVG = false; + } else if (experimentalWhitespaceRendering === "svg") { + this.renderWhitespace = options2.get( + 99 + /* EditorOption.renderWhitespace */ + ); + this.renderWithSVG = true; + } else { + this.renderWhitespace = options2.get( + 99 + /* EditorOption.renderWhitespace */ + ); + this.renderWithSVG = false; + } + this.spaceWidth = fontInfo.spaceWidth; + this.middotWidth = fontInfo.middotWidth; + this.wsmiddotWidth = fontInfo.wsmiddotWidth; + this.canUseHalfwidthRightwardsArrow = fontInfo.canUseHalfwidthRightwardsArrow; + this.lineHeight = options2.get( + 67 + /* EditorOption.lineHeight */ + ); + this.stopRenderingLineAfter = options2.get( + 117 + /* EditorOption.stopRenderingLineAfter */ + ); + } + equals(other) { + return this.renderWhitespace === other.renderWhitespace && this.renderWithSVG === other.renderWithSVG && this.spaceWidth === other.spaceWidth && this.middotWidth === other.middotWidth && this.wsmiddotWidth === other.wsmiddotWidth && this.canUseHalfwidthRightwardsArrow === other.canUseHalfwidthRightwardsArrow && this.lineHeight === other.lineHeight && this.stopRenderingLineAfter === other.stopRenderingLineAfter; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewLayout/viewLinesViewportData.js +var ViewportData; +var init_viewLinesViewportData = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewLayout/viewLinesViewportData.js"() { + init_range(); + ViewportData = class { + constructor(selections, partialData, whitespaceViewportData, model) { + this.selections = selections; + this.startLineNumber = partialData.startLineNumber | 0; + this.endLineNumber = partialData.endLineNumber | 0; + this.relativeVerticalOffset = partialData.relativeVerticalOffset; + this.bigNumbersDelta = partialData.bigNumbersDelta | 0; + this.lineHeight = partialData.lineHeight | 0; + this.whitespaceViewportData = whitespaceViewportData; + this._model = model; + this.visibleRange = new Range(partialData.startLineNumber, this._model.getLineMinColumn(partialData.startLineNumber), partialData.endLineNumber, this._model.getLineMaxColumn(partialData.endLineNumber)); + } + getViewLineRenderingData(lineNumber) { + return this._model.getViewportViewLineRenderingData(this.visibleRange, lineNumber); + } + getDecorationsInViewport() { + return this._model.getDecorationsInViewport(this.visibleRange); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/editorTheme.js +var EditorTheme; +var init_editorTheme = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/editorTheme.js"() { + EditorTheme = class { + get type() { + return this._theme.type; + } + get value() { + return this._theme; + } + constructor(theme) { + this._theme = theme; + } + update(theme) { + this._theme = theme; + } + getColor(color) { + return this._theme.getColor(color); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewModel/viewContext.js +var ViewContext; +var init_viewContext = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewModel/viewContext.js"() { + init_editorTheme(); + ViewContext = class { + constructor(configuration, theme, model) { + this.configuration = configuration; + this.theme = new EditorTheme(theme); + this.viewModel = model; + this.viewLayout = model.viewLayout; + } + addEventHandler(eventHandler) { + this.viewModel.addViewEventHandler(eventHandler); + } + removeEventHandler(eventHandler) { + this.viewModel.removeViewEventHandler(eventHandler); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/view.js +function safeInvokeNoArg(func) { + try { + return func(); + } catch (e) { + onUnexpectedError(e); + return null; + } +} +var __decorate11, __param10, View, EditorRenderingCoordinator; +var init_view = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/view.js"() { + init_dom(); + init_fastDomNode(); + init_performance(); + init_errors(); + init_mouseTarget(); + init_pointerHandler(); + init_textAreaHandler2(); + init_renderingContext(); + init_viewController(); + init_viewOverlays(); + init_viewPart(); + init_viewUserInputEvents(); + init_blockDecorations2(); + init_contentWidgets(); + init_currentLineHighlight2(); + init_decorations2(); + init_editorScrollbar(); + init_glyphMargin2(); + init_indentGuides2(); + init_lineNumbers2(); + init_viewLines2(); + init_linesDecorations2(); + init_margin2(); + init_marginDecorations2(); + init_minimap2(); + init_overlayWidgets2(); + init_decorationsOverviewRuler(); + init_overviewRuler(); + init_rulers2(); + init_scrollDecoration2(); + init_selections2(); + init_viewCursors2(); + init_viewZones(); + init_whitespace2(); + init_position(); + init_range(); + init_selection(); + init_model2(); + init_viewEventHandler(); + init_viewLinesViewportData(); + init_viewContext(); + init_instantiation(); + init_themeService(); + __decorate11 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param10 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + View = class View2 extends ViewEventHandler { + constructor(commandDelegate, configuration, colorTheme, model, userInputEvents, overflowWidgetsDomNode, _instantiationService) { + super(); + this._instantiationService = _instantiationService; + this._shouldRecomputeGlyphMarginLanes = false; + this._selections = [new Selection(1, 1, 1, 1)]; + this._renderAnimationFrame = null; + const viewController = new ViewController(configuration, model, userInputEvents, commandDelegate); + this._context = new ViewContext(configuration, colorTheme, model); + this._context.addEventHandler(this); + this._viewParts = []; + this._textAreaHandler = this._instantiationService.createInstance(TextAreaHandler, this._context, viewController, this._createTextAreaHandlerHelper()); + this._viewParts.push(this._textAreaHandler); + this._linesContent = createFastDomNode(document.createElement("div")); + this._linesContent.setClassName("lines-content monaco-editor-background"); + this._linesContent.setPosition("absolute"); + this.domNode = createFastDomNode(document.createElement("div")); + this.domNode.setClassName(this._getEditorClassName()); + this.domNode.setAttribute("role", "code"); + this._overflowGuardContainer = createFastDomNode(document.createElement("div")); + PartFingerprints.write( + this._overflowGuardContainer, + 3 + /* PartFingerprint.OverflowGuard */ + ); + this._overflowGuardContainer.setClassName("overflow-guard"); + this._scrollbar = new EditorScrollbar2(this._context, this._linesContent, this.domNode, this._overflowGuardContainer); + this._viewParts.push(this._scrollbar); + this._viewLines = new ViewLines(this._context, this._linesContent); + this._viewZones = new ViewZones(this._context); + this._viewParts.push(this._viewZones); + const decorationsOverviewRuler = new DecorationsOverviewRuler(this._context); + this._viewParts.push(decorationsOverviewRuler); + const scrollDecoration = new ScrollDecorationViewPart(this._context); + this._viewParts.push(scrollDecoration); + const contentViewOverlays = new ContentViewOverlays(this._context); + this._viewParts.push(contentViewOverlays); + contentViewOverlays.addDynamicOverlay(new CurrentLineHighlightOverlay(this._context)); + contentViewOverlays.addDynamicOverlay(new SelectionsOverlay(this._context)); + contentViewOverlays.addDynamicOverlay(new IndentGuidesOverlay(this._context)); + contentViewOverlays.addDynamicOverlay(new DecorationsOverlay(this._context)); + contentViewOverlays.addDynamicOverlay(new WhitespaceOverlay(this._context)); + const marginViewOverlays = new MarginViewOverlays(this._context); + this._viewParts.push(marginViewOverlays); + marginViewOverlays.addDynamicOverlay(new CurrentLineMarginHighlightOverlay(this._context)); + marginViewOverlays.addDynamicOverlay(new MarginViewLineDecorationsOverlay(this._context)); + marginViewOverlays.addDynamicOverlay(new LinesDecorationsOverlay(this._context)); + marginViewOverlays.addDynamicOverlay(new LineNumbersOverlay(this._context)); + this._glyphMarginWidgets = new GlyphMarginWidgets(this._context); + this._viewParts.push(this._glyphMarginWidgets); + const margin = new Margin(this._context); + margin.getDomNode().appendChild(this._viewZones.marginDomNode); + margin.getDomNode().appendChild(marginViewOverlays.getDomNode()); + margin.getDomNode().appendChild(this._glyphMarginWidgets.domNode); + this._viewParts.push(margin); + this._contentWidgets = new ViewContentWidgets(this._context, this.domNode); + this._viewParts.push(this._contentWidgets); + this._viewCursors = new ViewCursors(this._context); + this._viewParts.push(this._viewCursors); + this._overlayWidgets = new ViewOverlayWidgets(this._context, this.domNode); + this._viewParts.push(this._overlayWidgets); + const rulers = new Rulers(this._context); + this._viewParts.push(rulers); + const blockOutline = new BlockDecorations(this._context); + this._viewParts.push(blockOutline); + const minimap = new Minimap(this._context); + this._viewParts.push(minimap); + if (decorationsOverviewRuler) { + const overviewRulerData = this._scrollbar.getOverviewRulerLayoutInfo(); + overviewRulerData.parent.insertBefore(decorationsOverviewRuler.getDomNode(), overviewRulerData.insertBefore); + } + this._linesContent.appendChild(contentViewOverlays.getDomNode()); + this._linesContent.appendChild(rulers.domNode); + this._linesContent.appendChild(this._viewZones.domNode); + this._linesContent.appendChild(this._viewLines.getDomNode()); + this._linesContent.appendChild(this._contentWidgets.domNode); + this._linesContent.appendChild(this._viewCursors.getDomNode()); + this._overflowGuardContainer.appendChild(margin.getDomNode()); + this._overflowGuardContainer.appendChild(this._scrollbar.getDomNode()); + this._overflowGuardContainer.appendChild(scrollDecoration.getDomNode()); + this._overflowGuardContainer.appendChild(this._textAreaHandler.textArea); + this._overflowGuardContainer.appendChild(this._textAreaHandler.textAreaCover); + this._overflowGuardContainer.appendChild(this._overlayWidgets.getDomNode()); + this._overflowGuardContainer.appendChild(minimap.getDomNode()); + this._overflowGuardContainer.appendChild(blockOutline.domNode); + this.domNode.appendChild(this._overflowGuardContainer); + if (overflowWidgetsDomNode) { + overflowWidgetsDomNode.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode.domNode); + overflowWidgetsDomNode.appendChild(this._overlayWidgets.overflowingOverlayWidgetsDomNode.domNode); + } else { + this.domNode.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode); + this.domNode.appendChild(this._overlayWidgets.overflowingOverlayWidgetsDomNode); + } + this._applyLayout(); + this._pointerHandler = this._register(new PointerHandler(this._context, viewController, this._createPointerHandlerHelper())); + } + _computeGlyphMarginLanes() { + const model = this._context.viewModel.model; + const laneModel = this._context.viewModel.glyphLanes; + let glyphs = []; + let maxLineNumber = 0; + glyphs = glyphs.concat(model.getAllMarginDecorations().map((decoration3) => { + var _a10, _b4, _c2; + const lane = (_b4 = (_a10 = decoration3.options.glyphMargin) === null || _a10 === void 0 ? void 0 : _a10.position) !== null && _b4 !== void 0 ? _b4 : GlyphMarginLane2.Center; + maxLineNumber = Math.max(maxLineNumber, decoration3.range.endLineNumber); + return { range: decoration3.range, lane, persist: (_c2 = decoration3.options.glyphMargin) === null || _c2 === void 0 ? void 0 : _c2.persistLane }; + })); + glyphs = glyphs.concat(this._glyphMarginWidgets.getWidgets().map((widget) => { + const range2 = model.validateRange(widget.preference.range); + maxLineNumber = Math.max(maxLineNumber, range2.endLineNumber); + return { range: range2, lane: widget.preference.lane }; + })); + glyphs.sort((a3, b) => Range.compareRangesUsingStarts(a3.range, b.range)); + laneModel.reset(maxLineNumber); + for (const glyph of glyphs) { + laneModel.push(glyph.lane, glyph.range, glyph.persist); + } + return laneModel; + } + _createPointerHandlerHelper() { + return { + viewDomNode: this.domNode.domNode, + linesContentDomNode: this._linesContent.domNode, + viewLinesDomNode: this._viewLines.getDomNode().domNode, + focusTextArea: () => { + this.focus(); + }, + dispatchTextAreaEvent: (event) => { + this._textAreaHandler.textArea.domNode.dispatchEvent(event); + }, + getLastRenderData: () => { + const lastViewCursorsRenderData = this._viewCursors.getLastRenderData() || []; + const lastTextareaPosition = this._textAreaHandler.getLastRenderData(); + return new PointerHandlerLastRenderData(lastViewCursorsRenderData, lastTextareaPosition); + }, + renderNow: () => { + this.render(true, false); + }, + shouldSuppressMouseDownOnViewZone: (viewZoneId) => { + return this._viewZones.shouldSuppressMouseDownOnViewZone(viewZoneId); + }, + shouldSuppressMouseDownOnWidget: (widgetId) => { + return this._contentWidgets.shouldSuppressMouseDownOnWidget(widgetId); + }, + getPositionFromDOMInfo: (spanNode, offset) => { + this._flushAccumulatedAndRenderNow(); + return this._viewLines.getPositionFromDOMInfo(spanNode, offset); + }, + visibleRangeForPosition: (lineNumber, column) => { + this._flushAccumulatedAndRenderNow(); + return this._viewLines.visibleRangeForPosition(new Position(lineNumber, column)); + }, + getLineWidth: (lineNumber) => { + this._flushAccumulatedAndRenderNow(); + return this._viewLines.getLineWidth(lineNumber); + } + }; + } + _createTextAreaHandlerHelper() { + return { + visibleRangeForPosition: (position) => { + this._flushAccumulatedAndRenderNow(); + return this._viewLines.visibleRangeForPosition(position); + } + }; + } + _applyLayout() { + const options2 = this._context.configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + this.domNode.setWidth(layoutInfo.width); + this.domNode.setHeight(layoutInfo.height); + this._overflowGuardContainer.setWidth(layoutInfo.width); + this._overflowGuardContainer.setHeight(layoutInfo.height); + this._linesContent.setWidth(16777216); + this._linesContent.setHeight(16777216); + } + _getEditorClassName() { + const focused = this._textAreaHandler.isFocused() ? " focused" : ""; + return this._context.configuration.options.get( + 142 + /* EditorOption.editorClassName */ + ) + " " + getThemeTypeSelector(this._context.theme.type) + focused; + } + // --- begin event handlers + handleEvents(events) { + super.handleEvents(events); + this._scheduleRender(); + } + onConfigurationChanged(e) { + this.domNode.setClassName(this._getEditorClassName()); + this._applyLayout(); + return false; + } + onCursorStateChanged(e) { + this._selections = e.selections; + return false; + } + onDecorationsChanged(e) { + if (e.affectsGlyphMargin) { + this._shouldRecomputeGlyphMarginLanes = true; + } + return false; + } + onFocusChanged(e) { + this.domNode.setClassName(this._getEditorClassName()); + return false; + } + onThemeChanged(e) { + this._context.theme.update(e.theme); + this.domNode.setClassName(this._getEditorClassName()); + return false; + } + // --- end event handlers + dispose() { + if (this._renderAnimationFrame !== null) { + this._renderAnimationFrame.dispose(); + this._renderAnimationFrame = null; + } + this._contentWidgets.overflowingContentWidgetsDomNode.domNode.remove(); + this._context.removeEventHandler(this); + this._viewLines.dispose(); + for (const viewPart of this._viewParts) { + viewPart.dispose(); + } + super.dispose(); + } + _scheduleRender() { + if (this._store.isDisposed) { + throw new BugIndicatingError(); + } + if (this._renderAnimationFrame === null) { + const rendering = this._createCoordinatedRendering(); + this._renderAnimationFrame = EditorRenderingCoordinator.INSTANCE.scheduleCoordinatedRendering({ + window: getWindow(this.domNode.domNode), + prepareRenderText: () => { + if (this._store.isDisposed) { + throw new BugIndicatingError(); + } + try { + return rendering.prepareRenderText(); + } finally { + this._renderAnimationFrame = null; + } + }, + renderText: () => { + if (this._store.isDisposed) { + throw new BugIndicatingError(); + } + return rendering.renderText(); + }, + prepareRender: (viewParts, ctx) => { + if (this._store.isDisposed) { + throw new BugIndicatingError(); + } + return rendering.prepareRender(viewParts, ctx); + }, + render: (viewParts, ctx) => { + if (this._store.isDisposed) { + throw new BugIndicatingError(); + } + return rendering.render(viewParts, ctx); + } + }); + } + } + _flushAccumulatedAndRenderNow() { + const rendering = this._createCoordinatedRendering(); + safeInvokeNoArg(() => rendering.prepareRenderText()); + const data = safeInvokeNoArg(() => rendering.renderText()); + if (data) { + const [viewParts, ctx] = data; + safeInvokeNoArg(() => rendering.prepareRender(viewParts, ctx)); + safeInvokeNoArg(() => rendering.render(viewParts, ctx)); + } + } + _getViewPartsToRender() { + const result = []; + let resultLen = 0; + for (const viewPart of this._viewParts) { + if (viewPart.shouldRender()) { + result[resultLen++] = viewPart; + } + } + return result; + } + _createCoordinatedRendering() { + return { + prepareRenderText: () => { + if (this._shouldRecomputeGlyphMarginLanes) { + this._shouldRecomputeGlyphMarginLanes = false; + const model = this._computeGlyphMarginLanes(); + this._context.configuration.setGlyphMarginDecorationLaneCount(model.requiredLanes); + } + inputLatency.onRenderStart(); + }, + renderText: () => { + if (!this.domNode.domNode.isConnected) { + return null; + } + let viewPartsToRender = this._getViewPartsToRender(); + if (!this._viewLines.shouldRender() && viewPartsToRender.length === 0) { + return null; + } + const partialViewportData = this._context.viewLayout.getLinesViewportData(); + this._context.viewModel.setViewport(partialViewportData.startLineNumber, partialViewportData.endLineNumber, partialViewportData.centeredLineNumber); + const viewportData = new ViewportData(this._selections, partialViewportData, this._context.viewLayout.getWhitespaceViewportData(), this._context.viewModel); + if (this._contentWidgets.shouldRender()) { + this._contentWidgets.onBeforeRender(viewportData); + } + if (this._viewLines.shouldRender()) { + this._viewLines.renderText(viewportData); + this._viewLines.onDidRender(); + viewPartsToRender = this._getViewPartsToRender(); + } + return [viewPartsToRender, new RenderingContext(this._context.viewLayout, viewportData, this._viewLines)]; + }, + prepareRender: (viewPartsToRender, ctx) => { + for (const viewPart of viewPartsToRender) { + viewPart.prepareRender(ctx); + } + }, + render: (viewPartsToRender, ctx) => { + for (const viewPart of viewPartsToRender) { + viewPart.render(ctx); + viewPart.onDidRender(); + } + } + }; + } + // --- BEGIN CodeEditor helpers + delegateVerticalScrollbarPointerDown(browserEvent) { + this._scrollbar.delegateVerticalScrollbarPointerDown(browserEvent); + } + delegateScrollFromMouseWheelEvent(browserEvent) { + this._scrollbar.delegateScrollFromMouseWheelEvent(browserEvent); + } + restoreState(scrollPosition) { + this._context.viewModel.viewLayout.setScrollPosition( + { + scrollTop: scrollPosition.scrollTop, + scrollLeft: scrollPosition.scrollLeft + }, + 1 + /* ScrollType.Immediate */ + ); + this._context.viewModel.visibleLinesStabilized(); + } + getOffsetForColumn(modelLineNumber, modelColumn) { + const modelPosition = this._context.viewModel.model.validatePosition({ + lineNumber: modelLineNumber, + column: modelColumn + }); + const viewPosition = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition); + this._flushAccumulatedAndRenderNow(); + const visibleRange = this._viewLines.visibleRangeForPosition(new Position(viewPosition.lineNumber, viewPosition.column)); + if (!visibleRange) { + return -1; + } + return visibleRange.left; + } + getTargetAtClientPoint(clientX, clientY) { + const mouseTarget = this._pointerHandler.getTargetAtClientPoint(clientX, clientY); + if (!mouseTarget) { + return null; + } + return ViewUserInputEvents.convertViewToModelMouseTarget(mouseTarget, this._context.viewModel.coordinatesConverter); + } + createOverviewRuler(cssClassName) { + return new OverviewRuler(this._context, cssClassName); + } + change(callback) { + this._viewZones.changeViewZones(callback); + this._scheduleRender(); + } + render(now, everything) { + if (everything) { + this._viewLines.forceShouldRender(); + for (const viewPart of this._viewParts) { + viewPart.forceShouldRender(); + } + } + if (now) { + this._flushAccumulatedAndRenderNow(); + } else { + this._scheduleRender(); + } + } + writeScreenReaderContent(reason) { + this._textAreaHandler.writeScreenReaderContent(reason); + } + focus() { + this._textAreaHandler.focusTextArea(); + } + isFocused() { + return this._textAreaHandler.isFocused(); + } + setAriaOptions(options2) { + this._textAreaHandler.setAriaOptions(options2); + } + addContentWidget(widgetData) { + this._contentWidgets.addWidget(widgetData.widget); + this.layoutContentWidget(widgetData); + this._scheduleRender(); + } + layoutContentWidget(widgetData) { + var _a10, _b4, _c2, _d2, _e2, _f3, _g2, _h2; + this._contentWidgets.setWidgetPosition(widgetData.widget, (_b4 = (_a10 = widgetData.position) === null || _a10 === void 0 ? void 0 : _a10.position) !== null && _b4 !== void 0 ? _b4 : null, (_d2 = (_c2 = widgetData.position) === null || _c2 === void 0 ? void 0 : _c2.secondaryPosition) !== null && _d2 !== void 0 ? _d2 : null, (_f3 = (_e2 = widgetData.position) === null || _e2 === void 0 ? void 0 : _e2.preference) !== null && _f3 !== void 0 ? _f3 : null, (_h2 = (_g2 = widgetData.position) === null || _g2 === void 0 ? void 0 : _g2.positionAffinity) !== null && _h2 !== void 0 ? _h2 : null); + this._scheduleRender(); + } + removeContentWidget(widgetData) { + this._contentWidgets.removeWidget(widgetData.widget); + this._scheduleRender(); + } + addOverlayWidget(widgetData) { + this._overlayWidgets.addWidget(widgetData.widget); + this.layoutOverlayWidget(widgetData); + this._scheduleRender(); + } + layoutOverlayWidget(widgetData) { + const shouldRender = this._overlayWidgets.setWidgetPosition(widgetData.widget, widgetData.position); + if (shouldRender) { + this._scheduleRender(); + } + } + removeOverlayWidget(widgetData) { + this._overlayWidgets.removeWidget(widgetData.widget); + this._scheduleRender(); + } + addGlyphMarginWidget(widgetData) { + this._glyphMarginWidgets.addWidget(widgetData.widget); + this._shouldRecomputeGlyphMarginLanes = true; + this._scheduleRender(); + } + layoutGlyphMarginWidget(widgetData) { + const newPreference = widgetData.position; + const shouldRender = this._glyphMarginWidgets.setWidgetPosition(widgetData.widget, newPreference); + if (shouldRender) { + this._shouldRecomputeGlyphMarginLanes = true; + this._scheduleRender(); + } + } + removeGlyphMarginWidget(widgetData) { + this._glyphMarginWidgets.removeWidget(widgetData.widget); + this._shouldRecomputeGlyphMarginLanes = true; + this._scheduleRender(); + } + }; + View = __decorate11([ + __param10(6, IInstantiationService) + ], View); + EditorRenderingCoordinator = class { + constructor() { + this._coordinatedRenderings = []; + this._animationFrameRunners = /* @__PURE__ */ new Map(); + } + scheduleCoordinatedRendering(rendering) { + this._coordinatedRenderings.push(rendering); + this._scheduleRender(rendering.window); + return { + dispose: () => { + const renderingIndex = this._coordinatedRenderings.indexOf(rendering); + if (renderingIndex === -1) { + return; + } + this._coordinatedRenderings.splice(renderingIndex, 1); + if (this._coordinatedRenderings.length === 0) { + for (const [_, disposable] of this._animationFrameRunners) { + disposable.dispose(); + } + this._animationFrameRunners.clear(); + } + } + }; + } + _scheduleRender(window2) { + if (!this._animationFrameRunners.has(window2)) { + const runner = () => { + this._animationFrameRunners.delete(window2); + this._onRenderScheduled(); + }; + this._animationFrameRunners.set(window2, runAtThisOrScheduleAtNextAnimationFrame(window2, runner, 100)); + } + } + _onRenderScheduled() { + const coordinatedRenderings = this._coordinatedRenderings.slice(0); + this._coordinatedRenderings = []; + for (const rendering of coordinatedRenderings) { + safeInvokeNoArg(() => rendering.prepareRenderText()); + } + const datas = []; + for (let i = 0, len = coordinatedRenderings.length; i < len; i++) { + const rendering = coordinatedRenderings[i]; + datas[i] = safeInvokeNoArg(() => rendering.renderText()); + } + for (let i = 0, len = coordinatedRenderings.length; i < len; i++) { + const rendering = coordinatedRenderings[i]; + const data = datas[i]; + if (!data) { + continue; + } + const [viewParts, ctx] = data; + safeInvokeNoArg(() => rendering.prepareRender(viewParts, ctx)); + } + for (let i = 0, len = coordinatedRenderings.length; i < len; i++) { + const rendering = coordinatedRenderings[i]; + const data = datas[i]; + if (!data) { + continue; + } + const [viewParts, ctx] = data; + safeInvokeNoArg(() => rendering.render(viewParts, ctx)); + } + } + }; + EditorRenderingCoordinator.INSTANCE = new EditorRenderingCoordinator(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/modelLineProjectionData.js +function hasRightCursorStop(cursorStop) { + if (cursorStop === null || cursorStop === void 0) { + return true; + } + return cursorStop === InjectedTextCursorStops2.Right || cursorStop === InjectedTextCursorStops2.Both; +} +function hasLeftCursorStop(cursorStop) { + if (cursorStop === null || cursorStop === void 0) { + return true; + } + return cursorStop === InjectedTextCursorStops2.Left || cursorStop === InjectedTextCursorStops2.Both; +} +var ModelLineProjectionData, OutputPosition; +var init_modelLineProjectionData = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/modelLineProjectionData.js"() { + init_assert(); + init_position(); + init_model2(); + ModelLineProjectionData = class { + constructor(injectionOffsets, injectionOptions, breakOffsets, breakOffsetsVisibleColumn, wrappedTextIndentLength) { + this.injectionOffsets = injectionOffsets; + this.injectionOptions = injectionOptions; + this.breakOffsets = breakOffsets; + this.breakOffsetsVisibleColumn = breakOffsetsVisibleColumn; + this.wrappedTextIndentLength = wrappedTextIndentLength; + } + getOutputLineCount() { + return this.breakOffsets.length; + } + getMinOutputOffset(outputLineIndex) { + if (outputLineIndex > 0) { + return this.wrappedTextIndentLength; + } + return 0; + } + getLineLength(outputLineIndex) { + const startOffset = outputLineIndex > 0 ? this.breakOffsets[outputLineIndex - 1] : 0; + const endOffset = this.breakOffsets[outputLineIndex]; + let lineLength = endOffset - startOffset; + if (outputLineIndex > 0) { + lineLength += this.wrappedTextIndentLength; + } + return lineLength; + } + getMaxOutputOffset(outputLineIndex) { + return this.getLineLength(outputLineIndex); + } + translateToInputOffset(outputLineIndex, outputOffset) { + if (outputLineIndex > 0) { + outputOffset = Math.max(0, outputOffset - this.wrappedTextIndentLength); + } + const offsetInInputWithInjection = outputLineIndex === 0 ? outputOffset : this.breakOffsets[outputLineIndex - 1] + outputOffset; + let offsetInInput = offsetInInputWithInjection; + if (this.injectionOffsets !== null) { + for (let i = 0; i < this.injectionOffsets.length; i++) { + if (offsetInInput > this.injectionOffsets[i]) { + if (offsetInInput < this.injectionOffsets[i] + this.injectionOptions[i].content.length) { + offsetInInput = this.injectionOffsets[i]; + } else { + offsetInInput -= this.injectionOptions[i].content.length; + } + } else { + break; + } + } + } + return offsetInInput; + } + translateToOutputPosition(inputOffset, affinity = 2) { + let inputOffsetInInputWithInjection = inputOffset; + if (this.injectionOffsets !== null) { + for (let i = 0; i < this.injectionOffsets.length; i++) { + if (inputOffset < this.injectionOffsets[i]) { + break; + } + if (affinity !== 1 && inputOffset === this.injectionOffsets[i]) { + break; + } + inputOffsetInInputWithInjection += this.injectionOptions[i].content.length; + } + } + return this.offsetInInputWithInjectionsToOutputPosition(inputOffsetInInputWithInjection, affinity); + } + offsetInInputWithInjectionsToOutputPosition(offsetInInputWithInjections, affinity = 2) { + let low = 0; + let high = this.breakOffsets.length - 1; + let mid = 0; + let midStart = 0; + while (low <= high) { + mid = low + (high - low) / 2 | 0; + const midStop = this.breakOffsets[mid]; + midStart = mid > 0 ? this.breakOffsets[mid - 1] : 0; + if (affinity === 0) { + if (offsetInInputWithInjections <= midStart) { + high = mid - 1; + } else if (offsetInInputWithInjections > midStop) { + low = mid + 1; + } else { + break; + } + } else { + if (offsetInInputWithInjections < midStart) { + high = mid - 1; + } else if (offsetInInputWithInjections >= midStop) { + low = mid + 1; + } else { + break; + } + } + } + let outputOffset = offsetInInputWithInjections - midStart; + if (mid > 0) { + outputOffset += this.wrappedTextIndentLength; + } + return new OutputPosition(mid, outputOffset); + } + normalizeOutputPosition(outputLineIndex, outputOffset, affinity) { + if (this.injectionOffsets !== null) { + const offsetInInputWithInjections = this.outputPositionToOffsetInInputWithInjections(outputLineIndex, outputOffset); + const normalizedOffsetInUnwrappedLine = this.normalizeOffsetInInputWithInjectionsAroundInjections(offsetInInputWithInjections, affinity); + if (normalizedOffsetInUnwrappedLine !== offsetInInputWithInjections) { + return this.offsetInInputWithInjectionsToOutputPosition(normalizedOffsetInUnwrappedLine, affinity); + } + } + if (affinity === 0) { + if (outputLineIndex > 0 && outputOffset === this.getMinOutputOffset(outputLineIndex)) { + return new OutputPosition(outputLineIndex - 1, this.getMaxOutputOffset(outputLineIndex - 1)); + } + } else if (affinity === 1) { + const maxOutputLineIndex = this.getOutputLineCount() - 1; + if (outputLineIndex < maxOutputLineIndex && outputOffset === this.getMaxOutputOffset(outputLineIndex)) { + return new OutputPosition(outputLineIndex + 1, this.getMinOutputOffset(outputLineIndex + 1)); + } + } + return new OutputPosition(outputLineIndex, outputOffset); + } + outputPositionToOffsetInInputWithInjections(outputLineIndex, outputOffset) { + if (outputLineIndex > 0) { + outputOffset = Math.max(0, outputOffset - this.wrappedTextIndentLength); + } + const result = (outputLineIndex > 0 ? this.breakOffsets[outputLineIndex - 1] : 0) + outputOffset; + return result; + } + normalizeOffsetInInputWithInjectionsAroundInjections(offsetInInputWithInjections, affinity) { + const injectedText = this.getInjectedTextAtOffset(offsetInInputWithInjections); + if (!injectedText) { + return offsetInInputWithInjections; + } + if (affinity === 2) { + if (offsetInInputWithInjections === injectedText.offsetInInputWithInjections + injectedText.length && hasRightCursorStop(this.injectionOptions[injectedText.injectedTextIndex].cursorStops)) { + return injectedText.offsetInInputWithInjections + injectedText.length; + } else { + let result = injectedText.offsetInInputWithInjections; + if (hasLeftCursorStop(this.injectionOptions[injectedText.injectedTextIndex].cursorStops)) { + return result; + } + let index = injectedText.injectedTextIndex - 1; + while (index >= 0 && this.injectionOffsets[index] === this.injectionOffsets[injectedText.injectedTextIndex]) { + if (hasRightCursorStop(this.injectionOptions[index].cursorStops)) { + break; + } + result -= this.injectionOptions[index].content.length; + if (hasLeftCursorStop(this.injectionOptions[index].cursorStops)) { + break; + } + index--; + } + return result; + } + } else if (affinity === 1 || affinity === 4) { + let result = injectedText.offsetInInputWithInjections + injectedText.length; + let index = injectedText.injectedTextIndex; + while (index + 1 < this.injectionOffsets.length && this.injectionOffsets[index + 1] === this.injectionOffsets[index]) { + result += this.injectionOptions[index + 1].content.length; + index++; + } + return result; + } else if (affinity === 0 || affinity === 3) { + let result = injectedText.offsetInInputWithInjections; + let index = injectedText.injectedTextIndex; + while (index - 1 >= 0 && this.injectionOffsets[index - 1] === this.injectionOffsets[index]) { + result -= this.injectionOptions[index - 1].content.length; + index--; + } + return result; + } + assertNever(affinity); + } + getInjectedText(outputLineIndex, outputOffset) { + const offset = this.outputPositionToOffsetInInputWithInjections(outputLineIndex, outputOffset); + const injectedText = this.getInjectedTextAtOffset(offset); + if (!injectedText) { + return null; + } + return { + options: this.injectionOptions[injectedText.injectedTextIndex] + }; + } + getInjectedTextAtOffset(offsetInInputWithInjections) { + const injectionOffsets = this.injectionOffsets; + const injectionOptions = this.injectionOptions; + if (injectionOffsets !== null) { + let totalInjectedTextLengthBefore = 0; + for (let i = 0; i < injectionOffsets.length; i++) { + const length = injectionOptions[i].content.length; + const injectedTextStartOffsetInInputWithInjections = injectionOffsets[i] + totalInjectedTextLengthBefore; + const injectedTextEndOffsetInInputWithInjections = injectionOffsets[i] + totalInjectedTextLengthBefore + length; + if (injectedTextStartOffsetInInputWithInjections > offsetInInputWithInjections) { + break; + } + if (offsetInInputWithInjections <= injectedTextEndOffsetInInputWithInjections) { + return { + injectedTextIndex: i, + offsetInInputWithInjections: injectedTextStartOffsetInInputWithInjections, + length + }; + } + totalInjectedTextLengthBefore += length; + } + } + return void 0; + } + }; + OutputPosition = class { + constructor(outputLineIndex, outputOffset) { + this.outputLineIndex = outputLineIndex; + this.outputOffset = outputOffset; + } + toString() { + return `${this.outputLineIndex}:${this.outputOffset}`; + } + toPosition(baseLineNumber) { + return new Position(baseLineNumber + this.outputLineIndex, this.outputOffset + 1); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/textModelEvents.js +var ModelRawFlush, LineInjectedText, ModelRawLineChanged, ModelRawLinesDeleted, ModelRawLinesInserted, ModelRawEOLChanged, ModelRawContentChangedEvent, ModelInjectedTextChangedEvent, InternalModelContentChangeEvent; +var init_textModelEvents = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/textModelEvents.js"() { + ModelRawFlush = class { + constructor() { + this.changeType = 1; + } + }; + LineInjectedText = class _LineInjectedText { + static applyInjectedText(lineText, injectedTexts) { + if (!injectedTexts || injectedTexts.length === 0) { + return lineText; + } + let result = ""; + let lastOriginalOffset = 0; + for (const injectedText of injectedTexts) { + result += lineText.substring(lastOriginalOffset, injectedText.column - 1); + lastOriginalOffset = injectedText.column - 1; + result += injectedText.options.content; + } + result += lineText.substring(lastOriginalOffset); + return result; + } + static fromDecorations(decorations) { + const result = []; + for (const decoration3 of decorations) { + if (decoration3.options.before && decoration3.options.before.content.length > 0) { + result.push(new _LineInjectedText(decoration3.ownerId, decoration3.range.startLineNumber, decoration3.range.startColumn, decoration3.options.before, 0)); + } + if (decoration3.options.after && decoration3.options.after.content.length > 0) { + result.push(new _LineInjectedText(decoration3.ownerId, decoration3.range.endLineNumber, decoration3.range.endColumn, decoration3.options.after, 1)); + } + } + result.sort((a3, b) => { + if (a3.lineNumber === b.lineNumber) { + if (a3.column === b.column) { + return a3.order - b.order; + } + return a3.column - b.column; + } + return a3.lineNumber - b.lineNumber; + }); + return result; + } + constructor(ownerId2, lineNumber, column, options2, order) { + this.ownerId = ownerId2; + this.lineNumber = lineNumber; + this.column = column; + this.options = options2; + this.order = order; + } + }; + ModelRawLineChanged = class { + constructor(lineNumber, detail, injectedText) { + this.changeType = 2; + this.lineNumber = lineNumber; + this.detail = detail; + this.injectedText = injectedText; + } + }; + ModelRawLinesDeleted = class { + constructor(fromLineNumber, toLineNumber) { + this.changeType = 3; + this.fromLineNumber = fromLineNumber; + this.toLineNumber = toLineNumber; + } + }; + ModelRawLinesInserted = class { + constructor(fromLineNumber, toLineNumber, detail, injectedTexts) { + this.changeType = 4; + this.injectedTexts = injectedTexts; + this.fromLineNumber = fromLineNumber; + this.toLineNumber = toLineNumber; + this.detail = detail; + } + }; + ModelRawEOLChanged = class { + constructor() { + this.changeType = 5; + } + }; + ModelRawContentChangedEvent = class _ModelRawContentChangedEvent { + constructor(changes, versionId, isUndoing, isRedoing) { + this.changes = changes; + this.versionId = versionId; + this.isUndoing = isUndoing; + this.isRedoing = isRedoing; + this.resultingSelection = null; + } + containsEvent(type) { + for (let i = 0, len = this.changes.length; i < len; i++) { + const change = this.changes[i]; + if (change.changeType === type) { + return true; + } + } + return false; + } + static merge(a3, b) { + const changes = [].concat(a3.changes).concat(b.changes); + const versionId = b.versionId; + const isUndoing = a3.isUndoing || b.isUndoing; + const isRedoing = a3.isRedoing || b.isRedoing; + return new _ModelRawContentChangedEvent(changes, versionId, isUndoing, isRedoing); + } + }; + ModelInjectedTextChangedEvent = class { + constructor(changes) { + this.changes = changes; + } + }; + InternalModelContentChangeEvent = class _InternalModelContentChangeEvent { + constructor(rawContentChangedEvent, contentChangedEvent) { + this.rawContentChangedEvent = rawContentChangedEvent; + this.contentChangedEvent = contentChangedEvent; + } + merge(other) { + const rawContentChangedEvent = ModelRawContentChangedEvent.merge(this.rawContentChangedEvent, other.rawContentChangedEvent); + const contentChangedEvent = _InternalModelContentChangeEvent._mergeChangeEvents(this.contentChangedEvent, other.contentChangedEvent); + return new _InternalModelContentChangeEvent(rawContentChangedEvent, contentChangedEvent); + } + static _mergeChangeEvents(a3, b) { + const changes = [].concat(a3.changes).concat(b.changes); + const eol = b.eol; + const versionId = b.versionId; + const isUndoing = a3.isUndoing || b.isUndoing; + const isRedoing = a3.isRedoing || b.isRedoing; + const isFlush = a3.isFlush || b.isFlush; + const isEolChange = a3.isEolChange && b.isEolChange; + return { + changes, + eol, + isEolChange, + versionId, + isUndoing, + isRedoing, + isFlush + }; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/view/domLineBreaksComputer.js +function createLineBreaks(targetWindow, requests, fontInfo, tabSize, firstLineBreakColumn, wrappingIndent, wordBreak, injectedTextsPerLine) { + var _a10; + function createEmptyLineBreakWithPossiblyInjectedText(requestIdx) { + const injectedTexts = injectedTextsPerLine[requestIdx]; + if (injectedTexts) { + const lineText = LineInjectedText.applyInjectedText(requests[requestIdx], injectedTexts); + const injectionOptions = injectedTexts.map((t4) => t4.options); + const injectionOffsets = injectedTexts.map((text2) => text2.column - 1); + return new ModelLineProjectionData(injectionOffsets, injectionOptions, [lineText.length], [], 0); + } else { + return null; + } + } + if (firstLineBreakColumn === -1) { + const result2 = []; + for (let i = 0, len = requests.length; i < len; i++) { + result2[i] = createEmptyLineBreakWithPossiblyInjectedText(i); + } + return result2; + } + const overallWidth = Math.round(firstLineBreakColumn * fontInfo.typicalHalfwidthCharacterWidth); + const additionalIndent = wrappingIndent === 3 ? 2 : wrappingIndent === 2 ? 1 : 0; + const additionalIndentSize = Math.round(tabSize * additionalIndent); + const additionalIndentLength = Math.ceil(fontInfo.spaceWidth * additionalIndentSize); + const containerDomNode = document.createElement("div"); + applyFontInfo(containerDomNode, fontInfo); + const sb = new StringBuilder(1e4); + const firstNonWhitespaceIndices = []; + const wrappedTextIndentLengths = []; + const renderLineContents = []; + const allCharOffsets = []; + const allVisibleColumns = []; + for (let i = 0; i < requests.length; i++) { + const lineContent = LineInjectedText.applyInjectedText(requests[i], injectedTextsPerLine[i]); + let firstNonWhitespaceIndex2 = 0; + let wrappedTextIndentLength = 0; + let width2 = overallWidth; + if (wrappingIndent !== 0) { + firstNonWhitespaceIndex2 = firstNonWhitespaceIndex(lineContent); + if (firstNonWhitespaceIndex2 === -1) { + firstNonWhitespaceIndex2 = 0; + } else { + for (let i2 = 0; i2 < firstNonWhitespaceIndex2; i2++) { + const charWidth = lineContent.charCodeAt(i2) === 9 ? tabSize - wrappedTextIndentLength % tabSize : 1; + wrappedTextIndentLength += charWidth; + } + const indentWidth = Math.ceil(fontInfo.spaceWidth * wrappedTextIndentLength); + if (indentWidth + fontInfo.typicalFullwidthCharacterWidth > overallWidth) { + firstNonWhitespaceIndex2 = 0; + wrappedTextIndentLength = 0; + } else { + width2 = overallWidth - indentWidth; + } + } + } + const renderLineContent = lineContent.substr(firstNonWhitespaceIndex2); + const tmp = renderLine(renderLineContent, wrappedTextIndentLength, tabSize, width2, sb, additionalIndentLength); + firstNonWhitespaceIndices[i] = firstNonWhitespaceIndex2; + wrappedTextIndentLengths[i] = wrappedTextIndentLength; + renderLineContents[i] = renderLineContent; + allCharOffsets[i] = tmp[0]; + allVisibleColumns[i] = tmp[1]; + } + const html2 = sb.build(); + const trustedhtml = (_a10 = ttPolicy3 === null || ttPolicy3 === void 0 ? void 0 : ttPolicy3.createHTML(html2)) !== null && _a10 !== void 0 ? _a10 : html2; + containerDomNode.innerHTML = trustedhtml; + containerDomNode.style.position = "absolute"; + containerDomNode.style.top = "10000"; + if (wordBreak === "keepAll") { + containerDomNode.style.wordBreak = "keep-all"; + containerDomNode.style.overflowWrap = "anywhere"; + } else { + containerDomNode.style.wordBreak = "inherit"; + containerDomNode.style.overflowWrap = "break-word"; + } + targetWindow.document.body.appendChild(containerDomNode); + const range2 = document.createRange(); + const lineDomNodes = Array.prototype.slice.call(containerDomNode.children, 0); + const result = []; + for (let i = 0; i < requests.length; i++) { + const lineDomNode = lineDomNodes[i]; + const breakOffsets = readLineBreaks(range2, lineDomNode, renderLineContents[i], allCharOffsets[i]); + if (breakOffsets === null) { + result[i] = createEmptyLineBreakWithPossiblyInjectedText(i); + continue; + } + const firstNonWhitespaceIndex2 = firstNonWhitespaceIndices[i]; + const wrappedTextIndentLength = wrappedTextIndentLengths[i] + additionalIndentSize; + const visibleColumns = allVisibleColumns[i]; + const breakOffsetsVisibleColumn = []; + for (let j = 0, len = breakOffsets.length; j < len; j++) { + breakOffsetsVisibleColumn[j] = visibleColumns[breakOffsets[j]]; + } + if (firstNonWhitespaceIndex2 !== 0) { + for (let j = 0, len = breakOffsets.length; j < len; j++) { + breakOffsets[j] += firstNonWhitespaceIndex2; + } + } + let injectionOptions; + let injectionOffsets; + const curInjectedTexts = injectedTextsPerLine[i]; + if (curInjectedTexts) { + injectionOptions = curInjectedTexts.map((t4) => t4.options); + injectionOffsets = curInjectedTexts.map((text2) => text2.column - 1); + } else { + injectionOptions = null; + injectionOffsets = null; + } + result[i] = new ModelLineProjectionData(injectionOffsets, injectionOptions, breakOffsets, breakOffsetsVisibleColumn, wrappedTextIndentLength); + } + targetWindow.document.body.removeChild(containerDomNode); + return result; +} +function renderLine(lineContent, initialVisibleColumn, tabSize, width2, sb, wrappingIndentLength) { + if (wrappingIndentLength !== 0) { + const hangingOffset = String(wrappingIndentLength); + sb.appendString('
'); + const len = lineContent.length; + let visibleColumn = initialVisibleColumn; + let charOffset = 0; + const charOffsets = []; + const visibleColumns = []; + let nextCharCode = 0 < len ? lineContent.charCodeAt(0) : 0; + sb.appendString(""); + for (let charIndex = 0; charIndex < len; charIndex++) { + if (charIndex !== 0 && charIndex % 16384 === 0) { + sb.appendString(""); + } + charOffsets[charIndex] = charOffset; + visibleColumns[charIndex] = visibleColumn; + const charCode = nextCharCode; + nextCharCode = charIndex + 1 < len ? lineContent.charCodeAt(charIndex + 1) : 0; + let producedCharacters = 1; + let charWidth = 1; + switch (charCode) { + case 9: + producedCharacters = tabSize - visibleColumn % tabSize; + charWidth = producedCharacters; + for (let space = 1; space <= producedCharacters; space++) { + if (space < producedCharacters) { + sb.appendCharCode(160); + } else { + sb.appendASCIICharCode( + 32 + /* CharCode.Space */ + ); + } + } + break; + case 32: + if (nextCharCode === 32) { + sb.appendCharCode(160); + } else { + sb.appendASCIICharCode( + 32 + /* CharCode.Space */ + ); + } + break; + case 60: + sb.appendString("<"); + break; + case 62: + sb.appendString(">"); + break; + case 38: + sb.appendString("&"); + break; + case 0: + sb.appendString("�"); + break; + case 65279: + case 8232: + case 8233: + case 133: + sb.appendCharCode(65533); + break; + default: + if (isFullWidthCharacter(charCode)) { + charWidth++; + } + if (charCode < 32) { + sb.appendCharCode(9216 + charCode); + } else { + sb.appendCharCode(charCode); + } + } + charOffset += producedCharacters; + visibleColumn += charWidth; + } + sb.appendString(""); + charOffsets[lineContent.length] = charOffset; + visibleColumns[lineContent.length] = visibleColumn; + sb.appendString("
"); + return [charOffsets, visibleColumns]; +} +function readLineBreaks(range2, lineDomNode, lineContent, charOffsets) { + if (lineContent.length <= 1) { + return null; + } + const spans = Array.prototype.slice.call(lineDomNode.children, 0); + const breakOffsets = []; + try { + discoverBreaks(range2, spans, charOffsets, 0, null, lineContent.length - 1, null, breakOffsets); + } catch (err) { + console.log(err); + return null; + } + if (breakOffsets.length === 0) { + return null; + } + breakOffsets.push(lineContent.length); + return breakOffsets; +} +function discoverBreaks(range2, spans, charOffsets, low, lowRects, high, highRects, result) { + if (low === high) { + return; + } + lowRects = lowRects || readClientRect(range2, spans, charOffsets[low], charOffsets[low + 1]); + highRects = highRects || readClientRect(range2, spans, charOffsets[high], charOffsets[high + 1]); + if (Math.abs(lowRects[0].top - highRects[0].top) <= 0.1) { + return; + } + if (low + 1 === high) { + result.push(high); + return; + } + const mid = low + (high - low) / 2 | 0; + const midRects = readClientRect(range2, spans, charOffsets[mid], charOffsets[mid + 1]); + discoverBreaks(range2, spans, charOffsets, low, lowRects, mid, midRects, result); + discoverBreaks(range2, spans, charOffsets, mid, midRects, high, highRects, result); +} +function readClientRect(range2, spans, startOffset, endOffset) { + range2.setStart( + spans[startOffset / 16384 | 0].firstChild, + startOffset % 16384 + /* Constants.SPAN_MODULO_LIMIT */ + ); + range2.setEnd( + spans[endOffset / 16384 | 0].firstChild, + endOffset % 16384 + /* Constants.SPAN_MODULO_LIMIT */ + ); + return range2.getClientRects(); +} +var ttPolicy3, DOMLineBreaksComputerFactory; +var init_domLineBreaksComputer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/view/domLineBreaksComputer.js"() { + init_trustedTypes(); + init_strings(); + init_types(); + init_domFontInfo(); + init_stringBuilder(); + init_modelLineProjectionData(); + init_textModelEvents(); + ttPolicy3 = createTrustedTypesPolicy("domLineBreaksComputer", { createHTML: (value) => value }); + DOMLineBreaksComputerFactory = class _DOMLineBreaksComputerFactory { + static create(targetWindow) { + return new _DOMLineBreaksComputerFactory(new WeakRef(targetWindow)); + } + constructor(targetWindow) { + this.targetWindow = targetWindow; + } + createLineBreaksComputer(fontInfo, tabSize, wrappingColumn, wrappingIndent, wordBreak) { + const requests = []; + const injectedTexts = []; + return { + addRequest: (lineText, injectedText, previousLineBreakData) => { + requests.push(lineText); + injectedTexts.push(injectedText); + }, + finalize: () => { + return createLineBreaks(assertIsDefined(this.targetWindow.deref()), requests, fontInfo, tabSize, wrappingColumn, wrappingIndent, wordBreak, injectedTexts); + } + }; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/codeEditor/codeEditorContributions.js +var CodeEditorContributions; +var init_codeEditorContributions = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/codeEditor/codeEditorContributions.js"() { + init_dom(); + init_errors(); + init_lifecycle(); + CodeEditorContributions = class extends Disposable { + constructor() { + super(); + this._editor = null; + this._instantiationService = null; + this._instances = this._register(new DisposableMap()); + this._pending = /* @__PURE__ */ new Map(); + this._finishedInstantiation = []; + this._finishedInstantiation[ + 0 + /* EditorContributionInstantiation.Eager */ + ] = false; + this._finishedInstantiation[ + 1 + /* EditorContributionInstantiation.AfterFirstRender */ + ] = false; + this._finishedInstantiation[ + 2 + /* EditorContributionInstantiation.BeforeFirstInteraction */ + ] = false; + this._finishedInstantiation[ + 3 + /* EditorContributionInstantiation.Eventually */ + ] = false; + } + initialize(editor2, contributions, instantiationService) { + this._editor = editor2; + this._instantiationService = instantiationService; + for (const desc of contributions) { + if (this._pending.has(desc.id)) { + onUnexpectedError(new Error(`Cannot have two contributions with the same id ${desc.id}`)); + continue; + } + this._pending.set(desc.id, desc); + } + this._instantiateSome( + 0 + /* EditorContributionInstantiation.Eager */ + ); + this._register(runWhenWindowIdle(getWindow(this._editor.getDomNode()), () => { + this._instantiateSome( + 1 + /* EditorContributionInstantiation.AfterFirstRender */ + ); + })); + this._register(runWhenWindowIdle(getWindow(this._editor.getDomNode()), () => { + this._instantiateSome( + 2 + /* EditorContributionInstantiation.BeforeFirstInteraction */ + ); + })); + this._register(runWhenWindowIdle(getWindow(this._editor.getDomNode()), () => { + this._instantiateSome( + 3 + /* EditorContributionInstantiation.Eventually */ + ); + }, 5e3)); + } + saveViewState() { + const contributionsState = {}; + for (const [id, contribution] of this._instances) { + if (typeof contribution.saveViewState === "function") { + contributionsState[id] = contribution.saveViewState(); + } + } + return contributionsState; + } + restoreViewState(contributionsState) { + for (const [id, contribution] of this._instances) { + if (typeof contribution.restoreViewState === "function") { + contribution.restoreViewState(contributionsState[id]); + } + } + } + get(id) { + this._instantiateById(id); + return this._instances.get(id) || null; + } + onBeforeInteractionEvent() { + this._instantiateSome( + 2 + /* EditorContributionInstantiation.BeforeFirstInteraction */ + ); + } + onAfterModelAttached() { + var _a10; + return runWhenWindowIdle(getWindow((_a10 = this._editor) === null || _a10 === void 0 ? void 0 : _a10.getDomNode()), () => { + this._instantiateSome( + 1 + /* EditorContributionInstantiation.AfterFirstRender */ + ); + }, 50); + } + _instantiateSome(instantiation) { + if (this._finishedInstantiation[instantiation]) { + return; + } + this._finishedInstantiation[instantiation] = true; + const contribs = this._findPendingContributionsByInstantiation(instantiation); + for (const contrib of contribs) { + this._instantiateById(contrib.id); + } + } + _findPendingContributionsByInstantiation(instantiation) { + const result = []; + for (const [, desc] of this._pending) { + if (desc.instantiation === instantiation) { + result.push(desc); + } + } + return result; + } + _instantiateById(id) { + const desc = this._pending.get(id); + if (!desc) { + return; + } + this._pending.delete(id); + if (!this._instantiationService || !this._editor) { + throw new Error(`Cannot instantiate contributions before being initialized!`); + } + try { + const instance = this._instantiationService.createInstance(desc.ctor, this._editor); + this._instances.set(desc.id, instance); + if (typeof instance.restoreViewState === "function" && desc.instantiation !== 0) { + console.warn(`Editor contribution '${desc.id}' should be eager instantiated because it uses saveViewState / restoreViewState.`); + } + } catch (err) { + onUnexpectedError(err); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/editorAction.js +var InternalEditorAction; +var init_editorAction = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/editorAction.js"() { + InternalEditorAction = class { + constructor(id, label, alias, metadata, _precondition, _run, _contextKeyService) { + this.id = id; + this.label = label; + this.alias = alias; + this.metadata = metadata; + this._precondition = _precondition; + this._run = _run; + this._contextKeyService = _contextKeyService; + } + isSupported() { + return this._contextKeyService.contextMatchesRules(this._precondition); + } + run(args) { + if (!this.isSupported()) { + return Promise.resolve(void 0); + } + return this._run(args); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/eolCounter.js +function countEOL(text2) { + let eolCount = 0; + let firstLineLength = 0; + let lastLineStart = 0; + let eol = 0; + for (let i = 0, len = text2.length; i < len; i++) { + const chr = text2.charCodeAt(i); + if (chr === 13) { + if (eolCount === 0) { + firstLineLength = i; + } + eolCount++; + if (i + 1 < len && text2.charCodeAt(i + 1) === 10) { + eol |= 2; + i++; + } else { + eol |= 3; + } + lastLineStart = i + 1; + } else if (chr === 10) { + eol |= 1; + if (eolCount === 0) { + firstLineLength = i; + } + eolCount++; + lastLineStart = i + 1; + } + } + if (eolCount === 0) { + firstLineLength = text2.length; + } + return [eolCount, firstLineLength, text2.length - lastLineStart, eol]; +} +var init_eolCounter = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/eolCounter.js"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/textModelBracketPairs.js +var BracketInfo, BracketPairInfo, BracketPairWithMinIndentationInfo; +var init_textModelBracketPairs = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/textModelBracketPairs.js"() { + BracketInfo = class { + constructor(range2, nestingLevel, nestingLevelOfEqualBracketType, isInvalid) { + this.range = range2; + this.nestingLevel = nestingLevel; + this.nestingLevelOfEqualBracketType = nestingLevelOfEqualBracketType; + this.isInvalid = isInvalid; + } + }; + BracketPairInfo = class { + constructor(range2, openingBracketRange, closingBracketRange, nestingLevel, nestingLevelOfEqualBracketType, bracketPairNode) { + this.range = range2; + this.openingBracketRange = openingBracketRange; + this.closingBracketRange = closingBracketRange; + this.nestingLevel = nestingLevel; + this.nestingLevelOfEqualBracketType = nestingLevelOfEqualBracketType; + this.bracketPairNode = bracketPairNode; + } + get openingBracketInfo() { + return this.bracketPairNode.openingBracket.bracketInfo; + } + }; + BracketPairWithMinIndentationInfo = class extends BracketPairInfo { + constructor(range2, openingBracketRange, closingBracketRange, nestingLevel, nestingLevelOfEqualBracketType, bracketPairNode, minVisibleColumnIndentation) { + super(range2, openingBracketRange, closingBracketRange, nestingLevel, nestingLevelOfEqualBracketType, bracketPairNode); + this.minVisibleColumnIndentation = minVisibleColumnIndentation; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/length.js +function lengthDiff(startLineCount, startColumnCount, endLineCount, endColumnCount) { + return startLineCount !== endLineCount ? toLength(endLineCount - startLineCount, endColumnCount) : toLength(0, endColumnCount - startColumnCount); +} +function lengthIsZero(length) { + return length === 0; +} +function toLength(lineCount, columnCount) { + return lineCount * factor + columnCount; +} +function lengthToObj(length) { + const l = length; + const lineCount = Math.floor(l / factor); + const columnCount = l - lineCount * factor; + return new TextLength(lineCount, columnCount); +} +function lengthGetLineCount(length) { + return Math.floor(length / factor); +} +function lengthGetColumnCountIfZeroLineCount(length) { + return length; +} +function lengthAdd(l1, l2) { + let r = l1 + l2; + if (l2 >= factor) { + r = r - l1 % factor; + } + return r; +} +function sumLengths(items, lengthFn) { + return items.reduce((a3, b) => lengthAdd(a3, lengthFn(b)), lengthZero); +} +function lengthEquals(length1, length2) { + return length1 === length2; +} +function lengthDiffNonNegative(length1, length2) { + const l1 = length1; + const l2 = length2; + const diff = l2 - l1; + if (diff <= 0) { + return lengthZero; + } + const lineCount1 = Math.floor(l1 / factor); + const lineCount2 = Math.floor(l2 / factor); + const colCount2 = l2 - lineCount2 * factor; + if (lineCount1 === lineCount2) { + const colCount1 = l1 - lineCount1 * factor; + return toLength(0, colCount2 - colCount1); + } else { + return toLength(lineCount2 - lineCount1, colCount2); + } +} +function lengthLessThan(length1, length2) { + return length1 < length2; +} +function lengthLessThanEqual(length1, length2) { + return length1 <= length2; +} +function lengthGreaterThanEqual(length1, length2) { + return length1 >= length2; +} +function positionToLength(position) { + return toLength(position.lineNumber - 1, position.column - 1); +} +function lengthsToRange(lengthStart, lengthEnd) { + const l = lengthStart; + const lineCount = Math.floor(l / factor); + const colCount = l - lineCount * factor; + const l2 = lengthEnd; + const lineCount2 = Math.floor(l2 / factor); + const colCount2 = l2 - lineCount2 * factor; + return new Range(lineCount + 1, colCount + 1, lineCount2 + 1, colCount2 + 1); +} +function lengthOfString(str) { + const lines = splitLines(str); + return toLength(lines.length - 1, lines[lines.length - 1].length); +} +var lengthZero, factor; +var init_length = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/length.js"() { + init_strings(); + init_range(); + init_textLength(); + lengthZero = 0; + factor = __pow(2, 26); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/beforeEditPositionMapper.js +var TextEditInfo, BeforeEditPositionMapper, TextEditInfoCache; +var init_beforeEditPositionMapper = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/beforeEditPositionMapper.js"() { + init_range(); + init_length(); + TextEditInfo = class _TextEditInfo { + static fromModelContentChanges(changes) { + const edits = changes.map((c) => { + const range2 = Range.lift(c.range); + return new _TextEditInfo(positionToLength(range2.getStartPosition()), positionToLength(range2.getEndPosition()), lengthOfString(c.text)); + }).reverse(); + return edits; + } + constructor(startOffset, endOffset, newLength) { + this.startOffset = startOffset; + this.endOffset = endOffset; + this.newLength = newLength; + } + toString() { + return `[${lengthToObj(this.startOffset)}...${lengthToObj(this.endOffset)}) -> ${lengthToObj(this.newLength)}`; + } + }; + BeforeEditPositionMapper = class { + /** + * @param edits Must be sorted by offset in ascending order. + */ + constructor(edits) { + this.nextEditIdx = 0; + this.deltaOldToNewLineCount = 0; + this.deltaOldToNewColumnCount = 0; + this.deltaLineIdxInOld = -1; + this.edits = edits.map((edit) => TextEditInfoCache.from(edit)); + } + /** + * @param offset Must be equal to or greater than the last offset this method has been called with. + */ + getOffsetBeforeChange(offset) { + this.adjustNextEdit(offset); + return this.translateCurToOld(offset); + } + /** + * @param offset Must be equal to or greater than the last offset this method has been called with. + * Returns null if there is no edit anymore. + */ + getDistanceToNextChange(offset) { + this.adjustNextEdit(offset); + const nextEdit = this.edits[this.nextEditIdx]; + const nextChangeOffset = nextEdit ? this.translateOldToCur(nextEdit.offsetObj) : null; + if (nextChangeOffset === null) { + return null; + } + return lengthDiffNonNegative(offset, nextChangeOffset); + } + translateOldToCur(oldOffsetObj) { + if (oldOffsetObj.lineCount === this.deltaLineIdxInOld) { + return toLength(oldOffsetObj.lineCount + this.deltaOldToNewLineCount, oldOffsetObj.columnCount + this.deltaOldToNewColumnCount); + } else { + return toLength(oldOffsetObj.lineCount + this.deltaOldToNewLineCount, oldOffsetObj.columnCount); + } + } + translateCurToOld(newOffset) { + const offsetObj = lengthToObj(newOffset); + if (offsetObj.lineCount - this.deltaOldToNewLineCount === this.deltaLineIdxInOld) { + return toLength(offsetObj.lineCount - this.deltaOldToNewLineCount, offsetObj.columnCount - this.deltaOldToNewColumnCount); + } else { + return toLength(offsetObj.lineCount - this.deltaOldToNewLineCount, offsetObj.columnCount); + } + } + adjustNextEdit(offset) { + while (this.nextEditIdx < this.edits.length) { + const nextEdit = this.edits[this.nextEditIdx]; + const nextEditEndOffsetInCur = this.translateOldToCur(nextEdit.endOffsetAfterObj); + if (lengthLessThanEqual(nextEditEndOffsetInCur, offset)) { + this.nextEditIdx++; + const nextEditEndOffsetInCurObj = lengthToObj(nextEditEndOffsetInCur); + const nextEditEndOffsetBeforeInCurObj = lengthToObj(this.translateOldToCur(nextEdit.endOffsetBeforeObj)); + const lineDelta = nextEditEndOffsetInCurObj.lineCount - nextEditEndOffsetBeforeInCurObj.lineCount; + this.deltaOldToNewLineCount += lineDelta; + const previousColumnDelta = this.deltaLineIdxInOld === nextEdit.endOffsetBeforeObj.lineCount ? this.deltaOldToNewColumnCount : 0; + const columnDelta = nextEditEndOffsetInCurObj.columnCount - nextEditEndOffsetBeforeInCurObj.columnCount; + this.deltaOldToNewColumnCount = previousColumnDelta + columnDelta; + this.deltaLineIdxInOld = nextEdit.endOffsetBeforeObj.lineCount; + } else { + break; + } + } + } + }; + TextEditInfoCache = class _TextEditInfoCache { + static from(edit) { + return new _TextEditInfoCache(edit.startOffset, edit.endOffset, edit.newLength); + } + constructor(startOffset, endOffset, textLength) { + this.endOffsetBeforeObj = lengthToObj(endOffset); + this.endOffsetAfterObj = lengthToObj(lengthAdd(startOffset, textLength)); + this.offsetObj = lengthToObj(startOffset); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/smallImmutableSet.js +var emptyArr, SmallImmutableSet, identityKeyProvider, DenseKeyProvider; +var init_smallImmutableSet = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/smallImmutableSet.js"() { + emptyArr = []; + SmallImmutableSet = class _SmallImmutableSet { + static create(items, additionalItems) { + if (items <= 128 && additionalItems.length === 0) { + let cached = _SmallImmutableSet.cache[items]; + if (!cached) { + cached = new _SmallImmutableSet(items, additionalItems); + _SmallImmutableSet.cache[items] = cached; + } + return cached; + } + return new _SmallImmutableSet(items, additionalItems); + } + static getEmpty() { + return this.empty; + } + constructor(items, additionalItems) { + this.items = items; + this.additionalItems = additionalItems; + } + add(value, keyProvider) { + const key = keyProvider.getKey(value); + let idx = key >> 5; + if (idx === 0) { + const newItem = 1 << key | this.items; + if (newItem === this.items) { + return this; + } + return _SmallImmutableSet.create(newItem, this.additionalItems); + } + idx--; + const newItems = this.additionalItems.slice(0); + while (newItems.length < idx) { + newItems.push(0); + } + newItems[idx] |= 1 << (key & 31); + return _SmallImmutableSet.create(this.items, newItems); + } + merge(other) { + const merged = this.items | other.items; + if (this.additionalItems === emptyArr && other.additionalItems === emptyArr) { + if (merged === this.items) { + return this; + } + if (merged === other.items) { + return other; + } + return _SmallImmutableSet.create(merged, emptyArr); + } + const newItems = []; + for (let i = 0; i < Math.max(this.additionalItems.length, other.additionalItems.length); i++) { + const item1 = this.additionalItems[i] || 0; + const item2 = other.additionalItems[i] || 0; + newItems.push(item1 | item2); + } + return _SmallImmutableSet.create(merged, newItems); + } + intersects(other) { + if ((this.items & other.items) !== 0) { + return true; + } + for (let i = 0; i < Math.min(this.additionalItems.length, other.additionalItems.length); i++) { + if ((this.additionalItems[i] & other.additionalItems[i]) !== 0) { + return true; + } + } + return false; + } + }; + SmallImmutableSet.cache = new Array(129); + SmallImmutableSet.empty = SmallImmutableSet.create(0, emptyArr); + identityKeyProvider = { + getKey(value) { + return value; + } + }; + DenseKeyProvider = class { + constructor() { + this.items = /* @__PURE__ */ new Map(); + } + getKey(value) { + let existing = this.items.get(value); + if (existing === void 0) { + existing = this.items.size; + this.items.set(value, existing); + } + return existing; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/ast.js +var BaseAstNode, PairAstNode, ListAstNode, TwoThreeListAstNode, Immutable23ListAstNode, ArrayListAstNode, ImmutableArrayListAstNode, emptyArray, ImmutableLeafAstNode, TextAstNode, BracketAstNode, InvalidBracketAstNode; +var init_ast = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/ast.js"() { + init_errors(); + init_cursorColumns(); + init_length(); + init_smallImmutableSet(); + BaseAstNode = class { + /** + * The length of the entire node, which should equal the sum of lengths of all children. + */ + get length() { + return this._length; + } + constructor(length) { + this._length = length; + } + }; + PairAstNode = class _PairAstNode extends BaseAstNode { + static create(openingBracket, child, closingBracket) { + let length = openingBracket.length; + if (child) { + length = lengthAdd(length, child.length); + } + if (closingBracket) { + length = lengthAdd(length, closingBracket.length); + } + return new _PairAstNode(length, openingBracket, child, closingBracket, child ? child.missingOpeningBracketIds : SmallImmutableSet.getEmpty()); + } + get kind() { + return 2; + } + get listHeight() { + return 0; + } + get childrenLength() { + return 3; + } + getChild(idx) { + switch (idx) { + case 0: + return this.openingBracket; + case 1: + return this.child; + case 2: + return this.closingBracket; + } + throw new Error("Invalid child index"); + } + /** + * Avoid using this property, it allocates an array! + */ + get children() { + const result = []; + result.push(this.openingBracket); + if (this.child) { + result.push(this.child); + } + if (this.closingBracket) { + result.push(this.closingBracket); + } + return result; + } + constructor(length, openingBracket, child, closingBracket, missingOpeningBracketIds) { + super(length); + this.openingBracket = openingBracket; + this.child = child; + this.closingBracket = closingBracket; + this.missingOpeningBracketIds = missingOpeningBracketIds; + } + canBeReused(openBracketIds) { + if (this.closingBracket === null) { + return false; + } + if (openBracketIds.intersects(this.missingOpeningBracketIds)) { + return false; + } + return true; + } + deepClone() { + return new _PairAstNode(this.length, this.openingBracket.deepClone(), this.child && this.child.deepClone(), this.closingBracket && this.closingBracket.deepClone(), this.missingOpeningBracketIds); + } + computeMinIndentation(offset, textModel) { + return this.child ? this.child.computeMinIndentation(lengthAdd(offset, this.openingBracket.length), textModel) : Number.MAX_SAFE_INTEGER; + } + }; + ListAstNode = class extends BaseAstNode { + /** + * This method uses more memory-efficient list nodes that can only store 2 or 3 children. + */ + static create23(item1, item2, item3, immutable = false) { + let length = item1.length; + let missingBracketIds = item1.missingOpeningBracketIds; + if (item1.listHeight !== item2.listHeight) { + throw new Error("Invalid list heights"); + } + length = lengthAdd(length, item2.length); + missingBracketIds = missingBracketIds.merge(item2.missingOpeningBracketIds); + if (item3) { + if (item1.listHeight !== item3.listHeight) { + throw new Error("Invalid list heights"); + } + length = lengthAdd(length, item3.length); + missingBracketIds = missingBracketIds.merge(item3.missingOpeningBracketIds); + } + return immutable ? new Immutable23ListAstNode(length, item1.listHeight + 1, item1, item2, item3, missingBracketIds) : new TwoThreeListAstNode(length, item1.listHeight + 1, item1, item2, item3, missingBracketIds); + } + static getEmpty() { + return new ImmutableArrayListAstNode(lengthZero, 0, [], SmallImmutableSet.getEmpty()); + } + get kind() { + return 4; + } + get missingOpeningBracketIds() { + return this._missingOpeningBracketIds; + } + /** + * Use ListAstNode.create. + */ + constructor(length, listHeight, _missingOpeningBracketIds) { + super(length); + this.listHeight = listHeight; + this._missingOpeningBracketIds = _missingOpeningBracketIds; + this.cachedMinIndentation = -1; + } + throwIfImmutable() { + } + makeLastElementMutable() { + this.throwIfImmutable(); + const childCount = this.childrenLength; + if (childCount === 0) { + return void 0; + } + const lastChild = this.getChild(childCount - 1); + const mutable = lastChild.kind === 4 ? lastChild.toMutable() : lastChild; + if (lastChild !== mutable) { + this.setChild(childCount - 1, mutable); + } + return mutable; + } + makeFirstElementMutable() { + this.throwIfImmutable(); + const childCount = this.childrenLength; + if (childCount === 0) { + return void 0; + } + const firstChild = this.getChild(0); + const mutable = firstChild.kind === 4 ? firstChild.toMutable() : firstChild; + if (firstChild !== mutable) { + this.setChild(0, mutable); + } + return mutable; + } + canBeReused(openBracketIds) { + if (openBracketIds.intersects(this.missingOpeningBracketIds)) { + return false; + } + if (this.childrenLength === 0) { + return false; + } + let lastChild = this; + while (lastChild.kind === 4) { + const lastLength = lastChild.childrenLength; + if (lastLength === 0) { + throw new BugIndicatingError(); + } + lastChild = lastChild.getChild(lastLength - 1); + } + return lastChild.canBeReused(openBracketIds); + } + handleChildrenChanged() { + this.throwIfImmutable(); + const count = this.childrenLength; + let length = this.getChild(0).length; + let unopenedBrackets = this.getChild(0).missingOpeningBracketIds; + for (let i = 1; i < count; i++) { + const child = this.getChild(i); + length = lengthAdd(length, child.length); + unopenedBrackets = unopenedBrackets.merge(child.missingOpeningBracketIds); + } + this._length = length; + this._missingOpeningBracketIds = unopenedBrackets; + this.cachedMinIndentation = -1; + } + computeMinIndentation(offset, textModel) { + if (this.cachedMinIndentation !== -1) { + return this.cachedMinIndentation; + } + let minIndentation = Number.MAX_SAFE_INTEGER; + let childOffset = offset; + for (let i = 0; i < this.childrenLength; i++) { + const child = this.getChild(i); + if (child) { + minIndentation = Math.min(minIndentation, child.computeMinIndentation(childOffset, textModel)); + childOffset = lengthAdd(childOffset, child.length); + } + } + this.cachedMinIndentation = minIndentation; + return minIndentation; + } + }; + TwoThreeListAstNode = class _TwoThreeListAstNode extends ListAstNode { + get childrenLength() { + return this._item3 !== null ? 3 : 2; + } + getChild(idx) { + switch (idx) { + case 0: + return this._item1; + case 1: + return this._item2; + case 2: + return this._item3; + } + throw new Error("Invalid child index"); + } + setChild(idx, node) { + switch (idx) { + case 0: + this._item1 = node; + return; + case 1: + this._item2 = node; + return; + case 2: + this._item3 = node; + return; + } + throw new Error("Invalid child index"); + } + get children() { + return this._item3 ? [this._item1, this._item2, this._item3] : [this._item1, this._item2]; + } + get item1() { + return this._item1; + } + get item2() { + return this._item2; + } + get item3() { + return this._item3; + } + constructor(length, listHeight, _item1, _item2, _item3, missingOpeningBracketIds) { + super(length, listHeight, missingOpeningBracketIds); + this._item1 = _item1; + this._item2 = _item2; + this._item3 = _item3; + } + deepClone() { + return new _TwoThreeListAstNode(this.length, this.listHeight, this._item1.deepClone(), this._item2.deepClone(), this._item3 ? this._item3.deepClone() : null, this.missingOpeningBracketIds); + } + appendChildOfSameHeight(node) { + if (this._item3) { + throw new Error("Cannot append to a full (2,3) tree node"); + } + this.throwIfImmutable(); + this._item3 = node; + this.handleChildrenChanged(); + } + unappendChild() { + if (!this._item3) { + throw new Error("Cannot remove from a non-full (2,3) tree node"); + } + this.throwIfImmutable(); + const result = this._item3; + this._item3 = null; + this.handleChildrenChanged(); + return result; + } + prependChildOfSameHeight(node) { + if (this._item3) { + throw new Error("Cannot prepend to a full (2,3) tree node"); + } + this.throwIfImmutable(); + this._item3 = this._item2; + this._item2 = this._item1; + this._item1 = node; + this.handleChildrenChanged(); + } + unprependChild() { + if (!this._item3) { + throw new Error("Cannot remove from a non-full (2,3) tree node"); + } + this.throwIfImmutable(); + const result = this._item1; + this._item1 = this._item2; + this._item2 = this._item3; + this._item3 = null; + this.handleChildrenChanged(); + return result; + } + toMutable() { + return this; + } + }; + Immutable23ListAstNode = class extends TwoThreeListAstNode { + toMutable() { + return new TwoThreeListAstNode(this.length, this.listHeight, this.item1, this.item2, this.item3, this.missingOpeningBracketIds); + } + throwIfImmutable() { + throw new Error("this instance is immutable"); + } + }; + ArrayListAstNode = class _ArrayListAstNode extends ListAstNode { + get childrenLength() { + return this._children.length; + } + getChild(idx) { + return this._children[idx]; + } + setChild(idx, child) { + this._children[idx] = child; + } + get children() { + return this._children; + } + constructor(length, listHeight, _children, missingOpeningBracketIds) { + super(length, listHeight, missingOpeningBracketIds); + this._children = _children; + } + deepClone() { + const children = new Array(this._children.length); + for (let i = 0; i < this._children.length; i++) { + children[i] = this._children[i].deepClone(); + } + return new _ArrayListAstNode(this.length, this.listHeight, children, this.missingOpeningBracketIds); + } + appendChildOfSameHeight(node) { + this.throwIfImmutable(); + this._children.push(node); + this.handleChildrenChanged(); + } + unappendChild() { + this.throwIfImmutable(); + const item = this._children.pop(); + this.handleChildrenChanged(); + return item; + } + prependChildOfSameHeight(node) { + this.throwIfImmutable(); + this._children.unshift(node); + this.handleChildrenChanged(); + } + unprependChild() { + this.throwIfImmutable(); + const item = this._children.shift(); + this.handleChildrenChanged(); + return item; + } + toMutable() { + return this; + } + }; + ImmutableArrayListAstNode = class extends ArrayListAstNode { + toMutable() { + return new ArrayListAstNode(this.length, this.listHeight, [...this.children], this.missingOpeningBracketIds); + } + throwIfImmutable() { + throw new Error("this instance is immutable"); + } + }; + emptyArray = []; + ImmutableLeafAstNode = class extends BaseAstNode { + get listHeight() { + return 0; + } + get childrenLength() { + return 0; + } + getChild(idx) { + return null; + } + get children() { + return emptyArray; + } + deepClone() { + return this; + } + }; + TextAstNode = class extends ImmutableLeafAstNode { + get kind() { + return 0; + } + get missingOpeningBracketIds() { + return SmallImmutableSet.getEmpty(); + } + canBeReused(_openedBracketIds) { + return true; + } + computeMinIndentation(offset, textModel) { + const start = lengthToObj(offset); + const startLineNumber = (start.columnCount === 0 ? start.lineCount : start.lineCount + 1) + 1; + const endLineNumber = lengthGetLineCount(lengthAdd(offset, this.length)) + 1; + let result = Number.MAX_SAFE_INTEGER; + for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { + const firstNonWsColumn = textModel.getLineFirstNonWhitespaceColumn(lineNumber); + const lineContent = textModel.getLineContent(lineNumber); + if (firstNonWsColumn === 0) { + continue; + } + const visibleColumn = CursorColumns.visibleColumnFromColumn(lineContent, firstNonWsColumn, textModel.getOptions().tabSize); + result = Math.min(result, visibleColumn); + } + return result; + } + }; + BracketAstNode = class _BracketAstNode extends ImmutableLeafAstNode { + static create(length, bracketInfo, bracketIds) { + const node = new _BracketAstNode(length, bracketInfo, bracketIds); + return node; + } + get kind() { + return 1; + } + get missingOpeningBracketIds() { + return SmallImmutableSet.getEmpty(); + } + constructor(length, bracketInfo, bracketIds) { + super(length); + this.bracketInfo = bracketInfo; + this.bracketIds = bracketIds; + } + get text() { + return this.bracketInfo.bracketText; + } + get languageId() { + return this.bracketInfo.languageId; + } + canBeReused(_openedBracketIds) { + return false; + } + computeMinIndentation(offset, textModel) { + return Number.MAX_SAFE_INTEGER; + } + }; + InvalidBracketAstNode = class extends ImmutableLeafAstNode { + get kind() { + return 3; + } + constructor(closingBrackets, length) { + super(length); + this.missingOpeningBracketIds = closingBrackets; + } + canBeReused(openedBracketIds) { + return !openedBracketIds.intersects(this.missingOpeningBracketIds); + } + computeMinIndentation(offset, textModel) { + return Number.MAX_SAFE_INTEGER; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/tokenizer.js +var Token2, TextBufferTokenizer, NonPeekableTextBufferTokenizer, FastTokenizer; +var init_tokenizer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/tokenizer.js"() { + init_errors(); + init_encodedTokenAttributes(); + init_ast(); + init_length(); + init_smallImmutableSet(); + Token2 = class { + constructor(length, kind, bracketId, bracketIds, astNode) { + this.length = length; + this.kind = kind; + this.bracketId = bracketId; + this.bracketIds = bracketIds; + this.astNode = astNode; + } + }; + TextBufferTokenizer = class { + constructor(textModel, bracketTokens) { + this.textModel = textModel; + this.bracketTokens = bracketTokens; + this.reader = new NonPeekableTextBufferTokenizer(this.textModel, this.bracketTokens); + this._offset = lengthZero; + this.didPeek = false; + this.peeked = null; + this.textBufferLineCount = textModel.getLineCount(); + this.textBufferLastLineLength = textModel.getLineLength(this.textBufferLineCount); + } + get offset() { + return this._offset; + } + get length() { + return toLength(this.textBufferLineCount - 1, this.textBufferLastLineLength); + } + skip(length) { + this.didPeek = false; + this._offset = lengthAdd(this._offset, length); + const obj = lengthToObj(this._offset); + this.reader.setPosition(obj.lineCount, obj.columnCount); + } + read() { + let token; + if (this.peeked) { + this.didPeek = false; + token = this.peeked; + } else { + token = this.reader.read(); + } + if (token) { + this._offset = lengthAdd(this._offset, token.length); + } + return token; + } + peek() { + if (!this.didPeek) { + this.peeked = this.reader.read(); + this.didPeek = true; + } + return this.peeked; + } + }; + NonPeekableTextBufferTokenizer = class { + constructor(textModel, bracketTokens) { + this.textModel = textModel; + this.bracketTokens = bracketTokens; + this.lineIdx = 0; + this.line = null; + this.lineCharOffset = 0; + this.lineTokens = null; + this.lineTokenOffset = 0; + this.peekedToken = null; + this.textBufferLineCount = textModel.getLineCount(); + this.textBufferLastLineLength = textModel.getLineLength(this.textBufferLineCount); + } + setPosition(lineIdx, column) { + if (lineIdx === this.lineIdx) { + this.lineCharOffset = column; + if (this.line !== null) { + this.lineTokenOffset = this.lineCharOffset === 0 ? 0 : this.lineTokens.findTokenIndexAtOffset(this.lineCharOffset); + } + } else { + this.lineIdx = lineIdx; + this.lineCharOffset = column; + this.line = null; + } + this.peekedToken = null; + } + read() { + if (this.peekedToken) { + const token = this.peekedToken; + this.peekedToken = null; + this.lineCharOffset += lengthGetColumnCountIfZeroLineCount(token.length); + return token; + } + if (this.lineIdx > this.textBufferLineCount - 1 || this.lineIdx === this.textBufferLineCount - 1 && this.lineCharOffset >= this.textBufferLastLineLength) { + return null; + } + if (this.line === null) { + this.lineTokens = this.textModel.tokenization.getLineTokens(this.lineIdx + 1); + this.line = this.lineTokens.getLineContent(); + this.lineTokenOffset = this.lineCharOffset === 0 ? 0 : this.lineTokens.findTokenIndexAtOffset(this.lineCharOffset); + } + const startLineIdx = this.lineIdx; + const startLineCharOffset = this.lineCharOffset; + let lengthHeuristic = 0; + while (true) { + const lineTokens = this.lineTokens; + const tokenCount = lineTokens.getCount(); + let peekedBracketToken = null; + if (this.lineTokenOffset < tokenCount) { + const tokenMetadata = lineTokens.getMetadata(this.lineTokenOffset); + while (this.lineTokenOffset + 1 < tokenCount && tokenMetadata === lineTokens.getMetadata(this.lineTokenOffset + 1)) { + this.lineTokenOffset++; + } + const isOther = TokenMetadata.getTokenType(tokenMetadata) === 0; + const containsBracketType = TokenMetadata.containsBalancedBrackets(tokenMetadata); + const endOffset = lineTokens.getEndOffset(this.lineTokenOffset); + if (containsBracketType && isOther && this.lineCharOffset < endOffset) { + const languageId = lineTokens.getLanguageId(this.lineTokenOffset); + const text2 = this.line.substring(this.lineCharOffset, endOffset); + const brackets = this.bracketTokens.getSingleLanguageBracketTokens(languageId); + const regexp = brackets.regExpGlobal; + if (regexp) { + regexp.lastIndex = 0; + const match2 = regexp.exec(text2); + if (match2) { + peekedBracketToken = brackets.getToken(match2[0]); + if (peekedBracketToken) { + this.lineCharOffset += match2.index; + } + } + } + } + lengthHeuristic += endOffset - this.lineCharOffset; + if (peekedBracketToken) { + if (startLineIdx !== this.lineIdx || startLineCharOffset !== this.lineCharOffset) { + this.peekedToken = peekedBracketToken; + break; + } else { + this.lineCharOffset += lengthGetColumnCountIfZeroLineCount(peekedBracketToken.length); + return peekedBracketToken; + } + } else { + this.lineTokenOffset++; + this.lineCharOffset = endOffset; + } + } else { + if (this.lineIdx === this.textBufferLineCount - 1) { + break; + } + this.lineIdx++; + this.lineTokens = this.textModel.tokenization.getLineTokens(this.lineIdx + 1); + this.lineTokenOffset = 0; + this.line = this.lineTokens.getLineContent(); + this.lineCharOffset = 0; + lengthHeuristic += 33; + if (lengthHeuristic > 1e3) { + break; + } + } + if (lengthHeuristic > 1500) { + break; + } + } + const length = lengthDiff(startLineIdx, startLineCharOffset, this.lineIdx, this.lineCharOffset); + return new Token2(length, 0, -1, SmallImmutableSet.getEmpty(), new TextAstNode(length)); + } + }; + FastTokenizer = class { + constructor(text2, brackets) { + this.text = text2; + this._offset = lengthZero; + this.idx = 0; + const regExpStr = brackets.getRegExpStr(); + const regexp = regExpStr ? new RegExp(regExpStr + "|\n", "gi") : null; + const tokens = []; + let match2; + let curLineCount = 0; + let lastLineBreakOffset = 0; + let lastTokenEndOffset = 0; + let lastTokenEndLine = 0; + const smallTextTokens0Line = []; + for (let i = 0; i < 60; i++) { + smallTextTokens0Line.push(new Token2(toLength(0, i), 0, -1, SmallImmutableSet.getEmpty(), new TextAstNode(toLength(0, i)))); + } + const smallTextTokens1Line = []; + for (let i = 0; i < 60; i++) { + smallTextTokens1Line.push(new Token2(toLength(1, i), 0, -1, SmallImmutableSet.getEmpty(), new TextAstNode(toLength(1, i)))); + } + if (regexp) { + regexp.lastIndex = 0; + while ((match2 = regexp.exec(text2)) !== null) { + const curOffset = match2.index; + const value = match2[0]; + if (value === "\n") { + curLineCount++; + lastLineBreakOffset = curOffset + 1; + } else { + if (lastTokenEndOffset !== curOffset) { + let token; + if (lastTokenEndLine === curLineCount) { + const colCount = curOffset - lastTokenEndOffset; + if (colCount < smallTextTokens0Line.length) { + token = smallTextTokens0Line[colCount]; + } else { + const length = toLength(0, colCount); + token = new Token2(length, 0, -1, SmallImmutableSet.getEmpty(), new TextAstNode(length)); + } + } else { + const lineCount = curLineCount - lastTokenEndLine; + const colCount = curOffset - lastLineBreakOffset; + if (lineCount === 1 && colCount < smallTextTokens1Line.length) { + token = smallTextTokens1Line[colCount]; + } else { + const length = toLength(lineCount, colCount); + token = new Token2(length, 0, -1, SmallImmutableSet.getEmpty(), new TextAstNode(length)); + } + } + tokens.push(token); + } + tokens.push(brackets.getToken(value)); + lastTokenEndOffset = curOffset + value.length; + lastTokenEndLine = curLineCount; + } + } + } + const offset = text2.length; + if (lastTokenEndOffset !== offset) { + const length = lastTokenEndLine === curLineCount ? toLength(0, offset - lastTokenEndOffset) : toLength(curLineCount - lastTokenEndLine, offset - lastLineBreakOffset); + tokens.push(new Token2(length, 0, -1, SmallImmutableSet.getEmpty(), new TextAstNode(length))); + } + this.length = toLength(curLineCount, offset - lastLineBreakOffset); + this.tokens = tokens; + } + get offset() { + return this._offset; + } + read() { + return this.tokens[this.idx++] || null; + } + peek() { + return this.tokens[this.idx] || null; + } + skip(length) { + throw new NotSupportedError(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/brackets.js +function prepareBracketForRegExp2(str) { + let escaped = escapeRegExpCharacters(str); + if (/^[\w ]+/.test(str)) { + escaped = `\\b${escaped}`; + } + if (/[\w ]+$/.test(str)) { + escaped = `${escaped}\\b`; + } + return escaped; +} +var BracketTokens, LanguageAgnosticBracketTokens; +var init_brackets = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/brackets.js"() { + init_strings(); + init_ast(); + init_length(); + init_smallImmutableSet(); + init_tokenizer(); + BracketTokens = class _BracketTokens { + static createFromLanguage(configuration, denseKeyProvider) { + function getId(bracketInfo) { + return denseKeyProvider.getKey(`${bracketInfo.languageId}:::${bracketInfo.bracketText}`); + } + const map = /* @__PURE__ */ new Map(); + for (const openingBracket of configuration.bracketsNew.openingBrackets) { + const length = toLength(0, openingBracket.bracketText.length); + const openingTextId = getId(openingBracket); + const bracketIds = SmallImmutableSet.getEmpty().add(openingTextId, identityKeyProvider); + map.set(openingBracket.bracketText, new Token2(length, 1, openingTextId, bracketIds, BracketAstNode.create(length, openingBracket, bracketIds))); + } + for (const closingBracket of configuration.bracketsNew.closingBrackets) { + const length = toLength(0, closingBracket.bracketText.length); + let bracketIds = SmallImmutableSet.getEmpty(); + const closingBrackets = closingBracket.getOpeningBrackets(); + for (const bracket of closingBrackets) { + bracketIds = bracketIds.add(getId(bracket), identityKeyProvider); + } + map.set(closingBracket.bracketText, new Token2(length, 2, getId(closingBrackets[0]), bracketIds, BracketAstNode.create(length, closingBracket, bracketIds))); + } + return new _BracketTokens(map); + } + constructor(map) { + this.map = map; + this.hasRegExp = false; + this._regExpGlobal = null; + } + getRegExpStr() { + if (this.isEmpty) { + return null; + } else { + const keys = [...this.map.keys()]; + keys.sort(); + keys.reverse(); + return keys.map((k) => prepareBracketForRegExp2(k)).join("|"); + } + } + /** + * Returns null if there is no such regexp (because there are no brackets). + */ + get regExpGlobal() { + if (!this.hasRegExp) { + const regExpStr = this.getRegExpStr(); + this._regExpGlobal = regExpStr ? new RegExp(regExpStr, "gi") : null; + this.hasRegExp = true; + } + return this._regExpGlobal; + } + getToken(value) { + return this.map.get(value.toLowerCase()); + } + findClosingTokenText(openingBracketIds) { + for (const [closingText, info] of this.map) { + if (info.kind === 2 && info.bracketIds.intersects(openingBracketIds)) { + return closingText; + } + } + return void 0; + } + get isEmpty() { + return this.map.size === 0; + } + }; + LanguageAgnosticBracketTokens = class { + constructor(denseKeyProvider, getLanguageConfiguration) { + this.denseKeyProvider = denseKeyProvider; + this.getLanguageConfiguration = getLanguageConfiguration; + this.languageIdToBracketTokens = /* @__PURE__ */ new Map(); + } + didLanguageChange(languageId) { + return this.languageIdToBracketTokens.has(languageId); + } + getSingleLanguageBracketTokens(languageId) { + let singleLanguageBracketTokens = this.languageIdToBracketTokens.get(languageId); + if (!singleLanguageBracketTokens) { + singleLanguageBracketTokens = BracketTokens.createFromLanguage(this.getLanguageConfiguration(languageId), this.denseKeyProvider); + this.languageIdToBracketTokens.set(languageId, singleLanguageBracketTokens); + } + return singleLanguageBracketTokens; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/concat23Trees.js +function concat23Trees(items) { + if (items.length === 0) { + return null; + } + if (items.length === 1) { + return items[0]; + } + let i = 0; + function readNode() { + if (i >= items.length) { + return null; + } + const start = i; + const height = items[start].listHeight; + i++; + while (i < items.length && items[i].listHeight === height) { + i++; + } + if (i - start >= 2) { + return concat23TreesOfSameHeight(start === 0 && i === items.length ? items : items.slice(start, i), false); + } else { + return items[start]; + } + } + let first2 = readNode(); + let second = readNode(); + if (!second) { + return first2; + } + for (let item = readNode(); item; item = readNode()) { + if (heightDiff(first2, second) <= heightDiff(second, item)) { + first2 = concat(first2, second); + second = item; + } else { + second = concat(second, item); + } + } + const result = concat(first2, second); + return result; +} +function concat23TreesOfSameHeight(items, createImmutableLists = false) { + if (items.length === 0) { + return null; + } + if (items.length === 1) { + return items[0]; + } + let length = items.length; + while (length > 3) { + const newLength = length >> 1; + for (let i = 0; i < newLength; i++) { + const j = i << 1; + items[i] = ListAstNode.create23(items[j], items[j + 1], j + 3 === length ? items[j + 2] : null, createImmutableLists); + } + length = newLength; + } + return ListAstNode.create23(items[0], items[1], length >= 3 ? items[2] : null, createImmutableLists); +} +function heightDiff(node1, node2) { + return Math.abs(node1.listHeight - node2.listHeight); +} +function concat(node1, node2) { + if (node1.listHeight === node2.listHeight) { + return ListAstNode.create23(node1, node2, null, false); + } else if (node1.listHeight > node2.listHeight) { + return append2(node1, node2); + } else { + return prepend2(node2, node1); + } +} +function append2(list, nodeToAppend) { + list = list.toMutable(); + let curNode = list; + const parents = []; + let nodeToAppendOfCorrectHeight; + while (true) { + if (nodeToAppend.listHeight === curNode.listHeight) { + nodeToAppendOfCorrectHeight = nodeToAppend; + break; + } + if (curNode.kind !== 4) { + throw new Error("unexpected"); + } + parents.push(curNode); + curNode = curNode.makeLastElementMutable(); + } + for (let i = parents.length - 1; i >= 0; i--) { + const parent = parents[i]; + if (nodeToAppendOfCorrectHeight) { + if (parent.childrenLength >= 3) { + nodeToAppendOfCorrectHeight = ListAstNode.create23(parent.unappendChild(), nodeToAppendOfCorrectHeight, null, false); + } else { + parent.appendChildOfSameHeight(nodeToAppendOfCorrectHeight); + nodeToAppendOfCorrectHeight = void 0; + } + } else { + parent.handleChildrenChanged(); + } + } + if (nodeToAppendOfCorrectHeight) { + return ListAstNode.create23(list, nodeToAppendOfCorrectHeight, null, false); + } else { + return list; + } +} +function prepend2(list, nodeToAppend) { + list = list.toMutable(); + let curNode = list; + const parents = []; + while (nodeToAppend.listHeight !== curNode.listHeight) { + if (curNode.kind !== 4) { + throw new Error("unexpected"); + } + parents.push(curNode); + curNode = curNode.makeFirstElementMutable(); + } + let nodeToPrependOfCorrectHeight = nodeToAppend; + for (let i = parents.length - 1; i >= 0; i--) { + const parent = parents[i]; + if (nodeToPrependOfCorrectHeight) { + if (parent.childrenLength >= 3) { + nodeToPrependOfCorrectHeight = ListAstNode.create23(nodeToPrependOfCorrectHeight, parent.unprependChild(), null, false); + } else { + parent.prependChildOfSameHeight(nodeToPrependOfCorrectHeight); + nodeToPrependOfCorrectHeight = void 0; + } + } else { + parent.handleChildrenChanged(); + } + } + if (nodeToPrependOfCorrectHeight) { + return ListAstNode.create23(nodeToPrependOfCorrectHeight, list, null, false); + } else { + return list; + } +} +var init_concat23Trees = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/concat23Trees.js"() { + init_ast(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/nodeReader.js +function getNextChildIdx(node, curIdx = -1) { + while (true) { + curIdx++; + if (curIdx >= node.childrenLength) { + return -1; + } + if (node.getChild(curIdx)) { + return curIdx; + } + } +} +function lastOrUndefined(arr) { + return arr.length > 0 ? arr[arr.length - 1] : void 0; +} +var NodeReader; +var init_nodeReader = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/nodeReader.js"() { + init_length(); + NodeReader = class { + constructor(node) { + this.lastOffset = lengthZero; + this.nextNodes = [node]; + this.offsets = [lengthZero]; + this.idxs = []; + } + /** + * Returns the longest node at `offset` that satisfies the predicate. + * @param offset must be greater than or equal to the last offset this method has been called with! + */ + readLongestNodeAt(offset, predicate) { + if (lengthLessThan(offset, this.lastOffset)) { + throw new Error("Invalid offset"); + } + this.lastOffset = offset; + while (true) { + const curNode = lastOrUndefined(this.nextNodes); + if (!curNode) { + return void 0; + } + const curNodeOffset = lastOrUndefined(this.offsets); + if (lengthLessThan(offset, curNodeOffset)) { + return void 0; + } + if (lengthLessThan(curNodeOffset, offset)) { + if (lengthAdd(curNodeOffset, curNode.length) <= offset) { + this.nextNodeAfterCurrent(); + } else { + const nextChildIdx = getNextChildIdx(curNode); + if (nextChildIdx !== -1) { + this.nextNodes.push(curNode.getChild(nextChildIdx)); + this.offsets.push(curNodeOffset); + this.idxs.push(nextChildIdx); + } else { + this.nextNodeAfterCurrent(); + } + } + } else { + if (predicate(curNode)) { + this.nextNodeAfterCurrent(); + return curNode; + } else { + const nextChildIdx = getNextChildIdx(curNode); + if (nextChildIdx === -1) { + this.nextNodeAfterCurrent(); + return void 0; + } else { + this.nextNodes.push(curNode.getChild(nextChildIdx)); + this.offsets.push(curNodeOffset); + this.idxs.push(nextChildIdx); + } + } + } + } + } + // Navigates to the longest node that continues after the current node. + nextNodeAfterCurrent() { + while (true) { + const currentOffset = lastOrUndefined(this.offsets); + const currentNode = lastOrUndefined(this.nextNodes); + this.nextNodes.pop(); + this.offsets.pop(); + if (this.idxs.length === 0) { + break; + } + const parent = lastOrUndefined(this.nextNodes); + const nextChildIdx = getNextChildIdx(parent, this.idxs[this.idxs.length - 1]); + if (nextChildIdx !== -1) { + this.nextNodes.push(parent.getChild(nextChildIdx)); + this.offsets.push(lengthAdd(currentOffset, currentNode.length)); + this.idxs[this.idxs.length - 1] = nextChildIdx; + break; + } else { + this.idxs.pop(); + } + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/parser.js +function parseDocument(tokenizer, edits, oldNode, createImmutableLists) { + const parser2 = new Parser2(tokenizer, edits, oldNode, createImmutableLists); + return parser2.parseDocument(); +} +var Parser2; +var init_parser = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/parser.js"() { + init_ast(); + init_beforeEditPositionMapper(); + init_smallImmutableSet(); + init_length(); + init_concat23Trees(); + init_nodeReader(); + Parser2 = class { + constructor(tokenizer, edits, oldNode, createImmutableLists) { + this.tokenizer = tokenizer; + this.createImmutableLists = createImmutableLists; + this._itemsConstructed = 0; + this._itemsFromCache = 0; + if (oldNode && createImmutableLists) { + throw new Error("Not supported"); + } + this.oldNodeReader = oldNode ? new NodeReader(oldNode) : void 0; + this.positionMapper = new BeforeEditPositionMapper(edits); + } + parseDocument() { + this._itemsConstructed = 0; + this._itemsFromCache = 0; + let result = this.parseList(SmallImmutableSet.getEmpty(), 0); + if (!result) { + result = ListAstNode.getEmpty(); + } + return result; + } + parseList(openedBracketIds, level) { + const items = []; + while (true) { + let child = this.tryReadChildFromCache(openedBracketIds); + if (!child) { + const token = this.tokenizer.peek(); + if (!token || token.kind === 2 && token.bracketIds.intersects(openedBracketIds)) { + break; + } + child = this.parseChild(openedBracketIds, level + 1); + } + if (child.kind === 4 && child.childrenLength === 0) { + continue; + } + items.push(child); + } + const result = this.oldNodeReader ? concat23Trees(items) : concat23TreesOfSameHeight(items, this.createImmutableLists); + return result; + } + tryReadChildFromCache(openedBracketIds) { + if (this.oldNodeReader) { + const maxCacheableLength = this.positionMapper.getDistanceToNextChange(this.tokenizer.offset); + if (maxCacheableLength === null || !lengthIsZero(maxCacheableLength)) { + const cachedNode = this.oldNodeReader.readLongestNodeAt(this.positionMapper.getOffsetBeforeChange(this.tokenizer.offset), (curNode) => { + if (maxCacheableLength !== null && !lengthLessThan(curNode.length, maxCacheableLength)) { + return false; + } + const canBeReused = curNode.canBeReused(openedBracketIds); + return canBeReused; + }); + if (cachedNode) { + this._itemsFromCache++; + this.tokenizer.skip(cachedNode.length); + return cachedNode; + } + } + } + return void 0; + } + parseChild(openedBracketIds, level) { + this._itemsConstructed++; + const token = this.tokenizer.read(); + switch (token.kind) { + case 2: + return new InvalidBracketAstNode(token.bracketIds, token.length); + case 0: + return token.astNode; + case 1: { + if (level > 300) { + return new TextAstNode(token.length); + } + const set = openedBracketIds.merge(token.bracketIds); + const child = this.parseList(set, level + 1); + const nextToken = this.tokenizer.peek(); + if (nextToken && nextToken.kind === 2 && (nextToken.bracketId === token.bracketId || nextToken.bracketIds.intersects(token.bracketIds))) { + this.tokenizer.read(); + return PairAstNode.create(token.astNode, child, nextToken.astNode); + } else { + return PairAstNode.create(token.astNode, child, null); + } + } + default: + throw new Error("unexpected"); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/combineTextEditInfos.js +function combineTextEditInfos(textEditInfoFirst, textEditInfoSecond) { + if (textEditInfoFirst.length === 0) { + return textEditInfoSecond; + } + if (textEditInfoSecond.length === 0) { + return textEditInfoFirst; + } + const s0ToS1Map = new ArrayQueue(toLengthMapping(textEditInfoFirst)); + const s1ToS2Map = toLengthMapping(textEditInfoSecond); + s1ToS2Map.push({ modified: false, lengthBefore: void 0, lengthAfter: void 0 }); + let curItem = s0ToS1Map.dequeue(); + function nextS0ToS1MapWithS1LengthOf(s1Length) { + if (s1Length === void 0) { + const arr = s0ToS1Map.takeWhile((v) => true) || []; + if (curItem) { + arr.unshift(curItem); + } + return arr; + } + const result2 = []; + while (curItem && !lengthIsZero(s1Length)) { + const [item, remainingItem] = curItem.splitAt(s1Length); + result2.push(item); + s1Length = lengthDiffNonNegative(item.lengthAfter, s1Length); + curItem = remainingItem !== null && remainingItem !== void 0 ? remainingItem : s0ToS1Map.dequeue(); + } + if (!lengthIsZero(s1Length)) { + result2.push(new LengthMapping(false, s1Length, s1Length)); + } + return result2; + } + const result = []; + function pushEdit(startOffset, endOffset, newLength) { + if (result.length > 0 && lengthEquals(result[result.length - 1].endOffset, startOffset)) { + const lastResult = result[result.length - 1]; + result[result.length - 1] = new TextEditInfo(lastResult.startOffset, endOffset, lengthAdd(lastResult.newLength, newLength)); + } else { + result.push({ startOffset, endOffset, newLength }); + } + } + let s0offset = lengthZero; + for (const s1ToS2 of s1ToS2Map) { + const s0ToS1Map2 = nextS0ToS1MapWithS1LengthOf(s1ToS2.lengthBefore); + if (s1ToS2.modified) { + const s0Length = sumLengths(s0ToS1Map2, (s) => s.lengthBefore); + const s0EndOffset = lengthAdd(s0offset, s0Length); + pushEdit(s0offset, s0EndOffset, s1ToS2.lengthAfter); + s0offset = s0EndOffset; + } else { + for (const s1 of s0ToS1Map2) { + const s0startOffset = s0offset; + s0offset = lengthAdd(s0offset, s1.lengthBefore); + if (s1.modified) { + pushEdit(s0startOffset, s0offset, s1.lengthAfter); + } + } + } + } + return result; +} +function toLengthMapping(textEditInfos) { + const result = []; + let lastOffset = lengthZero; + for (const textEditInfo of textEditInfos) { + const spaceLength = lengthDiffNonNegative(lastOffset, textEditInfo.startOffset); + if (!lengthIsZero(spaceLength)) { + result.push(new LengthMapping(false, spaceLength, spaceLength)); + } + const lengthBefore = lengthDiffNonNegative(textEditInfo.startOffset, textEditInfo.endOffset); + result.push(new LengthMapping(true, lengthBefore, textEditInfo.newLength)); + lastOffset = textEditInfo.endOffset; + } + return result; +} +var LengthMapping; +var init_combineTextEditInfos = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/combineTextEditInfos.js"() { + init_arrays(); + init_beforeEditPositionMapper(); + init_length(); + LengthMapping = class _LengthMapping { + constructor(modified, lengthBefore, lengthAfter) { + this.modified = modified; + this.lengthBefore = lengthBefore; + this.lengthAfter = lengthAfter; + } + splitAt(lengthAfter) { + const remainingLengthAfter = lengthDiffNonNegative(lengthAfter, this.lengthAfter); + if (lengthEquals(remainingLengthAfter, lengthZero)) { + return [this, void 0]; + } else if (this.modified) { + return [ + new _LengthMapping(this.modified, this.lengthBefore, lengthAfter), + new _LengthMapping(this.modified, lengthZero, remainingLengthAfter) + ]; + } else { + return [ + new _LengthMapping(this.modified, lengthAfter, lengthAfter), + new _LengthMapping(this.modified, remainingLengthAfter, remainingLengthAfter) + ]; + } + } + toString() { + return `${this.modified ? "M" : "U"}:${lengthToObj(this.lengthBefore)} -> ${lengthToObj(this.lengthAfter)}`; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/bracketPairsTree.js +function getFirstBracketBefore(node, nodeOffsetStart, nodeOffsetEnd, position) { + if (node.kind === 4 || node.kind === 2) { + const lengths = []; + for (const child of node.children) { + nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length); + lengths.push({ nodeOffsetStart, nodeOffsetEnd }); + nodeOffsetStart = nodeOffsetEnd; + } + for (let i = lengths.length - 1; i >= 0; i--) { + const { nodeOffsetStart: nodeOffsetStart2, nodeOffsetEnd: nodeOffsetEnd2 } = lengths[i]; + if (lengthLessThan(nodeOffsetStart2, position)) { + const result = getFirstBracketBefore(node.children[i], nodeOffsetStart2, nodeOffsetEnd2, position); + if (result) { + return result; + } + } + } + return null; + } else if (node.kind === 3) { + return null; + } else if (node.kind === 1) { + const range2 = lengthsToRange(nodeOffsetStart, nodeOffsetEnd); + return { + bracketInfo: node.bracketInfo, + range: range2 + }; + } + return null; +} +function getFirstBracketAfter(node, nodeOffsetStart, nodeOffsetEnd, position) { + if (node.kind === 4 || node.kind === 2) { + for (const child of node.children) { + nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length); + if (lengthLessThan(position, nodeOffsetEnd)) { + const result = getFirstBracketAfter(child, nodeOffsetStart, nodeOffsetEnd, position); + if (result) { + return result; + } + } + nodeOffsetStart = nodeOffsetEnd; + } + return null; + } else if (node.kind === 3) { + return null; + } else if (node.kind === 1) { + const range2 = lengthsToRange(nodeOffsetStart, nodeOffsetEnd); + return { + bracketInfo: node.bracketInfo, + range: range2 + }; + } + return null; +} +function collectBrackets(node, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, push, level, nestingLevelOfEqualBracketType, levelPerBracketType, onlyColorizedBrackets, parentPairIsIncomplete = false) { + if (level > 200) { + return true; + } + whileLoop: while (true) { + switch (node.kind) { + case 4: { + const childCount = node.childrenLength; + for (let i = 0; i < childCount; i++) { + const child = node.getChild(i); + if (!child) { + continue; + } + nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length); + if (lengthLessThanEqual(nodeOffsetStart, endOffset) && lengthGreaterThanEqual(nodeOffsetEnd, startOffset)) { + const childEndsAfterEnd = lengthGreaterThanEqual(nodeOffsetEnd, endOffset); + if (childEndsAfterEnd) { + node = child; + continue whileLoop; + } + const shouldContinue = collectBrackets(child, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, push, level, 0, levelPerBracketType, onlyColorizedBrackets); + if (!shouldContinue) { + return false; + } + } + nodeOffsetStart = nodeOffsetEnd; + } + return true; + } + case 2: { + const colorize2 = !onlyColorizedBrackets || !node.closingBracket || node.closingBracket.bracketInfo.closesColorized(node.openingBracket.bracketInfo); + let levelPerBracket = 0; + if (levelPerBracketType) { + let existing = levelPerBracketType.get(node.openingBracket.text); + if (existing === void 0) { + existing = 0; + } + levelPerBracket = existing; + if (colorize2) { + existing++; + levelPerBracketType.set(node.openingBracket.text, existing); + } + } + const childCount = node.childrenLength; + for (let i = 0; i < childCount; i++) { + const child = node.getChild(i); + if (!child) { + continue; + } + nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length); + if (lengthLessThanEqual(nodeOffsetStart, endOffset) && lengthGreaterThanEqual(nodeOffsetEnd, startOffset)) { + const childEndsAfterEnd = lengthGreaterThanEqual(nodeOffsetEnd, endOffset); + if (childEndsAfterEnd && child.kind !== 1) { + node = child; + if (colorize2) { + level++; + nestingLevelOfEqualBracketType = levelPerBracket + 1; + } else { + nestingLevelOfEqualBracketType = levelPerBracket; + } + continue whileLoop; + } + if (colorize2 || child.kind !== 1 || !node.closingBracket) { + const shouldContinue = collectBrackets(child, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, push, colorize2 ? level + 1 : level, colorize2 ? levelPerBracket + 1 : levelPerBracket, levelPerBracketType, onlyColorizedBrackets, !node.closingBracket); + if (!shouldContinue) { + return false; + } + } + } + nodeOffsetStart = nodeOffsetEnd; + } + levelPerBracketType === null || levelPerBracketType === void 0 ? void 0 : levelPerBracketType.set(node.openingBracket.text, levelPerBracket); + return true; + } + case 3: { + const range2 = lengthsToRange(nodeOffsetStart, nodeOffsetEnd); + return push(new BracketInfo(range2, level - 1, 0, true)); + } + case 1: { + const range2 = lengthsToRange(nodeOffsetStart, nodeOffsetEnd); + return push(new BracketInfo(range2, level - 1, nestingLevelOfEqualBracketType - 1, parentPairIsIncomplete)); + } + case 0: + return true; + } + } +} +function collectBracketPairs(node, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, context, level, levelPerBracketType) { + var _a10; + if (level > 200) { + return true; + } + let shouldContinue = true; + if (node.kind === 2) { + let levelPerBracket = 0; + if (levelPerBracketType) { + let existing = levelPerBracketType.get(node.openingBracket.text); + if (existing === void 0) { + existing = 0; + } + levelPerBracket = existing; + existing++; + levelPerBracketType.set(node.openingBracket.text, existing); + } + const openingBracketEnd = lengthAdd(nodeOffsetStart, node.openingBracket.length); + let minIndentation = -1; + if (context.includeMinIndentation) { + minIndentation = node.computeMinIndentation(nodeOffsetStart, context.textModel); + } + shouldContinue = context.push(new BracketPairWithMinIndentationInfo(lengthsToRange(nodeOffsetStart, nodeOffsetEnd), lengthsToRange(nodeOffsetStart, openingBracketEnd), node.closingBracket ? lengthsToRange(lengthAdd(openingBracketEnd, ((_a10 = node.child) === null || _a10 === void 0 ? void 0 : _a10.length) || lengthZero), nodeOffsetEnd) : void 0, level, levelPerBracket, node, minIndentation)); + nodeOffsetStart = openingBracketEnd; + if (shouldContinue && node.child) { + const child = node.child; + nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length); + if (lengthLessThanEqual(nodeOffsetStart, endOffset) && lengthGreaterThanEqual(nodeOffsetEnd, startOffset)) { + shouldContinue = collectBracketPairs(child, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, context, level + 1, levelPerBracketType); + if (!shouldContinue) { + return false; + } + } + } + levelPerBracketType === null || levelPerBracketType === void 0 ? void 0 : levelPerBracketType.set(node.openingBracket.text, levelPerBracket); + } else { + let curOffset = nodeOffsetStart; + for (const child of node.children) { + const childOffset = curOffset; + curOffset = lengthAdd(curOffset, child.length); + if (lengthLessThanEqual(childOffset, endOffset) && lengthLessThanEqual(startOffset, curOffset)) { + shouldContinue = collectBracketPairs(child, childOffset, curOffset, startOffset, endOffset, context, level, levelPerBracketType); + if (!shouldContinue) { + return false; + } + } + } + } + return shouldContinue; +} +var BracketPairsTree, CollectBracketPairsContext; +var init_bracketPairsTree = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/bracketPairsTree.js"() { + init_event(); + init_lifecycle(); + init_textModelBracketPairs(); + init_beforeEditPositionMapper(); + init_brackets(); + init_length(); + init_parser(); + init_smallImmutableSet(); + init_tokenizer(); + init_arrays(); + init_combineTextEditInfos(); + BracketPairsTree = class extends Disposable { + didLanguageChange(languageId) { + return this.brackets.didLanguageChange(languageId); + } + constructor(textModel, getLanguageConfiguration) { + super(); + this.textModel = textModel; + this.getLanguageConfiguration = getLanguageConfiguration; + this.didChangeEmitter = new Emitter(); + this.denseKeyProvider = new DenseKeyProvider(); + this.brackets = new LanguageAgnosticBracketTokens(this.denseKeyProvider, this.getLanguageConfiguration); + this.onDidChange = this.didChangeEmitter.event; + this.queuedTextEditsForInitialAstWithoutTokens = []; + this.queuedTextEdits = []; + if (!textModel.tokenization.hasTokens) { + const brackets = this.brackets.getSingleLanguageBracketTokens(this.textModel.getLanguageId()); + const tokenizer = new FastTokenizer(this.textModel.getValue(), brackets); + this.initialAstWithoutTokens = parseDocument(tokenizer, [], void 0, true); + this.astWithTokens = this.initialAstWithoutTokens; + } else if (textModel.tokenization.backgroundTokenizationState === 2) { + this.initialAstWithoutTokens = void 0; + this.astWithTokens = this.parseDocumentFromTextBuffer([], void 0, false); + } else { + this.initialAstWithoutTokens = this.parseDocumentFromTextBuffer([], void 0, true); + this.astWithTokens = this.initialAstWithoutTokens; + } + } + //#region TextModel events + handleDidChangeBackgroundTokenizationState() { + if (this.textModel.tokenization.backgroundTokenizationState === 2) { + const wasUndefined = this.initialAstWithoutTokens === void 0; + this.initialAstWithoutTokens = void 0; + if (!wasUndefined) { + this.didChangeEmitter.fire(); + } + } + } + handleDidChangeTokens({ ranges }) { + const edits = ranges.map((r) => new TextEditInfo(toLength(r.fromLineNumber - 1, 0), toLength(r.toLineNumber, 0), toLength(r.toLineNumber - r.fromLineNumber + 1, 0))); + this.handleEdits(edits, true); + if (!this.initialAstWithoutTokens) { + this.didChangeEmitter.fire(); + } + } + handleContentChanged(change) { + const edits = TextEditInfo.fromModelContentChanges(change.changes); + this.handleEdits(edits, false); + } + handleEdits(edits, tokenChange) { + const result = combineTextEditInfos(this.queuedTextEdits, edits); + this.queuedTextEdits = result; + if (this.initialAstWithoutTokens && !tokenChange) { + this.queuedTextEditsForInitialAstWithoutTokens = combineTextEditInfos(this.queuedTextEditsForInitialAstWithoutTokens, edits); + } + } + //#endregion + flushQueue() { + if (this.queuedTextEdits.length > 0) { + this.astWithTokens = this.parseDocumentFromTextBuffer(this.queuedTextEdits, this.astWithTokens, false); + this.queuedTextEdits = []; + } + if (this.queuedTextEditsForInitialAstWithoutTokens.length > 0) { + if (this.initialAstWithoutTokens) { + this.initialAstWithoutTokens = this.parseDocumentFromTextBuffer(this.queuedTextEditsForInitialAstWithoutTokens, this.initialAstWithoutTokens, false); + } + this.queuedTextEditsForInitialAstWithoutTokens = []; + } + } + /** + * @pure (only if isPure = true) + */ + parseDocumentFromTextBuffer(edits, previousAst, immutable) { + const isPure = false; + const previousAstClone = isPure ? previousAst === null || previousAst === void 0 ? void 0 : previousAst.deepClone() : previousAst; + const tokenizer = new TextBufferTokenizer(this.textModel, this.brackets); + const result = parseDocument(tokenizer, edits, previousAstClone, immutable); + return result; + } + getBracketsInRange(range2, onlyColorizedBrackets) { + this.flushQueue(); + const startOffset = toLength(range2.startLineNumber - 1, range2.startColumn - 1); + const endOffset = toLength(range2.endLineNumber - 1, range2.endColumn - 1); + return new CallbackIterable((cb) => { + const node = this.initialAstWithoutTokens || this.astWithTokens; + collectBrackets(node, lengthZero, node.length, startOffset, endOffset, cb, 0, 0, /* @__PURE__ */ new Map(), onlyColorizedBrackets); + }); + } + getBracketPairsInRange(range2, includeMinIndentation) { + this.flushQueue(); + const startLength = positionToLength(range2.getStartPosition()); + const endLength = positionToLength(range2.getEndPosition()); + return new CallbackIterable((cb) => { + const node = this.initialAstWithoutTokens || this.astWithTokens; + const context = new CollectBracketPairsContext(cb, includeMinIndentation, this.textModel); + collectBracketPairs(node, lengthZero, node.length, startLength, endLength, context, 0, /* @__PURE__ */ new Map()); + }); + } + getFirstBracketAfter(position) { + this.flushQueue(); + const node = this.initialAstWithoutTokens || this.astWithTokens; + return getFirstBracketAfter(node, lengthZero, node.length, positionToLength(position)); + } + getFirstBracketBefore(position) { + this.flushQueue(); + const node = this.initialAstWithoutTokens || this.astWithTokens; + return getFirstBracketBefore(node, lengthZero, node.length, positionToLength(position)); + } + }; + CollectBracketPairsContext = class { + constructor(push, includeMinIndentation, textModel) { + this.push = push; + this.includeMinIndentation = includeMinIndentation; + this.textModel = textModel; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl.js +function createDisposableRef(object, disposable) { + return { + object, + dispose: () => disposable === null || disposable === void 0 ? void 0 : disposable.dispose() + }; +} +function createTimeBasedContinueBracketSearchPredicate(maxDuration) { + if (typeof maxDuration === "undefined") { + return () => true; + } else { + const startTime = Date.now(); + return () => { + return Date.now() - startTime <= maxDuration; + }; + } +} +function stripBracketSearchCanceled(result) { + if (result instanceof BracketSearchCanceled) { + return null; + } + return result; +} +var BracketPairsTextModelPart, BracketSearchCanceled; +var init_bracketPairsImpl = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl.js"() { + init_arrays(); + init_event(); + init_lifecycle(); + init_range(); + init_supports(); + init_richEditBrackets(); + init_bracketPairsTree(); + BracketPairsTextModelPart = class extends Disposable { + get canBuildAST() { + const maxSupportedDocumentLength = ( + /* max lines */ + 5e4 * /* average column count */ + 100 + ); + return this.textModel.getValueLength() <= maxSupportedDocumentLength; + } + constructor(textModel, languageConfigurationService) { + super(); + this.textModel = textModel; + this.languageConfigurationService = languageConfigurationService; + this.bracketPairsTree = this._register(new MutableDisposable()); + this.onDidChangeEmitter = new Emitter(); + this.onDidChange = this.onDidChangeEmitter.event; + this.bracketsRequested = false; + this._register(this.languageConfigurationService.onDidChange((e) => { + var _a10; + if (!e.languageId || ((_a10 = this.bracketPairsTree.value) === null || _a10 === void 0 ? void 0 : _a10.object.didLanguageChange(e.languageId))) { + this.bracketPairsTree.clear(); + this.updateBracketPairsTree(); + } + })); + } + //#region TextModel events + handleDidChangeOptions(e) { + this.bracketPairsTree.clear(); + this.updateBracketPairsTree(); + } + handleDidChangeLanguage(e) { + this.bracketPairsTree.clear(); + this.updateBracketPairsTree(); + } + handleDidChangeContent(change) { + var _a10; + (_a10 = this.bracketPairsTree.value) === null || _a10 === void 0 ? void 0 : _a10.object.handleContentChanged(change); + } + handleDidChangeBackgroundTokenizationState() { + var _a10; + (_a10 = this.bracketPairsTree.value) === null || _a10 === void 0 ? void 0 : _a10.object.handleDidChangeBackgroundTokenizationState(); + } + handleDidChangeTokens(e) { + var _a10; + (_a10 = this.bracketPairsTree.value) === null || _a10 === void 0 ? void 0 : _a10.object.handleDidChangeTokens(e); + } + //#endregion + updateBracketPairsTree() { + if (this.bracketsRequested && this.canBuildAST) { + if (!this.bracketPairsTree.value) { + const store = new DisposableStore(); + this.bracketPairsTree.value = createDisposableRef(store.add(new BracketPairsTree(this.textModel, (languageId) => { + return this.languageConfigurationService.getLanguageConfiguration(languageId); + })), store); + store.add(this.bracketPairsTree.value.object.onDidChange((e) => this.onDidChangeEmitter.fire(e))); + this.onDidChangeEmitter.fire(); + } + } else { + if (this.bracketPairsTree.value) { + this.bracketPairsTree.clear(); + this.onDidChangeEmitter.fire(); + } + } + } + /** + * Returns all bracket pairs that intersect the given range. + * The result is sorted by the start position. + */ + getBracketPairsInRange(range2) { + var _a10; + this.bracketsRequested = true; + this.updateBracketPairsTree(); + return ((_a10 = this.bracketPairsTree.value) === null || _a10 === void 0 ? void 0 : _a10.object.getBracketPairsInRange(range2, false)) || CallbackIterable.empty; + } + getBracketPairsInRangeWithMinIndentation(range2) { + var _a10; + this.bracketsRequested = true; + this.updateBracketPairsTree(); + return ((_a10 = this.bracketPairsTree.value) === null || _a10 === void 0 ? void 0 : _a10.object.getBracketPairsInRange(range2, true)) || CallbackIterable.empty; + } + getBracketsInRange(range2, onlyColorizedBrackets = false) { + var _a10; + this.bracketsRequested = true; + this.updateBracketPairsTree(); + return ((_a10 = this.bracketPairsTree.value) === null || _a10 === void 0 ? void 0 : _a10.object.getBracketsInRange(range2, onlyColorizedBrackets)) || CallbackIterable.empty; + } + findMatchingBracketUp(_bracket, _position, maxDuration) { + const position = this.textModel.validatePosition(_position); + const languageId = this.textModel.getLanguageIdAtPosition(position.lineNumber, position.column); + if (this.canBuildAST) { + const closingBracketInfo = this.languageConfigurationService.getLanguageConfiguration(languageId).bracketsNew.getClosingBracketInfo(_bracket); + if (!closingBracketInfo) { + return null; + } + const bracketPair = this.getBracketPairsInRange(Range.fromPositions(_position, _position)).findLast((b) => closingBracketInfo.closes(b.openingBracketInfo)); + if (bracketPair) { + return bracketPair.openingBracketRange; + } + return null; + } else { + const bracket = _bracket.toLowerCase(); + const bracketsSupport = this.languageConfigurationService.getLanguageConfiguration(languageId).brackets; + if (!bracketsSupport) { + return null; + } + const data = bracketsSupport.textIsBracket[bracket]; + if (!data) { + return null; + } + return stripBracketSearchCanceled(this._findMatchingBracketUp(data, position, createTimeBasedContinueBracketSearchPredicate(maxDuration))); + } + } + matchBracket(position, maxDuration) { + if (this.canBuildAST) { + const bracketPair = this.getBracketPairsInRange(Range.fromPositions(position, position)).filter((item) => item.closingBracketRange !== void 0 && (item.openingBracketRange.containsPosition(position) || item.closingBracketRange.containsPosition(position))).findLastMaxBy(compareBy((item) => item.openingBracketRange.containsPosition(position) ? item.openingBracketRange : item.closingBracketRange, Range.compareRangesUsingStarts)); + if (bracketPair) { + return [bracketPair.openingBracketRange, bracketPair.closingBracketRange]; + } + return null; + } else { + const continueSearchPredicate = createTimeBasedContinueBracketSearchPredicate(maxDuration); + return this._matchBracket(this.textModel.validatePosition(position), continueSearchPredicate); + } + } + _establishBracketSearchOffsets(position, lineTokens, modeBrackets, tokenIndex) { + const tokenCount = lineTokens.getCount(); + const currentLanguageId = lineTokens.getLanguageId(tokenIndex); + let searchStartOffset = Math.max(0, position.column - 1 - modeBrackets.maxBracketLength); + for (let i = tokenIndex - 1; i >= 0; i--) { + const tokenEndOffset = lineTokens.getEndOffset(i); + if (tokenEndOffset <= searchStartOffset) { + break; + } + if (ignoreBracketsInToken(lineTokens.getStandardTokenType(i)) || lineTokens.getLanguageId(i) !== currentLanguageId) { + searchStartOffset = tokenEndOffset; + break; + } + } + let searchEndOffset = Math.min(lineTokens.getLineContent().length, position.column - 1 + modeBrackets.maxBracketLength); + for (let i = tokenIndex + 1; i < tokenCount; i++) { + const tokenStartOffset = lineTokens.getStartOffset(i); + if (tokenStartOffset >= searchEndOffset) { + break; + } + if (ignoreBracketsInToken(lineTokens.getStandardTokenType(i)) || lineTokens.getLanguageId(i) !== currentLanguageId) { + searchEndOffset = tokenStartOffset; + break; + } + } + return { searchStartOffset, searchEndOffset }; + } + _matchBracket(position, continueSearchPredicate) { + const lineNumber = position.lineNumber; + const lineTokens = this.textModel.tokenization.getLineTokens(lineNumber); + const lineText = this.textModel.getLineContent(lineNumber); + const tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1); + if (tokenIndex < 0) { + return null; + } + const currentModeBrackets = this.languageConfigurationService.getLanguageConfiguration(lineTokens.getLanguageId(tokenIndex)).brackets; + if (currentModeBrackets && !ignoreBracketsInToken(lineTokens.getStandardTokenType(tokenIndex))) { + let { searchStartOffset, searchEndOffset } = this._establishBracketSearchOffsets(position, lineTokens, currentModeBrackets, tokenIndex); + let bestResult = null; + while (true) { + const foundBracket = BracketsUtils.findNextBracketInRange(currentModeBrackets.forwardRegex, lineNumber, lineText, searchStartOffset, searchEndOffset); + if (!foundBracket) { + break; + } + if (foundBracket.startColumn <= position.column && position.column <= foundBracket.endColumn) { + const foundBracketText = lineText.substring(foundBracket.startColumn - 1, foundBracket.endColumn - 1).toLowerCase(); + const r = this._matchFoundBracket(foundBracket, currentModeBrackets.textIsBracket[foundBracketText], currentModeBrackets.textIsOpenBracket[foundBracketText], continueSearchPredicate); + if (r) { + if (r instanceof BracketSearchCanceled) { + return null; + } + bestResult = r; + } + } + searchStartOffset = foundBracket.endColumn - 1; + } + if (bestResult) { + return bestResult; + } + } + if (tokenIndex > 0 && lineTokens.getStartOffset(tokenIndex) === position.column - 1) { + const prevTokenIndex = tokenIndex - 1; + const prevModeBrackets = this.languageConfigurationService.getLanguageConfiguration(lineTokens.getLanguageId(prevTokenIndex)).brackets; + if (prevModeBrackets && !ignoreBracketsInToken(lineTokens.getStandardTokenType(prevTokenIndex))) { + const { searchStartOffset, searchEndOffset } = this._establishBracketSearchOffsets(position, lineTokens, prevModeBrackets, prevTokenIndex); + const foundBracket = BracketsUtils.findPrevBracketInRange(prevModeBrackets.reversedRegex, lineNumber, lineText, searchStartOffset, searchEndOffset); + if (foundBracket && foundBracket.startColumn <= position.column && position.column <= foundBracket.endColumn) { + const foundBracketText = lineText.substring(foundBracket.startColumn - 1, foundBracket.endColumn - 1).toLowerCase(); + const r = this._matchFoundBracket(foundBracket, prevModeBrackets.textIsBracket[foundBracketText], prevModeBrackets.textIsOpenBracket[foundBracketText], continueSearchPredicate); + if (r) { + if (r instanceof BracketSearchCanceled) { + return null; + } + return r; + } + } + } + } + return null; + } + _matchFoundBracket(foundBracket, data, isOpen, continueSearchPredicate) { + if (!data) { + return null; + } + const matched = isOpen ? this._findMatchingBracketDown(data, foundBracket.getEndPosition(), continueSearchPredicate) : this._findMatchingBracketUp(data, foundBracket.getStartPosition(), continueSearchPredicate); + if (!matched) { + return null; + } + if (matched instanceof BracketSearchCanceled) { + return matched; + } + return [foundBracket, matched]; + } + _findMatchingBracketUp(bracket, position, continueSearchPredicate) { + const languageId = bracket.languageId; + const reversedBracketRegex = bracket.reversedRegex; + let count = -1; + let totalCallCount = 0; + const searchPrevMatchingBracketInRange = (lineNumber, lineText, searchStartOffset, searchEndOffset) => { + while (true) { + if (continueSearchPredicate && ++totalCallCount % 100 === 0 && !continueSearchPredicate()) { + return BracketSearchCanceled.INSTANCE; + } + const r = BracketsUtils.findPrevBracketInRange(reversedBracketRegex, lineNumber, lineText, searchStartOffset, searchEndOffset); + if (!r) { + break; + } + const hitText = lineText.substring(r.startColumn - 1, r.endColumn - 1).toLowerCase(); + if (bracket.isOpen(hitText)) { + count++; + } else if (bracket.isClose(hitText)) { + count--; + } + if (count === 0) { + return r; + } + searchEndOffset = r.startColumn - 1; + } + return null; + }; + for (let lineNumber = position.lineNumber; lineNumber >= 1; lineNumber--) { + const lineTokens = this.textModel.tokenization.getLineTokens(lineNumber); + const tokenCount = lineTokens.getCount(); + const lineText = this.textModel.getLineContent(lineNumber); + let tokenIndex = tokenCount - 1; + let searchStartOffset = lineText.length; + let searchEndOffset = lineText.length; + if (lineNumber === position.lineNumber) { + tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1); + searchStartOffset = position.column - 1; + searchEndOffset = position.column - 1; + } + let prevSearchInToken = true; + for (; tokenIndex >= 0; tokenIndex--) { + const searchInToken = lineTokens.getLanguageId(tokenIndex) === languageId && !ignoreBracketsInToken(lineTokens.getStandardTokenType(tokenIndex)); + if (searchInToken) { + if (prevSearchInToken) { + searchStartOffset = lineTokens.getStartOffset(tokenIndex); + } else { + searchStartOffset = lineTokens.getStartOffset(tokenIndex); + searchEndOffset = lineTokens.getEndOffset(tokenIndex); + } + } else { + if (prevSearchInToken && searchStartOffset !== searchEndOffset) { + const r = searchPrevMatchingBracketInRange(lineNumber, lineText, searchStartOffset, searchEndOffset); + if (r) { + return r; + } + } + } + prevSearchInToken = searchInToken; + } + if (prevSearchInToken && searchStartOffset !== searchEndOffset) { + const r = searchPrevMatchingBracketInRange(lineNumber, lineText, searchStartOffset, searchEndOffset); + if (r) { + return r; + } + } + } + return null; + } + _findMatchingBracketDown(bracket, position, continueSearchPredicate) { + const languageId = bracket.languageId; + const bracketRegex = bracket.forwardRegex; + let count = 1; + let totalCallCount = 0; + const searchNextMatchingBracketInRange = (lineNumber, lineText, searchStartOffset, searchEndOffset) => { + while (true) { + if (continueSearchPredicate && ++totalCallCount % 100 === 0 && !continueSearchPredicate()) { + return BracketSearchCanceled.INSTANCE; + } + const r = BracketsUtils.findNextBracketInRange(bracketRegex, lineNumber, lineText, searchStartOffset, searchEndOffset); + if (!r) { + break; + } + const hitText = lineText.substring(r.startColumn - 1, r.endColumn - 1).toLowerCase(); + if (bracket.isOpen(hitText)) { + count++; + } else if (bracket.isClose(hitText)) { + count--; + } + if (count === 0) { + return r; + } + searchStartOffset = r.endColumn - 1; + } + return null; + }; + const lineCount = this.textModel.getLineCount(); + for (let lineNumber = position.lineNumber; lineNumber <= lineCount; lineNumber++) { + const lineTokens = this.textModel.tokenization.getLineTokens(lineNumber); + const tokenCount = lineTokens.getCount(); + const lineText = this.textModel.getLineContent(lineNumber); + let tokenIndex = 0; + let searchStartOffset = 0; + let searchEndOffset = 0; + if (lineNumber === position.lineNumber) { + tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1); + searchStartOffset = position.column - 1; + searchEndOffset = position.column - 1; + } + let prevSearchInToken = true; + for (; tokenIndex < tokenCount; tokenIndex++) { + const searchInToken = lineTokens.getLanguageId(tokenIndex) === languageId && !ignoreBracketsInToken(lineTokens.getStandardTokenType(tokenIndex)); + if (searchInToken) { + if (prevSearchInToken) { + searchEndOffset = lineTokens.getEndOffset(tokenIndex); + } else { + searchStartOffset = lineTokens.getStartOffset(tokenIndex); + searchEndOffset = lineTokens.getEndOffset(tokenIndex); + } + } else { + if (prevSearchInToken && searchStartOffset !== searchEndOffset) { + const r = searchNextMatchingBracketInRange(lineNumber, lineText, searchStartOffset, searchEndOffset); + if (r) { + return r; + } + } + } + prevSearchInToken = searchInToken; + } + if (prevSearchInToken && searchStartOffset !== searchEndOffset) { + const r = searchNextMatchingBracketInRange(lineNumber, lineText, searchStartOffset, searchEndOffset); + if (r) { + return r; + } + } + } + return null; + } + findPrevBracket(_position) { + var _a10; + const position = this.textModel.validatePosition(_position); + if (this.canBuildAST) { + this.bracketsRequested = true; + this.updateBracketPairsTree(); + return ((_a10 = this.bracketPairsTree.value) === null || _a10 === void 0 ? void 0 : _a10.object.getFirstBracketBefore(position)) || null; + } + let languageId = null; + let modeBrackets = null; + let bracketConfig = null; + for (let lineNumber = position.lineNumber; lineNumber >= 1; lineNumber--) { + const lineTokens = this.textModel.tokenization.getLineTokens(lineNumber); + const tokenCount = lineTokens.getCount(); + const lineText = this.textModel.getLineContent(lineNumber); + let tokenIndex = tokenCount - 1; + let searchStartOffset = lineText.length; + let searchEndOffset = lineText.length; + if (lineNumber === position.lineNumber) { + tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1); + searchStartOffset = position.column - 1; + searchEndOffset = position.column - 1; + const tokenLanguageId = lineTokens.getLanguageId(tokenIndex); + if (languageId !== tokenLanguageId) { + languageId = tokenLanguageId; + modeBrackets = this.languageConfigurationService.getLanguageConfiguration(languageId).brackets; + bracketConfig = this.languageConfigurationService.getLanguageConfiguration(languageId).bracketsNew; + } + } + let prevSearchInToken = true; + for (; tokenIndex >= 0; tokenIndex--) { + const tokenLanguageId = lineTokens.getLanguageId(tokenIndex); + if (languageId !== tokenLanguageId) { + if (modeBrackets && bracketConfig && prevSearchInToken && searchStartOffset !== searchEndOffset) { + const r = BracketsUtils.findPrevBracketInRange(modeBrackets.reversedRegex, lineNumber, lineText, searchStartOffset, searchEndOffset); + if (r) { + return this._toFoundBracket(bracketConfig, r); + } + prevSearchInToken = false; + } + languageId = tokenLanguageId; + modeBrackets = this.languageConfigurationService.getLanguageConfiguration(languageId).brackets; + bracketConfig = this.languageConfigurationService.getLanguageConfiguration(languageId).bracketsNew; + } + const searchInToken = !!modeBrackets && !ignoreBracketsInToken(lineTokens.getStandardTokenType(tokenIndex)); + if (searchInToken) { + if (prevSearchInToken) { + searchStartOffset = lineTokens.getStartOffset(tokenIndex); + } else { + searchStartOffset = lineTokens.getStartOffset(tokenIndex); + searchEndOffset = lineTokens.getEndOffset(tokenIndex); + } + } else { + if (bracketConfig && modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) { + const r = BracketsUtils.findPrevBracketInRange(modeBrackets.reversedRegex, lineNumber, lineText, searchStartOffset, searchEndOffset); + if (r) { + return this._toFoundBracket(bracketConfig, r); + } + } + } + prevSearchInToken = searchInToken; + } + if (bracketConfig && modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) { + const r = BracketsUtils.findPrevBracketInRange(modeBrackets.reversedRegex, lineNumber, lineText, searchStartOffset, searchEndOffset); + if (r) { + return this._toFoundBracket(bracketConfig, r); + } + } + } + return null; + } + findNextBracket(_position) { + var _a10; + const position = this.textModel.validatePosition(_position); + if (this.canBuildAST) { + this.bracketsRequested = true; + this.updateBracketPairsTree(); + return ((_a10 = this.bracketPairsTree.value) === null || _a10 === void 0 ? void 0 : _a10.object.getFirstBracketAfter(position)) || null; + } + const lineCount = this.textModel.getLineCount(); + let languageId = null; + let modeBrackets = null; + let bracketConfig = null; + for (let lineNumber = position.lineNumber; lineNumber <= lineCount; lineNumber++) { + const lineTokens = this.textModel.tokenization.getLineTokens(lineNumber); + const tokenCount = lineTokens.getCount(); + const lineText = this.textModel.getLineContent(lineNumber); + let tokenIndex = 0; + let searchStartOffset = 0; + let searchEndOffset = 0; + if (lineNumber === position.lineNumber) { + tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1); + searchStartOffset = position.column - 1; + searchEndOffset = position.column - 1; + const tokenLanguageId = lineTokens.getLanguageId(tokenIndex); + if (languageId !== tokenLanguageId) { + languageId = tokenLanguageId; + modeBrackets = this.languageConfigurationService.getLanguageConfiguration(languageId).brackets; + bracketConfig = this.languageConfigurationService.getLanguageConfiguration(languageId).bracketsNew; + } + } + let prevSearchInToken = true; + for (; tokenIndex < tokenCount; tokenIndex++) { + const tokenLanguageId = lineTokens.getLanguageId(tokenIndex); + if (languageId !== tokenLanguageId) { + if (bracketConfig && modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) { + const r = BracketsUtils.findNextBracketInRange(modeBrackets.forwardRegex, lineNumber, lineText, searchStartOffset, searchEndOffset); + if (r) { + return this._toFoundBracket(bracketConfig, r); + } + prevSearchInToken = false; + } + languageId = tokenLanguageId; + modeBrackets = this.languageConfigurationService.getLanguageConfiguration(languageId).brackets; + bracketConfig = this.languageConfigurationService.getLanguageConfiguration(languageId).bracketsNew; + } + const searchInToken = !!modeBrackets && !ignoreBracketsInToken(lineTokens.getStandardTokenType(tokenIndex)); + if (searchInToken) { + if (prevSearchInToken) { + searchEndOffset = lineTokens.getEndOffset(tokenIndex); + } else { + searchStartOffset = lineTokens.getStartOffset(tokenIndex); + searchEndOffset = lineTokens.getEndOffset(tokenIndex); + } + } else { + if (bracketConfig && modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) { + const r = BracketsUtils.findNextBracketInRange(modeBrackets.forwardRegex, lineNumber, lineText, searchStartOffset, searchEndOffset); + if (r) { + return this._toFoundBracket(bracketConfig, r); + } + } + } + prevSearchInToken = searchInToken; + } + if (bracketConfig && modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) { + const r = BracketsUtils.findNextBracketInRange(modeBrackets.forwardRegex, lineNumber, lineText, searchStartOffset, searchEndOffset); + if (r) { + return this._toFoundBracket(bracketConfig, r); + } + } + } + return null; + } + findEnclosingBrackets(_position, maxDuration) { + const position = this.textModel.validatePosition(_position); + if (this.canBuildAST) { + const range2 = Range.fromPositions(position); + const bracketPair = this.getBracketPairsInRange(Range.fromPositions(position, position)).findLast((item) => item.closingBracketRange !== void 0 && item.range.strictContainsRange(range2)); + if (bracketPair) { + return [bracketPair.openingBracketRange, bracketPair.closingBracketRange]; + } + return null; + } + const continueSearchPredicate = createTimeBasedContinueBracketSearchPredicate(maxDuration); + const lineCount = this.textModel.getLineCount(); + const savedCounts = /* @__PURE__ */ new Map(); + let counts = []; + const resetCounts = (languageId2, modeBrackets2) => { + if (!savedCounts.has(languageId2)) { + const tmp = []; + for (let i = 0, len = modeBrackets2 ? modeBrackets2.brackets.length : 0; i < len; i++) { + tmp[i] = 0; + } + savedCounts.set(languageId2, tmp); + } + counts = savedCounts.get(languageId2); + }; + let totalCallCount = 0; + const searchInRange = (modeBrackets2, lineNumber, lineText, searchStartOffset, searchEndOffset) => { + while (true) { + if (continueSearchPredicate && ++totalCallCount % 100 === 0 && !continueSearchPredicate()) { + return BracketSearchCanceled.INSTANCE; + } + const r = BracketsUtils.findNextBracketInRange(modeBrackets2.forwardRegex, lineNumber, lineText, searchStartOffset, searchEndOffset); + if (!r) { + break; + } + const hitText = lineText.substring(r.startColumn - 1, r.endColumn - 1).toLowerCase(); + const bracket = modeBrackets2.textIsBracket[hitText]; + if (bracket) { + if (bracket.isOpen(hitText)) { + counts[bracket.index]++; + } else if (bracket.isClose(hitText)) { + counts[bracket.index]--; + } + if (counts[bracket.index] === -1) { + return this._matchFoundBracket(r, bracket, false, continueSearchPredicate); + } + } + searchStartOffset = r.endColumn - 1; + } + return null; + }; + let languageId = null; + let modeBrackets = null; + for (let lineNumber = position.lineNumber; lineNumber <= lineCount; lineNumber++) { + const lineTokens = this.textModel.tokenization.getLineTokens(lineNumber); + const tokenCount = lineTokens.getCount(); + const lineText = this.textModel.getLineContent(lineNumber); + let tokenIndex = 0; + let searchStartOffset = 0; + let searchEndOffset = 0; + if (lineNumber === position.lineNumber) { + tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1); + searchStartOffset = position.column - 1; + searchEndOffset = position.column - 1; + const tokenLanguageId = lineTokens.getLanguageId(tokenIndex); + if (languageId !== tokenLanguageId) { + languageId = tokenLanguageId; + modeBrackets = this.languageConfigurationService.getLanguageConfiguration(languageId).brackets; + resetCounts(languageId, modeBrackets); + } + } + let prevSearchInToken = true; + for (; tokenIndex < tokenCount; tokenIndex++) { + const tokenLanguageId = lineTokens.getLanguageId(tokenIndex); + if (languageId !== tokenLanguageId) { + if (modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) { + const r = searchInRange(modeBrackets, lineNumber, lineText, searchStartOffset, searchEndOffset); + if (r) { + return stripBracketSearchCanceled(r); + } + prevSearchInToken = false; + } + languageId = tokenLanguageId; + modeBrackets = this.languageConfigurationService.getLanguageConfiguration(languageId).brackets; + resetCounts(languageId, modeBrackets); + } + const searchInToken = !!modeBrackets && !ignoreBracketsInToken(lineTokens.getStandardTokenType(tokenIndex)); + if (searchInToken) { + if (prevSearchInToken) { + searchEndOffset = lineTokens.getEndOffset(tokenIndex); + } else { + searchStartOffset = lineTokens.getStartOffset(tokenIndex); + searchEndOffset = lineTokens.getEndOffset(tokenIndex); + } + } else { + if (modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) { + const r = searchInRange(modeBrackets, lineNumber, lineText, searchStartOffset, searchEndOffset); + if (r) { + return stripBracketSearchCanceled(r); + } + } + } + prevSearchInToken = searchInToken; + } + if (modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) { + const r = searchInRange(modeBrackets, lineNumber, lineText, searchStartOffset, searchEndOffset); + if (r) { + return stripBracketSearchCanceled(r); + } + } + } + return null; + } + _toFoundBracket(bracketConfig, r) { + if (!r) { + return null; + } + let text2 = this.textModel.getValueInRange(r); + text2 = text2.toLowerCase(); + const bracketInfo = bracketConfig.getBracketInfo(text2); + if (!bracketInfo) { + return null; + } + return { + range: r, + bracketInfo + }; + } + }; + BracketSearchCanceled = class { + constructor() { + this._searchCanceledBrand = void 0; + } + }; + BracketSearchCanceled.INSTANCE = new BracketSearchCanceled(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/colorizedBracketPairsDecorationProvider.js +var ColorizedBracketPairsDecorationProvider, ColorProvider; +var init_colorizedBracketPairsDecorationProvider = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/bracketPairsTextModelPart/colorizedBracketPairsDecorationProvider.js"() { + init_event(); + init_lifecycle(); + init_range(); + init_editorColorRegistry(); + init_themeService(); + ColorizedBracketPairsDecorationProvider = class extends Disposable { + constructor(textModel) { + super(); + this.textModel = textModel; + this.colorProvider = new ColorProvider(); + this.onDidChangeEmitter = new Emitter(); + this.onDidChange = this.onDidChangeEmitter.event; + this.colorizationOptions = textModel.getOptions().bracketPairColorizationOptions; + this._register(textModel.bracketPairs.onDidChange((e) => { + this.onDidChangeEmitter.fire(); + })); + } + //#region TextModel events + handleDidChangeOptions(e) { + this.colorizationOptions = this.textModel.getOptions().bracketPairColorizationOptions; + } + //#endregion + getDecorationsInRange(range2, ownerId2, filterOutValidation, onlyMinimapDecorations) { + if (onlyMinimapDecorations) { + return []; + } + if (ownerId2 === void 0) { + return []; + } + if (!this.colorizationOptions.enabled) { + return []; + } + const result = this.textModel.bracketPairs.getBracketsInRange(range2, true).map((bracket) => ({ + id: `bracket${bracket.range.toString()}-${bracket.nestingLevel}`, + options: { + description: "BracketPairColorization", + inlineClassName: this.colorProvider.getInlineClassName(bracket, this.colorizationOptions.independentColorPoolPerBracketType) + }, + ownerId: 0, + range: bracket.range + })).toArray(); + return result; + } + getAllDecorations(ownerId2, filterOutValidation) { + if (ownerId2 === void 0) { + return []; + } + if (!this.colorizationOptions.enabled) { + return []; + } + return this.getDecorationsInRange(new Range(1, 1, this.textModel.getLineCount(), 1), ownerId2, filterOutValidation); + } + }; + ColorProvider = class { + constructor() { + this.unexpectedClosingBracketClassName = "unexpected-closing-bracket"; + } + getInlineClassName(bracket, independentColorPoolPerBracketType) { + if (bracket.isInvalid) { + return this.unexpectedClosingBracketClassName; + } + return this.getInlineClassNameOfLevel(independentColorPoolPerBracketType ? bracket.nestingLevelOfEqualBracketType : bracket.nestingLevel); + } + getInlineClassNameOfLevel(level) { + return `bracket-highlighting-${level % 30}`; + } + }; + registerThemingParticipant((theme, collector) => { + const colors2 = [ + editorBracketHighlightingForeground1, + editorBracketHighlightingForeground2, + editorBracketHighlightingForeground3, + editorBracketHighlightingForeground4, + editorBracketHighlightingForeground5, + editorBracketHighlightingForeground6 + ]; + const colorProvider = new ColorProvider(); + collector.addRule(`.monaco-editor .${colorProvider.unexpectedClosingBracketClassName} { color: ${theme.getColor(editorBracketHighlightingUnexpectedBracketForeground)}; }`); + const colorValues = colors2.map((c) => theme.getColor(c)).filter((c) => !!c).filter((c) => !c.isTransparent()); + for (let level = 0; level < 30; level++) { + const color = colorValues[level % colorValues.length]; + collector.addRule(`.monaco-editor .${colorProvider.getInlineClassNameOfLevel(level)} { color: ${color}; }`); + } + }); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/textChange.js +function escapeNewLine(str) { + return str.replace(/\n/g, "\\n").replace(/\r/g, "\\r"); +} +function compressConsecutiveTextChanges(prevEdits, currEdits) { + if (prevEdits === null || prevEdits.length === 0) { + return currEdits; + } + const compressor = new TextChangeCompressor(prevEdits, currEdits); + return compressor.compress(); +} +var TextChange, TextChangeCompressor; +var init_textChange = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/textChange.js"() { + init_buffer(); + init_stringBuilder(); + TextChange = class _TextChange { + get oldLength() { + return this.oldText.length; + } + get oldEnd() { + return this.oldPosition + this.oldText.length; + } + get newLength() { + return this.newText.length; + } + get newEnd() { + return this.newPosition + this.newText.length; + } + constructor(oldPosition, oldText, newPosition, newText) { + this.oldPosition = oldPosition; + this.oldText = oldText; + this.newPosition = newPosition; + this.newText = newText; + } + toString() { + if (this.oldText.length === 0) { + return `(insert@${this.oldPosition} "${escapeNewLine(this.newText)}")`; + } + if (this.newText.length === 0) { + return `(delete@${this.oldPosition} "${escapeNewLine(this.oldText)}")`; + } + return `(replace@${this.oldPosition} "${escapeNewLine(this.oldText)}" with "${escapeNewLine(this.newText)}")`; + } + static _writeStringSize(str) { + return 4 + 2 * str.length; + } + static _writeString(b, str, offset) { + const len = str.length; + writeUInt32BE(b, len, offset); + offset += 4; + for (let i = 0; i < len; i++) { + writeUInt16LE(b, str.charCodeAt(i), offset); + offset += 2; + } + return offset; + } + static _readString(b, offset) { + const len = readUInt32BE(b, offset); + offset += 4; + return decodeUTF16LE(b, offset, len); + } + writeSize() { + return 4 + 4 + _TextChange._writeStringSize(this.oldText) + _TextChange._writeStringSize(this.newText); + } + write(b, offset) { + writeUInt32BE(b, this.oldPosition, offset); + offset += 4; + writeUInt32BE(b, this.newPosition, offset); + offset += 4; + offset = _TextChange._writeString(b, this.oldText, offset); + offset = _TextChange._writeString(b, this.newText, offset); + return offset; + } + static read(b, offset, dest) { + const oldPosition = readUInt32BE(b, offset); + offset += 4; + const newPosition = readUInt32BE(b, offset); + offset += 4; + const oldText = _TextChange._readString(b, offset); + offset += _TextChange._writeStringSize(oldText); + const newText = _TextChange._readString(b, offset); + offset += _TextChange._writeStringSize(newText); + dest.push(new _TextChange(oldPosition, oldText, newPosition, newText)); + return offset; + } + }; + TextChangeCompressor = class _TextChangeCompressor { + constructor(prevEdits, currEdits) { + this._prevEdits = prevEdits; + this._currEdits = currEdits; + this._result = []; + this._resultLen = 0; + this._prevLen = this._prevEdits.length; + this._prevDeltaOffset = 0; + this._currLen = this._currEdits.length; + this._currDeltaOffset = 0; + } + compress() { + let prevIndex = 0; + let currIndex = 0; + let prevEdit = this._getPrev(prevIndex); + let currEdit = this._getCurr(currIndex); + while (prevIndex < this._prevLen || currIndex < this._currLen) { + if (prevEdit === null) { + this._acceptCurr(currEdit); + currEdit = this._getCurr(++currIndex); + continue; + } + if (currEdit === null) { + this._acceptPrev(prevEdit); + prevEdit = this._getPrev(++prevIndex); + continue; + } + if (currEdit.oldEnd <= prevEdit.newPosition) { + this._acceptCurr(currEdit); + currEdit = this._getCurr(++currIndex); + continue; + } + if (prevEdit.newEnd <= currEdit.oldPosition) { + this._acceptPrev(prevEdit); + prevEdit = this._getPrev(++prevIndex); + continue; + } + if (currEdit.oldPosition < prevEdit.newPosition) { + const [e1, e2] = _TextChangeCompressor._splitCurr(currEdit, prevEdit.newPosition - currEdit.oldPosition); + this._acceptCurr(e1); + currEdit = e2; + continue; + } + if (prevEdit.newPosition < currEdit.oldPosition) { + const [e1, e2] = _TextChangeCompressor._splitPrev(prevEdit, currEdit.oldPosition - prevEdit.newPosition); + this._acceptPrev(e1); + prevEdit = e2; + continue; + } + let mergePrev; + let mergeCurr; + if (currEdit.oldEnd === prevEdit.newEnd) { + mergePrev = prevEdit; + mergeCurr = currEdit; + prevEdit = this._getPrev(++prevIndex); + currEdit = this._getCurr(++currIndex); + } else if (currEdit.oldEnd < prevEdit.newEnd) { + const [e1, e2] = _TextChangeCompressor._splitPrev(prevEdit, currEdit.oldLength); + mergePrev = e1; + mergeCurr = currEdit; + prevEdit = e2; + currEdit = this._getCurr(++currIndex); + } else { + const [e1, e2] = _TextChangeCompressor._splitCurr(currEdit, prevEdit.newLength); + mergePrev = prevEdit; + mergeCurr = e1; + prevEdit = this._getPrev(++prevIndex); + currEdit = e2; + } + this._result[this._resultLen++] = new TextChange(mergePrev.oldPosition, mergePrev.oldText, mergeCurr.newPosition, mergeCurr.newText); + this._prevDeltaOffset += mergePrev.newLength - mergePrev.oldLength; + this._currDeltaOffset += mergeCurr.newLength - mergeCurr.oldLength; + } + const merged = _TextChangeCompressor._merge(this._result); + const cleaned = _TextChangeCompressor._removeNoOps(merged); + return cleaned; + } + _acceptCurr(currEdit) { + this._result[this._resultLen++] = _TextChangeCompressor._rebaseCurr(this._prevDeltaOffset, currEdit); + this._currDeltaOffset += currEdit.newLength - currEdit.oldLength; + } + _getCurr(currIndex) { + return currIndex < this._currLen ? this._currEdits[currIndex] : null; + } + _acceptPrev(prevEdit) { + this._result[this._resultLen++] = _TextChangeCompressor._rebasePrev(this._currDeltaOffset, prevEdit); + this._prevDeltaOffset += prevEdit.newLength - prevEdit.oldLength; + } + _getPrev(prevIndex) { + return prevIndex < this._prevLen ? this._prevEdits[prevIndex] : null; + } + static _rebaseCurr(prevDeltaOffset, currEdit) { + return new TextChange(currEdit.oldPosition - prevDeltaOffset, currEdit.oldText, currEdit.newPosition, currEdit.newText); + } + static _rebasePrev(currDeltaOffset, prevEdit) { + return new TextChange(prevEdit.oldPosition, prevEdit.oldText, prevEdit.newPosition + currDeltaOffset, prevEdit.newText); + } + static _splitPrev(edit, offset) { + const preText = edit.newText.substr(0, offset); + const postText = edit.newText.substr(offset); + return [ + new TextChange(edit.oldPosition, edit.oldText, edit.newPosition, preText), + new TextChange(edit.oldEnd, "", edit.newPosition + offset, postText) + ]; + } + static _splitCurr(edit, offset) { + const preText = edit.oldText.substr(0, offset); + const postText = edit.oldText.substr(offset); + return [ + new TextChange(edit.oldPosition, preText, edit.newPosition, edit.newText), + new TextChange(edit.oldPosition + offset, postText, edit.newEnd, "") + ]; + } + static _merge(edits) { + if (edits.length === 0) { + return edits; + } + const result = []; + let resultLen = 0; + let prev = edits[0]; + for (let i = 1; i < edits.length; i++) { + const curr = edits[i]; + if (prev.oldEnd === curr.oldPosition) { + prev = new TextChange(prev.oldPosition, prev.oldText + curr.oldText, prev.newPosition, prev.newText + curr.newText); + } else { + result[resultLen++] = prev; + prev = curr; + } + } + result[resultLen++] = prev; + return result; + } + static _removeNoOps(edits) { + if (edits.length === 0) { + return edits; + } + const result = []; + let resultLen = 0; + for (let i = 0; i < edits.length; i++) { + const edit = edits[i]; + if (edit.oldText === edit.newText) { + continue; + } + result[resultLen++] = edit; + } + return result; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/extpath.js +function isPathSeparator2(code) { + return code === 47 || code === 92; +} +function toSlashes(osPath) { + return osPath.replace(/[\\/]/g, posix.sep); +} +function toPosixPath(osPath) { + if (osPath.indexOf("/") === -1) { + osPath = toSlashes(osPath); + } + if (/^[a-zA-Z]:(\/|$)/.test(osPath)) { + osPath = "/" + osPath; + } + return osPath; +} +function getRoot(path, sep2 = posix.sep) { + if (!path) { + return ""; + } + const len = path.length; + const firstLetter = path.charCodeAt(0); + if (isPathSeparator2(firstLetter)) { + if (isPathSeparator2(path.charCodeAt(1))) { + if (!isPathSeparator2(path.charCodeAt(2))) { + let pos2 = 3; + const start = pos2; + for (; pos2 < len; pos2++) { + if (isPathSeparator2(path.charCodeAt(pos2))) { + break; + } + } + if (start !== pos2 && !isPathSeparator2(path.charCodeAt(pos2 + 1))) { + pos2 += 1; + for (; pos2 < len; pos2++) { + if (isPathSeparator2(path.charCodeAt(pos2))) { + return path.slice(0, pos2 + 1).replace(/[\\/]/g, sep2); + } + } + } + } + } + return sep2; + } else if (isWindowsDriveLetter(firstLetter)) { + if (path.charCodeAt(1) === 58) { + if (isPathSeparator2(path.charCodeAt(2))) { + return path.slice(0, 2) + sep2; + } else { + return path.slice(0, 2); + } + } + } + let pos = path.indexOf("://"); + if (pos !== -1) { + pos += 3; + for (; pos < len; pos++) { + if (isPathSeparator2(path.charCodeAt(pos))) { + return path.slice(0, pos + 1); + } + } + } + return ""; +} +function isEqualOrParent(base, parentCandidate, ignoreCase, separator = sep) { + if (base === parentCandidate) { + return true; + } + if (!base || !parentCandidate) { + return false; + } + if (parentCandidate.length > base.length) { + return false; + } + if (ignoreCase) { + const beginsWith = startsWithIgnoreCase(base, parentCandidate); + if (!beginsWith) { + return false; + } + if (parentCandidate.length === base.length) { + return true; + } + let sepOffset = parentCandidate.length; + if (parentCandidate.charAt(parentCandidate.length - 1) === separator) { + sepOffset--; + } + return base.charAt(sepOffset) === separator; + } + if (parentCandidate.charAt(parentCandidate.length - 1) !== separator) { + parentCandidate += separator; + } + return base.indexOf(parentCandidate) === 0; +} +function isWindowsDriveLetter(char0) { + return char0 >= 65 && char0 <= 90 || char0 >= 97 && char0 <= 122; +} +function hasDriveLetter(path, isWindowsOS = isWindows) { + if (isWindowsOS) { + return isWindowsDriveLetter(path.charCodeAt(0)) && path.charCodeAt(1) === 58; + } + return false; +} +var init_extpath = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/extpath.js"() { + init_path(); + init_platform(); + init_strings(); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/resources.js +function originalFSPath(uri) { + return uriToFsPath(uri, true); +} +var ExtUri, extUri, extUriBiasedIgnorePathCase, extUriIgnorePathCase, isEqual, isEqualOrParent2, getComparisonKey, basenameOrAuthority, basename2, extname2, dirname2, joinPath, normalizePath, relativePath, resolvePath, isAbsolutePath, isEqualAuthority, hasTrailingPathSeparator, removeTrailingPathSeparator, addTrailingPathSeparator, DataUri; +var init_resources = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/resources.js"() { + init_extpath(); + init_network(); + init_path(); + init_platform(); + init_strings(); + init_uri(); + ExtUri = class { + constructor(_ignorePathCasing) { + this._ignorePathCasing = _ignorePathCasing; + } + compare(uri1, uri2, ignoreFragment = false) { + if (uri1 === uri2) { + return 0; + } + return compare(this.getComparisonKey(uri1, ignoreFragment), this.getComparisonKey(uri2, ignoreFragment)); + } + isEqual(uri1, uri2, ignoreFragment = false) { + if (uri1 === uri2) { + return true; + } + if (!uri1 || !uri2) { + return false; + } + return this.getComparisonKey(uri1, ignoreFragment) === this.getComparisonKey(uri2, ignoreFragment); + } + getComparisonKey(uri, ignoreFragment = false) { + return uri.with({ + path: this._ignorePathCasing(uri) ? uri.path.toLowerCase() : void 0, + fragment: ignoreFragment ? null : void 0 + }).toString(); + } + isEqualOrParent(base, parentCandidate, ignoreFragment = false) { + if (base.scheme === parentCandidate.scheme) { + if (base.scheme === Schemas.file) { + return isEqualOrParent(originalFSPath(base), originalFSPath(parentCandidate), this._ignorePathCasing(base)) && base.query === parentCandidate.query && (ignoreFragment || base.fragment === parentCandidate.fragment); + } + if (isEqualAuthority(base.authority, parentCandidate.authority)) { + return isEqualOrParent(base.path, parentCandidate.path, this._ignorePathCasing(base), "/") && base.query === parentCandidate.query && (ignoreFragment || base.fragment === parentCandidate.fragment); + } + } + return false; + } + // --- path math + joinPath(resource, ...pathFragment) { + return URI.joinPath(resource, ...pathFragment); + } + basenameOrAuthority(resource) { + return basename2(resource) || resource.authority; + } + basename(resource) { + return posix.basename(resource.path); + } + extname(resource) { + return posix.extname(resource.path); + } + dirname(resource) { + if (resource.path.length === 0) { + return resource; + } + let dirname4; + if (resource.scheme === Schemas.file) { + dirname4 = URI.file(dirname(originalFSPath(resource))).path; + } else { + dirname4 = posix.dirname(resource.path); + if (resource.authority && dirname4.length && dirname4.charCodeAt(0) !== 47) { + console.error(`dirname("${resource.toString})) resulted in a relative path`); + dirname4 = "/"; + } + } + return resource.with({ + path: dirname4 + }); + } + normalizePath(resource) { + if (!resource.path.length) { + return resource; + } + let normalizedPath; + if (resource.scheme === Schemas.file) { + normalizedPath = URI.file(normalize(originalFSPath(resource))).path; + } else { + normalizedPath = posix.normalize(resource.path); + } + return resource.with({ + path: normalizedPath + }); + } + relativePath(from, to) { + if (from.scheme !== to.scheme || !isEqualAuthority(from.authority, to.authority)) { + return void 0; + } + if (from.scheme === Schemas.file) { + const relativePath2 = relative(originalFSPath(from), originalFSPath(to)); + return isWindows ? toSlashes(relativePath2) : relativePath2; + } + let fromPath = from.path || "/"; + const toPath = to.path || "/"; + if (this._ignorePathCasing(from)) { + let i = 0; + for (const len = Math.min(fromPath.length, toPath.length); i < len; i++) { + if (fromPath.charCodeAt(i) !== toPath.charCodeAt(i)) { + if (fromPath.charAt(i).toLowerCase() !== toPath.charAt(i).toLowerCase()) { + break; + } + } + } + fromPath = toPath.substr(0, i) + fromPath.substr(i); + } + return posix.relative(fromPath, toPath); + } + resolvePath(base, path) { + if (base.scheme === Schemas.file) { + const newURI = URI.file(resolve(originalFSPath(base), path)); + return base.with({ + authority: newURI.authority, + path: newURI.path + }); + } + path = toPosixPath(path); + return base.with({ + path: posix.resolve(base.path, path) + }); + } + // --- misc + isAbsolutePath(resource) { + return !!resource.path && resource.path[0] === "/"; + } + isEqualAuthority(a1, a22) { + return a1 === a22 || a1 !== void 0 && a22 !== void 0 && equalsIgnoreCase(a1, a22); + } + hasTrailingPathSeparator(resource, sep2 = sep) { + if (resource.scheme === Schemas.file) { + const fsp = originalFSPath(resource); + return fsp.length > getRoot(fsp).length && fsp[fsp.length - 1] === sep2; + } else { + const p = resource.path; + return p.length > 1 && p.charCodeAt(p.length - 1) === 47 && !/^[a-zA-Z]:(\/$|\\$)/.test(resource.fsPath); + } + } + removeTrailingPathSeparator(resource, sep2 = sep) { + if (hasTrailingPathSeparator(resource, sep2)) { + return resource.with({ path: resource.path.substr(0, resource.path.length - 1) }); + } + return resource; + } + addTrailingPathSeparator(resource, sep2 = sep) { + let isRootSep = false; + if (resource.scheme === Schemas.file) { + const fsp = originalFSPath(resource); + isRootSep = fsp !== void 0 && fsp.length === getRoot(fsp).length && fsp[fsp.length - 1] === sep2; + } else { + sep2 = "/"; + const p = resource.path; + isRootSep = p.length === 1 && p.charCodeAt(p.length - 1) === 47; + } + if (!isRootSep && !hasTrailingPathSeparator(resource, sep2)) { + return resource.with({ path: resource.path + "/" }); + } + return resource; + } + }; + extUri = new ExtUri(() => false); + extUriBiasedIgnorePathCase = new ExtUri((uri) => { + return uri.scheme === Schemas.file ? !isLinux : true; + }); + extUriIgnorePathCase = new ExtUri((_) => true); + isEqual = extUri.isEqual.bind(extUri); + isEqualOrParent2 = extUri.isEqualOrParent.bind(extUri); + getComparisonKey = extUri.getComparisonKey.bind(extUri); + basenameOrAuthority = extUri.basenameOrAuthority.bind(extUri); + basename2 = extUri.basename.bind(extUri); + extname2 = extUri.extname.bind(extUri); + dirname2 = extUri.dirname.bind(extUri); + joinPath = extUri.joinPath.bind(extUri); + normalizePath = extUri.normalizePath.bind(extUri); + relativePath = extUri.relativePath.bind(extUri); + resolvePath = extUri.resolvePath.bind(extUri); + isAbsolutePath = extUri.isAbsolutePath.bind(extUri); + isEqualAuthority = extUri.isEqualAuthority.bind(extUri); + hasTrailingPathSeparator = extUri.hasTrailingPathSeparator.bind(extUri); + removeTrailingPathSeparator = extUri.removeTrailingPathSeparator.bind(extUri); + addTrailingPathSeparator = extUri.addTrailingPathSeparator.bind(extUri); + (function(DataUri2) { + DataUri2.META_DATA_LABEL = "label"; + DataUri2.META_DATA_DESCRIPTION = "description"; + DataUri2.META_DATA_SIZE = "size"; + DataUri2.META_DATA_MIME = "mime"; + function parseMetaData(dataUri) { + const metadata = /* @__PURE__ */ new Map(); + const meta = dataUri.path.substring(dataUri.path.indexOf(";") + 1, dataUri.path.lastIndexOf(";")); + meta.split(";").forEach((property) => { + const [key, value] = property.split(":"); + if (key && value) { + metadata.set(key, value); + } + }); + const mime = dataUri.path.substring(0, dataUri.path.indexOf(";")); + if (mime) { + metadata.set(DataUri2.META_DATA_MIME, mime); + } + return metadata; + } + DataUri2.parseMetaData = parseMetaData; + })(DataUri || (DataUri = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/editStack.js +function uriGetComparisonKey(resource) { + return resource.toString(); +} +function getModelEOL(model) { + const eol = model.getEOL(); + if (eol === "\n") { + return 0; + } else { + return 1; + } +} +function isEditStackElement(element) { + if (!element) { + return false; + } + return element instanceof SingleModelEditStackElement || element instanceof MultiModelEditStackElement; +} +var SingleModelEditStackData, SingleModelEditStackElement, MultiModelEditStackElement, EditStack; +var init_editStack = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/editStack.js"() { + init_nls(); + init_errors(); + init_selection(); + init_uri(); + init_textChange(); + init_buffer(); + init_resources(); + SingleModelEditStackData = class _SingleModelEditStackData { + static create(model, beforeCursorState) { + const alternativeVersionId = model.getAlternativeVersionId(); + const eol = getModelEOL(model); + return new _SingleModelEditStackData(alternativeVersionId, alternativeVersionId, eol, eol, beforeCursorState, beforeCursorState, []); + } + constructor(beforeVersionId, afterVersionId, beforeEOL, afterEOL, beforeCursorState, afterCursorState, changes) { + this.beforeVersionId = beforeVersionId; + this.afterVersionId = afterVersionId; + this.beforeEOL = beforeEOL; + this.afterEOL = afterEOL; + this.beforeCursorState = beforeCursorState; + this.afterCursorState = afterCursorState; + this.changes = changes; + } + append(model, textChanges, afterEOL, afterVersionId, afterCursorState) { + if (textChanges.length > 0) { + this.changes = compressConsecutiveTextChanges(this.changes, textChanges); + } + this.afterEOL = afterEOL; + this.afterVersionId = afterVersionId; + this.afterCursorState = afterCursorState; + } + static _writeSelectionsSize(selections) { + return 4 + 4 * 4 * (selections ? selections.length : 0); + } + static _writeSelections(b, selections, offset) { + writeUInt32BE(b, selections ? selections.length : 0, offset); + offset += 4; + if (selections) { + for (const selection of selections) { + writeUInt32BE(b, selection.selectionStartLineNumber, offset); + offset += 4; + writeUInt32BE(b, selection.selectionStartColumn, offset); + offset += 4; + writeUInt32BE(b, selection.positionLineNumber, offset); + offset += 4; + writeUInt32BE(b, selection.positionColumn, offset); + offset += 4; + } + } + return offset; + } + static _readSelections(b, offset, dest) { + const count = readUInt32BE(b, offset); + offset += 4; + for (let i = 0; i < count; i++) { + const selectionStartLineNumber = readUInt32BE(b, offset); + offset += 4; + const selectionStartColumn = readUInt32BE(b, offset); + offset += 4; + const positionLineNumber = readUInt32BE(b, offset); + offset += 4; + const positionColumn = readUInt32BE(b, offset); + offset += 4; + dest.push(new Selection(selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn)); + } + return offset; + } + serialize() { + let necessarySize = 4 + 4 + 1 + 1 + _SingleModelEditStackData._writeSelectionsSize(this.beforeCursorState) + _SingleModelEditStackData._writeSelectionsSize(this.afterCursorState) + 4; + for (const change of this.changes) { + necessarySize += change.writeSize(); + } + const b = new Uint8Array(necessarySize); + let offset = 0; + writeUInt32BE(b, this.beforeVersionId, offset); + offset += 4; + writeUInt32BE(b, this.afterVersionId, offset); + offset += 4; + writeUInt8(b, this.beforeEOL, offset); + offset += 1; + writeUInt8(b, this.afterEOL, offset); + offset += 1; + offset = _SingleModelEditStackData._writeSelections(b, this.beforeCursorState, offset); + offset = _SingleModelEditStackData._writeSelections(b, this.afterCursorState, offset); + writeUInt32BE(b, this.changes.length, offset); + offset += 4; + for (const change of this.changes) { + offset = change.write(b, offset); + } + return b.buffer; + } + static deserialize(source) { + const b = new Uint8Array(source); + let offset = 0; + const beforeVersionId = readUInt32BE(b, offset); + offset += 4; + const afterVersionId = readUInt32BE(b, offset); + offset += 4; + const beforeEOL = readUInt8(b, offset); + offset += 1; + const afterEOL = readUInt8(b, offset); + offset += 1; + const beforeCursorState = []; + offset = _SingleModelEditStackData._readSelections(b, offset, beforeCursorState); + const afterCursorState = []; + offset = _SingleModelEditStackData._readSelections(b, offset, afterCursorState); + const changeCount = readUInt32BE(b, offset); + offset += 4; + const changes = []; + for (let i = 0; i < changeCount; i++) { + offset = TextChange.read(b, offset, changes); + } + return new _SingleModelEditStackData(beforeVersionId, afterVersionId, beforeEOL, afterEOL, beforeCursorState, afterCursorState, changes); + } + }; + SingleModelEditStackElement = class { + get type() { + return 0; + } + get resource() { + if (URI.isUri(this.model)) { + return this.model; + } + return this.model.uri; + } + constructor(label, code, model, beforeCursorState) { + this.label = label; + this.code = code; + this.model = model; + this._data = SingleModelEditStackData.create(model, beforeCursorState); + } + toString() { + const data = this._data instanceof SingleModelEditStackData ? this._data : SingleModelEditStackData.deserialize(this._data); + return data.changes.map((change) => change.toString()).join(", "); + } + matchesResource(resource) { + const uri = URI.isUri(this.model) ? this.model : this.model.uri; + return uri.toString() === resource.toString(); + } + setModel(model) { + this.model = model; + } + canAppend(model) { + return this.model === model && this._data instanceof SingleModelEditStackData; + } + append(model, textChanges, afterEOL, afterVersionId, afterCursorState) { + if (this._data instanceof SingleModelEditStackData) { + this._data.append(model, textChanges, afterEOL, afterVersionId, afterCursorState); + } + } + close() { + if (this._data instanceof SingleModelEditStackData) { + this._data = this._data.serialize(); + } + } + open() { + if (!(this._data instanceof SingleModelEditStackData)) { + this._data = SingleModelEditStackData.deserialize(this._data); + } + } + undo() { + if (URI.isUri(this.model)) { + throw new Error(`Invalid SingleModelEditStackElement`); + } + if (this._data instanceof SingleModelEditStackData) { + this._data = this._data.serialize(); + } + const data = SingleModelEditStackData.deserialize(this._data); + this.model._applyUndo(data.changes, data.beforeEOL, data.beforeVersionId, data.beforeCursorState); + } + redo() { + if (URI.isUri(this.model)) { + throw new Error(`Invalid SingleModelEditStackElement`); + } + if (this._data instanceof SingleModelEditStackData) { + this._data = this._data.serialize(); + } + const data = SingleModelEditStackData.deserialize(this._data); + this.model._applyRedo(data.changes, data.afterEOL, data.afterVersionId, data.afterCursorState); + } + heapSize() { + if (this._data instanceof SingleModelEditStackData) { + this._data = this._data.serialize(); + } + return this._data.byteLength + 168; + } + }; + MultiModelEditStackElement = class { + get resources() { + return this._editStackElementsArr.map((editStackElement) => editStackElement.resource); + } + constructor(label, code, editStackElements) { + this.label = label; + this.code = code; + this.type = 1; + this._isOpen = true; + this._editStackElementsArr = editStackElements.slice(0); + this._editStackElementsMap = /* @__PURE__ */ new Map(); + for (const editStackElement of this._editStackElementsArr) { + const key = uriGetComparisonKey(editStackElement.resource); + this._editStackElementsMap.set(key, editStackElement); + } + this._delegate = null; + } + prepareUndoRedo() { + if (this._delegate) { + return this._delegate.prepareUndoRedo(this); + } + } + matchesResource(resource) { + const key = uriGetComparisonKey(resource); + return this._editStackElementsMap.has(key); + } + setModel(model) { + const key = uriGetComparisonKey(URI.isUri(model) ? model : model.uri); + if (this._editStackElementsMap.has(key)) { + this._editStackElementsMap.get(key).setModel(model); + } + } + canAppend(model) { + if (!this._isOpen) { + return false; + } + const key = uriGetComparisonKey(model.uri); + if (this._editStackElementsMap.has(key)) { + const editStackElement = this._editStackElementsMap.get(key); + return editStackElement.canAppend(model); + } + return false; + } + append(model, textChanges, afterEOL, afterVersionId, afterCursorState) { + const key = uriGetComparisonKey(model.uri); + const editStackElement = this._editStackElementsMap.get(key); + editStackElement.append(model, textChanges, afterEOL, afterVersionId, afterCursorState); + } + close() { + this._isOpen = false; + } + open() { + } + undo() { + this._isOpen = false; + for (const editStackElement of this._editStackElementsArr) { + editStackElement.undo(); + } + } + redo() { + for (const editStackElement of this._editStackElementsArr) { + editStackElement.redo(); + } + } + heapSize(resource) { + const key = uriGetComparisonKey(resource); + if (this._editStackElementsMap.has(key)) { + const editStackElement = this._editStackElementsMap.get(key); + return editStackElement.heapSize(); + } + return 0; + } + split() { + return this._editStackElementsArr; + } + toString() { + const result = []; + for (const editStackElement of this._editStackElementsArr) { + result.push(`${basename2(editStackElement.resource)}: ${editStackElement}`); + } + return `{${result.join(", ")}}`; + } + }; + EditStack = class _EditStack { + constructor(model, undoRedoService) { + this._model = model; + this._undoRedoService = undoRedoService; + } + pushStackElement() { + const lastElement = this._undoRedoService.getLastElement(this._model.uri); + if (isEditStackElement(lastElement)) { + lastElement.close(); + } + } + popStackElement() { + const lastElement = this._undoRedoService.getLastElement(this._model.uri); + if (isEditStackElement(lastElement)) { + lastElement.open(); + } + } + clear() { + this._undoRedoService.removeElements(this._model.uri); + } + _getOrCreateEditStackElement(beforeCursorState, group) { + const lastElement = this._undoRedoService.getLastElement(this._model.uri); + if (isEditStackElement(lastElement) && lastElement.canAppend(this._model)) { + return lastElement; + } + const newElement = new SingleModelEditStackElement(localize("edit", "Typing"), "undoredo.textBufferEdit", this._model, beforeCursorState); + this._undoRedoService.pushElement(newElement, group); + return newElement; + } + pushEOL(eol) { + const editStackElement = this._getOrCreateEditStackElement(null, void 0); + this._model.setEOL(eol); + editStackElement.append(this._model, [], getModelEOL(this._model), this._model.getAlternativeVersionId(), null); + } + pushEditOperation(beforeCursorState, editOperations, cursorStateComputer, group) { + const editStackElement = this._getOrCreateEditStackElement(beforeCursorState, group); + const inverseEditOperations = this._model.applyEdits(editOperations, true); + const afterCursorState = _EditStack._computeCursorState(cursorStateComputer, inverseEditOperations); + const textChanges = inverseEditOperations.map((op, index) => ({ index, textChange: op.textChange })); + textChanges.sort((a3, b) => { + if (a3.textChange.oldPosition === b.textChange.oldPosition) { + return a3.index - b.index; + } + return a3.textChange.oldPosition - b.textChange.oldPosition; + }); + editStackElement.append(this._model, textChanges.map((op) => op.textChange), getModelEOL(this._model), this._model.getAlternativeVersionId(), afterCursorState); + return afterCursorState; + } + static _computeCursorState(cursorStateComputer, inverseEditOperations) { + try { + return cursorStateComputer ? cursorStateComputer(inverseEditOperations) : null; + } catch (e) { + onUnexpectedError(e); + return null; + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/indentationGuesser.js +function spacesDiff(a3, aLength, b, bLength, result) { + result.spacesDiff = 0; + result.looksLikeAlignment = false; + let i; + for (i = 0; i < aLength && i < bLength; i++) { + const aCharCode = a3.charCodeAt(i); + const bCharCode = b.charCodeAt(i); + if (aCharCode !== bCharCode) { + break; + } + } + let aSpacesCnt = 0, aTabsCount = 0; + for (let j = i; j < aLength; j++) { + const aCharCode = a3.charCodeAt(j); + if (aCharCode === 32) { + aSpacesCnt++; + } else { + aTabsCount++; + } + } + let bSpacesCnt = 0, bTabsCount = 0; + for (let j = i; j < bLength; j++) { + const bCharCode = b.charCodeAt(j); + if (bCharCode === 32) { + bSpacesCnt++; + } else { + bTabsCount++; + } + } + if (aSpacesCnt > 0 && aTabsCount > 0) { + return; + } + if (bSpacesCnt > 0 && bTabsCount > 0) { + return; + } + const tabsDiff = Math.abs(aTabsCount - bTabsCount); + const spacesDiff2 = Math.abs(aSpacesCnt - bSpacesCnt); + if (tabsDiff === 0) { + result.spacesDiff = spacesDiff2; + if (spacesDiff2 > 0 && 0 <= bSpacesCnt - 1 && bSpacesCnt - 1 < a3.length && bSpacesCnt < b.length) { + if (b.charCodeAt(bSpacesCnt) !== 32 && a3.charCodeAt(bSpacesCnt - 1) === 32) { + if (a3.charCodeAt(a3.length - 1) === 44) { + result.looksLikeAlignment = true; + } + } + } + return; + } + if (spacesDiff2 % tabsDiff === 0) { + result.spacesDiff = spacesDiff2 / tabsDiff; + return; + } +} +function guessIndentation(source, defaultTabSize, defaultInsertSpaces) { + const linesCount = Math.min(source.getLineCount(), 1e4); + let linesIndentedWithTabsCount = 0; + let linesIndentedWithSpacesCount = 0; + let previousLineText = ""; + let previousLineIndentation = 0; + const ALLOWED_TAB_SIZE_GUESSES = [2, 4, 6, 8, 3, 5, 7]; + const MAX_ALLOWED_TAB_SIZE_GUESS = 8; + const spacesDiffCount = [0, 0, 0, 0, 0, 0, 0, 0, 0]; + const tmp = new SpacesDiffResult(); + for (let lineNumber = 1; lineNumber <= linesCount; lineNumber++) { + const currentLineLength = source.getLineLength(lineNumber); + const currentLineText = source.getLineContent(lineNumber); + const useCurrentLineText = currentLineLength <= 65536; + let currentLineHasContent = false; + let currentLineIndentation = 0; + let currentLineSpacesCount = 0; + let currentLineTabsCount = 0; + for (let j = 0, lenJ = currentLineLength; j < lenJ; j++) { + const charCode = useCurrentLineText ? currentLineText.charCodeAt(j) : source.getLineCharCode(lineNumber, j); + if (charCode === 9) { + currentLineTabsCount++; + } else if (charCode === 32) { + currentLineSpacesCount++; + } else { + currentLineHasContent = true; + currentLineIndentation = j; + break; + } + } + if (!currentLineHasContent) { + continue; + } + if (currentLineTabsCount > 0) { + linesIndentedWithTabsCount++; + } else if (currentLineSpacesCount > 1) { + linesIndentedWithSpacesCount++; + } + spacesDiff(previousLineText, previousLineIndentation, currentLineText, currentLineIndentation, tmp); + if (tmp.looksLikeAlignment) { + if (!(defaultInsertSpaces && defaultTabSize === tmp.spacesDiff)) { + continue; + } + } + const currentSpacesDiff = tmp.spacesDiff; + if (currentSpacesDiff <= MAX_ALLOWED_TAB_SIZE_GUESS) { + spacesDiffCount[currentSpacesDiff]++; + } + previousLineText = currentLineText; + previousLineIndentation = currentLineIndentation; + } + let insertSpaces = defaultInsertSpaces; + if (linesIndentedWithTabsCount !== linesIndentedWithSpacesCount) { + insertSpaces = linesIndentedWithTabsCount < linesIndentedWithSpacesCount; + } + let tabSize = defaultTabSize; + if (insertSpaces) { + let tabSizeScore = insertSpaces ? 0 : 0.1 * linesCount; + ALLOWED_TAB_SIZE_GUESSES.forEach((possibleTabSize) => { + const possibleTabSizeScore = spacesDiffCount[possibleTabSize]; + if (possibleTabSizeScore > tabSizeScore) { + tabSizeScore = possibleTabSizeScore; + tabSize = possibleTabSize; + } + }); + if (tabSize === 4 && spacesDiffCount[4] > 0 && spacesDiffCount[2] > 0 && spacesDiffCount[2] >= spacesDiffCount[4] / 2) { + tabSize = 2; + } + } + return { + insertSpaces, + tabSize + }; +} +var SpacesDiffResult; +var init_indentationGuesser = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/indentationGuesser.js"() { + SpacesDiffResult = class { + constructor() { + this.spacesDiff = 0; + this.looksLikeAlignment = false; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/intervalTree.js +function getNodeColor(node) { + return (node.metadata & 1) >>> 0; +} +function setNodeColor(node, color) { + node.metadata = node.metadata & 254 | color << 0; +} +function getNodeIsVisited(node) { + return (node.metadata & 2) >>> 1 === 1; +} +function setNodeIsVisited(node, value) { + node.metadata = node.metadata & 253 | (value ? 1 : 0) << 1; +} +function getNodeIsForValidation(node) { + return (node.metadata & 4) >>> 2 === 1; +} +function setNodeIsForValidation(node, value) { + node.metadata = node.metadata & 251 | (value ? 1 : 0) << 2; +} +function getNodeIsInGlyphMargin(node) { + return (node.metadata & 64) >>> 6 === 1; +} +function setNodeIsInGlyphMargin(node, value) { + node.metadata = node.metadata & 191 | (value ? 1 : 0) << 6; +} +function getNodeStickiness(node) { + return (node.metadata & 24) >>> 3; +} +function _setNodeStickiness(node, stickiness) { + node.metadata = node.metadata & 231 | stickiness << 3; +} +function getCollapseOnReplaceEdit(node) { + return (node.metadata & 32) >>> 5 === 1; +} +function setCollapseOnReplaceEdit(node, value) { + node.metadata = node.metadata & 223 | (value ? 1 : 0) << 5; +} +function normalizeDelta(T) { + let node = T.root; + let delta = 0; + while (node !== SENTINEL) { + if (node.left !== SENTINEL && !getNodeIsVisited(node.left)) { + node = node.left; + continue; + } + if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) { + delta += node.delta; + node = node.right; + continue; + } + node.start = delta + node.start; + node.end = delta + node.end; + node.delta = 0; + recomputeMaxEnd(node); + setNodeIsVisited(node, true); + setNodeIsVisited(node.left, false); + setNodeIsVisited(node.right, false); + if (node === node.parent.right) { + delta -= node.parent.delta; + } + node = node.parent; + } + setNodeIsVisited(T.root, false); +} +function adjustMarkerBeforeColumn(markerOffset, markerStickToPreviousCharacter, checkOffset, moveSemantics) { + if (markerOffset < checkOffset) { + return true; + } + if (markerOffset > checkOffset) { + return false; + } + if (moveSemantics === 1) { + return false; + } + if (moveSemantics === 2) { + return true; + } + return markerStickToPreviousCharacter; +} +function nodeAcceptEdit(node, start, end, textLength, forceMoveMarkers) { + const nodeStickiness = getNodeStickiness(node); + const startStickToPreviousCharacter = nodeStickiness === 0 || nodeStickiness === 2; + const endStickToPreviousCharacter = nodeStickiness === 1 || nodeStickiness === 2; + const deletingCnt = end - start; + const insertingCnt = textLength; + const commonLength = Math.min(deletingCnt, insertingCnt); + const nodeStart = node.start; + let startDone = false; + const nodeEnd = node.end; + let endDone = false; + if (start <= nodeStart && nodeEnd <= end && getCollapseOnReplaceEdit(node)) { + node.start = start; + startDone = true; + node.end = start; + endDone = true; + } + { + const moveSemantics = forceMoveMarkers ? 1 : deletingCnt > 0 ? 2 : 0; + if (!startDone && adjustMarkerBeforeColumn(nodeStart, startStickToPreviousCharacter, start, moveSemantics)) { + startDone = true; + } + if (!endDone && adjustMarkerBeforeColumn(nodeEnd, endStickToPreviousCharacter, start, moveSemantics)) { + endDone = true; + } + } + if (commonLength > 0 && !forceMoveMarkers) { + const moveSemantics = deletingCnt > insertingCnt ? 2 : 0; + if (!startDone && adjustMarkerBeforeColumn(nodeStart, startStickToPreviousCharacter, start + commonLength, moveSemantics)) { + startDone = true; + } + if (!endDone && adjustMarkerBeforeColumn(nodeEnd, endStickToPreviousCharacter, start + commonLength, moveSemantics)) { + endDone = true; + } + } + { + const moveSemantics = forceMoveMarkers ? 1 : 0; + if (!startDone && adjustMarkerBeforeColumn(nodeStart, startStickToPreviousCharacter, end, moveSemantics)) { + node.start = start + insertingCnt; + startDone = true; + } + if (!endDone && adjustMarkerBeforeColumn(nodeEnd, endStickToPreviousCharacter, end, moveSemantics)) { + node.end = start + insertingCnt; + endDone = true; + } + } + const deltaColumn = insertingCnt - deletingCnt; + if (!startDone) { + node.start = Math.max(0, nodeStart + deltaColumn); + } + if (!endDone) { + node.end = Math.max(0, nodeEnd + deltaColumn); + } + if (node.start > node.end) { + node.end = node.start; + } +} +function searchForEditing(T, start, end) { + let node = T.root; + let delta = 0; + let nodeMaxEnd = 0; + let nodeStart = 0; + let nodeEnd = 0; + const result = []; + let resultLen = 0; + while (node !== SENTINEL) { + if (getNodeIsVisited(node)) { + setNodeIsVisited(node.left, false); + setNodeIsVisited(node.right, false); + if (node === node.parent.right) { + delta -= node.parent.delta; + } + node = node.parent; + continue; + } + if (!getNodeIsVisited(node.left)) { + nodeMaxEnd = delta + node.maxEnd; + if (nodeMaxEnd < start) { + setNodeIsVisited(node, true); + continue; + } + if (node.left !== SENTINEL) { + node = node.left; + continue; + } + } + nodeStart = delta + node.start; + if (nodeStart > end) { + setNodeIsVisited(node, true); + continue; + } + nodeEnd = delta + node.end; + if (nodeEnd >= start) { + node.setCachedOffsets(nodeStart, nodeEnd, 0); + result[resultLen++] = node; + } + setNodeIsVisited(node, true); + if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) { + delta += node.delta; + node = node.right; + continue; + } + } + setNodeIsVisited(T.root, false); + return result; +} +function noOverlapReplace(T, start, end, textLength) { + let node = T.root; + let delta = 0; + let nodeMaxEnd = 0; + let nodeStart = 0; + const editDelta = textLength - (end - start); + while (node !== SENTINEL) { + if (getNodeIsVisited(node)) { + setNodeIsVisited(node.left, false); + setNodeIsVisited(node.right, false); + if (node === node.parent.right) { + delta -= node.parent.delta; + } + recomputeMaxEnd(node); + node = node.parent; + continue; + } + if (!getNodeIsVisited(node.left)) { + nodeMaxEnd = delta + node.maxEnd; + if (nodeMaxEnd < start) { + setNodeIsVisited(node, true); + continue; + } + if (node.left !== SENTINEL) { + node = node.left; + continue; + } + } + nodeStart = delta + node.start; + if (nodeStart > end) { + node.start += editDelta; + node.end += editDelta; + node.delta += editDelta; + if (node.delta < -1073741824 || node.delta > 1073741824) { + T.requestNormalizeDelta = true; + } + setNodeIsVisited(node, true); + continue; + } + setNodeIsVisited(node, true); + if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) { + delta += node.delta; + node = node.right; + continue; + } + } + setNodeIsVisited(T.root, false); +} +function collectNodesFromOwner(T, ownerId2) { + let node = T.root; + const result = []; + let resultLen = 0; + while (node !== SENTINEL) { + if (getNodeIsVisited(node)) { + setNodeIsVisited(node.left, false); + setNodeIsVisited(node.right, false); + node = node.parent; + continue; + } + if (node.left !== SENTINEL && !getNodeIsVisited(node.left)) { + node = node.left; + continue; + } + if (node.ownerId === ownerId2) { + result[resultLen++] = node; + } + setNodeIsVisited(node, true); + if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) { + node = node.right; + continue; + } + } + setNodeIsVisited(T.root, false); + return result; +} +function collectNodesPostOrder(T) { + let node = T.root; + const result = []; + let resultLen = 0; + while (node !== SENTINEL) { + if (getNodeIsVisited(node)) { + setNodeIsVisited(node.left, false); + setNodeIsVisited(node.right, false); + node = node.parent; + continue; + } + if (node.left !== SENTINEL && !getNodeIsVisited(node.left)) { + node = node.left; + continue; + } + if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) { + node = node.right; + continue; + } + result[resultLen++] = node; + setNodeIsVisited(node, true); + } + setNodeIsVisited(T.root, false); + return result; +} +function search(T, filterOwnerId, filterOutValidation, cachedVersionId, onlyMarginDecorations) { + let node = T.root; + let delta = 0; + let nodeStart = 0; + let nodeEnd = 0; + const result = []; + let resultLen = 0; + while (node !== SENTINEL) { + if (getNodeIsVisited(node)) { + setNodeIsVisited(node.left, false); + setNodeIsVisited(node.right, false); + if (node === node.parent.right) { + delta -= node.parent.delta; + } + node = node.parent; + continue; + } + if (node.left !== SENTINEL && !getNodeIsVisited(node.left)) { + node = node.left; + continue; + } + nodeStart = delta + node.start; + nodeEnd = delta + node.end; + node.setCachedOffsets(nodeStart, nodeEnd, cachedVersionId); + let include = true; + if (filterOwnerId && node.ownerId && node.ownerId !== filterOwnerId) { + include = false; + } + if (filterOutValidation && getNodeIsForValidation(node)) { + include = false; + } + if (onlyMarginDecorations && !getNodeIsInGlyphMargin(node)) { + include = false; + } + if (include) { + result[resultLen++] = node; + } + setNodeIsVisited(node, true); + if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) { + delta += node.delta; + node = node.right; + continue; + } + } + setNodeIsVisited(T.root, false); + return result; +} +function intervalSearch(T, intervalStart, intervalEnd, filterOwnerId, filterOutValidation, cachedVersionId, onlyMarginDecorations) { + let node = T.root; + let delta = 0; + let nodeMaxEnd = 0; + let nodeStart = 0; + let nodeEnd = 0; + const result = []; + let resultLen = 0; + while (node !== SENTINEL) { + if (getNodeIsVisited(node)) { + setNodeIsVisited(node.left, false); + setNodeIsVisited(node.right, false); + if (node === node.parent.right) { + delta -= node.parent.delta; + } + node = node.parent; + continue; + } + if (!getNodeIsVisited(node.left)) { + nodeMaxEnd = delta + node.maxEnd; + if (nodeMaxEnd < intervalStart) { + setNodeIsVisited(node, true); + continue; + } + if (node.left !== SENTINEL) { + node = node.left; + continue; + } + } + nodeStart = delta + node.start; + if (nodeStart > intervalEnd) { + setNodeIsVisited(node, true); + continue; + } + nodeEnd = delta + node.end; + if (nodeEnd >= intervalStart) { + node.setCachedOffsets(nodeStart, nodeEnd, cachedVersionId); + let include = true; + if (filterOwnerId && node.ownerId && node.ownerId !== filterOwnerId) { + include = false; + } + if (filterOutValidation && getNodeIsForValidation(node)) { + include = false; + } + if (onlyMarginDecorations && !getNodeIsInGlyphMargin(node)) { + include = false; + } + if (include) { + result[resultLen++] = node; + } + } + setNodeIsVisited(node, true); + if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) { + delta += node.delta; + node = node.right; + continue; + } + } + setNodeIsVisited(T.root, false); + return result; +} +function rbTreeInsert(T, newNode) { + if (T.root === SENTINEL) { + newNode.parent = SENTINEL; + newNode.left = SENTINEL; + newNode.right = SENTINEL; + setNodeColor( + newNode, + 0 + /* NodeColor.Black */ + ); + T.root = newNode; + return T.root; + } + treeInsert(T, newNode); + recomputeMaxEndWalkToRoot(newNode.parent); + let x = newNode; + while (x !== T.root && getNodeColor(x.parent) === 1) { + if (x.parent === x.parent.parent.left) { + const y = x.parent.parent.right; + if (getNodeColor(y) === 1) { + setNodeColor( + x.parent, + 0 + /* NodeColor.Black */ + ); + setNodeColor( + y, + 0 + /* NodeColor.Black */ + ); + setNodeColor( + x.parent.parent, + 1 + /* NodeColor.Red */ + ); + x = x.parent.parent; + } else { + if (x === x.parent.right) { + x = x.parent; + leftRotate2(T, x); + } + setNodeColor( + x.parent, + 0 + /* NodeColor.Black */ + ); + setNodeColor( + x.parent.parent, + 1 + /* NodeColor.Red */ + ); + rightRotate(T, x.parent.parent); + } + } else { + const y = x.parent.parent.left; + if (getNodeColor(y) === 1) { + setNodeColor( + x.parent, + 0 + /* NodeColor.Black */ + ); + setNodeColor( + y, + 0 + /* NodeColor.Black */ + ); + setNodeColor( + x.parent.parent, + 1 + /* NodeColor.Red */ + ); + x = x.parent.parent; + } else { + if (x === x.parent.left) { + x = x.parent; + rightRotate(T, x); + } + setNodeColor( + x.parent, + 0 + /* NodeColor.Black */ + ); + setNodeColor( + x.parent.parent, + 1 + /* NodeColor.Red */ + ); + leftRotate2(T, x.parent.parent); + } + } + } + setNodeColor( + T.root, + 0 + /* NodeColor.Black */ + ); + return newNode; +} +function treeInsert(T, z) { + let delta = 0; + let x = T.root; + const zAbsoluteStart = z.start; + const zAbsoluteEnd = z.end; + while (true) { + const cmp3 = intervalCompare(zAbsoluteStart, zAbsoluteEnd, x.start + delta, x.end + delta); + if (cmp3 < 0) { + if (x.left === SENTINEL) { + z.start -= delta; + z.end -= delta; + z.maxEnd -= delta; + x.left = z; + break; + } else { + x = x.left; + } + } else { + if (x.right === SENTINEL) { + z.start -= delta + x.delta; + z.end -= delta + x.delta; + z.maxEnd -= delta + x.delta; + x.right = z; + break; + } else { + delta += x.delta; + x = x.right; + } + } + } + z.parent = x; + z.left = SENTINEL; + z.right = SENTINEL; + setNodeColor( + z, + 1 + /* NodeColor.Red */ + ); +} +function rbTreeDelete(T, z) { + let x; + let y; + if (z.left === SENTINEL) { + x = z.right; + y = z; + x.delta += z.delta; + if (x.delta < -1073741824 || x.delta > 1073741824) { + T.requestNormalizeDelta = true; + } + x.start += z.delta; + x.end += z.delta; + } else if (z.right === SENTINEL) { + x = z.left; + y = z; + } else { + y = leftest(z.right); + x = y.right; + x.start += y.delta; + x.end += y.delta; + x.delta += y.delta; + if (x.delta < -1073741824 || x.delta > 1073741824) { + T.requestNormalizeDelta = true; + } + y.start += z.delta; + y.end += z.delta; + y.delta = z.delta; + if (y.delta < -1073741824 || y.delta > 1073741824) { + T.requestNormalizeDelta = true; + } + } + if (y === T.root) { + T.root = x; + setNodeColor( + x, + 0 + /* NodeColor.Black */ + ); + z.detach(); + resetSentinel(); + recomputeMaxEnd(x); + T.root.parent = SENTINEL; + return; + } + const yWasRed = getNodeColor(y) === 1; + if (y === y.parent.left) { + y.parent.left = x; + } else { + y.parent.right = x; + } + if (y === z) { + x.parent = y.parent; + } else { + if (y.parent === z) { + x.parent = y; + } else { + x.parent = y.parent; + } + y.left = z.left; + y.right = z.right; + y.parent = z.parent; + setNodeColor(y, getNodeColor(z)); + if (z === T.root) { + T.root = y; + } else { + if (z === z.parent.left) { + z.parent.left = y; + } else { + z.parent.right = y; + } + } + if (y.left !== SENTINEL) { + y.left.parent = y; + } + if (y.right !== SENTINEL) { + y.right.parent = y; + } + } + z.detach(); + if (yWasRed) { + recomputeMaxEndWalkToRoot(x.parent); + if (y !== z) { + recomputeMaxEndWalkToRoot(y); + recomputeMaxEndWalkToRoot(y.parent); + } + resetSentinel(); + return; + } + recomputeMaxEndWalkToRoot(x); + recomputeMaxEndWalkToRoot(x.parent); + if (y !== z) { + recomputeMaxEndWalkToRoot(y); + recomputeMaxEndWalkToRoot(y.parent); + } + let w; + while (x !== T.root && getNodeColor(x) === 0) { + if (x === x.parent.left) { + w = x.parent.right; + if (getNodeColor(w) === 1) { + setNodeColor( + w, + 0 + /* NodeColor.Black */ + ); + setNodeColor( + x.parent, + 1 + /* NodeColor.Red */ + ); + leftRotate2(T, x.parent); + w = x.parent.right; + } + if (getNodeColor(w.left) === 0 && getNodeColor(w.right) === 0) { + setNodeColor( + w, + 1 + /* NodeColor.Red */ + ); + x = x.parent; + } else { + if (getNodeColor(w.right) === 0) { + setNodeColor( + w.left, + 0 + /* NodeColor.Black */ + ); + setNodeColor( + w, + 1 + /* NodeColor.Red */ + ); + rightRotate(T, w); + w = x.parent.right; + } + setNodeColor(w, getNodeColor(x.parent)); + setNodeColor( + x.parent, + 0 + /* NodeColor.Black */ + ); + setNodeColor( + w.right, + 0 + /* NodeColor.Black */ + ); + leftRotate2(T, x.parent); + x = T.root; + } + } else { + w = x.parent.left; + if (getNodeColor(w) === 1) { + setNodeColor( + w, + 0 + /* NodeColor.Black */ + ); + setNodeColor( + x.parent, + 1 + /* NodeColor.Red */ + ); + rightRotate(T, x.parent); + w = x.parent.left; + } + if (getNodeColor(w.left) === 0 && getNodeColor(w.right) === 0) { + setNodeColor( + w, + 1 + /* NodeColor.Red */ + ); + x = x.parent; + } else { + if (getNodeColor(w.left) === 0) { + setNodeColor( + w.right, + 0 + /* NodeColor.Black */ + ); + setNodeColor( + w, + 1 + /* NodeColor.Red */ + ); + leftRotate2(T, w); + w = x.parent.left; + } + setNodeColor(w, getNodeColor(x.parent)); + setNodeColor( + x.parent, + 0 + /* NodeColor.Black */ + ); + setNodeColor( + w.left, + 0 + /* NodeColor.Black */ + ); + rightRotate(T, x.parent); + x = T.root; + } + } + } + setNodeColor( + x, + 0 + /* NodeColor.Black */ + ); + resetSentinel(); +} +function leftest(node) { + while (node.left !== SENTINEL) { + node = node.left; + } + return node; +} +function resetSentinel() { + SENTINEL.parent = SENTINEL; + SENTINEL.delta = 0; + SENTINEL.start = 0; + SENTINEL.end = 0; +} +function leftRotate2(T, x) { + const y = x.right; + y.delta += x.delta; + if (y.delta < -1073741824 || y.delta > 1073741824) { + T.requestNormalizeDelta = true; + } + y.start += x.delta; + y.end += x.delta; + x.right = y.left; + if (y.left !== SENTINEL) { + y.left.parent = x; + } + y.parent = x.parent; + if (x.parent === SENTINEL) { + T.root = y; + } else if (x === x.parent.left) { + x.parent.left = y; + } else { + x.parent.right = y; + } + y.left = x; + x.parent = y; + recomputeMaxEnd(x); + recomputeMaxEnd(y); +} +function rightRotate(T, y) { + const x = y.left; + y.delta -= x.delta; + if (y.delta < -1073741824 || y.delta > 1073741824) { + T.requestNormalizeDelta = true; + } + y.start -= x.delta; + y.end -= x.delta; + y.left = x.right; + if (x.right !== SENTINEL) { + x.right.parent = y; + } + x.parent = y.parent; + if (y.parent === SENTINEL) { + T.root = x; + } else if (y === y.parent.right) { + y.parent.right = x; + } else { + y.parent.left = x; + } + x.right = y; + y.parent = x; + recomputeMaxEnd(y); + recomputeMaxEnd(x); +} +function computeMaxEnd(node) { + let maxEnd = node.end; + if (node.left !== SENTINEL) { + const leftMaxEnd = node.left.maxEnd; + if (leftMaxEnd > maxEnd) { + maxEnd = leftMaxEnd; + } + } + if (node.right !== SENTINEL) { + const rightMaxEnd = node.right.maxEnd + node.delta; + if (rightMaxEnd > maxEnd) { + maxEnd = rightMaxEnd; + } + } + return maxEnd; +} +function recomputeMaxEnd(node) { + node.maxEnd = computeMaxEnd(node); +} +function recomputeMaxEndWalkToRoot(node) { + while (node !== SENTINEL) { + const maxEnd = computeMaxEnd(node); + if (node.maxEnd === maxEnd) { + return; + } + node.maxEnd = maxEnd; + node = node.parent; + } +} +function intervalCompare(aStart, aEnd, bStart, bEnd) { + if (aStart === bStart) { + return aEnd - bEnd; + } + return aStart - bStart; +} +var IntervalNode, SENTINEL, IntervalTree; +var init_intervalTree = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/intervalTree.js"() { + IntervalNode = class { + constructor(id, start, end) { + this.metadata = 0; + this.parent = this; + this.left = this; + this.right = this; + setNodeColor( + this, + 1 + /* NodeColor.Red */ + ); + this.start = start; + this.end = end; + this.delta = 0; + this.maxEnd = end; + this.id = id; + this.ownerId = 0; + this.options = null; + setNodeIsForValidation(this, false); + setNodeIsInGlyphMargin(this, false); + _setNodeStickiness( + this, + 1 + /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ + ); + setCollapseOnReplaceEdit(this, false); + this.cachedVersionId = 0; + this.cachedAbsoluteStart = start; + this.cachedAbsoluteEnd = end; + this.range = null; + setNodeIsVisited(this, false); + } + reset(versionId, start, end, range2) { + this.start = start; + this.end = end; + this.maxEnd = end; + this.cachedVersionId = versionId; + this.cachedAbsoluteStart = start; + this.cachedAbsoluteEnd = end; + this.range = range2; + } + setOptions(options2) { + this.options = options2; + const className = this.options.className; + setNodeIsForValidation(this, className === "squiggly-error" || className === "squiggly-warning" || className === "squiggly-info"); + setNodeIsInGlyphMargin(this, this.options.glyphMarginClassName !== null); + _setNodeStickiness(this, this.options.stickiness); + setCollapseOnReplaceEdit(this, this.options.collapseOnReplaceEdit); + } + setCachedOffsets(absoluteStart, absoluteEnd, cachedVersionId) { + if (this.cachedVersionId !== cachedVersionId) { + this.range = null; + } + this.cachedVersionId = cachedVersionId; + this.cachedAbsoluteStart = absoluteStart; + this.cachedAbsoluteEnd = absoluteEnd; + } + detach() { + this.parent = null; + this.left = null; + this.right = null; + } + }; + SENTINEL = new IntervalNode(null, 0, 0); + SENTINEL.parent = SENTINEL; + SENTINEL.left = SENTINEL; + SENTINEL.right = SENTINEL; + setNodeColor( + SENTINEL, + 0 + /* NodeColor.Black */ + ); + IntervalTree = class { + constructor() { + this.root = SENTINEL; + this.requestNormalizeDelta = false; + } + intervalSearch(start, end, filterOwnerId, filterOutValidation, cachedVersionId, onlyMarginDecorations) { + if (this.root === SENTINEL) { + return []; + } + return intervalSearch(this, start, end, filterOwnerId, filterOutValidation, cachedVersionId, onlyMarginDecorations); + } + search(filterOwnerId, filterOutValidation, cachedVersionId, onlyMarginDecorations) { + if (this.root === SENTINEL) { + return []; + } + return search(this, filterOwnerId, filterOutValidation, cachedVersionId, onlyMarginDecorations); + } + /** + * Will not set `cachedAbsoluteStart` nor `cachedAbsoluteEnd` on the returned nodes! + */ + collectNodesFromOwner(ownerId2) { + return collectNodesFromOwner(this, ownerId2); + } + /** + * Will not set `cachedAbsoluteStart` nor `cachedAbsoluteEnd` on the returned nodes! + */ + collectNodesPostOrder() { + return collectNodesPostOrder(this); + } + insert(node) { + rbTreeInsert(this, node); + this._normalizeDeltaIfNecessary(); + } + delete(node) { + rbTreeDelete(this, node); + this._normalizeDeltaIfNecessary(); + } + resolveNode(node, cachedVersionId) { + const initialNode = node; + let delta = 0; + while (node !== this.root) { + if (node === node.parent.right) { + delta += node.parent.delta; + } + node = node.parent; + } + const nodeStart = initialNode.start + delta; + const nodeEnd = initialNode.end + delta; + initialNode.setCachedOffsets(nodeStart, nodeEnd, cachedVersionId); + } + acceptReplace(offset, length, textLength, forceMoveMarkers) { + const nodesOfInterest = searchForEditing(this, offset, offset + length); + for (let i = 0, len = nodesOfInterest.length; i < len; i++) { + const node = nodesOfInterest[i]; + rbTreeDelete(this, node); + } + this._normalizeDeltaIfNecessary(); + noOverlapReplace(this, offset, offset + length, textLength); + this._normalizeDeltaIfNecessary(); + for (let i = 0, len = nodesOfInterest.length; i < len; i++) { + const node = nodesOfInterest[i]; + node.start = node.cachedAbsoluteStart; + node.end = node.cachedAbsoluteEnd; + nodeAcceptEdit(node, offset, offset + length, textLength, forceMoveMarkers); + node.maxEnd = node.end; + rbTreeInsert(this, node); + } + this._normalizeDeltaIfNecessary(); + } + _normalizeDeltaIfNecessary() { + if (!this.requestNormalizeDelta) { + return; + } + this.requestNormalizeDelta = false; + normalizeDelta(this); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase.js +function leftest2(node) { + while (node.left !== SENTINEL2) { + node = node.left; + } + return node; +} +function righttest(node) { + while (node.right !== SENTINEL2) { + node = node.right; + } + return node; +} +function calculateSize(node) { + if (node === SENTINEL2) { + return 0; + } + return node.size_left + node.piece.length + calculateSize(node.right); +} +function calculateLF(node) { + if (node === SENTINEL2) { + return 0; + } + return node.lf_left + node.piece.lineFeedCnt + calculateLF(node.right); +} +function resetSentinel2() { + SENTINEL2.parent = SENTINEL2; +} +function leftRotate3(tree, x) { + const y = x.right; + y.size_left += x.size_left + (x.piece ? x.piece.length : 0); + y.lf_left += x.lf_left + (x.piece ? x.piece.lineFeedCnt : 0); + x.right = y.left; + if (y.left !== SENTINEL2) { + y.left.parent = x; + } + y.parent = x.parent; + if (x.parent === SENTINEL2) { + tree.root = y; + } else if (x.parent.left === x) { + x.parent.left = y; + } else { + x.parent.right = y; + } + y.left = x; + x.parent = y; +} +function rightRotate2(tree, y) { + const x = y.left; + y.left = x.right; + if (x.right !== SENTINEL2) { + x.right.parent = y; + } + x.parent = y.parent; + y.size_left -= x.size_left + (x.piece ? x.piece.length : 0); + y.lf_left -= x.lf_left + (x.piece ? x.piece.lineFeedCnt : 0); + if (y.parent === SENTINEL2) { + tree.root = x; + } else if (y === y.parent.right) { + y.parent.right = x; + } else { + y.parent.left = x; + } + x.right = y; + y.parent = x; +} +function rbDelete(tree, z) { + let x; + let y; + if (z.left === SENTINEL2) { + y = z; + x = y.right; + } else if (z.right === SENTINEL2) { + y = z; + x = y.left; + } else { + y = leftest2(z.right); + x = y.right; + } + if (y === tree.root) { + tree.root = x; + x.color = 0; + z.detach(); + resetSentinel2(); + tree.root.parent = SENTINEL2; + return; + } + const yWasRed = y.color === 1; + if (y === y.parent.left) { + y.parent.left = x; + } else { + y.parent.right = x; + } + if (y === z) { + x.parent = y.parent; + recomputeTreeMetadata(tree, x); + } else { + if (y.parent === z) { + x.parent = y; + } else { + x.parent = y.parent; + } + recomputeTreeMetadata(tree, x); + y.left = z.left; + y.right = z.right; + y.parent = z.parent; + y.color = z.color; + if (z === tree.root) { + tree.root = y; + } else { + if (z === z.parent.left) { + z.parent.left = y; + } else { + z.parent.right = y; + } + } + if (y.left !== SENTINEL2) { + y.left.parent = y; + } + if (y.right !== SENTINEL2) { + y.right.parent = y; + } + y.size_left = z.size_left; + y.lf_left = z.lf_left; + recomputeTreeMetadata(tree, y); + } + z.detach(); + if (x.parent.left === x) { + const newSizeLeft = calculateSize(x); + const newLFLeft = calculateLF(x); + if (newSizeLeft !== x.parent.size_left || newLFLeft !== x.parent.lf_left) { + const delta = newSizeLeft - x.parent.size_left; + const lf_delta = newLFLeft - x.parent.lf_left; + x.parent.size_left = newSizeLeft; + x.parent.lf_left = newLFLeft; + updateTreeMetadata(tree, x.parent, delta, lf_delta); + } + } + recomputeTreeMetadata(tree, x.parent); + if (yWasRed) { + resetSentinel2(); + return; + } + let w; + while (x !== tree.root && x.color === 0) { + if (x === x.parent.left) { + w = x.parent.right; + if (w.color === 1) { + w.color = 0; + x.parent.color = 1; + leftRotate3(tree, x.parent); + w = x.parent.right; + } + if (w.left.color === 0 && w.right.color === 0) { + w.color = 1; + x = x.parent; + } else { + if (w.right.color === 0) { + w.left.color = 0; + w.color = 1; + rightRotate2(tree, w); + w = x.parent.right; + } + w.color = x.parent.color; + x.parent.color = 0; + w.right.color = 0; + leftRotate3(tree, x.parent); + x = tree.root; + } + } else { + w = x.parent.left; + if (w.color === 1) { + w.color = 0; + x.parent.color = 1; + rightRotate2(tree, x.parent); + w = x.parent.left; + } + if (w.left.color === 0 && w.right.color === 0) { + w.color = 1; + x = x.parent; + } else { + if (w.left.color === 0) { + w.right.color = 0; + w.color = 1; + leftRotate3(tree, w); + w = x.parent.left; + } + w.color = x.parent.color; + x.parent.color = 0; + w.left.color = 0; + rightRotate2(tree, x.parent); + x = tree.root; + } + } + } + x.color = 0; + resetSentinel2(); +} +function fixInsert(tree, x) { + recomputeTreeMetadata(tree, x); + while (x !== tree.root && x.parent.color === 1) { + if (x.parent === x.parent.parent.left) { + const y = x.parent.parent.right; + if (y.color === 1) { + x.parent.color = 0; + y.color = 0; + x.parent.parent.color = 1; + x = x.parent.parent; + } else { + if (x === x.parent.right) { + x = x.parent; + leftRotate3(tree, x); + } + x.parent.color = 0; + x.parent.parent.color = 1; + rightRotate2(tree, x.parent.parent); + } + } else { + const y = x.parent.parent.left; + if (y.color === 1) { + x.parent.color = 0; + y.color = 0; + x.parent.parent.color = 1; + x = x.parent.parent; + } else { + if (x === x.parent.left) { + x = x.parent; + rightRotate2(tree, x); + } + x.parent.color = 0; + x.parent.parent.color = 1; + leftRotate3(tree, x.parent.parent); + } + } + } + tree.root.color = 0; +} +function updateTreeMetadata(tree, x, delta, lineFeedCntDelta) { + while (x !== tree.root && x !== SENTINEL2) { + if (x.parent.left === x) { + x.parent.size_left += delta; + x.parent.lf_left += lineFeedCntDelta; + } + x = x.parent; + } +} +function recomputeTreeMetadata(tree, x) { + let delta = 0; + let lf_delta = 0; + if (x === tree.root) { + return; + } + while (x !== tree.root && x === x.parent.right) { + x = x.parent; + } + if (x === tree.root) { + return; + } + x = x.parent; + delta = calculateSize(x.left) - x.size_left; + lf_delta = calculateLF(x.left) - x.lf_left; + x.size_left += delta; + x.lf_left += lf_delta; + while (x !== tree.root && (delta !== 0 || lf_delta !== 0)) { + if (x.parent.left === x) { + x.parent.size_left += delta; + x.parent.lf_left += lf_delta; + } + x = x.parent; + } +} +var TreeNode, SENTINEL2; +var init_rbTreeBase = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase.js"() { + TreeNode = class { + constructor(piece, color) { + this.piece = piece; + this.color = color; + this.size_left = 0; + this.lf_left = 0; + this.parent = this; + this.left = this; + this.right = this; + } + next() { + if (this.right !== SENTINEL2) { + return leftest2(this.right); + } + let node = this; + while (node.parent !== SENTINEL2) { + if (node.parent.left === node) { + break; + } + node = node.parent; + } + if (node.parent === SENTINEL2) { + return SENTINEL2; + } else { + return node.parent; + } + } + prev() { + if (this.left !== SENTINEL2) { + return righttest(this.left); + } + let node = this; + while (node.parent !== SENTINEL2) { + if (node.parent.right === node) { + break; + } + node = node.parent; + } + if (node.parent === SENTINEL2) { + return SENTINEL2; + } else { + return node.parent; + } + } + detach() { + this.parent = null; + this.left = null; + this.right = null; + } + }; + SENTINEL2 = new TreeNode( + null, + 0 + /* NodeColor.Black */ + ); + SENTINEL2.parent = SENTINEL2; + SENTINEL2.left = SENTINEL2; + SENTINEL2.right = SENTINEL2; + SENTINEL2.color = 0; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.js +function createUintArray(arr) { + let r; + if (arr[arr.length - 1] < 65536) { + r = new Uint16Array(arr.length); + } else { + r = new Uint32Array(arr.length); + } + r.set(arr, 0); + return r; +} +function createLineStartsFast(str, readonly = true) { + const r = [0]; + let rLength = 1; + for (let i = 0, len = str.length; i < len; i++) { + const chr = str.charCodeAt(i); + if (chr === 13) { + if (i + 1 < len && str.charCodeAt(i + 1) === 10) { + r[rLength++] = i + 2; + i++; + } else { + r[rLength++] = i + 1; + } + } else if (chr === 10) { + r[rLength++] = i + 1; + } + } + if (readonly) { + return createUintArray(r); + } else { + return r; + } +} +function createLineStarts(r, str) { + r.length = 0; + r[0] = 0; + let rLength = 1; + let cr = 0, lf = 0, crlf = 0; + let isBasicASCII2 = true; + for (let i = 0, len = str.length; i < len; i++) { + const chr = str.charCodeAt(i); + if (chr === 13) { + if (i + 1 < len && str.charCodeAt(i + 1) === 10) { + crlf++; + r[rLength++] = i + 2; + i++; + } else { + cr++; + r[rLength++] = i + 1; + } + } else if (chr === 10) { + lf++; + r[rLength++] = i + 1; + } else { + if (isBasicASCII2) { + if (chr !== 9 && (chr < 32 || chr > 126)) { + isBasicASCII2 = false; + } + } + } + } + const result = new LineStarts(createUintArray(r), cr, lf, crlf, isBasicASCII2); + r.length = 0; + return result; +} +var AverageBufferSize, LineStarts, Piece, StringBuffer, PieceTreeSnapshot, PieceTreeSearchCache, PieceTreeBase; +var init_pieceTreeBase = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.js"() { + init_position(); + init_range(); + init_model2(); + init_rbTreeBase(); + init_textModelSearch(); + AverageBufferSize = 65535; + LineStarts = class { + constructor(lineStarts, cr, lf, crlf, isBasicASCII2) { + this.lineStarts = lineStarts; + this.cr = cr; + this.lf = lf; + this.crlf = crlf; + this.isBasicASCII = isBasicASCII2; + } + }; + Piece = class { + constructor(bufferIndex, start, end, lineFeedCnt, length) { + this.bufferIndex = bufferIndex; + this.start = start; + this.end = end; + this.lineFeedCnt = lineFeedCnt; + this.length = length; + } + }; + StringBuffer = class { + constructor(buffer, lineStarts) { + this.buffer = buffer; + this.lineStarts = lineStarts; + } + }; + PieceTreeSnapshot = class { + constructor(tree, BOM) { + this._pieces = []; + this._tree = tree; + this._BOM = BOM; + this._index = 0; + if (tree.root !== SENTINEL2) { + tree.iterate(tree.root, (node) => { + if (node !== SENTINEL2) { + this._pieces.push(node.piece); + } + return true; + }); + } + } + read() { + if (this._pieces.length === 0) { + if (this._index === 0) { + this._index++; + return this._BOM; + } else { + return null; + } + } + if (this._index > this._pieces.length - 1) { + return null; + } + if (this._index === 0) { + return this._BOM + this._tree.getPieceContent(this._pieces[this._index++]); + } + return this._tree.getPieceContent(this._pieces[this._index++]); + } + }; + PieceTreeSearchCache = class { + constructor(limit) { + this._limit = limit; + this._cache = []; + } + get(offset) { + for (let i = this._cache.length - 1; i >= 0; i--) { + const nodePos = this._cache[i]; + if (nodePos.nodeStartOffset <= offset && nodePos.nodeStartOffset + nodePos.node.piece.length >= offset) { + return nodePos; + } + } + return null; + } + get2(lineNumber) { + for (let i = this._cache.length - 1; i >= 0; i--) { + const nodePos = this._cache[i]; + if (nodePos.nodeStartLineNumber && nodePos.nodeStartLineNumber < lineNumber && nodePos.nodeStartLineNumber + nodePos.node.piece.lineFeedCnt >= lineNumber) { + return nodePos; + } + } + return null; + } + set(nodePosition) { + if (this._cache.length >= this._limit) { + this._cache.shift(); + } + this._cache.push(nodePosition); + } + validate(offset) { + let hasInvalidVal = false; + const tmp = this._cache; + for (let i = 0; i < tmp.length; i++) { + const nodePos = tmp[i]; + if (nodePos.node.parent === null || nodePos.nodeStartOffset >= offset) { + tmp[i] = null; + hasInvalidVal = true; + continue; + } + } + if (hasInvalidVal) { + const newArr = []; + for (const entry of tmp) { + if (entry !== null) { + newArr.push(entry); + } + } + this._cache = newArr; + } + } + }; + PieceTreeBase = class { + constructor(chunks, eol, eolNormalized) { + this.create(chunks, eol, eolNormalized); + } + create(chunks, eol, eolNormalized) { + this._buffers = [ + new StringBuffer("", [0]) + ]; + this._lastChangeBufferPos = { line: 0, column: 0 }; + this.root = SENTINEL2; + this._lineCnt = 1; + this._length = 0; + this._EOL = eol; + this._EOLLength = eol.length; + this._EOLNormalized = eolNormalized; + let lastNode = null; + for (let i = 0, len = chunks.length; i < len; i++) { + if (chunks[i].buffer.length > 0) { + if (!chunks[i].lineStarts) { + chunks[i].lineStarts = createLineStartsFast(chunks[i].buffer); + } + const piece = new Piece(i + 1, { line: 0, column: 0 }, { line: chunks[i].lineStarts.length - 1, column: chunks[i].buffer.length - chunks[i].lineStarts[chunks[i].lineStarts.length - 1] }, chunks[i].lineStarts.length - 1, chunks[i].buffer.length); + this._buffers.push(chunks[i]); + lastNode = this.rbInsertRight(lastNode, piece); + } + } + this._searchCache = new PieceTreeSearchCache(1); + this._lastVisitedLine = { lineNumber: 0, value: "" }; + this.computeBufferMetadata(); + } + normalizeEOL(eol) { + const averageBufferSize = AverageBufferSize; + const min = averageBufferSize - Math.floor(averageBufferSize / 3); + const max = min * 2; + let tempChunk = ""; + let tempChunkLen = 0; + const chunks = []; + this.iterate(this.root, (node) => { + const str = this.getNodeContent(node); + const len = str.length; + if (tempChunkLen <= min || tempChunkLen + len < max) { + tempChunk += str; + tempChunkLen += len; + return true; + } + const text2 = tempChunk.replace(/\r\n|\r|\n/g, eol); + chunks.push(new StringBuffer(text2, createLineStartsFast(text2))); + tempChunk = str; + tempChunkLen = len; + return true; + }); + if (tempChunkLen > 0) { + const text2 = tempChunk.replace(/\r\n|\r|\n/g, eol); + chunks.push(new StringBuffer(text2, createLineStartsFast(text2))); + } + this.create(chunks, eol, true); + } + // #region Buffer API + getEOL() { + return this._EOL; + } + setEOL(newEOL) { + this._EOL = newEOL; + this._EOLLength = this._EOL.length; + this.normalizeEOL(newEOL); + } + createSnapshot(BOM) { + return new PieceTreeSnapshot(this, BOM); + } + getOffsetAt(lineNumber, column) { + let leftLen = 0; + let x = this.root; + while (x !== SENTINEL2) { + if (x.left !== SENTINEL2 && x.lf_left + 1 >= lineNumber) { + x = x.left; + } else if (x.lf_left + x.piece.lineFeedCnt + 1 >= lineNumber) { + leftLen += x.size_left; + const accumualtedValInCurrentIndex = this.getAccumulatedValue(x, lineNumber - x.lf_left - 2); + return leftLen += accumualtedValInCurrentIndex + column - 1; + } else { + lineNumber -= x.lf_left + x.piece.lineFeedCnt; + leftLen += x.size_left + x.piece.length; + x = x.right; + } + } + return leftLen; + } + getPositionAt(offset) { + offset = Math.floor(offset); + offset = Math.max(0, offset); + let x = this.root; + let lfCnt = 0; + const originalOffset = offset; + while (x !== SENTINEL2) { + if (x.size_left !== 0 && x.size_left >= offset) { + x = x.left; + } else if (x.size_left + x.piece.length >= offset) { + const out = this.getIndexOf(x, offset - x.size_left); + lfCnt += x.lf_left + out.index; + if (out.index === 0) { + const lineStartOffset = this.getOffsetAt(lfCnt + 1, 1); + const column = originalOffset - lineStartOffset; + return new Position(lfCnt + 1, column + 1); + } + return new Position(lfCnt + 1, out.remainder + 1); + } else { + offset -= x.size_left + x.piece.length; + lfCnt += x.lf_left + x.piece.lineFeedCnt; + if (x.right === SENTINEL2) { + const lineStartOffset = this.getOffsetAt(lfCnt + 1, 1); + const column = originalOffset - offset - lineStartOffset; + return new Position(lfCnt + 1, column + 1); + } else { + x = x.right; + } + } + } + return new Position(1, 1); + } + getValueInRange(range2, eol) { + if (range2.startLineNumber === range2.endLineNumber && range2.startColumn === range2.endColumn) { + return ""; + } + const startPosition = this.nodeAt2(range2.startLineNumber, range2.startColumn); + const endPosition = this.nodeAt2(range2.endLineNumber, range2.endColumn); + const value = this.getValueInRange2(startPosition, endPosition); + if (eol) { + if (eol !== this._EOL || !this._EOLNormalized) { + return value.replace(/\r\n|\r|\n/g, eol); + } + if (eol === this.getEOL() && this._EOLNormalized) { + if (eol === "\r\n") { + } + return value; + } + return value.replace(/\r\n|\r|\n/g, eol); + } + return value; + } + getValueInRange2(startPosition, endPosition) { + if (startPosition.node === endPosition.node) { + const node = startPosition.node; + const buffer2 = this._buffers[node.piece.bufferIndex].buffer; + const startOffset2 = this.offsetInBuffer(node.piece.bufferIndex, node.piece.start); + return buffer2.substring(startOffset2 + startPosition.remainder, startOffset2 + endPosition.remainder); + } + let x = startPosition.node; + const buffer = this._buffers[x.piece.bufferIndex].buffer; + const startOffset = this.offsetInBuffer(x.piece.bufferIndex, x.piece.start); + let ret = buffer.substring(startOffset + startPosition.remainder, startOffset + x.piece.length); + x = x.next(); + while (x !== SENTINEL2) { + const buffer2 = this._buffers[x.piece.bufferIndex].buffer; + const startOffset2 = this.offsetInBuffer(x.piece.bufferIndex, x.piece.start); + if (x === endPosition.node) { + ret += buffer2.substring(startOffset2, startOffset2 + endPosition.remainder); + break; + } else { + ret += buffer2.substr(startOffset2, x.piece.length); + } + x = x.next(); + } + return ret; + } + getLinesContent() { + const lines = []; + let linesLength = 0; + let currentLine = ""; + let danglingCR = false; + this.iterate(this.root, (node) => { + if (node === SENTINEL2) { + return true; + } + const piece = node.piece; + let pieceLength = piece.length; + if (pieceLength === 0) { + return true; + } + const buffer = this._buffers[piece.bufferIndex].buffer; + const lineStarts = this._buffers[piece.bufferIndex].lineStarts; + const pieceStartLine = piece.start.line; + const pieceEndLine = piece.end.line; + let pieceStartOffset = lineStarts[pieceStartLine] + piece.start.column; + if (danglingCR) { + if (buffer.charCodeAt(pieceStartOffset) === 10) { + pieceStartOffset++; + pieceLength--; + } + lines[linesLength++] = currentLine; + currentLine = ""; + danglingCR = false; + if (pieceLength === 0) { + return true; + } + } + if (pieceStartLine === pieceEndLine) { + if (!this._EOLNormalized && buffer.charCodeAt(pieceStartOffset + pieceLength - 1) === 13) { + danglingCR = true; + currentLine += buffer.substr(pieceStartOffset, pieceLength - 1); + } else { + currentLine += buffer.substr(pieceStartOffset, pieceLength); + } + return true; + } + currentLine += this._EOLNormalized ? buffer.substring(pieceStartOffset, Math.max(pieceStartOffset, lineStarts[pieceStartLine + 1] - this._EOLLength)) : buffer.substring(pieceStartOffset, lineStarts[pieceStartLine + 1]).replace(/(\r\n|\r|\n)$/, ""); + lines[linesLength++] = currentLine; + for (let line = pieceStartLine + 1; line < pieceEndLine; line++) { + currentLine = this._EOLNormalized ? buffer.substring(lineStarts[line], lineStarts[line + 1] - this._EOLLength) : buffer.substring(lineStarts[line], lineStarts[line + 1]).replace(/(\r\n|\r|\n)$/, ""); + lines[linesLength++] = currentLine; + } + if (!this._EOLNormalized && buffer.charCodeAt(lineStarts[pieceEndLine] + piece.end.column - 1) === 13) { + danglingCR = true; + if (piece.end.column === 0) { + linesLength--; + } else { + currentLine = buffer.substr(lineStarts[pieceEndLine], piece.end.column - 1); + } + } else { + currentLine = buffer.substr(lineStarts[pieceEndLine], piece.end.column); + } + return true; + }); + if (danglingCR) { + lines[linesLength++] = currentLine; + currentLine = ""; + } + lines[linesLength++] = currentLine; + return lines; + } + getLength() { + return this._length; + } + getLineCount() { + return this._lineCnt; + } + getLineContent(lineNumber) { + if (this._lastVisitedLine.lineNumber === lineNumber) { + return this._lastVisitedLine.value; + } + this._lastVisitedLine.lineNumber = lineNumber; + if (lineNumber === this._lineCnt) { + this._lastVisitedLine.value = this.getLineRawContent(lineNumber); + } else if (this._EOLNormalized) { + this._lastVisitedLine.value = this.getLineRawContent(lineNumber, this._EOLLength); + } else { + this._lastVisitedLine.value = this.getLineRawContent(lineNumber).replace(/(\r\n|\r|\n)$/, ""); + } + return this._lastVisitedLine.value; + } + _getCharCode(nodePos) { + if (nodePos.remainder === nodePos.node.piece.length) { + const matchingNode = nodePos.node.next(); + if (!matchingNode) { + return 0; + } + const buffer = this._buffers[matchingNode.piece.bufferIndex]; + const startOffset = this.offsetInBuffer(matchingNode.piece.bufferIndex, matchingNode.piece.start); + return buffer.buffer.charCodeAt(startOffset); + } else { + const buffer = this._buffers[nodePos.node.piece.bufferIndex]; + const startOffset = this.offsetInBuffer(nodePos.node.piece.bufferIndex, nodePos.node.piece.start); + const targetOffset = startOffset + nodePos.remainder; + return buffer.buffer.charCodeAt(targetOffset); + } + } + getLineCharCode(lineNumber, index) { + const nodePos = this.nodeAt2(lineNumber, index + 1); + return this._getCharCode(nodePos); + } + getLineLength(lineNumber) { + if (lineNumber === this.getLineCount()) { + const startOffset = this.getOffsetAt(lineNumber, 1); + return this.getLength() - startOffset; + } + return this.getOffsetAt(lineNumber + 1, 1) - this.getOffsetAt(lineNumber, 1) - this._EOLLength; + } + findMatchesInNode(node, searcher, startLineNumber, startColumn, startCursor, endCursor, searchData, captureMatches, limitResultCount, resultLen, result) { + const buffer = this._buffers[node.piece.bufferIndex]; + const startOffsetInBuffer = this.offsetInBuffer(node.piece.bufferIndex, node.piece.start); + const start = this.offsetInBuffer(node.piece.bufferIndex, startCursor); + const end = this.offsetInBuffer(node.piece.bufferIndex, endCursor); + let m; + const ret = { line: 0, column: 0 }; + let searchText; + let offsetInBuffer; + if (searcher._wordSeparators) { + searchText = buffer.buffer.substring(start, end); + offsetInBuffer = (offset) => offset + start; + searcher.reset(0); + } else { + searchText = buffer.buffer; + offsetInBuffer = (offset) => offset; + searcher.reset(start); + } + do { + m = searcher.next(searchText); + if (m) { + if (offsetInBuffer(m.index) >= end) { + return resultLen; + } + this.positionInBuffer(node, offsetInBuffer(m.index) - startOffsetInBuffer, ret); + const lineFeedCnt = this.getLineFeedCnt(node.piece.bufferIndex, startCursor, ret); + const retStartColumn = ret.line === startCursor.line ? ret.column - startCursor.column + startColumn : ret.column + 1; + const retEndColumn = retStartColumn + m[0].length; + result[resultLen++] = createFindMatch(new Range(startLineNumber + lineFeedCnt, retStartColumn, startLineNumber + lineFeedCnt, retEndColumn), m, captureMatches); + if (offsetInBuffer(m.index) + m[0].length >= end) { + return resultLen; + } + if (resultLen >= limitResultCount) { + return resultLen; + } + } + } while (m); + return resultLen; + } + findMatchesLineByLine(searchRange, searchData, captureMatches, limitResultCount) { + const result = []; + let resultLen = 0; + const searcher = new Searcher(searchData.wordSeparators, searchData.regex); + let startPosition = this.nodeAt2(searchRange.startLineNumber, searchRange.startColumn); + if (startPosition === null) { + return []; + } + const endPosition = this.nodeAt2(searchRange.endLineNumber, searchRange.endColumn); + if (endPosition === null) { + return []; + } + let start = this.positionInBuffer(startPosition.node, startPosition.remainder); + const end = this.positionInBuffer(endPosition.node, endPosition.remainder); + if (startPosition.node === endPosition.node) { + this.findMatchesInNode(startPosition.node, searcher, searchRange.startLineNumber, searchRange.startColumn, start, end, searchData, captureMatches, limitResultCount, resultLen, result); + return result; + } + let startLineNumber = searchRange.startLineNumber; + let currentNode = startPosition.node; + while (currentNode !== endPosition.node) { + const lineBreakCnt = this.getLineFeedCnt(currentNode.piece.bufferIndex, start, currentNode.piece.end); + if (lineBreakCnt >= 1) { + const lineStarts = this._buffers[currentNode.piece.bufferIndex].lineStarts; + const startOffsetInBuffer = this.offsetInBuffer(currentNode.piece.bufferIndex, currentNode.piece.start); + const nextLineStartOffset = lineStarts[start.line + lineBreakCnt]; + const startColumn3 = startLineNumber === searchRange.startLineNumber ? searchRange.startColumn : 1; + resultLen = this.findMatchesInNode(currentNode, searcher, startLineNumber, startColumn3, start, this.positionInBuffer(currentNode, nextLineStartOffset - startOffsetInBuffer), searchData, captureMatches, limitResultCount, resultLen, result); + if (resultLen >= limitResultCount) { + return result; + } + startLineNumber += lineBreakCnt; + } + const startColumn2 = startLineNumber === searchRange.startLineNumber ? searchRange.startColumn - 1 : 0; + if (startLineNumber === searchRange.endLineNumber) { + const text2 = this.getLineContent(startLineNumber).substring(startColumn2, searchRange.endColumn - 1); + resultLen = this._findMatchesInLine(searchData, searcher, text2, searchRange.endLineNumber, startColumn2, resultLen, result, captureMatches, limitResultCount); + return result; + } + resultLen = this._findMatchesInLine(searchData, searcher, this.getLineContent(startLineNumber).substr(startColumn2), startLineNumber, startColumn2, resultLen, result, captureMatches, limitResultCount); + if (resultLen >= limitResultCount) { + return result; + } + startLineNumber++; + startPosition = this.nodeAt2(startLineNumber, 1); + currentNode = startPosition.node; + start = this.positionInBuffer(startPosition.node, startPosition.remainder); + } + if (startLineNumber === searchRange.endLineNumber) { + const startColumn2 = startLineNumber === searchRange.startLineNumber ? searchRange.startColumn - 1 : 0; + const text2 = this.getLineContent(startLineNumber).substring(startColumn2, searchRange.endColumn - 1); + resultLen = this._findMatchesInLine(searchData, searcher, text2, searchRange.endLineNumber, startColumn2, resultLen, result, captureMatches, limitResultCount); + return result; + } + const startColumn = startLineNumber === searchRange.startLineNumber ? searchRange.startColumn : 1; + resultLen = this.findMatchesInNode(endPosition.node, searcher, startLineNumber, startColumn, start, end, searchData, captureMatches, limitResultCount, resultLen, result); + return result; + } + _findMatchesInLine(searchData, searcher, text2, lineNumber, deltaOffset, resultLen, result, captureMatches, limitResultCount) { + const wordSeparators2 = searchData.wordSeparators; + if (!captureMatches && searchData.simpleSearch) { + const searchString = searchData.simpleSearch; + const searchStringLen = searchString.length; + const textLength = text2.length; + let lastMatchIndex = -searchStringLen; + while ((lastMatchIndex = text2.indexOf(searchString, lastMatchIndex + searchStringLen)) !== -1) { + if (!wordSeparators2 || isValidMatch(wordSeparators2, text2, textLength, lastMatchIndex, searchStringLen)) { + result[resultLen++] = new FindMatch(new Range(lineNumber, lastMatchIndex + 1 + deltaOffset, lineNumber, lastMatchIndex + 1 + searchStringLen + deltaOffset), null); + if (resultLen >= limitResultCount) { + return resultLen; + } + } + } + return resultLen; + } + let m; + searcher.reset(0); + do { + m = searcher.next(text2); + if (m) { + result[resultLen++] = createFindMatch(new Range(lineNumber, m.index + 1 + deltaOffset, lineNumber, m.index + 1 + m[0].length + deltaOffset), m, captureMatches); + if (resultLen >= limitResultCount) { + return resultLen; + } + } + } while (m); + return resultLen; + } + // #endregion + // #region Piece Table + insert(offset, value, eolNormalized = false) { + this._EOLNormalized = this._EOLNormalized && eolNormalized; + this._lastVisitedLine.lineNumber = 0; + this._lastVisitedLine.value = ""; + if (this.root !== SENTINEL2) { + const { node, remainder, nodeStartOffset } = this.nodeAt(offset); + const piece = node.piece; + const bufferIndex = piece.bufferIndex; + const insertPosInBuffer = this.positionInBuffer(node, remainder); + if (node.piece.bufferIndex === 0 && piece.end.line === this._lastChangeBufferPos.line && piece.end.column === this._lastChangeBufferPos.column && nodeStartOffset + piece.length === offset && value.length < AverageBufferSize) { + this.appendToNode(node, value); + this.computeBufferMetadata(); + return; + } + if (nodeStartOffset === offset) { + this.insertContentToNodeLeft(value, node); + this._searchCache.validate(offset); + } else if (nodeStartOffset + node.piece.length > offset) { + const nodesToDel = []; + let newRightPiece = new Piece(piece.bufferIndex, insertPosInBuffer, piece.end, this.getLineFeedCnt(piece.bufferIndex, insertPosInBuffer, piece.end), this.offsetInBuffer(bufferIndex, piece.end) - this.offsetInBuffer(bufferIndex, insertPosInBuffer)); + if (this.shouldCheckCRLF() && this.endWithCR(value)) { + const headOfRight = this.nodeCharCodeAt(node, remainder); + if (headOfRight === 10) { + const newStart = { line: newRightPiece.start.line + 1, column: 0 }; + newRightPiece = new Piece(newRightPiece.bufferIndex, newStart, newRightPiece.end, this.getLineFeedCnt(newRightPiece.bufferIndex, newStart, newRightPiece.end), newRightPiece.length - 1); + value += "\n"; + } + } + if (this.shouldCheckCRLF() && this.startWithLF(value)) { + const tailOfLeft = this.nodeCharCodeAt(node, remainder - 1); + if (tailOfLeft === 13) { + const previousPos = this.positionInBuffer(node, remainder - 1); + this.deleteNodeTail(node, previousPos); + value = "\r" + value; + if (node.piece.length === 0) { + nodesToDel.push(node); + } + } else { + this.deleteNodeTail(node, insertPosInBuffer); + } + } else { + this.deleteNodeTail(node, insertPosInBuffer); + } + const newPieces = this.createNewPieces(value); + if (newRightPiece.length > 0) { + this.rbInsertRight(node, newRightPiece); + } + let tmpNode = node; + for (let k = 0; k < newPieces.length; k++) { + tmpNode = this.rbInsertRight(tmpNode, newPieces[k]); + } + this.deleteNodes(nodesToDel); + } else { + this.insertContentToNodeRight(value, node); + } + } else { + const pieces = this.createNewPieces(value); + let node = this.rbInsertLeft(null, pieces[0]); + for (let k = 1; k < pieces.length; k++) { + node = this.rbInsertRight(node, pieces[k]); + } + } + this.computeBufferMetadata(); + } + delete(offset, cnt) { + this._lastVisitedLine.lineNumber = 0; + this._lastVisitedLine.value = ""; + if (cnt <= 0 || this.root === SENTINEL2) { + return; + } + const startPosition = this.nodeAt(offset); + const endPosition = this.nodeAt(offset + cnt); + const startNode = startPosition.node; + const endNode = endPosition.node; + if (startNode === endNode) { + const startSplitPosInBuffer2 = this.positionInBuffer(startNode, startPosition.remainder); + const endSplitPosInBuffer2 = this.positionInBuffer(startNode, endPosition.remainder); + if (startPosition.nodeStartOffset === offset) { + if (cnt === startNode.piece.length) { + const next = startNode.next(); + rbDelete(this, startNode); + this.validateCRLFWithPrevNode(next); + this.computeBufferMetadata(); + return; + } + this.deleteNodeHead(startNode, endSplitPosInBuffer2); + this._searchCache.validate(offset); + this.validateCRLFWithPrevNode(startNode); + this.computeBufferMetadata(); + return; + } + if (startPosition.nodeStartOffset + startNode.piece.length === offset + cnt) { + this.deleteNodeTail(startNode, startSplitPosInBuffer2); + this.validateCRLFWithNextNode(startNode); + this.computeBufferMetadata(); + return; + } + this.shrinkNode(startNode, startSplitPosInBuffer2, endSplitPosInBuffer2); + this.computeBufferMetadata(); + return; + } + const nodesToDel = []; + const startSplitPosInBuffer = this.positionInBuffer(startNode, startPosition.remainder); + this.deleteNodeTail(startNode, startSplitPosInBuffer); + this._searchCache.validate(offset); + if (startNode.piece.length === 0) { + nodesToDel.push(startNode); + } + const endSplitPosInBuffer = this.positionInBuffer(endNode, endPosition.remainder); + this.deleteNodeHead(endNode, endSplitPosInBuffer); + if (endNode.piece.length === 0) { + nodesToDel.push(endNode); + } + const secondNode = startNode.next(); + for (let node = secondNode; node !== SENTINEL2 && node !== endNode; node = node.next()) { + nodesToDel.push(node); + } + const prev = startNode.piece.length === 0 ? startNode.prev() : startNode; + this.deleteNodes(nodesToDel); + this.validateCRLFWithNextNode(prev); + this.computeBufferMetadata(); + } + insertContentToNodeLeft(value, node) { + const nodesToDel = []; + if (this.shouldCheckCRLF() && this.endWithCR(value) && this.startWithLF(node)) { + const piece = node.piece; + const newStart = { line: piece.start.line + 1, column: 0 }; + const nPiece = new Piece(piece.bufferIndex, newStart, piece.end, this.getLineFeedCnt(piece.bufferIndex, newStart, piece.end), piece.length - 1); + node.piece = nPiece; + value += "\n"; + updateTreeMetadata(this, node, -1, -1); + if (node.piece.length === 0) { + nodesToDel.push(node); + } + } + const newPieces = this.createNewPieces(value); + let newNode = this.rbInsertLeft(node, newPieces[newPieces.length - 1]); + for (let k = newPieces.length - 2; k >= 0; k--) { + newNode = this.rbInsertLeft(newNode, newPieces[k]); + } + this.validateCRLFWithPrevNode(newNode); + this.deleteNodes(nodesToDel); + } + insertContentToNodeRight(value, node) { + if (this.adjustCarriageReturnFromNext(value, node)) { + value += "\n"; + } + const newPieces = this.createNewPieces(value); + const newNode = this.rbInsertRight(node, newPieces[0]); + let tmpNode = newNode; + for (let k = 1; k < newPieces.length; k++) { + tmpNode = this.rbInsertRight(tmpNode, newPieces[k]); + } + this.validateCRLFWithPrevNode(newNode); + } + positionInBuffer(node, remainder, ret) { + const piece = node.piece; + const bufferIndex = node.piece.bufferIndex; + const lineStarts = this._buffers[bufferIndex].lineStarts; + const startOffset = lineStarts[piece.start.line] + piece.start.column; + const offset = startOffset + remainder; + let low = piece.start.line; + let high = piece.end.line; + let mid = 0; + let midStop = 0; + let midStart = 0; + while (low <= high) { + mid = low + (high - low) / 2 | 0; + midStart = lineStarts[mid]; + if (mid === high) { + break; + } + midStop = lineStarts[mid + 1]; + if (offset < midStart) { + high = mid - 1; + } else if (offset >= midStop) { + low = mid + 1; + } else { + break; + } + } + if (ret) { + ret.line = mid; + ret.column = offset - midStart; + return null; + } + return { + line: mid, + column: offset - midStart + }; + } + getLineFeedCnt(bufferIndex, start, end) { + if (end.column === 0) { + return end.line - start.line; + } + const lineStarts = this._buffers[bufferIndex].lineStarts; + if (end.line === lineStarts.length - 1) { + return end.line - start.line; + } + const nextLineStartOffset = lineStarts[end.line + 1]; + const endOffset = lineStarts[end.line] + end.column; + if (nextLineStartOffset > endOffset + 1) { + return end.line - start.line; + } + const previousCharOffset = endOffset - 1; + const buffer = this._buffers[bufferIndex].buffer; + if (buffer.charCodeAt(previousCharOffset) === 13) { + return end.line - start.line + 1; + } else { + return end.line - start.line; + } + } + offsetInBuffer(bufferIndex, cursor) { + const lineStarts = this._buffers[bufferIndex].lineStarts; + return lineStarts[cursor.line] + cursor.column; + } + deleteNodes(nodes) { + for (let i = 0; i < nodes.length; i++) { + rbDelete(this, nodes[i]); + } + } + createNewPieces(text2) { + if (text2.length > AverageBufferSize) { + const newPieces = []; + while (text2.length > AverageBufferSize) { + const lastChar = text2.charCodeAt(AverageBufferSize - 1); + let splitText; + if (lastChar === 13 || lastChar >= 55296 && lastChar <= 56319) { + splitText = text2.substring(0, AverageBufferSize - 1); + text2 = text2.substring(AverageBufferSize - 1); + } else { + splitText = text2.substring(0, AverageBufferSize); + text2 = text2.substring(AverageBufferSize); + } + const lineStarts3 = createLineStartsFast(splitText); + newPieces.push(new Piece( + this._buffers.length, + /* buffer index */ + { line: 0, column: 0 }, + { line: lineStarts3.length - 1, column: splitText.length - lineStarts3[lineStarts3.length - 1] }, + lineStarts3.length - 1, + splitText.length + )); + this._buffers.push(new StringBuffer(splitText, lineStarts3)); + } + const lineStarts2 = createLineStartsFast(text2); + newPieces.push(new Piece( + this._buffers.length, + /* buffer index */ + { line: 0, column: 0 }, + { line: lineStarts2.length - 1, column: text2.length - lineStarts2[lineStarts2.length - 1] }, + lineStarts2.length - 1, + text2.length + )); + this._buffers.push(new StringBuffer(text2, lineStarts2)); + return newPieces; + } + let startOffset = this._buffers[0].buffer.length; + const lineStarts = createLineStartsFast(text2, false); + let start = this._lastChangeBufferPos; + if (this._buffers[0].lineStarts[this._buffers[0].lineStarts.length - 1] === startOffset && startOffset !== 0 && this.startWithLF(text2) && this.endWithCR(this._buffers[0].buffer)) { + this._lastChangeBufferPos = { line: this._lastChangeBufferPos.line, column: this._lastChangeBufferPos.column + 1 }; + start = this._lastChangeBufferPos; + for (let i = 0; i < lineStarts.length; i++) { + lineStarts[i] += startOffset + 1; + } + this._buffers[0].lineStarts = this._buffers[0].lineStarts.concat(lineStarts.slice(1)); + this._buffers[0].buffer += "_" + text2; + startOffset += 1; + } else { + if (startOffset !== 0) { + for (let i = 0; i < lineStarts.length; i++) { + lineStarts[i] += startOffset; + } + } + this._buffers[0].lineStarts = this._buffers[0].lineStarts.concat(lineStarts.slice(1)); + this._buffers[0].buffer += text2; + } + const endOffset = this._buffers[0].buffer.length; + const endIndex = this._buffers[0].lineStarts.length - 1; + const endColumn = endOffset - this._buffers[0].lineStarts[endIndex]; + const endPos = { line: endIndex, column: endColumn }; + const newPiece = new Piece( + 0, + /** todo@peng */ + start, + endPos, + this.getLineFeedCnt(0, start, endPos), + endOffset - startOffset + ); + this._lastChangeBufferPos = endPos; + return [newPiece]; + } + getLineRawContent(lineNumber, endOffset = 0) { + let x = this.root; + let ret = ""; + const cache = this._searchCache.get2(lineNumber); + if (cache) { + x = cache.node; + const prevAccumulatedValue = this.getAccumulatedValue(x, lineNumber - cache.nodeStartLineNumber - 1); + const buffer = this._buffers[x.piece.bufferIndex].buffer; + const startOffset = this.offsetInBuffer(x.piece.bufferIndex, x.piece.start); + if (cache.nodeStartLineNumber + x.piece.lineFeedCnt === lineNumber) { + ret = buffer.substring(startOffset + prevAccumulatedValue, startOffset + x.piece.length); + } else { + const accumulatedValue = this.getAccumulatedValue(x, lineNumber - cache.nodeStartLineNumber); + return buffer.substring(startOffset + prevAccumulatedValue, startOffset + accumulatedValue - endOffset); + } + } else { + let nodeStartOffset = 0; + const originalLineNumber = lineNumber; + while (x !== SENTINEL2) { + if (x.left !== SENTINEL2 && x.lf_left >= lineNumber - 1) { + x = x.left; + } else if (x.lf_left + x.piece.lineFeedCnt > lineNumber - 1) { + const prevAccumulatedValue = this.getAccumulatedValue(x, lineNumber - x.lf_left - 2); + const accumulatedValue = this.getAccumulatedValue(x, lineNumber - x.lf_left - 1); + const buffer = this._buffers[x.piece.bufferIndex].buffer; + const startOffset = this.offsetInBuffer(x.piece.bufferIndex, x.piece.start); + nodeStartOffset += x.size_left; + this._searchCache.set({ + node: x, + nodeStartOffset, + nodeStartLineNumber: originalLineNumber - (lineNumber - 1 - x.lf_left) + }); + return buffer.substring(startOffset + prevAccumulatedValue, startOffset + accumulatedValue - endOffset); + } else if (x.lf_left + x.piece.lineFeedCnt === lineNumber - 1) { + const prevAccumulatedValue = this.getAccumulatedValue(x, lineNumber - x.lf_left - 2); + const buffer = this._buffers[x.piece.bufferIndex].buffer; + const startOffset = this.offsetInBuffer(x.piece.bufferIndex, x.piece.start); + ret = buffer.substring(startOffset + prevAccumulatedValue, startOffset + x.piece.length); + break; + } else { + lineNumber -= x.lf_left + x.piece.lineFeedCnt; + nodeStartOffset += x.size_left + x.piece.length; + x = x.right; + } + } + } + x = x.next(); + while (x !== SENTINEL2) { + const buffer = this._buffers[x.piece.bufferIndex].buffer; + if (x.piece.lineFeedCnt > 0) { + const accumulatedValue = this.getAccumulatedValue(x, 0); + const startOffset = this.offsetInBuffer(x.piece.bufferIndex, x.piece.start); + ret += buffer.substring(startOffset, startOffset + accumulatedValue - endOffset); + return ret; + } else { + const startOffset = this.offsetInBuffer(x.piece.bufferIndex, x.piece.start); + ret += buffer.substr(startOffset, x.piece.length); + } + x = x.next(); + } + return ret; + } + computeBufferMetadata() { + let x = this.root; + let lfCnt = 1; + let len = 0; + while (x !== SENTINEL2) { + lfCnt += x.lf_left + x.piece.lineFeedCnt; + len += x.size_left + x.piece.length; + x = x.right; + } + this._lineCnt = lfCnt; + this._length = len; + this._searchCache.validate(this._length); + } + // #region node operations + getIndexOf(node, accumulatedValue) { + const piece = node.piece; + const pos = this.positionInBuffer(node, accumulatedValue); + const lineCnt = pos.line - piece.start.line; + if (this.offsetInBuffer(piece.bufferIndex, piece.end) - this.offsetInBuffer(piece.bufferIndex, piece.start) === accumulatedValue) { + const realLineCnt = this.getLineFeedCnt(node.piece.bufferIndex, piece.start, pos); + if (realLineCnt !== lineCnt) { + return { index: realLineCnt, remainder: 0 }; + } + } + return { index: lineCnt, remainder: pos.column }; + } + getAccumulatedValue(node, index) { + if (index < 0) { + return 0; + } + const piece = node.piece; + const lineStarts = this._buffers[piece.bufferIndex].lineStarts; + const expectedLineStartIndex = piece.start.line + index + 1; + if (expectedLineStartIndex > piece.end.line) { + return lineStarts[piece.end.line] + piece.end.column - lineStarts[piece.start.line] - piece.start.column; + } else { + return lineStarts[expectedLineStartIndex] - lineStarts[piece.start.line] - piece.start.column; + } + } + deleteNodeTail(node, pos) { + const piece = node.piece; + const originalLFCnt = piece.lineFeedCnt; + const originalEndOffset = this.offsetInBuffer(piece.bufferIndex, piece.end); + const newEnd = pos; + const newEndOffset = this.offsetInBuffer(piece.bufferIndex, newEnd); + const newLineFeedCnt = this.getLineFeedCnt(piece.bufferIndex, piece.start, newEnd); + const lf_delta = newLineFeedCnt - originalLFCnt; + const size_delta = newEndOffset - originalEndOffset; + const newLength = piece.length + size_delta; + node.piece = new Piece(piece.bufferIndex, piece.start, newEnd, newLineFeedCnt, newLength); + updateTreeMetadata(this, node, size_delta, lf_delta); + } + deleteNodeHead(node, pos) { + const piece = node.piece; + const originalLFCnt = piece.lineFeedCnt; + const originalStartOffset = this.offsetInBuffer(piece.bufferIndex, piece.start); + const newStart = pos; + const newLineFeedCnt = this.getLineFeedCnt(piece.bufferIndex, newStart, piece.end); + const newStartOffset = this.offsetInBuffer(piece.bufferIndex, newStart); + const lf_delta = newLineFeedCnt - originalLFCnt; + const size_delta = originalStartOffset - newStartOffset; + const newLength = piece.length + size_delta; + node.piece = new Piece(piece.bufferIndex, newStart, piece.end, newLineFeedCnt, newLength); + updateTreeMetadata(this, node, size_delta, lf_delta); + } + shrinkNode(node, start, end) { + const piece = node.piece; + const originalStartPos = piece.start; + const originalEndPos = piece.end; + const oldLength = piece.length; + const oldLFCnt = piece.lineFeedCnt; + const newEnd = start; + const newLineFeedCnt = this.getLineFeedCnt(piece.bufferIndex, piece.start, newEnd); + const newLength = this.offsetInBuffer(piece.bufferIndex, start) - this.offsetInBuffer(piece.bufferIndex, originalStartPos); + node.piece = new Piece(piece.bufferIndex, piece.start, newEnd, newLineFeedCnt, newLength); + updateTreeMetadata(this, node, newLength - oldLength, newLineFeedCnt - oldLFCnt); + const newPiece = new Piece(piece.bufferIndex, end, originalEndPos, this.getLineFeedCnt(piece.bufferIndex, end, originalEndPos), this.offsetInBuffer(piece.bufferIndex, originalEndPos) - this.offsetInBuffer(piece.bufferIndex, end)); + const newNode = this.rbInsertRight(node, newPiece); + this.validateCRLFWithPrevNode(newNode); + } + appendToNode(node, value) { + if (this.adjustCarriageReturnFromNext(value, node)) { + value += "\n"; + } + const hitCRLF = this.shouldCheckCRLF() && this.startWithLF(value) && this.endWithCR(node); + const startOffset = this._buffers[0].buffer.length; + this._buffers[0].buffer += value; + const lineStarts = createLineStartsFast(value, false); + for (let i = 0; i < lineStarts.length; i++) { + lineStarts[i] += startOffset; + } + if (hitCRLF) { + const prevStartOffset = this._buffers[0].lineStarts[this._buffers[0].lineStarts.length - 2]; + this._buffers[0].lineStarts.pop(); + this._lastChangeBufferPos = { line: this._lastChangeBufferPos.line - 1, column: startOffset - prevStartOffset }; + } + this._buffers[0].lineStarts = this._buffers[0].lineStarts.concat(lineStarts.slice(1)); + const endIndex = this._buffers[0].lineStarts.length - 1; + const endColumn = this._buffers[0].buffer.length - this._buffers[0].lineStarts[endIndex]; + const newEnd = { line: endIndex, column: endColumn }; + const newLength = node.piece.length + value.length; + const oldLineFeedCnt = node.piece.lineFeedCnt; + const newLineFeedCnt = this.getLineFeedCnt(0, node.piece.start, newEnd); + const lf_delta = newLineFeedCnt - oldLineFeedCnt; + node.piece = new Piece(node.piece.bufferIndex, node.piece.start, newEnd, newLineFeedCnt, newLength); + this._lastChangeBufferPos = newEnd; + updateTreeMetadata(this, node, value.length, lf_delta); + } + nodeAt(offset) { + let x = this.root; + const cache = this._searchCache.get(offset); + if (cache) { + return { + node: cache.node, + nodeStartOffset: cache.nodeStartOffset, + remainder: offset - cache.nodeStartOffset + }; + } + let nodeStartOffset = 0; + while (x !== SENTINEL2) { + if (x.size_left > offset) { + x = x.left; + } else if (x.size_left + x.piece.length >= offset) { + nodeStartOffset += x.size_left; + const ret = { + node: x, + remainder: offset - x.size_left, + nodeStartOffset + }; + this._searchCache.set(ret); + return ret; + } else { + offset -= x.size_left + x.piece.length; + nodeStartOffset += x.size_left + x.piece.length; + x = x.right; + } + } + return null; + } + nodeAt2(lineNumber, column) { + let x = this.root; + let nodeStartOffset = 0; + while (x !== SENTINEL2) { + if (x.left !== SENTINEL2 && x.lf_left >= lineNumber - 1) { + x = x.left; + } else if (x.lf_left + x.piece.lineFeedCnt > lineNumber - 1) { + const prevAccumualtedValue = this.getAccumulatedValue(x, lineNumber - x.lf_left - 2); + const accumulatedValue = this.getAccumulatedValue(x, lineNumber - x.lf_left - 1); + nodeStartOffset += x.size_left; + return { + node: x, + remainder: Math.min(prevAccumualtedValue + column - 1, accumulatedValue), + nodeStartOffset + }; + } else if (x.lf_left + x.piece.lineFeedCnt === lineNumber - 1) { + const prevAccumualtedValue = this.getAccumulatedValue(x, lineNumber - x.lf_left - 2); + if (prevAccumualtedValue + column - 1 <= x.piece.length) { + return { + node: x, + remainder: prevAccumualtedValue + column - 1, + nodeStartOffset + }; + } else { + column -= x.piece.length - prevAccumualtedValue; + break; + } + } else { + lineNumber -= x.lf_left + x.piece.lineFeedCnt; + nodeStartOffset += x.size_left + x.piece.length; + x = x.right; + } + } + x = x.next(); + while (x !== SENTINEL2) { + if (x.piece.lineFeedCnt > 0) { + const accumulatedValue = this.getAccumulatedValue(x, 0); + const nodeStartOffset2 = this.offsetOfNode(x); + return { + node: x, + remainder: Math.min(column - 1, accumulatedValue), + nodeStartOffset: nodeStartOffset2 + }; + } else { + if (x.piece.length >= column - 1) { + const nodeStartOffset2 = this.offsetOfNode(x); + return { + node: x, + remainder: column - 1, + nodeStartOffset: nodeStartOffset2 + }; + } else { + column -= x.piece.length; + } + } + x = x.next(); + } + return null; + } + nodeCharCodeAt(node, offset) { + if (node.piece.lineFeedCnt < 1) { + return -1; + } + const buffer = this._buffers[node.piece.bufferIndex]; + const newOffset = this.offsetInBuffer(node.piece.bufferIndex, node.piece.start) + offset; + return buffer.buffer.charCodeAt(newOffset); + } + offsetOfNode(node) { + if (!node) { + return 0; + } + let pos = node.size_left; + while (node !== this.root) { + if (node.parent.right === node) { + pos += node.parent.size_left + node.parent.piece.length; + } + node = node.parent; + } + return pos; + } + // #endregion + // #region CRLF + shouldCheckCRLF() { + return !(this._EOLNormalized && this._EOL === "\n"); + } + startWithLF(val) { + if (typeof val === "string") { + return val.charCodeAt(0) === 10; + } + if (val === SENTINEL2 || val.piece.lineFeedCnt === 0) { + return false; + } + const piece = val.piece; + const lineStarts = this._buffers[piece.bufferIndex].lineStarts; + const line = piece.start.line; + const startOffset = lineStarts[line] + piece.start.column; + if (line === lineStarts.length - 1) { + return false; + } + const nextLineOffset = lineStarts[line + 1]; + if (nextLineOffset > startOffset + 1) { + return false; + } + return this._buffers[piece.bufferIndex].buffer.charCodeAt(startOffset) === 10; + } + endWithCR(val) { + if (typeof val === "string") { + return val.charCodeAt(val.length - 1) === 13; + } + if (val === SENTINEL2 || val.piece.lineFeedCnt === 0) { + return false; + } + return this.nodeCharCodeAt(val, val.piece.length - 1) === 13; + } + validateCRLFWithPrevNode(nextNode) { + if (this.shouldCheckCRLF() && this.startWithLF(nextNode)) { + const node = nextNode.prev(); + if (this.endWithCR(node)) { + this.fixCRLF(node, nextNode); + } + } + } + validateCRLFWithNextNode(node) { + if (this.shouldCheckCRLF() && this.endWithCR(node)) { + const nextNode = node.next(); + if (this.startWithLF(nextNode)) { + this.fixCRLF(node, nextNode); + } + } + } + fixCRLF(prev, next) { + const nodesToDel = []; + const lineStarts = this._buffers[prev.piece.bufferIndex].lineStarts; + let newEnd; + if (prev.piece.end.column === 0) { + newEnd = { line: prev.piece.end.line - 1, column: lineStarts[prev.piece.end.line] - lineStarts[prev.piece.end.line - 1] - 1 }; + } else { + newEnd = { line: prev.piece.end.line, column: prev.piece.end.column - 1 }; + } + const prevNewLength = prev.piece.length - 1; + const prevNewLFCnt = prev.piece.lineFeedCnt - 1; + prev.piece = new Piece(prev.piece.bufferIndex, prev.piece.start, newEnd, prevNewLFCnt, prevNewLength); + updateTreeMetadata(this, prev, -1, -1); + if (prev.piece.length === 0) { + nodesToDel.push(prev); + } + const newStart = { line: next.piece.start.line + 1, column: 0 }; + const newLength = next.piece.length - 1; + const newLineFeedCnt = this.getLineFeedCnt(next.piece.bufferIndex, newStart, next.piece.end); + next.piece = new Piece(next.piece.bufferIndex, newStart, next.piece.end, newLineFeedCnt, newLength); + updateTreeMetadata(this, next, -1, -1); + if (next.piece.length === 0) { + nodesToDel.push(next); + } + const pieces = this.createNewPieces("\r\n"); + this.rbInsertRight(prev, pieces[0]); + for (let i = 0; i < nodesToDel.length; i++) { + rbDelete(this, nodesToDel[i]); + } + } + adjustCarriageReturnFromNext(value, node) { + if (this.shouldCheckCRLF() && this.endWithCR(value)) { + const nextNode = node.next(); + if (this.startWithLF(nextNode)) { + value += "\n"; + if (nextNode.piece.length === 1) { + rbDelete(this, nextNode); + } else { + const piece = nextNode.piece; + const newStart = { line: piece.start.line + 1, column: 0 }; + const newLength = piece.length - 1; + const newLineFeedCnt = this.getLineFeedCnt(piece.bufferIndex, newStart, piece.end); + nextNode.piece = new Piece(piece.bufferIndex, newStart, piece.end, newLineFeedCnt, newLength); + updateTreeMetadata(this, nextNode, -1, -1); + } + return true; + } + } + return false; + } + // #endregion + // #endregion + // #region Tree operations + iterate(node, callback) { + if (node === SENTINEL2) { + return callback(SENTINEL2); + } + const leftRet = this.iterate(node.left, callback); + if (!leftRet) { + return leftRet; + } + return callback(node) && this.iterate(node.right, callback); + } + getNodeContent(node) { + if (node === SENTINEL2) { + return ""; + } + const buffer = this._buffers[node.piece.bufferIndex]; + const piece = node.piece; + const startOffset = this.offsetInBuffer(piece.bufferIndex, piece.start); + const endOffset = this.offsetInBuffer(piece.bufferIndex, piece.end); + const currentContent = buffer.buffer.substring(startOffset, endOffset); + return currentContent; + } + getPieceContent(piece) { + const buffer = this._buffers[piece.bufferIndex]; + const startOffset = this.offsetInBuffer(piece.bufferIndex, piece.start); + const endOffset = this.offsetInBuffer(piece.bufferIndex, piece.end); + const currentContent = buffer.buffer.substring(startOffset, endOffset); + return currentContent; + } + /** + * node node + * / \ / \ + * a b <---- a b + * / + * z + */ + rbInsertRight(node, p) { + const z = new TreeNode( + p, + 1 + /* NodeColor.Red */ + ); + z.left = SENTINEL2; + z.right = SENTINEL2; + z.parent = SENTINEL2; + z.size_left = 0; + z.lf_left = 0; + const x = this.root; + if (x === SENTINEL2) { + this.root = z; + z.color = 0; + } else if (node.right === SENTINEL2) { + node.right = z; + z.parent = node; + } else { + const nextNode = leftest2(node.right); + nextNode.left = z; + z.parent = nextNode; + } + fixInsert(this, z); + return z; + } + /** + * node node + * / \ / \ + * a b ----> a b + * \ + * z + */ + rbInsertLeft(node, p) { + const z = new TreeNode( + p, + 1 + /* NodeColor.Red */ + ); + z.left = SENTINEL2; + z.right = SENTINEL2; + z.parent = SENTINEL2; + z.size_left = 0; + z.lf_left = 0; + if (this.root === SENTINEL2) { + this.root = z; + z.color = 0; + } else if (node.left === SENTINEL2) { + node.left = z; + z.parent = node; + } else { + const prevNode = righttest(node.left); + prevNode.right = z; + z.parent = prevNode; + } + fixInsert(this, z); + return z; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.js +var PieceTreeTextBuffer; +var init_pieceTreeTextBuffer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.js"() { + init_event(); + init_strings(); + init_range(); + init_model2(); + init_pieceTreeBase(); + init_eolCounter(); + init_textChange(); + init_lifecycle(); + PieceTreeTextBuffer = class _PieceTreeTextBuffer extends Disposable { + constructor(chunks, BOM, eol, containsRTL2, containsUnusualLineTerminators2, isBasicASCII2, eolNormalized) { + super(); + this._onDidChangeContent = this._register(new Emitter()); + this._BOM = BOM; + this._mightContainNonBasicASCII = !isBasicASCII2; + this._mightContainRTL = containsRTL2; + this._mightContainUnusualLineTerminators = containsUnusualLineTerminators2; + this._pieceTree = new PieceTreeBase(chunks, eol, eolNormalized); + } + mightContainRTL() { + return this._mightContainRTL; + } + mightContainUnusualLineTerminators() { + return this._mightContainUnusualLineTerminators; + } + resetMightContainUnusualLineTerminators() { + this._mightContainUnusualLineTerminators = false; + } + mightContainNonBasicASCII() { + return this._mightContainNonBasicASCII; + } + getBOM() { + return this._BOM; + } + getEOL() { + return this._pieceTree.getEOL(); + } + createSnapshot(preserveBOM) { + return this._pieceTree.createSnapshot(preserveBOM ? this._BOM : ""); + } + getOffsetAt(lineNumber, column) { + return this._pieceTree.getOffsetAt(lineNumber, column); + } + getPositionAt(offset) { + return this._pieceTree.getPositionAt(offset); + } + getRangeAt(start, length) { + const end = start + length; + const startPosition = this.getPositionAt(start); + const endPosition = this.getPositionAt(end); + return new Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column); + } + getValueInRange(range2, eol = 0) { + if (range2.isEmpty()) { + return ""; + } + const lineEnding = this._getEndOfLine(eol); + return this._pieceTree.getValueInRange(range2, lineEnding); + } + getValueLengthInRange(range2, eol = 0) { + if (range2.isEmpty()) { + return 0; + } + if (range2.startLineNumber === range2.endLineNumber) { + return range2.endColumn - range2.startColumn; + } + const startOffset = this.getOffsetAt(range2.startLineNumber, range2.startColumn); + const endOffset = this.getOffsetAt(range2.endLineNumber, range2.endColumn); + let eolOffsetCompensation = 0; + const desiredEOL = this._getEndOfLine(eol); + const actualEOL = this.getEOL(); + if (desiredEOL.length !== actualEOL.length) { + const delta = desiredEOL.length - actualEOL.length; + const eolCount = range2.endLineNumber - range2.startLineNumber; + eolOffsetCompensation = delta * eolCount; + } + return endOffset - startOffset + eolOffsetCompensation; + } + getCharacterCountInRange(range2, eol = 0) { + if (this._mightContainNonBasicASCII) { + let result = 0; + const fromLineNumber = range2.startLineNumber; + const toLineNumber = range2.endLineNumber; + for (let lineNumber = fromLineNumber; lineNumber <= toLineNumber; lineNumber++) { + const lineContent = this.getLineContent(lineNumber); + const fromOffset = lineNumber === fromLineNumber ? range2.startColumn - 1 : 0; + const toOffset = lineNumber === toLineNumber ? range2.endColumn - 1 : lineContent.length; + for (let offset = fromOffset; offset < toOffset; offset++) { + if (isHighSurrogate(lineContent.charCodeAt(offset))) { + result = result + 1; + offset = offset + 1; + } else { + result = result + 1; + } + } + } + result += this._getEndOfLine(eol).length * (toLineNumber - fromLineNumber); + return result; + } + return this.getValueLengthInRange(range2, eol); + } + getLength() { + return this._pieceTree.getLength(); + } + getLineCount() { + return this._pieceTree.getLineCount(); + } + getLinesContent() { + return this._pieceTree.getLinesContent(); + } + getLineContent(lineNumber) { + return this._pieceTree.getLineContent(lineNumber); + } + getLineCharCode(lineNumber, index) { + return this._pieceTree.getLineCharCode(lineNumber, index); + } + getLineLength(lineNumber) { + return this._pieceTree.getLineLength(lineNumber); + } + getLineFirstNonWhitespaceColumn(lineNumber) { + const result = firstNonWhitespaceIndex(this.getLineContent(lineNumber)); + if (result === -1) { + return 0; + } + return result + 1; + } + getLineLastNonWhitespaceColumn(lineNumber) { + const result = lastNonWhitespaceIndex(this.getLineContent(lineNumber)); + if (result === -1) { + return 0; + } + return result + 2; + } + _getEndOfLine(eol) { + switch (eol) { + case 1: + return "\n"; + case 2: + return "\r\n"; + case 0: + return this.getEOL(); + default: + throw new Error("Unknown EOL preference"); + } + } + setEOL(newEOL) { + this._pieceTree.setEOL(newEOL); + } + applyEdits(rawOperations, recordTrimAutoWhitespace, computeUndoEdits) { + let mightContainRTL = this._mightContainRTL; + let mightContainUnusualLineTerminators = this._mightContainUnusualLineTerminators; + let mightContainNonBasicASCII = this._mightContainNonBasicASCII; + let canReduceOperations = true; + let operations = []; + for (let i = 0; i < rawOperations.length; i++) { + const op = rawOperations[i]; + if (canReduceOperations && op._isTracked) { + canReduceOperations = false; + } + const validatedRange = op.range; + if (op.text) { + let textMightContainNonBasicASCII = true; + if (!mightContainNonBasicASCII) { + textMightContainNonBasicASCII = !isBasicASCII(op.text); + mightContainNonBasicASCII = textMightContainNonBasicASCII; + } + if (!mightContainRTL && textMightContainNonBasicASCII) { + mightContainRTL = containsRTL(op.text); + } + if (!mightContainUnusualLineTerminators && textMightContainNonBasicASCII) { + mightContainUnusualLineTerminators = containsUnusualLineTerminators(op.text); + } + } + let validText = ""; + let eolCount = 0; + let firstLineLength = 0; + let lastLineLength = 0; + if (op.text) { + let strEOL; + [eolCount, firstLineLength, lastLineLength, strEOL] = countEOL(op.text); + const bufferEOL = this.getEOL(); + const expectedStrEOL = bufferEOL === "\r\n" ? 2 : 1; + if (strEOL === 0 || strEOL === expectedStrEOL) { + validText = op.text; + } else { + validText = op.text.replace(/\r\n|\r|\n/g, bufferEOL); + } + } + operations[i] = { + sortIndex: i, + identifier: op.identifier || null, + range: validatedRange, + rangeOffset: this.getOffsetAt(validatedRange.startLineNumber, validatedRange.startColumn), + rangeLength: this.getValueLengthInRange(validatedRange), + text: validText, + eolCount, + firstLineLength, + lastLineLength, + forceMoveMarkers: Boolean(op.forceMoveMarkers), + isAutoWhitespaceEdit: op.isAutoWhitespaceEdit || false + }; + } + operations.sort(_PieceTreeTextBuffer._sortOpsAscending); + let hasTouchingRanges = false; + for (let i = 0, count = operations.length - 1; i < count; i++) { + const rangeEnd = operations[i].range.getEndPosition(); + const nextRangeStart = operations[i + 1].range.getStartPosition(); + if (nextRangeStart.isBeforeOrEqual(rangeEnd)) { + if (nextRangeStart.isBefore(rangeEnd)) { + throw new Error("Overlapping ranges are not allowed!"); + } + hasTouchingRanges = true; + } + } + if (canReduceOperations) { + operations = this._reduceOperations(operations); + } + const reverseRanges = computeUndoEdits || recordTrimAutoWhitespace ? _PieceTreeTextBuffer._getInverseEditRanges(operations) : []; + const newTrimAutoWhitespaceCandidates = []; + if (recordTrimAutoWhitespace) { + for (let i = 0; i < operations.length; i++) { + const op = operations[i]; + const reverseRange = reverseRanges[i]; + if (op.isAutoWhitespaceEdit && op.range.isEmpty()) { + for (let lineNumber = reverseRange.startLineNumber; lineNumber <= reverseRange.endLineNumber; lineNumber++) { + let currentLineContent = ""; + if (lineNumber === reverseRange.startLineNumber) { + currentLineContent = this.getLineContent(op.range.startLineNumber); + if (firstNonWhitespaceIndex(currentLineContent) !== -1) { + continue; + } + } + newTrimAutoWhitespaceCandidates.push({ lineNumber, oldContent: currentLineContent }); + } + } + } + } + let reverseOperations = null; + if (computeUndoEdits) { + let reverseRangeDeltaOffset = 0; + reverseOperations = []; + for (let i = 0; i < operations.length; i++) { + const op = operations[i]; + const reverseRange = reverseRanges[i]; + const bufferText = this.getValueInRange(op.range); + const reverseRangeOffset = op.rangeOffset + reverseRangeDeltaOffset; + reverseRangeDeltaOffset += op.text.length - bufferText.length; + reverseOperations[i] = { + sortIndex: op.sortIndex, + identifier: op.identifier, + range: reverseRange, + text: bufferText, + textChange: new TextChange(op.rangeOffset, bufferText, reverseRangeOffset, op.text) + }; + } + if (!hasTouchingRanges) { + reverseOperations.sort((a3, b) => a3.sortIndex - b.sortIndex); + } + } + this._mightContainRTL = mightContainRTL; + this._mightContainUnusualLineTerminators = mightContainUnusualLineTerminators; + this._mightContainNonBasicASCII = mightContainNonBasicASCII; + const contentChanges = this._doApplyEdits(operations); + let trimAutoWhitespaceLineNumbers = null; + if (recordTrimAutoWhitespace && newTrimAutoWhitespaceCandidates.length > 0) { + newTrimAutoWhitespaceCandidates.sort((a3, b) => b.lineNumber - a3.lineNumber); + trimAutoWhitespaceLineNumbers = []; + for (let i = 0, len = newTrimAutoWhitespaceCandidates.length; i < len; i++) { + const lineNumber = newTrimAutoWhitespaceCandidates[i].lineNumber; + if (i > 0 && newTrimAutoWhitespaceCandidates[i - 1].lineNumber === lineNumber) { + continue; + } + const prevContent = newTrimAutoWhitespaceCandidates[i].oldContent; + const lineContent = this.getLineContent(lineNumber); + if (lineContent.length === 0 || lineContent === prevContent || firstNonWhitespaceIndex(lineContent) !== -1) { + continue; + } + trimAutoWhitespaceLineNumbers.push(lineNumber); + } + } + this._onDidChangeContent.fire(); + return new ApplyEditsResult(reverseOperations, contentChanges, trimAutoWhitespaceLineNumbers); + } + /** + * Transform operations such that they represent the same logic edit, + * but that they also do not cause OOM crashes. + */ + _reduceOperations(operations) { + if (operations.length < 1e3) { + return operations; + } + return [this._toSingleEditOperation(operations)]; + } + _toSingleEditOperation(operations) { + let forceMoveMarkers = false; + const firstEditRange = operations[0].range; + const lastEditRange = operations[operations.length - 1].range; + const entireEditRange = new Range(firstEditRange.startLineNumber, firstEditRange.startColumn, lastEditRange.endLineNumber, lastEditRange.endColumn); + let lastEndLineNumber = firstEditRange.startLineNumber; + let lastEndColumn = firstEditRange.startColumn; + const result = []; + for (let i = 0, len = operations.length; i < len; i++) { + const operation = operations[i]; + const range2 = operation.range; + forceMoveMarkers = forceMoveMarkers || operation.forceMoveMarkers; + result.push(this.getValueInRange(new Range(lastEndLineNumber, lastEndColumn, range2.startLineNumber, range2.startColumn))); + if (operation.text.length > 0) { + result.push(operation.text); + } + lastEndLineNumber = range2.endLineNumber; + lastEndColumn = range2.endColumn; + } + const text2 = result.join(""); + const [eolCount, firstLineLength, lastLineLength] = countEOL(text2); + return { + sortIndex: 0, + identifier: operations[0].identifier, + range: entireEditRange, + rangeOffset: this.getOffsetAt(entireEditRange.startLineNumber, entireEditRange.startColumn), + rangeLength: this.getValueLengthInRange( + entireEditRange, + 0 + /* EndOfLinePreference.TextDefined */ + ), + text: text2, + eolCount, + firstLineLength, + lastLineLength, + forceMoveMarkers, + isAutoWhitespaceEdit: false + }; + } + _doApplyEdits(operations) { + operations.sort(_PieceTreeTextBuffer._sortOpsDescending); + const contentChanges = []; + for (let i = 0; i < operations.length; i++) { + const op = operations[i]; + const startLineNumber = op.range.startLineNumber; + const startColumn = op.range.startColumn; + const endLineNumber = op.range.endLineNumber; + const endColumn = op.range.endColumn; + if (startLineNumber === endLineNumber && startColumn === endColumn && op.text.length === 0) { + continue; + } + if (op.text) { + this._pieceTree.delete(op.rangeOffset, op.rangeLength); + this._pieceTree.insert(op.rangeOffset, op.text, true); + } else { + this._pieceTree.delete(op.rangeOffset, op.rangeLength); + } + const contentChangeRange = new Range(startLineNumber, startColumn, endLineNumber, endColumn); + contentChanges.push({ + range: contentChangeRange, + rangeLength: op.rangeLength, + text: op.text, + rangeOffset: op.rangeOffset, + forceMoveMarkers: op.forceMoveMarkers + }); + } + return contentChanges; + } + findMatchesLineByLine(searchRange, searchData, captureMatches, limitResultCount) { + return this._pieceTree.findMatchesLineByLine(searchRange, searchData, captureMatches, limitResultCount); + } + /** + * Assumes `operations` are validated and sorted ascending + */ + static _getInverseEditRanges(operations) { + const result = []; + let prevOpEndLineNumber = 0; + let prevOpEndColumn = 0; + let prevOp = null; + for (let i = 0, len = operations.length; i < len; i++) { + const op = operations[i]; + let startLineNumber; + let startColumn; + if (prevOp) { + if (prevOp.range.endLineNumber === op.range.startLineNumber) { + startLineNumber = prevOpEndLineNumber; + startColumn = prevOpEndColumn + (op.range.startColumn - prevOp.range.endColumn); + } else { + startLineNumber = prevOpEndLineNumber + (op.range.startLineNumber - prevOp.range.endLineNumber); + startColumn = op.range.startColumn; + } + } else { + startLineNumber = op.range.startLineNumber; + startColumn = op.range.startColumn; + } + let resultRange; + if (op.text.length > 0) { + const lineCount = op.eolCount + 1; + if (lineCount === 1) { + resultRange = new Range(startLineNumber, startColumn, startLineNumber, startColumn + op.firstLineLength); + } else { + resultRange = new Range(startLineNumber, startColumn, startLineNumber + lineCount - 1, op.lastLineLength + 1); + } + } else { + resultRange = new Range(startLineNumber, startColumn, startLineNumber, startColumn); + } + prevOpEndLineNumber = resultRange.endLineNumber; + prevOpEndColumn = resultRange.endColumn; + result.push(resultRange); + prevOp = op; + } + return result; + } + static _sortOpsAscending(a3, b) { + const r = Range.compareRangesUsingEnds(a3.range, b.range); + if (r === 0) { + return a3.sortIndex - b.sortIndex; + } + return r; + } + static _sortOpsDescending(a3, b) { + const r = Range.compareRangesUsingEnds(a3.range, b.range); + if (r === 0) { + return b.sortIndex - a3.sortIndex; + } + return -r; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder.js +var PieceTreeTextBufferFactory, PieceTreeTextBufferBuilder; +var init_pieceTreeTextBufferBuilder = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder.js"() { + init_strings(); + init_pieceTreeBase(); + init_pieceTreeTextBuffer(); + PieceTreeTextBufferFactory = class { + constructor(_chunks, _bom, _cr, _lf, _crlf, _containsRTL, _containsUnusualLineTerminators, _isBasicASCII, _normalizeEOL) { + this._chunks = _chunks; + this._bom = _bom; + this._cr = _cr; + this._lf = _lf; + this._crlf = _crlf; + this._containsRTL = _containsRTL; + this._containsUnusualLineTerminators = _containsUnusualLineTerminators; + this._isBasicASCII = _isBasicASCII; + this._normalizeEOL = _normalizeEOL; + } + _getEOL(defaultEOL) { + const totalEOLCount = this._cr + this._lf + this._crlf; + const totalCRCount = this._cr + this._crlf; + if (totalEOLCount === 0) { + return defaultEOL === 1 ? "\n" : "\r\n"; + } + if (totalCRCount > totalEOLCount / 2) { + return "\r\n"; + } + return "\n"; + } + create(defaultEOL) { + const eol = this._getEOL(defaultEOL); + const chunks = this._chunks; + if (this._normalizeEOL && (eol === "\r\n" && (this._cr > 0 || this._lf > 0) || eol === "\n" && (this._cr > 0 || this._crlf > 0))) { + for (let i = 0, len = chunks.length; i < len; i++) { + const str = chunks[i].buffer.replace(/\r\n|\r|\n/g, eol); + const newLineStart = createLineStartsFast(str); + chunks[i] = new StringBuffer(str, newLineStart); + } + } + const textBuffer = new PieceTreeTextBuffer(chunks, this._bom, eol, this._containsRTL, this._containsUnusualLineTerminators, this._isBasicASCII, this._normalizeEOL); + return { textBuffer, disposable: textBuffer }; + } + }; + PieceTreeTextBufferBuilder = class { + constructor() { + this.chunks = []; + this.BOM = ""; + this._hasPreviousChar = false; + this._previousChar = 0; + this._tmpLineStarts = []; + this.cr = 0; + this.lf = 0; + this.crlf = 0; + this.containsRTL = false; + this.containsUnusualLineTerminators = false; + this.isBasicASCII = true; + } + acceptChunk(chunk) { + if (chunk.length === 0) { + return; + } + if (this.chunks.length === 0) { + if (startsWithUTF8BOM(chunk)) { + this.BOM = UTF8_BOM_CHARACTER; + chunk = chunk.substr(1); + } + } + const lastChar = chunk.charCodeAt(chunk.length - 1); + if (lastChar === 13 || lastChar >= 55296 && lastChar <= 56319) { + this._acceptChunk1(chunk.substr(0, chunk.length - 1), false); + this._hasPreviousChar = true; + this._previousChar = lastChar; + } else { + this._acceptChunk1(chunk, false); + this._hasPreviousChar = false; + this._previousChar = lastChar; + } + } + _acceptChunk1(chunk, allowEmptyStrings) { + if (!allowEmptyStrings && chunk.length === 0) { + return; + } + if (this._hasPreviousChar) { + this._acceptChunk2(String.fromCharCode(this._previousChar) + chunk); + } else { + this._acceptChunk2(chunk); + } + } + _acceptChunk2(chunk) { + const lineStarts = createLineStarts(this._tmpLineStarts, chunk); + this.chunks.push(new StringBuffer(chunk, lineStarts.lineStarts)); + this.cr += lineStarts.cr; + this.lf += lineStarts.lf; + this.crlf += lineStarts.crlf; + if (!lineStarts.isBasicASCII) { + this.isBasicASCII = false; + if (!this.containsRTL) { + this.containsRTL = containsRTL(chunk); + } + if (!this.containsUnusualLineTerminators) { + this.containsUnusualLineTerminators = containsUnusualLineTerminators(chunk); + } + } + } + finish(normalizeEOL = true) { + this._finish(); + return new PieceTreeTextBufferFactory(this.chunks, this.BOM, this.cr, this.lf, this.crlf, this.containsRTL, this.containsUnusualLineTerminators, this.isBasicASCII, normalizeEOL); + } + _finish() { + if (this.chunks.length === 0) { + this._acceptChunk1("", true); + } + if (this._hasPreviousChar) { + this._hasPreviousChar = false; + const lastChunk = this.chunks[this.chunks.length - 1]; + lastChunk.buffer += String.fromCharCode(this._previousChar); + const newLineStarts = createLineStartsFast(lastChunk.buffer); + lastChunk.lineStarts = newLineStarts; + if (this._previousChar === 13) { + this.cr++; + } + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/fixedArray.js +function arrayFill(length, value) { + const arr = []; + for (let i = 0; i < length; i++) { + arr[i] = value; + } + return arr; +} +var FixedArray; +var init_fixedArray = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/fixedArray.js"() { + init_arrays(); + FixedArray = class { + constructor(_default) { + this._default = _default; + this._store = []; + } + get(index) { + if (index < this._store.length) { + return this._store[index]; + } + return this._default; + } + set(index, value) { + while (index >= this._store.length) { + this._store[this._store.length] = this._default; + } + this._store[index] = value; + } + replace(index, oldLength, newLength) { + if (index >= this._store.length) { + return; + } + if (oldLength === 0) { + this.insert(index, newLength); + return; + } else if (newLength === 0) { + this.delete(index, oldLength); + return; + } + const before = this._store.slice(0, index); + const after2 = this._store.slice(index + oldLength); + const insertArr = arrayFill(newLength, this._default); + this._store = before.concat(insertArr, after2); + } + delete(deleteIndex, deleteCount) { + if (deleteCount === 0 || deleteIndex >= this._store.length) { + return; + } + this._store.splice(deleteIndex, deleteCount); + } + insert(insertIndex, insertCount) { + if (insertCount === 0 || insertIndex >= this._store.length) { + return; + } + const arr = []; + for (let i = 0; i < insertCount; i++) { + arr[i] = this._default; + } + this._store = arrayInsert(this._store, insertIndex, arr); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/tokens/contiguousMultilineTokens.js +var ContiguousMultilineTokens; +var init_contiguousMultilineTokens = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/tokens/contiguousMultilineTokens.js"() { + ContiguousMultilineTokens = class { + /** + * (Inclusive) start line number for these tokens. + */ + get startLineNumber() { + return this._startLineNumber; + } + /** + * (Inclusive) end line number for these tokens. + */ + get endLineNumber() { + return this._startLineNumber + this._tokens.length - 1; + } + constructor(startLineNumber, tokens) { + this._startLineNumber = startLineNumber; + this._tokens = tokens; + } + /** + * @see {@link _tokens} + */ + getLineTokens(lineNumber) { + return this._tokens[lineNumber - this._startLineNumber]; + } + appendLineTokens(lineTokens) { + this._tokens.push(lineTokens); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/tokens/contiguousMultilineTokensBuilder.js +var ContiguousMultilineTokensBuilder; +var init_contiguousMultilineTokensBuilder = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/tokens/contiguousMultilineTokensBuilder.js"() { + init_contiguousMultilineTokens(); + ContiguousMultilineTokensBuilder = class { + constructor() { + this._tokens = []; + } + add(lineNumber, lineTokens) { + if (this._tokens.length > 0) { + const last = this._tokens[this._tokens.length - 1]; + if (last.endLineNumber + 1 === lineNumber) { + last.appendLineTokens(lineTokens); + return; + } + } + this._tokens.push(new ContiguousMultilineTokens(lineNumber, [lineTokens])); + } + finalize() { + return this._tokens; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/textModelTokens.js +function safeTokenize(languageIdCodec, languageId, tokenizationSupport, text2, hasEOL, state) { + let r = null; + if (tokenizationSupport) { + try { + r = tokenizationSupport.tokenizeEncoded(text2, hasEOL, state.clone()); + } catch (e) { + onUnexpectedError(e); + } + } + if (!r) { + r = nullTokenizeEncoded(languageIdCodec.encodeLanguageId(languageId), state); + } + LineTokens.convertToEndOffset(r.tokens, text2.length); + return r; +} +var TokenizerWithStateStore, TokenizerWithStateStoreAndTextModel, TrackingTokenizationStateStore, TokenizationStateStore, RangePriorityQueueImpl, DefaultBackgroundTokenizer; +var init_textModelTokens = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/textModelTokens.js"() { + init_async(); + init_errors(); + init_platform(); + init_stopwatch(); + init_eolCounter(); + init_lineRange(); + init_offsetRange(); + init_nullTokenize(); + init_fixedArray(); + init_contiguousMultilineTokensBuilder(); + init_lineTokens(); + TokenizerWithStateStore = class { + constructor(lineCount, tokenizationSupport) { + this.tokenizationSupport = tokenizationSupport; + this.initialState = this.tokenizationSupport.getInitialState(); + this.store = new TrackingTokenizationStateStore(lineCount); + } + getStartState(lineNumber) { + return this.store.getStartState(lineNumber, this.initialState); + } + getFirstInvalidLine() { + return this.store.getFirstInvalidLine(this.initialState); + } + }; + TokenizerWithStateStoreAndTextModel = class extends TokenizerWithStateStore { + constructor(lineCount, tokenizationSupport, _textModel, _languageIdCodec) { + super(lineCount, tokenizationSupport); + this._textModel = _textModel; + this._languageIdCodec = _languageIdCodec; + } + updateTokensUntilLine(builder, lineNumber) { + const languageId = this._textModel.getLanguageId(); + while (true) { + const lineToTokenize = this.getFirstInvalidLine(); + if (!lineToTokenize || lineToTokenize.lineNumber > lineNumber) { + break; + } + const text2 = this._textModel.getLineContent(lineToTokenize.lineNumber); + const r = safeTokenize(this._languageIdCodec, languageId, this.tokenizationSupport, text2, true, lineToTokenize.startState); + builder.add(lineToTokenize.lineNumber, r.tokens); + this.store.setEndState(lineToTokenize.lineNumber, r.endState); + } + } + /** assumes state is up to date */ + getTokenTypeIfInsertingCharacter(position, character) { + const lineStartState = this.getStartState(position.lineNumber); + if (!lineStartState) { + return 0; + } + const languageId = this._textModel.getLanguageId(); + const lineContent = this._textModel.getLineContent(position.lineNumber); + const text2 = lineContent.substring(0, position.column - 1) + character + lineContent.substring(position.column - 1); + const r = safeTokenize(this._languageIdCodec, languageId, this.tokenizationSupport, text2, true, lineStartState); + const lineTokens = new LineTokens(r.tokens, text2, this._languageIdCodec); + if (lineTokens.getCount() === 0) { + return 0; + } + const tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1); + return lineTokens.getStandardTokenType(tokenIndex); + } + /** assumes state is up to date */ + tokenizeLineWithEdit(position, length, newText) { + const lineNumber = position.lineNumber; + const column = position.column; + const lineStartState = this.getStartState(lineNumber); + if (!lineStartState) { + return null; + } + const curLineContent = this._textModel.getLineContent(lineNumber); + const newLineContent = curLineContent.substring(0, column - 1) + newText + curLineContent.substring(column - 1 + length); + const languageId = this._textModel.getLanguageIdAtPosition(lineNumber, 0); + const result = safeTokenize(this._languageIdCodec, languageId, this.tokenizationSupport, newLineContent, true, lineStartState); + const lineTokens = new LineTokens(result.tokens, newLineContent, this._languageIdCodec); + return lineTokens; + } + hasAccurateTokensForLine(lineNumber) { + const firstInvalidLineNumber = this.store.getFirstInvalidEndStateLineNumberOrMax(); + return lineNumber < firstInvalidLineNumber; + } + isCheapToTokenize(lineNumber) { + const firstInvalidLineNumber = this.store.getFirstInvalidEndStateLineNumberOrMax(); + if (lineNumber < firstInvalidLineNumber) { + return true; + } + if (lineNumber === firstInvalidLineNumber && this._textModel.getLineLength(lineNumber) < 2048) { + return true; + } + return false; + } + /** + * The result is not cached. + */ + tokenizeHeuristically(builder, startLineNumber, endLineNumber) { + if (endLineNumber <= this.store.getFirstInvalidEndStateLineNumberOrMax()) { + return { heuristicTokens: false }; + } + if (startLineNumber <= this.store.getFirstInvalidEndStateLineNumberOrMax()) { + this.updateTokensUntilLine(builder, endLineNumber); + return { heuristicTokens: false }; + } + let state = this.guessStartState(startLineNumber); + const languageId = this._textModel.getLanguageId(); + for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { + const text2 = this._textModel.getLineContent(lineNumber); + const r = safeTokenize(this._languageIdCodec, languageId, this.tokenizationSupport, text2, true, state); + builder.add(lineNumber, r.tokens); + state = r.endState; + } + return { heuristicTokens: true }; + } + guessStartState(lineNumber) { + let nonWhitespaceColumn = this._textModel.getLineFirstNonWhitespaceColumn(lineNumber); + const likelyRelevantLines = []; + let initialState = null; + for (let i = lineNumber - 1; nonWhitespaceColumn > 1 && i >= 1; i--) { + const newNonWhitespaceIndex = this._textModel.getLineFirstNonWhitespaceColumn(i); + if (newNonWhitespaceIndex === 0) { + continue; + } + if (newNonWhitespaceIndex < nonWhitespaceColumn) { + likelyRelevantLines.push(this._textModel.getLineContent(i)); + nonWhitespaceColumn = newNonWhitespaceIndex; + initialState = this.getStartState(i); + if (initialState) { + break; + } + } + } + if (!initialState) { + initialState = this.tokenizationSupport.getInitialState(); + } + likelyRelevantLines.reverse(); + const languageId = this._textModel.getLanguageId(); + let state = initialState; + for (const line of likelyRelevantLines) { + const r = safeTokenize(this._languageIdCodec, languageId, this.tokenizationSupport, line, false, state); + state = r.endState; + } + return state; + } + }; + TrackingTokenizationStateStore = class { + constructor(lineCount) { + this.lineCount = lineCount; + this._tokenizationStateStore = new TokenizationStateStore(); + this._invalidEndStatesLineNumbers = new RangePriorityQueueImpl(); + this._invalidEndStatesLineNumbers.addRange(new OffsetRange(1, lineCount + 1)); + } + getEndState(lineNumber) { + return this._tokenizationStateStore.getEndState(lineNumber); + } + /** + * @returns if the end state has changed. + */ + setEndState(lineNumber, state) { + if (!state) { + throw new BugIndicatingError("Cannot set null/undefined state"); + } + this._invalidEndStatesLineNumbers.delete(lineNumber); + const r = this._tokenizationStateStore.setEndState(lineNumber, state); + if (r && lineNumber < this.lineCount) { + this._invalidEndStatesLineNumbers.addRange(new OffsetRange(lineNumber + 1, lineNumber + 2)); + } + return r; + } + acceptChange(range2, newLineCount) { + this.lineCount += newLineCount - range2.length; + this._tokenizationStateStore.acceptChange(range2, newLineCount); + this._invalidEndStatesLineNumbers.addRangeAndResize(new OffsetRange(range2.startLineNumber, range2.endLineNumberExclusive), newLineCount); + } + acceptChanges(changes) { + for (const c of changes) { + const [eolCount] = countEOL(c.text); + this.acceptChange(new LineRange(c.range.startLineNumber, c.range.endLineNumber + 1), eolCount + 1); + } + } + invalidateEndStateRange(range2) { + this._invalidEndStatesLineNumbers.addRange(new OffsetRange(range2.startLineNumber, range2.endLineNumberExclusive)); + } + getFirstInvalidEndStateLineNumber() { + return this._invalidEndStatesLineNumbers.min; + } + getFirstInvalidEndStateLineNumberOrMax() { + return this.getFirstInvalidEndStateLineNumber() || Number.MAX_SAFE_INTEGER; + } + allStatesValid() { + return this._invalidEndStatesLineNumbers.min === null; + } + getStartState(lineNumber, initialState) { + if (lineNumber === 1) { + return initialState; + } + return this.getEndState(lineNumber - 1); + } + getFirstInvalidLine(initialState) { + const lineNumber = this.getFirstInvalidEndStateLineNumber(); + if (lineNumber === null) { + return null; + } + const startState = this.getStartState(lineNumber, initialState); + if (!startState) { + throw new BugIndicatingError("Start state must be defined"); + } + return { lineNumber, startState }; + } + }; + TokenizationStateStore = class { + constructor() { + this._lineEndStates = new FixedArray(null); + } + getEndState(lineNumber) { + return this._lineEndStates.get(lineNumber); + } + setEndState(lineNumber, state) { + const oldState = this._lineEndStates.get(lineNumber); + if (oldState && oldState.equals(state)) { + return false; + } + this._lineEndStates.set(lineNumber, state); + return true; + } + acceptChange(range2, newLineCount) { + let length = range2.length; + if (newLineCount > 0 && length > 0) { + length--; + newLineCount--; + } + this._lineEndStates.replace(range2.startLineNumber, length, newLineCount); + } + }; + RangePriorityQueueImpl = class { + constructor() { + this._ranges = []; + } + get min() { + if (this._ranges.length === 0) { + return null; + } + return this._ranges[0].start; + } + delete(value) { + const idx = this._ranges.findIndex((r) => r.contains(value)); + if (idx !== -1) { + const range2 = this._ranges[idx]; + if (range2.start === value) { + if (range2.endExclusive === value + 1) { + this._ranges.splice(idx, 1); + } else { + this._ranges[idx] = new OffsetRange(value + 1, range2.endExclusive); + } + } else { + if (range2.endExclusive === value + 1) { + this._ranges[idx] = new OffsetRange(range2.start, value); + } else { + this._ranges.splice(idx, 1, new OffsetRange(range2.start, value), new OffsetRange(value + 1, range2.endExclusive)); + } + } + } + } + addRange(range2) { + OffsetRange.addRange(range2, this._ranges); + } + addRangeAndResize(range2, newLength) { + let idxFirstMightBeIntersecting = 0; + while (!(idxFirstMightBeIntersecting >= this._ranges.length || range2.start <= this._ranges[idxFirstMightBeIntersecting].endExclusive)) { + idxFirstMightBeIntersecting++; + } + let idxFirstIsAfter = idxFirstMightBeIntersecting; + while (!(idxFirstIsAfter >= this._ranges.length || range2.endExclusive < this._ranges[idxFirstIsAfter].start)) { + idxFirstIsAfter++; + } + const delta = newLength - range2.length; + for (let i = idxFirstIsAfter; i < this._ranges.length; i++) { + this._ranges[i] = this._ranges[i].delta(delta); + } + if (idxFirstMightBeIntersecting === idxFirstIsAfter) { + const newRange = new OffsetRange(range2.start, range2.start + newLength); + if (!newRange.isEmpty) { + this._ranges.splice(idxFirstMightBeIntersecting, 0, newRange); + } + } else { + const start = Math.min(range2.start, this._ranges[idxFirstMightBeIntersecting].start); + const endEx = Math.max(range2.endExclusive, this._ranges[idxFirstIsAfter - 1].endExclusive); + const newRange = new OffsetRange(start, endEx + delta); + if (!newRange.isEmpty) { + this._ranges.splice(idxFirstMightBeIntersecting, idxFirstIsAfter - idxFirstMightBeIntersecting, newRange); + } else { + this._ranges.splice(idxFirstMightBeIntersecting, idxFirstIsAfter - idxFirstMightBeIntersecting); + } + } + } + toString() { + return this._ranges.map((r) => r.toString()).join(" + "); + } + }; + DefaultBackgroundTokenizer = class { + constructor(_tokenizerWithStateStore, _backgroundTokenStore) { + this._tokenizerWithStateStore = _tokenizerWithStateStore; + this._backgroundTokenStore = _backgroundTokenStore; + this._isDisposed = false; + this._isScheduled = false; + } + dispose() { + this._isDisposed = true; + } + handleChanges() { + this._beginBackgroundTokenization(); + } + _beginBackgroundTokenization() { + if (this._isScheduled || !this._tokenizerWithStateStore._textModel.isAttachedToEditor() || !this._hasLinesToTokenize()) { + return; + } + this._isScheduled = true; + runWhenGlobalIdle((deadline) => { + this._isScheduled = false; + this._backgroundTokenizeWithDeadline(deadline); + }); + } + /** + * Tokenize until the deadline occurs, but try to yield every 1-2ms. + */ + _backgroundTokenizeWithDeadline(deadline) { + const endTime = Date.now() + deadline.timeRemaining(); + const execute = () => { + if (this._isDisposed || !this._tokenizerWithStateStore._textModel.isAttachedToEditor() || !this._hasLinesToTokenize()) { + return; + } + this._backgroundTokenizeForAtLeast1ms(); + if (Date.now() < endTime) { + setTimeout0(execute); + } else { + this._beginBackgroundTokenization(); + } + }; + execute(); + } + /** + * Tokenize for at least 1ms. + */ + _backgroundTokenizeForAtLeast1ms() { + const lineCount = this._tokenizerWithStateStore._textModel.getLineCount(); + const builder = new ContiguousMultilineTokensBuilder(); + const sw = StopWatch.create(false); + do { + if (sw.elapsed() > 1) { + break; + } + const tokenizedLineNumber = this._tokenizeOneInvalidLine(builder); + if (tokenizedLineNumber >= lineCount) { + break; + } + } while (this._hasLinesToTokenize()); + this._backgroundTokenStore.setTokens(builder.finalize()); + this.checkFinished(); + } + _hasLinesToTokenize() { + if (!this._tokenizerWithStateStore) { + return false; + } + return !this._tokenizerWithStateStore.store.allStatesValid(); + } + _tokenizeOneInvalidLine(builder) { + var _a10; + const firstInvalidLine = (_a10 = this._tokenizerWithStateStore) === null || _a10 === void 0 ? void 0 : _a10.getFirstInvalidLine(); + if (!firstInvalidLine) { + return this._tokenizerWithStateStore._textModel.getLineCount() + 1; + } + this._tokenizerWithStateStore.updateTokensUntilLine(builder, firstInvalidLine.lineNumber); + return firstInvalidLine.lineNumber; + } + checkFinished() { + if (this._isDisposed) { + return; + } + if (this._tokenizerWithStateStore.store.allStatesValid()) { + this._backgroundTokenStore.backgroundTokenizationFinished(); + } + } + requestTokens(startLineNumber, endLineNumberExclusive) { + this._tokenizerWithStateStore.store.invalidateEndStateRange(new LineRange(startLineNumber, endLineNumberExclusive)); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/tokens/contiguousTokensEditing.js +function toUint32Array(arr) { + if (arr instanceof Uint32Array) { + return arr; + } else { + return new Uint32Array(arr); + } +} +var EMPTY_LINE_TOKENS, ContiguousTokensEditing; +var init_contiguousTokensEditing = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/tokens/contiguousTokensEditing.js"() { + init_lineTokens(); + EMPTY_LINE_TOKENS = new Uint32Array(0).buffer; + ContiguousTokensEditing = class _ContiguousTokensEditing { + static deleteBeginning(lineTokens, toChIndex) { + if (lineTokens === null || lineTokens === EMPTY_LINE_TOKENS) { + return lineTokens; + } + return _ContiguousTokensEditing.delete(lineTokens, 0, toChIndex); + } + static deleteEnding(lineTokens, fromChIndex) { + if (lineTokens === null || lineTokens === EMPTY_LINE_TOKENS) { + return lineTokens; + } + const tokens = toUint32Array(lineTokens); + const lineTextLength = tokens[tokens.length - 2]; + return _ContiguousTokensEditing.delete(lineTokens, fromChIndex, lineTextLength); + } + static delete(lineTokens, fromChIndex, toChIndex) { + if (lineTokens === null || lineTokens === EMPTY_LINE_TOKENS || fromChIndex === toChIndex) { + return lineTokens; + } + const tokens = toUint32Array(lineTokens); + const tokensCount = tokens.length >>> 1; + if (fromChIndex === 0 && tokens[tokens.length - 2] === toChIndex) { + return EMPTY_LINE_TOKENS; + } + const fromTokenIndex = LineTokens.findIndexInTokensArray(tokens, fromChIndex); + const fromTokenStartOffset = fromTokenIndex > 0 ? tokens[fromTokenIndex - 1 << 1] : 0; + const fromTokenEndOffset = tokens[fromTokenIndex << 1]; + if (toChIndex < fromTokenEndOffset) { + const delta2 = toChIndex - fromChIndex; + for (let i = fromTokenIndex; i < tokensCount; i++) { + tokens[i << 1] -= delta2; + } + return lineTokens; + } + let dest; + let lastEnd; + if (fromTokenStartOffset !== fromChIndex) { + tokens[fromTokenIndex << 1] = fromChIndex; + dest = fromTokenIndex + 1 << 1; + lastEnd = fromChIndex; + } else { + dest = fromTokenIndex << 1; + lastEnd = fromTokenStartOffset; + } + const delta = toChIndex - fromChIndex; + for (let tokenIndex = fromTokenIndex + 1; tokenIndex < tokensCount; tokenIndex++) { + const tokenEndOffset = tokens[tokenIndex << 1] - delta; + if (tokenEndOffset > lastEnd) { + tokens[dest++] = tokenEndOffset; + tokens[dest++] = tokens[(tokenIndex << 1) + 1]; + lastEnd = tokenEndOffset; + } + } + if (dest === tokens.length) { + return lineTokens; + } + const tmp = new Uint32Array(dest); + tmp.set(tokens.subarray(0, dest), 0); + return tmp.buffer; + } + static append(lineTokens, _otherTokens) { + if (_otherTokens === EMPTY_LINE_TOKENS) { + return lineTokens; + } + if (lineTokens === EMPTY_LINE_TOKENS) { + return _otherTokens; + } + if (lineTokens === null) { + return lineTokens; + } + if (_otherTokens === null) { + return null; + } + const myTokens = toUint32Array(lineTokens); + const otherTokens = toUint32Array(_otherTokens); + const otherTokensCount = otherTokens.length >>> 1; + const result = new Uint32Array(myTokens.length + otherTokens.length); + result.set(myTokens, 0); + let dest = myTokens.length; + const delta = myTokens[myTokens.length - 2]; + for (let i = 0; i < otherTokensCount; i++) { + result[dest++] = otherTokens[i << 1] + delta; + result[dest++] = otherTokens[(i << 1) + 1]; + } + return result.buffer; + } + static insert(lineTokens, chIndex, textLength) { + if (lineTokens === null || lineTokens === EMPTY_LINE_TOKENS) { + return lineTokens; + } + const tokens = toUint32Array(lineTokens); + const tokensCount = tokens.length >>> 1; + let fromTokenIndex = LineTokens.findIndexInTokensArray(tokens, chIndex); + if (fromTokenIndex > 0) { + const fromTokenStartOffset = tokens[fromTokenIndex - 1 << 1]; + if (fromTokenStartOffset === chIndex) { + fromTokenIndex--; + } + } + for (let tokenIndex = fromTokenIndex; tokenIndex < tokensCount; tokenIndex++) { + tokens[tokenIndex << 1] += textLength; + } + return lineTokens; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/tokens/contiguousTokensStore.js +function getDefaultMetadata(topLevelLanguageId) { + return (topLevelLanguageId << 0 | 0 << 8 | 0 << 11 | 1 << 15 | 2 << 24 | 1024) >>> 0; +} +var ContiguousTokensStore; +var init_contiguousTokensStore = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/tokens/contiguousTokensStore.js"() { + init_arrays(); + init_position(); + init_contiguousTokensEditing(); + init_lineTokens(); + init_encodedTokenAttributes(); + ContiguousTokensStore = class _ContiguousTokensStore { + constructor(languageIdCodec) { + this._lineTokens = []; + this._len = 0; + this._languageIdCodec = languageIdCodec; + } + flush() { + this._lineTokens = []; + this._len = 0; + } + get hasTokens() { + return this._lineTokens.length > 0; + } + getTokens(topLevelLanguageId, lineIndex, lineText) { + let rawLineTokens = null; + if (lineIndex < this._len) { + rawLineTokens = this._lineTokens[lineIndex]; + } + if (rawLineTokens !== null && rawLineTokens !== EMPTY_LINE_TOKENS) { + return new LineTokens(toUint32Array(rawLineTokens), lineText, this._languageIdCodec); + } + const lineTokens = new Uint32Array(2); + lineTokens[0] = lineText.length; + lineTokens[1] = getDefaultMetadata(this._languageIdCodec.encodeLanguageId(topLevelLanguageId)); + return new LineTokens(lineTokens, lineText, this._languageIdCodec); + } + static _massageTokens(topLevelLanguageId, lineTextLength, _tokens) { + const tokens = _tokens ? toUint32Array(_tokens) : null; + if (lineTextLength === 0) { + let hasDifferentLanguageId = false; + if (tokens && tokens.length > 1) { + hasDifferentLanguageId = TokenMetadata.getLanguageId(tokens[1]) !== topLevelLanguageId; + } + if (!hasDifferentLanguageId) { + return EMPTY_LINE_TOKENS; + } + } + if (!tokens || tokens.length === 0) { + const tokens2 = new Uint32Array(2); + tokens2[0] = lineTextLength; + tokens2[1] = getDefaultMetadata(topLevelLanguageId); + return tokens2.buffer; + } + tokens[tokens.length - 2] = lineTextLength; + if (tokens.byteOffset === 0 && tokens.byteLength === tokens.buffer.byteLength) { + return tokens.buffer; + } + return tokens; + } + _ensureLine(lineIndex) { + while (lineIndex >= this._len) { + this._lineTokens[this._len] = null; + this._len++; + } + } + _deleteLines(start, deleteCount) { + if (deleteCount === 0) { + return; + } + if (start + deleteCount > this._len) { + deleteCount = this._len - start; + } + this._lineTokens.splice(start, deleteCount); + this._len -= deleteCount; + } + _insertLines(insertIndex, insertCount) { + if (insertCount === 0) { + return; + } + const lineTokens = []; + for (let i = 0; i < insertCount; i++) { + lineTokens[i] = null; + } + this._lineTokens = arrayInsert(this._lineTokens, insertIndex, lineTokens); + this._len += insertCount; + } + setTokens(topLevelLanguageId, lineIndex, lineTextLength, _tokens, checkEquality) { + const tokens = _ContiguousTokensStore._massageTokens(this._languageIdCodec.encodeLanguageId(topLevelLanguageId), lineTextLength, _tokens); + this._ensureLine(lineIndex); + const oldTokens = this._lineTokens[lineIndex]; + this._lineTokens[lineIndex] = tokens; + if (checkEquality) { + return !_ContiguousTokensStore._equals(oldTokens, tokens); + } + return false; + } + static _equals(_a10, _b4) { + if (!_a10 || !_b4) { + return !_a10 && !_b4; + } + const a3 = toUint32Array(_a10); + const b = toUint32Array(_b4); + if (a3.length !== b.length) { + return false; + } + for (let i = 0, len = a3.length; i < len; i++) { + if (a3[i] !== b[i]) { + return false; + } + } + return true; + } + //#region Editing + acceptEdit(range2, eolCount, firstLineLength) { + this._acceptDeleteRange(range2); + this._acceptInsertText(new Position(range2.startLineNumber, range2.startColumn), eolCount, firstLineLength); + } + _acceptDeleteRange(range2) { + const firstLineIndex = range2.startLineNumber - 1; + if (firstLineIndex >= this._len) { + return; + } + if (range2.startLineNumber === range2.endLineNumber) { + if (range2.startColumn === range2.endColumn) { + return; + } + this._lineTokens[firstLineIndex] = ContiguousTokensEditing.delete(this._lineTokens[firstLineIndex], range2.startColumn - 1, range2.endColumn - 1); + return; + } + this._lineTokens[firstLineIndex] = ContiguousTokensEditing.deleteEnding(this._lineTokens[firstLineIndex], range2.startColumn - 1); + const lastLineIndex = range2.endLineNumber - 1; + let lastLineTokens = null; + if (lastLineIndex < this._len) { + lastLineTokens = ContiguousTokensEditing.deleteBeginning(this._lineTokens[lastLineIndex], range2.endColumn - 1); + } + this._lineTokens[firstLineIndex] = ContiguousTokensEditing.append(this._lineTokens[firstLineIndex], lastLineTokens); + this._deleteLines(range2.startLineNumber, range2.endLineNumber - range2.startLineNumber); + } + _acceptInsertText(position, eolCount, firstLineLength) { + if (eolCount === 0 && firstLineLength === 0) { + return; + } + const lineIndex = position.lineNumber - 1; + if (lineIndex >= this._len) { + return; + } + if (eolCount === 0) { + this._lineTokens[lineIndex] = ContiguousTokensEditing.insert(this._lineTokens[lineIndex], position.column - 1, firstLineLength); + return; + } + this._lineTokens[lineIndex] = ContiguousTokensEditing.deleteEnding(this._lineTokens[lineIndex], position.column - 1); + this._lineTokens[lineIndex] = ContiguousTokensEditing.insert(this._lineTokens[lineIndex], position.column - 1, firstLineLength); + this._insertLines(position.lineNumber, eolCount); + } + //#endregion + setMultilineTokens(tokens, textModel) { + if (tokens.length === 0) { + return { changes: [] }; + } + const ranges = []; + for (let i = 0, len = tokens.length; i < len; i++) { + const element = tokens[i]; + let minChangedLineNumber = 0; + let maxChangedLineNumber = 0; + let hasChange = false; + for (let lineNumber = element.startLineNumber; lineNumber <= element.endLineNumber; lineNumber++) { + if (hasChange) { + this.setTokens(textModel.getLanguageId(), lineNumber - 1, textModel.getLineLength(lineNumber), element.getLineTokens(lineNumber), false); + maxChangedLineNumber = lineNumber; + } else { + const lineHasChange = this.setTokens(textModel.getLanguageId(), lineNumber - 1, textModel.getLineLength(lineNumber), element.getLineTokens(lineNumber), true); + if (lineHasChange) { + hasChange = true; + minChangedLineNumber = lineNumber; + maxChangedLineNumber = lineNumber; + } + } + } + if (hasChange) { + ranges.push({ fromLineNumber: minChangedLineNumber, toLineNumber: maxChangedLineNumber }); + } + } + return { changes: ranges }; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/tokens/sparseTokensStore.js +var SparseTokensStore; +var init_sparseTokensStore = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/tokens/sparseTokensStore.js"() { + init_arrays(); + init_lineTokens(); + SparseTokensStore = class _SparseTokensStore { + constructor(languageIdCodec) { + this._pieces = []; + this._isComplete = false; + this._languageIdCodec = languageIdCodec; + } + flush() { + this._pieces = []; + this._isComplete = false; + } + isEmpty() { + return this._pieces.length === 0; + } + set(pieces, isComplete) { + this._pieces = pieces || []; + this._isComplete = isComplete; + } + setPartial(_range, pieces) { + let range2 = _range; + if (pieces.length > 0) { + const _firstRange = pieces[0].getRange(); + const _lastRange = pieces[pieces.length - 1].getRange(); + if (!_firstRange || !_lastRange) { + return _range; + } + range2 = _range.plusRange(_firstRange).plusRange(_lastRange); + } + let insertPosition = null; + for (let i = 0, len = this._pieces.length; i < len; i++) { + const piece = this._pieces[i]; + if (piece.endLineNumber < range2.startLineNumber) { + continue; + } + if (piece.startLineNumber > range2.endLineNumber) { + insertPosition = insertPosition || { index: i }; + break; + } + piece.removeTokens(range2); + if (piece.isEmpty()) { + this._pieces.splice(i, 1); + i--; + len--; + continue; + } + if (piece.endLineNumber < range2.startLineNumber) { + continue; + } + if (piece.startLineNumber > range2.endLineNumber) { + insertPosition = insertPosition || { index: i }; + continue; + } + const [a3, b] = piece.split(range2); + if (a3.isEmpty()) { + insertPosition = insertPosition || { index: i }; + continue; + } + if (b.isEmpty()) { + continue; + } + this._pieces.splice(i, 1, a3, b); + i++; + len++; + insertPosition = insertPosition || { index: i }; + } + insertPosition = insertPosition || { index: this._pieces.length }; + if (pieces.length > 0) { + this._pieces = arrayInsert(this._pieces, insertPosition.index, pieces); + } + return range2; + } + isComplete() { + return this._isComplete; + } + addSparseTokens(lineNumber, aTokens) { + if (aTokens.getLineContent().length === 0) { + return aTokens; + } + const pieces = this._pieces; + if (pieces.length === 0) { + return aTokens; + } + const pieceIndex = _SparseTokensStore._findFirstPieceWithLine(pieces, lineNumber); + const bTokens = pieces[pieceIndex].getLineTokens(lineNumber); + if (!bTokens) { + return aTokens; + } + const aLen = aTokens.getCount(); + const bLen = bTokens.getCount(); + let aIndex = 0; + const result = []; + let resultLen = 0; + let lastEndOffset = 0; + const emitToken = (endOffset, metadata) => { + if (endOffset === lastEndOffset) { + return; + } + lastEndOffset = endOffset; + result[resultLen++] = endOffset; + result[resultLen++] = metadata; + }; + for (let bIndex = 0; bIndex < bLen; bIndex++) { + const bStartCharacter = bTokens.getStartCharacter(bIndex); + const bEndCharacter = bTokens.getEndCharacter(bIndex); + const bMetadata = bTokens.getMetadata(bIndex); + const bMask = ((bMetadata & 1 ? 2048 : 0) | (bMetadata & 2 ? 4096 : 0) | (bMetadata & 4 ? 8192 : 0) | (bMetadata & 8 ? 16384 : 0) | (bMetadata & 16 ? 16744448 : 0) | (bMetadata & 32 ? 4278190080 : 0)) >>> 0; + const aMask = ~bMask >>> 0; + while (aIndex < aLen && aTokens.getEndOffset(aIndex) <= bStartCharacter) { + emitToken(aTokens.getEndOffset(aIndex), aTokens.getMetadata(aIndex)); + aIndex++; + } + if (aIndex < aLen && aTokens.getStartOffset(aIndex) < bStartCharacter) { + emitToken(bStartCharacter, aTokens.getMetadata(aIndex)); + } + while (aIndex < aLen && aTokens.getEndOffset(aIndex) < bEndCharacter) { + emitToken(aTokens.getEndOffset(aIndex), aTokens.getMetadata(aIndex) & aMask | bMetadata & bMask); + aIndex++; + } + if (aIndex < aLen) { + emitToken(bEndCharacter, aTokens.getMetadata(aIndex) & aMask | bMetadata & bMask); + if (aTokens.getEndOffset(aIndex) === bEndCharacter) { + aIndex++; + } + } else { + const aMergeIndex = Math.min(Math.max(0, aIndex - 1), aLen - 1); + emitToken(bEndCharacter, aTokens.getMetadata(aMergeIndex) & aMask | bMetadata & bMask); + } + } + while (aIndex < aLen) { + emitToken(aTokens.getEndOffset(aIndex), aTokens.getMetadata(aIndex)); + aIndex++; + } + return new LineTokens(new Uint32Array(result), aTokens.getLineContent(), this._languageIdCodec); + } + static _findFirstPieceWithLine(pieces, lineNumber) { + let low = 0; + let high = pieces.length - 1; + while (low < high) { + let mid = low + Math.floor((high - low) / 2); + if (pieces[mid].endLineNumber < lineNumber) { + low = mid + 1; + } else if (pieces[mid].startLineNumber > lineNumber) { + high = mid - 1; + } else { + while (mid > low && pieces[mid - 1].startLineNumber <= lineNumber && lineNumber <= pieces[mid - 1].endLineNumber) { + mid--; + } + return mid; + } + } + return low; + } + acceptEdit(range2, eolCount, firstLineLength, lastLineLength, firstCharCode) { + for (const piece of this._pieces) { + piece.acceptEdit(range2, eolCount, firstLineLength, lastLineLength, firstCharCode); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/tokenizationTextModelPart.js +var TokenizationTextModelPart, GrammarTokens, AttachedViewHandler; +var init_tokenizationTextModelPart = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/tokenizationTextModelPart.js"() { + init_arrays(); + init_async(); + init_errors(); + init_event(); + init_lifecycle(); + init_eolCounter(); + init_lineRange(); + init_position(); + init_wordHelper(); + init_languages(); + init_textModelPart(); + init_textModelTokens(); + init_contiguousMultilineTokensBuilder(); + init_contiguousTokensStore(); + init_sparseTokensStore(); + TokenizationTextModelPart = class _TokenizationTextModelPart extends TextModelPart { + constructor(_languageService, _languageConfigurationService, _textModel, _bracketPairsTextModelPart, _languageId, _attachedViews) { + super(); + this._languageService = _languageService; + this._languageConfigurationService = _languageConfigurationService; + this._textModel = _textModel; + this._bracketPairsTextModelPart = _bracketPairsTextModelPart; + this._languageId = _languageId; + this._attachedViews = _attachedViews; + this._semanticTokens = new SparseTokensStore(this._languageService.languageIdCodec); + this._onDidChangeLanguage = this._register(new Emitter()); + this.onDidChangeLanguage = this._onDidChangeLanguage.event; + this._onDidChangeLanguageConfiguration = this._register(new Emitter()); + this.onDidChangeLanguageConfiguration = this._onDidChangeLanguageConfiguration.event; + this._onDidChangeTokens = this._register(new Emitter()); + this.onDidChangeTokens = this._onDidChangeTokens.event; + this.grammarTokens = this._register(new GrammarTokens(this._languageService.languageIdCodec, this._textModel, () => this._languageId, this._attachedViews)); + this._register(this._languageConfigurationService.onDidChange((e) => { + if (e.affects(this._languageId)) { + this._onDidChangeLanguageConfiguration.fire({}); + } + })); + this._register(this.grammarTokens.onDidChangeTokens((e) => { + this._emitModelTokensChangedEvent(e); + })); + this._register(this.grammarTokens.onDidChangeBackgroundTokenizationState((e) => { + this._bracketPairsTextModelPart.handleDidChangeBackgroundTokenizationState(); + })); + } + handleDidChangeContent(e) { + if (e.isFlush) { + this._semanticTokens.flush(); + } else if (!e.isEolChange) { + for (const c of e.changes) { + const [eolCount, firstLineLength, lastLineLength] = countEOL(c.text); + this._semanticTokens.acceptEdit( + c.range, + eolCount, + firstLineLength, + lastLineLength, + c.text.length > 0 ? c.text.charCodeAt(0) : 0 + /* CharCode.Null */ + ); + } + } + this.grammarTokens.handleDidChangeContent(e); + } + handleDidChangeAttached() { + this.grammarTokens.handleDidChangeAttached(); + } + /** + * Includes grammar and semantic tokens. + */ + getLineTokens(lineNumber) { + this.validateLineNumber(lineNumber); + const syntacticTokens = this.grammarTokens.getLineTokens(lineNumber); + return this._semanticTokens.addSparseTokens(lineNumber, syntacticTokens); + } + _emitModelTokensChangedEvent(e) { + if (!this._textModel._isDisposing()) { + this._bracketPairsTextModelPart.handleDidChangeTokens(e); + this._onDidChangeTokens.fire(e); + } + } + // #region Grammar Tokens + validateLineNumber(lineNumber) { + if (lineNumber < 1 || lineNumber > this._textModel.getLineCount()) { + throw new BugIndicatingError("Illegal value for lineNumber"); + } + } + get hasTokens() { + return this.grammarTokens.hasTokens; + } + resetTokenization() { + this.grammarTokens.resetTokenization(); + } + get backgroundTokenizationState() { + return this.grammarTokens.backgroundTokenizationState; + } + forceTokenization(lineNumber) { + this.validateLineNumber(lineNumber); + this.grammarTokens.forceTokenization(lineNumber); + } + hasAccurateTokensForLine(lineNumber) { + this.validateLineNumber(lineNumber); + return this.grammarTokens.hasAccurateTokensForLine(lineNumber); + } + isCheapToTokenize(lineNumber) { + this.validateLineNumber(lineNumber); + return this.grammarTokens.isCheapToTokenize(lineNumber); + } + tokenizeIfCheap(lineNumber) { + this.validateLineNumber(lineNumber); + this.grammarTokens.tokenizeIfCheap(lineNumber); + } + getTokenTypeIfInsertingCharacter(lineNumber, column, character) { + return this.grammarTokens.getTokenTypeIfInsertingCharacter(lineNumber, column, character); + } + tokenizeLineWithEdit(position, length, newText) { + return this.grammarTokens.tokenizeLineWithEdit(position, length, newText); + } + // #endregion + // #region Semantic Tokens + setSemanticTokens(tokens, isComplete) { + this._semanticTokens.set(tokens, isComplete); + this._emitModelTokensChangedEvent({ + semanticTokensApplied: tokens !== null, + ranges: [{ fromLineNumber: 1, toLineNumber: this._textModel.getLineCount() }] + }); + } + hasCompleteSemanticTokens() { + return this._semanticTokens.isComplete(); + } + hasSomeSemanticTokens() { + return !this._semanticTokens.isEmpty(); + } + setPartialSemanticTokens(range2, tokens) { + if (this.hasCompleteSemanticTokens()) { + return; + } + const changedRange = this._textModel.validateRange(this._semanticTokens.setPartial(range2, tokens)); + this._emitModelTokensChangedEvent({ + semanticTokensApplied: true, + ranges: [ + { + fromLineNumber: changedRange.startLineNumber, + toLineNumber: changedRange.endLineNumber + } + ] + }); + } + // #endregion + // #region Utility Methods + getWordAtPosition(_position) { + this.assertNotDisposed(); + const position = this._textModel.validatePosition(_position); + const lineContent = this._textModel.getLineContent(position.lineNumber); + const lineTokens = this.getLineTokens(position.lineNumber); + const tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1); + const [rbStartOffset, rbEndOffset] = _TokenizationTextModelPart._findLanguageBoundaries(lineTokens, tokenIndex); + const rightBiasedWord = getWordAtText(position.column, this.getLanguageConfiguration(lineTokens.getLanguageId(tokenIndex)).getWordDefinition(), lineContent.substring(rbStartOffset, rbEndOffset), rbStartOffset); + if (rightBiasedWord && rightBiasedWord.startColumn <= _position.column && _position.column <= rightBiasedWord.endColumn) { + return rightBiasedWord; + } + if (tokenIndex > 0 && rbStartOffset === position.column - 1) { + const [lbStartOffset, lbEndOffset] = _TokenizationTextModelPart._findLanguageBoundaries(lineTokens, tokenIndex - 1); + const leftBiasedWord = getWordAtText(position.column, this.getLanguageConfiguration(lineTokens.getLanguageId(tokenIndex - 1)).getWordDefinition(), lineContent.substring(lbStartOffset, lbEndOffset), lbStartOffset); + if (leftBiasedWord && leftBiasedWord.startColumn <= _position.column && _position.column <= leftBiasedWord.endColumn) { + return leftBiasedWord; + } + } + return null; + } + getLanguageConfiguration(languageId) { + return this._languageConfigurationService.getLanguageConfiguration(languageId); + } + static _findLanguageBoundaries(lineTokens, tokenIndex) { + const languageId = lineTokens.getLanguageId(tokenIndex); + let startOffset = 0; + for (let i = tokenIndex; i >= 0 && lineTokens.getLanguageId(i) === languageId; i--) { + startOffset = lineTokens.getStartOffset(i); + } + let endOffset = lineTokens.getLineContent().length; + for (let i = tokenIndex, tokenCount = lineTokens.getCount(); i < tokenCount && lineTokens.getLanguageId(i) === languageId; i++) { + endOffset = lineTokens.getEndOffset(i); + } + return [startOffset, endOffset]; + } + getWordUntilPosition(position) { + const wordAtPosition = this.getWordAtPosition(position); + if (!wordAtPosition) { + return { word: "", startColumn: position.column, endColumn: position.column }; + } + return { + word: wordAtPosition.word.substr(0, position.column - wordAtPosition.startColumn), + startColumn: wordAtPosition.startColumn, + endColumn: position.column + }; + } + // #endregion + // #region Language Id handling + getLanguageId() { + return this._languageId; + } + getLanguageIdAtPosition(lineNumber, column) { + const position = this._textModel.validatePosition(new Position(lineNumber, column)); + const lineTokens = this.getLineTokens(position.lineNumber); + return lineTokens.getLanguageId(lineTokens.findTokenIndexAtOffset(position.column - 1)); + } + setLanguageId(languageId, source = "api") { + if (this._languageId === languageId) { + return; + } + const e = { + oldLanguage: this._languageId, + newLanguage: languageId, + source + }; + this._languageId = languageId; + this._bracketPairsTextModelPart.handleDidChangeLanguage(e); + this.grammarTokens.resetTokenization(); + this._onDidChangeLanguage.fire(e); + this._onDidChangeLanguageConfiguration.fire({}); + } + }; + GrammarTokens = class extends Disposable { + get backgroundTokenizationState() { + return this._backgroundTokenizationState; + } + constructor(_languageIdCodec, _textModel, getLanguageId, attachedViews) { + super(); + this._languageIdCodec = _languageIdCodec; + this._textModel = _textModel; + this.getLanguageId = getLanguageId; + this._tokenizer = null; + this._defaultBackgroundTokenizer = null; + this._backgroundTokenizer = this._register(new MutableDisposable()); + this._tokens = new ContiguousTokensStore(this._languageIdCodec); + this._debugBackgroundTokenizer = this._register(new MutableDisposable()); + this._backgroundTokenizationState = 1; + this._onDidChangeBackgroundTokenizationState = this._register(new Emitter()); + this.onDidChangeBackgroundTokenizationState = this._onDidChangeBackgroundTokenizationState.event; + this._onDidChangeTokens = this._register(new Emitter()); + this.onDidChangeTokens = this._onDidChangeTokens.event; + this._attachedViewStates = this._register(new DisposableMap()); + this._register(TokenizationRegistry2.onDidChange((e) => { + const languageId = this.getLanguageId(); + if (e.changedLanguages.indexOf(languageId) === -1) { + return; + } + this.resetTokenization(); + })); + this.resetTokenization(); + this._register(attachedViews.onDidChangeVisibleRanges(({ view, state }) => { + if (state) { + let existing = this._attachedViewStates.get(view); + if (!existing) { + existing = new AttachedViewHandler(() => this.refreshRanges(existing.lineRanges)); + this._attachedViewStates.set(view, existing); + } + existing.handleStateChange(state); + } else { + this._attachedViewStates.deleteAndDispose(view); + } + })); + } + resetTokenization(fireTokenChangeEvent = true) { + var _a10; + this._tokens.flush(); + (_a10 = this._debugBackgroundTokens) === null || _a10 === void 0 ? void 0 : _a10.flush(); + if (this._debugBackgroundStates) { + this._debugBackgroundStates = new TrackingTokenizationStateStore(this._textModel.getLineCount()); + } + if (fireTokenChangeEvent) { + this._onDidChangeTokens.fire({ + semanticTokensApplied: false, + ranges: [ + { + fromLineNumber: 1, + toLineNumber: this._textModel.getLineCount() + } + ] + }); + } + const initializeTokenization = () => { + if (this._textModel.isTooLargeForTokenization()) { + return [null, null]; + } + const tokenizationSupport2 = TokenizationRegistry2.get(this.getLanguageId()); + if (!tokenizationSupport2) { + return [null, null]; + } + let initialState2; + try { + initialState2 = tokenizationSupport2.getInitialState(); + } catch (e) { + onUnexpectedError(e); + return [null, null]; + } + return [tokenizationSupport2, initialState2]; + }; + const [tokenizationSupport, initialState] = initializeTokenization(); + if (tokenizationSupport && initialState) { + this._tokenizer = new TokenizerWithStateStoreAndTextModel(this._textModel.getLineCount(), tokenizationSupport, this._textModel, this._languageIdCodec); + } else { + this._tokenizer = null; + } + this._backgroundTokenizer.clear(); + this._defaultBackgroundTokenizer = null; + if (this._tokenizer) { + const b = { + setTokens: (tokens) => { + this.setTokens(tokens); + }, + backgroundTokenizationFinished: () => { + if (this._backgroundTokenizationState === 2) { + return; + } + const newState = 2; + this._backgroundTokenizationState = newState; + this._onDidChangeBackgroundTokenizationState.fire(); + }, + setEndState: (lineNumber, state) => { + var _a11; + if (!this._tokenizer) { + return; + } + const firstInvalidEndStateLineNumber = this._tokenizer.store.getFirstInvalidEndStateLineNumber(); + if (firstInvalidEndStateLineNumber !== null && lineNumber >= firstInvalidEndStateLineNumber) { + (_a11 = this._tokenizer) === null || _a11 === void 0 ? void 0 : _a11.store.setEndState(lineNumber, state); + } + } + }; + if (tokenizationSupport && tokenizationSupport.createBackgroundTokenizer && !tokenizationSupport.backgroundTokenizerShouldOnlyVerifyTokens) { + this._backgroundTokenizer.value = tokenizationSupport.createBackgroundTokenizer(this._textModel, b); + } + if (!this._backgroundTokenizer.value && !this._textModel.isTooLargeForTokenization()) { + this._backgroundTokenizer.value = this._defaultBackgroundTokenizer = new DefaultBackgroundTokenizer(this._tokenizer, b); + this._defaultBackgroundTokenizer.handleChanges(); + } + if ((tokenizationSupport === null || tokenizationSupport === void 0 ? void 0 : tokenizationSupport.backgroundTokenizerShouldOnlyVerifyTokens) && tokenizationSupport.createBackgroundTokenizer) { + this._debugBackgroundTokens = new ContiguousTokensStore(this._languageIdCodec); + this._debugBackgroundStates = new TrackingTokenizationStateStore(this._textModel.getLineCount()); + this._debugBackgroundTokenizer.clear(); + this._debugBackgroundTokenizer.value = tokenizationSupport.createBackgroundTokenizer(this._textModel, { + setTokens: (tokens) => { + var _a11; + (_a11 = this._debugBackgroundTokens) === null || _a11 === void 0 ? void 0 : _a11.setMultilineTokens(tokens, this._textModel); + }, + backgroundTokenizationFinished() { + }, + setEndState: (lineNumber, state) => { + var _a11; + (_a11 = this._debugBackgroundStates) === null || _a11 === void 0 ? void 0 : _a11.setEndState(lineNumber, state); + } + }); + } else { + this._debugBackgroundTokens = void 0; + this._debugBackgroundStates = void 0; + this._debugBackgroundTokenizer.value = void 0; + } + } + this.refreshAllVisibleLineTokens(); + } + handleDidChangeAttached() { + var _a10; + (_a10 = this._defaultBackgroundTokenizer) === null || _a10 === void 0 ? void 0 : _a10.handleChanges(); + } + handleDidChangeContent(e) { + var _a10, _b4, _c2; + if (e.isFlush) { + this.resetTokenization(false); + } else if (!e.isEolChange) { + for (const c of e.changes) { + const [eolCount, firstLineLength] = countEOL(c.text); + this._tokens.acceptEdit(c.range, eolCount, firstLineLength); + (_a10 = this._debugBackgroundTokens) === null || _a10 === void 0 ? void 0 : _a10.acceptEdit(c.range, eolCount, firstLineLength); + } + (_b4 = this._debugBackgroundStates) === null || _b4 === void 0 ? void 0 : _b4.acceptChanges(e.changes); + if (this._tokenizer) { + this._tokenizer.store.acceptChanges(e.changes); + } + (_c2 = this._defaultBackgroundTokenizer) === null || _c2 === void 0 ? void 0 : _c2.handleChanges(); + } + } + setTokens(tokens) { + const { changes } = this._tokens.setMultilineTokens(tokens, this._textModel); + if (changes.length > 0) { + this._onDidChangeTokens.fire({ semanticTokensApplied: false, ranges: changes }); + } + return { changes }; + } + refreshAllVisibleLineTokens() { + const ranges = LineRange.joinMany([...this._attachedViewStates].map(([_, s]) => s.lineRanges)); + this.refreshRanges(ranges); + } + refreshRanges(ranges) { + for (const range2 of ranges) { + this.refreshRange(range2.startLineNumber, range2.endLineNumberExclusive - 1); + } + } + refreshRange(startLineNumber, endLineNumber) { + var _a10, _b4; + if (!this._tokenizer) { + return; + } + startLineNumber = Math.max(1, Math.min(this._textModel.getLineCount(), startLineNumber)); + endLineNumber = Math.min(this._textModel.getLineCount(), endLineNumber); + const builder = new ContiguousMultilineTokensBuilder(); + const { heuristicTokens } = this._tokenizer.tokenizeHeuristically(builder, startLineNumber, endLineNumber); + const changedTokens = this.setTokens(builder.finalize()); + if (heuristicTokens) { + for (const c of changedTokens.changes) { + (_a10 = this._backgroundTokenizer.value) === null || _a10 === void 0 ? void 0 : _a10.requestTokens(c.fromLineNumber, c.toLineNumber + 1); + } + } + (_b4 = this._defaultBackgroundTokenizer) === null || _b4 === void 0 ? void 0 : _b4.checkFinished(); + } + forceTokenization(lineNumber) { + var _a10, _b4; + const builder = new ContiguousMultilineTokensBuilder(); + (_a10 = this._tokenizer) === null || _a10 === void 0 ? void 0 : _a10.updateTokensUntilLine(builder, lineNumber); + this.setTokens(builder.finalize()); + (_b4 = this._defaultBackgroundTokenizer) === null || _b4 === void 0 ? void 0 : _b4.checkFinished(); + } + hasAccurateTokensForLine(lineNumber) { + if (!this._tokenizer) { + return true; + } + return this._tokenizer.hasAccurateTokensForLine(lineNumber); + } + isCheapToTokenize(lineNumber) { + if (!this._tokenizer) { + return true; + } + return this._tokenizer.isCheapToTokenize(lineNumber); + } + tokenizeIfCheap(lineNumber) { + if (this.isCheapToTokenize(lineNumber)) { + this.forceTokenization(lineNumber); + } + } + getLineTokens(lineNumber) { + var _a10; + const lineText = this._textModel.getLineContent(lineNumber); + const result = this._tokens.getTokens(this._textModel.getLanguageId(), lineNumber - 1, lineText); + if (this._debugBackgroundTokens && this._debugBackgroundStates && this._tokenizer) { + if (this._debugBackgroundStates.getFirstInvalidEndStateLineNumberOrMax() > lineNumber && this._tokenizer.store.getFirstInvalidEndStateLineNumberOrMax() > lineNumber) { + const backgroundResult = this._debugBackgroundTokens.getTokens(this._textModel.getLanguageId(), lineNumber - 1, lineText); + if (!result.equals(backgroundResult) && ((_a10 = this._debugBackgroundTokenizer.value) === null || _a10 === void 0 ? void 0 : _a10.reportMismatchingTokens)) { + this._debugBackgroundTokenizer.value.reportMismatchingTokens(lineNumber); + } + } + } + return result; + } + getTokenTypeIfInsertingCharacter(lineNumber, column, character) { + if (!this._tokenizer) { + return 0; + } + const position = this._textModel.validatePosition(new Position(lineNumber, column)); + this.forceTokenization(position.lineNumber); + return this._tokenizer.getTokenTypeIfInsertingCharacter(position, character); + } + tokenizeLineWithEdit(position, length, newText) { + if (!this._tokenizer) { + return null; + } + const validatedPosition = this._textModel.validatePosition(position); + this.forceTokenization(validatedPosition.lineNumber); + return this._tokenizer.tokenizeLineWithEdit(validatedPosition, length, newText); + } + get hasTokens() { + return this._tokens.hasTokens; + } + }; + AttachedViewHandler = class extends Disposable { + get lineRanges() { + return this._lineRanges; + } + constructor(_refreshTokens) { + super(); + this._refreshTokens = _refreshTokens; + this.runner = this._register(new RunOnceScheduler(() => this.update(), 50)); + this._computedLineRanges = []; + this._lineRanges = []; + } + update() { + if (equals(this._computedLineRanges, this._lineRanges, (a3, b) => a3.equals(b))) { + return; + } + this._computedLineRanges = this._lineRanges; + this._refreshTokens(); + } + handleStateChange(state) { + this._lineRanges = state.visibleLineRanges; + if (state.stabilized) { + this.runner.cancel(); + this.update(); + } else { + this.runner.schedule(); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/undoRedo/common/undoRedo.js +var IUndoRedoService, ResourceEditStackSnapshot, UndoRedoGroup, UndoRedoSource; +var init_undoRedo = __esm({ + "node_modules/monaco-editor/esm/vs/platform/undoRedo/common/undoRedo.js"() { + init_instantiation(); + IUndoRedoService = createDecorator("undoRedoService"); + ResourceEditStackSnapshot = class { + constructor(resource, elements) { + this.resource = resource; + this.elements = elements; + } + }; + UndoRedoGroup = class _UndoRedoGroup { + constructor() { + this.id = _UndoRedoGroup._ID++; + this.order = 1; + } + nextOrder() { + if (this.id === 0) { + return 0; + } + return this.order++; + } + }; + UndoRedoGroup._ID = 0; + UndoRedoGroup.None = new UndoRedoGroup(); + UndoRedoSource = class _UndoRedoSource { + constructor() { + this.id = _UndoRedoSource._ID++; + this.order = 1; + } + nextOrder() { + if (this.id === 0) { + return 0; + } + return this.order++; + } + }; + UndoRedoSource._ID = 0; + UndoRedoSource.None = new UndoRedoSource(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/textModel.js +function createTextBufferFactory(text2) { + const builder = new PieceTreeTextBufferBuilder(); + builder.acceptChunk(text2); + return builder.finish(); +} +function createTextBufferFactoryFromSnapshot(snapshot) { + const builder = new PieceTreeTextBufferBuilder(); + let chunk; + while (typeof (chunk = snapshot.read()) === "string") { + builder.acceptChunk(chunk); + } + return builder.finish(); +} +function createTextBuffer(value, defaultEOL) { + let factory; + if (typeof value === "string") { + factory = createTextBufferFactory(value); + } else if (isITextSnapshot(value)) { + factory = createTextBufferFactoryFromSnapshot(value); + } else { + factory = value; + } + return factory.create(defaultEOL); +} +function indentOfLine(line) { + let indent = 0; + for (const c of line) { + if (c === " " || c === " ") { + indent++; + } else { + break; + } + } + return indent; +} +function isNodeInOverviewRuler(node) { + return node.options.overviewRuler && node.options.overviewRuler.color ? true : false; +} +function isOptionsInjectedText(options2) { + return !!options2.after || !!options2.before; +} +function isNodeInjectedText(node) { + return !!node.options.after || !!node.options.before; +} +function cleanClassName(className) { + return className.replace(/[^a-z0-9\-_]/gi, " "); +} +function _normalizeOptions(options2) { + if (options2 instanceof ModelDecorationOptions) { + return options2; + } + return ModelDecorationOptions.createDynamic(options2); +} +var __decorate12, __param11, TextModel_1, MODEL_ID, LIMIT_FIND_COUNT2, LONG_LINE_BOUNDARY, TextModelSnapshot, invalidFunc2, TextModel, DecorationsTrees, DecorationOptions, ModelDecorationOverviewRulerOptions, ModelDecorationGlyphMarginOptions, ModelDecorationMinimapOptions, ModelDecorationInjectedTextOptions, ModelDecorationOptions, TRACKED_RANGE_OPTIONS, DidChangeDecorationsEmitter, DidChangeContentEmitter, AttachedViews, AttachedViewImpl; +var init_textModel = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/textModel.js"() { + init_arrays(); + init_color(); + init_errors(); + init_event(); + init_lifecycle(); + init_strings(); + init_uri(); + init_eolCounter(); + init_indentation(); + init_lineRange(); + init_position(); + init_range(); + init_selection(); + init_textModelDefaults(); + init_language(); + init_languageConfigurationRegistry(); + init_model2(); + init_bracketPairsImpl(); + init_colorizedBracketPairsDecorationProvider(); + init_editStack(); + init_guidesTextModelPart(); + init_indentationGuesser(); + init_intervalTree(); + init_pieceTreeTextBuffer(); + init_pieceTreeTextBufferBuilder(); + init_textModelSearch(); + init_tokenizationTextModelPart(); + init_textModelEvents(); + init_undoRedo(); + __decorate12 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param11 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + MODEL_ID = 0; + LIMIT_FIND_COUNT2 = 999; + LONG_LINE_BOUNDARY = 1e4; + TextModelSnapshot = class { + constructor(source) { + this._source = source; + this._eos = false; + } + read() { + if (this._eos) { + return null; + } + const result = []; + let resultCnt = 0; + let resultLength = 0; + do { + const tmp = this._source.read(); + if (tmp === null) { + this._eos = true; + if (resultCnt === 0) { + return null; + } else { + return result.join(""); + } + } + if (tmp.length > 0) { + result[resultCnt++] = tmp; + resultLength += tmp.length; + } + if (resultLength >= 64 * 1024) { + return result.join(""); + } + } while (true); + } + }; + invalidFunc2 = () => { + throw new Error(`Invalid change accessor`); + }; + TextModel = TextModel_1 = class TextModel2 extends Disposable { + static resolveOptions(textBuffer, options2) { + if (options2.detectIndentation) { + const guessedIndentation = guessIndentation(textBuffer, options2.tabSize, options2.insertSpaces); + return new TextModelResolvedOptions({ + tabSize: guessedIndentation.tabSize, + indentSize: "tabSize", + // TODO@Alex: guess indentSize independent of tabSize + insertSpaces: guessedIndentation.insertSpaces, + trimAutoWhitespace: options2.trimAutoWhitespace, + defaultEOL: options2.defaultEOL, + bracketPairColorizationOptions: options2.bracketPairColorizationOptions + }); + } + return new TextModelResolvedOptions(options2); + } + get onDidChangeLanguage() { + return this._tokenizationTextModelPart.onDidChangeLanguage; + } + get onDidChangeLanguageConfiguration() { + return this._tokenizationTextModelPart.onDidChangeLanguageConfiguration; + } + get onDidChangeTokens() { + return this._tokenizationTextModelPart.onDidChangeTokens; + } + onDidChangeContent(listener) { + return this._eventEmitter.slowEvent((e) => listener(e.contentChangedEvent)); + } + onDidChangeContentOrInjectedText(listener) { + return combinedDisposable(this._eventEmitter.fastEvent((e) => listener(e)), this._onDidChangeInjectedText.event((e) => listener(e))); + } + _isDisposing() { + return this.__isDisposing; + } + get tokenization() { + return this._tokenizationTextModelPart; + } + get bracketPairs() { + return this._bracketPairs; + } + get guides() { + return this._guidesTextModelPart; + } + constructor(source, languageIdOrSelection, creationOptions, associatedResource = null, _undoRedoService, _languageService, _languageConfigurationService) { + super(); + this._undoRedoService = _undoRedoService; + this._languageService = _languageService; + this._languageConfigurationService = _languageConfigurationService; + this._onWillDispose = this._register(new Emitter()); + this.onWillDispose = this._onWillDispose.event; + this._onDidChangeDecorations = this._register(new DidChangeDecorationsEmitter((affectedInjectedTextLines) => this.handleBeforeFireDecorationsChangedEvent(affectedInjectedTextLines))); + this.onDidChangeDecorations = this._onDidChangeDecorations.event; + this._onDidChangeOptions = this._register(new Emitter()); + this.onDidChangeOptions = this._onDidChangeOptions.event; + this._onDidChangeAttached = this._register(new Emitter()); + this.onDidChangeAttached = this._onDidChangeAttached.event; + this._onDidChangeInjectedText = this._register(new Emitter()); + this._eventEmitter = this._register(new DidChangeContentEmitter()); + this._languageSelectionListener = this._register(new MutableDisposable()); + this._deltaDecorationCallCnt = 0; + this._attachedViews = new AttachedViews(); + MODEL_ID++; + this.id = "$model" + MODEL_ID; + this.isForSimpleWidget = creationOptions.isForSimpleWidget; + if (typeof associatedResource === "undefined" || associatedResource === null) { + this._associatedResource = URI.parse("inmemory://model/" + MODEL_ID); + } else { + this._associatedResource = associatedResource; + } + this._attachedEditorCount = 0; + const { textBuffer, disposable } = createTextBuffer(source, creationOptions.defaultEOL); + this._buffer = textBuffer; + this._bufferDisposable = disposable; + this._options = TextModel_1.resolveOptions(this._buffer, creationOptions); + const languageId = typeof languageIdOrSelection === "string" ? languageIdOrSelection : languageIdOrSelection.languageId; + if (typeof languageIdOrSelection !== "string") { + this._languageSelectionListener.value = languageIdOrSelection.onDidChange(() => this._setLanguage(languageIdOrSelection.languageId)); + } + this._bracketPairs = this._register(new BracketPairsTextModelPart(this, this._languageConfigurationService)); + this._guidesTextModelPart = this._register(new GuidesTextModelPart(this, this._languageConfigurationService)); + this._decorationProvider = this._register(new ColorizedBracketPairsDecorationProvider(this)); + this._tokenizationTextModelPart = new TokenizationTextModelPart(this._languageService, this._languageConfigurationService, this, this._bracketPairs, languageId, this._attachedViews); + const bufferLineCount = this._buffer.getLineCount(); + const bufferTextLength = this._buffer.getValueLengthInRange( + new Range(1, 1, bufferLineCount, this._buffer.getLineLength(bufferLineCount) + 1), + 0 + /* model.EndOfLinePreference.TextDefined */ + ); + if (creationOptions.largeFileOptimizations) { + this._isTooLargeForTokenization = bufferTextLength > TextModel_1.LARGE_FILE_SIZE_THRESHOLD || bufferLineCount > TextModel_1.LARGE_FILE_LINE_COUNT_THRESHOLD; + this._isTooLargeForHeapOperation = bufferTextLength > TextModel_1.LARGE_FILE_HEAP_OPERATION_THRESHOLD; + } else { + this._isTooLargeForTokenization = false; + this._isTooLargeForHeapOperation = false; + } + this._isTooLargeForSyncing = bufferTextLength > TextModel_1._MODEL_SYNC_LIMIT; + this._versionId = 1; + this._alternativeVersionId = 1; + this._initialUndoRedoSnapshot = null; + this._isDisposed = false; + this.__isDisposing = false; + this._instanceId = singleLetterHash(MODEL_ID); + this._lastDecorationId = 0; + this._decorations = /* @__PURE__ */ Object.create(null); + this._decorationsTree = new DecorationsTrees(); + this._commandManager = new EditStack(this, this._undoRedoService); + this._isUndoing = false; + this._isRedoing = false; + this._trimAutoWhitespaceLines = null; + this._register(this._decorationProvider.onDidChange(() => { + this._onDidChangeDecorations.beginDeferredEmit(); + this._onDidChangeDecorations.fire(); + this._onDidChangeDecorations.endDeferredEmit(); + })); + this._languageService.requestRichLanguageFeatures(languageId); + } + dispose() { + this.__isDisposing = true; + this._onWillDispose.fire(); + this._tokenizationTextModelPart.dispose(); + this._isDisposed = true; + super.dispose(); + this._bufferDisposable.dispose(); + this.__isDisposing = false; + const emptyDisposedTextBuffer = new PieceTreeTextBuffer([], "", "\n", false, false, true, true); + emptyDisposedTextBuffer.dispose(); + this._buffer = emptyDisposedTextBuffer; + this._bufferDisposable = Disposable.None; + } + _assertNotDisposed() { + if (this._isDisposed) { + throw new Error("Model is disposed!"); + } + } + _emitContentChangedEvent(rawChange, change) { + if (this.__isDisposing) { + return; + } + this._tokenizationTextModelPart.handleDidChangeContent(change); + this._bracketPairs.handleDidChangeContent(change); + this._eventEmitter.fire(new InternalModelContentChangeEvent(rawChange, change)); + } + setValue(value) { + this._assertNotDisposed(); + if (value === null || value === void 0) { + throw illegalArgument(); + } + const { textBuffer, disposable } = createTextBuffer(value, this._options.defaultEOL); + this._setValueFromTextBuffer(textBuffer, disposable); + } + _createContentChanged2(range2, rangeOffset, rangeLength, text2, isUndoing, isRedoing, isFlush, isEolChange) { + return { + changes: [{ + range: range2, + rangeOffset, + rangeLength, + text: text2 + }], + eol: this._buffer.getEOL(), + isEolChange, + versionId: this.getVersionId(), + isUndoing, + isRedoing, + isFlush + }; + } + _setValueFromTextBuffer(textBuffer, textBufferDisposable) { + this._assertNotDisposed(); + const oldFullModelRange = this.getFullModelRange(); + const oldModelValueLength = this.getValueLengthInRange(oldFullModelRange); + const endLineNumber = this.getLineCount(); + const endColumn = this.getLineMaxColumn(endLineNumber); + this._buffer = textBuffer; + this._bufferDisposable.dispose(); + this._bufferDisposable = textBufferDisposable; + this._increaseVersionId(); + this._decorations = /* @__PURE__ */ Object.create(null); + this._decorationsTree = new DecorationsTrees(); + this._commandManager.clear(); + this._trimAutoWhitespaceLines = null; + this._emitContentChangedEvent(new ModelRawContentChangedEvent([ + new ModelRawFlush() + ], this._versionId, false, false), this._createContentChanged2(new Range(1, 1, endLineNumber, endColumn), 0, oldModelValueLength, this.getValue(), false, false, true, false)); + } + setEOL(eol) { + this._assertNotDisposed(); + const newEOL = eol === 1 ? "\r\n" : "\n"; + if (this._buffer.getEOL() === newEOL) { + return; + } + const oldFullModelRange = this.getFullModelRange(); + const oldModelValueLength = this.getValueLengthInRange(oldFullModelRange); + const endLineNumber = this.getLineCount(); + const endColumn = this.getLineMaxColumn(endLineNumber); + this._onBeforeEOLChange(); + this._buffer.setEOL(newEOL); + this._increaseVersionId(); + this._onAfterEOLChange(); + this._emitContentChangedEvent(new ModelRawContentChangedEvent([ + new ModelRawEOLChanged() + ], this._versionId, false, false), this._createContentChanged2(new Range(1, 1, endLineNumber, endColumn), 0, oldModelValueLength, this.getValue(), false, false, false, true)); + } + _onBeforeEOLChange() { + this._decorationsTree.ensureAllNodesHaveRanges(this); + } + _onAfterEOLChange() { + const versionId = this.getVersionId(); + const allDecorations = this._decorationsTree.collectNodesPostOrder(); + for (let i = 0, len = allDecorations.length; i < len; i++) { + const node = allDecorations[i]; + const range2 = node.range; + const delta = node.cachedAbsoluteStart - node.start; + const startOffset = this._buffer.getOffsetAt(range2.startLineNumber, range2.startColumn); + const endOffset = this._buffer.getOffsetAt(range2.endLineNumber, range2.endColumn); + node.cachedAbsoluteStart = startOffset; + node.cachedAbsoluteEnd = endOffset; + node.cachedVersionId = versionId; + node.start = startOffset - delta; + node.end = endOffset - delta; + recomputeMaxEnd(node); + } + } + onBeforeAttached() { + this._attachedEditorCount++; + if (this._attachedEditorCount === 1) { + this._tokenizationTextModelPart.handleDidChangeAttached(); + this._onDidChangeAttached.fire(void 0); + } + return this._attachedViews.attachView(); + } + onBeforeDetached(view) { + this._attachedEditorCount--; + if (this._attachedEditorCount === 0) { + this._tokenizationTextModelPart.handleDidChangeAttached(); + this._onDidChangeAttached.fire(void 0); + } + this._attachedViews.detachView(view); + } + isAttachedToEditor() { + return this._attachedEditorCount > 0; + } + getAttachedEditorCount() { + return this._attachedEditorCount; + } + isTooLargeForSyncing() { + return this._isTooLargeForSyncing; + } + isTooLargeForTokenization() { + return this._isTooLargeForTokenization; + } + isTooLargeForHeapOperation() { + return this._isTooLargeForHeapOperation; + } + isDisposed() { + return this._isDisposed; + } + isDominatedByLongLines() { + this._assertNotDisposed(); + if (this.isTooLargeForTokenization()) { + return false; + } + let smallLineCharCount = 0; + let longLineCharCount = 0; + const lineCount = this._buffer.getLineCount(); + for (let lineNumber = 1; lineNumber <= lineCount; lineNumber++) { + const lineLength = this._buffer.getLineLength(lineNumber); + if (lineLength >= LONG_LINE_BOUNDARY) { + longLineCharCount += lineLength; + } else { + smallLineCharCount += lineLength; + } + } + return longLineCharCount > smallLineCharCount; + } + get uri() { + return this._associatedResource; + } + //#region Options + getOptions() { + this._assertNotDisposed(); + return this._options; + } + getFormattingOptions() { + return { + tabSize: this._options.indentSize, + insertSpaces: this._options.insertSpaces + }; + } + updateOptions(_newOpts) { + this._assertNotDisposed(); + const tabSize = typeof _newOpts.tabSize !== "undefined" ? _newOpts.tabSize : this._options.tabSize; + const indentSize = typeof _newOpts.indentSize !== "undefined" ? _newOpts.indentSize : this._options.originalIndentSize; + const insertSpaces = typeof _newOpts.insertSpaces !== "undefined" ? _newOpts.insertSpaces : this._options.insertSpaces; + const trimAutoWhitespace = typeof _newOpts.trimAutoWhitespace !== "undefined" ? _newOpts.trimAutoWhitespace : this._options.trimAutoWhitespace; + const bracketPairColorizationOptions = typeof _newOpts.bracketColorizationOptions !== "undefined" ? _newOpts.bracketColorizationOptions : this._options.bracketPairColorizationOptions; + const newOpts = new TextModelResolvedOptions({ + tabSize, + indentSize, + insertSpaces, + defaultEOL: this._options.defaultEOL, + trimAutoWhitespace, + bracketPairColorizationOptions + }); + if (this._options.equals(newOpts)) { + return; + } + const e = this._options.createChangeEvent(newOpts); + this._options = newOpts; + this._bracketPairs.handleDidChangeOptions(e); + this._decorationProvider.handleDidChangeOptions(e); + this._onDidChangeOptions.fire(e); + } + detectIndentation(defaultInsertSpaces, defaultTabSize) { + this._assertNotDisposed(); + const guessedIndentation = guessIndentation(this._buffer, defaultTabSize, defaultInsertSpaces); + this.updateOptions({ + insertSpaces: guessedIndentation.insertSpaces, + tabSize: guessedIndentation.tabSize, + indentSize: guessedIndentation.tabSize + // TODO@Alex: guess indentSize independent of tabSize + }); + } + normalizeIndentation(str) { + this._assertNotDisposed(); + return normalizeIndentation(str, this._options.indentSize, this._options.insertSpaces); + } + //#endregion + //#region Reading + getVersionId() { + this._assertNotDisposed(); + return this._versionId; + } + mightContainRTL() { + return this._buffer.mightContainRTL(); + } + mightContainUnusualLineTerminators() { + return this._buffer.mightContainUnusualLineTerminators(); + } + removeUnusualLineTerminators(selections = null) { + const matches2 = this.findMatches( + UNUSUAL_LINE_TERMINATORS.source, + false, + true, + false, + null, + false, + 1073741824 + /* Constants.MAX_SAFE_SMALL_INTEGER */ + ); + this._buffer.resetMightContainUnusualLineTerminators(); + this.pushEditOperations(selections, matches2.map((m) => ({ range: m.range, text: null })), () => null); + } + mightContainNonBasicASCII() { + return this._buffer.mightContainNonBasicASCII(); + } + getAlternativeVersionId() { + this._assertNotDisposed(); + return this._alternativeVersionId; + } + getInitialUndoRedoSnapshot() { + this._assertNotDisposed(); + return this._initialUndoRedoSnapshot; + } + getOffsetAt(rawPosition) { + this._assertNotDisposed(); + const position = this._validatePosition( + rawPosition.lineNumber, + rawPosition.column, + 0 + /* StringOffsetValidationType.Relaxed */ + ); + return this._buffer.getOffsetAt(position.lineNumber, position.column); + } + getPositionAt(rawOffset) { + this._assertNotDisposed(); + const offset = Math.min(this._buffer.getLength(), Math.max(0, rawOffset)); + return this._buffer.getPositionAt(offset); + } + _increaseVersionId() { + this._versionId = this._versionId + 1; + this._alternativeVersionId = this._versionId; + } + _overwriteVersionId(versionId) { + this._versionId = versionId; + } + _overwriteAlternativeVersionId(newAlternativeVersionId) { + this._alternativeVersionId = newAlternativeVersionId; + } + _overwriteInitialUndoRedoSnapshot(newInitialUndoRedoSnapshot) { + this._initialUndoRedoSnapshot = newInitialUndoRedoSnapshot; + } + getValue(eol, preserveBOM = false) { + this._assertNotDisposed(); + if (this.isTooLargeForHeapOperation()) { + throw new BugIndicatingError("Operation would exceed heap memory limits"); + } + const fullModelRange = this.getFullModelRange(); + const fullModelValue = this.getValueInRange(fullModelRange, eol); + if (preserveBOM) { + return this._buffer.getBOM() + fullModelValue; + } + return fullModelValue; + } + createSnapshot(preserveBOM = false) { + return new TextModelSnapshot(this._buffer.createSnapshot(preserveBOM)); + } + getValueLength(eol, preserveBOM = false) { + this._assertNotDisposed(); + const fullModelRange = this.getFullModelRange(); + const fullModelValue = this.getValueLengthInRange(fullModelRange, eol); + if (preserveBOM) { + return this._buffer.getBOM().length + fullModelValue; + } + return fullModelValue; + } + getValueInRange(rawRange, eol = 0) { + this._assertNotDisposed(); + return this._buffer.getValueInRange(this.validateRange(rawRange), eol); + } + getValueLengthInRange(rawRange, eol = 0) { + this._assertNotDisposed(); + return this._buffer.getValueLengthInRange(this.validateRange(rawRange), eol); + } + getCharacterCountInRange(rawRange, eol = 0) { + this._assertNotDisposed(); + return this._buffer.getCharacterCountInRange(this.validateRange(rawRange), eol); + } + getLineCount() { + this._assertNotDisposed(); + return this._buffer.getLineCount(); + } + getLineContent(lineNumber) { + this._assertNotDisposed(); + if (lineNumber < 1 || lineNumber > this.getLineCount()) { + throw new BugIndicatingError("Illegal value for lineNumber"); + } + return this._buffer.getLineContent(lineNumber); + } + getLineLength(lineNumber) { + this._assertNotDisposed(); + if (lineNumber < 1 || lineNumber > this.getLineCount()) { + throw new BugIndicatingError("Illegal value for lineNumber"); + } + return this._buffer.getLineLength(lineNumber); + } + getLinesContent() { + this._assertNotDisposed(); + if (this.isTooLargeForHeapOperation()) { + throw new BugIndicatingError("Operation would exceed heap memory limits"); + } + return this._buffer.getLinesContent(); + } + getEOL() { + this._assertNotDisposed(); + return this._buffer.getEOL(); + } + getEndOfLineSequence() { + this._assertNotDisposed(); + return this._buffer.getEOL() === "\n" ? 0 : 1; + } + getLineMinColumn(lineNumber) { + this._assertNotDisposed(); + return 1; + } + getLineMaxColumn(lineNumber) { + this._assertNotDisposed(); + if (lineNumber < 1 || lineNumber > this.getLineCount()) { + throw new BugIndicatingError("Illegal value for lineNumber"); + } + return this._buffer.getLineLength(lineNumber) + 1; + } + getLineFirstNonWhitespaceColumn(lineNumber) { + this._assertNotDisposed(); + if (lineNumber < 1 || lineNumber > this.getLineCount()) { + throw new BugIndicatingError("Illegal value for lineNumber"); + } + return this._buffer.getLineFirstNonWhitespaceColumn(lineNumber); + } + getLineLastNonWhitespaceColumn(lineNumber) { + this._assertNotDisposed(); + if (lineNumber < 1 || lineNumber > this.getLineCount()) { + throw new BugIndicatingError("Illegal value for lineNumber"); + } + return this._buffer.getLineLastNonWhitespaceColumn(lineNumber); + } + /** + * Validates `range` is within buffer bounds, but allows it to sit in between surrogate pairs, etc. + * Will try to not allocate if possible. + */ + _validateRangeRelaxedNoAllocations(range2) { + const linesCount = this._buffer.getLineCount(); + const initialStartLineNumber = range2.startLineNumber; + const initialStartColumn = range2.startColumn; + let startLineNumber = Math.floor(typeof initialStartLineNumber === "number" && !isNaN(initialStartLineNumber) ? initialStartLineNumber : 1); + let startColumn = Math.floor(typeof initialStartColumn === "number" && !isNaN(initialStartColumn) ? initialStartColumn : 1); + if (startLineNumber < 1) { + startLineNumber = 1; + startColumn = 1; + } else if (startLineNumber > linesCount) { + startLineNumber = linesCount; + startColumn = this.getLineMaxColumn(startLineNumber); + } else { + if (startColumn <= 1) { + startColumn = 1; + } else { + const maxColumn = this.getLineMaxColumn(startLineNumber); + if (startColumn >= maxColumn) { + startColumn = maxColumn; + } + } + } + const initialEndLineNumber = range2.endLineNumber; + const initialEndColumn = range2.endColumn; + let endLineNumber = Math.floor(typeof initialEndLineNumber === "number" && !isNaN(initialEndLineNumber) ? initialEndLineNumber : 1); + let endColumn = Math.floor(typeof initialEndColumn === "number" && !isNaN(initialEndColumn) ? initialEndColumn : 1); + if (endLineNumber < 1) { + endLineNumber = 1; + endColumn = 1; + } else if (endLineNumber > linesCount) { + endLineNumber = linesCount; + endColumn = this.getLineMaxColumn(endLineNumber); + } else { + if (endColumn <= 1) { + endColumn = 1; + } else { + const maxColumn = this.getLineMaxColumn(endLineNumber); + if (endColumn >= maxColumn) { + endColumn = maxColumn; + } + } + } + if (initialStartLineNumber === startLineNumber && initialStartColumn === startColumn && initialEndLineNumber === endLineNumber && initialEndColumn === endColumn && range2 instanceof Range && !(range2 instanceof Selection)) { + return range2; + } + return new Range(startLineNumber, startColumn, endLineNumber, endColumn); + } + _isValidPosition(lineNumber, column, validationType) { + if (typeof lineNumber !== "number" || typeof column !== "number") { + return false; + } + if (isNaN(lineNumber) || isNaN(column)) { + return false; + } + if (lineNumber < 1 || column < 1) { + return false; + } + if ((lineNumber | 0) !== lineNumber || (column | 0) !== column) { + return false; + } + const lineCount = this._buffer.getLineCount(); + if (lineNumber > lineCount) { + return false; + } + if (column === 1) { + return true; + } + const maxColumn = this.getLineMaxColumn(lineNumber); + if (column > maxColumn) { + return false; + } + if (validationType === 1) { + const charCodeBefore = this._buffer.getLineCharCode(lineNumber, column - 2); + if (isHighSurrogate(charCodeBefore)) { + return false; + } + } + return true; + } + _validatePosition(_lineNumber, _column, validationType) { + const lineNumber = Math.floor(typeof _lineNumber === "number" && !isNaN(_lineNumber) ? _lineNumber : 1); + const column = Math.floor(typeof _column === "number" && !isNaN(_column) ? _column : 1); + const lineCount = this._buffer.getLineCount(); + if (lineNumber < 1) { + return new Position(1, 1); + } + if (lineNumber > lineCount) { + return new Position(lineCount, this.getLineMaxColumn(lineCount)); + } + if (column <= 1) { + return new Position(lineNumber, 1); + } + const maxColumn = this.getLineMaxColumn(lineNumber); + if (column >= maxColumn) { + return new Position(lineNumber, maxColumn); + } + if (validationType === 1) { + const charCodeBefore = this._buffer.getLineCharCode(lineNumber, column - 2); + if (isHighSurrogate(charCodeBefore)) { + return new Position(lineNumber, column - 1); + } + } + return new Position(lineNumber, column); + } + validatePosition(position) { + const validationType = 1; + this._assertNotDisposed(); + if (position instanceof Position) { + if (this._isValidPosition(position.lineNumber, position.column, validationType)) { + return position; + } + } + return this._validatePosition(position.lineNumber, position.column, validationType); + } + _isValidRange(range2, validationType) { + const startLineNumber = range2.startLineNumber; + const startColumn = range2.startColumn; + const endLineNumber = range2.endLineNumber; + const endColumn = range2.endColumn; + if (!this._isValidPosition( + startLineNumber, + startColumn, + 0 + /* StringOffsetValidationType.Relaxed */ + )) { + return false; + } + if (!this._isValidPosition( + endLineNumber, + endColumn, + 0 + /* StringOffsetValidationType.Relaxed */ + )) { + return false; + } + if (validationType === 1) { + const charCodeBeforeStart = startColumn > 1 ? this._buffer.getLineCharCode(startLineNumber, startColumn - 2) : 0; + const charCodeBeforeEnd = endColumn > 1 && endColumn <= this._buffer.getLineLength(endLineNumber) ? this._buffer.getLineCharCode(endLineNumber, endColumn - 2) : 0; + const startInsideSurrogatePair = isHighSurrogate(charCodeBeforeStart); + const endInsideSurrogatePair = isHighSurrogate(charCodeBeforeEnd); + if (!startInsideSurrogatePair && !endInsideSurrogatePair) { + return true; + } + return false; + } + return true; + } + validateRange(_range) { + const validationType = 1; + this._assertNotDisposed(); + if (_range instanceof Range && !(_range instanceof Selection)) { + if (this._isValidRange(_range, validationType)) { + return _range; + } + } + const start = this._validatePosition( + _range.startLineNumber, + _range.startColumn, + 0 + /* StringOffsetValidationType.Relaxed */ + ); + const end = this._validatePosition( + _range.endLineNumber, + _range.endColumn, + 0 + /* StringOffsetValidationType.Relaxed */ + ); + const startLineNumber = start.lineNumber; + const startColumn = start.column; + const endLineNumber = end.lineNumber; + const endColumn = end.column; + if (validationType === 1) { + const charCodeBeforeStart = startColumn > 1 ? this._buffer.getLineCharCode(startLineNumber, startColumn - 2) : 0; + const charCodeBeforeEnd = endColumn > 1 && endColumn <= this._buffer.getLineLength(endLineNumber) ? this._buffer.getLineCharCode(endLineNumber, endColumn - 2) : 0; + const startInsideSurrogatePair = isHighSurrogate(charCodeBeforeStart); + const endInsideSurrogatePair = isHighSurrogate(charCodeBeforeEnd); + if (!startInsideSurrogatePair && !endInsideSurrogatePair) { + return new Range(startLineNumber, startColumn, endLineNumber, endColumn); + } + if (startLineNumber === endLineNumber && startColumn === endColumn) { + return new Range(startLineNumber, startColumn - 1, endLineNumber, endColumn - 1); + } + if (startInsideSurrogatePair && endInsideSurrogatePair) { + return new Range(startLineNumber, startColumn - 1, endLineNumber, endColumn + 1); + } + if (startInsideSurrogatePair) { + return new Range(startLineNumber, startColumn - 1, endLineNumber, endColumn); + } + return new Range(startLineNumber, startColumn, endLineNumber, endColumn + 1); + } + return new Range(startLineNumber, startColumn, endLineNumber, endColumn); + } + modifyPosition(rawPosition, offset) { + this._assertNotDisposed(); + const candidate = this.getOffsetAt(rawPosition) + offset; + return this.getPositionAt(Math.min(this._buffer.getLength(), Math.max(0, candidate))); + } + getFullModelRange() { + this._assertNotDisposed(); + const lineCount = this.getLineCount(); + return new Range(1, 1, lineCount, this.getLineMaxColumn(lineCount)); + } + findMatchesLineByLine(searchRange, searchData, captureMatches, limitResultCount) { + return this._buffer.findMatchesLineByLine(searchRange, searchData, captureMatches, limitResultCount); + } + findMatches(searchString, rawSearchScope, isRegex, matchCase, wordSeparators2, captureMatches, limitResultCount = LIMIT_FIND_COUNT2) { + this._assertNotDisposed(); + let searchRanges = null; + if (rawSearchScope !== null) { + if (!Array.isArray(rawSearchScope)) { + rawSearchScope = [rawSearchScope]; + } + if (rawSearchScope.every((searchScope) => Range.isIRange(searchScope))) { + searchRanges = rawSearchScope.map((searchScope) => this.validateRange(searchScope)); + } + } + if (searchRanges === null) { + searchRanges = [this.getFullModelRange()]; + } + searchRanges = searchRanges.sort((d1, d2) => d1.startLineNumber - d2.startLineNumber || d1.startColumn - d2.startColumn); + const uniqueSearchRanges = []; + uniqueSearchRanges.push(searchRanges.reduce((prev, curr) => { + if (Range.areIntersecting(prev, curr)) { + return prev.plusRange(curr); + } + uniqueSearchRanges.push(prev); + return curr; + })); + let matchMapper; + if (!isRegex && searchString.indexOf("\n") < 0) { + const searchParams = new SearchParams(searchString, isRegex, matchCase, wordSeparators2); + const searchData = searchParams.parseSearchRequest(); + if (!searchData) { + return []; + } + matchMapper = (searchRange) => this.findMatchesLineByLine(searchRange, searchData, captureMatches, limitResultCount); + } else { + matchMapper = (searchRange) => TextModelSearch.findMatches(this, new SearchParams(searchString, isRegex, matchCase, wordSeparators2), searchRange, captureMatches, limitResultCount); + } + return uniqueSearchRanges.map(matchMapper).reduce((arr, matches2) => arr.concat(matches2), []); + } + findNextMatch(searchString, rawSearchStart, isRegex, matchCase, wordSeparators2, captureMatches) { + this._assertNotDisposed(); + const searchStart = this.validatePosition(rawSearchStart); + if (!isRegex && searchString.indexOf("\n") < 0) { + const searchParams = new SearchParams(searchString, isRegex, matchCase, wordSeparators2); + const searchData = searchParams.parseSearchRequest(); + if (!searchData) { + return null; + } + const lineCount = this.getLineCount(); + let searchRange = new Range(searchStart.lineNumber, searchStart.column, lineCount, this.getLineMaxColumn(lineCount)); + let ret = this.findMatchesLineByLine(searchRange, searchData, captureMatches, 1); + TextModelSearch.findNextMatch(this, new SearchParams(searchString, isRegex, matchCase, wordSeparators2), searchStart, captureMatches); + if (ret.length > 0) { + return ret[0]; + } + searchRange = new Range(1, 1, searchStart.lineNumber, this.getLineMaxColumn(searchStart.lineNumber)); + ret = this.findMatchesLineByLine(searchRange, searchData, captureMatches, 1); + if (ret.length > 0) { + return ret[0]; + } + return null; + } + return TextModelSearch.findNextMatch(this, new SearchParams(searchString, isRegex, matchCase, wordSeparators2), searchStart, captureMatches); + } + findPreviousMatch(searchString, rawSearchStart, isRegex, matchCase, wordSeparators2, captureMatches) { + this._assertNotDisposed(); + const searchStart = this.validatePosition(rawSearchStart); + return TextModelSearch.findPreviousMatch(this, new SearchParams(searchString, isRegex, matchCase, wordSeparators2), searchStart, captureMatches); + } + //#endregion + //#region Editing + pushStackElement() { + this._commandManager.pushStackElement(); + } + popStackElement() { + this._commandManager.popStackElement(); + } + pushEOL(eol) { + const currentEOL = this.getEOL() === "\n" ? 0 : 1; + if (currentEOL === eol) { + return; + } + try { + this._onDidChangeDecorations.beginDeferredEmit(); + this._eventEmitter.beginDeferredEmit(); + if (this._initialUndoRedoSnapshot === null) { + this._initialUndoRedoSnapshot = this._undoRedoService.createSnapshot(this.uri); + } + this._commandManager.pushEOL(eol); + } finally { + this._eventEmitter.endDeferredEmit(); + this._onDidChangeDecorations.endDeferredEmit(); + } + } + _validateEditOperation(rawOperation) { + if (rawOperation instanceof ValidAnnotatedEditOperation) { + return rawOperation; + } + return new ValidAnnotatedEditOperation(rawOperation.identifier || null, this.validateRange(rawOperation.range), rawOperation.text, rawOperation.forceMoveMarkers || false, rawOperation.isAutoWhitespaceEdit || false, rawOperation._isTracked || false); + } + _validateEditOperations(rawOperations) { + const result = []; + for (let i = 0, len = rawOperations.length; i < len; i++) { + result[i] = this._validateEditOperation(rawOperations[i]); + } + return result; + } + pushEditOperations(beforeCursorState, editOperations, cursorStateComputer, group) { + try { + this._onDidChangeDecorations.beginDeferredEmit(); + this._eventEmitter.beginDeferredEmit(); + return this._pushEditOperations(beforeCursorState, this._validateEditOperations(editOperations), cursorStateComputer, group); + } finally { + this._eventEmitter.endDeferredEmit(); + this._onDidChangeDecorations.endDeferredEmit(); + } + } + _pushEditOperations(beforeCursorState, editOperations, cursorStateComputer, group) { + if (this._options.trimAutoWhitespace && this._trimAutoWhitespaceLines) { + const incomingEdits = editOperations.map((op) => { + return { + range: this.validateRange(op.range), + text: op.text + }; + }); + let editsAreNearCursors = true; + if (beforeCursorState) { + for (let i = 0, len = beforeCursorState.length; i < len; i++) { + const sel = beforeCursorState[i]; + let foundEditNearSel = false; + for (let j = 0, lenJ = incomingEdits.length; j < lenJ; j++) { + const editRange = incomingEdits[j].range; + const selIsAbove = editRange.startLineNumber > sel.endLineNumber; + const selIsBelow = sel.startLineNumber > editRange.endLineNumber; + if (!selIsAbove && !selIsBelow) { + foundEditNearSel = true; + break; + } + } + if (!foundEditNearSel) { + editsAreNearCursors = false; + break; + } + } + } + if (editsAreNearCursors) { + for (let i = 0, len = this._trimAutoWhitespaceLines.length; i < len; i++) { + const trimLineNumber = this._trimAutoWhitespaceLines[i]; + const maxLineColumn = this.getLineMaxColumn(trimLineNumber); + let allowTrimLine = true; + for (let j = 0, lenJ = incomingEdits.length; j < lenJ; j++) { + const editRange = incomingEdits[j].range; + const editText = incomingEdits[j].text; + if (trimLineNumber < editRange.startLineNumber || trimLineNumber > editRange.endLineNumber) { + continue; + } + if (trimLineNumber === editRange.startLineNumber && editRange.startColumn === maxLineColumn && editRange.isEmpty() && editText && editText.length > 0 && editText.charAt(0) === "\n") { + continue; + } + if (trimLineNumber === editRange.startLineNumber && editRange.startColumn === 1 && editRange.isEmpty() && editText && editText.length > 0 && editText.charAt(editText.length - 1) === "\n") { + continue; + } + allowTrimLine = false; + break; + } + if (allowTrimLine) { + const trimRange = new Range(trimLineNumber, 1, trimLineNumber, maxLineColumn); + editOperations.push(new ValidAnnotatedEditOperation(null, trimRange, null, false, false, false)); + } + } + } + this._trimAutoWhitespaceLines = null; + } + if (this._initialUndoRedoSnapshot === null) { + this._initialUndoRedoSnapshot = this._undoRedoService.createSnapshot(this.uri); + } + return this._commandManager.pushEditOperation(beforeCursorState, editOperations, cursorStateComputer, group); + } + _applyUndo(changes, eol, resultingAlternativeVersionId, resultingSelection) { + const edits = changes.map((change) => { + const rangeStart = this.getPositionAt(change.newPosition); + const rangeEnd = this.getPositionAt(change.newEnd); + return { + range: new Range(rangeStart.lineNumber, rangeStart.column, rangeEnd.lineNumber, rangeEnd.column), + text: change.oldText + }; + }); + this._applyUndoRedoEdits(edits, eol, true, false, resultingAlternativeVersionId, resultingSelection); + } + _applyRedo(changes, eol, resultingAlternativeVersionId, resultingSelection) { + const edits = changes.map((change) => { + const rangeStart = this.getPositionAt(change.oldPosition); + const rangeEnd = this.getPositionAt(change.oldEnd); + return { + range: new Range(rangeStart.lineNumber, rangeStart.column, rangeEnd.lineNumber, rangeEnd.column), + text: change.newText + }; + }); + this._applyUndoRedoEdits(edits, eol, false, true, resultingAlternativeVersionId, resultingSelection); + } + _applyUndoRedoEdits(edits, eol, isUndoing, isRedoing, resultingAlternativeVersionId, resultingSelection) { + try { + this._onDidChangeDecorations.beginDeferredEmit(); + this._eventEmitter.beginDeferredEmit(); + this._isUndoing = isUndoing; + this._isRedoing = isRedoing; + this.applyEdits(edits, false); + this.setEOL(eol); + this._overwriteAlternativeVersionId(resultingAlternativeVersionId); + } finally { + this._isUndoing = false; + this._isRedoing = false; + this._eventEmitter.endDeferredEmit(resultingSelection); + this._onDidChangeDecorations.endDeferredEmit(); + } + } + applyEdits(rawOperations, computeUndoEdits = false) { + try { + this._onDidChangeDecorations.beginDeferredEmit(); + this._eventEmitter.beginDeferredEmit(); + const operations = this._validateEditOperations(rawOperations); + return this._doApplyEdits(operations, computeUndoEdits); + } finally { + this._eventEmitter.endDeferredEmit(); + this._onDidChangeDecorations.endDeferredEmit(); + } + } + _doApplyEdits(rawOperations, computeUndoEdits) { + const oldLineCount = this._buffer.getLineCount(); + const result = this._buffer.applyEdits(rawOperations, this._options.trimAutoWhitespace, computeUndoEdits); + const newLineCount = this._buffer.getLineCount(); + const contentChanges = result.changes; + this._trimAutoWhitespaceLines = result.trimAutoWhitespaceLineNumbers; + if (contentChanges.length !== 0) { + for (let i = 0, len = contentChanges.length; i < len; i++) { + const change = contentChanges[i]; + this._decorationsTree.acceptReplace(change.rangeOffset, change.rangeLength, change.text.length, change.forceMoveMarkers); + } + const rawContentChanges = []; + this._increaseVersionId(); + let lineCount = oldLineCount; + for (let i = 0, len = contentChanges.length; i < len; i++) { + const change = contentChanges[i]; + const [eolCount] = countEOL(change.text); + this._onDidChangeDecorations.fire(); + const startLineNumber = change.range.startLineNumber; + const endLineNumber = change.range.endLineNumber; + const deletingLinesCnt = endLineNumber - startLineNumber; + const insertingLinesCnt = eolCount; + const editingLinesCnt = Math.min(deletingLinesCnt, insertingLinesCnt); + const changeLineCountDelta = insertingLinesCnt - deletingLinesCnt; + const currentEditStartLineNumber = newLineCount - lineCount - changeLineCountDelta + startLineNumber; + const firstEditLineNumber = currentEditStartLineNumber; + const lastInsertedLineNumber = currentEditStartLineNumber + insertingLinesCnt; + const decorationsWithInjectedTextInEditedRange = this._decorationsTree.getInjectedTextInInterval(this, this.getOffsetAt(new Position(firstEditLineNumber, 1)), this.getOffsetAt(new Position(lastInsertedLineNumber, this.getLineMaxColumn(lastInsertedLineNumber))), 0); + const injectedTextInEditedRange = LineInjectedText.fromDecorations(decorationsWithInjectedTextInEditedRange); + const injectedTextInEditedRangeQueue = new ArrayQueue(injectedTextInEditedRange); + for (let j = editingLinesCnt; j >= 0; j--) { + const editLineNumber = startLineNumber + j; + const currentEditLineNumber = currentEditStartLineNumber + j; + injectedTextInEditedRangeQueue.takeFromEndWhile((r) => r.lineNumber > currentEditLineNumber); + const decorationsInCurrentLine = injectedTextInEditedRangeQueue.takeFromEndWhile((r) => r.lineNumber === currentEditLineNumber); + rawContentChanges.push(new ModelRawLineChanged(editLineNumber, this.getLineContent(currentEditLineNumber), decorationsInCurrentLine)); + } + if (editingLinesCnt < deletingLinesCnt) { + const spliceStartLineNumber = startLineNumber + editingLinesCnt; + rawContentChanges.push(new ModelRawLinesDeleted(spliceStartLineNumber + 1, endLineNumber)); + } + if (editingLinesCnt < insertingLinesCnt) { + const injectedTextInEditedRangeQueue2 = new ArrayQueue(injectedTextInEditedRange); + const spliceLineNumber = startLineNumber + editingLinesCnt; + const cnt = insertingLinesCnt - editingLinesCnt; + const fromLineNumber = newLineCount - lineCount - cnt + spliceLineNumber + 1; + const injectedTexts = []; + const newLines = []; + for (let i2 = 0; i2 < cnt; i2++) { + const lineNumber = fromLineNumber + i2; + newLines[i2] = this.getLineContent(lineNumber); + injectedTextInEditedRangeQueue2.takeWhile((r) => r.lineNumber < lineNumber); + injectedTexts[i2] = injectedTextInEditedRangeQueue2.takeWhile((r) => r.lineNumber === lineNumber); + } + rawContentChanges.push(new ModelRawLinesInserted(spliceLineNumber + 1, startLineNumber + insertingLinesCnt, newLines, injectedTexts)); + } + lineCount += changeLineCountDelta; + } + this._emitContentChangedEvent(new ModelRawContentChangedEvent(rawContentChanges, this.getVersionId(), this._isUndoing, this._isRedoing), { + changes: contentChanges, + eol: this._buffer.getEOL(), + isEolChange: false, + versionId: this.getVersionId(), + isUndoing: this._isUndoing, + isRedoing: this._isRedoing, + isFlush: false + }); + } + return result.reverseEdits === null ? void 0 : result.reverseEdits; + } + undo() { + return this._undoRedoService.undo(this.uri); + } + canUndo() { + return this._undoRedoService.canUndo(this.uri); + } + redo() { + return this._undoRedoService.redo(this.uri); + } + canRedo() { + return this._undoRedoService.canRedo(this.uri); + } + //#endregion + //#region Decorations + handleBeforeFireDecorationsChangedEvent(affectedInjectedTextLines) { + if (affectedInjectedTextLines === null || affectedInjectedTextLines.size === 0) { + return; + } + const affectedLines = Array.from(affectedInjectedTextLines); + const lineChangeEvents = affectedLines.map((lineNumber) => new ModelRawLineChanged(lineNumber, this.getLineContent(lineNumber), this._getInjectedTextInLine(lineNumber))); + this._onDidChangeInjectedText.fire(new ModelInjectedTextChangedEvent(lineChangeEvents)); + } + changeDecorations(callback, ownerId2 = 0) { + this._assertNotDisposed(); + try { + this._onDidChangeDecorations.beginDeferredEmit(); + return this._changeDecorations(ownerId2, callback); + } finally { + this._onDidChangeDecorations.endDeferredEmit(); + } + } + _changeDecorations(ownerId2, callback) { + const changeAccessor = { + addDecoration: (range2, options2) => { + return this._deltaDecorationsImpl(ownerId2, [], [{ range: range2, options: options2 }])[0]; + }, + changeDecoration: (id, newRange) => { + this._changeDecorationImpl(id, newRange); + }, + changeDecorationOptions: (id, options2) => { + this._changeDecorationOptionsImpl(id, _normalizeOptions(options2)); + }, + removeDecoration: (id) => { + this._deltaDecorationsImpl(ownerId2, [id], []); + }, + deltaDecorations: (oldDecorations, newDecorations) => { + if (oldDecorations.length === 0 && newDecorations.length === 0) { + return []; + } + return this._deltaDecorationsImpl(ownerId2, oldDecorations, newDecorations); + } + }; + let result = null; + try { + result = callback(changeAccessor); + } catch (e) { + onUnexpectedError(e); + } + changeAccessor.addDecoration = invalidFunc2; + changeAccessor.changeDecoration = invalidFunc2; + changeAccessor.changeDecorationOptions = invalidFunc2; + changeAccessor.removeDecoration = invalidFunc2; + changeAccessor.deltaDecorations = invalidFunc2; + return result; + } + deltaDecorations(oldDecorations, newDecorations, ownerId2 = 0) { + this._assertNotDisposed(); + if (!oldDecorations) { + oldDecorations = []; + } + if (oldDecorations.length === 0 && newDecorations.length === 0) { + return []; + } + try { + this._deltaDecorationCallCnt++; + if (this._deltaDecorationCallCnt > 1) { + console.warn(`Invoking deltaDecorations recursively could lead to leaking decorations.`); + onUnexpectedError(new Error(`Invoking deltaDecorations recursively could lead to leaking decorations.`)); + } + this._onDidChangeDecorations.beginDeferredEmit(); + return this._deltaDecorationsImpl(ownerId2, oldDecorations, newDecorations); + } finally { + this._onDidChangeDecorations.endDeferredEmit(); + this._deltaDecorationCallCnt--; + } + } + _getTrackedRange(id) { + return this.getDecorationRange(id); + } + _setTrackedRange(id, newRange, newStickiness) { + const node = id ? this._decorations[id] : null; + if (!node) { + if (!newRange) { + return null; + } + return this._deltaDecorationsImpl(0, [], [{ range: newRange, options: TRACKED_RANGE_OPTIONS[newStickiness] }], true)[0]; + } + if (!newRange) { + this._decorationsTree.delete(node); + delete this._decorations[node.id]; + return null; + } + const range2 = this._validateRangeRelaxedNoAllocations(newRange); + const startOffset = this._buffer.getOffsetAt(range2.startLineNumber, range2.startColumn); + const endOffset = this._buffer.getOffsetAt(range2.endLineNumber, range2.endColumn); + this._decorationsTree.delete(node); + node.reset(this.getVersionId(), startOffset, endOffset, range2); + node.setOptions(TRACKED_RANGE_OPTIONS[newStickiness]); + this._decorationsTree.insert(node); + return node.id; + } + removeAllDecorationsWithOwnerId(ownerId2) { + if (this._isDisposed) { + return; + } + const nodes = this._decorationsTree.collectNodesFromOwner(ownerId2); + for (let i = 0, len = nodes.length; i < len; i++) { + const node = nodes[i]; + this._decorationsTree.delete(node); + delete this._decorations[node.id]; + } + } + getDecorationOptions(decorationId) { + const node = this._decorations[decorationId]; + if (!node) { + return null; + } + return node.options; + } + getDecorationRange(decorationId) { + const node = this._decorations[decorationId]; + if (!node) { + return null; + } + return this._decorationsTree.getNodeRange(this, node); + } + getLineDecorations(lineNumber, ownerId2 = 0, filterOutValidation = false) { + if (lineNumber < 1 || lineNumber > this.getLineCount()) { + return []; + } + return this.getLinesDecorations(lineNumber, lineNumber, ownerId2, filterOutValidation); + } + getLinesDecorations(_startLineNumber, _endLineNumber, ownerId2 = 0, filterOutValidation = false, onlyMarginDecorations = false) { + const lineCount = this.getLineCount(); + const startLineNumber = Math.min(lineCount, Math.max(1, _startLineNumber)); + const endLineNumber = Math.min(lineCount, Math.max(1, _endLineNumber)); + const endColumn = this.getLineMaxColumn(endLineNumber); + const range2 = new Range(startLineNumber, 1, endLineNumber, endColumn); + const decorations = this._getDecorationsInRange(range2, ownerId2, filterOutValidation, onlyMarginDecorations); + pushMany(decorations, this._decorationProvider.getDecorationsInRange(range2, ownerId2, filterOutValidation)); + return decorations; + } + getDecorationsInRange(range2, ownerId2 = 0, filterOutValidation = false, onlyMinimapDecorations = false, onlyMarginDecorations = false) { + const validatedRange = this.validateRange(range2); + const decorations = this._getDecorationsInRange(validatedRange, ownerId2, filterOutValidation, onlyMarginDecorations); + pushMany(decorations, this._decorationProvider.getDecorationsInRange(validatedRange, ownerId2, filterOutValidation, onlyMinimapDecorations)); + return decorations; + } + getOverviewRulerDecorations(ownerId2 = 0, filterOutValidation = false) { + return this._decorationsTree.getAll(this, ownerId2, filterOutValidation, true, false); + } + getInjectedTextDecorations(ownerId2 = 0) { + return this._decorationsTree.getAllInjectedText(this, ownerId2); + } + _getInjectedTextInLine(lineNumber) { + const startOffset = this._buffer.getOffsetAt(lineNumber, 1); + const endOffset = startOffset + this._buffer.getLineLength(lineNumber); + const result = this._decorationsTree.getInjectedTextInInterval(this, startOffset, endOffset, 0); + return LineInjectedText.fromDecorations(result).filter((t4) => t4.lineNumber === lineNumber); + } + getAllDecorations(ownerId2 = 0, filterOutValidation = false) { + let result = this._decorationsTree.getAll(this, ownerId2, filterOutValidation, false, false); + result = result.concat(this._decorationProvider.getAllDecorations(ownerId2, filterOutValidation)); + return result; + } + getAllMarginDecorations(ownerId2 = 0) { + return this._decorationsTree.getAll(this, ownerId2, false, false, true); + } + _getDecorationsInRange(filterRange, filterOwnerId, filterOutValidation, onlyMarginDecorations) { + const startOffset = this._buffer.getOffsetAt(filterRange.startLineNumber, filterRange.startColumn); + const endOffset = this._buffer.getOffsetAt(filterRange.endLineNumber, filterRange.endColumn); + return this._decorationsTree.getAllInInterval(this, startOffset, endOffset, filterOwnerId, filterOutValidation, onlyMarginDecorations); + } + getRangeAt(start, end) { + return this._buffer.getRangeAt(start, end - start); + } + _changeDecorationImpl(decorationId, _range) { + const node = this._decorations[decorationId]; + if (!node) { + return; + } + if (node.options.after) { + const oldRange = this.getDecorationRange(decorationId); + this._onDidChangeDecorations.recordLineAffectedByInjectedText(oldRange.endLineNumber); + } + if (node.options.before) { + const oldRange = this.getDecorationRange(decorationId); + this._onDidChangeDecorations.recordLineAffectedByInjectedText(oldRange.startLineNumber); + } + const range2 = this._validateRangeRelaxedNoAllocations(_range); + const startOffset = this._buffer.getOffsetAt(range2.startLineNumber, range2.startColumn); + const endOffset = this._buffer.getOffsetAt(range2.endLineNumber, range2.endColumn); + this._decorationsTree.delete(node); + node.reset(this.getVersionId(), startOffset, endOffset, range2); + this._decorationsTree.insert(node); + this._onDidChangeDecorations.checkAffectedAndFire(node.options); + if (node.options.after) { + this._onDidChangeDecorations.recordLineAffectedByInjectedText(range2.endLineNumber); + } + if (node.options.before) { + this._onDidChangeDecorations.recordLineAffectedByInjectedText(range2.startLineNumber); + } + } + _changeDecorationOptionsImpl(decorationId, options2) { + const node = this._decorations[decorationId]; + if (!node) { + return; + } + const nodeWasInOverviewRuler = node.options.overviewRuler && node.options.overviewRuler.color ? true : false; + const nodeIsInOverviewRuler = options2.overviewRuler && options2.overviewRuler.color ? true : false; + this._onDidChangeDecorations.checkAffectedAndFire(node.options); + this._onDidChangeDecorations.checkAffectedAndFire(options2); + if (node.options.after || options2.after) { + const nodeRange = this._decorationsTree.getNodeRange(this, node); + this._onDidChangeDecorations.recordLineAffectedByInjectedText(nodeRange.endLineNumber); + } + if (node.options.before || options2.before) { + const nodeRange = this._decorationsTree.getNodeRange(this, node); + this._onDidChangeDecorations.recordLineAffectedByInjectedText(nodeRange.startLineNumber); + } + const movedInOverviewRuler = nodeWasInOverviewRuler !== nodeIsInOverviewRuler; + const changedWhetherInjectedText = isOptionsInjectedText(options2) !== isNodeInjectedText(node); + if (movedInOverviewRuler || changedWhetherInjectedText) { + this._decorationsTree.delete(node); + node.setOptions(options2); + this._decorationsTree.insert(node); + } else { + node.setOptions(options2); + } + } + _deltaDecorationsImpl(ownerId2, oldDecorationsIds, newDecorations, suppressEvents = false) { + const versionId = this.getVersionId(); + const oldDecorationsLen = oldDecorationsIds.length; + let oldDecorationIndex = 0; + const newDecorationsLen = newDecorations.length; + let newDecorationIndex = 0; + this._onDidChangeDecorations.beginDeferredEmit(); + try { + const result = new Array(newDecorationsLen); + while (oldDecorationIndex < oldDecorationsLen || newDecorationIndex < newDecorationsLen) { + let node = null; + if (oldDecorationIndex < oldDecorationsLen) { + do { + node = this._decorations[oldDecorationsIds[oldDecorationIndex++]]; + } while (!node && oldDecorationIndex < oldDecorationsLen); + if (node) { + if (node.options.after) { + const nodeRange = this._decorationsTree.getNodeRange(this, node); + this._onDidChangeDecorations.recordLineAffectedByInjectedText(nodeRange.endLineNumber); + } + if (node.options.before) { + const nodeRange = this._decorationsTree.getNodeRange(this, node); + this._onDidChangeDecorations.recordLineAffectedByInjectedText(nodeRange.startLineNumber); + } + this._decorationsTree.delete(node); + if (!suppressEvents) { + this._onDidChangeDecorations.checkAffectedAndFire(node.options); + } + } + } + if (newDecorationIndex < newDecorationsLen) { + if (!node) { + const internalDecorationId = ++this._lastDecorationId; + const decorationId = `${this._instanceId};${internalDecorationId}`; + node = new IntervalNode(decorationId, 0, 0); + this._decorations[decorationId] = node; + } + const newDecoration = newDecorations[newDecorationIndex]; + const range2 = this._validateRangeRelaxedNoAllocations(newDecoration.range); + const options2 = _normalizeOptions(newDecoration.options); + const startOffset = this._buffer.getOffsetAt(range2.startLineNumber, range2.startColumn); + const endOffset = this._buffer.getOffsetAt(range2.endLineNumber, range2.endColumn); + node.ownerId = ownerId2; + node.reset(versionId, startOffset, endOffset, range2); + node.setOptions(options2); + if (node.options.after) { + this._onDidChangeDecorations.recordLineAffectedByInjectedText(range2.endLineNumber); + } + if (node.options.before) { + this._onDidChangeDecorations.recordLineAffectedByInjectedText(range2.startLineNumber); + } + if (!suppressEvents) { + this._onDidChangeDecorations.checkAffectedAndFire(options2); + } + this._decorationsTree.insert(node); + result[newDecorationIndex] = node.id; + newDecorationIndex++; + } else { + if (node) { + delete this._decorations[node.id]; + } + } + } + return result; + } finally { + this._onDidChangeDecorations.endDeferredEmit(); + } + } + //#endregion + //#region Tokenization + // TODO move them to the tokenization part. + getLanguageId() { + return this.tokenization.getLanguageId(); + } + setLanguage(languageIdOrSelection, source) { + if (typeof languageIdOrSelection === "string") { + this._languageSelectionListener.clear(); + this._setLanguage(languageIdOrSelection, source); + } else { + this._languageSelectionListener.value = languageIdOrSelection.onDidChange(() => this._setLanguage(languageIdOrSelection.languageId, source)); + this._setLanguage(languageIdOrSelection.languageId, source); + } + } + _setLanguage(languageId, source) { + this.tokenization.setLanguageId(languageId, source); + this._languageService.requestRichLanguageFeatures(languageId); + } + getLanguageIdAtPosition(lineNumber, column) { + return this.tokenization.getLanguageIdAtPosition(lineNumber, column); + } + getWordAtPosition(position) { + return this._tokenizationTextModelPart.getWordAtPosition(position); + } + getWordUntilPosition(position) { + return this._tokenizationTextModelPart.getWordUntilPosition(position); + } + //#endregion + normalizePosition(position, affinity) { + return position; + } + /** + * Gets the column at which indentation stops at a given line. + * @internal + */ + getLineIndentColumn(lineNumber) { + return indentOfLine(this.getLineContent(lineNumber)) + 1; + } + }; + TextModel._MODEL_SYNC_LIMIT = 50 * 1024 * 1024; + TextModel.LARGE_FILE_SIZE_THRESHOLD = 20 * 1024 * 1024; + TextModel.LARGE_FILE_LINE_COUNT_THRESHOLD = 300 * 1e3; + TextModel.LARGE_FILE_HEAP_OPERATION_THRESHOLD = 256 * 1024 * 1024; + TextModel.DEFAULT_CREATION_OPTIONS = { + isForSimpleWidget: false, + tabSize: EDITOR_MODEL_DEFAULTS.tabSize, + indentSize: EDITOR_MODEL_DEFAULTS.indentSize, + insertSpaces: EDITOR_MODEL_DEFAULTS.insertSpaces, + detectIndentation: false, + defaultEOL: 1, + trimAutoWhitespace: EDITOR_MODEL_DEFAULTS.trimAutoWhitespace, + largeFileOptimizations: EDITOR_MODEL_DEFAULTS.largeFileOptimizations, + bracketPairColorizationOptions: EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions + }; + TextModel = TextModel_1 = __decorate12([ + __param11(4, IUndoRedoService), + __param11(5, ILanguageService), + __param11(6, ILanguageConfigurationService) + ], TextModel); + DecorationsTrees = class { + constructor() { + this._decorationsTree0 = new IntervalTree(); + this._decorationsTree1 = new IntervalTree(); + this._injectedTextDecorationsTree = new IntervalTree(); + } + ensureAllNodesHaveRanges(host) { + this.getAll(host, 0, false, false, false); + } + _ensureNodesHaveRanges(host, nodes) { + for (const node of nodes) { + if (node.range === null) { + node.range = host.getRangeAt(node.cachedAbsoluteStart, node.cachedAbsoluteEnd); + } + } + return nodes; + } + getAllInInterval(host, start, end, filterOwnerId, filterOutValidation, onlyMarginDecorations) { + const versionId = host.getVersionId(); + const result = this._intervalSearch(start, end, filterOwnerId, filterOutValidation, versionId, onlyMarginDecorations); + return this._ensureNodesHaveRanges(host, result); + } + _intervalSearch(start, end, filterOwnerId, filterOutValidation, cachedVersionId, onlyMarginDecorations) { + const r0 = this._decorationsTree0.intervalSearch(start, end, filterOwnerId, filterOutValidation, cachedVersionId, onlyMarginDecorations); + const r1 = this._decorationsTree1.intervalSearch(start, end, filterOwnerId, filterOutValidation, cachedVersionId, onlyMarginDecorations); + const r2 = this._injectedTextDecorationsTree.intervalSearch(start, end, filterOwnerId, filterOutValidation, cachedVersionId, onlyMarginDecorations); + return r0.concat(r1).concat(r2); + } + getInjectedTextInInterval(host, start, end, filterOwnerId) { + const versionId = host.getVersionId(); + const result = this._injectedTextDecorationsTree.intervalSearch(start, end, filterOwnerId, false, versionId, false); + return this._ensureNodesHaveRanges(host, result).filter((i) => i.options.showIfCollapsed || !i.range.isEmpty()); + } + getAllInjectedText(host, filterOwnerId) { + const versionId = host.getVersionId(); + const result = this._injectedTextDecorationsTree.search(filterOwnerId, false, versionId, false); + return this._ensureNodesHaveRanges(host, result).filter((i) => i.options.showIfCollapsed || !i.range.isEmpty()); + } + getAll(host, filterOwnerId, filterOutValidation, overviewRulerOnly, onlyMarginDecorations) { + const versionId = host.getVersionId(); + const result = this._search(filterOwnerId, filterOutValidation, overviewRulerOnly, versionId, onlyMarginDecorations); + return this._ensureNodesHaveRanges(host, result); + } + _search(filterOwnerId, filterOutValidation, overviewRulerOnly, cachedVersionId, onlyMarginDecorations) { + if (overviewRulerOnly) { + return this._decorationsTree1.search(filterOwnerId, filterOutValidation, cachedVersionId, onlyMarginDecorations); + } else { + const r0 = this._decorationsTree0.search(filterOwnerId, filterOutValidation, cachedVersionId, onlyMarginDecorations); + const r1 = this._decorationsTree1.search(filterOwnerId, filterOutValidation, cachedVersionId, onlyMarginDecorations); + const r2 = this._injectedTextDecorationsTree.search(filterOwnerId, filterOutValidation, cachedVersionId, onlyMarginDecorations); + return r0.concat(r1).concat(r2); + } + } + collectNodesFromOwner(ownerId2) { + const r0 = this._decorationsTree0.collectNodesFromOwner(ownerId2); + const r1 = this._decorationsTree1.collectNodesFromOwner(ownerId2); + const r2 = this._injectedTextDecorationsTree.collectNodesFromOwner(ownerId2); + return r0.concat(r1).concat(r2); + } + collectNodesPostOrder() { + const r0 = this._decorationsTree0.collectNodesPostOrder(); + const r1 = this._decorationsTree1.collectNodesPostOrder(); + const r2 = this._injectedTextDecorationsTree.collectNodesPostOrder(); + return r0.concat(r1).concat(r2); + } + insert(node) { + if (isNodeInjectedText(node)) { + this._injectedTextDecorationsTree.insert(node); + } else if (isNodeInOverviewRuler(node)) { + this._decorationsTree1.insert(node); + } else { + this._decorationsTree0.insert(node); + } + } + delete(node) { + if (isNodeInjectedText(node)) { + this._injectedTextDecorationsTree.delete(node); + } else if (isNodeInOverviewRuler(node)) { + this._decorationsTree1.delete(node); + } else { + this._decorationsTree0.delete(node); + } + } + getNodeRange(host, node) { + const versionId = host.getVersionId(); + if (node.cachedVersionId !== versionId) { + this._resolveNode(node, versionId); + } + if (node.range === null) { + node.range = host.getRangeAt(node.cachedAbsoluteStart, node.cachedAbsoluteEnd); + } + return node.range; + } + _resolveNode(node, cachedVersionId) { + if (isNodeInjectedText(node)) { + this._injectedTextDecorationsTree.resolveNode(node, cachedVersionId); + } else if (isNodeInOverviewRuler(node)) { + this._decorationsTree1.resolveNode(node, cachedVersionId); + } else { + this._decorationsTree0.resolveNode(node, cachedVersionId); + } + } + acceptReplace(offset, length, textLength, forceMoveMarkers) { + this._decorationsTree0.acceptReplace(offset, length, textLength, forceMoveMarkers); + this._decorationsTree1.acceptReplace(offset, length, textLength, forceMoveMarkers); + this._injectedTextDecorationsTree.acceptReplace(offset, length, textLength, forceMoveMarkers); + } + }; + DecorationOptions = class { + constructor(options2) { + this.color = options2.color || ""; + this.darkColor = options2.darkColor || ""; + } + }; + ModelDecorationOverviewRulerOptions = class extends DecorationOptions { + constructor(options2) { + super(options2); + this._resolvedColor = null; + this.position = typeof options2.position === "number" ? options2.position : OverviewRulerLane2.Center; + } + getColor(theme) { + if (!this._resolvedColor) { + if (theme.type !== "light" && this.darkColor) { + this._resolvedColor = this._resolveColor(this.darkColor, theme); + } else { + this._resolvedColor = this._resolveColor(this.color, theme); + } + } + return this._resolvedColor; + } + invalidateCachedColor() { + this._resolvedColor = null; + } + _resolveColor(color, theme) { + if (typeof color === "string") { + return color; + } + const c = color ? theme.getColor(color.id) : null; + if (!c) { + return ""; + } + return c.toString(); + } + }; + ModelDecorationGlyphMarginOptions = class { + constructor(options2) { + var _a10; + this.position = (_a10 = options2 === null || options2 === void 0 ? void 0 : options2.position) !== null && _a10 !== void 0 ? _a10 : GlyphMarginLane2.Center; + this.persistLane = options2 === null || options2 === void 0 ? void 0 : options2.persistLane; + } + }; + ModelDecorationMinimapOptions = class extends DecorationOptions { + constructor(options2) { + var _a10, _b4; + super(options2); + this.position = options2.position; + this.sectionHeaderStyle = (_a10 = options2.sectionHeaderStyle) !== null && _a10 !== void 0 ? _a10 : null; + this.sectionHeaderText = (_b4 = options2.sectionHeaderText) !== null && _b4 !== void 0 ? _b4 : null; + } + getColor(theme) { + if (!this._resolvedColor) { + if (theme.type !== "light" && this.darkColor) { + this._resolvedColor = this._resolveColor(this.darkColor, theme); + } else { + this._resolvedColor = this._resolveColor(this.color, theme); + } + } + return this._resolvedColor; + } + invalidateCachedColor() { + this._resolvedColor = void 0; + } + _resolveColor(color, theme) { + if (typeof color === "string") { + return Color.fromHex(color); + } + return theme.getColor(color.id); + } + }; + ModelDecorationInjectedTextOptions = class _ModelDecorationInjectedTextOptions { + static from(options2) { + if (options2 instanceof _ModelDecorationInjectedTextOptions) { + return options2; + } + return new _ModelDecorationInjectedTextOptions(options2); + } + constructor(options2) { + this.content = options2.content || ""; + this.inlineClassName = options2.inlineClassName || null; + this.inlineClassNameAffectsLetterSpacing = options2.inlineClassNameAffectsLetterSpacing || false; + this.attachedData = options2.attachedData || null; + this.cursorStops = options2.cursorStops || null; + } + }; + ModelDecorationOptions = class _ModelDecorationOptions { + static register(options2) { + return new _ModelDecorationOptions(options2); + } + static createDynamic(options2) { + return new _ModelDecorationOptions(options2); + } + constructor(options2) { + var _a10, _b4, _c2, _d2, _e2, _f3; + this.description = options2.description; + this.blockClassName = options2.blockClassName ? cleanClassName(options2.blockClassName) : null; + this.blockDoesNotCollapse = (_a10 = options2.blockDoesNotCollapse) !== null && _a10 !== void 0 ? _a10 : null; + this.blockIsAfterEnd = (_b4 = options2.blockIsAfterEnd) !== null && _b4 !== void 0 ? _b4 : null; + this.blockPadding = (_c2 = options2.blockPadding) !== null && _c2 !== void 0 ? _c2 : null; + this.stickiness = options2.stickiness || 0; + this.zIndex = options2.zIndex || 0; + this.className = options2.className ? cleanClassName(options2.className) : null; + this.shouldFillLineOnLineBreak = (_d2 = options2.shouldFillLineOnLineBreak) !== null && _d2 !== void 0 ? _d2 : null; + this.hoverMessage = options2.hoverMessage || null; + this.glyphMarginHoverMessage = options2.glyphMarginHoverMessage || null; + this.lineNumberHoverMessage = options2.lineNumberHoverMessage || null; + this.isWholeLine = options2.isWholeLine || false; + this.showIfCollapsed = options2.showIfCollapsed || false; + this.collapseOnReplaceEdit = options2.collapseOnReplaceEdit || false; + this.overviewRuler = options2.overviewRuler ? new ModelDecorationOverviewRulerOptions(options2.overviewRuler) : null; + this.minimap = options2.minimap ? new ModelDecorationMinimapOptions(options2.minimap) : null; + this.glyphMargin = options2.glyphMarginClassName ? new ModelDecorationGlyphMarginOptions(options2.glyphMargin) : null; + this.glyphMarginClassName = options2.glyphMarginClassName ? cleanClassName(options2.glyphMarginClassName) : null; + this.linesDecorationsClassName = options2.linesDecorationsClassName ? cleanClassName(options2.linesDecorationsClassName) : null; + this.lineNumberClassName = options2.lineNumberClassName ? cleanClassName(options2.lineNumberClassName) : null; + this.linesDecorationsTooltip = options2.linesDecorationsTooltip ? htmlAttributeEncodeValue(options2.linesDecorationsTooltip) : null; + this.firstLineDecorationClassName = options2.firstLineDecorationClassName ? cleanClassName(options2.firstLineDecorationClassName) : null; + this.marginClassName = options2.marginClassName ? cleanClassName(options2.marginClassName) : null; + this.inlineClassName = options2.inlineClassName ? cleanClassName(options2.inlineClassName) : null; + this.inlineClassNameAffectsLetterSpacing = options2.inlineClassNameAffectsLetterSpacing || false; + this.beforeContentClassName = options2.beforeContentClassName ? cleanClassName(options2.beforeContentClassName) : null; + this.afterContentClassName = options2.afterContentClassName ? cleanClassName(options2.afterContentClassName) : null; + this.after = options2.after ? ModelDecorationInjectedTextOptions.from(options2.after) : null; + this.before = options2.before ? ModelDecorationInjectedTextOptions.from(options2.before) : null; + this.hideInCommentTokens = (_e2 = options2.hideInCommentTokens) !== null && _e2 !== void 0 ? _e2 : false; + this.hideInStringTokens = (_f3 = options2.hideInStringTokens) !== null && _f3 !== void 0 ? _f3 : false; + } + }; + ModelDecorationOptions.EMPTY = ModelDecorationOptions.register({ description: "empty" }); + TRACKED_RANGE_OPTIONS = [ + ModelDecorationOptions.register({ + description: "tracked-range-always-grows-when-typing-at-edges", + stickiness: 0 + /* model.TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */ + }), + ModelDecorationOptions.register({ + description: "tracked-range-never-grows-when-typing-at-edges", + stickiness: 1 + /* model.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ + }), + ModelDecorationOptions.register({ + description: "tracked-range-grows-only-when-typing-before", + stickiness: 2 + /* model.TrackedRangeStickiness.GrowsOnlyWhenTypingBefore */ + }), + ModelDecorationOptions.register({ + description: "tracked-range-grows-only-when-typing-after", + stickiness: 3 + /* model.TrackedRangeStickiness.GrowsOnlyWhenTypingAfter */ + }) + ]; + DidChangeDecorationsEmitter = class extends Disposable { + constructor(handleBeforeFire) { + super(); + this.handleBeforeFire = handleBeforeFire; + this._actual = this._register(new Emitter()); + this.event = this._actual.event; + this._affectedInjectedTextLines = null; + this._deferredCnt = 0; + this._shouldFireDeferred = false; + this._affectsMinimap = false; + this._affectsOverviewRuler = false; + this._affectsGlyphMargin = false; + this._affectsLineNumber = false; + } + beginDeferredEmit() { + this._deferredCnt++; + } + endDeferredEmit() { + var _a10; + this._deferredCnt--; + if (this._deferredCnt === 0) { + if (this._shouldFireDeferred) { + this.doFire(); + } + (_a10 = this._affectedInjectedTextLines) === null || _a10 === void 0 ? void 0 : _a10.clear(); + this._affectedInjectedTextLines = null; + } + } + recordLineAffectedByInjectedText(lineNumber) { + if (!this._affectedInjectedTextLines) { + this._affectedInjectedTextLines = /* @__PURE__ */ new Set(); + } + this._affectedInjectedTextLines.add(lineNumber); + } + checkAffectedAndFire(options2) { + var _a10, _b4; + this._affectsMinimap || (this._affectsMinimap = !!((_a10 = options2.minimap) === null || _a10 === void 0 ? void 0 : _a10.position)); + this._affectsOverviewRuler || (this._affectsOverviewRuler = !!((_b4 = options2.overviewRuler) === null || _b4 === void 0 ? void 0 : _b4.color)); + this._affectsGlyphMargin || (this._affectsGlyphMargin = !!options2.glyphMarginClassName); + this._affectsLineNumber || (this._affectsLineNumber = !!options2.lineNumberClassName); + this.tryFire(); + } + fire() { + this._affectsMinimap = true; + this._affectsOverviewRuler = true; + this._affectsGlyphMargin = true; + this.tryFire(); + } + tryFire() { + if (this._deferredCnt === 0) { + this.doFire(); + } else { + this._shouldFireDeferred = true; + } + } + doFire() { + this.handleBeforeFire(this._affectedInjectedTextLines); + const event = { + affectsMinimap: this._affectsMinimap, + affectsOverviewRuler: this._affectsOverviewRuler, + affectsGlyphMargin: this._affectsGlyphMargin, + affectsLineNumber: this._affectsLineNumber + }; + this._shouldFireDeferred = false; + this._affectsMinimap = false; + this._affectsOverviewRuler = false; + this._affectsGlyphMargin = false; + this._actual.fire(event); + } + }; + DidChangeContentEmitter = class extends Disposable { + constructor() { + super(); + this._fastEmitter = this._register(new Emitter()); + this.fastEvent = this._fastEmitter.event; + this._slowEmitter = this._register(new Emitter()); + this.slowEvent = this._slowEmitter.event; + this._deferredCnt = 0; + this._deferredEvent = null; + } + beginDeferredEmit() { + this._deferredCnt++; + } + endDeferredEmit(resultingSelection = null) { + this._deferredCnt--; + if (this._deferredCnt === 0) { + if (this._deferredEvent !== null) { + this._deferredEvent.rawContentChangedEvent.resultingSelection = resultingSelection; + const e = this._deferredEvent; + this._deferredEvent = null; + this._fastEmitter.fire(e); + this._slowEmitter.fire(e); + } + } + } + fire(e) { + if (this._deferredCnt > 0) { + if (this._deferredEvent) { + this._deferredEvent = this._deferredEvent.merge(e); + } else { + this._deferredEvent = e; + } + return; + } + this._fastEmitter.fire(e); + this._slowEmitter.fire(e); + } + }; + AttachedViews = class { + constructor() { + this._onDidChangeVisibleRanges = new Emitter(); + this.onDidChangeVisibleRanges = this._onDidChangeVisibleRanges.event; + this._views = /* @__PURE__ */ new Set(); + } + attachView() { + const view = new AttachedViewImpl((state) => { + this._onDidChangeVisibleRanges.fire({ view, state }); + }); + this._views.add(view); + return view; + } + detachView(view) { + this._views.delete(view); + this._onDidChangeVisibleRanges.fire({ view, state: void 0 }); + } + }; + AttachedViewImpl = class { + constructor(handleStateChange) { + this.handleStateChange = handleStateChange; + } + setVisibleLines(visibleLines, stabilized) { + const visibleLineRanges = visibleLines.map((line) => new LineRange(line.startLineNumber, line.endLineNumber + 1)); + this.handleStateChange({ visibleLineRanges, stabilized }); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewModel/monospaceLineBreaksComputer.js +function createLineBreaksFromPreviousLineBreaks(classifier, previousBreakingData, lineText, tabSize, firstLineBreakColumn, columnsForFullWidthChar, wrappingIndent, wordBreak) { + if (firstLineBreakColumn === -1) { + return null; + } + const len = lineText.length; + if (len <= 1) { + return null; + } + const isKeepAll = wordBreak === "keepAll"; + const prevBreakingOffsets = previousBreakingData.breakOffsets; + const prevBreakingOffsetsVisibleColumn = previousBreakingData.breakOffsetsVisibleColumn; + const wrappedTextIndentLength = computeWrappedTextIndentLength(lineText, tabSize, firstLineBreakColumn, columnsForFullWidthChar, wrappingIndent); + const wrappedLineBreakColumn = firstLineBreakColumn - wrappedTextIndentLength; + const breakingOffsets = arrPool1; + const breakingOffsetsVisibleColumn = arrPool2; + let breakingOffsetsCount = 0; + let lastBreakingOffset = 0; + let lastBreakingOffsetVisibleColumn = 0; + let breakingColumn = firstLineBreakColumn; + const prevLen = prevBreakingOffsets.length; + let prevIndex = 0; + if (prevIndex >= 0) { + let bestDistance = Math.abs(prevBreakingOffsetsVisibleColumn[prevIndex] - breakingColumn); + while (prevIndex + 1 < prevLen) { + const distance = Math.abs(prevBreakingOffsetsVisibleColumn[prevIndex + 1] - breakingColumn); + if (distance >= bestDistance) { + break; + } + bestDistance = distance; + prevIndex++; + } + } + while (prevIndex < prevLen) { + let prevBreakOffset = prevIndex < 0 ? 0 : prevBreakingOffsets[prevIndex]; + let prevBreakOffsetVisibleColumn = prevIndex < 0 ? 0 : prevBreakingOffsetsVisibleColumn[prevIndex]; + if (lastBreakingOffset > prevBreakOffset) { + prevBreakOffset = lastBreakingOffset; + prevBreakOffsetVisibleColumn = lastBreakingOffsetVisibleColumn; + } + let breakOffset = 0; + let breakOffsetVisibleColumn = 0; + let forcedBreakOffset = 0; + let forcedBreakOffsetVisibleColumn = 0; + if (prevBreakOffsetVisibleColumn <= breakingColumn) { + let visibleColumn = prevBreakOffsetVisibleColumn; + let prevCharCode = prevBreakOffset === 0 ? 0 : lineText.charCodeAt(prevBreakOffset - 1); + let prevCharCodeClass = prevBreakOffset === 0 ? 0 : classifier.get(prevCharCode); + let entireLineFits = true; + for (let i = prevBreakOffset; i < len; i++) { + const charStartOffset = i; + const charCode = lineText.charCodeAt(i); + let charCodeClass; + let charWidth; + if (isHighSurrogate(charCode)) { + i++; + charCodeClass = 0; + charWidth = 2; + } else { + charCodeClass = classifier.get(charCode); + charWidth = computeCharWidth(charCode, visibleColumn, tabSize, columnsForFullWidthChar); + } + if (charStartOffset > lastBreakingOffset && canBreak(prevCharCode, prevCharCodeClass, charCode, charCodeClass, isKeepAll)) { + breakOffset = charStartOffset; + breakOffsetVisibleColumn = visibleColumn; + } + visibleColumn += charWidth; + if (visibleColumn > breakingColumn) { + if (charStartOffset > lastBreakingOffset) { + forcedBreakOffset = charStartOffset; + forcedBreakOffsetVisibleColumn = visibleColumn - charWidth; + } else { + forcedBreakOffset = i + 1; + forcedBreakOffsetVisibleColumn = visibleColumn; + } + if (visibleColumn - breakOffsetVisibleColumn > wrappedLineBreakColumn) { + breakOffset = 0; + } + entireLineFits = false; + break; + } + prevCharCode = charCode; + prevCharCodeClass = charCodeClass; + } + if (entireLineFits) { + if (breakingOffsetsCount > 0) { + breakingOffsets[breakingOffsetsCount] = prevBreakingOffsets[prevBreakingOffsets.length - 1]; + breakingOffsetsVisibleColumn[breakingOffsetsCount] = prevBreakingOffsetsVisibleColumn[prevBreakingOffsets.length - 1]; + breakingOffsetsCount++; + } + break; + } + } + if (breakOffset === 0) { + let visibleColumn = prevBreakOffsetVisibleColumn; + let charCode = lineText.charCodeAt(prevBreakOffset); + let charCodeClass = classifier.get(charCode); + let hitATabCharacter = false; + for (let i = prevBreakOffset - 1; i >= lastBreakingOffset; i--) { + const charStartOffset = i + 1; + const prevCharCode = lineText.charCodeAt(i); + if (prevCharCode === 9) { + hitATabCharacter = true; + break; + } + let prevCharCodeClass; + let prevCharWidth; + if (isLowSurrogate(prevCharCode)) { + i--; + prevCharCodeClass = 0; + prevCharWidth = 2; + } else { + prevCharCodeClass = classifier.get(prevCharCode); + prevCharWidth = isFullWidthCharacter(prevCharCode) ? columnsForFullWidthChar : 1; + } + if (visibleColumn <= breakingColumn) { + if (forcedBreakOffset === 0) { + forcedBreakOffset = charStartOffset; + forcedBreakOffsetVisibleColumn = visibleColumn; + } + if (visibleColumn <= breakingColumn - wrappedLineBreakColumn) { + break; + } + if (canBreak(prevCharCode, prevCharCodeClass, charCode, charCodeClass, isKeepAll)) { + breakOffset = charStartOffset; + breakOffsetVisibleColumn = visibleColumn; + break; + } + } + visibleColumn -= prevCharWidth; + charCode = prevCharCode; + charCodeClass = prevCharCodeClass; + } + if (breakOffset !== 0) { + const remainingWidthOfNextLine = wrappedLineBreakColumn - (forcedBreakOffsetVisibleColumn - breakOffsetVisibleColumn); + if (remainingWidthOfNextLine <= tabSize) { + const charCodeAtForcedBreakOffset = lineText.charCodeAt(forcedBreakOffset); + let charWidth; + if (isHighSurrogate(charCodeAtForcedBreakOffset)) { + charWidth = 2; + } else { + charWidth = computeCharWidth(charCodeAtForcedBreakOffset, forcedBreakOffsetVisibleColumn, tabSize, columnsForFullWidthChar); + } + if (remainingWidthOfNextLine - charWidth < 0) { + breakOffset = 0; + } + } + } + if (hitATabCharacter) { + prevIndex--; + continue; + } + } + if (breakOffset === 0) { + breakOffset = forcedBreakOffset; + breakOffsetVisibleColumn = forcedBreakOffsetVisibleColumn; + } + if (breakOffset <= lastBreakingOffset) { + const charCode = lineText.charCodeAt(lastBreakingOffset); + if (isHighSurrogate(charCode)) { + breakOffset = lastBreakingOffset + 2; + breakOffsetVisibleColumn = lastBreakingOffsetVisibleColumn + 2; + } else { + breakOffset = lastBreakingOffset + 1; + breakOffsetVisibleColumn = lastBreakingOffsetVisibleColumn + computeCharWidth(charCode, lastBreakingOffsetVisibleColumn, tabSize, columnsForFullWidthChar); + } + } + lastBreakingOffset = breakOffset; + breakingOffsets[breakingOffsetsCount] = breakOffset; + lastBreakingOffsetVisibleColumn = breakOffsetVisibleColumn; + breakingOffsetsVisibleColumn[breakingOffsetsCount] = breakOffsetVisibleColumn; + breakingOffsetsCount++; + breakingColumn = breakOffsetVisibleColumn + wrappedLineBreakColumn; + while (prevIndex < 0 || prevIndex < prevLen && prevBreakingOffsetsVisibleColumn[prevIndex] < breakOffsetVisibleColumn) { + prevIndex++; + } + let bestDistance = Math.abs(prevBreakingOffsetsVisibleColumn[prevIndex] - breakingColumn); + while (prevIndex + 1 < prevLen) { + const distance = Math.abs(prevBreakingOffsetsVisibleColumn[prevIndex + 1] - breakingColumn); + if (distance >= bestDistance) { + break; + } + bestDistance = distance; + prevIndex++; + } + } + if (breakingOffsetsCount === 0) { + return null; + } + breakingOffsets.length = breakingOffsetsCount; + breakingOffsetsVisibleColumn.length = breakingOffsetsCount; + arrPool1 = previousBreakingData.breakOffsets; + arrPool2 = previousBreakingData.breakOffsetsVisibleColumn; + previousBreakingData.breakOffsets = breakingOffsets; + previousBreakingData.breakOffsetsVisibleColumn = breakingOffsetsVisibleColumn; + previousBreakingData.wrappedTextIndentLength = wrappedTextIndentLength; + return previousBreakingData; +} +function createLineBreaks2(classifier, _lineText, injectedTexts, tabSize, firstLineBreakColumn, columnsForFullWidthChar, wrappingIndent, wordBreak) { + const lineText = LineInjectedText.applyInjectedText(_lineText, injectedTexts); + let injectionOptions; + let injectionOffsets; + if (injectedTexts && injectedTexts.length > 0) { + injectionOptions = injectedTexts.map((t4) => t4.options); + injectionOffsets = injectedTexts.map((text2) => text2.column - 1); + } else { + injectionOptions = null; + injectionOffsets = null; + } + if (firstLineBreakColumn === -1) { + if (!injectionOptions) { + return null; + } + return new ModelLineProjectionData(injectionOffsets, injectionOptions, [lineText.length], [], 0); + } + const len = lineText.length; + if (len <= 1) { + if (!injectionOptions) { + return null; + } + return new ModelLineProjectionData(injectionOffsets, injectionOptions, [lineText.length], [], 0); + } + const isKeepAll = wordBreak === "keepAll"; + const wrappedTextIndentLength = computeWrappedTextIndentLength(lineText, tabSize, firstLineBreakColumn, columnsForFullWidthChar, wrappingIndent); + const wrappedLineBreakColumn = firstLineBreakColumn - wrappedTextIndentLength; + const breakingOffsets = []; + const breakingOffsetsVisibleColumn = []; + let breakingOffsetsCount = 0; + let breakOffset = 0; + let breakOffsetVisibleColumn = 0; + let breakingColumn = firstLineBreakColumn; + let prevCharCode = lineText.charCodeAt(0); + let prevCharCodeClass = classifier.get(prevCharCode); + let visibleColumn = computeCharWidth(prevCharCode, 0, tabSize, columnsForFullWidthChar); + let startOffset = 1; + if (isHighSurrogate(prevCharCode)) { + visibleColumn += 1; + prevCharCode = lineText.charCodeAt(1); + prevCharCodeClass = classifier.get(prevCharCode); + startOffset++; + } + for (let i = startOffset; i < len; i++) { + const charStartOffset = i; + const charCode = lineText.charCodeAt(i); + let charCodeClass; + let charWidth; + if (isHighSurrogate(charCode)) { + i++; + charCodeClass = 0; + charWidth = 2; + } else { + charCodeClass = classifier.get(charCode); + charWidth = computeCharWidth(charCode, visibleColumn, tabSize, columnsForFullWidthChar); + } + if (canBreak(prevCharCode, prevCharCodeClass, charCode, charCodeClass, isKeepAll)) { + breakOffset = charStartOffset; + breakOffsetVisibleColumn = visibleColumn; + } + visibleColumn += charWidth; + if (visibleColumn > breakingColumn) { + if (breakOffset === 0 || visibleColumn - breakOffsetVisibleColumn > wrappedLineBreakColumn) { + breakOffset = charStartOffset; + breakOffsetVisibleColumn = visibleColumn - charWidth; + } + breakingOffsets[breakingOffsetsCount] = breakOffset; + breakingOffsetsVisibleColumn[breakingOffsetsCount] = breakOffsetVisibleColumn; + breakingOffsetsCount++; + breakingColumn = breakOffsetVisibleColumn + wrappedLineBreakColumn; + breakOffset = 0; + } + prevCharCode = charCode; + prevCharCodeClass = charCodeClass; + } + if (breakingOffsetsCount === 0 && (!injectedTexts || injectedTexts.length === 0)) { + return null; + } + breakingOffsets[breakingOffsetsCount] = len; + breakingOffsetsVisibleColumn[breakingOffsetsCount] = visibleColumn; + return new ModelLineProjectionData(injectionOffsets, injectionOptions, breakingOffsets, breakingOffsetsVisibleColumn, wrappedTextIndentLength); +} +function computeCharWidth(charCode, visibleColumn, tabSize, columnsForFullWidthChar) { + if (charCode === 9) { + return tabSize - visibleColumn % tabSize; + } + if (isFullWidthCharacter(charCode)) { + return columnsForFullWidthChar; + } + if (charCode < 32) { + return columnsForFullWidthChar; + } + return 1; +} +function tabCharacterWidth(visibleColumn, tabSize) { + return tabSize - visibleColumn % tabSize; +} +function canBreak(prevCharCode, prevCharCodeClass, charCode, charCodeClass, isKeepAll) { + return charCode !== 32 && (prevCharCodeClass === 2 && charCodeClass !== 2 || prevCharCodeClass !== 1 && charCodeClass === 1 || !isKeepAll && prevCharCodeClass === 3 && charCodeClass !== 2 || !isKeepAll && charCodeClass === 3 && prevCharCodeClass !== 1); +} +function computeWrappedTextIndentLength(lineText, tabSize, firstLineBreakColumn, columnsForFullWidthChar, wrappingIndent) { + let wrappedTextIndentLength = 0; + if (wrappingIndent !== 0) { + const firstNonWhitespaceIndex2 = firstNonWhitespaceIndex(lineText); + if (firstNonWhitespaceIndex2 !== -1) { + for (let i = 0; i < firstNonWhitespaceIndex2; i++) { + const charWidth = lineText.charCodeAt(i) === 9 ? tabCharacterWidth(wrappedTextIndentLength, tabSize) : 1; + wrappedTextIndentLength += charWidth; + } + const numberOfAdditionalTabs = wrappingIndent === 3 ? 2 : wrappingIndent === 2 ? 1 : 0; + for (let i = 0; i < numberOfAdditionalTabs; i++) { + const charWidth = tabCharacterWidth(wrappedTextIndentLength, tabSize); + wrappedTextIndentLength += charWidth; + } + if (wrappedTextIndentLength + columnsForFullWidthChar > firstLineBreakColumn) { + wrappedTextIndentLength = 0; + } + } + } + return wrappedTextIndentLength; +} +var MonospaceLineBreaksComputerFactory, WrappingCharacterClassifier, arrPool1, arrPool2; +var init_monospaceLineBreaksComputer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewModel/monospaceLineBreaksComputer.js"() { + init_strings(); + init_characterClassifier(); + init_textModelEvents(); + init_modelLineProjectionData(); + MonospaceLineBreaksComputerFactory = class _MonospaceLineBreaksComputerFactory { + static create(options2) { + return new _MonospaceLineBreaksComputerFactory(options2.get( + 134 + /* EditorOption.wordWrapBreakBeforeCharacters */ + ), options2.get( + 133 + /* EditorOption.wordWrapBreakAfterCharacters */ + )); + } + constructor(breakBeforeChars, breakAfterChars) { + this.classifier = new WrappingCharacterClassifier(breakBeforeChars, breakAfterChars); + } + createLineBreaksComputer(fontInfo, tabSize, wrappingColumn, wrappingIndent, wordBreak) { + const requests = []; + const injectedTexts = []; + const previousBreakingData = []; + return { + addRequest: (lineText, injectedText, previousLineBreakData) => { + requests.push(lineText); + injectedTexts.push(injectedText); + previousBreakingData.push(previousLineBreakData); + }, + finalize: () => { + const columnsForFullWidthChar = fontInfo.typicalFullwidthCharacterWidth / fontInfo.typicalHalfwidthCharacterWidth; + const result = []; + for (let i = 0, len = requests.length; i < len; i++) { + const injectedText = injectedTexts[i]; + const previousLineBreakData = previousBreakingData[i]; + if (previousLineBreakData && !previousLineBreakData.injectionOptions && !injectedText) { + result[i] = createLineBreaksFromPreviousLineBreaks(this.classifier, previousLineBreakData, requests[i], tabSize, wrappingColumn, columnsForFullWidthChar, wrappingIndent, wordBreak); + } else { + result[i] = createLineBreaks2(this.classifier, requests[i], injectedText, tabSize, wrappingColumn, columnsForFullWidthChar, wrappingIndent, wordBreak); + } + } + arrPool1.length = 0; + arrPool2.length = 0; + return result; + } + }; + } + }; + WrappingCharacterClassifier = class extends CharacterClassifier { + constructor(BREAK_BEFORE, BREAK_AFTER) { + super( + 0 + /* CharacterClass.NONE */ + ); + for (let i = 0; i < BREAK_BEFORE.length; i++) { + this.set( + BREAK_BEFORE.charCodeAt(i), + 1 + /* CharacterClass.BREAK_BEFORE */ + ); + } + for (let i = 0; i < BREAK_AFTER.length; i++) { + this.set( + BREAK_AFTER.charCodeAt(i), + 2 + /* CharacterClass.BREAK_AFTER */ + ); + } + } + get(charCode) { + if (charCode >= 0 && charCode < 256) { + return this._asciiMap[charCode]; + } else { + if (charCode >= 12352 && charCode <= 12543 || charCode >= 13312 && charCode <= 19903 || charCode >= 19968 && charCode <= 40959) { + return 3; + } + return this._map.get(charCode) || this._defaultValue; + } + } + }; + arrPool1 = []; + arrPool2 = []; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/cursor/oneCursor.js +var Cursor; +var init_oneCursor = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/cursor/oneCursor.js"() { + init_cursorCommon(); + init_position(); + init_range(); + init_selection(); + Cursor = class _Cursor { + constructor(context) { + this._selTrackedRange = null; + this._trackSelection = true; + this._setState(context, new SingleCursorState(new Range(1, 1, 1, 1), 0, 0, new Position(1, 1), 0), new SingleCursorState(new Range(1, 1, 1, 1), 0, 0, new Position(1, 1), 0)); + } + dispose(context) { + this._removeTrackedRange(context); + } + startTrackingSelection(context) { + this._trackSelection = true; + this._updateTrackedRange(context); + } + stopTrackingSelection(context) { + this._trackSelection = false; + this._removeTrackedRange(context); + } + _updateTrackedRange(context) { + if (!this._trackSelection) { + return; + } + this._selTrackedRange = context.model._setTrackedRange( + this._selTrackedRange, + this.modelState.selection, + 0 + /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */ + ); + } + _removeTrackedRange(context) { + this._selTrackedRange = context.model._setTrackedRange( + this._selTrackedRange, + null, + 0 + /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */ + ); + } + asCursorState() { + return new CursorState(this.modelState, this.viewState); + } + readSelectionFromMarkers(context) { + const range2 = context.model._getTrackedRange(this._selTrackedRange); + if (this.modelState.selection.isEmpty() && !range2.isEmpty()) { + return Selection.fromRange(range2.collapseToEnd(), this.modelState.selection.getDirection()); + } + return Selection.fromRange(range2, this.modelState.selection.getDirection()); + } + ensureValidState(context) { + this._setState(context, this.modelState, this.viewState); + } + setState(context, modelState, viewState) { + this._setState(context, modelState, viewState); + } + static _validatePositionWithCache(viewModel, position, cacheInput, cacheOutput) { + if (position.equals(cacheInput)) { + return cacheOutput; + } + return viewModel.normalizePosition( + position, + 2 + /* PositionAffinity.None */ + ); + } + static _validateViewState(viewModel, viewState) { + const position = viewState.position; + const sStartPosition = viewState.selectionStart.getStartPosition(); + const sEndPosition = viewState.selectionStart.getEndPosition(); + const validPosition = viewModel.normalizePosition( + position, + 2 + /* PositionAffinity.None */ + ); + const validSStartPosition = this._validatePositionWithCache(viewModel, sStartPosition, position, validPosition); + const validSEndPosition = this._validatePositionWithCache(viewModel, sEndPosition, sStartPosition, validSStartPosition); + if (position.equals(validPosition) && sStartPosition.equals(validSStartPosition) && sEndPosition.equals(validSEndPosition)) { + return viewState; + } + return new SingleCursorState(Range.fromPositions(validSStartPosition, validSEndPosition), viewState.selectionStartKind, viewState.selectionStartLeftoverVisibleColumns + sStartPosition.column - validSStartPosition.column, validPosition, viewState.leftoverVisibleColumns + position.column - validPosition.column); + } + _setState(context, modelState, viewState) { + if (viewState) { + viewState = _Cursor._validateViewState(context.viewModel, viewState); + } + if (!modelState) { + if (!viewState) { + return; + } + const selectionStart = context.model.validateRange(context.coordinatesConverter.convertViewRangeToModelRange(viewState.selectionStart)); + const position = context.model.validatePosition(context.coordinatesConverter.convertViewPositionToModelPosition(viewState.position)); + modelState = new SingleCursorState(selectionStart, viewState.selectionStartKind, viewState.selectionStartLeftoverVisibleColumns, position, viewState.leftoverVisibleColumns); + } else { + const selectionStart = context.model.validateRange(modelState.selectionStart); + const selectionStartLeftoverVisibleColumns = modelState.selectionStart.equalsRange(selectionStart) ? modelState.selectionStartLeftoverVisibleColumns : 0; + const position = context.model.validatePosition(modelState.position); + const leftoverVisibleColumns = modelState.position.equals(position) ? modelState.leftoverVisibleColumns : 0; + modelState = new SingleCursorState(selectionStart, modelState.selectionStartKind, selectionStartLeftoverVisibleColumns, position, leftoverVisibleColumns); + } + if (!viewState) { + const viewSelectionStart1 = context.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelState.selectionStart.startLineNumber, modelState.selectionStart.startColumn)); + const viewSelectionStart2 = context.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelState.selectionStart.endLineNumber, modelState.selectionStart.endColumn)); + const viewSelectionStart = new Range(viewSelectionStart1.lineNumber, viewSelectionStart1.column, viewSelectionStart2.lineNumber, viewSelectionStart2.column); + const viewPosition = context.coordinatesConverter.convertModelPositionToViewPosition(modelState.position); + viewState = new SingleCursorState(viewSelectionStart, modelState.selectionStartKind, modelState.selectionStartLeftoverVisibleColumns, viewPosition, modelState.leftoverVisibleColumns); + } else { + const viewSelectionStart = context.coordinatesConverter.validateViewRange(viewState.selectionStart, modelState.selectionStart); + const viewPosition = context.coordinatesConverter.validateViewPosition(viewState.position, modelState.position); + viewState = new SingleCursorState(viewSelectionStart, modelState.selectionStartKind, modelState.selectionStartLeftoverVisibleColumns, viewPosition, modelState.leftoverVisibleColumns); + } + this.modelState = modelState; + this.viewState = viewState; + this._updateTrackedRange(context); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorCollection.js +var CursorCollection; +var init_cursorCollection = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorCollection.js"() { + init_arrays(); + init_arraysFind(); + init_cursorCommon(); + init_oneCursor(); + init_position(); + init_range(); + init_selection(); + CursorCollection = class { + constructor(context) { + this.context = context; + this.cursors = [new Cursor(context)]; + this.lastAddedCursorIndex = 0; + } + dispose() { + for (const cursor of this.cursors) { + cursor.dispose(this.context); + } + } + startTrackingSelections() { + for (const cursor of this.cursors) { + cursor.startTrackingSelection(this.context); + } + } + stopTrackingSelections() { + for (const cursor of this.cursors) { + cursor.stopTrackingSelection(this.context); + } + } + updateContext(context) { + this.context = context; + } + ensureValidState() { + for (const cursor of this.cursors) { + cursor.ensureValidState(this.context); + } + } + readSelectionFromMarkers() { + return this.cursors.map((c) => c.readSelectionFromMarkers(this.context)); + } + getAll() { + return this.cursors.map((c) => c.asCursorState()); + } + getViewPositions() { + return this.cursors.map((c) => c.viewState.position); + } + getTopMostViewPosition() { + return findFirstMin(this.cursors, compareBy((c) => c.viewState.position, Position.compare)).viewState.position; + } + getBottomMostViewPosition() { + return findLastMax(this.cursors, compareBy((c) => c.viewState.position, Position.compare)).viewState.position; + } + getSelections() { + return this.cursors.map((c) => c.modelState.selection); + } + getViewSelections() { + return this.cursors.map((c) => c.viewState.selection); + } + setSelections(selections) { + this.setStates(CursorState.fromModelSelections(selections)); + } + getPrimaryCursor() { + return this.cursors[0].asCursorState(); + } + setStates(states) { + if (states === null) { + return; + } + this.cursors[0].setState(this.context, states[0].modelState, states[0].viewState); + this._setSecondaryStates(states.slice(1)); + } + /** + * Creates or disposes secondary cursors as necessary to match the number of `secondarySelections`. + */ + _setSecondaryStates(secondaryStates) { + const secondaryCursorsLength = this.cursors.length - 1; + const secondaryStatesLength = secondaryStates.length; + if (secondaryCursorsLength < secondaryStatesLength) { + const createCnt = secondaryStatesLength - secondaryCursorsLength; + for (let i = 0; i < createCnt; i++) { + this._addSecondaryCursor(); + } + } else if (secondaryCursorsLength > secondaryStatesLength) { + const removeCnt = secondaryCursorsLength - secondaryStatesLength; + for (let i = 0; i < removeCnt; i++) { + this._removeSecondaryCursor(this.cursors.length - 2); + } + } + for (let i = 0; i < secondaryStatesLength; i++) { + this.cursors[i + 1].setState(this.context, secondaryStates[i].modelState, secondaryStates[i].viewState); + } + } + killSecondaryCursors() { + this._setSecondaryStates([]); + } + _addSecondaryCursor() { + this.cursors.push(new Cursor(this.context)); + this.lastAddedCursorIndex = this.cursors.length - 1; + } + getLastAddedCursorIndex() { + if (this.cursors.length === 1 || this.lastAddedCursorIndex === 0) { + return 0; + } + return this.lastAddedCursorIndex; + } + _removeSecondaryCursor(removeIndex) { + if (this.lastAddedCursorIndex >= removeIndex + 1) { + this.lastAddedCursorIndex--; + } + this.cursors[removeIndex + 1].dispose(this.context); + this.cursors.splice(removeIndex + 1, 1); + } + normalize() { + if (this.cursors.length === 1) { + return; + } + const cursors = this.cursors.slice(0); + const sortedCursors = []; + for (let i = 0, len = cursors.length; i < len; i++) { + sortedCursors.push({ + index: i, + selection: cursors[i].modelState.selection + }); + } + sortedCursors.sort(compareBy((s) => s.selection, Range.compareRangesUsingStarts)); + for (let sortedCursorIndex = 0; sortedCursorIndex < sortedCursors.length - 1; sortedCursorIndex++) { + const current = sortedCursors[sortedCursorIndex]; + const next = sortedCursors[sortedCursorIndex + 1]; + const currentSelection = current.selection; + const nextSelection = next.selection; + if (!this.context.cursorConfig.multiCursorMergeOverlapping) { + continue; + } + let shouldMergeCursors; + if (nextSelection.isEmpty() || currentSelection.isEmpty()) { + shouldMergeCursors = nextSelection.getStartPosition().isBeforeOrEqual(currentSelection.getEndPosition()); + } else { + shouldMergeCursors = nextSelection.getStartPosition().isBefore(currentSelection.getEndPosition()); + } + if (shouldMergeCursors) { + const winnerSortedCursorIndex = current.index < next.index ? sortedCursorIndex : sortedCursorIndex + 1; + const looserSortedCursorIndex = current.index < next.index ? sortedCursorIndex + 1 : sortedCursorIndex; + const looserIndex = sortedCursors[looserSortedCursorIndex].index; + const winnerIndex = sortedCursors[winnerSortedCursorIndex].index; + const looserSelection = sortedCursors[looserSortedCursorIndex].selection; + const winnerSelection = sortedCursors[winnerSortedCursorIndex].selection; + if (!looserSelection.equalsSelection(winnerSelection)) { + const resultingRange = looserSelection.plusRange(winnerSelection); + const looserSelectionIsLTR = looserSelection.selectionStartLineNumber === looserSelection.startLineNumber && looserSelection.selectionStartColumn === looserSelection.startColumn; + const winnerSelectionIsLTR = winnerSelection.selectionStartLineNumber === winnerSelection.startLineNumber && winnerSelection.selectionStartColumn === winnerSelection.startColumn; + let resultingSelectionIsLTR; + if (looserIndex === this.lastAddedCursorIndex) { + resultingSelectionIsLTR = looserSelectionIsLTR; + this.lastAddedCursorIndex = winnerIndex; + } else { + resultingSelectionIsLTR = winnerSelectionIsLTR; + } + let resultingSelection; + if (resultingSelectionIsLTR) { + resultingSelection = new Selection(resultingRange.startLineNumber, resultingRange.startColumn, resultingRange.endLineNumber, resultingRange.endColumn); + } else { + resultingSelection = new Selection(resultingRange.endLineNumber, resultingRange.endColumn, resultingRange.startLineNumber, resultingRange.startColumn); + } + sortedCursors[winnerSortedCursorIndex].selection = resultingSelection; + const resultingState = CursorState.fromModelSelection(resultingSelection); + cursors[winnerIndex].setState(this.context, resultingState.modelState, resultingState.viewState); + } + for (const sortedCursor of sortedCursors) { + if (sortedCursor.index > looserIndex) { + sortedCursor.index--; + } + } + cursors.splice(looserIndex, 1); + sortedCursors.splice(looserSortedCursorIndex, 1); + this._removeSecondaryCursor(looserIndex - 1); + sortedCursorIndex--; + } + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorContext.js +var CursorContext; +var init_cursorContext = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/cursor/cursorContext.js"() { + CursorContext = class { + constructor(model, viewModel, coordinatesConverter, cursorConfig) { + this._cursorContextBrand = void 0; + this.model = model; + this.viewModel = viewModel; + this.coordinatesConverter = coordinatesConverter; + this.cursorConfig = cursorConfig; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewEvents.js +var ViewCompositionStartEvent, ViewCompositionEndEvent, ViewConfigurationChangedEvent, ViewCursorStateChangedEvent, ViewDecorationsChangedEvent, ViewFlushedEvent, ViewFocusChangedEvent, ViewLanguageConfigurationEvent, ViewLineMappingChangedEvent, ViewLinesChangedEvent, ViewLinesDeletedEvent, ViewLinesInsertedEvent, ViewRevealRangeRequestEvent, ViewScrollChangedEvent, ViewThemeChangedEvent, ViewTokensChangedEvent, ViewTokensColorsChangedEvent, ViewZonesChangedEvent; +var init_viewEvents = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewEvents.js"() { + ViewCompositionStartEvent = class { + constructor() { + this.type = 0; + } + }; + ViewCompositionEndEvent = class { + constructor() { + this.type = 1; + } + }; + ViewConfigurationChangedEvent = class { + constructor(source) { + this.type = 2; + this._source = source; + } + hasChanged(id) { + return this._source.hasChanged(id); + } + }; + ViewCursorStateChangedEvent = class { + constructor(selections, modelSelections, reason) { + this.selections = selections; + this.modelSelections = modelSelections; + this.reason = reason; + this.type = 3; + } + }; + ViewDecorationsChangedEvent = class { + constructor(source) { + this.type = 4; + if (source) { + this.affectsMinimap = source.affectsMinimap; + this.affectsOverviewRuler = source.affectsOverviewRuler; + this.affectsGlyphMargin = source.affectsGlyphMargin; + this.affectsLineNumber = source.affectsLineNumber; + } else { + this.affectsMinimap = true; + this.affectsOverviewRuler = true; + this.affectsGlyphMargin = true; + this.affectsLineNumber = true; + } + } + }; + ViewFlushedEvent = class { + constructor() { + this.type = 5; + } + }; + ViewFocusChangedEvent = class { + constructor(isFocused2) { + this.type = 6; + this.isFocused = isFocused2; + } + }; + ViewLanguageConfigurationEvent = class { + constructor() { + this.type = 7; + } + }; + ViewLineMappingChangedEvent = class { + constructor() { + this.type = 8; + } + }; + ViewLinesChangedEvent = class { + constructor(fromLineNumber, count) { + this.fromLineNumber = fromLineNumber; + this.count = count; + this.type = 9; + } + }; + ViewLinesDeletedEvent = class { + constructor(fromLineNumber, toLineNumber) { + this.type = 10; + this.fromLineNumber = fromLineNumber; + this.toLineNumber = toLineNumber; + } + }; + ViewLinesInsertedEvent = class { + constructor(fromLineNumber, toLineNumber) { + this.type = 11; + this.fromLineNumber = fromLineNumber; + this.toLineNumber = toLineNumber; + } + }; + ViewRevealRangeRequestEvent = class { + constructor(source, minimalReveal, range2, selections, verticalType, revealHorizontal, scrollType) { + this.source = source; + this.minimalReveal = minimalReveal; + this.range = range2; + this.selections = selections; + this.verticalType = verticalType; + this.revealHorizontal = revealHorizontal; + this.scrollType = scrollType; + this.type = 12; + } + }; + ViewScrollChangedEvent = class { + constructor(source) { + this.type = 13; + this.scrollWidth = source.scrollWidth; + this.scrollLeft = source.scrollLeft; + this.scrollHeight = source.scrollHeight; + this.scrollTop = source.scrollTop; + this.scrollWidthChanged = source.scrollWidthChanged; + this.scrollLeftChanged = source.scrollLeftChanged; + this.scrollHeightChanged = source.scrollHeightChanged; + this.scrollTopChanged = source.scrollTopChanged; + } + }; + ViewThemeChangedEvent = class { + constructor(theme) { + this.theme = theme; + this.type = 14; + } + }; + ViewTokensChangedEvent = class { + constructor(ranges) { + this.type = 15; + this.ranges = ranges; + } + }; + ViewTokensColorsChangedEvent = class { + constructor() { + this.type = 16; + } + }; + ViewZonesChangedEvent = class { + constructor() { + this.type = 17; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewModelEventDispatcher.js +var ViewModelEventDispatcher, ViewModelEventsCollector, ContentSizeChangedEvent, FocusChangedEvent, ScrollChangedEvent, ViewZonesChangedEvent2, HiddenAreasChangedEvent, CursorStateChangedEvent, ReadOnlyEditAttemptEvent, ModelDecorationsChangedEvent, ModelLanguageChangedEvent, ModelLanguageConfigurationChangedEvent, ModelContentChangedEvent, ModelOptionsChangedEvent, ModelTokensChangedEvent; +var init_viewModelEventDispatcher = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewModelEventDispatcher.js"() { + init_event(); + init_lifecycle(); + ViewModelEventDispatcher = class extends Disposable { + constructor() { + super(); + this._onEvent = this._register(new Emitter()); + this.onEvent = this._onEvent.event; + this._eventHandlers = []; + this._viewEventQueue = null; + this._isConsumingViewEventQueue = false; + this._collector = null; + this._collectorCnt = 0; + this._outgoingEvents = []; + } + emitOutgoingEvent(e) { + this._addOutgoingEvent(e); + this._emitOutgoingEvents(); + } + _addOutgoingEvent(e) { + for (let i = 0, len = this._outgoingEvents.length; i < len; i++) { + const mergeResult = this._outgoingEvents[i].kind === e.kind ? this._outgoingEvents[i].attemptToMerge(e) : null; + if (mergeResult) { + this._outgoingEvents[i] = mergeResult; + return; + } + } + this._outgoingEvents.push(e); + } + _emitOutgoingEvents() { + while (this._outgoingEvents.length > 0) { + if (this._collector || this._isConsumingViewEventQueue) { + return; + } + const event = this._outgoingEvents.shift(); + if (event.isNoOp()) { + continue; + } + this._onEvent.fire(event); + } + } + addViewEventHandler(eventHandler) { + for (let i = 0, len = this._eventHandlers.length; i < len; i++) { + if (this._eventHandlers[i] === eventHandler) { + console.warn("Detected duplicate listener in ViewEventDispatcher", eventHandler); + } + } + this._eventHandlers.push(eventHandler); + } + removeViewEventHandler(eventHandler) { + for (let i = 0; i < this._eventHandlers.length; i++) { + if (this._eventHandlers[i] === eventHandler) { + this._eventHandlers.splice(i, 1); + break; + } + } + } + beginEmitViewEvents() { + this._collectorCnt++; + if (this._collectorCnt === 1) { + this._collector = new ViewModelEventsCollector(); + } + return this._collector; + } + endEmitViewEvents() { + this._collectorCnt--; + if (this._collectorCnt === 0) { + const outgoingEvents = this._collector.outgoingEvents; + const viewEvents = this._collector.viewEvents; + this._collector = null; + for (const outgoingEvent of outgoingEvents) { + this._addOutgoingEvent(outgoingEvent); + } + if (viewEvents.length > 0) { + this._emitMany(viewEvents); + } + } + this._emitOutgoingEvents(); + } + emitSingleViewEvent(event) { + try { + const eventsCollector = this.beginEmitViewEvents(); + eventsCollector.emitViewEvent(event); + } finally { + this.endEmitViewEvents(); + } + } + _emitMany(events) { + if (this._viewEventQueue) { + this._viewEventQueue = this._viewEventQueue.concat(events); + } else { + this._viewEventQueue = events; + } + if (!this._isConsumingViewEventQueue) { + this._consumeViewEventQueue(); + } + } + _consumeViewEventQueue() { + try { + this._isConsumingViewEventQueue = true; + this._doConsumeQueue(); + } finally { + this._isConsumingViewEventQueue = false; + } + } + _doConsumeQueue() { + while (this._viewEventQueue) { + const events = this._viewEventQueue; + this._viewEventQueue = null; + const eventHandlers = this._eventHandlers.slice(0); + for (const eventHandler of eventHandlers) { + eventHandler.handleEvents(events); + } + } + } + }; + ViewModelEventsCollector = class { + constructor() { + this.viewEvents = []; + this.outgoingEvents = []; + } + emitViewEvent(event) { + this.viewEvents.push(event); + } + emitOutgoingEvent(e) { + this.outgoingEvents.push(e); + } + }; + ContentSizeChangedEvent = class _ContentSizeChangedEvent { + constructor(oldContentWidth, oldContentHeight, contentWidth, contentHeight) { + this.kind = 0; + this._oldContentWidth = oldContentWidth; + this._oldContentHeight = oldContentHeight; + this.contentWidth = contentWidth; + this.contentHeight = contentHeight; + this.contentWidthChanged = this._oldContentWidth !== this.contentWidth; + this.contentHeightChanged = this._oldContentHeight !== this.contentHeight; + } + isNoOp() { + return !this.contentWidthChanged && !this.contentHeightChanged; + } + attemptToMerge(other) { + if (other.kind !== this.kind) { + return null; + } + return new _ContentSizeChangedEvent(this._oldContentWidth, this._oldContentHeight, other.contentWidth, other.contentHeight); + } + }; + FocusChangedEvent = class _FocusChangedEvent { + constructor(oldHasFocus, hasFocus) { + this.kind = 1; + this.oldHasFocus = oldHasFocus; + this.hasFocus = hasFocus; + } + isNoOp() { + return this.oldHasFocus === this.hasFocus; + } + attemptToMerge(other) { + if (other.kind !== this.kind) { + return null; + } + return new _FocusChangedEvent(this.oldHasFocus, other.hasFocus); + } + }; + ScrollChangedEvent = class _ScrollChangedEvent { + constructor(oldScrollWidth, oldScrollLeft, oldScrollHeight, oldScrollTop, scrollWidth, scrollLeft, scrollHeight, scrollTop) { + this.kind = 2; + this._oldScrollWidth = oldScrollWidth; + this._oldScrollLeft = oldScrollLeft; + this._oldScrollHeight = oldScrollHeight; + this._oldScrollTop = oldScrollTop; + this.scrollWidth = scrollWidth; + this.scrollLeft = scrollLeft; + this.scrollHeight = scrollHeight; + this.scrollTop = scrollTop; + this.scrollWidthChanged = this._oldScrollWidth !== this.scrollWidth; + this.scrollLeftChanged = this._oldScrollLeft !== this.scrollLeft; + this.scrollHeightChanged = this._oldScrollHeight !== this.scrollHeight; + this.scrollTopChanged = this._oldScrollTop !== this.scrollTop; + } + isNoOp() { + return !this.scrollWidthChanged && !this.scrollLeftChanged && !this.scrollHeightChanged && !this.scrollTopChanged; + } + attemptToMerge(other) { + if (other.kind !== this.kind) { + return null; + } + return new _ScrollChangedEvent(this._oldScrollWidth, this._oldScrollLeft, this._oldScrollHeight, this._oldScrollTop, other.scrollWidth, other.scrollLeft, other.scrollHeight, other.scrollTop); + } + }; + ViewZonesChangedEvent2 = class { + constructor() { + this.kind = 3; + } + isNoOp() { + return false; + } + attemptToMerge(other) { + if (other.kind !== this.kind) { + return null; + } + return this; + } + }; + HiddenAreasChangedEvent = class { + constructor() { + this.kind = 4; + } + isNoOp() { + return false; + } + attemptToMerge(other) { + if (other.kind !== this.kind) { + return null; + } + return this; + } + }; + CursorStateChangedEvent = class _CursorStateChangedEvent { + constructor(oldSelections, selections, oldModelVersionId, modelVersionId, source, reason, reachedMaxCursorCount) { + this.kind = 6; + this.oldSelections = oldSelections; + this.selections = selections; + this.oldModelVersionId = oldModelVersionId; + this.modelVersionId = modelVersionId; + this.source = source; + this.reason = reason; + this.reachedMaxCursorCount = reachedMaxCursorCount; + } + static _selectionsAreEqual(a3, b) { + if (!a3 && !b) { + return true; + } + if (!a3 || !b) { + return false; + } + const aLen = a3.length; + const bLen = b.length; + if (aLen !== bLen) { + return false; + } + for (let i = 0; i < aLen; i++) { + if (!a3[i].equalsSelection(b[i])) { + return false; + } + } + return true; + } + isNoOp() { + return _CursorStateChangedEvent._selectionsAreEqual(this.oldSelections, this.selections) && this.oldModelVersionId === this.modelVersionId; + } + attemptToMerge(other) { + if (other.kind !== this.kind) { + return null; + } + return new _CursorStateChangedEvent(this.oldSelections, other.selections, this.oldModelVersionId, other.modelVersionId, other.source, other.reason, this.reachedMaxCursorCount || other.reachedMaxCursorCount); + } + }; + ReadOnlyEditAttemptEvent = class { + constructor() { + this.kind = 5; + } + isNoOp() { + return false; + } + attemptToMerge(other) { + if (other.kind !== this.kind) { + return null; + } + return this; + } + }; + ModelDecorationsChangedEvent = class { + constructor(event) { + this.event = event; + this.kind = 7; + } + isNoOp() { + return false; + } + attemptToMerge(other) { + return null; + } + }; + ModelLanguageChangedEvent = class { + constructor(event) { + this.event = event; + this.kind = 8; + } + isNoOp() { + return false; + } + attemptToMerge(other) { + return null; + } + }; + ModelLanguageConfigurationChangedEvent = class { + constructor(event) { + this.event = event; + this.kind = 9; + } + isNoOp() { + return false; + } + attemptToMerge(other) { + return null; + } + }; + ModelContentChangedEvent = class { + constructor(event) { + this.event = event; + this.kind = 10; + } + isNoOp() { + return false; + } + attemptToMerge(other) { + return null; + } + }; + ModelOptionsChangedEvent = class { + constructor(event) { + this.event = event; + this.kind = 11; + } + isNoOp() { + return false; + } + attemptToMerge(other) { + return null; + } + }; + ModelTokensChangedEvent = class { + constructor(event) { + this.event = event; + this.kind = 12; + } + isNoOp() { + return false; + } + attemptToMerge(other) { + return null; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/cursor/cursor.js +var CursorsController, CursorModelState, AutoClosedAction, CommandExecutor, CompositionLineState, CompositionState; +var init_cursor = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/cursor/cursor.js"() { + init_errors(); + init_strings(); + init_cursorCollection(); + init_cursorCommon(); + init_cursorContext(); + init_cursorDeleteOperations(); + init_cursorTypeOperations(); + init_range(); + init_selection(); + init_textModelEvents(); + init_viewEvents(); + init_lifecycle(); + init_viewModelEventDispatcher(); + CursorsController = class extends Disposable { + constructor(model, viewModel, coordinatesConverter, cursorConfig) { + super(); + this._model = model; + this._knownModelVersionId = this._model.getVersionId(); + this._viewModel = viewModel; + this._coordinatesConverter = coordinatesConverter; + this.context = new CursorContext(this._model, this._viewModel, this._coordinatesConverter, cursorConfig); + this._cursors = new CursorCollection(this.context); + this._hasFocus = false; + this._isHandling = false; + this._compositionState = null; + this._columnSelectData = null; + this._autoClosedActions = []; + this._prevEditOperationType = 0; + } + dispose() { + this._cursors.dispose(); + this._autoClosedActions = dispose(this._autoClosedActions); + super.dispose(); + } + updateConfiguration(cursorConfig) { + this.context = new CursorContext(this._model, this._viewModel, this._coordinatesConverter, cursorConfig); + this._cursors.updateContext(this.context); + } + onLineMappingChanged(eventsCollector) { + if (this._knownModelVersionId !== this._model.getVersionId()) { + return; + } + this.setStates(eventsCollector, "viewModel", 0, this.getCursorStates()); + } + setHasFocus(hasFocus) { + this._hasFocus = hasFocus; + } + _validateAutoClosedActions() { + if (this._autoClosedActions.length > 0) { + const selections = this._cursors.getSelections(); + for (let i = 0; i < this._autoClosedActions.length; i++) { + const autoClosedAction = this._autoClosedActions[i]; + if (!autoClosedAction.isValid(selections)) { + autoClosedAction.dispose(); + this._autoClosedActions.splice(i, 1); + i--; + } + } + } + } + // ------ some getters/setters + getPrimaryCursorState() { + return this._cursors.getPrimaryCursor(); + } + getLastAddedCursorIndex() { + return this._cursors.getLastAddedCursorIndex(); + } + getCursorStates() { + return this._cursors.getAll(); + } + setStates(eventsCollector, source, reason, states) { + let reachedMaxCursorCount = false; + const multiCursorLimit = this.context.cursorConfig.multiCursorLimit; + if (states !== null && states.length > multiCursorLimit) { + states = states.slice(0, multiCursorLimit); + reachedMaxCursorCount = true; + } + const oldState = CursorModelState.from(this._model, this); + this._cursors.setStates(states); + this._cursors.normalize(); + this._columnSelectData = null; + this._validateAutoClosedActions(); + return this._emitStateChangedIfNecessary(eventsCollector, source, reason, oldState, reachedMaxCursorCount); + } + setCursorColumnSelectData(columnSelectData) { + this._columnSelectData = columnSelectData; + } + revealAll(eventsCollector, source, minimalReveal, verticalType, revealHorizontal, scrollType) { + const viewPositions = this._cursors.getViewPositions(); + let revealViewRange = null; + let revealViewSelections = null; + if (viewPositions.length > 1) { + revealViewSelections = this._cursors.getViewSelections(); + } else { + revealViewRange = Range.fromPositions(viewPositions[0], viewPositions[0]); + } + eventsCollector.emitViewEvent(new ViewRevealRangeRequestEvent(source, minimalReveal, revealViewRange, revealViewSelections, verticalType, revealHorizontal, scrollType)); + } + revealPrimary(eventsCollector, source, minimalReveal, verticalType, revealHorizontal, scrollType) { + const primaryCursor = this._cursors.getPrimaryCursor(); + const revealViewSelections = [primaryCursor.viewState.selection]; + eventsCollector.emitViewEvent(new ViewRevealRangeRequestEvent(source, minimalReveal, null, revealViewSelections, verticalType, revealHorizontal, scrollType)); + } + saveState() { + const result = []; + const selections = this._cursors.getSelections(); + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + result.push({ + inSelectionMode: !selection.isEmpty(), + selectionStart: { + lineNumber: selection.selectionStartLineNumber, + column: selection.selectionStartColumn + }, + position: { + lineNumber: selection.positionLineNumber, + column: selection.positionColumn + } + }); + } + return result; + } + restoreState(eventsCollector, states) { + const desiredSelections = []; + for (let i = 0, len = states.length; i < len; i++) { + const state = states[i]; + let positionLineNumber = 1; + let positionColumn = 1; + if (state.position && state.position.lineNumber) { + positionLineNumber = state.position.lineNumber; + } + if (state.position && state.position.column) { + positionColumn = state.position.column; + } + let selectionStartLineNumber = positionLineNumber; + let selectionStartColumn = positionColumn; + if (state.selectionStart && state.selectionStart.lineNumber) { + selectionStartLineNumber = state.selectionStart.lineNumber; + } + if (state.selectionStart && state.selectionStart.column) { + selectionStartColumn = state.selectionStart.column; + } + desiredSelections.push({ + selectionStartLineNumber, + selectionStartColumn, + positionLineNumber, + positionColumn + }); + } + this.setStates(eventsCollector, "restoreState", 0, CursorState.fromModelSelections(desiredSelections)); + this.revealAll( + eventsCollector, + "restoreState", + false, + 0, + true, + 1 + /* editorCommon.ScrollType.Immediate */ + ); + } + onModelContentChanged(eventsCollector, event) { + if (event instanceof ModelInjectedTextChangedEvent) { + if (this._isHandling) { + return; + } + this._isHandling = true; + try { + this.setStates(eventsCollector, "modelChange", 0, this.getCursorStates()); + } finally { + this._isHandling = false; + } + } else { + const e = event.rawContentChangedEvent; + this._knownModelVersionId = e.versionId; + if (this._isHandling) { + return; + } + const hadFlushEvent = e.containsEvent( + 1 + /* RawContentChangedType.Flush */ + ); + this._prevEditOperationType = 0; + if (hadFlushEvent) { + this._cursors.dispose(); + this._cursors = new CursorCollection(this.context); + this._validateAutoClosedActions(); + this._emitStateChangedIfNecessary(eventsCollector, "model", 1, null, false); + } else { + if (this._hasFocus && e.resultingSelection && e.resultingSelection.length > 0) { + const cursorState = CursorState.fromModelSelections(e.resultingSelection); + if (this.setStates(eventsCollector, "modelChange", e.isUndoing ? 5 : e.isRedoing ? 6 : 2, cursorState)) { + this.revealAll( + eventsCollector, + "modelChange", + false, + 0, + true, + 0 + /* editorCommon.ScrollType.Smooth */ + ); + } + } else { + const selectionsFromMarkers = this._cursors.readSelectionFromMarkers(); + this.setStates(eventsCollector, "modelChange", 2, CursorState.fromModelSelections(selectionsFromMarkers)); + } + } + } + } + getSelection() { + return this._cursors.getPrimaryCursor().modelState.selection; + } + getTopMostViewPosition() { + return this._cursors.getTopMostViewPosition(); + } + getBottomMostViewPosition() { + return this._cursors.getBottomMostViewPosition(); + } + getCursorColumnSelectData() { + if (this._columnSelectData) { + return this._columnSelectData; + } + const primaryCursor = this._cursors.getPrimaryCursor(); + const viewSelectionStart = primaryCursor.viewState.selectionStart.getStartPosition(); + const viewPosition = primaryCursor.viewState.position; + return { + isReal: false, + fromViewLineNumber: viewSelectionStart.lineNumber, + fromViewVisualColumn: this.context.cursorConfig.visibleColumnFromColumn(this._viewModel, viewSelectionStart), + toViewLineNumber: viewPosition.lineNumber, + toViewVisualColumn: this.context.cursorConfig.visibleColumnFromColumn(this._viewModel, viewPosition) + }; + } + getSelections() { + return this._cursors.getSelections(); + } + setSelections(eventsCollector, source, selections, reason) { + this.setStates(eventsCollector, source, reason, CursorState.fromModelSelections(selections)); + } + getPrevEditOperationType() { + return this._prevEditOperationType; + } + setPrevEditOperationType(type) { + this._prevEditOperationType = type; + } + // ------ auxiliary handling logic + _pushAutoClosedAction(autoClosedCharactersRanges, autoClosedEnclosingRanges) { + const autoClosedCharactersDeltaDecorations = []; + const autoClosedEnclosingDeltaDecorations = []; + for (let i = 0, len = autoClosedCharactersRanges.length; i < len; i++) { + autoClosedCharactersDeltaDecorations.push({ + range: autoClosedCharactersRanges[i], + options: { + description: "auto-closed-character", + inlineClassName: "auto-closed-character", + stickiness: 1 + /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ + } + }); + autoClosedEnclosingDeltaDecorations.push({ + range: autoClosedEnclosingRanges[i], + options: { + description: "auto-closed-enclosing", + stickiness: 1 + /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ + } + }); + } + const autoClosedCharactersDecorations = this._model.deltaDecorations([], autoClosedCharactersDeltaDecorations); + const autoClosedEnclosingDecorations = this._model.deltaDecorations([], autoClosedEnclosingDeltaDecorations); + this._autoClosedActions.push(new AutoClosedAction(this._model, autoClosedCharactersDecorations, autoClosedEnclosingDecorations)); + } + _executeEditOperation(opResult) { + if (!opResult) { + return; + } + if (opResult.shouldPushStackElementBefore) { + this._model.pushStackElement(); + } + const result = CommandExecutor.executeCommands(this._model, this._cursors.getSelections(), opResult.commands); + if (result) { + this._interpretCommandResult(result); + const autoClosedCharactersRanges = []; + const autoClosedEnclosingRanges = []; + for (let i = 0; i < opResult.commands.length; i++) { + const command = opResult.commands[i]; + if (command instanceof TypeWithAutoClosingCommand && command.enclosingRange && command.closeCharacterRange) { + autoClosedCharactersRanges.push(command.closeCharacterRange); + autoClosedEnclosingRanges.push(command.enclosingRange); + } + } + if (autoClosedCharactersRanges.length > 0) { + this._pushAutoClosedAction(autoClosedCharactersRanges, autoClosedEnclosingRanges); + } + this._prevEditOperationType = opResult.type; + } + if (opResult.shouldPushStackElementAfter) { + this._model.pushStackElement(); + } + } + _interpretCommandResult(cursorState) { + if (!cursorState || cursorState.length === 0) { + cursorState = this._cursors.readSelectionFromMarkers(); + } + this._columnSelectData = null; + this._cursors.setSelections(cursorState); + this._cursors.normalize(); + } + // ----------------------------------------------------------------------------------------------------------- + // ----- emitting events + _emitStateChangedIfNecessary(eventsCollector, source, reason, oldState, reachedMaxCursorCount) { + const newState = CursorModelState.from(this._model, this); + if (newState.equals(oldState)) { + return false; + } + const selections = this._cursors.getSelections(); + const viewSelections = this._cursors.getViewSelections(); + eventsCollector.emitViewEvent(new ViewCursorStateChangedEvent(viewSelections, selections, reason)); + if (!oldState || oldState.cursorState.length !== newState.cursorState.length || newState.cursorState.some((newCursorState, i) => !newCursorState.modelState.equals(oldState.cursorState[i].modelState))) { + const oldSelections = oldState ? oldState.cursorState.map((s) => s.modelState.selection) : null; + const oldModelVersionId = oldState ? oldState.modelVersionId : 0; + eventsCollector.emitOutgoingEvent(new CursorStateChangedEvent(oldSelections, selections, oldModelVersionId, newState.modelVersionId, source || "keyboard", reason, reachedMaxCursorCount)); + } + return true; + } + // ----------------------------------------------------------------------------------------------------------- + // ----- handlers beyond this point + _findAutoClosingPairs(edits) { + if (!edits.length) { + return null; + } + const indices = []; + for (let i = 0, len = edits.length; i < len; i++) { + const edit = edits[i]; + if (!edit.text || edit.text.indexOf("\n") >= 0) { + return null; + } + const m = edit.text.match(/([)\]}>'"`])([^)\]}>'"`]*)$/); + if (!m) { + return null; + } + const closeChar = m[1]; + const autoClosingPairsCandidates = this.context.cursorConfig.autoClosingPairs.autoClosingPairsCloseSingleChar.get(closeChar); + if (!autoClosingPairsCandidates || autoClosingPairsCandidates.length !== 1) { + return null; + } + const openChar = autoClosingPairsCandidates[0].open; + const closeCharIndex = edit.text.length - m[2].length - 1; + const openCharIndex = edit.text.lastIndexOf(openChar, closeCharIndex - 1); + if (openCharIndex === -1) { + return null; + } + indices.push([openCharIndex, closeCharIndex]); + } + return indices; + } + executeEdits(eventsCollector, source, edits, cursorStateComputer) { + let autoClosingIndices = null; + if (source === "snippet") { + autoClosingIndices = this._findAutoClosingPairs(edits); + } + if (autoClosingIndices) { + edits[0]._isTracked = true; + } + const autoClosedCharactersRanges = []; + const autoClosedEnclosingRanges = []; + const selections = this._model.pushEditOperations(this.getSelections(), edits, (undoEdits) => { + if (autoClosingIndices) { + for (let i = 0, len = autoClosingIndices.length; i < len; i++) { + const [openCharInnerIndex, closeCharInnerIndex] = autoClosingIndices[i]; + const undoEdit = undoEdits[i]; + const lineNumber = undoEdit.range.startLineNumber; + const openCharIndex = undoEdit.range.startColumn - 1 + openCharInnerIndex; + const closeCharIndex = undoEdit.range.startColumn - 1 + closeCharInnerIndex; + autoClosedCharactersRanges.push(new Range(lineNumber, closeCharIndex + 1, lineNumber, closeCharIndex + 2)); + autoClosedEnclosingRanges.push(new Range(lineNumber, openCharIndex + 1, lineNumber, closeCharIndex + 2)); + } + } + const selections2 = cursorStateComputer(undoEdits); + if (selections2) { + this._isHandling = true; + } + return selections2; + }); + if (selections) { + this._isHandling = false; + this.setSelections( + eventsCollector, + source, + selections, + 0 + /* CursorChangeReason.NotSet */ + ); + } + if (autoClosedCharactersRanges.length > 0) { + this._pushAutoClosedAction(autoClosedCharactersRanges, autoClosedEnclosingRanges); + } + } + _executeEdit(callback, eventsCollector, source, cursorChangeReason = 0) { + if (this.context.cursorConfig.readOnly) { + return; + } + const oldState = CursorModelState.from(this._model, this); + this._cursors.stopTrackingSelections(); + this._isHandling = true; + try { + this._cursors.ensureValidState(); + callback(); + } catch (err) { + onUnexpectedError(err); + } + this._isHandling = false; + this._cursors.startTrackingSelections(); + this._validateAutoClosedActions(); + if (this._emitStateChangedIfNecessary(eventsCollector, source, cursorChangeReason, oldState, false)) { + this.revealAll( + eventsCollector, + source, + false, + 0, + true, + 0 + /* editorCommon.ScrollType.Smooth */ + ); + } + } + getAutoClosedCharacters() { + return AutoClosedAction.getAllAutoClosedCharacters(this._autoClosedActions); + } + startComposition(eventsCollector) { + this._compositionState = new CompositionState(this._model, this.getSelections()); + } + endComposition(eventsCollector, source) { + const compositionOutcome = this._compositionState ? this._compositionState.deduceOutcome(this._model, this.getSelections()) : null; + this._compositionState = null; + this._executeEdit(() => { + if (source === "keyboard") { + this._executeEditOperation(TypeOperations.compositionEndWithInterceptors(this._prevEditOperationType, this.context.cursorConfig, this._model, compositionOutcome, this.getSelections(), this.getAutoClosedCharacters())); + } + }, eventsCollector, source); + } + type(eventsCollector, text2, source) { + this._executeEdit(() => { + if (source === "keyboard") { + const len = text2.length; + let offset = 0; + while (offset < len) { + const charLength = nextCharLength(text2, offset); + const chr = text2.substr(offset, charLength); + this._executeEditOperation(TypeOperations.typeWithInterceptors(!!this._compositionState, this._prevEditOperationType, this.context.cursorConfig, this._model, this.getSelections(), this.getAutoClosedCharacters(), chr)); + offset += charLength; + } + } else { + this._executeEditOperation(TypeOperations.typeWithoutInterceptors(this._prevEditOperationType, this.context.cursorConfig, this._model, this.getSelections(), text2)); + } + }, eventsCollector, source); + } + compositionType(eventsCollector, text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source) { + if (text2.length === 0 && replacePrevCharCnt === 0 && replaceNextCharCnt === 0) { + if (positionDelta !== 0) { + const newSelections = this.getSelections().map((selection) => { + const position = selection.getPosition(); + return new Selection(position.lineNumber, position.column + positionDelta, position.lineNumber, position.column + positionDelta); + }); + this.setSelections( + eventsCollector, + source, + newSelections, + 0 + /* CursorChangeReason.NotSet */ + ); + } + return; + } + this._executeEdit(() => { + this._executeEditOperation(TypeOperations.compositionType(this._prevEditOperationType, this.context.cursorConfig, this._model, this.getSelections(), text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta)); + }, eventsCollector, source); + } + paste(eventsCollector, text2, pasteOnNewLine, multicursorText, source) { + this._executeEdit( + () => { + this._executeEditOperation(TypeOperations.paste(this.context.cursorConfig, this._model, this.getSelections(), text2, pasteOnNewLine, multicursorText || [])); + }, + eventsCollector, + source, + 4 + /* CursorChangeReason.Paste */ + ); + } + cut(eventsCollector, source) { + this._executeEdit(() => { + this._executeEditOperation(DeleteOperations.cut(this.context.cursorConfig, this._model, this.getSelections())); + }, eventsCollector, source); + } + executeCommand(eventsCollector, command, source) { + this._executeEdit(() => { + this._cursors.killSecondaryCursors(); + this._executeEditOperation(new EditOperationResult(0, [command], { + shouldPushStackElementBefore: false, + shouldPushStackElementAfter: false + })); + }, eventsCollector, source); + } + executeCommands(eventsCollector, commands, source) { + this._executeEdit(() => { + this._executeEditOperation(new EditOperationResult(0, commands, { + shouldPushStackElementBefore: false, + shouldPushStackElementAfter: false + })); + }, eventsCollector, source); + } + }; + CursorModelState = class _CursorModelState { + static from(model, cursor) { + return new _CursorModelState(model.getVersionId(), cursor.getCursorStates()); + } + constructor(modelVersionId, cursorState) { + this.modelVersionId = modelVersionId; + this.cursorState = cursorState; + } + equals(other) { + if (!other) { + return false; + } + if (this.modelVersionId !== other.modelVersionId) { + return false; + } + if (this.cursorState.length !== other.cursorState.length) { + return false; + } + for (let i = 0, len = this.cursorState.length; i < len; i++) { + if (!this.cursorState[i].equals(other.cursorState[i])) { + return false; + } + } + return true; + } + }; + AutoClosedAction = class { + static getAllAutoClosedCharacters(autoClosedActions) { + let autoClosedCharacters = []; + for (const autoClosedAction of autoClosedActions) { + autoClosedCharacters = autoClosedCharacters.concat(autoClosedAction.getAutoClosedCharactersRanges()); + } + return autoClosedCharacters; + } + constructor(model, autoClosedCharactersDecorations, autoClosedEnclosingDecorations) { + this._model = model; + this._autoClosedCharactersDecorations = autoClosedCharactersDecorations; + this._autoClosedEnclosingDecorations = autoClosedEnclosingDecorations; + } + dispose() { + this._autoClosedCharactersDecorations = this._model.deltaDecorations(this._autoClosedCharactersDecorations, []); + this._autoClosedEnclosingDecorations = this._model.deltaDecorations(this._autoClosedEnclosingDecorations, []); + } + getAutoClosedCharactersRanges() { + const result = []; + for (let i = 0; i < this._autoClosedCharactersDecorations.length; i++) { + const decorationRange = this._model.getDecorationRange(this._autoClosedCharactersDecorations[i]); + if (decorationRange) { + result.push(decorationRange); + } + } + return result; + } + isValid(selections) { + const enclosingRanges = []; + for (let i = 0; i < this._autoClosedEnclosingDecorations.length; i++) { + const decorationRange = this._model.getDecorationRange(this._autoClosedEnclosingDecorations[i]); + if (decorationRange) { + enclosingRanges.push(decorationRange); + if (decorationRange.startLineNumber !== decorationRange.endLineNumber) { + return false; + } + } + } + enclosingRanges.sort(Range.compareRangesUsingStarts); + selections.sort(Range.compareRangesUsingStarts); + for (let i = 0; i < selections.length; i++) { + if (i >= enclosingRanges.length) { + return false; + } + if (!enclosingRanges[i].strictContainsRange(selections[i])) { + return false; + } + } + return true; + } + }; + CommandExecutor = class { + static executeCommands(model, selectionsBefore, commands) { + const ctx = { + model, + selectionsBefore, + trackedRanges: [], + trackedRangesDirection: [] + }; + const result = this._innerExecuteCommands(ctx, commands); + for (let i = 0, len = ctx.trackedRanges.length; i < len; i++) { + ctx.model._setTrackedRange( + ctx.trackedRanges[i], + null, + 0 + /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */ + ); + } + return result; + } + static _innerExecuteCommands(ctx, commands) { + if (this._arrayIsEmpty(commands)) { + return null; + } + const commandsData = this._getEditOperations(ctx, commands); + if (commandsData.operations.length === 0) { + return null; + } + const rawOperations = commandsData.operations; + const loserCursorsMap = this._getLoserCursorMap(rawOperations); + if (loserCursorsMap.hasOwnProperty("0")) { + console.warn("Ignoring commands"); + return null; + } + const filteredOperations = []; + for (let i = 0, len = rawOperations.length; i < len; i++) { + if (!loserCursorsMap.hasOwnProperty(rawOperations[i].identifier.major.toString())) { + filteredOperations.push(rawOperations[i]); + } + } + if (commandsData.hadTrackedEditOperation && filteredOperations.length > 0) { + filteredOperations[0]._isTracked = true; + } + let selectionsAfter = ctx.model.pushEditOperations(ctx.selectionsBefore, filteredOperations, (inverseEditOperations) => { + const groupedInverseEditOperations = []; + for (let i = 0; i < ctx.selectionsBefore.length; i++) { + groupedInverseEditOperations[i] = []; + } + for (const op of inverseEditOperations) { + if (!op.identifier) { + continue; + } + groupedInverseEditOperations[op.identifier.major].push(op); + } + const minorBasedSorter = (a3, b) => { + return a3.identifier.minor - b.identifier.minor; + }; + const cursorSelections = []; + for (let i = 0; i < ctx.selectionsBefore.length; i++) { + if (groupedInverseEditOperations[i].length > 0) { + groupedInverseEditOperations[i].sort(minorBasedSorter); + cursorSelections[i] = commands[i].computeCursorState(ctx.model, { + getInverseEditOperations: () => { + return groupedInverseEditOperations[i]; + }, + getTrackedSelection: (id) => { + const idx = parseInt(id, 10); + const range2 = ctx.model._getTrackedRange(ctx.trackedRanges[idx]); + if (ctx.trackedRangesDirection[idx] === 0) { + return new Selection(range2.startLineNumber, range2.startColumn, range2.endLineNumber, range2.endColumn); + } + return new Selection(range2.endLineNumber, range2.endColumn, range2.startLineNumber, range2.startColumn); + } + }); + } else { + cursorSelections[i] = ctx.selectionsBefore[i]; + } + } + return cursorSelections; + }); + if (!selectionsAfter) { + selectionsAfter = ctx.selectionsBefore; + } + const losingCursors = []; + for (const losingCursorIndex in loserCursorsMap) { + if (loserCursorsMap.hasOwnProperty(losingCursorIndex)) { + losingCursors.push(parseInt(losingCursorIndex, 10)); + } + } + losingCursors.sort((a3, b) => { + return b - a3; + }); + for (const losingCursor of losingCursors) { + selectionsAfter.splice(losingCursor, 1); + } + return selectionsAfter; + } + static _arrayIsEmpty(commands) { + for (let i = 0, len = commands.length; i < len; i++) { + if (commands[i]) { + return false; + } + } + return true; + } + static _getEditOperations(ctx, commands) { + let operations = []; + let hadTrackedEditOperation = false; + for (let i = 0, len = commands.length; i < len; i++) { + const command = commands[i]; + if (command) { + const r = this._getEditOperationsFromCommand(ctx, i, command); + operations = operations.concat(r.operations); + hadTrackedEditOperation = hadTrackedEditOperation || r.hadTrackedEditOperation; + } + } + return { + operations, + hadTrackedEditOperation + }; + } + static _getEditOperationsFromCommand(ctx, majorIdentifier, command) { + const operations = []; + let operationMinor = 0; + const addEditOperation = (range2, text2, forceMoveMarkers = false) => { + if (Range.isEmpty(range2) && text2 === "") { + return; + } + operations.push({ + identifier: { + major: majorIdentifier, + minor: operationMinor++ + }, + range: range2, + text: text2, + forceMoveMarkers, + isAutoWhitespaceEdit: command.insertsAutoWhitespace + }); + }; + let hadTrackedEditOperation = false; + const addTrackedEditOperation = (selection, text2, forceMoveMarkers) => { + hadTrackedEditOperation = true; + addEditOperation(selection, text2, forceMoveMarkers); + }; + const trackSelection = (_selection, trackPreviousOnEmpty) => { + const selection = Selection.liftSelection(_selection); + let stickiness; + if (selection.isEmpty()) { + if (typeof trackPreviousOnEmpty === "boolean") { + if (trackPreviousOnEmpty) { + stickiness = 2; + } else { + stickiness = 3; + } + } else { + const maxLineColumn = ctx.model.getLineMaxColumn(selection.startLineNumber); + if (selection.startColumn === maxLineColumn) { + stickiness = 2; + } else { + stickiness = 3; + } + } + } else { + stickiness = 1; + } + const l = ctx.trackedRanges.length; + const id = ctx.model._setTrackedRange(null, selection, stickiness); + ctx.trackedRanges[l] = id; + ctx.trackedRangesDirection[l] = selection.getDirection(); + return l.toString(); + }; + const editOperationBuilder = { + addEditOperation, + addTrackedEditOperation, + trackSelection + }; + try { + command.getEditOperations(ctx.model, editOperationBuilder); + } catch (e) { + onUnexpectedError(e); + return { + operations: [], + hadTrackedEditOperation: false + }; + } + return { + operations, + hadTrackedEditOperation + }; + } + static _getLoserCursorMap(operations) { + operations = operations.slice(0); + operations.sort((a3, b) => { + return -Range.compareRangesUsingEnds(a3.range, b.range); + }); + const loserCursorsMap = {}; + for (let i = 1; i < operations.length; i++) { + const previousOp = operations[i - 1]; + const currentOp = operations[i]; + if (Range.getStartPosition(previousOp.range).isBefore(Range.getEndPosition(currentOp.range))) { + let loserMajor; + if (previousOp.identifier.major > currentOp.identifier.major) { + loserMajor = previousOp.identifier.major; + } else { + loserMajor = currentOp.identifier.major; + } + loserCursorsMap[loserMajor.toString()] = true; + for (let j = 0; j < operations.length; j++) { + if (operations[j].identifier.major === loserMajor) { + operations.splice(j, 1); + if (j < i) { + i--; + } + j--; + } + } + if (i > 0) { + i--; + } + } + } + return loserCursorsMap; + } + }; + CompositionLineState = class { + constructor(text2, startSelection, endSelection) { + this.text = text2; + this.startSelection = startSelection; + this.endSelection = endSelection; + } + }; + CompositionState = class _CompositionState { + static _capture(textModel, selections) { + const result = []; + for (const selection of selections) { + if (selection.startLineNumber !== selection.endLineNumber) { + return null; + } + result.push(new CompositionLineState(textModel.getLineContent(selection.startLineNumber), selection.startColumn - 1, selection.endColumn - 1)); + } + return result; + } + constructor(textModel, selections) { + this._original = _CompositionState._capture(textModel, selections); + } + /** + * Returns the inserted text during this composition. + * If the composition resulted in existing text being changed (i.e. not a pure insertion) it returns null. + */ + deduceOutcome(textModel, selections) { + if (!this._original) { + return null; + } + const current = _CompositionState._capture(textModel, selections); + if (!current) { + return null; + } + if (this._original.length !== current.length) { + return null; + } + const result = []; + for (let i = 0, len = this._original.length; i < len; i++) { + result.push(_CompositionState._deduceOutcome(this._original[i], current[i])); + } + return result; + } + static _deduceOutcome(original, current) { + const commonPrefix = Math.min(original.startSelection, current.startSelection, commonPrefixLength(original.text, current.text)); + const commonSuffix = Math.min(original.text.length - original.endSelection, current.text.length - current.endSelection, commonSuffixLength(original.text, current.text)); + const deletedText = original.text.substring(commonPrefix, original.text.length - commonSuffix); + const insertedText = current.text.substring(commonPrefix, current.text.length - commonSuffix); + return new CompositionOutcome(deletedText, original.startSelection - commonPrefix, original.endSelection - commonPrefix, insertedText, current.startSelection - commonPrefix, current.endSelection - commonPrefix); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/textToHtmlTokenizer.js +function tokenizeToString(languageService, text2, languageId) { + return __async(this, null, function* () { + if (!languageId) { + return _tokenizeToString(text2, languageService.languageIdCodec, fallback); + } + const tokenizationSupport = yield TokenizationRegistry2.getOrCreate(languageId); + return _tokenizeToString(text2, languageService.languageIdCodec, tokenizationSupport || fallback); + }); +} +function tokenizeLineToHTML(text2, viewLineTokens, colorMap, startOffset, endOffset, tabSize, useNbsp) { + let result = `
`; + let charIndex = startOffset; + let tabsCharDelta = 0; + let prevIsSpace = true; + for (let tokenIndex = 0, tokenCount = viewLineTokens.getCount(); tokenIndex < tokenCount; tokenIndex++) { + const tokenEndIndex = viewLineTokens.getEndOffset(tokenIndex); + if (tokenEndIndex <= startOffset) { + continue; + } + let partContent = ""; + for (; charIndex < tokenEndIndex && charIndex < endOffset; charIndex++) { + const charCode = text2.charCodeAt(charIndex); + switch (charCode) { + case 9: { + let insertSpacesCount = tabSize - (charIndex + tabsCharDelta) % tabSize; + tabsCharDelta += insertSpacesCount - 1; + while (insertSpacesCount > 0) { + if (useNbsp && prevIsSpace) { + partContent += " "; + prevIsSpace = false; + } else { + partContent += " "; + prevIsSpace = true; + } + insertSpacesCount--; + } + break; + } + case 60: + partContent += "<"; + prevIsSpace = false; + break; + case 62: + partContent += ">"; + prevIsSpace = false; + break; + case 38: + partContent += "&"; + prevIsSpace = false; + break; + case 0: + partContent += "�"; + prevIsSpace = false; + break; + case 65279: + case 8232: + case 8233: + case 133: + partContent += "\uFFFD"; + prevIsSpace = false; + break; + case 13: + partContent += "​"; + prevIsSpace = false; + break; + case 32: + if (useNbsp && prevIsSpace) { + partContent += " "; + prevIsSpace = false; + } else { + partContent += " "; + prevIsSpace = true; + } + break; + default: + partContent += String.fromCharCode(charCode); + prevIsSpace = false; + } + } + result += `${partContent}`; + if (tokenEndIndex > endOffset || charIndex >= endOffset) { + break; + } + } + result += `
`; + return result; +} +function _tokenizeToString(text2, languageIdCodec, tokenizationSupport) { + let result = `
`; + const lines = splitLines(text2); + let currentState = tokenizationSupport.getInitialState(); + for (let i = 0, len = lines.length; i < len; i++) { + const line = lines[i]; + if (i > 0) { + result += `
`; + } + const tokenizationResult = tokenizationSupport.tokenizeEncoded(line, true, currentState); + LineTokens.convertToEndOffset(tokenizationResult.tokens, line.length); + const lineTokens = new LineTokens(tokenizationResult.tokens, line, languageIdCodec); + const viewLineTokens = lineTokens.inflate(); + let startOffset = 0; + for (let j = 0, lenJ = viewLineTokens.getCount(); j < lenJ; j++) { + const type = viewLineTokens.getClassName(j); + const endIndex = viewLineTokens.getEndOffset(j); + result += `${escape(line.substring(startOffset, endIndex))}`; + startOffset = endIndex; + } + currentState = tokenizationResult.endState; + } + result += `
`; + return result; +} +var fallback; +var init_textToHtmlTokenizer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/textToHtmlTokenizer.js"() { + init_strings(); + init_lineTokens(); + init_languages(); + init_nullTokenize(); + fallback = { + getInitialState: () => NullState, + tokenizeEncoded: (buffer, hasEOL, state) => nullTokenizeEncoded(0, state) + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewLayout/linesLayout.js +var PendingChanges, EditorWhitespace, LinesLayout; +var init_linesLayout = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewLayout/linesLayout.js"() { + init_strings(); + PendingChanges = class { + constructor() { + this._hasPending = false; + this._inserts = []; + this._changes = []; + this._removes = []; + } + insert(x) { + this._hasPending = true; + this._inserts.push(x); + } + change(x) { + this._hasPending = true; + this._changes.push(x); + } + remove(x) { + this._hasPending = true; + this._removes.push(x); + } + mustCommit() { + return this._hasPending; + } + commit(linesLayout) { + if (!this._hasPending) { + return; + } + const inserts = this._inserts; + const changes = this._changes; + const removes = this._removes; + this._hasPending = false; + this._inserts = []; + this._changes = []; + this._removes = []; + linesLayout._commitPendingChanges(inserts, changes, removes); + } + }; + EditorWhitespace = class { + constructor(id, afterLineNumber, ordinal, height, minWidth) { + this.id = id; + this.afterLineNumber = afterLineNumber; + this.ordinal = ordinal; + this.height = height; + this.minWidth = minWidth; + this.prefixSum = 0; + } + }; + LinesLayout = class _LinesLayout { + constructor(lineCount, lineHeight, paddingTop, paddingBottom) { + this._instanceId = singleLetterHash(++_LinesLayout.INSTANCE_COUNT); + this._pendingChanges = new PendingChanges(); + this._lastWhitespaceId = 0; + this._arr = []; + this._prefixSumValidIndex = -1; + this._minWidth = -1; + this._lineCount = lineCount; + this._lineHeight = lineHeight; + this._paddingTop = paddingTop; + this._paddingBottom = paddingBottom; + } + /** + * Find the insertion index for a new value inside a sorted array of values. + * If the value is already present in the sorted array, the insertion index will be after the already existing value. + */ + static findInsertionIndex(arr, afterLineNumber, ordinal) { + let low = 0; + let high = arr.length; + while (low < high) { + const mid = low + high >>> 1; + if (afterLineNumber === arr[mid].afterLineNumber) { + if (ordinal < arr[mid].ordinal) { + high = mid; + } else { + low = mid + 1; + } + } else if (afterLineNumber < arr[mid].afterLineNumber) { + high = mid; + } else { + low = mid + 1; + } + } + return low; + } + /** + * Change the height of a line in pixels. + */ + setLineHeight(lineHeight) { + this._checkPendingChanges(); + this._lineHeight = lineHeight; + } + /** + * Changes the padding used to calculate vertical offsets. + */ + setPadding(paddingTop, paddingBottom) { + this._paddingTop = paddingTop; + this._paddingBottom = paddingBottom; + } + /** + * Set the number of lines. + * + * @param lineCount New number of lines. + */ + onFlushed(lineCount) { + this._checkPendingChanges(); + this._lineCount = lineCount; + } + changeWhitespace(callback) { + let hadAChange = false; + try { + const accessor = { + insertWhitespace: (afterLineNumber, ordinal, heightInPx, minWidth) => { + hadAChange = true; + afterLineNumber = afterLineNumber | 0; + ordinal = ordinal | 0; + heightInPx = heightInPx | 0; + minWidth = minWidth | 0; + const id = this._instanceId + ++this._lastWhitespaceId; + this._pendingChanges.insert(new EditorWhitespace(id, afterLineNumber, ordinal, heightInPx, minWidth)); + return id; + }, + changeOneWhitespace: (id, newAfterLineNumber, newHeight) => { + hadAChange = true; + newAfterLineNumber = newAfterLineNumber | 0; + newHeight = newHeight | 0; + this._pendingChanges.change({ id, newAfterLineNumber, newHeight }); + }, + removeWhitespace: (id) => { + hadAChange = true; + this._pendingChanges.remove({ id }); + } + }; + callback(accessor); + } finally { + this._pendingChanges.commit(this); + } + return hadAChange; + } + _commitPendingChanges(inserts, changes, removes) { + if (inserts.length > 0 || removes.length > 0) { + this._minWidth = -1; + } + if (inserts.length + changes.length + removes.length <= 1) { + for (const insert of inserts) { + this._insertWhitespace(insert); + } + for (const change of changes) { + this._changeOneWhitespace(change.id, change.newAfterLineNumber, change.newHeight); + } + for (const remove of removes) { + const index = this._findWhitespaceIndex(remove.id); + if (index === -1) { + continue; + } + this._removeWhitespace(index); + } + return; + } + const toRemove = /* @__PURE__ */ new Set(); + for (const remove of removes) { + toRemove.add(remove.id); + } + const toChange = /* @__PURE__ */ new Map(); + for (const change of changes) { + toChange.set(change.id, change); + } + const applyRemoveAndChange = (whitespaces) => { + const result2 = []; + for (const whitespace of whitespaces) { + if (toRemove.has(whitespace.id)) { + continue; + } + if (toChange.has(whitespace.id)) { + const change = toChange.get(whitespace.id); + whitespace.afterLineNumber = change.newAfterLineNumber; + whitespace.height = change.newHeight; + } + result2.push(whitespace); + } + return result2; + }; + const result = applyRemoveAndChange(this._arr).concat(applyRemoveAndChange(inserts)); + result.sort((a3, b) => { + if (a3.afterLineNumber === b.afterLineNumber) { + return a3.ordinal - b.ordinal; + } + return a3.afterLineNumber - b.afterLineNumber; + }); + this._arr = result; + this._prefixSumValidIndex = -1; + } + _checkPendingChanges() { + if (this._pendingChanges.mustCommit()) { + this._pendingChanges.commit(this); + } + } + _insertWhitespace(whitespace) { + const insertIndex = _LinesLayout.findInsertionIndex(this._arr, whitespace.afterLineNumber, whitespace.ordinal); + this._arr.splice(insertIndex, 0, whitespace); + this._prefixSumValidIndex = Math.min(this._prefixSumValidIndex, insertIndex - 1); + } + _findWhitespaceIndex(id) { + const arr = this._arr; + for (let i = 0, len = arr.length; i < len; i++) { + if (arr[i].id === id) { + return i; + } + } + return -1; + } + _changeOneWhitespace(id, newAfterLineNumber, newHeight) { + const index = this._findWhitespaceIndex(id); + if (index === -1) { + return; + } + if (this._arr[index].height !== newHeight) { + this._arr[index].height = newHeight; + this._prefixSumValidIndex = Math.min(this._prefixSumValidIndex, index - 1); + } + if (this._arr[index].afterLineNumber !== newAfterLineNumber) { + const whitespace = this._arr[index]; + this._removeWhitespace(index); + whitespace.afterLineNumber = newAfterLineNumber; + this._insertWhitespace(whitespace); + } + } + _removeWhitespace(removeIndex) { + this._arr.splice(removeIndex, 1); + this._prefixSumValidIndex = Math.min(this._prefixSumValidIndex, removeIndex - 1); + } + /** + * Notify the layouter that lines have been deleted (a continuous zone of lines). + * + * @param fromLineNumber The line number at which the deletion started, inclusive + * @param toLineNumber The line number at which the deletion ended, inclusive + */ + onLinesDeleted(fromLineNumber, toLineNumber) { + this._checkPendingChanges(); + fromLineNumber = fromLineNumber | 0; + toLineNumber = toLineNumber | 0; + this._lineCount -= toLineNumber - fromLineNumber + 1; + for (let i = 0, len = this._arr.length; i < len; i++) { + const afterLineNumber = this._arr[i].afterLineNumber; + if (fromLineNumber <= afterLineNumber && afterLineNumber <= toLineNumber) { + this._arr[i].afterLineNumber = fromLineNumber - 1; + } else if (afterLineNumber > toLineNumber) { + this._arr[i].afterLineNumber -= toLineNumber - fromLineNumber + 1; + } + } + } + /** + * Notify the layouter that lines have been inserted (a continuous zone of lines). + * + * @param fromLineNumber The line number at which the insertion started, inclusive + * @param toLineNumber The line number at which the insertion ended, inclusive. + */ + onLinesInserted(fromLineNumber, toLineNumber) { + this._checkPendingChanges(); + fromLineNumber = fromLineNumber | 0; + toLineNumber = toLineNumber | 0; + this._lineCount += toLineNumber - fromLineNumber + 1; + for (let i = 0, len = this._arr.length; i < len; i++) { + const afterLineNumber = this._arr[i].afterLineNumber; + if (fromLineNumber <= afterLineNumber) { + this._arr[i].afterLineNumber += toLineNumber - fromLineNumber + 1; + } + } + } + /** + * Get the sum of all the whitespaces. + */ + getWhitespacesTotalHeight() { + this._checkPendingChanges(); + if (this._arr.length === 0) { + return 0; + } + return this.getWhitespacesAccumulatedHeight(this._arr.length - 1); + } + /** + * Return the sum of the heights of the whitespaces at [0..index]. + * This includes the whitespace at `index`. + * + * @param index The index of the whitespace. + * @return The sum of the heights of all whitespaces before the one at `index`, including the one at `index`. + */ + getWhitespacesAccumulatedHeight(index) { + this._checkPendingChanges(); + index = index | 0; + let startIndex = Math.max(0, this._prefixSumValidIndex + 1); + if (startIndex === 0) { + this._arr[0].prefixSum = this._arr[0].height; + startIndex++; + } + for (let i = startIndex; i <= index; i++) { + this._arr[i].prefixSum = this._arr[i - 1].prefixSum + this._arr[i].height; + } + this._prefixSumValidIndex = Math.max(this._prefixSumValidIndex, index); + return this._arr[index].prefixSum; + } + /** + * Get the sum of heights for all objects. + * + * @return The sum of heights for all objects. + */ + getLinesTotalHeight() { + this._checkPendingChanges(); + const linesHeight = this._lineHeight * this._lineCount; + const whitespacesHeight = this.getWhitespacesTotalHeight(); + return linesHeight + whitespacesHeight + this._paddingTop + this._paddingBottom; + } + /** + * Returns the accumulated height of whitespaces before the given line number. + * + * @param lineNumber The line number + */ + getWhitespaceAccumulatedHeightBeforeLineNumber(lineNumber) { + this._checkPendingChanges(); + lineNumber = lineNumber | 0; + const lastWhitespaceBeforeLineNumber = this._findLastWhitespaceBeforeLineNumber(lineNumber); + if (lastWhitespaceBeforeLineNumber === -1) { + return 0; + } + return this.getWhitespacesAccumulatedHeight(lastWhitespaceBeforeLineNumber); + } + _findLastWhitespaceBeforeLineNumber(lineNumber) { + lineNumber = lineNumber | 0; + const arr = this._arr; + let low = 0; + let high = arr.length - 1; + while (low <= high) { + const delta = high - low | 0; + const halfDelta = delta / 2 | 0; + const mid = low + halfDelta | 0; + if (arr[mid].afterLineNumber < lineNumber) { + if (mid + 1 >= arr.length || arr[mid + 1].afterLineNumber >= lineNumber) { + return mid; + } else { + low = mid + 1 | 0; + } + } else { + high = mid - 1 | 0; + } + } + return -1; + } + _findFirstWhitespaceAfterLineNumber(lineNumber) { + lineNumber = lineNumber | 0; + const lastWhitespaceBeforeLineNumber = this._findLastWhitespaceBeforeLineNumber(lineNumber); + const firstWhitespaceAfterLineNumber = lastWhitespaceBeforeLineNumber + 1; + if (firstWhitespaceAfterLineNumber < this._arr.length) { + return firstWhitespaceAfterLineNumber; + } + return -1; + } + /** + * Find the index of the first whitespace which has `afterLineNumber` >= `lineNumber`. + * @return The index of the first whitespace with `afterLineNumber` >= `lineNumber` or -1 if no whitespace is found. + */ + getFirstWhitespaceIndexAfterLineNumber(lineNumber) { + this._checkPendingChanges(); + lineNumber = lineNumber | 0; + return this._findFirstWhitespaceAfterLineNumber(lineNumber); + } + /** + * Get the vertical offset (the sum of heights for all objects above) a certain line number. + * + * @param lineNumber The line number + * @return The sum of heights for all objects above `lineNumber`. + */ + getVerticalOffsetForLineNumber(lineNumber, includeViewZones = false) { + this._checkPendingChanges(); + lineNumber = lineNumber | 0; + let previousLinesHeight; + if (lineNumber > 1) { + previousLinesHeight = this._lineHeight * (lineNumber - 1); + } else { + previousLinesHeight = 0; + } + const previousWhitespacesHeight = this.getWhitespaceAccumulatedHeightBeforeLineNumber(lineNumber - (includeViewZones ? 1 : 0)); + return previousLinesHeight + previousWhitespacesHeight + this._paddingTop; + } + /** + * Get the vertical offset (the sum of heights for all objects above) a certain line number. + * + * @param lineNumber The line number + * @return The sum of heights for all objects above `lineNumber`. + */ + getVerticalOffsetAfterLineNumber(lineNumber, includeViewZones = false) { + this._checkPendingChanges(); + lineNumber = lineNumber | 0; + const previousLinesHeight = this._lineHeight * lineNumber; + const previousWhitespacesHeight = this.getWhitespaceAccumulatedHeightBeforeLineNumber(lineNumber + (includeViewZones ? 1 : 0)); + return previousLinesHeight + previousWhitespacesHeight + this._paddingTop; + } + /** + * The maximum min width for all whitespaces. + */ + getWhitespaceMinWidth() { + this._checkPendingChanges(); + if (this._minWidth === -1) { + let minWidth = 0; + for (let i = 0, len = this._arr.length; i < len; i++) { + minWidth = Math.max(minWidth, this._arr[i].minWidth); + } + this._minWidth = minWidth; + } + return this._minWidth; + } + /** + * Check if `verticalOffset` is below all lines. + */ + isAfterLines(verticalOffset) { + this._checkPendingChanges(); + const totalHeight = this.getLinesTotalHeight(); + return verticalOffset > totalHeight; + } + isInTopPadding(verticalOffset) { + if (this._paddingTop === 0) { + return false; + } + this._checkPendingChanges(); + return verticalOffset < this._paddingTop; + } + isInBottomPadding(verticalOffset) { + if (this._paddingBottom === 0) { + return false; + } + this._checkPendingChanges(); + const totalHeight = this.getLinesTotalHeight(); + return verticalOffset >= totalHeight - this._paddingBottom; + } + /** + * Find the first line number that is at or after vertical offset `verticalOffset`. + * i.e. if getVerticalOffsetForLine(line) is x and getVerticalOffsetForLine(line + 1) is y, then + * getLineNumberAtOrAfterVerticalOffset(i) = line, x <= i < y. + * + * @param verticalOffset The vertical offset to search at. + * @return The line number at or after vertical offset `verticalOffset`. + */ + getLineNumberAtOrAfterVerticalOffset(verticalOffset) { + this._checkPendingChanges(); + verticalOffset = verticalOffset | 0; + if (verticalOffset < 0) { + return 1; + } + const linesCount = this._lineCount | 0; + const lineHeight = this._lineHeight; + let minLineNumber = 1; + let maxLineNumber = linesCount; + while (minLineNumber < maxLineNumber) { + const midLineNumber = (minLineNumber + maxLineNumber) / 2 | 0; + const midLineNumberVerticalOffset = this.getVerticalOffsetForLineNumber(midLineNumber) | 0; + if (verticalOffset >= midLineNumberVerticalOffset + lineHeight) { + minLineNumber = midLineNumber + 1; + } else if (verticalOffset >= midLineNumberVerticalOffset) { + return midLineNumber; + } else { + maxLineNumber = midLineNumber; + } + } + if (minLineNumber > linesCount) { + return linesCount; + } + return minLineNumber; + } + /** + * Get all the lines and their relative vertical offsets that are positioned between `verticalOffset1` and `verticalOffset2`. + * + * @param verticalOffset1 The beginning of the viewport. + * @param verticalOffset2 The end of the viewport. + * @return A structure describing the lines positioned between `verticalOffset1` and `verticalOffset2`. + */ + getLinesViewportData(verticalOffset1, verticalOffset2) { + this._checkPendingChanges(); + verticalOffset1 = verticalOffset1 | 0; + verticalOffset2 = verticalOffset2 | 0; + const lineHeight = this._lineHeight; + const startLineNumber = this.getLineNumberAtOrAfterVerticalOffset(verticalOffset1) | 0; + const startLineNumberVerticalOffset = this.getVerticalOffsetForLineNumber(startLineNumber) | 0; + let endLineNumber = this._lineCount | 0; + let whitespaceIndex = this.getFirstWhitespaceIndexAfterLineNumber(startLineNumber) | 0; + const whitespaceCount = this.getWhitespacesCount() | 0; + let currentWhitespaceHeight; + let currentWhitespaceAfterLineNumber; + if (whitespaceIndex === -1) { + whitespaceIndex = whitespaceCount; + currentWhitespaceAfterLineNumber = endLineNumber + 1; + currentWhitespaceHeight = 0; + } else { + currentWhitespaceAfterLineNumber = this.getAfterLineNumberForWhitespaceIndex(whitespaceIndex) | 0; + currentWhitespaceHeight = this.getHeightForWhitespaceIndex(whitespaceIndex) | 0; + } + let currentVerticalOffset = startLineNumberVerticalOffset; + let currentLineRelativeOffset = currentVerticalOffset; + const STEP_SIZE = 5e5; + let bigNumbersDelta = 0; + if (startLineNumberVerticalOffset >= STEP_SIZE) { + bigNumbersDelta = Math.floor(startLineNumberVerticalOffset / STEP_SIZE) * STEP_SIZE; + bigNumbersDelta = Math.floor(bigNumbersDelta / lineHeight) * lineHeight; + currentLineRelativeOffset -= bigNumbersDelta; + } + const linesOffsets = []; + const verticalCenter = verticalOffset1 + (verticalOffset2 - verticalOffset1) / 2; + let centeredLineNumber = -1; + for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { + if (centeredLineNumber === -1) { + const currentLineTop = currentVerticalOffset; + const currentLineBottom = currentVerticalOffset + lineHeight; + if (currentLineTop <= verticalCenter && verticalCenter < currentLineBottom || currentLineTop > verticalCenter) { + centeredLineNumber = lineNumber; + } + } + currentVerticalOffset += lineHeight; + linesOffsets[lineNumber - startLineNumber] = currentLineRelativeOffset; + currentLineRelativeOffset += lineHeight; + while (currentWhitespaceAfterLineNumber === lineNumber) { + currentLineRelativeOffset += currentWhitespaceHeight; + currentVerticalOffset += currentWhitespaceHeight; + whitespaceIndex++; + if (whitespaceIndex >= whitespaceCount) { + currentWhitespaceAfterLineNumber = endLineNumber + 1; + } else { + currentWhitespaceAfterLineNumber = this.getAfterLineNumberForWhitespaceIndex(whitespaceIndex) | 0; + currentWhitespaceHeight = this.getHeightForWhitespaceIndex(whitespaceIndex) | 0; + } + } + if (currentVerticalOffset >= verticalOffset2) { + endLineNumber = lineNumber; + break; + } + } + if (centeredLineNumber === -1) { + centeredLineNumber = endLineNumber; + } + const endLineNumberVerticalOffset = this.getVerticalOffsetForLineNumber(endLineNumber) | 0; + let completelyVisibleStartLineNumber = startLineNumber; + let completelyVisibleEndLineNumber = endLineNumber; + if (completelyVisibleStartLineNumber < completelyVisibleEndLineNumber) { + if (startLineNumberVerticalOffset < verticalOffset1) { + completelyVisibleStartLineNumber++; + } + } + if (completelyVisibleStartLineNumber < completelyVisibleEndLineNumber) { + if (endLineNumberVerticalOffset + lineHeight > verticalOffset2) { + completelyVisibleEndLineNumber--; + } + } + return { + bigNumbersDelta, + startLineNumber, + endLineNumber, + relativeVerticalOffset: linesOffsets, + centeredLineNumber, + completelyVisibleStartLineNumber, + completelyVisibleEndLineNumber, + lineHeight: this._lineHeight + }; + } + getVerticalOffsetForWhitespaceIndex(whitespaceIndex) { + this._checkPendingChanges(); + whitespaceIndex = whitespaceIndex | 0; + const afterLineNumber = this.getAfterLineNumberForWhitespaceIndex(whitespaceIndex); + let previousLinesHeight; + if (afterLineNumber >= 1) { + previousLinesHeight = this._lineHeight * afterLineNumber; + } else { + previousLinesHeight = 0; + } + let previousWhitespacesHeight; + if (whitespaceIndex > 0) { + previousWhitespacesHeight = this.getWhitespacesAccumulatedHeight(whitespaceIndex - 1); + } else { + previousWhitespacesHeight = 0; + } + return previousLinesHeight + previousWhitespacesHeight + this._paddingTop; + } + getWhitespaceIndexAtOrAfterVerticallOffset(verticalOffset) { + this._checkPendingChanges(); + verticalOffset = verticalOffset | 0; + let minWhitespaceIndex = 0; + let maxWhitespaceIndex = this.getWhitespacesCount() - 1; + if (maxWhitespaceIndex < 0) { + return -1; + } + const maxWhitespaceVerticalOffset = this.getVerticalOffsetForWhitespaceIndex(maxWhitespaceIndex); + const maxWhitespaceHeight = this.getHeightForWhitespaceIndex(maxWhitespaceIndex); + if (verticalOffset >= maxWhitespaceVerticalOffset + maxWhitespaceHeight) { + return -1; + } + while (minWhitespaceIndex < maxWhitespaceIndex) { + const midWhitespaceIndex = Math.floor((minWhitespaceIndex + maxWhitespaceIndex) / 2); + const midWhitespaceVerticalOffset = this.getVerticalOffsetForWhitespaceIndex(midWhitespaceIndex); + const midWhitespaceHeight = this.getHeightForWhitespaceIndex(midWhitespaceIndex); + if (verticalOffset >= midWhitespaceVerticalOffset + midWhitespaceHeight) { + minWhitespaceIndex = midWhitespaceIndex + 1; + } else if (verticalOffset >= midWhitespaceVerticalOffset) { + return midWhitespaceIndex; + } else { + maxWhitespaceIndex = midWhitespaceIndex; + } + } + return minWhitespaceIndex; + } + /** + * Get exactly the whitespace that is layouted at `verticalOffset`. + * + * @param verticalOffset The vertical offset. + * @return Precisely the whitespace that is layouted at `verticaloffset` or null. + */ + getWhitespaceAtVerticalOffset(verticalOffset) { + this._checkPendingChanges(); + verticalOffset = verticalOffset | 0; + const candidateIndex = this.getWhitespaceIndexAtOrAfterVerticallOffset(verticalOffset); + if (candidateIndex < 0) { + return null; + } + if (candidateIndex >= this.getWhitespacesCount()) { + return null; + } + const candidateTop = this.getVerticalOffsetForWhitespaceIndex(candidateIndex); + if (candidateTop > verticalOffset) { + return null; + } + const candidateHeight = this.getHeightForWhitespaceIndex(candidateIndex); + const candidateId = this.getIdForWhitespaceIndex(candidateIndex); + const candidateAfterLineNumber = this.getAfterLineNumberForWhitespaceIndex(candidateIndex); + return { + id: candidateId, + afterLineNumber: candidateAfterLineNumber, + verticalOffset: candidateTop, + height: candidateHeight + }; + } + /** + * Get a list of whitespaces that are positioned between `verticalOffset1` and `verticalOffset2`. + * + * @param verticalOffset1 The beginning of the viewport. + * @param verticalOffset2 The end of the viewport. + * @return An array with all the whitespaces in the viewport. If no whitespace is in viewport, the array is empty. + */ + getWhitespaceViewportData(verticalOffset1, verticalOffset2) { + this._checkPendingChanges(); + verticalOffset1 = verticalOffset1 | 0; + verticalOffset2 = verticalOffset2 | 0; + const startIndex = this.getWhitespaceIndexAtOrAfterVerticallOffset(verticalOffset1); + const endIndex = this.getWhitespacesCount() - 1; + if (startIndex < 0) { + return []; + } + const result = []; + for (let i = startIndex; i <= endIndex; i++) { + const top = this.getVerticalOffsetForWhitespaceIndex(i); + const height = this.getHeightForWhitespaceIndex(i); + if (top >= verticalOffset2) { + break; + } + result.push({ + id: this.getIdForWhitespaceIndex(i), + afterLineNumber: this.getAfterLineNumberForWhitespaceIndex(i), + verticalOffset: top, + height + }); + } + return result; + } + /** + * Get all whitespaces. + */ + getWhitespaces() { + this._checkPendingChanges(); + return this._arr.slice(0); + } + /** + * The number of whitespaces. + */ + getWhitespacesCount() { + this._checkPendingChanges(); + return this._arr.length; + } + /** + * Get the `id` for whitespace at index `index`. + * + * @param index The index of the whitespace. + * @return `id` of whitespace at `index`. + */ + getIdForWhitespaceIndex(index) { + this._checkPendingChanges(); + index = index | 0; + return this._arr[index].id; + } + /** + * Get the `afterLineNumber` for whitespace at index `index`. + * + * @param index The index of the whitespace. + * @return `afterLineNumber` of whitespace at `index`. + */ + getAfterLineNumberForWhitespaceIndex(index) { + this._checkPendingChanges(); + index = index | 0; + return this._arr[index].afterLineNumber; + } + /** + * Get the `height` for whitespace at index `index`. + * + * @param index The index of the whitespace. + * @return `height` of whitespace at `index`. + */ + getHeightForWhitespaceIndex(index) { + this._checkPendingChanges(); + index = index | 0; + return this._arr[index].height; + } + }; + LinesLayout.INSTANCE_COUNT = 0; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewLayout/viewLayout.js +var SMOOTH_SCROLLING_TIME, EditorScrollDimensions, EditorScrollable, ViewLayout; +var init_viewLayout = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewLayout/viewLayout.js"() { + init_event(); + init_lifecycle(); + init_scrollable(); + init_linesLayout(); + init_viewModel(); + init_viewModelEventDispatcher(); + SMOOTH_SCROLLING_TIME = 125; + EditorScrollDimensions = class { + constructor(width2, contentWidth, height, contentHeight) { + width2 = width2 | 0; + contentWidth = contentWidth | 0; + height = height | 0; + contentHeight = contentHeight | 0; + if (width2 < 0) { + width2 = 0; + } + if (contentWidth < 0) { + contentWidth = 0; + } + if (height < 0) { + height = 0; + } + if (contentHeight < 0) { + contentHeight = 0; + } + this.width = width2; + this.contentWidth = contentWidth; + this.scrollWidth = Math.max(width2, contentWidth); + this.height = height; + this.contentHeight = contentHeight; + this.scrollHeight = Math.max(height, contentHeight); + } + equals(other) { + return this.width === other.width && this.contentWidth === other.contentWidth && this.height === other.height && this.contentHeight === other.contentHeight; + } + }; + EditorScrollable = class extends Disposable { + constructor(smoothScrollDuration, scheduleAtNextAnimationFrame2) { + super(); + this._onDidContentSizeChange = this._register(new Emitter()); + this.onDidContentSizeChange = this._onDidContentSizeChange.event; + this._dimensions = new EditorScrollDimensions(0, 0, 0, 0); + this._scrollable = this._register(new Scrollable({ + forceIntegerValues: true, + smoothScrollDuration, + scheduleAtNextAnimationFrame: scheduleAtNextAnimationFrame2 + })); + this.onDidScroll = this._scrollable.onScroll; + } + getScrollable() { + return this._scrollable; + } + setSmoothScrollDuration(smoothScrollDuration) { + this._scrollable.setSmoothScrollDuration(smoothScrollDuration); + } + validateScrollPosition(scrollPosition) { + return this._scrollable.validateScrollPosition(scrollPosition); + } + getScrollDimensions() { + return this._dimensions; + } + setScrollDimensions(dimensions) { + if (this._dimensions.equals(dimensions)) { + return; + } + const oldDimensions = this._dimensions; + this._dimensions = dimensions; + this._scrollable.setScrollDimensions({ + width: dimensions.width, + scrollWidth: dimensions.scrollWidth, + height: dimensions.height, + scrollHeight: dimensions.scrollHeight + }, true); + const contentWidthChanged = oldDimensions.contentWidth !== dimensions.contentWidth; + const contentHeightChanged = oldDimensions.contentHeight !== dimensions.contentHeight; + if (contentWidthChanged || contentHeightChanged) { + this._onDidContentSizeChange.fire(new ContentSizeChangedEvent(oldDimensions.contentWidth, oldDimensions.contentHeight, dimensions.contentWidth, dimensions.contentHeight)); + } + } + getFutureScrollPosition() { + return this._scrollable.getFutureScrollPosition(); + } + getCurrentScrollPosition() { + return this._scrollable.getCurrentScrollPosition(); + } + setScrollPositionNow(update) { + this._scrollable.setScrollPositionNow(update); + } + setScrollPositionSmooth(update) { + this._scrollable.setScrollPositionSmooth(update); + } + hasPendingScrollAnimation() { + return this._scrollable.hasPendingScrollAnimation(); + } + }; + ViewLayout = class extends Disposable { + constructor(configuration, lineCount, scheduleAtNextAnimationFrame2) { + super(); + this._configuration = configuration; + const options2 = this._configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + const padding = options2.get( + 84 + /* EditorOption.padding */ + ); + this._linesLayout = new LinesLayout(lineCount, options2.get( + 67 + /* EditorOption.lineHeight */ + ), padding.top, padding.bottom); + this._maxLineWidth = 0; + this._overlayWidgetsMinWidth = 0; + this._scrollable = this._register(new EditorScrollable(0, scheduleAtNextAnimationFrame2)); + this._configureSmoothScrollDuration(); + this._scrollable.setScrollDimensions(new EditorScrollDimensions(layoutInfo.contentWidth, 0, layoutInfo.height, 0)); + this.onDidScroll = this._scrollable.onDidScroll; + this.onDidContentSizeChange = this._scrollable.onDidContentSizeChange; + this._updateHeight(); + } + dispose() { + super.dispose(); + } + getScrollable() { + return this._scrollable.getScrollable(); + } + onHeightMaybeChanged() { + this._updateHeight(); + } + _configureSmoothScrollDuration() { + this._scrollable.setSmoothScrollDuration(this._configuration.options.get( + 114 + /* EditorOption.smoothScrolling */ + ) ? SMOOTH_SCROLLING_TIME : 0); + } + // ---- begin view event handlers + onConfigurationChanged(e) { + const options2 = this._configuration.options; + if (e.hasChanged( + 67 + /* EditorOption.lineHeight */ + )) { + this._linesLayout.setLineHeight(options2.get( + 67 + /* EditorOption.lineHeight */ + )); + } + if (e.hasChanged( + 84 + /* EditorOption.padding */ + )) { + const padding = options2.get( + 84 + /* EditorOption.padding */ + ); + this._linesLayout.setPadding(padding.top, padding.bottom); + } + if (e.hasChanged( + 145 + /* EditorOption.layoutInfo */ + )) { + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + const width2 = layoutInfo.contentWidth; + const height = layoutInfo.height; + const scrollDimensions = this._scrollable.getScrollDimensions(); + const contentWidth = scrollDimensions.contentWidth; + this._scrollable.setScrollDimensions(new EditorScrollDimensions(width2, scrollDimensions.contentWidth, height, this._getContentHeight(width2, height, contentWidth))); + } else { + this._updateHeight(); + } + if (e.hasChanged( + 114 + /* EditorOption.smoothScrolling */ + )) { + this._configureSmoothScrollDuration(); + } + } + onFlushed(lineCount) { + this._linesLayout.onFlushed(lineCount); + } + onLinesDeleted(fromLineNumber, toLineNumber) { + this._linesLayout.onLinesDeleted(fromLineNumber, toLineNumber); + } + onLinesInserted(fromLineNumber, toLineNumber) { + this._linesLayout.onLinesInserted(fromLineNumber, toLineNumber); + } + // ---- end view event handlers + _getHorizontalScrollbarHeight(width2, scrollWidth) { + const options2 = this._configuration.options; + const scrollbar = options2.get( + 103 + /* EditorOption.scrollbar */ + ); + if (scrollbar.horizontal === 2) { + return 0; + } + if (width2 >= scrollWidth) { + return 0; + } + return scrollbar.horizontalScrollbarSize; + } + _getContentHeight(width2, height, contentWidth) { + const options2 = this._configuration.options; + let result = this._linesLayout.getLinesTotalHeight(); + if (options2.get( + 105 + /* EditorOption.scrollBeyondLastLine */ + )) { + result += Math.max(0, height - options2.get( + 67 + /* EditorOption.lineHeight */ + ) - options2.get( + 84 + /* EditorOption.padding */ + ).bottom); + } else if (!options2.get( + 103 + /* EditorOption.scrollbar */ + ).ignoreHorizontalScrollbarInContentHeight) { + result += this._getHorizontalScrollbarHeight(width2, contentWidth); + } + return result; + } + _updateHeight() { + const scrollDimensions = this._scrollable.getScrollDimensions(); + const width2 = scrollDimensions.width; + const height = scrollDimensions.height; + const contentWidth = scrollDimensions.contentWidth; + this._scrollable.setScrollDimensions(new EditorScrollDimensions(width2, scrollDimensions.contentWidth, height, this._getContentHeight(width2, height, contentWidth))); + } + // ---- Layouting logic + getCurrentViewport() { + const scrollDimensions = this._scrollable.getScrollDimensions(); + const currentScrollPosition = this._scrollable.getCurrentScrollPosition(); + return new Viewport(currentScrollPosition.scrollTop, currentScrollPosition.scrollLeft, scrollDimensions.width, scrollDimensions.height); + } + getFutureViewport() { + const scrollDimensions = this._scrollable.getScrollDimensions(); + const currentScrollPosition = this._scrollable.getFutureScrollPosition(); + return new Viewport(currentScrollPosition.scrollTop, currentScrollPosition.scrollLeft, scrollDimensions.width, scrollDimensions.height); + } + _computeContentWidth() { + const options2 = this._configuration.options; + const maxLineWidth = this._maxLineWidth; + const wrappingInfo = options2.get( + 146 + /* EditorOption.wrappingInfo */ + ); + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + if (wrappingInfo.isViewportWrapping) { + const minimap = options2.get( + 73 + /* EditorOption.minimap */ + ); + if (maxLineWidth > layoutInfo.contentWidth + fontInfo.typicalHalfwidthCharacterWidth) { + if (minimap.enabled && minimap.side === "right") { + return maxLineWidth + layoutInfo.verticalScrollbarWidth; + } + } + return maxLineWidth; + } else { + const extraHorizontalSpace = options2.get( + 104 + /* EditorOption.scrollBeyondLastColumn */ + ) * fontInfo.typicalHalfwidthCharacterWidth; + const whitespaceMinWidth = this._linesLayout.getWhitespaceMinWidth(); + return Math.max(maxLineWidth + extraHorizontalSpace + layoutInfo.verticalScrollbarWidth, whitespaceMinWidth, this._overlayWidgetsMinWidth); + } + } + setMaxLineWidth(maxLineWidth) { + this._maxLineWidth = maxLineWidth; + this._updateContentWidth(); + } + setOverlayWidgetsMinWidth(maxMinWidth) { + this._overlayWidgetsMinWidth = maxMinWidth; + this._updateContentWidth(); + } + _updateContentWidth() { + const scrollDimensions = this._scrollable.getScrollDimensions(); + this._scrollable.setScrollDimensions(new EditorScrollDimensions(scrollDimensions.width, this._computeContentWidth(), scrollDimensions.height, scrollDimensions.contentHeight)); + this._updateHeight(); + } + // ---- view state + saveState() { + const currentScrollPosition = this._scrollable.getFutureScrollPosition(); + const scrollTop = currentScrollPosition.scrollTop; + const firstLineNumberInViewport = this._linesLayout.getLineNumberAtOrAfterVerticalOffset(scrollTop); + const whitespaceAboveFirstLine = this._linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(firstLineNumberInViewport); + return { + scrollTop, + scrollTopWithoutViewZones: scrollTop - whitespaceAboveFirstLine, + scrollLeft: currentScrollPosition.scrollLeft + }; + } + // ---- + changeWhitespace(callback) { + const hadAChange = this._linesLayout.changeWhitespace(callback); + if (hadAChange) { + this.onHeightMaybeChanged(); + } + return hadAChange; + } + getVerticalOffsetForLineNumber(lineNumber, includeViewZones = false) { + return this._linesLayout.getVerticalOffsetForLineNumber(lineNumber, includeViewZones); + } + getVerticalOffsetAfterLineNumber(lineNumber, includeViewZones = false) { + return this._linesLayout.getVerticalOffsetAfterLineNumber(lineNumber, includeViewZones); + } + isAfterLines(verticalOffset) { + return this._linesLayout.isAfterLines(verticalOffset); + } + isInTopPadding(verticalOffset) { + return this._linesLayout.isInTopPadding(verticalOffset); + } + isInBottomPadding(verticalOffset) { + return this._linesLayout.isInBottomPadding(verticalOffset); + } + getLineNumberAtVerticalOffset(verticalOffset) { + return this._linesLayout.getLineNumberAtOrAfterVerticalOffset(verticalOffset); + } + getWhitespaceAtVerticalOffset(verticalOffset) { + return this._linesLayout.getWhitespaceAtVerticalOffset(verticalOffset); + } + getLinesViewportData() { + const visibleBox = this.getCurrentViewport(); + return this._linesLayout.getLinesViewportData(visibleBox.top, visibleBox.top + visibleBox.height); + } + getLinesViewportDataAtScrollTop(scrollTop) { + const scrollDimensions = this._scrollable.getScrollDimensions(); + if (scrollTop + scrollDimensions.height > scrollDimensions.scrollHeight) { + scrollTop = scrollDimensions.scrollHeight - scrollDimensions.height; + } + if (scrollTop < 0) { + scrollTop = 0; + } + return this._linesLayout.getLinesViewportData(scrollTop, scrollTop + scrollDimensions.height); + } + getWhitespaceViewportData() { + const visibleBox = this.getCurrentViewport(); + return this._linesLayout.getWhitespaceViewportData(visibleBox.top, visibleBox.top + visibleBox.height); + } + getWhitespaces() { + return this._linesLayout.getWhitespaces(); + } + // ---- + getContentWidth() { + const scrollDimensions = this._scrollable.getScrollDimensions(); + return scrollDimensions.contentWidth; + } + getScrollWidth() { + const scrollDimensions = this._scrollable.getScrollDimensions(); + return scrollDimensions.scrollWidth; + } + getContentHeight() { + const scrollDimensions = this._scrollable.getScrollDimensions(); + return scrollDimensions.contentHeight; + } + getScrollHeight() { + const scrollDimensions = this._scrollable.getScrollDimensions(); + return scrollDimensions.scrollHeight; + } + getCurrentScrollLeft() { + const currentScrollPosition = this._scrollable.getCurrentScrollPosition(); + return currentScrollPosition.scrollLeft; + } + getCurrentScrollTop() { + const currentScrollPosition = this._scrollable.getCurrentScrollPosition(); + return currentScrollPosition.scrollTop; + } + validateScrollPosition(scrollPosition) { + return this._scrollable.validateScrollPosition(scrollPosition); + } + setScrollPosition(position, type) { + if (type === 1) { + this._scrollable.setScrollPositionNow(position); + } else { + this._scrollable.setScrollPositionSmooth(position); + } + } + hasPendingScrollAnimation() { + return this._scrollable.hasPendingScrollAnimation(); + } + deltaScrollNow(deltaScrollLeft, deltaScrollTop) { + const currentScrollPosition = this._scrollable.getCurrentScrollPosition(); + this._scrollable.setScrollPositionNow({ + scrollLeft: currentScrollPosition.scrollLeft + deltaScrollLeft, + scrollTop: currentScrollPosition.scrollTop + deltaScrollTop + }); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewModel/viewModelDecorations.js +function isModelDecorationVisible(model, decoration3) { + if (decoration3.options.hideInCommentTokens && isModelDecorationInComment(model, decoration3)) { + return false; + } + if (decoration3.options.hideInStringTokens && isModelDecorationInString(model, decoration3)) { + return false; + } + return true; +} +function isModelDecorationInComment(model, decoration3) { + return testTokensInRange( + model, + decoration3.range, + (tokenType) => tokenType === 1 + /* StandardTokenType.Comment */ + ); +} +function isModelDecorationInString(model, decoration3) { + return testTokensInRange( + model, + decoration3.range, + (tokenType) => tokenType === 2 + /* StandardTokenType.String */ + ); +} +function testTokensInRange(model, range2, callback) { + for (let lineNumber = range2.startLineNumber; lineNumber <= range2.endLineNumber; lineNumber++) { + const lineTokens = model.tokenization.getLineTokens(lineNumber); + const isFirstLine = lineNumber === range2.startLineNumber; + const isEndLine = lineNumber === range2.endLineNumber; + let tokenIdx = isFirstLine ? lineTokens.findTokenIndexAtOffset(range2.startColumn - 1) : 0; + while (tokenIdx < lineTokens.getCount()) { + if (isEndLine) { + const startOffset = lineTokens.getStartOffset(tokenIdx); + if (startOffset > range2.endColumn - 1) { + break; + } + } + const callbackResult = callback(lineTokens.getStandardTokenType(tokenIdx)); + if (!callbackResult) { + return false; + } + tokenIdx++; + } + } + return true; +} +var ViewModelDecorations; +var init_viewModelDecorations = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewModel/viewModelDecorations.js"() { + init_position(); + init_range(); + init_viewModel(); + init_editorOptions(); + ViewModelDecorations = class { + constructor(editorId, model, configuration, linesCollection, coordinatesConverter) { + this.editorId = editorId; + this.model = model; + this.configuration = configuration; + this._linesCollection = linesCollection; + this._coordinatesConverter = coordinatesConverter; + this._decorationsCache = /* @__PURE__ */ Object.create(null); + this._cachedModelDecorationsResolver = null; + this._cachedModelDecorationsResolverViewRange = null; + } + _clearCachedModelDecorationsResolver() { + this._cachedModelDecorationsResolver = null; + this._cachedModelDecorationsResolverViewRange = null; + } + dispose() { + this._decorationsCache = /* @__PURE__ */ Object.create(null); + this._clearCachedModelDecorationsResolver(); + } + reset() { + this._decorationsCache = /* @__PURE__ */ Object.create(null); + this._clearCachedModelDecorationsResolver(); + } + onModelDecorationsChanged() { + this._decorationsCache = /* @__PURE__ */ Object.create(null); + this._clearCachedModelDecorationsResolver(); + } + onLineMappingChanged() { + this._decorationsCache = /* @__PURE__ */ Object.create(null); + this._clearCachedModelDecorationsResolver(); + } + _getOrCreateViewModelDecoration(modelDecoration) { + const id = modelDecoration.id; + let r = this._decorationsCache[id]; + if (!r) { + const modelRange = modelDecoration.range; + const options2 = modelDecoration.options; + let viewRange; + if (options2.isWholeLine) { + const start = this._coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.startLineNumber, 1), 0, false, true); + const end = this._coordinatesConverter.convertModelPositionToViewPosition( + new Position(modelRange.endLineNumber, this.model.getLineMaxColumn(modelRange.endLineNumber)), + 1 + /* PositionAffinity.Right */ + ); + viewRange = new Range(start.lineNumber, start.column, end.lineNumber, end.column); + } else { + viewRange = this._coordinatesConverter.convertModelRangeToViewRange( + modelRange, + 1 + /* PositionAffinity.Right */ + ); + } + r = new ViewModelDecoration(viewRange, options2); + this._decorationsCache[id] = r; + } + return r; + } + getMinimapDecorationsInRange(range2) { + return this._getDecorationsInRange(range2, true, false).decorations; + } + getDecorationsViewportData(viewRange) { + let cacheIsValid = this._cachedModelDecorationsResolver !== null; + cacheIsValid = cacheIsValid && viewRange.equalsRange(this._cachedModelDecorationsResolverViewRange); + if (!cacheIsValid) { + this._cachedModelDecorationsResolver = this._getDecorationsInRange(viewRange, false, false); + this._cachedModelDecorationsResolverViewRange = viewRange; + } + return this._cachedModelDecorationsResolver; + } + getInlineDecorationsOnLine(lineNumber, onlyMinimapDecorations = false, onlyMarginDecorations = false) { + const range2 = new Range(lineNumber, this._linesCollection.getViewLineMinColumn(lineNumber), lineNumber, this._linesCollection.getViewLineMaxColumn(lineNumber)); + return this._getDecorationsInRange(range2, onlyMinimapDecorations, onlyMarginDecorations).inlineDecorations[0]; + } + _getDecorationsInRange(viewRange, onlyMinimapDecorations, onlyMarginDecorations) { + const modelDecorations = this._linesCollection.getDecorationsInRange(viewRange, this.editorId, filterValidationDecorations(this.configuration.options), onlyMinimapDecorations, onlyMarginDecorations); + const startLineNumber = viewRange.startLineNumber; + const endLineNumber = viewRange.endLineNumber; + const decorationsInViewport = []; + let decorationsInViewportLen = 0; + const inlineDecorations = []; + for (let j = startLineNumber; j <= endLineNumber; j++) { + inlineDecorations[j - startLineNumber] = []; + } + for (let i = 0, len = modelDecorations.length; i < len; i++) { + const modelDecoration = modelDecorations[i]; + const decorationOptions = modelDecoration.options; + if (!isModelDecorationVisible(this.model, modelDecoration)) { + continue; + } + const viewModelDecoration = this._getOrCreateViewModelDecoration(modelDecoration); + const viewRange2 = viewModelDecoration.range; + decorationsInViewport[decorationsInViewportLen++] = viewModelDecoration; + if (decorationOptions.inlineClassName) { + const inlineDecoration = new InlineDecoration( + viewRange2, + decorationOptions.inlineClassName, + decorationOptions.inlineClassNameAffectsLetterSpacing ? 3 : 0 + /* InlineDecorationType.Regular */ + ); + const intersectedStartLineNumber = Math.max(startLineNumber, viewRange2.startLineNumber); + const intersectedEndLineNumber = Math.min(endLineNumber, viewRange2.endLineNumber); + for (let j = intersectedStartLineNumber; j <= intersectedEndLineNumber; j++) { + inlineDecorations[j - startLineNumber].push(inlineDecoration); + } + } + if (decorationOptions.beforeContentClassName) { + if (startLineNumber <= viewRange2.startLineNumber && viewRange2.startLineNumber <= endLineNumber) { + const inlineDecoration = new InlineDecoration( + new Range(viewRange2.startLineNumber, viewRange2.startColumn, viewRange2.startLineNumber, viewRange2.startColumn), + decorationOptions.beforeContentClassName, + 1 + /* InlineDecorationType.Before */ + ); + inlineDecorations[viewRange2.startLineNumber - startLineNumber].push(inlineDecoration); + } + } + if (decorationOptions.afterContentClassName) { + if (startLineNumber <= viewRange2.endLineNumber && viewRange2.endLineNumber <= endLineNumber) { + const inlineDecoration = new InlineDecoration( + new Range(viewRange2.endLineNumber, viewRange2.endColumn, viewRange2.endLineNumber, viewRange2.endColumn), + decorationOptions.afterContentClassName, + 2 + /* InlineDecorationType.After */ + ); + inlineDecorations[viewRange2.endLineNumber - startLineNumber].push(inlineDecoration); + } + } + } + return { + decorations: decorationsInViewport, + inlineDecorations + }; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewModel/modelLineProjection.js +function createModelLineProjection(lineBreakData, isVisible) { + if (lineBreakData === null) { + if (isVisible) { + return IdentityModelLineProjection.INSTANCE; + } + return HiddenModelLineProjection.INSTANCE; + } else { + return new ModelLineProjection(lineBreakData, isVisible); + } +} +function spaces(count) { + if (count >= _spaces.length) { + for (let i = 1; i <= count; i++) { + _spaces[i] = _makeSpaces(i); + } + } + return _spaces[count]; +} +function _makeSpaces(count) { + return new Array(count + 1).join(" "); +} +var ModelLineProjection, IdentityModelLineProjection, HiddenModelLineProjection, _spaces; +var init_modelLineProjection = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewModel/modelLineProjection.js"() { + init_lineTokens(); + init_position(); + init_textModelEvents(); + init_viewModel(); + ModelLineProjection = class { + constructor(lineBreakData, isVisible) { + this._projectionData = lineBreakData; + this._isVisible = isVisible; + } + isVisible() { + return this._isVisible; + } + setVisible(isVisible) { + this._isVisible = isVisible; + return this; + } + getProjectionData() { + return this._projectionData; + } + getViewLineCount() { + if (!this._isVisible) { + return 0; + } + return this._projectionData.getOutputLineCount(); + } + getViewLineContent(model, modelLineNumber, outputLineIndex) { + this._assertVisible(); + const startOffsetInInputWithInjections = outputLineIndex > 0 ? this._projectionData.breakOffsets[outputLineIndex - 1] : 0; + const endOffsetInInputWithInjections = this._projectionData.breakOffsets[outputLineIndex]; + let r; + if (this._projectionData.injectionOffsets !== null) { + const injectedTexts = this._projectionData.injectionOffsets.map((offset, idx) => new LineInjectedText(0, 0, offset + 1, this._projectionData.injectionOptions[idx], 0)); + const lineWithInjections = LineInjectedText.applyInjectedText(model.getLineContent(modelLineNumber), injectedTexts); + r = lineWithInjections.substring(startOffsetInInputWithInjections, endOffsetInInputWithInjections); + } else { + r = model.getValueInRange({ + startLineNumber: modelLineNumber, + startColumn: startOffsetInInputWithInjections + 1, + endLineNumber: modelLineNumber, + endColumn: endOffsetInInputWithInjections + 1 + }); + } + if (outputLineIndex > 0) { + r = spaces(this._projectionData.wrappedTextIndentLength) + r; + } + return r; + } + getViewLineLength(model, modelLineNumber, outputLineIndex) { + this._assertVisible(); + return this._projectionData.getLineLength(outputLineIndex); + } + getViewLineMinColumn(_model, _modelLineNumber, outputLineIndex) { + this._assertVisible(); + return this._projectionData.getMinOutputOffset(outputLineIndex) + 1; + } + getViewLineMaxColumn(model, modelLineNumber, outputLineIndex) { + this._assertVisible(); + return this._projectionData.getMaxOutputOffset(outputLineIndex) + 1; + } + /** + * Try using {@link getViewLinesData} instead. + */ + getViewLineData(model, modelLineNumber, outputLineIndex) { + const arr = new Array(); + this.getViewLinesData(model, modelLineNumber, outputLineIndex, 1, 0, [true], arr); + return arr[0]; + } + getViewLinesData(model, modelLineNumber, outputLineIdx, lineCount, globalStartIndex, needed, result) { + this._assertVisible(); + const lineBreakData = this._projectionData; + const injectionOffsets = lineBreakData.injectionOffsets; + const injectionOptions = lineBreakData.injectionOptions; + let inlineDecorationsPerOutputLine = null; + if (injectionOffsets) { + inlineDecorationsPerOutputLine = []; + let totalInjectedTextLengthBefore = 0; + let currentInjectedOffset = 0; + for (let outputLineIndex = 0; outputLineIndex < lineBreakData.getOutputLineCount(); outputLineIndex++) { + const inlineDecorations = new Array(); + inlineDecorationsPerOutputLine[outputLineIndex] = inlineDecorations; + const lineStartOffsetInInputWithInjections = outputLineIndex > 0 ? lineBreakData.breakOffsets[outputLineIndex - 1] : 0; + const lineEndOffsetInInputWithInjections = lineBreakData.breakOffsets[outputLineIndex]; + while (currentInjectedOffset < injectionOffsets.length) { + const length = injectionOptions[currentInjectedOffset].content.length; + const injectedTextStartOffsetInInputWithInjections = injectionOffsets[currentInjectedOffset] + totalInjectedTextLengthBefore; + const injectedTextEndOffsetInInputWithInjections = injectedTextStartOffsetInInputWithInjections + length; + if (injectedTextStartOffsetInInputWithInjections > lineEndOffsetInInputWithInjections) { + break; + } + if (lineStartOffsetInInputWithInjections < injectedTextEndOffsetInInputWithInjections) { + const options2 = injectionOptions[currentInjectedOffset]; + if (options2.inlineClassName) { + const offset = outputLineIndex > 0 ? lineBreakData.wrappedTextIndentLength : 0; + const start = offset + Math.max(injectedTextStartOffsetInInputWithInjections - lineStartOffsetInInputWithInjections, 0); + const end = offset + Math.min(injectedTextEndOffsetInInputWithInjections - lineStartOffsetInInputWithInjections, lineEndOffsetInInputWithInjections - lineStartOffsetInInputWithInjections); + if (start !== end) { + inlineDecorations.push(new SingleLineInlineDecoration(start, end, options2.inlineClassName, options2.inlineClassNameAffectsLetterSpacing)); + } + } + } + if (injectedTextEndOffsetInInputWithInjections <= lineEndOffsetInInputWithInjections) { + totalInjectedTextLengthBefore += length; + currentInjectedOffset++; + } else { + break; + } + } + } + } + let lineWithInjections; + if (injectionOffsets) { + lineWithInjections = model.tokenization.getLineTokens(modelLineNumber).withInserted(injectionOffsets.map((offset, idx) => ({ + offset, + text: injectionOptions[idx].content, + tokenMetadata: LineTokens.defaultTokenMetadata + }))); + } else { + lineWithInjections = model.tokenization.getLineTokens(modelLineNumber); + } + for (let outputLineIndex = outputLineIdx; outputLineIndex < outputLineIdx + lineCount; outputLineIndex++) { + const globalIndex = globalStartIndex + outputLineIndex - outputLineIdx; + if (!needed[globalIndex]) { + result[globalIndex] = null; + continue; + } + result[globalIndex] = this._getViewLineData(lineWithInjections, inlineDecorationsPerOutputLine ? inlineDecorationsPerOutputLine[outputLineIndex] : null, outputLineIndex); + } + } + _getViewLineData(lineWithInjections, inlineDecorations, outputLineIndex) { + this._assertVisible(); + const lineBreakData = this._projectionData; + const deltaStartIndex = outputLineIndex > 0 ? lineBreakData.wrappedTextIndentLength : 0; + const lineStartOffsetInInputWithInjections = outputLineIndex > 0 ? lineBreakData.breakOffsets[outputLineIndex - 1] : 0; + const lineEndOffsetInInputWithInjections = lineBreakData.breakOffsets[outputLineIndex]; + const tokens = lineWithInjections.sliceAndInflate(lineStartOffsetInInputWithInjections, lineEndOffsetInInputWithInjections, deltaStartIndex); + let lineContent = tokens.getLineContent(); + if (outputLineIndex > 0) { + lineContent = spaces(lineBreakData.wrappedTextIndentLength) + lineContent; + } + const minColumn = this._projectionData.getMinOutputOffset(outputLineIndex) + 1; + const maxColumn = lineContent.length + 1; + const continuesWithWrappedLine = outputLineIndex + 1 < this.getViewLineCount(); + const startVisibleColumn = outputLineIndex === 0 ? 0 : lineBreakData.breakOffsetsVisibleColumn[outputLineIndex - 1]; + return new ViewLineData(lineContent, continuesWithWrappedLine, minColumn, maxColumn, startVisibleColumn, tokens, inlineDecorations); + } + getModelColumnOfViewPosition(outputLineIndex, outputColumn) { + this._assertVisible(); + return this._projectionData.translateToInputOffset(outputLineIndex, outputColumn - 1) + 1; + } + getViewPositionOfModelPosition(deltaLineNumber, inputColumn, affinity = 2) { + this._assertVisible(); + const r = this._projectionData.translateToOutputPosition(inputColumn - 1, affinity); + return r.toPosition(deltaLineNumber); + } + getViewLineNumberOfModelPosition(deltaLineNumber, inputColumn) { + this._assertVisible(); + const r = this._projectionData.translateToOutputPosition(inputColumn - 1); + return deltaLineNumber + r.outputLineIndex; + } + normalizePosition(outputLineIndex, outputPosition, affinity) { + const baseViewLineNumber = outputPosition.lineNumber - outputLineIndex; + const normalizedOutputPosition = this._projectionData.normalizeOutputPosition(outputLineIndex, outputPosition.column - 1, affinity); + const result = normalizedOutputPosition.toPosition(baseViewLineNumber); + return result; + } + getInjectedTextAt(outputLineIndex, outputColumn) { + return this._projectionData.getInjectedText(outputLineIndex, outputColumn - 1); + } + _assertVisible() { + if (!this._isVisible) { + throw new Error("Not supported"); + } + } + }; + IdentityModelLineProjection = class { + constructor() { + } + isVisible() { + return true; + } + setVisible(isVisible) { + if (isVisible) { + return this; + } + return HiddenModelLineProjection.INSTANCE; + } + getProjectionData() { + return null; + } + getViewLineCount() { + return 1; + } + getViewLineContent(model, modelLineNumber, _outputLineIndex) { + return model.getLineContent(modelLineNumber); + } + getViewLineLength(model, modelLineNumber, _outputLineIndex) { + return model.getLineLength(modelLineNumber); + } + getViewLineMinColumn(model, modelLineNumber, _outputLineIndex) { + return model.getLineMinColumn(modelLineNumber); + } + getViewLineMaxColumn(model, modelLineNumber, _outputLineIndex) { + return model.getLineMaxColumn(modelLineNumber); + } + getViewLineData(model, modelLineNumber, _outputLineIndex) { + const lineTokens = model.tokenization.getLineTokens(modelLineNumber); + const lineContent = lineTokens.getLineContent(); + return new ViewLineData(lineContent, false, 1, lineContent.length + 1, 0, lineTokens.inflate(), null); + } + getViewLinesData(model, modelLineNumber, _fromOuputLineIndex, _toOutputLineIndex, globalStartIndex, needed, result) { + if (!needed[globalStartIndex]) { + result[globalStartIndex] = null; + return; + } + result[globalStartIndex] = this.getViewLineData(model, modelLineNumber, 0); + } + getModelColumnOfViewPosition(_outputLineIndex, outputColumn) { + return outputColumn; + } + getViewPositionOfModelPosition(deltaLineNumber, inputColumn) { + return new Position(deltaLineNumber, inputColumn); + } + getViewLineNumberOfModelPosition(deltaLineNumber, _inputColumn) { + return deltaLineNumber; + } + normalizePosition(outputLineIndex, outputPosition, affinity) { + return outputPosition; + } + getInjectedTextAt(_outputLineIndex, _outputColumn) { + return null; + } + }; + IdentityModelLineProjection.INSTANCE = new IdentityModelLineProjection(); + HiddenModelLineProjection = class { + constructor() { + } + isVisible() { + return false; + } + setVisible(isVisible) { + if (!isVisible) { + return this; + } + return IdentityModelLineProjection.INSTANCE; + } + getProjectionData() { + return null; + } + getViewLineCount() { + return 0; + } + getViewLineContent(_model, _modelLineNumber, _outputLineIndex) { + throw new Error("Not supported"); + } + getViewLineLength(_model, _modelLineNumber, _outputLineIndex) { + throw new Error("Not supported"); + } + getViewLineMinColumn(_model, _modelLineNumber, _outputLineIndex) { + throw new Error("Not supported"); + } + getViewLineMaxColumn(_model, _modelLineNumber, _outputLineIndex) { + throw new Error("Not supported"); + } + getViewLineData(_model, _modelLineNumber, _outputLineIndex) { + throw new Error("Not supported"); + } + getViewLinesData(_model, _modelLineNumber, _fromOuputLineIndex, _toOutputLineIndex, _globalStartIndex, _needed, _result) { + throw new Error("Not supported"); + } + getModelColumnOfViewPosition(_outputLineIndex, _outputColumn) { + throw new Error("Not supported"); + } + getViewPositionOfModelPosition(_deltaLineNumber, _inputColumn) { + throw new Error("Not supported"); + } + getViewLineNumberOfModelPosition(_deltaLineNumber, _inputColumn) { + throw new Error("Not supported"); + } + normalizePosition(outputLineIndex, outputPosition, affinity) { + throw new Error("Not supported"); + } + getInjectedTextAt(_outputLineIndex, _outputColumn) { + throw new Error("Not supported"); + } + }; + HiddenModelLineProjection.INSTANCE = new HiddenModelLineProjection(); + _spaces = [""]; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewModel/viewModelLines.js +function normalizeLineRanges(ranges) { + if (ranges.length === 0) { + return []; + } + const sortedRanges = ranges.slice(); + sortedRanges.sort(Range.compareRangesUsingStarts); + const result = []; + let currentRangeStart = sortedRanges[0].startLineNumber; + let currentRangeEnd = sortedRanges[0].endLineNumber; + for (let i = 1, len = sortedRanges.length; i < len; i++) { + const range2 = sortedRanges[i]; + if (range2.startLineNumber > currentRangeEnd + 1) { + result.push(new Range(currentRangeStart, 1, currentRangeEnd, 1)); + currentRangeStart = range2.startLineNumber; + currentRangeEnd = range2.endLineNumber; + } else if (range2.endLineNumber > currentRangeEnd) { + currentRangeEnd = range2.endLineNumber; + } + } + result.push(new Range(currentRangeStart, 1, currentRangeEnd, 1)); + return result; +} +var ViewModelLinesFromProjectedModel, ViewLineInfo, ViewLineInfoGroupedByModelRange, CoordinatesConverter, ViewModelLinesFromModelAsIs, IdentityCoordinatesConverter; +var init_viewModelLines = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewModel/viewModelLines.js"() { + init_arrays(); + init_position(); + init_range(); + init_textModelGuides(); + init_textModel(); + init_textModelEvents(); + init_viewEvents(); + init_modelLineProjection(); + init_prefixSumComputer(); + init_viewModel(); + ViewModelLinesFromProjectedModel = class { + constructor(editorId, model, domLineBreaksComputerFactory, monospaceLineBreaksComputerFactory, fontInfo, tabSize, wrappingStrategy, wrappingColumn, wrappingIndent, wordBreak) { + this._editorId = editorId; + this.model = model; + this._validModelVersionId = -1; + this._domLineBreaksComputerFactory = domLineBreaksComputerFactory; + this._monospaceLineBreaksComputerFactory = monospaceLineBreaksComputerFactory; + this.fontInfo = fontInfo; + this.tabSize = tabSize; + this.wrappingStrategy = wrappingStrategy; + this.wrappingColumn = wrappingColumn; + this.wrappingIndent = wrappingIndent; + this.wordBreak = wordBreak; + this._constructLines( + /*resetHiddenAreas*/ + true, + null + ); + } + dispose() { + this.hiddenAreasDecorationIds = this.model.deltaDecorations(this.hiddenAreasDecorationIds, []); + } + createCoordinatesConverter() { + return new CoordinatesConverter(this); + } + _constructLines(resetHiddenAreas, previousLineBreaks) { + this.modelLineProjections = []; + if (resetHiddenAreas) { + this.hiddenAreasDecorationIds = this.model.deltaDecorations(this.hiddenAreasDecorationIds, []); + } + const linesContent = this.model.getLinesContent(); + const injectedTextDecorations = this.model.getInjectedTextDecorations(this._editorId); + const lineCount = linesContent.length; + const lineBreaksComputer = this.createLineBreaksComputer(); + const injectedTextQueue = new ArrayQueue(LineInjectedText.fromDecorations(injectedTextDecorations)); + for (let i = 0; i < lineCount; i++) { + const lineInjectedText = injectedTextQueue.takeWhile((t4) => t4.lineNumber === i + 1); + lineBreaksComputer.addRequest(linesContent[i], lineInjectedText, previousLineBreaks ? previousLineBreaks[i] : null); + } + const linesBreaks = lineBreaksComputer.finalize(); + const values2 = []; + const hiddenAreas = this.hiddenAreasDecorationIds.map((areaId) => this.model.getDecorationRange(areaId)).sort(Range.compareRangesUsingStarts); + let hiddenAreaStart = 1, hiddenAreaEnd = 0; + let hiddenAreaIdx = -1; + let nextLineNumberToUpdateHiddenArea = hiddenAreaIdx + 1 < hiddenAreas.length ? hiddenAreaEnd + 1 : lineCount + 2; + for (let i = 0; i < lineCount; i++) { + const lineNumber = i + 1; + if (lineNumber === nextLineNumberToUpdateHiddenArea) { + hiddenAreaIdx++; + hiddenAreaStart = hiddenAreas[hiddenAreaIdx].startLineNumber; + hiddenAreaEnd = hiddenAreas[hiddenAreaIdx].endLineNumber; + nextLineNumberToUpdateHiddenArea = hiddenAreaIdx + 1 < hiddenAreas.length ? hiddenAreaEnd + 1 : lineCount + 2; + } + const isInHiddenArea = lineNumber >= hiddenAreaStart && lineNumber <= hiddenAreaEnd; + const line = createModelLineProjection(linesBreaks[i], !isInHiddenArea); + values2[i] = line.getViewLineCount(); + this.modelLineProjections[i] = line; + } + this._validModelVersionId = this.model.getVersionId(); + this.projectedModelLineLineCounts = new ConstantTimePrefixSumComputer(values2); + } + getHiddenAreas() { + return this.hiddenAreasDecorationIds.map((decId) => this.model.getDecorationRange(decId)); + } + setHiddenAreas(_ranges) { + const validatedRanges = _ranges.map((r) => this.model.validateRange(r)); + const newRanges = normalizeLineRanges(validatedRanges); + const oldRanges = this.hiddenAreasDecorationIds.map((areaId) => this.model.getDecorationRange(areaId)).sort(Range.compareRangesUsingStarts); + if (newRanges.length === oldRanges.length) { + let hasDifference = false; + for (let i = 0; i < newRanges.length; i++) { + if (!newRanges[i].equalsRange(oldRanges[i])) { + hasDifference = true; + break; + } + } + if (!hasDifference) { + return false; + } + } + const newDecorations = newRanges.map((r) => ({ + range: r, + options: ModelDecorationOptions.EMPTY + })); + this.hiddenAreasDecorationIds = this.model.deltaDecorations(this.hiddenAreasDecorationIds, newDecorations); + const hiddenAreas = newRanges; + let hiddenAreaStart = 1, hiddenAreaEnd = 0; + let hiddenAreaIdx = -1; + let nextLineNumberToUpdateHiddenArea = hiddenAreaIdx + 1 < hiddenAreas.length ? hiddenAreaEnd + 1 : this.modelLineProjections.length + 2; + let hasVisibleLine = false; + for (let i = 0; i < this.modelLineProjections.length; i++) { + const lineNumber = i + 1; + if (lineNumber === nextLineNumberToUpdateHiddenArea) { + hiddenAreaIdx++; + hiddenAreaStart = hiddenAreas[hiddenAreaIdx].startLineNumber; + hiddenAreaEnd = hiddenAreas[hiddenAreaIdx].endLineNumber; + nextLineNumberToUpdateHiddenArea = hiddenAreaIdx + 1 < hiddenAreas.length ? hiddenAreaEnd + 1 : this.modelLineProjections.length + 2; + } + let lineChanged = false; + if (lineNumber >= hiddenAreaStart && lineNumber <= hiddenAreaEnd) { + if (this.modelLineProjections[i].isVisible()) { + this.modelLineProjections[i] = this.modelLineProjections[i].setVisible(false); + lineChanged = true; + } + } else { + hasVisibleLine = true; + if (!this.modelLineProjections[i].isVisible()) { + this.modelLineProjections[i] = this.modelLineProjections[i].setVisible(true); + lineChanged = true; + } + } + if (lineChanged) { + const newOutputLineCount = this.modelLineProjections[i].getViewLineCount(); + this.projectedModelLineLineCounts.setValue(i, newOutputLineCount); + } + } + if (!hasVisibleLine) { + this.setHiddenAreas([]); + } + return true; + } + modelPositionIsVisible(modelLineNumber, _modelColumn) { + if (modelLineNumber < 1 || modelLineNumber > this.modelLineProjections.length) { + return false; + } + return this.modelLineProjections[modelLineNumber - 1].isVisible(); + } + getModelLineViewLineCount(modelLineNumber) { + if (modelLineNumber < 1 || modelLineNumber > this.modelLineProjections.length) { + return 1; + } + return this.modelLineProjections[modelLineNumber - 1].getViewLineCount(); + } + setTabSize(newTabSize) { + if (this.tabSize === newTabSize) { + return false; + } + this.tabSize = newTabSize; + this._constructLines( + /*resetHiddenAreas*/ + false, + null + ); + return true; + } + setWrappingSettings(fontInfo, wrappingStrategy, wrappingColumn, wrappingIndent, wordBreak) { + const equalFontInfo = this.fontInfo.equals(fontInfo); + const equalWrappingStrategy = this.wrappingStrategy === wrappingStrategy; + const equalWrappingColumn = this.wrappingColumn === wrappingColumn; + const equalWrappingIndent = this.wrappingIndent === wrappingIndent; + const equalWordBreak = this.wordBreak === wordBreak; + if (equalFontInfo && equalWrappingStrategy && equalWrappingColumn && equalWrappingIndent && equalWordBreak) { + return false; + } + const onlyWrappingColumnChanged = equalFontInfo && equalWrappingStrategy && !equalWrappingColumn && equalWrappingIndent && equalWordBreak; + this.fontInfo = fontInfo; + this.wrappingStrategy = wrappingStrategy; + this.wrappingColumn = wrappingColumn; + this.wrappingIndent = wrappingIndent; + this.wordBreak = wordBreak; + let previousLineBreaks = null; + if (onlyWrappingColumnChanged) { + previousLineBreaks = []; + for (let i = 0, len = this.modelLineProjections.length; i < len; i++) { + previousLineBreaks[i] = this.modelLineProjections[i].getProjectionData(); + } + } + this._constructLines( + /*resetHiddenAreas*/ + false, + previousLineBreaks + ); + return true; + } + createLineBreaksComputer() { + const lineBreaksComputerFactory = this.wrappingStrategy === "advanced" ? this._domLineBreaksComputerFactory : this._monospaceLineBreaksComputerFactory; + return lineBreaksComputerFactory.createLineBreaksComputer(this.fontInfo, this.tabSize, this.wrappingColumn, this.wrappingIndent, this.wordBreak); + } + onModelFlushed() { + this._constructLines( + /*resetHiddenAreas*/ + true, + null + ); + } + onModelLinesDeleted(versionId, fromLineNumber, toLineNumber) { + if (!versionId || versionId <= this._validModelVersionId) { + return null; + } + const outputFromLineNumber = fromLineNumber === 1 ? 1 : this.projectedModelLineLineCounts.getPrefixSum(fromLineNumber - 1) + 1; + const outputToLineNumber = this.projectedModelLineLineCounts.getPrefixSum(toLineNumber); + this.modelLineProjections.splice(fromLineNumber - 1, toLineNumber - fromLineNumber + 1); + this.projectedModelLineLineCounts.removeValues(fromLineNumber - 1, toLineNumber - fromLineNumber + 1); + return new ViewLinesDeletedEvent(outputFromLineNumber, outputToLineNumber); + } + onModelLinesInserted(versionId, fromLineNumber, _toLineNumber, lineBreaks) { + if (!versionId || versionId <= this._validModelVersionId) { + return null; + } + const isInHiddenArea = fromLineNumber > 2 && !this.modelLineProjections[fromLineNumber - 2].isVisible(); + const outputFromLineNumber = fromLineNumber === 1 ? 1 : this.projectedModelLineLineCounts.getPrefixSum(fromLineNumber - 1) + 1; + let totalOutputLineCount = 0; + const insertLines = []; + const insertPrefixSumValues = []; + for (let i = 0, len = lineBreaks.length; i < len; i++) { + const line = createModelLineProjection(lineBreaks[i], !isInHiddenArea); + insertLines.push(line); + const outputLineCount = line.getViewLineCount(); + totalOutputLineCount += outputLineCount; + insertPrefixSumValues[i] = outputLineCount; + } + this.modelLineProjections = this.modelLineProjections.slice(0, fromLineNumber - 1).concat(insertLines).concat(this.modelLineProjections.slice(fromLineNumber - 1)); + this.projectedModelLineLineCounts.insertValues(fromLineNumber - 1, insertPrefixSumValues); + return new ViewLinesInsertedEvent(outputFromLineNumber, outputFromLineNumber + totalOutputLineCount - 1); + } + onModelLineChanged(versionId, lineNumber, lineBreakData) { + if (versionId !== null && versionId <= this._validModelVersionId) { + return [false, null, null, null]; + } + const lineIndex = lineNumber - 1; + const oldOutputLineCount = this.modelLineProjections[lineIndex].getViewLineCount(); + const isVisible = this.modelLineProjections[lineIndex].isVisible(); + const line = createModelLineProjection(lineBreakData, isVisible); + this.modelLineProjections[lineIndex] = line; + const newOutputLineCount = this.modelLineProjections[lineIndex].getViewLineCount(); + let lineMappingChanged = false; + let changeFrom = 0; + let changeTo = -1; + let insertFrom = 0; + let insertTo = -1; + let deleteFrom = 0; + let deleteTo = -1; + if (oldOutputLineCount > newOutputLineCount) { + changeFrom = this.projectedModelLineLineCounts.getPrefixSum(lineNumber - 1) + 1; + changeTo = changeFrom + newOutputLineCount - 1; + deleteFrom = changeTo + 1; + deleteTo = deleteFrom + (oldOutputLineCount - newOutputLineCount) - 1; + lineMappingChanged = true; + } else if (oldOutputLineCount < newOutputLineCount) { + changeFrom = this.projectedModelLineLineCounts.getPrefixSum(lineNumber - 1) + 1; + changeTo = changeFrom + oldOutputLineCount - 1; + insertFrom = changeTo + 1; + insertTo = insertFrom + (newOutputLineCount - oldOutputLineCount) - 1; + lineMappingChanged = true; + } else { + changeFrom = this.projectedModelLineLineCounts.getPrefixSum(lineNumber - 1) + 1; + changeTo = changeFrom + newOutputLineCount - 1; + } + this.projectedModelLineLineCounts.setValue(lineIndex, newOutputLineCount); + const viewLinesChangedEvent = changeFrom <= changeTo ? new ViewLinesChangedEvent(changeFrom, changeTo - changeFrom + 1) : null; + const viewLinesInsertedEvent = insertFrom <= insertTo ? new ViewLinesInsertedEvent(insertFrom, insertTo) : null; + const viewLinesDeletedEvent = deleteFrom <= deleteTo ? new ViewLinesDeletedEvent(deleteFrom, deleteTo) : null; + return [lineMappingChanged, viewLinesChangedEvent, viewLinesInsertedEvent, viewLinesDeletedEvent]; + } + acceptVersionId(versionId) { + this._validModelVersionId = versionId; + if (this.modelLineProjections.length === 1 && !this.modelLineProjections[0].isVisible()) { + this.setHiddenAreas([]); + } + } + getViewLineCount() { + return this.projectedModelLineLineCounts.getTotalSum(); + } + _toValidViewLineNumber(viewLineNumber) { + if (viewLineNumber < 1) { + return 1; + } + const viewLineCount = this.getViewLineCount(); + if (viewLineNumber > viewLineCount) { + return viewLineCount; + } + return viewLineNumber | 0; + } + getActiveIndentGuide(viewLineNumber, minLineNumber, maxLineNumber) { + viewLineNumber = this._toValidViewLineNumber(viewLineNumber); + minLineNumber = this._toValidViewLineNumber(minLineNumber); + maxLineNumber = this._toValidViewLineNumber(maxLineNumber); + const modelPosition = this.convertViewPositionToModelPosition(viewLineNumber, this.getViewLineMinColumn(viewLineNumber)); + const modelMinPosition = this.convertViewPositionToModelPosition(minLineNumber, this.getViewLineMinColumn(minLineNumber)); + const modelMaxPosition = this.convertViewPositionToModelPosition(maxLineNumber, this.getViewLineMinColumn(maxLineNumber)); + const result = this.model.guides.getActiveIndentGuide(modelPosition.lineNumber, modelMinPosition.lineNumber, modelMaxPosition.lineNumber); + const viewStartPosition = this.convertModelPositionToViewPosition(result.startLineNumber, 1); + const viewEndPosition = this.convertModelPositionToViewPosition(result.endLineNumber, this.model.getLineMaxColumn(result.endLineNumber)); + return { + startLineNumber: viewStartPosition.lineNumber, + endLineNumber: viewEndPosition.lineNumber, + indent: result.indent + }; + } + // #region ViewLineInfo + getViewLineInfo(viewLineNumber) { + viewLineNumber = this._toValidViewLineNumber(viewLineNumber); + const r = this.projectedModelLineLineCounts.getIndexOf(viewLineNumber - 1); + const lineIndex = r.index; + const remainder = r.remainder; + return new ViewLineInfo(lineIndex + 1, remainder); + } + getMinColumnOfViewLine(viewLineInfo) { + return this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewLineMinColumn(this.model, viewLineInfo.modelLineNumber, viewLineInfo.modelLineWrappedLineIdx); + } + getMaxColumnOfViewLine(viewLineInfo) { + return this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewLineMaxColumn(this.model, viewLineInfo.modelLineNumber, viewLineInfo.modelLineWrappedLineIdx); + } + getModelStartPositionOfViewLine(viewLineInfo) { + const line = this.modelLineProjections[viewLineInfo.modelLineNumber - 1]; + const minViewColumn = line.getViewLineMinColumn(this.model, viewLineInfo.modelLineNumber, viewLineInfo.modelLineWrappedLineIdx); + const column = line.getModelColumnOfViewPosition(viewLineInfo.modelLineWrappedLineIdx, minViewColumn); + return new Position(viewLineInfo.modelLineNumber, column); + } + getModelEndPositionOfViewLine(viewLineInfo) { + const line = this.modelLineProjections[viewLineInfo.modelLineNumber - 1]; + const maxViewColumn = line.getViewLineMaxColumn(this.model, viewLineInfo.modelLineNumber, viewLineInfo.modelLineWrappedLineIdx); + const column = line.getModelColumnOfViewPosition(viewLineInfo.modelLineWrappedLineIdx, maxViewColumn); + return new Position(viewLineInfo.modelLineNumber, column); + } + getViewLineInfosGroupedByModelRanges(viewStartLineNumber, viewEndLineNumber) { + const startViewLine = this.getViewLineInfo(viewStartLineNumber); + const endViewLine = this.getViewLineInfo(viewEndLineNumber); + const result = new Array(); + let lastVisibleModelPos = this.getModelStartPositionOfViewLine(startViewLine); + let viewLines = new Array(); + for (let curModelLine = startViewLine.modelLineNumber; curModelLine <= endViewLine.modelLineNumber; curModelLine++) { + const line = this.modelLineProjections[curModelLine - 1]; + if (line.isVisible()) { + const startOffset = curModelLine === startViewLine.modelLineNumber ? startViewLine.modelLineWrappedLineIdx : 0; + const endOffset = curModelLine === endViewLine.modelLineNumber ? endViewLine.modelLineWrappedLineIdx + 1 : line.getViewLineCount(); + for (let i = startOffset; i < endOffset; i++) { + viewLines.push(new ViewLineInfo(curModelLine, i)); + } + } + if (!line.isVisible() && lastVisibleModelPos) { + const lastVisibleModelPos2 = new Position(curModelLine - 1, this.model.getLineMaxColumn(curModelLine - 1) + 1); + const modelRange = Range.fromPositions(lastVisibleModelPos, lastVisibleModelPos2); + result.push(new ViewLineInfoGroupedByModelRange(modelRange, viewLines)); + viewLines = []; + lastVisibleModelPos = null; + } else if (line.isVisible() && !lastVisibleModelPos) { + lastVisibleModelPos = new Position(curModelLine, 1); + } + } + if (lastVisibleModelPos) { + const modelRange = Range.fromPositions(lastVisibleModelPos, this.getModelEndPositionOfViewLine(endViewLine)); + result.push(new ViewLineInfoGroupedByModelRange(modelRange, viewLines)); + } + return result; + } + // #endregion + getViewLinesBracketGuides(viewStartLineNumber, viewEndLineNumber, activeViewPosition, options2) { + const modelActivePosition = activeViewPosition ? this.convertViewPositionToModelPosition(activeViewPosition.lineNumber, activeViewPosition.column) : null; + const resultPerViewLine = []; + for (const group of this.getViewLineInfosGroupedByModelRanges(viewStartLineNumber, viewEndLineNumber)) { + const modelRangeStartLineNumber = group.modelRange.startLineNumber; + const bracketGuidesPerModelLine = this.model.guides.getLinesBracketGuides(modelRangeStartLineNumber, group.modelRange.endLineNumber, modelActivePosition, options2); + for (const viewLineInfo of group.viewLines) { + const bracketGuides = bracketGuidesPerModelLine[viewLineInfo.modelLineNumber - modelRangeStartLineNumber]; + const result = bracketGuides.map((g) => { + if (g.forWrappedLinesAfterColumn !== -1) { + const p2 = this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.forWrappedLinesAfterColumn); + if (p2.lineNumber >= viewLineInfo.modelLineWrappedLineIdx) { + return void 0; + } + } + if (g.forWrappedLinesBeforeOrAtColumn !== -1) { + const p2 = this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.forWrappedLinesBeforeOrAtColumn); + if (p2.lineNumber < viewLineInfo.modelLineWrappedLineIdx) { + return void 0; + } + } + if (!g.horizontalLine) { + return g; + } + let column = -1; + if (g.column !== -1) { + const p2 = this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.column); + if (p2.lineNumber === viewLineInfo.modelLineWrappedLineIdx) { + column = p2.column; + } else if (p2.lineNumber < viewLineInfo.modelLineWrappedLineIdx) { + column = this.getMinColumnOfViewLine(viewLineInfo); + } else if (p2.lineNumber > viewLineInfo.modelLineWrappedLineIdx) { + return void 0; + } + } + const viewPosition = this.convertModelPositionToViewPosition(viewLineInfo.modelLineNumber, g.horizontalLine.endColumn); + const p = this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.horizontalLine.endColumn); + if (p.lineNumber === viewLineInfo.modelLineWrappedLineIdx) { + return new IndentGuide(g.visibleColumn, column, g.className, new IndentGuideHorizontalLine(g.horizontalLine.top, viewPosition.column), -1, -1); + } else if (p.lineNumber < viewLineInfo.modelLineWrappedLineIdx) { + return void 0; + } else { + if (g.visibleColumn !== -1) { + return void 0; + } + return new IndentGuide(g.visibleColumn, column, g.className, new IndentGuideHorizontalLine(g.horizontalLine.top, this.getMaxColumnOfViewLine(viewLineInfo)), -1, -1); + } + }); + resultPerViewLine.push(result.filter((r) => !!r)); + } + } + return resultPerViewLine; + } + getViewLinesIndentGuides(viewStartLineNumber, viewEndLineNumber) { + viewStartLineNumber = this._toValidViewLineNumber(viewStartLineNumber); + viewEndLineNumber = this._toValidViewLineNumber(viewEndLineNumber); + const modelStart = this.convertViewPositionToModelPosition(viewStartLineNumber, this.getViewLineMinColumn(viewStartLineNumber)); + const modelEnd = this.convertViewPositionToModelPosition(viewEndLineNumber, this.getViewLineMaxColumn(viewEndLineNumber)); + let result = []; + const resultRepeatCount = []; + const resultRepeatOption = []; + const modelStartLineIndex = modelStart.lineNumber - 1; + const modelEndLineIndex = modelEnd.lineNumber - 1; + let reqStart = null; + for (let modelLineIndex = modelStartLineIndex; modelLineIndex <= modelEndLineIndex; modelLineIndex++) { + const line = this.modelLineProjections[modelLineIndex]; + if (line.isVisible()) { + const viewLineStartIndex = line.getViewLineNumberOfModelPosition(0, modelLineIndex === modelStartLineIndex ? modelStart.column : 1); + const viewLineEndIndex = line.getViewLineNumberOfModelPosition(0, this.model.getLineMaxColumn(modelLineIndex + 1)); + const count = viewLineEndIndex - viewLineStartIndex + 1; + let option = 0; + if (count > 1 && line.getViewLineMinColumn(this.model, modelLineIndex + 1, viewLineEndIndex) === 1) { + option = viewLineStartIndex === 0 ? 1 : 2; + } + resultRepeatCount.push(count); + resultRepeatOption.push(option); + if (reqStart === null) { + reqStart = new Position(modelLineIndex + 1, 0); + } + } else { + if (reqStart !== null) { + result = result.concat(this.model.guides.getLinesIndentGuides(reqStart.lineNumber, modelLineIndex)); + reqStart = null; + } + } + } + if (reqStart !== null) { + result = result.concat(this.model.guides.getLinesIndentGuides(reqStart.lineNumber, modelEnd.lineNumber)); + reqStart = null; + } + const viewLineCount = viewEndLineNumber - viewStartLineNumber + 1; + const viewIndents = new Array(viewLineCount); + let currIndex = 0; + for (let i = 0, len = result.length; i < len; i++) { + let value = result[i]; + const count = Math.min(viewLineCount - currIndex, resultRepeatCount[i]); + const option = resultRepeatOption[i]; + let blockAtIndex; + if (option === 2) { + blockAtIndex = 0; + } else if (option === 1) { + blockAtIndex = 1; + } else { + blockAtIndex = count; + } + for (let j = 0; j < count; j++) { + if (j === blockAtIndex) { + value = 0; + } + viewIndents[currIndex++] = value; + } + } + return viewIndents; + } + getViewLineContent(viewLineNumber) { + const info = this.getViewLineInfo(viewLineNumber); + return this.modelLineProjections[info.modelLineNumber - 1].getViewLineContent(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx); + } + getViewLineLength(viewLineNumber) { + const info = this.getViewLineInfo(viewLineNumber); + return this.modelLineProjections[info.modelLineNumber - 1].getViewLineLength(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx); + } + getViewLineMinColumn(viewLineNumber) { + const info = this.getViewLineInfo(viewLineNumber); + return this.modelLineProjections[info.modelLineNumber - 1].getViewLineMinColumn(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx); + } + getViewLineMaxColumn(viewLineNumber) { + const info = this.getViewLineInfo(viewLineNumber); + return this.modelLineProjections[info.modelLineNumber - 1].getViewLineMaxColumn(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx); + } + getViewLineData(viewLineNumber) { + const info = this.getViewLineInfo(viewLineNumber); + return this.modelLineProjections[info.modelLineNumber - 1].getViewLineData(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx); + } + getViewLinesData(viewStartLineNumber, viewEndLineNumber, needed) { + viewStartLineNumber = this._toValidViewLineNumber(viewStartLineNumber); + viewEndLineNumber = this._toValidViewLineNumber(viewEndLineNumber); + const start = this.projectedModelLineLineCounts.getIndexOf(viewStartLineNumber - 1); + let viewLineNumber = viewStartLineNumber; + const startModelLineIndex = start.index; + const startRemainder = start.remainder; + const result = []; + for (let modelLineIndex = startModelLineIndex, len = this.model.getLineCount(); modelLineIndex < len; modelLineIndex++) { + const line = this.modelLineProjections[modelLineIndex]; + if (!line.isVisible()) { + continue; + } + const fromViewLineIndex = modelLineIndex === startModelLineIndex ? startRemainder : 0; + let remainingViewLineCount = line.getViewLineCount() - fromViewLineIndex; + let lastLine = false; + if (viewLineNumber + remainingViewLineCount > viewEndLineNumber) { + lastLine = true; + remainingViewLineCount = viewEndLineNumber - viewLineNumber + 1; + } + line.getViewLinesData(this.model, modelLineIndex + 1, fromViewLineIndex, remainingViewLineCount, viewLineNumber - viewStartLineNumber, needed, result); + viewLineNumber += remainingViewLineCount; + if (lastLine) { + break; + } + } + return result; + } + validateViewPosition(viewLineNumber, viewColumn, expectedModelPosition) { + viewLineNumber = this._toValidViewLineNumber(viewLineNumber); + const r = this.projectedModelLineLineCounts.getIndexOf(viewLineNumber - 1); + const lineIndex = r.index; + const remainder = r.remainder; + const line = this.modelLineProjections[lineIndex]; + const minColumn = line.getViewLineMinColumn(this.model, lineIndex + 1, remainder); + const maxColumn = line.getViewLineMaxColumn(this.model, lineIndex + 1, remainder); + if (viewColumn < minColumn) { + viewColumn = minColumn; + } + if (viewColumn > maxColumn) { + viewColumn = maxColumn; + } + const computedModelColumn = line.getModelColumnOfViewPosition(remainder, viewColumn); + const computedModelPosition = this.model.validatePosition(new Position(lineIndex + 1, computedModelColumn)); + if (computedModelPosition.equals(expectedModelPosition)) { + return new Position(viewLineNumber, viewColumn); + } + return this.convertModelPositionToViewPosition(expectedModelPosition.lineNumber, expectedModelPosition.column); + } + validateViewRange(viewRange, expectedModelRange) { + const validViewStart = this.validateViewPosition(viewRange.startLineNumber, viewRange.startColumn, expectedModelRange.getStartPosition()); + const validViewEnd = this.validateViewPosition(viewRange.endLineNumber, viewRange.endColumn, expectedModelRange.getEndPosition()); + return new Range(validViewStart.lineNumber, validViewStart.column, validViewEnd.lineNumber, validViewEnd.column); + } + convertViewPositionToModelPosition(viewLineNumber, viewColumn) { + const info = this.getViewLineInfo(viewLineNumber); + const inputColumn = this.modelLineProjections[info.modelLineNumber - 1].getModelColumnOfViewPosition(info.modelLineWrappedLineIdx, viewColumn); + return this.model.validatePosition(new Position(info.modelLineNumber, inputColumn)); + } + convertViewRangeToModelRange(viewRange) { + const start = this.convertViewPositionToModelPosition(viewRange.startLineNumber, viewRange.startColumn); + const end = this.convertViewPositionToModelPosition(viewRange.endLineNumber, viewRange.endColumn); + return new Range(start.lineNumber, start.column, end.lineNumber, end.column); + } + convertModelPositionToViewPosition(_modelLineNumber, _modelColumn, affinity = 2, allowZeroLineNumber = false, belowHiddenRanges = false) { + const validPosition = this.model.validatePosition(new Position(_modelLineNumber, _modelColumn)); + const inputLineNumber = validPosition.lineNumber; + const inputColumn = validPosition.column; + let lineIndex = inputLineNumber - 1, lineIndexChanged = false; + if (belowHiddenRanges) { + while (lineIndex < this.modelLineProjections.length && !this.modelLineProjections[lineIndex].isVisible()) { + lineIndex++; + lineIndexChanged = true; + } + } else { + while (lineIndex > 0 && !this.modelLineProjections[lineIndex].isVisible()) { + lineIndex--; + lineIndexChanged = true; + } + } + if (lineIndex === 0 && !this.modelLineProjections[lineIndex].isVisible()) { + return new Position(allowZeroLineNumber ? 0 : 1, 1); + } + const deltaLineNumber = 1 + this.projectedModelLineLineCounts.getPrefixSum(lineIndex); + let r; + if (lineIndexChanged) { + if (belowHiddenRanges) { + r = this.modelLineProjections[lineIndex].getViewPositionOfModelPosition(deltaLineNumber, 1, affinity); + } else { + r = this.modelLineProjections[lineIndex].getViewPositionOfModelPosition(deltaLineNumber, this.model.getLineMaxColumn(lineIndex + 1), affinity); + } + } else { + r = this.modelLineProjections[inputLineNumber - 1].getViewPositionOfModelPosition(deltaLineNumber, inputColumn, affinity); + } + return r; + } + /** + * @param affinity The affinity in case of an empty range. Has no effect for non-empty ranges. + */ + convertModelRangeToViewRange(modelRange, affinity = 0) { + if (modelRange.isEmpty()) { + const start = this.convertModelPositionToViewPosition(modelRange.startLineNumber, modelRange.startColumn, affinity); + return Range.fromPositions(start); + } else { + const start = this.convertModelPositionToViewPosition( + modelRange.startLineNumber, + modelRange.startColumn, + 1 + /* PositionAffinity.Right */ + ); + const end = this.convertModelPositionToViewPosition( + modelRange.endLineNumber, + modelRange.endColumn, + 0 + /* PositionAffinity.Left */ + ); + return new Range(start.lineNumber, start.column, end.lineNumber, end.column); + } + } + getViewLineNumberOfModelPosition(modelLineNumber, modelColumn) { + let lineIndex = modelLineNumber - 1; + if (this.modelLineProjections[lineIndex].isVisible()) { + const deltaLineNumber2 = 1 + this.projectedModelLineLineCounts.getPrefixSum(lineIndex); + return this.modelLineProjections[lineIndex].getViewLineNumberOfModelPosition(deltaLineNumber2, modelColumn); + } + while (lineIndex > 0 && !this.modelLineProjections[lineIndex].isVisible()) { + lineIndex--; + } + if (lineIndex === 0 && !this.modelLineProjections[lineIndex].isVisible()) { + return 1; + } + const deltaLineNumber = 1 + this.projectedModelLineLineCounts.getPrefixSum(lineIndex); + return this.modelLineProjections[lineIndex].getViewLineNumberOfModelPosition(deltaLineNumber, this.model.getLineMaxColumn(lineIndex + 1)); + } + getDecorationsInRange(range2, ownerId2, filterOutValidation, onlyMinimapDecorations, onlyMarginDecorations) { + const modelStart = this.convertViewPositionToModelPosition(range2.startLineNumber, range2.startColumn); + const modelEnd = this.convertViewPositionToModelPosition(range2.endLineNumber, range2.endColumn); + if (modelEnd.lineNumber - modelStart.lineNumber <= range2.endLineNumber - range2.startLineNumber) { + return this.model.getDecorationsInRange(new Range(modelStart.lineNumber, 1, modelEnd.lineNumber, modelEnd.column), ownerId2, filterOutValidation, onlyMinimapDecorations, onlyMarginDecorations); + } + let result = []; + const modelStartLineIndex = modelStart.lineNumber - 1; + const modelEndLineIndex = modelEnd.lineNumber - 1; + let reqStart = null; + for (let modelLineIndex = modelStartLineIndex; modelLineIndex <= modelEndLineIndex; modelLineIndex++) { + const line = this.modelLineProjections[modelLineIndex]; + if (line.isVisible()) { + if (reqStart === null) { + reqStart = new Position(modelLineIndex + 1, modelLineIndex === modelStartLineIndex ? modelStart.column : 1); + } + } else { + if (reqStart !== null) { + const maxLineColumn = this.model.getLineMaxColumn(modelLineIndex); + result = result.concat(this.model.getDecorationsInRange(new Range(reqStart.lineNumber, reqStart.column, modelLineIndex, maxLineColumn), ownerId2, filterOutValidation, onlyMinimapDecorations)); + reqStart = null; + } + } + } + if (reqStart !== null) { + result = result.concat(this.model.getDecorationsInRange(new Range(reqStart.lineNumber, reqStart.column, modelEnd.lineNumber, modelEnd.column), ownerId2, filterOutValidation, onlyMinimapDecorations)); + reqStart = null; + } + result.sort((a3, b) => { + const res = Range.compareRangesUsingStarts(a3.range, b.range); + if (res === 0) { + if (a3.id < b.id) { + return -1; + } + if (a3.id > b.id) { + return 1; + } + return 0; + } + return res; + }); + const finalResult = []; + let finalResultLen = 0; + let prevDecId = null; + for (const dec of result) { + const decId = dec.id; + if (prevDecId === decId) { + continue; + } + prevDecId = decId; + finalResult[finalResultLen++] = dec; + } + return finalResult; + } + getInjectedTextAt(position) { + const info = this.getViewLineInfo(position.lineNumber); + return this.modelLineProjections[info.modelLineNumber - 1].getInjectedTextAt(info.modelLineWrappedLineIdx, position.column); + } + normalizePosition(position, affinity) { + const info = this.getViewLineInfo(position.lineNumber); + return this.modelLineProjections[info.modelLineNumber - 1].normalizePosition(info.modelLineWrappedLineIdx, position, affinity); + } + getLineIndentColumn(lineNumber) { + const info = this.getViewLineInfo(lineNumber); + if (info.modelLineWrappedLineIdx === 0) { + return this.model.getLineIndentColumn(info.modelLineNumber); + } + return 0; + } + }; + ViewLineInfo = class { + constructor(modelLineNumber, modelLineWrappedLineIdx) { + this.modelLineNumber = modelLineNumber; + this.modelLineWrappedLineIdx = modelLineWrappedLineIdx; + } + }; + ViewLineInfoGroupedByModelRange = class { + constructor(modelRange, viewLines) { + this.modelRange = modelRange; + this.viewLines = viewLines; + } + }; + CoordinatesConverter = class { + constructor(lines) { + this._lines = lines; + } + // View -> Model conversion and related methods + convertViewPositionToModelPosition(viewPosition) { + return this._lines.convertViewPositionToModelPosition(viewPosition.lineNumber, viewPosition.column); + } + convertViewRangeToModelRange(viewRange) { + return this._lines.convertViewRangeToModelRange(viewRange); + } + validateViewPosition(viewPosition, expectedModelPosition) { + return this._lines.validateViewPosition(viewPosition.lineNumber, viewPosition.column, expectedModelPosition); + } + validateViewRange(viewRange, expectedModelRange) { + return this._lines.validateViewRange(viewRange, expectedModelRange); + } + // Model -> View conversion and related methods + convertModelPositionToViewPosition(modelPosition, affinity, allowZero, belowHiddenRanges) { + return this._lines.convertModelPositionToViewPosition(modelPosition.lineNumber, modelPosition.column, affinity, allowZero, belowHiddenRanges); + } + convertModelRangeToViewRange(modelRange, affinity) { + return this._lines.convertModelRangeToViewRange(modelRange, affinity); + } + modelPositionIsVisible(modelPosition) { + return this._lines.modelPositionIsVisible(modelPosition.lineNumber, modelPosition.column); + } + getModelLineViewLineCount(modelLineNumber) { + return this._lines.getModelLineViewLineCount(modelLineNumber); + } + getViewLineNumberOfModelPosition(modelLineNumber, modelColumn) { + return this._lines.getViewLineNumberOfModelPosition(modelLineNumber, modelColumn); + } + }; + ViewModelLinesFromModelAsIs = class { + constructor(model) { + this.model = model; + } + dispose() { + } + createCoordinatesConverter() { + return new IdentityCoordinatesConverter(this); + } + getHiddenAreas() { + return []; + } + setHiddenAreas(_ranges) { + return false; + } + setTabSize(_newTabSize) { + return false; + } + setWrappingSettings(_fontInfo, _wrappingStrategy, _wrappingColumn, _wrappingIndent) { + return false; + } + createLineBreaksComputer() { + const result = []; + return { + addRequest: (lineText, injectedText, previousLineBreakData) => { + result.push(null); + }, + finalize: () => { + return result; + } + }; + } + onModelFlushed() { + } + onModelLinesDeleted(_versionId, fromLineNumber, toLineNumber) { + return new ViewLinesDeletedEvent(fromLineNumber, toLineNumber); + } + onModelLinesInserted(_versionId, fromLineNumber, toLineNumber, lineBreaks) { + return new ViewLinesInsertedEvent(fromLineNumber, toLineNumber); + } + onModelLineChanged(_versionId, lineNumber, lineBreakData) { + return [false, new ViewLinesChangedEvent(lineNumber, 1), null, null]; + } + acceptVersionId(_versionId) { + } + getViewLineCount() { + return this.model.getLineCount(); + } + getActiveIndentGuide(viewLineNumber, _minLineNumber, _maxLineNumber) { + return { + startLineNumber: viewLineNumber, + endLineNumber: viewLineNumber, + indent: 0 + }; + } + getViewLinesBracketGuides(startLineNumber, endLineNumber, activePosition) { + return new Array(endLineNumber - startLineNumber + 1).fill([]); + } + getViewLinesIndentGuides(viewStartLineNumber, viewEndLineNumber) { + const viewLineCount = viewEndLineNumber - viewStartLineNumber + 1; + const result = new Array(viewLineCount); + for (let i = 0; i < viewLineCount; i++) { + result[i] = 0; + } + return result; + } + getViewLineContent(viewLineNumber) { + return this.model.getLineContent(viewLineNumber); + } + getViewLineLength(viewLineNumber) { + return this.model.getLineLength(viewLineNumber); + } + getViewLineMinColumn(viewLineNumber) { + return this.model.getLineMinColumn(viewLineNumber); + } + getViewLineMaxColumn(viewLineNumber) { + return this.model.getLineMaxColumn(viewLineNumber); + } + getViewLineData(viewLineNumber) { + const lineTokens = this.model.tokenization.getLineTokens(viewLineNumber); + const lineContent = lineTokens.getLineContent(); + return new ViewLineData(lineContent, false, 1, lineContent.length + 1, 0, lineTokens.inflate(), null); + } + getViewLinesData(viewStartLineNumber, viewEndLineNumber, needed) { + const lineCount = this.model.getLineCount(); + viewStartLineNumber = Math.min(Math.max(1, viewStartLineNumber), lineCount); + viewEndLineNumber = Math.min(Math.max(1, viewEndLineNumber), lineCount); + const result = []; + for (let lineNumber = viewStartLineNumber; lineNumber <= viewEndLineNumber; lineNumber++) { + const idx = lineNumber - viewStartLineNumber; + result[idx] = needed[idx] ? this.getViewLineData(lineNumber) : null; + } + return result; + } + getDecorationsInRange(range2, ownerId2, filterOutValidation, onlyMinimapDecorations, onlyMarginDecorations) { + return this.model.getDecorationsInRange(range2, ownerId2, filterOutValidation, onlyMinimapDecorations, onlyMarginDecorations); + } + normalizePosition(position, affinity) { + return this.model.normalizePosition(position, affinity); + } + getLineIndentColumn(lineNumber) { + return this.model.getLineIndentColumn(lineNumber); + } + getInjectedTextAt(position) { + return null; + } + }; + IdentityCoordinatesConverter = class { + constructor(lines) { + this._lines = lines; + } + _validPosition(pos) { + return this._lines.model.validatePosition(pos); + } + _validRange(range2) { + return this._lines.model.validateRange(range2); + } + // View -> Model conversion and related methods + convertViewPositionToModelPosition(viewPosition) { + return this._validPosition(viewPosition); + } + convertViewRangeToModelRange(viewRange) { + return this._validRange(viewRange); + } + validateViewPosition(_viewPosition, expectedModelPosition) { + return this._validPosition(expectedModelPosition); + } + validateViewRange(_viewRange, expectedModelRange) { + return this._validRange(expectedModelRange); + } + // Model -> View conversion and related methods + convertModelPositionToViewPosition(modelPosition) { + return this._validPosition(modelPosition); + } + convertModelRangeToViewRange(modelRange) { + return this._validRange(modelRange); + } + modelPositionIsVisible(modelPosition) { + const lineCount = this._lines.model.getLineCount(); + if (modelPosition.lineNumber < 1 || modelPosition.lineNumber > lineCount) { + return false; + } + return true; + } + getModelLineViewLineCount(modelLineNumber) { + return 1; + } + getViewLineNumberOfModelPosition(modelLineNumber, modelColumn) { + return modelLineNumber; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewModel/glyphLanesModel.js +var MAX_LANE, GlyphMarginLanesModel; +var init_glyphLanesModel = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewModel/glyphLanesModel.js"() { + init_model2(); + MAX_LANE = GlyphMarginLane2.Right; + GlyphMarginLanesModel = class { + constructor(maxLine) { + this.persist = 0; + this._requiredLanes = 1; + this.lanes = new Uint8Array(Math.ceil((maxLine + 1) * MAX_LANE / 8)); + } + reset(maxLine) { + const bytes = Math.ceil((maxLine + 1) * MAX_LANE / 8); + if (this.lanes.length < bytes) { + this.lanes = new Uint8Array(bytes); + } else { + this.lanes.fill(0); + } + this._requiredLanes = 1; + } + get requiredLanes() { + return this._requiredLanes; + } + push(lane, range2, persist) { + if (persist) { + this.persist |= 1 << lane - 1; + } + for (let i = range2.startLineNumber; i <= range2.endLineNumber; i++) { + const bit = MAX_LANE * i + (lane - 1); + this.lanes[bit >>> 3] |= 1 << bit % 8; + this._requiredLanes = Math.max(this._requiredLanes, this.countAtLine(i)); + } + } + getLanesAtLine(lineNumber) { + const lanes = []; + let bit = MAX_LANE * lineNumber; + for (let i = 0; i < MAX_LANE; i++) { + if (this.persist & 1 << i || this.lanes[bit >>> 3] & 1 << bit % 8) { + lanes.push(i + 1); + } + bit++; + } + return lanes.length ? lanes : [GlyphMarginLane2.Center]; + } + countAtLine(lineNumber) { + let bit = MAX_LANE * lineNumber; + let count = 0; + for (let i = 0; i < MAX_LANE; i++) { + if (this.persist & 1 << i || this.lanes[bit >>> 3] & 1 << bit % 8) { + count++; + } + bit++; + } + return count; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/viewModel/viewModelImpl.js +function mergeLineRangeArray(arr1, arr2) { + const result = []; + let i = 0; + let j = 0; + while (i < arr1.length && j < arr2.length) { + const item1 = arr1[i]; + const item2 = arr2[j]; + if (item1.endLineNumber < item2.startLineNumber - 1) { + result.push(arr1[i++]); + } else if (item2.endLineNumber < item1.startLineNumber - 1) { + result.push(arr2[j++]); + } else { + const startLineNumber = Math.min(item1.startLineNumber, item2.startLineNumber); + const endLineNumber = Math.max(item1.endLineNumber, item2.endLineNumber); + result.push(new Range(startLineNumber, 1, endLineNumber, 1)); + i++; + j++; + } + } + while (i < arr1.length) { + result.push(arr1[i++]); + } + while (j < arr2.length) { + result.push(arr2[j++]); + } + return result; +} +function rangeArraysEqual(arr1, arr2) { + if (arr1.length !== arr2.length) { + return false; + } + for (let i = 0; i < arr1.length; i++) { + if (!arr1[i].equalsRange(arr2[i])) { + return false; + } + } + return true; +} +var USE_IDENTITY_LINES_COLLECTION, ViewModel, ViewportStart, OverviewRulerDecorations, HiddenAreasModel, StableViewport; +var init_viewModelImpl = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/viewModel/viewModelImpl.js"() { + init_arrays(); + init_async(); + init_color(); + init_lifecycle(); + init_platform(); + init_strings(); + init_editorOptions(); + init_cursor(); + init_cursorCommon(); + init_position(); + init_range(); + init_textModelEvents(); + init_languages(); + init_modesRegistry(); + init_textToHtmlTokenizer(); + init_viewEvents(); + init_viewLayout(); + init_minimapTokensColorTracker(); + init_viewModel(); + init_viewModelDecorations(); + init_viewModelEventDispatcher(); + init_viewModelLines(); + init_glyphLanesModel(); + USE_IDENTITY_LINES_COLLECTION = true; + ViewModel = class extends Disposable { + constructor(editorId, configuration, model, domLineBreaksComputerFactory, monospaceLineBreaksComputerFactory, scheduleAtNextAnimationFrame2, languageConfigurationService, _themeService, _attachedView) { + super(); + this.languageConfigurationService = languageConfigurationService; + this._themeService = _themeService; + this._attachedView = _attachedView; + this.hiddenAreasModel = new HiddenAreasModel(); + this.previousHiddenAreas = []; + this._editorId = editorId; + this._configuration = configuration; + this.model = model; + this._eventDispatcher = new ViewModelEventDispatcher(); + this.onEvent = this._eventDispatcher.onEvent; + this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService); + this._updateConfigurationViewLineCount = this._register(new RunOnceScheduler(() => this._updateConfigurationViewLineCountNow(), 0)); + this._hasFocus = false; + this._viewportStart = ViewportStart.create(this.model); + this.glyphLanes = new GlyphMarginLanesModel(0); + if (USE_IDENTITY_LINES_COLLECTION && this.model.isTooLargeForTokenization()) { + this._lines = new ViewModelLinesFromModelAsIs(this.model); + } else { + const options2 = this._configuration.options; + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + const wrappingStrategy = options2.get( + 139 + /* EditorOption.wrappingStrategy */ + ); + const wrappingInfo = options2.get( + 146 + /* EditorOption.wrappingInfo */ + ); + const wrappingIndent = options2.get( + 138 + /* EditorOption.wrappingIndent */ + ); + const wordBreak = options2.get( + 129 + /* EditorOption.wordBreak */ + ); + this._lines = new ViewModelLinesFromProjectedModel(this._editorId, this.model, domLineBreaksComputerFactory, monospaceLineBreaksComputerFactory, fontInfo, this.model.getOptions().tabSize, wrappingStrategy, wrappingInfo.wrappingColumn, wrappingIndent, wordBreak); + } + this.coordinatesConverter = this._lines.createCoordinatesConverter(); + this._cursor = this._register(new CursorsController(model, this, this.coordinatesConverter, this.cursorConfig)); + this.viewLayout = this._register(new ViewLayout(this._configuration, this.getLineCount(), scheduleAtNextAnimationFrame2)); + this._register(this.viewLayout.onDidScroll((e) => { + if (e.scrollTopChanged) { + this._handleVisibleLinesChanged(); + } + if (e.scrollTopChanged) { + this._viewportStart.invalidate(); + } + this._eventDispatcher.emitSingleViewEvent(new ViewScrollChangedEvent(e)); + this._eventDispatcher.emitOutgoingEvent(new ScrollChangedEvent(e.oldScrollWidth, e.oldScrollLeft, e.oldScrollHeight, e.oldScrollTop, e.scrollWidth, e.scrollLeft, e.scrollHeight, e.scrollTop)); + })); + this._register(this.viewLayout.onDidContentSizeChange((e) => { + this._eventDispatcher.emitOutgoingEvent(e); + })); + this._decorations = new ViewModelDecorations(this._editorId, this.model, this._configuration, this._lines, this.coordinatesConverter); + this._registerModelEvents(); + this._register(this._configuration.onDidChangeFast((e) => { + try { + const eventsCollector = this._eventDispatcher.beginEmitViewEvents(); + this._onConfigurationChanged(eventsCollector, e); + } finally { + this._eventDispatcher.endEmitViewEvents(); + } + })); + this._register(MinimapTokensColorTracker.getInstance().onDidChange(() => { + this._eventDispatcher.emitSingleViewEvent(new ViewTokensColorsChangedEvent()); + })); + this._register(this._themeService.onDidColorThemeChange((theme) => { + this._invalidateDecorationsColorCache(); + this._eventDispatcher.emitSingleViewEvent(new ViewThemeChangedEvent(theme)); + })); + this._updateConfigurationViewLineCountNow(); + } + dispose() { + super.dispose(); + this._decorations.dispose(); + this._lines.dispose(); + this._viewportStart.dispose(); + this._eventDispatcher.dispose(); + } + createLineBreaksComputer() { + return this._lines.createLineBreaksComputer(); + } + addViewEventHandler(eventHandler) { + this._eventDispatcher.addViewEventHandler(eventHandler); + } + removeViewEventHandler(eventHandler) { + this._eventDispatcher.removeViewEventHandler(eventHandler); + } + _updateConfigurationViewLineCountNow() { + this._configuration.setViewLineCount(this._lines.getViewLineCount()); + } + getModelVisibleRanges() { + const linesViewportData = this.viewLayout.getLinesViewportData(); + const viewVisibleRange = new Range(linesViewportData.startLineNumber, this.getLineMinColumn(linesViewportData.startLineNumber), linesViewportData.endLineNumber, this.getLineMaxColumn(linesViewportData.endLineNumber)); + const modelVisibleRanges = this._toModelVisibleRanges(viewVisibleRange); + return modelVisibleRanges; + } + visibleLinesStabilized() { + const modelVisibleRanges = this.getModelVisibleRanges(); + this._attachedView.setVisibleLines(modelVisibleRanges, true); + } + _handleVisibleLinesChanged() { + const modelVisibleRanges = this.getModelVisibleRanges(); + this._attachedView.setVisibleLines(modelVisibleRanges, false); + } + setHasFocus(hasFocus) { + this._hasFocus = hasFocus; + this._cursor.setHasFocus(hasFocus); + this._eventDispatcher.emitSingleViewEvent(new ViewFocusChangedEvent(hasFocus)); + this._eventDispatcher.emitOutgoingEvent(new FocusChangedEvent(!hasFocus, hasFocus)); + } + onCompositionStart() { + this._eventDispatcher.emitSingleViewEvent(new ViewCompositionStartEvent()); + } + onCompositionEnd() { + this._eventDispatcher.emitSingleViewEvent(new ViewCompositionEndEvent()); + } + _captureStableViewport() { + if (this._viewportStart.isValid && this.viewLayout.getCurrentScrollTop() > 0) { + const previousViewportStartViewPosition = new Position(this._viewportStart.viewLineNumber, this.getLineMinColumn(this._viewportStart.viewLineNumber)); + const previousViewportStartModelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(previousViewportStartViewPosition); + return new StableViewport(previousViewportStartModelPosition, this._viewportStart.startLineDelta); + } + return new StableViewport(null, 0); + } + _onConfigurationChanged(eventsCollector, e) { + const stableViewport = this._captureStableViewport(); + const options2 = this._configuration.options; + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + const wrappingStrategy = options2.get( + 139 + /* EditorOption.wrappingStrategy */ + ); + const wrappingInfo = options2.get( + 146 + /* EditorOption.wrappingInfo */ + ); + const wrappingIndent = options2.get( + 138 + /* EditorOption.wrappingIndent */ + ); + const wordBreak = options2.get( + 129 + /* EditorOption.wordBreak */ + ); + if (this._lines.setWrappingSettings(fontInfo, wrappingStrategy, wrappingInfo.wrappingColumn, wrappingIndent, wordBreak)) { + eventsCollector.emitViewEvent(new ViewFlushedEvent()); + eventsCollector.emitViewEvent(new ViewLineMappingChangedEvent()); + eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null)); + this._cursor.onLineMappingChanged(eventsCollector); + this._decorations.onLineMappingChanged(); + this.viewLayout.onFlushed(this.getLineCount()); + this._updateConfigurationViewLineCount.schedule(); + } + if (e.hasChanged( + 91 + /* EditorOption.readOnly */ + )) { + this._decorations.reset(); + eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null)); + } + if (e.hasChanged( + 98 + /* EditorOption.renderValidationDecorations */ + )) { + this._decorations.reset(); + eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null)); + } + eventsCollector.emitViewEvent(new ViewConfigurationChangedEvent(e)); + this.viewLayout.onConfigurationChanged(e); + stableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout); + if (CursorConfiguration.shouldRecreate(e)) { + this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService); + this._cursor.updateConfiguration(this.cursorConfig); + } + } + _registerModelEvents() { + this._register(this.model.onDidChangeContentOrInjectedText((e) => { + try { + const eventsCollector = this._eventDispatcher.beginEmitViewEvents(); + let hadOtherModelChange = false; + let hadModelLineChangeThatChangedLineMapping = false; + const changes = e instanceof InternalModelContentChangeEvent ? e.rawContentChangedEvent.changes : e.changes; + const versionId = e instanceof InternalModelContentChangeEvent ? e.rawContentChangedEvent.versionId : null; + const lineBreaksComputer = this._lines.createLineBreaksComputer(); + for (const change of changes) { + switch (change.changeType) { + case 4: { + for (let lineIdx = 0; lineIdx < change.detail.length; lineIdx++) { + const line = change.detail[lineIdx]; + let injectedText = change.injectedTexts[lineIdx]; + if (injectedText) { + injectedText = injectedText.filter((element) => !element.ownerId || element.ownerId === this._editorId); + } + lineBreaksComputer.addRequest(line, injectedText, null); + } + break; + } + case 2: { + let injectedText = null; + if (change.injectedText) { + injectedText = change.injectedText.filter((element) => !element.ownerId || element.ownerId === this._editorId); + } + lineBreaksComputer.addRequest(change.detail, injectedText, null); + break; + } + } + } + const lineBreaks = lineBreaksComputer.finalize(); + const lineBreakQueue = new ArrayQueue(lineBreaks); + for (const change of changes) { + switch (change.changeType) { + case 1: { + this._lines.onModelFlushed(); + eventsCollector.emitViewEvent(new ViewFlushedEvent()); + this._decorations.reset(); + this.viewLayout.onFlushed(this.getLineCount()); + hadOtherModelChange = true; + break; + } + case 3: { + const linesDeletedEvent = this._lines.onModelLinesDeleted(versionId, change.fromLineNumber, change.toLineNumber); + if (linesDeletedEvent !== null) { + eventsCollector.emitViewEvent(linesDeletedEvent); + this.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber); + } + hadOtherModelChange = true; + break; + } + case 4: { + const insertedLineBreaks = lineBreakQueue.takeCount(change.detail.length); + const linesInsertedEvent = this._lines.onModelLinesInserted(versionId, change.fromLineNumber, change.toLineNumber, insertedLineBreaks); + if (linesInsertedEvent !== null) { + eventsCollector.emitViewEvent(linesInsertedEvent); + this.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber); + } + hadOtherModelChange = true; + break; + } + case 2: { + const changedLineBreakData = lineBreakQueue.dequeue(); + const [lineMappingChanged, linesChangedEvent, linesInsertedEvent, linesDeletedEvent] = this._lines.onModelLineChanged(versionId, change.lineNumber, changedLineBreakData); + hadModelLineChangeThatChangedLineMapping = lineMappingChanged; + if (linesChangedEvent) { + eventsCollector.emitViewEvent(linesChangedEvent); + } + if (linesInsertedEvent) { + eventsCollector.emitViewEvent(linesInsertedEvent); + this.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber); + } + if (linesDeletedEvent) { + eventsCollector.emitViewEvent(linesDeletedEvent); + this.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber); + } + break; + } + case 5: { + break; + } + } + } + if (versionId !== null) { + this._lines.acceptVersionId(versionId); + } + this.viewLayout.onHeightMaybeChanged(); + if (!hadOtherModelChange && hadModelLineChangeThatChangedLineMapping) { + eventsCollector.emitViewEvent(new ViewLineMappingChangedEvent()); + eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null)); + this._cursor.onLineMappingChanged(eventsCollector); + this._decorations.onLineMappingChanged(); + } + } finally { + this._eventDispatcher.endEmitViewEvents(); + } + const viewportStartWasValid = this._viewportStart.isValid; + this._viewportStart.invalidate(); + this._configuration.setModelLineCount(this.model.getLineCount()); + this._updateConfigurationViewLineCountNow(); + if (!this._hasFocus && this.model.getAttachedEditorCount() >= 2 && viewportStartWasValid) { + const modelRange = this.model._getTrackedRange(this._viewportStart.modelTrackedRange); + if (modelRange) { + const viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(modelRange.getStartPosition()); + const viewPositionTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber); + this.viewLayout.setScrollPosition( + { scrollTop: viewPositionTop + this._viewportStart.startLineDelta }, + 1 + /* ScrollType.Immediate */ + ); + } + } + try { + const eventsCollector = this._eventDispatcher.beginEmitViewEvents(); + if (e instanceof InternalModelContentChangeEvent) { + eventsCollector.emitOutgoingEvent(new ModelContentChangedEvent(e.contentChangedEvent)); + } + this._cursor.onModelContentChanged(eventsCollector, e); + } finally { + this._eventDispatcher.endEmitViewEvents(); + } + this._handleVisibleLinesChanged(); + })); + this._register(this.model.onDidChangeTokens((e) => { + const viewRanges = []; + for (let j = 0, lenJ = e.ranges.length; j < lenJ; j++) { + const modelRange = e.ranges[j]; + const viewStartLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.fromLineNumber, 1)).lineNumber; + const viewEndLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.toLineNumber, this.model.getLineMaxColumn(modelRange.toLineNumber))).lineNumber; + viewRanges[j] = { + fromLineNumber: viewStartLineNumber, + toLineNumber: viewEndLineNumber + }; + } + this._eventDispatcher.emitSingleViewEvent(new ViewTokensChangedEvent(viewRanges)); + this._eventDispatcher.emitOutgoingEvent(new ModelTokensChangedEvent(e)); + })); + this._register(this.model.onDidChangeLanguageConfiguration((e) => { + this._eventDispatcher.emitSingleViewEvent(new ViewLanguageConfigurationEvent()); + this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService); + this._cursor.updateConfiguration(this.cursorConfig); + this._eventDispatcher.emitOutgoingEvent(new ModelLanguageConfigurationChangedEvent(e)); + })); + this._register(this.model.onDidChangeLanguage((e) => { + this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService); + this._cursor.updateConfiguration(this.cursorConfig); + this._eventDispatcher.emitOutgoingEvent(new ModelLanguageChangedEvent(e)); + })); + this._register(this.model.onDidChangeOptions((e) => { + if (this._lines.setTabSize(this.model.getOptions().tabSize)) { + try { + const eventsCollector = this._eventDispatcher.beginEmitViewEvents(); + eventsCollector.emitViewEvent(new ViewFlushedEvent()); + eventsCollector.emitViewEvent(new ViewLineMappingChangedEvent()); + eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null)); + this._cursor.onLineMappingChanged(eventsCollector); + this._decorations.onLineMappingChanged(); + this.viewLayout.onFlushed(this.getLineCount()); + } finally { + this._eventDispatcher.endEmitViewEvents(); + } + this._updateConfigurationViewLineCount.schedule(); + } + this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService); + this._cursor.updateConfiguration(this.cursorConfig); + this._eventDispatcher.emitOutgoingEvent(new ModelOptionsChangedEvent(e)); + })); + this._register(this.model.onDidChangeDecorations((e) => { + this._decorations.onModelDecorationsChanged(); + this._eventDispatcher.emitSingleViewEvent(new ViewDecorationsChangedEvent(e)); + this._eventDispatcher.emitOutgoingEvent(new ModelDecorationsChangedEvent(e)); + })); + } + setHiddenAreas(ranges, source) { + var _a10; + this.hiddenAreasModel.setHiddenAreas(source, ranges); + const mergedRanges = this.hiddenAreasModel.getMergedRanges(); + if (mergedRanges === this.previousHiddenAreas) { + return; + } + this.previousHiddenAreas = mergedRanges; + const stableViewport = this._captureStableViewport(); + let lineMappingChanged = false; + try { + const eventsCollector = this._eventDispatcher.beginEmitViewEvents(); + lineMappingChanged = this._lines.setHiddenAreas(mergedRanges); + if (lineMappingChanged) { + eventsCollector.emitViewEvent(new ViewFlushedEvent()); + eventsCollector.emitViewEvent(new ViewLineMappingChangedEvent()); + eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null)); + this._cursor.onLineMappingChanged(eventsCollector); + this._decorations.onLineMappingChanged(); + this.viewLayout.onFlushed(this.getLineCount()); + this.viewLayout.onHeightMaybeChanged(); + } + const firstModelLineInViewPort = (_a10 = stableViewport.viewportStartModelPosition) === null || _a10 === void 0 ? void 0 : _a10.lineNumber; + const firstModelLineIsHidden = firstModelLineInViewPort && mergedRanges.some((range2) => range2.startLineNumber <= firstModelLineInViewPort && firstModelLineInViewPort <= range2.endLineNumber); + if (!firstModelLineIsHidden) { + stableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout); + } + } finally { + this._eventDispatcher.endEmitViewEvents(); + } + this._updateConfigurationViewLineCount.schedule(); + if (lineMappingChanged) { + this._eventDispatcher.emitOutgoingEvent(new HiddenAreasChangedEvent()); + } + } + getVisibleRangesPlusViewportAboveBelow() { + const layoutInfo = this._configuration.options.get( + 145 + /* EditorOption.layoutInfo */ + ); + const lineHeight = this._configuration.options.get( + 67 + /* EditorOption.lineHeight */ + ); + const linesAround = Math.max(20, Math.round(layoutInfo.height / lineHeight)); + const partialData = this.viewLayout.getLinesViewportData(); + const startViewLineNumber = Math.max(1, partialData.completelyVisibleStartLineNumber - linesAround); + const endViewLineNumber = Math.min(this.getLineCount(), partialData.completelyVisibleEndLineNumber + linesAround); + return this._toModelVisibleRanges(new Range(startViewLineNumber, this.getLineMinColumn(startViewLineNumber), endViewLineNumber, this.getLineMaxColumn(endViewLineNumber))); + } + getVisibleRanges() { + const visibleViewRange = this.getCompletelyVisibleViewRange(); + return this._toModelVisibleRanges(visibleViewRange); + } + getHiddenAreas() { + return this._lines.getHiddenAreas(); + } + _toModelVisibleRanges(visibleViewRange) { + const visibleRange = this.coordinatesConverter.convertViewRangeToModelRange(visibleViewRange); + const hiddenAreas = this._lines.getHiddenAreas(); + if (hiddenAreas.length === 0) { + return [visibleRange]; + } + const result = []; + let resultLen = 0; + let startLineNumber = visibleRange.startLineNumber; + let startColumn = visibleRange.startColumn; + const endLineNumber = visibleRange.endLineNumber; + const endColumn = visibleRange.endColumn; + for (let i = 0, len = hiddenAreas.length; i < len; i++) { + const hiddenStartLineNumber = hiddenAreas[i].startLineNumber; + const hiddenEndLineNumber = hiddenAreas[i].endLineNumber; + if (hiddenEndLineNumber < startLineNumber) { + continue; + } + if (hiddenStartLineNumber > endLineNumber) { + continue; + } + if (startLineNumber < hiddenStartLineNumber) { + result[resultLen++] = new Range(startLineNumber, startColumn, hiddenStartLineNumber - 1, this.model.getLineMaxColumn(hiddenStartLineNumber - 1)); + } + startLineNumber = hiddenEndLineNumber + 1; + startColumn = 1; + } + if (startLineNumber < endLineNumber || startLineNumber === endLineNumber && startColumn < endColumn) { + result[resultLen++] = new Range(startLineNumber, startColumn, endLineNumber, endColumn); + } + return result; + } + getCompletelyVisibleViewRange() { + const partialData = this.viewLayout.getLinesViewportData(); + const startViewLineNumber = partialData.completelyVisibleStartLineNumber; + const endViewLineNumber = partialData.completelyVisibleEndLineNumber; + return new Range(startViewLineNumber, this.getLineMinColumn(startViewLineNumber), endViewLineNumber, this.getLineMaxColumn(endViewLineNumber)); + } + getCompletelyVisibleViewRangeAtScrollTop(scrollTop) { + const partialData = this.viewLayout.getLinesViewportDataAtScrollTop(scrollTop); + const startViewLineNumber = partialData.completelyVisibleStartLineNumber; + const endViewLineNumber = partialData.completelyVisibleEndLineNumber; + return new Range(startViewLineNumber, this.getLineMinColumn(startViewLineNumber), endViewLineNumber, this.getLineMaxColumn(endViewLineNumber)); + } + saveState() { + const compatViewState = this.viewLayout.saveState(); + const scrollTop = compatViewState.scrollTop; + const firstViewLineNumber = this.viewLayout.getLineNumberAtVerticalOffset(scrollTop); + const firstPosition = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(firstViewLineNumber, this.getLineMinColumn(firstViewLineNumber))); + const firstPositionDeltaTop = this.viewLayout.getVerticalOffsetForLineNumber(firstViewLineNumber) - scrollTop; + return { + scrollLeft: compatViewState.scrollLeft, + firstPosition, + firstPositionDeltaTop + }; + } + reduceRestoreState(state) { + if (typeof state.firstPosition === "undefined") { + return this._reduceRestoreStateCompatibility(state); + } + const modelPosition = this.model.validatePosition(state.firstPosition); + const viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(modelPosition); + const scrollTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber) - state.firstPositionDeltaTop; + return { + scrollLeft: state.scrollLeft, + scrollTop + }; + } + _reduceRestoreStateCompatibility(state) { + return { + scrollLeft: state.scrollLeft, + scrollTop: state.scrollTopWithoutViewZones + }; + } + getTabSize() { + return this.model.getOptions().tabSize; + } + getLineCount() { + return this._lines.getViewLineCount(); + } + /** + * Gives a hint that a lot of requests are about to come in for these line numbers. + */ + setViewport(startLineNumber, endLineNumber, centeredLineNumber) { + this._viewportStart.update(this, startLineNumber); + } + getActiveIndentGuide(lineNumber, minLineNumber, maxLineNumber) { + return this._lines.getActiveIndentGuide(lineNumber, minLineNumber, maxLineNumber); + } + getLinesIndentGuides(startLineNumber, endLineNumber) { + return this._lines.getViewLinesIndentGuides(startLineNumber, endLineNumber); + } + getBracketGuidesInRangeByLine(startLineNumber, endLineNumber, activePosition, options2) { + return this._lines.getViewLinesBracketGuides(startLineNumber, endLineNumber, activePosition, options2); + } + getLineContent(lineNumber) { + return this._lines.getViewLineContent(lineNumber); + } + getLineLength(lineNumber) { + return this._lines.getViewLineLength(lineNumber); + } + getLineMinColumn(lineNumber) { + return this._lines.getViewLineMinColumn(lineNumber); + } + getLineMaxColumn(lineNumber) { + return this._lines.getViewLineMaxColumn(lineNumber); + } + getLineFirstNonWhitespaceColumn(lineNumber) { + const result = firstNonWhitespaceIndex(this.getLineContent(lineNumber)); + if (result === -1) { + return 0; + } + return result + 1; + } + getLineLastNonWhitespaceColumn(lineNumber) { + const result = lastNonWhitespaceIndex(this.getLineContent(lineNumber)); + if (result === -1) { + return 0; + } + return result + 2; + } + getMinimapDecorationsInRange(range2) { + return this._decorations.getMinimapDecorationsInRange(range2); + } + getDecorationsInViewport(visibleRange) { + return this._decorations.getDecorationsViewportData(visibleRange).decorations; + } + getInjectedTextAt(viewPosition) { + return this._lines.getInjectedTextAt(viewPosition); + } + getViewportViewLineRenderingData(visibleRange, lineNumber) { + const allInlineDecorations = this._decorations.getDecorationsViewportData(visibleRange).inlineDecorations; + const inlineDecorations = allInlineDecorations[lineNumber - visibleRange.startLineNumber]; + return this._getViewLineRenderingData(lineNumber, inlineDecorations); + } + getViewLineRenderingData(lineNumber) { + const inlineDecorations = this._decorations.getInlineDecorationsOnLine(lineNumber); + return this._getViewLineRenderingData(lineNumber, inlineDecorations); + } + _getViewLineRenderingData(lineNumber, inlineDecorations) { + const mightContainRTL = this.model.mightContainRTL(); + const mightContainNonBasicASCII = this.model.mightContainNonBasicASCII(); + const tabSize = this.getTabSize(); + const lineData = this._lines.getViewLineData(lineNumber); + if (lineData.inlineDecorations) { + inlineDecorations = [ + ...inlineDecorations, + ...lineData.inlineDecorations.map((d) => d.toInlineDecoration(lineNumber)) + ]; + } + return new ViewLineRenderingData(lineData.minColumn, lineData.maxColumn, lineData.content, lineData.continuesWithWrappedLine, mightContainRTL, mightContainNonBasicASCII, lineData.tokens, inlineDecorations, tabSize, lineData.startVisibleColumn); + } + getViewLineData(lineNumber) { + return this._lines.getViewLineData(lineNumber); + } + getMinimapLinesRenderingData(startLineNumber, endLineNumber, needed) { + const result = this._lines.getViewLinesData(startLineNumber, endLineNumber, needed); + return new MinimapLinesRenderingData(this.getTabSize(), result); + } + getAllOverviewRulerDecorations(theme) { + const decorations = this.model.getOverviewRulerDecorations(this._editorId, filterValidationDecorations(this._configuration.options)); + const result = new OverviewRulerDecorations(); + for (const decoration3 of decorations) { + const decorationOptions = decoration3.options; + const opts = decorationOptions.overviewRuler; + if (!opts) { + continue; + } + const lane = opts.position; + if (lane === 0) { + continue; + } + const color = opts.getColor(theme.value); + const viewStartLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration3.range.startLineNumber, decoration3.range.startColumn); + const viewEndLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration3.range.endLineNumber, decoration3.range.endColumn); + result.accept(color, decorationOptions.zIndex, viewStartLineNumber, viewEndLineNumber, lane); + } + return result.asArray; + } + _invalidateDecorationsColorCache() { + const decorations = this.model.getOverviewRulerDecorations(); + for (const decoration3 of decorations) { + const opts1 = decoration3.options.overviewRuler; + opts1 === null || opts1 === void 0 ? void 0 : opts1.invalidateCachedColor(); + const opts2 = decoration3.options.minimap; + opts2 === null || opts2 === void 0 ? void 0 : opts2.invalidateCachedColor(); + } + } + getValueInRange(range2, eol) { + const modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range2); + return this.model.getValueInRange(modelRange, eol); + } + getValueLengthInRange(range2, eol) { + const modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range2); + return this.model.getValueLengthInRange(modelRange, eol); + } + modifyPosition(position, offset) { + const modelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(position); + const resultModelPosition = this.model.modifyPosition(modelPosition, offset); + return this.coordinatesConverter.convertModelPositionToViewPosition(resultModelPosition); + } + deduceModelPositionRelativeToViewPosition(viewAnchorPosition, deltaOffset, lineFeedCnt) { + const modelAnchor = this.coordinatesConverter.convertViewPositionToModelPosition(viewAnchorPosition); + if (this.model.getEOL().length === 2) { + if (deltaOffset < 0) { + deltaOffset -= lineFeedCnt; + } else { + deltaOffset += lineFeedCnt; + } + } + const modelAnchorOffset = this.model.getOffsetAt(modelAnchor); + const resultOffset = modelAnchorOffset + deltaOffset; + return this.model.getPositionAt(resultOffset); + } + getPlainTextToCopy(modelRanges, emptySelectionClipboard, forceCRLF) { + const newLineCharacter = forceCRLF ? "\r\n" : this.model.getEOL(); + modelRanges = modelRanges.slice(0); + modelRanges.sort(Range.compareRangesUsingStarts); + let hasEmptyRange = false; + let hasNonEmptyRange = false; + for (const range2 of modelRanges) { + if (range2.isEmpty()) { + hasEmptyRange = true; + } else { + hasNonEmptyRange = true; + } + } + if (!hasNonEmptyRange) { + if (!emptySelectionClipboard) { + return ""; + } + const modelLineNumbers = modelRanges.map((r) => r.startLineNumber); + let result2 = ""; + for (let i = 0; i < modelLineNumbers.length; i++) { + if (i > 0 && modelLineNumbers[i - 1] === modelLineNumbers[i]) { + continue; + } + result2 += this.model.getLineContent(modelLineNumbers[i]) + newLineCharacter; + } + return result2; + } + if (hasEmptyRange && emptySelectionClipboard) { + const result2 = []; + let prevModelLineNumber = 0; + for (const modelRange of modelRanges) { + const modelLineNumber = modelRange.startLineNumber; + if (modelRange.isEmpty()) { + if (modelLineNumber !== prevModelLineNumber) { + result2.push(this.model.getLineContent(modelLineNumber)); + } + } else { + result2.push(this.model.getValueInRange( + modelRange, + forceCRLF ? 2 : 0 + /* EndOfLinePreference.TextDefined */ + )); + } + prevModelLineNumber = modelLineNumber; + } + return result2.length === 1 ? result2[0] : result2; + } + const result = []; + for (const modelRange of modelRanges) { + if (!modelRange.isEmpty()) { + result.push(this.model.getValueInRange( + modelRange, + forceCRLF ? 2 : 0 + /* EndOfLinePreference.TextDefined */ + )); + } + } + return result.length === 1 ? result[0] : result; + } + getRichTextToCopy(modelRanges, emptySelectionClipboard) { + const languageId = this.model.getLanguageId(); + if (languageId === PLAINTEXT_LANGUAGE_ID) { + return null; + } + if (modelRanges.length !== 1) { + return null; + } + let range2 = modelRanges[0]; + if (range2.isEmpty()) { + if (!emptySelectionClipboard) { + return null; + } + const lineNumber = range2.startLineNumber; + range2 = new Range(lineNumber, this.model.getLineMinColumn(lineNumber), lineNumber, this.model.getLineMaxColumn(lineNumber)); + } + const fontInfo = this._configuration.options.get( + 50 + /* EditorOption.fontInfo */ + ); + const colorMap = this._getColorMap(); + const hasBadChars = /[:;\\\/<>]/.test(fontInfo.fontFamily); + const useDefaultFontFamily = hasBadChars || fontInfo.fontFamily === EDITOR_FONT_DEFAULTS.fontFamily; + let fontFamily; + if (useDefaultFontFamily) { + fontFamily = EDITOR_FONT_DEFAULTS.fontFamily; + } else { + fontFamily = fontInfo.fontFamily; + fontFamily = fontFamily.replace(/"/g, "'"); + const hasQuotesOrIsList = /[,']/.test(fontFamily); + if (!hasQuotesOrIsList) { + const needsQuotes = /[+ ]/.test(fontFamily); + if (needsQuotes) { + fontFamily = `'${fontFamily}'`; + } + } + fontFamily = `${fontFamily}, ${EDITOR_FONT_DEFAULTS.fontFamily}`; + } + return { + mode: languageId, + html: `
` + this._getHTMLToCopy(range2, colorMap) + "
" + }; + } + _getHTMLToCopy(modelRange, colorMap) { + const startLineNumber = modelRange.startLineNumber; + const startColumn = modelRange.startColumn; + const endLineNumber = modelRange.endLineNumber; + const endColumn = modelRange.endColumn; + const tabSize = this.getTabSize(); + let result = ""; + for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { + const lineTokens = this.model.tokenization.getLineTokens(lineNumber); + const lineContent = lineTokens.getLineContent(); + const startOffset = lineNumber === startLineNumber ? startColumn - 1 : 0; + const endOffset = lineNumber === endLineNumber ? endColumn - 1 : lineContent.length; + if (lineContent === "") { + result += "
"; + } else { + result += tokenizeLineToHTML(lineContent, lineTokens.inflate(), colorMap, startOffset, endOffset, tabSize, isWindows); + } + } + return result; + } + _getColorMap() { + const colorMap = TokenizationRegistry2.getColorMap(); + const result = ["#000000"]; + if (colorMap) { + for (let i = 1, len = colorMap.length; i < len; i++) { + result[i] = Color.Format.CSS.formatHex(colorMap[i]); + } + } + return result; + } + //#region cursor operations + getPrimaryCursorState() { + return this._cursor.getPrimaryCursorState(); + } + getLastAddedCursorIndex() { + return this._cursor.getLastAddedCursorIndex(); + } + getCursorStates() { + return this._cursor.getCursorStates(); + } + setCursorStates(source, reason, states) { + return this._withViewEventsCollector((eventsCollector) => this._cursor.setStates(eventsCollector, source, reason, states)); + } + getCursorColumnSelectData() { + return this._cursor.getCursorColumnSelectData(); + } + getCursorAutoClosedCharacters() { + return this._cursor.getAutoClosedCharacters(); + } + setCursorColumnSelectData(columnSelectData) { + this._cursor.setCursorColumnSelectData(columnSelectData); + } + getPrevEditOperationType() { + return this._cursor.getPrevEditOperationType(); + } + setPrevEditOperationType(type) { + this._cursor.setPrevEditOperationType(type); + } + getSelection() { + return this._cursor.getSelection(); + } + getSelections() { + return this._cursor.getSelections(); + } + getPosition() { + return this._cursor.getPrimaryCursorState().modelState.position; + } + setSelections(source, selections, reason = 0) { + this._withViewEventsCollector((eventsCollector) => this._cursor.setSelections(eventsCollector, source, selections, reason)); + } + saveCursorState() { + return this._cursor.saveState(); + } + restoreCursorState(states) { + this._withViewEventsCollector((eventsCollector) => this._cursor.restoreState(eventsCollector, states)); + } + _executeCursorEdit(callback) { + if (this._cursor.context.cursorConfig.readOnly) { + this._eventDispatcher.emitOutgoingEvent(new ReadOnlyEditAttemptEvent()); + return; + } + this._withViewEventsCollector(callback); + } + executeEdits(source, edits, cursorStateComputer) { + this._executeCursorEdit((eventsCollector) => this._cursor.executeEdits(eventsCollector, source, edits, cursorStateComputer)); + } + startComposition() { + this._executeCursorEdit((eventsCollector) => this._cursor.startComposition(eventsCollector)); + } + endComposition(source) { + this._executeCursorEdit((eventsCollector) => this._cursor.endComposition(eventsCollector, source)); + } + type(text2, source) { + this._executeCursorEdit((eventsCollector) => this._cursor.type(eventsCollector, text2, source)); + } + compositionType(text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source) { + this._executeCursorEdit((eventsCollector) => this._cursor.compositionType(eventsCollector, text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source)); + } + paste(text2, pasteOnNewLine, multicursorText, source) { + this._executeCursorEdit((eventsCollector) => this._cursor.paste(eventsCollector, text2, pasteOnNewLine, multicursorText, source)); + } + cut(source) { + this._executeCursorEdit((eventsCollector) => this._cursor.cut(eventsCollector, source)); + } + executeCommand(command, source) { + this._executeCursorEdit((eventsCollector) => this._cursor.executeCommand(eventsCollector, command, source)); + } + executeCommands(commands, source) { + this._executeCursorEdit((eventsCollector) => this._cursor.executeCommands(eventsCollector, commands, source)); + } + revealAllCursors(source, revealHorizontal, minimalReveal = false) { + this._withViewEventsCollector((eventsCollector) => this._cursor.revealAll( + eventsCollector, + source, + minimalReveal, + 0, + revealHorizontal, + 0 + /* ScrollType.Smooth */ + )); + } + revealPrimaryCursor(source, revealHorizontal, minimalReveal = false) { + this._withViewEventsCollector((eventsCollector) => this._cursor.revealPrimary( + eventsCollector, + source, + minimalReveal, + 0, + revealHorizontal, + 0 + /* ScrollType.Smooth */ + )); + } + revealTopMostCursor(source) { + const viewPosition = this._cursor.getTopMostViewPosition(); + const viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column); + this._withViewEventsCollector((eventsCollector) => eventsCollector.emitViewEvent(new ViewRevealRangeRequestEvent( + source, + false, + viewRange, + null, + 0, + true, + 0 + /* ScrollType.Smooth */ + ))); + } + revealBottomMostCursor(source) { + const viewPosition = this._cursor.getBottomMostViewPosition(); + const viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column); + this._withViewEventsCollector((eventsCollector) => eventsCollector.emitViewEvent(new ViewRevealRangeRequestEvent( + source, + false, + viewRange, + null, + 0, + true, + 0 + /* ScrollType.Smooth */ + ))); + } + revealRange(source, revealHorizontal, viewRange, verticalType, scrollType) { + this._withViewEventsCollector((eventsCollector) => eventsCollector.emitViewEvent(new ViewRevealRangeRequestEvent(source, false, viewRange, null, verticalType, revealHorizontal, scrollType))); + } + //#endregion + //#region viewLayout + changeWhitespace(callback) { + const hadAChange = this.viewLayout.changeWhitespace(callback); + if (hadAChange) { + this._eventDispatcher.emitSingleViewEvent(new ViewZonesChangedEvent()); + this._eventDispatcher.emitOutgoingEvent(new ViewZonesChangedEvent2()); + } + } + //#endregion + _withViewEventsCollector(callback) { + try { + const eventsCollector = this._eventDispatcher.beginEmitViewEvents(); + return callback(eventsCollector); + } finally { + this._eventDispatcher.endEmitViewEvents(); + } + } + batchEvents(callback) { + this._withViewEventsCollector(() => { + callback(); + }); + } + normalizePosition(position, affinity) { + return this._lines.normalizePosition(position, affinity); + } + /** + * Gets the column at which indentation stops at a given line. + * @internal + */ + getLineIndentColumn(lineNumber) { + return this._lines.getLineIndentColumn(lineNumber); + } + }; + ViewportStart = class _ViewportStart { + static create(model) { + const viewportStartLineTrackedRange = model._setTrackedRange( + null, + new Range(1, 1, 1, 1), + 1 + /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ + ); + return new _ViewportStart(model, 1, false, viewportStartLineTrackedRange, 0); + } + get viewLineNumber() { + return this._viewLineNumber; + } + get isValid() { + return this._isValid; + } + get modelTrackedRange() { + return this._modelTrackedRange; + } + get startLineDelta() { + return this._startLineDelta; + } + constructor(_model, _viewLineNumber, _isValid, _modelTrackedRange, _startLineDelta) { + this._model = _model; + this._viewLineNumber = _viewLineNumber; + this._isValid = _isValid; + this._modelTrackedRange = _modelTrackedRange; + this._startLineDelta = _startLineDelta; + } + dispose() { + this._model._setTrackedRange( + this._modelTrackedRange, + null, + 1 + /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ + ); + } + update(viewModel, startLineNumber) { + const position = viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(startLineNumber, viewModel.getLineMinColumn(startLineNumber))); + const viewportStartLineTrackedRange = viewModel.model._setTrackedRange( + this._modelTrackedRange, + new Range(position.lineNumber, position.column, position.lineNumber, position.column), + 1 + /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ + ); + const viewportStartLineTop = viewModel.viewLayout.getVerticalOffsetForLineNumber(startLineNumber); + const scrollTop = viewModel.viewLayout.getCurrentScrollTop(); + this._viewLineNumber = startLineNumber; + this._isValid = true; + this._modelTrackedRange = viewportStartLineTrackedRange; + this._startLineDelta = scrollTop - viewportStartLineTop; + } + invalidate() { + this._isValid = false; + } + }; + OverviewRulerDecorations = class { + constructor() { + this._asMap = /* @__PURE__ */ Object.create(null); + this.asArray = []; + } + accept(color, zIndex, startLineNumber, endLineNumber, lane) { + const prevGroup = this._asMap[color]; + if (prevGroup) { + const prevData = prevGroup.data; + const prevLane = prevData[prevData.length - 3]; + const prevEndLineNumber = prevData[prevData.length - 1]; + if (prevLane === lane && prevEndLineNumber + 1 >= startLineNumber) { + if (endLineNumber > prevEndLineNumber) { + prevData[prevData.length - 1] = endLineNumber; + } + return; + } + prevData.push(lane, startLineNumber, endLineNumber); + } else { + const group = new OverviewRulerDecorationsGroup(color, zIndex, [lane, startLineNumber, endLineNumber]); + this._asMap[color] = group; + this.asArray.push(group); + } + } + }; + HiddenAreasModel = class { + constructor() { + this.hiddenAreas = /* @__PURE__ */ new Map(); + this.shouldRecompute = false; + this.ranges = []; + } + setHiddenAreas(source, ranges) { + const existing = this.hiddenAreas.get(source); + if (existing && rangeArraysEqual(existing, ranges)) { + return; + } + this.hiddenAreas.set(source, ranges); + this.shouldRecompute = true; + } + /** + * The returned array is immutable. + */ + getMergedRanges() { + if (!this.shouldRecompute) { + return this.ranges; + } + this.shouldRecompute = false; + const newRanges = Array.from(this.hiddenAreas.values()).reduce((r, hiddenAreas) => mergeLineRangeArray(r, hiddenAreas), []); + if (rangeArraysEqual(this.ranges, newRanges)) { + return this.ranges; + } + this.ranges = newRanges; + return this.ranges; + } + }; + StableViewport = class { + constructor(viewportStartModelPosition, startLineDelta) { + this.viewportStartModelPosition = viewportStartModelPosition; + this.startLineDelta = startLineDelta; + } + recoverViewportStart(coordinatesConverter, viewLayout) { + if (!this.viewportStartModelPosition) { + return; + } + const viewPosition = coordinatesConverter.convertModelPositionToViewPosition(this.viewportStartModelPosition); + const viewPositionTop = viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber); + viewLayout.setScrollPosition( + { scrollTop: viewPositionTop + this.startLineDelta }, + 1 + /* ScrollType.Immediate */ + ); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/instantiation/common/serviceCollection.js +var ServiceCollection; +var init_serviceCollection = __esm({ + "node_modules/monaco-editor/esm/vs/platform/instantiation/common/serviceCollection.js"() { + ServiceCollection = class { + constructor(...entries2) { + this._entries = /* @__PURE__ */ new Map(); + for (const [id, service] of entries2) { + this.set(id, service); + } + } + set(id, instanceOrDescriptor) { + const result = this._entries.get(id); + this._entries.set(id, instanceOrDescriptor); + return result; + } + get(id) { + return this._entries.get(id); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/severity.js +var Severity, severity_default; +var init_severity = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/severity.js"() { + init_strings(); + (function(Severity3) { + Severity3[Severity3["Ignore"] = 0] = "Ignore"; + Severity3[Severity3["Info"] = 1] = "Info"; + Severity3[Severity3["Warning"] = 2] = "Warning"; + Severity3[Severity3["Error"] = 3] = "Error"; + })(Severity || (Severity = {})); + (function(Severity3) { + const _error = "error"; + const _warning = "warning"; + const _warn = "warn"; + const _info = "info"; + const _ignore = "ignore"; + function fromValue(value) { + if (!value) { + return Severity3.Ignore; + } + if (equalsIgnoreCase(_error, value)) { + return Severity3.Error; + } + if (equalsIgnoreCase(_warning, value) || equalsIgnoreCase(_warn, value)) { + return Severity3.Warning; + } + if (equalsIgnoreCase(_info, value)) { + return Severity3.Info; + } + return Severity3.Ignore; + } + Severity3.fromValue = fromValue; + function toString(severity) { + switch (severity) { + case Severity3.Error: + return _error; + case Severity3.Warning: + return _warning; + case Severity3.Info: + return _info; + default: + return _ignore; + } + } + Severity3.toString = toString; + })(Severity || (Severity = {})); + severity_default = Severity; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/notification/common/notification.js +var Severity2, INotificationService, NoOpNotification; +var init_notification = __esm({ + "node_modules/monaco-editor/esm/vs/platform/notification/common/notification.js"() { + init_severity(); + init_instantiation(); + Severity2 = severity_default; + INotificationService = createDecorator("notificationService"); + NoOpNotification = class { + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/codeEditor/codeEditorWidget.js +function getSquigglySVGData(color) { + return squigglyStart + encodeURIComponent(color.toString()) + squigglyEnd; +} +function getDotDotDotSVGData(color) { + return dotdotdotStart + encodeURIComponent(color.toString()) + dotdotdotEnd; +} +var __decorate13, __param12, CodeEditorWidget_1, CodeEditorWidget, EDITOR_ID, ModelData, BooleanEventEmitter, InteractionEmitter, EditorContextKeysManager, EditorModeContext, CodeEditorWidgetFocusTracker, EditorDecorationsCollection, squigglyStart, squigglyEnd, dotdotdotStart, dotdotdotEnd; +var init_codeEditorWidget = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/codeEditor/codeEditorWidget.js"() { + init_markerDecorations2(); + init_dom(); + init_errors(); + init_event(); + init_lifecycle(); + init_network(); + init_editor(); + init_domFontInfo(); + init_editorConfiguration(); + init_tabFocus(); + init_editorExtensions(); + init_codeEditorService(); + init_view(); + init_domLineBreaksComputer(); + init_viewUserInputEvents(); + init_codeEditorContributions(); + init_editorOptions(); + init_cursorColumns(); + init_editorColorRegistry(); + init_position(); + init_range(); + init_selection(); + init_cursorWordOperations(); + init_editorAction(); + init_editorCommon(); + init_editorContextKeys(); + init_languageConfigurationRegistry(); + init_textModel(); + init_languageFeatures(); + init_monospaceLineBreaksComputer(); + init_viewModelImpl(); + init_nls(); + init_accessibility(); + init_commands(); + init_contextkey(); + init_instantiation(); + init_serviceCollection(); + init_notification(); + init_colorRegistry(); + init_themeService(); + init_actions2(); + __decorate13 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param12 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + CodeEditorWidget = CodeEditorWidget_1 = class CodeEditorWidget2 extends Disposable { + //#endregion + get isSimpleWidget() { + return this._configuration.isSimpleWidget; + } + get contextMenuId() { + return this._configuration.contextMenuId; + } + constructor(domElement, _options, codeEditorWidgetOptions, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService) { + var _a10, _b4; + super(); + this.languageConfigurationService = languageConfigurationService; + this._deliveryQueue = createEventDeliveryQueue(); + this._contributions = this._register(new CodeEditorContributions()); + this._onDidDispose = this._register(new Emitter()); + this.onDidDispose = this._onDidDispose.event; + this._onDidChangeModelContent = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidChangeModelContent = this._onDidChangeModelContent.event; + this._onDidChangeModelLanguage = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidChangeModelLanguage = this._onDidChangeModelLanguage.event; + this._onDidChangeModelLanguageConfiguration = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidChangeModelLanguageConfiguration = this._onDidChangeModelLanguageConfiguration.event; + this._onDidChangeModelOptions = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidChangeModelOptions = this._onDidChangeModelOptions.event; + this._onDidChangeModelDecorations = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidChangeModelDecorations = this._onDidChangeModelDecorations.event; + this._onDidChangeModelTokens = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidChangeModelTokens = this._onDidChangeModelTokens.event; + this._onDidChangeConfiguration = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidChangeConfiguration = this._onDidChangeConfiguration.event; + this._onWillChangeModel = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onWillChangeModel = this._onWillChangeModel.event; + this._onDidChangeModel = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidChangeModel = this._onDidChangeModel.event; + this._onDidChangeCursorPosition = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidChangeCursorPosition = this._onDidChangeCursorPosition.event; + this._onDidChangeCursorSelection = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidChangeCursorSelection = this._onDidChangeCursorSelection.event; + this._onDidAttemptReadOnlyEdit = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onDidAttemptReadOnlyEdit = this._onDidAttemptReadOnlyEdit.event; + this._onDidLayoutChange = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidLayoutChange = this._onDidLayoutChange.event; + this._editorTextFocus = this._register(new BooleanEventEmitter({ deliveryQueue: this._deliveryQueue })); + this.onDidFocusEditorText = this._editorTextFocus.onDidChangeToTrue; + this.onDidBlurEditorText = this._editorTextFocus.onDidChangeToFalse; + this._editorWidgetFocus = this._register(new BooleanEventEmitter({ deliveryQueue: this._deliveryQueue })); + this.onDidFocusEditorWidget = this._editorWidgetFocus.onDidChangeToTrue; + this.onDidBlurEditorWidget = this._editorWidgetFocus.onDidChangeToFalse; + this._onWillType = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onWillType = this._onWillType.event; + this._onDidType = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onDidType = this._onDidType.event; + this._onDidCompositionStart = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onDidCompositionStart = this._onDidCompositionStart.event; + this._onDidCompositionEnd = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onDidCompositionEnd = this._onDidCompositionEnd.event; + this._onDidPaste = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onDidPaste = this._onDidPaste.event; + this._onMouseUp = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onMouseUp = this._onMouseUp.event; + this._onMouseDown = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onMouseDown = this._onMouseDown.event; + this._onMouseDrag = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onMouseDrag = this._onMouseDrag.event; + this._onMouseDrop = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onMouseDrop = this._onMouseDrop.event; + this._onMouseDropCanceled = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onMouseDropCanceled = this._onMouseDropCanceled.event; + this._onDropIntoEditor = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onDropIntoEditor = this._onDropIntoEditor.event; + this._onContextMenu = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onContextMenu = this._onContextMenu.event; + this._onMouseMove = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onMouseMove = this._onMouseMove.event; + this._onMouseLeave = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onMouseLeave = this._onMouseLeave.event; + this._onMouseWheel = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onMouseWheel = this._onMouseWheel.event; + this._onKeyUp = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onKeyUp = this._onKeyUp.event; + this._onKeyDown = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue)); + this.onKeyDown = this._onKeyDown.event; + this._onDidContentSizeChange = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidContentSizeChange = this._onDidContentSizeChange.event; + this._onDidScrollChange = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidScrollChange = this._onDidScrollChange.event; + this._onDidChangeViewZones = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidChangeViewZones = this._onDidChangeViewZones.event; + this._onDidChangeHiddenAreas = this._register(new Emitter({ deliveryQueue: this._deliveryQueue })); + this.onDidChangeHiddenAreas = this._onDidChangeHiddenAreas.event; + this._updateCounter = 0; + this._onBeginUpdate = this._register(new Emitter()); + this.onBeginUpdate = this._onBeginUpdate.event; + this._onEndUpdate = this._register(new Emitter()); + this.onEndUpdate = this._onEndUpdate.event; + this._actions = /* @__PURE__ */ new Map(); + this._bannerDomNode = null; + this._dropIntoEditorDecorations = this.createDecorationsCollection(); + codeEditorService.willCreateCodeEditor(); + const options2 = __spreadValues({}, _options); + this._domElement = domElement; + this._overflowWidgetsDomNode = options2.overflowWidgetsDomNode; + delete options2.overflowWidgetsDomNode; + this._id = ++EDITOR_ID; + this._decorationTypeKeysToIds = {}; + this._decorationTypeSubtypes = {}; + this._telemetryData = codeEditorWidgetOptions.telemetryData; + this._configuration = this._register(this._createConfiguration(codeEditorWidgetOptions.isSimpleWidget || false, (_a10 = codeEditorWidgetOptions.contextMenuId) !== null && _a10 !== void 0 ? _a10 : codeEditorWidgetOptions.isSimpleWidget ? MenuId.SimpleEditorContext : MenuId.EditorContext, options2, accessibilityService)); + this._register(this._configuration.onDidChange((e) => { + this._onDidChangeConfiguration.fire(e); + const options3 = this._configuration.options; + if (e.hasChanged( + 145 + /* EditorOption.layoutInfo */ + )) { + const layoutInfo = options3.get( + 145 + /* EditorOption.layoutInfo */ + ); + this._onDidLayoutChange.fire(layoutInfo); + } + })); + this._contextKeyService = this._register(contextKeyService.createScoped(this._domElement)); + this._notificationService = notificationService; + this._codeEditorService = codeEditorService; + this._commandService = commandService; + this._themeService = themeService; + this._register(new EditorContextKeysManager(this, this._contextKeyService)); + this._register(new EditorModeContext(this, this._contextKeyService, languageFeaturesService)); + this._instantiationService = this._register(instantiationService.createChild(new ServiceCollection([IContextKeyService, this._contextKeyService]))); + this._modelData = null; + this._focusTracker = new CodeEditorWidgetFocusTracker(domElement, this._overflowWidgetsDomNode); + this._register(this._focusTracker.onChange(() => { + this._editorWidgetFocus.setValue(this._focusTracker.hasFocus()); + })); + this._contentWidgets = {}; + this._overlayWidgets = {}; + this._glyphMarginWidgets = {}; + let contributions; + if (Array.isArray(codeEditorWidgetOptions.contributions)) { + contributions = codeEditorWidgetOptions.contributions; + } else { + contributions = EditorExtensionsRegistry.getEditorContributions(); + } + this._contributions.initialize(this, contributions, this._instantiationService); + for (const action of EditorExtensionsRegistry.getEditorActions()) { + if (this._actions.has(action.id)) { + onUnexpectedError(new Error(`Cannot have two actions with the same id ${action.id}`)); + continue; + } + const internalAction = new InternalEditorAction(action.id, action.label, action.alias, action.metadata, (_b4 = action.precondition) !== null && _b4 !== void 0 ? _b4 : void 0, (args) => { + return this._instantiationService.invokeFunction((accessor) => { + return Promise.resolve(action.runEditorCommand(accessor, this, args)); + }); + }, this._contextKeyService); + this._actions.set(internalAction.id, internalAction); + } + const isDropIntoEnabled = () => { + return !this._configuration.options.get( + 91 + /* EditorOption.readOnly */ + ) && this._configuration.options.get( + 36 + /* EditorOption.dropIntoEditor */ + ).enabled; + }; + this._register(new DragAndDropObserver(this._domElement, { + onDragOver: (e) => { + if (!isDropIntoEnabled()) { + return; + } + const target = this.getTargetAtClientPoint(e.clientX, e.clientY); + if (target === null || target === void 0 ? void 0 : target.position) { + this.showDropIndicatorAt(target.position); + } + }, + onDrop: (e) => __async(this, null, function* () { + if (!isDropIntoEnabled()) { + return; + } + this.removeDropIndicator(); + if (!e.dataTransfer) { + return; + } + const target = this.getTargetAtClientPoint(e.clientX, e.clientY); + if (target === null || target === void 0 ? void 0 : target.position) { + this._onDropIntoEditor.fire({ position: target.position, event: e }); + } + }), + onDragLeave: () => { + this.removeDropIndicator(); + }, + onDragEnd: () => { + this.removeDropIndicator(); + } + })); + this._codeEditorService.addCodeEditor(this); + } + writeScreenReaderContent(reason) { + var _a10; + (_a10 = this._modelData) === null || _a10 === void 0 ? void 0 : _a10.view.writeScreenReaderContent(reason); + } + _createConfiguration(isSimpleWidget, contextMenuId, options2, accessibilityService) { + return new EditorConfiguration(isSimpleWidget, contextMenuId, options2, this._domElement, accessibilityService); + } + getId() { + return this.getEditorType() + ":" + this._id; + } + getEditorType() { + return EditorType.ICodeEditor; + } + dispose() { + this._codeEditorService.removeCodeEditor(this); + this._focusTracker.dispose(); + this._actions.clear(); + this._contentWidgets = {}; + this._overlayWidgets = {}; + this._removeDecorationTypes(); + this._postDetachModelCleanup(this._detachModel()); + this._onDidDispose.fire(); + super.dispose(); + } + invokeWithinContext(fn) { + return this._instantiationService.invokeFunction(fn); + } + updateOptions(newOptions) { + this._configuration.updateOptions(newOptions || {}); + } + getOptions() { + return this._configuration.options; + } + getOption(id) { + return this._configuration.options.get(id); + } + getRawOptions() { + return this._configuration.getRawOptions(); + } + getOverflowWidgetsDomNode() { + return this._overflowWidgetsDomNode; + } + getConfiguredWordAtPosition(position) { + if (!this._modelData) { + return null; + } + return WordOperations.getWordAtPosition(this._modelData.model, this._configuration.options.get( + 131 + /* EditorOption.wordSeparators */ + ), this._configuration.options.get( + 130 + /* EditorOption.wordSegmenterLocales */ + ), position); + } + getValue(options2 = null) { + if (!this._modelData) { + return ""; + } + const preserveBOM = options2 && options2.preserveBOM ? true : false; + let eolPreference = 0; + if (options2 && options2.lineEnding && options2.lineEnding === "\n") { + eolPreference = 1; + } else if (options2 && options2.lineEnding && options2.lineEnding === "\r\n") { + eolPreference = 2; + } + return this._modelData.model.getValue(eolPreference, preserveBOM); + } + setValue(newValue) { + try { + this._beginUpdate(); + if (!this._modelData) { + return; + } + this._modelData.model.setValue(newValue); + } finally { + this._endUpdate(); + } + } + getModel() { + if (!this._modelData) { + return null; + } + return this._modelData.model; + } + setModel(_model = null) { + var _a10; + try { + this._beginUpdate(); + const model = _model; + if (this._modelData === null && model === null) { + return; + } + if (this._modelData && this._modelData.model === model) { + return; + } + const e = { + oldModelUrl: ((_a10 = this._modelData) === null || _a10 === void 0 ? void 0 : _a10.model.uri) || null, + newModelUrl: (model === null || model === void 0 ? void 0 : model.uri) || null + }; + this._onWillChangeModel.fire(e); + const hasTextFocus = this.hasTextFocus(); + const detachedModel = this._detachModel(); + this._attachModel(model); + if (hasTextFocus && this.hasModel()) { + this.focus(); + } + this._removeDecorationTypes(); + this._onDidChangeModel.fire(e); + this._postDetachModelCleanup(detachedModel); + this._contributionsDisposable = this._contributions.onAfterModelAttached(); + } finally { + this._endUpdate(); + } + } + _removeDecorationTypes() { + this._decorationTypeKeysToIds = {}; + if (this._decorationTypeSubtypes) { + for (const decorationType in this._decorationTypeSubtypes) { + const subTypes = this._decorationTypeSubtypes[decorationType]; + for (const subType in subTypes) { + this._removeDecorationType(decorationType + "-" + subType); + } + } + this._decorationTypeSubtypes = {}; + } + } + getVisibleRanges() { + if (!this._modelData) { + return []; + } + return this._modelData.viewModel.getVisibleRanges(); + } + getVisibleRangesPlusViewportAboveBelow() { + if (!this._modelData) { + return []; + } + return this._modelData.viewModel.getVisibleRangesPlusViewportAboveBelow(); + } + getWhitespaces() { + if (!this._modelData) { + return []; + } + return this._modelData.viewModel.viewLayout.getWhitespaces(); + } + static _getVerticalOffsetAfterPosition(modelData, modelLineNumber, modelColumn, includeViewZones) { + const modelPosition = modelData.model.validatePosition({ + lineNumber: modelLineNumber, + column: modelColumn + }); + const viewPosition = modelData.viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition); + return modelData.viewModel.viewLayout.getVerticalOffsetAfterLineNumber(viewPosition.lineNumber, includeViewZones); + } + getTopForLineNumber(lineNumber, includeViewZones = false) { + if (!this._modelData) { + return -1; + } + return CodeEditorWidget_1._getVerticalOffsetForPosition(this._modelData, lineNumber, 1, includeViewZones); + } + getTopForPosition(lineNumber, column) { + if (!this._modelData) { + return -1; + } + return CodeEditorWidget_1._getVerticalOffsetForPosition(this._modelData, lineNumber, column, false); + } + static _getVerticalOffsetForPosition(modelData, modelLineNumber, modelColumn, includeViewZones = false) { + const modelPosition = modelData.model.validatePosition({ + lineNumber: modelLineNumber, + column: modelColumn + }); + const viewPosition = modelData.viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition); + return modelData.viewModel.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber, includeViewZones); + } + getBottomForLineNumber(lineNumber, includeViewZones = false) { + if (!this._modelData) { + return -1; + } + return CodeEditorWidget_1._getVerticalOffsetAfterPosition(this._modelData, lineNumber, 1, includeViewZones); + } + setHiddenAreas(ranges, source) { + var _a10; + (_a10 = this._modelData) === null || _a10 === void 0 ? void 0 : _a10.viewModel.setHiddenAreas(ranges.map((r) => Range.lift(r)), source); + } + getVisibleColumnFromPosition(rawPosition) { + if (!this._modelData) { + return rawPosition.column; + } + const position = this._modelData.model.validatePosition(rawPosition); + const tabSize = this._modelData.model.getOptions().tabSize; + return CursorColumns.visibleColumnFromColumn(this._modelData.model.getLineContent(position.lineNumber), position.column, tabSize) + 1; + } + getPosition() { + if (!this._modelData) { + return null; + } + return this._modelData.viewModel.getPosition(); + } + setPosition(position, source = "api") { + if (!this._modelData) { + return; + } + if (!Position.isIPosition(position)) { + throw new Error("Invalid arguments"); + } + this._modelData.viewModel.setSelections(source, [{ + selectionStartLineNumber: position.lineNumber, + selectionStartColumn: position.column, + positionLineNumber: position.lineNumber, + positionColumn: position.column + }]); + } + _sendRevealRange(modelRange, verticalType, revealHorizontal, scrollType) { + if (!this._modelData) { + return; + } + if (!Range.isIRange(modelRange)) { + throw new Error("Invalid arguments"); + } + const validatedModelRange = this._modelData.model.validateRange(modelRange); + const viewRange = this._modelData.viewModel.coordinatesConverter.convertModelRangeToViewRange(validatedModelRange); + this._modelData.viewModel.revealRange("api", revealHorizontal, viewRange, verticalType, scrollType); + } + revealLine(lineNumber, scrollType = 0) { + this._revealLine(lineNumber, 0, scrollType); + } + revealLineInCenter(lineNumber, scrollType = 0) { + this._revealLine(lineNumber, 1, scrollType); + } + revealLineInCenterIfOutsideViewport(lineNumber, scrollType = 0) { + this._revealLine(lineNumber, 2, scrollType); + } + revealLineNearTop(lineNumber, scrollType = 0) { + this._revealLine(lineNumber, 5, scrollType); + } + _revealLine(lineNumber, revealType, scrollType) { + if (typeof lineNumber !== "number") { + throw new Error("Invalid arguments"); + } + this._sendRevealRange(new Range(lineNumber, 1, lineNumber, 1), revealType, false, scrollType); + } + revealPosition(position, scrollType = 0) { + this._revealPosition(position, 0, true, scrollType); + } + revealPositionInCenter(position, scrollType = 0) { + this._revealPosition(position, 1, true, scrollType); + } + revealPositionInCenterIfOutsideViewport(position, scrollType = 0) { + this._revealPosition(position, 2, true, scrollType); + } + revealPositionNearTop(position, scrollType = 0) { + this._revealPosition(position, 5, true, scrollType); + } + _revealPosition(position, verticalType, revealHorizontal, scrollType) { + if (!Position.isIPosition(position)) { + throw new Error("Invalid arguments"); + } + this._sendRevealRange(new Range(position.lineNumber, position.column, position.lineNumber, position.column), verticalType, revealHorizontal, scrollType); + } + getSelection() { + if (!this._modelData) { + return null; + } + return this._modelData.viewModel.getSelection(); + } + getSelections() { + if (!this._modelData) { + return null; + } + return this._modelData.viewModel.getSelections(); + } + setSelection(something, source = "api") { + const isSelection = Selection.isISelection(something); + const isRange = Range.isIRange(something); + if (!isSelection && !isRange) { + throw new Error("Invalid arguments"); + } + if (isSelection) { + this._setSelectionImpl(something, source); + } else if (isRange) { + const selection = { + selectionStartLineNumber: something.startLineNumber, + selectionStartColumn: something.startColumn, + positionLineNumber: something.endLineNumber, + positionColumn: something.endColumn + }; + this._setSelectionImpl(selection, source); + } + } + _setSelectionImpl(sel, source) { + if (!this._modelData) { + return; + } + const selection = new Selection(sel.selectionStartLineNumber, sel.selectionStartColumn, sel.positionLineNumber, sel.positionColumn); + this._modelData.viewModel.setSelections(source, [selection]); + } + revealLines(startLineNumber, endLineNumber, scrollType = 0) { + this._revealLines(startLineNumber, endLineNumber, 0, scrollType); + } + revealLinesInCenter(startLineNumber, endLineNumber, scrollType = 0) { + this._revealLines(startLineNumber, endLineNumber, 1, scrollType); + } + revealLinesInCenterIfOutsideViewport(startLineNumber, endLineNumber, scrollType = 0) { + this._revealLines(startLineNumber, endLineNumber, 2, scrollType); + } + revealLinesNearTop(startLineNumber, endLineNumber, scrollType = 0) { + this._revealLines(startLineNumber, endLineNumber, 5, scrollType); + } + _revealLines(startLineNumber, endLineNumber, verticalType, scrollType) { + if (typeof startLineNumber !== "number" || typeof endLineNumber !== "number") { + throw new Error("Invalid arguments"); + } + this._sendRevealRange(new Range(startLineNumber, 1, endLineNumber, 1), verticalType, false, scrollType); + } + revealRange(range2, scrollType = 0, revealVerticalInCenter = false, revealHorizontal = true) { + this._revealRange(range2, revealVerticalInCenter ? 1 : 0, revealHorizontal, scrollType); + } + revealRangeInCenter(range2, scrollType = 0) { + this._revealRange(range2, 1, true, scrollType); + } + revealRangeInCenterIfOutsideViewport(range2, scrollType = 0) { + this._revealRange(range2, 2, true, scrollType); + } + revealRangeNearTop(range2, scrollType = 0) { + this._revealRange(range2, 5, true, scrollType); + } + revealRangeNearTopIfOutsideViewport(range2, scrollType = 0) { + this._revealRange(range2, 6, true, scrollType); + } + revealRangeAtTop(range2, scrollType = 0) { + this._revealRange(range2, 3, true, scrollType); + } + _revealRange(range2, verticalType, revealHorizontal, scrollType) { + if (!Range.isIRange(range2)) { + throw new Error("Invalid arguments"); + } + this._sendRevealRange(Range.lift(range2), verticalType, revealHorizontal, scrollType); + } + setSelections(ranges, source = "api", reason = 0) { + if (!this._modelData) { + return; + } + if (!ranges || ranges.length === 0) { + throw new Error("Invalid arguments"); + } + for (let i = 0, len = ranges.length; i < len; i++) { + if (!Selection.isISelection(ranges[i])) { + throw new Error("Invalid arguments"); + } + } + this._modelData.viewModel.setSelections(source, ranges, reason); + } + getContentWidth() { + if (!this._modelData) { + return -1; + } + return this._modelData.viewModel.viewLayout.getContentWidth(); + } + getScrollWidth() { + if (!this._modelData) { + return -1; + } + return this._modelData.viewModel.viewLayout.getScrollWidth(); + } + getScrollLeft() { + if (!this._modelData) { + return -1; + } + return this._modelData.viewModel.viewLayout.getCurrentScrollLeft(); + } + getContentHeight() { + if (!this._modelData) { + return -1; + } + return this._modelData.viewModel.viewLayout.getContentHeight(); + } + getScrollHeight() { + if (!this._modelData) { + return -1; + } + return this._modelData.viewModel.viewLayout.getScrollHeight(); + } + getScrollTop() { + if (!this._modelData) { + return -1; + } + return this._modelData.viewModel.viewLayout.getCurrentScrollTop(); + } + setScrollLeft(newScrollLeft, scrollType = 1) { + if (!this._modelData) { + return; + } + if (typeof newScrollLeft !== "number") { + throw new Error("Invalid arguments"); + } + this._modelData.viewModel.viewLayout.setScrollPosition({ + scrollLeft: newScrollLeft + }, scrollType); + } + setScrollTop(newScrollTop, scrollType = 1) { + if (!this._modelData) { + return; + } + if (typeof newScrollTop !== "number") { + throw new Error("Invalid arguments"); + } + this._modelData.viewModel.viewLayout.setScrollPosition({ + scrollTop: newScrollTop + }, scrollType); + } + setScrollPosition(position, scrollType = 1) { + if (!this._modelData) { + return; + } + this._modelData.viewModel.viewLayout.setScrollPosition(position, scrollType); + } + hasPendingScrollAnimation() { + if (!this._modelData) { + return false; + } + return this._modelData.viewModel.viewLayout.hasPendingScrollAnimation(); + } + saveViewState() { + if (!this._modelData) { + return null; + } + const contributionsState = this._contributions.saveViewState(); + const cursorState = this._modelData.viewModel.saveCursorState(); + const viewState = this._modelData.viewModel.saveState(); + return { + cursorState, + viewState, + contributionsState + }; + } + restoreViewState(s) { + if (!this._modelData || !this._modelData.hasRealView) { + return; + } + const codeEditorState = s; + if (codeEditorState && codeEditorState.cursorState && codeEditorState.viewState) { + const cursorState = codeEditorState.cursorState; + if (Array.isArray(cursorState)) { + if (cursorState.length > 0) { + this._modelData.viewModel.restoreCursorState(cursorState); + } + } else { + this._modelData.viewModel.restoreCursorState([cursorState]); + } + this._contributions.restoreViewState(codeEditorState.contributionsState || {}); + const reducedState = this._modelData.viewModel.reduceRestoreState(codeEditorState.viewState); + this._modelData.view.restoreState(reducedState); + } + } + handleInitialized() { + var _a10; + (_a10 = this._getViewModel()) === null || _a10 === void 0 ? void 0 : _a10.visibleLinesStabilized(); + } + getContribution(id) { + return this._contributions.get(id); + } + getActions() { + return Array.from(this._actions.values()); + } + getSupportedActions() { + let result = this.getActions(); + result = result.filter((action) => action.isSupported()); + return result; + } + getAction(id) { + return this._actions.get(id) || null; + } + trigger(source, handlerId, payload) { + payload = payload || {}; + try { + this._beginUpdate(); + switch (handlerId) { + case "compositionStart": + this._startComposition(); + return; + case "compositionEnd": + this._endComposition(source); + return; + case "type": { + const args = payload; + this._type(source, args.text || ""); + return; + } + case "replacePreviousChar": { + const args = payload; + this._compositionType(source, args.text || "", args.replaceCharCnt || 0, 0, 0); + return; + } + case "compositionType": { + const args = payload; + this._compositionType(source, args.text || "", args.replacePrevCharCnt || 0, args.replaceNextCharCnt || 0, args.positionDelta || 0); + return; + } + case "paste": { + const args = payload; + this._paste(source, args.text || "", args.pasteOnNewLine || false, args.multicursorText || null, args.mode || null, args.clipboardEvent); + return; + } + case "cut": + this._cut(source); + return; + } + const action = this.getAction(handlerId); + if (action) { + Promise.resolve(action.run(payload)).then(void 0, onUnexpectedError); + return; + } + if (!this._modelData) { + return; + } + if (this._triggerEditorCommand(source, handlerId, payload)) { + return; + } + this._triggerCommand(handlerId, payload); + } finally { + this._endUpdate(); + } + } + _triggerCommand(handlerId, payload) { + this._commandService.executeCommand(handlerId, payload); + } + _startComposition() { + if (!this._modelData) { + return; + } + this._modelData.viewModel.startComposition(); + this._onDidCompositionStart.fire(); + } + _endComposition(source) { + if (!this._modelData) { + return; + } + this._modelData.viewModel.endComposition(source); + this._onDidCompositionEnd.fire(); + } + _type(source, text2) { + if (!this._modelData || text2.length === 0) { + return; + } + if (source === "keyboard") { + this._onWillType.fire(text2); + } + this._modelData.viewModel.type(text2, source); + if (source === "keyboard") { + this._onDidType.fire(text2); + } + } + _compositionType(source, text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta) { + if (!this._modelData) { + return; + } + this._modelData.viewModel.compositionType(text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source); + } + _paste(source, text2, pasteOnNewLine, multicursorText, mode, clipboardEvent) { + if (!this._modelData) { + return; + } + const viewModel = this._modelData.viewModel; + const startPosition = viewModel.getSelection().getStartPosition(); + viewModel.paste(text2, pasteOnNewLine, multicursorText, source); + const endPosition = viewModel.getSelection().getStartPosition(); + if (source === "keyboard") { + this._onDidPaste.fire({ + clipboardEvent, + range: new Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column), + languageId: mode + }); + } + } + _cut(source) { + if (!this._modelData) { + return; + } + this._modelData.viewModel.cut(source); + } + _triggerEditorCommand(source, handlerId, payload) { + const command = EditorExtensionsRegistry.getEditorCommand(handlerId); + if (command) { + payload = payload || {}; + payload.source = source; + this._instantiationService.invokeFunction((accessor) => { + Promise.resolve(command.runEditorCommand(accessor, this, payload)).then(void 0, onUnexpectedError); + }); + return true; + } + return false; + } + _getViewModel() { + if (!this._modelData) { + return null; + } + return this._modelData.viewModel; + } + pushUndoStop() { + if (!this._modelData) { + return false; + } + if (this._configuration.options.get( + 91 + /* EditorOption.readOnly */ + )) { + return false; + } + this._modelData.model.pushStackElement(); + return true; + } + popUndoStop() { + if (!this._modelData) { + return false; + } + if (this._configuration.options.get( + 91 + /* EditorOption.readOnly */ + )) { + return false; + } + this._modelData.model.popStackElement(); + return true; + } + executeEdits(source, edits, endCursorState) { + if (!this._modelData) { + return false; + } + if (this._configuration.options.get( + 91 + /* EditorOption.readOnly */ + )) { + return false; + } + let cursorStateComputer; + if (!endCursorState) { + cursorStateComputer = () => null; + } else if (Array.isArray(endCursorState)) { + cursorStateComputer = () => endCursorState; + } else { + cursorStateComputer = endCursorState; + } + this._modelData.viewModel.executeEdits(source, edits, cursorStateComputer); + return true; + } + executeCommand(source, command) { + if (!this._modelData) { + return; + } + this._modelData.viewModel.executeCommand(command, source); + } + executeCommands(source, commands) { + if (!this._modelData) { + return; + } + this._modelData.viewModel.executeCommands(commands, source); + } + createDecorationsCollection(decorations) { + return new EditorDecorationsCollection(this, decorations); + } + changeDecorations(callback) { + if (!this._modelData) { + return null; + } + return this._modelData.model.changeDecorations(callback, this._id); + } + getLineDecorations(lineNumber) { + if (!this._modelData) { + return null; + } + return this._modelData.model.getLineDecorations(lineNumber, this._id, filterValidationDecorations(this._configuration.options)); + } + getDecorationsInRange(range2) { + if (!this._modelData) { + return null; + } + return this._modelData.model.getDecorationsInRange(range2, this._id, filterValidationDecorations(this._configuration.options)); + } + /** + * @deprecated + */ + deltaDecorations(oldDecorations, newDecorations) { + if (!this._modelData) { + return []; + } + if (oldDecorations.length === 0 && newDecorations.length === 0) { + return oldDecorations; + } + return this._modelData.model.deltaDecorations(oldDecorations, newDecorations, this._id); + } + removeDecorations(decorationIds) { + if (!this._modelData || decorationIds.length === 0) { + return; + } + this._modelData.model.changeDecorations((changeAccessor) => { + changeAccessor.deltaDecorations(decorationIds, []); + }); + } + removeDecorationsByType(decorationTypeKey) { + const oldDecorationsIds = this._decorationTypeKeysToIds[decorationTypeKey]; + if (oldDecorationsIds) { + this.changeDecorations((accessor) => accessor.deltaDecorations(oldDecorationsIds, [])); + } + if (this._decorationTypeKeysToIds.hasOwnProperty(decorationTypeKey)) { + delete this._decorationTypeKeysToIds[decorationTypeKey]; + } + if (this._decorationTypeSubtypes.hasOwnProperty(decorationTypeKey)) { + delete this._decorationTypeSubtypes[decorationTypeKey]; + } + } + getLayoutInfo() { + const options2 = this._configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + return layoutInfo; + } + createOverviewRuler(cssClassName) { + if (!this._modelData || !this._modelData.hasRealView) { + return null; + } + return this._modelData.view.createOverviewRuler(cssClassName); + } + getContainerDomNode() { + return this._domElement; + } + getDomNode() { + if (!this._modelData || !this._modelData.hasRealView) { + return null; + } + return this._modelData.view.domNode.domNode; + } + delegateVerticalScrollbarPointerDown(browserEvent) { + if (!this._modelData || !this._modelData.hasRealView) { + return; + } + this._modelData.view.delegateVerticalScrollbarPointerDown(browserEvent); + } + delegateScrollFromMouseWheelEvent(browserEvent) { + if (!this._modelData || !this._modelData.hasRealView) { + return; + } + this._modelData.view.delegateScrollFromMouseWheelEvent(browserEvent); + } + layout(dimension, postponeRendering = false) { + this._configuration.observeContainer(dimension); + if (!postponeRendering) { + this.render(); + } + } + focus() { + if (!this._modelData || !this._modelData.hasRealView) { + return; + } + this._modelData.view.focus(); + } + hasTextFocus() { + if (!this._modelData || !this._modelData.hasRealView) { + return false; + } + return this._modelData.view.isFocused(); + } + hasWidgetFocus() { + return this._focusTracker && this._focusTracker.hasFocus(); + } + addContentWidget(widget) { + const widgetData = { + widget, + position: widget.getPosition() + }; + if (this._contentWidgets.hasOwnProperty(widget.getId())) { + console.warn("Overwriting a content widget with the same id:" + widget.getId()); + } + this._contentWidgets[widget.getId()] = widgetData; + if (this._modelData && this._modelData.hasRealView) { + this._modelData.view.addContentWidget(widgetData); + } + } + layoutContentWidget(widget) { + const widgetId = widget.getId(); + if (this._contentWidgets.hasOwnProperty(widgetId)) { + const widgetData = this._contentWidgets[widgetId]; + widgetData.position = widget.getPosition(); + if (this._modelData && this._modelData.hasRealView) { + this._modelData.view.layoutContentWidget(widgetData); + } + } + } + removeContentWidget(widget) { + const widgetId = widget.getId(); + if (this._contentWidgets.hasOwnProperty(widgetId)) { + const widgetData = this._contentWidgets[widgetId]; + delete this._contentWidgets[widgetId]; + if (this._modelData && this._modelData.hasRealView) { + this._modelData.view.removeContentWidget(widgetData); + } + } + } + addOverlayWidget(widget) { + const widgetData = { + widget, + position: widget.getPosition() + }; + if (this._overlayWidgets.hasOwnProperty(widget.getId())) { + console.warn("Overwriting an overlay widget with the same id."); + } + this._overlayWidgets[widget.getId()] = widgetData; + if (this._modelData && this._modelData.hasRealView) { + this._modelData.view.addOverlayWidget(widgetData); + } + } + layoutOverlayWidget(widget) { + const widgetId = widget.getId(); + if (this._overlayWidgets.hasOwnProperty(widgetId)) { + const widgetData = this._overlayWidgets[widgetId]; + widgetData.position = widget.getPosition(); + if (this._modelData && this._modelData.hasRealView) { + this._modelData.view.layoutOverlayWidget(widgetData); + } + } + } + removeOverlayWidget(widget) { + const widgetId = widget.getId(); + if (this._overlayWidgets.hasOwnProperty(widgetId)) { + const widgetData = this._overlayWidgets[widgetId]; + delete this._overlayWidgets[widgetId]; + if (this._modelData && this._modelData.hasRealView) { + this._modelData.view.removeOverlayWidget(widgetData); + } + } + } + addGlyphMarginWidget(widget) { + const widgetData = { + widget, + position: widget.getPosition() + }; + if (this._glyphMarginWidgets.hasOwnProperty(widget.getId())) { + console.warn("Overwriting a glyph margin widget with the same id."); + } + this._glyphMarginWidgets[widget.getId()] = widgetData; + if (this._modelData && this._modelData.hasRealView) { + this._modelData.view.addGlyphMarginWidget(widgetData); + } + } + layoutGlyphMarginWidget(widget) { + const widgetId = widget.getId(); + if (this._glyphMarginWidgets.hasOwnProperty(widgetId)) { + const widgetData = this._glyphMarginWidgets[widgetId]; + widgetData.position = widget.getPosition(); + if (this._modelData && this._modelData.hasRealView) { + this._modelData.view.layoutGlyphMarginWidget(widgetData); + } + } + } + removeGlyphMarginWidget(widget) { + const widgetId = widget.getId(); + if (this._glyphMarginWidgets.hasOwnProperty(widgetId)) { + const widgetData = this._glyphMarginWidgets[widgetId]; + delete this._glyphMarginWidgets[widgetId]; + if (this._modelData && this._modelData.hasRealView) { + this._modelData.view.removeGlyphMarginWidget(widgetData); + } + } + } + changeViewZones(callback) { + if (!this._modelData || !this._modelData.hasRealView) { + return; + } + this._modelData.view.change(callback); + } + getTargetAtClientPoint(clientX, clientY) { + if (!this._modelData || !this._modelData.hasRealView) { + return null; + } + return this._modelData.view.getTargetAtClientPoint(clientX, clientY); + } + getScrolledVisiblePosition(rawPosition) { + if (!this._modelData || !this._modelData.hasRealView) { + return null; + } + const position = this._modelData.model.validatePosition(rawPosition); + const options2 = this._configuration.options; + const layoutInfo = options2.get( + 145 + /* EditorOption.layoutInfo */ + ); + const top = CodeEditorWidget_1._getVerticalOffsetForPosition(this._modelData, position.lineNumber, position.column) - this.getScrollTop(); + const left = this._modelData.view.getOffsetForColumn(position.lineNumber, position.column) + layoutInfo.glyphMarginWidth + layoutInfo.lineNumbersWidth + layoutInfo.decorationsWidth - this.getScrollLeft(); + return { + top, + left, + height: options2.get( + 67 + /* EditorOption.lineHeight */ + ) + }; + } + getOffsetForColumn(lineNumber, column) { + if (!this._modelData || !this._modelData.hasRealView) { + return -1; + } + return this._modelData.view.getOffsetForColumn(lineNumber, column); + } + render(forceRedraw = false) { + if (!this._modelData || !this._modelData.hasRealView) { + return; + } + this._modelData.viewModel.batchEvents(() => { + this._modelData.view.render(true, forceRedraw); + }); + } + setAriaOptions(options2) { + if (!this._modelData || !this._modelData.hasRealView) { + return; + } + this._modelData.view.setAriaOptions(options2); + } + applyFontInfo(target) { + applyFontInfo(target, this._configuration.options.get( + 50 + /* EditorOption.fontInfo */ + )); + } + setBanner(domNode, domNodeHeight) { + if (this._bannerDomNode && this._domElement.contains(this._bannerDomNode)) { + this._domElement.removeChild(this._bannerDomNode); + } + this._bannerDomNode = domNode; + this._configuration.setReservedHeight(domNode ? domNodeHeight : 0); + if (this._bannerDomNode) { + this._domElement.prepend(this._bannerDomNode); + } + } + _attachModel(model) { + if (!model) { + this._modelData = null; + return; + } + const listenersToRemove = []; + this._domElement.setAttribute("data-mode-id", model.getLanguageId()); + this._configuration.setIsDominatedByLongLines(model.isDominatedByLongLines()); + this._configuration.setModelLineCount(model.getLineCount()); + const attachedView = model.onBeforeAttached(); + const viewModel = new ViewModel(this._id, this._configuration, model, DOMLineBreaksComputerFactory.create(getWindow(this._domElement)), MonospaceLineBreaksComputerFactory.create(this._configuration.options), (callback) => scheduleAtNextAnimationFrame(getWindow(this._domElement), callback), this.languageConfigurationService, this._themeService, attachedView); + listenersToRemove.push(model.onWillDispose(() => this.setModel(null))); + listenersToRemove.push(viewModel.onEvent((e) => { + switch (e.kind) { + case 0: + this._onDidContentSizeChange.fire(e); + break; + case 1: + this._editorTextFocus.setValue(e.hasFocus); + break; + case 2: + this._onDidScrollChange.fire(e); + break; + case 3: + this._onDidChangeViewZones.fire(); + break; + case 4: + this._onDidChangeHiddenAreas.fire(); + break; + case 5: + this._onDidAttemptReadOnlyEdit.fire(); + break; + case 6: { + if (e.reachedMaxCursorCount) { + const multiCursorLimit = this.getOption( + 80 + /* EditorOption.multiCursorLimit */ + ); + const message = localize("cursors.maximum", "The number of cursors has been limited to {0}. Consider using [find and replace](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) for larger changes or increase the editor multi cursor limit setting.", multiCursorLimit); + this._notificationService.prompt(Severity2.Warning, message, [ + { + label: "Find and Replace", + run: () => { + this._commandService.executeCommand("editor.action.startFindReplaceAction"); + } + }, + { + label: localize("goToSetting", "Increase Multi Cursor Limit"), + run: () => { + this._commandService.executeCommand("workbench.action.openSettings2", { + query: "editor.multiCursorLimit" + }); + } + } + ]); + } + const positions = []; + for (let i = 0, len = e.selections.length; i < len; i++) { + positions[i] = e.selections[i].getPosition(); + } + const e1 = { + position: positions[0], + secondaryPositions: positions.slice(1), + reason: e.reason, + source: e.source + }; + this._onDidChangeCursorPosition.fire(e1); + const e2 = { + selection: e.selections[0], + secondarySelections: e.selections.slice(1), + modelVersionId: e.modelVersionId, + oldSelections: e.oldSelections, + oldModelVersionId: e.oldModelVersionId, + source: e.source, + reason: e.reason + }; + this._onDidChangeCursorSelection.fire(e2); + break; + } + case 7: + this._onDidChangeModelDecorations.fire(e.event); + break; + case 8: + this._domElement.setAttribute("data-mode-id", model.getLanguageId()); + this._onDidChangeModelLanguage.fire(e.event); + break; + case 9: + this._onDidChangeModelLanguageConfiguration.fire(e.event); + break; + case 10: + this._onDidChangeModelContent.fire(e.event); + break; + case 11: + this._onDidChangeModelOptions.fire(e.event); + break; + case 12: + this._onDidChangeModelTokens.fire(e.event); + break; + } + })); + const [view, hasRealView] = this._createView(viewModel); + if (hasRealView) { + this._domElement.appendChild(view.domNode.domNode); + let keys = Object.keys(this._contentWidgets); + for (let i = 0, len = keys.length; i < len; i++) { + const widgetId = keys[i]; + view.addContentWidget(this._contentWidgets[widgetId]); + } + keys = Object.keys(this._overlayWidgets); + for (let i = 0, len = keys.length; i < len; i++) { + const widgetId = keys[i]; + view.addOverlayWidget(this._overlayWidgets[widgetId]); + } + keys = Object.keys(this._glyphMarginWidgets); + for (let i = 0, len = keys.length; i < len; i++) { + const widgetId = keys[i]; + view.addGlyphMarginWidget(this._glyphMarginWidgets[widgetId]); + } + view.render(false, true); + view.domNode.domNode.setAttribute("data-uri", model.uri.toString()); + } + this._modelData = new ModelData(model, viewModel, view, hasRealView, listenersToRemove, attachedView); + } + _createView(viewModel) { + let commandDelegate; + if (this.isSimpleWidget) { + commandDelegate = { + paste: (text2, pasteOnNewLine, multicursorText, mode) => { + this._paste("keyboard", text2, pasteOnNewLine, multicursorText, mode); + }, + type: (text2) => { + this._type("keyboard", text2); + }, + compositionType: (text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta) => { + this._compositionType("keyboard", text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta); + }, + startComposition: () => { + this._startComposition(); + }, + endComposition: () => { + this._endComposition("keyboard"); + }, + cut: () => { + this._cut("keyboard"); + } + }; + } else { + commandDelegate = { + paste: (text2, pasteOnNewLine, multicursorText, mode) => { + const payload = { text: text2, pasteOnNewLine, multicursorText, mode }; + this._commandService.executeCommand("paste", payload); + }, + type: (text2) => { + const payload = { text: text2 }; + this._commandService.executeCommand("type", payload); + }, + compositionType: (text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta) => { + if (replaceNextCharCnt || positionDelta) { + const payload = { text: text2, replacePrevCharCnt, replaceNextCharCnt, positionDelta }; + this._commandService.executeCommand("compositionType", payload); + } else { + const payload = { text: text2, replaceCharCnt: replacePrevCharCnt }; + this._commandService.executeCommand("replacePreviousChar", payload); + } + }, + startComposition: () => { + this._commandService.executeCommand("compositionStart", {}); + }, + endComposition: () => { + this._commandService.executeCommand("compositionEnd", {}); + }, + cut: () => { + this._commandService.executeCommand("cut", {}); + } + }; + } + const viewUserInputEvents = new ViewUserInputEvents(viewModel.coordinatesConverter); + viewUserInputEvents.onKeyDown = (e) => this._onKeyDown.fire(e); + viewUserInputEvents.onKeyUp = (e) => this._onKeyUp.fire(e); + viewUserInputEvents.onContextMenu = (e) => this._onContextMenu.fire(e); + viewUserInputEvents.onMouseMove = (e) => this._onMouseMove.fire(e); + viewUserInputEvents.onMouseLeave = (e) => this._onMouseLeave.fire(e); + viewUserInputEvents.onMouseDown = (e) => this._onMouseDown.fire(e); + viewUserInputEvents.onMouseUp = (e) => this._onMouseUp.fire(e); + viewUserInputEvents.onMouseDrag = (e) => this._onMouseDrag.fire(e); + viewUserInputEvents.onMouseDrop = (e) => this._onMouseDrop.fire(e); + viewUserInputEvents.onMouseDropCanceled = (e) => this._onMouseDropCanceled.fire(e); + viewUserInputEvents.onMouseWheel = (e) => this._onMouseWheel.fire(e); + const view = new View(commandDelegate, this._configuration, this._themeService.getColorTheme(), viewModel, viewUserInputEvents, this._overflowWidgetsDomNode, this._instantiationService); + return [view, true]; + } + _postDetachModelCleanup(detachedModel) { + detachedModel === null || detachedModel === void 0 ? void 0 : detachedModel.removeAllDecorationsWithOwnerId(this._id); + } + _detachModel() { + var _a10; + (_a10 = this._contributionsDisposable) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + this._contributionsDisposable = void 0; + if (!this._modelData) { + return null; + } + const model = this._modelData.model; + const removeDomNode = this._modelData.hasRealView ? this._modelData.view.domNode.domNode : null; + this._modelData.dispose(); + this._modelData = null; + this._domElement.removeAttribute("data-mode-id"); + if (removeDomNode && this._domElement.contains(removeDomNode)) { + this._domElement.removeChild(removeDomNode); + } + if (this._bannerDomNode && this._domElement.contains(this._bannerDomNode)) { + this._domElement.removeChild(this._bannerDomNode); + } + return model; + } + _removeDecorationType(key) { + this._codeEditorService.removeDecorationType(key); + } + hasModel() { + return this._modelData !== null; + } + showDropIndicatorAt(position) { + const newDecorations = [{ + range: new Range(position.lineNumber, position.column, position.lineNumber, position.column), + options: CodeEditorWidget_1.dropIntoEditorDecorationOptions + }]; + this._dropIntoEditorDecorations.set(newDecorations); + this.revealPosition( + position, + 1 + /* editorCommon.ScrollType.Immediate */ + ); + } + removeDropIndicator() { + this._dropIntoEditorDecorations.clear(); + } + setContextValue(key, value) { + this._contextKeyService.createKey(key, value); + } + _beginUpdate() { + this._updateCounter++; + if (this._updateCounter === 1) { + this._onBeginUpdate.fire(); + } + } + _endUpdate() { + this._updateCounter--; + if (this._updateCounter === 0) { + this._onEndUpdate.fire(); + } + } + }; + CodeEditorWidget.dropIntoEditorDecorationOptions = ModelDecorationOptions.register({ + description: "workbench-dnd-target", + className: "dnd-target" + }); + CodeEditorWidget = CodeEditorWidget_1 = __decorate13([ + __param12(3, IInstantiationService), + __param12(4, ICodeEditorService), + __param12(5, ICommandService), + __param12(6, IContextKeyService), + __param12(7, IThemeService), + __param12(8, INotificationService), + __param12(9, IAccessibilityService), + __param12(10, ILanguageConfigurationService), + __param12(11, ILanguageFeaturesService) + ], CodeEditorWidget); + EDITOR_ID = 0; + ModelData = class { + constructor(model, viewModel, view, hasRealView, listenersToRemove, attachedView) { + this.model = model; + this.viewModel = viewModel; + this.view = view; + this.hasRealView = hasRealView; + this.listenersToRemove = listenersToRemove; + this.attachedView = attachedView; + } + dispose() { + dispose(this.listenersToRemove); + this.model.onBeforeDetached(this.attachedView); + if (this.hasRealView) { + this.view.dispose(); + } + this.viewModel.dispose(); + } + }; + BooleanEventEmitter = class extends Disposable { + constructor(_emitterOptions) { + super(); + this._emitterOptions = _emitterOptions; + this._onDidChangeToTrue = this._register(new Emitter(this._emitterOptions)); + this.onDidChangeToTrue = this._onDidChangeToTrue.event; + this._onDidChangeToFalse = this._register(new Emitter(this._emitterOptions)); + this.onDidChangeToFalse = this._onDidChangeToFalse.event; + this._value = 0; + } + setValue(_value) { + const value = _value ? 2 : 1; + if (this._value === value) { + return; + } + this._value = value; + if (this._value === 2) { + this._onDidChangeToTrue.fire(); + } else if (this._value === 1) { + this._onDidChangeToFalse.fire(); + } + } + }; + InteractionEmitter = class extends Emitter { + constructor(_contributions, deliveryQueue) { + super({ deliveryQueue }); + this._contributions = _contributions; + } + fire(event) { + this._contributions.onBeforeInteractionEvent(); + super.fire(event); + } + }; + EditorContextKeysManager = class extends Disposable { + constructor(editor2, contextKeyService) { + super(); + this._editor = editor2; + contextKeyService.createKey("editorId", editor2.getId()); + this._editorSimpleInput = EditorContextKeys.editorSimpleInput.bindTo(contextKeyService); + this._editorFocus = EditorContextKeys.focus.bindTo(contextKeyService); + this._textInputFocus = EditorContextKeys.textInputFocus.bindTo(contextKeyService); + this._editorTextFocus = EditorContextKeys.editorTextFocus.bindTo(contextKeyService); + this._tabMovesFocus = EditorContextKeys.tabMovesFocus.bindTo(contextKeyService); + this._editorReadonly = EditorContextKeys.readOnly.bindTo(contextKeyService); + this._inDiffEditor = EditorContextKeys.inDiffEditor.bindTo(contextKeyService); + this._editorColumnSelection = EditorContextKeys.columnSelection.bindTo(contextKeyService); + this._hasMultipleSelections = EditorContextKeys.hasMultipleSelections.bindTo(contextKeyService); + this._hasNonEmptySelection = EditorContextKeys.hasNonEmptySelection.bindTo(contextKeyService); + this._canUndo = EditorContextKeys.canUndo.bindTo(contextKeyService); + this._canRedo = EditorContextKeys.canRedo.bindTo(contextKeyService); + this._register(this._editor.onDidChangeConfiguration(() => this._updateFromConfig())); + this._register(this._editor.onDidChangeCursorSelection(() => this._updateFromSelection())); + this._register(this._editor.onDidFocusEditorWidget(() => this._updateFromFocus())); + this._register(this._editor.onDidBlurEditorWidget(() => this._updateFromFocus())); + this._register(this._editor.onDidFocusEditorText(() => this._updateFromFocus())); + this._register(this._editor.onDidBlurEditorText(() => this._updateFromFocus())); + this._register(this._editor.onDidChangeModel(() => this._updateFromModel())); + this._register(this._editor.onDidChangeConfiguration(() => this._updateFromModel())); + this._register(TabFocus.onDidChangeTabFocus((tabFocusMode) => this._tabMovesFocus.set(tabFocusMode))); + this._updateFromConfig(); + this._updateFromSelection(); + this._updateFromFocus(); + this._updateFromModel(); + this._editorSimpleInput.set(this._editor.isSimpleWidget); + } + _updateFromConfig() { + const options2 = this._editor.getOptions(); + this._tabMovesFocus.set(TabFocus.getTabFocusMode()); + this._editorReadonly.set(options2.get( + 91 + /* EditorOption.readOnly */ + )); + this._inDiffEditor.set(options2.get( + 61 + /* EditorOption.inDiffEditor */ + )); + this._editorColumnSelection.set(options2.get( + 22 + /* EditorOption.columnSelection */ + )); + } + _updateFromSelection() { + const selections = this._editor.getSelections(); + if (!selections) { + this._hasMultipleSelections.reset(); + this._hasNonEmptySelection.reset(); + } else { + this._hasMultipleSelections.set(selections.length > 1); + this._hasNonEmptySelection.set(selections.some((s) => !s.isEmpty())); + } + } + _updateFromFocus() { + this._editorFocus.set(this._editor.hasWidgetFocus() && !this._editor.isSimpleWidget); + this._editorTextFocus.set(this._editor.hasTextFocus() && !this._editor.isSimpleWidget); + this._textInputFocus.set(this._editor.hasTextFocus()); + } + _updateFromModel() { + const model = this._editor.getModel(); + this._canUndo.set(Boolean(model && model.canUndo())); + this._canRedo.set(Boolean(model && model.canRedo())); + } + }; + EditorModeContext = class extends Disposable { + constructor(_editor, _contextKeyService, _languageFeaturesService) { + super(); + this._editor = _editor; + this._contextKeyService = _contextKeyService; + this._languageFeaturesService = _languageFeaturesService; + this._langId = EditorContextKeys.languageId.bindTo(_contextKeyService); + this._hasCompletionItemProvider = EditorContextKeys.hasCompletionItemProvider.bindTo(_contextKeyService); + this._hasCodeActionsProvider = EditorContextKeys.hasCodeActionsProvider.bindTo(_contextKeyService); + this._hasCodeLensProvider = EditorContextKeys.hasCodeLensProvider.bindTo(_contextKeyService); + this._hasDefinitionProvider = EditorContextKeys.hasDefinitionProvider.bindTo(_contextKeyService); + this._hasDeclarationProvider = EditorContextKeys.hasDeclarationProvider.bindTo(_contextKeyService); + this._hasImplementationProvider = EditorContextKeys.hasImplementationProvider.bindTo(_contextKeyService); + this._hasTypeDefinitionProvider = EditorContextKeys.hasTypeDefinitionProvider.bindTo(_contextKeyService); + this._hasHoverProvider = EditorContextKeys.hasHoverProvider.bindTo(_contextKeyService); + this._hasDocumentHighlightProvider = EditorContextKeys.hasDocumentHighlightProvider.bindTo(_contextKeyService); + this._hasDocumentSymbolProvider = EditorContextKeys.hasDocumentSymbolProvider.bindTo(_contextKeyService); + this._hasReferenceProvider = EditorContextKeys.hasReferenceProvider.bindTo(_contextKeyService); + this._hasRenameProvider = EditorContextKeys.hasRenameProvider.bindTo(_contextKeyService); + this._hasSignatureHelpProvider = EditorContextKeys.hasSignatureHelpProvider.bindTo(_contextKeyService); + this._hasInlayHintsProvider = EditorContextKeys.hasInlayHintsProvider.bindTo(_contextKeyService); + this._hasDocumentFormattingProvider = EditorContextKeys.hasDocumentFormattingProvider.bindTo(_contextKeyService); + this._hasDocumentSelectionFormattingProvider = EditorContextKeys.hasDocumentSelectionFormattingProvider.bindTo(_contextKeyService); + this._hasMultipleDocumentFormattingProvider = EditorContextKeys.hasMultipleDocumentFormattingProvider.bindTo(_contextKeyService); + this._hasMultipleDocumentSelectionFormattingProvider = EditorContextKeys.hasMultipleDocumentSelectionFormattingProvider.bindTo(_contextKeyService); + this._isInEmbeddedEditor = EditorContextKeys.isInEmbeddedEditor.bindTo(_contextKeyService); + const update = () => this._update(); + this._register(_editor.onDidChangeModel(update)); + this._register(_editor.onDidChangeModelLanguage(update)); + this._register(_languageFeaturesService.completionProvider.onDidChange(update)); + this._register(_languageFeaturesService.codeActionProvider.onDidChange(update)); + this._register(_languageFeaturesService.codeLensProvider.onDidChange(update)); + this._register(_languageFeaturesService.definitionProvider.onDidChange(update)); + this._register(_languageFeaturesService.declarationProvider.onDidChange(update)); + this._register(_languageFeaturesService.implementationProvider.onDidChange(update)); + this._register(_languageFeaturesService.typeDefinitionProvider.onDidChange(update)); + this._register(_languageFeaturesService.hoverProvider.onDidChange(update)); + this._register(_languageFeaturesService.documentHighlightProvider.onDidChange(update)); + this._register(_languageFeaturesService.documentSymbolProvider.onDidChange(update)); + this._register(_languageFeaturesService.referenceProvider.onDidChange(update)); + this._register(_languageFeaturesService.renameProvider.onDidChange(update)); + this._register(_languageFeaturesService.documentFormattingEditProvider.onDidChange(update)); + this._register(_languageFeaturesService.documentRangeFormattingEditProvider.onDidChange(update)); + this._register(_languageFeaturesService.signatureHelpProvider.onDidChange(update)); + this._register(_languageFeaturesService.inlayHintsProvider.onDidChange(update)); + update(); + } + dispose() { + super.dispose(); + } + reset() { + this._contextKeyService.bufferChangeEvents(() => { + this._langId.reset(); + this._hasCompletionItemProvider.reset(); + this._hasCodeActionsProvider.reset(); + this._hasCodeLensProvider.reset(); + this._hasDefinitionProvider.reset(); + this._hasDeclarationProvider.reset(); + this._hasImplementationProvider.reset(); + this._hasTypeDefinitionProvider.reset(); + this._hasHoverProvider.reset(); + this._hasDocumentHighlightProvider.reset(); + this._hasDocumentSymbolProvider.reset(); + this._hasReferenceProvider.reset(); + this._hasRenameProvider.reset(); + this._hasDocumentFormattingProvider.reset(); + this._hasDocumentSelectionFormattingProvider.reset(); + this._hasSignatureHelpProvider.reset(); + this._isInEmbeddedEditor.reset(); + }); + } + _update() { + const model = this._editor.getModel(); + if (!model) { + this.reset(); + return; + } + this._contextKeyService.bufferChangeEvents(() => { + this._langId.set(model.getLanguageId()); + this._hasCompletionItemProvider.set(this._languageFeaturesService.completionProvider.has(model)); + this._hasCodeActionsProvider.set(this._languageFeaturesService.codeActionProvider.has(model)); + this._hasCodeLensProvider.set(this._languageFeaturesService.codeLensProvider.has(model)); + this._hasDefinitionProvider.set(this._languageFeaturesService.definitionProvider.has(model)); + this._hasDeclarationProvider.set(this._languageFeaturesService.declarationProvider.has(model)); + this._hasImplementationProvider.set(this._languageFeaturesService.implementationProvider.has(model)); + this._hasTypeDefinitionProvider.set(this._languageFeaturesService.typeDefinitionProvider.has(model)); + this._hasHoverProvider.set(this._languageFeaturesService.hoverProvider.has(model)); + this._hasDocumentHighlightProvider.set(this._languageFeaturesService.documentHighlightProvider.has(model)); + this._hasDocumentSymbolProvider.set(this._languageFeaturesService.documentSymbolProvider.has(model)); + this._hasReferenceProvider.set(this._languageFeaturesService.referenceProvider.has(model)); + this._hasRenameProvider.set(this._languageFeaturesService.renameProvider.has(model)); + this._hasSignatureHelpProvider.set(this._languageFeaturesService.signatureHelpProvider.has(model)); + this._hasInlayHintsProvider.set(this._languageFeaturesService.inlayHintsProvider.has(model)); + this._hasDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.has(model) || this._languageFeaturesService.documentRangeFormattingEditProvider.has(model)); + this._hasDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.has(model)); + this._hasMultipleDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.all(model).length + this._languageFeaturesService.documentRangeFormattingEditProvider.all(model).length > 1); + this._hasMultipleDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.all(model).length > 1); + this._isInEmbeddedEditor.set(model.uri.scheme === Schemas.walkThroughSnippet || model.uri.scheme === Schemas.vscodeChatCodeBlock); + }); + } + }; + CodeEditorWidgetFocusTracker = class extends Disposable { + constructor(domElement, overflowWidgetsDomNode) { + super(); + this._onChange = this._register(new Emitter()); + this.onChange = this._onChange.event; + this._hadFocus = void 0; + this._hasDomElementFocus = false; + this._domFocusTracker = this._register(trackFocus(domElement)); + this._overflowWidgetsDomNodeHasFocus = false; + this._register(this._domFocusTracker.onDidFocus(() => { + this._hasDomElementFocus = true; + this._update(); + })); + this._register(this._domFocusTracker.onDidBlur(() => { + this._hasDomElementFocus = false; + this._update(); + })); + if (overflowWidgetsDomNode) { + this._overflowWidgetsDomNode = this._register(trackFocus(overflowWidgetsDomNode)); + this._register(this._overflowWidgetsDomNode.onDidFocus(() => { + this._overflowWidgetsDomNodeHasFocus = true; + this._update(); + })); + this._register(this._overflowWidgetsDomNode.onDidBlur(() => { + this._overflowWidgetsDomNodeHasFocus = false; + this._update(); + })); + } + } + _update() { + const focused = this._hasDomElementFocus || this._overflowWidgetsDomNodeHasFocus; + if (this._hadFocus !== focused) { + this._hadFocus = focused; + this._onChange.fire(void 0); + } + } + hasFocus() { + var _a10; + return (_a10 = this._hadFocus) !== null && _a10 !== void 0 ? _a10 : false; + } + }; + EditorDecorationsCollection = class { + get length() { + return this._decorationIds.length; + } + constructor(_editor, decorations) { + this._editor = _editor; + this._decorationIds = []; + this._isChangingDecorations = false; + if (Array.isArray(decorations) && decorations.length > 0) { + this.set(decorations); + } + } + onDidChange(listener, thisArgs, disposables) { + return this._editor.onDidChangeModelDecorations((e) => { + if (this._isChangingDecorations) { + return; + } + listener.call(thisArgs, e); + }, disposables); + } + getRange(index) { + if (!this._editor.hasModel()) { + return null; + } + if (index >= this._decorationIds.length) { + return null; + } + return this._editor.getModel().getDecorationRange(this._decorationIds[index]); + } + getRanges() { + if (!this._editor.hasModel()) { + return []; + } + const model = this._editor.getModel(); + const result = []; + for (const decorationId of this._decorationIds) { + const range2 = model.getDecorationRange(decorationId); + if (range2) { + result.push(range2); + } + } + return result; + } + has(decoration3) { + return this._decorationIds.includes(decoration3.id); + } + clear() { + if (this._decorationIds.length === 0) { + return; + } + this.set([]); + } + set(newDecorations) { + try { + this._isChangingDecorations = true; + this._editor.changeDecorations((accessor) => { + this._decorationIds = accessor.deltaDecorations(this._decorationIds, newDecorations); + }); + } finally { + this._isChangingDecorations = false; + } + return this._decorationIds; + } + append(newDecorations) { + let newDecorationIds = []; + try { + this._isChangingDecorations = true; + this._editor.changeDecorations((accessor) => { + newDecorationIds = accessor.deltaDecorations([], newDecorations); + this._decorationIds = this._decorationIds.concat(newDecorationIds); + }); + } finally { + this._isChangingDecorations = false; + } + return newDecorationIds; + } + }; + squigglyStart = encodeURIComponent(``); + dotdotdotStart = encodeURIComponent(``); + registerThemingParticipant((theme, collector) => { + const errorForeground2 = theme.getColor(editorErrorForeground); + if (errorForeground2) { + collector.addRule(`.monaco-editor .${"squiggly-error"} { background: url("data:image/svg+xml,${getSquigglySVGData(errorForeground2)}") repeat-x bottom left; }`); + } + const warningForeground = theme.getColor(editorWarningForeground); + if (warningForeground) { + collector.addRule(`.monaco-editor .${"squiggly-warning"} { background: url("data:image/svg+xml,${getSquigglySVGData(warningForeground)}") repeat-x bottom left; }`); + } + const infoForeground = theme.getColor(editorInfoForeground); + if (infoForeground) { + collector.addRule(`.monaco-editor .${"squiggly-info"} { background: url("data:image/svg+xml,${getSquigglySVGData(infoForeground)}") repeat-x bottom left; }`); + } + const hintForeground = theme.getColor(editorHintForeground); + if (hintForeground) { + collector.addRule(`.monaco-editor .${"squiggly-hint"} { background: url("data:image/svg+xml,${getDotDotDotSVGData(hintForeground)}") no-repeat bottom left; }`); + } + const unnecessaryForeground = theme.getColor(editorUnnecessaryCodeOpacity); + if (unnecessaryForeground) { + collector.addRule(`.monaco-editor.showUnused .${"squiggly-inline-unnecessary"} { opacity: ${unnecessaryForeground.rgba.a}; }`); + } + }); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/services/abstractCodeEditorService.js +var __decorate14, __param13, AbstractCodeEditorService; +var init_abstractCodeEditorService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/services/abstractCodeEditorService.js"() { + init_event(); + init_lifecycle(); + init_linkedList(); + init_themeService(); + __decorate14 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param13 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + AbstractCodeEditorService = class AbstractCodeEditorService2 extends Disposable { + constructor(_themeService) { + super(); + this._themeService = _themeService; + this._onWillCreateCodeEditor = this._register(new Emitter()); + this._onCodeEditorAdd = this._register(new Emitter()); + this.onCodeEditorAdd = this._onCodeEditorAdd.event; + this._onCodeEditorRemove = this._register(new Emitter()); + this.onCodeEditorRemove = this._onCodeEditorRemove.event; + this._onWillCreateDiffEditor = this._register(new Emitter()); + this._onDiffEditorAdd = this._register(new Emitter()); + this.onDiffEditorAdd = this._onDiffEditorAdd.event; + this._onDiffEditorRemove = this._register(new Emitter()); + this.onDiffEditorRemove = this._onDiffEditorRemove.event; + this._decorationOptionProviders = /* @__PURE__ */ new Map(); + this._codeEditorOpenHandlers = new LinkedList(); + this._modelProperties = /* @__PURE__ */ new Map(); + this._codeEditors = /* @__PURE__ */ Object.create(null); + this._diffEditors = /* @__PURE__ */ Object.create(null); + this._globalStyleSheet = null; + } + willCreateCodeEditor() { + this._onWillCreateCodeEditor.fire(); + } + addCodeEditor(editor2) { + this._codeEditors[editor2.getId()] = editor2; + this._onCodeEditorAdd.fire(editor2); + } + removeCodeEditor(editor2) { + if (delete this._codeEditors[editor2.getId()]) { + this._onCodeEditorRemove.fire(editor2); + } + } + listCodeEditors() { + return Object.keys(this._codeEditors).map((id) => this._codeEditors[id]); + } + willCreateDiffEditor() { + this._onWillCreateDiffEditor.fire(); + } + addDiffEditor(editor2) { + this._diffEditors[editor2.getId()] = editor2; + this._onDiffEditorAdd.fire(editor2); + } + listDiffEditors() { + return Object.keys(this._diffEditors).map((id) => this._diffEditors[id]); + } + getFocusedCodeEditor() { + let editorWithWidgetFocus = null; + const editors = this.listCodeEditors(); + for (const editor2 of editors) { + if (editor2.hasTextFocus()) { + return editor2; + } + if (editor2.hasWidgetFocus()) { + editorWithWidgetFocus = editor2; + } + } + return editorWithWidgetFocus; + } + removeDecorationType(key) { + const provider = this._decorationOptionProviders.get(key); + if (provider) { + provider.refCount--; + if (provider.refCount <= 0) { + this._decorationOptionProviders.delete(key); + provider.dispose(); + this.listCodeEditors().forEach((ed) => ed.removeDecorationsByType(key)); + } + } + } + setModelProperty(resource, key, value) { + const key1 = resource.toString(); + let dest; + if (this._modelProperties.has(key1)) { + dest = this._modelProperties.get(key1); + } else { + dest = /* @__PURE__ */ new Map(); + this._modelProperties.set(key1, dest); + } + dest.set(key, value); + } + getModelProperty(resource, key) { + const key1 = resource.toString(); + if (this._modelProperties.has(key1)) { + const innerMap = this._modelProperties.get(key1); + return innerMap.get(key); + } + return void 0; + } + openCodeEditor(input, source, sideBySide) { + return __async(this, null, function* () { + for (const handler of this._codeEditorOpenHandlers) { + const candidate = yield handler(input, source, sideBySide); + if (candidate !== null) { + return candidate; + } + } + return null; + }); + } + registerCodeEditorOpenHandler(handler) { + const rm = this._codeEditorOpenHandlers.unshift(handler); + return toDisposable(rm); + } + }; + AbstractCodeEditorService = __decorate14([ + __param13(0, IThemeService) + ], AbstractCodeEditorService); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/browser/standaloneCodeEditorService.js +var __decorate15, __param14, StandaloneCodeEditorService; +var init_standaloneCodeEditorService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/browser/standaloneCodeEditorService.js"() { + init_dom(); + init_network(); + init_abstractCodeEditorService(); + init_codeEditorService(); + init_contextkey(); + init_extensions(); + init_themeService(); + __decorate15 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param14 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + StandaloneCodeEditorService = class StandaloneCodeEditorService2 extends AbstractCodeEditorService { + constructor(contextKeyService, themeService) { + super(themeService); + this._register(this.onCodeEditorAdd(() => this._checkContextKey())); + this._register(this.onCodeEditorRemove(() => this._checkContextKey())); + this._editorIsOpen = contextKeyService.createKey("editorIsOpen", false); + this._activeCodeEditor = null; + this._register(this.registerCodeEditorOpenHandler((input, source, sideBySide) => __async(this, null, function* () { + if (!source) { + return null; + } + return this.doOpenEditor(source, input); + }))); + } + _checkContextKey() { + let hasCodeEditor = false; + for (const editor2 of this.listCodeEditors()) { + if (!editor2.isSimpleWidget) { + hasCodeEditor = true; + break; + } + } + this._editorIsOpen.set(hasCodeEditor); + } + setActiveCodeEditor(activeCodeEditor) { + this._activeCodeEditor = activeCodeEditor; + } + getActiveCodeEditor() { + return this._activeCodeEditor; + } + doOpenEditor(editor2, input) { + const model = this.findModel(editor2, input.resource); + if (!model) { + if (input.resource) { + const schema = input.resource.scheme; + if (schema === Schemas.http || schema === Schemas.https) { + windowOpenNoOpener(input.resource.toString()); + return editor2; + } + } + return null; + } + const selection = input.options ? input.options.selection : null; + if (selection) { + if (typeof selection.endLineNumber === "number" && typeof selection.endColumn === "number") { + editor2.setSelection(selection); + editor2.revealRangeInCenter( + selection, + 1 + /* ScrollType.Immediate */ + ); + } else { + const pos = { + lineNumber: selection.startLineNumber, + column: selection.startColumn + }; + editor2.setPosition(pos); + editor2.revealPositionInCenter( + pos, + 1 + /* ScrollType.Immediate */ + ); + } + } + return editor2; + } + findModel(editor2, resource) { + const model = editor2.getModel(); + if (model && model.uri.toString() !== resource.toString()) { + return null; + } + return model; + } + }; + StandaloneCodeEditorService = __decorate15([ + __param14(0, IContextKeyService), + __param14(1, IThemeService) + ], StandaloneCodeEditorService); + registerSingleton( + ICodeEditorService, + StandaloneCodeEditorService, + 0 + /* InstantiationType.Eager */ + ); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/layout/browser/layoutService.js +var ILayoutService; +var init_layoutService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/layout/browser/layoutService.js"() { + init_instantiation(); + ILayoutService = createDecorator("layoutService"); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/browser/standaloneLayoutService.js +var __decorate16, __param15, StandaloneLayoutService, EditorScopedLayoutService; +var init_standaloneLayoutService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/browser/standaloneLayoutService.js"() { + init_dom(); + init_window(); + init_arrays(); + init_event(); + init_codeEditorService(); + init_extensions(); + init_layoutService(); + __decorate16 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param15 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + StandaloneLayoutService = class StandaloneLayoutService2 { + get mainContainer() { + var _a10, _b4; + return (_b4 = (_a10 = firstOrDefault(this._codeEditorService.listCodeEditors())) === null || _a10 === void 0 ? void 0 : _a10.getContainerDomNode()) !== null && _b4 !== void 0 ? _b4 : mainWindow.document.body; + } + get activeContainer() { + var _a10, _b4; + const activeCodeEditor = (_a10 = this._codeEditorService.getFocusedCodeEditor()) !== null && _a10 !== void 0 ? _a10 : this._codeEditorService.getActiveCodeEditor(); + return (_b4 = activeCodeEditor === null || activeCodeEditor === void 0 ? void 0 : activeCodeEditor.getContainerDomNode()) !== null && _b4 !== void 0 ? _b4 : this.mainContainer; + } + get mainContainerDimension() { + return getClientArea(this.mainContainer); + } + get activeContainerDimension() { + return getClientArea(this.activeContainer); + } + get containers() { + return coalesce(this._codeEditorService.listCodeEditors().map((codeEditor) => codeEditor.getContainerDomNode())); + } + getContainer() { + return this.activeContainer; + } + whenContainerStylesLoaded() { + return void 0; + } + focus() { + var _a10; + (_a10 = this._codeEditorService.getFocusedCodeEditor()) === null || _a10 === void 0 ? void 0 : _a10.focus(); + } + constructor(_codeEditorService) { + this._codeEditorService = _codeEditorService; + this.onDidLayoutMainContainer = Event.None; + this.onDidLayoutActiveContainer = Event.None; + this.onDidLayoutContainer = Event.None; + this.onDidChangeActiveContainer = Event.None; + this.onDidAddContainer = Event.None; + this.mainContainerOffset = { top: 0, quickPickTop: 0 }; + this.activeContainerOffset = { top: 0, quickPickTop: 0 }; + } + }; + StandaloneLayoutService = __decorate16([ + __param15(0, ICodeEditorService) + ], StandaloneLayoutService); + EditorScopedLayoutService = class EditorScopedLayoutService2 extends StandaloneLayoutService { + get mainContainer() { + return this._container; + } + constructor(_container, codeEditorService) { + super(codeEditorService); + this._container = _container; + } + }; + EditorScopedLayoutService = __decorate16([ + __param15(1, ICodeEditorService) + ], EditorScopedLayoutService); + registerSingleton( + ILayoutService, + StandaloneLayoutService, + 1 + /* InstantiationType.Delayed */ + ); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/dialogs/common/dialogs.js +var IDialogService; +var init_dialogs = __esm({ + "node_modules/monaco-editor/esm/vs/platform/dialogs/common/dialogs.js"() { + init_instantiation(); + IDialogService = createDecorator("dialogService"); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/undoRedo/common/undoRedoService.js +function getResourceLabel(resource) { + return resource.scheme === Schemas.file ? resource.fsPath : resource.path; +} +var __decorate17, __param16, DEBUG, stackElementCounter, ResourceStackElement, ResourceReasonPair, RemovedResources, WorkspaceStackElement, ResourceEditStack, EditStackSnapshot, missingEditStack, UndoRedoService, WorkspaceVerificationError; +var init_undoRedoService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/undoRedo/common/undoRedoService.js"() { + init_errors(); + init_lifecycle(); + init_network(); + init_severity(); + init_nls(); + init_dialogs(); + init_extensions(); + init_notification(); + init_undoRedo(); + __decorate17 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param16 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + DEBUG = false; + stackElementCounter = 0; + ResourceStackElement = class { + constructor(actual, resourceLabel, strResource, groupId, groupOrder, sourceId, sourceOrder) { + this.id = ++stackElementCounter; + this.type = 0; + this.actual = actual; + this.label = actual.label; + this.confirmBeforeUndo = actual.confirmBeforeUndo || false; + this.resourceLabel = resourceLabel; + this.strResource = strResource; + this.resourceLabels = [this.resourceLabel]; + this.strResources = [this.strResource]; + this.groupId = groupId; + this.groupOrder = groupOrder; + this.sourceId = sourceId; + this.sourceOrder = sourceOrder; + this.isValid = true; + } + setValid(isValid2) { + this.isValid = isValid2; + } + toString() { + return `[id:${this.id}] [group:${this.groupId}] [${this.isValid ? " VALID" : "INVALID"}] ${this.actual.constructor.name} - ${this.actual}`; + } + }; + ResourceReasonPair = class { + constructor(resourceLabel, reason) { + this.resourceLabel = resourceLabel; + this.reason = reason; + } + }; + RemovedResources = class { + constructor() { + this.elements = /* @__PURE__ */ new Map(); + } + createMessage() { + const externalRemoval = []; + const noParallelUniverses = []; + for (const [, element] of this.elements) { + const dest = element.reason === 0 ? externalRemoval : noParallelUniverses; + dest.push(element.resourceLabel); + } + const messages = []; + if (externalRemoval.length > 0) { + messages.push(localize({ key: "externalRemoval", comment: ["{0} is a list of filenames"] }, "The following files have been closed and modified on disk: {0}.", externalRemoval.join(", "))); + } + if (noParallelUniverses.length > 0) { + messages.push(localize({ key: "noParallelUniverses", comment: ["{0} is a list of filenames"] }, "The following files have been modified in an incompatible way: {0}.", noParallelUniverses.join(", "))); + } + return messages.join("\n"); + } + get size() { + return this.elements.size; + } + has(strResource) { + return this.elements.has(strResource); + } + set(strResource, value) { + this.elements.set(strResource, value); + } + delete(strResource) { + return this.elements.delete(strResource); + } + }; + WorkspaceStackElement = class { + constructor(actual, resourceLabels, strResources, groupId, groupOrder, sourceId, sourceOrder) { + this.id = ++stackElementCounter; + this.type = 1; + this.actual = actual; + this.label = actual.label; + this.confirmBeforeUndo = actual.confirmBeforeUndo || false; + this.resourceLabels = resourceLabels; + this.strResources = strResources; + this.groupId = groupId; + this.groupOrder = groupOrder; + this.sourceId = sourceId; + this.sourceOrder = sourceOrder; + this.removedResources = null; + this.invalidatedResources = null; + } + canSplit() { + return typeof this.actual.split === "function"; + } + removeResource(resourceLabel, strResource, reason) { + if (!this.removedResources) { + this.removedResources = new RemovedResources(); + } + if (!this.removedResources.has(strResource)) { + this.removedResources.set(strResource, new ResourceReasonPair(resourceLabel, reason)); + } + } + setValid(resourceLabel, strResource, isValid2) { + if (isValid2) { + if (this.invalidatedResources) { + this.invalidatedResources.delete(strResource); + if (this.invalidatedResources.size === 0) { + this.invalidatedResources = null; + } + } + } else { + if (!this.invalidatedResources) { + this.invalidatedResources = new RemovedResources(); + } + if (!this.invalidatedResources.has(strResource)) { + this.invalidatedResources.set(strResource, new ResourceReasonPair( + resourceLabel, + 0 + /* RemovedResourceReason.ExternalRemoval */ + )); + } + } + } + toString() { + return `[id:${this.id}] [group:${this.groupId}] [${this.invalidatedResources ? "INVALID" : " VALID"}] ${this.actual.constructor.name} - ${this.actual}`; + } + }; + ResourceEditStack = class { + constructor(resourceLabel, strResource) { + this.resourceLabel = resourceLabel; + this.strResource = strResource; + this._past = []; + this._future = []; + this.locked = false; + this.versionId = 1; + } + dispose() { + for (const element of this._past) { + if (element.type === 1) { + element.removeResource( + this.resourceLabel, + this.strResource, + 0 + /* RemovedResourceReason.ExternalRemoval */ + ); + } + } + for (const element of this._future) { + if (element.type === 1) { + element.removeResource( + this.resourceLabel, + this.strResource, + 0 + /* RemovedResourceReason.ExternalRemoval */ + ); + } + } + this.versionId++; + } + toString() { + const result = []; + result.push(`* ${this.strResource}:`); + for (let i = 0; i < this._past.length; i++) { + result.push(` * [UNDO] ${this._past[i]}`); + } + for (let i = this._future.length - 1; i >= 0; i--) { + result.push(` * [REDO] ${this._future[i]}`); + } + return result.join("\n"); + } + flushAllElements() { + this._past = []; + this._future = []; + this.versionId++; + } + _setElementValidFlag(element, isValid2) { + if (element.type === 1) { + element.setValid(this.resourceLabel, this.strResource, isValid2); + } else { + element.setValid(isValid2); + } + } + setElementsValidFlag(isValid2, filter) { + for (const element of this._past) { + if (filter(element.actual)) { + this._setElementValidFlag(element, isValid2); + } + } + for (const element of this._future) { + if (filter(element.actual)) { + this._setElementValidFlag(element, isValid2); + } + } + } + pushElement(element) { + for (const futureElement of this._future) { + if (futureElement.type === 1) { + futureElement.removeResource( + this.resourceLabel, + this.strResource, + 1 + /* RemovedResourceReason.NoParallelUniverses */ + ); + } + } + this._future = []; + this._past.push(element); + this.versionId++; + } + createSnapshot(resource) { + const elements = []; + for (let i = 0, len = this._past.length; i < len; i++) { + elements.push(this._past[i].id); + } + for (let i = this._future.length - 1; i >= 0; i--) { + elements.push(this._future[i].id); + } + return new ResourceEditStackSnapshot(resource, elements); + } + restoreSnapshot(snapshot) { + const snapshotLength = snapshot.elements.length; + let isOK = true; + let snapshotIndex = 0; + let removePastAfter = -1; + for (let i = 0, len = this._past.length; i < len; i++, snapshotIndex++) { + const element = this._past[i]; + if (isOK && (snapshotIndex >= snapshotLength || element.id !== snapshot.elements[snapshotIndex])) { + isOK = false; + removePastAfter = 0; + } + if (!isOK && element.type === 1) { + element.removeResource( + this.resourceLabel, + this.strResource, + 0 + /* RemovedResourceReason.ExternalRemoval */ + ); + } + } + let removeFutureBefore = -1; + for (let i = this._future.length - 1; i >= 0; i--, snapshotIndex++) { + const element = this._future[i]; + if (isOK && (snapshotIndex >= snapshotLength || element.id !== snapshot.elements[snapshotIndex])) { + isOK = false; + removeFutureBefore = i; + } + if (!isOK && element.type === 1) { + element.removeResource( + this.resourceLabel, + this.strResource, + 0 + /* RemovedResourceReason.ExternalRemoval */ + ); + } + } + if (removePastAfter !== -1) { + this._past = this._past.slice(0, removePastAfter); + } + if (removeFutureBefore !== -1) { + this._future = this._future.slice(removeFutureBefore + 1); + } + this.versionId++; + } + getElements() { + const past = []; + const future = []; + for (const element of this._past) { + past.push(element.actual); + } + for (const element of this._future) { + future.push(element.actual); + } + return { past, future }; + } + getClosestPastElement() { + if (this._past.length === 0) { + return null; + } + return this._past[this._past.length - 1]; + } + getSecondClosestPastElement() { + if (this._past.length < 2) { + return null; + } + return this._past[this._past.length - 2]; + } + getClosestFutureElement() { + if (this._future.length === 0) { + return null; + } + return this._future[this._future.length - 1]; + } + hasPastElements() { + return this._past.length > 0; + } + hasFutureElements() { + return this._future.length > 0; + } + splitPastWorkspaceElement(toRemove, individualMap) { + for (let j = this._past.length - 1; j >= 0; j--) { + if (this._past[j] === toRemove) { + if (individualMap.has(this.strResource)) { + this._past[j] = individualMap.get(this.strResource); + } else { + this._past.splice(j, 1); + } + break; + } + } + this.versionId++; + } + splitFutureWorkspaceElement(toRemove, individualMap) { + for (let j = this._future.length - 1; j >= 0; j--) { + if (this._future[j] === toRemove) { + if (individualMap.has(this.strResource)) { + this._future[j] = individualMap.get(this.strResource); + } else { + this._future.splice(j, 1); + } + break; + } + } + this.versionId++; + } + moveBackward(element) { + this._past.pop(); + this._future.push(element); + this.versionId++; + } + moveForward(element) { + this._future.pop(); + this._past.push(element); + this.versionId++; + } + }; + EditStackSnapshot = class { + constructor(editStacks) { + this.editStacks = editStacks; + this._versionIds = []; + for (let i = 0, len = this.editStacks.length; i < len; i++) { + this._versionIds[i] = this.editStacks[i].versionId; + } + } + isValid() { + for (let i = 0, len = this.editStacks.length; i < len; i++) { + if (this._versionIds[i] !== this.editStacks[i].versionId) { + return false; + } + } + return true; + } + }; + missingEditStack = new ResourceEditStack("", ""); + missingEditStack.locked = true; + UndoRedoService = class UndoRedoService2 { + constructor(_dialogService, _notificationService) { + this._dialogService = _dialogService; + this._notificationService = _notificationService; + this._editStacks = /* @__PURE__ */ new Map(); + this._uriComparisonKeyComputers = []; + } + getUriComparisonKey(resource) { + for (const uriComparisonKeyComputer of this._uriComparisonKeyComputers) { + if (uriComparisonKeyComputer[0] === resource.scheme) { + return uriComparisonKeyComputer[1].getComparisonKey(resource); + } + } + return resource.toString(); + } + _print(label) { + console.log(`------------------------------------`); + console.log(`AFTER ${label}: `); + const str = []; + for (const element of this._editStacks) { + str.push(element[1].toString()); + } + console.log(str.join("\n")); + } + pushElement(element, group = UndoRedoGroup.None, source = UndoRedoSource.None) { + if (element.type === 0) { + const resourceLabel = getResourceLabel(element.resource); + const strResource = this.getUriComparisonKey(element.resource); + this._pushElement(new ResourceStackElement(element, resourceLabel, strResource, group.id, group.nextOrder(), source.id, source.nextOrder())); + } else { + const seen = /* @__PURE__ */ new Set(); + const resourceLabels = []; + const strResources = []; + for (const resource of element.resources) { + const resourceLabel = getResourceLabel(resource); + const strResource = this.getUriComparisonKey(resource); + if (seen.has(strResource)) { + continue; + } + seen.add(strResource); + resourceLabels.push(resourceLabel); + strResources.push(strResource); + } + if (resourceLabels.length === 1) { + this._pushElement(new ResourceStackElement(element, resourceLabels[0], strResources[0], group.id, group.nextOrder(), source.id, source.nextOrder())); + } else { + this._pushElement(new WorkspaceStackElement(element, resourceLabels, strResources, group.id, group.nextOrder(), source.id, source.nextOrder())); + } + } + if (DEBUG) { + this._print("pushElement"); + } + } + _pushElement(element) { + for (let i = 0, len = element.strResources.length; i < len; i++) { + const resourceLabel = element.resourceLabels[i]; + const strResource = element.strResources[i]; + let editStack; + if (this._editStacks.has(strResource)) { + editStack = this._editStacks.get(strResource); + } else { + editStack = new ResourceEditStack(resourceLabel, strResource); + this._editStacks.set(strResource, editStack); + } + editStack.pushElement(element); + } + } + getLastElement(resource) { + const strResource = this.getUriComparisonKey(resource); + if (this._editStacks.has(strResource)) { + const editStack = this._editStacks.get(strResource); + if (editStack.hasFutureElements()) { + return null; + } + const closestPastElement = editStack.getClosestPastElement(); + return closestPastElement ? closestPastElement.actual : null; + } + return null; + } + _splitPastWorkspaceElement(toRemove, ignoreResources) { + const individualArr = toRemove.actual.split(); + const individualMap = /* @__PURE__ */ new Map(); + for (const _element of individualArr) { + const resourceLabel = getResourceLabel(_element.resource); + const strResource = this.getUriComparisonKey(_element.resource); + const element = new ResourceStackElement(_element, resourceLabel, strResource, 0, 0, 0, 0); + individualMap.set(element.strResource, element); + } + for (const strResource of toRemove.strResources) { + if (ignoreResources && ignoreResources.has(strResource)) { + continue; + } + const editStack = this._editStacks.get(strResource); + editStack.splitPastWorkspaceElement(toRemove, individualMap); + } + } + _splitFutureWorkspaceElement(toRemove, ignoreResources) { + const individualArr = toRemove.actual.split(); + const individualMap = /* @__PURE__ */ new Map(); + for (const _element of individualArr) { + const resourceLabel = getResourceLabel(_element.resource); + const strResource = this.getUriComparisonKey(_element.resource); + const element = new ResourceStackElement(_element, resourceLabel, strResource, 0, 0, 0, 0); + individualMap.set(element.strResource, element); + } + for (const strResource of toRemove.strResources) { + if (ignoreResources && ignoreResources.has(strResource)) { + continue; + } + const editStack = this._editStacks.get(strResource); + editStack.splitFutureWorkspaceElement(toRemove, individualMap); + } + } + removeElements(resource) { + const strResource = typeof resource === "string" ? resource : this.getUriComparisonKey(resource); + if (this._editStacks.has(strResource)) { + const editStack = this._editStacks.get(strResource); + editStack.dispose(); + this._editStacks.delete(strResource); + } + if (DEBUG) { + this._print("removeElements"); + } + } + setElementsValidFlag(resource, isValid2, filter) { + const strResource = this.getUriComparisonKey(resource); + if (this._editStacks.has(strResource)) { + const editStack = this._editStacks.get(strResource); + editStack.setElementsValidFlag(isValid2, filter); + } + if (DEBUG) { + this._print("setElementsValidFlag"); + } + } + createSnapshot(resource) { + const strResource = this.getUriComparisonKey(resource); + if (this._editStacks.has(strResource)) { + const editStack = this._editStacks.get(strResource); + return editStack.createSnapshot(resource); + } + return new ResourceEditStackSnapshot(resource, []); + } + restoreSnapshot(snapshot) { + const strResource = this.getUriComparisonKey(snapshot.resource); + if (this._editStacks.has(strResource)) { + const editStack = this._editStacks.get(strResource); + editStack.restoreSnapshot(snapshot); + if (!editStack.hasPastElements() && !editStack.hasFutureElements()) { + editStack.dispose(); + this._editStacks.delete(strResource); + } + } + if (DEBUG) { + this._print("restoreSnapshot"); + } + } + getElements(resource) { + const strResource = this.getUriComparisonKey(resource); + if (this._editStacks.has(strResource)) { + const editStack = this._editStacks.get(strResource); + return editStack.getElements(); + } + return { past: [], future: [] }; + } + _findClosestUndoElementWithSource(sourceId) { + if (!sourceId) { + return [null, null]; + } + let matchedElement = null; + let matchedStrResource = null; + for (const [strResource, editStack] of this._editStacks) { + const candidate = editStack.getClosestPastElement(); + if (!candidate) { + continue; + } + if (candidate.sourceId === sourceId) { + if (!matchedElement || candidate.sourceOrder > matchedElement.sourceOrder) { + matchedElement = candidate; + matchedStrResource = strResource; + } + } + } + return [matchedElement, matchedStrResource]; + } + canUndo(resourceOrSource) { + if (resourceOrSource instanceof UndoRedoSource) { + const [, matchedStrResource] = this._findClosestUndoElementWithSource(resourceOrSource.id); + return matchedStrResource ? true : false; + } + const strResource = this.getUriComparisonKey(resourceOrSource); + if (this._editStacks.has(strResource)) { + const editStack = this._editStacks.get(strResource); + return editStack.hasPastElements(); + } + return false; + } + _onError(err, element) { + onUnexpectedError(err); + for (const strResource of element.strResources) { + this.removeElements(strResource); + } + this._notificationService.error(err); + } + _acquireLocks(editStackSnapshot) { + for (const editStack of editStackSnapshot.editStacks) { + if (editStack.locked) { + throw new Error("Cannot acquire edit stack lock"); + } + } + for (const editStack of editStackSnapshot.editStacks) { + editStack.locked = true; + } + return () => { + for (const editStack of editStackSnapshot.editStacks) { + editStack.locked = false; + } + }; + } + _safeInvokeWithLocks(element, invoke, editStackSnapshot, cleanup, continuation) { + const releaseLocks = this._acquireLocks(editStackSnapshot); + let result; + try { + result = invoke(); + } catch (err) { + releaseLocks(); + cleanup.dispose(); + return this._onError(err, element); + } + if (result) { + return result.then(() => { + releaseLocks(); + cleanup.dispose(); + return continuation(); + }, (err) => { + releaseLocks(); + cleanup.dispose(); + return this._onError(err, element); + }); + } else { + releaseLocks(); + cleanup.dispose(); + return continuation(); + } + } + _invokeWorkspacePrepare(element) { + return __async(this, null, function* () { + if (typeof element.actual.prepareUndoRedo === "undefined") { + return Disposable.None; + } + const result = element.actual.prepareUndoRedo(); + if (typeof result === "undefined") { + return Disposable.None; + } + return result; + }); + } + _invokeResourcePrepare(element, callback) { + if (element.actual.type !== 1 || typeof element.actual.prepareUndoRedo === "undefined") { + return callback(Disposable.None); + } + const r = element.actual.prepareUndoRedo(); + if (!r) { + return callback(Disposable.None); + } + if (isDisposable(r)) { + return callback(r); + } + return r.then((disposable) => { + return callback(disposable); + }); + } + _getAffectedEditStacks(element) { + const affectedEditStacks = []; + for (const strResource of element.strResources) { + affectedEditStacks.push(this._editStacks.get(strResource) || missingEditStack); + } + return new EditStackSnapshot(affectedEditStacks); + } + _tryToSplitAndUndo(strResource, element, ignoreResources, message) { + if (element.canSplit()) { + this._splitPastWorkspaceElement(element, ignoreResources); + this._notificationService.warn(message); + return new WorkspaceVerificationError(this._undo(strResource, 0, true)); + } else { + for (const strResource2 of element.strResources) { + this.removeElements(strResource2); + } + this._notificationService.warn(message); + return new WorkspaceVerificationError(); + } + } + _checkWorkspaceUndo(strResource, element, editStackSnapshot, checkInvalidatedResources) { + if (element.removedResources) { + return this._tryToSplitAndUndo(strResource, element, element.removedResources, localize({ key: "cannotWorkspaceUndo", comment: ["{0} is a label for an operation. {1} is another message."] }, "Could not undo '{0}' across all files. {1}", element.label, element.removedResources.createMessage())); + } + if (checkInvalidatedResources && element.invalidatedResources) { + return this._tryToSplitAndUndo(strResource, element, element.invalidatedResources, localize({ key: "cannotWorkspaceUndo", comment: ["{0} is a label for an operation. {1} is another message."] }, "Could not undo '{0}' across all files. {1}", element.label, element.invalidatedResources.createMessage())); + } + const cannotUndoDueToResources = []; + for (const editStack of editStackSnapshot.editStacks) { + if (editStack.getClosestPastElement() !== element) { + cannotUndoDueToResources.push(editStack.resourceLabel); + } + } + if (cannotUndoDueToResources.length > 0) { + return this._tryToSplitAndUndo(strResource, element, null, localize({ key: "cannotWorkspaceUndoDueToChanges", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not undo '{0}' across all files because changes were made to {1}", element.label, cannotUndoDueToResources.join(", "))); + } + const cannotLockDueToResources = []; + for (const editStack of editStackSnapshot.editStacks) { + if (editStack.locked) { + cannotLockDueToResources.push(editStack.resourceLabel); + } + } + if (cannotLockDueToResources.length > 0) { + return this._tryToSplitAndUndo(strResource, element, null, localize({ key: "cannotWorkspaceUndoDueToInProgressUndoRedo", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not undo '{0}' across all files because there is already an undo or redo operation running on {1}", element.label, cannotLockDueToResources.join(", "))); + } + if (!editStackSnapshot.isValid()) { + return this._tryToSplitAndUndo(strResource, element, null, localize({ key: "cannotWorkspaceUndoDueToInMeantimeUndoRedo", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not undo '{0}' across all files because an undo or redo operation occurred in the meantime", element.label)); + } + return null; + } + _workspaceUndo(strResource, element, undoConfirmed) { + const affectedEditStacks = this._getAffectedEditStacks(element); + const verificationError = this._checkWorkspaceUndo( + strResource, + element, + affectedEditStacks, + /*invalidated resources will be checked after the prepare call*/ + false + ); + if (verificationError) { + return verificationError.returnValue; + } + return this._confirmAndExecuteWorkspaceUndo(strResource, element, affectedEditStacks, undoConfirmed); + } + _isPartOfUndoGroup(element) { + if (!element.groupId) { + return false; + } + for (const [, editStack] of this._editStacks) { + const pastElement = editStack.getClosestPastElement(); + if (!pastElement) { + continue; + } + if (pastElement === element) { + const secondPastElement = editStack.getSecondClosestPastElement(); + if (secondPastElement && secondPastElement.groupId === element.groupId) { + return true; + } + } + if (pastElement.groupId === element.groupId) { + return true; + } + } + return false; + } + _confirmAndExecuteWorkspaceUndo(strResource, element, editStackSnapshot, undoConfirmed) { + return __async(this, null, function* () { + if (element.canSplit() && !this._isPartOfUndoGroup(element)) { + let UndoChoice; + (function(UndoChoice2) { + UndoChoice2[UndoChoice2["All"] = 0] = "All"; + UndoChoice2[UndoChoice2["This"] = 1] = "This"; + UndoChoice2[UndoChoice2["Cancel"] = 2] = "Cancel"; + })(UndoChoice || (UndoChoice = {})); + const { result } = yield this._dialogService.prompt({ + type: severity_default.Info, + message: localize("confirmWorkspace", "Would you like to undo '{0}' across all files?", element.label), + buttons: [ + { + label: localize({ key: "ok", comment: ["{0} denotes a number that is > 1, && denotes a mnemonic"] }, "&&Undo in {0} Files", editStackSnapshot.editStacks.length), + run: () => UndoChoice.All + }, + { + label: localize({ key: "nok", comment: ["&& denotes a mnemonic"] }, "Undo this &&File"), + run: () => UndoChoice.This + } + ], + cancelButton: { + run: () => UndoChoice.Cancel + } + }); + if (result === UndoChoice.Cancel) { + return; + } + if (result === UndoChoice.This) { + this._splitPastWorkspaceElement(element, null); + return this._undo(strResource, 0, true); + } + const verificationError1 = this._checkWorkspaceUndo( + strResource, + element, + editStackSnapshot, + /*invalidated resources will be checked after the prepare call*/ + false + ); + if (verificationError1) { + return verificationError1.returnValue; + } + undoConfirmed = true; + } + let cleanup; + try { + cleanup = yield this._invokeWorkspacePrepare(element); + } catch (err) { + return this._onError(err, element); + } + const verificationError2 = this._checkWorkspaceUndo( + strResource, + element, + editStackSnapshot, + /*now also check that there are no more invalidated resources*/ + true + ); + if (verificationError2) { + cleanup.dispose(); + return verificationError2.returnValue; + } + for (const editStack of editStackSnapshot.editStacks) { + editStack.moveBackward(element); + } + return this._safeInvokeWithLocks(element, () => element.actual.undo(), editStackSnapshot, cleanup, () => this._continueUndoInGroup(element.groupId, undoConfirmed)); + }); + } + _resourceUndo(editStack, element, undoConfirmed) { + if (!element.isValid) { + editStack.flushAllElements(); + return; + } + if (editStack.locked) { + const message = localize({ key: "cannotResourceUndoDueToInProgressUndoRedo", comment: ["{0} is a label for an operation."] }, "Could not undo '{0}' because there is already an undo or redo operation running.", element.label); + this._notificationService.warn(message); + return; + } + return this._invokeResourcePrepare(element, (cleanup) => { + editStack.moveBackward(element); + return this._safeInvokeWithLocks(element, () => element.actual.undo(), new EditStackSnapshot([editStack]), cleanup, () => this._continueUndoInGroup(element.groupId, undoConfirmed)); + }); + } + _findClosestUndoElementInGroup(groupId) { + if (!groupId) { + return [null, null]; + } + let matchedElement = null; + let matchedStrResource = null; + for (const [strResource, editStack] of this._editStacks) { + const candidate = editStack.getClosestPastElement(); + if (!candidate) { + continue; + } + if (candidate.groupId === groupId) { + if (!matchedElement || candidate.groupOrder > matchedElement.groupOrder) { + matchedElement = candidate; + matchedStrResource = strResource; + } + } + } + return [matchedElement, matchedStrResource]; + } + _continueUndoInGroup(groupId, undoConfirmed) { + if (!groupId) { + return; + } + const [, matchedStrResource] = this._findClosestUndoElementInGroup(groupId); + if (matchedStrResource) { + return this._undo(matchedStrResource, 0, undoConfirmed); + } + } + undo(resourceOrSource) { + if (resourceOrSource instanceof UndoRedoSource) { + const [, matchedStrResource] = this._findClosestUndoElementWithSource(resourceOrSource.id); + return matchedStrResource ? this._undo(matchedStrResource, resourceOrSource.id, false) : void 0; + } + if (typeof resourceOrSource === "string") { + return this._undo(resourceOrSource, 0, false); + } + return this._undo(this.getUriComparisonKey(resourceOrSource), 0, false); + } + _undo(strResource, sourceId = 0, undoConfirmed) { + if (!this._editStacks.has(strResource)) { + return; + } + const editStack = this._editStacks.get(strResource); + const element = editStack.getClosestPastElement(); + if (!element) { + return; + } + if (element.groupId) { + const [matchedElement, matchedStrResource] = this._findClosestUndoElementInGroup(element.groupId); + if (element !== matchedElement && matchedStrResource) { + return this._undo(matchedStrResource, sourceId, undoConfirmed); + } + } + const shouldPromptForConfirmation = element.sourceId !== sourceId || element.confirmBeforeUndo; + if (shouldPromptForConfirmation && !undoConfirmed) { + return this._confirmAndContinueUndo(strResource, sourceId, element); + } + try { + if (element.type === 1) { + return this._workspaceUndo(strResource, element, undoConfirmed); + } else { + return this._resourceUndo(editStack, element, undoConfirmed); + } + } finally { + if (DEBUG) { + this._print("undo"); + } + } + } + _confirmAndContinueUndo(strResource, sourceId, element) { + return __async(this, null, function* () { + const result = yield this._dialogService.confirm({ + message: localize("confirmDifferentSource", "Would you like to undo '{0}'?", element.label), + primaryButton: localize({ key: "confirmDifferentSource.yes", comment: ["&& denotes a mnemonic"] }, "&&Yes"), + cancelButton: localize("confirmDifferentSource.no", "No") + }); + if (!result.confirmed) { + return; + } + return this._undo(strResource, sourceId, true); + }); + } + _findClosestRedoElementWithSource(sourceId) { + if (!sourceId) { + return [null, null]; + } + let matchedElement = null; + let matchedStrResource = null; + for (const [strResource, editStack] of this._editStacks) { + const candidate = editStack.getClosestFutureElement(); + if (!candidate) { + continue; + } + if (candidate.sourceId === sourceId) { + if (!matchedElement || candidate.sourceOrder < matchedElement.sourceOrder) { + matchedElement = candidate; + matchedStrResource = strResource; + } + } + } + return [matchedElement, matchedStrResource]; + } + canRedo(resourceOrSource) { + if (resourceOrSource instanceof UndoRedoSource) { + const [, matchedStrResource] = this._findClosestRedoElementWithSource(resourceOrSource.id); + return matchedStrResource ? true : false; + } + const strResource = this.getUriComparisonKey(resourceOrSource); + if (this._editStacks.has(strResource)) { + const editStack = this._editStacks.get(strResource); + return editStack.hasFutureElements(); + } + return false; + } + _tryToSplitAndRedo(strResource, element, ignoreResources, message) { + if (element.canSplit()) { + this._splitFutureWorkspaceElement(element, ignoreResources); + this._notificationService.warn(message); + return new WorkspaceVerificationError(this._redo(strResource)); + } else { + for (const strResource2 of element.strResources) { + this.removeElements(strResource2); + } + this._notificationService.warn(message); + return new WorkspaceVerificationError(); + } + } + _checkWorkspaceRedo(strResource, element, editStackSnapshot, checkInvalidatedResources) { + if (element.removedResources) { + return this._tryToSplitAndRedo(strResource, element, element.removedResources, localize({ key: "cannotWorkspaceRedo", comment: ["{0} is a label for an operation. {1} is another message."] }, "Could not redo '{0}' across all files. {1}", element.label, element.removedResources.createMessage())); + } + if (checkInvalidatedResources && element.invalidatedResources) { + return this._tryToSplitAndRedo(strResource, element, element.invalidatedResources, localize({ key: "cannotWorkspaceRedo", comment: ["{0} is a label for an operation. {1} is another message."] }, "Could not redo '{0}' across all files. {1}", element.label, element.invalidatedResources.createMessage())); + } + const cannotRedoDueToResources = []; + for (const editStack of editStackSnapshot.editStacks) { + if (editStack.getClosestFutureElement() !== element) { + cannotRedoDueToResources.push(editStack.resourceLabel); + } + } + if (cannotRedoDueToResources.length > 0) { + return this._tryToSplitAndRedo(strResource, element, null, localize({ key: "cannotWorkspaceRedoDueToChanges", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not redo '{0}' across all files because changes were made to {1}", element.label, cannotRedoDueToResources.join(", "))); + } + const cannotLockDueToResources = []; + for (const editStack of editStackSnapshot.editStacks) { + if (editStack.locked) { + cannotLockDueToResources.push(editStack.resourceLabel); + } + } + if (cannotLockDueToResources.length > 0) { + return this._tryToSplitAndRedo(strResource, element, null, localize({ key: "cannotWorkspaceRedoDueToInProgressUndoRedo", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not redo '{0}' across all files because there is already an undo or redo operation running on {1}", element.label, cannotLockDueToResources.join(", "))); + } + if (!editStackSnapshot.isValid()) { + return this._tryToSplitAndRedo(strResource, element, null, localize({ key: "cannotWorkspaceRedoDueToInMeantimeUndoRedo", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not redo '{0}' across all files because an undo or redo operation occurred in the meantime", element.label)); + } + return null; + } + _workspaceRedo(strResource, element) { + const affectedEditStacks = this._getAffectedEditStacks(element); + const verificationError = this._checkWorkspaceRedo( + strResource, + element, + affectedEditStacks, + /*invalidated resources will be checked after the prepare call*/ + false + ); + if (verificationError) { + return verificationError.returnValue; + } + return this._executeWorkspaceRedo(strResource, element, affectedEditStacks); + } + _executeWorkspaceRedo(strResource, element, editStackSnapshot) { + return __async(this, null, function* () { + let cleanup; + try { + cleanup = yield this._invokeWorkspacePrepare(element); + } catch (err) { + return this._onError(err, element); + } + const verificationError = this._checkWorkspaceRedo( + strResource, + element, + editStackSnapshot, + /*now also check that there are no more invalidated resources*/ + true + ); + if (verificationError) { + cleanup.dispose(); + return verificationError.returnValue; + } + for (const editStack of editStackSnapshot.editStacks) { + editStack.moveForward(element); + } + return this._safeInvokeWithLocks(element, () => element.actual.redo(), editStackSnapshot, cleanup, () => this._continueRedoInGroup(element.groupId)); + }); + } + _resourceRedo(editStack, element) { + if (!element.isValid) { + editStack.flushAllElements(); + return; + } + if (editStack.locked) { + const message = localize({ key: "cannotResourceRedoDueToInProgressUndoRedo", comment: ["{0} is a label for an operation."] }, "Could not redo '{0}' because there is already an undo or redo operation running.", element.label); + this._notificationService.warn(message); + return; + } + return this._invokeResourcePrepare(element, (cleanup) => { + editStack.moveForward(element); + return this._safeInvokeWithLocks(element, () => element.actual.redo(), new EditStackSnapshot([editStack]), cleanup, () => this._continueRedoInGroup(element.groupId)); + }); + } + _findClosestRedoElementInGroup(groupId) { + if (!groupId) { + return [null, null]; + } + let matchedElement = null; + let matchedStrResource = null; + for (const [strResource, editStack] of this._editStacks) { + const candidate = editStack.getClosestFutureElement(); + if (!candidate) { + continue; + } + if (candidate.groupId === groupId) { + if (!matchedElement || candidate.groupOrder < matchedElement.groupOrder) { + matchedElement = candidate; + matchedStrResource = strResource; + } + } + } + return [matchedElement, matchedStrResource]; + } + _continueRedoInGroup(groupId) { + if (!groupId) { + return; + } + const [, matchedStrResource] = this._findClosestRedoElementInGroup(groupId); + if (matchedStrResource) { + return this._redo(matchedStrResource); + } + } + redo(resourceOrSource) { + if (resourceOrSource instanceof UndoRedoSource) { + const [, matchedStrResource] = this._findClosestRedoElementWithSource(resourceOrSource.id); + return matchedStrResource ? this._redo(matchedStrResource) : void 0; + } + if (typeof resourceOrSource === "string") { + return this._redo(resourceOrSource); + } + return this._redo(this.getUriComparisonKey(resourceOrSource)); + } + _redo(strResource) { + if (!this._editStacks.has(strResource)) { + return; + } + const editStack = this._editStacks.get(strResource); + const element = editStack.getClosestFutureElement(); + if (!element) { + return; + } + if (element.groupId) { + const [matchedElement, matchedStrResource] = this._findClosestRedoElementInGroup(element.groupId); + if (element !== matchedElement && matchedStrResource) { + return this._redo(matchedStrResource); + } + } + try { + if (element.type === 1) { + return this._workspaceRedo(strResource, element); + } else { + return this._resourceRedo(editStack, element); + } + } finally { + if (DEBUG) { + this._print("redo"); + } + } + } + }; + UndoRedoService = __decorate17([ + __param16(0, IDialogService), + __param16(1, INotificationService) + ], UndoRedoService); + WorkspaceVerificationError = class { + constructor(returnValue) { + this.returnValue = returnValue; + } + }; + registerSingleton( + IUndoRedoService, + UndoRedoService, + 1 + /* InstantiationType.Delayed */ + ); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/numbers.js +function clamp(value, min, max) { + return Math.min(Math.max(value, min), max); +} +var MovingAverage, SlidingWindowAverage; +var init_numbers = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/numbers.js"() { + MovingAverage = class { + constructor() { + this._n = 1; + this._val = 0; + } + update(value) { + this._val = this._val + (value - this._val) / this._n; + this._n += 1; + return this._val; + } + get value() { + return this._val; + } + }; + SlidingWindowAverage = class { + constructor(size2) { + this._n = 0; + this._val = 0; + this._values = []; + this._index = 0; + this._sum = 0; + this._values = new Array(size2); + this._values.fill(0, 0, size2); + } + update(value) { + const oldValue = this._values[this._index]; + this._values[this._index] = value; + this._index = (this._index + 1) % this._values.length; + this._sum -= oldValue; + this._sum += value; + if (this._n < this._values.length) { + this._n += 1; + } + this._val = this._sum / this._n; + return this._val; + } + get value() { + return this._val; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/environment/common/environment.js +var IEnvironmentService; +var init_environment = __esm({ + "node_modules/monaco-editor/esm/vs/platform/environment/common/environment.js"() { + init_instantiation(); + IEnvironmentService = createDecorator("environmentService"); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/languageFeatureDebounce.js +var __decorate18, __param17, ILanguageFeatureDebounceService, IdentityHash, NullDebounceInformation, FeatureDebounceInformation, LanguageFeatureDebounceService; +var init_languageFeatureDebounce = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/languageFeatureDebounce.js"() { + init_hash(); + init_map(); + init_numbers(); + init_environment(); + init_extensions(); + init_instantiation(); + init_log(); + init_network(); + __decorate18 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param17 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + ILanguageFeatureDebounceService = createDecorator("ILanguageFeatureDebounceService"); + (function(IdentityHash2) { + const _hashes = /* @__PURE__ */ new WeakMap(); + let pool = 0; + function of(obj) { + let value = _hashes.get(obj); + if (value === void 0) { + value = ++pool; + _hashes.set(obj, value); + } + return value; + } + IdentityHash2.of = of; + })(IdentityHash || (IdentityHash = {})); + NullDebounceInformation = class { + constructor(_default) { + this._default = _default; + } + get(_model) { + return this._default; + } + update(_model, _value) { + return this._default; + } + default() { + return this._default; + } + }; + FeatureDebounceInformation = class { + constructor(_logService, _name, _registry2, _default, _min, _max) { + this._logService = _logService; + this._name = _name; + this._registry = _registry2; + this._default = _default; + this._min = _min; + this._max = _max; + this._cache = new LRUCache(50, 0.7); + } + _key(model) { + return model.id + this._registry.all(model).reduce((hashVal, obj) => doHash(IdentityHash.of(obj), hashVal), 0); + } + get(model) { + const key = this._key(model); + const avg = this._cache.get(key); + return avg ? clamp(avg.value, this._min, this._max) : this.default(); + } + update(model, value) { + const key = this._key(model); + let avg = this._cache.get(key); + if (!avg) { + avg = new SlidingWindowAverage(6); + this._cache.set(key, avg); + } + const newValue = clamp(avg.update(value), this._min, this._max); + if (!matchesScheme(model.uri, "output")) { + this._logService.trace(`[DEBOUNCE: ${this._name}] for ${model.uri.toString()} is ${newValue}ms`); + } + return newValue; + } + _overall() { + const result = new MovingAverage(); + for (const [, avg] of this._cache) { + result.update(avg.value); + } + return result.value; + } + default() { + const value = this._overall() | 0 || this._default; + return clamp(value, this._min, this._max); + } + }; + LanguageFeatureDebounceService = class LanguageFeatureDebounceService2 { + constructor(_logService, envService) { + this._logService = _logService; + this._data = /* @__PURE__ */ new Map(); + this._isDev = envService.isExtensionDevelopment || !envService.isBuilt; + } + for(feature, name, config) { + var _a10, _b4, _c2; + const min = (_a10 = config === null || config === void 0 ? void 0 : config.min) !== null && _a10 !== void 0 ? _a10 : 50; + const max = (_b4 = config === null || config === void 0 ? void 0 : config.max) !== null && _b4 !== void 0 ? _b4 : __pow(min, 2); + const extra = (_c2 = config === null || config === void 0 ? void 0 : config.key) !== null && _c2 !== void 0 ? _c2 : void 0; + const key = `${IdentityHash.of(feature)},${min}${extra ? "," + extra : ""}`; + let info = this._data.get(key); + if (!info) { + if (this._isDev) { + this._logService.debug(`[DEBOUNCE: ${name}] is disabled in developed mode`); + info = new NullDebounceInformation(min * 1.5); + } else { + info = new FeatureDebounceInformation( + this._logService, + name, + feature, + this._overallAverage() | 0 || min * 1.5, + // default is overall default or derived from min-value + min, + max + ); + } + this._data.set(key, info); + } + return info; + } + _overallAverage() { + const result = new MovingAverage(); + for (const info of this._data.values()) { + result.update(info.default()); + } + return result.value; + } + }; + LanguageFeatureDebounceService = __decorate18([ + __param17(0, ILogService), + __param17(1, IEnvironmentService) + ], LanguageFeatureDebounceService); + registerSingleton( + ILanguageFeatureDebounceService, + LanguageFeatureDebounceService, + 1 + /* InstantiationType.Delayed */ + ); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/tokens/sparseMultilineTokens.js +var SparseMultilineTokens, SparseMultilineTokensStorage, SparseLineTokens; +var init_sparseMultilineTokens = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/tokens/sparseMultilineTokens.js"() { + init_position(); + init_range(); + init_eolCounter(); + SparseMultilineTokens = class _SparseMultilineTokens { + static create(startLineNumber, tokens) { + return new _SparseMultilineTokens(startLineNumber, new SparseMultilineTokensStorage(tokens)); + } + /** + * (Inclusive) start line number for these tokens. + */ + get startLineNumber() { + return this._startLineNumber; + } + /** + * (Inclusive) end line number for these tokens. + */ + get endLineNumber() { + return this._endLineNumber; + } + constructor(startLineNumber, tokens) { + this._startLineNumber = startLineNumber; + this._tokens = tokens; + this._endLineNumber = this._startLineNumber + this._tokens.getMaxDeltaLine(); + } + toString() { + return this._tokens.toString(this._startLineNumber); + } + _updateEndLineNumber() { + this._endLineNumber = this._startLineNumber + this._tokens.getMaxDeltaLine(); + } + isEmpty() { + return this._tokens.isEmpty(); + } + getLineTokens(lineNumber) { + if (this._startLineNumber <= lineNumber && lineNumber <= this._endLineNumber) { + return this._tokens.getLineTokens(lineNumber - this._startLineNumber); + } + return null; + } + getRange() { + const deltaRange = this._tokens.getRange(); + if (!deltaRange) { + return deltaRange; + } + return new Range(this._startLineNumber + deltaRange.startLineNumber, deltaRange.startColumn, this._startLineNumber + deltaRange.endLineNumber, deltaRange.endColumn); + } + removeTokens(range2) { + const startLineIndex = range2.startLineNumber - this._startLineNumber; + const endLineIndex = range2.endLineNumber - this._startLineNumber; + this._startLineNumber += this._tokens.removeTokens(startLineIndex, range2.startColumn - 1, endLineIndex, range2.endColumn - 1); + this._updateEndLineNumber(); + } + split(range2) { + const startLineIndex = range2.startLineNumber - this._startLineNumber; + const endLineIndex = range2.endLineNumber - this._startLineNumber; + const [a3, b, bDeltaLine] = this._tokens.split(startLineIndex, range2.startColumn - 1, endLineIndex, range2.endColumn - 1); + return [new _SparseMultilineTokens(this._startLineNumber, a3), new _SparseMultilineTokens(this._startLineNumber + bDeltaLine, b)]; + } + applyEdit(range2, text2) { + const [eolCount, firstLineLength, lastLineLength] = countEOL(text2); + this.acceptEdit( + range2, + eolCount, + firstLineLength, + lastLineLength, + text2.length > 0 ? text2.charCodeAt(0) : 0 + /* CharCode.Null */ + ); + } + acceptEdit(range2, eolCount, firstLineLength, lastLineLength, firstCharCode) { + this._acceptDeleteRange(range2); + this._acceptInsertText(new Position(range2.startLineNumber, range2.startColumn), eolCount, firstLineLength, lastLineLength, firstCharCode); + this._updateEndLineNumber(); + } + _acceptDeleteRange(range2) { + if (range2.startLineNumber === range2.endLineNumber && range2.startColumn === range2.endColumn) { + return; + } + const firstLineIndex = range2.startLineNumber - this._startLineNumber; + const lastLineIndex = range2.endLineNumber - this._startLineNumber; + if (lastLineIndex < 0) { + const deletedLinesCount = lastLineIndex - firstLineIndex; + this._startLineNumber -= deletedLinesCount; + return; + } + const tokenMaxDeltaLine = this._tokens.getMaxDeltaLine(); + if (firstLineIndex >= tokenMaxDeltaLine + 1) { + return; + } + if (firstLineIndex < 0 && lastLineIndex >= tokenMaxDeltaLine + 1) { + this._startLineNumber = 0; + this._tokens.clear(); + return; + } + if (firstLineIndex < 0) { + const deletedBefore = -firstLineIndex; + this._startLineNumber -= deletedBefore; + this._tokens.acceptDeleteRange(range2.startColumn - 1, 0, 0, lastLineIndex, range2.endColumn - 1); + } else { + this._tokens.acceptDeleteRange(0, firstLineIndex, range2.startColumn - 1, lastLineIndex, range2.endColumn - 1); + } + } + _acceptInsertText(position, eolCount, firstLineLength, lastLineLength, firstCharCode) { + if (eolCount === 0 && firstLineLength === 0) { + return; + } + const lineIndex = position.lineNumber - this._startLineNumber; + if (lineIndex < 0) { + this._startLineNumber += eolCount; + return; + } + const tokenMaxDeltaLine = this._tokens.getMaxDeltaLine(); + if (lineIndex >= tokenMaxDeltaLine + 1) { + return; + } + this._tokens.acceptInsertText(lineIndex, position.column - 1, eolCount, firstLineLength, lastLineLength, firstCharCode); + } + }; + SparseMultilineTokensStorage = class _SparseMultilineTokensStorage { + constructor(tokens) { + this._tokens = tokens; + this._tokenCount = tokens.length / 4; + } + toString(startLineNumber) { + const pieces = []; + for (let i = 0; i < this._tokenCount; i++) { + pieces.push(`(${this._getDeltaLine(i) + startLineNumber},${this._getStartCharacter(i)}-${this._getEndCharacter(i)})`); + } + return `[${pieces.join(",")}]`; + } + getMaxDeltaLine() { + const tokenCount = this._getTokenCount(); + if (tokenCount === 0) { + return -1; + } + return this._getDeltaLine(tokenCount - 1); + } + getRange() { + const tokenCount = this._getTokenCount(); + if (tokenCount === 0) { + return null; + } + const startChar = this._getStartCharacter(0); + const maxDeltaLine = this._getDeltaLine(tokenCount - 1); + const endChar = this._getEndCharacter(tokenCount - 1); + return new Range(0, startChar + 1, maxDeltaLine, endChar + 1); + } + _getTokenCount() { + return this._tokenCount; + } + _getDeltaLine(tokenIndex) { + return this._tokens[4 * tokenIndex]; + } + _getStartCharacter(tokenIndex) { + return this._tokens[4 * tokenIndex + 1]; + } + _getEndCharacter(tokenIndex) { + return this._tokens[4 * tokenIndex + 2]; + } + isEmpty() { + return this._getTokenCount() === 0; + } + getLineTokens(deltaLine) { + let low = 0; + let high = this._getTokenCount() - 1; + while (low < high) { + const mid = low + Math.floor((high - low) / 2); + const midDeltaLine = this._getDeltaLine(mid); + if (midDeltaLine < deltaLine) { + low = mid + 1; + } else if (midDeltaLine > deltaLine) { + high = mid - 1; + } else { + let min = mid; + while (min > low && this._getDeltaLine(min - 1) === deltaLine) { + min--; + } + let max = mid; + while (max < high && this._getDeltaLine(max + 1) === deltaLine) { + max++; + } + return new SparseLineTokens(this._tokens.subarray(4 * min, 4 * max + 4)); + } + } + if (this._getDeltaLine(low) === deltaLine) { + return new SparseLineTokens(this._tokens.subarray(4 * low, 4 * low + 4)); + } + return null; + } + clear() { + this._tokenCount = 0; + } + removeTokens(startDeltaLine, startChar, endDeltaLine, endChar) { + const tokens = this._tokens; + const tokenCount = this._tokenCount; + let newTokenCount = 0; + let hasDeletedTokens = false; + let firstDeltaLine = 0; + for (let i = 0; i < tokenCount; i++) { + const srcOffset = 4 * i; + const tokenDeltaLine = tokens[srcOffset]; + const tokenStartCharacter = tokens[srcOffset + 1]; + const tokenEndCharacter = tokens[srcOffset + 2]; + const tokenMetadata = tokens[srcOffset + 3]; + if ((tokenDeltaLine > startDeltaLine || tokenDeltaLine === startDeltaLine && tokenEndCharacter >= startChar) && (tokenDeltaLine < endDeltaLine || tokenDeltaLine === endDeltaLine && tokenStartCharacter <= endChar)) { + hasDeletedTokens = true; + } else { + if (newTokenCount === 0) { + firstDeltaLine = tokenDeltaLine; + } + if (hasDeletedTokens) { + const destOffset = 4 * newTokenCount; + tokens[destOffset] = tokenDeltaLine - firstDeltaLine; + tokens[destOffset + 1] = tokenStartCharacter; + tokens[destOffset + 2] = tokenEndCharacter; + tokens[destOffset + 3] = tokenMetadata; + } + newTokenCount++; + } + } + this._tokenCount = newTokenCount; + return firstDeltaLine; + } + split(startDeltaLine, startChar, endDeltaLine, endChar) { + const tokens = this._tokens; + const tokenCount = this._tokenCount; + const aTokens = []; + const bTokens = []; + let destTokens = aTokens; + let destOffset = 0; + let destFirstDeltaLine = 0; + for (let i = 0; i < tokenCount; i++) { + const srcOffset = 4 * i; + const tokenDeltaLine = tokens[srcOffset]; + const tokenStartCharacter = tokens[srcOffset + 1]; + const tokenEndCharacter = tokens[srcOffset + 2]; + const tokenMetadata = tokens[srcOffset + 3]; + if (tokenDeltaLine > startDeltaLine || tokenDeltaLine === startDeltaLine && tokenEndCharacter >= startChar) { + if (tokenDeltaLine < endDeltaLine || tokenDeltaLine === endDeltaLine && tokenStartCharacter <= endChar) { + continue; + } else { + if (destTokens !== bTokens) { + destTokens = bTokens; + destOffset = 0; + destFirstDeltaLine = tokenDeltaLine; + } + } + } + destTokens[destOffset++] = tokenDeltaLine - destFirstDeltaLine; + destTokens[destOffset++] = tokenStartCharacter; + destTokens[destOffset++] = tokenEndCharacter; + destTokens[destOffset++] = tokenMetadata; + } + return [new _SparseMultilineTokensStorage(new Uint32Array(aTokens)), new _SparseMultilineTokensStorage(new Uint32Array(bTokens)), destFirstDeltaLine]; + } + acceptDeleteRange(horizontalShiftForFirstLineTokens, startDeltaLine, startCharacter, endDeltaLine, endCharacter) { + const tokens = this._tokens; + const tokenCount = this._tokenCount; + const deletedLineCount = endDeltaLine - startDeltaLine; + let newTokenCount = 0; + let hasDeletedTokens = false; + for (let i = 0; i < tokenCount; i++) { + const srcOffset = 4 * i; + let tokenDeltaLine = tokens[srcOffset]; + let tokenStartCharacter = tokens[srcOffset + 1]; + let tokenEndCharacter = tokens[srcOffset + 2]; + const tokenMetadata = tokens[srcOffset + 3]; + if (tokenDeltaLine < startDeltaLine || tokenDeltaLine === startDeltaLine && tokenEndCharacter <= startCharacter) { + newTokenCount++; + continue; + } else if (tokenDeltaLine === startDeltaLine && tokenStartCharacter < startCharacter) { + if (tokenDeltaLine === endDeltaLine && tokenEndCharacter > endCharacter) { + tokenEndCharacter -= endCharacter - startCharacter; + } else { + tokenEndCharacter = startCharacter; + } + } else if (tokenDeltaLine === startDeltaLine && tokenStartCharacter === startCharacter) { + if (tokenDeltaLine === endDeltaLine && tokenEndCharacter > endCharacter) { + tokenEndCharacter -= endCharacter - startCharacter; + } else { + hasDeletedTokens = true; + continue; + } + } else if (tokenDeltaLine < endDeltaLine || tokenDeltaLine === endDeltaLine && tokenStartCharacter < endCharacter) { + if (tokenDeltaLine === endDeltaLine && tokenEndCharacter > endCharacter) { + tokenDeltaLine = startDeltaLine; + tokenStartCharacter = startCharacter; + tokenEndCharacter = tokenStartCharacter + (tokenEndCharacter - endCharacter); + } else { + hasDeletedTokens = true; + continue; + } + } else if (tokenDeltaLine > endDeltaLine) { + if (deletedLineCount === 0 && !hasDeletedTokens) { + newTokenCount = tokenCount; + break; + } + tokenDeltaLine -= deletedLineCount; + } else if (tokenDeltaLine === endDeltaLine && tokenStartCharacter >= endCharacter) { + if (horizontalShiftForFirstLineTokens && tokenDeltaLine === 0) { + tokenStartCharacter += horizontalShiftForFirstLineTokens; + tokenEndCharacter += horizontalShiftForFirstLineTokens; + } + tokenDeltaLine -= deletedLineCount; + tokenStartCharacter -= endCharacter - startCharacter; + tokenEndCharacter -= endCharacter - startCharacter; + } else { + throw new Error(`Not possible!`); + } + const destOffset = 4 * newTokenCount; + tokens[destOffset] = tokenDeltaLine; + tokens[destOffset + 1] = tokenStartCharacter; + tokens[destOffset + 2] = tokenEndCharacter; + tokens[destOffset + 3] = tokenMetadata; + newTokenCount++; + } + this._tokenCount = newTokenCount; + } + acceptInsertText(deltaLine, character, eolCount, firstLineLength, lastLineLength, firstCharCode) { + const isInsertingPreciselyOneWordCharacter = eolCount === 0 && firstLineLength === 1 && (firstCharCode >= 48 && firstCharCode <= 57 || firstCharCode >= 65 && firstCharCode <= 90 || firstCharCode >= 97 && firstCharCode <= 122); + const tokens = this._tokens; + const tokenCount = this._tokenCount; + for (let i = 0; i < tokenCount; i++) { + const offset = 4 * i; + let tokenDeltaLine = tokens[offset]; + let tokenStartCharacter = tokens[offset + 1]; + let tokenEndCharacter = tokens[offset + 2]; + if (tokenDeltaLine < deltaLine || tokenDeltaLine === deltaLine && tokenEndCharacter < character) { + continue; + } else if (tokenDeltaLine === deltaLine && tokenEndCharacter === character) { + if (isInsertingPreciselyOneWordCharacter) { + tokenEndCharacter += 1; + } else { + continue; + } + } else if (tokenDeltaLine === deltaLine && tokenStartCharacter < character && character < tokenEndCharacter) { + if (eolCount === 0) { + tokenEndCharacter += firstLineLength; + } else { + tokenEndCharacter = character; + } + } else { + if (tokenDeltaLine === deltaLine && tokenStartCharacter === character) { + if (isInsertingPreciselyOneWordCharacter) { + continue; + } + } + if (tokenDeltaLine === deltaLine) { + tokenDeltaLine += eolCount; + if (eolCount === 0) { + tokenStartCharacter += firstLineLength; + tokenEndCharacter += firstLineLength; + } else { + const tokenLength = tokenEndCharacter - tokenStartCharacter; + tokenStartCharacter = lastLineLength + (tokenStartCharacter - character); + tokenEndCharacter = tokenStartCharacter + tokenLength; + } + } else { + tokenDeltaLine += eolCount; + } + } + tokens[offset] = tokenDeltaLine; + tokens[offset + 1] = tokenStartCharacter; + tokens[offset + 2] = tokenEndCharacter; + } + } + }; + SparseLineTokens = class { + constructor(tokens) { + this._tokens = tokens; + } + getCount() { + return this._tokens.length / 4; + } + getStartCharacter(tokenIndex) { + return this._tokens[4 * tokenIndex + 1]; + } + getEndCharacter(tokenIndex) { + return this._tokens[4 * tokenIndex + 2]; + } + getMetadata(tokenIndex) { + return this._tokens[4 * tokenIndex + 3]; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/semanticTokensProviderStyling.js +function toMultilineTokens2(tokens, styling, languageId) { + const srcData = tokens.data; + const tokenCount = tokens.data.length / 5 | 0; + const tokensPerArea = Math.max( + Math.ceil( + tokenCount / 1024 + /* SemanticColoringConstants.DesiredMaxAreas */ + ), + 400 + /* SemanticColoringConstants.DesiredTokensPerArea */ + ); + const result = []; + let tokenIndex = 0; + let lastLineNumber = 1; + let lastStartCharacter = 0; + while (tokenIndex < tokenCount) { + const tokenStartIndex = tokenIndex; + let tokenEndIndex = Math.min(tokenStartIndex + tokensPerArea, tokenCount); + if (tokenEndIndex < tokenCount) { + let smallTokenEndIndex = tokenEndIndex; + while (smallTokenEndIndex - 1 > tokenStartIndex && srcData[5 * smallTokenEndIndex] === 0) { + smallTokenEndIndex--; + } + if (smallTokenEndIndex - 1 === tokenStartIndex) { + let bigTokenEndIndex = tokenEndIndex; + while (bigTokenEndIndex + 1 < tokenCount && srcData[5 * bigTokenEndIndex] === 0) { + bigTokenEndIndex++; + } + tokenEndIndex = bigTokenEndIndex; + } else { + tokenEndIndex = smallTokenEndIndex; + } + } + let destData = new Uint32Array((tokenEndIndex - tokenStartIndex) * 4); + let destOffset = 0; + let areaLine = 0; + let prevLineNumber = 0; + let prevEndCharacter = 0; + while (tokenIndex < tokenEndIndex) { + const srcOffset = 5 * tokenIndex; + const deltaLine = srcData[srcOffset]; + const deltaCharacter = srcData[srcOffset + 1]; + const lineNumber = lastLineNumber + deltaLine | 0; + const startCharacter = deltaLine === 0 ? lastStartCharacter + deltaCharacter | 0 : deltaCharacter; + const length = srcData[srcOffset + 2]; + const endCharacter = startCharacter + length | 0; + const tokenTypeIndex = srcData[srcOffset + 3]; + const tokenModifierSet = srcData[srcOffset + 4]; + if (endCharacter <= startCharacter) { + styling.warnInvalidLengthSemanticTokens(lineNumber, startCharacter + 1); + } else if (prevLineNumber === lineNumber && prevEndCharacter > startCharacter) { + styling.warnOverlappingSemanticTokens(lineNumber, startCharacter + 1); + } else { + const metadata = styling.getMetadata(tokenTypeIndex, tokenModifierSet, languageId); + if (metadata !== 2147483647) { + if (areaLine === 0) { + areaLine = lineNumber; + } + destData[destOffset] = lineNumber - areaLine; + destData[destOffset + 1] = startCharacter; + destData[destOffset + 2] = endCharacter; + destData[destOffset + 3] = metadata; + destOffset += 4; + prevLineNumber = lineNumber; + prevEndCharacter = endCharacter; + } + } + lastLineNumber = lineNumber; + lastStartCharacter = startCharacter; + tokenIndex++; + } + if (destOffset !== destData.length) { + destData = destData.subarray(0, destOffset); + } + const tokens2 = SparseMultilineTokens.create(areaLine, destData); + result.push(tokens2); + } + return result; +} +var __decorate19, __param18, SemanticTokensProviderStyling, HashTableEntry, HashTable; +var init_semanticTokensProviderStyling = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/semanticTokensProviderStyling.js"() { + init_encodedTokenAttributes(); + init_themeService(); + init_log(); + init_sparseMultilineTokens(); + init_language(); + __decorate19 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param18 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + SemanticTokensProviderStyling = class SemanticTokensProviderStyling2 { + constructor(_legend, _themeService, _languageService, _logService) { + this._legend = _legend; + this._themeService = _themeService; + this._languageService = _languageService; + this._logService = _logService; + this._hasWarnedOverlappingTokens = false; + this._hasWarnedInvalidLengthTokens = false; + this._hasWarnedInvalidEditStart = false; + this._hashTable = new HashTable(); + } + getMetadata(tokenTypeIndex, tokenModifierSet, languageId) { + const encodedLanguageId = this._languageService.languageIdCodec.encodeLanguageId(languageId); + const entry = this._hashTable.get(tokenTypeIndex, tokenModifierSet, encodedLanguageId); + let metadata; + if (entry) { + metadata = entry.metadata; + if (this._logService.getLevel() === LogLevel.Trace) { + this._logService.trace(`SemanticTokensProviderStyling [CACHED] ${tokenTypeIndex} / ${tokenModifierSet}: foreground ${TokenMetadata.getForeground(metadata)}, fontStyle ${TokenMetadata.getFontStyle(metadata).toString(2)}`); + } + } else { + let tokenType = this._legend.tokenTypes[tokenTypeIndex]; + const tokenModifiers = []; + if (tokenType) { + let modifierSet = tokenModifierSet; + for (let modifierIndex = 0; modifierSet > 0 && modifierIndex < this._legend.tokenModifiers.length; modifierIndex++) { + if (modifierSet & 1) { + tokenModifiers.push(this._legend.tokenModifiers[modifierIndex]); + } + modifierSet = modifierSet >> 1; + } + if (modifierSet > 0 && this._logService.getLevel() === LogLevel.Trace) { + this._logService.trace(`SemanticTokensProviderStyling: unknown token modifier index: ${tokenModifierSet.toString(2)} for legend: ${JSON.stringify(this._legend.tokenModifiers)}`); + tokenModifiers.push("not-in-legend"); + } + const tokenStyle = this._themeService.getColorTheme().getTokenStyleMetadata(tokenType, tokenModifiers, languageId); + if (typeof tokenStyle === "undefined") { + metadata = 2147483647; + } else { + metadata = 0; + if (typeof tokenStyle.italic !== "undefined") { + const italicBit = (tokenStyle.italic ? 1 : 0) << 11; + metadata |= italicBit | 1; + } + if (typeof tokenStyle.bold !== "undefined") { + const boldBit = (tokenStyle.bold ? 2 : 0) << 11; + metadata |= boldBit | 2; + } + if (typeof tokenStyle.underline !== "undefined") { + const underlineBit = (tokenStyle.underline ? 4 : 0) << 11; + metadata |= underlineBit | 4; + } + if (typeof tokenStyle.strikethrough !== "undefined") { + const strikethroughBit = (tokenStyle.strikethrough ? 8 : 0) << 11; + metadata |= strikethroughBit | 8; + } + if (tokenStyle.foreground) { + const foregroundBits = tokenStyle.foreground << 15; + metadata |= foregroundBits | 16; + } + if (metadata === 0) { + metadata = 2147483647; + } + } + } else { + if (this._logService.getLevel() === LogLevel.Trace) { + this._logService.trace(`SemanticTokensProviderStyling: unknown token type index: ${tokenTypeIndex} for legend: ${JSON.stringify(this._legend.tokenTypes)}`); + } + metadata = 2147483647; + tokenType = "not-in-legend"; + } + this._hashTable.add(tokenTypeIndex, tokenModifierSet, encodedLanguageId, metadata); + if (this._logService.getLevel() === LogLevel.Trace) { + this._logService.trace(`SemanticTokensProviderStyling ${tokenTypeIndex} (${tokenType}) / ${tokenModifierSet} (${tokenModifiers.join(" ")}): foreground ${TokenMetadata.getForeground(metadata)}, fontStyle ${TokenMetadata.getFontStyle(metadata).toString(2)}`); + } + } + return metadata; + } + warnOverlappingSemanticTokens(lineNumber, startColumn) { + if (!this._hasWarnedOverlappingTokens) { + this._hasWarnedOverlappingTokens = true; + this._logService.warn(`Overlapping semantic tokens detected at lineNumber ${lineNumber}, column ${startColumn}`); + } + } + warnInvalidLengthSemanticTokens(lineNumber, startColumn) { + if (!this._hasWarnedInvalidLengthTokens) { + this._hasWarnedInvalidLengthTokens = true; + this._logService.warn(`Semantic token with invalid length detected at lineNumber ${lineNumber}, column ${startColumn}`); + } + } + warnInvalidEditStart(previousResultId, resultId, editIndex, editStart, maxExpectedStart) { + if (!this._hasWarnedInvalidEditStart) { + this._hasWarnedInvalidEditStart = true; + this._logService.warn(`Invalid semantic tokens edit detected (previousResultId: ${previousResultId}, resultId: ${resultId}) at edit #${editIndex}: The provided start offset ${editStart} is outside the previous data (length ${maxExpectedStart}).`); + } + } + }; + SemanticTokensProviderStyling = __decorate19([ + __param18(1, IThemeService), + __param18(2, ILanguageService), + __param18(3, ILogService) + ], SemanticTokensProviderStyling); + HashTableEntry = class { + constructor(tokenTypeIndex, tokenModifierSet, languageId, metadata) { + this.tokenTypeIndex = tokenTypeIndex; + this.tokenModifierSet = tokenModifierSet; + this.languageId = languageId; + this.metadata = metadata; + this.next = null; + } + }; + HashTable = class _HashTable { + constructor() { + this._elementsCount = 0; + this._currentLengthIndex = 0; + this._currentLength = _HashTable._SIZES[this._currentLengthIndex]; + this._growCount = Math.round(this._currentLengthIndex + 1 < _HashTable._SIZES.length ? 2 / 3 * this._currentLength : 0); + this._elements = []; + _HashTable._nullOutEntries(this._elements, this._currentLength); + } + static _nullOutEntries(entries2, length) { + for (let i = 0; i < length; i++) { + entries2[i] = null; + } + } + _hash2(n1, n2) { + return (n1 << 5) - n1 + n2 | 0; + } + _hashFunc(tokenTypeIndex, tokenModifierSet, languageId) { + return this._hash2(this._hash2(tokenTypeIndex, tokenModifierSet), languageId) % this._currentLength; + } + get(tokenTypeIndex, tokenModifierSet, languageId) { + const hash2 = this._hashFunc(tokenTypeIndex, tokenModifierSet, languageId); + let p = this._elements[hash2]; + while (p) { + if (p.tokenTypeIndex === tokenTypeIndex && p.tokenModifierSet === tokenModifierSet && p.languageId === languageId) { + return p; + } + p = p.next; + } + return null; + } + add(tokenTypeIndex, tokenModifierSet, languageId, metadata) { + this._elementsCount++; + if (this._growCount !== 0 && this._elementsCount >= this._growCount) { + const oldElements = this._elements; + this._currentLengthIndex++; + this._currentLength = _HashTable._SIZES[this._currentLengthIndex]; + this._growCount = Math.round(this._currentLengthIndex + 1 < _HashTable._SIZES.length ? 2 / 3 * this._currentLength : 0); + this._elements = []; + _HashTable._nullOutEntries(this._elements, this._currentLength); + for (const first2 of oldElements) { + let p = first2; + while (p) { + const oldNext = p.next; + p.next = null; + this._add(p); + p = oldNext; + } + } + } + this._add(new HashTableEntry(tokenTypeIndex, tokenModifierSet, languageId, metadata)); + } + _add(element) { + const hash2 = this._hashFunc(element.tokenTypeIndex, element.tokenModifierSet, element.languageId); + element.next = this._elements[hash2]; + this._elements[hash2] = element; + } + }; + HashTable._SIZES = [3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, 262139, 524287, 1048573, 2097143]; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/semanticTokensStyling.js +var ISemanticTokensStylingService; +var init_semanticTokensStyling = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/semanticTokensStyling.js"() { + init_instantiation(); + ISemanticTokensStylingService = createDecorator("semanticTokensStylingService"); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/semanticTokensStylingService.js +var __decorate20, __param19, SemanticTokensStylingService; +var init_semanticTokensStylingService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/semanticTokensStylingService.js"() { + init_lifecycle(); + init_language(); + init_themeService(); + init_log(); + init_semanticTokensProviderStyling(); + init_semanticTokensStyling(); + init_extensions(); + __decorate20 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param19 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + SemanticTokensStylingService = class SemanticTokensStylingService2 extends Disposable { + constructor(_themeService, _logService, _languageService) { + super(); + this._themeService = _themeService; + this._logService = _logService; + this._languageService = _languageService; + this._caches = /* @__PURE__ */ new WeakMap(); + this._register(this._themeService.onDidColorThemeChange(() => { + this._caches = /* @__PURE__ */ new WeakMap(); + })); + } + getStyling(provider) { + if (!this._caches.has(provider)) { + this._caches.set(provider, new SemanticTokensProviderStyling(provider.getLegend(), this._themeService, this._languageService, this._logService)); + } + return this._caches.get(provider); + } + }; + SemanticTokensStylingService = __decorate20([ + __param19(0, IThemeService), + __param19(1, ILogService), + __param19(2, ILanguageService) + ], SemanticTokensStylingService); + registerSingleton( + ISemanticTokensStylingService, + SemanticTokensStylingService, + 1 + /* InstantiationType.Delayed */ + ); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/glob.js +function starsToRegExp(starCount, isLastPattern) { + switch (starCount) { + case 0: + return ""; + case 1: + return `${NO_PATH_REGEX}*?`; + // 1 star matches any number of characters except path separator (/ and \) - non greedy (?) + default: + return `(?:${PATH_REGEX}|${NO_PATH_REGEX}+${PATH_REGEX}${isLastPattern ? `|${PATH_REGEX}${NO_PATH_REGEX}+` : ""})*?`; + } +} +function splitGlobAware(pattern, splitChar) { + if (!pattern) { + return []; + } + const segments = []; + let inBraces = false; + let inBrackets = false; + let curVal = ""; + for (const char of pattern) { + switch (char) { + case splitChar: + if (!inBraces && !inBrackets) { + segments.push(curVal); + curVal = ""; + continue; + } + break; + case "{": + inBraces = true; + break; + case "}": + inBraces = false; + break; + case "[": + inBrackets = true; + break; + case "]": + inBrackets = false; + break; + } + curVal += char; + } + if (curVal) { + segments.push(curVal); + } + return segments; +} +function parseRegExp(pattern) { + if (!pattern) { + return ""; + } + let regEx = ""; + const segments = splitGlobAware(pattern, GLOB_SPLIT); + if (segments.every((segment) => segment === GLOBSTAR)) { + regEx = ".*"; + } else { + let previousSegmentWasGlobStar = false; + segments.forEach((segment, index) => { + if (segment === GLOBSTAR) { + if (previousSegmentWasGlobStar) { + return; + } + regEx += starsToRegExp(2, index === segments.length - 1); + } else { + let inBraces = false; + let braceVal = ""; + let inBrackets = false; + let bracketVal = ""; + for (const char of segment) { + if (char !== "}" && inBraces) { + braceVal += char; + continue; + } + if (inBrackets && (char !== "]" || !bracketVal)) { + let res; + if (char === "-") { + res = char; + } else if ((char === "^" || char === "!") && !bracketVal) { + res = "^"; + } else if (char === GLOB_SPLIT) { + res = ""; + } else { + res = escapeRegExpCharacters(char); + } + bracketVal += res; + continue; + } + switch (char) { + case "{": + inBraces = true; + continue; + case "[": + inBrackets = true; + continue; + case "}": { + const choices = splitGlobAware(braceVal, ","); + const braceRegExp = `(?:${choices.map((choice) => parseRegExp(choice)).join("|")})`; + regEx += braceRegExp; + inBraces = false; + braceVal = ""; + break; + } + case "]": { + regEx += "[" + bracketVal + "]"; + inBrackets = false; + bracketVal = ""; + break; + } + case "?": + regEx += NO_PATH_REGEX; + continue; + case "*": + regEx += starsToRegExp(1); + continue; + default: + regEx += escapeRegExpCharacters(char); + } + } + if (index < segments.length - 1 && // more segments to come after this + (segments[index + 1] !== GLOBSTAR || // next segment is not **, or... + index + 2 < segments.length)) { + regEx += PATH_REGEX; + } + } + previousSegmentWasGlobStar = segment === GLOBSTAR; + }); + } + return regEx; +} +function parsePattern(arg1, options2) { + if (!arg1) { + return NULL; + } + let pattern; + if (typeof arg1 !== "string") { + pattern = arg1.pattern; + } else { + pattern = arg1; + } + pattern = pattern.trim(); + const patternKey = `${pattern}_${!!options2.trimForExclusions}`; + let parsedPattern = CACHE.get(patternKey); + if (parsedPattern) { + return wrapRelativePattern(parsedPattern, arg1); + } + let match2; + if (T1.test(pattern)) { + parsedPattern = trivia1(pattern.substr(4), pattern); + } else if (match2 = T2.exec(trimForExclusions(pattern, options2))) { + parsedPattern = trivia2(match2[1], pattern); + } else if ((options2.trimForExclusions ? T3_2 : T3).test(pattern)) { + parsedPattern = trivia3(pattern, options2); + } else if (match2 = T4.exec(trimForExclusions(pattern, options2))) { + parsedPattern = trivia4and5(match2[1].substr(1), pattern, true); + } else if (match2 = T5.exec(trimForExclusions(pattern, options2))) { + parsedPattern = trivia4and5(match2[1], pattern, false); + } else { + parsedPattern = toRegExp(pattern); + } + CACHE.set(patternKey, parsedPattern); + return wrapRelativePattern(parsedPattern, arg1); +} +function wrapRelativePattern(parsedPattern, arg2) { + if (typeof arg2 === "string") { + return parsedPattern; + } + const wrappedPattern = function(path, basename3) { + if (!isEqualOrParent(path, arg2.base, !isLinux)) { + return null; + } + return parsedPattern(ltrim(path.substr(arg2.base.length), sep), basename3); + }; + wrappedPattern.allBasenames = parsedPattern.allBasenames; + wrappedPattern.allPaths = parsedPattern.allPaths; + wrappedPattern.basenames = parsedPattern.basenames; + wrappedPattern.patterns = parsedPattern.patterns; + return wrappedPattern; +} +function trimForExclusions(pattern, options2) { + return options2.trimForExclusions && pattern.endsWith("/**") ? pattern.substr(0, pattern.length - 2) : pattern; +} +function trivia1(base, pattern) { + return function(path, basename3) { + return typeof path === "string" && path.endsWith(base) ? pattern : null; + }; +} +function trivia2(base, pattern) { + const slashBase = `/${base}`; + const backslashBase = `\\${base}`; + const parsedPattern = function(path, basename3) { + if (typeof path !== "string") { + return null; + } + if (basename3) { + return basename3 === base ? pattern : null; + } + return path === base || path.endsWith(slashBase) || path.endsWith(backslashBase) ? pattern : null; + }; + const basenames = [base]; + parsedPattern.basenames = basenames; + parsedPattern.patterns = [pattern]; + parsedPattern.allBasenames = basenames; + return parsedPattern; +} +function trivia3(pattern, options2) { + const parsedPatterns = aggregateBasenameMatches(pattern.slice(1, -1).split(",").map((pattern2) => parsePattern(pattern2, options2)).filter((pattern2) => pattern2 !== NULL), pattern); + const patternsLength = parsedPatterns.length; + if (!patternsLength) { + return NULL; + } + if (patternsLength === 1) { + return parsedPatterns[0]; + } + const parsedPattern = function(path, basename3) { + for (let i = 0, n = parsedPatterns.length; i < n; i++) { + if (parsedPatterns[i](path, basename3)) { + return pattern; + } + } + return null; + }; + const withBasenames = parsedPatterns.find((pattern2) => !!pattern2.allBasenames); + if (withBasenames) { + parsedPattern.allBasenames = withBasenames.allBasenames; + } + const allPaths = parsedPatterns.reduce((all, current) => current.allPaths ? all.concat(current.allPaths) : all, []); + if (allPaths.length) { + parsedPattern.allPaths = allPaths; + } + return parsedPattern; +} +function trivia4and5(targetPath, pattern, matchPathEnds) { + const usingPosixSep = sep === posix.sep; + const nativePath = usingPosixSep ? targetPath : targetPath.replace(ALL_FORWARD_SLASHES, sep); + const nativePathEnd = sep + nativePath; + const targetPathEnd = posix.sep + targetPath; + let parsedPattern; + if (matchPathEnds) { + parsedPattern = function(path, basename3) { + return typeof path === "string" && (path === nativePath || path.endsWith(nativePathEnd) || !usingPosixSep && (path === targetPath || path.endsWith(targetPathEnd))) ? pattern : null; + }; + } else { + parsedPattern = function(path, basename3) { + return typeof path === "string" && (path === nativePath || !usingPosixSep && path === targetPath) ? pattern : null; + }; + } + parsedPattern.allPaths = [(matchPathEnds ? "*/" : "./") + targetPath]; + return parsedPattern; +} +function toRegExp(pattern) { + try { + const regExp = new RegExp(`^${parseRegExp(pattern)}$`); + return function(path) { + regExp.lastIndex = 0; + return typeof path === "string" && regExp.test(path) ? pattern : null; + }; + } catch (error) { + return NULL; + } +} +function match(arg1, path, hasSibling) { + if (!arg1 || typeof path !== "string") { + return false; + } + return parse(arg1)(path, void 0, hasSibling); +} +function parse(arg1, options2 = {}) { + if (!arg1) { + return FALSE; + } + if (typeof arg1 === "string" || isRelativePattern(arg1)) { + const parsedPattern = parsePattern(arg1, options2); + if (parsedPattern === NULL) { + return FALSE; + } + const resultPattern = function(path, basename3) { + return !!parsedPattern(path, basename3); + }; + if (parsedPattern.allBasenames) { + resultPattern.allBasenames = parsedPattern.allBasenames; + } + if (parsedPattern.allPaths) { + resultPattern.allPaths = parsedPattern.allPaths; + } + return resultPattern; + } + return parsedExpression(arg1, options2); +} +function isRelativePattern(obj) { + const rp = obj; + if (!rp) { + return false; + } + return typeof rp.base === "string" && typeof rp.pattern === "string"; +} +function parsedExpression(expression, options2) { + const parsedPatterns = aggregateBasenameMatches(Object.getOwnPropertyNames(expression).map((pattern) => parseExpressionPattern(pattern, expression[pattern], options2)).filter((pattern) => pattern !== NULL)); + const patternsLength = parsedPatterns.length; + if (!patternsLength) { + return NULL; + } + if (!parsedPatterns.some((parsedPattern) => !!parsedPattern.requiresSiblings)) { + if (patternsLength === 1) { + return parsedPatterns[0]; + } + const resultExpression2 = function(path, basename3) { + let resultPromises = void 0; + for (let i = 0, n = parsedPatterns.length; i < n; i++) { + const result = parsedPatterns[i](path, basename3); + if (typeof result === "string") { + return result; + } + if (isThenable(result)) { + if (!resultPromises) { + resultPromises = []; + } + resultPromises.push(result); + } + } + if (resultPromises) { + return (() => __async(this, null, function* () { + for (const resultPromise of resultPromises) { + const result = yield resultPromise; + if (typeof result === "string") { + return result; + } + } + return null; + }))(); + } + return null; + }; + const withBasenames2 = parsedPatterns.find((pattern) => !!pattern.allBasenames); + if (withBasenames2) { + resultExpression2.allBasenames = withBasenames2.allBasenames; + } + const allPaths2 = parsedPatterns.reduce((all, current) => current.allPaths ? all.concat(current.allPaths) : all, []); + if (allPaths2.length) { + resultExpression2.allPaths = allPaths2; + } + return resultExpression2; + } + const resultExpression = function(path, base, hasSibling) { + let name = void 0; + let resultPromises = void 0; + for (let i = 0, n = parsedPatterns.length; i < n; i++) { + const parsedPattern = parsedPatterns[i]; + if (parsedPattern.requiresSiblings && hasSibling) { + if (!base) { + base = basename(path); + } + if (!name) { + name = base.substr(0, base.length - extname(path).length); + } + } + const result = parsedPattern(path, base, name, hasSibling); + if (typeof result === "string") { + return result; + } + if (isThenable(result)) { + if (!resultPromises) { + resultPromises = []; + } + resultPromises.push(result); + } + } + if (resultPromises) { + return (() => __async(this, null, function* () { + for (const resultPromise of resultPromises) { + const result = yield resultPromise; + if (typeof result === "string") { + return result; + } + } + return null; + }))(); + } + return null; + }; + const withBasenames = parsedPatterns.find((pattern) => !!pattern.allBasenames); + if (withBasenames) { + resultExpression.allBasenames = withBasenames.allBasenames; + } + const allPaths = parsedPatterns.reduce((all, current) => current.allPaths ? all.concat(current.allPaths) : all, []); + if (allPaths.length) { + resultExpression.allPaths = allPaths; + } + return resultExpression; +} +function parseExpressionPattern(pattern, value, options2) { + if (value === false) { + return NULL; + } + const parsedPattern = parsePattern(pattern, options2); + if (parsedPattern === NULL) { + return NULL; + } + if (typeof value === "boolean") { + return parsedPattern; + } + if (value) { + const when = value.when; + if (typeof when === "string") { + const result = (path, basename3, name, hasSibling) => { + if (!hasSibling || !parsedPattern(path, basename3)) { + return null; + } + const clausePattern = when.replace("$(basename)", () => name); + const matched = hasSibling(clausePattern); + return isThenable(matched) ? matched.then((match2) => match2 ? pattern : null) : matched ? pattern : null; + }; + result.requiresSiblings = true; + return result; + } + } + return parsedPattern; +} +function aggregateBasenameMatches(parsedPatterns, result) { + const basenamePatterns = parsedPatterns.filter((parsedPattern) => !!parsedPattern.basenames); + if (basenamePatterns.length < 2) { + return parsedPatterns; + } + const basenames = basenamePatterns.reduce((all, current) => { + const basenames2 = current.basenames; + return basenames2 ? all.concat(basenames2) : all; + }, []); + let patterns; + if (result) { + patterns = []; + for (let i = 0, n = basenames.length; i < n; i++) { + patterns.push(result); + } + } else { + patterns = basenamePatterns.reduce((all, current) => { + const patterns2 = current.patterns; + return patterns2 ? all.concat(patterns2) : all; + }, []); + } + const aggregate = function(path, basename3) { + if (typeof path !== "string") { + return null; + } + if (!basename3) { + let i; + for (i = path.length; i > 0; i--) { + const ch = path.charCodeAt(i - 1); + if (ch === 47 || ch === 92) { + break; + } + } + basename3 = path.substr(i); + } + const index = basenames.indexOf(basename3); + return index !== -1 ? patterns[index] : null; + }; + aggregate.basenames = basenames; + aggregate.patterns = patterns; + aggregate.allBasenames = basenames; + const aggregatedPatterns = parsedPatterns.filter((parsedPattern) => !parsedPattern.basenames); + aggregatedPatterns.push(aggregate); + return aggregatedPatterns; +} +var GLOBSTAR, GLOB_SPLIT, PATH_REGEX, NO_PATH_REGEX, ALL_FORWARD_SLASHES, T1, T2, T3, T3_2, T4, T5, CACHE, FALSE, NULL; +var init_glob = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/glob.js"() { + init_async(); + init_extpath(); + init_map(); + init_path(); + init_platform(); + init_strings(); + GLOBSTAR = "**"; + GLOB_SPLIT = "/"; + PATH_REGEX = "[/\\\\]"; + NO_PATH_REGEX = "[^/\\\\]"; + ALL_FORWARD_SLASHES = /\//g; + T1 = /^\*\*\/\*\.[\w\.-]+$/; + T2 = /^\*\*\/([\w\.-]+)\/?$/; + T3 = /^{\*\*\/\*?[\w\.-]+\/?(,\*\*\/\*?[\w\.-]+\/?)*}$/; + T3_2 = /^{\*\*\/\*?[\w\.-]+(\/(\*\*)?)?(,\*\*\/\*?[\w\.-]+(\/(\*\*)?)?)*}$/; + T4 = /^\*\*((\/[\w\.-]+)+)\/?$/; + T5 = /^([\w\.-]+(\/[\w\.-]+)*)\/?$/; + CACHE = new LRUCache(1e4); + FALSE = function() { + return false; + }; + NULL = function() { + return null; + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languageSelector.js +function score2(selector, candidateUri, candidateLanguage, candidateIsSynchronized, candidateNotebookUri, candidateNotebookType) { + if (Array.isArray(selector)) { + let ret = 0; + for (const filter of selector) { + const value = score2(filter, candidateUri, candidateLanguage, candidateIsSynchronized, candidateNotebookUri, candidateNotebookType); + if (value === 10) { + return value; + } + if (value > ret) { + ret = value; + } + } + return ret; + } else if (typeof selector === "string") { + if (!candidateIsSynchronized) { + return 0; + } + if (selector === "*") { + return 5; + } else if (selector === candidateLanguage) { + return 10; + } else { + return 0; + } + } else if (selector) { + const { language: language82, pattern, scheme, hasAccessToAllModels, notebookType } = selector; + if (!candidateIsSynchronized && !hasAccessToAllModels) { + return 0; + } + if (notebookType && candidateNotebookUri) { + candidateUri = candidateNotebookUri; + } + let ret = 0; + if (scheme) { + if (scheme === candidateUri.scheme) { + ret = 10; + } else if (scheme === "*") { + ret = 5; + } else { + return 0; + } + } + if (language82) { + if (language82 === candidateLanguage) { + ret = 10; + } else if (language82 === "*") { + ret = Math.max(ret, 5); + } else { + return 0; + } + } + if (notebookType) { + if (notebookType === candidateNotebookType) { + ret = 10; + } else if (notebookType === "*" && candidateNotebookType !== void 0) { + ret = Math.max(ret, 5); + } else { + return 0; + } + } + if (pattern) { + let normalizedPattern; + if (typeof pattern === "string") { + normalizedPattern = pattern; + } else { + normalizedPattern = __spreadProps(__spreadValues({}, pattern), { base: normalize(pattern.base) }); + } + if (normalizedPattern === candidateUri.fsPath || match(normalizedPattern, candidateUri.fsPath)) { + ret = 10; + } else { + return 0; + } + } + return ret; + } else { + return 0; + } +} +var init_languageSelector = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languageSelector.js"() { + init_glob(); + init_path(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languageFeatureRegistry.js +function isExclusive(selector) { + if (typeof selector === "string") { + return false; + } else if (Array.isArray(selector)) { + return selector.every(isExclusive); + } else { + return !!selector.exclusive; + } +} +function isBuiltinSelector(selector) { + if (typeof selector === "string") { + return false; + } + if (Array.isArray(selector)) { + return selector.some(isBuiltinSelector); + } + return Boolean(selector.isBuiltin); +} +var MatchCandidate, LanguageFeatureRegistry; +var init_languageFeatureRegistry = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languageFeatureRegistry.js"() { + init_event(); + init_lifecycle(); + init_model2(); + init_languageSelector(); + MatchCandidate = class { + constructor(uri, languageId, notebookUri, notebookType) { + this.uri = uri; + this.languageId = languageId; + this.notebookUri = notebookUri; + this.notebookType = notebookType; + } + equals(other) { + var _a10, _b4; + return this.notebookType === other.notebookType && this.languageId === other.languageId && this.uri.toString() === other.uri.toString() && ((_a10 = this.notebookUri) === null || _a10 === void 0 ? void 0 : _a10.toString()) === ((_b4 = other.notebookUri) === null || _b4 === void 0 ? void 0 : _b4.toString()); + } + }; + LanguageFeatureRegistry = class _LanguageFeatureRegistry { + constructor(_notebookInfoResolver) { + this._notebookInfoResolver = _notebookInfoResolver; + this._clock = 0; + this._entries = []; + this._onDidChange = new Emitter(); + this.onDidChange = this._onDidChange.event; + } + register(selector, provider) { + let entry = { + selector, + provider, + _score: -1, + _time: this._clock++ + }; + this._entries.push(entry); + this._lastCandidate = void 0; + this._onDidChange.fire(this._entries.length); + return toDisposable(() => { + if (entry) { + const idx = this._entries.indexOf(entry); + if (idx >= 0) { + this._entries.splice(idx, 1); + this._lastCandidate = void 0; + this._onDidChange.fire(this._entries.length); + entry = void 0; + } + } + }); + } + has(model) { + return this.all(model).length > 0; + } + all(model) { + if (!model) { + return []; + } + this._updateScores(model); + const result = []; + for (const entry of this._entries) { + if (entry._score > 0) { + result.push(entry.provider); + } + } + return result; + } + ordered(model) { + const result = []; + this._orderedForEach(model, (entry) => result.push(entry.provider)); + return result; + } + orderedGroups(model) { + const result = []; + let lastBucket; + let lastBucketScore; + this._orderedForEach(model, (entry) => { + if (lastBucket && lastBucketScore === entry._score) { + lastBucket.push(entry.provider); + } else { + lastBucketScore = entry._score; + lastBucket = [entry.provider]; + result.push(lastBucket); + } + }); + return result; + } + _orderedForEach(model, callback) { + this._updateScores(model); + for (const entry of this._entries) { + if (entry._score > 0) { + callback(entry); + } + } + } + _updateScores(model) { + var _a10, _b4; + const notebookInfo = (_a10 = this._notebookInfoResolver) === null || _a10 === void 0 ? void 0 : _a10.call(this, model.uri); + const candidate = notebookInfo ? new MatchCandidate(model.uri, model.getLanguageId(), notebookInfo.uri, notebookInfo.type) : new MatchCandidate(model.uri, model.getLanguageId(), void 0, void 0); + if ((_b4 = this._lastCandidate) === null || _b4 === void 0 ? void 0 : _b4.equals(candidate)) { + return; + } + this._lastCandidate = candidate; + for (const entry of this._entries) { + entry._score = score2(entry.selector, candidate.uri, candidate.languageId, shouldSynchronizeModel(model), candidate.notebookUri, candidate.notebookType); + if (isExclusive(entry.selector) && entry._score > 0) { + for (const entry2 of this._entries) { + entry2._score = 0; + } + entry._score = 1e3; + break; + } + } + this._entries.sort(_LanguageFeatureRegistry._compareByScoreAndTime); + } + static _compareByScoreAndTime(a3, b) { + if (a3._score < b._score) { + return 1; + } else if (a3._score > b._score) { + return -1; + } + if (isBuiltinSelector(a3.selector) && !isBuiltinSelector(b.selector)) { + return 1; + } else if (!isBuiltinSelector(a3.selector) && isBuiltinSelector(b.selector)) { + return -1; + } + if (a3._time < b._time) { + return 1; + } else if (a3._time > b._time) { + return -1; + } else { + return 0; + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/languageFeaturesService.js +var LanguageFeaturesService; +var init_languageFeaturesService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/languageFeaturesService.js"() { + init_languageFeatureRegistry(); + init_languageFeatures(); + init_extensions(); + LanguageFeaturesService = class { + constructor() { + this.referenceProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.renameProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.newSymbolNamesProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.codeActionProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.definitionProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.typeDefinitionProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.declarationProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.implementationProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.documentSymbolProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.inlayHintsProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.colorProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.codeLensProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.documentFormattingEditProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.documentRangeFormattingEditProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.onTypeFormattingEditProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.signatureHelpProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.hoverProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.documentHighlightProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.multiDocumentHighlightProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.selectionRangeProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.foldingRangeProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.linkProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.inlineCompletionsProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.inlineEditProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.completionProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.linkedEditingRangeProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.documentRangeSemanticTokensProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.documentSemanticTokensProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.documentDropEditProvider = new LanguageFeatureRegistry(this._score.bind(this)); + this.documentPasteEditProvider = new LanguageFeatureRegistry(this._score.bind(this)); + } + _score(uri) { + var _a10; + return (_a10 = this._notebookTypeResolver) === null || _a10 === void 0 ? void 0 : _a10.call(this, uri); + } + }; + registerSingleton( + ILanguageFeaturesService, + LanguageFeaturesService, + 1 + /* InstantiationType.Delayed */ + ); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/hover/browser/hover.js +var __decorate21, __param20, IHoverService, WorkbenchHoverDelegate; +var init_hover = __esm({ + "node_modules/monaco-editor/esm/vs/platform/hover/browser/hover.js"() { + init_instantiation(); + init_lifecycle(); + init_configuration(); + init_dom(); + __decorate21 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param20 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + IHoverService = createDecorator("hoverService"); + WorkbenchHoverDelegate = class WorkbenchHoverDelegate2 extends Disposable { + get delay() { + if (this.isInstantlyHovering()) { + return 0; + } + return this._delay; + } + constructor(placement, instantHover, overrideOptions = {}, configurationService, hoverService) { + super(); + this.placement = placement; + this.instantHover = instantHover; + this.overrideOptions = overrideOptions; + this.configurationService = configurationService; + this.hoverService = hoverService; + this.lastHoverHideTime = 0; + this.timeLimit = 200; + this.hoverDisposables = this._register(new DisposableStore()); + this._delay = this.configurationService.getValue("workbench.hover.delay"); + this._register(this.configurationService.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration("workbench.hover.delay")) { + this._delay = this.configurationService.getValue("workbench.hover.delay"); + } + })); + } + showHover(options2, focus) { + const overrideOptions = typeof this.overrideOptions === "function" ? this.overrideOptions(options2, focus) : this.overrideOptions; + this.hoverDisposables.clear(); + const targets = isHTMLElement(options2.target) ? [options2.target] : options2.target.targetElements; + for (const target of targets) { + this.hoverDisposables.add(addStandardDisposableListener(target, "keydown", (e) => { + if (e.equals( + 9 + /* KeyCode.Escape */ + )) { + this.hoverService.hideHover(); + } + })); + } + const id = isHTMLElement(options2.content) ? void 0 : options2.content.toString(); + return this.hoverService.showHover(__spreadProps(__spreadValues(__spreadValues({}, options2), overrideOptions), { + persistence: __spreadValues({ + hideOnKeyDown: true + }, overrideOptions.persistence), + id, + appearance: __spreadValues(__spreadProps(__spreadValues({}, options2.appearance), { + compact: true, + skipFadeInAnimation: this.isInstantlyHovering() + }), overrideOptions.appearance) + }), focus); + } + isInstantlyHovering() { + return this.instantHover && Date.now() - this.lastHoverHideTime < this.timeLimit; + } + onDidHideHover() { + this.hoverDisposables.clear(); + if (this.instantHover) { + this.lastHoverHideTime = Date.now(); + } + } + }; + WorkbenchHoverDelegate = __decorate21([ + __param20(3, IConfigurationService), + __param20(4, IHoverService) + ], WorkbenchHoverDelegate); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/contextview/browser/contextView.js +var IContextViewService, IContextMenuService; +var init_contextView = __esm({ + "node_modules/monaco-editor/esm/vs/platform/contextview/browser/contextView.js"() { + init_instantiation(); + IContextViewService = createDecorator("contextViewService"); + IContextMenuService = createDecorator("contextMenuService"); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/services/hoverService/hover.css +var init_hover2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/services/hoverService/hover.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/hover/hoverWidget.css +var init_hoverWidget = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/hover/hoverWidget.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/hover/hoverWidget.js +function getHoverAccessibleViewHint(shouldHaveHint, keybinding) { + return shouldHaveHint && keybinding ? localize("acessibleViewHint", "Inspect this in the accessible view with {0}.", keybinding) : shouldHaveHint ? localize("acessibleViewHintNoKbOpen", "Inspect this in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding.") : ""; +} +var $2, HoverWidget, HoverAction, ClickAction, KeyDownAction; +var init_hoverWidget2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/hover/hoverWidget.js"() { + init_dom(); + init_keyboardEvent(); + init_scrollableElement(); + init_lifecycle(); + init_hoverWidget(); + init_nls(); + $2 = $; + HoverWidget = class extends Disposable { + constructor() { + super(); + this.containerDomNode = document.createElement("div"); + this.containerDomNode.className = "monaco-hover"; + this.containerDomNode.tabIndex = 0; + this.containerDomNode.setAttribute("role", "tooltip"); + this.contentsDomNode = document.createElement("div"); + this.contentsDomNode.className = "monaco-hover-content"; + this.scrollbar = this._register(new DomScrollableElement(this.contentsDomNode, { + consumeMouseWheelIfScrollbarIsNeeded: true + })); + this.containerDomNode.appendChild(this.scrollbar.getDomNode()); + } + onContentsChanged() { + this.scrollbar.scanDomNode(); + } + }; + HoverAction = class _HoverAction extends Disposable { + static render(parent, actionOptions, keybindingLabel) { + return new _HoverAction(parent, actionOptions, keybindingLabel); + } + constructor(parent, actionOptions, keybindingLabel) { + super(); + this.actionContainer = append(parent, $2("div.action-container")); + this.actionContainer.setAttribute("tabindex", "0"); + this.action = append(this.actionContainer, $2("a.action")); + this.action.setAttribute("role", "button"); + if (actionOptions.iconClass) { + append(this.action, $2(`span.icon.${actionOptions.iconClass}`)); + } + const label = append(this.action, $2("span")); + label.textContent = keybindingLabel ? `${actionOptions.label} (${keybindingLabel})` : actionOptions.label; + this._store.add(new ClickAction(this.actionContainer, actionOptions.run)); + this._store.add(new KeyDownAction(this.actionContainer, actionOptions.run, [ + 3, + 10 + /* KeyCode.Space */ + ])); + this.setEnabled(true); + } + setEnabled(enabled) { + if (enabled) { + this.actionContainer.classList.remove("disabled"); + this.actionContainer.removeAttribute("aria-disabled"); + } else { + this.actionContainer.classList.add("disabled"); + this.actionContainer.setAttribute("aria-disabled", "true"); + } + } + }; + ClickAction = class extends Disposable { + constructor(container, run) { + super(); + this._register(addDisposableListener(container, EventType.CLICK, (e) => { + e.stopPropagation(); + e.preventDefault(); + run(container); + })); + } + }; + KeyDownAction = class extends Disposable { + constructor(container, run, keyCodes) { + super(); + this._register(addDisposableListener(container, EventType.KEY_DOWN, (e) => { + const event = new StandardKeyboardEvent(e); + if (keyCodes.some((keyCode) => event.equals(keyCode))) { + e.stopPropagation(); + e.preventDefault(); + run(container); + } + })); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/opener/common/opener.js +function extractSelection(uri) { + let selection = void 0; + const match2 = /^L?(\d+)(?:,(\d+))?(-L?(\d+)(?:,(\d+))?)?/.exec(uri.fragment); + if (match2) { + selection = { + startLineNumber: parseInt(match2[1]), + startColumn: match2[2] ? parseInt(match2[2]) : 1, + endLineNumber: match2[4] ? parseInt(match2[4]) : void 0, + endColumn: match2[4] ? match2[5] ? parseInt(match2[5]) : 1 : void 0 + }; + uri = uri.with({ fragment: "" }); + } + return { selection, uri }; +} +var IOpenerService; +var init_opener = __esm({ + "node_modules/monaco-editor/esm/vs/platform/opener/common/opener.js"() { + init_instantiation(); + IOpenerService = createDecorator("openerService"); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/formattedTextRenderer.js +function renderText(text2, options2 = {}) { + const element = createElement(options2); + element.textContent = text2; + return element; +} +function renderFormattedText(formattedText, options2 = {}) { + const element = createElement(options2); + _renderFormattedText(element, parseFormattedText(formattedText, !!options2.renderCodeSegments), options2.actionHandler, options2.renderCodeSegments); + return element; +} +function createElement(options2) { + const tagName = options2.inline ? "span" : "div"; + const element = document.createElement(tagName); + if (options2.className) { + element.className = options2.className; + } + return element; +} +function _renderFormattedText(element, treeNode, actionHandler, renderCodeSegments) { + let child; + if (treeNode.type === 2) { + child = document.createTextNode(treeNode.content || ""); + } else if (treeNode.type === 3) { + child = document.createElement("b"); + } else if (treeNode.type === 4) { + child = document.createElement("i"); + } else if (treeNode.type === 7 && renderCodeSegments) { + child = document.createElement("code"); + } else if (treeNode.type === 5 && actionHandler) { + const a3 = document.createElement("a"); + actionHandler.disposables.add(addStandardDisposableListener(a3, "click", (event) => { + actionHandler.callback(String(treeNode.index), event); + })); + child = a3; + } else if (treeNode.type === 8) { + child = document.createElement("br"); + } else if (treeNode.type === 1) { + child = element; + } + if (child && element !== child) { + element.appendChild(child); + } + if (child && Array.isArray(treeNode.children)) { + treeNode.children.forEach((nodeChild) => { + _renderFormattedText(child, nodeChild, actionHandler, renderCodeSegments); + }); + } +} +function parseFormattedText(content, parseCodeSegments) { + const root = { + type: 1, + children: [] + }; + let actionViewItemIndex = 0; + let current = root; + const stack = []; + const stream = new StringStream(content); + while (!stream.eos()) { + let next = stream.next(); + const isEscapedFormatType = next === "\\" && formatTagType(stream.peek(), parseCodeSegments) !== 0; + if (isEscapedFormatType) { + next = stream.next(); + } + if (!isEscapedFormatType && isFormatTag(next, parseCodeSegments) && next === stream.peek()) { + stream.advance(); + if (current.type === 2) { + current = stack.pop(); + } + const type = formatTagType(next, parseCodeSegments); + if (current.type === type || current.type === 5 && type === 6) { + current = stack.pop(); + } else { + const newCurrent = { + type, + children: [] + }; + if (type === 5) { + newCurrent.index = actionViewItemIndex; + actionViewItemIndex++; + } + current.children.push(newCurrent); + stack.push(current); + current = newCurrent; + } + } else if (next === "\n") { + if (current.type === 2) { + current = stack.pop(); + } + current.children.push({ + type: 8 + /* FormatType.NewLine */ + }); + } else { + if (current.type !== 2) { + const textCurrent = { + type: 2, + content: next + }; + current.children.push(textCurrent); + stack.push(current); + current = textCurrent; + } else { + current.content += next; + } + } + } + if (current.type === 2) { + current = stack.pop(); + } + if (stack.length) { + } + return root; +} +function isFormatTag(char, supportCodeSegments) { + return formatTagType(char, supportCodeSegments) !== 0; +} +function formatTagType(char, supportCodeSegments) { + switch (char) { + case "*": + return 3; + case "_": + return 4; + case "[": + return 5; + case "]": + return 6; + case "`": + return supportCodeSegments ? 7 : 0; + default: + return 0; + } +} +var StringStream; +var init_formattedTextRenderer = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/formattedTextRenderer.js"() { + init_dom(); + StringStream = class { + constructor(source) { + this.source = source; + this.index = 0; + } + eos() { + return this.index >= this.source.length; + } + next() { + const next = this.peek(); + this.advance(); + return next; + } + peek() { + return this.source[this.index]; + } + advance() { + this.index++; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/iconLabel/iconLabels.js +function renderLabelWithIcons(text2) { + const elements = new Array(); + let match2; + let textStart = 0, textStop = 0; + while ((match2 = labelWithIconsRegex.exec(text2)) !== null) { + textStop = match2.index || 0; + if (textStart < textStop) { + elements.push(text2.substring(textStart, textStop)); + } + textStart = (match2.index || 0) + match2[0].length; + const [, escaped, codicon] = match2; + elements.push(escaped ? `$(${codicon})` : renderIcon({ id: codicon })); + } + if (textStart < text2.length) { + elements.push(text2.substring(textStart)); + } + return elements; +} +function renderIcon(icon) { + const node = $(`span`); + node.classList.add(...ThemeIcon.asClassNameArray(icon)); + return node; +} +var labelWithIconsRegex; +var init_iconLabels = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/iconLabel/iconLabels.js"() { + init_dom(); + init_themables(); + labelWithIconsRegex = new RegExp(`(\\\\)?\\$\\((${ThemeIcon.iconNameExpression}(?:${ThemeIcon.iconModifierExpression})?)\\)`, "g"); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/naturalLanguage/korean.js +function getKoreanAltChars(code) { + const result = disassembleKorean(code); + if (result && result.length > 0) { + return new Uint32Array(result); + } + return void 0; +} +function disassembleKorean(code) { + codeBufferLength = 0; + getCodesFromArray( + code, + modernConsonants, + 4352 + /* HangulRangeStartCode.InitialConsonant */ + ); + if (codeBufferLength > 0) { + return codeBuffer.subarray(0, codeBufferLength); + } + getCodesFromArray( + code, + modernVowels, + 4449 + /* HangulRangeStartCode.Vowel */ + ); + if (codeBufferLength > 0) { + return codeBuffer.subarray(0, codeBufferLength); + } + getCodesFromArray( + code, + modernFinalConsonants, + 4520 + /* HangulRangeStartCode.FinalConsonant */ + ); + if (codeBufferLength > 0) { + return codeBuffer.subarray(0, codeBufferLength); + } + getCodesFromArray( + code, + compatibilityJamo, + 12593 + /* HangulRangeStartCode.CompatibilityJamo */ + ); + if (codeBufferLength) { + return codeBuffer.subarray(0, codeBufferLength); + } + if (code >= 44032 && code <= 55203) { + const hangulIndex = code - 44032; + const vowelAndFinalConsonantProduct = hangulIndex % 588; + const initialConsonantIndex = Math.floor(hangulIndex / 588); + const vowelIndex = Math.floor(vowelAndFinalConsonantProduct / 28); + const finalConsonantIndex = vowelAndFinalConsonantProduct % 28 - 1; + if (initialConsonantIndex < modernConsonants.length) { + getCodesFromArray(initialConsonantIndex, modernConsonants, 0); + } else if (4352 + initialConsonantIndex - 12593 < compatibilityJamo.length) { + getCodesFromArray( + 4352 + initialConsonantIndex, + compatibilityJamo, + 12593 + /* HangulRangeStartCode.CompatibilityJamo */ + ); + } + if (vowelIndex < modernVowels.length) { + getCodesFromArray(vowelIndex, modernVowels, 0); + } else if (4449 + vowelIndex - 12593 < compatibilityJamo.length) { + getCodesFromArray( + 4449 + vowelIndex - 12593, + compatibilityJamo, + 12593 + /* HangulRangeStartCode.CompatibilityJamo */ + ); + } + if (finalConsonantIndex >= 0) { + if (finalConsonantIndex < modernFinalConsonants.length) { + getCodesFromArray(finalConsonantIndex, modernFinalConsonants, 0); + } else if (4520 + finalConsonantIndex - 12593 < compatibilityJamo.length) { + getCodesFromArray( + 4520 + finalConsonantIndex - 12593, + compatibilityJamo, + 12593 + /* HangulRangeStartCode.CompatibilityJamo */ + ); + } + } + if (codeBufferLength > 0) { + return codeBuffer.subarray(0, codeBufferLength); + } + } + return void 0; +} +function getCodesFromArray(code, array2, arrayStartIndex) { + if (code >= arrayStartIndex && code < arrayStartIndex + array2.length) { + addCodesToBuffer(array2[code - arrayStartIndex]); + } +} +function addCodesToBuffer(codes) { + if (codes === 0) { + return; + } + codeBuffer[codeBufferLength++] = codes & 255; + if (codes >> 8) { + codeBuffer[codeBufferLength++] = codes >> 8 & 255; + } + if (codes >> 16) { + codeBuffer[codeBufferLength++] = codes >> 16 & 255; + } +} +var codeBufferLength, codeBuffer, modernConsonants, modernVowels, modernFinalConsonants, compatibilityJamo; +var init_korean = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/naturalLanguage/korean.js"() { + codeBufferLength = 0; + codeBuffer = new Uint32Array(10); + modernConsonants = new Uint8Array([ + 114, + // ㄱ + 82, + // ㄲ + 115, + // ㄴ + 101, + // ㄷ + 69, + // ㄸ + 102, + // ㄹ + 97, + // ㅁ + 113, + // ㅂ + 81, + // ㅃ + 116, + // ㅅ + 84, + // ㅆ + 100, + // ㅇ + 119, + // ㅈ + 87, + // ㅉ + 99, + // ㅊ + 122, + // ㅋ + 120, + // ㅌ + 118, + // ㅍ + 103 + // ㅎ + ]); + modernVowels = new Uint16Array([ + 107, + // -> ㅏ + 111, + // -> ㅐ + 105, + // -> ㅑ + 79, + // -> ㅒ + 106, + // -> ㅓ + 112, + // -> ㅔ + 117, + // -> ㅕ + 80, + // -> ㅖ + 104, + // -> ㅗ + 27496, + // -> ㅘ + 28520, + // -> ㅙ + 27752, + // -> ㅚ + 121, + // -> ㅛ + 110, + // -> ㅜ + 27246, + // -> ㅝ + 28782, + // -> ㅞ + 27758, + // -> ㅟ + 98, + // -> ㅠ + 109, + // -> ㅡ + 27757, + // -> ㅢ + 108 + // -> ㅣ + ]); + modernFinalConsonants = new Uint16Array([ + 114, + // ㄱ + 82, + // ㄲ + 29810, + // ㄳ + 115, + // ㄴ + 30579, + // ㄵ + 26483, + // ㄶ + 101, + // ㄷ + 102, + // ㄹ + 29286, + // ㄺ + 24934, + // ㄻ + 29030, + // ㄼ + 29798, + // ㄽ + 30822, + // ㄾ + 30310, + // ㄿ + 26470, + // ㅀ + 97, + // ㅁ + 113, + // ㅂ + 29809, + // ㅄ + 116, + // ㅅ + 84, + // ㅆ + 100, + // ㅇ + 119, + // ㅈ + 99, + // ㅊ + 122, + // ㅋ + 120, + // ㅌ + 118, + // ㅍ + 103 + // ㅎ + ]); + compatibilityJamo = new Uint16Array([ + 114, + // ㄱ + 82, + // ㄲ + 29810, + // ㄳ + 115, + // ㄴ + 30579, + // ㄵ + 26483, + // ㄶ + 101, + // ㄷ + 69, + // ㄸ + 102, + // ㄹ + 29286, + // ㄺ + 24934, + // ㄻ + 29030, + // ㄼ + 29798, + // ㄽ + 30822, + // ㄾ + 30310, + // ㄿ + 26470, + // ㅀ + 97, + // ㅁ + 113, + // ㅂ + 81, + // ㅃ + 29809, + // ㅄ + 116, + // ㅅ + 84, + // ㅆ + 100, + // ㅇ + 119, + // ㅈ + 87, + // ㅉ + 99, + // ㅊ + 122, + // ㅋ + 120, + // ㅌ + 118, + // ㅍ + 103, + // ㅎ + 107, + // ㅏ + 111, + // ㅐ + 105, + // ㅑ + 79, + // ㅒ + 106, + // ㅓ + 112, + // ㅔ + 117, + // ㅕ + 80, + // ㅖ + 104, + // ㅗ + 27496, + // ㅘ + 28520, + // ㅙ + 27752, + // ㅚ + 121, + // ㅛ + 110, + // ㅜ + 27246, + // ㅝ + 28782, + // ㅞ + 27758, + // ㅟ + 98, + // ㅠ + 109, + // ㅡ + 27757, + // ㅢ + 108 + // ㅣ + // HF: Hangul Filler (everything after this is archaic) + // ㅥ + // ㅦ + // ㅧ + // ㅨ + // ㅩ + // ㅪ + // ㅫ + // ㅬ + // ㅮ + // ㅯ + // ㅰ + // ㅱ + // ㅲ + // ㅳ + // ㅴ + // ㅵ + // ㅶ + // ㅷ + // ㅸ + // ㅹ + // ㅺ + // ㅻ + // ㅼ + // ㅽ + // ㅾ + // ㅿ + // ㆀ + // ㆁ + // ㆂ + // ㆃ + // ㆄ + // ㆅ + // ㆆ + // ㆇ + // ㆈ + // ㆉ + // ㆊ + // ㆋ + // ㆌ + // ㆍ + // ㆎ + ]); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/filters.js +function or(...filter) { + return function(word, wordToMatchAgainst) { + for (let i = 0, len = filter.length; i < len; i++) { + const match2 = filter[i](word, wordToMatchAgainst); + if (match2) { + return match2; + } + } + return null; + }; +} +function _matchesPrefix(ignoreCase, word, wordToMatchAgainst) { + if (!wordToMatchAgainst || wordToMatchAgainst.length < word.length) { + return null; + } + let matches2; + if (ignoreCase) { + matches2 = startsWithIgnoreCase(wordToMatchAgainst, word); + } else { + matches2 = wordToMatchAgainst.indexOf(word) === 0; + } + if (!matches2) { + return null; + } + return word.length > 0 ? [{ start: 0, end: word.length }] : []; +} +function matchesContiguousSubString(word, wordToMatchAgainst) { + const index = wordToMatchAgainst.toLowerCase().indexOf(word.toLowerCase()); + if (index === -1) { + return null; + } + return [{ start: index, end: index + word.length }]; +} +function matchesSubString(word, wordToMatchAgainst) { + return _matchesSubString(word.toLowerCase(), wordToMatchAgainst.toLowerCase(), 0, 0); +} +function _matchesSubString(word, wordToMatchAgainst, i, j) { + if (i === word.length) { + return []; + } else if (j === wordToMatchAgainst.length) { + return null; + } else { + if (word[i] === wordToMatchAgainst[j]) { + let result = null; + if (result = _matchesSubString(word, wordToMatchAgainst, i + 1, j + 1)) { + return join({ start: j, end: j + 1 }, result); + } + return null; + } + return _matchesSubString(word, wordToMatchAgainst, i, j + 1); + } +} +function isLower(code) { + return 97 <= code && code <= 122; +} +function isUpper(code) { + return 65 <= code && code <= 90; +} +function isNumber2(code) { + return 48 <= code && code <= 57; +} +function isWhitespace(code) { + return code === 32 || code === 9 || code === 10 || code === 13; +} +function isWordSeparator(code) { + return isWhitespace(code) || wordSeparators.has(code); +} +function charactersMatch(codeA, codeB) { + return codeA === codeB || isWordSeparator(codeA) && isWordSeparator(codeB); +} +function getAlternateCodes(code) { + if (alternateCharsCache.has(code)) { + return alternateCharsCache.get(code); + } + let result; + const codes = getKoreanAltChars(code); + if (codes) { + result = codes; + } + alternateCharsCache.set(code, result); + return result; +} +function isAlphanumeric(code) { + return isLower(code) || isUpper(code) || isNumber2(code); +} +function join(head, tail3) { + if (tail3.length === 0) { + tail3 = [head]; + } else if (head.end === tail3[0].start) { + tail3[0].start = head.start; + } else { + tail3.unshift(head); + } + return tail3; +} +function nextAnchor(camelCaseWord, start) { + for (let i = start; i < camelCaseWord.length; i++) { + const c = camelCaseWord.charCodeAt(i); + if (isUpper(c) || isNumber2(c) || i > 0 && !isAlphanumeric(camelCaseWord.charCodeAt(i - 1))) { + return i; + } + } + return camelCaseWord.length; +} +function _matchesCamelCase(word, camelCaseWord, i, j) { + if (i === word.length) { + return []; + } else if (j === camelCaseWord.length) { + return null; + } else if (word[i] !== camelCaseWord[j].toLowerCase()) { + return null; + } else { + let result = null; + let nextUpperIndex = j + 1; + result = _matchesCamelCase(word, camelCaseWord, i + 1, j + 1); + while (!result && (nextUpperIndex = nextAnchor(camelCaseWord, nextUpperIndex)) < camelCaseWord.length) { + result = _matchesCamelCase(word, camelCaseWord, i + 1, nextUpperIndex); + nextUpperIndex++; + } + return result === null ? null : join({ start: j, end: j + 1 }, result); + } +} +function analyzeCamelCaseWord(word) { + let upper = 0, lower = 0, alpha = 0, numeric = 0, code = 0; + for (let i = 0; i < word.length; i++) { + code = word.charCodeAt(i); + if (isUpper(code)) { + upper++; + } + if (isLower(code)) { + lower++; + } + if (isAlphanumeric(code)) { + alpha++; + } + if (isNumber2(code)) { + numeric++; + } + } + const upperPercent = upper / word.length; + const lowerPercent = lower / word.length; + const alphaPercent = alpha / word.length; + const numericPercent = numeric / word.length; + return { upperPercent, lowerPercent, alphaPercent, numericPercent }; +} +function isUpperCaseWord(analysis) { + const { upperPercent, lowerPercent } = analysis; + return lowerPercent === 0 && upperPercent > 0.6; +} +function isCamelCaseWord(analysis) { + const { upperPercent, lowerPercent, alphaPercent, numericPercent } = analysis; + return lowerPercent > 0.2 && upperPercent < 0.8 && alphaPercent > 0.6 && numericPercent < 0.2; +} +function isCamelCasePattern(word) { + let upper = 0, lower = 0, code = 0, whitespace = 0; + for (let i = 0; i < word.length; i++) { + code = word.charCodeAt(i); + if (isUpper(code)) { + upper++; + } + if (isLower(code)) { + lower++; + } + if (isWhitespace(code)) { + whitespace++; + } + } + if ((upper === 0 || lower === 0) && whitespace === 0) { + return word.length <= 30; + } else { + return upper <= 5; + } +} +function matchesCamelCase(word, camelCaseWord) { + if (!camelCaseWord) { + return null; + } + camelCaseWord = camelCaseWord.trim(); + if (camelCaseWord.length === 0) { + return null; + } + if (!isCamelCasePattern(word)) { + return null; + } + if (camelCaseWord.length > 60) { + camelCaseWord = camelCaseWord.substring(0, 60); + } + const analysis = analyzeCamelCaseWord(camelCaseWord); + if (!isCamelCaseWord(analysis)) { + if (!isUpperCaseWord(analysis)) { + return null; + } + camelCaseWord = camelCaseWord.toLowerCase(); + } + let result = null; + let i = 0; + word = word.toLowerCase(); + while (i < camelCaseWord.length && (result = _matchesCamelCase(word, camelCaseWord, 0, i)) === null) { + i = nextAnchor(camelCaseWord, i + 1); + } + return result; +} +function matchesWords(word, target, contiguous = false) { + if (!target || target.length === 0) { + return null; + } + let result = null; + let targetIndex = 0; + word = word.toLowerCase(); + target = target.toLowerCase(); + while (targetIndex < target.length) { + result = _matchesWords(word, target, 0, targetIndex, contiguous); + if (result !== null) { + break; + } + targetIndex = nextWord(target, targetIndex + 1); + } + return result; +} +function _matchesWords(word, target, wordIndex, targetIndex, contiguous) { + let targetIndexOffset = 0; + if (wordIndex === word.length) { + return []; + } else if (targetIndex === target.length) { + return null; + } else if (!charactersMatch(word.charCodeAt(wordIndex), target.charCodeAt(targetIndex))) { + const altChars = getAlternateCodes(word.charCodeAt(wordIndex)); + if (!altChars) { + return null; + } + for (let k = 0; k < altChars.length; k++) { + if (!charactersMatch(altChars[k], target.charCodeAt(targetIndex + k))) { + return null; + } + } + targetIndexOffset += altChars.length - 1; + } + let result = null; + let nextWordIndex = targetIndex + targetIndexOffset + 1; + result = _matchesWords(word, target, wordIndex + 1, nextWordIndex, contiguous); + if (!contiguous) { + while (!result && (nextWordIndex = nextWord(target, nextWordIndex)) < target.length) { + result = _matchesWords(word, target, wordIndex + 1, nextWordIndex, contiguous); + nextWordIndex++; + } + } + if (!result) { + return null; + } + if (word.charCodeAt(wordIndex) !== target.charCodeAt(targetIndex)) { + const altChars = getAlternateCodes(word.charCodeAt(wordIndex)); + if (!altChars) { + return result; + } + for (let k = 0; k < altChars.length; k++) { + if (altChars[k] !== target.charCodeAt(targetIndex + k)) { + return result; + } + } + } + return join({ start: targetIndex, end: targetIndex + targetIndexOffset + 1 }, result); +} +function nextWord(word, start) { + for (let i = start; i < word.length; i++) { + if (isWordSeparator(word.charCodeAt(i)) || i > 0 && isWordSeparator(word.charCodeAt(i - 1))) { + return i; + } + } + return word.length; +} +function matchesFuzzy(word, wordToMatchAgainst, enableSeparateSubstringMatching = false) { + if (typeof word !== "string" || typeof wordToMatchAgainst !== "string") { + return null; + } + let regexp = fuzzyRegExpCache.get(word); + if (!regexp) { + regexp = new RegExp(convertSimple2RegExpPattern(word), "i"); + fuzzyRegExpCache.set(word, regexp); + } + const match2 = regexp.exec(wordToMatchAgainst); + if (match2) { + return [{ start: match2.index, end: match2.index + match2[0].length }]; + } + return enableSeparateSubstringMatching ? fuzzySeparateFilter(word, wordToMatchAgainst) : fuzzyContiguousFilter(word, wordToMatchAgainst); +} +function matchesFuzzy2(pattern, word) { + const score3 = fuzzyScore(pattern, pattern.toLowerCase(), 0, word, word.toLowerCase(), 0, { firstMatchCanBeWeak: true, boostFullMatch: true }); + return score3 ? createMatches(score3) : null; +} +function anyScore(pattern, lowPattern, patternPos, word, lowWord, wordPos) { + const max = Math.min(13, pattern.length); + for (; patternPos < max; patternPos++) { + const result = fuzzyScore(pattern, lowPattern, patternPos, word, lowWord, wordPos, { firstMatchCanBeWeak: true, boostFullMatch: true }); + if (result) { + return result; + } + } + return [0, wordPos]; +} +function createMatches(score3) { + if (typeof score3 === "undefined") { + return []; + } + const res = []; + const wordPos = score3[1]; + for (let i = score3.length - 1; i > 1; i--) { + const pos = score3[i] + wordPos; + const last = res[res.length - 1]; + if (last && last.end === pos) { + last.end = pos + 1; + } else { + res.push({ start: pos, end: pos + 1 }); + } + } + return res; +} +function initTable() { + const table = []; + const row = []; + for (let i = 0; i <= _maxLen; i++) { + row[i] = 0; + } + for (let i = 0; i <= _maxLen; i++) { + table.push(row.slice(0)); + } + return table; +} +function initArr(maxLen) { + const row = []; + for (let i = 0; i <= maxLen; i++) { + row[i] = 0; + } + return row; +} +function printTable(table, pattern, patternLen, word, wordLen) { + function pad(s, n, pad2 = " ") { + while (s.length < n) { + s = pad2 + s; + } + return s; + } + let ret = ` | |${word.split("").map((c) => pad(c, 3)).join("|")} +`; + for (let i = 0; i <= patternLen; i++) { + if (i === 0) { + ret += " |"; + } else { + ret += `${pattern[i - 1]}|`; + } + ret += table[i].slice(0, wordLen + 1).map((n) => pad(n.toString(), 3)).join("|") + "\n"; + } + return ret; +} +function printTables(pattern, patternStart, word, wordStart) { + pattern = pattern.substr(patternStart); + word = word.substr(wordStart); + console.log(printTable(_table, pattern, pattern.length, word, word.length)); + console.log(printTable(_arrows, pattern, pattern.length, word, word.length)); + console.log(printTable(_diag, pattern, pattern.length, word, word.length)); +} +function isSeparatorAtPos(value, index) { + if (index < 0 || index >= value.length) { + return false; + } + const code = value.codePointAt(index); + switch (code) { + case 95: + case 45: + case 46: + case 32: + case 47: + case 92: + case 39: + case 34: + case 58: + case 36: + case 60: + case 62: + case 40: + case 41: + case 91: + case 93: + case 123: + case 125: + return true; + case void 0: + return false; + default: + if (isEmojiImprecise(code)) { + return true; + } + return false; + } +} +function isWhitespaceAtPos(value, index) { + if (index < 0 || index >= value.length) { + return false; + } + const code = value.charCodeAt(index); + switch (code) { + case 32: + case 9: + return true; + default: + return false; + } +} +function isUpperCaseAtPos(pos, word, wordLow) { + return word[pos] !== wordLow[pos]; +} +function isPatternInWord(patternLow, patternPos, patternLen, wordLow, wordPos, wordLen, fillMinWordPosArr = false) { + while (patternPos < patternLen && wordPos < wordLen) { + if (patternLow[patternPos] === wordLow[wordPos]) { + if (fillMinWordPosArr) { + _minWordMatchPos[patternPos] = wordPos; + } + patternPos += 1; + } + wordPos += 1; + } + return patternPos === patternLen; +} +function fuzzyScore(pattern, patternLow, patternStart, word, wordLow, wordStart, options2 = FuzzyScoreOptions.default) { + const patternLen = pattern.length > _maxLen ? _maxLen : pattern.length; + const wordLen = word.length > _maxLen ? _maxLen : word.length; + if (patternStart >= patternLen || wordStart >= wordLen || patternLen - patternStart > wordLen - wordStart) { + return void 0; + } + if (!isPatternInWord(patternLow, patternStart, patternLen, wordLow, wordStart, wordLen, true)) { + return void 0; + } + _fillInMaxWordMatchPos(patternLen, wordLen, patternStart, wordStart, patternLow, wordLow); + let row = 1; + let column = 1; + let patternPos = patternStart; + let wordPos = wordStart; + const hasStrongFirstMatch = [false]; + for (row = 1, patternPos = patternStart; patternPos < patternLen; row++, patternPos++) { + const minWordMatchPos = _minWordMatchPos[patternPos]; + const maxWordMatchPos = _maxWordMatchPos[patternPos]; + const nextMaxWordMatchPos = patternPos + 1 < patternLen ? _maxWordMatchPos[patternPos + 1] : wordLen; + for (column = minWordMatchPos - wordStart + 1, wordPos = minWordMatchPos; wordPos < nextMaxWordMatchPos; column++, wordPos++) { + let score3 = Number.MIN_SAFE_INTEGER; + let canComeDiag = false; + if (wordPos <= maxWordMatchPos) { + score3 = _doScore(pattern, patternLow, patternPos, patternStart, word, wordLow, wordPos, wordLen, wordStart, _diag[row - 1][column - 1] === 0, hasStrongFirstMatch); + } + let diagScore = 0; + if (score3 !== Number.MAX_SAFE_INTEGER) { + canComeDiag = true; + diagScore = score3 + _table[row - 1][column - 1]; + } + const canComeLeft = wordPos > minWordMatchPos; + const leftScore = canComeLeft ? _table[row][column - 1] + (_diag[row][column - 1] > 0 ? -5 : 0) : 0; + const canComeLeftLeft = wordPos > minWordMatchPos + 1 && _diag[row][column - 1] > 0; + const leftLeftScore = canComeLeftLeft ? _table[row][column - 2] + (_diag[row][column - 2] > 0 ? -5 : 0) : 0; + if (canComeLeftLeft && (!canComeLeft || leftLeftScore >= leftScore) && (!canComeDiag || leftLeftScore >= diagScore)) { + _table[row][column] = leftLeftScore; + _arrows[row][column] = 3; + _diag[row][column] = 0; + } else if (canComeLeft && (!canComeDiag || leftScore >= diagScore)) { + _table[row][column] = leftScore; + _arrows[row][column] = 2; + _diag[row][column] = 0; + } else if (canComeDiag) { + _table[row][column] = diagScore; + _arrows[row][column] = 1; + _diag[row][column] = _diag[row - 1][column - 1] + 1; + } else { + throw new Error(`not possible`); + } + } + } + if (_debug) { + printTables(pattern, patternStart, word, wordStart); + } + if (!hasStrongFirstMatch[0] && !options2.firstMatchCanBeWeak) { + return void 0; + } + row--; + column--; + const result = [_table[row][column], wordStart]; + let backwardsDiagLength = 0; + let maxMatchColumn = 0; + while (row >= 1) { + let diagColumn = column; + do { + const arrow = _arrows[row][diagColumn]; + if (arrow === 3) { + diagColumn = diagColumn - 2; + } else if (arrow === 2) { + diagColumn = diagColumn - 1; + } else { + break; + } + } while (diagColumn >= 1); + if (backwardsDiagLength > 1 && patternLow[patternStart + row - 1] === wordLow[wordStart + column - 1] && !isUpperCaseAtPos(diagColumn + wordStart - 1, word, wordLow) && backwardsDiagLength + 1 > _diag[row][diagColumn]) { + diagColumn = column; + } + if (diagColumn === column) { + backwardsDiagLength++; + } else { + backwardsDiagLength = 1; + } + if (!maxMatchColumn) { + maxMatchColumn = diagColumn; + } + row--; + column = diagColumn - 1; + result.push(column); + } + if (wordLen - wordStart === patternLen && options2.boostFullMatch) { + result[0] += 2; + } + const skippedCharsCount = maxMatchColumn - patternLen; + result[0] -= skippedCharsCount; + return result; +} +function _fillInMaxWordMatchPos(patternLen, wordLen, patternStart, wordStart, patternLow, wordLow) { + let patternPos = patternLen - 1; + let wordPos = wordLen - 1; + while (patternPos >= patternStart && wordPos >= wordStart) { + if (patternLow[patternPos] === wordLow[wordPos]) { + _maxWordMatchPos[patternPos] = wordPos; + patternPos--; + } + wordPos--; + } +} +function _doScore(pattern, patternLow, patternPos, patternStart, word, wordLow, wordPos, wordLen, wordStart, newMatchStart, outFirstMatchStrong) { + if (patternLow[patternPos] !== wordLow[wordPos]) { + return Number.MIN_SAFE_INTEGER; + } + let score3 = 1; + let isGapLocation = false; + if (wordPos === patternPos - patternStart) { + score3 = pattern[patternPos] === word[wordPos] ? 7 : 5; + } else if (isUpperCaseAtPos(wordPos, word, wordLow) && (wordPos === 0 || !isUpperCaseAtPos(wordPos - 1, word, wordLow))) { + score3 = pattern[patternPos] === word[wordPos] ? 7 : 5; + isGapLocation = true; + } else if (isSeparatorAtPos(wordLow, wordPos) && (wordPos === 0 || !isSeparatorAtPos(wordLow, wordPos - 1))) { + score3 = 5; + } else if (isSeparatorAtPos(wordLow, wordPos - 1) || isWhitespaceAtPos(wordLow, wordPos - 1)) { + score3 = 5; + isGapLocation = true; + } + if (score3 > 1 && patternPos === patternStart) { + outFirstMatchStrong[0] = true; + } + if (!isGapLocation) { + isGapLocation = isUpperCaseAtPos(wordPos, word, wordLow) || isSeparatorAtPos(wordLow, wordPos - 1) || isWhitespaceAtPos(wordLow, wordPos - 1); + } + if (patternPos === patternStart) { + if (wordPos > wordStart) { + score3 -= isGapLocation ? 3 : 5; + } + } else { + if (newMatchStart) { + score3 += isGapLocation ? 2 : 0; + } else { + score3 += isGapLocation ? 0 : 1; + } + } + if (wordPos + 1 === wordLen) { + score3 -= isGapLocation ? 3 : 5; + } + return score3; +} +function fuzzyScoreGracefulAggressive(pattern, lowPattern, patternPos, word, lowWord, wordPos, options2) { + return fuzzyScoreWithPermutations(pattern, lowPattern, patternPos, word, lowWord, wordPos, true, options2); +} +function fuzzyScoreWithPermutations(pattern, lowPattern, patternPos, word, lowWord, wordPos, aggressive, options2) { + let top = fuzzyScore(pattern, lowPattern, patternPos, word, lowWord, wordPos, options2); + if (top && !aggressive) { + return top; + } + if (pattern.length >= 3) { + const tries = Math.min(7, pattern.length - 1); + for (let movingPatternPos = patternPos + 1; movingPatternPos < tries; movingPatternPos++) { + const newPattern = nextTypoPermutation(pattern, movingPatternPos); + if (newPattern) { + const candidate = fuzzyScore(newPattern, newPattern.toLowerCase(), patternPos, word, lowWord, wordPos, options2); + if (candidate) { + candidate[0] -= 3; + if (!top || candidate[0] > top[0]) { + top = candidate; + } + } + } + } + } + return top; +} +function nextTypoPermutation(pattern, patternPos) { + if (patternPos + 1 >= pattern.length) { + return void 0; + } + const swap1 = pattern[patternPos]; + const swap2 = pattern[patternPos + 1]; + if (swap1 === swap2) { + return void 0; + } + return pattern.slice(0, patternPos) + swap2 + swap1 + pattern.slice(patternPos + 2); +} +var matchesStrictPrefix, matchesPrefix, wordSeparators, alternateCharsCache, fuzzyContiguousFilter, fuzzySeparateFilter, fuzzyRegExpCache, _maxLen, _minWordMatchPos, _maxWordMatchPos, _diag, _table, _arrows, _debug, FuzzyScore, FuzzyScoreOptions; +var init_filters = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/filters.js"() { + init_map(); + init_korean(); + init_strings(); + matchesStrictPrefix = _matchesPrefix.bind(void 0, false); + matchesPrefix = _matchesPrefix.bind(void 0, true); + wordSeparators = /* @__PURE__ */ new Set(); + "()[]{}<>`'\"-/;:,.?!".split("").forEach((s) => wordSeparators.add(s.charCodeAt(0))); + alternateCharsCache = /* @__PURE__ */ new Map(); + fuzzyContiguousFilter = or(matchesPrefix, matchesCamelCase, matchesContiguousSubString); + fuzzySeparateFilter = or(matchesPrefix, matchesCamelCase, matchesSubString); + fuzzyRegExpCache = new LRUCache(1e4); + _maxLen = 128; + _minWordMatchPos = initArr(2 * _maxLen); + _maxWordMatchPos = initArr(2 * _maxLen); + _diag = initTable(); + _table = initTable(); + _arrows = initTable(); + _debug = false; + (function(FuzzyScore2) { + FuzzyScore2.Default = [-100, 0]; + function isDefault(score3) { + return !score3 || score3.length === 2 && score3[0] === -100 && score3[1] === 0; + } + FuzzyScore2.isDefault = isDefault; + })(FuzzyScore || (FuzzyScore = {})); + FuzzyScoreOptions = class { + constructor(firstMatchCanBeWeak, boostFullMatch) { + this.firstMatchCanBeWeak = firstMatchCanBeWeak; + this.boostFullMatch = boostFullMatch; + } + }; + FuzzyScoreOptions.default = { boostFullMatch: true, firstMatchCanBeWeak: false }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/iconLabels.js +function escapeIcons(text2) { + return text2.replace(escapeIconsRegex, (match2, escaped) => escaped ? match2 : `\\${match2}`); +} +function markdownEscapeEscapedIcons(text2) { + return text2.replace(markdownEscapedIconsRegex, (match2) => `\\${match2}`); +} +function stripIcons(text2) { + if (text2.indexOf(iconStartMarker) === -1) { + return text2; + } + return text2.replace(stripIconsRegex, (match2, preWhitespace, escaped, postWhitespace) => escaped ? match2 : preWhitespace || postWhitespace || ""); +} +function getCodiconAriaLabel(text2) { + if (!text2) { + return ""; + } + return text2.replace(/\$\((.*?)\)/g, (_match, codiconName) => ` ${codiconName} `).trim(); +} +function parseLabelWithIcons(input) { + _parseIconsRegex.lastIndex = 0; + let text2 = ""; + const iconOffsets = []; + let iconsOffset = 0; + while (true) { + const pos = _parseIconsRegex.lastIndex; + const match2 = _parseIconsRegex.exec(input); + const chars = input.substring(pos, match2 === null || match2 === void 0 ? void 0 : match2.index); + if (chars.length > 0) { + text2 += chars; + for (let i = 0; i < chars.length; i++) { + iconOffsets.push(iconsOffset); + } + } + if (!match2) { + break; + } + iconsOffset += match2[0].length; + } + return { text: text2, iconOffsets }; +} +function matchesFuzzyIconAware(query, target, enableSeparateSubstringMatching = false) { + const { text: text2, iconOffsets } = target; + if (!iconOffsets || iconOffsets.length === 0) { + return matchesFuzzy(query, text2, enableSeparateSubstringMatching); + } + const wordToMatchAgainstWithoutIconsTrimmed = ltrim(text2, " "); + const leadingWhitespaceOffset = text2.length - wordToMatchAgainstWithoutIconsTrimmed.length; + const matches2 = matchesFuzzy(query, wordToMatchAgainstWithoutIconsTrimmed, enableSeparateSubstringMatching); + if (matches2) { + for (const match2 of matches2) { + const iconOffset = iconOffsets[match2.start + leadingWhitespaceOffset] + leadingWhitespaceOffset; + match2.start += iconOffset; + match2.end += iconOffset; + } + } + return matches2; +} +var iconStartMarker, iconsRegex, escapeIconsRegex, markdownEscapedIconsRegex, stripIconsRegex, _parseIconsRegex; +var init_iconLabels2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/iconLabels.js"() { + init_filters(); + init_strings(); + init_themables(); + iconStartMarker = "$("; + iconsRegex = new RegExp(`\\$\\(${ThemeIcon.iconNameExpression}(?:${ThemeIcon.iconModifierExpression})?\\)`, "g"); + escapeIconsRegex = new RegExp(`(\\\\)?${iconsRegex.source}`, "g"); + markdownEscapedIconsRegex = new RegExp(`\\\\${iconsRegex.source}`, "g"); + stripIconsRegex = new RegExp(`(\\s)?(\\\\)?${iconsRegex.source}(\\s)?`, "g"); + _parseIconsRegex = new RegExp(`\\$\\(${ThemeIcon.iconNameCharacter}+\\)`, "g"); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/htmlContent.js +function isEmptyMarkdownString(oneOrMany) { + if (isMarkdownString(oneOrMany)) { + return !oneOrMany.value; + } else if (Array.isArray(oneOrMany)) { + return oneOrMany.every(isEmptyMarkdownString); + } else { + return true; + } +} +function isMarkdownString(thing) { + if (thing instanceof MarkdownString) { + return true; + } else if (thing && typeof thing === "object") { + return typeof thing.value === "string" && (typeof thing.isTrusted === "boolean" || typeof thing.isTrusted === "object" || thing.isTrusted === void 0) && (typeof thing.supportThemeIcons === "boolean" || thing.supportThemeIcons === void 0); + } + return false; +} +function markdownStringEqual(a3, b) { + if (a3 === b) { + return true; + } else if (!a3 || !b) { + return false; + } else { + return a3.value === b.value && a3.isTrusted === b.isTrusted && a3.supportThemeIcons === b.supportThemeIcons && a3.supportHtml === b.supportHtml && (a3.baseUri === b.baseUri || !!a3.baseUri && !!b.baseUri && isEqual(URI.from(a3.baseUri), URI.from(b.baseUri))); + } +} +function escapeMarkdownSyntaxTokens(text2) { + return text2.replace(/[\\`*_{}[\]()#+\-!~]/g, "\\$&"); +} +function appendEscapedMarkdownCodeBlockFence(code, langId) { + var _a10, _b4; + const longestFenceLength = (_b4 = (_a10 = code.match(/^`+/gm)) === null || _a10 === void 0 ? void 0 : _a10.reduce((a3, b) => a3.length > b.length ? a3 : b).length) !== null && _b4 !== void 0 ? _b4 : 0; + const desiredFenceLength = longestFenceLength >= 3 ? longestFenceLength + 1 : 3; + return [ + `${"`".repeat(desiredFenceLength)}${langId}`, + code, + `${"`".repeat(desiredFenceLength)}` + ].join("\n"); +} +function escapeDoubleQuotes(input) { + return input.replace(/"/g, """); +} +function removeMarkdownEscapes(text2) { + if (!text2) { + return text2; + } + return text2.replace(/\\([\\`*_{}[\]()#+\-.!~])/g, "$1"); +} +function parseHrefAndDimensions(href) { + const dimensions = []; + const splitted = href.split("|").map((s) => s.trim()); + href = splitted[0]; + const parameters = splitted[1]; + if (parameters) { + const heightFromParams = /height=(\d+)/.exec(parameters); + const widthFromParams = /width=(\d+)/.exec(parameters); + const height = heightFromParams ? heightFromParams[1] : ""; + const width2 = widthFromParams ? widthFromParams[1] : ""; + const widthIsFinite = isFinite(parseInt(width2)); + const heightIsFinite = isFinite(parseInt(height)); + if (widthIsFinite) { + dimensions.push(`width="${width2}"`); + } + if (heightIsFinite) { + dimensions.push(`height="${height}"`); + } + } + return { href, dimensions }; +} +var MarkdownString; +var init_htmlContent = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/htmlContent.js"() { + init_errors(); + init_iconLabels2(); + init_resources(); + init_strings(); + init_uri(); + MarkdownString = class { + constructor(value = "", isTrustedOrOptions = false) { + var _a10, _b4, _c2; + this.value = value; + if (typeof this.value !== "string") { + throw illegalArgument("value"); + } + if (typeof isTrustedOrOptions === "boolean") { + this.isTrusted = isTrustedOrOptions; + this.supportThemeIcons = false; + this.supportHtml = false; + } else { + this.isTrusted = (_a10 = isTrustedOrOptions.isTrusted) !== null && _a10 !== void 0 ? _a10 : void 0; + this.supportThemeIcons = (_b4 = isTrustedOrOptions.supportThemeIcons) !== null && _b4 !== void 0 ? _b4 : false; + this.supportHtml = (_c2 = isTrustedOrOptions.supportHtml) !== null && _c2 !== void 0 ? _c2 : false; + } + } + appendText(value, newlineStyle = 0) { + this.value += escapeMarkdownSyntaxTokens(this.supportThemeIcons ? escapeIcons(value) : value).replace(/([ \t]+)/g, (_match, g1) => " ".repeat(g1.length)).replace(/\>/gm, "\\>").replace(/\n/g, newlineStyle === 1 ? "\\\n" : "\n\n"); + return this; + } + appendMarkdown(value) { + this.value += value; + return this; + } + appendCodeblock(langId, code) { + this.value += ` +${appendEscapedMarkdownCodeBlockFence(code, langId)} +`; + return this; + } + appendLink(target, label, title) { + this.value += "["; + this.value += this._escape(label, "]"); + this.value += "]("; + this.value += this._escape(String(target), ")"); + if (title) { + this.value += ` "${this._escape(this._escape(title, '"'), ")")}"`; + } + this.value += ")"; + return this; + } + _escape(value, ch) { + const r = new RegExp(escapeRegExpCharacters(ch), "g"); + return value.replace(r, (match2, offset) => { + if (value.charAt(offset - 1) !== "\\") { + return `\\${match2}`; + } else { + return match2; + } + }); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/idGenerator.js +var IdGenerator, defaultGenerator; +var init_idGenerator = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/idGenerator.js"() { + IdGenerator = class { + constructor(prefix) { + this._prefix = prefix; + this._lastId = 0; + } + nextId() { + return this._prefix + ++this._lastId; + } + }; + defaultGenerator = new IdGenerator("id#"); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/marked/marked.js +var __marked_exports, Lexer, Parser3, Renderer, Slugger, TextRenderer, Tokenizer, getDefaults, lexer, marked, options, parse2, parseInline, parser, setOptions, use, walkTokens; +var init_marked = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/marked/marked.js"() { + __marked_exports = {}; + (function() { + function define2(deps, factory) { + factory(__marked_exports); + } + define2.amd = true; + (function(global2, factory) { + typeof define2 === "function" && define2.amd ? define2(["exports"], factory) : typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : (global2 = typeof globalThis !== "undefined" ? globalThis : global2 || self, factory(global2.marked = {})); + })(this, function(exports2) { + "use strict"; + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; + } + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + return arr2; + } + function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + if (it) return (it = it.call(o)).next.bind(it); + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function() { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + function getDefaults2() { + return { + async: false, + baseUrl: null, + breaks: false, + extensions: null, + gfm: true, + headerIds: true, + headerPrefix: "", + highlight: null, + langPrefix: "language-", + mangle: true, + pedantic: false, + renderer: null, + sanitize: false, + sanitizer: null, + silent: false, + smartLists: false, + smartypants: false, + tokenizer: null, + walkTokens: null, + xhtml: false + }; + } + exports2.defaults = getDefaults2(); + function changeDefaults(newDefaults) { + exports2.defaults = newDefaults; + } + var escapeTest = /[&<>"']/; + var escapeReplace = /[&<>"']/g; + var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/; + var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g; + var escapeReplacements = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'" + }; + var getEscapeReplacement = function getEscapeReplacement2(ch) { + return escapeReplacements[ch]; + }; + function escape2(html2, encode) { + if (encode) { + if (escapeTest.test(html2)) { + return html2.replace(escapeReplace, getEscapeReplacement); + } + } else { + if (escapeTestNoEncode.test(html2)) { + return html2.replace(escapeReplaceNoEncode, getEscapeReplacement); + } + } + return html2; + } + var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig; + function unescape3(html2) { + return html2.replace(unescapeTest, function(_, n) { + n = n.toLowerCase(); + if (n === "colon") return ":"; + if (n.charAt(0) === "#") { + return n.charAt(1) === "x" ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1)); + } + return ""; + }); + } + var caret = /(^|[^\[])\^/g; + function edit(regex, opt) { + regex = typeof regex === "string" ? regex : regex.source; + opt = opt || ""; + var obj = { + replace: function replace(name, val) { + val = val.source || val; + val = val.replace(caret, "$1"); + regex = regex.replace(name, val); + return obj; + }, + getRegex: function getRegex() { + return new RegExp(regex, opt); + } + }; + return obj; + } + var nonWordAndColonTest = /[^\w:]/g; + var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i; + function cleanUrl(sanitize3, base, href) { + if (sanitize3) { + var prot; + try { + prot = decodeURIComponent(unescape3(href)).replace(nonWordAndColonTest, "").toLowerCase(); + } catch (e) { + return null; + } + if (prot.indexOf("javascript:") === 0 || prot.indexOf("vbscript:") === 0 || prot.indexOf("data:") === 0) { + return null; + } + } + if (base && !originIndependentUrl.test(href)) { + href = resolveUrl(base, href); + } + try { + href = encodeURI(href).replace(/%25/g, "%"); + } catch (e) { + return null; + } + return href; + } + var baseUrls = {}; + var justDomain = /^[^:]+:\/*[^/]*$/; + var protocol = /^([^:]+:)[\s\S]*$/; + var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/; + function resolveUrl(base, href) { + if (!baseUrls[" " + base]) { + if (justDomain.test(base)) { + baseUrls[" " + base] = base + "/"; + } else { + baseUrls[" " + base] = rtrim2(base, "/", true); + } + } + base = baseUrls[" " + base]; + var relativeBase = base.indexOf(":") === -1; + if (href.substring(0, 2) === "//") { + if (relativeBase) { + return href; + } + return base.replace(protocol, "$1") + href; + } else if (href.charAt(0) === "/") { + if (relativeBase) { + return href; + } + return base.replace(domain, "$1") + href; + } else { + return base + href; + } + } + var noopTest = { + exec: function noopTest2() { + } + }; + function merge(obj) { + var i = 1, target, key; + for (; i < arguments.length; i++) { + target = arguments[i]; + for (key in target) { + if (Object.prototype.hasOwnProperty.call(target, key)) { + obj[key] = target[key]; + } + } + } + return obj; + } + function splitCells(tableRow, count) { + var row = tableRow.replace(/\|/g, function(match2, offset, str) { + var escaped = false, curr = offset; + while (--curr >= 0 && str[curr] === "\\") { + escaped = !escaped; + } + if (escaped) { + return "|"; + } else { + return " |"; + } + }), cells = row.split(/ \|/); + var i = 0; + if (!cells[0].trim()) { + cells.shift(); + } + if (cells.length > 0 && !cells[cells.length - 1].trim()) { + cells.pop(); + } + if (cells.length > count) { + cells.splice(count); + } else { + while (cells.length < count) { + cells.push(""); + } + } + for (; i < cells.length; i++) { + cells[i] = cells[i].trim().replace(/\\\|/g, "|"); + } + return cells; + } + function rtrim2(str, c, invert) { + var l = str.length; + if (l === 0) { + return ""; + } + var suffLen = 0; + while (suffLen < l) { + var currChar = str.charAt(l - suffLen - 1); + if (currChar === c && !invert) { + suffLen++; + } else if (currChar !== c && invert) { + suffLen++; + } else { + break; + } + } + return str.slice(0, l - suffLen); + } + function findClosingBracket(str, b) { + if (str.indexOf(b[1]) === -1) { + return -1; + } + var l = str.length; + var level = 0, i = 0; + for (; i < l; i++) { + if (str[i] === "\\") { + i++; + } else if (str[i] === b[0]) { + level++; + } else if (str[i] === b[1]) { + level--; + if (level < 0) { + return i; + } + } + } + return -1; + } + function checkSanitizeDeprecation(opt) { + if (opt && opt.sanitize && !opt.silent) { + console.warn("marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options"); + } + } + function repeatString(pattern, count) { + if (count < 1) { + return ""; + } + var result = ""; + while (count > 1) { + if (count & 1) { + result += pattern; + } + count >>= 1; + pattern += pattern; + } + return result + pattern; + } + function outputLink(cap, link, raw, lexer3) { + var href = link.href; + var title = link.title ? escape2(link.title) : null; + var text2 = cap[1].replace(/\\([\[\]])/g, "$1"); + if (cap[0].charAt(0) !== "!") { + lexer3.state.inLink = true; + var token = { + type: "link", + raw, + href, + title, + text: text2, + tokens: lexer3.inlineTokens(text2) + }; + lexer3.state.inLink = false; + return token; + } + return { + type: "image", + raw, + href, + title, + text: escape2(text2) + }; + } + function indentCodeCompensation(raw, text2) { + var matchIndentToCode = raw.match(/^(\s+)(?:```)/); + if (matchIndentToCode === null) { + return text2; + } + var indentToCode = matchIndentToCode[1]; + return text2.split("\n").map(function(node) { + var matchIndentInNode = node.match(/^\s+/); + if (matchIndentInNode === null) { + return node; + } + var indentInNode = matchIndentInNode[0]; + if (indentInNode.length >= indentToCode.length) { + return node.slice(indentToCode.length); + } + return node; + }).join("\n"); + } + var Tokenizer2 = /* @__PURE__ */ function() { + function Tokenizer3(options3) { + this.options = options3 || exports2.defaults; + } + var _proto = Tokenizer3.prototype; + _proto.space = function space(src) { + var cap = this.rules.block.newline.exec(src); + if (cap && cap[0].length > 0) { + return { + type: "space", + raw: cap[0] + }; + } + }; + _proto.code = function code(src) { + var cap = this.rules.block.code.exec(src); + if (cap) { + var text2 = cap[0].replace(/^ {1,4}/gm, ""); + return { + type: "code", + raw: cap[0], + codeBlockStyle: "indented", + text: !this.options.pedantic ? rtrim2(text2, "\n") : text2 + }; + } + }; + _proto.fences = function fences(src) { + var cap = this.rules.block.fences.exec(src); + if (cap) { + var raw = cap[0]; + var text2 = indentCodeCompensation(raw, cap[3] || ""); + return { + type: "code", + raw, + lang: cap[2] ? cap[2].trim() : cap[2], + text: text2 + }; + } + }; + _proto.heading = function heading(src) { + var cap = this.rules.block.heading.exec(src); + if (cap) { + var text2 = cap[2].trim(); + if (/#$/.test(text2)) { + var trimmed = rtrim2(text2, "#"); + if (this.options.pedantic) { + text2 = trimmed.trim(); + } else if (!trimmed || / $/.test(trimmed)) { + text2 = trimmed.trim(); + } + } + return { + type: "heading", + raw: cap[0], + depth: cap[1].length, + text: text2, + tokens: this.lexer.inline(text2) + }; + } + }; + _proto.hr = function hr(src) { + var cap = this.rules.block.hr.exec(src); + if (cap) { + return { + type: "hr", + raw: cap[0] + }; + } + }; + _proto.blockquote = function blockquote(src) { + var cap = this.rules.block.blockquote.exec(src); + if (cap) { + var text2 = cap[0].replace(/^ *>[ \t]?/gm, ""); + return { + type: "blockquote", + raw: cap[0], + tokens: this.lexer.blockTokens(text2, []), + text: text2 + }; + } + }; + _proto.list = function list(src) { + var cap = this.rules.block.list.exec(src); + if (cap) { + var raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine, line, nextLine, rawLine, itemContents, endEarly; + var bull = cap[1].trim(); + var isordered = bull.length > 1; + var list2 = { + type: "list", + raw: "", + ordered: isordered, + start: isordered ? +bull.slice(0, -1) : "", + loose: false, + items: [] + }; + bull = isordered ? "\\d{1,9}\\" + bull.slice(-1) : "\\" + bull; + if (this.options.pedantic) { + bull = isordered ? bull : "[*+-]"; + } + var itemRegex = new RegExp("^( {0,3}" + bull + ")((?:[ ][^\\n]*)?(?:\\n|$))"); + while (src) { + endEarly = false; + if (!(cap = itemRegex.exec(src))) { + break; + } + if (this.rules.block.hr.test(src)) { + break; + } + raw = cap[0]; + src = src.substring(raw.length); + line = cap[2].split("\n", 1)[0]; + nextLine = src.split("\n", 1)[0]; + if (this.options.pedantic) { + indent = 2; + itemContents = line.trimLeft(); + } else { + indent = cap[2].search(/[^ ]/); + indent = indent > 4 ? 1 : indent; + itemContents = line.slice(indent); + indent += cap[1].length; + } + blankLine = false; + if (!line && /^ *$/.test(nextLine)) { + raw += nextLine + "\n"; + src = src.substring(nextLine.length + 1); + endEarly = true; + } + if (!endEarly) { + var nextBulletRegex = new RegExp("^ {0," + Math.min(3, indent - 1) + "}(?:[*+-]|\\d{1,9}[.)])((?: [^\\n]*)?(?:\\n|$))"); + var hrRegex = new RegExp("^ {0," + Math.min(3, indent - 1) + "}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)"); + var fencesBeginRegex = new RegExp("^ {0," + Math.min(3, indent - 1) + "}(?:```|~~~)"); + var headingBeginRegex = new RegExp("^ {0," + Math.min(3, indent - 1) + "}#"); + while (src) { + rawLine = src.split("\n", 1)[0]; + line = rawLine; + if (this.options.pedantic) { + line = line.replace(/^ {1,4}(?=( {4})*[^ ])/g, " "); + } + if (fencesBeginRegex.test(line)) { + break; + } + if (headingBeginRegex.test(line)) { + break; + } + if (nextBulletRegex.test(line)) { + break; + } + if (hrRegex.test(src)) { + break; + } + if (line.search(/[^ ]/) >= indent || !line.trim()) { + itemContents += "\n" + line.slice(indent); + } else if (!blankLine) { + itemContents += "\n" + line; + } else { + break; + } + if (!blankLine && !line.trim()) { + blankLine = true; + } + raw += rawLine + "\n"; + src = src.substring(rawLine.length + 1); + } + } + if (!list2.loose) { + if (endsWithBlankLine) { + list2.loose = true; + } else if (/\n *\n *$/.test(raw)) { + endsWithBlankLine = true; + } + } + if (this.options.gfm) { + istask = /^\[[ xX]\] /.exec(itemContents); + if (istask) { + ischecked = istask[0] !== "[ ] "; + itemContents = itemContents.replace(/^\[[ xX]\] +/, ""); + } + } + list2.items.push({ + type: "list_item", + raw, + task: !!istask, + checked: ischecked, + loose: false, + text: itemContents + }); + list2.raw += raw; + } + list2.items[list2.items.length - 1].raw = raw.trimRight(); + list2.items[list2.items.length - 1].text = itemContents.trimRight(); + list2.raw = list2.raw.trimRight(); + var l = list2.items.length; + for (i = 0; i < l; i++) { + this.lexer.state.top = false; + list2.items[i].tokens = this.lexer.blockTokens(list2.items[i].text, []); + var spacers = list2.items[i].tokens.filter(function(t4) { + return t4.type === "space"; + }); + var hasMultipleLineBreaks = spacers.every(function(t4) { + var chars = t4.raw.split(""); + var lineBreaks = 0; + for (var _iterator = _createForOfIteratorHelperLoose(chars), _step; !(_step = _iterator()).done; ) { + var _char = _step.value; + if (_char === "\n") { + lineBreaks += 1; + } + if (lineBreaks > 1) { + return true; + } + } + return false; + }); + if (!list2.loose && spacers.length && hasMultipleLineBreaks) { + list2.loose = true; + list2.items[i].loose = true; + } + } + return list2; + } + }; + _proto.html = function html2(src) { + var cap = this.rules.block.html.exec(src); + if (cap) { + var token = { + type: "html", + raw: cap[0], + pre: !this.options.sanitizer && (cap[1] === "pre" || cap[1] === "script" || cap[1] === "style"), + text: cap[0] + }; + if (this.options.sanitize) { + var text2 = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape2(cap[0]); + token.type = "paragraph"; + token.text = text2; + token.tokens = this.lexer.inline(text2); + } + return token; + } + }; + _proto.def = function def(src) { + var cap = this.rules.block.def.exec(src); + if (cap) { + if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1); + var tag = cap[1].toLowerCase().replace(/\s+/g, " "); + return { + type: "def", + tag, + raw: cap[0], + href: cap[2], + title: cap[3] + }; + } + }; + _proto.table = function table(src) { + var cap = this.rules.block.table.exec(src); + if (cap) { + var item = { + type: "table", + header: splitCells(cap[1]).map(function(c) { + return { + text: c + }; + }), + align: cap[2].replace(/^ *|\| *$/g, "").split(/ *\| */), + rows: cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, "").split("\n") : [] + }; + if (item.header.length === item.align.length) { + item.raw = cap[0]; + var l = item.align.length; + var i, j, k, row; + for (i = 0; i < l; i++) { + if (/^ *-+: *$/.test(item.align[i])) { + item.align[i] = "right"; + } else if (/^ *:-+: *$/.test(item.align[i])) { + item.align[i] = "center"; + } else if (/^ *:-+ *$/.test(item.align[i])) { + item.align[i] = "left"; + } else { + item.align[i] = null; + } + } + l = item.rows.length; + for (i = 0; i < l; i++) { + item.rows[i] = splitCells(item.rows[i], item.header.length).map(function(c) { + return { + text: c + }; + }); + } + l = item.header.length; + for (j = 0; j < l; j++) { + item.header[j].tokens = this.lexer.inline(item.header[j].text); + } + l = item.rows.length; + for (j = 0; j < l; j++) { + row = item.rows[j]; + for (k = 0; k < row.length; k++) { + row[k].tokens = this.lexer.inline(row[k].text); + } + } + return item; + } + } + }; + _proto.lheading = function lheading(src) { + var cap = this.rules.block.lheading.exec(src); + if (cap) { + return { + type: "heading", + raw: cap[0], + depth: cap[2].charAt(0) === "=" ? 1 : 2, + text: cap[1], + tokens: this.lexer.inline(cap[1]) + }; + } + }; + _proto.paragraph = function paragraph(src) { + var cap = this.rules.block.paragraph.exec(src); + if (cap) { + var text2 = cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1]; + return { + type: "paragraph", + raw: cap[0], + text: text2, + tokens: this.lexer.inline(text2) + }; + } + }; + _proto.text = function text2(src) { + var cap = this.rules.block.text.exec(src); + if (cap) { + return { + type: "text", + raw: cap[0], + text: cap[0], + tokens: this.lexer.inline(cap[0]) + }; + } + }; + _proto.escape = function escape$1(src) { + var cap = this.rules.inline.escape.exec(src); + if (cap) { + return { + type: "escape", + raw: cap[0], + text: escape2(cap[1]) + }; + } + }; + _proto.tag = function tag(src) { + var cap = this.rules.inline.tag.exec(src); + if (cap) { + if (!this.lexer.state.inLink && /^/i.test(cap[0])) { + this.lexer.state.inLink = false; + } + if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { + this.lexer.state.inRawBlock = true; + } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { + this.lexer.state.inRawBlock = false; + } + return { + type: this.options.sanitize ? "text" : "html", + raw: cap[0], + inLink: this.lexer.state.inLink, + inRawBlock: this.lexer.state.inRawBlock, + text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape2(cap[0]) : cap[0] + }; + } + }; + _proto.link = function link(src) { + var cap = this.rules.inline.link.exec(src); + if (cap) { + var trimmedUrl = cap[2].trim(); + if (!this.options.pedantic && /^$/.test(trimmedUrl)) { + return; + } + var rtrimSlash = rtrim2(trimmedUrl.slice(0, -1), "\\"); + if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) { + return; + } + } else { + var lastParenIndex = findClosingBracket(cap[2], "()"); + if (lastParenIndex > -1) { + var start = cap[0].indexOf("!") === 0 ? 5 : 4; + var linkLen = start + cap[1].length + lastParenIndex; + cap[2] = cap[2].substring(0, lastParenIndex); + cap[0] = cap[0].substring(0, linkLen).trim(); + cap[3] = ""; + } + } + var href = cap[2]; + var title = ""; + if (this.options.pedantic) { + var link2 = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href); + if (link2) { + href = link2[1]; + title = link2[3]; + } + } else { + title = cap[3] ? cap[3].slice(1, -1) : ""; + } + href = href.trim(); + if (/^$/.test(trimmedUrl)) { + href = href.slice(1); + } else { + href = href.slice(1, -1); + } + } + return outputLink(cap, { + href: href ? href.replace(this.rules.inline._escapes, "$1") : href, + title: title ? title.replace(this.rules.inline._escapes, "$1") : title + }, cap[0], this.lexer); + } + }; + _proto.reflink = function reflink(src, links) { + var cap; + if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) { + var link = (cap[2] || cap[1]).replace(/\s+/g, " "); + link = links[link.toLowerCase()]; + if (!link || !link.href) { + var text2 = cap[0].charAt(0); + return { + type: "text", + raw: text2, + text: text2 + }; + } + return outputLink(cap, link, cap[0], this.lexer); + } + }; + _proto.emStrong = function emStrong(src, maskedSrc, prevChar) { + if (prevChar === void 0) { + prevChar = ""; + } + var match2 = this.rules.inline.emStrong.lDelim.exec(src); + if (!match2) return; + if (match2[3] && prevChar.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDF70-\uDF81\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/)) return; + var nextChar = match2[1] || match2[2] || ""; + if (!nextChar || nextChar && (prevChar === "" || this.rules.inline.punctuation.exec(prevChar))) { + var lLength = match2[0].length - 1; + var rDelim, rLength, delimTotal = lLength, midDelimTotal = 0; + var endReg = match2[0][0] === "*" ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd; + endReg.lastIndex = 0; + maskedSrc = maskedSrc.slice(-1 * src.length + lLength); + while ((match2 = endReg.exec(maskedSrc)) != null) { + rDelim = match2[1] || match2[2] || match2[3] || match2[4] || match2[5] || match2[6]; + if (!rDelim) continue; + rLength = rDelim.length; + if (match2[3] || match2[4]) { + delimTotal += rLength; + continue; + } else if (match2[5] || match2[6]) { + if (lLength % 3 && !((lLength + rLength) % 3)) { + midDelimTotal += rLength; + continue; + } + } + delimTotal -= rLength; + if (delimTotal > 0) continue; + rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); + if (Math.min(lLength, rLength) % 2) { + var _text = src.slice(1, lLength + match2.index + rLength); + return { + type: "em", + raw: src.slice(0, lLength + match2.index + rLength + 1), + text: _text, + tokens: this.lexer.inlineTokens(_text) + }; + } + var text2 = src.slice(2, lLength + match2.index + rLength - 1); + return { + type: "strong", + raw: src.slice(0, lLength + match2.index + rLength + 1), + text: text2, + tokens: this.lexer.inlineTokens(text2) + }; + } + } + }; + _proto.codespan = function codespan(src) { + var cap = this.rules.inline.code.exec(src); + if (cap) { + var text2 = cap[2].replace(/\n/g, " "); + var hasNonSpaceChars = /[^ ]/.test(text2); + var hasSpaceCharsOnBothEnds = /^ /.test(text2) && / $/.test(text2); + if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) { + text2 = text2.substring(1, text2.length - 1); + } + text2 = escape2(text2, true); + return { + type: "codespan", + raw: cap[0], + text: text2 + }; + } + }; + _proto.br = function br(src) { + var cap = this.rules.inline.br.exec(src); + if (cap) { + return { + type: "br", + raw: cap[0] + }; + } + }; + _proto.del = function del(src) { + var cap = this.rules.inline.del.exec(src); + if (cap) { + return { + type: "del", + raw: cap[0], + text: cap[2], + tokens: this.lexer.inlineTokens(cap[2]) + }; + } + }; + _proto.autolink = function autolink(src, mangle2) { + var cap = this.rules.inline.autolink.exec(src); + if (cap) { + var text2, href; + if (cap[2] === "@") { + text2 = escape2(this.options.mangle ? mangle2(cap[1]) : cap[1]); + href = "mailto:" + text2; + } else { + text2 = escape2(cap[1]); + href = text2; + } + return { + type: "link", + raw: cap[0], + text: text2, + href, + tokens: [{ + type: "text", + raw: text2, + text: text2 + }] + }; + } + }; + _proto.url = function url(src, mangle2) { + var cap; + if (cap = this.rules.inline.url.exec(src)) { + var text2, href; + if (cap[2] === "@") { + text2 = escape2(this.options.mangle ? mangle2(cap[0]) : cap[0]); + href = "mailto:" + text2; + } else { + var prevCapZero; + do { + prevCapZero = cap[0]; + cap[0] = this.rules.inline._backpedal.exec(cap[0])[0]; + } while (prevCapZero !== cap[0]); + text2 = escape2(cap[0]); + if (cap[1] === "www.") { + href = "http://" + text2; + } else { + href = text2; + } + } + return { + type: "link", + raw: cap[0], + text: text2, + href, + tokens: [{ + type: "text", + raw: text2, + text: text2 + }] + }; + } + }; + _proto.inlineText = function inlineText(src, smartypants2) { + var cap = this.rules.inline.text.exec(src); + if (cap) { + var text2; + if (this.lexer.state.inRawBlock) { + text2 = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape2(cap[0]) : cap[0]; + } else { + text2 = escape2(this.options.smartypants ? smartypants2(cap[0]) : cap[0]); + } + return { + type: "text", + raw: cap[0], + text: text2 + }; + } + }; + return Tokenizer3; + }(); + var block = { + newline: /^(?: *(?:\n|$))+/, + code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/, + fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/, + hr: /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, + heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, + blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/, + list: /^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/, + html: "^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))", + def: /^ {0,3}\[(label)\]: *(?:\n *)?]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/, + table: noopTest, + lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/, + // regex template, placeholders will be replaced according to different paragraph + // interruption rules of commonmark and the original markdown spec: + _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, + text: /^[^\n]+/ + }; + block._label = /(?!\s*\])(?:\\.|[^\[\]\\])+/; + block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/; + block.def = edit(block.def).replace("label", block._label).replace("title", block._title).getRegex(); + block.bullet = /(?:[*+-]|\d{1,9}[.)])/; + block.listItemStart = edit(/^( *)(bull) */).replace("bull", block.bullet).getRegex(); + block.list = edit(block.list).replace(/bull/g, block.bullet).replace("hr", "\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def", "\\n+(?=" + block.def.source + ")").getRegex(); + block._tag = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"; + block._comment = /|$)/; + block.html = edit(block.html, "i").replace("comment", block._comment).replace("tag", block._tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); + block.paragraph = edit(block._paragraph).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex(); + block.blockquote = edit(block.blockquote).replace("paragraph", block.paragraph).getRegex(); + block.normal = merge({}, block); + block.gfm = merge({}, block.normal, { + table: "^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)" + // Cells + }); + block.gfm.table = edit(block.gfm.table).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("blockquote", " {0,3}>").replace("code", " {4}[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex(); + block.gfm.paragraph = edit(block._paragraph).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("|lheading", "").replace("table", block.gfm.table).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex(); + block.pedantic = merge({}, block.normal, { + html: edit(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", block._comment).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), + def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, + heading: /^(#{1,6})(.*)(?:\n+|$)/, + fences: noopTest, + // fences not supported + paragraph: edit(block.normal._paragraph).replace("hr", block.hr).replace("heading", " *#{1,6} *[^\n]").replace("lheading", block.lheading).replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").getRegex() + }); + var inline = { + escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, + autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/, + url: noopTest, + tag: "^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^", + // CDATA section + link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/, + reflink: /^!?\[(label)\]\[(ref)\]/, + nolink: /^!?\[(ref)\](?:\[\])?/, + reflinkSearch: "reflink|nolink(?!\\()", + emStrong: { + lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/, + // (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left. (5) and (6) can be either Left or Right. + // () Skip orphan inside strong () Consume to delim (1) #*** (2) a***#, a*** (3) #***a, ***a (4) ***# (5) #***# (6) a***a + rDelimAst: /^[^_*]*?\_\_[^_*]*?\*[^_*]*?(?=\_\_)|[^*]+(?=[^*])|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/, + rDelimUnd: /^[^_*]*?\*\*[^_*]*?\_[^_*]*?(?=\*\*)|[^_]+(?=[^_])|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ + // ^- Not allowed for _ + }, + code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, + br: /^( {2,}|\\)\n(?!\s*$)/, + del: noopTest, + text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~"; + inline.punctuation = edit(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex(); + inline.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g; + inline.escapedEmSt = /\\\*|\\_/g; + inline._comment = edit(block._comment).replace("(?:-->|$)", "-->").getRegex(); + inline.emStrong.lDelim = edit(inline.emStrong.lDelim).replace(/punct/g, inline._punctuation).getRegex(); + inline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, "g").replace(/punct/g, inline._punctuation).getRegex(); + inline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, "g").replace(/punct/g, inline._punctuation).getRegex(); + inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g; + inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/; + inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/; + inline.autolink = edit(inline.autolink).replace("scheme", inline._scheme).replace("email", inline._email).getRegex(); + inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/; + inline.tag = edit(inline.tag).replace("comment", inline._comment).replace("attribute", inline._attribute).getRegex(); + inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/; + inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/; + inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/; + inline.link = edit(inline.link).replace("label", inline._label).replace("href", inline._href).replace("title", inline._title).getRegex(); + inline.reflink = edit(inline.reflink).replace("label", inline._label).replace("ref", block._label).getRegex(); + inline.nolink = edit(inline.nolink).replace("ref", block._label).getRegex(); + inline.reflinkSearch = edit(inline.reflinkSearch, "g").replace("reflink", inline.reflink).replace("nolink", inline.nolink).getRegex(); + inline.normal = merge({}, inline); + inline.pedantic = merge({}, inline.normal, { + strong: { + start: /^__|\*\*/, + middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, + endAst: /\*\*(?!\*)/g, + endUnd: /__(?!_)/g + }, + em: { + start: /^_|\*/, + middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/, + endAst: /\*(?!\*)/g, + endUnd: /_(?!_)/g + }, + link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", inline._label).getRegex(), + reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", inline._label).getRegex() + }); + inline.gfm = merge({}, inline.normal, { + escape: edit(inline.escape).replace("])", "~|])").getRegex(), + _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/, + url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, + _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/, + del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/, + text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\ 0.5) { + ch = "x" + ch.toString(16); + } + out += "&#" + ch + ";"; + } + return out; + } + var Lexer2 = /* @__PURE__ */ function() { + function Lexer3(options3) { + this.tokens = []; + this.tokens.links = /* @__PURE__ */ Object.create(null); + this.options = options3 || exports2.defaults; + this.options.tokenizer = this.options.tokenizer || new Tokenizer2(); + this.tokenizer = this.options.tokenizer; + this.tokenizer.options = this.options; + this.tokenizer.lexer = this; + this.inlineQueue = []; + this.state = { + inLink: false, + inRawBlock: false, + top: true + }; + var rules = { + block: block.normal, + inline: inline.normal + }; + if (this.options.pedantic) { + rules.block = block.pedantic; + rules.inline = inline.pedantic; + } else if (this.options.gfm) { + rules.block = block.gfm; + if (this.options.breaks) { + rules.inline = inline.breaks; + } else { + rules.inline = inline.gfm; + } + } + this.tokenizer.rules = rules; + } + Lexer3.lex = function lex(src, options3) { + var lexer3 = new Lexer3(options3); + return lexer3.lex(src); + }; + Lexer3.lexInline = function lexInline(src, options3) { + var lexer3 = new Lexer3(options3); + return lexer3.inlineTokens(src); + }; + var _proto = Lexer3.prototype; + _proto.lex = function lex(src) { + src = src.replace(/\r\n|\r/g, "\n"); + this.blockTokens(src, this.tokens); + var next; + while (next = this.inlineQueue.shift()) { + this.inlineTokens(next.src, next.tokens); + } + return this.tokens; + }; + _proto.blockTokens = function blockTokens(src, tokens) { + var _this = this; + if (tokens === void 0) { + tokens = []; + } + if (this.options.pedantic) { + src = src.replace(/\t/g, " ").replace(/^ +$/gm, ""); + } else { + src = src.replace(/^( *)(\t+)/gm, function(_, leading, tabs) { + return leading + " ".repeat(tabs.length); + }); + } + var token, lastToken, cutSrc, lastParagraphClipped; + while (src) { + if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some(function(extTokenizer) { + if (token = extTokenizer.call({ + lexer: _this + }, src, tokens)) { + src = src.substring(token.raw.length); + tokens.push(token); + return true; + } + return false; + })) { + continue; + } + if (token = this.tokenizer.space(src)) { + src = src.substring(token.raw.length); + if (token.raw.length === 1 && tokens.length > 0) { + tokens[tokens.length - 1].raw += "\n"; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.code(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.fences(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.heading(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.hr(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.blockquote(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.list(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.html(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.def(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.raw; + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } else if (!this.tokens.links[token.tag]) { + this.tokens.links[token.tag] = { + href: token.href, + title: token.title + }; + } + continue; + } + if (token = this.tokenizer.table(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.lheading(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + cutSrc = src; + if (this.options.extensions && this.options.extensions.startBlock) { + (function() { + var startIndex = Infinity; + var tempSrc = src.slice(1); + var tempStart = void 0; + _this.options.extensions.startBlock.forEach(function(getStartIndex) { + tempStart = getStartIndex.call({ + lexer: this + }, tempSrc); + if (typeof tempStart === "number" && tempStart >= 0) { + startIndex = Math.min(startIndex, tempStart); + } + }); + if (startIndex < Infinity && startIndex >= 0) { + cutSrc = src.substring(0, startIndex + 1); + } + })(); + } + if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) { + lastToken = tokens[tokens.length - 1]; + if (lastParagraphClipped && lastToken.type === "paragraph") { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue.pop(); + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } else { + tokens.push(token); + } + lastParagraphClipped = cutSrc.length !== src.length; + src = src.substring(token.raw.length); + continue; + } + if (token = this.tokenizer.text(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && lastToken.type === "text") { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue.pop(); + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } else { + tokens.push(token); + } + continue; + } + if (src) { + var errMsg = "Infinite loop on byte: " + src.charCodeAt(0); + if (this.options.silent) { + console.error(errMsg); + break; + } else { + throw new Error(errMsg); + } + } + } + this.state.top = true; + return tokens; + }; + _proto.inline = function inline2(src, tokens) { + if (tokens === void 0) { + tokens = []; + } + this.inlineQueue.push({ + src, + tokens + }); + return tokens; + }; + _proto.inlineTokens = function inlineTokens(src, tokens) { + var _this2 = this; + if (tokens === void 0) { + tokens = []; + } + var token, lastToken, cutSrc; + var maskedSrc = src; + var match2; + var keepPrevChar, prevChar; + if (this.tokens.links) { + var links = Object.keys(this.tokens.links); + if (links.length > 0) { + while ((match2 = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) { + if (links.includes(match2[0].slice(match2[0].lastIndexOf("[") + 1, -1))) { + maskedSrc = maskedSrc.slice(0, match2.index) + "[" + repeatString("a", match2[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex); + } + } + } + } + while ((match2 = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) { + maskedSrc = maskedSrc.slice(0, match2.index) + "[" + repeatString("a", match2[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + } + while ((match2 = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) { + maskedSrc = maskedSrc.slice(0, match2.index) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex); + } + while (src) { + if (!keepPrevChar) { + prevChar = ""; + } + keepPrevChar = false; + if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some(function(extTokenizer) { + if (token = extTokenizer.call({ + lexer: _this2 + }, src, tokens)) { + src = src.substring(token.raw.length); + tokens.push(token); + return true; + } + return false; + })) { + continue; + } + if (token = this.tokenizer.escape(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.tag(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && token.type === "text" && lastToken.type === "text") { + lastToken.raw += token.raw; + lastToken.text += token.text; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.link(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.reflink(src, this.tokens.links)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && token.type === "text" && lastToken.type === "text") { + lastToken.raw += token.raw; + lastToken.text += token.text; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.codespan(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.br(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.del(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.autolink(src, mangle)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + cutSrc = src; + if (this.options.extensions && this.options.extensions.startInline) { + (function() { + var startIndex = Infinity; + var tempSrc = src.slice(1); + var tempStart = void 0; + _this2.options.extensions.startInline.forEach(function(getStartIndex) { + tempStart = getStartIndex.call({ + lexer: this + }, tempSrc); + if (typeof tempStart === "number" && tempStart >= 0) { + startIndex = Math.min(startIndex, tempStart); + } + }); + if (startIndex < Infinity && startIndex >= 0) { + cutSrc = src.substring(0, startIndex + 1); + } + })(); + } + if (token = this.tokenizer.inlineText(cutSrc, smartypants)) { + src = src.substring(token.raw.length); + if (token.raw.slice(-1) !== "_") { + prevChar = token.raw.slice(-1); + } + keepPrevChar = true; + lastToken = tokens[tokens.length - 1]; + if (lastToken && lastToken.type === "text") { + lastToken.raw += token.raw; + lastToken.text += token.text; + } else { + tokens.push(token); + } + continue; + } + if (src) { + var errMsg = "Infinite loop on byte: " + src.charCodeAt(0); + if (this.options.silent) { + console.error(errMsg); + break; + } else { + throw new Error(errMsg); + } + } + } + return tokens; + }; + _createClass(Lexer3, null, [{ + key: "rules", + get: function get() { + return { + block, + inline + }; + } + }]); + return Lexer3; + }(); + var Renderer2 = /* @__PURE__ */ function() { + function Renderer3(options3) { + this.options = options3 || exports2.defaults; + } + var _proto = Renderer3.prototype; + _proto.code = function code(_code, infostring, escaped) { + var lang = (infostring || "").match(/\S*/)[0]; + if (this.options.highlight) { + var out = this.options.highlight(_code, lang); + if (out != null && out !== _code) { + escaped = true; + _code = out; + } + } + _code = _code.replace(/\n$/, "") + "\n"; + if (!lang) { + return "
" + (escaped ? _code : escape2(_code, true)) + "
\n"; + } + return '
' + (escaped ? _code : escape2(_code, true)) + "
\n"; + }; + _proto.blockquote = function blockquote(quote) { + return "
\n" + quote + "
\n"; + }; + _proto.html = function html2(_html) { + return _html; + }; + _proto.heading = function heading(text2, level, raw, slugger) { + if (this.options.headerIds) { + var id = this.options.headerPrefix + slugger.slug(raw); + return "' + text2 + "\n"; + } + return "" + text2 + "\n"; + }; + _proto.hr = function hr() { + return this.options.xhtml ? "
\n" : "
\n"; + }; + _proto.list = function list(body, ordered, start) { + var type = ordered ? "ol" : "ul", startatt = ordered && start !== 1 ? ' start="' + start + '"' : ""; + return "<" + type + startatt + ">\n" + body + "\n"; + }; + _proto.listitem = function listitem(text2) { + return "
  • " + text2 + "
  • \n"; + }; + _proto.checkbox = function checkbox(checked) { + return " "; + }; + _proto.paragraph = function paragraph(text2) { + return "

    " + text2 + "

    \n"; + }; + _proto.table = function table(header, body) { + if (body) body = "" + body + ""; + return "\n\n" + header + "\n" + body + "
    \n"; + }; + _proto.tablerow = function tablerow(content) { + return "\n" + content + "\n"; + }; + _proto.tablecell = function tablecell(content, flags) { + var type = flags.header ? "th" : "td"; + var tag = flags.align ? "<" + type + ' align="' + flags.align + '">' : "<" + type + ">"; + return tag + content + ("\n"); + }; + _proto.strong = function strong(text2) { + return "" + text2 + ""; + }; + _proto.em = function em(text2) { + return "" + text2 + ""; + }; + _proto.codespan = function codespan(text2) { + return "" + text2 + ""; + }; + _proto.br = function br() { + return this.options.xhtml ? "
    " : "
    "; + }; + _proto.del = function del(text2) { + return "" + text2 + ""; + }; + _proto.link = function link(href, title, text2) { + href = cleanUrl(this.options.sanitize, this.options.baseUrl, href); + if (href === null) { + return text2; + } + var out = '
    "; + return out; + }; + _proto.image = function image(href, title, text2) { + href = cleanUrl(this.options.sanitize, this.options.baseUrl, href); + if (href === null) { + return text2; + } + var out = '' + text2 + '" : ">"; + return out; + }; + _proto.text = function text2(_text) { + return _text; + }; + return Renderer3; + }(); + var TextRenderer2 = /* @__PURE__ */ function() { + function TextRenderer3() { + } + var _proto = TextRenderer3.prototype; + _proto.strong = function strong(text2) { + return text2; + }; + _proto.em = function em(text2) { + return text2; + }; + _proto.codespan = function codespan(text2) { + return text2; + }; + _proto.del = function del(text2) { + return text2; + }; + _proto.html = function html2(text2) { + return text2; + }; + _proto.text = function text2(_text) { + return _text; + }; + _proto.link = function link(href, title, text2) { + return "" + text2; + }; + _proto.image = function image(href, title, text2) { + return "" + text2; + }; + _proto.br = function br() { + return ""; + }; + return TextRenderer3; + }(); + var Slugger2 = /* @__PURE__ */ function() { + function Slugger3() { + this.seen = {}; + } + var _proto = Slugger3.prototype; + _proto.serialize = function serialize(value) { + return value.toLowerCase().trim().replace(/<[!\/a-z].*?>/ig, "").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, "").replace(/\s/g, "-"); + }; + _proto.getNextSafeSlug = function getNextSafeSlug(originalSlug, isDryRun) { + var slug = originalSlug; + var occurenceAccumulator = 0; + if (this.seen.hasOwnProperty(slug)) { + occurenceAccumulator = this.seen[originalSlug]; + do { + occurenceAccumulator++; + slug = originalSlug + "-" + occurenceAccumulator; + } while (this.seen.hasOwnProperty(slug)); + } + if (!isDryRun) { + this.seen[originalSlug] = occurenceAccumulator; + this.seen[slug] = 0; + } + return slug; + }; + _proto.slug = function slug(value, options3) { + if (options3 === void 0) { + options3 = {}; + } + var slug2 = this.serialize(value); + return this.getNextSafeSlug(slug2, options3.dryrun); + }; + return Slugger3; + }(); + var Parser5 = /* @__PURE__ */ function() { + function Parser6(options3) { + this.options = options3 || exports2.defaults; + this.options.renderer = this.options.renderer || new Renderer2(); + this.renderer = this.options.renderer; + this.renderer.options = this.options; + this.textRenderer = new TextRenderer2(); + this.slugger = new Slugger2(); + } + Parser6.parse = function parse6(tokens, options3) { + var parser3 = new Parser6(options3); + return parser3.parse(tokens); + }; + Parser6.parseInline = function parseInline3(tokens, options3) { + var parser3 = new Parser6(options3); + return parser3.parseInline(tokens); + }; + var _proto = Parser6.prototype; + _proto.parse = function parse6(tokens, top) { + if (top === void 0) { + top = true; + } + var out = "", i, j, k, l2, l3, row, cell, header, body, token, ordered, start, loose, itemBody, item, checked, task, checkbox, ret; + var l = tokens.length; + for (i = 0; i < l; i++) { + token = tokens[i]; + if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) { + ret = this.options.extensions.renderers[token.type].call({ + parser: this + }, token); + if (ret !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(token.type)) { + out += ret || ""; + continue; + } + } + switch (token.type) { + case "space": { + continue; + } + case "hr": { + out += this.renderer.hr(); + continue; + } + case "heading": { + out += this.renderer.heading(this.parseInline(token.tokens), token.depth, unescape3(this.parseInline(token.tokens, this.textRenderer)), this.slugger); + continue; + } + case "code": { + out += this.renderer.code(token.text, token.lang, token.escaped); + continue; + } + case "table": { + header = ""; + cell = ""; + l2 = token.header.length; + for (j = 0; j < l2; j++) { + cell += this.renderer.tablecell(this.parseInline(token.header[j].tokens), { + header: true, + align: token.align[j] + }); + } + header += this.renderer.tablerow(cell); + body = ""; + l2 = token.rows.length; + for (j = 0; j < l2; j++) { + row = token.rows[j]; + cell = ""; + l3 = row.length; + for (k = 0; k < l3; k++) { + cell += this.renderer.tablecell(this.parseInline(row[k].tokens), { + header: false, + align: token.align[k] + }); + } + body += this.renderer.tablerow(cell); + } + out += this.renderer.table(header, body); + continue; + } + case "blockquote": { + body = this.parse(token.tokens); + out += this.renderer.blockquote(body); + continue; + } + case "list": { + ordered = token.ordered; + start = token.start; + loose = token.loose; + l2 = token.items.length; + body = ""; + for (j = 0; j < l2; j++) { + item = token.items[j]; + checked = item.checked; + task = item.task; + itemBody = ""; + if (item.task) { + checkbox = this.renderer.checkbox(checked); + if (loose) { + if (item.tokens.length > 0 && item.tokens[0].type === "paragraph") { + item.tokens[0].text = checkbox + " " + item.tokens[0].text; + if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") { + item.tokens[0].tokens[0].text = checkbox + " " + item.tokens[0].tokens[0].text; + } + } else { + item.tokens.unshift({ + type: "text", + text: checkbox + }); + } + } else { + itemBody += checkbox; + } + } + itemBody += this.parse(item.tokens, loose); + body += this.renderer.listitem(itemBody, task, checked); + } + out += this.renderer.list(body, ordered, start); + continue; + } + case "html": { + out += this.renderer.html(token.text); + continue; + } + case "paragraph": { + out += this.renderer.paragraph(this.parseInline(token.tokens)); + continue; + } + case "text": { + body = token.tokens ? this.parseInline(token.tokens) : token.text; + while (i + 1 < l && tokens[i + 1].type === "text") { + token = tokens[++i]; + body += "\n" + (token.tokens ? this.parseInline(token.tokens) : token.text); + } + out += top ? this.renderer.paragraph(body) : body; + continue; + } + default: { + var errMsg = 'Token with "' + token.type + '" type was not found.'; + if (this.options.silent) { + console.error(errMsg); + return; + } else { + throw new Error(errMsg); + } + } + } + } + return out; + }; + _proto.parseInline = function parseInline3(tokens, renderer) { + renderer = renderer || this.renderer; + var out = "", i, token, ret; + var l = tokens.length; + for (i = 0; i < l; i++) { + token = tokens[i]; + if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) { + ret = this.options.extensions.renderers[token.type].call({ + parser: this + }, token); + if (ret !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(token.type)) { + out += ret || ""; + continue; + } + } + switch (token.type) { + case "escape": { + out += renderer.text(token.text); + break; + } + case "html": { + out += renderer.html(token.text); + break; + } + case "link": { + out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer)); + break; + } + case "image": { + out += renderer.image(token.href, token.title, token.text); + break; + } + case "strong": { + out += renderer.strong(this.parseInline(token.tokens, renderer)); + break; + } + case "em": { + out += renderer.em(this.parseInline(token.tokens, renderer)); + break; + } + case "codespan": { + out += renderer.codespan(token.text); + break; + } + case "br": { + out += renderer.br(); + break; + } + case "del": { + out += renderer.del(this.parseInline(token.tokens, renderer)); + break; + } + case "text": { + out += renderer.text(token.text); + break; + } + default: { + var errMsg = 'Token with "' + token.type + '" type was not found.'; + if (this.options.silent) { + console.error(errMsg); + return; + } else { + throw new Error(errMsg); + } + } + } + } + return out; + }; + return Parser6; + }(); + function marked2(src, opt, callback) { + if (typeof src === "undefined" || src === null) { + throw new Error("marked(): input parameter is undefined or null"); + } + if (typeof src !== "string") { + throw new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected"); + } + if (typeof opt === "function") { + callback = opt; + opt = null; + } + opt = merge({}, marked2.defaults, opt || {}); + checkSanitizeDeprecation(opt); + if (callback) { + var highlight = opt.highlight; + var tokens; + try { + tokens = Lexer2.lex(src, opt); + } catch (e) { + return callback(e); + } + var done = function done2(err) { + var out; + if (!err) { + try { + if (opt.walkTokens) { + marked2.walkTokens(tokens, opt.walkTokens); + } + out = Parser5.parse(tokens, opt); + } catch (e) { + err = e; + } + } + opt.highlight = highlight; + return err ? callback(err) : callback(null, out); + }; + if (!highlight || highlight.length < 3) { + return done(); + } + delete opt.highlight; + if (!tokens.length) return done(); + var pending = 0; + marked2.walkTokens(tokens, function(token) { + if (token.type === "code") { + pending++; + setTimeout(function() { + highlight(token.text, token.lang, function(err, code) { + if (err) { + return done(err); + } + if (code != null && code !== token.text) { + token.text = code; + token.escaped = true; + } + pending--; + if (pending === 0) { + done(); + } + }); + }, 0); + } + }); + if (pending === 0) { + done(); + } + return; + } + function onError(e) { + e.message += "\nPlease report this to https://github.com/markedjs/marked."; + if (opt.silent) { + return "

    An error occurred:

    " + escape2(e.message + "", true) + "
    "; + } + throw e; + } + try { + var _tokens = Lexer2.lex(src, opt); + if (opt.walkTokens) { + if (opt.async) { + return Promise.all(marked2.walkTokens(_tokens, opt.walkTokens)).then(function() { + return Parser5.parse(_tokens, opt); + })["catch"](onError); + } + marked2.walkTokens(_tokens, opt.walkTokens); + } + return Parser5.parse(_tokens, opt); + } catch (e) { + onError(e); + } + } + marked2.options = marked2.setOptions = function(opt) { + merge(marked2.defaults, opt); + changeDefaults(marked2.defaults); + return marked2; + }; + marked2.getDefaults = getDefaults2; + marked2.defaults = exports2.defaults; + marked2.use = function() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + var opts = merge.apply(void 0, [{}].concat(args)); + var extensions = marked2.defaults.extensions || { + renderers: {}, + childTokens: {} + }; + var hasExtensions; + args.forEach(function(pack) { + if (pack.extensions) { + hasExtensions = true; + pack.extensions.forEach(function(ext) { + if (!ext.name) { + throw new Error("extension name required"); + } + if (ext.renderer) { + var prevRenderer = extensions.renderers ? extensions.renderers[ext.name] : null; + if (prevRenderer) { + extensions.renderers[ext.name] = function() { + for (var _len2 = arguments.length, args2 = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args2[_key2] = arguments[_key2]; + } + var ret = ext.renderer.apply(this, args2); + if (ret === false) { + ret = prevRenderer.apply(this, args2); + } + return ret; + }; + } else { + extensions.renderers[ext.name] = ext.renderer; + } + } + if (ext.tokenizer) { + if (!ext.level || ext.level !== "block" && ext.level !== "inline") { + throw new Error("extension level must be 'block' or 'inline'"); + } + if (extensions[ext.level]) { + extensions[ext.level].unshift(ext.tokenizer); + } else { + extensions[ext.level] = [ext.tokenizer]; + } + if (ext.start) { + if (ext.level === "block") { + if (extensions.startBlock) { + extensions.startBlock.push(ext.start); + } else { + extensions.startBlock = [ext.start]; + } + } else if (ext.level === "inline") { + if (extensions.startInline) { + extensions.startInline.push(ext.start); + } else { + extensions.startInline = [ext.start]; + } + } + } + } + if (ext.childTokens) { + extensions.childTokens[ext.name] = ext.childTokens; + } + }); + } + if (pack.renderer) { + (function() { + var renderer = marked2.defaults.renderer || new Renderer2(); + var _loop = function _loop2(prop2) { + var prevRenderer = renderer[prop2]; + renderer[prop2] = function() { + for (var _len3 = arguments.length, args2 = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args2[_key3] = arguments[_key3]; + } + var ret = pack.renderer[prop2].apply(renderer, args2); + if (ret === false) { + ret = prevRenderer.apply(renderer, args2); + } + return ret; + }; + }; + for (var prop in pack.renderer) { + _loop(prop); + } + opts.renderer = renderer; + })(); + } + if (pack.tokenizer) { + (function() { + var tokenizer = marked2.defaults.tokenizer || new Tokenizer2(); + var _loop2 = function _loop22(prop2) { + var prevTokenizer = tokenizer[prop2]; + tokenizer[prop2] = function() { + for (var _len4 = arguments.length, args2 = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + args2[_key4] = arguments[_key4]; + } + var ret = pack.tokenizer[prop2].apply(tokenizer, args2); + if (ret === false) { + ret = prevTokenizer.apply(tokenizer, args2); + } + return ret; + }; + }; + for (var prop in pack.tokenizer) { + _loop2(prop); + } + opts.tokenizer = tokenizer; + })(); + } + if (pack.walkTokens) { + var _walkTokens = marked2.defaults.walkTokens; + opts.walkTokens = function(token) { + var values2 = []; + values2.push(pack.walkTokens.call(this, token)); + if (_walkTokens) { + values2 = values2.concat(_walkTokens.call(this, token)); + } + return values2; + }; + } + if (hasExtensions) { + opts.extensions = extensions; + } + marked2.setOptions(opts); + }); + }; + marked2.walkTokens = function(tokens, callback) { + var values2 = []; + var _loop3 = function _loop32() { + var token = _step.value; + values2 = values2.concat(callback.call(marked2, token)); + switch (token.type) { + case "table": { + for (var _iterator2 = _createForOfIteratorHelperLoose(token.header), _step2; !(_step2 = _iterator2()).done; ) { + var cell = _step2.value; + values2 = values2.concat(marked2.walkTokens(cell.tokens, callback)); + } + for (var _iterator3 = _createForOfIteratorHelperLoose(token.rows), _step3; !(_step3 = _iterator3()).done; ) { + var row = _step3.value; + for (var _iterator4 = _createForOfIteratorHelperLoose(row), _step4; !(_step4 = _iterator4()).done; ) { + var _cell = _step4.value; + values2 = values2.concat(marked2.walkTokens(_cell.tokens, callback)); + } + } + break; + } + case "list": { + values2 = values2.concat(marked2.walkTokens(token.items, callback)); + break; + } + default: { + if (marked2.defaults.extensions && marked2.defaults.extensions.childTokens && marked2.defaults.extensions.childTokens[token.type]) { + marked2.defaults.extensions.childTokens[token.type].forEach(function(childTokens) { + values2 = values2.concat(marked2.walkTokens(token[childTokens], callback)); + }); + } else if (token.tokens) { + values2 = values2.concat(marked2.walkTokens(token.tokens, callback)); + } + } + } + }; + for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done; ) { + _loop3(); + } + return values2; + }; + marked2.parseInline = function(src, opt) { + if (typeof src === "undefined" || src === null) { + throw new Error("marked.parseInline(): input parameter is undefined or null"); + } + if (typeof src !== "string") { + throw new Error("marked.parseInline(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected"); + } + opt = merge({}, marked2.defaults, opt || {}); + checkSanitizeDeprecation(opt); + try { + var tokens = Lexer2.lexInline(src, opt); + if (opt.walkTokens) { + marked2.walkTokens(tokens, opt.walkTokens); + } + return Parser5.parseInline(tokens, opt); + } catch (e) { + e.message += "\nPlease report this to https://github.com/markedjs/marked."; + if (opt.silent) { + return "

    An error occurred:

    " + escape2(e.message + "", true) + "
    "; + } + throw e; + } + }; + marked2.Parser = Parser5; + marked2.parser = Parser5.parse; + marked2.Renderer = Renderer2; + marked2.TextRenderer = TextRenderer2; + marked2.Lexer = Lexer2; + marked2.lexer = Lexer2.lex; + marked2.Tokenizer = Tokenizer2; + marked2.Slugger = Slugger2; + marked2.parse = marked2; + var options2 = marked2.options; + var setOptions2 = marked2.setOptions; + var use2 = marked2.use; + var walkTokens2 = marked2.walkTokens; + var parseInline2 = marked2.parseInline; + var parse5 = marked2; + var parser2 = Parser5.parse; + var lexer2 = Lexer2.lex; + exports2.Lexer = Lexer2; + exports2.Parser = Parser5; + exports2.Renderer = Renderer2; + exports2.Slugger = Slugger2; + exports2.TextRenderer = TextRenderer2; + exports2.Tokenizer = Tokenizer2; + exports2.getDefaults = getDefaults2; + exports2.lexer = lexer2; + exports2.marked = marked2; + exports2.options = options2; + exports2.parse = parse5; + exports2.parseInline = parseInline2; + exports2.parser = parser2; + exports2.setOptions = setOptions2; + exports2.use = use2; + exports2.walkTokens = walkTokens2; + Object.defineProperty(exports2, "__esModule", { value: true }); + }); + })(); + Lexer = __marked_exports.Lexer || exports.Lexer; + Parser3 = __marked_exports.Parser || exports.Parser; + Renderer = __marked_exports.Renderer || exports.Renderer; + Slugger = __marked_exports.Slugger || exports.Slugger; + TextRenderer = __marked_exports.TextRenderer || exports.TextRenderer; + Tokenizer = __marked_exports.Tokenizer || exports.Tokenizer; + getDefaults = __marked_exports.getDefaults || exports.getDefaults; + lexer = __marked_exports.lexer || exports.lexer; + marked = __marked_exports.marked || exports.marked; + options = __marked_exports.options || exports.options; + parse2 = __marked_exports.parse || exports.parse; + parseInline = __marked_exports.parseInline || exports.parseInline; + parser = __marked_exports.parser || exports.parser; + setOptions = __marked_exports.setOptions || exports.setOptions; + use = __marked_exports.use || exports.use; + walkTokens = __marked_exports.walkTokens || exports.walkTokens; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/marshalling.js +function stringify(obj) { + return JSON.stringify(obj, replacer); +} +function parse3(text2) { + let data = JSON.parse(text2); + data = revive(data); + return data; +} +function replacer(key, value) { + if (value instanceof RegExp) { + return { + $mid: 2, + source: value.source, + flags: value.flags + }; + } + return value; +} +function revive(obj, depth = 0) { + if (!obj || depth > 200) { + return obj; + } + if (typeof obj === "object") { + switch (obj.$mid) { + case 1: + return URI.revive(obj); + case 2: + return new RegExp(obj.source, obj.flags); + case 17: + return new Date(obj.source); + } + if (obj instanceof VSBuffer || obj instanceof Uint8Array) { + return obj; + } + if (Array.isArray(obj)) { + for (let i = 0; i < obj.length; ++i) { + obj[i] = revive(obj[i], depth + 1); + } + } else { + for (const key in obj) { + if (Object.hasOwnProperty.call(obj, key)) { + obj[key] = revive(obj[key], depth + 1); + } + } + } + } + return obj; +} +var init_marshalling = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/marshalling.js"() { + init_buffer(); + init_uri(); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/markdownRenderer.js +function renderMarkdown(markdown, options2 = {}, markedOptions = {}) { + var _a10, _b4; + const disposables = new DisposableStore(); + let isDisposed = false; + const element = createElement(options2); + const _uriMassage = function(part) { + let data; + try { + data = parse3(decodeURIComponent(part)); + } catch (e) { + } + if (!data) { + return part; + } + data = cloneAndChange(data, (value2) => { + if (markdown.uris && markdown.uris[value2]) { + return URI.revive(markdown.uris[value2]); + } else { + return void 0; + } + }); + return encodeURIComponent(JSON.stringify(data)); + }; + const _href = function(href, isDomUri) { + const data = markdown.uris && markdown.uris[href]; + let uri = URI.revive(data); + if (isDomUri) { + if (href.startsWith(Schemas.data + ":")) { + return href; + } + if (!uri) { + uri = URI.parse(href); + } + return FileAccess.uriToBrowserUri(uri).toString(true); + } + if (!uri) { + return href; + } + if (URI.parse(href).toString() === uri.toString()) { + return href; + } + if (uri.query) { + uri = uri.with({ query: _uriMassage(uri.query) }); + } + return uri.toString(); + }; + const renderer = new marked.Renderer(); + renderer.image = defaultMarkedRenderers.image; + renderer.link = defaultMarkedRenderers.link; + renderer.paragraph = defaultMarkedRenderers.paragraph; + const codeBlocks = []; + const syncCodeBlocks = []; + if (options2.codeBlockRendererSync) { + renderer.code = (code, lang) => { + const id = defaultGenerator.nextId(); + const value2 = options2.codeBlockRendererSync(postProcessCodeBlockLanguageId(lang), code); + syncCodeBlocks.push([id, value2]); + return `
    ${escape(code)}
    `; + }; + } else if (options2.codeBlockRenderer) { + renderer.code = (code, lang) => { + const id = defaultGenerator.nextId(); + const value2 = options2.codeBlockRenderer(postProcessCodeBlockLanguageId(lang), code); + codeBlocks.push(value2.then((element2) => [id, element2])); + return `
    ${escape(code)}
    `; + }; + } + if (options2.actionHandler) { + const _activateLink = function(event) { + let target = event.target; + if (target.tagName !== "A") { + target = target.parentElement; + if (!target || target.tagName !== "A") { + return; + } + } + try { + let href = target.dataset["href"]; + if (href) { + if (markdown.baseUri) { + href = resolveWithBaseUri(URI.from(markdown.baseUri), href); + } + options2.actionHandler.callback(href, event); + } + } catch (err) { + onUnexpectedError(err); + } finally { + event.preventDefault(); + } + }; + const onClick = options2.actionHandler.disposables.add(new DomEmitter(element, "click")); + const onAuxClick = options2.actionHandler.disposables.add(new DomEmitter(element, "auxclick")); + options2.actionHandler.disposables.add(Event.any(onClick.event, onAuxClick.event)((e) => { + const mouseEvent = new StandardMouseEvent(getWindow(element), e); + if (!mouseEvent.leftButton && !mouseEvent.middleButton) { + return; + } + _activateLink(mouseEvent); + })); + options2.actionHandler.disposables.add(addDisposableListener(element, "keydown", (e) => { + const keyboardEvent = new StandardKeyboardEvent(e); + if (!keyboardEvent.equals( + 10 + /* KeyCode.Space */ + ) && !keyboardEvent.equals( + 3 + /* KeyCode.Enter */ + )) { + return; + } + _activateLink(keyboardEvent); + })); + } + if (!markdown.supportHtml) { + markedOptions.sanitizer = (html2) => { + var _a11; + if ((_a11 = options2.sanitizerOptions) === null || _a11 === void 0 ? void 0 : _a11.replaceWithPlaintext) { + return escape(html2); + } + const match2 = markdown.isTrusted ? html2.match(/^(]+>)|(<\/\s*span>)$/) : void 0; + return match2 ? html2 : ""; + }; + markedOptions.sanitize = true; + markedOptions.silent = true; + } + markedOptions.renderer = renderer; + let value = (_a10 = markdown.value) !== null && _a10 !== void 0 ? _a10 : ""; + if (value.length > 1e5) { + value = `${value.substr(0, 1e5)}\u2026`; + } + if (markdown.supportThemeIcons) { + value = markdownEscapeEscapedIcons(value); + } + let renderedMarkdown; + if (options2.fillInIncompleteTokens) { + const opts = __spreadValues(__spreadValues({}, marked.defaults), markedOptions); + const tokens = marked.lexer(value, opts); + const newTokens = fillInIncompleteTokens(tokens); + renderedMarkdown = marked.parser(newTokens, opts); + } else { + renderedMarkdown = marked.parse(value, markedOptions); + } + if (markdown.supportThemeIcons) { + const elements = renderLabelWithIcons(renderedMarkdown); + renderedMarkdown = elements.map((e) => typeof e === "string" ? e : e.outerHTML).join(""); + } + const htmlParser = new DOMParser(); + const markdownHtmlDoc = htmlParser.parseFromString(sanitizeRenderedMarkdown(__spreadValues({ isTrusted: markdown.isTrusted }, options2.sanitizerOptions), renderedMarkdown), "text/html"); + markdownHtmlDoc.body.querySelectorAll("img, audio, video, source").forEach((img) => { + const src = img.getAttribute("src"); + if (src) { + let href = src; + try { + if (markdown.baseUri) { + href = resolveWithBaseUri(URI.from(markdown.baseUri), href); + } + } catch (err) { + } + img.setAttribute("src", _href(href, true)); + if (options2.remoteImageIsAllowed) { + const uri = URI.parse(href); + if (uri.scheme !== Schemas.file && uri.scheme !== Schemas.data && !options2.remoteImageIsAllowed(uri)) { + img.replaceWith($("", void 0, img.outerHTML)); + } + } + } + }); + markdownHtmlDoc.body.querySelectorAll("a").forEach((a3) => { + const href = a3.getAttribute("href"); + a3.setAttribute("href", ""); + if (!href || /^data:|javascript:/i.test(href) || /^command:/i.test(href) && !markdown.isTrusted || /^command:(\/\/\/)?_workbench\.downloadResource/i.test(href)) { + a3.replaceWith(...a3.childNodes); + } else { + let resolvedHref = _href(href, false); + if (markdown.baseUri) { + resolvedHref = resolveWithBaseUri(URI.from(markdown.baseUri), href); + } + a3.dataset.href = resolvedHref; + } + }); + element.innerHTML = sanitizeRenderedMarkdown(__spreadValues({ isTrusted: markdown.isTrusted }, options2.sanitizerOptions), markdownHtmlDoc.body.innerHTML); + if (codeBlocks.length > 0) { + Promise.all(codeBlocks).then((tuples) => { + var _a11, _b5; + if (isDisposed) { + return; + } + const renderedElements = new Map(tuples); + const placeholderElements = element.querySelectorAll(`div[data-code]`); + for (const placeholderElement of placeholderElements) { + const renderedElement = renderedElements.get((_a11 = placeholderElement.dataset["code"]) !== null && _a11 !== void 0 ? _a11 : ""); + if (renderedElement) { + reset(placeholderElement, renderedElement); + } + } + (_b5 = options2.asyncRenderCallback) === null || _b5 === void 0 ? void 0 : _b5.call(options2); + }); + } else if (syncCodeBlocks.length > 0) { + const renderedElements = new Map(syncCodeBlocks); + const placeholderElements = element.querySelectorAll(`div[data-code]`); + for (const placeholderElement of placeholderElements) { + const renderedElement = renderedElements.get((_b4 = placeholderElement.dataset["code"]) !== null && _b4 !== void 0 ? _b4 : ""); + if (renderedElement) { + reset(placeholderElement, renderedElement); + } + } + } + if (options2.asyncRenderCallback) { + for (const img of element.getElementsByTagName("img")) { + const listener = disposables.add(addDisposableListener(img, "load", () => { + listener.dispose(); + options2.asyncRenderCallback(); + })); + } + } + return { + element, + dispose: () => { + isDisposed = true; + disposables.dispose(); + } + }; +} +function postProcessCodeBlockLanguageId(lang) { + if (!lang) { + return ""; + } + const parts = lang.split(/[\s+|:|,|\{|\?]/, 1); + if (parts.length) { + return parts[0]; + } + return lang; +} +function resolveWithBaseUri(baseUri, href) { + const hasScheme = /^\w[\w\d+.-]*:/.test(href); + if (hasScheme) { + return href; + } + if (baseUri.path.endsWith("/")) { + return resolvePath(baseUri, href).toString(); + } else { + return resolvePath(dirname2(baseUri), href).toString(); + } +} +function sanitizeRenderedMarkdown(options2, renderedMarkdown) { + const { config, allowedSchemes } = getSanitizerOptions(options2); + const store = new DisposableStore(); + store.add(addDompurifyHook("uponSanitizeAttribute", (element, e) => { + var _a10; + if (e.attrName === "style" || e.attrName === "class") { + if (element.tagName === "SPAN") { + if (e.attrName === "style") { + e.keepAttr = /^(color\:(#[0-9a-fA-F]+|var\(--vscode(-[a-zA-Z]+)+\));)?(background-color\:(#[0-9a-fA-F]+|var\(--vscode(-[a-zA-Z]+)+\));)?$/.test(e.attrValue); + return; + } else if (e.attrName === "class") { + e.keepAttr = /^codicon codicon-[a-z\-]+( codicon-modifier-[a-z\-]+)?$/.test(e.attrValue); + return; + } + } + e.keepAttr = false; + return; + } else if (element.tagName === "INPUT" && ((_a10 = element.attributes.getNamedItem("type")) === null || _a10 === void 0 ? void 0 : _a10.value) === "checkbox") { + if (e.attrName === "type" && e.attrValue === "checkbox" || e.attrName === "disabled" || e.attrName === "checked") { + e.keepAttr = true; + return; + } + e.keepAttr = false; + } + })); + store.add(addDompurifyHook("uponSanitizeElement", (element, e) => { + var _a10, _b4; + if (e.tagName === "input") { + if (((_a10 = element.attributes.getNamedItem("type")) === null || _a10 === void 0 ? void 0 : _a10.value) === "checkbox") { + element.setAttribute("disabled", ""); + } else if (!options2.replaceWithPlaintext) { + (_b4 = element.parentElement) === null || _b4 === void 0 ? void 0 : _b4.removeChild(element); + } + } + if (options2.replaceWithPlaintext && !e.allowedTags[e.tagName] && e.tagName !== "body") { + if (element.parentElement) { + let startTagText; + let endTagText; + if (e.tagName === "#comment") { + startTagText = ``; + } else { + const isSelfClosing = selfClosingTags.includes(e.tagName); + const attrString = element.attributes.length ? " " + Array.from(element.attributes).map((attr) => `${attr.name}="${attr.value}"`).join(" ") : ""; + startTagText = `<${e.tagName}${attrString}>`; + if (!isSelfClosing) { + endTagText = ``; + } + } + const fragment = document.createDocumentFragment(); + const textNode = element.parentElement.ownerDocument.createTextNode(startTagText); + fragment.appendChild(textNode); + const endTagTextNode = endTagText ? element.parentElement.ownerDocument.createTextNode(endTagText) : void 0; + while (element.firstChild) { + fragment.appendChild(element.firstChild); + } + if (endTagTextNode) { + fragment.appendChild(endTagTextNode); + } + element.parentElement.replaceChild(fragment, element); + } + } + })); + store.add(hookDomPurifyHrefAndSrcSanitizer(allowedSchemes)); + try { + return sanitize(renderedMarkdown, __spreadProps(__spreadValues({}, config), { RETURN_TRUSTED_TYPE: true })); + } finally { + store.dispose(); + } +} +function getSanitizerOptions(options2) { + var _a10; + const allowedSchemes = [ + Schemas.http, + Schemas.https, + Schemas.mailto, + Schemas.data, + Schemas.file, + Schemas.vscodeFileResource, + Schemas.vscodeRemote, + Schemas.vscodeRemoteResource + ]; + if (options2.isTrusted) { + allowedSchemes.push(Schemas.command); + } + return { + config: { + // allowedTags should included everything that markdown renders to. + // Since we have our own sanitize function for marked, it's possible we missed some tag so let dompurify make sure. + // HTML tags that can result from markdown are from reading https://spec.commonmark.org/0.29/ + // HTML table tags that can result from markdown are from https://github.github.com/gfm/#tables-extension- + ALLOWED_TAGS: (_a10 = options2.allowedTags) !== null && _a10 !== void 0 ? _a10 : [...basicMarkupHtmlTags], + ALLOWED_ATTR: allowedMarkdownAttr, + ALLOW_UNKNOWN_PROTOCOLS: true + }, + allowedSchemes + }; +} +function renderStringAsPlaintext(string2) { + return typeof string2 === "string" ? string2 : renderMarkdownAsPlaintext(string2); +} +function renderMarkdownAsPlaintext(markdown, withCodeBlocks) { + var _a10; + let value = (_a10 = markdown.value) !== null && _a10 !== void 0 ? _a10 : ""; + if (value.length > 1e5) { + value = `${value.substr(0, 1e5)}\u2026`; + } + const html2 = marked.parse(value, { renderer: withCodeBlocks ? plainTextWithCodeBlocksRenderer.value : plainTextRenderer.value }).replace(/&(#\d+|[a-zA-Z]+);/g, (m) => { + var _a11; + return (_a11 = unescapeInfo.get(m)) !== null && _a11 !== void 0 ? _a11 : m; + }); + return sanitizeRenderedMarkdown({ isTrusted: false }, html2).toString(); +} +function createRenderer() { + const renderer = new marked.Renderer(); + renderer.code = (code) => { + return code; + }; + renderer.blockquote = (quote) => { + return quote; + }; + renderer.html = (_html) => { + return ""; + }; + renderer.heading = (text2, _level, _raw) => { + return text2 + "\n"; + }; + renderer.hr = () => { + return ""; + }; + renderer.list = (body, _ordered) => { + return body; + }; + renderer.listitem = (text2) => { + return text2 + "\n"; + }; + renderer.paragraph = (text2) => { + return text2 + "\n"; + }; + renderer.table = (header, body) => { + return header + body + "\n"; + }; + renderer.tablerow = (content) => { + return content; + }; + renderer.tablecell = (content, _flags) => { + return content + " "; + }; + renderer.strong = (text2) => { + return text2; + }; + renderer.em = (text2) => { + return text2; + }; + renderer.codespan = (code) => { + return code; + }; + renderer.br = () => { + return "\n"; + }; + renderer.del = (text2) => { + return text2; + }; + renderer.image = (_href, _title, _text) => { + return ""; + }; + renderer.text = (text2) => { + return text2; + }; + renderer.link = (_href, _title, text2) => { + return text2; + }; + return renderer; +} +function mergeRawTokenText(tokens) { + let mergedTokenText = ""; + tokens.forEach((token) => { + mergedTokenText += token.raw; + }); + return mergedTokenText; +} +function completeSingleLinePattern(token) { + var _a10, _b4; + if (!token.tokens) { + return void 0; + } + for (let i = token.tokens.length - 1; i >= 0; i--) { + const subtoken = token.tokens[i]; + if (subtoken.type === "text") { + const lines = subtoken.raw.split("\n"); + const lastLine = lines[lines.length - 1]; + if (lastLine.includes("`")) { + return completeCodespan(token); + } else if (lastLine.includes("**")) { + return completeDoublestar(token); + } else if (lastLine.match(/\*\w/)) { + return completeStar(token); + } else if (lastLine.match(/(^|\s)__\w/)) { + return completeDoubleUnderscore(token); + } else if (lastLine.match(/(^|\s)_\w/)) { + return completeUnderscore(token); + } else if ( + // Text with start of link target + hasLinkTextAndStartOfLinkTarget(lastLine) || // This token doesn't have the link text, eg if it contains other markdown constructs that are in other subtokens. + // But some preceding token does have an unbalanced [ at least + hasStartOfLinkTargetAndNoLinkText(lastLine) && token.tokens.slice(0, i).some((t4) => t4.type === "text" && t4.raw.match(/\[[^\]]*$/)) + ) { + const nextTwoSubTokens = token.tokens.slice(i + 1); + if ( + // If the link was parsed as a link, then look for a link token and a text token with a quote + ((_a10 = nextTwoSubTokens[0]) === null || _a10 === void 0 ? void 0 : _a10.type) === "link" && ((_b4 = nextTwoSubTokens[1]) === null || _b4 === void 0 ? void 0 : _b4.type) === "text" && nextTwoSubTokens[1].raw.match(/^ *"[^"]*$/) || // And if the link was not parsed as a link (eg command link), just look for a single quote in this token + lastLine.match(/^[^"]* +"[^"]*$/) + ) { + return completeLinkTargetArg(token); + } + return completeLinkTarget(token); + } else if (lastLine.match(/(^|\s)\[\w*/)) { + return completeLinkText(token); + } + } + } + return void 0; +} +function hasLinkTextAndStartOfLinkTarget(str) { + return !!str.match(/(^|\s)\[.*\]\(\w*/); +} +function hasStartOfLinkTargetAndNoLinkText(str) { + return !!str.match(/^[^\[]*\]\([^\)]*$/); +} +function completeListItemPattern(list) { + var _a10; + const lastListItem = list.items[list.items.length - 1]; + const lastListSubToken = lastListItem.tokens ? lastListItem.tokens[lastListItem.tokens.length - 1] : void 0; + let newToken; + if ((lastListSubToken === null || lastListSubToken === void 0 ? void 0 : lastListSubToken.type) === "text" && !("inRawBlock" in lastListItem)) { + newToken = completeSingleLinePattern(lastListSubToken); + } + if (!newToken || newToken.type !== "paragraph") { + return; + } + const previousListItemsText = mergeRawTokenText(list.items.slice(0, -1)); + const lastListItemLead = (_a10 = lastListItem.raw.match(/^(\s*(-|\d+\.) +)/)) === null || _a10 === void 0 ? void 0 : _a10[0]; + if (!lastListItemLead) { + return; + } + const newListItemText = lastListItemLead + mergeRawTokenText(lastListItem.tokens.slice(0, -1)) + newToken.raw; + const newList = marked.lexer(previousListItemsText + newListItemText)[0]; + if (newList.type !== "list") { + return; + } + return newList; +} +function fillInIncompleteTokens(tokens) { + for (let i = 0; i < maxIncompleteTokensFixRounds; i++) { + const newTokens = fillInIncompleteTokensOnce(tokens); + if (newTokens) { + tokens = newTokens; + } else { + break; + } + } + return tokens; +} +function fillInIncompleteTokensOnce(tokens) { + let i; + let newTokens; + for (i = 0; i < tokens.length; i++) { + const token = tokens[i]; + let codeblockStart; + if (token.type === "paragraph" && (codeblockStart = token.raw.match(/(\n|^)(````*)/))) { + const codeblockLead = codeblockStart[2]; + newTokens = completeCodeBlock(tokens.slice(i), codeblockLead); + break; + } + if (token.type === "paragraph" && token.raw.match(/(\n|^)\|/)) { + newTokens = completeTable(tokens.slice(i)); + break; + } + if (i === tokens.length - 1 && token.type === "list") { + const newListToken = completeListItemPattern(token); + if (newListToken) { + newTokens = [newListToken]; + break; + } + } + if (i === tokens.length - 1 && token.type === "paragraph") { + const newToken = completeSingleLinePattern(token); + if (newToken) { + newTokens = [newToken]; + break; + } + } + } + if (newTokens) { + const newTokensList = [ + ...tokens.slice(0, i), + ...newTokens + ]; + newTokensList.links = tokens.links; + return newTokensList; + } + return null; +} +function completeCodeBlock(tokens, leader) { + const mergedRawText = mergeRawTokenText(tokens); + return marked.lexer(mergedRawText + ` +${leader}`); +} +function completeCodespan(token) { + return completeWithString(token, "`"); +} +function completeStar(tokens) { + return completeWithString(tokens, "*"); +} +function completeUnderscore(tokens) { + return completeWithString(tokens, "_"); +} +function completeLinkTarget(tokens) { + return completeWithString(tokens, ")"); +} +function completeLinkTargetArg(tokens) { + return completeWithString(tokens, '")'); +} +function completeLinkText(tokens) { + return completeWithString(tokens, "](https://microsoft.com)"); +} +function completeDoublestar(tokens) { + return completeWithString(tokens, "**"); +} +function completeDoubleUnderscore(tokens) { + return completeWithString(tokens, "__"); +} +function completeWithString(tokens, closingString) { + const mergedRawText = mergeRawTokenText(Array.isArray(tokens) ? tokens : [tokens]); + return marked.lexer(mergedRawText + closingString)[0]; +} +function completeTable(tokens) { + const mergedRawText = mergeRawTokenText(tokens); + const lines = mergedRawText.split("\n"); + let numCols; + let hasSeparatorRow = false; + for (let i = 0; i < lines.length; i++) { + const line = lines[i].trim(); + if (typeof numCols === "undefined" && line.match(/^\s*\|/)) { + const line1Matches = line.match(/(\|[^\|]+)(?=\||$)/g); + if (line1Matches) { + numCols = line1Matches.length; + } + } else if (typeof numCols === "number") { + if (line.match(/^\s*\|/)) { + if (i !== lines.length - 1) { + return void 0; + } + hasSeparatorRow = true; + } else { + return void 0; + } + } + } + if (typeof numCols === "number" && numCols > 0) { + const prefixText = hasSeparatorRow ? lines.slice(0, -1).join("\n") : mergedRawText; + const line1EndsInPipe = !!prefixText.match(/\|\s*$/); + const newRawText = prefixText + (line1EndsInPipe ? "" : "|") + ` +|${" --- |".repeat(numCols)}`; + return marked.lexer(newRawText); + } + return void 0; +} +function addDompurifyHook(hook, cb) { + addHook(hook, cb); + return toDisposable(() => removeHook(hook)); +} +var defaultMarkedRenderers, selfClosingTags, allowedMarkdownAttr, unescapeInfo, plainTextRenderer, plainTextWithCodeBlocksRenderer, maxIncompleteTokensFixRounds; +var init_markdownRenderer = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/markdownRenderer.js"() { + init_dom(); + init_dompurify(); + init_event2(); + init_formattedTextRenderer(); + init_keyboardEvent(); + init_mouseEvent(); + init_iconLabels(); + init_errors(); + init_event(); + init_htmlContent(); + init_iconLabels2(); + init_idGenerator(); + init_lazy(); + init_lifecycle(); + init_marked(); + init_marshalling(); + init_network(); + init_objects(); + init_resources(); + init_strings(); + init_uri(); + defaultMarkedRenderers = Object.freeze({ + image: (href, title, text2) => { + let dimensions = []; + let attributes = []; + if (href) { + ({ href, dimensions } = parseHrefAndDimensions(href)); + attributes.push(`src="${escapeDoubleQuotes(href)}"`); + } + if (text2) { + attributes.push(`alt="${escapeDoubleQuotes(text2)}"`); + } + if (title) { + attributes.push(`title="${escapeDoubleQuotes(title)}"`); + } + if (dimensions.length) { + attributes = attributes.concat(dimensions); + } + return ""; + }, + paragraph: (text2) => { + return `

    ${text2}

    `; + }, + link: (href, title, text2) => { + if (typeof href !== "string") { + return ""; + } + if (href === text2) { + text2 = removeMarkdownEscapes(text2); + } + title = typeof title === "string" ? escapeDoubleQuotes(removeMarkdownEscapes(title)) : ""; + href = removeMarkdownEscapes(href); + href = href.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); + return `
    ${text2}`; + } + }); + selfClosingTags = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]; + allowedMarkdownAttr = [ + "align", + "autoplay", + "alt", + "checked", + "class", + "controls", + "data-code", + "data-href", + "disabled", + "draggable", + "height", + "href", + "loop", + "muted", + "playsinline", + "poster", + "src", + "style", + "target", + "title", + "type", + "width", + "start" + ]; + unescapeInfo = /* @__PURE__ */ new Map([ + [""", '"'], + [" ", " "], + ["&", "&"], + ["'", "'"], + ["<", "<"], + [">", ">"] + ]); + plainTextRenderer = new Lazy((withCodeBlocks) => createRenderer()); + plainTextWithCodeBlocksRenderer = new Lazy(() => { + const renderer = createRenderer(); + renderer.code = (code) => { + return "\n```" + code + "```\n"; + }; + return renderer; + }); + maxIncompleteTokensFixRounds = 3; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/markdownRenderer/browser/renderedMarkdown.css +var init_renderedMarkdown = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/markdownRenderer/browser/renderedMarkdown.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer.js +function openLinkFromMarkdown(openerService, link, isTrusted) { + return __async(this, null, function* () { + try { + return yield openerService.open(link, { + fromUserGesture: true, + allowContributedOpeners: true, + allowCommands: toAllowCommandsOption(isTrusted) + }); + } catch (e) { + onUnexpectedError(e); + return false; + } + }); +} +function toAllowCommandsOption(isTrusted) { + if (isTrusted === true) { + return true; + } + if (isTrusted && Array.isArray(isTrusted.enabledCommands)) { + return isTrusted.enabledCommands; + } + return false; +} +var __decorate22, __param21, MarkdownRenderer_1, MarkdownRenderer; +var init_markdownRenderer2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer.js"() { + init_markdownRenderer(); + init_trustedTypes(); + init_errors(); + init_event(); + init_lifecycle(); + init_renderedMarkdown(); + init_domFontInfo(); + init_language(); + init_modesRegistry(); + init_textToHtmlTokenizer(); + init_opener(); + __decorate22 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param21 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + MarkdownRenderer = MarkdownRenderer_1 = class MarkdownRenderer2 { + constructor(_options, _languageService, _openerService) { + this._options = _options; + this._languageService = _languageService; + this._openerService = _openerService; + this._onDidRenderAsync = new Emitter(); + this.onDidRenderAsync = this._onDidRenderAsync.event; + } + dispose() { + this._onDidRenderAsync.dispose(); + } + render(markdown, options2, markedOptions) { + if (!markdown) { + const element = document.createElement("span"); + return { element, dispose: () => { + } }; + } + const disposables = new DisposableStore(); + const rendered = disposables.add(renderMarkdown(markdown, __spreadValues(__spreadValues({}, this._getRenderOptions(markdown, disposables)), options2), markedOptions)); + rendered.element.classList.add("rendered-markdown"); + return { + element: rendered.element, + dispose: () => disposables.dispose() + }; + } + _getRenderOptions(markdown, disposables) { + return { + codeBlockRenderer: (languageAlias, value) => __async(this, null, function* () { + var _a10, _b4, _c2; + let languageId; + if (languageAlias) { + languageId = this._languageService.getLanguageIdByLanguageName(languageAlias); + } else if (this._options.editor) { + languageId = (_a10 = this._options.editor.getModel()) === null || _a10 === void 0 ? void 0 : _a10.getLanguageId(); + } + if (!languageId) { + languageId = PLAINTEXT_LANGUAGE_ID; + } + const html2 = yield tokenizeToString(this._languageService, value, languageId); + const element = document.createElement("span"); + element.innerHTML = (_c2 = (_b4 = MarkdownRenderer_1._ttpTokenizer) === null || _b4 === void 0 ? void 0 : _b4.createHTML(html2)) !== null && _c2 !== void 0 ? _c2 : html2; + if (this._options.editor) { + const fontInfo = this._options.editor.getOption( + 50 + /* EditorOption.fontInfo */ + ); + applyFontInfo(element, fontInfo); + } else if (this._options.codeBlockFontFamily) { + element.style.fontFamily = this._options.codeBlockFontFamily; + } + if (this._options.codeBlockFontSize !== void 0) { + element.style.fontSize = this._options.codeBlockFontSize; + } + return element; + }), + asyncRenderCallback: () => this._onDidRenderAsync.fire(), + actionHandler: { + callback: (link) => openLinkFromMarkdown(this._openerService, link, markdown.isTrusted), + disposables + } + }; + } + }; + MarkdownRenderer._ttpTokenizer = createTrustedTypesPolicy("tokenizeToString", { + createHTML(html2) { + return html2; + } + }); + MarkdownRenderer = MarkdownRenderer_1 = __decorate22([ + __param21(1, ILanguageService), + __param21(2, IOpenerService) + ], MarkdownRenderer); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/services/hoverService/hoverWidget.js +var __decorate23, __param22, $3, HoverWidget2, CompositeMouseTracker, ElementHoverTarget; +var init_hoverWidget3 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/services/hoverService/hoverWidget.js"() { + init_hover2(); + init_lifecycle(); + init_event(); + init_dom(); + init_keybinding(); + init_configuration(); + init_editorOptions(); + init_hoverWidget2(); + init_widget(); + init_opener(); + init_instantiation(); + init_markdownRenderer2(); + init_htmlContent(); + init_nls(); + init_platform(); + init_accessibility(); + init_aria2(); + __decorate23 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param22 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + $3 = $; + HoverWidget2 = class HoverWidget3 extends Widget { + get _targetWindow() { + return getWindow(this._target.targetElements[0]); + } + get _targetDocumentElement() { + return getWindow(this._target.targetElements[0]).document.documentElement; + } + get isDisposed() { + return this._isDisposed; + } + get isMouseIn() { + return this._lockMouseTracker.isMouseIn; + } + get domNode() { + return this._hover.containerDomNode; + } + get onDispose() { + return this._onDispose.event; + } + get onRequestLayout() { + return this._onRequestLayout.event; + } + get anchor() { + return this._hoverPosition === 2 ? 0 : 1; + } + get x() { + return this._x; + } + get y() { + return this._y; + } + /** + * Whether the hover is "locked" by holding the alt/option key. When locked, the hover will not + * hide and can be hovered regardless of whether the `hideOnHover` hover option is set. + */ + get isLocked() { + return this._isLocked; + } + set isLocked(value) { + if (this._isLocked === value) { + return; + } + this._isLocked = value; + this._hoverContainer.classList.toggle("locked", this._isLocked); + } + constructor(options2, _keybindingService, _configurationService, _openerService, _instantiationService, _accessibilityService) { + var _a10, _b4, _c2, _d2, _e2, _f3, _g2, _h2; + super(); + this._keybindingService = _keybindingService; + this._configurationService = _configurationService; + this._openerService = _openerService; + this._instantiationService = _instantiationService; + this._accessibilityService = _accessibilityService; + this._messageListeners = new DisposableStore(); + this._isDisposed = false; + this._forcePosition = false; + this._x = 0; + this._y = 0; + this._isLocked = false; + this._enableFocusTraps = false; + this._addedFocusTrap = false; + this._onDispose = this._register(new Emitter()); + this._onRequestLayout = this._register(new Emitter()); + this._linkHandler = options2.linkHandler || ((url) => { + return openLinkFromMarkdown(this._openerService, url, isMarkdownString(options2.content) ? options2.content.isTrusted : void 0); + }); + this._target = "targetElements" in options2.target ? options2.target : new ElementHoverTarget(options2.target); + this._hoverPointer = ((_a10 = options2.appearance) === null || _a10 === void 0 ? void 0 : _a10.showPointer) ? $3("div.workbench-hover-pointer") : void 0; + this._hover = this._register(new HoverWidget()); + this._hover.containerDomNode.classList.add("workbench-hover", "fadeIn"); + if ((_b4 = options2.appearance) === null || _b4 === void 0 ? void 0 : _b4.compact) { + this._hover.containerDomNode.classList.add("workbench-hover", "compact"); + } + if ((_c2 = options2.appearance) === null || _c2 === void 0 ? void 0 : _c2.skipFadeInAnimation) { + this._hover.containerDomNode.classList.add("skip-fade-in"); + } + if (options2.additionalClasses) { + this._hover.containerDomNode.classList.add(...options2.additionalClasses); + } + if ((_d2 = options2.position) === null || _d2 === void 0 ? void 0 : _d2.forcePosition) { + this._forcePosition = true; + } + if (options2.trapFocus) { + this._enableFocusTraps = true; + } + this._hoverPosition = (_f3 = (_e2 = options2.position) === null || _e2 === void 0 ? void 0 : _e2.hoverPosition) !== null && _f3 !== void 0 ? _f3 : 3; + this.onmousedown(this._hover.containerDomNode, (e) => e.stopPropagation()); + this.onkeydown(this._hover.containerDomNode, (e) => { + if (e.equals( + 9 + /* KeyCode.Escape */ + )) { + this.dispose(); + } + }); + this._register(addDisposableListener(this._targetWindow, "blur", () => this.dispose())); + const rowElement = $3("div.hover-row.markdown-hover"); + const contentsElement = $3("div.hover-contents"); + if (typeof options2.content === "string") { + contentsElement.textContent = options2.content; + contentsElement.style.whiteSpace = "pre-wrap"; + } else if (isHTMLElement(options2.content)) { + contentsElement.appendChild(options2.content); + contentsElement.classList.add("html-hover-contents"); + } else { + const markdown = options2.content; + const mdRenderer = this._instantiationService.createInstance(MarkdownRenderer, { codeBlockFontFamily: this._configurationService.getValue("editor").fontFamily || EDITOR_FONT_DEFAULTS.fontFamily }); + const { element } = mdRenderer.render(markdown, { + actionHandler: { + callback: (content) => this._linkHandler(content), + disposables: this._messageListeners + }, + asyncRenderCallback: () => { + contentsElement.classList.add("code-hover-contents"); + this.layout(); + this._onRequestLayout.fire(); + } + }); + contentsElement.appendChild(element); + } + rowElement.appendChild(contentsElement); + this._hover.contentsDomNode.appendChild(rowElement); + if (options2.actions && options2.actions.length > 0) { + const statusBarElement = $3("div.hover-row.status-bar"); + const actionsElement = $3("div.actions"); + options2.actions.forEach((action) => { + const keybinding = this._keybindingService.lookupKeybinding(action.commandId); + const keybindingLabel = keybinding ? keybinding.getLabel() : null; + HoverAction.render(actionsElement, { + label: action.label, + commandId: action.commandId, + run: (e) => { + action.run(e); + this.dispose(); + }, + iconClass: action.iconClass + }, keybindingLabel); + }); + statusBarElement.appendChild(actionsElement); + this._hover.containerDomNode.appendChild(statusBarElement); + } + this._hoverContainer = $3("div.workbench-hover-container"); + if (this._hoverPointer) { + this._hoverContainer.appendChild(this._hoverPointer); + } + this._hoverContainer.appendChild(this._hover.containerDomNode); + let hideOnHover; + if (options2.actions && options2.actions.length > 0) { + hideOnHover = false; + } else { + if (((_g2 = options2.persistence) === null || _g2 === void 0 ? void 0 : _g2.hideOnHover) === void 0) { + hideOnHover = typeof options2.content === "string" || isMarkdownString(options2.content) && !options2.content.value.includes("](") && !options2.content.value.includes(""); + } else { + hideOnHover = options2.persistence.hideOnHover; + } + } + if (hideOnHover && ((_h2 = options2.appearance) === null || _h2 === void 0 ? void 0 : _h2.showHoverHint)) { + const statusBarElement = $3("div.hover-row.status-bar"); + const infoElement = $3("div.info"); + infoElement.textContent = localize("hoverhint", "Hold {0} key to mouse over", isMacintosh ? "Option" : "Alt"); + statusBarElement.appendChild(infoElement); + this._hover.containerDomNode.appendChild(statusBarElement); + } + const mouseTrackerTargets = [...this._target.targetElements]; + if (!hideOnHover) { + mouseTrackerTargets.push(this._hoverContainer); + } + const mouseTracker = this._register(new CompositeMouseTracker(mouseTrackerTargets)); + this._register(mouseTracker.onMouseOut(() => { + if (!this._isLocked) { + this.dispose(); + } + })); + if (hideOnHover) { + const mouseTracker2Targets = [...this._target.targetElements, this._hoverContainer]; + this._lockMouseTracker = this._register(new CompositeMouseTracker(mouseTracker2Targets)); + this._register(this._lockMouseTracker.onMouseOut(() => { + if (!this._isLocked) { + this.dispose(); + } + })); + } else { + this._lockMouseTracker = mouseTracker; + } + } + addFocusTrap() { + if (!this._enableFocusTraps || this._addedFocusTrap) { + return; + } + this._addedFocusTrap = true; + const firstContainerFocusElement = this._hover.containerDomNode; + const lastContainerFocusElement = this.findLastFocusableChild(this._hover.containerDomNode); + if (lastContainerFocusElement) { + const beforeContainerFocusElement = prepend(this._hoverContainer, $3("div")); + const afterContainerFocusElement = append(this._hoverContainer, $3("div")); + beforeContainerFocusElement.tabIndex = 0; + afterContainerFocusElement.tabIndex = 0; + this._register(addDisposableListener(afterContainerFocusElement, "focus", (e) => { + firstContainerFocusElement.focus(); + e.preventDefault(); + })); + this._register(addDisposableListener(beforeContainerFocusElement, "focus", (e) => { + lastContainerFocusElement.focus(); + e.preventDefault(); + })); + } + } + findLastFocusableChild(root) { + if (root.hasChildNodes()) { + for (let i = 0; i < root.childNodes.length; i++) { + const node = root.childNodes.item(root.childNodes.length - i - 1); + if (node.nodeType === node.ELEMENT_NODE) { + const parsedNode = node; + if (typeof parsedNode.tabIndex === "number" && parsedNode.tabIndex >= 0) { + return parsedNode; + } + } + const recursivelyFoundElement = this.findLastFocusableChild(node); + if (recursivelyFoundElement) { + return recursivelyFoundElement; + } + } + } + return void 0; + } + render(container) { + var _a10; + container.appendChild(this._hoverContainer); + const hoverFocused = this._hoverContainer.contains(this._hoverContainer.ownerDocument.activeElement); + const accessibleViewHint = hoverFocused && getHoverAccessibleViewHint(this._configurationService.getValue("accessibility.verbosity.hover") === true && this._accessibilityService.isScreenReaderOptimized(), (_a10 = this._keybindingService.lookupKeybinding("editor.action.accessibleView")) === null || _a10 === void 0 ? void 0 : _a10.getAriaLabel()); + if (accessibleViewHint) { + status(accessibleViewHint); + } + this.layout(); + this.addFocusTrap(); + } + layout() { + this._hover.containerDomNode.classList.remove("right-aligned"); + this._hover.contentsDomNode.style.maxHeight = ""; + const getZoomAccountedBoundingClientRect = (e) => { + const zoom = getDomNodeZoomLevel(e); + const boundingRect = e.getBoundingClientRect(); + return { + top: boundingRect.top * zoom, + bottom: boundingRect.bottom * zoom, + right: boundingRect.right * zoom, + left: boundingRect.left * zoom + }; + }; + const targetBounds = this._target.targetElements.map((e) => getZoomAccountedBoundingClientRect(e)); + const { top, right, bottom, left } = targetBounds[0]; + const width2 = right - left; + const height = bottom - top; + const targetRect = { + top, + right, + bottom, + left, + width: width2, + height, + center: { + x: left + width2 / 2, + y: top + height / 2 + } + }; + this.adjustHorizontalHoverPosition(targetRect); + this.adjustVerticalHoverPosition(targetRect); + this.adjustHoverMaxHeight(targetRect); + this._hoverContainer.style.padding = ""; + this._hoverContainer.style.margin = ""; + if (this._hoverPointer) { + switch (this._hoverPosition) { + case 1: + targetRect.left += 3; + targetRect.right += 3; + this._hoverContainer.style.paddingLeft = `${3}px`; + this._hoverContainer.style.marginLeft = `${-3}px`; + break; + case 0: + targetRect.left -= 3; + targetRect.right -= 3; + this._hoverContainer.style.paddingRight = `${3}px`; + this._hoverContainer.style.marginRight = `${-3}px`; + break; + case 2: + targetRect.top += 3; + targetRect.bottom += 3; + this._hoverContainer.style.paddingTop = `${3}px`; + this._hoverContainer.style.marginTop = `${-3}px`; + break; + case 3: + targetRect.top -= 3; + targetRect.bottom -= 3; + this._hoverContainer.style.paddingBottom = `${3}px`; + this._hoverContainer.style.marginBottom = `${-3}px`; + break; + } + targetRect.center.x = targetRect.left + width2 / 2; + targetRect.center.y = targetRect.top + height / 2; + } + this.computeXCordinate(targetRect); + this.computeYCordinate(targetRect); + if (this._hoverPointer) { + this._hoverPointer.classList.remove("top"); + this._hoverPointer.classList.remove("left"); + this._hoverPointer.classList.remove("right"); + this._hoverPointer.classList.remove("bottom"); + this.setHoverPointerPosition(targetRect); + } + this._hover.onContentsChanged(); + } + computeXCordinate(target) { + const hoverWidth = this._hover.containerDomNode.clientWidth + 2; + if (this._target.x !== void 0) { + this._x = this._target.x; + } else if (this._hoverPosition === 1) { + this._x = target.right; + } else if (this._hoverPosition === 0) { + this._x = target.left - hoverWidth; + } else { + if (this._hoverPointer) { + this._x = target.center.x - this._hover.containerDomNode.clientWidth / 2; + } else { + this._x = target.left; + } + if (this._x + hoverWidth >= this._targetDocumentElement.clientWidth) { + this._hover.containerDomNode.classList.add("right-aligned"); + this._x = Math.max(this._targetDocumentElement.clientWidth - hoverWidth - 2, this._targetDocumentElement.clientLeft); + } + } + if (this._x < this._targetDocumentElement.clientLeft) { + this._x = target.left + 2; + } + } + computeYCordinate(target) { + if (this._target.y !== void 0) { + this._y = this._target.y; + } else if (this._hoverPosition === 3) { + this._y = target.top; + } else if (this._hoverPosition === 2) { + this._y = target.bottom - 2; + } else { + if (this._hoverPointer) { + this._y = target.center.y + this._hover.containerDomNode.clientHeight / 2; + } else { + this._y = target.bottom; + } + } + if (this._y > this._targetWindow.innerHeight) { + this._y = target.bottom; + } + } + adjustHorizontalHoverPosition(target) { + if (this._target.x !== void 0) { + return; + } + const hoverPointerOffset = this._hoverPointer ? 3 : 0; + if (this._forcePosition) { + const padding = hoverPointerOffset + 2; + if (this._hoverPosition === 1) { + this._hover.containerDomNode.style.maxWidth = `${this._targetDocumentElement.clientWidth - target.right - padding}px`; + } else if (this._hoverPosition === 0) { + this._hover.containerDomNode.style.maxWidth = `${target.left - padding}px`; + } + return; + } + if (this._hoverPosition === 1) { + const roomOnRight = this._targetDocumentElement.clientWidth - target.right; + if (roomOnRight < this._hover.containerDomNode.clientWidth + hoverPointerOffset) { + const roomOnLeft = target.left; + if (roomOnLeft >= this._hover.containerDomNode.clientWidth + hoverPointerOffset) { + this._hoverPosition = 0; + } else { + this._hoverPosition = 2; + } + } + } else if (this._hoverPosition === 0) { + const roomOnLeft = target.left; + if (roomOnLeft < this._hover.containerDomNode.clientWidth + hoverPointerOffset) { + const roomOnRight = this._targetDocumentElement.clientWidth - target.right; + if (roomOnRight >= this._hover.containerDomNode.clientWidth + hoverPointerOffset) { + this._hoverPosition = 1; + } else { + this._hoverPosition = 2; + } + } + if (target.left - this._hover.containerDomNode.clientWidth - hoverPointerOffset <= this._targetDocumentElement.clientLeft) { + this._hoverPosition = 1; + } + } + } + adjustVerticalHoverPosition(target) { + if (this._target.y !== void 0 || this._forcePosition) { + return; + } + const hoverPointerOffset = this._hoverPointer ? 3 : 0; + if (this._hoverPosition === 3) { + if (target.top - this._hover.containerDomNode.clientHeight - hoverPointerOffset < 0) { + this._hoverPosition = 2; + } + } else if (this._hoverPosition === 2) { + if (target.bottom + this._hover.containerDomNode.clientHeight + hoverPointerOffset > this._targetWindow.innerHeight) { + this._hoverPosition = 3; + } + } + } + adjustHoverMaxHeight(target) { + let maxHeight = this._targetWindow.innerHeight / 2; + if (this._forcePosition) { + const padding = (this._hoverPointer ? 3 : 0) + 2; + if (this._hoverPosition === 3) { + maxHeight = Math.min(maxHeight, target.top - padding); + } else if (this._hoverPosition === 2) { + maxHeight = Math.min(maxHeight, this._targetWindow.innerHeight - target.bottom - padding); + } + } + this._hover.containerDomNode.style.maxHeight = `${maxHeight}px`; + if (this._hover.contentsDomNode.clientHeight < this._hover.contentsDomNode.scrollHeight) { + const extraRightPadding = `${this._hover.scrollbar.options.verticalScrollbarSize}px`; + if (this._hover.contentsDomNode.style.paddingRight !== extraRightPadding) { + this._hover.contentsDomNode.style.paddingRight = extraRightPadding; + } + } + } + setHoverPointerPosition(target) { + if (!this._hoverPointer) { + return; + } + switch (this._hoverPosition) { + case 0: + case 1: { + this._hoverPointer.classList.add(this._hoverPosition === 0 ? "right" : "left"); + const hoverHeight = this._hover.containerDomNode.clientHeight; + if (hoverHeight > target.height) { + this._hoverPointer.style.top = `${target.center.y - (this._y - hoverHeight) - 3}px`; + } else { + this._hoverPointer.style.top = `${Math.round(hoverHeight / 2) - 3}px`; + } + break; + } + case 3: + case 2: { + this._hoverPointer.classList.add(this._hoverPosition === 3 ? "bottom" : "top"); + const hoverWidth = this._hover.containerDomNode.clientWidth; + let pointerLeftPosition = Math.round(hoverWidth / 2) - 3; + const pointerX = this._x + pointerLeftPosition; + if (pointerX < target.left || pointerX > target.right) { + pointerLeftPosition = target.center.x - this._x - 3; + } + this._hoverPointer.style.left = `${pointerLeftPosition}px`; + break; + } + } + } + focus() { + this._hover.containerDomNode.focus(); + } + dispose() { + if (!this._isDisposed) { + this._onDispose.fire(); + this._hoverContainer.remove(); + this._messageListeners.dispose(); + this._target.dispose(); + super.dispose(); + } + this._isDisposed = true; + } + }; + HoverWidget2 = __decorate23([ + __param22(1, IKeybindingService), + __param22(2, IConfigurationService), + __param22(3, IOpenerService), + __param22(4, IInstantiationService), + __param22(5, IAccessibilityService) + ], HoverWidget2); + CompositeMouseTracker = class extends Widget { + get onMouseOut() { + return this._onMouseOut.event; + } + get isMouseIn() { + return this._isMouseIn; + } + constructor(_elements) { + super(); + this._elements = _elements; + this._isMouseIn = true; + this._onMouseOut = this._register(new Emitter()); + this._elements.forEach((n) => this.onmouseover(n, () => this._onTargetMouseOver(n))); + this._elements.forEach((n) => this.onmouseleave(n, () => this._onTargetMouseLeave(n))); + } + _onTargetMouseOver(target) { + this._isMouseIn = true; + this._clearEvaluateMouseStateTimeout(target); + } + _onTargetMouseLeave(target) { + this._isMouseIn = false; + this._evaluateMouseState(target); + } + _evaluateMouseState(target) { + this._clearEvaluateMouseStateTimeout(target); + this._mouseTimeout = getWindow(target).setTimeout(() => this._fireIfMouseOutside(), 0); + } + _clearEvaluateMouseStateTimeout(target) { + if (this._mouseTimeout) { + getWindow(target).clearTimeout(this._mouseTimeout); + this._mouseTimeout = void 0; + } + } + _fireIfMouseOutside() { + if (!this._isMouseIn) { + this._onMouseOut.fire(); + } + } + }; + ElementHoverTarget = class { + constructor(_element) { + this._element = _element; + this.targetElements = [this._element]; + } + dispose() { + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/range.js +var Range2; +var init_range2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/range.js"() { + (function(Range10) { + function intersect(one, other) { + if (one.start >= other.end || other.start >= one.end) { + return { start: 0, end: 0 }; + } + const start = Math.max(one.start, other.start); + const end = Math.min(one.end, other.end); + if (end - start <= 0) { + return { start: 0, end: 0 }; + } + return { start, end }; + } + Range10.intersect = intersect; + function isEmpty(range2) { + return range2.end - range2.start <= 0; + } + Range10.isEmpty = isEmpty; + function intersects2(one, other) { + return !isEmpty(intersect(one, other)); + } + Range10.intersects = intersects2; + function relativeComplement2(one, other) { + const result = []; + const first2 = { start: one.start, end: Math.min(other.start, one.end) }; + const second = { start: Math.max(other.end, one.start), end: one.end }; + if (!isEmpty(first2)) { + result.push(first2); + } + if (!isEmpty(second)) { + result.push(second); + } + return result; + } + Range10.relativeComplement = relativeComplement2; + })(Range2 || (Range2 = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/contextview/contextview.css +var init_contextview = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/contextview/contextview.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/contextview/contextview.js +function isAnchor(obj) { + const anchor = obj; + return !!anchor && typeof anchor.x === "number" && typeof anchor.y === "number"; +} +function layout(viewportSize, viewSize, anchor) { + const layoutAfterAnchorBoundary = anchor.mode === LayoutAnchorMode.ALIGN ? anchor.offset : anchor.offset + anchor.size; + const layoutBeforeAnchorBoundary = anchor.mode === LayoutAnchorMode.ALIGN ? anchor.offset + anchor.size : anchor.offset; + if (anchor.position === 0) { + if (viewSize <= viewportSize - layoutAfterAnchorBoundary) { + return layoutAfterAnchorBoundary; + } + if (viewSize <= layoutBeforeAnchorBoundary) { + return layoutBeforeAnchorBoundary - viewSize; + } + return Math.max(viewportSize - viewSize, 0); + } else { + if (viewSize <= layoutBeforeAnchorBoundary) { + return layoutBeforeAnchorBoundary - viewSize; + } + if (viewSize <= viewportSize - layoutAfterAnchorBoundary) { + return layoutAfterAnchorBoundary; + } + return 0; + } +} +var LayoutAnchorMode, ContextView, SHADOW_ROOT_CSS; +var init_contextview2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/contextview/contextview.js"() { + init_canIUse(); + init_dom(); + init_lifecycle(); + init_platform(); + init_range2(); + init_contextview(); + (function(LayoutAnchorMode2) { + LayoutAnchorMode2[LayoutAnchorMode2["AVOID"] = 0] = "AVOID"; + LayoutAnchorMode2[LayoutAnchorMode2["ALIGN"] = 1] = "ALIGN"; + })(LayoutAnchorMode || (LayoutAnchorMode = {})); + ContextView = class _ContextView extends Disposable { + constructor(container, domPosition) { + super(); + this.container = null; + this.useFixedPosition = false; + this.useShadowDOM = false; + this.delegate = null; + this.toDisposeOnClean = Disposable.None; + this.toDisposeOnSetContainer = Disposable.None; + this.shadowRoot = null; + this.shadowRootHostElement = null; + this.view = $(".context-view"); + hide(this.view); + this.setContainer(container, domPosition); + this._register(toDisposable(() => this.setContainer( + null, + 1 + /* ContextViewDOMPosition.ABSOLUTE */ + ))); + } + setContainer(container, domPosition) { + var _a10; + this.useFixedPosition = domPosition !== 1; + const usedShadowDOM = this.useShadowDOM; + this.useShadowDOM = domPosition === 3; + if (container === this.container && usedShadowDOM === this.useShadowDOM) { + return; + } + if (this.container) { + this.toDisposeOnSetContainer.dispose(); + if (this.shadowRoot) { + this.shadowRoot.removeChild(this.view); + this.shadowRoot = null; + (_a10 = this.shadowRootHostElement) === null || _a10 === void 0 ? void 0 : _a10.remove(); + this.shadowRootHostElement = null; + } else { + this.container.removeChild(this.view); + } + this.container = null; + } + if (container) { + this.container = container; + if (this.useShadowDOM) { + this.shadowRootHostElement = $(".shadow-root-host"); + this.container.appendChild(this.shadowRootHostElement); + this.shadowRoot = this.shadowRootHostElement.attachShadow({ mode: "open" }); + const style = document.createElement("style"); + style.textContent = SHADOW_ROOT_CSS; + this.shadowRoot.appendChild(style); + this.shadowRoot.appendChild(this.view); + this.shadowRoot.appendChild($("slot")); + } else { + this.container.appendChild(this.view); + } + const toDisposeOnSetContainer = new DisposableStore(); + _ContextView.BUBBLE_UP_EVENTS.forEach((event) => { + toDisposeOnSetContainer.add(addStandardDisposableListener(this.container, event, (e) => { + this.onDOMEvent(e, false); + })); + }); + _ContextView.BUBBLE_DOWN_EVENTS.forEach((event) => { + toDisposeOnSetContainer.add(addStandardDisposableListener(this.container, event, (e) => { + this.onDOMEvent(e, true); + }, true)); + }); + this.toDisposeOnSetContainer = toDisposeOnSetContainer; + } + } + show(delegate) { + var _a10, _b4, _c2; + if (this.isVisible()) { + this.hide(); + } + clearNode(this.view); + this.view.className = "context-view monaco-component"; + this.view.style.top = "0px"; + this.view.style.left = "0px"; + this.view.style.zIndex = `${2575 + ((_a10 = delegate.layer) !== null && _a10 !== void 0 ? _a10 : 0)}`; + this.view.style.position = this.useFixedPosition ? "fixed" : "absolute"; + show(this.view); + this.toDisposeOnClean = delegate.render(this.view) || Disposable.None; + this.delegate = delegate; + this.doLayout(); + (_c2 = (_b4 = this.delegate).focus) === null || _c2 === void 0 ? void 0 : _c2.call(_b4); + } + getViewElement() { + return this.view; + } + layout() { + var _a10, _b4; + if (!this.isVisible()) { + return; + } + if (this.delegate.canRelayout === false && !(isIOS && BrowserFeatures.pointerEvents)) { + this.hide(); + return; + } + (_b4 = (_a10 = this.delegate) === null || _a10 === void 0 ? void 0 : _a10.layout) === null || _b4 === void 0 ? void 0 : _b4.call(_a10); + this.doLayout(); + } + doLayout() { + if (!this.isVisible()) { + return; + } + const anchor = this.delegate.getAnchor(); + let around; + if (isHTMLElement(anchor)) { + const elementPosition = getDomNodePagePosition(anchor); + const zoom = getDomNodeZoomLevel(anchor); + around = { + top: elementPosition.top * zoom, + left: elementPosition.left * zoom, + width: elementPosition.width * zoom, + height: elementPosition.height * zoom + }; + } else if (isAnchor(anchor)) { + around = { + top: anchor.y, + left: anchor.x, + width: anchor.width || 1, + height: anchor.height || 2 + }; + } else { + around = { + top: anchor.posy, + left: anchor.posx, + // We are about to position the context view where the mouse + // cursor is. To prevent the view being exactly under the mouse + // when showing and thus potentially triggering an action within, + // we treat the mouse location like a small sized block element. + width: 2, + height: 2 + }; + } + const viewSizeWidth = getTotalWidth(this.view); + const viewSizeHeight = getTotalHeight(this.view); + const anchorPosition = this.delegate.anchorPosition || 0; + const anchorAlignment = this.delegate.anchorAlignment || 0; + const anchorAxisAlignment = this.delegate.anchorAxisAlignment || 0; + let top; + let left; + const activeWindow = getActiveWindow(); + if (anchorAxisAlignment === 0) { + const verticalAnchor = { + offset: around.top - activeWindow.pageYOffset, + size: around.height, + position: anchorPosition === 0 ? 0 : 1 + /* LayoutAnchorPosition.After */ + }; + const horizontalAnchor = { offset: around.left, size: around.width, position: anchorAlignment === 0 ? 0 : 1, mode: LayoutAnchorMode.ALIGN }; + top = layout(activeWindow.innerHeight, viewSizeHeight, verticalAnchor) + activeWindow.pageYOffset; + if (Range2.intersects({ start: top, end: top + viewSizeHeight }, { start: verticalAnchor.offset, end: verticalAnchor.offset + verticalAnchor.size })) { + horizontalAnchor.mode = LayoutAnchorMode.AVOID; + } + left = layout(activeWindow.innerWidth, viewSizeWidth, horizontalAnchor); + } else { + const horizontalAnchor = { + offset: around.left, + size: around.width, + position: anchorAlignment === 0 ? 0 : 1 + /* LayoutAnchorPosition.After */ + }; + const verticalAnchor = { offset: around.top, size: around.height, position: anchorPosition === 0 ? 0 : 1, mode: LayoutAnchorMode.ALIGN }; + left = layout(activeWindow.innerWidth, viewSizeWidth, horizontalAnchor); + if (Range2.intersects({ start: left, end: left + viewSizeWidth }, { start: horizontalAnchor.offset, end: horizontalAnchor.offset + horizontalAnchor.size })) { + verticalAnchor.mode = LayoutAnchorMode.AVOID; + } + top = layout(activeWindow.innerHeight, viewSizeHeight, verticalAnchor) + activeWindow.pageYOffset; + } + this.view.classList.remove("top", "bottom", "left", "right"); + this.view.classList.add(anchorPosition === 0 ? "bottom" : "top"); + this.view.classList.add(anchorAlignment === 0 ? "left" : "right"); + this.view.classList.toggle("fixed", this.useFixedPosition); + const containerPosition = getDomNodePagePosition(this.container); + this.view.style.top = `${top - (this.useFixedPosition ? getDomNodePagePosition(this.view).top : containerPosition.top)}px`; + this.view.style.left = `${left - (this.useFixedPosition ? getDomNodePagePosition(this.view).left : containerPosition.left)}px`; + this.view.style.width = "initial"; + } + hide(data) { + const delegate = this.delegate; + this.delegate = null; + if (delegate === null || delegate === void 0 ? void 0 : delegate.onHide) { + delegate.onHide(data); + } + this.toDisposeOnClean.dispose(); + hide(this.view); + } + isVisible() { + return !!this.delegate; + } + onDOMEvent(e, onCapture) { + if (this.delegate) { + if (this.delegate.onDOMEvent) { + this.delegate.onDOMEvent(e, getWindow(e).document.activeElement); + } else if (onCapture && !isAncestor(e.target, this.container)) { + this.hide(); + } + } + } + dispose() { + this.hide(); + super.dispose(); + } + }; + ContextView.BUBBLE_UP_EVENTS = ["click", "keydown", "focus", "blur"]; + ContextView.BUBBLE_DOWN_EVENTS = ["click"]; + SHADOW_ROOT_CSS = /* css */ + ` + :host { + all: initial; /* 1st rule so subsequent properties are reset. */ + } + + .codicon[class*='codicon-'] { + font: normal normal normal 16px/1 codicon; + display: inline-block; + text-decoration: none; + text-rendering: auto; + text-align: center; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + } + + :host { + font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", system-ui, "Ubuntu", "Droid Sans", sans-serif; + } + + :host-context(.mac) { font-family: -apple-system, BlinkMacSystemFont, sans-serif; } + :host-context(.mac:lang(zh-Hans)) { font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", sans-serif; } + :host-context(.mac:lang(zh-Hant)) { font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", sans-serif; } + :host-context(.mac:lang(ja)) { font-family: -apple-system, BlinkMacSystemFont, "Hiragino Kaku Gothic Pro", sans-serif; } + :host-context(.mac:lang(ko)) { font-family: -apple-system, BlinkMacSystemFont, "Nanum Gothic", "Apple SD Gothic Neo", "AppleGothic", sans-serif; } + + :host-context(.windows) { font-family: "Segoe WPC", "Segoe UI", sans-serif; } + :host-context(.windows:lang(zh-Hans)) { font-family: "Segoe WPC", "Segoe UI", "Microsoft YaHei", sans-serif; } + :host-context(.windows:lang(zh-Hant)) { font-family: "Segoe WPC", "Segoe UI", "Microsoft Jhenghei", sans-serif; } + :host-context(.windows:lang(ja)) { font-family: "Segoe WPC", "Segoe UI", "Yu Gothic UI", "Meiryo UI", sans-serif; } + :host-context(.windows:lang(ko)) { font-family: "Segoe WPC", "Segoe UI", "Malgun Gothic", "Dotom", sans-serif; } + + :host-context(.linux) { font-family: system-ui, "Ubuntu", "Droid Sans", sans-serif; } + :host-context(.linux:lang(zh-Hans)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans SC", "Source Han Sans CN", "Source Han Sans", sans-serif; } + :host-context(.linux:lang(zh-Hant)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans TC", "Source Han Sans TW", "Source Han Sans", sans-serif; } + :host-context(.linux:lang(ja)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans J", "Source Han Sans JP", "Source Han Sans", sans-serif; } + :host-context(.linux:lang(ko)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans K", "Source Han Sans JR", "Source Han Sans", "UnDotum", "FBaekmuk Gulim", sans-serif; } +`; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/contextview/browser/contextViewService.js +var __decorate24, __param23, ContextViewHandler, ContextViewService; +var init_contextViewService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/contextview/browser/contextViewService.js"() { + init_contextview2(); + init_lifecycle(); + init_layoutService(); + init_dom(); + __decorate24 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param23 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + ContextViewHandler = class ContextViewHandler2 extends Disposable { + constructor(layoutService) { + super(); + this.layoutService = layoutService; + this.contextView = this._register(new ContextView( + this.layoutService.mainContainer, + 1 + /* ContextViewDOMPosition.ABSOLUTE */ + )); + this.layout(); + this._register(layoutService.onDidLayoutContainer(() => this.layout())); + } + // ContextView + showContextView(delegate, container, shadowRoot) { + let domPosition; + if (container) { + if (container === this.layoutService.getContainer(getWindow(container))) { + domPosition = 1; + } else if (shadowRoot) { + domPosition = 3; + } else { + domPosition = 2; + } + } else { + domPosition = 1; + } + this.contextView.setContainer(container !== null && container !== void 0 ? container : this.layoutService.activeContainer, domPosition); + this.contextView.show(delegate); + const openContextView = { + close: () => { + if (this.openContextView === openContextView) { + this.hideContextView(); + } + } + }; + this.openContextView = openContextView; + return openContextView; + } + layout() { + this.contextView.layout(); + } + hideContextView(data) { + this.contextView.hide(data); + this.openContextView = void 0; + } + }; + ContextViewHandler = __decorate24([ + __param23(0, ILayoutService) + ], ContextViewHandler); + ContextViewService = class extends ContextViewHandler { + getContextViewElement() { + return this.contextView.getViewElement(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/services/hoverService/updatableHoverWidget.js +var UpdatableHoverWidget; +var init_updatableHoverWidget = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/services/hoverService/updatableHoverWidget.js"() { + init_dom(); + init_cancellation(); + init_htmlContent(); + init_types(); + init_nls(); + UpdatableHoverWidget = class { + constructor(hoverDelegate, target, fadeInAnimation) { + this.hoverDelegate = hoverDelegate; + this.target = target; + this.fadeInAnimation = fadeInAnimation; + } + update(content, focus, options2) { + return __async(this, null, function* () { + var _a10; + if (this._cancellationTokenSource) { + this._cancellationTokenSource.dispose(true); + this._cancellationTokenSource = void 0; + } + if (this.isDisposed) { + return; + } + let resolvedContent; + if (content === void 0 || isString(content) || isHTMLElement(content)) { + resolvedContent = content; + } else if (!isFunction(content.markdown)) { + resolvedContent = (_a10 = content.markdown) !== null && _a10 !== void 0 ? _a10 : content.markdownNotSupportedFallback; + } else { + if (!this._hoverWidget) { + this.show(localize("iconLabel.loading", "Loading..."), focus, options2); + } + this._cancellationTokenSource = new CancellationTokenSource(); + const token = this._cancellationTokenSource.token; + resolvedContent = yield content.markdown(token); + if (resolvedContent === void 0) { + resolvedContent = content.markdownNotSupportedFallback; + } + if (this.isDisposed || token.isCancellationRequested) { + return; + } + } + this.show(resolvedContent, focus, options2); + }); + } + show(content, focus, options2) { + const oldHoverWidget = this._hoverWidget; + if (this.hasContent(content)) { + const hoverOptions = __spreadValues({ + content, + target: this.target, + appearance: { + showPointer: this.hoverDelegate.placement === "element", + skipFadeInAnimation: !this.fadeInAnimation || !!oldHoverWidget + // do not fade in if the hover is already showing + }, + position: { + hoverPosition: 2 + } + }, options2); + this._hoverWidget = this.hoverDelegate.showHover(hoverOptions, focus); + } + oldHoverWidget === null || oldHoverWidget === void 0 ? void 0 : oldHoverWidget.dispose(); + } + hasContent(content) { + if (!content) { + return false; + } + if (isMarkdownString(content)) { + return !!content.value; + } + return true; + } + get isDisposed() { + var _a10; + return (_a10 = this._hoverWidget) === null || _a10 === void 0 ? void 0 : _a10.isDisposed; + } + dispose() { + var _a10, _b4; + (_a10 = this._hoverWidget) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + (_b4 = this._cancellationTokenSource) === null || _b4 === void 0 ? void 0 : _b4.dispose(true); + this._cancellationTokenSource = void 0; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/services/hoverService/hoverService.js +function getHoverOptionsIdentity(options2) { + var _a10; + if (options2 === void 0) { + return void 0; + } + return (_a10 = options2 === null || options2 === void 0 ? void 0 : options2.id) !== null && _a10 !== void 0 ? _a10 : options2; +} +function getHoverTargetElement(element, stopElement) { + stopElement = stopElement !== null && stopElement !== void 0 ? stopElement : getWindow(element).document.body; + while (!element.hasAttribute("custom-hover") && element !== stopElement) { + element = element.parentElement; + } + return element; +} +var __decorate25, __param24, HoverService, HoverContextViewDelegate; +var init_hoverService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/services/hoverService/hoverService.js"() { + init_extensions(); + init_themeService(); + init_colorRegistry(); + init_hover(); + init_contextView(); + init_instantiation(); + init_hoverWidget3(); + init_lifecycle(); + init_dom(); + init_keybinding(); + init_keyboardEvent(); + init_accessibility(); + init_layoutService(); + init_window(); + init_contextViewService(); + init_updatableHoverWidget(); + init_async(); + __decorate25 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param24 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + HoverService = class HoverService2 extends Disposable { + constructor(_instantiationService, contextMenuService, _keybindingService, _layoutService, _accessibilityService) { + super(); + this._instantiationService = _instantiationService; + this._keybindingService = _keybindingService; + this._layoutService = _layoutService; + this._accessibilityService = _accessibilityService; + this._existingHovers = /* @__PURE__ */ new Map(); + contextMenuService.onDidShowContextMenu(() => this.hideHover()); + this._contextViewHandler = this._register(new ContextViewHandler(this._layoutService)); + } + showHover(options2, focus, skipLastFocusedUpdate) { + var _a10, _b4, _c2, _d2; + if (getHoverOptionsIdentity(this._currentHoverOptions) === getHoverOptionsIdentity(options2)) { + return void 0; + } + if (this._currentHover && ((_b4 = (_a10 = this._currentHoverOptions) === null || _a10 === void 0 ? void 0 : _a10.persistence) === null || _b4 === void 0 ? void 0 : _b4.sticky)) { + return void 0; + } + this._currentHoverOptions = options2; + this._lastHoverOptions = options2; + const trapFocus = options2.trapFocus || this._accessibilityService.isScreenReaderOptimized(); + const activeElement = getActiveElement(); + if (!skipLastFocusedUpdate) { + if (trapFocus && activeElement) { + if (!activeElement.classList.contains("monaco-hover")) { + this._lastFocusedElementBeforeOpen = activeElement; + } + } else { + this._lastFocusedElementBeforeOpen = void 0; + } + } + const hoverDisposables = new DisposableStore(); + const hover = this._instantiationService.createInstance(HoverWidget2, options2); + if ((_c2 = options2.persistence) === null || _c2 === void 0 ? void 0 : _c2.sticky) { + hover.isLocked = true; + } + hover.onDispose(() => { + var _a11, _b5; + const hoverWasFocused = ((_a11 = this._currentHover) === null || _a11 === void 0 ? void 0 : _a11.domNode) && isAncestorOfActiveElement(this._currentHover.domNode); + if (hoverWasFocused) { + (_b5 = this._lastFocusedElementBeforeOpen) === null || _b5 === void 0 ? void 0 : _b5.focus(); + } + if (this._currentHoverOptions === options2) { + this._currentHoverOptions = void 0; + } + hoverDisposables.dispose(); + }, void 0, hoverDisposables); + if (!options2.container) { + const targetElement = isHTMLElement(options2.target) ? options2.target : options2.target.targetElements[0]; + options2.container = this._layoutService.getContainer(getWindow(targetElement)); + } + this._contextViewHandler.showContextView(new HoverContextViewDelegate(hover, focus), options2.container); + hover.onRequestLayout(() => this._contextViewHandler.layout(), void 0, hoverDisposables); + if ((_d2 = options2.persistence) === null || _d2 === void 0 ? void 0 : _d2.sticky) { + hoverDisposables.add(addDisposableListener(getWindow(options2.container).document, EventType.MOUSE_DOWN, (e) => { + if (!isAncestor(e.target, hover.domNode)) { + this.doHideHover(); + } + })); + } else { + if ("targetElements" in options2.target) { + for (const element of options2.target.targetElements) { + hoverDisposables.add(addDisposableListener(element, EventType.CLICK, () => this.hideHover())); + } + } else { + hoverDisposables.add(addDisposableListener(options2.target, EventType.CLICK, () => this.hideHover())); + } + const focusedElement = getActiveElement(); + if (focusedElement) { + const focusedElementDocument = getWindow(focusedElement).document; + hoverDisposables.add(addDisposableListener(focusedElement, EventType.KEY_DOWN, (e) => { + var _a11; + return this._keyDown(e, hover, !!((_a11 = options2.persistence) === null || _a11 === void 0 ? void 0 : _a11.hideOnKeyDown)); + })); + hoverDisposables.add(addDisposableListener(focusedElementDocument, EventType.KEY_DOWN, (e) => { + var _a11; + return this._keyDown(e, hover, !!((_a11 = options2.persistence) === null || _a11 === void 0 ? void 0 : _a11.hideOnKeyDown)); + })); + hoverDisposables.add(addDisposableListener(focusedElement, EventType.KEY_UP, (e) => this._keyUp(e, hover))); + hoverDisposables.add(addDisposableListener(focusedElementDocument, EventType.KEY_UP, (e) => this._keyUp(e, hover))); + } + } + if ("IntersectionObserver" in mainWindow) { + const observer = new IntersectionObserver((e) => this._intersectionChange(e, hover), { threshold: 0 }); + const firstTargetElement = "targetElements" in options2.target ? options2.target.targetElements[0] : options2.target; + observer.observe(firstTargetElement); + hoverDisposables.add(toDisposable(() => observer.disconnect())); + } + this._currentHover = hover; + return hover; + } + hideHover() { + var _a10; + if (((_a10 = this._currentHover) === null || _a10 === void 0 ? void 0 : _a10.isLocked) || !this._currentHoverOptions) { + return; + } + this.doHideHover(); + } + doHideHover() { + this._currentHover = void 0; + this._currentHoverOptions = void 0; + this._contextViewHandler.hideContextView(); + } + _intersectionChange(entries2, hover) { + const entry = entries2[entries2.length - 1]; + if (!entry.isIntersecting) { + hover.dispose(); + } + } + showAndFocusLastHover() { + if (!this._lastHoverOptions) { + return; + } + this.showHover(this._lastHoverOptions, true, true); + } + _keyDown(e, hover, hideOnKeyDown) { + var _a10, _b4; + if (e.key === "Alt") { + hover.isLocked = true; + return; + } + const event = new StandardKeyboardEvent(e); + const keybinding = this._keybindingService.resolveKeyboardEvent(event); + if (keybinding.getSingleModifierDispatchChords().some((value) => !!value) || this._keybindingService.softDispatch(event, event.target).kind !== 0) { + return; + } + if (hideOnKeyDown && (!((_a10 = this._currentHoverOptions) === null || _a10 === void 0 ? void 0 : _a10.trapFocus) || e.key !== "Tab")) { + this.hideHover(); + (_b4 = this._lastFocusedElementBeforeOpen) === null || _b4 === void 0 ? void 0 : _b4.focus(); + } + } + _keyUp(e, hover) { + var _a10; + if (e.key === "Alt") { + hover.isLocked = false; + if (!hover.isMouseIn) { + this.hideHover(); + (_a10 = this._lastFocusedElementBeforeOpen) === null || _a10 === void 0 ? void 0 : _a10.focus(); + } + } + } + // TODO: Investigate performance of this function. There seems to be a lot of content created + // and thrown away on start up + setupUpdatableHover(hoverDelegate, htmlElement, content, options2) { + htmlElement.setAttribute("custom-hover", "true"); + if (htmlElement.title !== "") { + console.warn("HTML element already has a title attribute, which will conflict with the custom hover. Please remove the title attribute."); + console.trace("Stack trace:", htmlElement.title); + htmlElement.title = ""; + } + let hoverPreparation; + let hoverWidget; + const hideHover = (disposeWidget, disposePreparation) => { + var _a10; + const hadHover = hoverWidget !== void 0; + if (disposeWidget) { + hoverWidget === null || hoverWidget === void 0 ? void 0 : hoverWidget.dispose(); + hoverWidget = void 0; + } + if (disposePreparation) { + hoverPreparation === null || hoverPreparation === void 0 ? void 0 : hoverPreparation.dispose(); + hoverPreparation = void 0; + } + if (hadHover) { + (_a10 = hoverDelegate.onDidHideHover) === null || _a10 === void 0 ? void 0 : _a10.call(hoverDelegate); + hoverWidget = void 0; + } + }; + const triggerShowHover = (delay, focus, target, trapFocus) => { + return new TimeoutTimer(() => __async(this, null, function* () { + if (!hoverWidget || hoverWidget.isDisposed) { + hoverWidget = new UpdatableHoverWidget(hoverDelegate, target || htmlElement, delay > 0); + yield hoverWidget.update(typeof content === "function" ? content() : content, focus, __spreadProps(__spreadValues({}, options2), { trapFocus })); + } + }), delay); + }; + let isMouseDown = false; + const mouseDownEmitter = addDisposableListener(htmlElement, EventType.MOUSE_DOWN, () => { + isMouseDown = true; + hideHover(true, true); + }, true); + const mouseUpEmitter = addDisposableListener(htmlElement, EventType.MOUSE_UP, () => { + isMouseDown = false; + }, true); + const mouseLeaveEmitter = addDisposableListener(htmlElement, EventType.MOUSE_LEAVE, (e) => { + isMouseDown = false; + hideHover(false, e.fromElement === htmlElement); + }, true); + const onMouseOver = (e) => { + if (hoverPreparation) { + return; + } + const toDispose = new DisposableStore(); + const target = { + targetElements: [htmlElement], + dispose: () => { + } + }; + if (hoverDelegate.placement === void 0 || hoverDelegate.placement === "mouse") { + const onMouseMove = (e2) => { + target.x = e2.x + 10; + if (isHTMLElement(e2.target) && getHoverTargetElement(e2.target, htmlElement) !== htmlElement) { + hideHover(true, true); + } + }; + toDispose.add(addDisposableListener(htmlElement, EventType.MOUSE_MOVE, onMouseMove, true)); + } + hoverPreparation = toDispose; + if (isHTMLElement(e.target) && getHoverTargetElement(e.target, htmlElement) !== htmlElement) { + return; + } + toDispose.add(triggerShowHover(hoverDelegate.delay, false, target)); + }; + const mouseOverDomEmitter = addDisposableListener(htmlElement, EventType.MOUSE_OVER, onMouseOver, true); + const onFocus = () => { + if (isMouseDown || hoverPreparation) { + return; + } + const target = { + targetElements: [htmlElement], + dispose: () => { + } + }; + const toDispose = new DisposableStore(); + const onBlur = () => hideHover(true, true); + toDispose.add(addDisposableListener(htmlElement, EventType.BLUR, onBlur, true)); + toDispose.add(triggerShowHover(hoverDelegate.delay, false, target)); + hoverPreparation = toDispose; + }; + let focusDomEmitter; + const tagName = htmlElement.tagName.toLowerCase(); + if (tagName !== "input" && tagName !== "textarea") { + focusDomEmitter = addDisposableListener(htmlElement, EventType.FOCUS, onFocus, true); + } + const hover = { + show: (focus) => { + hideHover(false, true); + triggerShowHover(0, focus, void 0, focus); + }, + hide: () => { + hideHover(true, true); + }, + update: (newContent, hoverOptions) => __async(this, null, function* () { + content = newContent; + yield hoverWidget === null || hoverWidget === void 0 ? void 0 : hoverWidget.update(content, void 0, hoverOptions); + }), + dispose: () => { + this._existingHovers.delete(htmlElement); + mouseOverDomEmitter.dispose(); + mouseLeaveEmitter.dispose(); + mouseDownEmitter.dispose(); + mouseUpEmitter.dispose(); + focusDomEmitter === null || focusDomEmitter === void 0 ? void 0 : focusDomEmitter.dispose(); + hideHover(true, true); + } + }; + this._existingHovers.set(htmlElement, hover); + return hover; + } + triggerUpdatableHover(target) { + const hover = this._existingHovers.get(target); + if (hover) { + hover.show(true); + } + } + dispose() { + this._existingHovers.forEach((hover) => hover.dispose()); + super.dispose(); + } + }; + HoverService = __decorate25([ + __param24(0, IInstantiationService), + __param24(1, IContextMenuService), + __param24(2, IKeybindingService), + __param24(3, ILayoutService), + __param24(4, IAccessibilityService) + ], HoverService); + HoverContextViewDelegate = class { + get anchorPosition() { + return this._hover.anchor; + } + constructor(_hover, _focus = false) { + this._hover = _hover; + this._focus = _focus; + this.layer = 1; + } + render(container) { + this._hover.render(container); + if (this._focus) { + this._hover.focus(); + } + return this._hover; + } + getAnchor() { + return { + x: this._hover.x, + y: this._hover.y + }; + } + layout() { + this._hover.layout(); + } + }; + registerSingleton( + IHoverService, + HoverService, + 1 + /* InstantiationType.Delayed */ + ); + registerThemingParticipant((theme, collector) => { + const hoverBorder = theme.getColor(editorHoverBorder); + if (hoverBorder) { + collector.addRule(`.monaco-workbench .workbench-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); + collector.addRule(`.monaco-workbench .workbench-hover hr { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); + } + }); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/services/bulkEditService.js +var IBulkEditService, ResourceEdit, ResourceTextEdit, ResourceFileEdit; +var init_bulkEditService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/services/bulkEditService.js"() { + init_instantiation(); + init_uri(); + init_types(); + IBulkEditService = createDecorator("IWorkspaceEditService"); + ResourceEdit = class { + constructor(metadata) { + this.metadata = metadata; + } + static convert(edit) { + return edit.edits.map((edit2) => { + if (ResourceTextEdit.is(edit2)) { + return ResourceTextEdit.lift(edit2); + } + if (ResourceFileEdit.is(edit2)) { + return ResourceFileEdit.lift(edit2); + } + throw new Error("Unsupported edit"); + }); + } + }; + ResourceTextEdit = class _ResourceTextEdit extends ResourceEdit { + static is(candidate) { + if (candidate instanceof _ResourceTextEdit) { + return true; + } + return isObject(candidate) && URI.isUri(candidate.resource) && isObject(candidate.textEdit); + } + static lift(edit) { + if (edit instanceof _ResourceTextEdit) { + return edit; + } else { + return new _ResourceTextEdit(edit.resource, edit.textEdit, edit.versionId, edit.metadata); + } + } + constructor(resource, textEdit, versionId = void 0, metadata) { + super(metadata); + this.resource = resource; + this.textEdit = textEdit; + this.versionId = versionId; + } + }; + ResourceFileEdit = class _ResourceFileEdit extends ResourceEdit { + static is(candidate) { + if (candidate instanceof _ResourceFileEdit) { + return true; + } else { + return isObject(candidate) && (Boolean(candidate.newResource) || Boolean(candidate.oldResource)); + } + } + static lift(edit) { + if (edit instanceof _ResourceFileEdit) { + return edit; + } else { + return new _ResourceFileEdit(edit.oldResource, edit.newResource, edit.options, edit.metadata); + } + } + constructor(oldResource, newResource, options2 = {}, metadata) { + super(metadata); + this.oldResource = oldResource; + this.newResource = newResource; + this.options = options2; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/config/diffEditor.js +var diffEditorDefaultOptions; +var init_diffEditor = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/config/diffEditor.js"() { + diffEditorDefaultOptions = { + enableSplitViewResizing: true, + splitViewDefaultRatio: 0.5, + renderSideBySide: true, + renderMarginRevertIcon: true, + renderGutterMenu: true, + maxComputationTime: 5e3, + maxFileSize: 50, + ignoreTrimWhitespace: true, + renderIndicators: true, + originalEditable: false, + diffCodeLens: false, + renderOverviewRuler: true, + diffWordWrap: "inherit", + diffAlgorithm: "advanced", + accessibilityVerbose: false, + experimental: { + showMoves: false, + showEmptyDecorations: true + }, + hideUnchangedRegions: { + enabled: false, + contextLineCount: 3, + minimumLineCount: 3, + revealLineCount: 20 + }, + isInEmbeddedEditor: false, + onlyShowAccessibleDiffViewer: false, + renderSideBySideInlineBreakpoint: 900, + useInlineViewWhenSpaceIsLimited: true + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/config/editorConfigurationSchema.js +function isConfigurationPropertySchema(x) { + return typeof x.type !== "undefined" || typeof x.anyOf !== "undefined"; +} +function getEditorConfigurationKeys() { + if (cachedEditorConfigurationKeys === null) { + cachedEditorConfigurationKeys = /* @__PURE__ */ Object.create(null); + Object.keys(editorConfiguration.properties).forEach((prop) => { + cachedEditorConfigurationKeys[prop] = true; + }); + } + return cachedEditorConfigurationKeys; +} +function isEditorConfigurationKey(key) { + const editorConfigurationKeys = getEditorConfigurationKeys(); + return editorConfigurationKeys[`editor.${key}`] || false; +} +function isDiffEditorConfigurationKey(key) { + const editorConfigurationKeys = getEditorConfigurationKeys(); + return editorConfigurationKeys[`diffEditor.${key}`] || false; +} +var editorConfigurationBaseNode, editorConfiguration, cachedEditorConfigurationKeys, configurationRegistry2; +var init_editorConfigurationSchema = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/config/editorConfigurationSchema.js"() { + init_diffEditor(); + init_editorOptions(); + init_textModelDefaults(); + init_nls(); + init_configurationRegistry(); + init_platform2(); + editorConfigurationBaseNode = Object.freeze({ + id: "editor", + order: 5, + type: "object", + title: localize("editorConfigurationTitle", "Editor"), + scope: 5 + }); + editorConfiguration = __spreadProps(__spreadValues({}, editorConfigurationBaseNode), { + properties: { + "editor.tabSize": { + type: "number", + default: EDITOR_MODEL_DEFAULTS.tabSize, + minimum: 1, + markdownDescription: localize("tabSize", "The number of spaces a tab is equal to. This setting is overridden based on the file contents when {0} is on.", "`#editor.detectIndentation#`") + }, + "editor.indentSize": { + "anyOf": [ + { + type: "string", + enum: ["tabSize"] + }, + { + type: "number", + minimum: 1 + } + ], + default: "tabSize", + markdownDescription: localize("indentSize", 'The number of spaces used for indentation or `"tabSize"` to use the value from `#editor.tabSize#`. This setting is overridden based on the file contents when `#editor.detectIndentation#` is on.') + }, + "editor.insertSpaces": { + type: "boolean", + default: EDITOR_MODEL_DEFAULTS.insertSpaces, + markdownDescription: localize("insertSpaces", "Insert spaces when pressing `Tab`. This setting is overridden based on the file contents when {0} is on.", "`#editor.detectIndentation#`") + }, + "editor.detectIndentation": { + type: "boolean", + default: EDITOR_MODEL_DEFAULTS.detectIndentation, + markdownDescription: localize("detectIndentation", "Controls whether {0} and {1} will be automatically detected when a file is opened based on the file contents.", "`#editor.tabSize#`", "`#editor.insertSpaces#`") + }, + "editor.trimAutoWhitespace": { + type: "boolean", + default: EDITOR_MODEL_DEFAULTS.trimAutoWhitespace, + description: localize("trimAutoWhitespace", "Remove trailing auto inserted whitespace.") + }, + "editor.largeFileOptimizations": { + type: "boolean", + default: EDITOR_MODEL_DEFAULTS.largeFileOptimizations, + description: localize("largeFileOptimizations", "Special handling for large files to disable certain memory intensive features.") + }, + "editor.wordBasedSuggestions": { + enum: ["off", "currentDocument", "matchingDocuments", "allDocuments"], + default: "matchingDocuments", + enumDescriptions: [ + localize("wordBasedSuggestions.off", "Turn off Word Based Suggestions."), + localize("wordBasedSuggestions.currentDocument", "Only suggest words from the active document."), + localize("wordBasedSuggestions.matchingDocuments", "Suggest words from all open documents of the same language."), + localize("wordBasedSuggestions.allDocuments", "Suggest words from all open documents.") + ], + description: localize("wordBasedSuggestions", "Controls whether completions should be computed based on words in the document and from which documents they are computed.") + }, + "editor.semanticHighlighting.enabled": { + enum: [true, false, "configuredByTheme"], + enumDescriptions: [ + localize("semanticHighlighting.true", "Semantic highlighting enabled for all color themes."), + localize("semanticHighlighting.false", "Semantic highlighting disabled for all color themes."), + localize("semanticHighlighting.configuredByTheme", "Semantic highlighting is configured by the current color theme's `semanticHighlighting` setting.") + ], + default: "configuredByTheme", + description: localize("semanticHighlighting.enabled", "Controls whether the semanticHighlighting is shown for the languages that support it.") + }, + "editor.stablePeek": { + type: "boolean", + default: false, + markdownDescription: localize("stablePeek", "Keep peek editors open even when double-clicking their content or when hitting `Escape`.") + }, + "editor.maxTokenizationLineLength": { + type: "integer", + default: 2e4, + description: localize("maxTokenizationLineLength", "Lines above this length will not be tokenized for performance reasons") + }, + "editor.experimental.asyncTokenization": { + type: "boolean", + default: false, + description: localize("editor.experimental.asyncTokenization", "Controls whether the tokenization should happen asynchronously on a web worker."), + tags: ["experimental"] + }, + "editor.experimental.asyncTokenizationLogging": { + type: "boolean", + default: false, + description: localize("editor.experimental.asyncTokenizationLogging", "Controls whether async tokenization should be logged. For debugging only.") + }, + "editor.experimental.asyncTokenizationVerification": { + type: "boolean", + default: false, + description: localize("editor.experimental.asyncTokenizationVerification", "Controls whether async tokenization should be verified against legacy background tokenization. Might slow down tokenization. For debugging only."), + tags: ["experimental"] + }, + "editor.language.brackets": { + type: ["array", "null"], + default: null, + // We want to distinguish the empty array from not configured. + description: localize("schema.brackets", "Defines the bracket symbols that increase or decrease the indentation."), + items: { + type: "array", + items: [ + { + type: "string", + description: localize("schema.openBracket", "The opening bracket character or string sequence.") + }, + { + type: "string", + description: localize("schema.closeBracket", "The closing bracket character or string sequence.") + } + ] + } + }, + "editor.language.colorizedBracketPairs": { + type: ["array", "null"], + default: null, + // We want to distinguish the empty array from not configured. + description: localize("schema.colorizedBracketPairs", "Defines the bracket pairs that are colorized by their nesting level if bracket pair colorization is enabled."), + items: { + type: "array", + items: [ + { + type: "string", + description: localize("schema.openBracket", "The opening bracket character or string sequence.") + }, + { + type: "string", + description: localize("schema.closeBracket", "The closing bracket character or string sequence.") + } + ] + } + }, + "diffEditor.maxComputationTime": { + type: "number", + default: diffEditorDefaultOptions.maxComputationTime, + description: localize("maxComputationTime", "Timeout in milliseconds after which diff computation is cancelled. Use 0 for no timeout.") + }, + "diffEditor.maxFileSize": { + type: "number", + default: diffEditorDefaultOptions.maxFileSize, + description: localize("maxFileSize", "Maximum file size in MB for which to compute diffs. Use 0 for no limit.") + }, + "diffEditor.renderSideBySide": { + type: "boolean", + default: diffEditorDefaultOptions.renderSideBySide, + description: localize("sideBySide", "Controls whether the diff editor shows the diff side by side or inline.") + }, + "diffEditor.renderSideBySideInlineBreakpoint": { + type: "number", + default: diffEditorDefaultOptions.renderSideBySideInlineBreakpoint, + description: localize("renderSideBySideInlineBreakpoint", "If the diff editor width is smaller than this value, the inline view is used.") + }, + "diffEditor.useInlineViewWhenSpaceIsLimited": { + type: "boolean", + default: diffEditorDefaultOptions.useInlineViewWhenSpaceIsLimited, + description: localize("useInlineViewWhenSpaceIsLimited", "If enabled and the editor width is too small, the inline view is used.") + }, + "diffEditor.renderMarginRevertIcon": { + type: "boolean", + default: diffEditorDefaultOptions.renderMarginRevertIcon, + description: localize("renderMarginRevertIcon", "When enabled, the diff editor shows arrows in its glyph margin to revert changes.") + }, + "diffEditor.renderGutterMenu": { + type: "boolean", + default: diffEditorDefaultOptions.renderGutterMenu, + description: localize("renderGutterMenu", "When enabled, the diff editor shows a special gutter for revert and stage actions.") + }, + "diffEditor.ignoreTrimWhitespace": { + type: "boolean", + default: diffEditorDefaultOptions.ignoreTrimWhitespace, + description: localize("ignoreTrimWhitespace", "When enabled, the diff editor ignores changes in leading or trailing whitespace.") + }, + "diffEditor.renderIndicators": { + type: "boolean", + default: diffEditorDefaultOptions.renderIndicators, + description: localize("renderIndicators", "Controls whether the diff editor shows +/- indicators for added/removed changes.") + }, + "diffEditor.codeLens": { + type: "boolean", + default: diffEditorDefaultOptions.diffCodeLens, + description: localize("codeLens", "Controls whether the editor shows CodeLens.") + }, + "diffEditor.wordWrap": { + type: "string", + enum: ["off", "on", "inherit"], + default: diffEditorDefaultOptions.diffWordWrap, + markdownEnumDescriptions: [ + localize("wordWrap.off", "Lines will never wrap."), + localize("wordWrap.on", "Lines will wrap at the viewport width."), + localize("wordWrap.inherit", "Lines will wrap according to the {0} setting.", "`#editor.wordWrap#`") + ] + }, + "diffEditor.diffAlgorithm": { + type: "string", + enum: ["legacy", "advanced"], + default: diffEditorDefaultOptions.diffAlgorithm, + markdownEnumDescriptions: [ + localize("diffAlgorithm.legacy", "Uses the legacy diffing algorithm."), + localize("diffAlgorithm.advanced", "Uses the advanced diffing algorithm.") + ], + tags: ["experimental"] + }, + "diffEditor.hideUnchangedRegions.enabled": { + type: "boolean", + default: diffEditorDefaultOptions.hideUnchangedRegions.enabled, + markdownDescription: localize("hideUnchangedRegions.enabled", "Controls whether the diff editor shows unchanged regions.") + }, + "diffEditor.hideUnchangedRegions.revealLineCount": { + type: "integer", + default: diffEditorDefaultOptions.hideUnchangedRegions.revealLineCount, + markdownDescription: localize("hideUnchangedRegions.revealLineCount", "Controls how many lines are used for unchanged regions."), + minimum: 1 + }, + "diffEditor.hideUnchangedRegions.minimumLineCount": { + type: "integer", + default: diffEditorDefaultOptions.hideUnchangedRegions.minimumLineCount, + markdownDescription: localize("hideUnchangedRegions.minimumLineCount", "Controls how many lines are used as a minimum for unchanged regions."), + minimum: 1 + }, + "diffEditor.hideUnchangedRegions.contextLineCount": { + type: "integer", + default: diffEditorDefaultOptions.hideUnchangedRegions.contextLineCount, + markdownDescription: localize("hideUnchangedRegions.contextLineCount", "Controls how many lines are used as context when comparing unchanged regions."), + minimum: 1 + }, + "diffEditor.experimental.showMoves": { + type: "boolean", + default: diffEditorDefaultOptions.experimental.showMoves, + markdownDescription: localize("showMoves", "Controls whether the diff editor should show detected code moves.") + }, + "diffEditor.experimental.showEmptyDecorations": { + type: "boolean", + default: diffEditorDefaultOptions.experimental.showEmptyDecorations, + description: localize("showEmptyDecorations", "Controls whether the diff editor shows empty decorations to see where characters got inserted or deleted.") + } + } + }); + for (const editorOption of editorOptionsRegistry) { + const schema = editorOption.schema; + if (typeof schema !== "undefined") { + if (isConfigurationPropertySchema(schema)) { + editorConfiguration.properties[`editor.${editorOption.name}`] = schema; + } else { + for (const key in schema) { + if (Object.hasOwnProperty.call(schema, key)) { + editorConfiguration.properties[key] = schema[key]; + } + } + } + } + } + cachedEditorConfigurationKeys = null; + configurationRegistry2 = Registry.as(Extensions4.Configuration); + configurationRegistry2.registerConfiguration(editorConfiguration); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/core/editOperation.js +var EditOperation; +var init_editOperation = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/core/editOperation.js"() { + init_range(); + EditOperation = class { + static insert(position, text2) { + return { + range: new Range(position.lineNumber, position.column, position.lineNumber, position.column), + text: text2, + forceMoveMarkers: true + }; + } + static delete(range2) { + return { + range: range2, + text: null + }; + } + static replace(range2, text2) { + return { + range: range2, + text: text2 + }; + } + static replaceMove(range2, text2) { + return { + range: range2, + text: text2, + forceMoveMarkers: true + }; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/configuration/common/configurationModels.js +function freeze2(data) { + return Object.isFrozen(data) ? data : deepFreeze(data); +} +var ConfigurationModel, ConfigurationModelParser, ConfigurationInspectValue, Configuration, ConfigurationChangeEvent; +var init_configurationModels = __esm({ + "node_modules/monaco-editor/esm/vs/platform/configuration/common/configurationModels.js"() { + init_arrays(); + init_map(); + init_objects(); + init_types(); + init_uri(); + init_configuration(); + init_configurationRegistry(); + init_platform2(); + ConfigurationModel = class _ConfigurationModel { + static createEmptyModel(logService) { + return new _ConfigurationModel({}, [], [], void 0, logService); + } + constructor(_contents, _keys, _overrides, raw, logService) { + this._contents = _contents; + this._keys = _keys; + this._overrides = _overrides; + this.raw = raw; + this.logService = logService; + this.overrideConfigurations = /* @__PURE__ */ new Map(); + } + get rawConfiguration() { + var _a10; + if (!this._rawConfiguration) { + if ((_a10 = this.raw) === null || _a10 === void 0 ? void 0 : _a10.length) { + const rawConfigurationModels = this.raw.map((raw) => { + if (raw instanceof _ConfigurationModel) { + return raw; + } + const parser2 = new ConfigurationModelParser("", this.logService); + parser2.parseRaw(raw); + return parser2.configurationModel; + }); + this._rawConfiguration = rawConfigurationModels.reduce((previous, current) => current === previous ? current : previous.merge(current), rawConfigurationModels[0]); + } else { + this._rawConfiguration = this; + } + } + return this._rawConfiguration; + } + get contents() { + return this._contents; + } + get overrides() { + return this._overrides; + } + get keys() { + return this._keys; + } + isEmpty() { + return this._keys.length === 0 && Object.keys(this._contents).length === 0 && this._overrides.length === 0; + } + getValue(section) { + return section ? getConfigurationValue(this.contents, section) : this.contents; + } + inspect(section, overrideIdentifier) { + const that = this; + return { + get value() { + return freeze2(that.rawConfiguration.getValue(section)); + }, + get override() { + return overrideIdentifier ? freeze2(that.rawConfiguration.getOverrideValue(section, overrideIdentifier)) : void 0; + }, + get merged() { + return freeze2(overrideIdentifier ? that.rawConfiguration.override(overrideIdentifier).getValue(section) : that.rawConfiguration.getValue(section)); + }, + get overrides() { + const overrides = []; + for (const { contents, identifiers, keys } of that.rawConfiguration.overrides) { + const value = new _ConfigurationModel(contents, keys, [], void 0, that.logService).getValue(section); + if (value !== void 0) { + overrides.push({ identifiers, value }); + } + } + return overrides.length ? freeze2(overrides) : void 0; + } + }; + } + getOverrideValue(section, overrideIdentifier) { + const overrideContents = this.getContentsForOverrideIdentifer(overrideIdentifier); + return overrideContents ? section ? getConfigurationValue(overrideContents, section) : overrideContents : void 0; + } + override(identifier3) { + let overrideConfigurationModel = this.overrideConfigurations.get(identifier3); + if (!overrideConfigurationModel) { + overrideConfigurationModel = this.createOverrideConfigurationModel(identifier3); + this.overrideConfigurations.set(identifier3, overrideConfigurationModel); + } + return overrideConfigurationModel; + } + merge(...others) { + var _a10, _b4; + const contents = deepClone(this.contents); + const overrides = deepClone(this.overrides); + const keys = [...this.keys]; + const raws = ((_a10 = this.raw) === null || _a10 === void 0 ? void 0 : _a10.length) ? [...this.raw] : [this]; + for (const other of others) { + raws.push(...((_b4 = other.raw) === null || _b4 === void 0 ? void 0 : _b4.length) ? other.raw : [other]); + if (other.isEmpty()) { + continue; + } + this.mergeContents(contents, other.contents); + for (const otherOverride of other.overrides) { + const [override] = overrides.filter((o) => equals(o.identifiers, otherOverride.identifiers)); + if (override) { + this.mergeContents(override.contents, otherOverride.contents); + override.keys.push(...otherOverride.keys); + override.keys = distinct(override.keys); + } else { + overrides.push(deepClone(otherOverride)); + } + } + for (const key of other.keys) { + if (keys.indexOf(key) === -1) { + keys.push(key); + } + } + } + return new _ConfigurationModel(contents, keys, overrides, raws.every((raw) => raw instanceof _ConfigurationModel) ? void 0 : raws, this.logService); + } + createOverrideConfigurationModel(identifier3) { + const overrideContents = this.getContentsForOverrideIdentifer(identifier3); + if (!overrideContents || typeof overrideContents !== "object" || !Object.keys(overrideContents).length) { + return this; + } + const contents = {}; + for (const key of distinct([...Object.keys(this.contents), ...Object.keys(overrideContents)])) { + let contentsForKey = this.contents[key]; + const overrideContentsForKey = overrideContents[key]; + if (overrideContentsForKey) { + if (typeof contentsForKey === "object" && typeof overrideContentsForKey === "object") { + contentsForKey = deepClone(contentsForKey); + this.mergeContents(contentsForKey, overrideContentsForKey); + } else { + contentsForKey = overrideContentsForKey; + } + } + contents[key] = contentsForKey; + } + return new _ConfigurationModel(contents, this.keys, this.overrides, void 0, this.logService); + } + mergeContents(source, target) { + for (const key of Object.keys(target)) { + if (key in source) { + if (isObject(source[key]) && isObject(target[key])) { + this.mergeContents(source[key], target[key]); + continue; + } + } + source[key] = deepClone(target[key]); + } + } + getContentsForOverrideIdentifer(identifier3) { + let contentsForIdentifierOnly = null; + let contents = null; + const mergeContents = (contentsToMerge) => { + if (contentsToMerge) { + if (contents) { + this.mergeContents(contents, contentsToMerge); + } else { + contents = deepClone(contentsToMerge); + } + } + }; + for (const override of this.overrides) { + if (override.identifiers.length === 1 && override.identifiers[0] === identifier3) { + contentsForIdentifierOnly = override.contents; + } else if (override.identifiers.includes(identifier3)) { + mergeContents(override.contents); + } + } + mergeContents(contentsForIdentifierOnly); + return contents; + } + toJSON() { + return { + contents: this.contents, + overrides: this.overrides, + keys: this.keys + }; + } + // Update methods + addValue(key, value) { + this.updateValue(key, value, true); + } + setValue(key, value) { + this.updateValue(key, value, false); + } + removeValue(key) { + const index = this.keys.indexOf(key); + if (index === -1) { + return; + } + this.keys.splice(index, 1); + removeFromValueTree(this.contents, key); + if (OVERRIDE_PROPERTY_REGEX.test(key)) { + this.overrides.splice(this.overrides.findIndex((o) => equals(o.identifiers, overrideIdentifiersFromKey(key))), 1); + } + } + updateValue(key, value, add) { + addToValueTree(this.contents, key, value, (e) => this.logService.error(e)); + add = add || this.keys.indexOf(key) === -1; + if (add) { + this.keys.push(key); + } + if (OVERRIDE_PROPERTY_REGEX.test(key)) { + this.overrides.push({ + identifiers: overrideIdentifiersFromKey(key), + keys: Object.keys(this.contents[key]), + contents: toValuesTree(this.contents[key], (message) => this.logService.error(message)) + }); + } + } + }; + ConfigurationModelParser = class { + constructor(_name, logService) { + this._name = _name; + this.logService = logService; + this._raw = null; + this._configurationModel = null; + this._restrictedConfigurations = []; + } + get configurationModel() { + return this._configurationModel || ConfigurationModel.createEmptyModel(this.logService); + } + parseRaw(raw, options2) { + this._raw = raw; + const { contents, keys, overrides, restricted, hasExcludedProperties } = this.doParseRaw(raw, options2); + this._configurationModel = new ConfigurationModel(contents, keys, overrides, hasExcludedProperties ? [raw] : void 0, this.logService); + this._restrictedConfigurations = restricted || []; + } + doParseRaw(raw, options2) { + const configurationProperties = Registry.as(Extensions4.Configuration).getConfigurationProperties(); + const filtered = this.filter(raw, configurationProperties, true, options2); + raw = filtered.raw; + const contents = toValuesTree(raw, (message) => this.logService.error(`Conflict in settings file ${this._name}: ${message}`)); + const keys = Object.keys(raw); + const overrides = this.toOverrides(raw, (message) => this.logService.error(`Conflict in settings file ${this._name}: ${message}`)); + return { contents, keys, overrides, restricted: filtered.restricted, hasExcludedProperties: filtered.hasExcludedProperties }; + } + filter(properties, configurationProperties, filterOverriddenProperties, options2) { + var _a10, _b4, _c2; + let hasExcludedProperties = false; + if (!(options2 === null || options2 === void 0 ? void 0 : options2.scopes) && !(options2 === null || options2 === void 0 ? void 0 : options2.skipRestricted) && !((_a10 = options2 === null || options2 === void 0 ? void 0 : options2.exclude) === null || _a10 === void 0 ? void 0 : _a10.length)) { + return { raw: properties, restricted: [], hasExcludedProperties }; + } + const raw = {}; + const restricted = []; + for (const key in properties) { + if (OVERRIDE_PROPERTY_REGEX.test(key) && filterOverriddenProperties) { + const result = this.filter(properties[key], configurationProperties, false, options2); + raw[key] = result.raw; + hasExcludedProperties = hasExcludedProperties || result.hasExcludedProperties; + restricted.push(...result.restricted); + } else { + const propertySchema = configurationProperties[key]; + const scope = propertySchema ? typeof propertySchema.scope !== "undefined" ? propertySchema.scope : 3 : void 0; + if (propertySchema === null || propertySchema === void 0 ? void 0 : propertySchema.restricted) { + restricted.push(key); + } + if (!((_b4 = options2.exclude) === null || _b4 === void 0 ? void 0 : _b4.includes(key)) && (((_c2 = options2.include) === null || _c2 === void 0 ? void 0 : _c2.includes(key)) || (scope === void 0 || options2.scopes === void 0 || options2.scopes.includes(scope)) && !(options2.skipRestricted && (propertySchema === null || propertySchema === void 0 ? void 0 : propertySchema.restricted)))) { + raw[key] = properties[key]; + } else { + hasExcludedProperties = true; + } + } + } + return { raw, restricted, hasExcludedProperties }; + } + toOverrides(raw, conflictReporter) { + const overrides = []; + for (const key of Object.keys(raw)) { + if (OVERRIDE_PROPERTY_REGEX.test(key)) { + const overrideRaw = {}; + for (const keyInOverrideRaw in raw[key]) { + overrideRaw[keyInOverrideRaw] = raw[key][keyInOverrideRaw]; + } + overrides.push({ + identifiers: overrideIdentifiersFromKey(key), + keys: Object.keys(overrideRaw), + contents: toValuesTree(overrideRaw, conflictReporter) + }); + } + } + return overrides; + } + }; + ConfigurationInspectValue = class { + constructor(key, overrides, _value, overrideIdentifiers, defaultConfiguration, policyConfiguration, applicationConfiguration, userConfiguration, localUserConfiguration, remoteUserConfiguration, workspaceConfiguration, folderConfigurationModel, memoryConfigurationModel) { + this.key = key; + this.overrides = overrides; + this._value = _value; + this.overrideIdentifiers = overrideIdentifiers; + this.defaultConfiguration = defaultConfiguration; + this.policyConfiguration = policyConfiguration; + this.applicationConfiguration = applicationConfiguration; + this.userConfiguration = userConfiguration; + this.localUserConfiguration = localUserConfiguration; + this.remoteUserConfiguration = remoteUserConfiguration; + this.workspaceConfiguration = workspaceConfiguration; + this.folderConfigurationModel = folderConfigurationModel; + this.memoryConfigurationModel = memoryConfigurationModel; + } + toInspectValue(inspectValue) { + return (inspectValue === null || inspectValue === void 0 ? void 0 : inspectValue.value) !== void 0 || (inspectValue === null || inspectValue === void 0 ? void 0 : inspectValue.override) !== void 0 || (inspectValue === null || inspectValue === void 0 ? void 0 : inspectValue.overrides) !== void 0 ? inspectValue : void 0; + } + get userInspectValue() { + if (!this._userInspectValue) { + this._userInspectValue = this.userConfiguration.inspect(this.key, this.overrides.overrideIdentifier); + } + return this._userInspectValue; + } + get user() { + return this.toInspectValue(this.userInspectValue); + } + }; + Configuration = class _Configuration { + constructor(_defaultConfiguration, _policyConfiguration, _applicationConfiguration, _localUserConfiguration, _remoteUserConfiguration, _workspaceConfiguration, _folderConfigurations, _memoryConfiguration, _memoryConfigurationByResource, logService) { + this._defaultConfiguration = _defaultConfiguration; + this._policyConfiguration = _policyConfiguration; + this._applicationConfiguration = _applicationConfiguration; + this._localUserConfiguration = _localUserConfiguration; + this._remoteUserConfiguration = _remoteUserConfiguration; + this._workspaceConfiguration = _workspaceConfiguration; + this._folderConfigurations = _folderConfigurations; + this._memoryConfiguration = _memoryConfiguration; + this._memoryConfigurationByResource = _memoryConfigurationByResource; + this.logService = logService; + this._workspaceConsolidatedConfiguration = null; + this._foldersConsolidatedConfigurations = new ResourceMap(); + this._userConfiguration = null; + } + getValue(section, overrides, workspace) { + const consolidateConfigurationModel = this.getConsolidatedConfigurationModel(section, overrides, workspace); + return consolidateConfigurationModel.getValue(section); + } + updateValue(key, value, overrides = {}) { + let memoryConfiguration; + if (overrides.resource) { + memoryConfiguration = this._memoryConfigurationByResource.get(overrides.resource); + if (!memoryConfiguration) { + memoryConfiguration = ConfigurationModel.createEmptyModel(this.logService); + this._memoryConfigurationByResource.set(overrides.resource, memoryConfiguration); + } + } else { + memoryConfiguration = this._memoryConfiguration; + } + if (value === void 0) { + memoryConfiguration.removeValue(key); + } else { + memoryConfiguration.setValue(key, value); + } + if (!overrides.resource) { + this._workspaceConsolidatedConfiguration = null; + } + } + inspect(key, overrides, workspace) { + const consolidateConfigurationModel = this.getConsolidatedConfigurationModel(key, overrides, workspace); + const folderConfigurationModel = this.getFolderConfigurationModelForResource(overrides.resource, workspace); + const memoryConfigurationModel = overrides.resource ? this._memoryConfigurationByResource.get(overrides.resource) || this._memoryConfiguration : this._memoryConfiguration; + const overrideIdentifiers = /* @__PURE__ */ new Set(); + for (const override of consolidateConfigurationModel.overrides) { + for (const overrideIdentifier of override.identifiers) { + if (consolidateConfigurationModel.getOverrideValue(key, overrideIdentifier) !== void 0) { + overrideIdentifiers.add(overrideIdentifier); + } + } + } + return new ConfigurationInspectValue(key, overrides, consolidateConfigurationModel.getValue(key), overrideIdentifiers.size ? [...overrideIdentifiers] : void 0, this._defaultConfiguration, this._policyConfiguration.isEmpty() ? void 0 : this._policyConfiguration, this.applicationConfiguration.isEmpty() ? void 0 : this.applicationConfiguration, this.userConfiguration, this.localUserConfiguration, this.remoteUserConfiguration, workspace ? this._workspaceConfiguration : void 0, folderConfigurationModel ? folderConfigurationModel : void 0, memoryConfigurationModel); + } + get applicationConfiguration() { + return this._applicationConfiguration; + } + get userConfiguration() { + if (!this._userConfiguration) { + this._userConfiguration = this._remoteUserConfiguration.isEmpty() ? this._localUserConfiguration : this._localUserConfiguration.merge(this._remoteUserConfiguration); + } + return this._userConfiguration; + } + get localUserConfiguration() { + return this._localUserConfiguration; + } + get remoteUserConfiguration() { + return this._remoteUserConfiguration; + } + getConsolidatedConfigurationModel(section, overrides, workspace) { + let configurationModel = this.getConsolidatedConfigurationModelForResource(overrides, workspace); + if (overrides.overrideIdentifier) { + configurationModel = configurationModel.override(overrides.overrideIdentifier); + } + if (!this._policyConfiguration.isEmpty() && this._policyConfiguration.getValue(section) !== void 0) { + configurationModel = configurationModel.merge(this._policyConfiguration); + } + return configurationModel; + } + getConsolidatedConfigurationModelForResource({ resource }, workspace) { + let consolidateConfiguration = this.getWorkspaceConsolidatedConfiguration(); + if (workspace && resource) { + const root = workspace.getFolder(resource); + if (root) { + consolidateConfiguration = this.getFolderConsolidatedConfiguration(root.uri) || consolidateConfiguration; + } + const memoryConfigurationForResource = this._memoryConfigurationByResource.get(resource); + if (memoryConfigurationForResource) { + consolidateConfiguration = consolidateConfiguration.merge(memoryConfigurationForResource); + } + } + return consolidateConfiguration; + } + getWorkspaceConsolidatedConfiguration() { + if (!this._workspaceConsolidatedConfiguration) { + this._workspaceConsolidatedConfiguration = this._defaultConfiguration.merge(this.applicationConfiguration, this.userConfiguration, this._workspaceConfiguration, this._memoryConfiguration); + } + return this._workspaceConsolidatedConfiguration; + } + getFolderConsolidatedConfiguration(folder) { + let folderConsolidatedConfiguration = this._foldersConsolidatedConfigurations.get(folder); + if (!folderConsolidatedConfiguration) { + const workspaceConsolidateConfiguration = this.getWorkspaceConsolidatedConfiguration(); + const folderConfiguration = this._folderConfigurations.get(folder); + if (folderConfiguration) { + folderConsolidatedConfiguration = workspaceConsolidateConfiguration.merge(folderConfiguration); + this._foldersConsolidatedConfigurations.set(folder, folderConsolidatedConfiguration); + } else { + folderConsolidatedConfiguration = workspaceConsolidateConfiguration; + } + } + return folderConsolidatedConfiguration; + } + getFolderConfigurationModelForResource(resource, workspace) { + if (workspace && resource) { + const root = workspace.getFolder(resource); + if (root) { + return this._folderConfigurations.get(root.uri); + } + } + return void 0; + } + toData() { + return { + defaults: { + contents: this._defaultConfiguration.contents, + overrides: this._defaultConfiguration.overrides, + keys: this._defaultConfiguration.keys + }, + policy: { + contents: this._policyConfiguration.contents, + overrides: this._policyConfiguration.overrides, + keys: this._policyConfiguration.keys + }, + application: { + contents: this.applicationConfiguration.contents, + overrides: this.applicationConfiguration.overrides, + keys: this.applicationConfiguration.keys + }, + user: { + contents: this.userConfiguration.contents, + overrides: this.userConfiguration.overrides, + keys: this.userConfiguration.keys + }, + workspace: { + contents: this._workspaceConfiguration.contents, + overrides: this._workspaceConfiguration.overrides, + keys: this._workspaceConfiguration.keys + }, + folders: [...this._folderConfigurations.keys()].reduce((result, folder) => { + const { contents, overrides, keys } = this._folderConfigurations.get(folder); + result.push([folder, { contents, overrides, keys }]); + return result; + }, []) + }; + } + static parse(data, logService) { + const defaultConfiguration = this.parseConfigurationModel(data.defaults, logService); + const policyConfiguration = this.parseConfigurationModel(data.policy, logService); + const applicationConfiguration = this.parseConfigurationModel(data.application, logService); + const userConfiguration = this.parseConfigurationModel(data.user, logService); + const workspaceConfiguration = this.parseConfigurationModel(data.workspace, logService); + const folders = data.folders.reduce((result, value) => { + result.set(URI.revive(value[0]), this.parseConfigurationModel(value[1], logService)); + return result; + }, new ResourceMap()); + return new _Configuration(defaultConfiguration, policyConfiguration, applicationConfiguration, userConfiguration, ConfigurationModel.createEmptyModel(logService), workspaceConfiguration, folders, ConfigurationModel.createEmptyModel(logService), new ResourceMap(), logService); + } + static parseConfigurationModel(model, logService) { + return new ConfigurationModel(model.contents, model.keys, model.overrides, void 0, logService); + } + }; + ConfigurationChangeEvent = class { + constructor(change, previous, currentConfiguraiton, currentWorkspace, logService) { + this.change = change; + this.previous = previous; + this.currentConfiguraiton = currentConfiguraiton; + this.currentWorkspace = currentWorkspace; + this.logService = logService; + this._marker = "\n"; + this._markerCode1 = this._marker.charCodeAt(0); + this._markerCode2 = ".".charCodeAt(0); + this.affectedKeys = /* @__PURE__ */ new Set(); + this._previousConfiguration = void 0; + for (const key of change.keys) { + this.affectedKeys.add(key); + } + for (const [, keys] of change.overrides) { + for (const key of keys) { + this.affectedKeys.add(key); + } + } + this._affectsConfigStr = this._marker; + for (const key of this.affectedKeys) { + this._affectsConfigStr += key + this._marker; + } + } + get previousConfiguration() { + if (!this._previousConfiguration && this.previous) { + this._previousConfiguration = Configuration.parse(this.previous.data, this.logService); + } + return this._previousConfiguration; + } + affectsConfiguration(section, overrides) { + var _a10; + const needle = this._marker + section; + const idx = this._affectsConfigStr.indexOf(needle); + if (idx < 0) { + return false; + } + const pos = idx + needle.length; + if (pos >= this._affectsConfigStr.length) { + return false; + } + const code = this._affectsConfigStr.charCodeAt(pos); + if (code !== this._markerCode1 && code !== this._markerCode2) { + return false; + } + if (overrides) { + const value1 = this.previousConfiguration ? this.previousConfiguration.getValue(section, overrides, (_a10 = this.previous) === null || _a10 === void 0 ? void 0 : _a10.workspace) : void 0; + const value2 = this.currentConfiguraiton.getValue(section, overrides, this.currentWorkspace); + return !equals2(value1, value2); + } + return true; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/keybinding/common/keybindingResolver.js +function KbFound(commandId, commandArgs, isBubble) { + return { kind: 2, commandId, commandArgs, isBubble }; +} +function printWhenExplanation(when) { + if (!when) { + return `no when condition`; + } + return `${when.serialize()}`; +} +function printSourceExplanation(kb) { + return kb.extensionId ? kb.isBuiltinExtension ? `built-in extension ${kb.extensionId}` : `user extension ${kb.extensionId}` : kb.isDefault ? `built-in` : `user`; +} +var NoMatchingKb, MoreChordsNeeded, KeybindingResolver; +var init_keybindingResolver = __esm({ + "node_modules/monaco-editor/esm/vs/platform/keybinding/common/keybindingResolver.js"() { + init_contextkey(); + NoMatchingKb = { + kind: 0 + /* ResultKind.NoMatchingKb */ + }; + MoreChordsNeeded = { + kind: 1 + /* ResultKind.MoreChordsNeeded */ + }; + KeybindingResolver = class _KeybindingResolver { + constructor(defaultKeybindings, overrides, log2) { + var _a10; + this._log = log2; + this._defaultKeybindings = defaultKeybindings; + this._defaultBoundCommands = /* @__PURE__ */ new Map(); + for (const defaultKeybinding of defaultKeybindings) { + const command = defaultKeybinding.command; + if (command && command.charAt(0) !== "-") { + this._defaultBoundCommands.set(command, true); + } + } + this._map = /* @__PURE__ */ new Map(); + this._lookupMap = /* @__PURE__ */ new Map(); + this._keybindings = _KeybindingResolver.handleRemovals([].concat(defaultKeybindings).concat(overrides)); + for (let i = 0, len = this._keybindings.length; i < len; i++) { + const k = this._keybindings[i]; + if (k.chords.length === 0) { + continue; + } + const when = (_a10 = k.when) === null || _a10 === void 0 ? void 0 : _a10.substituteConstants(); + if (when && when.type === 0) { + continue; + } + this._addKeyPress(k.chords[0], k); + } + } + static _isTargetedForRemoval(defaultKb, keypress, when) { + if (keypress) { + for (let i = 0; i < keypress.length; i++) { + if (keypress[i] !== defaultKb.chords[i]) { + return false; + } + } + } + if (when && when.type !== 1) { + if (!defaultKb.when) { + return false; + } + if (!expressionsAreEqualWithConstantSubstitution(when, defaultKb.when)) { + return false; + } + } + return true; + } + /** + * Looks for rules containing "-commandId" and removes them. + */ + static handleRemovals(rules) { + const removals = /* @__PURE__ */ new Map(); + for (let i = 0, len = rules.length; i < len; i++) { + const rule = rules[i]; + if (rule.command && rule.command.charAt(0) === "-") { + const command = rule.command.substring(1); + if (!removals.has(command)) { + removals.set(command, [rule]); + } else { + removals.get(command).push(rule); + } + } + } + if (removals.size === 0) { + return rules; + } + const result = []; + for (let i = 0, len = rules.length; i < len; i++) { + const rule = rules[i]; + if (!rule.command || rule.command.length === 0) { + result.push(rule); + continue; + } + if (rule.command.charAt(0) === "-") { + continue; + } + const commandRemovals = removals.get(rule.command); + if (!commandRemovals || !rule.isDefault) { + result.push(rule); + continue; + } + let isRemoved = false; + for (const commandRemoval of commandRemovals) { + const when = commandRemoval.when; + if (this._isTargetedForRemoval(rule, commandRemoval.chords, when)) { + isRemoved = true; + break; + } + } + if (!isRemoved) { + result.push(rule); + continue; + } + } + return result; + } + _addKeyPress(keypress, item) { + const conflicts = this._map.get(keypress); + if (typeof conflicts === "undefined") { + this._map.set(keypress, [item]); + this._addToLookupMap(item); + return; + } + for (let i = conflicts.length - 1; i >= 0; i--) { + const conflict = conflicts[i]; + if (conflict.command === item.command) { + continue; + } + let isShorterKbPrefix = true; + for (let i2 = 1; i2 < conflict.chords.length && i2 < item.chords.length; i2++) { + if (conflict.chords[i2] !== item.chords[i2]) { + isShorterKbPrefix = false; + break; + } + } + if (!isShorterKbPrefix) { + continue; + } + if (_KeybindingResolver.whenIsEntirelyIncluded(conflict.when, item.when)) { + this._removeFromLookupMap(conflict); + } + } + conflicts.push(item); + this._addToLookupMap(item); + } + _addToLookupMap(item) { + if (!item.command) { + return; + } + let arr = this._lookupMap.get(item.command); + if (typeof arr === "undefined") { + arr = [item]; + this._lookupMap.set(item.command, arr); + } else { + arr.push(item); + } + } + _removeFromLookupMap(item) { + if (!item.command) { + return; + } + const arr = this._lookupMap.get(item.command); + if (typeof arr === "undefined") { + return; + } + for (let i = 0, len = arr.length; i < len; i++) { + if (arr[i] === item) { + arr.splice(i, 1); + return; + } + } + } + /** + * Returns true if it is provable `a` implies `b`. + */ + static whenIsEntirelyIncluded(a3, b) { + if (!b || b.type === 1) { + return true; + } + if (!a3 || a3.type === 1) { + return false; + } + return implies(a3, b); + } + getKeybindings() { + return this._keybindings; + } + lookupPrimaryKeybinding(commandId, context) { + const items = this._lookupMap.get(commandId); + if (typeof items === "undefined" || items.length === 0) { + return null; + } + if (items.length === 1) { + return items[0]; + } + for (let i = items.length - 1; i >= 0; i--) { + const item = items[i]; + if (context.contextMatchesRules(item.when)) { + return item; + } + } + return items[items.length - 1]; + } + /** + * Looks up a keybinding trigged as a result of pressing a sequence of chords - `[...currentChords, keypress]` + * + * Example: resolving 3 chords pressed sequentially - `cmd+k cmd+p cmd+i`: + * `currentChords = [ 'cmd+k' , 'cmd+p' ]` and `keypress = `cmd+i` - last pressed chord + */ + resolve(context, currentChords, keypress) { + const pressedChords = [...currentChords, keypress]; + this._log(`| Resolving ${pressedChords}`); + const kbCandidates = this._map.get(pressedChords[0]); + if (kbCandidates === void 0) { + this._log(`\\ No keybinding entries.`); + return NoMatchingKb; + } + let lookupMap = null; + if (pressedChords.length < 2) { + lookupMap = kbCandidates; + } else { + lookupMap = []; + for (let i = 0, len = kbCandidates.length; i < len; i++) { + const candidate = kbCandidates[i]; + if (pressedChords.length > candidate.chords.length) { + continue; + } + let prefixMatches = true; + for (let i2 = 1; i2 < pressedChords.length; i2++) { + if (candidate.chords[i2] !== pressedChords[i2]) { + prefixMatches = false; + break; + } + } + if (prefixMatches) { + lookupMap.push(candidate); + } + } + } + const result = this._findCommand(context, lookupMap); + if (!result) { + this._log(`\\ From ${lookupMap.length} keybinding entries, no when clauses matched the context.`); + return NoMatchingKb; + } + if (pressedChords.length < result.chords.length) { + this._log(`\\ From ${lookupMap.length} keybinding entries, awaiting ${result.chords.length - pressedChords.length} more chord(s), when: ${printWhenExplanation(result.when)}, source: ${printSourceExplanation(result)}.`); + return MoreChordsNeeded; + } + this._log(`\\ From ${lookupMap.length} keybinding entries, matched ${result.command}, when: ${printWhenExplanation(result.when)}, source: ${printSourceExplanation(result)}.`); + return KbFound(result.command, result.commandArgs, result.bubble); + } + _findCommand(context, matches2) { + for (let i = matches2.length - 1; i >= 0; i--) { + const k = matches2[i]; + if (!_KeybindingResolver._contextMatchesRules(context, k.when)) { + continue; + } + return k; + } + return null; + } + static _contextMatchesRules(context, rules) { + if (!rules) { + return true; + } + return rules.evaluate(context); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/keybinding/common/abstractKeybindingService.js +var HIGH_FREQ_COMMANDS, AbstractKeybindingService, KeybindingModifierSet; +var init_abstractKeybindingService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/keybinding/common/abstractKeybindingService.js"() { + init_async(); + init_errors(); + init_event(); + init_ime(); + init_lifecycle(); + init_nls(); + init_keybindingResolver(); + HIGH_FREQ_COMMANDS = /^(cursor|delete|undo|redo|tab|editor\.action\.clipboard)/; + AbstractKeybindingService = class extends Disposable { + get onDidUpdateKeybindings() { + return this._onDidUpdateKeybindings ? this._onDidUpdateKeybindings.event : Event.None; + } + get inChordMode() { + return this._currentChords.length > 0; + } + constructor(_contextKeyService, _commandService, _telemetryService, _notificationService, _logService) { + super(); + this._contextKeyService = _contextKeyService; + this._commandService = _commandService; + this._telemetryService = _telemetryService; + this._notificationService = _notificationService; + this._logService = _logService; + this._onDidUpdateKeybindings = this._register(new Emitter()); + this._currentChords = []; + this._currentChordChecker = new IntervalTimer(); + this._currentChordStatusMessage = null; + this._ignoreSingleModifiers = KeybindingModifierSet.EMPTY; + this._currentSingleModifier = null; + this._currentSingleModifierClearTimeout = new TimeoutTimer(); + this._currentlyDispatchingCommandId = null; + this._logging = false; + } + dispose() { + super.dispose(); + } + _log(str) { + if (this._logging) { + this._logService.info(`[KeybindingService]: ${str}`); + } + } + getKeybindings() { + return this._getResolver().getKeybindings(); + } + lookupKeybinding(commandId, context) { + const result = this._getResolver().lookupPrimaryKeybinding(commandId, context || this._contextKeyService); + if (!result) { + return void 0; + } + return result.resolvedKeybinding; + } + dispatchEvent(e, target) { + return this._dispatch(e, target); + } + // TODO@ulugbekna: update namings to align with `_doDispatch` + // TODO@ulugbekna: this fn doesn't seem to take into account single-modifier keybindings, eg `shift shift` + softDispatch(e, target) { + this._log(`/ Soft dispatching keyboard event`); + const keybinding = this.resolveKeyboardEvent(e); + if (keybinding.hasMultipleChords()) { + console.warn("keyboard event should not be mapped to multiple chords"); + return NoMatchingKb; + } + const [firstChord] = keybinding.getDispatchChords(); + if (firstChord === null) { + this._log(`\\ Keyboard event cannot be dispatched`); + return NoMatchingKb; + } + const contextValue = this._contextKeyService.getContext(target); + const currentChords = this._currentChords.map(({ keypress }) => keypress); + return this._getResolver().resolve(contextValue, currentChords, firstChord); + } + _scheduleLeaveChordMode() { + const chordLastInteractedTime = Date.now(); + this._currentChordChecker.cancelAndSet(() => { + if (!this._documentHasFocus()) { + this._leaveChordMode(); + return; + } + if (Date.now() - chordLastInteractedTime > 5e3) { + this._leaveChordMode(); + } + }, 500); + } + _expectAnotherChord(firstChord, keypressLabel) { + this._currentChords.push({ keypress: firstChord, label: keypressLabel }); + switch (this._currentChords.length) { + case 0: + throw illegalState("impossible"); + case 1: + this._currentChordStatusMessage = this._notificationService.status(localize("first.chord", "({0}) was pressed. Waiting for second key of chord...", keypressLabel)); + break; + default: { + const fullKeypressLabel = this._currentChords.map(({ label }) => label).join(", "); + this._currentChordStatusMessage = this._notificationService.status(localize("next.chord", "({0}) was pressed. Waiting for next key of chord...", fullKeypressLabel)); + } + } + this._scheduleLeaveChordMode(); + if (IME.enabled) { + IME.disable(); + } + } + _leaveChordMode() { + if (this._currentChordStatusMessage) { + this._currentChordStatusMessage.dispose(); + this._currentChordStatusMessage = null; + } + this._currentChordChecker.cancel(); + this._currentChords = []; + IME.enable(); + } + _dispatch(e, target) { + return this._doDispatch( + this.resolveKeyboardEvent(e), + target, + /*isSingleModiferChord*/ + false + ); + } + _singleModifierDispatch(e, target) { + const keybinding = this.resolveKeyboardEvent(e); + const [singleModifier] = keybinding.getSingleModifierDispatchChords(); + if (singleModifier) { + if (this._ignoreSingleModifiers.has(singleModifier)) { + this._log(`+ Ignoring single modifier ${singleModifier} due to it being pressed together with other keys.`); + this._ignoreSingleModifiers = KeybindingModifierSet.EMPTY; + this._currentSingleModifierClearTimeout.cancel(); + this._currentSingleModifier = null; + return false; + } + this._ignoreSingleModifiers = KeybindingModifierSet.EMPTY; + if (this._currentSingleModifier === null) { + this._log(`+ Storing single modifier for possible chord ${singleModifier}.`); + this._currentSingleModifier = singleModifier; + this._currentSingleModifierClearTimeout.cancelAndSet(() => { + this._log(`+ Clearing single modifier due to 300ms elapsed.`); + this._currentSingleModifier = null; + }, 300); + return false; + } + if (singleModifier === this._currentSingleModifier) { + this._log(`/ Dispatching single modifier chord ${singleModifier} ${singleModifier}`); + this._currentSingleModifierClearTimeout.cancel(); + this._currentSingleModifier = null; + return this._doDispatch( + keybinding, + target, + /*isSingleModiferChord*/ + true + ); + } + this._log(`+ Clearing single modifier due to modifier mismatch: ${this._currentSingleModifier} ${singleModifier}`); + this._currentSingleModifierClearTimeout.cancel(); + this._currentSingleModifier = null; + return false; + } + const [firstChord] = keybinding.getChords(); + this._ignoreSingleModifiers = new KeybindingModifierSet(firstChord); + if (this._currentSingleModifier !== null) { + this._log(`+ Clearing single modifier due to other key up.`); + } + this._currentSingleModifierClearTimeout.cancel(); + this._currentSingleModifier = null; + return false; + } + _doDispatch(userKeypress, target, isSingleModiferChord = false) { + var _a10; + let shouldPreventDefault = false; + if (userKeypress.hasMultipleChords()) { + console.warn("Unexpected keyboard event mapped to multiple chords"); + return false; + } + let userPressedChord = null; + let currentChords = null; + if (isSingleModiferChord) { + const [dispatchKeyname] = userKeypress.getSingleModifierDispatchChords(); + userPressedChord = dispatchKeyname; + currentChords = dispatchKeyname ? [dispatchKeyname] : []; + } else { + [userPressedChord] = userKeypress.getDispatchChords(); + currentChords = this._currentChords.map(({ keypress }) => keypress); + } + if (userPressedChord === null) { + this._log(`\\ Keyboard event cannot be dispatched in keydown phase.`); + return shouldPreventDefault; + } + const contextValue = this._contextKeyService.getContext(target); + const keypressLabel = userKeypress.getLabel(); + const resolveResult = this._getResolver().resolve(contextValue, currentChords, userPressedChord); + switch (resolveResult.kind) { + case 0: { + this._logService.trace("KeybindingService#dispatch", keypressLabel, `[ No matching keybinding ]`); + if (this.inChordMode) { + const currentChordsLabel = this._currentChords.map(({ label }) => label).join(", "); + this._log(`+ Leaving multi-chord mode: Nothing bound to "${currentChordsLabel}, ${keypressLabel}".`); + this._notificationService.status(localize("missing.chord", "The key combination ({0}, {1}) is not a command.", currentChordsLabel, keypressLabel), { + hideAfter: 10 * 1e3 + /* 10s */ + }); + this._leaveChordMode(); + shouldPreventDefault = true; + } + return shouldPreventDefault; + } + case 1: { + this._logService.trace("KeybindingService#dispatch", keypressLabel, `[ Several keybindings match - more chords needed ]`); + shouldPreventDefault = true; + this._expectAnotherChord(userPressedChord, keypressLabel); + this._log(this._currentChords.length === 1 ? `+ Entering multi-chord mode...` : `+ Continuing multi-chord mode...`); + return shouldPreventDefault; + } + case 2: { + this._logService.trace("KeybindingService#dispatch", keypressLabel, `[ Will dispatch command ${resolveResult.commandId} ]`); + if (resolveResult.commandId === null || resolveResult.commandId === "") { + if (this.inChordMode) { + const currentChordsLabel = this._currentChords.map(({ label }) => label).join(", "); + this._log(`+ Leaving chord mode: Nothing bound to "${currentChordsLabel}, ${keypressLabel}".`); + this._notificationService.status(localize("missing.chord", "The key combination ({0}, {1}) is not a command.", currentChordsLabel, keypressLabel), { + hideAfter: 10 * 1e3 + /* 10s */ + }); + this._leaveChordMode(); + shouldPreventDefault = true; + } + } else { + if (this.inChordMode) { + this._leaveChordMode(); + } + if (!resolveResult.isBubble) { + shouldPreventDefault = true; + } + this._log(`+ Invoking command ${resolveResult.commandId}.`); + this._currentlyDispatchingCommandId = resolveResult.commandId; + try { + if (typeof resolveResult.commandArgs === "undefined") { + this._commandService.executeCommand(resolveResult.commandId).then(void 0, (err) => this._notificationService.warn(err)); + } else { + this._commandService.executeCommand(resolveResult.commandId, resolveResult.commandArgs).then(void 0, (err) => this._notificationService.warn(err)); + } + } finally { + this._currentlyDispatchingCommandId = null; + } + if (!HIGH_FREQ_COMMANDS.test(resolveResult.commandId)) { + this._telemetryService.publicLog2("workbenchActionExecuted", { id: resolveResult.commandId, from: "keybinding", detail: (_a10 = userKeypress.getUserSettingsLabel()) !== null && _a10 !== void 0 ? _a10 : void 0 }); + } + } + return shouldPreventDefault; + } + } + } + mightProducePrintableCharacter(event) { + if (event.ctrlKey || event.metaKey) { + return false; + } + if (event.keyCode >= 31 && event.keyCode <= 56 || event.keyCode >= 21 && event.keyCode <= 30) { + return true; + } + return false; + } + }; + KeybindingModifierSet = class { + constructor(source) { + this._ctrlKey = source ? source.ctrlKey : false; + this._shiftKey = source ? source.shiftKey : false; + this._altKey = source ? source.altKey : false; + this._metaKey = source ? source.metaKey : false; + } + has(modifier) { + switch (modifier) { + case "ctrl": + return this._ctrlKey; + case "shift": + return this._shiftKey; + case "alt": + return this._altKey; + case "meta": + return this._metaKey; + } + } + }; + KeybindingModifierSet.EMPTY = new KeybindingModifierSet(null); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/keybinding/common/resolvedKeybindingItem.js +function toEmptyArrayIfContainsNull(arr) { + const result = []; + for (let i = 0, len = arr.length; i < len; i++) { + const element = arr[i]; + if (!element) { + return []; + } + result.push(element); + } + return result; +} +var ResolvedKeybindingItem; +var init_resolvedKeybindingItem = __esm({ + "node_modules/monaco-editor/esm/vs/platform/keybinding/common/resolvedKeybindingItem.js"() { + ResolvedKeybindingItem = class { + constructor(resolvedKeybinding, command, commandArgs, when, isDefault, extensionId, isBuiltinExtension) { + this._resolvedKeybindingItemBrand = void 0; + this.resolvedKeybinding = resolvedKeybinding; + this.chords = resolvedKeybinding ? toEmptyArrayIfContainsNull(resolvedKeybinding.getDispatchChords()) : []; + if (resolvedKeybinding && this.chords.length === 0) { + this.chords = toEmptyArrayIfContainsNull(resolvedKeybinding.getSingleModifierDispatchChords()); + } + this.bubble = command ? command.charCodeAt(0) === 94 : false; + this.command = this.bubble ? command.substr(1) : command; + this.commandArgs = commandArgs; + this.when = when; + this.isDefault = isDefault; + this.extensionId = extensionId; + this.isBuiltinExtension = isBuiltinExtension; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/keybindingLabels.js +function _simpleAsString(modifiers, key, labels) { + if (key === null) { + return ""; + } + const result = []; + if (modifiers.ctrlKey) { + result.push(labels.ctrlKey); + } + if (modifiers.shiftKey) { + result.push(labels.shiftKey); + } + if (modifiers.altKey) { + result.push(labels.altKey); + } + if (modifiers.metaKey) { + result.push(labels.metaKey); + } + if (key !== "") { + result.push(key); + } + return result.join(labels.separator); +} +var ModifierLabelProvider, UILabelProvider, AriaLabelProvider, ElectronAcceleratorLabelProvider, UserSettingsLabelProvider; +var init_keybindingLabels = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/keybindingLabels.js"() { + init_nls(); + ModifierLabelProvider = class { + constructor(mac, windows, linux = windows) { + this.modifierLabels = [null]; + this.modifierLabels[ + 2 + /* OperatingSystem.Macintosh */ + ] = mac; + this.modifierLabels[ + 1 + /* OperatingSystem.Windows */ + ] = windows; + this.modifierLabels[ + 3 + /* OperatingSystem.Linux */ + ] = linux; + } + toLabel(OS2, chords, keyLabelProvider) { + if (chords.length === 0) { + return null; + } + const result = []; + for (let i = 0, len = chords.length; i < len; i++) { + const chord = chords[i]; + const keyLabel = keyLabelProvider(chord); + if (keyLabel === null) { + return null; + } + result[i] = _simpleAsString(chord, keyLabel, this.modifierLabels[OS2]); + } + return result.join(" "); + } + }; + UILabelProvider = new ModifierLabelProvider({ + ctrlKey: "\u2303", + shiftKey: "\u21E7", + altKey: "\u2325", + metaKey: "\u2318", + separator: "" + }, { + ctrlKey: localize({ key: "ctrlKey", comment: ["This is the short form for the Control key on the keyboard"] }, "Ctrl"), + shiftKey: localize({ key: "shiftKey", comment: ["This is the short form for the Shift key on the keyboard"] }, "Shift"), + altKey: localize({ key: "altKey", comment: ["This is the short form for the Alt key on the keyboard"] }, "Alt"), + metaKey: localize({ key: "windowsKey", comment: ["This is the short form for the Windows key on the keyboard"] }, "Windows"), + separator: "+" + }, { + ctrlKey: localize({ key: "ctrlKey", comment: ["This is the short form for the Control key on the keyboard"] }, "Ctrl"), + shiftKey: localize({ key: "shiftKey", comment: ["This is the short form for the Shift key on the keyboard"] }, "Shift"), + altKey: localize({ key: "altKey", comment: ["This is the short form for the Alt key on the keyboard"] }, "Alt"), + metaKey: localize({ key: "superKey", comment: ["This is the short form for the Super key on the keyboard"] }, "Super"), + separator: "+" + }); + AriaLabelProvider = new ModifierLabelProvider({ + ctrlKey: localize({ key: "ctrlKey.long", comment: ["This is the long form for the Control key on the keyboard"] }, "Control"), + shiftKey: localize({ key: "shiftKey.long", comment: ["This is the long form for the Shift key on the keyboard"] }, "Shift"), + altKey: localize({ key: "optKey.long", comment: ["This is the long form for the Alt/Option key on the keyboard"] }, "Option"), + metaKey: localize({ key: "cmdKey.long", comment: ["This is the long form for the Command key on the keyboard"] }, "Command"), + separator: "+" + }, { + ctrlKey: localize({ key: "ctrlKey.long", comment: ["This is the long form for the Control key on the keyboard"] }, "Control"), + shiftKey: localize({ key: "shiftKey.long", comment: ["This is the long form for the Shift key on the keyboard"] }, "Shift"), + altKey: localize({ key: "altKey.long", comment: ["This is the long form for the Alt key on the keyboard"] }, "Alt"), + metaKey: localize({ key: "windowsKey.long", comment: ["This is the long form for the Windows key on the keyboard"] }, "Windows"), + separator: "+" + }, { + ctrlKey: localize({ key: "ctrlKey.long", comment: ["This is the long form for the Control key on the keyboard"] }, "Control"), + shiftKey: localize({ key: "shiftKey.long", comment: ["This is the long form for the Shift key on the keyboard"] }, "Shift"), + altKey: localize({ key: "altKey.long", comment: ["This is the long form for the Alt key on the keyboard"] }, "Alt"), + metaKey: localize({ key: "superKey.long", comment: ["This is the long form for the Super key on the keyboard"] }, "Super"), + separator: "+" + }); + ElectronAcceleratorLabelProvider = new ModifierLabelProvider({ + ctrlKey: "Ctrl", + shiftKey: "Shift", + altKey: "Alt", + metaKey: "Cmd", + separator: "+" + }, { + ctrlKey: "Ctrl", + shiftKey: "Shift", + altKey: "Alt", + metaKey: "Super", + separator: "+" + }); + UserSettingsLabelProvider = new ModifierLabelProvider({ + ctrlKey: "ctrl", + shiftKey: "shift", + altKey: "alt", + metaKey: "cmd", + separator: "+" + }, { + ctrlKey: "ctrl", + shiftKey: "shift", + altKey: "alt", + metaKey: "win", + separator: "+" + }, { + ctrlKey: "ctrl", + shiftKey: "shift", + altKey: "alt", + metaKey: "meta", + separator: "+" + }); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/keybinding/common/baseResolvedKeybinding.js +var BaseResolvedKeybinding; +var init_baseResolvedKeybinding = __esm({ + "node_modules/monaco-editor/esm/vs/platform/keybinding/common/baseResolvedKeybinding.js"() { + init_errors(); + init_keybindingLabels(); + init_keybindings(); + BaseResolvedKeybinding = class extends ResolvedKeybinding { + constructor(os, chords) { + super(); + if (chords.length === 0) { + throw illegalArgument(`chords`); + } + this._os = os; + this._chords = chords; + } + getLabel() { + return UILabelProvider.toLabel(this._os, this._chords, (keybinding) => this._getLabel(keybinding)); + } + getAriaLabel() { + return AriaLabelProvider.toLabel(this._os, this._chords, (keybinding) => this._getAriaLabel(keybinding)); + } + getElectronAccelerator() { + if (this._chords.length > 1) { + return null; + } + if (this._chords[0].isDuplicateModifierCase()) { + return null; + } + return ElectronAcceleratorLabelProvider.toLabel(this._os, this._chords, (keybinding) => this._getElectronAccelerator(keybinding)); + } + getUserSettingsLabel() { + return UserSettingsLabelProvider.toLabel(this._os, this._chords, (keybinding) => this._getUserSettingsLabel(keybinding)); + } + hasMultipleChords() { + return this._chords.length > 1; + } + getChords() { + return this._chords.map((keybinding) => this._getChord(keybinding)); + } + _getChord(keybinding) { + return new ResolvedChord(keybinding.ctrlKey, keybinding.shiftKey, keybinding.altKey, keybinding.metaKey, this._getLabel(keybinding), this._getAriaLabel(keybinding)); + } + getDispatchChords() { + return this._chords.map((keybinding) => this._getChordDispatch(keybinding)); + } + getSingleModifierDispatchChords() { + return this._chords.map((keybinding) => this._getSingleModifierChordDispatch(keybinding)); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/keybinding/common/usLayoutResolvedKeybinding.js +var USLayoutResolvedKeybinding; +var init_usLayoutResolvedKeybinding = __esm({ + "node_modules/monaco-editor/esm/vs/platform/keybinding/common/usLayoutResolvedKeybinding.js"() { + init_keyCodes(); + init_keybindings(); + init_baseResolvedKeybinding(); + init_resolvedKeybindingItem(); + USLayoutResolvedKeybinding = class _USLayoutResolvedKeybinding extends BaseResolvedKeybinding { + constructor(chords, os) { + super(os, chords); + } + _keyCodeToUILabel(keyCode) { + if (this._os === 2) { + switch (keyCode) { + case 15: + return "\u2190"; + case 16: + return "\u2191"; + case 17: + return "\u2192"; + case 18: + return "\u2193"; + } + } + return KeyCodeUtils.toString(keyCode); + } + _getLabel(chord) { + if (chord.isDuplicateModifierCase()) { + return ""; + } + return this._keyCodeToUILabel(chord.keyCode); + } + _getAriaLabel(chord) { + if (chord.isDuplicateModifierCase()) { + return ""; + } + return KeyCodeUtils.toString(chord.keyCode); + } + _getElectronAccelerator(chord) { + return KeyCodeUtils.toElectronAccelerator(chord.keyCode); + } + _getUserSettingsLabel(chord) { + if (chord.isDuplicateModifierCase()) { + return ""; + } + const result = KeyCodeUtils.toUserSettingsUS(chord.keyCode); + return result ? result.toLowerCase() : result; + } + _getChordDispatch(chord) { + return _USLayoutResolvedKeybinding.getDispatchStr(chord); + } + static getDispatchStr(chord) { + if (chord.isModifierKey()) { + return null; + } + let result = ""; + if (chord.ctrlKey) { + result += "ctrl+"; + } + if (chord.shiftKey) { + result += "shift+"; + } + if (chord.altKey) { + result += "alt+"; + } + if (chord.metaKey) { + result += "meta+"; + } + result += KeyCodeUtils.toString(chord.keyCode); + return result; + } + _getSingleModifierChordDispatch(keybinding) { + if (keybinding.keyCode === 5 && !keybinding.shiftKey && !keybinding.altKey && !keybinding.metaKey) { + return "ctrl"; + } + if (keybinding.keyCode === 4 && !keybinding.ctrlKey && !keybinding.altKey && !keybinding.metaKey) { + return "shift"; + } + if (keybinding.keyCode === 6 && !keybinding.ctrlKey && !keybinding.shiftKey && !keybinding.metaKey) { + return "alt"; + } + if (keybinding.keyCode === 57 && !keybinding.ctrlKey && !keybinding.shiftKey && !keybinding.altKey) { + return "meta"; + } + return null; + } + /** + * *NOTE*: Check return value for `KeyCode.Unknown`. + */ + static _scanCodeToKeyCode(scanCode) { + const immutableKeyCode = IMMUTABLE_CODE_TO_KEY_CODE[scanCode]; + if (immutableKeyCode !== -1) { + return immutableKeyCode; + } + switch (scanCode) { + case 10: + return 31; + case 11: + return 32; + case 12: + return 33; + case 13: + return 34; + case 14: + return 35; + case 15: + return 36; + case 16: + return 37; + case 17: + return 38; + case 18: + return 39; + case 19: + return 40; + case 20: + return 41; + case 21: + return 42; + case 22: + return 43; + case 23: + return 44; + case 24: + return 45; + case 25: + return 46; + case 26: + return 47; + case 27: + return 48; + case 28: + return 49; + case 29: + return 50; + case 30: + return 51; + case 31: + return 52; + case 32: + return 53; + case 33: + return 54; + case 34: + return 55; + case 35: + return 56; + case 36: + return 22; + case 37: + return 23; + case 38: + return 24; + case 39: + return 25; + case 40: + return 26; + case 41: + return 27; + case 42: + return 28; + case 43: + return 29; + case 44: + return 30; + case 45: + return 21; + case 51: + return 88; + case 52: + return 86; + case 53: + return 92; + case 54: + return 94; + case 55: + return 93; + case 56: + return 0; + // missing + case 57: + return 85; + case 58: + return 95; + case 59: + return 91; + case 60: + return 87; + case 61: + return 89; + case 62: + return 90; + case 106: + return 97; + } + return 0; + } + static _toKeyCodeChord(chord) { + if (!chord) { + return null; + } + if (chord instanceof KeyCodeChord) { + return chord; + } + const keyCode = this._scanCodeToKeyCode(chord.scanCode); + if (keyCode === 0) { + return null; + } + return new KeyCodeChord(chord.ctrlKey, chord.shiftKey, chord.altKey, chord.metaKey, keyCode); + } + static resolveKeybinding(keybinding, os) { + const chords = toEmptyArrayIfContainsNull(keybinding.chords.map((chord) => this._toKeyCodeChord(chord))); + if (chords.length > 0) { + return [new _USLayoutResolvedKeybinding(chords, os)]; + } + return []; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/label/common/label.js +var ILabelService; +var init_label = __esm({ + "node_modules/monaco-editor/esm/vs/platform/label/common/label.js"() { + init_instantiation(); + ILabelService = createDecorator("labelService"); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/progress/common/progress.js +var IProgressService, emptyProgressRunner, Progress, IEditorProgressService; +var init_progress = __esm({ + "node_modules/monaco-editor/esm/vs/platform/progress/common/progress.js"() { + init_instantiation(); + IProgressService = createDecorator("progressService"); + emptyProgressRunner = Object.freeze({ + total() { + }, + worked() { + }, + done() { + } + }); + Progress = class { + constructor(callback) { + this.callback = callback; + } + report(item) { + this._value = item; + this.callback(this._value); + } + }; + Progress.None = Object.freeze({ report() { + } }); + IEditorProgressService = createDecorator("editorProgressService"); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/ternarySearchTree.js +var StringIterator, ConfigKeysIterator, PathIterator, UriIterator, TernarySearchTreeNode, TernarySearchTree; +var init_ternarySearchTree = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/ternarySearchTree.js"() { + init_strings(); + StringIterator = class { + constructor() { + this._value = ""; + this._pos = 0; + } + reset(key) { + this._value = key; + this._pos = 0; + return this; + } + next() { + this._pos += 1; + return this; + } + hasNext() { + return this._pos < this._value.length - 1; + } + cmp(a3) { + const aCode = a3.charCodeAt(0); + const thisCode = this._value.charCodeAt(this._pos); + return aCode - thisCode; + } + value() { + return this._value[this._pos]; + } + }; + ConfigKeysIterator = class { + constructor(_caseSensitive = true) { + this._caseSensitive = _caseSensitive; + } + reset(key) { + this._value = key; + this._from = 0; + this._to = 0; + return this.next(); + } + hasNext() { + return this._to < this._value.length; + } + next() { + this._from = this._to; + let justSeps = true; + for (; this._to < this._value.length; this._to++) { + const ch = this._value.charCodeAt(this._to); + if (ch === 46) { + if (justSeps) { + this._from++; + } else { + break; + } + } else { + justSeps = false; + } + } + return this; + } + cmp(a3) { + return this._caseSensitive ? compareSubstring(a3, this._value, 0, a3.length, this._from, this._to) : compareSubstringIgnoreCase(a3, this._value, 0, a3.length, this._from, this._to); + } + value() { + return this._value.substring(this._from, this._to); + } + }; + PathIterator = class { + constructor(_splitOnBackslash = true, _caseSensitive = true) { + this._splitOnBackslash = _splitOnBackslash; + this._caseSensitive = _caseSensitive; + } + reset(key) { + this._from = 0; + this._to = 0; + this._value = key; + this._valueLen = key.length; + for (let pos = key.length - 1; pos >= 0; pos--, this._valueLen--) { + const ch = this._value.charCodeAt(pos); + if (!(ch === 47 || this._splitOnBackslash && ch === 92)) { + break; + } + } + return this.next(); + } + hasNext() { + return this._to < this._valueLen; + } + next() { + this._from = this._to; + let justSeps = true; + for (; this._to < this._valueLen; this._to++) { + const ch = this._value.charCodeAt(this._to); + if (ch === 47 || this._splitOnBackslash && ch === 92) { + if (justSeps) { + this._from++; + } else { + break; + } + } else { + justSeps = false; + } + } + return this; + } + cmp(a3) { + return this._caseSensitive ? compareSubstring(a3, this._value, 0, a3.length, this._from, this._to) : compareSubstringIgnoreCase(a3, this._value, 0, a3.length, this._from, this._to); + } + value() { + return this._value.substring(this._from, this._to); + } + }; + UriIterator = class { + constructor(_ignorePathCasing, _ignoreQueryAndFragment) { + this._ignorePathCasing = _ignorePathCasing; + this._ignoreQueryAndFragment = _ignoreQueryAndFragment; + this._states = []; + this._stateIdx = 0; + } + reset(key) { + this._value = key; + this._states = []; + if (this._value.scheme) { + this._states.push( + 1 + /* UriIteratorState.Scheme */ + ); + } + if (this._value.authority) { + this._states.push( + 2 + /* UriIteratorState.Authority */ + ); + } + if (this._value.path) { + this._pathIterator = new PathIterator(false, !this._ignorePathCasing(key)); + this._pathIterator.reset(key.path); + if (this._pathIterator.value()) { + this._states.push( + 3 + /* UriIteratorState.Path */ + ); + } + } + if (!this._ignoreQueryAndFragment(key)) { + if (this._value.query) { + this._states.push( + 4 + /* UriIteratorState.Query */ + ); + } + if (this._value.fragment) { + this._states.push( + 5 + /* UriIteratorState.Fragment */ + ); + } + } + this._stateIdx = 0; + return this; + } + next() { + if (this._states[this._stateIdx] === 3 && this._pathIterator.hasNext()) { + this._pathIterator.next(); + } else { + this._stateIdx += 1; + } + return this; + } + hasNext() { + return this._states[this._stateIdx] === 3 && this._pathIterator.hasNext() || this._stateIdx < this._states.length - 1; + } + cmp(a3) { + if (this._states[this._stateIdx] === 1) { + return compareIgnoreCase(a3, this._value.scheme); + } else if (this._states[this._stateIdx] === 2) { + return compareIgnoreCase(a3, this._value.authority); + } else if (this._states[this._stateIdx] === 3) { + return this._pathIterator.cmp(a3); + } else if (this._states[this._stateIdx] === 4) { + return compare(a3, this._value.query); + } else if (this._states[this._stateIdx] === 5) { + return compare(a3, this._value.fragment); + } + throw new Error(); + } + value() { + if (this._states[this._stateIdx] === 1) { + return this._value.scheme; + } else if (this._states[this._stateIdx] === 2) { + return this._value.authority; + } else if (this._states[this._stateIdx] === 3) { + return this._pathIterator.value(); + } else if (this._states[this._stateIdx] === 4) { + return this._value.query; + } else if (this._states[this._stateIdx] === 5) { + return this._value.fragment; + } + throw new Error(); + } + }; + TernarySearchTreeNode = class { + constructor() { + this.height = 1; + } + rotateLeft() { + const tmp = this.right; + this.right = tmp.left; + tmp.left = this; + this.updateHeight(); + tmp.updateHeight(); + return tmp; + } + rotateRight() { + const tmp = this.left; + this.left = tmp.right; + tmp.right = this; + this.updateHeight(); + tmp.updateHeight(); + return tmp; + } + updateHeight() { + this.height = 1 + Math.max(this.heightLeft, this.heightRight); + } + balanceFactor() { + return this.heightRight - this.heightLeft; + } + get heightLeft() { + var _a10, _b4; + return (_b4 = (_a10 = this.left) === null || _a10 === void 0 ? void 0 : _a10.height) !== null && _b4 !== void 0 ? _b4 : 0; + } + get heightRight() { + var _a10, _b4; + return (_b4 = (_a10 = this.right) === null || _a10 === void 0 ? void 0 : _a10.height) !== null && _b4 !== void 0 ? _b4 : 0; + } + }; + TernarySearchTree = class _TernarySearchTree { + static forUris(ignorePathCasing = () => false, ignoreQueryAndFragment = () => false) { + return new _TernarySearchTree(new UriIterator(ignorePathCasing, ignoreQueryAndFragment)); + } + static forStrings() { + return new _TernarySearchTree(new StringIterator()); + } + static forConfigKeys() { + return new _TernarySearchTree(new ConfigKeysIterator()); + } + constructor(segments) { + this._iter = segments; + } + clear() { + this._root = void 0; + } + set(key, element) { + const iter = this._iter.reset(key); + let node; + if (!this._root) { + this._root = new TernarySearchTreeNode(); + this._root.segment = iter.value(); + } + const stack = []; + node = this._root; + while (true) { + const val = iter.cmp(node.segment); + if (val > 0) { + if (!node.left) { + node.left = new TernarySearchTreeNode(); + node.left.segment = iter.value(); + } + stack.push([-1, node]); + node = node.left; + } else if (val < 0) { + if (!node.right) { + node.right = new TernarySearchTreeNode(); + node.right.segment = iter.value(); + } + stack.push([1, node]); + node = node.right; + } else if (iter.hasNext()) { + iter.next(); + if (!node.mid) { + node.mid = new TernarySearchTreeNode(); + node.mid.segment = iter.value(); + } + stack.push([0, node]); + node = node.mid; + } else { + break; + } + } + const oldElement = node.value; + node.value = element; + node.key = key; + for (let i = stack.length - 1; i >= 0; i--) { + const node2 = stack[i][1]; + node2.updateHeight(); + const bf = node2.balanceFactor(); + if (bf < -1 || bf > 1) { + const d1 = stack[i][0]; + const d2 = stack[i + 1][0]; + if (d1 === 1 && d2 === 1) { + stack[i][1] = node2.rotateLeft(); + } else if (d1 === -1 && d2 === -1) { + stack[i][1] = node2.rotateRight(); + } else if (d1 === 1 && d2 === -1) { + node2.right = stack[i + 1][1] = stack[i + 1][1].rotateRight(); + stack[i][1] = node2.rotateLeft(); + } else if (d1 === -1 && d2 === 1) { + node2.left = stack[i + 1][1] = stack[i + 1][1].rotateLeft(); + stack[i][1] = node2.rotateRight(); + } else { + throw new Error(); + } + if (i > 0) { + switch (stack[i - 1][0]) { + case -1: + stack[i - 1][1].left = stack[i][1]; + break; + case 1: + stack[i - 1][1].right = stack[i][1]; + break; + case 0: + stack[i - 1][1].mid = stack[i][1]; + break; + } + } else { + this._root = stack[0][1]; + } + } + } + return oldElement; + } + get(key) { + var _a10; + return (_a10 = this._getNode(key)) === null || _a10 === void 0 ? void 0 : _a10.value; + } + _getNode(key) { + const iter = this._iter.reset(key); + let node = this._root; + while (node) { + const val = iter.cmp(node.segment); + if (val > 0) { + node = node.left; + } else if (val < 0) { + node = node.right; + } else if (iter.hasNext()) { + iter.next(); + node = node.mid; + } else { + break; + } + } + return node; + } + has(key) { + const node = this._getNode(key); + return !((node === null || node === void 0 ? void 0 : node.value) === void 0 && (node === null || node === void 0 ? void 0 : node.mid) === void 0); + } + delete(key) { + return this._delete(key, false); + } + deleteSuperstr(key) { + return this._delete(key, true); + } + _delete(key, superStr) { + var _a10; + const iter = this._iter.reset(key); + const stack = []; + let node = this._root; + while (node) { + const val = iter.cmp(node.segment); + if (val > 0) { + stack.push([-1, node]); + node = node.left; + } else if (val < 0) { + stack.push([1, node]); + node = node.right; + } else if (iter.hasNext()) { + iter.next(); + stack.push([0, node]); + node = node.mid; + } else { + break; + } + } + if (!node) { + return; + } + if (superStr) { + node.left = void 0; + node.mid = void 0; + node.right = void 0; + node.height = 1; + } else { + node.key = void 0; + node.value = void 0; + } + if (!node.mid && !node.value) { + if (node.left && node.right) { + const min = this._min(node.right); + if (min.key) { + const { key: key2, value, segment } = min; + this._delete(min.key, false); + node.key = key2; + node.value = value; + node.segment = segment; + } + } else { + const newChild = (_a10 = node.left) !== null && _a10 !== void 0 ? _a10 : node.right; + if (stack.length > 0) { + const [dir, parent] = stack[stack.length - 1]; + switch (dir) { + case -1: + parent.left = newChild; + break; + case 0: + parent.mid = newChild; + break; + case 1: + parent.right = newChild; + break; + } + } else { + this._root = newChild; + } + } + } + for (let i = stack.length - 1; i >= 0; i--) { + const node2 = stack[i][1]; + node2.updateHeight(); + const bf = node2.balanceFactor(); + if (bf > 1) { + if (node2.right.balanceFactor() >= 0) { + stack[i][1] = node2.rotateLeft(); + } else { + node2.right = node2.right.rotateRight(); + stack[i][1] = node2.rotateLeft(); + } + } else if (bf < -1) { + if (node2.left.balanceFactor() <= 0) { + stack[i][1] = node2.rotateRight(); + } else { + node2.left = node2.left.rotateLeft(); + stack[i][1] = node2.rotateRight(); + } + } + if (i > 0) { + switch (stack[i - 1][0]) { + case -1: + stack[i - 1][1].left = stack[i][1]; + break; + case 1: + stack[i - 1][1].right = stack[i][1]; + break; + case 0: + stack[i - 1][1].mid = stack[i][1]; + break; + } + } else { + this._root = stack[0][1]; + } + } + } + _min(node) { + while (node.left) { + node = node.left; + } + return node; + } + findSubstr(key) { + const iter = this._iter.reset(key); + let node = this._root; + let candidate = void 0; + while (node) { + const val = iter.cmp(node.segment); + if (val > 0) { + node = node.left; + } else if (val < 0) { + node = node.right; + } else if (iter.hasNext()) { + iter.next(); + candidate = node.value || candidate; + node = node.mid; + } else { + break; + } + } + return node && node.value || candidate; + } + findSuperstr(key) { + return this._findSuperstrOrElement(key, false); + } + _findSuperstrOrElement(key, allowValue) { + const iter = this._iter.reset(key); + let node = this._root; + while (node) { + const val = iter.cmp(node.segment); + if (val > 0) { + node = node.left; + } else if (val < 0) { + node = node.right; + } else if (iter.hasNext()) { + iter.next(); + node = node.mid; + } else { + if (!node.mid) { + if (allowValue) { + return node.value; + } else { + return void 0; + } + } else { + return this._entries(node.mid); + } + } + } + return void 0; + } + forEach(callback) { + for (const [key, value] of this) { + callback(value, key); + } + } + *[Symbol.iterator]() { + yield* __yieldStar(this._entries(this._root)); + } + _entries(node) { + const result = []; + this._dfsEntries(node, result); + return result[Symbol.iterator](); + } + _dfsEntries(node, bucket) { + if (!node) { + return; + } + if (node.left) { + this._dfsEntries(node.left, bucket); + } + if (node.value) { + bucket.push([node.key, node.value]); + } + if (node.mid) { + this._dfsEntries(node.mid, bucket); + } + if (node.right) { + this._dfsEntries(node.right, bucket); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/workspace/common/workspace.js +function isSingleFolderWorkspaceIdentifier(obj) { + const singleFolderIdentifier = obj; + return typeof (singleFolderIdentifier === null || singleFolderIdentifier === void 0 ? void 0 : singleFolderIdentifier.id) === "string" && URI.isUri(singleFolderIdentifier.uri); +} +function isEmptyWorkspaceIdentifier(obj) { + const emptyWorkspaceIdentifier = obj; + return typeof (emptyWorkspaceIdentifier === null || emptyWorkspaceIdentifier === void 0 ? void 0 : emptyWorkspaceIdentifier.id) === "string" && !isSingleFolderWorkspaceIdentifier(obj) && !isWorkspaceIdentifier(obj); +} +function toWorkspaceIdentifier(arg0, isExtensionDevelopment) { + if (typeof arg0 === "string" || typeof arg0 === "undefined") { + if (typeof arg0 === "string") { + return { + id: basename(arg0) + }; + } + if (isExtensionDevelopment) { + return EXTENSION_DEVELOPMENT_EMPTY_WINDOW_WORKSPACE; + } + return UNKNOWN_EMPTY_WINDOW_WORKSPACE; + } + const workspace = arg0; + if (workspace.configuration) { + return { + id: workspace.id, + configPath: workspace.configuration + }; + } + if (workspace.folders.length === 1) { + return { + id: workspace.id, + uri: workspace.folders[0].uri + }; + } + return { + id: workspace.id + }; +} +function isWorkspaceIdentifier(obj) { + const workspaceIdentifier = obj; + return typeof (workspaceIdentifier === null || workspaceIdentifier === void 0 ? void 0 : workspaceIdentifier.id) === "string" && URI.isUri(workspaceIdentifier.configPath); +} +function isStandaloneEditorWorkspace(workspace) { + return workspace.id === STANDALONE_EDITOR_WORKSPACE_ID; +} +var IWorkspaceContextService, EXTENSION_DEVELOPMENT_EMPTY_WINDOW_WORKSPACE, UNKNOWN_EMPTY_WINDOW_WORKSPACE, WorkspaceFolder, WORKSPACE_EXTENSION, WORKSPACE_FILTER, STANDALONE_EDITOR_WORKSPACE_ID; +var init_workspace = __esm({ + "node_modules/monaco-editor/esm/vs/platform/workspace/common/workspace.js"() { + init_nls(); + init_path(); + init_ternarySearchTree(); + init_uri(); + init_instantiation(); + IWorkspaceContextService = createDecorator("contextService"); + EXTENSION_DEVELOPMENT_EMPTY_WINDOW_WORKSPACE = { id: "ext-dev" }; + UNKNOWN_EMPTY_WINDOW_WORKSPACE = { id: "empty-window" }; + WorkspaceFolder = class { + constructor(data, raw) { + this.raw = raw; + this.uri = data.uri; + this.index = data.index; + this.name = data.name; + } + toJSON() { + return { uri: this.uri, name: this.name, index: this.index }; + } + }; + WORKSPACE_EXTENSION = "code-workspace"; + WORKSPACE_FILTER = [{ name: localize("codeWorkspace", "Code Workspace"), extensions: [WORKSPACE_EXTENSION] }]; + STANDALONE_EDITOR_WORKSPACE_ID = "4064f6ec-cb38-4ad0-af64-ee6467e63c82"; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/standaloneStrings.js +var InspectTokensNLS, GoToLineNLS, QuickHelpNLS, QuickCommandNLS, QuickOutlineNLS, StandaloneCodeEditorNLS, ToggleHighContrastNLS, StandaloneServicesNLS; +var init_standaloneStrings = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/standaloneStrings.js"() { + init_nls(); + (function(InspectTokensNLS2) { + InspectTokensNLS2.inspectTokensAction = localize("inspectTokens", "Developer: Inspect Tokens"); + })(InspectTokensNLS || (InspectTokensNLS = {})); + (function(GoToLineNLS2) { + GoToLineNLS2.gotoLineActionLabel = localize("gotoLineActionLabel", "Go to Line/Column..."); + })(GoToLineNLS || (GoToLineNLS = {})); + (function(QuickHelpNLS2) { + QuickHelpNLS2.helpQuickAccessActionLabel = localize("helpQuickAccess", "Show all Quick Access Providers"); + })(QuickHelpNLS || (QuickHelpNLS = {})); + (function(QuickCommandNLS2) { + QuickCommandNLS2.quickCommandActionLabel = localize("quickCommandActionLabel", "Command Palette"); + QuickCommandNLS2.quickCommandHelp = localize("quickCommandActionHelp", "Show And Run Commands"); + })(QuickCommandNLS || (QuickCommandNLS = {})); + (function(QuickOutlineNLS2) { + QuickOutlineNLS2.quickOutlineActionLabel = localize("quickOutlineActionLabel", "Go to Symbol..."); + QuickOutlineNLS2.quickOutlineByCategoryActionLabel = localize("quickOutlineByCategoryActionLabel", "Go to Symbol by Category..."); + })(QuickOutlineNLS || (QuickOutlineNLS = {})); + (function(StandaloneCodeEditorNLS2) { + StandaloneCodeEditorNLS2.editorViewAccessibleLabel = localize("editorViewAccessibleLabel", "Editor content"); + StandaloneCodeEditorNLS2.accessibilityHelpMessage = localize("accessibilityHelpMessage", "Press Alt+F1 for Accessibility Options."); + })(StandaloneCodeEditorNLS || (StandaloneCodeEditorNLS = {})); + (function(ToggleHighContrastNLS2) { + ToggleHighContrastNLS2.toggleHighContrast = localize("toggleHighContrast", "Toggle High Contrast Theme"); + })(ToggleHighContrastNLS || (ToggleHighContrastNLS = {})); + (function(StandaloneServicesNLS2) { + StandaloneServicesNLS2.bulkEditServiceSummary = localize("bulkEditServiceSummary", "Made {0} edits in {1} files"); + })(StandaloneServicesNLS || (StandaloneServicesNLS = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/workspace/common/workspaceTrust.js +var IWorkspaceTrustManagementService; +var init_workspaceTrust = __esm({ + "node_modules/monaco-editor/esm/vs/platform/workspace/common/workspaceTrust.js"() { + init_instantiation(); + IWorkspaceTrustManagementService = createDecorator("workspaceTrustManagementService"); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/languagesAssociations.js +function registerPlatformLanguageAssociation(association, warnOnOverwrite = false) { + _registerLanguageAssociation(association, false, warnOnOverwrite); +} +function _registerLanguageAssociation(association, userConfigured, warnOnOverwrite) { + const associationItem = toLanguageAssociationItem(association, userConfigured); + registeredAssociations.push(associationItem); + if (!associationItem.userConfigured) { + nonUserRegisteredAssociations.push(associationItem); + } else { + userRegisteredAssociations.push(associationItem); + } + if (warnOnOverwrite && !associationItem.userConfigured) { + registeredAssociations.forEach((a3) => { + if (a3.mime === associationItem.mime || a3.userConfigured) { + return; + } + if (associationItem.extension && a3.extension === associationItem.extension) { + console.warn(`Overwriting extension <<${associationItem.extension}>> to now point to mime <<${associationItem.mime}>>`); + } + if (associationItem.filename && a3.filename === associationItem.filename) { + console.warn(`Overwriting filename <<${associationItem.filename}>> to now point to mime <<${associationItem.mime}>>`); + } + if (associationItem.filepattern && a3.filepattern === associationItem.filepattern) { + console.warn(`Overwriting filepattern <<${associationItem.filepattern}>> to now point to mime <<${associationItem.mime}>>`); + } + if (associationItem.firstline && a3.firstline === associationItem.firstline) { + console.warn(`Overwriting firstline <<${associationItem.firstline}>> to now point to mime <<${associationItem.mime}>>`); + } + }); + } +} +function toLanguageAssociationItem(association, userConfigured) { + return { + id: association.id, + mime: association.mime, + filename: association.filename, + extension: association.extension, + filepattern: association.filepattern, + firstline: association.firstline, + userConfigured, + filenameLowercase: association.filename ? association.filename.toLowerCase() : void 0, + extensionLowercase: association.extension ? association.extension.toLowerCase() : void 0, + filepatternLowercase: association.filepattern ? parse(association.filepattern.toLowerCase()) : void 0, + filepatternOnPath: association.filepattern ? association.filepattern.indexOf(posix.sep) >= 0 : false + }; +} +function clearPlatformLanguageAssociations() { + registeredAssociations = registeredAssociations.filter((a3) => a3.userConfigured); + nonUserRegisteredAssociations = []; +} +function getLanguageIds(resource, firstLine) { + return getAssociations(resource, firstLine).map((item) => item.id); +} +function getAssociations(resource, firstLine) { + let path; + if (resource) { + switch (resource.scheme) { + case Schemas.file: + path = resource.fsPath; + break; + case Schemas.data: { + const metadata = DataUri.parseMetaData(resource); + path = metadata.get(DataUri.META_DATA_LABEL); + break; + } + case Schemas.vscodeNotebookCell: + path = void 0; + break; + default: + path = resource.path; + } + } + if (!path) { + return [{ id: "unknown", mime: Mimes.unknown }]; + } + path = path.toLowerCase(); + const filename = basename(path); + const configuredLanguage = getAssociationByPath(path, filename, userRegisteredAssociations); + if (configuredLanguage) { + return [configuredLanguage, { id: PLAINTEXT_LANGUAGE_ID, mime: Mimes.text }]; + } + const registeredLanguage = getAssociationByPath(path, filename, nonUserRegisteredAssociations); + if (registeredLanguage) { + return [registeredLanguage, { id: PLAINTEXT_LANGUAGE_ID, mime: Mimes.text }]; + } + if (firstLine) { + const firstlineLanguage = getAssociationByFirstline(firstLine); + if (firstlineLanguage) { + return [firstlineLanguage, { id: PLAINTEXT_LANGUAGE_ID, mime: Mimes.text }]; + } + } + return [{ id: "unknown", mime: Mimes.unknown }]; +} +function getAssociationByPath(path, filename, associations) { + var _a10; + let filenameMatch = void 0; + let patternMatch = void 0; + let extensionMatch = void 0; + for (let i = associations.length - 1; i >= 0; i--) { + const association = associations[i]; + if (filename === association.filenameLowercase) { + filenameMatch = association; + break; + } + if (association.filepattern) { + if (!patternMatch || association.filepattern.length > patternMatch.filepattern.length) { + const target = association.filepatternOnPath ? path : filename; + if ((_a10 = association.filepatternLowercase) === null || _a10 === void 0 ? void 0 : _a10.call(association, target)) { + patternMatch = association; + } + } + } + if (association.extension) { + if (!extensionMatch || association.extension.length > extensionMatch.extension.length) { + if (filename.endsWith(association.extensionLowercase)) { + extensionMatch = association; + } + } + } + } + if (filenameMatch) { + return filenameMatch; + } + if (patternMatch) { + return patternMatch; + } + if (extensionMatch) { + return extensionMatch; + } + return void 0; +} +function getAssociationByFirstline(firstLine) { + if (startsWithUTF8BOM(firstLine)) { + firstLine = firstLine.substr(1); + } + if (firstLine.length > 0) { + for (let i = registeredAssociations.length - 1; i >= 0; i--) { + const association = registeredAssociations[i]; + if (!association.firstline) { + continue; + } + const matches2 = firstLine.match(association.firstline); + if (matches2 && matches2.length > 0) { + return association; + } + } + } + return void 0; +} +var registeredAssociations, nonUserRegisteredAssociations, userRegisteredAssociations; +var init_languagesAssociations = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/languagesAssociations.js"() { + init_glob(); + init_mime(); + init_network(); + init_path(); + init_resources(); + init_strings(); + init_modesRegistry(); + registeredAssociations = []; + nonUserRegisteredAssociations = []; + userRegisteredAssociations = []; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/languagesRegistry.js +var hasOwnProperty2, NULL_LANGUAGE_ID, LanguageIdCodec, LanguagesRegistry; +var init_languagesRegistry = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/languagesRegistry.js"() { + init_event(); + init_lifecycle(); + init_strings(); + init_languagesAssociations(); + init_modesRegistry(); + init_configurationRegistry(); + init_platform2(); + hasOwnProperty2 = Object.prototype.hasOwnProperty; + NULL_LANGUAGE_ID = "vs.editor.nullLanguage"; + LanguageIdCodec = class { + constructor() { + this._languageIdToLanguage = []; + this._languageToLanguageId = /* @__PURE__ */ new Map(); + this._register( + NULL_LANGUAGE_ID, + 0 + /* LanguageId.Null */ + ); + this._register( + PLAINTEXT_LANGUAGE_ID, + 1 + /* LanguageId.PlainText */ + ); + this._nextLanguageId = 2; + } + _register(language82, languageId) { + this._languageIdToLanguage[languageId] = language82; + this._languageToLanguageId.set(language82, languageId); + } + register(language82) { + if (this._languageToLanguageId.has(language82)) { + return; + } + const languageId = this._nextLanguageId++; + this._register(language82, languageId); + } + encodeLanguageId(languageId) { + return this._languageToLanguageId.get(languageId) || 0; + } + decodeLanguageId(languageId) { + return this._languageIdToLanguage[languageId] || NULL_LANGUAGE_ID; + } + }; + LanguagesRegistry = class _LanguagesRegistry extends Disposable { + constructor(useModesRegistry = true, warnOnOverwrite = false) { + super(); + this._onDidChange = this._register(new Emitter()); + this.onDidChange = this._onDidChange.event; + _LanguagesRegistry.instanceCount++; + this._warnOnOverwrite = warnOnOverwrite; + this.languageIdCodec = new LanguageIdCodec(); + this._dynamicLanguages = []; + this._languages = {}; + this._mimeTypesMap = {}; + this._nameMap = {}; + this._lowercaseNameMap = {}; + if (useModesRegistry) { + this._initializeFromRegistry(); + this._register(ModesRegistry.onDidChangeLanguages((m) => { + this._initializeFromRegistry(); + })); + } + } + dispose() { + _LanguagesRegistry.instanceCount--; + super.dispose(); + } + _initializeFromRegistry() { + this._languages = {}; + this._mimeTypesMap = {}; + this._nameMap = {}; + this._lowercaseNameMap = {}; + clearPlatformLanguageAssociations(); + const desc = [].concat(ModesRegistry.getLanguages()).concat(this._dynamicLanguages); + this._registerLanguages(desc); + } + _registerLanguages(desc) { + for (const d of desc) { + this._registerLanguage(d); + } + this._mimeTypesMap = {}; + this._nameMap = {}; + this._lowercaseNameMap = {}; + Object.keys(this._languages).forEach((langId) => { + const language82 = this._languages[langId]; + if (language82.name) { + this._nameMap[language82.name] = language82.identifier; + } + language82.aliases.forEach((alias) => { + this._lowercaseNameMap[alias.toLowerCase()] = language82.identifier; + }); + language82.mimetypes.forEach((mimetype) => { + this._mimeTypesMap[mimetype] = language82.identifier; + }); + }); + Registry.as(Extensions4.Configuration).registerOverrideIdentifiers(this.getRegisteredLanguageIds()); + this._onDidChange.fire(); + } + _registerLanguage(lang) { + const langId = lang.id; + let resolvedLanguage; + if (hasOwnProperty2.call(this._languages, langId)) { + resolvedLanguage = this._languages[langId]; + } else { + this.languageIdCodec.register(langId); + resolvedLanguage = { + identifier: langId, + name: null, + mimetypes: [], + aliases: [], + extensions: [], + filenames: [], + configurationFiles: [], + icons: [] + }; + this._languages[langId] = resolvedLanguage; + } + this._mergeLanguage(resolvedLanguage, lang); + } + _mergeLanguage(resolvedLanguage, lang) { + const langId = lang.id; + let primaryMime = null; + if (Array.isArray(lang.mimetypes) && lang.mimetypes.length > 0) { + resolvedLanguage.mimetypes.push(...lang.mimetypes); + primaryMime = lang.mimetypes[0]; + } + if (!primaryMime) { + primaryMime = `text/x-${langId}`; + resolvedLanguage.mimetypes.push(primaryMime); + } + if (Array.isArray(lang.extensions)) { + if (lang.configuration) { + resolvedLanguage.extensions = lang.extensions.concat(resolvedLanguage.extensions); + } else { + resolvedLanguage.extensions = resolvedLanguage.extensions.concat(lang.extensions); + } + for (const extension of lang.extensions) { + registerPlatformLanguageAssociation({ id: langId, mime: primaryMime, extension }, this._warnOnOverwrite); + } + } + if (Array.isArray(lang.filenames)) { + for (const filename of lang.filenames) { + registerPlatformLanguageAssociation({ id: langId, mime: primaryMime, filename }, this._warnOnOverwrite); + resolvedLanguage.filenames.push(filename); + } + } + if (Array.isArray(lang.filenamePatterns)) { + for (const filenamePattern of lang.filenamePatterns) { + registerPlatformLanguageAssociation({ id: langId, mime: primaryMime, filepattern: filenamePattern }, this._warnOnOverwrite); + } + } + if (typeof lang.firstLine === "string" && lang.firstLine.length > 0) { + let firstLineRegexStr = lang.firstLine; + if (firstLineRegexStr.charAt(0) !== "^") { + firstLineRegexStr = "^" + firstLineRegexStr; + } + try { + const firstLineRegex = new RegExp(firstLineRegexStr); + if (!regExpLeadsToEndlessLoop(firstLineRegex)) { + registerPlatformLanguageAssociation({ id: langId, mime: primaryMime, firstline: firstLineRegex }, this._warnOnOverwrite); + } + } catch (err) { + console.warn(`[${lang.id}]: Invalid regular expression \`${firstLineRegexStr}\`: `, err); + } + } + resolvedLanguage.aliases.push(langId); + let langAliases = null; + if (typeof lang.aliases !== "undefined" && Array.isArray(lang.aliases)) { + if (lang.aliases.length === 0) { + langAliases = [null]; + } else { + langAliases = lang.aliases; + } + } + if (langAliases !== null) { + for (const langAlias of langAliases) { + if (!langAlias || langAlias.length === 0) { + continue; + } + resolvedLanguage.aliases.push(langAlias); + } + } + const containsAliases = langAliases !== null && langAliases.length > 0; + if (containsAliases && langAliases[0] === null) { + } else { + const bestName = (containsAliases ? langAliases[0] : null) || langId; + if (containsAliases || !resolvedLanguage.name) { + resolvedLanguage.name = bestName; + } + } + if (lang.configuration) { + resolvedLanguage.configurationFiles.push(lang.configuration); + } + if (lang.icon) { + resolvedLanguage.icons.push(lang.icon); + } + } + isRegisteredLanguageId(languageId) { + if (!languageId) { + return false; + } + return hasOwnProperty2.call(this._languages, languageId); + } + getRegisteredLanguageIds() { + return Object.keys(this._languages); + } + getLanguageIdByLanguageName(languageName) { + const languageNameLower = languageName.toLowerCase(); + if (!hasOwnProperty2.call(this._lowercaseNameMap, languageNameLower)) { + return null; + } + return this._lowercaseNameMap[languageNameLower]; + } + getLanguageIdByMimeType(mimeType) { + if (!mimeType) { + return null; + } + if (hasOwnProperty2.call(this._mimeTypesMap, mimeType)) { + return this._mimeTypesMap[mimeType]; + } + return null; + } + guessLanguageIdByFilepathOrFirstLine(resource, firstLine) { + if (!resource && !firstLine) { + return []; + } + return getLanguageIds(resource, firstLine); + } + }; + LanguagesRegistry.instanceCount = 0; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/languageService.js +var LanguageService, LanguageSelection; +var init_languageService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/languageService.js"() { + init_event(); + init_lifecycle(); + init_languagesRegistry(); + init_arrays(); + init_languages(); + init_modesRegistry(); + LanguageService = class _LanguageService extends Disposable { + constructor(warnOnOverwrite = false) { + super(); + this._onDidRequestBasicLanguageFeatures = this._register(new Emitter()); + this.onDidRequestBasicLanguageFeatures = this._onDidRequestBasicLanguageFeatures.event; + this._onDidRequestRichLanguageFeatures = this._register(new Emitter()); + this.onDidRequestRichLanguageFeatures = this._onDidRequestRichLanguageFeatures.event; + this._onDidChange = this._register(new Emitter({ + leakWarningThreshold: 200 + /* https://github.com/microsoft/vscode/issues/119968 */ + })); + this.onDidChange = this._onDidChange.event; + this._requestedBasicLanguages = /* @__PURE__ */ new Set(); + this._requestedRichLanguages = /* @__PURE__ */ new Set(); + _LanguageService.instanceCount++; + this._registry = this._register(new LanguagesRegistry(true, warnOnOverwrite)); + this.languageIdCodec = this._registry.languageIdCodec; + this._register(this._registry.onDidChange(() => this._onDidChange.fire())); + } + dispose() { + _LanguageService.instanceCount--; + super.dispose(); + } + isRegisteredLanguageId(languageId) { + return this._registry.isRegisteredLanguageId(languageId); + } + getLanguageIdByLanguageName(languageName) { + return this._registry.getLanguageIdByLanguageName(languageName); + } + getLanguageIdByMimeType(mimeType) { + return this._registry.getLanguageIdByMimeType(mimeType); + } + guessLanguageIdByFilepathOrFirstLine(resource, firstLine) { + const languageIds = this._registry.guessLanguageIdByFilepathOrFirstLine(resource, firstLine); + return firstOrDefault(languageIds, null); + } + createById(languageId) { + return new LanguageSelection(this.onDidChange, () => { + return this._createAndGetLanguageIdentifier(languageId); + }); + } + createByFilepathOrFirstLine(resource, firstLine) { + return new LanguageSelection(this.onDidChange, () => { + const languageId = this.guessLanguageIdByFilepathOrFirstLine(resource, firstLine); + return this._createAndGetLanguageIdentifier(languageId); + }); + } + _createAndGetLanguageIdentifier(languageId) { + if (!languageId || !this.isRegisteredLanguageId(languageId)) { + languageId = PLAINTEXT_LANGUAGE_ID; + } + return languageId; + } + requestBasicLanguageFeatures(languageId) { + if (!this._requestedBasicLanguages.has(languageId)) { + this._requestedBasicLanguages.add(languageId); + this._onDidRequestBasicLanguageFeatures.fire(languageId); + } + } + requestRichLanguageFeatures(languageId) { + if (!this._requestedRichLanguages.has(languageId)) { + this._requestedRichLanguages.add(languageId); + this.requestBasicLanguageFeatures(languageId); + TokenizationRegistry2.getOrCreate(languageId); + this._onDidRequestRichLanguageFeatures.fire(languageId); + } + } + }; + LanguageService.instanceCount = 0; + LanguageSelection = class { + constructor(_onDidChangeLanguages, _selector) { + this._onDidChangeLanguages = _onDidChangeLanguages; + this._selector = _selector; + this._listener = null; + this._emitter = null; + this.languageId = this._selector(); + } + _dispose() { + if (this._listener) { + this._listener.dispose(); + this._listener = null; + } + if (this._emitter) { + this._emitter.dispose(); + this._emitter = null; + } + } + get onDidChange() { + if (!this._listener) { + this._listener = this._onDidChangeLanguages(() => this._evaluate()); + } + if (!this._emitter) { + this._emitter = new Emitter({ + onDidRemoveLastListener: () => { + this._dispose(); + } + }); + } + return this._emitter.event; + } + _evaluate() { + var _a10; + const languageId = this._selector(); + if (languageId === this.languageId) { + return; + } + this.languageId = languageId; + (_a10 = this._emitter) === null || _a10 === void 0 ? void 0 : _a10.fire(this.languageId); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/dnd.js +var DataTransfers; +var init_dnd = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/dnd.js"() { + init_mime(); + DataTransfers = { + /** + * Application specific resource transfer type + */ + RESOURCES: "ResourceURLs", + /** + * Browser specific transfer type to download + */ + DOWNLOAD_URL: "DownloadURL", + /** + * Browser specific transfer type for files + */ + FILES: "Files", + /** + * Typically transfer type for copy/paste transfers. + */ + TEXT: Mimes.text, + /** + * Internal type used to pass around text/uri-list data. + * + * This is needed to work around https://bugs.chromium.org/p/chromium/issues/detail?id=239745. + */ + INTERNAL_URI_LIST: "application/vnd.code.uri-list" + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/hover/hoverDelegateFactory.js +function setHoverDelegateFactory(hoverDelegateProvider) { + hoverDelegateFactory = hoverDelegateProvider; +} +function getDefaultHoverDelegate(placement) { + if (placement === "element") { + return defaultHoverDelegateElement.value; + } + return defaultHoverDelegateMouse.value; +} +function createInstantHoverDelegate() { + return hoverDelegateFactory("element", true); +} +var nullHoverDelegateFactory, hoverDelegateFactory, defaultHoverDelegateMouse, defaultHoverDelegateElement; +var init_hoverDelegateFactory = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/hover/hoverDelegateFactory.js"() { + init_lazy(); + nullHoverDelegateFactory = () => ({ + get delay() { + return -1; + }, + dispose: () => { + }, + showHover: () => { + return void 0; + } + }); + hoverDelegateFactory = nullHoverDelegateFactory; + defaultHoverDelegateMouse = new Lazy(() => hoverDelegateFactory("mouse", false)); + defaultHoverDelegateElement = new Lazy(() => hoverDelegateFactory("element", false)); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/hover/hoverDelegate2.js +function setBaseLayerHoverDelegate(hoverDelegate) { + baseHoverDelegate = hoverDelegate; +} +function getBaseLayerHoverDelegate() { + return baseHoverDelegate; +} +var baseHoverDelegate; +var init_hoverDelegate2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/hover/hoverDelegate2.js"() { + baseHoverDelegate = { + showHover: () => void 0, + hideHover: () => void 0, + showAndFocusLastHover: () => void 0, + setupUpdatableHover: () => null, + triggerUpdatableHover: () => void 0 + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/list/splice.js +var CombinedSpliceable; +var init_splice = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/list/splice.js"() { + CombinedSpliceable = class { + constructor(spliceables) { + this.spliceables = spliceables; + } + splice(start, deleteCount, elements) { + this.spliceables.forEach((s) => s.splice(start, deleteCount, elements)); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/list/list.css +var init_list = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/list/list.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/list/list.js +var ListError; +var init_list2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/list/list.js"() { + ListError = class extends Error { + constructor(user, message) { + super(`ListError [${user}] ${message}`); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/list/rangeMap.js +function groupIntersect(range2, groups) { + const result = []; + for (const r of groups) { + if (range2.start >= r.range.end) { + continue; + } + if (range2.end < r.range.start) { + break; + } + const intersection2 = Range2.intersect(range2, r.range); + if (Range2.isEmpty(intersection2)) { + continue; + } + result.push({ + range: intersection2, + size: r.size + }); + } + return result; +} +function shift({ start, end }, much) { + return { start: start + much, end: end + much }; +} +function consolidate(groups) { + const result = []; + let previousGroup = null; + for (const group of groups) { + const start = group.range.start; + const end = group.range.end; + const size2 = group.size; + if (previousGroup && size2 === previousGroup.size) { + previousGroup.range.end = end; + continue; + } + previousGroup = { range: { start, end }, size: size2 }; + result.push(previousGroup); + } + return result; +} +function concat2(...groups) { + return consolidate(groups.reduce((r, g) => r.concat(g), [])); +} +var RangeMap; +var init_rangeMap = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/list/rangeMap.js"() { + init_range2(); + RangeMap = class { + get paddingTop() { + return this._paddingTop; + } + set paddingTop(paddingTop) { + this._size = this._size + paddingTop - this._paddingTop; + this._paddingTop = paddingTop; + } + constructor(topPadding) { + this.groups = []; + this._size = 0; + this._paddingTop = 0; + this._paddingTop = topPadding !== null && topPadding !== void 0 ? topPadding : 0; + this._size = this._paddingTop; + } + splice(index, deleteCount, items = []) { + const diff = items.length - deleteCount; + const before = groupIntersect({ start: 0, end: index }, this.groups); + const after2 = groupIntersect({ start: index + deleteCount, end: Number.POSITIVE_INFINITY }, this.groups).map((g) => ({ range: shift(g.range, diff), size: g.size })); + const middle = items.map((item, i) => ({ + range: { start: index + i, end: index + i + 1 }, + size: item.size + })); + this.groups = concat2(before, middle, after2); + this._size = this._paddingTop + this.groups.reduce((t4, g) => t4 + g.size * (g.range.end - g.range.start), 0); + } + /** + * Returns the number of items in the range map. + */ + get count() { + const len = this.groups.length; + if (!len) { + return 0; + } + return this.groups[len - 1].range.end; + } + /** + * Returns the sum of the sizes of all items in the range map. + */ + get size() { + return this._size; + } + /** + * Returns the index of the item at the given position. + */ + indexAt(position) { + if (position < 0) { + return -1; + } + if (position < this._paddingTop) { + return 0; + } + let index = 0; + let size2 = this._paddingTop; + for (const group of this.groups) { + const count = group.range.end - group.range.start; + const newSize = size2 + count * group.size; + if (position < newSize) { + return index + Math.floor((position - size2) / group.size); + } + index += count; + size2 = newSize; + } + return index; + } + /** + * Returns the index of the item right after the item at the + * index of the given position. + */ + indexAfter(position) { + return Math.min(this.indexAt(position) + 1, this.count); + } + /** + * Returns the start position of the item at the given index. + */ + positionAt(index) { + if (index < 0) { + return -1; + } + let position = 0; + let count = 0; + for (const group of this.groups) { + const groupCount = group.range.end - group.range.start; + const newCount = count + groupCount; + if (index < newCount) { + return this._paddingTop + position + (index - count) * group.size; + } + position += groupCount * group.size; + count = newCount; + } + return -1; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/list/rowCache.js +function removeFromParent(element) { + var _a10; + try { + (_a10 = element.parentElement) === null || _a10 === void 0 ? void 0 : _a10.removeChild(element); + } catch (e) { + } +} +var RowCache; +var init_rowCache = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/list/rowCache.js"() { + init_dom(); + RowCache = class { + constructor(renderers) { + this.renderers = renderers; + this.cache = /* @__PURE__ */ new Map(); + this.transactionNodesPendingRemoval = /* @__PURE__ */ new Set(); + this.inTransaction = false; + } + /** + * Returns a row either by creating a new one or reusing + * a previously released row which shares the same templateId. + * + * @returns A row and `isReusingConnectedDomNode` if the row's node is already in the dom in a stale position. + */ + alloc(templateId) { + let result = this.getTemplateCache(templateId).pop(); + let isStale = false; + if (result) { + isStale = this.transactionNodesPendingRemoval.has(result.domNode); + if (isStale) { + this.transactionNodesPendingRemoval.delete(result.domNode); + } + } else { + const domNode = $(".monaco-list-row"); + const renderer = this.getRenderer(templateId); + const templateData = renderer.renderTemplate(domNode); + result = { domNode, templateId, templateData }; + } + return { row: result, isReusingConnectedDomNode: isStale }; + } + /** + * Releases the row for eventual reuse. + */ + release(row) { + if (!row) { + return; + } + this.releaseRow(row); + } + /** + * Begin a set of changes that use the cache. This lets us skip work when a row is removed and then inserted again. + */ + transact(makeChanges) { + if (this.inTransaction) { + throw new Error("Already in transaction"); + } + this.inTransaction = true; + try { + makeChanges(); + } finally { + for (const domNode of this.transactionNodesPendingRemoval) { + this.doRemoveNode(domNode); + } + this.transactionNodesPendingRemoval.clear(); + this.inTransaction = false; + } + } + releaseRow(row) { + const { domNode, templateId } = row; + if (domNode) { + if (this.inTransaction) { + this.transactionNodesPendingRemoval.add(domNode); + } else { + this.doRemoveNode(domNode); + } + } + const cache = this.getTemplateCache(templateId); + cache.push(row); + } + doRemoveNode(domNode) { + domNode.classList.remove("scrolling"); + removeFromParent(domNode); + } + getTemplateCache(templateId) { + let result = this.cache.get(templateId); + if (!result) { + result = []; + this.cache.set(templateId, result); + } + return result; + } + dispose() { + this.cache.forEach((cachedRows, templateId) => { + for (const cachedRow of cachedRows) { + const renderer = this.getRenderer(templateId); + renderer.disposeTemplate(cachedRow.templateData); + cachedRow.templateData = null; + } + }); + this.cache.clear(); + this.transactionNodesPendingRemoval.clear(); + } + getRenderer(templateId) { + const renderer = this.renderers.get(templateId); + if (!renderer) { + throw new Error(`No renderer found for ${templateId}`); + } + return renderer; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/list/listView.js +function equalsDragFeedback(f1, f22) { + if (Array.isArray(f1) && Array.isArray(f22)) { + return equals(f1, f22); + } + return f1 === f22; +} +var __decorate26, StaticDND, DefaultOptions, ElementsDragAndDropData, ExternalElementsDragAndDropData, NativeDragAndDropData, ListViewAccessibilityProvider, ListView; +var init_listView = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/list/listView.js"() { + init_dnd(); + init_dom(); + init_event2(); + init_touch(); + init_scrollableElement(); + init_arrays(); + init_async(); + init_decorators(); + init_event(); + init_lifecycle(); + init_range2(); + init_scrollable(); + init_rangeMap(); + init_rowCache(); + init_errors(); + init_numbers(); + __decorate26 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + StaticDND = { + CurrentDragAndDropData: void 0 + }; + DefaultOptions = { + useShadows: true, + verticalScrollMode: 1, + setRowLineHeight: true, + setRowHeight: true, + supportDynamicHeights: false, + dnd: { + getDragElements(e) { + return [e]; + }, + getDragURI() { + return null; + }, + onDragStart() { + }, + onDragOver() { + return false; + }, + drop() { + }, + dispose() { + } + }, + horizontalScrolling: false, + transformOptimization: true, + alwaysConsumeMouseWheel: true + }; + ElementsDragAndDropData = class { + constructor(elements) { + this.elements = elements; + } + update() { + } + getData() { + return this.elements; + } + }; + ExternalElementsDragAndDropData = class { + constructor(elements) { + this.elements = elements; + } + update() { + } + getData() { + return this.elements; + } + }; + NativeDragAndDropData = class { + constructor() { + this.types = []; + this.files = []; + } + update(dataTransfer) { + if (dataTransfer.types) { + this.types.splice(0, this.types.length, ...dataTransfer.types); + } + if (dataTransfer.files) { + this.files.splice(0, this.files.length); + for (let i = 0; i < dataTransfer.files.length; i++) { + const file = dataTransfer.files.item(i); + if (file && (file.size || file.type)) { + this.files.push(file); + } + } + } + } + getData() { + return { + types: this.types, + files: this.files + }; + } + }; + ListViewAccessibilityProvider = class { + constructor(accessibilityProvider) { + if (accessibilityProvider === null || accessibilityProvider === void 0 ? void 0 : accessibilityProvider.getSetSize) { + this.getSetSize = accessibilityProvider.getSetSize.bind(accessibilityProvider); + } else { + this.getSetSize = (e, i, l) => l; + } + if (accessibilityProvider === null || accessibilityProvider === void 0 ? void 0 : accessibilityProvider.getPosInSet) { + this.getPosInSet = accessibilityProvider.getPosInSet.bind(accessibilityProvider); + } else { + this.getPosInSet = (e, i) => i + 1; + } + if (accessibilityProvider === null || accessibilityProvider === void 0 ? void 0 : accessibilityProvider.getRole) { + this.getRole = accessibilityProvider.getRole.bind(accessibilityProvider); + } else { + this.getRole = (_) => "listitem"; + } + if (accessibilityProvider === null || accessibilityProvider === void 0 ? void 0 : accessibilityProvider.isChecked) { + this.isChecked = accessibilityProvider.isChecked.bind(accessibilityProvider); + } else { + this.isChecked = (_) => void 0; + } + } + }; + ListView = class _ListView { + get contentHeight() { + return this.rangeMap.size; + } + get onDidScroll() { + return this.scrollableElement.onScroll; + } + get scrollableElementDomNode() { + return this.scrollableElement.getDomNode(); + } + get horizontalScrolling() { + return this._horizontalScrolling; + } + set horizontalScrolling(value) { + if (value === this._horizontalScrolling) { + return; + } + if (value && this.supportDynamicHeights) { + throw new Error("Horizontal scrolling and dynamic heights not supported simultaneously"); + } + this._horizontalScrolling = value; + this.domNode.classList.toggle("horizontal-scrolling", this._horizontalScrolling); + if (this._horizontalScrolling) { + for (const item of this.items) { + this.measureItemWidth(item); + } + this.updateScrollWidth(); + this.scrollableElement.setScrollDimensions({ width: getContentWidth(this.domNode) }); + this.rowsContainer.style.width = `${Math.max(this.scrollWidth || 0, this.renderWidth)}px`; + } else { + this.scrollableElementWidthDelayer.cancel(); + this.scrollableElement.setScrollDimensions({ width: this.renderWidth, scrollWidth: this.renderWidth }); + this.rowsContainer.style.width = ""; + } + } + constructor(container, virtualDelegate, renderers, options2 = DefaultOptions) { + var _a10, _b4, _c2, _d2, _e2, _f3, _g2, _h2, _j, _k, _l, _m, _o; + this.virtualDelegate = virtualDelegate; + this.domId = `list_id_${++_ListView.InstanceCount}`; + this.renderers = /* @__PURE__ */ new Map(); + this.renderWidth = 0; + this._scrollHeight = 0; + this.scrollableElementUpdateDisposable = null; + this.scrollableElementWidthDelayer = new Delayer(50); + this.splicing = false; + this.dragOverAnimationStopDisposable = Disposable.None; + this.dragOverMouseY = 0; + this.canDrop = false; + this.currentDragFeedbackDisposable = Disposable.None; + this.onDragLeaveTimeout = Disposable.None; + this.disposables = new DisposableStore(); + this._onDidChangeContentHeight = new Emitter(); + this._onDidChangeContentWidth = new Emitter(); + this.onDidChangeContentHeight = Event.latch(this._onDidChangeContentHeight.event, void 0, this.disposables); + this._horizontalScrolling = false; + if (options2.horizontalScrolling && options2.supportDynamicHeights) { + throw new Error("Horizontal scrolling and dynamic heights not supported simultaneously"); + } + this.items = []; + this.itemId = 0; + this.rangeMap = this.createRangeMap((_a10 = options2.paddingTop) !== null && _a10 !== void 0 ? _a10 : 0); + for (const renderer of renderers) { + this.renderers.set(renderer.templateId, renderer); + } + this.cache = this.disposables.add(new RowCache(this.renderers)); + this.lastRenderTop = 0; + this.lastRenderHeight = 0; + this.domNode = document.createElement("div"); + this.domNode.className = "monaco-list"; + this.domNode.classList.add(this.domId); + this.domNode.tabIndex = 0; + this.domNode.classList.toggle("mouse-support", typeof options2.mouseSupport === "boolean" ? options2.mouseSupport : true); + this._horizontalScrolling = (_b4 = options2.horizontalScrolling) !== null && _b4 !== void 0 ? _b4 : DefaultOptions.horizontalScrolling; + this.domNode.classList.toggle("horizontal-scrolling", this._horizontalScrolling); + this.paddingBottom = typeof options2.paddingBottom === "undefined" ? 0 : options2.paddingBottom; + this.accessibilityProvider = new ListViewAccessibilityProvider(options2.accessibilityProvider); + this.rowsContainer = document.createElement("div"); + this.rowsContainer.className = "monaco-list-rows"; + const transformOptimization = (_c2 = options2.transformOptimization) !== null && _c2 !== void 0 ? _c2 : DefaultOptions.transformOptimization; + if (transformOptimization) { + this.rowsContainer.style.transform = "translate3d(0px, 0px, 0px)"; + this.rowsContainer.style.overflow = "hidden"; + this.rowsContainer.style.contain = "strict"; + } + this.disposables.add(Gesture.addTarget(this.rowsContainer)); + this.scrollable = this.disposables.add(new Scrollable({ + forceIntegerValues: true, + smoothScrollDuration: ((_d2 = options2.smoothScrolling) !== null && _d2 !== void 0 ? _d2 : false) ? 125 : 0, + scheduleAtNextAnimationFrame: (cb) => scheduleAtNextAnimationFrame(getWindow(this.domNode), cb) + })); + this.scrollableElement = this.disposables.add(new SmoothScrollableElement(this.rowsContainer, { + alwaysConsumeMouseWheel: (_e2 = options2.alwaysConsumeMouseWheel) !== null && _e2 !== void 0 ? _e2 : DefaultOptions.alwaysConsumeMouseWheel, + horizontal: 1, + vertical: (_f3 = options2.verticalScrollMode) !== null && _f3 !== void 0 ? _f3 : DefaultOptions.verticalScrollMode, + useShadows: (_g2 = options2.useShadows) !== null && _g2 !== void 0 ? _g2 : DefaultOptions.useShadows, + mouseWheelScrollSensitivity: options2.mouseWheelScrollSensitivity, + fastScrollSensitivity: options2.fastScrollSensitivity, + scrollByPage: options2.scrollByPage + }, this.scrollable)); + this.domNode.appendChild(this.scrollableElement.getDomNode()); + container.appendChild(this.domNode); + this.scrollableElement.onScroll(this.onScroll, this, this.disposables); + this.disposables.add(addDisposableListener(this.rowsContainer, EventType2.Change, (e) => this.onTouchChange(e))); + this.disposables.add(addDisposableListener(this.scrollableElement.getDomNode(), "scroll", (e) => e.target.scrollTop = 0)); + this.disposables.add(addDisposableListener(this.domNode, "dragover", (e) => this.onDragOver(this.toDragEvent(e)))); + this.disposables.add(addDisposableListener(this.domNode, "drop", (e) => this.onDrop(this.toDragEvent(e)))); + this.disposables.add(addDisposableListener(this.domNode, "dragleave", (e) => this.onDragLeave(this.toDragEvent(e)))); + this.disposables.add(addDisposableListener(this.domNode, "dragend", (e) => this.onDragEnd(e))); + this.setRowLineHeight = (_h2 = options2.setRowLineHeight) !== null && _h2 !== void 0 ? _h2 : DefaultOptions.setRowLineHeight; + this.setRowHeight = (_j = options2.setRowHeight) !== null && _j !== void 0 ? _j : DefaultOptions.setRowHeight; + this.supportDynamicHeights = (_k = options2.supportDynamicHeights) !== null && _k !== void 0 ? _k : DefaultOptions.supportDynamicHeights; + this.dnd = (_l = options2.dnd) !== null && _l !== void 0 ? _l : this.disposables.add(DefaultOptions.dnd); + this.layout((_m = options2.initialSize) === null || _m === void 0 ? void 0 : _m.height, (_o = options2.initialSize) === null || _o === void 0 ? void 0 : _o.width); + } + updateOptions(options2) { + if (options2.paddingBottom !== void 0) { + this.paddingBottom = options2.paddingBottom; + this.scrollableElement.setScrollDimensions({ scrollHeight: this.scrollHeight }); + } + if (options2.smoothScrolling !== void 0) { + this.scrollable.setSmoothScrollDuration(options2.smoothScrolling ? 125 : 0); + } + if (options2.horizontalScrolling !== void 0) { + this.horizontalScrolling = options2.horizontalScrolling; + } + let scrollableOptions; + if (options2.scrollByPage !== void 0) { + scrollableOptions = __spreadProps(__spreadValues({}, scrollableOptions !== null && scrollableOptions !== void 0 ? scrollableOptions : {}), { scrollByPage: options2.scrollByPage }); + } + if (options2.mouseWheelScrollSensitivity !== void 0) { + scrollableOptions = __spreadProps(__spreadValues({}, scrollableOptions !== null && scrollableOptions !== void 0 ? scrollableOptions : {}), { mouseWheelScrollSensitivity: options2.mouseWheelScrollSensitivity }); + } + if (options2.fastScrollSensitivity !== void 0) { + scrollableOptions = __spreadProps(__spreadValues({}, scrollableOptions !== null && scrollableOptions !== void 0 ? scrollableOptions : {}), { fastScrollSensitivity: options2.fastScrollSensitivity }); + } + if (scrollableOptions) { + this.scrollableElement.updateOptions(scrollableOptions); + } + if (options2.paddingTop !== void 0 && options2.paddingTop !== this.rangeMap.paddingTop) { + const lastRenderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight); + const offset = options2.paddingTop - this.rangeMap.paddingTop; + this.rangeMap.paddingTop = options2.paddingTop; + this.render(lastRenderRange, Math.max(0, this.lastRenderTop + offset), this.lastRenderHeight, void 0, void 0, true); + this.setScrollTop(this.lastRenderTop); + this.eventuallyUpdateScrollDimensions(); + if (this.supportDynamicHeights) { + this._rerender(this.lastRenderTop, this.lastRenderHeight); + } + } + } + createRangeMap(paddingTop) { + return new RangeMap(paddingTop); + } + splice(start, deleteCount, elements = []) { + if (this.splicing) { + throw new Error("Can't run recursive splices."); + } + this.splicing = true; + try { + return this._splice(start, deleteCount, elements); + } finally { + this.splicing = false; + this._onDidChangeContentHeight.fire(this.contentHeight); + } + } + _splice(start, deleteCount, elements = []) { + const previousRenderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight); + const deleteRange = { start, end: start + deleteCount }; + const removeRange = Range2.intersect(previousRenderRange, deleteRange); + const rowsToDispose = /* @__PURE__ */ new Map(); + for (let i = removeRange.end - 1; i >= removeRange.start; i--) { + const item = this.items[i]; + item.dragStartDisposable.dispose(); + item.checkedDisposable.dispose(); + if (item.row) { + let rows = rowsToDispose.get(item.templateId); + if (!rows) { + rows = []; + rowsToDispose.set(item.templateId, rows); + } + const renderer = this.renderers.get(item.templateId); + if (renderer && renderer.disposeElement) { + renderer.disposeElement(item.element, i, item.row.templateData, item.size); + } + rows.unshift(item.row); + } + item.row = null; + item.stale = true; + } + const previousRestRange = { start: start + deleteCount, end: this.items.length }; + const previousRenderedRestRange = Range2.intersect(previousRestRange, previousRenderRange); + const previousUnrenderedRestRanges = Range2.relativeComplement(previousRestRange, previousRenderRange); + const inserted = elements.map((element) => ({ + id: String(this.itemId++), + element, + templateId: this.virtualDelegate.getTemplateId(element), + size: this.virtualDelegate.getHeight(element), + width: void 0, + hasDynamicHeight: !!this.virtualDelegate.hasDynamicHeight && this.virtualDelegate.hasDynamicHeight(element), + lastDynamicHeightWidth: void 0, + row: null, + uri: void 0, + dropTarget: false, + dragStartDisposable: Disposable.None, + checkedDisposable: Disposable.None, + stale: false + })); + let deleted; + if (start === 0 && deleteCount >= this.items.length) { + this.rangeMap = this.createRangeMap(this.rangeMap.paddingTop); + this.rangeMap.splice(0, 0, inserted); + deleted = this.items; + this.items = inserted; + } else { + this.rangeMap.splice(start, deleteCount, inserted); + deleted = this.items.splice(start, deleteCount, ...inserted); + } + const delta = elements.length - deleteCount; + const renderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight); + const renderedRestRange = shift(previousRenderedRestRange, delta); + const updateRange = Range2.intersect(renderRange, renderedRestRange); + for (let i = updateRange.start; i < updateRange.end; i++) { + this.updateItemInDOM(this.items[i], i); + } + const removeRanges = Range2.relativeComplement(renderedRestRange, renderRange); + for (const range2 of removeRanges) { + for (let i = range2.start; i < range2.end; i++) { + this.removeItemFromDOM(i); + } + } + const unrenderedRestRanges = previousUnrenderedRestRanges.map((r) => shift(r, delta)); + const elementsRange = { start, end: start + elements.length }; + const insertRanges = [elementsRange, ...unrenderedRestRanges].map((r) => Range2.intersect(renderRange, r)).reverse(); + for (const range2 of insertRanges) { + for (let i = range2.end - 1; i >= range2.start; i--) { + const item = this.items[i]; + const rows = rowsToDispose.get(item.templateId); + const row = rows === null || rows === void 0 ? void 0 : rows.pop(); + this.insertItemInDOM(i, row); + } + } + for (const rows of rowsToDispose.values()) { + for (const row of rows) { + this.cache.release(row); + } + } + this.eventuallyUpdateScrollDimensions(); + if (this.supportDynamicHeights) { + this._rerender(this.scrollTop, this.renderHeight); + } + return deleted.map((i) => i.element); + } + eventuallyUpdateScrollDimensions() { + this._scrollHeight = this.contentHeight; + this.rowsContainer.style.height = `${this._scrollHeight}px`; + if (!this.scrollableElementUpdateDisposable) { + this.scrollableElementUpdateDisposable = scheduleAtNextAnimationFrame(getWindow(this.domNode), () => { + this.scrollableElement.setScrollDimensions({ scrollHeight: this.scrollHeight }); + this.updateScrollWidth(); + this.scrollableElementUpdateDisposable = null; + }); + } + } + eventuallyUpdateScrollWidth() { + if (!this.horizontalScrolling) { + this.scrollableElementWidthDelayer.cancel(); + return; + } + this.scrollableElementWidthDelayer.trigger(() => this.updateScrollWidth()); + } + updateScrollWidth() { + if (!this.horizontalScrolling) { + return; + } + let scrollWidth = 0; + for (const item of this.items) { + if (typeof item.width !== "undefined") { + scrollWidth = Math.max(scrollWidth, item.width); + } + } + this.scrollWidth = scrollWidth; + this.scrollableElement.setScrollDimensions({ scrollWidth: scrollWidth === 0 ? 0 : scrollWidth + 10 }); + this._onDidChangeContentWidth.fire(this.scrollWidth); + } + rerender() { + if (!this.supportDynamicHeights) { + return; + } + for (const item of this.items) { + item.lastDynamicHeightWidth = void 0; + } + this._rerender(this.lastRenderTop, this.lastRenderHeight); + } + get length() { + return this.items.length; + } + get renderHeight() { + const scrollDimensions = this.scrollableElement.getScrollDimensions(); + return scrollDimensions.height; + } + get firstVisibleIndex() { + const range2 = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight); + return range2.start; + } + element(index) { + return this.items[index].element; + } + indexOf(element) { + return this.items.findIndex((item) => item.element === element); + } + domElement(index) { + const row = this.items[index].row; + return row && row.domNode; + } + elementHeight(index) { + return this.items[index].size; + } + elementTop(index) { + return this.rangeMap.positionAt(index); + } + indexAt(position) { + return this.rangeMap.indexAt(position); + } + indexAfter(position) { + return this.rangeMap.indexAfter(position); + } + layout(height, width2) { + const scrollDimensions = { + height: typeof height === "number" ? height : getContentHeight(this.domNode) + }; + if (this.scrollableElementUpdateDisposable) { + this.scrollableElementUpdateDisposable.dispose(); + this.scrollableElementUpdateDisposable = null; + scrollDimensions.scrollHeight = this.scrollHeight; + } + this.scrollableElement.setScrollDimensions(scrollDimensions); + if (typeof width2 !== "undefined") { + this.renderWidth = width2; + if (this.supportDynamicHeights) { + this._rerender(this.scrollTop, this.renderHeight); + } + } + if (this.horizontalScrolling) { + this.scrollableElement.setScrollDimensions({ + width: typeof width2 === "number" ? width2 : getContentWidth(this.domNode) + }); + } + } + // Render + render(previousRenderRange, renderTop, renderHeight, renderLeft, scrollWidth, updateItemsInDOM = false) { + const renderRange = this.getRenderRange(renderTop, renderHeight); + const rangesToInsert = Range2.relativeComplement(renderRange, previousRenderRange).reverse(); + const rangesToRemove = Range2.relativeComplement(previousRenderRange, renderRange); + if (updateItemsInDOM) { + const rangesToUpdate = Range2.intersect(previousRenderRange, renderRange); + for (let i = rangesToUpdate.start; i < rangesToUpdate.end; i++) { + this.updateItemInDOM(this.items[i], i); + } + } + this.cache.transact(() => { + for (const range2 of rangesToRemove) { + for (let i = range2.start; i < range2.end; i++) { + this.removeItemFromDOM(i); + } + } + for (const range2 of rangesToInsert) { + for (let i = range2.end - 1; i >= range2.start; i--) { + this.insertItemInDOM(i); + } + } + }); + if (renderLeft !== void 0) { + this.rowsContainer.style.left = `-${renderLeft}px`; + } + this.rowsContainer.style.top = `-${renderTop}px`; + if (this.horizontalScrolling && scrollWidth !== void 0) { + this.rowsContainer.style.width = `${Math.max(scrollWidth, this.renderWidth)}px`; + } + this.lastRenderTop = renderTop; + this.lastRenderHeight = renderHeight; + } + // DOM operations + insertItemInDOM(index, row) { + var _a10, _b4, _c2; + const item = this.items[index]; + if (!item.row) { + if (row) { + item.row = row; + item.stale = true; + } else { + const result = this.cache.alloc(item.templateId); + item.row = result.row; + item.stale || (item.stale = result.isReusingConnectedDomNode); + } + } + const role = this.accessibilityProvider.getRole(item.element) || "listitem"; + item.row.domNode.setAttribute("role", role); + const checked = this.accessibilityProvider.isChecked(item.element); + if (typeof checked === "boolean") { + item.row.domNode.setAttribute("aria-checked", String(!!checked)); + } else if (checked) { + const update = (checked2) => item.row.domNode.setAttribute("aria-checked", String(!!checked2)); + update(checked.value); + item.checkedDisposable = checked.onDidChange(() => update(checked.value)); + } + if (item.stale || !item.row.domNode.parentElement) { + const referenceNode = (_c2 = (_b4 = (_a10 = this.items.at(index + 1)) === null || _a10 === void 0 ? void 0 : _a10.row) === null || _b4 === void 0 ? void 0 : _b4.domNode) !== null && _c2 !== void 0 ? _c2 : null; + if (item.row.domNode.parentElement !== this.rowsContainer || item.row.domNode.nextElementSibling !== referenceNode) { + this.rowsContainer.insertBefore(item.row.domNode, referenceNode); + } + item.stale = false; + } + this.updateItemInDOM(item, index); + const renderer = this.renderers.get(item.templateId); + if (!renderer) { + throw new Error(`No renderer found for template id ${item.templateId}`); + } + renderer === null || renderer === void 0 ? void 0 : renderer.renderElement(item.element, index, item.row.templateData, item.size); + const uri = this.dnd.getDragURI(item.element); + item.dragStartDisposable.dispose(); + item.row.domNode.draggable = !!uri; + if (uri) { + item.dragStartDisposable = addDisposableListener(item.row.domNode, "dragstart", (event) => this.onDragStart(item.element, uri, event)); + } + if (this.horizontalScrolling) { + this.measureItemWidth(item); + this.eventuallyUpdateScrollWidth(); + } + } + measureItemWidth(item) { + if (!item.row || !item.row.domNode) { + return; + } + item.row.domNode.style.width = "fit-content"; + item.width = getContentWidth(item.row.domNode); + const style = getWindow(item.row.domNode).getComputedStyle(item.row.domNode); + if (style.paddingLeft) { + item.width += parseFloat(style.paddingLeft); + } + if (style.paddingRight) { + item.width += parseFloat(style.paddingRight); + } + item.row.domNode.style.width = ""; + } + updateItemInDOM(item, index) { + item.row.domNode.style.top = `${this.elementTop(index)}px`; + if (this.setRowHeight) { + item.row.domNode.style.height = `${item.size}px`; + } + if (this.setRowLineHeight) { + item.row.domNode.style.lineHeight = `${item.size}px`; + } + item.row.domNode.setAttribute("data-index", `${index}`); + item.row.domNode.setAttribute("data-last-element", index === this.length - 1 ? "true" : "false"); + item.row.domNode.setAttribute("data-parity", index % 2 === 0 ? "even" : "odd"); + item.row.domNode.setAttribute("aria-setsize", String(this.accessibilityProvider.getSetSize(item.element, index, this.length))); + item.row.domNode.setAttribute("aria-posinset", String(this.accessibilityProvider.getPosInSet(item.element, index))); + item.row.domNode.setAttribute("id", this.getElementDomId(index)); + item.row.domNode.classList.toggle("drop-target", item.dropTarget); + } + removeItemFromDOM(index) { + const item = this.items[index]; + item.dragStartDisposable.dispose(); + item.checkedDisposable.dispose(); + if (item.row) { + const renderer = this.renderers.get(item.templateId); + if (renderer && renderer.disposeElement) { + renderer.disposeElement(item.element, index, item.row.templateData, item.size); + } + this.cache.release(item.row); + item.row = null; + } + if (this.horizontalScrolling) { + this.eventuallyUpdateScrollWidth(); + } + } + getScrollTop() { + const scrollPosition = this.scrollableElement.getScrollPosition(); + return scrollPosition.scrollTop; + } + setScrollTop(scrollTop, reuseAnimation) { + if (this.scrollableElementUpdateDisposable) { + this.scrollableElementUpdateDisposable.dispose(); + this.scrollableElementUpdateDisposable = null; + this.scrollableElement.setScrollDimensions({ scrollHeight: this.scrollHeight }); + } + this.scrollableElement.setScrollPosition({ scrollTop, reuseAnimation }); + } + get scrollTop() { + return this.getScrollTop(); + } + set scrollTop(scrollTop) { + this.setScrollTop(scrollTop); + } + get scrollHeight() { + return this._scrollHeight + (this.horizontalScrolling ? 10 : 0) + this.paddingBottom; + } + // Events + get onMouseClick() { + return Event.map(this.disposables.add(new DomEmitter(this.domNode, "click")).event, (e) => this.toMouseEvent(e), this.disposables); + } + get onMouseDblClick() { + return Event.map(this.disposables.add(new DomEmitter(this.domNode, "dblclick")).event, (e) => this.toMouseEvent(e), this.disposables); + } + get onMouseMiddleClick() { + return Event.filter(Event.map(this.disposables.add(new DomEmitter(this.domNode, "auxclick")).event, (e) => this.toMouseEvent(e), this.disposables), (e) => e.browserEvent.button === 1, this.disposables); + } + get onMouseDown() { + return Event.map(this.disposables.add(new DomEmitter(this.domNode, "mousedown")).event, (e) => this.toMouseEvent(e), this.disposables); + } + get onMouseOver() { + return Event.map(this.disposables.add(new DomEmitter(this.domNode, "mouseover")).event, (e) => this.toMouseEvent(e), this.disposables); + } + get onMouseOut() { + return Event.map(this.disposables.add(new DomEmitter(this.domNode, "mouseout")).event, (e) => this.toMouseEvent(e), this.disposables); + } + get onContextMenu() { + return Event.any(Event.map(this.disposables.add(new DomEmitter(this.domNode, "contextmenu")).event, (e) => this.toMouseEvent(e), this.disposables), Event.map(this.disposables.add(new DomEmitter(this.domNode, EventType2.Contextmenu)).event, (e) => this.toGestureEvent(e), this.disposables)); + } + get onTouchStart() { + return Event.map(this.disposables.add(new DomEmitter(this.domNode, "touchstart")).event, (e) => this.toTouchEvent(e), this.disposables); + } + get onTap() { + return Event.map(this.disposables.add(new DomEmitter(this.rowsContainer, EventType2.Tap)).event, (e) => this.toGestureEvent(e), this.disposables); + } + toMouseEvent(browserEvent) { + const index = this.getItemIndexFromEventTarget(browserEvent.target || null); + const item = typeof index === "undefined" ? void 0 : this.items[index]; + const element = item && item.element; + return { browserEvent, index, element }; + } + toTouchEvent(browserEvent) { + const index = this.getItemIndexFromEventTarget(browserEvent.target || null); + const item = typeof index === "undefined" ? void 0 : this.items[index]; + const element = item && item.element; + return { browserEvent, index, element }; + } + toGestureEvent(browserEvent) { + const index = this.getItemIndexFromEventTarget(browserEvent.initialTarget || null); + const item = typeof index === "undefined" ? void 0 : this.items[index]; + const element = item && item.element; + return { browserEvent, index, element }; + } + toDragEvent(browserEvent) { + const index = this.getItemIndexFromEventTarget(browserEvent.target || null); + const item = typeof index === "undefined" ? void 0 : this.items[index]; + const element = item && item.element; + const sector = this.getTargetSector(browserEvent, index); + return { browserEvent, index, element, sector }; + } + onScroll(e) { + try { + const previousRenderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight); + this.render(previousRenderRange, e.scrollTop, e.height, e.scrollLeft, e.scrollWidth); + if (this.supportDynamicHeights) { + this._rerender(e.scrollTop, e.height, e.inSmoothScrolling); + } + } catch (err) { + console.error("Got bad scroll event:", e); + throw err; + } + } + onTouchChange(event) { + event.preventDefault(); + event.stopPropagation(); + this.scrollTop -= event.translationY; + } + // DND + onDragStart(element, uri, event) { + var _a10, _b4; + if (!event.dataTransfer) { + return; + } + const elements = this.dnd.getDragElements(element); + event.dataTransfer.effectAllowed = "copyMove"; + event.dataTransfer.setData(DataTransfers.TEXT, uri); + if (event.dataTransfer.setDragImage) { + let label; + if (this.dnd.getDragLabel) { + label = this.dnd.getDragLabel(elements, event); + } + if (typeof label === "undefined") { + label = String(elements.length); + } + const dragImage = $(".monaco-drag-image"); + dragImage.textContent = label; + const getDragImageContainer = (e) => { + while (e && !e.classList.contains("monaco-workbench")) { + e = e.parentElement; + } + return e || this.domNode.ownerDocument; + }; + const container = getDragImageContainer(this.domNode); + container.appendChild(dragImage); + event.dataTransfer.setDragImage(dragImage, -10, -10); + setTimeout(() => container.removeChild(dragImage), 0); + } + this.domNode.classList.add("dragging"); + this.currentDragData = new ElementsDragAndDropData(elements); + StaticDND.CurrentDragAndDropData = new ExternalElementsDragAndDropData(elements); + (_b4 = (_a10 = this.dnd).onDragStart) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, this.currentDragData, event); + } + onDragOver(event) { + var _a10, _b4; + event.browserEvent.preventDefault(); + this.onDragLeaveTimeout.dispose(); + if (StaticDND.CurrentDragAndDropData && StaticDND.CurrentDragAndDropData.getData() === "vscode-ui") { + return false; + } + this.setupDragAndDropScrollTopAnimation(event.browserEvent); + if (!event.browserEvent.dataTransfer) { + return false; + } + if (!this.currentDragData) { + if (StaticDND.CurrentDragAndDropData) { + this.currentDragData = StaticDND.CurrentDragAndDropData; + } else { + if (!event.browserEvent.dataTransfer.types) { + return false; + } + this.currentDragData = new NativeDragAndDropData(); + } + } + const result = this.dnd.onDragOver(this.currentDragData, event.element, event.index, event.sector, event.browserEvent); + this.canDrop = typeof result === "boolean" ? result : result.accept; + if (!this.canDrop) { + this.currentDragFeedback = void 0; + this.currentDragFeedbackDisposable.dispose(); + return false; + } + event.browserEvent.dataTransfer.dropEffect = typeof result !== "boolean" && ((_a10 = result.effect) === null || _a10 === void 0 ? void 0 : _a10.type) === 0 ? "copy" : "move"; + let feedback; + if (typeof result !== "boolean" && result.feedback) { + feedback = result.feedback; + } else { + if (typeof event.index === "undefined") { + feedback = [-1]; + } else { + feedback = [event.index]; + } + } + feedback = distinct(feedback).filter((i) => i >= -1 && i < this.length).sort((a3, b) => a3 - b); + feedback = feedback[0] === -1 ? [-1] : feedback; + let dragOverEffectPosition = typeof result !== "boolean" && result.effect && result.effect.position ? result.effect.position : "drop-target"; + if (equalsDragFeedback(this.currentDragFeedback, feedback) && this.currentDragFeedbackPosition === dragOverEffectPosition) { + return true; + } + this.currentDragFeedback = feedback; + this.currentDragFeedbackPosition = dragOverEffectPosition; + this.currentDragFeedbackDisposable.dispose(); + if (feedback[0] === -1) { + this.domNode.classList.add(dragOverEffectPosition); + this.rowsContainer.classList.add(dragOverEffectPosition); + this.currentDragFeedbackDisposable = toDisposable(() => { + this.domNode.classList.remove(dragOverEffectPosition); + this.rowsContainer.classList.remove(dragOverEffectPosition); + }); + } else { + if (feedback.length > 1 && dragOverEffectPosition !== "drop-target") { + throw new Error("Can't use multiple feedbacks with position different than 'over'"); + } + if (dragOverEffectPosition === "drop-target-after") { + if (feedback[0] < this.length - 1) { + feedback[0] += 1; + dragOverEffectPosition = "drop-target-before"; + } + } + for (const index of feedback) { + const item = this.items[index]; + item.dropTarget = true; + (_b4 = item.row) === null || _b4 === void 0 ? void 0 : _b4.domNode.classList.add(dragOverEffectPosition); + } + this.currentDragFeedbackDisposable = toDisposable(() => { + var _a11; + for (const index of feedback) { + const item = this.items[index]; + item.dropTarget = false; + (_a11 = item.row) === null || _a11 === void 0 ? void 0 : _a11.domNode.classList.remove(dragOverEffectPosition); + } + }); + } + return true; + } + onDragLeave(event) { + var _a10, _b4; + this.onDragLeaveTimeout.dispose(); + this.onDragLeaveTimeout = disposableTimeout(() => this.clearDragOverFeedback(), 100, this.disposables); + if (this.currentDragData) { + (_b4 = (_a10 = this.dnd).onDragLeave) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, this.currentDragData, event.element, event.index, event.browserEvent); + } + } + onDrop(event) { + if (!this.canDrop) { + return; + } + const dragData = this.currentDragData; + this.teardownDragAndDropScrollTopAnimation(); + this.clearDragOverFeedback(); + this.domNode.classList.remove("dragging"); + this.currentDragData = void 0; + StaticDND.CurrentDragAndDropData = void 0; + if (!dragData || !event.browserEvent.dataTransfer) { + return; + } + event.browserEvent.preventDefault(); + dragData.update(event.browserEvent.dataTransfer); + this.dnd.drop(dragData, event.element, event.index, event.sector, event.browserEvent); + } + onDragEnd(event) { + var _a10, _b4; + this.canDrop = false; + this.teardownDragAndDropScrollTopAnimation(); + this.clearDragOverFeedback(); + this.domNode.classList.remove("dragging"); + this.currentDragData = void 0; + StaticDND.CurrentDragAndDropData = void 0; + (_b4 = (_a10 = this.dnd).onDragEnd) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, event); + } + clearDragOverFeedback() { + this.currentDragFeedback = void 0; + this.currentDragFeedbackPosition = void 0; + this.currentDragFeedbackDisposable.dispose(); + this.currentDragFeedbackDisposable = Disposable.None; + } + // DND scroll top animation + setupDragAndDropScrollTopAnimation(event) { + if (!this.dragOverAnimationDisposable) { + const viewTop = getTopLeftOffset(this.domNode).top; + this.dragOverAnimationDisposable = animate(getWindow(this.domNode), this.animateDragAndDropScrollTop.bind(this, viewTop)); + } + this.dragOverAnimationStopDisposable.dispose(); + this.dragOverAnimationStopDisposable = disposableTimeout(() => { + if (this.dragOverAnimationDisposable) { + this.dragOverAnimationDisposable.dispose(); + this.dragOverAnimationDisposable = void 0; + } + }, 1e3, this.disposables); + this.dragOverMouseY = event.pageY; + } + animateDragAndDropScrollTop(viewTop) { + if (this.dragOverMouseY === void 0) { + return; + } + const diff = this.dragOverMouseY - viewTop; + const upperLimit = this.renderHeight - 35; + if (diff < 35) { + this.scrollTop += Math.max(-14, Math.floor(0.3 * (diff - 35))); + } else if (diff > upperLimit) { + this.scrollTop += Math.min(14, Math.floor(0.3 * (diff - upperLimit))); + } + } + teardownDragAndDropScrollTopAnimation() { + this.dragOverAnimationStopDisposable.dispose(); + if (this.dragOverAnimationDisposable) { + this.dragOverAnimationDisposable.dispose(); + this.dragOverAnimationDisposable = void 0; + } + } + // Util + getTargetSector(browserEvent, targetIndex) { + if (targetIndex === void 0) { + return void 0; + } + const relativePosition = browserEvent.offsetY / this.items[targetIndex].size; + const sector = Math.floor(relativePosition / 0.25); + return clamp(sector, 0, 3); + } + getItemIndexFromEventTarget(target) { + const scrollableElement = this.scrollableElement.getDomNode(); + let element = target; + while (isHTMLElement(element) && element !== this.rowsContainer && scrollableElement.contains(element)) { + const rawIndex = element.getAttribute("data-index"); + if (rawIndex) { + const index = Number(rawIndex); + if (!isNaN(index)) { + return index; + } + } + element = element.parentElement; + } + return void 0; + } + getRenderRange(renderTop, renderHeight) { + return { + start: this.rangeMap.indexAt(renderTop), + end: this.rangeMap.indexAfter(renderTop + renderHeight - 1) + }; + } + /** + * Given a stable rendered state, checks every rendered element whether it needs + * to be probed for dynamic height. Adjusts scroll height and top if necessary. + */ + _rerender(renderTop, renderHeight, inSmoothScrolling) { + const previousRenderRange = this.getRenderRange(renderTop, renderHeight); + let anchorElementIndex; + let anchorElementTopDelta; + if (renderTop === this.elementTop(previousRenderRange.start)) { + anchorElementIndex = previousRenderRange.start; + anchorElementTopDelta = 0; + } else if (previousRenderRange.end - previousRenderRange.start > 1) { + anchorElementIndex = previousRenderRange.start + 1; + anchorElementTopDelta = this.elementTop(anchorElementIndex) - renderTop; + } + let heightDiff2 = 0; + while (true) { + const renderRange = this.getRenderRange(renderTop, renderHeight); + let didChange = false; + for (let i = renderRange.start; i < renderRange.end; i++) { + const diff = this.probeDynamicHeight(i); + if (diff !== 0) { + this.rangeMap.splice(i, 1, [this.items[i]]); + } + heightDiff2 += diff; + didChange = didChange || diff !== 0; + } + if (!didChange) { + if (heightDiff2 !== 0) { + this.eventuallyUpdateScrollDimensions(); + } + const unrenderRanges = Range2.relativeComplement(previousRenderRange, renderRange); + for (const range2 of unrenderRanges) { + for (let i = range2.start; i < range2.end; i++) { + if (this.items[i].row) { + this.removeItemFromDOM(i); + } + } + } + const renderRanges = Range2.relativeComplement(renderRange, previousRenderRange).reverse(); + for (const range2 of renderRanges) { + for (let i = range2.end - 1; i >= range2.start; i--) { + this.insertItemInDOM(i); + } + } + for (let i = renderRange.start; i < renderRange.end; i++) { + if (this.items[i].row) { + this.updateItemInDOM(this.items[i], i); + } + } + if (typeof anchorElementIndex === "number") { + const deltaScrollTop = this.scrollable.getFutureScrollPosition().scrollTop - renderTop; + const newScrollTop = this.elementTop(anchorElementIndex) - anchorElementTopDelta + deltaScrollTop; + this.setScrollTop(newScrollTop, inSmoothScrolling); + } + this._onDidChangeContentHeight.fire(this.contentHeight); + return; + } + } + } + probeDynamicHeight(index) { + var _a10, _b4, _c2; + const item = this.items[index]; + if (!!this.virtualDelegate.getDynamicHeight) { + const newSize = this.virtualDelegate.getDynamicHeight(item.element); + if (newSize !== null) { + const size3 = item.size; + item.size = newSize; + item.lastDynamicHeightWidth = this.renderWidth; + return newSize - size3; + } + } + if (!item.hasDynamicHeight || item.lastDynamicHeightWidth === this.renderWidth) { + return 0; + } + if (!!this.virtualDelegate.hasDynamicHeight && !this.virtualDelegate.hasDynamicHeight(item.element)) { + return 0; + } + const size2 = item.size; + if (item.row) { + item.row.domNode.style.height = ""; + item.size = item.row.domNode.offsetHeight; + if (item.size === 0 && !isAncestor(item.row.domNode, getWindow(item.row.domNode).document.body)) { + console.warn("Measuring item node that is not in DOM! Add ListView to the DOM before measuring row height!"); + } + item.lastDynamicHeightWidth = this.renderWidth; + return item.size - size2; + } + const { row } = this.cache.alloc(item.templateId); + row.domNode.style.height = ""; + this.rowsContainer.appendChild(row.domNode); + const renderer = this.renderers.get(item.templateId); + if (!renderer) { + throw new BugIndicatingError("Missing renderer for templateId: " + item.templateId); + } + renderer.renderElement(item.element, index, row.templateData, void 0); + item.size = row.domNode.offsetHeight; + (_a10 = renderer.disposeElement) === null || _a10 === void 0 ? void 0 : _a10.call(renderer, item.element, index, row.templateData, void 0); + (_c2 = (_b4 = this.virtualDelegate).setDynamicHeight) === null || _c2 === void 0 ? void 0 : _c2.call(_b4, item.element, item.size); + item.lastDynamicHeightWidth = this.renderWidth; + this.rowsContainer.removeChild(row.domNode); + this.cache.release(row); + return item.size - size2; + } + getElementDomId(index) { + return `${this.domId}_${index}`; + } + // Dispose + dispose() { + var _a10, _b4; + for (const item of this.items) { + item.dragStartDisposable.dispose(); + item.checkedDisposable.dispose(); + if (item.row) { + const renderer = this.renderers.get(item.row.templateId); + if (renderer) { + (_a10 = renderer.disposeElement) === null || _a10 === void 0 ? void 0 : _a10.call(renderer, item.element, -1, item.row.templateData, void 0); + renderer.disposeTemplate(item.row.templateData); + } + } + } + this.items = []; + if (this.domNode && this.domNode.parentNode) { + this.domNode.parentNode.removeChild(this.domNode); + } + (_b4 = this.dragOverAnimationDisposable) === null || _b4 === void 0 ? void 0 : _b4.dispose(); + this.disposables.dispose(); + } + }; + ListView.InstanceCount = 0; + __decorate26([ + memoize + ], ListView.prototype, "onMouseClick", null); + __decorate26([ + memoize + ], ListView.prototype, "onMouseDblClick", null); + __decorate26([ + memoize + ], ListView.prototype, "onMouseMiddleClick", null); + __decorate26([ + memoize + ], ListView.prototype, "onMouseDown", null); + __decorate26([ + memoize + ], ListView.prototype, "onMouseOver", null); + __decorate26([ + memoize + ], ListView.prototype, "onMouseOut", null); + __decorate26([ + memoize + ], ListView.prototype, "onContextMenu", null); + __decorate26([ + memoize + ], ListView.prototype, "onTouchStart", null); + __decorate26([ + memoize + ], ListView.prototype, "onTap", null); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/equals.js +function itemsEquals(itemEquals2 = strictEquals) { + return (a3, b) => equals(a3, b, itemEquals2); +} +function itemEquals() { + return (a3, b) => a3.equals(b); +} +function equalsIfDefined(v1, v2, equals4) { + if (!v1 || !v2) { + return v1 === v2; + } + return equals4(v1, v2); +} +var strictEquals; +var init_equals = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/equals.js"() { + init_arrays(); + strictEquals = (a3, b) => a3 === b; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/observableInternal/debugName.js +function getDebugName(target, data) { + var _a10; + const cached = cachedDebugName.get(target); + if (cached) { + return cached; + } + const dbgName = computeDebugName(target, data); + if (dbgName) { + let count = (_a10 = countPerName.get(dbgName)) !== null && _a10 !== void 0 ? _a10 : 0; + count++; + countPerName.set(dbgName, count); + const result = count === 1 ? dbgName : `${dbgName}#${count}`; + cachedDebugName.set(target, result); + return result; + } + return void 0; +} +function computeDebugName(self2, data) { + const cached = cachedDebugName.get(self2); + if (cached) { + return cached; + } + const ownerStr = data.owner ? formatOwner(data.owner) + `.` : ""; + let result; + const debugNameSource = data.debugNameSource; + if (debugNameSource !== void 0) { + if (typeof debugNameSource === "function") { + result = debugNameSource(); + if (result !== void 0) { + return ownerStr + result; + } + } else { + return ownerStr + debugNameSource; + } + } + const referenceFn = data.referenceFn; + if (referenceFn !== void 0) { + result = getFunctionName(referenceFn); + if (result !== void 0) { + return ownerStr + result; + } + } + if (data.owner !== void 0) { + const key = findKey(data.owner, self2); + if (key !== void 0) { + return ownerStr + key; + } + } + return void 0; +} +function findKey(obj, value) { + for (const key in obj) { + if (obj[key] === value) { + return key; + } + } + return void 0; +} +function formatOwner(owner) { + var _a10; + const id = ownerId.get(owner); + if (id) { + return id; + } + const className = getClassName(owner); + let count = (_a10 = countPerClassName.get(className)) !== null && _a10 !== void 0 ? _a10 : 0; + count++; + countPerClassName.set(className, count); + const result = count === 1 ? className : `${className}#${count}`; + ownerId.set(owner, result); + return result; +} +function getClassName(obj) { + const ctor = obj.constructor; + if (ctor) { + return ctor.name; + } + return "Object"; +} +function getFunctionName(fn) { + const fnSrc = fn.toString(); + const regexp = /\/\*\*\s*@description\s*([^*]*)\*\//; + const match2 = regexp.exec(fnSrc); + const result = match2 ? match2[1] : void 0; + return result === null || result === void 0 ? void 0 : result.trim(); +} +var DebugNameData, countPerName, cachedDebugName, countPerClassName, ownerId; +var init_debugName = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/observableInternal/debugName.js"() { + DebugNameData = class { + constructor(owner, debugNameSource, referenceFn) { + this.owner = owner; + this.debugNameSource = debugNameSource; + this.referenceFn = referenceFn; + } + getDebugName(target) { + return getDebugName(target, this); + } + }; + countPerName = /* @__PURE__ */ new Map(); + cachedDebugName = /* @__PURE__ */ new WeakMap(); + countPerClassName = /* @__PURE__ */ new Map(); + ownerId = /* @__PURE__ */ new WeakMap(); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/observableInternal/logging.js +function setLogger(logger) { + globalObservableLogger = logger; +} +function getLogger() { + return globalObservableLogger; +} +function consoleTextToArgs(text2) { + const styles = new Array(); + const data = []; + let firstArg = ""; + function process2(t4) { + if ("length" in t4) { + for (const item of t4) { + if (item) { + process2(item); + } + } + } else if ("text" in t4) { + firstArg += `%c${t4.text}`; + styles.push(t4.style); + if (t4.data) { + data.push(...t4.data); + } + } else if ("data" in t4) { + data.push(...t4.data); + } + } + process2(text2); + const result = [firstArg, ...styles]; + result.push(...data); + return result; +} +function normalText(text2) { + return styled(text2, { color: "black" }); +} +function formatKind(kind) { + return styled(padStr(`${kind}: `, 10), { color: "black", bold: true }); +} +function styled(text2, options2 = { + color: "black" +}) { + function objToCss(styleObj) { + return Object.entries(styleObj).reduce((styleString, [propName, propValue]) => { + return `${styleString}${propName}:${propValue};`; + }, ""); + } + const style = { + color: options2.color + }; + if (options2.strikeThrough) { + style["text-decoration"] = "line-through"; + } + if (options2.bold) { + style["font-weight"] = "bold"; + } + return { + text: text2, + style: objToCss(style) + }; +} +function formatValue(value, availableLen) { + switch (typeof value) { + case "number": + return "" + value; + case "string": + if (value.length + 2 <= availableLen) { + return `"${value}"`; + } + return `"${value.substr(0, availableLen - 7)}"+...`; + case "boolean": + return value ? "true" : "false"; + case "undefined": + return "undefined"; + case "object": + if (value === null) { + return "null"; + } + if (Array.isArray(value)) { + return formatArray(value, availableLen); + } + return formatObject(value, availableLen); + case "symbol": + return value.toString(); + case "function": + return `[[Function${value.name ? " " + value.name : ""}]]`; + default: + return "" + value; + } +} +function formatArray(value, availableLen) { + let result = "[ "; + let first2 = true; + for (const val of value) { + if (!first2) { + result += ", "; + } + if (result.length - 5 > availableLen) { + result += "..."; + break; + } + first2 = false; + result += `${formatValue(val, availableLen - result.length)}`; + } + result += " ]"; + return result; +} +function formatObject(value, availableLen) { + let result = "{ "; + let first2 = true; + for (const [key, val] of Object.entries(value)) { + if (!first2) { + result += ", "; + } + if (result.length - 5 > availableLen) { + result += "..."; + break; + } + first2 = false; + result += `${key}: ${formatValue(val, availableLen - result.length)}`; + } + result += " }"; + return result; +} +function repeat(str, count) { + let result = ""; + for (let i = 1; i <= count; i++) { + result += str; + } + return result; +} +function padStr(str, length) { + while (str.length < length) { + str += " "; + } + return str; +} +var globalObservableLogger, ConsoleObservableLogger; +var init_logging = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/observableInternal/logging.js"() { + ConsoleObservableLogger = class { + constructor() { + this.indentation = 0; + this.changedObservablesSets = /* @__PURE__ */ new WeakMap(); + } + textToConsoleArgs(text2) { + return consoleTextToArgs([ + normalText(repeat("| ", this.indentation)), + text2 + ]); + } + formatInfo(info) { + if (!info.hadValue) { + return [ + normalText(` `), + styled(formatValue(info.newValue, 60), { + color: "green" + }), + normalText(` (initial)`) + ]; + } + return info.didChange ? [ + normalText(` `), + styled(formatValue(info.oldValue, 70), { + color: "red", + strikeThrough: true + }), + normalText(` `), + styled(formatValue(info.newValue, 60), { + color: "green" + }) + ] : [normalText(` (unchanged)`)]; + } + handleObservableChanged(observable, info) { + console.log(...this.textToConsoleArgs([ + formatKind("observable value changed"), + styled(observable.debugName, { color: "BlueViolet" }), + ...this.formatInfo(info) + ])); + } + formatChanges(changes) { + if (changes.size === 0) { + return void 0; + } + return styled(" (changed deps: " + [...changes].map((o) => o.debugName).join(", ") + ")", { color: "gray" }); + } + handleDerivedCreated(derived2) { + const existingHandleChange = derived2.handleChange; + this.changedObservablesSets.set(derived2, /* @__PURE__ */ new Set()); + derived2.handleChange = (observable, change) => { + this.changedObservablesSets.get(derived2).add(observable); + return existingHandleChange.apply(derived2, [observable, change]); + }; + } + handleDerivedRecomputed(derived2, info) { + const changedObservables = this.changedObservablesSets.get(derived2); + console.log(...this.textToConsoleArgs([ + formatKind("derived recomputed"), + styled(derived2.debugName, { color: "BlueViolet" }), + ...this.formatInfo(info), + this.formatChanges(changedObservables), + { data: [{ fn: derived2._computeFn }] } + ])); + changedObservables.clear(); + } + handleFromEventObservableTriggered(observable, info) { + console.log(...this.textToConsoleArgs([ + formatKind("observable from event triggered"), + styled(observable.debugName, { color: "BlueViolet" }), + ...this.formatInfo(info), + { data: [{ fn: observable._getValue }] } + ])); + } + handleAutorunCreated(autorun2) { + const existingHandleChange = autorun2.handleChange; + this.changedObservablesSets.set(autorun2, /* @__PURE__ */ new Set()); + autorun2.handleChange = (observable, change) => { + this.changedObservablesSets.get(autorun2).add(observable); + return existingHandleChange.apply(autorun2, [observable, change]); + }; + } + handleAutorunTriggered(autorun2) { + const changedObservables = this.changedObservablesSets.get(autorun2); + console.log(...this.textToConsoleArgs([ + formatKind("autorun"), + styled(autorun2.debugName, { color: "BlueViolet" }), + this.formatChanges(changedObservables), + { data: [{ fn: autorun2._runFn }] } + ])); + changedObservables.clear(); + this.indentation++; + } + handleAutorunFinished(autorun2) { + this.indentation--; + } + handleBeginTransaction(transaction2) { + let transactionName = transaction2.getDebugName(); + if (transactionName === void 0) { + transactionName = ""; + } + console.log(...this.textToConsoleArgs([ + formatKind("transaction"), + styled(transactionName, { color: "BlueViolet" }), + { data: [{ fn: transaction2._fn }] } + ])); + this.indentation++; + } + handleEndTransaction() { + this.indentation--; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/observableInternal/base.js +function _setRecomputeInitiallyAndOnChange(recomputeInitiallyAndOnChange2) { + _recomputeInitiallyAndOnChange = recomputeInitiallyAndOnChange2; +} +function _setKeepObserved(keepObserved2) { + _keepObserved = keepObserved2; +} +function _setDerivedOpts(derived2) { + _derived = derived2; +} +function transaction(fn, getDebugName2) { + const tx = new TransactionImpl(fn, getDebugName2); + try { + fn(tx); + } finally { + tx.finish(); + } +} +function globalTransaction(fn) { + if (_globalTransaction) { + fn(_globalTransaction); + } else { + const tx = new TransactionImpl(fn, void 0); + _globalTransaction = tx; + try { + fn(tx); + } finally { + tx.finish(); + _globalTransaction = void 0; + } + } +} +function asyncTransaction(fn, getDebugName2) { + return __async(this, null, function* () { + const tx = new TransactionImpl(fn, getDebugName2); + try { + yield fn(tx); + } finally { + tx.finish(); + } + }); +} +function subtransaction(tx, fn, getDebugName2) { + if (!tx) { + transaction(fn, getDebugName2); + } else { + fn(tx); + } +} +function observableValue(nameOrOwner, initialValue) { + let debugNameData; + if (typeof nameOrOwner === "string") { + debugNameData = new DebugNameData(void 0, nameOrOwner, void 0); + } else { + debugNameData = new DebugNameData(nameOrOwner, void 0, void 0); + } + return new ObservableValue(debugNameData, initialValue, strictEquals); +} +function observableValueOpts(options2, initialValue) { + var _a10; + return new ObservableValue(new DebugNameData(options2.owner, options2.debugName, void 0), initialValue, (_a10 = options2.equalsFn) !== null && _a10 !== void 0 ? _a10 : strictEquals); +} +function disposableObservableValue(nameOrOwner, initialValue) { + let debugNameData; + if (typeof nameOrOwner === "string") { + debugNameData = new DebugNameData(void 0, nameOrOwner, void 0); + } else { + debugNameData = new DebugNameData(nameOrOwner, void 0, void 0); + } + return new DisposableObservableValue(debugNameData, initialValue, strictEquals); +} +var _recomputeInitiallyAndOnChange, _keepObserved, _derived, ConvenientObservable, BaseObservable, _globalTransaction, TransactionImpl, ObservableValue, DisposableObservableValue; +var init_base = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/observableInternal/base.js"() { + init_equals(); + init_debugName(); + init_logging(); + ConvenientObservable = class { + get TChange() { + return null; + } + reportChanges() { + this.get(); + } + /** @sealed */ + read(reader) { + if (reader) { + return reader.readObservable(this); + } else { + return this.get(); + } + } + map(fnOrOwner, fnOrUndefined) { + const owner = fnOrUndefined === void 0 ? void 0 : fnOrOwner; + const fn = fnOrUndefined === void 0 ? fnOrOwner : fnOrUndefined; + return _derived({ + owner, + debugName: () => { + const name = getFunctionName(fn); + if (name !== void 0) { + return name; + } + const regexp = /^\s*\(?\s*([a-zA-Z_$][a-zA-Z_$0-9]*)\s*\)?\s*=>\s*\1(?:\??)\.([a-zA-Z_$][a-zA-Z_$0-9]*)\s*$/; + const match2 = regexp.exec(fn.toString()); + if (match2) { + return `${this.debugName}.${match2[2]}`; + } + if (!owner) { + return `${this.debugName} (mapped)`; + } + return void 0; + }, + debugReferenceFn: fn + }, (reader) => fn(this.read(reader), reader)); + } + recomputeInitiallyAndOnChange(store, handleValue) { + store.add(_recomputeInitiallyAndOnChange(this, handleValue)); + return this; + } + }; + BaseObservable = class extends ConvenientObservable { + constructor() { + super(...arguments); + this.observers = /* @__PURE__ */ new Set(); + } + addObserver(observer) { + const len = this.observers.size; + this.observers.add(observer); + if (len === 0) { + this.onFirstObserverAdded(); + } + } + removeObserver(observer) { + const deleted = this.observers.delete(observer); + if (deleted && this.observers.size === 0) { + this.onLastObserverRemoved(); + } + } + onFirstObserverAdded() { + } + onLastObserverRemoved() { + } + }; + _globalTransaction = void 0; + TransactionImpl = class { + constructor(_fn, _getDebugName) { + var _a10; + this._fn = _fn; + this._getDebugName = _getDebugName; + this.updatingObservers = []; + (_a10 = getLogger()) === null || _a10 === void 0 ? void 0 : _a10.handleBeginTransaction(this); + } + getDebugName() { + if (this._getDebugName) { + return this._getDebugName(); + } + return getFunctionName(this._fn); + } + updateObserver(observer, observable) { + this.updatingObservers.push({ observer, observable }); + observer.beginUpdate(observable); + } + finish() { + var _a10; + const updatingObservers = this.updatingObservers; + for (let i = 0; i < updatingObservers.length; i++) { + const { observer, observable } = updatingObservers[i]; + observer.endUpdate(observable); + } + this.updatingObservers = null; + (_a10 = getLogger()) === null || _a10 === void 0 ? void 0 : _a10.handleEndTransaction(); + } + }; + ObservableValue = class extends BaseObservable { + get debugName() { + var _a10; + return (_a10 = this._debugNameData.getDebugName(this)) !== null && _a10 !== void 0 ? _a10 : "ObservableValue"; + } + constructor(_debugNameData, initialValue, _equalityComparator) { + super(); + this._debugNameData = _debugNameData; + this._equalityComparator = _equalityComparator; + this._value = initialValue; + } + get() { + return this._value; + } + set(value, tx, change) { + var _a10; + if (change === void 0 && this._equalityComparator(this._value, value)) { + return; + } + let _tx; + if (!tx) { + tx = _tx = new TransactionImpl(() => { + }, () => `Setting ${this.debugName}`); + } + try { + const oldValue = this._value; + this._setValue(value); + (_a10 = getLogger()) === null || _a10 === void 0 ? void 0 : _a10.handleObservableChanged(this, { oldValue, newValue: value, change, didChange: true, hadValue: true }); + for (const observer of this.observers) { + tx.updateObserver(observer, this); + observer.handleChange(this, change); + } + } finally { + if (_tx) { + _tx.finish(); + } + } + } + toString() { + return `${this.debugName}: ${this._value}`; + } + _setValue(newValue) { + this._value = newValue; + } + }; + DisposableObservableValue = class extends ObservableValue { + _setValue(newValue) { + if (this._value === newValue) { + return; + } + if (this._value) { + this._value.dispose(); + } + this._value = newValue; + } + dispose() { + var _a10; + (_a10 = this._value) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/observableInternal/derived.js +function derived(computeFnOrOwner, computeFn) { + if (computeFn !== void 0) { + return new Derived(new DebugNameData(computeFnOrOwner, void 0, computeFn), computeFn, void 0, void 0, void 0, strictEquals); + } + return new Derived(new DebugNameData(void 0, void 0, computeFnOrOwner), computeFnOrOwner, void 0, void 0, void 0, strictEquals); +} +function derivedWithSetter(owner, computeFn, setter) { + return new DerivedWithSetter(new DebugNameData(owner, void 0, computeFn), computeFn, void 0, void 0, void 0, strictEquals, setter); +} +function derivedOpts(options2, computeFn) { + var _a10; + return new Derived(new DebugNameData(options2.owner, options2.debugName, options2.debugReferenceFn), computeFn, void 0, void 0, options2.onLastObserverRemoved, (_a10 = options2.equalsFn) !== null && _a10 !== void 0 ? _a10 : strictEquals); +} +function derivedHandleChanges(options2, computeFn) { + var _a10; + return new Derived(new DebugNameData(options2.owner, options2.debugName, void 0), computeFn, options2.createEmptyChangeSummary, options2.handleChange, void 0, (_a10 = options2.equalityComparer) !== null && _a10 !== void 0 ? _a10 : strictEquals); +} +function derivedWithStore(computeFnOrOwner, computeFnOrUndefined) { + let computeFn; + let owner; + if (computeFnOrUndefined === void 0) { + computeFn = computeFnOrOwner; + owner = void 0; + } else { + owner = computeFnOrOwner; + computeFn = computeFnOrUndefined; + } + const store = new DisposableStore(); + return new Derived(new DebugNameData(owner, void 0, computeFn), (r) => { + store.clear(); + return computeFn(r, store); + }, void 0, void 0, () => store.dispose(), strictEquals); +} +function derivedDisposable(computeFnOrOwner, computeFnOrUndefined) { + let computeFn; + let owner; + if (computeFnOrUndefined === void 0) { + computeFn = computeFnOrOwner; + owner = void 0; + } else { + owner = computeFnOrOwner; + computeFn = computeFnOrUndefined; + } + const store = new DisposableStore(); + return new Derived(new DebugNameData(owner, void 0, computeFn), (r) => { + store.clear(); + const result = computeFn(r); + if (result) { + store.add(result); + } + return result; + }, void 0, void 0, () => store.dispose(), strictEquals); +} +var Derived, DerivedWithSetter; +var init_derived = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/observableInternal/derived.js"() { + init_assert(); + init_equals(); + init_lifecycle(); + init_base(); + init_debugName(); + init_logging(); + _setDerivedOpts(derivedOpts); + Derived = class extends BaseObservable { + get debugName() { + var _a10; + return (_a10 = this._debugNameData.getDebugName(this)) !== null && _a10 !== void 0 ? _a10 : "(anonymous)"; + } + constructor(_debugNameData, _computeFn, createChangeSummary, _handleChange, _handleLastObserverRemoved = void 0, _equalityComparator) { + var _a10, _b4; + super(); + this._debugNameData = _debugNameData; + this._computeFn = _computeFn; + this.createChangeSummary = createChangeSummary; + this._handleChange = _handleChange; + this._handleLastObserverRemoved = _handleLastObserverRemoved; + this._equalityComparator = _equalityComparator; + this.state = 0; + this.value = void 0; + this.updateCount = 0; + this.dependencies = /* @__PURE__ */ new Set(); + this.dependenciesToBeRemoved = /* @__PURE__ */ new Set(); + this.changeSummary = void 0; + this.changeSummary = (_a10 = this.createChangeSummary) === null || _a10 === void 0 ? void 0 : _a10.call(this); + (_b4 = getLogger()) === null || _b4 === void 0 ? void 0 : _b4.handleDerivedCreated(this); + } + onLastObserverRemoved() { + var _a10; + this.state = 0; + this.value = void 0; + for (const d of this.dependencies) { + d.removeObserver(this); + } + this.dependencies.clear(); + (_a10 = this._handleLastObserverRemoved) === null || _a10 === void 0 ? void 0 : _a10.call(this); + } + get() { + var _a10; + if (this.observers.size === 0) { + const result = this._computeFn(this, (_a10 = this.createChangeSummary) === null || _a10 === void 0 ? void 0 : _a10.call(this)); + this.onLastObserverRemoved(); + return result; + } else { + do { + if (this.state === 1) { + for (const d of this.dependencies) { + d.reportChanges(); + if (this.state === 2) { + break; + } + } + } + if (this.state === 1) { + this.state = 3; + } + this._recomputeIfNeeded(); + } while (this.state !== 3); + return this.value; + } + } + _recomputeIfNeeded() { + var _a10, _b4; + if (this.state === 3) { + return; + } + const emptySet = this.dependenciesToBeRemoved; + this.dependenciesToBeRemoved = this.dependencies; + this.dependencies = emptySet; + const hadValue = this.state !== 0; + const oldValue = this.value; + this.state = 3; + const changeSummary = this.changeSummary; + this.changeSummary = (_a10 = this.createChangeSummary) === null || _a10 === void 0 ? void 0 : _a10.call(this); + try { + this.value = this._computeFn(this, changeSummary); + } finally { + for (const o of this.dependenciesToBeRemoved) { + o.removeObserver(this); + } + this.dependenciesToBeRemoved.clear(); + } + const didChange = hadValue && !this._equalityComparator(oldValue, this.value); + (_b4 = getLogger()) === null || _b4 === void 0 ? void 0 : _b4.handleDerivedRecomputed(this, { + oldValue, + newValue: this.value, + change: void 0, + didChange, + hadValue + }); + if (didChange) { + for (const r of this.observers) { + r.handleChange(this, void 0); + } + } + } + toString() { + return `LazyDerived<${this.debugName}>`; + } + // IObserver Implementation + beginUpdate(_observable) { + this.updateCount++; + const propagateBeginUpdate = this.updateCount === 1; + if (this.state === 3) { + this.state = 1; + if (!propagateBeginUpdate) { + for (const r of this.observers) { + r.handlePossibleChange(this); + } + } + } + if (propagateBeginUpdate) { + for (const r of this.observers) { + r.beginUpdate(this); + } + } + } + endUpdate(_observable) { + this.updateCount--; + if (this.updateCount === 0) { + const observers = [...this.observers]; + for (const r of observers) { + r.endUpdate(this); + } + } + assertFn(() => this.updateCount >= 0); + } + handlePossibleChange(observable) { + if (this.state === 3 && this.dependencies.has(observable) && !this.dependenciesToBeRemoved.has(observable)) { + this.state = 1; + for (const r of this.observers) { + r.handlePossibleChange(this); + } + } + } + handleChange(observable, change) { + if (this.dependencies.has(observable) && !this.dependenciesToBeRemoved.has(observable)) { + const shouldReact = this._handleChange ? this._handleChange({ + changedObservable: observable, + change, + didChange: (o) => o === observable + }, this.changeSummary) : true; + const wasUpToDate = this.state === 3; + if (shouldReact && (this.state === 1 || wasUpToDate)) { + this.state = 2; + if (wasUpToDate) { + for (const r of this.observers) { + r.handlePossibleChange(this); + } + } + } + } + } + // IReader Implementation + readObservable(observable) { + observable.addObserver(this); + const value = observable.get(); + this.dependencies.add(observable); + this.dependenciesToBeRemoved.delete(observable); + return value; + } + addObserver(observer) { + const shouldCallBeginUpdate = !this.observers.has(observer) && this.updateCount > 0; + super.addObserver(observer); + if (shouldCallBeginUpdate) { + observer.beginUpdate(this); + } + } + removeObserver(observer) { + const shouldCallEndUpdate = this.observers.has(observer) && this.updateCount > 0; + super.removeObserver(observer); + if (shouldCallEndUpdate) { + observer.endUpdate(this); + } + } + }; + DerivedWithSetter = class extends Derived { + constructor(debugNameData, computeFn, createChangeSummary, handleChange, handleLastObserverRemoved = void 0, equalityComparator, set) { + super(debugNameData, computeFn, createChangeSummary, handleChange, handleLastObserverRemoved, equalityComparator); + this.set = set; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/observableInternal/autorun.js +function autorun(fn) { + return new AutorunObserver(new DebugNameData(void 0, void 0, fn), fn, void 0, void 0); +} +function autorunOpts(options2, fn) { + var _a10; + return new AutorunObserver(new DebugNameData(options2.owner, options2.debugName, (_a10 = options2.debugReferenceFn) !== null && _a10 !== void 0 ? _a10 : fn), fn, void 0, void 0); +} +function autorunHandleChanges(options2, fn) { + var _a10; + return new AutorunObserver(new DebugNameData(options2.owner, options2.debugName, (_a10 = options2.debugReferenceFn) !== null && _a10 !== void 0 ? _a10 : fn), fn, options2.createEmptyChangeSummary, options2.handleChange); +} +function autorunWithStore(fn) { + const store = new DisposableStore(); + const disposable = autorunOpts({ + owner: void 0, + debugName: void 0, + debugReferenceFn: fn + }, (reader) => { + store.clear(); + fn(reader, store); + }); + return toDisposable(() => { + disposable.dispose(); + store.dispose(); + }); +} +var AutorunObserver; +var init_autorun = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/observableInternal/autorun.js"() { + init_assert(); + init_lifecycle(); + init_debugName(); + init_logging(); + AutorunObserver = class { + get debugName() { + var _a10; + return (_a10 = this._debugNameData.getDebugName(this)) !== null && _a10 !== void 0 ? _a10 : "(anonymous)"; + } + constructor(_debugNameData, _runFn, createChangeSummary, _handleChange) { + var _a10, _b4; + this._debugNameData = _debugNameData; + this._runFn = _runFn; + this.createChangeSummary = createChangeSummary; + this._handleChange = _handleChange; + this.state = 2; + this.updateCount = 0; + this.disposed = false; + this.dependencies = /* @__PURE__ */ new Set(); + this.dependenciesToBeRemoved = /* @__PURE__ */ new Set(); + this.changeSummary = (_a10 = this.createChangeSummary) === null || _a10 === void 0 ? void 0 : _a10.call(this); + (_b4 = getLogger()) === null || _b4 === void 0 ? void 0 : _b4.handleAutorunCreated(this); + this._runIfNeeded(); + trackDisposable(this); + } + dispose() { + this.disposed = true; + for (const o of this.dependencies) { + o.removeObserver(this); + } + this.dependencies.clear(); + markAsDisposed(this); + } + _runIfNeeded() { + var _a10, _b4, _c2; + if (this.state === 3) { + return; + } + const emptySet = this.dependenciesToBeRemoved; + this.dependenciesToBeRemoved = this.dependencies; + this.dependencies = emptySet; + this.state = 3; + const isDisposed = this.disposed; + try { + if (!isDisposed) { + (_a10 = getLogger()) === null || _a10 === void 0 ? void 0 : _a10.handleAutorunTriggered(this); + const changeSummary = this.changeSummary; + this.changeSummary = (_b4 = this.createChangeSummary) === null || _b4 === void 0 ? void 0 : _b4.call(this); + this._runFn(this, changeSummary); + } + } finally { + if (!isDisposed) { + (_c2 = getLogger()) === null || _c2 === void 0 ? void 0 : _c2.handleAutorunFinished(this); + } + for (const o of this.dependenciesToBeRemoved) { + o.removeObserver(this); + } + this.dependenciesToBeRemoved.clear(); + } + } + toString() { + return `Autorun<${this.debugName}>`; + } + // IObserver implementation + beginUpdate() { + if (this.state === 3) { + this.state = 1; + } + this.updateCount++; + } + endUpdate() { + if (this.updateCount === 1) { + do { + if (this.state === 1) { + this.state = 3; + for (const d of this.dependencies) { + d.reportChanges(); + if (this.state === 2) { + break; + } + } + } + this._runIfNeeded(); + } while (this.state !== 3); + } + this.updateCount--; + assertFn(() => this.updateCount >= 0); + } + handlePossibleChange(observable) { + if (this.state === 3 && this.dependencies.has(observable) && !this.dependenciesToBeRemoved.has(observable)) { + this.state = 1; + } + } + handleChange(observable, change) { + if (this.dependencies.has(observable) && !this.dependenciesToBeRemoved.has(observable)) { + const shouldReact = this._handleChange ? this._handleChange({ + changedObservable: observable, + change, + didChange: (o) => o === observable + }, this.changeSummary) : true; + if (shouldReact) { + this.state = 2; + } + } + } + // IReader implementation + readObservable(observable) { + if (this.disposed) { + return observable.get(); + } + observable.addObserver(this); + const value = observable.get(); + this.dependencies.add(observable); + this.dependenciesToBeRemoved.delete(observable); + return value; + } + }; + (function(autorun2) { + autorun2.Observer = AutorunObserver; + })(autorun || (autorun = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/observableInternal/utils.js +function constObservable(value) { + return new ConstObservable(value); +} +function observableFromEvent(event, getValue) { + return new FromEventObservable(event, getValue); +} +function observableSignalFromEvent(debugName, event) { + return new FromEventObservableSignal(debugName, event); +} +function observableSignal(debugNameOrOwner) { + if (typeof debugNameOrOwner === "string") { + return new ObservableSignal(debugNameOrOwner); + } else { + return new ObservableSignal(void 0, debugNameOrOwner); + } +} +function keepObserved(observable) { + const o = new KeepAliveObserver(false, void 0); + observable.addObserver(o); + return toDisposable(() => { + observable.removeObserver(o); + }); +} +function recomputeInitiallyAndOnChange(observable, handleValue) { + const o = new KeepAliveObserver(true, handleValue); + observable.addObserver(o); + if (handleValue) { + handleValue(observable.get()); + } else { + observable.reportChanges(); + } + return toDisposable(() => { + observable.removeObserver(o); + }); +} +function derivedObservableWithCache(owner, computeFn) { + let lastValue = void 0; + const observable = derived(owner, (reader) => { + lastValue = computeFn(reader, lastValue); + return lastValue; + }); + return observable; +} +function mapObservableArrayCached(owner, items, map, keySelector) { + let m = new ArrayMap(map, keySelector); + const self2 = derivedOpts({ + debugReferenceFn: map, + owner, + onLastObserverRemoved: () => { + m.dispose(); + m = new ArrayMap(map); + } + }, (reader) => { + m.setItems(items.read(reader)); + return m.getItems(); + }); + return self2; +} +var ConstObservable, FromEventObservable, FromEventObservableSignal, ObservableSignal, KeepAliveObserver, ArrayMap; +var init_utils3 = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/observableInternal/utils.js"() { + init_event(); + init_lifecycle(); + init_base(); + init_debugName(); + init_derived(); + init_logging(); + ConstObservable = class extends ConvenientObservable { + constructor(value) { + super(); + this.value = value; + } + get debugName() { + return this.toString(); + } + get() { + return this.value; + } + addObserver(observer) { + } + removeObserver(observer) { + } + toString() { + return `Const: ${this.value}`; + } + }; + FromEventObservable = class _FromEventObservable extends BaseObservable { + constructor(event, _getValue) { + super(); + this.event = event; + this._getValue = _getValue; + this.hasValue = false; + this.handleEvent = (args) => { + var _a10; + const newValue = this._getValue(args); + const oldValue = this.value; + const didChange = !this.hasValue || oldValue !== newValue; + let didRunTransaction = false; + if (didChange) { + this.value = newValue; + if (this.hasValue) { + didRunTransaction = true; + subtransaction(_FromEventObservable.globalTransaction, (tx) => { + var _a11; + (_a11 = getLogger()) === null || _a11 === void 0 ? void 0 : _a11.handleFromEventObservableTriggered(this, { oldValue, newValue, change: void 0, didChange, hadValue: this.hasValue }); + for (const o of this.observers) { + tx.updateObserver(o, this); + o.handleChange(this, void 0); + } + }, () => { + const name = this.getDebugName(); + return "Event fired" + (name ? `: ${name}` : ""); + }); + } + this.hasValue = true; + } + if (!didRunTransaction) { + (_a10 = getLogger()) === null || _a10 === void 0 ? void 0 : _a10.handleFromEventObservableTriggered(this, { oldValue, newValue, change: void 0, didChange, hadValue: this.hasValue }); + } + }; + } + getDebugName() { + return getFunctionName(this._getValue); + } + get debugName() { + const name = this.getDebugName(); + return "From Event" + (name ? `: ${name}` : ""); + } + onFirstObserverAdded() { + this.subscription = this.event(this.handleEvent); + } + onLastObserverRemoved() { + this.subscription.dispose(); + this.subscription = void 0; + this.hasValue = false; + this.value = void 0; + } + get() { + if (this.subscription) { + if (!this.hasValue) { + this.handleEvent(void 0); + } + return this.value; + } else { + const value = this._getValue(void 0); + return value; + } + } + }; + (function(observableFromEvent2) { + observableFromEvent2.Observer = FromEventObservable; + function batchEventsGlobally(tx, fn) { + let didSet = false; + if (FromEventObservable.globalTransaction === void 0) { + FromEventObservable.globalTransaction = tx; + didSet = true; + } + try { + fn(); + } finally { + if (didSet) { + FromEventObservable.globalTransaction = void 0; + } + } + } + observableFromEvent2.batchEventsGlobally = batchEventsGlobally; + })(observableFromEvent || (observableFromEvent = {})); + FromEventObservableSignal = class extends BaseObservable { + constructor(debugName, event) { + super(); + this.debugName = debugName; + this.event = event; + this.handleEvent = () => { + transaction((tx) => { + for (const o of this.observers) { + tx.updateObserver(o, this); + o.handleChange(this, void 0); + } + }, () => this.debugName); + }; + } + onFirstObserverAdded() { + this.subscription = this.event(this.handleEvent); + } + onLastObserverRemoved() { + this.subscription.dispose(); + this.subscription = void 0; + } + get() { + } + }; + ObservableSignal = class extends BaseObservable { + get debugName() { + var _a10; + return (_a10 = new DebugNameData(this._owner, this._debugName, void 0).getDebugName(this)) !== null && _a10 !== void 0 ? _a10 : "Observable Signal"; + } + constructor(_debugName, _owner) { + super(); + this._debugName = _debugName; + this._owner = _owner; + } + trigger(tx, change) { + if (!tx) { + transaction((tx2) => { + this.trigger(tx2, change); + }, () => `Trigger signal ${this.debugName}`); + return; + } + for (const o of this.observers) { + tx.updateObserver(o, this); + o.handleChange(this, change); + } + } + get() { + } + }; + _setKeepObserved(keepObserved); + _setRecomputeInitiallyAndOnChange(recomputeInitiallyAndOnChange); + KeepAliveObserver = class { + constructor(_forceRecompute, _handleValue) { + this._forceRecompute = _forceRecompute; + this._handleValue = _handleValue; + this._counter = 0; + } + beginUpdate(observable) { + this._counter++; + } + endUpdate(observable) { + this._counter--; + if (this._counter === 0 && this._forceRecompute) { + if (this._handleValue) { + this._handleValue(observable.get()); + } else { + observable.reportChanges(); + } + } + } + handlePossibleChange(observable) { + } + handleChange(observable, change) { + } + }; + ArrayMap = class { + constructor(_map, _keySelector) { + this._map = _map; + this._keySelector = _keySelector; + this._cache = /* @__PURE__ */ new Map(); + this._items = []; + } + dispose() { + this._cache.forEach((entry) => entry.store.dispose()); + this._cache.clear(); + } + setItems(items) { + const newItems = []; + const itemsToRemove = new Set(this._cache.keys()); + for (const item of items) { + const key = this._keySelector ? this._keySelector(item) : item; + let entry = this._cache.get(key); + if (!entry) { + const store = new DisposableStore(); + const out = this._map(item, store); + entry = { out, store }; + this._cache.set(key, entry); + } else { + itemsToRemove.delete(key); + } + newItems.push(entry.out); + } + for (const item of itemsToRemove) { + const entry = this._cache.get(item); + entry.store.dispose(); + this._cache.delete(item); + } + this._items = newItems; + } + getItems() { + return this._items; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/observableInternal/promise.js +function waitForState(observable, predicate, isError, cancellationToken) { + if (!predicate) { + predicate = (state) => state !== null && state !== void 0; + } + return new Promise((resolve2, reject) => { + let isImmediateRun = true; + let shouldDispose = false; + const stateObs = observable.map((state) => { + return { + isFinished: predicate(state), + error: isError ? isError(state) : false, + state + }; + }); + const d = autorun((reader) => { + const { isFinished, error, state } = stateObs.read(reader); + if (isFinished || error) { + if (isImmediateRun) { + shouldDispose = true; + } else { + d.dispose(); + } + if (error) { + reject(error === true ? state : error); + } else { + resolve2(state); + } + } + }); + if (cancellationToken) { + const dc = cancellationToken.onCancellationRequested(() => { + d.dispose(); + dc.dispose(); + reject(new CancellationError()); + }); + if (cancellationToken.isCancellationRequested) { + d.dispose(); + dc.dispose(); + reject(new CancellationError()); + return; + } + } + isImmediateRun = false; + if (shouldDispose) { + d.dispose(); + } + }); +} +var init_promise = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/observableInternal/promise.js"() { + init_autorun(); + init_errors(); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/observable.js +var enableLogging; +var init_observable = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/observable.js"() { + init_base(); + init_derived(); + init_autorun(); + init_utils3(); + init_promise(); + init_logging(); + enableLogging = false; + if (enableLogging) { + setLogger(new ConsoleObservableLogger()); + } + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/list/listWidget.js +function isInputElement(e) { + return e.tagName === "INPUT" || e.tagName === "TEXTAREA"; +} +function isListElementDescendantOfClass(e, className) { + if (e.classList.contains(className)) { + return true; + } + if (e.classList.contains("monaco-list")) { + return false; + } + if (!e.parentElement) { + return false; + } + return isListElementDescendantOfClass(e.parentElement, className); +} +function isMonacoEditor(e) { + return isListElementDescendantOfClass(e, "monaco-editor"); +} +function isMonacoCustomToggle(e) { + return isListElementDescendantOfClass(e, "monaco-custom-toggle"); +} +function isActionItem(e) { + return isListElementDescendantOfClass(e, "action-item"); +} +function isStickyScrollElement(e) { + return isListElementDescendantOfClass(e, "monaco-tree-sticky-row"); +} +function isStickyScrollContainer(e) { + return e.classList.contains("monaco-tree-sticky-container"); +} +function isButton(e) { + if (e.tagName === "A" && e.classList.contains("monaco-button") || e.tagName === "DIV" && e.classList.contains("monaco-button-dropdown")) { + return true; + } + if (e.classList.contains("monaco-list")) { + return false; + } + if (!e.parentElement) { + return false; + } + return isButton(e.parentElement); +} +function isSelectionSingleChangeEvent(event) { + return isMacintosh ? event.browserEvent.metaKey : event.browserEvent.ctrlKey; +} +function isSelectionRangeChangeEvent(event) { + return event.browserEvent.shiftKey; +} +function isMouseRightClick(event) { + return isMouseEvent(event) && event.button === 2; +} +function getContiguousRangeContaining(range2, value) { + const index = range2.indexOf(value); + if (index === -1) { + return []; + } + const result = []; + let i = index - 1; + while (i >= 0 && range2[i] === value - (index - i)) { + result.push(range2[i--]); + } + result.reverse(); + i = index; + while (i < range2.length && range2[i] === value + (i - index)) { + result.push(range2[i++]); + } + return result; +} +function disjunction(one, other) { + const result = []; + let i = 0, j = 0; + while (i < one.length || j < other.length) { + if (i >= one.length) { + result.push(other[j++]); + } else if (j >= other.length) { + result.push(one[i++]); + } else if (one[i] === other[j]) { + result.push(one[i]); + i++; + j++; + continue; + } else if (one[i] < other[j]) { + result.push(one[i++]); + } else { + result.push(other[j++]); + } + } + return result; +} +function relativeComplement(one, other) { + const result = []; + let i = 0, j = 0; + while (i < one.length || j < other.length) { + if (i >= one.length) { + result.push(other[j++]); + } else if (j >= other.length) { + result.push(one[i++]); + } else if (one[i] === other[j]) { + i++; + j++; + continue; + } else if (one[i] < other[j]) { + result.push(one[i++]); + } else { + j++; + } + } + return result; +} +var __decorate27, TraitRenderer, Trait, SelectionTrait, TraitSpliceable, KeyboardController, TypeNavigationMode, TypeNavigationControllerState, DefaultKeyboardNavigationDelegate, TypeNavigationController, DOMFocusController, DefaultMultipleSelectionController, MouseController, DefaultStyleController, unthemedListStyles, DefaultOptions2, numericSort, PipelineRenderer, AccessibiltyRenderer, ListViewDragAndDrop, List; +var init_listWidget = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/list/listWidget.js"() { + init_dom(); + init_event2(); + init_keyboardEvent(); + init_touch(); + init_aria2(); + init_splice(); + init_arrays(); + init_async(); + init_color(); + init_decorators(); + init_event(); + init_filters(); + init_lifecycle(); + init_numbers(); + init_platform(); + init_types(); + init_list(); + init_list2(); + init_listView(); + init_mouseEvent(); + init_observable(); + __decorate27 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + TraitRenderer = class { + constructor(trait) { + this.trait = trait; + this.renderedElements = []; + } + get templateId() { + return `template:${this.trait.name}`; + } + renderTemplate(container) { + return container; + } + renderElement(element, index, templateData) { + const renderedElementIndex = this.renderedElements.findIndex((el) => el.templateData === templateData); + if (renderedElementIndex >= 0) { + const rendered = this.renderedElements[renderedElementIndex]; + this.trait.unrender(templateData); + rendered.index = index; + } else { + const rendered = { index, templateData }; + this.renderedElements.push(rendered); + } + this.trait.renderIndex(index, templateData); + } + splice(start, deleteCount, insertCount) { + const rendered = []; + for (const renderedElement of this.renderedElements) { + if (renderedElement.index < start) { + rendered.push(renderedElement); + } else if (renderedElement.index >= start + deleteCount) { + rendered.push({ + index: renderedElement.index + insertCount - deleteCount, + templateData: renderedElement.templateData + }); + } + } + this.renderedElements = rendered; + } + renderIndexes(indexes) { + for (const { index, templateData } of this.renderedElements) { + if (indexes.indexOf(index) > -1) { + this.trait.renderIndex(index, templateData); + } + } + } + disposeTemplate(templateData) { + const index = this.renderedElements.findIndex((el) => el.templateData === templateData); + if (index < 0) { + return; + } + this.renderedElements.splice(index, 1); + } + }; + Trait = class { + get name() { + return this._trait; + } + get renderer() { + return new TraitRenderer(this); + } + constructor(_trait) { + this._trait = _trait; + this.indexes = []; + this.sortedIndexes = []; + this._onChange = new Emitter(); + this.onChange = this._onChange.event; + } + splice(start, deleteCount, elements) { + const diff = elements.length - deleteCount; + const end = start + deleteCount; + const sortedIndexes = []; + let i = 0; + while (i < this.sortedIndexes.length && this.sortedIndexes[i] < start) { + sortedIndexes.push(this.sortedIndexes[i++]); + } + for (let j = 0; j < elements.length; j++) { + if (elements[j]) { + sortedIndexes.push(j + start); + } + } + while (i < this.sortedIndexes.length && this.sortedIndexes[i] >= end) { + sortedIndexes.push(this.sortedIndexes[i++] + diff); + } + this.renderer.splice(start, deleteCount, elements.length); + this._set(sortedIndexes, sortedIndexes); + } + renderIndex(index, container) { + container.classList.toggle(this._trait, this.contains(index)); + } + unrender(container) { + container.classList.remove(this._trait); + } + /** + * Sets the indexes which should have this trait. + * + * @param indexes Indexes which should have this trait. + * @return The old indexes which had this trait. + */ + set(indexes, browserEvent) { + return this._set(indexes, [...indexes].sort(numericSort), browserEvent); + } + _set(indexes, sortedIndexes, browserEvent) { + const result = this.indexes; + const sortedResult = this.sortedIndexes; + this.indexes = indexes; + this.sortedIndexes = sortedIndexes; + const toRender = disjunction(sortedResult, indexes); + this.renderer.renderIndexes(toRender); + this._onChange.fire({ indexes, browserEvent }); + return result; + } + get() { + return this.indexes; + } + contains(index) { + return binarySearch(this.sortedIndexes, index, numericSort) >= 0; + } + dispose() { + dispose(this._onChange); + } + }; + __decorate27([ + memoize + ], Trait.prototype, "renderer", null); + SelectionTrait = class extends Trait { + constructor(setAriaSelected) { + super("selected"); + this.setAriaSelected = setAriaSelected; + } + renderIndex(index, container) { + super.renderIndex(index, container); + if (this.setAriaSelected) { + if (this.contains(index)) { + container.setAttribute("aria-selected", "true"); + } else { + container.setAttribute("aria-selected", "false"); + } + } + } + }; + TraitSpliceable = class { + constructor(trait, view, identityProvider) { + this.trait = trait; + this.view = view; + this.identityProvider = identityProvider; + } + splice(start, deleteCount, elements) { + if (!this.identityProvider) { + return this.trait.splice(start, deleteCount, new Array(elements.length).fill(false)); + } + const pastElementsWithTrait = this.trait.get().map((i) => this.identityProvider.getId(this.view.element(i)).toString()); + if (pastElementsWithTrait.length === 0) { + return this.trait.splice(start, deleteCount, new Array(elements.length).fill(false)); + } + const pastElementsWithTraitSet = new Set(pastElementsWithTrait); + const elementsWithTrait = elements.map((e) => pastElementsWithTraitSet.has(this.identityProvider.getId(e).toString())); + this.trait.splice(start, deleteCount, elementsWithTrait); + } + }; + KeyboardController = class { + get onKeyDown() { + return Event.chain(this.disposables.add(new DomEmitter(this.view.domNode, "keydown")).event, ($16) => $16.filter((e) => !isInputElement(e.target)).map((e) => new StandardKeyboardEvent(e))); + } + constructor(list, view, options2) { + this.list = list; + this.view = view; + this.disposables = new DisposableStore(); + this.multipleSelectionDisposables = new DisposableStore(); + this.multipleSelectionSupport = options2.multipleSelectionSupport; + this.disposables.add(this.onKeyDown((e) => { + switch (e.keyCode) { + case 3: + return this.onEnter(e); + case 16: + return this.onUpArrow(e); + case 18: + return this.onDownArrow(e); + case 11: + return this.onPageUpArrow(e); + case 12: + return this.onPageDownArrow(e); + case 9: + return this.onEscape(e); + case 31: + if (this.multipleSelectionSupport && (isMacintosh ? e.metaKey : e.ctrlKey)) { + this.onCtrlA(e); + } + } + })); + } + updateOptions(optionsUpdate) { + if (optionsUpdate.multipleSelectionSupport !== void 0) { + this.multipleSelectionSupport = optionsUpdate.multipleSelectionSupport; + } + } + onEnter(e) { + e.preventDefault(); + e.stopPropagation(); + this.list.setSelection(this.list.getFocus(), e.browserEvent); + } + onUpArrow(e) { + e.preventDefault(); + e.stopPropagation(); + this.list.focusPrevious(1, false, e.browserEvent); + const el = this.list.getFocus()[0]; + this.list.setAnchor(el); + this.list.reveal(el); + this.view.domNode.focus(); + } + onDownArrow(e) { + e.preventDefault(); + e.stopPropagation(); + this.list.focusNext(1, false, e.browserEvent); + const el = this.list.getFocus()[0]; + this.list.setAnchor(el); + this.list.reveal(el); + this.view.domNode.focus(); + } + onPageUpArrow(e) { + e.preventDefault(); + e.stopPropagation(); + this.list.focusPreviousPage(e.browserEvent); + const el = this.list.getFocus()[0]; + this.list.setAnchor(el); + this.list.reveal(el); + this.view.domNode.focus(); + } + onPageDownArrow(e) { + e.preventDefault(); + e.stopPropagation(); + this.list.focusNextPage(e.browserEvent); + const el = this.list.getFocus()[0]; + this.list.setAnchor(el); + this.list.reveal(el); + this.view.domNode.focus(); + } + onCtrlA(e) { + e.preventDefault(); + e.stopPropagation(); + this.list.setSelection(range(this.list.length), e.browserEvent); + this.list.setAnchor(void 0); + this.view.domNode.focus(); + } + onEscape(e) { + if (this.list.getSelection().length) { + e.preventDefault(); + e.stopPropagation(); + this.list.setSelection([], e.browserEvent); + this.list.setAnchor(void 0); + this.view.domNode.focus(); + } + } + dispose() { + this.disposables.dispose(); + this.multipleSelectionDisposables.dispose(); + } + }; + __decorate27([ + memoize + ], KeyboardController.prototype, "onKeyDown", null); + (function(TypeNavigationMode2) { + TypeNavigationMode2[TypeNavigationMode2["Automatic"] = 0] = "Automatic"; + TypeNavigationMode2[TypeNavigationMode2["Trigger"] = 1] = "Trigger"; + })(TypeNavigationMode || (TypeNavigationMode = {})); + (function(TypeNavigationControllerState2) { + TypeNavigationControllerState2[TypeNavigationControllerState2["Idle"] = 0] = "Idle"; + TypeNavigationControllerState2[TypeNavigationControllerState2["Typing"] = 1] = "Typing"; + })(TypeNavigationControllerState || (TypeNavigationControllerState = {})); + DefaultKeyboardNavigationDelegate = new class { + mightProducePrintableCharacter(event) { + if (event.ctrlKey || event.metaKey || event.altKey) { + return false; + } + return event.keyCode >= 31 && event.keyCode <= 56 || event.keyCode >= 21 && event.keyCode <= 30 || event.keyCode >= 98 && event.keyCode <= 107 || event.keyCode >= 85 && event.keyCode <= 95; + } + }(); + TypeNavigationController = class { + constructor(list, view, keyboardNavigationLabelProvider, keyboardNavigationEventFilter, delegate) { + this.list = list; + this.view = view; + this.keyboardNavigationLabelProvider = keyboardNavigationLabelProvider; + this.keyboardNavigationEventFilter = keyboardNavigationEventFilter; + this.delegate = delegate; + this.enabled = false; + this.state = TypeNavigationControllerState.Idle; + this.mode = TypeNavigationMode.Automatic; + this.triggered = false; + this.previouslyFocused = -1; + this.enabledDisposables = new DisposableStore(); + this.disposables = new DisposableStore(); + this.updateOptions(list.options); + } + updateOptions(options2) { + var _a10, _b4; + if ((_a10 = options2.typeNavigationEnabled) !== null && _a10 !== void 0 ? _a10 : true) { + this.enable(); + } else { + this.disable(); + } + this.mode = (_b4 = options2.typeNavigationMode) !== null && _b4 !== void 0 ? _b4 : TypeNavigationMode.Automatic; + } + enable() { + if (this.enabled) { + return; + } + let typing = false; + const onChar = Event.chain(this.enabledDisposables.add(new DomEmitter(this.view.domNode, "keydown")).event, ($16) => $16.filter((e) => !isInputElement(e.target)).filter(() => this.mode === TypeNavigationMode.Automatic || this.triggered).map((event) => new StandardKeyboardEvent(event)).filter((e) => typing || this.keyboardNavigationEventFilter(e)).filter((e) => this.delegate.mightProducePrintableCharacter(e)).forEach((e) => EventHelper.stop(e, true)).map((event) => event.browserEvent.key)); + const onClear = Event.debounce(onChar, () => null, 800, void 0, void 0, void 0, this.enabledDisposables); + const onInput = Event.reduce(Event.any(onChar, onClear), (r, i) => i === null ? null : (r || "") + i, void 0, this.enabledDisposables); + onInput(this.onInput, this, this.enabledDisposables); + onClear(this.onClear, this, this.enabledDisposables); + onChar(() => typing = true, void 0, this.enabledDisposables); + onClear(() => typing = false, void 0, this.enabledDisposables); + this.enabled = true; + this.triggered = false; + } + disable() { + if (!this.enabled) { + return; + } + this.enabledDisposables.clear(); + this.enabled = false; + this.triggered = false; + } + onClear() { + var _a10; + const focus = this.list.getFocus(); + if (focus.length > 0 && focus[0] === this.previouslyFocused) { + const ariaLabel = (_a10 = this.list.options.accessibilityProvider) === null || _a10 === void 0 ? void 0 : _a10.getAriaLabel(this.list.element(focus[0])); + if (typeof ariaLabel === "string") { + alert(ariaLabel); + } else if (ariaLabel) { + alert(ariaLabel.get()); + } + } + this.previouslyFocused = -1; + } + onInput(word) { + if (!word) { + this.state = TypeNavigationControllerState.Idle; + this.triggered = false; + return; + } + const focus = this.list.getFocus(); + const start = focus.length > 0 ? focus[0] : 0; + const delta = this.state === TypeNavigationControllerState.Idle ? 1 : 0; + this.state = TypeNavigationControllerState.Typing; + for (let i = 0; i < this.list.length; i++) { + const index = (start + i + delta) % this.list.length; + const label = this.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(this.view.element(index)); + const labelStr = label && label.toString(); + if (this.list.options.typeNavigationEnabled) { + if (typeof labelStr !== "undefined") { + if (matchesPrefix(word, labelStr)) { + this.previouslyFocused = start; + this.list.setFocus([index]); + this.list.reveal(index); + return; + } + const fuzzy = matchesFuzzy2(word, labelStr); + if (fuzzy) { + const fuzzyScore2 = fuzzy[0].end - fuzzy[0].start; + if (fuzzyScore2 > 1 && fuzzy.length === 1) { + this.previouslyFocused = start; + this.list.setFocus([index]); + this.list.reveal(index); + return; + } + } + } + } else if (typeof labelStr === "undefined" || matchesPrefix(word, labelStr)) { + this.previouslyFocused = start; + this.list.setFocus([index]); + this.list.reveal(index); + return; + } + } + } + dispose() { + this.disable(); + this.enabledDisposables.dispose(); + this.disposables.dispose(); + } + }; + DOMFocusController = class { + constructor(list, view) { + this.list = list; + this.view = view; + this.disposables = new DisposableStore(); + const onKeyDown = Event.chain(this.disposables.add(new DomEmitter(view.domNode, "keydown")).event, ($16) => $16.filter((e) => !isInputElement(e.target)).map((e) => new StandardKeyboardEvent(e))); + const onTab = Event.chain(onKeyDown, ($16) => $16.filter((e) => e.keyCode === 2 && !e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey)); + onTab(this.onTab, this, this.disposables); + } + onTab(e) { + if (e.target !== this.view.domNode) { + return; + } + const focus = this.list.getFocus(); + if (focus.length === 0) { + return; + } + const focusedDomElement = this.view.domElement(focus[0]); + if (!focusedDomElement) { + return; + } + const tabIndexElement = focusedDomElement.querySelector("[tabIndex]"); + if (!tabIndexElement || !isHTMLElement(tabIndexElement) || tabIndexElement.tabIndex === -1) { + return; + } + const style = getWindow(tabIndexElement).getComputedStyle(tabIndexElement); + if (style.visibility === "hidden" || style.display === "none") { + return; + } + e.preventDefault(); + e.stopPropagation(); + tabIndexElement.focus(); + } + dispose() { + this.disposables.dispose(); + } + }; + DefaultMultipleSelectionController = { + isSelectionSingleChangeEvent, + isSelectionRangeChangeEvent + }; + MouseController = class { + constructor(list) { + this.list = list; + this.disposables = new DisposableStore(); + this._onPointer = new Emitter(); + this.onPointer = this._onPointer.event; + if (list.options.multipleSelectionSupport !== false) { + this.multipleSelectionController = this.list.options.multipleSelectionController || DefaultMultipleSelectionController; + } + this.mouseSupport = typeof list.options.mouseSupport === "undefined" || !!list.options.mouseSupport; + if (this.mouseSupport) { + list.onMouseDown(this.onMouseDown, this, this.disposables); + list.onContextMenu(this.onContextMenu, this, this.disposables); + list.onMouseDblClick(this.onDoubleClick, this, this.disposables); + list.onTouchStart(this.onMouseDown, this, this.disposables); + this.disposables.add(Gesture.addTarget(list.getHTMLElement())); + } + Event.any(list.onMouseClick, list.onMouseMiddleClick, list.onTap)(this.onViewPointer, this, this.disposables); + } + updateOptions(optionsUpdate) { + if (optionsUpdate.multipleSelectionSupport !== void 0) { + this.multipleSelectionController = void 0; + if (optionsUpdate.multipleSelectionSupport) { + this.multipleSelectionController = this.list.options.multipleSelectionController || DefaultMultipleSelectionController; + } + } + } + isSelectionSingleChangeEvent(event) { + if (!this.multipleSelectionController) { + return false; + } + return this.multipleSelectionController.isSelectionSingleChangeEvent(event); + } + isSelectionRangeChangeEvent(event) { + if (!this.multipleSelectionController) { + return false; + } + return this.multipleSelectionController.isSelectionRangeChangeEvent(event); + } + isSelectionChangeEvent(event) { + return this.isSelectionSingleChangeEvent(event) || this.isSelectionRangeChangeEvent(event); + } + onMouseDown(e) { + if (isMonacoEditor(e.browserEvent.target)) { + return; + } + if (getActiveElement() !== e.browserEvent.target) { + this.list.domFocus(); + } + } + onContextMenu(e) { + if (isInputElement(e.browserEvent.target) || isMonacoEditor(e.browserEvent.target)) { + return; + } + const focus = typeof e.index === "undefined" ? [] : [e.index]; + this.list.setFocus(focus, e.browserEvent); + } + onViewPointer(e) { + if (!this.mouseSupport) { + return; + } + if (isInputElement(e.browserEvent.target) || isMonacoEditor(e.browserEvent.target)) { + return; + } + if (e.browserEvent.isHandledByList) { + return; + } + e.browserEvent.isHandledByList = true; + const focus = e.index; + if (typeof focus === "undefined") { + this.list.setFocus([], e.browserEvent); + this.list.setSelection([], e.browserEvent); + this.list.setAnchor(void 0); + return; + } + if (this.isSelectionChangeEvent(e)) { + return this.changeSelection(e); + } + this.list.setFocus([focus], e.browserEvent); + this.list.setAnchor(focus); + if (!isMouseRightClick(e.browserEvent)) { + this.list.setSelection([focus], e.browserEvent); + } + this._onPointer.fire(e); + } + onDoubleClick(e) { + if (isInputElement(e.browserEvent.target) || isMonacoEditor(e.browserEvent.target)) { + return; + } + if (this.isSelectionChangeEvent(e)) { + return; + } + if (e.browserEvent.isHandledByList) { + return; + } + e.browserEvent.isHandledByList = true; + const focus = this.list.getFocus(); + this.list.setSelection(focus, e.browserEvent); + } + changeSelection(e) { + const focus = e.index; + let anchor = this.list.getAnchor(); + if (this.isSelectionRangeChangeEvent(e)) { + if (typeof anchor === "undefined") { + const currentFocus = this.list.getFocus()[0]; + anchor = currentFocus !== null && currentFocus !== void 0 ? currentFocus : focus; + this.list.setAnchor(anchor); + } + const min = Math.min(anchor, focus); + const max = Math.max(anchor, focus); + const rangeSelection = range(min, max + 1); + const selection = this.list.getSelection(); + const contiguousRange = getContiguousRangeContaining(disjunction(selection, [anchor]), anchor); + if (contiguousRange.length === 0) { + return; + } + const newSelection = disjunction(rangeSelection, relativeComplement(selection, contiguousRange)); + this.list.setSelection(newSelection, e.browserEvent); + this.list.setFocus([focus], e.browserEvent); + } else if (this.isSelectionSingleChangeEvent(e)) { + const selection = this.list.getSelection(); + const newSelection = selection.filter((i) => i !== focus); + this.list.setFocus([focus]); + this.list.setAnchor(focus); + if (selection.length === newSelection.length) { + this.list.setSelection([...newSelection, focus], e.browserEvent); + } else { + this.list.setSelection(newSelection, e.browserEvent); + } + } + } + dispose() { + this.disposables.dispose(); + } + }; + DefaultStyleController = class { + constructor(styleElement, selectorSuffix) { + this.styleElement = styleElement; + this.selectorSuffix = selectorSuffix; + } + style(styles) { + var _a10, _b4; + const suffix = this.selectorSuffix && `.${this.selectorSuffix}`; + const content = []; + if (styles.listBackground) { + content.push(`.monaco-list${suffix} .monaco-list-rows { background: ${styles.listBackground}; }`); + } + if (styles.listFocusBackground) { + content.push(`.monaco-list${suffix}:focus .monaco-list-row.focused { background-color: ${styles.listFocusBackground}; }`); + content.push(`.monaco-list${suffix}:focus .monaco-list-row.focused:hover { background-color: ${styles.listFocusBackground}; }`); + } + if (styles.listFocusForeground) { + content.push(`.monaco-list${suffix}:focus .monaco-list-row.focused { color: ${styles.listFocusForeground}; }`); + } + if (styles.listActiveSelectionBackground) { + content.push(`.monaco-list${suffix}:focus .monaco-list-row.selected { background-color: ${styles.listActiveSelectionBackground}; }`); + content.push(`.monaco-list${suffix}:focus .monaco-list-row.selected:hover { background-color: ${styles.listActiveSelectionBackground}; }`); + } + if (styles.listActiveSelectionForeground) { + content.push(`.monaco-list${suffix}:focus .monaco-list-row.selected { color: ${styles.listActiveSelectionForeground}; }`); + } + if (styles.listActiveSelectionIconForeground) { + content.push(`.monaco-list${suffix}:focus .monaco-list-row.selected .codicon { color: ${styles.listActiveSelectionIconForeground}; }`); + } + if (styles.listFocusAndSelectionBackground) { + content.push(` + .monaco-drag-image, + .monaco-list${suffix}:focus .monaco-list-row.selected.focused { background-color: ${styles.listFocusAndSelectionBackground}; } + `); + } + if (styles.listFocusAndSelectionForeground) { + content.push(` + .monaco-drag-image, + .monaco-list${suffix}:focus .monaco-list-row.selected.focused { color: ${styles.listFocusAndSelectionForeground}; } + `); + } + if (styles.listInactiveFocusForeground) { + content.push(`.monaco-list${suffix} .monaco-list-row.focused { color: ${styles.listInactiveFocusForeground}; }`); + content.push(`.monaco-list${suffix} .monaco-list-row.focused:hover { color: ${styles.listInactiveFocusForeground}; }`); + } + if (styles.listInactiveSelectionIconForeground) { + content.push(`.monaco-list${suffix} .monaco-list-row.focused .codicon { color: ${styles.listInactiveSelectionIconForeground}; }`); + } + if (styles.listInactiveFocusBackground) { + content.push(`.monaco-list${suffix} .monaco-list-row.focused { background-color: ${styles.listInactiveFocusBackground}; }`); + content.push(`.monaco-list${suffix} .monaco-list-row.focused:hover { background-color: ${styles.listInactiveFocusBackground}; }`); + } + if (styles.listInactiveSelectionBackground) { + content.push(`.monaco-list${suffix} .monaco-list-row.selected { background-color: ${styles.listInactiveSelectionBackground}; }`); + content.push(`.monaco-list${suffix} .monaco-list-row.selected:hover { background-color: ${styles.listInactiveSelectionBackground}; }`); + } + if (styles.listInactiveSelectionForeground) { + content.push(`.monaco-list${suffix} .monaco-list-row.selected { color: ${styles.listInactiveSelectionForeground}; }`); + } + if (styles.listHoverBackground) { + content.push(`.monaco-list${suffix}:not(.drop-target):not(.dragging) .monaco-list-row:hover:not(.selected):not(.focused) { background-color: ${styles.listHoverBackground}; }`); + } + if (styles.listHoverForeground) { + content.push(`.monaco-list${suffix}:not(.drop-target):not(.dragging) .monaco-list-row:hover:not(.selected):not(.focused) { color: ${styles.listHoverForeground}; }`); + } + const focusAndSelectionOutline = asCssValueWithDefault(styles.listFocusAndSelectionOutline, asCssValueWithDefault(styles.listSelectionOutline, (_a10 = styles.listFocusOutline) !== null && _a10 !== void 0 ? _a10 : "")); + if (focusAndSelectionOutline) { + content.push(`.monaco-list${suffix}:focus .monaco-list-row.focused.selected { outline: 1px solid ${focusAndSelectionOutline}; outline-offset: -1px;}`); + } + if (styles.listFocusOutline) { + content.push(` + .monaco-drag-image, + .monaco-list${suffix}:focus .monaco-list-row.focused { outline: 1px solid ${styles.listFocusOutline}; outline-offset: -1px; } + .monaco-workbench.context-menu-visible .monaco-list${suffix}.last-focused .monaco-list-row.focused { outline: 1px solid ${styles.listFocusOutline}; outline-offset: -1px; } + `); + } + const inactiveFocusAndSelectionOutline = asCssValueWithDefault(styles.listSelectionOutline, (_b4 = styles.listInactiveFocusOutline) !== null && _b4 !== void 0 ? _b4 : ""); + if (inactiveFocusAndSelectionOutline) { + content.push(`.monaco-list${suffix} .monaco-list-row.focused.selected { outline: 1px dotted ${inactiveFocusAndSelectionOutline}; outline-offset: -1px; }`); + } + if (styles.listSelectionOutline) { + content.push(`.monaco-list${suffix} .monaco-list-row.selected { outline: 1px dotted ${styles.listSelectionOutline}; outline-offset: -1px; }`); + } + if (styles.listInactiveFocusOutline) { + content.push(`.monaco-list${suffix} .monaco-list-row.focused { outline: 1px dotted ${styles.listInactiveFocusOutline}; outline-offset: -1px; }`); + } + if (styles.listHoverOutline) { + content.push(`.monaco-list${suffix} .monaco-list-row:hover { outline: 1px dashed ${styles.listHoverOutline}; outline-offset: -1px; }`); + } + if (styles.listDropOverBackground) { + content.push(` + .monaco-list${suffix}.drop-target, + .monaco-list${suffix} .monaco-list-rows.drop-target, + .monaco-list${suffix} .monaco-list-row.drop-target { background-color: ${styles.listDropOverBackground} !important; color: inherit !important; } + `); + } + if (styles.listDropBetweenBackground) { + content.push(` + .monaco-list${suffix} .monaco-list-rows.drop-target-before .monaco-list-row:first-child::before, + .monaco-list${suffix} .monaco-list-row.drop-target-before::before { + content: ""; position: absolute; top: 0px; left: 0px; width: 100%; height: 1px; + background-color: ${styles.listDropBetweenBackground}; + }`); + content.push(` + .monaco-list${suffix} .monaco-list-rows.drop-target-after .monaco-list-row:last-child::after, + .monaco-list${suffix} .monaco-list-row.drop-target-after::after { + content: ""; position: absolute; bottom: 0px; left: 0px; width: 100%; height: 1px; + background-color: ${styles.listDropBetweenBackground}; + }`); + } + if (styles.tableColumnsBorder) { + content.push(` + .monaco-table > .monaco-split-view2, + .monaco-table > .monaco-split-view2 .monaco-sash.vertical::before, + .monaco-workbench:not(.reduce-motion) .monaco-table:hover > .monaco-split-view2, + .monaco-workbench:not(.reduce-motion) .monaco-table:hover > .monaco-split-view2 .monaco-sash.vertical::before { + border-color: ${styles.tableColumnsBorder}; + } + + .monaco-workbench:not(.reduce-motion) .monaco-table > .monaco-split-view2, + .monaco-workbench:not(.reduce-motion) .monaco-table > .monaco-split-view2 .monaco-sash.vertical::before { + border-color: transparent; + } + `); + } + if (styles.tableOddRowsBackgroundColor) { + content.push(` + .monaco-table .monaco-list-row[data-parity=odd]:not(.focused):not(.selected):not(:hover) .monaco-table-tr, + .monaco-table .monaco-list:not(:focus) .monaco-list-row[data-parity=odd].focused:not(.selected):not(:hover) .monaco-table-tr, + .monaco-table .monaco-list:not(.focused) .monaco-list-row[data-parity=odd].focused:not(.selected):not(:hover) .monaco-table-tr { + background-color: ${styles.tableOddRowsBackgroundColor}; + } + `); + } + this.styleElement.textContent = content.join("\n"); + } + }; + unthemedListStyles = { + listFocusBackground: "#7FB0D0", + listActiveSelectionBackground: "#0E639C", + listActiveSelectionForeground: "#FFFFFF", + listActiveSelectionIconForeground: "#FFFFFF", + listFocusAndSelectionOutline: "#90C2F9", + listFocusAndSelectionBackground: "#094771", + listFocusAndSelectionForeground: "#FFFFFF", + listInactiveSelectionBackground: "#3F3F46", + listInactiveSelectionIconForeground: "#FFFFFF", + listHoverBackground: "#2A2D2E", + listDropOverBackground: "#383B3D", + listDropBetweenBackground: "#EEEEEE", + treeIndentGuidesStroke: "#a9a9a9", + treeInactiveIndentGuidesStroke: Color.fromHex("#a9a9a9").transparent(0.4).toString(), + tableColumnsBorder: Color.fromHex("#cccccc").transparent(0.2).toString(), + tableOddRowsBackgroundColor: Color.fromHex("#cccccc").transparent(0.04).toString(), + listBackground: void 0, + listFocusForeground: void 0, + listInactiveSelectionForeground: void 0, + listInactiveFocusForeground: void 0, + listInactiveFocusBackground: void 0, + listHoverForeground: void 0, + listFocusOutline: void 0, + listInactiveFocusOutline: void 0, + listSelectionOutline: void 0, + listHoverOutline: void 0, + treeStickyScrollBackground: void 0, + treeStickyScrollBorder: void 0, + treeStickyScrollShadow: void 0 + }; + DefaultOptions2 = { + keyboardSupport: true, + mouseSupport: true, + multipleSelectionSupport: true, + dnd: { + getDragURI() { + return null; + }, + onDragStart() { + }, + onDragOver() { + return false; + }, + drop() { + }, + dispose() { + } + } + }; + numericSort = (a3, b) => a3 - b; + PipelineRenderer = class { + constructor(_templateId, renderers) { + this._templateId = _templateId; + this.renderers = renderers; + } + get templateId() { + return this._templateId; + } + renderTemplate(container) { + return this.renderers.map((r) => r.renderTemplate(container)); + } + renderElement(element, index, templateData, height) { + let i = 0; + for (const renderer of this.renderers) { + renderer.renderElement(element, index, templateData[i++], height); + } + } + disposeElement(element, index, templateData, height) { + var _a10; + let i = 0; + for (const renderer of this.renderers) { + (_a10 = renderer.disposeElement) === null || _a10 === void 0 ? void 0 : _a10.call(renderer, element, index, templateData[i], height); + i += 1; + } + } + disposeTemplate(templateData) { + let i = 0; + for (const renderer of this.renderers) { + renderer.disposeTemplate(templateData[i++]); + } + } + }; + AccessibiltyRenderer = class { + constructor(accessibilityProvider) { + this.accessibilityProvider = accessibilityProvider; + this.templateId = "a18n"; + } + renderTemplate(container) { + return { container, disposables: new DisposableStore() }; + } + renderElement(element, index, data) { + const ariaLabel = this.accessibilityProvider.getAriaLabel(element); + const observable = ariaLabel && typeof ariaLabel !== "string" ? ariaLabel : constObservable(ariaLabel); + data.disposables.add(autorun((reader) => { + this.setAriaLabel(reader.readObservable(observable), data.container); + })); + const ariaLevel = this.accessibilityProvider.getAriaLevel && this.accessibilityProvider.getAriaLevel(element); + if (typeof ariaLevel === "number") { + data.container.setAttribute("aria-level", `${ariaLevel}`); + } else { + data.container.removeAttribute("aria-level"); + } + } + setAriaLabel(ariaLabel, element) { + if (ariaLabel) { + element.setAttribute("aria-label", ariaLabel); + } else { + element.removeAttribute("aria-label"); + } + } + disposeElement(element, index, templateData, height) { + templateData.disposables.clear(); + } + disposeTemplate(templateData) { + templateData.disposables.dispose(); + } + }; + ListViewDragAndDrop = class { + constructor(list, dnd) { + this.list = list; + this.dnd = dnd; + } + getDragElements(element) { + const selection = this.list.getSelectedElements(); + const elements = selection.indexOf(element) > -1 ? selection : [element]; + return elements; + } + getDragURI(element) { + return this.dnd.getDragURI(element); + } + getDragLabel(elements, originalEvent) { + if (this.dnd.getDragLabel) { + return this.dnd.getDragLabel(elements, originalEvent); + } + return void 0; + } + onDragStart(data, originalEvent) { + var _a10, _b4; + (_b4 = (_a10 = this.dnd).onDragStart) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, data, originalEvent); + } + onDragOver(data, targetElement, targetIndex, targetSector, originalEvent) { + return this.dnd.onDragOver(data, targetElement, targetIndex, targetSector, originalEvent); + } + onDragLeave(data, targetElement, targetIndex, originalEvent) { + var _a10, _b4; + (_b4 = (_a10 = this.dnd).onDragLeave) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, data, targetElement, targetIndex, originalEvent); + } + onDragEnd(originalEvent) { + var _a10, _b4; + (_b4 = (_a10 = this.dnd).onDragEnd) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, originalEvent); + } + drop(data, targetElement, targetIndex, targetSector, originalEvent) { + this.dnd.drop(data, targetElement, targetIndex, targetSector, originalEvent); + } + dispose() { + this.dnd.dispose(); + } + }; + List = class { + get onDidChangeFocus() { + return Event.map(this.eventBufferer.wrapEvent(this.focus.onChange), (e) => this.toListEvent(e), this.disposables); + } + get onDidChangeSelection() { + return Event.map(this.eventBufferer.wrapEvent(this.selection.onChange), (e) => this.toListEvent(e), this.disposables); + } + get domId() { + return this.view.domId; + } + get onDidScroll() { + return this.view.onDidScroll; + } + get onMouseClick() { + return this.view.onMouseClick; + } + get onMouseDblClick() { + return this.view.onMouseDblClick; + } + get onMouseMiddleClick() { + return this.view.onMouseMiddleClick; + } + get onPointer() { + return this.mouseController.onPointer; + } + get onMouseDown() { + return this.view.onMouseDown; + } + get onMouseOver() { + return this.view.onMouseOver; + } + get onMouseOut() { + return this.view.onMouseOut; + } + get onTouchStart() { + return this.view.onTouchStart; + } + get onTap() { + return this.view.onTap; + } + /** + * Possible context menu trigger events: + * - ContextMenu key + * - Shift F10 + * - Ctrl Option Shift M (macOS with VoiceOver) + * - Mouse right click + */ + get onContextMenu() { + let didJustPressContextMenuKey = false; + const fromKeyDown = Event.chain(this.disposables.add(new DomEmitter(this.view.domNode, "keydown")).event, ($16) => $16.map((e) => new StandardKeyboardEvent(e)).filter((e) => didJustPressContextMenuKey = e.keyCode === 58 || e.shiftKey && e.keyCode === 68).map((e) => EventHelper.stop(e, true)).filter(() => false)); + const fromKeyUp = Event.chain(this.disposables.add(new DomEmitter(this.view.domNode, "keyup")).event, ($16) => $16.forEach(() => didJustPressContextMenuKey = false).map((e) => new StandardKeyboardEvent(e)).filter((e) => e.keyCode === 58 || e.shiftKey && e.keyCode === 68).map((e) => EventHelper.stop(e, true)).map(({ browserEvent }) => { + const focus = this.getFocus(); + const index = focus.length ? focus[0] : void 0; + const element = typeof index !== "undefined" ? this.view.element(index) : void 0; + const anchor = typeof index !== "undefined" ? this.view.domElement(index) : this.view.domNode; + return { index, element, anchor, browserEvent }; + })); + const fromMouse = Event.chain(this.view.onContextMenu, ($16) => $16.filter((_) => !didJustPressContextMenuKey).map(({ element, index, browserEvent }) => ({ element, index, anchor: new StandardMouseEvent(getWindow(this.view.domNode), browserEvent), browserEvent }))); + return Event.any(fromKeyDown, fromKeyUp, fromMouse); + } + get onKeyDown() { + return this.disposables.add(new DomEmitter(this.view.domNode, "keydown")).event; + } + get onDidFocus() { + return Event.signal(this.disposables.add(new DomEmitter(this.view.domNode, "focus", true)).event); + } + get onDidBlur() { + return Event.signal(this.disposables.add(new DomEmitter(this.view.domNode, "blur", true)).event); + } + constructor(user, container, virtualDelegate, renderers, _options = DefaultOptions2) { + var _a10, _b4, _c2, _d2; + this.user = user; + this._options = _options; + this.focus = new Trait("focused"); + this.anchor = new Trait("anchor"); + this.eventBufferer = new EventBufferer(); + this._ariaLabel = ""; + this.disposables = new DisposableStore(); + this._onDidDispose = new Emitter(); + this.onDidDispose = this._onDidDispose.event; + const role = this._options.accessibilityProvider && this._options.accessibilityProvider.getWidgetRole ? (_a10 = this._options.accessibilityProvider) === null || _a10 === void 0 ? void 0 : _a10.getWidgetRole() : "list"; + this.selection = new SelectionTrait(role !== "listbox"); + const baseRenderers = [this.focus.renderer, this.selection.renderer]; + this.accessibilityProvider = _options.accessibilityProvider; + if (this.accessibilityProvider) { + baseRenderers.push(new AccessibiltyRenderer(this.accessibilityProvider)); + (_c2 = (_b4 = this.accessibilityProvider).onDidChangeActiveDescendant) === null || _c2 === void 0 ? void 0 : _c2.call(_b4, this.onDidChangeActiveDescendant, this, this.disposables); + } + renderers = renderers.map((r) => new PipelineRenderer(r.templateId, [...baseRenderers, r])); + const viewOptions = __spreadProps(__spreadValues({}, _options), { + dnd: _options.dnd && new ListViewDragAndDrop(this, _options.dnd) + }); + this.view = this.createListView(container, virtualDelegate, renderers, viewOptions); + this.view.domNode.setAttribute("role", role); + if (_options.styleController) { + this.styleController = _options.styleController(this.view.domId); + } else { + const styleElement = createStyleSheet(this.view.domNode); + this.styleController = new DefaultStyleController(styleElement, this.view.domId); + } + this.spliceable = new CombinedSpliceable([ + new TraitSpliceable(this.focus, this.view, _options.identityProvider), + new TraitSpliceable(this.selection, this.view, _options.identityProvider), + new TraitSpliceable(this.anchor, this.view, _options.identityProvider), + this.view + ]); + this.disposables.add(this.focus); + this.disposables.add(this.selection); + this.disposables.add(this.anchor); + this.disposables.add(this.view); + this.disposables.add(this._onDidDispose); + this.disposables.add(new DOMFocusController(this, this.view)); + if (typeof _options.keyboardSupport !== "boolean" || _options.keyboardSupport) { + this.keyboardController = new KeyboardController(this, this.view, _options); + this.disposables.add(this.keyboardController); + } + if (_options.keyboardNavigationLabelProvider) { + const delegate = _options.keyboardNavigationDelegate || DefaultKeyboardNavigationDelegate; + this.typeNavigationController = new TypeNavigationController(this, this.view, _options.keyboardNavigationLabelProvider, (_d2 = _options.keyboardNavigationEventFilter) !== null && _d2 !== void 0 ? _d2 : () => true, delegate); + this.disposables.add(this.typeNavigationController); + } + this.mouseController = this.createMouseController(_options); + this.disposables.add(this.mouseController); + this.onDidChangeFocus(this._onFocusChange, this, this.disposables); + this.onDidChangeSelection(this._onSelectionChange, this, this.disposables); + if (this.accessibilityProvider) { + this.ariaLabel = this.accessibilityProvider.getWidgetAriaLabel(); + } + if (this._options.multipleSelectionSupport !== false) { + this.view.domNode.setAttribute("aria-multiselectable", "true"); + } + } + createListView(container, virtualDelegate, renderers, viewOptions) { + return new ListView(container, virtualDelegate, renderers, viewOptions); + } + createMouseController(options2) { + return new MouseController(this); + } + updateOptions(optionsUpdate = {}) { + var _a10, _b4; + this._options = __spreadValues(__spreadValues({}, this._options), optionsUpdate); + (_a10 = this.typeNavigationController) === null || _a10 === void 0 ? void 0 : _a10.updateOptions(this._options); + if (this._options.multipleSelectionController !== void 0) { + if (this._options.multipleSelectionSupport) { + this.view.domNode.setAttribute("aria-multiselectable", "true"); + } else { + this.view.domNode.removeAttribute("aria-multiselectable"); + } + } + this.mouseController.updateOptions(optionsUpdate); + (_b4 = this.keyboardController) === null || _b4 === void 0 ? void 0 : _b4.updateOptions(optionsUpdate); + this.view.updateOptions(optionsUpdate); + } + get options() { + return this._options; + } + splice(start, deleteCount, elements = []) { + if (start < 0 || start > this.view.length) { + throw new ListError(this.user, `Invalid start index: ${start}`); + } + if (deleteCount < 0) { + throw new ListError(this.user, `Invalid delete count: ${deleteCount}`); + } + if (deleteCount === 0 && elements.length === 0) { + return; + } + this.eventBufferer.bufferEvents(() => this.spliceable.splice(start, deleteCount, elements)); + } + rerender() { + this.view.rerender(); + } + element(index) { + return this.view.element(index); + } + indexOf(element) { + return this.view.indexOf(element); + } + indexAt(position) { + return this.view.indexAt(position); + } + get length() { + return this.view.length; + } + get contentHeight() { + return this.view.contentHeight; + } + get onDidChangeContentHeight() { + return this.view.onDidChangeContentHeight; + } + get scrollTop() { + return this.view.getScrollTop(); + } + set scrollTop(scrollTop) { + this.view.setScrollTop(scrollTop); + } + get scrollHeight() { + return this.view.scrollHeight; + } + get renderHeight() { + return this.view.renderHeight; + } + get firstVisibleIndex() { + return this.view.firstVisibleIndex; + } + get ariaLabel() { + return this._ariaLabel; + } + set ariaLabel(value) { + this._ariaLabel = value; + this.view.domNode.setAttribute("aria-label", value); + } + domFocus() { + this.view.domNode.focus({ preventScroll: true }); + } + layout(height, width2) { + this.view.layout(height, width2); + } + setSelection(indexes, browserEvent) { + for (const index of indexes) { + if (index < 0 || index >= this.length) { + throw new ListError(this.user, `Invalid index ${index}`); + } + } + this.selection.set(indexes, browserEvent); + } + getSelection() { + return this.selection.get(); + } + getSelectedElements() { + return this.getSelection().map((i) => this.view.element(i)); + } + setAnchor(index) { + if (typeof index === "undefined") { + this.anchor.set([]); + return; + } + if (index < 0 || index >= this.length) { + throw new ListError(this.user, `Invalid index ${index}`); + } + this.anchor.set([index]); + } + getAnchor() { + return firstOrDefault(this.anchor.get(), void 0); + } + getAnchorElement() { + const anchor = this.getAnchor(); + return typeof anchor === "undefined" ? void 0 : this.element(anchor); + } + setFocus(indexes, browserEvent) { + for (const index of indexes) { + if (index < 0 || index >= this.length) { + throw new ListError(this.user, `Invalid index ${index}`); + } + } + this.focus.set(indexes, browserEvent); + } + focusNext(n = 1, loop = false, browserEvent, filter) { + if (this.length === 0) { + return; + } + const focus = this.focus.get(); + const index = this.findNextIndex(focus.length > 0 ? focus[0] + n : 0, loop, filter); + if (index > -1) { + this.setFocus([index], browserEvent); + } + } + focusPrevious(n = 1, loop = false, browserEvent, filter) { + if (this.length === 0) { + return; + } + const focus = this.focus.get(); + const index = this.findPreviousIndex(focus.length > 0 ? focus[0] - n : 0, loop, filter); + if (index > -1) { + this.setFocus([index], browserEvent); + } + } + focusNextPage(browserEvent, filter) { + return __async(this, null, function* () { + let lastPageIndex = this.view.indexAt(this.view.getScrollTop() + this.view.renderHeight); + lastPageIndex = lastPageIndex === 0 ? 0 : lastPageIndex - 1; + const currentlyFocusedElementIndex = this.getFocus()[0]; + if (currentlyFocusedElementIndex !== lastPageIndex && (currentlyFocusedElementIndex === void 0 || lastPageIndex > currentlyFocusedElementIndex)) { + const lastGoodPageIndex = this.findPreviousIndex(lastPageIndex, false, filter); + if (lastGoodPageIndex > -1 && currentlyFocusedElementIndex !== lastGoodPageIndex) { + this.setFocus([lastGoodPageIndex], browserEvent); + } else { + this.setFocus([lastPageIndex], browserEvent); + } + } else { + const previousScrollTop = this.view.getScrollTop(); + let nextpageScrollTop = previousScrollTop + this.view.renderHeight; + if (lastPageIndex > currentlyFocusedElementIndex) { + nextpageScrollTop -= this.view.elementHeight(lastPageIndex); + } + this.view.setScrollTop(nextpageScrollTop); + if (this.view.getScrollTop() !== previousScrollTop) { + this.setFocus([]); + yield timeout(0); + yield this.focusNextPage(browserEvent, filter); + } + } + }); + } + focusPreviousPage(browserEvent, filter, getPaddingTop = () => 0) { + return __async(this, null, function* () { + let firstPageIndex; + const paddingTop = getPaddingTop(); + const scrollTop = this.view.getScrollTop() + paddingTop; + if (scrollTop === 0) { + firstPageIndex = this.view.indexAt(scrollTop); + } else { + firstPageIndex = this.view.indexAfter(scrollTop - 1); + } + const currentlyFocusedElementIndex = this.getFocus()[0]; + if (currentlyFocusedElementIndex !== firstPageIndex && (currentlyFocusedElementIndex === void 0 || currentlyFocusedElementIndex >= firstPageIndex)) { + const firstGoodPageIndex = this.findNextIndex(firstPageIndex, false, filter); + if (firstGoodPageIndex > -1 && currentlyFocusedElementIndex !== firstGoodPageIndex) { + this.setFocus([firstGoodPageIndex], browserEvent); + } else { + this.setFocus([firstPageIndex], browserEvent); + } + } else { + const previousScrollTop = scrollTop; + this.view.setScrollTop(scrollTop - this.view.renderHeight - paddingTop); + if (this.view.getScrollTop() + getPaddingTop() !== previousScrollTop) { + this.setFocus([]); + yield timeout(0); + yield this.focusPreviousPage(browserEvent, filter, getPaddingTop); + } + } + }); + } + focusLast(browserEvent, filter) { + if (this.length === 0) { + return; + } + const index = this.findPreviousIndex(this.length - 1, false, filter); + if (index > -1) { + this.setFocus([index], browserEvent); + } + } + focusFirst(browserEvent, filter) { + this.focusNth(0, browserEvent, filter); + } + focusNth(n, browserEvent, filter) { + if (this.length === 0) { + return; + } + const index = this.findNextIndex(n, false, filter); + if (index > -1) { + this.setFocus([index], browserEvent); + } + } + findNextIndex(index, loop = false, filter) { + for (let i = 0; i < this.length; i++) { + if (index >= this.length && !loop) { + return -1; + } + index = index % this.length; + if (!filter || filter(this.element(index))) { + return index; + } + index++; + } + return -1; + } + findPreviousIndex(index, loop = false, filter) { + for (let i = 0; i < this.length; i++) { + if (index < 0 && !loop) { + return -1; + } + index = (this.length + index % this.length) % this.length; + if (!filter || filter(this.element(index))) { + return index; + } + index--; + } + return -1; + } + getFocus() { + return this.focus.get(); + } + getFocusedElements() { + return this.getFocus().map((i) => this.view.element(i)); + } + reveal(index, relativeTop, paddingTop = 0) { + if (index < 0 || index >= this.length) { + throw new ListError(this.user, `Invalid index ${index}`); + } + const scrollTop = this.view.getScrollTop(); + const elementTop = this.view.elementTop(index); + const elementHeight = this.view.elementHeight(index); + if (isNumber(relativeTop)) { + const m = elementHeight - this.view.renderHeight + paddingTop; + this.view.setScrollTop(m * clamp(relativeTop, 0, 1) + elementTop - paddingTop); + } else { + const viewItemBottom = elementTop + elementHeight; + const scrollBottom = scrollTop + this.view.renderHeight; + if (elementTop < scrollTop + paddingTop && viewItemBottom >= scrollBottom) { + } else if (elementTop < scrollTop + paddingTop || viewItemBottom >= scrollBottom && elementHeight >= this.view.renderHeight) { + this.view.setScrollTop(elementTop - paddingTop); + } else if (viewItemBottom >= scrollBottom) { + this.view.setScrollTop(viewItemBottom - this.view.renderHeight); + } + } + } + /** + * Returns the relative position of an element rendered in the list. + * Returns `null` if the element isn't *entirely* in the visible viewport. + */ + getRelativeTop(index, paddingTop = 0) { + if (index < 0 || index >= this.length) { + throw new ListError(this.user, `Invalid index ${index}`); + } + const scrollTop = this.view.getScrollTop(); + const elementTop = this.view.elementTop(index); + const elementHeight = this.view.elementHeight(index); + if (elementTop < scrollTop + paddingTop || elementTop + elementHeight > scrollTop + this.view.renderHeight) { + return null; + } + const m = elementHeight - this.view.renderHeight + paddingTop; + return Math.abs((scrollTop + paddingTop - elementTop) / m); + } + getHTMLElement() { + return this.view.domNode; + } + getScrollableElement() { + return this.view.scrollableElementDomNode; + } + getElementID(index) { + return this.view.getElementDomId(index); + } + getElementTop(index) { + return this.view.elementTop(index); + } + style(styles) { + this.styleController.style(styles); + } + toListEvent({ indexes, browserEvent }) { + return { indexes, elements: indexes.map((i) => this.view.element(i)), browserEvent }; + } + _onFocusChange() { + const focus = this.focus.get(); + this.view.domNode.classList.toggle("element-focused", focus.length > 0); + this.onDidChangeActiveDescendant(); + } + onDidChangeActiveDescendant() { + var _a10; + const focus = this.focus.get(); + if (focus.length > 0) { + let id; + if ((_a10 = this.accessibilityProvider) === null || _a10 === void 0 ? void 0 : _a10.getActiveDescendantId) { + id = this.accessibilityProvider.getActiveDescendantId(this.view.element(focus[0])); + } + this.view.domNode.setAttribute("aria-activedescendant", id || this.view.getElementDomId(focus[0])); + } else { + this.view.domNode.removeAttribute("aria-activedescendant"); + } + } + _onSelectionChange() { + const selection = this.selection.get(); + this.view.domNode.classList.toggle("selection-none", selection.length === 0); + this.view.domNode.classList.toggle("selection-single", selection.length === 1); + this.view.domNode.classList.toggle("selection-multiple", selection.length > 1); + } + dispose() { + this._onDidDispose.fire(); + this.disposables.dispose(); + this._onDidDispose.dispose(); + } + }; + __decorate27([ + memoize + ], List.prototype, "onDidChangeFocus", null); + __decorate27([ + memoize + ], List.prototype, "onDidChangeSelection", null); + __decorate27([ + memoize + ], List.prototype, "onContextMenu", null); + __decorate27([ + memoize + ], List.prototype, "onKeyDown", null); + __decorate27([ + memoize + ], List.prototype, "onDidFocus", null); + __decorate27([ + memoize + ], List.prototype, "onDidBlur", null); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/selectBox/selectBoxCustom.css +var init_selectBoxCustom = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/selectBox/selectBoxCustom.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/selectBox/selectBoxCustom.js +var $4, SELECT_OPTION_ENTRY_TEMPLATE_ID, SelectListRenderer, SelectBoxList; +var init_selectBoxCustom2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/selectBox/selectBoxCustom.js"() { + init_dom(); + init_event2(); + init_keyboardEvent(); + init_markdownRenderer(); + init_hoverDelegate2(); + init_hoverDelegateFactory(); + init_listWidget(); + init_arrays(); + init_event(); + init_keyCodes(); + init_lifecycle(); + init_platform(); + init_selectBoxCustom(); + init_nls(); + $4 = $; + SELECT_OPTION_ENTRY_TEMPLATE_ID = "selectOption.entry.template"; + SelectListRenderer = class { + get templateId() { + return SELECT_OPTION_ENTRY_TEMPLATE_ID; + } + renderTemplate(container) { + const data = /* @__PURE__ */ Object.create(null); + data.root = container; + data.text = append(container, $4(".option-text")); + data.detail = append(container, $4(".option-detail")); + data.decoratorRight = append(container, $4(".option-decorator-right")); + return data; + } + renderElement(element, index, templateData) { + const data = templateData; + const text2 = element.text; + const detail = element.detail; + const decoratorRight = element.decoratorRight; + const isDisabled = element.isDisabled; + data.text.textContent = text2; + data.detail.textContent = !!detail ? detail : ""; + data.decoratorRight.innerText = !!decoratorRight ? decoratorRight : ""; + if (isDisabled) { + data.root.classList.add("option-disabled"); + } else { + data.root.classList.remove("option-disabled"); + } + } + disposeTemplate(_templateData) { + } + }; + SelectBoxList = class _SelectBoxList extends Disposable { + constructor(options2, selected, contextViewProvider, styles, selectBoxOptions) { + super(); + this.options = []; + this._currentSelection = 0; + this._hasDetails = false; + this._skipLayout = false; + this._sticky = false; + this._isVisible = false; + this.styles = styles; + this.selectBoxOptions = selectBoxOptions || /* @__PURE__ */ Object.create(null); + if (typeof this.selectBoxOptions.minBottomMargin !== "number") { + this.selectBoxOptions.minBottomMargin = _SelectBoxList.DEFAULT_DROPDOWN_MINIMUM_BOTTOM_MARGIN; + } else if (this.selectBoxOptions.minBottomMargin < 0) { + this.selectBoxOptions.minBottomMargin = 0; + } + this.selectElement = document.createElement("select"); + this.selectElement.className = "monaco-select-box monaco-select-box-dropdown-padding"; + if (typeof this.selectBoxOptions.ariaLabel === "string") { + this.selectElement.setAttribute("aria-label", this.selectBoxOptions.ariaLabel); + } + if (typeof this.selectBoxOptions.ariaDescription === "string") { + this.selectElement.setAttribute("aria-description", this.selectBoxOptions.ariaDescription); + } + this._onDidSelect = new Emitter(); + this._register(this._onDidSelect); + this.registerListeners(); + this.constructSelectDropDown(contextViewProvider); + this.selected = selected || 0; + if (options2) { + this.setOptions(options2, selected); + } + this.initStyleSheet(); + } + setTitle(title) { + if (!this._hover && title) { + this._hover = this._register(getBaseLayerHoverDelegate().setupUpdatableHover(getDefaultHoverDelegate("mouse"), this.selectElement, title)); + } else if (this._hover) { + this._hover.update(title); + } + } + // IDelegate - List renderer + getHeight() { + return 22; + } + getTemplateId() { + return SELECT_OPTION_ENTRY_TEMPLATE_ID; + } + constructSelectDropDown(contextViewProvider) { + this.contextViewProvider = contextViewProvider; + this.selectDropDownContainer = $(".monaco-select-box-dropdown-container"); + this.selectDropDownContainer.classList.add("monaco-select-box-dropdown-padding"); + this.selectionDetailsPane = append(this.selectDropDownContainer, $4(".select-box-details-pane")); + const widthControlOuterDiv = append(this.selectDropDownContainer, $4(".select-box-dropdown-container-width-control")); + const widthControlInnerDiv = append(widthControlOuterDiv, $4(".width-control-div")); + this.widthControlElement = document.createElement("span"); + this.widthControlElement.className = "option-text-width-control"; + append(widthControlInnerDiv, this.widthControlElement); + this._dropDownPosition = 0; + this.styleElement = createStyleSheet(this.selectDropDownContainer); + this.selectDropDownContainer.setAttribute("draggable", "true"); + this._register(addDisposableListener(this.selectDropDownContainer, EventType.DRAG_START, (e) => { + EventHelper.stop(e, true); + })); + } + registerListeners() { + this._register(addStandardDisposableListener(this.selectElement, "change", (e) => { + this.selected = e.target.selectedIndex; + this._onDidSelect.fire({ + index: e.target.selectedIndex, + selected: e.target.value + }); + if (!!this.options[this.selected] && !!this.options[this.selected].text) { + this.setTitle(this.options[this.selected].text); + } + })); + this._register(addDisposableListener(this.selectElement, EventType.CLICK, (e) => { + EventHelper.stop(e); + if (this._isVisible) { + this.hideSelectDropDown(true); + } else { + this.showSelectDropDown(); + } + })); + this._register(addDisposableListener(this.selectElement, EventType.MOUSE_DOWN, (e) => { + EventHelper.stop(e); + })); + let listIsVisibleOnTouchStart; + this._register(addDisposableListener(this.selectElement, "touchstart", (e) => { + listIsVisibleOnTouchStart = this._isVisible; + })); + this._register(addDisposableListener(this.selectElement, "touchend", (e) => { + EventHelper.stop(e); + if (listIsVisibleOnTouchStart) { + this.hideSelectDropDown(true); + } else { + this.showSelectDropDown(); + } + })); + this._register(addDisposableListener(this.selectElement, EventType.KEY_DOWN, (e) => { + const event = new StandardKeyboardEvent(e); + let showDropDown = false; + if (isMacintosh) { + if (event.keyCode === 18 || event.keyCode === 16 || event.keyCode === 10 || event.keyCode === 3) { + showDropDown = true; + } + } else { + if (event.keyCode === 18 && event.altKey || event.keyCode === 16 && event.altKey || event.keyCode === 10 || event.keyCode === 3) { + showDropDown = true; + } + } + if (showDropDown) { + this.showSelectDropDown(); + EventHelper.stop(e, true); + } + })); + } + get onDidSelect() { + return this._onDidSelect.event; + } + setOptions(options2, selected) { + if (!equals(this.options, options2)) { + this.options = options2; + this.selectElement.options.length = 0; + this._hasDetails = false; + this._cachedMaxDetailsHeight = void 0; + this.options.forEach((option, index) => { + this.selectElement.add(this.createOption(option.text, index, option.isDisabled)); + if (typeof option.description === "string") { + this._hasDetails = true; + } + }); + } + if (selected !== void 0) { + this.select(selected); + this._currentSelection = this.selected; + } + } + setOptionsList() { + var _a10; + (_a10 = this.selectList) === null || _a10 === void 0 ? void 0 : _a10.splice(0, this.selectList.length, this.options); + } + select(index) { + if (index >= 0 && index < this.options.length) { + this.selected = index; + } else if (index > this.options.length - 1) { + this.select(this.options.length - 1); + } else if (this.selected < 0) { + this.selected = 0; + } + this.selectElement.selectedIndex = this.selected; + if (!!this.options[this.selected] && !!this.options[this.selected].text) { + this.setTitle(this.options[this.selected].text); + } + } + focus() { + if (this.selectElement) { + this.selectElement.tabIndex = 0; + this.selectElement.focus(); + } + } + blur() { + if (this.selectElement) { + this.selectElement.tabIndex = -1; + this.selectElement.blur(); + } + } + setFocusable(focusable) { + this.selectElement.tabIndex = focusable ? 0 : -1; + } + render(container) { + this.container = container; + container.classList.add("select-container"); + container.appendChild(this.selectElement); + this.styleSelectElement(); + } + initStyleSheet() { + const content = []; + if (this.styles.listFocusBackground) { + content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.focused { background-color: ${this.styles.listFocusBackground} !important; }`); + } + if (this.styles.listFocusForeground) { + content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.focused { color: ${this.styles.listFocusForeground} !important; }`); + } + if (this.styles.decoratorRightForeground) { + content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.focused) .option-decorator-right { color: ${this.styles.decoratorRightForeground}; }`); + } + if (this.styles.selectBackground && this.styles.selectBorder && this.styles.selectBorder !== this.styles.selectBackground) { + content.push(`.monaco-select-box-dropdown-container { border: 1px solid ${this.styles.selectBorder} } `); + content.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-top { border-top: 1px solid ${this.styles.selectBorder} } `); + content.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-bottom { border-bottom: 1px solid ${this.styles.selectBorder} } `); + } else if (this.styles.selectListBorder) { + content.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-top { border-top: 1px solid ${this.styles.selectListBorder} } `); + content.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-bottom { border-bottom: 1px solid ${this.styles.selectListBorder} } `); + } + if (this.styles.listHoverForeground) { + content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.option-disabled):not(.focused):hover { color: ${this.styles.listHoverForeground} !important; }`); + } + if (this.styles.listHoverBackground) { + content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.option-disabled):not(.focused):hover { background-color: ${this.styles.listHoverBackground} !important; }`); + } + if (this.styles.listFocusOutline) { + content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.focused { outline: 1.6px dotted ${this.styles.listFocusOutline} !important; outline-offset: -1.6px !important; }`); + } + if (this.styles.listHoverOutline) { + content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.option-disabled):not(.focused):hover { outline: 1.6px dashed ${this.styles.listHoverOutline} !important; outline-offset: -1.6px !important; }`); + } + content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.option-disabled.focused { background-color: transparent !important; color: inherit !important; outline: none !important; }`); + content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.option-disabled:hover { background-color: transparent !important; color: inherit !important; outline: none !important; }`); + this.styleElement.textContent = content.join("\n"); + } + styleSelectElement() { + var _a10, _b4, _c2; + const background = (_a10 = this.styles.selectBackground) !== null && _a10 !== void 0 ? _a10 : ""; + const foreground2 = (_b4 = this.styles.selectForeground) !== null && _b4 !== void 0 ? _b4 : ""; + const border = (_c2 = this.styles.selectBorder) !== null && _c2 !== void 0 ? _c2 : ""; + this.selectElement.style.backgroundColor = background; + this.selectElement.style.color = foreground2; + this.selectElement.style.borderColor = border; + } + styleList() { + var _a10, _b4; + const background = (_a10 = this.styles.selectBackground) !== null && _a10 !== void 0 ? _a10 : ""; + const listBackground = asCssValueWithDefault(this.styles.selectListBackground, background); + this.selectDropDownListContainer.style.backgroundColor = listBackground; + this.selectionDetailsPane.style.backgroundColor = listBackground; + const optionsBorder = (_b4 = this.styles.focusBorder) !== null && _b4 !== void 0 ? _b4 : ""; + this.selectDropDownContainer.style.outlineColor = optionsBorder; + this.selectDropDownContainer.style.outlineOffset = "-1px"; + this.selectList.style(this.styles); + } + createOption(value, index, disabled) { + const option = document.createElement("option"); + option.value = value; + option.text = value; + option.disabled = !!disabled; + return option; + } + // ContextView dropdown methods + showSelectDropDown() { + this.selectionDetailsPane.innerText = ""; + if (!this.contextViewProvider || this._isVisible) { + return; + } + this.createSelectList(this.selectDropDownContainer); + this.setOptionsList(); + this.contextViewProvider.showContextView({ + getAnchor: () => this.selectElement, + render: (container) => this.renderSelectDropDown(container, true), + layout: () => { + this.layoutSelectDropDown(); + }, + onHide: () => { + this.selectDropDownContainer.classList.remove("visible"); + this.selectElement.classList.remove("synthetic-focus"); + }, + anchorPosition: this._dropDownPosition + }, this.selectBoxOptions.optionsAsChildren ? this.container : void 0); + this._isVisible = true; + this.hideSelectDropDown(false); + this.contextViewProvider.showContextView({ + getAnchor: () => this.selectElement, + render: (container) => this.renderSelectDropDown(container), + layout: () => this.layoutSelectDropDown(), + onHide: () => { + this.selectDropDownContainer.classList.remove("visible"); + this.selectElement.classList.remove("synthetic-focus"); + }, + anchorPosition: this._dropDownPosition + }, this.selectBoxOptions.optionsAsChildren ? this.container : void 0); + this._currentSelection = this.selected; + this._isVisible = true; + this.selectElement.setAttribute("aria-expanded", "true"); + } + hideSelectDropDown(focusSelect) { + if (!this.contextViewProvider || !this._isVisible) { + return; + } + this._isVisible = false; + this.selectElement.setAttribute("aria-expanded", "false"); + if (focusSelect) { + this.selectElement.focus(); + } + this.contextViewProvider.hideContextView(); + } + renderSelectDropDown(container, preLayoutPosition) { + container.appendChild(this.selectDropDownContainer); + this.layoutSelectDropDown(preLayoutPosition); + return { + dispose: () => { + try { + container.removeChild(this.selectDropDownContainer); + } catch (error) { + } + } + }; + } + // Iterate over detailed descriptions, find max height + measureMaxDetailsHeight() { + let maxDetailsPaneHeight = 0; + this.options.forEach((_option, index) => { + this.updateDetail(index); + if (this.selectionDetailsPane.offsetHeight > maxDetailsPaneHeight) { + maxDetailsPaneHeight = this.selectionDetailsPane.offsetHeight; + } + }); + return maxDetailsPaneHeight; + } + layoutSelectDropDown(preLayoutPosition) { + if (this._skipLayout) { + return false; + } + if (this.selectList) { + this.selectDropDownContainer.classList.add("visible"); + const window2 = getWindow(this.selectElement); + const selectPosition = getDomNodePagePosition(this.selectElement); + const styles = getWindow(this.selectElement).getComputedStyle(this.selectElement); + const verticalPadding = parseFloat(styles.getPropertyValue("--dropdown-padding-top")) + parseFloat(styles.getPropertyValue("--dropdown-padding-bottom")); + const maxSelectDropDownHeightBelow = window2.innerHeight - selectPosition.top - selectPosition.height - (this.selectBoxOptions.minBottomMargin || 0); + const maxSelectDropDownHeightAbove = selectPosition.top - _SelectBoxList.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN; + const selectWidth = this.selectElement.offsetWidth; + const selectMinWidth = this.setWidthControlElement(this.widthControlElement); + const selectOptimalWidth = Math.max(selectMinWidth, Math.round(selectWidth)).toString() + "px"; + this.selectDropDownContainer.style.width = selectOptimalWidth; + this.selectList.getHTMLElement().style.height = ""; + this.selectList.layout(); + let listHeight = this.selectList.contentHeight; + if (this._hasDetails && this._cachedMaxDetailsHeight === void 0) { + this._cachedMaxDetailsHeight = this.measureMaxDetailsHeight(); + } + const maxDetailsPaneHeight = this._hasDetails ? this._cachedMaxDetailsHeight : 0; + const minRequiredDropDownHeight = listHeight + verticalPadding + maxDetailsPaneHeight; + const maxVisibleOptionsBelow = Math.floor((maxSelectDropDownHeightBelow - verticalPadding - maxDetailsPaneHeight) / this.getHeight()); + const maxVisibleOptionsAbove = Math.floor((maxSelectDropDownHeightAbove - verticalPadding - maxDetailsPaneHeight) / this.getHeight()); + if (preLayoutPosition) { + if (selectPosition.top + selectPosition.height > window2.innerHeight - 22 || selectPosition.top < _SelectBoxList.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN || maxVisibleOptionsBelow < 1 && maxVisibleOptionsAbove < 1) { + return false; + } + if (maxVisibleOptionsBelow < _SelectBoxList.DEFAULT_MINIMUM_VISIBLE_OPTIONS && maxVisibleOptionsAbove > maxVisibleOptionsBelow && this.options.length > maxVisibleOptionsBelow) { + this._dropDownPosition = 1; + this.selectDropDownContainer.removeChild(this.selectDropDownListContainer); + this.selectDropDownContainer.removeChild(this.selectionDetailsPane); + this.selectDropDownContainer.appendChild(this.selectionDetailsPane); + this.selectDropDownContainer.appendChild(this.selectDropDownListContainer); + this.selectionDetailsPane.classList.remove("border-top"); + this.selectionDetailsPane.classList.add("border-bottom"); + } else { + this._dropDownPosition = 0; + this.selectDropDownContainer.removeChild(this.selectDropDownListContainer); + this.selectDropDownContainer.removeChild(this.selectionDetailsPane); + this.selectDropDownContainer.appendChild(this.selectDropDownListContainer); + this.selectDropDownContainer.appendChild(this.selectionDetailsPane); + this.selectionDetailsPane.classList.remove("border-bottom"); + this.selectionDetailsPane.classList.add("border-top"); + } + return true; + } + if (selectPosition.top + selectPosition.height > window2.innerHeight - 22 || selectPosition.top < _SelectBoxList.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN || this._dropDownPosition === 0 && maxVisibleOptionsBelow < 1 || this._dropDownPosition === 1 && maxVisibleOptionsAbove < 1) { + this.hideSelectDropDown(true); + return false; + } + if (this._dropDownPosition === 0) { + if (this._isVisible && maxVisibleOptionsBelow + maxVisibleOptionsAbove < 1) { + this.hideSelectDropDown(true); + return false; + } + if (minRequiredDropDownHeight > maxSelectDropDownHeightBelow) { + listHeight = maxVisibleOptionsBelow * this.getHeight(); + } + } else { + if (minRequiredDropDownHeight > maxSelectDropDownHeightAbove) { + listHeight = maxVisibleOptionsAbove * this.getHeight(); + } + } + this.selectList.layout(listHeight); + this.selectList.domFocus(); + if (this.selectList.length > 0) { + this.selectList.setFocus([this.selected || 0]); + this.selectList.reveal(this.selectList.getFocus()[0] || 0); + } + if (this._hasDetails) { + this.selectList.getHTMLElement().style.height = listHeight + verticalPadding + "px"; + this.selectDropDownContainer.style.height = ""; + } else { + this.selectDropDownContainer.style.height = listHeight + verticalPadding + "px"; + } + this.updateDetail(this.selected); + this.selectDropDownContainer.style.width = selectOptimalWidth; + this.selectDropDownListContainer.setAttribute("tabindex", "0"); + this.selectElement.classList.add("synthetic-focus"); + this.selectDropDownContainer.classList.add("synthetic-focus"); + return true; + } else { + return false; + } + } + setWidthControlElement(container) { + let elementWidth = 0; + if (container) { + let longest = 0; + let longestLength = 0; + this.options.forEach((option, index) => { + const detailLength = !!option.detail ? option.detail.length : 0; + const rightDecoratorLength = !!option.decoratorRight ? option.decoratorRight.length : 0; + const len = option.text.length + detailLength + rightDecoratorLength; + if (len > longestLength) { + longest = index; + longestLength = len; + } + }); + container.textContent = this.options[longest].text + (!!this.options[longest].decoratorRight ? this.options[longest].decoratorRight + " " : ""); + elementWidth = getTotalWidth(container); + } + return elementWidth; + } + createSelectList(parent) { + if (this.selectList) { + return; + } + this.selectDropDownListContainer = append(parent, $4(".select-box-dropdown-list-container")); + this.listRenderer = new SelectListRenderer(); + this.selectList = new List("SelectBoxCustom", this.selectDropDownListContainer, this, [this.listRenderer], { + useShadows: false, + verticalScrollMode: 3, + keyboardSupport: false, + mouseSupport: false, + accessibilityProvider: { + getAriaLabel: (element) => { + let label = element.text; + if (element.detail) { + label += `. ${element.detail}`; + } + if (element.decoratorRight) { + label += `. ${element.decoratorRight}`; + } + if (element.description) { + label += `. ${element.description}`; + } + return label; + }, + getWidgetAriaLabel: () => localize({ key: "selectBox", comment: ["Behave like native select dropdown element."] }, "Select Box"), + getRole: () => isMacintosh ? "" : "option", + getWidgetRole: () => "listbox" + } + }); + if (this.selectBoxOptions.ariaLabel) { + this.selectList.ariaLabel = this.selectBoxOptions.ariaLabel; + } + const onKeyDown = this._register(new DomEmitter(this.selectDropDownListContainer, "keydown")); + const onSelectDropDownKeyDown = Event.chain(onKeyDown.event, ($16) => $16.filter(() => this.selectList.length > 0).map((e) => new StandardKeyboardEvent(e))); + this._register(Event.chain(onSelectDropDownKeyDown, ($16) => $16.filter( + (e) => e.keyCode === 3 + /* KeyCode.Enter */ + ))(this.onEnter, this)); + this._register(Event.chain(onSelectDropDownKeyDown, ($16) => $16.filter( + (e) => e.keyCode === 2 + /* KeyCode.Tab */ + ))(this.onEnter, this)); + this._register(Event.chain(onSelectDropDownKeyDown, ($16) => $16.filter( + (e) => e.keyCode === 9 + /* KeyCode.Escape */ + ))(this.onEscape, this)); + this._register(Event.chain(onSelectDropDownKeyDown, ($16) => $16.filter( + (e) => e.keyCode === 16 + /* KeyCode.UpArrow */ + ))(this.onUpArrow, this)); + this._register(Event.chain(onSelectDropDownKeyDown, ($16) => $16.filter( + (e) => e.keyCode === 18 + /* KeyCode.DownArrow */ + ))(this.onDownArrow, this)); + this._register(Event.chain(onSelectDropDownKeyDown, ($16) => $16.filter( + (e) => e.keyCode === 12 + /* KeyCode.PageDown */ + ))(this.onPageDown, this)); + this._register(Event.chain(onSelectDropDownKeyDown, ($16) => $16.filter( + (e) => e.keyCode === 11 + /* KeyCode.PageUp */ + ))(this.onPageUp, this)); + this._register(Event.chain(onSelectDropDownKeyDown, ($16) => $16.filter( + (e) => e.keyCode === 14 + /* KeyCode.Home */ + ))(this.onHome, this)); + this._register(Event.chain(onSelectDropDownKeyDown, ($16) => $16.filter( + (e) => e.keyCode === 13 + /* KeyCode.End */ + ))(this.onEnd, this)); + this._register(Event.chain(onSelectDropDownKeyDown, ($16) => $16.filter((e) => e.keyCode >= 21 && e.keyCode <= 56 || e.keyCode >= 85 && e.keyCode <= 113))(this.onCharacter, this)); + this._register(addDisposableListener(this.selectList.getHTMLElement(), EventType.POINTER_UP, (e) => this.onPointerUp(e))); + this._register(this.selectList.onMouseOver((e) => typeof e.index !== "undefined" && this.selectList.setFocus([e.index]))); + this._register(this.selectList.onDidChangeFocus((e) => this.onListFocus(e))); + this._register(addDisposableListener(this.selectDropDownContainer, EventType.FOCUS_OUT, (e) => { + if (!this._isVisible || isAncestor(e.relatedTarget, this.selectDropDownContainer)) { + return; + } + this.onListBlur(); + })); + this.selectList.getHTMLElement().setAttribute("aria-label", this.selectBoxOptions.ariaLabel || ""); + this.selectList.getHTMLElement().setAttribute("aria-expanded", "true"); + this.styleList(); + } + // List methods + // List mouse controller - active exit, select option, fire onDidSelect if change, return focus to parent select + // Also takes in touchend events + onPointerUp(e) { + if (!this.selectList.length) { + return; + } + EventHelper.stop(e); + const target = e.target; + if (!target) { + return; + } + if (target.classList.contains("slider")) { + return; + } + const listRowElement = target.closest(".monaco-list-row"); + if (!listRowElement) { + return; + } + const index = Number(listRowElement.getAttribute("data-index")); + const disabled = listRowElement.classList.contains("option-disabled"); + if (index >= 0 && index < this.options.length && !disabled) { + this.selected = index; + this.select(this.selected); + this.selectList.setFocus([this.selected]); + this.selectList.reveal(this.selectList.getFocus()[0]); + if (this.selected !== this._currentSelection) { + this._currentSelection = this.selected; + this._onDidSelect.fire({ + index: this.selectElement.selectedIndex, + selected: this.options[this.selected].text + }); + if (!!this.options[this.selected] && !!this.options[this.selected].text) { + this.setTitle(this.options[this.selected].text); + } + } + this.hideSelectDropDown(true); + } + } + // List Exit - passive - implicit no selection change, hide drop-down + onListBlur() { + if (this._sticky) { + return; + } + if (this.selected !== this._currentSelection) { + this.select(this._currentSelection); + } + this.hideSelectDropDown(false); + } + renderDescriptionMarkdown(text2, actionHandler) { + const cleanRenderedMarkdown = (element) => { + for (let i = 0; i < element.childNodes.length; i++) { + const child = element.childNodes.item(i); + const tagName = child.tagName && child.tagName.toLowerCase(); + if (tagName === "img") { + element.removeChild(child); + } else { + cleanRenderedMarkdown(child); + } + } + }; + const rendered = renderMarkdown({ value: text2, supportThemeIcons: true }, { actionHandler }); + rendered.element.classList.add("select-box-description-markdown"); + cleanRenderedMarkdown(rendered.element); + return rendered.element; + } + // List Focus Change - passive - update details pane with newly focused element's data + onListFocus(e) { + if (!this._isVisible || !this._hasDetails) { + return; + } + this.updateDetail(e.indexes[0]); + } + updateDetail(selectedIndex) { + var _a10, _b4; + this.selectionDetailsPane.innerText = ""; + const option = this.options[selectedIndex]; + const description = (_a10 = option === null || option === void 0 ? void 0 : option.description) !== null && _a10 !== void 0 ? _a10 : ""; + const descriptionIsMarkdown = (_b4 = option === null || option === void 0 ? void 0 : option.descriptionIsMarkdown) !== null && _b4 !== void 0 ? _b4 : false; + if (description) { + if (descriptionIsMarkdown) { + const actionHandler = option.descriptionMarkdownActionHandler; + this.selectionDetailsPane.appendChild(this.renderDescriptionMarkdown(description, actionHandler)); + } else { + this.selectionDetailsPane.innerText = description; + } + this.selectionDetailsPane.style.display = "block"; + } else { + this.selectionDetailsPane.style.display = "none"; + } + this._skipLayout = true; + this.contextViewProvider.layout(); + this._skipLayout = false; + } + // List keyboard controller + // List exit - active - hide ContextView dropdown, reset selection, return focus to parent select + onEscape(e) { + EventHelper.stop(e); + this.select(this._currentSelection); + this.hideSelectDropDown(true); + } + // List exit - active - hide ContextView dropdown, return focus to parent select, fire onDidSelect if change + onEnter(e) { + EventHelper.stop(e); + if (this.selected !== this._currentSelection) { + this._currentSelection = this.selected; + this._onDidSelect.fire({ + index: this.selectElement.selectedIndex, + selected: this.options[this.selected].text + }); + if (!!this.options[this.selected] && !!this.options[this.selected].text) { + this.setTitle(this.options[this.selected].text); + } + } + this.hideSelectDropDown(true); + } + // List navigation - have to handle a disabled option (jump over) + onDownArrow(e) { + if (this.selected < this.options.length - 1) { + EventHelper.stop(e, true); + const nextOptionDisabled = this.options[this.selected + 1].isDisabled; + if (nextOptionDisabled && this.options.length > this.selected + 2) { + this.selected += 2; + } else if (nextOptionDisabled) { + return; + } else { + this.selected++; + } + this.select(this.selected); + this.selectList.setFocus([this.selected]); + this.selectList.reveal(this.selectList.getFocus()[0]); + } + } + onUpArrow(e) { + if (this.selected > 0) { + EventHelper.stop(e, true); + const previousOptionDisabled = this.options[this.selected - 1].isDisabled; + if (previousOptionDisabled && this.selected > 1) { + this.selected -= 2; + } else { + this.selected--; + } + this.select(this.selected); + this.selectList.setFocus([this.selected]); + this.selectList.reveal(this.selectList.getFocus()[0]); + } + } + onPageUp(e) { + EventHelper.stop(e); + this.selectList.focusPreviousPage(); + setTimeout(() => { + this.selected = this.selectList.getFocus()[0]; + if (this.options[this.selected].isDisabled && this.selected < this.options.length - 1) { + this.selected++; + this.selectList.setFocus([this.selected]); + } + this.selectList.reveal(this.selected); + this.select(this.selected); + }, 1); + } + onPageDown(e) { + EventHelper.stop(e); + this.selectList.focusNextPage(); + setTimeout(() => { + this.selected = this.selectList.getFocus()[0]; + if (this.options[this.selected].isDisabled && this.selected > 0) { + this.selected--; + this.selectList.setFocus([this.selected]); + } + this.selectList.reveal(this.selected); + this.select(this.selected); + }, 1); + } + onHome(e) { + EventHelper.stop(e); + if (this.options.length < 2) { + return; + } + this.selected = 0; + if (this.options[this.selected].isDisabled && this.selected > 1) { + this.selected++; + } + this.selectList.setFocus([this.selected]); + this.selectList.reveal(this.selected); + this.select(this.selected); + } + onEnd(e) { + EventHelper.stop(e); + if (this.options.length < 2) { + return; + } + this.selected = this.options.length - 1; + if (this.options[this.selected].isDisabled && this.selected > 1) { + this.selected--; + } + this.selectList.setFocus([this.selected]); + this.selectList.reveal(this.selected); + this.select(this.selected); + } + // Mimic option first character navigation of native select + onCharacter(e) { + const ch = KeyCodeUtils.toString(e.keyCode); + let optionIndex = -1; + for (let i = 0; i < this.options.length - 1; i++) { + optionIndex = (i + this.selected + 1) % this.options.length; + if (this.options[optionIndex].text.charAt(0).toUpperCase() === ch && !this.options[optionIndex].isDisabled) { + this.select(optionIndex); + this.selectList.setFocus([optionIndex]); + this.selectList.reveal(this.selectList.getFocus()[0]); + EventHelper.stop(e); + break; + } + } + } + dispose() { + this.hideSelectDropDown(false); + super.dispose(); + } + }; + SelectBoxList.DEFAULT_DROPDOWN_MINIMUM_BOTTOM_MARGIN = 32; + SelectBoxList.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN = 2; + SelectBoxList.DEFAULT_MINIMUM_VISIBLE_OPTIONS = 3; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/selectBox/selectBoxNative.js +var SelectBoxNative; +var init_selectBoxNative = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/selectBox/selectBoxNative.js"() { + init_dom(); + init_touch(); + init_arrays(); + init_event(); + init_lifecycle(); + init_platform(); + SelectBoxNative = class extends Disposable { + constructor(options2, selected, styles, selectBoxOptions) { + super(); + this.selected = 0; + this.selectBoxOptions = selectBoxOptions || /* @__PURE__ */ Object.create(null); + this.options = []; + this.selectElement = document.createElement("select"); + this.selectElement.className = "monaco-select-box"; + if (typeof this.selectBoxOptions.ariaLabel === "string") { + this.selectElement.setAttribute("aria-label", this.selectBoxOptions.ariaLabel); + } + if (typeof this.selectBoxOptions.ariaDescription === "string") { + this.selectElement.setAttribute("aria-description", this.selectBoxOptions.ariaDescription); + } + this._onDidSelect = this._register(new Emitter()); + this.styles = styles; + this.registerListeners(); + this.setOptions(options2, selected); + } + registerListeners() { + this._register(Gesture.addTarget(this.selectElement)); + [EventType2.Tap].forEach((eventType) => { + this._register(addDisposableListener(this.selectElement, eventType, (e) => { + this.selectElement.focus(); + })); + }); + this._register(addStandardDisposableListener(this.selectElement, "click", (e) => { + EventHelper.stop(e, true); + })); + this._register(addStandardDisposableListener(this.selectElement, "change", (e) => { + this.selectElement.title = e.target.value; + this._onDidSelect.fire({ + index: e.target.selectedIndex, + selected: e.target.value + }); + })); + this._register(addStandardDisposableListener(this.selectElement, "keydown", (e) => { + let showSelect = false; + if (isMacintosh) { + if (e.keyCode === 18 || e.keyCode === 16 || e.keyCode === 10) { + showSelect = true; + } + } else { + if (e.keyCode === 18 && e.altKey || e.keyCode === 10 || e.keyCode === 3) { + showSelect = true; + } + } + if (showSelect) { + e.stopPropagation(); + } + })); + } + get onDidSelect() { + return this._onDidSelect.event; + } + setOptions(options2, selected) { + if (!this.options || !equals(this.options, options2)) { + this.options = options2; + this.selectElement.options.length = 0; + this.options.forEach((option, index) => { + this.selectElement.add(this.createOption(option.text, index, option.isDisabled)); + }); + } + if (selected !== void 0) { + this.select(selected); + } + } + select(index) { + if (this.options.length === 0) { + this.selected = 0; + } else if (index >= 0 && index < this.options.length) { + this.selected = index; + } else if (index > this.options.length - 1) { + this.select(this.options.length - 1); + } else if (this.selected < 0) { + this.selected = 0; + } + this.selectElement.selectedIndex = this.selected; + if (this.selected < this.options.length && typeof this.options[this.selected].text === "string") { + this.selectElement.title = this.options[this.selected].text; + } else { + this.selectElement.title = ""; + } + } + focus() { + if (this.selectElement) { + this.selectElement.tabIndex = 0; + this.selectElement.focus(); + } + } + blur() { + if (this.selectElement) { + this.selectElement.tabIndex = -1; + this.selectElement.blur(); + } + } + setFocusable(focusable) { + this.selectElement.tabIndex = focusable ? 0 : -1; + } + render(container) { + container.classList.add("select-container"); + container.appendChild(this.selectElement); + this.setOptions(this.options, this.selected); + this.applyStyles(); + } + applyStyles() { + var _a10, _b4, _c2; + if (this.selectElement) { + this.selectElement.style.backgroundColor = (_a10 = this.styles.selectBackground) !== null && _a10 !== void 0 ? _a10 : ""; + this.selectElement.style.color = (_b4 = this.styles.selectForeground) !== null && _b4 !== void 0 ? _b4 : ""; + this.selectElement.style.borderColor = (_c2 = this.styles.selectBorder) !== null && _c2 !== void 0 ? _c2 : ""; + } + } + createOption(value, index, disabled) { + const option = document.createElement("option"); + option.value = value; + option.text = value; + option.disabled = !!disabled; + return option; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/selectBox/selectBox.css +var init_selectBox = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/selectBox/selectBox.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/selectBox/selectBox.js +var SelectBox; +var init_selectBox2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/selectBox/selectBox.js"() { + init_selectBoxCustom2(); + init_selectBoxNative(); + init_widget(); + init_platform(); + init_selectBox(); + SelectBox = class extends Widget { + constructor(options2, selected, contextViewProvider, styles, selectBoxOptions) { + super(); + if (isMacintosh && !(selectBoxOptions === null || selectBoxOptions === void 0 ? void 0 : selectBoxOptions.useCustomDrawn)) { + this.selectBoxDelegate = new SelectBoxNative(options2, selected, styles, selectBoxOptions); + } else { + this.selectBoxDelegate = new SelectBoxList(options2, selected, contextViewProvider, styles, selectBoxOptions); + } + this._register(this.selectBoxDelegate); + } + // Public SelectBox Methods - routed through delegate interface + get onDidSelect() { + return this.selectBoxDelegate.onDidSelect; + } + setOptions(options2, selected) { + this.selectBoxDelegate.setOptions(options2, selected); + } + select(index) { + this.selectBoxDelegate.select(index); + } + focus() { + this.selectBoxDelegate.focus(); + } + blur() { + this.selectBoxDelegate.blur(); + } + setFocusable(focusable) { + this.selectBoxDelegate.setFocusable(focusable); + } + render(container) { + this.selectBoxDelegate.render(container); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/actionbar/actionbar.css +var init_actionbar = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/actionbar/actionbar.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/actionbar/actionViewItems.js +var BaseActionViewItem, ActionViewItem, SelectActionViewItem; +var init_actionViewItems = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/actionbar/actionViewItems.js"() { + init_browser(); + init_dnd(); + init_dom(); + init_touch(); + init_hoverDelegateFactory(); + init_selectBox2(); + init_actions(); + init_lifecycle(); + init_platform(); + init_types(); + init_actionbar(); + init_nls(); + init_hoverDelegate2(); + BaseActionViewItem = class extends Disposable { + get action() { + return this._action; + } + constructor(context, action, options2 = {}) { + super(); + this.options = options2; + this._context = context || this; + this._action = action; + if (action instanceof Action) { + this._register(action.onDidChange((event) => { + if (!this.element) { + return; + } + this.handleActionChangeEvent(event); + })); + } + } + handleActionChangeEvent(event) { + if (event.enabled !== void 0) { + this.updateEnabled(); + } + if (event.checked !== void 0) { + this.updateChecked(); + } + if (event.class !== void 0) { + this.updateClass(); + } + if (event.label !== void 0) { + this.updateLabel(); + this.updateTooltip(); + } + if (event.tooltip !== void 0) { + this.updateTooltip(); + } + } + get actionRunner() { + if (!this._actionRunner) { + this._actionRunner = this._register(new ActionRunner()); + } + return this._actionRunner; + } + set actionRunner(actionRunner) { + this._actionRunner = actionRunner; + } + isEnabled() { + return this._action.enabled; + } + setActionContext(newContext) { + this._context = newContext; + } + render(container) { + const element = this.element = container; + this._register(Gesture.addTarget(container)); + const enableDragging = this.options && this.options.draggable; + if (enableDragging) { + container.draggable = true; + if (isFirefox2) { + this._register(addDisposableListener(container, EventType.DRAG_START, (e) => { + var _a10; + return (_a10 = e.dataTransfer) === null || _a10 === void 0 ? void 0 : _a10.setData(DataTransfers.TEXT, this._action.label); + })); + } + } + this._register(addDisposableListener(element, EventType2.Tap, (e) => this.onClick(e, true))); + this._register(addDisposableListener(element, EventType.MOUSE_DOWN, (e) => { + if (!enableDragging) { + EventHelper.stop(e, true); + } + if (this._action.enabled && e.button === 0) { + element.classList.add("active"); + } + })); + if (isMacintosh) { + this._register(addDisposableListener(element, EventType.CONTEXT_MENU, (e) => { + if (e.button === 0 && e.ctrlKey === true) { + this.onClick(e); + } + })); + } + this._register(addDisposableListener(element, EventType.CLICK, (e) => { + EventHelper.stop(e, true); + if (!(this.options && this.options.isMenu)) { + this.onClick(e); + } + })); + this._register(addDisposableListener(element, EventType.DBLCLICK, (e) => { + EventHelper.stop(e, true); + })); + [EventType.MOUSE_UP, EventType.MOUSE_OUT].forEach((event) => { + this._register(addDisposableListener(element, event, (e) => { + EventHelper.stop(e); + element.classList.remove("active"); + })); + }); + } + onClick(event, preserveFocus = false) { + var _a10; + EventHelper.stop(event, true); + const context = isUndefinedOrNull(this._context) ? ((_a10 = this.options) === null || _a10 === void 0 ? void 0 : _a10.useEventAsContext) ? event : { preserveFocus } : this._context; + this.actionRunner.run(this._action, context); + } + // Only set the tabIndex on the element once it is about to get focused + // That way this element wont be a tab stop when it is not needed #106441 + focus() { + if (this.element) { + this.element.tabIndex = 0; + this.element.focus(); + this.element.classList.add("focused"); + } + } + blur() { + if (this.element) { + this.element.blur(); + this.element.tabIndex = -1; + this.element.classList.remove("focused"); + } + } + setFocusable(focusable) { + if (this.element) { + this.element.tabIndex = focusable ? 0 : -1; + } + } + get trapsArrowNavigation() { + return false; + } + updateEnabled() { + } + updateLabel() { + } + getClass() { + return this.action.class; + } + getTooltip() { + return this.action.tooltip; + } + updateTooltip() { + var _a10, _b4, _c2; + if (!this.element) { + return; + } + const title = (_a10 = this.getTooltip()) !== null && _a10 !== void 0 ? _a10 : ""; + this.updateAriaLabel(); + if ((_b4 = this.options.hoverDelegate) === null || _b4 === void 0 ? void 0 : _b4.showNativeHover) { + this.element.title = title; + } else { + if (!this.customHover && title !== "") { + const hoverDelegate = (_c2 = this.options.hoverDelegate) !== null && _c2 !== void 0 ? _c2 : getDefaultHoverDelegate("element"); + this.customHover = this._store.add(getBaseLayerHoverDelegate().setupUpdatableHover(hoverDelegate, this.element, title)); + } else if (this.customHover) { + this.customHover.update(title); + } + } + } + updateAriaLabel() { + var _a10; + if (this.element) { + const title = (_a10 = this.getTooltip()) !== null && _a10 !== void 0 ? _a10 : ""; + this.element.setAttribute("aria-label", title); + } + } + updateClass() { + } + updateChecked() { + } + dispose() { + if (this.element) { + this.element.remove(); + this.element = void 0; + } + this._context = void 0; + super.dispose(); + } + }; + ActionViewItem = class extends BaseActionViewItem { + constructor(context, action, options2) { + super(context, action, options2); + this.options = options2; + this.options.icon = options2.icon !== void 0 ? options2.icon : false; + this.options.label = options2.label !== void 0 ? options2.label : true; + this.cssClass = ""; + } + render(container) { + super.render(container); + assertType(this.element); + const label = document.createElement("a"); + label.classList.add("action-label"); + label.setAttribute("role", this.getDefaultAriaRole()); + this.label = label; + this.element.appendChild(label); + if (this.options.label && this.options.keybinding) { + const kbLabel = document.createElement("span"); + kbLabel.classList.add("keybinding"); + kbLabel.textContent = this.options.keybinding; + this.element.appendChild(kbLabel); + } + this.updateClass(); + this.updateLabel(); + this.updateTooltip(); + this.updateEnabled(); + this.updateChecked(); + } + getDefaultAriaRole() { + if (this._action.id === Separator.ID) { + return "presentation"; + } else { + if (this.options.isMenu) { + return "menuitem"; + } else { + return "button"; + } + } + } + // Only set the tabIndex on the element once it is about to get focused + // That way this element wont be a tab stop when it is not needed #106441 + focus() { + if (this.label) { + this.label.tabIndex = 0; + this.label.focus(); + } + } + blur() { + if (this.label) { + this.label.tabIndex = -1; + } + } + setFocusable(focusable) { + if (this.label) { + this.label.tabIndex = focusable ? 0 : -1; + } + } + updateLabel() { + if (this.options.label && this.label) { + this.label.textContent = this.action.label; + } + } + getTooltip() { + let title = null; + if (this.action.tooltip) { + title = this.action.tooltip; + } else if (!this.options.label && this.action.label && this.options.icon) { + title = this.action.label; + if (this.options.keybinding) { + title = localize({ key: "titleLabel", comment: ["action title", "action keybinding"] }, "{0} ({1})", title, this.options.keybinding); + } + } + return title !== null && title !== void 0 ? title : void 0; + } + updateClass() { + var _a10; + if (this.cssClass && this.label) { + this.label.classList.remove(...this.cssClass.split(" ")); + } + if (this.options.icon) { + this.cssClass = this.getClass(); + if (this.label) { + this.label.classList.add("codicon"); + if (this.cssClass) { + this.label.classList.add(...this.cssClass.split(" ")); + } + } + this.updateEnabled(); + } else { + (_a10 = this.label) === null || _a10 === void 0 ? void 0 : _a10.classList.remove("codicon"); + } + } + updateEnabled() { + var _a10, _b4; + if (this.action.enabled) { + if (this.label) { + this.label.removeAttribute("aria-disabled"); + this.label.classList.remove("disabled"); + } + (_a10 = this.element) === null || _a10 === void 0 ? void 0 : _a10.classList.remove("disabled"); + } else { + if (this.label) { + this.label.setAttribute("aria-disabled", "true"); + this.label.classList.add("disabled"); + } + (_b4 = this.element) === null || _b4 === void 0 ? void 0 : _b4.classList.add("disabled"); + } + } + updateAriaLabel() { + var _a10; + if (this.label) { + const title = (_a10 = this.getTooltip()) !== null && _a10 !== void 0 ? _a10 : ""; + this.label.setAttribute("aria-label", title); + } + } + updateChecked() { + if (this.label) { + if (this.action.checked !== void 0) { + this.label.classList.toggle("checked", this.action.checked); + this.label.setAttribute("aria-checked", this.action.checked ? "true" : "false"); + this.label.setAttribute("role", "checkbox"); + } else { + this.label.classList.remove("checked"); + this.label.removeAttribute("aria-checked"); + this.label.setAttribute("role", this.getDefaultAriaRole()); + } + } + } + }; + SelectActionViewItem = class extends BaseActionViewItem { + constructor(ctx, action, options2, selected, contextViewProvider, styles, selectBoxOptions) { + super(ctx, action); + this.selectBox = new SelectBox(options2, selected, contextViewProvider, styles, selectBoxOptions); + this.selectBox.setFocusable(false); + this._register(this.selectBox); + this.registerListeners(); + } + select(index) { + this.selectBox.select(index); + } + registerListeners() { + this._register(this.selectBox.onDidSelect((e) => this.runAction(e.selected, e.index))); + } + runAction(option, index) { + this.actionRunner.run(this._action, this.getActionContext(option, index)); + } + getActionContext(option, index) { + return option; + } + setFocusable(focusable) { + this.selectBox.setFocusable(focusable); + } + focus() { + var _a10; + (_a10 = this.selectBox) === null || _a10 === void 0 ? void 0 : _a10.focus(); + } + blur() { + var _a10; + (_a10 = this.selectBox) === null || _a10 === void 0 ? void 0 : _a10.blur(); + } + render(container) { + this.selectBox.render(container); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/dropdown/dropdown.css +var init_dropdown = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/dropdown/dropdown.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/dropdown/dropdown.js +var BaseDropdown, DropdownMenu; +var init_dropdown2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/dropdown/dropdown.js"() { + init_dom(); + init_keyboardEvent(); + init_touch(); + init_actions(); + init_event(); + init_dropdown(); + BaseDropdown = class extends ActionRunner { + constructor(container, options2) { + super(); + this._onDidChangeVisibility = this._register(new Emitter()); + this.onDidChangeVisibility = this._onDidChangeVisibility.event; + this._element = append(container, $(".monaco-dropdown")); + this._label = append(this._element, $(".dropdown-label")); + let labelRenderer = options2.labelRenderer; + if (!labelRenderer) { + labelRenderer = (container2) => { + container2.textContent = options2.label || ""; + return null; + }; + } + for (const event of [EventType.CLICK, EventType.MOUSE_DOWN, EventType2.Tap]) { + this._register(addDisposableListener(this.element, event, (e) => EventHelper.stop(e, true))); + } + for (const event of [EventType.MOUSE_DOWN, EventType2.Tap]) { + this._register(addDisposableListener(this._label, event, (e) => { + if (isMouseEvent(e) && (e.detail > 1 || e.button !== 0)) { + return; + } + if (this.visible) { + this.hide(); + } else { + this.show(); + } + })); + } + this._register(addDisposableListener(this._label, EventType.KEY_UP, (e) => { + const event = new StandardKeyboardEvent(e); + if (event.equals( + 3 + /* KeyCode.Enter */ + ) || event.equals( + 10 + /* KeyCode.Space */ + )) { + EventHelper.stop(e, true); + if (this.visible) { + this.hide(); + } else { + this.show(); + } + } + })); + const cleanupFn = labelRenderer(this._label); + if (cleanupFn) { + this._register(cleanupFn); + } + this._register(Gesture.addTarget(this._label)); + } + get element() { + return this._element; + } + show() { + if (!this.visible) { + this.visible = true; + this._onDidChangeVisibility.fire(true); + } + } + hide() { + if (this.visible) { + this.visible = false; + this._onDidChangeVisibility.fire(false); + } + } + dispose() { + super.dispose(); + this.hide(); + if (this.boxContainer) { + this.boxContainer.remove(); + this.boxContainer = void 0; + } + if (this.contents) { + this.contents.remove(); + this.contents = void 0; + } + if (this._label) { + this._label.remove(); + this._label = void 0; + } + } + }; + DropdownMenu = class extends BaseDropdown { + constructor(container, _options) { + super(container, _options); + this._options = _options; + this._actions = []; + this.actions = _options.actions || []; + } + set menuOptions(options2) { + this._menuOptions = options2; + } + get menuOptions() { + return this._menuOptions; + } + get actions() { + if (this._options.actionProvider) { + return this._options.actionProvider.getActions(); + } + return this._actions; + } + set actions(actions) { + this._actions = actions; + } + show() { + super.show(); + this.element.classList.add("active"); + this._options.contextMenuProvider.showContextMenu({ + getAnchor: () => this.element, + getActions: () => this.actions, + getActionsContext: () => this.menuOptions ? this.menuOptions.context : null, + getActionViewItem: (action, options2) => this.menuOptions && this.menuOptions.actionViewItemProvider ? this.menuOptions.actionViewItemProvider(action, options2) : void 0, + getKeyBinding: (action) => this.menuOptions && this.menuOptions.getKeyBinding ? this.menuOptions.getKeyBinding(action) : void 0, + getMenuClassName: () => this._options.menuClassName || "", + onHide: () => this.onHide(), + actionRunner: this.menuOptions ? this.menuOptions.actionRunner : void 0, + anchorAlignment: this.menuOptions ? this.menuOptions.anchorAlignment : 0, + domForShadowRoot: this._options.menuAsChild ? this.element : void 0, + skipTelemetry: this._options.skipTelemetry + }); + } + hide() { + super.hide(); + } + onHide() { + this.hide(); + this.element.classList.remove("active"); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/dropdown/dropdownActionViewItem.js +var DropdownMenuActionViewItem; +var init_dropdownActionViewItem = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/dropdown/dropdownActionViewItem.js"() { + init_dom(); + init_actionViewItems(); + init_dropdown2(); + init_event(); + init_dropdown(); + init_hoverDelegateFactory(); + init_hoverDelegate2(); + DropdownMenuActionViewItem = class extends BaseActionViewItem { + constructor(action, menuActionsOrProvider, contextMenuProvider, options2 = /* @__PURE__ */ Object.create(null)) { + super(null, action, options2); + this.actionItem = null; + this._onDidChangeVisibility = this._register(new Emitter()); + this.onDidChangeVisibility = this._onDidChangeVisibility.event; + this.menuActionsOrProvider = menuActionsOrProvider; + this.contextMenuProvider = contextMenuProvider; + this.options = options2; + if (this.options.actionRunner) { + this.actionRunner = this.options.actionRunner; + } + } + render(container) { + this.actionItem = container; + const labelRenderer = (el) => { + var _a10; + this.element = append(el, $("a.action-label")); + let classNames = []; + if (typeof this.options.classNames === "string") { + classNames = this.options.classNames.split(/\s+/g).filter((s) => !!s); + } else if (this.options.classNames) { + classNames = this.options.classNames; + } + if (!classNames.find((c) => c === "icon")) { + classNames.push("codicon"); + } + this.element.classList.add(...classNames); + this.element.setAttribute("role", "button"); + this.element.setAttribute("aria-haspopup", "true"); + this.element.setAttribute("aria-expanded", "false"); + if (this._action.label) { + this._register(getBaseLayerHoverDelegate().setupUpdatableHover((_a10 = this.options.hoverDelegate) !== null && _a10 !== void 0 ? _a10 : getDefaultHoverDelegate("mouse"), this.element, this._action.label)); + } + this.element.ariaLabel = this._action.label || ""; + return null; + }; + const isActionsArray = Array.isArray(this.menuActionsOrProvider); + const options2 = { + contextMenuProvider: this.contextMenuProvider, + labelRenderer, + menuAsChild: this.options.menuAsChild, + actions: isActionsArray ? this.menuActionsOrProvider : void 0, + actionProvider: isActionsArray ? void 0 : this.menuActionsOrProvider, + skipTelemetry: this.options.skipTelemetry + }; + this.dropdownMenu = this._register(new DropdownMenu(container, options2)); + this._register(this.dropdownMenu.onDidChangeVisibility((visible) => { + var _a10; + (_a10 = this.element) === null || _a10 === void 0 ? void 0 : _a10.setAttribute("aria-expanded", `${visible}`); + this._onDidChangeVisibility.fire(visible); + })); + this.dropdownMenu.menuOptions = { + actionViewItemProvider: this.options.actionViewItemProvider, + actionRunner: this.actionRunner, + getKeyBinding: this.options.keybindingProvider, + context: this._context + }; + if (this.options.anchorAlignmentProvider) { + const that = this; + this.dropdownMenu.menuOptions = __spreadProps(__spreadValues({}, this.dropdownMenu.menuOptions), { + get anchorAlignment() { + return that.options.anchorAlignmentProvider(); + } + }); + } + this.updateTooltip(); + this.updateEnabled(); + } + getTooltip() { + let title = null; + if (this.action.tooltip) { + title = this.action.tooltip; + } else if (this.action.label) { + title = this.action.label; + } + return title !== null && title !== void 0 ? title : void 0; + } + setActionContext(newContext) { + super.setActionContext(newContext); + if (this.dropdownMenu) { + if (this.dropdownMenu.menuOptions) { + this.dropdownMenu.menuOptions.context = newContext; + } else { + this.dropdownMenu.menuOptions = { context: newContext }; + } + } + } + show() { + var _a10; + (_a10 = this.dropdownMenu) === null || _a10 === void 0 ? void 0 : _a10.show(); + } + updateEnabled() { + var _a10, _b4; + const disabled = !this.action.enabled; + (_a10 = this.actionItem) === null || _a10 === void 0 ? void 0 : _a10.classList.toggle("disabled", disabled); + (_b4 = this.element) === null || _b4 === void 0 ? void 0 : _b4.classList.toggle("disabled", disabled); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/actions/browser/menuEntryActionViewItem.css +var init_menuEntryActionViewItem = __esm({ + "node_modules/monaco-editor/esm/vs/platform/actions/browser/menuEntryActionViewItem.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/platform/action/common/action.js +function isLocalizedString(thing) { + return thing && typeof thing === "object" && typeof thing.original === "string" && typeof thing.value === "string"; +} +function isICommandActionToggleInfo(thing) { + return thing ? thing.condition !== void 0 : false; +} +var init_action = __esm({ + "node_modules/monaco-editor/esm/vs/platform/action/common/action.js"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/parts/storage/common/storage.js +var StorageHint, StorageState, Storage, InMemoryStorageDatabase; +var init_storage = __esm({ + "node_modules/monaco-editor/esm/vs/base/parts/storage/common/storage.js"() { + init_async(); + init_event(); + init_lifecycle(); + init_marshalling(); + init_types(); + (function(StorageHint2) { + StorageHint2[StorageHint2["STORAGE_DOES_NOT_EXIST"] = 0] = "STORAGE_DOES_NOT_EXIST"; + StorageHint2[StorageHint2["STORAGE_IN_MEMORY"] = 1] = "STORAGE_IN_MEMORY"; + })(StorageHint || (StorageHint = {})); + (function(StorageState2) { + StorageState2[StorageState2["None"] = 0] = "None"; + StorageState2[StorageState2["Initialized"] = 1] = "Initialized"; + StorageState2[StorageState2["Closed"] = 2] = "Closed"; + })(StorageState || (StorageState = {})); + Storage = class _Storage extends Disposable { + constructor(database, options2 = /* @__PURE__ */ Object.create(null)) { + super(); + this.database = database; + this.options = options2; + this._onDidChangeStorage = this._register(new PauseableEmitter()); + this.onDidChangeStorage = this._onDidChangeStorage.event; + this.state = StorageState.None; + this.cache = /* @__PURE__ */ new Map(); + this.flushDelayer = this._register(new ThrottledDelayer(_Storage.DEFAULT_FLUSH_DELAY)); + this.pendingDeletes = /* @__PURE__ */ new Set(); + this.pendingInserts = /* @__PURE__ */ new Map(); + this.whenFlushedCallbacks = []; + this.registerListeners(); + } + registerListeners() { + this._register(this.database.onDidChangeItemsExternal((e) => this.onDidChangeItemsExternal(e))); + } + onDidChangeItemsExternal(e) { + var _a10, _b4; + this._onDidChangeStorage.pause(); + try { + (_a10 = e.changed) === null || _a10 === void 0 ? void 0 : _a10.forEach((value, key) => this.acceptExternal(key, value)); + (_b4 = e.deleted) === null || _b4 === void 0 ? void 0 : _b4.forEach((key) => this.acceptExternal(key, void 0)); + } finally { + this._onDidChangeStorage.resume(); + } + } + acceptExternal(key, value) { + if (this.state === StorageState.Closed) { + return; + } + let changed = false; + if (isUndefinedOrNull(value)) { + changed = this.cache.delete(key); + } else { + const currentValue = this.cache.get(key); + if (currentValue !== value) { + this.cache.set(key, value); + changed = true; + } + } + if (changed) { + this._onDidChangeStorage.fire({ key, external: true }); + } + } + get(key, fallbackValue) { + const value = this.cache.get(key); + if (isUndefinedOrNull(value)) { + return fallbackValue; + } + return value; + } + getBoolean(key, fallbackValue) { + const value = this.get(key); + if (isUndefinedOrNull(value)) { + return fallbackValue; + } + return value === "true"; + } + getNumber(key, fallbackValue) { + const value = this.get(key); + if (isUndefinedOrNull(value)) { + return fallbackValue; + } + return parseInt(value, 10); + } + set(key, value, external = false) { + return __async(this, null, function* () { + if (this.state === StorageState.Closed) { + return; + } + if (isUndefinedOrNull(value)) { + return this.delete(key, external); + } + const valueStr = isObject(value) || Array.isArray(value) ? stringify(value) : String(value); + const currentValue = this.cache.get(key); + if (currentValue === valueStr) { + return; + } + this.cache.set(key, valueStr); + this.pendingInserts.set(key, valueStr); + this.pendingDeletes.delete(key); + this._onDidChangeStorage.fire({ key, external }); + return this.doFlush(); + }); + } + delete(key, external = false) { + return __async(this, null, function* () { + if (this.state === StorageState.Closed) { + return; + } + const wasDeleted = this.cache.delete(key); + if (!wasDeleted) { + return; + } + if (!this.pendingDeletes.has(key)) { + this.pendingDeletes.add(key); + } + this.pendingInserts.delete(key); + this._onDidChangeStorage.fire({ key, external }); + return this.doFlush(); + }); + } + get hasPending() { + return this.pendingInserts.size > 0 || this.pendingDeletes.size > 0; + } + flushPending() { + return __async(this, null, function* () { + if (!this.hasPending) { + return; + } + const updateRequest = { insert: this.pendingInserts, delete: this.pendingDeletes }; + this.pendingDeletes = /* @__PURE__ */ new Set(); + this.pendingInserts = /* @__PURE__ */ new Map(); + return this.database.updateItems(updateRequest).finally(() => { + var _a10; + if (!this.hasPending) { + while (this.whenFlushedCallbacks.length) { + (_a10 = this.whenFlushedCallbacks.pop()) === null || _a10 === void 0 ? void 0 : _a10(); + } + } + }); + }); + } + doFlush(delay) { + return __async(this, null, function* () { + if (this.options.hint === StorageHint.STORAGE_IN_MEMORY) { + return this.flushPending(); + } + return this.flushDelayer.trigger(() => this.flushPending(), delay); + }); + } + }; + Storage.DEFAULT_FLUSH_DELAY = 100; + InMemoryStorageDatabase = class { + constructor() { + this.onDidChangeItemsExternal = Event.None; + this.items = /* @__PURE__ */ new Map(); + } + updateItems(request) { + return __async(this, null, function* () { + var _a10, _b4; + (_a10 = request.insert) === null || _a10 === void 0 ? void 0 : _a10.forEach((value, key) => this.items.set(key, value)); + (_b4 = request.delete) === null || _b4 === void 0 ? void 0 : _b4.forEach((key) => this.items.delete(key)); + }); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/storage/common/storage.js +function loadKeyTargets(storage) { + const keysRaw = storage.get(TARGET_KEY); + if (keysRaw) { + try { + return JSON.parse(keysRaw); + } catch (error) { + } + } + return /* @__PURE__ */ Object.create(null); +} +var TARGET_KEY, IStorageService, WillSaveStateReason, AbstractStorageService, InMemoryStorageService; +var init_storage2 = __esm({ + "node_modules/monaco-editor/esm/vs/platform/storage/common/storage.js"() { + init_event(); + init_lifecycle(); + init_types(); + init_storage(); + init_instantiation(); + TARGET_KEY = "__$__targetStorageMarker"; + IStorageService = createDecorator("storageService"); + (function(WillSaveStateReason2) { + WillSaveStateReason2[WillSaveStateReason2["NONE"] = 0] = "NONE"; + WillSaveStateReason2[WillSaveStateReason2["SHUTDOWN"] = 1] = "SHUTDOWN"; + })(WillSaveStateReason || (WillSaveStateReason = {})); + AbstractStorageService = class _AbstractStorageService extends Disposable { + constructor(options2 = { flushInterval: _AbstractStorageService.DEFAULT_FLUSH_INTERVAL }) { + super(); + this.options = options2; + this._onDidChangeValue = this._register(new PauseableEmitter()); + this._onDidChangeTarget = this._register(new PauseableEmitter()); + this._onWillSaveState = this._register(new Emitter()); + this.onWillSaveState = this._onWillSaveState.event; + this._workspaceKeyTargets = void 0; + this._profileKeyTargets = void 0; + this._applicationKeyTargets = void 0; + } + onDidChangeValue(scope, key, disposable) { + return Event.filter(this._onDidChangeValue.event, (e) => e.scope === scope && (key === void 0 || e.key === key), disposable); + } + emitDidChangeValue(scope, event) { + const { key, external } = event; + if (key === TARGET_KEY) { + switch (scope) { + case -1: + this._applicationKeyTargets = void 0; + break; + case 0: + this._profileKeyTargets = void 0; + break; + case 1: + this._workspaceKeyTargets = void 0; + break; + } + this._onDidChangeTarget.fire({ scope }); + } else { + this._onDidChangeValue.fire({ scope, key, target: this.getKeyTargets(scope)[key], external }); + } + } + get(key, scope, fallbackValue) { + var _a10; + return (_a10 = this.getStorage(scope)) === null || _a10 === void 0 ? void 0 : _a10.get(key, fallbackValue); + } + getBoolean(key, scope, fallbackValue) { + var _a10; + return (_a10 = this.getStorage(scope)) === null || _a10 === void 0 ? void 0 : _a10.getBoolean(key, fallbackValue); + } + getNumber(key, scope, fallbackValue) { + var _a10; + return (_a10 = this.getStorage(scope)) === null || _a10 === void 0 ? void 0 : _a10.getNumber(key, fallbackValue); + } + store(key, value, scope, target, external = false) { + if (isUndefinedOrNull(value)) { + this.remove(key, scope, external); + return; + } + this.withPausedEmitters(() => { + var _a10; + this.updateKeyTarget(key, scope, target); + (_a10 = this.getStorage(scope)) === null || _a10 === void 0 ? void 0 : _a10.set(key, value, external); + }); + } + remove(key, scope, external = false) { + this.withPausedEmitters(() => { + var _a10; + this.updateKeyTarget(key, scope, void 0); + (_a10 = this.getStorage(scope)) === null || _a10 === void 0 ? void 0 : _a10.delete(key, external); + }); + } + withPausedEmitters(fn) { + this._onDidChangeValue.pause(); + this._onDidChangeTarget.pause(); + try { + fn(); + } finally { + this._onDidChangeValue.resume(); + this._onDidChangeTarget.resume(); + } + } + updateKeyTarget(key, scope, target, external = false) { + var _a10, _b4; + const keyTargets = this.getKeyTargets(scope); + if (typeof target === "number") { + if (keyTargets[key] !== target) { + keyTargets[key] = target; + (_a10 = this.getStorage(scope)) === null || _a10 === void 0 ? void 0 : _a10.set(TARGET_KEY, JSON.stringify(keyTargets), external); + } + } else { + if (typeof keyTargets[key] === "number") { + delete keyTargets[key]; + (_b4 = this.getStorage(scope)) === null || _b4 === void 0 ? void 0 : _b4.set(TARGET_KEY, JSON.stringify(keyTargets), external); + } + } + } + get workspaceKeyTargets() { + if (!this._workspaceKeyTargets) { + this._workspaceKeyTargets = this.loadKeyTargets( + 1 + /* StorageScope.WORKSPACE */ + ); + } + return this._workspaceKeyTargets; + } + get profileKeyTargets() { + if (!this._profileKeyTargets) { + this._profileKeyTargets = this.loadKeyTargets( + 0 + /* StorageScope.PROFILE */ + ); + } + return this._profileKeyTargets; + } + get applicationKeyTargets() { + if (!this._applicationKeyTargets) { + this._applicationKeyTargets = this.loadKeyTargets( + -1 + /* StorageScope.APPLICATION */ + ); + } + return this._applicationKeyTargets; + } + getKeyTargets(scope) { + switch (scope) { + case -1: + return this.applicationKeyTargets; + case 0: + return this.profileKeyTargets; + default: + return this.workspaceKeyTargets; + } + } + loadKeyTargets(scope) { + const storage = this.getStorage(scope); + return storage ? loadKeyTargets(storage) : /* @__PURE__ */ Object.create(null); + } + }; + AbstractStorageService.DEFAULT_FLUSH_INTERVAL = 60 * 1e3; + InMemoryStorageService = class extends AbstractStorageService { + constructor() { + super(); + this.applicationStorage = this._register(new Storage(new InMemoryStorageDatabase(), { hint: StorageHint.STORAGE_IN_MEMORY })); + this.profileStorage = this._register(new Storage(new InMemoryStorageDatabase(), { hint: StorageHint.STORAGE_IN_MEMORY })); + this.workspaceStorage = this._register(new Storage(new InMemoryStorageDatabase(), { hint: StorageHint.STORAGE_IN_MEMORY })); + this._register(this.workspaceStorage.onDidChangeStorage((e) => this.emitDidChangeValue(1, e))); + this._register(this.profileStorage.onDidChangeStorage((e) => this.emitDidChangeValue(0, e))); + this._register(this.applicationStorage.onDidChangeStorage((e) => this.emitDidChangeValue(-1, e))); + } + getStorage(scope) { + switch (scope) { + case -1: + return this.applicationStorage; + case 0: + return this.profileStorage; + default: + return this.workspaceStorage; + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/browser/defaultStyles.js +function overrideStyles(override, styles) { + const result = __spreadValues({}, styles); + for (const key in override) { + const val = override[key]; + result[key] = val !== void 0 ? asCssVariable(val) : void 0; + } + return result; +} +function getListStyles(override) { + return overrideStyles(override, defaultListStyles); +} +var defaultKeybindingLabelStyles, defaultButtonStyles, defaultProgressBarStyles, defaultToggleStyles, defaultCheckboxStyles, defaultDialogStyles, defaultInputBoxStyles, defaultFindWidgetStyles, defaultCountBadgeStyles, defaultBreadcrumbsWidgetStyles, defaultListStyles, defaultSelectBoxStyles, defaultMenuStyles; +var init_defaultStyles = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/browser/defaultStyles.js"() { + init_colorRegistry(); + init_color(); + defaultKeybindingLabelStyles = { + keybindingLabelBackground: asCssVariable(keybindingLabelBackground), + keybindingLabelForeground: asCssVariable(keybindingLabelForeground), + keybindingLabelBorder: asCssVariable(keybindingLabelBorder), + keybindingLabelBottomBorder: asCssVariable(keybindingLabelBottomBorder), + keybindingLabelShadow: asCssVariable(widgetShadow) + }; + defaultButtonStyles = { + buttonForeground: asCssVariable(buttonForeground), + buttonSeparator: asCssVariable(buttonSeparator), + buttonBackground: asCssVariable(buttonBackground), + buttonHoverBackground: asCssVariable(buttonHoverBackground), + buttonSecondaryForeground: asCssVariable(buttonSecondaryForeground), + buttonSecondaryBackground: asCssVariable(buttonSecondaryBackground), + buttonSecondaryHoverBackground: asCssVariable(buttonSecondaryHoverBackground), + buttonBorder: asCssVariable(buttonBorder) + }; + defaultProgressBarStyles = { + progressBarBackground: asCssVariable(progressBarBackground) + }; + defaultToggleStyles = { + inputActiveOptionBorder: asCssVariable(inputActiveOptionBorder), + inputActiveOptionForeground: asCssVariable(inputActiveOptionForeground), + inputActiveOptionBackground: asCssVariable(inputActiveOptionBackground) + }; + defaultCheckboxStyles = { + checkboxBackground: asCssVariable(checkboxBackground), + checkboxBorder: asCssVariable(checkboxBorder), + checkboxForeground: asCssVariable(checkboxForeground) + }; + defaultDialogStyles = { + dialogBackground: asCssVariable(editorWidgetBackground), + dialogForeground: asCssVariable(editorWidgetForeground), + dialogShadow: asCssVariable(widgetShadow), + dialogBorder: asCssVariable(contrastBorder), + errorIconForeground: asCssVariable(problemsErrorIconForeground), + warningIconForeground: asCssVariable(problemsWarningIconForeground), + infoIconForeground: asCssVariable(problemsInfoIconForeground), + textLinkForeground: asCssVariable(textLinkForeground) + }; + defaultInputBoxStyles = { + inputBackground: asCssVariable(inputBackground), + inputForeground: asCssVariable(inputForeground), + inputBorder: asCssVariable(inputBorder), + inputValidationInfoBorder: asCssVariable(inputValidationInfoBorder), + inputValidationInfoBackground: asCssVariable(inputValidationInfoBackground), + inputValidationInfoForeground: asCssVariable(inputValidationInfoForeground), + inputValidationWarningBorder: asCssVariable(inputValidationWarningBorder), + inputValidationWarningBackground: asCssVariable(inputValidationWarningBackground), + inputValidationWarningForeground: asCssVariable(inputValidationWarningForeground), + inputValidationErrorBorder: asCssVariable(inputValidationErrorBorder), + inputValidationErrorBackground: asCssVariable(inputValidationErrorBackground), + inputValidationErrorForeground: asCssVariable(inputValidationErrorForeground) + }; + defaultFindWidgetStyles = { + listFilterWidgetBackground: asCssVariable(listFilterWidgetBackground), + listFilterWidgetOutline: asCssVariable(listFilterWidgetOutline), + listFilterWidgetNoMatchesOutline: asCssVariable(listFilterWidgetNoMatchesOutline), + listFilterWidgetShadow: asCssVariable(listFilterWidgetShadow), + inputBoxStyles: defaultInputBoxStyles, + toggleStyles: defaultToggleStyles + }; + defaultCountBadgeStyles = { + badgeBackground: asCssVariable(badgeBackground), + badgeForeground: asCssVariable(badgeForeground), + badgeBorder: asCssVariable(contrastBorder) + }; + defaultBreadcrumbsWidgetStyles = { + breadcrumbsBackground: asCssVariable(breadcrumbsBackground), + breadcrumbsForeground: asCssVariable(breadcrumbsForeground), + breadcrumbsHoverForeground: asCssVariable(breadcrumbsFocusForeground), + breadcrumbsFocusForeground: asCssVariable(breadcrumbsFocusForeground), + breadcrumbsFocusAndSelectionForeground: asCssVariable(breadcrumbsActiveSelectionForeground) + }; + defaultListStyles = { + listBackground: void 0, + listInactiveFocusForeground: void 0, + listFocusBackground: asCssVariable(listFocusBackground), + listFocusForeground: asCssVariable(listFocusForeground), + listFocusOutline: asCssVariable(listFocusOutline), + listActiveSelectionBackground: asCssVariable(listActiveSelectionBackground), + listActiveSelectionForeground: asCssVariable(listActiveSelectionForeground), + listActiveSelectionIconForeground: asCssVariable(listActiveSelectionIconForeground), + listFocusAndSelectionOutline: asCssVariable(listFocusAndSelectionOutline), + listFocusAndSelectionBackground: asCssVariable(listActiveSelectionBackground), + listFocusAndSelectionForeground: asCssVariable(listActiveSelectionForeground), + listInactiveSelectionBackground: asCssVariable(listInactiveSelectionBackground), + listInactiveSelectionIconForeground: asCssVariable(listInactiveSelectionIconForeground), + listInactiveSelectionForeground: asCssVariable(listInactiveSelectionForeground), + listInactiveFocusBackground: asCssVariable(listInactiveFocusBackground), + listInactiveFocusOutline: asCssVariable(listInactiveFocusOutline), + listHoverBackground: asCssVariable(listHoverBackground), + listHoverForeground: asCssVariable(listHoverForeground), + listDropOverBackground: asCssVariable(listDropOverBackground), + listDropBetweenBackground: asCssVariable(listDropBetweenBackground), + listSelectionOutline: asCssVariable(activeContrastBorder), + listHoverOutline: asCssVariable(activeContrastBorder), + treeIndentGuidesStroke: asCssVariable(treeIndentGuidesStroke), + treeInactiveIndentGuidesStroke: asCssVariable(treeInactiveIndentGuidesStroke), + treeStickyScrollBackground: void 0, + treeStickyScrollBorder: void 0, + treeStickyScrollShadow: void 0, + tableColumnsBorder: asCssVariable(tableColumnsBorder), + tableOddRowsBackgroundColor: asCssVariable(tableOddRowsBackgroundColor) + }; + defaultSelectBoxStyles = { + selectBackground: asCssVariable(selectBackground), + selectListBackground: asCssVariable(selectListBackground), + selectForeground: asCssVariable(selectForeground), + decoratorRightForeground: asCssVariable(pickerGroupForeground), + selectBorder: asCssVariable(selectBorder), + focusBorder: asCssVariable(focusBorder), + listFocusBackground: asCssVariable(quickInputListFocusBackground), + listInactiveSelectionIconForeground: asCssVariable(quickInputListFocusIconForeground), + listFocusForeground: asCssVariable(quickInputListFocusForeground), + listFocusOutline: asCssVariableWithDefault(activeContrastBorder, Color.transparent.toString()), + listHoverBackground: asCssVariable(listHoverBackground), + listHoverForeground: asCssVariable(listHoverForeground), + listHoverOutline: asCssVariable(activeContrastBorder), + selectListBorder: asCssVariable(editorWidgetBorder), + listBackground: void 0, + listActiveSelectionBackground: void 0, + listActiveSelectionForeground: void 0, + listActiveSelectionIconForeground: void 0, + listFocusAndSelectionBackground: void 0, + listDropOverBackground: void 0, + listDropBetweenBackground: void 0, + listInactiveSelectionBackground: void 0, + listInactiveSelectionForeground: void 0, + listInactiveFocusBackground: void 0, + listInactiveFocusOutline: void 0, + listSelectionOutline: void 0, + listFocusAndSelectionForeground: void 0, + listFocusAndSelectionOutline: void 0, + listInactiveFocusForeground: void 0, + tableColumnsBorder: void 0, + tableOddRowsBackgroundColor: void 0, + treeIndentGuidesStroke: void 0, + treeInactiveIndentGuidesStroke: void 0, + treeStickyScrollBackground: void 0, + treeStickyScrollBorder: void 0, + treeStickyScrollShadow: void 0 + }; + defaultMenuStyles = { + shadowColor: asCssVariable(widgetShadow), + borderColor: asCssVariable(menuBorder), + foregroundColor: asCssVariable(menuForeground), + backgroundColor: asCssVariable(menuBackground), + selectionForegroundColor: asCssVariable(menuSelectionForeground), + selectionBackgroundColor: asCssVariable(menuSelectionBackground), + selectionBorderColor: asCssVariable(menuSelectionBorder), + separatorColor: asCssVariable(menuSeparatorBackground), + scrollbarShadow: asCssVariable(scrollbarShadow), + scrollbarSliderBackground: asCssVariable(scrollbarSliderBackground), + scrollbarSliderHoverBackground: asCssVariable(scrollbarSliderHoverBackground), + scrollbarSliderActiveBackground: asCssVariable(scrollbarSliderActiveBackground) + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/actions/browser/menuEntryActionViewItem.js +function createAndFillInContextMenuActions(menu, options2, target, primaryGroup) { + const groups = menu.getActions(options2); + const modifierKeyEmitter = ModifierKeyEmitter.getInstance(); + const useAlternativeActions = modifierKeyEmitter.keyStatus.altKey || (isWindows || isLinux) && modifierKeyEmitter.keyStatus.shiftKey; + fillInActions(groups, target, useAlternativeActions, primaryGroup ? (actionGroup) => actionGroup === primaryGroup : (actionGroup) => actionGroup === "navigation"); +} +function createAndFillInActionBarActions(menu, options2, target, primaryGroup, shouldInlineSubmenu, useSeparatorsInPrimaryActions) { + const groups = menu.getActions(options2); + const isPrimaryAction = typeof primaryGroup === "string" ? (actionGroup) => actionGroup === primaryGroup : primaryGroup; + fillInActions(groups, target, false, isPrimaryAction, shouldInlineSubmenu, useSeparatorsInPrimaryActions); +} +function fillInActions(groups, target, useAlternativeActions, isPrimaryAction = (actionGroup) => actionGroup === "navigation", shouldInlineSubmenu = () => false, useSeparatorsInPrimaryActions = false) { + let primaryBucket; + let secondaryBucket; + if (Array.isArray(target)) { + primaryBucket = target; + secondaryBucket = target; + } else { + primaryBucket = target.primary; + secondaryBucket = target.secondary; + } + const submenuInfo = /* @__PURE__ */ new Set(); + for (const [group, actions] of groups) { + let target2; + if (isPrimaryAction(group)) { + target2 = primaryBucket; + if (target2.length > 0 && useSeparatorsInPrimaryActions) { + target2.push(new Separator()); + } + } else { + target2 = secondaryBucket; + if (target2.length > 0) { + target2.push(new Separator()); + } + } + for (let action of actions) { + if (useAlternativeActions) { + action = action instanceof MenuItemAction && action.alt ? action.alt : action; + } + const newLen = target2.push(action); + if (action instanceof SubmenuAction) { + submenuInfo.add({ group, action, index: newLen - 1 }); + } + } + } + for (const { group, action, index } of submenuInfo) { + const target2 = isPrimaryAction(group) ? primaryBucket : secondaryBucket; + const submenuActions = action.actions; + if (shouldInlineSubmenu(action, group, target2.length)) { + target2.splice(index, 1, ...submenuActions); + } + } +} +function createActionViewItem(instaService, action, options2) { + if (action instanceof MenuItemAction) { + return instaService.createInstance(MenuEntryActionViewItem, action, options2); + } else if (action instanceof SubmenuItemAction) { + if (action.item.isSelection) { + return instaService.createInstance(SubmenuEntrySelectActionViewItem, action); + } else { + if (action.item.rememberDefaultAction) { + return instaService.createInstance(DropdownWithDefaultActionViewItem, action, __spreadProps(__spreadValues({}, options2), { persistLastActionId: true })); + } else { + return instaService.createInstance(SubmenuEntryActionViewItem, action, options2); + } + } + } else { + return void 0; + } +} +var __decorate28, __param25, MenuEntryActionViewItem, SubmenuEntryActionViewItem, DropdownWithDefaultActionViewItem, SubmenuEntrySelectActionViewItem; +var init_menuEntryActionViewItem2 = __esm({ + "node_modules/monaco-editor/esm/vs/platform/actions/browser/menuEntryActionViewItem.js"() { + init_dom(); + init_keyboardEvent(); + init_actionViewItems(); + init_dropdownActionViewItem(); + init_actions(); + init_keybindingLabels(); + init_lifecycle(); + init_platform(); + init_menuEntryActionViewItem(); + init_nls(); + init_actions2(); + init_action(); + init_contextkey(); + init_contextView(); + init_instantiation(); + init_keybinding(); + init_notification(); + init_storage2(); + init_themeService(); + init_themables(); + init_theme(); + init_types(); + init_colorRegistry(); + init_defaultStyles(); + init_accessibility(); + __decorate28 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param25 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + MenuEntryActionViewItem = class MenuEntryActionViewItem2 extends ActionViewItem { + constructor(action, options2, _keybindingService, _notificationService, _contextKeyService, _themeService, _contextMenuService, _accessibilityService) { + super(void 0, action, { icon: !!(action.class || action.item.icon), label: !action.class && !action.item.icon, draggable: options2 === null || options2 === void 0 ? void 0 : options2.draggable, keybinding: options2 === null || options2 === void 0 ? void 0 : options2.keybinding, hoverDelegate: options2 === null || options2 === void 0 ? void 0 : options2.hoverDelegate }); + this._keybindingService = _keybindingService; + this._notificationService = _notificationService; + this._contextKeyService = _contextKeyService; + this._themeService = _themeService; + this._contextMenuService = _contextMenuService; + this._accessibilityService = _accessibilityService; + this._wantsAltCommand = false; + this._itemClassDispose = this._register(new MutableDisposable()); + this._altKey = ModifierKeyEmitter.getInstance(); + } + get _menuItemAction() { + return this._action; + } + get _commandAction() { + return this._wantsAltCommand && this._menuItemAction.alt || this._menuItemAction; + } + onClick(event) { + return __async(this, null, function* () { + event.preventDefault(); + event.stopPropagation(); + try { + yield this.actionRunner.run(this._commandAction, this._context); + } catch (err) { + this._notificationService.error(err); + } + }); + } + render(container) { + super.render(container); + container.classList.add("menu-entry"); + if (this.options.icon) { + this._updateItemClass(this._menuItemAction.item); + } + if (this._menuItemAction.alt) { + let isMouseOver = false; + const updateAltState = () => { + var _a10; + const wantsAltCommand = !!((_a10 = this._menuItemAction.alt) === null || _a10 === void 0 ? void 0 : _a10.enabled) && (!this._accessibilityService.isMotionReduced() || isMouseOver) && (this._altKey.keyStatus.altKey || this._altKey.keyStatus.shiftKey && isMouseOver); + if (wantsAltCommand !== this._wantsAltCommand) { + this._wantsAltCommand = wantsAltCommand; + this.updateLabel(); + this.updateTooltip(); + this.updateClass(); + } + }; + this._register(this._altKey.event(updateAltState)); + this._register(addDisposableListener(container, "mouseleave", (_) => { + isMouseOver = false; + updateAltState(); + })); + this._register(addDisposableListener(container, "mouseenter", (_) => { + isMouseOver = true; + updateAltState(); + })); + updateAltState(); + } + } + updateLabel() { + if (this.options.label && this.label) { + this.label.textContent = this._commandAction.label; + } + } + getTooltip() { + var _a10; + const keybinding = this._keybindingService.lookupKeybinding(this._commandAction.id, this._contextKeyService); + const keybindingLabel = keybinding && keybinding.getLabel(); + const tooltip = this._commandAction.tooltip || this._commandAction.label; + let title = keybindingLabel ? localize("titleAndKb", "{0} ({1})", tooltip, keybindingLabel) : tooltip; + if (!this._wantsAltCommand && ((_a10 = this._menuItemAction.alt) === null || _a10 === void 0 ? void 0 : _a10.enabled)) { + const altTooltip = this._menuItemAction.alt.tooltip || this._menuItemAction.alt.label; + const altKeybinding = this._keybindingService.lookupKeybinding(this._menuItemAction.alt.id, this._contextKeyService); + const altKeybindingLabel = altKeybinding && altKeybinding.getLabel(); + const altTitleSection = altKeybindingLabel ? localize("titleAndKb", "{0} ({1})", altTooltip, altKeybindingLabel) : altTooltip; + title = localize("titleAndKbAndAlt", "{0}\n[{1}] {2}", title, UILabelProvider.modifierLabels[OS].altKey, altTitleSection); + } + return title; + } + updateClass() { + if (this.options.icon) { + if (this._commandAction !== this._menuItemAction) { + if (this._menuItemAction.alt) { + this._updateItemClass(this._menuItemAction.alt.item); + } + } else { + this._updateItemClass(this._menuItemAction.item); + } + } + } + _updateItemClass(item) { + this._itemClassDispose.value = void 0; + const { element, label } = this; + if (!element || !label) { + return; + } + const icon = this._commandAction.checked && isICommandActionToggleInfo(item.toggled) && item.toggled.icon ? item.toggled.icon : item.icon; + if (!icon) { + return; + } + if (ThemeIcon.isThemeIcon(icon)) { + const iconClasses = ThemeIcon.asClassNameArray(icon); + label.classList.add(...iconClasses); + this._itemClassDispose.value = toDisposable(() => { + label.classList.remove(...iconClasses); + }); + } else { + label.style.backgroundImage = isDark(this._themeService.getColorTheme().type) ? asCSSUrl(icon.dark) : asCSSUrl(icon.light); + label.classList.add("icon"); + this._itemClassDispose.value = combinedDisposable(toDisposable(() => { + label.style.backgroundImage = ""; + label.classList.remove("icon"); + }), this._themeService.onDidColorThemeChange(() => { + this.updateClass(); + })); + } + } + }; + MenuEntryActionViewItem = __decorate28([ + __param25(2, IKeybindingService), + __param25(3, INotificationService), + __param25(4, IContextKeyService), + __param25(5, IThemeService), + __param25(6, IContextMenuService), + __param25(7, IAccessibilityService) + ], MenuEntryActionViewItem); + SubmenuEntryActionViewItem = class SubmenuEntryActionViewItem2 extends DropdownMenuActionViewItem { + constructor(action, options2, _keybindingService, _contextMenuService, _themeService) { + var _a10, _b4, _c2; + const dropdownOptions = __spreadProps(__spreadValues({}, options2), { + menuAsChild: (_a10 = options2 === null || options2 === void 0 ? void 0 : options2.menuAsChild) !== null && _a10 !== void 0 ? _a10 : false, + classNames: (_b4 = options2 === null || options2 === void 0 ? void 0 : options2.classNames) !== null && _b4 !== void 0 ? _b4 : ThemeIcon.isThemeIcon(action.item.icon) ? ThemeIcon.asClassName(action.item.icon) : void 0, + keybindingProvider: (_c2 = options2 === null || options2 === void 0 ? void 0 : options2.keybindingProvider) !== null && _c2 !== void 0 ? _c2 : (action2) => _keybindingService.lookupKeybinding(action2.id) + }); + super(action, { getActions: () => action.actions }, _contextMenuService, dropdownOptions); + this._keybindingService = _keybindingService; + this._contextMenuService = _contextMenuService; + this._themeService = _themeService; + } + render(container) { + super.render(container); + assertType(this.element); + container.classList.add("menu-entry"); + const action = this._action; + const { icon } = action.item; + if (icon && !ThemeIcon.isThemeIcon(icon)) { + this.element.classList.add("icon"); + const setBackgroundImage = () => { + if (this.element) { + this.element.style.backgroundImage = isDark(this._themeService.getColorTheme().type) ? asCSSUrl(icon.dark) : asCSSUrl(icon.light); + } + }; + setBackgroundImage(); + this._register(this._themeService.onDidColorThemeChange(() => { + setBackgroundImage(); + })); + } + } + }; + SubmenuEntryActionViewItem = __decorate28([ + __param25(2, IKeybindingService), + __param25(3, IContextMenuService), + __param25(4, IThemeService) + ], SubmenuEntryActionViewItem); + DropdownWithDefaultActionViewItem = class DropdownWithDefaultActionViewItem2 extends BaseActionViewItem { + constructor(submenuAction, options2, _keybindingService, _notificationService, _contextMenuService, _menuService, _instaService, _storageService) { + var _a10, _b4, _c2; + super(null, submenuAction); + this._keybindingService = _keybindingService; + this._notificationService = _notificationService; + this._contextMenuService = _contextMenuService; + this._menuService = _menuService; + this._instaService = _instaService; + this._storageService = _storageService; + this._container = null; + this._options = options2; + this._storageKey = `${submenuAction.item.submenu.id}_lastActionId`; + let defaultAction; + const defaultActionId = (options2 === null || options2 === void 0 ? void 0 : options2.persistLastActionId) ? _storageService.get( + this._storageKey, + 1 + /* StorageScope.WORKSPACE */ + ) : void 0; + if (defaultActionId) { + defaultAction = submenuAction.actions.find((a3) => defaultActionId === a3.id); + } + if (!defaultAction) { + defaultAction = submenuAction.actions[0]; + } + this._defaultAction = this._instaService.createInstance(MenuEntryActionViewItem, defaultAction, { keybinding: this._getDefaultActionKeybindingLabel(defaultAction) }); + const dropdownOptions = __spreadProps(__spreadValues({ + keybindingProvider: (action) => this._keybindingService.lookupKeybinding(action.id) + }, options2), { + menuAsChild: (_a10 = options2 === null || options2 === void 0 ? void 0 : options2.menuAsChild) !== null && _a10 !== void 0 ? _a10 : true, + classNames: (_b4 = options2 === null || options2 === void 0 ? void 0 : options2.classNames) !== null && _b4 !== void 0 ? _b4 : ["codicon", "codicon-chevron-down"], + actionRunner: (_c2 = options2 === null || options2 === void 0 ? void 0 : options2.actionRunner) !== null && _c2 !== void 0 ? _c2 : new ActionRunner() + }); + this._dropdown = new DropdownMenuActionViewItem(submenuAction, submenuAction.actions, this._contextMenuService, dropdownOptions); + this._register(this._dropdown.actionRunner.onDidRun((e) => { + if (e.action instanceof MenuItemAction) { + this.update(e.action); + } + })); + } + update(lastAction) { + var _a10; + if ((_a10 = this._options) === null || _a10 === void 0 ? void 0 : _a10.persistLastActionId) { + this._storageService.store( + this._storageKey, + lastAction.id, + 1, + 1 + /* StorageTarget.MACHINE */ + ); + } + this._defaultAction.dispose(); + this._defaultAction = this._instaService.createInstance(MenuEntryActionViewItem, lastAction, { keybinding: this._getDefaultActionKeybindingLabel(lastAction) }); + this._defaultAction.actionRunner = new class extends ActionRunner { + runAction(action, context) { + return __async(this, null, function* () { + yield action.run(void 0); + }); + } + }(); + if (this._container) { + this._defaultAction.render(prepend(this._container, $(".action-container"))); + } + } + _getDefaultActionKeybindingLabel(defaultAction) { + var _a10; + let defaultActionKeybinding; + if ((_a10 = this._options) === null || _a10 === void 0 ? void 0 : _a10.renderKeybindingWithDefaultActionLabel) { + const kb = this._keybindingService.lookupKeybinding(defaultAction.id); + if (kb) { + defaultActionKeybinding = `(${kb.getLabel()})`; + } + } + return defaultActionKeybinding; + } + setActionContext(newContext) { + super.setActionContext(newContext); + this._defaultAction.setActionContext(newContext); + this._dropdown.setActionContext(newContext); + } + render(container) { + this._container = container; + super.render(this._container); + this._container.classList.add("monaco-dropdown-with-default"); + const primaryContainer = $(".action-container"); + this._defaultAction.render(append(this._container, primaryContainer)); + this._register(addDisposableListener(primaryContainer, EventType.KEY_DOWN, (e) => { + const event = new StandardKeyboardEvent(e); + if (event.equals( + 17 + /* KeyCode.RightArrow */ + )) { + this._defaultAction.element.tabIndex = -1; + this._dropdown.focus(); + event.stopPropagation(); + } + })); + const dropdownContainer = $(".dropdown-action-container"); + this._dropdown.render(append(this._container, dropdownContainer)); + this._register(addDisposableListener(dropdownContainer, EventType.KEY_DOWN, (e) => { + var _a10; + const event = new StandardKeyboardEvent(e); + if (event.equals( + 15 + /* KeyCode.LeftArrow */ + )) { + this._defaultAction.element.tabIndex = 0; + this._dropdown.setFocusable(false); + (_a10 = this._defaultAction.element) === null || _a10 === void 0 ? void 0 : _a10.focus(); + event.stopPropagation(); + } + })); + } + focus(fromRight) { + if (fromRight) { + this._dropdown.focus(); + } else { + this._defaultAction.element.tabIndex = 0; + this._defaultAction.element.focus(); + } + } + blur() { + this._defaultAction.element.tabIndex = -1; + this._dropdown.blur(); + this._container.blur(); + } + setFocusable(focusable) { + if (focusable) { + this._defaultAction.element.tabIndex = 0; + } else { + this._defaultAction.element.tabIndex = -1; + this._dropdown.setFocusable(false); + } + } + dispose() { + this._defaultAction.dispose(); + this._dropdown.dispose(); + super.dispose(); + } + }; + DropdownWithDefaultActionViewItem = __decorate28([ + __param25(2, IKeybindingService), + __param25(3, INotificationService), + __param25(4, IContextMenuService), + __param25(5, IMenuService), + __param25(6, IInstantiationService), + __param25(7, IStorageService) + ], DropdownWithDefaultActionViewItem); + SubmenuEntrySelectActionViewItem = class SubmenuEntrySelectActionViewItem2 extends SelectActionViewItem { + constructor(action, contextViewService) { + super(null, action, action.actions.map((a3) => ({ + text: a3.id === Separator.ID ? "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" : a3.label, + isDisabled: !a3.enabled + })), 0, contextViewService, defaultSelectBoxStyles, { ariaLabel: action.tooltip, optionsAsChildren: true }); + this.select(Math.max(0, action.actions.findIndex((a3) => a3.checked))); + } + render(container) { + super.render(container); + container.style.borderColor = asCssVariable(selectBorder); + } + runAction(option, index) { + const action = this.action.actions[index]; + if (action) { + this.actionRunner.run(action); + } + } + }; + SubmenuEntrySelectActionViewItem = __decorate28([ + __param25(1, IContextViewService) + ], SubmenuEntrySelectActionViewItem); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/actionbar/actionbar.js +var ActionBar; +var init_actionbar2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/actionbar/actionbar.js"() { + init_dom(); + init_keyboardEvent(); + init_actionViewItems(); + init_hoverDelegateFactory(); + init_actions(); + init_event(); + init_lifecycle(); + init_types(); + init_actionbar(); + ActionBar = class extends Disposable { + constructor(container, options2 = {}) { + var _a10, _b4, _c2, _d2, _e2, _f3, _g2; + super(); + this._actionRunnerDisposables = this._register(new DisposableStore()); + this.viewItemDisposables = this._register(new DisposableMap()); + this.triggerKeyDown = false; + this.focusable = true; + this._onDidBlur = this._register(new Emitter()); + this.onDidBlur = this._onDidBlur.event; + this._onDidCancel = this._register(new Emitter({ onWillAddFirstListener: () => this.cancelHasListener = true })); + this.onDidCancel = this._onDidCancel.event; + this.cancelHasListener = false; + this._onDidRun = this._register(new Emitter()); + this.onDidRun = this._onDidRun.event; + this._onWillRun = this._register(new Emitter()); + this.onWillRun = this._onWillRun.event; + this.options = options2; + this._context = (_a10 = options2.context) !== null && _a10 !== void 0 ? _a10 : null; + this._orientation = (_b4 = this.options.orientation) !== null && _b4 !== void 0 ? _b4 : 0; + this._triggerKeys = { + keyDown: (_d2 = (_c2 = this.options.triggerKeys) === null || _c2 === void 0 ? void 0 : _c2.keyDown) !== null && _d2 !== void 0 ? _d2 : false, + keys: (_f3 = (_e2 = this.options.triggerKeys) === null || _e2 === void 0 ? void 0 : _e2.keys) !== null && _f3 !== void 0 ? _f3 : [ + 3, + 10 + /* KeyCode.Space */ + ] + }; + this._hoverDelegate = (_g2 = options2.hoverDelegate) !== null && _g2 !== void 0 ? _g2 : this._register(createInstantHoverDelegate()); + if (this.options.actionRunner) { + this._actionRunner = this.options.actionRunner; + } else { + this._actionRunner = new ActionRunner(); + this._actionRunnerDisposables.add(this._actionRunner); + } + this._actionRunnerDisposables.add(this._actionRunner.onDidRun((e) => this._onDidRun.fire(e))); + this._actionRunnerDisposables.add(this._actionRunner.onWillRun((e) => this._onWillRun.fire(e))); + this.viewItems = []; + this.focusedItem = void 0; + this.domNode = document.createElement("div"); + this.domNode.className = "monaco-action-bar"; + let previousKeys; + let nextKeys; + switch (this._orientation) { + case 0: + previousKeys = [ + 15 + /* KeyCode.LeftArrow */ + ]; + nextKeys = [ + 17 + /* KeyCode.RightArrow */ + ]; + break; + case 1: + previousKeys = [ + 16 + /* KeyCode.UpArrow */ + ]; + nextKeys = [ + 18 + /* KeyCode.DownArrow */ + ]; + this.domNode.className += " vertical"; + break; + } + this._register(addDisposableListener(this.domNode, EventType.KEY_DOWN, (e) => { + const event = new StandardKeyboardEvent(e); + let eventHandled = true; + const focusedItem = typeof this.focusedItem === "number" ? this.viewItems[this.focusedItem] : void 0; + if (previousKeys && (event.equals(previousKeys[0]) || event.equals(previousKeys[1]))) { + eventHandled = this.focusPrevious(); + } else if (nextKeys && (event.equals(nextKeys[0]) || event.equals(nextKeys[1]))) { + eventHandled = this.focusNext(); + } else if (event.equals( + 9 + /* KeyCode.Escape */ + ) && this.cancelHasListener) { + this._onDidCancel.fire(); + } else if (event.equals( + 14 + /* KeyCode.Home */ + )) { + eventHandled = this.focusFirst(); + } else if (event.equals( + 13 + /* KeyCode.End */ + )) { + eventHandled = this.focusLast(); + } else if (event.equals( + 2 + /* KeyCode.Tab */ + ) && focusedItem instanceof BaseActionViewItem && focusedItem.trapsArrowNavigation) { + eventHandled = this.focusNext(); + } else if (this.isTriggerKeyEvent(event)) { + if (this._triggerKeys.keyDown) { + this.doTrigger(event); + } else { + this.triggerKeyDown = true; + } + } else { + eventHandled = false; + } + if (eventHandled) { + event.preventDefault(); + event.stopPropagation(); + } + })); + this._register(addDisposableListener(this.domNode, EventType.KEY_UP, (e) => { + const event = new StandardKeyboardEvent(e); + if (this.isTriggerKeyEvent(event)) { + if (!this._triggerKeys.keyDown && this.triggerKeyDown) { + this.triggerKeyDown = false; + this.doTrigger(event); + } + event.preventDefault(); + event.stopPropagation(); + } else if (event.equals( + 2 + /* KeyCode.Tab */ + ) || event.equals( + 1024 | 2 + /* KeyCode.Tab */ + ) || event.equals( + 16 + /* KeyCode.UpArrow */ + ) || event.equals( + 18 + /* KeyCode.DownArrow */ + ) || event.equals( + 15 + /* KeyCode.LeftArrow */ + ) || event.equals( + 17 + /* KeyCode.RightArrow */ + )) { + this.updateFocusedItem(); + } + })); + this.focusTracker = this._register(trackFocus(this.domNode)); + this._register(this.focusTracker.onDidBlur(() => { + if (getActiveElement() === this.domNode || !isAncestor(getActiveElement(), this.domNode)) { + this._onDidBlur.fire(); + this.previouslyFocusedItem = this.focusedItem; + this.focusedItem = void 0; + this.triggerKeyDown = false; + } + })); + this._register(this.focusTracker.onDidFocus(() => this.updateFocusedItem())); + this.actionsList = document.createElement("ul"); + this.actionsList.className = "actions-container"; + if (this.options.highlightToggledItems) { + this.actionsList.classList.add("highlight-toggled"); + } + this.actionsList.setAttribute("role", this.options.ariaRole || "toolbar"); + if (this.options.ariaLabel) { + this.actionsList.setAttribute("aria-label", this.options.ariaLabel); + } + this.domNode.appendChild(this.actionsList); + container.appendChild(this.domNode); + } + refreshRole() { + if (this.length() >= 1) { + this.actionsList.setAttribute("role", this.options.ariaRole || "toolbar"); + } else { + this.actionsList.setAttribute("role", "presentation"); + } + } + // Some action bars should not be focusable at times + // When an action bar is not focusable make sure to make all the elements inside it not focusable + // When an action bar is focusable again, make sure the first item can be focused + setFocusable(focusable) { + this.focusable = focusable; + if (this.focusable) { + const firstEnabled = this.viewItems.find((vi) => vi instanceof BaseActionViewItem && vi.isEnabled()); + if (firstEnabled instanceof BaseActionViewItem) { + firstEnabled.setFocusable(true); + } + } else { + this.viewItems.forEach((vi) => { + if (vi instanceof BaseActionViewItem) { + vi.setFocusable(false); + } + }); + } + } + isTriggerKeyEvent(event) { + let ret = false; + this._triggerKeys.keys.forEach((keyCode) => { + ret = ret || event.equals(keyCode); + }); + return ret; + } + updateFocusedItem() { + var _a10, _b4; + for (let i = 0; i < this.actionsList.children.length; i++) { + const elem = this.actionsList.children[i]; + if (isAncestor(getActiveElement(), elem)) { + this.focusedItem = i; + (_b4 = (_a10 = this.viewItems[this.focusedItem]) === null || _a10 === void 0 ? void 0 : _a10.showHover) === null || _b4 === void 0 ? void 0 : _b4.call(_a10); + break; + } + } + } + get context() { + return this._context; + } + set context(context) { + this._context = context; + this.viewItems.forEach((i) => i.setActionContext(context)); + } + get actionRunner() { + return this._actionRunner; + } + set actionRunner(actionRunner) { + this._actionRunner = actionRunner; + this._actionRunnerDisposables.clear(); + this._actionRunnerDisposables.add(this._actionRunner.onDidRun((e) => this._onDidRun.fire(e))); + this._actionRunnerDisposables.add(this._actionRunner.onWillRun((e) => this._onWillRun.fire(e))); + this.viewItems.forEach((item) => item.actionRunner = actionRunner); + } + getContainer() { + return this.domNode; + } + getAction(indexOrElement) { + var _a10; + if (typeof indexOrElement === "number") { + return (_a10 = this.viewItems[indexOrElement]) === null || _a10 === void 0 ? void 0 : _a10.action; + } + if (isHTMLElement(indexOrElement)) { + while (indexOrElement.parentElement !== this.actionsList) { + if (!indexOrElement.parentElement) { + return void 0; + } + indexOrElement = indexOrElement.parentElement; + } + for (let i = 0; i < this.actionsList.childNodes.length; i++) { + if (this.actionsList.childNodes[i] === indexOrElement) { + return this.viewItems[i].action; + } + } + } + return void 0; + } + push(arg, options2 = {}) { + const actions = Array.isArray(arg) ? arg : [arg]; + let index = isNumber(options2.index) ? options2.index : null; + actions.forEach((action) => { + const actionViewItemElement = document.createElement("li"); + actionViewItemElement.className = "action-item"; + actionViewItemElement.setAttribute("role", "presentation"); + let item; + const viewItemOptions = __spreadValues({ hoverDelegate: this._hoverDelegate }, options2); + if (this.options.actionViewItemProvider) { + item = this.options.actionViewItemProvider(action, viewItemOptions); + } + if (!item) { + item = new ActionViewItem(this.context, action, viewItemOptions); + } + if (!this.options.allowContextMenu) { + this.viewItemDisposables.set(item, addDisposableListener(actionViewItemElement, EventType.CONTEXT_MENU, (e) => { + EventHelper.stop(e, true); + })); + } + item.actionRunner = this._actionRunner; + item.setActionContext(this.context); + item.render(actionViewItemElement); + if (this.focusable && item instanceof BaseActionViewItem && this.viewItems.length === 0) { + item.setFocusable(true); + } + if (index === null || index < 0 || index >= this.actionsList.children.length) { + this.actionsList.appendChild(actionViewItemElement); + this.viewItems.push(item); + } else { + this.actionsList.insertBefore(actionViewItemElement, this.actionsList.children[index]); + this.viewItems.splice(index, 0, item); + index++; + } + }); + if (typeof this.focusedItem === "number") { + this.focus(this.focusedItem); + } + this.refreshRole(); + } + clear() { + if (this.isEmpty()) { + return; + } + this.viewItems = dispose(this.viewItems); + this.viewItemDisposables.clearAndDisposeAll(); + clearNode(this.actionsList); + this.refreshRole(); + } + length() { + return this.viewItems.length; + } + isEmpty() { + return this.viewItems.length === 0; + } + focus(arg) { + let selectFirst = false; + let index = void 0; + if (arg === void 0) { + selectFirst = true; + } else if (typeof arg === "number") { + index = arg; + } else if (typeof arg === "boolean") { + selectFirst = arg; + } + if (selectFirst && typeof this.focusedItem === "undefined") { + const firstEnabled = this.viewItems.findIndex((item) => item.isEnabled()); + this.focusedItem = firstEnabled === -1 ? void 0 : firstEnabled; + this.updateFocus(void 0, void 0, true); + } else { + if (index !== void 0) { + this.focusedItem = index; + } + this.updateFocus(void 0, void 0, true); + } + } + focusFirst() { + this.focusedItem = this.length() - 1; + return this.focusNext(true); + } + focusLast() { + this.focusedItem = 0; + return this.focusPrevious(true); + } + focusNext(forceLoop) { + if (typeof this.focusedItem === "undefined") { + this.focusedItem = this.viewItems.length - 1; + } else if (this.viewItems.length <= 1) { + return false; + } + const startIndex = this.focusedItem; + let item; + do { + if (!forceLoop && this.options.preventLoopNavigation && this.focusedItem + 1 >= this.viewItems.length) { + this.focusedItem = startIndex; + return false; + } + this.focusedItem = (this.focusedItem + 1) % this.viewItems.length; + item = this.viewItems[this.focusedItem]; + } while (this.focusedItem !== startIndex && (this.options.focusOnlyEnabledItems && !item.isEnabled() || item.action.id === Separator.ID)); + this.updateFocus(); + return true; + } + focusPrevious(forceLoop) { + if (typeof this.focusedItem === "undefined") { + this.focusedItem = 0; + } else if (this.viewItems.length <= 1) { + return false; + } + const startIndex = this.focusedItem; + let item; + do { + this.focusedItem = this.focusedItem - 1; + if (this.focusedItem < 0) { + if (!forceLoop && this.options.preventLoopNavigation) { + this.focusedItem = startIndex; + return false; + } + this.focusedItem = this.viewItems.length - 1; + } + item = this.viewItems[this.focusedItem]; + } while (this.focusedItem !== startIndex && (this.options.focusOnlyEnabledItems && !item.isEnabled() || item.action.id === Separator.ID)); + this.updateFocus(true); + return true; + } + updateFocus(fromRight, preventScroll, forceFocus = false) { + var _a10, _b4; + if (typeof this.focusedItem === "undefined") { + this.actionsList.focus({ preventScroll }); + } + if (this.previouslyFocusedItem !== void 0 && this.previouslyFocusedItem !== this.focusedItem) { + (_a10 = this.viewItems[this.previouslyFocusedItem]) === null || _a10 === void 0 ? void 0 : _a10.blur(); + } + const actionViewItem = this.focusedItem !== void 0 ? this.viewItems[this.focusedItem] : void 0; + if (actionViewItem) { + let focusItem = true; + if (!isFunction(actionViewItem.focus)) { + focusItem = false; + } + if (this.options.focusOnlyEnabledItems && isFunction(actionViewItem.isEnabled) && !actionViewItem.isEnabled()) { + focusItem = false; + } + if (actionViewItem.action.id === Separator.ID) { + focusItem = false; + } + if (!focusItem) { + this.actionsList.focus({ preventScroll }); + this.previouslyFocusedItem = void 0; + } else if (forceFocus || this.previouslyFocusedItem !== this.focusedItem) { + actionViewItem.focus(fromRight); + this.previouslyFocusedItem = this.focusedItem; + } + if (focusItem) { + (_b4 = actionViewItem.showHover) === null || _b4 === void 0 ? void 0 : _b4.call(actionViewItem); + } + } + } + doTrigger(event) { + if (typeof this.focusedItem === "undefined") { + return; + } + const actionViewItem = this.viewItems[this.focusedItem]; + if (actionViewItem instanceof BaseActionViewItem) { + const context = actionViewItem._context === null || actionViewItem._context === void 0 ? event : actionViewItem._context; + this.run(actionViewItem._action, context); + } + } + run(action, context) { + return __async(this, null, function* () { + yield this._actionRunner.run(action, context); + }); + } + dispose() { + this._context = void 0; + this.viewItems = dispose(this.viewItems); + this.getContainer().remove(); + super.dispose(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/menu/menu.js +function cleanMnemonic(label) { + const regex = MENU_MNEMONIC_REGEX; + const matches2 = regex.exec(label); + if (!matches2) { + return label; + } + const mnemonicInText = !matches2[1]; + return label.replace(regex, mnemonicInText ? "$2$3" : "").trim(); +} +function formatRule(c) { + const fontCharacter = getCodiconFontCharacters()[c.id]; + return `.codicon-${c.id}:before { content: '\\${fontCharacter.toString(16)}'; }`; +} +function getMenuWidgetCSS(style, isForShadowDom) { + let result = ( + /* css */ + ` +.monaco-menu { + font-size: 13px; + border-radius: 5px; + min-width: 160px; +} + +${formatRule(Codicon.menuSelection)} +${formatRule(Codicon.menuSubmenu)} + +.monaco-menu .monaco-action-bar { + text-align: right; + overflow: hidden; + white-space: nowrap; +} + +.monaco-menu .monaco-action-bar .actions-container { + display: flex; + margin: 0 auto; + padding: 0; + width: 100%; + justify-content: flex-end; +} + +.monaco-menu .monaco-action-bar.vertical .actions-container { + display: inline-block; +} + +.monaco-menu .monaco-action-bar.reverse .actions-container { + flex-direction: row-reverse; +} + +.monaco-menu .monaco-action-bar .action-item { + cursor: pointer; + display: inline-block; + transition: transform 50ms ease; + position: relative; /* DO NOT REMOVE - this is the key to preventing the ghosting icon bug in Chrome 42 */ +} + +.monaco-menu .monaco-action-bar .action-item.disabled { + cursor: default; +} + +.monaco-menu .monaco-action-bar .action-item .icon, +.monaco-menu .monaco-action-bar .action-item .codicon { + display: inline-block; +} + +.monaco-menu .monaco-action-bar .action-item .codicon { + display: flex; + align-items: center; +} + +.monaco-menu .monaco-action-bar .action-label { + font-size: 11px; + margin-right: 4px; +} + +.monaco-menu .monaco-action-bar .action-item.disabled .action-label, +.monaco-menu .monaco-action-bar .action-item.disabled .action-label:hover { + color: var(--vscode-disabledForeground); +} + +/* Vertical actions */ + +.monaco-menu .monaco-action-bar.vertical { + text-align: left; +} + +.monaco-menu .monaco-action-bar.vertical .action-item { + display: block; +} + +.monaco-menu .monaco-action-bar.vertical .action-label.separator { + display: block; + border-bottom: 1px solid var(--vscode-menu-separatorBackground); + padding-top: 1px; + padding: 30px; +} + +.monaco-menu .secondary-actions .monaco-action-bar .action-label { + margin-left: 6px; +} + +/* Action Items */ +.monaco-menu .monaco-action-bar .action-item.select-container { + overflow: hidden; /* somehow the dropdown overflows its container, we prevent it here to not push */ + flex: 1; + max-width: 170px; + min-width: 60px; + display: flex; + align-items: center; + justify-content: center; + margin-right: 10px; +} + +.monaco-menu .monaco-action-bar.vertical { + margin-left: 0; + overflow: visible; +} + +.monaco-menu .monaco-action-bar.vertical .actions-container { + display: block; +} + +.monaco-menu .monaco-action-bar.vertical .action-item { + padding: 0; + transform: none; + display: flex; +} + +.monaco-menu .monaco-action-bar.vertical .action-item.active { + transform: none; +} + +.monaco-menu .monaco-action-bar.vertical .action-menu-item { + flex: 1 1 auto; + display: flex; + height: 2em; + align-items: center; + position: relative; + margin: 0 4px; + border-radius: 4px; +} + +.monaco-menu .monaco-action-bar.vertical .action-menu-item:hover .keybinding, +.monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .keybinding { + opacity: unset; +} + +.monaco-menu .monaco-action-bar.vertical .action-label { + flex: 1 1 auto; + text-decoration: none; + padding: 0 1em; + background: none; + font-size: 12px; + line-height: 1; +} + +.monaco-menu .monaco-action-bar.vertical .keybinding, +.monaco-menu .monaco-action-bar.vertical .submenu-indicator { + display: inline-block; + flex: 2 1 auto; + padding: 0 1em; + text-align: right; + font-size: 12px; + line-height: 1; +} + +.monaco-menu .monaco-action-bar.vertical .submenu-indicator { + height: 100%; +} + +.monaco-menu .monaco-action-bar.vertical .submenu-indicator.codicon { + font-size: 16px !important; + display: flex; + align-items: center; +} + +.monaco-menu .monaco-action-bar.vertical .submenu-indicator.codicon::before { + margin-left: auto; + margin-right: -20px; +} + +.monaco-menu .monaco-action-bar.vertical .action-item.disabled .keybinding, +.monaco-menu .monaco-action-bar.vertical .action-item.disabled .submenu-indicator { + opacity: 0.4; +} + +.monaco-menu .monaco-action-bar.vertical .action-label:not(.separator) { + display: inline-block; + box-sizing: border-box; + margin: 0; +} + +.monaco-menu .monaco-action-bar.vertical .action-item { + position: static; + overflow: visible; +} + +.monaco-menu .monaco-action-bar.vertical .action-item .monaco-submenu { + position: absolute; +} + +.monaco-menu .monaco-action-bar.vertical .action-label.separator { + width: 100%; + height: 0px !important; + opacity: 1; +} + +.monaco-menu .monaco-action-bar.vertical .action-label.separator.text { + padding: 0.7em 1em 0.1em 1em; + font-weight: bold; + opacity: 1; +} + +.monaco-menu .monaco-action-bar.vertical .action-label:hover { + color: inherit; +} + +.monaco-menu .monaco-action-bar.vertical .menu-item-check { + position: absolute; + visibility: hidden; + width: 1em; + height: 100%; +} + +.monaco-menu .monaco-action-bar.vertical .action-menu-item.checked .menu-item-check { + visibility: visible; + display: flex; + align-items: center; + justify-content: center; +} + +/* Context Menu */ + +.context-view.monaco-menu-container { + outline: 0; + border: none; + animation: fadeIn 0.083s linear; + -webkit-app-region: no-drag; +} + +.context-view.monaco-menu-container :focus, +.context-view.monaco-menu-container .monaco-action-bar.vertical:focus, +.context-view.monaco-menu-container .monaco-action-bar.vertical :focus { + outline: 0; +} + +.hc-black .context-view.monaco-menu-container, +.hc-light .context-view.monaco-menu-container, +:host-context(.hc-black) .context-view.monaco-menu-container, +:host-context(.hc-light) .context-view.monaco-menu-container { + box-shadow: none; +} + +.hc-black .monaco-menu .monaco-action-bar.vertical .action-item.focused, +.hc-light .monaco-menu .monaco-action-bar.vertical .action-item.focused, +:host-context(.hc-black) .monaco-menu .monaco-action-bar.vertical .action-item.focused, +:host-context(.hc-light) .monaco-menu .monaco-action-bar.vertical .action-item.focused { + background: none; +} + +/* Vertical Action Bar Styles */ + +.monaco-menu .monaco-action-bar.vertical { + padding: 4px 0; +} + +.monaco-menu .monaco-action-bar.vertical .action-menu-item { + height: 2em; +} + +.monaco-menu .monaco-action-bar.vertical .action-label:not(.separator), +.monaco-menu .monaco-action-bar.vertical .keybinding { + font-size: inherit; + padding: 0 2em; + max-height: 100%; +} + +.monaco-menu .monaco-action-bar.vertical .menu-item-check { + font-size: inherit; + width: 2em; +} + +.monaco-menu .monaco-action-bar.vertical .action-label.separator { + font-size: inherit; + margin: 5px 0 !important; + padding: 0; + border-radius: 0; +} + +.linux .monaco-menu .monaco-action-bar.vertical .action-label.separator, +:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .action-label.separator { + margin-left: 0; + margin-right: 0; +} + +.monaco-menu .monaco-action-bar.vertical .submenu-indicator { + font-size: 60%; + padding: 0 1.8em; +} + +.linux .monaco-menu .monaco-action-bar.vertical .submenu-indicator, +:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .submenu-indicator { + height: 100%; + mask-size: 10px 10px; + -webkit-mask-size: 10px 10px; +} + +.monaco-menu .action-item { + cursor: default; +}` + ); + if (isForShadowDom) { + result += ` + /* Arrows */ + .monaco-scrollable-element > .scrollbar > .scra { + cursor: pointer; + font-size: 11px !important; + } + + .monaco-scrollable-element > .visible { + opacity: 1; + + /* Background rule added for IE9 - to allow clicks on dom node */ + background:rgba(0,0,0,0); + + transition: opacity 100ms linear; + } + .monaco-scrollable-element > .invisible { + opacity: 0; + pointer-events: none; + } + .monaco-scrollable-element > .invisible.fade { + transition: opacity 800ms linear; + } + + /* Scrollable Content Inset Shadow */ + .monaco-scrollable-element > .shadow { + position: absolute; + display: none; + } + .monaco-scrollable-element > .shadow.top { + display: block; + top: 0; + left: 3px; + height: 3px; + width: 100%; + } + .monaco-scrollable-element > .shadow.left { + display: block; + top: 3px; + left: 0; + height: 100%; + width: 3px; + } + .monaco-scrollable-element > .shadow.top-left-corner { + display: block; + top: 0; + left: 0; + height: 3px; + width: 3px; + } + `; + const scrollbarShadowColor = style.scrollbarShadow; + if (scrollbarShadowColor) { + result += ` + .monaco-scrollable-element > .shadow.top { + box-shadow: ${scrollbarShadowColor} 0 6px 6px -6px inset; + } + + .monaco-scrollable-element > .shadow.left { + box-shadow: ${scrollbarShadowColor} 6px 0 6px -6px inset; + } + + .monaco-scrollable-element > .shadow.top.left { + box-shadow: ${scrollbarShadowColor} 6px 6px 6px -6px inset; + } + `; + } + const scrollbarSliderBackgroundColor = style.scrollbarSliderBackground; + if (scrollbarSliderBackgroundColor) { + result += ` + .monaco-scrollable-element > .scrollbar > .slider { + background: ${scrollbarSliderBackgroundColor}; + } + `; + } + const scrollbarSliderHoverBackgroundColor = style.scrollbarSliderHoverBackground; + if (scrollbarSliderHoverBackgroundColor) { + result += ` + .monaco-scrollable-element > .scrollbar > .slider:hover { + background: ${scrollbarSliderHoverBackgroundColor}; + } + `; + } + const scrollbarSliderActiveBackgroundColor = style.scrollbarSliderActiveBackground; + if (scrollbarSliderActiveBackgroundColor) { + result += ` + .monaco-scrollable-element > .scrollbar > .slider.active { + background: ${scrollbarSliderActiveBackgroundColor}; + } + `; + } + } + return result; +} +var MENU_MNEMONIC_REGEX, MENU_ESCAPED_MNEMONIC_REGEX, HorizontalDirection, VerticalDirection, Menu, BaseMenuActionViewItem, SubmenuMenuActionViewItem, MenuSeparatorActionViewItem; +var init_menu = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/menu/menu.js"() { + init_browser(); + init_touch(); + init_dom(); + init_keyboardEvent(); + init_mouseEvent(); + init_actionbar2(); + init_actionViewItems(); + init_contextview2(); + init_scrollableElement(); + init_actions(); + init_async(); + init_codicons(); + init_codiconsUtil(); + init_themables(); + init_iconLabels2(); + init_lifecycle(); + init_platform(); + init_strings(); + MENU_MNEMONIC_REGEX = /\(&([^\s&])\)|(^|[^&])&([^\s&])/; + MENU_ESCAPED_MNEMONIC_REGEX = /(&)?(&)([^\s&])/g; + (function(HorizontalDirection2) { + HorizontalDirection2[HorizontalDirection2["Right"] = 0] = "Right"; + HorizontalDirection2[HorizontalDirection2["Left"] = 1] = "Left"; + })(HorizontalDirection || (HorizontalDirection = {})); + (function(VerticalDirection2) { + VerticalDirection2[VerticalDirection2["Above"] = 0] = "Above"; + VerticalDirection2[VerticalDirection2["Below"] = 1] = "Below"; + })(VerticalDirection || (VerticalDirection = {})); + Menu = class _Menu extends ActionBar { + constructor(container, actions, options2, menuStyles) { + container.classList.add("monaco-menu-container"); + container.setAttribute("role", "presentation"); + const menuElement = document.createElement("div"); + menuElement.classList.add("monaco-menu"); + menuElement.setAttribute("role", "presentation"); + super(menuElement, { + orientation: 1, + actionViewItemProvider: (action) => this.doGetActionViewItem(action, options2, parentData), + context: options2.context, + actionRunner: options2.actionRunner, + ariaLabel: options2.ariaLabel, + ariaRole: "menu", + focusOnlyEnabledItems: true, + triggerKeys: { keys: [3, ...isMacintosh || isLinux ? [ + 10 + /* KeyCode.Space */ + ] : []], keyDown: true } + }); + this.menuStyles = menuStyles; + this.menuElement = menuElement; + this.actionsList.tabIndex = 0; + this.initializeOrUpdateStyleSheet(container, menuStyles); + this._register(Gesture.addTarget(menuElement)); + this._register(addDisposableListener(menuElement, EventType.KEY_DOWN, (e) => { + const event = new StandardKeyboardEvent(e); + if (event.equals( + 2 + /* KeyCode.Tab */ + )) { + e.preventDefault(); + } + })); + if (options2.enableMnemonics) { + this._register(addDisposableListener(menuElement, EventType.KEY_DOWN, (e) => { + const key = e.key.toLocaleLowerCase(); + if (this.mnemonics.has(key)) { + EventHelper.stop(e, true); + const actions2 = this.mnemonics.get(key); + if (actions2.length === 1) { + if (actions2[0] instanceof SubmenuMenuActionViewItem && actions2[0].container) { + this.focusItemByElement(actions2[0].container); + } + actions2[0].onClick(e); + } + if (actions2.length > 1) { + const action = actions2.shift(); + if (action && action.container) { + this.focusItemByElement(action.container); + actions2.push(action); + } + this.mnemonics.set(key, actions2); + } + } + })); + } + if (isLinux) { + this._register(addDisposableListener(menuElement, EventType.KEY_DOWN, (e) => { + const event = new StandardKeyboardEvent(e); + if (event.equals( + 14 + /* KeyCode.Home */ + ) || event.equals( + 11 + /* KeyCode.PageUp */ + )) { + this.focusedItem = this.viewItems.length - 1; + this.focusNext(); + EventHelper.stop(e, true); + } else if (event.equals( + 13 + /* KeyCode.End */ + ) || event.equals( + 12 + /* KeyCode.PageDown */ + )) { + this.focusedItem = 0; + this.focusPrevious(); + EventHelper.stop(e, true); + } + })); + } + this._register(addDisposableListener(this.domNode, EventType.MOUSE_OUT, (e) => { + const relatedTarget = e.relatedTarget; + if (!isAncestor(relatedTarget, this.domNode)) { + this.focusedItem = void 0; + this.updateFocus(); + e.stopPropagation(); + } + })); + this._register(addDisposableListener(this.actionsList, EventType.MOUSE_OVER, (e) => { + let target = e.target; + if (!target || !isAncestor(target, this.actionsList) || target === this.actionsList) { + return; + } + while (target.parentElement !== this.actionsList && target.parentElement !== null) { + target = target.parentElement; + } + if (target.classList.contains("action-item")) { + const lastFocusedItem = this.focusedItem; + this.setFocusedItem(target); + if (lastFocusedItem !== this.focusedItem) { + this.updateFocus(); + } + } + })); + this._register(Gesture.addTarget(this.actionsList)); + this._register(addDisposableListener(this.actionsList, EventType2.Tap, (e) => { + let target = e.initialTarget; + if (!target || !isAncestor(target, this.actionsList) || target === this.actionsList) { + return; + } + while (target.parentElement !== this.actionsList && target.parentElement !== null) { + target = target.parentElement; + } + if (target.classList.contains("action-item")) { + const lastFocusedItem = this.focusedItem; + this.setFocusedItem(target); + if (lastFocusedItem !== this.focusedItem) { + this.updateFocus(); + } + } + })); + const parentData = { + parent: this + }; + this.mnemonics = /* @__PURE__ */ new Map(); + this.scrollableElement = this._register(new DomScrollableElement(menuElement, { + alwaysConsumeMouseWheel: true, + horizontal: 2, + vertical: 3, + verticalScrollbarSize: 7, + handleMouseWheel: true, + useShadows: true + })); + const scrollElement = this.scrollableElement.getDomNode(); + scrollElement.style.position = ""; + this.styleScrollElement(scrollElement, menuStyles); + this._register(addDisposableListener(menuElement, EventType2.Change, (e) => { + EventHelper.stop(e, true); + const scrollTop = this.scrollableElement.getScrollPosition().scrollTop; + this.scrollableElement.setScrollPosition({ scrollTop: scrollTop - e.translationY }); + })); + this._register(addDisposableListener(scrollElement, EventType.MOUSE_UP, (e) => { + e.preventDefault(); + })); + const window2 = getWindow(container); + menuElement.style.maxHeight = `${Math.max(10, window2.innerHeight - container.getBoundingClientRect().top - 35)}px`; + actions = actions.filter((a3, idx) => { + var _a10; + if ((_a10 = options2.submenuIds) === null || _a10 === void 0 ? void 0 : _a10.has(a3.id)) { + console.warn(`Found submenu cycle: ${a3.id}`); + return false; + } + if (a3 instanceof Separator) { + if (idx === actions.length - 1 || idx === 0) { + return false; + } + const prevAction = actions[idx - 1]; + if (prevAction instanceof Separator) { + return false; + } + } + return true; + }); + this.push(actions, { icon: true, label: true, isMenu: true }); + container.appendChild(this.scrollableElement.getDomNode()); + this.scrollableElement.scanDomNode(); + this.viewItems.filter((item) => !(item instanceof MenuSeparatorActionViewItem)).forEach((item, index, array2) => { + item.updatePositionInSet(index + 1, array2.length); + }); + } + initializeOrUpdateStyleSheet(container, style) { + if (!this.styleSheet) { + if (isInShadowDOM(container)) { + this.styleSheet = createStyleSheet(container); + } else { + if (!_Menu.globalStyleSheet) { + _Menu.globalStyleSheet = createStyleSheet(); + } + this.styleSheet = _Menu.globalStyleSheet; + } + } + this.styleSheet.textContent = getMenuWidgetCSS(style, isInShadowDOM(container)); + } + styleScrollElement(scrollElement, style) { + var _a10, _b4; + const fgColor = (_a10 = style.foregroundColor) !== null && _a10 !== void 0 ? _a10 : ""; + const bgColor = (_b4 = style.backgroundColor) !== null && _b4 !== void 0 ? _b4 : ""; + const border = style.borderColor ? `1px solid ${style.borderColor}` : ""; + const borderRadius = "5px"; + const shadow = style.shadowColor ? `0 2px 8px ${style.shadowColor}` : ""; + scrollElement.style.outline = border; + scrollElement.style.borderRadius = borderRadius; + scrollElement.style.color = fgColor; + scrollElement.style.backgroundColor = bgColor; + scrollElement.style.boxShadow = shadow; + } + getContainer() { + return this.scrollableElement.getDomNode(); + } + get onScroll() { + return this.scrollableElement.onScroll; + } + focusItemByElement(element) { + const lastFocusedItem = this.focusedItem; + this.setFocusedItem(element); + if (lastFocusedItem !== this.focusedItem) { + this.updateFocus(); + } + } + setFocusedItem(element) { + for (let i = 0; i < this.actionsList.children.length; i++) { + const elem = this.actionsList.children[i]; + if (element === elem) { + this.focusedItem = i; + break; + } + } + } + updateFocus(fromRight) { + super.updateFocus(fromRight, true, true); + if (typeof this.focusedItem !== "undefined") { + this.scrollableElement.setScrollPosition({ + scrollTop: Math.round(this.menuElement.scrollTop) + }); + } + } + doGetActionViewItem(action, options2, parentData) { + if (action instanceof Separator) { + return new MenuSeparatorActionViewItem(options2.context, action, { icon: true }, this.menuStyles); + } else if (action instanceof SubmenuAction) { + const menuActionViewItem = new SubmenuMenuActionViewItem(action, action.actions, parentData, __spreadProps(__spreadValues({}, options2), { submenuIds: /* @__PURE__ */ new Set([...options2.submenuIds || [], action.id]) }), this.menuStyles); + if (options2.enableMnemonics) { + const mnemonic = menuActionViewItem.getMnemonic(); + if (mnemonic && menuActionViewItem.isEnabled()) { + let actionViewItems = []; + if (this.mnemonics.has(mnemonic)) { + actionViewItems = this.mnemonics.get(mnemonic); + } + actionViewItems.push(menuActionViewItem); + this.mnemonics.set(mnemonic, actionViewItems); + } + } + return menuActionViewItem; + } else { + const menuItemOptions = { enableMnemonics: options2.enableMnemonics, useEventAsContext: options2.useEventAsContext }; + if (options2.getKeyBinding) { + const keybinding = options2.getKeyBinding(action); + if (keybinding) { + const keybindingLabel = keybinding.getLabel(); + if (keybindingLabel) { + menuItemOptions.keybinding = keybindingLabel; + } + } + } + const menuActionViewItem = new BaseMenuActionViewItem(options2.context, action, menuItemOptions, this.menuStyles); + if (options2.enableMnemonics) { + const mnemonic = menuActionViewItem.getMnemonic(); + if (mnemonic && menuActionViewItem.isEnabled()) { + let actionViewItems = []; + if (this.mnemonics.has(mnemonic)) { + actionViewItems = this.mnemonics.get(mnemonic); + } + actionViewItems.push(menuActionViewItem); + this.mnemonics.set(mnemonic, actionViewItems); + } + } + return menuActionViewItem; + } + } + }; + BaseMenuActionViewItem = class extends BaseActionViewItem { + constructor(ctx, action, options2, menuStyle) { + options2.isMenu = true; + super(action, action, options2); + this.menuStyle = menuStyle; + this.options = options2; + this.options.icon = options2.icon !== void 0 ? options2.icon : false; + this.options.label = options2.label !== void 0 ? options2.label : true; + this.cssClass = ""; + if (this.options.label && options2.enableMnemonics) { + const label = this.action.label; + if (label) { + const matches2 = MENU_MNEMONIC_REGEX.exec(label); + if (matches2) { + this.mnemonic = (!!matches2[1] ? matches2[1] : matches2[3]).toLocaleLowerCase(); + } + } + } + this.runOnceToEnableMouseUp = new RunOnceScheduler(() => { + if (!this.element) { + return; + } + this._register(addDisposableListener(this.element, EventType.MOUSE_UP, (e) => { + EventHelper.stop(e, true); + if (isFirefox2) { + const mouseEvent = new StandardMouseEvent(getWindow(this.element), e); + if (mouseEvent.rightButton) { + return; + } + this.onClick(e); + } else { + setTimeout(() => { + this.onClick(e); + }, 0); + } + })); + this._register(addDisposableListener(this.element, EventType.CONTEXT_MENU, (e) => { + EventHelper.stop(e, true); + })); + }, 100); + this._register(this.runOnceToEnableMouseUp); + } + render(container) { + super.render(container); + if (!this.element) { + return; + } + this.container = container; + this.item = append(this.element, $("a.action-menu-item")); + if (this._action.id === Separator.ID) { + this.item.setAttribute("role", "presentation"); + } else { + this.item.setAttribute("role", "menuitem"); + if (this.mnemonic) { + this.item.setAttribute("aria-keyshortcuts", `${this.mnemonic}`); + } + } + this.check = append(this.item, $("span.menu-item-check" + ThemeIcon.asCSSSelector(Codicon.menuSelection))); + this.check.setAttribute("role", "none"); + this.label = append(this.item, $("span.action-label")); + if (this.options.label && this.options.keybinding) { + append(this.item, $("span.keybinding")).textContent = this.options.keybinding; + } + this.runOnceToEnableMouseUp.schedule(); + this.updateClass(); + this.updateLabel(); + this.updateTooltip(); + this.updateEnabled(); + this.updateChecked(); + this.applyStyle(); + } + blur() { + super.blur(); + this.applyStyle(); + } + focus() { + var _a10; + super.focus(); + (_a10 = this.item) === null || _a10 === void 0 ? void 0 : _a10.focus(); + this.applyStyle(); + } + updatePositionInSet(pos, setSize) { + if (this.item) { + this.item.setAttribute("aria-posinset", `${pos}`); + this.item.setAttribute("aria-setsize", `${setSize}`); + } + } + updateLabel() { + var _a10; + if (!this.label) { + return; + } + if (this.options.label) { + clearNode(this.label); + let label = stripIcons(this.action.label); + if (label) { + const cleanLabel = cleanMnemonic(label); + if (!this.options.enableMnemonics) { + label = cleanLabel; + } + this.label.setAttribute("aria-label", cleanLabel.replace(/&&/g, "&")); + const matches2 = MENU_MNEMONIC_REGEX.exec(label); + if (matches2) { + label = escape(label); + MENU_ESCAPED_MNEMONIC_REGEX.lastIndex = 0; + let escMatch = MENU_ESCAPED_MNEMONIC_REGEX.exec(label); + while (escMatch && escMatch[1]) { + escMatch = MENU_ESCAPED_MNEMONIC_REGEX.exec(label); + } + const replaceDoubleEscapes = (str) => str.replace(/&&/g, "&"); + if (escMatch) { + this.label.append(ltrim(replaceDoubleEscapes(label.substr(0, escMatch.index)), " "), $("u", { "aria-hidden": "true" }, escMatch[3]), rtrim(replaceDoubleEscapes(label.substr(escMatch.index + escMatch[0].length)), " ")); + } else { + this.label.innerText = replaceDoubleEscapes(label).trim(); + } + (_a10 = this.item) === null || _a10 === void 0 ? void 0 : _a10.setAttribute("aria-keyshortcuts", (!!matches2[1] ? matches2[1] : matches2[3]).toLocaleLowerCase()); + } else { + this.label.innerText = label.replace(/&&/g, "&").trim(); + } + } + } + } + updateTooltip() { + } + updateClass() { + if (this.cssClass && this.item) { + this.item.classList.remove(...this.cssClass.split(" ")); + } + if (this.options.icon && this.label) { + this.cssClass = this.action.class || ""; + this.label.classList.add("icon"); + if (this.cssClass) { + this.label.classList.add(...this.cssClass.split(" ")); + } + this.updateEnabled(); + } else if (this.label) { + this.label.classList.remove("icon"); + } + } + updateEnabled() { + if (this.action.enabled) { + if (this.element) { + this.element.classList.remove("disabled"); + this.element.removeAttribute("aria-disabled"); + } + if (this.item) { + this.item.classList.remove("disabled"); + this.item.removeAttribute("aria-disabled"); + this.item.tabIndex = 0; + } + } else { + if (this.element) { + this.element.classList.add("disabled"); + this.element.setAttribute("aria-disabled", "true"); + } + if (this.item) { + this.item.classList.add("disabled"); + this.item.setAttribute("aria-disabled", "true"); + } + } + } + updateChecked() { + if (!this.item) { + return; + } + const checked = this.action.checked; + this.item.classList.toggle("checked", !!checked); + if (checked !== void 0) { + this.item.setAttribute("role", "menuitemcheckbox"); + this.item.setAttribute("aria-checked", checked ? "true" : "false"); + } else { + this.item.setAttribute("role", "menuitem"); + this.item.setAttribute("aria-checked", ""); + } + } + getMnemonic() { + return this.mnemonic; + } + applyStyle() { + const isSelected = this.element && this.element.classList.contains("focused"); + const fgColor = isSelected && this.menuStyle.selectionForegroundColor ? this.menuStyle.selectionForegroundColor : this.menuStyle.foregroundColor; + const bgColor = isSelected && this.menuStyle.selectionBackgroundColor ? this.menuStyle.selectionBackgroundColor : void 0; + const outline = isSelected && this.menuStyle.selectionBorderColor ? `1px solid ${this.menuStyle.selectionBorderColor}` : ""; + const outlineOffset = isSelected && this.menuStyle.selectionBorderColor ? `-1px` : ""; + if (this.item) { + this.item.style.color = fgColor !== null && fgColor !== void 0 ? fgColor : ""; + this.item.style.backgroundColor = bgColor !== null && bgColor !== void 0 ? bgColor : ""; + this.item.style.outline = outline; + this.item.style.outlineOffset = outlineOffset; + } + if (this.check) { + this.check.style.color = fgColor !== null && fgColor !== void 0 ? fgColor : ""; + } + } + }; + SubmenuMenuActionViewItem = class extends BaseMenuActionViewItem { + constructor(action, submenuActions, parentData, submenuOptions, menuStyles) { + super(action, action, submenuOptions, menuStyles); + this.submenuActions = submenuActions; + this.parentData = parentData; + this.submenuOptions = submenuOptions; + this.mysubmenu = null; + this.submenuDisposables = this._register(new DisposableStore()); + this.mouseOver = false; + this.expandDirection = submenuOptions && submenuOptions.expandDirection !== void 0 ? submenuOptions.expandDirection : { horizontal: HorizontalDirection.Right, vertical: VerticalDirection.Below }; + this.showScheduler = new RunOnceScheduler(() => { + if (this.mouseOver) { + this.cleanupExistingSubmenu(false); + this.createSubmenu(false); + } + }, 250); + this.hideScheduler = new RunOnceScheduler(() => { + if (this.element && (!isAncestor(getActiveElement(), this.element) && this.parentData.submenu === this.mysubmenu)) { + this.parentData.parent.focus(false); + this.cleanupExistingSubmenu(true); + } + }, 750); + } + render(container) { + super.render(container); + if (!this.element) { + return; + } + if (this.item) { + this.item.classList.add("monaco-submenu-item"); + this.item.tabIndex = 0; + this.item.setAttribute("aria-haspopup", "true"); + this.updateAriaExpanded("false"); + this.submenuIndicator = append(this.item, $("span.submenu-indicator" + ThemeIcon.asCSSSelector(Codicon.menuSubmenu))); + this.submenuIndicator.setAttribute("aria-hidden", "true"); + } + this._register(addDisposableListener(this.element, EventType.KEY_UP, (e) => { + const event = new StandardKeyboardEvent(e); + if (event.equals( + 17 + /* KeyCode.RightArrow */ + ) || event.equals( + 3 + /* KeyCode.Enter */ + )) { + EventHelper.stop(e, true); + this.createSubmenu(true); + } + })); + this._register(addDisposableListener(this.element, EventType.KEY_DOWN, (e) => { + const event = new StandardKeyboardEvent(e); + if (getActiveElement() === this.item) { + if (event.equals( + 17 + /* KeyCode.RightArrow */ + ) || event.equals( + 3 + /* KeyCode.Enter */ + )) { + EventHelper.stop(e, true); + } + } + })); + this._register(addDisposableListener(this.element, EventType.MOUSE_OVER, (e) => { + if (!this.mouseOver) { + this.mouseOver = true; + this.showScheduler.schedule(); + } + })); + this._register(addDisposableListener(this.element, EventType.MOUSE_LEAVE, (e) => { + this.mouseOver = false; + })); + this._register(addDisposableListener(this.element, EventType.FOCUS_OUT, (e) => { + if (this.element && !isAncestor(getActiveElement(), this.element)) { + this.hideScheduler.schedule(); + } + })); + this._register(this.parentData.parent.onScroll(() => { + if (this.parentData.submenu === this.mysubmenu) { + this.parentData.parent.focus(false); + this.cleanupExistingSubmenu(true); + } + })); + } + updateEnabled() { + } + onClick(e) { + EventHelper.stop(e, true); + this.cleanupExistingSubmenu(false); + this.createSubmenu(true); + } + cleanupExistingSubmenu(force) { + if (this.parentData.submenu && (force || this.parentData.submenu !== this.mysubmenu)) { + try { + this.parentData.submenu.dispose(); + } catch (_a10) { + } + this.parentData.submenu = void 0; + this.updateAriaExpanded("false"); + if (this.submenuContainer) { + this.submenuDisposables.clear(); + this.submenuContainer = void 0; + } + } + } + calculateSubmenuMenuLayout(windowDimensions, submenu, entry, expandDirection) { + const ret = { top: 0, left: 0 }; + ret.left = layout(windowDimensions.width, submenu.width, { position: expandDirection.horizontal === HorizontalDirection.Right ? 0 : 1, offset: entry.left, size: entry.width }); + if (ret.left >= entry.left && ret.left < entry.left + entry.width) { + if (entry.left + 10 + submenu.width <= windowDimensions.width) { + ret.left = entry.left + 10; + } + entry.top += 10; + entry.height = 0; + } + ret.top = layout(windowDimensions.height, submenu.height, { position: 0, offset: entry.top, size: 0 }); + if (ret.top + submenu.height === entry.top && ret.top + entry.height + submenu.height <= windowDimensions.height) { + ret.top += entry.height; + } + return ret; + } + createSubmenu(selectFirstItem = true) { + if (!this.element) { + return; + } + if (!this.parentData.submenu) { + this.updateAriaExpanded("true"); + this.submenuContainer = append(this.element, $("div.monaco-submenu")); + this.submenuContainer.classList.add("menubar-menu-items-holder", "context-view"); + const computedStyles = getWindow(this.parentData.parent.domNode).getComputedStyle(this.parentData.parent.domNode); + const paddingTop = parseFloat(computedStyles.paddingTop || "0") || 0; + this.submenuContainer.style.zIndex = "1"; + this.submenuContainer.style.position = "fixed"; + this.submenuContainer.style.top = "0"; + this.submenuContainer.style.left = "0"; + this.parentData.submenu = new Menu(this.submenuContainer, this.submenuActions.length ? this.submenuActions : [new EmptySubmenuAction()], this.submenuOptions, this.menuStyle); + const entryBox = this.element.getBoundingClientRect(); + const entryBoxUpdated = { + top: entryBox.top - paddingTop, + left: entryBox.left, + height: entryBox.height + 2 * paddingTop, + width: entryBox.width + }; + const viewBox = this.submenuContainer.getBoundingClientRect(); + const window2 = getWindow(this.element); + const { top, left } = this.calculateSubmenuMenuLayout(new Dimension(window2.innerWidth, window2.innerHeight), Dimension.lift(viewBox), entryBoxUpdated, this.expandDirection); + this.submenuContainer.style.left = `${left - viewBox.left}px`; + this.submenuContainer.style.top = `${top - viewBox.top}px`; + this.submenuDisposables.add(addDisposableListener(this.submenuContainer, EventType.KEY_UP, (e) => { + const event = new StandardKeyboardEvent(e); + if (event.equals( + 15 + /* KeyCode.LeftArrow */ + )) { + EventHelper.stop(e, true); + this.parentData.parent.focus(); + this.cleanupExistingSubmenu(true); + } + })); + this.submenuDisposables.add(addDisposableListener(this.submenuContainer, EventType.KEY_DOWN, (e) => { + const event = new StandardKeyboardEvent(e); + if (event.equals( + 15 + /* KeyCode.LeftArrow */ + )) { + EventHelper.stop(e, true); + } + })); + this.submenuDisposables.add(this.parentData.submenu.onDidCancel(() => { + this.parentData.parent.focus(); + this.cleanupExistingSubmenu(true); + })); + this.parentData.submenu.focus(selectFirstItem); + this.mysubmenu = this.parentData.submenu; + } else { + this.parentData.submenu.focus(false); + } + } + updateAriaExpanded(value) { + var _a10; + if (this.item) { + (_a10 = this.item) === null || _a10 === void 0 ? void 0 : _a10.setAttribute("aria-expanded", value); + } + } + applyStyle() { + super.applyStyle(); + const isSelected = this.element && this.element.classList.contains("focused"); + const fgColor = isSelected && this.menuStyle.selectionForegroundColor ? this.menuStyle.selectionForegroundColor : this.menuStyle.foregroundColor; + if (this.submenuIndicator) { + this.submenuIndicator.style.color = fgColor !== null && fgColor !== void 0 ? fgColor : ""; + } + } + dispose() { + super.dispose(); + this.hideScheduler.dispose(); + if (this.mysubmenu) { + this.mysubmenu.dispose(); + this.mysubmenu = null; + } + if (this.submenuContainer) { + this.submenuContainer = void 0; + } + } + }; + MenuSeparatorActionViewItem = class extends ActionViewItem { + constructor(context, action, options2, menuStyles) { + super(context, action, options2); + this.menuStyles = menuStyles; + } + render(container) { + super.render(container); + if (this.label) { + this.label.style.borderBottomColor = this.menuStyles.separatorColor ? `${this.menuStyles.separatorColor}` : ""; + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/contextview/browser/contextMenuHandler.js +var ContextMenuHandler; +var init_contextMenuHandler = __esm({ + "node_modules/monaco-editor/esm/vs/platform/contextview/browser/contextMenuHandler.js"() { + init_dom(); + init_mouseEvent(); + init_menu(); + init_actions(); + init_errors(); + init_lifecycle(); + init_defaultStyles(); + ContextMenuHandler = class { + constructor(contextViewService, telemetryService, notificationService, keybindingService) { + this.contextViewService = contextViewService; + this.telemetryService = telemetryService; + this.notificationService = notificationService; + this.keybindingService = keybindingService; + this.focusToReturn = null; + this.lastContainer = null; + this.block = null; + this.blockDisposable = null; + this.options = { blockMouse: true }; + } + configure(options2) { + this.options = options2; + } + showContextMenu(delegate) { + const actions = delegate.getActions(); + if (!actions.length) { + return; + } + this.focusToReturn = getActiveElement(); + let menu; + const shadowRootElement = isHTMLElement(delegate.domForShadowRoot) ? delegate.domForShadowRoot : void 0; + this.contextViewService.showContextView({ + getAnchor: () => delegate.getAnchor(), + canRelayout: false, + anchorAlignment: delegate.anchorAlignment, + anchorAxisAlignment: delegate.anchorAxisAlignment, + render: (container) => { + var _a10; + this.lastContainer = container; + const className = delegate.getMenuClassName ? delegate.getMenuClassName() : ""; + if (className) { + container.className += " " + className; + } + if (this.options.blockMouse) { + this.block = container.appendChild($(".context-view-block")); + this.block.style.position = "fixed"; + this.block.style.cursor = "initial"; + this.block.style.left = "0"; + this.block.style.top = "0"; + this.block.style.width = "100%"; + this.block.style.height = "100%"; + this.block.style.zIndex = "-1"; + (_a10 = this.blockDisposable) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + this.blockDisposable = addDisposableListener(this.block, EventType.MOUSE_DOWN, (e) => e.stopPropagation()); + } + const menuDisposables = new DisposableStore(); + const actionRunner = delegate.actionRunner || new ActionRunner(); + actionRunner.onWillRun((evt) => this.onActionRun(evt, !delegate.skipTelemetry), this, menuDisposables); + actionRunner.onDidRun(this.onDidActionRun, this, menuDisposables); + menu = new Menu(container, actions, { + actionViewItemProvider: delegate.getActionViewItem, + context: delegate.getActionsContext ? delegate.getActionsContext() : null, + actionRunner, + getKeyBinding: delegate.getKeyBinding ? delegate.getKeyBinding : (action) => this.keybindingService.lookupKeybinding(action.id) + }, defaultMenuStyles); + menu.onDidCancel(() => this.contextViewService.hideContextView(true), null, menuDisposables); + menu.onDidBlur(() => this.contextViewService.hideContextView(true), null, menuDisposables); + const targetWindow = getWindow(container); + menuDisposables.add(addDisposableListener(targetWindow, EventType.BLUR, () => this.contextViewService.hideContextView(true))); + menuDisposables.add(addDisposableListener(targetWindow, EventType.MOUSE_DOWN, (e) => { + if (e.defaultPrevented) { + return; + } + const event = new StandardMouseEvent(targetWindow, e); + let element = event.target; + if (event.rightButton) { + return; + } + while (element) { + if (element === container) { + return; + } + element = element.parentElement; + } + this.contextViewService.hideContextView(true); + })); + return combinedDisposable(menuDisposables, menu); + }, + focus: () => { + menu === null || menu === void 0 ? void 0 : menu.focus(!!delegate.autoSelectFirstItem); + }, + onHide: (didCancel) => { + var _a10, _b4, _c2; + (_a10 = delegate.onHide) === null || _a10 === void 0 ? void 0 : _a10.call(delegate, !!didCancel); + if (this.block) { + this.block.remove(); + this.block = null; + } + (_b4 = this.blockDisposable) === null || _b4 === void 0 ? void 0 : _b4.dispose(); + this.blockDisposable = null; + if (!!this.lastContainer && (getActiveElement() === this.lastContainer || isAncestor(getActiveElement(), this.lastContainer))) { + (_c2 = this.focusToReturn) === null || _c2 === void 0 ? void 0 : _c2.focus(); + } + this.lastContainer = null; + } + }, shadowRootElement, !!shadowRootElement); + } + onActionRun(e, logTelemetry) { + if (logTelemetry) { + this.telemetryService.publicLog2("workbenchActionExecuted", { id: e.action.id, from: "contextMenu" }); + } + this.contextViewService.hideContextView(false); + } + onDidActionRun(e) { + if (e.error && !isCancellationError(e.error)) { + this.notificationService.error(e.error); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/contextview/browser/contextMenuService.js +var __decorate29, __param26, ContextMenuService, ContextMenuMenuDelegate; +var init_contextMenuService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/contextview/browser/contextMenuService.js"() { + init_dom(); + init_actions(); + init_event(); + init_lifecycle(); + init_menuEntryActionViewItem2(); + init_actions2(); + init_contextkey(); + init_keybinding(); + init_notification(); + init_telemetry(); + init_contextMenuHandler(); + init_contextView(); + __decorate29 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param26 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + ContextMenuService = class ContextMenuService2 extends Disposable { + get contextMenuHandler() { + if (!this._contextMenuHandler) { + this._contextMenuHandler = new ContextMenuHandler(this.contextViewService, this.telemetryService, this.notificationService, this.keybindingService); + } + return this._contextMenuHandler; + } + constructor(telemetryService, notificationService, contextViewService, keybindingService, menuService, contextKeyService) { + super(); + this.telemetryService = telemetryService; + this.notificationService = notificationService; + this.contextViewService = contextViewService; + this.keybindingService = keybindingService; + this.menuService = menuService; + this.contextKeyService = contextKeyService; + this._contextMenuHandler = void 0; + this._onDidShowContextMenu = this._store.add(new Emitter()); + this.onDidShowContextMenu = this._onDidShowContextMenu.event; + this._onDidHideContextMenu = this._store.add(new Emitter()); + } + configure(options2) { + this.contextMenuHandler.configure(options2); + } + // ContextMenu + showContextMenu(delegate) { + delegate = ContextMenuMenuDelegate.transform(delegate, this.menuService, this.contextKeyService); + this.contextMenuHandler.showContextMenu(__spreadProps(__spreadValues({}, delegate), { + onHide: (didCancel) => { + var _a10; + (_a10 = delegate.onHide) === null || _a10 === void 0 ? void 0 : _a10.call(delegate, didCancel); + this._onDidHideContextMenu.fire(); + } + })); + ModifierKeyEmitter.getInstance().resetKeyStatus(); + this._onDidShowContextMenu.fire(); + } + }; + ContextMenuService = __decorate29([ + __param26(0, ITelemetryService), + __param26(1, INotificationService), + __param26(2, IContextViewService), + __param26(3, IKeybindingService), + __param26(4, IMenuService), + __param26(5, IContextKeyService) + ], ContextMenuService); + (function(ContextMenuMenuDelegate2) { + function is(thing) { + return thing && thing.menuId instanceof MenuId; + } + function transform(delegate, menuService, globalContextKeyService) { + if (!is(delegate)) { + return delegate; + } + const { menuId, menuActionOptions, contextKeyService } = delegate; + return __spreadProps(__spreadValues({}, delegate), { + getActions: () => { + const target = []; + if (menuId) { + const menu = menuService.createMenu(menuId, contextKeyService !== null && contextKeyService !== void 0 ? contextKeyService : globalContextKeyService); + createAndFillInContextMenuActions(menu, menuActionOptions, target); + menu.dispose(); + } + if (!delegate.getActions) { + return target; + } else { + return Separator.join(delegate.getActions(), target); + } + } + }); + } + ContextMenuMenuDelegate2.transform = transform; + })(ContextMenuMenuDelegate || (ContextMenuMenuDelegate = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/editor/common/editor.js +var EditorOpenSource; +var init_editor2 = __esm({ + "node_modules/monaco-editor/esm/vs/platform/editor/common/editor.js"() { + (function(EditorOpenSource2) { + EditorOpenSource2[EditorOpenSource2["API"] = 0] = "API"; + EditorOpenSource2[EditorOpenSource2["USER"] = 1] = "USER"; + })(EditorOpenSource || (EditorOpenSource = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/services/openerService.js +var __decorate30, __param27, CommandOpener, EditorOpener, OpenerService; +var init_openerService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/services/openerService.js"() { + init_dom(); + init_window(); + init_cancellation(); + init_linkedList(); + init_map(); + init_marshalling(); + init_network(); + init_resources(); + init_uri(); + init_codeEditorService(); + init_commands(); + init_editor2(); + init_opener(); + __decorate30 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param27 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + CommandOpener = class CommandOpener2 { + constructor(_commandService) { + this._commandService = _commandService; + } + open(target, options2) { + return __async(this, null, function* () { + if (!matchesScheme(target, Schemas.command)) { + return false; + } + if (!(options2 === null || options2 === void 0 ? void 0 : options2.allowCommands)) { + return true; + } + if (typeof target === "string") { + target = URI.parse(target); + } + if (Array.isArray(options2.allowCommands)) { + if (!options2.allowCommands.includes(target.path)) { + return true; + } + } + let args = []; + try { + args = parse3(decodeURIComponent(target.query)); + } catch (_a10) { + try { + args = parse3(target.query); + } catch (_b4) { + } + } + if (!Array.isArray(args)) { + args = [args]; + } + yield this._commandService.executeCommand(target.path, ...args); + return true; + }); + } + }; + CommandOpener = __decorate30([ + __param27(0, ICommandService) + ], CommandOpener); + EditorOpener = class EditorOpener2 { + constructor(_editorService) { + this._editorService = _editorService; + } + open(target, options2) { + return __async(this, null, function* () { + if (typeof target === "string") { + target = URI.parse(target); + } + const { selection, uri } = extractSelection(target); + target = uri; + if (target.scheme === Schemas.file) { + target = normalizePath(target); + } + yield this._editorService.openCodeEditor({ + resource: target, + options: __spreadValues({ + selection, + source: (options2 === null || options2 === void 0 ? void 0 : options2.fromUserGesture) ? EditorOpenSource.USER : EditorOpenSource.API + }, options2 === null || options2 === void 0 ? void 0 : options2.editorOptions) + }, this._editorService.getFocusedCodeEditor(), options2 === null || options2 === void 0 ? void 0 : options2.openToSide); + return true; + }); + } + }; + EditorOpener = __decorate30([ + __param27(0, ICodeEditorService) + ], EditorOpener); + OpenerService = class OpenerService2 { + constructor(editorService, commandService) { + this._openers = new LinkedList(); + this._validators = new LinkedList(); + this._resolvers = new LinkedList(); + this._resolvedUriTargets = new ResourceMap((uri) => uri.with({ path: null, fragment: null, query: null }).toString()); + this._externalOpeners = new LinkedList(); + this._defaultExternalOpener = { + openExternal: (href) => __async(this, null, function* () { + if (matchesSomeScheme(href, Schemas.http, Schemas.https)) { + windowOpenNoOpener(href); + } else { + mainWindow.location.href = href; + } + return true; + }) + }; + this._openers.push({ + open: (target, options2) => __async(this, null, function* () { + if ((options2 === null || options2 === void 0 ? void 0 : options2.openExternal) || matchesSomeScheme(target, Schemas.mailto, Schemas.http, Schemas.https, Schemas.vsls)) { + yield this._doOpenExternal(target, options2); + return true; + } + return false; + }) + }); + this._openers.push(new CommandOpener(commandService)); + this._openers.push(new EditorOpener(editorService)); + } + registerOpener(opener) { + const remove = this._openers.unshift(opener); + return { dispose: remove }; + } + open(target, options2) { + return __async(this, null, function* () { + var _a10; + const targetURI = typeof target === "string" ? URI.parse(target) : target; + const validationTarget = (_a10 = this._resolvedUriTargets.get(targetURI)) !== null && _a10 !== void 0 ? _a10 : target; + for (const validator of this._validators) { + if (!(yield validator.shouldOpen(validationTarget, options2))) { + return false; + } + } + for (const opener of this._openers) { + const handled = yield opener.open(target, options2); + if (handled) { + return true; + } + } + return false; + }); + } + resolveExternalUri(resource, options2) { + return __async(this, null, function* () { + for (const resolver of this._resolvers) { + try { + const result = yield resolver.resolveExternalUri(resource, options2); + if (result) { + if (!this._resolvedUriTargets.has(result.resolved)) { + this._resolvedUriTargets.set(result.resolved, resource); + } + return result; + } + } catch (_a10) { + } + } + throw new Error("Could not resolve external URI: " + resource.toString()); + }); + } + _doOpenExternal(resource, options2) { + return __async(this, null, function* () { + const uri = typeof resource === "string" ? URI.parse(resource) : resource; + let externalUri; + try { + externalUri = (yield this.resolveExternalUri(uri, options2)).resolved; + } catch (_a10) { + externalUri = uri; + } + let href; + if (typeof resource === "string" && uri.toString() === externalUri.toString()) { + href = resource; + } else { + href = encodeURI(externalUri.toString(true)); + } + if (options2 === null || options2 === void 0 ? void 0 : options2.allowContributedOpeners) { + const preferredOpenerId = typeof (options2 === null || options2 === void 0 ? void 0 : options2.allowContributedOpeners) === "string" ? options2 === null || options2 === void 0 ? void 0 : options2.allowContributedOpeners : void 0; + for (const opener of this._externalOpeners) { + const didOpen = yield opener.openExternal(href, { + sourceUri: uri, + preferredOpenerId + }, CancellationToken.None); + if (didOpen) { + return true; + } + } + } + return this._defaultExternalOpener.openExternal(href, { sourceUri: uri }, CancellationToken.None); + }); + } + dispose() { + this._validators.clear(); + } + }; + OpenerService = __decorate30([ + __param27(0, ICodeEditorService), + __param27(1, ICommandService) + ], OpenerService); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/editorWorker.js +var IEditorWorkerService; +var init_editorWorker = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/editorWorker.js"() { + init_instantiation(); + IEditorWorkerService = createDecorator("editorWorkerService"); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/markers/common/markers.js +var MarkerSeverity2, IMarkerData, IMarkerService; +var init_markers = __esm({ + "node_modules/monaco-editor/esm/vs/platform/markers/common/markers.js"() { + init_severity(); + init_nls(); + init_instantiation(); + (function(MarkerSeverity4) { + MarkerSeverity4[MarkerSeverity4["Hint"] = 1] = "Hint"; + MarkerSeverity4[MarkerSeverity4["Info"] = 2] = "Info"; + MarkerSeverity4[MarkerSeverity4["Warning"] = 4] = "Warning"; + MarkerSeverity4[MarkerSeverity4["Error"] = 8] = "Error"; + })(MarkerSeverity2 || (MarkerSeverity2 = {})); + (function(MarkerSeverity4) { + function compare2(a3, b) { + return b - a3; + } + MarkerSeverity4.compare = compare2; + const _displayStrings = /* @__PURE__ */ Object.create(null); + _displayStrings[MarkerSeverity4.Error] = localize("sev.error", "Error"); + _displayStrings[MarkerSeverity4.Warning] = localize("sev.warning", "Warning"); + _displayStrings[MarkerSeverity4.Info] = localize("sev.info", "Info"); + function toString(a3) { + return _displayStrings[a3] || ""; + } + MarkerSeverity4.toString = toString; + function fromSeverity(severity) { + switch (severity) { + case severity_default.Error: + return MarkerSeverity4.Error; + case severity_default.Warning: + return MarkerSeverity4.Warning; + case severity_default.Info: + return MarkerSeverity4.Info; + case severity_default.Ignore: + return MarkerSeverity4.Hint; + } + } + MarkerSeverity4.fromSeverity = fromSeverity; + function toSeverity4(severity) { + switch (severity) { + case MarkerSeverity4.Error: + return severity_default.Error; + case MarkerSeverity4.Warning: + return severity_default.Warning; + case MarkerSeverity4.Info: + return severity_default.Info; + case MarkerSeverity4.Hint: + return severity_default.Ignore; + } + } + MarkerSeverity4.toSeverity = toSeverity4; + })(MarkerSeverity2 || (MarkerSeverity2 = {})); + (function(IMarkerData2) { + const emptyString = ""; + function makeKey(markerData) { + return makeKeyOptionalMessage(markerData, true); + } + IMarkerData2.makeKey = makeKey; + function makeKeyOptionalMessage(markerData, useMessage) { + const result = [emptyString]; + if (markerData.source) { + result.push(markerData.source.replace("\xA6", "\\\xA6")); + } else { + result.push(emptyString); + } + if (markerData.code) { + if (typeof markerData.code === "string") { + result.push(markerData.code.replace("\xA6", "\\\xA6")); + } else { + result.push(markerData.code.value.replace("\xA6", "\\\xA6")); + } + } else { + result.push(emptyString); + } + if (markerData.severity !== void 0 && markerData.severity !== null) { + result.push(MarkerSeverity2.toString(markerData.severity)); + } else { + result.push(emptyString); + } + if (markerData.message && useMessage) { + result.push(markerData.message.replace("\xA6", "\\\xA6")); + } else { + result.push(emptyString); + } + if (markerData.startLineNumber !== void 0 && markerData.startLineNumber !== null) { + result.push(markerData.startLineNumber.toString()); + } else { + result.push(emptyString); + } + if (markerData.startColumn !== void 0 && markerData.startColumn !== null) { + result.push(markerData.startColumn.toString()); + } else { + result.push(emptyString); + } + if (markerData.endLineNumber !== void 0 && markerData.endLineNumber !== null) { + result.push(markerData.endLineNumber.toString()); + } else { + result.push(emptyString); + } + if (markerData.endColumn !== void 0 && markerData.endColumn !== null) { + result.push(markerData.endColumn.toString()); + } else { + result.push(emptyString); + } + result.push(emptyString); + return result.join("\xA6"); + } + IMarkerData2.makeKeyOptionalMessage = makeKeyOptionalMessage; + })(IMarkerData || (IMarkerData = {})); + IMarkerService = createDecorator("markerService"); + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/collections.js +function diffSets(before, after2) { + const removed = []; + const added = []; + for (const element of before) { + if (!after2.has(element)) { + removed.push(element); + } + } + for (const element of after2) { + if (!before.has(element)) { + added.push(element); + } + } + return { removed, added }; +} +function intersection(setA, setB) { + const result = /* @__PURE__ */ new Set(); + for (const elem of setB) { + if (setA.has(elem)) { + result.add(elem); + } + } + return result; +} +var init_collections = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/collections.js"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/markerDecorationsService.js +var __decorate31, __param28, MarkerDecorationsService, MarkerDecorations; +var init_markerDecorationsService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/markerDecorationsService.js"() { + init_markers(); + init_lifecycle(); + init_model2(); + init_themeService(); + init_editorColorRegistry(); + init_model(); + init_range(); + init_network(); + init_event(); + init_colorRegistry(); + init_map(); + init_collections(); + __decorate31 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param28 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + MarkerDecorationsService = class MarkerDecorationsService2 extends Disposable { + constructor(modelService, _markerService) { + super(); + this._markerService = _markerService; + this._onDidChangeMarker = this._register(new Emitter()); + this._markerDecorations = new ResourceMap(); + modelService.getModels().forEach((model) => this._onModelAdded(model)); + this._register(modelService.onModelAdded(this._onModelAdded, this)); + this._register(modelService.onModelRemoved(this._onModelRemoved, this)); + this._register(this._markerService.onMarkerChanged(this._handleMarkerChange, this)); + } + dispose() { + super.dispose(); + this._markerDecorations.forEach((value) => value.dispose()); + this._markerDecorations.clear(); + } + getMarker(uri, decoration3) { + const markerDecorations = this._markerDecorations.get(uri); + return markerDecorations ? markerDecorations.getMarker(decoration3) || null : null; + } + _handleMarkerChange(changedResources) { + changedResources.forEach((resource) => { + const markerDecorations = this._markerDecorations.get(resource); + if (markerDecorations) { + this._updateDecorations(markerDecorations); + } + }); + } + _onModelAdded(model) { + const markerDecorations = new MarkerDecorations(model); + this._markerDecorations.set(model.uri, markerDecorations); + this._updateDecorations(markerDecorations); + } + _onModelRemoved(model) { + var _a10; + const markerDecorations = this._markerDecorations.get(model.uri); + if (markerDecorations) { + markerDecorations.dispose(); + this._markerDecorations.delete(model.uri); + } + if (model.uri.scheme === Schemas.inMemory || model.uri.scheme === Schemas.internal || model.uri.scheme === Schemas.vscode) { + (_a10 = this._markerService) === null || _a10 === void 0 ? void 0 : _a10.read({ resource: model.uri }).map((marker) => marker.owner).forEach((owner) => this._markerService.remove(owner, [model.uri])); + } + } + _updateDecorations(markerDecorations) { + const markers = this._markerService.read({ resource: markerDecorations.model.uri, take: 500 }); + if (markerDecorations.update(markers)) { + this._onDidChangeMarker.fire(markerDecorations.model); + } + } + }; + MarkerDecorationsService = __decorate31([ + __param28(0, IModelService), + __param28(1, IMarkerService) + ], MarkerDecorationsService); + MarkerDecorations = class extends Disposable { + constructor(model) { + super(); + this.model = model; + this._map = new BidirectionalMap(); + this._register(toDisposable(() => { + this.model.deltaDecorations([...this._map.values()], []); + this._map.clear(); + })); + } + update(markers) { + const { added, removed } = diffSets(new Set(this._map.keys()), new Set(markers)); + if (added.length === 0 && removed.length === 0) { + return false; + } + const oldIds = removed.map((marker) => this._map.get(marker)); + const newDecorations = added.map((marker) => { + return { + range: this._createDecorationRange(this.model, marker), + options: this._createDecorationOption(marker) + }; + }); + const ids = this.model.deltaDecorations(oldIds, newDecorations); + for (const removedMarker of removed) { + this._map.delete(removedMarker); + } + for (let index = 0; index < ids.length; index++) { + this._map.set(added[index], ids[index]); + } + return true; + } + getMarker(decoration3) { + return this._map.getKey(decoration3.id); + } + _createDecorationRange(model, rawMarker) { + let ret = Range.lift(rawMarker); + if (rawMarker.severity === MarkerSeverity2.Hint && !this._hasMarkerTag( + rawMarker, + 1 + /* MarkerTag.Unnecessary */ + ) && !this._hasMarkerTag( + rawMarker, + 2 + /* MarkerTag.Deprecated */ + )) { + ret = ret.setEndPosition(ret.startLineNumber, ret.startColumn + 2); + } + ret = model.validateRange(ret); + if (ret.isEmpty()) { + const maxColumn = model.getLineLastNonWhitespaceColumn(ret.startLineNumber) || model.getLineMaxColumn(ret.startLineNumber); + if (maxColumn === 1 || ret.endColumn >= maxColumn) { + return ret; + } + const word = model.getWordAtPosition(ret.getStartPosition()); + if (word) { + ret = new Range(ret.startLineNumber, word.startColumn, ret.endLineNumber, word.endColumn); + } + } else if (rawMarker.endColumn === Number.MAX_VALUE && rawMarker.startColumn === 1 && ret.startLineNumber === ret.endLineNumber) { + const minColumn = model.getLineFirstNonWhitespaceColumn(rawMarker.startLineNumber); + if (minColumn < ret.endColumn) { + ret = new Range(ret.startLineNumber, minColumn, ret.endLineNumber, ret.endColumn); + rawMarker.startColumn = minColumn; + } + } + return ret; + } + _createDecorationOption(marker) { + let className; + let color = void 0; + let zIndex; + let inlineClassName = void 0; + let minimap; + switch (marker.severity) { + case MarkerSeverity2.Hint: + if (this._hasMarkerTag( + marker, + 2 + /* MarkerTag.Deprecated */ + )) { + className = void 0; + } else if (this._hasMarkerTag( + marker, + 1 + /* MarkerTag.Unnecessary */ + )) { + className = "squiggly-unnecessary"; + } else { + className = "squiggly-hint"; + } + zIndex = 0; + break; + case MarkerSeverity2.Info: + className = "squiggly-info"; + color = themeColorFromId(overviewRulerInfo); + zIndex = 10; + minimap = { + color: themeColorFromId(minimapInfo), + position: 1 + /* MinimapPosition.Inline */ + }; + break; + case MarkerSeverity2.Warning: + className = "squiggly-warning"; + color = themeColorFromId(overviewRulerWarning); + zIndex = 20; + minimap = { + color: themeColorFromId(minimapWarning), + position: 1 + /* MinimapPosition.Inline */ + }; + break; + case MarkerSeverity2.Error: + default: + className = "squiggly-error"; + color = themeColorFromId(overviewRulerError); + zIndex = 30; + minimap = { + color: themeColorFromId(minimapError), + position: 1 + /* MinimapPosition.Inline */ + }; + break; + } + if (marker.tags) { + if (marker.tags.indexOf( + 1 + /* MarkerTag.Unnecessary */ + ) !== -1) { + inlineClassName = "squiggly-inline-unnecessary"; + } + if (marker.tags.indexOf( + 2 + /* MarkerTag.Deprecated */ + ) !== -1) { + inlineClassName = "squiggly-inline-deprecated"; + } + } + return { + description: "marker-decoration", + stickiness: 1, + className, + showIfCollapsed: true, + overviewRuler: { + color, + position: OverviewRulerLane2.Right + }, + minimap, + zIndex, + inlineClassName + }; + } + _hasMarkerTag(marker, tag) { + if (marker.tags) { + return marker.tags.indexOf(tag) >= 0; + } + return false; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/services/modelService.js +function MODEL_ID2(resource) { + return resource.toString(); +} +var __decorate32, __param29, ModelService_1, ModelData2, DEFAULT_EOL, DisposedModelInfo, ModelService, DefaultModelSHA1Computer; +var init_modelService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/services/modelService.js"() { + init_event(); + init_lifecycle(); + init_platform(); + init_textModel(); + init_textModelDefaults(); + init_modesRegistry(); + init_language(); + init_textResourceConfiguration(); + init_configuration(); + init_undoRedo(); + init_hash(); + init_editStack(); + init_network(); + init_objects(); + init_languageConfigurationRegistry(); + __decorate32 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param29 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + ModelData2 = class { + constructor(model, onWillDispose, onDidChangeLanguage) { + this.model = model; + this._modelEventListeners = new DisposableStore(); + this.model = model; + this._modelEventListeners.add(model.onWillDispose(() => onWillDispose(model))); + this._modelEventListeners.add(model.onDidChangeLanguage((e) => onDidChangeLanguage(model, e))); + } + dispose() { + this._modelEventListeners.dispose(); + } + }; + DEFAULT_EOL = isLinux || isMacintosh ? 1 : 2; + DisposedModelInfo = class { + constructor(uri, initialUndoRedoSnapshot, time, sharesUndoRedoStack, heapSize, sha1, versionId, alternativeVersionId) { + this.uri = uri; + this.initialUndoRedoSnapshot = initialUndoRedoSnapshot; + this.time = time; + this.sharesUndoRedoStack = sharesUndoRedoStack; + this.heapSize = heapSize; + this.sha1 = sha1; + this.versionId = versionId; + this.alternativeVersionId = alternativeVersionId; + } + }; + ModelService = ModelService_1 = class ModelService2 extends Disposable { + constructor(_configurationService, _resourcePropertiesService, _undoRedoService, _languageService, _languageConfigurationService) { + super(); + this._configurationService = _configurationService; + this._resourcePropertiesService = _resourcePropertiesService; + this._undoRedoService = _undoRedoService; + this._languageService = _languageService; + this._languageConfigurationService = _languageConfigurationService; + this._onModelAdded = this._register(new Emitter()); + this.onModelAdded = this._onModelAdded.event; + this._onModelRemoved = this._register(new Emitter()); + this.onModelRemoved = this._onModelRemoved.event; + this._onModelModeChanged = this._register(new Emitter()); + this.onModelLanguageChanged = this._onModelModeChanged.event; + this._modelCreationOptionsByLanguageAndResource = /* @__PURE__ */ Object.create(null); + this._models = {}; + this._disposedModels = /* @__PURE__ */ new Map(); + this._disposedModelsHeapSize = 0; + this._register(this._configurationService.onDidChangeConfiguration((e) => this._updateModelOptions(e))); + this._updateModelOptions(void 0); + } + static _readModelOptions(config, isForSimpleWidget) { + var _a10; + let tabSize = EDITOR_MODEL_DEFAULTS.tabSize; + if (config.editor && typeof config.editor.tabSize !== "undefined") { + const parsedTabSize = parseInt(config.editor.tabSize, 10); + if (!isNaN(parsedTabSize)) { + tabSize = parsedTabSize; + } + if (tabSize < 1) { + tabSize = 1; + } + } + let indentSize = "tabSize"; + if (config.editor && typeof config.editor.indentSize !== "undefined" && config.editor.indentSize !== "tabSize") { + const parsedIndentSize = parseInt(config.editor.indentSize, 10); + if (!isNaN(parsedIndentSize)) { + indentSize = Math.max(parsedIndentSize, 1); + } + } + let insertSpaces = EDITOR_MODEL_DEFAULTS.insertSpaces; + if (config.editor && typeof config.editor.insertSpaces !== "undefined") { + insertSpaces = config.editor.insertSpaces === "false" ? false : Boolean(config.editor.insertSpaces); + } + let newDefaultEOL = DEFAULT_EOL; + const eol = config.eol; + if (eol === "\r\n") { + newDefaultEOL = 2; + } else if (eol === "\n") { + newDefaultEOL = 1; + } + let trimAutoWhitespace = EDITOR_MODEL_DEFAULTS.trimAutoWhitespace; + if (config.editor && typeof config.editor.trimAutoWhitespace !== "undefined") { + trimAutoWhitespace = config.editor.trimAutoWhitespace === "false" ? false : Boolean(config.editor.trimAutoWhitespace); + } + let detectIndentation = EDITOR_MODEL_DEFAULTS.detectIndentation; + if (config.editor && typeof config.editor.detectIndentation !== "undefined") { + detectIndentation = config.editor.detectIndentation === "false" ? false : Boolean(config.editor.detectIndentation); + } + let largeFileOptimizations = EDITOR_MODEL_DEFAULTS.largeFileOptimizations; + if (config.editor && typeof config.editor.largeFileOptimizations !== "undefined") { + largeFileOptimizations = config.editor.largeFileOptimizations === "false" ? false : Boolean(config.editor.largeFileOptimizations); + } + let bracketPairColorizationOptions = EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions; + if (((_a10 = config.editor) === null || _a10 === void 0 ? void 0 : _a10.bracketPairColorization) && typeof config.editor.bracketPairColorization === "object") { + bracketPairColorizationOptions = { + enabled: !!config.editor.bracketPairColorization.enabled, + independentColorPoolPerBracketType: !!config.editor.bracketPairColorization.independentColorPoolPerBracketType + }; + } + return { + isForSimpleWidget, + tabSize, + indentSize, + insertSpaces, + detectIndentation, + defaultEOL: newDefaultEOL, + trimAutoWhitespace, + largeFileOptimizations, + bracketPairColorizationOptions + }; + } + _getEOL(resource, language82) { + if (resource) { + return this._resourcePropertiesService.getEOL(resource, language82); + } + const eol = this._configurationService.getValue("files.eol", { overrideIdentifier: language82 }); + if (eol && typeof eol === "string" && eol !== "auto") { + return eol; + } + return OS === 3 || OS === 2 ? "\n" : "\r\n"; + } + _shouldRestoreUndoStack() { + const result = this._configurationService.getValue("files.restoreUndoStack"); + if (typeof result === "boolean") { + return result; + } + return true; + } + getCreationOptions(languageIdOrSelection, resource, isForSimpleWidget) { + const language82 = typeof languageIdOrSelection === "string" ? languageIdOrSelection : languageIdOrSelection.languageId; + let creationOptions = this._modelCreationOptionsByLanguageAndResource[language82 + resource]; + if (!creationOptions) { + const editor2 = this._configurationService.getValue("editor", { overrideIdentifier: language82, resource }); + const eol = this._getEOL(resource, language82); + creationOptions = ModelService_1._readModelOptions({ editor: editor2, eol }, isForSimpleWidget); + this._modelCreationOptionsByLanguageAndResource[language82 + resource] = creationOptions; + } + return creationOptions; + } + _updateModelOptions(e) { + const oldOptionsByLanguageAndResource = this._modelCreationOptionsByLanguageAndResource; + this._modelCreationOptionsByLanguageAndResource = /* @__PURE__ */ Object.create(null); + const keys = Object.keys(this._models); + for (let i = 0, len = keys.length; i < len; i++) { + const modelId = keys[i]; + const modelData = this._models[modelId]; + const language82 = modelData.model.getLanguageId(); + const uri = modelData.model.uri; + if (e && !e.affectsConfiguration("editor", { overrideIdentifier: language82, resource: uri }) && !e.affectsConfiguration("files.eol", { overrideIdentifier: language82, resource: uri })) { + continue; + } + const oldOptions = oldOptionsByLanguageAndResource[language82 + uri]; + const newOptions = this.getCreationOptions(language82, uri, modelData.model.isForSimpleWidget); + ModelService_1._setModelOptionsForModel(modelData.model, newOptions, oldOptions); + } + } + static _setModelOptionsForModel(model, newOptions, currentOptions) { + if (currentOptions && currentOptions.defaultEOL !== newOptions.defaultEOL && model.getLineCount() === 1) { + model.setEOL( + newOptions.defaultEOL === 1 ? 0 : 1 + /* EndOfLineSequence.CRLF */ + ); + } + if (currentOptions && currentOptions.detectIndentation === newOptions.detectIndentation && currentOptions.insertSpaces === newOptions.insertSpaces && currentOptions.tabSize === newOptions.tabSize && currentOptions.indentSize === newOptions.indentSize && currentOptions.trimAutoWhitespace === newOptions.trimAutoWhitespace && equals2(currentOptions.bracketPairColorizationOptions, newOptions.bracketPairColorizationOptions)) { + return; + } + if (newOptions.detectIndentation) { + model.detectIndentation(newOptions.insertSpaces, newOptions.tabSize); + model.updateOptions({ + trimAutoWhitespace: newOptions.trimAutoWhitespace, + bracketColorizationOptions: newOptions.bracketPairColorizationOptions + }); + } else { + model.updateOptions({ + insertSpaces: newOptions.insertSpaces, + tabSize: newOptions.tabSize, + indentSize: newOptions.indentSize, + trimAutoWhitespace: newOptions.trimAutoWhitespace, + bracketColorizationOptions: newOptions.bracketPairColorizationOptions + }); + } + } + // --- begin IModelService + _insertDisposedModel(disposedModelData) { + this._disposedModels.set(MODEL_ID2(disposedModelData.uri), disposedModelData); + this._disposedModelsHeapSize += disposedModelData.heapSize; + } + _removeDisposedModel(resource) { + const disposedModelData = this._disposedModels.get(MODEL_ID2(resource)); + if (disposedModelData) { + this._disposedModelsHeapSize -= disposedModelData.heapSize; + } + this._disposedModels.delete(MODEL_ID2(resource)); + return disposedModelData; + } + _ensureDisposedModelsHeapSize(maxModelsHeapSize) { + if (this._disposedModelsHeapSize > maxModelsHeapSize) { + const disposedModels = []; + this._disposedModels.forEach((entry) => { + if (!entry.sharesUndoRedoStack) { + disposedModels.push(entry); + } + }); + disposedModels.sort((a3, b) => a3.time - b.time); + while (disposedModels.length > 0 && this._disposedModelsHeapSize > maxModelsHeapSize) { + const disposedModel = disposedModels.shift(); + this._removeDisposedModel(disposedModel.uri); + if (disposedModel.initialUndoRedoSnapshot !== null) { + this._undoRedoService.restoreSnapshot(disposedModel.initialUndoRedoSnapshot); + } + } + } + } + _createModelData(value, languageIdOrSelection, resource, isForSimpleWidget) { + const options2 = this.getCreationOptions(languageIdOrSelection, resource, isForSimpleWidget); + const model = new TextModel(value, languageIdOrSelection, options2, resource, this._undoRedoService, this._languageService, this._languageConfigurationService); + if (resource && this._disposedModels.has(MODEL_ID2(resource))) { + const disposedModelData = this._removeDisposedModel(resource); + const elements = this._undoRedoService.getElements(resource); + const sha1Computer = this._getSHA1Computer(); + const sha1IsEqual = sha1Computer.canComputeSHA1(model) ? sha1Computer.computeSHA1(model) === disposedModelData.sha1 : false; + if (sha1IsEqual || disposedModelData.sharesUndoRedoStack) { + for (const element of elements.past) { + if (isEditStackElement(element) && element.matchesResource(resource)) { + element.setModel(model); + } + } + for (const element of elements.future) { + if (isEditStackElement(element) && element.matchesResource(resource)) { + element.setModel(model); + } + } + this._undoRedoService.setElementsValidFlag(resource, true, (element) => isEditStackElement(element) && element.matchesResource(resource)); + if (sha1IsEqual) { + model._overwriteVersionId(disposedModelData.versionId); + model._overwriteAlternativeVersionId(disposedModelData.alternativeVersionId); + model._overwriteInitialUndoRedoSnapshot(disposedModelData.initialUndoRedoSnapshot); + } + } else { + if (disposedModelData.initialUndoRedoSnapshot !== null) { + this._undoRedoService.restoreSnapshot(disposedModelData.initialUndoRedoSnapshot); + } + } + } + const modelId = MODEL_ID2(model.uri); + if (this._models[modelId]) { + throw new Error("ModelService: Cannot add model because it already exists!"); + } + const modelData = new ModelData2(model, (model2) => this._onWillDispose(model2), (model2, e) => this._onDidChangeLanguage(model2, e)); + this._models[modelId] = modelData; + return modelData; + } + createModel(value, languageSelection, resource, isForSimpleWidget = false) { + let modelData; + if (languageSelection) { + modelData = this._createModelData(value, languageSelection, resource, isForSimpleWidget); + } else { + modelData = this._createModelData(value, PLAINTEXT_LANGUAGE_ID, resource, isForSimpleWidget); + } + this._onModelAdded.fire(modelData.model); + return modelData.model; + } + getModels() { + const ret = []; + const keys = Object.keys(this._models); + for (let i = 0, len = keys.length; i < len; i++) { + const modelId = keys[i]; + ret.push(this._models[modelId].model); + } + return ret; + } + getModel(resource) { + const modelId = MODEL_ID2(resource); + const modelData = this._models[modelId]; + if (!modelData) { + return null; + } + return modelData.model; + } + // --- end IModelService + _schemaShouldMaintainUndoRedoElements(resource) { + return resource.scheme === Schemas.file || resource.scheme === Schemas.vscodeRemote || resource.scheme === Schemas.vscodeUserData || resource.scheme === Schemas.vscodeNotebookCell || resource.scheme === "fake-fs"; + } + _onWillDispose(model) { + const modelId = MODEL_ID2(model.uri); + const modelData = this._models[modelId]; + const sharesUndoRedoStack = this._undoRedoService.getUriComparisonKey(model.uri) !== model.uri.toString(); + let maintainUndoRedoStack = false; + let heapSize = 0; + if (sharesUndoRedoStack || this._shouldRestoreUndoStack() && this._schemaShouldMaintainUndoRedoElements(model.uri)) { + const elements = this._undoRedoService.getElements(model.uri); + if (elements.past.length > 0 || elements.future.length > 0) { + for (const element of elements.past) { + if (isEditStackElement(element) && element.matchesResource(model.uri)) { + maintainUndoRedoStack = true; + heapSize += element.heapSize(model.uri); + element.setModel(model.uri); + } + } + for (const element of elements.future) { + if (isEditStackElement(element) && element.matchesResource(model.uri)) { + maintainUndoRedoStack = true; + heapSize += element.heapSize(model.uri); + element.setModel(model.uri); + } + } + } + } + const maxMemory = ModelService_1.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK; + const sha1Computer = this._getSHA1Computer(); + if (!maintainUndoRedoStack) { + if (!sharesUndoRedoStack) { + const initialUndoRedoSnapshot = modelData.model.getInitialUndoRedoSnapshot(); + if (initialUndoRedoSnapshot !== null) { + this._undoRedoService.restoreSnapshot(initialUndoRedoSnapshot); + } + } + } else if (!sharesUndoRedoStack && (heapSize > maxMemory || !sha1Computer.canComputeSHA1(model))) { + const initialUndoRedoSnapshot = modelData.model.getInitialUndoRedoSnapshot(); + if (initialUndoRedoSnapshot !== null) { + this._undoRedoService.restoreSnapshot(initialUndoRedoSnapshot); + } + } else { + this._ensureDisposedModelsHeapSize(maxMemory - heapSize); + this._undoRedoService.setElementsValidFlag(model.uri, false, (element) => isEditStackElement(element) && element.matchesResource(model.uri)); + this._insertDisposedModel(new DisposedModelInfo(model.uri, modelData.model.getInitialUndoRedoSnapshot(), Date.now(), sharesUndoRedoStack, heapSize, sha1Computer.computeSHA1(model), model.getVersionId(), model.getAlternativeVersionId())); + } + delete this._models[modelId]; + modelData.dispose(); + delete this._modelCreationOptionsByLanguageAndResource[model.getLanguageId() + model.uri]; + this._onModelRemoved.fire(model); + } + _onDidChangeLanguage(model, e) { + const oldLanguageId = e.oldLanguage; + const newLanguageId = model.getLanguageId(); + const oldOptions = this.getCreationOptions(oldLanguageId, model.uri, model.isForSimpleWidget); + const newOptions = this.getCreationOptions(newLanguageId, model.uri, model.isForSimpleWidget); + ModelService_1._setModelOptionsForModel(model, newOptions, oldOptions); + this._onModelModeChanged.fire({ model, oldLanguageId }); + } + _getSHA1Computer() { + return new DefaultModelSHA1Computer(); + } + }; + ModelService.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK = 20 * 1024 * 1024; + ModelService = ModelService_1 = __decorate32([ + __param29(0, IConfigurationService), + __param29(1, ITextResourcePropertiesService), + __param29(2, IUndoRedoService), + __param29(3, ILanguageService), + __param29(4, ILanguageConfigurationService) + ], ModelService); + DefaultModelSHA1Computer = class _DefaultModelSHA1Computer { + canComputeSHA1(model) { + return model.getValueLength() <= _DefaultModelSHA1Computer.MAX_MODEL_SIZE; + } + computeSHA1(model) { + const shaComputer = new StringSHA1(); + const snapshot = model.createSnapshot(); + let text2; + while (text2 = snapshot.read()) { + shaComputer.update(text2); + } + return shaComputer.digest(); + } + }; + DefaultModelSHA1Computer.MAX_MODEL_SIZE = 10 * 1024 * 1024; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/browser/quickInput/standaloneQuickInput.css +var init_standaloneQuickInput = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/browser/quickInput/standaloneQuickInput.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/platform/quickinput/common/quickAccess.js +var DefaultQuickAccessFilterValue, Extensions8, QuickAccessRegistry; +var init_quickAccess = __esm({ + "node_modules/monaco-editor/esm/vs/platform/quickinput/common/quickAccess.js"() { + init_arrays(); + init_lifecycle(); + init_platform2(); + (function(DefaultQuickAccessFilterValue2) { + DefaultQuickAccessFilterValue2[DefaultQuickAccessFilterValue2["PRESERVE"] = 0] = "PRESERVE"; + DefaultQuickAccessFilterValue2[DefaultQuickAccessFilterValue2["LAST"] = 1] = "LAST"; + })(DefaultQuickAccessFilterValue || (DefaultQuickAccessFilterValue = {})); + Extensions8 = { + Quickaccess: "workbench.contributions.quickaccess" + }; + QuickAccessRegistry = class { + constructor() { + this.providers = []; + this.defaultProvider = void 0; + } + registerQuickAccessProvider(provider) { + if (provider.prefix.length === 0) { + this.defaultProvider = provider; + } else { + this.providers.push(provider); + } + this.providers.sort((providerA, providerB) => providerB.prefix.length - providerA.prefix.length); + return toDisposable(() => { + this.providers.splice(this.providers.indexOf(provider), 1); + if (this.defaultProvider === provider) { + this.defaultProvider = void 0; + } + }); + } + getQuickAccessProviders() { + return coalesce([this.defaultProvider, ...this.providers]); + } + getQuickAccessProvider(prefix) { + const result = prefix ? this.providers.find((provider) => prefix.startsWith(provider.prefix)) || void 0 : void 0; + return result || this.defaultProvider; + } + }; + Registry.add(Extensions8.Quickaccess, new QuickAccessRegistry()); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/quickinput/common/quickInput.js +var NO_KEY_MODS, QuickInputHideReason, ItemActivation, QuickPickFocus, QuickPickItemScorerAccessor, quickPickItemScorerAccessor, IQuickInputService; +var init_quickInput = __esm({ + "node_modules/monaco-editor/esm/vs/platform/quickinput/common/quickInput.js"() { + init_instantiation(); + NO_KEY_MODS = { ctrlCmd: false, alt: false }; + (function(QuickInputHideReason2) { + QuickInputHideReason2[QuickInputHideReason2["Blur"] = 1] = "Blur"; + QuickInputHideReason2[QuickInputHideReason2["Gesture"] = 2] = "Gesture"; + QuickInputHideReason2[QuickInputHideReason2["Other"] = 3] = "Other"; + })(QuickInputHideReason || (QuickInputHideReason = {})); + (function(ItemActivation2) { + ItemActivation2[ItemActivation2["NONE"] = 0] = "NONE"; + ItemActivation2[ItemActivation2["FIRST"] = 1] = "FIRST"; + ItemActivation2[ItemActivation2["SECOND"] = 2] = "SECOND"; + ItemActivation2[ItemActivation2["LAST"] = 3] = "LAST"; + })(ItemActivation || (ItemActivation = {})); + (function(QuickPickFocus2) { + QuickPickFocus2[QuickPickFocus2["First"] = 1] = "First"; + QuickPickFocus2[QuickPickFocus2["Second"] = 2] = "Second"; + QuickPickFocus2[QuickPickFocus2["Last"] = 3] = "Last"; + QuickPickFocus2[QuickPickFocus2["Next"] = 4] = "Next"; + QuickPickFocus2[QuickPickFocus2["Previous"] = 5] = "Previous"; + QuickPickFocus2[QuickPickFocus2["NextPage"] = 6] = "NextPage"; + QuickPickFocus2[QuickPickFocus2["PreviousPage"] = 7] = "PreviousPage"; + QuickPickFocus2[QuickPickFocus2["NextSeparator"] = 8] = "NextSeparator"; + QuickPickFocus2[QuickPickFocus2["PreviousSeparator"] = 9] = "PreviousSeparator"; + })(QuickPickFocus || (QuickPickFocus = {})); + QuickPickItemScorerAccessor = class { + constructor(options2) { + this.options = options2; + } + }; + quickPickItemScorerAccessor = new QuickPickItemScorerAccessor(); + IQuickInputService = createDecorator("quickInputService"); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickAccess.js +var __decorate33, __param30, QuickAccessController; +var init_quickAccess2 = __esm({ + "node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickAccess.js"() { + init_async(); + init_cancellation(); + init_event(); + init_lifecycle(); + init_instantiation(); + init_quickAccess(); + init_quickInput(); + init_platform2(); + __decorate33 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param30 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + QuickAccessController = class QuickAccessController2 extends Disposable { + constructor(quickInputService, instantiationService) { + super(); + this.quickInputService = quickInputService; + this.instantiationService = instantiationService; + this.registry = Registry.as(Extensions8.Quickaccess); + this.mapProviderToDescriptor = /* @__PURE__ */ new Map(); + this.lastAcceptedPickerValues = /* @__PURE__ */ new Map(); + this.visibleQuickAccess = void 0; + } + show(value = "", options2) { + this.doShowOrPick(value, false, options2); + } + doShowOrPick(value, pick, options2) { + var _a10, _b4, _c2, _d2; + const [provider, descriptor] = this.getOrInstantiateProvider(value, options2 === null || options2 === void 0 ? void 0 : options2.enabledProviderPrefixes); + const visibleQuickAccess = this.visibleQuickAccess; + const visibleDescriptor = visibleQuickAccess === null || visibleQuickAccess === void 0 ? void 0 : visibleQuickAccess.descriptor; + if (visibleQuickAccess && descriptor && visibleDescriptor === descriptor) { + if (value !== descriptor.prefix && !(options2 === null || options2 === void 0 ? void 0 : options2.preserveValue)) { + visibleQuickAccess.picker.value = value; + } + this.adjustValueSelection(visibleQuickAccess.picker, descriptor, options2); + return; + } + if (descriptor && !(options2 === null || options2 === void 0 ? void 0 : options2.preserveValue)) { + let newValue = void 0; + if (visibleQuickAccess && visibleDescriptor && visibleDescriptor !== descriptor) { + const newValueCandidateWithoutPrefix = visibleQuickAccess.value.substr(visibleDescriptor.prefix.length); + if (newValueCandidateWithoutPrefix) { + newValue = `${descriptor.prefix}${newValueCandidateWithoutPrefix}`; + } + } + if (!newValue) { + const defaultFilterValue = provider === null || provider === void 0 ? void 0 : provider.defaultFilterValue; + if (defaultFilterValue === DefaultQuickAccessFilterValue.LAST) { + newValue = this.lastAcceptedPickerValues.get(descriptor); + } else if (typeof defaultFilterValue === "string") { + newValue = `${descriptor.prefix}${defaultFilterValue}`; + } + } + if (typeof newValue === "string") { + value = newValue; + } + } + const visibleSelection = (_a10 = visibleQuickAccess === null || visibleQuickAccess === void 0 ? void 0 : visibleQuickAccess.picker) === null || _a10 === void 0 ? void 0 : _a10.valueSelection; + const visibleValue = (_b4 = visibleQuickAccess === null || visibleQuickAccess === void 0 ? void 0 : visibleQuickAccess.picker) === null || _b4 === void 0 ? void 0 : _b4.value; + const disposables = new DisposableStore(); + const picker = disposables.add(this.quickInputService.createQuickPick()); + picker.value = value; + this.adjustValueSelection(picker, descriptor, options2); + picker.placeholder = (_c2 = options2 === null || options2 === void 0 ? void 0 : options2.placeholder) !== null && _c2 !== void 0 ? _c2 : descriptor === null || descriptor === void 0 ? void 0 : descriptor.placeholder; + picker.quickNavigate = options2 === null || options2 === void 0 ? void 0 : options2.quickNavigateConfiguration; + picker.hideInput = !!picker.quickNavigate && !visibleQuickAccess; + if (typeof (options2 === null || options2 === void 0 ? void 0 : options2.itemActivation) === "number" || (options2 === null || options2 === void 0 ? void 0 : options2.quickNavigateConfiguration)) { + picker.itemActivation = (_d2 = options2 === null || options2 === void 0 ? void 0 : options2.itemActivation) !== null && _d2 !== void 0 ? _d2 : ItemActivation.SECOND; + } + picker.contextKey = descriptor === null || descriptor === void 0 ? void 0 : descriptor.contextKey; + picker.filterValue = (value2) => value2.substring(descriptor ? descriptor.prefix.length : 0); + let pickPromise = void 0; + if (pick) { + pickPromise = new DeferredPromise(); + disposables.add(Event.once(picker.onWillAccept)((e) => { + e.veto(); + picker.hide(); + })); + } + disposables.add(this.registerPickerListeners(picker, provider, descriptor, value, options2)); + const cts = disposables.add(new CancellationTokenSource()); + if (provider) { + disposables.add(provider.provide(picker, cts.token, options2 === null || options2 === void 0 ? void 0 : options2.providerOptions)); + } + Event.once(picker.onDidHide)(() => { + if (picker.selectedItems.length === 0) { + cts.cancel(); + } + disposables.dispose(); + pickPromise === null || pickPromise === void 0 ? void 0 : pickPromise.complete(picker.selectedItems.slice(0)); + }); + picker.show(); + if (visibleSelection && visibleValue === value) { + picker.valueSelection = visibleSelection; + } + if (pick) { + return pickPromise === null || pickPromise === void 0 ? void 0 : pickPromise.p; + } + } + adjustValueSelection(picker, descriptor, options2) { + var _a10; + let valueSelection; + if (options2 === null || options2 === void 0 ? void 0 : options2.preserveValue) { + valueSelection = [picker.value.length, picker.value.length]; + } else { + valueSelection = [(_a10 = descriptor === null || descriptor === void 0 ? void 0 : descriptor.prefix.length) !== null && _a10 !== void 0 ? _a10 : 0, picker.value.length]; + } + picker.valueSelection = valueSelection; + } + registerPickerListeners(picker, provider, descriptor, value, options2) { + const disposables = new DisposableStore(); + const visibleQuickAccess = this.visibleQuickAccess = { picker, descriptor, value }; + disposables.add(toDisposable(() => { + if (visibleQuickAccess === this.visibleQuickAccess) { + this.visibleQuickAccess = void 0; + } + })); + disposables.add(picker.onDidChangeValue((value2) => { + const [providerForValue] = this.getOrInstantiateProvider(value2, options2 === null || options2 === void 0 ? void 0 : options2.enabledProviderPrefixes); + if (providerForValue !== provider) { + this.show(value2, { + enabledProviderPrefixes: options2 === null || options2 === void 0 ? void 0 : options2.enabledProviderPrefixes, + // do not rewrite value from user typing! + preserveValue: true, + // persist the value of the providerOptions from the original showing + providerOptions: options2 === null || options2 === void 0 ? void 0 : options2.providerOptions + }); + } else { + visibleQuickAccess.value = value2; + } + })); + if (descriptor) { + disposables.add(picker.onDidAccept(() => { + this.lastAcceptedPickerValues.set(descriptor, picker.value); + })); + } + return disposables; + } + getOrInstantiateProvider(value, enabledProviderPrefixes) { + const providerDescriptor = this.registry.getQuickAccessProvider(value); + if (!providerDescriptor || enabledProviderPrefixes && !(enabledProviderPrefixes === null || enabledProviderPrefixes === void 0 ? void 0 : enabledProviderPrefixes.includes(providerDescriptor.prefix))) { + return [void 0, void 0]; + } + let provider = this.mapProviderToDescriptor.get(providerDescriptor); + if (!provider) { + provider = this.instantiationService.createInstance(providerDescriptor.ctor); + this.mapProviderToDescriptor.set(providerDescriptor, provider); + } + return [provider, providerDescriptor]; + } + }; + QuickAccessController = __decorate33([ + __param30(0, IQuickInputService), + __param30(1, IInstantiationService) + ], QuickAccessController); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/toggle/toggle.css +var init_toggle = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/toggle/toggle.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/toggle/toggle.js +var Toggle; +var init_toggle2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/toggle/toggle.js"() { + init_widget(); + init_themables(); + init_event(); + init_toggle(); + init_hoverDelegateFactory(); + init_hoverDelegate2(); + Toggle = class extends Widget { + constructor(opts) { + var _a10; + super(); + this._onChange = this._register(new Emitter()); + this.onChange = this._onChange.event; + this._onKeyDown = this._register(new Emitter()); + this.onKeyDown = this._onKeyDown.event; + this._opts = opts; + this._checked = this._opts.isChecked; + const classes = ["monaco-custom-toggle"]; + if (this._opts.icon) { + this._icon = this._opts.icon; + classes.push(...ThemeIcon.asClassNameArray(this._icon)); + } + if (this._opts.actionClassName) { + classes.push(...this._opts.actionClassName.split(" ")); + } + if (this._checked) { + classes.push("checked"); + } + this.domNode = document.createElement("div"); + this._hover = this._register(getBaseLayerHoverDelegate().setupUpdatableHover((_a10 = opts.hoverDelegate) !== null && _a10 !== void 0 ? _a10 : getDefaultHoverDelegate("mouse"), this.domNode, this._opts.title)); + this.domNode.classList.add(...classes); + if (!this._opts.notFocusable) { + this.domNode.tabIndex = 0; + } + this.domNode.setAttribute("role", "checkbox"); + this.domNode.setAttribute("aria-checked", String(this._checked)); + this.domNode.setAttribute("aria-label", this._opts.title); + this.applyStyles(); + this.onclick(this.domNode, (ev) => { + if (this.enabled) { + this.checked = !this._checked; + this._onChange.fire(false); + ev.preventDefault(); + } + }); + this._register(this.ignoreGesture(this.domNode)); + this.onkeydown(this.domNode, (keyboardEvent) => { + if (keyboardEvent.keyCode === 10 || keyboardEvent.keyCode === 3) { + this.checked = !this._checked; + this._onChange.fire(true); + keyboardEvent.preventDefault(); + keyboardEvent.stopPropagation(); + return; + } + this._onKeyDown.fire(keyboardEvent); + }); + } + get enabled() { + return this.domNode.getAttribute("aria-disabled") !== "true"; + } + focus() { + this.domNode.focus(); + } + get checked() { + return this._checked; + } + set checked(newIsChecked) { + this._checked = newIsChecked; + this.domNode.setAttribute("aria-checked", String(this._checked)); + this.domNode.classList.toggle("checked", this._checked); + this.applyStyles(); + } + width() { + return 2 + 2 + 2 + 16; + } + applyStyles() { + if (this.domNode) { + this.domNode.style.borderColor = this._checked && this._opts.inputActiveOptionBorder || ""; + this.domNode.style.color = this._checked && this._opts.inputActiveOptionForeground || "inherit"; + this.domNode.style.backgroundColor = this._checked && this._opts.inputActiveOptionBackground || ""; + } + } + enable() { + this.domNode.setAttribute("aria-disabled", String(false)); + } + disable() { + this.domNode.setAttribute("aria-disabled", String(true)); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/quickinput/browser/media/quickInput.css +var init_quickInput2 = __esm({ + "node_modules/monaco-editor/esm/vs/platform/quickinput/browser/media/quickInput.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/linkedText.js +function parseLinkedText(text2) { + const result = []; + let index = 0; + let match2; + while (match2 = LINK_REGEX.exec(text2)) { + if (match2.index - index > 0) { + result.push(text2.substring(index, match2.index)); + } + const [, label, href, , title] = match2; + if (title) { + result.push({ label, href, title }); + } else { + result.push({ label, href }); + } + index = match2.index + match2[0].length; + } + if (index < text2.length) { + result.push(text2.substring(index)); + } + return new LinkedText(result); +} +var __decorate34, LinkedText, LINK_REGEX; +var init_linkedText = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/linkedText.js"() { + init_decorators(); + __decorate34 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + LinkedText = class { + constructor(nodes) { + this.nodes = nodes; + } + toString() { + return this.nodes.map((node) => typeof node === "string" ? node : node.label).join(""); + } + }; + __decorate34([ + memoize + ], LinkedText.prototype, "toString", null); + LINK_REGEX = /\[([^\]]+)\]\(((?:https?:\/\/|command:|file:)[^\)\s]+)(?: (["'])(.+?)(\3))?\)/gi; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickInputUtils.js +function getIconClass(iconPath) { + if (!iconPath) { + return void 0; + } + let iconClass; + const key = iconPath.dark.toString(); + if (iconPathToClass[key]) { + iconClass = iconPathToClass[key]; + } else { + iconClass = iconClassGenerator.nextId(); + createCSSRule(`.${iconClass}, .hc-light .${iconClass}`, `background-image: ${asCSSUrl(iconPath.light || iconPath.dark)}`); + createCSSRule(`.vs-dark .${iconClass}, .hc-black .${iconClass}`, `background-image: ${asCSSUrl(iconPath.dark)}`); + iconPathToClass[key] = iconClass; + } + return iconClass; +} +function quickInputButtonToAction(button, id, run) { + let cssClasses = button.iconClass || getIconClass(button.iconPath); + if (button.alwaysVisible) { + cssClasses = cssClasses ? `${cssClasses} always-visible` : "always-visible"; + } + return { + id, + label: "", + tooltip: button.tooltip || "", + class: cssClasses, + enabled: true, + run + }; +} +function renderQuickInputDescription(description, container, actionHandler) { + reset(container); + const parsed = parseLinkedText(description); + let tabIndex = 0; + for (const node of parsed.nodes) { + if (typeof node === "string") { + container.append(...renderLabelWithIcons(node)); + } else { + let title = node.title; + if (!title && node.href.startsWith("command:")) { + title = localize("executeCommand", "Click to execute command '{0}'", node.href.substring("command:".length)); + } else if (!title) { + title = node.href; + } + const anchor = $("a", { href: node.href, title, tabIndex: tabIndex++ }, node.label); + anchor.style.textDecoration = "underline"; + const handleOpen = (e) => { + if (isEventLike(e)) { + EventHelper.stop(e, true); + } + actionHandler.callback(node.href); + }; + const onClick = actionHandler.disposables.add(new DomEmitter(anchor, EventType.CLICK)).event; + const onKeydown = actionHandler.disposables.add(new DomEmitter(anchor, EventType.KEY_DOWN)).event; + const onSpaceOrEnter = Event.chain(onKeydown, ($16) => $16.filter((e) => { + const event = new StandardKeyboardEvent(e); + return event.equals( + 10 + /* KeyCode.Space */ + ) || event.equals( + 3 + /* KeyCode.Enter */ + ); + })); + actionHandler.disposables.add(Gesture.addTarget(anchor)); + const onTap = actionHandler.disposables.add(new DomEmitter(anchor, EventType2.Tap)).event; + Event.any(onClick, onTap, onSpaceOrEnter)(handleOpen, null, actionHandler.disposables); + container.appendChild(anchor); + } + } +} +var iconPathToClass, iconClassGenerator; +var init_quickInputUtils = __esm({ + "node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickInputUtils.js"() { + init_dom(); + init_event2(); + init_event(); + init_keyboardEvent(); + init_touch(); + init_iconLabels(); + init_idGenerator(); + init_linkedText(); + init_quickInput2(); + init_nls(); + iconPathToClass = {}; + iconClassGenerator = new IdGenerator("quick-input-button-icon-"); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickInput.js +var __decorate35, __param31, inQuickInputContextKeyValue, InQuickInputContextKey, inQuickInputContext, quickInputTypeContextKeyValue, QuickInputTypeContextKey, endOfQuickInputBoxContextKeyValue, EndOfQuickInputBoxContextKey, endOfQuickInputBoxContext, backButton, QuickInput, QuickPick, InputBox, QuickInputHoverDelegate; +var init_quickInput3 = __esm({ + "node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickInput.js"() { + init_dom(); + init_keyboardEvent(); + init_toggle2(); + init_arrays(); + init_async(); + init_codicons(); + init_event(); + init_lifecycle(); + init_platform(); + init_severity(); + init_themables(); + init_quickInput2(); + init_nls(); + init_quickInput(); + init_quickInputUtils(); + init_configuration(); + init_hover(); + init_quickInput(); + init_contextkey(); + __decorate35 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param31 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + inQuickInputContextKeyValue = "inQuickInput"; + InQuickInputContextKey = new RawContextKey(inQuickInputContextKeyValue, false, localize("inQuickInput", "Whether keyboard focus is inside the quick input control")); + inQuickInputContext = ContextKeyExpr.has(inQuickInputContextKeyValue); + quickInputTypeContextKeyValue = "quickInputType"; + QuickInputTypeContextKey = new RawContextKey(quickInputTypeContextKeyValue, void 0, localize("quickInputType", "The type of the currently visible quick input")); + endOfQuickInputBoxContextKeyValue = "cursorAtEndOfQuickInputBox"; + EndOfQuickInputBoxContextKey = new RawContextKey(endOfQuickInputBoxContextKeyValue, false, localize("cursorAtEndOfQuickInputBox", "Whether the cursor in the quick input is at the end of the input box")); + endOfQuickInputBoxContext = ContextKeyExpr.has(endOfQuickInputBoxContextKeyValue); + backButton = { + iconClass: ThemeIcon.asClassName(Codicon.quickInputBack), + tooltip: localize("quickInput.back", "Back"), + handle: -1 + // TODO + }; + QuickInput = class _QuickInput extends Disposable { + constructor(ui) { + super(); + this.ui = ui; + this._widgetUpdated = false; + this.visible = false; + this._enabled = true; + this._busy = false; + this._ignoreFocusOut = false; + this._buttons = []; + this.buttonsUpdated = false; + this._toggles = []; + this.togglesUpdated = false; + this.noValidationMessage = _QuickInput.noPromptMessage; + this._severity = severity_default.Ignore; + this.onDidTriggerButtonEmitter = this._register(new Emitter()); + this.onDidHideEmitter = this._register(new Emitter()); + this.onWillHideEmitter = this._register(new Emitter()); + this.onDisposeEmitter = this._register(new Emitter()); + this.visibleDisposables = this._register(new DisposableStore()); + this.onDidHide = this.onDidHideEmitter.event; + } + get title() { + return this._title; + } + set title(title) { + this._title = title; + this.update(); + } + get description() { + return this._description; + } + set description(description) { + this._description = description; + this.update(); + } + get step() { + return this._steps; + } + set step(step) { + this._steps = step; + this.update(); + } + get totalSteps() { + return this._totalSteps; + } + set totalSteps(totalSteps) { + this._totalSteps = totalSteps; + this.update(); + } + get enabled() { + return this._enabled; + } + set enabled(enabled) { + this._enabled = enabled; + this.update(); + } + get contextKey() { + return this._contextKey; + } + set contextKey(contextKey) { + this._contextKey = contextKey; + this.update(); + } + get busy() { + return this._busy; + } + set busy(busy) { + this._busy = busy; + this.update(); + } + get ignoreFocusOut() { + return this._ignoreFocusOut; + } + set ignoreFocusOut(ignoreFocusOut) { + const shouldUpdate = this._ignoreFocusOut !== ignoreFocusOut && !isIOS; + this._ignoreFocusOut = ignoreFocusOut && !isIOS; + if (shouldUpdate) { + this.update(); + } + } + get buttons() { + return this._buttons; + } + set buttons(buttons) { + this._buttons = buttons; + this.buttonsUpdated = true; + this.update(); + } + get toggles() { + return this._toggles; + } + set toggles(toggles) { + this._toggles = toggles !== null && toggles !== void 0 ? toggles : []; + this.togglesUpdated = true; + this.update(); + } + get validationMessage() { + return this._validationMessage; + } + set validationMessage(validationMessage) { + this._validationMessage = validationMessage; + this.update(); + } + get severity() { + return this._severity; + } + set severity(severity) { + this._severity = severity; + this.update(); + } + show() { + if (this.visible) { + return; + } + this.visibleDisposables.add(this.ui.onDidTriggerButton((button) => { + if (this.buttons.indexOf(button) !== -1) { + this.onDidTriggerButtonEmitter.fire(button); + } + })); + this.ui.show(this); + this.visible = true; + this._lastValidationMessage = void 0; + this._lastSeverity = void 0; + if (this.buttons.length) { + this.buttonsUpdated = true; + } + if (this.toggles.length) { + this.togglesUpdated = true; + } + this.update(); + } + hide() { + if (!this.visible) { + return; + } + this.ui.hide(); + } + didHide(reason = QuickInputHideReason.Other) { + this.visible = false; + this.visibleDisposables.clear(); + this.onDidHideEmitter.fire({ reason }); + } + willHide(reason = QuickInputHideReason.Other) { + this.onWillHideEmitter.fire({ reason }); + } + update() { + var _a10, _b4; + if (!this.visible) { + return; + } + const title = this.getTitle(); + if (title && this.ui.title.textContent !== title) { + this.ui.title.textContent = title; + } else if (!title && this.ui.title.innerHTML !== " ") { + this.ui.title.innerText = "\xA0"; + } + const description = this.getDescription(); + if (this.ui.description1.textContent !== description) { + this.ui.description1.textContent = description; + } + if (this.ui.description2.textContent !== description) { + this.ui.description2.textContent = description; + } + if (this._widgetUpdated) { + this._widgetUpdated = false; + if (this._widget) { + reset(this.ui.widget, this._widget); + } else { + reset(this.ui.widget); + } + } + if (this.busy && !this.busyDelay) { + this.busyDelay = new TimeoutTimer(); + this.busyDelay.setIfNotSet(() => { + if (this.visible) { + this.ui.progressBar.infinite(); + } + }, 800); + } + if (!this.busy && this.busyDelay) { + this.ui.progressBar.stop(); + this.busyDelay.cancel(); + this.busyDelay = void 0; + } + if (this.buttonsUpdated) { + this.buttonsUpdated = false; + this.ui.leftActionBar.clear(); + const leftButtons = this.buttons.filter((button) => button === backButton).map((button, index) => quickInputButtonToAction(button, `id-${index}`, () => __async(this, null, function* () { + return this.onDidTriggerButtonEmitter.fire(button); + }))); + this.ui.leftActionBar.push(leftButtons, { icon: true, label: false }); + this.ui.rightActionBar.clear(); + const rightButtons = this.buttons.filter((button) => button !== backButton).map((button, index) => quickInputButtonToAction(button, `id-${index}`, () => __async(this, null, function* () { + return this.onDidTriggerButtonEmitter.fire(button); + }))); + this.ui.rightActionBar.push(rightButtons, { icon: true, label: false }); + } + if (this.togglesUpdated) { + this.togglesUpdated = false; + const concreteToggles = (_b4 = (_a10 = this.toggles) === null || _a10 === void 0 ? void 0 : _a10.filter((opts) => opts instanceof Toggle)) !== null && _b4 !== void 0 ? _b4 : []; + this.ui.inputBox.toggles = concreteToggles; + } + this.ui.ignoreFocusOut = this.ignoreFocusOut; + this.ui.setEnabled(this.enabled); + this.ui.setContextKey(this.contextKey); + const validationMessage = this.validationMessage || this.noValidationMessage; + if (this._lastValidationMessage !== validationMessage) { + this._lastValidationMessage = validationMessage; + reset(this.ui.message); + renderQuickInputDescription(validationMessage, this.ui.message, { + callback: (content) => { + this.ui.linkOpenerDelegate(content); + }, + disposables: this.visibleDisposables + }); + } + if (this._lastSeverity !== this.severity) { + this._lastSeverity = this.severity; + this.showMessageDecoration(this.severity); + } + } + getTitle() { + if (this.title && this.step) { + return `${this.title} (${this.getSteps()})`; + } + if (this.title) { + return this.title; + } + if (this.step) { + return this.getSteps(); + } + return ""; + } + getDescription() { + return this.description || ""; + } + getSteps() { + if (this.step && this.totalSteps) { + return localize("quickInput.steps", "{0}/{1}", this.step, this.totalSteps); + } + if (this.step) { + return String(this.step); + } + return ""; + } + showMessageDecoration(severity) { + this.ui.inputBox.showDecoration(severity); + if (severity !== severity_default.Ignore) { + const styles = this.ui.inputBox.stylesForType(severity); + this.ui.message.style.color = styles.foreground ? `${styles.foreground}` : ""; + this.ui.message.style.backgroundColor = styles.background ? `${styles.background}` : ""; + this.ui.message.style.border = styles.border ? `1px solid ${styles.border}` : ""; + this.ui.message.style.marginBottom = "-2px"; + } else { + this.ui.message.style.color = ""; + this.ui.message.style.backgroundColor = ""; + this.ui.message.style.border = ""; + this.ui.message.style.marginBottom = ""; + } + } + dispose() { + this.hide(); + this.onDisposeEmitter.fire(); + super.dispose(); + } + }; + QuickInput.noPromptMessage = localize("inputModeEntry", "Press 'Enter' to confirm your input or 'Escape' to cancel"); + QuickPick = class _QuickPick extends QuickInput { + constructor() { + super(...arguments); + this._value = ""; + this.onDidChangeValueEmitter = this._register(new Emitter()); + this.onWillAcceptEmitter = this._register(new Emitter()); + this.onDidAcceptEmitter = this._register(new Emitter()); + this.onDidCustomEmitter = this._register(new Emitter()); + this._items = []; + this.itemsUpdated = false; + this._canSelectMany = false; + this._canAcceptInBackground = false; + this._matchOnDescription = false; + this._matchOnDetail = false; + this._matchOnLabel = true; + this._matchOnLabelMode = "fuzzy"; + this._sortByLabel = true; + this._keepScrollPosition = false; + this._itemActivation = ItemActivation.FIRST; + this._activeItems = []; + this.activeItemsUpdated = false; + this.activeItemsToConfirm = []; + this.onDidChangeActiveEmitter = this._register(new Emitter()); + this._selectedItems = []; + this.selectedItemsUpdated = false; + this.selectedItemsToConfirm = []; + this.onDidChangeSelectionEmitter = this._register(new Emitter()); + this.onDidTriggerItemButtonEmitter = this._register(new Emitter()); + this.onDidTriggerSeparatorButtonEmitter = this._register(new Emitter()); + this.valueSelectionUpdated = true; + this._ok = "default"; + this._customButton = false; + this._focusEventBufferer = new EventBufferer(); + this.type = "quickPick"; + this.filterValue = (value) => value; + this.onDidChangeValue = this.onDidChangeValueEmitter.event; + this.onWillAccept = this.onWillAcceptEmitter.event; + this.onDidAccept = this.onDidAcceptEmitter.event; + this.onDidChangeActive = this.onDidChangeActiveEmitter.event; + this.onDidChangeSelection = this.onDidChangeSelectionEmitter.event; + this.onDidTriggerItemButton = this.onDidTriggerItemButtonEmitter.event; + this.onDidTriggerSeparatorButton = this.onDidTriggerSeparatorButtonEmitter.event; + } + get quickNavigate() { + return this._quickNavigate; + } + set quickNavigate(quickNavigate) { + this._quickNavigate = quickNavigate; + this.update(); + } + get value() { + return this._value; + } + set value(value) { + this.doSetValue(value); + } + doSetValue(value, skipUpdate) { + if (this._value !== value) { + this._value = value; + if (!skipUpdate) { + this.update(); + } + if (this.visible) { + const didFilter = this.ui.list.filter(this.filterValue(this._value)); + if (didFilter) { + this.trySelectFirst(); + } + } + this.onDidChangeValueEmitter.fire(this._value); + } + } + set ariaLabel(ariaLabel) { + this._ariaLabel = ariaLabel; + this.update(); + } + get ariaLabel() { + return this._ariaLabel; + } + get placeholder() { + return this._placeholder; + } + set placeholder(placeholder) { + this._placeholder = placeholder; + this.update(); + } + get items() { + return this._items; + } + get scrollTop() { + return this.ui.list.scrollTop; + } + set scrollTop(scrollTop) { + this.ui.list.scrollTop = scrollTop; + } + set items(items) { + this._items = items; + this.itemsUpdated = true; + this.update(); + } + get canSelectMany() { + return this._canSelectMany; + } + set canSelectMany(canSelectMany) { + this._canSelectMany = canSelectMany; + this.update(); + } + get canAcceptInBackground() { + return this._canAcceptInBackground; + } + set canAcceptInBackground(canAcceptInBackground) { + this._canAcceptInBackground = canAcceptInBackground; + } + get matchOnDescription() { + return this._matchOnDescription; + } + set matchOnDescription(matchOnDescription) { + this._matchOnDescription = matchOnDescription; + this.update(); + } + get matchOnDetail() { + return this._matchOnDetail; + } + set matchOnDetail(matchOnDetail) { + this._matchOnDetail = matchOnDetail; + this.update(); + } + get matchOnLabel() { + return this._matchOnLabel; + } + set matchOnLabel(matchOnLabel) { + this._matchOnLabel = matchOnLabel; + this.update(); + } + get matchOnLabelMode() { + return this._matchOnLabelMode; + } + set matchOnLabelMode(matchOnLabelMode) { + this._matchOnLabelMode = matchOnLabelMode; + this.update(); + } + get sortByLabel() { + return this._sortByLabel; + } + set sortByLabel(sortByLabel) { + this._sortByLabel = sortByLabel; + this.update(); + } + get keepScrollPosition() { + return this._keepScrollPosition; + } + set keepScrollPosition(keepScrollPosition) { + this._keepScrollPosition = keepScrollPosition; + } + get itemActivation() { + return this._itemActivation; + } + set itemActivation(itemActivation) { + this._itemActivation = itemActivation; + } + get activeItems() { + return this._activeItems; + } + set activeItems(activeItems) { + this._activeItems = activeItems; + this.activeItemsUpdated = true; + this.update(); + } + get selectedItems() { + return this._selectedItems; + } + set selectedItems(selectedItems) { + this._selectedItems = selectedItems; + this.selectedItemsUpdated = true; + this.update(); + } + get keyMods() { + if (this._quickNavigate) { + return NO_KEY_MODS; + } + return this.ui.keyMods; + } + get valueSelection() { + const selection = this.ui.inputBox.getSelection(); + if (!selection) { + return void 0; + } + return [selection.start, selection.end]; + } + set valueSelection(valueSelection) { + this._valueSelection = valueSelection; + this.valueSelectionUpdated = true; + this.update(); + } + get customButton() { + return this._customButton; + } + set customButton(showCustomButton) { + this._customButton = showCustomButton; + this.update(); + } + get customLabel() { + return this._customButtonLabel; + } + set customLabel(label) { + this._customButtonLabel = label; + this.update(); + } + get customHover() { + return this._customButtonHover; + } + set customHover(hover) { + this._customButtonHover = hover; + this.update(); + } + get ok() { + return this._ok; + } + set ok(showOkButton) { + this._ok = showOkButton; + this.update(); + } + get hideInput() { + return !!this._hideInput; + } + set hideInput(hideInput) { + this._hideInput = hideInput; + this.update(); + } + trySelectFirst() { + if (!this.canSelectMany) { + this.ui.list.focus(QuickPickFocus.First); + } + } + show() { + if (!this.visible) { + this.visibleDisposables.add(this.ui.inputBox.onDidChange((value) => { + this.doSetValue( + value, + true + /* skip update since this originates from the UI */ + ); + })); + this.visibleDisposables.add(this.ui.onDidAccept(() => { + if (this.canSelectMany) { + if (!this.ui.list.getCheckedElements().length) { + this._selectedItems = []; + this.onDidChangeSelectionEmitter.fire(this.selectedItems); + } + } else if (this.activeItems[0]) { + this._selectedItems = [this.activeItems[0]]; + this.onDidChangeSelectionEmitter.fire(this.selectedItems); + } + this.handleAccept(false); + })); + this.visibleDisposables.add(this.ui.onDidCustom(() => { + this.onDidCustomEmitter.fire(); + })); + this.visibleDisposables.add(this._focusEventBufferer.wrapEvent( + this.ui.list.onDidChangeFocus, + // Only fire the last event + (_, e) => e + )((focusedItems) => { + if (this.activeItemsUpdated) { + return; + } + if (this.activeItemsToConfirm !== this._activeItems && equals(focusedItems, this._activeItems, (a3, b) => a3 === b)) { + return; + } + this._activeItems = focusedItems; + this.onDidChangeActiveEmitter.fire(focusedItems); + })); + this.visibleDisposables.add(this.ui.list.onDidChangeSelection(({ items: selectedItems, event }) => { + if (this.canSelectMany) { + if (selectedItems.length) { + this.ui.list.setSelectedElements([]); + } + return; + } + if (this.selectedItemsToConfirm !== this._selectedItems && equals(selectedItems, this._selectedItems, (a3, b) => a3 === b)) { + return; + } + this._selectedItems = selectedItems; + this.onDidChangeSelectionEmitter.fire(selectedItems); + if (selectedItems.length) { + this.handleAccept( + isMouseEvent(event) && event.button === 1 + /* mouse middle click */ + ); + } + })); + this.visibleDisposables.add(this.ui.list.onChangedCheckedElements((checkedItems) => { + if (!this.canSelectMany) { + return; + } + if (this.selectedItemsToConfirm !== this._selectedItems && equals(checkedItems, this._selectedItems, (a3, b) => a3 === b)) { + return; + } + this._selectedItems = checkedItems; + this.onDidChangeSelectionEmitter.fire(checkedItems); + })); + this.visibleDisposables.add(this.ui.list.onButtonTriggered((event) => this.onDidTriggerItemButtonEmitter.fire(event))); + this.visibleDisposables.add(this.ui.list.onSeparatorButtonTriggered((event) => this.onDidTriggerSeparatorButtonEmitter.fire(event))); + this.visibleDisposables.add(this.registerQuickNavigation()); + this.valueSelectionUpdated = true; + } + super.show(); + } + handleAccept(inBackground) { + let veto = false; + this.onWillAcceptEmitter.fire({ veto: () => veto = true }); + if (!veto) { + this.onDidAcceptEmitter.fire({ inBackground }); + } + } + registerQuickNavigation() { + return addDisposableListener(this.ui.container, EventType.KEY_UP, (e) => { + if (this.canSelectMany || !this._quickNavigate) { + return; + } + const keyboardEvent = new StandardKeyboardEvent(e); + const keyCode = keyboardEvent.keyCode; + const quickNavKeys = this._quickNavigate.keybindings; + const wasTriggerKeyPressed = quickNavKeys.some((k) => { + const chords = k.getChords(); + if (chords.length > 1) { + return false; + } + if (chords[0].shiftKey && keyCode === 4) { + if (keyboardEvent.ctrlKey || keyboardEvent.altKey || keyboardEvent.metaKey) { + return false; + } + return true; + } + if (chords[0].altKey && keyCode === 6) { + return true; + } + if (chords[0].ctrlKey && keyCode === 5) { + return true; + } + if (chords[0].metaKey && keyCode === 57) { + return true; + } + return false; + }); + if (wasTriggerKeyPressed) { + if (this.activeItems[0]) { + this._selectedItems = [this.activeItems[0]]; + this.onDidChangeSelectionEmitter.fire(this.selectedItems); + this.handleAccept(false); + } + this._quickNavigate = void 0; + } + }); + } + update() { + if (!this.visible) { + return; + } + const scrollTopBefore = this.keepScrollPosition ? this.scrollTop : 0; + const hasDescription = !!this.description; + const visibilities = { + title: !!this.title || !!this.step || !!this.buttons.length, + description: hasDescription, + checkAll: this.canSelectMany && !this._hideCheckAll, + checkBox: this.canSelectMany, + inputBox: !this._hideInput, + progressBar: !this._hideInput || hasDescription, + visibleCount: true, + count: this.canSelectMany && !this._hideCountBadge, + ok: this.ok === "default" ? this.canSelectMany : this.ok, + list: true, + message: !!this.validationMessage, + customButton: this.customButton + }; + this.ui.setVisibilities(visibilities); + super.update(); + if (this.ui.inputBox.value !== this.value) { + this.ui.inputBox.value = this.value; + } + if (this.valueSelectionUpdated) { + this.valueSelectionUpdated = false; + this.ui.inputBox.select(this._valueSelection && { start: this._valueSelection[0], end: this._valueSelection[1] }); + } + if (this.ui.inputBox.placeholder !== (this.placeholder || "")) { + this.ui.inputBox.placeholder = this.placeholder || ""; + } + let ariaLabel = this.ariaLabel; + if (!ariaLabel && visibilities.inputBox) { + ariaLabel = this.placeholder || _QuickPick.DEFAULT_ARIA_LABEL; + if (this.title) { + ariaLabel += ` - ${this.title}`; + } + } + if (this.ui.list.ariaLabel !== ariaLabel) { + this.ui.list.ariaLabel = ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : null; + } + this.ui.list.matchOnDescription = this.matchOnDescription; + this.ui.list.matchOnDetail = this.matchOnDetail; + this.ui.list.matchOnLabel = this.matchOnLabel; + this.ui.list.matchOnLabelMode = this.matchOnLabelMode; + this.ui.list.sortByLabel = this.sortByLabel; + if (this.itemsUpdated) { + this.itemsUpdated = false; + this._focusEventBufferer.bufferEvents(() => { + this.ui.list.setElements(this.items); + this.ui.list.shouldLoop = !this.canSelectMany; + this.ui.list.filter(this.filterValue(this.ui.inputBox.value)); + this.ui.checkAll.checked = this.ui.list.getAllVisibleChecked(); + this.ui.visibleCount.setCount(this.ui.list.getVisibleCount()); + this.ui.count.setCount(this.ui.list.getCheckedCount()); + switch (this._itemActivation) { + case ItemActivation.NONE: + this._itemActivation = ItemActivation.FIRST; + break; + case ItemActivation.SECOND: + this.ui.list.focus(QuickPickFocus.Second); + this._itemActivation = ItemActivation.FIRST; + break; + case ItemActivation.LAST: + this.ui.list.focus(QuickPickFocus.Last); + this._itemActivation = ItemActivation.FIRST; + break; + default: + this.trySelectFirst(); + break; + } + }); + } + if (this.ui.container.classList.contains("show-checkboxes") !== !!this.canSelectMany) { + if (this.canSelectMany) { + this.ui.list.clearFocus(); + } else { + this.trySelectFirst(); + } + } + if (this.activeItemsUpdated) { + this.activeItemsUpdated = false; + this.activeItemsToConfirm = this._activeItems; + this.ui.list.setFocusedElements(this.activeItems); + if (this.activeItemsToConfirm === this._activeItems) { + this.activeItemsToConfirm = null; + } + } + if (this.selectedItemsUpdated) { + this.selectedItemsUpdated = false; + this.selectedItemsToConfirm = this._selectedItems; + if (this.canSelectMany) { + this.ui.list.setCheckedElements(this.selectedItems); + } else { + this.ui.list.setSelectedElements(this.selectedItems); + } + if (this.selectedItemsToConfirm === this._selectedItems) { + this.selectedItemsToConfirm = null; + } + } + this.ui.customButton.label = this.customLabel || ""; + this.ui.customButton.element.title = this.customHover || ""; + if (!visibilities.inputBox) { + this.ui.list.domFocus(); + if (this.canSelectMany) { + this.ui.list.focus(QuickPickFocus.First); + } + } + if (this.keepScrollPosition) { + this.scrollTop = scrollTopBefore; + } + } + focus(focus) { + this.ui.list.focus(focus); + if (this.canSelectMany) { + this.ui.list.domFocus(); + } + } + accept(inBackground) { + if (inBackground && !this._canAcceptInBackground) { + return; + } + if (this.activeItems[0]) { + this._selectedItems = [this.activeItems[0]]; + this.onDidChangeSelectionEmitter.fire(this.selectedItems); + this.handleAccept(inBackground !== null && inBackground !== void 0 ? inBackground : false); + } + } + }; + QuickPick.DEFAULT_ARIA_LABEL = localize("quickInputBox.ariaLabel", "Type to narrow down results."); + InputBox = class extends QuickInput { + constructor() { + super(...arguments); + this._value = ""; + this.valueSelectionUpdated = true; + this._password = false; + this.onDidValueChangeEmitter = this._register(new Emitter()); + this.onDidAcceptEmitter = this._register(new Emitter()); + this.type = "inputBox"; + this.onDidChangeValue = this.onDidValueChangeEmitter.event; + this.onDidAccept = this.onDidAcceptEmitter.event; + } + get value() { + return this._value; + } + set value(value) { + this._value = value || ""; + this.update(); + } + get placeholder() { + return this._placeholder; + } + set placeholder(placeholder) { + this._placeholder = placeholder; + this.update(); + } + get password() { + return this._password; + } + set password(password) { + this._password = password; + this.update(); + } + show() { + if (!this.visible) { + this.visibleDisposables.add(this.ui.inputBox.onDidChange((value) => { + if (value === this.value) { + return; + } + this._value = value; + this.onDidValueChangeEmitter.fire(value); + })); + this.visibleDisposables.add(this.ui.onDidAccept(() => this.onDidAcceptEmitter.fire())); + this.valueSelectionUpdated = true; + } + super.show(); + } + update() { + if (!this.visible) { + return; + } + this.ui.container.classList.remove("hidden-input"); + const visibilities = { + title: !!this.title || !!this.step || !!this.buttons.length, + description: !!this.description || !!this.step, + inputBox: true, + message: true, + progressBar: true + }; + this.ui.setVisibilities(visibilities); + super.update(); + if (this.ui.inputBox.value !== this.value) { + this.ui.inputBox.value = this.value; + } + if (this.valueSelectionUpdated) { + this.valueSelectionUpdated = false; + this.ui.inputBox.select(this._valueSelection && { start: this._valueSelection[0], end: this._valueSelection[1] }); + } + if (this.ui.inputBox.placeholder !== (this.placeholder || "")) { + this.ui.inputBox.placeholder = this.placeholder || ""; + } + if (this.ui.inputBox.password !== this.password) { + this.ui.inputBox.password = this.password; + } + } + }; + QuickInputHoverDelegate = class QuickInputHoverDelegate2 extends WorkbenchHoverDelegate { + constructor(configurationService, hoverService) { + super("element", false, (options2) => this.getOverrideOptions(options2), configurationService, hoverService); + } + getOverrideOptions(options2) { + var _a10; + const showHoverHint = (isHTMLElement(options2.content) ? (_a10 = options2.content.textContent) !== null && _a10 !== void 0 ? _a10 : "" : typeof options2.content === "string" ? options2.content : options2.content.value).includes("\n"); + return { + persistence: { + hideOnKeyDown: false + }, + appearance: { + showHoverHint, + skipFadeInAnimation: true + } + }; + } + }; + QuickInputHoverDelegate = __decorate35([ + __param31(0, IConfigurationService), + __param31(1, IHoverService) + ], QuickInputHoverDelegate); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/button/button.css +var init_button = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/button/button.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/button/button.js +var unthemedButtonStyles, Button; +var init_button2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/button/button.js"() { + init_dom(); + init_dompurify(); + init_keyboardEvent(); + init_markdownRenderer(); + init_touch(); + init_hoverDelegateFactory(); + init_iconLabels(); + init_color(); + init_event(); + init_htmlContent(); + init_lifecycle(); + init_themables(); + init_button(); + init_hoverDelegate2(); + unthemedButtonStyles = { + buttonBackground: "#0E639C", + buttonHoverBackground: "#006BB3", + buttonSeparator: Color.white.toString(), + buttonForeground: Color.white.toString(), + buttonBorder: void 0, + buttonSecondaryBackground: void 0, + buttonSecondaryForeground: void 0, + buttonSecondaryHoverBackground: void 0 + }; + Button = class extends Disposable { + get onDidClick() { + return this._onDidClick.event; + } + constructor(container, options2) { + super(); + this._label = ""; + this._onDidClick = this._register(new Emitter()); + this._onDidEscape = this._register(new Emitter()); + this.options = options2; + this._element = document.createElement("a"); + this._element.classList.add("monaco-button"); + this._element.tabIndex = 0; + this._element.setAttribute("role", "button"); + this._element.classList.toggle("secondary", !!options2.secondary); + const background = options2.secondary ? options2.buttonSecondaryBackground : options2.buttonBackground; + const foreground2 = options2.secondary ? options2.buttonSecondaryForeground : options2.buttonForeground; + this._element.style.color = foreground2 || ""; + this._element.style.backgroundColor = background || ""; + if (options2.supportShortLabel) { + this._labelShortElement = document.createElement("div"); + this._labelShortElement.classList.add("monaco-button-label-short"); + this._element.appendChild(this._labelShortElement); + this._labelElement = document.createElement("div"); + this._labelElement.classList.add("monaco-button-label"); + this._element.appendChild(this._labelElement); + this._element.classList.add("monaco-text-button-with-short-label"); + } + if (typeof options2.title === "string") { + this.setTitle(options2.title); + } + if (typeof options2.ariaLabel === "string") { + this._element.setAttribute("aria-label", options2.ariaLabel); + } + container.appendChild(this._element); + this._register(Gesture.addTarget(this._element)); + [EventType.CLICK, EventType2.Tap].forEach((eventType) => { + this._register(addDisposableListener(this._element, eventType, (e) => { + if (!this.enabled) { + EventHelper.stop(e); + return; + } + this._onDidClick.fire(e); + })); + }); + this._register(addDisposableListener(this._element, EventType.KEY_DOWN, (e) => { + const event = new StandardKeyboardEvent(e); + let eventHandled = false; + if (this.enabled && (event.equals( + 3 + /* KeyCode.Enter */ + ) || event.equals( + 10 + /* KeyCode.Space */ + ))) { + this._onDidClick.fire(e); + eventHandled = true; + } else if (event.equals( + 9 + /* KeyCode.Escape */ + )) { + this._onDidEscape.fire(e); + this._element.blur(); + eventHandled = true; + } + if (eventHandled) { + EventHelper.stop(event, true); + } + })); + this._register(addDisposableListener(this._element, EventType.MOUSE_OVER, (e) => { + if (!this._element.classList.contains("disabled")) { + this.updateBackground(true); + } + })); + this._register(addDisposableListener(this._element, EventType.MOUSE_OUT, (e) => { + this.updateBackground(false); + })); + this.focusTracker = this._register(trackFocus(this._element)); + this._register(this.focusTracker.onDidFocus(() => { + if (this.enabled) { + this.updateBackground(true); + } + })); + this._register(this.focusTracker.onDidBlur(() => { + if (this.enabled) { + this.updateBackground(false); + } + })); + } + dispose() { + super.dispose(); + this._element.remove(); + } + getContentElements(content) { + const elements = []; + for (let segment of renderLabelWithIcons(content)) { + if (typeof segment === "string") { + segment = segment.trim(); + if (segment === "") { + continue; + } + const node = document.createElement("span"); + node.textContent = segment; + elements.push(node); + } else { + elements.push(segment); + } + } + return elements; + } + updateBackground(hover) { + let background; + if (this.options.secondary) { + background = hover ? this.options.buttonSecondaryHoverBackground : this.options.buttonSecondaryBackground; + } else { + background = hover ? this.options.buttonHoverBackground : this.options.buttonBackground; + } + if (background) { + this._element.style.backgroundColor = background; + } + } + get element() { + return this._element; + } + set label(value) { + var _a10; + if (this._label === value) { + return; + } + if (isMarkdownString(this._label) && isMarkdownString(value) && markdownStringEqual(this._label, value)) { + return; + } + this._element.classList.add("monaco-text-button"); + const labelElement = this.options.supportShortLabel ? this._labelElement : this._element; + if (isMarkdownString(value)) { + const rendered = renderMarkdown(value, { inline: true }); + rendered.dispose(); + const root = (_a10 = rendered.element.querySelector("p")) === null || _a10 === void 0 ? void 0 : _a10.innerHTML; + if (root) { + const sanitized = sanitize(root, { ADD_TAGS: ["b", "i", "u", "code", "span"], ALLOWED_ATTR: ["class"], RETURN_TRUSTED_TYPE: true }); + labelElement.innerHTML = sanitized; + } else { + reset(labelElement); + } + } else { + if (this.options.supportIcons) { + reset(labelElement, ...this.getContentElements(value)); + } else { + labelElement.textContent = value; + } + } + let title = ""; + if (typeof this.options.title === "string") { + title = this.options.title; + } else if (this.options.title) { + title = renderStringAsPlaintext(value); + } + this.setTitle(title); + if (typeof this.options.ariaLabel === "string") { + this._element.setAttribute("aria-label", this.options.ariaLabel); + } else if (this.options.ariaLabel) { + this._element.setAttribute("aria-label", title); + } + this._label = value; + } + get label() { + return this._label; + } + set icon(icon) { + this._element.classList.add(...ThemeIcon.asClassNameArray(icon)); + } + set enabled(value) { + if (value) { + this._element.classList.remove("disabled"); + this._element.setAttribute("aria-disabled", String(false)); + this._element.tabIndex = 0; + } else { + this._element.classList.add("disabled"); + this._element.setAttribute("aria-disabled", String(true)); + } + } + get enabled() { + return !this._element.classList.contains("disabled"); + } + setTitle(title) { + var _a10; + if (!this._hover && title !== "") { + this._hover = this._register(getBaseLayerHoverDelegate().setupUpdatableHover((_a10 = this.options.hoverDelegate) !== null && _a10 !== void 0 ? _a10 : getDefaultHoverDelegate("mouse"), this._element, title)); + } else if (this._hover) { + this._hover.update(title); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/countBadge/countBadge.css +var init_countBadge = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/countBadge/countBadge.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/countBadge/countBadge.js +var CountBadge; +var init_countBadge2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/countBadge/countBadge.js"() { + init_dom(); + init_strings(); + init_countBadge(); + CountBadge = class { + constructor(container, options2, styles) { + this.options = options2; + this.styles = styles; + this.count = 0; + this.element = append(container, $(".monaco-count-badge")); + this.countFormat = this.options.countFormat || "{0}"; + this.titleFormat = this.options.titleFormat || ""; + this.setCount(this.options.count || 0); + } + setCount(count) { + this.count = count; + this.render(); + } + setTitleFormat(titleFormat) { + this.titleFormat = titleFormat; + this.render(); + } + render() { + var _a10, _b4; + this.element.textContent = format(this.countFormat, this.count); + this.element.title = format(this.titleFormat, this.count); + this.element.style.backgroundColor = (_a10 = this.styles.badgeBackground) !== null && _a10 !== void 0 ? _a10 : ""; + this.element.style.color = (_b4 = this.styles.badgeForeground) !== null && _b4 !== void 0 ? _b4 : ""; + if (this.styles.badgeBorder) { + this.element.style.border = `1px solid ${this.styles.badgeBorder}`; + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/progressbar/progressbar.css +var init_progressbar = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/progressbar/progressbar.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/progressbar/progressbar.js +var CSS_DONE, CSS_ACTIVE, CSS_INFINITE, CSS_INFINITE_LONG_RUNNING, CSS_DISCRETE, ProgressBar; +var init_progressbar2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/progressbar/progressbar.js"() { + init_dom(); + init_async(); + init_lifecycle(); + init_progressbar(); + CSS_DONE = "done"; + CSS_ACTIVE = "active"; + CSS_INFINITE = "infinite"; + CSS_INFINITE_LONG_RUNNING = "infinite-long-running"; + CSS_DISCRETE = "discrete"; + ProgressBar = class _ProgressBar extends Disposable { + constructor(container, options2) { + super(); + this.progressSignal = this._register(new MutableDisposable()); + this.workedVal = 0; + this.showDelayedScheduler = this._register(new RunOnceScheduler(() => show(this.element), 0)); + this.longRunningScheduler = this._register(new RunOnceScheduler(() => this.infiniteLongRunning(), _ProgressBar.LONG_RUNNING_INFINITE_THRESHOLD)); + this.create(container, options2); + } + create(container, options2) { + this.element = document.createElement("div"); + this.element.classList.add("monaco-progress-container"); + this.element.setAttribute("role", "progressbar"); + this.element.setAttribute("aria-valuemin", "0"); + container.appendChild(this.element); + this.bit = document.createElement("div"); + this.bit.classList.add("progress-bit"); + this.bit.style.backgroundColor = (options2 === null || options2 === void 0 ? void 0 : options2.progressBarBackground) || "#0E70C0"; + this.element.appendChild(this.bit); + } + off() { + this.bit.style.width = "inherit"; + this.bit.style.opacity = "1"; + this.element.classList.remove(CSS_ACTIVE, CSS_INFINITE, CSS_INFINITE_LONG_RUNNING, CSS_DISCRETE); + this.workedVal = 0; + this.totalWork = void 0; + this.longRunningScheduler.cancel(); + this.progressSignal.clear(); + } + /** + * Stops the progressbar from showing any progress instantly without fading out. + */ + stop() { + return this.doDone(false); + } + doDone(delayed) { + this.element.classList.add(CSS_DONE); + if (!this.element.classList.contains(CSS_INFINITE)) { + this.bit.style.width = "inherit"; + if (delayed) { + setTimeout(() => this.off(), 200); + } else { + this.off(); + } + } else { + this.bit.style.opacity = "0"; + if (delayed) { + setTimeout(() => this.off(), 200); + } else { + this.off(); + } + } + return this; + } + /** + * Use this mode to indicate progress that has no total number of work units. + */ + infinite() { + this.bit.style.width = "2%"; + this.bit.style.opacity = "1"; + this.element.classList.remove(CSS_DISCRETE, CSS_DONE, CSS_INFINITE_LONG_RUNNING); + this.element.classList.add(CSS_ACTIVE, CSS_INFINITE); + this.longRunningScheduler.schedule(); + return this; + } + infiniteLongRunning() { + this.element.classList.add(CSS_INFINITE_LONG_RUNNING); + } + getContainer() { + return this.element; + } + }; + ProgressBar.LONG_RUNNING_INFINITE_THRESHOLD = 1e4; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/findinput/findInputToggles.js +var NLS_CASE_SENSITIVE_TOGGLE_LABEL, NLS_WHOLE_WORD_TOGGLE_LABEL, NLS_REGEX_TOGGLE_LABEL, CaseSensitiveToggle, WholeWordsToggle, RegexToggle; +var init_findInputToggles = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/findinput/findInputToggles.js"() { + init_hoverDelegateFactory(); + init_toggle2(); + init_codicons(); + init_nls(); + NLS_CASE_SENSITIVE_TOGGLE_LABEL = localize("caseDescription", "Match Case"); + NLS_WHOLE_WORD_TOGGLE_LABEL = localize("wordsDescription", "Match Whole Word"); + NLS_REGEX_TOGGLE_LABEL = localize("regexDescription", "Use Regular Expression"); + CaseSensitiveToggle = class extends Toggle { + constructor(opts) { + var _a10; + super({ + icon: Codicon.caseSensitive, + title: NLS_CASE_SENSITIVE_TOGGLE_LABEL + opts.appendTitle, + isChecked: opts.isChecked, + hoverDelegate: (_a10 = opts.hoverDelegate) !== null && _a10 !== void 0 ? _a10 : getDefaultHoverDelegate("element"), + inputActiveOptionBorder: opts.inputActiveOptionBorder, + inputActiveOptionForeground: opts.inputActiveOptionForeground, + inputActiveOptionBackground: opts.inputActiveOptionBackground + }); + } + }; + WholeWordsToggle = class extends Toggle { + constructor(opts) { + var _a10; + super({ + icon: Codicon.wholeWord, + title: NLS_WHOLE_WORD_TOGGLE_LABEL + opts.appendTitle, + isChecked: opts.isChecked, + hoverDelegate: (_a10 = opts.hoverDelegate) !== null && _a10 !== void 0 ? _a10 : getDefaultHoverDelegate("element"), + inputActiveOptionBorder: opts.inputActiveOptionBorder, + inputActiveOptionForeground: opts.inputActiveOptionForeground, + inputActiveOptionBackground: opts.inputActiveOptionBackground + }); + } + }; + RegexToggle = class extends Toggle { + constructor(opts) { + var _a10; + super({ + icon: Codicon.regex, + title: NLS_REGEX_TOGGLE_LABEL + opts.appendTitle, + isChecked: opts.isChecked, + hoverDelegate: (_a10 = opts.hoverDelegate) !== null && _a10 !== void 0 ? _a10 : getDefaultHoverDelegate("element"), + inputActiveOptionBorder: opts.inputActiveOptionBorder, + inputActiveOptionForeground: opts.inputActiveOptionForeground, + inputActiveOptionBackground: opts.inputActiveOptionBackground + }); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/navigator.js +var ArrayNavigator; +var init_navigator = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/navigator.js"() { + ArrayNavigator = class { + constructor(items, start = 0, end = items.length, index = start - 1) { + this.items = items; + this.start = start; + this.end = end; + this.index = index; + } + current() { + if (this.index === this.start - 1 || this.index === this.end) { + return null; + } + return this.items[this.index]; + } + next() { + this.index = Math.min(this.index + 1, this.end); + return this.current(); + } + previous() { + this.index = Math.max(this.index - 1, this.start - 1); + return this.current(); + } + first() { + this.index = this.start; + return this.current(); + } + last() { + this.index = this.end - 1; + return this.current(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/history.js +var HistoryNavigator; +var init_history = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/history.js"() { + init_navigator(); + HistoryNavigator = class { + constructor(history = [], limit = 10) { + this._initialize(history); + this._limit = limit; + this._onChange(); + } + getHistory() { + return this._elements; + } + add(t4) { + this._history.delete(t4); + this._history.add(t4); + this._onChange(); + } + next() { + return this._navigator.next(); + } + previous() { + if (this._currentPosition() !== 0) { + return this._navigator.previous(); + } + return null; + } + current() { + return this._navigator.current(); + } + first() { + return this._navigator.first(); + } + last() { + return this._navigator.last(); + } + isLast() { + return this._currentPosition() >= this._elements.length - 1; + } + isNowhere() { + return this._navigator.current() === null; + } + has(t4) { + return this._history.has(t4); + } + _onChange() { + this._reduceToLimit(); + const elements = this._elements; + this._navigator = new ArrayNavigator(elements, 0, elements.length, elements.length); + } + _reduceToLimit() { + const data = this._elements; + if (data.length > this._limit) { + this._initialize(data.slice(data.length - this._limit)); + } + } + _currentPosition() { + const currentElement = this._navigator.current(); + if (!currentElement) { + return -1; + } + return this._elements.indexOf(currentElement); + } + _initialize(history) { + this._history = /* @__PURE__ */ new Set(); + for (const entry of history) { + this._history.add(entry); + } + } + get _elements() { + const elements = []; + this._history.forEach((e) => elements.push(e)); + return elements; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/inputbox/inputBox.css +var init_inputBox = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/inputbox/inputBox.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/inputbox/inputBox.js +var $5, InputBox2, HistoryInputBox; +var init_inputBox2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/inputbox/inputBox.js"() { + init_dom(); + init_event2(); + init_formattedTextRenderer(); + init_actionbar2(); + init_aria2(); + init_hoverDelegate2(); + init_hoverDelegateFactory(); + init_scrollableElement(); + init_widget(); + init_event(); + init_history(); + init_objects(); + init_inputBox(); + init_nls(); + $5 = $; + InputBox2 = class extends Widget { + constructor(container, contextViewProvider, options2) { + var _a10; + super(); + this.state = "idle"; + this.maxHeight = Number.POSITIVE_INFINITY; + this._onDidChange = this._register(new Emitter()); + this.onDidChange = this._onDidChange.event; + this._onDidHeightChange = this._register(new Emitter()); + this.onDidHeightChange = this._onDidHeightChange.event; + this.contextViewProvider = contextViewProvider; + this.options = options2; + this.message = null; + this.placeholder = this.options.placeholder || ""; + this.tooltip = (_a10 = this.options.tooltip) !== null && _a10 !== void 0 ? _a10 : this.placeholder || ""; + this.ariaLabel = this.options.ariaLabel || ""; + if (this.options.validationOptions) { + this.validation = this.options.validationOptions.validation; + } + this.element = append(container, $5(".monaco-inputbox.idle")); + const tagName = this.options.flexibleHeight ? "textarea" : "input"; + const wrapper = append(this.element, $5(".ibwrapper")); + this.input = append(wrapper, $5(tagName + ".input.empty")); + this.input.setAttribute("autocorrect", "off"); + this.input.setAttribute("autocapitalize", "off"); + this.input.setAttribute("spellcheck", "false"); + this.onfocus(this.input, () => this.element.classList.add("synthetic-focus")); + this.onblur(this.input, () => this.element.classList.remove("synthetic-focus")); + if (this.options.flexibleHeight) { + this.maxHeight = typeof this.options.flexibleMaxHeight === "number" ? this.options.flexibleMaxHeight : Number.POSITIVE_INFINITY; + this.mirror = append(wrapper, $5("div.mirror")); + this.mirror.innerText = "\xA0"; + this.scrollableElement = new ScrollableElement(this.element, { + vertical: 1 + /* ScrollbarVisibility.Auto */ + }); + if (this.options.flexibleWidth) { + this.input.setAttribute("wrap", "off"); + this.mirror.style.whiteSpace = "pre"; + this.mirror.style.wordWrap = "initial"; + } + append(container, this.scrollableElement.getDomNode()); + this._register(this.scrollableElement); + this._register(this.scrollableElement.onScroll((e) => this.input.scrollTop = e.scrollTop)); + const onSelectionChange = this._register(new DomEmitter(container.ownerDocument, "selectionchange")); + const onAnchoredSelectionChange = Event.filter(onSelectionChange.event, () => { + const selection = container.ownerDocument.getSelection(); + return (selection === null || selection === void 0 ? void 0 : selection.anchorNode) === wrapper; + }); + this._register(onAnchoredSelectionChange(this.updateScrollDimensions, this)); + this._register(this.onDidHeightChange(this.updateScrollDimensions, this)); + } else { + this.input.type = this.options.type || "text"; + this.input.setAttribute("wrap", "off"); + } + if (this.ariaLabel) { + this.input.setAttribute("aria-label", this.ariaLabel); + } + if (this.placeholder && !this.options.showPlaceholderOnFocus) { + this.setPlaceHolder(this.placeholder); + } + if (this.tooltip) { + this.setTooltip(this.tooltip); + } + this.oninput(this.input, () => this.onValueChange()); + this.onblur(this.input, () => this.onBlur()); + this.onfocus(this.input, () => this.onFocus()); + this._register(this.ignoreGesture(this.input)); + setTimeout(() => this.updateMirror(), 0); + if (this.options.actions) { + this.actionbar = this._register(new ActionBar(this.element)); + this.actionbar.push(this.options.actions, { icon: true, label: false }); + } + this.applyStyles(); + } + onBlur() { + this._hideMessage(); + if (this.options.showPlaceholderOnFocus) { + this.input.setAttribute("placeholder", ""); + } + } + onFocus() { + this._showMessage(); + if (this.options.showPlaceholderOnFocus) { + this.input.setAttribute("placeholder", this.placeholder || ""); + } + } + setPlaceHolder(placeHolder) { + this.placeholder = placeHolder; + this.input.setAttribute("placeholder", placeHolder); + } + setTooltip(tooltip) { + this.tooltip = tooltip; + if (!this.hover) { + this.hover = this._register(getBaseLayerHoverDelegate().setupUpdatableHover(getDefaultHoverDelegate("mouse"), this.input, tooltip)); + } else { + this.hover.update(tooltip); + } + } + get inputElement() { + return this.input; + } + get value() { + return this.input.value; + } + set value(newValue) { + if (this.input.value !== newValue) { + this.input.value = newValue; + this.onValueChange(); + } + } + get height() { + return typeof this.cachedHeight === "number" ? this.cachedHeight : getTotalHeight(this.element); + } + focus() { + this.input.focus(); + } + blur() { + this.input.blur(); + } + hasFocus() { + return isActiveElement(this.input); + } + select(range2 = null) { + this.input.select(); + if (range2) { + this.input.setSelectionRange(range2.start, range2.end); + if (range2.end === this.input.value.length) { + this.input.scrollLeft = this.input.scrollWidth; + } + } + } + isSelectionAtEnd() { + return this.input.selectionEnd === this.input.value.length && this.input.selectionStart === this.input.selectionEnd; + } + getSelection() { + var _a10; + const selectionStart = this.input.selectionStart; + if (selectionStart === null) { + return null; + } + const selectionEnd = (_a10 = this.input.selectionEnd) !== null && _a10 !== void 0 ? _a10 : selectionStart; + return { + start: selectionStart, + end: selectionEnd + }; + } + enable() { + this.input.removeAttribute("disabled"); + } + disable() { + this.blur(); + this.input.disabled = true; + this._hideMessage(); + } + set paddingRight(paddingRight) { + this.input.style.width = `calc(100% - ${paddingRight}px)`; + if (this.mirror) { + this.mirror.style.paddingRight = paddingRight + "px"; + } + } + updateScrollDimensions() { + if (typeof this.cachedContentHeight !== "number" || typeof this.cachedHeight !== "number" || !this.scrollableElement) { + return; + } + const scrollHeight = this.cachedContentHeight; + const height = this.cachedHeight; + const scrollTop = this.input.scrollTop; + this.scrollableElement.setScrollDimensions({ scrollHeight, height }); + this.scrollableElement.setScrollPosition({ scrollTop }); + } + showMessage(message, force) { + if (this.state === "open" && equals2(this.message, message)) { + return; + } + this.message = message; + this.element.classList.remove("idle"); + this.element.classList.remove("info"); + this.element.classList.remove("warning"); + this.element.classList.remove("error"); + this.element.classList.add(this.classForType(message.type)); + const styles = this.stylesForType(this.message.type); + this.element.style.border = `1px solid ${asCssValueWithDefault(styles.border, "transparent")}`; + if (this.message.content && (this.hasFocus() || force)) { + this._showMessage(); + } + } + hideMessage() { + this.message = null; + this.element.classList.remove("info"); + this.element.classList.remove("warning"); + this.element.classList.remove("error"); + this.element.classList.add("idle"); + this._hideMessage(); + this.applyStyles(); + } + validate() { + let errorMsg = null; + if (this.validation) { + errorMsg = this.validation(this.value); + if (errorMsg) { + this.inputElement.setAttribute("aria-invalid", "true"); + this.showMessage(errorMsg); + } else if (this.inputElement.hasAttribute("aria-invalid")) { + this.inputElement.removeAttribute("aria-invalid"); + this.hideMessage(); + } + } + return errorMsg === null || errorMsg === void 0 ? void 0 : errorMsg.type; + } + stylesForType(type) { + const styles = this.options.inputBoxStyles; + switch (type) { + case 1: + return { border: styles.inputValidationInfoBorder, background: styles.inputValidationInfoBackground, foreground: styles.inputValidationInfoForeground }; + case 2: + return { border: styles.inputValidationWarningBorder, background: styles.inputValidationWarningBackground, foreground: styles.inputValidationWarningForeground }; + default: + return { border: styles.inputValidationErrorBorder, background: styles.inputValidationErrorBackground, foreground: styles.inputValidationErrorForeground }; + } + } + classForType(type) { + switch (type) { + case 1: + return "info"; + case 2: + return "warning"; + default: + return "error"; + } + } + _showMessage() { + if (!this.contextViewProvider || !this.message) { + return; + } + let div; + const layout2 = () => div.style.width = getTotalWidth(this.element) + "px"; + this.contextViewProvider.showContextView({ + getAnchor: () => this.element, + anchorAlignment: 1, + render: (container) => { + var _a10, _b4; + if (!this.message) { + return null; + } + div = append(container, $5(".monaco-inputbox-container")); + layout2(); + const renderOptions = { + inline: true, + className: "monaco-inputbox-message" + }; + const spanElement = this.message.formatContent ? renderFormattedText(this.message.content, renderOptions) : renderText(this.message.content, renderOptions); + spanElement.classList.add(this.classForType(this.message.type)); + const styles = this.stylesForType(this.message.type); + spanElement.style.backgroundColor = (_a10 = styles.background) !== null && _a10 !== void 0 ? _a10 : ""; + spanElement.style.color = (_b4 = styles.foreground) !== null && _b4 !== void 0 ? _b4 : ""; + spanElement.style.border = styles.border ? `1px solid ${styles.border}` : ""; + append(div, spanElement); + return null; + }, + onHide: () => { + this.state = "closed"; + }, + layout: layout2 + }); + let alertText; + if (this.message.type === 3) { + alertText = localize("alertErrorMessage", "Error: {0}", this.message.content); + } else if (this.message.type === 2) { + alertText = localize("alertWarningMessage", "Warning: {0}", this.message.content); + } else { + alertText = localize("alertInfoMessage", "Info: {0}", this.message.content); + } + alert(alertText); + this.state = "open"; + } + _hideMessage() { + if (!this.contextViewProvider) { + return; + } + if (this.state === "open") { + this.contextViewProvider.hideContextView(); + } + this.state = "idle"; + } + onValueChange() { + this._onDidChange.fire(this.value); + this.validate(); + this.updateMirror(); + this.input.classList.toggle("empty", !this.value); + if (this.state === "open" && this.contextViewProvider) { + this.contextViewProvider.layout(); + } + } + updateMirror() { + if (!this.mirror) { + return; + } + const value = this.value; + const lastCharCode = value.charCodeAt(value.length - 1); + const suffix = lastCharCode === 10 ? " " : ""; + const mirrorTextContent = (value + suffix).replace(/\u000c/g, ""); + if (mirrorTextContent) { + this.mirror.textContent = value + suffix; + } else { + this.mirror.innerText = "\xA0"; + } + this.layout(); + } + applyStyles() { + var _a10, _b4, _c2; + const styles = this.options.inputBoxStyles; + const background = (_a10 = styles.inputBackground) !== null && _a10 !== void 0 ? _a10 : ""; + const foreground2 = (_b4 = styles.inputForeground) !== null && _b4 !== void 0 ? _b4 : ""; + const border = (_c2 = styles.inputBorder) !== null && _c2 !== void 0 ? _c2 : ""; + this.element.style.backgroundColor = background; + this.element.style.color = foreground2; + this.input.style.backgroundColor = "inherit"; + this.input.style.color = foreground2; + this.element.style.border = `1px solid ${asCssValueWithDefault(border, "transparent")}`; + } + layout() { + if (!this.mirror) { + return; + } + const previousHeight = this.cachedContentHeight; + this.cachedContentHeight = getTotalHeight(this.mirror); + if (previousHeight !== this.cachedContentHeight) { + this.cachedHeight = Math.min(this.cachedContentHeight, this.maxHeight); + this.input.style.height = this.cachedHeight + "px"; + this._onDidHeightChange.fire(this.cachedContentHeight); + } + } + insertAtCursor(text2) { + const inputElement = this.inputElement; + const start = inputElement.selectionStart; + const end = inputElement.selectionEnd; + const content = inputElement.value; + if (start !== null && end !== null) { + this.value = content.substr(0, start) + text2 + content.substr(end); + inputElement.setSelectionRange(start + 1, start + 1); + this.layout(); + } + } + dispose() { + var _a10; + this._hideMessage(); + this.message = null; + (_a10 = this.actionbar) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + super.dispose(); + } + }; + HistoryInputBox = class extends InputBox2 { + constructor(container, contextViewProvider, options2) { + const NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_NO_PARENS = localize({ + key: "history.inputbox.hint.suffix.noparens", + comment: ['Text is the suffix of an input field placeholder coming after the action the input field performs, this will be used when the input field ends in a closing parenthesis ")", for example "Filter (e.g. text, !exclude)". The character inserted into the final string is \u21C5 to represent the up and down arrow keys.'] + }, " or {0} for history", `\u21C5`); + const NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_IN_PARENS = localize({ + key: "history.inputbox.hint.suffix.inparens", + comment: ['Text is the suffix of an input field placeholder coming after the action the input field performs, this will be used when the input field does NOT end in a closing parenthesis (eg. "Find"). The character inserted into the final string is \u21C5 to represent the up and down arrow keys.'] + }, " ({0} for history)", `\u21C5`); + super(container, contextViewProvider, options2); + this._onDidFocus = this._register(new Emitter()); + this.onDidFocus = this._onDidFocus.event; + this._onDidBlur = this._register(new Emitter()); + this.onDidBlur = this._onDidBlur.event; + this.history = new HistoryNavigator(options2.history, 100); + const addSuffix = () => { + if (options2.showHistoryHint && options2.showHistoryHint() && !this.placeholder.endsWith(NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_NO_PARENS) && !this.placeholder.endsWith(NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_IN_PARENS) && this.history.getHistory().length) { + const suffix = this.placeholder.endsWith(")") ? NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_NO_PARENS : NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_IN_PARENS; + const suffixedPlaceholder = this.placeholder + suffix; + if (options2.showPlaceholderOnFocus && !isActiveElement(this.input)) { + this.placeholder = suffixedPlaceholder; + } else { + this.setPlaceHolder(suffixedPlaceholder); + } + } + }; + this.observer = new MutationObserver((mutationList, observer) => { + mutationList.forEach((mutation) => { + if (!mutation.target.textContent) { + addSuffix(); + } + }); + }); + this.observer.observe(this.input, { attributeFilter: ["class"] }); + this.onfocus(this.input, () => addSuffix()); + this.onblur(this.input, () => { + const resetPlaceholder = (historyHint) => { + if (!this.placeholder.endsWith(historyHint)) { + return false; + } else { + const revertedPlaceholder = this.placeholder.slice(0, this.placeholder.length - historyHint.length); + if (options2.showPlaceholderOnFocus) { + this.placeholder = revertedPlaceholder; + } else { + this.setPlaceHolder(revertedPlaceholder); + } + return true; + } + }; + if (!resetPlaceholder(NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_IN_PARENS)) { + resetPlaceholder(NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_NO_PARENS); + } + }); + } + dispose() { + super.dispose(); + if (this.observer) { + this.observer.disconnect(); + this.observer = void 0; + } + } + addToHistory(always) { + if (this.value && (always || this.value !== this.getCurrentValue())) { + this.history.add(this.value); + } + } + isAtLastInHistory() { + return this.history.isLast(); + } + isNowhereInHistory() { + return this.history.isNowhere(); + } + showNextValue() { + if (!this.history.has(this.value)) { + this.addToHistory(); + } + let next = this.getNextValue(); + if (next) { + next = next === this.value ? this.getNextValue() : next; + } + this.value = next !== null && next !== void 0 ? next : ""; + status(this.value ? this.value : localize("clearedInput", "Cleared Input")); + } + showPreviousValue() { + if (!this.history.has(this.value)) { + this.addToHistory(); + } + let previous = this.getPreviousValue(); + if (previous) { + previous = previous === this.value ? this.getPreviousValue() : previous; + } + if (previous) { + this.value = previous; + status(this.value); + } + } + setPlaceHolder(placeHolder) { + super.setPlaceHolder(placeHolder); + this.setTooltip(placeHolder); + } + onBlur() { + super.onBlur(); + this._onDidBlur.fire(); + } + onFocus() { + super.onFocus(); + this._onDidFocus.fire(); + } + getCurrentValue() { + let currentValue = this.history.current(); + if (!currentValue) { + currentValue = this.history.last(); + this.history.next(); + } + return currentValue; + } + getPreviousValue() { + return this.history.previous() || this.history.first(); + } + getNextValue() { + return this.history.next(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/findinput/findInput.css +var init_findInput = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/findinput/findInput.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/findinput/findInput.js +var NLS_DEFAULT_LABEL, FindInput; +var init_findInput2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/findinput/findInput.js"() { + init_dom(); + init_findInputToggles(); + init_inputBox2(); + init_widget(); + init_event(); + init_findInput(); + init_nls(); + init_lifecycle(); + init_hoverDelegateFactory(); + NLS_DEFAULT_LABEL = localize("defaultLabel", "input"); + FindInput = class extends Widget { + constructor(parent, contextViewProvider, options2) { + super(); + this.fixFocusOnOptionClickEnabled = true; + this.imeSessionInProgress = false; + this.additionalTogglesDisposables = this._register(new MutableDisposable()); + this.additionalToggles = []; + this._onDidOptionChange = this._register(new Emitter()); + this.onDidOptionChange = this._onDidOptionChange.event; + this._onKeyDown = this._register(new Emitter()); + this.onKeyDown = this._onKeyDown.event; + this._onMouseDown = this._register(new Emitter()); + this.onMouseDown = this._onMouseDown.event; + this._onInput = this._register(new Emitter()); + this._onKeyUp = this._register(new Emitter()); + this._onCaseSensitiveKeyDown = this._register(new Emitter()); + this.onCaseSensitiveKeyDown = this._onCaseSensitiveKeyDown.event; + this._onRegexKeyDown = this._register(new Emitter()); + this.onRegexKeyDown = this._onRegexKeyDown.event; + this._lastHighlightFindOptions = 0; + this.placeholder = options2.placeholder || ""; + this.validation = options2.validation; + this.label = options2.label || NLS_DEFAULT_LABEL; + this.showCommonFindToggles = !!options2.showCommonFindToggles; + const appendCaseSensitiveLabel = options2.appendCaseSensitiveLabel || ""; + const appendWholeWordsLabel = options2.appendWholeWordsLabel || ""; + const appendRegexLabel = options2.appendRegexLabel || ""; + const history = options2.history || []; + const flexibleHeight = !!options2.flexibleHeight; + const flexibleWidth = !!options2.flexibleWidth; + const flexibleMaxHeight = options2.flexibleMaxHeight; + this.domNode = document.createElement("div"); + this.domNode.classList.add("monaco-findInput"); + this.inputBox = this._register(new HistoryInputBox(this.domNode, contextViewProvider, { + placeholder: this.placeholder || "", + ariaLabel: this.label || "", + validationOptions: { + validation: this.validation + }, + history, + showHistoryHint: options2.showHistoryHint, + flexibleHeight, + flexibleWidth, + flexibleMaxHeight, + inputBoxStyles: options2.inputBoxStyles + })); + const hoverDelegate = this._register(createInstantHoverDelegate()); + if (this.showCommonFindToggles) { + this.regex = this._register(new RegexToggle(__spreadValues({ + appendTitle: appendRegexLabel, + isChecked: false, + hoverDelegate + }, options2.toggleStyles))); + this._register(this.regex.onChange((viaKeyboard) => { + this._onDidOptionChange.fire(viaKeyboard); + if (!viaKeyboard && this.fixFocusOnOptionClickEnabled) { + this.inputBox.focus(); + } + this.validate(); + })); + this._register(this.regex.onKeyDown((e) => { + this._onRegexKeyDown.fire(e); + })); + this.wholeWords = this._register(new WholeWordsToggle(__spreadValues({ + appendTitle: appendWholeWordsLabel, + isChecked: false, + hoverDelegate + }, options2.toggleStyles))); + this._register(this.wholeWords.onChange((viaKeyboard) => { + this._onDidOptionChange.fire(viaKeyboard); + if (!viaKeyboard && this.fixFocusOnOptionClickEnabled) { + this.inputBox.focus(); + } + this.validate(); + })); + this.caseSensitive = this._register(new CaseSensitiveToggle(__spreadValues({ + appendTitle: appendCaseSensitiveLabel, + isChecked: false, + hoverDelegate + }, options2.toggleStyles))); + this._register(this.caseSensitive.onChange((viaKeyboard) => { + this._onDidOptionChange.fire(viaKeyboard); + if (!viaKeyboard && this.fixFocusOnOptionClickEnabled) { + this.inputBox.focus(); + } + this.validate(); + })); + this._register(this.caseSensitive.onKeyDown((e) => { + this._onCaseSensitiveKeyDown.fire(e); + })); + const indexes = [this.caseSensitive.domNode, this.wholeWords.domNode, this.regex.domNode]; + this.onkeydown(this.domNode, (event) => { + if (event.equals( + 15 + /* KeyCode.LeftArrow */ + ) || event.equals( + 17 + /* KeyCode.RightArrow */ + ) || event.equals( + 9 + /* KeyCode.Escape */ + )) { + const index = indexes.indexOf(this.domNode.ownerDocument.activeElement); + if (index >= 0) { + let newIndex = -1; + if (event.equals( + 17 + /* KeyCode.RightArrow */ + )) { + newIndex = (index + 1) % indexes.length; + } else if (event.equals( + 15 + /* KeyCode.LeftArrow */ + )) { + if (index === 0) { + newIndex = indexes.length - 1; + } else { + newIndex = index - 1; + } + } + if (event.equals( + 9 + /* KeyCode.Escape */ + )) { + indexes[index].blur(); + this.inputBox.focus(); + } else if (newIndex >= 0) { + indexes[newIndex].focus(); + } + EventHelper.stop(event, true); + } + } + }); + } + this.controls = document.createElement("div"); + this.controls.className = "controls"; + this.controls.style.display = this.showCommonFindToggles ? "" : "none"; + if (this.caseSensitive) { + this.controls.append(this.caseSensitive.domNode); + } + if (this.wholeWords) { + this.controls.appendChild(this.wholeWords.domNode); + } + if (this.regex) { + this.controls.appendChild(this.regex.domNode); + } + this.setAdditionalToggles(options2 === null || options2 === void 0 ? void 0 : options2.additionalToggles); + if (this.controls) { + this.domNode.appendChild(this.controls); + } + parent === null || parent === void 0 ? void 0 : parent.appendChild(this.domNode); + this._register(addDisposableListener(this.inputBox.inputElement, "compositionstart", (e) => { + this.imeSessionInProgress = true; + })); + this._register(addDisposableListener(this.inputBox.inputElement, "compositionend", (e) => { + this.imeSessionInProgress = false; + this._onInput.fire(); + })); + this.onkeydown(this.inputBox.inputElement, (e) => this._onKeyDown.fire(e)); + this.onkeyup(this.inputBox.inputElement, (e) => this._onKeyUp.fire(e)); + this.oninput(this.inputBox.inputElement, (e) => this._onInput.fire()); + this.onmousedown(this.inputBox.inputElement, (e) => this._onMouseDown.fire(e)); + } + get onDidChange() { + return this.inputBox.onDidChange; + } + layout(style) { + this.inputBox.layout(); + this.updateInputBoxPadding(style.collapsedFindWidget); + } + enable() { + var _a10, _b4, _c2; + this.domNode.classList.remove("disabled"); + this.inputBox.enable(); + (_a10 = this.regex) === null || _a10 === void 0 ? void 0 : _a10.enable(); + (_b4 = this.wholeWords) === null || _b4 === void 0 ? void 0 : _b4.enable(); + (_c2 = this.caseSensitive) === null || _c2 === void 0 ? void 0 : _c2.enable(); + for (const toggle of this.additionalToggles) { + toggle.enable(); + } + } + disable() { + var _a10, _b4, _c2; + this.domNode.classList.add("disabled"); + this.inputBox.disable(); + (_a10 = this.regex) === null || _a10 === void 0 ? void 0 : _a10.disable(); + (_b4 = this.wholeWords) === null || _b4 === void 0 ? void 0 : _b4.disable(); + (_c2 = this.caseSensitive) === null || _c2 === void 0 ? void 0 : _c2.disable(); + for (const toggle of this.additionalToggles) { + toggle.disable(); + } + } + setFocusInputOnOptionClick(value) { + this.fixFocusOnOptionClickEnabled = value; + } + setEnabled(enabled) { + if (enabled) { + this.enable(); + } else { + this.disable(); + } + } + setAdditionalToggles(toggles) { + for (const currentToggle of this.additionalToggles) { + currentToggle.domNode.remove(); + } + this.additionalToggles = []; + this.additionalTogglesDisposables.value = new DisposableStore(); + for (const toggle of toggles !== null && toggles !== void 0 ? toggles : []) { + this.additionalTogglesDisposables.value.add(toggle); + this.controls.appendChild(toggle.domNode); + this.additionalTogglesDisposables.value.add(toggle.onChange((viaKeyboard) => { + this._onDidOptionChange.fire(viaKeyboard); + if (!viaKeyboard && this.fixFocusOnOptionClickEnabled) { + this.inputBox.focus(); + } + })); + this.additionalToggles.push(toggle); + } + if (this.additionalToggles.length > 0) { + this.controls.style.display = ""; + } + this.updateInputBoxPadding(); + } + updateInputBoxPadding(controlsHidden = false) { + var _a10, _b4, _c2, _d2, _e2, _f3; + if (controlsHidden) { + this.inputBox.paddingRight = 0; + } else { + this.inputBox.paddingRight = ((_b4 = (_a10 = this.caseSensitive) === null || _a10 === void 0 ? void 0 : _a10.width()) !== null && _b4 !== void 0 ? _b4 : 0) + ((_d2 = (_c2 = this.wholeWords) === null || _c2 === void 0 ? void 0 : _c2.width()) !== null && _d2 !== void 0 ? _d2 : 0) + ((_f3 = (_e2 = this.regex) === null || _e2 === void 0 ? void 0 : _e2.width()) !== null && _f3 !== void 0 ? _f3 : 0) + this.additionalToggles.reduce((r, t4) => r + t4.width(), 0); + } + } + getValue() { + return this.inputBox.value; + } + setValue(value) { + if (this.inputBox.value !== value) { + this.inputBox.value = value; + } + } + select() { + this.inputBox.select(); + } + focus() { + this.inputBox.focus(); + } + getCaseSensitive() { + var _a10, _b4; + return (_b4 = (_a10 = this.caseSensitive) === null || _a10 === void 0 ? void 0 : _a10.checked) !== null && _b4 !== void 0 ? _b4 : false; + } + setCaseSensitive(value) { + if (this.caseSensitive) { + this.caseSensitive.checked = value; + } + } + getWholeWords() { + var _a10, _b4; + return (_b4 = (_a10 = this.wholeWords) === null || _a10 === void 0 ? void 0 : _a10.checked) !== null && _b4 !== void 0 ? _b4 : false; + } + setWholeWords(value) { + if (this.wholeWords) { + this.wholeWords.checked = value; + } + } + getRegex() { + var _a10, _b4; + return (_b4 = (_a10 = this.regex) === null || _a10 === void 0 ? void 0 : _a10.checked) !== null && _b4 !== void 0 ? _b4 : false; + } + setRegex(value) { + if (this.regex) { + this.regex.checked = value; + this.validate(); + } + } + focusOnCaseSensitive() { + var _a10; + (_a10 = this.caseSensitive) === null || _a10 === void 0 ? void 0 : _a10.focus(); + } + highlightFindOptions() { + this.domNode.classList.remove("highlight-" + this._lastHighlightFindOptions); + this._lastHighlightFindOptions = 1 - this._lastHighlightFindOptions; + this.domNode.classList.add("highlight-" + this._lastHighlightFindOptions); + } + validate() { + this.inputBox.validate(); + } + showMessage(message) { + this.inputBox.showMessage(message); + } + clearMessage() { + this.inputBox.hideMessage(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickInputBox.js +var $6, QuickInputBox; +var init_quickInputBox = __esm({ + "node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickInputBox.js"() { + init_dom(); + init_findInput2(); + init_lifecycle(); + init_severity(); + init_quickInput2(); + $6 = $; + QuickInputBox = class extends Disposable { + constructor(parent, inputBoxStyles, toggleStyles) { + super(); + this.parent = parent; + this.onKeyDown = (handler) => { + return addStandardDisposableListener(this.findInput.inputBox.inputElement, EventType.KEY_DOWN, handler); + }; + this.onDidChange = (handler) => { + return this.findInput.onDidChange(handler); + }; + this.container = append(this.parent, $6(".quick-input-box")); + this.findInput = this._register(new FindInput(this.container, void 0, { label: "", inputBoxStyles, toggleStyles })); + const input = this.findInput.inputBox.inputElement; + input.role = "combobox"; + input.ariaHasPopup = "menu"; + input.ariaAutoComplete = "list"; + input.ariaExpanded = "true"; + } + get value() { + return this.findInput.getValue(); + } + set value(value) { + this.findInput.setValue(value); + } + select(range2 = null) { + this.findInput.inputBox.select(range2); + } + getSelection() { + return this.findInput.inputBox.getSelection(); + } + isSelectionAtEnd() { + return this.findInput.inputBox.isSelectionAtEnd(); + } + get placeholder() { + return this.findInput.inputBox.inputElement.getAttribute("placeholder") || ""; + } + set placeholder(placeholder) { + this.findInput.inputBox.setPlaceHolder(placeholder); + } + get password() { + return this.findInput.inputBox.inputElement.type === "password"; + } + set password(password) { + this.findInput.inputBox.inputElement.type = password ? "password" : "text"; + } + set enabled(enabled) { + this.findInput.inputBox.inputElement.toggleAttribute("readonly", !enabled); + } + set toggles(toggles) { + this.findInput.setAdditionalToggles(toggles); + } + setAttribute(name, value) { + this.findInput.inputBox.inputElement.setAttribute(name, value); + } + showDecoration(decoration3) { + if (decoration3 === severity_default.Ignore) { + this.findInput.clearMessage(); + } else { + this.findInput.showMessage({ type: decoration3 === severity_default.Info ? 1 : decoration3 === severity_default.Warning ? 2 : 3, content: "" }); + } + } + stylesForType(decoration3) { + return this.findInput.inputBox.stylesForType( + decoration3 === severity_default.Info ? 1 : decoration3 === severity_default.Warning ? 2 : 3 + /* MessageType.ERROR */ + ); + } + setFocus() { + this.findInput.focus(); + } + layout() { + this.findInput.inputBox.layout(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/list/listPaging.js +function fromPagedListOptions(modelProvider, options2) { + return __spreadProps(__spreadValues({}, options2), { + accessibilityProvider: options2.accessibilityProvider && new PagedAccessibilityProvider(modelProvider, options2.accessibilityProvider) + }); +} +var PagedRenderer, PagedAccessibilityProvider, PagedList; +var init_listPaging = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/list/listPaging.js"() { + init_arrays(); + init_cancellation(); + init_event(); + init_lifecycle(); + init_list(); + init_listWidget(); + PagedRenderer = class { + get templateId() { + return this.renderer.templateId; + } + constructor(renderer, modelProvider) { + this.renderer = renderer; + this.modelProvider = modelProvider; + } + renderTemplate(container) { + const data = this.renderer.renderTemplate(container); + return { data, disposable: Disposable.None }; + } + renderElement(index, _, data, height) { + var _a10; + (_a10 = data.disposable) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + if (!data.data) { + return; + } + const model = this.modelProvider(); + if (model.isResolved(index)) { + return this.renderer.renderElement(model.get(index), index, data.data, height); + } + const cts = new CancellationTokenSource(); + const promise = model.resolve(index, cts.token); + data.disposable = { dispose: () => cts.cancel() }; + this.renderer.renderPlaceholder(index, data.data); + promise.then((entry) => this.renderer.renderElement(entry, index, data.data, height)); + } + disposeTemplate(data) { + if (data.disposable) { + data.disposable.dispose(); + data.disposable = void 0; + } + if (data.data) { + this.renderer.disposeTemplate(data.data); + data.data = void 0; + } + } + }; + PagedAccessibilityProvider = class { + constructor(modelProvider, accessibilityProvider) { + this.modelProvider = modelProvider; + this.accessibilityProvider = accessibilityProvider; + } + getWidgetAriaLabel() { + return this.accessibilityProvider.getWidgetAriaLabel(); + } + getAriaLabel(index) { + const model = this.modelProvider(); + if (!model.isResolved(index)) { + return null; + } + return this.accessibilityProvider.getAriaLabel(model.get(index)); + } + }; + PagedList = class { + constructor(user, container, virtualDelegate, renderers, options2 = {}) { + const modelProvider = () => this.model; + const pagedRenderers = renderers.map((r) => new PagedRenderer(r, modelProvider)); + this.list = new List(user, container, virtualDelegate, pagedRenderers, fromPagedListOptions(modelProvider, options2)); + } + updateOptions(options2) { + this.list.updateOptions(options2); + } + getHTMLElement() { + return this.list.getHTMLElement(); + } + get onDidFocus() { + return this.list.onDidFocus; + } + get widget() { + return this.list; + } + get onDidDispose() { + return this.list.onDidDispose; + } + get onMouseDblClick() { + return Event.map(this.list.onMouseDblClick, ({ element, index, browserEvent }) => ({ element: element === void 0 ? void 0 : this._model.get(element), index, browserEvent })); + } + get onPointer() { + return Event.map(this.list.onPointer, ({ element, index, browserEvent }) => ({ element: element === void 0 ? void 0 : this._model.get(element), index, browserEvent })); + } + get onDidChangeSelection() { + return Event.map(this.list.onDidChangeSelection, ({ elements, indexes, browserEvent }) => ({ elements: elements.map((e) => this._model.get(e)), indexes, browserEvent })); + } + get model() { + return this._model; + } + set model(model) { + this._model = model; + this.list.splice(0, this.list.length, range(model.length)); + } + getFocus() { + return this.list.getFocus(); + } + getSelection() { + return this.list.getSelection(); + } + getSelectedElements() { + return this.getSelection().map((i) => this.model.get(i)); + } + style(styles) { + this.list.style(styles); + } + dispose() { + this.list.dispose(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/sash/sash.css +var init_sash = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/sash/sash.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/sash/sash.js +var __decorate36, DEBUG2, OrthogonalEdge, globalSize, onDidChangeGlobalSize, globalHoverDelay, onDidChangeHoverDelay, MouseEventFactory, GestureEventFactory, OrthogonalPointerEventFactory, PointerEventsDisabledCssClass, Sash; +var init_sash2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/sash/sash.js"() { + init_dom(); + init_event2(); + init_touch(); + init_async(); + init_decorators(); + init_event(); + init_lifecycle(); + init_platform(); + init_sash(); + __decorate36 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + DEBUG2 = false; + (function(OrthogonalEdge2) { + OrthogonalEdge2["North"] = "north"; + OrthogonalEdge2["South"] = "south"; + OrthogonalEdge2["East"] = "east"; + OrthogonalEdge2["West"] = "west"; + })(OrthogonalEdge || (OrthogonalEdge = {})); + globalSize = 4; + onDidChangeGlobalSize = new Emitter(); + globalHoverDelay = 300; + onDidChangeHoverDelay = new Emitter(); + MouseEventFactory = class { + constructor(el) { + this.el = el; + this.disposables = new DisposableStore(); + } + get onPointerMove() { + return this.disposables.add(new DomEmitter(getWindow(this.el), "mousemove")).event; + } + get onPointerUp() { + return this.disposables.add(new DomEmitter(getWindow(this.el), "mouseup")).event; + } + dispose() { + this.disposables.dispose(); + } + }; + __decorate36([ + memoize + ], MouseEventFactory.prototype, "onPointerMove", null); + __decorate36([ + memoize + ], MouseEventFactory.prototype, "onPointerUp", null); + GestureEventFactory = class { + get onPointerMove() { + return this.disposables.add(new DomEmitter(this.el, EventType2.Change)).event; + } + get onPointerUp() { + return this.disposables.add(new DomEmitter(this.el, EventType2.End)).event; + } + constructor(el) { + this.el = el; + this.disposables = new DisposableStore(); + } + dispose() { + this.disposables.dispose(); + } + }; + __decorate36([ + memoize + ], GestureEventFactory.prototype, "onPointerMove", null); + __decorate36([ + memoize + ], GestureEventFactory.prototype, "onPointerUp", null); + OrthogonalPointerEventFactory = class { + get onPointerMove() { + return this.factory.onPointerMove; + } + get onPointerUp() { + return this.factory.onPointerUp; + } + constructor(factory) { + this.factory = factory; + } + dispose() { + } + }; + __decorate36([ + memoize + ], OrthogonalPointerEventFactory.prototype, "onPointerMove", null); + __decorate36([ + memoize + ], OrthogonalPointerEventFactory.prototype, "onPointerUp", null); + PointerEventsDisabledCssClass = "pointer-events-disabled"; + Sash = class _Sash extends Disposable { + get state() { + return this._state; + } + get orthogonalStartSash() { + return this._orthogonalStartSash; + } + get orthogonalEndSash() { + return this._orthogonalEndSash; + } + /** + * The state of a sash defines whether it can be interacted with by the user + * as well as what mouse cursor to use, when hovered. + */ + set state(state) { + if (this._state === state) { + return; + } + this.el.classList.toggle( + "disabled", + state === 0 + /* SashState.Disabled */ + ); + this.el.classList.toggle( + "minimum", + state === 1 + /* SashState.AtMinimum */ + ); + this.el.classList.toggle( + "maximum", + state === 2 + /* SashState.AtMaximum */ + ); + this._state = state; + this.onDidEnablementChange.fire(state); + } + /** + * A reference to another sash, perpendicular to this one, which + * aligns at the start of this one. A corner sash will be created + * automatically at that location. + * + * The start of a horizontal sash is its left-most position. + * The start of a vertical sash is its top-most position. + */ + set orthogonalStartSash(sash) { + if (this._orthogonalStartSash === sash) { + return; + } + this.orthogonalStartDragHandleDisposables.clear(); + this.orthogonalStartSashDisposables.clear(); + if (sash) { + const onChange = (state) => { + this.orthogonalStartDragHandleDisposables.clear(); + if (state !== 0) { + this._orthogonalStartDragHandle = append(this.el, $(".orthogonal-drag-handle.start")); + this.orthogonalStartDragHandleDisposables.add(toDisposable(() => this._orthogonalStartDragHandle.remove())); + this.orthogonalStartDragHandleDisposables.add(new DomEmitter(this._orthogonalStartDragHandle, "mouseenter")).event(() => _Sash.onMouseEnter(sash), void 0, this.orthogonalStartDragHandleDisposables); + this.orthogonalStartDragHandleDisposables.add(new DomEmitter(this._orthogonalStartDragHandle, "mouseleave")).event(() => _Sash.onMouseLeave(sash), void 0, this.orthogonalStartDragHandleDisposables); + } + }; + this.orthogonalStartSashDisposables.add(sash.onDidEnablementChange.event(onChange, this)); + onChange(sash.state); + } + this._orthogonalStartSash = sash; + } + /** + * A reference to another sash, perpendicular to this one, which + * aligns at the end of this one. A corner sash will be created + * automatically at that location. + * + * The end of a horizontal sash is its right-most position. + * The end of a vertical sash is its bottom-most position. + */ + set orthogonalEndSash(sash) { + if (this._orthogonalEndSash === sash) { + return; + } + this.orthogonalEndDragHandleDisposables.clear(); + this.orthogonalEndSashDisposables.clear(); + if (sash) { + const onChange = (state) => { + this.orthogonalEndDragHandleDisposables.clear(); + if (state !== 0) { + this._orthogonalEndDragHandle = append(this.el, $(".orthogonal-drag-handle.end")); + this.orthogonalEndDragHandleDisposables.add(toDisposable(() => this._orthogonalEndDragHandle.remove())); + this.orthogonalEndDragHandleDisposables.add(new DomEmitter(this._orthogonalEndDragHandle, "mouseenter")).event(() => _Sash.onMouseEnter(sash), void 0, this.orthogonalEndDragHandleDisposables); + this.orthogonalEndDragHandleDisposables.add(new DomEmitter(this._orthogonalEndDragHandle, "mouseleave")).event(() => _Sash.onMouseLeave(sash), void 0, this.orthogonalEndDragHandleDisposables); + } + }; + this.orthogonalEndSashDisposables.add(sash.onDidEnablementChange.event(onChange, this)); + onChange(sash.state); + } + this._orthogonalEndSash = sash; + } + constructor(container, layoutProvider, options2) { + super(); + this.hoverDelay = globalHoverDelay; + this.hoverDelayer = this._register(new Delayer(this.hoverDelay)); + this._state = 3; + this.onDidEnablementChange = this._register(new Emitter()); + this._onDidStart = this._register(new Emitter()); + this._onDidChange = this._register(new Emitter()); + this._onDidReset = this._register(new Emitter()); + this._onDidEnd = this._register(new Emitter()); + this.orthogonalStartSashDisposables = this._register(new DisposableStore()); + this.orthogonalStartDragHandleDisposables = this._register(new DisposableStore()); + this.orthogonalEndSashDisposables = this._register(new DisposableStore()); + this.orthogonalEndDragHandleDisposables = this._register(new DisposableStore()); + this.onDidStart = this._onDidStart.event; + this.onDidChange = this._onDidChange.event; + this.onDidReset = this._onDidReset.event; + this.onDidEnd = this._onDidEnd.event; + this.linkedSash = void 0; + this.el = append(container, $(".monaco-sash")); + if (options2.orthogonalEdge) { + this.el.classList.add(`orthogonal-edge-${options2.orthogonalEdge}`); + } + if (isMacintosh) { + this.el.classList.add("mac"); + } + const onMouseDown = this._register(new DomEmitter(this.el, "mousedown")).event; + this._register(onMouseDown((e) => this.onPointerStart(e, new MouseEventFactory(container)), this)); + const onMouseDoubleClick = this._register(new DomEmitter(this.el, "dblclick")).event; + this._register(onMouseDoubleClick(this.onPointerDoublePress, this)); + const onMouseEnter = this._register(new DomEmitter(this.el, "mouseenter")).event; + this._register(onMouseEnter(() => _Sash.onMouseEnter(this))); + const onMouseLeave = this._register(new DomEmitter(this.el, "mouseleave")).event; + this._register(onMouseLeave(() => _Sash.onMouseLeave(this))); + this._register(Gesture.addTarget(this.el)); + const onTouchStart = this._register(new DomEmitter(this.el, EventType2.Start)).event; + this._register(onTouchStart((e) => this.onPointerStart(e, new GestureEventFactory(this.el)), this)); + const onTap = this._register(new DomEmitter(this.el, EventType2.Tap)).event; + let doubleTapTimeout = void 0; + this._register(onTap((event) => { + if (doubleTapTimeout) { + clearTimeout(doubleTapTimeout); + doubleTapTimeout = void 0; + this.onPointerDoublePress(event); + return; + } + clearTimeout(doubleTapTimeout); + doubleTapTimeout = setTimeout(() => doubleTapTimeout = void 0, 250); + }, this)); + if (typeof options2.size === "number") { + this.size = options2.size; + if (options2.orientation === 0) { + this.el.style.width = `${this.size}px`; + } else { + this.el.style.height = `${this.size}px`; + } + } else { + this.size = globalSize; + this._register(onDidChangeGlobalSize.event((size2) => { + this.size = size2; + this.layout(); + })); + } + this._register(onDidChangeHoverDelay.event((delay) => this.hoverDelay = delay)); + this.layoutProvider = layoutProvider; + this.orthogonalStartSash = options2.orthogonalStartSash; + this.orthogonalEndSash = options2.orthogonalEndSash; + this.orientation = options2.orientation || 0; + if (this.orientation === 1) { + this.el.classList.add("horizontal"); + this.el.classList.remove("vertical"); + } else { + this.el.classList.remove("horizontal"); + this.el.classList.add("vertical"); + } + this.el.classList.toggle("debug", DEBUG2); + this.layout(); + } + onPointerStart(event, pointerEventFactory) { + EventHelper.stop(event); + let isMultisashResize = false; + if (!event.__orthogonalSashEvent) { + const orthogonalSash = this.getOrthogonalSash(event); + if (orthogonalSash) { + isMultisashResize = true; + event.__orthogonalSashEvent = true; + orthogonalSash.onPointerStart(event, new OrthogonalPointerEventFactory(pointerEventFactory)); + } + } + if (this.linkedSash && !event.__linkedSashEvent) { + event.__linkedSashEvent = true; + this.linkedSash.onPointerStart(event, new OrthogonalPointerEventFactory(pointerEventFactory)); + } + if (!this.state) { + return; + } + const iframes = this.el.ownerDocument.getElementsByTagName("iframe"); + for (const iframe of iframes) { + iframe.classList.add(PointerEventsDisabledCssClass); + } + const startX = event.pageX; + const startY = event.pageY; + const altKey = event.altKey; + const startEvent = { startX, currentX: startX, startY, currentY: startY, altKey }; + this.el.classList.add("active"); + this._onDidStart.fire(startEvent); + const style = createStyleSheet(this.el); + const updateStyle = () => { + let cursor = ""; + if (isMultisashResize) { + cursor = "all-scroll"; + } else if (this.orientation === 1) { + if (this.state === 1) { + cursor = "s-resize"; + } else if (this.state === 2) { + cursor = "n-resize"; + } else { + cursor = isMacintosh ? "row-resize" : "ns-resize"; + } + } else { + if (this.state === 1) { + cursor = "e-resize"; + } else if (this.state === 2) { + cursor = "w-resize"; + } else { + cursor = isMacintosh ? "col-resize" : "ew-resize"; + } + } + style.textContent = `* { cursor: ${cursor} !important; }`; + }; + const disposables = new DisposableStore(); + updateStyle(); + if (!isMultisashResize) { + this.onDidEnablementChange.event(updateStyle, null, disposables); + } + const onPointerMove = (e) => { + EventHelper.stop(e, false); + const event2 = { startX, currentX: e.pageX, startY, currentY: e.pageY, altKey }; + this._onDidChange.fire(event2); + }; + const onPointerUp = (e) => { + EventHelper.stop(e, false); + this.el.removeChild(style); + this.el.classList.remove("active"); + this._onDidEnd.fire(); + disposables.dispose(); + for (const iframe of iframes) { + iframe.classList.remove(PointerEventsDisabledCssClass); + } + }; + pointerEventFactory.onPointerMove(onPointerMove, null, disposables); + pointerEventFactory.onPointerUp(onPointerUp, null, disposables); + disposables.add(pointerEventFactory); + } + onPointerDoublePress(e) { + const orthogonalSash = this.getOrthogonalSash(e); + if (orthogonalSash) { + orthogonalSash._onDidReset.fire(); + } + if (this.linkedSash) { + this.linkedSash._onDidReset.fire(); + } + this._onDidReset.fire(); + } + static onMouseEnter(sash, fromLinkedSash = false) { + if (sash.el.classList.contains("active")) { + sash.hoverDelayer.cancel(); + sash.el.classList.add("hover"); + } else { + sash.hoverDelayer.trigger(() => sash.el.classList.add("hover"), sash.hoverDelay).then(void 0, () => { + }); + } + if (!fromLinkedSash && sash.linkedSash) { + _Sash.onMouseEnter(sash.linkedSash, true); + } + } + static onMouseLeave(sash, fromLinkedSash = false) { + sash.hoverDelayer.cancel(); + sash.el.classList.remove("hover"); + if (!fromLinkedSash && sash.linkedSash) { + _Sash.onMouseLeave(sash.linkedSash, true); + } + } + /** + * Forcefully stop any user interactions with this sash. + * Useful when hiding a parent component, while the user is still + * interacting with the sash. + */ + clearSashHoverState() { + _Sash.onMouseLeave(this); + } + /** + * Layout the sash. The sash will size and position itself + * based on its provided {@link ISashLayoutProvider layout provider}. + */ + layout() { + if (this.orientation === 0) { + const verticalProvider = this.layoutProvider; + this.el.style.left = verticalProvider.getVerticalSashLeft(this) - this.size / 2 + "px"; + if (verticalProvider.getVerticalSashTop) { + this.el.style.top = verticalProvider.getVerticalSashTop(this) + "px"; + } + if (verticalProvider.getVerticalSashHeight) { + this.el.style.height = verticalProvider.getVerticalSashHeight(this) + "px"; + } + } else { + const horizontalProvider = this.layoutProvider; + this.el.style.top = horizontalProvider.getHorizontalSashTop(this) - this.size / 2 + "px"; + if (horizontalProvider.getHorizontalSashLeft) { + this.el.style.left = horizontalProvider.getHorizontalSashLeft(this) + "px"; + } + if (horizontalProvider.getHorizontalSashWidth) { + this.el.style.width = horizontalProvider.getHorizontalSashWidth(this) + "px"; + } + } + } + getOrthogonalSash(e) { + var _a10; + const target = (_a10 = e.initialTarget) !== null && _a10 !== void 0 ? _a10 : e.target; + if (!target || !isHTMLElement(target)) { + return void 0; + } + if (target.classList.contains("orthogonal-drag-handle")) { + return target.classList.contains("start") ? this.orthogonalStartSash : this.orthogonalEndSash; + } + return void 0; + } + dispose() { + super.dispose(); + this.el.remove(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/splitview/splitview.css +var init_splitview = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/splitview/splitview.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/splitview/splitview.js +var defaultStyles, ViewItem, VerticalViewItem, HorizontalViewItem, State, Sizing, SplitView; +var init_splitview2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/splitview/splitview.js"() { + init_dom(); + init_event2(); + init_sash2(); + init_scrollableElement(); + init_arrays(); + init_color(); + init_event(); + init_lifecycle(); + init_numbers(); + init_scrollable(); + init_types(); + init_splitview(); + defaultStyles = { + separatorBorder: Color.transparent + }; + ViewItem = class { + set size(size2) { + this._size = size2; + } + get size() { + return this._size; + } + get visible() { + return typeof this._cachedVisibleSize === "undefined"; + } + setVisible(visible, size2) { + var _a10, _b4; + if (visible === this.visible) { + return; + } + if (visible) { + this.size = clamp(this._cachedVisibleSize, this.viewMinimumSize, this.viewMaximumSize); + this._cachedVisibleSize = void 0; + } else { + this._cachedVisibleSize = typeof size2 === "number" ? size2 : this.size; + this.size = 0; + } + this.container.classList.toggle("visible", visible); + try { + (_b4 = (_a10 = this.view).setVisible) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, visible); + } catch (e) { + console.error("Splitview: Failed to set visible view"); + console.error(e); + } + } + get minimumSize() { + return this.visible ? this.view.minimumSize : 0; + } + get viewMinimumSize() { + return this.view.minimumSize; + } + get maximumSize() { + return this.visible ? this.view.maximumSize : 0; + } + get viewMaximumSize() { + return this.view.maximumSize; + } + get priority() { + return this.view.priority; + } + get proportionalLayout() { + var _a10; + return (_a10 = this.view.proportionalLayout) !== null && _a10 !== void 0 ? _a10 : true; + } + get snap() { + return !!this.view.snap; + } + set enabled(enabled) { + this.container.style.pointerEvents = enabled ? "" : "none"; + } + constructor(container, view, size2, disposable) { + this.container = container; + this.view = view; + this.disposable = disposable; + this._cachedVisibleSize = void 0; + if (typeof size2 === "number") { + this._size = size2; + this._cachedVisibleSize = void 0; + container.classList.add("visible"); + } else { + this._size = 0; + this._cachedVisibleSize = size2.cachedVisibleSize; + } + } + layout(offset, layoutContext) { + this.layoutContainer(offset); + try { + this.view.layout(this.size, offset, layoutContext); + } catch (e) { + console.error("Splitview: Failed to layout view"); + console.error(e); + } + } + dispose() { + this.disposable.dispose(); + } + }; + VerticalViewItem = class extends ViewItem { + layoutContainer(offset) { + this.container.style.top = `${offset}px`; + this.container.style.height = `${this.size}px`; + } + }; + HorizontalViewItem = class extends ViewItem { + layoutContainer(offset) { + this.container.style.left = `${offset}px`; + this.container.style.width = `${this.size}px`; + } + }; + (function(State2) { + State2[State2["Idle"] = 0] = "Idle"; + State2[State2["Busy"] = 1] = "Busy"; + })(State || (State = {})); + (function(Sizing2) { + Sizing2.Distribute = { type: "distribute" }; + function Split(index) { + return { type: "split", index }; + } + Sizing2.Split = Split; + function Auto(index) { + return { type: "auto", index }; + } + Sizing2.Auto = Auto; + function Invisible(cachedVisibleSize) { + return { type: "invisible", cachedVisibleSize }; + } + Sizing2.Invisible = Invisible; + })(Sizing || (Sizing = {})); + SplitView = class extends Disposable { + get orthogonalStartSash() { + return this._orthogonalStartSash; + } + get orthogonalEndSash() { + return this._orthogonalEndSash; + } + get startSnappingEnabled() { + return this._startSnappingEnabled; + } + get endSnappingEnabled() { + return this._endSnappingEnabled; + } + /** + * A reference to a sash, perpendicular to all sashes in this {@link SplitView}, + * located at the left- or top-most side of the SplitView. + * Corner sashes will be created automatically at the intersections. + */ + set orthogonalStartSash(sash) { + for (const sashItem of this.sashItems) { + sashItem.sash.orthogonalStartSash = sash; + } + this._orthogonalStartSash = sash; + } + /** + * A reference to a sash, perpendicular to all sashes in this {@link SplitView}, + * located at the right- or bottom-most side of the SplitView. + * Corner sashes will be created automatically at the intersections. + */ + set orthogonalEndSash(sash) { + for (const sashItem of this.sashItems) { + sashItem.sash.orthogonalEndSash = sash; + } + this._orthogonalEndSash = sash; + } + /** + * Enable/disable snapping at the beginning of this {@link SplitView}. + */ + set startSnappingEnabled(startSnappingEnabled) { + if (this._startSnappingEnabled === startSnappingEnabled) { + return; + } + this._startSnappingEnabled = startSnappingEnabled; + this.updateSashEnablement(); + } + /** + * Enable/disable snapping at the end of this {@link SplitView}. + */ + set endSnappingEnabled(endSnappingEnabled) { + if (this._endSnappingEnabled === endSnappingEnabled) { + return; + } + this._endSnappingEnabled = endSnappingEnabled; + this.updateSashEnablement(); + } + /** + * Create a new {@link SplitView} instance. + */ + constructor(container, options2 = {}) { + var _a10, _b4, _c2, _d2, _e2; + super(); + this.size = 0; + this._contentSize = 0; + this.proportions = void 0; + this.viewItems = []; + this.sashItems = []; + this.state = State.Idle; + this._onDidSashChange = this._register(new Emitter()); + this._onDidSashReset = this._register(new Emitter()); + this._startSnappingEnabled = true; + this._endSnappingEnabled = true; + this.onDidSashChange = this._onDidSashChange.event; + this.onDidSashReset = this._onDidSashReset.event; + this.orientation = (_a10 = options2.orientation) !== null && _a10 !== void 0 ? _a10 : 0; + this.inverseAltBehavior = (_b4 = options2.inverseAltBehavior) !== null && _b4 !== void 0 ? _b4 : false; + this.proportionalLayout = (_c2 = options2.proportionalLayout) !== null && _c2 !== void 0 ? _c2 : true; + this.getSashOrthogonalSize = options2.getSashOrthogonalSize; + this.el = document.createElement("div"); + this.el.classList.add("monaco-split-view2"); + this.el.classList.add(this.orientation === 0 ? "vertical" : "horizontal"); + container.appendChild(this.el); + this.sashContainer = append(this.el, $(".sash-container")); + this.viewContainer = $(".split-view-container"); + this.scrollable = this._register(new Scrollable({ + forceIntegerValues: true, + smoothScrollDuration: 125, + scheduleAtNextAnimationFrame: (callback) => scheduleAtNextAnimationFrame(getWindow(this.el), callback) + })); + this.scrollableElement = this._register(new SmoothScrollableElement(this.viewContainer, { + vertical: this.orientation === 0 ? (_d2 = options2.scrollbarVisibility) !== null && _d2 !== void 0 ? _d2 : 1 : 2, + horizontal: this.orientation === 1 ? (_e2 = options2.scrollbarVisibility) !== null && _e2 !== void 0 ? _e2 : 1 : 2 + /* ScrollbarVisibility.Hidden */ + }, this.scrollable)); + const onDidScrollViewContainer = this._register(new DomEmitter(this.viewContainer, "scroll")).event; + this._register(onDidScrollViewContainer((_) => { + const position = this.scrollableElement.getScrollPosition(); + const scrollLeft = Math.abs(this.viewContainer.scrollLeft - position.scrollLeft) <= 1 ? void 0 : this.viewContainer.scrollLeft; + const scrollTop = Math.abs(this.viewContainer.scrollTop - position.scrollTop) <= 1 ? void 0 : this.viewContainer.scrollTop; + if (scrollLeft !== void 0 || scrollTop !== void 0) { + this.scrollableElement.setScrollPosition({ scrollLeft, scrollTop }); + } + })); + this.onDidScroll = this.scrollableElement.onScroll; + this._register(this.onDidScroll((e) => { + if (e.scrollTopChanged) { + this.viewContainer.scrollTop = e.scrollTop; + } + if (e.scrollLeftChanged) { + this.viewContainer.scrollLeft = e.scrollLeft; + } + })); + append(this.el, this.scrollableElement.getDomNode()); + this.style(options2.styles || defaultStyles); + if (options2.descriptor) { + this.size = options2.descriptor.size; + options2.descriptor.views.forEach((viewDescriptor, index) => { + const sizing = isUndefined(viewDescriptor.visible) || viewDescriptor.visible ? viewDescriptor.size : { type: "invisible", cachedVisibleSize: viewDescriptor.size }; + const view = viewDescriptor.view; + this.doAddView(view, sizing, index, true); + }); + this._contentSize = this.viewItems.reduce((r, i) => r + i.size, 0); + this.saveProportions(); + } + } + style(styles) { + if (styles.separatorBorder.isTransparent()) { + this.el.classList.remove("separator-border"); + this.el.style.removeProperty("--separator-border"); + } else { + this.el.classList.add("separator-border"); + this.el.style.setProperty("--separator-border", styles.separatorBorder.toString()); + } + } + /** + * Add a {@link IView view} to this {@link SplitView}. + * + * @param view The view to add. + * @param size Either a fixed size, or a dynamic {@link Sizing} strategy. + * @param index The index to insert the view on. + * @param skipLayout Whether layout should be skipped. + */ + addView(view, size2, index = this.viewItems.length, skipLayout) { + this.doAddView(view, size2, index, skipLayout); + } + /** + * Layout the {@link SplitView}. + * + * @param size The entire size of the {@link SplitView}. + * @param layoutContext An optional layout context to pass along to {@link IView views}. + */ + layout(size2, layoutContext) { + const previousSize = Math.max(this.size, this._contentSize); + this.size = size2; + this.layoutContext = layoutContext; + if (!this.proportions) { + const indexes = range(this.viewItems.length); + const lowPriorityIndexes = indexes.filter( + (i) => this.viewItems[i].priority === 1 + /* LayoutPriority.Low */ + ); + const highPriorityIndexes = indexes.filter( + (i) => this.viewItems[i].priority === 2 + /* LayoutPriority.High */ + ); + this.resize(this.viewItems.length - 1, size2 - previousSize, void 0, lowPriorityIndexes, highPriorityIndexes); + } else { + let total = 0; + for (let i = 0; i < this.viewItems.length; i++) { + const item = this.viewItems[i]; + const proportion = this.proportions[i]; + if (typeof proportion === "number") { + total += proportion; + } else { + size2 -= item.size; + } + } + for (let i = 0; i < this.viewItems.length; i++) { + const item = this.viewItems[i]; + const proportion = this.proportions[i]; + if (typeof proportion === "number" && total > 0) { + item.size = clamp(Math.round(proportion * size2 / total), item.minimumSize, item.maximumSize); + } + } + } + this.distributeEmptySpace(); + this.layoutViews(); + } + saveProportions() { + if (this.proportionalLayout && this._contentSize > 0) { + this.proportions = this.viewItems.map((v) => v.proportionalLayout && v.visible ? v.size / this._contentSize : void 0); + } + } + onSashStart({ sash, start, alt }) { + for (const item of this.viewItems) { + item.enabled = false; + } + const index = this.sashItems.findIndex((item) => item.sash === sash); + const disposable = combinedDisposable(addDisposableListener(this.el.ownerDocument.body, "keydown", (e) => resetSashDragState(this.sashDragState.current, e.altKey)), addDisposableListener(this.el.ownerDocument.body, "keyup", () => resetSashDragState(this.sashDragState.current, false))); + const resetSashDragState = (start2, alt2) => { + const sizes = this.viewItems.map((i) => i.size); + let minDelta = Number.NEGATIVE_INFINITY; + let maxDelta = Number.POSITIVE_INFINITY; + if (this.inverseAltBehavior) { + alt2 = !alt2; + } + if (alt2) { + const isLastSash = index === this.sashItems.length - 1; + if (isLastSash) { + const viewItem = this.viewItems[index]; + minDelta = (viewItem.minimumSize - viewItem.size) / 2; + maxDelta = (viewItem.maximumSize - viewItem.size) / 2; + } else { + const viewItem = this.viewItems[index + 1]; + minDelta = (viewItem.size - viewItem.maximumSize) / 2; + maxDelta = (viewItem.size - viewItem.minimumSize) / 2; + } + } + let snapBefore; + let snapAfter; + if (!alt2) { + const upIndexes = range(index, -1); + const downIndexes = range(index + 1, this.viewItems.length); + const minDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].minimumSize - sizes[i]), 0); + const maxDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].viewMaximumSize - sizes[i]), 0); + const maxDeltaDown = downIndexes.length === 0 ? Number.POSITIVE_INFINITY : downIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].minimumSize), 0); + const minDeltaDown = downIndexes.length === 0 ? Number.NEGATIVE_INFINITY : downIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].viewMaximumSize), 0); + const minDelta2 = Math.max(minDeltaUp, minDeltaDown); + const maxDelta2 = Math.min(maxDeltaDown, maxDeltaUp); + const snapBeforeIndex = this.findFirstSnapIndex(upIndexes); + const snapAfterIndex = this.findFirstSnapIndex(downIndexes); + if (typeof snapBeforeIndex === "number") { + const viewItem = this.viewItems[snapBeforeIndex]; + const halfSize = Math.floor(viewItem.viewMinimumSize / 2); + snapBefore = { + index: snapBeforeIndex, + limitDelta: viewItem.visible ? minDelta2 - halfSize : minDelta2 + halfSize, + size: viewItem.size + }; + } + if (typeof snapAfterIndex === "number") { + const viewItem = this.viewItems[snapAfterIndex]; + const halfSize = Math.floor(viewItem.viewMinimumSize / 2); + snapAfter = { + index: snapAfterIndex, + limitDelta: viewItem.visible ? maxDelta2 + halfSize : maxDelta2 - halfSize, + size: viewItem.size + }; + } + } + this.sashDragState = { start: start2, current: start2, index, sizes, minDelta, maxDelta, alt: alt2, snapBefore, snapAfter, disposable }; + }; + resetSashDragState(start, alt); + } + onSashChange({ current }) { + const { index, start, sizes, alt, minDelta, maxDelta, snapBefore, snapAfter } = this.sashDragState; + this.sashDragState.current = current; + const delta = current - start; + const newDelta = this.resize(index, delta, sizes, void 0, void 0, minDelta, maxDelta, snapBefore, snapAfter); + if (alt) { + const isLastSash = index === this.sashItems.length - 1; + const newSizes = this.viewItems.map((i) => i.size); + const viewItemIndex = isLastSash ? index : index + 1; + const viewItem = this.viewItems[viewItemIndex]; + const newMinDelta = viewItem.size - viewItem.maximumSize; + const newMaxDelta = viewItem.size - viewItem.minimumSize; + const resizeIndex = isLastSash ? index - 1 : index + 1; + this.resize(resizeIndex, -newDelta, newSizes, void 0, void 0, newMinDelta, newMaxDelta); + } + this.distributeEmptySpace(); + this.layoutViews(); + } + onSashEnd(index) { + this._onDidSashChange.fire(index); + this.sashDragState.disposable.dispose(); + this.saveProportions(); + for (const item of this.viewItems) { + item.enabled = true; + } + } + onViewChange(item, size2) { + const index = this.viewItems.indexOf(item); + if (index < 0 || index >= this.viewItems.length) { + return; + } + size2 = typeof size2 === "number" ? size2 : item.size; + size2 = clamp(size2, item.minimumSize, item.maximumSize); + if (this.inverseAltBehavior && index > 0) { + this.resize(index - 1, Math.floor((item.size - size2) / 2)); + this.distributeEmptySpace(); + this.layoutViews(); + } else { + item.size = size2; + this.relayout([index], void 0); + } + } + /** + * Resize a {@link IView view} within the {@link SplitView}. + * + * @param index The {@link IView view} index. + * @param size The {@link IView view} size. + */ + resizeView(index, size2) { + if (index < 0 || index >= this.viewItems.length) { + return; + } + if (this.state !== State.Idle) { + throw new Error("Cant modify splitview"); + } + this.state = State.Busy; + try { + const indexes = range(this.viewItems.length).filter((i) => i !== index); + const lowPriorityIndexes = [...indexes.filter( + (i) => this.viewItems[i].priority === 1 + /* LayoutPriority.Low */ + ), index]; + const highPriorityIndexes = indexes.filter( + (i) => this.viewItems[i].priority === 2 + /* LayoutPriority.High */ + ); + const item = this.viewItems[index]; + size2 = Math.round(size2); + size2 = clamp(size2, item.minimumSize, Math.min(item.maximumSize, this.size)); + item.size = size2; + this.relayout(lowPriorityIndexes, highPriorityIndexes); + } finally { + this.state = State.Idle; + } + } + /** + * Distribute the entire {@link SplitView} size among all {@link IView views}. + */ + distributeViewSizes() { + const flexibleViewItems = []; + let flexibleSize = 0; + for (const item of this.viewItems) { + if (item.maximumSize - item.minimumSize > 0) { + flexibleViewItems.push(item); + flexibleSize += item.size; + } + } + const size2 = Math.floor(flexibleSize / flexibleViewItems.length); + for (const item of flexibleViewItems) { + item.size = clamp(size2, item.minimumSize, item.maximumSize); + } + const indexes = range(this.viewItems.length); + const lowPriorityIndexes = indexes.filter( + (i) => this.viewItems[i].priority === 1 + /* LayoutPriority.Low */ + ); + const highPriorityIndexes = indexes.filter( + (i) => this.viewItems[i].priority === 2 + /* LayoutPriority.High */ + ); + this.relayout(lowPriorityIndexes, highPriorityIndexes); + } + /** + * Returns the size of a {@link IView view}. + */ + getViewSize(index) { + if (index < 0 || index >= this.viewItems.length) { + return -1; + } + return this.viewItems[index].size; + } + doAddView(view, size2, index = this.viewItems.length, skipLayout) { + if (this.state !== State.Idle) { + throw new Error("Cant modify splitview"); + } + this.state = State.Busy; + try { + const container = $(".split-view-view"); + if (index === this.viewItems.length) { + this.viewContainer.appendChild(container); + } else { + this.viewContainer.insertBefore(container, this.viewContainer.children.item(index)); + } + const onChangeDisposable = view.onDidChange((size3) => this.onViewChange(item, size3)); + const containerDisposable = toDisposable(() => this.viewContainer.removeChild(container)); + const disposable = combinedDisposable(onChangeDisposable, containerDisposable); + let viewSize; + if (typeof size2 === "number") { + viewSize = size2; + } else { + if (size2.type === "auto") { + if (this.areViewsDistributed()) { + size2 = { type: "distribute" }; + } else { + size2 = { type: "split", index: size2.index }; + } + } + if (size2.type === "split") { + viewSize = this.getViewSize(size2.index) / 2; + } else if (size2.type === "invisible") { + viewSize = { cachedVisibleSize: size2.cachedVisibleSize }; + } else { + viewSize = view.minimumSize; + } + } + const item = this.orientation === 0 ? new VerticalViewItem(container, view, viewSize, disposable) : new HorizontalViewItem(container, view, viewSize, disposable); + this.viewItems.splice(index, 0, item); + if (this.viewItems.length > 1) { + const opts = { orthogonalStartSash: this.orthogonalStartSash, orthogonalEndSash: this.orthogonalEndSash }; + const sash = this.orientation === 0 ? new Sash(this.sashContainer, { getHorizontalSashTop: (s) => this.getSashPosition(s), getHorizontalSashWidth: this.getSashOrthogonalSize }, __spreadProps(__spreadValues({}, opts), { + orientation: 1 + /* Orientation.HORIZONTAL */ + })) : new Sash(this.sashContainer, { getVerticalSashLeft: (s) => this.getSashPosition(s), getVerticalSashHeight: this.getSashOrthogonalSize }, __spreadProps(__spreadValues({}, opts), { + orientation: 0 + /* Orientation.VERTICAL */ + })); + const sashEventMapper = this.orientation === 0 ? (e) => ({ sash, start: e.startY, current: e.currentY, alt: e.altKey }) : (e) => ({ sash, start: e.startX, current: e.currentX, alt: e.altKey }); + const onStart = Event.map(sash.onDidStart, sashEventMapper); + const onStartDisposable = onStart(this.onSashStart, this); + const onChange = Event.map(sash.onDidChange, sashEventMapper); + const onChangeDisposable2 = onChange(this.onSashChange, this); + const onEnd = Event.map(sash.onDidEnd, () => this.sashItems.findIndex((item2) => item2.sash === sash)); + const onEndDisposable = onEnd(this.onSashEnd, this); + const onDidResetDisposable = sash.onDidReset(() => { + const index2 = this.sashItems.findIndex((item2) => item2.sash === sash); + const upIndexes = range(index2, -1); + const downIndexes = range(index2 + 1, this.viewItems.length); + const snapBeforeIndex = this.findFirstSnapIndex(upIndexes); + const snapAfterIndex = this.findFirstSnapIndex(downIndexes); + if (typeof snapBeforeIndex === "number" && !this.viewItems[snapBeforeIndex].visible) { + return; + } + if (typeof snapAfterIndex === "number" && !this.viewItems[snapAfterIndex].visible) { + return; + } + this._onDidSashReset.fire(index2); + }); + const disposable2 = combinedDisposable(onStartDisposable, onChangeDisposable2, onEndDisposable, onDidResetDisposable, sash); + const sashItem = { sash, disposable: disposable2 }; + this.sashItems.splice(index - 1, 0, sashItem); + } + container.appendChild(view.element); + let highPriorityIndexes; + if (typeof size2 !== "number" && size2.type === "split") { + highPriorityIndexes = [size2.index]; + } + if (!skipLayout) { + this.relayout([index], highPriorityIndexes); + } + if (!skipLayout && typeof size2 !== "number" && size2.type === "distribute") { + this.distributeViewSizes(); + } + } finally { + this.state = State.Idle; + } + } + relayout(lowPriorityIndexes, highPriorityIndexes) { + const contentSize = this.viewItems.reduce((r, i) => r + i.size, 0); + this.resize(this.viewItems.length - 1, this.size - contentSize, void 0, lowPriorityIndexes, highPriorityIndexes); + this.distributeEmptySpace(); + this.layoutViews(); + this.saveProportions(); + } + resize(index, delta, sizes = this.viewItems.map((i) => i.size), lowPriorityIndexes, highPriorityIndexes, overloadMinDelta = Number.NEGATIVE_INFINITY, overloadMaxDelta = Number.POSITIVE_INFINITY, snapBefore, snapAfter) { + if (index < 0 || index >= this.viewItems.length) { + return 0; + } + const upIndexes = range(index, -1); + const downIndexes = range(index + 1, this.viewItems.length); + if (highPriorityIndexes) { + for (const index2 of highPriorityIndexes) { + pushToStart(upIndexes, index2); + pushToStart(downIndexes, index2); + } + } + if (lowPriorityIndexes) { + for (const index2 of lowPriorityIndexes) { + pushToEnd(upIndexes, index2); + pushToEnd(downIndexes, index2); + } + } + const upItems = upIndexes.map((i) => this.viewItems[i]); + const upSizes = upIndexes.map((i) => sizes[i]); + const downItems = downIndexes.map((i) => this.viewItems[i]); + const downSizes = downIndexes.map((i) => sizes[i]); + const minDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].minimumSize - sizes[i]), 0); + const maxDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].maximumSize - sizes[i]), 0); + const maxDeltaDown = downIndexes.length === 0 ? Number.POSITIVE_INFINITY : downIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].minimumSize), 0); + const minDeltaDown = downIndexes.length === 0 ? Number.NEGATIVE_INFINITY : downIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].maximumSize), 0); + const minDelta = Math.max(minDeltaUp, minDeltaDown, overloadMinDelta); + const maxDelta = Math.min(maxDeltaDown, maxDeltaUp, overloadMaxDelta); + let snapped = false; + if (snapBefore) { + const snapView = this.viewItems[snapBefore.index]; + const visible = delta >= snapBefore.limitDelta; + snapped = visible !== snapView.visible; + snapView.setVisible(visible, snapBefore.size); + } + if (!snapped && snapAfter) { + const snapView = this.viewItems[snapAfter.index]; + const visible = delta < snapAfter.limitDelta; + snapped = visible !== snapView.visible; + snapView.setVisible(visible, snapAfter.size); + } + if (snapped) { + return this.resize(index, delta, sizes, lowPriorityIndexes, highPriorityIndexes, overloadMinDelta, overloadMaxDelta); + } + delta = clamp(delta, minDelta, maxDelta); + for (let i = 0, deltaUp = delta; i < upItems.length; i++) { + const item = upItems[i]; + const size2 = clamp(upSizes[i] + deltaUp, item.minimumSize, item.maximumSize); + const viewDelta = size2 - upSizes[i]; + deltaUp -= viewDelta; + item.size = size2; + } + for (let i = 0, deltaDown = delta; i < downItems.length; i++) { + const item = downItems[i]; + const size2 = clamp(downSizes[i] - deltaDown, item.minimumSize, item.maximumSize); + const viewDelta = size2 - downSizes[i]; + deltaDown += viewDelta; + item.size = size2; + } + return delta; + } + distributeEmptySpace(lowPriorityIndex) { + const contentSize = this.viewItems.reduce((r, i) => r + i.size, 0); + let emptyDelta = this.size - contentSize; + const indexes = range(this.viewItems.length - 1, -1); + const lowPriorityIndexes = indexes.filter( + (i) => this.viewItems[i].priority === 1 + /* LayoutPriority.Low */ + ); + const highPriorityIndexes = indexes.filter( + (i) => this.viewItems[i].priority === 2 + /* LayoutPriority.High */ + ); + for (const index of highPriorityIndexes) { + pushToStart(indexes, index); + } + for (const index of lowPriorityIndexes) { + pushToEnd(indexes, index); + } + if (typeof lowPriorityIndex === "number") { + pushToEnd(indexes, lowPriorityIndex); + } + for (let i = 0; emptyDelta !== 0 && i < indexes.length; i++) { + const item = this.viewItems[indexes[i]]; + const size2 = clamp(item.size + emptyDelta, item.minimumSize, item.maximumSize); + const viewDelta = size2 - item.size; + emptyDelta -= viewDelta; + item.size = size2; + } + } + layoutViews() { + this._contentSize = this.viewItems.reduce((r, i) => r + i.size, 0); + let offset = 0; + for (const viewItem of this.viewItems) { + viewItem.layout(offset, this.layoutContext); + offset += viewItem.size; + } + this.sashItems.forEach((item) => item.sash.layout()); + this.updateSashEnablement(); + this.updateScrollableElement(); + } + updateScrollableElement() { + if (this.orientation === 0) { + this.scrollableElement.setScrollDimensions({ + height: this.size, + scrollHeight: this._contentSize + }); + } else { + this.scrollableElement.setScrollDimensions({ + width: this.size, + scrollWidth: this._contentSize + }); + } + } + updateSashEnablement() { + let previous = false; + const collapsesDown = this.viewItems.map((i) => previous = i.size - i.minimumSize > 0 || previous); + previous = false; + const expandsDown = this.viewItems.map((i) => previous = i.maximumSize - i.size > 0 || previous); + const reverseViews = [...this.viewItems].reverse(); + previous = false; + const collapsesUp = reverseViews.map((i) => previous = i.size - i.minimumSize > 0 || previous).reverse(); + previous = false; + const expandsUp = reverseViews.map((i) => previous = i.maximumSize - i.size > 0 || previous).reverse(); + let position = 0; + for (let index = 0; index < this.sashItems.length; index++) { + const { sash } = this.sashItems[index]; + const viewItem = this.viewItems[index]; + position += viewItem.size; + const min = !(collapsesDown[index] && expandsUp[index + 1]); + const max = !(expandsDown[index] && collapsesUp[index + 1]); + if (min && max) { + const upIndexes = range(index, -1); + const downIndexes = range(index + 1, this.viewItems.length); + const snapBeforeIndex = this.findFirstSnapIndex(upIndexes); + const snapAfterIndex = this.findFirstSnapIndex(downIndexes); + const snappedBefore = typeof snapBeforeIndex === "number" && !this.viewItems[snapBeforeIndex].visible; + const snappedAfter = typeof snapAfterIndex === "number" && !this.viewItems[snapAfterIndex].visible; + if (snappedBefore && collapsesUp[index] && (position > 0 || this.startSnappingEnabled)) { + sash.state = 1; + } else if (snappedAfter && collapsesDown[index] && (position < this._contentSize || this.endSnappingEnabled)) { + sash.state = 2; + } else { + sash.state = 0; + } + } else if (min && !max) { + sash.state = 1; + } else if (!min && max) { + sash.state = 2; + } else { + sash.state = 3; + } + } + } + getSashPosition(sash) { + let position = 0; + for (let i = 0; i < this.sashItems.length; i++) { + position += this.viewItems[i].size; + if (this.sashItems[i].sash === sash) { + return position; + } + } + return 0; + } + findFirstSnapIndex(indexes) { + for (const index of indexes) { + const viewItem = this.viewItems[index]; + if (!viewItem.visible) { + continue; + } + if (viewItem.snap) { + return index; + } + } + for (const index of indexes) { + const viewItem = this.viewItems[index]; + if (viewItem.visible && viewItem.maximumSize - viewItem.minimumSize > 0) { + return void 0; + } + if (!viewItem.visible && viewItem.snap) { + return index; + } + } + return void 0; + } + areViewsDistributed() { + let min = void 0, max = void 0; + for (const view of this.viewItems) { + min = min === void 0 ? view.size : Math.min(min, view.size); + max = max === void 0 ? view.size : Math.max(max, view.size); + if (max - min > 2) { + return false; + } + } + return true; + } + dispose() { + var _a10; + (_a10 = this.sashDragState) === null || _a10 === void 0 ? void 0 : _a10.disposable.dispose(); + dispose(this.viewItems); + this.viewItems = []; + this.sashItems.forEach((i) => i.disposable.dispose()); + this.sashItems = []; + super.dispose(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/table/table.css +var init_table = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/table/table.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/table/tableWidget.js +function asListVirtualDelegate(delegate) { + return { + getHeight(row) { + return delegate.getHeight(row); + }, + getTemplateId() { + return TableListRenderer.TemplateId; + } + }; +} +var TableListRenderer, ColumnHeader, Table; +var init_tableWidget = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/table/tableWidget.js"() { + init_dom(); + init_hoverDelegate2(); + init_hoverDelegateFactory(); + init_listWidget(); + init_splitview2(); + init_event(); + init_lifecycle(); + init_table(); + TableListRenderer = class _TableListRenderer { + constructor(columns, renderers, getColumnSize) { + this.columns = columns; + this.getColumnSize = getColumnSize; + this.templateId = _TableListRenderer.TemplateId; + this.renderedTemplates = /* @__PURE__ */ new Set(); + const rendererMap = new Map(renderers.map((r) => [r.templateId, r])); + this.renderers = []; + for (const column of columns) { + const renderer = rendererMap.get(column.templateId); + if (!renderer) { + throw new Error(`Table cell renderer for template id ${column.templateId} not found.`); + } + this.renderers.push(renderer); + } + } + renderTemplate(container) { + const rowContainer = append(container, $(".monaco-table-tr")); + const cellContainers = []; + const cellTemplateData = []; + for (let i = 0; i < this.columns.length; i++) { + const renderer = this.renderers[i]; + const cellContainer = append(rowContainer, $(".monaco-table-td", { "data-col-index": i })); + cellContainer.style.width = `${this.getColumnSize(i)}px`; + cellContainers.push(cellContainer); + cellTemplateData.push(renderer.renderTemplate(cellContainer)); + } + const result = { container, cellContainers, cellTemplateData }; + this.renderedTemplates.add(result); + return result; + } + renderElement(element, index, templateData, height) { + for (let i = 0; i < this.columns.length; i++) { + const column = this.columns[i]; + const cell = column.project(element); + const renderer = this.renderers[i]; + renderer.renderElement(cell, index, templateData.cellTemplateData[i], height); + } + } + disposeElement(element, index, templateData, height) { + for (let i = 0; i < this.columns.length; i++) { + const renderer = this.renderers[i]; + if (renderer.disposeElement) { + const column = this.columns[i]; + const cell = column.project(element); + renderer.disposeElement(cell, index, templateData.cellTemplateData[i], height); + } + } + } + disposeTemplate(templateData) { + for (let i = 0; i < this.columns.length; i++) { + const renderer = this.renderers[i]; + renderer.disposeTemplate(templateData.cellTemplateData[i]); + } + clearNode(templateData.container); + this.renderedTemplates.delete(templateData); + } + layoutColumn(index, size2) { + for (const { cellContainers } of this.renderedTemplates) { + cellContainers[index].style.width = `${size2}px`; + } + } + }; + TableListRenderer.TemplateId = "row"; + ColumnHeader = class extends Disposable { + get minimumSize() { + var _a10; + return (_a10 = this.column.minimumWidth) !== null && _a10 !== void 0 ? _a10 : 120; + } + get maximumSize() { + var _a10; + return (_a10 = this.column.maximumWidth) !== null && _a10 !== void 0 ? _a10 : Number.POSITIVE_INFINITY; + } + get onDidChange() { + var _a10; + return (_a10 = this.column.onDidChangeWidthConstraints) !== null && _a10 !== void 0 ? _a10 : Event.None; + } + constructor(column, index) { + super(); + this.column = column; + this.index = index; + this._onDidLayout = new Emitter(); + this.onDidLayout = this._onDidLayout.event; + this.element = $(".monaco-table-th", { "data-col-index": index }, column.label); + if (column.tooltip) { + this._register(getBaseLayerHoverDelegate().setupUpdatableHover(getDefaultHoverDelegate("mouse"), this.element, column.tooltip)); + } + } + layout(size2) { + this._onDidLayout.fire([this.index, size2]); + } + }; + Table = class _Table { + get onDidChangeFocus() { + return this.list.onDidChangeFocus; + } + get onDidChangeSelection() { + return this.list.onDidChangeSelection; + } + get onDidScroll() { + return this.list.onDidScroll; + } + get onMouseDblClick() { + return this.list.onMouseDblClick; + } + get onPointer() { + return this.list.onPointer; + } + get onDidFocus() { + return this.list.onDidFocus; + } + get scrollTop() { + return this.list.scrollTop; + } + set scrollTop(scrollTop) { + this.list.scrollTop = scrollTop; + } + get scrollHeight() { + return this.list.scrollHeight; + } + get renderHeight() { + return this.list.renderHeight; + } + get onDidDispose() { + return this.list.onDidDispose; + } + constructor(user, container, virtualDelegate, columns, renderers, _options) { + this.virtualDelegate = virtualDelegate; + this.domId = `table_id_${++_Table.InstanceCount}`; + this.disposables = new DisposableStore(); + this.cachedWidth = 0; + this.cachedHeight = 0; + this.domNode = append(container, $(`.monaco-table.${this.domId}`)); + const headers = columns.map((c, i) => this.disposables.add(new ColumnHeader(c, i))); + const descriptor = { + size: headers.reduce((a3, b) => a3 + b.column.weight, 0), + views: headers.map((view) => ({ size: view.column.weight, view })) + }; + this.splitview = this.disposables.add(new SplitView(this.domNode, { + orientation: 1, + scrollbarVisibility: 2, + getSashOrthogonalSize: () => this.cachedHeight, + descriptor + })); + this.splitview.el.style.height = `${virtualDelegate.headerRowHeight}px`; + this.splitview.el.style.lineHeight = `${virtualDelegate.headerRowHeight}px`; + const renderer = new TableListRenderer(columns, renderers, (i) => this.splitview.getViewSize(i)); + this.list = this.disposables.add(new List(user, this.domNode, asListVirtualDelegate(virtualDelegate), [renderer], _options)); + Event.any(...headers.map((h2) => h2.onDidLayout))(([index, size2]) => renderer.layoutColumn(index, size2), null, this.disposables); + this.splitview.onDidSashReset((index) => { + const totalWeight = columns.reduce((r, c) => r + c.weight, 0); + const size2 = columns[index].weight / totalWeight * this.cachedWidth; + this.splitview.resizeView(index, size2); + }, null, this.disposables); + this.styleElement = createStyleSheet(this.domNode); + this.style(unthemedListStyles); + } + updateOptions(options2) { + this.list.updateOptions(options2); + } + splice(start, deleteCount, elements = []) { + this.list.splice(start, deleteCount, elements); + } + getHTMLElement() { + return this.domNode; + } + style(styles) { + const content = []; + content.push(`.monaco-table.${this.domId} > .monaco-split-view2 .monaco-sash.vertical::before { + top: ${this.virtualDelegate.headerRowHeight + 1}px; + height: calc(100% - ${this.virtualDelegate.headerRowHeight}px); + }`); + this.styleElement.textContent = content.join("\n"); + this.list.style(styles); + } + getSelectedElements() { + return this.list.getSelectedElements(); + } + getSelection() { + return this.list.getSelection(); + } + getFocus() { + return this.list.getFocus(); + } + dispose() { + this.disposables.dispose(); + } + }; + Table.InstanceCount = 0; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/tree/tree.js +var ObjectTreeElementCollapseState, TreeMouseEventTarget, TreeError, WeakMapper; +var init_tree = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/tree/tree.js"() { + (function(ObjectTreeElementCollapseState2) { + ObjectTreeElementCollapseState2[ObjectTreeElementCollapseState2["Expanded"] = 0] = "Expanded"; + ObjectTreeElementCollapseState2[ObjectTreeElementCollapseState2["Collapsed"] = 1] = "Collapsed"; + ObjectTreeElementCollapseState2[ObjectTreeElementCollapseState2["PreserveOrExpanded"] = 2] = "PreserveOrExpanded"; + ObjectTreeElementCollapseState2[ObjectTreeElementCollapseState2["PreserveOrCollapsed"] = 3] = "PreserveOrCollapsed"; + })(ObjectTreeElementCollapseState || (ObjectTreeElementCollapseState = {})); + (function(TreeMouseEventTarget2) { + TreeMouseEventTarget2[TreeMouseEventTarget2["Unknown"] = 0] = "Unknown"; + TreeMouseEventTarget2[TreeMouseEventTarget2["Twistie"] = 1] = "Twistie"; + TreeMouseEventTarget2[TreeMouseEventTarget2["Element"] = 2] = "Element"; + TreeMouseEventTarget2[TreeMouseEventTarget2["Filter"] = 3] = "Filter"; + })(TreeMouseEventTarget || (TreeMouseEventTarget = {})); + TreeError = class extends Error { + constructor(user, message) { + super(`TreeError [${user}] ${message}`); + } + }; + WeakMapper = class { + constructor(fn) { + this.fn = fn; + this._map = /* @__PURE__ */ new WeakMap(); + } + map(key) { + let result = this._map.get(key); + if (!result) { + result = this.fn(key); + this._map.set(key, result); + } + return result; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/tree/indexTreeModel.js +function isFilterResult(obj) { + return typeof obj === "object" && "visibility" in obj && "data" in obj; +} +function getVisibleState(visibility) { + switch (visibility) { + case true: + return 1; + case false: + return 0; + default: + return visibility; + } +} +function isCollapsibleStateUpdate(update) { + return typeof update.collapsible === "boolean"; +} +var IndexTreeModel; +var init_indexTreeModel = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/tree/indexTreeModel.js"() { + init_tree(); + init_arrays(); + init_async(); + init_symbols(); + init_diff(); + init_event(); + init_iterator(); + IndexTreeModel = class { + constructor(user, list, rootElement, options2 = {}) { + var _a10; + this.user = user; + this.list = list; + this.rootRef = []; + this.eventBufferer = new EventBufferer(); + this._onDidChangeCollapseState = new Emitter(); + this.onDidChangeCollapseState = this.eventBufferer.wrapEvent(this._onDidChangeCollapseState.event); + this._onDidChangeRenderNodeCount = new Emitter(); + this.onDidChangeRenderNodeCount = this.eventBufferer.wrapEvent(this._onDidChangeRenderNodeCount.event); + this._onDidSplice = new Emitter(); + this.onDidSplice = this._onDidSplice.event; + this.refilterDelayer = new Delayer(MicrotaskDelay); + this.collapseByDefault = typeof options2.collapseByDefault === "undefined" ? false : options2.collapseByDefault; + this.allowNonCollapsibleParents = (_a10 = options2.allowNonCollapsibleParents) !== null && _a10 !== void 0 ? _a10 : false; + this.filter = options2.filter; + this.autoExpandSingleChildren = typeof options2.autoExpandSingleChildren === "undefined" ? false : options2.autoExpandSingleChildren; + this.root = { + parent: void 0, + element: rootElement, + children: [], + depth: 0, + visibleChildrenCount: 0, + visibleChildIndex: -1, + collapsible: false, + collapsed: false, + renderNodeCount: 0, + visibility: 1, + visible: true, + filterData: void 0 + }; + } + splice(location, deleteCount, toInsert = Iterable.empty(), options2 = {}) { + if (location.length === 0) { + throw new TreeError(this.user, "Invalid tree location"); + } + if (options2.diffIdentityProvider) { + this.spliceSmart(options2.diffIdentityProvider, location, deleteCount, toInsert, options2); + } else { + this.spliceSimple(location, deleteCount, toInsert, options2); + } + } + spliceSmart(identity2, location, deleteCount, toInsertIterable, options2, recurseLevels) { + var _a10; + if (toInsertIterable === void 0) { + toInsertIterable = Iterable.empty(); + } + if (recurseLevels === void 0) { + recurseLevels = (_a10 = options2.diffDepth) !== null && _a10 !== void 0 ? _a10 : 0; + } + const { parentNode } = this.getParentNodeWithListIndex(location); + if (!parentNode.lastDiffIds) { + return this.spliceSimple(location, deleteCount, toInsertIterable, options2); + } + const toInsert = [...toInsertIterable]; + const index = location[location.length - 1]; + const diff = new LcsDiff({ getElements: () => parentNode.lastDiffIds }, { + getElements: () => [ + ...parentNode.children.slice(0, index), + ...toInsert, + ...parentNode.children.slice(index + deleteCount) + ].map((e) => identity2.getId(e.element).toString()) + }).ComputeDiff(false); + if (diff.quitEarly) { + parentNode.lastDiffIds = void 0; + return this.spliceSimple(location, deleteCount, toInsert, options2); + } + const locationPrefix = location.slice(0, -1); + const recurseSplice = (fromOriginal, fromModified, count) => { + if (recurseLevels > 0) { + for (let i = 0; i < count; i++) { + fromOriginal--; + fromModified--; + this.spliceSmart(identity2, [...locationPrefix, fromOriginal, 0], Number.MAX_SAFE_INTEGER, toInsert[fromModified].children, options2, recurseLevels - 1); + } + } + }; + let lastStartO = Math.min(parentNode.children.length, index + deleteCount); + let lastStartM = toInsert.length; + for (const change of diff.changes.sort((a3, b) => b.originalStart - a3.originalStart)) { + recurseSplice(lastStartO, lastStartM, lastStartO - (change.originalStart + change.originalLength)); + lastStartO = change.originalStart; + lastStartM = change.modifiedStart - index; + this.spliceSimple([...locationPrefix, lastStartO], change.originalLength, Iterable.slice(toInsert, lastStartM, lastStartM + change.modifiedLength), options2); + } + recurseSplice(lastStartO, lastStartM, lastStartO); + } + spliceSimple(location, deleteCount, toInsert = Iterable.empty(), { onDidCreateNode, onDidDeleteNode, diffIdentityProvider }) { + const { parentNode, listIndex, revealed, visible } = this.getParentNodeWithListIndex(location); + const treeListElementsToInsert = []; + const nodesToInsertIterator = Iterable.map(toInsert, (el) => this.createTreeNode(el, parentNode, parentNode.visible ? 1 : 0, revealed, treeListElementsToInsert, onDidCreateNode)); + const lastIndex = location[location.length - 1]; + let visibleChildStartIndex = 0; + for (let i = lastIndex; i >= 0 && i < parentNode.children.length; i--) { + const child = parentNode.children[i]; + if (child.visible) { + visibleChildStartIndex = child.visibleChildIndex; + break; + } + } + const nodesToInsert = []; + let insertedVisibleChildrenCount = 0; + let renderNodeCount = 0; + for (const child of nodesToInsertIterator) { + nodesToInsert.push(child); + renderNodeCount += child.renderNodeCount; + if (child.visible) { + child.visibleChildIndex = visibleChildStartIndex + insertedVisibleChildrenCount++; + } + } + const deletedNodes = splice(parentNode.children, lastIndex, deleteCount, nodesToInsert); + if (!diffIdentityProvider) { + parentNode.lastDiffIds = void 0; + } else if (parentNode.lastDiffIds) { + splice(parentNode.lastDiffIds, lastIndex, deleteCount, nodesToInsert.map((n) => diffIdentityProvider.getId(n.element).toString())); + } else { + parentNode.lastDiffIds = parentNode.children.map((n) => diffIdentityProvider.getId(n.element).toString()); + } + let deletedVisibleChildrenCount = 0; + for (const child of deletedNodes) { + if (child.visible) { + deletedVisibleChildrenCount++; + } + } + if (deletedVisibleChildrenCount !== 0) { + for (let i = lastIndex + nodesToInsert.length; i < parentNode.children.length; i++) { + const child = parentNode.children[i]; + if (child.visible) { + child.visibleChildIndex -= deletedVisibleChildrenCount; + } + } + } + parentNode.visibleChildrenCount += insertedVisibleChildrenCount - deletedVisibleChildrenCount; + if (revealed && visible) { + const visibleDeleteCount = deletedNodes.reduce((r, node2) => r + (node2.visible ? node2.renderNodeCount : 0), 0); + this._updateAncestorsRenderNodeCount(parentNode, renderNodeCount - visibleDeleteCount); + this.list.splice(listIndex, visibleDeleteCount, treeListElementsToInsert); + } + if (deletedNodes.length > 0 && onDidDeleteNode) { + const visit2 = (node2) => { + onDidDeleteNode(node2); + node2.children.forEach(visit2); + }; + deletedNodes.forEach(visit2); + } + this._onDidSplice.fire({ insertedNodes: nodesToInsert, deletedNodes }); + let node = parentNode; + while (node) { + if (node.visibility === 2) { + this.refilterDelayer.trigger(() => this.refilter()); + break; + } + node = node.parent; + } + } + rerender(location) { + if (location.length === 0) { + throw new TreeError(this.user, "Invalid tree location"); + } + const { node, listIndex, revealed } = this.getTreeNodeWithListIndex(location); + if (node.visible && revealed) { + this.list.splice(listIndex, 1, [node]); + } + } + has(location) { + return this.hasTreeNode(location); + } + getListIndex(location) { + const { listIndex, visible, revealed } = this.getTreeNodeWithListIndex(location); + return visible && revealed ? listIndex : -1; + } + getListRenderCount(location) { + return this.getTreeNode(location).renderNodeCount; + } + isCollapsible(location) { + return this.getTreeNode(location).collapsible; + } + setCollapsible(location, collapsible) { + const node = this.getTreeNode(location); + if (typeof collapsible === "undefined") { + collapsible = !node.collapsible; + } + const update = { collapsible }; + return this.eventBufferer.bufferEvents(() => this._setCollapseState(location, update)); + } + isCollapsed(location) { + return this.getTreeNode(location).collapsed; + } + setCollapsed(location, collapsed2, recursive) { + const node = this.getTreeNode(location); + if (typeof collapsed2 === "undefined") { + collapsed2 = !node.collapsed; + } + const update = { collapsed: collapsed2, recursive: recursive || false }; + return this.eventBufferer.bufferEvents(() => this._setCollapseState(location, update)); + } + _setCollapseState(location, update) { + const { node, listIndex, revealed } = this.getTreeNodeWithListIndex(location); + const result = this._setListNodeCollapseState(node, listIndex, revealed, update); + if (node !== this.root && this.autoExpandSingleChildren && result && !isCollapsibleStateUpdate(update) && node.collapsible && !node.collapsed && !update.recursive) { + let onlyVisibleChildIndex = -1; + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (child.visible) { + if (onlyVisibleChildIndex > -1) { + onlyVisibleChildIndex = -1; + break; + } else { + onlyVisibleChildIndex = i; + } + } + } + if (onlyVisibleChildIndex > -1) { + this._setCollapseState([...location, onlyVisibleChildIndex], update); + } + } + return result; + } + _setListNodeCollapseState(node, listIndex, revealed, update) { + const result = this._setNodeCollapseState(node, update, false); + if (!revealed || !node.visible || !result) { + return result; + } + const previousRenderNodeCount = node.renderNodeCount; + const toInsert = this.updateNodeAfterCollapseChange(node); + const deleteCount = previousRenderNodeCount - (listIndex === -1 ? 0 : 1); + this.list.splice(listIndex + 1, deleteCount, toInsert.slice(1)); + return result; + } + _setNodeCollapseState(node, update, deep) { + let result; + if (node === this.root) { + result = false; + } else { + if (isCollapsibleStateUpdate(update)) { + result = node.collapsible !== update.collapsible; + node.collapsible = update.collapsible; + } else if (!node.collapsible) { + result = false; + } else { + result = node.collapsed !== update.collapsed; + node.collapsed = update.collapsed; + } + if (result) { + this._onDidChangeCollapseState.fire({ node, deep }); + } + } + if (!isCollapsibleStateUpdate(update) && update.recursive) { + for (const child of node.children) { + result = this._setNodeCollapseState(child, update, true) || result; + } + } + return result; + } + expandTo(location) { + this.eventBufferer.bufferEvents(() => { + let node = this.getTreeNode(location); + while (node.parent) { + node = node.parent; + location = location.slice(0, location.length - 1); + if (node.collapsed) { + this._setCollapseState(location, { collapsed: false, recursive: false }); + } + } + }); + } + refilter() { + const previousRenderNodeCount = this.root.renderNodeCount; + const toInsert = this.updateNodeAfterFilterChange(this.root); + this.list.splice(0, previousRenderNodeCount, toInsert); + this.refilterDelayer.cancel(); + } + createTreeNode(treeElement, parent, parentVisibility, revealed, treeListElements, onDidCreateNode) { + const node = { + parent, + element: treeElement.element, + children: [], + depth: parent.depth + 1, + visibleChildrenCount: 0, + visibleChildIndex: -1, + collapsible: typeof treeElement.collapsible === "boolean" ? treeElement.collapsible : typeof treeElement.collapsed !== "undefined", + collapsed: typeof treeElement.collapsed === "undefined" ? this.collapseByDefault : treeElement.collapsed, + renderNodeCount: 1, + visibility: 1, + visible: true, + filterData: void 0 + }; + const visibility = this._filterNode(node, parentVisibility); + node.visibility = visibility; + if (revealed) { + treeListElements.push(node); + } + const childElements = treeElement.children || Iterable.empty(); + const childRevealed = revealed && visibility !== 0 && !node.collapsed; + let visibleChildrenCount = 0; + let renderNodeCount = 1; + for (const el of childElements) { + const child = this.createTreeNode(el, node, visibility, childRevealed, treeListElements, onDidCreateNode); + node.children.push(child); + renderNodeCount += child.renderNodeCount; + if (child.visible) { + child.visibleChildIndex = visibleChildrenCount++; + } + } + if (!this.allowNonCollapsibleParents) { + node.collapsible = node.collapsible || node.children.length > 0; + } + node.visibleChildrenCount = visibleChildrenCount; + node.visible = visibility === 2 ? visibleChildrenCount > 0 : visibility === 1; + if (!node.visible) { + node.renderNodeCount = 0; + if (revealed) { + treeListElements.pop(); + } + } else if (!node.collapsed) { + node.renderNodeCount = renderNodeCount; + } + onDidCreateNode === null || onDidCreateNode === void 0 ? void 0 : onDidCreateNode(node); + return node; + } + updateNodeAfterCollapseChange(node) { + const previousRenderNodeCount = node.renderNodeCount; + const result = []; + this._updateNodeAfterCollapseChange(node, result); + this._updateAncestorsRenderNodeCount(node.parent, result.length - previousRenderNodeCount); + return result; + } + _updateNodeAfterCollapseChange(node, result) { + if (node.visible === false) { + return 0; + } + result.push(node); + node.renderNodeCount = 1; + if (!node.collapsed) { + for (const child of node.children) { + node.renderNodeCount += this._updateNodeAfterCollapseChange(child, result); + } + } + this._onDidChangeRenderNodeCount.fire(node); + return node.renderNodeCount; + } + updateNodeAfterFilterChange(node) { + const previousRenderNodeCount = node.renderNodeCount; + const result = []; + this._updateNodeAfterFilterChange(node, node.visible ? 1 : 0, result); + this._updateAncestorsRenderNodeCount(node.parent, result.length - previousRenderNodeCount); + return result; + } + _updateNodeAfterFilterChange(node, parentVisibility, result, revealed = true) { + let visibility; + if (node !== this.root) { + visibility = this._filterNode(node, parentVisibility); + if (visibility === 0) { + node.visible = false; + node.renderNodeCount = 0; + return false; + } + if (revealed) { + result.push(node); + } + } + const resultStartLength = result.length; + node.renderNodeCount = node === this.root ? 0 : 1; + let hasVisibleDescendants = false; + if (!node.collapsed || visibility !== 0) { + let visibleChildIndex = 0; + for (const child of node.children) { + hasVisibleDescendants = this._updateNodeAfterFilterChange(child, visibility, result, revealed && !node.collapsed) || hasVisibleDescendants; + if (child.visible) { + child.visibleChildIndex = visibleChildIndex++; + } + } + node.visibleChildrenCount = visibleChildIndex; + } else { + node.visibleChildrenCount = 0; + } + if (node !== this.root) { + node.visible = visibility === 2 ? hasVisibleDescendants : visibility === 1; + node.visibility = visibility; + } + if (!node.visible) { + node.renderNodeCount = 0; + if (revealed) { + result.pop(); + } + } else if (!node.collapsed) { + node.renderNodeCount += result.length - resultStartLength; + } + this._onDidChangeRenderNodeCount.fire(node); + return node.visible; + } + _updateAncestorsRenderNodeCount(node, diff) { + if (diff === 0) { + return; + } + while (node) { + node.renderNodeCount += diff; + this._onDidChangeRenderNodeCount.fire(node); + node = node.parent; + } + } + _filterNode(node, parentVisibility) { + const result = this.filter ? this.filter.filter(node.element, parentVisibility) : 1; + if (typeof result === "boolean") { + node.filterData = void 0; + return result ? 1 : 0; + } else if (isFilterResult(result)) { + node.filterData = result.data; + return getVisibleState(result.visibility); + } else { + node.filterData = void 0; + return getVisibleState(result); + } + } + // cheap + hasTreeNode(location, node = this.root) { + if (!location || location.length === 0) { + return true; + } + const [index, ...rest] = location; + if (index < 0 || index > node.children.length) { + return false; + } + return this.hasTreeNode(rest, node.children[index]); + } + // cheap + getTreeNode(location, node = this.root) { + if (!location || location.length === 0) { + return node; + } + const [index, ...rest] = location; + if (index < 0 || index > node.children.length) { + throw new TreeError(this.user, "Invalid tree location"); + } + return this.getTreeNode(rest, node.children[index]); + } + // expensive + getTreeNodeWithListIndex(location) { + if (location.length === 0) { + return { node: this.root, listIndex: -1, revealed: true, visible: false }; + } + const { parentNode, listIndex, revealed, visible } = this.getParentNodeWithListIndex(location); + const index = location[location.length - 1]; + if (index < 0 || index > parentNode.children.length) { + throw new TreeError(this.user, "Invalid tree location"); + } + const node = parentNode.children[index]; + return { node, listIndex, revealed, visible: visible && node.visible }; + } + getParentNodeWithListIndex(location, node = this.root, listIndex = 0, revealed = true, visible = true) { + const [index, ...rest] = location; + if (index < 0 || index > node.children.length) { + throw new TreeError(this.user, "Invalid tree location"); + } + for (let i = 0; i < index; i++) { + listIndex += node.children[i].renderNodeCount; + } + revealed = revealed && !node.collapsed; + visible = visible && node.visible; + if (rest.length === 0) { + return { parentNode: node, listIndex, revealed, visible }; + } + return this.getParentNodeWithListIndex(rest, node.children[index], listIndex + 1, revealed, visible); + } + getNode(location = []) { + return this.getTreeNode(location); + } + // TODO@joao perf! + getNodeLocation(node) { + const location = []; + let indexTreeNode = node; + while (indexTreeNode.parent) { + location.push(indexTreeNode.parent.children.indexOf(indexTreeNode)); + indexTreeNode = indexTreeNode.parent; + } + return location.reverse(); + } + getParentNodeLocation(location) { + if (location.length === 0) { + return void 0; + } else if (location.length === 1) { + return []; + } else { + return tail2(location)[0]; + } + } + getFirstElementChild(location) { + const node = this.getTreeNode(location); + if (node.children.length === 0) { + return void 0; + } + return node.children[0].element; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/tree/media/tree.css +var init_tree2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/tree/media/tree.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/tree/abstractTree.js +function asTreeDragAndDropData(data) { + if (data instanceof ElementsDragAndDropData) { + return new TreeElementsDragAndDropData(data); + } + return data; +} +function asListOptions(modelProvider, options2) { + return options2 && __spreadProps(__spreadValues({}, options2), { + identityProvider: options2.identityProvider && { + getId(el) { + return options2.identityProvider.getId(el.element); + } + }, + dnd: options2.dnd && new TreeNodeListDragAndDrop(modelProvider, options2.dnd), + multipleSelectionController: options2.multipleSelectionController && { + isSelectionSingleChangeEvent(e) { + return options2.multipleSelectionController.isSelectionSingleChangeEvent(__spreadProps(__spreadValues({}, e), { element: e.element })); + }, + isSelectionRangeChangeEvent(e) { + return options2.multipleSelectionController.isSelectionRangeChangeEvent(__spreadProps(__spreadValues({}, e), { element: e.element })); + } + }, + accessibilityProvider: options2.accessibilityProvider && __spreadProps(__spreadValues({}, options2.accessibilityProvider), { + getSetSize(node) { + const model = modelProvider(); + const ref = model.getNodeLocation(node); + const parentRef = model.getParentNodeLocation(ref); + const parentNode = model.getNode(parentRef); + return parentNode.visibleChildrenCount; + }, + getPosInSet(node) { + return node.visibleChildIndex + 1; + }, + isChecked: options2.accessibilityProvider && options2.accessibilityProvider.isChecked ? (node) => { + return options2.accessibilityProvider.isChecked(node.element); + } : void 0, + getRole: options2.accessibilityProvider && options2.accessibilityProvider.getRole ? (node) => { + return options2.accessibilityProvider.getRole(node.element); + } : () => "treeitem", + getAriaLabel(e) { + return options2.accessibilityProvider.getAriaLabel(e.element); + }, + getWidgetAriaLabel() { + return options2.accessibilityProvider.getWidgetAriaLabel(); + }, + getWidgetRole: options2.accessibilityProvider && options2.accessibilityProvider.getWidgetRole ? () => options2.accessibilityProvider.getWidgetRole() : () => "tree", + getAriaLevel: options2.accessibilityProvider && options2.accessibilityProvider.getAriaLevel ? (node) => options2.accessibilityProvider.getAriaLevel(node.element) : (node) => { + return node.depth; + }, + getActiveDescendantId: options2.accessibilityProvider.getActiveDescendantId && ((node) => { + return options2.accessibilityProvider.getActiveDescendantId(node.element); + }) + }), + keyboardNavigationLabelProvider: options2.keyboardNavigationLabelProvider && __spreadProps(__spreadValues({}, options2.keyboardNavigationLabelProvider), { + getKeyboardNavigationLabel(node) { + return options2.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(node.element); + } + }) + }); +} +function stickyScrollNodeStateEquals(node1, node2) { + return node1.position === node2.position && stickyScrollNodeEquals(node1, node2); +} +function stickyScrollNodeEquals(node1, node2) { + return node1.node.element === node2.node.element && node1.startIndex === node2.startIndex && node1.height === node2.height && node1.endIndex === node2.endIndex; +} +function asTreeMouseEvent(event) { + let target = TreeMouseEventTarget.Unknown; + if (hasParentWithClass(event.browserEvent.target, "monaco-tl-twistie", "monaco-tl-row")) { + target = TreeMouseEventTarget.Twistie; + } else if (hasParentWithClass(event.browserEvent.target, "monaco-tl-contents", "monaco-tl-row")) { + target = TreeMouseEventTarget.Element; + } else if (hasParentWithClass(event.browserEvent.target, "monaco-tree-type-filter", "monaco-list")) { + target = TreeMouseEventTarget.Filter; + } + return { + browserEvent: event.browserEvent, + element: event.element ? event.element.element : null, + target + }; +} +function asTreeContextMenuEvent(event) { + const isStickyScroll = isStickyScrollContainer(event.browserEvent.target); + return { + element: event.element ? event.element.element : null, + browserEvent: event.browserEvent, + anchor: event.anchor, + isStickyScroll + }; +} +function dfs(node, fn) { + fn(node); + node.children.forEach((child) => dfs(child, fn)); +} +var TreeElementsDragAndDropData, TreeNodeListDragAndDrop, ComposedTreeDelegate, RenderIndentGuides, EventCollection, TreeRenderer, FindFilter, TreeFindMode, TreeFindMatchType, FindController, StickyScrollState, DefaultStickyScrollDelegate, StickyScrollController, StickyScrollWidget, StickyScrollFocus, Trait2, TreeNodeListMouseController, TreeNodeList, AbstractTree; +var init_abstractTree = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/tree/abstractTree.js"() { + init_dom(); + init_event2(); + init_keyboardEvent(); + init_actionbar2(); + init_findInput2(); + init_inputBox2(); + init_listView(); + init_listWidget(); + init_toggle2(); + init_indexTreeModel(); + init_tree(); + init_actions(); + init_arrays(); + init_async(); + init_codicons(); + init_themables(); + init_map(); + init_event(); + init_filters(); + init_lifecycle(); + init_numbers(); + init_types(); + init_tree2(); + init_nls(); + init_hoverDelegateFactory(); + init_observable(); + TreeElementsDragAndDropData = class extends ElementsDragAndDropData { + constructor(data) { + super(data.elements.map((node) => node.element)); + this.data = data; + } + }; + TreeNodeListDragAndDrop = class { + constructor(modelProvider, dnd) { + this.modelProvider = modelProvider; + this.dnd = dnd; + this.autoExpandDisposable = Disposable.None; + this.disposables = new DisposableStore(); + } + getDragURI(node) { + return this.dnd.getDragURI(node.element); + } + getDragLabel(nodes, originalEvent) { + if (this.dnd.getDragLabel) { + return this.dnd.getDragLabel(nodes.map((node) => node.element), originalEvent); + } + return void 0; + } + onDragStart(data, originalEvent) { + var _a10, _b4; + (_b4 = (_a10 = this.dnd).onDragStart) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, asTreeDragAndDropData(data), originalEvent); + } + onDragOver(data, targetNode, targetIndex, targetSector, originalEvent, raw = true) { + const result = this.dnd.onDragOver(asTreeDragAndDropData(data), targetNode && targetNode.element, targetIndex, targetSector, originalEvent); + const didChangeAutoExpandNode = this.autoExpandNode !== targetNode; + if (didChangeAutoExpandNode) { + this.autoExpandDisposable.dispose(); + this.autoExpandNode = targetNode; + } + if (typeof targetNode === "undefined") { + return result; + } + if (didChangeAutoExpandNode && typeof result !== "boolean" && result.autoExpand) { + this.autoExpandDisposable = disposableTimeout(() => { + const model2 = this.modelProvider(); + const ref2 = model2.getNodeLocation(targetNode); + if (model2.isCollapsed(ref2)) { + model2.setCollapsed(ref2, false); + } + this.autoExpandNode = void 0; + }, 500, this.disposables); + } + if (typeof result === "boolean" || !result.accept || typeof result.bubble === "undefined" || result.feedback) { + if (!raw) { + const accept = typeof result === "boolean" ? result : result.accept; + const effect = typeof result === "boolean" ? void 0 : result.effect; + return { accept, effect, feedback: [targetIndex] }; + } + return result; + } + if (result.bubble === 1) { + const model2 = this.modelProvider(); + const ref2 = model2.getNodeLocation(targetNode); + const parentRef = model2.getParentNodeLocation(ref2); + const parentNode = model2.getNode(parentRef); + const parentIndex = parentRef && model2.getListIndex(parentRef); + return this.onDragOver(data, parentNode, parentIndex, targetSector, originalEvent, false); + } + const model = this.modelProvider(); + const ref = model.getNodeLocation(targetNode); + const start = model.getListIndex(ref); + const length = model.getListRenderCount(ref); + return __spreadProps(__spreadValues({}, result), { feedback: range(start, start + length) }); + } + drop(data, targetNode, targetIndex, targetSector, originalEvent) { + this.autoExpandDisposable.dispose(); + this.autoExpandNode = void 0; + this.dnd.drop(asTreeDragAndDropData(data), targetNode && targetNode.element, targetIndex, targetSector, originalEvent); + } + onDragEnd(originalEvent) { + var _a10, _b4; + (_b4 = (_a10 = this.dnd).onDragEnd) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, originalEvent); + } + dispose() { + this.disposables.dispose(); + this.dnd.dispose(); + } + }; + ComposedTreeDelegate = class { + constructor(delegate) { + this.delegate = delegate; + } + getHeight(element) { + return this.delegate.getHeight(element.element); + } + getTemplateId(element) { + return this.delegate.getTemplateId(element.element); + } + hasDynamicHeight(element) { + return !!this.delegate.hasDynamicHeight && this.delegate.hasDynamicHeight(element.element); + } + setDynamicHeight(element, height) { + var _a10, _b4; + (_b4 = (_a10 = this.delegate).setDynamicHeight) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, element.element, height); + } + }; + (function(RenderIndentGuides2) { + RenderIndentGuides2["None"] = "none"; + RenderIndentGuides2["OnHover"] = "onHover"; + RenderIndentGuides2["Always"] = "always"; + })(RenderIndentGuides || (RenderIndentGuides = {})); + EventCollection = class { + get elements() { + return this._elements; + } + constructor(onDidChange, _elements = []) { + this._elements = _elements; + this.disposables = new DisposableStore(); + this.onDidChange = Event.forEach(onDidChange, (elements) => this._elements = elements, this.disposables); + } + dispose() { + this.disposables.dispose(); + } + }; + TreeRenderer = class _TreeRenderer { + constructor(renderer, modelProvider, onDidChangeCollapseState, activeNodes, renderedIndentGuides, options2 = {}) { + var _a10; + this.renderer = renderer; + this.modelProvider = modelProvider; + this.activeNodes = activeNodes; + this.renderedIndentGuides = renderedIndentGuides; + this.renderedElements = /* @__PURE__ */ new Map(); + this.renderedNodes = /* @__PURE__ */ new Map(); + this.indent = _TreeRenderer.DefaultIndent; + this.hideTwistiesOfChildlessElements = false; + this.shouldRenderIndentGuides = false; + this.activeIndentNodes = /* @__PURE__ */ new Set(); + this.indentGuidesDisposable = Disposable.None; + this.disposables = new DisposableStore(); + this.templateId = renderer.templateId; + this.updateOptions(options2); + Event.map(onDidChangeCollapseState, (e) => e.node)(this.onDidChangeNodeTwistieState, this, this.disposables); + (_a10 = renderer.onDidChangeTwistieState) === null || _a10 === void 0 ? void 0 : _a10.call(renderer, this.onDidChangeTwistieState, this, this.disposables); + } + updateOptions(options2 = {}) { + if (typeof options2.indent !== "undefined") { + const indent = clamp(options2.indent, 0, 40); + if (indent !== this.indent) { + this.indent = indent; + for (const [node, templateData] of this.renderedNodes) { + this.renderTreeElement(node, templateData); + } + } + } + if (typeof options2.renderIndentGuides !== "undefined") { + const shouldRenderIndentGuides = options2.renderIndentGuides !== RenderIndentGuides.None; + if (shouldRenderIndentGuides !== this.shouldRenderIndentGuides) { + this.shouldRenderIndentGuides = shouldRenderIndentGuides; + for (const [node, templateData] of this.renderedNodes) { + this._renderIndentGuides(node, templateData); + } + this.indentGuidesDisposable.dispose(); + if (shouldRenderIndentGuides) { + const disposables = new DisposableStore(); + this.activeNodes.onDidChange(this._onDidChangeActiveNodes, this, disposables); + this.indentGuidesDisposable = disposables; + this._onDidChangeActiveNodes(this.activeNodes.elements); + } + } + } + if (typeof options2.hideTwistiesOfChildlessElements !== "undefined") { + this.hideTwistiesOfChildlessElements = options2.hideTwistiesOfChildlessElements; + } + } + renderTemplate(container) { + const el = append(container, $(".monaco-tl-row")); + const indent = append(el, $(".monaco-tl-indent")); + const twistie = append(el, $(".monaco-tl-twistie")); + const contents = append(el, $(".monaco-tl-contents")); + const templateData = this.renderer.renderTemplate(contents); + return { container, indent, twistie, indentGuidesDisposable: Disposable.None, templateData }; + } + renderElement(node, index, templateData, height) { + this.renderedNodes.set(node, templateData); + this.renderedElements.set(node.element, node); + this.renderTreeElement(node, templateData); + this.renderer.renderElement(node, index, templateData.templateData, height); + } + disposeElement(node, index, templateData, height) { + var _a10, _b4; + templateData.indentGuidesDisposable.dispose(); + (_b4 = (_a10 = this.renderer).disposeElement) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, node, index, templateData.templateData, height); + if (typeof height === "number") { + this.renderedNodes.delete(node); + this.renderedElements.delete(node.element); + } + } + disposeTemplate(templateData) { + this.renderer.disposeTemplate(templateData.templateData); + } + onDidChangeTwistieState(element) { + const node = this.renderedElements.get(element); + if (!node) { + return; + } + this.onDidChangeNodeTwistieState(node); + } + onDidChangeNodeTwistieState(node) { + const templateData = this.renderedNodes.get(node); + if (!templateData) { + return; + } + this._onDidChangeActiveNodes(this.activeNodes.elements); + this.renderTreeElement(node, templateData); + } + renderTreeElement(node, templateData) { + const indent = _TreeRenderer.DefaultIndent + (node.depth - 1) * this.indent; + templateData.twistie.style.paddingLeft = `${indent}px`; + templateData.indent.style.width = `${indent + this.indent - 16}px`; + if (node.collapsible) { + templateData.container.setAttribute("aria-expanded", String(!node.collapsed)); + } else { + templateData.container.removeAttribute("aria-expanded"); + } + templateData.twistie.classList.remove(...ThemeIcon.asClassNameArray(Codicon.treeItemExpanded)); + let twistieRendered = false; + if (this.renderer.renderTwistie) { + twistieRendered = this.renderer.renderTwistie(node.element, templateData.twistie); + } + if (node.collapsible && (!this.hideTwistiesOfChildlessElements || node.visibleChildrenCount > 0)) { + if (!twistieRendered) { + templateData.twistie.classList.add(...ThemeIcon.asClassNameArray(Codicon.treeItemExpanded)); + } + templateData.twistie.classList.add("collapsible"); + templateData.twistie.classList.toggle("collapsed", node.collapsed); + } else { + templateData.twistie.classList.remove("collapsible", "collapsed"); + } + this._renderIndentGuides(node, templateData); + } + _renderIndentGuides(node, templateData) { + clearNode(templateData.indent); + templateData.indentGuidesDisposable.dispose(); + if (!this.shouldRenderIndentGuides) { + return; + } + const disposableStore = new DisposableStore(); + const model = this.modelProvider(); + while (true) { + const ref = model.getNodeLocation(node); + const parentRef = model.getParentNodeLocation(ref); + if (!parentRef) { + break; + } + const parent = model.getNode(parentRef); + const guide = $(".indent-guide", { style: `width: ${this.indent}px` }); + if (this.activeIndentNodes.has(parent)) { + guide.classList.add("active"); + } + if (templateData.indent.childElementCount === 0) { + templateData.indent.appendChild(guide); + } else { + templateData.indent.insertBefore(guide, templateData.indent.firstElementChild); + } + this.renderedIndentGuides.add(parent, guide); + disposableStore.add(toDisposable(() => this.renderedIndentGuides.delete(parent, guide))); + node = parent; + } + templateData.indentGuidesDisposable = disposableStore; + } + _onDidChangeActiveNodes(nodes) { + if (!this.shouldRenderIndentGuides) { + return; + } + const set = /* @__PURE__ */ new Set(); + const model = this.modelProvider(); + nodes.forEach((node) => { + const ref = model.getNodeLocation(node); + try { + const parentRef = model.getParentNodeLocation(ref); + if (node.collapsible && node.children.length > 0 && !node.collapsed) { + set.add(node); + } else if (parentRef) { + set.add(model.getNode(parentRef)); + } + } catch (_a10) { + } + }); + this.activeIndentNodes.forEach((node) => { + if (!set.has(node)) { + this.renderedIndentGuides.forEach(node, (line) => line.classList.remove("active")); + } + }); + set.forEach((node) => { + if (!this.activeIndentNodes.has(node)) { + this.renderedIndentGuides.forEach(node, (line) => line.classList.add("active")); + } + }); + this.activeIndentNodes = set; + } + dispose() { + this.renderedNodes.clear(); + this.renderedElements.clear(); + this.indentGuidesDisposable.dispose(); + dispose(this.disposables); + } + }; + TreeRenderer.DefaultIndent = 8; + FindFilter = class { + get totalCount() { + return this._totalCount; + } + get matchCount() { + return this._matchCount; + } + constructor(tree, keyboardNavigationLabelProvider, _filter) { + this.tree = tree; + this.keyboardNavigationLabelProvider = keyboardNavigationLabelProvider; + this._filter = _filter; + this._totalCount = 0; + this._matchCount = 0; + this._pattern = ""; + this._lowercasePattern = ""; + this.disposables = new DisposableStore(); + tree.onWillRefilter(this.reset, this, this.disposables); + } + filter(element, parentVisibility) { + let visibility = 1; + if (this._filter) { + const result = this._filter.filter(element, parentVisibility); + if (typeof result === "boolean") { + visibility = result ? 1 : 0; + } else if (isFilterResult(result)) { + visibility = getVisibleState(result.visibility); + } else { + visibility = result; + } + if (visibility === 0) { + return false; + } + } + this._totalCount++; + if (!this._pattern) { + this._matchCount++; + return { data: FuzzyScore.Default, visibility }; + } + const label = this.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(element); + const labels = Array.isArray(label) ? label : [label]; + for (const l of labels) { + const labelStr = l && l.toString(); + if (typeof labelStr === "undefined") { + return { data: FuzzyScore.Default, visibility }; + } + let score3; + if (this.tree.findMatchType === TreeFindMatchType.Contiguous) { + const index = labelStr.toLowerCase().indexOf(this._lowercasePattern); + if (index > -1) { + score3 = [Number.MAX_SAFE_INTEGER, 0]; + for (let i = this._lowercasePattern.length; i > 0; i--) { + score3.push(index + i - 1); + } + } + } else { + score3 = fuzzyScore(this._pattern, this._lowercasePattern, 0, labelStr, labelStr.toLowerCase(), 0, { firstMatchCanBeWeak: true, boostFullMatch: true }); + } + if (score3) { + this._matchCount++; + return labels.length === 1 ? { data: score3, visibility } : { data: { label: labelStr, score: score3 }, visibility }; + } + } + if (this.tree.findMode === TreeFindMode.Filter) { + if (typeof this.tree.options.defaultFindVisibility === "number") { + return this.tree.options.defaultFindVisibility; + } else if (this.tree.options.defaultFindVisibility) { + return this.tree.options.defaultFindVisibility(element); + } else { + return 2; + } + } else { + return { data: FuzzyScore.Default, visibility }; + } + } + reset() { + this._totalCount = 0; + this._matchCount = 0; + } + dispose() { + dispose(this.disposables); + } + }; + (function(TreeFindMode2) { + TreeFindMode2[TreeFindMode2["Highlight"] = 0] = "Highlight"; + TreeFindMode2[TreeFindMode2["Filter"] = 1] = "Filter"; + })(TreeFindMode || (TreeFindMode = {})); + (function(TreeFindMatchType2) { + TreeFindMatchType2[TreeFindMatchType2["Fuzzy"] = 0] = "Fuzzy"; + TreeFindMatchType2[TreeFindMatchType2["Contiguous"] = 1] = "Contiguous"; + })(TreeFindMatchType || (TreeFindMatchType = {})); + FindController = class { + get pattern() { + return this._pattern; + } + get mode() { + return this._mode; + } + set mode(mode) { + if (mode === this._mode) { + return; + } + this._mode = mode; + if (this.widget) { + this.widget.mode = this._mode; + } + this.tree.refilter(); + this.render(); + this._onDidChangeMode.fire(mode); + } + get matchType() { + return this._matchType; + } + set matchType(matchType) { + if (matchType === this._matchType) { + return; + } + this._matchType = matchType; + if (this.widget) { + this.widget.matchType = this._matchType; + } + this.tree.refilter(); + this.render(); + this._onDidChangeMatchType.fire(matchType); + } + constructor(tree, model, view, filter, contextViewProvider, options2 = {}) { + var _a10, _b4; + this.tree = tree; + this.view = view; + this.filter = filter; + this.contextViewProvider = contextViewProvider; + this.options = options2; + this._pattern = ""; + this.width = 0; + this._onDidChangeMode = new Emitter(); + this.onDidChangeMode = this._onDidChangeMode.event; + this._onDidChangeMatchType = new Emitter(); + this.onDidChangeMatchType = this._onDidChangeMatchType.event; + this._onDidChangePattern = new Emitter(); + this._onDidChangeOpenState = new Emitter(); + this.onDidChangeOpenState = this._onDidChangeOpenState.event; + this.enabledDisposables = new DisposableStore(); + this.disposables = new DisposableStore(); + this._mode = (_a10 = tree.options.defaultFindMode) !== null && _a10 !== void 0 ? _a10 : TreeFindMode.Highlight; + this._matchType = (_b4 = tree.options.defaultFindMatchType) !== null && _b4 !== void 0 ? _b4 : TreeFindMatchType.Fuzzy; + model.onDidSplice(this.onDidSpliceModel, this, this.disposables); + } + updateOptions(optionsUpdate = {}) { + if (optionsUpdate.defaultFindMode !== void 0) { + this.mode = optionsUpdate.defaultFindMode; + } + if (optionsUpdate.defaultFindMatchType !== void 0) { + this.matchType = optionsUpdate.defaultFindMatchType; + } + } + onDidSpliceModel() { + if (!this.widget || this.pattern.length === 0) { + return; + } + this.tree.refilter(); + this.render(); + } + render() { + var _a10, _b4, _c2, _d2; + const noMatches = this.filter.totalCount > 0 && this.filter.matchCount === 0; + if (this.pattern && noMatches) { + if ((_a10 = this.tree.options.showNotFoundMessage) !== null && _a10 !== void 0 ? _a10 : true) { + (_b4 = this.widget) === null || _b4 === void 0 ? void 0 : _b4.showMessage({ type: 2, content: localize("not found", "No elements found.") }); + } else { + (_c2 = this.widget) === null || _c2 === void 0 ? void 0 : _c2.showMessage({ + type: 2 + /* MessageType.WARNING */ + }); + } + } else { + (_d2 = this.widget) === null || _d2 === void 0 ? void 0 : _d2.clearMessage(); + } + } + shouldAllowFocus(node) { + if (!this.widget || !this.pattern) { + return true; + } + if (this.filter.totalCount > 0 && this.filter.matchCount <= 1) { + return true; + } + return !FuzzyScore.isDefault(node.filterData); + } + layout(width2) { + var _a10; + this.width = width2; + (_a10 = this.widget) === null || _a10 === void 0 ? void 0 : _a10.layout(width2); + } + dispose() { + this._history = void 0; + this._onDidChangePattern.dispose(); + this.enabledDisposables.dispose(); + this.disposables.dispose(); + } + }; + StickyScrollState = class { + constructor(stickyNodes = []) { + this.stickyNodes = stickyNodes; + } + get count() { + return this.stickyNodes.length; + } + equal(state) { + return equals(this.stickyNodes, state.stickyNodes, stickyScrollNodeStateEquals); + } + lastNodePartiallyVisible() { + if (this.count === 0) { + return false; + } + const lastStickyNode = this.stickyNodes[this.count - 1]; + if (this.count === 1) { + return lastStickyNode.position !== 0; + } + const secondLastStickyNode = this.stickyNodes[this.count - 2]; + return secondLastStickyNode.position + secondLastStickyNode.height !== lastStickyNode.position; + } + animationStateChanged(previousState) { + if (!equals(this.stickyNodes, previousState.stickyNodes, stickyScrollNodeEquals)) { + return false; + } + if (this.count === 0) { + return false; + } + const lastStickyNode = this.stickyNodes[this.count - 1]; + const previousLastStickyNode = previousState.stickyNodes[previousState.count - 1]; + return lastStickyNode.position !== previousLastStickyNode.position; + } + }; + DefaultStickyScrollDelegate = class { + constrainStickyScrollNodes(stickyNodes, stickyScrollMaxItemCount, maxWidgetHeight) { + for (let i = 0; i < stickyNodes.length; i++) { + const stickyNode = stickyNodes[i]; + const stickyNodeBottom = stickyNode.position + stickyNode.height; + if (stickyNodeBottom > maxWidgetHeight || i >= stickyScrollMaxItemCount) { + return stickyNodes.slice(0, i); + } + } + return stickyNodes; + } + }; + StickyScrollController = class extends Disposable { + constructor(tree, model, view, renderers, treeDelegate, options2 = {}) { + var _a10; + super(); + this.tree = tree; + this.model = model; + this.view = view; + this.treeDelegate = treeDelegate; + this.maxWidgetViewRatio = 0.4; + const stickyScrollOptions = this.validateStickySettings(options2); + this.stickyScrollMaxItemCount = stickyScrollOptions.stickyScrollMaxItemCount; + this.stickyScrollDelegate = (_a10 = options2.stickyScrollDelegate) !== null && _a10 !== void 0 ? _a10 : new DefaultStickyScrollDelegate(); + this._widget = this._register(new StickyScrollWidget(view.getScrollableElement(), view, tree, renderers, treeDelegate, options2.accessibilityProvider)); + this.onDidChangeHasFocus = this._widget.onDidChangeHasFocus; + this.onContextMenu = this._widget.onContextMenu; + this._register(view.onDidScroll(() => this.update())); + this._register(view.onDidChangeContentHeight(() => this.update())); + this._register(tree.onDidChangeCollapseState(() => this.update())); + this.update(); + } + get height() { + return this._widget.height; + } + getNodeAtHeight(height) { + let index; + if (height === 0) { + index = this.view.firstVisibleIndex; + } else { + index = this.view.indexAt(height + this.view.scrollTop); + } + if (index < 0 || index >= this.view.length) { + return void 0; + } + return this.view.element(index); + } + update() { + const firstVisibleNode = this.getNodeAtHeight(0); + if (!firstVisibleNode || this.tree.scrollTop === 0) { + this._widget.setState(void 0); + return; + } + const stickyState = this.findStickyState(firstVisibleNode); + this._widget.setState(stickyState); + } + findStickyState(firstVisibleNode) { + const stickyNodes = []; + let firstVisibleNodeUnderWidget = firstVisibleNode; + let stickyNodesHeight = 0; + let nextStickyNode = this.getNextStickyNode(firstVisibleNodeUnderWidget, void 0, stickyNodesHeight); + while (nextStickyNode) { + stickyNodes.push(nextStickyNode); + stickyNodesHeight += nextStickyNode.height; + if (stickyNodes.length <= this.stickyScrollMaxItemCount) { + firstVisibleNodeUnderWidget = this.getNextVisibleNode(nextStickyNode); + if (!firstVisibleNodeUnderWidget) { + break; + } + } + nextStickyNode = this.getNextStickyNode(firstVisibleNodeUnderWidget, nextStickyNode.node, stickyNodesHeight); + } + const contrainedStickyNodes = this.constrainStickyNodes(stickyNodes); + return contrainedStickyNodes.length ? new StickyScrollState(contrainedStickyNodes) : void 0; + } + getNextVisibleNode(previousStickyNode) { + return this.getNodeAtHeight(previousStickyNode.position + previousStickyNode.height); + } + getNextStickyNode(firstVisibleNodeUnderWidget, previousStickyNode, stickyNodesHeight) { + const nextStickyNode = this.getAncestorUnderPrevious(firstVisibleNodeUnderWidget, previousStickyNode); + if (!nextStickyNode) { + return void 0; + } + if (nextStickyNode === firstVisibleNodeUnderWidget) { + if (!this.nodeIsUncollapsedParent(firstVisibleNodeUnderWidget)) { + return void 0; + } + if (this.nodeTopAlignsWithStickyNodesBottom(firstVisibleNodeUnderWidget, stickyNodesHeight)) { + return void 0; + } + } + return this.createStickyScrollNode(nextStickyNode, stickyNodesHeight); + } + nodeTopAlignsWithStickyNodesBottom(node, stickyNodesHeight) { + const nodeIndex = this.getNodeIndex(node); + const elementTop = this.view.getElementTop(nodeIndex); + const stickyPosition = stickyNodesHeight; + return this.view.scrollTop === elementTop - stickyPosition; + } + createStickyScrollNode(node, currentStickyNodesHeight) { + const height = this.treeDelegate.getHeight(node); + const { startIndex, endIndex } = this.getNodeRange(node); + const position = this.calculateStickyNodePosition(endIndex, currentStickyNodesHeight, height); + return { node, position, height, startIndex, endIndex }; + } + getAncestorUnderPrevious(node, previousAncestor = void 0) { + let currentAncestor = node; + let parentOfcurrentAncestor = this.getParentNode(currentAncestor); + while (parentOfcurrentAncestor) { + if (parentOfcurrentAncestor === previousAncestor) { + return currentAncestor; + } + currentAncestor = parentOfcurrentAncestor; + parentOfcurrentAncestor = this.getParentNode(currentAncestor); + } + if (previousAncestor === void 0) { + return currentAncestor; + } + return void 0; + } + calculateStickyNodePosition(lastDescendantIndex, stickyRowPositionTop, stickyNodeHeight) { + let lastChildRelativeTop = this.view.getRelativeTop(lastDescendantIndex); + if (lastChildRelativeTop === null && this.view.firstVisibleIndex === lastDescendantIndex && lastDescendantIndex + 1 < this.view.length) { + const nodeHeight = this.treeDelegate.getHeight(this.view.element(lastDescendantIndex)); + const nextNodeRelativeTop = this.view.getRelativeTop(lastDescendantIndex + 1); + lastChildRelativeTop = nextNodeRelativeTop ? nextNodeRelativeTop - nodeHeight / this.view.renderHeight : null; + } + if (lastChildRelativeTop === null) { + return stickyRowPositionTop; + } + const lastChildNode = this.view.element(lastDescendantIndex); + const lastChildHeight = this.treeDelegate.getHeight(lastChildNode); + const topOfLastChild = lastChildRelativeTop * this.view.renderHeight; + const bottomOfLastChild = topOfLastChild + lastChildHeight; + if (stickyRowPositionTop + stickyNodeHeight > bottomOfLastChild && stickyRowPositionTop <= bottomOfLastChild) { + return bottomOfLastChild - stickyNodeHeight; + } + return stickyRowPositionTop; + } + constrainStickyNodes(stickyNodes) { + if (stickyNodes.length === 0) { + return []; + } + const maximumStickyWidgetHeight = this.view.renderHeight * this.maxWidgetViewRatio; + const lastStickyNode = stickyNodes[stickyNodes.length - 1]; + if (stickyNodes.length <= this.stickyScrollMaxItemCount && lastStickyNode.position + lastStickyNode.height <= maximumStickyWidgetHeight) { + return stickyNodes; + } + const constrainedStickyNodes = this.stickyScrollDelegate.constrainStickyScrollNodes(stickyNodes, this.stickyScrollMaxItemCount, maximumStickyWidgetHeight); + if (!constrainedStickyNodes.length) { + return []; + } + const lastConstrainedStickyNode = constrainedStickyNodes[constrainedStickyNodes.length - 1]; + if (constrainedStickyNodes.length > this.stickyScrollMaxItemCount || lastConstrainedStickyNode.position + lastConstrainedStickyNode.height > maximumStickyWidgetHeight) { + throw new Error("stickyScrollDelegate violates constraints"); + } + return constrainedStickyNodes; + } + getParentNode(node) { + const nodeLocation = this.model.getNodeLocation(node); + const parentLocation = this.model.getParentNodeLocation(nodeLocation); + return parentLocation ? this.model.getNode(parentLocation) : void 0; + } + nodeIsUncollapsedParent(node) { + const nodeLocation = this.model.getNodeLocation(node); + return this.model.getListRenderCount(nodeLocation) > 1; + } + getNodeIndex(node) { + const nodeLocation = this.model.getNodeLocation(node); + const nodeIndex = this.model.getListIndex(nodeLocation); + return nodeIndex; + } + getNodeRange(node) { + const nodeLocation = this.model.getNodeLocation(node); + const startIndex = this.model.getListIndex(nodeLocation); + if (startIndex < 0) { + throw new Error("Node not found in tree"); + } + const renderCount = this.model.getListRenderCount(nodeLocation); + const endIndex = startIndex + renderCount - 1; + return { startIndex, endIndex }; + } + nodePositionTopBelowWidget(node) { + const ancestors = []; + let currentAncestor = this.getParentNode(node); + while (currentAncestor) { + ancestors.push(currentAncestor); + currentAncestor = this.getParentNode(currentAncestor); + } + let widgetHeight = 0; + for (let i = 0; i < ancestors.length && i < this.stickyScrollMaxItemCount; i++) { + widgetHeight += this.treeDelegate.getHeight(ancestors[i]); + } + return widgetHeight; + } + domFocus() { + this._widget.domFocus(); + } + // Whether sticky scroll was the last focused part in the tree or not + focusedLast() { + return this._widget.focusedLast(); + } + updateOptions(optionsUpdate = {}) { + if (!optionsUpdate.stickyScrollMaxItemCount) { + return; + } + const validatedOptions = this.validateStickySettings(optionsUpdate); + if (this.stickyScrollMaxItemCount !== validatedOptions.stickyScrollMaxItemCount) { + this.stickyScrollMaxItemCount = validatedOptions.stickyScrollMaxItemCount; + this.update(); + } + } + validateStickySettings(options2) { + let stickyScrollMaxItemCount = 7; + if (typeof options2.stickyScrollMaxItemCount === "number") { + stickyScrollMaxItemCount = Math.max(options2.stickyScrollMaxItemCount, 1); + } + return { stickyScrollMaxItemCount }; + } + }; + StickyScrollWidget = class { + constructor(container, view, tree, treeRenderers, treeDelegate, accessibilityProvider) { + this.view = view; + this.tree = tree; + this.treeRenderers = treeRenderers; + this.treeDelegate = treeDelegate; + this.accessibilityProvider = accessibilityProvider; + this._previousElements = []; + this._previousStateDisposables = new DisposableStore(); + this._rootDomNode = $(".monaco-tree-sticky-container.empty"); + container.appendChild(this._rootDomNode); + const shadow = $(".monaco-tree-sticky-container-shadow"); + this._rootDomNode.appendChild(shadow); + this.stickyScrollFocus = new StickyScrollFocus(this._rootDomNode, view); + this.onDidChangeHasFocus = this.stickyScrollFocus.onDidChangeHasFocus; + this.onContextMenu = this.stickyScrollFocus.onContextMenu; + } + get height() { + if (!this._previousState) { + return 0; + } + const lastElement = this._previousState.stickyNodes[this._previousState.count - 1]; + return lastElement.position + lastElement.height; + } + setState(state) { + const wasVisible = !!this._previousState && this._previousState.count > 0; + const isVisible = !!state && state.count > 0; + if (!wasVisible && !isVisible || wasVisible && isVisible && this._previousState.equal(state)) { + return; + } + if (wasVisible !== isVisible) { + this.setVisible(isVisible); + } + if (!isVisible) { + this._previousState = void 0; + this._previousElements = []; + this._previousStateDisposables.clear(); + return; + } + const lastStickyNode = state.stickyNodes[state.count - 1]; + if (this._previousState && state.animationStateChanged(this._previousState)) { + this._previousElements[this._previousState.count - 1].style.top = `${lastStickyNode.position}px`; + } else { + this._previousStateDisposables.clear(); + const elements = Array(state.count); + for (let stickyIndex = state.count - 1; stickyIndex >= 0; stickyIndex--) { + const stickyNode = state.stickyNodes[stickyIndex]; + const { element, disposable } = this.createElement(stickyNode, stickyIndex, state.count); + elements[stickyIndex] = element; + this._rootDomNode.appendChild(element); + this._previousStateDisposables.add(disposable); + } + this.stickyScrollFocus.updateElements(elements, state); + this._previousElements = elements; + } + this._previousState = state; + this._rootDomNode.style.height = `${lastStickyNode.position + lastStickyNode.height}px`; + } + createElement(stickyNode, stickyIndex, stickyNodesTotal) { + const nodeIndex = stickyNode.startIndex; + const stickyElement = document.createElement("div"); + stickyElement.style.top = `${stickyNode.position}px`; + if (this.tree.options.setRowHeight !== false) { + stickyElement.style.height = `${stickyNode.height}px`; + } + if (this.tree.options.setRowLineHeight !== false) { + stickyElement.style.lineHeight = `${stickyNode.height}px`; + } + stickyElement.classList.add("monaco-tree-sticky-row"); + stickyElement.classList.add("monaco-list-row"); + stickyElement.setAttribute("data-index", `${nodeIndex}`); + stickyElement.setAttribute("data-parity", nodeIndex % 2 === 0 ? "even" : "odd"); + stickyElement.setAttribute("id", this.view.getElementID(nodeIndex)); + const accessibilityDisposable = this.setAccessibilityAttributes(stickyElement, stickyNode.node.element, stickyIndex, stickyNodesTotal); + const nodeTemplateId = this.treeDelegate.getTemplateId(stickyNode.node); + const renderer = this.treeRenderers.find((renderer2) => renderer2.templateId === nodeTemplateId); + if (!renderer) { + throw new Error(`No renderer found for template id ${nodeTemplateId}`); + } + let nodeCopy = stickyNode.node; + if (nodeCopy === this.tree.getNode(this.tree.getNodeLocation(stickyNode.node))) { + nodeCopy = new Proxy(stickyNode.node, {}); + } + const templateData = renderer.renderTemplate(stickyElement); + renderer.renderElement(nodeCopy, stickyNode.startIndex, templateData, stickyNode.height); + const disposable = toDisposable(() => { + accessibilityDisposable.dispose(); + renderer.disposeElement(nodeCopy, stickyNode.startIndex, templateData, stickyNode.height); + renderer.disposeTemplate(templateData); + stickyElement.remove(); + }); + return { element: stickyElement, disposable }; + } + setAccessibilityAttributes(container, element, stickyIndex, stickyNodesTotal) { + var _a10; + if (!this.accessibilityProvider) { + return Disposable.None; + } + if (this.accessibilityProvider.getSetSize) { + container.setAttribute("aria-setsize", String(this.accessibilityProvider.getSetSize(element, stickyIndex, stickyNodesTotal))); + } + if (this.accessibilityProvider.getPosInSet) { + container.setAttribute("aria-posinset", String(this.accessibilityProvider.getPosInSet(element, stickyIndex))); + } + if (this.accessibilityProvider.getRole) { + container.setAttribute("role", (_a10 = this.accessibilityProvider.getRole(element)) !== null && _a10 !== void 0 ? _a10 : "treeitem"); + } + const ariaLabel = this.accessibilityProvider.getAriaLabel(element); + const observable = ariaLabel && typeof ariaLabel !== "string" ? ariaLabel : constObservable(ariaLabel); + const result = autorun((reader) => { + const value = reader.readObservable(observable); + if (value) { + container.setAttribute("aria-label", value); + } else { + container.removeAttribute("aria-label"); + } + }); + if (typeof ariaLabel === "string") { + } else if (ariaLabel) { + container.setAttribute("aria-label", ariaLabel.get()); + } + const ariaLevel = this.accessibilityProvider.getAriaLevel && this.accessibilityProvider.getAriaLevel(element); + if (typeof ariaLevel === "number") { + container.setAttribute("aria-level", `${ariaLevel}`); + } + container.setAttribute("aria-selected", String(false)); + return result; + } + setVisible(visible) { + this._rootDomNode.classList.toggle("empty", !visible); + if (!visible) { + this.stickyScrollFocus.updateElements([], void 0); + } + } + domFocus() { + this.stickyScrollFocus.domFocus(); + } + focusedLast() { + return this.stickyScrollFocus.focusedLast(); + } + dispose() { + this.stickyScrollFocus.dispose(); + this._previousStateDisposables.dispose(); + this._rootDomNode.remove(); + } + }; + StickyScrollFocus = class extends Disposable { + get domHasFocus() { + return this._domHasFocus; + } + set domHasFocus(hasFocus) { + if (hasFocus !== this._domHasFocus) { + this._onDidChangeHasFocus.fire(hasFocus); + this._domHasFocus = hasFocus; + } + } + constructor(container, view) { + super(); + this.container = container; + this.view = view; + this.focusedIndex = -1; + this.elements = []; + this._onDidChangeHasFocus = new Emitter(); + this.onDidChangeHasFocus = this._onDidChangeHasFocus.event; + this._onContextMenu = new Emitter(); + this.onContextMenu = this._onContextMenu.event; + this._domHasFocus = false; + this.container.addEventListener("focus", () => this.onFocus()); + this.container.addEventListener("blur", () => this.onBlur()); + this._register(this.view.onDidFocus(() => this.toggleStickyScrollFocused(false))); + this._register(this.view.onKeyDown((e) => this.onKeyDown(e))); + this._register(this.view.onMouseDown((e) => this.onMouseDown(e))); + this._register(this.view.onContextMenu((e) => this.handleContextMenu(e))); + } + handleContextMenu(e) { + const target = e.browserEvent.target; + if (!isStickyScrollContainer(target) && !isStickyScrollElement(target)) { + if (this.focusedLast()) { + this.view.domFocus(); + } + return; + } + if (!isKeyboardEvent(e.browserEvent)) { + if (!this.state) { + throw new Error("Context menu should not be triggered when state is undefined"); + } + const stickyIndex = this.state.stickyNodes.findIndex((stickyNode2) => { + var _a10; + return stickyNode2.node.element === ((_a10 = e.element) === null || _a10 === void 0 ? void 0 : _a10.element); + }); + if (stickyIndex === -1) { + throw new Error("Context menu should not be triggered when element is not in sticky scroll widget"); + } + this.container.focus(); + this.setFocus(stickyIndex); + return; + } + if (!this.state || this.focusedIndex < 0) { + throw new Error("Context menu key should not be triggered when focus is not in sticky scroll widget"); + } + const stickyNode = this.state.stickyNodes[this.focusedIndex]; + const element = stickyNode.node.element; + const anchor = this.elements[this.focusedIndex]; + this._onContextMenu.fire({ element, anchor, browserEvent: e.browserEvent, isStickyScroll: true }); + } + onKeyDown(e) { + if (this.domHasFocus && this.state) { + if (e.key === "ArrowUp") { + this.setFocusedElement(Math.max(0, this.focusedIndex - 1)); + e.preventDefault(); + e.stopPropagation(); + } else if (e.key === "ArrowDown" || e.key === "ArrowRight") { + if (this.focusedIndex >= this.state.count - 1) { + const nodeIndexToFocus = this.state.stickyNodes[this.state.count - 1].startIndex + 1; + this.view.domFocus(); + this.view.setFocus([nodeIndexToFocus]); + this.scrollNodeUnderWidget(nodeIndexToFocus, this.state); + } else { + this.setFocusedElement(this.focusedIndex + 1); + } + e.preventDefault(); + e.stopPropagation(); + } + } + } + onMouseDown(e) { + const target = e.browserEvent.target; + if (!isStickyScrollContainer(target) && !isStickyScrollElement(target)) { + return; + } + e.browserEvent.preventDefault(); + e.browserEvent.stopPropagation(); + } + updateElements(elements, state) { + if (state && state.count === 0) { + throw new Error("Sticky scroll state must be undefined when there are no sticky nodes"); + } + if (state && state.count !== elements.length) { + throw new Error("Sticky scroll focus received illigel state"); + } + const previousIndex = this.focusedIndex; + this.removeFocus(); + this.elements = elements; + this.state = state; + if (state) { + const newFocusedIndex = clamp(previousIndex, 0, state.count - 1); + this.setFocus(newFocusedIndex); + } else { + if (this.domHasFocus) { + this.view.domFocus(); + } + } + this.container.tabIndex = state ? 0 : -1; + } + setFocusedElement(stickyIndex) { + const state = this.state; + if (!state) { + throw new Error("Cannot set focus when state is undefined"); + } + this.setFocus(stickyIndex); + if (stickyIndex < state.count - 1) { + return; + } + if (state.lastNodePartiallyVisible()) { + const lastStickyNode = state.stickyNodes[stickyIndex]; + this.scrollNodeUnderWidget(lastStickyNode.endIndex + 1, state); + } + } + scrollNodeUnderWidget(nodeIndex, state) { + const lastStickyNode = state.stickyNodes[state.count - 1]; + const secondLastStickyNode = state.count > 1 ? state.stickyNodes[state.count - 2] : void 0; + const elementScrollTop = this.view.getElementTop(nodeIndex); + const elementTargetViewTop = secondLastStickyNode ? secondLastStickyNode.position + secondLastStickyNode.height + lastStickyNode.height : lastStickyNode.height; + this.view.scrollTop = elementScrollTop - elementTargetViewTop; + } + domFocus() { + if (!this.state) { + throw new Error("Cannot focus when state is undefined"); + } + this.container.focus(); + } + focusedLast() { + if (!this.state) { + return false; + } + return this.view.getHTMLElement().classList.contains("sticky-scroll-focused"); + } + removeFocus() { + if (this.focusedIndex === -1) { + return; + } + this.toggleElementFocus(this.elements[this.focusedIndex], false); + this.focusedIndex = -1; + } + setFocus(newFocusIndex) { + if (0 > newFocusIndex) { + throw new Error("addFocus() can not remove focus"); + } + if (!this.state && newFocusIndex >= 0) { + throw new Error("Cannot set focus index when state is undefined"); + } + if (this.state && newFocusIndex >= this.state.count) { + throw new Error("Cannot set focus index to an index that does not exist"); + } + const oldIndex = this.focusedIndex; + if (oldIndex >= 0) { + this.toggleElementFocus(this.elements[oldIndex], false); + } + if (newFocusIndex >= 0) { + this.toggleElementFocus(this.elements[newFocusIndex], true); + } + this.focusedIndex = newFocusIndex; + } + toggleElementFocus(element, focused) { + this.toggleElementActiveFocus(element, focused && this.domHasFocus); + this.toggleElementPassiveFocus(element, focused); + } + toggleCurrentElementActiveFocus(focused) { + if (this.focusedIndex === -1) { + return; + } + this.toggleElementActiveFocus(this.elements[this.focusedIndex], focused); + } + toggleElementActiveFocus(element, focused) { + element.classList.toggle("focused", focused); + } + toggleElementPassiveFocus(element, focused) { + element.classList.toggle("passive-focused", focused); + } + toggleStickyScrollFocused(focused) { + this.view.getHTMLElement().classList.toggle("sticky-scroll-focused", focused); + } + onFocus() { + if (!this.state || this.elements.length === 0) { + throw new Error("Cannot focus when state is undefined or elements are empty"); + } + this.domHasFocus = true; + this.toggleStickyScrollFocused(true); + this.toggleCurrentElementActiveFocus(true); + if (this.focusedIndex === -1) { + this.setFocus(0); + } + } + onBlur() { + this.domHasFocus = false; + this.toggleCurrentElementActiveFocus(false); + } + dispose() { + this.toggleStickyScrollFocused(false); + this._onDidChangeHasFocus.fire(false); + super.dispose(); + } + }; + Trait2 = class { + get nodeSet() { + if (!this._nodeSet) { + this._nodeSet = this.createNodeSet(); + } + return this._nodeSet; + } + constructor(getFirstViewElementWithTrait, identityProvider) { + this.getFirstViewElementWithTrait = getFirstViewElementWithTrait; + this.identityProvider = identityProvider; + this.nodes = []; + this._onDidChange = new Emitter(); + this.onDidChange = this._onDidChange.event; + } + set(nodes, browserEvent) { + if (!(browserEvent === null || browserEvent === void 0 ? void 0 : browserEvent.__forceEvent) && equals(this.nodes, nodes)) { + return; + } + this._set(nodes, false, browserEvent); + } + _set(nodes, silent, browserEvent) { + this.nodes = [...nodes]; + this.elements = void 0; + this._nodeSet = void 0; + if (!silent) { + const that = this; + this._onDidChange.fire({ get elements() { + return that.get(); + }, browserEvent }); + } + } + get() { + if (!this.elements) { + this.elements = this.nodes.map((node) => node.element); + } + return [...this.elements]; + } + getNodes() { + return this.nodes; + } + has(node) { + return this.nodeSet.has(node); + } + onDidModelSplice({ insertedNodes, deletedNodes }) { + if (!this.identityProvider) { + const set = this.createNodeSet(); + const visit2 = (node) => set.delete(node); + deletedNodes.forEach((node) => dfs(node, visit2)); + this.set([...set.values()]); + return; + } + const deletedNodesIdSet = /* @__PURE__ */ new Set(); + const deletedNodesVisitor = (node) => deletedNodesIdSet.add(this.identityProvider.getId(node.element).toString()); + deletedNodes.forEach((node) => dfs(node, deletedNodesVisitor)); + const insertedNodesMap = /* @__PURE__ */ new Map(); + const insertedNodesVisitor = (node) => insertedNodesMap.set(this.identityProvider.getId(node.element).toString(), node); + insertedNodes.forEach((node) => dfs(node, insertedNodesVisitor)); + const nodes = []; + for (const node of this.nodes) { + const id = this.identityProvider.getId(node.element).toString(); + const wasDeleted = deletedNodesIdSet.has(id); + if (!wasDeleted) { + nodes.push(node); + } else { + const insertedNode = insertedNodesMap.get(id); + if (insertedNode && insertedNode.visible) { + nodes.push(insertedNode); + } + } + } + if (this.nodes.length > 0 && nodes.length === 0) { + const node = this.getFirstViewElementWithTrait(); + if (node) { + nodes.push(node); + } + } + this._set(nodes, true); + } + createNodeSet() { + const set = /* @__PURE__ */ new Set(); + for (const node of this.nodes) { + set.add(node); + } + return set; + } + }; + TreeNodeListMouseController = class extends MouseController { + constructor(list, tree, stickyScrollProvider) { + super(list); + this.tree = tree; + this.stickyScrollProvider = stickyScrollProvider; + } + onViewPointer(e) { + if (isButton(e.browserEvent.target) || isInputElement(e.browserEvent.target) || isMonacoEditor(e.browserEvent.target)) { + return; + } + if (e.browserEvent.isHandledByList) { + return; + } + const node = e.element; + if (!node) { + return super.onViewPointer(e); + } + if (this.isSelectionRangeChangeEvent(e) || this.isSelectionSingleChangeEvent(e)) { + return super.onViewPointer(e); + } + const target = e.browserEvent.target; + const onTwistie = target.classList.contains("monaco-tl-twistie") || target.classList.contains("monaco-icon-label") && target.classList.contains("folder-icon") && e.browserEvent.offsetX < 16; + const isStickyElement = isStickyScrollElement(e.browserEvent.target); + let expandOnlyOnTwistieClick = false; + if (isStickyElement) { + expandOnlyOnTwistieClick = true; + } else if (typeof this.tree.expandOnlyOnTwistieClick === "function") { + expandOnlyOnTwistieClick = this.tree.expandOnlyOnTwistieClick(node.element); + } else { + expandOnlyOnTwistieClick = !!this.tree.expandOnlyOnTwistieClick; + } + if (!isStickyElement) { + if (expandOnlyOnTwistieClick && !onTwistie && e.browserEvent.detail !== 2) { + return super.onViewPointer(e); + } + if (!this.tree.expandOnDoubleClick && e.browserEvent.detail === 2) { + return super.onViewPointer(e); + } + } else { + this.handleStickyScrollMouseEvent(e, node); + } + if (node.collapsible && (!isStickyElement || onTwistie)) { + const location = this.tree.getNodeLocation(node); + const recursive = e.browserEvent.altKey; + this.tree.setFocus([location]); + this.tree.toggleCollapsed(location, recursive); + if (onTwistie) { + e.browserEvent.isHandledByList = true; + return; + } + } + if (!isStickyElement) { + super.onViewPointer(e); + } + } + handleStickyScrollMouseEvent(e, node) { + if (isMonacoCustomToggle(e.browserEvent.target) || isActionItem(e.browserEvent.target)) { + return; + } + const stickyScrollController = this.stickyScrollProvider(); + if (!stickyScrollController) { + throw new Error("Sticky scroll controller not found"); + } + const nodeIndex = this.list.indexOf(node); + const elementScrollTop = this.list.getElementTop(nodeIndex); + const elementTargetViewTop = stickyScrollController.nodePositionTopBelowWidget(node); + this.tree.scrollTop = elementScrollTop - elementTargetViewTop; + this.list.domFocus(); + this.list.setFocus([nodeIndex]); + this.list.setSelection([nodeIndex]); + } + onDoubleClick(e) { + const onTwistie = e.browserEvent.target.classList.contains("monaco-tl-twistie"); + if (onTwistie || !this.tree.expandOnDoubleClick) { + return; + } + if (e.browserEvent.isHandledByList) { + return; + } + super.onDoubleClick(e); + } + // to make sure dom focus is not stolen (for example with context menu) + onMouseDown(e) { + const target = e.browserEvent.target; + if (!isStickyScrollContainer(target) && !isStickyScrollElement(target)) { + super.onMouseDown(e); + return; + } + } + onContextMenu(e) { + const target = e.browserEvent.target; + if (!isStickyScrollContainer(target) && !isStickyScrollElement(target)) { + super.onContextMenu(e); + return; + } + } + }; + TreeNodeList = class extends List { + constructor(user, container, virtualDelegate, renderers, focusTrait, selectionTrait, anchorTrait, options2) { + super(user, container, virtualDelegate, renderers, options2); + this.focusTrait = focusTrait; + this.selectionTrait = selectionTrait; + this.anchorTrait = anchorTrait; + } + createMouseController(options2) { + return new TreeNodeListMouseController(this, options2.tree, options2.stickyScrollProvider); + } + splice(start, deleteCount, elements = []) { + super.splice(start, deleteCount, elements); + if (elements.length === 0) { + return; + } + const additionalFocus = []; + const additionalSelection = []; + let anchor; + elements.forEach((node, index) => { + if (this.focusTrait.has(node)) { + additionalFocus.push(start + index); + } + if (this.selectionTrait.has(node)) { + additionalSelection.push(start + index); + } + if (this.anchorTrait.has(node)) { + anchor = start + index; + } + }); + if (additionalFocus.length > 0) { + super.setFocus(distinct([...super.getFocus(), ...additionalFocus])); + } + if (additionalSelection.length > 0) { + super.setSelection(distinct([...super.getSelection(), ...additionalSelection])); + } + if (typeof anchor === "number") { + super.setAnchor(anchor); + } + } + setFocus(indexes, browserEvent, fromAPI = false) { + super.setFocus(indexes, browserEvent); + if (!fromAPI) { + this.focusTrait.set(indexes.map((i) => this.element(i)), browserEvent); + } + } + setSelection(indexes, browserEvent, fromAPI = false) { + super.setSelection(indexes, browserEvent); + if (!fromAPI) { + this.selectionTrait.set(indexes.map((i) => this.element(i)), browserEvent); + } + } + setAnchor(index, fromAPI = false) { + super.setAnchor(index); + if (!fromAPI) { + if (typeof index === "undefined") { + this.anchorTrait.set([]); + } else { + this.anchorTrait.set([this.element(index)]); + } + } + } + }; + AbstractTree = class { + get onDidScroll() { + return this.view.onDidScroll; + } + get onDidChangeFocus() { + return this.eventBufferer.wrapEvent(this.focus.onDidChange); + } + get onDidChangeSelection() { + return this.eventBufferer.wrapEvent(this.selection.onDidChange); + } + get onMouseDblClick() { + return Event.filter(Event.map(this.view.onMouseDblClick, asTreeMouseEvent), (e) => e.target !== TreeMouseEventTarget.Filter); + } + get onMouseOver() { + return Event.map(this.view.onMouseOver, asTreeMouseEvent); + } + get onMouseOut() { + return Event.map(this.view.onMouseOut, asTreeMouseEvent); + } + get onContextMenu() { + var _a10, _b4; + return Event.any(Event.filter(Event.map(this.view.onContextMenu, asTreeContextMenuEvent), (e) => !e.isStickyScroll), (_b4 = (_a10 = this.stickyScrollController) === null || _a10 === void 0 ? void 0 : _a10.onContextMenu) !== null && _b4 !== void 0 ? _b4 : Event.None); + } + get onPointer() { + return Event.map(this.view.onPointer, asTreeMouseEvent); + } + get onKeyDown() { + return this.view.onKeyDown; + } + get onDidFocus() { + return this.view.onDidFocus; + } + get onDidChangeModel() { + return Event.signal(this.model.onDidSplice); + } + get onDidChangeCollapseState() { + return this.model.onDidChangeCollapseState; + } + get findMode() { + var _a10, _b4; + return (_b4 = (_a10 = this.findController) === null || _a10 === void 0 ? void 0 : _a10.mode) !== null && _b4 !== void 0 ? _b4 : TreeFindMode.Highlight; + } + set findMode(findMode) { + if (this.findController) { + this.findController.mode = findMode; + } + } + get findMatchType() { + var _a10, _b4; + return (_b4 = (_a10 = this.findController) === null || _a10 === void 0 ? void 0 : _a10.matchType) !== null && _b4 !== void 0 ? _b4 : TreeFindMatchType.Fuzzy; + } + set findMatchType(findFuzzy) { + if (this.findController) { + this.findController.matchType = findFuzzy; + } + } + get expandOnDoubleClick() { + return typeof this._options.expandOnDoubleClick === "undefined" ? true : this._options.expandOnDoubleClick; + } + get expandOnlyOnTwistieClick() { + return typeof this._options.expandOnlyOnTwistieClick === "undefined" ? true : this._options.expandOnlyOnTwistieClick; + } + get onDidDispose() { + return this.view.onDidDispose; + } + constructor(_user, container, delegate, renderers, _options = {}) { + var _a10; + this._user = _user; + this._options = _options; + this.eventBufferer = new EventBufferer(); + this.onDidChangeFindOpenState = Event.None; + this.onDidChangeStickyScrollFocused = Event.None; + this.disposables = new DisposableStore(); + this._onWillRefilter = new Emitter(); + this.onWillRefilter = this._onWillRefilter.event; + this._onDidUpdateOptions = new Emitter(); + this.treeDelegate = new ComposedTreeDelegate(delegate); + const onDidChangeCollapseStateRelay = new Relay(); + const onDidChangeActiveNodes = new Relay(); + const activeNodes = this.disposables.add(new EventCollection(onDidChangeActiveNodes.event)); + const renderedIndentGuides = new SetMap(); + this.renderers = renderers.map((r) => new TreeRenderer(r, () => this.model, onDidChangeCollapseStateRelay.event, activeNodes, renderedIndentGuides, _options)); + for (const r of this.renderers) { + this.disposables.add(r); + } + let filter; + if (_options.keyboardNavigationLabelProvider) { + filter = new FindFilter(this, _options.keyboardNavigationLabelProvider, _options.filter); + _options = __spreadProps(__spreadValues({}, _options), { filter }); + this.disposables.add(filter); + } + this.focus = new Trait2(() => this.view.getFocusedElements()[0], _options.identityProvider); + this.selection = new Trait2(() => this.view.getSelectedElements()[0], _options.identityProvider); + this.anchor = new Trait2(() => this.view.getAnchorElement(), _options.identityProvider); + this.view = new TreeNodeList(_user, container, this.treeDelegate, this.renderers, this.focus, this.selection, this.anchor, __spreadProps(__spreadValues({}, asListOptions(() => this.model, _options)), { tree: this, stickyScrollProvider: () => this.stickyScrollController })); + this.model = this.createModel(_user, this.view, _options); + onDidChangeCollapseStateRelay.input = this.model.onDidChangeCollapseState; + const onDidModelSplice = Event.forEach(this.model.onDidSplice, (e) => { + this.eventBufferer.bufferEvents(() => { + this.focus.onDidModelSplice(e); + this.selection.onDidModelSplice(e); + }); + }, this.disposables); + onDidModelSplice(() => null, null, this.disposables); + const activeNodesEmitter = this.disposables.add(new Emitter()); + const activeNodesDebounce = this.disposables.add(new Delayer(0)); + this.disposables.add(Event.any(onDidModelSplice, this.focus.onDidChange, this.selection.onDidChange)(() => { + activeNodesDebounce.trigger(() => { + const set = /* @__PURE__ */ new Set(); + for (const node of this.focus.getNodes()) { + set.add(node); + } + for (const node of this.selection.getNodes()) { + set.add(node); + } + activeNodesEmitter.fire([...set.values()]); + }); + })); + onDidChangeActiveNodes.input = activeNodesEmitter.event; + if (_options.keyboardSupport !== false) { + const onKeyDown = Event.chain(this.view.onKeyDown, ($16) => $16.filter((e) => !isInputElement(e.target)).map((e) => new StandardKeyboardEvent(e))); + Event.chain(onKeyDown, ($16) => $16.filter( + (e) => e.keyCode === 15 + /* KeyCode.LeftArrow */ + ))(this.onLeftArrow, this, this.disposables); + Event.chain(onKeyDown, ($16) => $16.filter( + (e) => e.keyCode === 17 + /* KeyCode.RightArrow */ + ))(this.onRightArrow, this, this.disposables); + Event.chain(onKeyDown, ($16) => $16.filter( + (e) => e.keyCode === 10 + /* KeyCode.Space */ + ))(this.onSpace, this, this.disposables); + } + if (((_a10 = _options.findWidgetEnabled) !== null && _a10 !== void 0 ? _a10 : true) && _options.keyboardNavigationLabelProvider && _options.contextViewProvider) { + const opts = this.options.findWidgetStyles ? { styles: this.options.findWidgetStyles } : void 0; + this.findController = new FindController(this, this.model, this.view, filter, _options.contextViewProvider, opts); + this.focusNavigationFilter = (node) => this.findController.shouldAllowFocus(node); + this.onDidChangeFindOpenState = this.findController.onDidChangeOpenState; + this.disposables.add(this.findController); + this.onDidChangeFindMode = this.findController.onDidChangeMode; + this.onDidChangeFindMatchType = this.findController.onDidChangeMatchType; + } else { + this.onDidChangeFindMode = Event.None; + this.onDidChangeFindMatchType = Event.None; + } + if (_options.enableStickyScroll) { + this.stickyScrollController = new StickyScrollController(this, this.model, this.view, this.renderers, this.treeDelegate, _options); + this.onDidChangeStickyScrollFocused = this.stickyScrollController.onDidChangeHasFocus; + } + this.styleElement = createStyleSheet(this.view.getHTMLElement()); + this.getHTMLElement().classList.toggle("always", this._options.renderIndentGuides === RenderIndentGuides.Always); + } + updateOptions(optionsUpdate = {}) { + var _a10; + this._options = __spreadValues(__spreadValues({}, this._options), optionsUpdate); + for (const renderer of this.renderers) { + renderer.updateOptions(optionsUpdate); + } + this.view.updateOptions(this._options); + (_a10 = this.findController) === null || _a10 === void 0 ? void 0 : _a10.updateOptions(optionsUpdate); + this.updateStickyScroll(optionsUpdate); + this._onDidUpdateOptions.fire(this._options); + this.getHTMLElement().classList.toggle("always", this._options.renderIndentGuides === RenderIndentGuides.Always); + } + get options() { + return this._options; + } + updateStickyScroll(optionsUpdate) { + var _a10; + if (!this.stickyScrollController && this._options.enableStickyScroll) { + this.stickyScrollController = new StickyScrollController(this, this.model, this.view, this.renderers, this.treeDelegate, this._options); + this.onDidChangeStickyScrollFocused = this.stickyScrollController.onDidChangeHasFocus; + } else if (this.stickyScrollController && !this._options.enableStickyScroll) { + this.onDidChangeStickyScrollFocused = Event.None; + this.stickyScrollController.dispose(); + this.stickyScrollController = void 0; + } + (_a10 = this.stickyScrollController) === null || _a10 === void 0 ? void 0 : _a10.updateOptions(optionsUpdate); + } + // Widget + getHTMLElement() { + return this.view.getHTMLElement(); + } + get scrollTop() { + return this.view.scrollTop; + } + set scrollTop(scrollTop) { + this.view.scrollTop = scrollTop; + } + get scrollHeight() { + return this.view.scrollHeight; + } + get renderHeight() { + return this.view.renderHeight; + } + get ariaLabel() { + return this.view.ariaLabel; + } + set ariaLabel(value) { + this.view.ariaLabel = value; + } + domFocus() { + var _a10; + if ((_a10 = this.stickyScrollController) === null || _a10 === void 0 ? void 0 : _a10.focusedLast()) { + this.stickyScrollController.domFocus(); + } else { + this.view.domFocus(); + } + } + layout(height, width2) { + var _a10; + this.view.layout(height, width2); + if (isNumber(width2)) { + (_a10 = this.findController) === null || _a10 === void 0 ? void 0 : _a10.layout(width2); + } + } + style(styles) { + var _a10, _b4; + const suffix = `.${this.view.domId}`; + const content = []; + if (styles.treeIndentGuidesStroke) { + content.push(`.monaco-list${suffix}:hover .monaco-tl-indent > .indent-guide, .monaco-list${suffix}.always .monaco-tl-indent > .indent-guide { border-color: ${styles.treeInactiveIndentGuidesStroke}; }`); + content.push(`.monaco-list${suffix} .monaco-tl-indent > .indent-guide.active { border-color: ${styles.treeIndentGuidesStroke}; }`); + } + const stickyScrollBackground = (_a10 = styles.treeStickyScrollBackground) !== null && _a10 !== void 0 ? _a10 : styles.listBackground; + if (stickyScrollBackground) { + content.push(`.monaco-list${suffix} .monaco-scrollable-element .monaco-tree-sticky-container { background-color: ${stickyScrollBackground}; }`); + content.push(`.monaco-list${suffix} .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-row { background-color: ${stickyScrollBackground}; }`); + } + if (styles.treeStickyScrollBorder) { + content.push(`.monaco-list${suffix} .monaco-scrollable-element .monaco-tree-sticky-container { border-bottom: 1px solid ${styles.treeStickyScrollBorder}; }`); + } + if (styles.treeStickyScrollShadow) { + content.push(`.monaco-list${suffix} .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-container-shadow { box-shadow: ${styles.treeStickyScrollShadow} 0 6px 6px -6px inset; height: 3px; }`); + } + if (styles.listFocusForeground) { + content.push(`.monaco-list${suffix}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused { color: ${styles.listFocusForeground}; }`); + content.push(`.monaco-list${suffix}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused { color: inherit; }`); + } + const focusAndSelectionOutline = asCssValueWithDefault(styles.listFocusAndSelectionOutline, asCssValueWithDefault(styles.listSelectionOutline, (_b4 = styles.listFocusOutline) !== null && _b4 !== void 0 ? _b4 : "")); + if (focusAndSelectionOutline) { + content.push(`.monaco-list${suffix}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused.selected { outline: 1px solid ${focusAndSelectionOutline}; outline-offset: -1px;}`); + content.push(`.monaco-list${suffix}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused.selected { outline: inherit;}`); + } + if (styles.listFocusOutline) { + content.push(`.monaco-list${suffix}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused { outline: 1px solid ${styles.listFocusOutline}; outline-offset: -1px; }`); + content.push(`.monaco-list${suffix}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused { outline: inherit; }`); + content.push(`.monaco-workbench.context-menu-visible .monaco-list${suffix}.last-focused.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.passive-focused { outline: 1px solid ${styles.listFocusOutline}; outline-offset: -1px; }`); + content.push(`.monaco-workbench.context-menu-visible .monaco-list${suffix}.last-focused.sticky-scroll-focused .monaco-list-rows .monaco-list-row.focused { outline: inherit; }`); + content.push(`.monaco-workbench.context-menu-visible .monaco-list${suffix}.last-focused:not(.sticky-scroll-focused) .monaco-tree-sticky-container .monaco-list-rows .monaco-list-row.focused { outline: inherit; }`); + } + this.styleElement.textContent = content.join("\n"); + this.view.style(styles); + } + // Tree navigation + getParentElement(location) { + const parentRef = this.model.getParentNodeLocation(location); + const parentNode = this.model.getNode(parentRef); + return parentNode.element; + } + getFirstElementChild(location) { + return this.model.getFirstElementChild(location); + } + // Tree + getNode(location) { + return this.model.getNode(location); + } + getNodeLocation(node) { + return this.model.getNodeLocation(node); + } + collapse(location, recursive = false) { + return this.model.setCollapsed(location, true, recursive); + } + expand(location, recursive = false) { + return this.model.setCollapsed(location, false, recursive); + } + toggleCollapsed(location, recursive = false) { + return this.model.setCollapsed(location, void 0, recursive); + } + isCollapsible(location) { + return this.model.isCollapsible(location); + } + setCollapsible(location, collapsible) { + return this.model.setCollapsible(location, collapsible); + } + isCollapsed(location) { + return this.model.isCollapsed(location); + } + refilter() { + this._onWillRefilter.fire(void 0); + this.model.refilter(); + } + setSelection(elements, browserEvent) { + this.eventBufferer.bufferEvents(() => { + const nodes = elements.map((e) => this.model.getNode(e)); + this.selection.set(nodes, browserEvent); + const indexes = elements.map((e) => this.model.getListIndex(e)).filter((i) => i > -1); + this.view.setSelection(indexes, browserEvent, true); + }); + } + getSelection() { + return this.selection.get(); + } + setFocus(elements, browserEvent) { + this.eventBufferer.bufferEvents(() => { + const nodes = elements.map((e) => this.model.getNode(e)); + this.focus.set(nodes, browserEvent); + const indexes = elements.map((e) => this.model.getListIndex(e)).filter((i) => i > -1); + this.view.setFocus(indexes, browserEvent, true); + }); + } + focusNext(n = 1, loop = false, browserEvent, filter = isKeyboardEvent(browserEvent) && browserEvent.altKey ? void 0 : this.focusNavigationFilter) { + this.view.focusNext(n, loop, browserEvent, filter); + } + focusPrevious(n = 1, loop = false, browserEvent, filter = isKeyboardEvent(browserEvent) && browserEvent.altKey ? void 0 : this.focusNavigationFilter) { + this.view.focusPrevious(n, loop, browserEvent, filter); + } + focusNextPage(browserEvent, filter = isKeyboardEvent(browserEvent) && browserEvent.altKey ? void 0 : this.focusNavigationFilter) { + return this.view.focusNextPage(browserEvent, filter); + } + focusPreviousPage(browserEvent, filter = isKeyboardEvent(browserEvent) && browserEvent.altKey ? void 0 : this.focusNavigationFilter) { + return this.view.focusPreviousPage(browserEvent, filter, () => { + var _a10, _b4; + return (_b4 = (_a10 = this.stickyScrollController) === null || _a10 === void 0 ? void 0 : _a10.height) !== null && _b4 !== void 0 ? _b4 : 0; + }); + } + focusFirst(browserEvent, filter = isKeyboardEvent(browserEvent) && browserEvent.altKey ? void 0 : this.focusNavigationFilter) { + this.view.focusFirst(browserEvent, filter); + } + getFocus() { + return this.focus.get(); + } + reveal(location, relativeTop) { + this.model.expandTo(location); + const index = this.model.getListIndex(location); + if (index === -1) { + return; + } + if (!this.stickyScrollController) { + this.view.reveal(index, relativeTop); + } else { + const paddingTop = this.stickyScrollController.nodePositionTopBelowWidget(this.getNode(location)); + this.view.reveal(index, relativeTop, paddingTop); + } + } + // List + onLeftArrow(e) { + e.preventDefault(); + e.stopPropagation(); + const nodes = this.view.getFocusedElements(); + if (nodes.length === 0) { + return; + } + const node = nodes[0]; + const location = this.model.getNodeLocation(node); + const didChange = this.model.setCollapsed(location, true); + if (!didChange) { + const parentLocation = this.model.getParentNodeLocation(location); + if (!parentLocation) { + return; + } + const parentListIndex = this.model.getListIndex(parentLocation); + this.view.reveal(parentListIndex); + this.view.setFocus([parentListIndex]); + } + } + onRightArrow(e) { + e.preventDefault(); + e.stopPropagation(); + const nodes = this.view.getFocusedElements(); + if (nodes.length === 0) { + return; + } + const node = nodes[0]; + const location = this.model.getNodeLocation(node); + const didChange = this.model.setCollapsed(location, false); + if (!didChange) { + if (!node.children.some((child) => child.visible)) { + return; + } + const [focusedIndex] = this.view.getFocus(); + const firstChildIndex = focusedIndex + 1; + this.view.reveal(firstChildIndex); + this.view.setFocus([firstChildIndex]); + } + } + onSpace(e) { + e.preventDefault(); + e.stopPropagation(); + const nodes = this.view.getFocusedElements(); + if (nodes.length === 0) { + return; + } + const node = nodes[0]; + const location = this.model.getNodeLocation(node); + const recursive = e.browserEvent.altKey; + this.model.setCollapsed(location, void 0, recursive); + } + dispose() { + var _a10; + dispose(this.disposables); + (_a10 = this.stickyScrollController) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + this.view.dispose(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/tree/objectTreeModel.js +var ObjectTreeModel; +var init_objectTreeModel = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/tree/objectTreeModel.js"() { + init_indexTreeModel(); + init_tree(); + init_iterator(); + ObjectTreeModel = class { + constructor(user, list, options2 = {}) { + this.user = user; + this.rootRef = null; + this.nodes = /* @__PURE__ */ new Map(); + this.nodesByIdentity = /* @__PURE__ */ new Map(); + this.model = new IndexTreeModel(user, list, null, options2); + this.onDidSplice = this.model.onDidSplice; + this.onDidChangeCollapseState = this.model.onDidChangeCollapseState; + this.onDidChangeRenderNodeCount = this.model.onDidChangeRenderNodeCount; + if (options2.sorter) { + this.sorter = { + compare(a3, b) { + return options2.sorter.compare(a3.element, b.element); + } + }; + } + this.identityProvider = options2.identityProvider; + } + setChildren(element, children = Iterable.empty(), options2 = {}) { + const location = this.getElementLocation(element); + this._setChildren(location, this.preserveCollapseState(children), options2); + } + _setChildren(location, children = Iterable.empty(), options2) { + const insertedElements = /* @__PURE__ */ new Set(); + const insertedElementIds = /* @__PURE__ */ new Set(); + const onDidCreateNode = (node) => { + var _a10; + if (node.element === null) { + return; + } + const tnode = node; + insertedElements.add(tnode.element); + this.nodes.set(tnode.element, tnode); + if (this.identityProvider) { + const id = this.identityProvider.getId(tnode.element).toString(); + insertedElementIds.add(id); + this.nodesByIdentity.set(id, tnode); + } + (_a10 = options2.onDidCreateNode) === null || _a10 === void 0 ? void 0 : _a10.call(options2, tnode); + }; + const onDidDeleteNode = (node) => { + var _a10; + if (node.element === null) { + return; + } + const tnode = node; + if (!insertedElements.has(tnode.element)) { + this.nodes.delete(tnode.element); + } + if (this.identityProvider) { + const id = this.identityProvider.getId(tnode.element).toString(); + if (!insertedElementIds.has(id)) { + this.nodesByIdentity.delete(id); + } + } + (_a10 = options2.onDidDeleteNode) === null || _a10 === void 0 ? void 0 : _a10.call(options2, tnode); + }; + this.model.splice([...location, 0], Number.MAX_VALUE, children, __spreadProps(__spreadValues({}, options2), { onDidCreateNode, onDidDeleteNode })); + } + preserveCollapseState(elements = Iterable.empty()) { + if (this.sorter) { + elements = [...elements].sort(this.sorter.compare.bind(this.sorter)); + } + return Iterable.map(elements, (treeElement) => { + let node = this.nodes.get(treeElement.element); + if (!node && this.identityProvider) { + const id = this.identityProvider.getId(treeElement.element).toString(); + node = this.nodesByIdentity.get(id); + } + if (!node) { + let collapsed3; + if (typeof treeElement.collapsed === "undefined") { + collapsed3 = void 0; + } else if (treeElement.collapsed === ObjectTreeElementCollapseState.Collapsed || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrCollapsed) { + collapsed3 = true; + } else if (treeElement.collapsed === ObjectTreeElementCollapseState.Expanded || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrExpanded) { + collapsed3 = false; + } else { + collapsed3 = Boolean(treeElement.collapsed); + } + return __spreadProps(__spreadValues({}, treeElement), { + children: this.preserveCollapseState(treeElement.children), + collapsed: collapsed3 + }); + } + const collapsible = typeof treeElement.collapsible === "boolean" ? treeElement.collapsible : node.collapsible; + let collapsed2; + if (typeof treeElement.collapsed === "undefined" || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrCollapsed || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrExpanded) { + collapsed2 = node.collapsed; + } else if (treeElement.collapsed === ObjectTreeElementCollapseState.Collapsed) { + collapsed2 = true; + } else if (treeElement.collapsed === ObjectTreeElementCollapseState.Expanded) { + collapsed2 = false; + } else { + collapsed2 = Boolean(treeElement.collapsed); + } + return __spreadProps(__spreadValues({}, treeElement), { + collapsible, + collapsed: collapsed2, + children: this.preserveCollapseState(treeElement.children) + }); + }); + } + rerender(element) { + const location = this.getElementLocation(element); + this.model.rerender(location); + } + getFirstElementChild(ref = null) { + const location = this.getElementLocation(ref); + return this.model.getFirstElementChild(location); + } + has(element) { + return this.nodes.has(element); + } + getListIndex(element) { + const location = this.getElementLocation(element); + return this.model.getListIndex(location); + } + getListRenderCount(element) { + const location = this.getElementLocation(element); + return this.model.getListRenderCount(location); + } + isCollapsible(element) { + const location = this.getElementLocation(element); + return this.model.isCollapsible(location); + } + setCollapsible(element, collapsible) { + const location = this.getElementLocation(element); + return this.model.setCollapsible(location, collapsible); + } + isCollapsed(element) { + const location = this.getElementLocation(element); + return this.model.isCollapsed(location); + } + setCollapsed(element, collapsed2, recursive) { + const location = this.getElementLocation(element); + return this.model.setCollapsed(location, collapsed2, recursive); + } + expandTo(element) { + const location = this.getElementLocation(element); + this.model.expandTo(location); + } + refilter() { + this.model.refilter(); + } + getNode(element = null) { + if (element === null) { + return this.model.getNode(this.model.rootRef); + } + const node = this.nodes.get(element); + if (!node) { + throw new TreeError(this.user, `Tree element not found: ${element}`); + } + return node; + } + getNodeLocation(node) { + return node.element; + } + getParentNodeLocation(element) { + if (element === null) { + throw new TreeError(this.user, `Invalid getParentNodeLocation call`); + } + const node = this.nodes.get(element); + if (!node) { + throw new TreeError(this.user, `Tree element not found: ${element}`); + } + const location = this.model.getNodeLocation(node); + const parentLocation = this.model.getParentNodeLocation(location); + const parent = this.model.getNode(parentLocation); + return parent.element; + } + getElementLocation(element) { + if (element === null) { + return []; + } + const node = this.nodes.get(element); + if (!node) { + throw new TreeError(this.user, `Tree element not found: ${element}`); + } + return this.model.getNodeLocation(node); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/tree/compressedObjectTreeModel.js +function noCompress(element) { + const elements = [element.element]; + const incompressible = element.incompressible || false; + return { + element: { elements, incompressible }, + children: Iterable.map(Iterable.from(element.children), noCompress), + collapsible: element.collapsible, + collapsed: element.collapsed + }; +} +function compress(element) { + const elements = [element.element]; + const incompressible = element.incompressible || false; + let childrenIterator; + let children; + while (true) { + [children, childrenIterator] = Iterable.consume(Iterable.from(element.children), 2); + if (children.length !== 1) { + break; + } + if (children[0].incompressible) { + break; + } + element = children[0]; + elements.push(element.element); + } + return { + element: { elements, incompressible }, + children: Iterable.map(Iterable.concat(children, childrenIterator), compress), + collapsible: element.collapsible, + collapsed: element.collapsed + }; +} +function _decompress(element, index = 0) { + let children; + if (index < element.element.elements.length - 1) { + children = [_decompress(element, index + 1)]; + } else { + children = Iterable.map(Iterable.from(element.children), (el) => _decompress(el, 0)); + } + if (index === 0 && element.element.incompressible) { + return { + element: element.element.elements[index], + children, + incompressible: true, + collapsible: element.collapsible, + collapsed: element.collapsed + }; + } + return { + element: element.element.elements[index], + children, + collapsible: element.collapsible, + collapsed: element.collapsed + }; +} +function decompress(element) { + return _decompress(element, 0); +} +function splice2(treeElement, element, children) { + if (treeElement.element === element) { + return __spreadProps(__spreadValues({}, treeElement), { children }); + } + return __spreadProps(__spreadValues({}, treeElement), { children: Iterable.map(Iterable.from(treeElement.children), (e) => splice2(e, element, children)) }); +} +function mapList(nodeMapper, list) { + return { + splice(start, deleteCount, toInsert) { + list.splice(start, deleteCount, toInsert.map((node) => nodeMapper.map(node))); + }, + updateElementHeight(index, height) { + list.updateElementHeight(index, height); + } + }; +} +function mapOptions(compressedNodeUnwrapper, options2) { + return __spreadProps(__spreadValues({}, options2), { + identityProvider: options2.identityProvider && { + getId(node) { + return options2.identityProvider.getId(compressedNodeUnwrapper(node)); + } + }, + sorter: options2.sorter && { + compare(node, otherNode) { + return options2.sorter.compare(node.elements[0], otherNode.elements[0]); + } + }, + filter: options2.filter && { + filter(node, parentVisibility) { + return options2.filter.filter(compressedNodeUnwrapper(node), parentVisibility); + } + } + }); +} +var wrapIdentityProvider, CompressedObjectTreeModel, DefaultElementMapper, CompressedTreeNodeWrapper, CompressibleObjectTreeModel; +var init_compressedObjectTreeModel = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/tree/compressedObjectTreeModel.js"() { + init_objectTreeModel(); + init_tree(); + init_arrays(); + init_event(); + init_iterator(); + wrapIdentityProvider = (base) => ({ + getId(node) { + return node.elements.map((e) => base.getId(e).toString()).join("\0"); + } + }); + CompressedObjectTreeModel = class { + get onDidSplice() { + return this.model.onDidSplice; + } + get onDidChangeCollapseState() { + return this.model.onDidChangeCollapseState; + } + get onDidChangeRenderNodeCount() { + return this.model.onDidChangeRenderNodeCount; + } + constructor(user, list, options2 = {}) { + this.user = user; + this.rootRef = null; + this.nodes = /* @__PURE__ */ new Map(); + this.model = new ObjectTreeModel(user, list, options2); + this.enabled = typeof options2.compressionEnabled === "undefined" ? true : options2.compressionEnabled; + this.identityProvider = options2.identityProvider; + } + setChildren(element, children = Iterable.empty(), options2) { + const diffIdentityProvider = options2.diffIdentityProvider && wrapIdentityProvider(options2.diffIdentityProvider); + if (element === null) { + const compressedChildren = Iterable.map(children, this.enabled ? compress : noCompress); + this._setChildren(null, compressedChildren, { diffIdentityProvider, diffDepth: Infinity }); + return; + } + const compressedNode = this.nodes.get(element); + if (!compressedNode) { + throw new TreeError(this.user, "Unknown compressed tree node"); + } + const node = this.model.getNode(compressedNode); + const compressedParentNode = this.model.getParentNodeLocation(compressedNode); + const parent = this.model.getNode(compressedParentNode); + const decompressedElement = decompress(node); + const splicedElement = splice2(decompressedElement, element, children); + const recompressedElement = (this.enabled ? compress : noCompress)(splicedElement); + const elementComparator = options2.diffIdentityProvider ? (a3, b) => options2.diffIdentityProvider.getId(a3) === options2.diffIdentityProvider.getId(b) : void 0; + if (equals(recompressedElement.element.elements, node.element.elements, elementComparator)) { + this._setChildren(compressedNode, recompressedElement.children || Iterable.empty(), { diffIdentityProvider, diffDepth: 1 }); + return; + } + const parentChildren = parent.children.map((child) => child === node ? recompressedElement : child); + this._setChildren(parent.element, parentChildren, { + diffIdentityProvider, + diffDepth: node.depth - parent.depth + }); + } + isCompressionEnabled() { + return this.enabled; + } + setCompressionEnabled(enabled) { + if (enabled === this.enabled) { + return; + } + this.enabled = enabled; + const root = this.model.getNode(); + const rootChildren = root.children; + const decompressedRootChildren = Iterable.map(rootChildren, decompress); + const recompressedRootChildren = Iterable.map(decompressedRootChildren, enabled ? compress : noCompress); + this._setChildren(null, recompressedRootChildren, { + diffIdentityProvider: this.identityProvider, + diffDepth: Infinity + }); + } + _setChildren(node, children, options2) { + const insertedElements = /* @__PURE__ */ new Set(); + const onDidCreateNode = (node2) => { + for (const element of node2.element.elements) { + insertedElements.add(element); + this.nodes.set(element, node2.element); + } + }; + const onDidDeleteNode = (node2) => { + for (const element of node2.element.elements) { + if (!insertedElements.has(element)) { + this.nodes.delete(element); + } + } + }; + this.model.setChildren(node, children, __spreadProps(__spreadValues({}, options2), { onDidCreateNode, onDidDeleteNode })); + } + has(element) { + return this.nodes.has(element); + } + getListIndex(location) { + const node = this.getCompressedNode(location); + return this.model.getListIndex(node); + } + getListRenderCount(location) { + const node = this.getCompressedNode(location); + return this.model.getListRenderCount(node); + } + getNode(location) { + if (typeof location === "undefined") { + return this.model.getNode(); + } + const node = this.getCompressedNode(location); + return this.model.getNode(node); + } + // TODO: review this + getNodeLocation(node) { + const compressedNode = this.model.getNodeLocation(node); + if (compressedNode === null) { + return null; + } + return compressedNode.elements[compressedNode.elements.length - 1]; + } + // TODO: review this + getParentNodeLocation(location) { + const compressedNode = this.getCompressedNode(location); + const parentNode = this.model.getParentNodeLocation(compressedNode); + if (parentNode === null) { + return null; + } + return parentNode.elements[parentNode.elements.length - 1]; + } + getFirstElementChild(location) { + const compressedNode = this.getCompressedNode(location); + return this.model.getFirstElementChild(compressedNode); + } + isCollapsible(location) { + const compressedNode = this.getCompressedNode(location); + return this.model.isCollapsible(compressedNode); + } + setCollapsible(location, collapsible) { + const compressedNode = this.getCompressedNode(location); + return this.model.setCollapsible(compressedNode, collapsible); + } + isCollapsed(location) { + const compressedNode = this.getCompressedNode(location); + return this.model.isCollapsed(compressedNode); + } + setCollapsed(location, collapsed2, recursive) { + const compressedNode = this.getCompressedNode(location); + return this.model.setCollapsed(compressedNode, collapsed2, recursive); + } + expandTo(location) { + const compressedNode = this.getCompressedNode(location); + this.model.expandTo(compressedNode); + } + rerender(location) { + const compressedNode = this.getCompressedNode(location); + this.model.rerender(compressedNode); + } + refilter() { + this.model.refilter(); + } + getCompressedNode(element) { + if (element === null) { + return null; + } + const node = this.nodes.get(element); + if (!node) { + throw new TreeError(this.user, `Tree element not found: ${element}`); + } + return node; + } + }; + DefaultElementMapper = (elements) => elements[elements.length - 1]; + CompressedTreeNodeWrapper = class _CompressedTreeNodeWrapper { + get element() { + return this.node.element === null ? null : this.unwrapper(this.node.element); + } + get children() { + return this.node.children.map((node) => new _CompressedTreeNodeWrapper(this.unwrapper, node)); + } + get depth() { + return this.node.depth; + } + get visibleChildrenCount() { + return this.node.visibleChildrenCount; + } + get visibleChildIndex() { + return this.node.visibleChildIndex; + } + get collapsible() { + return this.node.collapsible; + } + get collapsed() { + return this.node.collapsed; + } + get visible() { + return this.node.visible; + } + get filterData() { + return this.node.filterData; + } + constructor(unwrapper, node) { + this.unwrapper = unwrapper; + this.node = node; + } + }; + CompressibleObjectTreeModel = class { + get onDidSplice() { + return Event.map(this.model.onDidSplice, ({ insertedNodes, deletedNodes }) => ({ + insertedNodes: insertedNodes.map((node) => this.nodeMapper.map(node)), + deletedNodes: deletedNodes.map((node) => this.nodeMapper.map(node)) + })); + } + get onDidChangeCollapseState() { + return Event.map(this.model.onDidChangeCollapseState, ({ node, deep }) => ({ + node: this.nodeMapper.map(node), + deep + })); + } + get onDidChangeRenderNodeCount() { + return Event.map(this.model.onDidChangeRenderNodeCount, (node) => this.nodeMapper.map(node)); + } + constructor(user, list, options2 = {}) { + this.rootRef = null; + this.elementMapper = options2.elementMapper || DefaultElementMapper; + const compressedNodeUnwrapper = (node) => this.elementMapper(node.elements); + this.nodeMapper = new WeakMapper((node) => new CompressedTreeNodeWrapper(compressedNodeUnwrapper, node)); + this.model = new CompressedObjectTreeModel(user, mapList(this.nodeMapper, list), mapOptions(compressedNodeUnwrapper, options2)); + } + setChildren(element, children = Iterable.empty(), options2 = {}) { + this.model.setChildren(element, children, options2); + } + isCompressionEnabled() { + return this.model.isCompressionEnabled(); + } + setCompressionEnabled(enabled) { + this.model.setCompressionEnabled(enabled); + } + has(location) { + return this.model.has(location); + } + getListIndex(location) { + return this.model.getListIndex(location); + } + getListRenderCount(location) { + return this.model.getListRenderCount(location); + } + getNode(location) { + return this.nodeMapper.map(this.model.getNode(location)); + } + getNodeLocation(node) { + return node.element; + } + getParentNodeLocation(location) { + return this.model.getParentNodeLocation(location); + } + getFirstElementChild(location) { + const result = this.model.getFirstElementChild(location); + if (result === null || typeof result === "undefined") { + return result; + } + return this.elementMapper(result.elements); + } + isCollapsible(location) { + return this.model.isCollapsible(location); + } + setCollapsible(location, collapsed2) { + return this.model.setCollapsible(location, collapsed2); + } + isCollapsed(location) { + return this.model.isCollapsed(location); + } + setCollapsed(location, collapsed2, recursive) { + return this.model.setCollapsed(location, collapsed2, recursive); + } + expandTo(location) { + return this.model.expandTo(location); + } + rerender(location) { + return this.model.rerender(location); + } + refilter() { + return this.model.refilter(); + } + getCompressedTreeNode(location = null) { + return this.model.getNode(location); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/tree/objectTree.js +function asObjectTreeOptions(compressedTreeNodeProvider, options2) { + return options2 && __spreadProps(__spreadValues({}, options2), { + keyboardNavigationLabelProvider: options2.keyboardNavigationLabelProvider && { + getKeyboardNavigationLabel(e) { + let compressedTreeNode; + try { + compressedTreeNode = compressedTreeNodeProvider().getCompressedTreeNode(e); + } catch (_a10) { + return options2.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(e); + } + if (compressedTreeNode.element.elements.length === 1) { + return options2.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(e); + } else { + return options2.keyboardNavigationLabelProvider.getCompressedNodeKeyboardNavigationLabel(compressedTreeNode.element.elements); + } + } + } + }); +} +var __decorate37, ObjectTree, CompressibleRenderer, CompressibleStickyScrollDelegate, CompressibleObjectTree; +var init_objectTree = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/tree/objectTree.js"() { + init_abstractTree(); + init_compressedObjectTreeModel(); + init_objectTreeModel(); + init_decorators(); + init_iterator(); + __decorate37 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + ObjectTree = class extends AbstractTree { + get onDidChangeCollapseState() { + return this.model.onDidChangeCollapseState; + } + constructor(user, container, delegate, renderers, options2 = {}) { + super(user, container, delegate, renderers, options2); + this.user = user; + } + setChildren(element, children = Iterable.empty(), options2) { + this.model.setChildren(element, children, options2); + } + rerender(element) { + if (element === void 0) { + this.view.rerender(); + return; + } + this.model.rerender(element); + } + hasElement(element) { + return this.model.has(element); + } + createModel(user, view, options2) { + return new ObjectTreeModel(user, view, options2); + } + }; + CompressibleRenderer = class { + get compressedTreeNodeProvider() { + return this._compressedTreeNodeProvider(); + } + constructor(_compressedTreeNodeProvider, stickyScrollDelegate, renderer) { + this._compressedTreeNodeProvider = _compressedTreeNodeProvider; + this.stickyScrollDelegate = stickyScrollDelegate; + this.renderer = renderer; + this.templateId = renderer.templateId; + if (renderer.onDidChangeTwistieState) { + this.onDidChangeTwistieState = renderer.onDidChangeTwistieState; + } + } + renderTemplate(container) { + const data = this.renderer.renderTemplate(container); + return { compressedTreeNode: void 0, data }; + } + renderElement(node, index, templateData, height) { + let compressedTreeNode = this.stickyScrollDelegate.getCompressedNode(node); + if (!compressedTreeNode) { + compressedTreeNode = this.compressedTreeNodeProvider.getCompressedTreeNode(node.element); + } + if (compressedTreeNode.element.elements.length === 1) { + templateData.compressedTreeNode = void 0; + this.renderer.renderElement(node, index, templateData.data, height); + } else { + templateData.compressedTreeNode = compressedTreeNode; + this.renderer.renderCompressedElements(compressedTreeNode, index, templateData.data, height); + } + } + disposeElement(node, index, templateData, height) { + var _a10, _b4, _c2, _d2; + if (templateData.compressedTreeNode) { + (_b4 = (_a10 = this.renderer).disposeCompressedElements) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, templateData.compressedTreeNode, index, templateData.data, height); + } else { + (_d2 = (_c2 = this.renderer).disposeElement) === null || _d2 === void 0 ? void 0 : _d2.call(_c2, node, index, templateData.data, height); + } + } + disposeTemplate(templateData) { + this.renderer.disposeTemplate(templateData.data); + } + renderTwistie(element, twistieElement) { + if (this.renderer.renderTwistie) { + return this.renderer.renderTwistie(element, twistieElement); + } + return false; + } + }; + __decorate37([ + memoize + ], CompressibleRenderer.prototype, "compressedTreeNodeProvider", null); + CompressibleStickyScrollDelegate = class { + constructor(modelProvider) { + this.modelProvider = modelProvider; + this.compressedStickyNodes = /* @__PURE__ */ new Map(); + } + getCompressedNode(node) { + return this.compressedStickyNodes.get(node); + } + constrainStickyScrollNodes(stickyNodes, stickyScrollMaxItemCount, maxWidgetHeight) { + this.compressedStickyNodes.clear(); + if (stickyNodes.length === 0) { + return []; + } + for (let i = 0; i < stickyNodes.length; i++) { + const stickyNode = stickyNodes[i]; + const stickyNodeBottom = stickyNode.position + stickyNode.height; + const followingReachesMaxHeight = i + 1 < stickyNodes.length && stickyNodeBottom + stickyNodes[i + 1].height > maxWidgetHeight; + if (followingReachesMaxHeight || i >= stickyScrollMaxItemCount - 1 && stickyScrollMaxItemCount < stickyNodes.length) { + const uncompressedStickyNodes = stickyNodes.slice(0, i); + const overflowingStickyNodes = stickyNodes.slice(i); + const compressedStickyNode = this.compressStickyNodes(overflowingStickyNodes); + return [...uncompressedStickyNodes, compressedStickyNode]; + } + } + return stickyNodes; + } + compressStickyNodes(stickyNodes) { + if (stickyNodes.length === 0) { + throw new Error("Can't compress empty sticky nodes"); + } + const compressionModel = this.modelProvider(); + if (!compressionModel.isCompressionEnabled()) { + return stickyNodes[0]; + } + const elements = []; + for (let i = 0; i < stickyNodes.length; i++) { + const stickyNode = stickyNodes[i]; + const compressedNode2 = compressionModel.getCompressedTreeNode(stickyNode.node.element); + if (compressedNode2.element) { + if (i !== 0 && compressedNode2.element.incompressible) { + break; + } + elements.push(...compressedNode2.element.elements); + } + } + if (elements.length < 2) { + return stickyNodes[0]; + } + const lastStickyNode = stickyNodes[stickyNodes.length - 1]; + const compressedElement = { elements, incompressible: false }; + const compressedNode = __spreadProps(__spreadValues({}, lastStickyNode.node), { children: [], element: compressedElement }); + const stickyTreeNode = new Proxy(stickyNodes[0].node, {}); + const compressedStickyNode = { + node: stickyTreeNode, + startIndex: stickyNodes[0].startIndex, + endIndex: lastStickyNode.endIndex, + position: stickyNodes[0].position, + height: stickyNodes[0].height + }; + this.compressedStickyNodes.set(stickyTreeNode, compressedNode); + return compressedStickyNode; + } + }; + CompressibleObjectTree = class extends ObjectTree { + constructor(user, container, delegate, renderers, options2 = {}) { + const compressedTreeNodeProvider = () => this; + const stickyScrollDelegate = new CompressibleStickyScrollDelegate(() => this.model); + const compressibleRenderers = renderers.map((r) => new CompressibleRenderer(compressedTreeNodeProvider, stickyScrollDelegate, r)); + super(user, container, delegate, compressibleRenderers, __spreadProps(__spreadValues({}, asObjectTreeOptions(compressedTreeNodeProvider, options2)), { stickyScrollDelegate })); + } + setChildren(element, children = Iterable.empty(), options2) { + this.model.setChildren(element, children, options2); + } + createModel(user, view, options2) { + return new CompressibleObjectTreeModel(user, view, options2); + } + updateOptions(optionsUpdate = {}) { + super.updateOptions(optionsUpdate); + if (typeof optionsUpdate.compressionEnabled !== "undefined") { + this.model.setCompressionEnabled(optionsUpdate.compressionEnabled); + } + } + getCompressedTreeNode(element = null) { + return this.model.getCompressedTreeNode(element); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/tree/asyncDataTree.js +function createAsyncDataTreeNode(props) { + return __spreadProps(__spreadValues({}, props), { + children: [], + refreshPromise: void 0, + stale: true, + slow: false, + forceExpanded: false + }); +} +function isAncestor2(ancestor, descendant) { + if (!descendant.parent) { + return false; + } else if (descendant.parent === ancestor) { + return true; + } else { + return isAncestor2(ancestor, descendant.parent); + } +} +function intersects(node, other) { + return node === other || isAncestor2(node, other) || isAncestor2(other, node); +} +function asTreeEvent(e) { + return { + browserEvent: e.browserEvent, + elements: e.elements.map((e2) => e2.element) + }; +} +function asTreeMouseEvent2(e) { + return { + browserEvent: e.browserEvent, + element: e.element && e.element.element, + target: e.target + }; +} +function asAsyncDataTreeDragAndDropData(data) { + if (data instanceof ElementsDragAndDropData) { + return new AsyncDataTreeElementsDragAndDropData(data); + } + return data; +} +function asObjectTreeOptions2(options2) { + return options2 && __spreadProps(__spreadValues({}, options2), { + collapseByDefault: true, + identityProvider: options2.identityProvider && { + getId(el) { + return options2.identityProvider.getId(el.element); + } + }, + dnd: options2.dnd && new AsyncDataTreeNodeListDragAndDrop(options2.dnd), + multipleSelectionController: options2.multipleSelectionController && { + isSelectionSingleChangeEvent(e) { + return options2.multipleSelectionController.isSelectionSingleChangeEvent(__spreadProps(__spreadValues({}, e), { element: e.element })); + }, + isSelectionRangeChangeEvent(e) { + return options2.multipleSelectionController.isSelectionRangeChangeEvent(__spreadProps(__spreadValues({}, e), { element: e.element })); + } + }, + accessibilityProvider: options2.accessibilityProvider && __spreadProps(__spreadValues({}, options2.accessibilityProvider), { + getPosInSet: void 0, + getSetSize: void 0, + getRole: options2.accessibilityProvider.getRole ? (el) => { + return options2.accessibilityProvider.getRole(el.element); + } : () => "treeitem", + isChecked: options2.accessibilityProvider.isChecked ? (e) => { + var _a10; + return !!((_a10 = options2.accessibilityProvider) === null || _a10 === void 0 ? void 0 : _a10.isChecked(e.element)); + } : void 0, + getAriaLabel(e) { + return options2.accessibilityProvider.getAriaLabel(e.element); + }, + getWidgetAriaLabel() { + return options2.accessibilityProvider.getWidgetAriaLabel(); + }, + getWidgetRole: options2.accessibilityProvider.getWidgetRole ? () => options2.accessibilityProvider.getWidgetRole() : () => "tree", + getAriaLevel: options2.accessibilityProvider.getAriaLevel && ((node) => { + return options2.accessibilityProvider.getAriaLevel(node.element); + }), + getActiveDescendantId: options2.accessibilityProvider.getActiveDescendantId && ((node) => { + return options2.accessibilityProvider.getActiveDescendantId(node.element); + }) + }), + filter: options2.filter && { + filter(e, parentVisibility) { + return options2.filter.filter(e.element, parentVisibility); + } + }, + keyboardNavigationLabelProvider: options2.keyboardNavigationLabelProvider && __spreadProps(__spreadValues({}, options2.keyboardNavigationLabelProvider), { + getKeyboardNavigationLabel(e) { + return options2.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(e.element); + } + }), + sorter: void 0, + expandOnlyOnTwistieClick: typeof options2.expandOnlyOnTwistieClick === "undefined" ? void 0 : typeof options2.expandOnlyOnTwistieClick !== "function" ? options2.expandOnlyOnTwistieClick : (e) => options2.expandOnlyOnTwistieClick(e.element), + defaultFindVisibility: (e) => { + if (e.hasChildren && e.stale) { + return 1; + } else if (typeof options2.defaultFindVisibility === "number") { + return options2.defaultFindVisibility; + } else if (typeof options2.defaultFindVisibility === "undefined") { + return 2; + } else { + return options2.defaultFindVisibility(e.element); + } + } + }); +} +function dfs2(node, fn) { + fn(node); + node.children.forEach((child) => dfs2(child, fn)); +} +function asCompressibleObjectTreeOptions(options2) { + const objectTreeOptions = options2 && asObjectTreeOptions2(options2); + return objectTreeOptions && __spreadProps(__spreadValues({}, objectTreeOptions), { + keyboardNavigationLabelProvider: objectTreeOptions.keyboardNavigationLabelProvider && __spreadProps(__spreadValues({}, objectTreeOptions.keyboardNavigationLabelProvider), { + getCompressedNodeKeyboardNavigationLabel(els) { + return options2.keyboardNavigationLabelProvider.getCompressedNodeKeyboardNavigationLabel(els.map((e) => e.element)); + } + }) + }); +} +function getVisibility(filterResult) { + if (typeof filterResult === "boolean") { + return filterResult ? 1 : 0; + } else if (isFilterResult(filterResult)) { + return getVisibleState(filterResult.visibility); + } else { + return getVisibleState(filterResult); + } +} +var AsyncDataTreeNodeWrapper, AsyncDataTreeRenderer, AsyncDataTreeElementsDragAndDropData, AsyncDataTreeNodeListDragAndDrop, AsyncDataTree, CompressibleAsyncDataTreeNodeWrapper, CompressibleAsyncDataTreeRenderer, CompressibleAsyncDataTree; +var init_asyncDataTree = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/tree/asyncDataTree.js"() { + init_listView(); + init_abstractTree(); + init_indexTreeModel(); + init_objectTree(); + init_tree(); + init_async(); + init_codicons(); + init_themables(); + init_errors(); + init_event(); + init_iterator(); + init_lifecycle(); + init_types(); + AsyncDataTreeNodeWrapper = class _AsyncDataTreeNodeWrapper { + get element() { + return this.node.element.element; + } + get children() { + return this.node.children.map((node) => new _AsyncDataTreeNodeWrapper(node)); + } + get depth() { + return this.node.depth; + } + get visibleChildrenCount() { + return this.node.visibleChildrenCount; + } + get visibleChildIndex() { + return this.node.visibleChildIndex; + } + get collapsible() { + return this.node.collapsible; + } + get collapsed() { + return this.node.collapsed; + } + get visible() { + return this.node.visible; + } + get filterData() { + return this.node.filterData; + } + constructor(node) { + this.node = node; + } + }; + AsyncDataTreeRenderer = class { + constructor(renderer, nodeMapper, onDidChangeTwistieState) { + this.renderer = renderer; + this.nodeMapper = nodeMapper; + this.onDidChangeTwistieState = onDidChangeTwistieState; + this.renderedNodes = /* @__PURE__ */ new Map(); + this.templateId = renderer.templateId; + } + renderTemplate(container) { + const templateData = this.renderer.renderTemplate(container); + return { templateData }; + } + renderElement(node, index, templateData, height) { + this.renderer.renderElement(this.nodeMapper.map(node), index, templateData.templateData, height); + } + renderTwistie(element, twistieElement) { + if (element.slow) { + twistieElement.classList.add(...ThemeIcon.asClassNameArray(Codicon.treeItemLoading)); + return true; + } else { + twistieElement.classList.remove(...ThemeIcon.asClassNameArray(Codicon.treeItemLoading)); + return false; + } + } + disposeElement(node, index, templateData, height) { + var _a10, _b4; + (_b4 = (_a10 = this.renderer).disposeElement) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, this.nodeMapper.map(node), index, templateData.templateData, height); + } + disposeTemplate(templateData) { + this.renderer.disposeTemplate(templateData.templateData); + } + dispose() { + this.renderedNodes.clear(); + } + }; + AsyncDataTreeElementsDragAndDropData = class extends ElementsDragAndDropData { + constructor(data) { + super(data.elements.map((node) => node.element)); + this.data = data; + } + }; + AsyncDataTreeNodeListDragAndDrop = class { + constructor(dnd) { + this.dnd = dnd; + } + getDragURI(node) { + return this.dnd.getDragURI(node.element); + } + getDragLabel(nodes, originalEvent) { + if (this.dnd.getDragLabel) { + return this.dnd.getDragLabel(nodes.map((node) => node.element), originalEvent); + } + return void 0; + } + onDragStart(data, originalEvent) { + var _a10, _b4; + (_b4 = (_a10 = this.dnd).onDragStart) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, asAsyncDataTreeDragAndDropData(data), originalEvent); + } + onDragOver(data, targetNode, targetIndex, targetSector, originalEvent, raw = true) { + return this.dnd.onDragOver(asAsyncDataTreeDragAndDropData(data), targetNode && targetNode.element, targetIndex, targetSector, originalEvent); + } + drop(data, targetNode, targetIndex, targetSector, originalEvent) { + this.dnd.drop(asAsyncDataTreeDragAndDropData(data), targetNode && targetNode.element, targetIndex, targetSector, originalEvent); + } + onDragEnd(originalEvent) { + var _a10, _b4; + (_b4 = (_a10 = this.dnd).onDragEnd) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, originalEvent); + } + dispose() { + this.dnd.dispose(); + } + }; + AsyncDataTree = class { + get onDidScroll() { + return this.tree.onDidScroll; + } + get onDidChangeFocus() { + return Event.map(this.tree.onDidChangeFocus, asTreeEvent); + } + get onDidChangeSelection() { + return Event.map(this.tree.onDidChangeSelection, asTreeEvent); + } + get onMouseDblClick() { + return Event.map(this.tree.onMouseDblClick, asTreeMouseEvent2); + } + get onPointer() { + return Event.map(this.tree.onPointer, asTreeMouseEvent2); + } + get onDidFocus() { + return this.tree.onDidFocus; + } + /** + * To be used internally only! + * @deprecated + */ + get onDidChangeModel() { + return this.tree.onDidChangeModel; + } + get onDidChangeCollapseState() { + return this.tree.onDidChangeCollapseState; + } + get onDidChangeFindOpenState() { + return this.tree.onDidChangeFindOpenState; + } + get onDidChangeStickyScrollFocused() { + return this.tree.onDidChangeStickyScrollFocused; + } + get onDidDispose() { + return this.tree.onDidDispose; + } + constructor(user, container, delegate, renderers, dataSource, options2 = {}) { + this.user = user; + this.dataSource = dataSource; + this.nodes = /* @__PURE__ */ new Map(); + this.subTreeRefreshPromises = /* @__PURE__ */ new Map(); + this.refreshPromises = /* @__PURE__ */ new Map(); + this._onDidRender = new Emitter(); + this._onDidChangeNodeSlowState = new Emitter(); + this.nodeMapper = new WeakMapper((node) => new AsyncDataTreeNodeWrapper(node)); + this.disposables = new DisposableStore(); + this.identityProvider = options2.identityProvider; + this.autoExpandSingleChildren = typeof options2.autoExpandSingleChildren === "undefined" ? false : options2.autoExpandSingleChildren; + this.sorter = options2.sorter; + this.getDefaultCollapseState = (e) => options2.collapseByDefault ? options2.collapseByDefault(e) ? ObjectTreeElementCollapseState.PreserveOrCollapsed : ObjectTreeElementCollapseState.PreserveOrExpanded : void 0; + this.tree = this.createTree(user, container, delegate, renderers, options2); + this.onDidChangeFindMode = this.tree.onDidChangeFindMode; + this.onDidChangeFindMatchType = this.tree.onDidChangeFindMatchType; + this.root = createAsyncDataTreeNode({ + element: void 0, + parent: null, + hasChildren: true, + defaultCollapseState: void 0 + }); + if (this.identityProvider) { + this.root = __spreadProps(__spreadValues({}, this.root), { + id: null + }); + } + this.nodes.set(null, this.root); + this.tree.onDidChangeCollapseState(this._onDidChangeCollapseState, this, this.disposables); + } + createTree(user, container, delegate, renderers, options2) { + const objectTreeDelegate = new ComposedTreeDelegate(delegate); + const objectTreeRenderers = renderers.map((r) => new AsyncDataTreeRenderer(r, this.nodeMapper, this._onDidChangeNodeSlowState.event)); + const objectTreeOptions = asObjectTreeOptions2(options2) || {}; + return new ObjectTree(user, container, objectTreeDelegate, objectTreeRenderers, objectTreeOptions); + } + updateOptions(options2 = {}) { + this.tree.updateOptions(options2); + } + // Widget + getHTMLElement() { + return this.tree.getHTMLElement(); + } + get scrollTop() { + return this.tree.scrollTop; + } + set scrollTop(scrollTop) { + this.tree.scrollTop = scrollTop; + } + get scrollHeight() { + return this.tree.scrollHeight; + } + get renderHeight() { + return this.tree.renderHeight; + } + domFocus() { + this.tree.domFocus(); + } + layout(height, width2) { + this.tree.layout(height, width2); + } + style(styles) { + this.tree.style(styles); + } + // Model + getInput() { + return this.root.element; + } + setInput(input, viewState) { + return __async(this, null, function* () { + this.refreshPromises.forEach((promise) => promise.cancel()); + this.refreshPromises.clear(); + this.root.element = input; + const viewStateContext = viewState && { viewState, focus: [], selection: [] }; + yield this._updateChildren(input, true, false, viewStateContext); + if (viewStateContext) { + this.tree.setFocus(viewStateContext.focus); + this.tree.setSelection(viewStateContext.selection); + } + if (viewState && typeof viewState.scrollTop === "number") { + this.scrollTop = viewState.scrollTop; + } + }); + } + _updateChildren() { + return __async(this, arguments, function* (element = this.root.element, recursive = true, rerender = false, viewStateContext, options2) { + if (typeof this.root.element === "undefined") { + throw new TreeError(this.user, "Tree input not set"); + } + if (this.root.refreshPromise) { + yield this.root.refreshPromise; + yield Event.toPromise(this._onDidRender.event); + } + const node = this.getDataNode(element); + yield this.refreshAndRenderNode(node, recursive, viewStateContext, options2); + if (rerender) { + try { + this.tree.rerender(node); + } catch (_a10) { + } + } + }); + } + // View + rerender(element) { + if (element === void 0 || element === this.root.element) { + this.tree.rerender(); + return; + } + const node = this.getDataNode(element); + this.tree.rerender(node); + } + // Tree + getNode(element = this.root.element) { + const dataNode = this.getDataNode(element); + const node = this.tree.getNode(dataNode === this.root ? null : dataNode); + return this.nodeMapper.map(node); + } + collapse(element, recursive = false) { + const node = this.getDataNode(element); + return this.tree.collapse(node === this.root ? null : node, recursive); + } + expand(element, recursive = false) { + return __async(this, null, function* () { + if (typeof this.root.element === "undefined") { + throw new TreeError(this.user, "Tree input not set"); + } + if (this.root.refreshPromise) { + yield this.root.refreshPromise; + yield Event.toPromise(this._onDidRender.event); + } + const node = this.getDataNode(element); + if (this.tree.hasElement(node) && !this.tree.isCollapsible(node)) { + return false; + } + if (node.refreshPromise) { + yield this.root.refreshPromise; + yield Event.toPromise(this._onDidRender.event); + } + if (node !== this.root && !node.refreshPromise && !this.tree.isCollapsed(node)) { + return false; + } + const result = this.tree.expand(node === this.root ? null : node, recursive); + if (node.refreshPromise) { + yield this.root.refreshPromise; + yield Event.toPromise(this._onDidRender.event); + } + return result; + }); + } + setSelection(elements, browserEvent) { + const nodes = elements.map((e) => this.getDataNode(e)); + this.tree.setSelection(nodes, browserEvent); + } + getSelection() { + const nodes = this.tree.getSelection(); + return nodes.map((n) => n.element); + } + setFocus(elements, browserEvent) { + const nodes = elements.map((e) => this.getDataNode(e)); + this.tree.setFocus(nodes, browserEvent); + } + getFocus() { + const nodes = this.tree.getFocus(); + return nodes.map((n) => n.element); + } + reveal(element, relativeTop) { + this.tree.reveal(this.getDataNode(element), relativeTop); + } + // Tree navigation + getParentElement(element) { + const node = this.tree.getParentElement(this.getDataNode(element)); + return node && node.element; + } + getFirstElementChild(element = this.root.element) { + const dataNode = this.getDataNode(element); + const node = this.tree.getFirstElementChild(dataNode === this.root ? null : dataNode); + return node && node.element; + } + // Implementation + getDataNode(element) { + const node = this.nodes.get(element === this.root.element ? null : element); + if (!node) { + throw new TreeError(this.user, `Data tree node not found: ${element}`); + } + return node; + } + refreshAndRenderNode(node, recursive, viewStateContext, options2) { + return __async(this, null, function* () { + yield this.refreshNode(node, recursive, viewStateContext); + if (this.disposables.isDisposed) { + return; + } + this.render(node, viewStateContext, options2); + }); + } + refreshNode(node, recursive, viewStateContext) { + return __async(this, null, function* () { + let result; + this.subTreeRefreshPromises.forEach((refreshPromise, refreshNode) => { + if (!result && intersects(refreshNode, node)) { + result = refreshPromise.then(() => this.refreshNode(node, recursive, viewStateContext)); + } + }); + if (result) { + return result; + } + if (node !== this.root) { + const treeNode = this.tree.getNode(node); + if (treeNode.collapsed) { + node.hasChildren = !!this.dataSource.hasChildren(node.element); + node.stale = true; + this.setChildren(node, [], recursive, viewStateContext); + return; + } + } + return this.doRefreshSubTree(node, recursive, viewStateContext); + }); + } + doRefreshSubTree(node, recursive, viewStateContext) { + return __async(this, null, function* () { + let done; + node.refreshPromise = new Promise((c) => done = c); + this.subTreeRefreshPromises.set(node, node.refreshPromise); + node.refreshPromise.finally(() => { + node.refreshPromise = void 0; + this.subTreeRefreshPromises.delete(node); + }); + try { + const childrenToRefresh = yield this.doRefreshNode(node, recursive, viewStateContext); + node.stale = false; + yield Promises.settled(childrenToRefresh.map((child) => this.doRefreshSubTree(child, recursive, viewStateContext))); + } finally { + done(); + } + }); + } + doRefreshNode(node, recursive, viewStateContext) { + return __async(this, null, function* () { + node.hasChildren = !!this.dataSource.hasChildren(node.element); + let childrenPromise; + if (!node.hasChildren) { + childrenPromise = Promise.resolve(Iterable.empty()); + } else { + const children = this.doGetChildren(node); + if (isIterable(children)) { + childrenPromise = Promise.resolve(children); + } else { + const slowTimeout = timeout(800); + slowTimeout.then(() => { + node.slow = true; + this._onDidChangeNodeSlowState.fire(node); + }, (_) => null); + childrenPromise = children.finally(() => slowTimeout.cancel()); + } + } + try { + const children = yield childrenPromise; + return this.setChildren(node, children, recursive, viewStateContext); + } catch (err) { + if (node !== this.root && this.tree.hasElement(node)) { + this.tree.collapse(node); + } + if (isCancellationError(err)) { + return []; + } + throw err; + } finally { + if (node.slow) { + node.slow = false; + this._onDidChangeNodeSlowState.fire(node); + } + } + }); + } + doGetChildren(node) { + let result = this.refreshPromises.get(node); + if (result) { + return result; + } + const children = this.dataSource.getChildren(node.element); + if (isIterable(children)) { + return this.processChildren(children); + } else { + result = createCancelablePromise(() => __async(this, null, function* () { + return this.processChildren(yield children); + })); + this.refreshPromises.set(node, result); + return result.finally(() => { + this.refreshPromises.delete(node); + }); + } + } + _onDidChangeCollapseState({ node, deep }) { + if (node.element === null) { + return; + } + if (!node.collapsed && node.element.stale) { + if (deep) { + this.collapse(node.element.element); + } else { + this.refreshAndRenderNode(node.element, false).catch(onUnexpectedError); + } + } + } + setChildren(node, childrenElementsIterable, recursive, viewStateContext) { + const childrenElements = [...childrenElementsIterable]; + if (node.children.length === 0 && childrenElements.length === 0) { + return []; + } + const nodesToForget = /* @__PURE__ */ new Map(); + const childrenTreeNodesById = /* @__PURE__ */ new Map(); + for (const child of node.children) { + nodesToForget.set(child.element, child); + if (this.identityProvider) { + childrenTreeNodesById.set(child.id, { node: child, collapsed: this.tree.hasElement(child) && this.tree.isCollapsed(child) }); + } + } + const childrenToRefresh = []; + const children = childrenElements.map((element) => { + const hasChildren = !!this.dataSource.hasChildren(element); + if (!this.identityProvider) { + const asyncDataTreeNode = createAsyncDataTreeNode({ element, parent: node, hasChildren, defaultCollapseState: this.getDefaultCollapseState(element) }); + if (hasChildren && asyncDataTreeNode.defaultCollapseState === ObjectTreeElementCollapseState.PreserveOrExpanded) { + childrenToRefresh.push(asyncDataTreeNode); + } + return asyncDataTreeNode; + } + const id = this.identityProvider.getId(element).toString(); + const result = childrenTreeNodesById.get(id); + if (result) { + const asyncDataTreeNode = result.node; + nodesToForget.delete(asyncDataTreeNode.element); + this.nodes.delete(asyncDataTreeNode.element); + this.nodes.set(element, asyncDataTreeNode); + asyncDataTreeNode.element = element; + asyncDataTreeNode.hasChildren = hasChildren; + if (recursive) { + if (result.collapsed) { + asyncDataTreeNode.children.forEach((node2) => dfs2(node2, (node3) => this.nodes.delete(node3.element))); + asyncDataTreeNode.children.splice(0, asyncDataTreeNode.children.length); + asyncDataTreeNode.stale = true; + } else { + childrenToRefresh.push(asyncDataTreeNode); + } + } else if (hasChildren && !result.collapsed) { + childrenToRefresh.push(asyncDataTreeNode); + } + return asyncDataTreeNode; + } + const childAsyncDataTreeNode = createAsyncDataTreeNode({ element, parent: node, id, hasChildren, defaultCollapseState: this.getDefaultCollapseState(element) }); + if (viewStateContext && viewStateContext.viewState.focus && viewStateContext.viewState.focus.indexOf(id) > -1) { + viewStateContext.focus.push(childAsyncDataTreeNode); + } + if (viewStateContext && viewStateContext.viewState.selection && viewStateContext.viewState.selection.indexOf(id) > -1) { + viewStateContext.selection.push(childAsyncDataTreeNode); + } + if (viewStateContext && viewStateContext.viewState.expanded && viewStateContext.viewState.expanded.indexOf(id) > -1) { + childrenToRefresh.push(childAsyncDataTreeNode); + } else if (hasChildren && childAsyncDataTreeNode.defaultCollapseState === ObjectTreeElementCollapseState.PreserveOrExpanded) { + childrenToRefresh.push(childAsyncDataTreeNode); + } + return childAsyncDataTreeNode; + }); + for (const node2 of nodesToForget.values()) { + dfs2(node2, (node3) => this.nodes.delete(node3.element)); + } + for (const child of children) { + this.nodes.set(child.element, child); + } + node.children.splice(0, node.children.length, ...children); + if (node !== this.root && this.autoExpandSingleChildren && children.length === 1 && childrenToRefresh.length === 0) { + children[0].forceExpanded = true; + childrenToRefresh.push(children[0]); + } + return childrenToRefresh; + } + render(node, viewStateContext, options2) { + const children = node.children.map((node2) => this.asTreeElement(node2, viewStateContext)); + const objectTreeOptions = options2 && __spreadProps(__spreadValues({}, options2), { + diffIdentityProvider: options2.diffIdentityProvider && { + getId(node2) { + return options2.diffIdentityProvider.getId(node2.element); + } + } + }); + this.tree.setChildren(node === this.root ? null : node, children, objectTreeOptions); + if (node !== this.root) { + this.tree.setCollapsible(node, node.hasChildren); + } + this._onDidRender.fire(); + } + asTreeElement(node, viewStateContext) { + if (node.stale) { + return { + element: node, + collapsible: node.hasChildren, + collapsed: true + }; + } + let collapsed2; + if (viewStateContext && viewStateContext.viewState.expanded && node.id && viewStateContext.viewState.expanded.indexOf(node.id) > -1) { + collapsed2 = false; + } else if (node.forceExpanded) { + collapsed2 = false; + node.forceExpanded = false; + } else { + collapsed2 = node.defaultCollapseState; + } + return { + element: node, + children: node.hasChildren ? Iterable.map(node.children, (child) => this.asTreeElement(child, viewStateContext)) : [], + collapsible: node.hasChildren, + collapsed: collapsed2 + }; + } + processChildren(children) { + if (this.sorter) { + children = [...children].sort(this.sorter.compare.bind(this.sorter)); + } + return children; + } + dispose() { + this.disposables.dispose(); + this.tree.dispose(); + } + }; + CompressibleAsyncDataTreeNodeWrapper = class _CompressibleAsyncDataTreeNodeWrapper { + get element() { + return { + elements: this.node.element.elements.map((e) => e.element), + incompressible: this.node.element.incompressible + }; + } + get children() { + return this.node.children.map((node) => new _CompressibleAsyncDataTreeNodeWrapper(node)); + } + get depth() { + return this.node.depth; + } + get visibleChildrenCount() { + return this.node.visibleChildrenCount; + } + get visibleChildIndex() { + return this.node.visibleChildIndex; + } + get collapsible() { + return this.node.collapsible; + } + get collapsed() { + return this.node.collapsed; + } + get visible() { + return this.node.visible; + } + get filterData() { + return this.node.filterData; + } + constructor(node) { + this.node = node; + } + }; + CompressibleAsyncDataTreeRenderer = class { + constructor(renderer, nodeMapper, compressibleNodeMapperProvider, onDidChangeTwistieState) { + this.renderer = renderer; + this.nodeMapper = nodeMapper; + this.compressibleNodeMapperProvider = compressibleNodeMapperProvider; + this.onDidChangeTwistieState = onDidChangeTwistieState; + this.renderedNodes = /* @__PURE__ */ new Map(); + this.disposables = []; + this.templateId = renderer.templateId; + } + renderTemplate(container) { + const templateData = this.renderer.renderTemplate(container); + return { templateData }; + } + renderElement(node, index, templateData, height) { + this.renderer.renderElement(this.nodeMapper.map(node), index, templateData.templateData, height); + } + renderCompressedElements(node, index, templateData, height) { + this.renderer.renderCompressedElements(this.compressibleNodeMapperProvider().map(node), index, templateData.templateData, height); + } + renderTwistie(element, twistieElement) { + if (element.slow) { + twistieElement.classList.add(...ThemeIcon.asClassNameArray(Codicon.treeItemLoading)); + return true; + } else { + twistieElement.classList.remove(...ThemeIcon.asClassNameArray(Codicon.treeItemLoading)); + return false; + } + } + disposeElement(node, index, templateData, height) { + var _a10, _b4; + (_b4 = (_a10 = this.renderer).disposeElement) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, this.nodeMapper.map(node), index, templateData.templateData, height); + } + disposeCompressedElements(node, index, templateData, height) { + var _a10, _b4; + (_b4 = (_a10 = this.renderer).disposeCompressedElements) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, this.compressibleNodeMapperProvider().map(node), index, templateData.templateData, height); + } + disposeTemplate(templateData) { + this.renderer.disposeTemplate(templateData.templateData); + } + dispose() { + this.renderedNodes.clear(); + this.disposables = dispose(this.disposables); + } + }; + CompressibleAsyncDataTree = class extends AsyncDataTree { + constructor(user, container, virtualDelegate, compressionDelegate, renderers, dataSource, options2 = {}) { + super(user, container, virtualDelegate, renderers, dataSource, options2); + this.compressionDelegate = compressionDelegate; + this.compressibleNodeMapper = new WeakMapper((node) => new CompressibleAsyncDataTreeNodeWrapper(node)); + this.filter = options2.filter; + } + createTree(user, container, delegate, renderers, options2) { + const objectTreeDelegate = new ComposedTreeDelegate(delegate); + const objectTreeRenderers = renderers.map((r) => new CompressibleAsyncDataTreeRenderer(r, this.nodeMapper, () => this.compressibleNodeMapper, this._onDidChangeNodeSlowState.event)); + const objectTreeOptions = asCompressibleObjectTreeOptions(options2) || {}; + return new CompressibleObjectTree(user, container, objectTreeDelegate, objectTreeRenderers, objectTreeOptions); + } + asTreeElement(node, viewStateContext) { + return __spreadValues({ + incompressible: this.compressionDelegate.isIncompressible(node.element) + }, super.asTreeElement(node, viewStateContext)); + } + updateOptions(options2 = {}) { + this.tree.updateOptions(options2); + } + render(node, viewStateContext, options2) { + if (!this.identityProvider) { + return super.render(node, viewStateContext); + } + const getId = (element) => this.identityProvider.getId(element).toString(); + const getUncompressedIds = (nodes) => { + const result = /* @__PURE__ */ new Set(); + for (const node2 of nodes) { + const compressedNode = this.tree.getCompressedTreeNode(node2 === this.root ? null : node2); + if (!compressedNode.element) { + continue; + } + for (const node3 of compressedNode.element.elements) { + result.add(getId(node3.element)); + } + } + return result; + }; + const oldSelection = getUncompressedIds(this.tree.getSelection()); + const oldFocus = getUncompressedIds(this.tree.getFocus()); + super.render(node, viewStateContext, options2); + const selection = this.getSelection(); + let didChangeSelection = false; + const focus = this.getFocus(); + let didChangeFocus = false; + const visit2 = (node2) => { + const compressedNode = node2.element; + if (compressedNode) { + for (let i = 0; i < compressedNode.elements.length; i++) { + const id = getId(compressedNode.elements[i].element); + const element = compressedNode.elements[compressedNode.elements.length - 1].element; + if (oldSelection.has(id) && selection.indexOf(element) === -1) { + selection.push(element); + didChangeSelection = true; + } + if (oldFocus.has(id) && focus.indexOf(element) === -1) { + focus.push(element); + didChangeFocus = true; + } + } + } + node2.children.forEach(visit2); + }; + visit2(this.tree.getCompressedTreeNode(node === this.root ? null : node)); + if (didChangeSelection) { + this.setSelection(selection); + } + if (didChangeFocus) { + this.setFocus(focus); + } + } + // For compressed async data trees, `TreeVisibility.Recurse` doesn't currently work + // and we have to filter everything beforehand + // Related to #85193 and #85835 + processChildren(children) { + if (this.filter) { + children = Iterable.filter(children, (e) => { + const result = this.filter.filter( + e, + 1 + /* TreeVisibility.Visible */ + ); + const visibility = getVisibility(result); + if (visibility === 2) { + throw new Error("Recursive tree visibility not supported in async data compressed trees"); + } + return visibility === 1; + }); + } + return super.processChildren(children); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/tree/dataTree.js +var DataTree; +var init_dataTree = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/tree/dataTree.js"() { + init_abstractTree(); + init_objectTreeModel(); + DataTree = class extends AbstractTree { + constructor(user, container, delegate, renderers, dataSource, options2 = {}) { + super(user, container, delegate, renderers, options2); + this.user = user; + this.dataSource = dataSource; + this.identityProvider = options2.identityProvider; + } + createModel(user, view, options2) { + return new ObjectTreeModel(user, view, options2); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/contextkey/common/contextkeys.js +var IsMacContext, IsLinuxContext, IsWindowsContext, IsWebContext, IsMacNativeContext, IsIOSContext, IsMobileContext, IsDevelopmentContext, ProductQualityContext, InputFocusedContextKey, InputFocusedContext; +var init_contextkeys = __esm({ + "node_modules/monaco-editor/esm/vs/platform/contextkey/common/contextkeys.js"() { + init_platform(); + init_nls(); + init_contextkey(); + IsMacContext = new RawContextKey("isMac", isMacintosh, localize("isMac", "Whether the operating system is macOS")); + IsLinuxContext = new RawContextKey("isLinux", isLinux, localize("isLinux", "Whether the operating system is Linux")); + IsWindowsContext = new RawContextKey("isWindows", isWindows, localize("isWindows", "Whether the operating system is Windows")); + IsWebContext = new RawContextKey("isWeb", isWeb, localize("isWeb", "Whether the platform is a web browser")); + IsMacNativeContext = new RawContextKey("isMacNative", isMacintosh && !isWeb, localize("isMacNative", "Whether the operating system is macOS on a non-browser platform")); + IsIOSContext = new RawContextKey("isIOS", isIOS, localize("isIOS", "Whether the operating system is iOS")); + IsMobileContext = new RawContextKey("isMobile", isMobile, localize("isMobile", "Whether the platform is a mobile web browser")); + IsDevelopmentContext = new RawContextKey("isDevelopment", false, true); + ProductQualityContext = new RawContextKey("productQualityType", "", localize("productQualityType", "Quality type of VS Code")); + InputFocusedContextKey = "inputFocus"; + InputFocusedContext = new RawContextKey(InputFocusedContextKey, false, localize("inputFocus", "Whether keyboard focus is inside an input box")); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/list/browser/listService.js +function createScopedContextKeyService(contextKeyService, widget) { + const result = contextKeyService.createScoped(widget.getHTMLElement()); + RawWorkbenchListFocusContextKey.bindTo(result); + return result; +} +function createScrollObserver(contextKeyService, widget) { + const listScrollAt = RawWorkbenchListScrollAtBoundaryContextKey.bindTo(contextKeyService); + const update = () => { + const atTop = widget.scrollTop === 0; + const atBottom = widget.scrollHeight - widget.renderHeight - widget.scrollTop < 1; + if (atTop && atBottom) { + listScrollAt.set("both"); + } else if (atTop) { + listScrollAt.set("top"); + } else if (atBottom) { + listScrollAt.set("bottom"); + } else { + listScrollAt.set("none"); + } + }; + update(); + return widget.onDidScroll(update); +} +function useAltAsMultipleSelectionModifier(configurationService) { + return configurationService.getValue(multiSelectModifierSettingKey) === "alt"; +} +function toWorkbenchListOptions(accessor, options2) { + var _a10; + const configurationService = accessor.get(IConfigurationService); + const keybindingService = accessor.get(IKeybindingService); + const disposables = new DisposableStore(); + const result = __spreadProps(__spreadValues({}, options2), { + keyboardNavigationDelegate: { mightProducePrintableCharacter(e) { + return keybindingService.mightProducePrintableCharacter(e); + } }, + smoothScrolling: Boolean(configurationService.getValue(listSmoothScrolling)), + mouseWheelScrollSensitivity: configurationService.getValue(mouseWheelScrollSensitivityKey), + fastScrollSensitivity: configurationService.getValue(fastScrollSensitivityKey), + multipleSelectionController: (_a10 = options2.multipleSelectionController) !== null && _a10 !== void 0 ? _a10 : disposables.add(new MultipleSelectionController(configurationService)), + keyboardNavigationEventFilter: createKeyboardNavigationEventFilter(keybindingService), + scrollByPage: Boolean(configurationService.getValue(scrollByPageKey)) + }); + return [result, disposables]; +} +function createKeyboardNavigationEventFilter(keybindingService) { + let inMultiChord = false; + return (event) => { + if (event.toKeyCodeChord().isModifierKey()) { + return false; + } + if (inMultiChord) { + inMultiChord = false; + return false; + } + const result = keybindingService.softDispatch(event, event.target); + if (result.kind === 1) { + inMultiChord = true; + return false; + } + inMultiChord = false; + return result.kind === 0; + }; +} +function getDefaultTreeFindMode(configurationService) { + const value = configurationService.getValue(defaultFindModeSettingKey); + if (value === "highlight") { + return TreeFindMode.Highlight; + } else if (value === "filter") { + return TreeFindMode.Filter; + } + const deprecatedValue = configurationService.getValue(keyboardNavigationSettingKey); + if (deprecatedValue === "simple" || deprecatedValue === "highlight") { + return TreeFindMode.Highlight; + } else if (deprecatedValue === "filter") { + return TreeFindMode.Filter; + } + return void 0; +} +function getDefaultTreeFindMatchType(configurationService) { + const value = configurationService.getValue(defaultFindMatchTypeSettingKey); + if (value === "fuzzy") { + return TreeFindMatchType.Fuzzy; + } else if (value === "contiguous") { + return TreeFindMatchType.Contiguous; + } + return void 0; +} +function workbenchTreeDataPreamble(accessor, options2) { + var _a10; + const configurationService = accessor.get(IConfigurationService); + const contextViewService = accessor.get(IContextViewService); + const contextKeyService = accessor.get(IContextKeyService); + const instantiationService = accessor.get(IInstantiationService); + const getTypeNavigationMode = () => { + const modeString = contextKeyService.getContextKeyValue(WorkbenchListTypeNavigationModeKey); + if (modeString === "automatic") { + return TypeNavigationMode.Automatic; + } else if (modeString === "trigger") { + return TypeNavigationMode.Trigger; + } + const modeBoolean = contextKeyService.getContextKeyValue(WorkbenchListAutomaticKeyboardNavigationLegacyKey); + if (modeBoolean === false) { + return TypeNavigationMode.Trigger; + } + const configString = configurationService.getValue(typeNavigationModeSettingKey); + if (configString === "automatic") { + return TypeNavigationMode.Automatic; + } else if (configString === "trigger") { + return TypeNavigationMode.Trigger; + } + return void 0; + }; + const horizontalScrolling = options2.horizontalScrolling !== void 0 ? options2.horizontalScrolling : Boolean(configurationService.getValue(horizontalScrollingKey)); + const [workbenchListOptions, disposable] = instantiationService.invokeFunction(toWorkbenchListOptions, options2); + const paddingBottom = options2.paddingBottom; + const renderIndentGuides = options2.renderIndentGuides !== void 0 ? options2.renderIndentGuides : configurationService.getValue(treeRenderIndentGuidesKey); + return { + getTypeNavigationMode, + disposable, + options: __spreadProps(__spreadValues({ + // ...options, // TODO@Joao why is this not splatted here? + keyboardSupport: false + }, workbenchListOptions), { + indent: typeof configurationService.getValue(treeIndentKey) === "number" ? configurationService.getValue(treeIndentKey) : void 0, + renderIndentGuides, + smoothScrolling: Boolean(configurationService.getValue(listSmoothScrolling)), + defaultFindMode: getDefaultTreeFindMode(configurationService), + defaultFindMatchType: getDefaultTreeFindMatchType(configurationService), + horizontalScrolling, + scrollByPage: Boolean(configurationService.getValue(scrollByPageKey)), + paddingBottom, + hideTwistiesOfChildlessElements: options2.hideTwistiesOfChildlessElements, + expandOnlyOnTwistieClick: (_a10 = options2.expandOnlyOnTwistieClick) !== null && _a10 !== void 0 ? _a10 : configurationService.getValue(treeExpandMode) === "doubleClick", + contextViewProvider: contextViewService, + findWidgetStyles: defaultFindWidgetStyles, + enableStickyScroll: Boolean(configurationService.getValue(treeStickyScroll)), + stickyScrollMaxItemCount: Number(configurationService.getValue(treeStickyScrollMaxElements)) + }) + }; +} +var __decorate38, __param32, IListService, ListService, RawWorkbenchListScrollAtBoundaryContextKey, WorkbenchListScrollAtTopContextKey, WorkbenchListScrollAtBottomContextKey, RawWorkbenchListFocusContextKey, WorkbenchTreeStickyScrollFocused, WorkbenchListSupportsMultiSelectContextKey, WorkbenchListFocusContextKey, WorkbenchListHasSelectionOrFocus, WorkbenchListDoubleSelection, WorkbenchListMultiSelection, WorkbenchListSelectionNavigation, WorkbenchListSupportsFind, WorkbenchTreeElementCanCollapse, WorkbenchTreeElementHasParent, WorkbenchTreeElementCanExpand, WorkbenchTreeElementHasChild, WorkbenchTreeFindOpen, WorkbenchListTypeNavigationModeKey, WorkbenchListAutomaticKeyboardNavigationLegacyKey, multiSelectModifierSettingKey, openModeSettingKey, horizontalScrollingKey, defaultFindModeSettingKey, typeNavigationModeSettingKey, keyboardNavigationSettingKey, scrollByPageKey, defaultFindMatchTypeSettingKey, treeIndentKey, treeRenderIndentGuidesKey, listSmoothScrolling, mouseWheelScrollSensitivityKey, fastScrollSensitivityKey, treeExpandMode, treeStickyScroll, treeStickyScrollMaxElements, MultipleSelectionController, WorkbenchList, WorkbenchPagedList, WorkbenchTable, ResourceNavigator, ListResourceNavigator, TableResourceNavigator, TreeResourceNavigator, WorkbenchObjectTree, WorkbenchCompressibleObjectTree, WorkbenchDataTree, WorkbenchAsyncDataTree, WorkbenchCompressibleAsyncDataTree, WorkbenchTreeInternals, configurationRegistry3; +var init_listService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/list/browser/listService.js"() { + init_dom(); + init_listPaging(); + init_listWidget(); + init_tableWidget(); + init_abstractTree(); + init_asyncDataTree(); + init_dataTree(); + init_objectTree(); + init_event(); + init_lifecycle(); + init_nls(); + init_configuration(); + init_configurationRegistry(); + init_contextkey(); + init_contextkeys(); + init_contextView(); + init_instantiation(); + init_keybinding(); + init_platform2(); + init_defaultStyles(); + __decorate38 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param32 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + IListService = createDecorator("listService"); + ListService = class { + get lastFocusedList() { + return this._lastFocusedWidget; + } + constructor() { + this.disposables = new DisposableStore(); + this.lists = []; + this._lastFocusedWidget = void 0; + this._hasCreatedStyleController = false; + } + setLastFocusedList(widget) { + var _a10, _b4; + if (widget === this._lastFocusedWidget) { + return; + } + (_a10 = this._lastFocusedWidget) === null || _a10 === void 0 ? void 0 : _a10.getHTMLElement().classList.remove("last-focused"); + this._lastFocusedWidget = widget; + (_b4 = this._lastFocusedWidget) === null || _b4 === void 0 ? void 0 : _b4.getHTMLElement().classList.add("last-focused"); + } + register(widget, extraContextKeys) { + if (!this._hasCreatedStyleController) { + this._hasCreatedStyleController = true; + const styleController = new DefaultStyleController(createStyleSheet(), ""); + styleController.style(defaultListStyles); + } + if (this.lists.some((l) => l.widget === widget)) { + throw new Error("Cannot register the same widget multiple times"); + } + const registeredList = { widget, extraContextKeys }; + this.lists.push(registeredList); + if (isActiveElement(widget.getHTMLElement())) { + this.setLastFocusedList(widget); + } + return combinedDisposable(widget.onDidFocus(() => this.setLastFocusedList(widget)), toDisposable(() => this.lists.splice(this.lists.indexOf(registeredList), 1)), widget.onDidDispose(() => { + this.lists = this.lists.filter((l) => l !== registeredList); + if (this._lastFocusedWidget === widget) { + this.setLastFocusedList(void 0); + } + })); + } + dispose() { + this.disposables.dispose(); + } + }; + RawWorkbenchListScrollAtBoundaryContextKey = new RawContextKey("listScrollAtBoundary", "none"); + WorkbenchListScrollAtTopContextKey = ContextKeyExpr.or(RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo("top"), RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo("both")); + WorkbenchListScrollAtBottomContextKey = ContextKeyExpr.or(RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo("bottom"), RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo("both")); + RawWorkbenchListFocusContextKey = new RawContextKey("listFocus", true); + WorkbenchTreeStickyScrollFocused = new RawContextKey("treestickyScrollFocused", false); + WorkbenchListSupportsMultiSelectContextKey = new RawContextKey("listSupportsMultiselect", true); + WorkbenchListFocusContextKey = ContextKeyExpr.and(RawWorkbenchListFocusContextKey, ContextKeyExpr.not(InputFocusedContextKey), WorkbenchTreeStickyScrollFocused.negate()); + WorkbenchListHasSelectionOrFocus = new RawContextKey("listHasSelectionOrFocus", false); + WorkbenchListDoubleSelection = new RawContextKey("listDoubleSelection", false); + WorkbenchListMultiSelection = new RawContextKey("listMultiSelection", false); + WorkbenchListSelectionNavigation = new RawContextKey("listSelectionNavigation", false); + WorkbenchListSupportsFind = new RawContextKey("listSupportsFind", true); + WorkbenchTreeElementCanCollapse = new RawContextKey("treeElementCanCollapse", false); + WorkbenchTreeElementHasParent = new RawContextKey("treeElementHasParent", false); + WorkbenchTreeElementCanExpand = new RawContextKey("treeElementCanExpand", false); + WorkbenchTreeElementHasChild = new RawContextKey("treeElementHasChild", false); + WorkbenchTreeFindOpen = new RawContextKey("treeFindOpen", false); + WorkbenchListTypeNavigationModeKey = "listTypeNavigationMode"; + WorkbenchListAutomaticKeyboardNavigationLegacyKey = "listAutomaticKeyboardNavigation"; + multiSelectModifierSettingKey = "workbench.list.multiSelectModifier"; + openModeSettingKey = "workbench.list.openMode"; + horizontalScrollingKey = "workbench.list.horizontalScrolling"; + defaultFindModeSettingKey = "workbench.list.defaultFindMode"; + typeNavigationModeSettingKey = "workbench.list.typeNavigationMode"; + keyboardNavigationSettingKey = "workbench.list.keyboardNavigation"; + scrollByPageKey = "workbench.list.scrollByPage"; + defaultFindMatchTypeSettingKey = "workbench.list.defaultFindMatchType"; + treeIndentKey = "workbench.tree.indent"; + treeRenderIndentGuidesKey = "workbench.tree.renderIndentGuides"; + listSmoothScrolling = "workbench.list.smoothScrolling"; + mouseWheelScrollSensitivityKey = "workbench.list.mouseWheelScrollSensitivity"; + fastScrollSensitivityKey = "workbench.list.fastScrollSensitivity"; + treeExpandMode = "workbench.tree.expandMode"; + treeStickyScroll = "workbench.tree.enableStickyScroll"; + treeStickyScrollMaxElements = "workbench.tree.stickyScrollMaxItemCount"; + MultipleSelectionController = class extends Disposable { + constructor(configurationService) { + super(); + this.configurationService = configurationService; + this.useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); + this.registerListeners(); + } + registerListeners() { + this._register(this.configurationService.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration(multiSelectModifierSettingKey)) { + this.useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(this.configurationService); + } + })); + } + isSelectionSingleChangeEvent(event) { + if (this.useAltAsMultipleSelectionModifier) { + return event.browserEvent.altKey; + } + return isSelectionSingleChangeEvent(event); + } + isSelectionRangeChangeEvent(event) { + return isSelectionRangeChangeEvent(event); + } + }; + WorkbenchList = class WorkbenchList2 extends List { + constructor(user, container, delegate, renderers, options2, contextKeyService, listService, configurationService, instantiationService) { + const horizontalScrolling = typeof options2.horizontalScrolling !== "undefined" ? options2.horizontalScrolling : Boolean(configurationService.getValue(horizontalScrollingKey)); + const [workbenchListOptions, workbenchListOptionsDisposable] = instantiationService.invokeFunction(toWorkbenchListOptions, options2); + super(user, container, delegate, renderers, __spreadProps(__spreadValues({ + keyboardSupport: false + }, workbenchListOptions), { + horizontalScrolling + })); + this.disposables.add(workbenchListOptionsDisposable); + this.contextKeyService = createScopedContextKeyService(contextKeyService, this); + this.disposables.add(createScrollObserver(this.contextKeyService, this)); + this.listSupportsMultiSelect = WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService); + this.listSupportsMultiSelect.set(options2.multipleSelectionSupport !== false); + const listSelectionNavigation = WorkbenchListSelectionNavigation.bindTo(this.contextKeyService); + listSelectionNavigation.set(Boolean(options2.selectionNavigation)); + this.listHasSelectionOrFocus = WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService); + this.listDoubleSelection = WorkbenchListDoubleSelection.bindTo(this.contextKeyService); + this.listMultiSelection = WorkbenchListMultiSelection.bindTo(this.contextKeyService); + this.horizontalScrolling = options2.horizontalScrolling; + this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); + this.disposables.add(this.contextKeyService); + this.disposables.add(listService.register(this)); + this.updateStyles(options2.overrideStyles); + this.disposables.add(this.onDidChangeSelection(() => { + const selection = this.getSelection(); + const focus = this.getFocus(); + this.contextKeyService.bufferChangeEvents(() => { + this.listHasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); + this.listMultiSelection.set(selection.length > 1); + this.listDoubleSelection.set(selection.length === 2); + }); + })); + this.disposables.add(this.onDidChangeFocus(() => { + const selection = this.getSelection(); + const focus = this.getFocus(); + this.listHasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); + })); + this.disposables.add(configurationService.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration(multiSelectModifierSettingKey)) { + this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); + } + let options3 = {}; + if (e.affectsConfiguration(horizontalScrollingKey) && this.horizontalScrolling === void 0) { + const horizontalScrolling2 = Boolean(configurationService.getValue(horizontalScrollingKey)); + options3 = __spreadProps(__spreadValues({}, options3), { horizontalScrolling: horizontalScrolling2 }); + } + if (e.affectsConfiguration(scrollByPageKey)) { + const scrollByPage = Boolean(configurationService.getValue(scrollByPageKey)); + options3 = __spreadProps(__spreadValues({}, options3), { scrollByPage }); + } + if (e.affectsConfiguration(listSmoothScrolling)) { + const smoothScrolling = Boolean(configurationService.getValue(listSmoothScrolling)); + options3 = __spreadProps(__spreadValues({}, options3), { smoothScrolling }); + } + if (e.affectsConfiguration(mouseWheelScrollSensitivityKey)) { + const mouseWheelScrollSensitivity = configurationService.getValue(mouseWheelScrollSensitivityKey); + options3 = __spreadProps(__spreadValues({}, options3), { mouseWheelScrollSensitivity }); + } + if (e.affectsConfiguration(fastScrollSensitivityKey)) { + const fastScrollSensitivity = configurationService.getValue(fastScrollSensitivityKey); + options3 = __spreadProps(__spreadValues({}, options3), { fastScrollSensitivity }); + } + if (Object.keys(options3).length > 0) { + this.updateOptions(options3); + } + })); + this.navigator = new ListResourceNavigator(this, __spreadValues({ configurationService }, options2)); + this.disposables.add(this.navigator); + } + updateOptions(options2) { + super.updateOptions(options2); + if (options2.overrideStyles !== void 0) { + this.updateStyles(options2.overrideStyles); + } + if (options2.multipleSelectionSupport !== void 0) { + this.listSupportsMultiSelect.set(!!options2.multipleSelectionSupport); + } + } + updateStyles(styles) { + this.style(styles ? getListStyles(styles) : defaultListStyles); + } + }; + WorkbenchList = __decorate38([ + __param32(5, IContextKeyService), + __param32(6, IListService), + __param32(7, IConfigurationService), + __param32(8, IInstantiationService) + ], WorkbenchList); + WorkbenchPagedList = class WorkbenchPagedList2 extends PagedList { + constructor(user, container, delegate, renderers, options2, contextKeyService, listService, configurationService, instantiationService) { + const horizontalScrolling = typeof options2.horizontalScrolling !== "undefined" ? options2.horizontalScrolling : Boolean(configurationService.getValue(horizontalScrollingKey)); + const [workbenchListOptions, workbenchListOptionsDisposable] = instantiationService.invokeFunction(toWorkbenchListOptions, options2); + super(user, container, delegate, renderers, __spreadProps(__spreadValues({ + keyboardSupport: false + }, workbenchListOptions), { + horizontalScrolling + })); + this.disposables = new DisposableStore(); + this.disposables.add(workbenchListOptionsDisposable); + this.contextKeyService = createScopedContextKeyService(contextKeyService, this); + this.disposables.add(createScrollObserver(this.contextKeyService, this.widget)); + this.horizontalScrolling = options2.horizontalScrolling; + this.listSupportsMultiSelect = WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService); + this.listSupportsMultiSelect.set(options2.multipleSelectionSupport !== false); + const listSelectionNavigation = WorkbenchListSelectionNavigation.bindTo(this.contextKeyService); + listSelectionNavigation.set(Boolean(options2.selectionNavigation)); + this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); + this.disposables.add(this.contextKeyService); + this.disposables.add(listService.register(this)); + this.updateStyles(options2.overrideStyles); + this.disposables.add(configurationService.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration(multiSelectModifierSettingKey)) { + this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); + } + let options3 = {}; + if (e.affectsConfiguration(horizontalScrollingKey) && this.horizontalScrolling === void 0) { + const horizontalScrolling2 = Boolean(configurationService.getValue(horizontalScrollingKey)); + options3 = __spreadProps(__spreadValues({}, options3), { horizontalScrolling: horizontalScrolling2 }); + } + if (e.affectsConfiguration(scrollByPageKey)) { + const scrollByPage = Boolean(configurationService.getValue(scrollByPageKey)); + options3 = __spreadProps(__spreadValues({}, options3), { scrollByPage }); + } + if (e.affectsConfiguration(listSmoothScrolling)) { + const smoothScrolling = Boolean(configurationService.getValue(listSmoothScrolling)); + options3 = __spreadProps(__spreadValues({}, options3), { smoothScrolling }); + } + if (e.affectsConfiguration(mouseWheelScrollSensitivityKey)) { + const mouseWheelScrollSensitivity = configurationService.getValue(mouseWheelScrollSensitivityKey); + options3 = __spreadProps(__spreadValues({}, options3), { mouseWheelScrollSensitivity }); + } + if (e.affectsConfiguration(fastScrollSensitivityKey)) { + const fastScrollSensitivity = configurationService.getValue(fastScrollSensitivityKey); + options3 = __spreadProps(__spreadValues({}, options3), { fastScrollSensitivity }); + } + if (Object.keys(options3).length > 0) { + this.updateOptions(options3); + } + })); + this.navigator = new ListResourceNavigator(this, __spreadValues({ configurationService }, options2)); + this.disposables.add(this.navigator); + } + updateOptions(options2) { + super.updateOptions(options2); + if (options2.overrideStyles !== void 0) { + this.updateStyles(options2.overrideStyles); + } + if (options2.multipleSelectionSupport !== void 0) { + this.listSupportsMultiSelect.set(!!options2.multipleSelectionSupport); + } + } + updateStyles(styles) { + this.style(styles ? getListStyles(styles) : defaultListStyles); + } + dispose() { + this.disposables.dispose(); + super.dispose(); + } + }; + WorkbenchPagedList = __decorate38([ + __param32(5, IContextKeyService), + __param32(6, IListService), + __param32(7, IConfigurationService), + __param32(8, IInstantiationService) + ], WorkbenchPagedList); + WorkbenchTable = class WorkbenchTable2 extends Table { + constructor(user, container, delegate, columns, renderers, options2, contextKeyService, listService, configurationService, instantiationService) { + const horizontalScrolling = typeof options2.horizontalScrolling !== "undefined" ? options2.horizontalScrolling : Boolean(configurationService.getValue(horizontalScrollingKey)); + const [workbenchListOptions, workbenchListOptionsDisposable] = instantiationService.invokeFunction(toWorkbenchListOptions, options2); + super(user, container, delegate, columns, renderers, __spreadProps(__spreadValues({ + keyboardSupport: false + }, workbenchListOptions), { + horizontalScrolling + })); + this.disposables.add(workbenchListOptionsDisposable); + this.contextKeyService = createScopedContextKeyService(contextKeyService, this); + this.disposables.add(createScrollObserver(this.contextKeyService, this)); + this.listSupportsMultiSelect = WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService); + this.listSupportsMultiSelect.set(options2.multipleSelectionSupport !== false); + const listSelectionNavigation = WorkbenchListSelectionNavigation.bindTo(this.contextKeyService); + listSelectionNavigation.set(Boolean(options2.selectionNavigation)); + this.listHasSelectionOrFocus = WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService); + this.listDoubleSelection = WorkbenchListDoubleSelection.bindTo(this.contextKeyService); + this.listMultiSelection = WorkbenchListMultiSelection.bindTo(this.contextKeyService); + this.horizontalScrolling = options2.horizontalScrolling; + this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); + this.disposables.add(this.contextKeyService); + this.disposables.add(listService.register(this)); + this.updateStyles(options2.overrideStyles); + this.disposables.add(this.onDidChangeSelection(() => { + const selection = this.getSelection(); + const focus = this.getFocus(); + this.contextKeyService.bufferChangeEvents(() => { + this.listHasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); + this.listMultiSelection.set(selection.length > 1); + this.listDoubleSelection.set(selection.length === 2); + }); + })); + this.disposables.add(this.onDidChangeFocus(() => { + const selection = this.getSelection(); + const focus = this.getFocus(); + this.listHasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); + })); + this.disposables.add(configurationService.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration(multiSelectModifierSettingKey)) { + this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); + } + let options3 = {}; + if (e.affectsConfiguration(horizontalScrollingKey) && this.horizontalScrolling === void 0) { + const horizontalScrolling2 = Boolean(configurationService.getValue(horizontalScrollingKey)); + options3 = __spreadProps(__spreadValues({}, options3), { horizontalScrolling: horizontalScrolling2 }); + } + if (e.affectsConfiguration(scrollByPageKey)) { + const scrollByPage = Boolean(configurationService.getValue(scrollByPageKey)); + options3 = __spreadProps(__spreadValues({}, options3), { scrollByPage }); + } + if (e.affectsConfiguration(listSmoothScrolling)) { + const smoothScrolling = Boolean(configurationService.getValue(listSmoothScrolling)); + options3 = __spreadProps(__spreadValues({}, options3), { smoothScrolling }); + } + if (e.affectsConfiguration(mouseWheelScrollSensitivityKey)) { + const mouseWheelScrollSensitivity = configurationService.getValue(mouseWheelScrollSensitivityKey); + options3 = __spreadProps(__spreadValues({}, options3), { mouseWheelScrollSensitivity }); + } + if (e.affectsConfiguration(fastScrollSensitivityKey)) { + const fastScrollSensitivity = configurationService.getValue(fastScrollSensitivityKey); + options3 = __spreadProps(__spreadValues({}, options3), { fastScrollSensitivity }); + } + if (Object.keys(options3).length > 0) { + this.updateOptions(options3); + } + })); + this.navigator = new TableResourceNavigator(this, __spreadValues({ configurationService }, options2)); + this.disposables.add(this.navigator); + } + updateOptions(options2) { + super.updateOptions(options2); + if (options2.overrideStyles !== void 0) { + this.updateStyles(options2.overrideStyles); + } + if (options2.multipleSelectionSupport !== void 0) { + this.listSupportsMultiSelect.set(!!options2.multipleSelectionSupport); + } + } + updateStyles(styles) { + this.style(styles ? getListStyles(styles) : defaultListStyles); + } + dispose() { + this.disposables.dispose(); + super.dispose(); + } + }; + WorkbenchTable = __decorate38([ + __param32(6, IContextKeyService), + __param32(7, IListService), + __param32(8, IConfigurationService), + __param32(9, IInstantiationService) + ], WorkbenchTable); + ResourceNavigator = class extends Disposable { + constructor(widget, options2) { + var _a10; + super(); + this.widget = widget; + this._onDidOpen = this._register(new Emitter()); + this.onDidOpen = this._onDidOpen.event; + this._register(Event.filter(this.widget.onDidChangeSelection, (e) => isKeyboardEvent(e.browserEvent))((e) => this.onSelectionFromKeyboard(e))); + this._register(this.widget.onPointer((e) => this.onPointer(e.element, e.browserEvent))); + this._register(this.widget.onMouseDblClick((e) => this.onMouseDblClick(e.element, e.browserEvent))); + if (typeof (options2 === null || options2 === void 0 ? void 0 : options2.openOnSingleClick) !== "boolean" && (options2 === null || options2 === void 0 ? void 0 : options2.configurationService)) { + this.openOnSingleClick = (options2 === null || options2 === void 0 ? void 0 : options2.configurationService.getValue(openModeSettingKey)) !== "doubleClick"; + this._register(options2 === null || options2 === void 0 ? void 0 : options2.configurationService.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration(openModeSettingKey)) { + this.openOnSingleClick = (options2 === null || options2 === void 0 ? void 0 : options2.configurationService.getValue(openModeSettingKey)) !== "doubleClick"; + } + })); + } else { + this.openOnSingleClick = (_a10 = options2 === null || options2 === void 0 ? void 0 : options2.openOnSingleClick) !== null && _a10 !== void 0 ? _a10 : true; + } + } + onSelectionFromKeyboard(event) { + if (event.elements.length !== 1) { + return; + } + const selectionKeyboardEvent = event.browserEvent; + const preserveFocus = typeof selectionKeyboardEvent.preserveFocus === "boolean" ? selectionKeyboardEvent.preserveFocus : true; + const pinned = typeof selectionKeyboardEvent.pinned === "boolean" ? selectionKeyboardEvent.pinned : !preserveFocus; + const sideBySide = false; + this._open(this.getSelectedElement(), preserveFocus, pinned, sideBySide, event.browserEvent); + } + onPointer(element, browserEvent) { + if (!this.openOnSingleClick) { + return; + } + const isDoubleClick = browserEvent.detail === 2; + if (isDoubleClick) { + return; + } + const isMiddleClick = browserEvent.button === 1; + const preserveFocus = true; + const pinned = isMiddleClick; + const sideBySide = browserEvent.ctrlKey || browserEvent.metaKey || browserEvent.altKey; + this._open(element, preserveFocus, pinned, sideBySide, browserEvent); + } + onMouseDblClick(element, browserEvent) { + if (!browserEvent) { + return; + } + const target = browserEvent.target; + const onTwistie = target.classList.contains("monaco-tl-twistie") || target.classList.contains("monaco-icon-label") && target.classList.contains("folder-icon") && browserEvent.offsetX < 16; + if (onTwistie) { + return; + } + const preserveFocus = false; + const pinned = true; + const sideBySide = browserEvent.ctrlKey || browserEvent.metaKey || browserEvent.altKey; + this._open(element, preserveFocus, pinned, sideBySide, browserEvent); + } + _open(element, preserveFocus, pinned, sideBySide, browserEvent) { + if (!element) { + return; + } + this._onDidOpen.fire({ + editorOptions: { + preserveFocus, + pinned, + revealIfVisible: true + }, + sideBySide, + element, + browserEvent + }); + } + }; + ListResourceNavigator = class extends ResourceNavigator { + constructor(widget, options2) { + super(widget, options2); + this.widget = widget; + } + getSelectedElement() { + return this.widget.getSelectedElements()[0]; + } + }; + TableResourceNavigator = class extends ResourceNavigator { + constructor(widget, options2) { + super(widget, options2); + } + getSelectedElement() { + return this.widget.getSelectedElements()[0]; + } + }; + TreeResourceNavigator = class extends ResourceNavigator { + constructor(widget, options2) { + super(widget, options2); + } + getSelectedElement() { + var _a10; + return (_a10 = this.widget.getSelection()[0]) !== null && _a10 !== void 0 ? _a10 : void 0; + } + }; + WorkbenchObjectTree = class WorkbenchObjectTree2 extends ObjectTree { + constructor(user, container, delegate, renderers, options2, instantiationService, contextKeyService, listService, configurationService) { + const { options: treeOptions, getTypeNavigationMode, disposable } = instantiationService.invokeFunction(workbenchTreeDataPreamble, options2); + super(user, container, delegate, renderers, treeOptions); + this.disposables.add(disposable); + this.internals = new WorkbenchTreeInternals(this, options2, getTypeNavigationMode, options2.overrideStyles, contextKeyService, listService, configurationService); + this.disposables.add(this.internals); + } + updateOptions(options2) { + super.updateOptions(options2); + this.internals.updateOptions(options2); + } + }; + WorkbenchObjectTree = __decorate38([ + __param32(5, IInstantiationService), + __param32(6, IContextKeyService), + __param32(7, IListService), + __param32(8, IConfigurationService) + ], WorkbenchObjectTree); + WorkbenchCompressibleObjectTree = class WorkbenchCompressibleObjectTree2 extends CompressibleObjectTree { + constructor(user, container, delegate, renderers, options2, instantiationService, contextKeyService, listService, configurationService) { + const { options: treeOptions, getTypeNavigationMode, disposable } = instantiationService.invokeFunction(workbenchTreeDataPreamble, options2); + super(user, container, delegate, renderers, treeOptions); + this.disposables.add(disposable); + this.internals = new WorkbenchTreeInternals(this, options2, getTypeNavigationMode, options2.overrideStyles, contextKeyService, listService, configurationService); + this.disposables.add(this.internals); + } + updateOptions(options2 = {}) { + super.updateOptions(options2); + if (options2.overrideStyles) { + this.internals.updateStyleOverrides(options2.overrideStyles); + } + this.internals.updateOptions(options2); + } + }; + WorkbenchCompressibleObjectTree = __decorate38([ + __param32(5, IInstantiationService), + __param32(6, IContextKeyService), + __param32(7, IListService), + __param32(8, IConfigurationService) + ], WorkbenchCompressibleObjectTree); + WorkbenchDataTree = class WorkbenchDataTree2 extends DataTree { + constructor(user, container, delegate, renderers, dataSource, options2, instantiationService, contextKeyService, listService, configurationService) { + const { options: treeOptions, getTypeNavigationMode, disposable } = instantiationService.invokeFunction(workbenchTreeDataPreamble, options2); + super(user, container, delegate, renderers, dataSource, treeOptions); + this.disposables.add(disposable); + this.internals = new WorkbenchTreeInternals(this, options2, getTypeNavigationMode, options2.overrideStyles, contextKeyService, listService, configurationService); + this.disposables.add(this.internals); + } + updateOptions(options2 = {}) { + super.updateOptions(options2); + if (options2.overrideStyles !== void 0) { + this.internals.updateStyleOverrides(options2.overrideStyles); + } + this.internals.updateOptions(options2); + } + }; + WorkbenchDataTree = __decorate38([ + __param32(6, IInstantiationService), + __param32(7, IContextKeyService), + __param32(8, IListService), + __param32(9, IConfigurationService) + ], WorkbenchDataTree); + WorkbenchAsyncDataTree = class WorkbenchAsyncDataTree2 extends AsyncDataTree { + get onDidOpen() { + return this.internals.onDidOpen; + } + constructor(user, container, delegate, renderers, dataSource, options2, instantiationService, contextKeyService, listService, configurationService) { + const { options: treeOptions, getTypeNavigationMode, disposable } = instantiationService.invokeFunction(workbenchTreeDataPreamble, options2); + super(user, container, delegate, renderers, dataSource, treeOptions); + this.disposables.add(disposable); + this.internals = new WorkbenchTreeInternals(this, options2, getTypeNavigationMode, options2.overrideStyles, contextKeyService, listService, configurationService); + this.disposables.add(this.internals); + } + updateOptions(options2 = {}) { + super.updateOptions(options2); + if (options2.overrideStyles) { + this.internals.updateStyleOverrides(options2.overrideStyles); + } + this.internals.updateOptions(options2); + } + }; + WorkbenchAsyncDataTree = __decorate38([ + __param32(6, IInstantiationService), + __param32(7, IContextKeyService), + __param32(8, IListService), + __param32(9, IConfigurationService) + ], WorkbenchAsyncDataTree); + WorkbenchCompressibleAsyncDataTree = class WorkbenchCompressibleAsyncDataTree2 extends CompressibleAsyncDataTree { + constructor(user, container, virtualDelegate, compressionDelegate, renderers, dataSource, options2, instantiationService, contextKeyService, listService, configurationService) { + const { options: treeOptions, getTypeNavigationMode, disposable } = instantiationService.invokeFunction(workbenchTreeDataPreamble, options2); + super(user, container, virtualDelegate, compressionDelegate, renderers, dataSource, treeOptions); + this.disposables.add(disposable); + this.internals = new WorkbenchTreeInternals(this, options2, getTypeNavigationMode, options2.overrideStyles, contextKeyService, listService, configurationService); + this.disposables.add(this.internals); + } + updateOptions(options2) { + super.updateOptions(options2); + this.internals.updateOptions(options2); + } + }; + WorkbenchCompressibleAsyncDataTree = __decorate38([ + __param32(7, IInstantiationService), + __param32(8, IContextKeyService), + __param32(9, IListService), + __param32(10, IConfigurationService) + ], WorkbenchCompressibleAsyncDataTree); + WorkbenchTreeInternals = class WorkbenchTreeInternals2 { + get onDidOpen() { + return this.navigator.onDidOpen; + } + constructor(tree, options2, getTypeNavigationMode, overrideStyles2, contextKeyService, listService, configurationService) { + var _a10; + this.tree = tree; + this.disposables = []; + this.contextKeyService = createScopedContextKeyService(contextKeyService, tree); + this.disposables.push(createScrollObserver(this.contextKeyService, tree)); + this.listSupportsMultiSelect = WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService); + this.listSupportsMultiSelect.set(options2.multipleSelectionSupport !== false); + const listSelectionNavigation = WorkbenchListSelectionNavigation.bindTo(this.contextKeyService); + listSelectionNavigation.set(Boolean(options2.selectionNavigation)); + this.listSupportFindWidget = WorkbenchListSupportsFind.bindTo(this.contextKeyService); + this.listSupportFindWidget.set((_a10 = options2.findWidgetEnabled) !== null && _a10 !== void 0 ? _a10 : true); + this.hasSelectionOrFocus = WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService); + this.hasDoubleSelection = WorkbenchListDoubleSelection.bindTo(this.contextKeyService); + this.hasMultiSelection = WorkbenchListMultiSelection.bindTo(this.contextKeyService); + this.treeElementCanCollapse = WorkbenchTreeElementCanCollapse.bindTo(this.contextKeyService); + this.treeElementHasParent = WorkbenchTreeElementHasParent.bindTo(this.contextKeyService); + this.treeElementCanExpand = WorkbenchTreeElementCanExpand.bindTo(this.contextKeyService); + this.treeElementHasChild = WorkbenchTreeElementHasChild.bindTo(this.contextKeyService); + this.treeFindOpen = WorkbenchTreeFindOpen.bindTo(this.contextKeyService); + this.treeStickyScrollFocused = WorkbenchTreeStickyScrollFocused.bindTo(this.contextKeyService); + this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); + this.updateStyleOverrides(overrideStyles2); + const updateCollapseContextKeys = () => { + const focus = tree.getFocus()[0]; + if (!focus) { + return; + } + const node = tree.getNode(focus); + this.treeElementCanCollapse.set(node.collapsible && !node.collapsed); + this.treeElementHasParent.set(!!tree.getParentElement(focus)); + this.treeElementCanExpand.set(node.collapsible && node.collapsed); + this.treeElementHasChild.set(!!tree.getFirstElementChild(focus)); + }; + const interestingContextKeys = /* @__PURE__ */ new Set(); + interestingContextKeys.add(WorkbenchListTypeNavigationModeKey); + interestingContextKeys.add(WorkbenchListAutomaticKeyboardNavigationLegacyKey); + this.disposables.push(this.contextKeyService, listService.register(tree), tree.onDidChangeSelection(() => { + const selection = tree.getSelection(); + const focus = tree.getFocus(); + this.contextKeyService.bufferChangeEvents(() => { + this.hasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); + this.hasMultiSelection.set(selection.length > 1); + this.hasDoubleSelection.set(selection.length === 2); + }); + }), tree.onDidChangeFocus(() => { + const selection = tree.getSelection(); + const focus = tree.getFocus(); + this.hasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); + updateCollapseContextKeys(); + }), tree.onDidChangeCollapseState(updateCollapseContextKeys), tree.onDidChangeModel(updateCollapseContextKeys), tree.onDidChangeFindOpenState((enabled) => this.treeFindOpen.set(enabled)), tree.onDidChangeStickyScrollFocused((focused) => this.treeStickyScrollFocused.set(focused)), configurationService.onDidChangeConfiguration((e) => { + let newOptions = {}; + if (e.affectsConfiguration(multiSelectModifierSettingKey)) { + this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); + } + if (e.affectsConfiguration(treeIndentKey)) { + const indent = configurationService.getValue(treeIndentKey); + newOptions = __spreadProps(__spreadValues({}, newOptions), { indent }); + } + if (e.affectsConfiguration(treeRenderIndentGuidesKey) && options2.renderIndentGuides === void 0) { + const renderIndentGuides = configurationService.getValue(treeRenderIndentGuidesKey); + newOptions = __spreadProps(__spreadValues({}, newOptions), { renderIndentGuides }); + } + if (e.affectsConfiguration(listSmoothScrolling)) { + const smoothScrolling = Boolean(configurationService.getValue(listSmoothScrolling)); + newOptions = __spreadProps(__spreadValues({}, newOptions), { smoothScrolling }); + } + if (e.affectsConfiguration(defaultFindModeSettingKey) || e.affectsConfiguration(keyboardNavigationSettingKey)) { + const defaultFindMode = getDefaultTreeFindMode(configurationService); + newOptions = __spreadProps(__spreadValues({}, newOptions), { defaultFindMode }); + } + if (e.affectsConfiguration(typeNavigationModeSettingKey) || e.affectsConfiguration(keyboardNavigationSettingKey)) { + const typeNavigationMode = getTypeNavigationMode(); + newOptions = __spreadProps(__spreadValues({}, newOptions), { typeNavigationMode }); + } + if (e.affectsConfiguration(defaultFindMatchTypeSettingKey)) { + const defaultFindMatchType = getDefaultTreeFindMatchType(configurationService); + newOptions = __spreadProps(__spreadValues({}, newOptions), { defaultFindMatchType }); + } + if (e.affectsConfiguration(horizontalScrollingKey) && options2.horizontalScrolling === void 0) { + const horizontalScrolling = Boolean(configurationService.getValue(horizontalScrollingKey)); + newOptions = __spreadProps(__spreadValues({}, newOptions), { horizontalScrolling }); + } + if (e.affectsConfiguration(scrollByPageKey)) { + const scrollByPage = Boolean(configurationService.getValue(scrollByPageKey)); + newOptions = __spreadProps(__spreadValues({}, newOptions), { scrollByPage }); + } + if (e.affectsConfiguration(treeExpandMode) && options2.expandOnlyOnTwistieClick === void 0) { + newOptions = __spreadProps(__spreadValues({}, newOptions), { expandOnlyOnTwistieClick: configurationService.getValue(treeExpandMode) === "doubleClick" }); + } + if (e.affectsConfiguration(treeStickyScroll)) { + const enableStickyScroll = configurationService.getValue(treeStickyScroll); + newOptions = __spreadProps(__spreadValues({}, newOptions), { enableStickyScroll }); + } + if (e.affectsConfiguration(treeStickyScrollMaxElements)) { + const stickyScrollMaxItemCount = Math.max(1, configurationService.getValue(treeStickyScrollMaxElements)); + newOptions = __spreadProps(__spreadValues({}, newOptions), { stickyScrollMaxItemCount }); + } + if (e.affectsConfiguration(mouseWheelScrollSensitivityKey)) { + const mouseWheelScrollSensitivity = configurationService.getValue(mouseWheelScrollSensitivityKey); + newOptions = __spreadProps(__spreadValues({}, newOptions), { mouseWheelScrollSensitivity }); + } + if (e.affectsConfiguration(fastScrollSensitivityKey)) { + const fastScrollSensitivity = configurationService.getValue(fastScrollSensitivityKey); + newOptions = __spreadProps(__spreadValues({}, newOptions), { fastScrollSensitivity }); + } + if (Object.keys(newOptions).length > 0) { + tree.updateOptions(newOptions); + } + }), this.contextKeyService.onDidChangeContext((e) => { + if (e.affectsSome(interestingContextKeys)) { + tree.updateOptions({ typeNavigationMode: getTypeNavigationMode() }); + } + })); + this.navigator = new TreeResourceNavigator(tree, __spreadValues({ configurationService }, options2)); + this.disposables.push(this.navigator); + } + updateOptions(options2) { + if (options2.multipleSelectionSupport !== void 0) { + this.listSupportsMultiSelect.set(!!options2.multipleSelectionSupport); + } + } + updateStyleOverrides(overrideStyles2) { + this.tree.style(overrideStyles2 ? getListStyles(overrideStyles2) : defaultListStyles); + } + dispose() { + this.disposables = dispose(this.disposables); + } + }; + WorkbenchTreeInternals = __decorate38([ + __param32(4, IContextKeyService), + __param32(5, IListService), + __param32(6, IConfigurationService) + ], WorkbenchTreeInternals); + configurationRegistry3 = Registry.as(Extensions4.Configuration); + configurationRegistry3.registerConfiguration({ + id: "workbench", + order: 7, + title: localize("workbenchConfigurationTitle", "Workbench"), + type: "object", + properties: { + [multiSelectModifierSettingKey]: { + type: "string", + enum: ["ctrlCmd", "alt"], + markdownEnumDescriptions: [ + localize("multiSelectModifier.ctrlCmd", "Maps to `Control` on Windows and Linux and to `Command` on macOS."), + localize("multiSelectModifier.alt", "Maps to `Alt` on Windows and Linux and to `Option` on macOS.") + ], + default: "ctrlCmd", + description: localize({ + key: "multiSelectModifier", + comment: [ + "- `ctrlCmd` refers to a value the setting can take and should not be localized.", + "- `Control` and `Command` refer to the modifier keys Ctrl or Cmd on the keyboard and can be localized." + ] + }, "The modifier to be used to add an item in trees and lists to a multi-selection with the mouse (for example in the explorer, open editors and scm view). The 'Open to Side' mouse gestures - if supported - will adapt such that they do not conflict with the multiselect modifier.") + }, + [openModeSettingKey]: { + type: "string", + enum: ["singleClick", "doubleClick"], + default: "singleClick", + description: localize({ + key: "openModeModifier", + comment: ["`singleClick` and `doubleClick` refers to a value the setting can take and should not be localized."] + }, "Controls how to open items in trees and lists using the mouse (if supported). Note that some trees and lists might choose to ignore this setting if it is not applicable.") + }, + [horizontalScrollingKey]: { + type: "boolean", + default: false, + description: localize("horizontalScrolling setting", "Controls whether lists and trees support horizontal scrolling in the workbench. Warning: turning on this setting has a performance implication.") + }, + [scrollByPageKey]: { + type: "boolean", + default: false, + description: localize("list.scrollByPage", "Controls whether clicks in the scrollbar scroll page by page.") + }, + [treeIndentKey]: { + type: "number", + default: 8, + minimum: 4, + maximum: 40, + description: localize("tree indent setting", "Controls tree indentation in pixels.") + }, + [treeRenderIndentGuidesKey]: { + type: "string", + enum: ["none", "onHover", "always"], + default: "onHover", + description: localize("render tree indent guides", "Controls whether the tree should render indent guides.") + }, + [listSmoothScrolling]: { + type: "boolean", + default: false, + description: localize("list smoothScrolling setting", "Controls whether lists and trees have smooth scrolling.") + }, + [mouseWheelScrollSensitivityKey]: { + type: "number", + default: 1, + markdownDescription: localize("Mouse Wheel Scroll Sensitivity", "A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.") + }, + [fastScrollSensitivityKey]: { + type: "number", + default: 5, + markdownDescription: localize("Fast Scroll Sensitivity", "Scrolling speed multiplier when pressing `Alt`.") + }, + [defaultFindModeSettingKey]: { + type: "string", + enum: ["highlight", "filter"], + enumDescriptions: [ + localize("defaultFindModeSettingKey.highlight", "Highlight elements when searching. Further up and down navigation will traverse only the highlighted elements."), + localize("defaultFindModeSettingKey.filter", "Filter elements when searching.") + ], + default: "highlight", + description: localize("defaultFindModeSettingKey", "Controls the default find mode for lists and trees in the workbench.") + }, + [keyboardNavigationSettingKey]: { + type: "string", + enum: ["simple", "highlight", "filter"], + enumDescriptions: [ + localize("keyboardNavigationSettingKey.simple", "Simple keyboard navigation focuses elements which match the keyboard input. Matching is done only on prefixes."), + localize("keyboardNavigationSettingKey.highlight", "Highlight keyboard navigation highlights elements which match the keyboard input. Further up and down navigation will traverse only the highlighted elements."), + localize("keyboardNavigationSettingKey.filter", "Filter keyboard navigation will filter out and hide all the elements which do not match the keyboard input.") + ], + default: "highlight", + description: localize("keyboardNavigationSettingKey", "Controls the keyboard navigation style for lists and trees in the workbench. Can be simple, highlight and filter."), + deprecated: true, + deprecationMessage: localize("keyboardNavigationSettingKeyDeprecated", "Please use 'workbench.list.defaultFindMode' and 'workbench.list.typeNavigationMode' instead.") + }, + [defaultFindMatchTypeSettingKey]: { + type: "string", + enum: ["fuzzy", "contiguous"], + enumDescriptions: [ + localize("defaultFindMatchTypeSettingKey.fuzzy", "Use fuzzy matching when searching."), + localize("defaultFindMatchTypeSettingKey.contiguous", "Use contiguous matching when searching.") + ], + default: "fuzzy", + description: localize("defaultFindMatchTypeSettingKey", "Controls the type of matching used when searching lists and trees in the workbench.") + }, + [treeExpandMode]: { + type: "string", + enum: ["singleClick", "doubleClick"], + default: "singleClick", + description: localize("expand mode", "Controls how tree folders are expanded when clicking the folder names. Note that some trees and lists might choose to ignore this setting if it is not applicable.") + }, + [treeStickyScroll]: { + type: "boolean", + default: true, + description: localize("sticky scroll", "Controls whether sticky scrolling is enabled in trees.") + }, + [treeStickyScrollMaxElements]: { + type: "number", + minimum: 1, + default: 7, + markdownDescription: localize("sticky scroll maximum items", "Controls the number of sticky elements displayed in the tree when `#workbench.tree.enableStickyScroll#` is enabled.") + }, + [typeNavigationModeSettingKey]: { + type: "string", + enum: ["automatic", "trigger"], + default: "automatic", + markdownDescription: localize("typeNavigationMode2", "Controls how type navigation works in lists and trees in the workbench. When set to `trigger`, type navigation begins once the `list.triggerTypeNavigation` command is run.") + } + } + }); + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/iconLabel/iconlabel.css +var init_iconlabel = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/iconLabel/iconlabel.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/highlightedlabel/highlightedLabel.js +var HighlightedLabel; +var init_highlightedLabel = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/highlightedlabel/highlightedLabel.js"() { + init_dom(); + init_hoverDelegate2(); + init_hoverDelegateFactory(); + init_iconLabels(); + init_lifecycle(); + init_objects(); + HighlightedLabel = class _HighlightedLabel extends Disposable { + /** + * Create a new {@link HighlightedLabel}. + * + * @param container The parent container to append to. + */ + constructor(container, options2) { + var _a10; + super(); + this.options = options2; + this.text = ""; + this.title = ""; + this.highlights = []; + this.didEverRender = false; + this.supportIcons = (_a10 = options2 === null || options2 === void 0 ? void 0 : options2.supportIcons) !== null && _a10 !== void 0 ? _a10 : false; + this.domNode = append(container, $("span.monaco-highlighted-label")); + } + /** + * The label's DOM node. + */ + get element() { + return this.domNode; + } + /** + * Set the label and highlights. + * + * @param text The label to display. + * @param highlights The ranges to highlight. + * @param title An optional title for the hover tooltip. + * @param escapeNewLines Whether to escape new lines. + * @returns + */ + set(text2, highlights = [], title = "", escapeNewLines) { + if (!text2) { + text2 = ""; + } + if (escapeNewLines) { + text2 = _HighlightedLabel.escapeNewLines(text2, highlights); + } + if (this.didEverRender && this.text === text2 && this.title === title && equals2(this.highlights, highlights)) { + return; + } + this.text = text2; + this.title = title; + this.highlights = highlights; + this.render(); + } + render() { + var _a10, _b4, _c2, _d2; + const children = []; + let pos = 0; + for (const highlight of this.highlights) { + if (highlight.end === highlight.start) { + continue; + } + if (pos < highlight.start) { + const substring2 = this.text.substring(pos, highlight.start); + if (this.supportIcons) { + children.push(...renderLabelWithIcons(substring2)); + } else { + children.push(substring2); + } + pos = highlight.start; + } + const substring = this.text.substring(pos, highlight.end); + const element = $("span.highlight", void 0, ...this.supportIcons ? renderLabelWithIcons(substring) : [substring]); + if (highlight.extraClasses) { + element.classList.add(...highlight.extraClasses); + } + children.push(element); + pos = highlight.end; + } + if (pos < this.text.length) { + const substring = this.text.substring(pos); + if (this.supportIcons) { + children.push(...renderLabelWithIcons(substring)); + } else { + children.push(substring); + } + } + reset(this.domNode, ...children); + if ((_b4 = (_a10 = this.options) === null || _a10 === void 0 ? void 0 : _a10.hoverDelegate) === null || _b4 === void 0 ? void 0 : _b4.showNativeHover) { + this.domNode.title = this.title; + } else { + if (!this.customHover && this.title !== "") { + const hoverDelegate = (_d2 = (_c2 = this.options) === null || _c2 === void 0 ? void 0 : _c2.hoverDelegate) !== null && _d2 !== void 0 ? _d2 : getDefaultHoverDelegate("mouse"); + this.customHover = this._register(getBaseLayerHoverDelegate().setupUpdatableHover(hoverDelegate, this.domNode, this.title)); + } else if (this.customHover) { + this.customHover.update(this.title); + } + } + this.didEverRender = true; + } + static escapeNewLines(text2, highlights) { + let total = 0; + let extra = 0; + return text2.replace(/\r\n|\r|\n/g, (match2, offset) => { + extra = match2 === "\r\n" ? -1 : 0; + offset += total; + for (const highlight of highlights) { + if (highlight.end <= offset) { + continue; + } + if (highlight.start >= offset) { + highlight.start += extra; + } + if (highlight.end >= offset) { + highlight.end += extra; + } + } + total += extra; + return "\u23CE"; + }); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/iconLabel/iconLabel.js +function splitMatches(labels, separator, matches2) { + if (!matches2) { + return void 0; + } + let labelStart = 0; + return labels.map((label) => { + const labelRange = { start: labelStart, end: labelStart + label.length }; + const result = matches2.map((match2) => Range2.intersect(labelRange, match2)).filter((range2) => !Range2.isEmpty(range2)).map(({ start, end }) => ({ start: start - labelStart, end: end - labelStart })); + labelStart = labelRange.end + separator.length; + return result; + }); +} +var FastLabelNode, IconLabel, Label, LabelWithHighlights; +var init_iconLabel = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/iconLabel/iconLabel.js"() { + init_iconlabel(); + init_dom(); + init_highlightedLabel(); + init_lifecycle(); + init_objects(); + init_range2(); + init_hoverDelegateFactory(); + init_hoverDelegate2(); + init_types(); + init_iconLabels2(); + FastLabelNode = class { + constructor(_element) { + this._element = _element; + } + get element() { + return this._element; + } + set textContent(content) { + if (this.disposed || content === this._textContent) { + return; + } + this._textContent = content; + this._element.textContent = content; + } + set className(className) { + if (this.disposed || className === this._className) { + return; + } + this._className = className; + this._element.className = className; + } + set empty(empty2) { + if (this.disposed || empty2 === this._empty) { + return; + } + this._empty = empty2; + this._element.style.marginLeft = empty2 ? "0" : ""; + } + dispose() { + this.disposed = true; + } + }; + IconLabel = class extends Disposable { + constructor(container, options2) { + var _a10; + super(); + this.customHovers = /* @__PURE__ */ new Map(); + this.creationOptions = options2; + this.domNode = this._register(new FastLabelNode(append(container, $(".monaco-icon-label")))); + this.labelContainer = append(this.domNode.element, $(".monaco-icon-label-container")); + this.nameContainer = append(this.labelContainer, $("span.monaco-icon-name-container")); + if ((options2 === null || options2 === void 0 ? void 0 : options2.supportHighlights) || (options2 === null || options2 === void 0 ? void 0 : options2.supportIcons)) { + this.nameNode = this._register(new LabelWithHighlights(this.nameContainer, !!options2.supportIcons)); + } else { + this.nameNode = new Label(this.nameContainer); + } + this.hoverDelegate = (_a10 = options2 === null || options2 === void 0 ? void 0 : options2.hoverDelegate) !== null && _a10 !== void 0 ? _a10 : getDefaultHoverDelegate("mouse"); + } + get element() { + return this.domNode.element; + } + setLabel(label, description, options2) { + var _a10; + const labelClasses = ["monaco-icon-label"]; + const containerClasses = ["monaco-icon-label-container"]; + let ariaLabel = ""; + if (options2) { + if (options2.extraClasses) { + labelClasses.push(...options2.extraClasses); + } + if (options2.italic) { + labelClasses.push("italic"); + } + if (options2.strikethrough) { + labelClasses.push("strikethrough"); + } + if (options2.disabledCommand) { + containerClasses.push("disabled"); + } + if (options2.title) { + if (typeof options2.title === "string") { + ariaLabel += options2.title; + } else { + ariaLabel += label; + } + } + } + const existingIconNode = this.domNode.element.querySelector(".monaco-icon-label-iconpath"); + if (options2 === null || options2 === void 0 ? void 0 : options2.iconPath) { + let iconNode; + if (!existingIconNode || !isHTMLElement(existingIconNode)) { + iconNode = $(".monaco-icon-label-iconpath"); + this.domNode.element.prepend(iconNode); + } else { + iconNode = existingIconNode; + } + iconNode.style.backgroundImage = asCSSUrl(options2 === null || options2 === void 0 ? void 0 : options2.iconPath); + } else if (existingIconNode) { + existingIconNode.remove(); + } + this.domNode.className = labelClasses.join(" "); + this.domNode.element.setAttribute("aria-label", ariaLabel); + this.labelContainer.className = containerClasses.join(" "); + this.setupHover((options2 === null || options2 === void 0 ? void 0 : options2.descriptionTitle) ? this.labelContainer : this.element, options2 === null || options2 === void 0 ? void 0 : options2.title); + this.nameNode.setLabel(label, options2); + if (description || this.descriptionNode) { + const descriptionNode = this.getOrCreateDescriptionNode(); + if (descriptionNode instanceof HighlightedLabel) { + descriptionNode.set(description || "", options2 ? options2.descriptionMatches : void 0, void 0, options2 === null || options2 === void 0 ? void 0 : options2.labelEscapeNewLines); + this.setupHover(descriptionNode.element, options2 === null || options2 === void 0 ? void 0 : options2.descriptionTitle); + } else { + descriptionNode.textContent = description && (options2 === null || options2 === void 0 ? void 0 : options2.labelEscapeNewLines) ? HighlightedLabel.escapeNewLines(description, []) : description || ""; + this.setupHover(descriptionNode.element, (options2 === null || options2 === void 0 ? void 0 : options2.descriptionTitle) || ""); + descriptionNode.empty = !description; + } + } + if ((options2 === null || options2 === void 0 ? void 0 : options2.suffix) || this.suffixNode) { + const suffixNode = this.getOrCreateSuffixNode(); + suffixNode.textContent = (_a10 = options2 === null || options2 === void 0 ? void 0 : options2.suffix) !== null && _a10 !== void 0 ? _a10 : ""; + } + } + setupHover(htmlElement, tooltip) { + const previousCustomHover = this.customHovers.get(htmlElement); + if (previousCustomHover) { + previousCustomHover.dispose(); + this.customHovers.delete(htmlElement); + } + if (!tooltip) { + htmlElement.removeAttribute("title"); + return; + } + if (this.hoverDelegate.showNativeHover) { + let setupNativeHover = function(htmlElement2, tooltip2) { + if (isString(tooltip2)) { + htmlElement2.title = stripIcons(tooltip2); + } else if (tooltip2 === null || tooltip2 === void 0 ? void 0 : tooltip2.markdownNotSupportedFallback) { + htmlElement2.title = tooltip2.markdownNotSupportedFallback; + } else { + htmlElement2.removeAttribute("title"); + } + }; + setupNativeHover(htmlElement, tooltip); + } else { + const hoverDisposable = getBaseLayerHoverDelegate().setupUpdatableHover(this.hoverDelegate, htmlElement, tooltip); + if (hoverDisposable) { + this.customHovers.set(htmlElement, hoverDisposable); + } + } + } + dispose() { + super.dispose(); + for (const disposable of this.customHovers.values()) { + disposable.dispose(); + } + this.customHovers.clear(); + } + getOrCreateSuffixNode() { + if (!this.suffixNode) { + const suffixContainer = this._register(new FastLabelNode(after(this.nameContainer, $("span.monaco-icon-suffix-container")))); + this.suffixNode = this._register(new FastLabelNode(append(suffixContainer.element, $("span.label-suffix")))); + } + return this.suffixNode; + } + getOrCreateDescriptionNode() { + var _a10; + if (!this.descriptionNode) { + const descriptionContainer = this._register(new FastLabelNode(append(this.labelContainer, $("span.monaco-icon-description-container")))); + if ((_a10 = this.creationOptions) === null || _a10 === void 0 ? void 0 : _a10.supportDescriptionHighlights) { + this.descriptionNode = this._register(new HighlightedLabel(append(descriptionContainer.element, $("span.label-description")), { supportIcons: !!this.creationOptions.supportIcons })); + } else { + this.descriptionNode = this._register(new FastLabelNode(append(descriptionContainer.element, $("span.label-description")))); + } + } + return this.descriptionNode; + } + }; + Label = class { + constructor(container) { + this.container = container; + this.label = void 0; + this.singleLabel = void 0; + } + setLabel(label, options2) { + if (this.label === label && equals2(this.options, options2)) { + return; + } + this.label = label; + this.options = options2; + if (typeof label === "string") { + if (!this.singleLabel) { + this.container.innerText = ""; + this.container.classList.remove("multiple"); + this.singleLabel = append(this.container, $("a.label-name", { id: options2 === null || options2 === void 0 ? void 0 : options2.domId })); + } + this.singleLabel.textContent = label; + } else { + this.container.innerText = ""; + this.container.classList.add("multiple"); + this.singleLabel = void 0; + for (let i = 0; i < label.length; i++) { + const l = label[i]; + const id = (options2 === null || options2 === void 0 ? void 0 : options2.domId) && `${options2 === null || options2 === void 0 ? void 0 : options2.domId}_${i}`; + append(this.container, $("a.label-name", { id, "data-icon-label-count": label.length, "data-icon-label-index": i, "role": "treeitem" }, l)); + if (i < label.length - 1) { + append(this.container, $("span.label-separator", void 0, (options2 === null || options2 === void 0 ? void 0 : options2.separator) || "/")); + } + } + } + } + }; + LabelWithHighlights = class extends Disposable { + constructor(container, supportIcons) { + super(); + this.container = container; + this.supportIcons = supportIcons; + this.label = void 0; + this.singleLabel = void 0; + } + setLabel(label, options2) { + if (this.label === label && equals2(this.options, options2)) { + return; + } + this.label = label; + this.options = options2; + if (typeof label === "string") { + if (!this.singleLabel) { + this.container.innerText = ""; + this.container.classList.remove("multiple"); + this.singleLabel = this._register(new HighlightedLabel(append(this.container, $("a.label-name", { id: options2 === null || options2 === void 0 ? void 0 : options2.domId })), { supportIcons: this.supportIcons })); + } + this.singleLabel.set(label, options2 === null || options2 === void 0 ? void 0 : options2.matches, void 0, options2 === null || options2 === void 0 ? void 0 : options2.labelEscapeNewLines); + } else { + this.container.innerText = ""; + this.container.classList.add("multiple"); + this.singleLabel = void 0; + const separator = (options2 === null || options2 === void 0 ? void 0 : options2.separator) || "/"; + const matches2 = splitMatches(label, separator, options2 === null || options2 === void 0 ? void 0 : options2.matches); + for (let i = 0; i < label.length; i++) { + const l = label[i]; + const m = matches2 ? matches2[i] : void 0; + const id = (options2 === null || options2 === void 0 ? void 0 : options2.domId) && `${options2 === null || options2 === void 0 ? void 0 : options2.domId}_${i}`; + const name = $("a.label-name", { id, "data-icon-label-count": label.length, "data-icon-label-index": i, "role": "treeitem" }); + const highlightedLabel = this._register(new HighlightedLabel(append(this.container, name), { supportIcons: this.supportIcons })); + highlightedLabel.set(l, m, void 0, options2 === null || options2 === void 0 ? void 0 : options2.labelEscapeNewLines); + if (i < label.length - 1) { + append(name, $("span.label-separator", void 0, separator)); + } + } + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/keybindingLabel/keybindingLabel.css +var init_keybindingLabel = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/keybindingLabel/keybindingLabel.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/keybindingLabel/keybindingLabel.js +var $7, unthemedKeybindingLabelOptions, KeybindingLabel; +var init_keybindingLabel2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/keybindingLabel/keybindingLabel.js"() { + init_dom(); + init_hoverDelegate2(); + init_hoverDelegateFactory(); + init_keybindingLabels(); + init_lifecycle(); + init_objects(); + init_keybindingLabel(); + init_nls(); + $7 = $; + unthemedKeybindingLabelOptions = { + keybindingLabelBackground: void 0, + keybindingLabelForeground: void 0, + keybindingLabelBorder: void 0, + keybindingLabelBottomBorder: void 0, + keybindingLabelShadow: void 0 + }; + KeybindingLabel = class _KeybindingLabel extends Disposable { + constructor(container, os, options2) { + super(); + this.os = os; + this.keyElements = /* @__PURE__ */ new Set(); + this.options = options2 || /* @__PURE__ */ Object.create(null); + const labelForeground = this.options.keybindingLabelForeground; + this.domNode = append(container, $7(".monaco-keybinding")); + if (labelForeground) { + this.domNode.style.color = labelForeground; + } + this.hover = this._register(getBaseLayerHoverDelegate().setupUpdatableHover(getDefaultHoverDelegate("mouse"), this.domNode, "")); + this.didEverRender = false; + container.appendChild(this.domNode); + } + get element() { + return this.domNode; + } + set(keybinding, matches2) { + if (this.didEverRender && this.keybinding === keybinding && _KeybindingLabel.areSame(this.matches, matches2)) { + return; + } + this.keybinding = keybinding; + this.matches = matches2; + this.render(); + } + render() { + var _a10; + this.clear(); + if (this.keybinding) { + const chords = this.keybinding.getChords(); + if (chords[0]) { + this.renderChord(this.domNode, chords[0], this.matches ? this.matches.firstPart : null); + } + for (let i = 1; i < chords.length; i++) { + append(this.domNode, $7("span.monaco-keybinding-key-chord-separator", void 0, " ")); + this.renderChord(this.domNode, chords[i], this.matches ? this.matches.chordPart : null); + } + const title = ((_a10 = this.options.disableTitle) !== null && _a10 !== void 0 ? _a10 : false) ? void 0 : this.keybinding.getAriaLabel() || void 0; + this.hover.update(title); + this.domNode.setAttribute("aria-label", title || ""); + } else if (this.options && this.options.renderUnboundKeybindings) { + this.renderUnbound(this.domNode); + } + this.didEverRender = true; + } + clear() { + clearNode(this.domNode); + this.keyElements.clear(); + } + renderChord(parent, chord, match2) { + const modifierLabels = UILabelProvider.modifierLabels[this.os]; + if (chord.ctrlKey) { + this.renderKey(parent, modifierLabels.ctrlKey, Boolean(match2 === null || match2 === void 0 ? void 0 : match2.ctrlKey), modifierLabels.separator); + } + if (chord.shiftKey) { + this.renderKey(parent, modifierLabels.shiftKey, Boolean(match2 === null || match2 === void 0 ? void 0 : match2.shiftKey), modifierLabels.separator); + } + if (chord.altKey) { + this.renderKey(parent, modifierLabels.altKey, Boolean(match2 === null || match2 === void 0 ? void 0 : match2.altKey), modifierLabels.separator); + } + if (chord.metaKey) { + this.renderKey(parent, modifierLabels.metaKey, Boolean(match2 === null || match2 === void 0 ? void 0 : match2.metaKey), modifierLabels.separator); + } + const keyLabel = chord.keyLabel; + if (keyLabel) { + this.renderKey(parent, keyLabel, Boolean(match2 === null || match2 === void 0 ? void 0 : match2.keyCode), ""); + } + } + renderKey(parent, label, highlight, separator) { + append(parent, this.createKeyElement(label, highlight ? ".highlight" : "")); + if (separator) { + append(parent, $7("span.monaco-keybinding-key-separator", void 0, separator)); + } + } + renderUnbound(parent) { + append(parent, this.createKeyElement(localize("unbound", "Unbound"))); + } + createKeyElement(label, extraClass = "") { + const keyElement = $7("span.monaco-keybinding-key" + extraClass, void 0, label); + this.keyElements.add(keyElement); + if (this.options.keybindingLabelBackground) { + keyElement.style.backgroundColor = this.options.keybindingLabelBackground; + } + if (this.options.keybindingLabelBorder) { + keyElement.style.borderColor = this.options.keybindingLabelBorder; + } + if (this.options.keybindingLabelBottomBorder) { + keyElement.style.borderBottomColor = this.options.keybindingLabelBottomBorder; + } + if (this.options.keybindingLabelShadow) { + keyElement.style.boxShadow = `inset 0 -1px 0 ${this.options.keybindingLabelShadow}`; + } + return keyElement; + } + static areSame(a3, b) { + if (a3 === b || !a3 && !b) { + return true; + } + return !!a3 && !!b && equals2(a3.firstPart, b.firstPart) && equals2(a3.chordPart, b.chordPart); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/comparers.js +function compareFileNames(one, other, caseSensitive = false) { + const a3 = one || ""; + const b = other || ""; + const result = intlFileNameCollatorBaseNumeric.value.collator.compare(a3, b); + if (intlFileNameCollatorBaseNumeric.value.collatorIsNumeric && result === 0 && a3 !== b) { + return a3 < b ? -1 : 1; + } + return result; +} +function compareAnything(one, other, lookFor) { + const elementAName = one.toLowerCase(); + const elementBName = other.toLowerCase(); + const prefixCompare = compareByPrefix(one, other, lookFor); + if (prefixCompare) { + return prefixCompare; + } + const elementASuffixMatch = elementAName.endsWith(lookFor); + const elementBSuffixMatch = elementBName.endsWith(lookFor); + if (elementASuffixMatch !== elementBSuffixMatch) { + return elementASuffixMatch ? -1 : 1; + } + const r = compareFileNames(elementAName, elementBName); + if (r !== 0) { + return r; + } + return elementAName.localeCompare(elementBName); +} +function compareByPrefix(one, other, lookFor) { + const elementAName = one.toLowerCase(); + const elementBName = other.toLowerCase(); + const elementAPrefixMatch = elementAName.startsWith(lookFor); + const elementBPrefixMatch = elementBName.startsWith(lookFor); + if (elementAPrefixMatch !== elementBPrefixMatch) { + return elementAPrefixMatch ? -1 : 1; + } else if (elementAPrefixMatch && elementBPrefixMatch) { + if (elementAName.length < elementBName.length) { + return -1; + } + if (elementAName.length > elementBName.length) { + return 1; + } + } + return 0; +} +var intlFileNameCollatorBaseNumeric, intlFileNameCollatorNumeric, intlFileNameCollatorNumericCaseInsensitive; +var init_comparers = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/comparers.js"() { + init_lazy(); + intlFileNameCollatorBaseNumeric = new Lazy(() => { + const collator = new Intl.Collator(void 0, { numeric: true, sensitivity: "base" }); + return { + collator, + collatorIsNumeric: collator.resolvedOptions().numeric + }; + }); + intlFileNameCollatorNumeric = new Lazy(() => { + const collator = new Intl.Collator(void 0, { numeric: true }); + return { + collator + }; + }); + intlFileNameCollatorNumericCaseInsensitive = new Lazy(() => { + const collator = new Intl.Collator(void 0, { numeric: true, sensitivity: "accent" }); + return { + collator + }; + }); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickInputTree.js +function matchesContiguousIconAware(query, target) { + const { text: text2, iconOffsets } = target; + if (!iconOffsets || iconOffsets.length === 0) { + return matchesContiguous(query, text2); + } + const wordToMatchAgainstWithoutIconsTrimmed = ltrim(text2, " "); + const leadingWhitespaceOffset = text2.length - wordToMatchAgainstWithoutIconsTrimmed.length; + const matches2 = matchesContiguous(query, wordToMatchAgainstWithoutIconsTrimmed); + if (matches2) { + for (const match2 of matches2) { + const iconOffset = iconOffsets[match2.start + leadingWhitespaceOffset] + leadingWhitespaceOffset; + match2.start += iconOffset; + match2.end += iconOffset; + } + } + return matches2; +} +function matchesContiguous(word, wordToMatchAgainst) { + const matchIndex = wordToMatchAgainst.toLowerCase().indexOf(word.toLowerCase()); + if (matchIndex !== -1) { + return [{ start: matchIndex, end: matchIndex + word.length }]; + } + return null; +} +function compareEntries(elementA, elementB, lookFor) { + const labelHighlightsA = elementA.labelHighlights || []; + const labelHighlightsB = elementB.labelHighlights || []; + if (labelHighlightsA.length && !labelHighlightsB.length) { + return -1; + } + if (!labelHighlightsA.length && labelHighlightsB.length) { + return 1; + } + if (labelHighlightsA.length === 0 && labelHighlightsB.length === 0) { + return 0; + } + return compareAnything(elementA.saneSortLabel, elementB.saneSortLabel, lookFor); +} +var __decorate39, __param33, QuickPickItemElementRenderer_1, $8, BaseQuickPickItemElement, QuickPickItemElement, QuickPickSeparatorFocusReason, QuickPickSeparatorElement, QuickInputItemDelegate, QuickInputAccessibilityProvider, BaseQuickInputListRenderer, QuickPickItemElementRenderer, QuickPickSeparatorElementRenderer, QuickInputTree; +var init_quickInputTree = __esm({ + "node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickInputTree.js"() { + init_dom(); + init_event(); + init_nls(); + init_instantiation(); + init_listService(); + init_themeService(); + init_lifecycle(); + init_keyboardEvent(); + init_platform(); + init_decorators(); + init_iconLabel(); + init_keybindingLabel2(); + init_actionbar2(); + init_theme(); + init_uri(); + init_quickInputUtils(); + init_lazy(); + init_iconLabels2(); + init_comparers(); + init_strings(); + init_abstractTree(); + init_async(); + init_errors(); + init_quickInput(); + init_accessibility(); + __decorate39 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param33 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + $8 = $; + BaseQuickPickItemElement = class { + constructor(index, hasCheckbox, mainItem) { + this.index = index; + this.hasCheckbox = hasCheckbox; + this._hidden = false; + this._init = new Lazy(() => { + var _a10; + const saneLabel = (_a10 = mainItem.label) !== null && _a10 !== void 0 ? _a10 : ""; + const saneSortLabel = parseLabelWithIcons(saneLabel).text.trim(); + const saneAriaLabel = mainItem.ariaLabel || [saneLabel, this.saneDescription, this.saneDetail].map((s) => getCodiconAriaLabel(s)).filter((s) => !!s).join(", "); + return { + saneLabel, + saneSortLabel, + saneAriaLabel + }; + }); + this._saneDescription = mainItem.description; + this._saneTooltip = mainItem.tooltip; + } + // #region Lazy Getters + get saneLabel() { + return this._init.value.saneLabel; + } + get saneSortLabel() { + return this._init.value.saneSortLabel; + } + get saneAriaLabel() { + return this._init.value.saneAriaLabel; + } + get element() { + return this._element; + } + set element(value) { + this._element = value; + } + get hidden() { + return this._hidden; + } + set hidden(value) { + this._hidden = value; + } + get saneDescription() { + return this._saneDescription; + } + set saneDescription(value) { + this._saneDescription = value; + } + get saneDetail() { + return this._saneDetail; + } + set saneDetail(value) { + this._saneDetail = value; + } + get saneTooltip() { + return this._saneTooltip; + } + set saneTooltip(value) { + this._saneTooltip = value; + } + get labelHighlights() { + return this._labelHighlights; + } + set labelHighlights(value) { + this._labelHighlights = value; + } + get descriptionHighlights() { + return this._descriptionHighlights; + } + set descriptionHighlights(value) { + this._descriptionHighlights = value; + } + get detailHighlights() { + return this._detailHighlights; + } + set detailHighlights(value) { + this._detailHighlights = value; + } + }; + QuickPickItemElement = class extends BaseQuickPickItemElement { + constructor(index, hasCheckbox, fireButtonTriggered, _onChecked, item, _separator) { + var _a10, _b4, _c2; + super(index, hasCheckbox, item); + this.fireButtonTriggered = fireButtonTriggered; + this._onChecked = _onChecked; + this.item = item; + this._separator = _separator; + this._checked = false; + this.onChecked = hasCheckbox ? Event.map(Event.filter(this._onChecked.event, (e) => e.element === this), (e) => e.checked) : Event.None; + this._saneDetail = item.detail; + this._labelHighlights = (_a10 = item.highlights) === null || _a10 === void 0 ? void 0 : _a10.label; + this._descriptionHighlights = (_b4 = item.highlights) === null || _b4 === void 0 ? void 0 : _b4.description; + this._detailHighlights = (_c2 = item.highlights) === null || _c2 === void 0 ? void 0 : _c2.detail; + } + get separator() { + return this._separator; + } + set separator(value) { + this._separator = value; + } + get checked() { + return this._checked; + } + set checked(value) { + if (value !== this._checked) { + this._checked = value; + this._onChecked.fire({ element: this, checked: value }); + } + } + get checkboxDisabled() { + return !!this.item.disabled; + } + }; + (function(QuickPickSeparatorFocusReason2) { + QuickPickSeparatorFocusReason2[QuickPickSeparatorFocusReason2["NONE"] = 0] = "NONE"; + QuickPickSeparatorFocusReason2[QuickPickSeparatorFocusReason2["MOUSE_HOVER"] = 1] = "MOUSE_HOVER"; + QuickPickSeparatorFocusReason2[QuickPickSeparatorFocusReason2["ACTIVE_ITEM"] = 2] = "ACTIVE_ITEM"; + })(QuickPickSeparatorFocusReason || (QuickPickSeparatorFocusReason = {})); + QuickPickSeparatorElement = class extends BaseQuickPickItemElement { + constructor(index, fireSeparatorButtonTriggered, separator) { + super(index, false, separator); + this.fireSeparatorButtonTriggered = fireSeparatorButtonTriggered; + this.separator = separator; + this.children = new Array(); + this.focusInsideSeparator = QuickPickSeparatorFocusReason.NONE; + } + }; + QuickInputItemDelegate = class { + getHeight(element) { + if (element instanceof QuickPickSeparatorElement) { + return 30; + } + return element.saneDetail ? 44 : 22; + } + getTemplateId(element) { + if (element instanceof QuickPickItemElement) { + return QuickPickItemElementRenderer.ID; + } else { + return QuickPickSeparatorElementRenderer.ID; + } + } + }; + QuickInputAccessibilityProvider = class { + getWidgetAriaLabel() { + return localize("quickInput", "Quick Input"); + } + getAriaLabel(element) { + var _a10; + return ((_a10 = element.separator) === null || _a10 === void 0 ? void 0 : _a10.label) ? `${element.saneAriaLabel}, ${element.separator.label}` : element.saneAriaLabel; + } + getWidgetRole() { + return "listbox"; + } + getRole(element) { + return element.hasCheckbox ? "checkbox" : "option"; + } + isChecked(element) { + if (!element.hasCheckbox || !(element instanceof QuickPickItemElement)) { + return void 0; + } + return { + get value() { + return element.checked; + }, + onDidChange: (e) => element.onChecked(() => e()) + }; + } + }; + BaseQuickInputListRenderer = class { + constructor(hoverDelegate) { + this.hoverDelegate = hoverDelegate; + } + // TODO: only do the common stuff here and have a subclass handle their specific stuff + renderTemplate(container) { + const data = /* @__PURE__ */ Object.create(null); + data.toDisposeElement = new DisposableStore(); + data.toDisposeTemplate = new DisposableStore(); + data.entry = append(container, $8(".quick-input-list-entry")); + const label = append(data.entry, $8("label.quick-input-list-label")); + data.toDisposeTemplate.add(addStandardDisposableListener(label, EventType.CLICK, (e) => { + if (!data.checkbox.offsetParent) { + e.preventDefault(); + } + })); + data.checkbox = append(label, $8("input.quick-input-list-checkbox")); + data.checkbox.type = "checkbox"; + const rows = append(label, $8(".quick-input-list-rows")); + const row1 = append(rows, $8(".quick-input-list-row")); + const row2 = append(rows, $8(".quick-input-list-row")); + data.label = new IconLabel(row1, { supportHighlights: true, supportDescriptionHighlights: true, supportIcons: true, hoverDelegate: this.hoverDelegate }); + data.toDisposeTemplate.add(data.label); + data.icon = prepend(data.label.element, $8(".quick-input-list-icon")); + const keybindingContainer = append(row1, $8(".quick-input-list-entry-keybinding")); + data.keybinding = new KeybindingLabel(keybindingContainer, OS); + data.toDisposeTemplate.add(data.keybinding); + const detailContainer = append(row2, $8(".quick-input-list-label-meta")); + data.detail = new IconLabel(detailContainer, { supportHighlights: true, supportIcons: true, hoverDelegate: this.hoverDelegate }); + data.toDisposeTemplate.add(data.detail); + data.separator = append(data.entry, $8(".quick-input-list-separator")); + data.actionBar = new ActionBar(data.entry, this.hoverDelegate ? { hoverDelegate: this.hoverDelegate } : void 0); + data.actionBar.domNode.classList.add("quick-input-list-entry-action-bar"); + data.toDisposeTemplate.add(data.actionBar); + return data; + } + disposeTemplate(data) { + data.toDisposeElement.dispose(); + data.toDisposeTemplate.dispose(); + } + disposeElement(_element, _index, data) { + data.toDisposeElement.clear(); + data.actionBar.clear(); + } + }; + QuickPickItemElementRenderer = QuickPickItemElementRenderer_1 = class QuickPickItemElementRenderer2 extends BaseQuickInputListRenderer { + constructor(hoverDelegate, themeService) { + super(hoverDelegate); + this.themeService = themeService; + this._itemsWithSeparatorsFrequency = /* @__PURE__ */ new Map(); + } + get templateId() { + return QuickPickItemElementRenderer_1.ID; + } + renderTemplate(container) { + const data = super.renderTemplate(container); + data.toDisposeTemplate.add(addStandardDisposableListener(data.checkbox, EventType.CHANGE, (e) => { + data.element.checked = data.checkbox.checked; + })); + return data; + } + renderElement(node, index, data) { + var _a10, _b4, _c2; + const element = node.element; + data.element = element; + element.element = (_a10 = data.entry) !== null && _a10 !== void 0 ? _a10 : void 0; + const mainItem = element.item; + data.checkbox.checked = element.checked; + data.toDisposeElement.add(element.onChecked((checked) => data.checkbox.checked = checked)); + data.checkbox.disabled = element.checkboxDisabled; + const { labelHighlights, descriptionHighlights, detailHighlights } = element; + if (mainItem.iconPath) { + const icon = isDark(this.themeService.getColorTheme().type) ? mainItem.iconPath.dark : (_b4 = mainItem.iconPath.light) !== null && _b4 !== void 0 ? _b4 : mainItem.iconPath.dark; + const iconUrl = URI.revive(icon); + data.icon.className = "quick-input-list-icon"; + data.icon.style.backgroundImage = asCSSUrl(iconUrl); + } else { + data.icon.style.backgroundImage = ""; + data.icon.className = mainItem.iconClass ? `quick-input-list-icon ${mainItem.iconClass}` : ""; + } + let descriptionTitle; + if (!element.saneTooltip && element.saneDescription) { + descriptionTitle = { + markdown: { + value: element.saneDescription, + supportThemeIcons: true + }, + markdownNotSupportedFallback: element.saneDescription + }; + } + const options2 = { + matches: labelHighlights || [], + // If we have a tooltip, we want that to be shown and not any other hover + descriptionTitle, + descriptionMatches: descriptionHighlights || [], + labelEscapeNewLines: true + }; + options2.extraClasses = mainItem.iconClasses; + options2.italic = mainItem.italic; + options2.strikethrough = mainItem.strikethrough; + data.entry.classList.remove("quick-input-list-separator-as-item"); + data.label.setLabel(element.saneLabel, element.saneDescription, options2); + data.keybinding.set(mainItem.keybinding); + if (element.saneDetail) { + let title; + if (!element.saneTooltip) { + title = { + markdown: { + value: element.saneDetail, + supportThemeIcons: true + }, + markdownNotSupportedFallback: element.saneDetail + }; + } + data.detail.element.style.display = ""; + data.detail.setLabel(element.saneDetail, void 0, { + matches: detailHighlights, + title, + labelEscapeNewLines: true + }); + } else { + data.detail.element.style.display = "none"; + } + if ((_c2 = element.separator) === null || _c2 === void 0 ? void 0 : _c2.label) { + data.separator.textContent = element.separator.label; + data.separator.style.display = ""; + this.addItemWithSeparator(element); + } else { + data.separator.style.display = "none"; + } + data.entry.classList.toggle("quick-input-list-separator-border", !!element.separator); + const buttons = mainItem.buttons; + if (buttons && buttons.length) { + data.actionBar.push(buttons.map((button, index2) => quickInputButtonToAction(button, `id-${index2}`, () => element.fireButtonTriggered({ button, item: element.item }))), { icon: true, label: false }); + data.entry.classList.add("has-actions"); + } else { + data.entry.classList.remove("has-actions"); + } + } + disposeElement(element, _index, data) { + this.removeItemWithSeparator(element.element); + super.disposeElement(element, _index, data); + } + isItemWithSeparatorVisible(item) { + return this._itemsWithSeparatorsFrequency.has(item); + } + addItemWithSeparator(item) { + this._itemsWithSeparatorsFrequency.set(item, (this._itemsWithSeparatorsFrequency.get(item) || 0) + 1); + } + removeItemWithSeparator(item) { + const frequency = this._itemsWithSeparatorsFrequency.get(item) || 0; + if (frequency > 1) { + this._itemsWithSeparatorsFrequency.set(item, frequency - 1); + } else { + this._itemsWithSeparatorsFrequency.delete(item); + } + } + }; + QuickPickItemElementRenderer.ID = "quickpickitem"; + QuickPickItemElementRenderer = QuickPickItemElementRenderer_1 = __decorate39([ + __param33(1, IThemeService) + ], QuickPickItemElementRenderer); + QuickPickSeparatorElementRenderer = class _QuickPickSeparatorElementRenderer extends BaseQuickInputListRenderer { + constructor() { + super(...arguments); + this._visibleSeparatorsFrequency = /* @__PURE__ */ new Map(); + } + get templateId() { + return _QuickPickSeparatorElementRenderer.ID; + } + get visibleSeparators() { + return [...this._visibleSeparatorsFrequency.keys()]; + } + isSeparatorVisible(separator) { + return this._visibleSeparatorsFrequency.has(separator); + } + renderElement(node, index, data) { + var _a10; + const element = node.element; + data.element = element; + element.element = (_a10 = data.entry) !== null && _a10 !== void 0 ? _a10 : void 0; + element.element.classList.toggle("focus-inside", !!element.focusInsideSeparator); + const mainItem = element.separator; + const { labelHighlights, descriptionHighlights, detailHighlights } = element; + data.icon.style.backgroundImage = ""; + data.icon.className = ""; + let descriptionTitle; + if (!element.saneTooltip && element.saneDescription) { + descriptionTitle = { + markdown: { + value: element.saneDescription, + supportThemeIcons: true + }, + markdownNotSupportedFallback: element.saneDescription + }; + } + const options2 = { + matches: labelHighlights || [], + // If we have a tooltip, we want that to be shown and not any other hover + descriptionTitle, + descriptionMatches: descriptionHighlights || [], + labelEscapeNewLines: true + }; + data.entry.classList.add("quick-input-list-separator-as-item"); + data.label.setLabel(element.saneLabel, element.saneDescription, options2); + if (element.saneDetail) { + let title; + if (!element.saneTooltip) { + title = { + markdown: { + value: element.saneDetail, + supportThemeIcons: true + }, + markdownNotSupportedFallback: element.saneDetail + }; + } + data.detail.element.style.display = ""; + data.detail.setLabel(element.saneDetail, void 0, { + matches: detailHighlights, + title, + labelEscapeNewLines: true + }); + } else { + data.detail.element.style.display = "none"; + } + data.separator.style.display = "none"; + data.entry.classList.add("quick-input-list-separator-border"); + const buttons = mainItem.buttons; + if (buttons && buttons.length) { + data.actionBar.push(buttons.map((button, index2) => quickInputButtonToAction(button, `id-${index2}`, () => element.fireSeparatorButtonTriggered({ button, separator: element.separator }))), { icon: true, label: false }); + data.entry.classList.add("has-actions"); + } else { + data.entry.classList.remove("has-actions"); + } + this.addSeparator(element); + } + disposeElement(element, _index, data) { + var _a10; + this.removeSeparator(element.element); + if (!this.isSeparatorVisible(element.element)) { + (_a10 = element.element.element) === null || _a10 === void 0 ? void 0 : _a10.classList.remove("focus-inside"); + } + super.disposeElement(element, _index, data); + } + addSeparator(separator) { + this._visibleSeparatorsFrequency.set(separator, (this._visibleSeparatorsFrequency.get(separator) || 0) + 1); + } + removeSeparator(separator) { + const frequency = this._visibleSeparatorsFrequency.get(separator) || 0; + if (frequency > 1) { + this._visibleSeparatorsFrequency.set(separator, frequency - 1); + } else { + this._visibleSeparatorsFrequency.delete(separator); + } + } + }; + QuickPickSeparatorElementRenderer.ID = "quickpickseparator"; + QuickInputTree = class QuickInputTree2 extends Disposable { + constructor(parent, hoverDelegate, linkOpenerDelegate, id, instantiationService, accessibilityService) { + super(); + this.parent = parent; + this.hoverDelegate = hoverDelegate; + this.linkOpenerDelegate = linkOpenerDelegate; + this.accessibilityService = accessibilityService; + this._onKeyDown = new Emitter(); + this._onLeave = new Emitter(); + this.onLeave = this._onLeave.event; + this._onChangedAllVisibleChecked = new Emitter(); + this.onChangedAllVisibleChecked = this._onChangedAllVisibleChecked.event; + this._onChangedCheckedCount = new Emitter(); + this.onChangedCheckedCount = this._onChangedCheckedCount.event; + this._onChangedVisibleCount = new Emitter(); + this.onChangedVisibleCount = this._onChangedVisibleCount.event; + this._onChangedCheckedElements = new Emitter(); + this.onChangedCheckedElements = this._onChangedCheckedElements.event; + this._onButtonTriggered = new Emitter(); + this.onButtonTriggered = this._onButtonTriggered.event; + this._onSeparatorButtonTriggered = new Emitter(); + this.onSeparatorButtonTriggered = this._onSeparatorButtonTriggered.event; + this._elementChecked = new Emitter(); + this._inputElements = new Array(); + this._elementTree = new Array(); + this._itemElements = new Array(); + this._elementDisposable = this._register(new DisposableStore()); + this._shouldFireCheckedEvents = true; + this._matchOnDescription = false; + this._matchOnDetail = false; + this._matchOnLabel = true; + this._matchOnLabelMode = "fuzzy"; + this._sortByLabel = true; + this._shouldLoop = true; + this._container = append(this.parent, $8(".quick-input-list")); + this._separatorRenderer = new QuickPickSeparatorElementRenderer(hoverDelegate); + this._itemRenderer = instantiationService.createInstance(QuickPickItemElementRenderer, hoverDelegate); + this._tree = this._register(instantiationService.createInstance(WorkbenchObjectTree, "QuickInput", this._container, new QuickInputItemDelegate(), [this._itemRenderer, this._separatorRenderer], { + accessibilityProvider: new QuickInputAccessibilityProvider(), + setRowLineHeight: false, + multipleSelectionSupport: false, + hideTwistiesOfChildlessElements: true, + renderIndentGuides: RenderIndentGuides.None, + findWidgetEnabled: false, + indent: 0, + horizontalScrolling: false, + allowNonCollapsibleParents: true, + alwaysConsumeMouseWheel: true + })); + this._tree.getHTMLElement().id = id; + this._registerListeners(); + } + //#region public getters/setters + get onDidChangeFocus() { + return Event.map(this._tree.onDidChangeFocus, (e) => e.elements.filter((e2) => e2 instanceof QuickPickItemElement).map((e2) => e2.item)); + } + get onDidChangeSelection() { + return Event.map(this._tree.onDidChangeSelection, (e) => ({ + items: e.elements.filter((e2) => e2 instanceof QuickPickItemElement).map((e2) => e2.item), + event: e.browserEvent + })); + } + get scrollTop() { + return this._tree.scrollTop; + } + set scrollTop(scrollTop) { + this._tree.scrollTop = scrollTop; + } + get ariaLabel() { + return this._tree.ariaLabel; + } + set ariaLabel(label) { + this._tree.ariaLabel = label !== null && label !== void 0 ? label : ""; + } + set enabled(value) { + this._tree.getHTMLElement().style.pointerEvents = value ? "" : "none"; + } + get matchOnDescription() { + return this._matchOnDescription; + } + set matchOnDescription(value) { + this._matchOnDescription = value; + } + get matchOnDetail() { + return this._matchOnDetail; + } + set matchOnDetail(value) { + this._matchOnDetail = value; + } + get matchOnLabel() { + return this._matchOnLabel; + } + set matchOnLabel(value) { + this._matchOnLabel = value; + } + get matchOnLabelMode() { + return this._matchOnLabelMode; + } + set matchOnLabelMode(value) { + this._matchOnLabelMode = value; + } + get sortByLabel() { + return this._sortByLabel; + } + set sortByLabel(value) { + this._sortByLabel = value; + } + get shouldLoop() { + return this._shouldLoop; + } + set shouldLoop(value) { + this._shouldLoop = value; + } + //#endregion + //#region register listeners + _registerListeners() { + this._registerOnKeyDown(); + this._registerOnContainerClick(); + this._registerOnMouseMiddleClick(); + this._registerOnElementChecked(); + this._registerOnContextMenu(); + this._registerHoverListeners(); + this._registerSelectionChangeListener(); + this._registerSeparatorActionShowingListeners(); + } + _registerOnKeyDown() { + this._register(this._tree.onKeyDown((e) => { + const event = new StandardKeyboardEvent(e); + switch (event.keyCode) { + case 10: + this.toggleCheckbox(); + break; + } + this._onKeyDown.fire(event); + })); + } + _registerOnContainerClick() { + this._register(addDisposableListener(this._container, EventType.CLICK, (e) => { + if (e.x || e.y) { + this._onLeave.fire(); + } + })); + } + _registerOnMouseMiddleClick() { + this._register(addDisposableListener(this._container, EventType.AUXCLICK, (e) => { + if (e.button === 1) { + this._onLeave.fire(); + } + })); + } + _registerOnElementChecked() { + this._register(this._elementChecked.event((_) => this._fireCheckedEvents())); + } + _registerOnContextMenu() { + this._register(this._tree.onContextMenu((e) => { + if (e.element) { + e.browserEvent.preventDefault(); + this._tree.setSelection([e.element]); + } + })); + } + _registerHoverListeners() { + const delayer3 = this._register(new ThrottledDelayer(this.hoverDelegate.delay)); + this._register(this._tree.onMouseOver((e) => __async(this, null, function* () { + var _a10; + if (isHTMLAnchorElement(e.browserEvent.target)) { + delayer3.cancel(); + return; + } + if ( + // anchors are an exception as called out above so we skip them here + !isHTMLAnchorElement(e.browserEvent.relatedTarget) && // check if the mouse is still over the same element + isAncestor(e.browserEvent.relatedTarget, (_a10 = e.element) === null || _a10 === void 0 ? void 0 : _a10.element) + ) { + return; + } + try { + yield delayer3.trigger(() => __async(this, null, function* () { + if (e.element instanceof QuickPickItemElement) { + this.showHover(e.element); + } + })); + } catch (e2) { + if (!isCancellationError(e2)) { + throw e2; + } + } + }))); + this._register(this._tree.onMouseOut((e) => { + var _a10; + if (isAncestor(e.browserEvent.relatedTarget, (_a10 = e.element) === null || _a10 === void 0 ? void 0 : _a10.element)) { + return; + } + delayer3.cancel(); + })); + } + /** + * Register's focus change and mouse events so that we can track when items inside of a + * separator's section are focused or hovered so that we can display the separator's actions + */ + _registerSeparatorActionShowingListeners() { + this._register(this._tree.onDidChangeFocus((e) => { + const parent = e.elements[0] ? this._tree.getParentElement(e.elements[0]) : null; + for (const separator of this._separatorRenderer.visibleSeparators) { + const value = separator === parent; + const currentActive = !!(separator.focusInsideSeparator & QuickPickSeparatorFocusReason.ACTIVE_ITEM); + if (currentActive !== value) { + if (value) { + separator.focusInsideSeparator |= QuickPickSeparatorFocusReason.ACTIVE_ITEM; + } else { + separator.focusInsideSeparator &= ~QuickPickSeparatorFocusReason.ACTIVE_ITEM; + } + this._tree.rerender(separator); + } + } + })); + this._register(this._tree.onMouseOver((e) => { + const parent = e.element ? this._tree.getParentElement(e.element) : null; + for (const separator of this._separatorRenderer.visibleSeparators) { + if (separator !== parent) { + continue; + } + const currentMouse = !!(separator.focusInsideSeparator & QuickPickSeparatorFocusReason.MOUSE_HOVER); + if (!currentMouse) { + separator.focusInsideSeparator |= QuickPickSeparatorFocusReason.MOUSE_HOVER; + this._tree.rerender(separator); + } + } + })); + this._register(this._tree.onMouseOut((e) => { + const parent = e.element ? this._tree.getParentElement(e.element) : null; + for (const separator of this._separatorRenderer.visibleSeparators) { + if (separator !== parent) { + continue; + } + const currentMouse = !!(separator.focusInsideSeparator & QuickPickSeparatorFocusReason.MOUSE_HOVER); + if (currentMouse) { + separator.focusInsideSeparator &= ~QuickPickSeparatorFocusReason.MOUSE_HOVER; + this._tree.rerender(separator); + } + } + })); + } + _registerSelectionChangeListener() { + this._register(this._tree.onDidChangeSelection((e) => { + const elementsWithoutSeparators = e.elements.filter((e2) => e2 instanceof QuickPickItemElement); + if (elementsWithoutSeparators.length !== e.elements.length) { + if (e.elements.length === 1 && e.elements[0] instanceof QuickPickSeparatorElement) { + this._tree.setFocus([e.elements[0].children[0]]); + this._tree.reveal(e.elements[0], 0); + } + this._tree.setSelection(elementsWithoutSeparators); + } + })); + } + //#endregion + //#region public methods + getAllVisibleChecked() { + return this._allVisibleChecked(this._itemElements, false); + } + getCheckedCount() { + return this._itemElements.filter((element) => element.checked).length; + } + getVisibleCount() { + return this._itemElements.filter((e) => !e.hidden).length; + } + setAllVisibleChecked(checked) { + try { + this._shouldFireCheckedEvents = false; + this._itemElements.forEach((element) => { + if (!element.hidden && !element.checkboxDisabled) { + element.checked = checked; + } + }); + } finally { + this._shouldFireCheckedEvents = true; + this._fireCheckedEvents(); + } + } + setElements(inputElements) { + this._elementDisposable.clear(); + this._inputElements = inputElements; + const hasCheckbox = this.parent.classList.contains("show-checkboxes"); + let currentSeparatorElement; + this._itemElements = new Array(); + this._elementTree = inputElements.reduce((result, item, index) => { + let element; + if (item.type === "separator") { + if (!item.buttons) { + return result; + } + currentSeparatorElement = new QuickPickSeparatorElement(index, (event) => this.fireSeparatorButtonTriggered(event), item); + element = currentSeparatorElement; + } else { + const previous = index > 0 ? inputElements[index - 1] : void 0; + let separator; + if (previous && previous.type === "separator" && !previous.buttons) { + currentSeparatorElement = void 0; + separator = previous; + } + const qpi = new QuickPickItemElement(index, hasCheckbox, (event) => this.fireButtonTriggered(event), this._elementChecked, item, separator); + this._itemElements.push(qpi); + if (currentSeparatorElement) { + currentSeparatorElement.children.push(qpi); + return result; + } + element = qpi; + } + result.push(element); + return result; + }, new Array()); + const elements = new Array(); + let visibleCount = 0; + for (const element of this._elementTree) { + if (element instanceof QuickPickSeparatorElement) { + elements.push({ + element, + collapsible: false, + collapsed: false, + children: element.children.map((e) => ({ + element: e, + collapsible: false, + collapsed: false + })) + }); + visibleCount += element.children.length + 1; + } else { + elements.push({ + element, + collapsible: false, + collapsed: false + }); + visibleCount++; + } + } + this._tree.setChildren(null, elements); + this._onChangedVisibleCount.fire(visibleCount); + if (this.accessibilityService.isScreenReaderOptimized()) { + setTimeout(() => { + const focusedElement = this._tree.getHTMLElement().querySelector(`.monaco-list-row.focused`); + const parent = focusedElement === null || focusedElement === void 0 ? void 0 : focusedElement.parentNode; + if (focusedElement && parent) { + const nextSibling = focusedElement.nextSibling; + parent.removeChild(focusedElement); + parent.insertBefore(focusedElement, nextSibling); + } + }, 0); + } + } + setFocusedElements(items) { + const elements = items.map((item) => this._itemElements.find((e) => e.item === item)).filter((e) => !!e); + this._tree.setFocus(elements); + if (items.length > 0) { + const focused = this._tree.getFocus()[0]; + if (focused) { + this._tree.reveal(focused); + } + } + } + getActiveDescendant() { + return this._tree.getHTMLElement().getAttribute("aria-activedescendant"); + } + setSelectedElements(items) { + const elements = items.map((item) => this._itemElements.find((e) => e.item === item)).filter((e) => !!e); + this._tree.setSelection(elements); + } + getCheckedElements() { + return this._itemElements.filter((e) => e.checked).map((e) => e.item); + } + setCheckedElements(items) { + try { + this._shouldFireCheckedEvents = false; + const checked = /* @__PURE__ */ new Set(); + for (const item of items) { + checked.add(item); + } + for (const element of this._itemElements) { + element.checked = checked.has(element.item); + } + } finally { + this._shouldFireCheckedEvents = true; + this._fireCheckedEvents(); + } + } + focus(what) { + var _a10; + if (!this._itemElements.length) { + return; + } + if (what === QuickPickFocus.Second && this._itemElements.length < 2) { + what = QuickPickFocus.First; + } + switch (what) { + case QuickPickFocus.First: + this._tree.scrollTop = 0; + this._tree.focusFirst(void 0, (e) => e.element instanceof QuickPickItemElement); + break; + case QuickPickFocus.Second: + this._tree.scrollTop = 0; + this._tree.setFocus([this._itemElements[1]]); + break; + case QuickPickFocus.Last: + this._tree.scrollTop = this._tree.scrollHeight; + this._tree.setFocus([this._itemElements[this._itemElements.length - 1]]); + break; + case QuickPickFocus.Next: { + const prevFocus = this._tree.getFocus(); + this._tree.focusNext(void 0, this._shouldLoop, void 0, (e) => { + if (!(e.element instanceof QuickPickItemElement)) { + return false; + } + this._tree.reveal(e.element); + return true; + }); + const currentFocus = this._tree.getFocus(); + if (prevFocus.length && prevFocus[0] === currentFocus[0] && prevFocus[0] === this._itemElements[this._itemElements.length - 1]) { + this._onLeave.fire(); + } + break; + } + case QuickPickFocus.Previous: { + const prevFocus = this._tree.getFocus(); + this._tree.focusPrevious(void 0, this._shouldLoop, void 0, (e) => { + if (!(e.element instanceof QuickPickItemElement)) { + return false; + } + const parent = this._tree.getParentElement(e.element); + if (parent === null || parent.children[0] !== e.element) { + this._tree.reveal(e.element); + } else { + this._tree.reveal(parent); + } + return true; + }); + const currentFocus = this._tree.getFocus(); + if (prevFocus.length && prevFocus[0] === currentFocus[0] && prevFocus[0] === this._itemElements[0]) { + this._onLeave.fire(); + } + break; + } + case QuickPickFocus.NextPage: + this._tree.focusNextPage(void 0, (e) => { + if (!(e.element instanceof QuickPickItemElement)) { + return false; + } + this._tree.reveal(e.element); + return true; + }); + break; + case QuickPickFocus.PreviousPage: + this._tree.focusPreviousPage(void 0, (e) => { + if (!(e.element instanceof QuickPickItemElement)) { + return false; + } + const parent = this._tree.getParentElement(e.element); + if (parent === null || parent.children[0] !== e.element) { + this._tree.reveal(e.element); + } else { + this._tree.reveal(parent); + } + return true; + }); + break; + case QuickPickFocus.NextSeparator: { + let foundSeparatorAsItem = false; + const before = this._tree.getFocus()[0]; + this._tree.focusNext(void 0, true, void 0, (e) => { + if (foundSeparatorAsItem) { + return true; + } + if (e.element instanceof QuickPickSeparatorElement) { + foundSeparatorAsItem = true; + if (this._separatorRenderer.isSeparatorVisible(e.element)) { + this._tree.reveal(e.element.children[0]); + } else { + this._tree.reveal(e.element, 0); + } + } else if (e.element instanceof QuickPickItemElement) { + if (e.element.separator) { + if (this._itemRenderer.isItemWithSeparatorVisible(e.element)) { + this._tree.reveal(e.element); + } else { + this._tree.reveal(e.element, 0); + } + return true; + } else if (e.element === this._elementTree[0]) { + this._tree.reveal(e.element, 0); + return true; + } + } + return false; + }); + const after2 = this._tree.getFocus()[0]; + if (before === after2) { + this._tree.scrollTop = this._tree.scrollHeight; + this._tree.setFocus([this._itemElements[this._itemElements.length - 1]]); + } + break; + } + case QuickPickFocus.PreviousSeparator: { + let focusElement; + let foundSeparator = !!((_a10 = this._tree.getFocus()[0]) === null || _a10 === void 0 ? void 0 : _a10.separator); + this._tree.focusPrevious(void 0, true, void 0, (e) => { + if (e.element instanceof QuickPickSeparatorElement) { + if (foundSeparator) { + if (!focusElement) { + if (this._separatorRenderer.isSeparatorVisible(e.element)) { + this._tree.reveal(e.element); + } else { + this._tree.reveal(e.element, 0); + } + focusElement = e.element.children[0]; + } + } else { + foundSeparator = true; + } + } else if (e.element instanceof QuickPickItemElement) { + if (!focusElement) { + if (e.element.separator) { + if (this._itemRenderer.isItemWithSeparatorVisible(e.element)) { + this._tree.reveal(e.element); + } else { + this._tree.reveal(e.element, 0); + } + focusElement = e.element; + } else if (e.element === this._elementTree[0]) { + this._tree.reveal(e.element, 0); + return true; + } + } + } + return false; + }); + if (focusElement) { + this._tree.setFocus([focusElement]); + } + break; + } + } + } + clearFocus() { + this._tree.setFocus([]); + } + domFocus() { + this._tree.domFocus(); + } + layout(maxHeight) { + this._tree.getHTMLElement().style.maxHeight = maxHeight ? `${// Make sure height aligns with list item heights + Math.floor(maxHeight / 44) * 44 + 6}px` : ""; + this._tree.layout(); + } + filter(query) { + if (!(this._sortByLabel || this._matchOnLabel || this._matchOnDescription || this._matchOnDetail)) { + this._tree.layout(); + return false; + } + const queryWithWhitespace = query; + query = query.trim(); + if (!query || !(this.matchOnLabel || this.matchOnDescription || this.matchOnDetail)) { + this._itemElements.forEach((element) => { + element.labelHighlights = void 0; + element.descriptionHighlights = void 0; + element.detailHighlights = void 0; + element.hidden = false; + const previous = element.index && this._inputElements[element.index - 1]; + if (element.item) { + element.separator = previous && previous.type === "separator" && !previous.buttons ? previous : void 0; + } + }); + } else { + let currentSeparator2; + this._elementTree.forEach((element) => { + var _a10, _b4, _c2, _d2; + let labelHighlights; + if (this.matchOnLabelMode === "fuzzy") { + labelHighlights = this.matchOnLabel ? (_a10 = matchesFuzzyIconAware(query, parseLabelWithIcons(element.saneLabel))) !== null && _a10 !== void 0 ? _a10 : void 0 : void 0; + } else { + labelHighlights = this.matchOnLabel ? (_b4 = matchesContiguousIconAware(queryWithWhitespace, parseLabelWithIcons(element.saneLabel))) !== null && _b4 !== void 0 ? _b4 : void 0 : void 0; + } + const descriptionHighlights = this.matchOnDescription ? (_c2 = matchesFuzzyIconAware(query, parseLabelWithIcons(element.saneDescription || ""))) !== null && _c2 !== void 0 ? _c2 : void 0 : void 0; + const detailHighlights = this.matchOnDetail ? (_d2 = matchesFuzzyIconAware(query, parseLabelWithIcons(element.saneDetail || ""))) !== null && _d2 !== void 0 ? _d2 : void 0 : void 0; + if (labelHighlights || descriptionHighlights || detailHighlights) { + element.labelHighlights = labelHighlights; + element.descriptionHighlights = descriptionHighlights; + element.detailHighlights = detailHighlights; + element.hidden = false; + } else { + element.labelHighlights = void 0; + element.descriptionHighlights = void 0; + element.detailHighlights = void 0; + element.hidden = element.item ? !element.item.alwaysShow : true; + } + if (element.item) { + element.separator = void 0; + } else if (element.separator) { + element.hidden = true; + } + if (!this.sortByLabel) { + const previous = element.index && this._inputElements[element.index - 1]; + currentSeparator2 = previous && previous.type === "separator" ? previous : currentSeparator2; + if (currentSeparator2 && !element.hidden) { + element.separator = currentSeparator2; + currentSeparator2 = void 0; + } + } + }); + } + const shownElements = this._elementTree.filter((element) => !element.hidden); + if (this.sortByLabel && query) { + const normalizedSearchValue = query.toLowerCase(); + shownElements.sort((a3, b) => { + return compareEntries(a3, b, normalizedSearchValue); + }); + } + let currentSeparator; + const finalElements = shownElements.reduce((result, element, index) => { + if (element instanceof QuickPickItemElement) { + if (currentSeparator) { + currentSeparator.children.push(element); + } else { + result.push(element); + } + } else if (element instanceof QuickPickSeparatorElement) { + element.children = []; + currentSeparator = element; + result.push(element); + } + return result; + }, new Array()); + const elements = new Array(); + for (const element of finalElements) { + if (element instanceof QuickPickSeparatorElement) { + elements.push({ + element, + collapsible: false, + collapsed: false, + children: element.children.map((e) => ({ + element: e, + collapsible: false, + collapsed: false + })) + }); + } else { + elements.push({ + element, + collapsible: false, + collapsed: false + }); + } + } + this._tree.setChildren(null, elements); + this._tree.layout(); + this._onChangedAllVisibleChecked.fire(this.getAllVisibleChecked()); + this._onChangedVisibleCount.fire(shownElements.length); + return true; + } + toggleCheckbox() { + try { + this._shouldFireCheckedEvents = false; + const elements = this._tree.getFocus().filter((e) => e instanceof QuickPickItemElement); + const allChecked = this._allVisibleChecked(elements); + for (const element of elements) { + if (!element.checkboxDisabled) { + element.checked = !allChecked; + } + } + } finally { + this._shouldFireCheckedEvents = true; + this._fireCheckedEvents(); + } + } + display(display) { + this._container.style.display = display ? "" : "none"; + } + isDisplayed() { + return this._container.style.display !== "none"; + } + style(styles) { + this._tree.style(styles); + } + toggleHover() { + const focused = this._tree.getFocus()[0]; + if (!(focused === null || focused === void 0 ? void 0 : focused.saneTooltip) || !(focused instanceof QuickPickItemElement)) { + return; + } + if (this._lastHover && !this._lastHover.isDisposed) { + this._lastHover.dispose(); + return; + } + this.showHover(focused); + const store = new DisposableStore(); + store.add(this._tree.onDidChangeFocus((e) => { + if (e.elements[0] instanceof QuickPickItemElement) { + this.showHover(e.elements[0]); + } + })); + if (this._lastHover) { + store.add(this._lastHover); + } + this._elementDisposable.add(store); + } + //#endregion + //#region private methods + _allVisibleChecked(elements, whenNoneVisible = true) { + for (let i = 0, n = elements.length; i < n; i++) { + const element = elements[i]; + if (!element.hidden) { + if (!element.checked) { + return false; + } else { + whenNoneVisible = true; + } + } + } + return whenNoneVisible; + } + _fireCheckedEvents() { + if (!this._shouldFireCheckedEvents) { + return; + } + this._onChangedAllVisibleChecked.fire(this.getAllVisibleChecked()); + this._onChangedCheckedCount.fire(this.getCheckedCount()); + this._onChangedCheckedElements.fire(this.getCheckedElements()); + } + fireButtonTriggered(event) { + this._onButtonTriggered.fire(event); + } + fireSeparatorButtonTriggered(event) { + this._onSeparatorButtonTriggered.fire(event); + } + /** + * Disposes of the hover and shows a new one for the given index if it has a tooltip. + * @param element The element to show the hover for + */ + showHover(element) { + var _a10, _b4, _c2; + if (this._lastHover && !this._lastHover.isDisposed) { + (_b4 = (_a10 = this.hoverDelegate).onDidHideHover) === null || _b4 === void 0 ? void 0 : _b4.call(_a10); + (_c2 = this._lastHover) === null || _c2 === void 0 ? void 0 : _c2.dispose(); + } + if (!element.element || !element.saneTooltip) { + return; + } + this._lastHover = this.hoverDelegate.showHover({ + content: element.saneTooltip, + target: element.element, + linkHandler: (url) => { + this.linkOpenerDelegate(url); + }, + appearance: { + showPointer: true + }, + container: this._container, + position: { + hoverPosition: 1 + /* HoverPosition.RIGHT */ + } + }, false); + } + }; + __decorate39([ + memoize + ], QuickInputTree.prototype, "onDidChangeFocus", null); + __decorate39([ + memoize + ], QuickInputTree.prototype, "onDidChangeSelection", null); + QuickInputTree = __decorate39([ + __param33(4, IInstantiationService), + __param33(5, IAccessibilityService) + ], QuickInputTree); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickInputActions.js +function registerQuickPickCommandAndKeybindingRule(rule, options2 = {}) { + var _a10; + KeybindingsRegistry.registerCommandAndKeybindingRule(__spreadProps(__spreadValues(__spreadValues({}, defaultCommandAndKeybindingRule), rule), { + secondary: getSecondary(rule.primary, (_a10 = rule.secondary) !== null && _a10 !== void 0 ? _a10 : [], options2) + })); +} +function getSecondary(primary, secondary, options2 = {}) { + if (options2.withAltMod) { + secondary.push(512 + primary); + } + if (options2.withCtrlMod) { + secondary.push(ctrlKeyMod2 + primary); + if (options2.withAltMod) { + secondary.push(512 + ctrlKeyMod2 + primary); + } + } + if (options2.withCmdMod && isMacintosh) { + secondary.push(2048 + primary); + if (options2.withCtrlMod) { + secondary.push(2048 + 256 + primary); + } + if (options2.withAltMod) { + secondary.push(2048 + 512 + primary); + if (options2.withCtrlMod) { + secondary.push(2048 + 512 + 256 + primary); + } + } + } + return secondary; +} +function focusHandler(focus, focusOnQuickNatigate) { + return (accessor) => { + const currentQuickPick = accessor.get(IQuickInputService).currentQuickInput; + if (!currentQuickPick) { + return; + } + if (focusOnQuickNatigate && currentQuickPick.quickNavigate) { + return currentQuickPick.focus(focusOnQuickNatigate); + } + return currentQuickPick.focus(focus); + }; +} +var defaultCommandAndKeybindingRule, ctrlKeyMod2, nextSeparatorFallbackDesc, prevSeparatorFallbackDesc; +var init_quickInputActions = __esm({ + "node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickInputActions.js"() { + init_platform(); + init_nls(); + init_contextkey(); + init_contextkeys(); + init_keybindingsRegistry(); + init_quickInput3(); + init_quickInput(); + defaultCommandAndKeybindingRule = { + weight: 200, + when: ContextKeyExpr.and(ContextKeyExpr.equals( + quickInputTypeContextKeyValue, + "quickPick" + /* QuickInputType.QuickPick */ + ), inQuickInputContext), + metadata: { description: localize("quickPick", "Used while in the context of the quick pick. If you change one keybinding for this command, you should change all of the other keybindings (modifier variants) of this command as well.") } + }; + ctrlKeyMod2 = isMacintosh ? 256 : 2048; + registerQuickPickCommandAndKeybindingRule({ id: "quickInput.pageNext", primary: 12, handler: focusHandler(QuickPickFocus.NextPage) }, { withAltMod: true, withCtrlMod: true, withCmdMod: true }); + registerQuickPickCommandAndKeybindingRule({ id: "quickInput.pagePrevious", primary: 11, handler: focusHandler(QuickPickFocus.PreviousPage) }, { withAltMod: true, withCtrlMod: true, withCmdMod: true }); + registerQuickPickCommandAndKeybindingRule({ id: "quickInput.first", primary: ctrlKeyMod2 + 14, handler: focusHandler(QuickPickFocus.First) }, { withAltMod: true, withCmdMod: true }); + registerQuickPickCommandAndKeybindingRule({ id: "quickInput.last", primary: ctrlKeyMod2 + 13, handler: focusHandler(QuickPickFocus.Last) }, { withAltMod: true, withCmdMod: true }); + registerQuickPickCommandAndKeybindingRule({ id: "quickInput.next", primary: 18, handler: focusHandler(QuickPickFocus.Next) }, { withCtrlMod: true }); + registerQuickPickCommandAndKeybindingRule({ id: "quickInput.previous", primary: 16, handler: focusHandler(QuickPickFocus.Previous) }, { withCtrlMod: true }); + nextSeparatorFallbackDesc = localize("quickInput.nextSeparatorWithQuickAccessFallback", "If we're in quick access mode, this will navigate to the next item. If we are not in quick access mode, this will navigate to the next separator."); + prevSeparatorFallbackDesc = localize("quickInput.previousSeparatorWithQuickAccessFallback", "If we're in quick access mode, this will navigate to the previous item. If we are not in quick access mode, this will navigate to the previous separator."); + if (isMacintosh) { + registerQuickPickCommandAndKeybindingRule({ + id: "quickInput.nextSeparatorWithQuickAccessFallback", + primary: 2048 + 18, + handler: focusHandler(QuickPickFocus.NextSeparator, QuickPickFocus.Next), + metadata: { description: nextSeparatorFallbackDesc } + }); + registerQuickPickCommandAndKeybindingRule({ + id: "quickInput.nextSeparator", + primary: 2048 + 512 + 18, + // Since macOS has the cmd key as the primary modifier, we need to add this additional + // keybinding to capture cmd+ctrl+upArrow + secondary: [ + 2048 + 256 + 18 + /* KeyCode.DownArrow */ + ], + handler: focusHandler(QuickPickFocus.NextSeparator) + }, { withCtrlMod: true }); + registerQuickPickCommandAndKeybindingRule({ + id: "quickInput.previousSeparatorWithQuickAccessFallback", + primary: 2048 + 16, + handler: focusHandler(QuickPickFocus.PreviousSeparator, QuickPickFocus.Previous), + metadata: { description: prevSeparatorFallbackDesc } + }); + registerQuickPickCommandAndKeybindingRule({ + id: "quickInput.previousSeparator", + primary: 2048 + 512 + 16, + // Since macOS has the cmd key as the primary modifier, we need to add this additional + // keybinding to capture cmd+ctrl+upArrow + secondary: [ + 2048 + 256 + 16 + /* KeyCode.UpArrow */ + ], + handler: focusHandler(QuickPickFocus.PreviousSeparator) + }, { withCtrlMod: true }); + } else { + registerQuickPickCommandAndKeybindingRule({ + id: "quickInput.nextSeparatorWithQuickAccessFallback", + primary: 512 + 18, + handler: focusHandler(QuickPickFocus.NextSeparator, QuickPickFocus.Next), + metadata: { description: nextSeparatorFallbackDesc } + }); + registerQuickPickCommandAndKeybindingRule({ + id: "quickInput.nextSeparator", + primary: 2048 + 512 + 18, + handler: focusHandler(QuickPickFocus.NextSeparator) + }); + registerQuickPickCommandAndKeybindingRule({ + id: "quickInput.previousSeparatorWithQuickAccessFallback", + primary: 512 + 16, + handler: focusHandler(QuickPickFocus.PreviousSeparator, QuickPickFocus.Previous), + metadata: { description: prevSeparatorFallbackDesc } + }); + registerQuickPickCommandAndKeybindingRule({ + id: "quickInput.previousSeparator", + primary: 2048 + 512 + 16, + handler: focusHandler(QuickPickFocus.PreviousSeparator) + }); + } + registerQuickPickCommandAndKeybindingRule({ + id: "quickInput.acceptInBackground", + // If we are in the quick pick but the input box is not focused or our cursor is at the end of the input box + when: ContextKeyExpr.and(defaultCommandAndKeybindingRule.when, ContextKeyExpr.or(InputFocusedContext.negate(), endOfQuickInputBoxContext)), + primary: 17, + // Need a little extra weight to ensure this keybinding is preferred over the default cmd+alt+right arrow keybinding + // https://github.com/microsoft/vscode/blob/1451e4fbbbf074a4355cc537c35b547b80ce1c52/src/vs/workbench/browser/parts/editor/editorActions.ts#L1178-L1195 + weight: 200 + 50, + handler: (accessor) => { + const currentQuickPick = accessor.get(IQuickInputService).currentQuickInput; + currentQuickPick === null || currentQuickPick === void 0 ? void 0 : currentQuickPick.accept(true); + } + }, { withAltMod: true, withCtrlMod: true, withCmdMod: true }); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickInputController.js +var __decorate40, __param34, QuickInputController_1, $9, QuickInputController; +var init_quickInputController = __esm({ + "node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickInputController.js"() { + init_dom(); + init_actionbar2(); + init_button2(); + init_countBadge2(); + init_progressbar2(); + init_cancellation(); + init_event(); + init_lifecycle(); + init_severity(); + init_nls(); + init_quickInput(); + init_quickInputBox(); + init_quickInput3(); + init_layoutService(); + init_window(); + init_instantiation(); + init_quickInputTree(); + init_contextkey(); + init_quickInputActions(); + __decorate40 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param34 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + $9 = $; + QuickInputController = QuickInputController_1 = class QuickInputController2 extends Disposable { + get currentQuickInput() { + var _a10; + return (_a10 = this.controller) !== null && _a10 !== void 0 ? _a10 : void 0; + } + get container() { + return this._container; + } + constructor(options2, layoutService, instantiationService, contextKeyService) { + super(); + this.options = options2; + this.layoutService = layoutService; + this.instantiationService = instantiationService; + this.contextKeyService = contextKeyService; + this.enabled = true; + this.onDidAcceptEmitter = this._register(new Emitter()); + this.onDidCustomEmitter = this._register(new Emitter()); + this.onDidTriggerButtonEmitter = this._register(new Emitter()); + this.keyMods = { ctrlCmd: false, alt: false }; + this.controller = null; + this.onShowEmitter = this._register(new Emitter()); + this.onShow = this.onShowEmitter.event; + this.onHideEmitter = this._register(new Emitter()); + this.onHide = this.onHideEmitter.event; + this.inQuickInputContext = InQuickInputContextKey.bindTo(this.contextKeyService); + this.quickInputTypeContext = QuickInputTypeContextKey.bindTo(this.contextKeyService); + this.endOfQuickInputBoxContext = EndOfQuickInputBoxContextKey.bindTo(this.contextKeyService); + this.idPrefix = options2.idPrefix; + this._container = options2.container; + this.styles = options2.styles; + this._register(Event.runAndSubscribe(onDidRegisterWindow, ({ window: window2, disposables }) => this.registerKeyModsListeners(window2, disposables), { window: mainWindow, disposables: this._store })); + this._register(onWillUnregisterWindow((window2) => { + if (this.ui && getWindow(this.ui.container) === window2) { + this.reparentUI(this.layoutService.mainContainer); + this.layout(this.layoutService.mainContainerDimension, this.layoutService.mainContainerOffset.quickPickTop); + } + })); + } + registerKeyModsListeners(window2, disposables) { + const listener = (e) => { + this.keyMods.ctrlCmd = e.ctrlKey || e.metaKey; + this.keyMods.alt = e.altKey; + }; + for (const event of [EventType.KEY_DOWN, EventType.KEY_UP, EventType.MOUSE_DOWN]) { + disposables.add(addDisposableListener(window2, event, listener, true)); + } + } + getUI(showInActiveContainer) { + if (this.ui) { + if (showInActiveContainer) { + if (getWindow(this._container) !== getWindow(this.layoutService.activeContainer)) { + this.reparentUI(this.layoutService.activeContainer); + this.layout(this.layoutService.activeContainerDimension, this.layoutService.activeContainerOffset.quickPickTop); + } + } + return this.ui; + } + const container = append(this._container, $9(".quick-input-widget.show-file-icons")); + container.tabIndex = -1; + container.style.display = "none"; + const styleSheet = createStyleSheet(container); + const titleBar = append(container, $9(".quick-input-titlebar")); + const leftActionBar = this._register(new ActionBar(titleBar, { hoverDelegate: this.options.hoverDelegate })); + leftActionBar.domNode.classList.add("quick-input-left-action-bar"); + const title = append(titleBar, $9(".quick-input-title")); + const rightActionBar = this._register(new ActionBar(titleBar, { hoverDelegate: this.options.hoverDelegate })); + rightActionBar.domNode.classList.add("quick-input-right-action-bar"); + const headerContainer = append(container, $9(".quick-input-header")); + const checkAll = append(headerContainer, $9("input.quick-input-check-all")); + checkAll.type = "checkbox"; + checkAll.setAttribute("aria-label", localize("quickInput.checkAll", "Toggle all checkboxes")); + this._register(addStandardDisposableListener(checkAll, EventType.CHANGE, (e) => { + const checked = checkAll.checked; + list.setAllVisibleChecked(checked); + })); + this._register(addDisposableListener(checkAll, EventType.CLICK, (e) => { + if (e.x || e.y) { + inputBox.setFocus(); + } + })); + const description2 = append(headerContainer, $9(".quick-input-description")); + const inputContainer = append(headerContainer, $9(".quick-input-and-message")); + const filterContainer = append(inputContainer, $9(".quick-input-filter")); + const inputBox = this._register(new QuickInputBox(filterContainer, this.styles.inputBox, this.styles.toggle)); + inputBox.setAttribute("aria-describedby", `${this.idPrefix}message`); + const visibleCountContainer = append(filterContainer, $9(".quick-input-visible-count")); + visibleCountContainer.setAttribute("aria-live", "polite"); + visibleCountContainer.setAttribute("aria-atomic", "true"); + const visibleCount = new CountBadge(visibleCountContainer, { countFormat: localize({ key: "quickInput.visibleCount", comment: ["This tells the user how many items are shown in a list of items to select from. The items can be anything. Currently not visible, but read by screen readers."] }, "{0} Results") }, this.styles.countBadge); + const countContainer = append(filterContainer, $9(".quick-input-count")); + countContainer.setAttribute("aria-live", "polite"); + const count = new CountBadge(countContainer, { countFormat: localize({ key: "quickInput.countSelected", comment: ["This tells the user how many items are selected in a list of items to select from. The items can be anything."] }, "{0} Selected") }, this.styles.countBadge); + const okContainer = append(headerContainer, $9(".quick-input-action")); + const ok2 = this._register(new Button(okContainer, this.styles.button)); + ok2.label = localize("ok", "OK"); + this._register(ok2.onDidClick((e) => { + this.onDidAcceptEmitter.fire(); + })); + const customButtonContainer = append(headerContainer, $9(".quick-input-action")); + const customButton = this._register(new Button(customButtonContainer, __spreadProps(__spreadValues({}, this.styles.button), { supportIcons: true }))); + customButton.label = localize("custom", "Custom"); + this._register(customButton.onDidClick((e) => { + this.onDidCustomEmitter.fire(); + })); + const message = append(inputContainer, $9(`#${this.idPrefix}message.quick-input-message`)); + const progressBar = this._register(new ProgressBar(container, this.styles.progressBar)); + progressBar.getContainer().classList.add("quick-input-progress"); + const widget = append(container, $9(".quick-input-html-widget")); + widget.tabIndex = -1; + const description1 = append(container, $9(".quick-input-description")); + const listId = this.idPrefix + "list"; + const list = this._register(this.instantiationService.createInstance(QuickInputTree, container, this.options.hoverDelegate, this.options.linkOpenerDelegate, listId)); + inputBox.setAttribute("aria-controls", listId); + this._register(list.onDidChangeFocus(() => { + var _a10; + inputBox.setAttribute("aria-activedescendant", (_a10 = list.getActiveDescendant()) !== null && _a10 !== void 0 ? _a10 : ""); + })); + this._register(list.onChangedAllVisibleChecked((checked) => { + checkAll.checked = checked; + })); + this._register(list.onChangedVisibleCount((c) => { + visibleCount.setCount(c); + })); + this._register(list.onChangedCheckedCount((c) => { + count.setCount(c); + })); + this._register(list.onLeave(() => { + setTimeout(() => { + if (!this.controller) { + return; + } + inputBox.setFocus(); + if (this.controller instanceof QuickPick && this.controller.canSelectMany) { + list.clearFocus(); + } + }, 0); + })); + const focusTracker = trackFocus(container); + this._register(focusTracker); + this._register(addDisposableListener(container, EventType.FOCUS, (e) => { + const ui = this.getUI(); + if (isAncestor(e.relatedTarget, ui.inputContainer)) { + const value = ui.inputBox.isSelectionAtEnd(); + if (this.endOfQuickInputBoxContext.get() !== value) { + this.endOfQuickInputBoxContext.set(value); + } + } + if (isAncestor(e.relatedTarget, ui.container)) { + return; + } + this.inQuickInputContext.set(true); + this.previousFocusElement = isHTMLElement(e.relatedTarget) ? e.relatedTarget : void 0; + }, true)); + this._register(focusTracker.onDidBlur(() => { + if (!this.getUI().ignoreFocusOut && !this.options.ignoreFocusOut()) { + this.hide(QuickInputHideReason.Blur); + } + this.inQuickInputContext.set(false); + this.endOfQuickInputBoxContext.set(false); + this.previousFocusElement = void 0; + })); + this._register(inputBox.onKeyDown((_) => { + const value = this.getUI().inputBox.isSelectionAtEnd(); + if (this.endOfQuickInputBoxContext.get() !== value) { + this.endOfQuickInputBoxContext.set(value); + } + })); + this._register(addDisposableListener(container, EventType.FOCUS, (e) => { + inputBox.setFocus(); + })); + this._register(addStandardDisposableListener(container, EventType.KEY_DOWN, (event) => { + if (isAncestor(event.target, widget)) { + return; + } + switch (event.keyCode) { + case 3: + EventHelper.stop(event, true); + if (this.enabled) { + this.onDidAcceptEmitter.fire(); + } + break; + case 9: + EventHelper.stop(event, true); + this.hide(QuickInputHideReason.Gesture); + break; + case 2: + if (!event.altKey && !event.ctrlKey && !event.metaKey) { + const selectors = [ + ".quick-input-list .monaco-action-bar .always-visible", + ".quick-input-list-entry:hover .monaco-action-bar", + ".monaco-list-row.focused .monaco-action-bar" + ]; + if (container.classList.contains("show-checkboxes")) { + selectors.push("input"); + } else { + selectors.push("input[type=text]"); + } + if (this.getUI().list.isDisplayed()) { + selectors.push(".monaco-list"); + } + if (this.getUI().message) { + selectors.push(".quick-input-message a"); + } + if (this.getUI().widget) { + if (isAncestor(event.target, this.getUI().widget)) { + break; + } + selectors.push(".quick-input-html-widget"); + } + const stops = container.querySelectorAll(selectors.join(", ")); + if (event.shiftKey && event.target === stops[0]) { + EventHelper.stop(event, true); + list.clearFocus(); + } else if (!event.shiftKey && isAncestor(event.target, stops[stops.length - 1])) { + EventHelper.stop(event, true); + stops[0].focus(); + } + } + break; + case 10: + if (event.ctrlKey) { + EventHelper.stop(event, true); + this.getUI().list.toggleHover(); + } + break; + } + })); + this.ui = { + container, + styleSheet, + leftActionBar, + titleBar, + title, + description1, + description2, + widget, + rightActionBar, + checkAll, + inputContainer, + filterContainer, + inputBox, + visibleCountContainer, + visibleCount, + countContainer, + count, + okContainer, + ok: ok2, + message, + customButtonContainer, + customButton, + list, + progressBar, + onDidAccept: this.onDidAcceptEmitter.event, + onDidCustom: this.onDidCustomEmitter.event, + onDidTriggerButton: this.onDidTriggerButtonEmitter.event, + ignoreFocusOut: false, + keyMods: this.keyMods, + show: (controller) => this.show(controller), + hide: () => this.hide(), + setVisibilities: (visibilities) => this.setVisibilities(visibilities), + setEnabled: (enabled) => this.setEnabled(enabled), + setContextKey: (contextKey) => this.options.setContextKey(contextKey), + linkOpenerDelegate: (content) => this.options.linkOpenerDelegate(content) + }; + this.updateStyles(); + return this.ui; + } + reparentUI(container) { + if (this.ui) { + this._container = container; + append(this._container, this.ui.container); + } + } + pick(picks, options2 = {}, token = CancellationToken.None) { + return new Promise((doResolve, reject) => { + let resolve2 = (result) => { + var _a10; + resolve2 = doResolve; + (_a10 = options2.onKeyMods) === null || _a10 === void 0 ? void 0 : _a10.call(options2, input.keyMods); + doResolve(result); + }; + if (token.isCancellationRequested) { + resolve2(void 0); + return; + } + const input = this.createQuickPick(); + let activeItem; + const disposables = [ + input, + input.onDidAccept(() => { + if (input.canSelectMany) { + resolve2(input.selectedItems.slice()); + input.hide(); + } else { + const result = input.activeItems[0]; + if (result) { + resolve2(result); + input.hide(); + } + } + }), + input.onDidChangeActive((items) => { + const focused = items[0]; + if (focused && options2.onDidFocus) { + options2.onDidFocus(focused); + } + }), + input.onDidChangeSelection((items) => { + if (!input.canSelectMany) { + const result = items[0]; + if (result) { + resolve2(result); + input.hide(); + } + } + }), + input.onDidTriggerItemButton((event) => options2.onDidTriggerItemButton && options2.onDidTriggerItemButton(__spreadProps(__spreadValues({}, event), { + removeItem: () => { + const index = input.items.indexOf(event.item); + if (index !== -1) { + const items = input.items.slice(); + const removed = items.splice(index, 1); + const activeItems = input.activeItems.filter((activeItem2) => activeItem2 !== removed[0]); + const keepScrollPositionBefore = input.keepScrollPosition; + input.keepScrollPosition = true; + input.items = items; + if (activeItems) { + input.activeItems = activeItems; + } + input.keepScrollPosition = keepScrollPositionBefore; + } + } + }))), + input.onDidTriggerSeparatorButton((event) => { + var _a10; + return (_a10 = options2.onDidTriggerSeparatorButton) === null || _a10 === void 0 ? void 0 : _a10.call(options2, event); + }), + input.onDidChangeValue((value) => { + if (activeItem && !value && (input.activeItems.length !== 1 || input.activeItems[0] !== activeItem)) { + input.activeItems = [activeItem]; + } + }), + token.onCancellationRequested(() => { + input.hide(); + }), + input.onDidHide(() => { + dispose(disposables); + resolve2(void 0); + }) + ]; + input.title = options2.title; + input.canSelectMany = !!options2.canPickMany; + input.placeholder = options2.placeHolder; + input.ignoreFocusOut = !!options2.ignoreFocusLost; + input.matchOnDescription = !!options2.matchOnDescription; + input.matchOnDetail = !!options2.matchOnDetail; + input.matchOnLabel = options2.matchOnLabel === void 0 || options2.matchOnLabel; + input.quickNavigate = options2.quickNavigate; + input.hideInput = !!options2.hideInput; + input.contextKey = options2.contextKey; + input.busy = true; + Promise.all([picks, options2.activeItem]).then(([items, _activeItem]) => { + activeItem = _activeItem; + input.busy = false; + input.items = items; + if (input.canSelectMany) { + input.selectedItems = items.filter((item) => item.type !== "separator" && item.picked); + } + if (activeItem) { + input.activeItems = [activeItem]; + } + }); + input.show(); + Promise.resolve(picks).then(void 0, (err) => { + reject(err); + input.hide(); + }); + }); + } + createQuickPick() { + const ui = this.getUI(true); + return new QuickPick(ui); + } + createInputBox() { + const ui = this.getUI(true); + return new InputBox(ui); + } + show(controller) { + const ui = this.getUI(true); + this.onShowEmitter.fire(); + const oldController = this.controller; + this.controller = controller; + oldController === null || oldController === void 0 ? void 0 : oldController.didHide(); + this.setEnabled(true); + ui.leftActionBar.clear(); + ui.title.textContent = ""; + ui.description1.textContent = ""; + ui.description2.textContent = ""; + reset(ui.widget); + ui.rightActionBar.clear(); + ui.checkAll.checked = false; + ui.inputBox.placeholder = ""; + ui.inputBox.password = false; + ui.inputBox.showDecoration(severity_default.Ignore); + ui.visibleCount.setCount(0); + ui.count.setCount(0); + reset(ui.message); + ui.progressBar.stop(); + ui.list.setElements([]); + ui.list.matchOnDescription = false; + ui.list.matchOnDetail = false; + ui.list.matchOnLabel = true; + ui.list.sortByLabel = true; + ui.ignoreFocusOut = false; + ui.inputBox.toggles = void 0; + const backKeybindingLabel = this.options.backKeybindingLabel(); + backButton.tooltip = backKeybindingLabel ? localize("quickInput.backWithKeybinding", "Back ({0})", backKeybindingLabel) : localize("quickInput.back", "Back"); + ui.container.style.display = ""; + this.updateLayout(); + ui.inputBox.setFocus(); + this.quickInputTypeContext.set(controller.type); + } + isVisible() { + return !!this.ui && this.ui.container.style.display !== "none"; + } + setVisibilities(visibilities) { + const ui = this.getUI(); + ui.title.style.display = visibilities.title ? "" : "none"; + ui.description1.style.display = visibilities.description && (visibilities.inputBox || visibilities.checkAll) ? "" : "none"; + ui.description2.style.display = visibilities.description && !(visibilities.inputBox || visibilities.checkAll) ? "" : "none"; + ui.checkAll.style.display = visibilities.checkAll ? "" : "none"; + ui.inputContainer.style.display = visibilities.inputBox ? "" : "none"; + ui.filterContainer.style.display = visibilities.inputBox ? "" : "none"; + ui.visibleCountContainer.style.display = visibilities.visibleCount ? "" : "none"; + ui.countContainer.style.display = visibilities.count ? "" : "none"; + ui.okContainer.style.display = visibilities.ok ? "" : "none"; + ui.customButtonContainer.style.display = visibilities.customButton ? "" : "none"; + ui.message.style.display = visibilities.message ? "" : "none"; + ui.progressBar.getContainer().style.display = visibilities.progressBar ? "" : "none"; + ui.list.display(!!visibilities.list); + ui.container.classList.toggle("show-checkboxes", !!visibilities.checkBox); + ui.container.classList.toggle("hidden-input", !visibilities.inputBox && !visibilities.description); + this.updateLayout(); + } + setEnabled(enabled) { + if (enabled !== this.enabled) { + this.enabled = enabled; + for (const item of this.getUI().leftActionBar.viewItems) { + item.action.enabled = enabled; + } + for (const item of this.getUI().rightActionBar.viewItems) { + item.action.enabled = enabled; + } + this.getUI().checkAll.disabled = !enabled; + this.getUI().inputBox.enabled = enabled; + this.getUI().ok.enabled = enabled; + this.getUI().list.enabled = enabled; + } + } + hide(reason) { + var _a10, _b4; + const controller = this.controller; + if (!controller) { + return; + } + controller.willHide(reason); + const container = (_a10 = this.ui) === null || _a10 === void 0 ? void 0 : _a10.container; + const focusChanged = container && !isAncestorOfActiveElement(container); + this.controller = null; + this.onHideEmitter.fire(); + if (container) { + container.style.display = "none"; + } + if (!focusChanged) { + let currentElement = this.previousFocusElement; + while (currentElement && !currentElement.offsetParent) { + currentElement = (_b4 = currentElement.parentElement) !== null && _b4 !== void 0 ? _b4 : void 0; + } + if (currentElement === null || currentElement === void 0 ? void 0 : currentElement.offsetParent) { + currentElement.focus(); + this.previousFocusElement = void 0; + } else { + this.options.returnFocus(); + } + } + controller.didHide(reason); + } + layout(dimension, titleBarOffset) { + this.dimension = dimension; + this.titleBarOffset = titleBarOffset; + this.updateLayout(); + } + updateLayout() { + if (this.ui && this.isVisible()) { + this.ui.container.style.top = `${this.titleBarOffset}px`; + const style = this.ui.container.style; + const width2 = Math.min(this.dimension.width * 0.62, QuickInputController_1.MAX_WIDTH); + style.width = width2 + "px"; + style.marginLeft = "-" + width2 / 2 + "px"; + this.ui.inputBox.layout(); + this.ui.list.layout(this.dimension && this.dimension.height * 0.4); + } + } + applyStyles(styles) { + this.styles = styles; + this.updateStyles(); + } + updateStyles() { + if (this.ui) { + const { quickInputTitleBackground: quickInputTitleBackground2, quickInputBackground: quickInputBackground2, quickInputForeground: quickInputForeground2, widgetBorder: widgetBorder2, widgetShadow: widgetShadow2 } = this.styles.widget; + this.ui.titleBar.style.backgroundColor = quickInputTitleBackground2 !== null && quickInputTitleBackground2 !== void 0 ? quickInputTitleBackground2 : ""; + this.ui.container.style.backgroundColor = quickInputBackground2 !== null && quickInputBackground2 !== void 0 ? quickInputBackground2 : ""; + this.ui.container.style.color = quickInputForeground2 !== null && quickInputForeground2 !== void 0 ? quickInputForeground2 : ""; + this.ui.container.style.border = widgetBorder2 ? `1px solid ${widgetBorder2}` : ""; + this.ui.container.style.boxShadow = widgetShadow2 ? `0 0 8px 2px ${widgetShadow2}` : ""; + this.ui.list.style(this.styles.list); + const content = []; + if (this.styles.pickerGroup.pickerGroupBorder) { + content.push(`.quick-input-list .quick-input-list-entry { border-top-color: ${this.styles.pickerGroup.pickerGroupBorder}; }`); + } + if (this.styles.pickerGroup.pickerGroupForeground) { + content.push(`.quick-input-list .quick-input-list-separator { color: ${this.styles.pickerGroup.pickerGroupForeground}; }`); + } + if (this.styles.pickerGroup.pickerGroupForeground) { + content.push(`.quick-input-list .quick-input-list-separator-as-item { color: var(--vscode-descriptionForeground); }`); + } + if (this.styles.keybindingLabel.keybindingLabelBackground || this.styles.keybindingLabel.keybindingLabelBorder || this.styles.keybindingLabel.keybindingLabelBottomBorder || this.styles.keybindingLabel.keybindingLabelShadow || this.styles.keybindingLabel.keybindingLabelForeground) { + content.push(".quick-input-list .monaco-keybinding > .monaco-keybinding-key {"); + if (this.styles.keybindingLabel.keybindingLabelBackground) { + content.push(`background-color: ${this.styles.keybindingLabel.keybindingLabelBackground};`); + } + if (this.styles.keybindingLabel.keybindingLabelBorder) { + content.push(`border-color: ${this.styles.keybindingLabel.keybindingLabelBorder};`); + } + if (this.styles.keybindingLabel.keybindingLabelBottomBorder) { + content.push(`border-bottom-color: ${this.styles.keybindingLabel.keybindingLabelBottomBorder};`); + } + if (this.styles.keybindingLabel.keybindingLabelShadow) { + content.push(`box-shadow: inset 0 -1px 0 ${this.styles.keybindingLabel.keybindingLabelShadow};`); + } + if (this.styles.keybindingLabel.keybindingLabelForeground) { + content.push(`color: ${this.styles.keybindingLabel.keybindingLabelForeground};`); + } + content.push("}"); + } + const newStyles = content.join("\n"); + if (newStyles !== this.ui.styleSheet.textContent) { + this.ui.styleSheet.textContent = newStyles; + } + } + } + }; + QuickInputController.MAX_WIDTH = 600; + QuickInputController = QuickInputController_1 = __decorate40([ + __param34(1, ILayoutService), + __param34(2, IInstantiationService), + __param34(3, IContextKeyService) + ], QuickInputController); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickInputService.js +var __decorate41, __param35, QuickInputService; +var init_quickInputService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/quickinput/browser/quickInputService.js"() { + init_cancellation(); + init_event(); + init_contextkey(); + init_instantiation(); + init_layoutService(); + init_opener(); + init_quickAccess2(); + init_defaultStyles(); + init_colorRegistry(); + init_themeService(); + init_quickInput3(); + init_quickInputController(); + init_configuration(); + init_dom(); + __decorate41 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param35 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + QuickInputService = class QuickInputService2 extends Themable { + get controller() { + if (!this._controller) { + this._controller = this._register(this.createController()); + } + return this._controller; + } + get hasController() { + return !!this._controller; + } + get currentQuickInput() { + return this.controller.currentQuickInput; + } + get quickAccess() { + if (!this._quickAccess) { + this._quickAccess = this._register(this.instantiationService.createInstance(QuickAccessController)); + } + return this._quickAccess; + } + constructor(instantiationService, contextKeyService, themeService, layoutService, configurationService) { + super(themeService); + this.instantiationService = instantiationService; + this.contextKeyService = contextKeyService; + this.layoutService = layoutService; + this.configurationService = configurationService; + this._onShow = this._register(new Emitter()); + this._onHide = this._register(new Emitter()); + this.contexts = /* @__PURE__ */ new Map(); + } + createController(host = this.layoutService, options2) { + const defaultOptions3 = { + idPrefix: "quickInput_", + container: host.activeContainer, + ignoreFocusOut: () => false, + backKeybindingLabel: () => void 0, + setContextKey: (id) => this.setContextKey(id), + linkOpenerDelegate: (content) => { + this.instantiationService.invokeFunction((accessor) => { + const openerService = accessor.get(IOpenerService); + openerService.open(content, { allowCommands: true, fromUserGesture: true }); + }); + }, + returnFocus: () => host.focus(), + styles: this.computeStyles(), + hoverDelegate: this._register(this.instantiationService.createInstance(QuickInputHoverDelegate)) + }; + const controller = this._register(this.instantiationService.createInstance(QuickInputController, __spreadValues(__spreadValues({}, defaultOptions3), options2))); + controller.layout(host.activeContainerDimension, host.activeContainerOffset.quickPickTop); + this._register(host.onDidLayoutActiveContainer((dimension) => { + if (getWindow(host.activeContainer) === getWindow(controller.container)) { + controller.layout(dimension, host.activeContainerOffset.quickPickTop); + } + })); + this._register(host.onDidChangeActiveContainer(() => { + if (controller.isVisible()) { + return; + } + controller.layout(host.activeContainerDimension, host.activeContainerOffset.quickPickTop); + })); + this._register(controller.onShow(() => { + this.resetContextKeys(); + this._onShow.fire(); + })); + this._register(controller.onHide(() => { + this.resetContextKeys(); + this._onHide.fire(); + })); + return controller; + } + setContextKey(id) { + let key; + if (id) { + key = this.contexts.get(id); + if (!key) { + key = new RawContextKey(id, false).bindTo(this.contextKeyService); + this.contexts.set(id, key); + } + } + if (key && key.get()) { + return; + } + this.resetContextKeys(); + key === null || key === void 0 ? void 0 : key.set(true); + } + resetContextKeys() { + this.contexts.forEach((context) => { + if (context.get()) { + context.reset(); + } + }); + } + pick(picks, options2 = {}, token = CancellationToken.None) { + return this.controller.pick(picks, options2, token); + } + createQuickPick() { + return this.controller.createQuickPick(); + } + createInputBox() { + return this.controller.createInputBox(); + } + updateStyles() { + if (this.hasController) { + this.controller.applyStyles(this.computeStyles()); + } + } + computeStyles() { + return { + widget: { + quickInputBackground: asCssVariable(quickInputBackground), + quickInputForeground: asCssVariable(quickInputForeground), + quickInputTitleBackground: asCssVariable(quickInputTitleBackground), + widgetBorder: asCssVariable(widgetBorder), + widgetShadow: asCssVariable(widgetShadow) + }, + inputBox: defaultInputBoxStyles, + toggle: defaultToggleStyles, + countBadge: defaultCountBadgeStyles, + button: defaultButtonStyles, + progressBar: defaultProgressBarStyles, + keybindingLabel: defaultKeybindingLabelStyles, + list: getListStyles({ + listBackground: quickInputBackground, + listFocusBackground: quickInputListFocusBackground, + listFocusForeground: quickInputListFocusForeground, + // Look like focused when inactive. + listInactiveFocusForeground: quickInputListFocusForeground, + listInactiveSelectionIconForeground: quickInputListFocusIconForeground, + listInactiveFocusBackground: quickInputListFocusBackground, + listFocusOutline: activeContrastBorder, + listInactiveFocusOutline: activeContrastBorder + }), + pickerGroup: { + pickerGroupBorder: asCssVariable(pickerGroupBorder), + pickerGroupForeground: asCssVariable(pickerGroupForeground) + } + }; + } + }; + QuickInputService = __decorate41([ + __param35(0, IInstantiationService), + __param35(1, IContextKeyService), + __param35(2, IThemeService), + __param35(3, ILayoutService), + __param35(4, IConfigurationService) + ], QuickInputService); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/browser/quickInput/standaloneQuickInputService.js +var __decorate42, __param36, EditorScopedQuickInputService, StandaloneQuickInputService, QuickInputEditorContribution, QuickInputEditorWidget; +var init_standaloneQuickInputService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/browser/quickInput/standaloneQuickInputService.js"() { + init_standaloneQuickInput(); + init_event(); + init_editorExtensions(); + init_themeService(); + init_cancellation(); + init_instantiation(); + init_contextkey(); + init_standaloneLayoutService(); + init_codeEditorService(); + init_quickInputService(); + init_functional(); + init_configuration(); + __decorate42 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param36 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + EditorScopedQuickInputService = class EditorScopedQuickInputService2 extends QuickInputService { + constructor(editor2, instantiationService, contextKeyService, themeService, codeEditorService, configurationService) { + super(instantiationService, contextKeyService, themeService, new EditorScopedLayoutService(editor2.getContainerDomNode(), codeEditorService), configurationService); + this.host = void 0; + const contribution = QuickInputEditorContribution.get(editor2); + if (contribution) { + const widget = contribution.widget; + this.host = { + _serviceBrand: void 0, + get mainContainer() { + return widget.getDomNode(); + }, + getContainer() { + return widget.getDomNode(); + }, + whenContainerStylesLoaded() { + return void 0; + }, + get containers() { + return [widget.getDomNode()]; + }, + get activeContainer() { + return widget.getDomNode(); + }, + get mainContainerDimension() { + return editor2.getLayoutInfo(); + }, + get activeContainerDimension() { + return editor2.getLayoutInfo(); + }, + get onDidLayoutMainContainer() { + return editor2.onDidLayoutChange; + }, + get onDidLayoutActiveContainer() { + return editor2.onDidLayoutChange; + }, + get onDidLayoutContainer() { + return Event.map(editor2.onDidLayoutChange, (dimension) => ({ container: widget.getDomNode(), dimension })); + }, + get onDidChangeActiveContainer() { + return Event.None; + }, + get onDidAddContainer() { + return Event.None; + }, + get mainContainerOffset() { + return { top: 0, quickPickTop: 0 }; + }, + get activeContainerOffset() { + return { top: 0, quickPickTop: 0 }; + }, + focus: () => editor2.focus() + }; + } else { + this.host = void 0; + } + } + createController() { + return super.createController(this.host); + } + }; + EditorScopedQuickInputService = __decorate42([ + __param36(1, IInstantiationService), + __param36(2, IContextKeyService), + __param36(3, IThemeService), + __param36(4, ICodeEditorService), + __param36(5, IConfigurationService) + ], EditorScopedQuickInputService); + StandaloneQuickInputService = class StandaloneQuickInputService2 { + get activeService() { + const editor2 = this.codeEditorService.getFocusedCodeEditor(); + if (!editor2) { + throw new Error("Quick input service needs a focused editor to work."); + } + let quickInputService = this.mapEditorToService.get(editor2); + if (!quickInputService) { + const newQuickInputService = quickInputService = this.instantiationService.createInstance(EditorScopedQuickInputService, editor2); + this.mapEditorToService.set(editor2, quickInputService); + createSingleCallFunction(editor2.onDidDispose)(() => { + newQuickInputService.dispose(); + this.mapEditorToService.delete(editor2); + }); + } + return quickInputService; + } + get currentQuickInput() { + return this.activeService.currentQuickInput; + } + get quickAccess() { + return this.activeService.quickAccess; + } + constructor(instantiationService, codeEditorService) { + this.instantiationService = instantiationService; + this.codeEditorService = codeEditorService; + this.mapEditorToService = /* @__PURE__ */ new Map(); + } + pick(picks, options2 = {}, token = CancellationToken.None) { + return this.activeService.pick(picks, options2, token); + } + createQuickPick() { + return this.activeService.createQuickPick(); + } + createInputBox() { + return this.activeService.createInputBox(); + } + }; + StandaloneQuickInputService = __decorate42([ + __param36(0, IInstantiationService), + __param36(1, ICodeEditorService) + ], StandaloneQuickInputService); + QuickInputEditorContribution = class _QuickInputEditorContribution { + static get(editor2) { + return editor2.getContribution(_QuickInputEditorContribution.ID); + } + constructor(editor2) { + this.editor = editor2; + this.widget = new QuickInputEditorWidget(this.editor); + } + dispose() { + this.widget.dispose(); + } + }; + QuickInputEditorContribution.ID = "editor.controller.quickInput"; + QuickInputEditorWidget = class _QuickInputEditorWidget { + constructor(codeEditor) { + this.codeEditor = codeEditor; + this.domNode = document.createElement("div"); + this.codeEditor.addOverlayWidget(this); + } + getId() { + return _QuickInputEditorWidget.ID; + } + getDomNode() { + return this.domNode; + } + getPosition() { + return { + preference: 2 + /* OverlayWidgetPositionPreference.TOP_CENTER */ + }; + } + dispose() { + this.codeEditor.removeOverlayWidget(this); + } + }; + QuickInputEditorWidget.ID = "editor.contrib.quickInputWidget"; + registerEditorContribution( + QuickInputEditorContribution.ID, + QuickInputEditorContribution, + 4 + /* EditorContributionInstantiation.Lazy */ + ); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/languages/supports/tokenization.js +function parseTokenTheme(source) { + if (!source || !Array.isArray(source)) { + return []; + } + const result = []; + let resultLen = 0; + for (let i = 0, len = source.length; i < len; i++) { + const entry = source[i]; + let fontStyle = -1; + if (typeof entry.fontStyle === "string") { + fontStyle = 0; + const segments = entry.fontStyle.split(" "); + for (let j = 0, lenJ = segments.length; j < lenJ; j++) { + const segment = segments[j]; + switch (segment) { + case "italic": + fontStyle = fontStyle | 1; + break; + case "bold": + fontStyle = fontStyle | 2; + break; + case "underline": + fontStyle = fontStyle | 4; + break; + case "strikethrough": + fontStyle = fontStyle | 8; + break; + } + } + } + let foreground2 = null; + if (typeof entry.foreground === "string") { + foreground2 = entry.foreground; + } + let background = null; + if (typeof entry.background === "string") { + background = entry.background; + } + result[resultLen++] = new ParsedTokenThemeRule(entry.token || "", i, fontStyle, foreground2, background); + } + return result; +} +function resolveParsedTokenThemeRules(parsedThemeRules, customTokenColors) { + parsedThemeRules.sort((a3, b) => { + const r = strcmp(a3.token, b.token); + if (r !== 0) { + return r; + } + return a3.index - b.index; + }); + let defaultFontStyle = 0; + let defaultForeground = "000000"; + let defaultBackground = "ffffff"; + while (parsedThemeRules.length >= 1 && parsedThemeRules[0].token === "") { + const incomingDefaults = parsedThemeRules.shift(); + if (incomingDefaults.fontStyle !== -1) { + defaultFontStyle = incomingDefaults.fontStyle; + } + if (incomingDefaults.foreground !== null) { + defaultForeground = incomingDefaults.foreground; + } + if (incomingDefaults.background !== null) { + defaultBackground = incomingDefaults.background; + } + } + const colorMap = new ColorMap(); + for (const color of customTokenColors) { + colorMap.getId(color); + } + const foregroundColorId = colorMap.getId(defaultForeground); + const backgroundColorId = colorMap.getId(defaultBackground); + const defaults = new ThemeTrieElementRule(defaultFontStyle, foregroundColorId, backgroundColorId); + const root = new ThemeTrieElement(defaults); + for (let i = 0, len = parsedThemeRules.length; i < len; i++) { + const rule = parsedThemeRules[i]; + root.insert(rule.token, rule.fontStyle, colorMap.getId(rule.foreground), colorMap.getId(rule.background)); + } + return new TokenTheme(colorMap, root); +} +function toStandardTokenType(tokenType) { + const m = tokenType.match(STANDARD_TOKEN_TYPE_REGEXP); + if (!m) { + return 0; + } + switch (m[1]) { + case "comment": + return 1; + case "string": + return 2; + case "regex": + return 3; + case "regexp": + return 3; + } + throw new Error("Unexpected match for standard token type!"); +} +function strcmp(a3, b) { + if (a3 < b) { + return -1; + } + if (a3 > b) { + return 1; + } + return 0; +} +function generateTokensCSSForColorMap(colorMap) { + const rules = []; + for (let i = 1, len = colorMap.length; i < len; i++) { + const color = colorMap[i]; + rules[i] = `.mtk${i} { color: ${color}; }`; + } + rules.push(".mtki { font-style: italic; }"); + rules.push(".mtkb { font-weight: bold; }"); + rules.push(".mtku { text-decoration: underline; text-underline-position: under; }"); + rules.push(".mtks { text-decoration: line-through; }"); + rules.push(".mtks.mtku { text-decoration: underline line-through; text-underline-position: under; }"); + return rules.join("\n"); +} +var ParsedTokenThemeRule, colorRegExp, ColorMap, TokenTheme, STANDARD_TOKEN_TYPE_REGEXP, ThemeTrieElementRule, ThemeTrieElement; +var init_tokenization = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/languages/supports/tokenization.js"() { + init_color(); + ParsedTokenThemeRule = class { + constructor(token, index, fontStyle, foreground2, background) { + this._parsedThemeRuleBrand = void 0; + this.token = token; + this.index = index; + this.fontStyle = fontStyle; + this.foreground = foreground2; + this.background = background; + } + }; + colorRegExp = /^#?([0-9A-Fa-f]{6})([0-9A-Fa-f]{2})?$/; + ColorMap = class { + constructor() { + this._lastColorId = 0; + this._id2color = []; + this._color2id = /* @__PURE__ */ new Map(); + } + getId(color) { + if (color === null) { + return 0; + } + const match2 = color.match(colorRegExp); + if (!match2) { + throw new Error("Illegal value for token color: " + color); + } + color = match2[1].toUpperCase(); + let value = this._color2id.get(color); + if (value) { + return value; + } + value = ++this._lastColorId; + this._color2id.set(color, value); + this._id2color[value] = Color.fromHex("#" + color); + return value; + } + getColorMap() { + return this._id2color.slice(0); + } + }; + TokenTheme = class { + static createFromRawTokenTheme(source, customTokenColors) { + return this.createFromParsedTokenTheme(parseTokenTheme(source), customTokenColors); + } + static createFromParsedTokenTheme(source, customTokenColors) { + return resolveParsedTokenThemeRules(source, customTokenColors); + } + constructor(colorMap, root) { + this._colorMap = colorMap; + this._root = root; + this._cache = /* @__PURE__ */ new Map(); + } + getColorMap() { + return this._colorMap.getColorMap(); + } + _match(token) { + return this._root.match(token); + } + match(languageId, token) { + let result = this._cache.get(token); + if (typeof result === "undefined") { + const rule = this._match(token); + const standardToken = toStandardTokenType(token); + result = (rule.metadata | standardToken << 8) >>> 0; + this._cache.set(token, result); + } + return (result | languageId << 0) >>> 0; + } + }; + STANDARD_TOKEN_TYPE_REGEXP = /\b(comment|string|regex|regexp)\b/; + ThemeTrieElementRule = class _ThemeTrieElementRule { + constructor(fontStyle, foreground2, background) { + this._themeTrieElementRuleBrand = void 0; + this._fontStyle = fontStyle; + this._foreground = foreground2; + this._background = background; + this.metadata = (this._fontStyle << 11 | this._foreground << 15 | this._background << 24) >>> 0; + } + clone() { + return new _ThemeTrieElementRule(this._fontStyle, this._foreground, this._background); + } + acceptOverwrite(fontStyle, foreground2, background) { + if (fontStyle !== -1) { + this._fontStyle = fontStyle; + } + if (foreground2 !== 0) { + this._foreground = foreground2; + } + if (background !== 0) { + this._background = background; + } + this.metadata = (this._fontStyle << 11 | this._foreground << 15 | this._background << 24) >>> 0; + } + }; + ThemeTrieElement = class _ThemeTrieElement { + constructor(mainRule) { + this._themeTrieElementBrand = void 0; + this._mainRule = mainRule; + this._children = /* @__PURE__ */ new Map(); + } + match(token) { + if (token === "") { + return this._mainRule; + } + const dotIndex = token.indexOf("."); + let head; + let tail3; + if (dotIndex === -1) { + head = token; + tail3 = ""; + } else { + head = token.substring(0, dotIndex); + tail3 = token.substring(dotIndex + 1); + } + const child = this._children.get(head); + if (typeof child !== "undefined") { + return child.match(tail3); + } + return this._mainRule; + } + insert(token, fontStyle, foreground2, background) { + if (token === "") { + this._mainRule.acceptOverwrite(fontStyle, foreground2, background); + return; + } + const dotIndex = token.indexOf("."); + let head; + let tail3; + if (dotIndex === -1) { + head = token; + tail3 = ""; + } else { + head = token.substring(0, dotIndex); + tail3 = token.substring(dotIndex + 1); + } + let child = this._children.get(head); + if (typeof child === "undefined") { + child = new _ThemeTrieElement(this._mainRule.clone()); + this._children.set(head, child); + } + child.insert(tail3, fontStyle, foreground2, background); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/common/themes.js +var vs, vs_dark, hc_black, hc_light; +var init_themes = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/common/themes.js"() { + init_editorColorRegistry(); + init_colorRegistry(); + vs = { + base: "vs", + inherit: false, + rules: [ + { token: "", foreground: "000000", background: "fffffe" }, + { token: "invalid", foreground: "cd3131" }, + { token: "emphasis", fontStyle: "italic" }, + { token: "strong", fontStyle: "bold" }, + { token: "variable", foreground: "001188" }, + { token: "variable.predefined", foreground: "4864AA" }, + { token: "constant", foreground: "dd0000" }, + { token: "comment", foreground: "008000" }, + { token: "number", foreground: "098658" }, + { token: "number.hex", foreground: "3030c0" }, + { token: "regexp", foreground: "800000" }, + { token: "annotation", foreground: "808080" }, + { token: "type", foreground: "008080" }, + { token: "delimiter", foreground: "000000" }, + { token: "delimiter.html", foreground: "383838" }, + { token: "delimiter.xml", foreground: "0000FF" }, + { token: "tag", foreground: "800000" }, + { token: "tag.id.pug", foreground: "4F76AC" }, + { token: "tag.class.pug", foreground: "4F76AC" }, + { token: "meta.scss", foreground: "800000" }, + { token: "metatag", foreground: "e00000" }, + { token: "metatag.content.html", foreground: "FF0000" }, + { token: "metatag.html", foreground: "808080" }, + { token: "metatag.xml", foreground: "808080" }, + { token: "metatag.php", fontStyle: "bold" }, + { token: "key", foreground: "863B00" }, + { token: "string.key.json", foreground: "A31515" }, + { token: "string.value.json", foreground: "0451A5" }, + { token: "attribute.name", foreground: "FF0000" }, + { token: "attribute.value", foreground: "0451A5" }, + { token: "attribute.value.number", foreground: "098658" }, + { token: "attribute.value.unit", foreground: "098658" }, + { token: "attribute.value.html", foreground: "0000FF" }, + { token: "attribute.value.xml", foreground: "0000FF" }, + { token: "string", foreground: "A31515" }, + { token: "string.html", foreground: "0000FF" }, + { token: "string.sql", foreground: "FF0000" }, + { token: "string.yaml", foreground: "0451A5" }, + { token: "keyword", foreground: "0000FF" }, + { token: "keyword.json", foreground: "0451A5" }, + { token: "keyword.flow", foreground: "AF00DB" }, + { token: "keyword.flow.scss", foreground: "0000FF" }, + { token: "operator.scss", foreground: "666666" }, + { token: "operator.sql", foreground: "778899" }, + { token: "operator.swift", foreground: "666666" }, + { token: "predefined.sql", foreground: "C700C7" } + ], + colors: { + [editorBackground]: "#FFFFFE", + [editorForeground]: "#000000", + [editorInactiveSelection]: "#E5EBF1", + [editorIndentGuide1]: "#D3D3D3", + [editorActiveIndentGuide1]: "#939393", + [editorSelectionHighlight]: "#ADD6FF4D" + } + }; + vs_dark = { + base: "vs-dark", + inherit: false, + rules: [ + { token: "", foreground: "D4D4D4", background: "1E1E1E" }, + { token: "invalid", foreground: "f44747" }, + { token: "emphasis", fontStyle: "italic" }, + { token: "strong", fontStyle: "bold" }, + { token: "variable", foreground: "74B0DF" }, + { token: "variable.predefined", foreground: "4864AA" }, + { token: "variable.parameter", foreground: "9CDCFE" }, + { token: "constant", foreground: "569CD6" }, + { token: "comment", foreground: "608B4E" }, + { token: "number", foreground: "B5CEA8" }, + { token: "number.hex", foreground: "5BB498" }, + { token: "regexp", foreground: "B46695" }, + { token: "annotation", foreground: "cc6666" }, + { token: "type", foreground: "3DC9B0" }, + { token: "delimiter", foreground: "DCDCDC" }, + { token: "delimiter.html", foreground: "808080" }, + { token: "delimiter.xml", foreground: "808080" }, + { token: "tag", foreground: "569CD6" }, + { token: "tag.id.pug", foreground: "4F76AC" }, + { token: "tag.class.pug", foreground: "4F76AC" }, + { token: "meta.scss", foreground: "A79873" }, + { token: "meta.tag", foreground: "CE9178" }, + { token: "metatag", foreground: "DD6A6F" }, + { token: "metatag.content.html", foreground: "9CDCFE" }, + { token: "metatag.html", foreground: "569CD6" }, + { token: "metatag.xml", foreground: "569CD6" }, + { token: "metatag.php", fontStyle: "bold" }, + { token: "key", foreground: "9CDCFE" }, + { token: "string.key.json", foreground: "9CDCFE" }, + { token: "string.value.json", foreground: "CE9178" }, + { token: "attribute.name", foreground: "9CDCFE" }, + { token: "attribute.value", foreground: "CE9178" }, + { token: "attribute.value.number.css", foreground: "B5CEA8" }, + { token: "attribute.value.unit.css", foreground: "B5CEA8" }, + { token: "attribute.value.hex.css", foreground: "D4D4D4" }, + { token: "string", foreground: "CE9178" }, + { token: "string.sql", foreground: "FF0000" }, + { token: "keyword", foreground: "569CD6" }, + { token: "keyword.flow", foreground: "C586C0" }, + { token: "keyword.json", foreground: "CE9178" }, + { token: "keyword.flow.scss", foreground: "569CD6" }, + { token: "operator.scss", foreground: "909090" }, + { token: "operator.sql", foreground: "778899" }, + { token: "operator.swift", foreground: "909090" }, + { token: "predefined.sql", foreground: "FF00FF" } + ], + colors: { + [editorBackground]: "#1E1E1E", + [editorForeground]: "#D4D4D4", + [editorInactiveSelection]: "#3A3D41", + [editorIndentGuide1]: "#404040", + [editorActiveIndentGuide1]: "#707070", + [editorSelectionHighlight]: "#ADD6FF26" + } + }; + hc_black = { + base: "hc-black", + inherit: false, + rules: [ + { token: "", foreground: "FFFFFF", background: "000000" }, + { token: "invalid", foreground: "f44747" }, + { token: "emphasis", fontStyle: "italic" }, + { token: "strong", fontStyle: "bold" }, + { token: "variable", foreground: "1AEBFF" }, + { token: "variable.parameter", foreground: "9CDCFE" }, + { token: "constant", foreground: "569CD6" }, + { token: "comment", foreground: "608B4E" }, + { token: "number", foreground: "FFFFFF" }, + { token: "regexp", foreground: "C0C0C0" }, + { token: "annotation", foreground: "569CD6" }, + { token: "type", foreground: "3DC9B0" }, + { token: "delimiter", foreground: "FFFF00" }, + { token: "delimiter.html", foreground: "FFFF00" }, + { token: "tag", foreground: "569CD6" }, + { token: "tag.id.pug", foreground: "4F76AC" }, + { token: "tag.class.pug", foreground: "4F76AC" }, + { token: "meta", foreground: "D4D4D4" }, + { token: "meta.tag", foreground: "CE9178" }, + { token: "metatag", foreground: "569CD6" }, + { token: "metatag.content.html", foreground: "1AEBFF" }, + { token: "metatag.html", foreground: "569CD6" }, + { token: "metatag.xml", foreground: "569CD6" }, + { token: "metatag.php", fontStyle: "bold" }, + { token: "key", foreground: "9CDCFE" }, + { token: "string.key", foreground: "9CDCFE" }, + { token: "string.value", foreground: "CE9178" }, + { token: "attribute.name", foreground: "569CD6" }, + { token: "attribute.value", foreground: "3FF23F" }, + { token: "string", foreground: "CE9178" }, + { token: "string.sql", foreground: "FF0000" }, + { token: "keyword", foreground: "569CD6" }, + { token: "keyword.flow", foreground: "C586C0" }, + { token: "operator.sql", foreground: "778899" }, + { token: "operator.swift", foreground: "909090" }, + { token: "predefined.sql", foreground: "FF00FF" } + ], + colors: { + [editorBackground]: "#000000", + [editorForeground]: "#FFFFFF", + [editorIndentGuide1]: "#FFFFFF", + [editorActiveIndentGuide1]: "#FFFFFF" + } + }; + hc_light = { + base: "hc-light", + inherit: false, + rules: [ + { token: "", foreground: "292929", background: "FFFFFF" }, + { token: "invalid", foreground: "B5200D" }, + { token: "emphasis", fontStyle: "italic" }, + { token: "strong", fontStyle: "bold" }, + { token: "variable", foreground: "264F70" }, + { token: "variable.predefined", foreground: "4864AA" }, + { token: "constant", foreground: "dd0000" }, + { token: "comment", foreground: "008000" }, + { token: "number", foreground: "098658" }, + { token: "number.hex", foreground: "3030c0" }, + { token: "regexp", foreground: "800000" }, + { token: "annotation", foreground: "808080" }, + { token: "type", foreground: "008080" }, + { token: "delimiter", foreground: "000000" }, + { token: "delimiter.html", foreground: "383838" }, + { token: "tag", foreground: "800000" }, + { token: "tag.id.pug", foreground: "4F76AC" }, + { token: "tag.class.pug", foreground: "4F76AC" }, + { token: "meta.scss", foreground: "800000" }, + { token: "metatag", foreground: "e00000" }, + { token: "metatag.content.html", foreground: "B5200D" }, + { token: "metatag.html", foreground: "808080" }, + { token: "metatag.xml", foreground: "808080" }, + { token: "metatag.php", fontStyle: "bold" }, + { token: "key", foreground: "863B00" }, + { token: "string.key.json", foreground: "A31515" }, + { token: "string.value.json", foreground: "0451A5" }, + { token: "attribute.name", foreground: "264F78" }, + { token: "attribute.value", foreground: "0451A5" }, + { token: "string", foreground: "A31515" }, + { token: "string.sql", foreground: "B5200D" }, + { token: "keyword", foreground: "0000FF" }, + { token: "keyword.flow", foreground: "AF00DB" }, + { token: "operator.sql", foreground: "778899" }, + { token: "operator.swift", foreground: "666666" }, + { token: "predefined.sql", foreground: "C700C7" } + ], + colors: { + [editorBackground]: "#FFFFFF", + [editorForeground]: "#292929", + [editorIndentGuide1]: "#292929", + [editorActiveIndentGuide1]: "#292929" + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/common/iconRegistry.js +function registerIcon(id, defaults, description, deprecationMessage) { + return iconRegistry.registerIcon(id, defaults, description, deprecationMessage); +} +function getIconRegistry() { + return iconRegistry; +} +function initialize() { + const codiconFontCharacters = getCodiconFontCharacters(); + for (const icon in codiconFontCharacters) { + const fontCharacter = "\\" + codiconFontCharacters[icon].toString(16); + iconRegistry.registerIcon(icon, { fontCharacter }); + } +} +var Extensions9, IconContribution, IconFontDefinition, IconRegistry, iconRegistry, iconsSchemaId, schemaRegistry2, delayer2, widgetClose, gotoPreviousLocation, gotoNextLocation, syncing, spinningLoading; +var init_iconRegistry = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/common/iconRegistry.js"() { + init_async(); + init_codicons(); + init_codiconsUtil(); + init_themables(); + init_event(); + init_types(); + init_uri(); + init_nls(); + init_jsonContributionRegistry(); + init_platform2(); + Extensions9 = { + IconContribution: "base.contributions.icons" + }; + (function(IconContribution2) { + function getDefinition(contribution, registry) { + let definition = contribution.defaults; + while (ThemeIcon.isThemeIcon(definition)) { + const c = iconRegistry.getIcon(definition.id); + if (!c) { + return void 0; + } + definition = c.defaults; + } + return definition; + } + IconContribution2.getDefinition = getDefinition; + })(IconContribution || (IconContribution = {})); + (function(IconFontDefinition2) { + function toJSONObject(iconFont) { + return { + weight: iconFont.weight, + style: iconFont.style, + src: iconFont.src.map((s) => ({ format: s.format, location: s.location.toString() })) + }; + } + IconFontDefinition2.toJSONObject = toJSONObject; + function fromJSONObject(json) { + const stringOrUndef = (s) => isString(s) ? s : void 0; + if (json && Array.isArray(json.src) && json.src.every((s) => isString(s.format) && isString(s.location))) { + return { + weight: stringOrUndef(json.weight), + style: stringOrUndef(json.style), + src: json.src.map((s) => ({ format: s.format, location: URI.parse(s.location) })) + }; + } + return void 0; + } + IconFontDefinition2.fromJSONObject = fromJSONObject; + })(IconFontDefinition || (IconFontDefinition = {})); + IconRegistry = class { + constructor() { + this._onDidChange = new Emitter(); + this.onDidChange = this._onDidChange.event; + this.iconSchema = { + definitions: { + icons: { + type: "object", + properties: { + fontId: { type: "string", description: localize("iconDefinition.fontId", "The id of the font to use. If not set, the font that is defined first is used.") }, + fontCharacter: { type: "string", description: localize("iconDefinition.fontCharacter", "The font character associated with the icon definition.") } + }, + additionalProperties: false, + defaultSnippets: [{ body: { fontCharacter: "\\\\e030" } }] + } + }, + type: "object", + properties: {} + }; + this.iconReferenceSchema = { type: "string", pattern: `^${ThemeIcon.iconNameExpression}$`, enum: [], enumDescriptions: [] }; + this.iconsById = {}; + this.iconFontsById = {}; + } + registerIcon(id, defaults, description, deprecationMessage) { + const existing = this.iconsById[id]; + if (existing) { + if (description && !existing.description) { + existing.description = description; + this.iconSchema.properties[id].markdownDescription = `${description} $(${id})`; + const enumIndex = this.iconReferenceSchema.enum.indexOf(id); + if (enumIndex !== -1) { + this.iconReferenceSchema.enumDescriptions[enumIndex] = description; + } + this._onDidChange.fire(); + } + return existing; + } + const iconContribution = { id, description, defaults, deprecationMessage }; + this.iconsById[id] = iconContribution; + const propertySchema = { $ref: "#/definitions/icons" }; + if (deprecationMessage) { + propertySchema.deprecationMessage = deprecationMessage; + } + if (description) { + propertySchema.markdownDescription = `${description}: $(${id})`; + } + this.iconSchema.properties[id] = propertySchema; + this.iconReferenceSchema.enum.push(id); + this.iconReferenceSchema.enumDescriptions.push(description || ""); + this._onDidChange.fire(); + return { id }; + } + getIcons() { + return Object.keys(this.iconsById).map((id) => this.iconsById[id]); + } + getIcon(id) { + return this.iconsById[id]; + } + getIconSchema() { + return this.iconSchema; + } + toString() { + const sorter2 = (i1, i2) => { + return i1.id.localeCompare(i2.id); + }; + const classNames = (i) => { + while (ThemeIcon.isThemeIcon(i.defaults)) { + i = this.iconsById[i.defaults.id]; + } + return `codicon codicon-${i ? i.id : ""}`; + }; + const reference = []; + reference.push(`| preview | identifier | default codicon ID | description`); + reference.push(`| ----------- | --------------------------------- | --------------------------------- | --------------------------------- |`); + const contributions = Object.keys(this.iconsById).map((key) => this.iconsById[key]); + for (const i of contributions.filter((i2) => !!i2.description).sort(sorter2)) { + reference.push(`||${i.id}|${ThemeIcon.isThemeIcon(i.defaults) ? i.defaults.id : i.id}|${i.description || ""}|`); + } + reference.push(`| preview | identifier `); + reference.push(`| ----------- | --------------------------------- |`); + for (const i of contributions.filter((i2) => !ThemeIcon.isThemeIcon(i2.defaults)).sort(sorter2)) { + reference.push(`||${i.id}|`); + } + return reference.join("\n"); + } + }; + iconRegistry = new IconRegistry(); + Registry.add(Extensions9.IconContribution, iconRegistry); + initialize(); + iconsSchemaId = "vscode://schemas/icons"; + schemaRegistry2 = Registry.as(Extensions3.JSONContribution); + schemaRegistry2.registerSchema(iconsSchemaId, iconRegistry.getIconSchema()); + delayer2 = new RunOnceScheduler(() => schemaRegistry2.notifySchemaChanged(iconsSchemaId), 200); + iconRegistry.onDidChange(() => { + if (!delayer2.isScheduled()) { + delayer2.schedule(); + } + }); + widgetClose = registerIcon("widget-close", Codicon.close, localize("widgetClose", "Icon for the close action in widgets.")); + gotoPreviousLocation = registerIcon("goto-previous-location", Codicon.arrowUp, localize("previousChangeIcon", "Icon for goto previous editor location.")); + gotoNextLocation = registerIcon("goto-next-location", Codicon.arrowDown, localize("nextChangeIcon", "Icon for goto next editor location.")); + syncing = ThemeIcon.modify(Codicon.sync, "spin"); + spinningLoading = ThemeIcon.modify(Codicon.loading, "spin"); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/theme/browser/iconsStyleSheet.js +function getIconsStyleSheet(themeService) { + const disposable = new DisposableStore(); + const onDidChangeEmmiter = disposable.add(new Emitter()); + const iconRegistry2 = getIconRegistry(); + disposable.add(iconRegistry2.onDidChange(() => onDidChangeEmmiter.fire())); + if (themeService) { + disposable.add(themeService.onDidProductIconThemeChange(() => onDidChangeEmmiter.fire())); + } + return { + dispose: () => disposable.dispose(), + onDidChange: onDidChangeEmmiter.event, + getCSS() { + const productIconTheme = themeService ? themeService.getProductIconTheme() : new UnthemedProductIconTheme(); + const usedFontIds = {}; + const rules = []; + const rootAttribs = []; + for (const contribution of iconRegistry2.getIcons()) { + const definition = productIconTheme.getIcon(contribution); + if (!definition) { + continue; + } + const fontContribution = definition.font; + const fontFamilyVar = `--vscode-icon-${contribution.id}-font-family`; + const contentVar = `--vscode-icon-${contribution.id}-content`; + if (fontContribution) { + usedFontIds[fontContribution.id] = fontContribution.definition; + rootAttribs.push(`${fontFamilyVar}: ${asCSSPropertyValue(fontContribution.id)};`, `${contentVar}: '${definition.fontCharacter}';`); + rules.push(`.codicon-${contribution.id}:before { content: '${definition.fontCharacter}'; font-family: ${asCSSPropertyValue(fontContribution.id)}; }`); + } else { + rootAttribs.push(`${contentVar}: '${definition.fontCharacter}'; ${fontFamilyVar}: 'codicon';`); + rules.push(`.codicon-${contribution.id}:before { content: '${definition.fontCharacter}'; }`); + } + } + for (const id in usedFontIds) { + const definition = usedFontIds[id]; + const fontWeight = definition.weight ? `font-weight: ${definition.weight};` : ""; + const fontStyle = definition.style ? `font-style: ${definition.style};` : ""; + const src = definition.src.map((l) => `${asCSSUrl(l.location)} format('${l.format}')`).join(", "); + rules.push(`@font-face { src: ${src}; font-family: ${asCSSPropertyValue(id)};${fontWeight}${fontStyle} font-display: block; }`); + } + rules.push(`:root { ${rootAttribs.join(" ")} }`); + return rules.join("\n"); + } + }; +} +var UnthemedProductIconTheme; +var init_iconsStyleSheet = __esm({ + "node_modules/monaco-editor/esm/vs/platform/theme/browser/iconsStyleSheet.js"() { + init_dom(); + init_event(); + init_lifecycle(); + init_themables(); + init_iconRegistry(); + UnthemedProductIconTheme = class { + getIcon(contribution) { + const iconRegistry2 = getIconRegistry(); + let definition = contribution.defaults; + while (ThemeIcon.isThemeIcon(definition)) { + const c = iconRegistry2.getIcon(definition.id); + if (!c) { + return void 0; + } + definition = c.defaults; + } + return definition; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/browser/standaloneThemeService.js +function isBuiltinTheme(themeName) { + return themeName === VS_LIGHT_THEME_NAME || themeName === VS_DARK_THEME_NAME || themeName === HC_BLACK_THEME_NAME || themeName === HC_LIGHT_THEME_NAME; +} +function getBuiltinRules(builtinTheme) { + switch (builtinTheme) { + case VS_LIGHT_THEME_NAME: + return vs; + case VS_DARK_THEME_NAME: + return vs_dark; + case HC_BLACK_THEME_NAME: + return hc_black; + case HC_LIGHT_THEME_NAME: + return hc_light; + } +} +function newBuiltInTheme(builtinTheme) { + const themeData = getBuiltinRules(builtinTheme); + return new StandaloneTheme(builtinTheme, themeData); +} +var VS_LIGHT_THEME_NAME, VS_DARK_THEME_NAME, HC_BLACK_THEME_NAME, HC_LIGHT_THEME_NAME, colorRegistry2, themingRegistry2, StandaloneTheme, StandaloneThemeService; +var init_standaloneThemeService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/browser/standaloneThemeService.js"() { + init_dom(); + init_browser(); + init_color(); + init_event(); + init_languages(); + init_encodedTokenAttributes(); + init_tokenization(); + init_themes(); + init_platform2(); + init_colorRegistry(); + init_themeService(); + init_lifecycle(); + init_theme(); + init_iconsStyleSheet(); + init_window(); + VS_LIGHT_THEME_NAME = "vs"; + VS_DARK_THEME_NAME = "vs-dark"; + HC_BLACK_THEME_NAME = "hc-black"; + HC_LIGHT_THEME_NAME = "hc-light"; + colorRegistry2 = Registry.as(Extensions6.ColorContribution); + themingRegistry2 = Registry.as(Extensions7.ThemingContribution); + StandaloneTheme = class { + constructor(name, standaloneThemeData) { + this.semanticHighlighting = false; + this.themeData = standaloneThemeData; + const base = standaloneThemeData.base; + if (name.length > 0) { + if (isBuiltinTheme(name)) { + this.id = name; + } else { + this.id = base + " " + name; + } + this.themeName = name; + } else { + this.id = base; + this.themeName = base; + } + this.colors = null; + this.defaultColors = /* @__PURE__ */ Object.create(null); + this._tokenTheme = null; + } + get base() { + return this.themeData.base; + } + notifyBaseUpdated() { + if (this.themeData.inherit) { + this.colors = null; + this._tokenTheme = null; + } + } + getColors() { + if (!this.colors) { + const colors2 = /* @__PURE__ */ new Map(); + for (const id in this.themeData.colors) { + colors2.set(id, Color.fromHex(this.themeData.colors[id])); + } + if (this.themeData.inherit) { + const baseData = getBuiltinRules(this.themeData.base); + for (const id in baseData.colors) { + if (!colors2.has(id)) { + colors2.set(id, Color.fromHex(baseData.colors[id])); + } + } + } + this.colors = colors2; + } + return this.colors; + } + getColor(colorId, useDefault) { + const color = this.getColors().get(colorId); + if (color) { + return color; + } + if (useDefault !== false) { + return this.getDefault(colorId); + } + return void 0; + } + getDefault(colorId) { + let color = this.defaultColors[colorId]; + if (color) { + return color; + } + color = colorRegistry2.resolveDefaultColor(colorId, this); + this.defaultColors[colorId] = color; + return color; + } + defines(colorId) { + return this.getColors().has(colorId); + } + get type() { + switch (this.base) { + case VS_LIGHT_THEME_NAME: + return ColorScheme.LIGHT; + case HC_BLACK_THEME_NAME: + return ColorScheme.HIGH_CONTRAST_DARK; + case HC_LIGHT_THEME_NAME: + return ColorScheme.HIGH_CONTRAST_LIGHT; + default: + return ColorScheme.DARK; + } + } + get tokenTheme() { + if (!this._tokenTheme) { + let rules = []; + let encodedTokensColors = []; + if (this.themeData.inherit) { + const baseData = getBuiltinRules(this.themeData.base); + rules = baseData.rules; + if (baseData.encodedTokensColors) { + encodedTokensColors = baseData.encodedTokensColors; + } + } + const editorForeground2 = this.themeData.colors["editor.foreground"]; + const editorBackground2 = this.themeData.colors["editor.background"]; + if (editorForeground2 || editorBackground2) { + const rule = { token: "" }; + if (editorForeground2) { + rule.foreground = editorForeground2; + } + if (editorBackground2) { + rule.background = editorBackground2; + } + rules.push(rule); + } + rules = rules.concat(this.themeData.rules); + if (this.themeData.encodedTokensColors) { + encodedTokensColors = this.themeData.encodedTokensColors; + } + this._tokenTheme = TokenTheme.createFromRawTokenTheme(rules, encodedTokensColors); + } + return this._tokenTheme; + } + getTokenStyleMetadata(type, modifiers, modelLanguage) { + const style = this.tokenTheme._match([type].concat(modifiers).join(".")); + const metadata = style.metadata; + const foreground2 = TokenMetadata.getForeground(metadata); + const fontStyle = TokenMetadata.getFontStyle(metadata); + return { + foreground: foreground2, + italic: Boolean( + fontStyle & 1 + /* FontStyle.Italic */ + ), + bold: Boolean( + fontStyle & 2 + /* FontStyle.Bold */ + ), + underline: Boolean( + fontStyle & 4 + /* FontStyle.Underline */ + ), + strikethrough: Boolean( + fontStyle & 8 + /* FontStyle.Strikethrough */ + ) + }; + } + }; + StandaloneThemeService = class extends Disposable { + constructor() { + super(); + this._onColorThemeChange = this._register(new Emitter()); + this.onDidColorThemeChange = this._onColorThemeChange.event; + this._onProductIconThemeChange = this._register(new Emitter()); + this.onDidProductIconThemeChange = this._onProductIconThemeChange.event; + this._environment = /* @__PURE__ */ Object.create(null); + this._builtInProductIconTheme = new UnthemedProductIconTheme(); + this._autoDetectHighContrast = true; + this._knownThemes = /* @__PURE__ */ new Map(); + this._knownThemes.set(VS_LIGHT_THEME_NAME, newBuiltInTheme(VS_LIGHT_THEME_NAME)); + this._knownThemes.set(VS_DARK_THEME_NAME, newBuiltInTheme(VS_DARK_THEME_NAME)); + this._knownThemes.set(HC_BLACK_THEME_NAME, newBuiltInTheme(HC_BLACK_THEME_NAME)); + this._knownThemes.set(HC_LIGHT_THEME_NAME, newBuiltInTheme(HC_LIGHT_THEME_NAME)); + const iconsStyleSheet = this._register(getIconsStyleSheet(this)); + this._codiconCSS = iconsStyleSheet.getCSS(); + this._themeCSS = ""; + this._allCSS = `${this._codiconCSS} +${this._themeCSS}`; + this._globalStyleElement = null; + this._styleElements = []; + this._colorMapOverride = null; + this.setTheme(VS_LIGHT_THEME_NAME); + this._onOSSchemeChanged(); + this._register(iconsStyleSheet.onDidChange(() => { + this._codiconCSS = iconsStyleSheet.getCSS(); + this._updateCSS(); + })); + addMatchMediaChangeListener(mainWindow, "(forced-colors: active)", () => { + this._onOSSchemeChanged(); + }); + } + registerEditorContainer(domNode) { + if (isInShadowDOM(domNode)) { + return this._registerShadowDomContainer(domNode); + } + return this._registerRegularEditorContainer(); + } + _registerRegularEditorContainer() { + if (!this._globalStyleElement) { + this._globalStyleElement = createStyleSheet(void 0, (style) => { + style.className = "monaco-colors"; + style.textContent = this._allCSS; + }); + this._styleElements.push(this._globalStyleElement); + } + return Disposable.None; + } + _registerShadowDomContainer(domNode) { + const styleElement = createStyleSheet(domNode, (style) => { + style.className = "monaco-colors"; + style.textContent = this._allCSS; + }); + this._styleElements.push(styleElement); + return { + dispose: () => { + for (let i = 0; i < this._styleElements.length; i++) { + if (this._styleElements[i] === styleElement) { + this._styleElements.splice(i, 1); + return; + } + } + } + }; + } + defineTheme(themeName, themeData) { + if (!/^[a-z0-9\-]+$/i.test(themeName)) { + throw new Error("Illegal theme name!"); + } + if (!isBuiltinTheme(themeData.base) && !isBuiltinTheme(themeName)) { + throw new Error("Illegal theme base!"); + } + this._knownThemes.set(themeName, new StandaloneTheme(themeName, themeData)); + if (isBuiltinTheme(themeName)) { + this._knownThemes.forEach((theme) => { + if (theme.base === themeName) { + theme.notifyBaseUpdated(); + } + }); + } + if (this._theme.themeName === themeName) { + this.setTheme(themeName); + } + } + getColorTheme() { + return this._theme; + } + setColorMapOverride(colorMapOverride) { + this._colorMapOverride = colorMapOverride; + this._updateThemeOrColorMap(); + } + setTheme(themeName) { + let theme; + if (this._knownThemes.has(themeName)) { + theme = this._knownThemes.get(themeName); + } else { + theme = this._knownThemes.get(VS_LIGHT_THEME_NAME); + } + this._updateActualTheme(theme); + } + _updateActualTheme(desiredTheme) { + if (!desiredTheme || this._theme === desiredTheme) { + return; + } + this._theme = desiredTheme; + this._updateThemeOrColorMap(); + } + _onOSSchemeChanged() { + if (this._autoDetectHighContrast) { + const wantsHighContrast = mainWindow.matchMedia(`(forced-colors: active)`).matches; + if (wantsHighContrast !== isHighContrast(this._theme.type)) { + let newThemeName; + if (isDark(this._theme.type)) { + newThemeName = wantsHighContrast ? HC_BLACK_THEME_NAME : VS_DARK_THEME_NAME; + } else { + newThemeName = wantsHighContrast ? HC_LIGHT_THEME_NAME : VS_LIGHT_THEME_NAME; + } + this._updateActualTheme(this._knownThemes.get(newThemeName)); + } + } + } + setAutoDetectHighContrast(autoDetectHighContrast) { + this._autoDetectHighContrast = autoDetectHighContrast; + this._onOSSchemeChanged(); + } + _updateThemeOrColorMap() { + const cssRules = []; + const hasRule = {}; + const ruleCollector = { + addRule: (rule) => { + if (!hasRule[rule]) { + cssRules.push(rule); + hasRule[rule] = true; + } + } + }; + themingRegistry2.getThemingParticipants().forEach((p) => p(this._theme, ruleCollector, this._environment)); + const colorVariables = []; + for (const item of colorRegistry2.getColors()) { + const color = this._theme.getColor(item.id, true); + if (color) { + colorVariables.push(`${asCssVariableName(item.id)}: ${color.toString()};`); + } + } + ruleCollector.addRule(`.monaco-editor, .monaco-diff-editor, .monaco-component { ${colorVariables.join("\n")} }`); + const colorMap = this._colorMapOverride || this._theme.tokenTheme.getColorMap(); + ruleCollector.addRule(generateTokensCSSForColorMap(colorMap)); + this._themeCSS = cssRules.join("\n"); + this._updateCSS(); + TokenizationRegistry2.setColorMap(colorMap); + this._onColorThemeChange.fire(this._theme); + } + _updateCSS() { + this._allCSS = `${this._codiconCSS} +${this._themeCSS}`; + this._styleElements.forEach((styleElement) => styleElement.textContent = this._allCSS); + } + getFileIconTheme() { + return { + hasFileIcons: false, + hasFolderIcons: false, + hidesExplorerArrows: false + }; + } + getProductIconTheme() { + return this._builtInProductIconTheme; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/common/standaloneTheme.js +var IStandaloneThemeService; +var init_standaloneTheme = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/common/standaloneTheme.js"() { + init_instantiation(); + IStandaloneThemeService = createDecorator("themeService"); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/accessibility/browser/accessibilityService.js +var __decorate43, __param37, AccessibilityService; +var init_accessibilityService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/accessibility/browser/accessibilityService.js"() { + init_dom(); + init_window(); + init_event(); + init_lifecycle(); + init_accessibility(); + init_configuration(); + init_contextkey(); + init_layoutService(); + __decorate43 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param37 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + AccessibilityService = class AccessibilityService2 extends Disposable { + constructor(_contextKeyService, _layoutService, _configurationService) { + super(); + this._contextKeyService = _contextKeyService; + this._layoutService = _layoutService; + this._configurationService = _configurationService; + this._accessibilitySupport = 0; + this._onDidChangeScreenReaderOptimized = new Emitter(); + this._onDidChangeReducedMotion = new Emitter(); + this._accessibilityModeEnabledContext = CONTEXT_ACCESSIBILITY_MODE_ENABLED.bindTo(this._contextKeyService); + const updateContextKey = () => this._accessibilityModeEnabledContext.set(this.isScreenReaderOptimized()); + this._register(this._configurationService.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration("editor.accessibilitySupport")) { + updateContextKey(); + this._onDidChangeScreenReaderOptimized.fire(); + } + if (e.affectsConfiguration("workbench.reduceMotion")) { + this._configMotionReduced = this._configurationService.getValue("workbench.reduceMotion"); + this._onDidChangeReducedMotion.fire(); + } + })); + updateContextKey(); + this._register(this.onDidChangeScreenReaderOptimized(() => updateContextKey())); + const reduceMotionMatcher = mainWindow.matchMedia(`(prefers-reduced-motion: reduce)`); + this._systemMotionReduced = reduceMotionMatcher.matches; + this._configMotionReduced = this._configurationService.getValue("workbench.reduceMotion"); + this.initReducedMotionListeners(reduceMotionMatcher); + } + initReducedMotionListeners(reduceMotionMatcher) { + this._register(addDisposableListener(reduceMotionMatcher, "change", () => { + this._systemMotionReduced = reduceMotionMatcher.matches; + if (this._configMotionReduced === "auto") { + this._onDidChangeReducedMotion.fire(); + } + })); + const updateRootClasses = () => { + const reduce = this.isMotionReduced(); + this._layoutService.mainContainer.classList.toggle("reduce-motion", reduce); + this._layoutService.mainContainer.classList.toggle("enable-motion", !reduce); + }; + updateRootClasses(); + this._register(this.onDidChangeReducedMotion(() => updateRootClasses())); + } + get onDidChangeScreenReaderOptimized() { + return this._onDidChangeScreenReaderOptimized.event; + } + isScreenReaderOptimized() { + const config = this._configurationService.getValue("editor.accessibilitySupport"); + return config === "on" || config === "auto" && this._accessibilitySupport === 2; + } + get onDidChangeReducedMotion() { + return this._onDidChangeReducedMotion.event; + } + isMotionReduced() { + const config = this._configMotionReduced; + return config === "on" || config === "auto" && this._systemMotionReduced; + } + getAccessibilitySupport() { + return this._accessibilitySupport; + } + }; + AccessibilityService = __decorate43([ + __param37(0, IContextKeyService), + __param37(1, ILayoutService), + __param37(2, IConfigurationService) + ], AccessibilityService); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/actions/common/menuService.js +function createMenuHide(menu, command, states) { + const id = isISubmenuItem(command) ? command.submenu.id : command.id; + const title = typeof command.title === "string" ? command.title : command.title.value; + const hide2 = toAction({ + id: `hide/${menu.id}/${id}`, + label: localize("hide.label", "Hide '{0}'", title), + run() { + states.updateHidden(menu, id, true); + } + }); + const toggle = toAction({ + id: `toggle/${menu.id}/${id}`, + label: title, + get checked() { + return !states.isHidden(menu, id); + }, + run() { + states.updateHidden(menu, id, !!this.checked); + } + }); + return { + hide: hide2, + toggle, + get isHidden() { + return !toggle.checked; + } + }; +} +function createConfigureKeybindingAction(commandId, when = void 0, commandService, keybindingService) { + return toAction({ + id: `configureKeybinding/${commandId}`, + label: localize("configure keybinding", "Configure Keybinding"), + run() { + const hasKeybinding = !!keybindingService.lookupKeybinding(commandId); + const whenValue = !hasKeybinding && when ? when.serialize() : void 0; + commandService.executeCommand("workbench.action.openGlobalKeybindings", `@command:${commandId}` + (whenValue ? ` +when:${whenValue}` : "")); + } + }); +} +var __decorate44, __param38, PersistedMenuHideState_1, MenuInfo_1, MenuService, PersistedMenuHideState, MenuInfo, MenuImpl; +var init_menuService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/actions/common/menuService.js"() { + init_async(); + init_event(); + init_lifecycle(); + init_actions2(); + init_commands(); + init_contextkey(); + init_actions(); + init_storage2(); + init_arrays(); + init_nls(); + init_keybinding(); + __decorate44 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param38 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + MenuService = class MenuService2 { + constructor(_commandService, _keybindingService, storageService) { + this._commandService = _commandService; + this._keybindingService = _keybindingService; + this._hiddenStates = new PersistedMenuHideState(storageService); + } + createMenu(id, contextKeyService, options2) { + return new MenuImpl(id, this._hiddenStates, __spreadValues({ emitEventsForSubmenuChanges: false, eventDebounceDelay: 50 }, options2), this._commandService, this._keybindingService, contextKeyService); + } + resetHiddenStates(ids) { + this._hiddenStates.reset(ids); + } + }; + MenuService = __decorate44([ + __param38(0, ICommandService), + __param38(1, IKeybindingService), + __param38(2, IStorageService) + ], MenuService); + PersistedMenuHideState = PersistedMenuHideState_1 = class PersistedMenuHideState2 { + constructor(_storageService) { + this._storageService = _storageService; + this._disposables = new DisposableStore(); + this._onDidChange = new Emitter(); + this.onDidChange = this._onDidChange.event; + this._ignoreChangeEvent = false; + this._hiddenByDefaultCache = /* @__PURE__ */ new Map(); + try { + const raw = _storageService.get(PersistedMenuHideState_1._key, 0, "{}"); + this._data = JSON.parse(raw); + } catch (err) { + this._data = /* @__PURE__ */ Object.create(null); + } + this._disposables.add(_storageService.onDidChangeValue(0, PersistedMenuHideState_1._key, this._disposables)(() => { + if (!this._ignoreChangeEvent) { + try { + const raw = _storageService.get(PersistedMenuHideState_1._key, 0, "{}"); + this._data = JSON.parse(raw); + } catch (err) { + console.log("FAILED to read storage after UPDATE", err); + } + } + this._onDidChange.fire(); + })); + } + dispose() { + this._onDidChange.dispose(); + this._disposables.dispose(); + } + _isHiddenByDefault(menu, commandId) { + var _a10; + return (_a10 = this._hiddenByDefaultCache.get(`${menu.id}/${commandId}`)) !== null && _a10 !== void 0 ? _a10 : false; + } + setDefaultState(menu, commandId, hidden) { + this._hiddenByDefaultCache.set(`${menu.id}/${commandId}`, hidden); + } + isHidden(menu, commandId) { + var _a10, _b4; + const hiddenByDefault = this._isHiddenByDefault(menu, commandId); + const state = (_b4 = (_a10 = this._data[menu.id]) === null || _a10 === void 0 ? void 0 : _a10.includes(commandId)) !== null && _b4 !== void 0 ? _b4 : false; + return hiddenByDefault ? !state : state; + } + updateHidden(menu, commandId, hidden) { + const hiddenByDefault = this._isHiddenByDefault(menu, commandId); + if (hiddenByDefault) { + hidden = !hidden; + } + const entries2 = this._data[menu.id]; + if (!hidden) { + if (entries2) { + const idx = entries2.indexOf(commandId); + if (idx >= 0) { + removeFastWithoutKeepingOrder(entries2, idx); + } + if (entries2.length === 0) { + delete this._data[menu.id]; + } + } + } else { + if (!entries2) { + this._data[menu.id] = [commandId]; + } else { + const idx = entries2.indexOf(commandId); + if (idx < 0) { + entries2.push(commandId); + } + } + } + this._persist(); + } + reset(menus) { + if (menus === void 0) { + this._data = /* @__PURE__ */ Object.create(null); + this._persist(); + } else { + for (const { id } of menus) { + if (this._data[id]) { + delete this._data[id]; + } + } + this._persist(); + } + } + _persist() { + try { + this._ignoreChangeEvent = true; + const raw = JSON.stringify(this._data); + this._storageService.store( + PersistedMenuHideState_1._key, + raw, + 0, + 0 + /* StorageTarget.USER */ + ); + } finally { + this._ignoreChangeEvent = false; + } + } + }; + PersistedMenuHideState._key = "menu.hiddenCommands"; + PersistedMenuHideState = PersistedMenuHideState_1 = __decorate44([ + __param38(0, IStorageService) + ], PersistedMenuHideState); + MenuInfo = MenuInfo_1 = class MenuInfo2 { + constructor(_id, _hiddenStates, _collectContextKeysForSubmenus, _commandService, _keybindingService, _contextKeyService) { + this._id = _id; + this._hiddenStates = _hiddenStates; + this._collectContextKeysForSubmenus = _collectContextKeysForSubmenus; + this._commandService = _commandService; + this._keybindingService = _keybindingService; + this._contextKeyService = _contextKeyService; + this._menuGroups = []; + this._structureContextKeys = /* @__PURE__ */ new Set(); + this._preconditionContextKeys = /* @__PURE__ */ new Set(); + this._toggledContextKeys = /* @__PURE__ */ new Set(); + this.refresh(); + } + get structureContextKeys() { + return this._structureContextKeys; + } + get preconditionContextKeys() { + return this._preconditionContextKeys; + } + get toggledContextKeys() { + return this._toggledContextKeys; + } + refresh() { + this._menuGroups.length = 0; + this._structureContextKeys.clear(); + this._preconditionContextKeys.clear(); + this._toggledContextKeys.clear(); + const menuItems = MenuRegistry.getMenuItems(this._id); + let group; + menuItems.sort(MenuInfo_1._compareMenuItems); + for (const item of menuItems) { + const groupName = item.group || ""; + if (!group || group[0] !== groupName) { + group = [groupName, []]; + this._menuGroups.push(group); + } + group[1].push(item); + this._collectContextKeys(item); + } + } + _collectContextKeys(item) { + MenuInfo_1._fillInKbExprKeys(item.when, this._structureContextKeys); + if (isIMenuItem(item)) { + if (item.command.precondition) { + MenuInfo_1._fillInKbExprKeys(item.command.precondition, this._preconditionContextKeys); + } + if (item.command.toggled) { + const toggledExpression = item.command.toggled.condition || item.command.toggled; + MenuInfo_1._fillInKbExprKeys(toggledExpression, this._toggledContextKeys); + } + } else if (this._collectContextKeysForSubmenus) { + MenuRegistry.getMenuItems(item.submenu).forEach(this._collectContextKeys, this); + } + } + createActionGroups(options2) { + const result = []; + for (const group of this._menuGroups) { + const [id, items] = group; + let activeActions; + for (const item of items) { + if (this._contextKeyService.contextMatchesRules(item.when)) { + const isMenuItem = isIMenuItem(item); + if (isMenuItem) { + this._hiddenStates.setDefaultState(this._id, item.command.id, !!item.isHiddenByDefault); + } + const menuHide = createMenuHide(this._id, isMenuItem ? item.command : item, this._hiddenStates); + if (isMenuItem) { + const menuKeybinding = createConfigureKeybindingAction(item.command.id, item.when, this._commandService, this._keybindingService); + (activeActions !== null && activeActions !== void 0 ? activeActions : activeActions = []).push(new MenuItemAction(item.command, item.alt, options2, menuHide, menuKeybinding, this._contextKeyService, this._commandService)); + } else { + const groups = new MenuInfo_1(item.submenu, this._hiddenStates, this._collectContextKeysForSubmenus, this._commandService, this._keybindingService, this._contextKeyService).createActionGroups(options2); + const submenuActions = Separator.join(...groups.map((g) => g[1])); + if (submenuActions.length > 0) { + (activeActions !== null && activeActions !== void 0 ? activeActions : activeActions = []).push(new SubmenuItemAction(item, menuHide, submenuActions)); + } + } + } + } + if (activeActions && activeActions.length > 0) { + result.push([id, activeActions]); + } + } + return result; + } + static _fillInKbExprKeys(exp, set) { + if (exp) { + for (const key of exp.keys()) { + set.add(key); + } + } + } + static _compareMenuItems(a3, b) { + const aGroup = a3.group; + const bGroup = b.group; + if (aGroup !== bGroup) { + if (!aGroup) { + return 1; + } else if (!bGroup) { + return -1; + } + if (aGroup === "navigation") { + return -1; + } else if (bGroup === "navigation") { + return 1; + } + const value = aGroup.localeCompare(bGroup); + if (value !== 0) { + return value; + } + } + const aPrio = a3.order || 0; + const bPrio = b.order || 0; + if (aPrio < bPrio) { + return -1; + } else if (aPrio > bPrio) { + return 1; + } + return MenuInfo_1._compareTitles(isIMenuItem(a3) ? a3.command.title : a3.title, isIMenuItem(b) ? b.command.title : b.title); + } + static _compareTitles(a3, b) { + const aStr = typeof a3 === "string" ? a3 : a3.original; + const bStr = typeof b === "string" ? b : b.original; + return aStr.localeCompare(bStr); + } + }; + MenuInfo = MenuInfo_1 = __decorate44([ + __param38(3, ICommandService), + __param38(4, IKeybindingService), + __param38(5, IContextKeyService) + ], MenuInfo); + MenuImpl = class MenuImpl2 { + constructor(id, hiddenStates, options2, commandService, keybindingService, contextKeyService) { + this._disposables = new DisposableStore(); + this._menuInfo = new MenuInfo(id, hiddenStates, options2.emitEventsForSubmenuChanges, commandService, keybindingService, contextKeyService); + const rebuildMenuSoon = new RunOnceScheduler(() => { + this._menuInfo.refresh(); + this._onDidChange.fire({ menu: this, isStructuralChange: true, isEnablementChange: true, isToggleChange: true }); + }, options2.eventDebounceDelay); + this._disposables.add(rebuildMenuSoon); + this._disposables.add(MenuRegistry.onDidChangeMenu((e) => { + if (e.has(id)) { + rebuildMenuSoon.schedule(); + } + })); + const lazyListener = this._disposables.add(new DisposableStore()); + const merge = (events) => { + let isStructuralChange = false; + let isEnablementChange = false; + let isToggleChange = false; + for (const item of events) { + isStructuralChange = isStructuralChange || item.isStructuralChange; + isEnablementChange = isEnablementChange || item.isEnablementChange; + isToggleChange = isToggleChange || item.isToggleChange; + if (isStructuralChange && isEnablementChange && isToggleChange) { + break; + } + } + return { menu: this, isStructuralChange, isEnablementChange, isToggleChange }; + }; + const startLazyListener = () => { + lazyListener.add(contextKeyService.onDidChangeContext((e) => { + const isStructuralChange = e.affectsSome(this._menuInfo.structureContextKeys); + const isEnablementChange = e.affectsSome(this._menuInfo.preconditionContextKeys); + const isToggleChange = e.affectsSome(this._menuInfo.toggledContextKeys); + if (isStructuralChange || isEnablementChange || isToggleChange) { + this._onDidChange.fire({ menu: this, isStructuralChange, isEnablementChange, isToggleChange }); + } + })); + lazyListener.add(hiddenStates.onDidChange((e) => { + this._onDidChange.fire({ menu: this, isStructuralChange: true, isEnablementChange: false, isToggleChange: false }); + })); + }; + this._onDidChange = new DebounceEmitter({ + // start/stop context key listener + onWillAddFirstListener: startLazyListener, + onDidRemoveLastListener: lazyListener.clear.bind(lazyListener), + delay: options2.eventDebounceDelay, + merge + }); + this.onDidChange = this._onDidChange.event; + } + getActions(options2) { + return this._menuInfo.createActionGroups(options2); + } + dispose() { + this._disposables.dispose(); + this._onDidChange.dispose(); + } + }; + MenuImpl = __decorate44([ + __param38(3, ICommandService), + __param38(4, IKeybindingService), + __param38(5, IContextKeyService) + ], MenuImpl); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/clipboard/browser/clipboardService.js +var __decorate45, __param39, BrowserClipboardService_1, BrowserClipboardService; +var init_clipboardService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/clipboard/browser/clipboardService.js"() { + init_browser(); + init_dom(); + init_window(); + init_async(); + init_event(); + init_hash(); + init_lifecycle(); + init_layoutService(); + init_log(); + __decorate45 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param39 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + BrowserClipboardService = BrowserClipboardService_1 = class BrowserClipboardService2 extends Disposable { + constructor(layoutService, logService) { + super(); + this.layoutService = layoutService; + this.logService = logService; + this.mapTextToType = /* @__PURE__ */ new Map(); + this.findText = ""; + this.resources = []; + this.resourcesStateHash = void 0; + if (isSafari2 || isWebkitWebView) { + this.installWebKitWriteTextWorkaround(); + } + this._register(Event.runAndSubscribe(onDidRegisterWindow, ({ window: window2, disposables }) => { + disposables.add(addDisposableListener(window2.document, "copy", () => this.clearResources())); + }, { window: mainWindow, disposables: this._store })); + } + // In Safari, it has the following note: + // + // "The request to write to the clipboard must be triggered during a user gesture. + // A call to clipboard.write or clipboard.writeText outside the scope of a user + // gesture(such as "click" or "touch" event handlers) will result in the immediate + // rejection of the promise returned by the API call." + // From: https://webkit.org/blog/10855/async-clipboard-api/ + // + // Since extensions run in a web worker, and handle gestures in an asynchronous way, + // they are not classified by Safari as "in response to a user gesture" and will reject. + // + // This function sets up some handlers to work around that behavior. + installWebKitWriteTextWorkaround() { + const handler = () => { + const currentWritePromise = new DeferredPromise(); + if (this.webKitPendingClipboardWritePromise && !this.webKitPendingClipboardWritePromise.isSettled) { + this.webKitPendingClipboardWritePromise.cancel(); + } + this.webKitPendingClipboardWritePromise = currentWritePromise; + getActiveWindow().navigator.clipboard.write([new ClipboardItem({ + "text/plain": currentWritePromise.p + })]).catch((err) => __async(this, null, function* () { + if (!(err instanceof Error) || err.name !== "NotAllowedError" || !currentWritePromise.isRejected) { + this.logService.error(err); + } + })); + }; + this._register(Event.runAndSubscribe(this.layoutService.onDidAddContainer, ({ container, disposables }) => { + disposables.add(addDisposableListener(container, "click", handler)); + disposables.add(addDisposableListener(container, "keydown", handler)); + }, { container: this.layoutService.mainContainer, disposables: this._store })); + } + writeText(text2, type) { + return __async(this, null, function* () { + this.writeResources([]); + if (type) { + this.mapTextToType.set(type, text2); + return; + } + if (this.webKitPendingClipboardWritePromise) { + return this.webKitPendingClipboardWritePromise.complete(text2); + } + try { + return yield getActiveWindow().navigator.clipboard.writeText(text2); + } catch (error) { + console.error(error); + } + this.fallbackWriteText(text2); + }); + } + fallbackWriteText(text2) { + const activeDocument = getActiveDocument(); + const activeElement = activeDocument.activeElement; + const textArea = activeDocument.body.appendChild($("textarea", { "aria-hidden": true })); + textArea.style.height = "1px"; + textArea.style.width = "1px"; + textArea.style.position = "absolute"; + textArea.value = text2; + textArea.focus(); + textArea.select(); + activeDocument.execCommand("copy"); + if (isHTMLElement(activeElement)) { + activeElement.focus(); + } + activeDocument.body.removeChild(textArea); + } + readText(type) { + return __async(this, null, function* () { + if (type) { + return this.mapTextToType.get(type) || ""; + } + try { + return yield getActiveWindow().navigator.clipboard.readText(); + } catch (error) { + console.error(error); + } + return ""; + }); + } + readFindText() { + return __async(this, null, function* () { + return this.findText; + }); + } + writeFindText(text2) { + return __async(this, null, function* () { + this.findText = text2; + }); + } + writeResources(resources) { + return __async(this, null, function* () { + if (resources.length === 0) { + this.clearResources(); + } else { + this.resources = resources; + this.resourcesStateHash = yield this.computeResourcesStateHash(); + } + }); + } + readResources() { + return __async(this, null, function* () { + const resourcesStateHash = yield this.computeResourcesStateHash(); + if (this.resourcesStateHash !== resourcesStateHash) { + this.clearResources(); + } + return this.resources; + }); + } + computeResourcesStateHash() { + return __async(this, null, function* () { + if (this.resources.length === 0) { + return void 0; + } + const clipboardText = yield this.readText(); + return hash(clipboardText.substring(0, BrowserClipboardService_1.MAX_RESOURCE_STATE_SOURCE_LENGTH)); + }); + } + clearResources() { + this.resources = []; + this.resourcesStateHash = void 0; + } + }; + BrowserClipboardService.MAX_RESOURCE_STATE_SOURCE_LENGTH = 1e3; + BrowserClipboardService = BrowserClipboardService_1 = __decorate45([ + __param39(0, ILayoutService), + __param39(1, ILogService) + ], BrowserClipboardService); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/clipboard/common/clipboardService.js +var IClipboardService; +var init_clipboardService2 = __esm({ + "node_modules/monaco-editor/esm/vs/platform/clipboard/common/clipboardService.js"() { + init_instantiation(); + IClipboardService = createDecorator("clipboardService"); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/contextkey/browser/contextKeyService.js +function allEventKeysInContext(event, context) { + return event.allKeysContainedIn(new Set(Object.keys(context))); +} +function findContextAttr(domNode) { + while (domNode) { + if (domNode.hasAttribute(KEYBINDING_CONTEXT_ATTR)) { + const attr = domNode.getAttribute(KEYBINDING_CONTEXT_ATTR); + if (attr) { + return parseInt(attr, 10); + } + return NaN; + } + domNode = domNode.parentElement; + } + return 0; +} +function setContext(accessor, contextKey, contextValue) { + const contextKeyService = accessor.get(IContextKeyService); + contextKeyService.createKey(String(contextKey), stringifyURIs(contextValue)); +} +function stringifyURIs(contextValue) { + return cloneAndChange(contextValue, (obj) => { + if (typeof obj === "object" && obj.$mid === 1) { + return URI.revive(obj).toString(); + } + if (obj instanceof URI) { + return obj.toString(); + } + return void 0; + }); +} +var __decorate46, __param40, KEYBINDING_CONTEXT_ATTR, Context, NullContext, ConfigAwareContextValuesContainer, ContextKey, SimpleContextKeyChangeEvent, ArrayContextKeyChangeEvent, CompositeContextKeyChangeEvent, AbstractContextKeyService, ContextKeyService, ScopedContextKeyService; +var init_contextKeyService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/contextkey/browser/contextKeyService.js"() { + init_event(); + init_iterator(); + init_lifecycle(); + init_objects(); + init_ternarySearchTree(); + init_uri(); + init_nls(); + init_commands(); + init_configuration(); + init_contextkey(); + __decorate46 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param40 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + KEYBINDING_CONTEXT_ATTR = "data-keybinding-context"; + Context = class { + constructor(id, parent) { + this._id = id; + this._parent = parent; + this._value = /* @__PURE__ */ Object.create(null); + this._value["_contextId"] = id; + } + get value() { + return __spreadValues({}, this._value); + } + setValue(key, value) { + if (this._value[key] !== value) { + this._value[key] = value; + return true; + } + return false; + } + removeValue(key) { + if (key in this._value) { + delete this._value[key]; + return true; + } + return false; + } + getValue(key) { + const ret = this._value[key]; + if (typeof ret === "undefined" && this._parent) { + return this._parent.getValue(key); + } + return ret; + } + }; + NullContext = class extends Context { + constructor() { + super(-1, null); + } + setValue(key, value) { + return false; + } + removeValue(key) { + return false; + } + getValue(key) { + return void 0; + } + }; + NullContext.INSTANCE = new NullContext(); + ConfigAwareContextValuesContainer = class _ConfigAwareContextValuesContainer extends Context { + constructor(id, _configurationService, emitter) { + super(id, null); + this._configurationService = _configurationService; + this._values = TernarySearchTree.forConfigKeys(); + this._listener = this._configurationService.onDidChangeConfiguration((event) => { + if (event.source === 7) { + const allKeys = Array.from(this._values, ([k]) => k); + this._values.clear(); + emitter.fire(new ArrayContextKeyChangeEvent(allKeys)); + } else { + const changedKeys = []; + for (const configKey of event.affectedKeys) { + const contextKey = `config.${configKey}`; + const cachedItems = this._values.findSuperstr(contextKey); + if (cachedItems !== void 0) { + changedKeys.push(...Iterable.map(cachedItems, ([key]) => key)); + this._values.deleteSuperstr(contextKey); + } + if (this._values.has(contextKey)) { + changedKeys.push(contextKey); + this._values.delete(contextKey); + } + } + emitter.fire(new ArrayContextKeyChangeEvent(changedKeys)); + } + }); + } + dispose() { + this._listener.dispose(); + } + getValue(key) { + if (key.indexOf(_ConfigAwareContextValuesContainer._keyPrefix) !== 0) { + return super.getValue(key); + } + if (this._values.has(key)) { + return this._values.get(key); + } + const configKey = key.substr(_ConfigAwareContextValuesContainer._keyPrefix.length); + const configValue = this._configurationService.getValue(configKey); + let value = void 0; + switch (typeof configValue) { + case "number": + case "boolean": + case "string": + value = configValue; + break; + default: + if (Array.isArray(configValue)) { + value = JSON.stringify(configValue); + } else { + value = configValue; + } + } + this._values.set(key, value); + return value; + } + setValue(key, value) { + return super.setValue(key, value); + } + removeValue(key) { + return super.removeValue(key); + } + }; + ConfigAwareContextValuesContainer._keyPrefix = "config."; + ContextKey = class { + constructor(service, key, defaultValue) { + this._service = service; + this._key = key; + this._defaultValue = defaultValue; + this.reset(); + } + set(value) { + this._service.setContext(this._key, value); + } + reset() { + if (typeof this._defaultValue === "undefined") { + this._service.removeContext(this._key); + } else { + this._service.setContext(this._key, this._defaultValue); + } + } + get() { + return this._service.getContextKeyValue(this._key); + } + }; + SimpleContextKeyChangeEvent = class { + constructor(key) { + this.key = key; + } + affectsSome(keys) { + return keys.has(this.key); + } + allKeysContainedIn(keys) { + return this.affectsSome(keys); + } + }; + ArrayContextKeyChangeEvent = class { + constructor(keys) { + this.keys = keys; + } + affectsSome(keys) { + for (const key of this.keys) { + if (keys.has(key)) { + return true; + } + } + return false; + } + allKeysContainedIn(keys) { + return this.keys.every((key) => keys.has(key)); + } + }; + CompositeContextKeyChangeEvent = class { + constructor(events) { + this.events = events; + } + affectsSome(keys) { + for (const e of this.events) { + if (e.affectsSome(keys)) { + return true; + } + } + return false; + } + allKeysContainedIn(keys) { + return this.events.every((evt) => evt.allKeysContainedIn(keys)); + } + }; + AbstractContextKeyService = class extends Disposable { + constructor(myContextId) { + super(); + this._onDidChangeContext = this._register(new PauseableEmitter({ merge: (input) => new CompositeContextKeyChangeEvent(input) })); + this.onDidChangeContext = this._onDidChangeContext.event; + this._isDisposed = false; + this._myContextId = myContextId; + } + createKey(key, defaultValue) { + if (this._isDisposed) { + throw new Error(`AbstractContextKeyService has been disposed`); + } + return new ContextKey(this, key, defaultValue); + } + bufferChangeEvents(callback) { + this._onDidChangeContext.pause(); + try { + callback(); + } finally { + this._onDidChangeContext.resume(); + } + } + createScoped(domNode) { + if (this._isDisposed) { + throw new Error(`AbstractContextKeyService has been disposed`); + } + return new ScopedContextKeyService(this, domNode); + } + contextMatchesRules(rules) { + if (this._isDisposed) { + throw new Error(`AbstractContextKeyService has been disposed`); + } + const context = this.getContextValuesContainer(this._myContextId); + const result = rules ? rules.evaluate(context) : true; + return result; + } + getContextKeyValue(key) { + if (this._isDisposed) { + return void 0; + } + return this.getContextValuesContainer(this._myContextId).getValue(key); + } + setContext(key, value) { + if (this._isDisposed) { + return; + } + const myContext = this.getContextValuesContainer(this._myContextId); + if (!myContext) { + return; + } + if (myContext.setValue(key, value)) { + this._onDidChangeContext.fire(new SimpleContextKeyChangeEvent(key)); + } + } + removeContext(key) { + if (this._isDisposed) { + return; + } + if (this.getContextValuesContainer(this._myContextId).removeValue(key)) { + this._onDidChangeContext.fire(new SimpleContextKeyChangeEvent(key)); + } + } + getContext(target) { + if (this._isDisposed) { + return NullContext.INSTANCE; + } + return this.getContextValuesContainer(findContextAttr(target)); + } + dispose() { + super.dispose(); + this._isDisposed = true; + } + }; + ContextKeyService = class ContextKeyService2 extends AbstractContextKeyService { + constructor(configurationService) { + super(0); + this._contexts = /* @__PURE__ */ new Map(); + this._lastContextId = 0; + const myContext = this._register(new ConfigAwareContextValuesContainer(this._myContextId, configurationService, this._onDidChangeContext)); + this._contexts.set(this._myContextId, myContext); + } + getContextValuesContainer(contextId) { + if (this._isDisposed) { + return NullContext.INSTANCE; + } + return this._contexts.get(contextId) || NullContext.INSTANCE; + } + createChildContext(parentContextId = this._myContextId) { + if (this._isDisposed) { + throw new Error(`ContextKeyService has been disposed`); + } + const id = ++this._lastContextId; + this._contexts.set(id, new Context(id, this.getContextValuesContainer(parentContextId))); + return id; + } + disposeContext(contextId) { + if (!this._isDisposed) { + this._contexts.delete(contextId); + } + } + }; + ContextKeyService = __decorate46([ + __param40(0, IConfigurationService) + ], ContextKeyService); + ScopedContextKeyService = class extends AbstractContextKeyService { + constructor(parent, domNode) { + super(parent.createChildContext()); + this._parentChangeListener = this._register(new MutableDisposable()); + this._parent = parent; + this._updateParentChangeListener(); + this._domNode = domNode; + if (this._domNode.hasAttribute(KEYBINDING_CONTEXT_ATTR)) { + let extraInfo = ""; + if (this._domNode.classList) { + extraInfo = Array.from(this._domNode.classList.values()).join(", "); + } + console.error(`Element already has context attribute${extraInfo ? ": " + extraInfo : ""}`); + } + this._domNode.setAttribute(KEYBINDING_CONTEXT_ATTR, String(this._myContextId)); + } + _updateParentChangeListener() { + this._parentChangeListener.value = this._parent.onDidChangeContext((e) => { + const thisContainer = this._parent.getContextValuesContainer(this._myContextId); + const thisContextValues = thisContainer.value; + if (!allEventKeysInContext(e, thisContextValues)) { + this._onDidChangeContext.fire(e); + } + }); + } + dispose() { + if (this._isDisposed) { + return; + } + this._parent.disposeContext(this._myContextId); + this._domNode.removeAttribute(KEYBINDING_CONTEXT_ATTR); + super.dispose(); + } + getContextValuesContainer(contextId) { + if (this._isDisposed) { + return NullContext.INSTANCE; + } + return this._parent.getContextValuesContainer(contextId); + } + createChildContext(parentContextId = this._myContextId) { + if (this._isDisposed) { + throw new Error(`ScopedContextKeyService has been disposed`); + } + return this._parent.createChildContext(parentContextId); + } + disposeContext(contextId) { + if (this._isDisposed) { + return; + } + this._parent.disposeContext(contextId); + } + }; + CommandsRegistry.registerCommand("_setContext", setContext); + CommandsRegistry.registerCommand({ + id: "getContextKeyInfo", + handler() { + return [...RawContextKey.all()].sort((a3, b) => a3.key.localeCompare(b.key)); + }, + metadata: { + description: localize("getContextKeyInfo", "A command that returns information about context keys"), + args: [] + } + }); + CommandsRegistry.registerCommand("_generateContextKeyInfo", function() { + const result = []; + const seen = /* @__PURE__ */ new Set(); + for (const info of RawContextKey.all()) { + if (!seen.has(info.key)) { + seen.add(info.key); + result.push(info); + } + } + result.sort((a3, b) => a3.key.localeCompare(b.key)); + console.log(JSON.stringify(result, void 0, 2)); + }); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/instantiation/common/graph.js +var Node3, Graph; +var init_graph = __esm({ + "node_modules/monaco-editor/esm/vs/platform/instantiation/common/graph.js"() { + Node3 = class { + constructor(key, data) { + this.key = key; + this.data = data; + this.incoming = /* @__PURE__ */ new Map(); + this.outgoing = /* @__PURE__ */ new Map(); + } + }; + Graph = class { + constructor(_hashFn) { + this._hashFn = _hashFn; + this._nodes = /* @__PURE__ */ new Map(); + } + roots() { + const ret = []; + for (const node of this._nodes.values()) { + if (node.outgoing.size === 0) { + ret.push(node); + } + } + return ret; + } + insertEdge(from, to) { + const fromNode = this.lookupOrInsertNode(from); + const toNode = this.lookupOrInsertNode(to); + fromNode.outgoing.set(toNode.key, toNode); + toNode.incoming.set(fromNode.key, fromNode); + } + removeNode(data) { + const key = this._hashFn(data); + this._nodes.delete(key); + for (const node of this._nodes.values()) { + node.outgoing.delete(key); + node.incoming.delete(key); + } + } + lookupOrInsertNode(data) { + const key = this._hashFn(data); + let node = this._nodes.get(key); + if (!node) { + node = new Node3(key, data); + this._nodes.set(key, node); + } + return node; + } + isEmpty() { + return this._nodes.size === 0; + } + toString() { + const data = []; + for (const [key, value] of this._nodes) { + data.push(`${key} + (-> incoming)[${[...value.incoming.keys()].join(", ")}] + (outgoing ->)[${[...value.outgoing.keys()].join(",")}] +`); + } + return data.join("\n"); + } + /** + * This is brute force and slow and **only** be used + * to trouble shoot. + */ + findCycleSlow() { + for (const [id, node] of this._nodes) { + const seen = /* @__PURE__ */ new Set([id]); + const res = this._findCycle(node, seen); + if (res) { + return res; + } + } + return void 0; + } + _findCycle(node, seen) { + for (const [id, outgoing] of node.outgoing) { + if (seen.has(id)) { + return [...seen, id].join(" -> "); + } + seen.add(id); + const value = this._findCycle(outgoing, seen); + if (value) { + return value; + } + seen.delete(id); + } + return void 0; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/instantiation/common/instantiationService.js +var _enableAllTracing, CyclicDependencyError, InstantiationService, Trace; +var init_instantiationService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/instantiation/common/instantiationService.js"() { + init_async(); + init_errors(); + init_lifecycle(); + init_descriptors(); + init_graph(); + init_instantiation(); + init_serviceCollection(); + init_linkedList(); + _enableAllTracing = false; + CyclicDependencyError = class extends Error { + constructor(graph) { + var _a10; + super("cyclic dependency between services"); + this.message = (_a10 = graph.findCycleSlow()) !== null && _a10 !== void 0 ? _a10 : `UNABLE to detect cycle, dumping graph: +${graph.toString()}`; + } + }; + InstantiationService = class _InstantiationService { + constructor(_services = new ServiceCollection(), _strict = false, _parent, _enableTracing = _enableAllTracing) { + var _a10; + this._services = _services; + this._strict = _strict; + this._parent = _parent; + this._enableTracing = _enableTracing; + this._isDisposed = false; + this._servicesToMaybeDispose = /* @__PURE__ */ new Set(); + this._children = /* @__PURE__ */ new Set(); + this._activeInstantiations = /* @__PURE__ */ new Set(); + this._services.set(IInstantiationService, this); + this._globalGraph = _enableTracing ? (_a10 = _parent === null || _parent === void 0 ? void 0 : _parent._globalGraph) !== null && _a10 !== void 0 ? _a10 : new Graph((e) => e) : void 0; + } + dispose() { + if (!this._isDisposed) { + this._isDisposed = true; + dispose(this._children); + this._children.clear(); + for (const candidate of this._servicesToMaybeDispose) { + if (isDisposable(candidate)) { + candidate.dispose(); + } + } + this._servicesToMaybeDispose.clear(); + } + } + _throwIfDisposed() { + if (this._isDisposed) { + throw new Error("InstantiationService has been disposed"); + } + } + createChild(services, store) { + this._throwIfDisposed(); + const that = this; + const result = new class extends _InstantiationService { + dispose() { + that._children.delete(result); + super.dispose(); + } + }(services, this._strict, this, this._enableTracing); + this._children.add(result); + store === null || store === void 0 ? void 0 : store.add(result); + return result; + } + invokeFunction(fn, ...args) { + this._throwIfDisposed(); + const _trace = Trace.traceInvocation(this._enableTracing, fn); + let _done = false; + try { + const accessor = { + get: (id) => { + if (_done) { + throw illegalState("service accessor is only valid during the invocation of its target method"); + } + const result = this._getOrCreateServiceInstance(id, _trace); + if (!result) { + throw new Error(`[invokeFunction] unknown service '${id}'`); + } + return result; + } + }; + return fn(accessor, ...args); + } finally { + _done = true; + _trace.stop(); + } + } + createInstance(ctorOrDescriptor, ...rest) { + this._throwIfDisposed(); + let _trace; + let result; + if (ctorOrDescriptor instanceof SyncDescriptor) { + _trace = Trace.traceCreation(this._enableTracing, ctorOrDescriptor.ctor); + result = this._createInstance(ctorOrDescriptor.ctor, ctorOrDescriptor.staticArguments.concat(rest), _trace); + } else { + _trace = Trace.traceCreation(this._enableTracing, ctorOrDescriptor); + result = this._createInstance(ctorOrDescriptor, rest, _trace); + } + _trace.stop(); + return result; + } + _createInstance(ctor, args = [], _trace) { + const serviceDependencies = _util.getServiceDependencies(ctor).sort((a3, b) => a3.index - b.index); + const serviceArgs = []; + for (const dependency of serviceDependencies) { + const service = this._getOrCreateServiceInstance(dependency.id, _trace); + if (!service) { + this._throwIfStrict(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id}.`, false); + } + serviceArgs.push(service); + } + const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length; + if (args.length !== firstServiceArgPos) { + console.trace(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`); + const delta = firstServiceArgPos - args.length; + if (delta > 0) { + args = args.concat(new Array(delta)); + } else { + args = args.slice(0, firstServiceArgPos); + } + } + return Reflect.construct(ctor, args.concat(serviceArgs)); + } + _setCreatedServiceInstance(id, instance) { + if (this._services.get(id) instanceof SyncDescriptor) { + this._services.set(id, instance); + } else if (this._parent) { + this._parent._setCreatedServiceInstance(id, instance); + } else { + throw new Error("illegalState - setting UNKNOWN service instance"); + } + } + _getServiceInstanceOrDescriptor(id) { + const instanceOrDesc = this._services.get(id); + if (!instanceOrDesc && this._parent) { + return this._parent._getServiceInstanceOrDescriptor(id); + } else { + return instanceOrDesc; + } + } + _getOrCreateServiceInstance(id, _trace) { + if (this._globalGraph && this._globalGraphImplicitDependency) { + this._globalGraph.insertEdge(this._globalGraphImplicitDependency, String(id)); + } + const thing = this._getServiceInstanceOrDescriptor(id); + if (thing instanceof SyncDescriptor) { + return this._safeCreateAndCacheServiceInstance(id, thing, _trace.branch(id, true)); + } else { + _trace.branch(id, false); + return thing; + } + } + _safeCreateAndCacheServiceInstance(id, desc, _trace) { + if (this._activeInstantiations.has(id)) { + throw new Error(`illegal state - RECURSIVELY instantiating service '${id}'`); + } + this._activeInstantiations.add(id); + try { + return this._createAndCacheServiceInstance(id, desc, _trace); + } finally { + this._activeInstantiations.delete(id); + } + } + _createAndCacheServiceInstance(id, desc, _trace) { + var _a10; + const graph = new Graph((data) => data.id.toString()); + let cycleCount = 0; + const stack = [{ id, desc, _trace }]; + while (stack.length) { + const item = stack.pop(); + graph.lookupOrInsertNode(item); + if (cycleCount++ > 1e3) { + throw new CyclicDependencyError(graph); + } + for (const dependency of _util.getServiceDependencies(item.desc.ctor)) { + const instanceOrDesc = this._getServiceInstanceOrDescriptor(dependency.id); + if (!instanceOrDesc) { + this._throwIfStrict(`[createInstance] ${id} depends on ${dependency.id} which is NOT registered.`, true); + } + (_a10 = this._globalGraph) === null || _a10 === void 0 ? void 0 : _a10.insertEdge(String(item.id), String(dependency.id)); + if (instanceOrDesc instanceof SyncDescriptor) { + const d = { id: dependency.id, desc: instanceOrDesc, _trace: item._trace.branch(dependency.id, true) }; + graph.insertEdge(item, d); + stack.push(d); + } + } + } + while (true) { + const roots = graph.roots(); + if (roots.length === 0) { + if (!graph.isEmpty()) { + throw new CyclicDependencyError(graph); + } + break; + } + for (const { data } of roots) { + const instanceOrDesc = this._getServiceInstanceOrDescriptor(data.id); + if (instanceOrDesc instanceof SyncDescriptor) { + const instance = this._createServiceInstanceWithOwner(data.id, data.desc.ctor, data.desc.staticArguments, data.desc.supportsDelayedInstantiation, data._trace); + this._setCreatedServiceInstance(data.id, instance); + } + graph.removeNode(data); + } + } + return this._getServiceInstanceOrDescriptor(id); + } + _createServiceInstanceWithOwner(id, ctor, args = [], supportsDelayedInstantiation, _trace) { + if (this._services.get(id) instanceof SyncDescriptor) { + return this._createServiceInstance(id, ctor, args, supportsDelayedInstantiation, _trace, this._servicesToMaybeDispose); + } else if (this._parent) { + return this._parent._createServiceInstanceWithOwner(id, ctor, args, supportsDelayedInstantiation, _trace); + } else { + throw new Error(`illegalState - creating UNKNOWN service instance ${ctor.name}`); + } + } + _createServiceInstance(id, ctor, args = [], supportsDelayedInstantiation, _trace, disposeBucket) { + if (!supportsDelayedInstantiation) { + const result = this._createInstance(ctor, args, _trace); + disposeBucket.add(result); + return result; + } else { + const child = new _InstantiationService(void 0, this._strict, this, this._enableTracing); + child._globalGraphImplicitDependency = String(id); + const earlyListeners = /* @__PURE__ */ new Map(); + const idle = new GlobalIdleValue(() => { + const result = child._createInstance(ctor, args, _trace); + for (const [key, values2] of earlyListeners) { + const candidate = result[key]; + if (typeof candidate === "function") { + for (const value of values2) { + value.disposable = candidate.apply(result, value.listener); + } + } + } + earlyListeners.clear(); + disposeBucket.add(result); + return result; + }); + return new Proxy(/* @__PURE__ */ Object.create(null), { + get(target, key) { + if (!idle.isInitialized) { + if (typeof key === "string" && (key.startsWith("onDid") || key.startsWith("onWill"))) { + let list = earlyListeners.get(key); + if (!list) { + list = new LinkedList(); + earlyListeners.set(key, list); + } + const event = (callback, thisArg, disposables) => { + if (idle.isInitialized) { + return idle.value[key](callback, thisArg, disposables); + } else { + const entry = { listener: [callback, thisArg, disposables], disposable: void 0 }; + const rm = list.push(entry); + const result = toDisposable(() => { + var _a10; + rm(); + (_a10 = entry.disposable) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + }); + return result; + } + }; + return event; + } + } + if (key in target) { + return target[key]; + } + const obj = idle.value; + let prop = obj[key]; + if (typeof prop !== "function") { + return prop; + } + prop = prop.bind(obj); + target[key] = prop; + return prop; + }, + set(_target, p, value) { + idle.value[p] = value; + return true; + }, + getPrototypeOf(_target) { + return ctor.prototype; + } + }); + } + } + _throwIfStrict(msg, printWarning) { + if (printWarning) { + console.warn(msg); + } + if (this._strict) { + throw new Error(msg); + } + } + }; + Trace = class _Trace { + static traceInvocation(_enableTracing, ctor) { + return !_enableTracing ? _Trace._None : new _Trace(2, ctor.name || new Error().stack.split("\n").slice(3, 4).join("\n")); + } + static traceCreation(_enableTracing, ctor) { + return !_enableTracing ? _Trace._None : new _Trace(1, ctor.name); + } + constructor(type, name) { + this.type = type; + this.name = name; + this._start = Date.now(); + this._dep = []; + } + branch(id, first2) { + const child = new _Trace(3, id.toString()); + this._dep.push([id, first2, child]); + return child; + } + stop() { + const dur = Date.now() - this._start; + _Trace._totals += dur; + let causedCreation = false; + function printChild(n, trace) { + const res = []; + const prefix = new Array(n + 1).join(" "); + for (const [id, first2, child] of trace._dep) { + if (first2 && child) { + causedCreation = true; + res.push(`${prefix}CREATES -> ${id}`); + const nested = printChild(n + 1, child); + if (nested) { + res.push(nested); + } + } else { + res.push(`${prefix}uses -> ${id}`); + } + } + return res.join("\n"); + } + const lines = [ + `${this.type === 1 ? "CREATE" : "CALL"} ${this.name}`, + `${printChild(1, this)}`, + `DONE, took ${dur.toFixed(2)}ms (grand total ${_Trace._totals.toFixed(2)}ms)` + ]; + if (dur > 2 || causedCreation) { + _Trace.all.add(lines.join("\n")); + } + } + }; + Trace.all = /* @__PURE__ */ new Set(); + Trace._None = new class extends Trace { + constructor() { + super(0, null); + } + stop() { + } + branch() { + return this; + } + }(); + Trace._totals = 0; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/markers/common/markerService.js +var unsupportedSchemas, DoubleResourceMap, MarkerStats, MarkerService; +var init_markerService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/markers/common/markerService.js"() { + init_arrays(); + init_event(); + init_iterator(); + init_map(); + init_network(); + init_uri(); + init_markers(); + unsupportedSchemas = /* @__PURE__ */ new Set([ + Schemas.inMemory, + Schemas.vscodeSourceControl, + Schemas.walkThrough, + Schemas.walkThroughSnippet, + Schemas.vscodeChatCodeBlock, + Schemas.vscodeCopilotBackingChatCodeBlock + ]); + DoubleResourceMap = class { + constructor() { + this._byResource = new ResourceMap(); + this._byOwner = /* @__PURE__ */ new Map(); + } + set(resource, owner, value) { + let ownerMap = this._byResource.get(resource); + if (!ownerMap) { + ownerMap = /* @__PURE__ */ new Map(); + this._byResource.set(resource, ownerMap); + } + ownerMap.set(owner, value); + let resourceMap = this._byOwner.get(owner); + if (!resourceMap) { + resourceMap = new ResourceMap(); + this._byOwner.set(owner, resourceMap); + } + resourceMap.set(resource, value); + } + get(resource, owner) { + const ownerMap = this._byResource.get(resource); + return ownerMap === null || ownerMap === void 0 ? void 0 : ownerMap.get(owner); + } + delete(resource, owner) { + let removedA = false; + let removedB = false; + const ownerMap = this._byResource.get(resource); + if (ownerMap) { + removedA = ownerMap.delete(owner); + } + const resourceMap = this._byOwner.get(owner); + if (resourceMap) { + removedB = resourceMap.delete(resource); + } + if (removedA !== removedB) { + throw new Error("illegal state"); + } + return removedA && removedB; + } + values(key) { + var _a10, _b4, _c2, _d2; + if (typeof key === "string") { + return (_b4 = (_a10 = this._byOwner.get(key)) === null || _a10 === void 0 ? void 0 : _a10.values()) !== null && _b4 !== void 0 ? _b4 : Iterable.empty(); + } + if (URI.isUri(key)) { + return (_d2 = (_c2 = this._byResource.get(key)) === null || _c2 === void 0 ? void 0 : _c2.values()) !== null && _d2 !== void 0 ? _d2 : Iterable.empty(); + } + return Iterable.map(Iterable.concat(...this._byOwner.values()), (map) => map[1]); + } + }; + MarkerStats = class { + constructor(service) { + this.errors = 0; + this.infos = 0; + this.warnings = 0; + this.unknowns = 0; + this._data = new ResourceMap(); + this._service = service; + this._subscription = service.onMarkerChanged(this._update, this); + } + dispose() { + this._subscription.dispose(); + } + _update(resources) { + for (const resource of resources) { + const oldStats = this._data.get(resource); + if (oldStats) { + this._substract(oldStats); + } + const newStats = this._resourceStats(resource); + this._add(newStats); + this._data.set(resource, newStats); + } + } + _resourceStats(resource) { + const result = { errors: 0, warnings: 0, infos: 0, unknowns: 0 }; + if (unsupportedSchemas.has(resource.scheme)) { + return result; + } + for (const { severity } of this._service.read({ resource })) { + if (severity === MarkerSeverity2.Error) { + result.errors += 1; + } else if (severity === MarkerSeverity2.Warning) { + result.warnings += 1; + } else if (severity === MarkerSeverity2.Info) { + result.infos += 1; + } else { + result.unknowns += 1; + } + } + return result; + } + _substract(op) { + this.errors -= op.errors; + this.warnings -= op.warnings; + this.infos -= op.infos; + this.unknowns -= op.unknowns; + } + _add(op) { + this.errors += op.errors; + this.warnings += op.warnings; + this.infos += op.infos; + this.unknowns += op.unknowns; + } + }; + MarkerService = class _MarkerService { + constructor() { + this._onMarkerChanged = new DebounceEmitter({ + delay: 0, + merge: _MarkerService._merge + }); + this.onMarkerChanged = this._onMarkerChanged.event; + this._data = new DoubleResourceMap(); + this._stats = new MarkerStats(this); + } + dispose() { + this._stats.dispose(); + this._onMarkerChanged.dispose(); + } + remove(owner, resources) { + for (const resource of resources || []) { + this.changeOne(owner, resource, []); + } + } + changeOne(owner, resource, markerData) { + if (isFalsyOrEmpty(markerData)) { + const removed = this._data.delete(resource, owner); + if (removed) { + this._onMarkerChanged.fire([resource]); + } + } else { + const markers = []; + for (const data of markerData) { + const marker = _MarkerService._toMarker(owner, resource, data); + if (marker) { + markers.push(marker); + } + } + this._data.set(resource, owner, markers); + this._onMarkerChanged.fire([resource]); + } + } + static _toMarker(owner, resource, data) { + let { code, severity, message, source, startLineNumber, startColumn, endLineNumber, endColumn, relatedInformation, tags } = data; + if (!message) { + return void 0; + } + startLineNumber = startLineNumber > 0 ? startLineNumber : 1; + startColumn = startColumn > 0 ? startColumn : 1; + endLineNumber = endLineNumber >= startLineNumber ? endLineNumber : startLineNumber; + endColumn = endColumn > 0 ? endColumn : startColumn; + return { + resource, + owner, + code, + severity, + message, + source, + startLineNumber, + startColumn, + endLineNumber, + endColumn, + relatedInformation, + tags + }; + } + changeAll(owner, data) { + const changes = []; + const existing = this._data.values(owner); + if (existing) { + for (const data2 of existing) { + const first2 = Iterable.first(data2); + if (first2) { + changes.push(first2.resource); + this._data.delete(first2.resource, owner); + } + } + } + if (isNonEmptyArray(data)) { + const groups = new ResourceMap(); + for (const { resource, marker: markerData } of data) { + const marker = _MarkerService._toMarker(owner, resource, markerData); + if (!marker) { + continue; + } + const array2 = groups.get(resource); + if (!array2) { + groups.set(resource, [marker]); + changes.push(resource); + } else { + array2.push(marker); + } + } + for (const [resource, value] of groups) { + this._data.set(resource, owner, value); + } + } + if (changes.length > 0) { + this._onMarkerChanged.fire(changes); + } + } + read(filter = /* @__PURE__ */ Object.create(null)) { + let { owner, resource, severities, take } = filter; + if (!take || take < 0) { + take = -1; + } + if (owner && resource) { + const data = this._data.get(resource, owner); + if (!data) { + return []; + } else { + const result = []; + for (const marker of data) { + if (_MarkerService._accept(marker, severities)) { + const newLen = result.push(marker); + if (take > 0 && newLen === take) { + break; + } + } + } + return result; + } + } else if (!owner && !resource) { + const result = []; + for (const markers of this._data.values()) { + for (const data of markers) { + if (_MarkerService._accept(data, severities)) { + const newLen = result.push(data); + if (take > 0 && newLen === take) { + return result; + } + } + } + } + return result; + } else { + const iterable = this._data.values(resource !== null && resource !== void 0 ? resource : owner); + const result = []; + for (const markers of iterable) { + for (const data of markers) { + if (_MarkerService._accept(data, severities)) { + const newLen = result.push(data); + if (take > 0 && newLen === take) { + return result; + } + } + } + } + return result; + } + } + static _accept(marker, severities) { + return severities === void 0 || (severities & marker.severity) === marker.severity; + } + // --- event debounce logic + static _merge(all) { + const set = new ResourceMap(); + for (const array2 of all) { + for (const item of array2) { + set.set(item, true); + } + } + return Array.from(set.keys()); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/configuration/common/configurations.js +var DefaultConfiguration; +var init_configurations = __esm({ + "node_modules/monaco-editor/esm/vs/platform/configuration/common/configurations.js"() { + init_lifecycle(); + init_configurationModels(); + init_configurationRegistry(); + init_platform2(); + DefaultConfiguration = class extends Disposable { + get configurationModel() { + return this._configurationModel; + } + constructor(logService) { + super(); + this.logService = logService; + this._configurationModel = ConfigurationModel.createEmptyModel(this.logService); + } + reload() { + this.resetConfigurationModel(); + return this.configurationModel; + } + getConfigurationDefaultOverrides() { + return {}; + } + resetConfigurationModel() { + this._configurationModel = ConfigurationModel.createEmptyModel(this.logService); + const properties = Registry.as(Extensions4.Configuration).getConfigurationProperties(); + this.updateConfigurationModel(Object.keys(properties), properties); + } + updateConfigurationModel(properties, configurationProperties) { + const configurationDefaultsOverrides = this.getConfigurationDefaultOverrides(); + for (const key of properties) { + const defaultOverrideValue = configurationDefaultsOverrides[key]; + const propertySchema = configurationProperties[key]; + if (defaultOverrideValue !== void 0) { + this._configurationModel.addValue(key, defaultOverrideValue); + } else if (propertySchema) { + this._configurationModel.addValue(key, propertySchema.default); + } else { + this._configurationModel.removeValue(key); + } + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/accessibilitySignal/browser/accessibilitySignalService.js +var IAccessibilitySignalService, AcknowledgeDocCommentsToken, Sound, SoundSource, AccessibilitySignal; +var init_accessibilitySignalService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/accessibilitySignal/browser/accessibilitySignalService.js"() { + init_nls(); + init_instantiation(); + IAccessibilitySignalService = createDecorator("accessibilitySignalService"); + AcknowledgeDocCommentsToken = Symbol("AcknowledgeDocCommentsToken"); + Sound = class _Sound { + static register(options2) { + const sound = new _Sound(options2.fileName); + return sound; + } + constructor(fileName) { + this.fileName = fileName; + } + }; + Sound.error = Sound.register({ fileName: "error.mp3" }); + Sound.warning = Sound.register({ fileName: "warning.mp3" }); + Sound.success = Sound.register({ fileName: "success.mp3" }); + Sound.foldedArea = Sound.register({ fileName: "foldedAreas.mp3" }); + Sound.break = Sound.register({ fileName: "break.mp3" }); + Sound.quickFixes = Sound.register({ fileName: "quickFixes.mp3" }); + Sound.taskCompleted = Sound.register({ fileName: "taskCompleted.mp3" }); + Sound.taskFailed = Sound.register({ fileName: "taskFailed.mp3" }); + Sound.terminalBell = Sound.register({ fileName: "terminalBell.mp3" }); + Sound.diffLineInserted = Sound.register({ fileName: "diffLineInserted.mp3" }); + Sound.diffLineDeleted = Sound.register({ fileName: "diffLineDeleted.mp3" }); + Sound.diffLineModified = Sound.register({ fileName: "diffLineModified.mp3" }); + Sound.chatRequestSent = Sound.register({ fileName: "chatRequestSent.mp3" }); + Sound.chatResponseReceived1 = Sound.register({ fileName: "chatResponseReceived1.mp3" }); + Sound.chatResponseReceived2 = Sound.register({ fileName: "chatResponseReceived2.mp3" }); + Sound.chatResponseReceived3 = Sound.register({ fileName: "chatResponseReceived3.mp3" }); + Sound.chatResponseReceived4 = Sound.register({ fileName: "chatResponseReceived4.mp3" }); + Sound.clear = Sound.register({ fileName: "clear.mp3" }); + Sound.save = Sound.register({ fileName: "save.mp3" }); + Sound.format = Sound.register({ fileName: "format.mp3" }); + Sound.voiceRecordingStarted = Sound.register({ fileName: "voiceRecordingStarted.mp3" }); + Sound.voiceRecordingStopped = Sound.register({ fileName: "voiceRecordingStopped.mp3" }); + Sound.progress = Sound.register({ fileName: "progress.mp3" }); + SoundSource = class { + constructor(randomOneOf) { + this.randomOneOf = randomOneOf; + } + }; + AccessibilitySignal = class _AccessibilitySignal { + constructor(sound, name, legacySoundSettingsKey, settingsKey, legacyAnnouncementSettingsKey, announcementMessage, delaySettingsKey) { + this.sound = sound; + this.name = name; + this.legacySoundSettingsKey = legacySoundSettingsKey; + this.settingsKey = settingsKey; + this.legacyAnnouncementSettingsKey = legacyAnnouncementSettingsKey; + this.announcementMessage = announcementMessage; + this.delaySettingsKey = delaySettingsKey; + } + static register(options2) { + const soundSource = new SoundSource("randomOneOf" in options2.sound ? options2.sound.randomOneOf : [options2.sound]); + const signal = new _AccessibilitySignal(soundSource, options2.name, options2.legacySoundSettingsKey, options2.settingsKey, options2.legacyAnnouncementSettingsKey, options2.announcementMessage, options2.delaySettingsKey); + _AccessibilitySignal._signals.add(signal); + return signal; + } + }; + AccessibilitySignal._signals = /* @__PURE__ */ new Set(); + AccessibilitySignal.errorAtPosition = AccessibilitySignal.register({ + name: localize("accessibilitySignals.positionHasError.name", "Error at Position"), + sound: Sound.error, + announcementMessage: localize("accessibility.signals.positionHasError", "Error"), + settingsKey: "accessibility.signals.positionHasError", + delaySettingsKey: "accessibility.signalOptions.delays.errorAtPosition" + }); + AccessibilitySignal.warningAtPosition = AccessibilitySignal.register({ + name: localize("accessibilitySignals.positionHasWarning.name", "Warning at Position"), + sound: Sound.warning, + announcementMessage: localize("accessibility.signals.positionHasWarning", "Warning"), + settingsKey: "accessibility.signals.positionHasWarning", + delaySettingsKey: "accessibility.signalOptions.delays.warningAtPosition" + }); + AccessibilitySignal.errorOnLine = AccessibilitySignal.register({ + name: localize("accessibilitySignals.lineHasError.name", "Error on Line"), + sound: Sound.error, + legacySoundSettingsKey: "audioCues.lineHasError", + legacyAnnouncementSettingsKey: "accessibility.alert.error", + announcementMessage: localize("accessibility.signals.lineHasError", "Error on Line"), + settingsKey: "accessibility.signals.lineHasError" + }); + AccessibilitySignal.warningOnLine = AccessibilitySignal.register({ + name: localize("accessibilitySignals.lineHasWarning.name", "Warning on Line"), + sound: Sound.warning, + legacySoundSettingsKey: "audioCues.lineHasWarning", + legacyAnnouncementSettingsKey: "accessibility.alert.warning", + announcementMessage: localize("accessibility.signals.lineHasWarning", "Warning on Line"), + settingsKey: "accessibility.signals.lineHasWarning" + }); + AccessibilitySignal.foldedArea = AccessibilitySignal.register({ + name: localize("accessibilitySignals.lineHasFoldedArea.name", "Folded Area on Line"), + sound: Sound.foldedArea, + legacySoundSettingsKey: "audioCues.lineHasFoldedArea", + legacyAnnouncementSettingsKey: "accessibility.alert.foldedArea", + announcementMessage: localize("accessibility.signals.lineHasFoldedArea", "Folded"), + settingsKey: "accessibility.signals.lineHasFoldedArea" + }); + AccessibilitySignal.break = AccessibilitySignal.register({ + name: localize("accessibilitySignals.lineHasBreakpoint.name", "Breakpoint on Line"), + sound: Sound.break, + legacySoundSettingsKey: "audioCues.lineHasBreakpoint", + legacyAnnouncementSettingsKey: "accessibility.alert.breakpoint", + announcementMessage: localize("accessibility.signals.lineHasBreakpoint", "Breakpoint"), + settingsKey: "accessibility.signals.lineHasBreakpoint" + }); + AccessibilitySignal.inlineSuggestion = AccessibilitySignal.register({ + name: localize("accessibilitySignals.lineHasInlineSuggestion.name", "Inline Suggestion on Line"), + sound: Sound.quickFixes, + legacySoundSettingsKey: "audioCues.lineHasInlineSuggestion", + settingsKey: "accessibility.signals.lineHasInlineSuggestion" + }); + AccessibilitySignal.terminalQuickFix = AccessibilitySignal.register({ + name: localize("accessibilitySignals.terminalQuickFix.name", "Terminal Quick Fix"), + sound: Sound.quickFixes, + legacySoundSettingsKey: "audioCues.terminalQuickFix", + legacyAnnouncementSettingsKey: "accessibility.alert.terminalQuickFix", + announcementMessage: localize("accessibility.signals.terminalQuickFix", "Quick Fix"), + settingsKey: "accessibility.signals.terminalQuickFix" + }); + AccessibilitySignal.onDebugBreak = AccessibilitySignal.register({ + name: localize("accessibilitySignals.onDebugBreak.name", "Debugger Stopped on Breakpoint"), + sound: Sound.break, + legacySoundSettingsKey: "audioCues.onDebugBreak", + legacyAnnouncementSettingsKey: "accessibility.alert.onDebugBreak", + announcementMessage: localize("accessibility.signals.onDebugBreak", "Breakpoint"), + settingsKey: "accessibility.signals.onDebugBreak" + }); + AccessibilitySignal.noInlayHints = AccessibilitySignal.register({ + name: localize("accessibilitySignals.noInlayHints", "No Inlay Hints on Line"), + sound: Sound.error, + legacySoundSettingsKey: "audioCues.noInlayHints", + legacyAnnouncementSettingsKey: "accessibility.alert.noInlayHints", + announcementMessage: localize("accessibility.signals.noInlayHints", "No Inlay Hints"), + settingsKey: "accessibility.signals.noInlayHints" + }); + AccessibilitySignal.taskCompleted = AccessibilitySignal.register({ + name: localize("accessibilitySignals.taskCompleted", "Task Completed"), + sound: Sound.taskCompleted, + legacySoundSettingsKey: "audioCues.taskCompleted", + legacyAnnouncementSettingsKey: "accessibility.alert.taskCompleted", + announcementMessage: localize("accessibility.signals.taskCompleted", "Task Completed"), + settingsKey: "accessibility.signals.taskCompleted" + }); + AccessibilitySignal.taskFailed = AccessibilitySignal.register({ + name: localize("accessibilitySignals.taskFailed", "Task Failed"), + sound: Sound.taskFailed, + legacySoundSettingsKey: "audioCues.taskFailed", + legacyAnnouncementSettingsKey: "accessibility.alert.taskFailed", + announcementMessage: localize("accessibility.signals.taskFailed", "Task Failed"), + settingsKey: "accessibility.signals.taskFailed" + }); + AccessibilitySignal.terminalCommandFailed = AccessibilitySignal.register({ + name: localize("accessibilitySignals.terminalCommandFailed", "Terminal Command Failed"), + sound: Sound.error, + legacySoundSettingsKey: "audioCues.terminalCommandFailed", + legacyAnnouncementSettingsKey: "accessibility.alert.terminalCommandFailed", + announcementMessage: localize("accessibility.signals.terminalCommandFailed", "Command Failed"), + settingsKey: "accessibility.signals.terminalCommandFailed" + }); + AccessibilitySignal.terminalCommandSucceeded = AccessibilitySignal.register({ + name: localize("accessibilitySignals.terminalCommandSucceeded", "Terminal Command Succeeded"), + sound: Sound.success, + announcementMessage: localize("accessibility.signals.terminalCommandSucceeded", "Command Succeeded"), + settingsKey: "accessibility.signals.terminalCommandSucceeded" + }); + AccessibilitySignal.terminalBell = AccessibilitySignal.register({ + name: localize("accessibilitySignals.terminalBell", "Terminal Bell"), + sound: Sound.terminalBell, + legacySoundSettingsKey: "audioCues.terminalBell", + legacyAnnouncementSettingsKey: "accessibility.alert.terminalBell", + announcementMessage: localize("accessibility.signals.terminalBell", "Terminal Bell"), + settingsKey: "accessibility.signals.terminalBell" + }); + AccessibilitySignal.notebookCellCompleted = AccessibilitySignal.register({ + name: localize("accessibilitySignals.notebookCellCompleted", "Notebook Cell Completed"), + sound: Sound.taskCompleted, + legacySoundSettingsKey: "audioCues.notebookCellCompleted", + legacyAnnouncementSettingsKey: "accessibility.alert.notebookCellCompleted", + announcementMessage: localize("accessibility.signals.notebookCellCompleted", "Notebook Cell Completed"), + settingsKey: "accessibility.signals.notebookCellCompleted" + }); + AccessibilitySignal.notebookCellFailed = AccessibilitySignal.register({ + name: localize("accessibilitySignals.notebookCellFailed", "Notebook Cell Failed"), + sound: Sound.taskFailed, + legacySoundSettingsKey: "audioCues.notebookCellFailed", + legacyAnnouncementSettingsKey: "accessibility.alert.notebookCellFailed", + announcementMessage: localize("accessibility.signals.notebookCellFailed", "Notebook Cell Failed"), + settingsKey: "accessibility.signals.notebookCellFailed" + }); + AccessibilitySignal.diffLineInserted = AccessibilitySignal.register({ + name: localize("accessibilitySignals.diffLineInserted", "Diff Line Inserted"), + sound: Sound.diffLineInserted, + legacySoundSettingsKey: "audioCues.diffLineInserted", + settingsKey: "accessibility.signals.diffLineInserted" + }); + AccessibilitySignal.diffLineDeleted = AccessibilitySignal.register({ + name: localize("accessibilitySignals.diffLineDeleted", "Diff Line Deleted"), + sound: Sound.diffLineDeleted, + legacySoundSettingsKey: "audioCues.diffLineDeleted", + settingsKey: "accessibility.signals.diffLineDeleted" + }); + AccessibilitySignal.diffLineModified = AccessibilitySignal.register({ + name: localize("accessibilitySignals.diffLineModified", "Diff Line Modified"), + sound: Sound.diffLineModified, + legacySoundSettingsKey: "audioCues.diffLineModified", + settingsKey: "accessibility.signals.diffLineModified" + }); + AccessibilitySignal.chatRequestSent = AccessibilitySignal.register({ + name: localize("accessibilitySignals.chatRequestSent", "Chat Request Sent"), + sound: Sound.chatRequestSent, + legacySoundSettingsKey: "audioCues.chatRequestSent", + legacyAnnouncementSettingsKey: "accessibility.alert.chatRequestSent", + announcementMessage: localize("accessibility.signals.chatRequestSent", "Chat Request Sent"), + settingsKey: "accessibility.signals.chatRequestSent" + }); + AccessibilitySignal.chatResponseReceived = AccessibilitySignal.register({ + name: localize("accessibilitySignals.chatResponseReceived", "Chat Response Received"), + legacySoundSettingsKey: "audioCues.chatResponseReceived", + sound: { + randomOneOf: [ + Sound.chatResponseReceived1, + Sound.chatResponseReceived2, + Sound.chatResponseReceived3, + Sound.chatResponseReceived4 + ] + }, + settingsKey: "accessibility.signals.chatResponseReceived" + }); + AccessibilitySignal.progress = AccessibilitySignal.register({ + name: localize("accessibilitySignals.progress", "Progress"), + sound: Sound.progress, + legacySoundSettingsKey: "audioCues.chatResponsePending", + legacyAnnouncementSettingsKey: "accessibility.alert.progress", + announcementMessage: localize("accessibility.signals.progress", "Progress"), + settingsKey: "accessibility.signals.progress" + }); + AccessibilitySignal.clear = AccessibilitySignal.register({ + name: localize("accessibilitySignals.clear", "Clear"), + sound: Sound.clear, + legacySoundSettingsKey: "audioCues.clear", + legacyAnnouncementSettingsKey: "accessibility.alert.clear", + announcementMessage: localize("accessibility.signals.clear", "Clear"), + settingsKey: "accessibility.signals.clear" + }); + AccessibilitySignal.save = AccessibilitySignal.register({ + name: localize("accessibilitySignals.save", "Save"), + sound: Sound.save, + legacySoundSettingsKey: "audioCues.save", + legacyAnnouncementSettingsKey: "accessibility.alert.save", + announcementMessage: localize("accessibility.signals.save", "Save"), + settingsKey: "accessibility.signals.save" + }); + AccessibilitySignal.format = AccessibilitySignal.register({ + name: localize("accessibilitySignals.format", "Format"), + sound: Sound.format, + legacySoundSettingsKey: "audioCues.format", + legacyAnnouncementSettingsKey: "accessibility.alert.format", + announcementMessage: localize("accessibility.signals.format", "Format"), + settingsKey: "accessibility.signals.format" + }); + AccessibilitySignal.voiceRecordingStarted = AccessibilitySignal.register({ + name: localize("accessibilitySignals.voiceRecordingStarted", "Voice Recording Started"), + sound: Sound.voiceRecordingStarted, + legacySoundSettingsKey: "audioCues.voiceRecordingStarted", + settingsKey: "accessibility.signals.voiceRecordingStarted" + }); + AccessibilitySignal.voiceRecordingStopped = AccessibilitySignal.register({ + name: localize("accessibilitySignals.voiceRecordingStopped", "Voice Recording Stopped"), + sound: Sound.voiceRecordingStopped, + legacySoundSettingsKey: "audioCues.voiceRecordingStopped", + settingsKey: "accessibility.signals.voiceRecordingStopped" + }); + } +}); + +// node_modules/monaco-editor/esm/vs/platform/log/common/logService.js +var LogService; +var init_logService = __esm({ + "node_modules/monaco-editor/esm/vs/platform/log/common/logService.js"() { + init_lifecycle(); + init_log(); + LogService = class extends Disposable { + constructor(primaryLogger, otherLoggers = []) { + super(); + this.logger = new MultiplexLogger([primaryLogger, ...otherLoggers]); + this._register(primaryLogger.onDidChangeLogLevel((level) => this.setLevel(level))); + } + get onDidChangeLogLevel() { + return this.logger.onDidChangeLogLevel; + } + setLevel(level) { + this.logger.setLevel(level); + } + getLevel() { + return this.logger.getLevel(); + } + trace(message, ...args) { + this.logger.trace(message, ...args); + } + debug(message, ...args) { + this.logger.debug(message, ...args); + } + info(message, ...args) { + this.logger.info(message, ...args); + } + warn(message, ...args) { + this.logger.warn(message, ...args); + } + error(message, ...args) { + this.logger.error(message, ...args); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/editorFeatures.js +function registerEditorFeature(ctor) { + editorFeatures.push(ctor); +} +function getEditorFeatures() { + return editorFeatures.slice(0); +} +var editorFeatures; +var init_editorFeatures = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/editorFeatures.js"() { + editorFeatures = []; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/browser/standaloneServices.js +function isConfigurationOverrides(thing) { + return thing && typeof thing === "object" && (!thing.overrideIdentifier || typeof thing.overrideIdentifier === "string") && (!thing.resource || thing.resource instanceof URI); +} +function updateConfigurationService(configurationService, source, isDiffEditor2) { + if (!source) { + return; + } + if (!(configurationService instanceof StandaloneConfigurationService)) { + return; + } + const toUpdate = []; + Object.keys(source).forEach((key) => { + if (isEditorConfigurationKey(key)) { + toUpdate.push([`editor.${key}`, source[key]]); + } + if (isDiffEditor2 && isDiffEditorConfigurationKey(key)) { + toUpdate.push([`diffEditor.${key}`, source[key]]); + } + }); + if (toUpdate.length > 0) { + configurationService.updateValues(toUpdate); + } +} +var __decorate47, __param41, SimpleModel, StandaloneTextModelService, StandaloneEditorProgressService, StandaloneProgressService, StandaloneEnvironmentService, StandaloneDialogService, StandaloneNotificationService, StandaloneCommandService, StandaloneKeybindingService, DomNodeListeners, StandaloneConfigurationService, StandaloneResourceConfigurationService, StandaloneResourcePropertiesService, StandaloneTelemetryService, StandaloneWorkspaceContextService, StandaloneBulkEditService, StandaloneUriLabelService, StandaloneContextViewService, StandaloneWorkspaceTrustManagementService, StandaloneLanguageService, StandaloneLogService, StandaloneContextMenuService, StandaloneAccessbilitySignalService, StandaloneServices; +var init_standaloneServices = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/browser/standaloneServices.js"() { + init_languageConfigurationRegistry(); + init_standaloneCodeEditorService(); + init_standaloneLayoutService(); + init_undoRedoService(); + init_languageFeatureDebounce(); + init_semanticTokensStylingService(); + init_languageFeaturesService(); + init_hoverService(); + init_strings(); + init_dom(); + init_keyboardEvent(); + init_event(); + init_keybindings(); + init_lifecycle(); + init_platform(); + init_severity(); + init_uri(); + init_bulkEditService(); + init_editorConfigurationSchema(); + init_editOperation(); + init_position(); + init_range(); + init_model(); + init_resolverService(); + init_textResourceConfiguration(); + init_commands(); + init_configuration(); + init_configurationModels(); + init_contextkey(); + init_dialogs(); + init_instantiation(); + init_abstractKeybindingService(); + init_keybinding(); + init_keybindingResolver(); + init_keybindingsRegistry(); + init_resolvedKeybindingItem(); + init_usLayoutResolvedKeybinding(); + init_label(); + init_notification(); + init_progress(); + init_telemetry(); + init_workspace(); + init_layoutService(); + init_standaloneStrings(); + init_resources(); + init_codeEditorService(); + init_log(); + init_workspaceTrust(); + init_contextView(); + init_contextViewService(); + init_languageService(); + init_contextMenuService(); + init_extensions(); + init_openerService(); + init_editorWorker(); + init_editorWorkerService(); + init_language(); + init_markerDecorationsService(); + init_markerDecorations(); + init_modelService(); + init_standaloneQuickInputService(); + init_standaloneThemeService(); + init_standaloneTheme(); + init_accessibilityService(); + init_accessibility(); + init_actions2(); + init_menuService(); + init_clipboardService(); + init_clipboardService2(); + init_contextKeyService(); + init_descriptors(); + init_instantiationService(); + init_serviceCollection(); + init_listService(); + init_markers(); + init_markerService(); + init_opener(); + init_quickInput(); + init_storage2(); + init_configurations(); + init_accessibilitySignalService(); + init_logService(); + init_editorFeatures(); + init_errors(); + init_environment(); + init_window(); + init_map(); + __decorate47 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param41 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + SimpleModel = class { + constructor(model) { + this.disposed = false; + this.model = model; + this._onWillDispose = new Emitter(); + } + get textEditorModel() { + return this.model; + } + dispose() { + this.disposed = true; + this._onWillDispose.fire(); + } + }; + StandaloneTextModelService = class StandaloneTextModelService2 { + constructor(modelService) { + this.modelService = modelService; + } + createModelReference(resource) { + const model = this.modelService.getModel(resource); + if (!model) { + return Promise.reject(new Error(`Model not found`)); + } + return Promise.resolve(new ImmortalReference(new SimpleModel(model))); + } + }; + StandaloneTextModelService = __decorate47([ + __param41(0, IModelService) + ], StandaloneTextModelService); + StandaloneEditorProgressService = class _StandaloneEditorProgressService { + show() { + return _StandaloneEditorProgressService.NULL_PROGRESS_RUNNER; + } + showWhile(promise, delay) { + return __async(this, null, function* () { + yield promise; + }); + } + }; + StandaloneEditorProgressService.NULL_PROGRESS_RUNNER = { + done: () => { + }, + total: () => { + }, + worked: () => { + } + }; + StandaloneProgressService = class { + withProgress(_options, task, onDidCancel) { + return task({ + report: () => { + } + }); + } + }; + StandaloneEnvironmentService = class { + constructor() { + this.isExtensionDevelopment = false; + this.isBuilt = false; + } + }; + StandaloneDialogService = class { + confirm(confirmation) { + return __async(this, null, function* () { + const confirmed = this.doConfirm(confirmation.message, confirmation.detail); + return { + confirmed, + checkboxChecked: false + // unsupported + }; + }); + } + doConfirm(message, detail) { + let messageText = message; + if (detail) { + messageText = messageText + "\n\n" + detail; + } + return mainWindow.confirm(messageText); + } + prompt(prompt) { + return __async(this, null, function* () { + var _a10, _b4; + let result = void 0; + const confirmed = this.doConfirm(prompt.message, prompt.detail); + if (confirmed) { + const promptButtons = [...(_a10 = prompt.buttons) !== null && _a10 !== void 0 ? _a10 : []]; + if (prompt.cancelButton && typeof prompt.cancelButton !== "string" && typeof prompt.cancelButton !== "boolean") { + promptButtons.push(prompt.cancelButton); + } + result = yield (_b4 = promptButtons[0]) === null || _b4 === void 0 ? void 0 : _b4.run({ checkboxChecked: false }); + } + return { result }; + }); + } + error(message, detail) { + return __async(this, null, function* () { + yield this.prompt({ type: severity_default.Error, message, detail }); + }); + } + }; + StandaloneNotificationService = class _StandaloneNotificationService { + info(message) { + return this.notify({ severity: severity_default.Info, message }); + } + warn(message) { + return this.notify({ severity: severity_default.Warning, message }); + } + error(error) { + return this.notify({ severity: severity_default.Error, message: error }); + } + notify(notification) { + switch (notification.severity) { + case severity_default.Error: + console.error(notification.message); + break; + case severity_default.Warning: + console.warn(notification.message); + break; + default: + console.log(notification.message); + break; + } + return _StandaloneNotificationService.NO_OP; + } + prompt(severity, message, choices, options2) { + return _StandaloneNotificationService.NO_OP; + } + status(message, options2) { + return Disposable.None; + } + }; + StandaloneNotificationService.NO_OP = new NoOpNotification(); + StandaloneCommandService = class StandaloneCommandService2 { + constructor(instantiationService) { + this._onWillExecuteCommand = new Emitter(); + this._onDidExecuteCommand = new Emitter(); + this.onDidExecuteCommand = this._onDidExecuteCommand.event; + this._instantiationService = instantiationService; + } + executeCommand(id, ...args) { + const command = CommandsRegistry.getCommand(id); + if (!command) { + return Promise.reject(new Error(`command '${id}' not found`)); + } + try { + this._onWillExecuteCommand.fire({ commandId: id, args }); + const result = this._instantiationService.invokeFunction.apply(this._instantiationService, [command.handler, ...args]); + this._onDidExecuteCommand.fire({ commandId: id, args }); + return Promise.resolve(result); + } catch (err) { + return Promise.reject(err); + } + } + }; + StandaloneCommandService = __decorate47([ + __param41(0, IInstantiationService) + ], StandaloneCommandService); + StandaloneKeybindingService = class StandaloneKeybindingService2 extends AbstractKeybindingService { + constructor(contextKeyService, commandService, telemetryService, notificationService, logService, codeEditorService) { + super(contextKeyService, commandService, telemetryService, notificationService, logService); + this._cachedResolver = null; + this._dynamicKeybindings = []; + this._domNodeListeners = []; + const addContainer = (domNode) => { + const disposables = new DisposableStore(); + disposables.add(addDisposableListener(domNode, EventType.KEY_DOWN, (e) => { + const keyEvent = new StandardKeyboardEvent(e); + const shouldPreventDefault = this._dispatch(keyEvent, keyEvent.target); + if (shouldPreventDefault) { + keyEvent.preventDefault(); + keyEvent.stopPropagation(); + } + })); + disposables.add(addDisposableListener(domNode, EventType.KEY_UP, (e) => { + const keyEvent = new StandardKeyboardEvent(e); + const shouldPreventDefault = this._singleModifierDispatch(keyEvent, keyEvent.target); + if (shouldPreventDefault) { + keyEvent.preventDefault(); + } + })); + this._domNodeListeners.push(new DomNodeListeners(domNode, disposables)); + }; + const removeContainer = (domNode) => { + for (let i = 0; i < this._domNodeListeners.length; i++) { + const domNodeListeners = this._domNodeListeners[i]; + if (domNodeListeners.domNode === domNode) { + this._domNodeListeners.splice(i, 1); + domNodeListeners.dispose(); + } + } + }; + const addCodeEditor = (codeEditor) => { + if (codeEditor.getOption( + 61 + /* EditorOption.inDiffEditor */ + )) { + return; + } + addContainer(codeEditor.getContainerDomNode()); + }; + const removeCodeEditor = (codeEditor) => { + if (codeEditor.getOption( + 61 + /* EditorOption.inDiffEditor */ + )) { + return; + } + removeContainer(codeEditor.getContainerDomNode()); + }; + this._register(codeEditorService.onCodeEditorAdd(addCodeEditor)); + this._register(codeEditorService.onCodeEditorRemove(removeCodeEditor)); + codeEditorService.listCodeEditors().forEach(addCodeEditor); + const addDiffEditor = (diffEditor) => { + addContainer(diffEditor.getContainerDomNode()); + }; + const removeDiffEditor = (diffEditor) => { + removeContainer(diffEditor.getContainerDomNode()); + }; + this._register(codeEditorService.onDiffEditorAdd(addDiffEditor)); + this._register(codeEditorService.onDiffEditorRemove(removeDiffEditor)); + codeEditorService.listDiffEditors().forEach(addDiffEditor); + } + addDynamicKeybinding(command, keybinding, handler, when) { + return combinedDisposable(CommandsRegistry.registerCommand(command, handler), this.addDynamicKeybindings([{ + keybinding, + command, + when + }])); + } + addDynamicKeybindings(rules) { + const entries2 = rules.map((rule) => { + var _a10; + const keybinding = decodeKeybinding(rule.keybinding, OS); + return { + keybinding, + command: (_a10 = rule.command) !== null && _a10 !== void 0 ? _a10 : null, + commandArgs: rule.commandArgs, + when: rule.when, + weight1: 1e3, + weight2: 0, + extensionId: null, + isBuiltinExtension: false + }; + }); + this._dynamicKeybindings = this._dynamicKeybindings.concat(entries2); + this.updateResolver(); + return toDisposable(() => { + for (let i = 0; i < this._dynamicKeybindings.length; i++) { + if (this._dynamicKeybindings[i] === entries2[0]) { + this._dynamicKeybindings.splice(i, entries2.length); + this.updateResolver(); + return; + } + } + }); + } + updateResolver() { + this._cachedResolver = null; + this._onDidUpdateKeybindings.fire(); + } + _getResolver() { + if (!this._cachedResolver) { + const defaults = this._toNormalizedKeybindingItems(KeybindingsRegistry.getDefaultKeybindings(), true); + const overrides = this._toNormalizedKeybindingItems(this._dynamicKeybindings, false); + this._cachedResolver = new KeybindingResolver(defaults, overrides, (str) => this._log(str)); + } + return this._cachedResolver; + } + _documentHasFocus() { + return mainWindow.document.hasFocus(); + } + _toNormalizedKeybindingItems(items, isDefault) { + const result = []; + let resultLen = 0; + for (const item of items) { + const when = item.when || void 0; + const keybinding = item.keybinding; + if (!keybinding) { + result[resultLen++] = new ResolvedKeybindingItem(void 0, item.command, item.commandArgs, when, isDefault, null, false); + } else { + const resolvedKeybindings = USLayoutResolvedKeybinding.resolveKeybinding(keybinding, OS); + for (const resolvedKeybinding of resolvedKeybindings) { + result[resultLen++] = new ResolvedKeybindingItem(resolvedKeybinding, item.command, item.commandArgs, when, isDefault, null, false); + } + } + } + return result; + } + resolveKeyboardEvent(keyboardEvent) { + const chord = new KeyCodeChord(keyboardEvent.ctrlKey, keyboardEvent.shiftKey, keyboardEvent.altKey, keyboardEvent.metaKey, keyboardEvent.keyCode); + return new USLayoutResolvedKeybinding([chord], OS); + } + }; + StandaloneKeybindingService = __decorate47([ + __param41(0, IContextKeyService), + __param41(1, ICommandService), + __param41(2, ITelemetryService), + __param41(3, INotificationService), + __param41(4, ILogService), + __param41(5, ICodeEditorService) + ], StandaloneKeybindingService); + DomNodeListeners = class extends Disposable { + constructor(domNode, disposables) { + super(); + this.domNode = domNode; + this._register(disposables); + } + }; + StandaloneConfigurationService = class StandaloneConfigurationService2 { + constructor(logService) { + this.logService = logService; + this._onDidChangeConfiguration = new Emitter(); + this.onDidChangeConfiguration = this._onDidChangeConfiguration.event; + const defaultConfiguration = new DefaultConfiguration(logService); + this._configuration = new Configuration(defaultConfiguration.reload(), ConfigurationModel.createEmptyModel(logService), ConfigurationModel.createEmptyModel(logService), ConfigurationModel.createEmptyModel(logService), ConfigurationModel.createEmptyModel(logService), ConfigurationModel.createEmptyModel(logService), new ResourceMap(), ConfigurationModel.createEmptyModel(logService), new ResourceMap(), logService); + defaultConfiguration.dispose(); + } + getValue(arg1, arg2) { + const section = typeof arg1 === "string" ? arg1 : void 0; + const overrides = isConfigurationOverrides(arg1) ? arg1 : isConfigurationOverrides(arg2) ? arg2 : {}; + return this._configuration.getValue(section, overrides, void 0); + } + updateValues(values2) { + const previous = { data: this._configuration.toData() }; + const changedKeys = []; + for (const entry of values2) { + const [key, value] = entry; + if (this.getValue(key) === value) { + continue; + } + this._configuration.updateValue(key, value); + changedKeys.push(key); + } + if (changedKeys.length > 0) { + const configurationChangeEvent = new ConfigurationChangeEvent({ keys: changedKeys, overrides: [] }, previous, this._configuration, void 0, this.logService); + configurationChangeEvent.source = 8; + this._onDidChangeConfiguration.fire(configurationChangeEvent); + } + return Promise.resolve(); + } + updateValue(key, value, arg3, arg4) { + return this.updateValues([[key, value]]); + } + inspect(key, options2 = {}) { + return this._configuration.inspect(key, options2, void 0); + } + }; + StandaloneConfigurationService = __decorate47([ + __param41(0, ILogService) + ], StandaloneConfigurationService); + StandaloneResourceConfigurationService = class StandaloneResourceConfigurationService2 { + constructor(configurationService, modelService, languageService) { + this.configurationService = configurationService; + this.modelService = modelService; + this.languageService = languageService; + this._onDidChangeConfiguration = new Emitter(); + this.configurationService.onDidChangeConfiguration((e) => { + this._onDidChangeConfiguration.fire({ affectedKeys: e.affectedKeys, affectsConfiguration: (resource, configuration) => e.affectsConfiguration(configuration) }); + }); + } + getValue(resource, arg2, arg3) { + const position = Position.isIPosition(arg2) ? arg2 : null; + const section = position ? typeof arg3 === "string" ? arg3 : void 0 : typeof arg2 === "string" ? arg2 : void 0; + const language82 = resource ? this.getLanguage(resource, position) : void 0; + if (typeof section === "undefined") { + return this.configurationService.getValue({ + resource, + overrideIdentifier: language82 + }); + } + return this.configurationService.getValue(section, { + resource, + overrideIdentifier: language82 + }); + } + getLanguage(resource, position) { + const model = this.modelService.getModel(resource); + if (model) { + return position ? model.getLanguageIdAtPosition(position.lineNumber, position.column) : model.getLanguageId(); + } + return this.languageService.guessLanguageIdByFilepathOrFirstLine(resource); + } + }; + StandaloneResourceConfigurationService = __decorate47([ + __param41(0, IConfigurationService), + __param41(1, IModelService), + __param41(2, ILanguageService) + ], StandaloneResourceConfigurationService); + StandaloneResourcePropertiesService = class StandaloneResourcePropertiesService2 { + constructor(configurationService) { + this.configurationService = configurationService; + } + getEOL(resource, language82) { + const eol = this.configurationService.getValue("files.eol", { overrideIdentifier: language82, resource }); + if (eol && typeof eol === "string" && eol !== "auto") { + return eol; + } + return isLinux || isMacintosh ? "\n" : "\r\n"; + } + }; + StandaloneResourcePropertiesService = __decorate47([ + __param41(0, IConfigurationService) + ], StandaloneResourcePropertiesService); + StandaloneTelemetryService = class { + publicLog2() { + } + }; + StandaloneWorkspaceContextService = class _StandaloneWorkspaceContextService { + constructor() { + const resource = URI.from({ scheme: _StandaloneWorkspaceContextService.SCHEME, authority: "model", path: "/" }); + this.workspace = { id: STANDALONE_EDITOR_WORKSPACE_ID, folders: [new WorkspaceFolder({ uri: resource, name: "", index: 0 })] }; + } + getWorkspace() { + return this.workspace; + } + getWorkspaceFolder(resource) { + return resource && resource.scheme === _StandaloneWorkspaceContextService.SCHEME ? this.workspace.folders[0] : null; + } + }; + StandaloneWorkspaceContextService.SCHEME = "inmemory"; + StandaloneBulkEditService = class StandaloneBulkEditService2 { + constructor(_modelService) { + this._modelService = _modelService; + } + hasPreviewHandler() { + return false; + } + apply(editsIn, _options) { + return __async(this, null, function* () { + const edits = Array.isArray(editsIn) ? editsIn : ResourceEdit.convert(editsIn); + const textEdits = /* @__PURE__ */ new Map(); + for (const edit of edits) { + if (!(edit instanceof ResourceTextEdit)) { + throw new Error("bad edit - only text edits are supported"); + } + const model = this._modelService.getModel(edit.resource); + if (!model) { + throw new Error("bad edit - model not found"); + } + if (typeof edit.versionId === "number" && model.getVersionId() !== edit.versionId) { + throw new Error("bad state - model changed in the meantime"); + } + let array2 = textEdits.get(model); + if (!array2) { + array2 = []; + textEdits.set(model, array2); + } + array2.push(EditOperation.replaceMove(Range.lift(edit.textEdit.range), edit.textEdit.text)); + } + let totalEdits = 0; + let totalFiles = 0; + for (const [model, edits2] of textEdits) { + model.pushStackElement(); + model.pushEditOperations([], edits2, () => []); + model.pushStackElement(); + totalFiles += 1; + totalEdits += edits2.length; + } + return { + ariaSummary: format(StandaloneServicesNLS.bulkEditServiceSummary, totalEdits, totalFiles), + isApplied: totalEdits > 0 + }; + }); + } + }; + StandaloneBulkEditService = __decorate47([ + __param41(0, IModelService) + ], StandaloneBulkEditService); + StandaloneUriLabelService = class { + getUriLabel(resource, options2) { + if (resource.scheme === "file") { + return resource.fsPath; + } + return resource.path; + } + getUriBasenameLabel(resource) { + return basename2(resource); + } + }; + StandaloneContextViewService = class StandaloneContextViewService2 extends ContextViewService { + constructor(layoutService, _codeEditorService) { + super(layoutService); + this._codeEditorService = _codeEditorService; + } + showContextView(delegate, container, shadowRoot) { + if (!container) { + const codeEditor = this._codeEditorService.getFocusedCodeEditor() || this._codeEditorService.getActiveCodeEditor(); + if (codeEditor) { + container = codeEditor.getContainerDomNode(); + } + } + return super.showContextView(delegate, container, shadowRoot); + } + }; + StandaloneContextViewService = __decorate47([ + __param41(0, ILayoutService), + __param41(1, ICodeEditorService) + ], StandaloneContextViewService); + StandaloneWorkspaceTrustManagementService = class { + constructor() { + this._neverEmitter = new Emitter(); + this.onDidChangeTrust = this._neverEmitter.event; + } + isWorkspaceTrusted() { + return true; + } + }; + StandaloneLanguageService = class extends LanguageService { + constructor() { + super(); + } + }; + StandaloneLogService = class extends LogService { + constructor() { + super(new ConsoleLogger()); + } + }; + StandaloneContextMenuService = class StandaloneContextMenuService2 extends ContextMenuService { + constructor(telemetryService, notificationService, contextViewService, keybindingService, menuService, contextKeyService) { + super(telemetryService, notificationService, contextViewService, keybindingService, menuService, contextKeyService); + this.configure({ blockMouse: false }); + } + }; + StandaloneContextMenuService = __decorate47([ + __param41(0, ITelemetryService), + __param41(1, INotificationService), + __param41(2, IContextViewService), + __param41(3, IKeybindingService), + __param41(4, IMenuService), + __param41(5, IContextKeyService) + ], StandaloneContextMenuService); + StandaloneAccessbilitySignalService = class { + playSignal(cue, options2) { + return __async(this, null, function* () { + }); + } + }; + registerSingleton( + ILogService, + StandaloneLogService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IConfigurationService, + StandaloneConfigurationService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + ITextResourceConfigurationService, + StandaloneResourceConfigurationService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + ITextResourcePropertiesService, + StandaloneResourcePropertiesService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IWorkspaceContextService, + StandaloneWorkspaceContextService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + ILabelService, + StandaloneUriLabelService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + ITelemetryService, + StandaloneTelemetryService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IDialogService, + StandaloneDialogService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IEnvironmentService, + StandaloneEnvironmentService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + INotificationService, + StandaloneNotificationService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IMarkerService, + MarkerService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + ILanguageService, + StandaloneLanguageService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IStandaloneThemeService, + StandaloneThemeService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IModelService, + ModelService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IMarkerDecorationsService, + MarkerDecorationsService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IContextKeyService, + ContextKeyService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IProgressService, + StandaloneProgressService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IEditorProgressService, + StandaloneEditorProgressService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IStorageService, + InMemoryStorageService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IEditorWorkerService, + EditorWorkerService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IBulkEditService, + StandaloneBulkEditService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IWorkspaceTrustManagementService, + StandaloneWorkspaceTrustManagementService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + ITextModelService, + StandaloneTextModelService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IAccessibilityService, + AccessibilityService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IListService, + ListService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + ICommandService, + StandaloneCommandService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IKeybindingService, + StandaloneKeybindingService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IQuickInputService, + StandaloneQuickInputService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IContextViewService, + StandaloneContextViewService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IOpenerService, + OpenerService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IClipboardService, + BrowserClipboardService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IContextMenuService, + StandaloneContextMenuService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IMenuService, + MenuService, + 0 + /* InstantiationType.Eager */ + ); + registerSingleton( + IAccessibilitySignalService, + StandaloneAccessbilitySignalService, + 0 + /* InstantiationType.Eager */ + ); + (function(StandaloneServices2) { + const serviceCollection = new ServiceCollection(); + for (const [id, descriptor] of getSingletonServiceDescriptors()) { + serviceCollection.set(id, descriptor); + } + const instantiationService = new InstantiationService(serviceCollection, true); + serviceCollection.set(IInstantiationService, instantiationService); + function get(serviceId) { + if (!initialized2) { + initialize3({}); + } + const r = serviceCollection.get(serviceId); + if (!r) { + throw new Error("Missing service " + serviceId); + } + if (r instanceof SyncDescriptor) { + return instantiationService.invokeFunction((accessor) => accessor.get(serviceId)); + } else { + return r; + } + } + StandaloneServices2.get = get; + let initialized2 = false; + const onDidInitialize = new Emitter(); + function initialize3(overrides) { + if (initialized2) { + return instantiationService; + } + initialized2 = true; + for (const [id, descriptor] of getSingletonServiceDescriptors()) { + if (!serviceCollection.get(id)) { + serviceCollection.set(id, descriptor); + } + } + for (const serviceId in overrides) { + if (overrides.hasOwnProperty(serviceId)) { + const serviceIdentifier = createDecorator(serviceId); + const r = serviceCollection.get(serviceIdentifier); + if (r instanceof SyncDescriptor) { + serviceCollection.set(serviceIdentifier, overrides[serviceId]); + } + } + } + const editorFeatures2 = getEditorFeatures(); + for (const feature of editorFeatures2) { + try { + instantiationService.createInstance(feature); + } catch (err) { + onUnexpectedError(err); + } + } + onDidInitialize.fire(); + return instantiationService; + } + StandaloneServices2.initialize = initialize3; + function withServices(callback) { + if (initialized2) { + return callback(); + } + const disposable = new DisposableStore(); + const listener = disposable.add(onDidInitialize.event(() => { + listener.dispose(); + disposable.add(callback()); + })); + return disposable; + } + StandaloneServices2.withServices = withServices; + })(StandaloneServices || (StandaloneServices = {})); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/style.css +var init_style = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/style.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/stableEditorScroll.js +var StableEditorScrollState; +var init_stableEditorScroll = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/stableEditorScroll.js"() { + StableEditorScrollState = class _StableEditorScrollState { + static capture(editor2) { + if (editor2.getScrollTop() === 0 || editor2.hasPendingScrollAnimation()) { + return new _StableEditorScrollState(editor2.getScrollTop(), editor2.getContentHeight(), null, 0, null); + } + let visiblePosition = null; + let visiblePositionScrollDelta = 0; + const visibleRanges = editor2.getVisibleRanges(); + if (visibleRanges.length > 0) { + visiblePosition = visibleRanges[0].getStartPosition(); + const visiblePositionScrollTop = editor2.getTopForPosition(visiblePosition.lineNumber, visiblePosition.column); + visiblePositionScrollDelta = editor2.getScrollTop() - visiblePositionScrollTop; + } + return new _StableEditorScrollState(editor2.getScrollTop(), editor2.getContentHeight(), visiblePosition, visiblePositionScrollDelta, editor2.getPosition()); + } + constructor(_initialScrollTop, _initialContentHeight, _visiblePosition, _visiblePositionScrollDelta, _cursorPosition) { + this._initialScrollTop = _initialScrollTop; + this._initialContentHeight = _initialContentHeight; + this._visiblePosition = _visiblePosition; + this._visiblePositionScrollDelta = _visiblePositionScrollDelta; + this._cursorPosition = _cursorPosition; + } + restore(editor2) { + if (this._initialContentHeight === editor2.getContentHeight() && this._initialScrollTop === editor2.getScrollTop()) { + return; + } + if (this._visiblePosition) { + const visiblePositionScrollTop = editor2.getTopForPosition(this._visiblePosition.lineNumber, this._visiblePosition.column); + editor2.setScrollTop(visiblePositionScrollTop + this._visiblePositionScrollDelta); + } + } + restoreRelativeVerticalPositionOfCursor(editor2) { + if (this._initialContentHeight === editor2.getContentHeight() && this._initialScrollTop === editor2.getScrollTop()) { + return; + } + const currentCursorPosition = editor2.getPosition(); + if (!this._cursorPosition || !currentCursorPosition) { + return; + } + const offset = editor2.getTopForLineNumber(currentCursorPosition.lineNumber) - editor2.getTopForLineNumber(this._cursorPosition.lineNumber); + editor2.setScrollTop( + editor2.getScrollTop() + offset, + 1 + /* ScrollType.Immediate */ + ); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/common/hotReload.js +function isHotReloadEnabled() { + return env && !!env["VSCODE_DEV"]; +} +function registerHotReloadHandler(handler) { + if (!isHotReloadEnabled()) { + return { dispose() { + } }; + } else { + const handlers = registerGlobalHotReloadHandler(); + handlers.add(handler); + return { + dispose() { + handlers.delete(handler); + } + }; + } +} +function registerGlobalHotReloadHandler() { + if (!hotReloadHandlers) { + hotReloadHandlers = /* @__PURE__ */ new Set(); + } + const g = globalThis; + if (!g.$hotReload_applyNewExports) { + g.$hotReload_applyNewExports = (args) => { + const args2 = __spreadValues({ config: { mode: void 0 } }, args); + for (const h2 of hotReloadHandlers) { + const result = h2(args2); + if (result) { + return result; + } + } + return void 0; + }; + } + return hotReloadHandlers; +} +var hotReloadHandlers; +var init_hotReload = __esm({ + "node_modules/monaco-editor/esm/vs/base/common/hotReload.js"() { + init_process(); + hotReloadHandlers = void 0; + if (isHotReloadEnabled()) { + registerHotReloadHandler(({ oldExports, newSrc, config }) => { + if (config.mode !== "patch-prototype") { + return void 0; + } + return (newExports) => { + var _a10, _b4; + for (const key in newExports) { + const exportedItem = newExports[key]; + console.log(`[hot-reload] Patching prototype methods of '${key}'`, { exportedItem }); + if (typeof exportedItem === "function" && exportedItem.prototype) { + const oldExportedItem = oldExports[key]; + if (oldExportedItem) { + for (const prop of Object.getOwnPropertyNames(exportedItem.prototype)) { + const descriptor = Object.getOwnPropertyDescriptor(exportedItem.prototype, prop); + const oldDescriptor = Object.getOwnPropertyDescriptor(oldExportedItem.prototype, prop); + if (((_a10 = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value) === null || _a10 === void 0 ? void 0 : _a10.toString()) !== ((_b4 = oldDescriptor === null || oldDescriptor === void 0 ? void 0 : oldDescriptor.value) === null || _b4 === void 0 ? void 0 : _b4.toString())) { + console.log(`[hot-reload] Patching prototype method '${key}.${prop}'`); + } + Object.defineProperty(oldExportedItem.prototype, prop, descriptor); + } + newExports[key] = oldExportedItem; + } + } + } + return true; + }; + }); + } + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/utils.js +function joinCombine(arr1, arr2, keySelector, combine) { + if (arr1.length === 0) { + return arr2; + } + if (arr2.length === 0) { + return arr1; + } + const result = []; + let i = 0; + let j = 0; + while (i < arr1.length && j < arr2.length) { + const val1 = arr1[i]; + const val2 = arr2[j]; + const key1 = keySelector(val1); + const key2 = keySelector(val2); + if (key1 < key2) { + result.push(val1); + i++; + } else if (key1 > key2) { + result.push(val2); + j++; + } else { + result.push(combine(val1, val2)); + i++; + j++; + } + } + while (i < arr1.length) { + result.push(arr1[i]); + i++; + } + while (j < arr2.length) { + result.push(arr2[j]); + j++; + } + return result; +} +function applyObservableDecorations(editor2, decorations) { + const d = new DisposableStore(); + const decorationsCollection = editor2.createDecorationsCollection(); + d.add(autorunOpts({ debugName: () => `Apply decorations from ${decorations.debugName}` }, (reader) => { + const d2 = decorations.read(reader); + decorationsCollection.set(d2); + })); + d.add({ + dispose: () => { + decorationsCollection.clear(); + } + }); + return d; +} +function appendRemoveOnDispose(parent, child) { + parent.appendChild(child); + return toDisposable(() => { + parent.removeChild(child); + }); +} +function prependRemoveOnDispose(parent, child) { + parent.prepend(child); + return toDisposable(() => { + parent.removeChild(child); + }); +} +function animatedObservable(targetWindow, base, store) { + let targetVal = base.get(); + let startVal = targetVal; + let curVal = targetVal; + const result = observableValue("animatedValue", targetVal); + let animationStartMs = -1; + const durationMs = 300; + let animationFrame = void 0; + store.add(autorunHandleChanges({ + createEmptyChangeSummary: () => ({ animate: false }), + handleChange: (ctx, s) => { + if (ctx.didChange(base)) { + s.animate = s.animate || ctx.change; + } + return true; + } + }, (reader, s) => { + if (animationFrame !== void 0) { + targetWindow.cancelAnimationFrame(animationFrame); + animationFrame = void 0; + } + startVal = curVal; + targetVal = base.read(reader); + animationStartMs = Date.now() - (s.animate ? 0 : durationMs); + update(); + })); + function update() { + const passedMs = Date.now() - animationStartMs; + curVal = Math.floor(easeOutExpo(passedMs, startVal, targetVal - startVal, durationMs)); + if (passedMs < durationMs) { + animationFrame = targetWindow.requestAnimationFrame(update); + } else { + curVal = targetVal; + } + result.set(curVal, void 0); + } + return result; +} +function easeOutExpo(t4, b, c, d) { + return t4 === d ? b + c : c * (-Math.pow(2, -10 * t4 / d) + 1) + b; +} +function applyStyle(domNode, style) { + return autorun((reader) => { + for (let [key, val] of Object.entries(style)) { + if (val && typeof val === "object" && "read" in val) { + val = val.read(reader); + } + if (typeof val === "number") { + val = `${val}px`; + } + key = key.replace(/[A-Z]/g, (m) => "-" + m.toLowerCase()); + domNode.style[key] = val; + } + }); +} +function readHotReloadableExport(value, reader) { + observeHotReloadableExports([value], reader); + return value; +} +function observeHotReloadableExports(values2, reader) { + if (isHotReloadEnabled()) { + const o = observableSignalFromEvent("reload", (event) => registerHotReloadHandler(({ oldExports }) => { + if (![...Object.values(oldExports)].some((v) => values2.includes(v))) { + return void 0; + } + return (_newExports) => { + event(void 0); + return true; + }; + })); + o.read(reader); + } +} +function applyViewZones(editor2, viewZones, setIsUpdating, zoneIds) { + const store = new DisposableStore(); + const lastViewZoneIds = []; + store.add(autorunWithStore((reader, store2) => { + const curViewZones = viewZones.read(reader); + const viewZonIdsPerViewZone = /* @__PURE__ */ new Map(); + const viewZoneIdPerOnChangeObservable = /* @__PURE__ */ new Map(); + if (setIsUpdating) { + setIsUpdating(true); + } + editor2.changeViewZones((a3) => { + for (const id of lastViewZoneIds) { + a3.removeZone(id); + zoneIds === null || zoneIds === void 0 ? void 0 : zoneIds.delete(id); + } + lastViewZoneIds.length = 0; + for (const z of curViewZones) { + const id = a3.addZone(z); + if (z.setZoneId) { + z.setZoneId(id); + } + lastViewZoneIds.push(id); + zoneIds === null || zoneIds === void 0 ? void 0 : zoneIds.add(id); + viewZonIdsPerViewZone.set(z, id); + } + }); + if (setIsUpdating) { + setIsUpdating(false); + } + store2.add(autorunHandleChanges({ + createEmptyChangeSummary() { + return { zoneIds: [] }; + }, + handleChange(context, changeSummary) { + const id = viewZoneIdPerOnChangeObservable.get(context.changedObservable); + if (id !== void 0) { + changeSummary.zoneIds.push(id); + } + return true; + } + }, (reader2, changeSummary) => { + for (const vz of curViewZones) { + if (vz.onChange) { + viewZoneIdPerOnChangeObservable.set(vz.onChange, viewZonIdsPerViewZone.get(vz)); + vz.onChange.read(reader2); + } + } + if (setIsUpdating) { + setIsUpdating(true); + } + editor2.changeViewZones((a3) => { + for (const id of changeSummary.zoneIds) { + a3.layoutZone(id); + } + }); + if (setIsUpdating) { + setIsUpdating(false); + } + })); + })); + store.add({ + dispose() { + if (setIsUpdating) { + setIsUpdating(true); + } + editor2.changeViewZones((a3) => { + for (const id of lastViewZoneIds) { + a3.removeZone(id); + } + }); + zoneIds === null || zoneIds === void 0 ? void 0 : zoneIds.clear(); + if (setIsUpdating) { + setIsUpdating(false); + } + } + }); + return store; +} +function translatePosition(posInOriginal, mappings) { + const mapping = findLast(mappings, (m) => m.original.startLineNumber <= posInOriginal.lineNumber); + if (!mapping) { + return Range.fromPositions(posInOriginal); + } + if (mapping.original.endLineNumberExclusive <= posInOriginal.lineNumber) { + const newLineNumber = posInOriginal.lineNumber - mapping.original.endLineNumberExclusive + mapping.modified.endLineNumberExclusive; + return Range.fromPositions(new Position(newLineNumber, posInOriginal.column)); + } + if (!mapping.innerChanges) { + return Range.fromPositions(new Position(mapping.modified.startLineNumber, 1)); + } + const innerMapping = findLast(mapping.innerChanges, (m) => m.originalRange.getStartPosition().isBeforeOrEqual(posInOriginal)); + if (!innerMapping) { + const newLineNumber = posInOriginal.lineNumber - mapping.original.startLineNumber + mapping.modified.startLineNumber; + return Range.fromPositions(new Position(newLineNumber, posInOriginal.column)); + } + if (innerMapping.originalRange.containsPosition(posInOriginal)) { + return innerMapping.modifiedRange; + } else { + const l = lengthBetweenPositions(innerMapping.originalRange.getEndPosition(), posInOriginal); + return Range.fromPositions(l.addToPosition(innerMapping.modifiedRange.getEndPosition())); + } +} +function lengthBetweenPositions(position1, position2) { + if (position1.lineNumber === position2.lineNumber) { + return new TextLength(0, position2.column - position1.column); + } else { + return new TextLength(position2.lineNumber - position1.lineNumber, position2.column - 1); + } +} +function filterWithPrevious(arr, filter) { + let prev; + return arr.filter((cur) => { + const result = filter(cur, prev); + prev = cur; + return result; + }); +} +var ObservableElementSizeObserver, ViewZoneOverlayWidget, PlaceholderViewZone, ManagedOverlayWidget, DisposableCancellationTokenSource; +var init_utils4 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/utils.js"() { + init_arraysFind(); + init_cancellation(); + init_hotReload(); + init_lifecycle(); + init_observable(); + init_elementSizeObserver(); + init_position(); + init_range(); + init_textLength(); + ObservableElementSizeObserver = class extends Disposable { + get width() { + return this._width; + } + get height() { + return this._height; + } + get automaticLayout() { + return this._automaticLayout; + } + constructor(element, dimension) { + super(); + this._automaticLayout = false; + this.elementSizeObserver = this._register(new ElementSizeObserver(element, dimension)); + this._width = observableValue(this, this.elementSizeObserver.getWidth()); + this._height = observableValue(this, this.elementSizeObserver.getHeight()); + this._register(this.elementSizeObserver.onDidChange((e) => transaction((tx) => { + this._width.set(this.elementSizeObserver.getWidth(), tx); + this._height.set(this.elementSizeObserver.getHeight(), tx); + }))); + } + observe(dimension) { + this.elementSizeObserver.observe(dimension); + } + setAutomaticLayout(automaticLayout) { + this._automaticLayout = automaticLayout; + if (automaticLayout) { + this.elementSizeObserver.startObserving(); + } else { + this.elementSizeObserver.stopObserving(); + } + } + }; + ViewZoneOverlayWidget = class extends Disposable { + constructor(editor2, viewZone, htmlElement) { + super(); + this._register(new ManagedOverlayWidget(editor2, htmlElement)); + this._register(applyStyle(htmlElement, { + height: viewZone.actualHeight, + top: viewZone.actualTop + })); + } + }; + PlaceholderViewZone = class { + get afterLineNumber() { + return this._afterLineNumber.get(); + } + constructor(_afterLineNumber, heightInPx) { + this._afterLineNumber = _afterLineNumber; + this.heightInPx = heightInPx; + this.domNode = document.createElement("div"); + this._actualTop = observableValue(this, void 0); + this._actualHeight = observableValue(this, void 0); + this.actualTop = this._actualTop; + this.actualHeight = this._actualHeight; + this.showInHiddenAreas = true; + this.onChange = this._afterLineNumber; + this.onDomNodeTop = (top) => { + this._actualTop.set(top, void 0); + }; + this.onComputedHeight = (height) => { + this._actualHeight.set(height, void 0); + }; + } + }; + ManagedOverlayWidget = class _ManagedOverlayWidget { + constructor(_editor, _domElement) { + this._editor = _editor; + this._domElement = _domElement; + this._overlayWidgetId = `managedOverlayWidget-${_ManagedOverlayWidget._counter++}`; + this._overlayWidget = { + getId: () => this._overlayWidgetId, + getDomNode: () => this._domElement, + getPosition: () => null + }; + this._editor.addOverlayWidget(this._overlayWidget); + } + dispose() { + this._editor.removeOverlayWidget(this._overlayWidget); + } + }; + ManagedOverlayWidget._counter = 0; + DisposableCancellationTokenSource = class extends CancellationTokenSource { + dispose() { + super.dispose(true); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer.css +var init_accessibleDiffViewer = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer.js +function computeViewElementGroups(diffs, originalLineCount, modifiedLineCount) { + const result = []; + for (const g of groupAdjacentBy(diffs, (a3, b) => b.modified.startLineNumber - a3.modified.endLineNumberExclusive < 2 * viewElementGroupLineMargin)) { + const viewElements = []; + viewElements.push(new HeaderViewElement()); + const origFullRange = new LineRange(Math.max(1, g[0].original.startLineNumber - viewElementGroupLineMargin), Math.min(g[g.length - 1].original.endLineNumberExclusive + viewElementGroupLineMargin, originalLineCount + 1)); + const modifiedFullRange = new LineRange(Math.max(1, g[0].modified.startLineNumber - viewElementGroupLineMargin), Math.min(g[g.length - 1].modified.endLineNumberExclusive + viewElementGroupLineMargin, modifiedLineCount + 1)); + forEachAdjacent(g, (a3, b) => { + const origRange = new LineRange(a3 ? a3.original.endLineNumberExclusive : origFullRange.startLineNumber, b ? b.original.startLineNumber : origFullRange.endLineNumberExclusive); + const modifiedRange2 = new LineRange(a3 ? a3.modified.endLineNumberExclusive : modifiedFullRange.startLineNumber, b ? b.modified.startLineNumber : modifiedFullRange.endLineNumberExclusive); + origRange.forEach((origLineNumber) => { + viewElements.push(new UnchangedLineViewElement(origLineNumber, modifiedRange2.startLineNumber + (origLineNumber - origRange.startLineNumber))); + }); + if (b) { + b.original.forEach((origLineNumber) => { + viewElements.push(new DeletedLineViewElement(b, origLineNumber)); + }); + b.modified.forEach((modifiedLineNumber) => { + viewElements.push(new AddedLineViewElement(b, modifiedLineNumber)); + }); + } + }); + const modifiedRange = g[0].modified.join(g[g.length - 1].modified); + const originalRange = g[0].original.join(g[g.length - 1].original); + result.push(new ViewElementGroup(new LineRangeMapping(modifiedRange, originalRange), viewElements)); + } + return result; +} +var __decorate48, __param42, accessibleDiffViewerInsertIcon, accessibleDiffViewerRemoveIcon, accessibleDiffViewerCloseIcon, AccessibleDiffViewer, ViewModel2, viewElementGroupLineMargin, LineType, ViewElementGroup, HeaderViewElement, DeletedLineViewElement, AddedLineViewElement, UnchangedLineViewElement, View3, AccessibleDiffViewerModelFromEditors; +var init_accessibleDiffViewer2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer.js"() { + init_dom(); + init_trustedTypes(); + init_actionbar2(); + init_scrollableElement(); + init_actions(); + init_arrays(); + init_codicons(); + init_lifecycle(); + init_observable(); + init_themables(); + init_domFontInfo(); + init_utils4(); + init_editorOptions(); + init_lineRange(); + init_offsetRange(); + init_position(); + init_range(); + init_rangeMapping(); + init_language(); + init_lineTokens(); + init_viewLineRenderer(); + init_viewModel(); + init_nls(); + init_accessibilitySignalService(); + init_instantiation(); + init_iconRegistry(); + init_accessibleDiffViewer(); + __decorate48 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param42 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + accessibleDiffViewerInsertIcon = registerIcon("diff-review-insert", Codicon.add, localize("accessibleDiffViewerInsertIcon", "Icon for 'Insert' in accessible diff viewer.")); + accessibleDiffViewerRemoveIcon = registerIcon("diff-review-remove", Codicon.remove, localize("accessibleDiffViewerRemoveIcon", "Icon for 'Remove' in accessible diff viewer.")); + accessibleDiffViewerCloseIcon = registerIcon("diff-review-close", Codicon.close, localize("accessibleDiffViewerCloseIcon", "Icon for 'Close' in accessible diff viewer.")); + AccessibleDiffViewer = class AccessibleDiffViewer2 extends Disposable { + constructor(_parentNode, _visible, _setVisible, _canClose, _width, _height, _diffs, _models, _instantiationService) { + super(); + this._parentNode = _parentNode; + this._visible = _visible; + this._setVisible = _setVisible; + this._canClose = _canClose; + this._width = _width; + this._height = _height; + this._diffs = _diffs; + this._models = _models; + this._instantiationService = _instantiationService; + this._state = derivedWithStore(this, (reader, store) => { + const visible = this._visible.read(reader); + this._parentNode.style.visibility = visible ? "visible" : "hidden"; + if (!visible) { + return null; + } + const model = store.add(this._instantiationService.createInstance(ViewModel2, this._diffs, this._models, this._setVisible, this._canClose)); + const view = store.add(this._instantiationService.createInstance(View3, this._parentNode, model, this._width, this._height, this._models)); + return { model, view }; + }).recomputeInitiallyAndOnChange(this._store); + } + next() { + transaction((tx) => { + const isVisible = this._visible.get(); + this._setVisible(true, tx); + if (isVisible) { + this._state.get().model.nextGroup(tx); + } + }); + } + prev() { + transaction((tx) => { + this._setVisible(true, tx); + this._state.get().model.previousGroup(tx); + }); + } + close() { + transaction((tx) => { + this._setVisible(false, tx); + }); + } + }; + AccessibleDiffViewer._ttPolicy = createTrustedTypesPolicy("diffReview", { createHTML: (value) => value }); + AccessibleDiffViewer = __decorate48([ + __param42(8, IInstantiationService) + ], AccessibleDiffViewer); + ViewModel2 = class ViewModel3 extends Disposable { + constructor(_diffs, _models, _setVisible, canClose, _accessibilitySignalService) { + super(); + this._diffs = _diffs; + this._models = _models; + this._setVisible = _setVisible; + this.canClose = canClose; + this._accessibilitySignalService = _accessibilitySignalService; + this._groups = observableValue(this, []); + this._currentGroupIdx = observableValue(this, 0); + this._currentElementIdx = observableValue(this, 0); + this.groups = this._groups; + this.currentGroup = this._currentGroupIdx.map((idx, r) => this._groups.read(r)[idx]); + this.currentGroupIndex = this._currentGroupIdx; + this.currentElement = this._currentElementIdx.map((idx, r) => { + var _a10; + return (_a10 = this.currentGroup.read(r)) === null || _a10 === void 0 ? void 0 : _a10.lines[idx]; + }); + this._register(autorun((reader) => { + const diffs = this._diffs.read(reader); + if (!diffs) { + this._groups.set([], void 0); + return; + } + const groups = computeViewElementGroups(diffs, this._models.getOriginalModel().getLineCount(), this._models.getModifiedModel().getLineCount()); + transaction((tx) => { + const p = this._models.getModifiedPosition(); + if (p) { + const nextGroup = groups.findIndex((g) => (p === null || p === void 0 ? void 0 : p.lineNumber) < g.range.modified.endLineNumberExclusive); + if (nextGroup !== -1) { + this._currentGroupIdx.set(nextGroup, tx); + } + } + this._groups.set(groups, tx); + }); + })); + this._register(autorun((reader) => { + const currentViewItem = this.currentElement.read(reader); + if ((currentViewItem === null || currentViewItem === void 0 ? void 0 : currentViewItem.type) === LineType.Deleted) { + this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineDeleted, { source: "accessibleDiffViewer.currentElementChanged" }); + } else if ((currentViewItem === null || currentViewItem === void 0 ? void 0 : currentViewItem.type) === LineType.Added) { + this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineInserted, { source: "accessibleDiffViewer.currentElementChanged" }); + } + })); + this._register(autorun((reader) => { + var _a10; + const currentViewItem = this.currentElement.read(reader); + if (currentViewItem && currentViewItem.type !== LineType.Header) { + const lineNumber = (_a10 = currentViewItem.modifiedLineNumber) !== null && _a10 !== void 0 ? _a10 : currentViewItem.diff.modified.startLineNumber; + this._models.modifiedSetSelection(Range.fromPositions(new Position(lineNumber, 1))); + } + })); + } + _goToGroupDelta(delta, tx) { + const groups = this.groups.get(); + if (!groups || groups.length <= 1) { + return; + } + subtransaction(tx, (tx2) => { + this._currentGroupIdx.set(OffsetRange.ofLength(groups.length).clipCyclic(this._currentGroupIdx.get() + delta), tx2); + this._currentElementIdx.set(0, tx2); + }); + } + nextGroup(tx) { + this._goToGroupDelta(1, tx); + } + previousGroup(tx) { + this._goToGroupDelta(-1, tx); + } + _goToLineDelta(delta) { + const group = this.currentGroup.get(); + if (!group || group.lines.length <= 1) { + return; + } + transaction((tx) => { + this._currentElementIdx.set(OffsetRange.ofLength(group.lines.length).clip(this._currentElementIdx.get() + delta), tx); + }); + } + goToNextLine() { + this._goToLineDelta(1); + } + goToPreviousLine() { + this._goToLineDelta(-1); + } + goToLine(line) { + const group = this.currentGroup.get(); + if (!group) { + return; + } + const idx = group.lines.indexOf(line); + if (idx === -1) { + return; + } + transaction((tx) => { + this._currentElementIdx.set(idx, tx); + }); + } + revealCurrentElementInEditor() { + if (!this.canClose.get()) { + return; + } + this._setVisible(false, void 0); + const curElem = this.currentElement.get(); + if (curElem) { + if (curElem.type === LineType.Deleted) { + this._models.originalReveal(Range.fromPositions(new Position(curElem.originalLineNumber, 1))); + } else { + this._models.modifiedReveal(curElem.type !== LineType.Header ? Range.fromPositions(new Position(curElem.modifiedLineNumber, 1)) : void 0); + } + } + } + close() { + if (!this.canClose.get()) { + return; + } + this._setVisible(false, void 0); + this._models.modifiedFocus(); + } + }; + ViewModel2 = __decorate48([ + __param42(4, IAccessibilitySignalService) + ], ViewModel2); + viewElementGroupLineMargin = 3; + (function(LineType2) { + LineType2[LineType2["Header"] = 0] = "Header"; + LineType2[LineType2["Unchanged"] = 1] = "Unchanged"; + LineType2[LineType2["Deleted"] = 2] = "Deleted"; + LineType2[LineType2["Added"] = 3] = "Added"; + })(LineType || (LineType = {})); + ViewElementGroup = class { + constructor(range2, lines) { + this.range = range2; + this.lines = lines; + } + }; + HeaderViewElement = class { + constructor() { + this.type = LineType.Header; + } + }; + DeletedLineViewElement = class { + constructor(diff, originalLineNumber) { + this.diff = diff; + this.originalLineNumber = originalLineNumber; + this.type = LineType.Deleted; + this.modifiedLineNumber = void 0; + } + }; + AddedLineViewElement = class { + constructor(diff, modifiedLineNumber) { + this.diff = diff; + this.modifiedLineNumber = modifiedLineNumber; + this.type = LineType.Added; + this.originalLineNumber = void 0; + } + }; + UnchangedLineViewElement = class { + constructor(originalLineNumber, modifiedLineNumber) { + this.originalLineNumber = originalLineNumber; + this.modifiedLineNumber = modifiedLineNumber; + this.type = LineType.Unchanged; + } + }; + View3 = class View4 extends Disposable { + constructor(_element, _model, _width, _height, _models, _languageService) { + super(); + this._element = _element; + this._model = _model; + this._width = _width; + this._height = _height; + this._models = _models; + this._languageService = _languageService; + this.domNode = this._element; + this.domNode.className = "monaco-component diff-review monaco-editor-background"; + const actionBarContainer = document.createElement("div"); + actionBarContainer.className = "diff-review-actions"; + this._actionBar = this._register(new ActionBar(actionBarContainer)); + this._register(autorun((reader) => { + this._actionBar.clear(); + if (this._model.canClose.read(reader)) { + this._actionBar.push(new Action("diffreview.close", localize("label.close", "Close"), "close-diff-review " + ThemeIcon.asClassName(accessibleDiffViewerCloseIcon), true, () => __async(this, null, function* () { + return _model.close(); + })), { label: false, icon: true }); + } + })); + this._content = document.createElement("div"); + this._content.className = "diff-review-content"; + this._content.setAttribute("role", "code"); + this._scrollbar = this._register(new DomScrollableElement(this._content, {})); + reset(this.domNode, this._scrollbar.getDomNode(), actionBarContainer); + this._register(autorun((r) => { + this._height.read(r); + this._width.read(r); + this._scrollbar.scanDomNode(); + })); + this._register(toDisposable(() => { + reset(this.domNode); + })); + this._register(applyStyle(this.domNode, { width: this._width, height: this._height })); + this._register(applyStyle(this._content, { width: this._width, height: this._height })); + this._register(autorunWithStore((reader, store) => { + this._model.currentGroup.read(reader); + this._render(store); + })); + this._register(addStandardDisposableListener(this.domNode, "keydown", (e) => { + if (e.equals( + 18 + /* KeyCode.DownArrow */ + ) || e.equals( + 2048 | 18 + /* KeyCode.DownArrow */ + ) || e.equals( + 512 | 18 + /* KeyCode.DownArrow */ + )) { + e.preventDefault(); + this._model.goToNextLine(); + } + if (e.equals( + 16 + /* KeyCode.UpArrow */ + ) || e.equals( + 2048 | 16 + /* KeyCode.UpArrow */ + ) || e.equals( + 512 | 16 + /* KeyCode.UpArrow */ + )) { + e.preventDefault(); + this._model.goToPreviousLine(); + } + if (e.equals( + 9 + /* KeyCode.Escape */ + ) || e.equals( + 2048 | 9 + /* KeyCode.Escape */ + ) || e.equals( + 512 | 9 + /* KeyCode.Escape */ + ) || e.equals( + 1024 | 9 + /* KeyCode.Escape */ + )) { + e.preventDefault(); + this._model.close(); + } + if (e.equals( + 10 + /* KeyCode.Space */ + ) || e.equals( + 3 + /* KeyCode.Enter */ + )) { + e.preventDefault(); + this._model.revealCurrentElementInEditor(); + } + })); + } + _render(store) { + const originalOptions = this._models.getOriginalOptions(); + const modifiedOptions = this._models.getModifiedOptions(); + const container = document.createElement("div"); + container.className = "diff-review-table"; + container.setAttribute("role", "list"); + container.setAttribute("aria-label", localize("ariaLabel", "Accessible Diff Viewer. Use arrow up and down to navigate.")); + applyFontInfo(container, modifiedOptions.get( + 50 + /* EditorOption.fontInfo */ + )); + reset(this._content, container); + const originalModel = this._models.getOriginalModel(); + const modifiedModel = this._models.getModifiedModel(); + if (!originalModel || !modifiedModel) { + return; + } + const originalModelOpts = originalModel.getOptions(); + const modifiedModelOpts = modifiedModel.getOptions(); + const lineHeight = modifiedOptions.get( + 67 + /* EditorOption.lineHeight */ + ); + const group = this._model.currentGroup.get(); + for (const viewItem of (group === null || group === void 0 ? void 0 : group.lines) || []) { + if (!group) { + break; + } + let row; + if (viewItem.type === LineType.Header) { + const header = document.createElement("div"); + header.className = "diff-review-row"; + header.setAttribute("role", "listitem"); + const r = group.range; + const diffIndex = this._model.currentGroupIndex.get(); + const diffsLength = this._model.groups.get().length; + const getAriaLines = (lines) => lines === 0 ? localize("no_lines_changed", "no lines changed") : lines === 1 ? localize("one_line_changed", "1 line changed") : localize("more_lines_changed", "{0} lines changed", lines); + const originalChangedLinesCntAria = getAriaLines(r.original.length); + const modifiedChangedLinesCntAria = getAriaLines(r.modified.length); + header.setAttribute("aria-label", localize({ + key: "header", + comment: [ + "This is the ARIA label for a git diff header.", + "A git diff header looks like this: @@ -154,12 +159,39 @@.", + "That encodes that at original line 154 (which is now line 159), 12 lines were removed/changed with 39 lines.", + "Variables 0 and 1 refer to the diff index out of total number of diffs.", + "Variables 2 and 4 will be numbers (a line number).", + 'Variables 3 and 5 will be "no lines changed", "1 line changed" or "X lines changed", localized separately.' + ] + }, "Difference {0} of {1}: original line {2}, {3}, modified line {4}, {5}", diffIndex + 1, diffsLength, r.original.startLineNumber, originalChangedLinesCntAria, r.modified.startLineNumber, modifiedChangedLinesCntAria)); + const cell = document.createElement("div"); + cell.className = "diff-review-cell diff-review-summary"; + cell.appendChild(document.createTextNode(`${diffIndex + 1}/${diffsLength}: @@ -${r.original.startLineNumber},${r.original.length} +${r.modified.startLineNumber},${r.modified.length} @@`)); + header.appendChild(cell); + row = header; + } else { + row = this._createRow(viewItem, lineHeight, this._width.get(), originalOptions, originalModel, originalModelOpts, modifiedOptions, modifiedModel, modifiedModelOpts); + } + container.appendChild(row); + const isSelectedObs = derived((reader) => ( + /** @description isSelected */ + this._model.currentElement.read(reader) === viewItem + )); + store.add(autorun((reader) => { + const isSelected = isSelectedObs.read(reader); + row.tabIndex = isSelected ? 0 : -1; + if (isSelected) { + row.focus(); + } + })); + store.add(addDisposableListener(row, "focus", () => { + this._model.goToLine(viewItem); + })); + } + this._scrollbar.scanDomNode(); + } + _createRow(item, lineHeight, width2, originalOptions, originalModel, originalModelOpts, modifiedOptions, modifiedModel, modifiedModelOpts) { + const originalLayoutInfo = originalOptions.get( + 145 + /* EditorOption.layoutInfo */ + ); + const originalLineNumbersWidth = originalLayoutInfo.glyphMarginWidth + originalLayoutInfo.lineNumbersWidth; + const modifiedLayoutInfo = modifiedOptions.get( + 145 + /* EditorOption.layoutInfo */ + ); + const modifiedLineNumbersWidth = 10 + modifiedLayoutInfo.glyphMarginWidth + modifiedLayoutInfo.lineNumbersWidth; + let rowClassName = "diff-review-row"; + let lineNumbersExtraClassName = ""; + const spacerClassName = "diff-review-spacer"; + let spacerIcon = null; + switch (item.type) { + case LineType.Added: + rowClassName = "diff-review-row line-insert"; + lineNumbersExtraClassName = " char-insert"; + spacerIcon = accessibleDiffViewerInsertIcon; + break; + case LineType.Deleted: + rowClassName = "diff-review-row line-delete"; + lineNumbersExtraClassName = " char-delete"; + spacerIcon = accessibleDiffViewerRemoveIcon; + break; + } + const row = document.createElement("div"); + row.style.minWidth = width2 + "px"; + row.className = rowClassName; + row.setAttribute("role", "listitem"); + row.ariaLevel = ""; + const cell = document.createElement("div"); + cell.className = "diff-review-cell"; + cell.style.height = `${lineHeight}px`; + row.appendChild(cell); + const originalLineNumber = document.createElement("span"); + originalLineNumber.style.width = originalLineNumbersWidth + "px"; + originalLineNumber.style.minWidth = originalLineNumbersWidth + "px"; + originalLineNumber.className = "diff-review-line-number" + lineNumbersExtraClassName; + if (item.originalLineNumber !== void 0) { + originalLineNumber.appendChild(document.createTextNode(String(item.originalLineNumber))); + } else { + originalLineNumber.innerText = "\xA0"; + } + cell.appendChild(originalLineNumber); + const modifiedLineNumber = document.createElement("span"); + modifiedLineNumber.style.width = modifiedLineNumbersWidth + "px"; + modifiedLineNumber.style.minWidth = modifiedLineNumbersWidth + "px"; + modifiedLineNumber.style.paddingRight = "10px"; + modifiedLineNumber.className = "diff-review-line-number" + lineNumbersExtraClassName; + if (item.modifiedLineNumber !== void 0) { + modifiedLineNumber.appendChild(document.createTextNode(String(item.modifiedLineNumber))); + } else { + modifiedLineNumber.innerText = "\xA0"; + } + cell.appendChild(modifiedLineNumber); + const spacer = document.createElement("span"); + spacer.className = spacerClassName; + if (spacerIcon) { + const spacerCodicon = document.createElement("span"); + spacerCodicon.className = ThemeIcon.asClassName(spacerIcon); + spacerCodicon.innerText = "\xA0\xA0"; + spacer.appendChild(spacerCodicon); + } else { + spacer.innerText = "\xA0\xA0"; + } + cell.appendChild(spacer); + let lineContent; + if (item.modifiedLineNumber !== void 0) { + let html2 = this._getLineHtml(modifiedModel, modifiedOptions, modifiedModelOpts.tabSize, item.modifiedLineNumber, this._languageService.languageIdCodec); + if (AccessibleDiffViewer._ttPolicy) { + html2 = AccessibleDiffViewer._ttPolicy.createHTML(html2); + } + cell.insertAdjacentHTML("beforeend", html2); + lineContent = modifiedModel.getLineContent(item.modifiedLineNumber); + } else { + let html2 = this._getLineHtml(originalModel, originalOptions, originalModelOpts.tabSize, item.originalLineNumber, this._languageService.languageIdCodec); + if (AccessibleDiffViewer._ttPolicy) { + html2 = AccessibleDiffViewer._ttPolicy.createHTML(html2); + } + cell.insertAdjacentHTML("beforeend", html2); + lineContent = originalModel.getLineContent(item.originalLineNumber); + } + if (lineContent.length === 0) { + lineContent = localize("blankLine", "blank"); + } + let ariaLabel = ""; + switch (item.type) { + case LineType.Unchanged: + if (item.originalLineNumber === item.modifiedLineNumber) { + ariaLabel = localize({ key: "unchangedLine", comment: ["The placeholders are contents of the line and should not be translated."] }, "{0} unchanged line {1}", lineContent, item.originalLineNumber); + } else { + ariaLabel = localize("equalLine", "{0} original line {1} modified line {2}", lineContent, item.originalLineNumber, item.modifiedLineNumber); + } + break; + case LineType.Added: + ariaLabel = localize("insertLine", "+ {0} modified line {1}", lineContent, item.modifiedLineNumber); + break; + case LineType.Deleted: + ariaLabel = localize("deleteLine", "- {0} original line {1}", lineContent, item.originalLineNumber); + break; + } + row.setAttribute("aria-label", ariaLabel); + return row; + } + _getLineHtml(model, options2, tabSize, lineNumber, languageIdCodec) { + const lineContent = model.getLineContent(lineNumber); + const fontInfo = options2.get( + 50 + /* EditorOption.fontInfo */ + ); + const lineTokens = LineTokens.createEmpty(lineContent, languageIdCodec); + const isBasicASCII2 = ViewLineRenderingData.isBasicASCII(lineContent, model.mightContainNonBasicASCII()); + const containsRTL2 = ViewLineRenderingData.containsRTL(lineContent, isBasicASCII2, model.mightContainRTL()); + const r = renderViewLine2(new RenderLineInput(fontInfo.isMonospace && !options2.get( + 33 + /* EditorOption.disableMonospaceOptimizations */ + ), fontInfo.canUseHalfwidthRightwardsArrow, lineContent, false, isBasicASCII2, containsRTL2, 0, lineTokens, [], tabSize, 0, fontInfo.spaceWidth, fontInfo.middotWidth, fontInfo.wsmiddotWidth, options2.get( + 117 + /* EditorOption.stopRenderingLineAfter */ + ), options2.get( + 99 + /* EditorOption.renderWhitespace */ + ), options2.get( + 94 + /* EditorOption.renderControlCharacters */ + ), options2.get( + 51 + /* EditorOption.fontLigatures */ + ) !== EditorFontLigatures.OFF, null)); + return r.html; + } + }; + View3 = __decorate48([ + __param42(5, ILanguageService) + ], View3); + AccessibleDiffViewerModelFromEditors = class { + constructor(editors) { + this.editors = editors; + } + getOriginalModel() { + return this.editors.original.getModel(); + } + getOriginalOptions() { + return this.editors.original.getOptions(); + } + originalReveal(range2) { + this.editors.original.revealRange(range2); + this.editors.original.setSelection(range2); + this.editors.original.focus(); + } + getModifiedModel() { + return this.editors.modified.getModel(); + } + getModifiedOptions() { + return this.editors.modified.getOptions(); + } + modifiedReveal(range2) { + if (range2) { + this.editors.modified.revealRange(range2); + this.editors.modified.setSelection(range2); + } + this.editors.modified.focus(); + } + modifiedSetSelection(range2) { + this.editors.modified.setSelection(range2); + } + modifiedFocus() { + this.editors.modified.focus(); + } + getModifiedPosition() { + var _a10; + return (_a10 = this.editors.modified.getPosition()) !== null && _a10 !== void 0 ? _a10 : void 0; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature.js +var MovedBlocksLinesFeature, LinesLayout2, MovedBlockOverlayWidget; +var init_movedBlocksLinesFeature = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature.js"() { + init_dom(); + init_actionbar2(); + init_actions(); + init_arrays(); + init_arraysFind(); + init_codicons(); + init_lifecycle(); + init_observable(); + init_themables(); + init_utils4(); + init_offsetRange(); + init_nls(); + MovedBlocksLinesFeature = class _MovedBlocksLinesFeature extends Disposable { + constructor(_rootElement, _diffModel, _originalEditorLayoutInfo, _modifiedEditorLayoutInfo, _editors) { + super(); + this._rootElement = _rootElement; + this._diffModel = _diffModel; + this._originalEditorLayoutInfo = _originalEditorLayoutInfo; + this._modifiedEditorLayoutInfo = _modifiedEditorLayoutInfo; + this._editors = _editors; + this._originalScrollTop = observableFromEvent(this._editors.original.onDidScrollChange, () => this._editors.original.getScrollTop()); + this._modifiedScrollTop = observableFromEvent(this._editors.modified.onDidScrollChange, () => this._editors.modified.getScrollTop()); + this._viewZonesChanged = observableSignalFromEvent("onDidChangeViewZones", this._editors.modified.onDidChangeViewZones); + this.width = observableValue(this, 0); + this._modifiedViewZonesChangedSignal = observableSignalFromEvent("modified.onDidChangeViewZones", this._editors.modified.onDidChangeViewZones); + this._originalViewZonesChangedSignal = observableSignalFromEvent("original.onDidChangeViewZones", this._editors.original.onDidChangeViewZones); + this._state = derivedWithStore(this, (reader, store) => { + var _a10; + this._element.replaceChildren(); + const model = this._diffModel.read(reader); + const moves = (_a10 = model === null || model === void 0 ? void 0 : model.diff.read(reader)) === null || _a10 === void 0 ? void 0 : _a10.movedTexts; + if (!moves || moves.length === 0) { + this.width.set(0, void 0); + return; + } + this._viewZonesChanged.read(reader); + const infoOrig = this._originalEditorLayoutInfo.read(reader); + const infoMod = this._modifiedEditorLayoutInfo.read(reader); + if (!infoOrig || !infoMod) { + this.width.set(0, void 0); + return; + } + this._modifiedViewZonesChangedSignal.read(reader); + this._originalViewZonesChangedSignal.read(reader); + const lines = moves.map((move) => { + function computeLineStart(range2, editor2) { + const t1 = editor2.getTopForLineNumber(range2.startLineNumber, true); + const t22 = editor2.getTopForLineNumber(range2.endLineNumberExclusive, true); + return (t1 + t22) / 2; + } + const start = computeLineStart(move.lineRangeMapping.original, this._editors.original); + const startOffset = this._originalScrollTop.read(reader); + const end = computeLineStart(move.lineRangeMapping.modified, this._editors.modified); + const endOffset = this._modifiedScrollTop.read(reader); + const from = start - startOffset; + const to = end - endOffset; + const top = Math.min(start, end); + const bottom = Math.max(start, end); + return { range: new OffsetRange(top, bottom), from, to, fromWithoutScroll: start, toWithoutScroll: end, move }; + }); + lines.sort(tieBreakComparators(compareBy((l) => l.fromWithoutScroll > l.toWithoutScroll, booleanComparator), compareBy((l) => l.fromWithoutScroll > l.toWithoutScroll ? l.fromWithoutScroll : -l.toWithoutScroll, numberComparator))); + const layout2 = LinesLayout2.compute(lines.map((l) => l.range)); + const padding = 10; + const lineAreaLeft = infoOrig.verticalScrollbarWidth; + const lineAreaWidth = (layout2.getTrackCount() - 1) * 10 + padding * 2; + const width2 = lineAreaLeft + lineAreaWidth + (infoMod.contentLeft - _MovedBlocksLinesFeature.movedCodeBlockPadding); + let idx = 0; + for (const line of lines) { + const track = layout2.getTrack(idx); + const verticalY = lineAreaLeft + padding + track * 10; + const arrowHeight = 15; + const arrowWidth = 15; + const right = width2; + const rectWidth = infoMod.glyphMarginWidth + infoMod.lineNumbersWidth; + const rectHeight = 18; + const rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + rect.classList.add("arrow-rectangle"); + rect.setAttribute("x", `${right - rectWidth}`); + rect.setAttribute("y", `${line.to - rectHeight / 2}`); + rect.setAttribute("width", `${rectWidth}`); + rect.setAttribute("height", `${rectHeight}`); + this._element.appendChild(rect); + const g = document.createElementNS("http://www.w3.org/2000/svg", "g"); + const path = document.createElementNS("http://www.w3.org/2000/svg", "path"); + path.setAttribute("d", `M ${0} ${line.from} L ${verticalY} ${line.from} L ${verticalY} ${line.to} L ${right - arrowWidth} ${line.to}`); + path.setAttribute("fill", "none"); + g.appendChild(path); + const arrowRight = document.createElementNS("http://www.w3.org/2000/svg", "polygon"); + arrowRight.classList.add("arrow"); + store.add(autorun((reader2) => { + path.classList.toggle("currentMove", line.move === model.activeMovedText.read(reader2)); + arrowRight.classList.toggle("currentMove", line.move === model.activeMovedText.read(reader2)); + })); + arrowRight.setAttribute("points", `${right - arrowWidth},${line.to - arrowHeight / 2} ${right},${line.to} ${right - arrowWidth},${line.to + arrowHeight / 2}`); + g.appendChild(arrowRight); + this._element.appendChild(g); + idx++; + } + this.width.set(lineAreaWidth, void 0); + }); + this._element = document.createElementNS("http://www.w3.org/2000/svg", "svg"); + this._element.setAttribute("class", "moved-blocks-lines"); + this._rootElement.appendChild(this._element); + this._register(toDisposable(() => this._element.remove())); + this._register(autorun((reader) => { + const info = this._originalEditorLayoutInfo.read(reader); + const info2 = this._modifiedEditorLayoutInfo.read(reader); + if (!info || !info2) { + return; + } + this._element.style.left = `${info.width - info.verticalScrollbarWidth}px`; + this._element.style.height = `${info.height}px`; + this._element.style.width = `${info.verticalScrollbarWidth + info.contentLeft - _MovedBlocksLinesFeature.movedCodeBlockPadding + this.width.read(reader)}px`; + })); + this._register(recomputeInitiallyAndOnChange(this._state)); + const movedBlockViewZones = derived((reader) => { + const model = this._diffModel.read(reader); + const d = model === null || model === void 0 ? void 0 : model.diff.read(reader); + if (!d) { + return []; + } + return d.movedTexts.map((move) => ({ + move, + original: new PlaceholderViewZone(constObservable(move.lineRangeMapping.original.startLineNumber - 1), 18), + modified: new PlaceholderViewZone(constObservable(move.lineRangeMapping.modified.startLineNumber - 1), 18) + })); + }); + this._register(applyViewZones(this._editors.original, movedBlockViewZones.map((zones) => ( + /** @description movedBlockViewZones.original */ + zones.map((z) => z.original) + )))); + this._register(applyViewZones(this._editors.modified, movedBlockViewZones.map((zones) => ( + /** @description movedBlockViewZones.modified */ + zones.map((z) => z.modified) + )))); + this._register(autorunWithStore((reader, store) => { + const blocks = movedBlockViewZones.read(reader); + for (const b of blocks) { + store.add(new MovedBlockOverlayWidget(this._editors.original, b.original, b.move, "original", this._diffModel.get())); + store.add(new MovedBlockOverlayWidget(this._editors.modified, b.modified, b.move, "modified", this._diffModel.get())); + } + })); + const originalHasFocus = observableSignalFromEvent("original.onDidFocusEditorWidget", (e) => this._editors.original.onDidFocusEditorWidget(() => setTimeout(() => e(void 0), 0))); + const modifiedHasFocus = observableSignalFromEvent("modified.onDidFocusEditorWidget", (e) => this._editors.modified.onDidFocusEditorWidget(() => setTimeout(() => e(void 0), 0))); + let lastChangedEditor = "modified"; + this._register(autorunHandleChanges({ + createEmptyChangeSummary: () => void 0, + handleChange: (ctx, summary) => { + if (ctx.didChange(originalHasFocus)) { + lastChangedEditor = "original"; + } + if (ctx.didChange(modifiedHasFocus)) { + lastChangedEditor = "modified"; + } + return true; + } + }, (reader) => { + originalHasFocus.read(reader); + modifiedHasFocus.read(reader); + const m = this._diffModel.read(reader); + if (!m) { + return; + } + const diff = m.diff.read(reader); + let movedText = void 0; + if (diff && lastChangedEditor === "original") { + const originalPos = this._editors.originalCursor.read(reader); + if (originalPos) { + movedText = diff.movedTexts.find((m2) => m2.lineRangeMapping.original.contains(originalPos.lineNumber)); + } + } + if (diff && lastChangedEditor === "modified") { + const modifiedPos = this._editors.modifiedCursor.read(reader); + if (modifiedPos) { + movedText = diff.movedTexts.find((m2) => m2.lineRangeMapping.modified.contains(modifiedPos.lineNumber)); + } + } + if (movedText !== m.movedTextToCompare.get()) { + m.movedTextToCompare.set(void 0, void 0); + } + m.setActiveMovedText(movedText); + })); + } + }; + MovedBlocksLinesFeature.movedCodeBlockPadding = 4; + LinesLayout2 = class _LinesLayout { + static compute(lines) { + const setsPerTrack = []; + const trackPerLineIdx = []; + for (const line of lines) { + let trackIdx = setsPerTrack.findIndex((set) => !set.intersectsStrict(line)); + if (trackIdx === -1) { + const maxTrackCount = 6; + if (setsPerTrack.length >= maxTrackCount) { + trackIdx = findMaxIdx(setsPerTrack, compareBy((set) => set.intersectWithRangeLength(line), numberComparator)); + } else { + trackIdx = setsPerTrack.length; + setsPerTrack.push(new OffsetRangeSet()); + } + } + setsPerTrack[trackIdx].addRange(line); + trackPerLineIdx.push(trackIdx); + } + return new _LinesLayout(setsPerTrack.length, trackPerLineIdx); + } + constructor(_trackCount, trackPerLineIdx) { + this._trackCount = _trackCount; + this.trackPerLineIdx = trackPerLineIdx; + } + getTrack(lineIdx) { + return this.trackPerLineIdx[lineIdx]; + } + getTrackCount() { + return this._trackCount; + } + }; + MovedBlockOverlayWidget = class extends ViewZoneOverlayWidget { + constructor(_editor, _viewZone, _move, _kind, _diffModel) { + const root = h("div.diff-hidden-lines-widget"); + super(_editor, _viewZone, root.root); + this._editor = _editor; + this._move = _move; + this._kind = _kind; + this._diffModel = _diffModel; + this._nodes = h("div.diff-moved-code-block", { style: { marginRight: "4px" } }, [ + h("div.text-content@textContent"), + h("div.action-bar@actionBar") + ]); + root.root.appendChild(this._nodes.root); + const editorLayout = observableFromEvent(this._editor.onDidLayoutChange, () => this._editor.getLayoutInfo()); + this._register(applyStyle(this._nodes.root, { + paddingRight: editorLayout.map((l) => l.verticalScrollbarWidth) + })); + let text2; + if (_move.changes.length > 0) { + text2 = this._kind === "original" ? localize("codeMovedToWithChanges", "Code moved with changes to line {0}-{1}", this._move.lineRangeMapping.modified.startLineNumber, this._move.lineRangeMapping.modified.endLineNumberExclusive - 1) : localize("codeMovedFromWithChanges", "Code moved with changes from line {0}-{1}", this._move.lineRangeMapping.original.startLineNumber, this._move.lineRangeMapping.original.endLineNumberExclusive - 1); + } else { + text2 = this._kind === "original" ? localize("codeMovedTo", "Code moved to line {0}-{1}", this._move.lineRangeMapping.modified.startLineNumber, this._move.lineRangeMapping.modified.endLineNumberExclusive - 1) : localize("codeMovedFrom", "Code moved from line {0}-{1}", this._move.lineRangeMapping.original.startLineNumber, this._move.lineRangeMapping.original.endLineNumberExclusive - 1); + } + const actionBar = this._register(new ActionBar(this._nodes.actionBar, { + highlightToggledItems: true + })); + const caption = new Action("", text2, "", false); + actionBar.push(caption, { icon: false, label: true }); + const actionCompare = new Action("", "Compare", ThemeIcon.asClassName(Codicon.compareChanges), true, () => { + this._editor.focus(); + this._diffModel.movedTextToCompare.set(this._diffModel.movedTextToCompare.get() === _move ? void 0 : this._move, void 0); + }); + this._register(autorun((reader) => { + const isActive = this._diffModel.movedTextToCompare.read(reader) === _move; + actionCompare.checked = isActive; + })); + actionBar.push(actionCompare, { icon: false, label: true }); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/registrations.contribution.js +var diffMoveBorder, diffMoveBorderActive, diffEditorUnchangedRegionShadow, diffInsertIcon, diffRemoveIcon, diffLineAddDecorationBackgroundWithIndicator, diffLineDeleteDecorationBackgroundWithIndicator, diffLineAddDecorationBackground, diffLineDeleteDecorationBackground, diffAddDecoration, diffWholeLineAddDecoration, diffAddDecorationEmpty, diffDeleteDecoration, diffWholeLineDeleteDecoration, diffDeleteDecorationEmpty; +var init_registrations_contribution = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/registrations.contribution.js"() { + init_codicons(); + init_themables(); + init_textModel(); + init_nls(); + init_colorRegistry(); + init_iconRegistry(); + diffMoveBorder = registerColor("diffEditor.move.border", { dark: "#8b8b8b9c", light: "#8b8b8b9c", hcDark: "#8b8b8b9c", hcLight: "#8b8b8b9c" }, localize("diffEditor.move.border", "The border color for text that got moved in the diff editor.")); + diffMoveBorderActive = registerColor("diffEditor.moveActive.border", { dark: "#FFA500", light: "#FFA500", hcDark: "#FFA500", hcLight: "#FFA500" }, localize("diffEditor.moveActive.border", "The active border color for text that got moved in the diff editor.")); + diffEditorUnchangedRegionShadow = registerColor("diffEditor.unchangedRegionShadow", { dark: "#000000", light: "#737373BF", hcDark: "#000000", hcLight: "#737373BF" }, localize("diffEditor.unchangedRegionShadow", "The color of the shadow around unchanged region widgets.")); + diffInsertIcon = registerIcon("diff-insert", Codicon.add, localize("diffInsertIcon", "Line decoration for inserts in the diff editor.")); + diffRemoveIcon = registerIcon("diff-remove", Codicon.remove, localize("diffRemoveIcon", "Line decoration for removals in the diff editor.")); + diffLineAddDecorationBackgroundWithIndicator = ModelDecorationOptions.register({ + className: "line-insert", + description: "line-insert", + isWholeLine: true, + linesDecorationsClassName: "insert-sign " + ThemeIcon.asClassName(diffInsertIcon), + marginClassName: "gutter-insert" + }); + diffLineDeleteDecorationBackgroundWithIndicator = ModelDecorationOptions.register({ + className: "line-delete", + description: "line-delete", + isWholeLine: true, + linesDecorationsClassName: "delete-sign " + ThemeIcon.asClassName(diffRemoveIcon), + marginClassName: "gutter-delete" + }); + diffLineAddDecorationBackground = ModelDecorationOptions.register({ + className: "line-insert", + description: "line-insert", + isWholeLine: true, + marginClassName: "gutter-insert" + }); + diffLineDeleteDecorationBackground = ModelDecorationOptions.register({ + className: "line-delete", + description: "line-delete", + isWholeLine: true, + marginClassName: "gutter-delete" + }); + diffAddDecoration = ModelDecorationOptions.register({ + className: "char-insert", + description: "char-insert", + shouldFillLineOnLineBreak: true + }); + diffWholeLineAddDecoration = ModelDecorationOptions.register({ + className: "char-insert", + description: "char-insert", + isWholeLine: true + }); + diffAddDecorationEmpty = ModelDecorationOptions.register({ + className: "char-insert diff-range-empty", + description: "char-insert diff-range-empty" + }); + diffDeleteDecoration = ModelDecorationOptions.register({ + className: "char-delete", + description: "char-delete", + shouldFillLineOnLineBreak: true + }); + diffWholeLineDeleteDecoration = ModelDecorationOptions.register({ + className: "char-delete", + description: "char-delete", + isWholeLine: true + }); + diffDeleteDecorationEmpty = ModelDecorationOptions.register({ + className: "char-delete diff-range-empty", + description: "char-delete diff-range-empty" + }); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/diffEditorDecorations.js +var DiffEditorDecorations; +var init_diffEditorDecorations = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/diffEditorDecorations.js"() { + init_lifecycle(); + init_observable(); + init_movedBlocksLinesFeature(); + init_registrations_contribution(); + init_utils4(); + DiffEditorDecorations = class extends Disposable { + constructor(_editors, _diffModel, _options, widget) { + super(); + this._editors = _editors; + this._diffModel = _diffModel; + this._options = _options; + this._decorations = derived(this, (reader) => { + var _a10; + const diff = (_a10 = this._diffModel.read(reader)) === null || _a10 === void 0 ? void 0 : _a10.diff.read(reader); + if (!diff) { + return null; + } + const movedTextToCompare = this._diffModel.read(reader).movedTextToCompare.read(reader); + const renderIndicators = this._options.renderIndicators.read(reader); + const showEmptyDecorations = this._options.showEmptyDecorations.read(reader); + const originalDecorations = []; + const modifiedDecorations = []; + if (!movedTextToCompare) { + for (const m of diff.mappings) { + if (!m.lineRangeMapping.original.isEmpty) { + originalDecorations.push({ range: m.lineRangeMapping.original.toInclusiveRange(), options: renderIndicators ? diffLineDeleteDecorationBackgroundWithIndicator : diffLineDeleteDecorationBackground }); + } + if (!m.lineRangeMapping.modified.isEmpty) { + modifiedDecorations.push({ range: m.lineRangeMapping.modified.toInclusiveRange(), options: renderIndicators ? diffLineAddDecorationBackgroundWithIndicator : diffLineAddDecorationBackground }); + } + if (m.lineRangeMapping.modified.isEmpty || m.lineRangeMapping.original.isEmpty) { + if (!m.lineRangeMapping.original.isEmpty) { + originalDecorations.push({ range: m.lineRangeMapping.original.toInclusiveRange(), options: diffWholeLineDeleteDecoration }); + } + if (!m.lineRangeMapping.modified.isEmpty) { + modifiedDecorations.push({ range: m.lineRangeMapping.modified.toInclusiveRange(), options: diffWholeLineAddDecoration }); + } + } else { + for (const i of m.lineRangeMapping.innerChanges || []) { + if (m.lineRangeMapping.original.contains(i.originalRange.startLineNumber)) { + originalDecorations.push({ range: i.originalRange, options: i.originalRange.isEmpty() && showEmptyDecorations ? diffDeleteDecorationEmpty : diffDeleteDecoration }); + } + if (m.lineRangeMapping.modified.contains(i.modifiedRange.startLineNumber)) { + modifiedDecorations.push({ range: i.modifiedRange, options: i.modifiedRange.isEmpty() && showEmptyDecorations ? diffAddDecorationEmpty : diffAddDecoration }); + } + } + } + } + } + if (movedTextToCompare) { + for (const m of movedTextToCompare.changes) { + const fullRangeOriginal = m.original.toInclusiveRange(); + if (fullRangeOriginal) { + originalDecorations.push({ range: fullRangeOriginal, options: renderIndicators ? diffLineDeleteDecorationBackgroundWithIndicator : diffLineDeleteDecorationBackground }); + } + const fullRangeModified = m.modified.toInclusiveRange(); + if (fullRangeModified) { + modifiedDecorations.push({ range: fullRangeModified, options: renderIndicators ? diffLineAddDecorationBackgroundWithIndicator : diffLineAddDecorationBackground }); + } + for (const i of m.innerChanges || []) { + originalDecorations.push({ range: i.originalRange, options: diffDeleteDecoration }); + modifiedDecorations.push({ range: i.modifiedRange, options: diffAddDecoration }); + } + } + } + const activeMovedText = this._diffModel.read(reader).activeMovedText.read(reader); + for (const m of diff.movedTexts) { + originalDecorations.push({ + range: m.lineRangeMapping.original.toInclusiveRange(), + options: { + description: "moved", + blockClassName: "movedOriginal" + (m === activeMovedText ? " currentMove" : ""), + blockPadding: [MovedBlocksLinesFeature.movedCodeBlockPadding, 0, MovedBlocksLinesFeature.movedCodeBlockPadding, MovedBlocksLinesFeature.movedCodeBlockPadding] + } + }); + modifiedDecorations.push({ + range: m.lineRangeMapping.modified.toInclusiveRange(), + options: { + description: "moved", + blockClassName: "movedModified" + (m === activeMovedText ? " currentMove" : ""), + blockPadding: [4, 0, 4, 4] + } + }); + } + return { originalDecorations, modifiedDecorations }; + }); + this._register(applyObservableDecorations(this._editors.original, this._decorations.map((d) => (d === null || d === void 0 ? void 0 : d.originalDecorations) || []))); + this._register(applyObservableDecorations(this._editors.modified, this._decorations.map((d) => (d === null || d === void 0 ? void 0 : d.modifiedDecorations) || []))); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/diffEditorSash.js +var SashLayout, DiffEditorSash; +var init_diffEditorSash = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/diffEditorSash.js"() { + init_sash2(); + init_lifecycle(); + init_observable(); + init_derived(); + SashLayout = class { + resetSash() { + this._sashRatio.set(void 0, void 0); + } + constructor(_options, dimensions) { + this._options = _options; + this.dimensions = dimensions; + this.sashLeft = derivedWithSetter(this, (reader) => { + var _a10; + const ratio = (_a10 = this._sashRatio.read(reader)) !== null && _a10 !== void 0 ? _a10 : this._options.splitViewDefaultRatio.read(reader); + return this._computeSashLeft(ratio, reader); + }, (value, tx) => { + const contentWidth = this.dimensions.width.get(); + this._sashRatio.set(value / contentWidth, tx); + }); + this._sashRatio = observableValue(this, void 0); + } + /** @pure */ + _computeSashLeft(desiredRatio, reader) { + const contentWidth = this.dimensions.width.read(reader); + const midPoint = Math.floor(this._options.splitViewDefaultRatio.read(reader) * contentWidth); + const sashLeft = this._options.enableSplitViewResizing.read(reader) ? Math.floor(desiredRatio * contentWidth) : midPoint; + const MINIMUM_EDITOR_WIDTH = 100; + if (contentWidth <= MINIMUM_EDITOR_WIDTH * 2) { + return midPoint; + } + if (sashLeft < MINIMUM_EDITOR_WIDTH) { + return MINIMUM_EDITOR_WIDTH; + } + if (sashLeft > contentWidth - MINIMUM_EDITOR_WIDTH) { + return contentWidth - MINIMUM_EDITOR_WIDTH; + } + return sashLeft; + } + }; + DiffEditorSash = class extends Disposable { + constructor(_domNode, _dimensions, _enabled, _boundarySashes, sashLeft, _resetSash) { + super(); + this._domNode = _domNode; + this._dimensions = _dimensions; + this._enabled = _enabled; + this._boundarySashes = _boundarySashes; + this.sashLeft = sashLeft; + this._resetSash = _resetSash; + this._sash = this._register(new Sash(this._domNode, { + getVerticalSashTop: (_sash) => 0, + getVerticalSashLeft: (_sash) => this.sashLeft.get(), + getVerticalSashHeight: (_sash) => this._dimensions.height.get() + }, { + orientation: 0 + /* Orientation.VERTICAL */ + })); + this._startSashPosition = void 0; + this._register(this._sash.onDidStart(() => { + this._startSashPosition = this.sashLeft.get(); + })); + this._register(this._sash.onDidChange((e) => { + this.sashLeft.set(this._startSashPosition + (e.currentX - e.startX), void 0); + })); + this._register(this._sash.onDidEnd(() => this._sash.layout())); + this._register(this._sash.onDidReset(() => this._resetSash())); + this._register(autorun((reader) => { + const sashes = this._boundarySashes.read(reader); + if (sashes) { + this._sash.orthogonalEndSash = sashes.bottom; + } + })); + this._register(autorun((reader) => { + const enabled = this._enabled.read(reader); + this._sash.state = enabled ? 3 : 0; + this.sashLeft.read(reader); + this._dimensions.height.read(reader); + this._sash.layout(); + })); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/diffProviderFactoryService.js +var __decorate49, __param43, WorkerBasedDocumentDiffProvider_1, IDiffProviderFactoryService, WorkerBasedDiffProviderFactoryService, WorkerBasedDocumentDiffProvider; +var init_diffProviderFactoryService = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/diffProviderFactoryService.js"() { + init_extensions(); + init_instantiation(); + init_event(); + init_stopwatch(); + init_lineRange(); + init_rangeMapping(); + init_editorWorker(); + init_telemetry(); + __decorate49 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param43 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + IDiffProviderFactoryService = createDecorator("diffProviderFactoryService"); + WorkerBasedDiffProviderFactoryService = class WorkerBasedDiffProviderFactoryService2 { + constructor(instantiationService) { + this.instantiationService = instantiationService; + } + createDiffProvider(options2) { + return this.instantiationService.createInstance(WorkerBasedDocumentDiffProvider, options2); + } + }; + WorkerBasedDiffProviderFactoryService = __decorate49([ + __param43(0, IInstantiationService) + ], WorkerBasedDiffProviderFactoryService); + registerSingleton( + IDiffProviderFactoryService, + WorkerBasedDiffProviderFactoryService, + 1 + /* InstantiationType.Delayed */ + ); + WorkerBasedDocumentDiffProvider = WorkerBasedDocumentDiffProvider_1 = class WorkerBasedDocumentDiffProvider2 { + constructor(options2, editorWorkerService, telemetryService) { + this.editorWorkerService = editorWorkerService; + this.telemetryService = telemetryService; + this.onDidChangeEventEmitter = new Emitter(); + this.onDidChange = this.onDidChangeEventEmitter.event; + this.diffAlgorithm = "advanced"; + this.diffAlgorithmOnDidChangeSubscription = void 0; + this.setOptions(options2); + } + dispose() { + var _a10; + (_a10 = this.diffAlgorithmOnDidChangeSubscription) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + } + computeDiff(original, modified, options2, cancellationToken) { + return __async(this, null, function* () { + var _a10, _b4; + if (typeof this.diffAlgorithm !== "string") { + return this.diffAlgorithm.computeDiff(original, modified, options2, cancellationToken); + } + if (original.isDisposed() || modified.isDisposed()) { + return { + changes: [], + identical: true, + quitEarly: false, + moves: [] + }; + } + if (original.getLineCount() === 1 && original.getLineMaxColumn(1) === 1) { + if (modified.getLineCount() === 1 && modified.getLineMaxColumn(1) === 1) { + return { + changes: [], + identical: true, + quitEarly: false, + moves: [] + }; + } + return { + changes: [ + new DetailedLineRangeMapping(new LineRange(1, 2), new LineRange(1, modified.getLineCount() + 1), [ + new RangeMapping(original.getFullModelRange(), modified.getFullModelRange()) + ]) + ], + identical: false, + quitEarly: false, + moves: [] + }; + } + const uriKey = JSON.stringify([original.uri.toString(), modified.uri.toString()]); + const context = JSON.stringify([original.id, modified.id, original.getAlternativeVersionId(), modified.getAlternativeVersionId(), JSON.stringify(options2)]); + const c = WorkerBasedDocumentDiffProvider_1.diffCache.get(uriKey); + if (c && c.context === context) { + return c.result; + } + const sw = StopWatch.create(); + const result = yield this.editorWorkerService.computeDiff(original.uri, modified.uri, options2, this.diffAlgorithm); + const timeMs = sw.elapsed(); + this.telemetryService.publicLog2("diffEditor.computeDiff", { + timeMs, + timedOut: (_a10 = result === null || result === void 0 ? void 0 : result.quitEarly) !== null && _a10 !== void 0 ? _a10 : true, + detectedMoves: options2.computeMoves ? (_b4 = result === null || result === void 0 ? void 0 : result.moves.length) !== null && _b4 !== void 0 ? _b4 : 0 : -1 + }); + if (cancellationToken.isCancellationRequested) { + return { + changes: [], + identical: false, + quitEarly: true, + moves: [] + }; + } + if (!result) { + throw new Error("no diff result available"); + } + if (WorkerBasedDocumentDiffProvider_1.diffCache.size > 10) { + WorkerBasedDocumentDiffProvider_1.diffCache.delete(WorkerBasedDocumentDiffProvider_1.diffCache.keys().next().value); + } + WorkerBasedDocumentDiffProvider_1.diffCache.set(uriKey, { result, context }); + return result; + }); + } + setOptions(newOptions) { + var _a10; + let didChange = false; + if (newOptions.diffAlgorithm) { + if (this.diffAlgorithm !== newOptions.diffAlgorithm) { + (_a10 = this.diffAlgorithmOnDidChangeSubscription) === null || _a10 === void 0 ? void 0 : _a10.dispose(); + this.diffAlgorithmOnDidChangeSubscription = void 0; + this.diffAlgorithm = newOptions.diffAlgorithm; + if (typeof newOptions.diffAlgorithm !== "string") { + this.diffAlgorithmOnDidChangeSubscription = newOptions.diffAlgorithm.onDidChange(() => this.onDidChangeEventEmitter.fire()); + } + didChange = true; + } + } + if (didChange) { + this.onDidChangeEventEmitter.fire(); + } + } + }; + WorkerBasedDocumentDiffProvider.diffCache = /* @__PURE__ */ new Map(); + WorkerBasedDocumentDiffProvider = WorkerBasedDocumentDiffProvider_1 = __decorate49([ + __param43(1, IEditorWorkerService), + __param43(2, ITelemetryService) + ], WorkerBasedDocumentDiffProvider); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/diffEditorViewModel.js +function normalizeDocumentDiff(diff, original, modified) { + return { + changes: diff.changes.map((c) => new DetailedLineRangeMapping(c.original, c.modified, c.innerChanges ? c.innerChanges.map((i) => normalizeRangeMapping(i, original, modified)) : void 0)), + moves: diff.moves, + identical: diff.identical, + quitEarly: diff.quitEarly + }; +} +function normalizeRangeMapping(rangeMapping, original, modified) { + let originalRange = rangeMapping.originalRange; + let modifiedRange = rangeMapping.modifiedRange; + if ((originalRange.endColumn !== 1 || modifiedRange.endColumn !== 1) && originalRange.endColumn === original.getLineMaxColumn(originalRange.endLineNumber) && modifiedRange.endColumn === modified.getLineMaxColumn(modifiedRange.endLineNumber) && originalRange.endLineNumber < original.getLineCount() && modifiedRange.endLineNumber < modified.getLineCount()) { + originalRange = originalRange.setEndPosition(originalRange.endLineNumber + 1, 1); + modifiedRange = modifiedRange.setEndPosition(modifiedRange.endLineNumber + 1, 1); + } + return new RangeMapping(originalRange, modifiedRange); +} +function applyOriginalEdits(diff, textEdits, originalTextModel, modifiedTextModel) { + return void 0; +} +function applyModifiedEdits(diff, textEdits, originalTextModel, modifiedTextModel) { + return void 0; +} +var __decorate50, __param44, DiffEditorViewModel, DiffState, DiffMapping, UnchangedRegion; +var init_diffEditorViewModel = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/diffEditorViewModel.js"() { + init_async(); + init_cancellation(); + init_lifecycle(); + init_observable(); + init_diffProviderFactoryService(); + init_utils4(); + init_lineRange(); + init_defaultLinesDiffComputer(); + init_rangeMapping(); + init_beforeEditPositionMapper(); + init_combineTextEditInfos(); + init_heuristicSequenceOptimizations(); + init_types(); + init_arrays(); + init_assert(); + __decorate50 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param44 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + DiffEditorViewModel = class DiffEditorViewModel2 extends Disposable { + setActiveMovedText(movedText) { + this._activeMovedText.set(movedText, void 0); + } + constructor(model, _options, _diffProviderFactoryService) { + super(); + this.model = model; + this._options = _options; + this._diffProviderFactoryService = _diffProviderFactoryService; + this._isDiffUpToDate = observableValue(this, false); + this.isDiffUpToDate = this._isDiffUpToDate; + this._diff = observableValue(this, void 0); + this.diff = this._diff; + this._unchangedRegions = observableValue(this, void 0); + this.unchangedRegions = derived(this, (r) => { + var _a10, _b4; + if (this._options.hideUnchangedRegions.read(r)) { + return (_b4 = (_a10 = this._unchangedRegions.read(r)) === null || _a10 === void 0 ? void 0 : _a10.regions) !== null && _b4 !== void 0 ? _b4 : []; + } else { + transaction((tx) => { + var _a11; + for (const r2 of ((_a11 = this._unchangedRegions.get()) === null || _a11 === void 0 ? void 0 : _a11.regions) || []) { + r2.collapseAll(tx); + } + }); + return []; + } + }); + this.movedTextToCompare = observableValue(this, void 0); + this._activeMovedText = observableValue(this, void 0); + this._hoveredMovedText = observableValue(this, void 0); + this.activeMovedText = derived(this, (r) => { + var _a10, _b4; + return (_b4 = (_a10 = this.movedTextToCompare.read(r)) !== null && _a10 !== void 0 ? _a10 : this._hoveredMovedText.read(r)) !== null && _b4 !== void 0 ? _b4 : this._activeMovedText.read(r); + }); + this._cancellationTokenSource = new CancellationTokenSource(); + this._diffProvider = derived(this, (reader) => { + const diffProvider = this._diffProviderFactoryService.createDiffProvider({ + diffAlgorithm: this._options.diffAlgorithm.read(reader) + }); + const onChangeSignal = observableSignalFromEvent("onDidChange", diffProvider.onDidChange); + return { + diffProvider, + onChangeSignal + }; + }); + this._register(toDisposable(() => this._cancellationTokenSource.cancel())); + const contentChangedSignal = observableSignal("contentChangedSignal"); + const debouncer = this._register(new RunOnceScheduler(() => contentChangedSignal.trigger(void 0), 200)); + this._register(autorun((reader) => { + const lastUnchangedRegions = this._unchangedRegions.read(reader); + if (!lastUnchangedRegions || lastUnchangedRegions.regions.some((r) => r.isDragged.read(reader))) { + return; + } + const lastUnchangedRegionsOrigRanges = lastUnchangedRegions.originalDecorationIds.map((id) => model.original.getDecorationRange(id)).map((r) => r ? LineRange.fromRangeInclusive(r) : void 0); + const lastUnchangedRegionsModRanges = lastUnchangedRegions.modifiedDecorationIds.map((id) => model.modified.getDecorationRange(id)).map((r) => r ? LineRange.fromRangeInclusive(r) : void 0); + const updatedLastUnchangedRegions = lastUnchangedRegions.regions.map((r, idx) => !lastUnchangedRegionsOrigRanges[idx] || !lastUnchangedRegionsModRanges[idx] ? void 0 : new UnchangedRegion(lastUnchangedRegionsOrigRanges[idx].startLineNumber, lastUnchangedRegionsModRanges[idx].startLineNumber, lastUnchangedRegionsOrigRanges[idx].length, r.visibleLineCountTop.read(reader), r.visibleLineCountBottom.read(reader))).filter(isDefined); + const newRanges = []; + let didChange = false; + for (const touching of groupAdjacentBy(updatedLastUnchangedRegions, (a3, b) => a3.getHiddenModifiedRange(reader).endLineNumberExclusive === b.getHiddenModifiedRange(reader).startLineNumber)) { + if (touching.length > 1) { + didChange = true; + const sumLineCount = touching.reduce((sum, r2) => sum + r2.lineCount, 0); + const r = new UnchangedRegion(touching[0].originalLineNumber, touching[0].modifiedLineNumber, sumLineCount, touching[0].visibleLineCountTop.get(), touching[touching.length - 1].visibleLineCountBottom.get()); + newRanges.push(r); + } else { + newRanges.push(touching[0]); + } + } + if (didChange) { + const originalDecorationIds = model.original.deltaDecorations(lastUnchangedRegions.originalDecorationIds, newRanges.map((r) => ({ range: r.originalUnchangedRange.toInclusiveRange(), options: { description: "unchanged" } }))); + const modifiedDecorationIds = model.modified.deltaDecorations(lastUnchangedRegions.modifiedDecorationIds, newRanges.map((r) => ({ range: r.modifiedUnchangedRange.toInclusiveRange(), options: { description: "unchanged" } }))); + transaction((tx) => { + this._unchangedRegions.set({ + regions: newRanges, + originalDecorationIds, + modifiedDecorationIds + }, tx); + }); + } + })); + const updateUnchangedRegions = (result, tx, reader) => { + const newUnchangedRegions = UnchangedRegion.fromDiffs(result.changes, model.original.getLineCount(), model.modified.getLineCount(), this._options.hideUnchangedRegionsMinimumLineCount.read(reader), this._options.hideUnchangedRegionsContextLineCount.read(reader)); + let visibleRegions = void 0; + const lastUnchangedRegions = this._unchangedRegions.get(); + if (lastUnchangedRegions) { + const lastUnchangedRegionsOrigRanges = lastUnchangedRegions.originalDecorationIds.map((id) => model.original.getDecorationRange(id)).map((r) => r ? LineRange.fromRangeInclusive(r) : void 0); + const lastUnchangedRegionsModRanges = lastUnchangedRegions.modifiedDecorationIds.map((id) => model.modified.getDecorationRange(id)).map((r) => r ? LineRange.fromRangeInclusive(r) : void 0); + const updatedLastUnchangedRegions = filterWithPrevious(lastUnchangedRegions.regions.map((r, idx) => { + if (!lastUnchangedRegionsOrigRanges[idx] || !lastUnchangedRegionsModRanges[idx]) { + return void 0; + } + const length = lastUnchangedRegionsOrigRanges[idx].length; + return new UnchangedRegion( + lastUnchangedRegionsOrigRanges[idx].startLineNumber, + lastUnchangedRegionsModRanges[idx].startLineNumber, + length, + // The visible area can shrink by edits -> we have to account for this + Math.min(r.visibleLineCountTop.get(), length), + Math.min(r.visibleLineCountBottom.get(), length - r.visibleLineCountTop.get()) + ); + }).filter(isDefined), (cur, prev) => !prev || cur.modifiedLineNumber >= prev.modifiedLineNumber + prev.lineCount && cur.originalLineNumber >= prev.originalLineNumber + prev.lineCount); + let hiddenRegions = updatedLastUnchangedRegions.map((r) => new LineRangeMapping(r.getHiddenOriginalRange(reader), r.getHiddenModifiedRange(reader))); + hiddenRegions = LineRangeMapping.clip(hiddenRegions, LineRange.ofLength(1, model.original.getLineCount()), LineRange.ofLength(1, model.modified.getLineCount())); + visibleRegions = LineRangeMapping.inverse(hiddenRegions, model.original.getLineCount(), model.modified.getLineCount()); + } + const newUnchangedRegions2 = []; + if (visibleRegions) { + for (const r of newUnchangedRegions) { + const intersecting = visibleRegions.filter((f3) => f3.original.intersectsStrict(r.originalUnchangedRange) && f3.modified.intersectsStrict(r.modifiedUnchangedRange)); + newUnchangedRegions2.push(...r.setVisibleRanges(intersecting, tx)); + } + } else { + newUnchangedRegions2.push(...newUnchangedRegions); + } + const originalDecorationIds = model.original.deltaDecorations((lastUnchangedRegions === null || lastUnchangedRegions === void 0 ? void 0 : lastUnchangedRegions.originalDecorationIds) || [], newUnchangedRegions2.map((r) => ({ range: r.originalUnchangedRange.toInclusiveRange(), options: { description: "unchanged" } }))); + const modifiedDecorationIds = model.modified.deltaDecorations((lastUnchangedRegions === null || lastUnchangedRegions === void 0 ? void 0 : lastUnchangedRegions.modifiedDecorationIds) || [], newUnchangedRegions2.map((r) => ({ range: r.modifiedUnchangedRange.toInclusiveRange(), options: { description: "unchanged" } }))); + this._unchangedRegions.set({ + regions: newUnchangedRegions2, + originalDecorationIds, + modifiedDecorationIds + }, tx); + }; + this._register(model.modified.onDidChangeContent((e) => { + const diff = this._diff.get(); + if (diff) { + const textEdits = TextEditInfo.fromModelContentChanges(e.changes); + const result = applyModifiedEdits(this._lastDiff, textEdits, model.original, model.modified); + if (result) { + this._lastDiff = result; + transaction((tx) => { + this._diff.set(DiffState.fromDiffResult(this._lastDiff), tx); + updateUnchangedRegions(result, tx); + const currentSyncedMovedText = this.movedTextToCompare.get(); + this.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff.moves.find((m) => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : void 0, tx); + }); + } + } + this._isDiffUpToDate.set(false, void 0); + debouncer.schedule(); + })); + this._register(model.original.onDidChangeContent((e) => { + const diff = this._diff.get(); + if (diff) { + const textEdits = TextEditInfo.fromModelContentChanges(e.changes); + const result = applyOriginalEdits(this._lastDiff, textEdits, model.original, model.modified); + if (result) { + this._lastDiff = result; + transaction((tx) => { + this._diff.set(DiffState.fromDiffResult(this._lastDiff), tx); + updateUnchangedRegions(result, tx); + const currentSyncedMovedText = this.movedTextToCompare.get(); + this.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff.moves.find((m) => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : void 0, tx); + }); + } + } + this._isDiffUpToDate.set(false, void 0); + debouncer.schedule(); + })); + this._register(autorunWithStore((reader, store) => __async(this, null, function* () { + var _a10, _b4; + this._options.hideUnchangedRegionsMinimumLineCount.read(reader); + this._options.hideUnchangedRegionsContextLineCount.read(reader); + debouncer.cancel(); + contentChangedSignal.read(reader); + const documentDiffProvider = this._diffProvider.read(reader); + documentDiffProvider.onChangeSignal.read(reader); + readHotReloadableExport(DefaultLinesDiffComputer, reader); + readHotReloadableExport(optimizeSequenceDiffs, reader); + this._isDiffUpToDate.set(false, void 0); + let originalTextEditInfos = []; + store.add(model.original.onDidChangeContent((e) => { + const edits = TextEditInfo.fromModelContentChanges(e.changes); + originalTextEditInfos = combineTextEditInfos(originalTextEditInfos, edits); + })); + let modifiedTextEditInfos = []; + store.add(model.modified.onDidChangeContent((e) => { + const edits = TextEditInfo.fromModelContentChanges(e.changes); + modifiedTextEditInfos = combineTextEditInfos(modifiedTextEditInfos, edits); + })); + let result = yield documentDiffProvider.diffProvider.computeDiff(model.original, model.modified, { + ignoreTrimWhitespace: this._options.ignoreTrimWhitespace.read(reader), + maxComputationTimeMs: this._options.maxComputationTimeMs.read(reader), + computeMoves: this._options.showMoves.read(reader) + }, this._cancellationTokenSource.token); + if (this._cancellationTokenSource.token.isCancellationRequested) { + return; + } + if (model.original.isDisposed() || model.modified.isDisposed()) { + return; + } + result = normalizeDocumentDiff(result, model.original, model.modified); + result = (_a10 = applyOriginalEdits(result, originalTextEditInfos, model.original, model.modified)) !== null && _a10 !== void 0 ? _a10 : result; + result = (_b4 = applyModifiedEdits(result, modifiedTextEditInfos, model.original, model.modified)) !== null && _b4 !== void 0 ? _b4 : result; + transaction((tx) => { + updateUnchangedRegions(result, tx); + this._lastDiff = result; + const state = DiffState.fromDiffResult(result); + this._diff.set(state, tx); + this._isDiffUpToDate.set(true, tx); + const currentSyncedMovedText = this.movedTextToCompare.get(); + this.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff.moves.find((m) => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : void 0, tx); + }); + }))); + } + ensureModifiedLineIsVisible(lineNumber, preference, tx) { + var _a10, _b4; + if (((_a10 = this.diff.get()) === null || _a10 === void 0 ? void 0 : _a10.mappings.length) === 0) { + return; + } + const unchangedRegions = ((_b4 = this._unchangedRegions.get()) === null || _b4 === void 0 ? void 0 : _b4.regions) || []; + for (const r of unchangedRegions) { + if (r.getHiddenModifiedRange(void 0).contains(lineNumber)) { + r.showModifiedLine(lineNumber, preference, tx); + return; + } + } + } + ensureOriginalLineIsVisible(lineNumber, preference, tx) { + var _a10, _b4; + if (((_a10 = this.diff.get()) === null || _a10 === void 0 ? void 0 : _a10.mappings.length) === 0) { + return; + } + const unchangedRegions = ((_b4 = this._unchangedRegions.get()) === null || _b4 === void 0 ? void 0 : _b4.regions) || []; + for (const r of unchangedRegions) { + if (r.getHiddenOriginalRange(void 0).contains(lineNumber)) { + r.showOriginalLine(lineNumber, preference, tx); + return; + } + } + } + waitForDiff() { + return __async(this, null, function* () { + yield waitForState(this.isDiffUpToDate, (s) => s); + }); + } + serializeState() { + const regions = this._unchangedRegions.get(); + return { + collapsedRegions: regions === null || regions === void 0 ? void 0 : regions.regions.map((r) => ({ range: r.getHiddenModifiedRange(void 0).serialize() })) + }; + } + restoreSerializedState(state) { + var _a10; + const ranges = (_a10 = state.collapsedRegions) === null || _a10 === void 0 ? void 0 : _a10.map((r) => LineRange.deserialize(r.range)); + const regions = this._unchangedRegions.get(); + if (!regions || !ranges) { + return; + } + transaction((tx) => { + for (const r of regions.regions) { + for (const range2 of ranges) { + if (r.modifiedUnchangedRange.intersect(range2)) { + r.setHiddenModifiedRange(range2, tx); + break; + } + } + } + }); + } + }; + DiffEditorViewModel = __decorate50([ + __param44(2, IDiffProviderFactoryService) + ], DiffEditorViewModel); + DiffState = class _DiffState { + static fromDiffResult(result) { + return new _DiffState(result.changes.map((c) => new DiffMapping(c)), result.moves || [], result.identical, result.quitEarly); + } + constructor(mappings, movedTexts, identical, quitEarly) { + this.mappings = mappings; + this.movedTexts = movedTexts; + this.identical = identical; + this.quitEarly = quitEarly; + } + }; + DiffMapping = class { + constructor(lineRangeMapping) { + this.lineRangeMapping = lineRangeMapping; + } + }; + UnchangedRegion = class _UnchangedRegion { + static fromDiffs(changes, originalLineCount, modifiedLineCount, minHiddenLineCount, minContext) { + const inversedMappings = DetailedLineRangeMapping.inverse(changes, originalLineCount, modifiedLineCount); + const result = []; + for (const mapping of inversedMappings) { + let origStart = mapping.original.startLineNumber; + let modStart = mapping.modified.startLineNumber; + let length = mapping.original.length; + const atStart = origStart === 1 && modStart === 1; + const atEnd = origStart + length === originalLineCount + 1 && modStart + length === modifiedLineCount + 1; + if ((atStart || atEnd) && length >= minContext + minHiddenLineCount) { + if (atStart && !atEnd) { + length -= minContext; + } + if (atEnd && !atStart) { + origStart += minContext; + modStart += minContext; + length -= minContext; + } + result.push(new _UnchangedRegion(origStart, modStart, length, 0, 0)); + } else if (length >= minContext * 2 + minHiddenLineCount) { + origStart += minContext; + modStart += minContext; + length -= minContext * 2; + result.push(new _UnchangedRegion(origStart, modStart, length, 0, 0)); + } + } + return result; + } + get originalUnchangedRange() { + return LineRange.ofLength(this.originalLineNumber, this.lineCount); + } + get modifiedUnchangedRange() { + return LineRange.ofLength(this.modifiedLineNumber, this.lineCount); + } + constructor(originalLineNumber, modifiedLineNumber, lineCount, visibleLineCountTop, visibleLineCountBottom) { + this.originalLineNumber = originalLineNumber; + this.modifiedLineNumber = modifiedLineNumber; + this.lineCount = lineCount; + this._visibleLineCountTop = observableValue(this, 0); + this.visibleLineCountTop = this._visibleLineCountTop; + this._visibleLineCountBottom = observableValue(this, 0); + this.visibleLineCountBottom = this._visibleLineCountBottom; + this._shouldHideControls = derived(this, (reader) => ( + /** @description isVisible */ + this.visibleLineCountTop.read(reader) + this.visibleLineCountBottom.read(reader) === this.lineCount && !this.isDragged.read(reader) + )); + this.isDragged = observableValue(this, void 0); + const visibleLineCountTop2 = Math.max(Math.min(visibleLineCountTop, this.lineCount), 0); + const visibleLineCountBottom2 = Math.max(Math.min(visibleLineCountBottom, this.lineCount - visibleLineCountTop), 0); + softAssert(visibleLineCountTop === visibleLineCountTop2); + softAssert(visibleLineCountBottom === visibleLineCountBottom2); + this._visibleLineCountTop.set(visibleLineCountTop2, void 0); + this._visibleLineCountBottom.set(visibleLineCountBottom2, void 0); + } + setVisibleRanges(visibleRanges, tx) { + const result = []; + const hiddenModified = new LineRangeSet(visibleRanges.map((r) => r.modified)).subtractFrom(this.modifiedUnchangedRange); + let originalStartLineNumber = this.originalLineNumber; + let modifiedStartLineNumber = this.modifiedLineNumber; + const modifiedEndLineNumberEx = this.modifiedLineNumber + this.lineCount; + if (hiddenModified.ranges.length === 0) { + this.showAll(tx); + result.push(this); + } else { + let i = 0; + for (const r of hiddenModified.ranges) { + const isLast = i === hiddenModified.ranges.length - 1; + i++; + const length = (isLast ? modifiedEndLineNumberEx : r.endLineNumberExclusive) - modifiedStartLineNumber; + const newR = new _UnchangedRegion(originalStartLineNumber, modifiedStartLineNumber, length, 0, 0); + newR.setHiddenModifiedRange(r, tx); + result.push(newR); + originalStartLineNumber = newR.originalUnchangedRange.endLineNumberExclusive; + modifiedStartLineNumber = newR.modifiedUnchangedRange.endLineNumberExclusive; + } + } + return result; + } + shouldHideControls(reader) { + return this._shouldHideControls.read(reader); + } + getHiddenOriginalRange(reader) { + return LineRange.ofLength(this.originalLineNumber + this._visibleLineCountTop.read(reader), this.lineCount - this._visibleLineCountTop.read(reader) - this._visibleLineCountBottom.read(reader)); + } + getHiddenModifiedRange(reader) { + return LineRange.ofLength(this.modifiedLineNumber + this._visibleLineCountTop.read(reader), this.lineCount - this._visibleLineCountTop.read(reader) - this._visibleLineCountBottom.read(reader)); + } + setHiddenModifiedRange(range2, tx) { + const visibleLineCountTop = range2.startLineNumber - this.modifiedLineNumber; + const visibleLineCountBottom = this.modifiedLineNumber + this.lineCount - range2.endLineNumberExclusive; + this.setState(visibleLineCountTop, visibleLineCountBottom, tx); + } + getMaxVisibleLineCountTop() { + return this.lineCount - this._visibleLineCountBottom.get(); + } + getMaxVisibleLineCountBottom() { + return this.lineCount - this._visibleLineCountTop.get(); + } + showMoreAbove(count = 10, tx) { + const maxVisibleLineCountTop = this.getMaxVisibleLineCountTop(); + this._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get() + count, maxVisibleLineCountTop), tx); + } + showMoreBelow(count = 10, tx) { + const maxVisibleLineCountBottom = this.lineCount - this._visibleLineCountTop.get(); + this._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get() + count, maxVisibleLineCountBottom), tx); + } + showAll(tx) { + this._visibleLineCountBottom.set(this.lineCount - this._visibleLineCountTop.get(), tx); + } + showModifiedLine(lineNumber, preference, tx) { + const top = lineNumber + 1 - (this.modifiedLineNumber + this._visibleLineCountTop.get()); + const bottom = this.modifiedLineNumber - this._visibleLineCountBottom.get() + this.lineCount - lineNumber; + if (preference === 0 && top < bottom || preference === 1) { + this._visibleLineCountTop.set(this._visibleLineCountTop.get() + top, tx); + } else { + this._visibleLineCountBottom.set(this._visibleLineCountBottom.get() + bottom, tx); + } + } + showOriginalLine(lineNumber, preference, tx) { + const top = lineNumber - this.originalLineNumber; + const bottom = this.originalLineNumber + this.lineCount - lineNumber; + if (preference === 0 && top < bottom || preference === 1) { + this._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get() + bottom - top, this.getMaxVisibleLineCountTop()), tx); + } else { + this._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get() + top - bottom, this.getMaxVisibleLineCountBottom()), tx); + } + } + collapseAll(tx) { + this._visibleLineCountTop.set(0, tx); + this._visibleLineCountBottom.set(0, tx); + } + setState(visibleLineCountTop, visibleLineCountBottom, tx) { + visibleLineCountTop = Math.max(Math.min(visibleLineCountTop, this.lineCount), 0); + visibleLineCountBottom = Math.max(Math.min(visibleLineCountBottom, this.lineCount - visibleLineCountTop), 0); + this._visibleLineCountTop.set(visibleLineCountTop, tx); + this._visibleLineCountBottom.set(visibleLineCountBottom, tx); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin.js +var InlineDiffDeletedCodeMargin; +var init_inlineDiffDeletedCodeMargin = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin.js"() { + init_dom(); + init_actions(); + init_codicons(); + init_lifecycle(); + init_platform(); + init_themables(); + init_nls(); + InlineDiffDeletedCodeMargin = class extends Disposable { + get visibility() { + return this._visibility; + } + set visibility(_visibility) { + if (this._visibility !== _visibility) { + this._visibility = _visibility; + this._diffActions.style.visibility = _visibility ? "visible" : "hidden"; + } + } + constructor(_getViewZoneId, _marginDomNode, _modifiedEditor, _diff, _editor, _viewLineCounts, _originalTextModel, _contextMenuService, _clipboardService) { + super(); + this._getViewZoneId = _getViewZoneId; + this._marginDomNode = _marginDomNode; + this._modifiedEditor = _modifiedEditor; + this._diff = _diff; + this._editor = _editor; + this._viewLineCounts = _viewLineCounts; + this._originalTextModel = _originalTextModel; + this._contextMenuService = _contextMenuService; + this._clipboardService = _clipboardService; + this._visibility = false; + this._marginDomNode.style.zIndex = "10"; + this._diffActions = document.createElement("div"); + this._diffActions.className = ThemeIcon.asClassName(Codicon.lightBulb) + " lightbulb-glyph"; + this._diffActions.style.position = "absolute"; + const lineHeight = this._modifiedEditor.getOption( + 67 + /* EditorOption.lineHeight */ + ); + this._diffActions.style.right = "0px"; + this._diffActions.style.visibility = "hidden"; + this._diffActions.style.height = `${lineHeight}px`; + this._diffActions.style.lineHeight = `${lineHeight}px`; + this._marginDomNode.appendChild(this._diffActions); + let currentLineNumberOffset = 0; + const useShadowDOM = _modifiedEditor.getOption( + 127 + /* EditorOption.useShadowDOM */ + ) && !isIOS; + const showContextMenu = (x, y) => { + var _a10; + this._contextMenuService.showContextMenu({ + domForShadowRoot: useShadowDOM ? (_a10 = _modifiedEditor.getDomNode()) !== null && _a10 !== void 0 ? _a10 : void 0 : void 0, + getAnchor: () => ({ x, y }), + getActions: () => { + const actions = []; + const isDeletion = _diff.modified.isEmpty; + actions.push(new Action("diff.clipboard.copyDeletedContent", isDeletion ? _diff.original.length > 1 ? localize("diff.clipboard.copyDeletedLinesContent.label", "Copy deleted lines") : localize("diff.clipboard.copyDeletedLinesContent.single.label", "Copy deleted line") : _diff.original.length > 1 ? localize("diff.clipboard.copyChangedLinesContent.label", "Copy changed lines") : localize("diff.clipboard.copyChangedLinesContent.single.label", "Copy changed line"), void 0, true, () => __async(this, null, function* () { + const originalText = this._originalTextModel.getValueInRange(_diff.original.toExclusiveRange()); + yield this._clipboardService.writeText(originalText); + }))); + if (_diff.original.length > 1) { + actions.push(new Action("diff.clipboard.copyDeletedLineContent", isDeletion ? localize("diff.clipboard.copyDeletedLineContent.label", "Copy deleted line ({0})", _diff.original.startLineNumber + currentLineNumberOffset) : localize("diff.clipboard.copyChangedLineContent.label", "Copy changed line ({0})", _diff.original.startLineNumber + currentLineNumberOffset), void 0, true, () => __async(this, null, function* () { + let lineContent = this._originalTextModel.getLineContent(_diff.original.startLineNumber + currentLineNumberOffset); + if (lineContent === "") { + const eof = this._originalTextModel.getEndOfLineSequence(); + lineContent = eof === 0 ? "\n" : "\r\n"; + } + yield this._clipboardService.writeText(lineContent); + }))); + } + const readOnly = _modifiedEditor.getOption( + 91 + /* EditorOption.readOnly */ + ); + if (!readOnly) { + actions.push(new Action("diff.inline.revertChange", localize("diff.inline.revertChange.label", "Revert this change"), void 0, true, () => __async(this, null, function* () { + this._editor.revert(this._diff); + }))); + } + return actions; + }, + autoSelectFirstItem: true + }); + }; + this._register(addStandardDisposableListener(this._diffActions, "mousedown", (e) => { + if (!e.leftButton) { + return; + } + const { top, height } = getDomNodePagePosition(this._diffActions); + const pad = Math.floor(lineHeight / 3); + e.preventDefault(); + showContextMenu(e.posx, top + height + pad); + })); + this._register(_modifiedEditor.onMouseMove((e) => { + if ((e.target.type === 8 || e.target.type === 5) && e.target.detail.viewZoneId === this._getViewZoneId()) { + currentLineNumberOffset = this._updateLightBulbPosition(this._marginDomNode, e.event.browserEvent.y, lineHeight); + this.visibility = true; + } else { + this.visibility = false; + } + })); + this._register(_modifiedEditor.onMouseDown((e) => { + if (!e.event.leftButton) { + return; + } + if (e.target.type === 8 || e.target.type === 5) { + const viewZoneId = e.target.detail.viewZoneId; + if (viewZoneId === this._getViewZoneId()) { + e.event.preventDefault(); + currentLineNumberOffset = this._updateLightBulbPosition(this._marginDomNode, e.event.browserEvent.y, lineHeight); + showContextMenu(e.event.posx, e.event.posy + lineHeight); + } + } + })); + } + _updateLightBulbPosition(marginDomNode, y, lineHeight) { + const { top } = getDomNodePagePosition(marginDomNode); + const offset = y - top; + const lineNumberOffset = Math.floor(offset / lineHeight); + const newTop = lineNumberOffset * lineHeight; + this._diffActions.style.top = `${newTop}px`; + if (this._viewLineCounts) { + let acc = 0; + for (let i = 0; i < this._viewLineCounts.length; i++) { + acc += this._viewLineCounts[i]; + if (lineNumberOffset < acc) { + return i; + } + } + } + return lineNumberOffset; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/renderLines.js +function renderLines(source, options2, decorations, domNode) { + applyFontInfo(domNode, options2.fontInfo); + const hasCharChanges = decorations.length > 0; + const sb = new StringBuilder(1e4); + let maxCharsPerLine = 0; + let renderedLineCount = 0; + const viewLineCounts = []; + for (let lineIndex = 0; lineIndex < source.lineTokens.length; lineIndex++) { + const lineNumber = lineIndex + 1; + const lineTokens = source.lineTokens[lineIndex]; + const lineBreakData = source.lineBreakData[lineIndex]; + const actualDecorations = LineDecoration.filter(decorations, lineNumber, 1, Number.MAX_SAFE_INTEGER); + if (lineBreakData) { + let lastBreakOffset = 0; + for (const breakOffset of lineBreakData.breakOffsets) { + const viewLineTokens = lineTokens.sliceAndInflate(lastBreakOffset, breakOffset, 0); + maxCharsPerLine = Math.max(maxCharsPerLine, renderOriginalLine(renderedLineCount, viewLineTokens, LineDecoration.extractWrapped(actualDecorations, lastBreakOffset, breakOffset), hasCharChanges, source.mightContainNonBasicASCII, source.mightContainRTL, options2, sb)); + renderedLineCount++; + lastBreakOffset = breakOffset; + } + viewLineCounts.push(lineBreakData.breakOffsets.length); + } else { + viewLineCounts.push(1); + maxCharsPerLine = Math.max(maxCharsPerLine, renderOriginalLine(renderedLineCount, lineTokens, actualDecorations, hasCharChanges, source.mightContainNonBasicASCII, source.mightContainRTL, options2, sb)); + renderedLineCount++; + } + } + maxCharsPerLine += options2.scrollBeyondLastColumn; + const html2 = sb.build(); + const trustedhtml = ttPolicy4 ? ttPolicy4.createHTML(html2) : html2; + domNode.innerHTML = trustedhtml; + const minWidthInPx = maxCharsPerLine * options2.typicalHalfwidthCharacterWidth; + return { + heightInLines: renderedLineCount, + minWidthInPx, + viewLineCounts + }; +} +function renderOriginalLine(viewLineIdx, lineTokens, decorations, hasCharChanges, mightContainNonBasicASCII, mightContainRTL, options2, sb) { + sb.appendString('
    '); + const lineContent = lineTokens.getLineContent(); + const isBasicASCII2 = ViewLineRenderingData.isBasicASCII(lineContent, mightContainNonBasicASCII); + const containsRTL2 = ViewLineRenderingData.containsRTL(lineContent, isBasicASCII2, mightContainRTL); + const output = renderViewLine(new RenderLineInput( + options2.fontInfo.isMonospace && !options2.disableMonospaceOptimizations, + options2.fontInfo.canUseHalfwidthRightwardsArrow, + lineContent, + false, + isBasicASCII2, + containsRTL2, + 0, + lineTokens, + decorations, + options2.tabSize, + 0, + options2.fontInfo.spaceWidth, + options2.fontInfo.middotWidth, + options2.fontInfo.wsmiddotWidth, + options2.stopRenderingLineAfter, + options2.renderWhitespace, + options2.renderControlCharacters, + options2.fontLigatures !== EditorFontLigatures.OFF, + null + // Send no selections, original line cannot be selected + ), sb); + sb.appendString("
    "); + return output.characterMapping.getHorizontalOffset(output.characterMapping.length); +} +var ttPolicy4, LineSource, RenderOptions; +var init_renderLines = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/renderLines.js"() { + init_trustedTypes(); + init_domFontInfo(); + init_editorOptions(); + init_stringBuilder(); + init_lineDecorations(); + init_viewLineRenderer(); + init_viewModel(); + ttPolicy4 = createTrustedTypesPolicy("diffEditorWidget", { createHTML: (value) => value }); + LineSource = class { + constructor(lineTokens, lineBreakData, mightContainNonBasicASCII, mightContainRTL) { + this.lineTokens = lineTokens; + this.lineBreakData = lineBreakData; + this.mightContainNonBasicASCII = mightContainNonBasicASCII; + this.mightContainRTL = mightContainRTL; + } + }; + RenderOptions = class _RenderOptions { + static fromEditor(editor2) { + var _a10; + const modifiedEditorOptions = editor2.getOptions(); + const fontInfo = modifiedEditorOptions.get( + 50 + /* EditorOption.fontInfo */ + ); + const layoutInfo = modifiedEditorOptions.get( + 145 + /* EditorOption.layoutInfo */ + ); + return new _RenderOptions(((_a10 = editor2.getModel()) === null || _a10 === void 0 ? void 0 : _a10.getOptions().tabSize) || 0, fontInfo, modifiedEditorOptions.get( + 33 + /* EditorOption.disableMonospaceOptimizations */ + ), fontInfo.typicalHalfwidthCharacterWidth, modifiedEditorOptions.get( + 104 + /* EditorOption.scrollBeyondLastColumn */ + ), modifiedEditorOptions.get( + 67 + /* EditorOption.lineHeight */ + ), layoutInfo.decorationsWidth, modifiedEditorOptions.get( + 117 + /* EditorOption.stopRenderingLineAfter */ + ), modifiedEditorOptions.get( + 99 + /* EditorOption.renderWhitespace */ + ), modifiedEditorOptions.get( + 94 + /* EditorOption.renderControlCharacters */ + ), modifiedEditorOptions.get( + 51 + /* EditorOption.fontLigatures */ + )); + } + constructor(tabSize, fontInfo, disableMonospaceOptimizations, typicalHalfwidthCharacterWidth, scrollBeyondLastColumn, lineHeight, lineDecorationsWidth, stopRenderingLineAfter, renderWhitespace, renderControlCharacters, fontLigatures) { + this.tabSize = tabSize; + this.fontInfo = fontInfo; + this.disableMonospaceOptimizations = disableMonospaceOptimizations; + this.typicalHalfwidthCharacterWidth = typicalHalfwidthCharacterWidth; + this.scrollBeyondLastColumn = scrollBeyondLastColumn; + this.lineHeight = lineHeight; + this.lineDecorationsWidth = lineDecorationsWidth; + this.stopRenderingLineAfter = stopRenderingLineAfter; + this.renderWhitespace = renderWhitespace; + this.renderControlCharacters = renderControlCharacters; + this.fontLigatures = fontLigatures; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.js +function computeRangeAlignment(originalEditor, modifiedEditor, diffs, originalEditorAlignmentViewZones, modifiedEditorAlignmentViewZones, innerHunkAlignment) { + const originalLineHeightOverrides = new ArrayQueue(getAdditionalLineHeights(originalEditor, originalEditorAlignmentViewZones)); + const modifiedLineHeightOverrides = new ArrayQueue(getAdditionalLineHeights(modifiedEditor, modifiedEditorAlignmentViewZones)); + const origLineHeight = originalEditor.getOption( + 67 + /* EditorOption.lineHeight */ + ); + const modLineHeight = modifiedEditor.getOption( + 67 + /* EditorOption.lineHeight */ + ); + const result = []; + let lastOriginalLineNumber = 0; + let lastModifiedLineNumber = 0; + function handleAlignmentsOutsideOfDiffs(untilOriginalLineNumberExclusive, untilModifiedLineNumberExclusive) { + while (true) { + let origNext = originalLineHeightOverrides.peek(); + let modNext = modifiedLineHeightOverrides.peek(); + if (origNext && origNext.lineNumber >= untilOriginalLineNumberExclusive) { + origNext = void 0; + } + if (modNext && modNext.lineNumber >= untilModifiedLineNumberExclusive) { + modNext = void 0; + } + if (!origNext && !modNext) { + break; + } + const distOrig = origNext ? origNext.lineNumber - lastOriginalLineNumber : Number.MAX_VALUE; + const distNext = modNext ? modNext.lineNumber - lastModifiedLineNumber : Number.MAX_VALUE; + if (distOrig < distNext) { + originalLineHeightOverrides.dequeue(); + modNext = { + lineNumber: origNext.lineNumber - lastOriginalLineNumber + lastModifiedLineNumber, + heightInPx: 0 + }; + } else if (distOrig > distNext) { + modifiedLineHeightOverrides.dequeue(); + origNext = { + lineNumber: modNext.lineNumber - lastModifiedLineNumber + lastOriginalLineNumber, + heightInPx: 0 + }; + } else { + originalLineHeightOverrides.dequeue(); + modifiedLineHeightOverrides.dequeue(); + } + result.push({ + originalRange: LineRange.ofLength(origNext.lineNumber, 1), + modifiedRange: LineRange.ofLength(modNext.lineNumber, 1), + originalHeightInPx: origLineHeight + origNext.heightInPx, + modifiedHeightInPx: modLineHeight + modNext.heightInPx, + diff: void 0 + }); + } + } + for (const m of diffs) { + let emitAlignment = function(origLineNumberExclusive, modLineNumberExclusive) { + var _a10, _b4, _c2, _d2; + if (origLineNumberExclusive < lastOrigLineNumber || modLineNumberExclusive < lastModLineNumber) { + return; + } + if (first2) { + first2 = false; + } else if (origLineNumberExclusive === lastOrigLineNumber || modLineNumberExclusive === lastModLineNumber) { + return; + } + const originalRange = new LineRange(lastOrigLineNumber, origLineNumberExclusive); + const modifiedRange = new LineRange(lastModLineNumber, modLineNumberExclusive); + if (originalRange.isEmpty && modifiedRange.isEmpty) { + return; + } + const originalAdditionalHeight = (_b4 = (_a10 = originalLineHeightOverrides.takeWhile((v) => v.lineNumber < origLineNumberExclusive)) === null || _a10 === void 0 ? void 0 : _a10.reduce((p, c2) => p + c2.heightInPx, 0)) !== null && _b4 !== void 0 ? _b4 : 0; + const modifiedAdditionalHeight = (_d2 = (_c2 = modifiedLineHeightOverrides.takeWhile((v) => v.lineNumber < modLineNumberExclusive)) === null || _c2 === void 0 ? void 0 : _c2.reduce((p, c2) => p + c2.heightInPx, 0)) !== null && _d2 !== void 0 ? _d2 : 0; + result.push({ + originalRange, + modifiedRange, + originalHeightInPx: originalRange.length * origLineHeight + originalAdditionalHeight, + modifiedHeightInPx: modifiedRange.length * modLineHeight + modifiedAdditionalHeight, + diff: m.lineRangeMapping + }); + lastOrigLineNumber = origLineNumberExclusive; + lastModLineNumber = modLineNumberExclusive; + }; + const c = m.lineRangeMapping; + handleAlignmentsOutsideOfDiffs(c.original.startLineNumber, c.modified.startLineNumber); + let first2 = true; + let lastModLineNumber = c.modified.startLineNumber; + let lastOrigLineNumber = c.original.startLineNumber; + if (innerHunkAlignment) { + for (const i of c.innerChanges || []) { + if (i.originalRange.startColumn > 1 && i.modifiedRange.startColumn > 1) { + emitAlignment(i.originalRange.startLineNumber, i.modifiedRange.startLineNumber); + } + const originalModel = originalEditor.getModel(); + const maxColumn = i.originalRange.endLineNumber <= originalModel.getLineCount() ? originalModel.getLineMaxColumn(i.originalRange.endLineNumber) : Number.MAX_SAFE_INTEGER; + if (i.originalRange.endColumn < maxColumn) { + emitAlignment(i.originalRange.endLineNumber, i.modifiedRange.endLineNumber); + } + } + } + emitAlignment(c.original.endLineNumberExclusive, c.modified.endLineNumberExclusive); + lastOriginalLineNumber = c.original.endLineNumberExclusive; + lastModifiedLineNumber = c.modified.endLineNumberExclusive; + } + handleAlignmentsOutsideOfDiffs(Number.MAX_VALUE, Number.MAX_VALUE); + return result; +} +function getAdditionalLineHeights(editor2, viewZonesToIgnore) { + const viewZoneHeights = []; + const wrappingZoneHeights = []; + const hasWrapping = editor2.getOption( + 146 + /* EditorOption.wrappingInfo */ + ).wrappingColumn !== -1; + const coordinatesConverter = editor2._getViewModel().coordinatesConverter; + const editorLineHeight = editor2.getOption( + 67 + /* EditorOption.lineHeight */ + ); + if (hasWrapping) { + for (let i = 1; i <= editor2.getModel().getLineCount(); i++) { + const lineCount = coordinatesConverter.getModelLineViewLineCount(i); + if (lineCount > 1) { + wrappingZoneHeights.push({ lineNumber: i, heightInPx: editorLineHeight * (lineCount - 1) }); + } + } + } + for (const w of editor2.getWhitespaces()) { + if (viewZonesToIgnore.has(w.id)) { + continue; + } + const modelLineNumber = w.afterLineNumber === 0 ? 0 : coordinatesConverter.convertViewPositionToModelPosition(new Position(w.afterLineNumber, 1)).lineNumber; + viewZoneHeights.push({ lineNumber: modelLineNumber, heightInPx: w.height }); + } + const result = joinCombine(viewZoneHeights, wrappingZoneHeights, (v) => v.lineNumber, (v1, v2) => ({ lineNumber: v1.lineNumber, heightInPx: v1.heightInPx + v2.heightInPx })); + return result; +} +var __decorate51, __param45, DiffEditorViewZones; +var init_diffEditorViewZones = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.js"() { + init_dom(); + init_arrays(); + init_async(); + init_codicons(); + init_lifecycle(); + init_observable(); + init_themables(); + init_types(); + init_domFontInfo(); + init_registrations_contribution(); + init_diffEditorViewModel(); + init_inlineDiffDeletedCodeMargin(); + init_renderLines(); + init_utils4(); + init_lineRange(); + init_position(); + init_viewModel(); + init_clipboardService2(); + init_contextView(); + __decorate51 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param45 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + DiffEditorViewZones = class DiffEditorViewZones2 extends Disposable { + constructor(_targetWindow, _editors, _diffModel, _options, _diffEditorWidget, _canIgnoreViewZoneUpdateEvent, _origViewZonesToIgnore, _modViewZonesToIgnore, _clipboardService, _contextMenuService) { + super(); + this._targetWindow = _targetWindow; + this._editors = _editors; + this._diffModel = _diffModel; + this._options = _options; + this._diffEditorWidget = _diffEditorWidget; + this._canIgnoreViewZoneUpdateEvent = _canIgnoreViewZoneUpdateEvent; + this._origViewZonesToIgnore = _origViewZonesToIgnore; + this._modViewZonesToIgnore = _modViewZonesToIgnore; + this._clipboardService = _clipboardService; + this._contextMenuService = _contextMenuService; + this._originalTopPadding = observableValue(this, 0); + this._originalScrollOffset = observableValue(this, 0); + this._originalScrollOffsetAnimated = animatedObservable(this._targetWindow, this._originalScrollOffset, this._store); + this._modifiedTopPadding = observableValue(this, 0); + this._modifiedScrollOffset = observableValue(this, 0); + this._modifiedScrollOffsetAnimated = animatedObservable(this._targetWindow, this._modifiedScrollOffset, this._store); + const state = observableValue("invalidateAlignmentsState", 0); + const updateImmediately = this._register(new RunOnceScheduler(() => { + state.set(state.get() + 1, void 0); + }, 0)); + this._register(this._editors.original.onDidChangeViewZones((_args) => { + if (!this._canIgnoreViewZoneUpdateEvent()) { + updateImmediately.schedule(); + } + })); + this._register(this._editors.modified.onDidChangeViewZones((_args) => { + if (!this._canIgnoreViewZoneUpdateEvent()) { + updateImmediately.schedule(); + } + })); + this._register(this._editors.original.onDidChangeConfiguration((args) => { + if (args.hasChanged( + 146 + /* EditorOption.wrappingInfo */ + ) || args.hasChanged( + 67 + /* EditorOption.lineHeight */ + )) { + updateImmediately.schedule(); + } + })); + this._register(this._editors.modified.onDidChangeConfiguration((args) => { + if (args.hasChanged( + 146 + /* EditorOption.wrappingInfo */ + ) || args.hasChanged( + 67 + /* EditorOption.lineHeight */ + )) { + updateImmediately.schedule(); + } + })); + const originalModelTokenizationCompleted = this._diffModel.map((m) => m ? observableFromEvent( + m.model.original.onDidChangeTokens, + () => m.model.original.tokenization.backgroundTokenizationState === 2 + /* BackgroundTokenizationState.Completed */ + ) : void 0).map((m, reader) => m === null || m === void 0 ? void 0 : m.read(reader)); + const alignments = derived((reader) => { + const diffModel = this._diffModel.read(reader); + const diff = diffModel === null || diffModel === void 0 ? void 0 : diffModel.diff.read(reader); + if (!diffModel || !diff) { + return null; + } + state.read(reader); + const renderSideBySide = this._options.renderSideBySide.read(reader); + const innerHunkAlignment = renderSideBySide; + return computeRangeAlignment(this._editors.original, this._editors.modified, diff.mappings, this._origViewZonesToIgnore, this._modViewZonesToIgnore, innerHunkAlignment); + }); + const alignmentsSyncedMovedText = derived((reader) => { + var _a10; + const syncedMovedText = (_a10 = this._diffModel.read(reader)) === null || _a10 === void 0 ? void 0 : _a10.movedTextToCompare.read(reader); + if (!syncedMovedText) { + return null; + } + state.read(reader); + const mappings = syncedMovedText.changes.map((c) => new DiffMapping(c)); + return computeRangeAlignment(this._editors.original, this._editors.modified, mappings, this._origViewZonesToIgnore, this._modViewZonesToIgnore, true); + }); + function createFakeLinesDiv() { + const r = document.createElement("div"); + r.className = "diagonal-fill"; + return r; + } + const alignmentViewZonesDisposables = this._register(new DisposableStore()); + this.viewZones = derivedWithStore(this, (reader, store) => { + var _a10, _b4, _c2, _d2, _e2, _f3, _g2, _h2; + alignmentViewZonesDisposables.clear(); + const alignmentsVal = alignments.read(reader) || []; + const origViewZones = []; + const modViewZones = []; + const modifiedTopPaddingVal = this._modifiedTopPadding.read(reader); + if (modifiedTopPaddingVal > 0) { + modViewZones.push({ + afterLineNumber: 0, + domNode: document.createElement("div"), + heightInPx: modifiedTopPaddingVal, + showInHiddenAreas: true, + suppressMouseDown: true + }); + } + const originalTopPaddingVal = this._originalTopPadding.read(reader); + if (originalTopPaddingVal > 0) { + origViewZones.push({ + afterLineNumber: 0, + domNode: document.createElement("div"), + heightInPx: originalTopPaddingVal, + showInHiddenAreas: true, + suppressMouseDown: true + }); + } + const renderSideBySide = this._options.renderSideBySide.read(reader); + const deletedCodeLineBreaksComputer = !renderSideBySide ? (_a10 = this._editors.modified._getViewModel()) === null || _a10 === void 0 ? void 0 : _a10.createLineBreaksComputer() : void 0; + if (deletedCodeLineBreaksComputer) { + const originalModel = this._editors.original.getModel(); + for (const a3 of alignmentsVal) { + if (a3.diff) { + for (let i = a3.originalRange.startLineNumber; i < a3.originalRange.endLineNumberExclusive; i++) { + if (i > originalModel.getLineCount()) { + return { orig: origViewZones, mod: modViewZones }; + } + deletedCodeLineBreaksComputer === null || deletedCodeLineBreaksComputer === void 0 ? void 0 : deletedCodeLineBreaksComputer.addRequest(originalModel.getLineContent(i), null, null); + } + } + } + } + const lineBreakData = (_b4 = deletedCodeLineBreaksComputer === null || deletedCodeLineBreaksComputer === void 0 ? void 0 : deletedCodeLineBreaksComputer.finalize()) !== null && _b4 !== void 0 ? _b4 : []; + let lineBreakDataIdx = 0; + const modLineHeight = this._editors.modified.getOption( + 67 + /* EditorOption.lineHeight */ + ); + const syncedMovedText = (_c2 = this._diffModel.read(reader)) === null || _c2 === void 0 ? void 0 : _c2.movedTextToCompare.read(reader); + const mightContainNonBasicASCII = (_e2 = (_d2 = this._editors.original.getModel()) === null || _d2 === void 0 ? void 0 : _d2.mightContainNonBasicASCII()) !== null && _e2 !== void 0 ? _e2 : false; + const mightContainRTL = (_g2 = (_f3 = this._editors.original.getModel()) === null || _f3 === void 0 ? void 0 : _f3.mightContainRTL()) !== null && _g2 !== void 0 ? _g2 : false; + const renderOptions = RenderOptions.fromEditor(this._editors.modified); + for (const a3 of alignmentsVal) { + if (a3.diff && !renderSideBySide) { + if (!a3.originalRange.isEmpty) { + originalModelTokenizationCompleted.read(reader); + const deletedCodeDomNode = document.createElement("div"); + deletedCodeDomNode.classList.add("view-lines", "line-delete", "monaco-mouse-cursor-text"); + const originalModel = this._editors.original.getModel(); + if (a3.originalRange.endLineNumberExclusive - 1 > originalModel.getLineCount()) { + return { orig: origViewZones, mod: modViewZones }; + } + const source = new LineSource(a3.originalRange.mapToLineArray((l) => originalModel.tokenization.getLineTokens(l)), a3.originalRange.mapToLineArray((_) => lineBreakData[lineBreakDataIdx++]), mightContainNonBasicASCII, mightContainRTL); + const decorations = []; + for (const i of a3.diff.innerChanges || []) { + decorations.push(new InlineDecoration( + i.originalRange.delta(-(a3.diff.original.startLineNumber - 1)), + diffDeleteDecoration.className, + 0 + /* InlineDecorationType.Regular */ + )); + } + const result = renderLines(source, renderOptions, decorations, deletedCodeDomNode); + const marginDomNode2 = document.createElement("div"); + marginDomNode2.className = "inline-deleted-margin-view-zone"; + applyFontInfo(marginDomNode2, renderOptions.fontInfo); + if (this._options.renderIndicators.read(reader)) { + for (let i = 0; i < result.heightInLines; i++) { + const marginElement = document.createElement("div"); + marginElement.className = `delete-sign ${ThemeIcon.asClassName(diffRemoveIcon)}`; + marginElement.setAttribute("style", `position:absolute;top:${i * modLineHeight}px;width:${renderOptions.lineDecorationsWidth}px;height:${modLineHeight}px;right:0;`); + marginDomNode2.appendChild(marginElement); + } + } + let zoneId = void 0; + alignmentViewZonesDisposables.add(new InlineDiffDeletedCodeMargin(() => assertIsDefined(zoneId), marginDomNode2, this._editors.modified, a3.diff, this._diffEditorWidget, result.viewLineCounts, this._editors.original.getModel(), this._contextMenuService, this._clipboardService)); + for (let i = 0; i < result.viewLineCounts.length; i++) { + const count = result.viewLineCounts[i]; + if (count > 1) { + origViewZones.push({ + afterLineNumber: a3.originalRange.startLineNumber + i, + domNode: createFakeLinesDiv(), + heightInPx: (count - 1) * modLineHeight, + showInHiddenAreas: true, + suppressMouseDown: true + }); + } + } + modViewZones.push({ + afterLineNumber: a3.modifiedRange.startLineNumber - 1, + domNode: deletedCodeDomNode, + heightInPx: result.heightInLines * modLineHeight, + minWidthInPx: result.minWidthInPx, + marginDomNode: marginDomNode2, + setZoneId(id) { + zoneId = id; + }, + showInHiddenAreas: true, + suppressMouseDown: true + }); + } + const marginDomNode = document.createElement("div"); + marginDomNode.className = "gutter-delete"; + origViewZones.push({ + afterLineNumber: a3.originalRange.endLineNumberExclusive - 1, + domNode: createFakeLinesDiv(), + heightInPx: a3.modifiedHeightInPx, + marginDomNode, + showInHiddenAreas: true, + suppressMouseDown: true + }); + } else { + const delta = a3.modifiedHeightInPx - a3.originalHeightInPx; + if (delta > 0) { + if (syncedMovedText === null || syncedMovedText === void 0 ? void 0 : syncedMovedText.lineRangeMapping.original.delta(-1).deltaLength(2).contains(a3.originalRange.endLineNumberExclusive - 1)) { + continue; + } + origViewZones.push({ + afterLineNumber: a3.originalRange.endLineNumberExclusive - 1, + domNode: createFakeLinesDiv(), + heightInPx: delta, + showInHiddenAreas: true, + suppressMouseDown: true + }); + } else { + let createViewZoneMarginArrow = function() { + const arrow = document.createElement("div"); + arrow.className = "arrow-revert-change " + ThemeIcon.asClassName(Codicon.arrowRight); + store.add(addDisposableListener(arrow, "mousedown", (e) => e.stopPropagation())); + store.add(addDisposableListener(arrow, "click", (e) => { + e.stopPropagation(); + _diffEditorWidget.revert(a3.diff); + })); + return $("div", {}, arrow); + }; + if (syncedMovedText === null || syncedMovedText === void 0 ? void 0 : syncedMovedText.lineRangeMapping.modified.delta(-1).deltaLength(2).contains(a3.modifiedRange.endLineNumberExclusive - 1)) { + continue; + } + let marginDomNode = void 0; + if (a3.diff && a3.diff.modified.isEmpty && this._options.shouldRenderOldRevertArrows.read(reader)) { + marginDomNode = createViewZoneMarginArrow(); + } + modViewZones.push({ + afterLineNumber: a3.modifiedRange.endLineNumberExclusive - 1, + domNode: createFakeLinesDiv(), + heightInPx: -delta, + marginDomNode, + showInHiddenAreas: true, + suppressMouseDown: true + }); + } + } + } + for (const a3 of (_h2 = alignmentsSyncedMovedText.read(reader)) !== null && _h2 !== void 0 ? _h2 : []) { + if (!(syncedMovedText === null || syncedMovedText === void 0 ? void 0 : syncedMovedText.lineRangeMapping.original.intersect(a3.originalRange)) || !(syncedMovedText === null || syncedMovedText === void 0 ? void 0 : syncedMovedText.lineRangeMapping.modified.intersect(a3.modifiedRange))) { + continue; + } + const delta = a3.modifiedHeightInPx - a3.originalHeightInPx; + if (delta > 0) { + origViewZones.push({ + afterLineNumber: a3.originalRange.endLineNumberExclusive - 1, + domNode: createFakeLinesDiv(), + heightInPx: delta, + showInHiddenAreas: true, + suppressMouseDown: true + }); + } else { + modViewZones.push({ + afterLineNumber: a3.modifiedRange.endLineNumberExclusive - 1, + domNode: createFakeLinesDiv(), + heightInPx: -delta, + showInHiddenAreas: true, + suppressMouseDown: true + }); + } + } + return { orig: origViewZones, mod: modViewZones }; + }); + let ignoreChange = false; + this._register(this._editors.original.onDidScrollChange((e) => { + if (e.scrollLeftChanged && !ignoreChange) { + ignoreChange = true; + this._editors.modified.setScrollLeft(e.scrollLeft); + ignoreChange = false; + } + })); + this._register(this._editors.modified.onDidScrollChange((e) => { + if (e.scrollLeftChanged && !ignoreChange) { + ignoreChange = true; + this._editors.original.setScrollLeft(e.scrollLeft); + ignoreChange = false; + } + })); + this._originalScrollTop = observableFromEvent(this._editors.original.onDidScrollChange, () => ( + /** @description original.getScrollTop */ + this._editors.original.getScrollTop() + )); + this._modifiedScrollTop = observableFromEvent(this._editors.modified.onDidScrollChange, () => ( + /** @description modified.getScrollTop */ + this._editors.modified.getScrollTop() + )); + this._register(autorun((reader) => { + const newScrollTopModified = this._originalScrollTop.read(reader) - (this._originalScrollOffsetAnimated.get() - this._modifiedScrollOffsetAnimated.read(reader)) - (this._originalTopPadding.get() - this._modifiedTopPadding.read(reader)); + if (newScrollTopModified !== this._editors.modified.getScrollTop()) { + this._editors.modified.setScrollTop( + newScrollTopModified, + 1 + /* ScrollType.Immediate */ + ); + } + })); + this._register(autorun((reader) => { + const newScrollTopOriginal = this._modifiedScrollTop.read(reader) - (this._modifiedScrollOffsetAnimated.get() - this._originalScrollOffsetAnimated.read(reader)) - (this._modifiedTopPadding.get() - this._originalTopPadding.read(reader)); + if (newScrollTopOriginal !== this._editors.original.getScrollTop()) { + this._editors.original.setScrollTop( + newScrollTopOriginal, + 1 + /* ScrollType.Immediate */ + ); + } + })); + this._register(autorun((reader) => { + var _a10; + const m = (_a10 = this._diffModel.read(reader)) === null || _a10 === void 0 ? void 0 : _a10.movedTextToCompare.read(reader); + let deltaOrigToMod = 0; + if (m) { + const trueTopOriginal = this._editors.original.getTopForLineNumber(m.lineRangeMapping.original.startLineNumber, true) - this._originalTopPadding.get(); + const trueTopModified = this._editors.modified.getTopForLineNumber(m.lineRangeMapping.modified.startLineNumber, true) - this._modifiedTopPadding.get(); + deltaOrigToMod = trueTopModified - trueTopOriginal; + } + if (deltaOrigToMod > 0) { + this._modifiedTopPadding.set(0, void 0); + this._originalTopPadding.set(deltaOrigToMod, void 0); + } else if (deltaOrigToMod < 0) { + this._modifiedTopPadding.set(-deltaOrigToMod, void 0); + this._originalTopPadding.set(0, void 0); + } else { + setTimeout(() => { + this._modifiedTopPadding.set(0, void 0); + this._originalTopPadding.set(0, void 0); + }, 400); + } + if (this._editors.modified.hasTextFocus()) { + this._originalScrollOffset.set(this._modifiedScrollOffset.get() - deltaOrigToMod, void 0, true); + } else { + this._modifiedScrollOffset.set(this._originalScrollOffset.get() + deltaOrigToMod, void 0, true); + } + })); + } + }; + DiffEditorViewZones = __decorate51([ + __param45(8, IClipboardService), + __param45(9, IContextMenuService) + ], DiffEditorViewZones); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/utils/editorGutter.js +var EditorGutter, ManagedGutterItemView; +var init_editorGutter = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/utils/editorGutter.js"() { + init_dom(); + init_lifecycle(); + init_observable(); + init_lineRange(); + init_offsetRange(); + EditorGutter = class extends Disposable { + constructor(_editor, _domNode, itemProvider) { + super(); + this._editor = _editor; + this._domNode = _domNode; + this.itemProvider = itemProvider; + this.scrollTop = observableFromEvent(this._editor.onDidScrollChange, (e) => ( + /** @description editor.onDidScrollChange */ + this._editor.getScrollTop() + )); + this.isScrollTopZero = this.scrollTop.map((scrollTop) => ( + /** @description isScrollTopZero */ + scrollTop === 0 + )); + this.modelAttached = observableFromEvent(this._editor.onDidChangeModel, (e) => ( + /** @description editor.onDidChangeModel */ + this._editor.hasModel() + )); + this.editorOnDidChangeViewZones = observableSignalFromEvent("onDidChangeViewZones", this._editor.onDidChangeViewZones); + this.editorOnDidContentSizeChange = observableSignalFromEvent("onDidContentSizeChange", this._editor.onDidContentSizeChange); + this.domNodeSizeChanged = observableSignal("domNodeSizeChanged"); + this.views = /* @__PURE__ */ new Map(); + this._domNode.className = "gutter monaco-editor"; + const scrollDecoration = this._domNode.appendChild(h("div.scroll-decoration", { role: "presentation", ariaHidden: "true", style: { width: "100%" } }).root); + const o = new ResizeObserver(() => { + transaction((tx) => { + this.domNodeSizeChanged.trigger(tx); + }); + }); + o.observe(this._domNode); + this._register(toDisposable(() => o.disconnect())); + this._register(autorun((reader) => { + scrollDecoration.className = this.isScrollTopZero.read(reader) ? "" : "scroll-decoration"; + })); + this._register(autorun((reader) => ( + /** @description EditorGutter.Render */ + this.render(reader) + ))); + } + dispose() { + super.dispose(); + reset(this._domNode); + } + render(reader) { + if (!this.modelAttached.read(reader)) { + return; + } + this.domNodeSizeChanged.read(reader); + this.editorOnDidChangeViewZones.read(reader); + this.editorOnDidContentSizeChange.read(reader); + const scrollTop = this.scrollTop.read(reader); + const visibleRanges = this._editor.getVisibleRanges(); + const unusedIds = new Set(this.views.keys()); + const viewRange = OffsetRange.ofStartAndLength(0, this._domNode.clientHeight); + if (!viewRange.isEmpty) { + for (const visibleRange of visibleRanges) { + const visibleRange2 = new LineRange(visibleRange.startLineNumber, visibleRange.endLineNumber + 1); + const gutterItems = this.itemProvider.getIntersectingGutterItems(visibleRange2, reader); + transaction((tx) => { + for (const gutterItem of gutterItems) { + if (!gutterItem.range.intersect(visibleRange2)) { + continue; + } + unusedIds.delete(gutterItem.id); + let view = this.views.get(gutterItem.id); + if (!view) { + const viewDomNode = document.createElement("div"); + this._domNode.appendChild(viewDomNode); + const gutterItemObs = observableValue("item", gutterItem); + const itemView = this.itemProvider.createView(gutterItemObs, viewDomNode); + view = new ManagedGutterItemView(gutterItemObs, itemView, viewDomNode); + this.views.set(gutterItem.id, view); + } else { + view.item.set(gutterItem, tx); + } + const top = gutterItem.range.startLineNumber <= this._editor.getModel().getLineCount() ? this._editor.getTopForLineNumber(gutterItem.range.startLineNumber, true) - scrollTop : this._editor.getBottomForLineNumber(gutterItem.range.startLineNumber - 1, false) - scrollTop; + const bottom = gutterItem.range.isEmpty ? top : this._editor.getBottomForLineNumber(gutterItem.range.endLineNumberExclusive - 1, true) - scrollTop; + const height = bottom - top; + view.domNode.style.top = `${top}px`; + view.domNode.style.height = `${height}px`; + view.gutterItemView.layout(OffsetRange.ofStartAndLength(top, height), viewRange); + } + }); + } + } + for (const id of unusedIds) { + const view = this.views.get(id); + view.gutterItemView.dispose(); + this._domNode.removeChild(view.domNode); + this.views.delete(id); + } + } + }; + ManagedGutterItemView = class { + constructor(item, gutterItemView, domNode) { + this.item = item; + this.gutterItemView = gutterItemView; + this.domNode = domNode; + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/multiDiffEditor/utils.js +var ActionRunnerWithContext; +var init_utils5 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/multiDiffEditor/utils.js"() { + init_actions(); + ActionRunnerWithContext = class extends ActionRunner { + constructor(_getContext) { + super(); + this._getContext = _getContext; + } + runAction(action, _context) { + const ctx = this._getContext(); + return super.runAction(action, ctx); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/common/model/textModelText.js +var TextModelText; +var init_textModelText = __esm({ + "node_modules/monaco-editor/esm/vs/editor/common/model/textModelText.js"() { + init_textEdit(); + init_textLength(); + TextModelText = class extends AbstractText { + constructor(_textModel) { + super(); + this._textModel = _textModel; + } + getValueOfRange(range2) { + return this._textModel.getValueInRange(range2); + } + get length() { + const lastLineNumber = this._textModel.getLineCount(); + const lastLineLen = this._textModel.getLineLength(lastLineNumber); + return new TextLength(lastLineNumber - 1, lastLineLen); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/toolbar/toolbar.css +var init_toolbar = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/toolbar/toolbar.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/base/browser/ui/toolbar/toolbar.js +var ToolBar, ToggleMenuAction; +var init_toolbar2 = __esm({ + "node_modules/monaco-editor/esm/vs/base/browser/ui/toolbar/toolbar.js"() { + init_actionbar2(); + init_dropdownActionViewItem(); + init_actions(); + init_codicons(); + init_themables(); + init_event(); + init_lifecycle(); + init_toolbar(); + init_nls(); + init_hoverDelegateFactory(); + ToolBar = class extends Disposable { + constructor(container, contextMenuProvider, options2 = { + orientation: 0 + /* ActionsOrientation.HORIZONTAL */ + }) { + var _a10; + super(); + this.submenuActionViewItems = []; + this.hasSecondaryActions = false; + this._onDidChangeDropdownVisibility = this._register(new EventMultiplexer()); + this.onDidChangeDropdownVisibility = this._onDidChangeDropdownVisibility.event; + this.disposables = this._register(new DisposableStore()); + options2.hoverDelegate = (_a10 = options2.hoverDelegate) !== null && _a10 !== void 0 ? _a10 : this._register(createInstantHoverDelegate()); + this.options = options2; + this.lookupKeybindings = typeof this.options.getKeyBinding === "function"; + this.toggleMenuAction = this._register(new ToggleMenuAction(() => { + var _a11; + return (_a11 = this.toggleMenuActionViewItem) === null || _a11 === void 0 ? void 0 : _a11.show(); + }, options2.toggleMenuTitle)); + this.element = document.createElement("div"); + this.element.className = "monaco-toolbar"; + container.appendChild(this.element); + this.actionBar = this._register(new ActionBar(this.element, { + orientation: options2.orientation, + ariaLabel: options2.ariaLabel, + actionRunner: options2.actionRunner, + allowContextMenu: options2.allowContextMenu, + highlightToggledItems: options2.highlightToggledItems, + hoverDelegate: options2.hoverDelegate, + actionViewItemProvider: (action, viewItemOptions) => { + var _a11; + if (action.id === ToggleMenuAction.ID) { + this.toggleMenuActionViewItem = new DropdownMenuActionViewItem(action, action.menuActions, contextMenuProvider, { + actionViewItemProvider: this.options.actionViewItemProvider, + actionRunner: this.actionRunner, + keybindingProvider: this.options.getKeyBinding, + classNames: ThemeIcon.asClassNameArray((_a11 = options2.moreIcon) !== null && _a11 !== void 0 ? _a11 : Codicon.toolBarMore), + anchorAlignmentProvider: this.options.anchorAlignmentProvider, + menuAsChild: !!this.options.renderDropdownAsChildElement, + skipTelemetry: this.options.skipTelemetry, + isMenu: true, + hoverDelegate: this.options.hoverDelegate + }); + this.toggleMenuActionViewItem.setActionContext(this.actionBar.context); + this.disposables.add(this._onDidChangeDropdownVisibility.add(this.toggleMenuActionViewItem.onDidChangeVisibility)); + return this.toggleMenuActionViewItem; + } + if (options2.actionViewItemProvider) { + const result = options2.actionViewItemProvider(action, viewItemOptions); + if (result) { + return result; + } + } + if (action instanceof SubmenuAction) { + const result = new DropdownMenuActionViewItem(action, action.actions, contextMenuProvider, { + actionViewItemProvider: this.options.actionViewItemProvider, + actionRunner: this.actionRunner, + keybindingProvider: this.options.getKeyBinding, + classNames: action.class, + anchorAlignmentProvider: this.options.anchorAlignmentProvider, + menuAsChild: !!this.options.renderDropdownAsChildElement, + skipTelemetry: this.options.skipTelemetry, + hoverDelegate: this.options.hoverDelegate + }); + result.setActionContext(this.actionBar.context); + this.submenuActionViewItems.push(result); + this.disposables.add(this._onDidChangeDropdownVisibility.add(result.onDidChangeVisibility)); + return result; + } + return void 0; + } + })); + } + set actionRunner(actionRunner) { + this.actionBar.actionRunner = actionRunner; + } + get actionRunner() { + return this.actionBar.actionRunner; + } + getElement() { + return this.element; + } + getItemAction(indexOrElement) { + return this.actionBar.getAction(indexOrElement); + } + setActions(primaryActions, secondaryActions) { + this.clear(); + const primaryActionsToSet = primaryActions ? primaryActions.slice(0) : []; + this.hasSecondaryActions = !!(secondaryActions && secondaryActions.length > 0); + if (this.hasSecondaryActions && secondaryActions) { + this.toggleMenuAction.menuActions = secondaryActions.slice(0); + primaryActionsToSet.push(this.toggleMenuAction); + } + primaryActionsToSet.forEach((action) => { + this.actionBar.push(action, { icon: true, label: false, keybinding: this.getKeybindingLabel(action) }); + }); + } + getKeybindingLabel(action) { + var _a10, _b4, _c2; + const key = this.lookupKeybindings ? (_b4 = (_a10 = this.options).getKeyBinding) === null || _b4 === void 0 ? void 0 : _b4.call(_a10, action) : void 0; + return (_c2 = key === null || key === void 0 ? void 0 : key.getLabel()) !== null && _c2 !== void 0 ? _c2 : void 0; + } + clear() { + this.submenuActionViewItems = []; + this.disposables.clear(); + this.actionBar.clear(); + } + dispose() { + this.clear(); + this.disposables.dispose(); + super.dispose(); + } + }; + ToggleMenuAction = class _ToggleMenuAction extends Action { + constructor(toggleDropdownMenu, title) { + title = title || localize("moreActions", "More Actions..."); + super(_ToggleMenuAction.ID, title, void 0, true); + this._menuActions = []; + this.toggleDropdownMenu = toggleDropdownMenu; + } + run() { + return __async(this, null, function* () { + this.toggleDropdownMenu(); + }); + } + get menuActions() { + return this._menuActions; + } + set menuActions(actions) { + this._menuActions = actions; + } + }; + ToggleMenuAction.ID = "toolbar.toggle.more"; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/actions/browser/toolbar.js +var __decorate52, __param46, WorkbenchToolBar, MenuWorkbenchToolBar; +var init_toolbar3 = __esm({ + "node_modules/monaco-editor/esm/vs/platform/actions/browser/toolbar.js"() { + init_dom(); + init_mouseEvent(); + init_toolbar2(); + init_actions(); + init_arrays(); + init_collections(); + init_errors(); + init_event(); + init_iterator(); + init_lifecycle(); + init_nls(); + init_menuEntryActionViewItem2(); + init_actions2(); + init_menuService(); + init_commands(); + init_contextkey(); + init_contextView(); + init_keybinding(); + init_telemetry(); + __decorate52 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param46 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + WorkbenchToolBar = class WorkbenchToolBar2 extends ToolBar { + constructor(container, _options, _menuService, _contextKeyService, _contextMenuService, _keybindingService, _commandService, telemetryService) { + super(container, _contextMenuService, __spreadProps(__spreadValues({ + // defaults + getKeyBinding: (action) => { + var _a10; + return (_a10 = _keybindingService.lookupKeybinding(action.id)) !== null && _a10 !== void 0 ? _a10 : void 0; + } + }, _options), { + // mandatory (overide options) + allowContextMenu: true, + skipTelemetry: typeof (_options === null || _options === void 0 ? void 0 : _options.telemetrySource) === "string" + })); + this._options = _options; + this._menuService = _menuService; + this._contextKeyService = _contextKeyService; + this._contextMenuService = _contextMenuService; + this._keybindingService = _keybindingService; + this._commandService = _commandService; + this._sessionDisposables = this._store.add(new DisposableStore()); + const telemetrySource = _options === null || _options === void 0 ? void 0 : _options.telemetrySource; + if (telemetrySource) { + this._store.add(this.actionBar.onDidRun((e) => telemetryService.publicLog2("workbenchActionExecuted", { id: e.action.id, from: telemetrySource }))); + } + } + setActions(_primary, _secondary = [], menuIds) { + var _a10, _b4, _c2; + this._sessionDisposables.clear(); + const primary = _primary.slice(); + const secondary = _secondary.slice(); + const toggleActions = []; + let toggleActionsCheckedCount = 0; + const extraSecondary = []; + let someAreHidden = false; + if (((_a10 = this._options) === null || _a10 === void 0 ? void 0 : _a10.hiddenItemStrategy) !== -1) { + for (let i = 0; i < primary.length; i++) { + const action = primary[i]; + if (!(action instanceof MenuItemAction) && !(action instanceof SubmenuItemAction)) { + continue; + } + if (!action.hideActions) { + continue; + } + toggleActions.push(action.hideActions.toggle); + if (action.hideActions.toggle.checked) { + toggleActionsCheckedCount++; + } + if (action.hideActions.isHidden) { + someAreHidden = true; + primary[i] = void 0; + if (((_b4 = this._options) === null || _b4 === void 0 ? void 0 : _b4.hiddenItemStrategy) !== 0) { + extraSecondary[i] = action; + } + } + } + } + if (((_c2 = this._options) === null || _c2 === void 0 ? void 0 : _c2.overflowBehavior) !== void 0) { + const exemptedIds = intersection(new Set(this._options.overflowBehavior.exempted), Iterable.map(primary, (a3) => a3 === null || a3 === void 0 ? void 0 : a3.id)); + const maxItems = this._options.overflowBehavior.maxItems - exemptedIds.size; + let count = 0; + for (let i = 0; i < primary.length; i++) { + const action = primary[i]; + if (!action) { + continue; + } + count++; + if (exemptedIds.has(action.id)) { + continue; + } + if (count >= maxItems) { + primary[i] = void 0; + extraSecondary[i] = action; + } + } + } + coalesceInPlace(primary); + coalesceInPlace(extraSecondary); + super.setActions(primary, Separator.join(extraSecondary, secondary)); + if (toggleActions.length > 0 || primary.length > 0) { + this._sessionDisposables.add(addDisposableListener(this.getElement(), "contextmenu", (e) => { + var _a11, _b5, _c3, _d2, _e2; + const event = new StandardMouseEvent(getWindow(this.getElement()), e); + const action = this.getItemAction(event.target); + if (!action) { + return; + } + event.preventDefault(); + event.stopPropagation(); + const primaryActions = []; + if (action instanceof MenuItemAction && action.menuKeybinding) { + primaryActions.push(action.menuKeybinding); + } else if (!(action instanceof SubmenuItemAction || action instanceof ToggleMenuAction)) { + primaryActions.push(createConfigureKeybindingAction(action.id, void 0, this._commandService, this._keybindingService)); + } + if (toggleActions.length > 0) { + let noHide = false; + if (toggleActionsCheckedCount === 1 && ((_a11 = this._options) === null || _a11 === void 0 ? void 0 : _a11.hiddenItemStrategy) === 0) { + noHide = true; + for (let i = 0; i < toggleActions.length; i++) { + if (toggleActions[i].checked) { + toggleActions[i] = toAction({ + id: action.id, + label: action.label, + checked: true, + enabled: false, + run() { + } + }); + break; + } + } + } + if (!noHide && (action instanceof MenuItemAction || action instanceof SubmenuItemAction)) { + if (!action.hideActions) { + return; + } + primaryActions.push(action.hideActions.hide); + } else { + primaryActions.push(toAction({ + id: "label", + label: localize("hide", "Hide"), + enabled: false, + run() { + } + })); + } + } + const actions = Separator.join(primaryActions, toggleActions); + if (((_b5 = this._options) === null || _b5 === void 0 ? void 0 : _b5.resetMenu) && !menuIds) { + menuIds = [this._options.resetMenu]; + } + if (someAreHidden && menuIds) { + actions.push(new Separator()); + actions.push(toAction({ + id: "resetThisMenu", + label: localize("resetThisMenu", "Reset Menu"), + run: () => this._menuService.resetHiddenStates(menuIds) + })); + } + if (actions.length === 0) { + return; + } + this._contextMenuService.showContextMenu({ + getAnchor: () => event, + getActions: () => actions, + // add context menu actions (iff appicable) + menuId: (_c3 = this._options) === null || _c3 === void 0 ? void 0 : _c3.contextMenu, + menuActionOptions: __spreadValues({ renderShortTitle: true }, (_d2 = this._options) === null || _d2 === void 0 ? void 0 : _d2.menuOptions), + skipTelemetry: typeof ((_e2 = this._options) === null || _e2 === void 0 ? void 0 : _e2.telemetrySource) === "string", + contextKeyService: this._contextKeyService + }); + })); + } + } + }; + WorkbenchToolBar = __decorate52([ + __param46(2, IMenuService), + __param46(3, IContextKeyService), + __param46(4, IContextMenuService), + __param46(5, IKeybindingService), + __param46(6, ICommandService), + __param46(7, ITelemetryService) + ], WorkbenchToolBar); + MenuWorkbenchToolBar = class MenuWorkbenchToolBar2 extends WorkbenchToolBar { + constructor(container, menuId, options2, menuService, contextKeyService, contextMenuService, keybindingService, commandService, telemetryService) { + super(container, __spreadValues({ resetMenu: menuId }, options2), menuService, contextKeyService, contextMenuService, keybindingService, commandService, telemetryService); + this._onDidChangeMenuItems = this._store.add(new Emitter()); + this.onDidChangeMenuItems = this._onDidChangeMenuItems.event; + const menu = this._store.add(menuService.createMenu(menuId, contextKeyService, { emitEventsForSubmenuChanges: true })); + const updateToolbar = () => { + var _a10, _b4, _c2; + const primary = []; + const secondary = []; + createAndFillInActionBarActions(menu, options2 === null || options2 === void 0 ? void 0 : options2.menuOptions, { primary, secondary }, (_a10 = options2 === null || options2 === void 0 ? void 0 : options2.toolbarOptions) === null || _a10 === void 0 ? void 0 : _a10.primaryGroup, (_b4 = options2 === null || options2 === void 0 ? void 0 : options2.toolbarOptions) === null || _b4 === void 0 ? void 0 : _b4.shouldInlineSubmenu, (_c2 = options2 === null || options2 === void 0 ? void 0 : options2.toolbarOptions) === null || _c2 === void 0 ? void 0 : _c2.useSeparatorsInPrimaryActions); + container.classList.toggle("has-no-actions", primary.length === 0 && secondary.length === 0); + super.setActions(primary, secondary); + }; + this._store.add(menu.onDidChange(() => { + updateToolbar(); + this._onDidChangeMenuItems.fire(this); + })); + updateToolbar(); + } + /** + * @deprecated The WorkbenchToolBar does not support this method because it works with menus. + */ + setActions() { + throw new BugIndicatingError("This toolbar is populated from a menu."); + } + }; + MenuWorkbenchToolBar = __decorate52([ + __param46(3, IMenuService), + __param46(4, IContextKeyService), + __param46(5, IContextMenuService), + __param46(6, IKeybindingService), + __param46(7, ICommandService), + __param46(8, ITelemetryService) + ], MenuWorkbenchToolBar); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/features/gutterFeature.js +var __decorate53, __param47, emptyArr2, width, DiffEditorGutter, DiffGutterItem, DiffToolBar; +var init_gutterFeature = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/features/gutterFeature.js"() { + init_dom(); + init_lifecycle(); + init_observable(); + init_derived(); + init_diffEditorSash(); + init_utils4(); + init_editorGutter(); + init_utils5(); + init_lineRange(); + init_offsetRange(); + init_range(); + init_textEdit(); + init_rangeMapping(); + init_textModelText(); + init_toolbar3(); + init_actions2(); + init_contextkey(); + init_hover(); + init_instantiation(); + __decorate53 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param47 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + emptyArr2 = []; + width = 35; + DiffEditorGutter = class DiffEditorGutter2 extends Disposable { + constructor(diffEditorRoot, _diffModel, _editors, _options, _sashLayout, _boundarySashes, _instantiationService, _contextKeyService, _menuService) { + super(); + this._diffModel = _diffModel; + this._editors = _editors; + this._options = _options; + this._sashLayout = _sashLayout; + this._boundarySashes = _boundarySashes; + this._instantiationService = _instantiationService; + this._contextKeyService = _contextKeyService; + this._menuService = _menuService; + this._menu = this._register(this._menuService.createMenu(MenuId.DiffEditorHunkToolbar, this._contextKeyService)); + this._actions = observableFromEvent(this._menu.onDidChange, () => this._menu.getActions()); + this._hasActions = this._actions.map((a3) => a3.length > 0); + this._showSash = derived(this, (reader) => this._options.renderSideBySide.read(reader) && this._hasActions.read(reader)); + this.width = derived(this, (reader) => this._hasActions.read(reader) ? width : 0); + this.elements = h("div.gutter@gutter", { style: { position: "absolute", height: "100%", width: width + "px" } }, []); + this._currentDiff = derived(this, (reader) => { + var _a10; + const model = this._diffModel.read(reader); + if (!model) { + return void 0; + } + const mappings = (_a10 = model.diff.read(reader)) === null || _a10 === void 0 ? void 0 : _a10.mappings; + const cursorPosition = this._editors.modifiedCursor.read(reader); + if (!cursorPosition) { + return void 0; + } + return mappings === null || mappings === void 0 ? void 0 : mappings.find((m) => m.lineRangeMapping.modified.contains(cursorPosition.lineNumber)); + }); + this._selectedDiffs = derived(this, (reader) => { + const model = this._diffModel.read(reader); + const diff = model === null || model === void 0 ? void 0 : model.diff.read(reader); + if (!diff) { + return emptyArr2; + } + const selections = this._editors.modifiedSelections.read(reader); + if (selections.every((s) => s.isEmpty())) { + return emptyArr2; + } + const selectedLineNumbers = new LineRangeSet(selections.map((s) => LineRange.fromRangeInclusive(s))); + const selectedMappings = diff.mappings.filter((m) => m.lineRangeMapping.innerChanges && selectedLineNumbers.intersects(m.lineRangeMapping.modified)); + const result = selectedMappings.map((mapping) => ({ + mapping, + rangeMappings: mapping.lineRangeMapping.innerChanges.filter((c) => selections.some((s) => Range.areIntersecting(c.modifiedRange, s))) + })); + if (result.length === 0 || result.every((r) => r.rangeMappings.length === 0)) { + return emptyArr2; + } + return result; + }); + this._register(prependRemoveOnDispose(diffEditorRoot, this.elements.root)); + this._register(addDisposableListener(this.elements.root, "click", () => { + this._editors.modified.focus(); + })); + this._register(applyStyle(this.elements.root, { display: this._hasActions.map((a3) => a3 ? "block" : "none") })); + derivedDisposable(this, (reader) => { + const showSash = this._showSash.read(reader); + return !showSash ? void 0 : new DiffEditorSash(diffEditorRoot, this._sashLayout.dimensions, this._options.enableSplitViewResizing, this._boundarySashes, derivedWithSetter(this, (reader2) => this._sashLayout.sashLeft.read(reader2) - width, (v, tx) => this._sashLayout.sashLeft.set(v + width, tx)), () => this._sashLayout.resetSash()); + }).recomputeInitiallyAndOnChange(this._store); + this._register(new EditorGutter(this._editors.modified, this.elements.root, { + getIntersectingGutterItems: (range2, reader) => { + const model = this._diffModel.read(reader); + if (!model) { + return []; + } + const diffs = model.diff.read(reader); + if (!diffs) { + return []; + } + const selection = this._selectedDiffs.read(reader); + if (selection.length > 0) { + const m = DetailedLineRangeMapping.fromRangeMappings(selection.flatMap((s) => s.rangeMappings)); + return [ + new DiffGutterItem(m, true, MenuId.DiffEditorSelectionToolbar, void 0, model.model.original.uri, model.model.modified.uri) + ]; + } + const currentDiff = this._currentDiff.read(reader); + return diffs.mappings.map((m) => new DiffGutterItem(m.lineRangeMapping.withInnerChangesFromLineRanges(), m.lineRangeMapping === (currentDiff === null || currentDiff === void 0 ? void 0 : currentDiff.lineRangeMapping), MenuId.DiffEditorHunkToolbar, void 0, model.model.original.uri, model.model.modified.uri)); + }, + createView: (item, target) => { + return this._instantiationService.createInstance(DiffToolBar, item, target, this); + } + })); + this._register(addDisposableListener(this.elements.gutter, EventType.MOUSE_WHEEL, (e) => { + if (this._editors.modified.getOption( + 103 + /* EditorOption.scrollbar */ + ).handleMouseWheel) { + this._editors.modified.delegateScrollFromMouseWheelEvent(e); + } + }, { passive: false })); + } + computeStagedValue(mapping) { + var _a10; + const c = (_a10 = mapping.innerChanges) !== null && _a10 !== void 0 ? _a10 : []; + const modified = new TextModelText(this._editors.modifiedModel.get()); + const original = new TextModelText(this._editors.original.getModel()); + const edit = new TextEdit(c.map((c2) => c2.toTextEdit(modified))); + const value = edit.apply(original); + return value; + } + layout(left) { + this.elements.gutter.style.left = left + "px"; + } + }; + DiffEditorGutter = __decorate53([ + __param47(6, IInstantiationService), + __param47(7, IContextKeyService), + __param47(8, IMenuService) + ], DiffEditorGutter); + DiffGutterItem = class { + constructor(mapping, showAlways, menuId, rangeOverride, originalUri, modifiedUri) { + this.mapping = mapping; + this.showAlways = showAlways; + this.menuId = menuId; + this.rangeOverride = rangeOverride; + this.originalUri = originalUri; + this.modifiedUri = modifiedUri; + } + get id() { + return this.mapping.modified.toString(); + } + get range() { + var _a10; + return (_a10 = this.rangeOverride) !== null && _a10 !== void 0 ? _a10 : this.mapping.modified; + } + }; + DiffToolBar = class DiffToolBar2 extends Disposable { + constructor(_item, target, gutter, instantiationService) { + super(); + this._item = _item; + this._elements = h("div.gutterItem", { style: { height: "20px", width: "34px" } }, [ + h("div.background@background", {}, []), + h("div.buttons@buttons", {}, []) + ]); + this._showAlways = this._item.map(this, (item) => item.showAlways); + this._menuId = this._item.map(this, (item) => item.menuId); + this._isSmall = observableValue(this, false); + this._lastItemRange = void 0; + this._lastViewRange = void 0; + const hoverDelegate = this._register(instantiationService.createInstance(WorkbenchHoverDelegate, "element", true, { position: { + hoverPosition: 1 + /* HoverPosition.RIGHT */ + } })); + this._register(appendRemoveOnDispose(target, this._elements.root)); + this._register(autorun((reader) => { + const showAlways = this._showAlways.read(reader); + this._elements.root.classList.toggle("noTransition", true); + this._elements.root.classList.toggle("showAlways", showAlways); + setTimeout(() => { + this._elements.root.classList.toggle("noTransition", false); + }, 0); + })); + this._register(autorunWithStore((reader, store) => { + this._elements.buttons.replaceChildren(); + const i = store.add(instantiationService.createInstance(MenuWorkbenchToolBar, this._elements.buttons, this._menuId.read(reader), { + orientation: 1, + hoverDelegate, + toolbarOptions: { + primaryGroup: (g) => g.startsWith("primary") + }, + overflowBehavior: { maxItems: this._isSmall.read(reader) ? 1 : 3 }, + hiddenItemStrategy: 0, + actionRunner: new ActionRunnerWithContext(() => { + const item = this._item.get(); + const mapping = item.mapping; + return { + mapping, + originalWithModifiedChanges: gutter.computeStagedValue(mapping), + originalUri: item.originalUri, + modifiedUri: item.modifiedUri + }; + }), + menuOptions: { + shouldForwardArgs: true + } + })); + store.add(i.onDidChangeMenuItems(() => { + if (this._lastItemRange) { + this.layout(this._lastItemRange, this._lastViewRange); + } + })); + })); + } + layout(itemRange, viewRange) { + this._lastItemRange = itemRange; + this._lastViewRange = viewRange; + let itemHeight = this._elements.buttons.clientHeight; + this._isSmall.set(this._item.get().mapping.original.startLineNumber === 1 && itemRange.length < 30, void 0); + itemHeight = this._elements.buttons.clientHeight; + const middleHeight = itemRange.length / 2 - itemHeight / 2; + const margin = itemHeight; + let effectiveCheckboxTop = itemRange.start + middleHeight; + const preferredViewPortRange = OffsetRange.tryCreate(margin, viewRange.endExclusive - margin - itemHeight); + const preferredParentRange = OffsetRange.tryCreate(itemRange.start + margin, itemRange.endExclusive - itemHeight - margin); + if (preferredParentRange && preferredViewPortRange && preferredParentRange.start < preferredParentRange.endExclusive) { + effectiveCheckboxTop = preferredViewPortRange.clip(effectiveCheckboxTop); + effectiveCheckboxTop = preferredParentRange.clip(effectiveCheckboxTop); + } + this._elements.buttons.style.top = `${effectiveCheckboxTop - itemRange.start}px`; + } + }; + DiffToolBar = __decorate53([ + __param47(3, IInstantiationService) + ], DiffToolBar); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature.js +var __decorate54, __param48, HideUnchangedRegionsFeature_1, HideUnchangedRegionsFeature, CollapsedCodeOverlayWidget; +var init_hideUnchangedRegionsFeature = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature.js"() { + init_dom(); + init_iconLabels(); + init_codicons(); + init_htmlContent(); + init_lifecycle(); + init_observable(); + init_derived(); + init_themables(); + init_types(); + init_utils4(); + init_lineRange(); + init_position(); + init_range(); + init_languages(); + init_nls(); + init_instantiation(); + __decorate54 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param48 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + HideUnchangedRegionsFeature = HideUnchangedRegionsFeature_1 = class HideUnchangedRegionsFeature2 extends Disposable { + static setBreadcrumbsSourceFactory(factory) { + this._breadcrumbsSourceFactory.set(factory, void 0); + } + get isUpdatingHiddenAreas() { + return this._isUpdatingHiddenAreas; + } + constructor(_editors, _diffModel, _options, _instantiationService) { + super(); + this._editors = _editors; + this._diffModel = _diffModel; + this._options = _options; + this._instantiationService = _instantiationService; + this._modifiedOutlineSource = derivedDisposable(this, (reader) => { + const m = this._editors.modifiedModel.read(reader); + const factory = HideUnchangedRegionsFeature_1._breadcrumbsSourceFactory.read(reader); + return !m || !factory ? void 0 : factory(m, this._instantiationService); + }); + this._isUpdatingHiddenAreas = false; + this._register(this._editors.original.onDidChangeCursorPosition((e) => { + if (e.reason === 1) { + return; + } + const m = this._diffModel.get(); + transaction((tx) => { + for (const s of this._editors.original.getSelections() || []) { + m === null || m === void 0 ? void 0 : m.ensureOriginalLineIsVisible(s.getStartPosition().lineNumber, 0, tx); + m === null || m === void 0 ? void 0 : m.ensureOriginalLineIsVisible(s.getEndPosition().lineNumber, 0, tx); + } + }); + })); + this._register(this._editors.modified.onDidChangeCursorPosition((e) => { + if (e.reason === 1) { + return; + } + const m = this._diffModel.get(); + transaction((tx) => { + for (const s of this._editors.modified.getSelections() || []) { + m === null || m === void 0 ? void 0 : m.ensureModifiedLineIsVisible(s.getStartPosition().lineNumber, 0, tx); + m === null || m === void 0 ? void 0 : m.ensureModifiedLineIsVisible(s.getEndPosition().lineNumber, 0, tx); + } + }); + })); + const unchangedRegions = this._diffModel.map((m, reader) => { + var _a10, _b4; + const regions = (_a10 = m === null || m === void 0 ? void 0 : m.unchangedRegions.read(reader)) !== null && _a10 !== void 0 ? _a10 : []; + if (regions.length === 1 && regions[0].modifiedLineNumber === 1 && regions[0].lineCount === ((_b4 = this._editors.modifiedModel.read(reader)) === null || _b4 === void 0 ? void 0 : _b4.getLineCount())) { + return []; + } + return regions; + }); + this.viewZones = derivedWithStore(this, (reader, store) => { + const modifiedOutlineSource = this._modifiedOutlineSource.read(reader); + if (!modifiedOutlineSource) { + return { origViewZones: [], modViewZones: [] }; + } + const origViewZones = []; + const modViewZones = []; + const sideBySide = this._options.renderSideBySide.read(reader); + const curUnchangedRegions = unchangedRegions.read(reader); + for (const r of curUnchangedRegions) { + if (r.shouldHideControls(reader)) { + continue; + } + { + const d = derived(this, (reader2) => ( + /** @description hiddenOriginalRangeStart */ + r.getHiddenOriginalRange(reader2).startLineNumber - 1 + )); + const origVz = new PlaceholderViewZone(d, 24); + origViewZones.push(origVz); + store.add(new CollapsedCodeOverlayWidget(this._editors.original, origVz, r, r.originalUnchangedRange, !sideBySide, modifiedOutlineSource, (l) => this._diffModel.get().ensureModifiedLineIsVisible(l, 2, void 0), this._options)); + } + { + const d = derived(this, (reader2) => ( + /** @description hiddenModifiedRangeStart */ + r.getHiddenModifiedRange(reader2).startLineNumber - 1 + )); + const modViewZone = new PlaceholderViewZone(d, 24); + modViewZones.push(modViewZone); + store.add(new CollapsedCodeOverlayWidget(this._editors.modified, modViewZone, r, r.modifiedUnchangedRange, false, modifiedOutlineSource, (l) => this._diffModel.get().ensureModifiedLineIsVisible(l, 2, void 0), this._options)); + } + } + return { origViewZones, modViewZones }; + }); + const unchangedLinesDecoration = { + description: "unchanged lines", + className: "diff-unchanged-lines", + isWholeLine: true + }; + const unchangedLinesDecorationShow = { + description: "Fold Unchanged", + glyphMarginHoverMessage: new MarkdownString(void 0, { isTrusted: true, supportThemeIcons: true }).appendMarkdown(localize("foldUnchanged", "Fold Unchanged Region")), + glyphMarginClassName: "fold-unchanged " + ThemeIcon.asClassName(Codicon.fold), + zIndex: 10001 + }; + this._register(applyObservableDecorations(this._editors.original, derived(this, (reader) => { + const curUnchangedRegions = unchangedRegions.read(reader); + const result = curUnchangedRegions.map((r) => ({ + range: r.originalUnchangedRange.toInclusiveRange(), + options: unchangedLinesDecoration + })); + for (const r of curUnchangedRegions) { + if (r.shouldHideControls(reader)) { + result.push({ + range: Range.fromPositions(new Position(r.originalLineNumber, 1)), + options: unchangedLinesDecorationShow + }); + } + } + return result; + }))); + this._register(applyObservableDecorations(this._editors.modified, derived(this, (reader) => { + const curUnchangedRegions = unchangedRegions.read(reader); + const result = curUnchangedRegions.map((r) => ({ + range: r.modifiedUnchangedRange.toInclusiveRange(), + options: unchangedLinesDecoration + })); + for (const r of curUnchangedRegions) { + if (r.shouldHideControls(reader)) { + result.push({ + range: LineRange.ofLength(r.modifiedLineNumber, 1).toInclusiveRange(), + options: unchangedLinesDecorationShow + }); + } + } + return result; + }))); + this._register(autorun((reader) => { + const curUnchangedRegions = unchangedRegions.read(reader); + this._isUpdatingHiddenAreas = true; + try { + this._editors.original.setHiddenAreas(curUnchangedRegions.map((r) => r.getHiddenOriginalRange(reader).toInclusiveRange()).filter(isDefined)); + this._editors.modified.setHiddenAreas(curUnchangedRegions.map((r) => r.getHiddenModifiedRange(reader).toInclusiveRange()).filter(isDefined)); + } finally { + this._isUpdatingHiddenAreas = false; + } + })); + this._register(this._editors.modified.onMouseUp((event) => { + var _a10; + if (!event.event.rightButton && event.target.position && ((_a10 = event.target.element) === null || _a10 === void 0 ? void 0 : _a10.className.includes("fold-unchanged"))) { + const lineNumber = event.target.position.lineNumber; + const model = this._diffModel.get(); + if (!model) { + return; + } + const region = model.unchangedRegions.get().find((r) => r.modifiedUnchangedRange.includes(lineNumber)); + if (!region) { + return; + } + region.collapseAll(void 0); + event.event.stopPropagation(); + event.event.preventDefault(); + } + })); + this._register(this._editors.original.onMouseUp((event) => { + var _a10; + if (!event.event.rightButton && event.target.position && ((_a10 = event.target.element) === null || _a10 === void 0 ? void 0 : _a10.className.includes("fold-unchanged"))) { + const lineNumber = event.target.position.lineNumber; + const model = this._diffModel.get(); + if (!model) { + return; + } + const region = model.unchangedRegions.get().find((r) => r.originalUnchangedRange.includes(lineNumber)); + if (!region) { + return; + } + region.collapseAll(void 0); + event.event.stopPropagation(); + event.event.preventDefault(); + } + })); + } + }; + HideUnchangedRegionsFeature._breadcrumbsSourceFactory = observableValue("breadcrumbsSourceFactory", void 0); + HideUnchangedRegionsFeature = HideUnchangedRegionsFeature_1 = __decorate54([ + __param48(3, IInstantiationService) + ], HideUnchangedRegionsFeature); + CollapsedCodeOverlayWidget = class extends ViewZoneOverlayWidget { + constructor(_editor, _viewZone, _unchangedRegion, _unchangedRegionRange, _hide, _modifiedOutlineSource, _revealModifiedHiddenLine, _options) { + const root = h("div.diff-hidden-lines-widget"); + super(_editor, _viewZone, root.root); + this._editor = _editor; + this._unchangedRegion = _unchangedRegion; + this._unchangedRegionRange = _unchangedRegionRange; + this._hide = _hide; + this._modifiedOutlineSource = _modifiedOutlineSource; + this._revealModifiedHiddenLine = _revealModifiedHiddenLine; + this._options = _options; + this._nodes = h("div.diff-hidden-lines", [ + h("div.top@top", { title: localize("diff.hiddenLines.top", "Click or drag to show more above") }), + h("div.center@content", { style: { display: "flex" } }, [ + h("div@first", { style: { display: "flex", justifyContent: "center", alignItems: "center", flexShrink: "0" } }, [$("a", { title: localize("showUnchangedRegion", "Show Unchanged Region"), role: "button", onclick: () => { + this._unchangedRegion.showAll(void 0); + } }, ...renderLabelWithIcons("$(unfold)"))]), + h("div@others", { style: { display: "flex", justifyContent: "center", alignItems: "center" } }) + ]), + h("div.bottom@bottom", { title: localize("diff.bottom", "Click or drag to show more below"), role: "button" }) + ]); + root.root.appendChild(this._nodes.root); + const layoutInfo = observableFromEvent(this._editor.onDidLayoutChange, () => this._editor.getLayoutInfo()); + if (!this._hide) { + this._register(applyStyle(this._nodes.first, { width: layoutInfo.map((l) => l.contentLeft) })); + } else { + reset(this._nodes.first); + } + this._register(autorun((reader) => { + const isFullyRevealed = this._unchangedRegion.visibleLineCountTop.read(reader) + this._unchangedRegion.visibleLineCountBottom.read(reader) === this._unchangedRegion.lineCount; + this._nodes.bottom.classList.toggle("canMoveTop", !isFullyRevealed); + this._nodes.bottom.classList.toggle("canMoveBottom", this._unchangedRegion.visibleLineCountBottom.read(reader) > 0); + this._nodes.top.classList.toggle("canMoveTop", this._unchangedRegion.visibleLineCountTop.read(reader) > 0); + this._nodes.top.classList.toggle("canMoveBottom", !isFullyRevealed); + const isDragged = this._unchangedRegion.isDragged.read(reader); + const domNode = this._editor.getDomNode(); + if (domNode) { + domNode.classList.toggle("draggingUnchangedRegion", !!isDragged); + if (isDragged === "top") { + domNode.classList.toggle("canMoveTop", this._unchangedRegion.visibleLineCountTop.read(reader) > 0); + domNode.classList.toggle("canMoveBottom", !isFullyRevealed); + } else if (isDragged === "bottom") { + domNode.classList.toggle("canMoveTop", !isFullyRevealed); + domNode.classList.toggle("canMoveBottom", this._unchangedRegion.visibleLineCountBottom.read(reader) > 0); + } else { + domNode.classList.toggle("canMoveTop", false); + domNode.classList.toggle("canMoveBottom", false); + } + } + })); + const editor2 = this._editor; + this._register(addDisposableListener(this._nodes.top, "mousedown", (e) => { + if (e.button !== 0) { + return; + } + this._nodes.top.classList.toggle("dragging", true); + this._nodes.root.classList.toggle("dragging", true); + e.preventDefault(); + const startTop = e.clientY; + let didMove = false; + const cur = this._unchangedRegion.visibleLineCountTop.get(); + this._unchangedRegion.isDragged.set("top", void 0); + const window2 = getWindow(this._nodes.top); + const mouseMoveListener = addDisposableListener(window2, "mousemove", (e2) => { + const currentTop = e2.clientY; + const delta = currentTop - startTop; + didMove = didMove || Math.abs(delta) > 2; + const lineDelta = Math.round(delta / editor2.getOption( + 67 + /* EditorOption.lineHeight */ + )); + const newVal = Math.max(0, Math.min(cur + lineDelta, this._unchangedRegion.getMaxVisibleLineCountTop())); + this._unchangedRegion.visibleLineCountTop.set(newVal, void 0); + }); + const mouseUpListener = addDisposableListener(window2, "mouseup", (e2) => { + if (!didMove) { + this._unchangedRegion.showMoreAbove(this._options.hideUnchangedRegionsRevealLineCount.get(), void 0); + } + this._nodes.top.classList.toggle("dragging", false); + this._nodes.root.classList.toggle("dragging", false); + this._unchangedRegion.isDragged.set(void 0, void 0); + mouseMoveListener.dispose(); + mouseUpListener.dispose(); + }); + })); + this._register(addDisposableListener(this._nodes.bottom, "mousedown", (e) => { + if (e.button !== 0) { + return; + } + this._nodes.bottom.classList.toggle("dragging", true); + this._nodes.root.classList.toggle("dragging", true); + e.preventDefault(); + const startTop = e.clientY; + let didMove = false; + const cur = this._unchangedRegion.visibleLineCountBottom.get(); + this._unchangedRegion.isDragged.set("bottom", void 0); + const window2 = getWindow(this._nodes.bottom); + const mouseMoveListener = addDisposableListener(window2, "mousemove", (e2) => { + const currentTop = e2.clientY; + const delta = currentTop - startTop; + didMove = didMove || Math.abs(delta) > 2; + const lineDelta = Math.round(delta / editor2.getOption( + 67 + /* EditorOption.lineHeight */ + )); + const newVal = Math.max(0, Math.min(cur - lineDelta, this._unchangedRegion.getMaxVisibleLineCountBottom())); + const top = this._unchangedRegionRange.endLineNumberExclusive > editor2.getModel().getLineCount() ? editor2.getContentHeight() : editor2.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive); + this._unchangedRegion.visibleLineCountBottom.set(newVal, void 0); + const top2 = this._unchangedRegionRange.endLineNumberExclusive > editor2.getModel().getLineCount() ? editor2.getContentHeight() : editor2.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive); + editor2.setScrollTop(editor2.getScrollTop() + (top2 - top)); + }); + const mouseUpListener = addDisposableListener(window2, "mouseup", (e2) => { + this._unchangedRegion.isDragged.set(void 0, void 0); + if (!didMove) { + const top = editor2.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive); + this._unchangedRegion.showMoreBelow(this._options.hideUnchangedRegionsRevealLineCount.get(), void 0); + const top2 = editor2.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive); + editor2.setScrollTop(editor2.getScrollTop() + (top2 - top)); + } + this._nodes.bottom.classList.toggle("dragging", false); + this._nodes.root.classList.toggle("dragging", false); + mouseMoveListener.dispose(); + mouseUpListener.dispose(); + }); + })); + this._register(autorun((reader) => { + const children = []; + if (!this._hide) { + const lineCount = _unchangedRegion.getHiddenModifiedRange(reader).length; + const linesHiddenText = localize("hiddenLines", "{0} hidden lines", lineCount); + const span = $("span", { title: localize("diff.hiddenLines.expandAll", "Double click to unfold") }, linesHiddenText); + span.addEventListener("dblclick", (e) => { + if (e.button !== 0) { + return; + } + e.preventDefault(); + this._unchangedRegion.showAll(void 0); + }); + children.push(span); + const range2 = this._unchangedRegion.getHiddenModifiedRange(reader); + const items = this._modifiedOutlineSource.getBreadcrumbItems(range2, reader); + if (items.length > 0) { + children.push($("span", void 0, "\xA0\xA0|\xA0\xA0")); + for (let i = 0; i < items.length; i++) { + const item = items[i]; + const icon = SymbolKinds.toIcon(item.kind); + const divItem = h("div.breadcrumb-item", { + style: { display: "flex", alignItems: "center" } + }, [ + renderIcon(icon), + "\xA0", + item.name, + ...i === items.length - 1 ? [] : [renderIcon(Codicon.chevronRight)] + ]).root; + children.push(divItem); + divItem.onclick = () => { + this._revealModifiedHiddenLine(item.startLineNumber); + }; + } + } + } + reset(this._nodes.others, ...children); + })); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/features/overviewRulerFeature.js +var __decorate55, __param49, OverviewRulerFeature_1, OverviewRulerFeature; +var init_overviewRulerFeature = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/features/overviewRulerFeature.js"() { + init_dom(); + init_fastDomNode(); + init_scrollbarState(); + init_lifecycle(); + init_observable(); + init_utils4(); + init_position(); + init_overviewZoneManager(); + init_colorRegistry(); + init_themeService(); + __decorate55 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param49 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + OverviewRulerFeature = OverviewRulerFeature_1 = class OverviewRulerFeature2 extends Disposable { + constructor(_editors, _rootElement, _diffModel, _rootWidth, _rootHeight, _modifiedEditorLayoutInfo, _themeService) { + super(); + this._editors = _editors; + this._rootElement = _rootElement; + this._diffModel = _diffModel; + this._rootWidth = _rootWidth; + this._rootHeight = _rootHeight; + this._modifiedEditorLayoutInfo = _modifiedEditorLayoutInfo; + this._themeService = _themeService; + this.width = OverviewRulerFeature_1.ENTIRE_DIFF_OVERVIEW_WIDTH; + const currentColorTheme = observableFromEvent(this._themeService.onDidColorThemeChange, () => this._themeService.getColorTheme()); + const currentColors = derived((reader) => { + const theme = currentColorTheme.read(reader); + const insertColor = theme.getColor(diffOverviewRulerInserted) || (theme.getColor(diffInserted) || defaultInsertColor).transparent(2); + const removeColor = theme.getColor(diffOverviewRulerRemoved) || (theme.getColor(diffRemoved) || defaultRemoveColor).transparent(2); + return { insertColor, removeColor }; + }); + const viewportDomElement = createFastDomNode(document.createElement("div")); + viewportDomElement.setClassName("diffViewport"); + viewportDomElement.setPosition("absolute"); + const diffOverviewRoot = h("div.diffOverview", { + style: { position: "absolute", top: "0px", width: OverviewRulerFeature_1.ENTIRE_DIFF_OVERVIEW_WIDTH + "px" } + }).root; + this._register(appendRemoveOnDispose(diffOverviewRoot, viewportDomElement.domNode)); + this._register(addStandardDisposableListener(diffOverviewRoot, EventType.POINTER_DOWN, (e) => { + this._editors.modified.delegateVerticalScrollbarPointerDown(e); + })); + this._register(addDisposableListener(diffOverviewRoot, EventType.MOUSE_WHEEL, (e) => { + this._editors.modified.delegateScrollFromMouseWheelEvent(e); + }, { passive: false })); + this._register(appendRemoveOnDispose(this._rootElement, diffOverviewRoot)); + this._register(autorunWithStore((reader, store) => { + const m = this._diffModel.read(reader); + const originalOverviewRuler = this._editors.original.createOverviewRuler("original diffOverviewRuler"); + if (originalOverviewRuler) { + store.add(originalOverviewRuler); + store.add(appendRemoveOnDispose(diffOverviewRoot, originalOverviewRuler.getDomNode())); + } + const modifiedOverviewRuler = this._editors.modified.createOverviewRuler("modified diffOverviewRuler"); + if (modifiedOverviewRuler) { + store.add(modifiedOverviewRuler); + store.add(appendRemoveOnDispose(diffOverviewRoot, modifiedOverviewRuler.getDomNode())); + } + if (!originalOverviewRuler || !modifiedOverviewRuler) { + return; + } + const origViewZonesChanged = observableSignalFromEvent("viewZoneChanged", this._editors.original.onDidChangeViewZones); + const modViewZonesChanged = observableSignalFromEvent("viewZoneChanged", this._editors.modified.onDidChangeViewZones); + const origHiddenRangesChanged = observableSignalFromEvent("hiddenRangesChanged", this._editors.original.onDidChangeHiddenAreas); + const modHiddenRangesChanged = observableSignalFromEvent("hiddenRangesChanged", this._editors.modified.onDidChangeHiddenAreas); + store.add(autorun((reader2) => { + var _a10; + origViewZonesChanged.read(reader2); + modViewZonesChanged.read(reader2); + origHiddenRangesChanged.read(reader2); + modHiddenRangesChanged.read(reader2); + const colors2 = currentColors.read(reader2); + const diff = (_a10 = m === null || m === void 0 ? void 0 : m.diff.read(reader2)) === null || _a10 === void 0 ? void 0 : _a10.mappings; + function createZones(ranges, color, editor2) { + const vm = editor2._getViewModel(); + if (!vm) { + return []; + } + return ranges.filter((d) => d.length > 0).map((r) => { + const start = vm.coordinatesConverter.convertModelPositionToViewPosition(new Position(r.startLineNumber, 1)); + const end = vm.coordinatesConverter.convertModelPositionToViewPosition(new Position(r.endLineNumberExclusive, 1)); + const lineCount = end.lineNumber - start.lineNumber; + return new OverviewRulerZone(start.lineNumber, end.lineNumber, lineCount, color.toString()); + }); + } + const originalZones = createZones((diff || []).map((d) => d.lineRangeMapping.original), colors2.removeColor, this._editors.original); + const modifiedZones = createZones((diff || []).map((d) => d.lineRangeMapping.modified), colors2.insertColor, this._editors.modified); + originalOverviewRuler === null || originalOverviewRuler === void 0 ? void 0 : originalOverviewRuler.setZones(originalZones); + modifiedOverviewRuler === null || modifiedOverviewRuler === void 0 ? void 0 : modifiedOverviewRuler.setZones(modifiedZones); + })); + store.add(autorun((reader2) => { + const height = this._rootHeight.read(reader2); + const width2 = this._rootWidth.read(reader2); + const layoutInfo = this._modifiedEditorLayoutInfo.read(reader2); + if (layoutInfo) { + const freeSpace = OverviewRulerFeature_1.ENTIRE_DIFF_OVERVIEW_WIDTH - 2 * OverviewRulerFeature_1.ONE_OVERVIEW_WIDTH; + originalOverviewRuler.setLayout({ + top: 0, + height, + right: freeSpace + OverviewRulerFeature_1.ONE_OVERVIEW_WIDTH, + width: OverviewRulerFeature_1.ONE_OVERVIEW_WIDTH + }); + modifiedOverviewRuler.setLayout({ + top: 0, + height, + right: 0, + width: OverviewRulerFeature_1.ONE_OVERVIEW_WIDTH + }); + const scrollTop = this._editors.modifiedScrollTop.read(reader2); + const scrollHeight = this._editors.modifiedScrollHeight.read(reader2); + const scrollBarOptions = this._editors.modified.getOption( + 103 + /* EditorOption.scrollbar */ + ); + const state = new ScrollbarState(scrollBarOptions.verticalHasArrows ? scrollBarOptions.arrowSize : 0, scrollBarOptions.verticalScrollbarSize, 0, layoutInfo.height, scrollHeight, scrollTop); + viewportDomElement.setTop(state.getSliderPosition()); + viewportDomElement.setHeight(state.getSliderSize()); + } else { + viewportDomElement.setTop(0); + viewportDomElement.setHeight(0); + } + diffOverviewRoot.style.height = height + "px"; + diffOverviewRoot.style.left = width2 - OverviewRulerFeature_1.ENTIRE_DIFF_OVERVIEW_WIDTH + "px"; + viewportDomElement.setWidth(OverviewRulerFeature_1.ENTIRE_DIFF_OVERVIEW_WIDTH); + })); + })); + } + }; + OverviewRulerFeature.ONE_OVERVIEW_WIDTH = 15; + OverviewRulerFeature.ENTIRE_DIFF_OVERVIEW_WIDTH = OverviewRulerFeature_1.ONE_OVERVIEW_WIDTH * 2; + OverviewRulerFeature = OverviewRulerFeature_1 = __decorate55([ + __param49(6, IThemeService) + ], OverviewRulerFeature); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/features/revertButtonsFeature.js +var emptyArr3, RevertButtonsFeature, RevertButton; +var init_revertButtonsFeature = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/features/revertButtonsFeature.js"() { + init_dom(); + init_iconLabels(); + init_codicons(); + init_lifecycle(); + init_observable(); + init_lineRange(); + init_range(); + init_rangeMapping(); + init_model2(); + init_nls(); + emptyArr3 = []; + RevertButtonsFeature = class extends Disposable { + constructor(_editors, _diffModel, _options, _widget) { + super(); + this._editors = _editors; + this._diffModel = _diffModel; + this._options = _options; + this._widget = _widget; + this._selectedDiffs = derived(this, (reader) => { + const model = this._diffModel.read(reader); + const diff = model === null || model === void 0 ? void 0 : model.diff.read(reader); + if (!diff) { + return emptyArr3; + } + const selections = this._editors.modifiedSelections.read(reader); + if (selections.every((s) => s.isEmpty())) { + return emptyArr3; + } + const selectedLineNumbers = new LineRangeSet(selections.map((s) => LineRange.fromRangeInclusive(s))); + const selectedMappings = diff.mappings.filter((m) => m.lineRangeMapping.innerChanges && selectedLineNumbers.intersects(m.lineRangeMapping.modified)); + const result = selectedMappings.map((mapping) => ({ + mapping, + rangeMappings: mapping.lineRangeMapping.innerChanges.filter((c) => selections.some((s) => Range.areIntersecting(c.modifiedRange, s))) + })); + if (result.length === 0 || result.every((r) => r.rangeMappings.length === 0)) { + return emptyArr3; + } + return result; + }); + this._register(autorunWithStore((reader, store) => { + if (!this._options.shouldRenderOldRevertArrows.read(reader)) { + return; + } + const model = this._diffModel.read(reader); + const diff = model === null || model === void 0 ? void 0 : model.diff.read(reader); + if (!model || !diff) { + return; + } + if (model.movedTextToCompare.read(reader)) { + return; + } + const glyphWidgetsModified = []; + const selectedDiffs = this._selectedDiffs.read(reader); + const selectedDiffsSet = new Set(selectedDiffs.map((d) => d.mapping)); + if (selectedDiffs.length > 0) { + const selections = this._editors.modifiedSelections.read(reader); + const btn = store.add(new RevertButton(selections[selections.length - 1].positionLineNumber, this._widget, selectedDiffs.flatMap((d) => d.rangeMappings), true)); + this._editors.modified.addGlyphMarginWidget(btn); + glyphWidgetsModified.push(btn); + } + for (const m of diff.mappings) { + if (selectedDiffsSet.has(m)) { + continue; + } + if (!m.lineRangeMapping.modified.isEmpty && m.lineRangeMapping.innerChanges) { + const btn = store.add(new RevertButton(m.lineRangeMapping.modified.startLineNumber, this._widget, m.lineRangeMapping, false)); + this._editors.modified.addGlyphMarginWidget(btn); + glyphWidgetsModified.push(btn); + } + } + store.add(toDisposable(() => { + for (const w of glyphWidgetsModified) { + this._editors.modified.removeGlyphMarginWidget(w); + } + })); + })); + } + }; + RevertButton = class _RevertButton extends Disposable { + getId() { + return this._id; + } + constructor(_lineNumber, _widget, _diffs, _revertSelection) { + super(); + this._lineNumber = _lineNumber; + this._widget = _widget; + this._diffs = _diffs; + this._revertSelection = _revertSelection; + this._id = `revertButton${_RevertButton.counter++}`; + this._domNode = h("div.revertButton", { + title: this._revertSelection ? localize("revertSelectedChanges", "Revert Selected Changes") : localize("revertChange", "Revert Change") + }, [renderIcon(Codicon.arrowRight)]).root; + this._register(addDisposableListener(this._domNode, EventType.MOUSE_DOWN, (e) => { + if (e.button !== 2) { + e.stopPropagation(); + e.preventDefault(); + } + })); + this._register(addDisposableListener(this._domNode, EventType.MOUSE_UP, (e) => { + e.stopPropagation(); + e.preventDefault(); + })); + this._register(addDisposableListener(this._domNode, EventType.CLICK, (e) => { + if (this._diffs instanceof LineRangeMapping) { + this._widget.revert(this._diffs); + } else { + this._widget.revertRangeMappings(this._diffs); + } + e.stopPropagation(); + e.preventDefault(); + })); + } + /** + * Get the dom node of the glyph widget. + */ + getDomNode() { + return this._domNode; + } + /** + * Get the placement of the glyph widget. + */ + getPosition() { + return { + lane: GlyphMarginLane2.Right, + range: { + startColumn: 1, + startLineNumber: this._lineNumber, + endColumn: 1, + endLineNumber: this._lineNumber + }, + zIndex: 10001 + }; + } + }; + RevertButton.counter = 0; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/observable/common/platformObservableUtils.js +function bindContextKey(key, service, computeValue) { + const boundKey = key.bindTo(service); + return autorunOpts({ debugName: () => `Set Context Key "${key.key}"` }, (reader) => { + boundKey.set(computeValue(reader)); + }); +} +var init_platformObservableUtils = __esm({ + "node_modules/monaco-editor/esm/vs/platform/observable/common/platformObservableUtils.js"() { + init_observable(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/observableUtilities.js +function obsCodeEditor(editor2) { + return ObservableCodeEditor.get(editor2); +} +var ObservableCodeEditor; +var init_observableUtilities = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/observableUtilities.js"() { + init_observable(); + ObservableCodeEditor = class _ObservableCodeEditor { + /** + * Make sure that editor is not disposed yet! + */ + static get(editor2) { + let result = _ObservableCodeEditor._map.get(editor2); + if (!result) { + result = new _ObservableCodeEditor(editor2); + _ObservableCodeEditor._map.set(editor2, result); + const d = editor2.onDidDispose(() => { + _ObservableCodeEditor._map.delete(editor2); + d.dispose(); + }); + } + return result; + } + constructor(editor2) { + this.editor = editor2; + this.model = observableFromEvent(this.editor.onDidChangeModel, () => this.editor.getModel()); + } + }; + ObservableCodeEditor._map = /* @__PURE__ */ new Map(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.js +var __decorate56, __param50, DiffEditorEditors; +var init_diffEditorEditors = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.js"() { + init_event(); + init_lifecycle(); + init_observable(); + init_observableUtilities(); + init_overviewRulerFeature(); + init_editorOptions(); + init_position(); + init_nls(); + init_instantiation(); + init_keybinding(); + __decorate56 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param50 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + DiffEditorEditors = class DiffEditorEditors2 extends Disposable { + get onDidContentSizeChange() { + return this._onDidContentSizeChange.event; + } + constructor(originalEditorElement, modifiedEditorElement, _options, _argCodeEditorWidgetOptions, _createInnerEditor, _instantiationService, _keybindingService) { + super(); + this.originalEditorElement = originalEditorElement; + this.modifiedEditorElement = modifiedEditorElement; + this._options = _options; + this._argCodeEditorWidgetOptions = _argCodeEditorWidgetOptions; + this._createInnerEditor = _createInnerEditor; + this._instantiationService = _instantiationService; + this._keybindingService = _keybindingService; + this.original = this._register(this._createLeftHandSideEditor(this._options.editorOptions.get(), this._argCodeEditorWidgetOptions.originalEditor || {})); + this.modified = this._register(this._createRightHandSideEditor(this._options.editorOptions.get(), this._argCodeEditorWidgetOptions.modifiedEditor || {})); + this._onDidContentSizeChange = this._register(new Emitter()); + this.modifiedScrollTop = observableFromEvent(this.modified.onDidScrollChange, () => ( + /** @description modified.getScrollTop */ + this.modified.getScrollTop() + )); + this.modifiedScrollHeight = observableFromEvent(this.modified.onDidScrollChange, () => ( + /** @description modified.getScrollHeight */ + this.modified.getScrollHeight() + )); + this.modifiedModel = obsCodeEditor(this.modified).model; + this.modifiedSelections = observableFromEvent(this.modified.onDidChangeCursorSelection, () => { + var _a10; + return (_a10 = this.modified.getSelections()) !== null && _a10 !== void 0 ? _a10 : []; + }); + this.modifiedCursor = derivedOpts({ owner: this, equalsFn: Position.equals }, (reader) => { + var _a10, _b4; + return (_b4 = (_a10 = this.modifiedSelections.read(reader)[0]) === null || _a10 === void 0 ? void 0 : _a10.getPosition()) !== null && _b4 !== void 0 ? _b4 : new Position(1, 1); + }); + this.originalCursor = observableFromEvent(this.original.onDidChangeCursorPosition, () => { + var _a10; + return (_a10 = this.original.getPosition()) !== null && _a10 !== void 0 ? _a10 : new Position(1, 1); + }); + this._argCodeEditorWidgetOptions = null; + this._register(autorunHandleChanges({ + createEmptyChangeSummary: () => ({}), + handleChange: (ctx, changeSummary) => { + if (ctx.didChange(_options.editorOptions)) { + Object.assign(changeSummary, ctx.change.changedOptions); + } + return true; + } + }, (reader, changeSummary) => { + _options.editorOptions.read(reader); + this._options.renderSideBySide.read(reader); + this.modified.updateOptions(this._adjustOptionsForRightHandSide(reader, changeSummary)); + this.original.updateOptions(this._adjustOptionsForLeftHandSide(reader, changeSummary)); + })); + } + _createLeftHandSideEditor(options2, codeEditorWidgetOptions) { + const leftHandSideOptions = this._adjustOptionsForLeftHandSide(void 0, options2); + const editor2 = this._constructInnerEditor(this._instantiationService, this.originalEditorElement, leftHandSideOptions, codeEditorWidgetOptions); + editor2.setContextValue("isInDiffLeftEditor", true); + return editor2; + } + _createRightHandSideEditor(options2, codeEditorWidgetOptions) { + const rightHandSideOptions = this._adjustOptionsForRightHandSide(void 0, options2); + const editor2 = this._constructInnerEditor(this._instantiationService, this.modifiedEditorElement, rightHandSideOptions, codeEditorWidgetOptions); + editor2.setContextValue("isInDiffRightEditor", true); + return editor2; + } + _constructInnerEditor(instantiationService, container, options2, editorWidgetOptions) { + const editor2 = this._createInnerEditor(instantiationService, container, options2, editorWidgetOptions); + this._register(editor2.onDidContentSizeChange((e) => { + const width2 = this.original.getContentWidth() + this.modified.getContentWidth() + OverviewRulerFeature.ENTIRE_DIFF_OVERVIEW_WIDTH; + const height = Math.max(this.modified.getContentHeight(), this.original.getContentHeight()); + this._onDidContentSizeChange.fire({ + contentHeight: height, + contentWidth: width2, + contentHeightChanged: e.contentHeightChanged, + contentWidthChanged: e.contentWidthChanged + }); + })); + return editor2; + } + _adjustOptionsForLeftHandSide(_reader, changedOptions) { + const result = this._adjustOptionsForSubEditor(changedOptions); + if (!this._options.renderSideBySide.get()) { + result.wordWrapOverride1 = "off"; + result.wordWrapOverride2 = "off"; + result.stickyScroll = { enabled: false }; + result.unicodeHighlight = { nonBasicASCII: false, ambiguousCharacters: false, invisibleCharacters: false }; + } else { + result.unicodeHighlight = this._options.editorOptions.get().unicodeHighlight || {}; + result.wordWrapOverride1 = this._options.diffWordWrap.get(); + } + result.glyphMargin = this._options.renderSideBySide.get(); + if (changedOptions.originalAriaLabel) { + result.ariaLabel = changedOptions.originalAriaLabel; + } + result.ariaLabel = this._updateAriaLabel(result.ariaLabel); + result.readOnly = !this._options.originalEditable.get(); + result.dropIntoEditor = { enabled: !result.readOnly }; + result.extraEditorClassName = "original-in-monaco-diff-editor"; + return result; + } + _adjustOptionsForRightHandSide(reader, changedOptions) { + const result = this._adjustOptionsForSubEditor(changedOptions); + if (changedOptions.modifiedAriaLabel) { + result.ariaLabel = changedOptions.modifiedAriaLabel; + } + result.ariaLabel = this._updateAriaLabel(result.ariaLabel); + result.wordWrapOverride1 = this._options.diffWordWrap.get(); + result.revealHorizontalRightPadding = EditorOptions.revealHorizontalRightPadding.defaultValue + OverviewRulerFeature.ENTIRE_DIFF_OVERVIEW_WIDTH; + result.scrollbar.verticalHasArrows = false; + result.extraEditorClassName = "modified-in-monaco-diff-editor"; + return result; + } + _adjustOptionsForSubEditor(options2) { + const clonedOptions = __spreadProps(__spreadValues({}, options2), { + dimension: { + height: 0, + width: 0 + } + }); + clonedOptions.inDiffEditor = true; + clonedOptions.automaticLayout = false; + clonedOptions.scrollbar = __spreadValues({}, clonedOptions.scrollbar || {}); + clonedOptions.folding = false; + clonedOptions.codeLens = this._options.diffCodeLens.get(); + clonedOptions.fixedOverflowWidgets = true; + clonedOptions.minimap = __spreadValues({}, clonedOptions.minimap || {}); + clonedOptions.minimap.enabled = false; + if (this._options.hideUnchangedRegions.get()) { + clonedOptions.stickyScroll = { enabled: false }; + } else { + clonedOptions.stickyScroll = this._options.editorOptions.get().stickyScroll; + } + return clonedOptions; + } + _updateAriaLabel(ariaLabel) { + var _a10; + if (!ariaLabel) { + ariaLabel = ""; + } + const ariaNavigationTip = localize("diff-aria-navigation-tip", " use {0} to open the accessibility help.", (_a10 = this._keybindingService.lookupKeybinding("editor.action.accessibilityHelp")) === null || _a10 === void 0 ? void 0 : _a10.getAriaLabel()); + if (this._options.accessibilityVerbose.get()) { + return ariaLabel + ariaNavigationTip; + } else if (ariaLabel) { + return ariaLabel.replaceAll(ariaNavigationTip, ""); + } + return ""; + } + }; + DiffEditorEditors = __decorate56([ + __param50(5, IInstantiationService), + __param50(6, IKeybindingService) + ], DiffEditorEditors); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/delegatingEditorImpl.js +var DelegatingEditor; +var init_delegatingEditorImpl = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/delegatingEditorImpl.js"() { + init_event(); + init_lifecycle(); + DelegatingEditor = class _DelegatingEditor extends Disposable { + constructor() { + super(...arguments); + this._id = ++_DelegatingEditor.idCounter; + this._onDidDispose = this._register(new Emitter()); + this.onDidDispose = this._onDidDispose.event; + } + getId() { + return this.getEditorType() + ":v2:" + this._id; + } + // #region editorBrowser.IDiffEditor: Delegating to modified Editor + getVisibleColumnFromPosition(position) { + return this._targetEditor.getVisibleColumnFromPosition(position); + } + getPosition() { + return this._targetEditor.getPosition(); + } + setPosition(position, source = "api") { + this._targetEditor.setPosition(position, source); + } + revealLine(lineNumber, scrollType = 0) { + this._targetEditor.revealLine(lineNumber, scrollType); + } + revealLineInCenter(lineNumber, scrollType = 0) { + this._targetEditor.revealLineInCenter(lineNumber, scrollType); + } + revealLineInCenterIfOutsideViewport(lineNumber, scrollType = 0) { + this._targetEditor.revealLineInCenterIfOutsideViewport(lineNumber, scrollType); + } + revealLineNearTop(lineNumber, scrollType = 0) { + this._targetEditor.revealLineNearTop(lineNumber, scrollType); + } + revealPosition(position, scrollType = 0) { + this._targetEditor.revealPosition(position, scrollType); + } + revealPositionInCenter(position, scrollType = 0) { + this._targetEditor.revealPositionInCenter(position, scrollType); + } + revealPositionInCenterIfOutsideViewport(position, scrollType = 0) { + this._targetEditor.revealPositionInCenterIfOutsideViewport(position, scrollType); + } + revealPositionNearTop(position, scrollType = 0) { + this._targetEditor.revealPositionNearTop(position, scrollType); + } + getSelection() { + return this._targetEditor.getSelection(); + } + getSelections() { + return this._targetEditor.getSelections(); + } + setSelection(something, source = "api") { + this._targetEditor.setSelection(something, source); + } + setSelections(ranges, source = "api") { + this._targetEditor.setSelections(ranges, source); + } + revealLines(startLineNumber, endLineNumber, scrollType = 0) { + this._targetEditor.revealLines(startLineNumber, endLineNumber, scrollType); + } + revealLinesInCenter(startLineNumber, endLineNumber, scrollType = 0) { + this._targetEditor.revealLinesInCenter(startLineNumber, endLineNumber, scrollType); + } + revealLinesInCenterIfOutsideViewport(startLineNumber, endLineNumber, scrollType = 0) { + this._targetEditor.revealLinesInCenterIfOutsideViewport(startLineNumber, endLineNumber, scrollType); + } + revealLinesNearTop(startLineNumber, endLineNumber, scrollType = 0) { + this._targetEditor.revealLinesNearTop(startLineNumber, endLineNumber, scrollType); + } + revealRange(range2, scrollType = 0, revealVerticalInCenter = false, revealHorizontal = true) { + this._targetEditor.revealRange(range2, scrollType, revealVerticalInCenter, revealHorizontal); + } + revealRangeInCenter(range2, scrollType = 0) { + this._targetEditor.revealRangeInCenter(range2, scrollType); + } + revealRangeInCenterIfOutsideViewport(range2, scrollType = 0) { + this._targetEditor.revealRangeInCenterIfOutsideViewport(range2, scrollType); + } + revealRangeNearTop(range2, scrollType = 0) { + this._targetEditor.revealRangeNearTop(range2, scrollType); + } + revealRangeNearTopIfOutsideViewport(range2, scrollType = 0) { + this._targetEditor.revealRangeNearTopIfOutsideViewport(range2, scrollType); + } + revealRangeAtTop(range2, scrollType = 0) { + this._targetEditor.revealRangeAtTop(range2, scrollType); + } + getSupportedActions() { + return this._targetEditor.getSupportedActions(); + } + focus() { + this._targetEditor.focus(); + } + trigger(source, handlerId, payload) { + this._targetEditor.trigger(source, handlerId, payload); + } + createDecorationsCollection(decorations) { + return this._targetEditor.createDecorationsCollection(decorations); + } + changeDecorations(callback) { + return this._targetEditor.changeDecorations(callback); + } + }; + DelegatingEditor.idCounter = 0; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/diffEditorOptions.js +function validateDiffEditorOptions(options2, defaults) { + var _a10, _b4, _c2, _d2, _e2, _f3, _g2, _h2; + return { + enableSplitViewResizing: boolean(options2.enableSplitViewResizing, defaults.enableSplitViewResizing), + splitViewDefaultRatio: clampedFloat(options2.splitViewDefaultRatio, 0.5, 0.1, 0.9), + renderSideBySide: boolean(options2.renderSideBySide, defaults.renderSideBySide), + renderMarginRevertIcon: boolean(options2.renderMarginRevertIcon, defaults.renderMarginRevertIcon), + maxComputationTime: clampedInt( + options2.maxComputationTime, + defaults.maxComputationTime, + 0, + 1073741824 + /* Constants.MAX_SAFE_SMALL_INTEGER */ + ), + maxFileSize: clampedInt( + options2.maxFileSize, + defaults.maxFileSize, + 0, + 1073741824 + /* Constants.MAX_SAFE_SMALL_INTEGER */ + ), + ignoreTrimWhitespace: boolean(options2.ignoreTrimWhitespace, defaults.ignoreTrimWhitespace), + renderIndicators: boolean(options2.renderIndicators, defaults.renderIndicators), + originalEditable: boolean(options2.originalEditable, defaults.originalEditable), + diffCodeLens: boolean(options2.diffCodeLens, defaults.diffCodeLens), + renderOverviewRuler: boolean(options2.renderOverviewRuler, defaults.renderOverviewRuler), + diffWordWrap: stringSet(options2.diffWordWrap, defaults.diffWordWrap, ["off", "on", "inherit"]), + diffAlgorithm: stringSet(options2.diffAlgorithm, defaults.diffAlgorithm, ["legacy", "advanced"], { "smart": "legacy", "experimental": "advanced" }), + accessibilityVerbose: boolean(options2.accessibilityVerbose, defaults.accessibilityVerbose), + experimental: { + showMoves: boolean((_a10 = options2.experimental) === null || _a10 === void 0 ? void 0 : _a10.showMoves, defaults.experimental.showMoves), + showEmptyDecorations: boolean((_b4 = options2.experimental) === null || _b4 === void 0 ? void 0 : _b4.showEmptyDecorations, defaults.experimental.showEmptyDecorations) + }, + hideUnchangedRegions: { + enabled: boolean((_d2 = (_c2 = options2.hideUnchangedRegions) === null || _c2 === void 0 ? void 0 : _c2.enabled) !== null && _d2 !== void 0 ? _d2 : (_e2 = options2.experimental) === null || _e2 === void 0 ? void 0 : _e2.collapseUnchangedRegions, defaults.hideUnchangedRegions.enabled), + contextLineCount: clampedInt( + (_f3 = options2.hideUnchangedRegions) === null || _f3 === void 0 ? void 0 : _f3.contextLineCount, + defaults.hideUnchangedRegions.contextLineCount, + 0, + 1073741824 + /* Constants.MAX_SAFE_SMALL_INTEGER */ + ), + minimumLineCount: clampedInt( + (_g2 = options2.hideUnchangedRegions) === null || _g2 === void 0 ? void 0 : _g2.minimumLineCount, + defaults.hideUnchangedRegions.minimumLineCount, + 0, + 1073741824 + /* Constants.MAX_SAFE_SMALL_INTEGER */ + ), + revealLineCount: clampedInt( + (_h2 = options2.hideUnchangedRegions) === null || _h2 === void 0 ? void 0 : _h2.revealLineCount, + defaults.hideUnchangedRegions.revealLineCount, + 0, + 1073741824 + /* Constants.MAX_SAFE_SMALL_INTEGER */ + ) + }, + isInEmbeddedEditor: boolean(options2.isInEmbeddedEditor, defaults.isInEmbeddedEditor), + onlyShowAccessibleDiffViewer: boolean(options2.onlyShowAccessibleDiffViewer, defaults.onlyShowAccessibleDiffViewer), + renderSideBySideInlineBreakpoint: clampedInt( + options2.renderSideBySideInlineBreakpoint, + defaults.renderSideBySideInlineBreakpoint, + 0, + 1073741824 + /* Constants.MAX_SAFE_SMALL_INTEGER */ + ), + useInlineViewWhenSpaceIsLimited: boolean(options2.useInlineViewWhenSpaceIsLimited, defaults.useInlineViewWhenSpaceIsLimited), + renderGutterMenu: boolean(options2.renderGutterMenu, defaults.renderGutterMenu) + }; +} +var __decorate57, __param51, DiffEditorOptions; +var init_diffEditorOptions = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/diffEditorOptions.js"() { + init_observable(); + init_diffEditor(); + init_editorOptions(); + init_accessibility(); + __decorate57 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param51 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + DiffEditorOptions = class DiffEditorOptions2 { + get editorOptions() { + return this._options; + } + constructor(options2, _accessibilityService) { + this._accessibilityService = _accessibilityService; + this._diffEditorWidth = observableValue(this, 0); + this._screenReaderMode = observableFromEvent(this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized()); + this.couldShowInlineViewBecauseOfSize = derived(this, (reader) => this._options.read(reader).renderSideBySide && this._diffEditorWidth.read(reader) <= this._options.read(reader).renderSideBySideInlineBreakpoint); + this.renderOverviewRuler = derived(this, (reader) => this._options.read(reader).renderOverviewRuler); + this.renderSideBySide = derived(this, (reader) => this._options.read(reader).renderSideBySide && !(this._options.read(reader).useInlineViewWhenSpaceIsLimited && this.couldShowInlineViewBecauseOfSize.read(reader) && !this._screenReaderMode.read(reader))); + this.readOnly = derived(this, (reader) => this._options.read(reader).readOnly); + this.shouldRenderOldRevertArrows = derived(this, (reader) => { + if (!this._options.read(reader).renderMarginRevertIcon) { + return false; + } + if (!this.renderSideBySide.read(reader)) { + return false; + } + if (this.readOnly.read(reader)) { + return false; + } + if (this.shouldRenderGutterMenu.read(reader)) { + return false; + } + return true; + }); + this.shouldRenderGutterMenu = derived(this, (reader) => this._options.read(reader).renderGutterMenu); + this.renderIndicators = derived(this, (reader) => this._options.read(reader).renderIndicators); + this.enableSplitViewResizing = derived(this, (reader) => this._options.read(reader).enableSplitViewResizing); + this.splitViewDefaultRatio = derived(this, (reader) => this._options.read(reader).splitViewDefaultRatio); + this.ignoreTrimWhitespace = derived(this, (reader) => this._options.read(reader).ignoreTrimWhitespace); + this.maxComputationTimeMs = derived(this, (reader) => this._options.read(reader).maxComputationTime); + this.showMoves = derived(this, (reader) => this._options.read(reader).experimental.showMoves && this.renderSideBySide.read(reader)); + this.isInEmbeddedEditor = derived(this, (reader) => this._options.read(reader).isInEmbeddedEditor); + this.diffWordWrap = derived(this, (reader) => this._options.read(reader).diffWordWrap); + this.originalEditable = derived(this, (reader) => this._options.read(reader).originalEditable); + this.diffCodeLens = derived(this, (reader) => this._options.read(reader).diffCodeLens); + this.accessibilityVerbose = derived(this, (reader) => this._options.read(reader).accessibilityVerbose); + this.diffAlgorithm = derived(this, (reader) => this._options.read(reader).diffAlgorithm); + this.showEmptyDecorations = derived(this, (reader) => this._options.read(reader).experimental.showEmptyDecorations); + this.onlyShowAccessibleDiffViewer = derived(this, (reader) => this._options.read(reader).onlyShowAccessibleDiffViewer); + this.hideUnchangedRegions = derived(this, (reader) => this._options.read(reader).hideUnchangedRegions.enabled); + this.hideUnchangedRegionsRevealLineCount = derived(this, (reader) => this._options.read(reader).hideUnchangedRegions.revealLineCount); + this.hideUnchangedRegionsContextLineCount = derived(this, (reader) => this._options.read(reader).hideUnchangedRegions.contextLineCount); + this.hideUnchangedRegionsMinimumLineCount = derived(this, (reader) => this._options.read(reader).hideUnchangedRegions.minimumLineCount); + const optionsCopy = __spreadValues(__spreadValues({}, options2), validateDiffEditorOptions(options2, diffEditorDefaultOptions)); + this._options = observableValue(this, optionsCopy); + } + updateOptions(changedOptions) { + const newDiffEditorOptions = validateDiffEditorOptions(changedOptions, this._options.get()); + const newOptions = __spreadValues(__spreadValues(__spreadValues({}, this._options.get()), changedOptions), newDiffEditorOptions); + this._options.set(newOptions, void 0, { changedOptions }); + } + setWidth(width2) { + this._diffEditorWidth.set(width2, void 0); + } + }; + DiffEditorOptions = __decorate57([ + __param51(1, IAccessibilityService) + ], DiffEditorOptions); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/diffEditorWidget.js +function toLineChanges(state) { + return state.mappings.map((x) => { + const m = x.lineRangeMapping; + let originalStartLineNumber; + let originalEndLineNumber; + let modifiedStartLineNumber; + let modifiedEndLineNumber; + let innerChanges = m.innerChanges; + if (m.original.isEmpty) { + originalStartLineNumber = m.original.startLineNumber - 1; + originalEndLineNumber = 0; + innerChanges = void 0; + } else { + originalStartLineNumber = m.original.startLineNumber; + originalEndLineNumber = m.original.endLineNumberExclusive - 1; + } + if (m.modified.isEmpty) { + modifiedStartLineNumber = m.modified.startLineNumber - 1; + modifiedEndLineNumber = 0; + innerChanges = void 0; + } else { + modifiedStartLineNumber = m.modified.startLineNumber; + modifiedEndLineNumber = m.modified.endLineNumberExclusive - 1; + } + return { + originalStartLineNumber, + originalEndLineNumber, + modifiedStartLineNumber, + modifiedEndLineNumber, + charChanges: innerChanges === null || innerChanges === void 0 ? void 0 : innerChanges.map((m2) => ({ + originalStartLineNumber: m2.originalRange.startLineNumber, + originalStartColumn: m2.originalRange.startColumn, + originalEndLineNumber: m2.originalRange.endLineNumber, + originalEndColumn: m2.originalRange.endColumn, + modifiedStartLineNumber: m2.modifiedRange.startLineNumber, + modifiedStartColumn: m2.modifiedRange.startColumn, + modifiedEndLineNumber: m2.modifiedRange.endLineNumber, + modifiedEndColumn: m2.modifiedRange.endColumn + })) + }; + }); +} +var __decorate58, __param52, DiffEditorWidget; +var init_diffEditorWidget = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/diffEditor/diffEditorWidget.js"() { + init_dom(); + init_arraysFind(); + init_errors(); + init_event(); + init_lifecycle(); + init_observable(); + init_derived(); + init_style(); + init_editorExtensions(); + init_codeEditorService(); + init_stableEditorScroll(); + init_codeEditorWidget(); + init_accessibleDiffViewer2(); + init_diffEditorDecorations(); + init_diffEditorSash(); + init_diffEditorViewZones(); + init_gutterFeature(); + init_hideUnchangedRegionsFeature(); + init_movedBlocksLinesFeature(); + init_overviewRulerFeature(); + init_revertButtonsFeature(); + init_utils4(); + init_platformObservableUtils(); + init_position(); + init_range(); + init_editorCommon(); + init_editorContextKeys(); + init_accessibilitySignalService(); + init_contextkey(); + init_instantiation(); + init_serviceCollection(); + init_progress(); + init_diffEditorEditors(); + init_delegatingEditorImpl(); + init_diffEditorOptions(); + init_diffEditorViewModel(); + __decorate58 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param52 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + DiffEditorWidget = class DiffEditorWidget2 extends DelegatingEditor { + get onDidContentSizeChange() { + return this._editors.onDidContentSizeChange; + } + constructor(_domElement, options2, codeEditorWidgetOptions, _parentContextKeyService, _parentInstantiationService, codeEditorService, _accessibilitySignalService, _editorProgressService) { + var _a10; + super(); + this._domElement = _domElement; + this._parentContextKeyService = _parentContextKeyService; + this._parentInstantiationService = _parentInstantiationService; + this._accessibilitySignalService = _accessibilitySignalService; + this._editorProgressService = _editorProgressService; + this.elements = h("div.monaco-diff-editor.side-by-side", { style: { position: "relative", height: "100%" } }, [ + h("div.editor.original@original", { style: { position: "absolute", height: "100%" } }), + h("div.editor.modified@modified", { style: { position: "absolute", height: "100%" } }), + h("div.accessibleDiffViewer@accessibleDiffViewer", { style: { position: "absolute", height: "100%" } }) + ]); + this._diffModel = observableValue(this, void 0); + this._shouldDisposeDiffModel = false; + this.onDidChangeModel = Event.fromObservableLight(this._diffModel); + this._contextKeyService = this._register(this._parentContextKeyService.createScoped(this._domElement)); + this._instantiationService = this._register(this._parentInstantiationService.createChild(new ServiceCollection([IContextKeyService, this._contextKeyService]))); + this._boundarySashes = observableValue(this, void 0); + this._accessibleDiffViewerShouldBeVisible = observableValue(this, false); + this._accessibleDiffViewerVisible = derived(this, (reader) => this._options.onlyShowAccessibleDiffViewer.read(reader) ? true : this._accessibleDiffViewerShouldBeVisible.read(reader)); + this._movedBlocksLinesPart = observableValue(this, void 0); + this._layoutInfo = derived(this, (reader) => { + var _a11, _b4, _c2, _d2, _e2; + const fullWidth = this._rootSizeObserver.width.read(reader); + const fullHeight = this._rootSizeObserver.height.read(reader); + if (this._rootSizeObserver.automaticLayout) { + this.elements.root.style.height = "100%"; + } else { + this.elements.root.style.height = fullHeight + "px"; + } + const sash = this._sash.read(reader); + const gutter = this._gutter.read(reader); + const gutterWidth = (_a11 = gutter === null || gutter === void 0 ? void 0 : gutter.width.read(reader)) !== null && _a11 !== void 0 ? _a11 : 0; + const overviewRulerPartWidth = (_c2 = (_b4 = this._overviewRulerPart.read(reader)) === null || _b4 === void 0 ? void 0 : _b4.width) !== null && _c2 !== void 0 ? _c2 : 0; + let originalLeft, originalWidth, modifiedLeft, modifiedWidth, gutterLeft; + const sideBySide = !!sash; + if (sideBySide) { + const sashLeft = sash.sashLeft.read(reader); + const movedBlocksLinesWidth = (_e2 = (_d2 = this._movedBlocksLinesPart.read(reader)) === null || _d2 === void 0 ? void 0 : _d2.width.read(reader)) !== null && _e2 !== void 0 ? _e2 : 0; + originalLeft = 0; + originalWidth = sashLeft - gutterWidth - movedBlocksLinesWidth; + gutterLeft = sashLeft - gutterWidth; + modifiedLeft = sashLeft; + modifiedWidth = fullWidth - modifiedLeft - overviewRulerPartWidth; + } else { + gutterLeft = 0; + originalLeft = gutterWidth; + originalWidth = Math.max(5, this._editors.original.getLayoutInfo().decorationsLeft); + modifiedLeft = gutterWidth + originalWidth; + modifiedWidth = fullWidth - modifiedLeft - overviewRulerPartWidth; + } + this.elements.original.style.left = originalLeft + "px"; + this.elements.original.style.width = originalWidth + "px"; + this._editors.original.layout({ width: originalWidth, height: fullHeight }, true); + gutter === null || gutter === void 0 ? void 0 : gutter.layout(gutterLeft); + this.elements.modified.style.left = modifiedLeft + "px"; + this.elements.modified.style.width = modifiedWidth + "px"; + this._editors.modified.layout({ width: modifiedWidth, height: fullHeight }, true); + return { + modifiedEditor: this._editors.modified.getLayoutInfo(), + originalEditor: this._editors.original.getLayoutInfo() + }; + }); + this._diffValue = this._diffModel.map((m, r) => m === null || m === void 0 ? void 0 : m.diff.read(r)); + this.onDidUpdateDiff = Event.fromObservableLight(this._diffValue); + codeEditorService.willCreateDiffEditor(); + this._contextKeyService.createKey("isInDiffEditor", true); + this._domElement.appendChild(this.elements.root); + this._register(toDisposable(() => this._domElement.removeChild(this.elements.root))); + this._rootSizeObserver = this._register(new ObservableElementSizeObserver(this.elements.root, options2.dimension)); + this._rootSizeObserver.setAutomaticLayout((_a10 = options2.automaticLayout) !== null && _a10 !== void 0 ? _a10 : false); + this._options = this._instantiationService.createInstance(DiffEditorOptions, options2); + this._register(autorun((reader) => { + this._options.setWidth(this._rootSizeObserver.width.read(reader)); + })); + this._contextKeyService.createKey(EditorContextKeys.isEmbeddedDiffEditor.key, false); + this._register(bindContextKey(EditorContextKeys.isEmbeddedDiffEditor, this._contextKeyService, (reader) => this._options.isInEmbeddedEditor.read(reader))); + this._register(bindContextKey(EditorContextKeys.comparingMovedCode, this._contextKeyService, (reader) => { + var _a11; + return !!((_a11 = this._diffModel.read(reader)) === null || _a11 === void 0 ? void 0 : _a11.movedTextToCompare.read(reader)); + })); + this._register(bindContextKey(EditorContextKeys.diffEditorRenderSideBySideInlineBreakpointReached, this._contextKeyService, (reader) => this._options.couldShowInlineViewBecauseOfSize.read(reader))); + this._register(bindContextKey(EditorContextKeys.diffEditorInlineMode, this._contextKeyService, (reader) => !this._options.renderSideBySide.read(reader))); + this._register(bindContextKey(EditorContextKeys.hasChanges, this._contextKeyService, (reader) => { + var _a11, _b4, _c2; + return ((_c2 = (_b4 = (_a11 = this._diffModel.read(reader)) === null || _a11 === void 0 ? void 0 : _a11.diff.read(reader)) === null || _b4 === void 0 ? void 0 : _b4.mappings.length) !== null && _c2 !== void 0 ? _c2 : 0) > 0; + })); + this._editors = this._register(this._instantiationService.createInstance(DiffEditorEditors, this.elements.original, this.elements.modified, this._options, codeEditorWidgetOptions, (i, c, o, o2) => this._createInnerEditor(i, c, o, o2))); + this._register(bindContextKey(EditorContextKeys.diffEditorOriginalWritable, this._contextKeyService, (reader) => this._options.originalEditable.read(reader))); + this._register(bindContextKey(EditorContextKeys.diffEditorModifiedWritable, this._contextKeyService, (reader) => !this._options.readOnly.read(reader))); + this._register(bindContextKey(EditorContextKeys.diffEditorOriginalUri, this._contextKeyService, (reader) => { + var _a11, _b4; + return (_b4 = (_a11 = this._diffModel.read(reader)) === null || _a11 === void 0 ? void 0 : _a11.model.original.uri.toString()) !== null && _b4 !== void 0 ? _b4 : ""; + })); + this._register(bindContextKey(EditorContextKeys.diffEditorModifiedUri, this._contextKeyService, (reader) => { + var _a11, _b4; + return (_b4 = (_a11 = this._diffModel.read(reader)) === null || _a11 === void 0 ? void 0 : _a11.model.modified.uri.toString()) !== null && _b4 !== void 0 ? _b4 : ""; + })); + this._overviewRulerPart = derivedDisposable(this, (reader) => !this._options.renderOverviewRuler.read(reader) ? void 0 : this._instantiationService.createInstance(readHotReloadableExport(OverviewRulerFeature, reader), this._editors, this.elements.root, this._diffModel, this._rootSizeObserver.width, this._rootSizeObserver.height, this._layoutInfo.map((i) => i.modifiedEditor))).recomputeInitiallyAndOnChange(this._store); + const dimensions = { + height: this._rootSizeObserver.height, + width: this._rootSizeObserver.width.map((w, reader) => { + var _a11, _b4; + return w - ((_b4 = (_a11 = this._overviewRulerPart.read(reader)) === null || _a11 === void 0 ? void 0 : _a11.width) !== null && _b4 !== void 0 ? _b4 : 0); + }) + }; + this._sashLayout = new SashLayout(this._options, dimensions); + this._sash = derivedDisposable(this, (reader) => { + const showSash = this._options.renderSideBySide.read(reader); + this.elements.root.classList.toggle("side-by-side", showSash); + return !showSash ? void 0 : new DiffEditorSash(this.elements.root, dimensions, this._options.enableSplitViewResizing, this._boundarySashes, this._sashLayout.sashLeft, () => this._sashLayout.resetSash()); + }).recomputeInitiallyAndOnChange(this._store); + const unchangedRangesFeature = derivedDisposable(this, (reader) => ( + /** @description UnchangedRangesFeature */ + this._instantiationService.createInstance(readHotReloadableExport(HideUnchangedRegionsFeature, reader), this._editors, this._diffModel, this._options) + )).recomputeInitiallyAndOnChange(this._store); + derivedDisposable(this, (reader) => ( + /** @description DiffEditorDecorations */ + this._instantiationService.createInstance(readHotReloadableExport(DiffEditorDecorations, reader), this._editors, this._diffModel, this._options, this) + )).recomputeInitiallyAndOnChange(this._store); + const origViewZoneIdsToIgnore = /* @__PURE__ */ new Set(); + const modViewZoneIdsToIgnore = /* @__PURE__ */ new Set(); + let isUpdatingViewZones = false; + const viewZoneManager = derivedDisposable(this, (reader) => ( + /** @description ViewZoneManager */ + this._instantiationService.createInstance(readHotReloadableExport(DiffEditorViewZones, reader), getWindow(this._domElement), this._editors, this._diffModel, this._options, this, () => isUpdatingViewZones || unchangedRangesFeature.get().isUpdatingHiddenAreas, origViewZoneIdsToIgnore, modViewZoneIdsToIgnore) + )).recomputeInitiallyAndOnChange(this._store); + const originalViewZones = derived(this, (reader) => { + const orig = viewZoneManager.read(reader).viewZones.read(reader).orig; + const orig2 = unchangedRangesFeature.read(reader).viewZones.read(reader).origViewZones; + return orig.concat(orig2); + }); + const modifiedViewZones = derived(this, (reader) => { + const mod = viewZoneManager.read(reader).viewZones.read(reader).mod; + const mod2 = unchangedRangesFeature.read(reader).viewZones.read(reader).modViewZones; + return mod.concat(mod2); + }); + this._register(applyViewZones(this._editors.original, originalViewZones, (isUpdatingOrigViewZones) => { + isUpdatingViewZones = isUpdatingOrigViewZones; + }, origViewZoneIdsToIgnore)); + let scrollState; + this._register(applyViewZones(this._editors.modified, modifiedViewZones, (isUpdatingModViewZones) => { + isUpdatingViewZones = isUpdatingModViewZones; + if (isUpdatingViewZones) { + scrollState = StableEditorScrollState.capture(this._editors.modified); + } else { + scrollState === null || scrollState === void 0 ? void 0 : scrollState.restore(this._editors.modified); + scrollState = void 0; + } + }, modViewZoneIdsToIgnore)); + this._accessibleDiffViewer = derivedDisposable(this, (reader) => this._instantiationService.createInstance(readHotReloadableExport(AccessibleDiffViewer, reader), this.elements.accessibleDiffViewer, this._accessibleDiffViewerVisible, (visible, tx) => this._accessibleDiffViewerShouldBeVisible.set(visible, tx), this._options.onlyShowAccessibleDiffViewer.map((v) => !v), this._rootSizeObserver.width, this._rootSizeObserver.height, this._diffModel.map((m, r) => { + var _a11; + return (_a11 = m === null || m === void 0 ? void 0 : m.diff.read(r)) === null || _a11 === void 0 ? void 0 : _a11.mappings.map((m2) => m2.lineRangeMapping); + }), new AccessibleDiffViewerModelFromEditors(this._editors))).recomputeInitiallyAndOnChange(this._store); + const visibility = this._accessibleDiffViewerVisible.map((v) => v ? "hidden" : "visible"); + this._register(applyStyle(this.elements.modified, { visibility })); + this._register(applyStyle(this.elements.original, { visibility })); + this._createDiffEditorContributions(); + codeEditorService.addDiffEditor(this); + this._gutter = derivedDisposable(this, (reader) => { + return this._options.shouldRenderGutterMenu.read(reader) ? this._instantiationService.createInstance(readHotReloadableExport(DiffEditorGutter, reader), this.elements.root, this._diffModel, this._editors, this._options, this._sashLayout, this._boundarySashes) : void 0; + }); + this._register(recomputeInitiallyAndOnChange(this._layoutInfo)); + derivedDisposable(this, (reader) => ( + /** @description MovedBlocksLinesPart */ + new (readHotReloadableExport(MovedBlocksLinesFeature, reader))(this.elements.root, this._diffModel, this._layoutInfo.map((i) => i.originalEditor), this._layoutInfo.map((i) => i.modifiedEditor), this._editors) + )).recomputeInitiallyAndOnChange(this._store, (value) => { + this._movedBlocksLinesPart.set(value, void 0); + }); + this._register(Event.runAndSubscribe(this._editors.modified.onDidChangeCursorPosition, (e) => this._handleCursorPositionChange(e, true))); + this._register(Event.runAndSubscribe(this._editors.original.onDidChangeCursorPosition, (e) => this._handleCursorPositionChange(e, false))); + const isInitializingDiff = this._diffModel.map(this, (m, reader) => { + if (!m) { + return void 0; + } + return m.diff.read(reader) === void 0 && !m.isDiffUpToDate.read(reader); + }); + this._register(autorunWithStore((reader, store) => { + if (isInitializingDiff.read(reader) === true) { + const r = this._editorProgressService.show(true, 1e3); + store.add(toDisposable(() => r.done())); + } + })); + this._register(toDisposable(() => { + var _a11; + if (this._shouldDisposeDiffModel) { + (_a11 = this._diffModel.get()) === null || _a11 === void 0 ? void 0 : _a11.dispose(); + } + })); + this._register(autorunWithStore((reader, store) => { + store.add(new (readHotReloadableExport(RevertButtonsFeature, reader))(this._editors, this._diffModel, this._options, this)); + })); + } + _createInnerEditor(instantiationService, container, options2, editorWidgetOptions) { + const editor2 = instantiationService.createInstance(CodeEditorWidget, container, options2, editorWidgetOptions); + return editor2; + } + _createDiffEditorContributions() { + const contributions = EditorExtensionsRegistry.getDiffEditorContributions(); + for (const desc of contributions) { + try { + this._register(this._instantiationService.createInstance(desc.ctor, this)); + } catch (err) { + onUnexpectedError(err); + } + } + } + get _targetEditor() { + return this._editors.modified; + } + getEditorType() { + return EditorType.IDiffEditor; + } + layout(dimension) { + this._rootSizeObserver.observe(dimension); + } + hasTextFocus() { + return this._editors.original.hasTextFocus() || this._editors.modified.hasTextFocus(); + } + saveViewState() { + var _a10; + const originalViewState = this._editors.original.saveViewState(); + const modifiedViewState = this._editors.modified.saveViewState(); + return { + original: originalViewState, + modified: modifiedViewState, + modelState: (_a10 = this._diffModel.get()) === null || _a10 === void 0 ? void 0 : _a10.serializeState() + }; + } + restoreViewState(s) { + var _a10; + if (s && s.original && s.modified) { + const diffEditorState = s; + this._editors.original.restoreViewState(diffEditorState.original); + this._editors.modified.restoreViewState(diffEditorState.modified); + if (diffEditorState.modelState) { + (_a10 = this._diffModel.get()) === null || _a10 === void 0 ? void 0 : _a10.restoreSerializedState(diffEditorState.modelState); + } + } + } + handleInitialized() { + this._editors.original.handleInitialized(); + this._editors.modified.handleInitialized(); + } + createViewModel(model) { + return this._instantiationService.createInstance(DiffEditorViewModel, model, this._options); + } + getModel() { + var _a10, _b4; + return (_b4 = (_a10 = this._diffModel.get()) === null || _a10 === void 0 ? void 0 : _a10.model) !== null && _b4 !== void 0 ? _b4 : null; + } + setModel(model, tx) { + if (!model && this._diffModel.get()) { + this._accessibleDiffViewer.get().close(); + } + const vm = model ? "model" in model ? { model, shouldDispose: false } : { model: this.createViewModel(model), shouldDispose: true } : void 0; + if (this._diffModel.get() !== (vm === null || vm === void 0 ? void 0 : vm.model)) { + subtransaction(tx, (tx2) => { + var _a10; + observableFromEvent.batchEventsGlobally(tx2, () => { + this._editors.original.setModel(vm ? vm.model.model.original : null); + this._editors.modified.setModel(vm ? vm.model.model.modified : null); + }); + const prevValue = this._diffModel.get(); + const shouldDispose = this._shouldDisposeDiffModel; + this._shouldDisposeDiffModel = (_a10 = vm === null || vm === void 0 ? void 0 : vm.shouldDispose) !== null && _a10 !== void 0 ? _a10 : false; + this._diffModel.set(vm === null || vm === void 0 ? void 0 : vm.model, tx2); + if (shouldDispose) { + prevValue === null || prevValue === void 0 ? void 0 : prevValue.dispose(); + } + }); + } + } + /** + * @param changedOptions Only has values for top-level options that have actually changed. + */ + updateOptions(changedOptions) { + this._options.updateOptions(changedOptions); + } + getContainerDomNode() { + return this._domElement; + } + getOriginalEditor() { + return this._editors.original; + } + getModifiedEditor() { + return this._editors.modified; + } + /** + * @deprecated Use `this.getDiffComputationResult().changes2` instead. + */ + getLineChanges() { + var _a10; + const diffState = (_a10 = this._diffModel.get()) === null || _a10 === void 0 ? void 0 : _a10.diff.get(); + if (!diffState) { + return null; + } + return toLineChanges(diffState); + } + revert(diff) { + const model = this._diffModel.get(); + if (!model || !model.isDiffUpToDate.get()) { + return; + } + this._editors.modified.executeEdits("diffEditor", [ + { + range: diff.modified.toExclusiveRange(), + text: model.model.original.getValueInRange(diff.original.toExclusiveRange()) + } + ]); + } + revertRangeMappings(diffs) { + const model = this._diffModel.get(); + if (!model || !model.isDiffUpToDate.get()) { + return; + } + const changes = diffs.map((c) => ({ + range: c.modifiedRange, + text: model.model.original.getValueInRange(c.originalRange) + })); + this._editors.modified.executeEdits("diffEditor", changes); + } + _goTo(diff) { + this._editors.modified.setPosition(new Position(diff.lineRangeMapping.modified.startLineNumber, 1)); + this._editors.modified.revealRangeInCenter(diff.lineRangeMapping.modified.toExclusiveRange()); + } + goToDiff(target) { + var _a10, _b4, _c2, _d2; + const diffs = (_b4 = (_a10 = this._diffModel.get()) === null || _a10 === void 0 ? void 0 : _a10.diff.get()) === null || _b4 === void 0 ? void 0 : _b4.mappings; + if (!diffs || diffs.length === 0) { + return; + } + const curLineNumber = this._editors.modified.getPosition().lineNumber; + let diff; + if (target === "next") { + diff = (_c2 = diffs.find((d) => d.lineRangeMapping.modified.startLineNumber > curLineNumber)) !== null && _c2 !== void 0 ? _c2 : diffs[0]; + } else { + diff = (_d2 = findLast(diffs, (d) => d.lineRangeMapping.modified.startLineNumber < curLineNumber)) !== null && _d2 !== void 0 ? _d2 : diffs[diffs.length - 1]; + } + this._goTo(diff); + if (diff.lineRangeMapping.modified.isEmpty) { + this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineDeleted, { source: "diffEditor.goToDiff" }); + } else if (diff.lineRangeMapping.original.isEmpty) { + this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineInserted, { source: "diffEditor.goToDiff" }); + } else if (diff) { + this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineModified, { source: "diffEditor.goToDiff" }); + } + } + revealFirstDiff() { + const diffModel = this._diffModel.get(); + if (!diffModel) { + return; + } + this.waitForDiff().then(() => { + var _a10; + const diffs = (_a10 = diffModel.diff.get()) === null || _a10 === void 0 ? void 0 : _a10.mappings; + if (!diffs || diffs.length === 0) { + return; + } + this._goTo(diffs[0]); + }); + } + accessibleDiffViewerNext() { + this._accessibleDiffViewer.get().next(); + } + accessibleDiffViewerPrev() { + this._accessibleDiffViewer.get().prev(); + } + waitForDiff() { + return __async(this, null, function* () { + const diffModel = this._diffModel.get(); + if (!diffModel) { + return; + } + yield diffModel.waitForDiff(); + }); + } + mapToOtherSide() { + var _a10, _b4; + const isModifiedFocus = this._editors.modified.hasWidgetFocus(); + const source = isModifiedFocus ? this._editors.modified : this._editors.original; + const destination = isModifiedFocus ? this._editors.original : this._editors.modified; + let destinationSelection; + const sourceSelection = source.getSelection(); + if (sourceSelection) { + const mappings = (_b4 = (_a10 = this._diffModel.get()) === null || _a10 === void 0 ? void 0 : _a10.diff.get()) === null || _b4 === void 0 ? void 0 : _b4.mappings.map((m) => isModifiedFocus ? m.lineRangeMapping.flip() : m.lineRangeMapping); + if (mappings) { + const newRange1 = translatePosition(sourceSelection.getStartPosition(), mappings); + const newRange2 = translatePosition(sourceSelection.getEndPosition(), mappings); + destinationSelection = Range.plusRange(newRange1, newRange2); + } + } + return { destination, destinationSelection }; + } + switchSide() { + const { destination, destinationSelection } = this.mapToOtherSide(); + destination.focus(); + if (destinationSelection) { + destination.setSelection(destinationSelection); + } + } + exitCompareMove() { + const model = this._diffModel.get(); + if (!model) { + return; + } + model.movedTextToCompare.set(void 0, void 0); + } + collapseAllUnchangedRegions() { + var _a10; + const unchangedRegions = (_a10 = this._diffModel.get()) === null || _a10 === void 0 ? void 0 : _a10.unchangedRegions.get(); + if (!unchangedRegions) { + return; + } + transaction((tx) => { + for (const region of unchangedRegions) { + region.collapseAll(tx); + } + }); + } + showAllUnchangedRegions() { + var _a10; + const unchangedRegions = (_a10 = this._diffModel.get()) === null || _a10 === void 0 ? void 0 : _a10.unchangedRegions.get(); + if (!unchangedRegions) { + return; + } + transaction((tx) => { + for (const region of unchangedRegions) { + region.showAll(tx); + } + }); + } + _handleCursorPositionChange(e, isModifiedEditor) { + var _a10, _b4; + if ((e === null || e === void 0 ? void 0 : e.reason) === 3) { + const diff = (_b4 = (_a10 = this._diffModel.get()) === null || _a10 === void 0 ? void 0 : _a10.diff.get()) === null || _b4 === void 0 ? void 0 : _b4.mappings.find((m) => isModifiedEditor ? m.lineRangeMapping.modified.contains(e.position.lineNumber) : m.lineRangeMapping.original.contains(e.position.lineNumber)); + if (diff === null || diff === void 0 ? void 0 : diff.lineRangeMapping.modified.isEmpty) { + this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineDeleted, { source: "diffEditor.cursorPositionChanged" }); + } else if (diff === null || diff === void 0 ? void 0 : diff.lineRangeMapping.original.isEmpty) { + this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineInserted, { source: "diffEditor.cursorPositionChanged" }); + } else if (diff) { + this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineModified, { source: "diffEditor.cursorPositionChanged" }); + } + } + } + }; + DiffEditorWidget = __decorate58([ + __param52(3, IContextKeyService), + __param52(4, IInstantiationService), + __param52(5, ICodeEditorService), + __param52(6, IAccessibilitySignalService), + __param52(7, IEditorProgressService) + ], DiffEditorWidget); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/browser/standaloneCodeEditor.js +function createAriaDomNode(parent) { + if (!parent) { + if (ariaDomNodeCreated) { + return; + } + ariaDomNodeCreated = true; + } + setARIAContainer(parent || mainWindow.document.body); +} +function createTextModel(modelService, languageService, value, languageId, uri) { + value = value || ""; + if (!languageId) { + const firstLF = value.indexOf("\n"); + let firstLine = value; + if (firstLF !== -1) { + firstLine = value.substring(0, firstLF); + } + return doCreateModel(modelService, value, languageService.createByFilepathOrFirstLine(uri || null, firstLine), uri); + } + return doCreateModel(modelService, value, languageService.createById(languageId), uri); +} +function doCreateModel(modelService, value, languageSelection, uri) { + return modelService.createModel(value, languageSelection, uri); +} +var __decorate59, __param53, LAST_GENERATED_COMMAND_ID, ariaDomNodeCreated, StandaloneCodeEditor, StandaloneEditor, StandaloneDiffEditor2; +var init_standaloneCodeEditor = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/browser/standaloneCodeEditor.js"() { + init_aria2(); + init_lifecycle(); + init_codeEditorService(); + init_codeEditorWidget(); + init_editorAction(); + init_standaloneServices(); + init_standaloneTheme(); + init_actions2(); + init_commands(); + init_configuration(); + init_contextkey(); + init_contextView(); + init_instantiation(); + init_keybinding(); + init_notification(); + init_themeService(); + init_accessibility(); + init_standaloneStrings(); + init_clipboardService2(); + init_progress(); + init_model(); + init_language(); + init_standaloneCodeEditorService(); + init_modesRegistry(); + init_languageConfigurationRegistry(); + init_languageFeatures(); + init_diffEditorWidget(); + init_accessibilitySignalService(); + init_window(); + init_hoverDelegateFactory(); + init_hover(); + init_hoverDelegate2(); + __decorate59 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param53 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + LAST_GENERATED_COMMAND_ID = 0; + ariaDomNodeCreated = false; + StandaloneCodeEditor = class StandaloneCodeEditor2 extends CodeEditorWidget { + constructor(domElement, _options, instantiationService, codeEditorService, commandService, contextKeyService, hoverService, keybindingService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService) { + const options2 = __spreadValues({}, _options); + options2.ariaLabel = options2.ariaLabel || StandaloneCodeEditorNLS.editorViewAccessibleLabel; + options2.ariaLabel = options2.ariaLabel + ";" + StandaloneCodeEditorNLS.accessibilityHelpMessage; + super(domElement, options2, {}, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService); + if (keybindingService instanceof StandaloneKeybindingService) { + this._standaloneKeybindingService = keybindingService; + } else { + this._standaloneKeybindingService = null; + } + createAriaDomNode(options2.ariaContainerElement); + setHoverDelegateFactory((placement, enableInstantHover) => instantiationService.createInstance(WorkbenchHoverDelegate, placement, enableInstantHover, {})); + setBaseLayerHoverDelegate(hoverService); + } + addCommand(keybinding, handler, context) { + if (!this._standaloneKeybindingService) { + console.warn("Cannot add command because the editor is configured with an unrecognized KeybindingService"); + return null; + } + const commandId = "DYNAMIC_" + ++LAST_GENERATED_COMMAND_ID; + const whenExpression = ContextKeyExpr.deserialize(context); + this._standaloneKeybindingService.addDynamicKeybinding(commandId, keybinding, handler, whenExpression); + return commandId; + } + createContextKey(key, defaultValue) { + return this._contextKeyService.createKey(key, defaultValue); + } + addAction(_descriptor) { + if (typeof _descriptor.id !== "string" || typeof _descriptor.label !== "string" || typeof _descriptor.run !== "function") { + throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!"); + } + if (!this._standaloneKeybindingService) { + console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"); + return Disposable.None; + } + const id = _descriptor.id; + const label = _descriptor.label; + const precondition = ContextKeyExpr.and(ContextKeyExpr.equals("editorId", this.getId()), ContextKeyExpr.deserialize(_descriptor.precondition)); + const keybindings = _descriptor.keybindings; + const keybindingsWhen = ContextKeyExpr.and(precondition, ContextKeyExpr.deserialize(_descriptor.keybindingContext)); + const contextMenuGroupId = _descriptor.contextMenuGroupId || null; + const contextMenuOrder = _descriptor.contextMenuOrder || 0; + const run = (_accessor, ...args) => { + return Promise.resolve(_descriptor.run(this, ...args)); + }; + const toDispose = new DisposableStore(); + const uniqueId = this.getId() + ":" + id; + toDispose.add(CommandsRegistry.registerCommand(uniqueId, run)); + if (contextMenuGroupId) { + const menuItem = { + command: { + id: uniqueId, + title: label + }, + when: precondition, + group: contextMenuGroupId, + order: contextMenuOrder + }; + toDispose.add(MenuRegistry.appendMenuItem(MenuId.EditorContext, menuItem)); + } + if (Array.isArray(keybindings)) { + for (const kb of keybindings) { + toDispose.add(this._standaloneKeybindingService.addDynamicKeybinding(uniqueId, kb, run, keybindingsWhen)); + } + } + const internalAction = new InternalEditorAction(uniqueId, label, label, void 0, precondition, (...args) => Promise.resolve(_descriptor.run(this, ...args)), this._contextKeyService); + this._actions.set(id, internalAction); + toDispose.add(toDisposable(() => { + this._actions.delete(id); + })); + return toDispose; + } + _triggerCommand(handlerId, payload) { + if (this._codeEditorService instanceof StandaloneCodeEditorService) { + try { + this._codeEditorService.setActiveCodeEditor(this); + super._triggerCommand(handlerId, payload); + } finally { + this._codeEditorService.setActiveCodeEditor(null); + } + } else { + super._triggerCommand(handlerId, payload); + } + } + }; + StandaloneCodeEditor = __decorate59([ + __param53(2, IInstantiationService), + __param53(3, ICodeEditorService), + __param53(4, ICommandService), + __param53(5, IContextKeyService), + __param53(6, IHoverService), + __param53(7, IKeybindingService), + __param53(8, IThemeService), + __param53(9, INotificationService), + __param53(10, IAccessibilityService), + __param53(11, ILanguageConfigurationService), + __param53(12, ILanguageFeaturesService) + ], StandaloneCodeEditor); + StandaloneEditor = class StandaloneEditor2 extends StandaloneCodeEditor { + constructor(domElement, _options, instantiationService, codeEditorService, commandService, contextKeyService, hoverService, keybindingService, themeService, notificationService, configurationService, accessibilityService, modelService, languageService, languageConfigurationService, languageFeaturesService) { + const options2 = __spreadValues({}, _options); + updateConfigurationService(configurationService, options2, false); + const themeDomRegistration = themeService.registerEditorContainer(domElement); + if (typeof options2.theme === "string") { + themeService.setTheme(options2.theme); + } + if (typeof options2.autoDetectHighContrast !== "undefined") { + themeService.setAutoDetectHighContrast(Boolean(options2.autoDetectHighContrast)); + } + const _model = options2.model; + delete options2.model; + super(domElement, options2, instantiationService, codeEditorService, commandService, contextKeyService, hoverService, keybindingService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService); + this._configurationService = configurationService; + this._standaloneThemeService = themeService; + this._register(themeDomRegistration); + let model; + if (typeof _model === "undefined") { + const languageId = languageService.getLanguageIdByMimeType(options2.language) || options2.language || PLAINTEXT_LANGUAGE_ID; + model = createTextModel(modelService, languageService, options2.value || "", languageId, void 0); + this._ownsModel = true; + } else { + model = _model; + this._ownsModel = false; + } + this._attachModel(model); + if (model) { + const e = { + oldModelUrl: null, + newModelUrl: model.uri + }; + this._onDidChangeModel.fire(e); + } + } + dispose() { + super.dispose(); + } + updateOptions(newOptions) { + updateConfigurationService(this._configurationService, newOptions, false); + if (typeof newOptions.theme === "string") { + this._standaloneThemeService.setTheme(newOptions.theme); + } + if (typeof newOptions.autoDetectHighContrast !== "undefined") { + this._standaloneThemeService.setAutoDetectHighContrast(Boolean(newOptions.autoDetectHighContrast)); + } + super.updateOptions(newOptions); + } + _postDetachModelCleanup(detachedModel) { + super._postDetachModelCleanup(detachedModel); + if (detachedModel && this._ownsModel) { + detachedModel.dispose(); + this._ownsModel = false; + } + } + }; + StandaloneEditor = __decorate59([ + __param53(2, IInstantiationService), + __param53(3, ICodeEditorService), + __param53(4, ICommandService), + __param53(5, IContextKeyService), + __param53(6, IHoverService), + __param53(7, IKeybindingService), + __param53(8, IStandaloneThemeService), + __param53(9, INotificationService), + __param53(10, IConfigurationService), + __param53(11, IAccessibilityService), + __param53(12, IModelService), + __param53(13, ILanguageService), + __param53(14, ILanguageConfigurationService), + __param53(15, ILanguageFeaturesService) + ], StandaloneEditor); + StandaloneDiffEditor2 = class StandaloneDiffEditor22 extends DiffEditorWidget { + constructor(domElement, _options, instantiationService, contextKeyService, codeEditorService, themeService, notificationService, configurationService, contextMenuService, editorProgressService, clipboardService, accessibilitySignalService) { + const options2 = __spreadValues({}, _options); + updateConfigurationService(configurationService, options2, true); + const themeDomRegistration = themeService.registerEditorContainer(domElement); + if (typeof options2.theme === "string") { + themeService.setTheme(options2.theme); + } + if (typeof options2.autoDetectHighContrast !== "undefined") { + themeService.setAutoDetectHighContrast(Boolean(options2.autoDetectHighContrast)); + } + super(domElement, options2, {}, contextKeyService, instantiationService, codeEditorService, accessibilitySignalService, editorProgressService); + this._configurationService = configurationService; + this._standaloneThemeService = themeService; + this._register(themeDomRegistration); + } + dispose() { + super.dispose(); + } + updateOptions(newOptions) { + updateConfigurationService(this._configurationService, newOptions, true); + if (typeof newOptions.theme === "string") { + this._standaloneThemeService.setTheme(newOptions.theme); + } + if (typeof newOptions.autoDetectHighContrast !== "undefined") { + this._standaloneThemeService.setAutoDetectHighContrast(Boolean(newOptions.autoDetectHighContrast)); + } + super.updateOptions(newOptions); + } + _createInnerEditor(instantiationService, container, options2) { + return instantiationService.createInstance(StandaloneCodeEditor, container, options2); + } + getOriginalEditor() { + return super.getOriginalEditor(); + } + getModifiedEditor() { + return super.getModifiedEditor(); + } + addCommand(keybinding, handler, context) { + return this.getModifiedEditor().addCommand(keybinding, handler, context); + } + createContextKey(key, defaultValue) { + return this.getModifiedEditor().createContextKey(key, defaultValue); + } + addAction(descriptor) { + return this.getModifiedEditor().addAction(descriptor); + } + }; + StandaloneDiffEditor2 = __decorate59([ + __param53(2, IInstantiationService), + __param53(3, IContextKeyService), + __param53(4, ICodeEditorService), + __param53(5, IStandaloneThemeService), + __param53(6, INotificationService), + __param53(7, IConfigurationService), + __param53(8, IContextMenuService), + __param53(9, IEditorProgressService), + __param53(10, IClipboardService), + __param53(11, IAccessibilitySignalService) + ], StandaloneDiffEditor2); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/multiDiffEditor/style.css +var init_style2 = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/multiDiffEditor/style.css"() { + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/multiDiffEditor/diffEditorItemTemplate.js +function isFocused(editor2) { + return observableFromEvent((h2) => { + const store = new DisposableStore(); + store.add(editor2.onDidFocusEditorWidget(() => h2(true))); + store.add(editor2.onDidBlurEditorWidget(() => h2(false))); + return store; + }, () => editor2.hasTextFocus()); +} +var __decorate60, __param54, TemplateData, DiffEditorItemTemplate; +var init_diffEditorItemTemplate = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/multiDiffEditor/diffEditorItemTemplate.js"() { + init_dom(); + init_button2(); + init_codicons(); + init_lifecycle(); + init_observable(); + init_base(); + init_diffEditorWidget(); + init_toolbar3(); + init_actions2(); + init_instantiation(); + init_utils5(); + init_menuEntryActionViewItem2(); + __decorate60 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param54 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + TemplateData = class { + constructor(viewModel, deltaScrollVertical) { + this.viewModel = viewModel; + this.deltaScrollVertical = deltaScrollVertical; + } + getId() { + return this.viewModel; + } + }; + DiffEditorItemTemplate = class DiffEditorItemTemplate2 extends Disposable { + constructor(_container, _overflowWidgetsDomNode, _workbenchUIElementFactory, _instantiationService) { + super(); + this._container = _container; + this._overflowWidgetsDomNode = _overflowWidgetsDomNode; + this._workbenchUIElementFactory = _workbenchUIElementFactory; + this._instantiationService = _instantiationService; + this._viewModel = observableValue(this, void 0); + this._collapsed = derived(this, (reader) => { + var _a10; + return (_a10 = this._viewModel.read(reader)) === null || _a10 === void 0 ? void 0 : _a10.collapsed.read(reader); + }); + this._editorContentHeight = observableValue(this, 500); + this.contentHeight = derived(this, (reader) => { + const h2 = this._collapsed.read(reader) ? 0 : this._editorContentHeight.read(reader); + return h2 + this._outerEditorHeight; + }); + this._modifiedContentWidth = observableValue(this, 0); + this._modifiedWidth = observableValue(this, 0); + this._originalContentWidth = observableValue(this, 0); + this._originalWidth = observableValue(this, 0); + this.maxScroll = derived(this, (reader) => { + const scroll1 = this._modifiedContentWidth.read(reader) - this._modifiedWidth.read(reader); + const scroll2 = this._originalContentWidth.read(reader) - this._originalWidth.read(reader); + if (scroll1 > scroll2) { + return { maxScroll: scroll1, width: this._modifiedWidth.read(reader) }; + } else { + return { maxScroll: scroll2, width: this._originalWidth.read(reader) }; + } + }); + this._elements = h("div.multiDiffEntry", [ + h("div.header@header", [ + h("div.header-content", [ + h("div.collapse-button@collapseButton"), + h("div.file-path", [ + h("div.title.modified.show-file-icons@primaryPath", []), + h("div.status.deleted@status", ["R"]), + h("div.title.original.show-file-icons@secondaryPath", []) + ]), + h("div.actions@actions") + ]) + ]), + h("div.editorParent", [ + h("div.editorContainer@editor") + ]) + ]); + this.editor = this._register(this._instantiationService.createInstance(DiffEditorWidget, this._elements.editor, { + overflowWidgetsDomNode: this._overflowWidgetsDomNode + }, {})); + this.isModifedFocused = isFocused(this.editor.getModifiedEditor()); + this.isOriginalFocused = isFocused(this.editor.getOriginalEditor()); + this.isFocused = derived(this, (reader) => this.isModifedFocused.read(reader) || this.isOriginalFocused.read(reader)); + this._resourceLabel = this._workbenchUIElementFactory.createResourceLabel ? this._register(this._workbenchUIElementFactory.createResourceLabel(this._elements.primaryPath)) : void 0; + this._resourceLabel2 = this._workbenchUIElementFactory.createResourceLabel ? this._register(this._workbenchUIElementFactory.createResourceLabel(this._elements.secondaryPath)) : void 0; + this._dataStore = new DisposableStore(); + this._headerHeight = 40; + this._lastScrollTop = -1; + this._isSettingScrollTop = false; + const btn = new Button(this._elements.collapseButton, {}); + this._register(autorun((reader) => { + btn.element.className = ""; + btn.icon = this._collapsed.read(reader) ? Codicon.chevronRight : Codicon.chevronDown; + })); + this._register(btn.onDidClick(() => { + var _a10; + (_a10 = this._viewModel.get()) === null || _a10 === void 0 ? void 0 : _a10.collapsed.set(!this._collapsed.get(), void 0); + })); + this._register(autorun((reader) => { + this._elements.editor.style.display = this._collapsed.read(reader) ? "none" : "block"; + })); + this._register(this.editor.getModifiedEditor().onDidLayoutChange((e) => { + const width2 = this.editor.getModifiedEditor().getLayoutInfo().contentWidth; + this._modifiedWidth.set(width2, void 0); + })); + this._register(this.editor.getOriginalEditor().onDidLayoutChange((e) => { + const width2 = this.editor.getOriginalEditor().getLayoutInfo().contentWidth; + this._originalWidth.set(width2, void 0); + })); + this._register(this.editor.onDidContentSizeChange((e) => { + globalTransaction((tx) => { + this._editorContentHeight.set(e.contentHeight, tx); + this._modifiedContentWidth.set(this.editor.getModifiedEditor().getContentWidth(), tx); + this._originalContentWidth.set(this.editor.getOriginalEditor().getContentWidth(), tx); + }); + })); + this._register(this.editor.getOriginalEditor().onDidScrollChange((e) => { + if (this._isSettingScrollTop) { + return; + } + if (!e.scrollTopChanged || !this._data) { + return; + } + const delta = e.scrollTop - this._lastScrollTop; + this._data.deltaScrollVertical(delta); + })); + this._register(autorun((reader) => { + var _a10; + const isActive = (_a10 = this._viewModel.read(reader)) === null || _a10 === void 0 ? void 0 : _a10.isActive.read(reader); + this._elements.root.classList.toggle("active", isActive); + })); + this._container.appendChild(this._elements.root); + this._outerEditorHeight = this._headerHeight; + this._register(this._instantiationService.createInstance(MenuWorkbenchToolBar, this._elements.actions, MenuId.MultiDiffEditorFileToolbar, { + actionRunner: this._register(new ActionRunnerWithContext(() => { + var _a10; + return (_a10 = this._viewModel.get()) === null || _a10 === void 0 ? void 0 : _a10.modifiedUri; + })), + menuOptions: { + shouldForwardArgs: true + }, + toolbarOptions: { primaryGroup: (g) => g.startsWith("navigation") }, + actionViewItemProvider: (action, options2) => createActionViewItem(_instantiationService, action, options2) + })); + } + setScrollLeft(left) { + if (this._modifiedContentWidth.get() - this._modifiedWidth.get() > this._originalContentWidth.get() - this._originalWidth.get()) { + this.editor.getModifiedEditor().setScrollLeft(left); + } else { + this.editor.getOriginalEditor().setScrollLeft(left); + } + } + setData(data) { + this._data = data; + function updateOptions(options2) { + return __spreadProps(__spreadValues({}, options2), { + scrollBeyondLastLine: false, + hideUnchangedRegions: { + enabled: true + }, + scrollbar: { + vertical: "hidden", + horizontal: "hidden", + handleMouseWheel: false, + useShadows: false + }, + renderOverviewRuler: false, + fixedOverflowWidgets: true, + overviewRulerBorder: false + }); + } + const value = data.viewModel.entry.value; + if (value.onOptionsDidChange) { + this._dataStore.add(value.onOptionsDidChange(() => { + var _a10; + this.editor.updateOptions(updateOptions((_a10 = value.options) !== null && _a10 !== void 0 ? _a10 : {})); + })); + } + globalTransaction((tx) => { + var _a10, _b4, _c2, _d2; + (_a10 = this._resourceLabel) === null || _a10 === void 0 ? void 0 : _a10.setUri((_b4 = data.viewModel.modifiedUri) !== null && _b4 !== void 0 ? _b4 : data.viewModel.originalUri, { strikethrough: data.viewModel.modifiedUri === void 0 }); + let isRenamed = false; + let isDeleted = false; + let isAdded = false; + let flag = ""; + if (data.viewModel.modifiedUri && data.viewModel.originalUri && data.viewModel.modifiedUri.path !== data.viewModel.originalUri.path) { + flag = "R"; + isRenamed = true; + } else if (!data.viewModel.modifiedUri) { + flag = "D"; + isDeleted = true; + } else if (!data.viewModel.originalUri) { + flag = "A"; + isAdded = true; + } + this._elements.status.classList.toggle("renamed", isRenamed); + this._elements.status.classList.toggle("deleted", isDeleted); + this._elements.status.classList.toggle("added", isAdded); + this._elements.status.innerText = flag; + (_c2 = this._resourceLabel2) === null || _c2 === void 0 ? void 0 : _c2.setUri(isRenamed ? data.viewModel.originalUri : void 0, { strikethrough: true }); + this._dataStore.clear(); + this._viewModel.set(data.viewModel, tx); + this.editor.setModel(data.viewModel.diffEditorViewModel, tx); + this.editor.updateOptions(updateOptions((_d2 = value.options) !== null && _d2 !== void 0 ? _d2 : {})); + }); + } + render(verticalRange, width2, editorScroll, viewPort) { + this._elements.root.style.visibility = "visible"; + this._elements.root.style.top = `${verticalRange.start}px`; + this._elements.root.style.height = `${verticalRange.length}px`; + this._elements.root.style.width = `${width2}px`; + this._elements.root.style.position = "absolute"; + const maxDelta = verticalRange.length - this._headerHeight; + const delta = Math.max(0, Math.min(viewPort.start - verticalRange.start, maxDelta)); + this._elements.header.style.transform = `translateY(${delta}px)`; + globalTransaction((tx) => { + this.editor.layout({ + width: width2 - 2 * 8 - 2 * 1, + height: verticalRange.length - this._outerEditorHeight + }); + }); + try { + this._isSettingScrollTop = true; + this._lastScrollTop = editorScroll; + this.editor.getOriginalEditor().setScrollTop(editorScroll); + } finally { + this._isSettingScrollTop = false; + } + this._elements.header.classList.toggle("shadow", delta > 0 || editorScroll > 0); + this._elements.header.classList.toggle("collapsed", delta === maxDelta); + } + hide() { + this._elements.root.style.top = `-100000px`; + this._elements.root.style.visibility = "hidden"; + } + }; + DiffEditorItemTemplate = __decorate60([ + __param54(3, IInstantiationService) + ], DiffEditorItemTemplate); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/multiDiffEditor/objectPool.js +var ObjectPool; +var init_objectPool = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/multiDiffEditor/objectPool.js"() { + ObjectPool = class { + constructor(_create) { + this._create = _create; + this._unused = /* @__PURE__ */ new Set(); + this._used = /* @__PURE__ */ new Set(); + this._itemData = /* @__PURE__ */ new Map(); + } + getUnusedObj(data) { + var _a10; + let obj; + if (this._unused.size === 0) { + obj = this._create(data); + this._itemData.set(obj, data); + } else { + const values2 = [...this._unused.values()]; + obj = (_a10 = values2.find((obj2) => this._itemData.get(obj2).getId() === data.getId())) !== null && _a10 !== void 0 ? _a10 : values2[0]; + this._unused.delete(obj); + this._itemData.set(obj, data); + obj.setData(data); + } + this._used.add(obj); + return { + object: obj, + dispose: () => { + this._used.delete(obj); + if (this._unused.size > 5) { + obj.dispose(); + } else { + this._unused.add(obj); + } + } + }; + } + dispose() { + for (const obj of this._used) { + obj.dispose(); + } + for (const obj of this._unused) { + obj.dispose(); + } + this._used.clear(); + this._unused.clear(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.js +var __decorate61, __param55, MultiDiffEditorWidgetImpl, VirtualizedViewItem; +var init_multiDiffEditorWidgetImpl = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.js"() { + init_dom(); + init_scrollableElement(); + init_arrays(); + init_arraysFind(); + init_errors(); + init_lifecycle(); + init_observable(); + init_base(); + init_scrollable(); + init_style2(); + init_utils4(); + init_offsetRange(); + init_selection(); + init_editorContextKeys(); + init_contextkey(); + init_instantiation(); + init_serviceCollection(); + init_diffEditorItemTemplate(); + init_objectPool(); + init_nls(); + __decorate61 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param55 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + MultiDiffEditorWidgetImpl = class MultiDiffEditorWidgetImpl2 extends Disposable { + constructor(_element, _dimension, _viewModel, _workbenchUIElementFactory, _parentContextKeyService, _parentInstantiationService) { + super(); + this._element = _element; + this._dimension = _dimension; + this._viewModel = _viewModel; + this._workbenchUIElementFactory = _workbenchUIElementFactory; + this._parentContextKeyService = _parentContextKeyService; + this._parentInstantiationService = _parentInstantiationService; + this._scrollableElements = h("div.scrollContent", [ + h("div@content", { + style: { + overflow: "hidden" + } + }), + h("div.monaco-editor@overflowWidgetsDomNode", {}) + ]); + this._scrollable = this._register(new Scrollable({ + forceIntegerValues: false, + scheduleAtNextAnimationFrame: (cb) => scheduleAtNextAnimationFrame(getWindow(this._element), cb), + smoothScrollDuration: 100 + })); + this._scrollableElement = this._register(new SmoothScrollableElement(this._scrollableElements.root, { + vertical: 1, + horizontal: 1, + useShadows: false + }, this._scrollable)); + this._elements = h("div.monaco-component.multiDiffEditor", {}, [ + h("div", {}, [this._scrollableElement.getDomNode()]), + h("div.placeholder@placeholder", {}, [h("div", [localize("noChangedFiles", "No Changed Files")])]) + ]); + this._sizeObserver = this._register(new ObservableElementSizeObserver(this._element, void 0)); + this._objectPool = this._register(new ObjectPool((data) => { + const template = this._instantiationService.createInstance(DiffEditorItemTemplate, this._scrollableElements.content, this._scrollableElements.overflowWidgetsDomNode, this._workbenchUIElementFactory); + template.setData(data); + return template; + })); + this.scrollTop = observableFromEvent(this._scrollableElement.onScroll, () => ( + /** @description scrollTop */ + this._scrollableElement.getScrollPosition().scrollTop + )); + this.scrollLeft = observableFromEvent(this._scrollableElement.onScroll, () => ( + /** @description scrollLeft */ + this._scrollableElement.getScrollPosition().scrollLeft + )); + this._viewItemsInfo = derivedWithStore(this, (reader, store) => { + const vm = this._viewModel.read(reader); + if (!vm) { + return { items: [], getItem: (_d2) => { + throw new BugIndicatingError(); + } }; + } + const viewModels = vm.items.read(reader); + const map = /* @__PURE__ */ new Map(); + const items = viewModels.map((d) => { + var _a10; + const item = store.add(new VirtualizedViewItem(d, this._objectPool, this.scrollLeft, (delta) => { + this._scrollableElement.setScrollPosition({ scrollTop: this._scrollableElement.getScrollPosition().scrollTop + delta }); + })); + const data = (_a10 = this._lastDocStates) === null || _a10 === void 0 ? void 0 : _a10[item.getKey()]; + if (data) { + transaction((tx) => { + item.setViewState(data, tx); + }); + } + map.set(d, item); + return item; + }); + return { items, getItem: (d) => map.get(d) }; + }); + this._viewItems = this._viewItemsInfo.map(this, (items) => items.items); + this._spaceBetweenPx = 0; + this._totalHeight = this._viewItems.map(this, (items, reader) => items.reduce((r, i) => r + i.contentHeight.read(reader) + this._spaceBetweenPx, 0)); + this._contextKeyService = this._register(this._parentContextKeyService.createScoped(this._element)); + this._instantiationService = this._register(this._parentInstantiationService.createChild(new ServiceCollection([IContextKeyService, this._contextKeyService]))); + this._lastDocStates = {}; + this._contextKeyService.createKey(EditorContextKeys.inMultiDiffEditor.key, true); + this._register(autorunWithStore((reader, store) => { + const viewModel = this._viewModel.read(reader); + if (viewModel && viewModel.contextKeys) { + for (const [key, value] of Object.entries(viewModel.contextKeys)) { + const contextKey = this._contextKeyService.createKey(key, void 0); + contextKey.set(value); + store.add(toDisposable(() => contextKey.reset())); + } + } + })); + const ctxAllCollapsed = this._parentContextKeyService.createKey(EditorContextKeys.multiDiffEditorAllCollapsed.key, false); + this._register(autorun((reader) => { + const viewModel = this._viewModel.read(reader); + if (viewModel) { + const allCollapsed = viewModel.items.read(reader).every((item) => item.collapsed.read(reader)); + ctxAllCollapsed.set(allCollapsed); + } + })); + this._register(autorun((reader) => { + const dimension = this._dimension.read(reader); + this._sizeObserver.observe(dimension); + })); + this._register(autorun((reader) => { + const items = this._viewItems.read(reader); + this._elements.placeholder.classList.toggle("visible", items.length === 0); + })); + this._scrollableElements.content.style.position = "relative"; + this._register(autorun((reader) => { + const height = this._sizeObserver.height.read(reader); + this._scrollableElements.root.style.height = `${height}px`; + const totalHeight = this._totalHeight.read(reader); + this._scrollableElements.content.style.height = `${totalHeight}px`; + const width2 = this._sizeObserver.width.read(reader); + let scrollWidth = width2; + const viewItems = this._viewItems.read(reader); + const max = findFirstMax(viewItems, compareBy((i) => i.maxScroll.read(reader).maxScroll, numberComparator)); + if (max) { + const maxScroll = max.maxScroll.read(reader); + scrollWidth = width2 + maxScroll.maxScroll; + } + this._scrollableElement.setScrollDimensions({ + width: width2, + height, + scrollHeight: totalHeight, + scrollWidth + }); + })); + _element.replaceChildren(this._elements.root); + this._register(toDisposable(() => { + _element.replaceChildren(); + })); + this._register(this._register(autorun((reader) => { + globalTransaction((tx) => { + this.render(reader); + }); + }))); + } + render(reader) { + const scrollTop = this.scrollTop.read(reader); + let contentScrollOffsetToScrollOffset = 0; + let itemHeightSumBefore = 0; + let itemContentHeightSumBefore = 0; + const viewPortHeight = this._sizeObserver.height.read(reader); + const contentViewPort = OffsetRange.ofStartAndLength(scrollTop, viewPortHeight); + const width2 = this._sizeObserver.width.read(reader); + for (const v of this._viewItems.read(reader)) { + const itemContentHeight = v.contentHeight.read(reader); + const itemHeight = Math.min(itemContentHeight, viewPortHeight); + const itemRange = OffsetRange.ofStartAndLength(itemHeightSumBefore, itemHeight); + const itemContentRange = OffsetRange.ofStartAndLength(itemContentHeightSumBefore, itemContentHeight); + if (itemContentRange.isBefore(contentViewPort)) { + contentScrollOffsetToScrollOffset -= itemContentHeight - itemHeight; + v.hide(); + } else if (itemContentRange.isAfter(contentViewPort)) { + v.hide(); + } else { + const scroll = Math.max(0, Math.min(contentViewPort.start - itemContentRange.start, itemContentHeight - itemHeight)); + contentScrollOffsetToScrollOffset -= scroll; + const viewPort = OffsetRange.ofStartAndLength(scrollTop + contentScrollOffsetToScrollOffset, viewPortHeight); + v.render(itemRange, scroll, width2, viewPort); + } + itemHeightSumBefore += itemHeight + this._spaceBetweenPx; + itemContentHeightSumBefore += itemContentHeight + this._spaceBetweenPx; + } + this._scrollableElements.content.style.transform = `translateY(${-(scrollTop + contentScrollOffsetToScrollOffset)}px)`; + } + }; + MultiDiffEditorWidgetImpl = __decorate61([ + __param55(4, IContextKeyService), + __param55(5, IInstantiationService) + ], MultiDiffEditorWidgetImpl); + VirtualizedViewItem = class extends Disposable { + constructor(viewModel, _objectPool, _scrollLeft, _deltaScrollVertical) { + super(); + this.viewModel = viewModel; + this._objectPool = _objectPool; + this._scrollLeft = _scrollLeft; + this._deltaScrollVertical = _deltaScrollVertical; + this._templateRef = this._register(disposableObservableValue(this, void 0)); + this.contentHeight = derived(this, (reader) => { + var _a10, _b4, _c2; + return (_c2 = (_b4 = (_a10 = this._templateRef.read(reader)) === null || _a10 === void 0 ? void 0 : _a10.object.contentHeight) === null || _b4 === void 0 ? void 0 : _b4.read(reader)) !== null && _c2 !== void 0 ? _c2 : this.viewModel.lastTemplateData.read(reader).contentHeight; + }); + this.maxScroll = derived(this, (reader) => { + var _a10, _b4; + return (_b4 = (_a10 = this._templateRef.read(reader)) === null || _a10 === void 0 ? void 0 : _a10.object.maxScroll.read(reader)) !== null && _b4 !== void 0 ? _b4 : { maxScroll: 0, scrollWidth: 0 }; + }); + this.template = derived(this, (reader) => { + var _a10; + return (_a10 = this._templateRef.read(reader)) === null || _a10 === void 0 ? void 0 : _a10.object; + }); + this._isHidden = observableValue(this, false); + this._isFocused = derived(this, (reader) => { + var _a10, _b4; + return (_b4 = (_a10 = this.template.read(reader)) === null || _a10 === void 0 ? void 0 : _a10.isFocused.read(reader)) !== null && _b4 !== void 0 ? _b4 : false; + }); + this.viewModel.setIsFocused(this._isFocused, void 0); + this._register(autorun((reader) => { + var _a10; + const scrollLeft = this._scrollLeft.read(reader); + (_a10 = this._templateRef.read(reader)) === null || _a10 === void 0 ? void 0 : _a10.object.setScrollLeft(scrollLeft); + })); + this._register(autorun((reader) => { + const ref = this._templateRef.read(reader); + if (!ref) { + return; + } + const isHidden = this._isHidden.read(reader); + if (!isHidden) { + return; + } + const isFocused2 = ref.object.isFocused.read(reader); + if (isFocused2) { + return; + } + this._clear(); + })); + } + dispose() { + this._clear(); + super.dispose(); + } + toString() { + var _a10; + return `VirtualViewItem(${(_a10 = this.viewModel.entry.value.modified) === null || _a10 === void 0 ? void 0 : _a10.uri.toString()})`; + } + getKey() { + return this.viewModel.getKey(); + } + setViewState(viewState, tx) { + var _a10; + this.viewModel.collapsed.set(viewState.collapsed, tx); + this._updateTemplateData(tx); + const data = this.viewModel.lastTemplateData.get(); + const selections = (_a10 = viewState.selections) === null || _a10 === void 0 ? void 0 : _a10.map(Selection.liftSelection); + this.viewModel.lastTemplateData.set(__spreadProps(__spreadValues({}, data), { + selections + }), tx); + const ref = this._templateRef.get(); + if (ref) { + if (selections) { + ref.object.editor.setSelections(selections); + } + } + } + _updateTemplateData(tx) { + var _a10; + const ref = this._templateRef.get(); + if (!ref) { + return; + } + this.viewModel.lastTemplateData.set({ + contentHeight: ref.object.contentHeight.get(), + selections: (_a10 = ref.object.editor.getSelections()) !== null && _a10 !== void 0 ? _a10 : void 0 + }, tx); + } + _clear() { + const ref = this._templateRef.get(); + if (!ref) { + return; + } + transaction((tx) => { + this._updateTemplateData(tx); + ref.object.hide(); + this._templateRef.set(void 0, tx); + }); + } + hide() { + this._isHidden.set(true, void 0); + } + render(verticalSpace, offset, width2, viewPort) { + this._isHidden.set(false, void 0); + let ref = this._templateRef.get(); + if (!ref) { + ref = this._objectPool.getUnusedObj(new TemplateData(this.viewModel, this._deltaScrollVertical)); + this._templateRef.set(ref, void 0); + const selections = this.viewModel.lastTemplateData.get().selections; + if (selections) { + ref.object.editor.setSelections(selections); + } + } + ref.object.render(verticalSpace, width2, offset, viewPort); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/multiDiffEditor/colors.js +var multiDiffEditorHeaderBackground, multiDiffEditorBackground, multiDiffEditorBorder; +var init_colors = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/multiDiffEditor/colors.js"() { + init_nls(); + init_colorRegistry(); + multiDiffEditorHeaderBackground = registerColor("multiDiffEditor.headerBackground", { dark: "#262626", light: "tab.inactiveBackground", hcDark: "tab.inactiveBackground", hcLight: "tab.inactiveBackground" }, localize("multiDiffEditor.headerBackground", "The background color of the diff editor's header")); + multiDiffEditorBackground = registerColor("multiDiffEditor.background", { dark: "editorBackground", light: "editorBackground", hcDark: "editorBackground", hcLight: "editorBackground" }, localize("multiDiffEditor.background", "The background color of the multi file diff editor")); + multiDiffEditorBorder = registerColor("multiDiffEditor.border", { dark: "sideBarSectionHeader.border", light: "#cccccc", hcDark: "sideBarSectionHeader.border", hcLight: "#cccccc" }, localize("multiDiffEditor.border", "The border color of the multi file diff editor")); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidget.js +var __decorate62, __param56, MultiDiffEditorWidget; +var init_multiDiffEditorWidget = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidget.js"() { + init_lifecycle(); + init_observable(); + init_utils4(); + init_multiDiffEditorWidgetImpl(); + init_instantiation(); + init_colors(); + init_diffEditorItemTemplate(); + __decorate62 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param56 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + MultiDiffEditorWidget = class MultiDiffEditorWidget2 extends Disposable { + constructor(_element, _workbenchUIElementFactory, _instantiationService) { + super(); + this._element = _element; + this._workbenchUIElementFactory = _workbenchUIElementFactory; + this._instantiationService = _instantiationService; + this._dimension = observableValue(this, void 0); + this._viewModel = observableValue(this, void 0); + this._widgetImpl = derivedWithStore(this, (reader, store) => { + readHotReloadableExport(DiffEditorItemTemplate, reader); + return store.add(this._instantiationService.createInstance(readHotReloadableExport(MultiDiffEditorWidgetImpl, reader), this._element, this._dimension, this._viewModel, this._workbenchUIElementFactory)); + }); + this._register(recomputeInitiallyAndOnChange(this._widgetImpl)); + } + }; + MultiDiffEditorWidget = __decorate62([ + __param56(2, IInstantiationService) + ], MultiDiffEditorWidget); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/browser/standaloneEditor.js +function create2(domElement, options2, override) { + const instantiationService = StandaloneServices.initialize(override || {}); + return instantiationService.createInstance(StandaloneEditor, domElement, options2); +} +function onDidCreateEditor(listener) { + const codeEditorService = StandaloneServices.get(ICodeEditorService); + return codeEditorService.onCodeEditorAdd((editor2) => { + listener(editor2); + }); +} +function onDidCreateDiffEditor(listener) { + const codeEditorService = StandaloneServices.get(ICodeEditorService); + return codeEditorService.onDiffEditorAdd((editor2) => { + listener(editor2); + }); +} +function getEditors() { + const codeEditorService = StandaloneServices.get(ICodeEditorService); + return codeEditorService.listCodeEditors(); +} +function getDiffEditors() { + const codeEditorService = StandaloneServices.get(ICodeEditorService); + return codeEditorService.listDiffEditors(); +} +function createDiffEditor(domElement, options2, override) { + const instantiationService = StandaloneServices.initialize(override || {}); + return instantiationService.createInstance(StandaloneDiffEditor2, domElement, options2); +} +function createMultiFileDiffEditor(domElement, override) { + const instantiationService = StandaloneServices.initialize(override || {}); + return new MultiDiffEditorWidget(domElement, {}, instantiationService); +} +function addCommand(descriptor) { + if (typeof descriptor.id !== "string" || typeof descriptor.run !== "function") { + throw new Error("Invalid command descriptor, `id` and `run` are required properties!"); + } + return CommandsRegistry.registerCommand(descriptor.id, descriptor.run); +} +function addEditorAction(descriptor) { + if (typeof descriptor.id !== "string" || typeof descriptor.label !== "string" || typeof descriptor.run !== "function") { + throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!"); + } + const precondition = ContextKeyExpr.deserialize(descriptor.precondition); + const run = (accessor, ...args) => { + return EditorCommand.runEditorCommand(accessor, args, precondition, (accessor2, editor2, args2) => Promise.resolve(descriptor.run(editor2, ...args2))); + }; + const toDispose = new DisposableStore(); + toDispose.add(CommandsRegistry.registerCommand(descriptor.id, run)); + if (descriptor.contextMenuGroupId) { + const menuItem = { + command: { + id: descriptor.id, + title: descriptor.label + }, + when: precondition, + group: descriptor.contextMenuGroupId, + order: descriptor.contextMenuOrder || 0 + }; + toDispose.add(MenuRegistry.appendMenuItem(MenuId.EditorContext, menuItem)); + } + if (Array.isArray(descriptor.keybindings)) { + const keybindingService = StandaloneServices.get(IKeybindingService); + if (!(keybindingService instanceof StandaloneKeybindingService)) { + console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"); + } else { + const keybindingsWhen = ContextKeyExpr.and(precondition, ContextKeyExpr.deserialize(descriptor.keybindingContext)); + toDispose.add(keybindingService.addDynamicKeybindings(descriptor.keybindings.map((keybinding) => { + return { + keybinding, + command: descriptor.id, + when: keybindingsWhen + }; + }))); + } + } + return toDispose; +} +function addKeybindingRule(rule) { + return addKeybindingRules([rule]); +} +function addKeybindingRules(rules) { + const keybindingService = StandaloneServices.get(IKeybindingService); + if (!(keybindingService instanceof StandaloneKeybindingService)) { + console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"); + return Disposable.None; + } + return keybindingService.addDynamicKeybindings(rules.map((rule) => { + return { + keybinding: rule.keybinding, + command: rule.command, + commandArgs: rule.commandArgs, + when: ContextKeyExpr.deserialize(rule.when) + }; + })); +} +function createModel(value, language82, uri) { + const languageService = StandaloneServices.get(ILanguageService); + const languageId = languageService.getLanguageIdByMimeType(language82) || language82; + return createTextModel(StandaloneServices.get(IModelService), languageService, value, languageId, uri); +} +function setModelLanguage(model, mimeTypeOrLanguageId) { + const languageService = StandaloneServices.get(ILanguageService); + const languageId = languageService.getLanguageIdByMimeType(mimeTypeOrLanguageId) || mimeTypeOrLanguageId || PLAINTEXT_LANGUAGE_ID; + model.setLanguage(languageService.createById(languageId)); +} +function setModelMarkers(model, owner, markers) { + if (model) { + const markerService = StandaloneServices.get(IMarkerService); + markerService.changeOne(owner, model.uri, markers); + } +} +function removeAllMarkers(owner) { + const markerService = StandaloneServices.get(IMarkerService); + markerService.changeAll(owner, []); +} +function getModelMarkers(filter) { + const markerService = StandaloneServices.get(IMarkerService); + return markerService.read(filter); +} +function onDidChangeMarkers(listener) { + const markerService = StandaloneServices.get(IMarkerService); + return markerService.onMarkerChanged(listener); +} +function getModel(uri) { + const modelService = StandaloneServices.get(IModelService); + return modelService.getModel(uri); +} +function getModels() { + const modelService = StandaloneServices.get(IModelService); + return modelService.getModels(); +} +function onDidCreateModel(listener) { + const modelService = StandaloneServices.get(IModelService); + return modelService.onModelAdded(listener); +} +function onWillDisposeModel(listener) { + const modelService = StandaloneServices.get(IModelService); + return modelService.onModelRemoved(listener); +} +function onDidChangeModelLanguage(listener) { + const modelService = StandaloneServices.get(IModelService); + return modelService.onModelLanguageChanged((e) => { + listener({ + model: e.model, + oldLanguage: e.oldLanguageId + }); + }); +} +function createWebWorker2(opts) { + return createWebWorker(StandaloneServices.get(IModelService), StandaloneServices.get(ILanguageConfigurationService), opts); +} +function colorizeElement(domNode, options2) { + const languageService = StandaloneServices.get(ILanguageService); + const themeService = StandaloneServices.get(IStandaloneThemeService); + return Colorizer.colorizeElement(themeService, languageService, domNode, options2).then(() => { + themeService.registerEditorContainer(domNode); + }); +} +function colorize(text2, languageId, options2) { + const languageService = StandaloneServices.get(ILanguageService); + const themeService = StandaloneServices.get(IStandaloneThemeService); + themeService.registerEditorContainer(mainWindow.document.body); + return Colorizer.colorize(languageService, text2, languageId, options2); +} +function colorizeModelLine(model, lineNumber, tabSize = 4) { + const themeService = StandaloneServices.get(IStandaloneThemeService); + themeService.registerEditorContainer(mainWindow.document.body); + return Colorizer.colorizeModelLine(model, lineNumber, tabSize); +} +function getSafeTokenizationSupport(language82) { + const tokenizationSupport = TokenizationRegistry2.get(language82); + if (tokenizationSupport) { + return tokenizationSupport; + } + return { + getInitialState: () => NullState, + tokenize: (line, hasEOL, state) => nullTokenize(language82, state) + }; +} +function tokenize(text2, languageId) { + TokenizationRegistry2.getOrCreate(languageId); + const tokenizationSupport = getSafeTokenizationSupport(languageId); + const lines = splitLines(text2); + const result = []; + let state = tokenizationSupport.getInitialState(); + for (let i = 0, len = lines.length; i < len; i++) { + const line = lines[i]; + const tokenizationResult = tokenizationSupport.tokenize(line, true, state); + result[i] = tokenizationResult.tokens; + state = tokenizationResult.endState; + } + return result; +} +function defineTheme(themeName, themeData) { + const standaloneThemeService = StandaloneServices.get(IStandaloneThemeService); + standaloneThemeService.defineTheme(themeName, themeData); +} +function setTheme(themeName) { + const standaloneThemeService = StandaloneServices.get(IStandaloneThemeService); + standaloneThemeService.setTheme(themeName); +} +function remeasureFonts() { + FontMeasurements.clearAllFontInfos(); +} +function registerCommand3(id, handler) { + return CommandsRegistry.registerCommand({ id, handler }); +} +function registerLinkOpener(opener) { + const openerService = StandaloneServices.get(IOpenerService); + return openerService.registerOpener({ + open(resource) { + return __async(this, null, function* () { + if (typeof resource === "string") { + resource = URI.parse(resource); + } + return opener.open(resource); + }); + } + }); +} +function registerEditorOpener(opener) { + const codeEditorService = StandaloneServices.get(ICodeEditorService); + return codeEditorService.registerCodeEditorOpenHandler((input, source, sideBySide) => __async(this, null, function* () { + var _a10; + if (!source) { + return null; + } + const selection = (_a10 = input.options) === null || _a10 === void 0 ? void 0 : _a10.selection; + let selectionOrPosition; + if (selection && typeof selection.endLineNumber === "number" && typeof selection.endColumn === "number") { + selectionOrPosition = selection; + } else if (selection) { + selectionOrPosition = { lineNumber: selection.startLineNumber, column: selection.startColumn }; + } + if (yield opener.openCodeEditor(source, input.resource, selectionOrPosition)) { + return source; + } + return null; + })); +} +function createMonacoEditorAPI() { + return { + // methods + create: create2, + getEditors, + getDiffEditors, + onDidCreateEditor, + onDidCreateDiffEditor, + createDiffEditor, + addCommand, + addEditorAction, + addKeybindingRule, + addKeybindingRules, + createModel, + setModelLanguage, + setModelMarkers, + getModelMarkers, + removeAllMarkers, + onDidChangeMarkers, + getModels, + getModel, + onDidCreateModel, + onWillDisposeModel, + onDidChangeModelLanguage, + createWebWorker: createWebWorker2, + colorizeElement, + colorize, + colorizeModelLine, + tokenize, + defineTheme, + setTheme, + remeasureFonts, + registerCommand: registerCommand3, + registerLinkOpener, + registerEditorOpener, + // enums + AccessibilitySupport, + ContentWidgetPositionPreference, + CursorChangeReason, + DefaultEndOfLine, + EditorAutoIndentStrategy, + EditorOption, + EndOfLinePreference, + EndOfLineSequence, + MinimapPosition, + MinimapSectionHeaderStyle, + MouseTargetType, + OverlayWidgetPositionPreference, + OverviewRulerLane, + GlyphMarginLane, + RenderLineNumbersType, + RenderMinimap, + ScrollbarVisibility, + ScrollType, + TextEditorCursorBlinkingStyle, + TextEditorCursorStyle: TextEditorCursorStyle2, + TrackedRangeStickiness, + WrappingIndent, + InjectedTextCursorStops, + PositionAffinity, + ShowLightbulbIconMode: ShowLightbulbIconMode2, + // classes + ConfigurationChangedEvent, + BareFontInfo, + FontInfo, + TextModelResolvedOptions, + FindMatch, + ApplyUpdateResult, + EditorZoom, + createMultiFileDiffEditor, + // vars + EditorType, + EditorOptions + }; +} +var init_standaloneEditor = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/browser/standaloneEditor.js"() { + init_window(); + init_lifecycle(); + init_strings(); + init_uri(); + init_standalone_tokens(); + init_fontMeasurements(); + init_editorExtensions(); + init_codeEditorService(); + init_webWorker(); + init_editorOptions(); + init_editorZoom(); + init_fontInfo(); + init_editorCommon(); + init_languages(); + init_language(); + init_languageConfigurationRegistry(); + init_modesRegistry(); + init_nullTokenize(); + init_model2(); + init_model(); + init_standaloneEnums(); + init_colorizer(); + init_standaloneCodeEditor(); + init_standaloneServices(); + init_standaloneTheme(); + init_actions2(); + init_commands(); + init_contextkey(); + init_keybinding(); + init_markers(); + init_opener(); + init_multiDiffEditorWidget(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/common/monarch/monarchCompile.js +function isArrayOf(elemType, obj) { + if (!obj) { + return false; + } + if (!Array.isArray(obj)) { + return false; + } + for (const el of obj) { + if (!elemType(el)) { + return false; + } + } + return true; +} +function bool(prop, defValue) { + if (typeof prop === "boolean") { + return prop; + } + return defValue; +} +function string(prop, defValue) { + if (typeof prop === "string") { + return prop; + } + return defValue; +} +function arrayToHash(array2) { + const result = {}; + for (const e of array2) { + result[e] = true; + } + return result; +} +function createKeywordMatcher(arr, caseInsensitive = false) { + if (caseInsensitive) { + arr = arr.map(function(x) { + return x.toLowerCase(); + }); + } + const hash2 = arrayToHash(arr); + if (caseInsensitive) { + return function(word) { + return hash2[word.toLowerCase()] !== void 0 && hash2.hasOwnProperty(word.toLowerCase()); + }; + } else { + return function(word) { + return hash2[word] !== void 0 && hash2.hasOwnProperty(word); + }; + } +} +function compileRegExp(lexer2, str, handleSn) { + str = str.replace(/@@/g, ``); + let n = 0; + let hadExpansion; + do { + hadExpansion = false; + str = str.replace(/@(\w+)/g, function(s, attr) { + hadExpansion = true; + let sub = ""; + if (typeof lexer2[attr] === "string") { + sub = lexer2[attr]; + } else if (lexer2[attr] && lexer2[attr] instanceof RegExp) { + sub = lexer2[attr].source; + } else { + if (lexer2[attr] === void 0) { + throw createError(lexer2, "language definition does not contain attribute '" + attr + "', used at: " + str); + } else { + throw createError(lexer2, "attribute reference '" + attr + "' must be a string, used at: " + str); + } + } + return empty(sub) ? "" : "(?:" + sub + ")"; + }); + n++; + } while (hadExpansion && n < 5); + str = str.replace(/\x01/g, "@"); + const flags = (lexer2.ignoreCase ? "i" : "") + (lexer2.unicode ? "u" : ""); + if (handleSn) { + const match2 = str.match(/\$[sS](\d\d?)/g); + if (match2) { + let lastState = null; + let lastRegEx = null; + return (state) => { + if (lastRegEx && lastState === state) { + return lastRegEx; + } + lastState = state; + lastRegEx = new RegExp(substituteMatchesRe(lexer2, str, state), flags); + return lastRegEx; + }; + } + } + return new RegExp(str, flags); +} +function selectScrutinee(id, matches2, state, num) { + if (num < 0) { + return id; + } + if (num < matches2.length) { + return matches2[num]; + } + if (num >= 100) { + num = num - 100; + const parts = state.split("."); + parts.unshift(state); + if (num < parts.length) { + return parts[num]; + } + } + return null; +} +function createGuard(lexer2, ruleName, tkey, val) { + let scrut = -1; + let oppat = tkey; + let matches2 = tkey.match(/^\$(([sS]?)(\d\d?)|#)(.*)$/); + if (matches2) { + if (matches2[3]) { + scrut = parseInt(matches2[3]); + if (matches2[2]) { + scrut = scrut + 100; + } + } + oppat = matches2[4]; + } + let op = "~"; + let pat = oppat; + if (!oppat || oppat.length === 0) { + op = "!="; + pat = ""; + } else if (/^\w*$/.test(pat)) { + op = "=="; + } else { + matches2 = oppat.match(/^(@|!@|~|!~|==|!=)(.*)$/); + if (matches2) { + op = matches2[1]; + pat = matches2[2]; + } + } + let tester; + if ((op === "~" || op === "!~") && /^(\w|\|)*$/.test(pat)) { + const inWords = createKeywordMatcher(pat.split("|"), lexer2.ignoreCase); + tester = function(s) { + return op === "~" ? inWords(s) : !inWords(s); + }; + } else if (op === "@" || op === "!@") { + const words = lexer2[pat]; + if (!words) { + throw createError(lexer2, "the @ match target '" + pat + "' is not defined, in rule: " + ruleName); + } + if (!isArrayOf(function(elem) { + return typeof elem === "string"; + }, words)) { + throw createError(lexer2, "the @ match target '" + pat + "' must be an array of strings, in rule: " + ruleName); + } + const inWords = createKeywordMatcher(words, lexer2.ignoreCase); + tester = function(s) { + return op === "@" ? inWords(s) : !inWords(s); + }; + } else if (op === "~" || op === "!~") { + if (pat.indexOf("$") < 0) { + const re = compileRegExp(lexer2, "^" + pat + "$", false); + tester = function(s) { + return op === "~" ? re.test(s) : !re.test(s); + }; + } else { + tester = function(s, id, matches3, state) { + const re = compileRegExp(lexer2, "^" + substituteMatches(lexer2, pat, id, matches3, state) + "$", false); + return re.test(s); + }; + } + } else { + if (pat.indexOf("$") < 0) { + const patx = fixCase(lexer2, pat); + tester = function(s) { + return op === "==" ? s === patx : s !== patx; + }; + } else { + const patx = fixCase(lexer2, pat); + tester = function(s, id, matches3, state, eos) { + const patexp = substituteMatches(lexer2, patx, id, matches3, state); + return op === "==" ? s === patexp : s !== patexp; + }; + } + } + if (scrut === -1) { + return { + name: tkey, + value: val, + test: function(id, matches3, state, eos) { + return tester(id, id, matches3, state, eos); + } + }; + } else { + return { + name: tkey, + value: val, + test: function(id, matches3, state, eos) { + const scrutinee = selectScrutinee(id, matches3, state, scrut); + return tester(!scrutinee ? "" : scrutinee, id, matches3, state, eos); + } + }; + } +} +function compileAction(lexer2, ruleName, action) { + if (!action) { + return { token: "" }; + } else if (typeof action === "string") { + return action; + } else if (action.token || action.token === "") { + if (typeof action.token !== "string") { + throw createError(lexer2, "a 'token' attribute must be of type string, in rule: " + ruleName); + } else { + const newAction = { token: action.token }; + if (action.token.indexOf("$") >= 0) { + newAction.tokenSubst = true; + } + if (typeof action.bracket === "string") { + if (action.bracket === "@open") { + newAction.bracket = 1; + } else if (action.bracket === "@close") { + newAction.bracket = -1; + } else { + throw createError(lexer2, "a 'bracket' attribute must be either '@open' or '@close', in rule: " + ruleName); + } + } + if (action.next) { + if (typeof action.next !== "string") { + throw createError(lexer2, "the next state must be a string value in rule: " + ruleName); + } else { + let next = action.next; + if (!/^(@pop|@push|@popall)$/.test(next)) { + if (next[0] === "@") { + next = next.substr(1); + } + if (next.indexOf("$") < 0) { + if (!stateExists(lexer2, substituteMatches(lexer2, next, "", [], ""))) { + throw createError(lexer2, "the next state '" + action.next + "' is not defined in rule: " + ruleName); + } + } + } + newAction.next = next; + } + } + if (typeof action.goBack === "number") { + newAction.goBack = action.goBack; + } + if (typeof action.switchTo === "string") { + newAction.switchTo = action.switchTo; + } + if (typeof action.log === "string") { + newAction.log = action.log; + } + if (typeof action.nextEmbedded === "string") { + newAction.nextEmbedded = action.nextEmbedded; + lexer2.usesEmbedded = true; + } + return newAction; + } + } else if (Array.isArray(action)) { + const results = []; + for (let i = 0, len = action.length; i < len; i++) { + results[i] = compileAction(lexer2, ruleName, action[i]); + } + return { group: results }; + } else if (action.cases) { + const cases = []; + for (const tkey in action.cases) { + if (action.cases.hasOwnProperty(tkey)) { + const val = compileAction(lexer2, ruleName, action.cases[tkey]); + if (tkey === "@default" || tkey === "@" || tkey === "") { + cases.push({ test: void 0, value: val, name: tkey }); + } else if (tkey === "@eos") { + cases.push({ test: function(id, matches2, state, eos) { + return eos; + }, value: val, name: tkey }); + } else { + cases.push(createGuard(lexer2, ruleName, tkey, val)); + } + } + } + const def = lexer2.defaultToken; + return { + test: function(id, matches2, state, eos) { + for (const _case of cases) { + const didmatch = !_case.test || _case.test(id, matches2, state, eos); + if (didmatch) { + return _case.value; + } + } + return def; + } + }; + } else { + throw createError(lexer2, "an action must be a string, an object with a 'token' or 'cases' attribute, or an array of actions; in rule: " + ruleName); + } +} +function compile(languageId, json) { + if (!json || typeof json !== "object") { + throw new Error("Monarch: expecting a language definition object"); + } + const lexer2 = {}; + lexer2.languageId = languageId; + lexer2.includeLF = bool(json.includeLF, false); + lexer2.noThrow = false; + lexer2.maxStack = 100; + lexer2.start = typeof json.start === "string" ? json.start : null; + lexer2.ignoreCase = bool(json.ignoreCase, false); + lexer2.unicode = bool(json.unicode, false); + lexer2.tokenPostfix = string(json.tokenPostfix, "." + lexer2.languageId); + lexer2.defaultToken = string(json.defaultToken, "source"); + lexer2.usesEmbedded = false; + const lexerMin = json; + lexerMin.languageId = languageId; + lexerMin.includeLF = lexer2.includeLF; + lexerMin.ignoreCase = lexer2.ignoreCase; + lexerMin.unicode = lexer2.unicode; + lexerMin.noThrow = lexer2.noThrow; + lexerMin.usesEmbedded = lexer2.usesEmbedded; + lexerMin.stateNames = json.tokenizer; + lexerMin.defaultToken = lexer2.defaultToken; + function addRules(state, newrules, rules) { + for (const rule of rules) { + let include = rule.include; + if (include) { + if (typeof include !== "string") { + throw createError(lexer2, "an 'include' attribute must be a string at: " + state); + } + if (include[0] === "@") { + include = include.substr(1); + } + if (!json.tokenizer[include]) { + throw createError(lexer2, "include target '" + include + "' is not defined at: " + state); + } + addRules(state + "." + include, newrules, json.tokenizer[include]); + } else { + const newrule = new Rule(state); + if (Array.isArray(rule) && rule.length >= 1 && rule.length <= 3) { + newrule.setRegex(lexerMin, rule[0]); + if (rule.length >= 3) { + if (typeof rule[1] === "string") { + newrule.setAction(lexerMin, { token: rule[1], next: rule[2] }); + } else if (typeof rule[1] === "object") { + const rule1 = rule[1]; + rule1.next = rule[2]; + newrule.setAction(lexerMin, rule1); + } else { + throw createError(lexer2, "a next state as the last element of a rule can only be given if the action is either an object or a string, at: " + state); + } + } else { + newrule.setAction(lexerMin, rule[1]); + } + } else { + if (!rule.regex) { + throw createError(lexer2, "a rule must either be an array, or an object with a 'regex' or 'include' field at: " + state); + } + if (rule.name) { + if (typeof rule.name === "string") { + newrule.name = rule.name; + } + } + if (rule.matchOnlyAtStart) { + newrule.matchOnlyAtLineStart = bool(rule.matchOnlyAtLineStart, false); + } + newrule.setRegex(lexerMin, rule.regex); + newrule.setAction(lexerMin, rule.action); + } + newrules.push(newrule); + } + } + } + if (!json.tokenizer || typeof json.tokenizer !== "object") { + throw createError(lexer2, "a language definition must define the 'tokenizer' attribute as an object"); + } + lexer2.tokenizer = []; + for (const key in json.tokenizer) { + if (json.tokenizer.hasOwnProperty(key)) { + if (!lexer2.start) { + lexer2.start = key; + } + const rules = json.tokenizer[key]; + lexer2.tokenizer[key] = new Array(); + addRules("tokenizer." + key, lexer2.tokenizer[key], rules); + } + } + lexer2.usesEmbedded = lexerMin.usesEmbedded; + if (json.brackets) { + if (!Array.isArray(json.brackets)) { + throw createError(lexer2, "the 'brackets' attribute must be defined as an array"); + } + } else { + json.brackets = [ + { open: "{", close: "}", token: "delimiter.curly" }, + { open: "[", close: "]", token: "delimiter.square" }, + { open: "(", close: ")", token: "delimiter.parenthesis" }, + { open: "<", close: ">", token: "delimiter.angle" } + ]; + } + const brackets = []; + for (const el of json.brackets) { + let desc = el; + if (desc && Array.isArray(desc) && desc.length === 3) { + desc = { token: desc[2], open: desc[0], close: desc[1] }; + } + if (desc.open === desc.close) { + throw createError(lexer2, "open and close brackets in a 'brackets' attribute must be different: " + desc.open + "\n hint: use the 'bracket' attribute if matching on equal brackets is required."); + } + if (typeof desc.open === "string" && typeof desc.token === "string" && typeof desc.close === "string") { + brackets.push({ + token: desc.token + lexer2.tokenPostfix, + open: fixCase(lexer2, desc.open), + close: fixCase(lexer2, desc.close) + }); + } else { + throw createError(lexer2, "every element in the 'brackets' array must be a '{open,close,token}' object or array"); + } + } + lexer2.brackets = brackets; + lexer2.noThrow = true; + return lexer2; +} +var Rule; +var init_monarchCompile = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/common/monarch/monarchCompile.js"() { + init_monarchCommon(); + Rule = class { + constructor(name) { + this.regex = new RegExp(""); + this.action = { token: "" }; + this.matchOnlyAtLineStart = false; + this.name = ""; + this.name = name; + } + setRegex(lexer2, re) { + let sregex; + if (typeof re === "string") { + sregex = re; + } else if (re instanceof RegExp) { + sregex = re.source; + } else { + throw createError(lexer2, "rules must start with a match string or regular expression: " + this.name); + } + this.matchOnlyAtLineStart = sregex.length > 0 && sregex[0] === "^"; + this.name = this.name + ": " + sregex; + this.regex = compileRegExp(lexer2, "^(?:" + (this.matchOnlyAtLineStart ? sregex.substr(1) : sregex) + ")", true); + } + setAction(lexer2, act) { + this.action = compileAction(lexer2, this.name, act); + } + resolveRegex(state) { + if (this.regex instanceof RegExp) { + return this.regex; + } else { + return this.regex(state); + } + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/standalone/browser/standaloneLanguages.js +function register3(language82) { + ModesRegistry.registerLanguage(language82); +} +function getLanguages() { + let result = []; + result = result.concat(ModesRegistry.getLanguages()); + return result; +} +function getEncodedLanguageId(languageId) { + const languageService = StandaloneServices.get(ILanguageService); + return languageService.languageIdCodec.encodeLanguageId(languageId); +} +function onLanguage(languageId, callback) { + return StandaloneServices.withServices(() => { + const languageService = StandaloneServices.get(ILanguageService); + const disposable = languageService.onDidRequestRichLanguageFeatures((encounteredLanguageId) => { + if (encounteredLanguageId === languageId) { + disposable.dispose(); + callback(); + } + }); + return disposable; + }); +} +function onLanguageEncountered(languageId, callback) { + return StandaloneServices.withServices(() => { + const languageService = StandaloneServices.get(ILanguageService); + const disposable = languageService.onDidRequestBasicLanguageFeatures((encounteredLanguageId) => { + if (encounteredLanguageId === languageId) { + disposable.dispose(); + callback(); + } + }); + return disposable; + }); +} +function setLanguageConfiguration(languageId, configuration) { + const languageService = StandaloneServices.get(ILanguageService); + if (!languageService.isRegisteredLanguageId(languageId)) { + throw new Error(`Cannot set configuration for unknown language ${languageId}`); + } + const languageConfigurationService = StandaloneServices.get(ILanguageConfigurationService); + return languageConfigurationService.register(languageId, configuration, 100); +} +function isATokensProvider(provider) { + return typeof provider.getInitialState === "function"; +} +function isEncodedTokensProvider(provider) { + return "tokenizeEncoded" in provider; +} +function isThenable2(obj) { + return obj && typeof obj.then === "function"; +} +function setColorMap(colorMap) { + const standaloneThemeService = StandaloneServices.get(IStandaloneThemeService); + if (colorMap) { + const result = [null]; + for (let i = 1, len = colorMap.length; i < len; i++) { + result[i] = Color.fromHex(colorMap[i]); + } + standaloneThemeService.setColorMapOverride(result); + } else { + standaloneThemeService.setColorMapOverride(null); + } +} +function createTokenizationSupportAdapter(languageId, provider) { + if (isEncodedTokensProvider(provider)) { + return new EncodedTokenizationSupportAdapter(languageId, provider); + } else { + return new TokenizationSupportAdapter(languageId, provider, StandaloneServices.get(ILanguageService), StandaloneServices.get(IStandaloneThemeService)); + } +} +function registerTokensProviderFactory(languageId, factory) { + const adaptedFactory = new LazyTokenizationSupport(() => __async(this, null, function* () { + const result = yield Promise.resolve(factory.create()); + if (!result) { + return null; + } + if (isATokensProvider(result)) { + return createTokenizationSupportAdapter(languageId, result); + } + return new MonarchTokenizer(StandaloneServices.get(ILanguageService), StandaloneServices.get(IStandaloneThemeService), languageId, compile(languageId, result), StandaloneServices.get(IConfigurationService)); + })); + return TokenizationRegistry2.registerFactory(languageId, adaptedFactory); +} +function setTokensProvider(languageId, provider) { + const languageService = StandaloneServices.get(ILanguageService); + if (!languageService.isRegisteredLanguageId(languageId)) { + throw new Error(`Cannot set tokens provider for unknown language ${languageId}`); + } + if (isThenable2(provider)) { + return registerTokensProviderFactory(languageId, { create: () => provider }); + } + return TokenizationRegistry2.register(languageId, createTokenizationSupportAdapter(languageId, provider)); +} +function setMonarchTokensProvider(languageId, languageDef) { + const create4 = (languageDef2) => { + return new MonarchTokenizer(StandaloneServices.get(ILanguageService), StandaloneServices.get(IStandaloneThemeService), languageId, compile(languageId, languageDef2), StandaloneServices.get(IConfigurationService)); + }; + if (isThenable2(languageDef)) { + return registerTokensProviderFactory(languageId, { create: () => languageDef }); + } + return TokenizationRegistry2.register(languageId, create4(languageDef)); +} +function registerReferenceProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.referenceProvider.register(languageSelector, provider); +} +function registerRenameProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.renameProvider.register(languageSelector, provider); +} +function registerNewSymbolNameProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.newSymbolNamesProvider.register(languageSelector, provider); +} +function registerSignatureHelpProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.signatureHelpProvider.register(languageSelector, provider); +} +function registerHoverProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.hoverProvider.register(languageSelector, { + provideHover: (model, position, token, context) => __async(this, null, function* () { + const word = model.getWordAtPosition(position); + return Promise.resolve(provider.provideHover(model, position, token, context)).then((value) => { + if (!value) { + return void 0; + } + if (!value.range && word) { + value.range = new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn); + } + if (!value.range) { + value.range = new Range(position.lineNumber, position.column, position.lineNumber, position.column); + } + return value; + }); + }) + }); +} +function registerDocumentSymbolProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.documentSymbolProvider.register(languageSelector, provider); +} +function registerDocumentHighlightProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.documentHighlightProvider.register(languageSelector, provider); +} +function registerLinkedEditingRangeProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.linkedEditingRangeProvider.register(languageSelector, provider); +} +function registerDefinitionProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.definitionProvider.register(languageSelector, provider); +} +function registerImplementationProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.implementationProvider.register(languageSelector, provider); +} +function registerTypeDefinitionProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.typeDefinitionProvider.register(languageSelector, provider); +} +function registerCodeLensProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.codeLensProvider.register(languageSelector, provider); +} +function registerCodeActionProvider(languageSelector, provider, metadata) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.codeActionProvider.register(languageSelector, { + providedCodeActionKinds: metadata === null || metadata === void 0 ? void 0 : metadata.providedCodeActionKinds, + documentation: metadata === null || metadata === void 0 ? void 0 : metadata.documentation, + provideCodeActions: (model, range2, context, token) => { + const markerService = StandaloneServices.get(IMarkerService); + const markers = markerService.read({ resource: model.uri }).filter((m) => { + return Range.areIntersectingOrTouching(m, range2); + }); + return provider.provideCodeActions(model, range2, { markers, only: context.only, trigger: context.trigger }, token); + }, + resolveCodeAction: provider.resolveCodeAction + }); +} +function registerDocumentFormattingEditProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.documentFormattingEditProvider.register(languageSelector, provider); +} +function registerDocumentRangeFormattingEditProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.documentRangeFormattingEditProvider.register(languageSelector, provider); +} +function registerOnTypeFormattingEditProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.onTypeFormattingEditProvider.register(languageSelector, provider); +} +function registerLinkProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.linkProvider.register(languageSelector, provider); +} +function registerCompletionItemProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.completionProvider.register(languageSelector, provider); +} +function registerColorProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.colorProvider.register(languageSelector, provider); +} +function registerFoldingRangeProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.foldingRangeProvider.register(languageSelector, provider); +} +function registerDeclarationProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.declarationProvider.register(languageSelector, provider); +} +function registerSelectionRangeProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.selectionRangeProvider.register(languageSelector, provider); +} +function registerDocumentSemanticTokensProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.documentSemanticTokensProvider.register(languageSelector, provider); +} +function registerDocumentRangeSemanticTokensProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.documentRangeSemanticTokensProvider.register(languageSelector, provider); +} +function registerInlineCompletionsProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.inlineCompletionsProvider.register(languageSelector, provider); +} +function registerInlineEditProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.inlineEditProvider.register(languageSelector, provider); +} +function registerInlayHintsProvider(languageSelector, provider) { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.inlayHintsProvider.register(languageSelector, provider); +} +function createMonacoLanguagesAPI() { + return { + register: register3, + getLanguages, + onLanguage, + onLanguageEncountered, + getEncodedLanguageId, + // provider methods + setLanguageConfiguration, + setColorMap, + registerTokensProviderFactory, + setTokensProvider, + setMonarchTokensProvider, + registerReferenceProvider, + registerRenameProvider, + registerNewSymbolNameProvider, + registerCompletionItemProvider, + registerSignatureHelpProvider, + registerHoverProvider, + registerDocumentSymbolProvider, + registerDocumentHighlightProvider, + registerLinkedEditingRangeProvider, + registerDefinitionProvider, + registerImplementationProvider, + registerTypeDefinitionProvider, + registerCodeLensProvider, + registerCodeActionProvider, + registerDocumentFormattingEditProvider, + registerDocumentRangeFormattingEditProvider, + registerOnTypeFormattingEditProvider, + registerLinkProvider, + registerColorProvider, + registerFoldingRangeProvider, + registerDeclarationProvider, + registerSelectionRangeProvider, + registerDocumentSemanticTokensProvider, + registerDocumentRangeSemanticTokensProvider, + registerInlineCompletionsProvider, + registerInlineEditProvider, + registerInlayHintsProvider, + // enums + DocumentHighlightKind: DocumentHighlightKind2, + CompletionItemKind, + CompletionItemTag, + CompletionItemInsertTextRule, + SymbolKind, + SymbolTag, + IndentAction, + CompletionTriggerKind, + SignatureHelpTriggerKind: SignatureHelpTriggerKind2, + InlayHintKind: InlayHintKind2, + InlineCompletionTriggerKind: InlineCompletionTriggerKind2, + InlineEditTriggerKind: InlineEditTriggerKind2, + CodeActionTriggerType, + NewSymbolNameTag: NewSymbolNameTag2, + NewSymbolNameTriggerKind: NewSymbolNameTriggerKind2, + PartialAcceptTriggerKind, + HoverVerbosityAction: HoverVerbosityAction2, + // classes + FoldingRangeKind, + SelectedSuggestionInfo + }; +} +var EncodedTokenizationSupportAdapter, TokenizationSupportAdapter; +var init_standaloneLanguages = __esm({ + "node_modules/monaco-editor/esm/vs/editor/standalone/browser/standaloneLanguages.js"() { + init_color(); + init_range(); + init_languages(); + init_language(); + init_languageConfigurationRegistry(); + init_modesRegistry(); + init_languageFeatures(); + init_standaloneEnums(); + init_standaloneServices(); + init_monarchCompile(); + init_monarchLexer(); + init_standaloneTheme(); + init_configuration(); + init_markers(); + EncodedTokenizationSupportAdapter = class { + constructor(languageId, actual) { + this._languageId = languageId; + this._actual = actual; + } + dispose() { + } + getInitialState() { + return this._actual.getInitialState(); + } + tokenize(line, hasEOL, state) { + if (typeof this._actual.tokenize === "function") { + return TokenizationSupportAdapter.adaptTokenize(this._languageId, this._actual, line, state); + } + throw new Error("Not supported!"); + } + tokenizeEncoded(line, hasEOL, state) { + const result = this._actual.tokenizeEncoded(line, state); + return new EncodedTokenizationResult(result.tokens, result.endState); + } + }; + TokenizationSupportAdapter = class _TokenizationSupportAdapter { + constructor(_languageId, _actual, _languageService, _standaloneThemeService) { + this._languageId = _languageId; + this._actual = _actual; + this._languageService = _languageService; + this._standaloneThemeService = _standaloneThemeService; + } + dispose() { + } + getInitialState() { + return this._actual.getInitialState(); + } + static _toClassicTokens(tokens, language82) { + const result = []; + let previousStartIndex = 0; + for (let i = 0, len = tokens.length; i < len; i++) { + const t4 = tokens[i]; + let startIndex = t4.startIndex; + if (i === 0) { + startIndex = 0; + } else if (startIndex < previousStartIndex) { + startIndex = previousStartIndex; + } + result[i] = new Token(startIndex, t4.scopes, language82); + previousStartIndex = startIndex; + } + return result; + } + static adaptTokenize(language82, actual, line, state) { + const actualResult = actual.tokenize(line, state); + const tokens = _TokenizationSupportAdapter._toClassicTokens(actualResult.tokens, language82); + let endState; + if (actualResult.endState.equals(state)) { + endState = state; + } else { + endState = actualResult.endState; + } + return new TokenizationResult(tokens, endState); + } + tokenize(line, hasEOL, state) { + return _TokenizationSupportAdapter.adaptTokenize(this._languageId, this._actual, line, state); + } + _toBinaryTokens(languageIdCodec, tokens) { + const languageId = languageIdCodec.encodeLanguageId(this._languageId); + const tokenTheme = this._standaloneThemeService.getColorTheme().tokenTheme; + const result = []; + let resultLen = 0; + let previousStartIndex = 0; + for (let i = 0, len = tokens.length; i < len; i++) { + const t4 = tokens[i]; + const metadata = tokenTheme.match(languageId, t4.scopes) | 1024; + if (resultLen > 0 && result[resultLen - 1] === metadata) { + continue; + } + let startIndex = t4.startIndex; + if (i === 0) { + startIndex = 0; + } else if (startIndex < previousStartIndex) { + startIndex = previousStartIndex; + } + result[resultLen++] = startIndex; + result[resultLen++] = metadata; + previousStartIndex = startIndex; + } + const actualResult = new Uint32Array(resultLen); + for (let i = 0; i < resultLen; i++) { + actualResult[i] = result[i]; + } + return actualResult; + } + tokenizeEncoded(line, hasEOL, state) { + const actualResult = this._actual.tokenize(line, state); + const tokens = this._toBinaryTokens(this._languageService.languageIdCodec, actualResult.tokens); + let endState; + if (actualResult.endState.equals(state)) { + endState = state; + } else { + endState = actualResult.endState; + } + return new EncodedTokenizationResult(tokens, endState); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/contrib/editorState/browser/keybindingCancellation.js +var IEditorCancellationTokens, ctxCancellableOperation, EditorKeybindingCancellationTokenSource; +var init_keybindingCancellation = __esm({ + "node_modules/monaco-editor/esm/vs/editor/contrib/editorState/browser/keybindingCancellation.js"() { + init_editorExtensions(); + init_contextkey(); + init_cancellation(); + init_linkedList(); + init_instantiation(); + init_extensions(); + init_nls(); + IEditorCancellationTokens = createDecorator("IEditorCancelService"); + ctxCancellableOperation = new RawContextKey("cancellableOperation", false, localize("cancellableOperation", "Whether the editor runs a cancellable operation, e.g. like 'Peek References'")); + registerSingleton( + IEditorCancellationTokens, + class { + constructor() { + this._tokens = /* @__PURE__ */ new WeakMap(); + } + add(editor2, cts) { + let data = this._tokens.get(editor2); + if (!data) { + data = editor2.invokeWithinContext((accessor) => { + const key = ctxCancellableOperation.bindTo(accessor.get(IContextKeyService)); + const tokens = new LinkedList(); + return { key, tokens }; + }); + this._tokens.set(editor2, data); + } + let removeFn; + data.key.set(true); + removeFn = data.tokens.push(cts); + return () => { + if (removeFn) { + removeFn(); + data.key.set(!data.tokens.isEmpty()); + removeFn = void 0; + } + }; + } + cancel(editor2) { + const data = this._tokens.get(editor2); + if (!data) { + return; + } + const cts = data.tokens.pop(); + if (cts) { + cts.cancel(); + data.key.set(!data.tokens.isEmpty()); + } + } + }, + 1 + /* InstantiationType.Delayed */ + ); + EditorKeybindingCancellationTokenSource = class extends CancellationTokenSource { + constructor(editor2, parent) { + super(parent); + this.editor = editor2; + this._unregister = editor2.invokeWithinContext((accessor) => accessor.get(IEditorCancellationTokens).add(editor2, this)); + } + dispose() { + this._unregister(); + super.dispose(); + } + }; + registerEditorCommand(new class extends EditorCommand { + constructor() { + super({ + id: "editor.cancelOperation", + kbOpts: { + weight: 100, + primary: 9 + /* KeyCode.Escape */ + }, + precondition: ctxCancellableOperation + }); + } + runEditorCommand(accessor, editor2) { + accessor.get(IEditorCancellationTokens).cancel(editor2); + } + }()); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/contrib/editorState/browser/editorState.js +var EditorState, EditorStateCancellationTokenSource, TextModelCancellationTokenSource; +var init_editorState = __esm({ + "node_modules/monaco-editor/esm/vs/editor/contrib/editorState/browser/editorState.js"() { + init_strings(); + init_range(); + init_cancellation(); + init_lifecycle(); + init_keybindingCancellation(); + EditorState = class _EditorState { + constructor(editor2, flags) { + this.flags = flags; + if ((this.flags & 1) !== 0) { + const model = editor2.getModel(); + this.modelVersionId = model ? format("{0}#{1}", model.uri.toString(), model.getVersionId()) : null; + } else { + this.modelVersionId = null; + } + if ((this.flags & 4) !== 0) { + this.position = editor2.getPosition(); + } else { + this.position = null; + } + if ((this.flags & 2) !== 0) { + this.selection = editor2.getSelection(); + } else { + this.selection = null; + } + if ((this.flags & 8) !== 0) { + this.scrollLeft = editor2.getScrollLeft(); + this.scrollTop = editor2.getScrollTop(); + } else { + this.scrollLeft = -1; + this.scrollTop = -1; + } + } + _equals(other) { + if (!(other instanceof _EditorState)) { + return false; + } + const state = other; + if (this.modelVersionId !== state.modelVersionId) { + return false; + } + if (this.scrollLeft !== state.scrollLeft || this.scrollTop !== state.scrollTop) { + return false; + } + if (!this.position && state.position || this.position && !state.position || this.position && state.position && !this.position.equals(state.position)) { + return false; + } + if (!this.selection && state.selection || this.selection && !state.selection || this.selection && state.selection && !this.selection.equalsRange(state.selection)) { + return false; + } + return true; + } + validate(editor2) { + return this._equals(new _EditorState(editor2, this.flags)); + } + }; + EditorStateCancellationTokenSource = class extends EditorKeybindingCancellationTokenSource { + constructor(editor2, flags, range2, parent) { + super(editor2, parent); + this._listener = new DisposableStore(); + if (flags & 4) { + this._listener.add(editor2.onDidChangeCursorPosition((e) => { + if (!range2 || !Range.containsPosition(range2, e.position)) { + this.cancel(); + } + })); + } + if (flags & 2) { + this._listener.add(editor2.onDidChangeCursorSelection((e) => { + if (!range2 || !Range.containsRange(range2, e.selection)) { + this.cancel(); + } + })); + } + if (flags & 8) { + this._listener.add(editor2.onDidScrollChange((_) => this.cancel())); + } + if (flags & 1) { + this._listener.add(editor2.onDidChangeModel((_) => this.cancel())); + this._listener.add(editor2.onDidChangeModelContent((_) => this.cancel())); + } + } + dispose() { + this._listener.dispose(); + super.dispose(); + } + }; + TextModelCancellationTokenSource = class extends CancellationTokenSource { + constructor(model, parent) { + super(parent); + this._listener = model.onDidChangeContent(() => this.cancel()); + } + dispose() { + this._listener.dispose(); + super.dispose(); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/browser/editorBrowser.js +function isCodeEditor(thing) { + if (thing && typeof thing.getEditorType === "function") { + return thing.getEditorType() === EditorType.ICodeEditor; + } else { + return false; + } +} +function isDiffEditor(thing) { + if (thing && typeof thing.getEditorType === "function") { + return thing.getEditorType() === EditorType.IDiffEditor; + } else { + return false; + } +} +function isCompositeEditor(thing) { + return !!thing && typeof thing === "object" && typeof thing.onDidChangeActiveEditor === "function"; +} +function getCodeEditor(thing) { + if (isCodeEditor(thing)) { + return thing; + } + if (isDiffEditor(thing)) { + return thing.getModifiedEditor(); + } + if (isCompositeEditor(thing) && isCodeEditor(thing.activeCodeEditor)) { + return thing.activeCodeEditor; + } + return null; +} +var init_editorBrowser = __esm({ + "node_modules/monaco-editor/esm/vs/editor/browser/editorBrowser.js"() { + init_editorCommon(); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/contrib/format/browser/formattingEdit.js +var FormattingEdit; +var init_formattingEdit = __esm({ + "node_modules/monaco-editor/esm/vs/editor/contrib/format/browser/formattingEdit.js"() { + init_editOperation(); + init_range(); + init_stableEditorScroll(); + FormattingEdit = class _FormattingEdit { + static _handleEolEdits(editor2, edits) { + let newEol = void 0; + const singleEdits = []; + for (const edit of edits) { + if (typeof edit.eol === "number") { + newEol = edit.eol; + } + if (edit.range && typeof edit.text === "string") { + singleEdits.push(edit); + } + } + if (typeof newEol === "number") { + if (editor2.hasModel()) { + editor2.getModel().pushEOL(newEol); + } + } + return singleEdits; + } + static _isFullModelReplaceEdit(editor2, edit) { + if (!editor2.hasModel()) { + return false; + } + const model = editor2.getModel(); + const editRange = model.validateRange(edit.range); + const fullModelRange = model.getFullModelRange(); + return fullModelRange.equalsRange(editRange); + } + static execute(editor2, _edits, addUndoStops) { + if (addUndoStops) { + editor2.pushUndoStop(); + } + const scrollState = StableEditorScrollState.capture(editor2); + const edits = _FormattingEdit._handleEolEdits(editor2, _edits); + if (edits.length === 1 && _FormattingEdit._isFullModelReplaceEdit(editor2, edits[0])) { + editor2.executeEdits("formatEditsCommand", edits.map((edit) => EditOperation.replace(Range.lift(edit.range), edit.text))); + } else { + editor2.executeEdits("formatEditsCommand", edits.map((edit) => EditOperation.replaceMove(Range.lift(edit.range), edit.text))); + } + if (addUndoStops) { + editor2.pushUndoStop(); + } + scrollState.restoreRelativeVerticalPositionOfCursor(editor2); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/platform/extensions/common/extensions.js +var ExtensionIdentifier, ExtensionIdentifierSet; +var init_extensions2 = __esm({ + "node_modules/monaco-editor/esm/vs/platform/extensions/common/extensions.js"() { + ExtensionIdentifier = class { + constructor(value) { + this.value = value; + this._lower = value.toLowerCase(); + } + /** + * Gives the value by which to index (for equality). + */ + static toKey(id) { + if (typeof id === "string") { + return id.toLowerCase(); + } + return id._lower; + } + }; + ExtensionIdentifierSet = class { + constructor(iterable) { + this._set = /* @__PURE__ */ new Set(); + if (iterable) { + for (const value of iterable) { + this.add(value); + } + } + } + add(id) { + this._set.add(ExtensionIdentifier.toKey(id)); + } + has(id) { + return this._set.has(ExtensionIdentifier.toKey(id)); + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/editor/contrib/format/browser/format.js +function getRealAndSyntheticDocumentFormattersOrdered(documentFormattingEditProvider, documentRangeFormattingEditProvider, model) { + const result = []; + const seen = new ExtensionIdentifierSet(); + const docFormatter = documentFormattingEditProvider.ordered(model); + for (const formatter of docFormatter) { + result.push(formatter); + if (formatter.extensionId) { + seen.add(formatter.extensionId); + } + } + const rangeFormatter = documentRangeFormattingEditProvider.ordered(model); + for (const formatter of rangeFormatter) { + if (formatter.extensionId) { + if (seen.has(formatter.extensionId)) { + continue; + } + seen.add(formatter.extensionId); + } + result.push({ + displayName: formatter.displayName, + extensionId: formatter.extensionId, + provideDocumentFormattingEdits(model2, options2, token) { + return formatter.provideDocumentRangeFormattingEdits(model2, model2.getFullModelRange(), options2, token); + } + }); + } + return result; +} +function formatDocumentRangesWithSelectedProvider(accessor, editorOrModel, rangeOrRanges, mode, progress, token, userGesture) { + return __async(this, null, function* () { + const instaService = accessor.get(IInstantiationService); + const { documentRangeFormattingEditProvider: documentRangeFormattingEditProviderRegistry } = accessor.get(ILanguageFeaturesService); + const model = isCodeEditor(editorOrModel) ? editorOrModel.getModel() : editorOrModel; + const provider = documentRangeFormattingEditProviderRegistry.ordered(model); + const selected = yield FormattingConflicts.select( + provider, + model, + mode, + 2 + /* FormattingKind.Selection */ + ); + if (selected) { + progress.report(selected); + yield instaService.invokeFunction(formatDocumentRangesWithProvider, selected, editorOrModel, rangeOrRanges, token, userGesture); + } + }); +} +function formatDocumentRangesWithProvider(accessor, provider, editorOrModel, rangeOrRanges, token, userGesture) { + return __async(this, null, function* () { + var _a10, _b4; + const workerService = accessor.get(IEditorWorkerService); + const logService = accessor.get(ILogService); + const accessibilitySignalService = accessor.get(IAccessibilitySignalService); + let model; + let cts; + if (isCodeEditor(editorOrModel)) { + model = editorOrModel.getModel(); + cts = new EditorStateCancellationTokenSource(editorOrModel, 1 | 4, void 0, token); + } else { + model = editorOrModel; + cts = new TextModelCancellationTokenSource(editorOrModel, token); + } + const ranges = []; + let len = 0; + for (const range2 of asArray(rangeOrRanges).sort(Range.compareRangesUsingStarts)) { + if (len > 0 && Range.areIntersectingOrTouching(ranges[len - 1], range2)) { + ranges[len - 1] = Range.fromPositions(ranges[len - 1].getStartPosition(), range2.getEndPosition()); + } else { + len = ranges.push(range2); + } + } + const computeEdits = (range2) => __async(this, null, function* () { + var _a11, _b5; + logService.trace(`[format][provideDocumentRangeFormattingEdits] (request)`, (_a11 = provider.extensionId) === null || _a11 === void 0 ? void 0 : _a11.value, range2); + const result = (yield provider.provideDocumentRangeFormattingEdits(model, range2, model.getFormattingOptions(), cts.token)) || []; + logService.trace(`[format][provideDocumentRangeFormattingEdits] (response)`, (_b5 = provider.extensionId) === null || _b5 === void 0 ? void 0 : _b5.value, result); + return result; + }); + const hasIntersectingEdit = (a3, b) => { + if (!a3.length || !b.length) { + return false; + } + const mergedA = a3.reduce((acc, val) => { + return Range.plusRange(acc, val.range); + }, a3[0].range); + if (!b.some((x) => { + return Range.intersectRanges(mergedA, x.range); + })) { + return false; + } + for (const edit of a3) { + for (const otherEdit of b) { + if (Range.intersectRanges(edit.range, otherEdit.range)) { + return true; + } + } + } + return false; + }; + const allEdits = []; + const rawEditsList = []; + try { + if (typeof provider.provideDocumentRangesFormattingEdits === "function") { + logService.trace(`[format][provideDocumentRangeFormattingEdits] (request)`, (_a10 = provider.extensionId) === null || _a10 === void 0 ? void 0 : _a10.value, ranges); + const result = (yield provider.provideDocumentRangesFormattingEdits(model, ranges, model.getFormattingOptions(), cts.token)) || []; + logService.trace(`[format][provideDocumentRangeFormattingEdits] (response)`, (_b4 = provider.extensionId) === null || _b4 === void 0 ? void 0 : _b4.value, result); + rawEditsList.push(result); + } else { + for (const range2 of ranges) { + if (cts.token.isCancellationRequested) { + return true; + } + rawEditsList.push(yield computeEdits(range2)); + } + for (let i = 0; i < ranges.length; ++i) { + for (let j = i + 1; j < ranges.length; ++j) { + if (cts.token.isCancellationRequested) { + return true; + } + if (hasIntersectingEdit(rawEditsList[i], rawEditsList[j])) { + const mergedRange = Range.plusRange(ranges[i], ranges[j]); + const edits = yield computeEdits(mergedRange); + ranges.splice(j, 1); + ranges.splice(i, 1); + ranges.push(mergedRange); + rawEditsList.splice(j, 1); + rawEditsList.splice(i, 1); + rawEditsList.push(edits); + i = 0; + j = 0; + } + } + } + } + for (const rawEdits of rawEditsList) { + if (cts.token.isCancellationRequested) { + return true; + } + const minimalEdits = yield workerService.computeMoreMinimalEdits(model.uri, rawEdits); + if (minimalEdits) { + allEdits.push(...minimalEdits); + } + } + } finally { + cts.dispose(); + } + if (allEdits.length === 0) { + return false; + } + if (isCodeEditor(editorOrModel)) { + FormattingEdit.execute(editorOrModel, allEdits, true); + editorOrModel.revealPositionInCenterIfOutsideViewport( + editorOrModel.getPosition(), + 1 + /* ScrollType.Immediate */ + ); + } else { + const [{ range: range2 }] = allEdits; + const initialSelection = new Selection(range2.startLineNumber, range2.startColumn, range2.endLineNumber, range2.endColumn); + model.pushEditOperations([initialSelection], allEdits.map((edit) => { + return { + text: edit.text, + range: Range.lift(edit.range), + forceMoveMarkers: true + }; + }), (undoEdits) => { + for (const { range: range3 } of undoEdits) { + if (Range.areIntersectingOrTouching(range3, initialSelection)) { + return [new Selection(range3.startLineNumber, range3.startColumn, range3.endLineNumber, range3.endColumn)]; + } + } + return null; + }); + } + accessibilitySignalService.playSignal(AccessibilitySignal.format, { userGesture }); + return true; + }); +} +function formatDocumentWithSelectedProvider(accessor, editorOrModel, mode, progress, token, userGesture) { + return __async(this, null, function* () { + const instaService = accessor.get(IInstantiationService); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); + const model = isCodeEditor(editorOrModel) ? editorOrModel.getModel() : editorOrModel; + const provider = getRealAndSyntheticDocumentFormattersOrdered(languageFeaturesService.documentFormattingEditProvider, languageFeaturesService.documentRangeFormattingEditProvider, model); + const selected = yield FormattingConflicts.select( + provider, + model, + mode, + 1 + /* FormattingKind.File */ + ); + if (selected) { + progress.report(selected); + yield instaService.invokeFunction(formatDocumentWithProvider, selected, editorOrModel, mode, token, userGesture); + } + }); +} +function formatDocumentWithProvider(accessor, provider, editorOrModel, mode, token, userGesture) { + return __async(this, null, function* () { + const workerService = accessor.get(IEditorWorkerService); + const accessibilitySignalService = accessor.get(IAccessibilitySignalService); + let model; + let cts; + if (isCodeEditor(editorOrModel)) { + model = editorOrModel.getModel(); + cts = new EditorStateCancellationTokenSource(editorOrModel, 1 | 4, void 0, token); + } else { + model = editorOrModel; + cts = new TextModelCancellationTokenSource(editorOrModel, token); + } + let edits; + try { + const rawEdits = yield provider.provideDocumentFormattingEdits(model, model.getFormattingOptions(), cts.token); + edits = yield workerService.computeMoreMinimalEdits(model.uri, rawEdits); + if (cts.token.isCancellationRequested) { + return true; + } + } finally { + cts.dispose(); + } + if (!edits || edits.length === 0) { + return false; + } + if (isCodeEditor(editorOrModel)) { + FormattingEdit.execute( + editorOrModel, + edits, + mode !== 2 + /* FormattingMode.Silent */ + ); + if (mode !== 2) { + editorOrModel.revealPositionInCenterIfOutsideViewport( + editorOrModel.getPosition(), + 1 + /* ScrollType.Immediate */ + ); + } + } else { + const [{ range: range2 }] = edits; + const initialSelection = new Selection(range2.startLineNumber, range2.startColumn, range2.endLineNumber, range2.endColumn); + model.pushEditOperations([initialSelection], edits.map((edit) => { + return { + text: edit.text, + range: Range.lift(edit.range), + forceMoveMarkers: true + }; + }), (undoEdits) => { + for (const { range: range3 } of undoEdits) { + if (Range.areIntersectingOrTouching(range3, initialSelection)) { + return [new Selection(range3.startLineNumber, range3.startColumn, range3.endLineNumber, range3.endColumn)]; + } + } + return null; + }); + } + accessibilitySignalService.playSignal(AccessibilitySignal.format, { userGesture }); + return true; + }); +} +function getDocumentRangeFormattingEditsUntilResult(workerService, languageFeaturesService, model, range2, options2, token) { + return __async(this, null, function* () { + const providers = languageFeaturesService.documentRangeFormattingEditProvider.ordered(model); + for (const provider of providers) { + const rawEdits = yield Promise.resolve(provider.provideDocumentRangeFormattingEdits(model, range2, options2, token)).catch(onUnexpectedExternalError); + if (isNonEmptyArray(rawEdits)) { + return yield workerService.computeMoreMinimalEdits(model.uri, rawEdits); + } + } + return void 0; + }); +} +function getDocumentFormattingEditsUntilResult(workerService, languageFeaturesService, model, options2, token) { + return __async(this, null, function* () { + const providers = getRealAndSyntheticDocumentFormattersOrdered(languageFeaturesService.documentFormattingEditProvider, languageFeaturesService.documentRangeFormattingEditProvider, model); + for (const provider of providers) { + const rawEdits = yield Promise.resolve(provider.provideDocumentFormattingEdits(model, options2, token)).catch(onUnexpectedExternalError); + if (isNonEmptyArray(rawEdits)) { + return yield workerService.computeMoreMinimalEdits(model.uri, rawEdits); + } + } + return void 0; + }); +} +function getOnTypeFormattingEdits(workerService, languageFeaturesService, model, position, ch, options2, token) { + const providers = languageFeaturesService.onTypeFormattingEditProvider.ordered(model); + if (providers.length === 0) { + return Promise.resolve(void 0); + } + if (providers[0].autoFormatTriggerCharacters.indexOf(ch) < 0) { + return Promise.resolve(void 0); + } + return Promise.resolve(providers[0].provideOnTypeFormattingEdits(model, position, ch, options2, token)).catch(onUnexpectedExternalError).then((edits) => { + return workerService.computeMoreMinimalEdits(model.uri, edits); + }); +} +var FormattingConflicts; +var init_format = __esm({ + "node_modules/monaco-editor/esm/vs/editor/contrib/format/browser/format.js"() { + init_arrays(); + init_cancellation(); + init_errors(); + init_iterator(); + init_linkedList(); + init_types(); + init_uri(); + init_editorState(); + init_editorBrowser(); + init_position(); + init_range(); + init_selection(); + init_editorWorker(); + init_resolverService(); + init_formattingEdit(); + init_commands(); + init_extensions2(); + init_instantiation(); + init_languageFeatures(); + init_log(); + init_accessibilitySignalService(); + FormattingConflicts = class _FormattingConflicts { + static setFormatterSelector(selector) { + const remove = _FormattingConflicts._selectors.unshift(selector); + return { dispose: remove }; + } + static select(formatter, document2, mode, kind) { + return __async(this, null, function* () { + if (formatter.length === 0) { + return void 0; + } + const selector = Iterable.first(_FormattingConflicts._selectors); + if (selector) { + return yield selector(formatter, document2, mode, kind); + } + return void 0; + }); + } + }; + FormattingConflicts._selectors = new LinkedList(); + CommandsRegistry.registerCommand("_executeFormatRangeProvider", function(accessor, ...args) { + return __async(this, null, function* () { + const [resource, range2, options2] = args; + assertType(URI.isUri(resource)); + assertType(Range.isIRange(range2)); + const resolverService = accessor.get(ITextModelService); + const workerService = accessor.get(IEditorWorkerService); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); + const reference = yield resolverService.createModelReference(resource); + try { + return getDocumentRangeFormattingEditsUntilResult(workerService, languageFeaturesService, reference.object.textEditorModel, Range.lift(range2), options2, CancellationToken.None); + } finally { + reference.dispose(); + } + }); + }); + CommandsRegistry.registerCommand("_executeFormatDocumentProvider", function(accessor, ...args) { + return __async(this, null, function* () { + const [resource, options2] = args; + assertType(URI.isUri(resource)); + const resolverService = accessor.get(ITextModelService); + const workerService = accessor.get(IEditorWorkerService); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); + const reference = yield resolverService.createModelReference(resource); + try { + return getDocumentFormattingEditsUntilResult(workerService, languageFeaturesService, reference.object.textEditorModel, options2, CancellationToken.None); + } finally { + reference.dispose(); + } + }); + }); + CommandsRegistry.registerCommand("_executeFormatOnTypeProvider", function(accessor, ...args) { + return __async(this, null, function* () { + const [resource, position, ch, options2] = args; + assertType(URI.isUri(resource)); + assertType(Position.isIPosition(position)); + assertType(typeof ch === "string"); + const resolverService = accessor.get(ITextModelService); + const workerService = accessor.get(IEditorWorkerService); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); + const reference = yield resolverService.createModelReference(resource); + try { + return getOnTypeFormattingEdits(workerService, languageFeaturesService, reference.object.textEditorModel, Position.lift(position), ch, options2, CancellationToken.None); + } finally { + reference.dispose(); + } + }); + }); + } +}); + +// node_modules/monaco-editor/esm/vs/editor/editor.api.js +var editor_api_exports = {}; +__export(editor_api_exports, { + CancellationTokenSource: () => CancellationTokenSource2, + Emitter: () => Emitter2, + KeyCode: () => KeyCode2, + KeyMod: () => KeyMod2, + MarkerSeverity: () => MarkerSeverity3, + MarkerTag: () => MarkerTag2, + Position: () => Position2, + Range: () => Range3, + Selection: () => Selection2, + SelectionDirection: () => SelectionDirection2, + Token: () => Token3, + Uri: () => Uri2, + editor: () => editor, + languages: () => languages +}); +var api, CancellationTokenSource2, Emitter2, KeyCode2, KeyMod2, Position2, Range3, Selection2, SelectionDirection2, MarkerSeverity3, MarkerTag2, Uri2, Token3, editor, languages, monacoEnvironment; +var init_editor_api = __esm({ + "node_modules/monaco-editor/esm/vs/editor/editor.api.js"() { + init_editorOptions(); + init_editorBaseApi(); + init_standaloneEditor(); + init_standaloneLanguages(); + init_format(); + EditorOptions.wrappingIndent.defaultValue = 0; + EditorOptions.glyphMargin.defaultValue = false; + EditorOptions.autoIndent.defaultValue = 3; + EditorOptions.overviewRulerLanes.defaultValue = 2; + FormattingConflicts.setFormatterSelector((formatter, document2, mode) => Promise.resolve(formatter[0])); + api = createMonacoBaseAPI(); + api.editor = createMonacoEditorAPI(); + api.languages = createMonacoLanguagesAPI(); + CancellationTokenSource2 = api.CancellationTokenSource; + Emitter2 = api.Emitter; + KeyCode2 = api.KeyCode; + KeyMod2 = api.KeyMod; + Position2 = api.Position; + Range3 = api.Range; + Selection2 = api.Selection; + SelectionDirection2 = api.SelectionDirection; + MarkerSeverity3 = api.MarkerSeverity; + MarkerTag2 = api.MarkerTag; + Uri2 = api.Uri; + Token3 = api.Token; + editor = api.editor; + languages = api.languages; + monacoEnvironment = globalThis.MonacoEnvironment; + if ((monacoEnvironment === null || monacoEnvironment === void 0 ? void 0 : monacoEnvironment.globalAPI) || typeof define === "function" && define.amd) { + globalThis.monaco = api; + } + if (typeof globalThis.require !== "undefined" && typeof globalThis.require.config === "function") { + globalThis.require.config({ + ignoreDuplicateModules: [ + "vscode-languageserver-types", + "vscode-languageserver-types/main", + "vscode-languageserver-textdocument", + "vscode-languageserver-textdocument/main", + "vscode-nls", + "vscode-nls/vscode-nls", + "jsonc-parser", + "jsonc-parser/main", + "vscode-uri", + "vscode-uri/index", + "vs/basic-languages/typescript/typescript" + ] + }); + } + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/abap/abap.js +var abap_exports = {}; +__export(abap_exports, { + conf: () => conf, + language: () => language2 +}); +var conf, language2; +var init_abap = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/abap/abap.js"() { + conf = { + comments: { + lineComment: "*" + }, + brackets: [ + ["[", "]"], + ["(", ")"] + ] + }; + language2 = { + defaultToken: "invalid", + ignoreCase: true, + tokenPostfix: ".abap", + keywords: [ + "abap-source", + "abbreviated", + "abstract", + "accept", + "accepting", + "according", + "activation", + "actual", + "add", + "add-corresponding", + "adjacent", + "after", + "alias", + "aliases", + "align", + "all", + "allocate", + "alpha", + "analysis", + "analyzer", + "and", + // also an operator + "append", + "appendage", + "appending", + "application", + "archive", + "area", + "arithmetic", + "as", + "ascending", + "aspect", + "assert", + "assign", + "assigned", + "assigning", + "association", + "asynchronous", + "at", + "attributes", + "authority", + "authority-check", + "avg", + "back", + "background", + "backup", + "backward", + "badi", + "base", + "before", + "begin", + "between", + // also an operator + "big", + "binary", + "bintohex", + "bit", + "black", + "blank", + "blanks", + "blob", + "block", + "blocks", + "blue", + "bound", + "boundaries", + "bounds", + "boxed", + "break-point", + "buffer", + "by", + "bypassing", + "byte", + "byte-order", + "call", + "calling", + "case", + "cast", + "casting", + "catch", + "center", + "centered", + "chain", + "chain-input", + "chain-request", + "change", + "changing", + "channels", + "character", + "char-to-hex", + "check", + "checkbox", + "ci_", + "circular", + "class", + "class-coding", + "class-data", + "class-events", + "class-methods", + "class-pool", + "cleanup", + "clear", + "client", + "clob", + "clock", + "close", + "coalesce", + "code", + "coding", + "col_background", + "col_group", + "col_heading", + "col_key", + "col_negative", + "col_normal", + "col_positive", + "col_total", + "collect", + "color", + "column", + "columns", + "comment", + "comments", + "commit", + "common", + "communication", + "comparing", + "component", + "components", + "compression", + "compute", + "concat", + "concat_with_space", + "concatenate", + "cond", + "condense", + // also a built-in + "condition", + "connect", + "connection", + "constants", + "context", + "contexts", + "continue", + "control", + "controls", + "conv", + "conversion", + "convert", + "copies", + "copy", + "corresponding", + "country", + "cover", + "cpi", + "create", + "creating", + "critical", + "currency", + "currency_conversion", + "current", + "cursor", + "cursor-selection", + "customer", + "customer-function", + "dangerous", + "data", + "database", + "datainfo", + "dataset", + "date", + "dats_add_days", + "dats_add_months", + "dats_days_between", + "dats_is_valid", + "daylight", + "dd/mm/yy", + "dd/mm/yyyy", + "ddmmyy", + "deallocate", + "decimal_shift", + "decimals", + "declarations", + "deep", + "default", + "deferred", + "define", + "defining", + "definition", + "delete", + "deleting", + "demand", + "department", + "descending", + "describe", + "destination", + "detail", + "dialog", + "directory", + "disconnect", + "display", + "display-mode", + "distinct", + "divide", + "divide-corresponding", + "division", + "do", + "dummy", + "duplicate", + "duplicates", + "duration", + "during", + "dynamic", + "dynpro", + "edit", + "editor-call", + "else", + "elseif", + "empty", + "enabled", + "enabling", + "encoding", + "end", + "endat", + "endcase", + "endcatch", + "endchain", + "endclass", + "enddo", + "endenhancement", + "end-enhancement-section", + "endexec", + "endform", + "endfunction", + "endian", + "endif", + "ending", + "endinterface", + "end-lines", + "endloop", + "endmethod", + "endmodule", + "end-of-definition", + "end-of-editing", + "end-of-file", + "end-of-page", + "end-of-selection", + "endon", + "endprovide", + "endselect", + "end-test-injection", + "end-test-seam", + "endtry", + "endwhile", + "endwith", + "engineering", + "enhancement", + "enhancement-point", + "enhancements", + "enhancement-section", + "entries", + "entry", + "enum", + "environment", + "equiv", + // also an operator + "errormessage", + "errors", + "escaping", + "event", + "events", + "exact", + "except", + "exception", + "exceptions", + "exception-table", + "exclude", + "excluding", + "exec", + "execute", + "exists", + "exit", + "exit-command", + "expand", + "expanding", + "expiration", + "explicit", + "exponent", + "export", + "exporting", + "extend", + "extended", + "extension", + "extract", + "fail", + "fetch", + "field", + "field-groups", + "fields", + "field-symbol", + "field-symbols", + "file", + "filter", + "filters", + "filter-table", + "final", + "find", + // also a built-in + "first", + "first-line", + "fixed-point", + "fkeq", + "fkge", + "flush", + "font", + "for", + "form", + "format", + "forward", + "found", + "frame", + "frames", + "free", + "friends", + "from", + "function", + "functionality", + "function-pool", + "further", + "gaps", + "generate", + "get", + "giving", + "gkeq", + "gkge", + "global", + "grant", + "green", + "group", + "groups", + "handle", + "handler", + "harmless", + "hashed", + // also a table type + "having", + "hdb", + "header", + "headers", + "heading", + "head-lines", + "help-id", + "help-request", + "hextobin", + "hide", + "high", + "hint", + "hold", + "hotspot", + "icon", + "id", + "identification", + "identifier", + "ids", + "if", + "ignore", + "ignoring", + "immediately", + "implementation", + "implementations", + "implemented", + "implicit", + "import", + "importing", + "in", + // also an operator + "inactive", + "incl", + "include", + "includes", + "including", + "increment", + "index", + // also a table type + "index-line", + "infotypes", + "inheriting", + "init", + "initial", + "initialization", + "inner", + "inout", + "input", + "insert", + // also a built-in + "instance", + "instances", + "instr", + "intensified", + "interface", + "interface-pool", + "interfaces", + "internal", + "intervals", + "into", + "inverse", + "inverted-date", + "is", + "iso", + "job", + "join", + "keep", + "keeping", + "kernel", + "key", + "keys", + "keywords", + "kind", + "language", + "last", + "late", + "layout", + "leading", + "leave", + "left", + "left-justified", + "leftplus", + "leftspace", + "legacy", + "length", + "let", + "level", + "levels", + "like", + "line", + "lines", + // also a built-in + "line-count", + "linefeed", + "line-selection", + "line-size", + "list", + "listbox", + "list-processing", + "little", + "llang", + "load", + "load-of-program", + "lob", + "local", + "locale", + "locator", + "logfile", + "logical", + "log-point", + "long", + "loop", + "low", + "lower", + "lpad", + "lpi", + "ltrim", + "mail", + "main", + "major-id", + "mapping", + "margin", + "mark", + "mask", + "match", + // also a built-in + "matchcode", + "max", + "maximum", + "medium", + "members", + "memory", + "mesh", + "message", + "message-id", + "messages", + "messaging", + "method", + "methods", + "min", + "minimum", + "minor-id", + "mm/dd/yy", + "mm/dd/yyyy", + "mmddyy", + "mode", + "modif", + "modifier", + "modify", + "module", + "move", + "move-corresponding", + "multiply", + "multiply-corresponding", + "name", + "nametab", + "native", + "nested", + "nesting", + "new", + "new-line", + "new-page", + "new-section", + "next", + "no", + "no-display", + "no-extension", + "no-gap", + "no-gaps", + "no-grouping", + "no-heading", + "no-scrolling", + "no-sign", + "no-title", + "no-topofpage", + "no-zero", + "node", + "nodes", + "non-unicode", + "non-unique", + "not", + // also an operator + "null", + "number", + "object", + // also a data type + "objects", + "obligatory", + "occurrence", + "occurrences", + "occurs", + "of", + "off", + "offset", + "ole", + "on", + "only", + "open", + "option", + "optional", + "options", + "or", + // also an operator + "order", + "other", + "others", + "out", + "outer", + "output", + "output-length", + "overflow", + "overlay", + "pack", + "package", + "pad", + "padding", + "page", + "pages", + "parameter", + "parameters", + "parameter-table", + "part", + "partially", + "pattern", + "percentage", + "perform", + "performing", + "person", + "pf1", + "pf10", + "pf11", + "pf12", + "pf13", + "pf14", + "pf15", + "pf2", + "pf3", + "pf4", + "pf5", + "pf6", + "pf7", + "pf8", + "pf9", + "pf-status", + "pink", + "places", + "pool", + "pos_high", + "pos_low", + "position", + "pragmas", + "precompiled", + "preferred", + "preserving", + "primary", + "print", + "print-control", + "priority", + "private", + "procedure", + "process", + "program", + "property", + "protected", + "provide", + "public", + "push", + "pushbutton", + "put", + "queue-only", + "quickinfo", + "radiobutton", + "raise", + "raising", + "range", + "ranges", + "read", + "reader", + "read-only", + "receive", + "received", + "receiver", + "receiving", + "red", + "redefinition", + "reduce", + "reduced", + "ref", + "reference", + "refresh", + "regex", + "reject", + "remote", + "renaming", + "replace", + // also a built-in + "replacement", + "replacing", + "report", + "request", + "requested", + "reserve", + "reset", + "resolution", + "respecting", + "responsible", + "result", + "results", + "resumable", + "resume", + "retry", + "return", + "returncode", + "returning", + "returns", + "right", + "right-justified", + "rightplus", + "rightspace", + "risk", + "rmc_communication_failure", + "rmc_invalid_status", + "rmc_system_failure", + "role", + "rollback", + "rows", + "rpad", + "rtrim", + "run", + "sap", + "sap-spool", + "saving", + "scale_preserving", + "scale_preserving_scientific", + "scan", + "scientific", + "scientific_with_leading_zero", + "scroll", + "scroll-boundary", + "scrolling", + "search", + "secondary", + "seconds", + "section", + "select", + "selection", + "selections", + "selection-screen", + "selection-set", + "selection-sets", + "selection-table", + "select-options", + "send", + "separate", + "separated", + "set", + "shared", + "shift", + "short", + "shortdump-id", + "sign_as_postfix", + "single", + "size", + "skip", + "skipping", + "smart", + "some", + "sort", + "sortable", + "sorted", + // also a table type + "source", + "specified", + "split", + "spool", + "spots", + "sql", + "sqlscript", + "stable", + "stamp", + "standard", + // also a table type + "starting", + "start-of-editing", + "start-of-selection", + "state", + "statement", + "statements", + "static", + "statics", + "statusinfo", + "step-loop", + "stop", + "structure", + "structures", + "style", + "subkey", + "submatches", + "submit", + "subroutine", + "subscreen", + "subtract", + "subtract-corresponding", + "suffix", + "sum", + "summary", + "summing", + "supplied", + "supply", + "suppress", + "switch", + "switchstates", + "symbol", + "syncpoints", + "syntax", + "syntax-check", + "syntax-trace", + "system-call", + "system-exceptions", + "system-exit", + "tab", + "tabbed", + "table", + "tables", + "tableview", + "tabstrip", + "target", + "task", + "tasks", + "test", + "testing", + "test-injection", + "test-seam", + "text", + "textpool", + "then", + "throw", + "time", + "times", + "timestamp", + "timezone", + "tims_is_valid", + "title", + "titlebar", + "title-lines", + "to", + "tokenization", + "tokens", + "top-lines", + "top-of-page", + "trace-file", + "trace-table", + "trailing", + "transaction", + "transfer", + "transformation", + "translate", + // also a built-in + "transporting", + "trmac", + "truncate", + "truncation", + "try", + "tstmp_add_seconds", + "tstmp_current_utctimestamp", + "tstmp_is_valid", + "tstmp_seconds_between", + "type", + "type-pool", + "type-pools", + "types", + "uline", + "unassign", + "under", + "unicode", + "union", + "unique", + "unit_conversion", + "unix", + "unpack", + "until", + "unwind", + "up", + "update", + "upper", + "user", + "user-command", + "using", + "utf-8", + "valid", + "value", + "value-request", + "values", + "vary", + "varying", + "verification-message", + "version", + "via", + "view", + "visible", + "wait", + "warning", + "when", + "whenever", + "where", + "while", + "width", + "window", + "windows", + "with", + "with-heading", + "without", + "with-title", + "word", + "work", + "write", + "writer", + "xml", + "xsd", + "yellow", + "yes", + "yymmdd", + "zero", + "zone", + // since 7.55: + "abap_system_timezone", + "abap_user_timezone", + "access", + "action", + "adabas", + "adjust_numbers", + "allow_precision_loss", + "allowed", + "amdp", + "applicationuser", + "as_geo_json", + "as400", + "associations", + "balance", + "behavior", + "breakup", + "bulk", + "cds", + "cds_client", + "check_before_save", + "child", + "clients", + "corr", + "corr_spearman", + "cross", + "cycles", + "datn_add_days", + "datn_add_months", + "datn_days_between", + "dats_from_datn", + "dats_tims_to_tstmp", + "dats_to_datn", + "db2", + "db6", + "ddl", + "dense_rank", + "depth", + "deterministic", + "discarding", + "entities", + "entity", + "error", + "failed", + "finalize", + "first_value", + "fltp_to_dec", + "following", + "fractional", + "full", + "graph", + "grouping", + "hierarchy", + "hierarchy_ancestors", + "hierarchy_ancestors_aggregate", + "hierarchy_descendants", + "hierarchy_descendants_aggregate", + "hierarchy_siblings", + "incremental", + "indicators", + "lag", + "last_value", + "lead", + "leaves", + "like_regexpr", + "link", + "locale_sap", + "lock", + "locks", + "many", + "mapped", + "matched", + "measures", + "median", + "mssqlnt", + "multiple", + "nodetype", + "ntile", + "nulls", + "occurrences_regexpr", + "one", + "operations", + "oracle", + "orphans", + "over", + "parent", + "parents", + "partition", + "pcre", + "period", + "pfcg_mapping", + "preceding", + "privileged", + "product", + "projection", + "rank", + "redirected", + "replace_regexpr", + "reported", + "response", + "responses", + "root", + "row", + "row_number", + "sap_system_date", + "save", + "schema", + "session", + "sets", + "shortdump", + "siblings", + "spantree", + "start", + "stddev", + "string_agg", + "subtotal", + "sybase", + "tims_from_timn", + "tims_to_timn", + "to_blob", + "to_clob", + "total", + "trace-entry", + "tstmp_to_dats", + "tstmp_to_dst", + "tstmp_to_tims", + "tstmpl_from_utcl", + "tstmpl_to_utcl", + "unbounded", + "utcl_add_seconds", + "utcl_current", + "utcl_seconds_between", + "uuid", + "var", + "verbatim" + ], + // + // Built-in Functions + // + // Functions that are also statements have been moved to keywords + // + builtinFunctions: [ + "abs", + "acos", + "asin", + "atan", + "bit-set", + "boolc", + "boolx", + "ceil", + "char_off", + "charlen", + "cmax", + "cmin", + "concat_lines_of", + // 'condense', // moved to keywords + "contains", + "contains_any_not_of", + "contains_any_of", + "cos", + "cosh", + "count", + "count_any_not_of", + "count_any_of", + "dbmaxlen", + "distance", + "escape", + "exp", + // 'find', // moved to keywords + "find_any_not_of", + "find_any_of", + "find_end", + "floor", + "frac", + "from_mixed", + // 'insert', // moved to keywords + "ipow", + "line_exists", + "line_index", + // 'lines', // moved to keywords + "log", + "log10", + // 'match', // moved to keywords + "matches", + "nmax", + "nmin", + "numofchar", + "repeat", + // 'replace', // moved to keywords + "rescale", + "reverse", + "round", + "segment", + "shift_left", + "shift_right", + "sign", + "sin", + "sinh", + "sqrt", + "strlen", + "substring", + "substring_after", + "substring_before", + "substring_from", + "substring_to", + "tan", + "tanh", + "to_lower", + "to_mixed", + "to_upper", + // 'translate', // moved to keywords + "trunc", + "utclong_add", + // since 7.54 + "utclong_current", + // since 7.54 + "utclong_diff", + // since 7.54 + "xsdbool", + "xstrlen" + ], + // + // Data Types + // + // Data types that are also part of statements have been moved to keywords + // + typeKeywords: [ + // built-in abap types + "b", + "c", + "d", + "decfloat16", + "decfloat34", + "f", + "i", + "int8", + // since 7.54 + "n", + "p", + "s", + "string", + "t", + "utclong", + // since 7.54 + "x", + "xstring", + // generic data types + "any", + "clike", + "csequence", + "decfloat", + // 'object', // moved to keywords + "numeric", + "simple", + "xsequence", + // ddic/sql data types + "accp", + "char", + "clnt", + "cuky", + "curr", + "datn", + // since 7.55 + "dats", + "d16d", + // since 7.55 + "d16n", + // since 7.55 + "d16r", + // since 7.55 + "d34d", + // since 7.55 + "d34n", + // since 7.55 + "d34r", + // since 7.55 + "dec", + "df16_dec", + "df16_raw", + "df34_dec", + "df34_raw", + "fltp", + "geom_ewkb", + // since 7.55 + "int1", + "int2", + "int4", + "lang", + "lchr", + "lraw", + "numc", + "quan", + "raw", + "rawstring", + "sstring", + "timn", + // since 7.55 + "tims", + "unit", + "utcl", + // since 7.55 + // ddic data types (obsolete) + "df16_scl", + "df34_scl", + "prec", + "varc", + // special data types and constants + "abap_bool", + "abap_false", + "abap_true", + "abap_undefined", + "me", + "screen", + "space", + "super", + "sy", + "syst", + "table_line", + // obsolete data object + "*sys*" + ], + builtinMethods: ["class_constructor", "constructor"], + derivedTypes: [ + "%CID", + "%CID_REF", + "%CONTROL", + "%DATA", + "%ELEMENT", + "%FAIL", + "%KEY", + "%MSG", + "%PARAM", + "%PID", + "%PID_ASSOC", + "%PID_PARENT", + "%_HINTS" + ], + cdsLanguage: [ + "@AbapAnnotation", + "@AbapCatalog", + "@AccessControl", + "@API", + "@ClientDependent", + "@ClientHandling", + "@CompatibilityContract", + "@DataAging", + "@EndUserText", + "@Environment", + "@LanguageDependency", + "@MappingRole", + "@Metadata", + "@MetadataExtension", + "@ObjectModel", + "@Scope", + "@Semantics", + "$EXTENSION", + "$SELF" + ], + selectors: ["->", "->*", "=>", "~", "~*"], + // + // Operators + // + // Operators that can be part of statements have been moved to keywords + // + operators: [ + // arithmetic operators + " +", + " -", + "/", + "*", + "**", + "div", + "mod", + // assignment operators + "=", + "#", + "@", + "+=", + "-=", + "*=", + "/=", + "**=", + "&&=", + // casting operator + "?=", + // concat operators + "&", + "&&", + // bit operators + "bit-and", + "bit-not", + "bit-or", + "bit-xor", + "m", + "o", + "z", + // boolean operators + // 'and', // moved to keywords + // 'equiv', // moved to keywords + // 'not', // moved to keywords + // 'or', // moved to keywords + // comparison operators + "<", + " >", + // todo: separate from -> and => + "<=", + ">=", + "<>", + "><", + // obsolete + "=<", + // obsolete + "=>", + // obsolete + // 'between', // moved to keywords + "bt", + "byte-ca", + "byte-cn", + "byte-co", + "byte-cs", + "byte-na", + "byte-ns", + "ca", + "cn", + "co", + "cp", + "cs", + "eq", + // obsolete + "ge", + // obsolete + "gt", + // obsolete + // 'in', // moved to keywords + "le", + // obsolete + "lt", + // obsolete + "na", + "nb", + "ne", + // obsolete + "np", + "ns", + // cds + "*/", + "*:", + "--", + "/*", + "//" + ], + symbols: /[=>))*/, + // exclude '->' selector + { + cases: { + "@typeKeywords": "type", + "@keywords": "keyword", + "@cdsLanguage": "annotation", + "@derivedTypes": "type", + "@builtinFunctions": "type", + "@builtinMethods": "type", + "@operators": "key", + "@default": "identifier" + } + } + ], + [/<[\w]+>/, "identifier"], + // field symbols + [/##[\w|_]+/, "comment"], + // pragmas + { include: "@whitespace" }, + [/[:,.]/, "delimiter"], + [/[{}()\[\]]/, "@brackets"], + [ + /@symbols/, + { + cases: { + "@selectors": "tag", + "@operators": "key", + "@default": "" + } + } + ], + [/'/, { token: "string", bracket: "@open", next: "@stringquote" }], + [/`/, { token: "string", bracket: "@open", next: "@stringping" }], + [/\|/, { token: "string", bracket: "@open", next: "@stringtemplate" }], + [/\d+/, "number"] + ], + stringtemplate: [ + [/[^\\\|]+/, "string"], + [/\\\|/, "string"], + [/\|/, { token: "string", bracket: "@close", next: "@pop" }] + ], + stringping: [ + [/[^\\`]+/, "string"], + [/`/, { token: "string", bracket: "@close", next: "@pop" }] + ], + stringquote: [ + [/[^\\']+/, "string"], + [/'/, { token: "string", bracket: "@close", next: "@pop" }] + ], + whitespace: [ + [/[ \t\r\n]+/, ""], + [/^\*.*$/, "comment"], + [/\".*$/, "comment"] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/apex/apex.js +var apex_exports = {}; +__export(apex_exports, { + conf: () => conf2, + language: () => language3 +}); +var conf2, keywords, uppercaseFirstLetter, keywordsWithCaseVariations, language3; +var init_apex = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/apex/apex.js"() { + conf2 = { + // the default separators except `@$` + wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g, + comments: { + lineComment: "//", + blockComment: ["/*", "*/"] + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" }, + { open: "<", close: ">" } + ], + folding: { + markers: { + start: new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))") + } + } + }; + keywords = [ + "abstract", + "activate", + "and", + "any", + "array", + "as", + "asc", + "assert", + "autonomous", + "begin", + "bigdecimal", + "blob", + "boolean", + "break", + "bulk", + "by", + "case", + "cast", + "catch", + "char", + "class", + "collect", + "commit", + "const", + "continue", + "convertcurrency", + "decimal", + "default", + "delete", + "desc", + "do", + "double", + "else", + "end", + "enum", + "exception", + "exit", + "export", + "extends", + "false", + "final", + "finally", + "float", + "for", + "from", + "future", + "get", + "global", + "goto", + "group", + "having", + "hint", + "if", + "implements", + "import", + "in", + "inner", + "insert", + "instanceof", + "int", + "interface", + "into", + "join", + "last_90_days", + "last_month", + "last_n_days", + "last_week", + "like", + "limit", + "list", + "long", + "loop", + "map", + "merge", + "native", + "new", + "next_90_days", + "next_month", + "next_n_days", + "next_week", + "not", + "null", + "nulls", + "number", + "object", + "of", + "on", + "or", + "outer", + "override", + "package", + "parallel", + "pragma", + "private", + "protected", + "public", + "retrieve", + "return", + "returning", + "rollback", + "savepoint", + "search", + "select", + "set", + "short", + "sort", + "stat", + "static", + "strictfp", + "super", + "switch", + "synchronized", + "system", + "testmethod", + "then", + "this", + "this_month", + "this_week", + "throw", + "throws", + "today", + "tolabel", + "tomorrow", + "transaction", + "transient", + "trigger", + "true", + "try", + "type", + "undelete", + "update", + "upsert", + "using", + "virtual", + "void", + "volatile", + "webservice", + "when", + "where", + "while", + "yesterday" + ]; + uppercaseFirstLetter = (lowercase) => lowercase.charAt(0).toUpperCase() + lowercase.substr(1); + keywordsWithCaseVariations = []; + keywords.forEach((lowercase) => { + keywordsWithCaseVariations.push(lowercase); + keywordsWithCaseVariations.push(lowercase.toUpperCase()); + keywordsWithCaseVariations.push(uppercaseFirstLetter(lowercase)); + }); + language3 = { + defaultToken: "", + tokenPostfix: ".apex", + keywords: keywordsWithCaseVariations, + operators: [ + "=", + ">", + "<", + "!", + "~", + "?", + ":", + "==", + "<=", + ">=", + "!=", + "&&", + "||", + "++", + "--", + "+", + "-", + "*", + "/", + "&", + "|", + "^", + "%", + "<<", + ">>", + ">>>", + "+=", + "-=", + "*=", + "/=", + "&=", + "|=", + "^=", + "%=", + "<<=", + ">>=", + ">>>=" + ], + // we include these common regular expressions + symbols: /[=>](?!@symbols)/, "@brackets"], + [ + /@symbols/, + { + cases: { + "@operators": "delimiter", + "@default": "" + } + } + ], + // @ annotations. + [/@\s*[a-zA-Z_\$][\w\$]*/, "annotation"], + // numbers + [/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/, "number.float"], + [/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/, "number.float"], + [/(@digits)[fFdD]/, "number.float"], + [/(@digits)[lL]?/, "number"], + // delimiter: after number because of .\d floats + [/[;,.]/, "delimiter"], + // strings + [/"([^"\\]|\\.)*$/, "string.invalid"], + // non-teminated string + [/'([^'\\]|\\.)*$/, "string.invalid"], + // non-teminated string + [/"/, "string", '@string."'], + [/'/, "string", "@string.'"], + // characters + [/'[^\\']'/, "string"], + [/(')(@escapes)(')/, ["string", "string.escape", "string"]], + [/'/, "string.invalid"] + ], + whitespace: [ + [/[ \t\r\n]+/, ""], + [/\/\*\*(?!\/)/, "comment.doc", "@apexdoc"], + [/\/\*/, "comment", "@comment"], + [/\/\/.*$/, "comment"] + ], + comment: [ + [/[^\/*]+/, "comment"], + // [/\/\*/, 'comment', '@push' ], // nested comment not allowed :-( + // [/\/\*/, 'comment.invalid' ], // this breaks block comments in the shape of /* //*/ + [/\*\//, "comment", "@pop"], + [/[\/*]/, "comment"] + ], + //Identical copy of comment above, except for the addition of .doc + apexdoc: [ + [/[^\/*]+/, "comment.doc"], + [/\*\//, "comment.doc", "@pop"], + [/[\/*]/, "comment.doc"] + ], + string: [ + [/[^\\"']+/, "string"], + [/@escapes/, "string.escape"], + [/\\./, "string.escape.invalid"], + [ + /["']/, + { + cases: { + "$#==$S2": { token: "string", next: "@pop" }, + "@default": "string" + } + } + ] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/azcli/azcli.js +var azcli_exports = {}; +__export(azcli_exports, { + conf: () => conf3, + language: () => language4 +}); +var conf3, language4; +var init_azcli = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/azcli/azcli.js"() { + conf3 = { + comments: { + lineComment: "#" + } + }; + language4 = { + defaultToken: "keyword", + ignoreCase: true, + tokenPostfix: ".azcli", + str: /[^#\s]/, + tokenizer: { + root: [ + { include: "@comment" }, + [ + /\s-+@str*\s*/, + { + cases: { + "@eos": { token: "key.identifier", next: "@popall" }, + "@default": { token: "key.identifier", next: "@type" } + } + } + ], + [ + /^-+@str*\s*/, + { + cases: { + "@eos": { token: "key.identifier", next: "@popall" }, + "@default": { token: "key.identifier", next: "@type" } + } + } + ] + ], + type: [ + { include: "@comment" }, + [ + /-+@str*\s*/, + { + cases: { + "@eos": { token: "key.identifier", next: "@popall" }, + "@default": "key.identifier" + } + } + ], + [ + /@str+\s*/, + { + cases: { + "@eos": { token: "string", next: "@popall" }, + "@default": "string" + } + } + ] + ], + comment: [ + [ + /#.*$/, + { + cases: { + "@eos": { token: "comment", next: "@popall" } + } + } + ] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/bat/bat.js +var bat_exports = {}; +__export(bat_exports, { + conf: () => conf4, + language: () => language5 +}); +var conf4, language5; +var init_bat = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/bat/bat.js"() { + conf4 = { + comments: { + lineComment: "REM" + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' } + ], + surroundingPairs: [ + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' } + ], + folding: { + markers: { + start: new RegExp("^\\s*(::\\s*|REM\\s+)#region"), + end: new RegExp("^\\s*(::\\s*|REM\\s+)#endregion") + } + } + }; + language5 = { + defaultToken: "", + ignoreCase: true, + tokenPostfix: ".bat", + brackets: [ + { token: "delimiter.bracket", open: "{", close: "}" }, + { token: "delimiter.parenthesis", open: "(", close: ")" }, + { token: "delimiter.square", open: "[", close: "]" } + ], + keywords: /call|defined|echo|errorlevel|exist|for|goto|if|pause|set|shift|start|title|not|pushd|popd/, + // we include these common regular expressions + symbols: /[=> conf5, + language: () => language6 +}); +var bounded, identifierStart, identifierContinue, identifier, keywords2, namedLiterals, nonCommentWs, numericLiteral, conf5, language6; +var init_bicep = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/bicep/bicep.js"() { + bounded = (text2) => `\\b${text2}\\b`; + identifierStart = "[_a-zA-Z]"; + identifierContinue = "[_a-zA-Z0-9]"; + identifier = bounded(`${identifierStart}${identifierContinue}*`); + keywords2 = [ + "targetScope", + "resource", + "module", + "param", + "var", + "output", + "for", + "in", + "if", + "existing" + ]; + namedLiterals = ["true", "false", "null"]; + nonCommentWs = `[ \\t\\r\\n]`; + numericLiteral = `[0-9]+`; + conf5 = { + comments: { + lineComment: "//", + blockComment: ["/*", "*/"] + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "'", close: "'" }, + { open: "'''", close: "'''" } + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "'", close: "'", notIn: ["string", "comment"] }, + { open: "'''", close: "'''", notIn: ["string", "comment"] } + ], + autoCloseBefore: ":.,=}])' \n ", + indentationRules: { + increaseIndentPattern: new RegExp("^((?!\\/\\/).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$"), + decreaseIndentPattern: new RegExp("^((?!.*?\\/\\*).*\\*/)?\\s*[\\}\\]].*$") + } + }; + language6 = { + defaultToken: "", + tokenPostfix: ".bicep", + brackets: [ + { open: "{", close: "}", token: "delimiter.curly" }, + { open: "[", close: "]", token: "delimiter.square" }, + { open: "(", close: ")", token: "delimiter.parenthesis" } + ], + symbols: /[=> conf6, + language: () => language7 +}); +var conf6, language7; +var init_cameligo = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/cameligo/cameligo.js"() { + conf6 = { + comments: { + lineComment: "//", + blockComment: ["(*", "*)"] + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["<", ">"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "<", close: ">" }, + { open: "'", close: "'" }, + { open: '"', close: '"' }, + { open: "(*", close: "*)" } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "<", close: ">" }, + { open: "'", close: "'" }, + { open: '"', close: '"' }, + { open: "(*", close: "*)" } + ] + }; + language7 = { + defaultToken: "", + tokenPostfix: ".cameligo", + ignoreCase: true, + brackets: [ + { open: "{", close: "}", token: "delimiter.curly" }, + { open: "[", close: "]", token: "delimiter.square" }, + { open: "(", close: ")", token: "delimiter.parenthesis" }, + { open: "<", close: ">", token: "delimiter.angle" } + ], + keywords: [ + "abs", + "assert", + "block", + "Bytes", + "case", + "Crypto", + "Current", + "else", + "failwith", + "false", + "for", + "fun", + "if", + "in", + "let", + "let%entry", + "let%init", + "List", + "list", + "Map", + "map", + "match", + "match%nat", + "mod", + "not", + "operation", + "Operation", + "of", + "record", + "Set", + "set", + "sender", + "skip", + "source", + "String", + "then", + "to", + "true", + "type", + "with" + ], + typeKeywords: ["int", "unit", "string", "tz", "nat", "bool"], + operators: [ + "=", + ">", + "<", + "<=", + ">=", + "<>", + ":", + ":=", + "and", + "mod", + "or", + "+", + "-", + "*", + "/", + "@", + "&", + "^", + "%", + "->", + "<-", + "&&", + "||" + ], + // we include these common regular expressions + symbols: /[=><:@\^&|+\-*\/\^%]+/, + // The main tokenizer for our languages + tokenizer: { + root: [ + // identifiers and keywords + [ + /[a-zA-Z_][\w]*/, + { + cases: { + "@keywords": { token: "keyword.$0" }, + "@default": "identifier" + } + } + ], + // whitespace + { include: "@whitespace" }, + // delimiters and operators + [/[{}()\[\]]/, "@brackets"], + [/[<>](?!@symbols)/, "@brackets"], + [ + /@symbols/, + { + cases: { + "@operators": "delimiter", + "@default": "" + } + } + ], + // numbers + [/\d*\.\d+([eE][\-+]?\d+)?/, "number.float"], + [/\$[0-9a-fA-F]{1,16}/, "number.hex"], + [/\d+/, "number"], + // delimiter: after number because of .\d floats + [/[;,.]/, "delimiter"], + // strings + [/'([^'\\]|\\.)*$/, "string.invalid"], + // non-teminated string + [/'/, "string", "@string"], + // characters + [/'[^\\']'/, "string"], + [/'/, "string.invalid"], + [/\#\d+/, "string"] + ], + /* */ + comment: [ + [/[^\(\*]+/, "comment"], + //[/\(\*/, 'comment', '@push' ], // nested comment not allowed :-( + [/\*\)/, "comment", "@pop"], + [/\(\*/, "comment"] + ], + string: [ + [/[^\\']+/, "string"], + [/\\./, "string.escape.invalid"], + [/'/, { token: "string.quote", bracket: "@close", next: "@pop" }] + ], + whitespace: [ + [/[ \t\r\n]+/, "white"], + [/\(\*/, "comment", "@comment"], + [/\/\/.*$/, "comment"] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/clojure/clojure.js +var clojure_exports = {}; +__export(clojure_exports, { + conf: () => conf7, + language: () => language8 +}); +var conf7, language8; +var init_clojure = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/clojure/clojure.js"() { + conf7 = { + comments: { + lineComment: ";;" + }, + brackets: [ + ["[", "]"], + ["(", ")"], + ["{", "}"] + ], + autoClosingPairs: [ + { open: "[", close: "]" }, + { open: '"', close: '"' }, + { open: "(", close: ")" }, + { open: "{", close: "}" } + ], + surroundingPairs: [ + { open: "[", close: "]" }, + { open: '"', close: '"' }, + { open: "(", close: ")" }, + { open: "{", close: "}" } + ] + }; + language8 = { + defaultToken: "", + ignoreCase: true, + tokenPostfix: ".clj", + brackets: [ + { open: "[", close: "]", token: "delimiter.square" }, + { open: "(", close: ")", token: "delimiter.parenthesis" }, + { open: "{", close: "}", token: "delimiter.curly" } + ], + constants: ["true", "false", "nil"], + // delimiters: /[\\\[\]\s"#'(),;@^`{}~]|$/, + numbers: /^(?:[+\-]?\d+(?:(?:N|(?:[eE][+\-]?\d+))|(?:\.?\d*(?:M|(?:[eE][+\-]?\d+))?)|\/\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?(?=[\\\[\]\s"#'(),;@^`{}~]|$))/, + characters: /^(?:\\(?:backspace|formfeed|newline|return|space|tab|o[0-7]{3}|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{4}|.)?(?=[\\\[\]\s"(),;@^`{}~]|$))/, + escapes: /^\\(?:["'\\bfnrt]|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/, + // simple-namespace := /^[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*/ + // simple-symbol := /^(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)/ + // qualified-symbol := ((<.>)*)? + qualifiedSymbols: /^(?:(?:[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*(?:\.[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*\/)?(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*(?=[\\\[\]\s"(),;@^`{}~]|$))/, + specialForms: [ + ".", + "catch", + "def", + "do", + "if", + "monitor-enter", + "monitor-exit", + "new", + "quote", + "recur", + "set!", + "throw", + "try", + "var" + ], + coreSymbols: [ + "*", + "*'", + "*1", + "*2", + "*3", + "*agent*", + "*allow-unresolved-vars*", + "*assert*", + "*clojure-version*", + "*command-line-args*", + "*compile-files*", + "*compile-path*", + "*compiler-options*", + "*data-readers*", + "*default-data-reader-fn*", + "*e", + "*err*", + "*file*", + "*flush-on-newline*", + "*fn-loader*", + "*in*", + "*math-context*", + "*ns*", + "*out*", + "*print-dup*", + "*print-length*", + "*print-level*", + "*print-meta*", + "*print-namespace-maps*", + "*print-readably*", + "*read-eval*", + "*reader-resolver*", + "*source-path*", + "*suppress-read*", + "*unchecked-math*", + "*use-context-classloader*", + "*verbose-defrecords*", + "*warn-on-reflection*", + "+", + "+'", + "-", + "-'", + "->", + "->>", + "->ArrayChunk", + "->Eduction", + "->Vec", + "->VecNode", + "->VecSeq", + "-cache-protocol-fn", + "-reset-methods", + "..", + "/", + "<", + "<=", + "=", + "==", + ">", + ">=", + "EMPTY-NODE", + "Inst", + "StackTraceElement->vec", + "Throwable->map", + "accessor", + "aclone", + "add-classpath", + "add-watch", + "agent", + "agent-error", + "agent-errors", + "aget", + "alength", + "alias", + "all-ns", + "alter", + "alter-meta!", + "alter-var-root", + "amap", + "ancestors", + "and", + "any?", + "apply", + "areduce", + "array-map", + "as->", + "aset", + "aset-boolean", + "aset-byte", + "aset-char", + "aset-double", + "aset-float", + "aset-int", + "aset-long", + "aset-short", + "assert", + "assoc", + "assoc!", + "assoc-in", + "associative?", + "atom", + "await", + "await-for", + "await1", + "bases", + "bean", + "bigdec", + "bigint", + "biginteger", + "binding", + "bit-and", + "bit-and-not", + "bit-clear", + "bit-flip", + "bit-not", + "bit-or", + "bit-set", + "bit-shift-left", + "bit-shift-right", + "bit-test", + "bit-xor", + "boolean", + "boolean-array", + "boolean?", + "booleans", + "bound-fn", + "bound-fn*", + "bound?", + "bounded-count", + "butlast", + "byte", + "byte-array", + "bytes", + "bytes?", + "case", + "cast", + "cat", + "char", + "char-array", + "char-escape-string", + "char-name-string", + "char?", + "chars", + "chunk", + "chunk-append", + "chunk-buffer", + "chunk-cons", + "chunk-first", + "chunk-next", + "chunk-rest", + "chunked-seq?", + "class", + "class?", + "clear-agent-errors", + "clojure-version", + "coll?", + "comment", + "commute", + "comp", + "comparator", + "compare", + "compare-and-set!", + "compile", + "complement", + "completing", + "concat", + "cond", + "cond->", + "cond->>", + "condp", + "conj", + "conj!", + "cons", + "constantly", + "construct-proxy", + "contains?", + "count", + "counted?", + "create-ns", + "create-struct", + "cycle", + "dec", + "dec'", + "decimal?", + "declare", + "dedupe", + "default-data-readers", + "definline", + "definterface", + "defmacro", + "defmethod", + "defmulti", + "defn", + "defn-", + "defonce", + "defprotocol", + "defrecord", + "defstruct", + "deftype", + "delay", + "delay?", + "deliver", + "denominator", + "deref", + "derive", + "descendants", + "destructure", + "disj", + "disj!", + "dissoc", + "dissoc!", + "distinct", + "distinct?", + "doall", + "dorun", + "doseq", + "dosync", + "dotimes", + "doto", + "double", + "double-array", + "double?", + "doubles", + "drop", + "drop-last", + "drop-while", + "eduction", + "empty", + "empty?", + "ensure", + "ensure-reduced", + "enumeration-seq", + "error-handler", + "error-mode", + "eval", + "even?", + "every-pred", + "every?", + "ex-data", + "ex-info", + "extend", + "extend-protocol", + "extend-type", + "extenders", + "extends?", + "false?", + "ffirst", + "file-seq", + "filter", + "filterv", + "find", + "find-keyword", + "find-ns", + "find-protocol-impl", + "find-protocol-method", + "find-var", + "first", + "flatten", + "float", + "float-array", + "float?", + "floats", + "flush", + "fn", + "fn?", + "fnext", + "fnil", + "for", + "force", + "format", + "frequencies", + "future", + "future-call", + "future-cancel", + "future-cancelled?", + "future-done?", + "future?", + "gen-class", + "gen-interface", + "gensym", + "get", + "get-in", + "get-method", + "get-proxy-class", + "get-thread-bindings", + "get-validator", + "group-by", + "halt-when", + "hash", + "hash-combine", + "hash-map", + "hash-ordered-coll", + "hash-set", + "hash-unordered-coll", + "ident?", + "identical?", + "identity", + "if-let", + "if-not", + "if-some", + "ifn?", + "import", + "in-ns", + "inc", + "inc'", + "indexed?", + "init-proxy", + "inst-ms", + "inst-ms*", + "inst?", + "instance?", + "int", + "int-array", + "int?", + "integer?", + "interleave", + "intern", + "interpose", + "into", + "into-array", + "ints", + "io!", + "isa?", + "iterate", + "iterator-seq", + "juxt", + "keep", + "keep-indexed", + "key", + "keys", + "keyword", + "keyword?", + "last", + "lazy-cat", + "lazy-seq", + "let", + "letfn", + "line-seq", + "list", + "list*", + "list?", + "load", + "load-file", + "load-reader", + "load-string", + "loaded-libs", + "locking", + "long", + "long-array", + "longs", + "loop", + "macroexpand", + "macroexpand-1", + "make-array", + "make-hierarchy", + "map", + "map-entry?", + "map-indexed", + "map?", + "mapcat", + "mapv", + "max", + "max-key", + "memfn", + "memoize", + "merge", + "merge-with", + "meta", + "method-sig", + "methods", + "min", + "min-key", + "mix-collection-hash", + "mod", + "munge", + "name", + "namespace", + "namespace-munge", + "nat-int?", + "neg-int?", + "neg?", + "newline", + "next", + "nfirst", + "nil?", + "nnext", + "not", + "not-any?", + "not-empty", + "not-every?", + "not=", + "ns", + "ns-aliases", + "ns-imports", + "ns-interns", + "ns-map", + "ns-name", + "ns-publics", + "ns-refers", + "ns-resolve", + "ns-unalias", + "ns-unmap", + "nth", + "nthnext", + "nthrest", + "num", + "number?", + "numerator", + "object-array", + "odd?", + "or", + "parents", + "partial", + "partition", + "partition-all", + "partition-by", + "pcalls", + "peek", + "persistent!", + "pmap", + "pop", + "pop!", + "pop-thread-bindings", + "pos-int?", + "pos?", + "pr", + "pr-str", + "prefer-method", + "prefers", + "primitives-classnames", + "print", + "print-ctor", + "print-dup", + "print-method", + "print-simple", + "print-str", + "printf", + "println", + "println-str", + "prn", + "prn-str", + "promise", + "proxy", + "proxy-call-with-super", + "proxy-mappings", + "proxy-name", + "proxy-super", + "push-thread-bindings", + "pvalues", + "qualified-ident?", + "qualified-keyword?", + "qualified-symbol?", + "quot", + "rand", + "rand-int", + "rand-nth", + "random-sample", + "range", + "ratio?", + "rational?", + "rationalize", + "re-find", + "re-groups", + "re-matcher", + "re-matches", + "re-pattern", + "re-seq", + "read", + "read-line", + "read-string", + "reader-conditional", + "reader-conditional?", + "realized?", + "record?", + "reduce", + "reduce-kv", + "reduced", + "reduced?", + "reductions", + "ref", + "ref-history-count", + "ref-max-history", + "ref-min-history", + "ref-set", + "refer", + "refer-clojure", + "reify", + "release-pending-sends", + "rem", + "remove", + "remove-all-methods", + "remove-method", + "remove-ns", + "remove-watch", + "repeat", + "repeatedly", + "replace", + "replicate", + "require", + "reset!", + "reset-meta!", + "reset-vals!", + "resolve", + "rest", + "restart-agent", + "resultset-seq", + "reverse", + "reversible?", + "rseq", + "rsubseq", + "run!", + "satisfies?", + "second", + "select-keys", + "send", + "send-off", + "send-via", + "seq", + "seq?", + "seqable?", + "seque", + "sequence", + "sequential?", + "set", + "set-agent-send-executor!", + "set-agent-send-off-executor!", + "set-error-handler!", + "set-error-mode!", + "set-validator!", + "set?", + "short", + "short-array", + "shorts", + "shuffle", + "shutdown-agents", + "simple-ident?", + "simple-keyword?", + "simple-symbol?", + "slurp", + "some", + "some->", + "some->>", + "some-fn", + "some?", + "sort", + "sort-by", + "sorted-map", + "sorted-map-by", + "sorted-set", + "sorted-set-by", + "sorted?", + "special-symbol?", + "spit", + "split-at", + "split-with", + "str", + "string?", + "struct", + "struct-map", + "subs", + "subseq", + "subvec", + "supers", + "swap!", + "swap-vals!", + "symbol", + "symbol?", + "sync", + "tagged-literal", + "tagged-literal?", + "take", + "take-last", + "take-nth", + "take-while", + "test", + "the-ns", + "thread-bound?", + "time", + "to-array", + "to-array-2d", + "trampoline", + "transduce", + "transient", + "tree-seq", + "true?", + "type", + "unchecked-add", + "unchecked-add-int", + "unchecked-byte", + "unchecked-char", + "unchecked-dec", + "unchecked-dec-int", + "unchecked-divide-int", + "unchecked-double", + "unchecked-float", + "unchecked-inc", + "unchecked-inc-int", + "unchecked-int", + "unchecked-long", + "unchecked-multiply", + "unchecked-multiply-int", + "unchecked-negate", + "unchecked-negate-int", + "unchecked-remainder-int", + "unchecked-short", + "unchecked-subtract", + "unchecked-subtract-int", + "underive", + "unquote", + "unquote-splicing", + "unreduced", + "unsigned-bit-shift-right", + "update", + "update-in", + "update-proxy", + "uri?", + "use", + "uuid?", + "val", + "vals", + "var-get", + "var-set", + "var?", + "vary-meta", + "vec", + "vector", + "vector-of", + "vector?", + "volatile!", + "volatile?", + "vreset!", + "vswap!", + "when", + "when-first", + "when-let", + "when-not", + "when-some", + "while", + "with-bindings", + "with-bindings*", + "with-in-str", + "with-loading-context", + "with-local-vars", + "with-meta", + "with-open", + "with-out-str", + "with-precision", + "with-redefs", + "with-redefs-fn", + "xml-seq", + "zero?", + "zipmap" + ], + tokenizer: { + root: [ + // whitespaces and comments + { include: "@whitespace" }, + // numbers + [/@numbers/, "number"], + // characters + [/@characters/, "string"], + // strings + { include: "@string" }, + // brackets + [/[()\[\]{}]/, "@brackets"], + // regular expressions + [/\/#"(?:\.|(?:")|[^"\n])*"\/g/, "regexp"], + // reader macro characters + [/[#'@^`~]/, "meta"], + // symbols + [ + /@qualifiedSymbols/, + { + cases: { + "^:.+$": "constant", + // Clojure keywords (e.g., `:foo/bar`) + "@specialForms": "keyword", + "@coreSymbols": "keyword", + "@constants": "constant", + "@default": "identifier" + } + } + ] + ], + whitespace: [ + [/[\s,]+/, "white"], + [/;.*$/, "comment"], + [/\(comment\b/, "comment", "@comment"] + ], + comment: [ + [/\(/, "comment", "@push"], + [/\)/, "comment", "@pop"], + [/[^()]/, "comment"] + ], + string: [[/"/, "string", "@multiLineString"]], + multiLineString: [ + [/"/, "string", "@popall"], + [/@escapes/, "string.escape"], + [/./, "string"] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/coffee/coffee.js +var coffee_exports = {}; +__export(coffee_exports, { + conf: () => conf8, + language: () => language9 +}); +var conf8, language9; +var init_coffee = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/coffee/coffee.js"() { + conf8 = { + wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\@\#%\^\&\*\(\)\=\$\-\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g, + comments: { + blockComment: ["###", "###"], + lineComment: "#" + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ], + folding: { + markers: { + start: new RegExp("^\\s*#region\\b"), + end: new RegExp("^\\s*#endregion\\b") + } + } + }; + language9 = { + defaultToken: "", + ignoreCase: true, + tokenPostfix: ".coffee", + brackets: [ + { open: "{", close: "}", token: "delimiter.curly" }, + { open: "[", close: "]", token: "delimiter.square" }, + { open: "(", close: ")", token: "delimiter.parenthesis" } + ], + regEx: /\/(?!\/\/)(?:[^\/\\]|\\.)*\/[igm]*/, + keywords: [ + "and", + "or", + "is", + "isnt", + "not", + "on", + "yes", + "@", + "no", + "off", + "true", + "false", + "null", + "this", + "new", + "delete", + "typeof", + "in", + "instanceof", + "return", + "throw", + "break", + "continue", + "debugger", + "if", + "else", + "switch", + "for", + "while", + "do", + "try", + "catch", + "finally", + "class", + "extends", + "super", + "undefined", + "then", + "unless", + "until", + "loop", + "of", + "by", + "when" + ], + // we include these common regular expressions + symbols: /[=> conf9, + language: () => language10 +}); +var conf9, language10; +var init_cpp = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/cpp/cpp.js"() { + conf9 = { + comments: { + lineComment: "//", + blockComment: ["/*", "*/"] + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "[", close: "]" }, + { open: "{", close: "}" }, + { open: "(", close: ")" }, + { open: "'", close: "'", notIn: ["string", "comment"] }, + { open: '"', close: '"', notIn: ["string"] } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ], + folding: { + markers: { + start: new RegExp("^\\s*#pragma\\s+region\\b"), + end: new RegExp("^\\s*#pragma\\s+endregion\\b") + } + } + }; + language10 = { + defaultToken: "", + tokenPostfix: ".cpp", + brackets: [ + { token: "delimiter.curly", open: "{", close: "}" }, + { token: "delimiter.parenthesis", open: "(", close: ")" }, + { token: "delimiter.square", open: "[", close: "]" }, + { token: "delimiter.angle", open: "<", close: ">" } + ], + keywords: [ + "abstract", + "amp", + "array", + "auto", + "bool", + "break", + "case", + "catch", + "char", + "class", + "const", + "constexpr", + "const_cast", + "continue", + "cpu", + "decltype", + "default", + "delegate", + "delete", + "do", + "double", + "dynamic_cast", + "each", + "else", + "enum", + "event", + "explicit", + "export", + "extern", + "false", + "final", + "finally", + "float", + "for", + "friend", + "gcnew", + "generic", + "goto", + "if", + "in", + "initonly", + "inline", + "int", + "interface", + "interior_ptr", + "internal", + "literal", + "long", + "mutable", + "namespace", + "new", + "noexcept", + "nullptr", + "__nullptr", + "operator", + "override", + "partial", + "pascal", + "pin_ptr", + "private", + "property", + "protected", + "public", + "ref", + "register", + "reinterpret_cast", + "restrict", + "return", + "safe_cast", + "sealed", + "short", + "signed", + "sizeof", + "static", + "static_assert", + "static_cast", + "struct", + "switch", + "template", + "this", + "thread_local", + "throw", + "tile_static", + "true", + "try", + "typedef", + "typeid", + "typename", + "union", + "unsigned", + "using", + "virtual", + "void", + "volatile", + "wchar_t", + "where", + "while", + "_asm", + // reserved word with one underscores + "_based", + "_cdecl", + "_declspec", + "_fastcall", + "_if_exists", + "_if_not_exists", + "_inline", + "_multiple_inheritance", + "_pascal", + "_single_inheritance", + "_stdcall", + "_virtual_inheritance", + "_w64", + "__abstract", + // reserved word with two underscores + "__alignof", + "__asm", + "__assume", + "__based", + "__box", + "__builtin_alignof", + "__cdecl", + "__clrcall", + "__declspec", + "__delegate", + "__event", + "__except", + "__fastcall", + "__finally", + "__forceinline", + "__gc", + "__hook", + "__identifier", + "__if_exists", + "__if_not_exists", + "__inline", + "__int128", + "__int16", + "__int32", + "__int64", + "__int8", + "__interface", + "__leave", + "__m128", + "__m128d", + "__m128i", + "__m256", + "__m256d", + "__m256i", + "__m512", + "__m512d", + "__m512i", + "__m64", + "__multiple_inheritance", + "__newslot", + "__nogc", + "__noop", + "__nounwind", + "__novtordisp", + "__pascal", + "__pin", + "__pragma", + "__property", + "__ptr32", + "__ptr64", + "__raise", + "__restrict", + "__resume", + "__sealed", + "__single_inheritance", + "__stdcall", + "__super", + "__thiscall", + "__try", + "__try_cast", + "__typeof", + "__unaligned", + "__unhook", + "__uuidof", + "__value", + "__virtual_inheritance", + "__w64", + "__wchar_t" + ], + operators: [ + "=", + ">", + "<", + "!", + "~", + "?", + ":", + "==", + "<=", + ">=", + "!=", + "&&", + "||", + "++", + "--", + "+", + "-", + "*", + "/", + "&", + "|", + "^", + "%", + "<<", + ">>", + "+=", + "-=", + "*=", + "/=", + "&=", + "|=", + "^=", + "%=", + "<<=", + ">>=" + ], + // we include these common regular expressions + symbols: /[=>\[\]]/, "@brackets"], + [ + /@symbols/, + { + cases: { + "@operators": "delimiter", + "@default": "" + } + } + ], + // numbers + [/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/, "number.float"], + [/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/, "number.float"], + [/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/, "number.hex"], + [/0[0-7']*[0-7](@integersuffix)/, "number.octal"], + [/0[bB][0-1']*[0-1](@integersuffix)/, "number.binary"], + [/\d[\d']*\d(@integersuffix)/, "number"], + [/\d(@integersuffix)/, "number"], + // delimiter: after number because of .\d floats + [/[;,.]/, "delimiter"], + // strings + [/"([^"\\]|\\.)*$/, "string.invalid"], + // non-teminated string + [/"/, "string", "@string"], + // characters + [/'[^\\']'/, "string"], + [/(')(@escapes)(')/, ["string", "string.escape", "string"]], + [/'/, "string.invalid"] + ], + whitespace: [ + [/[ \t\r\n]+/, ""], + [/\/\*\*(?!\/)/, "comment.doc", "@doccomment"], + [/\/\*/, "comment", "@comment"], + [/\/\/.*\\$/, "comment", "@linecomment"], + [/\/\/.*$/, "comment"] + ], + comment: [ + [/[^\/*]+/, "comment"], + [/\*\//, "comment", "@pop"], + [/[\/*]/, "comment"] + ], + //For use with continuous line comments + linecomment: [ + [/.*[^\\]$/, "comment", "@pop"], + [/[^]+/, "comment"] + ], + //Identical copy of comment above, except for the addition of .doc + doccomment: [ + [/[^\/*]+/, "comment.doc"], + [/\*\//, "comment.doc", "@pop"], + [/[\/*]/, "comment.doc"] + ], + string: [ + [/[^\\"]+/, "string"], + [/@escapes/, "string.escape"], + [/\\./, "string.escape.invalid"], + [/"/, "string", "@pop"] + ], + raw: [ + [/[^)]+/, "string.raw"], + [/\)$S2\"/, { token: "string.raw.end", next: "@pop" }], + [/\)/, "string.raw"] + ], + annotation: [ + { include: "@whitespace" }, + [/using|alignas/, "keyword"], + [/[a-zA-Z0-9_]+/, "annotation"], + [/[,:]/, "delimiter"], + [/[()]/, "@brackets"], + [/\]\s*\]/, { token: "annotation", next: "@pop" }] + ], + include: [ + [ + /(\s*)(<)([^<>]*)(>)/, + [ + "", + "keyword.directive.include.begin", + "string.include.identifier", + { token: "keyword.directive.include.end", next: "@pop" } + ] + ], + [ + /(\s*)(")([^"]*)(")/, + [ + "", + "keyword.directive.include.begin", + "string.include.identifier", + { token: "keyword.directive.include.end", next: "@pop" } + ] + ] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/csharp/csharp.js +var csharp_exports = {}; +__export(csharp_exports, { + conf: () => conf10, + language: () => language11 +}); +var conf10, language11; +var init_csharp = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/csharp/csharp.js"() { + conf10 = { + wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\#\$\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g, + comments: { + lineComment: "//", + blockComment: ["/*", "*/"] + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "'", close: "'", notIn: ["string", "comment"] }, + { open: '"', close: '"', notIn: ["string", "comment"] } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "<", close: ">" }, + { open: "'", close: "'" }, + { open: '"', close: '"' } + ], + folding: { + markers: { + start: new RegExp("^\\s*#region\\b"), + end: new RegExp("^\\s*#endregion\\b") + } + } + }; + language11 = { + defaultToken: "", + tokenPostfix: ".cs", + brackets: [ + { open: "{", close: "}", token: "delimiter.curly" }, + { open: "[", close: "]", token: "delimiter.square" }, + { open: "(", close: ")", token: "delimiter.parenthesis" }, + { open: "<", close: ">", token: "delimiter.angle" } + ], + keywords: [ + "extern", + "alias", + "using", + "bool", + "decimal", + "sbyte", + "byte", + "short", + "ushort", + "int", + "uint", + "long", + "ulong", + "char", + "float", + "double", + "object", + "dynamic", + "string", + "assembly", + "is", + "as", + "ref", + "out", + "this", + "base", + "new", + "typeof", + "void", + "checked", + "unchecked", + "default", + "delegate", + "var", + "const", + "if", + "else", + "switch", + "case", + "while", + "do", + "for", + "foreach", + "in", + "break", + "continue", + "goto", + "return", + "throw", + "try", + "catch", + "finally", + "lock", + "yield", + "from", + "let", + "where", + "join", + "on", + "equals", + "into", + "orderby", + "ascending", + "descending", + "select", + "group", + "by", + "namespace", + "partial", + "class", + "field", + "event", + "method", + "param", + "public", + "protected", + "internal", + "private", + "abstract", + "sealed", + "static", + "struct", + "readonly", + "volatile", + "virtual", + "override", + "params", + "get", + "set", + "add", + "remove", + "operator", + "true", + "false", + "implicit", + "explicit", + "interface", + "enum", + "null", + "async", + "await", + "fixed", + "sizeof", + "stackalloc", + "unsafe", + "nameof", + "when" + ], + namespaceFollows: ["namespace", "using"], + parenFollows: ["if", "for", "while", "switch", "foreach", "using", "catch", "when"], + operators: [ + "=", + "??", + "||", + "&&", + "|", + "^", + "&", + "==", + "!=", + "<=", + ">=", + "<<", + "+", + "-", + "*", + "/", + "%", + "!", + "~", + "++", + "--", + "+=", + "-=", + "*=", + "/=", + "%=", + "&=", + "|=", + "^=", + "<<=", + ">>=", + ">>", + "=>" + ], + symbols: /[=>](?!@symbols)/, "@brackets"], + [ + /@symbols/, + { + cases: { + "@operators": "delimiter", + "@default": "" + } + } + ], + // numbers + [/[0-9_]*\.[0-9_]+([eE][\-+]?\d+)?[fFdD]?/, "number.float"], + [/0[xX][0-9a-fA-F_]+/, "number.hex"], + [/0[bB][01_]+/, "number.hex"], + // binary: use same theme style as hex + [/[0-9_]+/, "number"], + // delimiter: after number because of .\d floats + [/[;,.]/, "delimiter"], + // strings + [/"([^"\\]|\\.)*$/, "string.invalid"], + // non-teminated string + [/"/, { token: "string.quote", next: "@string" }], + [/\$\@"/, { token: "string.quote", next: "@litinterpstring" }], + [/\@"/, { token: "string.quote", next: "@litstring" }], + [/\$"/, { token: "string.quote", next: "@interpolatedstring" }], + // characters + [/'[^\\']'/, "string"], + [/(')(@escapes)(')/, ["string", "string.escape", "string"]], + [/'/, "string.invalid"] + ], + qualified: [ + [ + /[a-zA-Z_][\w]*/, + { + cases: { + "@keywords": { token: "keyword.$0" }, + "@default": "identifier" + } + } + ], + [/\./, "delimiter"], + ["", "", "@pop"] + ], + namespace: [ + { include: "@whitespace" }, + [/[A-Z]\w*/, "namespace"], + [/[\.=]/, "delimiter"], + ["", "", "@pop"] + ], + comment: [ + [/[^\/*]+/, "comment"], + // [/\/\*/, 'comment', '@push' ], // no nested comments :-( + ["\\*/", "comment", "@pop"], + [/[\/*]/, "comment"] + ], + string: [ + [/[^\\"]+/, "string"], + [/@escapes/, "string.escape"], + [/\\./, "string.escape.invalid"], + [/"/, { token: "string.quote", next: "@pop" }] + ], + litstring: [ + [/[^"]+/, "string"], + [/""/, "string.escape"], + [/"/, { token: "string.quote", next: "@pop" }] + ], + litinterpstring: [ + [/[^"{]+/, "string"], + [/""/, "string.escape"], + [/{{/, "string.escape"], + [/}}/, "string.escape"], + [/{/, { token: "string.quote", next: "root.litinterpstring" }], + [/"/, { token: "string.quote", next: "@pop" }] + ], + interpolatedstring: [ + [/[^\\"{]+/, "string"], + [/@escapes/, "string.escape"], + [/\\./, "string.escape.invalid"], + [/{{/, "string.escape"], + [/}}/, "string.escape"], + [/{/, { token: "string.quote", next: "root.interpolatedstring" }], + [/"/, { token: "string.quote", next: "@pop" }] + ], + whitespace: [ + [/^[ \t\v\f]*#((r)|(load))(?=\s)/, "directive.csx"], + [/^[ \t\v\f]*#\w.*$/, "namespace.cpp"], + [/[ \t\v\f\r\n]+/, ""], + [/\/\*/, "comment", "@comment"], + [/\/\/.*$/, "comment"] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/csp/csp.js +var csp_exports = {}; +__export(csp_exports, { + conf: () => conf11, + language: () => language12 +}); +var conf11, language12; +var init_csp = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/csp/csp.js"() { + conf11 = { + brackets: [], + autoClosingPairs: [], + surroundingPairs: [] + }; + language12 = { + // Set defaultToken to invalid to see what you do not tokenize yet + // defaultToken: 'invalid', + keywords: [], + typeKeywords: [], + tokenPostfix: ".csp", + operators: [], + symbols: /[=> conf12, + language: () => language13 +}); +var conf12, language13; +var init_css = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/css/css.js"() { + conf12 = { + wordPattern: /(#?-?\d*\.\d\w*%?)|((::|[@#.!:])?[\w-?]+%?)|::|[@#.!:]/g, + comments: { + blockComment: ["/*", "*/"] + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}", notIn: ["string", "comment"] }, + { open: "[", close: "]", notIn: ["string", "comment"] }, + { open: "(", close: ")", notIn: ["string", "comment"] }, + { open: '"', close: '"', notIn: ["string", "comment"] }, + { open: "'", close: "'", notIn: ["string", "comment"] } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ], + folding: { + markers: { + start: new RegExp("^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/"), + end: new RegExp("^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/") + } + } + }; + language13 = { + defaultToken: "", + tokenPostfix: ".css", + ws: "[ \n\r\f]*", + // whitespaces (referenced in several rules) + identifier: "-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*", + brackets: [ + { open: "{", close: "}", token: "delimiter.bracket" }, + { open: "[", close: "]", token: "delimiter.bracket" }, + { open: "(", close: ")", token: "delimiter.parenthesis" }, + { open: "<", close: ">", token: "delimiter.angle" } + ], + tokenizer: { + root: [{ include: "@selector" }], + selector: [ + { include: "@comments" }, + { include: "@import" }, + { include: "@strings" }, + [ + "[@](keyframes|-webkit-keyframes|-moz-keyframes|-o-keyframes)", + { token: "keyword", next: "@keyframedeclaration" } + ], + ["[@](page|content|font-face|-moz-document)", { token: "keyword" }], + ["[@](charset|namespace)", { token: "keyword", next: "@declarationbody" }], + [ + "(url-prefix)(\\()", + ["attribute.value", { token: "delimiter.parenthesis", next: "@urldeclaration" }] + ], + [ + "(url)(\\()", + ["attribute.value", { token: "delimiter.parenthesis", next: "@urldeclaration" }] + ], + { include: "@selectorname" }, + ["[\\*]", "tag"], + // selector symbols + ["[>\\+,]", "delimiter"], + // selector operators + ["\\[", { token: "delimiter.bracket", next: "@selectorattribute" }], + ["{", { token: "delimiter.bracket", next: "@selectorbody" }] + ], + selectorbody: [ + { include: "@comments" }, + ["[*_]?@identifier@ws:(?=(\\s|\\d|[^{;}]*[;}]))", "attribute.name", "@rulevalue"], + // rule definition: to distinguish from a nested selector check for whitespace, number or a semicolon + ["}", { token: "delimiter.bracket", next: "@pop" }] + ], + selectorname: [ + ["(\\.|#(?=[^{])|%|(@identifier)|:)+", "tag"] + // selector (.foo, div, ...) + ], + selectorattribute: [{ include: "@term" }, ["]", { token: "delimiter.bracket", next: "@pop" }]], + term: [ + { include: "@comments" }, + [ + "(url-prefix)(\\()", + ["attribute.value", { token: "delimiter.parenthesis", next: "@urldeclaration" }] + ], + [ + "(url)(\\()", + ["attribute.value", { token: "delimiter.parenthesis", next: "@urldeclaration" }] + ], + { include: "@functioninvocation" }, + { include: "@numbers" }, + { include: "@name" }, + { include: "@strings" }, + ["([<>=\\+\\-\\*\\/\\^\\|\\~,])", "delimiter"], + [",", "delimiter"] + ], + rulevalue: [ + { include: "@comments" }, + { include: "@strings" }, + { include: "@term" }, + ["!important", "keyword"], + [";", "delimiter", "@pop"], + ["(?=})", { token: "", next: "@pop" }] + // missing semicolon + ], + warndebug: [["[@](warn|debug)", { token: "keyword", next: "@declarationbody" }]], + import: [["[@](import)", { token: "keyword", next: "@declarationbody" }]], + urldeclaration: [ + { include: "@strings" }, + ["[^)\r\n]+", "string"], + ["\\)", { token: "delimiter.parenthesis", next: "@pop" }] + ], + parenthizedterm: [ + { include: "@term" }, + ["\\)", { token: "delimiter.parenthesis", next: "@pop" }] + ], + declarationbody: [ + { include: "@term" }, + [";", "delimiter", "@pop"], + ["(?=})", { token: "", next: "@pop" }] + // missing semicolon + ], + comments: [ + ["\\/\\*", "comment", "@comment"], + ["\\/\\/+.*", "comment"] + ], + comment: [ + ["\\*\\/", "comment", "@pop"], + [/[^*/]+/, "comment"], + [/./, "comment"] + ], + name: [["@identifier", "attribute.value"]], + numbers: [ + ["-?(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?", { token: "attribute.value.number", next: "@units" }], + ["#[0-9a-fA-F_]+(?!\\w)", "attribute.value.hex"] + ], + units: [ + [ + "(em|ex|ch|rem|fr|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?", + "attribute.value.unit", + "@pop" + ] + ], + keyframedeclaration: [ + ["@identifier", "attribute.value"], + ["{", { token: "delimiter.bracket", switchTo: "@keyframebody" }] + ], + keyframebody: [ + { include: "@term" }, + ["{", { token: "delimiter.bracket", next: "@selectorbody" }], + ["}", { token: "delimiter.bracket", next: "@pop" }] + ], + functioninvocation: [ + ["@identifier\\(", { token: "attribute.value", next: "@functionarguments" }] + ], + functionarguments: [ + ["\\$@identifier@ws:", "attribute.name"], + ["[,]", "delimiter"], + { include: "@term" }, + ["\\)", { token: "attribute.value", next: "@pop" }] + ], + strings: [ + ['~?"', { token: "string", next: "@stringenddoublequote" }], + ["~?'", { token: "string", next: "@stringendquote" }] + ], + stringenddoublequote: [ + ["\\\\.", "string"], + ['"', { token: "string", next: "@pop" }], + [/[^\\"]+/, "string"], + [".", "string"] + ], + stringendquote: [ + ["\\\\.", "string"], + ["'", { token: "string", next: "@pop" }], + [/[^\\']+/, "string"], + [".", "string"] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/cypher/cypher.js +var cypher_exports = {}; +__export(cypher_exports, { + conf: () => conf13, + language: () => language14 +}); +var conf13, language14; +var init_cypher = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/cypher/cypher.js"() { + conf13 = { + comments: { + lineComment: "//", + blockComment: ["/*", "*/"] + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" }, + { open: "`", close: "`" } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" }, + { open: "`", close: "`" } + ] + }; + language14 = { + defaultToken: "", + tokenPostfix: `.cypher`, + ignoreCase: true, + brackets: [ + { open: "{", close: "}", token: "delimiter.curly" }, + { open: "[", close: "]", token: "delimiter.bracket" }, + { open: "(", close: ")", token: "delimiter.parenthesis" } + ], + keywords: [ + "ALL", + "AND", + "AS", + "ASC", + "ASCENDING", + "BY", + "CALL", + "CASE", + "CONTAINS", + "CREATE", + "DELETE", + "DESC", + "DESCENDING", + "DETACH", + "DISTINCT", + "ELSE", + "END", + "ENDS", + "EXISTS", + "IN", + "IS", + "LIMIT", + "MANDATORY", + "MATCH", + "MERGE", + "NOT", + "ON", + "ON", + "OPTIONAL", + "OR", + "ORDER", + "REMOVE", + "RETURN", + "SET", + "SKIP", + "STARTS", + "THEN", + "UNION", + "UNWIND", + "WHEN", + "WHERE", + "WITH", + "XOR", + "YIELD" + ], + builtinLiterals: ["true", "TRUE", "false", "FALSE", "null", "NULL"], + builtinFunctions: [ + "abs", + "acos", + "asin", + "atan", + "atan2", + "avg", + "ceil", + "coalesce", + "collect", + "cos", + "cot", + "count", + "degrees", + "e", + "endNode", + "exists", + "exp", + "floor", + "head", + "id", + "keys", + "labels", + "last", + "left", + "length", + "log", + "log10", + "lTrim", + "max", + "min", + "nodes", + "percentileCont", + "percentileDisc", + "pi", + "properties", + "radians", + "rand", + "range", + "relationships", + "replace", + "reverse", + "right", + "round", + "rTrim", + "sign", + "sin", + "size", + "split", + "sqrt", + "startNode", + "stDev", + "stDevP", + "substring", + "sum", + "tail", + "tan", + "timestamp", + "toBoolean", + "toFloat", + "toInteger", + "toLower", + "toString", + "toUpper", + "trim", + "type" + ], + operators: [ + // Math operators + "+", + "-", + "*", + "/", + "%", + "^", + // Comparison operators + "=", + "<>", + "<", + ">", + "<=", + ">=", + // Pattern operators + "->", + "<-", + "-->", + "<--" + ], + escapes: /\\(?:[tbnrf\\"'`]|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/, + digits: /\d+/, + octaldigits: /[0-7]+/, + hexdigits: /[0-9a-fA-F]+/, + tokenizer: { + root: [[/[{}[\]()]/, "@brackets"], { include: "common" }], + common: [ + { include: "@whitespace" }, + { include: "@numbers" }, + { include: "@strings" }, + // Cypher labels on nodes/relationships, e.g. (n:NodeLabel)-[e:RelationshipLabel] + [/:[a-zA-Z_][\w]*/, "type.identifier"], + [ + /[a-zA-Z_][\w]*(?=\()/, + { + cases: { + "@builtinFunctions": "predefined.function" + } + } + ], + [ + /[a-zA-Z_$][\w$]*/, + { + cases: { + "@keywords": "keyword", + "@builtinLiterals": "predefined.literal", + "@default": "identifier" + } + } + ], + [/`/, "identifier.escape", "@identifierBacktick"], + // delimiter and operator after number because of `.\d` floats and `:` in labels + [/[;,.:|]/, "delimiter"], + [ + /[<>=%+\-*/^]+/, + { + cases: { + "@operators": "delimiter", + "@default": "" + } + } + ] + ], + numbers: [ + [/-?(@digits)[eE](-?(@digits))?/, "number.float"], + [/-?(@digits)?\.(@digits)([eE]-?(@digits))?/, "number.float"], + [/-?0x(@hexdigits)/, "number.hex"], + [/-?0(@octaldigits)/, "number.octal"], + [/-?(@digits)/, "number"] + ], + strings: [ + [/"([^"\\]|\\.)*$/, "string.invalid"], + // non-teminated string + [/'([^'\\]|\\.)*$/, "string.invalid"], + // non-teminated string + [/"/, "string", "@stringDouble"], + [/'/, "string", "@stringSingle"] + ], + whitespace: [ + [/[ \t\r\n]+/, "white"], + [/\/\*/, "comment", "@comment"], + [/\/\/.*$/, "comment"] + ], + comment: [ + [/\/\/.*/, "comment"], + [/[^/*]+/, "comment"], + [/\*\//, "comment", "@pop"], + [/[/*]/, "comment"] + ], + stringDouble: [ + [/[^\\"]+/, "string"], + [/@escapes/, "string"], + [/\\./, "string.invalid"], + [/"/, "string", "@pop"] + ], + stringSingle: [ + [/[^\\']+/, "string"], + [/@escapes/, "string"], + [/\\./, "string.invalid"], + [/'/, "string", "@pop"] + ], + identifierBacktick: [ + [/[^\\`]+/, "identifier.escape"], + [/@escapes/, "identifier.escape"], + [/\\./, "identifier.escape.invalid"], + [/`/, "identifier.escape", "@pop"] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/dart/dart.js +var dart_exports = {}; +__export(dart_exports, { + conf: () => conf14, + language: () => language15 +}); +var conf14, language15; +var init_dart = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/dart/dart.js"() { + conf14 = { + comments: { + lineComment: "//", + blockComment: ["/*", "*/"] + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "'", close: "'", notIn: ["string", "comment"] }, + { open: '"', close: '"', notIn: ["string"] }, + { open: "`", close: "`", notIn: ["string", "comment"] }, + { open: "/**", close: " */", notIn: ["string"] } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "<", close: ">" }, + { open: "'", close: "'" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "`", close: "`" } + ], + folding: { + markers: { + start: /^\s*\s*#?region\b/, + end: /^\s*\s*#?endregion\b/ + } + } + }; + language15 = { + defaultToken: "invalid", + tokenPostfix: ".dart", + keywords: [ + "abstract", + "dynamic", + "implements", + "show", + "as", + "else", + "import", + "static", + "assert", + "enum", + "in", + "super", + "async", + "export", + "interface", + "switch", + "await", + "extends", + "is", + "sync", + "break", + "external", + "library", + "this", + "case", + "factory", + "mixin", + "throw", + "catch", + "false", + "new", + "true", + "class", + "final", + "null", + "try", + "const", + "finally", + "on", + "typedef", + "continue", + "for", + "operator", + "var", + "covariant", + "Function", + "part", + "void", + "default", + "get", + "rethrow", + "while", + "deferred", + "hide", + "return", + "with", + "do", + "if", + "set", + "yield" + ], + typeKeywords: ["int", "double", "String", "bool"], + operators: [ + "+", + "-", + "*", + "/", + "~/", + "%", + "++", + "--", + "==", + "!=", + ">", + "<", + ">=", + "<=", + "=", + "-=", + "/=", + "%=", + ">>=", + "^=", + "+=", + "*=", + "~/=", + "<<=", + "&=", + "!=", + "||", + "&&", + "&", + "|", + "^", + "~", + "<<", + ">>", + "!", + ">>>", + "??", + "?", + ":", + "|=" + ], + // we include these common regular expressions + symbols: /[=>](?!@symbols)/, "@brackets"], + [/!(?=([^=]|$))/, "delimiter"], + [ + /@symbols/, + { + cases: { + "@operators": "delimiter", + "@default": "" + } + } + ], + // numbers + [/(@digits)[eE]([\-+]?(@digits))?/, "number.float"], + [/(@digits)\.(@digits)([eE][\-+]?(@digits))?/, "number.float"], + [/0[xX](@hexdigits)n?/, "number.hex"], + [/0[oO]?(@octaldigits)n?/, "number.octal"], + [/0[bB](@binarydigits)n?/, "number.binary"], + [/(@digits)n?/, "number"], + // delimiter: after number because of .\d floats + [/[;,.]/, "delimiter"], + // strings + [/"([^"\\]|\\.)*$/, "string.invalid"], + // non-teminated string + [/'([^'\\]|\\.)*$/, "string.invalid"], + // non-teminated string + [/"/, "string", "@string_double"], + [/'/, "string", "@string_single"] + // [/[a-zA-Z]+/, "variable"] + ], + whitespace: [ + [/[ \t\r\n]+/, ""], + [/\/\*\*(?!\/)/, "comment.doc", "@jsdoc"], + [/\/\*/, "comment", "@comment"], + [/\/\/\/.*$/, "comment.doc"], + [/\/\/.*$/, "comment"] + ], + comment: [ + [/[^\/*]+/, "comment"], + [/\*\//, "comment", "@pop"], + [/[\/*]/, "comment"] + ], + jsdoc: [ + [/[^\/*]+/, "comment.doc"], + [/\*\//, "comment.doc", "@pop"], + [/[\/*]/, "comment.doc"] + ], + // We match regular expression quite precisely + regexp: [ + [ + /(\{)(\d+(?:,\d*)?)(\})/, + ["regexp.escape.control", "regexp.escape.control", "regexp.escape.control"] + ], + [ + /(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/, + ["regexp.escape.control", { token: "regexp.escape.control", next: "@regexrange" }] + ], + [/(\()(\?:|\?=|\?!)/, ["regexp.escape.control", "regexp.escape.control"]], + [/[()]/, "regexp.escape.control"], + [/@regexpctl/, "regexp.escape.control"], + [/[^\\\/]/, "regexp"], + [/@regexpesc/, "regexp.escape"], + [/\\\./, "regexp.invalid"], + [/(\/)([gimsuy]*)/, [{ token: "regexp", bracket: "@close", next: "@pop" }, "keyword.other"]] + ], + regexrange: [ + [/-/, "regexp.escape.control"], + [/\^/, "regexp.invalid"], + [/@regexpesc/, "regexp.escape"], + [/[^\]]/, "regexp"], + [ + /\]/, + { + token: "regexp.escape.control", + next: "@pop", + bracket: "@close" + } + ] + ], + string_double: [ + [/[^\\"\$]+/, "string"], + [/[^\\"]+/, "string"], + [/@escapes/, "string.escape"], + [/\\./, "string.escape.invalid"], + [/"/, "string", "@pop"], + [/\$\w+/, "identifier"] + ], + string_single: [ + [/[^\\'\$]+/, "string"], + [/@escapes/, "string.escape"], + [/\\./, "string.escape.invalid"], + [/'/, "string", "@pop"], + [/\$\w+/, "identifier"] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/dockerfile/dockerfile.js +var dockerfile_exports = {}; +__export(dockerfile_exports, { + conf: () => conf15, + language: () => language16 +}); +var conf15, language16; +var init_dockerfile = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/dockerfile/dockerfile.js"() { + conf15 = { + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ] + }; + language16 = { + defaultToken: "", + tokenPostfix: ".dockerfile", + variable: /\${?[\w]+}?/, + tokenizer: { + root: [ + { include: "@whitespace" }, + { include: "@comment" }, + [/(ONBUILD)(\s+)/, ["keyword", ""]], + [/(ENV)(\s+)([\w]+)/, ["keyword", "", { token: "variable", next: "@arguments" }]], + [ + /(FROM|MAINTAINER|RUN|EXPOSE|ENV|ADD|ARG|VOLUME|LABEL|USER|WORKDIR|COPY|CMD|STOPSIGNAL|SHELL|HEALTHCHECK|ENTRYPOINT)/, + { token: "keyword", next: "@arguments" } + ] + ], + arguments: [ + { include: "@whitespace" }, + { include: "@strings" }, + [ + /(@variable)/, + { + cases: { + "@eos": { token: "variable", next: "@popall" }, + "@default": "variable" + } + } + ], + [ + /\\/, + { + cases: { + "@eos": "", + "@default": "" + } + } + ], + [ + /./, + { + cases: { + "@eos": { token: "", next: "@popall" }, + "@default": "" + } + } + ] + ], + // Deal with white space, including comments + whitespace: [ + [ + /\s+/, + { + cases: { + "@eos": { token: "", next: "@popall" }, + "@default": "" + } + } + ] + ], + comment: [[/(^#.*$)/, "comment", "@popall"]], + // Recognize strings, including those broken across lines with \ (but not without) + strings: [ + [/\\'$/, "", "@popall"], + // \' leaves @arguments at eol + [/\\'/, ""], + // \' is not a string + [/'$/, "string", "@popall"], + [/'/, "string", "@stringBody"], + [/"$/, "string", "@popall"], + [/"/, "string", "@dblStringBody"] + ], + stringBody: [ + [ + /[^\\\$']/, + { + cases: { + "@eos": { token: "string", next: "@popall" }, + "@default": "string" + } + } + ], + [/\\./, "string.escape"], + [/'$/, "string", "@popall"], + [/'/, "string", "@pop"], + [/(@variable)/, "variable"], + [/\\$/, "string"], + [/$/, "string", "@popall"] + ], + dblStringBody: [ + [ + /[^\\\$"]/, + { + cases: { + "@eos": { token: "string", next: "@popall" }, + "@default": "string" + } + } + ], + [/\\./, "string.escape"], + [/"$/, "string", "@popall"], + [/"/, "string", "@pop"], + [/(@variable)/, "variable"], + [/\\$/, "string"], + [/$/, "string", "@popall"] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/ecl/ecl.js +var ecl_exports = {}; +__export(ecl_exports, { + conf: () => conf16, + language: () => language17 +}); +var conf16, language17; +var init_ecl = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/ecl/ecl.js"() { + conf16 = { + comments: { + lineComment: "//", + blockComment: ["/*", "*/"] + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "'", close: "'", notIn: ["string", "comment"] }, + { open: '"', close: '"', notIn: ["string", "comment"] } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "<", close: ">" }, + { open: "'", close: "'" }, + { open: '"', close: '"' } + ] + }; + language17 = { + defaultToken: "", + tokenPostfix: ".ecl", + ignoreCase: true, + brackets: [ + { open: "{", close: "}", token: "delimiter.curly" }, + { open: "[", close: "]", token: "delimiter.square" }, + { open: "(", close: ")", token: "delimiter.parenthesis" }, + { open: "<", close: ">", token: "delimiter.angle" } + ], + pounds: [ + "append", + "break", + "declare", + "demangle", + "end", + "for", + "getdatatype", + "if", + "inmodule", + "loop", + "mangle", + "onwarning", + "option", + "set", + "stored", + "uniquename" + ].join("|"), + keywords: [ + "__compressed__", + "after", + "all", + "and", + "any", + "as", + "atmost", + "before", + "beginc", + "best", + "between", + "case", + "cluster", + "compressed", + "compression", + "const", + "counter", + "csv", + "default", + "descend", + "embed", + "encoding", + "encrypt", + "end", + "endc", + "endembed", + "endmacro", + "enum", + "escape", + "except", + "exclusive", + "expire", + "export", + "extend", + "fail", + "few", + "fileposition", + "first", + "flat", + "forward", + "from", + "full", + "function", + "functionmacro", + "group", + "grouped", + "heading", + "hole", + "ifblock", + "import", + "in", + "inner", + "interface", + "internal", + "joined", + "keep", + "keyed", + "last", + "left", + "limit", + "linkcounted", + "literal", + "little_endian", + "load", + "local", + "locale", + "lookup", + "lzw", + "macro", + "many", + "maxcount", + "maxlength", + "min skew", + "module", + "mofn", + "multiple", + "named", + "namespace", + "nocase", + "noroot", + "noscan", + "nosort", + "not", + "noxpath", + "of", + "onfail", + "only", + "opt", + "or", + "outer", + "overwrite", + "packed", + "partition", + "penalty", + "physicallength", + "pipe", + "prefetch", + "quote", + "record", + "repeat", + "retry", + "return", + "right", + "right1", + "right2", + "rows", + "rowset", + "scan", + "scope", + "self", + "separator", + "service", + "shared", + "skew", + "skip", + "smart", + "soapaction", + "sql", + "stable", + "store", + "terminator", + "thor", + "threshold", + "timelimit", + "timeout", + "token", + "transform", + "trim", + "type", + "unicodeorder", + "unordered", + "unsorted", + "unstable", + "update", + "use", + "validate", + "virtual", + "whole", + "width", + "wild", + "within", + "wnotrim", + "xml", + "xpath" + ], + functions: [ + "abs", + "acos", + "aggregate", + "allnodes", + "apply", + "ascii", + "asin", + "assert", + "asstring", + "atan", + "atan2", + "ave", + "build", + "buildindex", + "case", + "catch", + "choose", + "choosen", + "choosesets", + "clustersize", + "combine", + "correlation", + "cos", + "cosh", + "count", + "covariance", + "cron", + "dataset", + "dedup", + "define", + "denormalize", + "dictionary", + "distribute", + "distributed", + "distribution", + "ebcdic", + "enth", + "error", + "evaluate", + "event", + "eventextra", + "eventname", + "exists", + "exp", + "fail", + "failcode", + "failmessage", + "fetch", + "fromunicode", + "fromxml", + "getenv", + "getisvalid", + "global", + "graph", + "group", + "hash", + "hash32", + "hash64", + "hashcrc", + "hashmd5", + "having", + "httpcall", + "httpheader", + "if", + "iff", + "index", + "intformat", + "isvalid", + "iterate", + "join", + "keydiff", + "keypatch", + "keyunicode", + "length", + "library", + "limit", + "ln", + "loadxml", + "local", + "log", + "loop", + "map", + "matched", + "matchlength", + "matchposition", + "matchtext", + "matchunicode", + "max", + "merge", + "mergejoin", + "min", + "nofold", + "nolocal", + "nonempty", + "normalize", + "nothor", + "notify", + "output", + "parallel", + "parse", + "pipe", + "power", + "preload", + "process", + "project", + "pull", + "random", + "range", + "rank", + "ranked", + "realformat", + "recordof", + "regexfind", + "regexreplace", + "regroup", + "rejected", + "rollup", + "round", + "roundup", + "row", + "rowdiff", + "sample", + "sequential", + "set", + "sin", + "sinh", + "sizeof", + "soapcall", + "sort", + "sorted", + "sqrt", + "stepped", + "stored", + "sum", + "table", + "tan", + "tanh", + "thisnode", + "topn", + "tounicode", + "toxml", + "transfer", + "transform", + "trim", + "truncate", + "typeof", + "ungroup", + "unicodeorder", + "variance", + "wait", + "which", + "workunit", + "xmldecode", + "xmlencode", + "xmltext", + "xmlunicode" + ], + typesint: ["integer", "unsigned"].join("|"), + typesnum: ["data", "qstring", "string", "unicode", "utf8", "varstring", "varunicode"], + typesone: [ + "ascii", + "big_endian", + "boolean", + "data", + "decimal", + "ebcdic", + "grouped", + "integer", + "linkcounted", + "pattern", + "qstring", + "real", + "record", + "rule", + "set of", + "streamed", + "string", + "token", + "udecimal", + "unicode", + "unsigned", + "utf8", + "varstring", + "varunicode" + ].join("|"), + operators: ["+", "-", "/", ":=", "<", "<>", "=", ">", "\\", "and", "in", "not", "or"], + symbols: /[=>](?!@symbols)/, "@brackets"], + [ + /@symbols/, + { + cases: { + "@operators": "delimiter", + "@default": "" + } + } + ], + // numbers + [/[0-9_]*\.[0-9_]+([eE][\-+]?\d+)?/, "number.float"], + [/0[xX][0-9a-fA-F_]+/, "number.hex"], + [/0[bB][01]+/, "number.hex"], + // binary: use same theme style as hex + [/[0-9_]+/, "number"], + // delimiter: after number because of .\d floats + [/[;,.]/, "delimiter"], + // strings + [/"([^"\\]|\\.)*$/, "string.invalid"], + [/"/, "string", "@string"], + // characters + [/'[^\\']'/, "string"], + [/(')(@escapes)(')/, ["string", "string.escape", "string"]], + [/'/, "string.invalid"] + ], + whitespace: [ + [/[ \t\v\f\r\n]+/, ""], + [/\/\*/, "comment", "@comment"], + [/\/\/.*$/, "comment"] + ], + comment: [ + [/[^\/*]+/, "comment"], + [/\*\//, "comment", "@pop"], + [/[\/*]/, "comment"] + ], + string: [ + [/[^\\']+/, "string"], + [/@escapes/, "string.escape"], + [/\\./, "string.escape.invalid"], + [/'/, "string", "@pop"] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/elixir/elixir.js +var elixir_exports = {}; +__export(elixir_exports, { + conf: () => conf17, + language: () => language18 +}); +var conf17, language18; +var init_elixir = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/elixir/elixir.js"() { + conf17 = { + comments: { + lineComment: "#" + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "'", close: "'" }, + { open: '"', close: '"' } + ], + autoClosingPairs: [ + { open: "'", close: "'", notIn: ["string", "comment"] }, + { open: '"', close: '"', notIn: ["comment"] }, + { open: '"""', close: '"""' }, + { open: "`", close: "`", notIn: ["string", "comment"] }, + { open: "(", close: ")" }, + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "<<", close: ">>" } + ], + indentationRules: { + increaseIndentPattern: /^\s*(after|else|catch|rescue|fn|[^#]*(do|<\-|\->|\{|\[|\=))\s*$/, + decreaseIndentPattern: /^\s*((\}|\])\s*$|(after|else|catch|rescue|end)\b)/ + } + }; + language18 = { + defaultToken: "source", + tokenPostfix: ".elixir", + brackets: [ + { open: "[", close: "]", token: "delimiter.square" }, + { open: "(", close: ")", token: "delimiter.parenthesis" }, + { open: "{", close: "}", token: "delimiter.curly" }, + { open: "<<", close: ">>", token: "delimiter.angle.special" } + ], + // Below are lists/regexps to which we reference later. + declarationKeywords: [ + "def", + "defp", + "defn", + "defnp", + "defguard", + "defguardp", + "defmacro", + "defmacrop", + "defdelegate", + "defcallback", + "defmacrocallback", + "defmodule", + "defprotocol", + "defexception", + "defimpl", + "defstruct" + ], + operatorKeywords: ["and", "in", "not", "or", "when"], + namespaceKeywords: ["alias", "import", "require", "use"], + otherKeywords: [ + "after", + "case", + "catch", + "cond", + "do", + "else", + "end", + "fn", + "for", + "if", + "quote", + "raise", + "receive", + "rescue", + "super", + "throw", + "try", + "unless", + "unquote_splicing", + "unquote", + "with" + ], + constants: ["true", "false", "nil"], + nameBuiltin: ["__MODULE__", "__DIR__", "__ENV__", "__CALLER__", "__STACKTRACE__"], + // Matches any of the operator names: + // <<< >>> ||| &&& ^^^ ~~~ === !== ~>> <~> |~> <|> == != <= >= && || \\ <> ++ -- |> =~ -> <- ~> <~ :: .. = < > + - * / | . ^ & ! + operator: /-[->]?|!={0,2}|\*{1,2}|\/|\\\\|&{1,3}|\.\.?|\^(?:\^\^)?|\+\+?|<(?:-|<<|=|>|\|>|~>?)?|=~|={1,3}|>(?:=|>>)?|\|~>|\|>|\|{1,3}|~>>?|~~~|::/, + // See https://hexdocs.pm/elixir/syntax-reference.html#variables + variableName: /[a-z_][a-zA-Z0-9_]*[?!]?/, + // See https://hexdocs.pm/elixir/syntax-reference.html#atoms + atomName: /[a-zA-Z_][a-zA-Z0-9_@]*[?!]?|@specialAtomName|@operator/, + specialAtomName: /\.\.\.|<<>>|%\{\}|%|\{\}/, + aliasPart: /[A-Z][a-zA-Z0-9_]*/, + moduleName: /@aliasPart(?:\.@aliasPart)*/, + // Sigil pairs are: """ """, ''' ''', " ", ' ', / /, | |, < >, { }, [ ], ( ) + sigilSymmetricDelimiter: /"""|'''|"|'|\/|\|/, + sigilStartDelimiter: /@sigilSymmetricDelimiter|<|\{|\[|\(/, + sigilEndDelimiter: /@sigilSymmetricDelimiter|>|\}|\]|\)/, + sigilModifiers: /[a-zA-Z0-9]*/, + decimal: /\d(?:_?\d)*/, + hex: /[0-9a-fA-F](_?[0-9a-fA-F])*/, + octal: /[0-7](_?[0-7])*/, + binary: /[01](_?[01])*/, + // See https://hexdocs.pm/elixir/master/String.html#module-escape-characters + escape: /\\u[0-9a-fA-F]{4}|\\x[0-9a-fA-F]{2}|\\./, + // The keys below correspond to tokenizer states. + // We start from the root state and match against its rules + // until we explicitly transition into another state. + // The `include` simply brings in all operations from the given state + // and is useful for improving readability. + tokenizer: { + root: [ + { include: "@whitespace" }, + { include: "@comments" }, + // Keywords start as either an identifier or a string, + // but end with a : so it's important to match this first. + { include: "@keywordsShorthand" }, + { include: "@numbers" }, + { include: "@identifiers" }, + { include: "@strings" }, + { include: "@atoms" }, + { include: "@sigils" }, + { include: "@attributes" }, + { include: "@symbols" } + ], + // Whitespace + whitespace: [[/\s+/, "white"]], + // Comments + comments: [[/(#)(.*)/, ["comment.punctuation", "comment"]]], + // Keyword list shorthand + keywordsShorthand: [ + [/(@atomName)(:)(\s+)/, ["constant", "constant.punctuation", "white"]], + // Use positive look-ahead to ensure the string is followed by : + // and should be considered a keyword. + [ + /"(?=([^"]|#\{.*?\}|\\")*":)/, + { token: "constant.delimiter", next: "@doubleQuotedStringKeyword" } + ], + [ + /'(?=([^']|#\{.*?\}|\\')*':)/, + { token: "constant.delimiter", next: "@singleQuotedStringKeyword" } + ] + ], + doubleQuotedStringKeyword: [ + [/":/, { token: "constant.delimiter", next: "@pop" }], + { include: "@stringConstantContentInterpol" } + ], + singleQuotedStringKeyword: [ + [/':/, { token: "constant.delimiter", next: "@pop" }], + { include: "@stringConstantContentInterpol" } + ], + // Numbers + numbers: [ + [/0b@binary/, "number.binary"], + [/0o@octal/, "number.octal"], + [/0x@hex/, "number.hex"], + [/@decimal\.@decimal([eE]-?@decimal)?/, "number.float"], + [/@decimal/, "number"] + ], + // Identifiers + identifiers: [ + // Tokenize identifier name in function-like definitions. + // Note: given `def a + b, do: nil`, `a` is not a function name, + // so we use negative look-ahead to ensure there's no operator. + [ + /\b(defp?|defnp?|defmacrop?|defguardp?|defdelegate)(\s+)(@variableName)(?!\s+@operator)/, + [ + "keyword.declaration", + "white", + { + cases: { + unquote: "keyword", + "@default": "function" + } + } + ] + ], + // Tokenize function calls + [ + // In-scope call - an identifier followed by ( or .( + /(@variableName)(?=\s*\.?\s*\()/, + { + cases: { + // Tokenize as keyword in cases like `if(..., do: ..., else: ...)` + "@declarationKeywords": "keyword.declaration", + "@namespaceKeywords": "keyword", + "@otherKeywords": "keyword", + "@default": "function.call" + } + } + ], + [ + // Referencing function in a module + /(@moduleName)(\s*)(\.)(\s*)(@variableName)/, + ["type.identifier", "white", "operator", "white", "function.call"] + ], + [ + // Referencing function in an Erlang module + /(:)(@atomName)(\s*)(\.)(\s*)(@variableName)/, + ["constant.punctuation", "constant", "white", "operator", "white", "function.call"] + ], + [ + // Piping into a function (tokenized separately as it may not have parentheses) + /(\|>)(\s*)(@variableName)/, + [ + "operator", + "white", + { + cases: { + "@otherKeywords": "keyword", + "@default": "function.call" + } + } + ] + ], + [ + // Function reference passed to another function + /(&)(\s*)(@variableName)/, + ["operator", "white", "function.call"] + ], + // Language keywords, builtins, constants and variables + [ + /@variableName/, + { + cases: { + "@declarationKeywords": "keyword.declaration", + "@operatorKeywords": "keyword.operator", + "@namespaceKeywords": "keyword", + "@otherKeywords": "keyword", + "@constants": "constant.language", + "@nameBuiltin": "variable.language", + "_.*": "comment.unused", + "@default": "identifier" + } + } + ], + // Module names + [/@moduleName/, "type.identifier"] + ], + // Strings + strings: [ + [/"""/, { token: "string.delimiter", next: "@doubleQuotedHeredoc" }], + [/'''/, { token: "string.delimiter", next: "@singleQuotedHeredoc" }], + [/"/, { token: "string.delimiter", next: "@doubleQuotedString" }], + [/'/, { token: "string.delimiter", next: "@singleQuotedString" }] + ], + doubleQuotedHeredoc: [ + [/"""/, { token: "string.delimiter", next: "@pop" }], + { include: "@stringContentInterpol" } + ], + singleQuotedHeredoc: [ + [/'''/, { token: "string.delimiter", next: "@pop" }], + { include: "@stringContentInterpol" } + ], + doubleQuotedString: [ + [/"/, { token: "string.delimiter", next: "@pop" }], + { include: "@stringContentInterpol" } + ], + singleQuotedString: [ + [/'/, { token: "string.delimiter", next: "@pop" }], + { include: "@stringContentInterpol" } + ], + // Atoms + atoms: [ + [/(:)(@atomName)/, ["constant.punctuation", "constant"]], + [/:"/, { token: "constant.delimiter", next: "@doubleQuotedStringAtom" }], + [/:'/, { token: "constant.delimiter", next: "@singleQuotedStringAtom" }] + ], + doubleQuotedStringAtom: [ + [/"/, { token: "constant.delimiter", next: "@pop" }], + { include: "@stringConstantContentInterpol" } + ], + singleQuotedStringAtom: [ + [/'/, { token: "constant.delimiter", next: "@pop" }], + { include: "@stringConstantContentInterpol" } + ], + // Sigils + // See https://elixir-lang.org/getting-started/sigils.html + // Sigils allow for typing values using their textual representation. + // All sigils start with ~ followed by a letter or + // multi-letter uppercase starting at Elixir v1.15.0, indicating sigil type + // and then a delimiter pair enclosing the textual representation. + // Optional modifiers are allowed after the closing delimiter. + // For instance a regular expressions can be written as: + // ~r/foo|bar/ ~r{foo|bar} ~r/foo|bar/g + // + // In general lowercase sigils allow for interpolation + // and escaped characters, whereas uppercase sigils don't + // + // During tokenization we want to distinguish some + // specific sigil types, namely string and regexp, + // so that they cen be themed separately. + // + // To reasonably handle all those combinations we leverage + // dot-separated states, so if we transition to @sigilStart.interpol.s.{.} + // then "sigilStart.interpol.s" state will match and also all + // the individual dot-separated parameters can be accessed. + sigils: [ + [/~[a-z]@sigilStartDelimiter/, { token: "@rematch", next: "@sigil.interpol" }], + [/~([A-Z]+)@sigilStartDelimiter/, { token: "@rematch", next: "@sigil.noInterpol" }] + ], + sigil: [ + [/~([a-z]|[A-Z]+)\{/, { token: "@rematch", switchTo: "@sigilStart.$S2.$1.{.}" }], + [/~([a-z]|[A-Z]+)\[/, { token: "@rematch", switchTo: "@sigilStart.$S2.$1.[.]" }], + [/~([a-z]|[A-Z]+)\(/, { token: "@rematch", switchTo: "@sigilStart.$S2.$1.(.)" }], + [/~([a-z]|[A-Z]+)\" }], + [ + /~([a-z]|[A-Z]+)(@sigilSymmetricDelimiter)/, + { token: "@rematch", switchTo: "@sigilStart.$S2.$1.$2.$2" } + ] + ], + // The definitions below expect states to be of the form: + // + // sigilStart.... + // sigilContinue.... + // + // The sigilStart state is used only to properly classify the token (as string/regex/sigil) + // and immediately switches to the sigilContinue sate, which handles the actual content + // and waits for the corresponding end delimiter. + "sigilStart.interpol.s": [ + [ + /~s@sigilStartDelimiter/, + { + token: "string.delimiter", + switchTo: "@sigilContinue.$S2.$S3.$S4.$S5" + } + ] + ], + "sigilContinue.interpol.s": [ + [ + /(@sigilEndDelimiter)@sigilModifiers/, + { + cases: { + "$1==$S5": { token: "string.delimiter", next: "@pop" }, + "@default": "string" + } + } + ], + { include: "@stringContentInterpol" } + ], + "sigilStart.noInterpol.S": [ + [ + /~S@sigilStartDelimiter/, + { + token: "string.delimiter", + switchTo: "@sigilContinue.$S2.$S3.$S4.$S5" + } + ] + ], + "sigilContinue.noInterpol.S": [ + // Ignore escaped sigil end + [/(^|[^\\])\\@sigilEndDelimiter/, "string"], + [ + /(@sigilEndDelimiter)@sigilModifiers/, + { + cases: { + "$1==$S5": { token: "string.delimiter", next: "@pop" }, + "@default": "string" + } + } + ], + { include: "@stringContent" } + ], + "sigilStart.interpol.r": [ + [ + /~r@sigilStartDelimiter/, + { + token: "regexp.delimiter", + switchTo: "@sigilContinue.$S2.$S3.$S4.$S5" + } + ] + ], + "sigilContinue.interpol.r": [ + [ + /(@sigilEndDelimiter)@sigilModifiers/, + { + cases: { + "$1==$S5": { token: "regexp.delimiter", next: "@pop" }, + "@default": "regexp" + } + } + ], + { include: "@regexpContentInterpol" } + ], + "sigilStart.noInterpol.R": [ + [ + /~R@sigilStartDelimiter/, + { + token: "regexp.delimiter", + switchTo: "@sigilContinue.$S2.$S3.$S4.$S5" + } + ] + ], + "sigilContinue.noInterpol.R": [ + // Ignore escaped sigil end + [/(^|[^\\])\\@sigilEndDelimiter/, "regexp"], + [ + /(@sigilEndDelimiter)@sigilModifiers/, + { + cases: { + "$1==$S5": { token: "regexp.delimiter", next: "@pop" }, + "@default": "regexp" + } + } + ], + { include: "@regexpContent" } + ], + // Fallback to the generic sigil by default + "sigilStart.interpol": [ + [ + /~([a-z]|[A-Z]+)@sigilStartDelimiter/, + { + token: "sigil.delimiter", + switchTo: "@sigilContinue.$S2.$S3.$S4.$S5" + } + ] + ], + "sigilContinue.interpol": [ + [ + /(@sigilEndDelimiter)@sigilModifiers/, + { + cases: { + "$1==$S5": { token: "sigil.delimiter", next: "@pop" }, + "@default": "sigil" + } + } + ], + { include: "@sigilContentInterpol" } + ], + "sigilStart.noInterpol": [ + [ + /~([a-z]|[A-Z]+)@sigilStartDelimiter/, + { + token: "sigil.delimiter", + switchTo: "@sigilContinue.$S2.$S3.$S4.$S5" + } + ] + ], + "sigilContinue.noInterpol": [ + // Ignore escaped sigil end + [/(^|[^\\])\\@sigilEndDelimiter/, "sigil"], + [ + /(@sigilEndDelimiter)@sigilModifiers/, + { + cases: { + "$1==$S5": { token: "sigil.delimiter", next: "@pop" }, + "@default": "sigil" + } + } + ], + { include: "@sigilContent" } + ], + // Attributes + attributes: [ + // Module @doc* attributes - tokenized as comments + [ + /\@(module|type)?doc (~[sS])?"""/, + { + token: "comment.block.documentation", + next: "@doubleQuotedHeredocDocstring" + } + ], + [ + /\@(module|type)?doc (~[sS])?'''/, + { + token: "comment.block.documentation", + next: "@singleQuotedHeredocDocstring" + } + ], + [ + /\@(module|type)?doc (~[sS])?"/, + { + token: "comment.block.documentation", + next: "@doubleQuotedStringDocstring" + } + ], + [ + /\@(module|type)?doc (~[sS])?'/, + { + token: "comment.block.documentation", + next: "@singleQuotedStringDocstring" + } + ], + [/\@(module|type)?doc false/, "comment.block.documentation"], + // Module attributes + [/\@(@variableName)/, "variable"] + ], + doubleQuotedHeredocDocstring: [ + [/"""/, { token: "comment.block.documentation", next: "@pop" }], + { include: "@docstringContent" } + ], + singleQuotedHeredocDocstring: [ + [/'''/, { token: "comment.block.documentation", next: "@pop" }], + { include: "@docstringContent" } + ], + doubleQuotedStringDocstring: [ + [/"/, { token: "comment.block.documentation", next: "@pop" }], + { include: "@docstringContent" } + ], + singleQuotedStringDocstring: [ + [/'/, { token: "comment.block.documentation", next: "@pop" }], + { include: "@docstringContent" } + ], + // Operators, punctuation, brackets + symbols: [ + // Code point operator (either with regular character ?a or an escaped one ?\n) + [/\?(\\.|[^\\\s])/, "number.constant"], + // Anonymous function arguments + [/&\d+/, "operator"], + // Bitshift operators (must go before delimiters, so that << >> don't match first) + [/<<<|>>>/, "operator"], + // Delimiter pairs + [/[()\[\]\{\}]|<<|>>/, "@brackets"], + // Triple dot is a valid name (must go before operators, so that .. doesn't match instead) + [/\.\.\./, "identifier"], + // Punctuation => (must go before operators, so it's not tokenized as = then >) + [/=>/, "punctuation"], + // Operators + [/@operator/, "operator"], + // Punctuation + [/[:;,.%]/, "punctuation"] + ], + // Generic helpers + stringContentInterpol: [ + { include: "@interpolation" }, + { include: "@escapeChar" }, + { include: "@stringContent" } + ], + stringContent: [[/./, "string"]], + stringConstantContentInterpol: [ + { include: "@interpolation" }, + { include: "@escapeChar" }, + { include: "@stringConstantContent" } + ], + stringConstantContent: [[/./, "constant"]], + regexpContentInterpol: [ + { include: "@interpolation" }, + { include: "@escapeChar" }, + { include: "@regexpContent" } + ], + regexpContent: [ + // # may be a regular regexp char, so we use a heuristic + // assuming a # surrounded by whitespace is actually a comment. + [/(\s)(#)(\s.*)$/, ["white", "comment.punctuation", "comment"]], + [/./, "regexp"] + ], + sigilContentInterpol: [ + { include: "@interpolation" }, + { include: "@escapeChar" }, + { include: "@sigilContent" } + ], + sigilContent: [[/./, "sigil"]], + docstringContent: [[/./, "comment.block.documentation"]], + escapeChar: [[/@escape/, "constant.character.escape"]], + interpolation: [[/#{/, { token: "delimiter.bracket.embed", next: "@interpolationContinue" }]], + interpolationContinue: [ + [/}/, { token: "delimiter.bracket.embed", next: "@pop" }], + // Interpolation brackets may contain arbitrary code, + // so we simply match against all the root rules, + // until we reach interpolation end (the above matches). + { include: "@root" } + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/flow9/flow9.js +var flow9_exports = {}; +__export(flow9_exports, { + conf: () => conf18, + language: () => language19 +}); +var conf18, language19; +var init_flow9 = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/flow9/flow9.js"() { + conf18 = { + comments: { + blockComment: ["/*", "*/"], + lineComment: "//" + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}", notIn: ["string"] }, + { open: "[", close: "]", notIn: ["string"] }, + { open: "(", close: ")", notIn: ["string"] }, + { open: '"', close: '"', notIn: ["string"] }, + { open: "'", close: "'", notIn: ["string"] } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" }, + { open: "<", close: ">" } + ] + }; + language19 = { + defaultToken: "", + tokenPostfix: ".flow", + keywords: [ + "import", + "require", + "export", + "forbid", + "native", + "if", + "else", + "cast", + "unsafe", + "switch", + "default" + ], + types: [ + "io", + "mutable", + "bool", + "int", + "double", + "string", + "flow", + "void", + "ref", + "true", + "false", + "with" + ], + operators: [ + "=", + ">", + "<", + "<=", + ">=", + "==", + "!", + "!=", + ":=", + "::=", + "&&", + "||", + "+", + "-", + "*", + "/", + "@", + "&", + "%", + ":", + "->", + "\\", + "$", + "??", + "^" + ], + symbols: /[@$=>](?!@symbols)/, "delimiter"], + [ + /@symbols/, + { + cases: { + "@operators": "delimiter", + "@default": "" + } + } + ], + // numbers + [/((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)/, "number"], + // delimiter: after number because of .\d floats + [/[;,.]/, "delimiter"], + // strings + [/"([^"\\]|\\.)*$/, "string.invalid"], + [/"/, "string", "@string"] + ], + whitespace: [ + [/[ \t\r\n]+/, ""], + [/\/\*/, "comment", "@comment"], + [/\/\/.*$/, "comment"] + ], + comment: [ + [/[^\/*]+/, "comment"], + [/\*\//, "comment", "@pop"], + [/[\/*]/, "comment"] + ], + string: [ + [/[^\\"]+/, "string"], + [/@escapes/, "string.escape"], + [/\\./, "string.escape.invalid"], + [/"/, "string", "@pop"] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/fsharp/fsharp.js +var fsharp_exports = {}; +__export(fsharp_exports, { + conf: () => conf19, + language: () => language20 +}); +var conf19, language20; +var init_fsharp = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/fsharp/fsharp.js"() { + conf19 = { + comments: { + lineComment: "//", + blockComment: ["(*", "*)"] + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ], + folding: { + markers: { + start: new RegExp("^\\s*//\\s*#region\\b|^\\s*\\(\\*\\s*#region(.*)\\*\\)"), + end: new RegExp("^\\s*//\\s*#endregion\\b|^\\s*\\(\\*\\s*#endregion\\s*\\*\\)") + } + } + }; + language20 = { + defaultToken: "", + tokenPostfix: ".fs", + keywords: [ + "abstract", + "and", + "atomic", + "as", + "assert", + "asr", + "base", + "begin", + "break", + "checked", + "component", + "const", + "constraint", + "constructor", + "continue", + "class", + "default", + "delegate", + "do", + "done", + "downcast", + "downto", + "elif", + "else", + "end", + "exception", + "eager", + "event", + "external", + "extern", + "false", + "finally", + "for", + "fun", + "function", + "fixed", + "functor", + "global", + "if", + "in", + "include", + "inherit", + "inline", + "interface", + "internal", + "land", + "lor", + "lsl", + "lsr", + "lxor", + "lazy", + "let", + "match", + "member", + "mod", + "module", + "mutable", + "namespace", + "method", + "mixin", + "new", + "not", + "null", + "of", + "open", + "or", + "object", + "override", + "private", + "parallel", + "process", + "protected", + "pure", + "public", + "rec", + "return", + "static", + "sealed", + "struct", + "sig", + "then", + "to", + "true", + "tailcall", + "trait", + "try", + "type", + "upcast", + "use", + "val", + "void", + "virtual", + "volatile", + "when", + "while", + "with", + "yield" + ], + // we include these common regular expressions + symbols: /[=>]. + [/\[<.*>\]/, "annotation"], + // Preprocessor directive + [/^#(if|else|endif)/, "keyword"], + // delimiters and operators + [/[{}()\[\]]/, "@brackets"], + [/[<>](?!@symbols)/, "@brackets"], + [/@symbols/, "delimiter"], + // numbers + [/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/, "number.float"], + [/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/, "number.float"], + [/0x[0-9a-fA-F]+LF/, "number.float"], + [/0x[0-9a-fA-F]+(@integersuffix)/, "number.hex"], + [/0b[0-1]+(@integersuffix)/, "number.bin"], + [/\d+(@integersuffix)/, "number"], + // delimiter: after number because of .\d floats + [/[;,.]/, "delimiter"], + // strings + [/"([^"\\]|\\.)*$/, "string.invalid"], + // non-teminated string + [/"""/, "string", '@string."""'], + [/"/, "string", '@string."'], + // literal string + [/\@"/, { token: "string.quote", next: "@litstring" }], + // characters + [/'[^\\']'B?/, "string"], + [/(')(@escapes)(')/, ["string", "string.escape", "string"]], + [/'/, "string.invalid"] + ], + whitespace: [ + [/[ \t\r\n]+/, ""], + [/\(\*(?!\))/, "comment", "@comment"], + [/\/\/.*$/, "comment"] + ], + comment: [ + [/[^*(]+/, "comment"], + [/\*\)/, "comment", "@pop"], + [/\*/, "comment"], + [/\(\*\)/, "comment"], + [/\(/, "comment"] + ], + string: [ + [/[^\\"]+/, "string"], + [/@escapes/, "string.escape"], + [/\\./, "string.escape.invalid"], + [ + /("""|"B?)/, + { + cases: { + "$#==$S2": { token: "string", next: "@pop" }, + "@default": "string" + } + } + ] + ], + litstring: [ + [/[^"]+/, "string"], + [/""/, "string.escape"], + [/"/, { token: "string.quote", next: "@pop" }] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/freemarker2/freemarker2.js +var freemarker2_exports = {}; +__export(freemarker2_exports, { + TagAngleInterpolationBracket: () => TagAngleInterpolationBracket, + TagAngleInterpolationDollar: () => TagAngleInterpolationDollar, + TagAutoInterpolationBracket: () => TagAutoInterpolationBracket, + TagAutoInterpolationDollar: () => TagAutoInterpolationDollar, + TagBracketInterpolationBracket: () => TagBracketInterpolationBracket, + TagBracketInterpolationDollar: () => TagBracketInterpolationDollar +}); +function createLangConfiguration(ts2) { + return { + brackets: [ + ["<", ">"], + ["[", "]"], + ["(", ")"], + ["{", "}"] + ], + comments: { + blockComment: [`${ts2.open}--`, `--${ts2.close}`] + }, + autoCloseBefore: "\n\r }]),.:;=", + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"', notIn: ["string"] }, + { open: "'", close: "'", notIn: ["string"] } + ], + surroundingPairs: [ + { open: '"', close: '"' }, + { open: "'", close: "'" }, + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "<", close: ">" } + ], + folding: { + markers: { + start: new RegExp( + `${ts2.open}#(?:${BLOCK_ELEMENTS.join("|")})([^/${ts2.close}]*(?!/)${ts2.close})[^${ts2.open}]*$` + ), + end: new RegExp(`${ts2.open}/#(?:${BLOCK_ELEMENTS.join("|")})[\\r\\n\\t ]*>`) + } + }, + onEnterRules: [ + { + beforeText: new RegExp( + `${ts2.open}#(?!(?:${EMPTY_ELEMENTS.join("|")}))([a-zA-Z_]+)([^/${ts2.close}]*(?!/)${ts2.close})[^${ts2.open}]*$` + ), + afterText: new RegExp(`^${ts2.open}/#([a-zA-Z_]+)[\\r\\n\\t ]*${ts2.close}$`), + action: { + indentAction: monaco_editor_core_exports2.languages.IndentAction.IndentOutdent + } + }, + { + beforeText: new RegExp( + `${ts2.open}#(?!(?:${EMPTY_ELEMENTS.join("|")}))([a-zA-Z_]+)([^/${ts2.close}]*(?!/)${ts2.close})[^${ts2.open}]*$` + ), + action: { indentAction: monaco_editor_core_exports2.languages.IndentAction.Indent } + } + ] + }; +} +function createLangConfigurationAuto() { + return { + // Cannot set block comment delimiter in auto mode... + // It depends on the content and the cursor position of the file... + brackets: [ + ["<", ">"], + ["[", "]"], + ["(", ")"], + ["{", "}"] + ], + autoCloseBefore: "\n\r }]),.:;=", + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"', notIn: ["string"] }, + { open: "'", close: "'", notIn: ["string"] } + ], + surroundingPairs: [ + { open: '"', close: '"' }, + { open: "'", close: "'" }, + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "<", close: ">" } + ], + folding: { + markers: { + start: new RegExp(`[<\\[]#(?:${BLOCK_ELEMENTS.join("|")})([^/>\\]]*(?!/)[>\\]])[^<\\[]*$`), + end: new RegExp(`[<\\[]/#(?:${BLOCK_ELEMENTS.join("|")})[\\r\\n\\t ]*>`) + } + }, + onEnterRules: [ + { + beforeText: new RegExp( + `[<\\[]#(?!(?:${EMPTY_ELEMENTS.join("|")}))([a-zA-Z_]+)([^/>\\]]*(?!/)[>\\]])[^[<\\[]]*$` + ), + afterText: new RegExp(`^[<\\[]/#([a-zA-Z_]+)[\\r\\n\\t ]*[>\\]]$`), + action: { + indentAction: monaco_editor_core_exports2.languages.IndentAction.IndentOutdent + } + }, + { + beforeText: new RegExp( + `[<\\[]#(?!(?:${EMPTY_ELEMENTS.join("|")}))([a-zA-Z_]+)([^/>\\]]*(?!/)[>\\]])[^[<\\[]]*$` + ), + action: { indentAction: monaco_editor_core_exports2.languages.IndentAction.Indent } + } + ] + }; +} +function createMonarchLanguage(ts2, is) { + const id = `_${ts2.id}_${is.id}`; + const s = (name) => name.replace(/__id__/g, id); + const r = (regexp) => { + const source = regexp.source.replace(/__id__/g, id); + return new RegExp(source, regexp.flags); + }; + return { + // Settings + unicode: true, + includeLF: false, + start: s("default__id__"), + ignoreCase: false, + defaultToken: "invalid", + tokenPostfix: `.freemarker2`, + brackets: [ + { open: "{", close: "}", token: "delimiter.curly" }, + { open: "[", close: "]", token: "delimiter.square" }, + { open: "(", close: ")", token: "delimiter.parenthesis" }, + { open: "<", close: ">", token: "delimiter.angle" } + ], + // Dynamic RegExp + [s("open__id__")]: new RegExp(ts2.open), + [s("close__id__")]: new RegExp(ts2.close), + [s("iOpen1__id__")]: new RegExp(is.open1), + [s("iOpen2__id__")]: new RegExp(is.open2), + [s("iClose__id__")]: new RegExp(is.close), + // <#START_TAG : "<" | "<#" | "[#"> + // <#END_TAG : " + [s("startTag__id__")]: r(/(@open__id__)(#)/), + [s("endTag__id__")]: r(/(@open__id__)(\/#)/), + [s("startOrEndTag__id__")]: r(/(@open__id__)(\/?#)/), + // <#CLOSE_TAG1 : ()* (">" | "]")> + [s("closeTag1__id__")]: r(/((?:@blank)*)(@close__id__)/), + // <#CLOSE_TAG2 : ()* ("/")? (">" | "]")> + [s("closeTag2__id__")]: r(/((?:@blank)*\/?)(@close__id__)/), + // Static RegExp + // <#BLANK : " " | "\t" | "\n" | "\r"> + blank: /[ \t\n\r]/, + // + // + // + // + // + keywords: ["false", "true", "in", "as", "using"], + // Directive names that cannot have an expression parameters and cannot be self-closing + // E.g. <#if id==2> ... + directiveStartCloseTag1: /attempt|recover|sep|auto[eE]sc|no(?:autoe|AutoE)sc|compress|default|no[eE]scape|comment|no[pP]arse/, + // Directive names that cannot have an expression parameter and can be self-closing + // E.g. <#if> ... <#else> ... + // E.g. <#if> ... <#else /> + directiveStartCloseTag2: /else|break|continue|return|stop|flush|t|lt|rt|nt|nested|recurse|fallback|ftl/, + // Directive names that can have an expression parameter and cannot be self-closing + // E.g. <#if id==2> ... + directiveStartBlank: /if|else[iI]f|list|for[eE]ach|switch|case|assign|global|local|include|import|function|macro|transform|visit|stop|return|call|setting|output[fF]ormat|nested|recurse|escape|ftl|items/, + // Directive names that can have an end tag + // E.g. + directiveEndCloseTag1: /if|list|items|sep|recover|attempt|for[eE]ach|local|global|assign|function|macro|output[fF]ormat|auto[eE]sc|no(?:autoe|AutoE)sc|compress|transform|switch|escape|no[eE]scape/, + // <#ESCAPED_CHAR : + // "\\" + // ( + // ("n" | "t" | "r" | "f" | "b" | "g" | "l" | "a" | "\\" | "'" | "\"" | "{" | "=") + // | + // ("x" ["0"-"9", "A"-"F", "a"-"f"]) + // ) + // > + // Note: While the JavaCC tokenizer rule only specifies one hex digit, + // FreeMarker actually interprets up to 4 hex digits. + escapedChar: /\\(?:[ntrfbgla\\'"\{=]|(?:x[0-9A-Fa-f]{1,4}))/, + // <#ASCII_DIGIT: ["0" - "9"]> + asciiDigit: /[0-9]/, + // + integer: /[0-9]+/, + // <#NON_ESCAPED_ID_START_CHAR: + // [ + // // This was generated on JDK 1.8.0_20 Win64 with src/main/misc/identifierChars/IdentifierCharGenerator.java + // ... + // ] + nonEscapedIdStartChar: /[\$@-Z_a-z\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u1FFF\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183-\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3006\u3031-\u3035\u303B-\u303C\u3040-\u318F\u31A0-\u31BA\u31F0-\u31FF\u3300-\u337F\u3400-\u4DB5\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/, + // <#ESCAPED_ID_CHAR: "\\" ("-" | "." | ":" | "#")> + escapedIdChar: /\\[\-\.:#]/, + // <#ID_START_CHAR: |> + idStartChar: /(?:@nonEscapedIdStartChar)|(?:@escapedIdChar)/, + // (|)*> + id: /(?:@idStartChar)(?:(?:@idStartChar)|(?:@asciiDigit))*/, + // Certain keywords / operators are allowed to index hashes + // + // Expression DotVariable(Expression exp) : + // { + // Token t; + // } + // { + // + // ( + // t = | t = | t = + // | + // ( + // t = + // | + // t = + // | + // t = + // | + // t = + // | + // t = + // | + // t = + // | + // t = + // | + // t = + // | + // t = + // ) + // { + // if (!Character.isLetter(t.image.charAt(0))) { + // throw new ParseException(t.image + " is not a valid identifier.", template, t); + // } + // } + // ) + // { + // notListLiteral(exp, "hash"); + // notStringLiteral(exp, "hash"); + // notBooleanLiteral(exp, "hash"); + // Dot dot = new Dot(exp, t.image); + // dot.setLocation(template, exp, t); + // return dot; + // } + // } + specialHashKeys: /\*\*|\*|false|true|in|as|using/, + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // " | "->"> + namedSymbols: /<=|>=|\\lte|\\lt|<|\\gte|\\gt|>|&&|\\and|->|->|==|!=|\+=|-=|\*=|\/=|%=|\+\+|--|<=|&&|\|\||:|\.\.\.|\.\.\*|\.\.<|\.\.!|\?\?|=|<|\+|-|\*|\/|%|\||\.\.|\?|!|&|\.|,|;/, + arrows: ["->", "->"], + delimiters: [";", ":", ",", "."], + stringOperators: ["lte", "lt", "gte", "gt"], + noParseTags: ["noparse", "noParse", "comment"], + tokenizer: { + // Parser states + // Plain text + [s("default__id__")]: [ + { include: s("@directive_token__id__") }, + { include: s("@interpolation_and_text_token__id__") } + ], + // A FreeMarker expression inside a directive, e.g. <#if 2<3> + [s("fmExpression__id__.directive")]: [ + { include: s("@blank_and_expression_comment_token__id__") }, + { include: s("@directive_end_token__id__") }, + { include: s("@expression_token__id__") } + ], + // A FreeMarker expression inside an interpolation, e.g. ${2+3} + [s("fmExpression__id__.interpolation")]: [ + { include: s("@blank_and_expression_comment_token__id__") }, + { include: s("@expression_token__id__") }, + { include: s("@greater_operators_token__id__") } + ], + // In an expression and inside a not-yet closed parenthesis / bracket + [s("inParen__id__.plain")]: [ + { include: s("@blank_and_expression_comment_token__id__") }, + { include: s("@directive_end_token__id__") }, + { include: s("@expression_token__id__") } + ], + [s("inParen__id__.gt")]: [ + { include: s("@blank_and_expression_comment_token__id__") }, + { include: s("@expression_token__id__") }, + { include: s("@greater_operators_token__id__") } + ], + // Expression for the unified call, e.g. <@createMacro() ... > + [s("noSpaceExpression__id__")]: [ + { include: s("@no_space_expression_end_token__id__") }, + { include: s("@directive_end_token__id__") }, + { include: s("@expression_token__id__") } + ], + // For the function of a unified call. Special case for when the + // expression is a simple identifier. + // <@join [1,2] ","> + // <@null!join [1,2] ","> + [s("unifiedCall__id__")]: [{ include: s("@unified_call_token__id__") }], + // For singly and doubly quoted string (that may contain interpolations) + [s("singleString__id__")]: [{ include: s("@string_single_token__id__") }], + [s("doubleString__id__")]: [{ include: s("@string_double_token__id__") }], + // For singly and doubly quoted string (that may not contain interpolations) + [s("rawSingleString__id__")]: [{ include: s("@string_single_raw_token__id__") }], + [s("rawDoubleString__id__")]: [{ include: s("@string_double_raw_token__id__") }], + // For a comment in an expression + // ${ 1 + <#-- comment --> 2} + [s("expressionComment__id__")]: [{ include: s("@expression_comment_token__id__") }], + // For <#noparse> ... + // For <#noParse> ... + // For <#comment> ... + [s("noParse__id__")]: [{ include: s("@no_parse_token__id__") }], + // For <#-- ... --> + [s("terseComment__id__")]: [{ include: s("@terse_comment_token__id__") }], + // Common rules + [s("directive_token__id__")]: [ + // "attempt" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "recover" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "sep" > + // "auto" ("e"|"E") "sc" > { + // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 4), DEFAULT); + // } + // "no" ("autoe"|"AutoE") "sc" > { + // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 2), DEFAULT); + // } + // "compress" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "default" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "no" ("e" | "E") "scape" > { + // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 2), DEFAULT); + // } + // + // "comment" > { + // handleTagSyntaxAndSwitch(matchedToken, NO_PARSE); noparseTag = "comment"; + // } + // "no" ("p" | "P") "arse" > { + // int tagNamingConvention = getTagNamingConvention(matchedToken, 2); + // handleTagSyntaxAndSwitch(matchedToken, tagNamingConvention, NO_PARSE); + // noparseTag = tagNamingConvention == Configuration.CAMEL_CASE_NAMING_CONVENTION ? "noParse" : "noparse"; + // } + [ + r(/(?:@startTag__id__)(@directiveStartCloseTag1)(?:@closeTag1__id__)/), + ts2.id === "auto" ? { + cases: { + "$1==<": { token: "@rematch", switchTo: `@default_angle_${is.id}` }, + "$1==[": { token: "@rematch", switchTo: `@default_bracket_${is.id}` } + } + } : [ + { token: "@brackets.directive" }, + { token: "delimiter.directive" }, + { + cases: { + "@noParseTags": { token: "tag", next: s("@noParse__id__.$3") }, + "@default": { token: "tag" } + } + }, + { token: "delimiter.directive" }, + { token: "@brackets.directive" } + ] + ], + // "else" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "break" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "continue" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "return" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "stop" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "flush" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "t" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "lt" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "rt" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "nt" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "nested" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "recurse" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "fallback" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // " | "]")> { ftlHeader(matchedToken); } + [ + r(/(?:@startTag__id__)(@directiveStartCloseTag2)(?:@closeTag2__id__)/), + ts2.id === "auto" ? { + cases: { + "$1==<": { token: "@rematch", switchTo: `@default_angle_${is.id}` }, + "$1==[": { token: "@rematch", switchTo: `@default_bracket_${is.id}` } + } + } : [ + { token: "@brackets.directive" }, + { token: "delimiter.directive" }, + { token: "tag" }, + { token: "delimiter.directive" }, + { token: "@brackets.directive" } + ] + ], + // "if" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "else" ("i" | "I") "f" > { + // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 4), FM_EXPRESSION); + // } + // "list" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "for" ("e" | "E") "ach" > { + // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 3), FM_EXPRESSION); + // } + // "switch" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "case" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "assign" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "global" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "local" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // <_INCLUDE : "include" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "import" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "function" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "macro" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "transform" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "visit" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "stop" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "return" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "call" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "setting" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "output" ("f"|"F") "ormat" > { + // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 6), FM_EXPRESSION); + // } + // "nested" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "recurse" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // "escape" > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + // + // Note: FreeMarker grammar appears to treat the FTL header as a special case, + // in order to remove new lines after the header (?), but since we only need + // to tokenize for highlighting, we can include this directive here. + // > { ftlHeader(matchedToken); } + // + // Note: FreeMarker grammar appears to treat the items directive as a special case for + // the AST parsing process, but since we only need to tokenize, we can include this + // directive here. + // "items" ()+ > { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); } + [ + r(/(?:@startTag__id__)(@directiveStartBlank)(@blank)/), + ts2.id === "auto" ? { + cases: { + "$1==<": { token: "@rematch", switchTo: `@default_angle_${is.id}` }, + "$1==[": { token: "@rematch", switchTo: `@default_bracket_${is.id}` } + } + } : [ + { token: "@brackets.directive" }, + { token: "delimiter.directive" }, + { token: "tag" }, + { token: "", next: s("@fmExpression__id__.directive") } + ] + ], + // "if" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "list" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "sep" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "recover" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "attempt" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "for" ("e" | "E") "ach" > { + // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 3), DEFAULT); + // } + // "local" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "global" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "assign" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "function" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "macro" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "output" ("f" | "F") "ormat" > { + // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 6), DEFAULT); + // } + // "auto" ("e" | "E") "sc" > { + // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 4), DEFAULT); + // } + // "no" ("autoe"|"AutoE") "sc" > { + // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 2), DEFAULT); + // } + // "compress" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "transform" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "switch" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "escape" > { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); } + // "no" ("e" | "E") "scape" > { + // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 2), DEFAULT); + // } + [ + r(/(?:@endTag__id__)(@directiveEndCloseTag1)(?:@closeTag1__id__)/), + ts2.id === "auto" ? { + cases: { + "$1==<": { token: "@rematch", switchTo: `@default_angle_${is.id}` }, + "$1==[": { token: "@rematch", switchTo: `@default_bracket_${is.id}` } + } + } : [ + { token: "@brackets.directive" }, + { token: "delimiter.directive" }, + { token: "tag" }, + { token: "delimiter.directive" }, + { token: "@brackets.directive" } + ] + ], + // { unifiedCall(matchedToken); } + [ + r(/(@open__id__)(@)/), + ts2.id === "auto" ? { + cases: { + "$1==<": { token: "@rematch", switchTo: `@default_angle_${is.id}` }, + "$1==[": { token: "@rematch", switchTo: `@default_bracket_${is.id}` } + } + } : [ + { token: "@brackets.directive" }, + { token: "delimiter.directive", next: s("@unifiedCall__id__") } + ] + ], + // ) (".")*)? > { unifiedCallEnd(matchedToken); } + [ + r(/(@open__id__)(\/@)((?:(?:@id)(?:\.(?:@id))*)?)(?:@closeTag1__id__)/), + [ + { token: "@brackets.directive" }, + { token: "delimiter.directive" }, + { token: "tag" }, + { token: "delimiter.directive" }, + { token: "@brackets.directive" } + ] + ], + // { noparseTag = "-->"; handleTagSyntaxAndSwitch(matchedToken, NO_PARSE); } + [ + r(/(@open__id__)#--/), + ts2.id === "auto" ? { + cases: { + "$1==<": { token: "@rematch", switchTo: `@default_angle_${is.id}` }, + "$1==[": { token: "@rematch", switchTo: `@default_bracket_${is.id}` } + } + } : { token: "comment", next: s("@terseComment__id__") } + ], + // + [ + r(/(?:@startOrEndTag__id__)([a-zA-Z_]+)/), + ts2.id === "auto" ? { + cases: { + "$1==<": { token: "@rematch", switchTo: `@default_angle_${is.id}` }, + "$1==[": { token: "@rematch", switchTo: `@default_bracket_${is.id}` } + } + } : [ + { token: "@brackets.directive" }, + { token: "delimiter.directive" }, + { token: "tag.invalid", next: s("@fmExpression__id__.directive") } + ] + ] + ], + // TOKEN : + [s("interpolation_and_text_token__id__")]: [ + // { startInterpolation(matchedToken); } + // // to handle a lone dollar sign or "<" or "# or <@ with whitespace after" + // + // + [/[\$#<\[\{]|(?:@blank)+|[^\$<#\[\{\n\r\t ]+/, { token: "source" }] + ], + // )* + // "\"" + // ) + // | + // ( + // "'" + // ((~["'", "\\"]) | )* + // "'" + // ) + // > + [s("string_single_token__id__")]: [ + [/[^'\\]/, { token: "string" }], + [/@escapedChar/, { token: "string.escape" }], + [/'/, { token: "string", next: "@pop" }] + ], + [s("string_double_token__id__")]: [ + [/[^"\\]/, { token: "string" }], + [/@escapedChar/, { token: "string.escape" }], + [/"/, { token: "string", next: "@pop" }] + ], + // + [s("string_single_raw_token__id__")]: [ + [/[^']+/, { token: "string.raw" }], + [/'/, { token: "string.raw", next: "@pop" }] + ], + [s("string_double_raw_token__id__")]: [ + [/[^"]+/, { token: "string.raw" }], + [/"/, { token: "string.raw", next: "@pop" }] + ], + // TOKEN : + [s("expression_token__id__")]: [ + // Strings + [ + /(r?)(['"])/, + { + cases: { + "r'": [ + { token: "keyword" }, + { token: "string.raw", next: s("@rawSingleString__id__") } + ], + 'r"': [ + { token: "keyword" }, + { token: "string.raw", next: s("@rawDoubleString__id__") } + ], + "'": [{ token: "source" }, { token: "string", next: s("@singleString__id__") }], + '"': [{ token: "source" }, { token: "string", next: s("@doubleString__id__") }] + } + } + ], + // Numbers + // + // "." > + [ + /(?:@integer)(?:\.(?:@integer))?/, + { + cases: { + "(?:@integer)": { token: "number" }, + "@default": { token: "number.float" } + } + } + ], + // Special hash keys that must not be treated as identifiers + // after a period, e.g. a.** is accessing the key "**" of a + [ + /(\.)(@blank*)(@specialHashKeys)/, + [{ token: "delimiter" }, { token: "" }, { token: "identifier" }] + ], + // Symbols / operators + [ + /(?:@namedSymbols)/, + { + cases: { + "@arrows": { token: "meta.arrow" }, + "@delimiters": { token: "delimiter" }, + "@default": { token: "operators" } + } + } + ], + // Identifiers + [ + /@id/, + { + cases: { + "@keywords": { token: "keyword.$0" }, + "@stringOperators": { token: "operators" }, + "@default": { token: "identifier" } + } + } + ], + // + // + // + // + // + // + [ + /[\[\]\(\)\{\}]/, + { + cases: { + "\\[": { + cases: { + "$S2==gt": { token: "@brackets", next: s("@inParen__id__.gt") }, + "@default": { token: "@brackets", next: s("@inParen__id__.plain") } + } + }, + "\\]": { + cases: __spreadProps(__spreadValues(__spreadValues({}, is.id === "bracket" ? { + "$S2==interpolation": { token: "@brackets.interpolation", next: "@popall" } + } : {}), ts2.id === "bracket" ? { + "$S2==directive": { token: "@brackets.directive", next: "@popall" } + } : {}), { + // Ignore mismatched paren + [s("$S1==inParen__id__")]: { token: "@brackets", next: "@pop" }, + "@default": { token: "@brackets" } + }) + }, + "\\(": { token: "@brackets", next: s("@inParen__id__.gt") }, + "\\)": { + cases: { + [s("$S1==inParen__id__")]: { token: "@brackets", next: "@pop" }, + "@default": { token: "@brackets" } + } + }, + "\\{": { + cases: { + "$S2==gt": { token: "@brackets", next: s("@inParen__id__.gt") }, + "@default": { token: "@brackets", next: s("@inParen__id__.plain") } + } + }, + "\\}": { + cases: __spreadProps(__spreadValues({}, is.id === "bracket" ? {} : { + "$S2==interpolation": { token: "@brackets.interpolation", next: "@popall" } + }), { + // Ignore mismatched paren + [s("$S1==inParen__id__")]: { token: "@brackets", next: "@pop" }, + "@default": { token: "@brackets" } + }) + } + } + } + ], + // SKIP : + [s("blank_and_expression_comment_token__id__")]: [ + // < ( " " | "\t" | "\n" | "\r" )+ > + [/(?:@blank)+/, { token: "" }], + // < ("<" | "[") ("#" | "!") "--"> : EXPRESSION_COMMENT + [/[<\[][#!]--/, { token: "comment", next: s("@expressionComment__id__") }] + ], + // TOKEN : + [s("directive_end_token__id__")]: [ + // "> + // { + // if (inFTLHeader) { + // eatNewline(); + // inFTLHeader = false; + // } + // if (squBracTagSyntax || postInterpolationLexState != -1 /* We are in an interpolation */) { + // matchedToken.kind = NATURAL_GT; + // } else { + // SwitchTo(DEFAULT); + // } + // } + // This cannot happen while in auto mode, since this applies only to an + // fmExpression inside a directive. But once we encounter the start of a + // directive, we can establish the tag syntax mode. + [ + />/, + ts2.id === "bracket" ? { token: "operators" } : { token: "@brackets.directive", next: "@popall" } + ], + // " | "/]"> + // It is a syntax error to end a tag with the wrong close token + // Let's indicate that to the user by not closing the tag + [ + r(/(\/)(@close__id__)/), + [{ token: "delimiter.directive" }, { token: "@brackets.directive", next: "@popall" }] + ] + ], + // TOKEN : + [s("greater_operators_token__id__")]: [ + // "> + [/>/, { token: "operators" }], + // ="> + [/>=/, { token: "operators" }] + ], + // TOKEN : + [s("no_space_expression_end_token__id__")]: [ + // : FM_EXPRESSION + [/(?:@blank)+/, { token: "", switchTo: s("@fmExpression__id__.directive") }] + ], + [s("unified_call_token__id__")]: [ + // Special case for a call where the expression is just an ID + // + + [ + /(@id)((?:@blank)+)/, + [{ token: "tag" }, { token: "", next: s("@fmExpression__id__.directive") }] + ], + [ + r(/(@id)(\/?)(@close__id__)/), + [ + { token: "tag" }, + { token: "delimiter.directive" }, + { token: "@brackets.directive", next: "@popall" } + ] + ], + [/./, { token: "@rematch", next: s("@noSpaceExpression__id__") }] + ], + // TOKEN : + [s("no_parse_token__id__")]: [ + // " | "]") + // > + [ + r(/(@open__id__)(\/#?)([a-zA-Z]+)((?:@blank)*)(@close__id__)/), + { + cases: { + "$S2==$3": [ + { token: "@brackets.directive" }, + { token: "delimiter.directive" }, + { token: "tag" }, + { token: "" }, + { token: "@brackets.directive", next: "@popall" } + ], + "$S2==comment": [ + { token: "comment" }, + { token: "comment" }, + { token: "comment" }, + { token: "comment" }, + { token: "comment" } + ], + "@default": [ + { token: "source" }, + { token: "source" }, + { token: "source" }, + { token: "source" }, + { token: "source" } + ] + } + } + ], + // + // + [ + /[^<\[\-]+|[<\[\-]/, + { + cases: { + "$S2==comment": { token: "comment" }, + "@default": { token: "source" } + } + } + ] + ], + // SKIP: + [s("expression_comment_token__id__")]: [ + // < "-->" | "--]"> + [ + /--[>\]]/, + { + token: "comment", + next: "@pop" + } + ], + // < (~["-", ">", "]"])+ > + // < ">"> + // < "]"> + // < "-"> + [/[^\->\]]+|[>\]\-]/, { token: "comment" }] + ], + [s("terse_comment_token__id__")]: [ + // " | "--]"> + [r(/--(?:@close__id__)/), { token: "comment", next: "@popall" }], + // + // + [/[^<\[\-]+|[<\[\-]/, { token: "comment" }] + ] + } + }; +} +function createMonarchLanguageAuto(is) { + const angle = createMonarchLanguage(TagSyntaxAngle, is); + const bracket = createMonarchLanguage(TagSyntaxBracket, is); + const auto = createMonarchLanguage(TagSyntaxAuto, is); + return __spreadProps(__spreadValues(__spreadValues(__spreadValues({}, angle), bracket), auto), { + // Settings + unicode: true, + includeLF: false, + start: `default_auto_${is.id}`, + ignoreCase: false, + defaultToken: "invalid", + tokenPostfix: `.freemarker2`, + brackets: [ + { open: "{", close: "}", token: "delimiter.curly" }, + { open: "[", close: "]", token: "delimiter.square" }, + { open: "(", close: ")", token: "delimiter.parenthesis" }, + { open: "<", close: ">", token: "delimiter.angle" } + ], + tokenizer: __spreadValues(__spreadValues(__spreadValues({}, angle.tokenizer), bracket.tokenizer), auto.tokenizer) + }); +} +var __defProp3, __getOwnPropDesc3, __getOwnPropNames3, __hasOwnProp3, __copyProps3, __reExport2, monaco_editor_core_exports2, EMPTY_ELEMENTS, BLOCK_ELEMENTS, TagSyntaxAngle, TagSyntaxBracket, TagSyntaxAuto, InterpolationSyntaxDollar, InterpolationSyntaxBracket, TagAngleInterpolationDollar, TagBracketInterpolationDollar, TagAngleInterpolationBracket, TagBracketInterpolationBracket, TagAutoInterpolationDollar, TagAutoInterpolationBracket; +var init_freemarker2 = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/freemarker2/freemarker2.js"() { + init_editor_api(); + __defProp3 = Object.defineProperty; + __getOwnPropDesc3 = Object.getOwnPropertyDescriptor; + __getOwnPropNames3 = Object.getOwnPropertyNames; + __hasOwnProp3 = Object.prototype.hasOwnProperty; + __copyProps3 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames3(from)) + if (!__hasOwnProp3.call(to, key) && key !== except) + __defProp3(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc3(from, key)) || desc.enumerable }); + } + return to; + }; + __reExport2 = (target, mod, secondTarget) => (__copyProps3(target, mod, "default"), secondTarget && __copyProps3(secondTarget, mod, "default")); + monaco_editor_core_exports2 = {}; + __reExport2(monaco_editor_core_exports2, editor_api_exports); + EMPTY_ELEMENTS = [ + "assign", + "flush", + "ftl", + "return", + "global", + "import", + "include", + "break", + "continue", + "local", + "nested", + "nt", + "setting", + "stop", + "t", + "lt", + "rt", + "fallback" + ]; + BLOCK_ELEMENTS = [ + "attempt", + "autoesc", + "autoEsc", + "compress", + "comment", + "escape", + "noescape", + "function", + "if", + "list", + "items", + "sep", + "macro", + "noparse", + "noParse", + "noautoesc", + "noAutoEsc", + "outputformat", + "switch", + "visit", + "recurse" + ]; + TagSyntaxAngle = { + close: ">", + id: "angle", + open: "<" + }; + TagSyntaxBracket = { + close: "\\]", + id: "bracket", + open: "\\[" + }; + TagSyntaxAuto = { + close: "[>\\]]", + id: "auto", + open: "[<\\[]" + }; + InterpolationSyntaxDollar = { + close: "\\}", + id: "dollar", + open1: "\\$", + open2: "\\{" + }; + InterpolationSyntaxBracket = { + close: "\\]", + id: "bracket", + open1: "\\[", + open2: "=" + }; + TagAngleInterpolationDollar = { + conf: createLangConfiguration(TagSyntaxAngle), + language: createMonarchLanguage(TagSyntaxAngle, InterpolationSyntaxDollar) + }; + TagBracketInterpolationDollar = { + conf: createLangConfiguration(TagSyntaxBracket), + language: createMonarchLanguage(TagSyntaxBracket, InterpolationSyntaxDollar) + }; + TagAngleInterpolationBracket = { + conf: createLangConfiguration(TagSyntaxAngle), + language: createMonarchLanguage(TagSyntaxAngle, InterpolationSyntaxBracket) + }; + TagBracketInterpolationBracket = { + conf: createLangConfiguration(TagSyntaxBracket), + language: createMonarchLanguage(TagSyntaxBracket, InterpolationSyntaxBracket) + }; + TagAutoInterpolationDollar = { + conf: createLangConfigurationAuto(), + language: createMonarchLanguageAuto(InterpolationSyntaxDollar) + }; + TagAutoInterpolationBracket = { + conf: createLangConfigurationAuto(), + language: createMonarchLanguageAuto(InterpolationSyntaxBracket) + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/go/go.js +var go_exports = {}; +__export(go_exports, { + conf: () => conf20, + language: () => language21 +}); +var conf20, language21; +var init_go = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/go/go.js"() { + conf20 = { + comments: { + lineComment: "//", + blockComment: ["/*", "*/"] + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "`", close: "`", notIn: ["string"] }, + { open: '"', close: '"', notIn: ["string"] }, + { open: "'", close: "'", notIn: ["string", "comment"] } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "`", close: "`" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ] + }; + language21 = { + defaultToken: "", + tokenPostfix: ".go", + keywords: [ + "break", + "case", + "chan", + "const", + "continue", + "default", + "defer", + "else", + "fallthrough", + "for", + "func", + "go", + "goto", + "if", + "import", + "interface", + "map", + "package", + "range", + "return", + "select", + "struct", + "switch", + "type", + "var", + "bool", + "true", + "false", + "uint8", + "uint16", + "uint32", + "uint64", + "int8", + "int16", + "int32", + "int64", + "float32", + "float64", + "complex64", + "complex128", + "byte", + "rune", + "uint", + "int", + "uintptr", + "string", + "nil" + ], + operators: [ + "+", + "-", + "*", + "/", + "%", + "&", + "|", + "^", + "<<", + ">>", + "&^", + "+=", + "-=", + "*=", + "/=", + "%=", + "&=", + "|=", + "^=", + "<<=", + ">>=", + "&^=", + "&&", + "||", + "<-", + "++", + "--", + "==", + "<", + ">", + "=", + "!", + "!=", + "<=", + ">=", + ":=", + "...", + "(", + ")", + "", + "]", + "{", + "}", + ",", + ";", + ".", + ":" + ], + // we include these common regular expressions + symbols: /[=>](?!@symbols)/, "@brackets"], + [ + /@symbols/, + { + cases: { + "@operators": "delimiter", + "@default": "" + } + } + ], + // numbers + [/\d*\d+[eE]([\-+]?\d+)?/, "number.float"], + [/\d*\.\d+([eE][\-+]?\d+)?/, "number.float"], + [/0[xX][0-9a-fA-F']*[0-9a-fA-F]/, "number.hex"], + [/0[0-7']*[0-7]/, "number.octal"], + [/0[bB][0-1']*[0-1]/, "number.binary"], + [/\d[\d']*/, "number"], + [/\d/, "number"], + // delimiter: after number because of .\d floats + [/[;,.]/, "delimiter"], + // strings + [/"([^"\\]|\\.)*$/, "string.invalid"], + // non-teminated string + [/"/, "string", "@string"], + [/`/, "string", "@rawstring"], + // characters + [/'[^\\']'/, "string"], + [/(')(@escapes)(')/, ["string", "string.escape", "string"]], + [/'/, "string.invalid"] + ], + whitespace: [ + [/[ \t\r\n]+/, ""], + [/\/\*\*(?!\/)/, "comment.doc", "@doccomment"], + [/\/\*/, "comment", "@comment"], + [/\/\/.*$/, "comment"] + ], + comment: [ + [/[^\/*]+/, "comment"], + // [/\/\*/, 'comment', '@push' ], // nested comment not allowed :-( + // [/\/\*/, 'comment.invalid' ], // this breaks block comments in the shape of /* //*/ + [/\*\//, "comment", "@pop"], + [/[\/*]/, "comment"] + ], + //Identical copy of comment above, except for the addition of .doc + doccomment: [ + [/[^\/*]+/, "comment.doc"], + // [/\/\*/, 'comment.doc', '@push' ], // nested comment not allowed :-( + [/\/\*/, "comment.doc.invalid"], + [/\*\//, "comment.doc", "@pop"], + [/[\/*]/, "comment.doc"] + ], + string: [ + [/[^\\"]+/, "string"], + [/@escapes/, "string.escape"], + [/\\./, "string.escape.invalid"], + [/"/, "string", "@pop"] + ], + rawstring: [ + [/[^\`]/, "string"], + [/`/, "string", "@pop"] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/graphql/graphql.js +var graphql_exports = {}; +__export(graphql_exports, { + conf: () => conf21, + language: () => language22 +}); +var conf21, language22; +var init_graphql = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/graphql/graphql.js"() { + conf21 = { + comments: { + lineComment: "#" + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"""', close: '"""', notIn: ["string", "comment"] }, + { open: '"', close: '"', notIn: ["string", "comment"] } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"""', close: '"""' }, + { open: '"', close: '"' } + ], + folding: { + offSide: true + } + }; + language22 = { + // Set defaultToken to invalid to see what you do not tokenize yet + defaultToken: "invalid", + tokenPostfix: ".gql", + keywords: [ + "null", + "true", + "false", + "query", + "mutation", + "subscription", + "extend", + "schema", + "directive", + "scalar", + "type", + "interface", + "union", + "enum", + "input", + "implements", + "fragment", + "on" + ], + typeKeywords: ["Int", "Float", "String", "Boolean", "ID"], + directiveLocations: [ + "SCHEMA", + "SCALAR", + "OBJECT", + "FIELD_DEFINITION", + "ARGUMENT_DEFINITION", + "INTERFACE", + "UNION", + "ENUM", + "ENUM_VALUE", + "INPUT_OBJECT", + "INPUT_FIELD_DEFINITION", + "QUERY", + "MUTATION", + "SUBSCRIPTION", + "FIELD", + "FRAGMENT_DEFINITION", + "FRAGMENT_SPREAD", + "INLINE_FRAGMENT", + "VARIABLE_DEFINITION" + ], + operators: ["=", "!", "?", ":", "&", "|"], + // we include these common regular expressions + symbols: /[=!?:&|]+/, + // https://facebook.github.io/graphql/draft/#sec-String-Value + escapes: /\\(?:["\\\/bfnrt]|u[0-9A-Fa-f]{4})/, + // The main tokenizer for our languages + tokenizer: { + root: [ + // fields and argument names + [ + /[a-z_][\w$]*/, + { + cases: { + "@keywords": "keyword", + "@default": "key.identifier" + } + } + ], + // identify typed input variables + [ + /[$][\w$]*/, + { + cases: { + "@keywords": "keyword", + "@default": "argument.identifier" + } + } + ], + // to show class names nicely + [ + /[A-Z][\w\$]*/, + { + cases: { + "@typeKeywords": "keyword", + "@default": "type.identifier" + } + } + ], + // whitespace + { include: "@whitespace" }, + // delimiters and operators + [/[{}()\[\]]/, "@brackets"], + [/@symbols/, { cases: { "@operators": "operator", "@default": "" } }], + // @ annotations. + // As an example, we emit a debugging log message on these tokens. + // Note: message are supressed during the first load -- change some lines to see them. + [/@\s*[a-zA-Z_\$][\w\$]*/, { token: "annotation", log: "annotation token: $0" }], + // numbers + [/\d*\.\d+([eE][\-+]?\d+)?/, "number.float"], + [/0[xX][0-9a-fA-F]+/, "number.hex"], + [/\d+/, "number"], + // delimiter: after number because of .\d floats + [/[;,.]/, "delimiter"], + [/"""/, { token: "string", next: "@mlstring", nextEmbedded: "markdown" }], + // strings + [/"([^"\\]|\\.)*$/, "string.invalid"], + // non-teminated string + [/"/, { token: "string.quote", bracket: "@open", next: "@string" }] + ], + mlstring: [ + [/[^"]+/, "string"], + ['"""', { token: "string", next: "@pop", nextEmbedded: "@pop" }] + ], + string: [ + [/[^\\"]+/, "string"], + [/@escapes/, "string.escape"], + [/\\./, "string.escape.invalid"], + [/"/, { token: "string.quote", bracket: "@close", next: "@pop" }] + ], + whitespace: [ + [/[ \t\r\n]+/, ""], + [/#.*$/, "comment"] + ] + } + }; + } +}); + +// node_modules/monaco-editor/esm/vs/basic-languages/handlebars/handlebars.js +var handlebars_exports = {}; +__export(handlebars_exports, { + conf: () => conf22, + language: () => language23 +}); +var __defProp4, __getOwnPropDesc4, __getOwnPropNames4, __hasOwnProp4, __copyProps4, __reExport3, monaco_editor_core_exports3, EMPTY_ELEMENTS2, conf22, language23; +var init_handlebars = __esm({ + "node_modules/monaco-editor/esm/vs/basic-languages/handlebars/handlebars.js"() { + init_editor_api(); + __defProp4 = Object.defineProperty; + __getOwnPropDesc4 = Object.getOwnPropertyDescriptor; + __getOwnPropNames4 = Object.getOwnPropertyNames; + __hasOwnProp4 = Object.prototype.hasOwnProperty; + __copyProps4 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames4(from)) + if (!__hasOwnProp4.call(to, key) && key !== except) + __defProp4(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc4(from, key)) || desc.enumerable }); + } + return to; + }; + __reExport3 = (target, mod, secondTarget) => (__copyProps4(target, mod, "default"), secondTarget && __copyProps4(secondTarget, mod, "default")); + monaco_editor_core_exports3 = {}; + __reExport3(monaco_editor_core_exports3, editor_api_exports); + EMPTY_ELEMENTS2 = [ + "area", + "base", + "br", + "col", + "embed", + "hr", + "img", + "input", + "keygen", + "link", + "menuitem", + "meta", + "param", + "source", + "track", + "wbr" + ]; + conf22 = { + wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g, + comments: { + blockComment: ["{{!--", "--}}"] + }, + brackets: [ + [""], + ["<", ">"], + ["{{", "}}"], + ["{", "}"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ], + surroundingPairs: [ + { open: "<", close: ">" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ], + onEnterRules: [ + { + beforeText: new RegExp( + `<(?!(?:${EMPTY_ELEMENTS2.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`, + "i" + ), + afterText: /^<\/(\w[\w\d]*)\s*>$/i, + action: { + indentAction: monaco_editor_core_exports3.languages.IndentAction.IndentOutdent + } + }, + { + beforeText: new RegExp( + `<(?!(?:${EMPTY_ELEMENTS2.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`, + "i" + ), + action: { indentAction: monaco_editor_core_exports3.languages.IndentAction.Indent } + } + ] + }; + language23 = { + defaultToken: "", + tokenPostfix: "", + // ignoreCase: true, + // The main tokenizer for our languages + tokenizer: { + root: [ + [/\{\{!--/, "comment.block.start.handlebars", "@commentBlock"], + [/\{\{!/, "comment.start.handlebars", "@comment"], + [/\{\{/, { token: "@rematch", switchTo: "@handlebarsInSimpleState.root" }], + [/)/, ["delimiter.html", "tag.html", "delimiter.html"]], + [/(<)(script)/, ["delimiter.html", { token: "tag.html", next: "@script" }]], + [/(<)(style)/, ["delimiter.html", { token: "tag.html", next: "@style" }]], + [/(<)([:\w]+)/, ["delimiter.html", { token: "tag.html", next: "@otherTag" }]], + [/(<\/)(\w+)/, ["delimiter.html", { token: "tag.html", next: "@otherTag" }]], + [/]+/, "metatag.content.html"], + [/>/, "metatag.html", "@pop"] + ], + comment: [ + [/\}\}/, "comment.end.handlebars", "@pop"], + [/./, "comment.content.handlebars"] + ], + commentBlock: [ + [/--\}\}/, "comment.block.end.handlebars", "@pop"], + [/./, "comment.content.handlebars"] + ], + commentHtml: [ + [ + /\{\{/, + { + token: "@rematch", + switchTo: "@handlebarsInSimpleState.comment" + } + ], + [/-->/, "comment.html", "@pop"], + [/[^-]+/, "comment.content.html"], + [/./, "comment.content.html"] + ], + otherTag: [ + [ + /\{\{/, + { + token: "@rematch", + switchTo: "@handlebarsInSimpleState.otherTag" + } + ], + [/\/?>/, "delimiter.html", "@pop"], + [/"([^"]*)"/, "attribute.value"], + [/'([^']*)'/, "attribute.value"], + [/[\w\-]+/, "attribute.name"], + [/=/, "delimiter"], + [/[ \t\r\n]+/] + // whitespace + ], + // -- BEGIN