WordPress.org

Plugin Directory

Test out the new Plugin Directory and let us know what you think.

Ad Inserter

Insert any ad or HTML/Javascript/PHP code into WordPress. Perfect for all kinds of ads. 16 code blocks, many display options and features.

A simple yet powerful plugin to insert any ad or code into WordPress. Perfect for all kinds of ads. Simply enter any ad or HTML/Javascript/PHP code and select where and how you want to display it.

Ad Inserter supports up to 16 code blocks. Code block is any code (for example AdSense ad) that has to be inserted (displayed) at some position. Each code block can be configured to insert code at almost any position supported by WordPress.

Features

  • 16 code blocks
  • Syntax highlighting editor
  • Code preview with visual CSS editor
  • Automatic positions: before/after post, content, paragraph or excerpt
  • Manual positions: widgets, shortcodes, PHP function call
  • Block alignment and style: left, center, right, float left, float right, custom CSS, no wrapping (leaves ad code as it is, otherwise it is wrapped by a div)
  • Clearance options to avoid insertion near images or headers
  • PHP code processing
  • Server-side and client-side device detection (3 custom viewports)
  • Black/White-list categories, tags, post IDs, urls, url parameters, referers
  • Simple troubleshooting with many debugging functions to visualize inserted code blocks, available insertion positions, HTML tags, etc.

Check Ad Inserter page for detailed description of all the features.

And there is also Ad Inserter Pro if you need more than 16 code blocks, more than 3 viewports, export/import settings or additional multisite options.

Quick Start

Few very important things you need to know in order to insert code and display some ad:

  • Enable and use at least one display option (Automatic Display, Widget, Shortcode, PHP function call)
  • Enable display on at least one WordPress page type (Posts, Static pages, Homepage, Category pages, Search Pages, Archive pages)
  • For Posts and static pages select default value On all Posts / On all Static pages unless you really know what are you doing
  • If you don't see inserted code block turn on debuging functions: Label inserted blocks, Show available positions for automatic display (Ad Inserter menu item in the WordPress toolbar on the top of every post/page)

Few typical settings are described on the FAQ page. Please make sure you have also read WARNINGS on the bottom of this page and instructions for Debugging.

Settings

Each code block has 4 display options:

  • Automatic Display
  • Widget
  • Shortcode
  • PHP function call

Normally for each code block you use only one display option. Of course, you can use all 4 options simultaneously taking into account that all display options use the same block settings (with some exceptions mentioned below).

To rename code block click on the block name. To display code block (ad) at some position you need to enable and use at least one display option.

Automatic Display Options:

  • Display Before Post (before post or posts on blog pages, previously named Before Title)
  • Display Before Content (before post or static page text)
  • Display Before Paragraph (on posts, static pages and blog pages)
  • Display After Paragraph (on posts, static pages and blog pages)
  • Display After Content (after post or static page text)
  • Display After Post (after post or posts on blog pages)
  • Display Before Excerpt (on blog pages)
  • Display After Excerpt (on blog pages)

For single posts or static pages display position Before Post usually means position above the post/page title, for blog pages Before Post position means position above all the posts on the blog page.

For single posts or static pages display position After Post means position below the post/page after all the content, for blog pages After Post position means position below all the posts on the blog page.

Order of display positions in a typical post is the following:

  • [Before Post]
  • Post Title
  • [Before Content]
  • Paragraph 1
  • Paragraph 2
  • Paragraph ...
  • Paragraph n - 1
  • Paragraph n
  • [After Content]
  • Comments
  • Output of some other plugins
  • [After Post]

Of course, the final order of items depends also on other plugins. Ad Inserter is by default called as one of the last plugins. You can change Plugin priority on the settings page (tab *).

Please use Show positions function to see available positions for automatic display (Ad Inserter menu item in the WordPress toolbar on the top of every post/page).

Block Alignment and Style:

  • No Wrapping (leaves ad code as it is, otherwise it is wrapped by a div)
  • Custom CSS (You can enter custom CSS code for wrapping div)
  • None (simple div with thin margin)
  • Align Left
  • Align Right
  • Center
  • Float Left (ad on left with wrapped text on right)
  • Float Right (ad on right with wrapped text on left)

[ Preview ]

Ad Inserter has a very useful function that can help you to check if the ad code is working and to see how it will look like when it will be inserted. Click on the Preview button to open Preview window. WARNING: Some adblockers may block code on the Ad Inserter preview window. If you see warning PAGE BLOCKED or you don't see your code and the widow elements are distorted, make sure you have disabled ad blockers. On the top of the window there is visual CSS editor and four buttons and below there is CSS code of the wrapping div (which can be edited manually) and 'Block Alignment and Style' selection.

