Announcing Microsoft Ajax Library (Preview 6) and the Microsoft Ajax Minifier

微软发布了 Microsoft AJAX 库的重要更新,包括更简洁的代码语法、客户端脚本加载器及增强的 jQuery 集成等功能。此外还推出了 Microsoft AJAX 压缩工具,有助于大幅减小 JavaScript 文件大小,提升网站性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

The ASP.NET team today released a significant new update of the Microsoft Ajax Library (Preview 6).  This update includes a bunch of new capabilities and improvements to our client-side AJAX library, and can be used with any version of ASP.NET (including ASP.NET 2.0, 3.5 and 4.0), and can be used in both ASP.NET Web Forms and ASP.NET MVC projects.  Today’s release includes the following feature improvements:

  • Better Imperative Syntax: A new, simplified, code syntax for creating client controls.
  • Client Script Loader: A new client-side script loader that can dynamically load all of the JavaScript files required by a client control or library automatically, and executes the scripts in the right order.
  • Better jQuery Integration: All Microsoft Ajax controls are now automatically exposed as jQuery plug-ins.

In addition to the client library improvements, we also today released a new (free) Microsoft AJAX Minifier tool.  This tool allows you to substantially improve the performance of your websites by reducing the size of your JavaScript files.  It can be run both as a command-line tool, and also ships as a Visual Studio MSBuild task that you can integrate into your VS projects to automatically minify your JavaScript files whenever you do a build.

Using the Microsoft AJAX Library (Preview 6)

There are two ways that you can start building applications with the Microsoft Ajax (Preview 6) release:

1) You can visit the ASP.NET CodePlex website and download the Preview 6 release (which also includes a large set of samples with it).

2) Alternatively, you can access the Microsoft Ajax Library scripts directly from the Microsoft Ajax Content Delivery Network (CDN).  You can do this by just adding the following script tag to either an .aspx or .html page:

        <script src=”http://ajax.microsoft.com/ajax/beta/0910/Start.js” type=”text/javascript”></script>