Below the settings there is a preview of the saved code between two dummy paragraphs. Here you can test various block alignments, visually edit margin and padding values of the wrapping div or write CSS code directly and watch live preview. Highlight button highlights background, wrapping div margin and code area, while Reset button restores all the values to those of the current block. You can resize the window (and refresh the page to reload ads) to check display with different screen widths. Once you are satisfied with alignment click on the Use button and the settings will be copied to the active block.

Please note that the code displayed here is the code that is saved for this block, while block name, alignment and style are taken from the current block settings (may not be saved). No Wrapping style inserts the code as it is so margin and padding can't be set. However, you can use own HTML code for the block.

Please note that Preview window uses also Header and Footer code.

Check screenshots for explanation on alignment.

PLEASE NOTE: If you are using No Wrapping style and need to hide code on some devices using client-side detection (CSS Media Queries) then you need to add appropriate class to your CSS code (ai-viewport-1, ai-viewport-2, ai-viewport-3). This doesn't apply to widgets as they always contain a wrapping div.

For all display positions you can also define WordPress page types where the ads can be displayed. PLEASE NOTE: Regardles of other settings you need to enable display on AT LEAST ONE PAGE TYPE:

Single pages:

  • Posts
  • Static pages

Blog pages:

  • Homepage
  • Category pages
  • Search Pages
  • Tag / Archive pages

Insertion (located in the Misc section) is possible also for:

  • 404 page (Error 404: Page not found)
  • Feed

Please Note For shortcodes and PHP function calls it is possible to ignore enabled page types and use them on any page. See down for details.

You can also disable ads on certain posts or static pages. For each code block on posts or static pages you first define default display settings for posts/pages page type. Then you can define post/page exceptions on the post/page editor page (check Ad Inserter Exceptions meta box below). Exceptions work only on page/post content (positions Before Content, Before Paragraph, After Paragraph, After Content). For one or few exceptions it is easier to first enable ads on All Posts/Static pages page types and then either white or black-list single url or few space-separated urls (click on the Lists button).

PARAGRAPHS

Paragraph number for Automatic Display options Before and After Paragraph:

  • 0 means random paragraph position
  • value between 0 and 1 means relative position in post or page (e.g. 0.3 means paragraph 30% from top or bottom)
  • 1 or more means paragraph number

[ Counting ]

Paragraphs can be counted from top or from bottom. It is also possible to count only paragraphs that contain/do not contain certain text or count only paragraphs that have some minimum or maximum number of words. If more than one text is defined (comma separated) and "contain" is selected then the paragraph must contain ALL texts.

Paragraphs are not counted inside <blockquote> elements. Of course, there is an option to enable counting also inside <blockquote>.

Please Note Paragraph processing works on every post or page according to settings. Therefore, if you enable display also on blog pages (home, category, archive, search pages) and your theme does not display post excerpts but complete posts, Ad Inserter will by default insert code blocks into ALL posts on the blog page (according to settings). To enable insertion only into specific post(s) on blog pages define Filter. You can also leave Filter (click Misc button) empty (means all posts on the blog page) and define maximum number of insertions.

You can also define paragraph HTML tags. Normally only <p> tags are used. If your post contains also <div> or header tags, you can define comma separated list of tags used to count paragraphs (e.g. p, div, h2, h3).

WARNING: Each code block you insert in post adds one <div> block unelss you use No wrapping style. Before Paragraph will insert code before <tag>, After Paragraph will insert code after closing </tag>. After Paragraph will not work if you specify tag names that have no closing tags! Use # as tag if paragraphs have no tags and are separated with the \r\n\r\n characters.

Minimum number of paragraphs / Minimum/Maximum page/post words: do not display ad if the number of paragraphs or the number of words is below or above limit (used only for position Before or After selected paragraph).

[ Clearance ]

You can define parameters to avoid insertion at paragraph positions where above or below is some unwanted element (heading, image, title). This is useful to avoid inserting ads where they may not look good or where it is not allowed.

You can define in how many paragraphs above and below should specified text be avoided. And if the text is found you can choose to either skip insertion or try to shift insertion position up or down up to the specified number of paragraphs.

On every post/page there is a toolbar on the top. Ad Inserter menu item has few functions to visualize tags and positions for automatic insertion:

  • Show HTML tags: visualizes HTML tags
  • Show positions: shows available positions for automatic insertion. It uses paragraph tags for blocks configured for After or Before paragraph.

Additional Post/Static Page Options

You can define post/page minimum and maximum word length. Display after N days checks the date when the post was published and delays publishing.

Additional Options for code blocks:

PHP processing: Enabled or Disabled - Enable processing of PHP code. If there is a non-fatal error in the PHP code, it will not break the website.

  • Use {category}, {short_category}, {title}, {short_title}, {tag}, {smart_tag} or {search_query} tags to insert actual post data into code blocks
  • Use {author} for post author username or {author_name} for post author name to insert post author data into code blocks (works only inside posts)
  • To rotate different ad versions separate them with |rotate| - Ad Inserter will randomly select one of the ads

WARNING: If you are using caching ad rotation may not work as expected. It works only when the page is generated and Ad Inserter is called. In such cases please make sure you have disabled caching when you are using |rotate|.

Ad Inserter is perfect for displaying any kind of ads. It can also be used to display various versions of ad, for example AdSense ads using channels to test which format or color combination performs best.

BUTTONS

[ Misc ]

For each code block you can also limit how many times on the page the code (or ad) will be inserted. There are two settings for this:

  • Max N insertions: simple limit for the first N calls for the block
  • Filter: define which cals are wanted - single number or comma separated numbers

This is useful in many cases where you can't remove unwanted insertions of the code with other settings:

  • If you need to insert ad before the first, third and fith excerpt on the homepage you simply specify 1, 3, 5 for the filter.
  • If your posts are divided into subpages using the <!--nextpage--> tag - specify Subpages as filter source and list subpage numbers, for example 2,3,4,5,6,7,8,9,10,11 for display on all subpages except the first one.
  • In some WP themes hooks (that call Ad Inserter insertion functions) are called more than once. In such case you might get unwanted insertions. Simply set the filter to the number of the wanted call(s). Use debugging function Show positions on every post/page to show available positions for automatic insertion with counters.
  • If you use adinserter PHP function and you don't want that for each time the functon is called on the page the code is inserted, you can simply filter calls.
  • If you oly need the first N calls (insertions) then leave filter to 0 and use Max N insertions instead.

Please Note Paragraph processing works on every post or page according to settings. Therefore, if you enable display also on blog pages (home, category, archive, search pages) and your theme does not display post excerpts but complete posts, Ad Inserter will by default insert code blocks into ALL posts on the blog page (according to settings). To enable insertion only into specific post(s) on blog pages define Filter. You can also leave Filter to 0 (means all posts on the blog page) and define maximum number of insertions.

General tag: text used for {tag} and {smart_tag} if the post has no tags - useful for contextual ads - works only inside posts/static pages!

Display Block to:

  • All users (default)
  • Logged in users
  • Not logged in users
  • Administrators (usefull for testing/debugging)

WARNING: If you are using caching this may not work as expected. The check works only when the page is generated and Ad Inserter is called. Make sure you have disabled caching when you are using such settings.

[ Lists ]

Do not display ads in certain caregories e.g sport, news, science,... (black list) or display ads only in certain categories (white list): leave category list empty and set it to Black list to show ads in all categories.

WARNING: If category name contains commas or spaces, use category slug instead. Also make sure you have enabled display on Category pages.

Do not display ads in posts with certain tags (black list) or display ads only in posts with certain tags (white list). Leave tag list empty and set it to Black list to show ads for all tags. Also make sure you have enabled display on Tag / Archive pages.

Do not display ads in posts/pages with certain post IDs (black list) or display ads only in posts with certain IDs (white list). Leave Post ID list empty and set it to Black list to show ads for all IDs.

Do not display ads on pages with certain urls (black list) or display ads only on pages with certain urls (white list): leave url list empty and set it to Black list to show ads for all urls. Url used here is everything starting form the / after the domain name. For example: if web address is http://domain.com/lorem-ipsum, url to white/black-list is /lorem-ipsum You can also use partial urls with *. To filter all urls starting with /url-start use /url-start*, to filter all urls that contain url-pattern use *url-pattern*, to filter all urls ending with url-end use *url-end. WARNING: Separate urls with SPACES.

Do not display ads on pages with certain url query parameters (black list) or display ads only on pages with certain url parameters (white list): leave url parameter list empty and set it to Black list to show ads for all url. You can specifiy either parameters or parameters with values. For example for url http://example.com?data=2&customer-id=22&device=0 you can define url parameters 'data, customer-id=22' to display ad only for urls where there is data paramteter and customer-id parameter with value 22. Separate parameters with comma.