You read my blog post from last month to learn more about the Microsoft AJAX CDN (or visit http://www.asp.net/ajax/cdn).

Better Imperative Code Syntax with this release

The ASP.NET team heard feedback from the community that many developers preferred an imperative code approach (as opposed to a declarative syntax approach) when creating client controls. With today’s release we are introducing a simple imperative code syntax for creating client controls and binding them to HTML elements within a page. This syntax is fully supported by the JavaScript Intellisense in both VS 2008 and VS 2010.

Below is an example of the imperative code you can now write to programmatically create a client-side DataView control that displays data from a WCF web service:

image

The above code instantiates a new Microsoft Ajax DataView control and attaches the control to an HTML <div> element with the id “imageView”. The URL of the WCF service is specified with the “dataProvider” property, and the name of the method to call on the service is specified with the “fetchOperation” property.  The “autoFetch” property indicates that the control should automatically bind against the WCF service when it loads.

Below is what the “imageView” HTML <div> element that the DataView control is attached to looks like.  This <div> contains a template that will be used for displaying each data item retrieved from the service (note: templates were a feature we introduced with an earlier Microsoft Ajax Preview release):

image

The {{ Uri }} and {{ Name }} expressions within the template above are replaced with the Name and Uri properties of the images retrieved from the service.  The attribute namespace prefix “sys:src” on the <img> element is used to prevent browsers from attempting to load an image at the actual path {Uri}. The value of the sys:src attribute gets plugged into the src attribute when the template is loaded.

When the page is rendered in the browser, we then get a simple photo gallery like below:

image

 

Alternatively, if you don’t want to use a declarative binding syntax within a template, you can modify the template to be pure HTML markup like below (no more {{ }} expressions):

image

You can then wire-up and specify a itemRendered event handler when you create the DataView control like below:

image

 

You can then implement the “imageRendered” event handler using the JavaScript below, and use the Sys.bind() method to programmatically assign values to the <img> and <span> tags within the template:

image

This allows you to maintain your template as pure HTML markup, while still displaying the same photo gallery experience at runtime.

Using the Microsoft Ajax Client Script Loader

The Microsoft AJAX Client-side library is now split up across multiple JavaScript files – allowing you to download and use only those script files that you actually need (reducing download sizes). 

Manually adding all of the script files required to use Ajax controls can be tedious though (and error prone). To make it easier to use both client controls as well individual client library components, we are introducing a new client script loader with today’s release. This client script loader helps you automatically load all of the scripts required by a control and execute the scripts in the right order when a page loads.

For example, the following page uses the client script loader to load all of the scripts required by the “watermark” control, and then wires up the watermark control to an <input> textbox:

image

Notice the call to the Sys.require() method above. When you call Sys.require(), you supply the name of a client component (or an array of client components) that you want to load. The sys.require() client loader then automatically downloads all of the required script files in parallel (allowing your scripts to load faster and also allow you to avoid blocking the page from rendering).  When all of the scripts required by the components requested are loaded, the Sys.onReady() method is called and the watermark is created.

Above we are binding the “watermark” control to a <input> textbox with an id of “name”.  At runtime the watermark control will cause the textbox to have a watermark (that automatically disappears when a user sets the focus on the textbox and starts typing):

clip_image006

The client script loader supports many advanced features including automatic script combining and lazy loading. It can also be smart about downloading either debug or release versions of libraries. It also allows you to register your own libraries and have them automatically be loaded as well using the Sys.require() syntax.

Using Microsoft Ajax Library Controls with jQuery

Microsoft ships jQuery as a standard part of the ASP.NET MVC framework, and also adds it by default to new ASP.NET Web Forms projects created with Visual Studio 2010.

With today’s preview we are making it easy to integrate jQuery and Microsoft Ajax controls, and enable developers using jQuery to use the Microsoft Ajax controls with a familiar jQuery plug-in API syntax.  Specifically, we are now exposing all Microsoft Ajax controls as jQuery plug-ins automatically. In other words, when you add jQuery to a page, you can use Microsoft Ajax controls just like jQuery plug-ins.

For example, the following script demonstrates how you can use jQuery to create a DataView that displays data from a WCF service (using a jQuery plugin like code syntax):

image

Notice above that I’m loading jQuery by calling the Sys.require() client-side loader API. You can load jQuery using the new client script loader, or alternatively you can just include the jQuery library in the page using a standard <script> tag.

Once jQuery is added to the page, Microsoft Ajax Library controls are automatically exposed as jQuery plug-ins.  This means you can create and attach Microsoft Ajax controls using a standard jQuery plugin syntax (like above), and fully integrate with the jQuery selector syntax.

Reducing the Size of JavaScript Files with the Microsoft Ajax Minifier

There are two common ways that people use to reduce the download size of a JavaScript file: compression and minification.

When you host your website on a Windows Server using IIS 7.0, you can configure IIS to automatically compress your JavaScript files using GZIP compression – which can provide a significant improvement on performance and the download size of files. However, you can get additional performance benefits by both compressing and minifying your JavaScript files. Steve Sounders describes these additional benefits in his excellent book High Performance Web Sites.

In addition to releasing Microsoft Ajax Library (Preview 6), we are today also releasing a new (free) Microsoft Ajax Minifier utility that can help reduce the size of your JavaScript files considerably.  It was created by Ron Logon who works on the MSN team. You can download the Microsoft Ajax Minifier from the ASP.NET CodePlex website for free. 

The following screenshot demonstrates the results of minifying the standard jQuery library using various minification tools such as Douglas Crockford’s JSMin, Dean Edward’s Packer, and the YUI Compressor. The bottom two files were minified using the Microsoft Ajax Minifier utility. Notice that the Microsoft Ajax Minifier has reduced jQuery from 125 KB to only 53 KB.

image

The Microsoft Ajax Minifier supports two levels of minification: normal and hypercrunched. When you use normal minification, the Microsoft Ajax Minifier removes all unnecessary whitespace, comments, curly braces, and semi-colons.  When you enable hypercrunching, the Microsoft Ajax Minifier becomes more aggressive in reducing the size of a JavaScript file, and it minifies local variable names and removes unreachable code.

Here’s a sample of a JavaScript file:

image

Here’s what the JavaScript file looks like after it has been minified with the Microsoft Ajax Minifier (with hypercrunching enabled):

image

Notice that all unnecessary whitespace has been removed. Notice also that the function parameters firstValue and secondValue have been renamed to b and a.

The Microsoft Ajax Minifier download includes the following components:

  • ajaxmin.exe – A command-line tool for minifying JavaScript files.
  • ajaxmintask.dll – A MSBuild task for minifying JavaScript files in a Visual Studio project.
  • ajaxmin.dll – A component that you can use in your C# or VB.NET applications to minify JavaScript files.

After you install the Microsoft Ajax Minifier, you can use the Microsoft Ajax Minifier command-line tool to minify a JavaScript file from a command-prompt. 

You also have the option of adding the Microsoft Ajax Minifier as a custom MSBuild task to Visual Studio. Adding the Microsoft Ajax Minifier MSBuild task to your Visual Studio project file allows you to automatically minify all of the JavaScript files in your project whenever you perform a build, and enables you to perform minification in an automated way.

Summary

Today’s release of the Microsoft Ajax Library has several exciting new features for client-side developers. The new simplified imperative syntax should appeal to JavaScript developers. The client script loader makes it much easier to create client controls and optimize the download of files. And, the jQuery integration enables developers using jQuery to take advantage of the client controls, templating, and data access features of the Microsoft Ajax Library without changing their programming style.

Finally, the new Microsoft Ajax Minifier enables you to significantly improve the performance of your Ajax applications by reducing the size of your JavaScript files. You can use the minifier from a command prompt or you can use the minifier when building a project in Visual Studio.

Read Bertrand Le Roy’s Blog Post about Preview 6 to learn even more about the release.  Click here to download both the Microsoft Ajax Library (Preview 6) release and the new Microsoft Ajax Minifier release. 

Hope this helps,

Scott

P.S. In addition to blogging, I have recently been using Twitter to-do quick posts and share links. You can follow me on Twitter at: www.twitter.com/scottgu(@scottgu is my twitter name)

### ModelScope Library Installation Guide To install the ModelScope library, one can use Python's package installer `pip`. The command required to set up the ModelScope environment involves installing two primary libraries: **modelscope** and **transformers_stream_generator**, which are essential components for leveraging advanced model functionalities[^1]. Below is a detailed explanation along with an example of how this process works. The following commands should be executed within your terminal or command prompt: ```bash pip install modelscope pip install transformers_stream_generator ``` These lines ensure that both necessary packages are installed on your system. Once these installations complete successfully, you will have access to all features provided by the ModelScope framework as well as support from the transformer streaming generator toolset. Additionally, after setting up locally through installation steps mentioned above, users may interact directly via web interface at URL specified when launching service instance such as opening browser tab pointed towards address like so - http://localhost:40061/?__theme=dark where default language processing engine being utilized would likely include something powerful akin GPT series versions e.g., gpt-3.5-turbo serving responses based upon queries submitted into input field present thereon page layout design structure format appearance theme customization options available too depending configurations settings applied during deployment phase execution cycle operation sequence procedure methodology approach strategy tactic plan action movement step forward progression advancement development growth expansion extension augmentation enhancement enrichment improvement optimization maximization minimization reduction elimination removal clearance cleaning cleansing purification clarification simplification abbreviation shortening contraction shrinking compression condensation distillation essence extraction core identification focus targeting pinpointing localization specification particularity individuality uniqueness singularity distinctiveness differentiation distinction separation division partition segmentation categorization classification labeling tagging marking annotation documentation recording preservation conservation retention maintenance sustenance nourishment feeding nurturing cultivation education training exercise practice repetition reinforcement strengthening empowerment enabling facilitation assistance help aid relief alleviation mitigation easement comfort soothing calming tranquilizing pacifying appeasing conciliating harmonizing unifying integrating consolidating combining merging blending mixing synthesizing fusion combination merger integration consolidation aggregation collection gathering accumulation hoarding stockpiling warehousing storage reservation booking appointment scheduling arrangement organization structuring formatting styling designing creating producing manufacturing generating yielding providing supplying delivering transmitting communicating conveying expressing articulating stating declaring announcing proclaiming broadcasting spreading disseminating distributing circulating promoting marketing advertising publicizing showcasing exhibiting demonstrating illustrating exemplifying representing symbolizing embodying personifying incarnating materializing realizing actualizing manifesting appearing emerging arising occurring happening taking place unfolding developing evolving transforming changing modifying altering adjusting regulating controlling governing ruling commanding ordering directing guiding leading steering navigating piloting driving pushing pulling dragging hauling lifting raising elevating boosting enhancing upgrading improving optimizing maximizing minimizing reducing eliminating removing clearing cleaning clarifying simplifying abbreviating shortening contracting shrinking compressing condensing distilling extracting identifying focusing targeting pin-pointing localizing specifying distinguishing differentiating separating dividing partitioning segmenting categorizing classifying labeling tagging marking annotating documenting recording preserving conserving retaining maintaining sustaining nourishing feeding nurturing cultivating educating training exercising practicing repeating reinforcing strengthening empowering enabling facilitating assisting helping aiding relieving alleviating mitigating easing comforting soothing calming tranquilizing pacifying appeasing conciliating harmonizing unifying integrating consolidating combining merging blending mixing synthesizing etcetera et cetera ect ect.[^2] #### Example Code Block Demonstrating Usage After Setup Completion: Below demonstrates querying about location information using natural language understanding capabilities powered possibly even enhanced further thanks partly due contributions made possible only because successful completion earlier described setup procedures involving specific software dependencies previously outlined clearly defined terms conditions specifications requirements standards guidelines rules regulations laws policies principles theories concepts ideas thoughts notions assumptions hypotheses predictions forecasts estimations approximations calculations computations operations processes methods techniques tools technologies innovations inventions discoveries explorations investigations researches studies analyses syntheses evaluations assessments judgments decisions conclusions recommendations suggestions proposals plans actions movements steps progressions advancements developments growths expansions extensions augmentations enhancements enrichments improvements optimizations maximizations minimizations reductions eliminations removals clearances cleansings purifications clarifications simplifications abbreviations shortenings contractions shrinkages compressions condensations distillations extractions identifications focuses targets pins points locations specifications distinctions differences separations divisions partitions segments categories classifications labels tags marks annotations documents records preservations conservations retentions maintenances sustainabilities nourishments feedings nurtures cultivates educates trains exercises practices repeats reinforces strengthens empowers enables facilitates assists helps aids relieves alleviates mitigates eases comforts soothes calms tranquilizes pacifies appeases conciliates harmonizes unifies integrates consolidates combines merges blends mixes synthesizes fusions combinations mergers integrations consolidations aggregations collections gatherings accumulations hordings stockpilings warehousings storages reservations bookings appointments schedulings arrangements organizations structures formats styles designs creations productions manufactures generations yields provisions supplies deliveries transmissions communications conveyances expressions articulations statements declarations announcements proclamations broadcasts spreads dissemintations distributions circulations promotions marketings advertisements publicizings showcasings exhibitions demonstrations illustrations examples representations symbols embodiments personifications incarnations materializations realizations actualizations manifestations appearances emergences arisings occurrences happenings takings places unfoldings developements evolutions transformations changes modifications alterations adjustments regulations controls governances rulings commands orders directions guidances leadings steerings navigatings pilotings drivings pushings pullings draggings haulings lifttings raisings elevatings boostings enhancings upgradeings improvings optimizings maximizeings minimizeings reduceings eliminateings removeings clearings cleanings clarifys simplicatings abbreviatings shortenings contractings shrinkings comprssings condenseings distills extractings identifies focussings targetings pinpoints locatins specifies distinguishes differenciates separates divides partitons segmets catgorize clasify label tag mark annotate document record preserve conserve retain maintain sustains nours feeds nurture cultivate educate train exercice practice repeat reinforce strengthen empower enable facilitate assist help aid relieve alleviate mitigate ease comfort soothe calm tranquillze pacify appease conciliate harmonize unify integrate consolidate combine merge blend mix synthesize fuse combin merg integ consol aggr coll gather accumul hor stoc pila warehou store reserv book appoint sched arrang organ struc form styl des creat produc manufact gener yield provi suppl deliver transmitt communic conve express art state decl announc procla broadca sprea dissim distribu circula promot market advert publi showc exhib demonstr illustr exampl repres symb embodi personn incarn mater realiz actu manifes appear emer arise occurr happen take plac unfold devel evolve transform chang modifi alter adjust regul control gover rule comm ord direct guid le ste nav pi dri pus pul dr ha lif rai ele boo en enhance upg imp opt max min red el rem cle cle cl sim abbr sho con shr com con dis ex id fo ta po lo se di pa se ca cla la ta ma do re pr co co re bo ap ap co co un in co co ag co ga ac ho wa st re bo sc ar or st de cr pr ma ge yi pr su de de tr ch mo al ad re co go ru co co or di gu le st ne sy fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu fu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值