Do not display ads to users from certain referers (domains) e.g technorati.com, facebook.com,... (black list) or display ads only for certain referrers (white list): use # for no referer (direct visit), leave referrers list empty and set it to Black list to show ads for all referrers.

WARNING: If you are using caching, referer check may not work as expected. It works only when the page is generated and Ad Inserter is called. Make sure you have disabled caching when you are using such settings.

[ Devices ]

IMPORTANT: There are two types of device detection: server side and client-side.

Client-side detection

  • Desktop devices
  • Tablet devices
  • Phone devices

Client-side detection of mobile/desktop devices works always as it is done in visitor's browser. CSS media queries and viewport (browser's screen) width are used to show or hide Ad Inserter code blocks:

PLEASE NOTE: In most cases you should use ONLY client-side detection type. Works perfectly with responsive designs as they use CSS media queries.

BUT BE CAREFUL: Some ad networks (like AdSense) limit ads per page. The ads are still inserted (loaded and counted) for all devices, but for unwanted devices they are hidden by the browser using CSS media queries based on viewport widths.

Up to 3 viewport names and widths can be defined on the Ad Inserter Settings tab * (Ad Inserter Pro supports up to 6 viewports). Default values are:

  • Desktop: 980 pixels or more
  • Tablet: from 768 pixels to 979 pixels
  • Phone: less than 768 pixels

Server-side detection

  • Desktop devices
  • Mobile devices (tablets and phones)
  • Tablet devices
  • Phone devices
  • Desktop and tablet devices
  • Desktop and phone devices

Server-side detection of mobile/desktop devices works only when Ad Inserter plugin is called. It is called by WordPress when it needs to generate a page. However, when you are using caching, it saves created page for quicker serving. In such cases the user might get (saved) page for wrong device (used by some previous visitor who triggered page caching). To solve this issue use themes that generate separate pages for desktop and mobile devices or use Mobile Theme Switcher plugin. Server-side detection uses User-Agent string combined with specific HTTP headers to detect the environment.

PLEASE NOTE: Use server-side device type detection only when you need to generate (display and count) ONLY code blocks for specific device type. In all other cases switch it off.

[ Manual ]

There are 3 independent types of manual insertion of code block:

  • Widget - Widgets for all code blocks are enabled by default - simply drag Ad Inserter widget to any widget postition (e.g. Sidebar), select code block, save and you're done.
  • Shortcode - Insert shortcode [adinserter block="BLOCK_NUMBER"] or [adinserter name="BLOCK_NAME"] into post or page HTML code to display block with BLOCK_NAME name or BLOCK_NUMBER number at this position. PLEASE NOTE: Shortcodes IGNORE post/static page exception settings! You can also insert shortcode that ignores enabled page types with [adinserter block="BLOCK_NUMBER" ignore="page_type"]
  • PHP function call <?php if (function_exists ('adinserter')) echo adinserter (BLOCK_NUMBER); ?> - Insert code block BLOCK_NUMBER at any position in template file. You can also define Filter for PHP function - define which call(s) to the function will actually insert code. This is useful if you put a call to the adinserter function inside a loop in a template file (e.g. for homepage) and you need to insert ads only few times between posts. You can also use PHP function calls that ignore enabled page types <?php if (function_exists ('adinserter')) echo adinserter (BLOCK_NUMBER, 'page_type'); ?>

OTHER NOTES

By default code blocks will not be inserted on Error 404 page (Page Not Found) and in feeds. Check '404 Page' or 'Feed' checkbox to enable code block on error 404 page or in feed.

Ad Inserter general Settings - last tab

Wrapping divs for code blocks have 'code-block' and 'code-block-N' classes which can be used for custom styles. Class name 'code-block' can be changed in Ad Inserter settings. If you are using client-side device detection (CSS media queries) then the wrapping div for the code block will have also some of the following classes: ai-viewport-1, ai-viewport-2, ai-viewport-3.

You can choose between many syntax highlighting themes.

By default Ad Inserter exceptions on posts/static pages are enabled only for administrators. You can define minimum user role for page/post Ad Inserter exceptions editing in Ad Inserter Settings (tab *).

Default Ad Inserter plugin processing order is 99999. It is used to specify the order in which the plugin functions are executed. Lower numbers correspond with earlier execution. You can change this value if you have problems with the processing order of other plugins.

Support for Special Code Blocks:

  • Header scripts (scripts in the <header> section)
  • Footer scripts (scripts before the </body> tag)

WARNING: Text selection, Copy and Paste functions with the syntax highlighting editor do not work on mobile devices. If you need these functions you can temporarily swich to Simple editor using the checkbox above the code box.

WARNING: Some adblockers may block Ad Inserter settings page. If you don't see normal tabs for code blocks or there is no save button, make sure you have whitelisted Ad Inserter settings page (select "Disable on this page" or "Don't run on this page"). However, since you are dealing with ads, it may make sense to temporarily disable adblockers in order to check and debug inserted ad codes. Some security plugins like WP Security or Wordfence may also detect Ad Inserter page as problematic and prevent it from loading. Please be assured that this is false positive.

CACHING

Caching on the frontend side (what visitors see) does speed up page loading but may cause some unwanted behavior. When you are using caching, WordPress creates page, Ad Inseter is called to do the job and the created page is saved for quicker serving. The next time the page is visited **the visitor gets cached (saved) page **. Because of this some Ad Inserter functions can not work because Ad Inserter is not called when the page is cached:

  • Block rotation with |rotate|
  • User check
  • Server-side device detection
  • Referer check
  • Debugging functions

When you need the functions listed above you have to switch off caching.

Caching on the backend side (Ad Inserter Settings page) may also cause some unwanted behavior if it is not done properly. The problem can occur when the plugin is updated since the new plugin also provides new javascript and CSS files. In order to prevent browsers from loading old js/css files the plugin appends version info as query parameter to js and css files needed.

For example, in the source code of the settings page it should be like this:

<script type='text/javascript' src='http://example.com/wp-content/plugins/ad-inserter/js/ad-inserter.js?ver=2.0.1'></script>

<link rel='stylesheet' id='ai-admin-css'  href='http://example.com/wp-content/plugins/ad-inserter/css/ad-inserter.css?ver=2.0.1' type='text/css' media='all' />

However, on some websites this version parameter is removed (very likely due to aggresive caching):

<script type='text/javascript' src='http://example.com/wp-content/plugins/ad-inserter/js/ad-inserter.js'></script>

<link rel='stylesheet' id='ai-admin-css'  href='http://example.com/wp-content/plugins/ad-inserter/css/ad-inserter.css' type='text/css' media='all' />

Because of this the old cached files (css and js) are loaded which cause warnings and unpredicted behavior.

If you are using caching make sure the caching software DOES NOT REMOVE VERSION INFO parameter from the url. This is needed for browsers to reload the file when the plugin is updated.

WARNING: If you are using caching the inserted code may not appear immediately on the page. Make sure you have disabled caching when you are testing or debugging. Some caching plugins like WP Super Cache have an option to disable caching for known users.

PLEASE DO NOT FORGET: If you are using caching some settings may not work as expected. For example, ad rotation, referer check, user check and server-side detection work only when the page is generated and Ad Inserter is called. In such cases please make sure you have disabled caching.

DEBUGGING

Ad Inserter has many debugging functions that can help you to diagnose the problem when you don't see your ads at expected positions.

  • Code preview: click on the Preview button for each code block to see how the ad or code will look like. On the Preview window click on the Highlight button to highlight code. If you don't see display of the code here it is very likely that the code is not working properly.
  • Debugger Widget: Place Debugger widget in some widget area to see basic WordPress page and Ad Inserter data (User status, Page Type, Post ID, Url, Referer, etc). With this widget you can also check saved block settings and client-side viewport name.
  • Debugger Shortcode: Place shortcode [adinserter block="0"] or [adinserter name="Debugger"] into post or static page to see basic WordPress page and Ad Inserter data

Each post/page has a WordPress toolbar on the top. Ad Inserter menu (visible only to administrators and can be hidden) item has the following debugging functions:

  • Label Blocks: Each inserted block is labeled with a thin red border and red bar with block number, name and counters. Blocks that use client-side detection and are hidden are shown with blue bar and viewport name - resize the broswer to check display for other devices (or screen widths). If you see only red bar then this means that the block with your code is inserted but the code doesn't display anything.
  • Show Positions: Enable this function to show available positions for automatic display. Displayed positions are based on the theme layout and configured paragraph counting. You can choose between all paragraph tag lists (or counting parameters) used for blocks configured for Before or After paragraph. If you click on the Show Positions menu item you'll see default paragraph positions for p tags.
  • Show HTML tags: Enable this function to see HTML tags used in the post. Use this function to determine post structure in order to configure paragraph counting.
  • Disable insertion: Use this function to temporarily disable insertion of code blocks - everything else on the page will look like the code blocks were processed and inserted.
  • Log Processing: Use this function to log insertion process in order to determine why some code block was not inserted. The log is added as HTML comment at the end of the page - check page source

WARNING: Make sure caching is disabled while debugging! All debugging functions you enable will be visible only to you! Post/page debugging works by adding url parameters to the url (web address):

  • Label Blocks: ai-debug-blocks=1 (use ai-debug-blocks=0 to turn it off)
  • Show Positions: ai-debug-positions=BLOCK_NUMBER, 0 means default counting of paragraphs with p tags, numbers between 1 and 16 use paragraph counting as configured for the block (use ai-debug-positions= to turn it off)
  • Show HTML tags: ai-debug-tags=1 (use ai-debug-tags=0 to turn it off)
  • Disable insertion: ai-debug-no-insertion=1 (use ai-debug-no-insertion=0 to turn it off)
  • Log Processing: ai-debug-processing=1 (use ai-debug-processing=0 to turn it off)

When browsing other pages on the website debuggins settings are temporarily saved (for the session). To disable all debugging functions click on the 'Ad Inserter' top menu item in the toolbar (or use ai-debug=0)

If you enable Remote debugging you can also allow other people using url parameters to see post/page with debugging data. Remote debugging option is located on the Ad Inserter Settings tab - Debugging tab below. Remote debugging enables other, non-logged in users by using url parameters to see Debugger widget and code insertion debugging (blocks, positions, tags, processing). Enable this option to allow other people to see Debugger widget, labeled blocks and positions in order to help you to diagnose problems. For logged in users debugging via url is always enabled.

MULTISITE

Ad Inserter supports multisite WordPress installations. Normally, the plugin is available with settings and widgets to all the sites on the network. Ad Inserter Pro supports options to disable Setings page, widgets and post/page exceptions for sites (except the main one).

SUPPORT

If you experience problems with the Ad Inserter plugin you can ask for help on the support forum. However, before you ask please use debugging functions described above. In almost all cases it is possible to determine the nature of the problem just by checking the debugging data. Check also source code of the page. Some code for ads may not display anything, either because of errors in the ad code or because of ad network issues. In order to be able to diagnose the problem and suggest actions or fix a bug, please do the following:

  1. Enable Remote debugging (located on the Ad Inserter Settings tab - Debugging).

  2. Clearly describe the problem. Describe what does not work as expected.

  3. Describe the settings and code blocks used.

  4. Provide web addresses (links) of the pages where the code from the settings above is not inserted properly.

Unless you provide the items listed above nobody can check your website, can't reproduce the problem and consequently can't help. Once the problem is fixed you can disable Remote debugging. Thank you very much for understanding.

Please support the plugin if you like it:

Requires: 4.0 or higher
Compatible up to: 4.6.1
Last Updated: 1 week ago
Active Installs: 40,000+

Ratings

4.9 out of 5 stars

Support

38 of 39 support threads in the last two months have been marked resolved.

Got something to say? Need help?

Compatibility

+
=
Not enough data

1 person says it works.
0 people say it's broken.

100,1,1 100,2,2
100,1,1 100,3,3
100,2,2
67,3,2
100,4,4
100,1,1 100,1,1 100,1,1
100,1,1
100,2,2 100,1,1
100,1,1
100,1,1
100,2,2
100,7,7
100,2,2
100,4,4
100,1,1
100,1,1
100,1,1
100,1,1 100,2,2 100,1,1 100,2,2 100,1,1
100,1,1 100,1,1
100,1,1 100,1,1 100,1,1
100,2,2
100,1,1
100,1,1
100,1,1
100,1,1
100,1,1 100,1,1 100,2,2 100,1,1
100,1,1 100,1,1 100,1,1 100,2,2
100,1,1 100,1,1
100,1,1
100,1,1 100,1,1 100,2,2
100,1,1
100,1,1
100,2,2
100,2,2 100,1,1 100,2,2
100,1,1 100,1,1
100,1,1 100,3,3 100,1,1 100,1,1 100,1,1
50,2,1
100,2,2
100,2,2 100,1,1
100,3,3 50,2,1 100,2,2 100,1,1 100,1,1
100,1,1
100,1,1 100,1,1 100,1,1 100,1,1 100,1,1 100,2,2 100,2,2 100,1,1